summaryrefslogtreecommitdiffstats
path: root/Doc/howto/webservers.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/howto/webservers.rst')
0 files changed, 0 insertions, 0 deletions
tc21d3a0094b0692f2f888b04e258229234200e3c (diff)parent05aaab72d69a7fa9c23811c1d3ee7d91a9174e46 (diff)downloadQt-4ff3e1ca7ce8afab49e5c52a1ae0141abfc8a841.zip
Qt-4ff3e1ca7ce8afab49e5c52a1ae0141abfc8a841.tar.gz
Qt-4ff3e1ca7ce8afab49e5c52a1ae0141abfc8a841.tar.bz2
Merge branch '4.6' of scm.dev.nokia.troll.no:qt/qt into qscriptprogram
Conflicts: src/script/api/qscriptengine.cpp tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
Diffstat
-rwxr-xr-xbin/setcepaths.bat10
-rwxr-xr-xconfigure1
-rwxr-xr-xconfigure.exebin2362880 -> 2170880 bytes
-rw-r--r--demos/browser/browser.pro2
-rw-r--r--demos/demos.pro2
-rw-r--r--demos/embedded/anomaly/anomaly.pro5
-rw-r--r--demos/embedded/desktopservices/desktopservices.pro18
-rw-r--r--demos/embedded/digiflip/digiflip.cpp8
-rw-r--r--demos/embedded/digiflip/digiflip.pro4
-rw-r--r--demos/embedded/flickable/flickable.pro5
-rw-r--r--demos/embedded/flickable/main.cpp2
-rw-r--r--demos/embedded/flightinfo/flightinfo.pro5
-rw-r--r--demos/embedded/fluidlauncher/fluidlauncher.cpp4
-rw-r--r--demos/embedded/lightmaps/lightmaps.cpp4
-rw-r--r--demos/embedded/lightmaps/lightmaps.pro5
-rw-r--r--demos/embedded/raycasting/raycasting.cpp6
-rw-r--r--demos/embedded/raycasting/raycasting.pro5
-rw-r--r--demos/embedded/weatherinfo/weatherinfo.pro5
-rw-r--r--demos/qmediaplayer/mediaplayer.cpp11
-rw-r--r--demos/qmediaplayer/mediaplayer.h1
-rw-r--r--demos/qtdemo/xml/examples.xml2
-rw-r--r--demos/spreadsheet/spreadsheet.cpp1
-rw-r--r--demos/sub-attaq/boat.cpp2
-rw-r--r--dist/changes-4.6.06
-rw-r--r--doc/doc.pri6
-rw-r--r--doc/src/deployment/deployment.qdoc25
-rw-r--r--doc/src/diagrams/gestures/pangesture.svg273
-rw-r--r--doc/src/diagrams/gestures/pinchgesture.svg341
-rw-r--r--doc/src/diagrams/gestures/swipegesture-details.svg168
-rw-r--r--doc/src/diagrams/gestures/swipegesture.svg158
-rw-r--r--doc/src/examples/ahigl.qdoc572
-rw-r--r--doc/src/examples/audiodevices.qdoc2
-rw-r--r--doc/src/examples/audioinput.qdoc2
-rw-r--r--doc/src/examples/audiooutput.qdoc2
-rw-r--r--doc/src/examples/videographicsitem.qdoc2
-rw-r--r--doc/src/examples/videowidget.qdoc30
-rw-r--r--doc/src/frameworks-technologies/gestures.qdoc249
-rw-r--r--doc/src/frameworks-technologies/model-view-programming.qdoc51
-rw-r--r--doc/src/getting-started/examples.qdoc18
-rw-r--r--doc/src/getting-started/known-issues.qdoc4
-rw-r--r--doc/src/howtos/openvg.qdoc4
-rw-r--r--doc/src/images/pangesture.pngbin0 -> 7153 bytes
-rw-r--r--doc/src/images/pinchgesture.pngbin0 -> 10094 bytes
-rw-r--r--doc/src/images/qt-colors.pngbin3711 -> 11701 bytes
-rw-r--r--doc/src/images/shareddirmodel.pngbin33024 -> 45891 bytes
-rw-r--r--doc/src/images/simpleanchorlayout-example.pngbin0 -> 13463 bytes
-rw-r--r--doc/src/images/standard-views.pngbin78278 -> 44495 bytes
-rw-r--r--doc/src/images/swipegesture.pngbin0 -> 6864 bytes
-rw-r--r--doc/src/internationalization/i18n.qdoc3
-rw-r--r--doc/src/internationalization/linguist-manual.qdoc337
-rw-r--r--doc/src/platforms/emb-opengl.qdoc247
-rw-r--r--doc/src/platforms/s60-introduction.qdoc28
-rw-r--r--doc/src/platforms/supported-platforms.qdoc2
-rw-r--r--doc/src/porting/qt4-interview.qdoc8
-rw-r--r--doc/src/qt4-intro.qdoc38
-rw-r--r--doc/src/snippets/colors/colors.pro2
-rw-r--r--doc/src/snippets/colors/main.cpp52
-rw-r--r--doc/src/snippets/colors/window.cpp131
-rw-r--r--doc/src/snippets/colors/window.h53
-rw-r--r--doc/src/snippets/gestures/imageviewer/imagewidget.cpp364
-rw-r--r--doc/src/snippets/gestures/imageviewer/imagewidget.h137
-rw-r--r--doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp159
-rw-r--r--doc/src/snippets/gestures/imageviewer/tapandholdgesture.h74
-rw-r--r--doc/src/snippets/gestures/qgesture.cpp283
-rw-r--r--doc/src/snippets/gestures/qstandardgestures.cpp483
-rw-r--r--doc/src/snippets/gestures/qstandardgestures.h126
-rw-r--r--doc/src/snippets/shareddirmodel/main.cpp5
-rw-r--r--doc/src/snippets/simplemodel-use/main.cpp2
-rw-r--r--examples/effects/effects.pro6
-rw-r--r--examples/examples.pro3
-rw-r--r--examples/gestures/gestures.pro2
-rw-r--r--examples/gestures/imagegestures/imagegestures.pro16
-rw-r--r--examples/gestures/imagegestures/imagewidget.cpp (renamed from examples/gestures/imageviewer/imagewidget.cpp)95
-rw-r--r--examples/gestures/imagegestures/imagewidget.h (renamed from examples/gestures/imageviewer/imagewidget.h)29
-rw-r--r--examples/gestures/imagegestures/main.cpp59
-rw-r--r--examples/gestures/imagegestures/mainwidget.cpp56
-rw-r--r--examples/gestures/imagegestures/mainwidget.h65
-rw-r--r--examples/gestures/imageviewer/imageviewer.pro11
-rw-r--r--examples/gestures/imageviewer/tapandholdgesture.cpp155
-rw-r--r--examples/gestures/imageviewer/tapandholdgesture.h74
-rw-r--r--examples/graphicsview/anchorlayout/anchorlayout.pro10
-rw-r--r--examples/graphicsview/graphicsview.pro1
-rw-r--r--examples/graphicsview/simpleanchorlayout/main.cpp134
-rw-r--r--examples/graphicsview/simpleanchorlayout/simpleanchorlayout.pro9
-rw-r--r--examples/multimedia/audio/audio.pro10
-rw-r--r--examples/multimedia/audiodevices/audiodevices.cpp (renamed from examples/multimedia/audio/audiodevices/audiodevices.cpp)0
-rw-r--r--examples/multimedia/audiodevices/audiodevices.h (renamed from examples/multimedia/audio/audiodevices/audiodevices.h)0
-rw-r--r--examples/multimedia/audiodevices/audiodevices.pro (renamed from examples/multimedia/audio/audiodevices/audiodevices.pro)4
-rw-r--r--examples/multimedia/audiodevices/audiodevicesbase.ui (renamed from examples/multimedia/audio/audiodevices/audiodevicesbase.ui)0
-rw-r--r--examples/multimedia/audiodevices/main.cpp (renamed from examples/multimedia/audio/audiodevices/main.cpp)0
-rw-r--r--examples/multimedia/audioinput/audioinput.cpp (renamed from examples/multimedia/audio/audioinput/audioinput.cpp)2
-rw-r--r--examples/multimedia/audioinput/audioinput.h (renamed from examples/multimedia/audio/audioinput/audioinput.h)0
-rw-r--r--examples/multimedia/audioinput/audioinput.pro (renamed from examples/multimedia/audio/audioinput/audioinput.pro)4
-rw-r--r--examples/multimedia/audioinput/main.cpp (renamed from examples/multimedia/audio/audioinput/main.cpp)0
-rw-r--r--examples/multimedia/audiooutput/audiooutput.cpp (renamed from examples/multimedia/audio/audiooutput/audiooutput.cpp)2
-rw-r--r--examples/multimedia/audiooutput/audiooutput.h (renamed from examples/multimedia/audio/audiooutput/audiooutput.h)0
-rw-r--r--examples/multimedia/audiooutput/audiooutput.pro (renamed from examples/multimedia/audio/audiooutput/audiooutput.pro)4
-rw-r--r--examples/multimedia/audiooutput/main.cpp (renamed from examples/multimedia/audio/audiooutput/main.cpp)0
-rw-r--r--examples/multimedia/multimedia.pro14
-rw-r--r--examples/multimedia/videographicsitem/main.cpp (renamed from examples/video/videographicsitem/main.cpp)0
-rw-r--r--examples/multimedia/videographicsitem/videographicsitem.pro (renamed from examples/video/videographicsitem/videographicsitem.pro)4
-rw-r--r--examples/multimedia/videographicsitem/videoitem.cpp (renamed from examples/video/videographicsitem/videoitem.cpp)0
-rw-r--r--examples/multimedia/videographicsitem/videoitem.h (renamed from examples/video/videographicsitem/videoitem.h)0
-rw-r--r--examples/multimedia/videographicsitem/videoplayer.cpp (renamed from examples/video/videographicsitem/videoplayer.cpp)0
-rw-r--r--examples/multimedia/videographicsitem/videoplayer.h (renamed from examples/video/videographicsitem/videoplayer.h)0
-rw-r--r--examples/multimedia/videowidget/main.cpp (renamed from examples/video/videowidget/main.cpp)0
-rw-r--r--examples/multimedia/videowidget/videoplayer.cpp (renamed from examples/video/videowidget/videoplayer.cpp)0
-rw-r--r--examples/multimedia/videowidget/videoplayer.h (renamed from examples/video/videowidget/videoplayer.h)0
-rw-r--r--examples/multimedia/videowidget/videowidget.cpp (renamed from examples/video/videowidget/videowidget.cpp)0
-rw-r--r--examples/multimedia/videowidget/videowidget.h (renamed from examples/video/videowidget/videowidget.h)0
-rw-r--r--examples/multimedia/videowidget/videowidget.pro (renamed from examples/video/videowidget/videowidget.pro)6
-rw-r--r--examples/multimedia/videowidget/videowidgetsurface.cpp (renamed from examples/video/videowidget/videowidgetsurface.cpp)0
-rw-r--r--examples/multimedia/videowidget/videowidgetsurface.h (renamed from examples/video/videowidget/videowidgetsurface.h)0
-rw-r--r--examples/opengl/pbuffers/cube.h2
-rw-r--r--examples/opengl/pbuffers/glwidget.h2
-rw-r--r--examples/qws/ahigl/ahigl.pro16
-rw-r--r--examples/qws/ahigl/qscreenahigl_qws.cpp963
-rw-r--r--examples/qws/ahigl/qscreenahigl_qws.h91
-rw-r--r--examples/qws/ahigl/qscreenahiglplugin.cpp97
-rw-r--r--examples/qws/ahigl/qwindowsurface_ahigl.cpp349
-rw-r--r--examples/sql/drilldown/main.cpp3
-rw-r--r--examples/video/video.pro6
-rw-r--r--mkspecs/features/qt.prf5
-rw-r--r--mkspecs/features/qt_functions.prf12
-rw-r--r--mkspecs/features/symbian/stl.prf2
-rw-r--r--mkspecs/features/uitools.prf4
-rw-r--r--mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm9
-rw-r--r--mkspecs/unsupported/linux-scratchbox2-g++/qmake.conf34
-rw-r--r--mkspecs/unsupported/linux-scratchbox2-g++/qplatformdefs.h (renamed from doc/src/snippets/code/doc_src_examples_ahigl.qdoc)11
-rw-r--r--projects.pro10
-rw-r--r--qmake/generators/metamakefile.cpp285
-rw-r--r--qmake/generators/metamakefile.h2
-rw-r--r--qmake/generators/symbian/symmake.cpp100
-rw-r--r--qmake/main.cpp6
-rw-r--r--qmake/project.cpp47
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp7
-rw-r--r--src/3rdparty/libpng/ANNOUNCE54
-rw-r--r--src/3rdparty/libpng/CHANGES338
-rw-r--r--src/3rdparty/libpng/INSTALL16
-rw-r--r--src/3rdparty/libpng/KNOWNBUG2
-rw-r--r--src/3rdparty/libpng/LICENSE8
-rw-r--r--src/3rdparty/libpng/README25
-rw-r--r--src/3rdparty/libpng/TODO1
-rw-r--r--src/3rdparty/libpng/Y2KINFO4
-rwxr-xr-xsrc/3rdparty/libpng/configure4
-rw-r--r--src/3rdparty/libpng/example.c297
-rw-r--r--src/3rdparty/libpng/libpng-1.2.40.txt (renamed from src/3rdparty/libpng/libpng-1.2.29.txt)314
-rw-r--r--src/3rdparty/libpng/libpng.3803
-rw-r--r--src/3rdparty/libpng/libpngpf.3522
-rw-r--r--src/3rdparty/libpng/png.52
-rw-r--r--src/3rdparty/libpng/png.c572
-rw-r--r--src/3rdparty/libpng/png.h419
-rw-r--r--src/3rdparty/libpng/pngconf.h146
-rw-r--r--src/3rdparty/libpng/pngerror.c107
-rw-r--r--src/3rdparty/libpng/pngget.c214
-rw-r--r--src/3rdparty/libpng/pngmem.c126
-rw-r--r--src/3rdparty/libpng/pngpread.c339
-rw-r--r--src/3rdparty/libpng/pngread.c372
-rw-r--r--src/3rdparty/libpng/pngrio.c68
-rw-r--r--src/3rdparty/libpng/pngrtran.c629
-rw-r--r--src/3rdparty/libpng/pngrutil.c837
-rw-r--r--src/3rdparty/libpng/pngset.c803
-rw-r--r--src/3rdparty/libpng/pngtest.c609
-rw-r--r--src/3rdparty/libpng/pngtrans.c111
-rw-r--r--src/3rdparty/libpng/pngwio.c129
-rw-r--r--src/3rdparty/libpng/pngwrite.c391
-rw-r--r--src/3rdparty/libpng/pngwtran.c39
-rw-r--r--src/3rdparty/libpng/pngwutil.c937
-rw-r--r--src/3rdparty/libpng/scripts/CMakeLists.txt137
-rw-r--r--src/3rdparty/libpng/scripts/descrip.mms6
-rwxr-xr-xsrc/3rdparty/libpng/scripts/libpng-config-head.in7
-rwxr-xr-xsrc/3rdparty/libpng/scripts/libpng-config.in7
-rw-r--r--src/3rdparty/libpng/scripts/libpng.icc7
-rw-r--r--src/3rdparty/libpng/scripts/libpng.pc-configure.in7
-rw-r--r--src/3rdparty/libpng/scripts/libpng.pc.in2
-rw-r--r--src/3rdparty/libpng/scripts/makefile.32sunu7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.64sunu7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.acorn3
-rw-r--r--src/3rdparty/libpng/scripts/makefile.aix29
-rw-r--r--src/3rdparty/libpng/scripts/makefile.amiga5
-rw-r--r--src/3rdparty/libpng/scripts/makefile.atari8
-rw-r--r--src/3rdparty/libpng/scripts/makefile.bc3239
-rw-r--r--src/3rdparty/libpng/scripts/makefile.beos12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.bor42
-rw-r--r--src/3rdparty/libpng/scripts/makefile.cygwin17
-rw-r--r--src/3rdparty/libpng/scripts/makefile.darwin17
-rw-r--r--src/3rdparty/libpng/scripts/makefile.dec9
-rw-r--r--src/3rdparty/libpng/scripts/makefile.dj29
-rw-r--r--src/3rdparty/libpng/scripts/makefile.elf12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.freebsd7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.gcc32
-rw-r--r--src/3rdparty/libpng/scripts/makefile.gcmmx19
-rw-r--r--src/3rdparty/libpng/scripts/makefile.hp6412
-rw-r--r--src/3rdparty/libpng/scripts/makefile.hpgcc11
-rw-r--r--src/3rdparty/libpng/scripts/makefile.hpux10
-rw-r--r--src/3rdparty/libpng/scripts/makefile.ibmc24
-rw-r--r--src/3rdparty/libpng/scripts/makefile.intel14
-rw-r--r--src/3rdparty/libpng/scripts/makefile.knr12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.linux14
-rw-r--r--src/3rdparty/libpng/scripts/makefile.mingw20
-rw-r--r--src/3rdparty/libpng/scripts/makefile.mips8
-rw-r--r--src/3rdparty/libpng/scripts/makefile.msc13
-rw-r--r--src/3rdparty/libpng/scripts/makefile.ne12bsd12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.netbsd12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.nommx45
-rw-r--r--src/3rdparty/libpng/scripts/makefile.openbsd13
-rw-r--r--src/3rdparty/libpng/scripts/makefile.os27
-rw-r--r--src/3rdparty/libpng/scripts/makefile.sco7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.sggcc15
-rw-r--r--src/3rdparty/libpng/scripts/makefile.sgi9
-rw-r--r--src/3rdparty/libpng/scripts/makefile.so911
-rw-r--r--src/3rdparty/libpng/scripts/makefile.solaris12
-rw-r--r--src/3rdparty/libpng/scripts/makefile.solaris-x8611
-rw-r--r--src/3rdparty/libpng/scripts/makefile.std7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.sunos7
-rw-r--r--src/3rdparty/libpng/scripts/makefile.vcawin3217
-rw-r--r--src/3rdparty/libpng/scripts/makefile.vcwin3213
-rw-r--r--src/3rdparty/libpng/scripts/makefile.watcom5
-rw-r--r--src/3rdparty/libpng/scripts/makevms.com4
-rw-r--r--src/3rdparty/libpng/scripts/pngos2.def2
-rw-r--r--src/3rdparty/libpng/scripts/pngw32.def3
-rw-r--r--src/3rdparty/libpng/scripts/smakefile.ppc5
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.cpp30
-rw-r--r--src/3rdparty/phonon/mmf/abstractplayer.h6
-rw-r--r--src/3rdparty/phonon/mmf/audiooutput.cpp8
-rw-r--r--src/3rdparty/phonon/mmf/audioplayer.cpp4
-rw-r--r--src/3rdparty/phonon/mmf/mediaobject.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/mmf_medianode.cpp2
-rw-r--r--src/3rdparty/phonon/mmf/mmf_videoplayer.cpp273
-rw-r--r--src/3rdparty/phonon/mmf/mmf_videoplayer.h19
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.cpp144
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.h30
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.cpp114
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.h10
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.cpp20
-rw-r--r--src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.h40
-rw-r--r--src/3rdparty/phonon/mmf/utils.cpp8
-rw-r--r--src/3rdparty/phonon/mmf/utils.h18
-rw-r--r--src/3rdparty/phonon/mmf/videooutput.cpp58
-rw-r--r--src/3rdparty/phonon/mmf/videooutput.h4
-rw-r--r--src/3rdparty/sqlite/sqlite3.c77455
-rw-r--r--src/3rdparty/sqlite/sqlite3.h6321
-rw-r--r--src/3rdparty/webkit/ChangeLog111
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/APICast.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/API/JSContextRefPrivate.h (renamed from src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp)60
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/ChangeLog1167
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp47
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp112
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/bytecompiler/Label.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h7
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp775
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp75
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JIT.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp60
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp32
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp518
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp182
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h20
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp96
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jsc.cpp1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/jsc.pro31
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp51
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp58
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp9
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/GlobalEvalFunction.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSAPIValueWrapper.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp121
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h24
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp21
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h10
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp40
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp48
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h85
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp41
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h43
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSTypeInfo.h12
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h26
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/MarkStack.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp1
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h27
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h35
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp46
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h52
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp63
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp87
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wscript2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h14
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp6
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h5
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/ListRefPtr.h3
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h2
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h96
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp17
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h4
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp8
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h9
-rw-r--r--src/3rdparty/webkit/VERSION4
-rw-r--r--src/3rdparty/webkit/WebCore/ChangeLog9148
-rw-r--r--src/3rdparty/webkit/WebCore/DerivedSources.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ExceptionHelpers.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSCell.h4
-rw-r--r--src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StructureChain.h5
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.3DRendering.exp1
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.SVG.Filters.exp1
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.Video.exp14
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.gypi47
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.order1
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.pro134
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.qrc3
-rw-r--r--src/3rdparty/webkit/WebCore/accessibility/AccessibilityMediaControls.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/ScriptControllerBase.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.cpp77
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.h70
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayBufferConstructor.h3
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayCustom.cpp33
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp33
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.h8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h10
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp69
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h7
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h7
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h9
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDesktopNotificationsCustom.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSEventSourceCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.cpp64
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.h43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessageEventCustom.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h4
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSWebSocketCustom.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h1
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h1
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.cpp839
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.h199
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm14
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm16
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm99
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm43
-rw-r--r--src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm396
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h3
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/npapi.h17
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h2
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_array.h3
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_method.h3
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_object.h3
-rw-r--r--src/3rdparty/webkit/WebCore/bridge/runtime_root.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSGrammar.y4
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParser.cpp34
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSParserValues.h2
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h78
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in3
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelector.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSSelector.h3
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp23
-rw-r--r--src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in7
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSPropertyNames.in2
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/css/SVGCSSValueKeywords.in9
-rw-r--r--src/3rdparty/webkit/WebCore/css/html.css5
-rw-r--r--src/3rdparty/webkit/WebCore/css/makevalues.pl2
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css6
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControlsQt.css (renamed from src/3rdparty/webkit/WebCore/css/qt/mediaControls-extras.css)55
-rw-r--r--src/3rdparty/webkit/WebCore/css/mediaControlsQuickTime.css (renamed from src/3rdparty/webkit/WebCore/css/mediaControlsQT.css)0
-rw-r--r--src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.h67
-rw-r--r--src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.idl39
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ContainerNode.h2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.cpp123
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.h4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Document.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Element.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Event.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/Event.h7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/EventNames.h2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionBase.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionBase.h2
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp60
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ExceptionCode.h1
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessageEvent.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessageEvent.h13
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessageEvent.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePort.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePort.h6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h11
-rw-r--r--src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/dom/QualifiedName.h10
-rw-r--r--src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/dom/StyledElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp89
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h1
-rw-r--r--src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp140
-rw-r--r--src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h6
-rw-r--r--src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/editing/markup.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp1050
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp374
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h362
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c777
-rw-r--r--src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h455
-rw-r--r--src/3rdparty/webkit/WebCore/generated/Grammar.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/HTMLNames.h2
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAttr.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSAttr.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSBarInfo.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.cpp188
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.h78
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCDATASection.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRule.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValue.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasArray.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasArray.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasArrayBuffer.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasByteArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasFloatArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasIntArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.cpp69
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasShortArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedByteArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedIntArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedShortArray.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCharacterData.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRect.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClientRectList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSClipboard.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSComment.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSComment.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSConsole.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCoordinates.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCounter.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSCounter.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMParser.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDatabase.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocument.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocument.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSDocumentType.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntity.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntity.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEntityReference.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSEventSource.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFile.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFile.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFileList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSFileList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeolocation.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSGeoposition.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp39
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h12
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSHistory.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSImageData.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSImageData.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp152
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h27
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSLocation.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMedia.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMedia.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaError.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMediaList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMessagePort.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeType.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNavigator.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNode.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNode.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNodeList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNotation.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSNotation.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPlugin.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPluginArray.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSPositionError.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRGBColor.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRange.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRange.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRangeException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRect.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSRect.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLError.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGColor.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.cpp336
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.h99
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLength.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRect.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSScreen.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSharedWorker.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSSharedWorkerContext.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorage.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorage.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h9
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSText.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSText.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSUIEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSValidityState.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebSocket.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWebSocket.h13
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorker.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h10
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathException.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXPathResult.h8
-rw-r--r--src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h11
-rw-r--r--src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h7
-rw-r--r--src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h3
-rw-r--r--src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp721
-rw-r--r--src/3rdparty/webkit/WebCore/generated/WebKitVersion.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp27
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h27
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp100
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h24
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp189
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.h20
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp31
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp146
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp89
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h14
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/ValidityState.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/html/ValidityState.h7
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.h62
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.idl36
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.h8
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.h2
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasObject.h6
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext2D.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.h9
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.idl10
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.h3
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp126
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h28
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl26
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp347
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorController.h52
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.h6
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h5
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp105
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h15
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/InspectorResource.h4
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h8
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp50
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ConsoleView.js69
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/CookieItemsView.js15
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/DOMAgent.js15
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Database.js47
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js4
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js242
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScript.js107
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScriptAccess.js42
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/Object.js6
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js125
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js228
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ResourceView.js1
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js114
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ScopeChainSidebarPane.js12
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js24
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js528
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js9
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/StoragePanel.js62
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/TestController.js65
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/TimelineAgent.js4
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js7
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc2
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css68
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html5
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js92
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/inspectorSyntaxHighlight.css71
-rw-r--r--src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js145
-rw-r--r--src/3rdparty/webkit/WebCore/loader/Cache.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedResourceClient.h4
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedResourceHandle.h7
-rw-r--r--src/3rdparty/webkit/WebCore/loader/EmptyClients.h1
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp1735
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.h813
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h3
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h5
-rw-r--r--src/3rdparty/webkit/WebCore/loader/HistoryController.cpp627
-rw-r--r--src/3rdparty/webkit/WebCore/loader/HistoryController.h95
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp112
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ImageLoader.h9
-rw-r--r--src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp28
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PolicyCallback.cpp133
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PolicyCallback.h80
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PolicyChecker.cpp197
-rw-r--r--src/3rdparty/webkit/WebCore/loader/PolicyChecker.h97
-rw-r--r--src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp374
-rw-r--r--src/3rdparty/webkit/WebCore/loader/RedirectScheduler.h81
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h79
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp26
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/page/ChromeClient.h4
-rw-r--r--src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.h5
-rw-r--r--src/3rdparty/webkit/WebCore/page/DOMWindow.idl37
-rw-r--r--src/3rdparty/webkit/WebCore/page/DragController.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/page/EventHandler.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/page/EventSource.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/page/Frame.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/page/Frame.h3
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameView.cpp79
-rw-r--r--src/3rdparty/webkit/WebCore/page/FrameView.h2
-rw-r--r--src/3rdparty/webkit/WebCore/page/History.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/page/Page.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/page/Page.h9
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroup.cpp110
-rw-r--r--src/3rdparty/webkit/WebCore/page/PageGroup.h19
-rw-r--r--src/3rdparty/webkit/WebCore/page/PluginHalter.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/page/PluginHalter.h5
-rw-r--r--src/3rdparty/webkit/WebCore/page/PluginHalterClient.h1
-rw-r--r--src/3rdparty/webkit/WebCore/page/PrintContext.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp66
-rw-r--r--src/3rdparty/webkit/WebCore/page/SecurityOrigin.h21
-rw-r--r--src/3rdparty/webkit/WebCore/page/Settings.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/page/Settings.h31
-rw-r--r--src/3rdparty/webkit/WebCore/page/UserContentURLPattern.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/page/UserContentURLPattern.h2
-rw-r--r--src/3rdparty/webkit/WebCore/page/UserScript.h14
-rw-r--r--src/3rdparty/webkit/WebCore/page/UserStyleSheet.h13
-rw-r--r--src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp67
-rw-r--r--src/3rdparty/webkit/WebCore/page/XSSAuditor.h15
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp21
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h16
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/Cookie.h19
-rw-r--r--src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURL.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollView.cpp29
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ScrollView.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/SuddenTermination.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/ThemeTypes.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h21
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h23
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h35
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp139
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h (renamed from src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h)11
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp65
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp379
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h49
-rw-r--r--src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h16
-rw-r--r--src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp144
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm21
-rw-r--r--src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm26
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp125
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp84
-rw-r--r--src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp9
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h4
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/AtomicString.h3
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/PlatformString.h13
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/String.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp219
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/StringImpl.h47
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp30
-rw-r--r--src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackage.h13
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h1
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.cpp45
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginView.h29
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp498
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp77
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h50
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp79
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/PluginPackageSymbian.cpp177
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp462
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/symbian/npinterface.h37
-rw-r--r--src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/CounterNode.cpp12
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp41
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp25
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayer.h6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp32
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderListBox.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp15
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.cpp287
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.h46
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderObject.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h1
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm174
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp188
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/RenderWidget.h3
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h2
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h1
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.h4
-rw-r--r--src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/Database.cpp76
-rw-r--r--src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h14
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLError.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageArea.h4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp81
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h6
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp11
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.h11
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEvent.idl5
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageEventDispatcher.cpp77
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageMap.cpp53
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageMap.h26
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespace.h2
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp16
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h5
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h32
-rw-r--r--src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h40
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h126
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimatedTemplate.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCircleElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGCursorElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGDefsElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGDefsElement.h9
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElement.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElement.h35
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.h25
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.cpp88
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.h52
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.idl43
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp68
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp59
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp20
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.h16
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFontElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGFontElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGGradientElement.h12
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGImageElement.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLineElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp19
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMPathElement.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h54
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.h14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPathElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPatternElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp3
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp48
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGRectElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h15
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h12
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h16
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.h17
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTRefElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTRefElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp1
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGURIReference.h8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp10
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGUseElement.h13
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewElement.h14
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp17
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SVGViewSpec.h11
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.cpp163
-rw-r--r--src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.h122
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp38
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h27
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp7
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp82
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp8
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h6
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h5
-rw-r--r--src/3rdparty/webkit/WebCore/svg/svgtags.in2
-rw-r--r--src/3rdparty/webkit/WebCore/websockets/WebSocket.cpp18
-rw-r--r--src/3rdparty/webkit/WebCore/websockets/WebSocket.h4
-rw-r--r--src/3rdparty/webkit/WebCore/websockets/WebSocket.idl16
-rw-r--r--src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp5
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h6
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl2
-rw-r--r--src/3rdparty/webkit/WebCore/workers/DefaultSharedWorkerRepository.cpp22
-rw-r--r--src/3rdparty/webkit/WebCore/workers/SharedWorkerRepository.h3
-rw-r--r--src/3rdparty/webkit/WebCore/workers/SharedWorkerThread.cpp2
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.h6
-rw-r--r--src/3rdparty/webkit/WebCore/workers/Worker.idl4
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h2
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp24
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h4
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h2
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp4
-rw-r--r--src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp4
-rw-r--r--src/3rdparty/webkit/WebKit.pri5
-rw-r--r--src/3rdparty/webkit/WebKit/ChangeLog133
-rw-r--r--src/3rdparty/webkit/WebKit/mac/Configurations/Version.xcconfig2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp93
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp39
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp42
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp83
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h12
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp70
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h6
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp48
-rw-r--r--src/3rdparty/webkit/WebKit/qt/ChangeLog676
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.cpp460
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.h52
-rw-r--r--src/3rdparty/webkit/WebKit/qt/Plugins/Plugins.pro14
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp2
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp26
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp93
-rw-r--r--src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp3
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp76
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/image.pngbin0 -> 14743 bytes
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp75
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.pro1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp24
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp232
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro1
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp45
-rw-r--r--src/3rdparty/webkit/WebKit/qt/tests/resources/test.swfbin0 -> 10085 bytes
-rw-r--r--src/corelib/animation/qabstractanimation.cpp208
-rw-r--r--src/corelib/animation/qabstractanimation_p.h42
-rw-r--r--src/corelib/animation/qanimationgroup_p.h4
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp8
-rw-r--r--src/corelib/animation/qpauseanimation.cpp4
-rw-r--r--src/corelib/global/qglobal.cpp47
-rw-r--r--src/corelib/global/qglobal.h2
-rw-r--r--src/corelib/global/qnamespace.h36
-rw-r--r--src/corelib/global/qnamespace.qdoc47
-rw-r--r--src/corelib/io/qdir.cpp5
-rw-r--r--src/corelib/io/qprocess.cpp8
-rw-r--r--src/corelib/io/qprocess.h7
-rw-r--r--src/corelib/io/qprocess_p.h3
-rw-r--r--src/corelib/io/qprocess_symbian.cpp6
-rw-r--r--src/corelib/io/qsettings.cpp24
-rw-r--r--src/corelib/io/qurl.cpp9
-rw-r--r--src/corelib/kernel/qcoreevent.cpp3
-rw-r--r--src/corelib/kernel/qcoreevent.h5
-rw-r--r--src/corelib/kernel/qeventdispatcher_symbian.cpp10
-rw-r--r--src/corelib/kernel/qobject.cpp5
-rw-r--r--src/corelib/plugin/quuid.cpp13
-rw-r--r--src/corelib/tools/qdatetime.cpp62
-rw-r--r--src/gui/accessible/qaccessible.h7
-rw-r--r--src/gui/accessible/qaccessible2.cpp12
-rw-r--r--src/gui/accessible/qaccessible2.h16
-rw-r--r--src/gui/animation/qguivariantanimation.cpp8
-rw-r--r--src/gui/dialogs/qcolordialog_mac.mm4
-rw-r--r--src/gui/dialogs/qerrormessage.cpp13
-rw-r--r--src/gui/dialogs/qfiledialog_mac.mm7
-rw-r--r--src/gui/dialogs/qfiledialog_win.cpp4
-rw-r--r--src/gui/dialogs/qprintdialog_mac.mm4
-rw-r--r--src/gui/dialogs/qprogressdialog.cpp2
-rw-r--r--src/gui/dialogs/qwizard.cpp2
-rw-r--r--src/gui/effects/qgraphicseffect.cpp71
-rw-r--r--src/gui/effects/qgraphicseffect.h1
-rw-r--r--src/gui/effects/qgraphicseffect_p.h12
-rw-r--r--src/gui/egl/qegl.cpp3
-rw-r--r--src/gui/egl/qegl_p.h3
-rw-r--r--src/gui/egl/qegl_qws.cpp3
-rw-r--r--src/gui/embedded/directfb.pri2
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.cpp182
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.h3
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.cpp817
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.h36
-rw-r--r--src/gui/graphicsview/qgraphicsgridlayout.cpp30
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp67
-rw-r--r--src/gui/graphicsview/qgraphicsitem.h5
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h81
-rw-r--r--src/gui/graphicsview/qgraphicslinearlayout.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsproxywidget.cpp17
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp282
-rw-r--r--src/gui/graphicsview/qgraphicsscene.h1
-rw-r--r--src/gui/graphicsview/qgraphicsscene_p.h9
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp68
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h2
-rw-r--r--src/gui/graphicsview/qgraphicstransform.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp13
-rw-r--r--src/gui/image/qiconloader.cpp6
-rw-r--r--src/gui/image/qimage.cpp26
-rw-r--r--src/gui/image/qimagepixmapcleanuphooks.cpp36
-rw-r--r--src/gui/image/qimagepixmapcleanuphooks_p.h17
-rw-r--r--src/gui/image/qpixmap.cpp59
-rw-r--r--src/gui/image/qpixmap_mac.cpp5
-rw-r--r--src/gui/image/qpixmap_mac_p.h2
-rw-r--r--src/gui/image/qpixmap_raster.cpp28
-rw-r--r--src/gui/image/qpixmap_raster_p.h2
-rw-r--r--src/gui/image/qpixmap_s60.cpp21
-rw-r--r--src/gui/image/qpixmap_x11.cpp5
-rw-r--r--src/gui/image/qpixmap_x11_p.h3
-rw-r--r--src/gui/image/qpixmapcache.cpp1
-rw-r--r--src/gui/image/qpixmapdata.cpp13
-rw-r--r--src/gui/image/qpixmapdata_p.h4
-rw-r--r--src/gui/image/qpixmapfilter.cpp51
-rw-r--r--src/gui/inputmethod/qinputcontext.cpp14
-rw-r--r--src/gui/inputmethod/qinputcontext.h13
-rw-r--r--src/gui/inputmethod/qmacinputcontext_mac.cpp6
-rw-r--r--src/gui/itemviews/qabstractitemview.cpp7
-rw-r--r--src/gui/itemviews/qheaderview.cpp4
-rw-r--r--src/gui/itemviews/qlistview.cpp50
-rw-r--r--src/gui/itemviews/qlistview_p.h1
-rw-r--r--src/gui/itemviews/qtableview.cpp207
-rw-r--r--src/gui/itemviews/qtableview_p.h4
-rw-r--r--src/gui/itemviews/qtablewidget.cpp2
-rw-r--r--src/gui/itemviews/qtreeview.cpp12
-rw-r--r--src/gui/itemviews/qtreewidget.cpp2
-rw-r--r--src/gui/kernel/kernel.pri28
-rw-r--r--src/gui/kernel/qaction.cpp2
-rw-r--r--src/gui/kernel/qapplication.cpp148
-rw-r--r--src/gui/kernel/qapplication.h17
-rw-r--r--src/gui/kernel/qapplication_mac.mm11
-rw-r--r--src/gui/kernel/qapplication_p.h27
-rw-r--r--src/gui/kernel/qapplication_s60.cpp279
-rw-r--r--src/gui/kernel/qapplication_win.cpp48
-rw-r--r--src/gui/kernel/qcocoaview_mac.mm34
-rw-r--r--src/gui/kernel/qcursor_s60.cpp24
-rw-r--r--src/gui/kernel/qdesktopwidget.cpp (renamed from tests/manual/gestures/pinch/main.cpp)41
-rw-r--r--src/gui/kernel/qdesktopwidget.h6
-rw-r--r--src/gui/kernel/qdnd_s60.cpp4
-rw-r--r--src/gui/kernel/qevent.cpp232
-rw-r--r--src/gui/kernel/qevent.h45
-rw-r--r--src/gui/kernel/qevent_p.h14
-rw-r--r--src/gui/kernel/qeventdispatcher_mac.mm23
-rw-r--r--src/gui/kernel/qgesture.cpp679
-rw-r--r--src/gui/kernel/qgesture.h152
-rw-r--r--src/gui/kernel/qgesture_p.h75
-rw-r--r--src/gui/kernel/qgesturemanager.cpp543
-rw-r--r--src/gui/kernel/qgesturemanager_p.h135
-rw-r--r--src/gui/kernel/qgesturerecognizer.cpp200
-rw-r--r--src/gui/kernel/qgesturerecognizer.h (renamed from src/opengl/qglpaintdevice_qws.cpp)83
-rw-r--r--src/gui/kernel/qkeymapper_win.cpp4
-rw-r--r--src/gui/kernel/qmacgesturerecognizer_mac.mm267
-rw-r--r--src/gui/kernel/qmacgesturerecognizer_mac_p.h (renamed from examples/qws/ahigl/qwindowsurface_ahigl_p.h)69
-rw-r--r--src/gui/kernel/qsoftkeymanager.cpp7
-rw-r--r--src/gui/kernel/qstandardgestures.cpp785
-rw-r--r--src/gui/kernel/qstandardgestures.h174
-rw-r--r--src/gui/kernel/qstandardgestures_p.h77
-rw-r--r--src/gui/kernel/qt_s60_p.h10
-rw-r--r--src/gui/kernel/qwidget.cpp95
-rw-r--r--src/gui/kernel/qwidget.h11
-rw-r--r--src/gui/kernel/qwidget_mac.mm15
-rw-r--r--src/gui/kernel/qwidget_p.h71
-rw-r--r--src/gui/kernel/qwidget_s60.cpp85
-rw-r--r--src/gui/kernel/qwidget_win.cpp29
-rw-r--r--src/gui/kernel/qwidget_wince.cpp20
-rw-r--r--src/gui/kernel/qwidget_x11.cpp71
-rw-r--r--src/gui/kernel/qwinnativepangesturerecognizer_win.cpp124
-rw-r--r--src/gui/kernel/qwinnativepangesturerecognizer_win_p.h73
-rw-r--r--src/gui/kernel/symbian.pri3
-rw-r--r--src/gui/painting/qbackingstore.cpp5
-rw-r--r--src/gui/painting/qbackingstore_p.h11
-rw-r--r--src/gui/painting/qblendfunctions.cpp4
-rw-r--r--src/gui/painting/qcolor.cpp27
-rw-r--r--src/gui/painting/qpaintdevice.cpp5
-rw-r--r--src/gui/painting/qpaintdevice.h1
-rw-r--r--src/gui/painting/qpaintengine.h1
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp17
-rw-r--r--src/gui/painting/qpaintengine_s60.cpp2
-rw-r--r--src/gui/painting/qpaintengineex_p.h7
-rw-r--r--src/gui/painting/qpainter.cpp64
-rw-r--r--src/gui/painting/qrasterizer.cpp6
-rw-r--r--src/gui/painting/qstroker.cpp39
-rw-r--r--src/gui/painting/qstroker_p.h15
-rw-r--r--src/gui/painting/qtextureglyphcache.cpp4
-rw-r--r--src/gui/s60framework/qs60mainapplication.cpp47
-rw-r--r--src/gui/s60framework/qs60mainappui.cpp67
-rw-r--r--src/gui/s60framework/qs60maindocument.cpp44
-rw-r--r--src/gui/styles/gtksymbols.cpp9
-rw-r--r--src/gui/styles/qs60style.cpp38
-rw-r--r--src/gui/styles/qs60style.h2
-rw-r--r--src/gui/styles/qs60style_p.h2
-rw-r--r--src/gui/styles/qs60style_s60.cpp27
-rw-r--r--src/gui/styles/qs60style_simulated.cpp4
-rw-r--r--src/gui/styles/qwindowsmobilestyle.cpp106
-rw-r--r--src/gui/symbian/qsymbianevent.cpp143
-rw-r--r--src/gui/symbian/qsymbianevent.h (renamed from doc/src/snippets/gestures/qgesture.h)79
-rw-r--r--src/gui/text/qfontdatabase.cpp5
-rw-r--r--src/gui/text/qfontdatabase_x11.cpp2
-rw-r--r--src/gui/text/qfontengine_mac.mm76
-rw-r--r--src/gui/text/qfontengine_p.h3
-rw-r--r--src/gui/text/qfontengine_win.cpp91
-rw-r--r--src/gui/text/qfontengine_x11.cpp2
-rw-r--r--src/gui/text/qtextcontrol.cpp8
-rw-r--r--src/gui/text/qtextengine_mac.cpp9
-rw-r--r--src/gui/text/qtextodfwriter.cpp4
-rw-r--r--src/gui/widgets/qabstractscrollarea.cpp56
-rw-r--r--src/gui/widgets/qabstractscrollarea.h4
-rw-r--r--src/gui/widgets/qabstractscrollarea_p.h3
-rw-r--r--src/gui/widgets/qcombobox.cpp5
-rw-r--r--src/gui/widgets/qdialogbuttonbox.cpp13
-rw-r--r--src/gui/widgets/qlinecontrol.cpp2
-rw-r--r--src/gui/widgets/qmainwindow.cpp6
-rw-r--r--src/gui/widgets/qmenu.cpp45
-rw-r--r--src/gui/widgets/qmenu_mac.mm24
-rw-r--r--src/gui/widgets/qmenu_p.h5
-rw-r--r--src/gui/widgets/qmenu_symbian.cpp8
-rw-r--r--src/gui/widgets/qmenubar.cpp9
-rw-r--r--src/gui/widgets/qmenubar_p.h3
-rw-r--r--src/gui/widgets/qplaintextedit.cpp55
-rw-r--r--src/gui/widgets/qplaintextedit.h4
-rw-r--r--src/gui/widgets/qplaintextedit_p.h5
-rw-r--r--src/gui/widgets/qpushbutton.cpp4
-rw-r--r--src/gui/widgets/qtextedit.cpp2
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp40
-rw-r--r--src/multimedia/audio/qaudioinput_alsa_p.cpp21
-rw-r--r--src/multimedia/audio/qaudioinput_alsa_p.h1
-rw-r--r--src/multimedia/audio/qaudioinput_win32_p.cpp2
-rw-r--r--src/multimedia/audio/qaudiooutput_alsa_p.cpp19
-rw-r--r--src/multimedia/audio/qaudiooutput_alsa_p.h1
-rw-r--r--src/multimedia/audio/qaudiooutput_win32_p.cpp2
-rw-r--r--src/multimedia/video/qvideosurfaceformat.cpp51
-rw-r--r--src/multimedia/video/qvideosurfaceformat.h8
-rw-r--r--src/network/access/qhttp.cpp28
-rw-r--r--src/network/access/qhttp.h3
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp17
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel_p.h1
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp3
-rw-r--r--src/network/access/qnetworkreply.cpp3
-rw-r--r--src/network/access/qnetworkrequest.cpp2
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp7
-rw-r--r--src/network/socket/qabstractsocket.cpp13
-rw-r--r--src/network/ssl/qsslsocket.cpp38
-rw-r--r--src/network/ssl/qsslsocket.h5
-rw-r--r--src/network/ssl/qsslsocket_p.h1
-rw-r--r--src/opengl/gl2paintengineex/qglcustomshaderstage.cpp2
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadersource_p.h1
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp230
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h29
-rw-r--r--src/opengl/gl2paintengineex/qtriangulatingstroker.cpp340
-rw-r--r--src/opengl/gl2paintengineex/qtriangulatingstroker_p.h299
-rw-r--r--src/opengl/opengl.pro18
-rw-r--r--src/opengl/qgl.cpp115
-rw-r--r--src/opengl/qgl.h1
-rw-r--r--src/opengl/qgl_p.h10
-rw-r--r--src/opengl/qgl_qws.cpp3
-rw-r--r--src/opengl/qgl_x11egl.cpp13
-rw-r--r--src/opengl/qglframebufferobject.cpp24
-rw-r--r--src/opengl/qglframebufferobject_p.h4
-rw-r--r--src/opengl/qglpaintdevice.cpp14
-rw-r--r--src/opengl/qglpaintdevice_p.h2
-rw-r--r--src/opengl/qglwindowsurface_qws.cpp1
-rw-r--r--src/opengl/qgraphicssystem_gl.cpp15
-rw-r--r--src/opengl/qpaintengine_opengl.cpp70
-rw-r--r--src/opengl/qpixmapdata_gl.cpp31
-rw-r--r--src/opengl/qpixmapdata_gl_p.h2
-rw-r--r--src/opengl/qpixmapdata_x11gl_egl.cpp252
-rw-r--r--src/opengl/qpixmapdata_x11gl_p.h86
-rw-r--r--src/opengl/qwindowsurface_gl.cpp21
-rw-r--r--src/opengl/qwindowsurface_x11gl.cpp144
-rw-r--r--src/opengl/qwindowsurface_x11gl_p.h (renamed from src/opengl/qglpaintdevice_qws_p.h)41
-rw-r--r--src/opengl/util/composition_mode_colorburn.glsl4
-rw-r--r--src/opengl/util/composition_mode_colordodge.glsl4
-rw-r--r--src/opengl/util/composition_mode_darken.glsl2
-rw-r--r--src/opengl/util/composition_mode_difference.glsl2
-rw-r--r--src/opengl/util/composition_mode_exclusion.glsl2
-rw-r--r--src/opengl/util/composition_mode_hardlight.glsl6
-rw-r--r--src/opengl/util/composition_mode_lighten.glsl2
-rw-r--r--src/opengl/util/composition_mode_multiply.glsl2
-rw-r--r--src/opengl/util/composition_mode_overlay.glsl6
-rw-r--r--src/opengl/util/composition_mode_softlight.glsl10
-rw-r--r--src/opengl/util/conical_brush.glsl2
-rw-r--r--src/opengl/util/ellipse.glsl6
-rw-r--r--src/opengl/util/ellipse_aa.glsl56
-rw-r--r--src/opengl/util/ellipse_aa_copy.glsl11
-rw-r--r--src/opengl/util/ellipse_aa_radial.glsl24
-rw-r--r--src/opengl/util/ellipse_functions.glsl63
-rw-r--r--src/opengl/util/fragmentprograms_p.h2069
-rw-r--r--src/opengl/util/generator.cpp53
-rw-r--r--src/opengl/util/masks.conf1
-rw-r--r--src/opengl/util/pattern_brush.glsl4
-rw-r--r--src/opengl/util/simple_porter_duff.glsl6
-rw-r--r--src/opengl/util/trap_exact_aa.glsl12
-rw-r--r--src/openvg/qpaintengine_vg.cpp140
-rw-r--r--src/openvg/qpaintengine_vg_p.h2
-rw-r--r--src/openvg/qpixmapdata_vg.cpp5
-rw-r--r--src/openvg/qpixmapdata_vg_p.h2
-rw-r--r--src/openvg/qpixmapfilter_vg.cpp140
-rw-r--r--src/openvg/qpixmapfilter_vg_p.h10
-rw-r--r--src/openvg/qwindowsurface_vg.cpp2
-rw-r--r--src/openvg/qwindowsurface_vgegl.cpp4
-rw-r--r--src/plugins/accessible/widgets/main.cpp4
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp84
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h33
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp2
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp77
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.h12
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp21
-rw-r--r--src/plugins/gfxdrivers/gfxdrivers.pro1
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybrid.pro16
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridplugin.cpp75
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridscreen.cpp382
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridscreen.h97
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridsurface.cpp300
-rw-r--r--src/plugins/gfxdrivers/hybrid/hybridsurface.h90
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c72
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h18
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h1
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c14
-rw-r--r--src/plugins/gfxdrivers/powervr/README12
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp201
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h28
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp62
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h12
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp14
-rw-r--r--src/qt3support/widgets/q3combobox.cpp3
-rw-r--r--src/qt3support/widgets/q3toolbar.cpp2
-rw-r--r--src/s60installs/eabi/QtCoreu.def7379
-rw-r--r--src/s60installs/eabi/QtGuiu.def24675
-rw-r--r--src/s60installs/eabi/QtMultimediau.def571
-rw-r--r--src/s60installs/eabi/QtNetworku.def2350
-rw-r--r--src/s60installs/eabi/QtScriptu.def909
-rw-r--r--src/s60installs/eabi/QtSqlu.def930
-rw-r--r--src/s60installs/eabi/QtSvgu.def323
-rw-r--r--src/s60installs/eabi/QtTestu.def166
-rw-r--r--src/s60installs/eabi/QtWebKitu.def652
-rw-r--r--src/s60installs/eabi/QtXmlu.def531
-rw-r--r--src/s60installs/eabi/phononu.def1096
-rw-r--r--src/s60installs/qt.iby8
-rw-r--r--src/script/api/qscriptengine.cpp126
-rw-r--r--src/script/api/qscriptengine_p.h98
-rw-r--r--src/script/api/qscriptengineagent.cpp2
-rw-r--r--src/script/api/qscriptstring.cpp3
-rw-r--r--src/script/api/qscriptstring_p.h7
-rw-r--r--src/script/api/qscriptvalue.cpp111
-rw-r--r--src/script/api/qscriptvalue.h3
-rw-r--r--src/script/api/qscriptvalue_p.h21
-rw-r--r--src/script/bridge/qscriptclassobject.cpp11
-rw-r--r--src/script/bridge/qscriptclassobject_p.h15
-rw-r--r--src/script/bridge/qscriptobject.cpp30
-rw-r--r--src/script/bridge/qscriptobject_p.h38
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp2
-rw-r--r--src/sql/kernel/qsqldatabase.cpp2
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp3
-rw-r--r--src/svg/qsvggenerator.cpp1
-rw-r--r--src/testlib/qtestlog.cpp5
-rw-r--r--tests/auto/auto.pro5
-rw-r--r--tests/auto/bic/tst_bic.cpp2
-rw-r--r--tests/auto/gestures/gestures.pro5
-rw-r--r--tests/auto/gestures/tst_gestures.cpp1170
-rw-r--r--tests/auto/linguist/lrelease/testdata/idbased.ts7
-rw-r--r--tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp9
-rw-r--r--tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp10
-rw-r--r--tests/auto/qabstractitemview/tst_qabstractitemview.cpp45
-rw-r--r--tests/auto/qapplication/tst_qapplication.cpp4
-rw-r--r--tests/auto/qaudioinput/tst_qaudioinput.cpp2
-rw-r--r--tests/auto/qaudiooutput/tst_qaudiooutput.cpp9
-rw-r--r--tests/auto/qbuttongroup/tst_qbuttongroup.cpp11
-rw-r--r--tests/auto/qcombobox/tst_qcombobox.cpp18
-rw-r--r--tests/auto/qdom/tst_qdom.cpp1
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp867
-rw-r--r--tests/auto/qfiledialog2/qfiledialog2.pro27
-rw-r--r--tests/auto/qfiledialog2/tst_qfiledialog2.cpp1044
-rw-r--r--tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp24
-rw-r--r--tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp200
-rw-r--r--tests/auto/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp4
-rw-r--r--tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp11
-rw-r--r--tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp65
-rw-r--r--tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp14
-rw-r--r--tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp135
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp28
-rw-r--r--tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp2
-rw-r--r--tests/auto/qgraphicsview/tst_qgraphicsview.cpp24
-rw-r--r--tests/auto/qgraphicsview/tst_qgraphicsview_2.cpp212
-rw-r--r--tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp53
-rw-r--r--tests/auto/qheaderview/tst_qheaderview.cpp7
-rw-r--r--tests/auto/qhttp/tst_qhttp.cpp43
-rw-r--r--tests/auto/qlabel/qlabel.pro21
-rw-r--r--tests/auto/qlabel/tst_qlabel.cpp58
-rw-r--r--tests/auto/qlayout/tst_qlayout.cpp28
-rw-r--r--tests/auto/qlineedit/tst_qlineedit.cpp24
-rw-r--r--tests/auto/qlistview/tst_qlistview.cpp61
-rw-r--r--tests/auto/qmenu/tst_qmenu.cpp14
-rw-r--r--tests/auto/qpainter/tst_qpainter.cpp42
-rw-r--r--tests/auto/qpauseanimation/qpauseanimation.pro5
-rw-r--r--tests/auto/qpauseanimation/tst_qpauseanimation.cpp410
-rw-r--r--tests/auto/qpixmap/tst_qpixmap.cpp2
-rw-r--r--tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp14
-rw-r--r--tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp37
-rw-r--r--tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp24
-rw-r--r--tests/auto/qsidebar/tst_qsidebar.cpp26
-rw-r--r--tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp56
-rw-r--r--tests/auto/qsqldatabase/tst_databases.h1
-rw-r--r--tests/auto/qsqldatabase/tst_qsqldatabase.cpp55
-rw-r--r--tests/auto/qsqldriver/tst_qsqldriver.cpp15
-rw-r--r--tests/auto/qsqlquery/tst_qsqlquery.cpp21
-rw-r--r--tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp2
-rw-r--r--tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp8
-rw-r--r--tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp7
-rw-r--r--tests/auto/qsqlthread/tst_qsqlthread.cpp2
-rw-r--r--tests/auto/qsslsocket/tst_qsslsocket.cpp107
-rw-r--r--tests/auto/qtableview/tst_qtableview.cpp238
-rw-r--r--tests/auto/qtablewidget/tst_qtablewidget.cpp21
-rw-r--r--tests/auto/qtabwidget/tst_qtabwidget.cpp6
-rw-r--r--tests/auto/qtreeview/tst_qtreeview.cpp14
-rw-r--r--tests/auto/qtreewidget/tst_qtreewidget.cpp39
-rw-r--r--tests/auto/qurl/tst_qurl.cpp8
-rw-r--r--tests/auto/quuid/tst_quuid.cpp26
-rw-r--r--tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp39
-rw-r--r--tests/auto/qwidget/tst_qwidget.cpp219
-rw-r--r--tests/auto/qwidgetaction/tst_qwidgetaction.cpp2
-rw-r--r--tests/benchmarks/benchmarks.pro4
-rw-r--r--tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp236
-rw-r--r--tests/benchmarks/qnetworkreply/qnetworkreply.pro2
-rw-r--r--tests/benchmarks/qnetworkreply/tst_qnetworkreply.cpp (renamed from tests/benchmarks/qnetworkreply/main.cpp)40
-rw-r--r--tests/manual/gestures/graphicsview/gestures.cpp131
-rw-r--r--tests/manual/gestures/graphicsview/gestures.h78
-rw-r--r--tests/manual/gestures/graphicsview/graphicsview.pro17
-rw-r--r--tests/manual/gestures/graphicsview/imageitem.cpp (renamed from examples/gestures/imageviewer/main.cpp)69
-rw-r--r--tests/manual/gestures/graphicsview/imageitem.h (renamed from tests/manual/gestures/pinch/pinchwidget.h)47
-rw-r--r--tests/manual/gestures/graphicsview/main.cpp230
-rw-r--r--tests/manual/gestures/graphicsview/mousepangesturerecognizer.cpp112
-rw-r--r--tests/manual/gestures/graphicsview/mousepangesturerecognizer.h57
-rw-r--r--tests/manual/gestures/pinch/pinch.pro4
-rw-r--r--tests/manual/gestures/pinch/pinch.qrc5
-rw-r--r--tests/manual/gestures/pinch/pinchwidget.cpp118
-rw-r--r--tests/manual/gestures/pinch/qt-logo.pngbin13923 -> 0 bytes
-rw-r--r--tests/manual/gestures/scrollarea/main.cpp229
-rw-r--r--tests/manual/gestures/scrollarea/mousepangesturerecognizer.cpp94
-rw-r--r--tests/manual/gestures/scrollarea/mousepangesturerecognizer.h57
-rw-r--r--tests/manual/gestures/scrollarea/scrollarea.pro3
-rw-r--r--tests/manual/gestures/twopanwidgets/main.cpp135
-rw-r--r--tests/manual/gestures/twopanwidgets/twopanwidgets.pro1
-rw-r--r--tools/assistant/lib/qhelpcollectionhandler.cpp14
-rw-r--r--tools/assistant/lib/qhelpsearchquerywidget.cpp2
-rw-r--r--tools/configure/configureapp.cpp5
-rw-r--r--tools/linguist/lupdate/main.cpp2
-rw-r--r--tools/linguist/shared/qm.cpp9
-rw-r--r--tools/linguist/shared/translatormessage.cpp8
-rw-r--r--tools/qdoc3/cppcodemarker.cpp57
-rw-r--r--tools/qdoc3/cppcodeparser.cpp43
-rw-r--r--tools/qdoc3/htmlgenerator.cpp163
-rw-r--r--tools/qdoc3/htmlgenerator.h9
-rw-r--r--tools/qdoc3/node.cpp26
-rw-r--r--tools/qdoc3/node.h27
-rw-r--r--tools/qdoc3/test/qt-api-only-with-xcode.qdocconf29
-rw-r--r--tools/qdoc3/test/qt-build-docs-with-xcode.qdocconf3
-rw-r--r--tools/qdoc3/test/qt-with-xcode.qdocconf3
-rw-r--r--tools/qtestlib/wince/cetest/main.cpp2
-rw-r--r--translations/assistant_adp_pl.ts60
-rw-r--r--translations/assistant_adp_ru.ts72
-rw-r--r--translations/assistant_pl.ts338
-rw-r--r--translations/assistant_ru.ts108
-rw-r--r--translations/designer_pl.ts914
-rw-r--r--translations/designer_ru.ts7049
-rw-r--r--translations/linguist_pl.ts433
-rw-r--r--translations/linguist_ru.ts366
-rw-r--r--translations/qt_de.ts643
-rw-r--r--translations/qt_help_pl.ts72
-rw-r--r--translations/qt_help_ru.ts36
-rw-r--r--translations/qt_pl.ts3529
-rw-r--r--translations/qt_ru.ts3983
-rw-r--r--translations/qtconfig_pl.ts16
-rw-r--r--translations/qtconfig_ru.ts77
-rw-r--r--translations/qvfb_pl.ts41
-rw-r--r--translations/qvfb_ru.ts58
-rw-r--r--util/qlalr/cppgenerator.cpp20
-rw-r--r--util/qlalr/examples/glsl/glsl-lex.l3
-rw-r--r--util/qlalr/examples/glsl/glsl.g58
-rw-r--r--util/qlalr/main.cpp2
-rwxr-xr-xutil/webkit/mkdist-webkit2
1951 files changed, 146384 insertions, 82215 deletions
diff --git a/bin/setcepaths.bat b/bin/setcepaths.bat
index 15d8ff8..914e594 100755
--- a/bin/setcepaths.bat
+++ b/bin/setcepaths.bat
@@ -79,6 +79,11 @@ checksdk.exe -sdk "Windows Mobile 6 Professional SDK (ARMV4I)" -script tmp_creat
tmp_created_script_setup.bat
del tmp_created_script_setup.bat
echo Windows Mobile 6 Professional selected, environment is set up
+) ELSE IF "%1" EQU "wincewm65professional-msvc2005" (
+checksdk.exe -sdk "Windows Mobile 6 Professional SDK (ARMV4I)" -script tmp_created_script_setup.bat 1>NUL
+tmp_created_script_setup.bat
+del tmp_created_script_setup.bat
+echo Windows Mobile 6 Professional selected, environment is set up
) ELSE IF "%1" EQU "wincewm60standard-msvc2005" (
checksdk.exe -sdk "Windows Mobile 6 Standard SDK (ARMV4I)" -script tmp_created_script_setup.bat 1>NUL
tmp_created_script_setup.bat
@@ -124,6 +129,11 @@ checksdk.exe -sdk "Windows Mobile 6 Professional SDK (ARMV4I)" -script tmp_creat
tmp_created_script_setup.bat
del tmp_created_script_setup.bat
echo Windows Mobile 6 Professional selected, environment is set up
+) ELSE IF "%1" EQU "wincewm65professional-msvc2008" (
+checksdk.exe -sdk "Windows Mobile 6 Professional SDK (ARMV4I)" -script tmp_created_script_setup.bat 1>NUL
+tmp_created_script_setup.bat
+del tmp_created_script_setup.bat
+echo Windows Mobile 6 Professional selected, environment is set up
) ELSE IF "%1" EQU "wincewm60standard-msvc2008" (
checksdk.exe -sdk "Windows Mobile 6 Standard SDK (ARMV4I)" -script tmp_created_script_setup.bat 1>NUL
tmp_created_script_setup.bat
diff --git a/configure b/configure
index 323224c..485c71c 100755
--- a/configure
+++ b/configure
@@ -2873,7 +2873,6 @@ fi
# pass on $CFG_SDK to the configure tests.
if [ '!' -z "$CFG_SDK" ]; then
MAC_CONFIG_TEST_COMMANDLINE="-sdk $CFG_SDK"
- echo "tests command line: $MAC_CONFIG_TEST_COMMANDLINE"
fi
# find the default framework value
diff --git a/configure.exe b/configure.exe
index 838889c..dabf10c 100755
--- a/configure.exe
+++ b/configure.exe
Binary files differ
diff --git a/demos/browser/browser.pro b/demos/browser/browser.pro
index 6c5f005..a42aa60 100644
--- a/demos/browser/browser.pro
+++ b/demos/browser/browser.pro
@@ -3,7 +3,7 @@ TARGET = browser
QT += webkit network
CONFIG += qt warn_on
-contains(QT_BUILD_PARTS, tools):!symbian:!embedded: CONFIG += uitools
+contains(QT_BUILD_PARTS, tools):!embedded: CONFIG += uitools
else: DEFINES += QT_NO_UITOOLS
release:DEFINES+=QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT
diff --git a/demos/demos.pro b/demos/demos.pro
index 4a9d451..5e400ea 100644
--- a/demos/demos.pro
+++ b/demos/demos.pro
@@ -26,7 +26,7 @@ SUBDIRS += demos_boxes
}
mac*: SUBDIRS += demos_macmainwindow
-wince*|symbian|embedded: SUBDIRS += embedded
+wince*|symbian|embedded|x11: SUBDIRS += embedded
!contains(QT_EDITION, Console):!cross_compile:!embedded:!wince*:SUBDIRS += demos_arthurplugin
diff --git a/demos/embedded/anomaly/anomaly.pro b/demos/embedded/anomaly/anomaly.pro
index 8f2825b..2871ba7 100644
--- a/demos/embedded/anomaly/anomaly.pro
+++ b/demos/embedded/anomaly/anomaly.pro
@@ -29,3 +29,8 @@ symbian {
TARGET.CAPABILITY = NetworkServices
TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/anomaly
+sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro src/images
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/anomaly
+INSTALLS += target sources
diff --git a/demos/embedded/desktopservices/desktopservices.pro b/demos/embedded/desktopservices/desktopservices.pro
index c160029c..bff7c46 100644
--- a/demos/embedded/desktopservices/desktopservices.pro
+++ b/demos/embedded/desktopservices/desktopservices.pro
@@ -8,15 +8,25 @@ SOURCES += desktopwidget.cpp contenttab.cpp linktab.cpp main.cpp
RESOURCES += desktopservices.qrc
music.sources = data/*.mp3 data/*.wav
-music.path = /data/sounds/
-
image.sources = data/*.png
-image.path = /data/images/
-DEPLOYMENT += music image
+target.path = $$[QT_INSTALL_DEMOS]/embedded/desktopservices
+sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/desktopservices
symbian {
TARGET.UID3 = 0xA000C611
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
ICON = ./resources/heart.svg
+ music.path = /data/sounds/
+ image.path = /data/images/
+ DEPLOYMENT += music image
+}
+
+wince*{
+ music.path = "\My Documents\My Music"
+ image.path = "\My Documents\My Pictures"
+ DEPLOYMENT += music image
}
+
+INSTALLS += target sources
diff --git a/demos/embedded/digiflip/digiflip.cpp b/demos/embedded/digiflip/digiflip.cpp
index 2edb752..9d6265d 100644
--- a/demos/embedded/digiflip/digiflip.cpp
+++ b/demos/embedded/digiflip/digiflip.cpp
@@ -117,7 +117,7 @@ protected:
QPixmap drawDigits(int n, const QRect &rect) {
int scaleFactor = 2;
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
if (rect.height() > 240)
scaleFactor = 1;
#endif
@@ -192,7 +192,7 @@ protected:
void paintFlip() {
QPainter p(this);
-#if !defined(Q_OS_SYMBIAN)
+#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_WINCE_WM)
p.setRenderHint(QPainter::SmoothPixmapTransform, true);
p.setRenderHint(QPainter::Antialiasing, true);
#endif
@@ -319,7 +319,7 @@ public:
connect(slideAction, SIGNAL(triggered()), SLOT(chooseSlide()));
connect(flipAction, SIGNAL(triggered()), SLOT(chooseFlip()));
connect(rotateAction, SIGNAL(triggered()), SLOT(chooseRotate()));
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
menuBar()->addAction(slideAction);
menuBar()->addAction(flipAction);
menuBar()->addAction(rotateAction);
@@ -414,7 +414,7 @@ int main(int argc, char *argv[])
QApplication app(argc, argv);
DigiFlip time;
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
time.showMaximized();
#else
time.resize(320, 240);
diff --git a/demos/embedded/digiflip/digiflip.pro b/demos/embedded/digiflip/digiflip.pro
index 72cdc0f..4af9973 100644
--- a/demos/embedded/digiflip/digiflip.pro
+++ b/demos/embedded/digiflip/digiflip.pro
@@ -5,3 +5,7 @@ symbian {
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
}
+target.path = $$[QT_INSTALL_DEMOS]/embedded/digiflip
+sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/digiflip
+INSTALLS += target sources
diff --git a/demos/embedded/flickable/flickable.pro b/demos/embedded/flickable/flickable.pro
index 731dcbe..1052330 100644
--- a/demos/embedded/flickable/flickable.pro
+++ b/demos/embedded/flickable/flickable.pro
@@ -5,3 +5,8 @@ symbian {
TARGET.UID3 = 0xA000CF73
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/flickable
+sources.files = $$SOURCES $$HEADERS $$RESOURCES *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/flickable
+INSTALLS += target sources
diff --git a/demos/embedded/flickable/main.cpp b/demos/embedded/flickable/main.cpp
index 403085a..eb2c3c0 100644
--- a/demos/embedded/flickable/main.cpp
+++ b/demos/embedded/flickable/main.cpp
@@ -222,7 +222,7 @@ int main(int argc, char *argv[])
ColorList list;
list.setWindowTitle("Kinetic Scrolling");
-#ifdef Q_OS_SYMBIAN
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
list.showMaximized();
#else
list.resize(320, 320);
diff --git a/demos/embedded/flightinfo/flightinfo.pro b/demos/embedded/flightinfo/flightinfo.pro
index 0a51287..8e5535c 100644
--- a/demos/embedded/flightinfo/flightinfo.pro
+++ b/demos/embedded/flightinfo/flightinfo.pro
@@ -12,3 +12,8 @@ symbian {
LIBS += -lesock -lconnmon -linsock
TARGET.CAPABILITY = NetworkServices
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/flightinfo
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/flightinfo
+INSTALLS += target sources
diff --git a/demos/embedded/fluidlauncher/fluidlauncher.cpp b/demos/embedded/fluidlauncher/fluidlauncher.cpp
index c065bc9..5e8cc03 100644
--- a/demos/embedded/fluidlauncher/fluidlauncher.cpp
+++ b/demos/embedded/fluidlauncher/fluidlauncher.cpp
@@ -265,6 +265,10 @@ void FluidLauncher::demoFinished()
{
setCurrentWidget(pictureFlowWidget);
inputTimer->start();
+
+ // Bring the Fluidlauncher to the foreground to allow selecting another demo
+ raise();
+ activateWindow();
}
void FluidLauncher::changeEvent(QEvent* event)
diff --git a/demos/embedded/lightmaps/lightmaps.cpp b/demos/embedded/lightmaps/lightmaps.cpp
index 52297d2..ea34ae6 100644
--- a/demos/embedded/lightmaps/lightmaps.cpp
+++ b/demos/embedded/lightmaps/lightmaps.cpp
@@ -510,7 +510,7 @@ public:
connect(nightModeAction, SIGNAL(triggered()), map, SLOT(toggleNightMode()));
connect(osmAction, SIGNAL(triggered()), SLOT(aboutOsm()));
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
menuBar()->addAction(osloAction);
menuBar()->addAction(berlinAction);
menuBar()->addAction(jakartaAction);
@@ -568,7 +568,7 @@ int main(int argc, char **argv)
MapZoom w;
w.setWindowTitle("OpenStreetMap");
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
w.showMaximized();
#else
w.resize(600, 450);
diff --git a/demos/embedded/lightmaps/lightmaps.pro b/demos/embedded/lightmaps/lightmaps.pro
index cc78efa..c9bfa0a 100644
--- a/demos/embedded/lightmaps/lightmaps.pro
+++ b/demos/embedded/lightmaps/lightmaps.pro
@@ -10,3 +10,8 @@ symbian {
TARGET.CAPABILITY = NetworkServices
TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/lightmaps
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/lightmaps
+INSTALLS += target sources
diff --git a/demos/embedded/raycasting/raycasting.cpp b/demos/embedded/raycasting/raycasting.cpp
index c3b21b6..cb08b51 100644
--- a/demos/embedded/raycasting/raycasting.cpp
+++ b/demos/embedded/raycasting/raycasting.cpp
@@ -251,7 +251,9 @@ public:
protected:
void resizeEvent(QResizeEvent*) {
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_WINCE_WM)
+ touchDevice = true;
+#elif defined(Q_OS_SYMBIAN)
// FIXME: use HAL
if (width() > 480 || height() > 480)
touchDevice = true;
@@ -378,7 +380,7 @@ int main(int argc, char **argv)
Raycasting w;
w.setWindowTitle("Raycasting");
-#if defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)
w.showMaximized();
#else
w.resize(640, 480);
diff --git a/demos/embedded/raycasting/raycasting.pro b/demos/embedded/raycasting/raycasting.pro
index 8dd8a24..82d0812 100644
--- a/demos/embedded/raycasting/raycasting.pro
+++ b/demos/embedded/raycasting/raycasting.pro
@@ -6,3 +6,8 @@ symbian {
TARGET.UID3 = 0xA000CF76
include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/raycasting
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/raycasting
+INSTALLS += target sources
diff --git a/demos/embedded/weatherinfo/weatherinfo.pro b/demos/embedded/weatherinfo/weatherinfo.pro
index 54c3857..57f1684 100644
--- a/demos/embedded/weatherinfo/weatherinfo.pro
+++ b/demos/embedded/weatherinfo/weatherinfo.pro
@@ -11,3 +11,8 @@ symbian {
LIBS += -lesock -lconnmon -linsock
TARGET.CAPABILITY = NetworkServices
}
+
+target.path = $$[QT_INSTALL_DEMOS]/embedded/weatherinfo
+sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro
+sources.path = $$[QT_INSTALL_DEMOS]/embedded/weatherinfo
+INSTALLS += target sources
diff --git a/demos/qmediaplayer/mediaplayer.cpp b/demos/qmediaplayer/mediaplayer.cpp
index baac236..624bab7 100644
--- a/demos/qmediaplayer/mediaplayer.cpp
+++ b/demos/qmediaplayer/mediaplayer.cpp
@@ -321,6 +321,7 @@ MediaPlayer::MediaPlayer(const QString &filePath,
connect(&m_MediaObject, SIGNAL(finished()), this, SLOT(finished()));
connect(&m_MediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), this, SLOT(stateChanged(Phonon::State, Phonon::State)));
connect(&m_MediaObject, SIGNAL(bufferStatus(int)), this, SLOT(bufferStatus(int)));
+ connect(&m_MediaObject, SIGNAL(hasVideoChanged(bool)), this, SLOT(hasVideoChanged(bool)));
rewindButton->setEnabled(false);
playButton->setEnabled(false);
@@ -339,8 +340,6 @@ void MediaPlayer::stateChanged(Phonon::State newstate, Phonon::State oldstate)
Q_UNUSED(oldstate);
if (oldstate == Phonon::LoadingState) {
- m_videoWindow.setVisible(m_MediaObject.hasVideo());
- info->setVisible(!m_MediaObject.hasVideo());
QRect videoHintRect = QRect(QPoint(0, 0), m_videoWindow.sizeHint());
QRect newVideoRect = QApplication::desktop()->screenGeometry().intersected(videoHintRect);
if (!m_hasSmallScreen) {
@@ -367,6 +366,9 @@ void MediaPlayer::stateChanged(Phonon::State newstate, Phonon::State oldstate)
case Phonon::PausedState:
case Phonon::StoppedState:
playButton->setIcon(playIcon);
+
+ m_videoWidget->setFullScreen(false);
+
if (m_MediaObject.currentSource().type() != Phonon::MediaSource::Invalid){
playButton->setEnabled(true);
rewindButton->setEnabled(true);
@@ -843,3 +845,8 @@ void MediaPlayer::aspectChanged(QAction *act)
m_videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
}
+void MediaPlayer::hasVideoChanged(bool bHasVideo)
+{
+ info->setVisible(!bHasVideo);
+ m_videoWindow.setVisible(bHasVideo);
+}
diff --git a/demos/qmediaplayer/mediaplayer.h b/demos/qmediaplayer/mediaplayer.h
index 40ffa40..83f14e8 100644
--- a/demos/qmediaplayer/mediaplayer.h
+++ b/demos/qmediaplayer/mediaplayer.h
@@ -93,6 +93,7 @@ public slots:
void playPause();
void scaleChanged(QAction *);
void aspectChanged(QAction *);
+ void hasVideoChanged(bool);
private slots:
void setAspect(int);
diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml
index 2c31484..83bd200 100644
--- a/demos/qtdemo/xml/examples.xml
+++ b/demos/qtdemo/xml/examples.xml
@@ -154,7 +154,7 @@
<category dirname="phonon" name="Phonon">
<example filename="qmusicplayer" name="Music Player" />
</category>
- <category dirname="multimedia/audio" name="Multimedia">
+ <category dirname="multimedia" name="Multimedia">
<example filename="audiodevices" name="Audio Devices" />
<example filename="audiooutput" name="Audio Output" />
<example filename="audioinput" name="Audio Input" />
diff --git a/demos/spreadsheet/spreadsheet.cpp b/demos/spreadsheet/spreadsheet.cpp
index 7f057a2..00045c6 100644
--- a/demos/spreadsheet/spreadsheet.cpp
+++ b/demos/spreadsheet/spreadsheet.cpp
@@ -523,6 +523,7 @@ void SpreadSheet::setupContents()
table->setItem(8, 2, new SpreadSheetItem("1240"));
table->setItem(9, 2, new SpreadSheetItem());
+ table->item(9, 2)->setBackgroundColor(Qt::lightGray);
// column 3
table->setItem(0, 3, new SpreadSheetItem("Currency"));
diff --git a/demos/sub-attaq/boat.cpp b/demos/sub-attaq/boat.cpp
index 3b1bac7..cb40329 100644
--- a/demos/sub-attaq/boat.cpp
+++ b/demos/sub-attaq/boat.cpp
@@ -87,7 +87,7 @@ Boat::Boat() : PixmapItem(QString("boat"), GraphicsScene::Big),
speed(0), bombsAlreadyLaunched(0), direction(Boat::None), movementAnimation(0)
{
setZValue(4);
- setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
+ setFlags(QGraphicsItem::ItemIsFocusable);
//The movement animation used to animate the boat
movementAnimation = new QPropertyAnimation(this, "pos");
diff --git a/dist/changes-4.6.0 b/dist/changes-4.6.0
index cd9f130..7f723da 100644
--- a/dist/changes-4.6.0
+++ b/dist/changes-4.6.0
@@ -49,6 +49,12 @@ information about a particular change.
QRegion. The native handle is for reading out only. Any GDI calls
made on the HRGN handle will not affect the QRegion.
+ - [259221] QFileInfo::symLinkTarget() now supports NTFS symbolic links
+ thanks to Konstantin Ritt (merge request 1217).
+
+ - The reading code of QLocalSocket on Windows has been rewritten to improve
+ reading performance.
+
****************************************************************************
* Important Behavior Changes *
****************************************************************************
diff --git a/doc/doc.pri b/doc/doc.pri
index 9105fbb..d4fdcd8 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -19,11 +19,7 @@ $$unixstyle {
QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && set QT_BUILD_TREE=$$QT_BUILD_TREE&& set QT_SOURCE_TREE=$$QT_SOURCE_TREE&& $$QT_BUILD_TREE/bin/qdoc3.exe $$DOCS_GENERATION_DEFINES
QDOC = $$replace(QDOC, "/", "\\")
}
-macx {
- ADP_DOCS_QDOCCONF_FILE = qt-build-docs-with-xcode.qdocconf
-} else {
- ADP_DOCS_QDOCCONF_FILE = qt-build-docs.qdocconf
-}
+ADP_DOCS_QDOCCONF_FILE = qt-build-docs.qdocconf
QT_DOCUMENTATION = ($$QDOC qt-api-only.qdocconf assistant.qdocconf designer.qdocconf \
linguist.qdocconf qmake.qdocconf) && \
(cd $$QT_BUILD_TREE && \
diff --git a/doc/src/deployment/deployment.qdoc b/doc/src/deployment/deployment.qdoc
index f2bae23..b5b1b9c 100644
--- a/doc/src/deployment/deployment.qdoc
+++ b/doc/src/deployment/deployment.qdoc
@@ -345,6 +345,7 @@
are many ways to solve this:
\list
+
\o You can install the Qt libraries in one of the system
library paths (e.g. \c /usr/lib on most systems).
@@ -804,6 +805,30 @@
compiler version against the same C runtime version. This prevents
deploying errors caused by different versions of the C runtime libraries.
+ \section2 Visual Studio 2008 And Manual Installs
+
+ As well as the above details for VS 2005 and onwards, Visual Studio 2008
+ applications may have problems when deploying manually, say to a USB
+ stick.
+
+ The recommended procedure is to configure Qt with the \c -plugin-manifests
+ option using the 'configure' tool. Then follow the \l {http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx}{guidelines}
+ for manually deploying private assemblies.
+
+ In brief the steps are
+
+ \list 1
+
+ \o create a folder structure on the development computer that will match the target USB stick directory structure, for example '\\app' and for your dlls, '\\app\\lib'.
+
+ \o on the development computer, from the appropriate 'redist' folder copy over Microsoft.VC80.CRT and Microsoft.VC80.MFC to the directories '\\app' and '\\app\\lib' on the development PC.
+
+ \o xcopy the \\app folder to the target USB stick.
+ \endlist
+
+ Your application should now run. Also be aware that even with a service
+ pack installed the Windows DLLs that are linked to will be the defaults. See
+ the information on \l {http://msdn.microsoft.com/en-us/library/cc664727.aspx}{how to select the appropriate target DLLs}.
\section1 Application Dependencies
diff --git a/doc/src/diagrams/gestures/pangesture.svg b/doc/src/diagrams/gestures/pangesture.svg
new file mode 100644
index 0000000..c5b95ca
--- /dev/null
+++ b/doc/src/diagrams/gestures/pangesture.svg
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="pangesture.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3198">
+ <stop
+ style="stop-color:#c8c8e1;stop-opacity:1;"
+ offset="0"
+ id="stop3200" />
+ <stop
+ style="stop-color:#e0e0e0;stop-opacity:0;"
+ offset="1"
+ id="stop3202" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective2473"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3198"
+ id="linearGradient3204"
+ x1="487.5"
+ y1="158.61218"
+ x2="487.5"
+ y2="171.11218"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-143.75,1.0517187e-5)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="297.42699"
+ inkscape:cy="855.02875"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1184"
+ inkscape:window-height="668"
+ inkscape:window-x="152"
+ inkscape:window-y="228">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ units="pt"
+ spacingx="1pt"
+ spacingy="1pt" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3235"
+ width="275"
+ height="162.5"
+ x="137.5"
+ y="114.86218"
+ ry="25.253815"
+ rx="25.253815"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3167"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(62.5,18.75)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#c90000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3169"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(206.25,18.75)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.625, 5.625;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 200,183.61218 C 243.75,171.11218 300,171.11218 343.75,183.61218"
+ sodipodi:nodetypes="cc"
+ id="path12"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <g
+ id="g3214"
+ transform="translate(2.07835,-3.2783474)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72">
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 316.67165,230.64053 C 318.73754,225.81328 330.55722,234.70496 337.5,236.73718 L 337.5,189.86218 C 337.5,180.48718 346.875,180.48718 346.875,189.86218 L 346.875,222.67468 L 346.875,208.61218 C 346.875,203.92468 356.25,203.92468 356.25,208.61218 L 356.25,222.67468 L 356.25,213.29968 C 356.25,208.61218 365.625,208.61218 365.625,213.29968 L 365.625,227.36218 L 365.625,217.98718 C 365.625,213.29968 375,213.29968 375,217.98718 L 375,264.86218 C 365.625,269.54968 346.875,269.54968 337.5,264.86218 L 337.5,250.79968 C 331.50558,243.39877 314.0625,236.73718 316.67165,230.64053 z"
+ id="path2480"
+ sodipodi:nodetypes="ccccccccccccccccc" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 345.62962,192.2547 C 345.62962,188.66774 345.62962,185.08078 342.1875,185.08078 C 338.7454,185.08078 338.7454,188.66774 338.7454,192.2547 C 338.7454,195.84166 345.62962,195.84166 345.62962,192.2547 z"
+ id="path2478"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ id="path3218"
+ d="M 165.625,142.98718 L 175,133.61218 L 184.375,142.98718 L 165.625,142.98718 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ sodipodi:nodetypes="cccc"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 193.75,139.86218 L 206.25,127.36218 L 218.75,139.86218 L 193.75,139.86218 z"
+ id="path3220" />
+ <path
+ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 143.75,164.86218 L 175,133.61218 L 187.5,146.11218 L 206.25,127.36218 L 243.75,164.86218"
+ id="path3157"
+ sodipodi:nodetypes="ccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ id="path3222"
+ d="M 237.5,146.11218 L 243.75,139.86218 L 250,146.11218 L 237.5,146.11218 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 231.25,152.36218 L 243.75,139.86218 L 256.25,152.36218"
+ id="path3159"
+ sodipodi:nodetypes="ccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3186"
+ d="M 175,158.61218 L 187.5,146.11218"
+ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:url(#linearGradient3204);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 281.25,171.11218 L 318.75,133.61218 L 331.25,146.11218 L 350,127.36218 L 375,152.36218 L 387.5,139.86218 L 400,152.36218 L 400,171.11218"
+ id="path3196"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 309.375,142.98718 L 318.75,133.61218 L 328.125,142.98718 L 309.375,142.98718 z"
+ id="path3182"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ id="path3184"
+ d="M 337.5,139.86218 L 350,127.36218 L 362.5,139.86218 L 337.5,139.86218 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="cccc"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 381.25,146.11218 L 387.5,139.86218 L 393.75,146.11218 L 381.25,146.11218 z"
+ id="path3188"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3208"
+ d="M 287.5,164.86218 L 318.75,133.61218 L 331.25,146.11218 L 350,127.36218 L 387.5,164.86218"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="ccc"
+ id="path3210"
+ d="M 375,152.36218 L 387.5,139.86218 L 400,152.36218"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 318.75,158.61218 L 331.25,146.11218"
+ id="path3212"
+ sodipodi:nodetypes="cc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ </g>
+</svg>
diff --git a/doc/src/diagrams/gestures/pinchgesture.svg b/doc/src/diagrams/gestures/pinchgesture.svg
new file mode 100644
index 0000000..1c520b9
--- /dev/null
+++ b/doc/src/diagrams/gestures/pinchgesture.svg
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="pinchgesture.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective2473"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3362"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3429"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3639"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="299.95763"
+ inkscape:cy="879.65793"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1184"
+ inkscape:window-height="668"
+ inkscape:window-x="223"
+ inkscape:window-y="324">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ units="pt"
+ spacingx="1pt"
+ spacingy="1pt" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3235"
+ width="275"
+ height="162.5"
+ x="137.5"
+ y="114.86218"
+ ry="25.253815"
+ rx="25.253815"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <rect
+ ry="0"
+ rx="0"
+ y="127.36218"
+ x="168.75"
+ height="81.25"
+ width="212.5"
+ id="rect3839"
+ style="opacity:1;fill:#4040a0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 168.75,158.61218 C 200,164.86218 243.75,164.86218 275,171.11218 C 293.75,164.86218 356.25,158.61218 381.25,158.61218 L 381.25,208.61218 L 256.25,208.61218 L 168.75,208.61218 L 168.75,158.61218 z"
+ id="path3845"
+ sodipodi:nodetypes="ccccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <rect
+ style="opacity:1;fill:#404060;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3328"
+ width="75"
+ height="56.25"
+ x="237.5"
+ y="139.86218"
+ rx="0"
+ ry="0"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#2f4f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 312.5,164.86218 C 306.25,158.61218 281.25,171.11218 262.5,164.86218 C 247.30507,158.35772 243.75,164.86218 237.5,171.11218 L 237.5,196.11218 L 312.5,196.11218 L 312.5,164.86218 z"
+ id="path3841"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:0.12437811;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3167"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(118.75,0)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:0;fill-rule:evenodd;stroke:#c90000;stroke-width:2.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3169"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(225.5176,19.302421)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ transform="translate(50,-6.25)"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ sodipodi:ry="12.5"
+ sodipodi:rx="12.5"
+ sodipodi:cy="164.86218"
+ sodipodi:cx="137.5"
+ id="path3649"
+ style="opacity:1;fill:#ffffff;fill-opacity:0;fill-rule:evenodd;stroke:#c90000;stroke-width:2.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <g
+ id="g3641"
+ inkscape:label="Layer 1"
+ transform="matrix(-0.75,0,0,0.75,585.42164,37.937193)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72">
+ <g
+ id="g3643">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccc"
+ id="path3645"
+ d="M 497.22886,219.23332 C 499.98338,212.79698 515.74295,224.65256 525,227.36218 L 525,164.86218 C 525,152.36218 537.5,152.36218 537.5,164.86218 L 537.5,208.61218 L 537.5,189.86218 C 537.5,183.61218 550,183.61218 550,189.86218 L 550,208.61218 L 550,196.11218 C 550,189.86218 562.5,189.86218 562.5,196.11218 L 562.5,214.86218 L 562.5,202.36218 C 562.5,196.11218 575,196.11218 575,202.36218 L 575,264.86218 C 562.5,271.11218 537.5,271.11218 525,264.86218 L 525,246.11218 C 517.00744,236.2443 493.75,227.36218 497.22886,219.23332 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3647"
+ d="M 535.83948,168.05221 C 535.83948,163.26959 535.83948,158.48698 531.25,158.48698 C 526.66052,158.48698 526.66052,163.26959 526.66052,168.05221 C 526.66052,172.83482 535.83948,172.83482 535.83948,168.05221 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.625, 5.625;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 187.5,158.61218 L 256.25,164.86218"
+ sodipodi:nodetypes="cc"
+ id="path12"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ transform="translate(156.25,6.25)"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ sodipodi:ry="12.5"
+ sodipodi:rx="12.5"
+ sodipodi:cy="164.86218"
+ sodipodi:cx="137.5"
+ id="path3659"
+ style="opacity:1;fill:#ffffff;fill-opacity:0.12437811;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000000000000000;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ inkscape:export-ydpi="72"
+ inkscape:export-xdpi="72"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ id="path3661"
+ sodipodi:nodetypes="cc"
+ d="M 293.75,171.11218 L 362.5,183.61218"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.625, 5.625;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ id="g3431"
+ inkscape:label="Layer 1"
+ transform="matrix(0.7386058,0.1302361,-0.1302361,0.7386058,-8.1572814,-2.6927947)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72">
+ <g
+ id="g3210">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccc"
+ id="path3191"
+ d="M 497.22886,219.23332 C 499.98338,212.79698 515.74295,224.65256 525,227.36218 L 525,164.86218 C 525,152.36218 537.5,152.36218 537.5,164.86218 L 537.5,208.61218 L 537.5,189.86218 C 537.5,183.61218 550,183.61218 550,189.86218 L 550,208.61218 L 550,196.11218 C 550,189.86218 562.5,189.86218 562.5,196.11218 L 562.5,214.86218 L 562.5,202.36218 C 562.5,196.11218 575,196.11218 575,202.36218 L 575,264.86218 C 562.5,271.11218 537.5,271.11218 525,264.86218 L 525,246.11218 C 517.00744,236.2443 493.75,227.36218 497.22886,219.23332 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3197"
+ d="M 535.83948,168.05221 C 535.83948,163.26959 535.83948,158.48698 531.25,158.48698 C 526.66052,158.48698 526.66052,163.26959 526.66052,168.05221 C 526.66052,172.83482 535.83948,172.83482 535.83948,168.05221 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 312.5,171.11218 L 356.25,171.11218"
+ id="path3847"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#c44060;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 362.5,171.11218 L 362.5,139.86218 L 312.5,139.86218 L 312.5,171.11218 L 362.5,171.11218 z"
+ id="path3849"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 368.75,139.86218 L 356.25,127.36218 L 318.75,127.36218 L 306.25,139.86218 L 368.75,139.86218 z"
+ id="path3853"
+ sodipodi:nodetypes="ccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3855"
+ d="M 331.25,158.61218 L 331.25,146.11218 L 318.75,146.11218 L 318.75,158.61218 L 331.25,158.61218 z"
+ style="fill:#5b77ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#c0cb54;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 356.25,171.11218 L 356.25,146.11218 L 343.75,146.11218 L 343.75,171.11218 L 356.25,171.11218 z"
+ id="path3857"
+ sodipodi:nodetypes="ccccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ id="path3868"
+ d="M 282.8125,167.98719 L 293.75,167.98719"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.25px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3870"
+ d="M 295.3125,167.98719 L 295.3125,160.17469 L 282.8125,160.17469 L 282.8125,167.98719 L 295.3125,167.98719 z"
+ style="fill:#681e2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.25000000000000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3872"
+ d="M 296.875,160.17469 L 293.75,157.04969 L 284.375,157.04969 L 281.25,160.17469 L 296.875,160.17469 z"
+ style="fill:#6e6c6c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.25000000000000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:#2f3e85;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.31250000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 287.5,164.86219 L 287.5,161.73719 L 284.375,161.73719 L 284.375,164.86219 L 287.5,164.86219 z"
+ id="path3874"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3876"
+ d="M 293.75,167.98719 L 293.75,161.73719 L 290.625,161.73719 L 290.625,167.98719 L 293.75,167.98719 z"
+ style="fill:#65692a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.31250000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pinchgesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ </g>
+</svg>
diff --git a/doc/src/diagrams/gestures/swipegesture-details.svg b/doc/src/diagrams/gestures/swipegesture-details.svg
new file mode 100644
index 0000000..0f7de5b
--- /dev/null
+++ b/doc/src/diagrams/gestures/swipegesture-details.svg
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="swipegesture-details.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective2473"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3362"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3429"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="321.9787"
+ inkscape:cy="855.02875"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1184"
+ inkscape:window-height="668"
+ inkscape:window-x="152"
+ inkscape:window-y="228">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ units="pt"
+ spacingx="1pt"
+ spacingy="1pt" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3235"
+ width="275"
+ height="162.5"
+ x="137.5"
+ y="114.86218"
+ ry="25.253815"
+ rx="25.253815"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3167"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(43.75,-25)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#c90000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3169"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(218.75,18.75)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.625, 5.625;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 181.25,139.86218 L 356.25,183.61218"
+ sodipodi:nodetypes="cc"
+ id="path12"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <g
+ id="g3431"
+ inkscape:label="Layer 1"
+ transform="matrix(0.7386058,0.1302361,-0.1302361,0.7386058,-15.203718,-5.6523172)">
+ <g
+ id="g3210">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccc"
+ id="path3191"
+ d="M 497.22886,219.23332 C 499.98338,212.79698 515.74295,224.65256 525,227.36218 L 525,164.86218 C 525,152.36218 537.5,152.36218 537.5,164.86218 L 537.5,208.61218 L 537.5,189.86218 C 537.5,183.61218 550,183.61218 550,189.86218 L 550,208.61218 L 550,196.11218 C 550,189.86218 562.5,189.86218 562.5,196.11218 L 562.5,214.86218 L 562.5,202.36218 C 562.5,196.11218 575,196.11218 575,202.36218 L 575,264.86218 C 562.5,271.11218 537.5,271.11218 525,264.86218 L 525,246.11218 C 517.00744,236.2443 493.75,227.36218 497.22886,219.23332 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3197"
+ d="M 535.83948,168.05221 C 535.83948,163.26959 535.83948,158.48698 531.25,158.48698 C 526.66052,158.48698 526.66052,163.26959 526.66052,168.05221 C 526.66052,172.83482 535.83948,172.83482 535.83948,168.05221 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 181.25,139.86218 L 356.25,139.86218"
+ id="path3436"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 287.5,139.86218 C 287.5,146.11218 287.5,158.61218 281.25,164.86218"
+ id="path3438"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/doc/src/diagrams/gestures/swipegesture.svg b/doc/src/diagrams/gestures/swipegesture.svg
new file mode 100644
index 0000000..fc60a4d
--- /dev/null
+++ b/doc/src/diagrams/gestures/swipegesture.svg
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="swipegesture.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ <inkscape:perspective
+ id="perspective2473"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3362"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3429"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="321.9787"
+ inkscape:cy="855.02875"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1184"
+ inkscape:window-height="668"
+ inkscape:window-x="152"
+ inkscape:window-y="228">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ units="pt"
+ spacingx="1pt"
+ spacingy="1pt" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3235"
+ width="275"
+ height="162.5"
+ x="137.5"
+ y="114.86218"
+ ry="25.253815"
+ rx="25.253815"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3167"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(43.75,-25)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#c90000;stroke-width:2.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3169"
+ sodipodi:cx="137.5"
+ sodipodi:cy="164.86218"
+ sodipodi:rx="12.5"
+ sodipodi:ry="12.5"
+ d="M 150,164.86218 A 12.5,12.5 0 1 1 125,164.86218 A 12.5,12.5 0 1 1 150,164.86218 z"
+ transform="translate(218.75,18.75)"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.625, 5.625;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 181.25,139.86218 L 356.25,183.61218"
+ sodipodi:nodetypes="cc"
+ id="path12"
+ inkscape:export-filename="/home/dboddie/git/qt/doc/src/images/pangesture.png"
+ inkscape:export-xdpi="72"
+ inkscape:export-ydpi="72" />
+ <g
+ id="g3431"
+ inkscape:label="Layer 1"
+ transform="matrix(0.7386058,0.1302361,-0.1302361,0.7386058,-15.203718,-5.6523172)">
+ <g
+ id="g3210">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccc"
+ id="path3191"
+ d="M 497.22886,219.23332 C 499.98338,212.79698 515.74295,224.65256 525,227.36218 L 525,164.86218 C 525,152.36218 537.5,152.36218 537.5,164.86218 L 537.5,208.61218 L 537.5,189.86218 C 537.5,183.61218 550,183.61218 550,189.86218 L 550,208.61218 L 550,196.11218 C 550,189.86218 562.5,189.86218 562.5,196.11218 L 562.5,214.86218 L 562.5,202.36218 C 562.5,196.11218 575,196.11218 575,202.36218 L 575,264.86218 C 562.5,271.11218 537.5,271.11218 525,264.86218 L 525,246.11218 C 517.00744,236.2443 493.75,227.36218 497.22886,219.23332 z"
+ style="fill:#e0e0e0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3197"
+ d="M 535.83948,168.05221 C 535.83948,163.26959 535.83948,158.48698 531.25,158.48698 C 526.66052,158.48698 526.66052,163.26959 526.66052,168.05221 C 526.66052,172.83482 535.83948,172.83482 535.83948,168.05221 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/doc/src/examples/ahigl.qdoc b/doc/src/examples/ahigl.qdoc
deleted file mode 100644
index c5e2387..0000000
--- a/doc/src/examples/ahigl.qdoc
+++ /dev/null
@@ -1,572 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qws/ahigl
- \title OpenGL for Embedded Systems Example
-
- \section1 Introduction
-
- This example demonstrates how you can use OpenGL for Embedded
- Systems (ES) in your own screen driver and \l{add your graphics
- driver to Qt for Embedded Linux}. In \l{Qt for Embedded Linux},
- painting is done in software, normally performed in two steps:
- First, each client renders its windows onto its window surface in
- memory using a paint engine. Then the server uses the screen
- driver to compose the window surface images and copy the
- composition to the screen. (See the \l{Qt for Embedded Linux
- Architecture} documentation for details.)
-
- This example is not for the novice. It assumes the reader is
- familiar with both OpenGL and the screen driver framework
- demonstrated in the \l {Accelerated Graphics Driver Example}.
-
- An OpenGL screen driver for Qt for Embedded Linux can use OpenGL ES
- in three ways. First, the \l{QWSServer}{Qt for Embedded Linux server}
- can use the driver to compose multiple window images and then show the
- composition on the screen. Second, clients can use the driver to
- accelerate OpenGL painting operations using the QOpenGLPaintEngine
- class. Finally, clients can use the driver to do OpenGL operations
- with instances of the QGLWidget class. This example implements all
- three cases.
-
- The example uses an implementation of OpenGL ES from
- \l {http://ati.amd.com}{ATI} for the
- \l {http://ati.amd.com/products/imageon238x/}{Imageon 2380}. The
- OpenGL include files gl.h and egl.h must be installed to compile
- the example, and the OpenGL and EGL libraries must be installed
- for linking. If your target device is different, you must install
- the include files and libraries for that device, and you also
- might need to modify the example source code, if any API signatures
- in your EGL library differ from the ones used here.
-
- After compiling and linking the example source, install the
- screen driver plugin with the command \c {make install}. To
- start an application that uses the plugin, you can either set the
- environment variable \l QWS_DISPLAY and then start the
- application, or just start the application with the \c -display
- switch, as follows:
-
- \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 0
-
- The example driver also implements an animated transition effect
- for use when showing new windows or reshowing windows that have
- been minimized. To enable this transition effect, run the
- application with \c {-display ahigl:effects}.
-
- \section1 The Class Definitions
-
- The example comprises three main classes plus some helper classes.
- The three main classes are the plugin (QAhiGLScreenPlugin), which
- is defined in qscreenahiglplugin.cpp, the screen driver
- (QAhiGLScreen), which is defined in qscreenahigl_qws.h, and the
- window surface (QAhiGLWindowSurface), which is defined in
- qwindowsurface_ahigl_p.h. The "Ahi" prefix in these class names
- stands for \e {ATI Handheld Interface}. The example was written
- for the ATI Imageon 2380, but it can also be used as a template
- for other ATI handheld devices.
-
- \section2 The Plugin Class Definition
-
- The screen driver plugin is class QAhiGLScreenPlugin.
-
- \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 0
-
- QAhiGLScreenPlugin is derived from class QScreenDriverPlugin,
- which in turn is derived from QObject.
-
- \section2 The Screen Driver Class Definitions
-
- The screen driver classes are the public class QAhiGLScreen and
- its private implementation class QAhiGLScreenPrivate. QAhiGLScreen
- is derived from QGLScreen, which is derived from QScreen. If your
- screen driver will only do window compositions and display them,
- then you can derive your screen driver class directly from
- QScreen. But if your screen driver will do accelerated graphics
- rendering operations with the QOpenGLPaintEngine, or if it will
- handle instances of class QGLWidget, then you must derive your
- screen driver class from QGLScreen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.h 0
-
- All functions in the public API of class QAhiGLScreen are virtual
- functions declared in its base classes. hasOpenGL() is declared in
- QGLScreen. It simply returns true indicating our example screen
- driver does support OpenGL operations. The other functions in the
- public API are declared in QScreen. They are called by the
- \l{QWSServer}{Qt for Embedded Linux server} at the appropriate times.
-
- Note that class QScreen is a documented class but class QGLScreen
- is not. This is because the design of class QGLScreen is not yet
- final.
-
- The only data member in class QAhiGLScreen is a standard d_ptr,
- which points to an instance of the driver's private implementation
- class QAhiGLScreenPrivate. The driver's internal state is stored
- in the private class. Using the so-called d-pointer pattern allows
- you to make changes to the driver's internal design without
- breaking binary compatibility.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 0
-
- Class QAhiGLScreenPrivate is derived from QObject so that it can
- use the Qt signal/slot mechanism. QAhiGLScreen is not a QObject,
- so it can't use the signal/slot mechanism. Signals meant for our
- screen driver are received by slots in the private implementation
- class, in this case, windowEvent() and redrawScreen().
-
- \section2 The Window Surface Class Definitions
-
- The window surface classes are QAhiGLWindowSurface and its private
- implementation class QAhiGLWindowSurfacePrivate. We create class
- QAhiGLWindowSurface so the screen driver can use the OpenGL paint
- engine and the OpenGL widget, classes QOpenGLPaintEngine and
- QGLWidget. QAhiGLWindowSurface is derived from the more general
- OpenGL window surface class, QWSGLWindowSurface, which is derived
- from QWSWindowSurface.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl_p.h 0
-
- In addition to implementing the standard functionality required by
- any new subclass of QWSWindowSurface, QAhiGLWindowSurface also
- contains the textureId() function used by QAhiGLScreen.
-
- The same d-pointer pattern is used in this window surface class.
- The private implementation class is QAhiGLWindowSurfacePrivate. It
- allows making changes to the state variables of the window surface
- without breaking binary compatibility.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 0
-
- In this case, our private implementation class has no member
- functions except for its constructor. It contains only public data
- members which hold state information for the window surface.
-
- \section2 The Helper Classes
-
- The example screen driver maintains a static \l {QMap} {map} of
- all the \l {QWSWindow} {windows} it is showing on the screen.
- Each window is mapped to an instance of struct WindowInfo.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 2
-
- As each new window is created, an instance of struct WindowInfo is
- allocated and inserted into the window map. WindowInfo uses a
- GLuint to identify the OpenGL texture it creates for the window.
- Note that the example driver, in addition to drawing windows using
- OpenGL, also supports drawing windows in the normal way without
- OpenGL, but it uses an OpenGL texture for the rendering operations
- in either case. Top-level windows that are drawn without OpenGL
- are first rendered in the normal way into a shared memory segment,
- which is then converted to a OpenGL texture and drawn to the
- screen.
-
- To animate the window transition effect, WindowInfo uses an
- instance of the helper class ShowAnimation. The animation is
- created by the windowEvent() slot in QAhiGLScreenPrivate, whenever
- a \l {QWSServer::WindowEvent} {Show} window event is emitted by
- the \l {QWSServer} {window server}. The server emits this signal
- when a window is shown the first time and again later, when the
- window is reshown after having been minimized.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 1
-
- Class ShowAnimation is derived from the QTimeLine class, which is
- used for controlling animations. QTimeLine is a QObject, so
- ShowAnimation can use the Qt signal/slot mechanism. We will see
- how the timeline's \l {QTimeLine::valueChanged()} {valueChanged()}
- and \l {QTimeLine::finished()} {finished()} signals are used to
- control the animation and then destroy the instance of
- ShowAnimation, when the animation ends. The ShowAnimation
- constructor needs the pointer to the screen driver's private
- implementation class so it can set up these signal/slot
- connections.
-
- \section1 The Class Implementations
-
- \section2 The Plugin Class Implementation
-
- QAhiGLScreenPlugin is a straightforward derivation of
- QScreenDriverPlugin. It reimplements \l{QScreenDriverPlugin::}{keys()}
- and \l{QScreenDriverPlugin::}{create()}. They are
- called as needed by the \l{QWSServer}{Qt for Embedded Linux server.}
- Recall that the server detects that the ahigl screen driver has
- been requested, either by including "ahigl" in the value for the
- environment variable QWS_DISPLAY, or by running your application
- with a command line like the following.
-
- \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 1
-
- The server calls \l {QScreenDriverPlugin::} {keys()}, which
- returns a \l {QStringList} containing the singleton "ahigl"
- matching the requested screen driver and telling the server that
- it can use our example screen driver. The server then calls \l
- {QScreenDriverPlugin::} {create()}, which creates the instance of
- QAhiGLScreen.
-
- \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 1
-
- In the code snippet above, the macro Q_EXPORT_PLUGIN2 is used to export
- the plugin class, QAhiGLScreen, for the qahiglscreen plugin.
- Further information regarding plugins and how to create them
- can be found at \l{How to Create Qt Plugins}.
-
- \section2 The Screen Driver Class Implementations
-
- The plugin creates the singleton instance of QAhiGLScreen. The
- constructor is passed a \c displayId, which is used in the base
- class QGLScreen to identify the server that the screen driver is
- connected to. The constructor also creates its instance of
- QAhiGLScreenPrivate, which instantiates a QTimer. The timeout()
- signal of this timer is connected to the redrawScreen() slot so
- the timer can be used to limit the frequency of actual drawing
- operations in the hardware.
-
- The public API of class QAhiGLScreen consists of implementations
- of virtual functions declared in its base classes. The function
- hasOpenGL() is declared in base class QGLScreen. The others are
- declared in base class QScreen.
-
- The \l {QScreen::}{connect()} function is the first one called by
- the server after the screen driver is constructed. It initializes
- the QScreen data members to hardcoded values that describe the ATI
- screen. A better implementation would query the hardware for the
- corresponding values in its current state and use those. It asks
- whether the screen driver was started with the \c effects option
- and sets the \c doEffects flag accordingly.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 7
-
- The \l {QScreen::}{initDevice()} function is called by the server
- after \l {QScreen::}{connect()}. It uses EGL library functions to
- initialize the ATI hardware. Note that some data structures used
- in this example are specific to the EGL implementation used, e.g.,
- the DummyScreen structure.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 8
-
- Note the signal/slot connection at the bottom of initDevice(). We
- connect the server's QWSServer::windowEvent() signal to the
- windowEvent() slot in the screen driver's private implementation
- class. The windowEvent() slot handles three window events,
- QWSServer::Create, QWSServer::Destroy, and QWSServer::Show.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 5
-
- The function manages instances of the helper classes associated
- with each window. When a QWSServer::Create event occurs, it means
- a new top-level \l {QWSWindow} {window} has been created. In this
- case, an instance of helper class WindowInfo is created and
- inserted into the window map with the pointer to the new \l
- {QWSWindow} {window} as its key. When a QWSServer::Destroy event
- occurs, a window is being destroyed, and its mapping is removed
- from the window map. These two events are straightforward. The
- tricky bits happen when a QWSServer::Show event occurs. This case
- occurs when a window is shown for the first time and when it is
- reshown after having been minimized. If the window transition
- effect has been enabled, a new instance of the helper class
- ShowAnimation is created and stored in a QPointer in the window's
- instance of WindowInfo. The constructor of ShowAnimation
- automatically \l {QTimeLine::start()} {starts} the animation of
- the transition effect.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 3
-
- To ensure that a ShowAnimation is not deleted until its animation
- ends, the \l {QTimeLine::finished()} {finished()} signal is
- connected to the \l {QObject::deleteLater()} {deleteLater()} slot.
- When the animation ends, the finished() signal is emitted and the
- deleteLater() slot deletes the ShowAnimation. The key here is that
- the pointer to the ShowAnimation is stored in a QPointer in the
- WindowInfo class. This QPointer will also be notified when the
- ShowAnimation is deleted, so the QPointer in WindowInfo can null
- itself out, if and only if it is still pointing to the instance
- of ShowAnimation being deleted.
-
- The \l {QTimeLine::valueForTime()} {valueForTime()} function in
- QTimeLine is reimplemented in ShowAnimation to return time values
- that represent a curved path for the window transition effect.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 4
-
- valueForTime() is called internally, when the time interval it
- computed during the previous call has elapsed. If it computes a
- next time value that is different from the one computed
- previously, the \l {QTimeLine::valueChanged()} {valueChanged()}
- signal is emitted. The ShowAnimation constructor shown above
- connects this signal to the redrawScreen() slot in the screen
- driver's private implementation class. This is how the animation
- actually happens.
-
- The screen driver's implementation of \l {QScreen::}
- {exposeRegion()} is where the main work of the screen driver is
- meant to be done, i.e., updating the screen. It is called by the
- \l {QWSServer} {window system} to update a particular window's
- region of the screen. But note that it doesn't actually update the
- screen, i.e., it doesn't actually call redrawScreen() directly,
- but starts the updateTimer, which causes redrawScreen() to be
- called once for each updateTimer interval. This means that all
- calls to exposeRegion() during an updateTimer interval are handled
- by a single call to redrawScreen(). Thus updateTimer can be used
- to limit the frequency of screen updates.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 13
-
- The call to the private function invalidateTexture() destroys
- the window's existing texture (image). This ensures that a new
- texture will be created for the window, when redrawScreen() is
- eventually called.
-
- But there is a caveat to using updateTimer to limit the frequency
- of screen updates. When the driver's animated transition effect
- for new windows is enabled and a new window is being shown for the
- first time or reshown after having been minimized, an instance of
- ShowAnimation is created to run the animation. The valueChanged()
- signal of this ShowAnimation is also connected to the
- redrawScreen() slot, and QTimeLine, the base class of our
- ShowAnimation, uses its own, internal timer to limit the speed of
- the animation. This means that in the driver as currently written,
- if the window transition effect is enabled (i.e. if the plugin is
- started, with \c {-display ahigl:effects}), then redrawScreen()
- can be called both when the update timer times out and when the
- ShowAnimation timer times out, so the screen might get updated
- more often than the frequency established by the update timer.
- This may or may not be a bug, depending on your own hardware, if
- you use this example as a template for your own OpenGL driver.
-
- The screen driver's private function redrawScreen() constructs
- the window compositions. It is called only by the function of the
- same name in the screen driver's private implementation class.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 6
-
- Recall that this redrawScreen() in the private implementation
- class is a slot function connected to two signals, the \c
- timeout() signal of the updateTimer in the private implementation
- class, and the valueChanged() signal of the helper class
- ShowAnimation. Thus, the screen is only ever updated when a
- timeout of one of the two timers occurs. This is important for two
- reasons. First, the screen is meant to be updated no more than
- once per updateTimer interval. Second, however, if the animated
- window transition effect is requested, the screen might be updated
- more often than that, and this might be a bug if the hardware
- can't handle more frequent updates.
-
- The redrawScreen() in QAhiGLScreen begins by using standard
- OpenGL to fill the screen with the background color.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 10
-
- Next it iterates over the list of all \l {QWSWindow} {client
- windows} obtained from the \l {QWSServer} {server}, extracting
- from each window its instance of QWSWIndowSurface, then using that
- window surface to create an OpenGL texture, and finally calling
- the helper function drawWindow() to draw the texture on the
- screen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 11
-
- Note the call to glBindTexture() immediately before the call to
- drawWindow(). This call binds the identifer \c GL_TEXTURE_2D to
- the texture we have just created. This makes our texture
- accessible to functions in the OpenGL libraries. If you miss that
- point, digging into the internals of drawWindow() won't make much
- sense.
-
- Finally, the cursor is added to the window composition, and in the
- last statement, the whole thing is displayed on the screen.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 12
-
- The call to \c drawWindow(win,progress), in addition to passing a
- pointer to the window to be redrawn, also passes the \c progress
- parameter obtained by calling \l {QTimeLine::currentValue()} on
- the window's instance of ShowAnimation. Recall that the current
- value of the timeline is updated internally by a timer local to
- the timeline, and the redrawScreen() slot is called whenever the
- current value changes. The progress value will only be used if
- the animated transition effect has been enabled. These extra calls
- of redrawScreen() may cause the screen to be updated more often
- than the rate determined by updateTimer. This must be taken
- into account, if you set your updateTimer to timeout at the
- maximum screen update frequency your hardware can handle.
-
- The drawWindow() function is not shown here and not explained
- further, but the call to drawWindow() is the entry point to a
- hierarchy of private helper functions that execute sequences of
- OpenGL and EGL library calls. The reader is assumed to be familiar
- enough with the OpenGL and EGL APIs to understand the code in
- these helper functions on his own. Besides drawWindow(), the list
- of these helper functions includes drawQuad(), drawQuadWavyFlag(),
- the two overloadings of drawQuad_helper() (used by drawQuad() and
- drawQuadWacyFlag()), and setRectCoords().
-
- Note the two different ways the window's texture can be created in
- redrawScreen(). If the window surface is an OpenGL window surface
- (QAhiGLWindowSurface described below), the texture is obtained
- from the window surface directly by calling its textureId()
- function. But when the window surface is not an OpenGL one, the
- static function createTexture() is called with the window
- surface's \l {QImage} {image} to copy that image into an OpenGL
- texture. This is done with the EGL functions glTexImage2D() and
- glTexSubImage2D(). createTexture() is another function that
- should be understandable for exsperienced OpenGL users, so it is
- not shown or explained further here.
-
- The two implementations of \l {QScreen::}{createSurface()} are for
- instantiating new window surfaces. The overloading with the widget
- parameter is called in the client.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 14
-
- If the parameter is an \l {QGLWidget} {OpenGL widget}, or, when it
- isn't an OpenGL widget but its size is no bigger than 256 x 256,
- we instantiate our subclass QAhiGLWindowSurface. Otherwise, we
- instantiate a QWSWindowSurface. The size contraint is a
- limitation of the OpenGL ES libraries we are using for our ATI
- device.
-
- Note the test at the top of the function asking if our application
- process is the \l {QApplication::GuiServer} {server}. We only
- create instances of QAhiGLWindowSurface if our client is in the
- server process. This is because of an implementation restriction
- required by the OpenGL library used in the example. They only
- support use of OpenGL in the server process. Hence a client can
- use the QAhiGLWindowSurface if the client is in the server
- process.
-
- The other overloading of createSurface() is called by the
- server to create a window surface that will hold a copy of a
- client side window surface.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 15
-
- This overloading accepts a QString parameter identifying the type
- of window surface to instantiate. QAhiGLWindowSurface is
- instantiated if the parameter is \c ahigl. Otherwise, a normal
- QWSWindowSurface is instantiated. The client's window surface
- communicates its image data to the server's window surface through
- shared memory.
-
- The implementation of \l {QScreen::}{setMode()}, is a stub in this
- example. It would normally reset the frame buffer's resolution.
- Its parameters are the \e width, \e height, and the bit \e depth
- for the frame buffer's new resolution. If you implement setMode()
- in your screen driver, remember that it must emit a signal to warn
- other applications to redraw their frame buffers with the new
- resolution. There is no significance to setMode() not being
- implemented in this example. It simply wasn't implemented.
- However, the stub had to be included because QScreen declares
- setMode() to be pure virtual.
-
- Before the application exits, the server will call \l {QScreen::}
- {shutdownDevice()} to release the hardware resources. This is also
- done using EGL library functions.
-
- \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 9
-
- The server will also call \l {QScreen::}{disconnect()}, but this
- function is only a stub in this example.
-
- \section2 The window Surface Class Implementations
-
- QAhiGLScreen creates instances of QAhiGLWindowSurface in its two
- createSurface() functions, and there are two constructors for
- QAhiGLWindowSurface that correspond to these two versions of
- createSurface(). The constructor accepting a \l {QWidget} {widget}
- parameter is called by the client side version of createSurface(),
- and the constructor without the \l {QWidget} {widget} parameter is
- called by the server side version. There will be a window surface
- constructed on the server side for each one constructed on the
- client side.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 1
- \codeline
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 2
-
- The constructors create an instance of QAhiGLWindowSurfacePrivate,
- the private implementation class, which contains all the state
- variables for QAhiGLWindowSurface. The client side constructor
- also creates an instance of QWSGLPaintDevice, the OpenGL paint
- device, for return by \l {QWSWindowSurface::} {paintDevice()}.
- This ensures that all \l {QPainter}s used on this surface will use
- an OpenGL enabled QPaintEngine. It is a bit of jiggery pokery,
- which is required because \l {QWSWindowSurface::} {paintDevice()}
- is declared pure virtual. Normally, the client side constructor
- will be called with an \l {QGLWidget}{OpenGL widget}, which has
- its own \l {QWidget::} {paintEngine()} function that returns the
- global static OpenGL paint engine, but because the constructor
- also accepts a normal \l {QWidget}{widget}, it must be able to
- find the OpenGL paint engine in that case as well, so since \l
- {QWSWindowSurface::} {paintDevice()} must be implemented anyway,
- the constructor creates an instance of QWSGLPaintDevice, which can
- always return the global static pointer to QOpenGLPaintEngine.
-
- The OpenGL library implementation used for this example only
- supports one OpenGL context. This context is therefore shared
- among the single instance of QAhiGLScreen and all instances of
- QAhiGLWindowSurface. It is passed to both constructors.
-
- This example uses the OpenGL frame buffer object extension, which
- allows for accelerating OpenGL painting operations. Using this
- OpenGL extension, painting operations are performed in a frame
- buffer object, which QAhiGLScreen later uses to construct window
- compositions on the screen. Allocation of the frame buffer object
- is performed in \l {QWindowSurface::} {setGeometry()}. A safer way
- to use this extension would be to first test to see if the
- extension is supported by your OpenGL library, and use a different
- approach if it is not.
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 3
-
- Since there can be several instances of the QAhiGLWindowSurface, we need
- to make sure that the correct framebuffer object is active before painting.
- This is done by reimplementing \l QWindowSurface::beginPaint():
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 4
-
- Finally we need to make sure that whenever a widget grows beyond the size
- supported by this driver (256 x 256), the surface is deleted and a new
- standard surface is created instead. This is handled by reimplementing
- \l QWSWindowSurface::isValid():
-
- \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 5
-*/
diff --git a/doc/src/examples/audiodevices.qdoc b/doc/src/examples/audiodevices.qdoc
index 0d0932e..1505846 100644
--- a/doc/src/examples/audiodevices.qdoc
+++ b/doc/src/examples/audiodevices.qdoc
@@ -40,7 +40,7 @@
****************************************************************************/
/*!
- \example multimedia/audio/audiodevices
+ \example multimedia/audiodevices
\title Audio Devices Example
The Audio Devices example demonstrates the basic use of QAudioDeviceInfo class
diff --git a/doc/src/examples/audioinput.qdoc b/doc/src/examples/audioinput.qdoc
index ac44d75..8553e92 100644
--- a/doc/src/examples/audioinput.qdoc
+++ b/doc/src/examples/audioinput.qdoc
@@ -40,7 +40,7 @@
****************************************************************************/
/*!
- \example multimedia/audio/audioinput
+ \example multimedia/audioinput
\title AudioInput Example
The Audio Input example demonstrates the basic use of QAudioInput class
diff --git a/doc/src/examples/audiooutput.qdoc b/doc/src/examples/audiooutput.qdoc
index 2ed6ce4..58b8ea9 100644
--- a/doc/src/examples/audiooutput.qdoc
+++ b/doc/src/examples/audiooutput.qdoc
@@ -40,7 +40,7 @@
****************************************************************************/
/*!
- \example multimedia/audio/audiooutput
+ \example multimedia/audiooutput
\title Audio Output Example
The Audio Output example demonstrates the basic use of the QAudioOutput class
diff --git a/doc/src/examples/videographicsitem.qdoc b/doc/src/examples/videographicsitem.qdoc
index ce24f09..e1cb6ed 100644
--- a/doc/src/examples/videographicsitem.qdoc
+++ b/doc/src/examples/videographicsitem.qdoc
@@ -40,7 +40,7 @@
****************************************************************************/
/*!
- \example video/videographicsitem
+ \example multimedia/videographicsitem
\title Video Graphics Item Example
The Video Graphics Item example shows how to implement a QGraphicsItem that displays video on a
diff --git a/doc/src/examples/videowidget.qdoc b/doc/src/examples/videowidget.qdoc
index 1b214d2..4223c1f 100644
--- a/doc/src/examples/videowidget.qdoc
+++ b/doc/src/examples/videowidget.qdoc
@@ -40,7 +40,7 @@
****************************************************************************/
/*!
- \example video/videowidget
+ \example multimedia/videowidget
\title Video Widget Example
The Video Widget example shows how to implement a video widget using
@@ -50,7 +50,7 @@
\section1 VideoWidgetSurface Class Definition
- \snippet examples/video/videowidget/videowidgetsurface.h 0
+ \snippet examples/multimedia/videowidget/videowidgetsurface.h 0
The VideoWidgetSurface class inherits QAbstractVideoSurface and paints
video frames on a QWidget. This is a separate class to VideoWidget as both
@@ -62,7 +62,7 @@
\section1 VideoWidgetSurface Class Implementation
- \snippet examples/video/videowidget/videowidgetsurface.cpp 0
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 0
From the supportedPixelFormats() function we return a list of pixel formats
the surface can paint. The order of the list hints at which formats are
@@ -74,7 +74,7 @@
return any pixel formats if handleType is not
QAbstractVideoBuffer::NoHandle.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 1
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 1
In isFormatSupported() we test if the frame type of a surface format maps
to a valid QImage format, that the frame size is not empty, and the handle
@@ -85,7 +85,7 @@
that the size is not empty so a reimplementation wasn't strictly necessary
in this case.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 2
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 2
To start our surface we'll extract the image format and size from the
selected video format and save it for use in the paint() function. If the
@@ -94,7 +94,7 @@
by calling QAbstractVideoSurface::start(). Finally since the video size may
have changed we'll trigger an update of the widget, and video geometry.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 5
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 5
The updateVideoRect() function calculates the region within the widget the
video occupies. The \l {QVideoSurfaceFormat::sizeHint()}{size hint} of the
@@ -105,7 +105,7 @@
size in the center of the widget. Otherwise we shrink the size maintaining
the aspect ratio so that it does fit.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 4
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 4
We can't paint from outside a paint event, so when a new frame is received
in present() we save a reference to it and force an immediate repaint of
@@ -118,7 +118,7 @@
\l {QAbstractVideoSurface::UnsupportedFormatError}{UnsupportedFormatError}
on our surface and stop it immediately.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 6
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 6
The paint() function is called by the video widget to paint the current
video frame. Before we draw the frame first we'll check the format for
@@ -128,7 +128,7 @@
construct a new QImage from the current video frame, and draw it to the
the widget.
- \snippet examples/video/videowidget/videowidgetsurface.cpp 3
+ \snippet examples/multimedia/videowidget/videowidgetsurface.cpp 3
When the surface is stopped we need to release the current frame and
invalidate the video region. Then we confirm the surface has been
@@ -141,7 +141,7 @@
The VideoWidget class uses the VideoWidgetSurface class to implement a
video widget.
- \snippet examples/video/videowidget/videowidget.h 0
+ \snippet examples/multimedia/videowidget/videowidget.h 0
The VideoWidget QWidget implementation is minimal with just the sizeHint(),
paintEvent(), and resizeEvent() functions in addition to the constructor,
@@ -149,7 +149,7 @@
\section1 VideoWidget Class Implementation
- \snippet examples/video/videowidget/videowidget.cpp 0
+ \snippet examples/multimedia/videowidget/videowidget.cpp 0
In the VideoWidget constructor we set some flags to speed up re-paints a
little. Setting the Qt::WA_NoSystemBackground flag and disabling automatic
@@ -162,17 +162,17 @@
Finally we construct an instance of the VideoWidgetSurface class.
- \snippet examples/video/videowidget/videowidget.cpp 1
+ \snippet examples/multimedia/videowidget/videowidget.cpp 1
In the destructor we simply delete the VideoWidgetSurface instance.
- \snippet examples/video/videowidget/videowidget.cpp 2
+ \snippet examples/multimedia/videowidget/videowidget.cpp 2
We get the size hint for the widget from the video format of the surface
which is calculated from viewport and pixel aspect ratio of the video
format.
- \snippet examples/video/videowidget/videowidget.cpp 3
+ \snippet examples/multimedia/videowidget/videowidget.cpp 3
When the video widget receives a paint event we first check if the surface
is started, if not then we simply fill the widget with the background
@@ -180,7 +180,7 @@
by the paint region, before calling paint on the video surface to draw the
current frame.
- \snippet examples/video/videowidget/videowidget.cpp 4
+ \snippet examples/multimedia/videowidget/videowidget.cpp 4
The resizeEvent() function is reimplemented to trigger an update of the
video region when the widget is resized.
diff --git a/doc/src/frameworks-technologies/gestures.qdoc b/doc/src/frameworks-technologies/gestures.qdoc
index 158a273..a619fe8 100644
--- a/doc/src/frameworks-technologies/gestures.qdoc
+++ b/doc/src/frameworks-technologies/gestures.qdoc
@@ -41,10 +41,9 @@
/*!
\page gestures-overview.html
- \startpage index.html Qt Reference Documentation
-
\title Gestures Programming
\ingroup frameworks-technologies
+ \startpage index.html Qt Reference Documentation
\brief An overview of the Qt support for Gesture programming.
@@ -59,176 +58,116 @@
\section1 Overview
- QGesture is the central class in Qt's gesture framework, providing
- the API used by classes that represent specific gestures, such as
- QPanGesture, QPinchGesture, and QSwipeGesture. These standard
- classes are ready to use, and each exposes functions and
- properties that give gesture-specific information about the user's
- input. This is described in the \l{Using Standard Gestures With Widgets}
- section.
-
- QGesture is also designed to be subclassed and extended so that
- support for new gestures can be implemented by developers. Adding
- support for a new gesture involves implementing code to recognize
- the gesture from incoming events. This is described in the
+ QGesture is the central class in Qt's gesture framework, providing a container
+ for information about gestures performed by the user. QGesture exposes
+ properties that give general information that is common to all gestures, and
+ these can be extended to provide additional gesture-specific information.
+ Common panning, pinching and swiping gestures are represented by specialized
+ classes: QPanGesture, QPinchGesture and QSwipeGesture.
+
+ Developers can also implement new gestures by subclassing and extending the
+ QGestureRecognizer class. Adding support for a new gesture involves implementing
+ code to recognize the gesture from input events. This is described in the
\l{Creating Your Own Gesture Recognizer} section.
\section1 Using Standard Gestures with Widgets
- Gesture objects are applied directly to widgets and other controls that accept
- user input \mdash these are the \e{target objects}. When a gesture object is
- constructed, the target object is typically passed to the constructor, though
- it can also be passed as the argument to the \l{QGesture::}{setGestureTarget()}
- function.
+ Gestures can be enabled for instances of QWidget and QGraphicsObject subclasses.
+ An object that accepts gesture input is referred to as a \e{target object}.
+
+ To enable a gesture for a target object, call its QWidget::grabGesture() or
+ QGraphicsObject::grabGesture() function with an argument describing the
+ required gesture type. The standard types are defined by the Qt::GestureType
+ enum and include many commonly used gestures.
- \snippet examples/gestures/imageviewer/imagewidget.cpp construct swipe gesture
+ \snippet examples/gestures/imagegestures/imagewidget.cpp enable gestures
In the above code, the gesture is set up in the constructor of the target object
- itself, so the argument to the QSwipeGesture constructor is \e this.
+ itself.
+
+ When the user performs a gesture, QGestureEvent events will be delivered to the
+ target object, and these can be handled by reimplementing the QWidget::event()
+ handler function for widgets or QGraphicsItem::sceneEvent() for graphics objects.
- When the user performs a gesture, various signals may be emitted by the
- gesture object. To monitor the user's actions, you need to connect signals
- from the gesture object to slots in your code.
+ For convenience, the \l{Image Gestures Example} reimplements the general
+ \l{QWidget::}{event()} handler function and delegates gesture events to a
+ specialized gestureEvent() function:
- \snippet examples/gestures/imageviewer/imagewidget.cpp connect swipe gesture
+ \snippet examples/gestures/imagegestures/imagewidget.cpp event handler
- Here, the \l{QGesture::}{triggered()} signal is used to inform the application
- that a gesture was used. More precise monitoring of a gesture can be implemented
- by connecting its \l{QGesture::}{started()}, \l{QGesture::}{canceled()} and
- \l{QGesture::}{finished()} signals to slots.
+ The gesture events delivered to the target object can be examined individually
+ and dealt with appropriately:
- Responding to a signal is simply a matter of obtaining the gesture that sent
- it and examining the information it contains.
+ \snippet examples/gestures/imagegestures/imagewidget.cpp gesture event handler
- \snippet examples/gestures/imageviewer/imagewidget.cpp swipe slot start
+ Responding to a gesture is simply a matter of obtaining the QGesture object
+ delivered in the QGestureEvent sent to the target object and examining the
+ information it contains.
+
+ \snippet examples/gestures/imagegestures/imagewidget.cpp swipe function
Here, we examine the direction in which the user swiped the widget and modify
its contents accordingly.
- \section1 Using Standard Gestures with Graphics Items
-
- The approach used for applying gestures to widgets can also be used with
- graphics items. However, instead of passing a target object to the
- gesture object's constructor, you set a target graphics item with the
- \l{QGesture::}{setGraphicsItem()} function.
\section1 Creating Your Own Gesture Recognizer
- QGesture is a base class for a user defined gesture recognizer class. In
- order to implement the recognizer you will need to subclass the
- QGesture class and implement the pure virtual function
- \l{QGesture::}{filterEvent()} to filter out events that are not relevant
- to your gesture.
-
- Once you have implemented the \l{QGesture::}{filterEvent()} function to
- make your own recognizer you can process events. A sequence of events may,
- according to your own rules, represent a gesture. The events can be singly
- passed to the recognizer via the \l{QGesture::}{filterEvent()} function
- or as a stream of events by specifying a parent source of events. The events
- can be from any source and could result in any action as defined by the user.
- The source and action need not be graphical, though that would be the most
- likely scenario. To find how to connect a source of events to automatically
- feed into the recognizer see the QGesture documentation.
-
- Recognizers based on QGesture can emit any of the following signals to
- indicate their progress in recognizing user input:
-
- \list
- \o \l{QGesture::}{triggered()} is emitted when a gesture is recognized.
- \o \l{QGesture::}{started()} indicates that the gesture object has started
- to recognize user input.
- \o \l{QGesture::}{finished()} is emitted when the gesture object has
- recognized the user input as a gesture, and finished handling it.
- \o \l{QGesture::}{canceled()} indicates that the gesture was canceled,
- either by the user or by the application.
- \endlist
-
- These signals are emitted when the state changes with the call to
- \l{QGesture::}{updateState()}, more than one signal may
- be emitted when a change of state occurs. There are four GestureStates
-
- \table
- \header \o New State \o Description \o QGesture Actions on Entering this State
- \row \o Qt::NoGesture \o Initial value \o emit \l {QGesture::}{canceled()}
- \row \o Qt::GestureStarted \o A continuous gesture has started \o emit \l{QGesture::}{started()} and emit \l{QGesture::}{triggered()}
- \row \o Qt::GestureUpdated \o A gesture continues \o emit \l{QGesture::}{triggered()}
- \row \o Qt::GestureFinished \o A gesture has finished. \o emit \l{QGesture::}{finished()}
- \endtable
-
- \note \l{QGesture::started()}{started()} can be emitted if entering any
- state greater than NoGesture if NoGesture was the previous state. This
- means that your state machine does not need to explicitly use the
- Qt::GestureStarted state, you can simply proceed from NoGesture to
- Qt::GestureUpdated to emit a \l{QGesture::started()}{started()} signal
- and a \l{QGesture::triggered()}{triggered()} signal.
-
- You may use some or all of these states when implementing the pure
- virtual function \l{QGesture::filterEvent()}{filterEvent()}.
- \l{QGesture::filterEvent()}{filterEvent()} will usually implement a
- state machine using the GestureState enums, but the details of which
- states are used is up to the developer.
-
- You may also need to reimplement the virtual function \l{QGesture::reset()}{reset()}
- if internal data or objects need to be re-initialized. The function must
- conclude with a call to \l{QGesture::updateState()}{updateState()} to
- change the current state to Qt::NoGesture.
-
- \section1 The ImageViewer Example
-
- To illustrate how to use QGesture we will look at the ImageViewer
- example. This example uses QPanGesture, a standard gesture, and an
- implementation of TapAndHoldGesture. Note that TapAndHoldGesture is
- platform-dependent.
-
- \snippet doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp tapandhold-reset
-
- In ImageViewer we see that the ImageWidget class uses two gestures:
- \l QPanGesture and TapAndHoldGesture. The
- QPanGesture is a standard gesture which is part of Qt.
- TapAndHoldGesture is defined and implemented as part of the example.
- The ImageWidget listens for signals from the gestures, but is not
- interested in the \l{QGesture::started()}{started()} signal.
-
- \snippet doc/src/snippets/gestures/imageviewer/imagewidget.h imagewidget-slots
-
- TapAndHoldGesture uses QTouchEvent events and mouse events to detect
- start, update and end events that can be mapped onto the GestureState
- changes. The implementation in this case uses a timer as well. If the
- timeout event occurs a given number of times after the start of the gesture
- then the gesture is considered to have finished whether or not the
- appropriate touch or mouse event has occurred. Also if a large jump in
- the position of the event occurs, as calculated by the \l {QPoint::manhattanLength()}{manhattanLength()}
- call, then the gesture is canceled by calling \l{QGesture::reset()}{reset()}
- which tidies up and uses \l{QGesture::updateState()}{updateState()} to
- change state to NoGesture which will result in the \l{QGesture::canceled()}{canceled()}
- signal being emitted by the recognizer.
-
- ImageWidget handles the signals by connecting the slots to the signals,
- although \c canceled() is not connected here.
-
- \snippet doc/src/snippets/gestures/imageviewer/imagewidget.cpp imagewidget-connect
-
- These functions in turn will have to be aware of which gesture
- object was the source of the signal since we have more than one source
- per slot. This is easily done by using the QObject::sender() function
- as shown here
-
- \snippet doc/src/snippets/gestures/imageviewer/imagewidget.cpp imagewidget-triggered-1
-
- As \l{QGesture::triggered()}{triggered()} signals are handled by
- gestureTriggered() there may be position updates invoking calls to,
- for example, goNextImage(), this will cause a change in the image
- handling logic of ImageWidget and a call to updateImage() to display
- the changed state.
-
- Following the logic of how the QEvent is processed we can summmarize
- it as follows:
- \list
- \o filterEvent() becomes the event filter of the parent ImageWidget object
- for a QPanGesture object and a TapAndHoldGesture object.
- \o filterEvent() then calls updateState() to change states
- \o updateState() emits the appropriate signal(s) for the state change.
- \o The signals are caught by the defined slots in ImageWidget
- \o The widget logic changes and an update() results in a paint event.
- \endlist
+ Adding support for a new gesture involves creating and registering a new gesture
+ recognizer. Depending on the recognition process for the gesture, it may also
+ involve creating a new gesture object.
+
+ To create a new recognizer, you need to subclass QGestureRecognizer to create a
+ custom recognizer class. There is one virtual function that you must reimplement
+ and two others that can be reimplemented as required.
+
+ \section2 Filtering Input Events
+
+ The \l{QGestureRecognizer::}{filterEvent()} function must be reimplemented.
+ This function handles and filters the incoming input events for the target objects
+ and determines whether or not they correspond to the gesture the recognizer is
+ looking for.
+
+ Although the logic for gesture recognition is implemented in this function,
+ possibly using a state machine based on the Qt::GestureState enums, you can store
+ persistent information about the state of the recognition process in the QGesture
+ object supplied.
+
+ Your \l{QGestureRecognizer::}{filterEvent()} function must return a value of
+ Qt::GestureState that indicates the state of recognition for a given gesture and
+ target object. This determines whether or not a gesture event will be delivered
+ to a target object.
+
+ \section2 Custom Gestures
+
+ If you choose to represent a gesture by a custom QGesture subclass, you will need to
+ reimplement the \l{QGestureRecognizer::}{createGesture()} function to construct
+ instances of your gesture class instead of standard QGesture instances. Alternatively,
+ you may want to use standard QGesture instances, but add additional dynamic properties
+ to them to express specific details of the gesture you want to handle.
+
+ \section2 Resetting Gestures
+
+ If you use custom gesture objects that need to be reset or otherwise specially
+ handled when a gesture is canceled, you need to reimplement the
+ \l{QGestureRecognizer::}{reset()} function to perform these special tasks.
+
+ Note that QGesture objects are only created once for each combination of target object
+ and gesture type, and they are reused every time the user attempts to perform the
+ same gesture type on the target object. As a result, it can be useful to reimplement
+ the \l{QGestureRecognizer::}{reset()} function to clean up after each previous attempt
+ at recognizing a gesture.
+
+
+ \section1 Using a New Gesture Recognizer
+
+ To use a gesture recognizer, construct an instance of your QGestureRecognizer
+ subclass, and register it with the application with
+ QApplication::registerGestureRecognizer(). A recognizer for a given type of
+ gesture can be removed with QApplication::unregisterGestureRecognizer().
+
+
+ \section1 Further Reading
+
+ The \l{Image Gestures Example} shows how to enable gestures for a widget in
+ a simple image viewer application.
*/
diff --git a/doc/src/frameworks-technologies/model-view-programming.qdoc b/doc/src/frameworks-technologies/model-view-programming.qdoc
index bc884df..f0f20b4 100644
--- a/doc/src/frameworks-technologies/model-view-programming.qdoc
+++ b/doc/src/frameworks-technologies/model-view-programming.qdoc
@@ -215,8 +215,8 @@
\o QStringListModel is used to store a simple list of QString items.
\o QStandardItemModel manages more complex tree structures of items, each
of which can contain arbitrary data.
- \o QDirModel provides information about files and directories in the local
- filing system.
+ \o QFileSystemModel provides information about files and directories in the
+ local filing system.
\o QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel are used
to access databases using model/view conventions.
\endlist
@@ -313,14 +313,14 @@
\section1 Introduction
Two of the standard models provided by Qt are QStandardItemModel and
- QDirModel. QStandardItemModel is a multi-purpose model that can be used
- to represent various different data structures needed by list, table,
+ QFileSystemModel. QStandardItemModel is a multi-purpose model that can be
+ used to represent various different data structures needed by list, table,
and tree views. This model also holds the items of data.
- QDirModel is a model that maintains information about the contents of a
- directory. As a result, it does not hold any items of data itself, but
+ QFileSystemModel is a model that maintains information about the contents
+ of a directory. As a result, it does not hold any items of data itself, but
simply represents files and directories on the local filing system.
- QDirModel provides a ready-to-use model to experiment with, and can be
+ QFileSystemModel provides a ready-to-use model to experiment with, and can be
easily configured to use existing data. Using this model, we can show how
to set up a model for use with ready-made views, and explore how to
manipulate data using model indexes.
@@ -328,22 +328,25 @@
\section1 Using Views with an Existing Model
The QListView and QTreeView classes are the most suitable views
- to use with QDirModel. The example presented below displays the
+ to use with QFileSystemModel. The example presented below displays the
contents of a directory in a tree view next to the same information in
a list view. The views share the user's selection so that the selected
items are highlighted in both views.
\img shareddirmodel.png
- We set up a QDirModel so that it is ready for use, and create some
+ We set up a QFileSystemModel so that it is ready for use, and create some
views to display the contents of a directory. This shows the simplest
way to use a model. The construction and use of the model is
performed from within a single \c main() function:
\snippet doc/src/snippets/shareddirmodel/main.cpp 0
- The model is set up to use data from a default directory. We create two
- views so that we can examine the items held in the model in two
+ The model is set up to use data from a certain file system. The call to
+ \l{QFileSystemModel::}{setRootPath()} tell the model which drive on the
+ file system to expose to the views.
+
+ We create two views so that we can examine the items held in the model in two
different ways:
\snippet doc/src/snippets/shareddirmodel/main.cpp 5
@@ -351,13 +354,13 @@
The views are constructed in the same way as other widgets. Setting up
a view to display the items in the model is simply a matter of calling its
\l{QAbstractItemView::setModel()}{setModel()} function with the directory
- model as the argument. The calls to
- \l{QAbstractItemView::setRootIndex()}{setRootIndex()} tell the views which
- directory to display by supplying a \e{model index} that we obtain from
- the directory model.
+ model as the argument. We filter the data supplied by the model by calling
+ the \l{QAbstractItemView::}{setRootIndex()} function on each view, passing
+ a suitable \e{model index} from the file system model for the current
+ directory.
- The \c index() function used in this case is unique to QDirModel; we supply
- it with a directory and it returns a model index. Model indexes are
+ The \c index() function used in this case is unique to QFileSystemModel; we
+ supply it with a directory and it returns a model index. Model indexes are
discussed in the \l{Model Classes} chapter.
The rest of the function just displays the views within a splitter
@@ -556,19 +559,19 @@
\section2 Using Model Indexes
To demonstrate how data can be retrieved from a model, using model
- indexes, we set up a QDirModel without a view and display the
+ indexes, we set up a QFileSystemModel without a view and display the
names of files and directories in a widget.
Although this does not show a normal way of using a model, it demonstrates
the conventions used by models when dealing with model indexes.
- We construct a directory model in the following way:
+ We construct a file system model in the following way:
\snippet doc/src/snippets/simplemodel-use/main.cpp 0
- In this case, we set up a default QDirModel, obtain a parent index using
- a specific implementation of \l{QDirModel::index()}{index()} provided by
- that model, and we count the number of rows in the model using the
- \l{QDirModel::rowCount()}{rowCount()} function.
+ In this case, we set up a default QFileSystemModel, obtain a parent index
+ using a specific implementation of \l{QFileSystemModel::}{index()}
+ provided by that model, and we count the number of rows in the model using
+ the \l{QFileSystemModel::}{rowCount()} function.
For simplicity, we are only interested in the items in the first column
of the model. We examine each row in turn, obtaining a model index for
@@ -581,7 +584,7 @@
for the first column), and the appropriate model index for the parent
of all the items that we want.
The text stored in each item is retrieved using the model's
- \l{QDirModel::data()}{data()} function. We specify the model index and
+ \l{QFileSystemModel::}{data()} function. We specify the model index and
the \l{Qt::ItemDataRole}{DisplayRole} to obtain data for the
item in the form of a string.
diff --git a/doc/src/getting-started/examples.qdoc b/doc/src/getting-started/examples.qdoc
index 2ad730a7..05940e4 100644
--- a/doc/src/getting-started/examples.qdoc
+++ b/doc/src/getting-started/examples.qdoc
@@ -806,16 +806,16 @@
Audio API in Qt applications.
\list
- \o \l{multimedia/audio/audiodevices}{Audio Devices}
- \o \l{multimedia/audio/audiooutput}{Audio Output}
- \o \l{multimedia/audio/audioinput}{Audio Input}
+ \o \l{multimedia/audiodevices}{Audio Devices}
+ \o \l{multimedia/audiooutput}{Audio Output}
+ \o \l{multimedia/audioinput}{Audio Input}
\endlist
\section1 Video Output
\list
- \o \l{video/videowidget}{Video Widget}\raisedaster
- \o \l{video/videographicsitem}{Video Graphics Item}
+ \o \l{multimedia/videowidget}{Video Widget}\raisedaster
+ \o \l{multimedia/videographicsitem}{Video Graphics Item}
\endlist
\section1 Phonon
@@ -1072,18 +1072,17 @@
/*!
\page examples-gestures.html
\title Gestures Examples
-
+
\previouspage Animation Framework Examples
\contentspage Qt Examples
\nextpage D-Bus Examples
The API of the gesture framework is not yet finalized and
still subject to change.
-\omit
+
\list
- \o \l{widgets/imageviewer}{Image Viewer}
+ \o \l{gestures/imagegestures}{Image Gestures}
\endlist
-\endomit
*/
/*!
@@ -1121,7 +1120,6 @@
\o \l{qws/svgalib}{Accelerated Graphics Driver}\raisedaster
\o \l{qws/dbscreen}{Double Buffered Graphics Driver}\raisedaster
\o \l{qws/mousecalibration}{Mouse Calibration}\raisedaster
- \o \l{qws/ahigl}{OpenGL for Embedded Systems}\raisedaster
\o \l{qws/simpledecoration}{Simple Decoration}\raisedaster
\endlist
*/
diff --git a/doc/src/getting-started/known-issues.qdoc b/doc/src/getting-started/known-issues.qdoc
index 40ac1c7..0b63423 100644
--- a/doc/src/getting-started/known-issues.qdoc
+++ b/doc/src/getting-started/known-issues.qdoc
@@ -53,6 +53,10 @@
For a list list of known bugs in Qt %VERSION%, see the \l{Task Tracker}
on the Qt website.
+ An overview of known issues may also be found at:
+ \l{http://qt.gitorious.org/qt/pages/Qt460BetaKnownIssues}
+ {Known Issues Wiki}.
+
\section1 Installation Issues
\section2 Building the Source Package on Windows 7
diff --git a/doc/src/howtos/openvg.qdoc b/doc/src/howtos/openvg.qdoc
index 42d2357..5de2e22 100644
--- a/doc/src/howtos/openvg.qdoc
+++ b/doc/src/howtos/openvg.qdoc
@@ -292,8 +292,8 @@
\section2 Pixmap filters
- Convolution, colorize, and drop shadow filters are accelerated using
- OpenVG operations.
+ Convolution, colorize, drop shadow, and blur filters are accelerated
+ using OpenVG operations.
\section1 Known issues
diff --git a/doc/src/images/pangesture.png b/doc/src/images/pangesture.png
new file mode 100644
index 0000000..24caf91
--- /dev/null
+++ b/doc/src/images/pangesture.png
Binary files differ
diff --git a/doc/src/images/pinchgesture.png b/doc/src/images/pinchgesture.png
new file mode 100644
index 0000000..95614c4
--- /dev/null
+++ b/doc/src/images/pinchgesture.png
Binary files differ
diff --git a/doc/src/images/qt-colors.png b/doc/src/images/qt-colors.png
index 524123f..331c975 100644
--- a/doc/src/images/qt-colors.png
+++ b/doc/src/images/qt-colors.png
Binary files differ
diff --git a/doc/src/images/shareddirmodel.png b/doc/src/images/shareddirmodel.png
index 6daa9d3..7b9fded 100644
--- a/doc/src/images/shareddirmodel.png
+++ b/doc/src/images/shareddirmodel.png
Binary files differ
diff --git a/doc/src/images/simpleanchorlayout-example.png b/doc/src/images/simpleanchorlayout-example.png
new file mode 100644
index 0000000..1d5c8ac
--- /dev/null
+++ b/doc/src/images/simpleanchorlayout-example.png
Binary files differ
diff --git a/doc/src/images/standard-views.png b/doc/src/images/standard-views.png
index 836ae36..c804551 100644
--- a/doc/src/images/standard-views.png
+++ b/doc/src/images/standard-views.png
Binary files differ
diff --git a/doc/src/images/swipegesture.png b/doc/src/images/swipegesture.png
new file mode 100644
index 0000000..0b7d35a
--- /dev/null
+++ b/doc/src/images/swipegesture.png
Binary files differ
diff --git a/doc/src/internationalization/i18n.qdoc b/doc/src/internationalization/i18n.qdoc
index 121c822..e873f4e 100644
--- a/doc/src/internationalization/i18n.qdoc
+++ b/doc/src/internationalization/i18n.qdoc
@@ -42,6 +42,9 @@
/*!
\group i18n
\title Qt Classes for Internationalization
+
+ See \l{Internationalization with Qt} for information on how to use these classes
+ in your applications.
*/
/*!
diff --git a/doc/src/internationalization/linguist-manual.qdoc b/doc/src/internationalization/linguist-manual.qdoc
index 065fb6b..5d388f1 100644
--- a/doc/src/internationalization/linguist-manual.qdoc
+++ b/doc/src/internationalization/linguist-manual.qdoc
@@ -327,7 +327,7 @@
area}. The \l{Context Window} {context list} is normally shown
on the left, and the \l{Sources and Forms Window} {source code},
\l{Strings Window} {string list}, and either the \l{Phrases and
- Guesses Window} {prhrases and guesses}, or the \l{Warnings Window}
+ Guesses Window} {phrases and guesses}, or the \l{Warnings Window}
{warnings} are shown above and below the \l{The Translation Area}
{translations area}.
@@ -355,7 +355,7 @@
translation "guesses" have been read from phrase books
(\menu{Phrases|Open Phrase Book...}). The current string's
current translation is also shown here. To select a guess, double
- click it in the prases and guesses window or use the keyboard
+ click it in the phrases and guesses window or use the keyboard
shortcut shown to the right of the guess.
\QL can automatically check whether your translation strings pass
@@ -764,7 +764,7 @@
and \e{N}.
Each Ctrl key accelerator is shown in the \l{Strings Window}
- {string list} as a separte string, e.g. \key{Ctrl+Enter}. Since
+ {string list} as a separate string, e.g. \key{Ctrl+Enter}. Since
the string doesn't have a context to give it meaning, e.g. like
the context of the phrase in which an Alt key accelerator appears,
the translator must rely on the UI developer to include a
@@ -808,6 +808,337 @@
of where argument \e{i} appears in the argument sequence in the
source string.
+ \section2 Plurals
+
+ The problem of plurals in output is resolved by using an overload of
+ the \c tr() function with the signature
+ \code
+ QString tr(const char *text, const char *comment, int n);
+ \endcode
+ Using built in comparisons for the value of \c n the tr() function will
+ translate the phrase to the plural form for the target language.
+
+ Different languages have various forms for plurals beyond simply
+ \e singular and \e plural. The rules for determining which form of the
+ plural to use are encoded as conditional tests. Below is a table
+ representing the numbers associated with the forms rather than the
+ conditional tests themselves.
+
+
+
+ \table 90%
+ \header
+ \o Language
+ \o Form 1
+ \o Form 2
+ \o Form 3
+ \o Form 4
+ \row
+ \o Arabic
+ \o 0, 1, 11-102, 111-202...
+ \o 2
+ \o 3-10, 103-110, 203-210...
+ \o
+ \row
+ \o Basque
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Bulgarian
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Catalan
+ \o 1
+ \o 11, 11 000-11 999, 11 000 000-11 999 999...
+ \o 0, 2-10, 12-10 999, 12-10 999 999...
+ \o
+ \row
+ \o Chinese-CN
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Chinese-HK
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Chinese-TW
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Croation
+ \o 1, 21, 31, 41, 51, 61, 71, 81, 91, 101...
+ \o 2-4, 22-24, 32-34, 42-44...
+ \o 0, 5-20, 25-30, 35-40...
+ \o
+ \row
+ \o Czech
+ \o 1
+ \o 2-4
+ \o 0, 5-
+ \o
+ \row
+ \o Danish
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Dutch
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o English
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o English-US
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Estonian
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Finnish
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o French-CA
+ \o 0, 1
+ \o 2-100, 101-
+ \o
+ \o
+ \row
+ \o French-FR
+ \o 0, 1
+ \o 2-100, 101-
+ \o
+ \o
+ \row
+ \o Galician
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o German
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Greek
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Hebrew
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Hungarian
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Icelandic
+ \o 1, 21, 31, 41, 51....101, 121, 131...
+ \o 0, 2-20, 22-30, 32-40...102-120...
+ \o
+ \o
+ \row
+ \o Indonesian
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Italian
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Japanese
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Korean
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Latvian
+ \o 0
+ \o 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 131, 141...
+ \o 2-20, 22-30, 32-40, 42-50...202-220, 222-230...
+ \o
+ \row
+ \o Lithuanian
+ \o 1, 21, 31, 41, 51...101, 121, 131...
+ \o 2-9, 22-29, 32-39...102-109, 122-129, 132-139...
+ \o 0, 10-20, 30, 40, 50...110-120, 130, 140...
+ \o
+ \row
+ \o Malay
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Norwegian
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Persian
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Polish
+ \o 1
+ \o 2-4, 22-24, 32-34...
+ \o 5-21, 25-31, 35-41...
+ \o
+ \row
+ \o Portugese-BR
+ \o 0, 1
+ \o 2-100, 101-
+ \o
+ \o
+ \row
+ \o Portugese-PT
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Romanian
+ \o 1
+ \o 0, 2-19, 101-119, 201-219...
+ \o 20-100, 120-200, 220-300...
+ \o
+ \row
+ \o Russian
+ \o 1, 21, 31, 41, 51, 61, 71, 81, 91, 101...
+ \o 2-4, 22-24, 32-34...
+ \o 0, 5-20, 25-30, 35-40...
+ \o
+ \row
+ \o Serbian
+ \o 1, 21, 31, 41, 51, 61, 71, 81, 91, 101...
+ \o 2-4, 22-24, 32-34...
+ \o 0, 5-20, 25-30, 35-40...
+ \o
+ \row
+ \o Slovak
+ \o 1
+ \o 2-4
+ \o 0, 5-20, 25-30, 35-40...
+ \o
+ \row
+ \o Slovene
+ \o 1, 101, 201, 301...
+ \o 2, 102, 202, 302...
+ \o 3, 4, 103, 104, 203, 204, 303, 304...
+ \o 0, 5-100, 105-200, 205-300...
+ \row
+ \o Spanish-US
+ \o 1
+ \o 0, 2-
+ \o
+ \o
+ \row
+ \o Spanish-ES
+ \o 1
+ \o 0, 2-
+ \o
+ \o
+ \row
+ \o Swedish
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Tagalog
+ \o 0, 1
+ \o 2, 3, 5, 7-8, 10-13, 15, 17-18, 20-23...101...1001
+ \o 4, 6, 9, 14, 16, 19, 24, 26, 29...104, 106, 109...
+ \o
+ \row
+ \o Thai
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Turkish
+ \o 0-
+ \o
+ \o
+ \o
+ \row
+ \o Ukrainian
+ \o 1, 21, 31, 41, 51, 61, 71, 81, 91, 101...
+ \o 2-4, 22-24, 32-34...
+ \o 0, 5-20, 25-30, 35-40...
+ \o
+ \row
+ \o Urdu
+ \o 1
+ \o 0, 2-100, 101-
+ \o
+ \o
+ \row
+ \o Vietnamese
+ \o 0-
+ \o
+ \o
+ \o
+ \endtable
+
+ These rules are embedded within the Qt libraries, there is no need for
+ the developer to know them. Merely to use the correct \c tr() call.
+
+
\section2 Reusing Translations
If the translated text is similar to the source text, choose the
diff --git a/doc/src/platforms/emb-opengl.qdoc b/doc/src/platforms/emb-opengl.qdoc
index fea09bb..2ed5d04 100644
--- a/doc/src/platforms/emb-opengl.qdoc
+++ b/doc/src/platforms/emb-opengl.qdoc
@@ -57,20 +57,20 @@ of the \l {http://www.opengl.org}{OpenGL} standard.
Because it is meant for use in embedded systems, it has a smaller,
more constrained API.
-For reference, Nokia provides a plugin which integrates \l
-{http://www.khronos.org/opengles}{OpenGL ES} with Qt for Embedded Linux,
-but Qt for Embedded Linux can be adapted to a wide range of OpenGL
-versions.
+For reference, Nokia provides support for integrating \l
+{http://www.khronos.org/opengles}{OpenGL ES} with Qt for Embedded Linux
+for drawing into a QGLWidget.
-There are three ways to use OpenGL with Qt for Embedded Linux:
-\list
- \o Perform OpenGL 3D graphics operations in applications;
- \o Accelerate normal 2D painting operations;
- \o Implement window compositing and special effects.
-\endlist
+The current implementation supports OpenGL and 2D painting within a
+QGLWidget. Using OpenGL to accelerate regular widgets and compositing
+top-level windows with OpenGL are not currently supported. These issues
+will be addressed in future versions of Qt.
-Qt for Embedded Linux is shipped with a reference integration example
-that demonstrates all three uses.
+It is recommended that Qt for Embedded Linux is configured with the
+\c{-DQT_QWS_CLIENTBLIT} and \c{-DQT_NO_QWS_CURSOR} options for optimum
+performance. OpenGL is rendered direct to the screen and these options
+prevent Qt for Embedded Linux from trying to do its own non-OpenGL
+compositing on the QGLWidget contents.
\section2 Using OpenGL 3D Graphics in Applications
@@ -82,146 +82,149 @@ To use OpenGL-enabled widgets in a Qt for Embedded Linux application,
all that is required is to subclass the QGLWidget and draw into instances of
the subclass with standard OpenGL functions.
+Note that on most embedded hardware, the OpenGL implementation is
+actually \l{http://www.khronos.org/opengles/1_X/}{OpenGL/ES 1.1} or
+\l{http://www.khronos.org/opengles/2_X/}{OpenGL/ES 2.0}. When painting
+within a QGLWidget::paintGL() override, it is necessary to limit the
+application to only the features that are present in the OpenGL/ES
+implementation.
+
\section2 Using OpenGL to Accelerate Normal 2D Painting
-Qt provides QOpenGLPaintEngine, a subclass of QPaintEngine that
-translates QPainter operations into OpenGL calls. This specialized
-paint engine can be used to improve 2D rendering performance on
-appropriate hardware. It can also overlay controls and decorations
-onto 3D scenes drawn using OpenGL.
+Qt provides a subclass of QPaintEngine that translates QPainter operations
+into OpenGL calls (there are actually two subclasses, one for OpenGL/ES 1.1
+and another for OpenGL/ES 2.0). This specialized paint engine can be used
+to improve 2D rendering performance on appropriate hardware. It can also
+overlay controls and decorations onto 3D scenes drawn using OpenGL.
+
+As mentioned above, the OpenGL paint engine is not currently supported
+in regular widgets. However, any application that uses QGraphicsView
+can set a QGLWidget as the viewport and obtain access to the
+OpenGL paint engine that way:
+
+\code
+QGraphicsView view(&scene);
+view.setViewport(new QGLWidget);
+view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+view.showFullScreen();
+\endcode
+
+It is recommended that the QGraphicsView::FullViewportUpdate flag
+be set because the default double-buffered behavior of QGLWidget
+does not support partial updates. It is also recommended that the
+window be shown full-screen because that usually has the best
+performance on current OpenGL/ES implementations.
+
+Once a QGraphicsView has been initialized as above, regular widgets
+can be added to the canvas using QGraphicsProxyWidget if the
+application requires them.
\section2 Using OpenGL to Implement Window Compositing and Effects
-Qt for Embedded Linux includes a complete windowing system, which implements
-real transparency. The windowing system can be accelerated using
-OpenGL to implement top level window compositing. This makes it easy
-to add 3D effects to applications, for instance when windows are
-minimized or maximized.
-
-\section1 Acceleration Architecture
-
-The diagram below shows the Qt for Embedded Linux painting architecture.
-
-\image qt-embedded-opengl3.png
-
-A client process widget uses a paint engine to draw into a window
-surface. The server then combines the window surfaces and displays the
-composition on the screen. This architecture lets you
-control the steps of the painting process by subclassing.
-
-Subclassing QPaintEngine allows you to implement the QPainter API
-using accelerated hardware. Subclassing QWindowSurface lets you
-decide the properties of the space your widgets will draw themselves
-into, as well as which paint engine they should use to draw themselves
-into that space. Subclassing QScreen lets you control the creation of
-window surfaces and lets you decide how to implement window
-compositing. Using subclassing, your implementation work is minimized
-since you can reuse base class functionality you don't need to change.
+Compositing effects can be simulated by adjusting the opacity and
+other parameters of the items within a QGraphicsView canvas on a
+QGLWidget viewport.
-The elements of an accelerated Qt for Embedded Linux system are shown in the
-diagram below.
+While Qt for Embedded Linux does include a complete windowing system,
+using OpenGL to composite regular window surfaces can be quite difficult.
+Most of Qt for Embedded Linux assumes that the window surface is a plain
+raster memory buffer, with QGLWidget being the sole exception.
+The need to constantly re-upload the raster memory buffers into OpenGL
+textures for compositing can have a significant impact on performance,
+which is why we do not recommend implementing that form of compositing.
+We intend to address this problem in future versions of Qt.
-\image qt-embedded-opengl1.png
+\section1 Integrating OpenGL/ES into Qt for Embedded Linux
-The applications, using the Qt API, do not depend on the presence of
-the acceleration plugin. The plugin uses the graphics hardware to
-accelerate painting primitives. Any operations not accelerated by the
-plugin are done in software by the software paint engine.
+\section2 Reference Integration
-To integrate an OpenGL implementation into Qt for Embedded Linux for a
-particular platform, you use the same mechanisms you would use for
-writing any other accelerated driver. Base classes, e.g., QGLScreen
-and QWSGLWindowSurface, are provided to minimize the need for
-reimplementing common functionality.
+The reference integration for OpenGL into Qt for Embedded Linux
+is for the PowerVR chipset from \l{http://www.imgtec.com/}{Imagination
+Technologies}. It consists of two components: \c{pvreglscreen} which
+provides the Qt for Embedded Linux screen driver, and \c{QWSWSEGL}
+which implements a plug-in to the PowerVR EGL implementation to
+implement low-level OpenGL drawing surfaces.
-\section1 The Reference Integration
+\section2 Integrating Other Chipsets
-The \l{OpenGL for Embedded Systems Example} is the reference implementation
-for integrating OpenGL ES and \l{http://www.khronos.org/egl/}{EGL} with
-the graphics acceleration architecture of Qt for Embedded Linux.
-(\l{http://www.khronos.org/egl/}{EGL} is a library that binds OpenGL ES to
-native windowing systems.)
+In this section we discuss the essential features of the reference
+integration that need to be provided for any other chipset integration.
-The diagram below shows how OpenGL ES is used within the acceleration architecture:
+The QtOpenGL module assumes that a QGLWidget can be represented
+by a \c EGLNativeWindowType value in some underlying window system
+implementation, and that \c{eglSwapBuffers()} is sufficient to copy
+the contents of the native window to the screen when requested.
-\image qt-embedded-opengl2.png
+However, many EGL implementations do not have a pre-existing window system.
+Usually only a single full-screen window is provided, and everything else
+must be simulated some other way. This can be a problem because
+of QtOpenGL's assumptions. We intend to address these assumptions in a
+future version of Qt, but for now it is the responsibility of the integrator
+to provide a rudimentary window system within the EGL implementation.
+This is the purpose of \c{QWSWSEGL} in the reference integration.
-The example implements a screen driver plugin that demonstrates all
-three uses of OpenGL in Qt for Embedded Linux: 2D graphics acceleration, 3D
-graphics operations using the \l {QtOpenGL module}, and top-level
-window compositing and special effects. The applications still do
-not talk directly to the accelerated plugin.
+If it isn't possible for the EGL implementation to provide a rudimentary
+window system, then full-screen windows using QGLWidget can be supported,
+but very little else.
-For 2D graphics, applications use the normal Qt painting API. The example accelerates 2D
-painting by using the QOpenGLPaintEngine, which is included in the \l {QtOpenGL module}.
+The screen driver needs to inherit from QGLScreen and perform the
+following operations in its constructor:
-For 3D graphics applications use the OpenGL API directly, together with the functionality
-in the Qt OpenGL support classes. The example supports this by creating a
-QWSGLWindowSurface whenever a QGLWidget is instantiated.
+\snippet src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp 0
-All access to the display is done through OpenGL. The example subclasses
-QWSGLWindowSurface implementation and uses the \l
-{http://oss.sgi.com/projects/ogl-sample/registry/EXT/framebuffer_object.txt}
-{OpenGL Framebuffer Object extension} to draw windows into an offscreen buffer. This
-lets the example use OpenGL to implement top level window compositing of opaque and
-semi-transparent windows, and to provide a 3D animated transition effect as each new
-window is shown.
+The \c{setSurfaceFunctions()} call supplies an object that takes care
+of converting Qt paint devices such as widgets and pixmaps into
+\c EGLNativeWindowType and \c EGLNativePixmapType values. Here we
+only support native windows. Because OpenGL rendering is direct to
+the screen, we also indicate that client blit is supported.
-The specific OpenGL library being used by the example restricts all
-OpenGL operations to occur in a single process. Hence the example
-creates instances of QWSGLWindowSurface only in the server process.
-Other processes then perform 2D graphics by creating instances
-of the standard QWindowSurface classes for client processes. The
-standard window surface performs software-based rendering into a
-shared memory segment. The server then transfers the contents of this
-shared memory into an OpenGL texture before they are drawn onto the
-screen during window compositing.
+Next, we override the \c{createSurface()} functions in QGLScreen:
-\omit
+\snippet src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp 1
-\section1 Future Directions
+Even if Qt for Embedded Linux is used in single-process mode, it is
+necessary to create both client-side and server-side versions of the
+window surface. In our case, the server-side is just a stub because
+the client side directly renders to the screen.
-\section2 API Improvements
+Note that we only create a \c{PvrEglWindowSurface} if the widget is a
+QGLWidget. All other widgets use the normal raster processing.
+It can be tempting to make \c{createSurface()} create an OpenGL
+window surface for other widget types as well. This has not been
+extensively tested and we do not recommend its use at this time.
-Nokia is now working on enhancing the API for integrating OpenGL
-with Qt for Embedded Linux. The current design plan includes the following
-features:
+The other main piece is the creation of the \c EGLNativeWindowType
+value for the widget. This is done in the \c{createNativeWindow()}
+override:
-\list
+\snippet src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp 2
- \o Provide convenience classes, e.g., QEGLScreen and
- QWSEGLWindowSurface, which implement common uses of the EGL
- API. These classes will simplify implementing an OpenGL ES
- integration.
+The details of what needs to be placed in this function will vary
+from chipset to chipset. The simplest is to return the native window
+handle corresponding to the "root" full-screen window:
- \o Extend the screen driver API to provide more control over window
- properties and animations, and provide a software-based integration
- to enable testing on the desktop.
+\code
+*native = rootWindowHandle;
+return true;
+\endcode
- \o Improve performance as opportunities arise.
+The most common value for \c rootWindowHandle is zero, but this may
+not always be the case. Consult the chipset documentation for the
+actual value to use. The important thing is that whatever value is
+returned must be suitable for passing to the \c{eglCreateWindowSurface()}
+function of the chipset's EGL implementation.
-\endlist
+In the case of PowerVR, the rudimentary window system in \c{QWSWSEGL}
+provides a \c PvrQwsDrawable object to represent the \c EGLNativeWindowType
+value for the widget.
-\section2 OpenVG Support
+\section1 OpenVG Support
\l {http://www.khronos.org/openvg} {OpenVG} is a dedicated API for 2D
graphics on mobile devices. It is therefore more likely to be a better
-alternative for 2D acceleration than OpenGL. Until recently, no
-OpenVG-capable hardware has been available, so Nokia has not yet
-included an OpenVG solution in Qt for Embedded Linux.
-
-However, Nokia has done a feasibility study, implementing an
-OpenVG paint engine on top of a software OpenVG implementation.
-Assuming availability of the appropriate hardware, this OpenVG paint
-engine can easily be completed and integrated using the existing
-acceleration architecture. Since OpenVG shares the same EGL layer as
-OpenGL ES, the work already done on the OpenGL integration can be
-reused.
-
-Related technologies included in the \l
-{http://www.khronos.org/openkode} {OpenKODE} API set will also be
-considered.
-
-\endomit
+alternative for 2D acceleration than OpenGL/ES. Acceleration of
+regular widgets is supported with OpenVG, unlike with OpenGL/ES.
+See \l{OpenVG Rendering in Qt} for more information on the
+OpenVG support in Qt.
*/
diff --git a/doc/src/platforms/s60-introduction.qdoc b/doc/src/platforms/s60-introduction.qdoc
index d27eb39..5fd0cbe 100644
--- a/doc/src/platforms/s60-introduction.qdoc
+++ b/doc/src/platforms/s60-introduction.qdoc
@@ -50,12 +50,12 @@
\tableofcontents
\section1 Required tools
-
+
See \l{Qt for Symbian platform Requirements} to see what tools are
-required to use Qt for Symbian platform.
+ required to use Qt for Symbian platform.
\section1 Installing Qt and running demos
-
+
Follow the instructions found in \l{Installing Qt on the Symbian platform using binary package} to learn how
to install Qt using binary package and how to build and run Qt demos.
@@ -69,7 +69,7 @@ required to use Qt for Symbian platform.
Qt application on the Symbian platform compared to any of the other platforms supported
by Qt is not that big.
- Once you have crated a \c .pro file for your project, generate the
+ Once you have created a \c .pro file for your project, generate the
Carbide specific \c Bld.inf and \c .mmp files this way:
\snippet doc/src/snippets/code/doc_src_s60-introduction.qdoc 0
@@ -78,9 +78,9 @@ required to use Qt for Symbian platform.
{qmake Tutorial}.
Now you can build the Qt for the Symbian platform application with
-standard build tools. By default, running \c make will produce binaries for
-the emulator. However, the Symbian platform comes with several alternative
-build targets, as shown in the table below:
+ standard build tools. By default, running \c make will produce binaries for
+ the emulator. However, the Symbian platform comes with several alternative
+ build targets, as shown in the table below:
\table
\row \o \c debug-winscw \o Build debug binaries for the emulator (default).
@@ -111,18 +111,18 @@ build targets, as shown in the table below:
target. For example, the following sequence will generate the needed makefiles,
build the project for \c debug-winscw and \c release-armv5, and create
self-signed \c .sis file for \c release-armv5 target:
-
+
\snippet doc/src/snippets/code/doc_src_s60-introduction.qdoc 2
If you want to use different certificate information or override the default
target for \c .sis file creation you can use the environment variables as
shown in the table below:
-
+
\table
\row \o \c QT_SIS_OPTIONS \o Options accepted by \c .sis creation.
-i, install the package right away using PC suite.
-c=<file>, read certificate information from a file.
- Execute \c{createpackage.pl} script without any
+ Execute the \c{createpackage.pl} script without any
parameters for more information about options.
By default no otions are given.
\row \o \c QT_SIS_TARGET \o Target for which \c .sis file is created.
@@ -135,15 +135,15 @@ build targets, as shown in the table below:
\row \o \c QT_SIS_PASSPHRASE \o The certificate's private key file's passphrase.
By default empty.
\endtable
-
+
For example:
-
+
\snippet doc/src/snippets/code/doc_src_s60-introduction.qdoc 4
The environment variables for \c make can also be given as parameters:
-
+
\snippet doc/src/snippets/code/doc_src_s60-introduction.qdoc 3
-
+
If you want to install the program immediately, make sure that the device
is connected to the computer in "PC Suite" mode, and run \c sis target
with the \c QT_SIS_OPTIONS=-i, like this:
diff --git a/doc/src/platforms/supported-platforms.qdoc b/doc/src/platforms/supported-platforms.qdoc
index 4c3929a..302ecb4 100644
--- a/doc/src/platforms/supported-platforms.qdoc
+++ b/doc/src/platforms/supported-platforms.qdoc
@@ -106,10 +106,8 @@
\o Compilers
\row \o Windows XP, Vista
\o gcc 3.4.2 (MinGW)
- \omit
\row \o Windows 7
\o MSVC 2008
- \endomit
\row \o Apple Mac OS X 10.6 "Snow Leopard"
\o As provided by Apple
\row \o Apple Mac OS X 10.4 "Tiger"
diff --git a/doc/src/porting/qt4-interview.qdoc b/doc/src/porting/qt4-interview.qdoc
index 29d9f5c..fd3fb36 100644
--- a/doc/src/porting/qt4-interview.qdoc
+++ b/doc/src/porting/qt4-interview.qdoc
@@ -109,8 +109,8 @@
\list
\o QStandardItemModel is a minimal convenience model that developers
can use to manage items of data.
- \o QDirModel provides directory information for use with QListView and
- QTreeView.
+ \o QFileSystemModel provides directory information for use with QListView
+ and QTreeView.
\o QStringListModel is a convenience model that can be used to hold
strings for views such as QListView and QComboBox.
\endlist
@@ -153,7 +153,7 @@
In this example, we display the contents of a model using two
different views, and share the user's selection between
- them. We will use the QDirModel supplied with Qt because it
+ them. We will use the QFileSystemModel supplied with Qt because it
requires very little configuration, and provides existing data to
the views.
@@ -174,7 +174,7 @@
\image interview-shareddirmodel.png
- The model/view architecture allows us to replace the QDirModel in
+ The model/view architecture allows us to replace the QFileSystemModel in
this example with a completely different model, one that will perhaps
obtain data from a remote server, or from a database.
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index a946540..4943984 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -546,29 +546,32 @@
trigger on signals and \l{QEvent}s. By inserting animations into
the state machine, it is also easier to use the framework for
animating GUIs, for instance.
-
+
See \l{The State Machine Framework} documentation for more infromation.
- \section1 Multi-touch & Gestures
+ \section1 Multi-Touch and Gestures
- The new multi-touch and gestures support enables user interaction
- with more than one finger, and combines sequential touch inputs to
- a 'gesture'.
+ Support for multi-touch input enables users to interact with many
+ parts of a user interface at the same time, and provides the basis
+ for gestures. Additional infrastructure for gesture recognition
+ allows a sequence of touch inputs to be combined to create gestures
+ that can be used to activate features and trigger actions in an
+ application.
\image gestures.png
- The main benefits of this new functionality are:
+ This new functionality brings a number of benefits:
\list
- \o Allow users to interact with applications in better ways.
- \o Simplify finger-based interaction with UI components.
- \o Allowing common basic gestures and multi-touch
- gestures.
- \o Enable extensibility.
+ \o Allows users to interact with applications in more natural ways.
+ \o Simplifies finger-based interaction with UI components.
+ \o Combines support for common basic gestures and multi-touch gestures
+ in a single general framework.
+ \o Enables extensibility by design.
\endlist
- See the QTouchEvent class documentation for more information. The
- Gesture framework API is still subject to change.
+ See the QTouchEvent class documentation for more information on multi-touch
+ input and QGestureEvent for gestures.
\section1 DOM access API
@@ -628,7 +631,7 @@
through C++ APIs in the Qt application, or using the xmlpatternsvalidator
command line utility. The implementation of XML Schema Validation supports
the specification version 1.0 in large parts.
-
+
\img xml-schema.png
See the \l{XML Processing} and QXmlSchema class documentation for more
@@ -661,9 +664,10 @@
See the \l{QtMultimedia Module} documentation for more information.
- \section1 Classes, functions, etc new in 4.6
+ \section1 New Classes, Functions, Macros, etc
- Links to classes, functions, and other items that are new in 4.6.
+ Links to new classes, functions, macros, and other items
+ introduced in Qt 4.6.
\sincelist 4.6
@@ -830,7 +834,7 @@
these settings when you edit forms.
More information about these improvements can be found in the
- \l{What's New in Qt Designer 4.6} overview.
+ \l{What's New in Qt Designer 4.5} overview.
\section1 Qt Linguist Improvements
diff --git a/doc/src/snippets/colors/colors.pro b/doc/src/snippets/colors/colors.pro
new file mode 100644
index 0000000..b2cc87d
--- /dev/null
+++ b/doc/src/snippets/colors/colors.pro
@@ -0,0 +1,2 @@
+HEADERS = window.h
+SOURCES = main.cpp window.cpp
diff --git a/doc/src/snippets/colors/main.cpp b/doc/src/snippets/colors/main.cpp
new file mode 100644
index 0000000..4e09036
--- /dev/null
+++ b/doc/src/snippets/colors/main.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include "window.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ Window window;
+ window.setFixedSize(640, 215);
+ window.show();
+ return app.exec();
+}
diff --git a/doc/src/snippets/colors/window.cpp b/doc/src/snippets/colors/window.cpp
new file mode 100644
index 0000000..0cec5f5
--- /dev/null
+++ b/doc/src/snippets/colors/window.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include "window.h"
+
+Window::Window(QWidget *parent)
+ : QWidget(parent)
+{
+ QFont font;
+ font.setPixelSize(12);
+ setFont(font);
+}
+
+void Window::closeEvent(QCloseEvent *event)
+{
+ QPixmap pixmap(size());
+ render(&pixmap);
+ pixmap.save("qt-colors.png");
+
+ event->accept();
+}
+
+void Window::paintEvent(QPaintEvent *)
+{
+ QPainter painter;
+ painter.begin(this);
+
+ int h = 216 / 5;
+ QRect r = QRect(0, 0, 160, h);
+ painter.fillRect(r, Qt::white);
+ painter.setPen(Qt::black);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("white"));
+ r = QRect(0, h, 160, h);
+ painter.fillRect(r, Qt::red);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("red"));
+ r = QRect(0, h*2, 160, h);
+ painter.fillRect(r, Qt::green);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("green"));
+ r = QRect(0, h*3, 160, h);
+ painter.fillRect(r, Qt::blue);
+ painter.setPen(Qt::white);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("blue"));
+
+ r = QRect(160, 0, 160, h);
+ painter.fillRect(r, Qt::black);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("black"));
+ r = QRect(160, h, 160, h);
+ painter.fillRect(r, Qt::darkRed);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkRed"));
+ r = QRect(160, h*2, 160, h);
+ painter.fillRect(r, Qt::darkGreen);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkGreen"));
+ r = QRect(160, h*3, 160, h);
+ painter.fillRect(r, Qt::darkBlue);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkBlue"));
+
+ r = QRect(320, 0, 160, h);
+ painter.fillRect(r, Qt::cyan);
+ painter.setPen(Qt::black);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("cyan"));
+ r = QRect(320, h, 160, h);
+ painter.fillRect(r, Qt::magenta);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("magenta"));
+ r = QRect(320, h*2, 160, h);
+ painter.fillRect(r, Qt::yellow);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("yellow"));
+ r = QRect(320, h*3, 160, h);
+ painter.fillRect(r, Qt::gray);
+ painter.setPen(Qt::white);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("gray"));
+
+ r = QRect(480, 0, 160, h);
+ painter.fillRect(r, Qt::darkCyan);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkCyan"));
+ r = QRect(480, h, 160, h);
+ painter.fillRect(r, Qt::darkMagenta);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkMagenta"));
+ r = QRect(480, h*2, 160, h);
+ painter.fillRect(r, Qt::darkYellow);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkYellow"));
+ r = QRect(480, h*3, 160, h);
+ painter.fillRect(r, Qt::darkGray);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("darkGray"));
+
+ r = QRect(0, h*4, 640, h);
+ painter.fillRect(r, Qt::lightGray);
+ painter.setPen(Qt::black);
+ painter.drawText(r, Qt::AlignCenter, QLatin1String("lightGray"));
+
+ painter.end();
+}
+
diff --git a/doc/src/snippets/colors/window.h b/doc/src/snippets/colors/window.h
new file mode 100644
index 0000000..3b08b90
--- /dev/null
+++ b/doc/src/snippets/colors/window.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QWidget>
+
+class Window : public QWidget
+{
+public:
+ Window(QWidget *parent = 0);
+
+protected:
+ void closeEvent(QCloseEvent *event);
+ void paintEvent(QPaintEvent *event);
+};
+
diff --git a/doc/src/snippets/gestures/imageviewer/imagewidget.cpp b/doc/src/snippets/gestures/imageviewer/imagewidget.cpp
deleted file mode 100644
index 409db2e..0000000
--- a/doc/src/snippets/gestures/imageviewer/imagewidget.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "imagewidget.h"
-
-#include <QtGui>
-
-ImageWidget::ImageWidget(QWidget *parent)
- : QWidget(parent)
-{
- setAttribute(Qt::WA_AcceptTouchEvents);
- setAttribute(Qt::WA_PaintOnScreen);
- setAttribute(Qt::WA_OpaquePaintEvent);
- setAttribute(Qt::WA_NoSystemBackground);
-
- setObjectName("ImageWidget");
-
- setMinimumSize(QSize(100,100));
-
- position = 0;
- zoomed = rotated = false;
-
- zoomedIn = false;
- horizontalOffset = 0;
- verticalOffset = 0;
-
-//! [imagewidget-connect]
- panGesture = new QPanGesture(this);
- connect(panGesture, SIGNAL(triggered()), this, SLOT(gestureTriggered()));
-
- tapAndHoldGesture = new TapAndHoldGesture(this);
- connect(tapAndHoldGesture, SIGNAL(triggered()), this, SLOT(gestureTriggered()));
- connect(tapAndHoldGesture, SIGNAL(finished()), this, SLOT(gestureFinished()));
-//! [imagewidget-connect]
-}
-
-void ImageWidget::paintEvent(QPaintEvent*)
-{
- QPainter p(this);
- if (currentImage.isNull()) {
- p.fillRect(geometry(), Qt::white);
- return;
- }
- int hoffset = 0;
- int voffset = 0;
- const int w = pixmap.width();
- const int h = pixmap.height();
- p.save();
- if (zoomedIn) {
- hoffset = horizontalOffset;
- voffset = verticalOffset;
- if (horizontalOffset > 0)
- p.fillRect(0, 0, horizontalOffset, height(), Qt::white);
- if (verticalOffset > 0)
- p.fillRect(0, 0, width(), verticalOffset, Qt::white);
- }
- p.drawPixmap(hoffset, voffset, pixmap);
- if (hoffset + w < width())
- p.fillRect(hoffset + w, 0, width() - w - hoffset, height(), Qt::white);
- if (voffset + h < height())
- p.fillRect(0, voffset + h, width(), height() - h - voffset, Qt::white);
-
- // paint touch feedback
- if (touchFeedback.tapped || touchFeedback.doubleTapped) {
- p.setPen(QPen(Qt::gray, 2));
- p.drawEllipse(touchFeedback.position, 5, 5);
- if (touchFeedback.doubleTapped) {
- p.setPen(QPen(Qt::darkGray, 2, Qt::DotLine));
- p.drawEllipse(touchFeedback.position, 15, 15);
- } else if (touchFeedback.tapAndHoldState != 0) {
- QPoint pts[8] = {
- touchFeedback.position + QPoint( 0, -15),
- touchFeedback.position + QPoint( 10, -10),
- touchFeedback.position + QPoint( 15, 0),
- touchFeedback.position + QPoint( 10, 10),
- touchFeedback.position + QPoint( 0, 15),
- touchFeedback.position + QPoint(-10, 10),
- touchFeedback.position + QPoint(-15, 0)
- };
- for (int i = 0; i < touchFeedback.tapAndHoldState/5; ++i)
- p.drawEllipse(pts[i], 3, 3);
- }
- } else if (touchFeedback.sliding) {
- p.setPen(QPen(Qt::red, 3));
- QPoint endPos = QPoint(touchFeedback.position.x(), touchFeedback.slidingStartPosition.y());
- p.drawLine(touchFeedback.slidingStartPosition, endPos);
- int dx = 10;
- if (touchFeedback.slidingStartPosition.x() < endPos.x())
- dx = -1*dx;
- p.drawLine(endPos, endPos + QPoint(dx, 5));
- p.drawLine(endPos, endPos + QPoint(dx, -5));
- }
-
- for (int i = 0; i < TouchFeedback::MaximumNumberOfTouches; ++i) {
- if (touchFeedback.touches[i].isNull())
- break;
- p.drawEllipse(touchFeedback.touches[i], 10, 10);
- }
- p.restore();
-}
-
-void ImageWidget::mousePressEvent(QMouseEvent *event)
-{
- touchFeedback.tapped = true;
- touchFeedback.position = event->pos();
-}
-
-void ImageWidget::mouseDoubleClickEvent(QMouseEvent *event)
-{
- touchFeedback.doubleTapped = true;
- const QPoint p = event->pos();
- touchFeedback.position = p;
- horizontalOffset = p.x() - currentImage.width()*1.0*p.x()/width();
- verticalOffset = p.y() - currentImage.height()*1.0*p.y()/height();
- setZoomedIn(!zoomedIn);
- zoomed = rotated = false;
- updateImage();
-
- feedbackFadeOutTimer.start(500, this);
-}
-
-//! [imagewidget-triggered-1]
-void ImageWidget::gestureTriggered()
-{
- if (sender() == panGesture) {
-//! [imagewidget-triggered-1]
- touchFeedback.tapped = false;
- touchFeedback.doubleTapped = false;
- QPanGesture *pg = qobject_cast<QPanGesture*>(sender());
- if (zoomedIn) {
-#ifndef QT_NO_CURSOR
- switch (pg->state()) {
- case Qt::GestureStarted:
- case Qt::GestureUpdated:
- setCursor(Qt::SizeAllCursor);
- break;
- default:
- setCursor(Qt::ArrowCursor);
- }
-#endif
- horizontalOffset += pg->lastOffset().width();
- verticalOffset += pg->lastOffset().height();
- } else {
- // only slide gesture should be accepted
- if (pg->state() == Qt::GestureFinished) {
- touchFeedback.sliding = false;
- zoomed = rotated = false;
- if (pg->totalOffset().width() > 0)
- goNextImage();
- else
- goPrevImage();
- updateImage();
- }
- }
- update();
- feedbackFadeOutTimer.start(500, this);
- } else if (sender() == tapAndHoldGesture) {
- if (tapAndHoldGesture->state() == Qt::GestureFinished) {
- qDebug() << "tap and hold detected";
- touchFeedback.reset();
- update();
-
- QMenu menu;
- menu.addAction("Action 1");
- menu.addAction("Action 2");
- menu.addAction("Action 3");
- menu.exec(mapToGlobal(tapAndHoldGesture->pos()));
- } else {
- ++touchFeedback.tapAndHoldState;
- update();
- }
- feedbackFadeOutTimer.start(500, this);
- }
-}
-
-void ImageWidget::gestureFinished()
-{
- qDebug() << "gesture finished" << sender();
-}
-
-void ImageWidget::gestureCancelled()
-{
- qDebug() << "gesture cancelled" << sender();
-}
-
-void ImageWidget::resizeEvent(QResizeEvent*)
-{
- updateImage();
-}
-
-void ImageWidget::updateImage()
-{
- // should use qtconcurrent here?
- transformation = QTransform();
- if (zoomedIn) {
- } else {
- if (currentImage.isNull())
- return;
- if (zoomed) {
- transformation = transformation.scale(zoom, zoom);
- } else {
- double xscale = (double)width()/currentImage.width();
- double yscale = (double)height()/currentImage.height();
- if (xscale < yscale)
- yscale = xscale;
- else
- xscale = yscale;
- transformation = transformation.scale(xscale, yscale);
- }
- if (rotated)
- transformation = transformation.rotate(angle);
- }
- pixmap = QPixmap::fromImage(currentImage).transformed(transformation);
- update();
-}
-
-void ImageWidget::openDirectory(const QString &path)
-{
- this->path = path;
- QDir dir(path);
- QStringList nameFilters;
- nameFilters << "*.jpg" << "*.png";
- files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
-
- position = 0;
- goToImage(0);
- updateImage();
-}
-
-QImage ImageWidget::loadImage(const QString &fileName)
-{
- QImageReader reader(fileName);
- if (!reader.canRead()) {
- qDebug() << fileName << ": can't load image";
- return QImage();
- }
- QImage image;
- if (!reader.read(&image)) {
- qDebug() << fileName << ": corrupted image";
- return QImage();
- }
- return image;
-}
-
-void ImageWidget::setZoomedIn(bool zoomed)
-{
- zoomedIn = zoomed;
-}
-
-void ImageWidget::goNextImage()
-{
- if (files.isEmpty())
- return;
- if (position < files.size()-1) {
- ++position;
- prevImage = currentImage;
- currentImage = nextImage;
- if (position+1 < files.size())
- nextImage = loadImage(path+QLatin1String("/")+files.at(position+1));
- else
- nextImage = QImage();
- }
- setZoomedIn(false);
- updateImage();
-}
-
-void ImageWidget::goPrevImage()
-{
- if (files.isEmpty())
- return;
- if (position > 0) {
- --position;
- nextImage = currentImage;
- currentImage = prevImage;
- if (position > 0)
- prevImage = loadImage(path+QLatin1String("/")+files.at(position-1));
- else
- prevImage = QImage();
- }
- setZoomedIn(false);
- updateImage();
-}
-
-void ImageWidget::goToImage(int index)
-{
- if (files.isEmpty())
- return;
- if (index < 0 || index >= files.size()) {
- qDebug() << "goToImage: invalid index: " << index;
- return;
- }
- if (index == position+1) {
- goNextImage();
- return;
- }
- if (position > 0 && index == position-1) {
- goPrevImage();
- return;
- }
- position = index;
- pixmap = QPixmap();
- if (index > 0)
- prevImage = loadImage(path+QLatin1String("/")+files.at(position-1));
- else
- prevImage = QImage();
- currentImage = loadImage(path+QLatin1String("/")+files.at(position));
- if (position+1 < files.size())
- nextImage = loadImage(path+QLatin1String("/")+files.at(position+1));
- else
- nextImage = QImage();
- setZoomedIn(false);
- updateImage();
-}
-
-void ImageWidget::timerEvent(QTimerEvent *event)
-{
- if (event->timerId() == touchFeedback.tapTimer.timerId()) {
- touchFeedback.tapTimer.stop();
- } else if (event->timerId() == feedbackFadeOutTimer.timerId()) {
- feedbackFadeOutTimer.stop();
- touchFeedback.reset();
- }
- update();
-}
-
-#include "moc_imagewidget.cpp"
diff --git a/doc/src/snippets/gestures/imageviewer/imagewidget.h b/doc/src/snippets/gestures/imageviewer/imagewidget.h
deleted file mode 100644
index 5553093..0000000
--- a/doc/src/snippets/gestures/imageviewer/imagewidget.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef IMAGEWIDGET_H
-#define IMAGEWIDGET_H
-
-#include <QWidget>
-#include <QImage>
-#include <QPixmap>
-
-#include <QtGui>
-
-#include "tapandholdgesture.h"
-
-class ImageWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- ImageWidget(QWidget *parent = 0);
-
- void openDirectory(const QString &path);
-
-protected:
- void paintEvent(QPaintEvent*);
- void resizeEvent(QResizeEvent*);
- void timerEvent(QTimerEvent*);
- void mousePressEvent(QMouseEvent*);
- void mouseDoubleClickEvent(QMouseEvent*);
-
-//! [imagewidget-slots]
-private slots:
- void gestureTriggered();
- void gestureFinished();
- void gestureCancelled();
-//! [imagewidget-slots]
-
-private:
- void updateImage();
- QImage loadImage(const QString &fileName);
- void loadImage();
- void setZoomedIn(bool zoomed);
- void goNextImage();
- void goPrevImage();
- void goToImage(int index);
-
- QPanGesture *panGesture;
- TapAndHoldGesture *tapAndHoldGesture;
-
- QString path;
- QStringList files;
- int position;
-
- QImage prevImage, nextImage;
- QImage currentImage;
- QPixmap pixmap;
- QTransform transformation;
-
- bool zoomedIn;
- int horizontalOffset;
- int verticalOffset;
-
- bool zoomed;
- qreal zoom;
- bool rotated;
- qreal angle;
-
- struct TouchFeedback
- {
- bool tapped;
- QPoint position;
- bool sliding;
- QPoint slidingStartPosition;
- QBasicTimer tapTimer;
- int tapState;
- bool doubleTapped;
- int tapAndHoldState;
-
- enum { MaximumNumberOfTouches = 5 };
- QPoint touches[MaximumNumberOfTouches];
-
- inline TouchFeedback() { reset(); }
- inline void reset()
- {
- tapped = false;
- sliding = false;
- tapTimer.stop();
- tapState = 0;
- doubleTapped = false;
- tapAndHoldState = 0;
- for (int i = 0; i < MaximumNumberOfTouches; ++i) {
- touches[i] = QPoint();
- }
- }
- } touchFeedback;
- QBasicTimer feedbackFadeOutTimer;
-};
-
-#endif
diff --git a/doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp b/doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp
deleted file mode 100644
index 7dd2359..0000000
--- a/doc/src/snippets/gestures/imageviewer/tapandholdgesture.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "tapandholdgesture.h"
-
-#include <QtGui/qevent.h>
-
-// #define TAPANDHOLD_USING_MOUSE
-
-/*!
- \class TapAndHoldGesture
- \since 4.6
-
- \brief The TapAndHoldGesture class represents a Tap-and-Hold gesture,
- providing additional information.
-*/
-
-const int TapAndHoldGesture::iterationCount = 40;
-const int TapAndHoldGesture::iterationTimeout = 50;
-
-/*!
- Creates a new Tap and Hold gesture handler object and marks it as a child
- of \a parent.
-
- On some platforms like Windows there is a system-wide tap and hold gesture
- that cannot be overriden, hence the gesture might never trigger and default
- context menu will be shown instead.
-*/
-TapAndHoldGesture::TapAndHoldGesture(QWidget *parent)
- : QGesture(parent), iteration(0)
-{
-}
-
-/*! \internal */
-bool TapAndHoldGesture::filterEvent(QEvent *event)
-{
- if (!event->spontaneous())
- return false;
- const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
- switch (event->type()) {
- case QEvent::TouchBegin: {
- if (timer.isActive())
- timer.stop();
- timer.start(TapAndHoldGesture::iterationTimeout, this);
- const QPoint p = ev->touchPoints().at(0).pos().toPoint();
- position = p;
- break;
- }
- case QEvent::TouchUpdate:
- if (ev->touchPoints().size() == 1) {
- const QPoint startPos = ev->touchPoints().at(0).startPos().toPoint();
- const QPoint pos = ev->touchPoints().at(0).pos().toPoint();
- if ((startPos - pos).manhattanLength() > 15)
- reset();
- } else {
- reset();
- }
- break;
- case QEvent::TouchEnd:
- reset();
- break;
-#ifdef TAPANDHOLD_USING_MOUSE
- case QEvent::MouseButtonPress: {
- if (timer.isActive())
- timer.stop();
- timer.start(TapAndHoldGesture::iterationTimeout, this);
- const QPoint p = static_cast<QMouseEvent*>(event)->pos();
- position = startPosition = p;
- break;
- }
- case QEvent::MouseMove: {
- const QPoint startPos = startPosition;
- const QPoint pos = static_cast<QMouseEvent*>(event)->pos();
- if ((startPos - pos).manhattanLength() > 15)
- reset();
- break;
- }
- case QEvent::MouseButtonRelease:
- reset();
- break;
-#endif // TAPANDHOLD_USING_MOUSE
- default:
- break;
- }
- return false;
-}
-
-/*! \internal */
-void TapAndHoldGesture::timerEvent(QTimerEvent *event)
-{
- if (event->timerId() != timer.timerId())
- return;
- if (iteration == TapAndHoldGesture::iterationCount) {
- timer.stop();
- updateState(Qt::GestureFinished);
- } else {
- updateState(Qt::GestureUpdated);
- }
- ++iteration;
-}
-
-/*! \internal */
-//! [tapandhold-reset]
-void TapAndHoldGesture::reset()
-{
- timer.stop();
- iteration = 0;
- position = startPosition = QPoint();
- updateState(Qt::NoGesture);
-}
-//! [tapandhold-reset]
-
-/*!
- \property TapAndHoldGesture::pos
-
- \brief The position of the gesture.
-*/
-QPoint TapAndHoldGesture::pos() const
-{
- return position;
-}
diff --git a/doc/src/snippets/gestures/imageviewer/tapandholdgesture.h b/doc/src/snippets/gestures/imageviewer/tapandholdgesture.h
deleted file mode 100644
index 682342e..0000000
--- a/doc/src/snippets/gestures/imageviewer/tapandholdgesture.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef TAPANDHOLDGESTURE_H
-#define TAPANDHOLDGESTURE_H
-
-#include <QtCore/QBasicTimer>
-#include <QtGui/QGesture>
-#include <QtGui/QWidget>
-
-class TapAndHoldGesture : public QGesture
-{
- Q_OBJECT
- Q_PROPERTY(QPoint pos READ pos)
-
-public:
- TapAndHoldGesture(QWidget *parent);
-
- bool filterEvent(QEvent *event);
- void reset();
-
- QPoint pos() const;
-
-protected:
- void timerEvent(QTimerEvent *event);
-
-private:
- QBasicTimer timer;
- int iteration;
- QPoint position;
- QPoint startPosition;
- static const int iterationCount;
- static const int iterationTimeout;
-};
-
-#endif // TAPANDHOLDGESTURE_H
diff --git a/doc/src/snippets/gestures/qgesture.cpp b/doc/src/snippets/gestures/qgesture.cpp
deleted file mode 100644
index 65f8b24..0000000
--- a/doc/src/snippets/gestures/qgesture.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgesture.h"
-#include <private/qgesture_p.h>
-#include "qgraphicsitem.h"
-
-QT_BEGIN_NAMESPACE
-
-
-class QEventFilterProxyGraphicsItem : public QGraphicsItem
-{
-public:
- QEventFilterProxyGraphicsItem(QGesture *g)
- : gesture(g)
- {
- }
- bool sceneEventFilter(QGraphicsItem *, QEvent *event)
- {
- return gesture ? gesture->filterEvent(event) : false;
- }
- QRectF boundingRect() const { return QRectF(); }
- void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) { }
-
-private:
- QGesture *gesture;
-};
-
-/*!
- \class QGesture
- \since 4.6
-
- \brief The QGesture class is the base class for implementing custom
- gestures.
-
- This class represents both an object that recognizes a gesture out of a set
- of input events (a gesture recognizer), and a gesture object itself that
- can be used to get extended information about the triggered gesture.
-
- The class has a list of properties that can be queried by the user to get
- some gesture-specific parameters (for example, an offset of a Pan gesture).
-
- Usually gesture recognizer implements a state machine, storing its state
- internally in the recognizer object. The recognizer receives input events
- through the \l{QGesture::}{filterEvent()} virtual function and decides
- whether the event should change the state of the recognizer by emitting an
- appropriate signal.
-
- Input events should be either fed to the recognizer one by one with a
- filterEvent() function, or the gesture recognizer should be attached to an
- object it filters events for by specifying it as a parent object. The
- QGesture object installs itself as an event filter to the parent object
- automatically, the unsetObject() function should be used to remove an event
- filter from the parent object. To make a
- gesture that operates on a QGraphicsItem, both the appropriate QGraphicsView
- should be passed as a parent object and setGraphicsItem() functions should
- be used to attach a gesture to a graphics item.
-
- This is a base class, to create a custom gesture type, you should subclass
- it and implement its pure virtual functions.
-
- \sa QPanGesture
-*/
-
-/*! \fn bool QGesture::filterEvent(QEvent *event)
-
- Parses input \a event and emits a signal when detects a gesture.
-
- In your reimplementation of this function, if you want to filter the \a
- event out, i.e. stop it being handled further, return true; otherwise
- return false;
-
- This is a pure virtual function that needs to be implemented in subclasses.
-*/
-
-/*! \fn void QGesture::started()
-
- The signal is emitted when the gesture is started. Extended information
- about the gesture is contained in the signal sender object.
-
- In addition to started(), a triggered() signal should also be emitted.
-*/
-
-/*! \fn void QGesture::triggered()
-
- The signal is emitted when the gesture is detected. Extended information
- about the gesture is contained in the signal sender object.
-*/
-
-/*! \fn void QGesture::finished()
-
- The signal is emitted when the gesture is finished. Extended information
- about the gesture is contained in the signal sender object.
-*/
-
-/*! \fn void QGesture::cancelled()
-
- The signal is emitted when the gesture is cancelled, for example the reset()
- function is called while the gesture was in the process of emitting a
- triggered() signal. Extended information about the gesture is contained in
- the sender object.
-*/
-
-
-/*!
- Creates a new gesture handler object and marks it as a child of \a parent.
-
- The \a parent object is also the default event source for the gesture,
- meaning that the gesture installs itself as an event filter for the \a
- parent.
-
- \sa setGraphicsItem()
-*/
-QGesture::QGesture(QObject *parent)
- : QObject(*new QGesturePrivate, parent)
-{
- if (parent)
- parent->installEventFilter(this);
-}
-
-/*! \internal
- */
-QGesture::QGesture(QGesturePrivate &dd, QObject *parent)
- : QObject(dd, parent)
-{
- if (parent)
- parent->installEventFilter(this);
-}
-
-/*!
- Destroys the gesture object.
-*/
-QGesture::~QGesture()
-{
-}
-
-/*! \internal
- */
-bool QGesture::eventFilter(QObject *receiver, QEvent *event)
-{
- Q_D(QGesture);
- if (d->graphicsItem && receiver == parent())
- return false;
- return filterEvent(event);
-}
-
-/*!
- \property QGesture::state
-
- \brief The current state of the gesture.
-*/
-
-/*!
- Returns the gesture recognition state.
- */
-Qt::GestureState QGesture::state() const
-{
- return d_func()->state;
-}
-
-/*!
- Sets this gesture's recognition state to \a state and emits appropriate
- signals.
-
- This functions emits the signals according to the old state and the new
- \a state, and it should be called after all the internal properties have been
- initialized.
-
- \sa started(), triggered(), finished(), cancelled()
- */
-void QGesture::updateState(Qt::GestureState state)
-{
- Q_D(QGesture);
- if (d->state == state) {
- if (state == Qt::GestureUpdated)
- emit triggered();
- return;
- }
- const Qt::GestureState oldState = d->state;
- d->state = state;
- if (state != Qt::NoGesture && oldState > state) {
- // comparing the state as ints: state should only be changed from
- // started to (optionally) updated and to finished.
- qWarning("QGesture::updateState: incorrect new state");
- return;
- }
- if (oldState == Qt::NoGesture)
- emit started();
- if (state == Qt::GestureUpdated)
- emit triggered();
- else if (state == Qt::GestureFinished)
- emit finished();
- else if (state == Qt::NoGesture)
- emit cancelled();
-
- if (state == Qt::GestureFinished) {
- // gesture is finished, so we reset the internal state.
- d->state = Qt::NoGesture;
- }
-}
-
-/*!
- Sets the \a graphicsItem the gesture is filtering events for.
-
- The gesture will install an event filter to the \a graphicsItem and
- redirect them to the filterEvent() function.
-
- \sa graphicsItem()
-*/
-void QGesture::setGraphicsItem(QGraphicsItem *graphicsItem)
-{
- Q_D(QGesture);
- if (d->graphicsItem && d->eventFilterProxyGraphicsItem)
- d->graphicsItem->removeSceneEventFilter(d->eventFilterProxyGraphicsItem);
- d->graphicsItem = graphicsItem;
- if (!d->eventFilterProxyGraphicsItem)
- d->eventFilterProxyGraphicsItem = new QEventFilterProxyGraphicsItem(this);
- if (graphicsItem)
- graphicsItem->installSceneEventFilter(d->eventFilterProxyGraphicsItem);
-}
-
-/*!
- Returns the graphics item the gesture is filtering events for.
-
- \sa setGraphicsItem()
-*/
-QGraphicsItem* QGesture::graphicsItem() const
-{
- return d_func()->graphicsItem;
-}
-
-/*! \fn void QGesture::reset()
-
- Resets the internal state of the gesture. This function might be called by
- the filterEvent() implementation in a derived class, or by the user to
- cancel a gesture. The base class implementation calls
- updateState(Qt::NoGesture) which emits the cancelled()
- signal if the state() of the gesture indicated it was active.
-*/
-void QGesture::reset()
-{
- updateState(Qt::NoGesture);
-}
-
-QT_END_NAMESPACE
diff --git a/doc/src/snippets/gestures/qstandardgestures.cpp b/doc/src/snippets/gestures/qstandardgestures.cpp
deleted file mode 100644
index b22f6ae..0000000
--- a/doc/src/snippets/gestures/qstandardgestures.cpp
+++ /dev/null
@@ -1,483 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstandardgestures.h"
-#include "qstandardgestures_p.h"
-
-#include <qabstractscrollarea.h>
-#include <qscrollbar.h>
-#include <private/qapplication_p.h>
-#include <private/qevent_p.h>
-#include <private/qwidget_p.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifdef Q_WS_WIN
-QWidgetPrivate *qt_widget_private(QWidget *widget);
-#endif
-
-/*!
- \class QPanGesture
- \since 4.6
-
- \brief The QPanGesture class represents a Pan gesture,
- providing additional information related to panning.
-*/
-
-/*!
- Creates a new Pan gesture handler object and marks it as a child of \a
- parent.
-
- On some platform like Windows it's necessary to provide a non-null widget
- as \a parent to get native gesture support.
-*/
-QPanGesture::QPanGesture(QWidget *parent)
- : QGesture(*new QPanGesturePrivate, parent)
-{
- if (parent) {
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- qAppPriv->widgetGestures[parent].pan = this;
-#ifdef Q_WS_WIN
- qt_widget_private(parent)->winSetupGestures();
-#endif
- }
-}
-
-/*! \internal */
-bool QPanGesture::event(QEvent *event)
-{
- switch (event->type()) {
- case QEvent::ParentAboutToChange:
- if (QWidget *w = qobject_cast<QWidget*>(parent())) {
- QApplicationPrivate::instance()->widgetGestures[w].pan = 0;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- break;
- case QEvent::ParentChange:
- if (QWidget *w = qobject_cast<QWidget*>(parent())) {
- QApplicationPrivate::instance()->widgetGestures[w].pan = this;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- break;
- default:
- break;
- }
-
-#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA)
- Q_D(QPanGesture);
- if (event->type() == QEvent::Timer) {
- const QTimerEvent *te = static_cast<QTimerEvent *>(event);
- if (te->timerId() == d->panFinishedTimer) {
- killTimer(d->panFinishedTimer);
- d->panFinishedTimer = 0;
- d->lastOffset = QSize(0, 0);
- updateState(Qt::GestureFinished);
- }
- }
-#endif
-
- return QObject::event(event);
-}
-
-bool QPanGesture::eventFilter(QObject *receiver, QEvent *event)
-{
-#ifdef Q_WS_WIN
- Q_D(QPanGesture);
- if (receiver->isWidgetType() && event->type() == QEvent::NativeGesture) {
- QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- QApplicationPrivate::WidgetStandardGesturesMap::iterator it;
- it = qAppPriv->widgetGestures.find(static_cast<QWidget*>(receiver));
- if (it == qAppPriv->widgetGestures.end())
- return false;
- if (this != it.value().pan)
- return false;
- Qt::GestureState nextState = Qt::NoGesture;
- switch(ev->gestureType) {
- case QNativeGestureEvent::GestureBegin:
- // next we might receive the first gesture update event, so we
- // prepare for it.
- d->state = Qt::NoGesture;
- return false;
- case QNativeGestureEvent::Pan:
- nextState = Qt::GestureUpdated;
- event->accept();
- break;
- case QNativeGestureEvent::GestureEnd:
- if (state() == Qt::NoGesture)
- return false; // some other gesture has ended
- nextState = Qt::GestureFinished;
- break;
- default:
- return false;
- }
- if (state() == Qt::NoGesture) {
- d->lastOffset = d->totalOffset = QSize();
- } else {
- d->lastOffset = QSize(ev->position.x() - d->lastPosition.x(),
- ev->position.y() - d->lastPosition.y());
- d->totalOffset += d->lastOffset;
- }
- d->lastPosition = ev->position;
- updateState(nextState);
- return true;
- }
-#endif
- return QGesture::eventFilter(receiver, event);
-}
-
-/*! \internal */
-bool QPanGesture::filterEvent(QEvent *event)
-{
- Q_D(QPanGesture);
- if (!event->spontaneous())
- return false;
- const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
- if (event->type() == QEvent::TouchBegin) {
- QTouchEvent::TouchPoint p = ev->touchPoints().at(0);
- d->lastPosition = p.pos().toPoint();
- d->lastOffset = d->totalOffset = QSize();
- } else if (event->type() == QEvent::TouchEnd) {
- if (state() != Qt::NoGesture) {
- if (!ev->touchPoints().isEmpty()) {
- QTouchEvent::TouchPoint p = ev->touchPoints().at(0);
- const QPoint pos = p.pos().toPoint();
- const QPoint lastPos = p.lastPos().toPoint();
- const QPoint startPos = p.startPos().toPoint();
- d->lastOffset = QSize(pos.x() - lastPos.x(), pos.y() - lastPos.y());
- d->totalOffset = QSize(pos.x() - startPos.x(), pos.y() - startPos.y());
- }
- updateState(Qt::GestureFinished);
- }
- reset();
- } else if (event->type() == QEvent::TouchUpdate) {
- QTouchEvent::TouchPoint p = ev->touchPoints().at(0);
- const QPoint pos = p.pos().toPoint();
- const QPoint lastPos = p.lastPos().toPoint();
- const QPoint startPos = p.startPos().toPoint();
- d->lastOffset = QSize(pos.x() - lastPos.x(), pos.y() - lastPos.y());
- d->totalOffset = QSize(pos.x() - startPos.x(), pos.y() - startPos.y());
- if (d->totalOffset.width() > 10 || d->totalOffset.height() > 10 ||
- d->totalOffset.width() < -10 || d->totalOffset.height() < -10) {
- updateState(Qt::GestureUpdated);
- }
- }
-#ifdef Q_OS_MAC
- else if (event->type() == QEvent::Wheel) {
- // On Mac, there is really no native panning gesture. Instead, a two
- // finger pan is delivered as mouse wheel events. Otoh, on Windows, you
- // either get mouse wheel events or pan events. We have decided to make this
- // the Qt behaviour as well, meaning that on Mac, wheel
- // events will be masked away when listening for pan events.
-#ifndef QT_MAC_USE_COCOA
- // In Carbon we receive neither touch-, nor pan gesture events.
- // So we create pan gestures by converting wheel events. After all, this
- // is how things are supposed to work on mac in the first place.
- const QWheelEvent *wev = static_cast<const QWheelEvent*>(event);
- int offset = wev->delta() / -120;
- d->lastOffset = wev->orientation() == Qt::Horizontal ? QSize(offset, 0) : QSize(0, offset);
-
- if (state() == Qt::NoGesture) {
- d->totalOffset = d->lastOffset;
- } else {
- d->totalOffset += d->lastOffset;
- }
-
- killTimer(d->panFinishedTimer);
- d->panFinishedTimer = startTimer(200);
- updateState(Qt::GestureUpdated);
-#endif
- return true;
- }
-#endif
- return false;
-}
-
-/*! \internal */
-void QPanGesture::reset()
-{
- Q_D(QPanGesture);
- d->lastOffset = d->totalOffset = QSize();
- d->lastPosition = QPoint();
-#if defined(Q_OS_MAC) && !defined(QT_MAC_USE_COCOA)
- if (d->panFinishedTimer) {
- killTimer(d->panFinishedTimer);
- d->panFinishedTimer = 0;
- }
-#endif
- QGesture::reset();
-}
-
-/*!
- \property QPanGesture::totalOffset
-
- Specifies a total pan offset since the start of the gesture.
-*/
-QSize QPanGesture::totalOffset() const
-{
- Q_D(const QPanGesture);
- return d->totalOffset;
-}
-
-/*!
- \property QPanGesture::lastOffset
-
- Specifies a pan offset since the last time the gesture was
- triggered.
-*/
-QSize QPanGesture::lastOffset() const
-{
- Q_D(const QPanGesture);
- return d->lastOffset;
-}
-
-
-/*!
- \class QPinchGesture
- \since 4.6
-
- \brief The QPinchGesture class represents a Pinch gesture,
- providing additional information related to zooming and/or rotation.
-*/
-
-/*!
- Creates a new Pinch gesture handler object and marks it as a child of \a
- parent.
-
- On some platform like Windows it's necessary to provide a non-null widget
- as \a parent to get native gesture support.
-*/
-QPinchGesture::QPinchGesture(QWidget *parent)
- : QGesture(*new QPinchGesturePrivate, parent)
-{
- if (parent) {
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- qAppPriv->widgetGestures[parent].pinch = this;
-#ifdef Q_WS_WIN
- qt_widget_private(parent)->winSetupGestures();
-#endif
- }
-}
-
-/*! \internal */
-bool QPinchGesture::event(QEvent *event)
-{
- switch (event->type()) {
- case QEvent::ParentAboutToChange:
- if (QWidget *w = qobject_cast<QWidget*>(parent())) {
- QApplicationPrivate::instance()->widgetGestures[w].pinch = 0;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- break;
- case QEvent::ParentChange:
- if (QWidget *w = qobject_cast<QWidget*>(parent())) {
- QApplicationPrivate::instance()->widgetGestures[w].pinch = this;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- break;
- default:
- break;
- }
- return QObject::event(event);
-}
-
-bool QPinchGesture::eventFilter(QObject *receiver, QEvent *event)
-{
-#ifdef Q_WS_WIN
- Q_D(QPinchGesture);
- if (receiver->isWidgetType() && event->type() == QEvent::NativeGesture) {
- QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- QApplicationPrivate::WidgetStandardGesturesMap::iterator it;
- it = qAppPriv->widgetGestures.find(static_cast<QWidget*>(receiver));
- if (it == qAppPriv->widgetGestures.end())
- return false;
- if (this != it.value().pinch)
- return false;
- Qt::GestureState nextState = Qt::NoGesture;
- switch(ev->gestureType) {
- case QNativeGestureEvent::GestureBegin:
- // next we might receive the first gesture update event, so we
- // prepare for it.
- d->state = Qt::NoGesture;
- d->scaleFactor = d->lastScaleFactor = 1;
- d->rotationAngle = d->lastRotationAngle = 0;
- d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPoint();
- d->initialDistance = 0;
- return false;
- case QNativeGestureEvent::Rotate:
- d->lastRotationAngle = d->rotationAngle;
- d->rotationAngle = -1 * GID_ROTATE_ANGLE_FROM_ARGUMENT(ev->argument);
- nextState = Qt::GestureUpdated;
- event->accept();
- break;
- case QNativeGestureEvent::Zoom:
- if (d->initialDistance != 0) {
- d->lastScaleFactor = d->scaleFactor;
- int distance = int(qint64(ev->argument));
- d->scaleFactor = (qreal) distance / d->initialDistance;
- } else {
- d->initialDistance = int(qint64(ev->argument));
- }
- nextState = Qt::GestureUpdated;
- event->accept();
- break;
- case QNativeGestureEvent::GestureEnd:
- if (state() == Qt::NoGesture)
- return false; // some other gesture has ended
- nextState = Qt::GestureFinished;
- break;
- default:
- return false;
- }
- if (d->startCenterPoint.isNull())
- d->startCenterPoint = d->centerPoint;
- d->lastCenterPoint = d->centerPoint;
- d->centerPoint = static_cast<QWidget*>(receiver)->mapFromGlobal(ev->position);
- updateState(nextState);
- return true;
- }
-#endif
- return QGesture::eventFilter(receiver, event);
-}
-
-/*! \internal */
-bool QPinchGesture::filterEvent(QEvent *event)
-{
- Q_UNUSED(event);
- return false;
-}
-
-/*! \internal */
-void QPinchGesture::reset()
-{
- Q_D(QPinchGesture);
- d->scaleFactor = d->lastScaleFactor = 0;
- d->rotationAngle = d->lastRotationAngle = 0;
- d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPoint();
- QGesture::reset();
-}
-
-/*!
- \property QPinchGesture::scaleFactor
-
- Specifies a scale factor of the pinch gesture.
-*/
-qreal QPinchGesture::scaleFactor() const
-{
- return d_func()->scaleFactor;
-}
-
-/*!
- \property QPinchGesture::lastScaleFactor
-
- Specifies a previous scale factor of the pinch gesture.
-*/
-qreal QPinchGesture::lastScaleFactor() const
-{
- return d_func()->lastScaleFactor;
-}
-
-/*!
- \property QPinchGesture::rotationAngle
-
- Specifies a rotation angle of the gesture.
-*/
-qreal QPinchGesture::rotationAngle() const
-{
- return d_func()->rotationAngle;
-}
-
-/*!
- \property QPinchGesture::lastRotationAngle
-
- Specifies a previous rotation angle of the gesture.
-*/
-qreal QPinchGesture::lastRotationAngle() const
-{
- return d_func()->lastRotationAngle;
-}
-
-/*!
- \property QPinchGesture::centerPoint
-
- Specifies a center point of the gesture. The point can be used as a center
- point that the object is rotated around.
-*/
-QPoint QPinchGesture::centerPoint() const
-{
- return d_func()->centerPoint;
-}
-
-/*!
- \property QPinchGesture::lastCenterPoint
-
- Specifies a previous center point of the gesture.
-*/
-QPoint QPinchGesture::lastCenterPoint() const
-{
- return d_func()->lastCenterPoint;
-}
-
-/*!
- \property QPinchGesture::startCenterPoint
-
- Specifies an initial center point of the gesture. Difference between the
- startCenterPoint and the centerPoint is the distance at which pinching
- fingers has shifted.
-*/
-QPoint QPinchGesture::startCenterPoint() const
-{
- return d_func()->startCenterPoint;
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qstandardgestures.cpp"
-
diff --git a/doc/src/snippets/gestures/qstandardgestures.h b/doc/src/snippets/gestures/qstandardgestures.h
deleted file mode 100644
index efd6c6e..0000000
--- a/doc/src/snippets/gestures/qstandardgestures.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTANDARDGESTURES_H
-#define QSTANDARDGESTURES_H
-
-#include <QtGui/qevent.h>
-#include <QtCore/qbasictimer.h>
-
-#include <QtGui/qgesture.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Gui)
-
-class QPanGesturePrivate;
-class Q_GUI_EXPORT QPanGesture : public QGesture
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QPanGesture)
-
- Q_PROPERTY(QSize totalOffset READ totalOffset)
- Q_PROPERTY(QSize lastOffset READ lastOffset)
-
-public:
- QPanGesture(QWidget *parent);
-
- bool filterEvent(QEvent *event);
-
- QSize totalOffset() const;
- QSize lastOffset() const;
-
-protected:
- void reset();
-
-private:
- bool event(QEvent *event);
- bool eventFilter(QObject *receiver, QEvent *event);
-
- friend class QWidget;
-};
-
-class QPinchGesturePrivate;
-class Q_GUI_EXPORT QPinchGesture : public QGesture
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QPinchGesture)
-
- Q_PROPERTY(qreal scaleFactor READ scaleFactor)
- Q_PROPERTY(qreal lastScaleFactor READ lastScaleFactor)
-
- Q_PROPERTY(qreal rotationAngle READ rotationAngle)
- Q_PROPERTY(qreal lastRotationAngle READ lastRotationAngle)
-
- Q_PROPERTY(QPoint startCenterPoint READ startCenterPoint)
- Q_PROPERTY(QPoint lastCenterPoint READ lastCenterPoint)
- Q_PROPERTY(QPoint centerPoint READ centerPoint)
-
-public:
- QPinchGesture(QWidget *parent);
-
- bool filterEvent(QEvent *event);
- void reset();
-
- QPoint startCenterPoint() const;
- QPoint lastCenterPoint() const;
- QPoint centerPoint() const;
-
- qreal scaleFactor() const;
- qreal lastScaleFactor() const;
-
- qreal rotationAngle() const;
- qreal lastRotationAngle() const;
-
-private:
- bool event(QEvent *event);
- bool eventFilter(QObject *receiver, QEvent *event);
-
- friend class QWidget;
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QSTANDARDGESTURES_H
diff --git a/doc/src/snippets/shareddirmodel/main.cpp b/doc/src/snippets/shareddirmodel/main.cpp
index 82034b5..3cb63c9 100644
--- a/doc/src/snippets/shareddirmodel/main.cpp
+++ b/doc/src/snippets/shareddirmodel/main.cpp
@@ -55,7 +55,8 @@ int main(int argc, char *argv[])
QSplitter *splitter = new QSplitter;
//! [2] //! [3]
- QDirModel *model = new QDirModel;
+ QFileSystemModel *model = new QFileSystemModel;
+ model->setRootPath(QDir::currentPath());
//! [0] //! [2] //! [4] //! [5]
QTreeView *tree = new QTreeView(splitter);
//! [3] //! [6]
@@ -74,7 +75,7 @@ int main(int argc, char *argv[])
list->setSelectionModel(selection);
//! [8]
- splitter->setWindowTitle("Two views onto the same directory model");
+ splitter->setWindowTitle("Two views onto the same file system model");
splitter->show();
return app.exec();
}
diff --git a/doc/src/snippets/simplemodel-use/main.cpp b/doc/src/snippets/simplemodel-use/main.cpp
index a3bb0e7..d7fc755 100644
--- a/doc/src/snippets/simplemodel-use/main.cpp
+++ b/doc/src/snippets/simplemodel-use/main.cpp
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
layout->addWidget(title);
//! [0]
- QDirModel *model = new QDirModel;
+ QFileSystemModel *model = new QFileSystemModel;
QModelIndex parentIndex = model->index(QDir::currentPath());
int numRows = model->rowCount(parentIndex);
//! [0]
diff --git a/examples/effects/effects.pro b/examples/effects/effects.pro
index 01fa293..2dec8d5 100644
--- a/examples/effects/effects.pro
+++ b/examples/effects/effects.pro
@@ -5,7 +5,11 @@ SUBDIRS = \
lighting \
fademessage
-contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2):SUBDIRS += customshader
+!contains(QT_CONFIG, opengles1):!contains(QT_CONFIG, opengles1cl) {
+ contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) {
+ SUBDIRS += customshader
+ }
+}
# install
target.path = $$[QT_INSTALL_EXAMPLES]/effects
diff --git a/examples/examples.pro b/examples/examples.pro
index 7acd67b..d11e36b 100644
--- a/examples/examples.pro
+++ b/examples/examples.pro
@@ -39,8 +39,7 @@ symbian: SUBDIRS = \
xml
contains(QT_CONFIG, multimedia) {
- SUBDIRS += video
- !static: SUBDIRS += multimedia
+ SUBDIRS += multimedia
}
contains(QT_CONFIG, script): SUBDIRS += script
diff --git a/examples/gestures/gestures.pro b/examples/gestures/gestures.pro
index 09cd56a..e3978b6 100644
--- a/examples/gestures/gestures.pro
+++ b/examples/gestures/gestures.pro
@@ -1,7 +1,7 @@
TEMPLATE = \
subdirs
SUBDIRS = \
- imageviewer
+ imagegestures
# install
target.path = $$[QT_INSTALL_EXAMPLES]/gestures
diff --git a/examples/gestures/imagegestures/imagegestures.pro b/examples/gestures/imagegestures/imagegestures.pro
new file mode 100644
index 0000000..7780ad9
--- /dev/null
+++ b/examples/gestures/imagegestures/imagegestures.pro
@@ -0,0 +1,16 @@
+HEADERS = imagewidget.h \
+ mainwidget.h
+SOURCES = imagewidget.cpp \
+ main.cpp \
+ mainwidget.cpp
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/gestures/imageviewer
+sources.files = $$SOURCES \
+ $$HEADERS \
+ $$RESOURCES \
+ $$FORMS \
+ imageviewer.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/gestures/imageviewer
+INSTALLS += target \
+ sources
diff --git a/examples/gestures/imageviewer/imagewidget.cpp b/examples/gestures/imagegestures/imagewidget.cpp
index 3489b5b..28de6da 100644
--- a/examples/gestures/imageviewer/imagewidget.cpp
+++ b/examples/gestures/imagegestures/imagewidget.cpp
@@ -43,6 +43,7 @@
#include <QtGui>
+//! [constructor]
ImageWidget::ImageWidget(QWidget *parent)
: QWidget(parent),
position(0),
@@ -52,32 +53,24 @@ ImageWidget::ImageWidget(QWidget *parent)
scaleFactor(1)
{
- setObjectName("ImageWidget");
setMinimumSize(QSize(100,100));
- setAttribute(Qt::WA_PaintOnScreen);
- setAttribute(Qt::WA_OpaquePaintEvent);
- setAttribute(Qt::WA_NoSystemBackground);
-
- QGesture *panGesture = new QPanGesture(this);
- connect(panGesture, SIGNAL(started()), this, SLOT(panTriggered()));
- connect(panGesture, SIGNAL(finished()), this, SLOT(panTriggered()));
- connect(panGesture, SIGNAL(canceled()), this, SLOT(panTriggered()));
- connect(panGesture, SIGNAL(triggered()), this, SLOT(panTriggered()));
-
- QGesture *pinchGesture = new QPinchGesture(this);
- connect(pinchGesture, SIGNAL(started()), this, SLOT(pinchTriggered()));
- connect(pinchGesture, SIGNAL(finished()), this, SLOT(pinchTriggered()));
- connect(pinchGesture, SIGNAL(canceled()), this, SLOT(pinchTriggered()));
- connect(pinchGesture, SIGNAL(triggered()), this, SLOT(pinchTriggered()));
-
-//! [construct swipe gesture]
- QGesture *swipeGesture = new QSwipeGesture(this);
-//! [construct swipe gesture]
-//! [connect swipe gesture]
- connect(swipeGesture, SIGNAL(triggered()), this, SLOT(swipeTriggered()));
-//! [connect swipe gesture]
+//! [enable gestures]
+ grabGesture(Qt::PanGesture);
+ grabGesture(Qt::PinchGesture);
+ grabGesture(Qt::SwipeGesture);
+//! [enable gestures]
}
+//! [constructor]
+
+//! [event handler]
+bool ImageWidget::event(QEvent *event)
+{
+ if (event->type() == QEvent::Gesture)
+ return gestureEvent(static_cast<QGestureEvent*>(event));
+ return QWidget::event(event);
+}
+//! [event handler]
void ImageWidget::paintEvent(QPaintEvent*)
{
@@ -106,11 +99,27 @@ void ImageWidget::mouseDoubleClickEvent(QMouseEvent *)
update();
}
-void ImageWidget::panTriggered()
+//! [gesture event handler]
+bool ImageWidget::gestureEvent(QGestureEvent *event)
+{
+ if (QGesture *pan = event->gesture(Qt::PanGesture)) {
+ panTriggered(static_cast<QPanGesture*>(pan));
+ return true;
+ } else if (QGesture *pinch = event->gesture(Qt::PinchGesture)) {
+ pinchTriggered(static_cast<QPinchGesture*>(pinch));
+ return true;
+ } else if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {
+ swipeTriggered(static_cast<QSwipeGesture*>(swipe));
+ return true;
+ }
+ return false;
+}
+//! [gesture event handler]
+
+void ImageWidget::panTriggered(QPanGesture *gesture)
{
- QPanGesture *pg = qobject_cast<QPanGesture*>(sender());
#ifndef QT_NO_CURSOR
- switch (pg->state()) {
+ switch (gesture->state()) {
case Qt::GestureStarted:
case Qt::GestureUpdated:
setCursor(Qt::SizeAllCursor);
@@ -119,33 +128,39 @@ void ImageWidget::panTriggered()
setCursor(Qt::ArrowCursor);
}
#endif
- horizontalOffset += pg->lastOffset().width();
- verticalOffset += pg->lastOffset().height();
+ QPointF lastOffset = gesture->offset();
+ horizontalOffset += lastOffset.x();
+ verticalOffset += lastOffset.y();
update();
}
-void ImageWidget::pinchTriggered()
+void ImageWidget::pinchTriggered(QPinchGesture *gesture)
{
- QPinchGesture *pg = qobject_cast<QPinchGesture*>(sender());
- if (pg->whatChanged() & QPinchGesture::RotationAngleChanged)
- rotationAngle += pg->rotationAngle() - pg->lastRotationAngle();
- if (pg->whatChanged() & QPinchGesture::ScaleFactorChanged)
- scaleFactor += pg->scaleFactor() - pg->lastScaleFactor();
+ QPinchGesture::WhatChanged whatChanged = gesture->whatChanged();
+ if (whatChanged & QPinchGesture::RotationAngleChanged) {
+ qreal value = gesture->property("rotationAngle").toReal();
+ qreal lastValue = gesture->property("lastRotationAngle").toReal();
+ rotationAngle += value - lastValue;
+ }
+ if (whatChanged & QPinchGesture::ScaleFactorChanged) {
+ qreal value = gesture->property("scaleFactor").toReal();
+ qreal lastValue = gesture->property("lastScaleFactor").toReal();
+ scaleFactor += value - lastValue;
+ }
update();
}
-//! [swipe slot start]
-void ImageWidget::swipeTriggered()
+//! [swipe function]
+void ImageWidget::swipeTriggered(QSwipeGesture *gesture)
{
- QSwipeGesture *pg = qobject_cast<QSwipeGesture*>(sender());
- if (pg->horizontalDirection() == QSwipeGesture::Left
- || pg->verticalDirection() == QSwipeGesture::Up)
+ if (gesture->horizontalDirection() == QSwipeGesture::Left
+ || gesture->verticalDirection() == QSwipeGesture::Up)
goPrevImage();
else
goNextImage();
update();
}
-//! [swipe slot start]
+//! [swipe function]
void ImageWidget::resizeEvent(QResizeEvent*)
{
diff --git a/examples/gestures/imageviewer/imagewidget.h b/examples/gestures/imagegestures/imagewidget.h
index 2a1bfca..56e2316 100644
--- a/examples/gestures/imageviewer/imagewidget.h
+++ b/examples/gestures/imagegestures/imagewidget.h
@@ -46,26 +46,35 @@
#include <QImage>
#include <QtGui>
+QT_BEGIN_NAMESPACE
+class QGestureEvent;
+class QPanGesture;
+class QPinchGesture;
+class QSwipeGesture;
+QT_END_NAMESPACE
+
+//! [class definition begin]
class ImageWidget : public QWidget
{
Q_OBJECT
public:
ImageWidget(QWidget *parent = 0);
-
void openDirectory(const QString &path);
protected:
- void paintEvent(QPaintEvent*);
- void resizeEvent(QResizeEvent*);
- void mouseDoubleClickEvent(QMouseEvent*);
-
-private slots:
- void panTriggered();
- void pinchTriggered();
- void swipeTriggered();
+ bool event(QEvent *event);
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ void mouseDoubleClickEvent(QMouseEvent *event);
private:
+ bool gestureEvent(QGestureEvent *event);
+ void panTriggered(QPanGesture*);
+ void pinchTriggered(QPinchGesture*);
+ void swipeTriggered(QSwipeGesture*);
+//! [class definition begin]
+
void updateImage();
QImage loadImage(const QString &fileName);
void loadImage();
@@ -84,6 +93,8 @@ private:
float verticalOffset;
float rotationAngle;
float scaleFactor;
+//! [class definition end]
};
+//! [class definition end]
#endif
diff --git a/examples/gestures/imagegestures/main.cpp b/examples/gestures/imagegestures/main.cpp
new file mode 100644
index 0000000..9c99f31
--- /dev/null
+++ b/examples/gestures/imagegestures/main.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "mainwidget.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ MainWidget w;
+ w.show();
+
+ if (QApplication::arguments().size() > 1)
+ w.openDirectory(QApplication::arguments().at(1));
+ else
+ w.openDirectory(QFileDialog::getExistingDirectory(0, "Select image folder"));
+
+ return app.exec();
+}
diff --git a/examples/gestures/imagegestures/mainwidget.cpp b/examples/gestures/imagegestures/mainwidget.cpp
new file mode 100644
index 0000000..51e9f1e
--- /dev/null
+++ b/examples/gestures/imagegestures/mainwidget.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "imagewidget.h"
+#include "mainwidget.h"
+
+MainWidget::MainWidget(QWidget *parent)
+ : QMainWindow(parent)
+{
+ resize(400, 300);
+ imageWidget = new ImageWidget(this);
+ setCentralWidget(imageWidget);
+}
+
+void MainWidget::openDirectory(const QString &path)
+{
+ imageWidget->openDirectory(path);
+}
diff --git a/examples/gestures/imagegestures/mainwidget.h b/examples/gestures/imagegestures/mainwidget.h
new file mode 100644
index 0000000..71b09b0
--- /dev/null
+++ b/examples/gestures/imagegestures/mainwidget.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MAINWIDGET_H
+#define MAINWIDGET_H
+
+#include <QMainWindow>
+
+class ImageWidget;
+
+class MainWidget : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWidget(QWidget *parent = 0);
+
+public slots:
+ void openDirectory(const QString &path);
+
+private:
+ bool loadImage(const QString &fileName);
+
+ ImageWidget *imageWidget;
+};
+
+#endif
diff --git a/examples/gestures/imageviewer/imageviewer.pro b/examples/gestures/imageviewer/imageviewer.pro
deleted file mode 100644
index 124175e..0000000
--- a/examples/gestures/imageviewer/imageviewer.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-HEADERS += imagewidget.h \
- tapandholdgesture.h
-SOURCES += imagewidget.cpp \
- tapandholdgesture.cpp \
- main.cpp
-
-# install
-target.path = $$[QT_INSTALL_EXAMPLES]/gestures/imageviewer
-sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS imageviewer.pro
-sources.path = $$[QT_INSTALL_EXAMPLES]/gestures/imageviewer
-INSTALLS += target sources
diff --git a/examples/gestures/imageviewer/tapandholdgesture.cpp b/examples/gestures/imageviewer/tapandholdgesture.cpp
deleted file mode 100644
index a10c192..0000000
--- a/examples/gestures/imageviewer/tapandholdgesture.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "tapandholdgesture.h"
-
-#include <QtGui/qevent.h>
-
-// #define TAPANDHOLD_USING_MOUSE
-
-/*!
- \class TapAndHoldGesture
- \since 4.6
-
- \brief The TapAndHoldGesture class represents a Tap-and-Hold gesture,
- providing additional information.
-*/
-
-const int TapAndHoldGesture::iterationCount = 40;
-const int TapAndHoldGesture::iterationTimeout = 50;
-
-/*!
- Creates a new Tap and Hold gesture handler object and marks it as a child
- of \a parent.
-
- On some platforms like Windows there is a system-wide tap and hold gesture
- that cannot be overriden, hence the gesture might never trigger and default
- context menu will be shown instead.
-*/
-TapAndHoldGesture::TapAndHoldGesture(QWidget *parent)
- : QGesture(parent), iteration(0)
-{
-}
-
-/*! \internal */
-bool TapAndHoldGesture::filterEvent(QEvent *event)
-{
- const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
- switch (event->type()) {
- case QEvent::TouchBegin: {
- if (timer.isActive())
- timer.stop();
- timer.start(TapAndHoldGesture::iterationTimeout, this);
- const QPoint p = ev->touchPoints().at(0).pos().toPoint();
- position = p;
- break;
- }
- case QEvent::TouchUpdate:
- if (ev->touchPoints().size() == 1) {
- const QPoint startPos = ev->touchPoints().at(0).startPos().toPoint();
- const QPoint pos = ev->touchPoints().at(0).pos().toPoint();
- if ((startPos - pos).manhattanLength() > 15)
- reset();
- } else {
- reset();
- }
- break;
- case QEvent::TouchEnd:
- reset();
- break;
-#ifdef TAPANDHOLD_USING_MOUSE
- case QEvent::MouseButtonPress: {
- if (timer.isActive())
- timer.stop();
- timer.start(TapAndHoldGesture::iterationTimeout, this);
- const QPoint p = static_cast<QMouseEvent*>(event)->pos();
- position = startPosition = p;
- break;
- }
- case QEvent::MouseMove: {
- const QPoint startPos = startPosition;
- const QPoint pos = static_cast<QMouseEvent*>(event)->pos();
- if ((startPos - pos).manhattanLength() > 15)
- reset();
- break;
- }
- case QEvent::MouseButtonRelease:
- reset();
- break;
-#endif // TAPANDHOLD_USING_MOUSE
- default:
- break;
- }
- return false;
-}
-
-/*! \internal */
-void TapAndHoldGesture::timerEvent(QTimerEvent *event)
-{
- if (event->timerId() != timer.timerId())
- return;
- if (iteration == TapAndHoldGesture::iterationCount) {
- timer.stop();
- updateState(Qt::GestureFinished);
- } else {
- updateState(Qt::GestureUpdated);
- }
- ++iteration;
-}
-
-/*! \internal */
-void TapAndHoldGesture::reset()
-{
- timer.stop();
- iteration = 0;
- position = startPosition = QPoint();
- updateState(Qt::NoGesture);
-}
-
-/*!
- \property TapAndHoldGesture::pos
-
- \brief The position of the gesture.
-*/
-QPoint TapAndHoldGesture::pos() const
-{
- return position;
-}
diff --git a/examples/gestures/imageviewer/tapandholdgesture.h b/examples/gestures/imageviewer/tapandholdgesture.h
deleted file mode 100644
index 682342e..0000000
--- a/examples/gestures/imageviewer/tapandholdgesture.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef TAPANDHOLDGESTURE_H
-#define TAPANDHOLDGESTURE_H
-
-#include <QtCore/QBasicTimer>
-#include <QtGui/QGesture>
-#include <QtGui/QWidget>
-
-class TapAndHoldGesture : public QGesture
-{
- Q_OBJECT
- Q_PROPERTY(QPoint pos READ pos)
-
-public:
- TapAndHoldGesture(QWidget *parent);
-
- bool filterEvent(QEvent *event);
- void reset();
-
- QPoint pos() const;
-
-protected:
- void timerEvent(QTimerEvent *event);
-
-private:
- QBasicTimer timer;
- int iteration;
- QPoint position;
- QPoint startPosition;
- static const int iterationCount;
- static const int iterationTimeout;
-};
-
-#endif // TAPANDHOLDGESTURE_H
diff --git a/examples/graphicsview/anchorlayout/anchorlayout.pro b/examples/graphicsview/anchorlayout/anchorlayout.pro
index c2a1bea..fd085cc 100644
--- a/examples/graphicsview/anchorlayout/anchorlayout.pro
+++ b/examples/graphicsview/anchorlayout/anchorlayout.pro
@@ -1,9 +1,4 @@
-######################################################################
-# Automatically generated by qmake (2.01a) Tue May 12 15:22:25 2009
-######################################################################
-
-# Input
-SOURCES += main.cpp
+SOURCES = main.cpp
# install
target.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/anchorlayout
@@ -11,5 +6,4 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES anchorlayout.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/anchorlayout
INSTALLS += target sources
-TARGET = anchorlayout_example
-CONFIG+=console \ No newline at end of file
+TARGET = anchorlayout
diff --git a/examples/graphicsview/graphicsview.pro b/examples/graphicsview/graphicsview.pro
index 0408111..a919c74 100644
--- a/examples/graphicsview/graphicsview.pro
+++ b/examples/graphicsview/graphicsview.pro
@@ -8,6 +8,7 @@ SUBDIRS = \
!symbian: SUBDIRS += \
diagramscene \
dragdroprobot \
+ flowlayout \
anchorlayout
contains(QT_CONFIG, qt3support):SUBDIRS += portedcanvas portedasteroids
diff --git a/examples/graphicsview/simpleanchorlayout/main.cpp b/examples/graphicsview/simpleanchorlayout/main.cpp
new file mode 100644
index 0000000..493b00f
--- /dev/null
+++ b/examples/graphicsview/simpleanchorlayout/main.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+class Widget : public QGraphicsWidget
+{
+public:
+ Widget(const QColor &color, const QColor &textColor, const QString &caption,
+ QGraphicsItem *parent = 0)
+ : QGraphicsWidget(parent), caption(caption), color(color), textColor(textColor)
+ {
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
+ {
+ QFont font;
+ font.setPixelSize(0.75 * qMin(boundingRect().width(), boundingRect().height()));
+
+ painter->fillRect(boundingRect(), color);
+ painter->save();
+ painter->setFont(font);
+ painter->setPen(textColor);
+ painter->drawText(boundingRect(), Qt::AlignCenter, caption);
+ painter->restore();
+ }
+
+private:
+ QString caption;
+ QColor color;
+ QColor textColor;
+};
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ QGraphicsScene *scene = new QGraphicsScene();
+
+ Widget *a = new Widget(Qt::blue, Qt::white, "a");
+ a->setPreferredSize(100, 100);
+ Widget *b = new Widget(Qt::green, Qt::black, "b");
+ b->setPreferredSize(100, 100);
+ Widget *c = new Widget(Qt::red, Qt::black, "c");
+ c->setPreferredSize(100, 100);
+
+ QGraphicsAnchorLayout *layout = new QGraphicsAnchorLayout();
+/*
+ //! [adding a corner anchor in two steps]
+ layout->addAnchor(a, Qt::AnchorTop, layout, Qt::AnchorTop);
+ layout->addAnchor(a, Qt::AnchorLeft, layout, Qt::AnchorLeft);
+ //! [adding a corner anchor in two steps]
+*/
+ //! [adding a corner anchor]
+ layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);
+ //! [adding a corner anchor]
+
+ //! [adding anchors]
+ layout->addAnchor(b, Qt::AnchorLeft, a, Qt::AnchorRight);
+ layout->addAnchor(b, Qt::AnchorTop, a, Qt::AnchorBottom);
+ //! [adding anchors]
+
+ // Place a third widget below the second.
+ layout->addAnchor(b, Qt::AnchorBottom, c, Qt::AnchorTop);
+
+/*
+ //! [adding anchors to match sizes in two steps]
+ layout->addAnchor(b, Qt::AnchorLeft, c, Qt::AnchorLeft);
+ layout->addAnchor(b, Qt::AnchorRight, c, Qt::AnchorRight);
+ //! [adding anchors to match sizes in two steps]
+*/
+
+ //! [adding anchors to match sizes]
+ layout->addAnchors(b, c, Qt::Horizontal);
+ //! [adding anchors to match sizes]
+
+ // Anchor the bottom-right corner of the third widget to the bottom-right
+ // corner of the layout.
+ layout->addCornerAnchors(c, Qt::BottomRightCorner, layout, Qt::BottomRightCorner);
+
+ QGraphicsWidget *w = new QGraphicsWidget(0, Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
+ w->setPos(20, 20);
+ w->setMinimumSize(100, 100);
+ w->setPreferredSize(320, 240);
+ w->setLayout(layout);
+ w->setWindowTitle(QApplication::translate("simpleanchorlayout", "QGraphicsAnchorLayout in use"));
+ scene->addItem(w);
+
+ QGraphicsView *view = new QGraphicsView();
+ view->setScene(scene);
+ view->setWindowTitle(QApplication::translate("simpleanchorlayout", "Simple Anchor Layout"));
+ view->resize(360, 320);
+ view->show();
+
+ return app.exec();
+}
diff --git a/examples/graphicsview/simpleanchorlayout/simpleanchorlayout.pro b/examples/graphicsview/simpleanchorlayout/simpleanchorlayout.pro
new file mode 100644
index 0000000..e1c7aeb
--- /dev/null
+++ b/examples/graphicsview/simpleanchorlayout/simpleanchorlayout.pro
@@ -0,0 +1,9 @@
+SOURCES = main.cpp
+
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/simpleanchorlayout
+sources.files = $$SOURCES $$HEADERS $$RESOURCES simpleanchorlayout.pro
+sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/simpleanchorlayout
+INSTALLS += target sources
+
+TARGET = simpleanchorlayout
diff --git a/examples/multimedia/audio/audio.pro b/examples/multimedia/audio/audio.pro
deleted file mode 100644
index c64bb34..0000000
--- a/examples/multimedia/audio/audio.pro
+++ /dev/null
@@ -1,10 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = audioinput \
- audiooutput \
- audiodevices
-
-# install
-target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio
-sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS audio.pro README
-sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio
-INSTALLS += target sources
diff --git a/examples/multimedia/audio/audiodevices/audiodevices.cpp b/examples/multimedia/audiodevices/audiodevices.cpp
index 4198605..4198605 100644
--- a/examples/multimedia/audio/audiodevices/audiodevices.cpp
+++ b/examples/multimedia/audiodevices/audiodevices.cpp
diff --git a/examples/multimedia/audio/audiodevices/audiodevices.h b/examples/multimedia/audiodevices/audiodevices.h
index 5fe5547..5fe5547 100644
--- a/examples/multimedia/audio/audiodevices/audiodevices.h
+++ b/examples/multimedia/audiodevices/audiodevices.h
diff --git a/examples/multimedia/audio/audiodevices/audiodevices.pro b/examples/multimedia/audiodevices/audiodevices.pro
index 173aa8f..232da09 100644
--- a/examples/multimedia/audio/audiodevices/audiodevices.pro
+++ b/examples/multimedia/audiodevices/audiodevices.pro
@@ -6,9 +6,9 @@ FORMS += audiodevicesbase.ui
QT += multimedia
# install
-target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiodevices
+target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiodevices
sources.files = $$SOURCES *.h $$RESOURCES $$FORMS audiodevices.pro
-sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiodevices
+sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiodevices
INSTALLS += target sources
symbian {
diff --git a/examples/multimedia/audio/audiodevices/audiodevicesbase.ui b/examples/multimedia/audiodevices/audiodevicesbase.ui
index 5207338..5207338 100644
--- a/examples/multimedia/audio/audiodevices/audiodevicesbase.ui
+++ b/examples/multimedia/audiodevices/audiodevicesbase.ui
diff --git a/examples/multimedia/audio/audiodevices/main.cpp b/examples/multimedia/audiodevices/main.cpp
index d5ddd4f..d5ddd4f 100644
--- a/examples/multimedia/audio/audiodevices/main.cpp
+++ b/examples/multimedia/audiodevices/main.cpp
diff --git a/examples/multimedia/audio/audioinput/audioinput.cpp b/examples/multimedia/audioinput/audioinput.cpp
index 05723ae..3d537a2 100644
--- a/examples/multimedia/audio/audioinput/audioinput.cpp
+++ b/examples/multimedia/audioinput/audioinput.cpp
@@ -216,7 +216,7 @@ InputTest::~InputTest() {}
void InputTest::status()
{
- qWarning()<<"bytesReady = "<<audioInput->bytesReady()<<" bytes, clock = "<<audioInput->clock()<<"ms, totalTime = "<<audioInput->totalTime()/1000<<"ms";
+ qWarning()<<"bytesReady = "<<audioInput->bytesReady()<<" bytes, clock = "<<audioInput->clock()/1000<<"ms, totalTime = "<<audioInput->totalTime()/1000<<"ms";
}
void InputTest::readMore()
diff --git a/examples/multimedia/audio/audioinput/audioinput.h b/examples/multimedia/audioinput/audioinput.h
index 14e1bac..14e1bac 100644
--- a/examples/multimedia/audio/audioinput/audioinput.h
+++ b/examples/multimedia/audioinput/audioinput.h
diff --git a/examples/multimedia/audio/audioinput/audioinput.pro b/examples/multimedia/audioinput/audioinput.pro
index 0d6198d..a54d452 100644
--- a/examples/multimedia/audio/audioinput/audioinput.pro
+++ b/examples/multimedia/audioinput/audioinput.pro
@@ -5,9 +5,9 @@ SOURCES = audioinput.cpp \
QT += multimedia
# install
-target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audioinput
+target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audioinput
sources.files = $$SOURCES *.h $$RESOURCES $$FORMS audioinput.pro
-sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audioinput
+sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audioinput
INSTALLS += target sources
symbian {
diff --git a/examples/multimedia/audio/audioinput/main.cpp b/examples/multimedia/audioinput/main.cpp
index d7e9c6c..d7e9c6c 100644
--- a/examples/multimedia/audio/audioinput/main.cpp
+++ b/examples/multimedia/audioinput/main.cpp
diff --git a/examples/multimedia/audio/audiooutput/audiooutput.cpp b/examples/multimedia/audiooutput/audiooutput.cpp
index 9e532cd..c92bbaf 100644
--- a/examples/multimedia/audio/audiooutput/audiooutput.cpp
+++ b/examples/multimedia/audiooutput/audiooutput.cpp
@@ -200,7 +200,7 @@ void AudioTest::deviceChanged(int idx)
void AudioTest::status()
{
- qWarning()<<"byteFree = "<<audioOutput->bytesFree()<<" bytes, clock = "<<audioOutput->clock()<<"ms, totalTime = "<<audioOutput->totalTime()/1000<<"ms";
+ qWarning()<<"byteFree = "<<audioOutput->bytesFree()<<" bytes, clock = "<<audioOutput->clock()/1000<<"ms, totalTime = "<<audioOutput->totalTime()/1000<<"ms";
}
void AudioTest::writeMore()
diff --git a/examples/multimedia/audio/audiooutput/audiooutput.h b/examples/multimedia/audiooutput/audiooutput.h
index 6c07a3a..6c07a3a 100644
--- a/examples/multimedia/audio/audiooutput/audiooutput.h
+++ b/examples/multimedia/audiooutput/audiooutput.h
diff --git a/examples/multimedia/audio/audiooutput/audiooutput.pro b/examples/multimedia/audiooutput/audiooutput.pro
index b43763c..26f68fe 100644
--- a/examples/multimedia/audio/audiooutput/audiooutput.pro
+++ b/examples/multimedia/audiooutput/audiooutput.pro
@@ -5,9 +5,9 @@ SOURCES = audiooutput.cpp \
QT += multimedia
# install
-target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiooutput
+target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiooutput
sources.files = $$SOURCES *.h $$RESOURCES $$FORMS audiooutput.pro
-sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audio/audiooutput
+sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiooutput
INSTALLS += target sources
symbian {
diff --git a/examples/multimedia/audio/audiooutput/main.cpp b/examples/multimedia/audiooutput/main.cpp
index 79ec99e..79ec99e 100644
--- a/examples/multimedia/audio/audiooutput/main.cpp
+++ b/examples/multimedia/audiooutput/main.cpp
diff --git a/examples/multimedia/multimedia.pro b/examples/multimedia/multimedia.pro
index ac78b15..4a764f2 100644
--- a/examples/multimedia/multimedia.pro
+++ b/examples/multimedia/multimedia.pro
@@ -1,5 +1,15 @@
-TEMPLATE = subdirs
-SUBDIRS = audio
+TEMPLATE = subdirs
+
+!static {
+ SUBDIRS += \
+ audiodevices \
+ audioinput \
+ audiooutput
+}
+
+SUBDIRS += \
+ videographicsitem \
+ videowidget
# install
target.path = $$[QT_INSTALL_EXAMPLES]/multimedia
diff --git a/examples/video/videographicsitem/main.cpp b/examples/multimedia/videographicsitem/main.cpp
index 3bf4c6d..3bf4c6d 100644
--- a/examples/video/videographicsitem/main.cpp
+++ b/examples/multimedia/videographicsitem/main.cpp
diff --git a/examples/video/videographicsitem/videographicsitem.pro b/examples/multimedia/videographicsitem/videographicsitem.pro
index d79c3fb..7c118cc 100644
--- a/examples/video/videographicsitem/videographicsitem.pro
+++ b/examples/multimedia/videographicsitem/videographicsitem.pro
@@ -10,9 +10,9 @@ SOURCES += main.cpp \
videoitem.cpp
# install
-target.path = $$[QT_INSTALL_EXAMPLES]/video/videographicsitem
+target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/videographicsitem
sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES *.pro *.png images
-sources.path = $$[QT_INSTALL_EXAMPLES]/video/videographicsitem
+sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/videographicsitem
INSTALLS += target sources
symbian {
diff --git a/examples/video/videographicsitem/videoitem.cpp b/examples/multimedia/videographicsitem/videoitem.cpp
index c95e335..c95e335 100644
--- a/examples/video/videographicsitem/videoitem.cpp
+++ b/examples/multimedia/videographicsitem/videoitem.cpp
diff --git a/examples/video/videographicsitem/videoitem.h b/examples/multimedia/videographicsitem/videoitem.h
index 96f578a..96f578a 100644
--- a/examples/video/videographicsitem/videoitem.h
+++ b/examples/multimedia/videographicsitem/videoitem.h
diff --git a/examples/video/videographicsitem/videoplayer.cpp b/examples/multimedia/videographicsitem/videoplayer.cpp
index 83644db..83644db 100644
--- a/examples/video/videographicsitem/videoplayer.cpp
+++ b/examples/multimedia/videographicsitem/videoplayer.cpp
diff --git a/examples/video/videographicsitem/videoplayer.h b/examples/multimedia/videographicsitem/videoplayer.h
index 8e73e4c..8e73e4c 100644
--- a/examples/video/videographicsitem/videoplayer.h
+++ b/examples/multimedia/videographicsitem/videoplayer.h
diff --git a/examples/video/videowidget/main.cpp b/examples/multimedia/videowidget/main.cpp
index f5edf73..f5edf73 100644
--- a/examples/video/videowidget/main.cpp
+++ b/examples/multimedia/videowidget/main.cpp
diff --git a/examples/video/videowidget/videoplayer.cpp b/examples/multimedia/videowidget/videoplayer.cpp
index ed24714..ed24714 100644
--- a/examples/video/videowidget/videoplayer.cpp
+++ b/examples/multimedia/videowidget/videoplayer.cpp
diff --git a/examples/video/videowidget/videoplayer.h b/examples/multimedia/videowidget/videoplayer.h
index 6547415..6547415 100644
--- a/examples/video/videowidget/videoplayer.h
+++ b/examples/multimedia/videowidget/videoplayer.h
diff --git a/examples/video/videowidget/videowidget.cpp b/examples/multimedia/videowidget/videowidget.cpp
index 80688e1..80688e1 100644
--- a/examples/video/videowidget/videowidget.cpp
+++ b/examples/multimedia/videowidget/videowidget.cpp
diff --git a/examples/video/videowidget/videowidget.h b/examples/multimedia/videowidget/videowidget.h
index 8c343bf..8c343bf 100644
--- a/examples/video/videowidget/videowidget.h
+++ b/examples/multimedia/videowidget/videowidget.h
diff --git a/examples/video/videowidget/videowidget.pro b/examples/multimedia/videowidget/videowidget.pro
index 4a1d717..3f93745 100644
--- a/examples/video/videowidget/videowidget.pro
+++ b/examples/multimedia/videowidget/videowidget.pro
@@ -13,6 +13,12 @@ SOURCES = \
videowidget.cpp \
videowidgetsurface.cpp
+# install
+target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/videowidget
+sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES *.pro *.png images
+sources.path = $$[QT_INSTALL_EXAMPLES]/multimedia/videowidget
+INSTALLS += target sources
+
symbian {
TARGET.UID3 = 0xA000D7C3
include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
diff --git a/examples/video/videowidget/videowidgetsurface.cpp b/examples/multimedia/videowidget/videowidgetsurface.cpp
index ec9b8b5..ec9b8b5 100644
--- a/examples/video/videowidget/videowidgetsurface.cpp
+++ b/examples/multimedia/videowidget/videowidgetsurface.cpp
diff --git a/examples/video/videowidget/videowidgetsurface.h b/examples/multimedia/videowidget/videowidgetsurface.h
index 83439d3..83439d3 100644
--- a/examples/video/videowidget/videowidgetsurface.h
+++ b/examples/multimedia/videowidget/videowidgetsurface.h
diff --git a/examples/opengl/pbuffers/cube.h b/examples/opengl/pbuffers/cube.h
index c882f1f..f17299f 100644
--- a/examples/opengl/pbuffers/cube.h
+++ b/examples/opengl/pbuffers/cube.h
@@ -48,7 +48,9 @@
#include <QtGui/qvector3d.h>
#include <QtGui/qvector2d.h>
+QT_BEGIN_NAMESPACE
class QPropertyAnimation;
+QT_END_NAMESPACE
class Geometry
{
diff --git a/examples/opengl/pbuffers/glwidget.h b/examples/opengl/pbuffers/glwidget.h
index c019abe..1b46bfd 100644
--- a/examples/opengl/pbuffers/glwidget.h
+++ b/examples/opengl/pbuffers/glwidget.h
@@ -47,7 +47,9 @@
class Geometry;
class Cube;
class Tile;
+QT_BEGIN_NAMESPACE
class QGLPixelBuffer;
+QT_END_NAMESPACE
class GLWidget : public QGLWidget
{
diff --git a/examples/qws/ahigl/ahigl.pro b/examples/qws/ahigl/ahigl.pro
deleted file mode 100644
index 1ee8e6e..0000000
--- a/examples/qws/ahigl/ahigl.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-TEMPLATE = lib
-QT += opengl
-CONFIG += plugin
-
-TARGET = qahiglscreen
-
-target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
-INSTALLS += target
-
-HEADERS = qwindowsurface_ahigl_p.h \
- qscreenahigl_qws.h
-
-SOURCES = qwindowsurface_ahigl.cpp \
- qscreenahigl_qws.cpp \
- qscreenahiglplugin.cpp
-
diff --git a/examples/qws/ahigl/qscreenahigl_qws.cpp b/examples/qws/ahigl/qscreenahigl_qws.cpp
deleted file mode 100644
index 491d70f..0000000
--- a/examples/qws/ahigl/qscreenahigl_qws.cpp
+++ /dev/null
@@ -1,963 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscreenahigl_qws.h"
-#include "qwindowsurface_ahigl_p.h"
-
-#include <QWSServer>
-#include <QMap>
-#include <QTimer>
-#include <QTimeLine>
-
-#include <qwindowsystem_qws.h>
-#include <private/qwindowsurface_qws_p.h>
-#include <private/qfixed_p.h>
-
-#include <GLES/egl.h>
-#include <GLES/gl.h>
-#include <math.h>
-
-const int animationLength = 1500;
-const int frameSpan = 20;
-
-static GLuint createTexture(const QImage &img);
-
-class QAhiGLCursor : public QScreenCursor
-{
-public:
- QAhiGLCursor() : texture(0) {}
- ~QAhiGLCursor();
-
- void set(const QImage &image, int hotx, int hoty);
-
- GLuint texture;
-};
-
-QAhiGLCursor::~QAhiGLCursor()
-{
- if (texture)
- glDeleteTextures(1, &texture);
-}
-
-void QAhiGLCursor::set(const QImage &image, int hotx, int hoty)
-{
- if (texture)
- glDeleteTextures(1, &texture);
-
- if (image.isNull())
- texture = 0;
- else
- texture = createTexture(image.convertToFormat(QImage::Format_ARGB32));
-
- QScreenCursor::set(image, hotx, hoty);
-}
-
-
-/*!
- \class QAhiGLScreenPrivate
- The QAhiGLScreenPrivate class contains state information for class QAhiGLScreen.
-
- An instance of this class points to the owning instance of
- class QAhiGLScreen. This class uses a QTimer to limit the
- update frequency.
- */
-//! [0]
-class QAhiGLScreenPrivate : public QObject
-{
- Q_OBJECT
-
-public:
- QAhiGLScreenPrivate(QAhiGLScreen *s);
-
-public slots:
- void windowEvent(QWSWindow *w, QWSServer::WindowEvent e);
- void redrawScreen();
-
-public:
- QAhiGLScreen *screen;
- QAhiGLCursor *cursor;
-
- EGLContext eglContext;
- EGLDisplay eglDisplay;
- EGLSurface eglSurface;
-
- QTimer updateTimer;
- bool doEffects;
-};
-//! [0]
-
-//! [1]
-class ShowAnimation : public QTimeLine
-{
-public:
- ShowAnimation(QAhiGLScreenPrivate *screen);
- qreal valueForTime(int msec);
-};
-//! [1]
-
-//! [2]
-struct WindowInfo
-{
- WindowInfo() : texture(0), animation(0) {}
-
- GLuint texture;
- QPointer<ShowAnimation> animation;
-};
-
-static QMap<QWSWindow*, WindowInfo*> windowMap;
-//! [2]
-
-/*!
- Constructs the animation for the transition effect used
- when the window associated with \a screen is displayed.
- */
-//! [3]
-ShowAnimation::ShowAnimation(QAhiGLScreenPrivate *screen)
- : QTimeLine(animationLength)
-{
- setUpdateInterval(frameSpan);
- connect(this, SIGNAL(valueChanged(qreal)), screen, SLOT(redrawScreen()));
- connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
- start();
-}
-//! [3]
-
-//! [4]
-qreal ShowAnimation::valueForTime(int msec)
-{
- const qreal t = msec / qreal(duration());
- return 3*t*t - 2*t*t*t;
-}
-//! [4]
-
-QAhiGLScreenPrivate::QAhiGLScreenPrivate(QAhiGLScreen *s)
- : screen(s), cursor(0), doEffects(false)
-{
- connect(&updateTimer, SIGNAL(timeout()), this, SLOT(redrawScreen()));
-}
-
-/*!
- This slot handles the \a event when the \l {QWSServer}
- {window server} emits a window event for the specified
- \a window.
-
- The \l {QWSServer::WindowEvent} {window events} handled
- are \c Create, \c Destroy, and \c Show. The \c Create
- event creates a new instance of \l {WindowInfo} and stores
- it in a window map to mark the creation of a new window.
- The \c Destroy event causes the \l {WindoInfo} instance
- to be removed from the map and destroyed.
-
- The \c Show event is the most interesting. If the user
- has started the application with -display ahigl:effects,
- then the \c Show event is handled by creating a small
- \l {ShowAnimation} {animation} for use when the window
- is first shown.
- */
-//! [5]
-void QAhiGLScreenPrivate::windowEvent(QWSWindow *window,
- QWSServer::WindowEvent event)
-{
- switch (event) {
- case QWSServer::Create:
- windowMap[window] = new WindowInfo;
- break;
- case QWSServer::Show:
- if (doEffects)
- windowMap[window]->animation = new ShowAnimation(this);
- break;
- case QWSServer::Destroy:
- delete windowMap[window];
- windowMap.remove(window);
- break;
- default:
- break;
- }
-}
-//! [5]
-
-/*!
- This function assumes the updateTimer is still counting down and stops it
- and then calls redrawScreen() in the public screen driver class QAhiGLScreen.
- */
-//! [6]
-void QAhiGLScreenPrivate::redrawScreen()
-{
- updateTimer.stop();
- screen->redrawScreen();
-}
-//! [6]
-
-/*!
- \class QAhiGLScreen
-
- \brief The QAhiGLScreen class is the screen driver for the ATI handheld device interface.
-
- QAhiGLScreen is implemented with the d-pointer pattern. That is,
- the only data member the class contains is a pointer called d_ptr,
- which means data pointer. It points to an instance of a private
- class called QAhiGLScreenPrivate, where all the screen driver's
- context data members are defined. The d-pointer pattern is used
- so that changes can be made to the screen driver's context data
- members without destroying the binary compatibility of the public
- screen driver class.
-
- The pure virtual functions found in the base class QScreen are
- listed below. All must have implementations in any screen driver
- class derived from QScreen. All are impemented in this example,
- except for setMode(), which has only been given a stub
- implementation to satisfy the compiler.
-
- bool connect(const QString & displaySpec);
- void disconnect();
- bool initDevice();
- void setMode(int width, int height, int depth);
-
- The stub implementation of setMode() is not meant to indicate
- setMode() can be ignored in your own screen driver class. It was
- simply decided not to provide a fully implemented screen driver
- class for the example, which would normally be tailored to your
- device's specific requirements.
-
- The base class QGLScreen has only one pure virtual function,
- hasOpenGL(), which must return true if your screen driver class
- supports OpenGL.
-
- QWSWindowSurface * createSurface(const QString & key) const
- QWSWindowSurface * createSurface(QWidget * widget) const
- void exposeRegion(QRegion region, int windowIndex)
-
- */
-
-/*!
- Constructs a new, ATI handheld device screen driver.
-
- The displayId identifies the QWS server to connect to.
- */
-QAhiGLScreen::QAhiGLScreen(int displayId) : QGLScreen(displayId)
-{
- d_ptr = new QAhiGLScreenPrivate(this);
- d_ptr->eglDisplay = EGL_NO_DISPLAY;
- d_ptr->eglSurface = EGL_NO_SURFACE;
-}
-
-/*!
- Destroys this ATI handheld device screen driver.
- */
-QAhiGLScreen::~QAhiGLScreen()
-{
- delete d_ptr;
-}
-
-/*!
- \reimp
- */
-//! [7]
-bool QAhiGLScreen::connect(const QString &displaySpec)
-{
- // Hardcoded values for this device
- w = 480;
- h = 640;
- dw = w;
- dh = h;
- d = 16;
-
- const int dpi = 120;
- physWidth = qRound(dw * 25.4 / dpi);
- physHeight = qRound(dh * 25.4 / dpi);
-
- if (displaySpec.section(':', 1, 1).contains("effects"))
- d_ptr->doEffects = true;
-
- return true;
-}
-//! [7]
-
-/*!
- \reimp
- */
-//! [8]
-bool QAhiGLScreen::initDevice()
-{
- EGLint version, subversion;
- EGLint attrs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_STENCIL_SIZE, 8, EGL_DEPTH_SIZE, 16,
- EGL_NONE };
- EGLint numConfig;
- EGLConfig eglConfig;
-
- d_ptr->eglDisplay = eglGetDisplay(0);
- if (d_ptr->eglDisplay == EGL_NO_DISPLAY) {
- qCritical("QAhiGLScreen::initDevice(): eglGetDisplay failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglInitialize(d_ptr->eglDisplay, &version, &subversion)) {
- qCritical("QAhiGLScreen::initDevice(): eglInitialize failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglChooseConfig(d_ptr->eglDisplay, attrs, &eglConfig, 1, &numConfig)) {
- qCritical("QAhiGLScreen::initDevice(): eglChooseConfig failed: 0x%x",
- eglGetError());
- return false;
- }
-
- static DummyScreen win = { w, h };
- d_ptr->eglSurface = eglCreateWindowSurface(d_ptr->eglDisplay, eglConfig,
- &win, 0);
- if (d_ptr->eglSurface == EGL_NO_SURFACE) {
- qCritical("QAhiGLScreen::initDevice(): eglCreateWindowSurface failed: 0x%x",
- eglGetError());
- return false;
- }
-
- d_ptr->eglContext = eglCreateContext(d_ptr->eglDisplay, eglConfig,
- EGL_NO_CONTEXT, 0);
- if (d_ptr->eglContext == EGL_NO_CONTEXT) {
- qCritical("QAhiGLScreen::initDevice(): eglCreateContext failed: 0x%x",
- eglGetError());
- return false;
- }
-
- if (!eglMakeCurrent(d_ptr->eglDisplay, d_ptr->eglSurface, d_ptr->eglSurface, d_ptr->eglContext)) {
- qCritical("QAhiGLScreen::initDevice(): eglMakeCurrent failed: 0x%x",
- eglGetError());
- return false;
- }
-
- d_ptr->connect(QWSServer::instance(),
- SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
- SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
-
- d_ptr->cursor = new QAhiGLCursor;
- qt_screencursor = d_ptr->cursor;
-
- return true;
-}
-//! [8]
-
-/*!
- \reimp
- */
-//! [9]
-void QAhiGLScreen::shutdownDevice()
-{
- delete d_ptr->cursor;
- d_ptr->cursor = 0;
- qt_screencursor = 0;
-
- eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT);
- eglDestroyContext(d_ptr->eglDisplay, d_ptr->eglContext);
- eglDestroySurface(d_ptr->eglDisplay, d_ptr->eglSurface);
- eglTerminate(d_ptr->eglDisplay);
-}
-//! [9]
-
-/*!
- \reimp
-
- In this case, the reimplimentation does nothing. It is
- required because the function is declared as pure virtual
- in the base class QScreen.
- */
-void QAhiGLScreen::disconnect()
-{
-}
-
-/*
- This internal function rounds up to the next power of
- two. If v is already a power of two, that same value is
- returned.
- */
-inline static uint nextPowerOfTwo(uint v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- ++v;
- return v;
-}
-
-/*
- This internal function creates a texture from the image img
- and returns its texture identifier.
-
- The term "texture" is a graphics technology term that refers
- to a pixmap constructed from an image by adding extra points
- of contrast to the otherwise plain color image. The texture
- has a, well, texture, that the original image doesn't have.
- */
-static GLuint createTexture(const QImage &img)
-{
- if (img.isNull())
- return 0;
-
- int width = img.width();
- int height = img.height();
- int textureWidth;
- int textureHeight;
- GLuint texture;
-
- glGenTextures(1, &texture);
- textureWidth = nextPowerOfTwo(width);
- textureHeight = nextPowerOfTwo(height);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- switch (img.format()) {
- case QImage::Format_RGB16:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
- textureWidth,
- textureHeight, 0,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
-
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5, img.bits());
- break;
-
- case QImage::Format_ARGB32_Premultiplied:
- case QImage::Format_ARGB32:
- case QImage::Format_RGB32:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
- textureWidth,
- textureHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, 0);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
- GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- break;
-
- default:
- break;
- }
-
- return texture;
-}
-
-/*
- A helper function used by QAhiGLScreen::drawQuad().
- */
-static void drawQuad_helper(GLshort *coords, GLfloat *texCoords)
-{
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, 0, coords);
- glEnable(GL_TEXTURE_2D);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- glDisable(GL_TEXTURE_2D);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-}
-
-/*
- A helper function used by QAhiGLScreen::drawQuadWavyFlag().
- */
-static void drawQuad_helper(GLshort *coords, GLfloat *texCoords,
- int arraySize, int numArrays)
-{
- glEnable(GL_TEXTURE_2D);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, 0, coords);
-
- for (int i = 0; i < numArrays-1; ++i)
- glDrawArrays(GL_TRIANGLE_STRIP, i*arraySize, arraySize);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisable(GL_TEXTURE_2D);
-}
-
-/*
- A convenience function used by QAhiGLScreen::drawQuad().
- */
-static void setRectCoords(GLshort *coords, QRect rect)
-{
- coords[0] = GLshort(rect.left());
- coords[1] = GLshort(rect.top());
-
- coords[2] = GLshort(rect.right());
- coords[3] = GLshort(rect.top());
-
- coords[4] = GLshort(rect.right());
- coords[5] = GLshort(rect.bottom());
-
- coords[6] = GLshort(rect.left());
- coords[7] = GLshort(rect.bottom());
-}
-
-/*!
- A helper function used by QAhiGLScreen::drawWindow() and
- QAhiGLScreen::redrawScreen().
- */
-void QAhiGLScreen::drawQuad(const QRect &textureGeometry,
- const QRect &subGeometry,
- const QRect &screenGeometry)
-{
- qreal textureWidth = qreal(nextPowerOfTwo(textureGeometry.width()));
- qreal textureHeight = qreal(nextPowerOfTwo(textureGeometry.height()));
-
- GLshort coords[8];
- setRectCoords(coords, screenGeometry);
-
- GLfloat texcoords[8];
- texcoords[0] = (subGeometry.left() - textureGeometry.left()) / textureWidth;
- texcoords[1] = (subGeometry.top() - textureGeometry.top()) / textureHeight;
-
- texcoords[2] = (subGeometry.right() - textureGeometry.left()) / textureWidth;
- texcoords[3] = (subGeometry.top() - textureGeometry.top()) / textureHeight;
-
- texcoords[4] = (subGeometry.right() - textureGeometry.left()) / textureWidth;
- texcoords[5] = (subGeometry.bottom() - textureGeometry.top()) / textureHeight;
-
- texcoords[6] = (subGeometry.left() - textureGeometry.left()) / textureWidth;
- texcoords[7] = (subGeometry.bottom() - textureGeometry.top()) / textureHeight;
-
- drawQuad_helper(coords, texcoords);
-}
-
-/*
- My own sine function.
- */
-static qreal mySin(QFixed radians)
-{
- const QFixed twoPI = QFixed::fromReal(2*M_PI);
-
- const int tableSize = 40;
- static int *table = 0;
-
- if (!table) {
- table = new int[tableSize];
- for (int i = 0; i < tableSize; ++i) {
- table[i] = qRound(sin(M_PI*(i*360.0/40.0)/180.0) * 16776960.0);
- }
- }
-
- QFixed tableLookup = radians*tableSize/twoPI;
- return table[tableLookup.truncate()%tableSize]/16776960.0;
-}
-
-/*
- My own cosine function.
- */
-static qreal myCos(QFixed radians)
-{
- const int twoPI = qRound(2*M_PI);
-
- const int tableSize = 40;
- static int *table = 0;
-
- if (!table) {
- table = new int[tableSize];
- for (int i = 0; i < tableSize; ++i) {
- table[i] = int(cos(M_PI*(i*360.0/40.0)/180.0) * 16776960.0);
- }
- }
-
- QFixed tableLookup = radians*tableSize/twoPI;
- return table[tableLookup.truncate()%tableSize]/16776960.0;
-}
-
-// number of grid cells in wavy flag tesselation in x- and y-direction
-const int subdivisions = 10;
-
-/*
- A helper function used by drawQuadWavyFlag(). It computes
- coordinates for grid cells for a wavy flag tesselation and
- stores them in the array called coords.
- */
-static void setFlagCoords(GLshort *coords,
- QRectF screenGeometry,
- int frameNum,
- qreal progress)
-{
- int coordIndex = 0;
- qreal waveHeight = 30.0*(1.0-progress);
- for (int j = 0; j < subdivisions-1; ++j) {
- for (int i = 0; i < subdivisions; ++i) {
- qreal c;
- c = screenGeometry.left()
- + (i * screenGeometry.width() / (subdivisions - 1))
- + waveHeight * qRound(mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0)))
- + waveHeight * qRound(myCos(QFixed::fromReal(M_PI * 20 * (frameNum + j) / 180.0)));
- coords[coordIndex++] = qRound(c);
- c = screenGeometry.top()
- + (j * screenGeometry.height() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + j) / 180.0));
- coords[coordIndex++] = qRound(c);
- c = screenGeometry.left() + (i * screenGeometry.width() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + (j+1)) / 180.0));
- coords[coordIndex++] = qRound(c);
-
- c = screenGeometry.top()
- + ((j + 1) * screenGeometry.height() / (subdivisions - 1))
- + waveHeight * mySin(QFixed::fromReal(M_PI * 20 * (frameNum + i) / 180.0))
- + waveHeight * myCos(QFixed::fromReal(M_PI * 20 * (frameNum + (j + 1)) / 180.0));
- coords[coordIndex++] = qRound(c);
- }
- }
-}
-
-static void setFlagTexCoords(GLfloat *texcoords,
- const QRectF &subTexGeometry,
- const QRectF &textureGeometry,
- int textureWidth, int textureHeight)
-{
- qreal topLeftX = (subTexGeometry.left() - textureGeometry.left())/textureWidth;
- qreal topLeftY = (textureGeometry.height() - (subTexGeometry.top() - textureGeometry.top()))/textureHeight;
-
- qreal width = (subTexGeometry.right() - textureGeometry.left())/textureWidth - topLeftX;
- qreal height = (textureGeometry.height() - (subTexGeometry.bottom() - textureGeometry.top()))/textureHeight - topLeftY;
-
- int coordIndex = 0;
- qreal spacing = subdivisions - 1;
- for (int j = 0; j < subdivisions-1; ++j) {
- for (int i = 0; i < subdivisions; ++i) {
- texcoords[coordIndex++] = topLeftX + (i*width) / spacing;
- texcoords[coordIndex++] = topLeftY + (j*height) / spacing;
- texcoords[coordIndex++] = topLeftX + (i*width) / spacing;
- texcoords[coordIndex++] = topLeftY + ((j+1)*height) / spacing;
- }
- }
-}
-
-void QAhiGLScreen::drawQuadWavyFlag(const QRect &textureGeometry,
- const QRect &subTexGeometry,
- const QRect &screenGeometry,
- qreal progress)
-{
- const int textureWidth = nextPowerOfTwo(textureGeometry.width());
- const int textureHeight = nextPowerOfTwo(textureGeometry.height());
-
- static int frameNum = 0;
-
- GLshort coords[subdivisions*subdivisions*2*2];
- setFlagCoords(coords, screenGeometry, frameNum++, progress);
-
- GLfloat texcoords[subdivisions*subdivisions*2*2];
- setFlagTexCoords(texcoords, subTexGeometry, textureGeometry,
- textureWidth, textureHeight);
-
- drawQuad_helper(coords, texcoords, subdivisions*2, subdivisions);
-}
-
-void QAhiGLScreen::invalidateTexture(int windowIndex)
-{
- if (windowIndex < 0)
- return;
-
- QList<QWSWindow*> windows = QWSServer::instance()->clientWindows();
- if (windowIndex > windows.size() - 1)
- return;
-
- QWSWindow *win = windows.at(windowIndex);
- if (!win)
- return;
-
- WindowInfo *info = windowMap[win];
- if (info->texture) {
- glDeleteTextures(1, &info->texture);
- info->texture = 0;
- }
-}
-
-void QAhiGLScreen::drawWindow(QWSWindow *win, qreal progress)
-{
- const QRect screenRect = win->allocatedRegion().boundingRect();
- QRect drawRect = screenRect;
-
- glColor4f(1.0, 1.0, 1.0, progress);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
-
- QWSWindowSurface *surface = win->windowSurface();
- if (!surface)
- return;
-
- if (progress >= 1.0) {
- if (surface->key() == QLatin1String("ahigl")) {
- drawRect.setCoords(drawRect.left(), drawRect.bottom(),
- drawRect.right(), drawRect.top());
- }
- drawQuad(win->requestedRegion().boundingRect(), screenRect, drawRect);
- return;
- }
-
- const int dx = qRound((1 - progress) * drawRect.width() / 2);
- const int dy = qRound((1 - progress) * drawRect.height() / 2);
-
- drawRect.adjust(dx, dy, -dx, -dy);
-
- if (surface->key() != QLatin1String("ahigl")) {
- drawRect.setCoords(drawRect.left(), drawRect.bottom(),
- drawRect.right(), drawRect.top());
- }
-
- drawQuadWavyFlag(win->requestedRegion().boundingRect(), screenRect,
- drawRect, progress);
-}
-
-/*!
- The window compositions are constructed here.
- */
-//! [10]
-void QAhiGLScreen::redrawScreen()
-{
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, 0);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrthof(0, w, h, 0, -999999, 999999);
- glViewport(0, 0, w, h);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- // Fill background color
-
- QColor bgColor = QWSServer::instance()->backgroundBrush().color();
- glClearColor(bgColor.redF(), bgColor.greenF(),
- bgColor.blueF(), bgColor.alphaF());
- glClear(GL_COLOR_BUFFER_BIT);
-//! [10]
-
- // Draw all windows
-
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_STENCIL_TEST);
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ZERO);
- glDisable(GL_ALPHA_TEST);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-
-//! [11]
- QList<QWSWindow*> windows = QWSServer::instance()->clientWindows();
- for (int i = windows.size() - 1; i >= 0; --i) {
- QWSWindow *win = windows.at(i);
- QWSWindowSurface *surface = win->windowSurface();
- if (!surface)
- continue;
-
- WindowInfo *info = windowMap[win];
-
- if (!info->texture) {
- if (surface->key() == QLatin1String("ahigl"))
- info->texture = static_cast<QAhiGLWindowSurface*>(surface)->textureId();
- else
- info->texture = createTexture(surface->image());
- }
- qreal progress;
- if (info->animation)
- progress = info->animation->currentValue();
- else
- progress = 1.0;
-
- glBindTexture(GL_TEXTURE_2D, info->texture);
- drawWindow(win, progress);
- } // for i
-//! [11] //! [12]
-
- // Draw cursor
-
- const QAhiGLCursor *cursor = d_ptr->cursor;
- if (cursor->texture) {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glBindTexture(GL_TEXTURE_2D, d_ptr->cursor->texture);
- drawQuad(cursor->boundingRect(), cursor->boundingRect(),
- cursor->boundingRect());
- }
-
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
-
- eglSwapBuffers(d_ptr->eglDisplay, d_ptr->eglSurface);
-}
-//! [12]
-
-/*!
- \reimp
-
- */
-//! [13]
-void QAhiGLScreen::exposeRegion(QRegion r, int windowIndex)
-{
- if ((r & region()).isEmpty())
- return;
-
- invalidateTexture(windowIndex);
-
- if (!d_ptr->updateTimer.isActive())
- d_ptr->updateTimer.start(frameSpan);
-}
-//! [13]
-
-/*!
- \reimp
-
- This overloading of createSurface() is called on the client side to
- create a window surface for a new window. If the \a widget is a
- QGLWidget, or if the widget's width and height are both less than or
- equal to 256, it creates an instance of QAhiGLWindowSurface.
- Otherwise, it calls QScreen::createSurface() to create a non-OpenGL
- window surface. The pointer to the new window surface is returned.
-
- Note that this function first asks whether this application is the
- server, and it only creates an instance of QAhiGLWindowSurface if
- the answer is yes. What this means is we only let the server have
- access to the OpenGL hardware, because of an implementation
- restyriction in the OpenGL libraries we are using. Thus only clients
- that are in the server process get to create OpenGL window surfaces.
- */
-//! [14]
-QWSWindowSurface* QAhiGLScreen::createSurface(QWidget *widget) const
-{
- if (QApplication::type() == QApplication::GuiServer) {
- if (qobject_cast<QGLWidget*>(widget)) {
- return new QAhiGLWindowSurface(widget,
- d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
-
- const QRect rect = widget->frameGeometry();
- if (rect.width() <= 256 && rect.height() <= 256) {
- return new QAhiGLWindowSurface(widget,
- d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
- }
-
- return QScreen::createSurface(widget);
-}
-//! [14]
-
-/*!
- \reimp
-
- This overloading of createSurface() is called on the server side
- to manage a window surface corresponding to a window surface
- already created on the client side.
-
- If the \a key is "ahigl", create an instance of QAhiGLWindowSurface
- and return it. Otherwise, call QScreen::createSurface() and return
- the window surface it creates.
-
- See QScreen::createSurface().
- */
-//! [15]
-QWSWindowSurface* QAhiGLScreen::createSurface(const QString &key) const
-{
- if (key == QLatin1String("ahigl")) {
- return new QAhiGLWindowSurface(d_ptr->eglDisplay,
- d_ptr->eglSurface,
- d_ptr->eglContext);
- }
-
- return QScreen::createSurface(key);
-}
-//! [15]
-
-/*!
- This function would normally reset the frame buffer resolution
- according to \a width, \a height, and the bit \a depth. It would
- then notify other applications that their frame buffer size had
- changed so they could redraw. The function is a no-op in this
- example, which means the example screen driver can't change its
- frame buffer resolution. There is no significance to that in the
- example. You would normally implement setMode() in an OpenGL
- screen driver. This no-op reimplementation is required here
- because setMode() in QScreen is a pure virtual function.
-
- See QScreen::setMode()
- */
-void QAhiGLScreen::setMode(int width, int height, int depth)
-{
- Q_UNUSED(width);
- Q_UNUSED(height);
- Q_UNUSED(depth);
-}
-
-/*!
- This function would normally be reimplemented to prevent the
- screen driver from updating the screen if \a on is true. It is a
- no-op in this example, which means the screen driver can always
- update the screen.
-
- See QScreen::blank().
- */
-void QAhiGLScreen::blank(bool on)
-{
- Q_UNUSED(on);
-}
-
-/*!
- This function always returns true, since the purpose of
- this screen driver class is to implement an OpenGL ES
- screen driver. In some other class designed to handle both
- OpenGL and non-OpenGL graphics, it might test the system to
- determine whether OpenGL graphics are supported and return
- true or false accordingly.
- */
-bool QAhiGLScreen::hasOpenGL()
-{
- return true;
-}
-
-#include "qscreenahigl_qws.moc"
diff --git a/examples/qws/ahigl/qscreenahigl_qws.h b/examples/qws/ahigl/qscreenahigl_qws.h
deleted file mode 100644
index 2dc3dae..0000000
--- a/examples/qws/ahigl/qscreenahigl_qws.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QAHIGLSCREEN_H
-#define QAHIGLSCREEN_H
-
-#include <QGLScreen>
-#include <QWSServer>
-
-QT_BEGIN_NAMESPACE
-class QAhiGLScreenPrivate;
-QT_END_NAMESPACE
-
-//! [0]
-class QAhiGLScreen : public QGLScreen
-{
-public:
- QAhiGLScreen(int displayId);
- virtual ~QAhiGLScreen();
-
- bool initDevice();
- bool connect(const QString &displaySpec);
- void disconnect();
- void shutdownDevice();
-
- void setMode(int width, int height, int depth);
- void blank(bool on);
-
- void exposeRegion(QRegion r, int changing);
-
- QWSWindowSurface* createSurface(QWidget *widget) const;
- QWSWindowSurface* createSurface(const QString &key) const;
-
- bool hasOpenGL();
-
-private:
- void invalidateTexture(int windowIndex);
- void redrawScreen();
- void drawWindow(QWSWindow *win, qreal progress);
- void drawQuad(const QRect &textureGeometry,
- const QRect &subGeometry,
- const QRect &screenGeometry);
- void drawQuadWavyFlag(const QRect &textureGeometry,
- const QRect &subTexGeometry,
- const QRect &screenGeometry,
- float progress);
-
- QAhiGLScreenPrivate *d_ptr;
- friend class QAhiGLScreenPrivate;
-};
-//! [0]
-
-#endif // QAHIGLSCREEN_H
diff --git a/examples/qws/ahigl/qscreenahiglplugin.cpp b/examples/qws/ahigl/qscreenahiglplugin.cpp
deleted file mode 100644
index 4fd1241..0000000
--- a/examples/qws/ahigl/qscreenahiglplugin.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscreenahigl_qws.h"
-
-#include <QScreenDriverPlugin>
-#include <QStringList>
-
-//! [0]
-class QAhiGLScreenPlugin : public QScreenDriverPlugin
-{
-public:
- QAhiGLScreenPlugin();
-
- QStringList keys() const;
- QScreen *create(const QString&, int displayId);
-};
-//! [0]
-
-/*!
- \class QAhiGLScreenPlugin
- \brief The QAhiGLScreenPlugin class is the plugin for the ATI handheld device graphics driver.
-
- QAhiGLScreenPlugin inherits QScreenDriverPlugin. See
- \l{How to Create Qt Plugins} for details.
- */
-
-/*!
- This is the default constructor.
- */
-QAhiGLScreenPlugin::QAhiGLScreenPlugin()
- : QScreenDriverPlugin()
-{
-}
-
-/*!
- Returns a string list containing the string "ahigl" which
- is the only screen driver supported by this plugin.
- */
-QStringList QAhiGLScreenPlugin::keys() const
-{
- return (QStringList() << "ahigl");
-}
-
-/*!
- Creates a screen driver of the kind specified by \a driver.
- The \a displayId identifies the Qt for Embedded Linux server to connect to.
- */
-QScreen* QAhiGLScreenPlugin::create(const QString& driver, int displayId)
-{
- if (driver.toLower() != "ahigl")
- return 0;
-
- return new QAhiGLScreen(displayId);
-}
-
-//! [1]
-Q_EXPORT_PLUGIN2(qahiglscreen, QAhiGLScreenPlugin)
-//! [1]
diff --git a/examples/qws/ahigl/qwindowsurface_ahigl.cpp b/examples/qws/ahigl/qwindowsurface_ahigl.cpp
deleted file mode 100644
index 3466a27..0000000
--- a/examples/qws/ahigl/qwindowsurface_ahigl.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwindowsurface_ahigl_p.h"
-#include "qscreenahigl_qws.h"
-
-#include <qwsdisplay_qws.h>
-#include <QtGui/QPaintDevice>
-#include <QtGui/QWidget>
-#include <QtOpenGL/private/qglpaintdevice_qws_p.h>
-#include <QtOpenGL/private/qgl_p.h>
-#include <GLES/gl.h>
-
-/*!
- \class QAhiGLWindowSurfacePrivate
- \internal
-
- \brief The QAhiGLWindowSurfacePrivate class is the private implementation
- class for class QAhiGLWindowSurface.
-
- This class contains only state variables.
- */
-//! [0]
-class QAhiGLWindowSurfacePrivate
-{
-public:
- QAhiGLWindowSurfacePrivate(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext);
-
- QPaintDevice *device;
-
- int textureWidth;
- int textureHeight;
-
- GLuint texture;
- GLuint frameBufferObject;
- GLuint depthbuf;
-
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
-};
-//! [0]
-
-/*!
- The construct just sets statwe variables using the ones
- provided.
- */
-QAhiGLWindowSurfacePrivate::QAhiGLWindowSurfacePrivate(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
- : texture(0), frameBufferObject(0), depthbuf(0), display(eglDisplay),
- surface(eglSurface), context(eglContext)
-{
-}
-
-inline static int nextPowerOfTwo(uint v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- ++v;
- return v;
-}
-
-/*!
- \class QAhiGLWindowSurface
- \preliminary
- \internal
-
- \brief The QAhiGLWindowSurface class provides the drawing area
- for top-level windows using OpenGL for drawing on an ATI handheld
- device.
-
- In \l{Qt for Embedded Linux}, the default behavior for each client is to
- render widgets into an area of memory. The server then displays
- the contents of that memory on the screen. For ATI handheld
- devices using OpenGL, QAhiGLWindowSurface is the window surface
- class that allocates and manages the memory areas in the clients
- and the server.
-
- When a screen update is required, the server runs through all the
- top-level windows that intersect with the region being updated,
- ensuring that the clients have updated their window surfaces. Then
- the server uses the screen driver to copy the contents of the
- affected window surfaces into its composition and then display the
- composition on the screen.
-
- \tableofcontents
-
- \section1 Pure Virtual Functions
-
- There are two window surface instances for each top-level window.
- One is used by the application when drawing a window, and the
- other is used by the server application to make its copy for
- building a window composition to send to the screen.
-
- The key() function is implemented to uniquely identify this window
- surface class as "ahigl", and the isValid() function is
- implemented to determine whether the associated window is still
- acceptable for representation by this window surface class. It
- must either be a window using an \l {QGLWidget} {OpenGL widget},
- or it must be a window whose frame is no bigger than 256 x 256.
-
- The setGeometry() function is implemented to change the geometry
- of the frame buffer whenever the geometry of the associated
- top-level window changes. The image() function is called by the
- window system when building window compositions to return an image
- of the top-level window.
-
- The paintDevice() function is implemented to return the appropriate
- paint device.
-
- \section1 Virtual Functions
-
- When painting onto the surface, the window system will always call
- the beginPaint() function before any painting operations are
- performed. It ensures that the correct frame buffer will be used
- by the OpenGL library for painting operations. Likewise, the
- endPaint() function is automatically called when the painting is
- done, but it isn't implemented for this example.
-*/
-
-/*!
- This is the client side constructor.
- */
-//! [1]
-QAhiGLWindowSurface::QAhiGLWindowSurface(QWidget *widget,
- EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
- : QWSGLWindowSurface(widget)
-{
- d_ptr = new QAhiGLWindowSurfacePrivate(eglDisplay, eglSurface, eglContext);
- d_ptr->device = new QWSGLPaintDevice(widget);
-
- setSurfaceFlags(QWSWindowSurface::Buffered);
-}
-//! [1]
-
-/*!
- This is the server side constructor.
- */
-//! [2]
-QAhiGLWindowSurface::QAhiGLWindowSurface(EGLDisplay eglDisplay,
- EGLSurface eglSurface,
- EGLContext eglContext)
-{
- d_ptr = new QAhiGLWindowSurfacePrivate(eglDisplay, eglSurface, eglContext);
- setSurfaceFlags(QWSWindowSurface::Buffered);
-}
-//! [2]
-
-/*!
- The destructor deletes the OpenGL structures held by the
- private implementation class, and then it deletes the
- private implementation class.
- */
-QAhiGLWindowSurface::~QAhiGLWindowSurface()
-{
- if (d_ptr->texture)
- glDeleteTextures(1, &d_ptr->texture);
- if (d_ptr->depthbuf)
- glDeleteRenderbuffersOES(1, &d_ptr->depthbuf);
- if (d_ptr->frameBufferObject)
- glDeleteFramebuffersOES(1, &d_ptr->frameBufferObject);
-
- delete d_ptr;
-}
-
-/*!
- This function changes the geometry of the frame buffer
- to the geometry in \a rect. It is called whenever the
- geometry of the associated top-level window changes. It
- also rebuilds the window surface's texture and binds
- the OpenGL identifier to the texture for use by the
- OpenGL library.
- */
-//! [3]
-void QAhiGLWindowSurface::setGeometry(const QRect &rect)
-{
- QSize size = rect.size();
-
- const QWidget *w = window();
- if (w && !w->mask().isEmpty()) {
- const QRegion region = w->mask()
- & rect.translated(-w->geometry().topLeft());
- size = region.boundingRect().size();
- }
-
- if (geometry().size() != size) {
-
- // Driver specific limitations:
- // FBO maximimum size of 256x256
- // Depth buffer required
-
- d_ptr->textureWidth = qMin(256, nextPowerOfTwo(size.width()));
- d_ptr->textureHeight = qMin(256, nextPowerOfTwo(size.height()));
-
- glGenTextures(1, &d_ptr->texture);
- glBindTexture(GL_TEXTURE_2D, d_ptr->texture);
-
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- const int bufSize = d_ptr->textureWidth * d_ptr->textureHeight * 2;
- GLshort buf[bufSize];
- memset(buf, 0, sizeof(GLshort) * bufSize);
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, d_ptr->textureWidth,
- d_ptr->textureHeight, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, buf);
-
- glGenRenderbuffersOES(1, &d_ptr->depthbuf);
- glBindRenderbufferOES(GL_RENDERBUFFER_EXT, d_ptr->depthbuf);
- glRenderbufferStorageOES(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16,
- d_ptr->textureWidth, d_ptr->textureHeight);
-
- glGenFramebuffersOES(1, &d_ptr->frameBufferObject);
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, d_ptr->frameBufferObject);
-
- glFramebufferTexture2DOES(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, d_ptr->texture, 0);
- glFramebufferRenderbufferOES(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, d_ptr->depthbuf);
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, 0);
- }
-
- QWSGLWindowSurface::setGeometry(rect);
-}
-//! [3]
-
-/*!
- Returns the window surface's texture as a QByteArray.
- */
-QByteArray QAhiGLWindowSurface::permanentState() const
-{
- QByteArray array;
- array.resize(sizeof(GLuint));
-
- char *ptr = array.data();
- reinterpret_cast<GLuint*>(ptr)[0] = textureId();
- return array;
-}
-
-/*!
- Sets the window surface's texture to \a data.
- */
-void QAhiGLWindowSurface::setPermanentState(const QByteArray &data)
-{
- const char *ptr = data.constData();
- d_ptr->texture = reinterpret_cast<const GLuint*>(ptr)[0];
-}
-
-/*!
- Returns the paint device being used for this window surface.
- */
-QPaintDevice *QAhiGLWindowSurface::paintDevice()
-{
- return d_ptr->device;
-}
-
-/*!
- Returns the window surface's texture.
- */
-GLuint QAhiGLWindowSurface::textureId() const
-{
- return d_ptr->texture;
-}
-
-/*!
- The \l {QWSServer} {window system} always calls this function
- before any painting operations begin for this window surface.
- It ensures that the correct frame buffer will be used by the
- OpenGL library for painting operations.
- */
-//! [4]
-void QAhiGLWindowSurface::beginPaint(const QRegion &region)
-{
- QWSGLWindowSurface::beginPaint(region);
-
- if (d_ptr->frameBufferObject)
- glBindFramebufferOES(GL_FRAMEBUFFER_EXT, d_ptr->frameBufferObject);
-}
-//! [4]
-
-/*!
- This function returns true if the window associated with
- this window surface can still rendered using this window
- surface class. Either the window's top-level widget must
- be an \l {QGLWidget} {OpenGL widget}, or the window's
- frame must be no bigger than 256 x 256.
- */
-//! [5]
-bool QAhiGLWindowSurface::isValid() const
-{
- if (!qobject_cast<QGLWidget*>(window())) {
- const QRect r = window()->frameGeometry();
- if (r.width() > 256 || r.height() > 256)
- return false;
- }
- return true;
-}
-//! [5]
diff --git a/examples/sql/drilldown/main.cpp b/examples/sql/drilldown/main.cpp
index 20f4cbf..f0b506e 100644
--- a/examples/sql/drilldown/main.cpp
+++ b/examples/sql/drilldown/main.cpp
@@ -59,5 +59,8 @@ int main(int argc, char *argv[])
#else
view.showFullScreen();
#endif
+#ifdef QT_KEYPAD_NAVIGATION
+ QApplication::setNavigationMode(Qt::NavigationModeCursorAuto);
+#endif
return app.exec();
}
diff --git a/examples/video/video.pro b/examples/video/video.pro
deleted file mode 100644
index f0b63b6..0000000
--- a/examples/video/video.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-TEMPLATE = subdirs
-
-SUBDIRS += \
- videographicsitem \
- videowidget
-
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
index 2b2a42c..7f7d882 100644
--- a/mkspecs/features/qt.prf
+++ b/mkspecs/features/qt.prf
@@ -163,6 +163,11 @@ for(QTLIB, $$list($$lower($$unique(QT)))) {
INCLUDEPATH += $$QMAKE_INCDIR_QT/phonon_compat/phonon
INCLUDEPATH += $$QMAKE_INCDIR_QT/phonon_compat
INCLUDEPATH += $$QMAKE_INCDIR_QT/phonon/Phonon
+
+ # The Helix backend requires this. Since we can't let a plugin set it,
+ # we bump the values for all Symbian Phonon plugins.
+ symbian:isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x040000 0x1600000
+
} else:isEqual(QTLIB, webkit):qlib = QtWebKit
else:isEqual(QTLIB, multimedia):qlib = QtMultimedia
else:message("Unknown QT: $$QTLIB"):qlib =
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index 6322233..3f84f42 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -45,9 +45,15 @@ defineTest(qtAddLibrary) {
}
}
}
- symbian*:isEqual(LIB_NAME, QtGui) {
- # Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
- INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
+ symbian {
+ isEqual(LIB_NAME, QtGui) {
+ # Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
+ INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
+ }
+ isEqual(LIB_NAME, QtWebKit) {
+ # Needed for #include <QtXmlPatterns/QtXmlPatterns> because relative inclusion problem in toolchain
+ INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtXmlPatterns
+ }
}
isEmpty(LINKAGE) {
if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
diff --git a/mkspecs/features/symbian/stl.prf b/mkspecs/features/symbian/stl.prf
index 8892d2a..e21ee5c 100644
--- a/mkspecs/features/symbian/stl.prf
+++ b/mkspecs/features/symbian/stl.prf
@@ -15,7 +15,7 @@ INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE
INCLUDEPATH -= $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian/stl-off
# libstdcppv5 is preferred over libstdcpp as it has/uses the throwing version of operator new
-exists($${EPOCROOT}epoc32/release/armv5/urel/libstdcppv5.dll ) {
+exists($${EPOCROOT}epoc32/release/armv5/urel/libstdcppv5.dll)|exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcppv5.dll) {
LIBS *= -llibstdcppv5.dll
# STDCPP turns on standard C++ new behaviour (ie. throwing new)
diff --git a/mkspecs/features/uitools.prf b/mkspecs/features/uitools.prf
index 6eba066..2d14b04 100644
--- a/mkspecs/features/uitools.prf
+++ b/mkspecs/features/uitools.prf
@@ -2,7 +2,9 @@ QT += xml
qt:load(qt)
# Include the correct version of the UiLoader library
-QTUITOOLS_LINKAGE = -lQtUiTools
+symbian: QTUITOOLS_LINKAGE = -lQtUiTools.lib
+else: QTUITOOLS_LINKAGE = -lQtUiTools
+
CONFIG(debug, debug|release) {
mac: QTUITOOLS_LINKAGE = -lQtUiTools_debug
win32: QTUITOOLS_LINKAGE = -lQtUiToolsd
diff --git a/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm b/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm
index 7fada1e..634fafa 100644
--- a/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm
+++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm
@@ -9,6 +9,14 @@
include $(FLMHOME)/metaflm.mk
+SINGLETON:=$(call sanitise,TSTORE_SINGLETON_$(EXTENSION_ROOT))
+
+ifeq ($($(SINGLETON)),)
+# Prevent duplicate targets from being created, as that can lead to build breaks
+# in multiprocessor systems if two or more targets try to write to .make.cache at
+# the same time.
+$(SINGLETON):=1
+
STORE_BUILD_TARGET:=$(call sanitise,TSTORE_BUILD_$(PLATFORM_PATH)_$(CFG_PATH)_$(EXTENSION_ROOT))
CACHE_FILENAME:=$(EXTENSION_ROOT)/.make.cache
@@ -37,4 +45,5 @@ endef
$(eval $(qmake_store_build))
$(eval $(call GenerateStandardCleanTarget,$(CACHE_FILENAME),''))
+endif
diff --git a/mkspecs/unsupported/linux-scratchbox2-g++/qmake.conf b/mkspecs/unsupported/linux-scratchbox2-g++/qmake.conf
new file mode 100644
index 0000000..1ade6b9
--- /dev/null
+++ b/mkspecs/unsupported/linux-scratchbox2-g++/qmake.conf
@@ -0,0 +1,34 @@
+#
+# qmake configuration derived from linux-g++
+#
+# This mkspec is intended for use with scratchbox 2 (sb2) and assumes the
+# default sb2 target is set appropriately, or you will have to append the
+# appropriate -t $target argument to sb2
+
+# If you want to use pkg-config you have to explicitly force it by passing
+# -force-pkg-config to configure. You will probably want to export your
+# PKG_CONFIG_PATH shell variable in order for the host pkg-config to
+# correctly query and utilize your targets .pc files (normally stored in
+# $staging/usr/lib/pkgconfig)
+
+MAKEFILE_GENERATOR = UNIX
+TEMPLATE = app
+CONFIG += qt warn_on release incremental link_prl
+QT += core gui
+QMAKE_INCREMENTAL_STYLE = sublib
+
+include(../../common/g++.conf)
+include(../../common/linux.conf)
+
+# modifications to g++.conf
+QMAKE_CC = sb2 gcc
+QMAKE_CXX = sb2 g++
+QMAKE_LINK = sb2 g++
+QMAKE_LINK_SHLIB = sb2 g++
+
+# modifications to linux.conf
+QMAKE_AR = sb2 ar cqs
+QMAKE_OBJCOPY = sb2 objcopy
+QMAKE_STRIP = sb2 strip
+
+load(qt_config)
diff --git a/doc/src/snippets/code/doc_src_examples_ahigl.qdoc b/mkspecs/unsupported/linux-scratchbox2-g++/qplatformdefs.h
index ccdce8b..60e0f5e 100644
--- a/doc/src/snippets/code/doc_src_examples_ahigl.qdoc
+++ b/mkspecs/unsupported/linux-scratchbox2-g++/qplatformdefs.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the documentation of the Qt Toolkit.
+** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,11 +39,4 @@
**
****************************************************************************/
-//! [0]
-myApplication -qws -display ahigl
-//! [0]
-
-
-//! [1]
-myApplication -qws -display ahigl
-//! [1]
+#include "../../linux-g++/qplatformdefs.h"
diff --git a/projects.pro b/projects.pro
index 2a6a956..aa1eb71 100644
--- a/projects.pro
+++ b/projects.pro
@@ -8,7 +8,11 @@ TEMPLATE = subdirs
cross_compile: CONFIG += nostrip
isEmpty(QT_BUILD_PARTS) { #defaults
- QT_BUILD_PARTS = libs tools examples demos docs translations
+ symbian {
+ QT_BUILD_PARTS = libs tools examples demos
+ } else {
+ QT_BUILD_PARTS = libs tools examples demos docs translations
+ }
} else { #make sure the order makes sense
contains(QT_BUILD_PARTS, translations) {
QT_BUILD_PARTS -= translations
@@ -28,10 +32,6 @@ isEmpty(QT_BUILD_PARTS) { #defaults
}
}
-symbian {
- QT_BUILD_PARTS = libs tools examples demos
-}
-
#process the projects
for(PROJECT, $$list($$lower($$unique(QT_BUILD_PARTS)))) {
isEqual(PROJECT, tools) {
diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp
index 69dd627..819cdaf 100644
--- a/qmake/generators/metamakefile.cpp
+++ b/qmake/generators/metamakefile.cpp
@@ -291,6 +291,7 @@ SubdirsMetaMakefileGenerator::init()
if(init_flag)
return false;
init_flag = true;
+ bool hasError = false;
if(Option::recursive) {
QString old_output_dir = Option::output_dir;
@@ -336,14 +337,18 @@ SubdirsMetaMakefileGenerator::init()
}
qmake_setpwd(sub->input_dir);
Option::output_dir = sub->output_dir;
- sub_proj->read(subdir.fileName());
+ bool tmpError = !sub_proj->read(subdir.fileName());
if(!sub_proj->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
fprintf(stderr, "Project file(%s) not recursed because all requirements not met:\n\t%s\n",
subdir.fileName().toLatin1().constData(),
sub_proj->values("QMAKE_FAILED_REQUIREMENTS").join(" ").toLatin1().constData());
delete sub;
delete sub_proj;
+ Option::output_dir = old_output_dir;
+ qmake_setpwd(oldpwd);
continue;
+ } else {
+ hasError |= tmpError;
}
sub->makefile = MetaMakefileGenerator::createMetaGenerator(sub_proj, sub_name);
if(0 && sub->makefile->type() == SUBDIRSMETATYPE) {
@@ -351,7 +356,7 @@ SubdirsMetaMakefileGenerator::init()
} else {
const QString output_name = Option::output.fileName();
Option::output.setFileName(sub->output_file);
- sub->makefile->write(sub->output_dir);
+ hasError |= !sub->makefile->write(sub->output_dir);
delete sub;
qmakeClearCaches();
sub = 0;
@@ -376,7 +381,7 @@ SubdirsMetaMakefileGenerator::init()
self->makefile->init();
subs.append(self);
- return true;
+ return !hasError;
}
bool
@@ -419,269 +424,6 @@ SubdirsMetaMakefileGenerator::~SubdirsMetaMakefileGenerator()
subs.clear();
}
-class SymbianSubdirsMetaMakefileGenerator : public SubdirsMetaMakefileGenerator
-{
-public:
- SymbianSubdirsMetaMakefileGenerator(QMakeProject *p, const QString &n, bool op) : SubdirsMetaMakefileGenerator(p, n, op) { }
- virtual ~SymbianSubdirsMetaMakefileGenerator();
-
- virtual bool init();
- virtual bool write(const QString &);
-
-protected:
-
- static QMap<QString, QString> mmpPaths;
-
- static QMultiMap<QString, QString> mmpDependency;
-
- static QStringList getDependencyList(QString mmpFilename, int recursionDepth);
-
- static QStringList calculateRelativePaths(QString mmpParent, QStringList mmpChildren);
-
-private:
- QString cleanFromSpecialCharacters(QString& str);
-};
-
-QMap<QString, QString> SymbianSubdirsMetaMakefileGenerator::mmpPaths;
-
-QMultiMap<QString, QString> SymbianSubdirsMetaMakefileGenerator::mmpDependency;
-
-QStringList SymbianSubdirsMetaMakefileGenerator::getDependencyList(QString mmpFilename, int recursionDepth)
-{
- QStringList list;
-
- QList<QString> values = mmpDependency.values(mmpFilename);
- if (recursionDepth < 0) {
- // special case; just first dependency level
- list = values;
- return list;
- }
- if (values.size() == 0) {
- //reached recursion END condition
- if (recursionDepth == 0) {
- --recursionDepth;
- return list; // empty list // no dependencies / return
- } else {
- list.append(mmpFilename);
- recursionDepth--;
- return list; // leaf // return
- }
- } else {
- recursionDepth++;
- for (int i = 0; i < values.size(); ++i) {
- QString current = values.at(i);
- QStringList tailList = getDependencyList(current, recursionDepth);
- for (int j = 0; j < tailList.size(); ++j) {
- QString path = tailList.at(j);
- list.append(path);
- }
- }
-
- if (recursionDepth > 0) {
- //for mmp somewhere in middle
- list.append(mmpFilename);
- }
- recursionDepth--;
- return list;
- }
-}
-
-SymbianSubdirsMetaMakefileGenerator::~SymbianSubdirsMetaMakefileGenerator() { }
-
-bool SymbianSubdirsMetaMakefileGenerator::write(const QString &oldpwd)
-{
- return SubdirsMetaMakefileGenerator::write(oldpwd);
-}
-
-QString SymbianSubdirsMetaMakefileGenerator::cleanFromSpecialCharacters(QString& str)
-{
- QString tmp = str;
-
- tmp.replace(QString("/"), QString("_"));
- tmp.replace(QString("\\"), QString("_"));
- tmp.replace(QString("-"), QString("_"));
- tmp.replace(QString(":"), QString("_"));
- tmp.replace(QString("."), QString("_"));
-
- return tmp;
-}
-
-bool SymbianSubdirsMetaMakefileGenerator::init()
-{
- if (init_flag)
- return false;
-
- init_flag = true;
-
- // If we are here then we have template == subdirs
-
- Option::recursive = true;
-
- if (Option::recursive) {
- QString old_output_dir = QDir::cleanPath(Option::output_dir);
- if (!old_output_dir.endsWith('/'))
- old_output_dir += '/';
- QString old_output = Option::output.fileName();
- QString oldpwd = QDir::cleanPath(qmake_getpwd());
-
- if (!oldpwd.endsWith('/'))
- oldpwd += '/';
-
- // find the parent mmp filename
- int end = oldpwd.size() - 1;
- int start = oldpwd.lastIndexOf("/", end - 2);
- QString parentMmpFilename = oldpwd.mid(start + 1, end - start - 1);
- parentMmpFilename.prepend(oldpwd);
- parentMmpFilename = parentMmpFilename.append(Option::mmp_ext);
-
-
- const QStringList &subdirs = project->values("SUBDIRS");
- static int recurseDepth = -1;
- ++recurseDepth;
- for (int i = 0; i < subdirs.size(); ++i) {
- Subdir *sub = new Subdir;
- sub->indent = recurseDepth;
-
- QFileInfo subdir(subdirs.at(i));
- // childMmpFielname should be derived from subdirName
- QString subdirName = subdirs.at(i);
- if (!project->isEmpty(subdirs.at(i) + ".file"))
- subdir = project->first(subdirs.at(i) + ".file");
- else if (!project->isEmpty(subdirs.at(i) + ".subdir"))
- subdir = project->first(subdirs.at(i) + ".subdir");
- QString sub_name;
-
- QString childMmpFilename;
-
- if (subdir.isDir()) {
- subdir = QFileInfo(subdir.filePath() + "/" + subdir.fileName() + Option::pro_ext);
- childMmpFilename = subdir.fileName();
- childMmpFilename = subdir.absoluteFilePath();
- childMmpFilename.replace(Option::pro_ext, QString(""));
- childMmpFilename.append(Option::mmp_ext);
- } else {
- childMmpFilename = subdir.absoluteFilePath();
- childMmpFilename.replace(Option::pro_ext, Option::mmp_ext);
- sub_name = childMmpFilename;
- sub_name.replace(Option::mmp_ext, QString(""));
- sub_name.replace(0, sub_name.lastIndexOf("/") + 1, QString(""));
- project->values("SHADOW_BLD_INFS").append(QString("bld.inf.") + sub_name);
- }
-
- //handle sub project
- QMakeProject *sub_proj = new QMakeProject(project->properties());
- for (int ind = 0; ind < sub->indent; ++ind)
- printf(" ");
- sub->input_dir = subdir.absolutePath();
- if (subdir.isRelative() && old_output_dir != oldpwd) {
- sub->output_dir = old_output_dir + "/" + subdir.path();
- printf("Reading %s [%s]\n", subdir.absoluteFilePath().toLatin1().constData(), sub->output_dir.toLatin1().constData());
- } else {
- sub->output_dir = sub->input_dir;
- printf("Reading %s\n", subdir.absoluteFilePath().toLatin1().constData());
- }
-
- // find the child mmp filename
- qmake_setpwd(sub->input_dir);
-
- QString newpwd = qmake_getpwd();
-
- Option::output_dir = sub->output_dir;
- if (Option::output_dir.at(Option::output_dir.length() - 1) != QLatin1Char('/'))
- Option::output_dir += QLatin1Char('/');
- sub_proj->read(subdir.fileName());
- if (!sub_proj->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
- fprintf(stderr, "Project file(%s) not recursed because all requirements not met:\n\t%s\n",
- subdir.fileName().toLatin1().constData(),
- sub_proj->values("QMAKE_FAILED_REQUIREMENTS").join(" ").toLatin1().constData());
- delete sub;
- delete sub_proj;
- //continue;
- } else {
- // map mmpfile to its absolut filepath
- mmpPaths.insert(childMmpFilename, newpwd);
-
- // update mmp files dependency map
- mmpDependency.insert(parentMmpFilename, childMmpFilename);
-
- sub->makefile = MetaMakefileGenerator::createMetaGenerator(sub_proj, sub_name);
- if (0 && sub->makefile->type() == SUBDIRSMETATYPE) {
- subs.append(sub);
- } else {
- const QString output_name = Option::output.fileName();
- Option::output.setFileName(sub->output_file);
- sub->makefile->write(sub->output_dir);
- delete sub;
- qmakeClearCaches();
- sub = 0;
- Option::output.setFileName(output_name);
- }
- }
-
- Option::output_dir = old_output_dir;
- qmake_setpwd(oldpwd);
-
- }
- --recurseDepth;
- Option::output.setFileName(old_output);
- Option::output_dir = old_output_dir;
- qmake_setpwd(oldpwd);
- }
-
- Subdir *self = new Subdir;
- self->input_dir = qmake_getpwd();
-
- // To fully expand find all dependencies:
- // Do as recursion, then insert result as subdirs data in project
- QString newpwd = qmake_getpwd();
- if (!newpwd.endsWith('/'))
- newpwd += '/';
- int end = newpwd.size() - 1;
- int start = newpwd.lastIndexOf("/", end - 2);
- QString mmpFilename = newpwd.mid(start + 1, end - start - 1);
- mmpFilename.prepend(newpwd);
- mmpFilename = mmpFilename.append(Option::mmp_ext);
-
- // map mmpfile to its absolute filepath
- mmpPaths.insert(mmpFilename, newpwd);
-
- QStringList directDependencyList = getDependencyList(mmpFilename, -1);
- for (int i = 0; i < directDependencyList.size(); ++i) {
- project->values("MMPFILES_DIRECT_DEPENDS").append(directDependencyList.at(i));
- }
-
- QStringList dependencyList = getDependencyList(mmpFilename, 0);
-
- self->output_dir = Option::output_dir;
- if (!Option::recursive || (!Option::output.fileName().endsWith(Option::dir_sep) && !QFileInfo(Option::output).isDir()))
- self->output_file = Option::output.fileName();
- self->makefile = new BuildsMetaMakefileGenerator(project, name, false);
- self->makefile->init();
- subs.append(self);
-
- return true;
-}
-
-QStringList SymbianSubdirsMetaMakefileGenerator::calculateRelativePaths(QString mmpParent, QStringList mmpChildren)
-{
- QStringList mmpRelativePaths;
- QString parentDir = mmpPaths.value(mmpParent);
- QDir directory(parentDir);
- for (int i = 0; i < mmpChildren.size(); ++i) {
- QString childDir = mmpPaths.value(mmpChildren.at(i));
- if (mmpChildren.at(i) == mmpParent)
- mmpRelativePaths.append(mmpChildren.at(i));
- else {
- QString relativePath = directory.relativeFilePath(childDir);
- if (relativePath.startsWith(".."))
- mmpRelativePaths.append(childDir);
- else
- directory.relativeFilePath(relativePath);
- }
- }
- return mmpRelativePaths;
-}
-
//Factory things
QT_BEGIN_INCLUDE_NAMESPACE
#include "unixmake.h"
@@ -745,20 +487,19 @@ MetaMakefileGenerator::createMakefileGenerator(QMakeProject *proj, bool noIO)
}
MetaMakefileGenerator *
-MetaMakefileGenerator::createMetaGenerator(QMakeProject *proj, const QString &name, bool op)
+MetaMakefileGenerator::createMetaGenerator(QMakeProject *proj, const QString &name, bool op, bool *success)
{
MetaMakefileGenerator *ret = 0;
if ((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL)) {
- if (proj->first("MAKEFILE_GENERATOR").startsWith("SYMBIAN") && proj->values("TEMPLATE").contains("subdirs")) {
- // new metamakefilegenerator type to support subdirs for symbian related projects
- ret = new SymbianSubdirsMetaMakefileGenerator(proj, name, op);
- } else if (proj->first("TEMPLATE").endsWith("subdirs"))
+ if (proj->first("TEMPLATE").endsWith("subdirs"))
ret = new SubdirsMetaMakefileGenerator(proj, name, op);
}
if (!ret)
ret = new BuildsMetaMakefileGenerator(proj, name, op);
- ret->init();
+ bool res = ret->init();
+ if (success)
+ *success = res;
return ret;
}
diff --git a/qmake/generators/metamakefile.h b/qmake/generators/metamakefile.h
index e69304a..f74f4a2 100644
--- a/qmake/generators/metamakefile.h
+++ b/qmake/generators/metamakefile.h
@@ -62,7 +62,7 @@ public:
virtual ~MetaMakefileGenerator();
- static MetaMakefileGenerator *createMetaGenerator(QMakeProject *proj, const QString &name, bool op=true);
+ static MetaMakefileGenerator *createMetaGenerator(QMakeProject *proj, const QString &name, bool op=true, bool *success = 0);
static MakefileGenerator *createMakefileGenerator(QMakeProject *proj, bool noIO = false);
inline QMakeProject *projectFile() const { return project; }
diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp
index 3d24053..19af1da 100644
--- a/qmake/generators/symbian/symmake.cpp
+++ b/qmake/generators/symbian/symmake.cpp
@@ -1092,6 +1092,7 @@ void SymbianMakefileGenerator::writeMmpFileRulesPart(QTextStream& t)
void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploymentExtension)
{
// Read user defined bld inf rules
+
QMap<QString, QStringList> userBldInfRules;
for (QMap<QString, QStringList>::iterator it = project->variables().begin(); it != project->variables().end(); ++it) {
if (it.key().startsWith(BLD_INF_RULES_BASE)) {
@@ -1122,58 +1123,44 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
QString mmpfilename = escapeFilePath(fileFixify(project->projectFile()));
mmpfilename = mmpfilename.replace(mmpfilename.lastIndexOf("."), 4, Option::mmp_ext);
QString currentPath = qmake_getpwd();
+ QDir directory(currentPath);
- if (!currentPath.endsWith(QString("/")))
- currentPath.append("/");
-
- QStringList mmpProjects = project->values("MMPFILES_DIRECT_DEPENDS");
- QStringList shadowProjects = project->values("SHADOW_BLD_INFS");
-
- removeDuplicatedStrings(mmpProjects);
- removeDuplicatedStrings(shadowProjects);
+ const QStringList &subdirs = project->values("SUBDIRS");
+ foreach(QString item, subdirs) {
+ QString fixedItem;
+ if (!project->isEmpty(item + ".file")) {
+ fixedItem = project->first(item + ".file");
+ } else if (!project->isEmpty(item + ".subdir")) {
+ fixedItem = project->first(item + ".subdir");
+ } else {
+ fixedItem = item;
+ }
- // Go in reverse order as that is the way how we build the list
- QListIterator<QString> iT(mmpProjects);
- iT.toBack();
- while (iT.hasPrevious()) {
- QString fullMmpName = iT.previous();
- QString relativePath;
+ QFileInfo subdir(fileInfo(fixedItem));
+ QString relativePath = directory.relativeFilePath(fixedItem);
+ QString subdirFileName = subdir.completeBaseName();
+ QString fullProName = subdir.absoluteFilePath();;
QString bldinfFilename;
- QString fullProFilename = fullMmpName;
- fullProFilename.replace(Option::mmp_ext, Option::pro_ext);
- QString uid = generate_uid(fullProFilename);
-
- QString cleanMmpName = fullProFilename;
- cleanMmpName.replace(Option::pro_ext, QString(""));
- cleanMmpName.replace(0, cleanMmpName.lastIndexOf("/") + 1, QString(""));
-
- if (shadowProjects.contains(BLD_INF_FILENAME "." + cleanMmpName)) { // shadow project
- QDir directory(currentPath);
- relativePath = directory.relativeFilePath(fullProFilename);
- bldinfFilename = BLD_INF_FILENAME "." + cleanMmpName;
+ if (subdir.isDir()) {
+ // Subdir is a regular project
+ bldinfFilename = relativePath + QString("/") + QString(BLD_INF_FILENAME);
+ fullProName += QString("/") + subdirFileName + Option::pro_ext;
+ } else {
+ // Subdir is actually a .pro file
if (relativePath.contains("/")) {
- // Shadow .pro not in same directory as parent .pro
- if (relativePath.startsWith("..")) {
- // Shadow .pro out of parent .pro
- relativePath.replace(relativePath.lastIndexOf("/"), relativePath.length(), QString(""));
- bldinfFilename.prepend("/").prepend(relativePath);
- } else {
- relativePath.replace(relativePath.lastIndexOf("/"), relativePath.length(), QString(""));
- bldinfFilename.prepend("/").prepend(relativePath);
- }
+ // .pro not in same directory as parent .pro
+ relativePath.remove(relativePath.lastIndexOf("/") + 1, relativePath.length());
+ bldinfFilename = relativePath;
} else {
- // Shadow .pro and parent .pro in same directory
- bldinfFilename.prepend("./");
+ // .pro and parent .pro in same directory
+ bldinfFilename = QString("./");
}
- } else { // regular project
- QDir directory(currentPath);
- relativePath = directory.relativeFilePath(fullProFilename);
- relativePath.replace(relativePath.lastIndexOf("/"), relativePath.length(), QString(""));
- bldinfFilename = relativePath.append("/").append(BLD_INF_FILENAME);
+ bldinfFilename += QString(BLD_INF_FILENAME ".") + subdirFileName;
}
- QString bldinfDefine = QString("BLD_INF_") + cleanMmpName + QString("_") + uid;
+ QString uid = generate_uid(fullProName);
+ QString bldinfDefine = QString("BLD_INF_") + subdirFileName + QString("_") + uid;
bldinfDefine = bldinfDefine.toUpper();
removeSpecialCharacters(bldinfDefine);
@@ -1195,6 +1182,7 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
t << endl;
// Add project mmps and old style extension makefiles
+
QString mmpTag;
if (project->values("CONFIG").contains("symbian_test", Qt::CaseInsensitive))
mmpTag = QLatin1String(BLD_INF_TAG_TESTMMPFILES);
@@ -1204,9 +1192,7 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
t << endl << mmpTag << endl << endl;
writeBldInfMkFilePart(t, addDeploymentExtension);
- if (targetType == TypeSubdirs) {
- mmpProjects.removeOne(mmpfilename);
- } else {
+ if (targetType != TypeSubdirs) {
QString shortProFilename = project->projectFile();
shortProFilename.replace(0, shortProFilename.lastIndexOf("/") + 1, QString(""));
shortProFilename.replace(Option::pro_ext, QString(""));
@@ -1224,6 +1210,7 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy
t << endl << BLD_INF_TAG_EXTENSIONS << endl << endl;
// Generate extension rules
+
writeBldInfExtensionRulesPart(t);
userItems = userBldInfRules.value(BLD_INF_TAG_EXTENSIONS);
@@ -1698,8 +1685,8 @@ void SymbianMakefileGenerator::writeSisTargets(QTextStream &t)
.arg(MAKE_CACHE_NAME)
.arg(OK_SIS_TARGET)
.arg(FAIL_SIS_NOCACHE_TARGET)
- .arg(FAIL_SIS_NOPKG_TARGET);
- t << siscommand << endl;
+ .arg(FAIL_SIS_NOPKG_TARGET);
+ t << siscommand << endl;
t << endl;
t << OK_SIS_TARGET ":" << endl;
@@ -1710,15 +1697,15 @@ void SymbianMakefileGenerator::writeSisTargets(QTextStream &t)
.arg("pkg");
t << pkgcommand << endl;
t << endl;
-
- t << FAIL_SIS_NOPKG_TARGET ":" << endl;
- t << "\t$(error PKG file does not exist, 'SIS' target is only supported for executables or projects with DEPLOYMENT statement)" << endl;
+
+ t << FAIL_SIS_NOPKG_TARGET ":" << endl;
+ t << "\t$(error PKG file does not exist, 'SIS' target is only supported for executables or projects with DEPLOYMENT statement)" << endl;
t << endl;
-
- t << FAIL_SIS_NOCACHE_TARGET ":" << endl;
- t << "\t$(error Project has to be build before calling 'SIS' target)" << endl;
+
+ t << FAIL_SIS_NOCACHE_TARGET ":" << endl;
+ t << "\t$(error Project has to be build before calling 'SIS' target)" << endl;
t << endl;
-
+
t << RESTORE_BUILD_TARGET ":" << endl;
t << "-include " MAKE_CACHE_NAME << endl;
@@ -1728,7 +1715,8 @@ void SymbianMakefileGenerator::writeSisTargets(QTextStream &t)
void SymbianMakefileGenerator::generateDistcleanTargets(QTextStream& t)
{
t << "dodistclean:" << endl;
- foreach(QString item, project->values("SUBDIRS")) {
+ const QStringList &subdirs = project->values("SUBDIRS");
+ foreach(QString item, subdirs) {
bool fromFile = false;
QString fixedItem;
if (!project->isEmpty(item + ".file")) {
diff --git a/qmake/main.cpp b/qmake/main.cpp
index 73fdda9..a0346c5 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -168,7 +168,11 @@ int runQMake(int argc, char **argv)
continue;
}
- MetaMakefileGenerator *mkfile = MetaMakefileGenerator::createMetaGenerator(&project, QString(), false);
+ bool success = true;
+ MetaMakefileGenerator *mkfile = MetaMakefileGenerator::createMetaGenerator(&project, QString(), false, &success);
+ if (!success)
+ exit_val = 3;
+
if(mkfile && !mkfile->write(oldpwd)) {
if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
fprintf(stderr, "Unable to generate project file.\n");
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 89fe5bd..e49441b 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -519,7 +519,7 @@ static isForSymbian_enum isForSymbian_value = isForSymbian_NOT_SET;
// Checking for symbian build is primarily determined from the qmake spec,
// but if that is not specified, detect if symbian is the default spec
// by checking the MAKEFILE_GENERATOR variable value.
-static void init_isForSymbian(const QMap<QString, QStringList>& vars)
+static void init_symbian(const QMap<QString, QStringList>& vars)
{
if (isForSymbian_value != isForSymbian_NOT_SET)
return;
@@ -527,26 +527,27 @@ static void init_isForSymbian(const QMap<QString, QStringList>& vars)
QString spec = QFileInfo(Option::mkfile::qmakespec).fileName();
if (spec.startsWith("symbian-abld", Qt::CaseInsensitive)) {
isForSymbian_value = isForSymbian_ABLD;
- return;
- }
- if (spec.startsWith("symbian-sbsv2", Qt::CaseInsensitive)) {
+ } else if (spec.startsWith("symbian-sbsv2", Qt::CaseInsensitive)) {
isForSymbian_value = isForSymbian_SBSV2;
- return;
- }
-
- QStringList generatorList = vars["MAKEFILE_GENERATOR"];
-
- if (!generatorList.isEmpty()) {
- QString generator = generatorList.first();
- if (generator.startsWith("SYMBIAN_ABLD"))
- isForSymbian_value = isForSymbian_ABLD;
- else if (generator.startsWith("SYMBIAN_SBSV2"))
- isForSymbian_value = isForSymbian_SBSV2;
- else
- isForSymbian_value = isForSymbian_FALSE;
} else {
- isForSymbian_value = isForSymbian_FALSE;
+ QStringList generatorList = vars["MAKEFILE_GENERATOR"];
+
+ if (!generatorList.isEmpty()) {
+ QString generator = generatorList.first();
+ if (generator.startsWith("SYMBIAN_ABLD"))
+ isForSymbian_value = isForSymbian_ABLD;
+ else if (generator.startsWith("SYMBIAN_SBSV2"))
+ isForSymbian_value = isForSymbian_SBSV2;
+ else
+ isForSymbian_value = isForSymbian_FALSE;
+ } else {
+ isForSymbian_value = isForSymbian_FALSE;
+ }
}
+
+ // Force recursive on Symbian, as non-recursive is not really a viable option there
+ if (isForSymbian_value != isForSymbian_FALSE)
+ Option::recursive = true;
}
bool isForSymbian()
@@ -554,9 +555,9 @@ bool isForSymbian()
// If isForSymbian_value has not been initialized explicitly yet,
// call initializer with dummy map to check qmake spec.
if (isForSymbian_value == isForSymbian_NOT_SET)
- init_isForSymbian(QMap<QString, QStringList>());
+ init_symbian(QMap<QString, QStringList>());
- return (isForSymbian_value == isForSymbian_ABLD || isForSymbian_value == isForSymbian_SBSV2);
+ return (isForSymbian_value != isForSymbian_FALSE);
}
bool isForSymbianSbsv2()
@@ -564,7 +565,7 @@ bool isForSymbianSbsv2()
// If isForSymbian_value has not been initialized explicitly yet,
// call initializer with dummy map to check qmake spec.
if (isForSymbian_value == isForSymbian_NOT_SET)
- init_isForSymbian(QMap<QString, QStringList>());
+ init_symbian(QMap<QString, QStringList>());
return (isForSymbian_value == isForSymbian_SBSV2);
}
@@ -1463,7 +1464,7 @@ QMakeProject::read(uchar cmd)
return false;
}
- init_isForSymbian(base_vars);
+ init_symbian(base_vars);
if(Option::mkfile::do_cache && !Option::mkfile::cachefile.isEmpty()) {
debug_msg(1, "QMAKECACHE file: reading %s", Option::mkfile::cachefile.toLatin1().constData());
@@ -1715,7 +1716,7 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap<QString, QStringL
if(file.indexOf(Option::dir_sep) == -1 || !QFile::exists(file)) {
static QStringList *feature_roots = 0;
if(!feature_roots) {
- init_isForSymbian(base_vars);
+ init_symbian(base_vars);
feature_roots = new QStringList(qmake_feature_paths(prop));
qmakeAddCacheClear(qmakeDeleteCacheClear_QStringList, (void**)&feature_roots);
}
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp
index f2148d0..f3ded7e 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/FastMalloc.cpp
@@ -103,6 +103,11 @@
#define USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY 1
#endif
+#if defined(__HP_aCC)
+// HP'a aCC compiler has broken for scoping
+# define for if(0){}else for
+#endif
+
#ifndef NDEBUG
namespace WTF {
@@ -2902,7 +2907,7 @@ TCMalloc_ThreadCache* TCMalloc_ThreadCache::CreateCacheIfNecessary() {
// Initialize per-thread data if necessary
TCMalloc_ThreadCache* heap = NULL;
{
- SpinLockHolder h(&pageheap_lock);
+ SpinLockHolder lockholder(&pageheap_lock);
#if COMPILER(MSVC)
DWORD me;
diff --git a/src/3rdparty/libpng/ANNOUNCE b/src/3rdparty/libpng/ANNOUNCE
index 5580fb8..b73bbb5 100644
--- a/src/3rdparty/libpng/ANNOUNCE
+++ b/src/3rdparty/libpng/ANNOUNCE
@@ -1,5 +1,5 @@
-Libpng 1.2.29 - May 8, 2008
+Libpng 1.2.40 - September 10, 2009
This is a public release of libpng, intended for use in production codes.
@@ -8,53 +8,49 @@ Files available for download:
Source files with LF line endings (for Unix/Linux) and with a
"configure" script
- libpng-1.2.29.tar.gz
- libpng-1.2.29.tar.lzma
- (Get the lzma codec from <http://tukaani.org/lzma>).
- libpng-1.2.29.tar.bz2
+ libpng-1.2.40.tar.xz (LZMA-compressed, recommended)
+ libpng-1.2.40.tar.gz
+ libpng-1.2.40.tar.bz2
Source files with LF line endings (for Unix/Linux) without the
"configure" script
- libpng-1.2.29-no-config.tar.gz
- libpng-1.2.29-no-config.tar.lzma
- libpng-1.2.29-no-config.tar.bz2
+ libpng-1.2.40-no-config.tar.xz (LZMA-compressed, recommended)
+ libpng-1.2.40-no-config.tar.gz
+ libpng-1.2.40-no-config.tar.bz2
Source files with CRLF line endings (for Windows), without the
"configure" script
- lpng1229.zip
- lpng1229.7z
- lpng1229.tar.bz2
+ lpng1240.zip
+ lpng1240.7z
+ lpng1240.tar.bz2
Project files
- libpng-1.2.29-project-netware.zip
- libpng-1.2.29-project-wince.zip
+ libpng-1.2.40-project-netware.zip
+ libpng-1.2.40-project-wince.zip
Other information:
- libpng-1.2.29-README.txt
- libpng-1.2.29-KNOWNBUGS.txt
- libpng-1.2.29-LICENSE.txt
- libpng-1.2.29-Y2K-compliance.txt
- libpng-1.2.29-[previous version]-diff.txt
+ libpng-1.2.40-README.txt
+ libpng-1.2.40-KNOWNBUGS.txt
+ libpng-1.2.40-LICENSE.txt
+ libpng-1.2.40-Y2K-compliance.txt
+ libpng-1.2.40-[previous version]-diff.txt
-Changes since the last public release (1.2.28):
+Changes since the last public release (1.2.39):
-version 1.2.29 [May 8, 2008]
+version 1.2.40 [September 10, 2009]
- Removed some stray *.diff and *.orig files
- Reverted Makefile.in, aclocal.m4, and configure to the libpng-1.2.26
- versions.
- Added --force to autogen libtoolize options and --force-missing to
- automake options.
- Changed $(ECHO) to echo in Makefile.am and Makefile.in
- Updated all configure files to autoconf-2.62
- #ifdef out pnggcrd.c code if using MSC_VER
+ Removed an extra png_debug() recently added to png_write_find_filter().
+ Fixed incorrect #ifdef in pngset.c regarding unknown chunk support.
+ Various bugfixes and improvements to CMakeLists.txt (Philip Lowman)
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
-(subscription required; visit
+
+Send comments/corrections/commendations to png-mng-implement at lists.sf.net
+(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
to subscribe) or to glennrp at users.sourceforge.net
diff --git a/src/3rdparty/libpng/CHANGES b/src/3rdparty/libpng/CHANGES
index 590987c..9bb8ac8 100644
--- a/src/3rdparty/libpng/CHANGES
+++ b/src/3rdparty/libpng/CHANGES
@@ -1,4 +1,4 @@
-
+/*
CHANGES - changes for libpng
version 0.2
@@ -539,7 +539,8 @@ version 1.0.5d [November 29, 1999]
Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays.
Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available
to applications a macro "PNG_USE_LOCAL_ARRAYS".
- #ifdef out all the new declarations when PNG_USE_GLOBAL_ARRAYS is defined.
+ Remove all the new declarations with #ifdef/#endif when
+ PNG_USE_GLOBAL_ARRAYS is defined.
Added PNG_EXPORT_VAR macro to accommodate making DLL's.
version 1.0.5e [November 30, 1999]
Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text
@@ -1179,7 +1180,7 @@ version 1.2.4beta3 [June 28, 2002]
Plugged memory leak of row_buf in pngtest.c when there is a png_error().
Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data.
Added "test-installed" target to makefile.32sunu, makefile.64sunu,
- makefile.beos, makefile.darwin, makefile.dec, makefile.macosx,
+ makefile.beos, makefile.darwin, makefile.dec, makefile.macosx,
makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9.
version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002]
Added "test-installed" target to makefile.cygwin and makefile.sco.
@@ -1300,7 +1301,7 @@ version 1.2.6beta4 [July 28, 2004]
Added PNG_NO_SEQUENTIAL_READ_SUPPORTED macro to conditionally remove
sequential read support.
Added some "#if PNG_WRITE_SUPPORTED" blocks.
- #ifdef'ed out some redundancy in png_malloc_default().
+ Removed some redundancy with #ifdef/#endif in png_malloc_default().
Use png_malloc instead of png_zalloc to allocate the pallete.
version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004]
Fixed buffer overflow vulnerability in png_handle_tRNS()
@@ -1370,7 +1371,8 @@ version 1.2.8beta1 [November 1, 2004]
Fixed bug, introduced in libpng-1.2.7, that overruns a buffer during
strip alpha operation in png_do_strip_filler().
Added PNG_1_2_X definition in pngconf.h
- #ifdef out png_info_init in png.c and png_read_init in pngread.c (as of 1.3.0)
+ Comment out with #ifdef/#endif png_info_init in png.c and png_read_init
+ in pngread.c (as of 1.3.0)
version 1.2.8beta2 [November 2, 2004]
Reduce color_type to a nonalpha type after strip alpha operation in
png_do_strip_filler().
@@ -1387,7 +1389,7 @@ version 1.2.8beta5 [November 20, 2004]
Use png_ptr->flags instead of png_ptr->transformations to pass
PNG_STRIP_ALPHA info to png_do_strip_filler(), to preserve ABI
compatibility.
- Revised handling of SPECIALBUILD, PRIVATEBUILD,
+ Revised handling of SPECIALBUILD, PRIVATEBUILD,
PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING.
version 1.2.8rc1 [November 24, 2004]
Moved handling of BUILD macros from pngconf.h to png.h
@@ -1685,14 +1687,14 @@ version 1.2.16beta1 [January 6, 2007]
version 1.2.16beta2 [January 16, 2007]
Revised scripts/CMakeLists.txt
-
+
version 1.0.24, 1.2.16 [January 31, 2007]
No changes.
-
+
version 1.2.17beta1 [March 6, 2007]
Revised scripts/CMakeLists.txt to install both shared and static libraries.
Deleted a redundant line from pngset.c.
-
+
version 1.2.17beta2 [April 26, 2007]
Relocated misplaced test for png_ptr == NULL in pngpread.c
Change "==" to "&" for testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN
@@ -1713,7 +1715,7 @@ version 1.2.17rc2 [May 8, 2007]
Added png_ptr->unknown_chunk to hold working unknown chunk data, so it
can be free'ed in case of error. Revised unknown chunk handling in
pngrutil.c and pngpread.c to use this structure.
-
+
version 1.2.17rc3 [May 8, 2007]
Revised symbol-handling in configure script.
@@ -1756,9 +1758,9 @@ version 1.2.19beta6 [May 22, 2007]
Added a special "_MSC_VER" case that defines png_snprintf to _snprintf
version 1.2.19beta7 [May 22, 2007]
- Squelched png_squelch_warnings() in pnggccrd.c and added an
- #ifdef PNG_MMX_CODE_SUPPORTED block around the declarations that caused
- the warnings that png_squelch_warnings was squelching.
+ Squelched png_squelch_warnings() in pnggccrd.c and added
+ an #ifdef PNG_MMX_CODE_SUPPORTED/#endif block around the declarations
+ that caused the warnings that png_squelch_warnings was squelching.
version 1.2.19beta8 [May 22, 2007]
Removed __MMX__ from test in pngconf.h.
@@ -2107,7 +2109,7 @@ version 1.2.27beta01 [April 12, 2008]
Fixed bug (introduced in libpng-1.0.5h) with handling zero-length
unknown chunks.
Added more information about png_set_keep_unknown_chunks() to the
- documetation.
+ documentation.
Reject tRNS chunk with out-of-range samples instead of masking off
the invalid high bits as done in since libpng-1.2.19beta5.
@@ -2127,7 +2129,7 @@ version 1.2.27beta04 [April 18, 2008]
Rebuilt Makefile.in, aclocal.m4, and configure with autoconf-2.62
version 1.2.27beta05 [April 19, 2008]
- Added MAINTEINERCLEANFILES variable to Makefile.am
+ Added MAINTAINERCLEANFILES variable to Makefile.am
version 1.2.27beta06 [April 21, 2008]
Avoid changing color_type from GRAY to RGB by
@@ -2156,7 +2158,7 @@ version 1.2.29beta03 [May 2, 2008]
automake options.
Changed $(ECHO) to echo in Makefile.am and Makefile.in
Updated all configure files to autoconf-2.62
- #ifdef out pnggcrd.c code if using MSC_VER
+ Comment out pnggcrd.c code with #ifdef/#endif if using MSC_VER
version 1.2.29rc01 [May 4, 2008]
No changes.
@@ -2164,6 +2166,309 @@ version 1.2.29rc01 [May 4, 2008]
version 1.0.35 and 1.2.29 [May 8, 2008]
No changes.
+version 1.0.37 [May 9, 2008]
+ Updated Makefile.in and configure (omitted version 1.0.36).
+
+version 1.2.30beta01 [May 29, 2008]
+ Updated libpng.pc-configure.in and libpng-config.in per debian bug reports.
+
+version 1.2.30beta02 [June 25, 2008]
+ Restored png_flush(png_ptr) at the end of png_write_end(), that was
+ removed from libpng-1.0.9beta03.
+
+version 1.2.30beta03 [July 6, 2008]
+ Merged some cosmetic whitespace changes from libpng-1.4.0beta19.
+ Inline call of png_get_uint_32() in png_get_uint_31(), as in 1.4.0beta19.
+ Added demo of decoding vpAg and sTER chunks to pngtest.c, from 1.4.0beta19.
+ Changed PNGMAJ from 0 to 12 in makefile.darwin, which does not like 0.
+ Added new private function png_read_chunk_header() from 1.4.0beta19.
+ Merge reading of chunk length and chunk type into a single 8-byte read.
+ Merge writing of chunk length and chunk type into a single 8-byte write.
+
+version 1.2.30beta04 [July 10, 2008]
+ Merged more cosmetic whitespace changes from libpng-1.4.0beta19.
+
+version 1.0.38rc01, 1.2.30rc01 [July 18, 2008]
+ No changes.
+
+version 1.0.38rc02, 1.2.30rc02 [July 21, 2008]
+ Moved local array "chunkdata" from pngrutil.c to the png_struct, so
+ it will be freed by png_read_destroy() in case of a read error (Kurt
+ Christensen).
+
+version 1.0.38rc03, 1.2.30rc03 [July 21, 2008]
+ Changed "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking.
+
+version 1.0.38rc04, 1.2.30rc04 [July 22, 2008]
+ Changed "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in
+ png_decompress_chunk().
+
+version 1.0.38rc05, 1.2.30rc05 [July 25, 2008]
+ Changed all remaining "chunkdata" to "png_ptr->chunkdata" in
+ png_decompress_chunk() and remove chunkdata from parameter list.
+ Put a call to png_check_chunk_name() in png_read_chunk_header().
+ Revised png_check_chunk_name() to reject a name with a lowercase 3rd byte.
+ Removed two calls to png_check_chunk_name() occuring later in the process.
+
+version 1.0.38rc06, 1.2.30rc06 [July 29, 2008]
+ Added a call to png_check_chunk_name() in pngpread.c
+ Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte.
+
+version 1.0.38r07, 1.2.30r07 [August 2, 2008]
+ Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta)
+ Declared png_ptr "volatile" in pngread.c and pngwrite.c to avoid warnings.
+ Added code in pngset.c to quiet compiler warnings.
+ Updated contrib/visupng/cexcept.h to version 2.0.1
+ Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c
+
+version 1.0.38r08, 1.2.30r08 [August 2, 2008]
+ Enclose "volatile" declarations in #ifdef PNG_SETJMP_SUPPORTED (Cosmin).
+
+version 1.0.38, 1.2.30 [August 14, 2008]
+ No changes.
+
+version 1.2.31rc01 [August 19, 2008]
+ Removed extra crc check at the end of png_handle_cHRM(). Bug introduced
+ in libpng-1.2.30beta03 (Heiko Nitzsche).
+
+version 1.2.31rc02 [August 19, 2008]
+ Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call.
+
+version 1.2.31rc03 [August 19, 2008]
+ Added PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED block, off by default, around
+ new png_flush().
+
+version 1.0.39, 1.2.31 [August 21, 2008]
+ No changes.
+
+version 1.2.32beta01 [September 6, 2008]
+ Shortened tIME_string to 29 bytes in pngtest.c (bug introduced in
+ libpng-1.2.22).
+ Fixed off-by-one error introduced in png_push_read_zTXt() function in
+ libpng-1.2.30beta04/pngpread.c (Harald van Dijk)
+ These bugs have been given the vulnerability id CVE-2008-3964.
+
+version 1.0.40, 1.2.32 [September 18, 2008]
+ No changes.
+
+version 1.2.33beta01 [October 6, 2008]
+ Revised makefile.darwin to fix shared library numbering.
+ Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8()
+ in example.c (debian bug report)
+
+version 1.2.33rc01 [October 15, 2008]
+ No changes.
+
+version 1.0.41rc01, version 1.2.33rc02 [October 23, 2008]
+ Changed remaining "key" to "png_ptr->chunkdata" in png_handle_tEXt()
+ to avoid memory leak after memory failure while reading tEXt chunk.`
+
+version 1.2.33 [October 31, 2008]
+ No changes.
+
+version 1.2.34beta01 [November 27, 2008]
+ Revised png_warning() to write its message on standard output by default
+ when warning_fn is NULL. This was the behavior prior to libpng-1.2.9beta9.
+ Fixed string vs pointer-to-string error in png_check_keyword().
+ Added png_check_cHRM_fixed() in png.c and moved checking from pngget.c,
+ pngrutil.c, and pngwrite.c, and eliminated floating point cHRM checking.
+ Added check for zero-area RGB cHRM triangle in png_check_cHRM_fixed().
+ In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant
+ check for all-zero coordinates that is detected by the triangle check.
+ Revised png_warning() to write its message on standard output by default
+ when warning_fn is NULL.
+
+version 1.2.34beta02 [November 28, 2008]
+ Corrected off-by-one error in bKGD validity check in png_write_bKGD()
+ and in png_handle_bKGD().
+
+version 1.2.34beta03 [December 1, 2008]
+ Revised bKGD validity check to use >= x instead of > x + 1
+ Merged with png_debug from libpng-1.4.0 to remove newlines.
+
+version 1.2.34beta04 [December 2, 2008]
+ More merging with png_debug from libpng-1.4.0 to remove newlines.
+
+version 1.2.34beta05 [December 5, 2008]
+ Removed redundant check for key==NULL before calling png_check_keyword()
+ to ensure that new_key gets initialized and removed extra warning
+ (Arvan Pritchard).
+
+version 1.2.34beta06 [December 9, 2008]
+ In png_write_png(), respect the placement of the filler bytes in an earlier
+ call to png_set_filler() (Jim Barry).
+
+version 1.2.34beta07 [December 9, 2008]
+ Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and
+ PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated
+ PNG_TRANSFORM_STRIP_FILLER (Jim Barry).
+
+version 1.0.42rc01, 1.2.34rc01 [December 11, 2008]
+ No changes.
+
+version 1.0.42, 1.2.34 [December 18, 2008]
+ No changes.
+
+version 1.2.35beta01 [February 4, 2009]
+ Zero out some arrays of pointers after png_malloc(). (Tavis Ormandy)
+
+version 1.2.35beta02 [February 4, 2009]
+ Zero out more arrays of pointers after png_malloc().
+
+version 1.2.35beta03 [February 5, 2009]
+ Use png_memset() instead of a loop to intialize pointers. We realize
+ this will not work on platforms where the NULL pointer is not all zeroes.
+
+version 1.2.35rc01 [February 11, 2009]
+ No changes.
+
+version 1.2.35rc02 [February 12, 2009]
+ Fix typo in new png_memset call in pngset.c (png_color should be png_charp)
+
+version 1.0.43 and 1.2.35 [February 14, 2009]
+ No changes.
+
+version 1.2.36beta01 [February 28, 2009]
+ Revised comments in png_set_read_fn() and png_set_write_fn().
+ Revised order of #ifdef's and indentation in png_debug definitions of png.h
+ bug introduced in libpng-1.2.34.
+
+version 1.2.36beta02 [March 21, 2009]
+ Use png_memset() after png_malloc() of big_row_buf when reading an
+ interlaced file, to avoid a possible UMR.
+ Undid recent revision of PNG_NO_STDIO version of png_write_flush(). Users
+ having trouble with fflush() can build with PNG_NO_WRITE_FLUSH defined.
+ Revised libpng*.txt documentation about use of png_write_flush().
+ Removed fflush() from pngtest.c.
+ Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h
+
+version 1.2.36beta03 [March 27, 2009]
+ Relocated misplaced PNG_1_0_X define in png.h that caused the prototype
+ for png_set_strip_error_numbers() to be omitted from PNG_NO_ASSEMBLER_CODE
+ builds. This bug was introduced in libpng-1.2.15beta4.
+ Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt
+
+version 1.2.36beta04 [April 5, 2009]
+ Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles)
+
+version 1.2.36beta05 [April 24, 2009]
+ Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow
+ application code writers to bypass the check for multiple inclusion
+ of setjmp.h when they know that it is safe to ignore the situation.
+ Made some cosmetic changes to whitespace in pngtest output.
+ Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress
+ "shadowed declaration" warning from gcc-4.3.3.
+ Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration"
+ warning about a global "gamma" variable in math.h on some platforms.
+
+version 1.2.36rc01 [April 30, 2009]
+ No changes.
+
+version 1.0.44 and 1.2.36 [May 7, 2009]
+ No changes.
+
+version 1.2.37beta01 [May 14, 2009]
+ Fixed inconsistency in pngrutil.c, introduced in libpng-1.2.36. The
+ memset() was using "png_ptr->rowbytes" instead of "row_bytes", which
+ the corresponding png_malloc() uses (Joe Drew).
+ Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri)
+ Updated some of the makefiles in the scripts directory (merged with
+ those in libpng-1.4.0beta57).
+
+version 1.2.37beta02 [May 19, 2009]
+ Fixed typo in libpng documentation (FILTER_AVE should be FILTER_AVG)
+ Relocated misplaced #endif in pngwrite.c, sCAL chunk handler.
+ Conditionally compile png_read_finish_row() which is not used by
+ progressive readers.
+ Added contrib/pngminim/preader to demonstrate building minimal progressive
+ decoder, based on contrib/gregbook with embedded libpng and zlib.
+
+version 1.2.37beta03 [May 20, 2009]
+ In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there
+ is only one makefile in those directories, and revised the README files
+ accordingly.
+ Reformated sources in libpng style (3-space indentation, comment format)
+
+version 1.2.37rc01 [May 27, 2009]
+ No changes.
+
+versions 1.2.37 and 1.0.45 [June 4, 2009]
+ Reformatted several remaining "else statement;" and "if () statement;" into
+ two lines.
+ Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h
+ and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h
+ Added sections about the git repository and our coding style to the
+ documentation (merged from libpng-1.4.0beta62)
+ Added a section to the libpng documentation about using png_get_io_ptr()
+ in configure scripts to detect the presence of libpng.
+
+version 1.2.38beta01 [June 17, 2009]
+ Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR()
+ multiple times and to specify the sample order in the tRNS chunk,
+ because the ISO PNG specification has a typo in the tRNS table.
+ Changed several PNG_UNKNOWN_CHUNK_SUPPORTED to
+ PNG_HANDLE_AS_UNKNOWN_SUPPORTED, to make the png_set_keep mechanism
+ available for ignoring known chunks even when not saving unknown chunks.
+ Adopted preference for consistent use of "#ifdef" and "#ifndef" versus
+ "#if defined()" and "if !defined()" where possible.
+ Added PNG_NO_HANDLE_AS_UNKNOWN in the PNG_LEGACY_SUPPORTED block of
+ pngconf.h, and moved the various unknown chunk macro definitions
+ outside of the PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks.
+
+version 1.0.46 [June 18, 2009]
+ Removed some editing cruft from scripts/libpng.pc.in and some makefiles.
+
+version 1.2.38rc01 [June 24, 2009]
+ No changes.
+
+version 1.2.38rc02 [June 29, 2009]
+ Added a reference to the libpng license in each source file.
+
+version 1.2.38rc03 [July 11, 2009]
+ Revised references to the libpng license in pngconf.h and contrib/visupng
+ source files.
+ Rebuilt configure scripts with autoconf-2.63.
+
+version 1.0.47 and 1.2.38 [July 16, 2009]
+ No changes.
+
+version 1.2.39beta01 [July 25, 2009]
+ Added a prototype for png_64bit_product() in png.c
+
+version 1.2.39beta02 [July 27, 2009]
+ Avoid a possible NULL dereference in debug build, in png_set_text_2().
+ (bug introduced in libpng-0.95, discovered by Evan Rouault)
+
+version 1.2.39beta03 [July 29, 2009]
+ Relocated new png_64_bit_product() prototype into png.h
+ Expanded the information about prototypes in the libpng style section of
+ the documentation.
+ Rebuilt configure scripts with autoconf-2.64.
+
+version 1.2.39beta04 [August 1, 2009]
+ Replaced *.tar.lzma with *.txz in distribution. Get the xz codec
+ from <http://tukaani.org/xz>.
+
+version 1.2.39beta05 [August 1, 2009]
+ Reject attempt to write iCCP chunk with negative embedded profile length
+ (JD Chen)
+
+version 1.2.39c01 [August 6, 2009]
+ No changes.
+
+version 1.2.39 and 1.0.48 [August 13, 2009]
+ No changes.
+
+version 1.2.40beta01 [August 20, 2009]
+ Removed an extra png_debug() recently added to png_write_find_filter().
+ Fixed incorrect #ifdef in pngset.c regarding unknown chunk support.
+
+version 1.2.40rc01 [September 2, 2009]
+ Various bugfixes and improvements to CMakeLists.txt (Philip Lowman)
+
+version 1.2.40 and 1.0.49 [September 10, 2009]
+ No changes.
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
@@ -2171,3 +2476,4 @@ to subscribe)
or to glennrp at users.sourceforge.net
Glenn R-P
+*/
diff --git a/src/3rdparty/libpng/INSTALL b/src/3rdparty/libpng/INSTALL
index 6060e31..2986ae3 100644
--- a/src/3rdparty/libpng/INSTALL
+++ b/src/3rdparty/libpng/INSTALL
@@ -1,5 +1,5 @@
-Installing libpng version 1.2.29 - May 8, 2008
+Installing libpng version 1.2.40 - September 10, 2009
On Unix/Linux and similar systems, you can simply type
@@ -44,7 +44,7 @@ to have access to the zlib.h and zconf.h include files that
correspond to the version of zlib that's installed.
You can rename the directories that you downloaded (they
-might be called "libpng-1.2.29" or "lpng109" and "zlib-1.2.1"
+might be called "libpng-1.2.40" or "lpng109" and "zlib-1.2.1"
or "zlib121") so that you have directories called "zlib" and "libpng".
Your directory structure should look like this:
@@ -101,9 +101,9 @@ include
CMakeLists.txt => "cmake" script
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
makefile.elf => Linux/ELF makefile symbol versioning,
- gcc, creates libpng12.so.0.1.2.29)
+ gcc, creates libpng12.so.0.1.2.40)
makefile.linux => Linux/ELF makefile
- (gcc, creates libpng12.so.0.1.2.29)
+ (gcc, creates libpng12.so.0.1.2.40)
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
makefile.knr => Archaic UNIX Makefile that converts files with
ansi2knr (Requires ansi2knr.c from
@@ -125,14 +125,14 @@ include
makefile.openbsd => OpenBSD makefile
makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib)
makefile.sggcc => Silicon Graphics (gcc,
- creates libpng12.so.0.1.2.29)
+ creates libpng12.so.0.1.2.40)
makefile.sunos => Sun makefile
makefile.solaris => Solaris 2.X makefile (gcc,
- creates libpng12.so.0.1.2.29)
+ creates libpng12.so.0.1.2.40)
makefile.solaris-x86 => Solaris/intelMMX 2.X makefile (gcc,
- creates libpng12.so.0.1.2.29)
+ creates libpng12.so.0.1.2.40)
makefile.so9 => Solaris 9 makefile (gcc,
- creates libpng12.so.0.1.2.29)
+ creates libpng12.so.0.1.2.40)
makefile.32sunu => Sun Ultra 32-bit makefile
makefile.64sunu => Sun Ultra 64-bit makefile
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
diff --git a/src/3rdparty/libpng/KNOWNBUG b/src/3rdparty/libpng/KNOWNBUG
index 7688a9c..5e0c96f 100644
--- a/src/3rdparty/libpng/KNOWNBUG
+++ b/src/3rdparty/libpng/KNOWNBUG
@@ -1,5 +1,5 @@
-Known bugs in libpng version 1.2.29
+Known bugs in libpng version 1.2.40
1. February 23, 2006: The custom makefiles don't build libpng with -lz.
diff --git a/src/3rdparty/libpng/LICENSE b/src/3rdparty/libpng/LICENSE
index 072d9ef..93dd04a 100644
--- a/src/3rdparty/libpng/LICENSE
+++ b/src/3rdparty/libpng/LICENSE
@@ -8,8 +8,10 @@ COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
If you modify libpng you may insert additional notices immediately following
this sentence.
-libpng versions 1.2.6, August 15, 2004, through 1.2.29, May 8, 2008, are
-Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.2.40, September 10, 2009, are
+Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
@@ -106,4 +108,4 @@ certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-May 8, 2008
+September 10, 2009
diff --git a/src/3rdparty/libpng/README b/src/3rdparty/libpng/README
index fd2dbb1..171b65a 100644
--- a/src/3rdparty/libpng/README
+++ b/src/3rdparty/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.2.29 - May 8, 2008 (shared library 12.0)
+README for libpng version 1.2.40 - September 10, 2009 (shared library 12.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
@@ -6,7 +6,10 @@ See INSTALL for instructions on how to install libpng.
Libpng comes in several distribution formats. Get libpng-*.tar.gz,
libpng-*.tar.lzma, or libpng-*.tar.bz2 if you want UNIX-style line
endings in the text files, or lpng*.7z or lpng*.zip if you want DOS-style
-line endings.
+line endings. You can get UNIX-style line endings from the *.zip file
+by using "unzip -a" but there seems to be no simple way to recover
+UNIX-style line endings from the *.7z file. The *.tar.lzma file is
+recommended for *NIX users instead.
Version 0.89 was the first official release of libpng. Don't let the
fact that it's the first release fool you. The libpng library has been in
@@ -55,7 +58,7 @@ to set different actions based on whether the CRC error occurred in a
critical or an ancillary chunk.
The changes made to the library, and bugs fixed are based on discussions
-on the PNG-implement mailing list
+on the png-mng-implement mailing list
and not on material submitted privately to Guy, Andreas, or Glenn. They will
forward any good suggestions to the list.
@@ -111,14 +114,14 @@ to subscribe) or to glennrp at users.sourceforge.net
You can't reach Guy, the original libpng author, at the addresses
given in previous versions of this document. He and Andreas will read mail
-addressed to the png-implement list, however.
+addressed to the png-mng-implement list, however.
Please do not send general questions about PNG. Send them to
the (png-mng-misc at lists.sourceforge.net, subscription required, visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement to subscribe)
On the other hand,
please do not send libpng questions to that address, send them to me
-or to the png-implement list. I'll
+or to the png-mng-implement list. I'll
get them in the end anyway. If you have a question about something
in the PNG specification that is related to using libpng, send it
to me. Send me any questions that start with "I was using libpng,
@@ -191,11 +194,11 @@ Files in this distribution:
descrip.mms => VMS makefile for MMS or MMK
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
makefile.elf => Linux/ELF makefile symbol versioning,
- gcc, creates libpng12.so.0.1.2.29)
+ gcc, creates libpng12.so.0.1.2.40)
makefile.linux => Linux/ELF makefile
- (gcc, creates libpng12.so.0.1.2.29)
+ (gcc, creates libpng12.so.0.1.2.40)
makefile.gcmmx => Linux/ELF makefile
- (gcc, creates libpng12.so.0.1.2.29,
+ (gcc, creates libpng12.so.0.1.2.40,
uses assembler code tuned for Intel MMX platform)
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
makefile.knr => Archaic UNIX Makefile that converts files with
@@ -217,12 +220,12 @@ Files in this distribution:
makefile.openbsd => OpenBSD makefile
makefile.sgi => Silicon Graphics IRIX (cc, creates static lib)
makefile.sggcc => Silicon Graphics
- (gcc, creates libpng12.so.0.1.2.29)
+ (gcc, creates libpng12.so.0.1.2.40)
makefile.sunos => Sun makefile
makefile.solaris => Solaris 2.X makefile
- (gcc, creates libpng12.so.0.1.2.29)
+ (gcc, creates libpng12.so.0.1.2.40)
makefile.so9 => Solaris 9 makefile
- (gcc, creates libpng12.so.0.1.2.29)
+ (gcc, creates libpng12.so.0.1.2.40)
makefile.32sunu => Sun Ultra 32-bit makefile
makefile.64sunu => Sun Ultra 64-bit makefile
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
diff --git a/src/3rdparty/libpng/TODO b/src/3rdparty/libpng/TODO
index a5f6395..face765 100644
--- a/src/3rdparty/libpng/TODO
+++ b/src/3rdparty/libpng/TODO
@@ -22,3 +22,4 @@ Build gamma tables using fixed point (and do away with floating point entirely).
Use greater precision when changing to linear gamma for compositing against
background and doing rgb-to-gray transformation.
Investigate pre-incremented loop counters and other loop constructions.
+Add interpolated method of handling interlacing.
diff --git a/src/3rdparty/libpng/Y2KINFO b/src/3rdparty/libpng/Y2KINFO
index 43348df..e31bb7f 100644
--- a/src/3rdparty/libpng/Y2KINFO
+++ b/src/3rdparty/libpng/Y2KINFO
@@ -1,13 +1,13 @@
Y2K compliance in libpng:
=========================
- May 8, 2008
+ September 10, 2009
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
- upward through 1.2.29 are Y2K compliant. It is my belief that earlier
+ upward through 1.2.40 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
Libpng only has three year fields. One is a 2-byte unsigned integer
diff --git a/src/3rdparty/libpng/configure b/src/3rdparty/libpng/configure
index 56b2452..4871efc 100755
--- a/src/3rdparty/libpng/configure
+++ b/src/3rdparty/libpng/configure
@@ -1,13 +1,13 @@
#!/bin/sh
echo "
There is no \"configure\" script in this distribution of
- libpng-1.2.29.
+ libpng-1.2.40.
Instead, please copy the appropriate makefile for your system from the
\"scripts\" directory. Read the INSTALL file for more details.
Update, July 2004: you can get a \"configure\" based distribution
from the libpng distribution sites. Download the file
- libpng-1.2.29.tar.gz, libpng-1.2.29.tar.lzma, or libpng-1.2.29.tar.bz2
+ libpng-1.2.40.tar.gz, libpng-1.2.40.tar.lzma, or libpng-1.2.40.tar.bz2
"
diff --git a/src/3rdparty/libpng/example.c b/src/3rdparty/libpng/example.c
index 0815873..dcf38de 100644
--- a/src/3rdparty/libpng/example.c
+++ b/src/3rdparty/libpng/example.c
@@ -2,9 +2,9 @@
#if 0 /* in case someone actually tries to compile this */
/* example.c - an example of using libpng
- * Last changed in libpng 1.2.1 December 7, 2001.
+ * Last changed in libpng 1.2.37 [June 4, 2009]
* This file has been placed in the public domain by the authors.
- * Maintained 1998-2007 Glenn Randers-Pehrson
+ * Maintained 1998-2009 Glenn Randers-Pehrson
* Maintained 1996, 1997 Andreas Dilger)
* Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
@@ -91,14 +91,15 @@ void read_png(char *file_name) /* We need to open the file */
if ((fp = fopen(file_name, "rb")) == NULL)
return (ERROR);
+
#else no_open_file /* prototype 2 */
-void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
+void read_png(FILE *fp, unsigned int sig_read) /* File is already open */
{
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type;
-#endif no_open_file /* only use one prototype! */
+#endif no_open_file /* Only use one prototype! */
/* Create and initialize the png_struct with the desired error handler
* functions. If you want to use the default stderr and longjump method,
@@ -164,6 +165,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
* pixels) into the info structure with this call:
*/
png_read_png(png_ptr, info_ptr, png_transforms, png_voidp_NULL);
+
#else
/* OK, you're doing it the hard way, with the lower-level functions */
@@ -175,13 +177,13 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
&interlace_type, int_p_NULL, int_p_NULL);
-/* Set up the data transformations you want. Note that these are all
- * optional. Only call them if you want/need them. Many of the
- * transformations only work on specific types of images, and many
- * are mutually exclusive.
- */
+ /* Set up the data transformations you want. Note that these are all
+ * optional. Only call them if you want/need them. Many of the
+ * transformations only work on specific types of images, and many
+ * are mutually exclusive.
+ */
- /* tell libpng to strip 16 bit/color files down to 8 bits/color */
+ /* Tell libpng to strip 16 bit/color files down to 8 bits/color */
png_set_strip_16(png_ptr);
/* Strip alpha bytes from the input data without combining with the
@@ -204,7 +206,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
/* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
- png_set_gray_1_2_4_to_8(png_ptr);
+ png_set_expand_gray_1_2_4_to_8(png_ptr);
/* Expand paletted or RGB images with transparency to full alpha channels
* so the data will be available as RGBA quartets.
@@ -228,10 +230,11 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
png_set_background(png_ptr, &my_background,
PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
- /* Some suggestions as to how to get a screen gamma value */
-
- /* Note that screen gamma is the display_exponent, which includes
- * the CRT_exponent and any correction for viewing conditions */
+ /* Some suggestions as to how to get a screen gamma value
+ *
+ * Note that screen gamma is the display_exponent, which includes
+ * the CRT_exponent and any correction for viewing conditions
+ */
if (/* We have a user-defined screen gamma value */)
{
screen_gamma = user-defined screen_gamma;
@@ -244,7 +247,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
/* If we don't have another value */
else
{
- screen_gamma = 2.2; /* A good guess for a PC monitors in a dimly
+ screen_gamma = 2.2; /* A good guess for a PC monitor in a dimly
lit room */
screen_gamma = 1.7 or 1.0; /* A good guess for Mac systems */
}
@@ -277,7 +280,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
png_colorp palette;
/* This reduces the image to the application supplied palette */
- if (/* we have our own palette */)
+ if (/* We have our own palette */)
{
/* An array of colors to which the image should be dithered */
png_color std_color_cube[MAX_SCREEN_COLORS];
@@ -297,7 +300,7 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
}
}
- /* invert monochrome files to have 0 as white and 1 as black */
+ /* Invert monochrome files to have 0 as white and 1 as black */
png_set_invert_mono(png_ptr);
/* If you want to shift the pixel values from the range [0,255] or
@@ -306,20 +309,20 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
*/
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
{
- png_color_8p sig_bit;
+ png_color_8p sig_bit_p;
- png_get_sBIT(png_ptr, info_ptr, &sig_bit);
- png_set_shift(png_ptr, sig_bit);
+ png_get_sBIT(png_ptr, info_ptr, &sig_bit_p);
+ png_set_shift(png_ptr, sig_bit_p);
}
- /* flip the RGB pixels to BGR (or RGBA to BGRA) */
+ /* Flip the RGB pixels to BGR (or RGBA to BGRA) */
if (color_type & PNG_COLOR_MASK_COLOR)
png_set_bgr(png_ptr);
- /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
+ /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
png_set_swap_alpha(png_ptr);
- /* swap bytes of 16 bit files to least significant byte first */
+ /* Swap bytes of 16 bit files to least significant byte first */
png_set_swap(png_ptr);
/* Add filler (or alpha) byte (before/after each RGB triplet) */
@@ -342,11 +345,13 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
/* The easiest way to read the image: */
png_bytep row_pointers[height];
+ /* Clear the pointer array */
+ for (row = 0; row < height; row++)
+ row_pointers[row] = NULL;
+
for (row = 0; row < height; row++)
- {
row_pointers[row] = png_malloc(png_ptr, png_get_rowbytes(png_ptr,
info_ptr));
- }
/* Now it's time to read the image. One of these methods is REQUIRED */
#ifdef entire /* Read the entire image in one go */
@@ -372,32 +377,31 @@ void read_png(FILE *fp, unsigned int sig_read) /* file is already open */
#else no_sparkle /* Read the image using the "rectangle" effect */
png_read_rows(png_ptr, png_bytepp_NULL, &row_pointers[y],
number_of_rows);
-#endif no_sparkle /* use only one of these two methods */
+#endif no_sparkle /* Use only one of these two methods */
}
- /* if you want to display the image after every pass, do
- so here */
-#endif no_single /* use only one of these two methods */
+ /* If you want to display the image after every pass, do so here */
+#endif no_single /* Use only one of these two methods */
}
-#endif no_entire /* use only one of these two methods */
+#endif no_entire /* Use only one of these two methods */
- /* read rest of file, and get additional chunks in info_ptr - REQUIRED */
+ /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
png_read_end(png_ptr, info_ptr);
#endif hilevel
/* At this point you have read the entire image */
- /* clean up after the read, and free any memory allocated - REQUIRED */
+ /* Clean up after the read, and free any memory allocated - REQUIRED */
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
- /* close the file */
+ /* Close the file */
fclose(fp);
- /* that's it */
+ /* That's it */
return (OK);
}
-/* progressively read a file */
+/* Progressively read a file */
int
initialize_png_reader(png_structp *png_ptr, png_infop *info_ptr)
@@ -462,7 +466,7 @@ process_data(png_structp *png_ptr, png_infop *info_ptr,
/* This one's new also. Simply give it chunks of data as
* they arrive from the data stream (in order, of course).
- * On Segmented machines, don't give it any more than 64K.
+ * On segmented machines, don't give it any more than 64K.
* The library seems to run fine with sizes of 4K, although
* you can give it much less if necessary (I assume you can
* give it chunks of 1 byte, but I haven't tried with less
@@ -476,36 +480,37 @@ process_data(png_structp *png_ptr, png_infop *info_ptr,
info_callback(png_structp png_ptr, png_infop info)
{
-/* do any setup here, including setting any of the transformations
- * mentioned in the Reading PNG files section. For now, you _must_
- * call either png_start_read_image() or png_read_update_info()
- * after all the transformations are set (even if you don't set
- * any). You may start getting rows before png_process_data()
- * returns, so this is your last chance to prepare for that.
- */
+ /* Do any setup here, including setting any of the transformations
+ * mentioned in the Reading PNG files section. For now, you _must_
+ * call either png_start_read_image() or png_read_update_info()
+ * after all the transformations are set (even if you don't set
+ * any). You may start getting rows before png_process_data()
+ * returns, so this is your last chance to prepare for that.
+ */
}
row_callback(png_structp png_ptr, png_bytep new_row,
png_uint_32 row_num, int pass)
{
-/*
- * This function is called for every row in the image. If the
- * image is interlaced, and you turned on the interlace handler,
- * this function will be called for every row in every pass.
- *
- * In this function you will receive a pointer to new row data from
- * libpng called new_row that is to replace a corresponding row (of
- * the same data format) in a buffer allocated by your application.
- *
- * The new row data pointer new_row may be NULL, indicating there is
- * no new data to be replaced (in cases of interlace loading).
- *
- * If new_row is not NULL then you need to call
- * png_progressive_combine_row() to replace the corresponding row as
- * shown below:
- */
+ /*
+ * This function is called for every row in the image. If the
+ * image is interlaced, and you turned on the interlace handler,
+ * this function will be called for every row in every pass.
+ *
+ * In this function you will receive a pointer to new row data from
+ * libpng called new_row that is to replace a corresponding row (of
+ * the same data format) in a buffer allocated by your application.
+ *
+ * The new row data pointer "new_row" may be NULL, indicating there is
+ * no new data to be replaced (in cases of interlace loading).
+ *
+ * If new_row is not NULL then you need to call
+ * png_progressive_combine_row() to replace the corresponding row as
+ * shown below:
+ */
+
/* Check if row_num is in bounds. */
- if((row_num >= 0) && (row_num < height))
+ if ((row_num >= 0) && (row_num < height))
{
/* Get pointer to corresponding row in our
* PNG read buffer.
@@ -515,47 +520,47 @@ row_callback(png_structp png_ptr, png_bytep new_row,
/* If both rows are allocated then copy the new row
* data to the corresponding row data.
*/
- if((old_row != NULL) && (new_row != NULL))
+ if ((old_row != NULL) && (new_row != NULL))
png_progressive_combine_row(png_ptr, old_row, new_row);
}
-/*
- * The rows and passes are called in order, so you don't really
- * need the row_num and pass, but I'm supplying them because it
- * may make your life easier.
- *
- * For the non-NULL rows of interlaced images, you must call
- * png_progressive_combine_row() passing in the new row and the
- * old row, as demonstrated above. You can call this function for
- * NULL rows (it will just return) and for non-interlaced images
- * (it just does the png_memcpy for you) if it will make the code
- * easier. Thus, you can just do this for all cases:
- */
+ /*
+ * The rows and passes are called in order, so you don't really
+ * need the row_num and pass, but I'm supplying them because it
+ * may make your life easier.
+ *
+ * For the non-NULL rows of interlaced images, you must call
+ * png_progressive_combine_row() passing in the new row and the
+ * old row, as demonstrated above. You can call this function for
+ * NULL rows (it will just return) and for non-interlaced images
+ * (it just does the png_memcpy for you) if it will make the code
+ * easier. Thus, you can just do this for all cases:
+ */
png_progressive_combine_row(png_ptr, old_row, new_row);
-/* where old_row is what was displayed for previous rows. Note
- * that the first pass (pass == 0 really) will completely cover
- * the old row, so the rows do not have to be initialized. After
- * the first pass (and only for interlaced images), you will have
- * to pass the current row as new_row, and the function will combine
- * the old row and the new row.
- */
+ /* where old_row is what was displayed for previous rows. Note
+ * that the first pass (pass == 0 really) will completely cover
+ * the old row, so the rows do not have to be initialized. After
+ * the first pass (and only for interlaced images), you will have
+ * to pass the current row as new_row, and the function will combine
+ * the old row and the new row.
+ */
}
end_callback(png_structp png_ptr, png_infop info)
{
-/* this function is called when the whole image has been read,
- * including any chunks after the image (up to and including
- * the IEND). You will usually have the same info chunk as you
- * had in the header, although some data may have been added
- * to the comments and time fields.
- *
- * Most people won't do much here, perhaps setting a flag that
- * marks the image as finished.
- */
+ /* This function is called when the whole image has been read,
+ * including any chunks after the image (up to and including
+ * the IEND). You will usually have the same info chunk as you
+ * had in the header, although some data may have been added
+ * to the comments and time fields.
+ *
+ * Most people won't do much here, perhaps setting a flag that
+ * marks the image as finished.
+ */
}
-/* write a png file */
+/* Write a png file */
void write_png(char *file_name /* , ... other image information ... */)
{
FILE *fp;
@@ -563,7 +568,7 @@ void write_png(char *file_name /* , ... other image information ... */)
png_infop info_ptr;
png_colorp palette;
- /* open the file */
+ /* Open the file */
fp = fopen(file_name, "wb");
if (fp == NULL)
return (ERROR);
@@ -597,30 +602,34 @@ void write_png(char *file_name /* , ... other image information ... */)
*/
if (setjmp(png_jmpbuf(png_ptr)))
{
- /* If we get here, we had a problem reading the file */
+ /* If we get here, we had a problem writing the file */
fclose(fp);
png_destroy_write_struct(&png_ptr, &info_ptr);
return (ERROR);
}
/* One of the following I/O initialization functions is REQUIRED */
+
#ifdef streams /* I/O initialization method 1 */
- /* set up the output control if you are using standard C streams */
+ /* Set up the output control if you are using standard C streams */
png_init_io(png_ptr, fp);
+
#else no_streams /* I/O initialization method 2 */
- /* If you are using replacement read functions, instead of calling
- * png_init_io() here you would call */
+ /* If you are using replacement write functions, instead of calling
+ * png_init_io() here you would call
+ */
png_set_write_fn(png_ptr, (void *)user_io_ptr, user_write_fn,
user_IO_flush_function);
/* where user_io_ptr is a structure you want available to the callbacks */
-#endif no_streams /* only use one initialization method */
+#endif no_streams /* Only use one initialization method */
#ifdef hilevel
/* This is the easy way. Use it if you already have all the
- * image info living info in the structure. You could "|" many
+ * image info living in the structure. You could "|" many
* PNG_TRANSFORM flags into the png_transforms integer here.
*/
png_write_png(png_ptr, info_ptr, png_transforms, png_voidp_NULL);
+
#else
/* This is the hard way */
@@ -635,25 +644,27 @@ void write_png(char *file_name /* , ... other image information ... */)
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_???,
PNG_INTERLACE_????, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
- /* set the palette if there is one. REQUIRED for indexed-color images */
+ /* Set the palette if there is one. REQUIRED for indexed-color images */
palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH
- * png_sizeof (png_color));
- /* ... set palette colors ... */
+ * png_sizeof(png_color));
+ /* ... Set palette colors ... */
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
/* You must not free palette here, because png_set_PLTE only makes a link to
- the palette that you malloced. Wait until you are about to destroy
- the png structure. */
+ * the palette that you malloced. Wait until you are about to destroy
+ * the png structure.
+ */
- /* optional significant bit chunk */
- /* if we are dealing with a grayscale image then */
+ /* Optional significant bit (sBIT) chunk */
+ png_color_8 sig_bit;
+ /* If we are dealing with a grayscale image then */
sig_bit.gray = true_bit_depth;
- /* otherwise, if we are dealing with a color image then */
+ /* Otherwise, if we are dealing with a color image then */
sig_bit.red = true_red_bit_depth;
sig_bit.green = true_green_bit_depth;
sig_bit.blue = true_blue_bit_depth;
- /* if the image has an alpha channel then */
+ /* If the image has an alpha channel then */
sig_bit.alpha = true_alpha_bit_depth;
- png_set_sBIT(png_ptr, info_ptr, sig_bit);
+ png_set_sBIT(png_ptr, info_ptr, &sig_bit);
/* Optional gamma chunk is strongly suggested if you have any guess
@@ -678,9 +689,12 @@ void write_png(char *file_name /* , ... other image information ... */)
#endif
png_set_text(png_ptr, info_ptr, text_ptr, 3);
- /* other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs, */
- /* note that if sRGB is present the gAMA and cHRM chunks must be ignored
- * on read and must be written in accordance with the sRGB profile */
+ /* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */
+
+ /* Note that if sRGB is present the gAMA and cHRM chunks must be ignored
+ * on read and, if your application chooses to write them, they must
+ * be written in accordance with the sRGB profile
+ */
/* Write the file header information. REQUIRED */
png_write_info(png_ptr, info_ptr);
@@ -692,7 +706,7 @@ void write_png(char *file_name /* , ... other image information ... */)
* write_my_chunk();
* png_write_info(png_ptr, info_ptr);
*
- * However, given the level of known- and unknown-chunk support in 1.1.0
+ * However, given the level of known- and unknown-chunk support in 1.2.0
* and up, this should no longer be necessary.
*/
@@ -702,11 +716,11 @@ void write_png(char *file_name /* , ... other image information ... */)
* at the end.
*/
- /* set up the transformations you want. Note that these are
+ /* Set up the transformations you want. Note that these are
* all optional. Only call them if you want them.
*/
- /* invert monochrome pixels */
+ /* Invert monochrome pixels */
png_set_invert_mono(png_ptr);
/* Shift the pixels up to a legal bit depth and fill in
@@ -714,10 +728,10 @@ void write_png(char *file_name /* , ... other image information ... */)
*/
png_set_shift(png_ptr, &sig_bit);
- /* pack pixels into bytes */
+ /* Pack pixels into bytes */
png_set_packing(png_ptr);
- /* swap location of alpha bytes from ARGB to RGBA */
+ /* Swap location of alpha bytes from ARGB to RGBA */
png_set_swap_alpha(png_ptr);
/* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into
@@ -725,16 +739,16 @@ void write_png(char *file_name /* , ... other image information ... */)
*/
png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
- /* flip BGR pixels to RGB */
+ /* Flip BGR pixels to RGB */
png_set_bgr(png_ptr);
- /* swap bytes of 16-bit files to most significant byte first */
+ /* Swap bytes of 16-bit files to most significant byte first */
png_set_swap(png_ptr);
- /* swap bits of 1, 2, 4 bit packed pixel formats */
+ /* Swap bits of 1, 2, 4 bit packed pixel formats */
png_set_packswap(png_ptr);
- /* turn on interlace handling if you are not using png_write_image() */
+ /* Turn on interlace handling if you are not using png_write_image() */
if (interlacing)
number_passes = png_set_interlace_handling(png_ptr);
else
@@ -755,12 +769,14 @@ void write_png(char *file_name /* , ... other image information ... */)
row_pointers[k] = image + k*width*bytes_per_pixel;
/* One of the following output methods is REQUIRED */
-#ifdef entire /* write out the entire image data in one call */
+
+#ifdef entire /* Write out the entire image data in one call */
png_write_image(png_ptr, row_pointers);
- /* the other way to write the image - deal with interlacing */
+ /* The other way to write the image - deal with interlacing */
+
+#else no_entire /* Write out the image data by one or more scanlines */
-#else no_entire /* write out the image data by one or more scanlines */
/* The number of passes is either 1 for non-interlaced images,
* or 7 for interlaced images.
*/
@@ -771,14 +787,12 @@ void write_png(char *file_name /* , ... other image information ... */)
/* If you are only writing one row at a time, this works */
for (y = 0; y < height; y++)
- {
png_write_rows(png_ptr, &row_pointers[y], 1);
- }
}
-#endif no_entire /* use only one output method */
+#endif no_entire /* Use only one output method */
/* You can write optional chunks like tEXt, zTXt, and tIME at the end
- * as well. Shouldn't be necessary in 1.1.0 and up as all the public
+ * as well. Shouldn't be necessary in 1.2.0 and up as all the public
* chunks are supported and you can use png_set_unknown_chunks() to
* register unknown chunks into the info structure to be written out.
*/
@@ -788,26 +802,33 @@ void write_png(char *file_name /* , ... other image information ... */)
#endif hilevel
/* If you png_malloced a palette, free it here (don't free info_ptr->palette,
- as recommended in versions 1.0.5m and earlier of this example; if
- libpng mallocs info_ptr->palette, libpng will free it). If you
- allocated it with malloc() instead of png_malloc(), use free() instead
- of png_free(). */
+ * as recommended in versions 1.0.5m and earlier of this example; if
+ * libpng mallocs info_ptr->palette, libpng will free it). If you
+ * allocated it with malloc() instead of png_malloc(), use free() instead
+ * of png_free().
+ */
png_free(png_ptr, palette);
- palette=NULL;
+ palette = NULL;
/* Similarly, if you png_malloced any data that you passed in with
- png_set_something(), such as a hist or trans array, free it here,
- when you can be sure that libpng is through with it. */
+ * png_set_something(), such as a hist or trans array, free it here,
+ * when you can be sure that libpng is through with it.
+ */
png_free(png_ptr, trans);
- trans=NULL;
+ trans = NULL;
+ /* Whenever you use png_free() it is a good idea to set the pointer to
+ * NULL in case your application inadvertently tries to png_free() it
+ * again. When png_free() sees a NULL it returns without action, thus
+ * avoiding the double-free security problem.
+ */
- /* clean up after the write, and free any memory allocated */
+ /* Clean up after the write, and free any memory allocated */
png_destroy_write_struct(&png_ptr, &info_ptr);
- /* close the file */
+ /* Close the file */
fclose(fp);
- /* that's it */
+ /* That's it */
return (OK);
}
diff --git a/src/3rdparty/libpng/libpng-1.2.29.txt b/src/3rdparty/libpng/libpng-1.2.40.txt
index 91b9806..019c886 100644
--- a/src/3rdparty/libpng/libpng-1.2.29.txt
+++ b/src/3rdparty/libpng/libpng-1.2.40.txt
@@ -1,17 +1,19 @@
libpng.txt - A description on how to use and modify libpng
- libpng version 1.2.29 - May 8, 2008
+ libpng version 1.2.40 - September 10, 2009
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
- Copyright (c) 1998-2008 Glenn Randers-Pehrson
- For conditions of distribution and use, see copyright
- notice in png.h.
+ Copyright (c) 1998-2009 Glenn Randers-Pehrson
+
+ This document is released under the libpng license.
+ For conditions of distribution and use, see the disclaimer
+ and license in png.h
Based on:
- libpng versions 0.97, January 1998, through 1.2.29 - May 8, 2008
+ libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009
Updated and distributed by Glenn Randers-Pehrson
- Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ Copyright (c) 1998-2009 Glenn Randers-Pehrson
libpng 1.0 beta 6 version 0.96 May 28, 1997
Updated and distributed by Andreas Dilger
@@ -141,9 +143,10 @@ so if it doesn't work, you don't have much to undo. Of course, you
will also want to insure that you are, in fact, dealing with a PNG
file. Libpng provides a simple check to see if a file is a PNG file.
To use it, pass in the first 1 to 8 bytes of the file to the function
-png_sig_cmp(), and it will return 0 if the bytes match the corresponding
-bytes of the PNG signature, or nonzero otherwise. Of course, the more bytes
-you pass in, the greater the accuracy of the prediction.
+png_sig_cmp(), and it will return 0 (false) if the bytes match the
+corresponding bytes of the PNG signature, or nonzero (true) otherwise.
+Of course, the more bytes you pass in, the greater the accuracy of the
+prediction.
If you are intending to keep the file pointer open for use in libpng,
you must ensure you don't read more than 8 bytes from the beginning
@@ -320,35 +323,14 @@ To inform libpng about your function, use
png_set_read_status_fn(png_ptr, read_row_callback);
-Width and height limits
-
-The PNG specification allows the width and height of an image to be as
-large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
-Since very few applications really need to process such large images,
-we have imposed an arbitrary 1-million limit on rows and columns.
-Larger images will be rejected immediately with a png_error() call. If
-you wish to override this limit, you can use
-
- png_set_user_limits(png_ptr, width_max, height_max);
-
-to set your own limits, or use width_max = height_max = 0x7fffffffL
-to allow all valid dimensions (libpng may reject some very large images
-anyway because of potential buffer overflow conditions).
-
-You should put this statement after you create the PNG structure and
-before calling png_read_info(), png_read_png(), or png_process_data().
-If you need to retrieve the limits that are being applied, use
-
- width_max = png_get_user_width_max(png_ptr);
- height_max = png_get_user_height_max(png_ptr);
-
Unknown-chunk handling
Now you get to set the way the library processes unknown chunks in the
input PNG stream. Both known and unknown chunks will be read. Normal
behavior is that known chunks will be parsed into information in
-various info_ptr members while unknown chunks will be discarded. To change
-this, you can call:
+various info_ptr members while unknown chunks will be discarded. This
+behavior can be wasteful if your application will never use some known
+chunk types. To change this, you can call:
png_set_keep_unknown_chunks(png_ptr, keep,
chunk_list, num_chunks);
@@ -406,6 +388,27 @@ callback function:
(int)sizeof(unused_chunks)/5);
#endif
+User limits
+
+The PNG specification allows the width and height of an image to be as
+large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
+Since very few applications really need to process such large images,
+we have imposed an arbitrary 1-million limit on rows and columns.
+Larger images will be rejected immediately with a png_error() call. If
+you wish to override this limit, you can use
+
+ png_set_user_limits(png_ptr, width_max, height_max);
+
+to set your own limits, or use width_max = height_max = 0x7fffffffL
+to allow all valid dimensions (libpng may reject some very large images
+anyway because of potential buffer overflow conditions).
+
+You should put this statement after you create the PNG structure and
+before calling png_read_info(), png_read_png(), or png_process_data().
+If you need to retrieve the limits that are being applied, use
+
+ width_max = png_get_user_width_max(png_ptr);
+ height_max = png_get_user_height_max(png_ptr);
The high-level read interface
@@ -472,6 +475,8 @@ row_pointers prior to calling png_read_png() with
row_pointers = png_malloc(png_ptr,
height*png_sizeof(png_bytep));
for (int i=0; i<height, i++)
+ row_pointers[i]=NULL; /* security precaution */
+ for (int i=0; i<height, i++)
row_pointers[i]=png_malloc(png_ptr,
width*pixel_size);
png_set_rows(png_ptr, info_ptr, &row_pointers);
@@ -847,9 +852,6 @@ things.
As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
added. It expands the sample depth without changing tRNS to alpha.
-At the same time, png_set_gray_1_2_4_to_8() was deprecated, and it
-will be removed from a future version.
-
PNG can have files with 16 bits per channel. If you only can handle
8 bits per channel, this will strip the pixels down to 8 bit.
@@ -1701,7 +1703,7 @@ types.
PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE |
PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB |
PNG_FILTER_UP | PNG_FILTER_VALUE_UP |
- PNG_FILTER_AVE | PNG_FILTER_VALUE_AVE |
+ PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
PNG_ALL_FILTERS);
@@ -1791,10 +1793,14 @@ Some of the more important parts of the png_info are:
PNG_INTRAPIXEL_DIFFERENCING)
If you call png_set_IHDR(), the call must appear before any of the
-other png_set_*() functions, which might require access to some of
+other png_set_*() functions, because they might require access to some of
the IHDR settings. The remaining png_set_*() functions can be called
in any order.
+If you wish, you can reset the compression_type, interlace_type, or
+filter_method later by calling png_set_IHDR() again; if you do this, the
+width, height, bit_depth, and color_type must be the same in each call.
+
png_set_PLTE(png_ptr, info_ptr, palette,
num_palette);
palette - the palette for the file
@@ -1856,8 +1862,9 @@ in any order.
trans_values);
trans - array of transparent entries for
palette (PNG_INFO_tRNS)
- trans_values - graylevel or color sample values of
- the single transparent color for
+ trans_values - graylevel or color sample values
+ (in order red, green, blue) of the
+ single transparent color for
non-paletted images (PNG_INFO_tRNS)
num_trans - number of transparent entries
(PNG_INFO_tRNS)
@@ -2066,7 +2073,12 @@ transformations are permitted, enabled by the following masks.
PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
to transparency
PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
- PNG_TRANSFORM_STRIP_FILLER Strip out filler bytes.
+ PNG_TRANSFORM_STRIP_FILLER Strip out filler
+ bytes (deprecated).
+ PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
+ filler bytes
+ PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing
+ filler bytes
If you have valid image data in the info structure (you can use
png_set_rows() to put image data in the info structure), simply do this:
@@ -2473,9 +2485,15 @@ The replacement I/O functions must have prototypes as follows:
png_bytep data, png_size_t length);
void user_flush_data(png_structp png_ptr);
+The user_read_data() function is responsible for detecting and
+handling end-of-data errors.
+
Supplying NULL for the read, write, or flush functions sets them back
-to using the default C stream functions. It is an error to read from
-a write stream, and vice versa.
+to using the default C stream functions, which expect the io_ptr to
+point to a standard *FILE structure. It is probably a mistake
+to use NULL for one of write_data_fn and output_flush_fn but not both
+of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
+It is an error to read from a write stream, and vice versa.
Error handling in libpng is done through png_error() and png_warning().
Errors handled through png_error() are fatal, meaning that png_error()
@@ -2580,11 +2598,12 @@ you may also have to change the memory allocators (png_malloc, etc.).
Configuring for compiler xxx:
-All includes for libpng are in pngconf.h. If you need to add/change/delete
-an include, this is the place to do it. The includes that are not
-needed outside libpng are protected by the PNG_INTERNAL definition,
-which is only defined for those routines inside libpng itself. The
-files in libpng proper only include png.h, which includes pngconf.h.
+All includes for libpng are in pngconf.h. If you need to add, change
+or delete an include, this is the place to do it.
+The includes that are not needed outside libpng are protected by the
+PNG_INTERNAL definition, which is only defined for those routines inside
+libpng itself. The files in libpng proper only include png.h, which
+includes pngconf.h.
Configuring zlib:
@@ -2653,7 +2672,7 @@ currently does not allocate the filter buffers until png_write_row()
is called for the first time.)
filters = PNG_FILTER_NONE | PNG_FILTER_SUB
- PNG_FILTER_UP | PNG_FILTER_AVE |
+ PNG_FILTER_UP | PNG_FILTER_AVG |
PNG_FILTER_PAETH | PNG_ALL_FILTERS;
png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
@@ -2775,7 +2794,7 @@ When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
having level = 0 will be printed. There aren't any such statements in
this version of libpng, but if you insert some they will be printed.
-VII. MNG support
+VI. MNG support
The MNG specification (available at http://www.libpng.org/pub/mng) allows
certain extensions to PNG for PNG images that are embedded in MNG datastreams.
@@ -2800,7 +2819,7 @@ or any other MNG chunks; your application must provide its own support for
them. You may wish to consider using libmng (available at
http://www.libmng.com) instead.
-VIII. Changes to Libpng from version 0.88
+VII. Changes to Libpng from version 0.88
It should be noted that versions of libpng later than 0.96 are not
distributed by the original libpng author, Guy Schalnat, nor by
@@ -2849,15 +2868,202 @@ application:
png_uint_32 application_vn = PNG_LIBPNG_VER;
-IX. Y2K Compliance in libpng
+VIII. Changes to Libpng from version 1.0.x to 1.2.x
+
+Support for user memory management was enabled by default. To
+accomplish this, the functions png_create_read_struct_2(),
+png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
+png_malloc_default(), and png_free_default() were added.
+
+Support for certain MNG features was enabled.
+
+Support for numbered error messages was added. However, we never got
+around to actually numbering the error messages. The function
+png_set_strip_error_numbers() was added (Note: the prototype for this
+function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
+builds of libpng-1.2.15. It was restored in libpng-1.2.36).
+
+The png_malloc_warn() function was added at libpng-1.2.3. This issues
+a png_warning and returns NULL instead of aborting when it fails to
+acquire the requested memory allocation.
+
+Support for setting user limits on image width and height was enabled
+by default. The functions png_set_user_limits(), png_get_user_width_max(),
+and png_get_user_height_max() were added at libpng-1.2.6.
+
+The png_set_add_alpha() function was added at libpng-1.2.7.
+
+The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
+Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
+tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
+deprecated.
+
+A number of macro definitions in support of runtime selection of
+assembler code features (especially Intel MMX code support) were
+added at libpng-1.2.0:
+
+ PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
+ PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
+ PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
+ PNG_ASM_FLAG_MMX_READ_INTERLACE
+ PNG_ASM_FLAG_MMX_READ_FILTER_SUB
+ PNG_ASM_FLAG_MMX_READ_FILTER_UP
+ PNG_ASM_FLAG_MMX_READ_FILTER_AVG
+ PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
+ PNG_ASM_FLAGS_INITIALIZED
+ PNG_MMX_READ_FLAGS
+ PNG_MMX_FLAGS
+ PNG_MMX_WRITE_FLAGS
+ PNG_MMX_FLAGS
+
+We added the following functions in support of runtime
+selection of assembler code features:
+
+ png_get_mmx_flagmask()
+ png_set_mmx_thresholds()
+ png_get_asm_flags()
+ png_get_mmx_bitdepth_threshold()
+ png_get_mmx_rowbytes_threshold()
+ png_set_asm_flags()
+
+We replaced all of these functions with simple stubs in libpng-1.2.20,
+when the Intel assembler code was removed due to a licensing issue.
+
+IX. (Omitted)
+
+X. Detecting libpng
+
+The png_get_io_ptr() function has been present since libpng-0.88, has never
+changed, and is unaffected by conditional compilation macros. It is the
+best choice for use in configure scripts for detecting the presence of any
+libpng version since 0.88. In an autoconf "configure.in" you could use
+
+ AC_CHECK_LIB(png, png_get_io_ptr, ...
+
+XI. Source code repository
+
+Since about February 2009, version 1.2.34, libpng has been under "git" source
+control. The git repository was built from old libpng-x.y.z.tar.gz files
+going back to version 0.70. You can access the git repository (read only)
+at
+
+ git://libpng.git.sourceforge.net/gitroot/libpng
+
+or you can browse it via "gitweb" at
+
+ http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
+
+Patches can be sent to glennrp at users.sourceforge.net or to
+png-mng-implement at lists.sourceforge.net or you can upload them to
+the libpng bug tracker at
+
+ http://libpng.sourceforge.net
+
+XII. Coding style
+
+Our coding style is similar to the "Allman" style, with curly
+braces on separate lines:
+
+ if (condition)
+ {
+ action;
+ }
+
+ else if (another condition)
+ {
+ another action;
+ }
+
+The braces can be omitted from simple one-line actions:
+
+ if (condition)
+ return (0);
+
+We use 3-space indentation, except for continued statements which
+are usually indented the same as the first line of the statement
+plus four more spaces.
+
+Comments appear with the leading "/*" at the same indentation as
+the statement that follows the comment:
+
+ /* Single-line comment */
+ statement;
+
+ /* Multiple-line
+ * comment
+ */
+ statement;
+
+Very short comments can be placed at the end of the statement
+to which they pertain:
+
+ statement; /* comment */
+
+We don't use C++ style ("//") comments. We have, however,
+used them in the past in some now-abandoned MMX assembler
+code.
+
+Functions and their curly braces are not indented, and
+exported functions are marked with PNGAPI:
+
+ /* This is a public function that is visible to
+ * application programers. It does thus-and-so.
+ */
+ void PNGAPI
+ png_exported_function(png_ptr, png_info, foo)
+ {
+ body;
+ }
+
+The prototypes for all exported functions appear in png.h,
+above the comment that says
+
+ /* Maintainer: Put new public prototypes here ... */
+
+We mark all non-exported functions with "/* PRIVATE */"":
+
+ void /* PRIVATE */
+ png_non_exported_function(png_ptr, png_info, foo)
+ {
+ body;
+ }
+
+The prototypes for non-exported functions (except for those in
+pngtest) appear in
+the PNG_INTERNAL section of png.h
+above the comment that says
+
+ /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
+
+The names of all exported functions and variables begin
+with "png_", and all publicly visible C preprocessor
+macros begin with "PNG_".
+
+We put a space after each comma and after each semicolon
+in "for" statments, and we put spaces before and after each
+C binary operator and after "for" or "while". We don't
+put a space between a typecast and the expression being
+cast, nor do we put one between a function name and the
+left parenthesis that follows it:
+
+ for (i = 2; i > 0; --i)
+ x[i] = a(x) + (int)b;
+
+We prefer #ifdef and #ifndef to #if defined() and if !defined()
+when there is only one macro being tested.
+
+Other rules can be inferred by inspecting the libpng
+source.
+
+XIII. Y2K Compliance in libpng
-May 8, 2008
+September 10, 2009
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.2.29 are Y2K compliant. It is my belief that earlier
+upward through 1.2.40 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
Libpng only has three year fields. One is a 2-byte unsigned integer that
diff --git a/src/3rdparty/libpng/libpng.3 b/src/3rdparty/libpng/libpng.3
index ef7fc5b..65b3686 100644
--- a/src/3rdparty/libpng/libpng.3
+++ b/src/3rdparty/libpng/libpng.3
@@ -1,404 +1,815 @@
-.TH LIBPNG 3 "May 8, 2008"
+.TH LIBPNG 3 "September 10, 2009"
.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.2.29
+libpng \- Portable Network Graphics (PNG) Reference Library 1.2.40
.SH SYNOPSIS
-\fB
-#include <png.h>\fP
+\fI\fB
+
+\fB#include <png.h>\fP
+
+\fI\fB
\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP
+\fI\fB
+
\fBint png_check_sig (png_bytep \fP\fIsig\fP\fB, int \fInum\fP\fB);\fP
+\fI\fB
+
\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
+\fI\fB
+
\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
+\fI\fB
+
\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP
+\fI\fB
+
\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP
+\fI\fB
+
\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP
+\fI\fB
+
\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
+\fI\fB
+
\fBpng_structp png_create_read_struct_2(png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
+\fI\fB
+
\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
+\fI\fB
+
\fBpng_structp png_create_write_struct_2(png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
+\fI\fB
+
\fBint png_debug(int \fP\fIlevel\fP\fB, png_const_charp \fImessage\fP\fB);\fP
+\fI\fB
+
\fBint png_debug1(int \fP\fIlevel\fP\fB, png_const_charp \fP\fImessage\fP\fB, \fIp1\fP\fB);\fP
+\fI\fB
+
\fBint png_debug2(int \fP\fIlevel\fP\fB, png_const_charp \fP\fImessage\fP\fB, \fP\fIp1\fP\fB, \fIp2\fP\fB);\fP
+\fI\fB
+
\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
+\fI\fB
+
\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_free_default(png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_bit_depth (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_channels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_color_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_compression_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_copyright (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_error_ptr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_filter_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_header_ver (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_header_version (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_charpp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_image_height (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_image_width (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fB#if !defined(PNG_1_0_X) png_int_32 png_get_int_32 (png_bytep buf); \fI#endif
+\fI\fB
+
+\fB#if \fI!defined(PNG_1_0_X)
+
+\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP
+
+\fI\fB#endif
+
+\fI\fB
\fBpng_byte png_get_interlace_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_byte png_get_libpng_ver (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_mem_ptr(png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
+\fI\fB
+
\fBfloat png_get_pixel_aspect_ratio (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_progressive_ptr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP
-\fBpng_byte png_get_rgb_to_gray_status (png_structp png_ptr) png_uint_32 png_get_rowbytes (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fBpng_byte png_get_rgb_to_gray_status (png_structp \fIpng_ptr)
+
+\fBpng_uint_32 png_get_rowbytes (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+
+\fI\fB
\fBpng_bytepp png_get_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP
+\fI\fB
+
\fBpng_bytep png_get_signature (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fI*intent\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_values\fP\fB);\fP
-\fB#if !defined(PNG_1_0_X) png_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP
+\fI\fB
+
+\fB#if \fI!defined(PNG_1_0_X)
+
+\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP
+
+\fI\fB
\fBpng_uint_32 png_get_uint_31 (png_bytep \fIbuf\fP\fB);\fP
-\fBpng_uint_32 png_get_uint_32 (png_bytep buf); \fI#endif
+\fI\fB
+
+\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP
+
+\fI\fB#endif
+
+\fI\fB
\fBpng_uint_32 png_get_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_user_chunk_ptr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_user_height_max( png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_get_user_transform_ptr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_user_width_max (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_valid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP
+\fI\fB
+
\fBpng_int_32 png_get_x_offset_microns (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_int_32 png_get_x_offset_pixels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_x_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_int_32 png_get_y_offset_microns (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_int_32 png_get_y_offset_pixels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_y_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_get_compression_buffer_size (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP
+\fI\fB
+
\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_info_init (png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_info_init_2 (png_infopp \fP\fIptr_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_malloc_default(png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
+\fI\fB
+
\fBvoidp png_memcpy (png_voidp \fP\fIs1\fP\fB, png_voidp \fP\fIs2\fP\fB, png_size_t \fIsize\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_memcpy_check (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIs1\fP\fB, png_voidp \fP\fIs2\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
+\fI\fB
+
\fBvoidp png_memset (png_voidp \fP\fIs1\fP\fB, int \fP\fIvalue\fP\fB, png_size_t \fIsize\fP\fB);\fP
+\fI\fB
+
\fBpng_voidp png_memset_check (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIs1\fP\fB, int \fP\fIvalue\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_permit_empty_plte (png_structp \fP\fIpng_ptr\fP\fB, int \fIempty_plte_permitted\fP\fB);\fP
+\fI\fB
+
\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP
+\fI\fB
+
\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_destroy (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_infop \fIend_info_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_read_init (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_read_init_2 (png_structpp \fP\fIptr_ptr\fP\fB, png_const_charp \fP\fIuser_png_ver\fP\fB, png_size_t \fP\fIpng_struct_size\fP\fB, png_size_t \fIpng_info_size\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
+\fI\fB
+
\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fB#if !defined(PNG_1_0_X) png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
+\fI\fB
+
+\fB#if \fI!defined(PNG_1_0_X)
+
+\fBpng_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
+
+\fI\fB
\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP
+\fI\fB
+
\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP
-\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int flags); \fI#endif
+\fI\fB
+
+\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
+
+\fI\fB#endif
+
+\fI\fB
\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_dither (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_dither\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_expand_gray_1_2_4_to_8(png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_gray_1_2_4_to_8(png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_charp \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP
+\fI\fB
+
\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_mem_fn(png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_palette_to_rgb(png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_fixed_point \fP\fIred\fP\fB, png_fixed_point \fIgreen\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIintent\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIintent\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_values\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_tRNS_to_alpha(png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_unknown_chunk_location(png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP
+\fI\fB
+
\fBvoid png_set_compression_buffer_size(png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
+\fI\fB
+
\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP
+\fI\fB
+
\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_destroy (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_write_init (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
\fBDEPRECATED: void png_write_init_2 (png_structpp \fP\fIptr_ptr\fP\fB, png_const_charp \fP\fIuser_png_ver\fP\fB, png_size_t \fP\fIpng_struct_size\fP\fB, png_size_t \fIpng_info_size\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
+\fI\fB
+
\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP
+\fI\fB
+
\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP
+\fI\fB
+
.SH DESCRIPTION
The
.I libpng
@@ -410,18 +821,20 @@ Following is a copy of the libpng.txt file that accompanies libpng.
.SH LIBPNG.TXT
libpng.txt - A description on how to use and modify libpng
- libpng version 1.2.29 - May 8, 2008
+ libpng version 1.2.40 - September 10, 2009
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
- Copyright (c) 1998-2008 Glenn Randers-Pehrson
- For conditions of distribution and use, see copyright
- notice in png.h.
+ Copyright (c) 1998-2009 Glenn Randers-Pehrson
+
+ This document is released under the libpng license.
+ For conditions of distribution and use, see the disclaimer
+ and license in png.h
Based on:
- libpng versions 0.97, January 1998, through 1.2.29 - May 8, 2008
+ libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009
Updated and distributed by Glenn Randers-Pehrson
- Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ Copyright (c) 1998-2009 Glenn Randers-Pehrson
libpng 1.0 beta 6 version 0.96 May 28, 1997
Updated and distributed by Andreas Dilger
@@ -551,9 +964,10 @@ so if it doesn't work, you don't have much to undo. Of course, you
will also want to insure that you are, in fact, dealing with a PNG
file. Libpng provides a simple check to see if a file is a PNG file.
To use it, pass in the first 1 to 8 bytes of the file to the function
-png_sig_cmp(), and it will return 0 if the bytes match the corresponding
-bytes of the PNG signature, or nonzero otherwise. Of course, the more bytes
-you pass in, the greater the accuracy of the prediction.
+png_sig_cmp(), and it will return 0 (false) if the bytes match the
+corresponding bytes of the PNG signature, or nonzero (true) otherwise.
+Of course, the more bytes you pass in, the greater the accuracy of the
+prediction.
If you are intending to keep the file pointer open for use in libpng,
you must ensure you don't read more than 8 bytes from the beginning
@@ -730,35 +1144,14 @@ To inform libpng about your function, use
png_set_read_status_fn(png_ptr, read_row_callback);
-.SS Width and height limits
-
-The PNG specification allows the width and height of an image to be as
-large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
-Since very few applications really need to process such large images,
-we have imposed an arbitrary 1-million limit on rows and columns.
-Larger images will be rejected immediately with a png_error() call. If
-you wish to override this limit, you can use
-
- png_set_user_limits(png_ptr, width_max, height_max);
-
-to set your own limits, or use width_max = height_max = 0x7fffffffL
-to allow all valid dimensions (libpng may reject some very large images
-anyway because of potential buffer overflow conditions).
-
-You should put this statement after you create the PNG structure and
-before calling png_read_info(), png_read_png(), or png_process_data().
-If you need to retrieve the limits that are being applied, use
-
- width_max = png_get_user_width_max(png_ptr);
- height_max = png_get_user_height_max(png_ptr);
-
.SS Unknown-chunk handling
Now you get to set the way the library processes unknown chunks in the
input PNG stream. Both known and unknown chunks will be read. Normal
behavior is that known chunks will be parsed into information in
-various info_ptr members while unknown chunks will be discarded. To change
-this, you can call:
+various info_ptr members while unknown chunks will be discarded. This
+behavior can be wasteful if your application will never use some known
+chunk types. To change this, you can call:
png_set_keep_unknown_chunks(png_ptr, keep,
chunk_list, num_chunks);
@@ -816,6 +1209,27 @@ callback function:
(int)sizeof(unused_chunks)/5);
#endif
+.SS User limits
+
+The PNG specification allows the width and height of an image to be as
+large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
+Since very few applications really need to process such large images,
+we have imposed an arbitrary 1-million limit on rows and columns.
+Larger images will be rejected immediately with a png_error() call. If
+you wish to override this limit, you can use
+
+ png_set_user_limits(png_ptr, width_max, height_max);
+
+to set your own limits, or use width_max = height_max = 0x7fffffffL
+to allow all valid dimensions (libpng may reject some very large images
+anyway because of potential buffer overflow conditions).
+
+You should put this statement after you create the PNG structure and
+before calling png_read_info(), png_read_png(), or png_process_data().
+If you need to retrieve the limits that are being applied, use
+
+ width_max = png_get_user_width_max(png_ptr);
+ height_max = png_get_user_height_max(png_ptr);
.SS The high-level read interface
@@ -882,6 +1296,8 @@ row_pointers prior to calling png_read_png() with
row_pointers = png_malloc(png_ptr,
height*png_sizeof(png_bytep));
for (int i=0; i<height, i++)
+ row_pointers[i]=NULL; /* security precaution */
+ for (int i=0; i<height, i++)
row_pointers[i]=png_malloc(png_ptr,
width*pixel_size);
png_set_rows(png_ptr, info_ptr, &row_pointers);
@@ -1257,9 +1673,6 @@ things.
As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
added. It expands the sample depth without changing tRNS to alpha.
-At the same time, png_set_gray_1_2_4_to_8() was deprecated, and it
-will be removed from a future version.
-
PNG can have files with 16 bits per channel. If you only can handle
8 bits per channel, this will strip the pixels down to 8 bit.
@@ -2111,7 +2524,7 @@ types.
PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE |
PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB |
PNG_FILTER_UP | PNG_FILTER_VALUE_UP |
- PNG_FILTER_AVE | PNG_FILTER_VALUE_AVE |
+ PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
PNG_ALL_FILTERS);
@@ -2201,10 +2614,14 @@ Some of the more important parts of the png_info are:
PNG_INTRAPIXEL_DIFFERENCING)
If you call png_set_IHDR(), the call must appear before any of the
-other png_set_*() functions, which might require access to some of
+other png_set_*() functions, because they might require access to some of
the IHDR settings. The remaining png_set_*() functions can be called
in any order.
+If you wish, you can reset the compression_type, interlace_type, or
+filter_method later by calling png_set_IHDR() again; if you do this, the
+width, height, bit_depth, and color_type must be the same in each call.
+
png_set_PLTE(png_ptr, info_ptr, palette,
num_palette);
palette - the palette for the file
@@ -2266,8 +2683,9 @@ in any order.
trans_values);
trans - array of transparent entries for
palette (PNG_INFO_tRNS)
- trans_values - graylevel or color sample values of
- the single transparent color for
+ trans_values - graylevel or color sample values
+ (in order red, green, blue) of the
+ single transparent color for
non-paletted images (PNG_INFO_tRNS)
num_trans - number of transparent entries
(PNG_INFO_tRNS)
@@ -2476,7 +2894,12 @@ transformations are permitted, enabled by the following masks.
PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
to transparency
PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
- PNG_TRANSFORM_STRIP_FILLER Strip out filler bytes.
+ PNG_TRANSFORM_STRIP_FILLER Strip out filler
+ bytes (deprecated).
+ PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
+ filler bytes
+ PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing
+ filler bytes
If you have valid image data in the info structure (you can use
png_set_rows() to put image data in the info structure), simply do this:
@@ -2883,9 +3306,15 @@ The replacement I/O functions must have prototypes as follows:
png_bytep data, png_size_t length);
void user_flush_data(png_structp png_ptr);
+The user_read_data() function is responsible for detecting and
+handling end-of-data errors.
+
Supplying NULL for the read, write, or flush functions sets them back
-to using the default C stream functions. It is an error to read from
-a write stream, and vice versa.
+to using the default C stream functions, which expect the io_ptr to
+point to a standard *FILE structure. It is probably a mistake
+to use NULL for one of write_data_fn and output_flush_fn but not both
+of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
+It is an error to read from a write stream, and vice versa.
Error handling in libpng is done through png_error() and png_warning().
Errors handled through png_error() are fatal, meaning that png_error()
@@ -2990,11 +3419,12 @@ you may also have to change the memory allocators (png_malloc, etc.).
.SS Configuring for compiler xxx:
-All includes for libpng are in pngconf.h. If you need to add/change/delete
-an include, this is the place to do it. The includes that are not
-needed outside libpng are protected by the PNG_INTERNAL definition,
-which is only defined for those routines inside libpng itself. The
-files in libpng proper only include png.h, which includes pngconf.h.
+All includes for libpng are in pngconf.h. If you need to add, change
+or delete an include, this is the place to do it.
+The includes that are not needed outside libpng are protected by the
+PNG_INTERNAL definition, which is only defined for those routines inside
+libpng itself. The files in libpng proper only include png.h, which
+includes pngconf.h.
.SS Configuring zlib:
@@ -3063,7 +3493,7 @@ currently does not allocate the filter buffers until png_write_row()
is called for the first time.)
filters = PNG_FILTER_NONE | PNG_FILTER_SUB
- PNG_FILTER_UP | PNG_FILTER_AVE |
+ PNG_FILTER_UP | PNG_FILTER_AVG |
PNG_FILTER_PAETH | PNG_ALL_FILTERS;
png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
@@ -3185,7 +3615,7 @@ When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
having level = 0 will be printed. There aren't any such statements in
this version of libpng, but if you insert some they will be printed.
-.SH VII. MNG support
+.SH VI. MNG support
The MNG specification (available at http://www.libpng.org/pub/mng) allows
certain extensions to PNG for PNG images that are embedded in MNG datastreams.
@@ -3210,7 +3640,7 @@ or any other MNG chunks; your application must provide its own support for
them. You may wish to consider using libmng (available at
http://www.libmng.com) instead.
-.SH VIII. Changes to Libpng from version 0.88
+.SH VII. Changes to Libpng from version 0.88
It should be noted that versions of libpng later than 0.96 are not
distributed by the original libpng author, Guy Schalnat, nor by
@@ -3259,15 +3689,202 @@ application:
png_uint_32 application_vn = PNG_LIBPNG_VER;
-.SH IX. Y2K Compliance in libpng
+.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x
+
+Support for user memory management was enabled by default. To
+accomplish this, the functions png_create_read_struct_2(),
+png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
+png_malloc_default(), and png_free_default() were added.
+
+Support for certain MNG features was enabled.
+
+Support for numbered error messages was added. However, we never got
+around to actually numbering the error messages. The function
+png_set_strip_error_numbers() was added (Note: the prototype for this
+function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
+builds of libpng-1.2.15. It was restored in libpng-1.2.36).
+
+The png_malloc_warn() function was added at libpng-1.2.3. This issues
+a png_warning and returns NULL instead of aborting when it fails to
+acquire the requested memory allocation.
+
+Support for setting user limits on image width and height was enabled
+by default. The functions png_set_user_limits(), png_get_user_width_max(),
+and png_get_user_height_max() were added at libpng-1.2.6.
+
+The png_set_add_alpha() function was added at libpng-1.2.7.
+
+The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
+Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
+tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
+deprecated.
+
+A number of macro definitions in support of runtime selection of
+assembler code features (especially Intel MMX code support) were
+added at libpng-1.2.0:
+
+ PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
+ PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
+ PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
+ PNG_ASM_FLAG_MMX_READ_INTERLACE
+ PNG_ASM_FLAG_MMX_READ_FILTER_SUB
+ PNG_ASM_FLAG_MMX_READ_FILTER_UP
+ PNG_ASM_FLAG_MMX_READ_FILTER_AVG
+ PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
+ PNG_ASM_FLAGS_INITIALIZED
+ PNG_MMX_READ_FLAGS
+ PNG_MMX_FLAGS
+ PNG_MMX_WRITE_FLAGS
+ PNG_MMX_FLAGS
+
+We added the following functions in support of runtime
+selection of assembler code features:
+
+ png_get_mmx_flagmask()
+ png_set_mmx_thresholds()
+ png_get_asm_flags()
+ png_get_mmx_bitdepth_threshold()
+ png_get_mmx_rowbytes_threshold()
+ png_set_asm_flags()
+
+We replaced all of these functions with simple stubs in libpng-1.2.20,
+when the Intel assembler code was removed due to a licensing issue.
+
+.SH IX. (Omitted)
+
+.SH X. Detecting libpng
+
+The png_get_io_ptr() function has been present since libpng-0.88, has never
+changed, and is unaffected by conditional compilation macros. It is the
+best choice for use in configure scripts for detecting the presence of any
+libpng version since 0.88. In an autoconf "configure.in" you could use
+
+ AC_CHECK_LIB(png, png_get_io_ptr, ...
+
+.SH XI. Source code repository
+
+Since about February 2009, version 1.2.34, libpng has been under "git" source
+control. The git repository was built from old libpng-x.y.z.tar.gz files
+going back to version 0.70. You can access the git repository (read only)
+at
+
+ git://libpng.git.sourceforge.net/gitroot/libpng
+
+or you can browse it via "gitweb" at
+
+ http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
-May 8, 2008
+Patches can be sent to glennrp at users.sourceforge.net or to
+png-mng-implement at lists.sourceforge.net or you can upload them to
+the libpng bug tracker at
+
+ http://libpng.sourceforge.net
+
+.SH XII. Coding style
+
+Our coding style is similar to the "Allman" style, with curly
+braces on separate lines:
+
+ if (condition)
+ {
+ action;
+ }
+
+ else if (another condition)
+ {
+ another action;
+ }
+
+The braces can be omitted from simple one-line actions:
+
+ if (condition)
+ return (0);
+
+We use 3-space indentation, except for continued statements which
+are usually indented the same as the first line of the statement
+plus four more spaces.
+
+Comments appear with the leading "/*" at the same indentation as
+the statement that follows the comment:
+
+ /* Single-line comment */
+ statement;
+
+ /* Multiple-line
+ * comment
+ */
+ statement;
+
+Very short comments can be placed at the end of the statement
+to which they pertain:
+
+ statement; /* comment */
+
+We don't use C++ style ("//") comments. We have, however,
+used them in the past in some now-abandoned MMX assembler
+code.
+
+Functions and their curly braces are not indented, and
+exported functions are marked with PNGAPI:
+
+ /* This is a public function that is visible to
+ * application programers. It does thus-and-so.
+ */
+ void PNGAPI
+ png_exported_function(png_ptr, png_info, foo)
+ {
+ body;
+ }
+
+The prototypes for all exported functions appear in png.h,
+above the comment that says
+
+ /* Maintainer: Put new public prototypes here ... */
+
+We mark all non-exported functions with "/* PRIVATE */"":
+
+ void /* PRIVATE */
+ png_non_exported_function(png_ptr, png_info, foo)
+ {
+ body;
+ }
+
+The prototypes for non-exported functions (except for those in
+pngtest) appear in
+the PNG_INTERNAL section of png.h
+above the comment that says
+
+ /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
+
+The names of all exported functions and variables begin
+with "png_", and all publicly visible C preprocessor
+macros begin with "PNG_".
+
+We put a space after each comma and after each semicolon
+in "for" statments, and we put spaces before and after each
+C binary operator and after "for" or "while". We don't
+put a space between a typecast and the expression being
+cast, nor do we put one between a function name and the
+left parenthesis that follows it:
+
+ for (i = 2; i > 0; --i)
+ x[i] = a(x) + (int)b;
+
+We prefer #ifdef and #ifndef to #if defined() and if !defined()
+when there is only one macro being tested.
+
+Other rules can be inferred by inspecting the libpng
+source.
+
+.SH XIII. Y2K Compliance in libpng
+
+September 10, 2009
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.2.29 are Y2K compliant. It is my belief that earlier
+upward through 1.2.40 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
Libpng only has three year fields. One is a 2-byte unsigned integer that
@@ -3499,6 +4116,56 @@ the first widely used release:
1.2.29rc01 13 10229 12.so.0.29[.0]
1.0.35 10 10035 10.so.0.35[.0]
1.2.29 13 10229 12.so.0.29[.0]
+ 1.0.37 10 10037 10.so.0.37[.0]
+ 1.2.30beta01-04 13 10230 12.so.0.30[.0]
+ 1.0.38rc01-08 10 10038 10.so.0.38[.0]
+ 1.2.30rc01-08 13 10230 12.so.0.30[.0]
+ 1.0.38 10 10038 10.so.0.38[.0]
+ 1.2.30 13 10230 12.so.0.30[.0]
+ 1.0.39rc01-03 10 10039 10.so.0.39[.0]
+ 1.2.31rc01-03 13 10231 12.so.0.31[.0]
+ 1.0.39 10 10039 10.so.0.39[.0]
+ 1.2.31 13 10231 12.so.0.31[.0]
+ 1.2.32beta01-02 13 10232 12.so.0.32[.0]
+ 1.0.40rc01 10 10040 10.so.0.40[.0]
+ 1.2.32rc01 13 10232 12.so.0.32[.0]
+ 1.0.40 10 10040 10.so.0.40[.0]
+ 1.2.32 13 10232 12.so.0.32[.0]
+ 1.2.33beta01-02 13 10233 12.so.0.33[.0]
+ 1.2.33rc01-02 13 10233 12.so.0.33[.0]
+ 1.0.41rc01 10 10041 10.so.0.41[.0]
+ 1.2.33 13 10233 12.so.0.33[.0]
+ 1.0.41 10 10041 10.so.0.41[.0]
+ 1.2.34beta01-07 13 10234 12.so.0.34[.0]
+ 1.0.42rc01 10 10042 10.so.0.42[.0]
+ 1.2.34rc01 13 10234 12.so.0.34[.0]
+ 1.0.42 10 10042 10.so.0.42[.0]
+ 1.2.34 13 10234 12.so.0.34[.0]
+ 1.2.35beta01-03 13 10235 12.so.0.35[.0]
+ 1.0.43rc01-02 10 10043 10.so.0.43[.0]
+ 1.2.35rc01-02 13 10235 12.so.0.35[.0]
+ 1.0.43 10 10043 10.so.0.43[.0]
+ 1.2.35 13 10235 12.so.0.35[.0]
+ 1.2.36beta01-05 13 10236 12.so.0.36[.0]
+ 1.2.36rc01 13 10236 12.so.0.36[.0]
+ 1.0.44 10 10044 10.so.0.44[.0]
+ 1.2.36 13 10236 12.so.0.36[.0]
+ 1.2.37beta01-03 13 10237 12.so.0.37[.0]
+ 1.2.37rc01 13 10237 12.so.0.37[.0]
+ 1.2.37 13 10237 12.so.0.37[.0]
+ 1.2.45 10 10045 12.so.0.45[.0]
+ 1.0.46 10 10046 10.so.0.46[.0]
+ 1.2.38beta01 13 10238 12.so.0.38[.0]
+ 1.2.38rc01-03 13 10238 12.so.0.38[.0]
+ 1.0.47 10 10047 10.so.0.47[.0]
+ 1.2.38 13 10238 12.so.0.38[.0]
+ 1.2.39beta01-05 13 10239 12.so.0.39[.0]
+ 1.2.39rc01 13 10239 12.so.0.39[.0]
+ 1.0.48 10 10048 10.so.0.48[.0]
+ 1.2.39 13 10239 12.so.0.39[.0]
+ 1.2.40rc01 13 10240 12.so.0.40[.0]
+ 1.0.49 10 10049 10.so.0.49[.0]
+ 1.2.40 13 10240 12.so.0.40[.0]
Henceforth the source version will match the shared-library minor
and patch numbers; the shared-library major version number will be
@@ -3554,7 +4221,7 @@ possible without all of you.
Thanks to Frank J. T. Wojcik for helping with the documentation.
-Libpng version 1.2.29 - May 8, 2008:
+Libpng version 1.2.40 - September 10, 2009:
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
@@ -3575,7 +4242,9 @@ included in the libpng distribution, the latter shall prevail.)
If you modify libpng you may insert additional notices immediately following
this sentence.
-libpng versions 1.2.6, August 15, 2004, through 1.2.29, May 8, 2008, are
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.2.40, September 10, 2009, are
Copyright (c) 2004,2006-2008 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
@@ -3674,7 +4343,7 @@ certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-May 8, 2008
+September 10, 2009
.\" end of man page
diff --git a/src/3rdparty/libpng/libpngpf.3 b/src/3rdparty/libpng/libpngpf.3
index 423964f..a1e030d 100644
--- a/src/3rdparty/libpng/libpngpf.3
+++ b/src/3rdparty/libpng/libpngpf.3
@@ -1,266 +1,782 @@
-.TH LIBPNGPF 3 "May 8, 2008"
+.TH LIBPNGPF 3 "September 10, 2009"
.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.2.29
+libpng \- Portable Network Graphics (PNG) Reference Library 1.2.40
(private functions)
.SH SYNOPSIS
\fB#include <png.h>\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_build_gamma_table (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_calculate_crc (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIptr\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_check_chunk_name (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBpng_size_t png_check_keyword (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charpp \fInew_key\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fImask\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_correct_palette (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBint png_crc_error (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBint png_crc_finish (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIskip\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_crc_read (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuf\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBpng_voidp png_create_struct (int \fItype\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBpng_voidp png_create_struct_2 (int \fP\fItype\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP
-\fBpng_charp png_decompress_chunk (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcomp_type\fP\fB, png_charp \fP\fIchunkdata\fP\fB, png_size_t \fP\fIchunklength\fP\fB, png_size_t \fP\fIprefix_length\fP\fB, png_size_t \fI*data_length\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
+\fBvoid png_decompress_chunk (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcomp_type\fP\fB, png_charp \fP\fIchunkdata\fP\fB, png_size_t \fP\fIchunklength\fP\fB, png_size_t \fP\fIprefix_length\fP\fB, png_size_t \fI*data_length\fP\fB);\fP
+
+\fI\fB
+
+\fI\fB
\fBvoid png_destroy_struct (png_voidp \fIstruct_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_destroy_struct_2 (png_voidp \fP\fIstruct_ptr\fP\fB, png_free_ptr \fP\fIfree_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_background (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fP\fItrans_values\fP\fB, png_color_16p \fP\fIbackground\fP\fB, png_color_16p \fP\fIbackground_1\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_bytep \fP\fIgamma_from_1\fP\fB, png_bytep \fP\fIgamma_to_1\fP\fB, png_uint_16pp \fP\fIgamma_16\fP\fB, png_uint_16pp \fP\fIgamma_16_from_1\fP\fB, png_uint_16pp \fP\fIgamma_16_to_1\fP\fB, int \fIgamma_shift\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_bgr (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_chop (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_dither (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIpalette_lookup\fP\fB, png_bytep \fIdither_lookup\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_expand (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fItrans_value\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_expand_palette (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_bytep \fP\fItrans\fP\fB, int \fInum_trans\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_gamma (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_uint_16pp \fP\fIgamma_16_table\fP\fB, int \fIgamma_shift\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_gray_to_rgb (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_invert (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_pack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIbit_depth\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_packswap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_read_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, png_uint_32 \fIflags\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_read_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fP\fIpass\fP\fB, png_uint_32 \fItransformations\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_read_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_read_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBint png_do_rgb_to_gray (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_shift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIbit_depth\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_strip_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIflags\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_swap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_unpack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_unshift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIsig_bits\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_write_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fIpass\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_write_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_write_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_do_write_transformations (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid *png_far_to_near (png_structp png_ptr,png_voidp \fP\fIptr\fP\fB, int \fIcheck\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_flush (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_IEND (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_iTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_info_destroy (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_init_mmx_flags (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_init_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_process_IDAT_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_process_some_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_check_crc (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_crc_finish (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_crc_skip (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_fill_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_have_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_have_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_have_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_process_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_IDAT (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_sig (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_read_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_restore_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_push_save_buffer (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
+\fBpng_uint_32 png_read_chunk_header (png_structp \fIpng_ptr\fP\fB);\fP
+
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_filter_row (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIprev_row\fP\fB, int \fIfilter\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_finish_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_push_finish_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_start_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_read_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_reset_crc (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBint png_set_text_2 (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_cHRM (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_filtered_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIfiltered_row\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_find_filter (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fIrow_info\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_finish_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_gAMA (png_structp \fP\fIpng_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIint_file_gamma\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_uint_16p \fP\fIhist\fP\fB, int \fInum_hist\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_charp \fP\fIprofile\fP\fB, int \fIproflen\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_IDAT (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_IEND (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fP\fIfilter_type\fP\fB, int \fIinterlace_type\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_iTXt (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcompression\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fIlang\fP\fB, png_charp \fP\fItranslated_key\fP\fB, png_charp \fItext\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_offset\fP\fB, png_uint_32 \fP\fIy_offset\fP\fB, int \fIunit_type\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_pixels_per_unit\fP\fB, png_uint_32 \fP\fIy_pixels_per_unit\fP\fB, int \fIunit_type\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_uint_32 \fInum_pal\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fP\fIsbit\fP\fB, int \fIcolor_type\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sRGB (png_structp \fP\fIpng_ptr\fP\fB, int \fIintent\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_spalette_p \fIpalette\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_start_row (png_structp \fIpng_ptr\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fItext_len\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fItrans\fP\fB, png_color_16p \fP\fIvalues\fP\fB, int \fP\fInumber\fP\fB, int \fIcolor_type\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_write_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fP\fItext_len\fP\fB, int \fIcompression\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP
+\fI\fB
+
+\fI\fB
+
\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP
\fI\fB
+\fI\fB
+
.SH DESCRIPTION
The functions listed above are used privately by libpng
and are not recommended for use by applications. They are
diff --git a/src/3rdparty/libpng/png.5 b/src/3rdparty/libpng/png.5
index 832a6f4..30923ba 100644
--- a/src/3rdparty/libpng/png.5
+++ b/src/3rdparty/libpng/png.5
@@ -1,4 +1,4 @@
-.TH PNG 5 "May 8, 2008"
+.TH PNG 5 "September 10, 2009"
.SH NAME
png \- Portable Network Graphics (PNG) format
.SH DESCRIPTION
diff --git a/src/3rdparty/libpng/png.c b/src/3rdparty/libpng/png.c
index 63ae86e..be1bd3a 100644
--- a/src/3rdparty/libpng/png.c
+++ b/src/3rdparty/libpng/png.c
@@ -1,11 +1,14 @@
/* png.c - location for general purpose libpng functions
*
- * Last changed in libpng 1.2.21 October 4, 2007
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2007 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.39 [August 13, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
#define PNG_INTERNAL
@@ -13,7 +16,7 @@
#include "png.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_2_29 Your_png_h_is_not_version_1_2_29;
+typedef version_1_2_40 Your_png_h_is_not_version_1_2_40;
/* Version information for C files. This had better match the version
* string defined in png.h. */
@@ -53,18 +56,18 @@ PNG_tRNS;
PNG_zTXt;
#ifdef PNG_READ_SUPPORTED
-/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-/* start of interlace block */
+/* Start of interlace block */
PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
-/* offset to next interlace block */
+/* Offset to next interlace block */
PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
-/* start of interlace block in the y direction */
+/* Start of interlace block in the y direction */
PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
-/* offset to next interlace block in the y direction */
+/* Offset to next interlace block in the y direction */
PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
/* Height of interlace block. This is not currently used - if you need
@@ -92,8 +95,9 @@ PNG_CONST int FARDATA png_pass_dsp_mask[]
void PNGAPI
png_set_sig_bytes(png_structp png_ptr, int num_bytes)
{
- if(png_ptr == NULL) return;
- png_debug(1, "in png_set_sig_bytes\n");
+ if (png_ptr == NULL)
+ return;
+ png_debug(1, "in png_set_sig_bytes");
if (num_bytes > 8)
png_error(png_ptr, "Too many bytes for PNG signature.");
@@ -144,7 +148,7 @@ png_check_sig(png_bytep sig, int num)
#ifdef PNG_1_0_X
voidpf PNGAPI
#else
-voidpf /* private */
+voidpf /* PRIVATE */
#endif
png_zalloc(voidpf png_ptr, uInt items, uInt size)
{
@@ -153,7 +157,8 @@ png_zalloc(voidpf png_ptr, uInt items, uInt size)
png_uint_32 save_flags=p->flags;
png_uint_32 num_bytes;
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
if (items > PNG_UINT_32_MAX/size)
{
png_warning (p, "Potential overflow in png_zalloc()");
@@ -183,11 +188,11 @@ png_zalloc(voidpf png_ptr, uInt items, uInt size)
return ((voidpf)ptr);
}
-/* function to free memory for zlib */
+/* Function to free memory for zlib */
#ifdef PNG_1_0_X
void PNGAPI
#else
-void /* private */
+void /* PRIVATE */
#endif
png_zfree(voidpf png_ptr, voidpf ptr)
{
@@ -240,8 +245,9 @@ png_create_info_struct(png_structp png_ptr)
{
png_infop info_ptr;
- png_debug(1, "in png_create_info_struct\n");
- if(png_ptr == NULL) return (NULL);
+ png_debug(1, "in png_create_info_struct");
+ if (png_ptr == NULL)
+ return (NULL);
#ifdef PNG_USER_MEM_SUPPORTED
info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
png_ptr->malloc_fn, png_ptr->mem_ptr);
@@ -263,9 +269,10 @@ void PNGAPI
png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
{
png_infop info_ptr = NULL;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
- png_debug(1, "in png_destroy_info_struct\n");
+ png_debug(1, "in png_destroy_info_struct");
if (info_ptr_ptr != NULL)
info_ptr = *info_ptr_ptr;
@@ -302,19 +309,20 @@ png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
{
png_infop info_ptr = *ptr_ptr;
- if(info_ptr == NULL) return;
+ if (info_ptr == NULL)
+ return;
- png_debug(1, "in png_info_init_3\n");
+ png_debug(1, "in png_info_init_3");
- if(png_sizeof(png_info) > png_info_struct_size)
- {
- png_destroy_struct(info_ptr);
- info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
- *ptr_ptr = info_ptr;
- }
+ if (png_sizeof(png_info) > png_info_struct_size)
+ {
+ png_destroy_struct(info_ptr);
+ info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
+ *ptr_ptr = info_ptr;
+ }
- /* set everything to 0 */
- png_memset(info_ptr, 0, png_sizeof (png_info));
+ /* Set everything to 0 */
+ png_memset(info_ptr, 0, png_sizeof(png_info));
}
#ifdef PNG_FREE_ME_SUPPORTED
@@ -322,12 +330,12 @@ void PNGAPI
png_data_freer(png_structp png_ptr, png_infop info_ptr,
int freer, png_uint_32 mask)
{
- png_debug(1, "in png_data_freer\n");
+ png_debug(1, "in png_data_freer");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if(freer == PNG_DESTROY_WILL_FREE_DATA)
+ if (freer == PNG_DESTROY_WILL_FREE_DATA)
info_ptr->free_me |= mask;
- else if(freer == PNG_USER_WILL_FREE_DATA)
+ else if (freer == PNG_USER_WILL_FREE_DATA)
info_ptr->free_me &= ~mask;
else
png_warning(png_ptr,
@@ -339,249 +347,250 @@ void PNGAPI
png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
int num)
{
- png_debug(1, "in png_free_data\n");
+ png_debug(1, "in png_free_data");
if (png_ptr == NULL || info_ptr == NULL)
return;
#if defined(PNG_TEXT_SUPPORTED)
-/* free text item num or (if num == -1) all text items */
+ /* Free text item num or (if num == -1) all text items */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
+ if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_TEXT)
+ if (mask & PNG_FREE_TEXT)
#endif
-{
- if (num != -1)
- {
- if (info_ptr->text && info_ptr->text[num].key)
- {
- png_free(png_ptr, info_ptr->text[num].key);
- info_ptr->text[num].key = NULL;
- }
- }
- else
{
- int i;
- for (i = 0; i < info_ptr->num_text; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
- png_free(png_ptr, info_ptr->text);
- info_ptr->text = NULL;
- info_ptr->num_text=0;
+ if (num != -1)
+ {
+ if (info_ptr->text && info_ptr->text[num].key)
+ {
+ png_free(png_ptr, info_ptr->text[num].key);
+ info_ptr->text[num].key = NULL;
+ }
+ }
+ else
+ {
+ int i;
+ for (i = 0; i < info_ptr->num_text; i++)
+ png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
+ png_free(png_ptr, info_ptr->text);
+ info_ptr->text = NULL;
+ info_ptr->num_text=0;
+ }
}
-}
#endif
#if defined(PNG_tRNS_SUPPORTED)
-/* free any tRNS entry */
+ /* Free any tRNS entry */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
+ if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
#else
-if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
+ if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
#endif
-{
- png_free(png_ptr, info_ptr->trans);
- info_ptr->valid &= ~PNG_INFO_tRNS;
+ {
+ png_free(png_ptr, info_ptr->trans);
+ info_ptr->trans = NULL;
+ info_ptr->valid &= ~PNG_INFO_tRNS;
#ifndef PNG_FREE_ME_SUPPORTED
- png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
+ png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
#endif
- info_ptr->trans = NULL;
-}
+ }
#endif
#if defined(PNG_sCAL_SUPPORTED)
-/* free any sCAL entry */
+ /* Free any sCAL entry */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
+ if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_SCAL)
+ if (mask & PNG_FREE_SCAL)
#endif
-{
+ {
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
- png_free(png_ptr, info_ptr->scal_s_width);
- png_free(png_ptr, info_ptr->scal_s_height);
- info_ptr->scal_s_width = NULL;
- info_ptr->scal_s_height = NULL;
+ png_free(png_ptr, info_ptr->scal_s_width);
+ png_free(png_ptr, info_ptr->scal_s_height);
+ info_ptr->scal_s_width = NULL;
+ info_ptr->scal_s_height = NULL;
#endif
- info_ptr->valid &= ~PNG_INFO_sCAL;
-}
+ info_ptr->valid &= ~PNG_INFO_sCAL;
+ }
#endif
#if defined(PNG_pCAL_SUPPORTED)
-/* free any pCAL entry */
+ /* Free any pCAL entry */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
+ if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_PCAL)
+ if (mask & PNG_FREE_PCAL)
#endif
-{
- png_free(png_ptr, info_ptr->pcal_purpose);
- png_free(png_ptr, info_ptr->pcal_units);
- info_ptr->pcal_purpose = NULL;
- info_ptr->pcal_units = NULL;
- if (info_ptr->pcal_params != NULL)
- {
- int i;
- for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
- {
- png_free(png_ptr, info_ptr->pcal_params[i]);
- info_ptr->pcal_params[i]=NULL;
- }
- png_free(png_ptr, info_ptr->pcal_params);
- info_ptr->pcal_params = NULL;
- }
- info_ptr->valid &= ~PNG_INFO_pCAL;
-}
+ {
+ png_free(png_ptr, info_ptr->pcal_purpose);
+ png_free(png_ptr, info_ptr->pcal_units);
+ info_ptr->pcal_purpose = NULL;
+ info_ptr->pcal_units = NULL;
+ if (info_ptr->pcal_params != NULL)
+ {
+ int i;
+ for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
+ {
+ png_free(png_ptr, info_ptr->pcal_params[i]);
+ info_ptr->pcal_params[i]=NULL;
+ }
+ png_free(png_ptr, info_ptr->pcal_params);
+ info_ptr->pcal_params = NULL;
+ }
+ info_ptr->valid &= ~PNG_INFO_pCAL;
+ }
#endif
#if defined(PNG_iCCP_SUPPORTED)
-/* free any iCCP entry */
+ /* Free any iCCP entry */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
+ if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_ICCP)
+ if (mask & PNG_FREE_ICCP)
#endif
-{
- png_free(png_ptr, info_ptr->iccp_name);
- png_free(png_ptr, info_ptr->iccp_profile);
- info_ptr->iccp_name = NULL;
- info_ptr->iccp_profile = NULL;
- info_ptr->valid &= ~PNG_INFO_iCCP;
-}
+ {
+ png_free(png_ptr, info_ptr->iccp_name);
+ png_free(png_ptr, info_ptr->iccp_profile);
+ info_ptr->iccp_name = NULL;
+ info_ptr->iccp_profile = NULL;
+ info_ptr->valid &= ~PNG_INFO_iCCP;
+ }
#endif
#if defined(PNG_sPLT_SUPPORTED)
-/* free a given sPLT entry, or (if num == -1) all sPLT entries */
+ /* Free a given sPLT entry, or (if num == -1) all sPLT entries */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
+ if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_SPLT)
+ if (mask & PNG_FREE_SPLT)
#endif
-{
- if (num != -1)
{
- if(info_ptr->splt_palettes)
+ if (num != -1)
{
- png_free(png_ptr, info_ptr->splt_palettes[num].name);
- png_free(png_ptr, info_ptr->splt_palettes[num].entries);
- info_ptr->splt_palettes[num].name = NULL;
- info_ptr->splt_palettes[num].entries = NULL;
+ if (info_ptr->splt_palettes)
+ {
+ png_free(png_ptr, info_ptr->splt_palettes[num].name);
+ png_free(png_ptr, info_ptr->splt_palettes[num].entries);
+ info_ptr->splt_palettes[num].name = NULL;
+ info_ptr->splt_palettes[num].entries = NULL;
+ }
+ }
+ else
+ {
+ if (info_ptr->splt_palettes_num)
+ {
+ int i;
+ for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
+ png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
+
+ png_free(png_ptr, info_ptr->splt_palettes);
+ info_ptr->splt_palettes = NULL;
+ info_ptr->splt_palettes_num = 0;
+ }
+ info_ptr->valid &= ~PNG_INFO_sPLT;
}
}
- else
- {
- if(info_ptr->splt_palettes_num)
- {
- int i;
- for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
-
- png_free(png_ptr, info_ptr->splt_palettes);
- info_ptr->splt_palettes = NULL;
- info_ptr->splt_palettes_num = 0;
- }
- info_ptr->valid &= ~PNG_INFO_sPLT;
- }
-}
#endif
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- if(png_ptr->unknown_chunk.data)
- {
- png_free(png_ptr, png_ptr->unknown_chunk.data);
- png_ptr->unknown_chunk.data = NULL;
- }
+ if (png_ptr->unknown_chunk.data)
+ {
+ png_free(png_ptr, png_ptr->unknown_chunk.data);
+ png_ptr->unknown_chunk.data = NULL;
+ }
+
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
+ if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_UNKN)
+ if (mask & PNG_FREE_UNKN)
#endif
-{
- if (num != -1)
{
- if(info_ptr->unknown_chunks)
- {
- png_free(png_ptr, info_ptr->unknown_chunks[num].data);
- info_ptr->unknown_chunks[num].data = NULL;
- }
- }
- else
- {
- int i;
+ if (num != -1)
+ {
+ if (info_ptr->unknown_chunks)
+ {
+ png_free(png_ptr, info_ptr->unknown_chunks[num].data);
+ info_ptr->unknown_chunks[num].data = NULL;
+ }
+ }
+ else
+ {
+ int i;
- if(info_ptr->unknown_chunks_num)
- {
- for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
+ if (info_ptr->unknown_chunks_num)
+ {
+ for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
+ png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
- png_free(png_ptr, info_ptr->unknown_chunks);
- info_ptr->unknown_chunks = NULL;
- info_ptr->unknown_chunks_num = 0;
- }
+ png_free(png_ptr, info_ptr->unknown_chunks);
+ info_ptr->unknown_chunks = NULL;
+ info_ptr->unknown_chunks_num = 0;
+ }
+ }
}
-}
#endif
#if defined(PNG_hIST_SUPPORTED)
-/* free any hIST entry */
+ /* Free any hIST entry */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
+ if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
#else
-if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
+ if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
#endif
-{
- png_free(png_ptr, info_ptr->hist);
- info_ptr->hist = NULL;
- info_ptr->valid &= ~PNG_INFO_hIST;
+ {
+ png_free(png_ptr, info_ptr->hist);
+ info_ptr->hist = NULL;
+ info_ptr->valid &= ~PNG_INFO_hIST;
#ifndef PNG_FREE_ME_SUPPORTED
- png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
+ png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
#endif
-}
+ }
#endif
-/* free any PLTE entry that was internally allocated */
+ /* Free any PLTE entry that was internally allocated */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
+ if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
#else
-if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
+ if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
#endif
-{
- png_zfree(png_ptr, info_ptr->palette);
- info_ptr->palette = NULL;
- info_ptr->valid &= ~PNG_INFO_PLTE;
+ {
+ png_zfree(png_ptr, info_ptr->palette);
+ info_ptr->palette = NULL;
+ info_ptr->valid &= ~PNG_INFO_PLTE;
#ifndef PNG_FREE_ME_SUPPORTED
- png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
+ png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
#endif
- info_ptr->num_palette = 0;
-}
+ info_ptr->num_palette = 0;
+ }
#if defined(PNG_INFO_IMAGE_SUPPORTED)
-/* free any image bits attached to the info structure */
+ /* Free any image bits attached to the info structure */
#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
+ if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
#else
-if (mask & PNG_FREE_ROWS)
+ if (mask & PNG_FREE_ROWS)
#endif
-{
- if(info_ptr->row_pointers)
- {
- int row;
- for (row = 0; row < (int)info_ptr->height; row++)
- {
- png_free(png_ptr, info_ptr->row_pointers[row]);
- info_ptr->row_pointers[row]=NULL;
- }
- png_free(png_ptr, info_ptr->row_pointers);
- info_ptr->row_pointers=NULL;
- }
- info_ptr->valid &= ~PNG_INFO_IDAT;
-}
+ {
+ if (info_ptr->row_pointers)
+ {
+ int row;
+ for (row = 0; row < (int)info_ptr->height; row++)
+ {
+ png_free(png_ptr, info_ptr->row_pointers[row]);
+ info_ptr->row_pointers[row]=NULL;
+ }
+ png_free(png_ptr, info_ptr->row_pointers);
+ info_ptr->row_pointers=NULL;
+ }
+ info_ptr->valid &= ~PNG_INFO_IDAT;
+ }
#endif
#ifdef PNG_FREE_ME_SUPPORTED
- if(num == -1)
- info_ptr->free_me &= ~mask;
+ if (num == -1)
+ info_ptr->free_me &= ~mask;
else
- info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
+ info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
#endif
}
@@ -592,16 +601,16 @@ if (mask & PNG_FREE_ROWS)
void /* PRIVATE */
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_info_destroy\n");
+ png_debug(1, "in png_info_destroy");
png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
if (png_ptr->num_chunk_list)
{
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
- png_ptr->num_chunk_list=0;
+ png_free(png_ptr, png_ptr->chunk_list);
+ png_ptr->chunk_list=NULL;
+ png_ptr->num_chunk_list = 0;
}
#endif
@@ -616,7 +625,8 @@ png_info_destroy(png_structp png_ptr, png_infop info_ptr)
png_voidp PNGAPI
png_get_io_ptr(png_structp png_ptr)
{
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
return (png_ptr->io_ptr);
}
@@ -631,8 +641,9 @@ png_get_io_ptr(png_structp png_ptr)
void PNGAPI
png_init_io(png_structp png_ptr, png_FILE_p fp)
{
- png_debug(1, "in png_init_io\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_init_io");
+ if (png_ptr == NULL)
+ return;
png_ptr->io_ptr = (png_voidp)fp;
}
#endif
@@ -648,7 +659,8 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
if (png_ptr->time_buffer == NULL)
{
png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
@@ -669,7 +681,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
#ifdef USE_FAR_KEYWORD
{
char near_time_buf[29];
- png_snprintf6(near_time_buf,29,"%d %s %d %02d:%02d:%02d +0000",
+ png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
ptime->day % 32, short_months[(ptime->month - 1) % 12],
ptime->year, ptime->hour % 24, ptime->minute % 60,
ptime->second % 61);
@@ -677,7 +689,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
29*png_sizeof(char));
}
#else
- png_snprintf6(png_ptr->time_buffer,29,"%d %s %d %02d:%02d:%02d +0000",
+ png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
ptime->day % 32, short_months[(ptime->month - 1) % 12],
ptime->year, ptime->hour % 24, ptime->minute % 60,
ptime->second % 61);
@@ -692,9 +704,9 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
png_charp PNGAPI
png_get_copyright(png_structp png_ptr)
{
- png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */
- return ((png_charp) "\n libpng version 1.2.29 - May 8, 2008\n\
- Copyright (c) 1998-2008 Glenn Randers-Pehrson\n\
+ png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
+ return ((png_charp) "\n libpng version 1.2.40 - September 10, 2009\n\
+ Copyright (c) 1998-2009 Glenn Randers-Pehrson\n\
Copyright (c) 1996-1997 Andreas Dilger\n\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
}
@@ -711,7 +723,7 @@ png_charp PNGAPI
png_get_libpng_ver(png_structp png_ptr)
{
/* Version of *.c files used when building libpng */
- png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */
+ png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
return ((png_charp) PNG_LIBPNG_VER_STRING);
}
@@ -719,7 +731,7 @@ png_charp PNGAPI
png_get_header_ver(png_structp png_ptr)
{
/* Version of *.h files used when building libpng */
- png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */
+ png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
return ((png_charp) PNG_LIBPNG_VER_STRING);
}
@@ -727,7 +739,7 @@ png_charp PNGAPI
png_get_header_version(png_structp png_ptr)
{
/* Returns longer string containing both version and date */
- png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */
+ png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
return ((png_charp) PNG_HEADER_VERSION_STRING
#ifndef PNG_READ_SUPPORTED
" (NO READ SUPPORT)"
@@ -740,15 +752,15 @@ png_get_header_version(png_structp png_ptr)
int PNGAPI
png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
{
- /* check chunk_name and return "keep" value if it's on the list, else 0 */
+ /* Check chunk_name and return "keep" value if it's on the list, else 0 */
int i;
png_bytep p;
- if(png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
+ if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
return 0;
- p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5;
- for (i = png_ptr->num_chunk_list; i; i--, p-=5)
+ p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
+ for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
if (!png_memcmp(chunk_name, p, 4))
- return ((int)*(p+4));
+ return ((int)*(p + 4));
return 0;
}
#endif
@@ -757,7 +769,8 @@ png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
int PNGAPI
png_reset_zstream(png_structp png_ptr)
{
- if (png_ptr == NULL) return Z_STREAM_ERROR;
+ if (png_ptr == NULL)
+ return Z_STREAM_ERROR;
return (inflateReset(&png_ptr->zstream));
}
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
@@ -773,11 +786,11 @@ png_access_version_number(void)
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
#if !defined(PNG_1_0_X)
-/* this function was added to libpng 1.2.0 */
+/* This function was added to libpng 1.2.0 */
int PNGAPI
png_mmx_support(void)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
return -1;
}
#endif /* PNG_1_0_X */
@@ -790,9 +803,124 @@ png_mmx_support(void)
png_size_t PNGAPI
png_convert_size(size_t size)
{
- if (size > (png_size_t)-1)
- PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
- return ((png_size_t)size);
+ if (size > (png_size_t)-1)
+ PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
+ return ((png_size_t)size);
}
#endif /* PNG_SIZE_T */
+
+/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
+#if defined(PNG_cHRM_SUPPORTED)
+#if !defined(PNG_NO_CHECK_cHRM)
+
+/*
+ * Multiply two 32-bit numbers, V1 and V2, using 32-bit
+ * arithmetic, to produce a 64 bit result in the HI/LO words.
+ *
+ * A B
+ * x C D
+ * ------
+ * AD || BD
+ * AC || CB || 0
+ *
+ * where A and B are the high and low 16-bit words of V1,
+ * C and D are the 16-bit words of V2, AD is the product of
+ * A and D, and X || Y is (X << 16) + Y.
+*/
+
+void /* PRIVATE */
+png_64bit_product (long v1, long v2, unsigned long *hi_product,
+ unsigned long *lo_product)
+{
+ int a, b, c, d;
+ long lo, hi, x, y;
+
+ a = (v1 >> 16) & 0xffff;
+ b = v1 & 0xffff;
+ c = (v2 >> 16) & 0xffff;
+ d = v2 & 0xffff;
+
+ lo = b * d; /* BD */
+ x = a * d + c * b; /* AD + CB */
+ y = ((lo >> 16) & 0xffff) + x;
+
+ lo = (lo & 0xffff) | ((y & 0xffff) << 16);
+ hi = (y >> 16) & 0xffff;
+
+ hi += a * c; /* AC */
+
+ *hi_product = (unsigned long)hi;
+ *lo_product = (unsigned long)lo;
+}
+
+int /* PRIVATE */
+png_check_cHRM_fixed(png_structp png_ptr,
+ png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
+ png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
+ png_fixed_point blue_x, png_fixed_point blue_y)
+{
+ int ret = 1;
+ unsigned long xy_hi,xy_lo,yx_hi,yx_lo;
+
+ png_debug(1, "in function png_check_cHRM_fixed");
+ if (png_ptr == NULL)
+ return 0;
+
+ if (white_x < 0 || white_y <= 0 ||
+ red_x < 0 || red_y < 0 ||
+ green_x < 0 || green_y < 0 ||
+ blue_x < 0 || blue_y < 0)
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set negative chromaticity value");
+ ret = 0;
+ }
+ if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ white_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ red_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ red_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ green_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ green_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ blue_y > (png_fixed_point) PNG_UINT_31_MAX )
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set chromaticity value exceeding 21474.83");
+ ret = 0;
+ }
+ if (white_x > 100000L - white_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM white point");
+ ret = 0;
+ }
+ if (red_x > 100000L - red_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM red point");
+ ret = 0;
+ }
+ if (green_x > 100000L - green_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM green point");
+ ret = 0;
+ }
+ if (blue_x > 100000L - blue_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM blue point");
+ ret = 0;
+ }
+
+ png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo);
+ png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo);
+
+ if (xy_hi == yx_hi && xy_lo == yx_lo)
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set cHRM RGB triangle with zero area");
+ ret = 0;
+ }
+
+ return ret;
+}
+#endif /* NO_PNG_CHECK_cHRM */
+#endif /* PNG_cHRM_SUPPORTED */
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
diff --git a/src/3rdparty/libpng/png.h b/src/3rdparty/libpng/png.h
index 2e194b7..d95339d 100644
--- a/src/3rdparty/libpng/png.h
+++ b/src/3rdparty/libpng/png.h
@@ -1,14 +1,16 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.2.29 - May 8, 2008
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * libpng version 1.2.40 - September 10, 2009
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license (See LICENSE, below)
+ *
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.2.29 - May 8, 2008: Glenn
+ * libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009: Glenn
* See also "Contributing Authors", below.
*
* Note about libpng version numbers:
@@ -192,6 +194,57 @@
* 1.2.29rc01 13 10229 12.so.0.29[.0]
* 1.0.35 10 10035 10.so.0.35[.0]
* 1.2.29 13 10229 12.so.0.29[.0]
+ * 1.0.37 10 10037 10.so.0.37[.0]
+ * 1.2.30beta01-04 13 10230 12.so.0.30[.0]
+ * 1.0.38rc01-08 10 10038 10.so.0.38[.0]
+ * 1.2.30rc01-08 13 10230 12.so.0.30[.0]
+ * 1.0.38 10 10038 10.so.0.38[.0]
+ * 1.2.30 13 10230 12.so.0.30[.0]
+ * 1.0.39rc01-03 10 10039 10.so.0.39[.0]
+ * 1.2.31rc01-03 13 10231 12.so.0.31[.0]
+ * 1.0.39 10 10039 10.so.0.39[.0]
+ * 1.2.31 13 10231 12.so.0.31[.0]
+ * 1.2.32beta01-02 13 10232 12.so.0.32[.0]
+ * 1.0.40rc01 10 10040 10.so.0.40[.0]
+ * 1.2.32rc01 13 10232 12.so.0.32[.0]
+ * 1.0.40 10 10040 10.so.0.40[.0]
+ * 1.2.32 13 10232 12.so.0.32[.0]
+ * 1.2.33beta01-02 13 10233 12.so.0.33[.0]
+ * 1.2.33rc01-02 13 10233 12.so.0.33[.0]
+ * 1.0.41rc01 10 10041 10.so.0.41[.0]
+ * 1.2.33 13 10233 12.so.0.33[.0]
+ * 1.0.41 10 10041 10.so.0.41[.0]
+ * 1.2.34beta01-07 13 10234 12.so.0.34[.0]
+ * 1.0.42rc01 10 10042 10.so.0.42[.0]
+ * 1.2.34rc01 13 10234 12.so.0.34[.0]
+ * 1.0.42 10 10042 10.so.0.42[.0]
+ * 1.2.34 13 10234 12.so.0.34[.0]
+ * 1.2.35beta01-03 13 10235 12.so.0.35[.0]
+ * 1.0.43rc01-02 10 10043 10.so.0.43[.0]
+ * 1.2.35rc01-02 13 10235 12.so.0.35[.0]
+ * 1.0.43 10 10043 10.so.0.43[.0]
+ * 1.2.35 13 10235 12.so.0.35[.0]
+ * 1.2.36beta01-05 13 10236 12.so.0.36[.0]
+ * 1.2.36rc01 13 10236 12.so.0.36[.0]
+ * 1.0.44 10 10044 10.so.0.44[.0]
+ * 1.2.36 13 10236 12.so.0.36[.0]
+ * 1.2.37beta01-03 13 10237 12.so.0.37[.0]
+ * 1.2.37rc01 13 10237 12.so.0.37[.0]
+ * 1.2.37 13 10237 12.so.0.37[.0]
+ * 1.2.45 10 10045 12.so.0.45[.0]
+ * 1.0.46 10 10046 10.so.0.46[.0]
+ * 1.2.38beta01 13 10238 12.so.0.38[.0]
+ * 1.2.38rc01-03 13 10238 12.so.0.38[.0]
+ * 1.0.47 10 10047 10.so.0.47[.0]
+ * 1.2.38 13 10238 12.so.0.38[.0]
+ * 1.2.39beta01-05 13 10239 12.so.0.39[.0]
+ * 1.2.39rc01 13 10239 12.so.0.39[.0]
+ * 1.0.48 10 10048 10.so.0.48[.0]
+ * 1.2.39 13 10239 12.so.0.39[.0]
+ * 1.2.40beta01 13 10240 12.so.0.40[.0]
+ * 1.2.40rc01 13 10240 12.so.0.40[.0]
+ * 1.0.49 10 10049 10.so.0.49[.0]
+ * 1.2.40 13 10240 12.so.0.40[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -221,8 +274,10 @@
* If you modify libpng you may insert additional notices immediately following
* this sentence.
*
- * libpng versions 1.2.6, August 15, 2004, through 1.2.29, May 8, 2008, are
- * Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are
+ * This code is released under the libpng license.
+ *
+ * libpng versions 1.2.6, August 15, 2004, through 1.2.40, September 10, 2009, are
+ * Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
* distributed according to the same disclaimer and license as libpng-1.2.5
* with the following individual added to the list of Contributing Authors:
*
@@ -333,13 +388,13 @@
* Y2K compliance in libpng:
* =========================
*
- * May 8, 2008
+ * September 10, 2009
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.2.29 are Y2K compliant. It is my belief that earlier
+ * upward through 1.2.40 are Y2K compliant. It is my belief that earlier
* versions were also Y2K compliant.
*
* Libpng only has three year fields. One is a 2-byte unsigned integer
@@ -395,9 +450,9 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.2.29"
+#define PNG_LIBPNG_VER_STRING "1.2.40"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.2.29 - May 8, 2008\n"
+ " libpng version 1.2.40 - September 10, 2009\n"
#define PNG_LIBPNG_VER_SONUM 0
#define PNG_LIBPNG_VER_DLLNUM 13
@@ -405,9 +460,10 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 2
-#define PNG_LIBPNG_VER_RELEASE 29
+#define PNG_LIBPNG_VER_RELEASE 40
/* This should match the numeric part of the final component of
- * PNG_LIBPNG_VER_STRING, omitting any leading zero: */
+ * PNG_LIBPNG_VER_STRING, omitting any leading zero:
+ */
#define PNG_LIBPNG_VER_BUILD 0
@@ -417,7 +473,7 @@
#define PNG_LIBPNG_BUILD_RC 3
#define PNG_LIBPNG_BUILD_STABLE 4
#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7
-
+
/* Release-Specific Flags */
#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with
PNG_LIBPNG_BUILD_STABLE only */
@@ -432,15 +488,16 @@
* We must not include leading zeros.
* Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
* version 1.0.0 was mis-numbered 100 instead of 10000). From
- * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */
-#define PNG_LIBPNG_VER 10229 /* 1.2.29 */
+ * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
+ */
+#define PNG_LIBPNG_VER 10240 /* 1.2.40 */
#ifndef PNG_VERSION_INFO_ONLY
-/* include the compression library's header */
+/* Include the compression library's header */
#include "zlib.h"
#endif
-/* include all user configurable info, including optional assembler routines */
+/* Include all user configurable info, including optional assembler routines */
#include "pngconf.h"
/*
@@ -448,12 +505,12 @@
/* Ref MSDN: Private as priority over Special
* VS_FF_PRIVATEBUILD File *was not* built using standard release
* procedures. If this value is given, the StringFileInfo block must
- * contain a PrivateBuild string.
+ * contain a PrivateBuild string.
*
* VS_FF_SPECIALBUILD File *was* built by the original company using
* standard release procedures but is a variation of the standard
* file of the same version number. If this value is given, the
- * StringFileInfo block must contain a SpecialBuild string.
+ * StringFileInfo block must contain a SpecialBuild string.
*/
#if defined(PNG_USER_PRIVATEBUILD)
@@ -515,14 +572,14 @@ extern "C" {
#define png_write_status_ptr_NULL NULL
#endif
-/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
+/* Variables declared in png.c - only it needs to define PNG_NO_EXTERN */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
/* Version information for C files, stored in png.c. This had better match
* the version above.
*/
#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (PNG_CONST char) png_libpng_ver[18];
- /* need room for 99.99.99beta99z */
+ /* Need room for 99.99.99beta99z */
#else
#define png_libpng_ver png_get_header_ver(NULL)
#endif
@@ -641,7 +698,8 @@ typedef png_text FAR * FAR * png_textpp;
#endif
/* Supported compression types for text in PNG files (tEXt, and zTXt).
- * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
+ * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed.
+ */
#define PNG_TEXT_COMPRESSION_NONE_WR -3
#define PNG_TEXT_COMPRESSION_zTXt_WR -2
#define PNG_TEXT_COMPRESSION_NONE -1
@@ -668,7 +726,8 @@ typedef struct png_time_struct
typedef png_time FAR * png_timep;
typedef png_time FAR * FAR * png_timepp;
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \
+ defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
/* png_unknown_chunk is a structure to hold queued chunks for which there is
* no specific support. The idea is that we can use this to queue
* up private chunks for output even though the library doesn't actually
@@ -730,7 +789,7 @@ typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
*/
typedef struct png_info_struct
{
- /* the following are necessary for every PNG file */
+ /* The following are necessary for every PNG file */
png_uint_32 width; /* width of image in pixels (from IHDR) */
png_uint_32 height; /* height of image in pixels (from IHDR) */
png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
@@ -903,8 +962,9 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
png_uint_32 free_me; /* flags items libpng is responsible for freeing */
#endif
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* storage for unknown chunks that the library doesn't recognize. */
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \
+ defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+ /* Storage for unknown chunks that the library doesn't recognize. */
png_unknown_chunkp unknown_chunks;
png_size_t unknown_chunks_num;
#endif
@@ -919,7 +979,7 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
#endif
#if defined(PNG_sPLT_SUPPORTED)
- /* data on sPLT chunks (there may be more than one). */
+ /* Data on sPLT chunks (there may be more than one). */
png_sPLT_tp splt_palettes;
png_uint_32 splt_palettes_num;
#endif
@@ -1134,7 +1194,10 @@ typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));
#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */
#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */
#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */
-#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */
+#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only, deprecated */
+/* Added to libpng-1.2.34 */
+#define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* write only */
+#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */
/* Flags for MNG supported features */
#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
@@ -1204,7 +1267,7 @@ struct png_struct_def
png_uint_32 row_number; /* current row in interlace pass */
png_bytep prev_row; /* buffer to save previous (unfiltered) row */
png_bytep row_buf; /* buffer to save current (unfiltered) row */
-#ifndef PNG_NO_WRITE_FILTERING
+#ifndef PNG_NO_WRITE_FILTER
png_bytep sub_row; /* buffer to save "sub" row when filtering */
png_bytep up_row; /* buffer to save "up" row when filtering */
png_bytep avg_row; /* buffer to save "avg" row when filtering */
@@ -1251,7 +1314,7 @@ struct png_struct_def
#endif /* PNG_bKGD_SUPPORTED */
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
- png_flush_ptr output_flush_fn;/* Function for flushing output */
+ png_flush_ptr output_flush_fn; /* Function for flushing output */
png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */
png_uint_32 flush_rows; /* number of rows written since last flush */
#endif
@@ -1349,7 +1412,7 @@ struct png_struct_def
/* New members added in libpng-1.0.6 */
#ifdef PNG_FREE_ME_SUPPORTED
- png_uint_32 free_me; /* flags items libpng is responsible for freeing */
+ png_uint_32 free_me; /* flags items libpng is responsible for freeing */
#endif
#if defined(PNG_USER_CHUNKS_SUPPORTED)
@@ -1357,7 +1420,7 @@ struct png_struct_def
png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */
#endif
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
int num_chunk_list;
png_bytep chunk_list;
#endif
@@ -1375,7 +1438,7 @@ struct png_struct_def
#if defined(PNG_MNG_FEATURES_SUPPORTED) || \
defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
-/* changed from png_byte to png_uint_32 at version 1.2.0 */
+/* Changed from png_byte to png_uint_32 at version 1.2.0 */
#ifdef PNG_1_0_X
png_byte mng_features_permitted;
#else
@@ -1411,21 +1474,21 @@ struct png_struct_def
/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */
#ifdef PNG_USER_MEM_SUPPORTED
- png_voidp mem_ptr; /* user supplied struct for mem functions */
- png_malloc_ptr malloc_fn; /* function for allocating memory */
- png_free_ptr free_fn; /* function for freeing memory */
+ png_voidp mem_ptr; /* user supplied struct for mem functions */
+ png_malloc_ptr malloc_fn; /* function for allocating memory */
+ png_free_ptr free_fn; /* function for freeing memory */
#endif
/* New member added in libpng-1.0.13 and 1.2.0 */
- png_bytep big_row_buf; /* buffer to save current (unfiltered) row */
+ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */
#if defined(PNG_READ_DITHER_SUPPORTED)
/* The following three members were added at version 1.0.14 and 1.2.4 */
- png_bytep dither_sort; /* working sort array */
- png_bytep index_to_palette; /* where the original index currently is */
- /* in the palette */
- png_bytep palette_to_index; /* which original index points to this */
- /* palette color */
+ png_bytep dither_sort; /* working sort array */
+ png_bytep index_to_palette; /* where the original index currently is */
+ /* in the palette */
+ png_bytep palette_to_index; /* which original index points to this */
+ /* palette color */
#endif
/* New members added in libpng-1.0.16 and 1.2.6 */
@@ -1438,19 +1501,23 @@ struct png_struct_def
/* New member added in libpng-1.0.25 and 1.2.17 */
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* storage for unknown chunk that the library doesn't recognize. */
+ /* Storage for unknown chunk that the library doesn't recognize. */
png_unknown_chunk unknown_chunk;
#endif
/* New members added in libpng-1.2.26 */
png_uint_32 old_big_row_buf_size, old_prev_row_size;
+
+/* New member added in libpng-1.2.30 */
+ png_charp chunkdata; /* buffer for reading chunk data */
+
};
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef png_structp version_1_2_29;
+typedef png_structp version_1_2_40;
typedef png_struct FAR * FAR * png_structpp;
@@ -1554,7 +1621,7 @@ extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr,
png_infop info_ptr));
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
-/* read the information before the actual image data. */
+/* Read the information before the actual image data. */
extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr,
png_infop info_ptr));
#endif
@@ -1567,11 +1634,11 @@ extern PNG_EXPORT(png_charp,png_convert_to_rfc1123)
#if !defined(_WIN32_WCE)
/* "time.h" functions are not supported on WindowsCE */
#if defined(PNG_WRITE_tIME_SUPPORTED)
-/* convert from a struct tm to png_time */
+/* Convert from a struct tm to png_time */
extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime,
struct tm FAR * ttime));
-/* convert from time_t to png_time. Uses gmtime() */
+/* Convert from time_t to png_time. Uses gmtime() */
extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime,
time_t ttime));
#endif /* PNG_WRITE_tIME_SUPPORTED */
@@ -1691,7 +1758,7 @@ extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr,
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* strip the second byte of information from a 16-bit depth file. */
+/* Strip the second byte of information from a 16-bit depth file. */
extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr));
#endif
@@ -1727,74 +1794,74 @@ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows));
extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr));
#endif
-/* optional update palette with requested transformations */
+/* Optional update palette with requested transformations */
extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr));
-/* optional call to update the users info structure */
+/* Optional call to update the users info structure */
extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr,
png_infop info_ptr));
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
-/* read one or more rows of image data. */
+/* Read one or more rows of image data. */
extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr,
png_bytepp row, png_bytepp display_row, png_uint_32 num_rows));
#endif
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
-/* read a row of data. */
+/* Read a row of data. */
extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr,
png_bytep row,
png_bytep display_row));
#endif
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
-/* read the whole image into memory at once. */
+/* Read the whole image into memory at once. */
extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr,
png_bytepp image));
#endif
-/* write a row of image data */
+/* Write a row of image data */
extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr,
png_bytep row));
-/* write a few rows of image data */
+/* Write a few rows of image data */
extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr,
png_bytepp row, png_uint_32 num_rows));
-/* write the image data */
+/* Write the image data */
extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
png_bytepp image));
-/* writes the end of the PNG file. */
+/* Writes the end of the PNG file. */
extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
png_infop info_ptr));
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
-/* read the end of the PNG file. */
+/* Read the end of the PNG file. */
extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr,
png_infop info_ptr));
#endif
-/* free any memory associated with the png_info_struct */
+/* Free any memory associated with the png_info_struct */
extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr,
png_infopp info_ptr_ptr));
-/* free any memory associated with the png_struct and the png_info_structs */
+/* Free any memory associated with the png_struct and the png_info_structs */
extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp
png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));
-/* free all memory used by the read (old method - NOT DLL EXPORTED) */
+/* Free all memory used by the read (old method - NOT DLL EXPORTED) */
extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr,
png_infop end_info_ptr));
-/* free any memory associated with the png_struct and the png_info_structs */
+/* Free any memory associated with the png_struct and the png_info_structs */
extern PNG_EXPORT(void,png_destroy_write_struct)
PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr));
-/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
+/* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
extern void png_write_destroy PNGARG((png_structp png_ptr));
-/* set the libpng method of handling chunk CRC errors */
+/* Set the libpng method of handling chunk CRC errors */
extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
int crit_action, int ancil_action));
@@ -1822,7 +1889,7 @@ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
* header file (zlib.h) for an explination of the compression functions.
*/
-/* set the filtering method(s) used by libpng. Currently, the only valid
+/* Set the filtering method(s) used by libpng. Currently, the only valid
* value for "method" is 0.
*/
extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method,
@@ -1950,6 +2017,11 @@ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));
* If buffered output is not used, then output_flush_fn can be set to NULL.
* If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time
* output_flush_fn will be ignored (and thus can be NULL).
+ * It is probably a mistake to use NULL for output_flush_fn if
+ * write_data_fn is not also NULL unless you have built libpng with
+ * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's
+ * default flush function, which uses the standard *FILE structure, will
+ * be used.
*/
extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,
png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
@@ -2014,15 +2086,15 @@ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr,
png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
png_progressive_end_ptr end_fn));
-/* returns the user pointer associated with the push read functions */
+/* Returns the user pointer associated with the push read functions */
extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
PNGARG((png_structp png_ptr));
-/* function to be called when data becomes available */
+/* Function to be called when data becomes available */
extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_bytep buffer, png_size_t buffer_size));
-/* function that combines rows. Not very much different than the
+/* Function that combines rows. Not very much different than the
* png_combine_row() call. Is this even used?????
*/
extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr,
@@ -2040,7 +2112,7 @@ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr,
png_uint_32 size));
#endif
-/* frees a pointer allocated by png_malloc() */
+/* Frees a pointer allocated by png_malloc() */
extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr));
#if defined(PNG_1_0_X)
@@ -2057,11 +2129,12 @@ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 free_me, int num));
#ifdef PNG_FREE_ME_SUPPORTED
/* Reassign responsibility for freeing existing data, whether allocated
- * by libpng or by the application */
+ * by libpng or by the application
+ */
extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr,
png_infop info_ptr, int freer, png_uint_32 mask));
#endif
-/* assignments for png_data_freer */
+/* Assignments for png_data_freer */
#define PNG_DESTROY_WILL_FREE_DATA 1
#define PNG_SET_WILL_FREE_DATA 1
#define PNG_USER_WILL_FREE_DATA 2
@@ -2145,11 +2218,13 @@ png_infop info_ptr));
#if defined(PNG_INFO_IMAGE_SUPPORTED)
/* Returns row_pointers, which is an array of pointers to scanlines that was
-returned from png_read_png(). */
+ * returned from png_read_png().
+ */
extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr,
png_infop info_ptr));
/* Set row_pointers, which is an array of pointers to scanlines for use
-by png_write_png(). */
+ * by png_write_png().
+ */
extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_bytepp row_pointers));
#endif
@@ -2450,8 +2525,8 @@ extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
#endif
#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-/* provide a list of chunks and how they are to be handled, if the built-in
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+/* Provide a list of chunks and how they are to be handled, if the built-in
handling or default unknown chunk handling is not desired. Any chunks not
listed will be handled in the default manner. The IHDR and IEND chunks
must not be listed.
@@ -2462,6 +2537,10 @@ extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
*/
extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp
png_ptr, int keep, png_bytep chunk_list, int num_chunks));
+PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep
+ chunk_name));
+#endif
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns));
extern PNG_EXPORT(void, png_set_unknown_chunk_location)
@@ -2469,14 +2548,11 @@ extern PNG_EXPORT(void, png_set_unknown_chunk_location)
extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp
png_ptr, png_infop info_ptr, png_unknown_chunkpp entries));
#endif
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep
- chunk_name));
-#endif
/* Png_free_data() will turn off the "valid" flag for anything it frees.
- If you need to turn it off for a chunk that your application has freed,
- you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */
+ * If you need to turn it off for a chunk that your application has freed,
+ * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);
+ */
extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr,
png_infop info_ptr, int mask));
@@ -2502,34 +2578,90 @@ extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,
#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
#include <crtdbg.h>
#if (PNG_DEBUG > 1)
-#define png_debug(l,m) _RPT0(_CRT_WARN,m)
-#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1)
-#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
+#ifndef _DEBUG
+# define _DEBUG
+#endif
+#ifndef png_debug
+#define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE)
+#endif
+#ifndef png_debug1
+#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1)
+#endif
+#ifndef png_debug2
+#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2)
+#endif
#endif
#else /* PNG_DEBUG_FILE || !_MSC_VER */
#ifndef PNG_DEBUG_FILE
#define PNG_DEBUG_FILE stderr
#endif /* PNG_DEBUG_FILE */
+
#if (PNG_DEBUG > 1)
-#define png_debug(l,m) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
-}
-#define png_debug1(l,m,p1) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
-}
-#define png_debug2(l,m,p1,p2) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
-}
+/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on non-ISO
+ * compilers.
+ */
+# ifdef __STDC__
+# ifndef png_debug
+# define png_debug(l,m) \
+ { \
+ int num_tabs=l; \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
+ }
+# endif
+# ifndef png_debug1
+# define png_debug1(l,m,p1) \
+ { \
+ int num_tabs=l; \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
+ }
+# endif
+# ifndef png_debug2
+# define png_debug2(l,m,p1,p2) \
+ { \
+ int num_tabs=l; \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
+ }
+# endif
+# else /* __STDC __ */
+# ifndef png_debug
+# define png_debug(l,m) \
+ { \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format); \
+ }
+# endif
+# ifndef png_debug1
+# define png_debug1(l,m,p1) \
+ { \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format,p1); \
+ }
+# endif
+# ifndef png_debug2
+# define png_debug2(l,m,p1,p2) \
+ { \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format,p1,p2); \
+ }
+# endif
+# endif /* __STDC __ */
#endif /* (PNG_DEBUG > 1) */
+
#endif /* _MSC_VER */
#endif /* (PNG_DEBUG > 0) */
#endif /* PNG_DEBUG */
@@ -2624,17 +2756,17 @@ extern PNG_EXPORT(void,png_set_mmx_thresholds)
#if !defined(PNG_1_0_X)
/* png.c, pnggccrd.c, or pngvcrd.c */
extern PNG_EXPORT(int,png_mmx_support) PNGARG((void));
+#endif /* PNG_1_0_X */
#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
/* Strip the prepended error numbers ("#nnn ") from error and warning
- * messages before passing them to the error or warning handler. */
+ * messages before passing them to the error or warning handler.
+ */
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp
png_ptr, png_uint_32 strip_mode));
#endif
-#endif /* PNG_1_0_X */
-
/* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp
@@ -2645,7 +2777,10 @@ extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp
png_ptr));
#endif
-/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */
+
+/* Maintainer: Put new public prototypes here ^, in libpng.3, and in
+ * project defs
+ */
#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
/* With these routines we avoid an integer divide, which will be slower on
@@ -2674,7 +2809,7 @@ extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp
(png_uint_32)(alpha)) + (png_uint_32)32768L); \
(composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
-#else /* standard method using integer division */
+#else /* Standard method using integer division */
# define png_composite(composite, fg, alpha, bg) \
(composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
@@ -2757,7 +2892,7 @@ extern PNG_EXPORT(void,png_save_uint_16)
#define PNG_HAVE_PNG_SIGNATURE 0x1000
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
-/* flags for the transformations the PNG library does on the image data */
+/* Flags for the transformations the PNG library does on the image data */
#define PNG_BGR 0x0001
#define PNG_INTERLACE 0x0002
#define PNG_PACK 0x0004
@@ -2791,7 +2926,7 @@ extern PNG_EXPORT(void,png_save_uint_16)
/* 0x20000000L unused */
/* 0x40000000L unused */
-/* flags for png_create_struct */
+/* Flags for png_create_struct */
#define PNG_STRUCT_PNG 0x0001
#define PNG_STRUCT_INFO 0x0002
@@ -2801,7 +2936,7 @@ extern PNG_EXPORT(void,png_save_uint_16)
#define PNG_COST_SHIFT 3
#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))
-/* flags for the png_ptr->flags rather than declaring a byte for each one */
+/* Flags for the png_ptr->flags rather than declaring a byte for each one */
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001
#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002
#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004
@@ -2843,7 +2978,7 @@ extern PNG_EXPORT(void,png_save_uint_16)
#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \
PNG_FLAG_CRC_CRITICAL_MASK)
-/* save typing and make code easier to understand */
+/* Save typing and make code easier to understand */
#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
abs((int)((c1).green) - (int)((c2).green)) + \
@@ -2856,15 +2991,16 @@ extern PNG_EXPORT(void,png_save_uint_16)
(( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) )
/* PNG_OUT_OF_RANGE returns true if value is outside the range
- ideal-delta..ideal+delta. Each argument is evaluated twice.
- "ideal" and "delta" should be constants, normally simple
- integers, "value" a variable. Added to libpng-1.2.6 JB */
+ * ideal-delta..ideal+delta. Each argument is evaluated twice.
+ * "ideal" and "delta" should be constants, normally simple
+ * integers, "value" a variable. Added to libpng-1.2.6 JB
+ */
#define PNG_OUT_OF_RANGE(value, ideal, delta) \
( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) )
-/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
+/* Variables declared in png.c - only it needs to define PNG_NO_EXTERN */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
-/* place to hold the signature string for a PNG file. */
+/* Place to hold the signature string for a PNG file. */
#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8];
#else
@@ -2983,7 +3119,8 @@ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));
#endif
/* Next four functions are used internally as callbacks. PNGAPI is required
- * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */
+ * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3.
+ */
PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr,
png_bytep data, png_size_t length));
@@ -3026,8 +3163,8 @@ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
/* Decompress data in a chunk that uses compression */
#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
-PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr,
- int comp_type, png_charp chunkdata, png_size_t chunklength,
+PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr,
+ int comp_type, png_size_t chunklength,
png_size_t prefix_length, png_size_t *data_length));
#endif
@@ -3048,10 +3185,10 @@ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr,
PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
#endif
-/* simple function to write the signature */
+/* Simple function to write the signature */
PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr));
-/* write various chunks */
+/* Write various chunks */
/* Write the IHDR chunk, and update the png_struct with the necessary
* information.
@@ -3203,12 +3340,12 @@ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr));
#endif
-/* combine a row of data, dealing with alpha, etc. if requested */
+/* Combine a row of data, dealing with alpha, etc. if requested */
PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
int mask));
#if defined(PNG_READ_INTERLACING_SUPPORTED)
-/* expand an interlaced row */
+/* Expand an interlaced row */
/* OLD pre-1.0.9 interface:
PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
png_bytep row, int pass, png_uint_32 transformations));
@@ -3219,12 +3356,12 @@ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
-/* grab pixels out of a row for an interlaced pass */
+/* Grab pixels out of a row for an interlaced pass */
PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
png_bytep row, int pass));
#endif
-/* unfilter a row */
+/* Unfilter a row */
PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter));
@@ -3235,16 +3372,16 @@ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
/* Write out the filtered row. */
PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
png_bytep filtered_row));
-/* finish a row while reading, dealing with interlacing passes, etc. */
+/* Finish a row while reading, dealing with interlacing passes, etc. */
PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
-/* initialize the row buffers, etc. */
+/* Initialize the row buffers, etc. */
PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
-/* optional call to update the users info structure */
+/* Optional call to update the users info structure */
PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
png_infop info_ptr));
-/* these are the functions that do the transformations */
+/* These are the functions that do the transformations */
#if defined(PNG_READ_FILLER_SUPPORTED)
PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
png_bytep row, png_uint_32 filler, png_uint_32 flags));
@@ -3366,7 +3503,7 @@ PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
* then calls the appropriate callback for the chunk if it is valid.
*/
-/* decode the IHDR chunk */
+/* Decode the IHDR chunk */
PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
png_uint_32 length));
PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
@@ -3465,7 +3602,7 @@ PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
png_bytep chunk_name));
-/* handle the transformations for reading and writing */
+/* Handle the transformations for reading and writing */
PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
@@ -3556,6 +3693,26 @@ png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif /* PNG_pHYs_SUPPORTED */
#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
+/* Read the chunk header (length + type name) */
+PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr));
+
+/* Added at libpng version 1.2.34 */
+#if defined(PNG_cHRM_SUPPORTED)
+PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr,
+ png_fixed_point int_white_x, png_fixed_point int_white_y,
+ png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
+ int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
+ png_fixed_point int_blue_y));
+#endif
+
+#if defined(PNG_cHRM_SUPPORTED)
+#if !defined(PNG_NO_CHECK_cHRM)
+/* Added at libpng version 1.2.34 */
+PNG_EXTERN void png_64bit_product (long v1, long v2, unsigned long *hi_product,
+ unsigned long *lo_product);
+#endif
+#endif
+
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
#endif /* PNG_INTERNAL */
@@ -3565,5 +3722,5 @@ png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif
#endif /* PNG_VERSION_INFO_ONLY */
-/* do not put anything past this line */
+/* Do not put anything past this line */
#endif /* PNG_H */
diff --git a/src/3rdparty/libpng/pngconf.h b/src/3rdparty/libpng/pngconf.h
index 066be02..c1c1d92 100644
--- a/src/3rdparty/libpng/pngconf.h
+++ b/src/3rdparty/libpng/pngconf.h
@@ -1,11 +1,14 @@
/* pngconf.h - machine configurable file for libpng
*
- * libpng version 1.2.29 - May 8, 2008
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * libpng version 1.2.40 - September 10, 2009
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
/* Any machine specific code is near the front of this file, so if you
@@ -19,7 +22,7 @@
#define PNG_1_2_X
-/*
+/*
* PNG_USER_CONFIG has to be defined on the compiler command line. This
* includes the resource compiler for Windows DLL configurations.
*/
@@ -39,7 +42,7 @@
/*
* Added at libpng-1.2.8
- *
+ *
* If you create a private DLL you need to define in "pngusr.h" the followings:
* #define PNG_USER_PRIVATEBUILD <Describes by whom and why this version of
* the DLL was built>
@@ -50,8 +53,8 @@
* number and must match your private DLL name>
* e.g. // private DLL "libpng13gx.dll"
* #define PNG_USER_DLLFNAME_POSTFIX "gx"
- *
- * The following macros are also at your disposal if you want to complete the
+ *
+ * The following macros are also at your disposal if you want to complete the
* DLL VERSIONINFO structure.
* - PNG_USER_VERSIONINFO_COMMENTS
* - PNG_USER_VERSIONINFO_COMPANYNAME
@@ -147,9 +150,9 @@
* 'Cygwin' defines/defaults:
* PNG_BUILD_DLL -- (ignored) building the dll
* (no define) -- (ignored) building an application, linking to the dll
- * PNG_STATIC -- (ignored) building the static lib, or building an
+ * PNG_STATIC -- (ignored) building the static lib, or building an
* application that links to the static lib.
- * ALL_STATIC -- (ignored) building various static libs, or building an
+ * ALL_STATIC -- (ignored) building various static libs, or building an
* application that links to the static libs.
* Thus,
* a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and
@@ -162,12 +165,12 @@
* PNG_BUILD_DLL
* PNG_STATIC
* (nothing) == PNG_USE_DLL
- *
+ *
* CYGWIN (2002-01-20): The preceding is now obsolete. With the advent
- * of auto-import in binutils, we no longer need to worry about
+ * of auto-import in binutils, we no longer need to worry about
* __declspec(dllexport) / __declspec(dllimport) and friends. Therefore,
* we don't need to worry about PNG_STATIC or ALL_STATIC when it comes
- * to __declspec() stuff. However, we DO need to worry about
+ * to __declspec() stuff. However, we DO need to worry about
* PNG_BUILD_DLL and PNG_STATIC because those change some defaults
* such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed.
*/
@@ -211,8 +214,8 @@
# if !defined(PNG_DLL)
# define PNG_DLL
# endif
-# endif
-# endif
+# endif
+# endif
# endif
#endif
@@ -233,12 +236,11 @@
# include <windows.h>
/* Console I/O functions are not supported on WindowsCE */
# define PNG_NO_CONSOLE_IO
+ /* abort() may not be supported on some/all Windows CE platforms */
+# define PNG_ABORT() exit(-1)
# ifdef PNG_DEBUG
# undef PNG_DEBUG
# endif
-# ifndef PNG_ABORT
-# define PNG_ABORT() exit(3)
-# endif
#endif
#ifdef PNG_BUILD_DLL
@@ -315,21 +317,29 @@
#ifdef PNG_SETJMP_SUPPORTED
/* This is an attempt to force a single setjmp behaviour on Linux. If
* the X config stuff didn't define _BSD_SOURCE we wouldn't need this.
+ *
+ * You can bypass this test if you know that your application uses exactly
+ * the same setjmp.h that was included when libpng was built. Only define
+ * PNG_SKIP_SETJMP_CHECK while building your application, prior to the
+ * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK
+ * while building a separate libpng library for general use.
*/
-# ifdef __linux__
-# ifdef _BSD_SOURCE
-# define PNG_SAVE_BSD_SOURCE
-# undef _BSD_SOURCE
-# endif
-# ifdef _SETJMP_H
- /* If you encounter a compiler error here, see the explanation
- * near the end of INSTALL.
- */
- __pngconf.h__ already includes setjmp.h;
- __dont__ include it again.;
-# endif
-# endif /* __linux__ */
+# ifndef PNG_SKIP_SETJMP_CHECK
+# ifdef __linux__
+# ifdef _BSD_SOURCE
+# define PNG_SAVE_BSD_SOURCE
+# undef _BSD_SOURCE
+# endif
+# ifdef _SETJMP_H
+ /* If you encounter a compiler error here, see the explanation
+ * near the end of INSTALL.
+ */
+ __pngconf.h__ in libpng already includes setjmp.h;
+ __dont__ include it again.;
+# endif
+# endif /* __linux__ */
+# endif /* PNG_SKIP_SETJMP_CHECK */
/* include setjmp.h for error handling */
# include <setjmp.h>
@@ -480,7 +490,7 @@
* iTXt support was added. iTXt support was turned off by default through
* libpng-1.2.x, to support old apps that malloc the png_text structure
* instead of calling png_set_text() and letting libpng malloc it. It
- * was turned on by default in libpng-1.3.0.
+ * will be turned on by default in libpng-1.4.0.
*/
#if defined(PNG_1_0_X) || defined (PNG_1_2_X)
@@ -514,6 +524,7 @@
# define PNG_NO_FREE_ME
# define PNG_NO_READ_UNKNOWN_CHUNKS
# define PNG_NO_WRITE_UNKNOWN_CHUNKS
+# define PNG_NO_HANDLE_AS_UNKNOWN
# define PNG_NO_READ_USER_CHUNKS
# define PNG_NO_READ_iCCP
# define PNG_NO_WRITE_iCCP
@@ -543,7 +554,7 @@
# define PNG_FREE_ME_SUPPORTED
#endif
-#if defined(PNG_READ_SUPPORTED)
+#ifdef PNG_READ_SUPPORTED
#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \
!defined(PNG_NO_READ_TRANSFORMS)
@@ -631,7 +642,7 @@
#endif /* PNG_READ_SUPPORTED */
-#if defined(PNG_WRITE_SUPPORTED)
+#ifdef PNG_WRITE_SUPPORTED
# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \
!defined(PNG_NO_WRITE_TRANSFORMS)
@@ -734,7 +745,7 @@
# define PNG_EASY_ACCESS_SUPPORTED
#endif
-/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0
+/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0
* and removed from version 1.2.20. The following will be removed
* from libpng-1.4.0
*/
@@ -801,6 +812,11 @@
# define PNG_USER_HEIGHT_MAX 1000000L
#endif
+/* Added at libpng-1.2.34 and 1.4.0 */
+#ifndef PNG_STRING_NEWLINE
+#define PNG_STRING_NEWLINE "\n"
+#endif
+
/* These are currently experimental features, define them if you want */
/* very little testing */
@@ -928,14 +944,22 @@
# define PNG_READ_zTXt_SUPPORTED
# define PNG_zTXt_SUPPORTED
#endif
+#ifndef PNG_NO_READ_OPT_PLTE
+# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */
+#endif /* optional PLTE chunk in RGB and RGBA images */
+#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \
+ defined(PNG_READ_zTXt_SUPPORTED)
+# define PNG_READ_TEXT_SUPPORTED
+# define PNG_TEXT_SUPPORTED
+#endif
+
+#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
+
#ifndef PNG_NO_READ_UNKNOWN_CHUNKS
# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
# define PNG_UNKNOWN_CHUNKS_SUPPORTED
# endif
-# ifndef PNG_NO_HANDLE_AS_UNKNOWN
-# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# endif
#endif
#if !defined(PNG_NO_READ_USER_CHUNKS) && \
defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
@@ -948,17 +972,14 @@
# undef PNG_NO_HANDLE_AS_UNKNOWN
# endif
#endif
-#ifndef PNG_NO_READ_OPT_PLTE
-# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */
-#endif /* optional PLTE chunk in RGB and RGBA images */
-#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \
- defined(PNG_READ_zTXt_SUPPORTED)
-# define PNG_READ_TEXT_SUPPORTED
-# define PNG_TEXT_SUPPORTED
-#endif
-#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
+#ifndef PNG_NO_HANDLE_AS_UNKNOWN
+# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+# endif
+#endif
+#ifdef PNG_WRITE_SUPPORTED
#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
#ifdef PNG_NO_WRITE_TEXT
@@ -1070,17 +1091,6 @@
# define PNG_zTXt_SUPPORTED
# endif
#endif
-#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
-# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
-# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-# define PNG_UNKNOWN_CHUNKS_SUPPORTED
-# endif
-# ifndef PNG_NO_HANDLE_AS_UNKNOWN
-# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# endif
-# endif
-#endif
#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \
defined(PNG_WRITE_zTXt_SUPPORTED)
# define PNG_WRITE_TEXT_SUPPORTED
@@ -1091,6 +1101,20 @@
#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */
+#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
+# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
+# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
+# define PNG_UNKNOWN_CHUNKS_SUPPORTED
+# endif
+#endif
+
+#ifndef PNG_NO_HANDLE_AS_UNKNOWN
+# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+# endif
+#endif
+#endif /* PNG_WRITE_SUPPORTED */
+
/* Turn this off to disable png_read_png() and
* png_write_png() and leave the row_pointers member
* out of the info structure.
@@ -1126,10 +1150,10 @@ typedef unsigned char png_byte;
change (I'm not sure if you will or not, so I thought I'd be safe) */
#ifdef PNG_SIZE_T
typedef PNG_SIZE_T png_size_t;
-# define png_sizeof(x) png_convert_size(sizeof (x))
+# define png_sizeof(x) png_convert_size(sizeof(x))
#else
typedef size_t png_size_t;
-# define png_sizeof(x) sizeof (x)
+# define png_sizeof(x) sizeof(x)
#endif
/* The following is needed for medium model support. It cannot be in the
@@ -1236,7 +1260,7 @@ typedef char FAR * FAR * FAR * png_charppp;
#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
/* SPC - Is this stuff deprecated? */
-/* It'll be removed as of libpng-1.3.0 - GR-P */
+/* It'll be removed as of libpng-1.4.0 - GR-P */
/* libpng typedefs for types in zlib. If zlib changes
* or another compression library is used, then change these.
* Eliminates need to change all the source files.
@@ -1309,7 +1333,7 @@ typedef z_stream FAR * png_zstreamp;
# define PNGAPI __cdecl
# undef PNG_IMPEXP
# define PNG_IMPEXP
-#endif
+#endif
/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall",
* you may get warnings regarding the linkage of png_zalloc and png_zfree.
diff --git a/src/3rdparty/libpng/pngerror.c b/src/3rdparty/libpng/pngerror.c
index b364fc0..d68416b 100644
--- a/src/3rdparty/libpng/pngerror.c
+++ b/src/3rdparty/libpng/pngerror.c
@@ -1,12 +1,15 @@
/* pngerror.c - stub functions for i/o and memory allocation
*
- * Last changed in libpng 1.2.22 [October 13, 2007]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2007 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file provides a location for all error handling. Users who
* need special error handling are expected to write replacement functions
* and use png_set_error_fn() to use those functions. See the instructions
@@ -15,8 +18,8 @@
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
+
static void /* PRIVATE */
png_default_error PNGARG((png_structp png_ptr,
png_const_charp error_message));
@@ -44,28 +47,29 @@ png_error(png_structp png_ptr, png_const_charp error_message)
{
if (*error_message == '#')
{
+ /* Strip "#nnnn " from beginning of error message. */
int offset;
- for (offset=1; offset<15; offset++)
- if (*(error_message+offset) == ' ')
+ for (offset = 1; offset<15; offset++)
+ if (error_message[offset] == ' ')
break;
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
{
int i;
- for (i=0; i<offset-1; i++)
- msg[i]=error_message[i+1];
- msg[i]='\0';
- error_message=msg;
+ for (i = 0; i < offset - 1; i++)
+ msg[i] = error_message[i + 1];
+ msg[i - 1] = '\0';
+ error_message = msg;
}
else
- error_message+=offset;
+ error_message += offset;
}
else
{
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
{
- msg[0]='0';
- msg[1]='\0';
- error_message=msg;
+ msg[0] = '0';
+ msg[1] = '\0';
+ error_message = msg;
}
}
}
@@ -110,16 +114,16 @@ png_warning(png_structp png_ptr, png_const_charp warning_message)
{
if (*warning_message == '#')
{
- for (offset=1; offset<15; offset++)
- if (*(warning_message+offset) == ' ')
+ for (offset = 1; offset < 15; offset++)
+ if (warning_message[offset] == ' ')
break;
}
}
- if (png_ptr != NULL && png_ptr->warning_fn != NULL)
- (*(png_ptr->warning_fn))(png_ptr, warning_message+offset);
}
+ if (png_ptr != NULL && png_ptr->warning_fn != NULL)
+ (*(png_ptr->warning_fn))(png_ptr, warning_message + offset);
else
- png_default_warning(png_ptr, warning_message+offset);
+ png_default_warning(png_ptr, warning_message + offset);
}
#endif /* PNG_NO_WARNINGS */
@@ -167,8 +171,8 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
{
buffer[iout++] = ':';
buffer[iout++] = ' ';
- png_memcpy(buffer+iout, error_message, PNG_MAX_ERROR_TEXT);
- buffer[iout+PNG_MAX_ERROR_TEXT-1] = '\0';
+ png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT);
+ buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0';
}
}
@@ -216,26 +220,35 @@ png_default_error(png_structp png_ptr, png_const_charp error_message)
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
if (*error_message == '#')
{
+ /* Strip "#nnnn " from beginning of error message. */
int offset;
char error_number[16];
- for (offset=0; offset<15; offset++)
+ for (offset = 0; offset<15; offset++)
{
- error_number[offset] = *(error_message+offset+1);
- if (*(error_message+offset) == ' ')
+ error_number[offset] = error_message[offset + 1];
+ if (error_message[offset] == ' ')
break;
}
- if((offset > 1) && (offset < 15))
+ if ((offset > 1) && (offset < 15))
{
- error_number[offset-1]='\0';
- fprintf(stderr, "libpng error no. %s: %s\n", error_number,
- error_message+offset);
+ error_number[offset - 1] = '\0';
+ fprintf(stderr, "libpng error no. %s: %s",
+ error_number, error_message + offset + 1);
+ fprintf(stderr, PNG_STRING_NEWLINE);
}
else
- fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset);
+ {
+ fprintf(stderr, "libpng error: %s, offset=%d",
+ error_message, offset);
+ fprintf(stderr, PNG_STRING_NEWLINE);
+ }
}
else
#endif
- fprintf(stderr, "libpng error: %s\n", error_message);
+ {
+ fprintf(stderr, "libpng error: %s", error_message);
+ fprintf(stderr, PNG_STRING_NEWLINE);
+ }
#endif
#ifdef PNG_SETJMP_SUPPORTED
@@ -255,7 +268,7 @@ png_default_error(png_structp png_ptr, png_const_charp error_message)
PNG_ABORT();
#endif
#ifdef PNG_NO_CONSOLE_IO
- error_message = error_message; /* make compiler happy */
+ error_message = error_message; /* Make compiler happy */
#endif
}
@@ -274,28 +287,36 @@ png_default_warning(png_structp png_ptr, png_const_charp warning_message)
{
int offset;
char warning_number[16];
- for (offset=0; offset<15; offset++)
+ for (offset = 0; offset < 15; offset++)
{
- warning_number[offset]=*(warning_message+offset+1);
- if (*(warning_message+offset) == ' ')
+ warning_number[offset] = warning_message[offset + 1];
+ if (warning_message[offset] == ' ')
break;
}
- if((offset > 1) && (offset < 15))
+ if ((offset > 1) && (offset < 15))
{
- warning_number[offset-1]='\0';
- fprintf(stderr, "libpng warning no. %s: %s\n", warning_number,
- warning_message+offset);
+ warning_number[offset + 1] = '\0';
+ fprintf(stderr, "libpng warning no. %s: %s",
+ warning_number, warning_message + offset);
+ fprintf(stderr, PNG_STRING_NEWLINE);
}
else
- fprintf(stderr, "libpng warning: %s\n", warning_message);
+ {
+ fprintf(stderr, "libpng warning: %s",
+ warning_message);
+ fprintf(stderr, PNG_STRING_NEWLINE);
+ }
}
else
# endif
- fprintf(stderr, "libpng warning: %s\n", warning_message);
+ {
+ fprintf(stderr, "libpng warning: %s", warning_message);
+ fprintf(stderr, PNG_STRING_NEWLINE);
+ }
#else
- warning_message = warning_message; /* make compiler happy */
+ warning_message = warning_message; /* Make compiler happy */
#endif
- png_ptr = png_ptr; /* make compiler happy */
+ png_ptr = png_ptr; /* Make compiler happy */
}
#endif /* PNG_NO_WARNINGS */
@@ -333,7 +354,7 @@ png_get_error_ptr(png_structp png_ptr)
void PNGAPI
png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
{
- if(png_ptr != NULL)
+ if (png_ptr != NULL)
{
png_ptr->flags &=
((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
diff --git a/src/3rdparty/libpng/pngget.c b/src/3rdparty/libpng/pngget.c
index a0e90bb..38e4f9e 100644
--- a/src/3rdparty/libpng/pngget.c
+++ b/src/3rdparty/libpng/pngget.c
@@ -1,16 +1,19 @@
/* pngget.c - retrieval of values from info struct
*
- * Last changed in libpng 1.2.15 January 5, 2007
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2007 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
*/
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
png_uint_32 PNGAPI
@@ -18,6 +21,7 @@ png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->valid & flag);
+
else
return(0);
}
@@ -27,6 +31,7 @@ png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->rowbytes);
+
else
return(0);
}
@@ -37,20 +42,20 @@ png_get_rows(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->row_pointers);
+
else
return(0);
}
#endif
#ifdef PNG_EASY_ACCESS_SUPPORTED
-/* easy access to info, added in libpng-0.99 */
+/* Easy access to info, added in libpng-0.99 */
png_uint_32 PNGAPI
png_get_image_width(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->width;
- }
+
return (0);
}
@@ -58,9 +63,8 @@ png_uint_32 PNGAPI
png_get_image_height(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->height;
- }
+
return (0);
}
@@ -68,9 +72,8 @@ png_byte PNGAPI
png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->bit_depth;
- }
+
return (0);
}
@@ -78,9 +81,8 @@ png_byte PNGAPI
png_get_color_type(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->color_type;
- }
+
return (0);
}
@@ -88,9 +90,8 @@ png_byte PNGAPI
png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->filter_type;
- }
+
return (0);
}
@@ -98,9 +99,8 @@ png_byte PNGAPI
png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->interlace_type;
- }
+
return (0);
}
@@ -108,9 +108,8 @@ png_byte PNGAPI
png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
- {
return info_ptr->compression_type;
- }
+
return (0);
}
@@ -121,10 +120,13 @@ png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
+ png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter");
+
+ if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
return (0);
- else return (info_ptr->x_pixels_per_unit);
+
+ else
+ return (info_ptr->x_pixels_per_unit);
}
#else
return (0);
@@ -139,10 +141,13 @@ png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
+ png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter");
+
+ if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
return (0);
- else return (info_ptr->y_pixels_per_unit);
+
+ else
+ return (info_ptr->y_pixels_per_unit);
}
#else
return (0);
@@ -157,11 +162,14 @@ png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
+ png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
+
+ if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
return (0);
- else return (info_ptr->x_pixels_per_unit);
+
+ else
+ return (info_ptr->x_pixels_per_unit);
}
#else
return (0);
@@ -175,9 +183,10 @@ png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_pHYs_SUPPORTED)
+
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
+ png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
if (info_ptr->x_pixels_per_unit == 0)
return ((float)0.0);
else
@@ -185,7 +194,7 @@ png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
/(float)info_ptr->x_pixels_per_unit));
}
#else
- return (0.0);
+ return (0.0);
#endif
return ((float)0.0);
}
@@ -196,15 +205,19 @@ png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_oFFs_SUPPORTED)
+
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
+ png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
+
+ if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
return (0);
- else return (info_ptr->x_offset);
+
+ else
+ return (info_ptr->x_offset);
}
#else
- return (0);
+ return (0);
#endif
return (0);
}
@@ -213,13 +226,17 @@ png_int_32 PNGAPI
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
+
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
+ png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
+
+ if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
return (0);
- else return (info_ptr->y_offset);
+
+ else
+ return (info_ptr->y_offset);
}
#else
return (0);
@@ -231,13 +248,17 @@ png_int_32 PNGAPI
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
+
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
+ png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
+
+ if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
return (0);
- else return (info_ptr->x_offset);
+
+ else
+ return (info_ptr->x_offset);
}
#else
return (0);
@@ -249,13 +270,17 @@ png_int_32 PNGAPI
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
+
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
+ png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
+
+ if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
return (0);
- else return (info_ptr->y_offset);
+
+ else
+ return (info_ptr->y_offset);
}
#else
return (0);
@@ -308,7 +333,7 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
{
- png_debug1(1, "in %s retrieval function\n", "pHYs");
+ png_debug1(1, "in %s retrieval function", "pHYs");
if (res_x != NULL)
{
*res_x = info_ptr->x_pixels_per_unit;
@@ -323,7 +348,7 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
{
*unit_type = (int)info_ptr->phys_unit_type;
retval |= PNG_INFO_pHYs;
- if(*unit_type == 1)
+ if (*unit_type == 1)
{
if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
@@ -365,7 +390,7 @@ png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
&& background != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "bKGD");
+ png_debug1(1, "in %s retrieval function", "bKGD");
*background = &(info_ptr->background);
return (PNG_INFO_bKGD);
}
@@ -382,7 +407,7 @@ png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
{
- png_debug1(1, "in %s retrieval function\n", "cHRM");
+ png_debug1(1, "in %s retrieval function", "cHRM");
if (white_x != NULL)
*white_x = (double)info_ptr->x_white;
if (white_y != NULL)
@@ -413,7 +438,7 @@ png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
{
- png_debug1(1, "in %s retrieval function\n", "cHRM");
+ png_debug1(1, "in %s retrieval function", "cHRM");
if (white_x != NULL)
*white_x = info_ptr->int_x_white;
if (white_y != NULL)
@@ -445,7 +470,7 @@ png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
&& file_gamma != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "gAMA");
+ png_debug1(1, "in %s retrieval function", "gAMA");
*file_gamma = (double)info_ptr->gamma;
return (PNG_INFO_gAMA);
}
@@ -460,7 +485,7 @@ png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
&& int_file_gamma != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "gAMA");
+ png_debug1(1, "in %s retrieval function", "gAMA");
*int_file_gamma = info_ptr->int_gamma;
return (PNG_INFO_gAMA);
}
@@ -476,7 +501,7 @@ png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
&& file_srgb_intent != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "sRGB");
+ png_debug1(1, "in %s retrieval function", "sRGB");
*file_srgb_intent = (int)info_ptr->srgb_intent;
return (PNG_INFO_sRGB);
}
@@ -493,11 +518,12 @@ png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
&& name != NULL && profile != NULL && proflen != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "iCCP");
+ png_debug1(1, "in %s retrieval function", "iCCP");
*name = info_ptr->iccp_name;
*profile = info_ptr->iccp_profile;
- /* compression_type is a dummy so the API won't have to change
- if we introduce multiple compression types later. */
+ /* Compression_type is a dummy so the API won't have to change
+ * if we introduce multiple compression types later.
+ */
*proflen = (int)info_ptr->iccp_proflen;
*compression_type = (int)info_ptr->iccp_compression;
return (PNG_INFO_iCCP);
@@ -527,7 +553,7 @@ png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
&& hist != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "hIST");
+ png_debug1(1, "in %s retrieval function", "hIST");
*hist = info_ptr->hist;
return (PNG_INFO_hIST);
}
@@ -545,27 +571,34 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
bit_depth != NULL && color_type != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "IHDR");
+ png_debug1(1, "in %s retrieval function", "IHDR");
*width = info_ptr->width;
*height = info_ptr->height;
*bit_depth = info_ptr->bit_depth;
if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16)
- png_error(png_ptr, "Invalid bit depth");
+ png_error(png_ptr, "Invalid bit depth");
+
*color_type = info_ptr->color_type;
+
if (info_ptr->color_type > 6)
- png_error(png_ptr, "Invalid color type");
+ png_error(png_ptr, "Invalid color type");
+
if (compression_type != NULL)
*compression_type = info_ptr->compression_type;
+
if (filter_type != NULL)
*filter_type = info_ptr->filter_type;
+
if (interlace_type != NULL)
*interlace_type = info_ptr->interlace_type;
- /* check for potential overflow of rowbytes */
+ /* Check for potential overflow of rowbytes */
if (*width == 0 || *width > PNG_UINT_31_MAX)
png_error(png_ptr, "Invalid image width");
+
if (*height == 0 || *height > PNG_UINT_31_MAX)
png_error(png_ptr, "Invalid image height");
+
if (info_ptr->width > (PNG_UINT_32_MAX
>> 3) /* 8-byte RGBA pixels */
- 64 /* bigrowbuf hack */
@@ -576,6 +609,7 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
png_warning(png_ptr,
"Width too large for libpng to process image data.");
}
+
return (1);
}
return (0);
@@ -589,7 +623,7 @@ png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "oFFs");
+ png_debug1(1, "in %s retrieval function", "oFFs");
*offset_x = info_ptr->x_offset;
*offset_y = info_ptr->y_offset;
*unit_type = (int)info_ptr->offset_unit_type;
@@ -606,10 +640,10 @@ png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
png_charp *units, png_charpp *params)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
- && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
- nparams != NULL && units != NULL && params != NULL)
+ && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
+ nparams != NULL && units != NULL && params != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "pCAL");
+ png_debug1(1, "in %s retrieval function", "pCAL");
*purpose = info_ptr->pcal_purpose;
*X0 = info_ptr->pcal_X0;
*X1 = info_ptr->pcal_X1;
@@ -630,7 +664,7 @@ png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
int *unit, double *width, double *height)
{
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
+ (info_ptr->valid & PNG_INFO_sCAL))
{
*unit = info_ptr->scal_unit;
*width = info_ptr->scal_pixel_width;
@@ -646,7 +680,7 @@ png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,
int *unit, png_charpp width, png_charpp height)
{
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
+ (info_ptr->valid & PNG_INFO_sCAL))
{
*unit = info_ptr->scal_unit;
*width = info_ptr->scal_s_width;
@@ -669,17 +703,20 @@ png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_pHYs))
{
- png_debug1(1, "in %s retrieval function\n", "pHYs");
+ png_debug1(1, "in %s retrieval function", "pHYs");
+
if (res_x != NULL)
{
*res_x = info_ptr->x_pixels_per_unit;
retval |= PNG_INFO_pHYs;
}
+
if (res_y != NULL)
{
*res_y = info_ptr->y_pixels_per_unit;
retval |= PNG_INFO_pHYs;
}
+
if (unit_type != NULL)
{
*unit_type = (int)info_ptr->phys_unit_type;
@@ -697,10 +734,10 @@ png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
&& palette != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "PLTE");
+ png_debug1(1, "in %s retrieval function", "PLTE");
*palette = info_ptr->palette;
*num_palette = info_ptr->num_palette;
- png_debug1(3, "num_palette = %d\n", *num_palette);
+ png_debug1(3, "num_palette = %d", *num_palette);
return (PNG_INFO_PLTE);
}
return (0);
@@ -713,7 +750,7 @@ png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
&& sig_bit != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "sBIT");
+ png_debug1(1, "in %s retrieval function", "sBIT");
*sig_bit = &(info_ptr->sig_bit);
return (PNG_INFO_sBIT);
}
@@ -728,13 +765,16 @@ png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
{
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
{
- png_debug1(1, "in %s retrieval function\n",
+ png_debug1(1, "in %s retrieval function",
(png_ptr->chunk_name[0] == '\0' ? "text"
: (png_const_charp)png_ptr->chunk_name));
+
if (text_ptr != NULL)
*text_ptr = info_ptr->text;
+
if (num_text != NULL)
*num_text = info_ptr->num_text;
+
return ((png_uint_32)info_ptr->num_text);
}
if (num_text != NULL)
@@ -750,7 +790,7 @@ png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
&& mod_time != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "tIME");
+ png_debug1(1, "in %s retrieval function", "tIME");
*mod_time = &(info_ptr->mod_time);
return (PNG_INFO_tIME);
}
@@ -766,7 +806,7 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
png_uint_32 retval = 0;
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
{
- png_debug1(1, "in %s retrieval function\n", "tRNS");
+ png_debug1(1, "in %s retrieval function", "tRNS");
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (trans != NULL)
@@ -774,6 +814,7 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
*trans = info_ptr->trans;
retval |= PNG_INFO_tRNS;
}
+
if (trans_values != NULL)
*trans_values = &(info_ptr->trans_values);
}
@@ -784,10 +825,11 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
*trans_values = &(info_ptr->trans_values);
retval |= PNG_INFO_tRNS;
}
- if(trans != NULL)
+
+ if (trans != NULL)
*trans = NULL;
}
- if(num_trans != NULL)
+ if (num_trans != NULL)
{
*num_trans = info_ptr->num_trans;
retval |= PNG_INFO_tRNS;
@@ -837,54 +879,54 @@ png_get_compression_buffer_size(png_structp png_ptr)
#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
#ifndef PNG_1_0_X
-/* this function was added to libpng 1.2.0 and should exist by default */
+/* This function was added to libpng 1.2.0 and should exist by default */
png_uint_32 PNGAPI
png_get_asm_flags (png_structp png_ptr)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
return (png_ptr? 0L: 0L);
}
-/* this function was added to libpng 1.2.0 and should exist by default */
+/* This function was added to libpng 1.2.0 and should exist by default */
png_uint_32 PNGAPI
png_get_asm_flagmask (int flag_select)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
flag_select=flag_select;
return 0L;
}
/* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */
-/* this function was added to libpng 1.2.0 */
+/* This function was added to libpng 1.2.0 */
png_uint_32 PNGAPI
png_get_mmx_flagmask (int flag_select, int *compilerID)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
flag_select=flag_select;
*compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */
return 0L;
}
-/* this function was added to libpng 1.2.0 */
+/* This function was added to libpng 1.2.0 */
png_byte PNGAPI
png_get_mmx_bitdepth_threshold (png_structp png_ptr)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
return (png_ptr? 0: 0);
}
-/* this function was added to libpng 1.2.0 */
+/* This function was added to libpng 1.2.0 */
png_uint_32 PNGAPI
png_get_mmx_rowbytes_threshold (png_structp png_ptr)
{
- /* obsolete, to be removed from libpng-1.4.0 */
+ /* Obsolete, to be removed from libpng-1.4.0 */
return (png_ptr? 0L: 0L);
}
#endif /* ?PNG_1_0_X */
#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
-/* these functions were added to libpng 1.2.6 */
+/* These functions were added to libpng 1.2.6 */
png_uint_32 PNGAPI
png_get_user_width_max (png_structp png_ptr)
{
@@ -896,6 +938,6 @@ png_get_user_height_max (png_structp png_ptr)
return (png_ptr? png_ptr->user_height_max : 0);
}
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
-
+
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngmem.c b/src/3rdparty/libpng/pngmem.c
index 13cc60c..e190cc3 100644
--- a/src/3rdparty/libpng/pngmem.c
+++ b/src/3rdparty/libpng/pngmem.c
@@ -1,12 +1,15 @@
/* pngmem.c - stub functions for memory allocation
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file provides a location for all memory allocation. Users who
* need special memory handling are expected to supply replacement
* functions for png_malloc() and png_free(), and to use
@@ -16,12 +19,11 @@
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
/* Borland DOS special memory handler */
#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
-/* if you change this, be sure to change the one in png.h also */
+/* If you change this, be sure to change the one in png.h also */
/* Allocate memory for a png_struct. The malloc and memset can be replaced
by a single call to calloc() if this is thought to improve performance. */
@@ -41,14 +43,14 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
png_voidp struct_ptr;
if (type == PNG_STRUCT_INFO)
- size = png_sizeof(png_info);
+ size = png_sizeof(png_info);
else if (type == PNG_STRUCT_PNG)
- size = png_sizeof(png_struct);
+ size = png_sizeof(png_struct);
else
- return (png_get_copyright(NULL));
+ return (png_get_copyright(NULL));
#ifdef PNG_USER_MEM_SUPPORTED
- if(malloc_fn != NULL)
+ if (malloc_fn != NULL)
{
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
@@ -57,7 +59,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
}
else
#endif /* PNG_USER_MEM_SUPPORTED */
- struct_ptr = (png_voidp)farmalloc(size);
+ struct_ptr = (png_voidp)farmalloc(size);
if (struct_ptr != NULL)
png_memset(struct_ptr, 0, size);
return (struct_ptr);
@@ -80,7 +82,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
if (struct_ptr != NULL)
{
#ifdef PNG_USER_MEM_SUPPORTED
- if(free_fn != NULL)
+ if (free_fn != NULL)
{
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
@@ -122,10 +124,10 @@ png_malloc(png_structp png_ptr, png_uint_32 size)
return (NULL);
#ifdef PNG_USER_MEM_SUPPORTED
- if(png_ptr->malloc_fn != NULL)
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
+ if (png_ptr->malloc_fn != NULL)
+ ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
else
- ret = (png_malloc_default(png_ptr, size));
+ ret = (png_malloc_default(png_ptr, size));
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
png_error(png_ptr, "Out of memory!");
return (ret);
@@ -150,12 +152,12 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
#endif
if (size != (size_t)size)
- ret = NULL;
+ ret = NULL;
else if (size == (png_uint_32)65536L)
{
if (png_ptr->offset_table == NULL)
{
- /* try to see if we need to do any of this fancy stuff */
+ /* Try to see if we need to do any of this fancy stuff */
ret = farmalloc(size);
if (ret == NULL || ((png_size_t)ret & 0xffff))
{
@@ -171,7 +173,7 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
ret = NULL;
}
- if(png_ptr->zlib_window_bits > 14)
+ if (png_ptr->zlib_window_bits > 14)
num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
else
num_blocks = 1;
@@ -210,7 +212,7 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
png_ptr->offset_table = table;
png_ptr->offset_table_ptr = farmalloc(num_blocks *
- png_sizeof (png_bytep));
+ png_sizeof(png_bytep));
if (png_ptr->offset_table_ptr == NULL)
{
@@ -270,9 +272,10 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
return (ret);
}
-/* free a pointer allocated by png_malloc(). In the default
- configuration, png_ptr is not used, but is passed in case it
- is needed. If ptr is NULL, return without taking any action. */
+/* Free a pointer allocated by png_malloc(). In the default
+ * configuration, png_ptr is not used, but is passed in case it
+ * is needed. If ptr is NULL, return without taking any action.
+ */
void PNGAPI
png_free(png_structp png_ptr, png_voidp ptr)
{
@@ -285,7 +288,8 @@ png_free(png_structp png_ptr, png_voidp ptr)
(*(png_ptr->free_fn))(png_ptr, ptr);
return;
}
- else png_free_default(png_ptr, ptr);
+ else
+ png_free_default(png_ptr, ptr);
}
void PNGAPI
@@ -293,7 +297,8 @@ png_free_default(png_structp png_ptr, png_voidp ptr)
{
#endif /* PNG_USER_MEM_SUPPORTED */
- if(png_ptr == NULL || ptr == NULL) return;
+ if (png_ptr == NULL || ptr == NULL)
+ return;
if (png_ptr->offset_table != NULL)
{
@@ -353,7 +358,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
return (NULL);
#ifdef PNG_USER_MEM_SUPPORTED
- if(malloc_fn != NULL)
+ if (malloc_fn != NULL)
{
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
@@ -369,7 +374,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
struct_ptr = (png_voidp)farmalloc(size);
#else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
- struct_ptr = (png_voidp)halloc(size,1);
+ struct_ptr = (png_voidp)halloc(size, 1);
# else
struct_ptr = (png_voidp)malloc(size);
# endif
@@ -398,7 +403,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
if (struct_ptr != NULL)
{
#ifdef PNG_USER_MEM_SUPPORTED
- if(free_fn != NULL)
+ if (free_fn != NULL)
{
png_struct dummy_struct;
png_structp png_ptr = &dummy_struct;
@@ -420,10 +425,12 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
}
/* Allocate memory. For reasonable files, size should never exceed
- 64K. However, zlib may allocate more then 64K if you don't tell
- it not to. See zconf.h and png.h for more information. zlib does
- need to allocate exactly 64K, so whatever you call here must
- have the ability to do that. */
+ * 64K. However, zlib may allocate more then 64K if you don't tell
+ * it not to. See zconf.h and png.h for more information. zlib does
+ * need to allocate exactly 64K, so whatever you call here must
+ * have the ability to do that.
+ */
+
png_voidp PNGAPI
png_malloc(png_structp png_ptr, png_uint_32 size)
@@ -434,10 +441,10 @@ png_malloc(png_structp png_ptr, png_uint_32 size)
if (png_ptr == NULL || size == 0)
return (NULL);
- if(png_ptr->malloc_fn != NULL)
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
+ if (png_ptr->malloc_fn != NULL)
+ ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
else
- ret = (png_malloc_default(png_ptr, size));
+ ret = (png_malloc_default(png_ptr, size));
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
png_error(png_ptr, "Out of Memory!");
return (ret);
@@ -464,23 +471,23 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
}
#endif
- /* Check for overflow */
+ /* Check for overflow */
#if defined(__TURBOC__) && !defined(__FLAT__)
- if (size != (unsigned long)size)
- ret = NULL;
- else
- ret = farmalloc(size);
+ if (size != (unsigned long)size)
+ ret = NULL;
+ else
+ ret = farmalloc(size);
#else
# if defined(_MSC_VER) && defined(MAXSEG_64K)
- if (size != (unsigned long)size)
- ret = NULL;
- else
- ret = halloc(size, 1);
+ if (size != (unsigned long)size)
+ ret = NULL;
+ else
+ ret = halloc(size, 1);
# else
- if (size != (size_t)size)
- ret = NULL;
- else
- ret = malloc((size_t)size);
+ if (size != (size_t)size)
+ ret = NULL;
+ else
+ ret = malloc((size_t)size);
# endif
#endif
@@ -493,7 +500,8 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)
}
/* Free a pointer allocated by png_malloc(). If ptr is NULL, return
- without taking any action. */
+ * without taking any action.
+ */
void PNGAPI
png_free(png_structp png_ptr, png_voidp ptr)
{
@@ -506,7 +514,8 @@ png_free(png_structp png_ptr, png_voidp ptr)
(*(png_ptr->free_fn))(png_ptr, ptr);
return;
}
- else png_free_default(png_ptr, ptr);
+ else
+ png_free_default(png_ptr, ptr);
}
void PNGAPI
png_free_default(png_structp png_ptr, png_voidp ptr)
@@ -542,9 +551,10 @@ png_malloc_warn(png_structp png_ptr, png_uint_32 size)
{
png_voidp ptr;
png_uint_32 save_flags;
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
- save_flags=png_ptr->flags;
+ save_flags = png_ptr->flags;
png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
png_ptr->flags=save_flags;
@@ -560,7 +570,7 @@ png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,
size = (png_size_t)length;
if ((png_uint_32)size != length)
- png_error(png_ptr,"Overflow in png_memcpy_check.");
+ png_error(png_ptr, "Overflow in png_memcpy_check.");
return(png_memcpy (s1, s2, size));
}
@@ -573,7 +583,7 @@ png_memset_check (png_structp png_ptr, png_voidp s1, int value,
size = (png_size_t)length;
if ((png_uint_32)size != length)
- png_error(png_ptr,"Overflow in png_memset_check.");
+ png_error(png_ptr, "Overflow in png_memset_check.");
return (png_memset (s1, value, size));
@@ -587,10 +597,11 @@ void PNGAPI
png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
malloc_fn, png_free_ptr free_fn)
{
- if(png_ptr != NULL) {
- png_ptr->mem_ptr = mem_ptr;
- png_ptr->malloc_fn = malloc_fn;
- png_ptr->free_fn = free_fn;
+ if (png_ptr != NULL)
+ {
+ png_ptr->mem_ptr = mem_ptr;
+ png_ptr->malloc_fn = malloc_fn;
+ png_ptr->free_fn = free_fn;
}
}
@@ -601,7 +612,8 @@ png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
png_voidp PNGAPI
png_get_mem_ptr(png_structp png_ptr)
{
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
return ((png_voidp)png_ptr->mem_ptr);
}
#endif /* PNG_USER_MEM_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngpread.c b/src/3rdparty/libpng/pngpread.c
index aa7151c..7adb7b8 100644
--- a/src/3rdparty/libpng/pngpread.c
+++ b/src/3rdparty/libpng/pngpread.c
@@ -1,19 +1,21 @@
/* pngpread.c - read a png file in push mode
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.38 [July 16, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
#define PNG_INTERNAL
#include "png.h"
-
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-/* push model modes */
+/* Push model modes */
#define PNG_READ_SIG_MODE 0
#define PNG_READ_CHUNK_MODE 1
#define PNG_READ_IDAT_MODE 2
@@ -28,7 +30,9 @@ void PNGAPI
png_process_data(png_structp png_ptr, png_infop info_ptr,
png_bytep buffer, png_size_t buffer_size)
{
- if(png_ptr == NULL || info_ptr == NULL) return;
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
+
png_push_restore_buffer(png_ptr, buffer, buffer_size);
while (png_ptr->buffer_size)
@@ -43,7 +47,9 @@ png_process_data(png_structp png_ptr, png_infop info_ptr,
void /* PRIVATE */
png_process_some_data(png_structp png_ptr, png_infop info_ptr)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
+
switch (png_ptr->process_mode)
{
case PNG_READ_SIG_MODE:
@@ -51,22 +57,26 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
png_push_read_sig(png_ptr, info_ptr);
break;
}
+
case PNG_READ_CHUNK_MODE:
{
png_push_read_chunk(png_ptr, info_ptr);
break;
}
+
case PNG_READ_IDAT_MODE:
{
png_push_read_IDAT(png_ptr);
break;
}
+
#if defined(PNG_READ_tEXt_SUPPORTED)
case PNG_READ_tEXt_MODE:
{
png_push_read_tEXt(png_ptr, info_ptr);
break;
}
+
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
case PNG_READ_zTXt_MODE:
@@ -74,6 +84,7 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
png_push_read_zTXt(png_ptr, info_ptr);
break;
}
+
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
case PNG_READ_iTXt_MODE:
@@ -81,12 +92,14 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
png_push_read_iTXt(png_ptr, info_ptr);
break;
}
+
#endif
case PNG_SKIP_MODE:
{
png_push_crc_finish(png_ptr);
break;
}
+
default:
{
png_ptr->buffer_size = 0;
@@ -114,7 +127,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
num_to_check);
- png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check);
+ png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);
if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
{
@@ -210,27 +223,31 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
png_push_fill_buffer(png_ptr, chunk_length, 4);
- png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
+ png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
+ png_check_chunk_name(png_ptr, png_ptr->chunk_name);
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
}
if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- if(png_ptr->mode & PNG_AFTER_IDAT)
+ if (png_ptr->mode & PNG_AFTER_IDAT)
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
{
+ if (png_ptr->push_length != 13)
+ png_error(png_ptr, "Invalid IHDR length");
+
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
- if (png_ptr->push_length != 13)
- png_error(png_ptr, "Invalid IHDR length");
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
}
+
else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
@@ -238,11 +255,13 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
png_ptr->process_mode = PNG_READ_DONE_MODE;
png_push_have_end(png_ptr, info_ptr);
}
+
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
{
@@ -251,20 +270,26 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
png_ptr->mode |= PNG_HAVE_IDAT;
+
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
+
if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
png_ptr->mode |= PNG_HAVE_PLTE;
+
else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
+
else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
!(png_ptr->mode & PNG_HAVE_PLTE))
png_error(png_ptr, "Missing PLTE before IDAT");
}
}
+
#endif
else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
{
@@ -275,23 +300,26 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
}
+
else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
{
/* If we reach an IDAT chunk, this means we have read all of the
* header chunks, and we can start reading the image (or if this
* is called after the image has been read - we have an error).
*/
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
+
+ if (!(png_ptr->mode & PNG_HAVE_IHDR))
+ png_error(png_ptr, "Missing IHDR before IDAT");
+
+ else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+ !(png_ptr->mode & PNG_HAVE_PLTE))
+ png_error(png_ptr, "Missing PLTE before IDAT");
if (png_ptr->mode & PNG_HAVE_IDAT)
{
if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
- if (png_ptr->push_length == 0)
- return;
+ if (png_ptr->push_length == 0)
+ return;
if (png_ptr->mode & PNG_AFTER_IDAT)
png_error(png_ptr, "Too many IDAT's found");
@@ -305,6 +333,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_ptr->zstream.next_out = png_ptr->row_buf;
return;
}
+
#if defined(PNG_READ_gAMA_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
{
@@ -313,8 +342,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_sBIT_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
@@ -324,8 +355,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_cHRM_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
@@ -335,8 +368,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_sRGB_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
@@ -346,8 +381,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_iCCP_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
@@ -357,8 +394,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_sPLT_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
@@ -368,8 +407,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_tRNS_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
@@ -379,8 +420,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_bKGD_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
@@ -390,8 +433,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_hIST_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
@@ -401,8 +446,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_pHYs_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
@@ -412,8 +459,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_oFFs_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
@@ -423,9 +472,11 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
}
#endif
+
#if defined(PNG_READ_pCAL_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
{
@@ -434,8 +485,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_sCAL_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
@@ -445,8 +498,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_tIME_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
@@ -456,8 +511,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_tEXt_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
@@ -467,8 +524,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
@@ -478,8 +537,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
@@ -489,8 +550,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_push_save_buffer(png_ptr);
return;
}
+
png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
}
+
#endif
else
{
@@ -565,7 +628,9 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
{
png_bytep ptr;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
+
ptr = buffer;
if (png_ptr->save_buffer_size)
{
@@ -589,6 +654,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
if (length < png_ptr->current_buffer_size)
save_size = length;
+
else
save_size = png_ptr->current_buffer_size;
@@ -606,7 +672,7 @@ png_push_save_buffer(png_structp png_ptr)
{
if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
{
- png_size_t i,istop;
+ png_size_t i, istop;
png_bytep sp;
png_bytep dp;
@@ -629,6 +695,7 @@ png_push_save_buffer(png_structp png_ptr)
{
png_error(png_ptr, "Potential overflow of save_buffer");
}
+
new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
old_buffer = png_ptr->save_buffer;
png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr,
@@ -675,7 +742,7 @@ png_push_read_IDAT(png_structp png_ptr)
}
png_push_fill_buffer(png_ptr, chunk_length, 4);
- png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length);
+ png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
png_crc_read(png_ptr, png_ptr->chunk_name, 4);
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
@@ -697,16 +764,19 @@ png_push_read_IDAT(png_structp png_ptr)
if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
{
save_size = (png_size_t)png_ptr->idat_size;
- /* check for overflow */
- if((png_uint_32)save_size != png_ptr->idat_size)
+
+ /* Check for overflow */
+ if ((png_uint_32)save_size != png_ptr->idat_size)
png_error(png_ptr, "save_size overflowed in pngpread");
}
else
save_size = png_ptr->save_buffer_size;
png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
+
if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
+
png_ptr->idat_size -= save_size;
png_ptr->buffer_size -= save_size;
png_ptr->save_buffer_size -= save_size;
@@ -719,8 +789,9 @@ png_push_read_IDAT(png_structp png_ptr)
if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
{
save_size = (png_size_t)png_ptr->idat_size;
- /* check for overflow */
- if((png_uint_32)save_size != png_ptr->idat_size)
+
+ /* Check for overflow */
+ if ((png_uint_32)save_size != png_ptr->idat_size)
png_error(png_ptr, "save_size overflowed in pngpread");
}
else
@@ -760,7 +831,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
png_ptr->zstream.next_in = buffer;
png_ptr->zstream.avail_in = (uInt)buffer_length;
- for(;;)
+ for (;;)
{
ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
if (ret != Z_OK)
@@ -769,6 +840,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
{
if (png_ptr->zstream.avail_in)
png_error(png_ptr, "Extra compressed data");
+
if (!(png_ptr->zstream.avail_out))
{
png_push_process_row(png_ptr);
@@ -780,6 +852,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
}
else if (ret == Z_BUF_ERROR)
break;
+
else
png_error(png_ptr, "Decompression Error");
}
@@ -801,6 +874,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
png_ptr->zstream.next_out = png_ptr->row_buf;
}
+
else
break;
}
@@ -829,7 +903,7 @@ png_push_process_row(png_structp png_ptr)
png_do_read_transformations(png_ptr);
#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* blow up interlaced rows to full size */
+ /* Blow up interlaced rows to full size */
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
{
if (png_ptr->pass < 6)
@@ -847,9 +921,10 @@ png_push_process_row(png_structp png_ptr)
for (i = 0; i < 8 && png_ptr->pass == 0; i++)
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */
+ png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
}
- if (png_ptr->pass == 2) /* pass 1 might be empty */
+
+ if (png_ptr->pass == 2) /* Pass 1 might be empty */
{
for (i = 0; i < 4 && png_ptr->pass == 2; i++)
{
@@ -857,6 +932,7 @@ png_push_process_row(png_structp png_ptr)
png_read_push_finish_row(png_ptr);
}
}
+
if (png_ptr->pass == 4 && png_ptr->height <= 4)
{
for (i = 0; i < 2 && png_ptr->pass == 4; i++)
@@ -865,13 +941,16 @@ png_push_process_row(png_structp png_ptr)
png_read_push_finish_row(png_ptr);
}
}
+
if (png_ptr->pass == 6 && png_ptr->height <= 4)
{
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
+
break;
}
+
case 1:
{
int i;
@@ -880,7 +959,8 @@ png_push_process_row(png_structp png_ptr)
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
}
- if (png_ptr->pass == 2) /* skip top 4 generated rows */
+
+ if (png_ptr->pass == 2) /* Skip top 4 generated rows */
{
for (i = 0; i < 4 && png_ptr->pass == 2; i++)
{
@@ -888,22 +968,27 @@ png_push_process_row(png_structp png_ptr)
png_read_push_finish_row(png_ptr);
}
}
+
break;
}
+
case 2:
{
int i;
+
for (i = 0; i < 4 && png_ptr->pass == 2; i++)
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
}
+
for (i = 0; i < 4 && png_ptr->pass == 2; i++)
{
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
- if (png_ptr->pass == 4) /* pass 3 might be empty */
+
+ if (png_ptr->pass == 4) /* Pass 3 might be empty */
{
for (i = 0; i < 2 && png_ptr->pass == 4; i++)
{
@@ -911,17 +996,21 @@ png_push_process_row(png_structp png_ptr)
png_read_push_finish_row(png_ptr);
}
}
+
break;
}
+
case 3:
{
int i;
+
for (i = 0; i < 4 && png_ptr->pass == 3; i++)
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
}
- if (png_ptr->pass == 4) /* skip top two generated rows */
+
+ if (png_ptr->pass == 4) /* Skip top two generated rows */
{
for (i = 0; i < 2 && png_ptr->pass == 4; i++)
{
@@ -929,49 +1018,61 @@ png_push_process_row(png_structp png_ptr)
png_read_push_finish_row(png_ptr);
}
}
+
break;
}
+
case 4:
{
int i;
+
for (i = 0; i < 2 && png_ptr->pass == 4; i++)
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
}
+
for (i = 0; i < 2 && png_ptr->pass == 4; i++)
{
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
- if (png_ptr->pass == 6) /* pass 5 might be empty */
+
+ if (png_ptr->pass == 6) /* Pass 5 might be empty */
{
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
+
break;
}
+
case 5:
{
int i;
+
for (i = 0; i < 2 && png_ptr->pass == 5; i++)
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
}
- if (png_ptr->pass == 6) /* skip top generated row */
+
+ if (png_ptr->pass == 6) /* Skip top generated row */
{
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
+
break;
}
case 6:
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
+
if (png_ptr->pass != 6)
break;
+
png_push_have_row(png_ptr, png_bytep_NULL);
png_read_push_finish_row(png_ptr);
}
@@ -989,18 +1090,18 @@ void /* PRIVATE */
png_read_push_finish_row(png_structp png_ptr)
{
#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
- /* start of interlace block in the y direction */
+ /* Start of interlace block in the y direction */
PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
- /* offset to next interlace block in the y direction */
+ /* Offset to next interlace block in the y direction */
PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
/* Height of interlace block. This is not currently used - if you need
@@ -1013,6 +1114,7 @@ png_read_push_finish_row(png_structp png_ptr)
if (png_ptr->row_number < png_ptr->num_rows)
return;
+#if defined(PNG_READ_INTERLACING_SUPPORTED)
if (png_ptr->interlaced)
{
png_ptr->row_number = 0;
@@ -1020,40 +1122,37 @@ png_read_push_finish_row(png_structp png_ptr)
png_ptr->rowbytes + 1);
do
{
- int pass;
- pass = png_ptr->pass;
- pass++;
- if ((pass == 1 && png_ptr->width < 5) ||
- (pass == 3 && png_ptr->width < 3) ||
- (pass == 5 && png_ptr->width < 2))
- pass++;
-
- if (pass > 7)
- pass--;
- png_ptr->pass = (png_byte) pass;
- if (pass < 7)
- {
- png_ptr->iwidth = (png_ptr->width +
- png_pass_inc[pass] - 1 -
- png_pass_start[pass]) /
- png_pass_inc[pass];
-
- png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,
- png_ptr->iwidth) + 1;
-
- if (png_ptr->transformations & PNG_INTERLACE)
- break;
-
- png_ptr->num_rows = (png_ptr->height +
- png_pass_yinc[pass] - 1 -
- png_pass_ystart[pass]) /
- png_pass_yinc[pass];
- }
- else
- break;
+ png_ptr->pass++;
+ if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
+ (png_ptr->pass == 3 && png_ptr->width < 3) ||
+ (png_ptr->pass == 5 && png_ptr->width < 2))
+ png_ptr->pass++;
+
+ if (png_ptr->pass > 7)
+ png_ptr->pass--;
+
+ if (png_ptr->pass >= 7)
+ break;
+
+ png_ptr->iwidth = (png_ptr->width +
+ png_pass_inc[png_ptr->pass] - 1 -
+ png_pass_start[png_ptr->pass]) /
+ png_pass_inc[png_ptr->pass];
+
+ png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,
+ png_ptr->iwidth) + 1;
+
+ if (png_ptr->transformations & PNG_INTERLACE)
+ break;
+
+ png_ptr->num_rows = (png_ptr->height +
+ png_pass_yinc[png_ptr->pass] - 1 -
+ png_pass_ystart[png_ptr->pass]) /
+ png_pass_yinc[png_ptr->pass];
} while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
}
+#endif /* PNG_READ_INTERLACING_SUPPORTED */
}
#if defined(PNG_READ_tEXt_SUPPORTED)
@@ -1064,7 +1163,7 @@ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
{
png_error(png_ptr, "Out of place tEXt");
- info_ptr = info_ptr; /* to quiet some compiler warnings */
+ info_ptr = info_ptr; /* To quiet some compiler warnings */
}
#ifdef PNG_MAX_MALLOC_64K
@@ -1079,7 +1178,7 @@ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
#endif
png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
+ (png_uint_32)(length + 1));
png_ptr->current_text[length] = '\0';
png_ptr->current_text_ptr = png_ptr->current_text;
png_ptr->current_text_size = (png_size_t)length;
@@ -1096,8 +1195,10 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
if (png_ptr->buffer_size < png_ptr->current_text_left)
text_size = png_ptr->buffer_size;
+
else
text_size = png_ptr->current_text_left;
+
png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
png_ptr->current_text_left -= text_size;
png_ptr->current_text_ptr += text_size;
@@ -1125,7 +1226,7 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
key = png_ptr->current_text;
for (text = key; *text; text++)
- /* empty loop */ ;
+ /* Empty loop */ ;
if (text < key + png_ptr->current_text_size)
text++;
@@ -1160,7 +1261,7 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
{
png_error(png_ptr, "Out of place zTXt");
- info_ptr = info_ptr; /* to quiet some compiler warnings */
+ info_ptr = info_ptr; /* To quiet some compiler warnings */
}
#ifdef PNG_MAX_MALLOC_64K
@@ -1177,7 +1278,7 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
#endif
png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
+ (png_uint_32)(length + 1));
png_ptr->current_text[length] = '\0';
png_ptr->current_text_ptr = png_ptr->current_text;
png_ptr->current_text_size = (png_size_t)length;
@@ -1194,8 +1295,10 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
text_size = png_ptr->buffer_size;
+
else
text_size = png_ptr->current_text_left;
+
png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
png_ptr->current_text_left -= text_size;
png_ptr->current_text_ptr += text_size;
@@ -1219,7 +1322,7 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
key = png_ptr->current_text;
for (text = key; *text; text++)
- /* empty loop */ ;
+ /* Empty loop */ ;
/* zTXt can't have zero text */
if (text >= key + png_ptr->current_text_size)
@@ -1231,7 +1334,7 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
text++;
- if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */
+ if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */
{
png_ptr->current_text = NULL;
png_free(png_ptr, key);
@@ -1268,13 +1371,17 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
if (text == NULL)
{
text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
- + key_size + 1));
+ (png_uint_32)(png_ptr->zbuf_size
+ - png_ptr->zstream.avail_out + key_size + 1));
+
png_memcpy(text + key_size, png_ptr->zbuf,
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
+
png_memcpy(text, key, key_size);
+
text_size = key_size + png_ptr->zbuf_size -
png_ptr->zstream.avail_out;
+
*(text + text_size) = '\0';
}
else
@@ -1283,12 +1390,15 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
tmp = text;
text = (png_charp)png_malloc(png_ptr, text_size +
- (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
- + 1));
+ (png_uint_32)(png_ptr->zbuf_size
+ - png_ptr->zstream.avail_out + 1));
+
png_memcpy(text, tmp, text_size);
png_free(png_ptr, tmp);
+
png_memcpy(text + text_size, png_ptr->zbuf,
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
+
text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
*(text + text_size) = '\0';
}
@@ -1352,7 +1462,7 @@ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
{
png_error(png_ptr, "Out of place iTXt");
- info_ptr = info_ptr; /* to quiet some compiler warnings */
+ info_ptr = info_ptr; /* To quiet some compiler warnings */
}
#ifdef PNG_MAX_MALLOC_64K
@@ -1367,7 +1477,7 @@ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
#endif
png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
+ (png_uint_32)(length + 1));
png_ptr->current_text[length] = '\0';
png_ptr->current_text_ptr = png_ptr->current_text;
png_ptr->current_text_size = (png_size_t)length;
@@ -1385,8 +1495,10 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
if (png_ptr->buffer_size < png_ptr->current_text_left)
text_size = png_ptr->buffer_size;
+
else
text_size = png_ptr->current_text_left;
+
png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
png_ptr->current_text_left -= text_size;
png_ptr->current_text_ptr += text_size;
@@ -1417,23 +1529,25 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
key = png_ptr->current_text;
for (lang = key; *lang; lang++)
- /* empty loop */ ;
+ /* Empty loop */ ;
if (lang < key + png_ptr->current_text_size - 3)
lang++;
comp_flag = *lang++;
- lang++; /* skip comp_type, always zero */
+ lang++; /* Skip comp_type, always zero */
for (lang_key = lang; *lang_key; lang_key++)
- /* empty loop */ ;
- lang_key++; /* skip NUL separator */
+ /* Empty loop */ ;
+
+ lang_key++; /* Skip NUL separator */
text=lang_key;
+
if (lang_key < key + png_ptr->current_text_size - 1)
{
for (; *text; text++)
- /* empty loop */ ;
+ /* Empty loop */ ;
}
if (text < key + png_ptr->current_text_size)
@@ -1441,6 +1555,7 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
text_ptr = (png_textp)png_malloc(png_ptr,
(png_uint_32)png_sizeof(png_text));
+
text_ptr->compression = comp_flag + 2;
text_ptr->key = key;
text_ptr->lang = lang;
@@ -1468,22 +1583,21 @@ void /* PRIVATE */
png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
length)
{
- png_uint_32 skip=0;
- png_check_chunk_name(png_ptr, png_ptr->chunk_name);
+ png_uint_32 skip = 0;
if (!(png_ptr->chunk_name[0] & 0x20))
{
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- PNG_HANDLE_CHUNK_ALWAYS
+ if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+ PNG_HANDLE_CHUNK_ALWAYS
#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- && png_ptr->read_user_chunk_fn == NULL
+ && png_ptr->read_user_chunk_fn == NULL
#endif
- )
+ )
#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
+ png_chunk_error(png_ptr, "unknown critical chunk");
- info_ptr = info_ptr; /* to quiet some compiler warnings */
+ info_ptr = info_ptr; /* To quiet some compiler warnings */
}
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
@@ -1500,41 +1614,50 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
png_memcpy((png_charp)png_ptr->unknown_chunk.name,
(png_charp)png_ptr->chunk_name,
png_sizeof(png_ptr->unknown_chunk.name));
- png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1]='\0';
+ png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1]
+ = '\0';
png_ptr->unknown_chunk.size = (png_size_t)length;
+
if (length == 0)
png_ptr->unknown_chunk.data = NULL;
+
else
{
- png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length);
+ png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr,
+ (png_uint_32)length);
png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
}
+
#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- if(png_ptr->read_user_chunk_fn != NULL)
+ if (png_ptr->read_user_chunk_fn != NULL)
{
- /* callback to user unknown chunk handler */
+ /* Callback to user unknown chunk handler */
int ret;
ret = (*(png_ptr->read_user_chunk_fn))
(png_ptr, &png_ptr->unknown_chunk);
+
if (ret < 0)
png_chunk_error(png_ptr, "error in user chunk");
+
if (ret == 0)
{
if (!(png_ptr->chunk_name[0] & 0x20))
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+ if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
PNG_HANDLE_CHUNK_ALWAYS)
png_chunk_error(png_ptr, "unknown critical chunk");
png_set_unknown_chunks(png_ptr, info_ptr,
&png_ptr->unknown_chunk, 1);
}
}
+
else
#endif
png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
png_free(png_ptr, png_ptr->unknown_chunk.data);
png_ptr->unknown_chunk.data = NULL;
}
+
else
#endif
skip=length;
@@ -1571,7 +1694,9 @@ png_progressive_combine_row (png_structp png_ptr,
PNG_CONST int FARDATA png_pass_dsp_mask[7] =
{0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
#endif
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
+
if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
}
@@ -1581,7 +1706,9 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
png_progressive_end_ptr end_fn)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
+
png_ptr->info_fn = info_fn;
png_ptr->row_fn = row_fn;
png_ptr->end_fn = end_fn;
@@ -1592,7 +1719,9 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
png_voidp PNGAPI
png_get_progressive_ptr(png_structp png_ptr)
{
- if(png_ptr == NULL) return (NULL);
+ if (png_ptr == NULL)
+ return (NULL);
+
return png_ptr->io_ptr;
}
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngread.c b/src/3rdparty/libpng/pngread.c
index bd8bcd9..a4cbb3e 100644
--- a/src/3rdparty/libpng/pngread.c
+++ b/src/3rdparty/libpng/pngread.c
@@ -1,19 +1,21 @@
/* pngread.c - read a PNG file
*
- * Last changed in libpng 1.2.25 [February 18, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file contains routines that an application calls directly to
* read a PNG file or stream.
*/
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED)
/* Create a PNG structure for reading, and allocate any memory needed. */
@@ -35,6 +37,9 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
{
#endif /* PNG_USER_MEM_SUPPORTED */
+#ifdef PNG_SETJMP_SUPPORTED
+ volatile
+#endif
png_structp png_ptr;
#ifdef PNG_SETJMP_SUPPORTED
@@ -45,7 +50,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
int i;
- png_debug(1, "in png_create_read_struct\n");
+ png_debug(1, "in png_create_read_struct");
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
(png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
@@ -55,7 +60,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
if (png_ptr == NULL)
return (NULL);
- /* added at libpng-1.2.6 */
+ /* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
@@ -69,7 +74,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
#endif
{
png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf=NULL;
+ png_ptr->zbuf = NULL;
#ifdef PNG_USER_MEM_SUPPORTED
png_destroy_struct_2((png_voidp)png_ptr,
(png_free_ptr)free_fn, (png_voidp)mem_ptr);
@@ -79,7 +84,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
return (NULL);
}
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
#endif
#endif
@@ -89,18 +94,18 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
- if(user_png_ver)
+ if (user_png_ver)
{
- i=0;
+ i = 0;
do
{
- if(user_png_ver[i] != png_libpng_ver[i])
+ if (user_png_ver[i] != png_libpng_ver[i])
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
} while (png_libpng_ver[i++]);
}
else
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
-
+
if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
{
@@ -128,14 +133,14 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
png_warning(png_ptr, msg);
#endif
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
+ png_ptr->flags = 0;
#endif
png_error(png_ptr,
"Incompatible libpng version in application and library");
}
}
- /* initialize zbuf - compression buffer */
+ /* Initialize zbuf - compression buffer */
png_ptr->zbuf_size = PNG_ZBUF_SIZE;
png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
(png_uint_32)png_ptr->zbuf_size);
@@ -164,7 +169,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
#ifdef USE_FAR_KEYWORD
if (setjmp(jmpbuf))
PNG_ABORT();
- png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
#else
if (setjmp(png_ptr->jmpbuf))
PNG_ABORT();
@@ -190,13 +195,14 @@ png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
png_size_t png_struct_size, png_size_t png_info_size)
{
/* We only come here via pre-1.0.12-compiled applications */
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- if(png_sizeof(png_struct) > png_struct_size ||
+ if (png_sizeof(png_struct) > png_struct_size ||
png_sizeof(png_info) > png_info_size)
{
char msg[80];
- png_ptr->warning_fn=NULL;
+ png_ptr->warning_fn = NULL;
if (user_png_ver)
{
png_snprintf(msg, 80,
@@ -210,20 +216,20 @@ png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
png_warning(png_ptr, msg);
}
#endif
- if(png_sizeof(png_struct) > png_struct_size)
+ if (png_sizeof(png_struct) > png_struct_size)
{
- png_ptr->error_fn=NULL;
+ png_ptr->error_fn = NULL;
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
+ png_ptr->flags = 0;
#endif
png_error(png_ptr,
"The png struct allocated by the application for reading is too small.");
}
- if(png_sizeof(png_info) > png_info_size)
+ if (png_sizeof(png_info) > png_info_size)
{
- png_ptr->error_fn=NULL;
+ png_ptr->error_fn = NULL;
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
+ png_ptr->flags = 0;
#endif
png_error(png_ptr,
"The info struct allocated by application for reading is too small.");
@@ -240,20 +246,21 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
jmp_buf tmp_jmp; /* to save current jump buffer */
#endif
- int i=0;
+ int i = 0;
png_structp png_ptr=*ptr_ptr;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
do
{
- if(user_png_ver[i] != png_libpng_ver[i])
+ if (user_png_ver[i] != png_libpng_ver[i])
{
#ifdef PNG_LEGACY_SUPPORTED
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
#else
- png_ptr->warning_fn=NULL;
+ png_ptr->warning_fn = NULL;
png_warning(png_ptr,
"Application uses deprecated png_read_init() and should be recompiled.");
break;
@@ -261,35 +268,35 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
}
} while (png_libpng_ver[i++]);
- png_debug(1, "in png_read_init_3\n");
+ png_debug(1, "in png_read_init_3");
#ifdef PNG_SETJMP_SUPPORTED
- /* save jump buffer and error functions */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
+ /* Save jump buffer and error functions */
+ png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
- if(png_sizeof(png_struct) > png_struct_size)
- {
- png_destroy_struct(png_ptr);
- *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
- png_ptr = *ptr_ptr;
- }
+ if (png_sizeof(png_struct) > png_struct_size)
+ {
+ png_destroy_struct(png_ptr);
+ *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
+ png_ptr = *ptr_ptr;
+ }
- /* reset all variables to 0 */
- png_memset(png_ptr, 0, png_sizeof (png_struct));
+ /* Reset all variables to 0 */
+ png_memset(png_ptr, 0, png_sizeof(png_struct));
#ifdef PNG_SETJMP_SUPPORTED
- /* restore jump buffer */
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
+ /* Restore jump buffer */
+ png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
#endif
- /* added at libpng-1.2.6 */
+ /* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
#endif
- /* initialize zbuf - compression buffer */
+ /* Initialize zbuf - compression buffer */
png_ptr->zbuf_size = PNG_ZBUF_SIZE;
png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
(png_uint_32)png_ptr->zbuf_size);
@@ -324,8 +331,9 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
void PNGAPI
png_read_info(png_structp png_ptr, png_infop info_ptr)
{
- if(png_ptr == NULL || info_ptr == NULL) return;
- png_debug(1, "in png_read_info\n");
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
+ png_debug(1, "in png_read_info");
/* If we haven't checked all of the PNG signature bytes, do so now. */
if (png_ptr->sig_bytes < 8)
{
@@ -347,7 +355,7 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
}
- for(;;)
+ for (;;)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_CONST PNG_IHDR;
@@ -406,38 +414,29 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
PNG_CONST PNG_zTXt;
#endif
#endif /* PNG_USE_LOCAL_ARRAYS */
- png_byte chunk_length[4];
- png_uint_32 length;
-
- png_read_data(png_ptr, chunk_length, 4);
- length = png_get_uint_31(png_ptr,chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-
- png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name,
- length);
+ png_uint_32 length = png_read_chunk_header(png_ptr);
+ PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
/* This should be a binary subdivision search or a hash for
* matching the chunk name rather than a linear search.
*/
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- if(png_ptr->mode & PNG_AFTER_IDAT)
+ if (!png_memcmp(chunk_name, png_IDAT, 4))
+ if (png_ptr->mode & PNG_AFTER_IDAT)
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
+ if (!png_memcmp(chunk_name, png_IHDR, 4))
png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
+ else if (!png_memcmp(chunk_name, png_IEND, 4))
png_handle_IEND(png_ptr, info_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
+ else if (png_handle_as_unknown(png_ptr, chunk_name))
{
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (!png_memcmp(chunk_name, png_IDAT, 4))
png_ptr->mode |= PNG_HAVE_IDAT;
png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ if (!png_memcmp(chunk_name, png_PLTE, 4))
png_ptr->mode |= PNG_HAVE_PLTE;
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ else if (!png_memcmp(chunk_name, png_IDAT, 4))
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
@@ -448,9 +447,9 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
}
}
#endif
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ else if (!png_memcmp(chunk_name, png_PLTE, 4))
png_handle_PLTE(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ else if (!png_memcmp(chunk_name, png_IDAT, 4))
{
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before IDAT");
@@ -463,71 +462,71 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
break;
}
#if defined(PNG_READ_bKGD_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
+ else if (!png_memcmp(chunk_name, png_bKGD, 4))
png_handle_bKGD(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_cHRM_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
+ else if (!png_memcmp(chunk_name, png_cHRM, 4))
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_gAMA_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
+ else if (!png_memcmp(chunk_name, png_gAMA, 4))
png_handle_gAMA(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_hIST_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
+ else if (!png_memcmp(chunk_name, png_hIST, 4))
png_handle_hIST(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_oFFs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
+ else if (!png_memcmp(chunk_name, png_oFFs, 4))
png_handle_oFFs(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_pCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
+ else if (!png_memcmp(chunk_name, png_pCAL, 4))
png_handle_pCAL(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
+ else if (!png_memcmp(chunk_name, png_sCAL, 4))
png_handle_sCAL(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_pHYs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
+ else if (!png_memcmp(chunk_name, png_pHYs, 4))
png_handle_pHYs(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sBIT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
+ else if (!png_memcmp(chunk_name, png_sBIT, 4))
png_handle_sBIT(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sRGB_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
+ else if (!png_memcmp(chunk_name, png_sRGB, 4))
png_handle_sRGB(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_iCCP_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
+ else if (!png_memcmp(chunk_name, png_iCCP, 4))
png_handle_iCCP(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sPLT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
+ else if (!png_memcmp(chunk_name, png_sPLT, 4))
png_handle_sPLT(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tEXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
+ else if (!png_memcmp(chunk_name, png_tEXt, 4))
png_handle_tEXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tIME_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
+ else if (!png_memcmp(chunk_name, png_tIME, 4))
png_handle_tIME(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tRNS_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
+ else if (!png_memcmp(chunk_name, png_tRNS, 4))
png_handle_tRNS(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
+ else if (!png_memcmp(chunk_name, png_zTXt, 4))
png_handle_zTXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
+ else if (!png_memcmp(chunk_name, png_iTXt, 4))
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
else
@@ -536,12 +535,13 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
}
#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
-/* optional call to update the users info_ptr structure */
+/* Optional call to update the users info_ptr structure */
void PNGAPI
png_read_update_info(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_read_update_info\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_read_update_info");
+ if (png_ptr == NULL)
+ return;
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
else
@@ -559,8 +559,9 @@ png_read_update_info(png_structp png_ptr, png_infop info_ptr)
void PNGAPI
png_start_read_image(png_structp png_ptr)
{
- png_debug(1, "in png_start_read_image\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_start_read_image");
+ if (png_ptr == NULL)
+ return;
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
}
@@ -573,18 +574,19 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_CONST PNG_IDAT;
PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
- 0xff};
+ 0xff};
PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
#endif
int ret;
- if(png_ptr == NULL) return;
- png_debug2(1, "in png_read_row (row %lu, pass %d)\n",
+ if (png_ptr == NULL)
+ return;
+ png_debug2(1, "in png_read_row (row %lu, pass %d)",
png_ptr->row_number, png_ptr->pass);
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
- /* check for transforms that have been set but were defined out */
+ /* Check for transforms that have been set but were defined out */
#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
if (png_ptr->transformations & PNG_INVERT_MONO)
png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
@@ -616,7 +618,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
}
#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* if interlaced and we do not need a new row, combine row and return */
+ /* If interlaced and we do not need a new row, combine row and return */
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
{
switch (png_ptr->pass)
@@ -703,15 +705,9 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
{
while (!png_ptr->idat_size)
{
- png_byte chunk_length[4];
-
png_crc_finish(png_ptr, 0);
- png_read_data(png_ptr, chunk_length, 4);
- png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
+ png_ptr->idat_size = png_read_chunk_header(png_ptr);
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
png_error(png_ptr, "Not enough image data");
}
@@ -747,7 +743,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
png_ptr->row_info.width);
- if(png_ptr->row_buf[0])
+ if (png_ptr->row_buf[0])
png_read_filter_row(png_ptr, &(png_ptr->row_info),
png_ptr->row_buf + 1, png_ptr->prev_row + 1,
(int)(png_ptr->row_buf[0]));
@@ -756,7 +752,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
png_ptr->rowbytes + 1);
#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
@@ -769,15 +765,15 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
png_do_read_transformations(png_ptr);
#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* blow up interlaced rows to full size */
+ /* Blow up interlaced rows to full size */
if (png_ptr->interlaced &&
(png_ptr->transformations & PNG_INTERLACE))
{
if (png_ptr->pass < 6)
-/* old interface (pre-1.0.9):
- png_do_read_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
- */
+ /* Old interface (pre-1.0.9):
+ * png_do_read_interlace(&(png_ptr->row_info),
+ * png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
+ */
png_do_read_interlace(png_ptr);
if (dsp_row != NULL)
@@ -835,8 +831,9 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
png_bytepp rp;
png_bytepp dp;
- png_debug(1, "in png_read_rows\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_read_rows");
+ if (png_ptr == NULL)
+ return;
rp = row;
dp = display_row;
if (rp != NULL && dp != NULL)
@@ -847,14 +844,14 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
png_read_row(png_ptr, rptr, dptr);
}
- else if(rp != NULL)
+ else if (rp != NULL)
for (i = 0; i < num_rows; i++)
{
png_bytep rptr = *rp;
png_read_row(png_ptr, rptr, png_bytep_NULL);
rp++;
}
- else if(dp != NULL)
+ else if (dp != NULL)
for (i = 0; i < num_rows; i++)
{
png_bytep dptr = *dp;
@@ -880,12 +877,13 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
void PNGAPI
png_read_image(png_structp png_ptr, png_bytepp image)
{
- png_uint_32 i,image_height;
+ png_uint_32 i, image_height;
int pass, j;
png_bytepp rp;
- png_debug(1, "in png_read_image\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_read_image");
+ if (png_ptr == NULL)
+ return;
#ifdef PNG_READ_INTERLACING_SUPPORTED
pass = png_set_interlace_handling(png_ptr);
@@ -920,11 +918,9 @@ png_read_image(png_structp png_ptr, png_bytepp image)
void PNGAPI
png_read_end(png_structp png_ptr, png_infop info_ptr)
{
- png_byte chunk_length[4];
- png_uint_32 length;
-
- png_debug(1, "in png_read_end\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_read_end");
+ if (png_ptr == NULL)
+ return;
png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
do
@@ -986,33 +982,27 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
PNG_CONST PNG_zTXt;
#endif
#endif /* PNG_USE_LOCAL_ARRAYS */
+ png_uint_32 length = png_read_chunk_header(png_ptr);
+ PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
- png_read_data(png_ptr, chunk_length, 4);
- length = png_get_uint_31(png_ptr,chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-
- png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name);
-
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
+ if (!png_memcmp(chunk_name, png_IHDR, 4))
png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
+ else if (!png_memcmp(chunk_name, png_IEND, 4))
png_handle_IEND(png_ptr, info_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
+ else if (png_handle_as_unknown(png_ptr, chunk_name))
{
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ if (!png_memcmp(chunk_name, png_IDAT, 4))
{
if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
png_error(png_ptr, "Too many IDAT's found");
}
png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ if (!png_memcmp(chunk_name, png_PLTE, 4))
png_ptr->mode |= PNG_HAVE_PLTE;
}
#endif
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
+ else if (!png_memcmp(chunk_name, png_IDAT, 4))
{
/* Zero length IDATs are legal after the last IDAT has been
* read, but not after other chunks have been read.
@@ -1021,74 +1011,74 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
png_error(png_ptr, "Too many IDAT's found");
png_crc_finish(png_ptr, length);
}
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
+ else if (!png_memcmp(chunk_name, png_PLTE, 4))
png_handle_PLTE(png_ptr, info_ptr, length);
#if defined(PNG_READ_bKGD_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
+ else if (!png_memcmp(chunk_name, png_bKGD, 4))
png_handle_bKGD(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_cHRM_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
+ else if (!png_memcmp(chunk_name, png_cHRM, 4))
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_gAMA_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
+ else if (!png_memcmp(chunk_name, png_gAMA, 4))
png_handle_gAMA(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_hIST_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
+ else if (!png_memcmp(chunk_name, png_hIST, 4))
png_handle_hIST(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_oFFs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
+ else if (!png_memcmp(chunk_name, png_oFFs, 4))
png_handle_oFFs(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_pCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
+ else if (!png_memcmp(chunk_name, png_pCAL, 4))
png_handle_pCAL(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
+ else if (!png_memcmp(chunk_name, png_sCAL, 4))
png_handle_sCAL(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_pHYs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
+ else if (!png_memcmp(chunk_name, png_pHYs, 4))
png_handle_pHYs(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sBIT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
+ else if (!png_memcmp(chunk_name, png_sBIT, 4))
png_handle_sBIT(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sRGB_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
+ else if (!png_memcmp(chunk_name, png_sRGB, 4))
png_handle_sRGB(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_iCCP_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
+ else if (!png_memcmp(chunk_name, png_iCCP, 4))
png_handle_iCCP(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_sPLT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
+ else if (!png_memcmp(chunk_name, png_sPLT, 4))
png_handle_sPLT(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tEXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
+ else if (!png_memcmp(chunk_name, png_tEXt, 4))
png_handle_tEXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tIME_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
+ else if (!png_memcmp(chunk_name, png_tIME, 4))
png_handle_tIME(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_tRNS_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
+ else if (!png_memcmp(chunk_name, png_tRNS, 4))
png_handle_tRNS(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
+ else if (!png_memcmp(chunk_name, png_zTXt, 4))
png_handle_zTXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
+ else if (!png_memcmp(chunk_name, png_iTXt, 4))
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
else
@@ -1097,7 +1087,7 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
}
#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
-/* free all memory used by the read */
+/* Free all memory used by the read */
void PNGAPI
png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
png_infopp end_info_ptr_ptr)
@@ -1109,11 +1099,9 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
png_voidp mem_ptr = NULL;
#endif
- png_debug(1, "in png_destroy_read_struct\n");
+ png_debug(1, "in png_destroy_read_struct");
if (png_ptr_ptr != NULL)
- {
png_ptr = *png_ptr_ptr;
- }
if (png_ptr == NULL)
return;
@@ -1159,16 +1147,19 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
*end_info_ptr_ptr = NULL;
}
+ if (png_ptr != NULL)
+ {
#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
+ png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
+ (png_voidp)mem_ptr);
#else
- png_destroy_struct((png_voidp)png_ptr);
+ png_destroy_struct((png_voidp)png_ptr);
#endif
- *png_ptr_ptr = NULL;
+ *png_ptr_ptr = NULL;
+ }
}
-/* free all memory used by the read (old method) */
+/* Free all memory used by the read (old method) */
void /* PRIVATE */
png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)
{
@@ -1182,7 +1173,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
png_free_ptr free_fn;
#endif
- png_debug(1, "in png_read_destroy\n");
+ png_debug(1, "in png_read_destroy");
if (info_ptr != NULL)
png_info_destroy(png_ptr, info_ptr);
@@ -1192,6 +1183,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->big_row_buf);
png_free(png_ptr, png_ptr->prev_row);
+ png_free(png_ptr, png_ptr->chunkdata);
#if defined(PNG_READ_DITHER_SUPPORTED)
png_free(png_ptr, png_ptr->palette_lookup);
png_free(png_ptr, png_ptr->dither_index);
@@ -1288,7 +1280,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
* being used again.
*/
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
+ png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
error_fn = png_ptr->error_fn;
@@ -1298,7 +1290,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
free_fn = png_ptr->free_fn;
#endif
- png_memset(png_ptr, 0, png_sizeof (png_struct));
+ png_memset(png_ptr, 0, png_sizeof(png_struct));
png_ptr->error_fn = error_fn;
png_ptr->warning_fn = warning_fn;
@@ -1308,7 +1300,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
#endif
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
#endif
}
@@ -1316,7 +1308,8 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr
void PNGAPI
png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
png_ptr->read_row_fn = read_row_fn;
}
@@ -1330,9 +1323,10 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
{
int row;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel from opacity to transparency
+ /* Invert the alpha channel from opacity to transparency
*/
if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
png_set_invert_alpha(png_ptr);
@@ -1343,15 +1337,15 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
*/
png_read_info(png_ptr, info_ptr);
if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
- png_error(png_ptr,"Image is too high to process with png_read_png()");
+ png_error(png_ptr, "Image is too high to process with png_read_png()");
/* -------------- image transformations start here ------------------- */
#if defined(PNG_READ_16_TO_8_SUPPORTED)
- /* tell libpng to strip 16 bit/color files down to 8 bits per color
+ /* Tell libpng to strip 16 bit/color files down to 8 bits per color.
*/
if (transforms & PNG_TRANSFORM_STRIP_16)
- png_set_strip_16(png_ptr);
+ png_set_strip_16(png_ptr);
#endif
#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
@@ -1359,7 +1353,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
* the background (not recommended).
*/
if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
- png_set_strip_alpha(png_ptr);
+ png_set_strip_alpha(png_ptr);
#endif
#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
@@ -1367,7 +1361,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
* byte into separate bytes (useful for paletted and grayscale images).
*/
if (transforms & PNG_TRANSFORM_PACKING)
- png_set_packing(png_ptr);
+ png_set_packing(png_ptr);
#endif
#if defined(PNG_READ_PACKSWAP_SUPPORTED)
@@ -1375,7 +1369,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
* (not useful if you are using png_set_packing).
*/
if (transforms & PNG_TRANSFORM_PACKSWAP)
- png_set_packswap(png_ptr);
+ png_set_packswap(png_ptr);
#endif
#if defined(PNG_READ_EXPAND_SUPPORTED)
@@ -1385,9 +1379,9 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
* channels so the data will be available as RGBA quartets.
*/
if (transforms & PNG_TRANSFORM_EXPAND)
- if ((png_ptr->bit_depth < 8) ||
- (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
- (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
+ if ((png_ptr->bit_depth < 8) ||
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
+ (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
png_set_expand(png_ptr);
#endif
@@ -1395,10 +1389,10 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
*/
#if defined(PNG_READ_INVERT_SUPPORTED)
- /* invert monochrome files to have 0 as white and 1 as black
+ /* Invert monochrome files to have 0 as white and 1 as black
*/
if (transforms & PNG_TRANSFORM_INVERT_MONO)
- png_set_invert_mono(png_ptr);
+ png_set_invert_mono(png_ptr);
#endif
#if defined(PNG_READ_SHIFT_SUPPORTED)
@@ -1417,24 +1411,24 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
#endif
#if defined(PNG_READ_BGR_SUPPORTED)
- /* flip the RGB pixels to BGR (or RGBA to BGRA)
+ /* Flip the RGB pixels to BGR (or RGBA to BGRA)
*/
if (transforms & PNG_TRANSFORM_BGR)
- png_set_bgr(png_ptr);
+ png_set_bgr(png_ptr);
#endif
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
- /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
+ /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)
*/
if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
png_set_swap_alpha(png_ptr);
#endif
#if defined(PNG_READ_SWAP_SUPPORTED)
- /* swap bytes of 16 bit files to least significant byte first
+ /* Swap bytes of 16 bit files to least significant byte first
*/
if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
- png_set_swap(png_ptr);
+ png_set_swap(png_ptr);
#endif
/* We don't handle adding filler bytes */
@@ -1450,27 +1444,27 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_FREE_ME_SUPPORTED
png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
#endif
- if(info_ptr->row_pointers == NULL)
+ if (info_ptr->row_pointers == NULL)
{
info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
info_ptr->height * png_sizeof(png_bytep));
+ png_memset(info_ptr->row_pointers, 0, info_ptr->height
+ * png_sizeof(png_bytep));
#ifdef PNG_FREE_ME_SUPPORTED
info_ptr->free_me |= PNG_FREE_ROWS;
#endif
for (row = 0; row < (int)info_ptr->height; row++)
- {
info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
png_get_rowbytes(png_ptr, info_ptr));
- }
}
png_read_image(png_ptr, info_ptr->row_pointers);
info_ptr->valid |= PNG_INFO_IDAT;
- /* read rest of file, and get additional chunks in info_ptr - REQUIRED */
+ /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
png_read_end(png_ptr, info_ptr);
- transforms = transforms; /* quiet compiler warnings */
+ transforms = transforms; /* Quiet compiler warnings */
params = params;
}
diff --git a/src/3rdparty/libpng/pngrio.c b/src/3rdparty/libpng/pngrio.c
index 7d2522f..2267bca 100644
--- a/src/3rdparty/libpng/pngrio.c
+++ b/src/3rdparty/libpng/pngrio.c
@@ -1,12 +1,15 @@
/* pngrio.c - functions for data input
*
- * Last changed in libpng 1.2.13 November 13, 2006
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2006 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file provides a location for all input. Users who need
* special handling are expected to write a function that has the same
* arguments as this and performs a similar function, but that possibly
@@ -17,18 +20,18 @@
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED)
/* Read the data from whatever input you are using. The default routine
- reads from a file pointer. Note that this routine sometimes gets called
- with very small lengths, so you should implement some kind of simple
- buffering if you are using unbuffered reads. This should never be asked
- to read more then 64K on a 16 bit machine. */
+ * reads from a file pointer. Note that this routine sometimes gets called
+ * with very small lengths, so you should implement some kind of simple
+ * buffering if you are using unbuffered reads. This should never be asked
+ * to read more then 64K on a 16 bit machine.
+ */
void /* PRIVATE */
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
- png_debug1(4,"reading %d bytes\n", (int)length);
+ png_debug1(4, "reading %d bytes", (int)length);
if (png_ptr->read_data_fn != NULL)
(*(png_ptr->read_data_fn))(png_ptr, data, length);
else
@@ -37,16 +40,18 @@ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
#if !defined(PNG_NO_STDIO)
/* This is the function that does the actual reading of data. If you are
- not reading from a standard C stream, you should create a replacement
- read_data function and use it at run time with png_set_read_fn(), rather
- than changing the library. */
+ * not reading from a standard C stream, you should create a replacement
+ * read_data function and use it at run time with png_set_read_fn(), rather
+ * than changing the library.
+ */
#ifndef USE_FAR_KEYWORD
void PNGAPI
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
png_size_t check;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
/* fread() returns 0 on error, so it is OK to store this in a png_size_t
* instead of an int, which is what fread() actually returns.
*/
@@ -62,7 +67,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
png_error(png_ptr, "Read Error");
}
#else
-/* this is the model-independent version. Since the standard I/O library
+/* This is the model-independent version. Since the standard I/O library
can't handle far buffers in the medium and small models, we have to copy
the data.
*/
@@ -77,7 +82,8 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
png_byte *n_data;
png_FILE_p io_ptr;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
/* Check if data really is near. If so, use usual code. */
n_data = (png_byte *)CVT_PTR_NOCHECK(data);
io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
@@ -106,7 +112,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
err = fread(buf, (png_size_t)1, read, io_ptr);
#endif
png_memcpy(data, buf, read); /* copy far buffer to near buffer */
- if(err != read)
+ if (err != read)
break;
else
check += err;
@@ -122,23 +128,27 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
#endif
/* This function allows the application to supply a new input function
- for libpng if standard C streams aren't being used.
-
- This function takes as its arguments:
- png_ptr - pointer to a png input data structure
- io_ptr - pointer to user supplied structure containing info about
- the input functions. May be NULL.
- read_data_fn - pointer to a new input function that takes as its
- arguments a pointer to a png_struct, a pointer to
- a location where input data can be stored, and a 32-bit
- unsigned int that is the number of bytes to be read.
- To exit and output any fatal error messages the new write
- function should call png_error(png_ptr, "Error msg"). */
+ * for libpng if standard C streams aren't being used.
+ *
+ * This function takes as its arguments:
+ * png_ptr - pointer to a png input data structure
+ * io_ptr - pointer to user supplied structure containing info about
+ * the input functions. May be NULL.
+ * read_data_fn - pointer to a new input function that takes as its
+ * arguments a pointer to a png_struct, a pointer to
+ * a location where input data can be stored, and a 32-bit
+ * unsigned int that is the number of bytes to be read.
+ * To exit and output any fatal error messages the new write
+ * function should call png_error(png_ptr, "Error msg").
+ * May be NULL, in which case libpng's default function will
+ * be used.
+ */
void PNGAPI
png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
png_rw_ptr read_data_fn)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
png_ptr->io_ptr = io_ptr;
#if !defined(PNG_NO_STDIO)
diff --git a/src/3rdparty/libpng/pngrtran.c b/src/3rdparty/libpng/pngrtran.c
index 873b22c..d7e6b4a 100644
--- a/src/3rdparty/libpng/pngrtran.c
+++ b/src/3rdparty/libpng/pngrtran.c
@@ -1,12 +1,15 @@
/* pngrtran.c - transforms the data in a row for PNG readers
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.38 [July 16, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file contains functions optionally called by an application
* in order to tell libpng how to handle data when reading a PNG.
* Transformations that are used in both reading and writing are
@@ -15,32 +18,37 @@
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED)
/* Set the action on getting a CRC error for an ancillary or critical chunk. */
void PNGAPI
png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
{
- png_debug(1, "in png_set_crc_action\n");
+ png_debug(1, "in png_set_crc_action");
/* Tell libpng how we react to CRC errors in critical chunks */
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
switch (crit_action)
{
- case PNG_CRC_NO_CHANGE: /* leave setting as is */
+ case PNG_CRC_NO_CHANGE: /* Leave setting as is */
break;
- case PNG_CRC_WARN_USE: /* warn/use data */
+
+ case PNG_CRC_WARN_USE: /* Warn/use data */
png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;
break;
- case PNG_CRC_QUIET_USE: /* quiet/use data */
+
+ case PNG_CRC_QUIET_USE: /* Quiet/use data */
png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |
PNG_FLAG_CRC_CRITICAL_IGNORE;
break;
- case PNG_CRC_WARN_DISCARD: /* not a valid action for critical data */
- png_warning(png_ptr, "Can't discard critical data on CRC error.");
- case PNG_CRC_ERROR_QUIT: /* error/quit */
+
+ case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */
+ png_warning(png_ptr,
+ "Can't discard critical data on CRC error.");
+ case PNG_CRC_ERROR_QUIT: /* Error/quit */
+
case PNG_CRC_DEFAULT:
default:
png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
@@ -49,22 +57,27 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
switch (ancil_action)
{
- case PNG_CRC_NO_CHANGE: /* leave setting as is */
+ case PNG_CRC_NO_CHANGE: /* Leave setting as is */
break;
- case PNG_CRC_WARN_USE: /* warn/use data */
+
+ case PNG_CRC_WARN_USE: /* Warn/use data */
png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;
break;
- case PNG_CRC_QUIET_USE: /* quiet/use data */
+
+ case PNG_CRC_QUIET_USE: /* Quiet/use data */
png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |
PNG_FLAG_CRC_ANCILLARY_NOWARN;
break;
- case PNG_CRC_ERROR_QUIT: /* error/quit */
+
+ case PNG_CRC_ERROR_QUIT: /* Error/quit */
png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;
break;
- case PNG_CRC_WARN_DISCARD: /* warn/discard data */
+
+ case PNG_CRC_WARN_DISCARD: /* Warn/discard data */
+
case PNG_CRC_DEFAULT:
default:
png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
@@ -74,14 +87,15 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
defined(PNG_FLOATING_POINT_SUPPORTED)
-/* handle alpha and tRNS via a background color */
+/* Handle alpha and tRNS via a background color */
void PNGAPI
png_set_background(png_structp png_ptr,
png_color_16p background_color, int background_gamma_code,
int need_expand, double background_gamma)
{
- png_debug(1, "in png_set_background\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_background");
+ if (png_ptr == NULL)
+ return;
if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
{
png_warning(png_ptr, "Application must supply a known background gamma");
@@ -98,12 +112,13 @@ png_set_background(png_structp png_ptr,
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* strip 16 bit depth files to 8 bit depth */
+/* Strip 16 bit depth files to 8 bit depth */
void PNGAPI
png_set_strip_16(png_structp png_ptr)
{
- png_debug(1, "in png_set_strip_16\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_strip_16");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_16_TO_8;
}
#endif
@@ -112,8 +127,9 @@ png_set_strip_16(png_structp png_ptr)
void PNGAPI
png_set_strip_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_strip_alpha\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_strip_alpha");
+ if (png_ptr == NULL)
+ return;
png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;
}
#endif
@@ -142,8 +158,9 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
int num_palette, int maximum_colors, png_uint_16p histogram,
int full_dither)
{
- png_debug(1, "in png_set_dither\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_dither");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_DITHER;
if (!full_dither)
@@ -151,7 +168,7 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
int i;
png_ptr->dither_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof (png_byte)));
+ (png_uint_32)(num_palette * png_sizeof(png_byte)));
for (i = 0; i < num_palette; i++)
png_ptr->dither_index[i] = (png_byte)i;
}
@@ -161,27 +178,29 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
if (histogram != NULL)
{
/* This is easy enough, just throw out the least used colors.
- Perhaps not the best solution, but good enough. */
+ * Perhaps not the best solution, but good enough.
+ */
int i;
- /* initialize an array to sort colors */
+ /* Initialize an array to sort colors */
png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof (png_byte)));
+ (png_uint_32)(num_palette * png_sizeof(png_byte)));
- /* initialize the dither_sort array */
+ /* Initialize the dither_sort array */
for (i = 0; i < num_palette; i++)
png_ptr->dither_sort[i] = (png_byte)i;
/* Find the least used palette entries by starting a
- bubble sort, and running it until we have sorted
- out enough colors. Note that we don't care about
- sorting all the colors, just finding which are
- least used. */
+ * bubble sort, and running it until we have sorted
+ * out enough colors. Note that we don't care about
+ * sorting all the colors, just finding which are
+ * least used.
+ */
for (i = num_palette - 1; i >= maximum_colors; i--)
{
- int done; /* to stop early if the list is pre-sorted */
+ int done; /* To stop early if the list is pre-sorted */
int j;
done = 1;
@@ -202,13 +221,14 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
break;
}
- /* swap the palette around, and set up a table, if necessary */
+ /* Swap the palette around, and set up a table, if necessary */
if (full_dither)
{
int j = num_palette;
- /* put all the useful colors within the max, but don't
- move the others */
+ /* Put all the useful colors within the max, but don't
+ * move the others.
+ */
for (i = 0; i < maximum_colors; i++)
{
if ((int)png_ptr->dither_sort[i] >= maximum_colors)
@@ -224,11 +244,12 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
{
int j = num_palette;
- /* move all the used colors inside the max limit, and
- develop a translation table */
+ /* Move all the used colors inside the max limit, and
+ * develop a translation table.
+ */
for (i = 0; i < maximum_colors; i++)
{
- /* only move the colors we need to */
+ /* Only move the colors we need to */
if ((int)png_ptr->dither_sort[i] >= maximum_colors)
{
png_color tmp_color;
@@ -240,20 +261,20 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
tmp_color = palette[j];
palette[j] = palette[i];
palette[i] = tmp_color;
- /* indicate where the color went */
+ /* Indicate where the color went */
png_ptr->dither_index[j] = (png_byte)i;
png_ptr->dither_index[i] = (png_byte)j;
}
}
- /* find closest color for those colors we are not using */
+ /* Find closest color for those colors we are not using */
for (i = 0; i < num_palette; i++)
{
if ((int)png_ptr->dither_index[i] >= maximum_colors)
{
int min_d, k, min_k, d_index;
- /* find the closest color to one we threw out */
+ /* Find the closest color to one we threw out */
d_index = png_ptr->dither_index[i];
min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);
for (k = 1, min_k = 0; k < maximum_colors; k++)
@@ -268,39 +289,39 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
min_k = k;
}
}
- /* point to closest color */
+ /* Point to closest color */
png_ptr->dither_index[i] = (png_byte)min_k;
}
}
}
png_free(png_ptr, png_ptr->dither_sort);
- png_ptr->dither_sort=NULL;
+ png_ptr->dither_sort = NULL;
}
else
{
/* This is much harder to do simply (and quickly). Perhaps
- we need to go through a median cut routine, but those
- don't always behave themselves with only a few colors
- as input. So we will just find the closest two colors,
- and throw out one of them (chosen somewhat randomly).
- [We don't understand this at all, so if someone wants to
- work on improving it, be our guest - AED, GRP]
- */
+ * we need to go through a median cut routine, but those
+ * don't always behave themselves with only a few colors
+ * as input. So we will just find the closest two colors,
+ * and throw out one of them (chosen somewhat randomly).
+ * [We don't understand this at all, so if someone wants to
+ * work on improving it, be our guest - AED, GRP]
+ */
int i;
int max_d;
int num_new_palette;
png_dsortp t;
png_dsortpp hash;
- t=NULL;
+ t = NULL;
- /* initialize palette index arrays */
+ /* Initialize palette index arrays */
png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof (png_byte)));
+ (png_uint_32)(num_palette * png_sizeof(png_byte)));
png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof (png_byte)));
+ (png_uint_32)(num_palette * png_sizeof(png_byte)));
- /* initialize the sort array */
+ /* Initialize the sort array */
for (i = 0; i < num_palette; i++)
{
png_ptr->index_to_palette[i] = (png_byte)i;
@@ -308,21 +329,19 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
}
hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 *
- png_sizeof (png_dsortp)));
- for (i = 0; i < 769; i++)
- hash[i] = NULL;
-/* png_memset(hash, 0, 769 * png_sizeof (png_dsortp)); */
+ png_sizeof(png_dsortp)));
+ png_memset(hash, 0, 769 * png_sizeof(png_dsortp));
num_new_palette = num_palette;
- /* initial wild guess at how far apart the farthest pixel
- pair we will be eliminating will be. Larger
- numbers mean more areas will be allocated, Smaller
- numbers run the risk of not saving enough data, and
- having to do this all over again.
-
- I have not done extensive checking on this number.
- */
+ /* Initial wild guess at how far apart the farthest pixel
+ * pair we will be eliminating will be. Larger
+ * numbers mean more areas will be allocated, Smaller
+ * numbers run the risk of not saving enough data, and
+ * having to do this all over again.
+ *
+ * I have not done extensive checking on this number.
+ */
max_d = 96;
while (num_new_palette > maximum_colors)
@@ -436,8 +455,8 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
png_free(png_ptr, hash);
png_free(png_ptr, png_ptr->palette_to_index);
png_free(png_ptr, png_ptr->index_to_palette);
- png_ptr->palette_to_index=NULL;
- png_ptr->index_to_palette=NULL;
+ png_ptr->palette_to_index = NULL;
+ png_ptr->index_to_palette = NULL;
}
num_palette = maximum_colors;
}
@@ -457,12 +476,10 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
int num_green = (1 << PNG_DITHER_GREEN_BITS);
int num_blue = (1 << PNG_DITHER_BLUE_BITS);
png_size_t num_entries = ((png_size_t)1 << total_bits);
-
png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr,
- (png_uint_32)(num_entries * png_sizeof (png_byte)));
-
+ (png_uint_32)(num_entries * png_sizeof(png_byte)));
png_memset(png_ptr->palette_lookup, 0, num_entries *
- png_sizeof (png_byte));
+ png_sizeof(png_byte));
distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *
png_sizeof(png_byte)));
@@ -526,8 +543,9 @@ png_set_dither(png_structp png_ptr, png_colorp palette,
void PNGAPI
png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
{
- png_debug(1, "in png_set_gamma\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_gamma");
+ if (png_ptr == NULL)
+ return;
if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) ||
(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) ||
(png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
@@ -545,8 +563,9 @@ png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
void PNGAPI
png_set_expand(png_structp png_ptr)
{
- png_debug(1, "in png_set_expand\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_expand");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
@@ -572,8 +591,9 @@ png_set_expand(png_structp png_ptr)
void PNGAPI
png_set_palette_to_rgb(png_structp png_ptr)
{
- png_debug(1, "in png_set_palette_to_rgb\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_palette_to_rgb");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
@@ -583,8 +603,9 @@ png_set_palette_to_rgb(png_structp png_ptr)
void PNGAPI
png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)
{
- png_debug(1, "in png_set_expand_gray_1_2_4_to_8\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_expand_gray_1_2_4_to_8");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_EXPAND;
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
@@ -596,8 +617,9 @@ png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)
void PNGAPI
png_set_gray_1_2_4_to_8(png_structp png_ptr)
{
- png_debug(1, "in png_set_gray_1_2_4_to_8\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_gray_1_2_4_to_8");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
}
#endif
@@ -607,7 +629,7 @@ png_set_gray_1_2_4_to_8(png_structp png_ptr)
void PNGAPI
png_set_tRNS_to_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_tRNS_to_alpha\n");
+ png_debug(1, "in png_set_tRNS_to_alpha");
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
@@ -617,7 +639,7 @@ png_set_tRNS_to_alpha(png_structp png_ptr)
void PNGAPI
png_set_gray_to_rgb(png_structp png_ptr)
{
- png_debug(1, "in png_set_gray_to_rgb\n");
+ png_debug(1, "in png_set_gray_to_rgb");
png_ptr->transformations |= PNG_GRAY_TO_RGB;
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
@@ -633,10 +655,11 @@ void PNGAPI
png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red,
double green)
{
- int red_fixed = (int)((float)red*100000.0 + 0.5);
- int green_fixed = (int)((float)green*100000.0 + 0.5);
- if(png_ptr == NULL) return;
- png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed);
+ int red_fixed = (int)((float)red*100000.0 + 0.5);
+ int green_fixed = (int)((float)green*100000.0 + 0.5);
+ if (png_ptr == NULL)
+ return;
+ png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed);
}
#endif
@@ -644,14 +667,17 @@ void PNGAPI
png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
png_fixed_point red, png_fixed_point green)
{
- png_debug(1, "in png_set_rgb_to_gray\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_rgb_to_gray");
+ if (png_ptr == NULL)
+ return;
switch(error_action)
{
case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY;
break;
+
case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;
break;
+
case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;
}
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
@@ -659,21 +685,22 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
png_ptr->transformations |= PNG_EXPAND;
#else
{
- png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED.");
+ png_warning(png_ptr,
+ "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED.");
png_ptr->transformations &= ~PNG_RGB_TO_GRAY;
}
#endif
{
png_uint_16 red_int, green_int;
- if(red < 0 || green < 0)
+ if (red < 0 || green < 0)
{
red_int = 6968; /* .212671 * 32768 + .5 */
green_int = 23434; /* .715160 * 32768 + .5 */
}
- else if(red + green < 100000L)
+ else if (red + green < 100000L)
{
- red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L);
- green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L);
+ red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L);
+ green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L);
}
else
{
@@ -683,26 +710,28 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
}
png_ptr->rgb_to_gray_red_coeff = red_int;
png_ptr->rgb_to_gray_green_coeff = green_int;
- png_ptr->rgb_to_gray_blue_coeff = (png_uint_16)(32768-red_int-green_int);
+ png_ptr->rgb_to_gray_blue_coeff =
+ (png_uint_16)(32768 - red_int - green_int);
}
}
#endif
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
+ defined(PNG_LEGACY_SUPPORTED) || \
+ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
void PNGAPI
png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
read_user_transform_fn)
{
- png_debug(1, "in png_set_read_user_transform_fn\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_read_user_transform_fn");
+ if (png_ptr == NULL)
+ return;
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
png_ptr->transformations |= PNG_USER_TRANSFORM;
png_ptr->read_user_transform_fn = read_user_transform_fn;
#endif
#ifdef PNG_LEGACY_SUPPORTED
- if(read_user_transform_fn)
+ if (read_user_transform_fn)
png_warning(png_ptr,
"This version of libpng does not support user transforms");
#endif
@@ -715,9 +744,9 @@ png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
void /* PRIVATE */
png_init_read_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_init_read_transformations\n");
+ png_debug(1, "in png_init_read_transformations");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if(png_ptr != NULL)
+ if (png_ptr != NULL)
#endif
{
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \
@@ -729,8 +758,9 @@ png_init_read_transformations(png_structp png_ptr)
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
/* Detect gray background and attempt to enable optimization
- * for gray --> RGB case */
- /* Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or
+ * for gray --> RGB case
+ *
+ * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or
* RGB_ALPHA (in which case need_expand is superfluous anyway), the
* background color might actually be gray yet not be flagged as such.
* This is not a problem for the current code, which uses
@@ -757,7 +787,7 @@ png_init_read_transformations(png_structp png_ptr)
{
if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */
{
- /* expand background and tRNS chunks */
+ /* Expand background and tRNS chunks */
switch (png_ptr->bit_depth)
{
case 1:
@@ -771,6 +801,7 @@ png_init_read_transformations(png_structp png_ptr)
= png_ptr->trans_values.blue = png_ptr->trans_values.gray;
}
break;
+
case 2:
png_ptr->background.gray *= (png_uint_16)0x55;
png_ptr->background.red = png_ptr->background.green
@@ -782,6 +813,7 @@ png_init_read_transformations(png_structp png_ptr)
= png_ptr->trans_values.blue = png_ptr->trans_values.gray;
}
break;
+
case 4:
png_ptr->background.gray *= (png_uint_16)0x11;
png_ptr->background.red = png_ptr->background.green
@@ -793,7 +825,9 @@ png_init_read_transformations(png_structp png_ptr)
= png_ptr->trans_values.blue = png_ptr->trans_values.gray;
}
break;
+
case 8:
+
case 16:
png_ptr->background.red = png_ptr->background.green
= png_ptr->background.blue = png_ptr->background.gray;
@@ -816,9 +850,10 @@ png_init_read_transformations(png_structp png_ptr)
if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
#endif
{
- /* invert the alpha channel (in tRNS) unless the pixels are
- going to be expanded, in which case leave it for later */
- int i,istop;
+ /* Invert the alpha channel (in tRNS) unless the pixels are
+ * going to be expanded, in which case leave it for later
+ */
+ int i, istop;
istop=(int)png_ptr->num_trans;
for (i=0; i<istop; i++)
png_ptr->trans[i] = (png_byte)(255 - png_ptr->trans[i]);
@@ -839,12 +874,12 @@ png_init_read_transformations(png_structp png_ptr)
&& (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0)
< PNG_GAMMA_THRESHOLD))
{
- int i,k;
+ int i, k;
k=0;
for (i=0; i<png_ptr->num_trans; i++)
{
if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff)
- k=1; /* partial transparency is present */
+ k=1; /* Partial transparency is present */
}
if (k == 0)
png_ptr->transformations &= ~PNG_GAMMA;
@@ -859,8 +894,7 @@ png_init_read_transformations(png_structp png_ptr)
{
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
- /* could skip if no transparency and
- */
+ /* Could skip if no transparency */
png_color back, back_1;
png_colorp palette = png_ptr->palette;
int num_palette = png_ptr->num_palette;
@@ -885,10 +919,12 @@ png_init_read_transformations(png_structp png_ptr)
g = (png_ptr->screen_gamma);
gs = 1.0;
break;
+
case PNG_BACKGROUND_GAMMA_FILE:
g = 1.0 / (png_ptr->gamma);
gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
break;
+
case PNG_BACKGROUND_GAMMA_UNIQUE:
g = 1.0 / (png_ptr->background_gamma);
gs = 1.0 / (png_ptr->background_gamma *
@@ -977,10 +1013,12 @@ png_init_read_transformations(png_structp png_ptr)
g = (png_ptr->screen_gamma);
gs = 1.0;
break;
+
case PNG_BACKGROUND_GAMMA_FILE:
g = 1.0 / (png_ptr->gamma);
gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
break;
+
case PNG_BACKGROUND_GAMMA_UNIQUE:
g = 1.0 / (png_ptr->background_gamma);
gs = 1.0 / (png_ptr->background_gamma *
@@ -1022,7 +1060,7 @@ png_init_read_transformations(png_structp png_ptr)
}
}
else
- /* transformation does not include PNG_BACKGROUND */
+ /* Transformation does not include PNG_BACKGROUND */
#endif /* PNG_READ_BACKGROUND_SUPPORTED */
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
@@ -1110,7 +1148,7 @@ png_init_read_transformations(png_structp png_ptr)
}
#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \
&& !defined(PNG_READ_BACKGROUND_SUPPORTED)
- if(png_ptr)
+ if (png_ptr)
return;
#endif
}
@@ -1122,7 +1160,7 @@ png_init_read_transformations(png_structp png_ptr)
void /* PRIVATE */
png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_read_transform_info\n");
+ png_debug(1, "in png_read_transform_info");
#if defined(PNG_READ_EXPAND_SUPPORTED)
if (png_ptr->transformations & PNG_EXPAND)
{
@@ -1142,10 +1180,6 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr->transformations & PNG_EXPAND_tRNS)
info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
-#if 0 /* Removed from libpng-1.2.27 */
- else
- info_ptr->color_type |= PNG_COLOR_MASK_COLOR;
-#endif
}
if (info_ptr->bit_depth < 8)
info_ptr->bit_depth = 8;
@@ -1194,8 +1228,8 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
if (png_ptr->transformations & PNG_DITHER)
{
if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
- (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&
- png_ptr->palette_lookup && info_ptr->bit_depth == 8)
+ (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&
+ png_ptr->palette_lookup && info_ptr->bit_depth == 8)
{
info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
}
@@ -1229,7 +1263,7 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
(info_ptr->color_type == PNG_COLOR_TYPE_GRAY)))
{
info_ptr->channels++;
- /* if adding a true alpha channel not just filler */
+ /* If adding a true alpha channel not just filler */
#if !defined(PNG_1_0_X)
if (png_ptr->transformations & PNG_ADD_ALPHA)
info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
@@ -1239,11 +1273,11 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \
defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- if(png_ptr->transformations & PNG_USER_TRANSFORM)
+ if (png_ptr->transformations & PNG_USER_TRANSFORM)
{
- if(info_ptr->bit_depth < png_ptr->user_transform_depth)
+ if (info_ptr->bit_depth < png_ptr->user_transform_depth)
info_ptr->bit_depth = png_ptr->user_transform_depth;
- if(info_ptr->channels < png_ptr->user_transform_channels)
+ if (info_ptr->channels < png_ptr->user_transform_channels)
info_ptr->channels = png_ptr->user_transform_channels;
}
#endif
@@ -1251,10 +1285,10 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
info_ptr->pixel_depth = (png_byte)(info_ptr->channels *
info_ptr->bit_depth);
- info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,info_ptr->width);
+ info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width);
#if !defined(PNG_READ_EXPAND_SUPPORTED)
- if(png_ptr)
+ if (png_ptr)
return;
#endif
}
@@ -1266,14 +1300,14 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
void /* PRIVATE */
png_do_read_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_do_read_transformations\n");
+ png_debug(1, "in png_do_read_transformations");
if (png_ptr->row_buf == NULL)
{
#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
char msg[50];
png_snprintf2(msg, 50,
- "NULL row buffer for row %ld, pass %d", png_ptr->row_number,
+ "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number,
png_ptr->pass);
png_error(png_ptr, msg);
#else
@@ -1284,7 +1318,8 @@ png_do_read_transformations(png_structp png_ptr)
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
/* Application has failed to call either png_read_start_image()
* or png_read_update_info() after setting transforms that expand
- * pixels. This check added to libpng-1.2.19 */
+ * pixels. This check added to libpng-1.2.19
+ */
#if (PNG_WARN_UNINITIALIZED_ROW==1)
png_error(png_ptr, "Uninitialized row");
#else
@@ -1324,52 +1359,54 @@ png_do_read_transformations(png_structp png_ptr)
{
int rgb_error =
png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1);
- if(rgb_error)
+ if (rgb_error)
{
png_ptr->rgb_to_gray_status=1;
- if((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
PNG_RGB_TO_GRAY_WARN)
png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");
- if((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
PNG_RGB_TO_GRAY_ERR)
png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");
}
}
#endif
-/*
-From Andreas Dilger e-mail to png-implement, 26 March 1998:
-
- In most cases, the "simple transparency" should be done prior to doing
- gray-to-RGB, or you will have to test 3x as many bytes to check if a
- pixel is transparent. You would also need to make sure that the
- transparency information is upgraded to RGB.
-
- To summarize, the current flow is:
- - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
- with background "in place" if transparent,
- convert to RGB if necessary
- - Gray + alpha -> composite with gray background and remove alpha bytes,
- convert to RGB if necessary
-
- To support RGB backgrounds for gray images we need:
- - Gray + simple transparency -> convert to RGB + simple transparency, compare
- 3 or 6 bytes and composite with background
- "in place" if transparent (3x compare/pixel
- compared to doing composite with gray bkgrnd)
- - Gray + alpha -> convert to RGB + alpha, composite with background and
- remove alpha bytes (3x float operations/pixel
- compared with composite on gray background)
-
- Greg's change will do this. The reason it wasn't done before is for
- performance, as this increases the per-pixel operations. If we would check
- in advance if the background was gray or RGB, and position the gray-to-RGB
- transform appropriately, then it would save a lot of work/time.
+/* From Andreas Dilger e-mail to png-implement, 26 March 1998:
+ *
+ * In most cases, the "simple transparency" should be done prior to doing
+ * gray-to-RGB, or you will have to test 3x as many bytes to check if a
+ * pixel is transparent. You would also need to make sure that the
+ * transparency information is upgraded to RGB.
+ *
+ * To summarize, the current flow is:
+ * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
+ * with background "in place" if transparent,
+ * convert to RGB if necessary
+ * - Gray + alpha -> composite with gray background and remove alpha bytes,
+ * convert to RGB if necessary
+ *
+ * To support RGB backgrounds for gray images we need:
+ * - Gray + simple transparency -> convert to RGB + simple transparency,
+ * compare 3 or 6 bytes and composite with
+ * background "in place" if transparent
+ * (3x compare/pixel compared to doing
+ * composite with gray bkgrnd)
+ * - Gray + alpha -> convert to RGB + alpha, composite with background and
+ * remove alpha bytes (3x float
+ * operations/pixel compared with composite
+ * on gray background)
+ *
+ * Greg's change will do this. The reason it wasn't done before is for
+ * performance, as this increases the per-pixel operations. If we would check
+ * in advance if the background was gray or RGB, and position the gray-to-RGB
+ * transform appropriately, then it would save a lot of work/time.
*/
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- /* if gray -> RGB, do so now only if background is non-gray; else do later
- * for performance reasons */
+ /* If gray -> RGB, do so now only if background is non-gray; else do later
+ * for performance reasons
+ */
if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
!(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
@@ -1394,14 +1431,14 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
#if defined(PNG_READ_GAMMA_SUPPORTED)
if ((png_ptr->transformations & PNG_GAMMA) &&
#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- !((png_ptr->transformations & PNG_BACKGROUND) &&
- ((png_ptr->num_trans != 0) ||
- (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&
+ !((png_ptr->transformations & PNG_BACKGROUND) &&
+ ((png_ptr->num_trans != 0) ||
+ (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&
#endif
- (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
+ (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->gamma_table, png_ptr->gamma_16_table,
- png_ptr->gamma_shift);
+ png_ptr->gamma_table, png_ptr->gamma_16_table,
+ png_ptr->gamma_shift);
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
@@ -1414,7 +1451,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
{
png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1,
png_ptr->palette_lookup, png_ptr->dither_index);
- if(png_ptr->row_info.rowbytes == (png_uint_32)0)
+ if (png_ptr->row_info.rowbytes == (png_uint_32)0)
png_error(png_ptr, "png_do_dither returned rowbytes=0");
}
#endif
@@ -1446,7 +1483,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
#endif
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- /* if gray -> RGB, do so now only if we did not do so above */
+ /* If gray -> RGB, do so now only if we did not do so above */
if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
@@ -1476,21 +1513,21 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
if (png_ptr->transformations & PNG_USER_TRANSFORM)
{
- if(png_ptr->read_user_transform_fn != NULL)
- (*(png_ptr->read_user_transform_fn)) /* user read transform function */
- (png_ptr, /* png_ptr */
- &(png_ptr->row_info), /* row_info: */
- /* png_uint_32 width; width of row */
- /* png_uint_32 rowbytes; number of bytes in row */
- /* png_byte color_type; color type of pixels */
- /* png_byte bit_depth; bit depth of samples */
- /* png_byte channels; number of channels (1-4) */
- /* png_byte pixel_depth; bits per pixel (depth*channels) */
- png_ptr->row_buf + 1); /* start of pixel data for row */
+ if (png_ptr->read_user_transform_fn != NULL)
+ (*(png_ptr->read_user_transform_fn)) /* User read transform function */
+ (png_ptr, /* png_ptr */
+ &(png_ptr->row_info), /* row_info: */
+ /* png_uint_32 width; width of row */
+ /* png_uint_32 rowbytes; number of bytes in row */
+ /* png_byte color_type; color type of pixels */
+ /* png_byte bit_depth; bit depth of samples */
+ /* png_byte channels; number of channels (1-4) */
+ /* png_byte pixel_depth; bits per pixel (depth*channels) */
+ png_ptr->row_buf + 1); /* start of pixel data for row */
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if(png_ptr->user_transform_depth)
+ if (png_ptr->user_transform_depth)
png_ptr->row_info.bit_depth = png_ptr->user_transform_depth;
- if(png_ptr->user_transform_channels)
+ if (png_ptr->user_transform_channels)
png_ptr->row_info.channels = png_ptr->user_transform_channels;
#endif
png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
@@ -1512,7 +1549,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:
void /* PRIVATE */
png_do_unpack(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_unpack\n");
+ png_debug(1, "in png_do_unpack");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && row_info->bit_depth < 8)
#else
@@ -1544,6 +1581,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
}
break;
}
+
case 2:
{
@@ -1565,6 +1603,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
}
break;
}
+
case 4:
{
png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
@@ -1602,7 +1641,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
void /* PRIVATE */
png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
{
- png_debug(1, "in png_do_unshift\n");
+ png_debug(1, "in png_do_unshift");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL && sig_bits != NULL &&
@@ -1656,6 +1695,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
}
break;
}
+
case 4:
{
png_bytep bp = row;
@@ -1671,6 +1711,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
}
break;
}
+
case 8:
{
png_bytep bp = row;
@@ -1683,6 +1724,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
}
break;
}
+
case 16:
{
png_bytep bp = row;
@@ -1704,11 +1746,11 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* chop rows of bit depth 16 down to 8 */
+/* Chop rows of bit depth 16 down to 8 */
void /* PRIVATE */
png_do_chop(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_chop\n");
+ png_debug(1, "in png_do_chop");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && row_info->bit_depth == 16)
#else
@@ -1728,14 +1770,17 @@ png_do_chop(png_row_infop row_info, png_bytep row)
*
* What the ideal calculation should be:
* *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) * 255 + 127) / (png_uint_32)65535L;
+ * (png_uint_32)(*(sp + 1))) * 255 + 127)
+ * / (png_uint_32)65535L;
*
* GRR: no, I think this is what it really should be:
* *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) + 128L) / (png_uint_32)257L;
+ * (png_uint_32)(*(sp + 1))) + 128L)
+ * / (png_uint_32)257L;
*
* GRR: here's the exact calculation with shifts:
- * temp = (((png_uint_32)(*sp) << 8) | (png_uint_32)(*(sp + 1))) + 128L;
+ * temp = (((png_uint_32)(*sp) << 8) |
+ * (png_uint_32)(*(sp + 1))) + 128L;
* *dp = (temp - (temp >> 8)) >> 8;
*
* Approximate calculation with shift/add instead of multiply/divide:
@@ -1762,7 +1807,7 @@ png_do_chop(png_row_infop row_info, png_bytep row)
void /* PRIVATE */
png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_swap_alpha\n");
+ png_debug(1, "in png_do_read_swap_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -1854,7 +1899,7 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
void /* PRIVATE */
png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_invert_alpha\n");
+ png_debug(1, "in png_do_read_invert_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -1960,14 +2005,14 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
png_byte hi_filler = (png_byte)((filler>>8) & 0xff);
png_byte lo_filler = (png_byte)(filler & 0xff);
- png_debug(1, "in png_do_read_filler\n");
+ png_debug(1, "in png_do_read_filler");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
- if(row_info->bit_depth == 8)
+ if (row_info->bit_depth == 8)
{
/* This changes the data from G to GX */
if (flags & PNG_FLAG_FILLER_AFTER)
@@ -1999,7 +2044,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
row_info->rowbytes = row_width * 2;
}
}
- else if(row_info->bit_depth == 16)
+ else if (row_info->bit_depth == 16)
{
/* This changes the data from GG to GGXX */
if (flags & PNG_FLAG_FILLER_AFTER)
@@ -2039,7 +2084,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
} /* COLOR_TYPE == GRAY */
else if (row_info->color_type == PNG_COLOR_TYPE_RGB)
{
- if(row_info->bit_depth == 8)
+ if (row_info->bit_depth == 8)
{
/* This changes the data from RGB to RGBX */
if (flags & PNG_FLAG_FILLER_AFTER)
@@ -2075,7 +2120,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
row_info->rowbytes = row_width * 4;
}
}
- else if(row_info->bit_depth == 16)
+ else if (row_info->bit_depth == 16)
{
/* This changes the data from RRGGBB to RRGGBBXX */
if (flags & PNG_FLAG_FILLER_AFTER)
@@ -2125,14 +2170,14 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
#endif
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
-/* expand grayscale files to RGB, with or without alpha */
+/* Expand grayscale files to RGB, with or without alpha */
void /* PRIVATE */
png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
{
png_uint_32 i;
png_uint_32 row_width = row_info->width;
- png_debug(1, "in png_do_gray_to_rgb\n");
+ png_debug(1, "in png_do_gray_to_rgb");
if (row_info->bit_depth >= 8 &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -2202,16 +2247,18 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
row_info->color_type |= PNG_COLOR_MASK_COLOR;
row_info->pixel_depth = (png_byte)(row_info->channels *
row_info->bit_depth);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
}
#endif
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-/* reduce RGB files to grayscale, with or without alpha
+/* Reduce RGB files to grayscale, with or without alpha
* using the equation given in Poynton's ColorFAQ at
- * <http://www.inforamp.net/~poynton/>
- * Copyright (c) 1998-01-04 Charles Poynton poynton at inforamp.net
+ * <http://www.inforamp.net/~poynton/> (THIS LINK IS DEAD June 2008)
+ * New link:
+ * <http://www.poynton.com/notes/colour_and_gamma/>
+ * Charles Poynton poynton at poynton.com
*
* Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
*
@@ -2236,7 +2283,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
png_uint_32 row_width = row_info->width;
int rgb_error = 0;
- png_debug(1, "in png_do_rgb_to_gray\n");
+ png_debug(1, "in png_do_rgb_to_gray");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -2262,14 +2309,14 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
png_byte red = png_ptr->gamma_to_1[*(sp++)];
png_byte green = png_ptr->gamma_to_1[*(sp++)];
png_byte blue = png_ptr->gamma_to_1[*(sp++)];
- if(red != green || red != blue)
+ if (red != green || red != blue)
{
rgb_error |= 1;
*(dp++) = png_ptr->gamma_from_1[
- (rc*red+gc*green+bc*blue)>>15];
+ (rc*red + gc*green + bc*blue)>>15];
}
else
- *(dp++) = *(sp-1);
+ *(dp++) = *(sp - 1);
}
}
else
@@ -2282,13 +2329,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
png_byte red = *(sp++);
png_byte green = *(sp++);
png_byte blue = *(sp++);
- if(red != green || red != blue)
+ if (red != green || red != blue)
{
rgb_error |= 1;
- *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15);
+ *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
}
else
- *(dp++) = *(sp-1);
+ *(dp++) = *(sp - 1);
}
}
}
@@ -2309,7 +2356,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- if(red == green && red == blue)
+ if (red == green && red == blue)
w = red;
else
{
@@ -2343,7 +2390,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- if(red != green || red != blue)
+ if (red != green || red != blue)
rgb_error |= 1;
gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
*(dp++) = (png_byte)((gray16>>8) & 0xff);
@@ -2366,7 +2413,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
png_byte red = png_ptr->gamma_to_1[*(sp++)];
png_byte green = png_ptr->gamma_to_1[*(sp++)];
png_byte blue = png_ptr->gamma_to_1[*(sp++)];
- if(red != green || red != blue)
+ if (red != green || red != blue)
rgb_error |= 1;
*(dp++) = png_ptr->gamma_from_1
[(rc*red + gc*green + bc*blue)>>15];
@@ -2383,7 +2430,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
png_byte red = *(sp++);
png_byte green = *(sp++);
png_byte blue = *(sp++);
- if(red != green || red != blue)
+ if (red != green || red != blue)
rgb_error |= 1;
*(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
*(dp++) = *(sp++); /* alpha */
@@ -2406,7 +2453,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- if(red == green && red == blue)
+ if (red == green && red == blue)
w = red;
else
{
@@ -2440,7 +2487,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
- if(red != green || red != blue)
+ if (red != green || red != blue)
rgb_error |= 1;
gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
*(dp++) = (png_byte)((gray16>>8) & 0xff);
@@ -2455,7 +2502,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
row_info->color_type &= ~PNG_COLOR_MASK_COLOR;
row_info->pixel_depth = (png_byte)(row_info->channels *
row_info->bit_depth);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
return rgb_error;
}
@@ -2474,7 +2521,7 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)
int i;
int v;
- png_debug(1, "in png_do_build_grayscale_palette\n");
+ png_debug(1, "in png_do_build_grayscale_palette");
if (palette == NULL)
return;
@@ -2484,18 +2531,22 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)
num_palette = 2;
color_inc = 0xff;
break;
+
case 2:
num_palette = 4;
color_inc = 0x55;
break;
+
case 4:
num_palette = 16;
color_inc = 0x11;
break;
+
case 8:
num_palette = 256;
color_inc = 1;
break;
+
default:
num_palette = 0;
color_inc = 0;
@@ -2516,7 +2567,7 @@ void /* PRIVATE */
png_correct_palette(png_structp png_ptr, png_colorp palette,
int num_palette)
{
- png_debug(1, "in png_correct_palette\n");
+ png_debug(1, "in png_correct_palette");
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND))
@@ -2673,7 +2724,7 @@ png_correct_palette(png_structp png_ptr, png_colorp palette,
}
}
}
- else /* assume grayscale palette (what else could it be?) */
+ else /* Assume grayscale palette (what else could it be?) */
{
int i;
@@ -2713,7 +2764,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
png_uint_32 row_width=row_info->width;
int shift;
- png_debug(1, "in png_do_background\n");
+ png_debug(1, "in png_do_background");
if (background != NULL &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -2749,6 +2800,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 2:
{
#if defined(PNG_READ_GAMMA_SUPPORTED)
@@ -2805,6 +2857,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 4:
{
#if defined(PNG_READ_GAMMA_SUPPORTED)
@@ -2861,6 +2914,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 8:
{
#if defined(PNG_READ_GAMMA_SUPPORTED)
@@ -2893,6 +2947,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 16:
{
#if defined(PNG_READ_GAMMA_SUPPORTED)
@@ -2906,7 +2961,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
if (v == trans_values->gray)
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*sp = (png_byte)((background->gray >> 8) & 0xff);
*(sp + 1) = (png_byte)(background->gray & 0xff);
}
@@ -2939,6 +2994,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_RGB:
{
if (row_info->bit_depth == 8)
@@ -2996,7 +3052,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
if (r == trans_values->red && g == trans_values->green &&
b == trans_values->blue)
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*sp = (png_byte)((background->red >> 8) & 0xff);
*(sp + 1) = (png_byte)(background->red & 0xff);
*(sp + 2) = (png_byte)((background->green >> 8) & 0xff);
@@ -3043,6 +3099,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_GRAY_ALPHA:
{
if (row_info->bit_depth == 8)
@@ -3063,7 +3120,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
else if (a == 0)
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*dp = (png_byte)background->gray;
}
else
@@ -3130,7 +3187,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
else
#endif
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*dp = (png_byte)((background->gray >> 8) & 0xff);
*(dp + 1) = (png_byte)(background->gray & 0xff);
}
@@ -3185,6 +3242,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_RGB_ALPHA:
{
if (row_info->bit_depth == 8)
@@ -3207,7 +3265,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
else if (a == 0)
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*dp = (png_byte)background->red;
*(dp + 1) = (png_byte)background->green;
*(dp + 2) = (png_byte)background->blue;
@@ -3288,7 +3346,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
}
else if (a == 0)
{
- /* background is already in screen gamma */
+ /* Background is already in screen gamma */
*dp = (png_byte)((background->red >> 8) & 0xff);
*(dp + 1) = (png_byte)(background->red & 0xff);
*(dp + 2) = (png_byte)((background->green >> 8) & 0xff);
@@ -3373,7 +3431,7 @@ png_do_background(png_row_infop row_info, png_bytep row,
row_info->channels--;
row_info->pixel_depth = (png_byte)(row_info->channels *
row_info->bit_depth);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
}
}
@@ -3395,7 +3453,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_gamma\n");
+ png_debug(1, "in png_do_gamma");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -3443,6 +3501,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_RGB_ALPHA:
{
if (row_info->bit_depth == 8)
@@ -3480,6 +3539,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_GRAY_ALPHA:
{
if (row_info->bit_depth == 8)
@@ -3504,6 +3564,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
}
break;
}
+
case PNG_COLOR_TYPE_GRAY:
{
if (row_info->bit_depth == 2)
@@ -3524,6 +3585,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
sp++;
}
}
+
if (row_info->bit_depth == 4)
{
sp = row;
@@ -3537,6 +3599,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
sp++;
}
}
+
else if (row_info->bit_depth == 8)
{
sp = row;
@@ -3546,6 +3609,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,
sp++;
}
}
+
else if (row_info->bit_depth == 16)
{
sp = row;
@@ -3577,7 +3641,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_expand_palette\n");
+ png_debug(1, "in png_do_expand_palette");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -3611,6 +3675,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 2:
{
sp = row + (png_size_t)((row_width - 1) >> 2);
@@ -3632,6 +3697,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 4:
{
sp = row + (png_size_t)((row_width - 1) >> 1);
@@ -3696,6 +3762,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
*dp-- = palette[*sp].red;
sp--;
}
+
row_info->bit_depth = 8;
row_info->pixel_depth = 24;
row_info->rowbytes = row_width * 3;
@@ -3720,7 +3787,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_expand\n");
+ png_debug(1, "in png_do_expand");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -3757,6 +3824,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 2:
{
gray = (png_uint_16)((gray&0x03)*0x55);
@@ -3780,6 +3848,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
}
break;
}
+
case 4:
{
gray = (png_uint_16)((gray&0x0f)*0x11);
@@ -3803,6 +3872,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
break;
}
}
+
row_info->bit_depth = 8;
row_info->pixel_depth = 8;
row_info->rowbytes = row_width;
@@ -3824,6 +3894,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
*dp-- = *sp--;
}
}
+
else if (row_info->bit_depth == 16)
{
png_byte gray_high = (gray >> 8) & 0xff;
@@ -3832,7 +3903,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
dp = row + (row_info->rowbytes << 1) - 1;
for (i = 0; i < row_width; i++)
{
- if (*(sp-1) == gray_high && *(sp) == gray_low)
+ if (*(sp - 1) == gray_high && *(sp) == gray_low)
{
*dp-- = 0;
*dp-- = 0;
@@ -3846,6 +3917,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
*dp-- = *sp--;
}
}
+
row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
row_info->channels = 2;
row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
@@ -3911,7 +3983,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
row_info->channels = 4;
row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
}
}
@@ -3926,7 +3998,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_dither\n");
+ png_debug(1, "in png_do_dither");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -3943,13 +4015,13 @@ png_do_dither(png_row_infop row_info, png_bytep row,
g = *sp++;
b = *sp++;
- /* this looks real messy, but the compiler will reduce
- it down to a reasonable formula. For example, with
- 5 bits per color, we get:
- p = (((r >> 3) & 0x1f) << 10) |
- (((g >> 3) & 0x1f) << 5) |
- ((b >> 3) & 0x1f);
- */
+ /* This looks real messy, but the compiler will reduce
+ * it down to a reasonable formula. For example, with
+ * 5 bits per color, we get:
+ * p = (((r >> 3) & 0x1f) << 10) |
+ * (((g >> 3) & 0x1f) << 5) |
+ * ((b >> 3) & 0x1f);
+ */
p = (((r >> (8 - PNG_DITHER_RED_BITS)) &
((1 << PNG_DITHER_RED_BITS) - 1)) <<
(PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) |
@@ -3964,7 +4036,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,
row_info->color_type = PNG_COLOR_TYPE_PALETTE;
row_info->channels = 1;
row_info->pixel_depth = row_info->bit_depth;
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
palette_lookup != NULL && row_info->bit_depth == 8)
@@ -3993,7 +4065,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,
row_info->color_type = PNG_COLOR_TYPE_PALETTE;
row_info->channels = 1;
row_info->pixel_depth = row_info->bit_depth;
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
}
else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&
dither_lookup && row_info->bit_depth == 8)
@@ -4021,7 +4093,7 @@ static PNG_CONST int png_gamma_shift[] =
void /* PRIVATE */
png_build_gamma_table(png_structp png_ptr)
{
- png_debug(1, "in png_build_gamma_table\n");
+ png_debug(1, "in png_build_gamma_table");
if (png_ptr->bit_depth <= 8)
{
@@ -4030,6 +4102,7 @@ png_build_gamma_table(png_structp png_ptr)
if (png_ptr->screen_gamma > .000001)
g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
+
else
g = 1.0;
@@ -4062,10 +4135,11 @@ png_build_gamma_table(png_structp png_ptr)
png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr,
(png_uint_32)256);
- if(png_ptr->screen_gamma > 0.000001)
+ if (png_ptr->screen_gamma > 0.000001)
g = 1.0 / png_ptr->screen_gamma;
+
else
- g = png_ptr->gamma; /* probably doing rgb_to_gray */
+ g = png_ptr->gamma; /* Probably doing rgb_to_gray */
for (i = 0; i < 256; i++)
{
@@ -4086,8 +4160,10 @@ png_build_gamma_table(png_structp png_ptr)
if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
{
sig_bit = (int)png_ptr->sig_bit.red;
+
if ((int)png_ptr->sig_bit.green > sig_bit)
sig_bit = png_ptr->sig_bit.green;
+
if ((int)png_ptr->sig_bit.blue > sig_bit)
sig_bit = png_ptr->sig_bit.blue;
}
@@ -4098,6 +4174,7 @@ png_build_gamma_table(png_structp png_ptr)
if (sig_bit > 0)
shift = 16 - sig_bit;
+
else
shift = 0;
@@ -4109,6 +4186,7 @@ png_build_gamma_table(png_structp png_ptr)
if (shift > 8)
shift = 8;
+
if (shift < 0)
shift = 0;
@@ -4122,7 +4200,8 @@ png_build_gamma_table(png_structp png_ptr)
g = 1.0;
png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * png_sizeof (png_uint_16p)));
+ (png_uint_32)(num * png_sizeof(png_uint_16p)));
+ png_memset(png_ptr->gamma_16_table, 0, num * png_sizeof(png_uint_16p));
if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND))
{
@@ -4132,7 +4211,7 @@ png_build_gamma_table(png_structp png_ptr)
for (i = 0; i < num; i++)
{
png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * png_sizeof (png_uint_16)));
+ (png_uint_32)(256 * png_sizeof(png_uint_16)));
}
g = 1.0 / g;
@@ -4162,9 +4241,10 @@ png_build_gamma_table(png_structp png_ptr)
for (i = 0; i < num; i++)
{
png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * png_sizeof (png_uint_16)));
+ (png_uint_32)(256 * png_sizeof(png_uint_16)));
ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4);
+
for (j = 0; j < 256; j++)
{
png_ptr->gamma_16_table[i][j] =
@@ -4182,12 +4262,13 @@ png_build_gamma_table(png_structp png_ptr)
g = 1.0 / (png_ptr->gamma);
png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * png_sizeof (png_uint_16p )));
+ (png_uint_32)(num * png_sizeof(png_uint_16p )));
+ png_memset(png_ptr->gamma_16_to_1, 0, num * png_sizeof(png_uint_16p));
for (i = 0; i < num; i++)
{
png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * png_sizeof (png_uint_16)));
+ (png_uint_32)(256 * png_sizeof(png_uint_16)));
ig = (((png_uint_32)i *
(png_uint_32)png_gamma_shift[shift]) >> 4);
@@ -4199,21 +4280,25 @@ png_build_gamma_table(png_structp png_ptr)
}
}
- if(png_ptr->screen_gamma > 0.000001)
+ if (png_ptr->screen_gamma > 0.000001)
g = 1.0 / png_ptr->screen_gamma;
+
else
- g = png_ptr->gamma; /* probably doing rgb_to_gray */
+ g = png_ptr->gamma; /* Probably doing rgb_to_gray */
png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * png_sizeof (png_uint_16p)));
+ (png_uint_32)(num * png_sizeof(png_uint_16p)));
+ png_memset(png_ptr->gamma_16_from_1, 0,
+ num * png_sizeof(png_uint_16p));
for (i = 0; i < num; i++)
{
png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * png_sizeof (png_uint_16)));
+ (png_uint_32)(256 * png_sizeof(png_uint_16)));
ig = (((png_uint_32)i *
(png_uint_32)png_gamma_shift[shift]) >> 4);
+
for (j = 0; j < 256; j++)
{
png_ptr->gamma_16_from_1[i][j] =
@@ -4230,11 +4315,11 @@ png_build_gamma_table(png_structp png_ptr)
#endif
#if defined(PNG_MNG_FEATURES_SUPPORTED)
-/* undoes intrapixel differencing */
+/* Undoes intrapixel differencing */
void /* PRIVATE */
png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_intrapixel\n");
+ png_debug(1, "in png_do_read_intrapixel");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -4250,8 +4335,10 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
bytes_per_pixel = 3;
+
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
bytes_per_pixel = 4;
+
else
return;
@@ -4268,18 +4355,20 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
bytes_per_pixel = 6;
+
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
bytes_per_pixel = 8;
+
else
return;
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
{
- png_uint_32 s0 = (*(rp ) << 8) | *(rp+1);
- png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3);
- png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5);
- png_uint_32 red = (png_uint_32)((s0+s1+65536L) & 0xffffL);
- png_uint_32 blue = (png_uint_32)((s2+s1+65536L) & 0xffffL);
+ png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
+ png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
+ png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
+ png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL);
+ png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL);
*(rp ) = (png_byte)((red >> 8) & 0xff);
*(rp+1) = (png_byte)(red & 0xff);
*(rp+4) = (png_byte)((blue >> 8) & 0xff);
diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c
index 531cb05..f656dfb 100644
--- a/src/3rdparty/libpng/pngrutil.c
+++ b/src/3rdparty/libpng/pngrutil.c
@@ -1,19 +1,21 @@
/* pngrutil.c - utilities to read a PNG file
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.38 [July 16, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file contains routines that are only called from within
* libpng itself during the course of reading an image.
*/
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED)
#if defined(_WIN32_WCE) && (_WIN32_WCE<0x500)
@@ -22,7 +24,7 @@
#ifdef PNG_FLOATING_POINT_SUPPORTED
# if defined(WIN32_WCE_OLD)
-/* strtod() function is not supported on WindowsCE */
+/* The strtod() function is not supported on WindowsCE */
__inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **endptr)
{
double result = 0;
@@ -30,7 +32,7 @@ __inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **end
wchar_t *str, *end;
len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0);
- str = (wchar_t *)png_malloc(png_ptr, len * sizeof(wchar_t));
+ str = (wchar_t *)png_malloc(png_ptr, len * png_sizeof(wchar_t));
if ( NULL != str )
{
MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len);
@@ -49,7 +51,15 @@ __inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **end
png_uint_32 PNGAPI
png_get_uint_31(png_structp png_ptr, png_bytep buf)
{
+#ifdef PNG_READ_BIG_ENDIAN_SUPPORTED
png_uint_32 i = png_get_uint_32(buf);
+#else
+ /* Avoid an extra function call by inlining the result. */
+ png_uint_32 i = ((png_uint_32)(*buf) << 24) +
+ ((png_uint_32)(*(buf + 1)) << 16) +
+ ((png_uint_32)(*(buf + 2)) << 8) +
+ (png_uint_32)(*(buf + 3));
+#endif
if (i > PNG_UINT_31_MAX)
png_error(png_ptr, "PNG unsigned integer out of range.");
return (i);
@@ -69,7 +79,8 @@ png_get_uint_32(png_bytep buf)
/* Grab a signed 32-bit integer from a buffer in big-endian format. The
* data is stored in the PNG file in two's complement format, and it is
- * assumed that the machine format for signed integers is the same. */
+ * assumed that the machine format for signed integers is the same.
+ */
png_int_32 PNGAPI
png_get_int_32(png_bytep buf)
{
@@ -92,19 +103,50 @@ png_get_uint_16(png_bytep buf)
}
#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */
+/* Read the chunk header (length + type name).
+ * Put the type name into png_ptr->chunk_name, and return the length.
+ */
+png_uint_32 /* PRIVATE */
+png_read_chunk_header(png_structp png_ptr)
+{
+ png_byte buf[8];
+ png_uint_32 length;
+
+ /* Read the length and the chunk name */
+ png_read_data(png_ptr, buf, 8);
+ length = png_get_uint_31(png_ptr, buf);
+
+ /* Put the chunk name into png_ptr->chunk_name */
+ png_memcpy(png_ptr->chunk_name, buf + 4, 4);
+
+ png_debug2(0, "Reading %s chunk, length = %lu",
+ png_ptr->chunk_name, length);
+
+ /* Reset the crc and run it over the chunk name */
+ png_reset_crc(png_ptr);
+ png_calculate_crc(png_ptr, png_ptr->chunk_name, 4);
+
+ /* Check to see if chunk name is valid */
+ png_check_chunk_name(png_ptr, png_ptr->chunk_name);
+
+ return length;
+}
+
/* Read data, and (optionally) run it through the CRC. */
void /* PRIVATE */
png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
png_read_data(png_ptr, buf, length);
png_calculate_crc(png_ptr, buf, length);
}
/* Optionally skip data and then check the CRC. Depending on whether we
- are reading a ancillary or critical chunk, and how the program has set
- things up, we may calculate the CRC on the data and print a message.
- Returns '1' if there was a CRC error, '0' otherwise. */
+ * are reading a ancillary or critical chunk, and how the program has set
+ * things up, we may calculate the CRC on the data and print a message.
+ * Returns '1' if there was a CRC error, '0' otherwise.
+ */
int /* PRIVATE */
png_crc_finish(png_structp png_ptr, png_uint_32 skip)
{
@@ -123,7 +165,7 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)
if (png_crc_error(png_ptr))
{
if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */
- !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) ||
+ !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) ||
(!(png_ptr->chunk_name[0] & 0x20) && /* Critical */
(png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)))
{
@@ -140,7 +182,8 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)
}
/* Compare the CRC stored in the PNG file with that calculated by libpng from
- the data it has read thus far. */
+ * the data it has read thus far.
+ */
int /* PRIVATE */
png_crc_error(png_structp png_ptr)
{
@@ -180,9 +223,9 @@ png_crc_error(png_structp png_ptr)
* holding the original prefix part and an uncompressed version of the
* trailing part (the malloc area passed in is freed).
*/
-png_charp /* PRIVATE */
+void /* PRIVATE */
png_decompress_chunk(png_structp png_ptr, int comp_type,
- png_charp chunkdata, png_size_t chunklength,
+ png_size_t chunklength,
png_size_t prefix_size, png_size_t *newlength)
{
static PNG_CONST char msg[] = "Error decoding compressed text";
@@ -192,7 +235,7 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
if (comp_type == PNG_COMPRESSION_TYPE_BASE)
{
int ret = Z_OK;
- png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size);
+ png_ptr->zstream.next_in = (png_bytep)(png_ptr->chunkdata + prefix_size);
png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size);
png_ptr->zstream.next_out = png_ptr->zbuf;
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
@@ -218,18 +261,20 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
text = (png_charp)png_malloc_warn(png_ptr, text_size);
if (text == NULL)
{
- png_free(png_ptr,chunkdata);
- png_error(png_ptr,"Not enough memory to decompress chunk");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ png_error(png_ptr, "Not enough memory to decompress chunk");
}
- png_memcpy(text, chunkdata, prefix_size);
+ png_memcpy(text, png_ptr->chunkdata, prefix_size);
}
text[text_size - 1] = 0x00;
/* Copy what we can of the error message into the text chunk */
- text_size = (png_size_t)(chunklength - (text - chunkdata) - 1);
- text_size = png_sizeof(msg) > text_size ? text_size :
- png_sizeof(msg);
+ text_size = (png_size_t)(chunklength -
+ (text - png_ptr->chunkdata) - 1);
+ if (text_size > png_sizeof(msg))
+ text_size = png_sizeof(msg);
png_memcpy(text + prefix_size, msg, text_size);
break;
}
@@ -241,13 +286,15 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
png_ptr->zbuf_size - png_ptr->zstream.avail_out;
text = (png_charp)png_malloc_warn(png_ptr, text_size + 1);
if (text == NULL)
- {
- png_free(png_ptr,chunkdata);
- png_error(png_ptr,"Not enough memory to decompress chunk.");
- }
+ {
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ png_error(png_ptr,
+ "Not enough memory to decompress chunk.");
+ }
png_memcpy(text + prefix_size, png_ptr->zbuf,
text_size - prefix_size);
- png_memcpy(text, chunkdata, prefix_size);
+ png_memcpy(text, png_ptr->chunkdata, prefix_size);
*(text + text_size) = 0x00;
}
else
@@ -261,8 +308,10 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
if (text == NULL)
{
png_free(png_ptr, tmp);
- png_free(png_ptr, chunkdata);
- png_error(png_ptr,"Not enough memory to decompress chunk..");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ png_error(png_ptr,
+ "Not enough memory to decompress chunk..");
}
png_memcpy(text, tmp, text_size);
png_free(png_ptr, tmp);
@@ -289,29 +338,33 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
png_snprintf(umsg, 52,
"Buffer error in compressed datastream in %s chunk",
png_ptr->chunk_name);
+
else if (ret == Z_DATA_ERROR)
png_snprintf(umsg, 52,
"Data error in compressed datastream in %s chunk",
png_ptr->chunk_name);
+
else
png_snprintf(umsg, 52,
"Incomplete compressed datastream in %s chunk",
png_ptr->chunk_name);
+
png_warning(png_ptr, umsg);
#else
png_warning(png_ptr,
"Incomplete compressed datastream in chunk other than IDAT");
#endif
- text_size=prefix_size;
+ text_size = prefix_size;
if (text == NULL)
{
text = (png_charp)png_malloc_warn(png_ptr, text_size+1);
if (text == NULL)
{
- png_free(png_ptr, chunkdata);
- png_error(png_ptr,"Not enough memory for text.");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ png_error(png_ptr, "Not enough memory for text.");
}
- png_memcpy(text, chunkdata, prefix_size);
+ png_memcpy(text, png_ptr->chunkdata, prefix_size);
}
*(text + text_size) = 0x00;
}
@@ -319,8 +372,8 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
inflateReset(&png_ptr->zstream);
png_ptr->zstream.avail_in = 0;
- png_free(png_ptr, chunkdata);
- chunkdata = text;
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = text;
*newlength=text_size;
}
else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */
@@ -328,22 +381,19 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,
#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
char umsg[50];
- png_snprintf(umsg, 50,
- "Unknown zTXt compression type %d", comp_type);
+ png_snprintf(umsg, 50, "Unknown zTXt compression type %d", comp_type);
png_warning(png_ptr, umsg);
#else
png_warning(png_ptr, "Unknown zTXt compression type");
#endif
- *(chunkdata + prefix_size) = 0x00;
- *newlength=prefix_size;
+ *(png_ptr->chunkdata + prefix_size) = 0x00;
+ *newlength = prefix_size;
}
-
- return chunkdata;
}
#endif
-/* read and check the IDHR chunk */
+/* Read and check the IDHR chunk */
void /* PRIVATE */
png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
@@ -352,12 +402,12 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
int bit_depth, color_type, compression_type, filter_type;
int interlace_type;
- png_debug(1, "in png_handle_IHDR\n");
+ png_debug(1, "in png_handle_IHDR");
if (png_ptr->mode & PNG_HAVE_IHDR)
png_error(png_ptr, "Out of place IHDR");
- /* check the length */
+ /* Check the length */
if (length != 13)
png_error(png_ptr, "Invalid IHDR chunk");
@@ -374,7 +424,7 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
filter_type = buf[11];
interlace_type = buf[12];
- /* set internal variables */
+ /* Set internal variables */
png_ptr->width = width;
png_ptr->height = height;
png_ptr->bit_depth = (png_byte)bit_depth;
@@ -385,36 +435,39 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
png_ptr->compression_type = (png_byte)compression_type;
- /* find number of channels */
+ /* Find number of channels */
switch (png_ptr->color_type)
{
case PNG_COLOR_TYPE_GRAY:
case PNG_COLOR_TYPE_PALETTE:
png_ptr->channels = 1;
break;
+
case PNG_COLOR_TYPE_RGB:
png_ptr->channels = 3;
break;
+
case PNG_COLOR_TYPE_GRAY_ALPHA:
png_ptr->channels = 2;
break;
+
case PNG_COLOR_TYPE_RGB_ALPHA:
png_ptr->channels = 4;
break;
}
- /* set up other useful info */
+ /* Set up other useful info */
png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth *
png_ptr->channels);
- png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width);
- png_debug1(3,"bit_depth = %d\n", png_ptr->bit_depth);
- png_debug1(3,"channels = %d\n", png_ptr->channels);
- png_debug1(3,"rowbytes = %lu\n", png_ptr->rowbytes);
+ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width);
+ png_debug1(3, "bit_depth = %d", png_ptr->bit_depth);
+ png_debug1(3, "channels = %d", png_ptr->channels);
+ png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes);
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,
color_type, interlace_type, compression_type, filter_type);
}
-/* read and check the palette */
+/* Read and check the palette */
void /* PRIVATE */
png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
@@ -424,16 +477,18 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_colorp pal_ptr;
#endif
- png_debug(1, "in png_handle_PLTE\n");
+ png_debug(1, "in png_handle_PLTE");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before PLTE");
+
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid PLTE after IDAT");
png_crc_finish(png_ptr, length);
return;
}
+
else if (png_ptr->mode & PNG_HAVE_PLTE)
png_error(png_ptr, "Duplicate PLTE chunk");
@@ -462,6 +517,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_crc_finish(png_ptr, length);
return;
}
+
else
{
png_error(png_ptr, "Invalid palette chunk");
@@ -486,7 +542,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_byte buf[3];
png_crc_read(png_ptr, buf, 3);
- /* don't depend upon png_color being any order */
+ /* Don't depend upon png_color being any order */
palette[i].red = buf[0];
palette[i].green = buf[1];
palette[i].blue = buf[2];
@@ -494,9 +550,10 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
/* If we actually NEED the PLTE chunk (ie for a paletted image), we do
- whatever the normal CRC configuration tells us. However, if we
- have an RGB image, the PLTE can be considered ancillary, so
- we will act as though it is. */
+ * whatever the normal CRC configuration tells us. However, if we
+ * have an RGB image, the PLTE can be considered ancillary, so
+ * we will act as though it is.
+ */
#if !defined(PNG_READ_OPT_PLTE_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
#endif
@@ -556,7 +613,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
void /* PRIVATE */
png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
- png_debug(1, "in png_handle_IEND\n");
+ png_debug(1, "in png_handle_IEND");
if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT))
{
@@ -571,7 +628,7 @@ png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
png_crc_finish(png_ptr, length);
- info_ptr =info_ptr; /* quiet compiler warnings about unused info_ptr */
+ info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */
}
#if defined(PNG_READ_gAMA_SUPPORTED)
@@ -584,7 +641,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
png_byte buf[4];
- png_debug(1, "in png_handle_gAMA\n");
+ png_debug(1, "in png_handle_gAMA");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before gAMA");
@@ -621,7 +678,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
igamma = (png_fixed_point)png_get_uint_32(buf);
- /* check for zero gamma */
+ /* Check for zero gamma */
if (igamma == 0)
{
png_warning(png_ptr,
@@ -636,7 +693,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_warning(png_ptr,
"Ignoring incorrect gAMA value when sRGB is also present");
#ifndef PNG_NO_CONSOLE_IO
- fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma);
+ fprintf(stderr, "gamma = (%d/100000)", (int)igamma);
#endif
return;
}
@@ -662,7 +719,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_size_t truelen;
png_byte buf[4];
- png_debug(1, "in png_handle_sBIT\n");
+ png_debug(1, "in png_handle_sBIT");
buf[0] = buf[1] = buf[2] = buf[3] = 0;
@@ -725,7 +782,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
void /* PRIVATE */
png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
- png_byte buf[4];
+ png_byte buf[32];
#ifdef PNG_FLOATING_POINT_SUPPORTED
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
#endif
@@ -734,7 +791,7 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_uint_32 uint_x, uint_y;
- png_debug(1, "in png_handle_cHRM\n");
+ png_debug(1, "in png_handle_cHRM");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before cHRM");
@@ -766,64 +823,27 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- png_crc_read(png_ptr, buf, 4);
- uint_x = png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- uint_y = png_get_uint_32(buf);
-
- if (uint_x > 80000L || uint_y > 80000L ||
- uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM white point");
- png_crc_finish(png_ptr, 24);
+ png_crc_read(png_ptr, buf, 32);
+ if (png_crc_finish(png_ptr, 0))
return;
- }
- int_x_white = (png_fixed_point)uint_x;
- int_y_white = (png_fixed_point)uint_y;
- png_crc_read(png_ptr, buf, 4);
uint_x = png_get_uint_32(buf);
+ uint_y = png_get_uint_32(buf + 4);
+ int_x_white = (png_fixed_point)uint_x;
+ int_y_white = (png_fixed_point)uint_y;
- png_crc_read(png_ptr, buf, 4);
- uint_y = png_get_uint_32(buf);
-
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM red point");
- png_crc_finish(png_ptr, 16);
- return;
- }
+ uint_x = png_get_uint_32(buf + 8);
+ uint_y = png_get_uint_32(buf + 12);
int_x_red = (png_fixed_point)uint_x;
int_y_red = (png_fixed_point)uint_y;
- png_crc_read(png_ptr, buf, 4);
- uint_x = png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- uint_y = png_get_uint_32(buf);
-
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM green point");
- png_crc_finish(png_ptr, 8);
- return;
- }
+ uint_x = png_get_uint_32(buf + 16);
+ uint_y = png_get_uint_32(buf + 20);
int_x_green = (png_fixed_point)uint_x;
int_y_green = (png_fixed_point)uint_y;
- png_crc_read(png_ptr, buf, 4);
- uint_x = png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- uint_y = png_get_uint_32(buf);
-
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM blue point");
- png_crc_finish(png_ptr, 0);
- return;
- }
+ uint_x = png_get_uint_32(buf + 24);
+ uint_y = png_get_uint_32(buf + 28);
int_x_blue = (png_fixed_point)uint_x;
int_y_blue = (png_fixed_point)uint_y;
@@ -854,19 +874,18 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
"Ignoring incorrect cHRM value when sRGB is also present");
#ifndef PNG_NO_CONSOLE_IO
#ifdef PNG_FLOATING_POINT_SUPPORTED
- fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n",
+ fprintf(stderr, "wx=%f, wy=%f, rx=%f, ry=%f\n",
white_x, white_y, red_x, red_y);
- fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n",
+ fprintf(stderr, "gx=%f, gy=%f, bx=%f, by=%f\n",
green_x, green_y, blue_x, blue_y);
#else
- fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n",
+ fprintf(stderr, "wx=%ld, wy=%ld, rx=%ld, ry=%ld\n",
int_x_white, int_y_white, int_x_red, int_y_red);
- fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n",
+ fprintf(stderr, "gx=%ld, gy=%ld, bx=%ld, by=%ld\n",
int_x_green, int_y_green, int_x_blue, int_y_blue);
#endif
#endif /* PNG_NO_CONSOLE_IO */
}
- png_crc_finish(png_ptr, 0);
return;
}
#endif /* PNG_READ_sRGB_SUPPORTED */
@@ -880,8 +899,6 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
int_x_white, int_y_white, int_x_red, int_y_red, int_x_green,
int_y_green, int_x_blue, int_y_blue);
#endif
- if (png_crc_finish(png_ptr, 0))
- return;
}
#endif
@@ -892,7 +909,7 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
int intent;
png_byte buf[1];
- png_debug(1, "in png_handle_sRGB\n");
+ png_debug(1, "in png_handle_sRGB");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sRGB");
@@ -925,7 +942,7 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
intent = buf[0];
- /* check for bad intent */
+ /* Check for bad intent */
if (intent >= PNG_sRGB_INTENT_LAST)
{
png_warning(png_ptr, "Unknown sRGB intent");
@@ -949,10 +966,11 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
"Ignoring incorrect gAMA value when sRGB is also present");
#ifndef PNG_NO_CONSOLE_IO
# ifdef PNG_FIXED_POINT_SUPPORTED
- fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma);
+ fprintf(stderr, "incorrect gamma=(%d/100000)\n",
+ (int)png_ptr->int_gamma);
# else
# ifdef PNG_FLOATING_POINT_SUPPORTED
- fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma);
+ fprintf(stderr, "incorrect gamma=%f\n", png_ptr->gamma);
# endif
# endif
#endif
@@ -987,7 +1005,6 @@ void /* PRIVATE */
png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* Note: this does not properly handle chunks that are > 64K under DOS */
{
- png_charp chunkdata;
png_byte compression_type;
png_bytep pC;
png_charp profile;
@@ -995,7 +1012,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_uint_32 profile_size, profile_length;
png_size_t slength, prefix_length, data_length;
- png_debug(1, "in png_handle_iCCP\n");
+ png_debug(1, "in png_handle_iCCP");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before iCCP");
@@ -1025,74 +1042,81 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
- chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- chunkdata[slength] = 0x00;
+ png_ptr->chunkdata[slength] = 0x00;
- for (profile = chunkdata; *profile; profile++)
- /* empty loop to find end of name */ ;
+ for (profile = png_ptr->chunkdata; *profile; profile++)
+ /* Empty loop to find end of name */ ;
++profile;
- /* there should be at least one zero (the compression type byte)
- following the separator, and we should be on it */
- if ( profile >= chunkdata + slength - 1)
+ /* There should be at least one zero (the compression type byte)
+ * following the separator, and we should be on it
+ */
+ if ( profile >= png_ptr->chunkdata + slength - 1)
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "Malformed iCCP chunk");
return;
}
- /* compression_type should always be zero */
+ /* Compression_type should always be zero */
compression_type = *profile++;
if (compression_type)
{
png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk");
- compression_type=0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8
+ compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8
wrote nonzero) */
}
- prefix_length = profile - chunkdata;
- chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata,
- slength, prefix_length, &data_length);
+ prefix_length = profile - png_ptr->chunkdata;
+ png_decompress_chunk(png_ptr, compression_type,
+ slength, prefix_length, &data_length);
profile_length = data_length - prefix_length;
if ( prefix_length > data_length || profile_length < 4)
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "Profile size field missing from iCCP chunk");
return;
}
/* Check the profile_size recorded in the first 32 bits of the ICC profile */
- pC = (png_bytep)(chunkdata+prefix_length);
- profile_size = ((*(pC ))<<24) |
- ((*(pC+1))<<16) |
- ((*(pC+2))<< 8) |
- ((*(pC+3)) );
+ pC = (png_bytep)(png_ptr->chunkdata + prefix_length);
+ profile_size = ((*(pC ))<<24) |
+ ((*(pC + 1))<<16) |
+ ((*(pC + 2))<< 8) |
+ ((*(pC + 3)) );
- if(profile_size < profile_length)
+ if (profile_size < profile_length)
profile_length = profile_size;
- if(profile_size > profile_length)
+ if (profile_size > profile_length)
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "Ignoring truncated iCCP profile.");
return;
}
- png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type,
- chunkdata + prefix_length, profile_length);
- png_free(png_ptr, chunkdata);
+ png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata,
+ compression_type, png_ptr->chunkdata + prefix_length, profile_length);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
}
#endif /* PNG_READ_iCCP_SUPPORTED */
@@ -1101,7 +1125,6 @@ void /* PRIVATE */
png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* Note: this does not properly handle chunks that are > 64K under DOS */
{
- png_bytep chunkdata;
png_bytep entry_start;
png_sPLT_t new_palette;
#ifdef PNG_NO_POINTER_INDEXING
@@ -1111,7 +1134,8 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_uint_32 skip = 0;
png_size_t slength;
- png_debug(1, "in png_handle_sPLT\n");
+ png_debug(1, "in png_handle_sPLT");
+
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sPLT");
@@ -1131,45 +1155,49 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
- chunkdata = (png_bytep)png_malloc(png_ptr, length + 1);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- chunkdata[slength] = 0x00;
+ png_ptr->chunkdata[slength] = 0x00;
- for (entry_start = chunkdata; *entry_start; entry_start++)
- /* empty loop to find end of name */ ;
+ for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; entry_start++)
+ /* Empty loop to find end of name */ ;
++entry_start;
- /* a sample depth should follow the separator, and we should be on it */
- if (entry_start > chunkdata + slength - 2)
+ /* A sample depth should follow the separator, and we should be on it */
+ if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2)
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "malformed sPLT chunk");
return;
}
new_palette.depth = *entry_start++;
entry_size = (new_palette.depth == 8 ? 6 : 10);
- data_length = (slength - (entry_start - chunkdata));
+ data_length = (slength - (entry_start - (png_bytep)png_ptr->chunkdata));
- /* integrity-check the data length */
+ /* Integrity-check the data length */
if (data_length % entry_size)
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "sPLT chunk has bad length");
return;
}
new_palette.nentries = (png_int_32) ( data_length / entry_size);
- if ((png_uint_32) new_palette.nentries > (png_uint_32) (PNG_SIZE_MAX /
- png_sizeof(png_sPLT_entry)))
+ if ((png_uint_32) new_palette.nentries >
+ (png_uint_32) (PNG_SIZE_MAX / png_sizeof(png_sPLT_entry)))
{
png_warning(png_ptr, "sPLT chunk too long");
return;
@@ -1226,12 +1254,13 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
- /* discard all chunk data except the name and stash that */
- new_palette.name = (png_charp)chunkdata;
+ /* Discard all chunk data except the name and stash that */
+ new_palette.name = png_ptr->chunkdata;
png_set_sPLT(png_ptr, info_ptr, &new_palette, 1);
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_free(png_ptr, new_palette.entries);
}
#endif /* PNG_READ_sPLT_SUPPORTED */
@@ -1242,7 +1271,7 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte readbuf[PNG_MAX_PALETTE_LENGTH];
- png_debug(1, "in png_handle_tRNS\n");
+ png_debug(1, "in png_handle_tRNS");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before tRNS");
@@ -1338,7 +1367,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_size_t truelen;
png_byte buf[6];
- png_debug(1, "in png_handle_bKGD\n");
+ png_debug(1, "in png_handle_bKGD");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before bKGD");
@@ -1389,7 +1418,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_ptr->background.index = buf[0];
if (info_ptr && info_ptr->num_palette)
{
- if(buf[0] > info_ptr->num_palette)
+ if (buf[0] >= info_ptr->num_palette)
{
png_warning(png_ptr, "Incorrect bKGD chunk index value");
return;
@@ -1427,7 +1456,7 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
unsigned int num, i;
png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];
- png_debug(1, "in png_handle_hIST\n");
+ png_debug(1, "in png_handle_hIST");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before hIST");
@@ -1482,7 +1511,7 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_uint_32 res_x, res_y;
int unit_type;
- png_debug(1, "in png_handle_pHYs\n");
+ png_debug(1, "in png_handle_pHYs");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before pHYs");
@@ -1525,7 +1554,7 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_int_32 offset_x, offset_y;
int unit_type;
- png_debug(1, "in png_handle_oFFs\n");
+ png_debug(1, "in png_handle_oFFs");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before oFFs");
@@ -1561,11 +1590,10 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
#if defined(PNG_READ_pCAL_SUPPORTED)
-/* read the pCAL chunk (described in the PNG Extensions document) */
+/* Read the pCAL chunk (described in the PNG Extensions document) */
void /* PRIVATE */
png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
- png_charp purpose;
png_int_32 X0, X1;
png_byte type, nparams;
png_charp buf, units, endptr;
@@ -1573,7 +1601,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_size_t slength;
int i;
- png_debug(1, "in png_handle_pCAL\n");
+ png_debug(1, "in png_handle_pCAL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before pCAL");
@@ -1590,48 +1618,51 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n",
+ png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)",
length + 1);
- purpose = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (purpose == NULL)
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "No memory for pCAL purpose.");
return;
}
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)purpose, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
{
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- purpose[slength] = 0x00; /* null terminate the last string */
+ png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */
- png_debug(3, "Finding end of pCAL purpose string\n");
- for (buf = purpose; *buf; buf++)
- /* empty loop */ ;
+ png_debug(3, "Finding end of pCAL purpose string");
+ for (buf = png_ptr->chunkdata; *buf; buf++)
+ /* Empty loop */ ;
- endptr = purpose + slength;
+ endptr = png_ptr->chunkdata + slength;
/* We need to have at least 12 bytes after the purpose string
in order to get the parameter information. */
if (endptr <= buf + 12)
{
png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n");
+ png_debug(3, "Reading pCAL X0, X1, type, nparams, and units");
X0 = png_get_int_32((png_bytep)buf+1);
X1 = png_get_int_32((png_bytep)buf+5);
type = buf[9];
nparams = buf[10];
units = buf + 11;
- png_debug(3, "Checking pCAL equation type and number of parameters\n");
+ png_debug(3, "Checking pCAL equation type and number of parameters");
/* Check that we have the right number of parameters for known
equation types. */
if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||
@@ -1640,7 +1671,8 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
(type == PNG_EQUATION_HYPERBOLIC && nparams != 4))
{
png_warning(png_ptr, "Invalid pCAL parameters for equation type");
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
else if (type >= PNG_EQUATION_LAST)
@@ -1651,12 +1683,13 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
for (buf = units; *buf; buf++)
/* Empty loop to move past the units string. */ ;
- png_debug(3, "Allocating pCAL parameters array\n");
- params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams
- *png_sizeof(png_charp))) ;
+ png_debug(3, "Allocating pCAL parameters array");
+ params = (png_charpp)png_malloc_warn(png_ptr,
+ (png_uint_32)(nparams * png_sizeof(png_charp))) ;
if (params == NULL)
{
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_warning(png_ptr, "No memory for pCAL params.");
return;
}
@@ -1666,7 +1699,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
buf++; /* Skip the null string terminator from previous parameter. */
- png_debug1(3, "Reading pCAL parameter %d\n", i);
+ png_debug1(3, "Reading pCAL parameter %d", i);
for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++)
/* Empty loop to move past each parameter string */ ;
@@ -1674,26 +1707,28 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (buf > endptr)
{
png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_free(png_ptr, params);
return;
}
}
- png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams,
+ png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams,
units, params);
- png_free(png_ptr, purpose);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_free(png_ptr, params);
}
#endif
#if defined(PNG_READ_sCAL_SUPPORTED)
-/* read the sCAL chunk */
+/* Read the sCAL chunk */
void /* PRIVATE */
png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
- png_charp buffer, ep;
+ png_charp ep;
#ifdef PNG_FLOATING_POINT_SUPPORTED
double width, height;
png_charp vp;
@@ -1704,7 +1739,7 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
png_size_t slength;
- png_debug(1, "in png_handle_sCAL\n");
+ png_debug(1, "in png_handle_sCAL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sCAL");
@@ -1721,88 +1756,91 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
return;
}
- png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n",
+ png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)",
length + 1);
- buffer = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (buffer == NULL)
- {
- png_warning(png_ptr, "Out of memory while processing sCAL chunk");
- return;
- }
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
+ {
+ png_warning(png_ptr, "Out of memory while processing sCAL chunk");
+ return;
+ }
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)buffer, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
{
- png_free(png_ptr, buffer);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- buffer[slength] = 0x00; /* null terminate the last string */
+ png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */
- ep = buffer + 1; /* skip unit byte */
+ ep = png_ptr->chunkdata + 1; /* Skip unit byte */
#ifdef PNG_FLOATING_POINT_SUPPORTED
width = png_strtod(png_ptr, ep, &vp);
if (*vp)
{
- png_warning(png_ptr, "malformed width string in sCAL chunk");
- return;
+ png_warning(png_ptr, "malformed width string in sCAL chunk");
+ return;
}
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1);
if (swidth == NULL)
- {
- png_warning(png_ptr, "Out of memory while processing sCAL chunk width");
- return;
- }
+ {
+ png_warning(png_ptr, "Out of memory while processing sCAL chunk width");
+ return;
+ }
png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));
#endif
#endif
- for (ep = buffer; *ep; ep++)
- /* empty loop */ ;
+ for (ep = png_ptr->chunkdata; *ep; ep++)
+ /* Empty loop */ ;
ep++;
- if (buffer + slength < ep)
+ if (png_ptr->chunkdata + slength < ep)
{
- png_warning(png_ptr, "Truncated sCAL chunk");
+ png_warning(png_ptr, "Truncated sCAL chunk");
#if defined(PNG_FIXED_POINT_SUPPORTED) && \
!defined(PNG_FLOATING_POINT_SUPPORTED)
- png_free(png_ptr, swidth);
+ png_free(png_ptr, swidth);
#endif
- png_free(png_ptr, buffer);
- return;
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
+ return;
}
#ifdef PNG_FLOATING_POINT_SUPPORTED
height = png_strtod(png_ptr, ep, &vp);
if (*vp)
{
- png_warning(png_ptr, "malformed height string in sCAL chunk");
- return;
+ png_warning(png_ptr, "malformed height string in sCAL chunk");
+ return;
}
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1);
if (sheight == NULL)
- {
- png_warning(png_ptr, "Out of memory while processing sCAL chunk height");
- return;
- }
+ {
+ png_warning(png_ptr, "Out of memory while processing sCAL chunk height");
+ return;
+ }
png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));
#endif
#endif
- if (buffer + slength < ep
+ if (png_ptr->chunkdata + slength < ep
#ifdef PNG_FLOATING_POINT_SUPPORTED
|| width <= 0. || height <= 0.
#endif
)
{
png_warning(png_ptr, "Invalid sCAL data");
- png_free(png_ptr, buffer);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
png_free(png_ptr, swidth);
png_free(png_ptr, sheight);
@@ -1812,14 +1850,15 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height);
+ png_set_sCAL(png_ptr, info_ptr, png_ptr->chunkdata[0], width, height);
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
- png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight);
+ png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], swidth, sheight);
#endif
#endif
- png_free(png_ptr, buffer);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
png_free(png_ptr, swidth);
png_free(png_ptr, sheight);
@@ -1834,7 +1873,7 @@ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_byte buf[7];
png_time mod_time;
- png_debug(1, "in png_handle_tIME\n");
+ png_debug(1, "in png_handle_tIME");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Out of place tIME chunk");
@@ -1882,7 +1921,8 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_size_t slength;
int ret;
- png_debug(1, "in png_handle_tEXt\n");
+ png_debug(1, "in png_handle_tEXt");
+
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before tEXt");
@@ -1899,25 +1939,30 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
- key = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (key == NULL)
+ png_free(png_ptr, png_ptr->chunkdata);
+
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "No memory to process text chunk.");
return;
}
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)key, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
{
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
+ key = png_ptr->chunkdata;
+
key[slength] = 0x00;
for (text = key; *text; text++)
- /* empty loop to find end of key */ ;
+ /* Empty loop to find end of key */ ;
if (text != key + slength)
text++;
@@ -1927,7 +1972,8 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (text_ptr == NULL)
{
png_warning(png_ptr, "Not enough memory to process text chunk.");
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
@@ -1940,9 +1986,10 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
text_ptr->text = text;
text_ptr->text_length = png_strlen(text);
- ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
+ ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_free(png_ptr, text_ptr);
if (ret)
png_warning(png_ptr, "Insufficient memory to process text chunk.");
@@ -1950,18 +1997,19 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
-/* note: this does not correctly handle chunks that are > 64K under DOS */
+/* Note: this does not correctly handle chunks that are > 64K under DOS */
void /* PRIVATE */
png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_textp text_ptr;
- png_charp chunkdata;
png_charp text;
int comp_type;
int ret;
png_size_t slength, prefix_len, data_len;
- png_debug(1, "in png_handle_zTXt\n");
+ png_debug(1, "in png_handle_zTXt");
+
+
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before zTXt");
@@ -1973,36 +2021,39 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
there is no hard and fast rule to tell us where to stop. */
if (length > (png_uint_32)65535L)
{
- png_warning(png_ptr,"zTXt chunk too large to fit in memory");
+ png_warning(png_ptr, "zTXt chunk too large to fit in memory");
png_crc_finish(png_ptr, length);
return;
}
#endif
- chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (chunkdata == NULL)
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
{
- png_warning(png_ptr,"Out of memory processing zTXt chunk.");
+ png_warning(png_ptr, "Out of memory processing zTXt chunk.");
return;
}
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- chunkdata[slength] = 0x00;
+ png_ptr->chunkdata[slength] = 0x00;
- for (text = chunkdata; *text; text++)
- /* empty loop */ ;
+ for (text = png_ptr->chunkdata; *text; text++)
+ /* Empty loop */ ;
/* zTXt must have some text after the chunkdataword */
- if (text >= chunkdata + slength - 2)
+ if (text >= png_ptr->chunkdata + slength - 2)
{
png_warning(png_ptr, "Truncated zTXt chunk");
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
else
@@ -2013,54 +2064,56 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_warning(png_ptr, "Unknown compression type in zTXt chunk");
comp_type = PNG_TEXT_COMPRESSION_zTXt;
}
- text++; /* skip the compression_method byte */
+ text++; /* Skip the compression_method byte */
}
- prefix_len = text - chunkdata;
+ prefix_len = text - png_ptr->chunkdata;
- chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata,
- (png_size_t)length, prefix_len, &data_len);
+ png_decompress_chunk(png_ptr, comp_type,
+ (png_size_t)length, prefix_len, &data_len);
text_ptr = (png_textp)png_malloc_warn(png_ptr,
- (png_uint_32)png_sizeof(png_text));
+ (png_uint_32)png_sizeof(png_text));
if (text_ptr == NULL)
{
- png_warning(png_ptr,"Not enough memory to process zTXt chunk.");
- png_free(png_ptr, chunkdata);
+ png_warning(png_ptr, "Not enough memory to process zTXt chunk.");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
text_ptr->compression = comp_type;
- text_ptr->key = chunkdata;
+ text_ptr->key = png_ptr->chunkdata;
#ifdef PNG_iTXt_SUPPORTED
text_ptr->lang = NULL;
text_ptr->lang_key = NULL;
text_ptr->itxt_length = 0;
#endif
- text_ptr->text = chunkdata + prefix_len;
+ text_ptr->text = png_ptr->chunkdata + prefix_len;
text_ptr->text_length = data_len;
- ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
+ ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
png_free(png_ptr, text_ptr);
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
if (ret)
png_error(png_ptr, "Insufficient memory to store zTXt chunk.");
}
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
-/* note: this does not correctly handle chunks that are > 64K under DOS */
+/* Note: this does not correctly handle chunks that are > 64K under DOS */
void /* PRIVATE */
png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_textp text_ptr;
- png_charp chunkdata;
png_charp key, lang, text, lang_key;
int comp_flag;
int comp_type = 0;
int ret;
png_size_t slength, prefix_len, data_len;
- png_debug(1, "in png_handle_iTXt\n");
+ png_debug(1, "in png_handle_iTXt");
+
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before iTXt");
@@ -2073,40 +2126,44 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
there is no hard and fast rule to tell us where to stop. */
if (length > (png_uint_32)65535L)
{
- png_warning(png_ptr,"iTXt chunk too large to fit in memory");
+ png_warning(png_ptr, "iTXt chunk too large to fit in memory");
png_crc_finish(png_ptr, length);
return;
}
#endif
- chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (chunkdata == NULL)
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "No memory to process iTXt chunk.");
return;
}
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, 0))
{
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- chunkdata[slength] = 0x00;
+ png_ptr->chunkdata[slength] = 0x00;
- for (lang = chunkdata; *lang; lang++)
- /* empty loop */ ;
- lang++; /* skip NUL separator */
+ for (lang = png_ptr->chunkdata; *lang; lang++)
+ /* Empty loop */ ;
+ lang++; /* Skip NUL separator */
/* iTXt must have a language tag (possibly empty), two compression bytes,
- translated keyword (possibly empty), and possibly some text after the
- keyword */
+ * translated keyword (possibly empty), and possibly some text after the
+ * keyword
+ */
- if (lang >= chunkdata + slength - 3)
+ if (lang >= png_ptr->chunkdata + slength - 3)
{
png_warning(png_ptr, "Truncated iTXt chunk");
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
else
@@ -2116,54 +2173,58 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
for (lang_key = lang; *lang_key; lang_key++)
- /* empty loop */ ;
- lang_key++; /* skip NUL separator */
+ /* Empty loop */ ;
+ lang_key++; /* Skip NUL separator */
- if (lang_key >= chunkdata + slength)
+ if (lang_key >= png_ptr->chunkdata + slength)
{
png_warning(png_ptr, "Truncated iTXt chunk");
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
for (text = lang_key; *text; text++)
- /* empty loop */ ;
- text++; /* skip NUL separator */
- if (text >= chunkdata + slength)
+ /* Empty loop */ ;
+ text++; /* Skip NUL separator */
+ if (text >= png_ptr->chunkdata + slength)
{
png_warning(png_ptr, "Malformed iTXt chunk");
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
- prefix_len = text - chunkdata;
+ prefix_len = text - png_ptr->chunkdata;
- key=chunkdata;
+ key=png_ptr->chunkdata;
if (comp_flag)
- chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata,
- (size_t)length, prefix_len, &data_len);
+ png_decompress_chunk(png_ptr, comp_type,
+ (size_t)length, prefix_len, &data_len);
else
- data_len=png_strlen(chunkdata + prefix_len);
+ data_len = png_strlen(png_ptr->chunkdata + prefix_len);
text_ptr = (png_textp)png_malloc_warn(png_ptr,
(png_uint_32)png_sizeof(png_text));
if (text_ptr == NULL)
{
- png_warning(png_ptr,"Not enough memory to process iTXt chunk.");
- png_free(png_ptr, chunkdata);
+ png_warning(png_ptr, "Not enough memory to process iTXt chunk.");
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
text_ptr->compression = (int)comp_flag + 1;
- text_ptr->lang_key = chunkdata+(lang_key-key);
- text_ptr->lang = chunkdata+(lang-key);
+ text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key);
+ text_ptr->lang = png_ptr->chunkdata + (lang - key);
text_ptr->itxt_length = data_len;
text_ptr->text_length = 0;
- text_ptr->key = chunkdata;
- text_ptr->text = chunkdata + prefix_len;
+ text_ptr->key = png_ptr->chunkdata;
+ text_ptr->text = png_ptr->chunkdata + prefix_len;
- ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
+ ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
png_free(png_ptr, text_ptr);
- png_free(png_ptr, chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
if (ret)
png_error(png_ptr, "Insufficient memory to store iTXt chunk.");
}
@@ -2179,23 +2240,22 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_uint_32 skip = 0;
- png_debug(1, "in png_handle_unknown\n");
+ png_debug(1, "in png_handle_unknown");
+
if (png_ptr->mode & PNG_HAVE_IDAT)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_CONST PNG_IDAT;
#endif
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */
+ if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* Not an IDAT */
png_ptr->mode |= PNG_AFTER_IDAT;
}
- png_check_chunk_name(png_ptr, png_ptr->chunk_name);
-
if (!(png_ptr->chunk_name[0] & 0x20))
{
-#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+ if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
PNG_HANDLE_CHUNK_ALWAYS
#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
&& png_ptr->read_user_chunk_fn == NULL
@@ -2206,8 +2266,11 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) ||
- (png_ptr->read_user_chunk_fn != NULL))
+ if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
+#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
+ || (png_ptr->read_user_chunk_fn != NULL)
+#endif
+ )
{
#ifdef PNG_MAX_MALLOC_64K
if (length > (png_uint_32)65535L)
@@ -2218,7 +2281,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
png_memcpy((png_charp)png_ptr->unknown_chunk.name,
- (png_charp)png_ptr->chunk_name,
+ (png_charp)png_ptr->chunk_name,
png_sizeof(png_ptr->unknown_chunk.name));
png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] = '\0';
png_ptr->unknown_chunk.size = (png_size_t)length;
@@ -2230,9 +2293,9 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length);
}
#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- if(png_ptr->read_user_chunk_fn != NULL)
+ if (png_ptr->read_user_chunk_fn != NULL)
{
- /* callback to user unknown chunk handler */
+ /* Callback to user unknown chunk handler */
int ret;
ret = (*(png_ptr->read_user_chunk_fn))
(png_ptr, &png_ptr->unknown_chunk);
@@ -2241,8 +2304,10 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (ret == 0)
{
if (!(png_ptr->chunk_name[0] & 0x20))
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
+#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+ if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
PNG_HANDLE_CHUNK_ALWAYS)
+#endif
png_chunk_error(png_ptr, "unknown critical chunk");
png_set_unknown_chunks(png_ptr, info_ptr,
&png_ptr->unknown_chunk, 1);
@@ -2261,7 +2326,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_crc_finish(png_ptr, skip);
#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */
+ info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */
#endif
}
@@ -2276,7 +2341,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
void /* PRIVATE */
png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)
{
- png_debug(1, "in png_check_chunk_name\n");
+ png_debug(1, "in png_check_chunk_name");
if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) ||
isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3]))
{
@@ -2298,7 +2363,7 @@ png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)
void /* PRIVATE */
png_combine_row(png_structp png_ptr, png_bytep row, int mask)
{
- png_debug(1,"in png_combine_row\n");
+ png_debug(1, "in png_combine_row");
if (mask == 0xff)
{
png_memcpy(row, png_ptr->row_buf + 1,
@@ -2509,12 +2574,12 @@ png_do_read_interlace(png_structp png_ptr)
int pass = png_ptr->pass;
png_uint_32 transformations = png_ptr->transformations;
#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* offset to next interlace block */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Offset to next interlace block */
PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
#endif
- png_debug(1,"in png_do_read_interlace\n");
+ png_debug(1, "in png_do_read_interlace");
if (row != NULL && row_info != NULL)
{
png_uint_32 final_width;
@@ -2715,10 +2780,10 @@ png_do_read_interlace(png_structp png_ptr)
}
}
row_info->width = final_width;
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,final_width);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width);
}
#if !defined(PNG_READ_PACKSWAP_SUPPORTED)
- transformations = transformations; /* silence compiler warning */
+ transformations = transformations; /* Silence compiler warning */
#endif
}
#endif /* PNG_READ_INTERLACING_SUPPORTED */
@@ -2727,8 +2792,8 @@ void /* PRIVATE */
png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
png_bytep prev_row, int filter)
{
- png_debug(1, "in png_read_filter_row\n");
- png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter);
+ png_debug(1, "in png_read_filter_row");
+ png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter);
switch (filter)
{
case PNG_FILTER_VALUE_NONE:
@@ -2802,7 +2867,7 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
rp++;
}
- for (i = 0; i < istop; i++) /* use leftover rp,pp */
+ for (i = 0; i < istop; i++) /* Use leftover rp,pp */
{
int a, b, c, pa, pb, pc, p;
@@ -2832,7 +2897,7 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
p = c;
*/
- p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
+ p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c;
*rp = (png_byte)(((int)(*rp) + p) & 0xff);
rp++;
@@ -2841,33 +2906,34 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
}
default:
png_warning(png_ptr, "Ignoring bad adaptive filter type");
- *row=0;
+ *row = 0;
break;
}
}
+#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
void /* PRIVATE */
png_read_finish_row(png_structp png_ptr)
{
#ifdef PNG_USE_LOCAL_ARRAYS
#ifdef PNG_READ_INTERLACING_SUPPORTED
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
- /* start of interlace block in the y direction */
+ /* Start of interlace block in the y direction */
PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
- /* offset to next interlace block in the y direction */
+ /* Offset to next interlace block in the y direction */
PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif /* PNG_READ_INTERLACING_SUPPORTED */
#endif
- png_debug(1, "in png_read_finish_row\n");
+ png_debug(1, "in png_read_finish_row");
png_ptr->row_number++;
if (png_ptr->row_number < png_ptr->num_rows)
return;
@@ -2919,7 +2985,7 @@ png_read_finish_row(png_structp png_ptr)
png_ptr->zstream.next_out = (Byte *)&extra;
png_ptr->zstream.avail_out = (uInt)1;
- for(;;)
+ for (;;)
{
if (!(png_ptr->zstream.avail_in))
{
@@ -2977,32 +3043,33 @@ png_read_finish_row(png_structp png_ptr)
png_ptr->mode |= PNG_AFTER_IDAT;
}
+#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
void /* PRIVATE */
png_read_start_row(png_structp png_ptr)
{
#ifdef PNG_USE_LOCAL_ARRAYS
#ifdef PNG_READ_INTERLACING_SUPPORTED
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
- /* start of interlace block in the y direction */
+ /* Start of interlace block in the y direction */
PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
- /* offset to next interlace block in the y direction */
+ /* Offset to next interlace block in the y direction */
PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
int max_pixel_depth;
- png_uint_32 row_bytes;
+ png_size_t row_bytes;
- png_debug(1, "in png_read_start_row\n");
+ png_debug(1, "in png_read_start_row");
png_ptr->zstream.avail_in = 0;
png_init_read_transformations(png_ptr);
#ifdef PNG_READ_INTERLACING_SUPPORTED
@@ -3019,11 +3086,8 @@ png_read_start_row(png_structp png_ptr)
png_pass_start[png_ptr->pass]) /
png_pass_inc[png_ptr->pass];
- row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1;
-
- png_ptr->irowbytes = (png_size_t)row_bytes;
- if((png_uint_32)png_ptr->irowbytes != row_bytes)
- png_error(png_ptr, "Rowbytes overflow in png_read_start_row");
+ png_ptr->irowbytes =
+ PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;
}
else
#endif /* PNG_READ_INTERLACING_SUPPORTED */
@@ -3125,58 +3189,63 @@ png_read_start_row(png_structp png_ptr)
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \
defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if(png_ptr->transformations & PNG_USER_TRANSFORM)
+ if (png_ptr->transformations & PNG_USER_TRANSFORM)
{
- int user_pixel_depth=png_ptr->user_transform_depth*
+ int user_pixel_depth = png_ptr->user_transform_depth*
png_ptr->user_transform_channels;
- if(user_pixel_depth > max_pixel_depth)
+ if (user_pixel_depth > max_pixel_depth)
max_pixel_depth=user_pixel_depth;
}
#endif
- /* align the width on the next larger 8 pixels. Mainly used
- for interlacing */
+ /* Align the width on the next larger 8 pixels. Mainly used
+ * for interlacing
+ */
row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7));
- /* calculate the maximum bytes needed, adding a byte and a pixel
- for safety's sake */
- row_bytes = PNG_ROWBYTES(max_pixel_depth,row_bytes) +
+ /* Calculate the maximum bytes needed, adding a byte and a pixel
+ * for safety's sake
+ */
+ row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) +
1 + ((max_pixel_depth + 7) >> 3);
#ifdef PNG_MAX_MALLOC_64K
if (row_bytes > (png_uint_32)65536L)
png_error(png_ptr, "This image requires a row greater than 64KB");
#endif
- if(row_bytes + 64 > png_ptr->old_big_row_buf_size)
+ if (row_bytes + 64 > png_ptr->old_big_row_buf_size)
{
- png_free(png_ptr,png_ptr->big_row_buf);
- png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64);
- png_ptr->row_buf = png_ptr->big_row_buf+32;
- png_ptr->old_big_row_buf_size = row_bytes+64;
+ png_free(png_ptr, png_ptr->big_row_buf);
+ png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 64);
+ if (png_ptr->interlaced)
+ png_memset(png_ptr->big_row_buf, 0, row_bytes + 64);
+ png_ptr->row_buf = png_ptr->big_row_buf + 32;
+ png_ptr->old_big_row_buf_size = row_bytes + 64;
}
#ifdef PNG_MAX_MALLOC_64K
- if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L)
+ if ((png_uint_32)row_bytes + 1 > (png_uint_32)65536L)
png_error(png_ptr, "This image requires a row greater than 64KB");
#endif
- if ((png_uint_32)png_ptr->rowbytes > (png_uint_32)(PNG_SIZE_MAX - 1))
+ if ((png_uint_32)row_bytes > (png_uint_32)(PNG_SIZE_MAX - 1))
png_error(png_ptr, "Row has too many bytes to allocate in memory.");
- if(png_ptr->rowbytes+1 > png_ptr->old_prev_row_size)
+ if (row_bytes + 1 > png_ptr->old_prev_row_size)
{
- png_free(png_ptr,png_ptr->prev_row);
- png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)(
- png_ptr->rowbytes + 1));
- png_ptr->old_prev_row_size = png_ptr->rowbytes+1;
+ png_free(png_ptr, png_ptr->prev_row);
+ png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)(
+ row_bytes + 1));
+ png_memset_check(png_ptr, png_ptr->prev_row, 0, row_bytes + 1);
+ png_ptr->old_prev_row_size = row_bytes + 1;
}
- png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
+ png_ptr->rowbytes = row_bytes;
- png_debug1(3, "width = %lu,\n", png_ptr->width);
- png_debug1(3, "height = %lu,\n", png_ptr->height);
- png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth);
- png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows);
- png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes);
- png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes);
+ png_debug1(3, "width = %lu,", png_ptr->width);
+ png_debug1(3, "height = %lu,", png_ptr->height);
+ png_debug1(3, "iwidth = %lu,", png_ptr->iwidth);
+ png_debug1(3, "num_rows = %lu,", png_ptr->num_rows);
+ png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes);
+ png_debug1(3, "irowbytes = %lu", png_ptr->irowbytes);
png_ptr->flags |= PNG_FLAG_ROW_INIT;
}
diff --git a/src/3rdparty/libpng/pngset.c b/src/3rdparty/libpng/pngset.c
index 8b25ca5..9e1b885 100644
--- a/src/3rdparty/libpng/pngset.c
+++ b/src/3rdparty/libpng/pngset.c
@@ -1,12 +1,15 @@
/* pngset.c - storage of image information into info struct
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.40 [September 10, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* The functions here are used during reads to store data from the file
* into the info struct, and during writes to store application data
* into the info struct for writing into the file. This abstracts the
@@ -15,14 +18,14 @@
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
#if defined(PNG_bKGD_SUPPORTED)
void PNGAPI
png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
{
- png_debug1(1, "in %s storage function\n", "bKGD");
+ png_debug1(1, "in %s storage function", "bKGD");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -38,34 +41,10 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
double white_x, double white_y, double red_x, double red_y,
double green_x, double green_y, double blue_x, double blue_y)
{
- png_debug1(1, "in %s storage function\n", "cHRM");
+ png_debug1(1, "in %s storage function", "cHRM");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
- blue_x || blue_y))
- {
- png_warning(png_ptr,
- "Ignoring attempt to set all-zero chromaticity values");
- return;
- }
- if (white_x < 0.0 || white_y < 0.0 ||
- red_x < 0.0 || red_y < 0.0 ||
- green_x < 0.0 || green_y < 0.0 ||
- blue_x < 0.0 || blue_y < 0.0)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set negative chromaticity value");
- return;
- }
- if (white_x > 21474.83 || white_y > 21474.83 ||
- red_x > 21474.83 || red_y > 21474.83 ||
- green_x > 21474.83 || green_y > 21474.83 ||
- blue_x > 21474.83 || blue_y > 21474.83)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set chromaticity value exceeding 21474.83");
- return;
- }
info_ptr->x_white = (float)white_x;
info_ptr->y_white = (float)white_y;
@@ -87,7 +66,8 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
#endif
info_ptr->valid |= PNG_INFO_cHRM;
}
-#endif
+#endif /* PNG_FLOATING_POINT_SUPPORTED */
+
#ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
@@ -95,69 +75,49 @@ png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
png_fixed_point blue_x, png_fixed_point blue_y)
{
- png_debug1(1, "in %s storage function\n", "cHRM");
+ png_debug1(1, "in %s storage function", "cHRM fixed");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
- blue_x || blue_y))
- {
- png_warning(png_ptr,
- "Ignoring attempt to set all-zero chromaticity values");
- return;
- }
- if (white_x < 0 || white_y < 0 ||
- red_x < 0 || red_y < 0 ||
- green_x < 0 || green_y < 0 ||
- blue_x < 0 || blue_y < 0)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set negative chromaticity value");
- return;
- }
- if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
- white_y > (png_fixed_point) PNG_UINT_31_MAX ||
- red_x > (png_fixed_point) PNG_UINT_31_MAX ||
- red_y > (png_fixed_point) PNG_UINT_31_MAX ||
- green_x > (png_fixed_point) PNG_UINT_31_MAX ||
- green_y > (png_fixed_point) PNG_UINT_31_MAX ||
- blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
- blue_y > (png_fixed_point) PNG_UINT_31_MAX )
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr,
+ white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
+#endif
{
- png_warning(png_ptr,
- "Ignoring attempt to set chromaticity value exceeding 21474.83");
- return;
+ info_ptr->int_x_white = white_x;
+ info_ptr->int_y_white = white_y;
+ info_ptr->int_x_red = red_x;
+ info_ptr->int_y_red = red_y;
+ info_ptr->int_x_green = green_x;
+ info_ptr->int_y_green = green_y;
+ info_ptr->int_x_blue = blue_x;
+ info_ptr->int_y_blue = blue_y;
+#ifdef PNG_FLOATING_POINT_SUPPORTED
+ info_ptr->x_white = (float)(white_x/100000.);
+ info_ptr->y_white = (float)(white_y/100000.);
+ info_ptr->x_red = (float)( red_x/100000.);
+ info_ptr->y_red = (float)( red_y/100000.);
+ info_ptr->x_green = (float)(green_x/100000.);
+ info_ptr->y_green = (float)(green_y/100000.);
+ info_ptr->x_blue = (float)( blue_x/100000.);
+ info_ptr->y_blue = (float)( blue_y/100000.);
+#endif
+ info_ptr->valid |= PNG_INFO_cHRM;
}
- info_ptr->int_x_white = white_x;
- info_ptr->int_y_white = white_y;
- info_ptr->int_x_red = red_x;
- info_ptr->int_y_red = red_y;
- info_ptr->int_x_green = green_x;
- info_ptr->int_y_green = green_y;
- info_ptr->int_x_blue = blue_x;
- info_ptr->int_y_blue = blue_y;
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->x_white = (float)(white_x/100000.);
- info_ptr->y_white = (float)(white_y/100000.);
- info_ptr->x_red = (float)( red_x/100000.);
- info_ptr->y_red = (float)( red_y/100000.);
- info_ptr->x_green = (float)(green_x/100000.);
- info_ptr->y_green = (float)(green_y/100000.);
- info_ptr->x_blue = (float)( blue_x/100000.);
- info_ptr->y_blue = (float)( blue_y/100000.);
-#endif
- info_ptr->valid |= PNG_INFO_cHRM;
}
-#endif
-#endif
+#endif /* PNG_FIXED_POINT_SUPPORTED */
+#endif /* PNG_cHRM_SUPPORTED */
#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
{
- double gamma;
- png_debug1(1, "in %s storage function\n", "gAMA");
+ double png_gamma;
+
+ png_debug1(1, "in %s storage function", "gAMA");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -165,16 +125,16 @@ png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
if (file_gamma > 21474.83)
{
png_warning(png_ptr, "Limiting gamma to 21474.83");
- gamma=21474.83;
+ png_gamma=21474.83;
}
else
- gamma=file_gamma;
- info_ptr->gamma = (float)gamma;
+ png_gamma = file_gamma;
+ info_ptr->gamma = (float)png_gamma;
#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_gamma = (int)(gamma*100000.+.5);
+ info_ptr->int_gamma = (int)(png_gamma*100000.+.5);
#endif
info_ptr->valid |= PNG_INFO_gAMA;
- if(gamma == 0.0)
+ if (png_gamma == 0.0)
png_warning(png_ptr, "Setting gamma=0");
}
#endif
@@ -182,35 +142,36 @@ void PNGAPI
png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
int_gamma)
{
- png_fixed_point gamma;
+ png_fixed_point png_gamma;
+
+ png_debug1(1, "in %s storage function", "gAMA");
- png_debug1(1, "in %s storage function\n", "gAMA");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX)
+ if (int_gamma > (png_fixed_point)PNG_UINT_31_MAX)
{
- png_warning(png_ptr, "Limiting gamma to 21474.83");
- gamma=PNG_UINT_31_MAX;
+ png_warning(png_ptr, "Limiting gamma to 21474.83");
+ png_gamma=PNG_UINT_31_MAX;
}
else
{
- if (int_gamma < 0)
- {
- png_warning(png_ptr, "Setting negative gamma to zero");
- gamma=0;
- }
- else
- gamma=int_gamma;
+ if (int_gamma < 0)
+ {
+ png_warning(png_ptr, "Setting negative gamma to zero");
+ png_gamma = 0;
+ }
+ else
+ png_gamma = int_gamma;
}
#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->gamma = (float)(gamma/100000.);
+ info_ptr->gamma = (float)(png_gamma/100000.);
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_gamma = gamma;
+ info_ptr->int_gamma = png_gamma;
#endif
info_ptr->valid |= PNG_INFO_gAMA;
- if(gamma == 0)
+ if (png_gamma == 0)
png_warning(png_ptr, "Setting gamma=0");
}
#endif
@@ -221,32 +182,35 @@ png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
{
int i;
- png_debug1(1, "in %s storage function\n", "hIST");
+ png_debug1(1, "in %s storage function", "hIST");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
+
if (info_ptr->num_palette == 0 || info_ptr->num_palette
> PNG_MAX_PALETTE_LENGTH)
{
- png_warning(png_ptr,
- "Invalid palette size, hIST allocation skipped.");
- return;
+ png_warning(png_ptr,
+ "Invalid palette size, hIST allocation skipped.");
+ return;
}
#ifdef PNG_FREE_ME_SUPPORTED
png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
#endif
- /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in version
- 1.2.1 */
+ /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
+ * version 1.2.1
+ */
png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
- (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof (png_uint_16)));
+ (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)));
if (png_ptr->hist == NULL)
- {
- png_warning(png_ptr, "Insufficient memory for hIST chunk data.");
- return;
- }
+ {
+ png_warning(png_ptr, "Insufficient memory for hIST chunk data.");
+ return;
+ }
for (i = 0; i < info_ptr->num_palette; i++)
- png_ptr->hist[i] = hist[i];
+ png_ptr->hist[i] = hist[i];
info_ptr->hist = png_ptr->hist;
info_ptr->valid |= PNG_INFO_hIST;
@@ -264,11 +228,12 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
int color_type, int interlace_type, int compression_type,
int filter_type)
{
- png_debug1(1, "in %s storage function\n", "IHDR");
+ png_debug1(1, "in %s storage function", "IHDR");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
- /* check for width and height valid values */
+ /* Check for width and height valid values */
if (width == 0 || height == 0)
png_error(png_ptr, "Image width or height is zero in IHDR");
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
@@ -288,13 +253,13 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
- 8) /* extra max_pixel_depth pad */
png_warning(png_ptr, "Width is too large for libpng to process pixels");
- /* check other values */
+ /* Check other values */
if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
- bit_depth != 8 && bit_depth != 16)
+ bit_depth != 8 && bit_depth != 16)
png_error(png_ptr, "Invalid bit depth in IHDR");
if (color_type < 0 || color_type == 1 ||
- color_type == 5 || color_type > 6)
+ color_type == 5 || color_type > 6)
png_error(png_ptr, "Invalid color type in IHDR");
if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
@@ -319,21 +284,21 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
* 4. The filter_method is 64 and
* 5. The color_type is RGB or RGBA
*/
- if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted)
- png_warning(png_ptr,"MNG features are not allowed in a PNG datastream");
- if(filter_type != PNG_FILTER_TYPE_BASE)
+ if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted)
+ png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
+ if (filter_type != PNG_FILTER_TYPE_BASE)
{
- if(!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
- ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
- (color_type == PNG_COLOR_TYPE_RGB ||
+ if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
+ ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
+ (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
png_error(png_ptr, "Unknown filter method in IHDR");
- if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)
+ if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)
png_warning(png_ptr, "Invalid filter method in IHDR");
}
#else
- if(filter_type != PNG_FILTER_TYPE_BASE)
+ if (filter_type != PNG_FILTER_TYPE_BASE)
png_error(png_ptr, "Unknown filter method in IHDR");
#endif
@@ -354,7 +319,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
info_ptr->channels++;
info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
- /* check for potential overflow */
+ /* Check for potential overflow */
if (width > (PNG_UINT_32_MAX
>> 3) /* 8-byte RGBA pixels */
- 64 /* bigrowbuf hack */
@@ -363,7 +328,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
- 8) /* extra max_pixel_depth pad */
info_ptr->rowbytes = (png_size_t)0;
else
- info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width);
+ info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
}
#if defined(PNG_oFFs_SUPPORTED)
@@ -371,7 +336,8 @@ void PNGAPI
png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
png_int_32 offset_x, png_int_32 offset_y, int unit_type)
{
- png_debug1(1, "in %s storage function\n", "oFFs");
+ png_debug1(1, "in %s storage function", "oFFs");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -391,56 +357,60 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 length;
int i;
- png_debug1(1, "in %s storage function\n", "pCAL");
+ png_debug1(1, "in %s storage function", "pCAL");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
length = png_strlen(purpose) + 1;
- png_debug1(3, "allocating purpose for info (%lu bytes)\n", length);
+ png_debug1(3, "allocating purpose for info (%lu bytes)",
+ (unsigned long)length);
info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_purpose == NULL)
- {
- png_warning(png_ptr, "Insufficient memory for pCAL purpose.");
- return;
- }
+ {
+ png_warning(png_ptr, "Insufficient memory for pCAL purpose.");
+ return;
+ }
png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length);
- png_debug(3, "storing X0, X1, type, and nparams in info\n");
+ png_debug(3, "storing X0, X1, type, and nparams in info");
info_ptr->pcal_X0 = X0;
info_ptr->pcal_X1 = X1;
info_ptr->pcal_type = (png_byte)type;
info_ptr->pcal_nparams = (png_byte)nparams;
length = png_strlen(units) + 1;
- png_debug1(3, "allocating units for info (%lu bytes)\n", length);
+ png_debug1(3, "allocating units for info (%lu bytes)",
+ (unsigned long)length);
info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_units == NULL)
- {
- png_warning(png_ptr, "Insufficient memory for pCAL units.");
- return;
- }
+ {
+ png_warning(png_ptr, "Insufficient memory for pCAL units.");
+ return;
+ }
png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);
info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
(png_uint_32)((nparams + 1) * png_sizeof(png_charp)));
if (info_ptr->pcal_params == NULL)
- {
- png_warning(png_ptr, "Insufficient memory for pCAL params.");
- return;
- }
+ {
+ png_warning(png_ptr, "Insufficient memory for pCAL params.");
+ return;
+ }
- info_ptr->pcal_params[nparams] = NULL;
+ png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));
for (i = 0; i < nparams; i++)
{
length = png_strlen(params[i]) + 1;
- png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, length);
+ png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
+ (unsigned long)length);
info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_params[i] == NULL)
- {
- png_warning(png_ptr, "Insufficient memory for pCAL parameter.");
- return;
- }
+ {
+ png_warning(png_ptr, "Insufficient memory for pCAL parameter.");
+ return;
+ }
png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);
}
@@ -457,7 +427,8 @@ void PNGAPI
png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
int unit, double width, double height)
{
- png_debug1(1, "in %s storage function\n", "sCAL");
+ png_debug1(1, "in %s storage function", "sCAL");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -475,14 +446,16 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
{
png_uint_32 length;
- png_debug1(1, "in %s storage function\n", "sCAL");
+ png_debug1(1, "in %s storage function", "sCAL");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->scal_unit = (png_byte)unit;
length = png_strlen(swidth) + 1;
- png_debug1(3, "allocating unit for info (%d bytes)\n", length);
+ png_debug1(3, "allocating unit for info (%u bytes)",
+ (unsigned int)length);
info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->scal_s_width == NULL)
{
@@ -493,11 +466,13 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);
length = png_strlen(sheight) + 1;
- png_debug1(3, "allocating unit for info (%d bytes)\n", length);
+ png_debug1(3, "allocating unit for info (%u bytes)",
+ (unsigned int)length);
info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->scal_s_height == NULL)
{
png_free (png_ptr, info_ptr->scal_s_width);
+ info_ptr->scal_s_width = NULL;
png_warning(png_ptr,
"Memory allocation failed while processing sCAL.");
return;
@@ -517,7 +492,8 @@ void PNGAPI
png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
png_uint_32 res_x, png_uint_32 res_y, int unit_type)
{
- png_debug1(1, "in %s storage function\n", "pHYs");
+ png_debug1(1, "in %s storage function", "pHYs");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -533,20 +509,21 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
png_colorp palette, int num_palette)
{
- png_debug1(1, "in %s storage function\n", "PLTE");
+ png_debug1(1, "in %s storage function", "PLTE");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
- {
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
png_error(png_ptr, "Invalid palette length");
- else
- {
+ else
+ {
png_warning(png_ptr, "Invalid palette length");
return;
- }
- }
+ }
+ }
/*
* It may not actually be necessary to set png_ptr->palette here;
@@ -558,13 +535,14 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
#endif
/* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
- of num_palette entries,
- in case of an invalid PNG file that has too-large sample values. */
+ * of num_palette entries, in case of an invalid PNG file that has
+ * too-large sample values.
+ */
png_ptr->palette = (png_colorp)png_malloc(png_ptr,
PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH *
png_sizeof(png_color));
- png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof (png_color));
+ png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
info_ptr->palette = png_ptr->palette;
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
@@ -582,11 +560,12 @@ void PNGAPI
png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
png_color_8p sig_bit)
{
- png_debug1(1, "in %s storage function\n", "sBIT");
+ png_debug1(1, "in %s storage function", "sBIT");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
- png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof (png_color_8));
+ png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
info_ptr->valid |= PNG_INFO_sBIT;
}
#endif
@@ -595,7 +574,8 @@ png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
void PNGAPI
png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
{
- png_debug1(1, "in %s storage function\n", "sRGB");
+ png_debug1(1, "in %s storage function", "sRGB");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -619,12 +599,11 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_FLOATING_POINT_SUPPORTED
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
int_green_y, int_blue_x, int_blue_y;
#endif
-#endif
- png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
+ png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -642,7 +621,6 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
#endif
#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FIXED_POINT_SUPPORTED
int_white_x = 31270L;
int_white_y = 32900L;
int_red_x = 64000L;
@@ -652,10 +630,6 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
int_blue_x = 15000L;
int_blue_y = 6000L;
- png_set_cHRM_fixed(png_ptr, info_ptr,
- int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y,
- int_blue_x, int_blue_y);
-#endif
#ifdef PNG_FLOATING_POINT_SUPPORTED
white_x = (float).3127;
white_y = (float).3290;
@@ -665,13 +639,27 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
green_y = (float).60;
blue_x = (float).15;
blue_y = (float).06;
+#endif
- png_set_cHRM(png_ptr, info_ptr,
- white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr,
+ int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
+ int_green_y, int_blue_x, int_blue_y))
#endif
+ {
+#ifdef PNG_FIXED_POINT_SUPPORTED
+ png_set_cHRM_fixed(png_ptr, info_ptr,
+ int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
+ int_green_y, int_blue_x, int_blue_y);
#endif
-}
+#ifdef PNG_FLOATING_POINT_SUPPORTED
+ png_set_cHRM(png_ptr, info_ptr,
+ white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
#endif
+ }
+#endif /* cHRM */
+}
+#endif /* sRGB */
#if defined(PNG_iCCP_SUPPORTED)
@@ -684,7 +672,8 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
png_charp new_iccp_profile;
png_uint_32 length;
- png_debug1(1, "in %s storage function\n", "iCCP");
+ png_debug1(1, "in %s storage function", "iCCP");
+
if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
return;
@@ -700,7 +689,8 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
if (new_iccp_profile == NULL)
{
png_free (png_ptr, new_iccp_name);
- png_warning(png_ptr, "Insufficient memory to process iCCP profile.");
+ png_warning(png_ptr,
+ "Insufficient memory to process iCCP profile.");
return;
}
png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
@@ -723,21 +713,22 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
#if defined(PNG_TEXT_SUPPORTED)
void PNGAPI
png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
- int num_text)
+ int num_text)
{
int ret;
- ret=png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
+ ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
if (ret)
- png_error(png_ptr, "Insufficient memory to store text");
+ png_error(png_ptr, "Insufficient memory to store text");
}
int /* PRIVATE */
png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
- int num_text)
+ int num_text)
{
int i;
- png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ?
+ png_debug1(1, "in %s storage function", ((png_ptr == NULL ||
+ png_ptr->chunk_name[0] == '\0') ?
"text" : (png_const_charp)png_ptr->chunk_name));
if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
@@ -757,12 +748,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
info_ptr->max_text = info_ptr->num_text + num_text + 8;
old_text = info_ptr->text;
info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
- (png_uint_32)(info_ptr->max_text * png_sizeof (png_text)));
+ (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
if (info_ptr->text == NULL)
- {
- png_free(png_ptr, old_text);
- return(1);
- }
+ {
+ png_free(png_ptr, old_text);
+ return(1);
+ }
png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
png_sizeof(png_text)));
png_free(png_ptr, old_text);
@@ -772,20 +763,20 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
info_ptr->max_text = num_text + 8;
info_ptr->num_text = 0;
info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
- (png_uint_32)(info_ptr->max_text * png_sizeof (png_text)));
+ (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
if (info_ptr->text == NULL)
- return(1);
+ return(1);
#ifdef PNG_FREE_ME_SUPPORTED
info_ptr->free_me |= PNG_FREE_TEXT;
#endif
}
- png_debug1(3, "allocated %d entries for info_ptr->text\n",
+ png_debug1(3, "allocated %d entries for info_ptr->text",
info_ptr->max_text);
}
for (i = 0; i < num_text; i++)
{
- png_size_t text_length,key_len;
- png_size_t lang_len,lang_key_len;
+ png_size_t text_length, key_len;
+ png_size_t lang_len, lang_key_len;
png_textp textp = &(info_ptr->text[info_ptr->num_text]);
if (text_ptr[i].key == NULL)
@@ -793,28 +784,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
key_len = png_strlen(text_ptr[i].key);
- if(text_ptr[i].compression <= 0)
+ if (text_ptr[i].compression <= 0)
{
- lang_len = 0;
- lang_key_len = 0;
+ lang_len = 0;
+ lang_key_len = 0;
}
else
#ifdef PNG_iTXt_SUPPORTED
{
- /* set iTXt data */
- if (text_ptr[i].lang != NULL)
- lang_len = png_strlen(text_ptr[i].lang);
- else
- lang_len = 0;
- if (text_ptr[i].lang_key != NULL)
- lang_key_len = png_strlen(text_ptr[i].lang_key);
- else
- lang_key_len = 0;
+ /* Set iTXt data */
+ if (text_ptr[i].lang != NULL)
+ lang_len = png_strlen(text_ptr[i].lang);
+ else
+ lang_len = 0;
+ if (text_ptr[i].lang_key != NULL)
+ lang_key_len = png_strlen(text_ptr[i].lang_key);
+ else
+ lang_key_len = 0;
}
#else
{
- png_warning(png_ptr, "iTXt chunk not supported.");
- continue;
+ png_warning(png_ptr, "iTXt chunk not supported.");
+ continue;
}
#endif
@@ -822,7 +813,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
{
text_length = 0;
#ifdef PNG_iTXt_SUPPORTED
- if(text_ptr[i].compression > 0)
+ if (text_ptr[i].compression > 0)
textp->compression = PNG_ITXT_COMPRESSION_NONE;
else
#endif
@@ -835,26 +826,27 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
}
textp->key = (png_charp)png_malloc_warn(png_ptr,
- (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4));
+ (png_uint_32)
+ (key_len + text_length + lang_len + lang_key_len + 4));
if (textp->key == NULL)
- return(1);
- png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n",
- (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4),
- (int)textp->key);
-
- png_memcpy(textp->key, text_ptr[i].key,
- (png_size_t)(key_len));
- *(textp->key+key_len) = '\0';
+ return(1);
+ png_debug2(2, "Allocated %lu bytes at %x in png_set_text",
+ (png_uint_32)
+ (key_len + lang_len + lang_key_len + text_length + 4),
+ (int)textp->key);
+
+ png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
+ *(textp->key + key_len) = '\0';
#ifdef PNG_iTXt_SUPPORTED
if (text_ptr[i].compression > 0)
{
- textp->lang=textp->key + key_len + 1;
+ textp->lang = textp->key + key_len + 1;
png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
- *(textp->lang+lang_len) = '\0';
- textp->lang_key=textp->lang + lang_len + 1;
+ *(textp->lang + lang_len) = '\0';
+ textp->lang_key = textp->lang + lang_len + 1;
png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
- *(textp->lang_key+lang_key_len) = '\0';
- textp->text=textp->lang_key + lang_key_len + 1;
+ *(textp->lang_key + lang_key_len) = '\0';
+ textp->text = textp->lang_key + lang_key_len + 1;
}
else
#endif
@@ -863,15 +855,15 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
textp->lang=NULL;
textp->lang_key=NULL;
#endif
- textp->text=textp->key + key_len + 1;
+ textp->text = textp->key + key_len + 1;
}
- if(text_length)
+ if (text_length)
png_memcpy(textp->text, text_ptr[i].text,
(png_size_t)(text_length));
- *(textp->text+text_length) = '\0';
+ *(textp->text + text_length) = '\0';
#ifdef PNG_iTXt_SUPPORTED
- if(textp->compression > 0)
+ if (textp->compression > 0)
{
textp->text_length = 0;
textp->itxt_length = text_length;
@@ -885,7 +877,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
#endif
}
info_ptr->num_text++;
- png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text);
+ png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
}
return(0);
}
@@ -895,12 +887,13 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
void PNGAPI
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
{
- png_debug1(1, "in %s storage function\n", "tIME");
+ png_debug1(1, "in %s storage function", "tIME");
+
if (png_ptr == NULL || info_ptr == NULL ||
(png_ptr->mode & PNG_WROTE_tIME))
return;
- png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof (png_time));
+ png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
info_ptr->valid |= PNG_INFO_tIME;
}
#endif
@@ -910,12 +903,11 @@ void PNGAPI
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
png_bytep trans, int num_trans, png_color_16p trans_values)
{
- png_debug1(1, "in %s storage function\n", "tRNS");
+ png_debug1(1, "in %s storage function", "tRNS");
+
if (png_ptr == NULL || info_ptr == NULL)
return;
- png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
-
if (trans != NULL)
{
/*
@@ -924,11 +916,15 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
* function used to do the allocation.
*/
+#ifdef PNG_FREE_ME_SUPPORTED
+ png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
+#endif
+
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr,
(png_uint_32)PNG_MAX_PALETTE_LENGTH);
if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
- png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);
+ png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);
}
if (trans_values != NULL)
@@ -940,12 +936,12 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
((int)trans_values->red > sample_max ||
(int)trans_values->green > sample_max ||
(int)trans_values->blue > sample_max)))
- png_warning(png_ptr,
- "tRNS chunk has out-of-range samples for bit_depth");
+ png_warning(png_ptr,
+ "tRNS chunk has out-of-range samples for bit_depth");
png_memcpy(&(info_ptr->trans_values), trans_values,
png_sizeof(png_color_16));
if (num_trans == 0)
- num_trans = 1;
+ num_trans = 1;
}
info_ptr->num_trans = (png_uint_16)num_trans;
@@ -965,132 +961,141 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
void PNGAPI
png_set_sPLT(png_structp png_ptr,
png_infop info_ptr, png_sPLT_tp entries, int nentries)
+/*
+ * entries - array of png_sPLT_t structures
+ * to be added to the list of palettes
+ * in the info structure.
+ * nentries - number of palette structures to be
+ * added.
+ */
{
- png_sPLT_tp np;
- int i;
+ png_sPLT_tp np;
+ int i;
- if (png_ptr == NULL || info_ptr == NULL)
- return;
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
- np = (png_sPLT_tp)png_malloc_warn(png_ptr,
- (info_ptr->splt_palettes_num + nentries) * png_sizeof(png_sPLT_t));
- if (np == NULL)
- {
+ np = (png_sPLT_tp)png_malloc_warn(png_ptr,
+ (info_ptr->splt_palettes_num + nentries) *
+ (png_uint_32)png_sizeof(png_sPLT_t));
+ if (np == NULL)
+ {
png_warning(png_ptr, "No memory for sPLT palettes.");
- return;
- }
+ return;
+ }
- png_memcpy(np, info_ptr->splt_palettes,
- info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
- png_free(png_ptr, info_ptr->splt_palettes);
- info_ptr->splt_palettes=NULL;
+ png_memcpy(np, info_ptr->splt_palettes,
+ info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
+ png_free(png_ptr, info_ptr->splt_palettes);
+ info_ptr->splt_palettes=NULL;
- for (i = 0; i < nentries; i++)
- {
- png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
- png_sPLT_tp from = entries + i;
- png_uint_32 length;
+ for (i = 0; i < nentries; i++)
+ {
+ png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
+ png_sPLT_tp from = entries + i;
+ png_uint_32 length;
- length = png_strlen(from->name) + 1;
+ length = png_strlen(from->name) + 1;
to->name = (png_charp)png_malloc_warn(png_ptr, length);
- if (to->name == NULL)
- {
- png_warning(png_ptr,
- "Out of memory while processing sPLT chunk");
- continue;
- }
- png_memcpy(to->name, from->name, length);
- to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
- from->nentries * png_sizeof(png_sPLT_entry));
- if (to->entries == NULL)
- {
- png_warning(png_ptr,
- "Out of memory while processing sPLT chunk");
- png_free(png_ptr,to->name);
- to->name = NULL;
- continue;
- }
- png_memcpy(to->entries, from->entries,
- from->nentries * png_sizeof(png_sPLT_entry));
- to->nentries = from->nentries;
- to->depth = from->depth;
- }
-
- info_ptr->splt_palettes = np;
- info_ptr->splt_palettes_num += nentries;
- info_ptr->valid |= PNG_INFO_sPLT;
+ if (to->name == NULL)
+ {
+ png_warning(png_ptr,
+ "Out of memory while processing sPLT chunk");
+ continue;
+ }
+ png_memcpy(to->name, from->name, length);
+ to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
+ (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry)));
+ if (to->entries == NULL)
+ {
+ png_warning(png_ptr,
+ "Out of memory while processing sPLT chunk");
+ png_free(png_ptr, to->name);
+ to->name = NULL;
+ continue;
+ }
+ png_memcpy(to->entries, from->entries,
+ from->nentries * png_sizeof(png_sPLT_entry));
+ to->nentries = from->nentries;
+ to->depth = from->depth;
+ }
+
+ info_ptr->splt_palettes = np;
+ info_ptr->splt_palettes_num += nentries;
+ info_ptr->valid |= PNG_INFO_sPLT;
#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_SPLT;
+ info_ptr->free_me |= PNG_FREE_SPLT;
#endif
}
#endif /* PNG_sPLT_SUPPORTED */
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
void PNGAPI
png_set_unknown_chunks(png_structp png_ptr,
png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)
{
- png_unknown_chunkp np;
- int i;
-
- if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
- return;
-
- np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
- (info_ptr->unknown_chunks_num + num_unknowns) *
- png_sizeof(png_unknown_chunk));
- if (np == NULL)
- {
- png_warning(png_ptr,
- "Out of memory while processing unknown chunk.");
- return;
- }
-
- png_memcpy(np, info_ptr->unknown_chunks,
- info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk));
- png_free(png_ptr, info_ptr->unknown_chunks);
- info_ptr->unknown_chunks=NULL;
-
- for (i = 0; i < num_unknowns; i++)
- {
- png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
- png_unknown_chunkp from = unknowns + i;
-
- png_memcpy((png_charp)to->name,
- (png_charp)from->name,
- png_sizeof(from->name));
- to->name[png_sizeof(to->name)-1] = '\0';
- to->size = from->size;
- /* note our location in the read or write sequence */
- to->location = (png_byte)(png_ptr->mode & 0xff);
-
- if (from->size == 0)
- to->data=NULL;
- else
- {
- to->data = (png_bytep)png_malloc_warn(png_ptr, from->size);
- if (to->data == NULL)
- {
- png_warning(png_ptr,
- "Out of memory while processing unknown chunk.");
- to->size=0;
- }
- else
- png_memcpy(to->data, from->data, from->size);
- }
- }
-
- info_ptr->unknown_chunks = np;
- info_ptr->unknown_chunks_num += num_unknowns;
+ png_unknown_chunkp np;
+ int i;
+
+ if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
+ return;
+
+ np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
+ (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) *
+ png_sizeof(png_unknown_chunk)));
+ if (np == NULL)
+ {
+ png_warning(png_ptr,
+ "Out of memory while processing unknown chunk.");
+ return;
+ }
+
+ png_memcpy(np, info_ptr->unknown_chunks,
+ info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk));
+ png_free(png_ptr, info_ptr->unknown_chunks);
+ info_ptr->unknown_chunks=NULL;
+
+ for (i = 0; i < num_unknowns; i++)
+ {
+ png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
+ png_unknown_chunkp from = unknowns + i;
+
+ png_memcpy((png_charp)to->name,
+ (png_charp)from->name,
+ png_sizeof(from->name));
+ to->name[png_sizeof(to->name)-1] = '\0';
+ to->size = from->size;
+ /* Note our location in the read or write sequence */
+ to->location = (png_byte)(png_ptr->mode & 0xff);
+
+ if (from->size == 0)
+ to->data=NULL;
+ else
+ {
+ to->data = (png_bytep)png_malloc_warn(png_ptr,
+ (png_uint_32)from->size);
+ if (to->data == NULL)
+ {
+ png_warning(png_ptr,
+ "Out of memory while processing unknown chunk.");
+ to->size = 0;
+ }
+ else
+ png_memcpy(to->data, from->data, from->size);
+ }
+ }
+
+ info_ptr->unknown_chunks = np;
+ info_ptr->unknown_chunks_num += num_unknowns;
#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_UNKN;
+ info_ptr->free_me |= PNG_FREE_UNKN;
#endif
}
void PNGAPI
png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
int chunk, int location)
{
- if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
+ if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
(int)info_ptr->unknown_chunks_num)
info_ptr->unknown_chunks[chunk].location = (png_byte)location;
}
@@ -1104,7 +1109,9 @@ png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
{
/* This function is deprecated in favor of png_permit_mng_features()
and will be removed from libpng-1.3.0 */
- png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n");
+
+ png_debug(1, "in png_permit_empty_plte, DEPRECATED.");
+
if (png_ptr == NULL)
return;
png_ptr->mng_features_permitted = (png_byte)
@@ -1118,7 +1125,8 @@ png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
png_uint_32 PNGAPI
png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
{
- png_debug(1, "in png_permit_mng_features\n");
+ png_debug(1, "in png_permit_mng_features");
+
if (png_ptr == NULL)
return (png_uint_32)0;
png_ptr->mng_features_permitted =
@@ -1132,43 +1140,44 @@ void PNGAPI
png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep
chunk_list, int num_chunks)
{
- png_bytep new_list, p;
- int i, old_num_chunks;
- if (png_ptr == NULL)
- return;
- if (num_chunks == 0)
- {
- if(keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
- png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
+ png_bytep new_list, p;
+ int i, old_num_chunks;
+ if (png_ptr == NULL)
+ return;
+ if (num_chunks == 0)
+ {
+ if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
+ png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
+ png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
- if(keep == PNG_HANDLE_CHUNK_ALWAYS)
- png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
+ if (keep == PNG_HANDLE_CHUNK_ALWAYS)
+ png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
+ png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
return;
- }
- if (chunk_list == NULL)
+ }
+ if (chunk_list == NULL)
return;
- old_num_chunks=png_ptr->num_chunk_list;
- new_list=(png_bytep)png_malloc(png_ptr,
- (png_uint_32)(5*(num_chunks+old_num_chunks)));
- if(png_ptr->chunk_list != NULL)
- {
- png_memcpy(new_list, png_ptr->chunk_list,
- (png_size_t)(5*old_num_chunks));
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
- }
- png_memcpy(new_list+5*old_num_chunks, chunk_list,
- (png_size_t)(5*num_chunks));
- for (p=new_list+5*old_num_chunks+4, i=0; i<num_chunks; i++, p+=5)
- *p=(png_byte)keep;
- png_ptr->num_chunk_list=old_num_chunks+num_chunks;
- png_ptr->chunk_list=new_list;
+ old_num_chunks = png_ptr->num_chunk_list;
+ new_list=(png_bytep)png_malloc(png_ptr,
+ (png_uint_32)
+ (5*(num_chunks + old_num_chunks)));
+ if (png_ptr->chunk_list != NULL)
+ {
+ png_memcpy(new_list, png_ptr->chunk_list,
+ (png_size_t)(5*old_num_chunks));
+ png_free(png_ptr, png_ptr->chunk_list);
+ png_ptr->chunk_list=NULL;
+ }
+ png_memcpy(new_list + 5*old_num_chunks, chunk_list,
+ (png_size_t)(5*num_chunks));
+ for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
+ *p=(png_byte)keep;
+ png_ptr->num_chunk_list = old_num_chunks + num_chunks;
+ png_ptr->chunk_list = new_list;
#ifdef PNG_FREE_ME_SUPPORTED
- png_ptr->free_me |= PNG_FREE_LIST;
+ png_ptr->free_me |= PNG_FREE_LIST;
#endif
}
#endif
@@ -1178,9 +1187,11 @@ void PNGAPI
png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
png_user_chunk_ptr read_user_chunk_fn)
{
- png_debug(1, "in png_set_read_user_chunk_fn\n");
+ png_debug(1, "in png_set_read_user_chunk_fn");
+
if (png_ptr == NULL)
return;
+
png_ptr->read_user_chunk_fn = read_user_chunk_fn;
png_ptr->user_chunk_ptr = user_chunk_ptr;
}
@@ -1190,22 +1201,23 @@ png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
void PNGAPI
png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
{
- png_debug1(1, "in %s storage function\n", "rows");
+ png_debug1(1, "in %s storage function", "rows");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if(info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
+ if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
info_ptr->row_pointers = row_pointers;
- if(row_pointers)
+ if (row_pointers)
info_ptr->valid |= PNG_INFO_IDAT;
}
#endif
#ifdef PNG_WRITE_SUPPORTED
void PNGAPI
-png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size)
+png_set_compression_buffer_size(png_structp png_ptr,
+ png_uint_32 size)
{
if (png_ptr == NULL)
return;
@@ -1227,16 +1239,17 @@ png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
#ifndef PNG_1_0_X
#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
-/* function was added to libpng 1.2.0 and should always exist by default */
+/* Function was added to libpng 1.2.0 and should always exist by default */
void PNGAPI
png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags)
{
/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
if (png_ptr != NULL)
png_ptr->asm_flags = 0;
+ asm_flags = asm_flags; /* Quiet the compiler */
}
-/* this function was added to libpng 1.2.0 */
+/* This function was added to libpng 1.2.0 */
void PNGAPI
png_set_mmx_thresholds (png_structp png_ptr,
png_byte mmx_bitdepth_threshold,
@@ -1245,22 +1258,26 @@ png_set_mmx_thresholds (png_structp png_ptr,
/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
if (png_ptr == NULL)
return;
+ /* Quiet the compiler */
+ mmx_bitdepth_threshold = mmx_bitdepth_threshold;
+ mmx_rowbytes_threshold = mmx_rowbytes_threshold;
}
#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
-/* this function was added to libpng 1.2.6 */
+/* This function was added to libpng 1.2.6 */
void PNGAPI
png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
png_uint_32 user_height_max)
{
- /* Images with dimensions larger than these limits will be
- * rejected by png_set_IHDR(). To accept any PNG datastream
- * regardless of dimensions, set both limits to 0x7ffffffL.
- */
- if(png_ptr == NULL) return;
- png_ptr->user_width_max = user_width_max;
- png_ptr->user_height_max = user_height_max;
+ /* Images with dimensions larger than these limits will be
+ * rejected by png_set_IHDR(). To accept any PNG datastream
+ * regardless of dimensions, set both limits to 0x7ffffffL.
+ */
+ if (png_ptr == NULL)
+ return;
+ png_ptr->user_width_max = user_width_max;
+ png_ptr->user_height_max = user_height_max;
}
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
diff --git a/src/3rdparty/libpng/pngtest.c b/src/3rdparty/libpng/pngtest.c
index 60980c2..4142fd8 100644
--- a/src/3rdparty/libpng/pngtest.c
+++ b/src/3rdparty/libpng/pngtest.c
@@ -1,12 +1,15 @@
/* pngtest.c - a simple test program to test libpng
*
- * Last changed in libpng 1.2.27 - [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This program reads in a PNG image, writes it out again, and then
* compares the two files. If the files are identical, this shows that
* the basic chunk handling, filtering, and (de)compression code is working
@@ -37,7 +40,7 @@
# include <windows.h>
# include <stdlib.h>
# define READFILE(file, data, length, check) \
- if (ReadFile(file, data, length, &check,NULL)) check = 0
+ if (ReadFile(file, data, length, &check, NULL)) check = 0
# define WRITEFILE(file, data, length, check)) \
if (WriteFile(file, data, length, &check, NULL)) check = 0
# define FCLOSE(file) CloseHandle(file)
@@ -45,9 +48,9 @@
# include <stdio.h>
# include <stdlib.h>
# define READFILE(file, data, length, check) \
- check=(png_size_t)fread(data,(png_size_t)1,length,file)
+ check=(png_size_t)fread(data, (png_size_t)1, length, file)
# define WRITEFILE(file, data, length, check) \
- check=(png_size_t)fwrite(data,(png_size_t)1, length, file)
+ check=(png_size_t)fwrite(data, (png_size_t)1, length, file)
# define FCLOSE(file) fclose(file)
#endif
@@ -65,7 +68,7 @@
#endif
#if !PNG_DEBUG
-# define SINGLE_ROWBUF_ALLOC /* makes buffer overruns easier to nail */
+# define SINGLE_ROWBUF_ALLOC /* Makes buffer overruns easier to nail */
#endif
/* Turn on CPU timing
@@ -82,9 +85,9 @@ static float t_start, t_stop, t_decode, t_encode, t_misc;
#endif
#if defined(PNG_TIME_RFC1123_SUPPORTED)
-#define PNG_tIME_STRING_LENGTH 30
-static int tIME_chunk_present=0;
-static char tIME_string[PNG_tIME_STRING_LENGTH] = "no tIME chunk present in file";
+#define PNG_tIME_STRING_LENGTH 29
+static int tIME_chunk_present = 0;
+static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present";
#endif
static int verbose = 0;
@@ -95,14 +98,9 @@ int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname));
#include <mem.h>
#endif
-/* defined so I can write to a file on gui/windowing platforms */
+/* Defined so I can write to a file on gui/windowing platforms */
/* #define STDERR stderr */
-#define STDERR stdout /* for DOS */
-
-/* example of using row callbacks to make a simple progress meter */
-static int status_pass=1;
-static int status_dots_requested=0;
-static int status_dots=1;
+#define STDERR stdout /* For DOS */
/* In case a system header (e.g., on AIX) defined jmpbuf */
#ifdef jmpbuf
@@ -114,6 +112,11 @@ static int status_dots=1;
# define png_jmpbuf(png_ptr) png_ptr->jmpbuf
#endif
+/* Example of using row callbacks to make a simple progress meter */
+static int status_pass = 1;
+static int status_dots_requested = 0;
+static int status_dots = 1;
+
void
#ifdef PNG_1_0_X
PNGAPI
@@ -125,20 +128,21 @@ PNGAPI
#endif
read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
{
- if(png_ptr == NULL || row_number > PNG_UINT_31_MAX) return;
- if(status_pass != pass)
- {
- fprintf(stdout,"\n Pass %d: ",pass);
- status_pass = pass;
- status_dots = 31;
- }
- status_dots--;
- if(status_dots == 0)
- {
- fprintf(stdout, "\n ");
- status_dots=30;
- }
- fprintf(stdout, "r");
+ if (png_ptr == NULL || row_number > PNG_UINT_31_MAX)
+ return;
+ if (status_pass != pass)
+ {
+ fprintf(stdout, "\n Pass %d: ", pass);
+ status_pass = pass;
+ status_dots = 31;
+ }
+ status_dots--;
+ if (status_dots == 0)
+ {
+ fprintf(stdout, "\n ");
+ status_dots=30;
+ }
+ fprintf(stdout, "r");
}
void
@@ -152,15 +156,17 @@ PNGAPI
#endif
write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass)
{
- if(png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) return;
- fprintf(stdout, "w");
+ if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7)
+ return;
+ fprintf(stdout, "w");
}
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
/* Example of using user transform callback (we don't transform anything,
- but merely examine the row filters. We set this to 256 rather than
- 5 in case illegal filter values are present.) */
+ * but merely examine the row filters. We set this to 256 rather than
+ * 5 in case illegal filter values are present.)
+ */
static png_uint_32 filters_used[256];
void
#ifdef PNG_1_0_X
@@ -173,14 +179,15 @@ PNGAPI
#endif
count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data)
{
- if(png_ptr != NULL && row_info != NULL)
- ++filters_used[*(data-1)];
+ if (png_ptr != NULL && row_info != NULL)
+ ++filters_used[*(data - 1)];
}
#endif
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
-/* example of using user transform callback (we don't transform anything,
- but merely count the zero samples) */
+/* Example of using user transform callback (we don't transform anything,
+ * but merely count the zero samples)
+ */
static png_uint_32 zero_samples;
@@ -196,9 +203,9 @@ PNGAPI
count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
{
png_bytep dp = data;
- if(png_ptr == NULL)return;
+ if (png_ptr == NULL)return;
- /* contents of row_info:
+ /* Contents of row_info:
* png_uint_32 width width of row
* png_uint_32 rowbytes number of bytes in row
* png_byte color_type color type of pixels
@@ -207,74 +214,81 @@ count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data)
* png_byte pixel_depth bits per pixel (depth*channels)
*/
+ /* Counts the number of zero samples (or zero pixels if color_type is 3 */
- /* counts the number of zero samples (or zero pixels if color_type is 3 */
-
- if(row_info->color_type == 0 || row_info->color_type == 3)
+ if (row_info->color_type == 0 || row_info->color_type == 3)
{
- int pos=0;
+ int pos = 0;
png_uint_32 n, nstop;
- for (n=0, nstop=row_info->width; n<nstop; n++)
+ for (n = 0, nstop=row_info->width; n<nstop; n++)
{
- if(row_info->bit_depth == 1)
+ if (row_info->bit_depth == 1)
{
- if(((*dp << pos++ ) & 0x80) == 0) zero_samples++;
- if(pos == 8)
+ if (((*dp << pos++ ) & 0x80) == 0)
+ zero_samples++;
+ if (pos == 8)
{
pos = 0;
dp++;
}
}
- if(row_info->bit_depth == 2)
+ if (row_info->bit_depth == 2)
{
- if(((*dp << (pos+=2)) & 0xc0) == 0) zero_samples++;
- if(pos == 8)
+ if (((*dp << (pos+=2)) & 0xc0) == 0)
+ zero_samples++;
+ if (pos == 8)
{
pos = 0;
dp++;
}
}
- if(row_info->bit_depth == 4)
+ if (row_info->bit_depth == 4)
{
- if(((*dp << (pos+=4)) & 0xf0) == 0) zero_samples++;
- if(pos == 8)
+ if (((*dp << (pos+=4)) & 0xf0) == 0)
+ zero_samples++;
+ if (pos == 8)
{
pos = 0;
dp++;
}
}
- if(row_info->bit_depth == 8)
- if(*dp++ == 0) zero_samples++;
- if(row_info->bit_depth == 16)
+ if (row_info->bit_depth == 8)
+ if (*dp++ == 0)
+ zero_samples++;
+ if (row_info->bit_depth == 16)
{
- if((*dp | *(dp+1)) == 0) zero_samples++;
+ if ((*dp | *(dp+1)) == 0)
+ zero_samples++;
dp+=2;
}
}
}
- else /* other color types */
+ else /* Other color types */
{
png_uint_32 n, nstop;
int channel;
int color_channels = row_info->channels;
- if(row_info->color_type > 3)color_channels--;
+ if (row_info->color_type > 3)color_channels--;
- for (n=0, nstop=row_info->width; n<nstop; n++)
+ for (n = 0, nstop=row_info->width; n<nstop; n++)
{
for (channel = 0; channel < color_channels; channel++)
{
- if(row_info->bit_depth == 8)
- if(*dp++ == 0) zero_samples++;
- if(row_info->bit_depth == 16)
+ if (row_info->bit_depth == 8)
+ if (*dp++ == 0)
+ zero_samples++;
+ if (row_info->bit_depth == 16)
{
- if((*dp | *(dp+1)) == 0) zero_samples++;
+ if ((*dp | *(dp+1)) == 0)
+ zero_samples++;
dp+=2;
}
}
- if(row_info->color_type > 3)
+ if (row_info->color_type > 3)
{
dp++;
- if(row_info->bit_depth == 16)dp++;
+ if (row_info->bit_depth == 16)
+ dp++;
}
}
}
@@ -285,12 +299,13 @@ static int wrote_question = 0;
#if defined(PNG_NO_STDIO)
/* START of code to validate stdio-free compilation */
-/* These copies of the default read/write functions come from pngrio.c and */
-/* pngwio.c. They allow "don't include stdio" testing of the library. */
-/* This is the function that does the actual reading of data. If you are
- not reading from a standard C stream, you should create a replacement
- read_data function and use it at run time with png_set_read_fn(), rather
- than changing the library. */
+/* These copies of the default read/write functions come from pngrio.c and
+ * pngwio.c. They allow "don't include stdio" testing of the library.
+ * This is the function that does the actual reading of data. If you are
+ * not reading from a standard C stream, you should create a replacement
+ * read_data function and use it at run time with png_set_read_fn(), rather
+ * than changing the library.
+ */
#ifndef USE_FAR_KEYWORD
static void
@@ -309,7 +324,7 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
}
}
#else
-/* this is the model-independent version. Since the standard I/O library
+/* This is the model-independent version. Since the standard I/O library
can't handle far buffers in the medium and small models, we have to copy
the data.
*/
@@ -341,8 +356,8 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
read = MIN(NEAR_BUF_SIZE, remaining);
READFILE(io_ptr, buf, 1, err);
- png_memcpy(data, buf, read); /* copy far buffer to near buffer */
- if(err != read)
+ png_memcpy(data, buf, read); /* Copy far buffer to near buffer */
+ if (err != read)
break;
else
check += err;
@@ -352,9 +367,7 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
while (remaining != 0);
}
if (check != length)
- {
png_error(png_ptr, "read Error");
- }
}
#endif /* USE_FAR_KEYWORD */
@@ -362,19 +375,16 @@ pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
static void
pngtest_flush(png_structp png_ptr)
{
-#if !defined(_WIN32_WCE)
- png_FILE_p io_ptr;
- io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
- if (io_ptr != NULL)
- fflush(io_ptr);
-#endif
+ /* Do nothing; fflush() is said to be just a waste of energy. */
+ png_ptr = png_ptr; /* Stifle compiler warning */
}
#endif
/* This is the function that does the actual writing of data. If you are
- not writing to a standard C stream, you should create a replacement
- write_data function and use it at run time with png_set_write_fn(), rather
- than changing the library. */
+ * not writing to a standard C stream, you should create a replacement
+ * write_data function and use it at run time with png_set_write_fn(), rather
+ * than changing the library.
+ */
#ifndef USE_FAR_KEYWORD
static void
pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
@@ -388,7 +398,7 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
}
}
#else
-/* this is the model-independent version. Since the standard I/O library
+/* This is the model-independent version. Since the standard I/O library
can't handle far buffers in the medium and small models, we have to copy
the data.
*/
@@ -419,7 +429,7 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
do
{
written = MIN(NEAR_BUF_SIZE, remaining);
- png_memcpy(buf, data, written); /* copy far buffer to near buffer */
+ png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
WRITEFILE(io_ptr, buf, written, err);
if (err != written)
break;
@@ -436,8 +446,6 @@ pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
}
}
#endif /* USE_FAR_KEYWORD */
-#endif /* PNG_NO_STDIO */
-/* END of code to validate stdio-free compilation */
/* This function is called when there is a warning, but the library thinks
* it can continue anyway. Replacement functions don't have to do anything
@@ -463,20 +471,24 @@ pngtest_error(png_structp png_ptr, png_const_charp message)
{
pngtest_warning(png_ptr, message);
/* We can return because png_error calls the default handler, which is
- * actually OK in this case. */
+ * actually OK in this case.
+ */
}
+#endif /* PNG_NO_STDIO */
+/* END of code to validate stdio-free compilation */
/* START of code to validate memory allocation and deallocation */
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
/* Allocate memory. For reasonable files, size should never exceed
- 64K. However, zlib may allocate more then 64K if you don't tell
- it not to. See zconf.h and png.h for more information. zlib does
- need to allocate exactly 64K, so whatever you call here must
- have the ability to do that.
-
- This piece of code can be compiled to validate max 64K allocations
- by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K. */
+ * 64K. However, zlib may allocate more then 64K if you don't tell
+ * it not to. See zconf.h and png.h for more information. zlib does
+ * need to allocate exactly 64K, so whatever you call here must
+ * have the ability to do that.
+ *
+ * This piece of code can be compiled to validate max 64K allocations
+ * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K.
+ */
typedef struct memory_information
{
png_uint_32 size;
@@ -499,7 +511,8 @@ png_debug_malloc(png_structp png_ptr, png_uint_32 size)
{
/* png_malloc has already tested for NULL; png_create_struct calls
- png_debug_malloc directly, with png_ptr == NULL which is OK */
+ * png_debug_malloc directly, with png_ptr == NULL which is OK
+ */
if (size == 0)
return (NULL);
@@ -511,7 +524,7 @@ png_debug_malloc(png_structp png_ptr, png_uint_32 size)
memory_infop pinfo;
png_set_mem_fn(png_ptr, NULL, NULL, NULL);
pinfo = (memory_infop)png_malloc(png_ptr,
- (png_uint_32)png_sizeof (*pinfo));
+ (png_uint_32)png_sizeof(*pinfo));
pinfo->size = size;
current_allocation += size;
total_allocation += size;
@@ -520,8 +533,9 @@ png_debug_malloc(png_structp png_ptr, png_uint_32 size)
maximum_allocation = current_allocation;
pinfo->pointer = (png_voidp)png_malloc(png_ptr, size);
/* Restore malloc_fn and free_fn */
- png_set_mem_fn(png_ptr, png_voidp_NULL, (png_malloc_ptr)png_debug_malloc,
- (png_free_ptr)png_debug_free);
+ png_set_mem_fn(png_ptr,
+ png_voidp_NULL, (png_malloc_ptr)png_debug_malloc,
+ (png_free_ptr)png_debug_free);
if (size != 0 && pinfo->pointer == NULL)
{
current_allocation -= size;
@@ -533,9 +547,9 @@ png_debug_malloc(png_structp png_ptr, png_uint_32 size)
pinformation = pinfo;
/* Make sure the caller isn't assuming zeroed memory. */
png_memset(pinfo->pointer, 0xdd, pinfo->size);
- if(verbose)
- printf("png_malloc %lu bytes at %x\n",(unsigned long)size,
- pinfo->pointer);
+ if (verbose)
+ printf("png_malloc %lu bytes at %x\n", (unsigned long)size,
+ pinfo->pointer);
return (png_voidp)(pinfo->pointer);
}
}
@@ -570,7 +584,7 @@ png_debug_free(png_structp png_ptr, png_voidp ptr)
the memory that is to be freed. */
png_memset(ptr, 0x55, pinfo->size);
png_free_default(png_ptr, pinfo);
- pinfo=NULL;
+ pinfo = NULL;
break;
}
if (pinfo->next == NULL)
@@ -583,14 +597,82 @@ png_debug_free(png_structp png_ptr, png_voidp ptr)
}
/* Finally free the data. */
- if(verbose)
- printf("Freeing %x\n",ptr);
+ if (verbose)
+ printf("Freeing %x\n", ptr);
png_free_default(png_ptr, ptr);
- ptr=NULL;
+ ptr = NULL;
}
#endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */
/* END of code to test memory allocation/deallocation */
+
+/* Demonstration of user chunk support of the sTER and vpAg chunks */
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+
+/* (sTER is a public chunk not yet known by libpng. vpAg is a private
+chunk used in ImageMagick to store "virtual page" size). */
+
+static png_uint_32 user_chunk_data[4];
+
+ /* 0: sTER mode + 1
+ * 1: vpAg width
+ * 2: vpAg height
+ * 3: vpAg units
+ */
+
+static int read_user_chunk_callback(png_struct *png_ptr,
+ png_unknown_chunkp chunk)
+{
+ png_uint_32
+ *my_user_chunk_data;
+
+ /* Return one of the following:
+ * return (-n); chunk had an error
+ * return (0); did not recognize
+ * return (n); success
+ *
+ * The unknown chunk structure contains the chunk data:
+ * png_byte name[5];
+ * png_byte *data;
+ * png_size_t size;
+ *
+ * Note that libpng has already taken care of the CRC handling.
+ */
+
+ if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */
+ chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */
+ {
+ /* Found sTER chunk */
+ if (chunk->size != 1)
+ return (-1); /* Error return */
+ if (chunk->data[0] != 0 && chunk->data[0] != 1)
+ return (-1); /* Invalid mode */
+ my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
+ my_user_chunk_data[0]=chunk->data[0]+1;
+ return (1);
+ }
+
+ if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */
+ chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */
+ return (0); /* Did not recognize */
+
+ /* Found ImageMagick vpAg chunk */
+
+ if (chunk->size != 9)
+ return (-1); /* Error return */
+
+ my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr);
+
+ my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data);
+ my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4);
+ my_user_chunk_data[3]=(png_uint_32)chunk->data[8];
+
+ return (1);
+
+}
+#endif
+/* END of code to demonstrate user chunk support */
+
/* Test one file */
int
test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
@@ -649,30 +731,48 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
return (1);
}
- png_debug(0, "Allocating read and write structures\n");
+ png_debug(0, "Allocating read and write structures");
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- read_ptr = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
+ read_ptr =
+ png_create_read_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
(png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
#else
- read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
+ read_ptr =
+ png_create_read_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
png_error_ptr_NULL, png_error_ptr_NULL);
#endif
+#if defined(PNG_NO_STDIO)
png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error,
pngtest_warning);
+#endif
+
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+ user_chunk_data[0] = 0;
+ user_chunk_data[1] = 0;
+ user_chunk_data[2] = 0;
+ user_chunk_data[3] = 0;
+ png_set_read_user_chunk_fn(read_ptr, user_chunk_data,
+ read_user_chunk_callback);
+
+#endif
#ifdef PNG_WRITE_SUPPORTED
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
- write_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
+ write_ptr =
+ png_create_write_struct_2(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
png_error_ptr_NULL, png_error_ptr_NULL, png_voidp_NULL,
(png_malloc_ptr)png_debug_malloc, (png_free_ptr)png_debug_free);
#else
- write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
+ write_ptr =
+ png_create_write_struct(PNG_LIBPNG_VER_STRING, png_voidp_NULL,
png_error_ptr_NULL, png_error_ptr_NULL);
#endif
+#if defined(PNG_NO_STDIO)
png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error,
pngtest_warning);
#endif
- png_debug(0, "Allocating read_info, write_info and end_info structures\n");
+#endif
+ png_debug(0, "Allocating read_info, write_info and end_info structures");
read_info_ptr = png_create_info_struct(read_ptr);
end_info_ptr = png_create_info_struct(read_ptr);
#ifdef PNG_WRITE_SUPPORTED
@@ -681,7 +781,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#endif
#ifdef PNG_SETJMP_SUPPORTED
- png_debug(0, "Setting jmpbuf for read struct\n");
+ png_debug(0, "Setting jmpbuf for read struct");
#ifdef USE_FAR_KEYWORD
if (setjmp(jmpbuf))
#else
@@ -690,6 +790,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
{
fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname);
png_free(read_ptr, row_buf);
+ row_buf = NULL;
png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
#ifdef PNG_WRITE_SUPPORTED
png_destroy_info_struct(write_ptr, &write_end_info_ptr);
@@ -700,11 +801,11 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
return (1);
}
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(read_ptr),jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_jmpbuf(read_ptr), jmpbuf, png_sizeof(jmp_buf));
#endif
#ifdef PNG_WRITE_SUPPORTED
- png_debug(0, "Setting jmpbuf for write struct\n");
+ png_debug(0, "Setting jmpbuf for write struct");
#ifdef USE_FAR_KEYWORD
if (setjmp(jmpbuf))
#else
@@ -722,12 +823,12 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
return (1);
}
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(write_ptr),jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_jmpbuf(write_ptr), jmpbuf, png_sizeof(jmp_buf));
#endif
#endif
#endif
- png_debug(0, "Initializing input and output streams\n");
+ png_debug(0, "Initializing input and output streams");
#if !defined(PNG_NO_STDIO)
png_init_io(read_ptr, fpin);
# ifdef PNG_WRITE_SUPPORTED
@@ -744,7 +845,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
# endif
# endif
#endif
- if(status_dots_requested == 1)
+ if (status_dots_requested == 1)
{
#ifdef PNG_WRITE_SUPPORTED
png_set_write_status_fn(write_ptr, write_row_callback);
@@ -761,14 +862,14 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
{
- int i;
- for(i=0; i<256; i++)
- filters_used[i]=0;
- png_set_read_user_transform_fn(read_ptr, count_filters);
+ int i;
+ for (i = 0; i<256; i++)
+ filters_used[i] = 0;
+ png_set_read_user_transform_fn(read_ptr, count_filters);
}
#endif
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
- zero_samples=0;
+ zero_samples = 0;
png_set_write_user_transform_fn(write_ptr, count_zero_samples);
#endif
@@ -787,10 +888,10 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_bytep_NULL, 0);
#endif
- png_debug(0, "Reading info struct\n");
+ png_debug(0, "Reading info struct");
png_read_info(read_ptr, read_info_ptr);
- png_debug(0, "Transferring info struct\n");
+ png_debug(0, "Transferring info struct");
{
int interlace_type, compression_type, filter_type;
@@ -823,9 +924,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_fixed_point gamma;
if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma))
- {
png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
- }
}
#endif
#else /* Use floating point versions */
@@ -847,13 +946,11 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
double gamma;
if (png_get_gAMA(read_ptr, read_info_ptr, &gamma))
- {
png_set_gAMA(write_ptr, write_info_ptr, gamma);
- }
}
#endif
-#endif /* floating point */
-#endif /* fixed point */
+#endif /* Floating point */
+#endif /* Fixed point */
#if defined(PNG_iCCP_SUPPORTED)
{
png_charp name;
@@ -874,9 +971,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
int intent;
if (png_get_sRGB(read_ptr, read_info_ptr, &intent))
- {
png_set_sRGB(write_ptr, write_info_ptr, intent);
- }
}
#endif
{
@@ -884,9 +979,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
int num_palette;
if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
- {
png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
- }
}
#if defined(PNG_bKGD_SUPPORTED)
{
@@ -903,9 +996,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_uint_16p hist;
if (png_get_hIST(read_ptr, read_info_ptr, &hist))
- {
png_set_hIST(write_ptr, write_info_ptr, hist);
- }
}
#endif
#if defined(PNG_oFFs_SUPPORTED)
@@ -913,7 +1004,8 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_int_32 offset_x, offset_y;
int unit_type;
- if (png_get_oFFs(read_ptr, read_info_ptr,&offset_x,&offset_y,&unit_type))
+ if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
+ &unit_type))
{
png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
}
@@ -940,9 +1032,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
int unit_type;
if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type))
- {
png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
- }
}
#endif
#if defined(PNG_sBIT_SUPPORTED)
@@ -950,9 +1040,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_color_8p sig_bit;
if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit))
- {
png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
- }
}
#endif
#if defined(PNG_sCAL_SUPPORTED)
@@ -989,7 +1077,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
{
- png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
+ png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text);
png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
}
}
@@ -1002,13 +1090,14 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
{
png_set_tIME(write_ptr, write_info_ptr, mod_time);
#if defined(PNG_TIME_RFC1123_SUPPORTED)
- /* we have to use png_memcpy instead of "=" because the string
- pointed to by png_convert_to_rfc1123() gets free'ed before
- we use it */
+ /* We have to use png_memcpy instead of "=" because the string
+ * pointed to by png_convert_to_rfc1123() gets free'ed before
+ * we use it.
+ */
png_memcpy(tIME_string,
- png_convert_to_rfc1123(read_ptr, mod_time),
+ png_convert_to_rfc1123(read_ptr, mod_time),
png_sizeof(tIME_string));
- tIME_string[png_sizeof(tIME_string)-1] = '\0';
+ tIME_string[png_sizeof(tIME_string) - 1] = '\0';
tIME_chunk_present++;
#endif /* PNG_TIME_RFC1123_SUPPORTED */
}
@@ -1026,13 +1115,13 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
int sample_max = (1 << read_info_ptr->bit_depth);
/* libpng doesn't reject a tRNS chunk with out-of-range samples */
if (!((read_info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
- (int)trans_values->gray > sample_max) ||
- (read_info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
- ((int)trans_values->red > sample_max ||
- (int)trans_values->green > sample_max ||
- (int)trans_values->blue > sample_max))))
- png_set_tRNS(write_ptr, write_info_ptr, trans, num_trans,
- trans_values);
+ (int)trans_values->gray > sample_max) ||
+ (read_info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
+ ((int)trans_values->red > sample_max ||
+ (int)trans_values->green > sample_max ||
+ (int)trans_values->blue > sample_max))))
+ png_set_tRNS(write_ptr, write_info_ptr, trans, num_trans,
+ trans_values);
}
}
#endif
@@ -1046,9 +1135,10 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_size_t i;
png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns,
num_unknowns);
- /* copy the locations from the read_info_ptr. The automatically
- generated locations in write_info_ptr are wrong because we
- haven't written anything yet */
+ /* Copy the locations from the read_info_ptr. The automatically
+ * generated locations in write_info_ptr are wrong because we
+ * haven't written anything yet.
+ */
for (i = 0; i < (png_size_t)num_unknowns; i++)
png_set_unknown_chunk_location(write_ptr, write_info_ptr, i,
unknowns[i].location);
@@ -1057,21 +1147,55 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#endif
#ifdef PNG_WRITE_SUPPORTED
- png_debug(0, "\nWriting info struct\n");
+ png_debug(0, "Writing info struct");
/* If we wanted, we could write info in two steps:
- png_write_info_before_PLTE(write_ptr, write_info_ptr);
+ * png_write_info_before_PLTE(write_ptr, write_info_ptr);
*/
png_write_info(write_ptr, write_info_ptr);
+
+#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
+ if (user_chunk_data[0] != 0)
+ {
+ png_byte png_sTER[5] = {115, 84, 69, 82, '\0'};
+
+ unsigned char
+ ster_chunk_data[1];
+
+ if (verbose)
+ fprintf(STDERR, "\n stereo mode = %lu\n",
+ (unsigned long)(user_chunk_data[0] - 1));
+ ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1);
+ png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1);
+ }
+ if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0)
+ {
+ png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'};
+
+ unsigned char
+ vpag_chunk_data[9];
+
+ if (verbose)
+ fprintf(STDERR, " vpAg = %lu x %lu, units = %lu\n",
+ (unsigned long)user_chunk_data[1],
+ (unsigned long)user_chunk_data[2],
+ (unsigned long)user_chunk_data[3]);
+ png_save_uint_32(vpag_chunk_data, user_chunk_data[1]);
+ png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]);
+ vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff);
+ png_write_chunk(write_ptr, png_vpAg, vpag_chunk_data, 9);
+ }
+
+#endif
#endif
#ifdef SINGLE_ROWBUF_ALLOC
- png_debug(0, "\nAllocating row buffer...");
+ png_debug(0, "Allocating row buffer...");
row_buf = (png_bytep)png_malloc(read_ptr,
png_get_rowbytes(read_ptr, read_info_ptr));
- png_debug1(0, "0x%08lx\n\n", (unsigned long)row_buf);
+ png_debug1(0, "0x%08lx", (unsigned long)row_buf);
#endif /* SINGLE_ROWBUF_ALLOC */
- png_debug(0, "Writing row data\n");
+ png_debug(0, "Writing row data");
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
defined(PNG_WRITE_INTERLACING_SUPPORTED)
@@ -1080,7 +1204,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_set_interlace_handling(write_ptr);
# endif
#else
- num_pass=1;
+ num_pass = 1;
#endif
#ifdef PNGTEST_TIMING
@@ -1090,14 +1214,14 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#endif
for (pass = 0; pass < num_pass; pass++)
{
- png_debug1(0, "Writing row data for pass %d\n",pass);
+ png_debug1(0, "Writing row data for pass %d", pass);
for (y = 0; y < height; y++)
{
#ifndef SINGLE_ROWBUF_ALLOC
- png_debug2(0, "\nAllocating row buffer (pass %d, y = %ld)...", pass,y);
+ png_debug2(0, "Allocating row buffer (pass %d, y = %ld)...", pass, y);
row_buf = (png_bytep)png_malloc(read_ptr,
png_get_rowbytes(read_ptr, read_info_ptr));
- png_debug2(0, "0x%08lx (%ld bytes)\n", (unsigned long)row_buf,
+ png_debug2(0, "0x%08lx (%ld bytes)", (unsigned long)row_buf,
png_get_rowbytes(read_ptr, read_info_ptr));
#endif /* !SINGLE_ROWBUF_ALLOC */
png_read_rows(read_ptr, (png_bytepp)&row_buf, png_bytepp_NULL, 1);
@@ -1117,8 +1241,9 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#endif /* PNG_WRITE_SUPPORTED */
#ifndef SINGLE_ROWBUF_ALLOC
- png_debug2(0, "Freeing row buffer (pass %d, y = %ld)\n\n", pass, y);
+ png_debug2(0, "Freeing row buffer (pass %d, y = %ld)", pass, y);
png_free(read_ptr, row_buf);
+ row_buf = NULL;
#endif /* !SINGLE_ROWBUF_ALLOC */
}
}
@@ -1130,7 +1255,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1);
#endif
- png_debug(0, "Reading and writing end_info data\n");
+ png_debug(0, "Reading and writing end_info data");
png_read_end(read_ptr, end_info_ptr);
#if defined(PNG_TEXT_SUPPORTED)
@@ -1140,7 +1265,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
{
- png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks\n", num_text);
+ png_debug1(0, "Handling %d iTXt/tEXt/zTXt chunks", num_text);
png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
}
}
@@ -1153,13 +1278,13 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
{
png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
#if defined(PNG_TIME_RFC1123_SUPPORTED)
- /* we have to use png_memcpy instead of "=" because the string
+ /* We have to use png_memcpy instead of "=" because the string
pointed to by png_convert_to_rfc1123() gets free'ed before
we use it */
png_memcpy(tIME_string,
png_convert_to_rfc1123(read_ptr, mod_time),
png_sizeof(tIME_string));
- tIME_string[png_sizeof(tIME_string)-1] = '\0';
+ tIME_string[png_sizeof(tIME_string) - 1] = '\0';
tIME_chunk_present++;
#endif /* PNG_TIME_RFC1123_SUPPORTED */
}
@@ -1176,9 +1301,10 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
png_size_t i;
png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns,
num_unknowns);
- /* copy the locations from the read_info_ptr. The automatically
- generated locations in write_end_info_ptr are wrong because we
- haven't written the end_info yet */
+ /* Copy the locations from the read_info_ptr. The automatically
+ * generated locations in write_end_info_ptr are wrong because we
+ * haven't written the end_info yet.
+ */
for (i = 0; i < (png_size_t)num_unknowns; i++)
png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i,
unknowns[i].location);
@@ -1190,36 +1316,36 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
#endif
#ifdef PNG_EASY_ACCESS_SUPPORTED
- if(verbose)
+ if (verbose)
{
png_uint_32 iwidth, iheight;
iwidth = png_get_image_width(write_ptr, write_info_ptr);
iheight = png_get_image_height(write_ptr, write_info_ptr);
- fprintf(STDERR, "Image width = %lu, height = %lu\n",
+ fprintf(STDERR, "\n Image width = %lu, height = %lu\n",
(unsigned long)iwidth, (unsigned long)iheight);
}
#endif
- png_debug(0, "Destroying data structs\n");
+ png_debug(0, "Destroying data structs");
#ifdef SINGLE_ROWBUF_ALLOC
- png_debug(1, "destroying row_buf for read_ptr\n");
+ png_debug(1, "destroying row_buf for read_ptr");
png_free(read_ptr, row_buf);
- row_buf=NULL;
+ row_buf = NULL;
#endif /* SINGLE_ROWBUF_ALLOC */
- png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr\n");
+ png_debug(1, "destroying read_ptr, read_info_ptr, end_info_ptr");
png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
#ifdef PNG_WRITE_SUPPORTED
- png_debug(1, "destroying write_end_info_ptr\n");
+ png_debug(1, "destroying write_end_info_ptr");
png_destroy_info_struct(write_ptr, &write_end_info_ptr);
- png_debug(1, "destroying write_ptr, write_info_ptr\n");
+ png_debug(1, "destroying write_ptr, write_info_ptr");
png_destroy_write_struct(&write_ptr, &write_info_ptr);
#endif
- png_debug(0, "Destruction complete.\n");
+ png_debug(0, "Destruction complete.");
FCLOSE(fpin);
FCLOSE(fpout);
- png_debug(0, "Opening files for comparison\n");
+ png_debug(0, "Opening files for comparison");
#if defined(_WIN32_WCE)
MultiByteToWideChar(CP_ACP, 0, inname, -1, path, MAX_PATH);
if ((fpin = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
@@ -1243,28 +1369,28 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
return (1);
}
- for(;;)
+ for (;;)
{
png_size_t num_in, num_out;
- READFILE(fpin, inbuf, 1, num_in);
- READFILE(fpout, outbuf, 1, num_out);
+ READFILE(fpin, inbuf, 1, num_in);
+ READFILE(fpout, outbuf, 1, num_out);
if (num_in != num_out)
{
fprintf(STDERR, "\nFiles %s and %s are of a different size\n",
inname, outname);
- if(wrote_question == 0)
+ if (wrote_question == 0)
{
fprintf(STDERR,
" Was %s written with the same maximum IDAT chunk size (%d bytes),",
- inname,PNG_ZBUF_SIZE);
+ inname, PNG_ZBUF_SIZE);
fprintf(STDERR,
"\n filtering heuristic (libpng default), compression");
fprintf(STDERR,
" level (zlib default),\n and zlib version (%s)?\n\n",
ZLIB_VERSION);
- wrote_question=1;
+ wrote_question = 1;
}
FCLOSE(fpin);
FCLOSE(fpout);
@@ -1277,17 +1403,17 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
if (png_memcmp(inbuf, outbuf, num_in))
{
fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname);
- if(wrote_question == 0)
+ if (wrote_question == 0)
{
fprintf(STDERR,
" Was %s written with the same maximum IDAT chunk size (%d bytes),",
- inname,PNG_ZBUF_SIZE);
+ inname, PNG_ZBUF_SIZE);
fprintf(STDERR,
"\n filtering heuristic (libpng default), compression");
fprintf(STDERR,
" level (zlib default),\n and zlib version (%s)?\n\n",
ZLIB_VERSION);
- wrote_question=1;
+ wrote_question = 1;
}
FCLOSE(fpin);
FCLOSE(fpout);
@@ -1301,7 +1427,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname)
return (0);
}
-/* input and output filenames */
+/* Input and output filenames */
#ifdef RISCOS
static PNG_CONST char *inname = "pngtest/png";
static PNG_CONST char *outname = "pngout/png";
@@ -1316,23 +1442,24 @@ main(int argc, char *argv[])
int multiple = 0;
int ierror = 0;
- fprintf(STDERR, "Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
+ fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING);
fprintf(STDERR, " with zlib version %s\n", ZLIB_VERSION);
- fprintf(STDERR,"%s",png_get_copyright(NULL));
+ fprintf(STDERR, "%s", png_get_copyright(NULL));
/* Show the version of libpng used in building the library */
- fprintf(STDERR," library (%lu):%s",
+ fprintf(STDERR, " library (%lu):%s",
(unsigned long)png_access_version_number(),
png_get_header_version(NULL));
/* Show the version of libpng used in building the application */
- fprintf(STDERR," pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
+ fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
PNG_HEADER_VERSION_STRING);
- fprintf(STDERR," png_sizeof(png_struct)=%ld, png_sizeof(png_info)=%ld\n",
+ fprintf(STDERR, " sizeof(png_struct)=%ld, sizeof(png_info)=%ld\n",
(long)png_sizeof(png_struct), (long)png_sizeof(png_info));
/* Do some consistency checking on the memory allocation settings, I'm
- not sure this matters, but it is nice to know, the first of these
- tests should be impossible because of the way the macros are set
- in pngconf.h */
+ * not sure this matters, but it is nice to know, the first of these
+ * tests should be impossible because of the way the macros are set
+ * in pngconf.h
+ */
#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n");
#endif
@@ -1377,10 +1504,10 @@ main(int argc, char *argv[])
}
}
- if (!multiple && argc == 3+verbose)
- outname = argv[2+verbose];
+ if (!multiple && argc == 3 + verbose)
+ outname = argv[2 + verbose];
- if ((!multiple && argc > 3+verbose) || (multiple && argc < 2))
+ if ((!multiple && argc > 3 + verbose) || (multiple && argc < 2))
{
fprintf(STDERR,
"usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n",
@@ -1404,7 +1531,7 @@ main(int argc, char *argv[])
int k;
#endif
int kerror;
- fprintf(STDERR, "Testing %s:",argv[i]);
+ fprintf(STDERR, "\n Testing %s:", argv[i]);
kerror = test_one_file(argv[i], outname);
if (kerror == 0)
{
@@ -1415,14 +1542,14 @@ main(int argc, char *argv[])
fprintf(STDERR, " PASS\n");
#endif
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- for (k=0; k<256; k++)
- if(filters_used[k])
+ for (k = 0; k<256; k++)
+ if (filters_used[k])
fprintf(STDERR, " Filter %d was used %lu times\n",
- k,(unsigned long)filters_used[k]);
+ k, (unsigned long)filters_used[k]);
#endif
#if defined(PNG_TIME_RFC1123_SUPPORTED)
- if(tIME_chunk_present != 0)
- fprintf(STDERR, " tIME = %s\n",tIME_string);
+ if (tIME_chunk_present != 0)
+ fprintf(STDERR, " tIME = %s\n", tIME_string);
tIME_chunk_present = 0;
#endif /* PNG_TIME_RFC1123_SUPPORTED */
}
@@ -1434,7 +1561,7 @@ main(int argc, char *argv[])
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
if (allocation_now != current_allocation)
fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
- current_allocation-allocation_now);
+ current_allocation - allocation_now);
if (current_allocation != 0)
{
memory_infop pinfo = pinformation;
@@ -1443,7 +1570,8 @@ main(int argc, char *argv[])
current_allocation);
while (pinfo != NULL)
{
- fprintf(STDERR, " %lu bytes at %x\n", (unsigned long)pinfo->size,
+ fprintf(STDERR, " %lu bytes at %x\n",
+ (unsigned long)pinfo->size,
(unsigned int) pinfo->pointer);
pinfo = pinfo->next;
}
@@ -1464,20 +1592,20 @@ main(int argc, char *argv[])
else
{
int i;
- for (i=0; i<3; ++i)
+ for (i = 0; i<3; ++i)
{
int kerror;
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
int allocation_now = current_allocation;
#endif
if (i == 1) status_dots_requested = 1;
- else if(verbose == 0)status_dots_requested = 0;
+ else if (verbose == 0)status_dots_requested = 0;
if (i == 0 || verbose == 1 || ierror != 0)
- fprintf(STDERR, "Testing %s:",inname);
+ fprintf(STDERR, "\n Testing %s:", inname);
kerror = test_one_file(inname, outname);
- if(kerror == 0)
+ if (kerror == 0)
{
- if(verbose == 1 || i == 2)
+ if (verbose == 1 || i == 2)
{
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
int k;
@@ -1489,28 +1617,29 @@ main(int argc, char *argv[])
fprintf(STDERR, " PASS\n");
#endif
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- for (k=0; k<256; k++)
- if(filters_used[k])
+ for (k = 0; k<256; k++)
+ if (filters_used[k])
fprintf(STDERR, " Filter %d was used %lu times\n",
- k,(unsigned long)filters_used[k]);
+ k,
+ (unsigned long)filters_used[k]);
#endif
#if defined(PNG_TIME_RFC1123_SUPPORTED)
- if(tIME_chunk_present != 0)
- fprintf(STDERR, " tIME = %s\n",tIME_string);
+ if (tIME_chunk_present != 0)
+ fprintf(STDERR, " tIME = %s\n", tIME_string);
#endif /* PNG_TIME_RFC1123_SUPPORTED */
}
}
else
{
- if(verbose == 0 && i != 2)
- fprintf(STDERR, "Testing %s:",inname);
+ if (verbose == 0 && i != 2)
+ fprintf(STDERR, "\n Testing %s:", inname);
fprintf(STDERR, " FAIL\n");
ierror += kerror;
}
#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG
if (allocation_now != current_allocation)
fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n",
- current_allocation-allocation_now);
+ current_allocation - allocation_now);
if (current_allocation != 0)
{
memory_infop pinfo = pinformation;
@@ -1519,7 +1648,7 @@ main(int argc, char *argv[])
current_allocation);
while (pinfo != NULL)
{
- fprintf(STDERR," %lu bytes at %x\n",
+ fprintf(STDERR, " %lu bytes at %x\n",
(unsigned long)pinfo->size, (unsigned int)pinfo->pointer);
pinfo = pinfo->next;
}
@@ -1542,22 +1671,22 @@ main(int argc, char *argv[])
t_stop = (float)clock();
t_misc += (t_stop - t_start);
t_start = t_stop;
- fprintf(STDERR," CPU time used = %.3f seconds",
+ fprintf(STDERR, " CPU time used = %.3f seconds",
(t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC);
- fprintf(STDERR," (decoding %.3f,\n",
+ fprintf(STDERR, " (decoding %.3f,\n",
t_decode/(float)CLOCKS_PER_SEC);
- fprintf(STDERR," encoding %.3f ,",
+ fprintf(STDERR, " encoding %.3f ,",
t_encode/(float)CLOCKS_PER_SEC);
- fprintf(STDERR," other %.3f seconds)\n\n",
+ fprintf(STDERR, " other %.3f seconds)\n\n",
t_misc/(float)CLOCKS_PER_SEC);
#endif
if (ierror == 0)
- fprintf(STDERR, "libpng passes test\n");
+ fprintf(STDERR, " libpng passes test\n");
else
- fprintf(STDERR, "libpng FAILS test\n");
+ fprintf(STDERR, " libpng FAILS test\n");
return (int)(ierror != 0);
}
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_2_29 your_png_h_is_not_version_1_2_29;
+typedef version_1_2_40 your_png_h_is_not_version_1_2_40;
diff --git a/src/3rdparty/libpng/pngtrans.c b/src/3rdparty/libpng/pngtrans.c
index 1640095..6e1870c 100644
--- a/src/3rdparty/libpng/pngtrans.c
+++ b/src/3rdparty/libpng/pngtrans.c
@@ -1,47 +1,53 @@
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
*
- * Last changed in libpng 1.2.17 May 15, 2007
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2007 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.36 [May 14, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
#define PNG_INTERNAL
#include "png.h"
-
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
+
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-/* turn on BGR-to-RGB mapping */
+/* Turn on BGR-to-RGB mapping */
void PNGAPI
png_set_bgr(png_structp png_ptr)
{
- png_debug(1, "in png_set_bgr\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_bgr");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_BGR;
}
#endif
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-/* turn on 16 bit byte swapping */
+/* Turn on 16 bit byte swapping */
void PNGAPI
png_set_swap(png_structp png_ptr)
{
- png_debug(1, "in png_set_swap\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_swap");
+ if (png_ptr == NULL)
+ return;
if (png_ptr->bit_depth == 16)
png_ptr->transformations |= PNG_SWAP_BYTES;
}
#endif
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
-/* turn on pixel packing */
+/* Turn on pixel packing */
void PNGAPI
png_set_packing(png_structp png_ptr)
{
- png_debug(1, "in png_set_packing\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_packing");
+ if (png_ptr == NULL)
+ return;
if (png_ptr->bit_depth < 8)
{
png_ptr->transformations |= PNG_PACK;
@@ -51,12 +57,13 @@ png_set_packing(png_structp png_ptr)
#endif
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-/* turn on packed pixel swapping */
+/* Turn on packed pixel swapping */
void PNGAPI
png_set_packswap(png_structp png_ptr)
{
- png_debug(1, "in png_set_packswap\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_packswap");
+ if (png_ptr == NULL)
+ return;
if (png_ptr->bit_depth < 8)
png_ptr->transformations |= PNG_PACKSWAP;
}
@@ -66,8 +73,9 @@ png_set_packswap(png_structp png_ptr)
void PNGAPI
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
{
- png_debug(1, "in png_set_shift\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_shift");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_SHIFT;
png_ptr->shift = *true_bits;
}
@@ -78,7 +86,7 @@ png_set_shift(png_structp png_ptr, png_color_8p true_bits)
int PNGAPI
png_set_interlace_handling(png_structp png_ptr)
{
- png_debug(1, "in png_set_interlace handling\n");
+ png_debug(1, "in png_set_interlace handling");
if (png_ptr && png_ptr->interlaced)
{
png_ptr->transformations |= PNG_INTERLACE;
@@ -98,8 +106,9 @@ png_set_interlace_handling(png_structp png_ptr)
void PNGAPI
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
{
- png_debug(1, "in png_set_filler\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_filler");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_FILLER;
png_ptr->filler = (png_byte)filler;
if (filler_loc == PNG_FILLER_AFTER)
@@ -131,8 +140,9 @@ png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
void PNGAPI
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
{
- png_debug(1, "in png_set_add_alpha\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_add_alpha");
+ if (png_ptr == NULL)
+ return;
png_set_filler(png_ptr, filler, filler_loc);
png_ptr->transformations |= PNG_ADD_ALPHA;
}
@@ -145,8 +155,9 @@ png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
void PNGAPI
png_set_swap_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_swap_alpha\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_swap_alpha");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_SWAP_ALPHA;
}
#endif
@@ -156,8 +167,9 @@ png_set_swap_alpha(png_structp png_ptr)
void PNGAPI
png_set_invert_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_invert_alpha\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_invert_alpha");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_INVERT_ALPHA;
}
#endif
@@ -166,16 +178,17 @@ png_set_invert_alpha(png_structp png_ptr)
void PNGAPI
png_set_invert_mono(png_structp png_ptr)
{
- png_debug(1, "in png_set_invert_mono\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_invert_mono");
+ if (png_ptr == NULL)
+ return;
png_ptr->transformations |= PNG_INVERT_MONO;
}
-/* invert monochrome grayscale data */
+/* Invert monochrome grayscale data */
void /* PRIVATE */
png_do_invert(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_invert\n");
+ png_debug(1, "in png_do_invert");
/* This test removed from libpng version 1.0.13 and 1.2.0:
* if (row_info->bit_depth == 1 &&
*/
@@ -226,11 +239,11 @@ png_do_invert(png_row_infop row_info, png_bytep row)
#endif
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-/* swaps byte order on 16 bit depth images */
+/* Swaps byte order on 16 bit depth images */
void /* PRIVATE */
png_do_swap(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_swap\n");
+ png_debug(1, "in png_do_swap");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -357,11 +370,11 @@ static PNG_CONST png_byte fourbppswaptable[256] = {
0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
};
-/* swaps pixel packing order within bytes */
+/* Swaps pixel packing order within bytes */
void /* PRIVATE */
png_do_packswap(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_packswap\n");
+ png_debug(1, "in png_do_packswap");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -389,11 +402,11 @@ png_do_packswap(png_row_infop row_info, png_bytep row)
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-/* remove filler or alpha byte(s) */
+/* Remove filler or alpha byte(s) */
void /* PRIVATE */
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
{
- png_debug(1, "in png_do_strip_filler\n");
+ png_debug(1, "in png_do_strip_filler");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -404,9 +417,9 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
png_uint_32 i;
if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
- (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
- (flags & PNG_FLAG_STRIP_ALPHA))) &&
- row_info->channels == 4)
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
+ (flags & PNG_FLAG_STRIP_ALPHA))) &&
+ row_info->channels == 4)
{
if (row_info->bit_depth == 8)
{
@@ -547,11 +560,11 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
#endif
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-/* swaps red and blue bytes within a pixel */
+/* Swaps red and blue bytes within a pixel */
void /* PRIVATE */
png_do_bgr(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_bgr\n");
+ png_debug(1, "in png_do_bgr");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -624,20 +637,21 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
+ defined(PNG_LEGACY_SUPPORTED) || \
+ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
void PNGAPI
png_set_user_transform_info(png_structp png_ptr, png_voidp
user_transform_ptr, int user_transform_depth, int user_transform_channels)
{
- png_debug(1, "in png_set_user_transform_info\n");
- if(png_ptr == NULL) return;
+ png_debug(1, "in png_set_user_transform_info");
+ if (png_ptr == NULL)
+ return;
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
png_ptr->user_transform_ptr = user_transform_ptr;
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
#else
- if(user_transform_ptr || user_transform_depth || user_transform_channels)
+ if (user_transform_ptr || user_transform_depth || user_transform_channels)
png_warning(png_ptr,
"This version of libpng does not support user transform info");
#endif
@@ -652,8 +666,9 @@ png_set_user_transform_info(png_structp png_ptr, png_voidp
png_voidp PNGAPI
png_get_user_transform_ptr(png_structp png_ptr)
{
+ if (png_ptr == NULL)
+ return (NULL);
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if (png_ptr == NULL) return (NULL);
return ((png_voidp)png_ptr->user_transform_ptr);
#else
return (NULL);
diff --git a/src/3rdparty/libpng/pngwio.c b/src/3rdparty/libpng/pngwio.c
index 371a4fa..f77b2db 100644
--- a/src/3rdparty/libpng/pngwio.c
+++ b/src/3rdparty/libpng/pngwio.c
@@ -1,12 +1,15 @@
/* pngwio.c - functions for data output
*
- * Last changed in libpng 1.2.13 November 13, 2006
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2006 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
+ *
* This file provides a location for all output. Users who need
* special handling are expected to write functions that have the same
* arguments as these and perform similar functions, but that possibly
@@ -20,10 +23,11 @@
#ifdef PNG_WRITE_SUPPORTED
/* Write the data to whatever output you are using. The default routine
- writes to a file pointer. Note that this routine sometimes gets called
- with very small lengths, so you should implement some kind of simple
- buffering if you are using unbuffered writes. This should never be asked
- to write more than 64K on a 16 bit machine. */
+ * writes to a file pointer. Note that this routine sometimes gets called
+ * with very small lengths, so you should implement some kind of simple
+ * buffering if you are using unbuffered writes. This should never be asked
+ * to write more than 64K on a 16 bit machine.
+ */
void /* PRIVATE */
png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
@@ -36,16 +40,18 @@ png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
#if !defined(PNG_NO_STDIO)
/* This is the function that does the actual writing of data. If you are
- not writing to a standard C stream, you should create a replacement
- write_data function and use it at run time with png_set_write_fn(), rather
- than changing the library. */
+ * not writing to a standard C stream, you should create a replacement
+ * write_data function and use it at run time with png_set_write_fn(), rather
+ * than changing the library.
+ */
#ifndef USE_FAR_KEYWORD
void PNGAPI
png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
png_uint_32 check;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
#if defined(_WIN32_WCE)
if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
check = 0;
@@ -56,10 +62,10 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
png_error(png_ptr, "Write Error");
}
#else
-/* this is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
+/* This is the model-independent version. Since the standard I/O library
+ * can't handle far buffers in the medium and small models, we have to copy
+ * the data.
+ */
#define NEAR_BUF_SIZE 1024
#define MIN(a,b) (a <= b ? a : b)
@@ -71,7 +77,8 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */
png_FILE_p io_ptr;
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
/* Check if data really is near. If so, use usual code. */
near_data = (png_byte *)CVT_PTR_NOCHECK(data);
io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
@@ -93,7 +100,7 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
do
{
written = MIN(NEAR_BUF_SIZE, remaining);
- png_memcpy(buf, data, written); /* copy far buffer to near buffer */
+ png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
#if defined(_WIN32_WCE)
if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
err = 0;
@@ -102,8 +109,10 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
#endif
if (err != written)
break;
+
else
check += err;
+
data += written;
remaining -= written;
}
@@ -117,8 +126,9 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
#endif
/* This function is called to output any data pending writing (normally
- to disk). After png_flush is called, there should be no data pending
- writing in any buffers. */
+ * to disk). After png_flush is called, there should be no data pending
+ * writing in any buffers.
+ */
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
void /* PRIVATE */
png_flush(png_structp png_ptr)
@@ -134,48 +144,58 @@ png_default_flush(png_structp png_ptr)
#if !defined(_WIN32_WCE)
png_FILE_p io_ptr;
#endif
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
#if !defined(_WIN32_WCE)
io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
- if (io_ptr != NULL)
- fflush(io_ptr);
+ fflush(io_ptr);
#endif
}
#endif
#endif
/* This function allows the application to supply new output functions for
- libpng if standard C streams aren't being used.
-
- This function takes as its arguments:
- png_ptr - pointer to a png output data structure
- io_ptr - pointer to user supplied structure containing info about
- the output functions. May be NULL.
- write_data_fn - pointer to a new output function that takes as its
- arguments a pointer to a png_struct, a pointer to
- data to be written, and a 32-bit unsigned int that is
- the number of bytes to be written. The new write
- function should call png_error(png_ptr, "Error msg")
- to exit and output any fatal error messages.
- flush_data_fn - pointer to a new flush function that takes as its
- arguments a pointer to a png_struct. After a call to
- the flush function, there should be no data in any buffers
- or pending transmission. If the output method doesn't do
- any buffering of ouput, a function prototype must still be
- supplied although it doesn't have to do anything. If
- PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
- time, output_flush_fn will be ignored, although it must be
- supplied for compatibility. */
+ * libpng if standard C streams aren't being used.
+ *
+ * This function takes as its arguments:
+ * png_ptr - pointer to a png output data structure
+ * io_ptr - pointer to user supplied structure containing info about
+ * the output functions. May be NULL.
+ * write_data_fn - pointer to a new output function that takes as its
+ * arguments a pointer to a png_struct, a pointer to
+ * data to be written, and a 32-bit unsigned int that is
+ * the number of bytes to be written. The new write
+ * function should call png_error(png_ptr, "Error msg")
+ * to exit and output any fatal error messages. May be
+ * NULL, in which case libpng's default function will
+ * be used.
+ * flush_data_fn - pointer to a new flush function that takes as its
+ * arguments a pointer to a png_struct. After a call to
+ * the flush function, there should be no data in any buffers
+ * or pending transmission. If the output method doesn't do
+ * any buffering of ouput, a function prototype must still be
+ * supplied although it doesn't have to do anything. If
+ * PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
+ * time, output_flush_fn will be ignored, although it must be
+ * supplied for compatibility. May be NULL, in which case
+ * libpng's default function will be used, if
+ * PNG_WRITE_FLUSH_SUPPORTED is defined. This is not
+ * a good idea if io_ptr does not point to a standard
+ * *FILE structure.
+ */
void PNGAPI
png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
+
png_ptr->io_ptr = io_ptr;
#if !defined(PNG_NO_STDIO)
if (write_data_fn != NULL)
png_ptr->write_data_fn = write_data_fn;
+
else
png_ptr->write_data_fn = png_default_write_data;
#else
@@ -186,6 +206,7 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
#if !defined(PNG_NO_STDIO)
if (output_flush_fn != NULL)
png_ptr->output_flush_fn = output_flush_fn;
+
else
png_ptr->output_flush_fn = png_default_flush;
#else
@@ -206,27 +227,31 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
#if defined(USE_FAR_KEYWORD)
#if defined(_MSC_VER)
-void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
+void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
{
void *near_ptr;
void FAR *far_ptr;
FP_OFF(near_ptr) = FP_OFF(ptr);
far_ptr = (void FAR *)near_ptr;
- if(check != 0)
- if(FP_SEG(ptr) != FP_SEG(far_ptr))
- png_error(png_ptr,"segment lost in conversion");
+
+ if (check != 0)
+ if (FP_SEG(ptr) != FP_SEG(far_ptr))
+ png_error(png_ptr, "segment lost in conversion");
+
return(near_ptr);
}
# else
-void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
+void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
{
void *near_ptr;
void FAR *far_ptr;
near_ptr = (void FAR *)ptr;
far_ptr = (void FAR *)near_ptr;
- if(check != 0)
- if(far_ptr != ptr)
- png_error(png_ptr,"segment lost in conversion");
+
+ if (check != 0)
+ if (far_ptr != ptr)
+ png_error(png_ptr, "segment lost in conversion");
+
return(near_ptr);
}
# endif
diff --git a/src/3rdparty/libpng/pngwrite.c b/src/3rdparty/libpng/pngwrite.c
index 7d02ad7..0987612 100644
--- a/src/3rdparty/libpng/pngwrite.c
+++ b/src/3rdparty/libpng/pngwrite.c
@@ -1,14 +1,17 @@
/* pngwrite.c - general routines to write a PNG file
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
-/* get internal access to png.h */
+/* Get internal access to png.h */
#define PNG_INTERNAL
#include "png.h"
#ifdef PNG_WRITE_SUPPORTED
@@ -25,20 +28,20 @@
void PNGAPI
png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_write_info_before_PLTE\n");
+ png_debug(1, "in png_write_info_before_PLTE");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
{
- png_write_sig(png_ptr); /* write PNG signature */
+ png_write_sig(png_ptr); /* Write PNG signature */
#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))
+ if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))
{
- png_warning(png_ptr,"MNG features are not allowed in a PNG datastream");
+ png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
png_ptr->mng_features_permitted=0;
}
#endif
- /* write IHDR information. */
+ /* Write IHDR information. */
png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
info_ptr->filter_type,
@@ -47,8 +50,9 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
#else
0);
#endif
- /* the rest of these check to see if the valid field has the appropriate
- flag set, and if it does, writes the chunk. */
+ /* The rest of these check to see if the valid field has the appropriate
+ * flag set, and if it does, writes the chunk.
+ */
#if defined(PNG_WRITE_gAMA_SUPPORTED)
if (info_ptr->valid & PNG_INFO_gAMA)
{
@@ -97,14 +101,14 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
{
- png_unknown_chunk *up;
+ png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
+ for (up = info_ptr->unknown_chunks;
+ up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
+ up++)
+ {
int keep=png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
up->location && !(up->location & PNG_HAVE_PLTE) &&
@@ -116,7 +120,7 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
png_warning(png_ptr, "Writing zero-length unknown chunk");
png_write_chunk(png_ptr, up->name, up->data, up->size);
}
- }
+ }
}
#endif
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
@@ -130,7 +134,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
int i;
#endif
- png_debug(1, "in png_write_info\n");
+ png_debug(1, "in png_write_info");
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -145,20 +149,20 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
#if defined(PNG_WRITE_tRNS_SUPPORTED)
if (info_ptr->valid & PNG_INFO_tRNS)
- {
+ {
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel (in tRNS) */
- if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&
- info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- int j;
- for (j=0; j<(int)info_ptr->num_trans; j++)
- info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);
- }
+ /* Invert the alpha channel (in tRNS) */
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&
+ info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ int j;
+ for (j=0; j<(int)info_ptr->num_trans; j++)
+ info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);
+ }
#endif
png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values),
info_ptr->num_trans, info_ptr->color_type);
- }
+ }
#endif
#if defined(PNG_WRITE_bKGD_SUPPORTED)
if (info_ptr->valid & PNG_INFO_bKGD)
@@ -179,49 +183,56 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
info_ptr->pcal_units, info_ptr->pcal_params);
#endif
-#if defined(PNG_WRITE_sCAL_SUPPORTED)
+
+#if defined(PNG_sCAL_SUPPORTED)
if (info_ptr->valid & PNG_INFO_sCAL)
+#if defined(PNG_WRITE_sCAL_SUPPORTED)
#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
png_write_sCAL(png_ptr, (int)info_ptr->scal_unit,
info_ptr->scal_pixel_width, info_ptr->scal_pixel_height);
-#else
+#else /* !FLOATING_POINT */
#ifdef PNG_FIXED_POINT_SUPPORTED
png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
info_ptr->scal_s_width, info_ptr->scal_s_height);
-#else
+#endif /* FIXED_POINT */
+#endif /* FLOATING_POINT */
+#else /* !WRITE_sCAL */
png_warning(png_ptr,
"png_write_sCAL not supported; sCAL chunk not written.");
-#endif
-#endif
-#endif
+#endif /* WRITE_sCAL */
+#endif /* sCAL */
+
#if defined(PNG_WRITE_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
-#endif
+#endif /* pHYs */
+
#if defined(PNG_WRITE_tIME_SUPPORTED)
if (info_ptr->valid & PNG_INFO_tIME)
{
png_write_tIME(png_ptr, &(info_ptr->mod_time));
png_ptr->mode |= PNG_WROTE_tIME;
}
-#endif
+#endif /* tIME */
+
#if defined(PNG_WRITE_sPLT_SUPPORTED)
if (info_ptr->valid & PNG_INFO_sPLT)
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
-#endif
+#endif /* sPLT */
+
#if defined(PNG_WRITE_TEXT_SUPPORTED)
/* Check to see if we need to write text chunks */
for (i = 0; i < info_ptr->num_text; i++)
{
- png_debug2(2, "Writing header text chunk %d, type %d\n", i,
+ png_debug2(2, "Writing header text chunk %d, type %d", i,
info_ptr->text[i].compression);
- /* an internationalized chunk? */
+ /* An internationalized chunk? */
if (info_ptr->text[i].compression > 0)
{
#if defined(PNG_WRITE_iTXt_SUPPORTED)
- /* write international chunk */
+ /* Write international chunk */
png_write_iTXt(png_ptr,
info_ptr->text[i].compression,
info_ptr->text[i].key,
@@ -238,7 +249,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)
{
#if defined(PNG_WRITE_zTXt_SUPPORTED)
- /* write compressed chunk */
+ /* Write compressed chunk */
png_write_zTXt(png_ptr, info_ptr->text[i].key,
info_ptr->text[i].text, 0,
info_ptr->text[i].compression);
@@ -251,24 +262,26 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
{
#if defined(PNG_WRITE_tEXt_SUPPORTED)
- /* write uncompressed chunk */
+ /* Write uncompressed chunk */
png_write_tEXt(png_ptr, info_ptr->text[i].key,
info_ptr->text[i].text,
0);
+ /* Mark this chunk as written */
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
#else
+ /* Can't get here */
png_warning(png_ptr, "Unable to write uncompressed text");
#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
}
}
-#endif
+#endif /* tEXt */
+
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
{
png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
for (up = info_ptr->unknown_chunks;
up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
@@ -296,35 +309,35 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
void PNGAPI
png_write_end(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_write_end\n");
+ png_debug(1, "in png_write_end");
if (png_ptr == NULL)
return;
if (!(png_ptr->mode & PNG_HAVE_IDAT))
png_error(png_ptr, "No IDATs written into file");
- /* see if user wants us to write information chunks */
+ /* See if user wants us to write information chunks */
if (info_ptr != NULL)
{
#if defined(PNG_WRITE_TEXT_SUPPORTED)
- int i; /* local index variable */
+ int i; /* Local index variable */
#endif
#if defined(PNG_WRITE_tIME_SUPPORTED)
- /* check to see if user has supplied a time chunk */
+ /* Check to see if user has supplied a time chunk */
if ((info_ptr->valid & PNG_INFO_tIME) &&
!(png_ptr->mode & PNG_WROTE_tIME))
png_write_tIME(png_ptr, &(info_ptr->mod_time));
#endif
#if defined(PNG_WRITE_TEXT_SUPPORTED)
- /* loop through comment chunks */
+ /* Loop through comment chunks */
for (i = 0; i < info_ptr->num_text; i++)
{
- png_debug2(2, "Writing trailer text chunk %d, type %d\n", i,
+ png_debug2(2, "Writing trailer text chunk %d, type %d", i,
info_ptr->text[i].compression);
- /* an internationalized chunk? */
+ /* An internationalized chunk? */
if (info_ptr->text[i].compression > 0)
{
#if defined(PNG_WRITE_iTXt_SUPPORTED)
- /* write international chunk */
+ /* Write international chunk */
png_write_iTXt(png_ptr,
info_ptr->text[i].compression,
info_ptr->text[i].key,
@@ -340,7 +353,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
{
#if defined(PNG_WRITE_zTXt_SUPPORTED)
- /* write compressed chunk */
+ /* Write compressed chunk */
png_write_zTXt(png_ptr, info_ptr->text[i].key,
info_ptr->text[i].text, 0,
info_ptr->text[i].compression);
@@ -353,7 +366,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
{
#if defined(PNG_WRITE_tEXt_SUPPORTED)
- /* write uncompressed chunk */
+ /* Write uncompressed chunk */
png_write_tEXt(png_ptr, info_ptr->text[i].key,
info_ptr->text[i].text, 0);
#else
@@ -370,7 +383,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
{
png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
for (up = info_ptr->unknown_chunks;
up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
@@ -391,8 +404,20 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
png_ptr->mode |= PNG_AFTER_IDAT;
- /* write end of PNG file */
+ /* Write end of PNG file */
png_write_IEND(png_ptr);
+ /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,
+ * and restored again in libpng-1.2.30, may cause some applications that
+ * do not set png_ptr->output_flush_fn to crash. If your application
+ * experiences a problem, please try building libpng with
+ * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to
+ * png-mng-implement at lists.sf.net . This kludge will be removed
+ * from libpng-1.4.0.
+ */
+#if defined(PNG_WRITE_FLUSH_SUPPORTED) && \
+ defined(PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED)
+ png_flush(png_ptr);
+#endif
}
#if defined(PNG_WRITE_tIME_SUPPORTED)
@@ -401,7 +426,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
void PNGAPI
png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime)
{
- png_debug(1, "in png_convert_from_struct_tm\n");
+ png_debug(1, "in png_convert_from_struct_tm");
ptime->year = (png_uint_16)(1900 + ttime->tm_year);
ptime->month = (png_byte)(ttime->tm_mon + 1);
ptime->day = (png_byte)ttime->tm_mday;
@@ -415,7 +440,7 @@ png_convert_from_time_t(png_timep ptime, time_t ttime)
{
struct tm *tbuf;
- png_debug(1, "in png_convert_from_time_t\n");
+ png_debug(1, "in png_convert_from_time_t");
tbuf = gmtime(&ttime);
png_convert_from_struct_tm(ptime, tbuf);
}
@@ -439,14 +464,17 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
png_malloc_ptr malloc_fn, png_free_ptr free_fn)
{
#endif /* PNG_USER_MEM_SUPPORTED */
- png_structp png_ptr;
+#ifdef PNG_SETJMP_SUPPORTED
+ volatile
+#endif
+ png_structp png_ptr;
#ifdef PNG_SETJMP_SUPPORTED
#ifdef USE_FAR_KEYWORD
jmp_buf jmpbuf;
#endif
#endif
int i;
- png_debug(1, "in png_create_write_struct\n");
+ png_debug(1, "in png_create_write_struct");
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
(png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
@@ -456,7 +484,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
if (png_ptr == NULL)
return (NULL);
- /* added at libpng-1.2.6 */
+ /* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
@@ -470,12 +498,12 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
#endif
{
png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf=NULL;
+ png_ptr->zbuf=NULL;
png_destroy_struct(png_ptr);
return (NULL);
}
#ifdef USE_FAR_KEYWORD
- png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
#endif
#endif
@@ -484,12 +512,12 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
#endif /* PNG_USER_MEM_SUPPORTED */
png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
- if(user_png_ver)
+ if (user_png_ver)
{
i=0;
do
{
- if(user_png_ver[i] != png_libpng_ver[i])
+ if (user_png_ver[i] != png_libpng_ver[i])
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
} while (png_libpng_ver[i++]);
}
@@ -527,7 +555,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
}
}
- /* initialize zbuf - compression buffer */
+ /* Initialize zbuf - compression buffer */
png_ptr->zbuf_size = PNG_ZBUF_SIZE;
png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
(png_uint_32)png_ptr->zbuf_size);
@@ -547,7 +575,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
#ifdef USE_FAR_KEYWORD
if (setjmp(jmpbuf))
PNG_ABORT();
- png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));
#else
if (setjmp(png_ptr->jmpbuf))
PNG_ABORT();
@@ -572,9 +600,9 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,
png_size_t png_struct_size, png_size_t png_info_size)
{
/* We only come here via pre-1.0.12-compiled applications */
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL) return;
#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- if(png_sizeof(png_struct) > png_struct_size ||
+ if (png_sizeof(png_struct) > png_struct_size ||
png_sizeof(png_info) > png_info_size)
{
char msg[80];
@@ -592,7 +620,7 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,
png_warning(png_ptr, msg);
}
#endif
- if(png_sizeof(png_struct) > png_struct_size)
+ if (png_sizeof(png_struct) > png_struct_size)
{
png_ptr->error_fn=NULL;
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
@@ -601,7 +629,7 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,
png_error(png_ptr,
"The png struct allocated by the application for writing is too small.");
}
- if(png_sizeof(png_info) > png_info_size)
+ if (png_sizeof(png_info) > png_info_size)
{
png_ptr->error_fn=NULL;
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
@@ -621,7 +649,7 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
{
png_structp png_ptr=*ptr_ptr;
#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* to save current jump buffer */
+ jmp_buf tmp_jmp; /* To save current jump buffer */
#endif
int i = 0;
@@ -638,17 +666,17 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
#else
png_ptr->warning_fn=NULL;
png_warning(png_ptr,
- "Application uses deprecated png_write_init() and should be recompiled.");
+ "Application uses deprecated png_write_init() and should be recompiled.");
break;
#endif
}
} while (png_libpng_ver[i++]);
- png_debug(1, "in png_write_init_3\n");
+ png_debug(1, "in png_write_init_3");
#ifdef PNG_SETJMP_SUPPORTED
- /* save jump buffer and error functions */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
+ /* Save jump buffer and error functions */
+ png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
if (png_sizeof(png_struct) > png_struct_size)
@@ -658,24 +686,24 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
*ptr_ptr = png_ptr;
}
- /* reset all variables to 0 */
- png_memset(png_ptr, 0, png_sizeof (png_struct));
+ /* Reset all variables to 0 */
+ png_memset(png_ptr, 0, png_sizeof(png_struct));
- /* added at libpng-1.2.6 */
+ /* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
#endif
#ifdef PNG_SETJMP_SUPPORTED
- /* restore jump buffer */
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
+ /* Restore jump buffer */
+ png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
#endif
png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,
png_flush_ptr_NULL);
- /* initialize zbuf - compression buffer */
+ /* Initialize zbuf - compression buffer */
png_ptr->zbuf_size = PNG_ZBUF_SIZE;
png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
(png_uint_32)png_ptr->zbuf_size);
@@ -695,15 +723,15 @@ void PNGAPI
png_write_rows(png_structp png_ptr, png_bytepp row,
png_uint_32 num_rows)
{
- png_uint_32 i; /* row counter */
- png_bytepp rp; /* row pointer */
+ png_uint_32 i; /* Row counter */
+ png_bytepp rp; /* Row pointer */
- png_debug(1, "in png_write_rows\n");
+ png_debug(1, "in png_write_rows");
if (png_ptr == NULL)
return;
- /* loop through the rows */
+ /* Loop through the rows */
for (i = 0, rp = row; i < num_rows; i++, rp++)
{
png_write_row(png_ptr, *rp);
@@ -716,25 +744,26 @@ png_write_rows(png_structp png_ptr, png_bytepp row,
void PNGAPI
png_write_image(png_structp png_ptr, png_bytepp image)
{
- png_uint_32 i; /* row index */
- int pass, num_pass; /* pass variables */
- png_bytepp rp; /* points to current row */
+ png_uint_32 i; /* Row index */
+ int pass, num_pass; /* Pass variables */
+ png_bytepp rp; /* Points to current row */
if (png_ptr == NULL)
return;
- png_debug(1, "in png_write_image\n");
+ png_debug(1, "in png_write_image");
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* intialize interlace handling. If image is not interlaced,
- this will set pass to 1 */
+ /* Initialize interlace handling. If image is not interlaced,
+ * this will set pass to 1
+ */
num_pass = png_set_interlace_handling(png_ptr);
#else
num_pass = 1;
#endif
- /* loop through passes */
+ /* Loop through passes */
for (pass = 0; pass < num_pass; pass++)
{
- /* loop through image */
+ /* Loop through image */
for (i = 0, rp = image; i < png_ptr->height; i++, rp++)
{
png_write_row(png_ptr, *rp);
@@ -742,58 +771,58 @@ png_write_image(png_structp png_ptr, png_bytepp image)
}
}
-/* called by user to write a row of image data */
+/* Called by user to write a row of image data */
void PNGAPI
png_write_row(png_structp png_ptr, png_bytep row)
{
if (png_ptr == NULL)
return;
- png_debug2(1, "in png_write_row (row %ld, pass %d)\n",
+ png_debug2(1, "in png_write_row (row %ld, pass %d)",
png_ptr->row_number, png_ptr->pass);
- /* initialize transformations and other stuff if first time */
+ /* Initialize transformations and other stuff if first time */
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
- /* make sure we wrote the header info */
- if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
- png_error(png_ptr,
- "png_write_info was never called before png_write_row.");
+ /* Make sure we wrote the header info */
+ if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
+ png_error(png_ptr,
+ "png_write_info was never called before png_write_row.");
- /* check for transforms that have been set but were defined out */
+ /* Check for transforms that have been set but were defined out */
#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_INVERT_MONO)
+ png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
- png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_FILLER)
+ png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_PACKSWAP)
+ png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
- png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_PACK)
+ png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
- png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_SHIFT)
+ png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
- png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_BGR)
+ png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined.");
#endif
#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined.");
+ if (png_ptr->transformations & PNG_SWAP_BYTES)
+ png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined.");
#endif
png_write_start_row(png_ptr);
}
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* if interlaced and not interested in row, return */
+ /* If interlaced and not interested in row, return */
if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
{
switch (png_ptr->pass)
@@ -851,7 +880,7 @@ png_write_row(png_structp png_ptr, png_bytep row)
}
#endif
- /* set up row info for transformations */
+ /* Set up row info for transformations */
png_ptr->row_info.color_type = png_ptr->color_type;
png_ptr->row_info.width = png_ptr->usr_width;
png_ptr->row_info.channels = png_ptr->usr_channels;
@@ -862,25 +891,25 @@ png_write_row(png_structp png_ptr, png_bytep row)
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
png_ptr->row_info.width);
- png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type);
- png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width);
- png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels);
- png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth);
- png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth);
- png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes);
+ png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type);
+ png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width);
+ png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels);
+ png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth);
+ png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth);
+ png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes);
/* Copy user's row into buffer, leaving room for filter byte. */
png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row,
png_ptr->row_info.rowbytes);
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* handle interlacing */
+ /* Handle interlacing */
if (png_ptr->interlaced && png_ptr->pass < 6 &&
(png_ptr->transformations & PNG_INTERLACE))
{
png_do_write_interlace(&(png_ptr->row_info),
png_ptr->row_buf + 1, png_ptr->pass);
- /* this should always get caught above, but still ... */
+ /* This should always get caught above, but still ... */
if (!(png_ptr->row_info.width))
{
png_write_finish_row(png_ptr);
@@ -889,7 +918,7 @@ png_write_row(png_structp png_ptr, png_bytep row)
}
#endif
- /* handle other transformations */
+ /* Handle other transformations */
if (png_ptr->transformations)
png_do_write_transformations(png_ptr);
@@ -903,7 +932,7 @@ png_write_row(png_structp png_ptr, png_bytep row)
* 4. The filter_method is 64 and
* 5. The color_type is RGB or RGBA
*/
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
@@ -923,34 +952,34 @@ png_write_row(png_structp png_ptr, png_bytep row)
void PNGAPI
png_set_flush(png_structp png_ptr, int nrows)
{
- png_debug(1, "in png_set_flush\n");
+ png_debug(1, "in png_set_flush");
if (png_ptr == NULL)
return;
png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
}
-/* flush the current output buffers now */
+/* Flush the current output buffers now */
void PNGAPI
png_write_flush(png_structp png_ptr)
{
int wrote_IDAT;
- png_debug(1, "in png_write_flush\n");
+ png_debug(1, "in png_write_flush");
if (png_ptr == NULL)
return;
/* We have already written out all of the data */
if (png_ptr->row_number >= png_ptr->num_rows)
- return;
+ return;
do
{
int ret;
- /* compress the data */
+ /* Compress the data */
ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH);
wrote_IDAT = 0;
- /* check for compression errors */
+ /* Check for compression errors */
if (ret != Z_OK)
{
if (png_ptr->zstream.msg != NULL)
@@ -961,7 +990,7 @@ png_write_flush(png_structp png_ptr)
if (!(png_ptr->zstream.avail_out))
{
- /* write the IDAT and reset the zlib output buffer */
+ /* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf,
png_ptr->zbuf_size);
png_ptr->zstream.next_out = png_ptr->zbuf;
@@ -973,7 +1002,7 @@ png_write_flush(png_structp png_ptr)
/* If there is any data left to be output, write it into a new IDAT */
if (png_ptr->zbuf_size != png_ptr->zstream.avail_out)
{
- /* write the IDAT and reset the zlib output buffer */
+ /* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf,
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
png_ptr->zstream.next_out = png_ptr->zbuf;
@@ -984,7 +1013,7 @@ png_write_flush(png_structp png_ptr)
}
#endif /* PNG_WRITE_FLUSH_SUPPORTED */
-/* free all memory used by the write */
+/* Free all memory used by the write */
void PNGAPI
png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
{
@@ -995,7 +1024,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
png_voidp mem_ptr = NULL;
#endif
- png_debug(1, "in png_destroy_write_struct\n");
+ png_debug(1, "in png_destroy_write_struct");
if (png_ptr_ptr != NULL)
{
png_ptr = *png_ptr_ptr;
@@ -1027,7 +1056,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
{
png_free(png_ptr, png_ptr->chunk_list);
png_ptr->chunk_list=NULL;
- png_ptr->num_chunk_list=0;
+ png_ptr->num_chunk_list = 0;
}
#endif
}
@@ -1060,7 +1089,7 @@ void /* PRIVATE */
png_write_destroy(png_structp png_ptr)
{
#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* save jump buffer */
+ jmp_buf tmp_jmp; /* Save jump buffer */
#endif
png_error_ptr error_fn;
png_error_ptr warning_fn;
@@ -1069,14 +1098,14 @@ png_write_destroy(png_structp png_ptr)
png_free_ptr free_fn;
#endif
- png_debug(1, "in png_write_destroy\n");
- /* free any memory zlib uses */
+ png_debug(1, "in png_write_destroy");
+ /* Free any memory zlib uses */
deflateEnd(&png_ptr->zstream);
- /* free our memory. png_free checks NULL for us. */
+ /* Free our memory. png_free checks NULL for us. */
png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->row_buf);
-#ifndef PNG_NO_WRITE_FILTERING
+#ifndef PNG_NO_WRITE_FILTER
png_free(png_ptr, png_ptr->prev_row);
png_free(png_ptr, png_ptr->sub_row);
png_free(png_ptr, png_ptr->up_row);
@@ -1097,8 +1126,8 @@ png_write_destroy(png_structp png_ptr)
#endif
#ifdef PNG_SETJMP_SUPPORTED
- /* reset structure */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf));
+ /* Reset structure */
+ png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
error_fn = png_ptr->error_fn;
@@ -1108,7 +1137,7 @@ png_write_destroy(png_structp png_ptr)
free_fn = png_ptr->free_fn;
#endif
- png_memset(png_ptr, 0, png_sizeof (png_struct));
+ png_memset(png_ptr, 0, png_sizeof(png_struct));
png_ptr->error_fn = error_fn;
png_ptr->warning_fn = warning_fn;
@@ -1118,7 +1147,7 @@ png_write_destroy(png_structp png_ptr)
#endif
#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf));
+ png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
#endif
}
@@ -1126,11 +1155,11 @@ png_write_destroy(png_structp png_ptr)
void PNGAPI
png_set_filter(png_structp png_ptr, int method, int filters)
{
- png_debug(1, "in png_set_filter\n");
+ png_debug(1, "in png_set_filter");
if (png_ptr == NULL)
return;
#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
(method == PNG_INTRAPIXEL_DIFFERENCING))
method = PNG_FILTER_TYPE_BASE;
#endif
@@ -1249,7 +1278,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
{
int i;
- png_debug(1, "in png_set_filter_heuristics\n");
+ png_debug(1, "in png_set_filter_heuristics");
if (png_ptr == NULL)
return;
if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST)
@@ -1363,7 +1392,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
void PNGAPI
png_set_compression_level(png_structp png_ptr, int level)
{
- png_debug(1, "in png_set_compression_level\n");
+ png_debug(1, "in png_set_compression_level");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL;
@@ -1373,7 +1402,7 @@ png_set_compression_level(png_structp png_ptr, int level)
void PNGAPI
png_set_compression_mem_level(png_structp png_ptr, int mem_level)
{
- png_debug(1, "in png_set_compression_mem_level\n");
+ png_debug(1, "in png_set_compression_mem_level");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL;
@@ -1383,7 +1412,7 @@ png_set_compression_mem_level(png_structp png_ptr, int mem_level)
void PNGAPI
png_set_compression_strategy(png_structp png_ptr, int strategy)
{
- png_debug(1, "in png_set_compression_strategy\n");
+ png_debug(1, "in png_set_compression_strategy");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;
@@ -1400,7 +1429,7 @@ png_set_compression_window_bits(png_structp png_ptr, int window_bits)
else if (window_bits < 8)
png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
#ifndef WBITS_8_OK
- /* avoid libpng bug with 256-byte windows */
+ /* Avoid libpng bug with 256-byte windows */
if (window_bits == 8)
{
png_warning(png_ptr, "Compression window is being reset to 512");
@@ -1414,7 +1443,7 @@ png_set_compression_window_bits(png_structp png_ptr, int window_bits)
void PNGAPI
png_set_compression_method(png_structp png_ptr, int method)
{
- png_debug(1, "in png_set_compression_method\n");
+ png_debug(1, "in png_set_compression_method");
if (png_ptr == NULL)
return;
if (method != 8)
@@ -1436,7 +1465,7 @@ void PNGAPI
png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
write_user_transform_fn)
{
- png_debug(1, "in png_set_write_user_transform_fn\n");
+ png_debug(1, "in png_set_write_user_transform_fn");
if (png_ptr == NULL)
return;
png_ptr->transformations |= PNG_USER_TRANSFORM;
@@ -1453,9 +1482,9 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,
if (png_ptr == NULL || info_ptr == NULL)
return;
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel from opacity to transparency */
+ /* Invert the alpha channel from opacity to transparency */
if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
- png_set_invert_alpha(png_ptr);
+ png_set_invert_alpha(png_ptr);
#endif
/* Write the file header information. */
@@ -1464,9 +1493,9 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,
/* ------ these transformations don't touch the info structure ------- */
#if defined(PNG_WRITE_INVERT_SUPPORTED)
- /* invert monochrome pixels */
+ /* Invert monochrome pixels */
if (transforms & PNG_TRANSFORM_INVERT_MONO)
- png_set_invert_mono(png_ptr);
+ png_set_invert_mono(png_ptr);
#endif
#if defined(PNG_WRITE_SHIFT_SUPPORTED)
@@ -1475,57 +1504,57 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,
*/
if ((transforms & PNG_TRANSFORM_SHIFT)
&& (info_ptr->valid & PNG_INFO_sBIT))
- png_set_shift(png_ptr, &info_ptr->sig_bit);
+ png_set_shift(png_ptr, &info_ptr->sig_bit);
#endif
#if defined(PNG_WRITE_PACK_SUPPORTED)
- /* pack pixels into bytes */
+ /* Pack pixels into bytes */
if (transforms & PNG_TRANSFORM_PACKING)
png_set_packing(png_ptr);
#endif
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
- /* swap location of alpha bytes from ARGB to RGBA */
+ /* Swap location of alpha bytes from ARGB to RGBA */
if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
- png_set_swap_alpha(png_ptr);
+ png_set_swap_alpha(png_ptr);
#endif
#if defined(PNG_WRITE_FILLER_SUPPORTED)
- /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into
- * RGB (4 channels -> 3 channels). The second parameter is not used.
- */
- if (transforms & PNG_TRANSFORM_STRIP_FILLER)
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
+ /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */
+ if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER)
+ png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
+ else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE)
+ png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
#endif
#if defined(PNG_WRITE_BGR_SUPPORTED)
- /* flip BGR pixels to RGB */
+ /* Flip BGR pixels to RGB */
if (transforms & PNG_TRANSFORM_BGR)
- png_set_bgr(png_ptr);
+ png_set_bgr(png_ptr);
#endif
#if defined(PNG_WRITE_SWAP_SUPPORTED)
- /* swap bytes of 16-bit files to most significant byte first */
+ /* Swap bytes of 16-bit files to most significant byte first */
if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
- png_set_swap(png_ptr);
+ png_set_swap(png_ptr);
#endif
#if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
- /* swap bits of 1, 2, 4 bit packed pixel formats */
+ /* Swap bits of 1, 2, 4 bit packed pixel formats */
if (transforms & PNG_TRANSFORM_PACKSWAP)
- png_set_packswap(png_ptr);
+ png_set_packswap(png_ptr);
#endif
/* ----------------------- end of transformations ------------------- */
- /* write the bits */
+ /* Write the bits */
if (info_ptr->valid & PNG_INFO_IDAT)
png_write_image(png_ptr, info_ptr->row_pointers);
/* It is REQUIRED to call this to finish writing the rest of the file */
png_write_end(png_ptr, info_ptr);
- transforms = transforms; /* quiet compiler warnings */
+ transforms = transforms; /* Quiet compiler warnings */
params = params;
}
#endif
diff --git a/src/3rdparty/libpng/pngwtran.c b/src/3rdparty/libpng/pngwtran.c
index 0372fe6..88a7d3c 100644
--- a/src/3rdparty/libpng/pngwtran.c
+++ b/src/3rdparty/libpng/pngwtran.c
@@ -1,11 +1,14 @@
/* pngwtran.c - transforms the data in a row for PNG writers
*
- * Last changed in libpng 1.2.9 April 14, 2006
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2006 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.37 [June 4, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
#define PNG_INTERNAL
@@ -18,15 +21,15 @@
void /* PRIVATE */
png_do_write_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_do_write_transformations\n");
+ png_debug(1, "in png_do_write_transformations");
if (png_ptr == NULL)
return;
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
if (png_ptr->transformations & PNG_USER_TRANSFORM)
- if(png_ptr->write_user_transform_fn != NULL)
- (*(png_ptr->write_user_transform_fn)) /* user write transform function */
+ if (png_ptr->write_user_transform_fn != NULL)
+ (*(png_ptr->write_user_transform_fn)) /* User write transform function */
(png_ptr, /* png_ptr */
&(png_ptr->row_info), /* row_info: */
/* png_uint_32 width; width of row */
@@ -86,7 +89,7 @@ png_do_write_transformations(png_structp png_ptr)
void /* PRIVATE */
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{
- png_debug(1, "in png_do_pack\n");
+ png_debug(1, "in png_do_pack");
if (row_info->bit_depth == 8 &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -212,7 +215,7 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
void /* PRIVATE */
png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
{
- png_debug(1, "in png_do_shift\n");
+ png_debug(1, "in png_do_shift");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL &&
#else
@@ -248,7 +251,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
channels++;
}
- /* with low row depths, could only be grayscale, so one channel */
+ /* With low row depths, could only be grayscale, so one channel */
if (row_info->bit_depth < 8)
{
png_bytep bp = row;
@@ -336,7 +339,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
void /* PRIVATE */
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_swap_alpha\n");
+ png_debug(1, "in png_do_write_swap_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -424,7 +427,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
void /* PRIVATE */
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_invert_alpha\n");
+ png_debug(1, "in png_do_write_invert_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
@@ -439,7 +442,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
png_uint_32 row_width = row_info->width;
for (i = 0, sp = dp = row; i < row_width; i++)
{
- /* does nothing
+ /* Does nothing
*(dp++) = *(sp++);
*(dp++) = *(sp++);
*(dp++) = *(sp++);
@@ -457,7 +460,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
for (i = 0, sp = dp = row; i < row_width; i++)
{
- /* does nothing
+ /* Does nothing
*(dp++) = *(sp++);
*(dp++) = *(sp++);
*(dp++) = *(sp++);
@@ -495,7 +498,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
for (i = 0, sp = dp = row; i < row_width; i++)
{
- /* does nothing
+ /* Does nothing
*(dp++) = *(sp++);
*(dp++) = *(sp++);
*/
@@ -510,11 +513,11 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
#endif
#if defined(PNG_MNG_FEATURES_SUPPORTED)
-/* undoes intrapixel differencing */
+/* Undoes intrapixel differencing */
void /* PRIVATE */
png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_intrapixel\n");
+ png_debug(1, "in png_do_write_intrapixel");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
@@ -558,8 +561,8 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
png_uint_32 s0 = (*(rp ) << 8) | *(rp+1);
png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3);
png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5);
- png_uint_32 red = (png_uint_32)((s0-s1) & 0xffffL);
- png_uint_32 blue = (png_uint_32)((s2-s1) & 0xffffL);
+ png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
+ png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
*(rp ) = (png_byte)((red >> 8) & 0xff);
*(rp+1) = (png_byte)(red & 0xff);
*(rp+4) = (png_byte)((blue >> 8) & 0xff);
diff --git a/src/3rdparty/libpng/pngwutil.c b/src/3rdparty/libpng/pngwutil.c
index 0774080..f52495c 100644
--- a/src/3rdparty/libpng/pngwutil.c
+++ b/src/3rdparty/libpng/pngwutil.c
@@ -1,11 +1,14 @@
/* pngwutil.c - utilities to write a PNG file
*
- * Last changed in libpng 1.2.27 [April 29, 2008]
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2008 Glenn Randers-Pehrson
+ * Last changed in libpng 1.2.40 [September 10, 2009]
+ * Copyright (c) 1998-2009 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
+ *
+ * This code is released under the libpng license.
+ * For conditions of distribution and use, see the disclaimer
+ * and license in png.h
*/
#define PNG_INTERNAL
@@ -49,6 +52,24 @@ png_save_uint_16(png_bytep buf, unsigned int i)
buf[1] = (png_byte)(i & 0xff);
}
+/* Simple function to write the signature. If we have already written
+ * the magic bytes of the signature, or more likely, the PNG stream is
+ * being embedded into another stream and doesn't need its own signature,
+ * we should call png_set_sig_bytes() to tell libpng how many of the
+ * bytes have already been written.
+ */
+void /* PRIVATE */
+png_write_sig(png_structp png_ptr)
+{
+ png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
+
+ /* Write the rest of the 8 byte signature */
+ png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes],
+ (png_size_t)(8 - png_ptr->sig_bytes));
+ if (png_ptr->sig_bytes < 3)
+ png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
+}
+
/* Write a PNG chunk all at once. The type is an array of ASCII characters
* representing the chunk name. The array must be at least 4 bytes in
* length, and does not need to be null terminated. To be safe, pass the
@@ -62,9 +83,10 @@ void PNGAPI
png_write_chunk(png_structp png_ptr, png_bytep chunk_name,
png_bytep data, png_size_t length)
{
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL)
+ return;
png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length);
- png_write_chunk_data(png_ptr, data, length);
+ png_write_chunk_data(png_ptr, data, (png_size_t)length);
png_write_chunk_end(png_ptr);
}
@@ -76,17 +98,21 @@ void PNGAPI
png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,
png_uint_32 length)
{
- png_byte buf[4];
- png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length);
- if(png_ptr == NULL) return;
+ png_byte buf[8];
- /* write the length */
- png_save_uint_32(buf, length);
- png_write_data(png_ptr, buf, (png_size_t)4);
+ png_debug2(0, "Writing %s chunk, length = %lu", chunk_name,
+ (unsigned long)length);
- /* write the chunk name */
- png_write_data(png_ptr, chunk_name, (png_size_t)4);
- /* reset the crc and run it over the chunk name */
+ if (png_ptr == NULL)
+ return;
+
+ /* Write the length and the chunk name */
+ png_save_uint_32(buf, length);
+ png_memcpy(buf + 4, chunk_name, 4);
+ png_write_data(png_ptr, buf, (png_size_t)8);
+ /* Put the chunk name into png_ptr->chunk_name */
+ png_memcpy(png_ptr->chunk_name, chunk_name, 4);
+ /* Reset the crc and run it over the chunk name */
png_reset_crc(png_ptr);
png_calculate_crc(png_ptr, chunk_name, (png_size_t)4);
}
@@ -99,12 +125,16 @@ png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,
void PNGAPI
png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
- /* write the data, and run the CRC over it */
- if(png_ptr == NULL) return;
+ /* Write the data, and run the CRC over it */
+ if (png_ptr == NULL)
+ return;
if (data != NULL && length > 0)
{
- png_calculate_crc(png_ptr, data, length);
png_write_data(png_ptr, data, length);
+ /* Update the CRC after writing the data,
+ * in case that the user I/O routine alters it.
+ */
+ png_calculate_crc(png_ptr, data, length);
}
}
@@ -114,34 +144,16 @@ png_write_chunk_end(png_structp png_ptr)
{
png_byte buf[4];
- if(png_ptr == NULL) return;
+ if (png_ptr == NULL) return;
- /* write the crc */
+ /* Write the crc in a single operation */
png_save_uint_32(buf, png_ptr->crc);
png_write_data(png_ptr, buf, (png_size_t)4);
}
-/* Simple function to write the signature. If we have already written
- * the magic bytes of the signature, or more likely, the PNG stream is
- * being embedded into another stream and doesn't need its own signature,
- * we should call png_set_sig_bytes() to tell libpng how many of the
- * bytes have already been written.
- */
-void /* PRIVATE */
-png_write_sig(png_structp png_ptr)
-{
- png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
- /* write the rest of the 8 byte signature */
- png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes],
- (png_size_t)8 - png_ptr->sig_bytes);
- if(png_ptr->sig_bytes < 3)
- png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
-}
-
#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED)
-/*
- * This pair of functions encapsulates the operation of (a) compressing a
+/* This pair of functions encapsulates the operation of (a) compressing a
* text string, and (b) issuing it later as a series of chunk data writes.
* The compression_state structure is shared context for these functions
* set up by the caller in order to make the whole mess thread-safe.
@@ -149,14 +161,14 @@ png_write_sig(png_structp png_ptr)
typedef struct
{
- char *input; /* the uncompressed input data */
- int input_len; /* its length */
- int num_output_ptr; /* number of output pointers used */
- int max_output_ptr; /* size of output_ptr */
- png_charpp output_ptr; /* array of pointers to output */
+ char *input; /* The uncompressed input data */
+ int input_len; /* Its length */
+ int num_output_ptr; /* Number of output pointers used */
+ int max_output_ptr; /* Size of output_ptr */
+ png_charpp output_ptr; /* Array of pointers to output */
} compression_state;
-/* compress given text into storage in the png_ptr structure */
+/* Compress given text into storage in the png_ptr structure */
static int /* PRIVATE */
png_text_compress(png_structp png_ptr,
png_charp text, png_size_t text_len, int compression,
@@ -170,7 +182,7 @@ png_text_compress(png_structp png_ptr,
comp->input = NULL;
comp->input_len = 0;
- /* we may just want to pass the text right through */
+ /* We may just want to pass the text right through */
if (compression == PNG_TEXT_COMPRESSION_NONE)
{
comp->input = text;
@@ -204,29 +216,29 @@ png_text_compress(png_structp png_ptr,
* wouldn't cause a failure, just a slowdown due to swapping).
*/
- /* set up the compression buffers */
+ /* Set up the compression buffers */
png_ptr->zstream.avail_in = (uInt)text_len;
png_ptr->zstream.next_in = (Bytef *)text;
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf;
- /* this is the same compression loop as in png_write_row() */
+ /* This is the same compression loop as in png_write_row() */
do
{
- /* compress the data */
+ /* Compress the data */
ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
if (ret != Z_OK)
{
- /* error */
+ /* Error */
if (png_ptr->zstream.msg != NULL)
png_error(png_ptr, png_ptr->zstream.msg);
else
png_error(png_ptr, "zlib error");
}
- /* check to see if we need more room */
+ /* Check to see if we need more room */
if (!(png_ptr->zstream.avail_out))
{
- /* make sure the output array has room */
+ /* Make sure the output array has room */
if (comp->num_output_ptr >= comp->max_output_ptr)
{
int old_max;
@@ -239,20 +251,21 @@ png_text_compress(png_structp png_ptr,
old_ptr = comp->output_ptr;
comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr *
- png_sizeof (png_charpp)));
+ (png_uint_32)
+ (comp->max_output_ptr * png_sizeof(png_charpp)));
png_memcpy(comp->output_ptr, old_ptr, old_max
- * png_sizeof (png_charp));
+ * png_sizeof(png_charp));
png_free(png_ptr, old_ptr);
}
else
comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr *
- png_sizeof (png_charp)));
+ (png_uint_32)
+ (comp->max_output_ptr * png_sizeof(png_charp)));
}
- /* save the data */
- comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr,
+ /* Save the data */
+ comp->output_ptr[comp->num_output_ptr] =
+ (png_charp)png_malloc(png_ptr,
(png_uint_32)png_ptr->zbuf_size);
png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
png_ptr->zbuf_size);
@@ -262,21 +275,21 @@ png_text_compress(png_structp png_ptr,
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
png_ptr->zstream.next_out = png_ptr->zbuf;
}
- /* continue until we don't have any more to compress */
+ /* Continue until we don't have any more to compress */
} while (png_ptr->zstream.avail_in);
- /* finish the compression */
+ /* Finish the compression */
do
{
- /* tell zlib we are finished */
+ /* Tell zlib we are finished */
ret = deflate(&png_ptr->zstream, Z_FINISH);
if (ret == Z_OK)
{
- /* check to see if we need more room */
+ /* Check to see if we need more room */
if (!(png_ptr->zstream.avail_out))
{
- /* check to make sure our output array has room */
+ /* Check to make sure our output array has room */
if (comp->num_output_ptr >= comp->max_output_ptr)
{
int old_max;
@@ -291,20 +304,21 @@ png_text_compress(png_structp png_ptr,
/* This could be optimized to realloc() */
comp->output_ptr = (png_charpp)png_malloc(png_ptr,
(png_uint_32)(comp->max_output_ptr *
- png_sizeof (png_charpp)));
+ png_sizeof(png_charp)));
png_memcpy(comp->output_ptr, old_ptr,
- old_max * png_sizeof (png_charp));
+ old_max * png_sizeof(png_charp));
png_free(png_ptr, old_ptr);
}
else
comp->output_ptr = (png_charpp)png_malloc(png_ptr,
(png_uint_32)(comp->max_output_ptr *
- png_sizeof (png_charp)));
+ png_sizeof(png_charp)));
}
- /* save off the data */
+ /* Save the data */
comp->output_ptr[comp->num_output_ptr] =
- (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size);
+ (png_charp)png_malloc(png_ptr,
+ (png_uint_32)png_ptr->zbuf_size);
png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
png_ptr->zbuf_size);
comp->num_output_ptr++;
@@ -316,7 +330,7 @@ png_text_compress(png_structp png_ptr,
}
else if (ret != Z_STREAM_END)
{
- /* we got an error */
+ /* We got an error */
if (png_ptr->zstream.msg != NULL)
png_error(png_ptr, png_ptr->zstream.msg);
else
@@ -324,7 +338,7 @@ png_text_compress(png_structp png_ptr,
}
} while (ret != Z_STREAM_END);
- /* text length is number of buffers plus last buffer */
+ /* Text length is number of buffers plus last buffer */
text_len = png_ptr->zbuf_size * comp->num_output_ptr;
if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out;
@@ -332,37 +346,37 @@ png_text_compress(png_structp png_ptr,
return((int)text_len);
}
-/* ship the compressed text out via chunk writes */
+/* Ship the compressed text out via chunk writes */
static void /* PRIVATE */
png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)
{
int i;
- /* handle the no-compression case */
+ /* Handle the no-compression case */
if (comp->input)
{
- png_write_chunk_data(png_ptr, (png_bytep)comp->input,
+ png_write_chunk_data(png_ptr, (png_bytep)comp->input,
(png_size_t)comp->input_len);
- return;
+ return;
}
- /* write saved output buffers, if any */
+ /* Write saved output buffers, if any */
for (i = 0; i < comp->num_output_ptr; i++)
{
- png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i],
- png_ptr->zbuf_size);
+ png_write_chunk_data(png_ptr, (png_bytep)comp->output_ptr[i],
+ (png_size_t)png_ptr->zbuf_size);
png_free(png_ptr, comp->output_ptr[i]);
- comp->output_ptr[i]=NULL;
+ comp->output_ptr[i]=NULL;
}
if (comp->max_output_ptr != 0)
png_free(png_ptr, comp->output_ptr);
- comp->output_ptr=NULL;
- /* write anything left in zbuf */
+ comp->output_ptr=NULL;
+ /* Write anything left in zbuf */
if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size)
png_write_chunk_data(png_ptr, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
+ (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out));
- /* reset zlib for another zTXt/iTXt or image data */
+ /* Reset zlib for another zTXt/iTXt or image data */
deflateReset(&png_ptr->zstream);
png_ptr->zstream.data_type = Z_BINARY;
}
@@ -382,9 +396,10 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
#endif
int ret;
- png_byte buf[13]; /* buffer to store the IHDR info */
+ png_byte buf[13]; /* Buffer to store the IHDR info */
+
+ png_debug(1, "in png_write_IHDR");
- png_debug(1, "in png_write_IHDR\n");
/* Check that we have valid input data from the application info */
switch (color_type)
{
@@ -396,7 +411,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
case 4:
case 8:
case 16: png_ptr->channels = 1; break;
- default: png_error(png_ptr,"Invalid bit depth for grayscale image");
+ default: png_error(png_ptr, "Invalid bit depth for grayscale image");
}
break;
case PNG_COLOR_TYPE_RGB:
@@ -468,7 +483,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
interlace_type=PNG_INTERLACE_NONE;
#endif
- /* save off the relevent information */
+ /* Save the relevent information */
png_ptr->bit_depth = (png_byte)bit_depth;
png_ptr->color_type = (png_byte)color_type;
png_ptr->interlaced = (png_byte)interlace_type;
@@ -481,12 +496,12 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels);
png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width);
- /* set the usr info, so any transformations can modify it */
+ /* Set the usr info, so any transformations can modify it */
png_ptr->usr_width = png_ptr->width;
png_ptr->usr_bit_depth = png_ptr->bit_depth;
png_ptr->usr_channels = png_ptr->channels;
- /* pack the header information into the buffer */
+ /* Pack the header information into the buffer */
png_save_uint_32(buf, width);
png_save_uint_32(buf + 4, height);
buf[8] = (png_byte)bit_depth;
@@ -495,10 +510,10 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
buf[11] = (png_byte)filter_type;
buf[12] = (png_byte)interlace_type;
- /* write the chunk */
- png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
+ /* Write the chunk */
+ png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13);
- /* initialize zlib with PNG info */
+ /* Initialize zlib with PNG info */
png_ptr->zstream.zalloc = png_zalloc;
png_ptr->zstream.zfree = png_zfree;
png_ptr->zstream.opaque = (voidpf)png_ptr;
@@ -541,13 +556,13 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_ptr->zstream.next_out = png_ptr->zbuf;
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
/* libpng is not interested in zstream.data_type */
- /* set it to a predefined value, to avoid its evaluation inside zlib */
+ /* Set it to a predefined value, to avoid its evaluation inside zlib */
png_ptr->zstream.data_type = Z_BINARY;
png_ptr->mode = PNG_HAVE_IHDR;
}
-/* write the palette. We are careful not to trust png_color to be in the
+/* Write the palette. We are careful not to trust png_color to be in the
* correct order for PNG, so people can redefine it to any convenient
* structure.
*/
@@ -561,7 +576,8 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
png_colorp pal_ptr;
png_byte buf[3];
- png_debug(1, "in png_write_PLTE\n");
+ png_debug(1, "in png_write_PLTE");
+
if ((
#if defined(PNG_MNG_FEATURES_SUPPORTED)
!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
@@ -587,9 +603,10 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
}
png_ptr->num_palette = (png_uint_16)num_pal;
- png_debug1(3, "num_palette = %d\n", png_ptr->num_palette);
+ png_debug1(3, "num_palette = %d", png_ptr->num_palette);
- png_write_chunk_start(png_ptr, png_PLTE, num_pal * 3);
+ png_write_chunk_start(png_ptr, (png_bytep)png_PLTE,
+ (png_uint_32)(num_pal * 3));
#ifndef PNG_NO_POINTER_INDEXING
for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)
{
@@ -613,14 +630,15 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
png_ptr->mode |= PNG_HAVE_PLTE;
}
-/* write an IDAT chunk */
+/* Write an IDAT chunk */
void /* PRIVATE */
png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
#endif
- png_debug(1, "in png_write_IDAT\n");
+
+ png_debug(1, "in png_write_IDAT");
/* Optimize the CMF field in the zlib stream. */
/* This hack of the zlib stream is compliant to the stream specification. */
@@ -630,9 +648,11 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
unsigned int z_cmf = data[0]; /* zlib compression method and flags */
if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
{
- /* Avoid memory underflows and multiplication overflows. */
- /* The conditions below are practically always satisfied;
- however, they still must be checked. */
+ /* Avoid memory underflows and multiplication overflows.
+ *
+ * The conditions below are practically always satisfied;
+ * however, they still must be checked.
+ */
if (length >= 2 &&
png_ptr->height < 16384 && png_ptr->width < 16384)
{
@@ -661,25 +681,27 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
"Invalid zlib compression method or flags in IDAT");
}
- png_write_chunk(png_ptr, png_IDAT, data, length);
+ png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);
png_ptr->mode |= PNG_HAVE_IDAT;
}
-/* write an IEND chunk */
+/* Write an IEND chunk */
void /* PRIVATE */
png_write_IEND(png_structp png_ptr)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IEND;
#endif
- png_debug(1, "in png_write_IEND\n");
- png_write_chunk(png_ptr, png_IEND, png_bytep_NULL,
+
+ png_debug(1, "in png_write_IEND");
+
+ png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL,
(png_size_t)0);
png_ptr->mode |= PNG_HAVE_IEND;
}
#if defined(PNG_WRITE_gAMA_SUPPORTED)
-/* write a gAMA chunk */
+/* Write a gAMA chunk */
#ifdef PNG_FLOATING_POINT_SUPPORTED
void /* PRIVATE */
png_write_gAMA(png_structp png_ptr, double file_gamma)
@@ -690,11 +712,12 @@ png_write_gAMA(png_structp png_ptr, double file_gamma)
png_uint_32 igamma;
png_byte buf[4];
- png_debug(1, "in png_write_gAMA\n");
+ png_debug(1, "in png_write_gAMA");
+
/* file_gamma is saved in 1/100,000ths */
igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5);
png_save_uint_32(buf, igamma);
- png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
+ png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
}
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
@@ -706,16 +729,17 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
#endif
png_byte buf[4];
- png_debug(1, "in png_write_gAMA\n");
+ png_debug(1, "in png_write_gAMA");
+
/* file_gamma is saved in 1/100,000ths */
png_save_uint_32(buf, (png_uint_32)file_gamma);
- png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4);
+ png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
}
#endif
#endif
#if defined(PNG_WRITE_sRGB_SUPPORTED)
-/* write a sRGB chunk */
+/* Write a sRGB chunk */
void /* PRIVATE */
png_write_sRGB(png_structp png_ptr, int srgb_intent)
{
@@ -724,17 +748,18 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent)
#endif
png_byte buf[1];
- png_debug(1, "in png_write_sRGB\n");
- if(srgb_intent >= PNG_sRGB_INTENT_LAST)
+ png_debug(1, "in png_write_sRGB");
+
+ if (srgb_intent >= PNG_sRGB_INTENT_LAST)
png_warning(png_ptr,
"Invalid sRGB rendering intent specified");
buf[0]=(png_byte)srgb_intent;
- png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1);
+ png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1);
}
#endif
#if defined(PNG_WRITE_iCCP_SUPPORTED)
-/* write an iCCP chunk */
+/* Write an iCCP chunk */
void /* PRIVATE */
png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
png_charp profile, int profile_len)
@@ -747,7 +772,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
compression_state comp;
int embedded_profile_len = 0;
- png_debug(1, "in png_write_iCCP\n");
+ png_debug(1, "in png_write_iCCP");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
@@ -755,12 +780,9 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
comp.input = NULL;
comp.input_len = 0;
- if (name == NULL || (name_len = png_check_keyword(png_ptr, name,
+ if ((name_len = png_check_keyword(png_ptr, name,
&new_name)) == 0)
- {
- png_warning(png_ptr, "Empty keyword in iCCP chunk");
return;
- }
if (compression_type != PNG_COMPRESSION_TYPE_BASE)
png_warning(png_ptr, "Unknown compression type in iCCP chunk");
@@ -770,34 +792,44 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
if (profile_len > 3)
embedded_profile_len =
- ((*( (png_bytep)profile ))<<24) |
- ((*( (png_bytep)profile+1))<<16) |
- ((*( (png_bytep)profile+2))<< 8) |
- ((*( (png_bytep)profile+3)) );
+ ((*( (png_bytep)profile ))<<24) |
+ ((*( (png_bytep)profile + 1))<<16) |
+ ((*( (png_bytep)profile + 2))<< 8) |
+ ((*( (png_bytep)profile + 3)) );
+
+ if (embedded_profile_len < 0)
+ {
+ png_warning(png_ptr,
+ "Embedded profile length in iCCP chunk is negative");
+ png_free(png_ptr, new_name);
+ return;
+ }
if (profile_len < embedded_profile_len)
- {
- png_warning(png_ptr,
- "Embedded profile length too large in iCCP chunk");
- return;
- }
+ {
+ png_warning(png_ptr,
+ "Embedded profile length too large in iCCP chunk");
+ png_free(png_ptr, new_name);
+ return;
+ }
if (profile_len > embedded_profile_len)
- {
- png_warning(png_ptr,
- "Truncating profile to actual length in iCCP chunk");
- profile_len = embedded_profile_len;
- }
+ {
+ png_warning(png_ptr,
+ "Truncating profile to actual length in iCCP chunk");
+ profile_len = embedded_profile_len;
+ }
if (profile_len)
- profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len,
- PNG_COMPRESSION_TYPE_BASE, &comp);
+ profile_len = png_text_compress(png_ptr, profile,
+ (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp);
- /* make sure we include the NULL after the name and the compression type */
- png_write_chunk_start(png_ptr, png_iCCP,
- (png_uint_32)name_len+profile_len+2);
- new_name[name_len+1]=0x00;
- png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2);
+ /* Make sure we include the NULL after the name and the compression type */
+ png_write_chunk_start(png_ptr, (png_bytep)png_iCCP,
+ (png_uint_32)(name_len + profile_len + 2));
+ new_name[name_len + 1] = 0x00;
+ png_write_chunk_data(png_ptr, (png_bytep)new_name,
+ (png_size_t)(name_len + 2));
if (profile_len)
png_write_compressed_data_out(png_ptr, &comp);
@@ -808,7 +840,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
#endif
#if defined(PNG_WRITE_sPLT_SUPPORTED)
-/* write a sPLT chunk */
+/* Write a sPLT chunk */
void /* PRIVATE */
png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)
{
@@ -825,63 +857,61 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)
int i;
#endif
- png_debug(1, "in png_write_sPLT\n");
- if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr,
- spalette->name, &new_name))==0)
- {
- png_warning(png_ptr, "Empty keyword in sPLT chunk");
+ png_debug(1, "in png_write_sPLT");
+
+ if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0)
return;
- }
- /* make sure we include the NULL after the name */
- png_write_chunk_start(png_ptr, png_sPLT,
- (png_uint_32)(name_len + 2 + palette_size));
- png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1);
- png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1);
+ /* Make sure we include the NULL after the name */
+ png_write_chunk_start(png_ptr, (png_bytep)png_sPLT,
+ (png_uint_32)(name_len + 2 + palette_size));
+ png_write_chunk_data(png_ptr, (png_bytep)new_name,
+ (png_size_t)(name_len + 1));
+ png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, (png_size_t)1);
- /* loop through each palette entry, writing appropriately */
+ /* Loop through each palette entry, writing appropriately */
#ifndef PNG_NO_POINTER_INDEXING
- for (ep = spalette->entries; ep<spalette->entries+spalette->nentries; ep++)
- {
- if (spalette->depth == 8)
- {
- entrybuf[0] = (png_byte)ep->red;
- entrybuf[1] = (png_byte)ep->green;
- entrybuf[2] = (png_byte)ep->blue;
- entrybuf[3] = (png_byte)ep->alpha;
- png_save_uint_16(entrybuf + 4, ep->frequency);
- }
- else
- {
- png_save_uint_16(entrybuf + 0, ep->red);
- png_save_uint_16(entrybuf + 2, ep->green);
- png_save_uint_16(entrybuf + 4, ep->blue);
- png_save_uint_16(entrybuf + 6, ep->alpha);
- png_save_uint_16(entrybuf + 8, ep->frequency);
- }
- png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
+ for (ep = spalette->entries; ep<spalette->entries + spalette->nentries; ep++)
+ {
+ if (spalette->depth == 8)
+ {
+ entrybuf[0] = (png_byte)ep->red;
+ entrybuf[1] = (png_byte)ep->green;
+ entrybuf[2] = (png_byte)ep->blue;
+ entrybuf[3] = (png_byte)ep->alpha;
+ png_save_uint_16(entrybuf + 4, ep->frequency);
+ }
+ else
+ {
+ png_save_uint_16(entrybuf + 0, ep->red);
+ png_save_uint_16(entrybuf + 2, ep->green);
+ png_save_uint_16(entrybuf + 4, ep->blue);
+ png_save_uint_16(entrybuf + 6, ep->alpha);
+ png_save_uint_16(entrybuf + 8, ep->frequency);
+ }
+ png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
}
#else
ep=spalette->entries;
for (i=0; i>spalette->nentries; i++)
{
- if (spalette->depth == 8)
- {
- entrybuf[0] = (png_byte)ep[i].red;
- entrybuf[1] = (png_byte)ep[i].green;
- entrybuf[2] = (png_byte)ep[i].blue;
- entrybuf[3] = (png_byte)ep[i].alpha;
- png_save_uint_16(entrybuf + 4, ep[i].frequency);
- }
- else
- {
- png_save_uint_16(entrybuf + 0, ep[i].red);
- png_save_uint_16(entrybuf + 2, ep[i].green);
- png_save_uint_16(entrybuf + 4, ep[i].blue);
- png_save_uint_16(entrybuf + 6, ep[i].alpha);
- png_save_uint_16(entrybuf + 8, ep[i].frequency);
- }
- png_write_chunk_data(png_ptr, entrybuf, entry_size);
+ if (spalette->depth == 8)
+ {
+ entrybuf[0] = (png_byte)ep[i].red;
+ entrybuf[1] = (png_byte)ep[i].green;
+ entrybuf[2] = (png_byte)ep[i].blue;
+ entrybuf[3] = (png_byte)ep[i].alpha;
+ png_save_uint_16(entrybuf + 4, ep[i].frequency);
+ }
+ else
+ {
+ png_save_uint_16(entrybuf + 0, ep[i].red);
+ png_save_uint_16(entrybuf + 2, ep[i].green);
+ png_save_uint_16(entrybuf + 4, ep[i].blue);
+ png_save_uint_16(entrybuf + 6, ep[i].alpha);
+ png_save_uint_16(entrybuf + 8, ep[i].frequency);
+ }
+ png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
}
#endif
@@ -891,7 +921,7 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)
#endif
#if defined(PNG_WRITE_sBIT_SUPPORTED)
-/* write the sBIT chunk */
+/* Write the sBIT chunk */
void /* PRIVATE */
png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)
{
@@ -901,8 +931,9 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)
png_byte buf[4];
png_size_t size;
- png_debug(1, "in png_write_sBIT\n");
- /* make sure we don't depend upon the order of PNG_COLOR_8 */
+ png_debug(1, "in png_write_sBIT");
+
+ /* Make sure we don't depend upon the order of PNG_COLOR_8 */
if (color_type & PNG_COLOR_MASK_COLOR)
{
png_byte maxbits;
@@ -942,12 +973,12 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)
buf[size++] = sbit->alpha;
}
- png_write_chunk(png_ptr, png_sBIT, buf, size);
+ png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size);
}
#endif
#if defined(PNG_WRITE_cHRM_SUPPORTED)
-/* write the cHRM chunk */
+/* Write the cHRM chunk */
#ifdef PNG_FLOATING_POINT_SUPPORTED
void /* PRIVATE */
png_write_cHRM(png_structp png_ptr, double white_x, double white_y,
@@ -958,55 +989,42 @@ png_write_cHRM(png_structp png_ptr, double white_x, double white_y,
PNG_cHRM;
#endif
png_byte buf[32];
- png_uint_32 itemp;
- png_debug(1, "in png_write_cHRM\n");
- /* each value is saved in 1/100,000ths */
- if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 ||
- white_x + white_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y);
-#endif
- return;
- }
- itemp = (png_uint_32)(white_x * 100000.0 + 0.5);
- png_save_uint_32(buf, itemp);
- itemp = (png_uint_32)(white_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 4, itemp);
+ png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y,
+ int_green_x, int_green_y, int_blue_x, int_blue_y;
- if (red_x < 0 || red_y < 0 || red_x + red_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM red point specified");
- return;
- }
- itemp = (png_uint_32)(red_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 8, itemp);
- itemp = (png_uint_32)(red_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 12, itemp);
+ png_debug(1, "in png_write_cHRM");
- if (green_x < 0 || green_y < 0 || green_x + green_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM green point specified");
- return;
- }
- itemp = (png_uint_32)(green_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 16, itemp);
- itemp = (png_uint_32)(green_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 20, itemp);
+ int_white_x = (png_uint_32)(white_x * 100000.0 + 0.5);
+ int_white_y = (png_uint_32)(white_y * 100000.0 + 0.5);
+ int_red_x = (png_uint_32)(red_x * 100000.0 + 0.5);
+ int_red_y = (png_uint_32)(red_y * 100000.0 + 0.5);
+ int_green_x = (png_uint_32)(green_x * 100000.0 + 0.5);
+ int_green_y = (png_uint_32)(green_y * 100000.0 + 0.5);
+ int_blue_x = (png_uint_32)(blue_x * 100000.0 + 0.5);
+ int_blue_y = (png_uint_32)(blue_y * 100000.0 + 0.5);
- if (blue_x < 0 || blue_y < 0 || blue_x + blue_y > 1.0)
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr, int_white_x, int_white_y,
+ int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y))
+#endif
{
- png_warning(png_ptr, "Invalid cHRM blue point specified");
- return;
- }
- itemp = (png_uint_32)(blue_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 24, itemp);
- itemp = (png_uint_32)(blue_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 28, itemp);
+ /* Each value is saved in 1/100,000ths */
+
+ png_save_uint_32(buf, int_white_x);
+ png_save_uint_32(buf + 4, int_white_y);
+
+ png_save_uint_32(buf + 8, int_red_x);
+ png_save_uint_32(buf + 12, int_red_y);
- png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
+ png_save_uint_32(buf + 16, int_green_x);
+ png_save_uint_32(buf + 20, int_green_y);
+
+ png_save_uint_32(buf + 24, int_blue_x);
+ png_save_uint_32(buf + 28, int_blue_y);
+
+ png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
+ }
}
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
@@ -1021,50 +1039,34 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
#endif
png_byte buf[32];
- png_debug(1, "in png_write_cHRM\n");
- /* each value is saved in 1/100,000ths */
- if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y);
-#endif
- return;
- }
- png_save_uint_32(buf, (png_uint_32)white_x);
- png_save_uint_32(buf + 4, (png_uint_32)white_y);
+ png_debug(1, "in png_write_cHRM");
- if (red_x + red_y > 100000L)
+ /* Each value is saved in 1/100,000ths */
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y,
+ green_x, green_y, blue_x, blue_y))
+#endif
{
- png_warning(png_ptr, "Invalid cHRM fixed red point specified");
- return;
- }
- png_save_uint_32(buf + 8, (png_uint_32)red_x);
- png_save_uint_32(buf + 12, (png_uint_32)red_y);
+ png_save_uint_32(buf, (png_uint_32)white_x);
+ png_save_uint_32(buf + 4, (png_uint_32)white_y);
- if (green_x + green_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM green point specified");
- return;
- }
- png_save_uint_32(buf + 16, (png_uint_32)green_x);
- png_save_uint_32(buf + 20, (png_uint_32)green_y);
+ png_save_uint_32(buf + 8, (png_uint_32)red_x);
+ png_save_uint_32(buf + 12, (png_uint_32)red_y);
- if (blue_x + blue_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM blue point specified");
- return;
- }
- png_save_uint_32(buf + 24, (png_uint_32)blue_x);
- png_save_uint_32(buf + 28, (png_uint_32)blue_y);
+ png_save_uint_32(buf + 16, (png_uint_32)green_x);
+ png_save_uint_32(buf + 20, (png_uint_32)green_y);
+
+ png_save_uint_32(buf + 24, (png_uint_32)blue_x);
+ png_save_uint_32(buf + 28, (png_uint_32)blue_y);
- png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
+ png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
+ }
}
#endif
#endif
#if defined(PNG_WRITE_tRNS_SUPPORTED)
-/* write the tRNS chunk */
+/* Write the tRNS chunk */
void /* PRIVATE */
png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,
int num_trans, int color_type)
@@ -1074,42 +1076,44 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,
#endif
png_byte buf[6];
- png_debug(1, "in png_write_tRNS\n");
+ png_debug(1, "in png_write_tRNS");
+
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)
{
- png_warning(png_ptr,"Invalid number of transparent colors specified");
+ png_warning(png_ptr, "Invalid number of transparent colors specified");
return;
}
- /* write the chunk out as it is */
- png_write_chunk(png_ptr, png_tRNS, trans, (png_size_t)num_trans);
+ /* Write the chunk out as it is */
+ png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans,
+ (png_size_t)num_trans);
}
else if (color_type == PNG_COLOR_TYPE_GRAY)
{
- /* one 16 bit value */
- if(tran->gray >= (1 << png_ptr->bit_depth))
+ /* One 16 bit value */
+ if (tran->gray >= (1 << png_ptr->bit_depth))
{
png_warning(png_ptr,
"Ignoring attempt to write tRNS chunk out-of-range for bit_depth");
return;
}
png_save_uint_16(buf, tran->gray);
- png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2);
+ png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2);
}
else if (color_type == PNG_COLOR_TYPE_RGB)
{
- /* three 16 bit values */
+ /* Three 16 bit values */
png_save_uint_16(buf, tran->red);
png_save_uint_16(buf + 2, tran->green);
png_save_uint_16(buf + 4, tran->blue);
- if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8");
- return;
- }
- png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6);
+ if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8");
+ return;
+ }
+ png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6);
}
else
{
@@ -1119,7 +1123,7 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,
#endif
#if defined(PNG_WRITE_bKGD_SUPPORTED)
-/* write the background chunk */
+/* Write the background chunk */
void /* PRIVATE */
png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)
{
@@ -1128,7 +1132,8 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)
#endif
png_byte buf[6];
- png_debug(1, "in png_write_bKGD\n");
+ png_debug(1, "in png_write_bKGD");
+
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
if (
@@ -1136,43 +1141,43 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)
(png_ptr->num_palette ||
(!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) &&
#endif
- back->index > png_ptr->num_palette)
+ back->index >= png_ptr->num_palette)
{
png_warning(png_ptr, "Invalid background palette index");
return;
}
buf[0] = back->index;
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
+ png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1);
}
else if (color_type & PNG_COLOR_MASK_COLOR)
{
png_save_uint_16(buf, back->red);
png_save_uint_16(buf + 2, back->green);
png_save_uint_16(buf + 4, back->blue);
- if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8");
- return;
- }
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6);
+ if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8");
+ return;
+ }
+ png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6);
}
else
{
- if(back->gray >= (1 << png_ptr->bit_depth))
+ if (back->gray >= (1 << png_ptr->bit_depth))
{
png_warning(png_ptr,
"Ignoring attempt to write bKGD chunk out-of-range for bit_depth");
return;
}
png_save_uint_16(buf, back->gray);
- png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2);
+ png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2);
}
}
#endif
#if defined(PNG_WRITE_hIST_SUPPORTED)
-/* write the histogram */
+/* Write the histogram */
void /* PRIVATE */
png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)
{
@@ -1182,16 +1187,18 @@ png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)
int i;
png_byte buf[3];
- png_debug(1, "in png_write_hIST\n");
+ png_debug(1, "in png_write_hIST");
+
if (num_hist > (int)png_ptr->num_palette)
{
- png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist,
+ png_debug2(3, "num_hist = %d, num_palette = %d", num_hist,
png_ptr->num_palette);
png_warning(png_ptr, "Invalid number of histogram entries specified");
return;
}
- png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2));
+ png_write_chunk_start(png_ptr, (png_bytep)png_hIST,
+ (png_uint_32)(num_hist * 2));
for (i = 0; i < num_hist; i++)
{
png_save_uint_16(buf, hist[i]);
@@ -1221,7 +1228,8 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
int kflag;
int kwarn=0;
- png_debug(1, "in png_check_keyword\n");
+ png_debug(1, "in png_check_keyword");
+
*new_key = NULL;
if (key == NULL || (key_len = png_strlen(key)) == 0)
@@ -1230,7 +1238,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
return ((png_size_t)0);
}
- png_debug1(2, "Keyword to be checked is '%s'\n", key);
+ png_debug1(2, "Keyword to be checked is '%s'", key);
*new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2));
if (*new_key == NULL)
@@ -1271,8 +1279,8 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
while (*kp == ' ')
{
- *(kp--) = '\0';
- key_len--;
+ *(kp--) = '\0';
+ key_len--;
}
}
@@ -1284,12 +1292,12 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
while (*kp == ' ')
{
- kp++;
- key_len--;
+ kp++;
+ key_len--;
}
}
- png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp);
+ png_debug1(2, "Checking for multiple internal spaces in '%s'", kp);
/* Remove multiple internal spaces. */
for (kflag = 0, dp = *new_key; *kp != '\0'; kp++)
@@ -1311,20 +1319,20 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
}
}
*dp = '\0';
- if(kwarn)
+ if (kwarn)
png_warning(png_ptr, "extra interior spaces removed from keyword");
if (key_len == 0)
{
png_free(png_ptr, *new_key);
- *new_key=NULL;
+ *new_key=NULL;
png_warning(png_ptr, "Zero length keyword");
}
if (key_len > 79)
{
png_warning(png_ptr, "keyword length must be 1 - 79 characters");
- new_key[79] = '\0';
+ (*new_key)[79] = '\0';
key_len = 79;
}
@@ -1333,7 +1341,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
#endif
#if defined(PNG_WRITE_tEXt_SUPPORTED)
-/* write a tEXt chunk */
+/* Write a tEXt chunk */
void /* PRIVATE */
png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,
png_size_t text_len)
@@ -1344,29 +1352,29 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,
png_size_t key_len;
png_charp new_key;
- png_debug(1, "in png_write_tEXt\n");
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in tEXt chunk");
+ png_debug(1, "in png_write_tEXt");
+
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
return;
- }
if (text == NULL || *text == '\0')
text_len = 0;
else
text_len = png_strlen(text);
- /* make sure we include the 0 after the key */
- png_write_chunk_start(png_ptr, png_tEXt, (png_uint_32)key_len+text_len+1);
+ /* Make sure we include the 0 after the key */
+ png_write_chunk_start(png_ptr, (png_bytep)png_tEXt,
+ (png_uint_32)(key_len + text_len + 1));
/*
* We leave it to the application to meet PNG-1.0 requirements on the
* contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
* any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
* The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
*/
- png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);
+ png_write_chunk_data(png_ptr, (png_bytep)new_key,
+ (png_size_t)(key_len + 1));
if (text_len)
- png_write_chunk_data(png_ptr, (png_bytep)text, text_len);
+ png_write_chunk_data(png_ptr, (png_bytep)text, (png_size_t)text_len);
png_write_chunk_end(png_ptr);
png_free(png_ptr, new_key);
@@ -1374,7 +1382,7 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,
#endif
#if defined(PNG_WRITE_zTXt_SUPPORTED)
-/* write a compressed text chunk */
+/* Write a compressed text chunk */
void /* PRIVATE */
png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,
png_size_t text_len, int compression)
@@ -1387,7 +1395,7 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,
png_charp new_key;
compression_state comp;
- png_debug(1, "in png_write_zTXt\n");
+ png_debug(1, "in png_write_zTXt");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
@@ -1395,9 +1403,9 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,
comp.input = NULL;
comp.input_len = 0;
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
{
- png_warning(png_ptr, "Empty keyword in zTXt chunk");
+ png_free(png_ptr, new_key);
return;
}
@@ -1410,30 +1418,31 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,
text_len = png_strlen(text);
- /* compute the compressed data; do it now for the length */
+ /* Compute the compressed data; do it now for the length */
text_len = png_text_compress(png_ptr, text, text_len, compression,
&comp);
- /* write start of chunk */
- png_write_chunk_start(png_ptr, png_zTXt, (png_uint_32)
- (key_len+text_len+2));
- /* write key */
- png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);
+ /* Write start of chunk */
+ png_write_chunk_start(png_ptr, (png_bytep)png_zTXt,
+ (png_uint_32)(key_len+text_len + 2));
+ /* Write key */
+ png_write_chunk_data(png_ptr, (png_bytep)new_key,
+ (png_size_t)(key_len + 1));
png_free(png_ptr, new_key);
buf[0] = (png_byte)compression;
- /* write compression */
+ /* Write compression */
png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1);
- /* write the compressed data */
+ /* Write the compressed data */
png_write_compressed_data_out(png_ptr, &comp);
- /* close the chunk */
+ /* Close the chunk */
png_write_chunk_end(png_ptr);
}
#endif
#if defined(PNG_WRITE_iTXt_SUPPORTED)
-/* write an iTXt chunk */
+/* Write an iTXt chunk */
void /* PRIVATE */
png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
png_charp lang, png_charp lang_key, png_charp text)
@@ -1442,23 +1451,22 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
PNG_iTXt;
#endif
png_size_t lang_len, key_len, lang_key_len, text_len;
- png_charp new_lang, new_key;
+ png_charp new_lang;
+ png_charp new_key = NULL;
png_byte cbuf[2];
compression_state comp;
- png_debug(1, "in png_write_iTXt\n");
+ png_debug(1, "in png_write_iTXt");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
comp.output_ptr = NULL;
comp.input = NULL;
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in iTXt chunk");
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
return;
- }
- if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)
+
+ if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)
{
png_warning(png_ptr, "Empty language field in iTXt chunk");
new_lang = NULL;
@@ -1466,24 +1474,24 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
}
if (lang_key == NULL)
- lang_key_len = 0;
+ lang_key_len = 0;
else
- lang_key_len = png_strlen(lang_key);
+ lang_key_len = png_strlen(lang_key);
if (text == NULL)
text_len = 0;
else
- text_len = png_strlen(text);
+ text_len = png_strlen(text);
- /* compute the compressed data; do it now for the length */
+ /* Compute the compressed data; do it now for the length */
text_len = png_text_compress(png_ptr, text, text_len, compression-2,
&comp);
- /* make sure we include the compression flag, the compression byte,
+ /* Make sure we include the compression flag, the compression byte,
* and the NULs after the key, lang, and lang_key parts */
- png_write_chunk_start(png_ptr, png_iTXt,
+ png_write_chunk_start(png_ptr, (png_bytep)png_iTXt,
(png_uint_32)(
5 /* comp byte, comp flag, terminators for key, lang and lang_key */
+ key_len
@@ -1491,27 +1499,29 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
+ lang_key_len
+ text_len));
- /*
- * We leave it to the application to meet PNG-1.0 requirements on the
+ /* We leave it to the application to meet PNG-1.0 requirements on the
* contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
* any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
* The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
*/
- png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);
+ png_write_chunk_data(png_ptr, (png_bytep)new_key,
+ (png_size_t)(key_len + 1));
- /* set the compression flag */
+ /* Set the compression flag */
if (compression == PNG_ITXT_COMPRESSION_NONE || \
compression == PNG_TEXT_COMPRESSION_NONE)
cbuf[0] = 0;
else /* compression == PNG_ITXT_COMPRESSION_zTXt */
cbuf[0] = 1;
- /* set the compression method */
+ /* Set the compression method */
cbuf[1] = 0;
- png_write_chunk_data(png_ptr, cbuf, 2);
+ png_write_chunk_data(png_ptr, cbuf, (png_size_t)2);
cbuf[0] = 0;
- png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1);
- png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1);
+ png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf),
+ (png_size_t)(lang_len + 1));
+ png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf),
+ (png_size_t)(lang_key_len + 1));
png_write_compressed_data_out(png_ptr, &comp);
png_write_chunk_end(png_ptr);
@@ -1521,7 +1531,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
#endif
#if defined(PNG_WRITE_oFFs_SUPPORTED)
-/* write the oFFs chunk */
+/* Write the oFFs chunk */
void /* PRIVATE */
png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
int unit_type)
@@ -1531,7 +1541,8 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
#endif
png_byte buf[9];
- png_debug(1, "in png_write_oFFs\n");
+ png_debug(1, "in png_write_oFFs");
+
if (unit_type >= PNG_OFFSET_LAST)
png_warning(png_ptr, "Unrecognized unit type for oFFs chunk");
@@ -1539,11 +1550,11 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
png_save_int_32(buf + 4, y_offset);
buf[8] = (png_byte)unit_type;
- png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9);
+ png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9);
}
#endif
#if defined(PNG_WRITE_pCAL_SUPPORTED)
-/* write the pCAL chunk (described in the PNG extensions document) */
+/* Write the pCAL chunk (described in the PNG extensions document) */
void /* PRIVATE */
png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)
@@ -1557,31 +1568,34 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_charp new_purpose;
int i;
- png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams);
+ png_debug1(1, "in png_write_pCAL (%d parameters)", nparams);
+
if (type >= PNG_EQUATION_LAST)
png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1;
- png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len);
+ png_debug1(3, "pCAL purpose length = %d", (int)purpose_len);
units_len = png_strlen(units) + (nparams == 0 ? 0 : 1);
- png_debug1(3, "pCAL units length = %d\n", (int)units_len);
+ png_debug1(3, "pCAL units length = %d", (int)units_len);
total_len = purpose_len + units_len + 10;
- params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams
- *png_sizeof(png_uint_32)));
+ params_len = (png_uint_32p)png_malloc(png_ptr,
+ (png_uint_32)(nparams * png_sizeof(png_uint_32)));
/* Find the length of each parameter, making sure we don't count the
null terminator for the last parameter. */
for (i = 0; i < nparams; i++)
{
params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
- png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]);
+ png_debug2(3, "pCAL parameter %d length = %lu", i,
+ (unsigned long) params_len[i]);
total_len += (png_size_t)params_len[i];
}
- png_debug1(3, "pCAL total length = %d\n", (int)total_len);
- png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len);
+ png_debug1(3, "pCAL total length = %d", (int)total_len);
+ png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len);
+ png_write_chunk_data(png_ptr, (png_bytep)new_purpose,
+ (png_size_t)purpose_len);
png_save_int_32(buf, X0);
png_save_int_32(buf + 4, X1);
buf[8] = (png_byte)type;
@@ -1603,7 +1617,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
#endif
#if defined(PNG_WRITE_sCAL_SUPPORTED)
-/* write the sCAL chunk */
+/* Write the sCAL chunk */
#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
void /* PRIVATE */
png_write_sCAL(png_structp png_ptr, int unit, double width, double height)
@@ -1614,7 +1628,7 @@ png_write_sCAL(png_structp png_ptr, int unit, double width, double height)
char buf[64];
png_size_t total_len;
- png_debug(1, "in png_write_sCAL\n");
+ png_debug(1, "in png_write_sCAL");
buf[0] = (char)unit;
#if defined(_WIN32_WCE)
@@ -1639,8 +1653,8 @@ png_write_sCAL(png_structp png_ptr, int unit, double width, double height)
total_len += png_strlen(buf + total_len);
#endif
- png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len);
- png_write_chunk(png_ptr, png_sCAL, (png_bytep)buf, total_len);
+ png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
+ png_write_chunk(png_ptr, (png_bytep)png_sCAL, (png_bytep)buf, total_len);
}
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
@@ -1654,7 +1668,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,
png_byte buf[64];
png_size_t wlen, hlen, total_len;
- png_debug(1, "in png_write_sCAL_s\n");
+ png_debug(1, "in png_write_sCAL_s");
wlen = png_strlen(width);
hlen = png_strlen(height);
@@ -1666,18 +1680,18 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,
}
buf[0] = (png_byte)unit;
- png_memcpy(buf + 1, width, wlen + 1); /* append the '\0' here */
- png_memcpy(buf + wlen + 2, height, hlen); /* do NOT append the '\0' here */
+ png_memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */
+ png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */
- png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len);
- png_write_chunk(png_ptr, png_sCAL, buf, total_len);
+ png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
+ png_write_chunk(png_ptr, (png_bytep)png_sCAL, buf, total_len);
}
#endif
#endif
#endif
#if defined(PNG_WRITE_pHYs_SUPPORTED)
-/* write the pHYs chunk */
+/* Write the pHYs chunk */
void /* PRIVATE */
png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
png_uint_32 y_pixels_per_unit,
@@ -1688,7 +1702,8 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
#endif
png_byte buf[9];
- png_debug(1, "in png_write_pHYs\n");
+ png_debug(1, "in png_write_pHYs");
+
if (unit_type >= PNG_RESOLUTION_LAST)
png_warning(png_ptr, "Unrecognized unit type for pHYs chunk");
@@ -1696,7 +1711,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
png_save_uint_32(buf + 4, y_pixels_per_unit);
buf[8] = (png_byte)unit_type;
- png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9);
+ png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9);
}
#endif
@@ -1712,7 +1727,8 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time)
#endif
png_byte buf[7];
- png_debug(1, "in png_write_tIME\n");
+ png_debug(1, "in png_write_tIME");
+
if (mod_time->month > 12 || mod_time->month < 1 ||
mod_time->day > 31 || mod_time->day < 1 ||
mod_time->hour > 23 || mod_time->second > 60)
@@ -1728,83 +1744,86 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time)
buf[5] = mod_time->minute;
buf[6] = mod_time->second;
- png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7);
+ png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7);
}
#endif
-/* initializes the row writing capability of libpng */
+/* Initializes the row writing capability of libpng */
void /* PRIVATE */
png_write_start_row(png_structp png_ptr)
{
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
- /* start of interlace block in the y direction */
+ /* Start of interlace block in the y direction */
int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
- /* offset to next interlace block in the y direction */
+ /* Offset to next interlace block in the y direction */
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
png_size_t buf_size;
- png_debug(1, "in png_write_start_row\n");
+ png_debug(1, "in png_write_start_row");
+
buf_size = (png_size_t)(PNG_ROWBYTES(
- png_ptr->usr_channels*png_ptr->usr_bit_depth,png_ptr->width)+1);
+ png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1);
- /* set up row buffer */
- png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);
+ /* Set up row buffer */
+ png_ptr->row_buf = (png_bytep)png_malloc(png_ptr,
+ (png_uint_32)buf_size);
png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;
-#ifndef PNG_NO_WRITE_FILTERING
- /* set up filtering buffer, if using this filter */
+#ifndef PNG_NO_WRITE_FILTER
+ /* Set up filtering buffer, if using this filter */
if (png_ptr->do_filter & PNG_FILTER_SUB)
{
png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
+ (png_uint_32)(png_ptr->rowbytes + 1));
png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
}
/* We only need to keep the previous row if we are using one of these. */
if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))
{
- /* set up previous row buffer */
- png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);
- png_memset(png_ptr->prev_row, 0, buf_size);
+ /* Set up previous row buffer */
+ png_ptr->prev_row = (png_bytep)png_malloc(png_ptr,
+ (png_uint_32)buf_size);
+ png_memset(png_ptr->prev_row, 0, buf_size);
if (png_ptr->do_filter & PNG_FILTER_UP)
{
png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
+ (png_uint_32)(png_ptr->rowbytes + 1));
png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
}
if (png_ptr->do_filter & PNG_FILTER_AVG)
{
png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
+ (png_uint_32)(png_ptr->rowbytes + 1));
png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
}
if (png_ptr->do_filter & PNG_FILTER_PAETH)
{
png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
+ (png_uint_32)(png_ptr->rowbytes + 1));
png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
}
-#endif /* PNG_NO_WRITE_FILTERING */
}
+#endif /* PNG_NO_WRITE_FILTER */
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- /* if interlaced, we need to set up width and height of pass */
+ /* If interlaced, we need to set up width and height of pass */
if (png_ptr->interlaced)
{
if (!(png_ptr->transformations & PNG_INTERLACE))
@@ -1836,34 +1855,35 @@ png_write_finish_row(png_structp png_ptr)
{
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
- /* start of interlace block in the y direction */
+ /* Start of interlace block in the y direction */
int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
- /* offset to next interlace block in the y direction */
+ /* Offset to next interlace block in the y direction */
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
int ret;
- png_debug(1, "in png_write_finish_row\n");
- /* next row */
+ png_debug(1, "in png_write_finish_row");
+
+ /* Next row */
png_ptr->row_number++;
- /* see if we are done */
+ /* See if we are done */
if (png_ptr->row_number < png_ptr->num_rows)
return;
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- /* if interlaced, go to next pass */
+ /* If interlaced, go to next pass */
if (png_ptr->interlaced)
{
png_ptr->row_number = 0;
@@ -1873,7 +1893,7 @@ png_write_finish_row(png_structp png_ptr)
}
else
{
- /* loop until we find a non-zero width or height pass */
+ /* Loop until we find a non-zero width or height pass */
do
{
png_ptr->pass++;
@@ -1893,28 +1913,28 @@ png_write_finish_row(png_structp png_ptr)
}
- /* reset the row above the image for the next pass */
+ /* Reset the row above the image for the next pass */
if (png_ptr->pass < 7)
{
if (png_ptr->prev_row != NULL)
png_memset(png_ptr->prev_row, 0,
(png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels*
- png_ptr->usr_bit_depth,png_ptr->width))+1);
+ png_ptr->usr_bit_depth, png_ptr->width)) + 1);
return;
}
}
#endif
- /* if we get here, we've just written the last row, so we need
+ /* If we get here, we've just written the last row, so we need
to flush the compressor */
do
{
- /* tell the compressor we are done */
+ /* Tell the compressor we are done */
ret = deflate(&png_ptr->zstream, Z_FINISH);
- /* check for an error */
+ /* Check for an error */
if (ret == Z_OK)
{
- /* check to see if we need more room */
+ /* Check to see if we need more room */
if (!(png_ptr->zstream.avail_out))
{
png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
@@ -1931,7 +1951,7 @@ png_write_finish_row(png_structp png_ptr)
}
} while (ret != Z_STREAM_END);
- /* write any extra space */
+ /* Write any extra space */
if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
{
png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size -
@@ -1954,24 +1974,25 @@ void /* PRIVATE */
png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
{
#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
+ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* start of interlace block */
+ /* Start of interlace block */
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
- /* offset to next interlace block */
+ /* Offset to next interlace block */
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
#endif
- png_debug(1, "in png_do_write_interlace\n");
- /* we don't have to do anything on the last pass (6) */
+ png_debug(1, "in png_do_write_interlace");
+
+ /* We don't have to do anything on the last pass (6) */
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && pass < 6)
#else
if (pass < 6)
#endif
{
- /* each pixel depth is handled separately */
+ /* Each pixel depth is handled separately */
switch (row_info->pixel_depth)
{
case 1:
@@ -2082,27 +2103,27 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
png_uint_32 row_width = row_info->width;
png_size_t pixel_bytes;
- /* start at the beginning */
+ /* Start at the beginning */
dp = row;
- /* find out how many bytes each pixel takes up */
+ /* Find out how many bytes each pixel takes up */
pixel_bytes = (row_info->pixel_depth >> 3);
- /* loop through the row, only looking at the pixels that
+ /* Loop through the row, only looking at the pixels that
matter */
for (i = png_pass_start[pass]; i < row_width;
i += png_pass_inc[pass])
{
- /* find out where the original pixel is */
+ /* Find out where the original pixel is */
sp = row + (png_size_t)i * pixel_bytes;
- /* move the pixel */
+ /* Move the pixel */
if (dp != sp)
png_memcpy(dp, sp, pixel_bytes);
- /* next pixel */
+ /* Next pixel */
dp += pixel_bytes;
}
break;
}
}
- /* set new row width */
+ /* Set new row width */
row_info->width = (row_info->width +
png_pass_inc[pass] - 1 -
png_pass_start[pass]) /
@@ -2130,12 +2151,13 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
png_uint_32 mins, bpp;
png_byte filter_to_do = png_ptr->do_filter;
png_uint_32 row_bytes = row_info->rowbytes;
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
+#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
int num_p_filters = (int)png_ptr->num_prev_filters;
-#endif
+#endif
- png_debug(1, "in png_write_find_filter\n");
- /* find out how many bytes offset each pixel is */
+ png_debug(1, "in png_write_find_filter");
+
+ /* Find out how many bytes offset each pixel is */
bpp = (row_info->pixel_depth + 7) >> 3;
prev_row = png_ptr->prev_row;
@@ -2222,9 +2244,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
mins = sum;
}
- /* sub filter */
+ /* Sub filter */
if (filter_to_do == PNG_FILTER_SUB)
- /* it's the only filter so no testing is needed */
+ /* It's the only filter so no testing is needed */
{
png_bytep rp, lp, dp;
png_uint_32 i;
@@ -2339,7 +2361,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
}
}
- /* up filter */
+ /* Up filter */
if (filter_to_do == PNG_FILTER_UP)
{
png_bytep rp, dp, pp;
@@ -2442,7 +2464,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
}
}
- /* avg filter */
+ /* Avg filter */
if (filter_to_do == PNG_FILTER_AVG)
{
png_bytep rp, dp, pp, lp;
@@ -2743,20 +2765,21 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
void /* PRIVATE */
png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
{
- png_debug(1, "in png_write_filtered_row\n");
- png_debug1(2, "filter = %d\n", filtered_row[0]);
- /* set up the zlib input buffer */
+ png_debug(1, "in png_write_filtered_row");
+
+ png_debug1(2, "filter = %d", filtered_row[0]);
+ /* Set up the zlib input buffer */
png_ptr->zstream.next_in = filtered_row;
png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1;
- /* repeat until we have compressed all the data */
+ /* Repeat until we have compressed all the data */
do
{
- int ret; /* return of zlib */
+ int ret; /* Return of zlib */
- /* compress the data */
+ /* Compress the data */
ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
- /* check for compression errors */
+ /* Check for compression errors */
if (ret != Z_OK)
{
if (png_ptr->zstream.msg != NULL)
@@ -2765,18 +2788,18 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
png_error(png_ptr, "zlib error");
}
- /* see if it is time to write another IDAT */
+ /* See if it is time to write another IDAT */
if (!(png_ptr->zstream.avail_out))
{
- /* write the IDAT and reset the zlib output buffer */
+ /* Write the IDAT and reset the zlib output buffer */
png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
png_ptr->zstream.next_out = png_ptr->zbuf;
png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
- /* repeat until all data has been compressed */
+ /* Repeat until all data has been compressed */
} while (png_ptr->zstream.avail_in);
- /* swap the current and previous rows */
+ /* Swap the current and previous rows */
if (png_ptr->prev_row != NULL)
{
png_bytep tptr;
@@ -2786,7 +2809,7 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
png_ptr->row_buf = tptr;
}
- /* finish row - updates counters and flushes zlib if last row */
+ /* Finish row - updates counters and flushes zlib if last row */
png_write_finish_row(png_ptr);
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
diff --git a/src/3rdparty/libpng/scripts/CMakeLists.txt b/src/3rdparty/libpng/scripts/CMakeLists.txt
index fceea62..c040c03 100644
--- a/src/3rdparty/libpng/scripts/CMakeLists.txt
+++ b/src/3rdparty/libpng/scripts/CMakeLists.txt
@@ -1,17 +1,24 @@
-
-project(PNG)
+project(PNG C)
+cmake_minimum_required(VERSION 2.4.3)
# Copyright (C) 2007 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
set(PNGLIB_MAJOR 1)
set(PNGLIB_MINOR 2)
-set(PNGLIB_RELEASE 29)
+set(PNGLIB_RELEASE 40)
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
+set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
+
# needed packages
find_package(ZLIB REQUIRED)
+include_directories(${ZLIB_INCLUDE_DIR})
+
if(NOT WIN32)
find_library(M_LIBRARY
NAMES m
@@ -20,24 +27,33 @@ if(NOT WIN32)
if(NOT M_LIBRARY)
message(STATUS
"math library 'libm' not found - floating point support disabled")
- endif(NOT M_LIBRARY)
-else(NOT WIN32)
+ endif()
+else()
# not needed on windows
set(M_LIBRARY "")
-endif(NOT WIN32)
-
+endif()
# COMMAND LINE OPTIONS
-option(PNG_SHARED "Build shared lib" YES)
-option(PNG_STATIC "Build static lib" YES)
+if(DEFINED PNG_SHARED)
+ option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
+else()
+ option(PNG_SHARED "Build shared lib" ON)
+endif()
+if(DEFINED PNG_STATIC)
+ option(PNG_STATIC "Build static lib" ${PNG_STATIC})
+else()
+ option(PNG_STATIC "Build static lib" ON)
+endif()
+
if(MINGW)
option(PNG_TESTS "Build pngtest" NO)
else(MINGW)
option(PNG_TESTS "Build pngtest" YES)
endif(MINGW)
+
option(PNG_NO_CONSOLE_IO "FIXME" YES)
option(PNG_NO_STDIO "FIXME" YES)
-option(PNG_DEBUG "Build with debug output" YES)
+option(PNG_DEBUG "Build with debug output" NO)
option(PNGARG "FIXME" YES)
#TODO:
# PNG_CONSOLE_IO_SUPPORTED
@@ -54,20 +70,16 @@ if(NOT WIN32)
set(png_asm_tmp "OFF")
endif("uname_output" MATCHES "^.*i[1-9]86.*$")
endif(uname_executable)
-else(NOT WIN32)
+else()
# this env var is normally only set on win64
SET(TEXT "ProgramFiles(x86)")
if("$ENV{${TEXT}}" STREQUAL "")
set(png_asm_tmp "ON")
endif("$ENV{${TEXT}}" STREQUAL "")
-endif(NOT WIN32)
+endif()
# SET LIBNAME
-# msvc does not append 'lib' - do it here to have consistent name
-if(MSVC)
- set(PNG_LIB_NAME lib)
-endif(MSVC)
-set(PNG_LIB_NAME ${PNG_LIB_NAME}png${PNGLIB_MAJOR}${PNGLIB_MINOR})
+set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
# to distinguish between debug and release lib
set(CMAKE_DEBUG_POSTFIX "d")
@@ -101,54 +113,67 @@ if(MSVC)
add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
endif(MSVC)
-add_definitions(-DZLIB_DLL)
+if(PNG_SHARED OR NOT MSVC)
+ #if building msvc static this has NOT do be defined
+ add_definitions(-DZLIB_DLL)
+endif()
add_definitions(-DLIBPNG_NO_MMX)
add_definitions(-DPNG_NO_MMX_CODE)
if(PNG_CONSOLE_IO_SUPPORTED)
add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
-endif(PNG_CONSOLE_IO_SUPPORTED)
+endif()
if(PNG_NO_CONSOLE_IO)
add_definitions(-DPNG_NO_CONSOLE_IO)
-endif(PNG_NO_CONSOLE_IO)
+endif()
if(PNG_NO_STDIO)
add_definitions(-DPNG_NO_STDIO)
-endif(PNG_NO_STDIO)
+endif()
if(PNG_DEBUG)
add_definitions(-DPNG_DEBUG)
-endif(PNG_DEBUG)
+endif()
if(NOT M_LIBRARY AND NOT WIN32)
add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
-endif(NOT M_LIBRARY AND NOT WIN32)
+endif()
# NOW BUILD OUR TARGET
include_directories(${PNG_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
if(PNG_SHARED)
add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
+ if(MSVC)
+ # msvc does not append 'lib' - do it here to have consistent name
+ set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
+ endif()
target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
-endif(PNG_SHARED)
+endif()
+
if(PNG_STATIC)
# does not work without changing name
set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
-endif(PNG_STATIC)
+ if(MSVC)
+ # msvc does not append 'lib' - do it here to have consistent name
+ set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
+ endif()
+endif()
+
if(PNG_SHARED AND WIN32)
set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
-endif(PNG_SHARED AND WIN32)
+endif()
-if(PNG_TESTS)
+if(PNG_TESTS AND PNG_SHARED)
# does not work with msvc due to png_lib_ver issue
add_executable(pngtest ${pngtest_sources})
target_link_libraries(pngtest ${PNG_LIB_NAME})
# add_test(pngtest ${PNG_SOURCE_DIR}/pngtest.png)
-endif(PNG_TESTS)
+endif()
# CREATE PKGCONFIG FILES
@@ -168,31 +193,49 @@ configure_file(${PNG_SOURCE_DIR}/scripts/libpng-config.in
${PNG_BINARY_DIR}/${PNGLIB_NAME}-config)
# SET UP LINKS
-set_target_properties(${PNG_LIB_NAME} PROPERTIES
-# VERSION 0.${PNGLIB_RELEASE}.1.2.29
+if(PNG_SHARED)
+ set_target_properties(${PNG_LIB_NAME} PROPERTIES
+# VERSION 0.${PNGLIB_RELEASE}.1.2.40
VERSION 0.${PNGLIB_RELEASE}.0
SOVERSION 0
CLEAN_DIRECT_OUTPUT 1)
-if(NOT WIN32)
- # that's uncool on win32 - it overwrites our static import lib...
- set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
- OUTPUT_NAME ${PNG_LIB_NAME}
- CLEAN_DIRECT_OUTPUT 1)
-endif(NOT WIN32)
-# INSTALL
-install_targets(/lib ${PNG_LIB_NAME})
+endif()
if(PNG_STATIC)
- install_targets(/lib ${PNG_LIB_NAME_STATIC})
-endif(PNG_STATIC)
+ if(NOT WIN32)
+ # that's uncool on win32 - it overwrites our static import lib...
+ set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
+ OUTPUT_NAME ${PNG_LIB_NAME}
+ CLEAN_DIRECT_OUTPUT 1)
+ endif()
+endif()
+# INSTALL
+if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+ if(PNG_SHARED)
+ install(TARGETS ${PNG_LIB_NAME}
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+ endif()
+ if(PNG_STATIC)
+ install(TARGETS ${PNG_LIB_NAME_STATIC}
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+ endif()
+endif()
+
+if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
install(FILES png.h pngconf.h DESTINATION include)
install(FILES png.h pngconf.h DESTINATION include/${PNGLIB_NAME})
-install(FILES libpng.3 libpngpf.3 DESTINATION man/man3)
-install(FILES png.5 DESTINATION man/man5)
-install(FILES ${PNG_BINARY_DIR}/libpng.pc DESTINATION lib/pkgconfig)
-install(FILES ${PNG_BINARY_DIR}/libpng-config DESTINATION bin)
-install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}.pc DESTINATION lib/pkgconfig)
-install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
+endif()
+if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
+ install(FILES libpng.3 libpngpf.3 DESTINATION man/man3)
+ install(FILES png.5 DESTINATION man/man5)
+ install(FILES ${PNG_BINARY_DIR}/libpng.pc DESTINATION lib/pkgconfig)
+ install(FILES ${PNG_BINARY_DIR}/libpng-config DESTINATION bin)
+ install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}.pc DESTINATION lib/pkgconfig)
+ install(FILES ${PNG_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
+endif()
# what's with libpng.txt and all the extra files?
diff --git a/src/3rdparty/libpng/scripts/descrip.mms b/src/3rdparty/libpng/scripts/descrip.mms
index 3584b0d..f3a8d7b 100644
--- a/src/3rdparty/libpng/scripts/descrip.mms
+++ b/src/3rdparty/libpng/scripts/descrip.mms
@@ -1,6 +1,6 @@
cc_defs = /inc=$(ZLIBSRC)
-c_deb =
+c_deb =
.ifdef __DECC__
pref = /prefix=all
@@ -29,7 +29,7 @@ test : pngtest.exe
run pngtest
clean :
- delete *.obj;*,*.exe;*
+ delete *.obj;*,*.exe;
# Other dependencies.
@@ -44,9 +44,9 @@ pngerror.obj : png.h, pngconf.h
pngmem.obj : png.h, pngconf.h
pngrio.obj : png.h, pngconf.h
pngwio.obj : png.h, pngconf.h
-pngtest.obj : png.h, pngconf.h
pngtrans.obj : png.h, pngconf.h
pngwrite.obj : png.h, pngconf.h
pngwtran.obj : png.h, pngconf.h
pngwutil.obj : png.h, pngconf.h
+pngtest.obj : png.h, pngconf.h
diff --git a/src/3rdparty/libpng/scripts/libpng-config-head.in b/src/3rdparty/libpng/scripts/libpng-config-head.in
index 1569938..38fcc08 100755
--- a/src/3rdparty/libpng/scripts/libpng-config-head.in
+++ b/src/3rdparty/libpng/scripts/libpng-config-head.in
@@ -4,11 +4,14 @@
# provides configuration info for libpng.
# Copyright (C) 2002 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Modeled after libxml-config.
-version=1.2.29
+version=1.2.40
prefix=""
libdir=""
libs=""
diff --git a/src/3rdparty/libpng/scripts/libpng-config.in b/src/3rdparty/libpng/scripts/libpng-config.in
index f227ee5..7ae7d50 100755
--- a/src/3rdparty/libpng/scripts/libpng-config.in
+++ b/src/3rdparty/libpng/scripts/libpng-config.in
@@ -4,7 +4,10 @@
# provides configuration info for libpng.
# Copyright (C) 2002, 2004, 2006, 2007 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Modeled after libxml-config.
@@ -14,7 +17,7 @@ exec_prefix="@exec_prefix@"
libdir="@libdir@"
includedir="@includedir@/libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@"
libs="-lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@"
-all_libs="-lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ -lz -lm"
+all_libs="-lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ @LIBS@"
I_opts="-I${includedir}"
L_opts="-L${libdir}"
R_opts=""
diff --git a/src/3rdparty/libpng/scripts/libpng.icc b/src/3rdparty/libpng/scripts/libpng.icc
index f9c51af..6635963 100644
--- a/src/3rdparty/libpng/scripts/libpng.icc
+++ b/src/3rdparty/libpng/scripts/libpng.icc
@@ -1,13 +1,16 @@
// Project file for libpng (static)
// IBM VisualAge/C++ version 4.0 or later
// Copyright (C) 2000 Cosmin Truta
-// For conditions of distribution and use, see copyright notice in png.h
+//
+// This code is released under the libpng license.
+// For conditions of distribution and use, see the disclaimer
+// and license in png.h
+//
// Notes:
// All modules are compiled in C mode
// Tested with IBM VAC++ 4.0 under Win32
// Expected to work with IBM VAC++ 4.0 or later under OS/2 and Win32
// Can be easily adapted for IBM VAC++ 4.0 or later under AIX
-// For conditions of distribution and use, see copyright notice in png.h
option incl(searchpath, "../zlib"), opt(level, "2"),
link(libsearchpath, "../zlib")
diff --git a/src/3rdparty/libpng/scripts/libpng.pc-configure.in b/src/3rdparty/libpng/scripts/libpng.pc-configure.in
index e7c5e23..cadb555 100644
--- a/src/3rdparty/libpng/scripts/libpng.pc-configure.in
+++ b/src/3rdparty/libpng/scripts/libpng.pc-configure.in
@@ -1,10 +1,11 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
-includedir=@includedir@/libpng12
+includedir=@includedir@/libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
Name: libpng
Description: Loads and saves PNG files
-Version: 1.2.29
-Libs: -L${libdir} -lpng12
+Version: @PNGLIB_VERSION@
+Libs: -L${libdir} -lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@
+Libs.private: @LIBS@
Cflags: -I${includedir} @LIBPNG_NO_MMX@
diff --git a/src/3rdparty/libpng/scripts/libpng.pc.in b/src/3rdparty/libpng/scripts/libpng.pc.in
index bcf6162..f4ab0d2 100644
--- a/src/3rdparty/libpng/scripts/libpng.pc.in
+++ b/src/3rdparty/libpng/scripts/libpng.pc.in
@@ -5,6 +5,6 @@ includedir=@includedir@/libpng12
Name: libpng
Description: Loads and saves PNG files
-Version: 1.2.29
+Version: 1.2.40
Libs: -L${libdir} -lpng12
Cflags: -I${includedir}
diff --git a/src/3rdparty/libpng/scripts/makefile.32sunu b/src/3rdparty/libpng/scripts/makefile.32sunu
index 7b419f2..2ce4a3a 100644
--- a/src/3rdparty/libpng/scripts/makefile.32sunu
+++ b/src/3rdparty/libpng/scripts/makefile.32sunu
@@ -3,12 +3,15 @@
# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1998 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
diff --git a/src/3rdparty/libpng/scripts/makefile.64sunu b/src/3rdparty/libpng/scripts/makefile.64sunu
index a7762cc..134e792 100644
--- a/src/3rdparty/libpng/scripts/makefile.64sunu
+++ b/src/3rdparty/libpng/scripts/makefile.64sunu
@@ -3,12 +3,15 @@
# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1998 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
diff --git a/src/3rdparty/libpng/scripts/makefile.acorn b/src/3rdparty/libpng/scripts/makefile.acorn
index 470cf89..a0e577b 100644
--- a/src/3rdparty/libpng/scripts/makefile.acorn
+++ b/src/3rdparty/libpng/scripts/makefile.acorn
@@ -6,11 +6,10 @@ CCflags = -c -depend !Depend -IC:,Zlib: -g -throwback -DRISCOS -fnah
C++flags = -c -depend !Depend -IC: -throwback
Linkflags = -aif -c++ -o $@
ObjAsmflags = -throwback -NoCache -depend !Depend
-CMHGflags =
+CMHGflags =
LibFileflags = -c -l -o $@
Squeezeflags = -o $@
-
# Final targets:
@.libpng-lib: @.o.png @.o.pngerror @.o.pngrio @.o.pngwio @.o.pngmem \
@.o.pngpread @.o.pngset @.o.pngget @.o.pngread @.o.pngrtran \
diff --git a/src/3rdparty/libpng/scripts/makefile.aix b/src/3rdparty/libpng/scripts/makefile.aix
index 99e3868..2cb6e67 100644
--- a/src/3rdparty/libpng/scripts/makefile.aix
+++ b/src/3rdparty/libpng/scripts/makefile.aix
@@ -1,9 +1,12 @@
# makefile for libpng using gcc (generic, static library)
-# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006-2009 Glenn Randers-Pehrson
# Copyright (C) 2000 Cosmin Truta
# Copyright (C) 2000 Marc O. Gloor (AIX support added, from makefile.gcc)
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Location of the zlib library and include files
ZLIBINC = ../zlib
@@ -20,7 +23,7 @@ LN_SF = ln -f -s
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
prefix=/usr/local
@@ -44,7 +47,7 @@ CDEBUG = -g -DPNG_DEBUG=5
LDDEBUG =
CRELEASE = -O2
LDRELEASE = -s
-WARNMORE=-Wall
+WARNMORE=-W -Wall
CFLAGS = -I$(ZLIBINC) $(WARNMORE) $(CRELEASE)
LDFLAGS = -L. -L$(ZLIBLIB) -lpng12 -lz -lm $(LDRELEASE)
@@ -54,7 +57,7 @@ A=.a
E=
# Variables
-OBJS = png$(O) pngerror$(O) pngget$(O) pngmem$(O) pngpread$(O) \
+OBJS = png$(O) pngerror$(O) pngget$(O) pngmem$(O) pngpread$(O) \
pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) pngset$(O) \
pngtrans$(O) pngwio$(O) pngwrite$(O) pngwtran$(O) pngwutil$(O)
@@ -94,20 +97,20 @@ install: $(LIBNAME)$(A)
clean:
$(RM_F) *.o $(LIBNAME)$(A) pngtest pngout.png
-png$(O): png.h pngconf.h
+png$(O): png.h pngconf.h
pngerror$(O): png.h pngconf.h
-pngget$(O): png.h pngconf.h
-pngmem$(O): png.h pngconf.h
+pngget$(O): png.h pngconf.h
+pngmem$(O): png.h pngconf.h
pngpread$(O): png.h pngconf.h
-pngread$(O): png.h pngconf.h
-pngrio$(O): png.h pngconf.h
+pngread$(O): png.h pngconf.h
+pngrio$(O): png.h pngconf.h
pngrtran$(O): png.h pngconf.h
pngrutil$(O): png.h pngconf.h
-pngset$(O): png.h pngconf.h
-pngtest$(O): png.h pngconf.h
+pngset$(O): png.h pngconf.h
pngtrans$(O): png.h pngconf.h
-pngwio$(O): png.h pngconf.h
+pngwio$(O): png.h pngconf.h
pngwrite$(O): png.h pngconf.h
pngwtran$(O): png.h pngconf.h
pngwutil$(O): png.h pngconf.h
+pngtest$(O): png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.amiga b/src/3rdparty/libpng/scripts/makefile.amiga
index 79cb424..50977c7 100644
--- a/src/3rdparty/libpng/scripts/makefile.amiga
+++ b/src/3rdparty/libpng/scripts/makefile.amiga
@@ -1,7 +1,10 @@
# Commodore Amiga Makefile
# makefile for libpng and SAS C V6.5x compiler
# Copyright (C) 1995-2000 Wolf Faust
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
#
# Note: Use #define PNG_READ_BIG_ENDIAN_SUPPORTED in pngconf.h
#
diff --git a/src/3rdparty/libpng/scripts/makefile.atari b/src/3rdparty/libpng/scripts/makefile.atari
index 9566d5d..944337d 100644
--- a/src/3rdparty/libpng/scripts/makefile.atari
+++ b/src/3rdparty/libpng/scripts/makefile.atari
@@ -1,8 +1,12 @@
# makefile for libpng
# Copyright (C) 2002 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
-# modified for LC56/ATARI assumes libz.lib is in same dir and uses default
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
+# Modified for LC56/ATARI assumes libz.lib is in same dir and uses default
# rules for library management
#
CFLAGS=-I..\zlib -O
diff --git a/src/3rdparty/libpng/scripts/makefile.bc32 b/src/3rdparty/libpng/scripts/makefile.bc32
index 04407dd..4b96231 100644
--- a/src/3rdparty/libpng/scripts/makefile.bc32
+++ b/src/3rdparty/libpng/scripts/makefile.bc32
@@ -11,7 +11,6 @@
## Where zlib.h, zconf.h and zlib.lib are
ZLIB_DIR=..\zlib
-
## Compiler, linker and lib stuff
CC=bcc32
LD=bcc32
@@ -49,7 +48,6 @@ CFLAGS=-I$(ZLIB_DIR) -O2 -d -k- -w $(TARGET_CPU) $(CDEBUG)
# -M generate map file
LDFLAGS=-L$(ZLIB_DIR) -M $(LDEBUG)
-
## Variables
OBJS = \
png.obj \
@@ -87,7 +85,6 @@ LIBOBJS = \
LIBNAME=libpng.lib
-
## Implicit rules
# Braces let make "batch" calls to the compiler,
# 2 calls instead of 12; space is important.
@@ -100,7 +97,6 @@ LIBNAME=libpng.lib
.obj.exe:
$(LD) $(LDFLAGS) $*.obj $(LIBNAME) zlib.lib $(NOEHLIB)
-
## Major targets
all: libpng pngtest
@@ -111,25 +107,24 @@ pngtest: pngtest.exe
test: pngtest.exe
pngtest
-
## Minor Targets
-png.obj: png.c
-pngerror.obj: pngerror.c
-pngget.obj: pngget.c
-pngmem.obj: pngmem.c
-pngpread.obj: pngpread.c
-pngread.obj: pngread.c
-pngrio.obj: pngrio.c
-pngrtran.obj: pngrtran.c
-pngrutil.obj: pngrutil.c
-pngset.obj: pngset.c
-pngtrans.obj: pngtrans.c
-pngwio.obj: pngwio.c
-pngwrite.obj: pngwrite.c
-pngwtran.obj: pngwtran.c
-pngwutil.obj: pngwutil.c
-
+png.obj: png.c png.h pngconf.h
+pngerror.obj: pngerror.c png.h pngconf.h
+pngget.obj: pngget.c png.h pngconf.h
+pngmem.obj: pngmem.c png.h pngconf.h
+pngpread.obj: pngpread.c png.h pngconf.h
+pngread.obj: pngread.c png.h pngconf.h
+pngrio.obj: pngrio.c png.h pngconf.h
+pngrtran.obj: pngrtran.c png.h pngconf.h
+pngrutil.obj: pngrutil.c png.h pngconf.h
+pngset.obj: pngset.c png.h pngconf.h
+pngtrans.obj: pngtrans.c png.h pngconf.h
+pngwio.obj: pngwio.c png.h pngconf.h
+pngwrite.obj: pngwrite.c png.h pngconf.h
+pngwtran.obj: pngwtran.c png.h pngconf.h
+pngwutil.obj: pngwutil.c png.h pngconf.h
+pngtest.obj: pngtest.c png.h pngconf.h
$(LIBNAME): $(OBJS)
-del $(LIBNAME)
@@ -137,7 +132,6 @@ $(LIBNAME): $(OBJS)
$(LIBOBJS), libpng
|
-
# Cleanup
clean:
-del *.obj
@@ -148,5 +142,4 @@ clean:
-del *.tds
-del pngout.png
-
# End of makefile for libpng
diff --git a/src/3rdparty/libpng/scripts/makefile.beos b/src/3rdparty/libpng/scripts/makefile.beos
index 341a57c..5dbf14c 100644
--- a/src/3rdparty/libpng/scripts/makefile.beos
+++ b/src/3rdparty/libpng/scripts/makefile.beos
@@ -1,14 +1,17 @@
# makefile for libpng on BeOS x86 ELF with gcc
# modified from makefile.linux by Sander Stoks
-# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006, 2008 Glenn Randers-Pehrson
# Copyright (C) 1999 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -41,7 +44,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# On BeOS, -O1 is actually better than -O3. This is a known bug but it's
# still here in R4.5
-CFLAGS=-I$(ZLIBINC) -Wall -O1 -funroll-loops \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O1 -funroll-loops \
$(ALIGN) # $(WARNMORE) -g -DPNG_DEBUG=5
# LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng -lz
LDFLAGS=-L. -Wl,-soname=$(LIBSOMAJ) -L$(ZLIBLIB) -lz
@@ -223,4 +226,5 @@ pngwrite.o pngwrite.pic.o: png.h pngconf.h
pngwtran.o pngwtran.pic.o: png.h pngconf.h
pngwutil.o pngwutil.pic.o: png.h pngconf.h
pngpread.o pngpread.pic.o: png.h pngconf.h
+
pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.bor b/src/3rdparty/libpng/scripts/makefile.bor
index a5651aa..0a8ef00 100644
--- a/src/3rdparty/libpng/scripts/makefile.bor
+++ b/src/3rdparty/libpng/scripts/makefile.bor
@@ -12,7 +12,6 @@
## Where zlib.h, zconf.h and zlib_MODEL.lib are
ZLIB_DIR=..\zlib
-
## Compiler, linker and lib stuff
CC=bcc
LD=bcc
@@ -57,8 +56,8 @@ CFLAGS=-O2 -Z -X- -w -I$(ZLIB_DIR) -$(TARGET_CPU) $(MODEL_ARG) $(CDEBUG)
# -M generate map file
LDFLAGS=-M -L$(ZLIB_DIR) $(MODEL_ARG) $(LDEBUG)
-
## Variables
+
OBJS = \
png.obj \
pngerror.obj \
@@ -95,8 +94,8 @@ LIBOBJS = \
LIBNAME=libpng$(MODEL).lib
-
## Implicit rules
+
# Braces let make "batch" calls to the compiler,
# 2 calls instead of 12; space is important.
.c.obj:
@@ -105,8 +104,8 @@ LIBNAME=libpng$(MODEL).lib
.c.exe:
$(CC) $(CFLAGS) $(LDFLAGS) $*.c $(LIBNAME) zlib_$(MODEL).lib $(NOEHLIB)
-
## Major targets
+
all: libpng pngtest
libpng: $(LIBNAME)
@@ -116,25 +115,23 @@ pngtest: pngtest$(MODEL).exe
test: pngtest$(MODEL).exe
pngtest$(MODEL)
-
## Minor Targets
-png.obj: png.c
-pngerror.obj: pngerror.c
-pngget.obj: pngget.c
-pngmem.obj: pngmem.c
-pngpread.obj: pngpread.c
-pngread.obj: pngread.c
-pngrio.obj: pngrio.c
-pngrtran.obj: pngrtran.c
-pngrutil.obj: pngrutil.c
-pngset.obj: pngset.c
-pngtrans.obj: pngtrans.c
-pngwio.obj: pngwio.c
-pngwrite.obj: pngwrite.c
-pngwtran.obj: pngwtran.c
-pngwutil.obj: pngwutil.c
-
+png.obj: png.c png.h pngconf.h
+pngerror.obj: pngerror.c png.h pngconf.h
+pngget.obj: pngget.c png.h pngconf.h
+pngmem.obj: pngmem.c png.h pngconf.h
+pngpread.obj: pngpread.c png.h pngconf.h
+pngread.obj: pngread.c png.h pngconf.h
+pngrio.obj: pngrio.c png.h pngconf.h
+pngrtran.obj: pngrtran.c png.h pngconf.h
+pngrutil.obj: pngrutil.c png.h pngconf.h
+pngset.obj: pngset.c png.h pngconf.h
+pngtrans.obj: pngtrans.c png.h pngconf.h
+pngwio.obj: pngwio.c png.h pngconf.h
+pngwrite.obj: pngwrite.c png.h pngconf.h
+pngwtran.obj: pngwtran.c png.h pngconf.h
+pngwutil.obj: pngwutil.c png.h pngconf.h
$(LIBNAME): $(OBJS)
-del $(LIBNAME)
@@ -142,14 +139,12 @@ $(LIBNAME): $(OBJS)
$(LIBOBJS), libpng$(MODEL)
|
-
pngtest$(MODEL).obj: pngtest.c
$(CC) $(CFLAGS) -opngtest$(MODEL) -c pngtest.c
pngtest$(MODEL).exe: pngtest$(MODEL).obj
$(LD) $(LDFLAGS) pngtest$(MODEL).obj $(LIBNAME) zlib_$(MODEL).lib $(NOEHLIB)
-
# Clean up anything else you want
clean:
-del *.obj
@@ -158,5 +153,4 @@ clean:
-del *.lst
-del *.map
-
# End of makefile for libpng
diff --git a/src/3rdparty/libpng/scripts/makefile.cygwin b/src/3rdparty/libpng/scripts/makefile.cygwin
index bbf3e5f..2a19090 100644
--- a/src/3rdparty/libpng/scripts/makefile.cygwin
+++ b/src/3rdparty/libpng/scripts/makefile.cygwin
@@ -3,11 +3,14 @@
# of the library, and builds two copies of pngtest: one
# statically linked and one dynamically linked.
#
-# Copyright (C) 2002, 2006, 2007 Soren Anderson, Charles Wilson,
+# Copyright (C) 2002, 2006-2008 Soren Anderson, Charles Wilson,
# and Glenn Randers-Pehrson, based on makefile for linux-elf w/mmx by:
# Copyright (C) 1998-2000 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# This makefile intends to support building outside the src directory
# if desired. When invoking it, specify an argument to SRCDIR on the
@@ -60,21 +63,21 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
### if you don't need thread safety, but want the asm accel
#CFLAGS= $(strip $(MINGW_CCFLAGS) -DPNG_THREAD_UNSAFE_OK \
-# $(addprefix -I,$(ZLIBINC)) -Wall -O $(ALIGN) -funroll-loops \
+# $(addprefix -I,$(ZLIBINC)) -W -Wall -O $(ALIGN) -funroll-loops \
# -fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
### if you need thread safety and want (minimal) asm accel
#CFLAGS= $(strip $(MINGW_CCFLAGS) $(addprefix -I,$(ZLIBINC)) \
-# -Wall -O $(ALIGN) -funroll-loops \
+# -W -Wall -O $(ALIGN) -funroll-loops \
# -fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
### Normal (non-asm) compilation
CFLAGS= $(strip $(MINGW_CCFLAGS) $(addprefix -I,$(ZLIBINC)) \
- -Wall -O3 $(ALIGN) -funroll-loops -DPNG_NO_MMX_CODE \
+ -W -Wall -O3 $(ALIGN) -funroll-loops -DPNG_NO_MMX_CODE \
-fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
LIBNAME = libpng12
PNGMAJ = 0
CYGDLL = 12
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
SHAREDLIB=cygpng$(CYGDLL).dll
@@ -176,7 +179,7 @@ pngtest-stat$(EXE): pngtest.o $(STATLIB)
pngtest.pic.o: pngtest.c
$(CC) $(CFLAGS) -c $< -o $@
-pngtest.o: pngtest.c
+pngtest.o: pngtest.c png.h pngconf.h
$(CC) $(CFLAGS) -c $< -o $@
test: test-static test-shared
diff --git a/src/3rdparty/libpng/scripts/makefile.darwin b/src/3rdparty/libpng/scripts/makefile.darwin
index 76be8a6..c07880f 100644
--- a/src/3rdparty/libpng/scripts/makefile.darwin
+++ b/src/3rdparty/libpng/scripts/makefile.darwin
@@ -1,10 +1,13 @@
# makefile for libpng on Darwin / Mac OS X
-# Copyright (C) 2002, 2004, 2006 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2004, 2006, 2008 Glenn Randers-Pehrson
# Copyright (C) 2001 Christoph Pfisterer
# derived from makefile.linux:
# Copyright (C) 1998, 1999 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# where "make install" puts libpng.a, libpng12.dylib, png.h and pngconf.h
prefix=/usr/local
@@ -18,8 +21,8 @@ ZLIBINC=../zlib
# Library name:
LIBNAME = libpng12
-PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMAJ = 12
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -38,8 +41,8 @@ LN_SF=ln -sf
RANLIB=ranlib
RM_F=/bin/rm -f
-# CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE
-CFLAGS=-I$(ZLIBINC) -Wall -O -funroll-loops
+# CFLAGS=-I$(ZLIBINC) -W -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE
+CFLAGS=-I$(ZLIBINC) -W -Wall -O -funroll-loops
LDFLAGS=-L. -L$(ZLIBLIB) -lpng12 -lz
INCPATH=$(prefix)/include
@@ -104,7 +107,7 @@ $(LIBSOMAJ): $(LIBSOVER)
$(LIBSOVER): $(OBJSDLL)
$(CC) -dynamiclib \
-install_name $(LIBPATH)/$(LIBSOMAJ) \
- -current_version $(PNGVER) -compatibility_version $(PNGVER) \
+ -current_version 0 -compatibility_version 0 \
-o $(LIBSOVER) \
$(OBJSDLL) -L$(ZLIBLIB) -lz
diff --git a/src/3rdparty/libpng/scripts/makefile.dec b/src/3rdparty/libpng/scripts/makefile.dec
index de35c56..b8f99db 100644
--- a/src/3rdparty/libpng/scripts/makefile.dec
+++ b/src/3rdparty/libpng/scripts/makefile.dec
@@ -1,11 +1,14 @@
# makefile for libpng on DEC Alpha Unix
# Copyright (C) 2000-2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
LIBNAME = libpng12
@@ -205,10 +208,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.dj2 b/src/3rdparty/libpng/scripts/makefile.dj2
index 09045c2..28821a4 100644
--- a/src/3rdparty/libpng/scripts/makefile.dj2
+++ b/src/3rdparty/libpng/scripts/makefile.dj2
@@ -1,7 +1,10 @@
# DJGPP (DOS gcc) makefile for libpng
-# Copyright (C) 2002 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006, 2009 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# where make install will put libpng.a and png.h
#prefix=/usr/local
@@ -47,9 +50,9 @@ pngread.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.elf b/src/3rdparty/libpng/scripts/makefile.elf
index 1c1a8e9..126a9a1 100644
--- a/src/3rdparty/libpng/scripts/makefile.elf
+++ b/src/3rdparty/libpng/scripts/makefile.elf
@@ -1,7 +1,11 @@
# makefile for libpng.a and libpng12.so on Linux ELF with gcc
-# Copyright (C) 1998, 1999, 2002, 2006 Greg Roelofs and Glenn Randers-Pehrson
+# Copyright (C) 1998, 1999, 2002, 2006, 2008 Greg Roelofs
+# and Glenn Randers-Pehrson
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Modified for Debian by Junichi Uekawa and Josselin Mouette
# Major modifications are:
@@ -12,7 +16,7 @@
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -53,7 +57,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# for pgcc version 2.95.1, -O3 is buggy; don't use it.
-CFLAGS=-Wall -D_REENTRANT -O2 \
+CFLAGS=-W -Wall -D_REENTRANT -O2 \
$(ALIGN) # $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -lpng12
diff --git a/src/3rdparty/libpng/scripts/makefile.freebsd b/src/3rdparty/libpng/scripts/makefile.freebsd
index 59f3644..d9df1ee 100644
--- a/src/3rdparty/libpng/scripts/makefile.freebsd
+++ b/src/3rdparty/libpng/scripts/makefile.freebsd
@@ -1,6 +1,9 @@
# makefile for libpng under FreeBSD
-# Copyright (C) 2002, 2007 Glenn Randers-Pehrson and Andrey A. Chernov
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2002, 2007, 2009 Glenn Randers-Pehrson and Andrey A. Chernov
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
PREFIX?= /usr/local
SHLIB_VER?= 5
diff --git a/src/3rdparty/libpng/scripts/makefile.gcc b/src/3rdparty/libpng/scripts/makefile.gcc
index e899b10..d1fb867 100644
--- a/src/3rdparty/libpng/scripts/makefile.gcc
+++ b/src/3rdparty/libpng/scripts/makefile.gcc
@@ -1,7 +1,11 @@
# makefile for libpng using gcc (generic, static library)
+# Copyright (C) 2008 Glenn Randers-Pehrson
# Copyright (C) 2000 Cosmin Truta
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Location of the zlib library and include files
ZLIBINC = ../zlib
@@ -18,8 +22,8 @@ CDEBUG = -g -DPNG_DEBUG=5
LDDEBUG =
CRELEASE = -O2
LDRELEASE = -s
-#CFLAGS = -Wall $(CDEBUG)
-CFLAGS = -Wall $(CRELEASE)
+#CFLAGS = -W -Wall $(CDEBUG)
+CFLAGS = -W -Wall $(CRELEASE)
#LDFLAGS = $(LDDEBUG)
LDFLAGS = $(LDRELEASE)
LIBS = -lz -lm
@@ -30,9 +34,9 @@ A=.a
EXE=
# Variables
-OBJS = png$(O) pngerror$(O) pngget$(O) pngmem$(O) pngpread$(O) \
- pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) pngset$(O) \
- pngtrans$(O) pngwio$(O) pngwrite$(O) pngwtran$(O) pngwutil$(O)
+OBJS = png$(O) pngerror$(O) pngget$(O) pngmem$(O) pngpread$(O) \
+ pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) pngset$(O) \
+ pngtrans$(O) pngwio$(O) pngwrite$(O) pngwtran$(O) pngwutil$(O)
# Targets
all: static
@@ -60,20 +64,20 @@ pngtest$(EXE): pngtest$(O) libpng$(A)
clean:
$(RM_F) *$(O) libpng$(A) pngtest$(EXE) pngout.png
-png$(O): png.h pngconf.h
+png$(O): png.h pngconf.h
pngerror$(O): png.h pngconf.h
-pngget$(O): png.h pngconf.h
-pngmem$(O): png.h pngconf.h
+pngget$(O): png.h pngconf.h
+pngmem$(O): png.h pngconf.h
pngpread$(O): png.h pngconf.h
-pngread$(O): png.h pngconf.h
-pngrio$(O): png.h pngconf.h
+pngread$(O): png.h pngconf.h
+pngrio$(O): png.h pngconf.h
pngrtran$(O): png.h pngconf.h
pngrutil$(O): png.h pngconf.h
-pngset$(O): png.h pngconf.h
-pngtest$(O): png.h pngconf.h
+pngset$(O): png.h pngconf.h
pngtrans$(O): png.h pngconf.h
-pngwio$(O): png.h pngconf.h
+pngwio$(O): png.h pngconf.h
pngwrite$(O): png.h pngconf.h
pngwtran$(O): png.h pngconf.h
pngwutil$(O): png.h pngconf.h
+pngtest$(O): png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.gcmmx b/src/3rdparty/libpng/scripts/makefile.gcmmx
index f25d09f..b569e87 100644
--- a/src/3rdparty/libpng/scripts/makefile.gcmmx
+++ b/src/3rdparty/libpng/scripts/makefile.gcmmx
@@ -1,9 +1,12 @@
# makefile for libpng.a and libpng12.so on Linux ELF with gcc using MMX
# assembler code
-# Copyright 2002, 2006 Greg Roelofs and Glenn Randers-Pehrson
+# Copyright 2002, 2006, 2008 Greg Roelofs and Glenn Randers-Pehrson
# Copyright 1998-2001 Greg Roelofs
# Copyright 1996-1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# CAUTION: Do not use this makefile with gcc versions 2.7.2.2 and earlier.
@@ -14,7 +17,7 @@
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -58,17 +61,17 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# Remove -DPNG_THREAD_UNSAFE_OK if you need thread safety
### for generic gcc:
-CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -Wall -O \
+CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -W -Wall -O \
$(ALIGN) -funroll-loops \
-fomit-frame-pointer # $(WARNMORE) -g -DPNG_DEBUG=5
### for gcc 2.95.2 on 686:
-#CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -Wall -O \
+#CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -W -Wall -O \
# -mcpu=i686 -malign-double -ffast-math -fstrict-aliasing \
-# $(ALIGN) -funroll-loops -funroll-all-loops -fomit-frame-pointer
+# $(ALIGN) -funroll-loops -funroll-all-loops -fomit-frame-pointer
### for gcc 2.7.2.3 on 486 and up:
-#CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -Wall -O \
+#CFLAGS=-DPNG_THREAD_UNSAFE_OK -I$(ZLIBINC) -W -Wall -O \
# -m486 -malign-double -ffast-math \
-# $(ALIGN) -funroll-loops -funroll-all-loops -fomit-frame-pointer
+# $(ALIGN) -funroll-loops -funroll-all-loops -fomit-frame-pointer
LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng12 -lz -lm
LDFLAGS_A=-L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) libpng.a -lz -lm
diff --git a/src/3rdparty/libpng/scripts/makefile.hp64 b/src/3rdparty/libpng/scripts/makefile.hp64
index c8895e7..27f6c23 100644
--- a/src/3rdparty/libpng/scripts/makefile.hp64
+++ b/src/3rdparty/libpng/scripts/makefile.hp64
@@ -1,8 +1,11 @@
# makefile for libpng, HPUX (10.20 and 11.00) using the ANSI/C product.
-# Copyright (C) 1999-2002 Glenn Randers-Pehrson
+# Copyright (C) 1999-2002, 2006, 2009 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42
# contributed by Jim Rice and updated by Chris Schleicher, Hewlett Packard
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Where the zlib library and include files are located
ZLIBLIB=/opt/zlib/lib
@@ -18,7 +21,7 @@ ZLIBINC=/opt/zlib/include
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -227,9 +230,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.hpgcc b/src/3rdparty/libpng/scripts/makefile.hpgcc
index 785c1ed..dc05d5a 100644
--- a/src/3rdparty/libpng/scripts/makefile.hpgcc
+++ b/src/3rdparty/libpng/scripts/makefile.hpgcc
@@ -1,14 +1,17 @@
# makefile for libpng on HP-UX using GCC with the HP ANSI/C linker.
-# Copyright (C) 2002, 2006, 2007 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006-2008 Glenn Randers-Pehrson
# Copyright (C) 2001, Laurent faillie
# Copyright (C) 1998, 1999 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -53,7 +56,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# for pgcc version 2.95.1, -O3 is buggy; don't use it.
-CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
$(ALIGN) # $(WARNMORE) -g -DPNG_DEBUG=5
#LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng12 -lz -lm
LDFLAGS=-L. -L$(ZLIBLIB) -lpng12 -lz -lm
diff --git a/src/3rdparty/libpng/scripts/makefile.hpux b/src/3rdparty/libpng/scripts/makefile.hpux
index b0dfcdc..3160219 100644
--- a/src/3rdparty/libpng/scripts/makefile.hpux
+++ b/src/3rdparty/libpng/scripts/makefile.hpux
@@ -2,7 +2,10 @@
# Copyright (C) 1999-2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42
# contributed by Jim Rice and updated by Chris Schleicher, Hewlett Packard
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Where the zlib library and include files are located
ZLIBLIB=/opt/zlib/lib
@@ -18,7 +21,7 @@ ZLIBINC=/opt/zlib/include
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -224,9 +227,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.ibmc b/src/3rdparty/libpng/scripts/makefile.ibmc
index f09a62c..35d7f56 100644
--- a/src/3rdparty/libpng/scripts/makefile.ibmc
+++ b/src/3rdparty/libpng/scripts/makefile.ibmc
@@ -1,7 +1,12 @@
# Makefile for libpng (static)
# IBM C version 3.x for Win32 and OS/2
+# Copyright (C) 2006 Glenn Randers-Pehrson
# Copyright (C) 2000 Cosmin Truta
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
# Notes:
# Derived from makefile.std
# All modules are compiled in C mode
@@ -53,19 +58,20 @@ clean:
$(RM) pngtest$(E)
$(RM) pngout.png
-png$(O): png.h pngconf.h
+png$(O): png.h pngconf.h
pngerror$(O): png.h pngconf.h
-pngget$(O): png.h pngconf.h
-pngmem$(O): png.h pngconf.h
+pngget$(O): png.h pngconf.h
+pngmem$(O): png.h pngconf.h
pngpread$(O): png.h pngconf.h
-pngread$(O): png.h pngconf.h
-pngrio$(O): png.h pngconf.h
+pngread$(O): png.h pngconf.h
+pngrio$(O): png.h pngconf.h
pngrtran$(O): png.h pngconf.h
pngrutil$(O): png.h pngconf.h
-pngset$(O): png.h pngconf.h
-pngtest$(O): png.h pngconf.h
+pngset$(O): png.h pngconf.h
pngtrans$(O): png.h pngconf.h
-pngwio$(O): png.h pngconf.h
+pngwio$(O): png.h pngconf.h
pngwrite$(O): png.h pngconf.h
pngwtran$(O): png.h pngconf.h
pngwutil$(O): png.h pngconf.h
+
+pngtest$(O): png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.intel b/src/3rdparty/libpng/scripts/makefile.intel
index b0b523a..88a2957 100644
--- a/src/3rdparty/libpng/scripts/makefile.intel
+++ b/src/3rdparty/libpng/scripts/makefile.intel
@@ -1,12 +1,17 @@
# Makefile for libpng
# Microsoft Visual C++ with Intel C/C++ Compiler 4.0 and later
+# Copyright (C) 2006 Glenn Randers-Pehrson
# Copyright (C) 2000, Pawel Mrochen, based on makefile.msc which is
# copyright 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# To use, do "nmake /f scripts\makefile.intel"
+# ------------------- Intel C/C++ Compiler 4.0 and later -------------------
# Where the zlib library and include files are located
ZLIBLIB=..\zlib
@@ -26,7 +31,6 @@ CALLING=r # __fastcall
# --------------------------------------------------------------------------
-
CC=icl -c
CFLAGS=-O2 -G$(CPU)$(CALLING) -Qip -Qunroll4 -I$(ZLIBINC) -nologo
LD=link
@@ -73,9 +77,6 @@ pngrio$(O): png.h pngconf.h
pngwio$(O): png.h pngconf.h
$(CC) $(CFLAGS) $*.c $(ERRFILE)
-pngtest$(O): png.h pngconf.h
- $(CC) $(CFLAGS) $*.c $(ERRFILE)
-
pngtrans$(O): png.h pngconf.h
$(CC) $(CFLAGS) $*.c $(ERRFILE)
@@ -95,6 +96,9 @@ libpng.lib: $(OBJS)
pngtest.exe: pngtest.obj libpng.lib
$(LD) $(LDFLAGS) /OUT:pngtest.exe pngtest.obj libpng.lib $(ZLIBLIB)\zlib.lib
+pngtest$(O): png.h pngconf.h
+ $(CC) $(CFLAGS) $*.c $(ERRFILE)
+
test: pngtest.exe
pngtest.exe
diff --git a/src/3rdparty/libpng/scripts/makefile.knr b/src/3rdparty/libpng/scripts/makefile.knr
index 44ee538..7b46585 100644
--- a/src/3rdparty/libpng/scripts/makefile.knr
+++ b/src/3rdparty/libpng/scripts/makefile.knr
@@ -1,7 +1,10 @@
# makefile for libpng
-# Copyright (C) 2002 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006, 2009 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# This makefile requires the file ansi2knr.c, which you can get
# from the Ghostscript ftp site at ftp://ftp.cs.wisc.edu/ghost/
@@ -58,7 +61,7 @@ pngtest: pngtest.o libpng.a
test: pngtest
./pngtest
-install: libpng.a
+install: libpng.a png.h pngconf.h
-@mkdir $(DESTDIR)$(INCPATH)
-@mkdir $(DESTDIR)$(INCPATH)/libpng
-@mkdir $(DESTDIR)$(LIBPATH)
@@ -92,8 +95,9 @@ pngread.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
+
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.linux b/src/3rdparty/libpng/scripts/makefile.linux
index b07c58f..ba60a21 100644
--- a/src/3rdparty/libpng/scripts/makefile.linux
+++ b/src/3rdparty/libpng/scripts/makefile.linux
@@ -1,12 +1,16 @@
# makefile for libpng.a and libpng12.so on Linux ELF with gcc
-# Copyright (C) 1998, 1999, 2002, 2006 Greg Roelofs and Glenn Randers-Pehrson
+# Copyright (C) 1998, 1999, 2002, 2006, 2008 Greg Roelofs and
+# Glenn Randers-Pehrson
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -47,7 +51,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# for pgcc version 2.95.1, -O3 is buggy; don't use it.
-CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
$(ALIGN) # $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng12 -lz -lm
@@ -73,7 +77,7 @@ DI=$(DESTDIR)$(INCPATH)
DL=$(DESTDIR)$(LIBPATH)
DM=$(DESTDIR)$(MANPATH)
-OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
+OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
pngwtran.o pngmem.o pngerror.o pngpread.o
diff --git a/src/3rdparty/libpng/scripts/makefile.mingw b/src/3rdparty/libpng/scripts/makefile.mingw
index 6df86e8..50c52ea 100644
--- a/src/3rdparty/libpng/scripts/makefile.mingw
+++ b/src/3rdparty/libpng/scripts/makefile.mingw
@@ -3,13 +3,16 @@
# of the library, and builds two copies of pngtest: one
# statically linked and one dynamically linked.
#
-# Built from makefile.cygwin
-# Copyright (C) 2002, 2006 Soren Anderson, Charles Wilson,
+# Copyright (C) 2002, 2006, 2008 Soren Anderson, Charles Wilson,
# and Glenn Randers-Pehrson, based on makefile for linux-elf w/mmx by:
# Copyright (C) 1998-2000, 2007 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
+# Built from makefile.cygwin
# This makefile intends to support building outside the src directory
# if desired. When invoking it, specify an argument to SRCDIR on the
@@ -60,21 +63,21 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
### if you don't need thread safety, but want the asm accel
#CFLAGS= $(strip $(MINGW_CCFLAGS) -DPNG_THREAD_UNSAFE_OK \
-# $(addprefix -I,$(ZLIBINC)) -Wall -O $(ALIGN) -funroll-loops \
+# $(addprefix -I,$(ZLIBINC)) -W -Wall -O $(ALIGN) -funroll-loops \
# -fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
### if you need thread safety and want (minimal) asm accel
#CFLAGS= $(strip $(MINGW_CCFLAGS) $(addprefix -I,$(ZLIBINC)) \
-# -Wall -O $(ALIGN) -funroll-loops \
+# -W -Wall -O $(ALIGN) -funroll-loops \
# -fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
### Normal (non-asm) compilation
CFLAGS= $(strip $(MINGW_CCFLAGS) $(addprefix -I,$(ZLIBINC)) \
- -Wall -O3 $(ALIGN) -funroll-loops -DPNG_NO_MMX_CODE \
+ -W -Wall -O3 $(ALIGN) -funroll-loops -DPNG_NO_MMX_CODE \
-fomit-frame-pointer) # $(WARNMORE) -g -DPNG_DEBUG=5
LIBNAME = libpng12
PNGMAJ = 0
MINGDLL = 12
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
SHAREDLIB=libpng$(MINGDLL).dll
@@ -284,6 +287,3 @@ pngwutil.o pngwutil.pic.o: png.h pngconf.h pngwutil.c
pngpread.o pngpread.pic.o: png.h pngconf.h pngpread.c
pngtest.o pngtest.pic.o: png.h pngconf.h pngtest.c
-
-
-
diff --git a/src/3rdparty/libpng/scripts/makefile.mips b/src/3rdparty/libpng/scripts/makefile.mips
index f1a557d..0e7484f 100644
--- a/src/3rdparty/libpng/scripts/makefile.mips
+++ b/src/3rdparty/libpng/scripts/makefile.mips
@@ -1,7 +1,10 @@
# makefile for libpng
# Copyright (C) Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# where make install puts libpng.a and png.h
prefix=/usr/local
@@ -76,8 +79,9 @@ pngread.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
+
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.msc b/src/3rdparty/libpng/scripts/makefile.msc
index 1cbfd91..ab95ff8 100644
--- a/src/3rdparty/libpng/scripts/makefile.msc
+++ b/src/3rdparty/libpng/scripts/makefile.msc
@@ -1,6 +1,11 @@
# makefile for libpng
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2006, 2009 Glenn Randers-Pehrson
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
# Assumes that zlib.lib, zconf.h, and zlib.h have been copied to ..\zlib
# -------- Microsoft C 5.1 and later, does not use assembler code --------
@@ -55,9 +60,6 @@ pngrio$(O): png.h pngconf.h
pngwio$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-pngtest$(O): png.h pngconf.h
- $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-
pngtrans$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
@@ -76,6 +78,9 @@ libpng.lib: $(OBJS1) $(OBJS2) $(OBJS3)
lib libpng $(OBJS2);
lib libpng $(OBJS3);
+pngtest$(O): png.h pngconf.h
+ $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
+
pngtest.exe: pngtest.obj libpng.lib
$(LD) $(LDFLAGS) pngtest.obj,,,libpng.lib ..\zlib\zlib.lib ;
diff --git a/src/3rdparty/libpng/scripts/makefile.ne12bsd b/src/3rdparty/libpng/scripts/makefile.ne12bsd
index 4037c55..7457cbb 100644
--- a/src/3rdparty/libpng/scripts/makefile.ne12bsd
+++ b/src/3rdparty/libpng/scripts/makefile.ne12bsd
@@ -2,8 +2,11 @@
# make obj && make depend && make && make test
# make includes && make install
# Copyright (C) 2002 Patrick R.L. Welche
-# Copyright (C) 2007 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2007, 2009 Glenn Randers-Pehrson
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# You should also run makefile.netbsd
@@ -14,7 +17,7 @@ INCSDIR=${LOCALBASE}/include/libpng12
LIB= png12
SHLIB_MAJOR= 0
-SHLIB_MINOR= 1.2.29
+SHLIB_MINOR= 1.2.40
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
pngwtran.c pngmem.c pngerror.c pngpread.c
@@ -23,7 +26,8 @@ MAN= libpng.3 libpngpf.3 png.5
CPPFLAGS+=-I${.CURDIR}
-# something like this for mmx assembler, but it core dumps for me at the moment
+# We should be able to do something like this instead of the manual
+# uncommenting, but it core dumps for me at the moment:
# .if ${MACHINE_ARCH} == "i386"
# CPPFLAGS+=-DPNG_THREAD_UNSAFE_OK
# MKLINT= no
diff --git a/src/3rdparty/libpng/scripts/makefile.netbsd b/src/3rdparty/libpng/scripts/makefile.netbsd
index d12ecad..b334bfd 100644
--- a/src/3rdparty/libpng/scripts/makefile.netbsd
+++ b/src/3rdparty/libpng/scripts/makefile.netbsd
@@ -2,8 +2,11 @@
# make obj && make depend && make && make test
# make includes && make install
# Copyright (C) 2002 Patrick R.L. Welche
-# Copyright (C) 2007 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2007, 2009 Glenn Randers-Pehrson
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# You should also run makefile.ne0bsd
@@ -14,7 +17,7 @@ INCSDIR=${LOCALBASE}/include/libpng
LIB= png
SHLIB_MAJOR= 3
-SHLIB_MINOR= 1.2.29
+SHLIB_MINOR= 1.2.40
SRCS= png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \
pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \
pngwtran.c pngmem.c pngerror.c pngpread.c
@@ -23,7 +26,8 @@ MAN= libpng.3 libpngpf.3 png.5
CPPFLAGS+=-I${.CURDIR}
-# something like this for mmx assembler, but it core dumps for me at the moment
+# We should be able to do something like this instead of the manual
+# uncommenting, but it core dumps for me at the moment:
# .if ${MACHINE_ARCH} == "i386"
# CPPFLAGS+=-DPNG_THREAD_UNSAFE_OK
# MKLINT= no
diff --git a/src/3rdparty/libpng/scripts/makefile.nommx b/src/3rdparty/libpng/scripts/makefile.nommx
index 1958ceb..e2297d8 100644
--- a/src/3rdparty/libpng/scripts/makefile.nommx
+++ b/src/3rdparty/libpng/scripts/makefile.nommx
@@ -1,13 +1,16 @@
# makefile for libpng.a and libpng12.so on Linux ELF with gcc
-# Copyright (C) 1998, 1999, 2002, 2006, 2007 Greg Roelofs and
+# Copyright (C) 1998, 1999, 2002, 2006-2008 Greg Roelofs and
# Glenn Randers-Pehrson
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -48,7 +51,7 @@ WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
# for pgcc version 2.95.1, -O3 is buggy; don't use it.
-CFLAGS=-I$(ZLIBINC) -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O3 -funroll-loops -DPNG_NO_MMX_CODE \
$(ALIGN) # $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -Wl,-rpath,. -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) -lpng12 -lz -lm
@@ -233,20 +236,20 @@ writelock:
# DO NOT DELETE THIS LINE -- make depend depends on it.
-png.o png.pic.o: png.h pngconf.h
-pngerror.o pngerror.pic.o: png.h pngconf.h
-pngrio.o pngrio.pic.o: png.h pngconf.h
-pngwio.o pngwio.pic.o: png.h pngconf.h
-pngmem.o pngmem.pic.o: png.h pngconf.h
-pngset.o pngset.pic.o: png.h pngconf.h
-pngget.o pngget.pic.o: png.h pngconf.h
-pngread.o pngread.pic.o: png.h pngconf.h
-pngrtran.o pngrtran.pic.o: png.h pngconf.h
-pngrutil.o pngrutil.pic.o: png.h pngconf.h
-pngtrans.o pngtrans.pic.o: png.h pngconf.h
-pngwrite.o pngwrite.pic.o: png.h pngconf.h
-pngwtran.o pngwtran.pic.o: png.h pngconf.h
-pngwutil.o pngwutil.pic.o: png.h pngconf.h
-pngpread.o pngpread.pic.o: png.h pngconf.h
-
-pngtest.o: png.h pngconf.h
+png.o png.pic.o: png.h pngconf.h png.c
+pngerror.o pngerror.pic.o: png.h pngconf.h pngerror.c
+pngrio.o pngrio.pic.o: png.h pngconf.h pngrio.c
+pngwio.o pngwio.pic.o: png.h pngconf.h pngwio.c
+pngmem.o pngmem.pic.o: png.h pngconf.h pngmem.c
+pngset.o pngset.pic.o: png.h pngconf.h pngset.c
+pngget.o pngget.pic.o: png.h pngconf.h pngget.c
+pngread.o pngread.pic.o: png.h pngconf.h pngread.c
+pngrtran.o pngrtran.pic.o: png.h pngconf.h pngrtran.c
+pngrutil.o pngrutil.pic.o: png.h pngconf.h pngrutil.c
+pngtrans.o pngtrans.pic.o: png.h pngconf.h pngtrans.c
+pngwrite.o pngwrite.pic.o: png.h pngconf.h pngwrite.c
+pngwtran.o pngwtran.pic.o: png.h pngconf.h pngwtran.c
+pngwutil.o pngwutil.pic.o: png.h pngconf.h pngwutil.c
+pngpread.o pngpread.pic.o: png.h pngconf.h pngpread.c
+
+pngtest.o: png.h pngconf.h pngtest.c
diff --git a/src/3rdparty/libpng/scripts/makefile.openbsd b/src/3rdparty/libpng/scripts/makefile.openbsd
index 7c2f107..533c6b8 100644
--- a/src/3rdparty/libpng/scripts/makefile.openbsd
+++ b/src/3rdparty/libpng/scripts/makefile.openbsd
@@ -1,14 +1,17 @@
# makefile for libpng
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# Copyright (C) 2007 Glenn Randers-Pehrson
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2007-2008 Glenn Randers-Pehrson
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
PREFIX?= /usr/local
LIBDIR= ${PREFIX}/lib
MANDIR= ${PREFIX}/man/cat
SHLIB_MAJOR= 0
-SHLIB_MINOR= 1.2.29
+SHLIB_MINOR= 1.2.40
LIB= png
SRCS= png.c pngerror.c pngget.c pngmem.c pngpread.c \
@@ -17,8 +20,8 @@ SRCS= png.c pngerror.c pngget.c pngmem.c pngpread.c \
HDRS= png.h pngconf.h
-CFLAGS+= -Wall
-CPPFLAGS+= -I${.CURDIR} -DPNG_NO_MMX_CODE
+CFLAGS+= -W -Wall
+CPPFLAGS+= -I${.CURDIR} -DPNG_NO_MMX_CODE
NOPROFILE= Yes
diff --git a/src/3rdparty/libpng/scripts/makefile.os2 b/src/3rdparty/libpng/scripts/makefile.os2
index 588067d..2df76ad 100644
--- a/src/3rdparty/libpng/scripts/makefile.os2
+++ b/src/3rdparty/libpng/scripts/makefile.os2
@@ -1,5 +1,8 @@
# makefile for libpng on OS/2 with gcc
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Related files: pngos2.def
@@ -12,7 +15,7 @@ ZLIBINC=../zlib
WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
-Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes #-Wconversion
-CFLAGS=-I$(ZLIBINC) -Wall -O6 -funroll-loops -malign-loops=2 \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O6 -funroll-loops -malign-loops=2 \
-malign-functions=2 #$(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lzdll -Zcrtdll
AR=emxomfar
diff --git a/src/3rdparty/libpng/scripts/makefile.sco b/src/3rdparty/libpng/scripts/makefile.sco
index ac62735..186f79d 100644
--- a/src/3rdparty/libpng/scripts/makefile.sco
+++ b/src/3rdparty/libpng/scripts/makefile.sco
@@ -4,12 +4,15 @@
# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1998 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
diff --git a/src/3rdparty/libpng/scripts/makefile.sggcc b/src/3rdparty/libpng/scripts/makefile.sggcc
index 810f1df..3b5f7f2 100644
--- a/src/3rdparty/libpng/scripts/makefile.sggcc
+++ b/src/3rdparty/libpng/scripts/makefile.sggcc
@@ -1,12 +1,15 @@
# makefile for libpng.a and libpng12.so, SGI IRIX with 'cc'
# Copyright (C) 2001-2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -212,10 +215,8 @@ test-installed:
./pngtesti pngtest.png
clean:
- $(RM_F) libpng.a pngtest pngtesti pngout.png libpng.pc libpng-config \
- $(LIBSO) $(LIBSOMAJ)* \
- $(OLDSOVER) \
- so_locations
+ $(RM_F) libpng.a pngtest pngtesti pngout.png libpng.pc \
+ so_locations libpng-config $(LIBSO) $(LIBSOMAJ)* $(OLDSOVER)
DOCS = ANNOUNCE CHANGES INSTALL KNOWNBUG LICENSE README TODO Y2KINFO
writelock:
@@ -233,10 +234,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.sgi b/src/3rdparty/libpng/scripts/makefile.sgi
index 7892bdf..cb48d8f 100644
--- a/src/3rdparty/libpng/scripts/makefile.sgi
+++ b/src/3rdparty/libpng/scripts/makefile.sgi
@@ -1,12 +1,15 @@
# makefile for libpng.a and libpng12.so, SGI IRIX with 'cc'
# Copyright (C) 2001-2002, 2006, 2007 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME=libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -236,10 +239,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.so9 b/src/3rdparty/libpng/scripts/makefile.so9
index 8391ba5..d182f4d 100644
--- a/src/3rdparty/libpng/scripts/makefile.so9
+++ b/src/3rdparty/libpng/scripts/makefile.so9
@@ -1,14 +1,17 @@
# makefile for libpng on Solaris 9 (beta) with Forte cc
# Updated by Chad Schrock for Solaris 9
# Contributed by William L. Sebok, based on makefile.linux
-# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
+# Copyright (C) 2002, 2006, 2008 Glenn Randers-Pehrson
# Copyright (C) 1998-2001 Greg Roelofs
# Copyright (C) 1996-1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
LIBNAME = libpng12
@@ -47,7 +50,7 @@ ZLIBINC=/usr/include
#WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
-Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes #-Wconversion
-#CFLAGS=-I$(ZLIBINC) -Wall -O3 $(WARNMORE) -g -DPNG_DEBUG=5 -DPNG_NO_MMX_CODE
+#CFLAGS=-I$(ZLIBINC) -W -Wall -O3 $(WARNMORE) -g -DPNG_DEBUG=5 -DPNG_NO_MMX_CODE
CFLAGS=-I$(ZLIBINC) -O3 -DPNG_NO_MMX_CODE
LDFLAGS=-L. -R. -L$(ZLIBLIB) -R$(ZLIBLIB) -lpng12 -lz -lm
diff --git a/src/3rdparty/libpng/scripts/makefile.solaris b/src/3rdparty/libpng/scripts/makefile.solaris
index 920cd34..65c1c08 100644
--- a/src/3rdparty/libpng/scripts/makefile.solaris
+++ b/src/3rdparty/libpng/scripts/makefile.solaris
@@ -1,14 +1,17 @@
# makefile for libpng on Solaris 2.x with gcc
-# Copyright (C) 2004, 2006, 2007 Glenn Randers-Pehrson
+# Copyright (C) 2004, 2006-2008 Glenn Randers-Pehrson
# Contributed by William L. Sebok, based on makefile.linux
# Copyright (C) 1998 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -43,8 +46,7 @@ ZLIBINC=/usr/local/include
WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
-Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes #-Wconversion
-CFLAGS=-I$(ZLIBINC) -Wall -O \
- -DPNG_NO_MMX_CODE; \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O -DPNG_NO_MMX_CODE; \
# $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -R. -L$(ZLIBLIB) -R$(ZLIBLIB) -lpng12 -lz -lm
diff --git a/src/3rdparty/libpng/scripts/makefile.solaris-x86 b/src/3rdparty/libpng/scripts/makefile.solaris-x86
index 03c1de4..581916e 100644
--- a/src/3rdparty/libpng/scripts/makefile.solaris-x86
+++ b/src/3rdparty/libpng/scripts/makefile.solaris-x86
@@ -1,14 +1,17 @@
# makefile for libpng on Solaris 2.x with gcc
-# Copyright (C) 2004, 2006, 2007 Glenn Randers-Pehrson
+# Copyright (C) 2004, 2006-2008 Glenn Randers-Pehrson
# Contributed by William L. Sebok, based on makefile.linux
# Copyright (C) 1998 Greg Roelofs
# Copyright (C) 1996, 1997 Andreas Dilger
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# Library name:
LIBNAME = libpng12
PNGMAJ = 0
-PNGMIN = 1.2.29
+PNGMIN = 1.2.40
PNGVER = $(PNGMAJ).$(PNGMIN)
# Shared library names:
@@ -43,7 +46,7 @@ ZLIBINC=/usr/local/include
WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \
-Wmissing-declarations -Wtraditional -Wcast-align \
-Wstrict-prototypes -Wmissing-prototypes #-Wconversion
-CFLAGS=-I$(ZLIBINC) -Wall -O \
+CFLAGS=-I$(ZLIBINC) -W -Wall -O \
# $(WARNMORE) -g -DPNG_DEBUG=5
LDFLAGS=-L. -R. -L$(ZLIBLIB) -R$(ZLIBLIB) -lpng12 -lz -lm
diff --git a/src/3rdparty/libpng/scripts/makefile.std b/src/3rdparty/libpng/scripts/makefile.std
index 9b1925d..bb5268a 100644
--- a/src/3rdparty/libpng/scripts/makefile.std
+++ b/src/3rdparty/libpng/scripts/makefile.std
@@ -1,7 +1,10 @@
# makefile for libpng
# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# where make install puts libpng.a and png.h
prefix=/usr/local
@@ -83,10 +86,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.sunos b/src/3rdparty/libpng/scripts/makefile.sunos
index ff19591..31dff77 100644
--- a/src/3rdparty/libpng/scripts/makefile.sunos
+++ b/src/3rdparty/libpng/scripts/makefile.sunos
@@ -1,7 +1,10 @@
# makefile for libpng
# Copyright (C) 2002, 2006 Glenn Randers-Pehrson
# Copyright (C) 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# where make install puts libpng.a and png.h
prefix=/usr/local
@@ -88,10 +91,10 @@ pngget.o: png.h pngconf.h
pngread.o: png.h pngconf.h
pngrtran.o: png.h pngconf.h
pngrutil.o: png.h pngconf.h
-pngtest.o: png.h pngconf.h
pngtrans.o: png.h pngconf.h
pngwrite.o: png.h pngconf.h
pngwtran.o: png.h pngconf.h
pngwutil.o: png.h pngconf.h
pngpread.o: png.h pngconf.h
+pngtest.o: png.h pngconf.h
diff --git a/src/3rdparty/libpng/scripts/makefile.vcawin32 b/src/3rdparty/libpng/scripts/makefile.vcawin32
index 99f5430..0b89d84 100644
--- a/src/3rdparty/libpng/scripts/makefile.vcawin32
+++ b/src/3rdparty/libpng/scripts/makefile.vcawin32
@@ -1,17 +1,22 @@
# makefile for libpng
+# Copyright (C) 2006,2009 Glenn Randers-Pehrson
# Copyright (C) 1998 Tim Wegner
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
# Assumes that zlib.lib, zconf.h, and zlib.h have been copied to ..\zlib
# To use, do "nmake /f scripts\makefile.vcawin32"
-# -------- Microsoft Visual C++ 5.0 and later, uses assembler code --------
+# -------- Microsoft Visual C++ 2.0 and later, no assembler code --------
# If you don't want to use assembler (MMX) code, use makefile.vcwin32 instead.
# Compiler, linker, librarian, and other tools
CC = cl
LD = link
AR = lib
-CFLAGS = -DPNG_USE_PNGVCRD -nologo -MD -O2 -W3 -I..\zlib
+CFLAGS = -nologo -DPNG_USE_PNGVCRD -MD -O2 -W3 -I..\zlib
LDFLAGS = -nologo
ARFLAGS = -nologo
RM = del
@@ -64,9 +69,6 @@ pngrio$(O): png.h pngconf.h
pngwio$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-pngtest$(O): png.h pngconf.h
- $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-
pngtrans$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
@@ -83,6 +85,9 @@ libpng.lib: $(OBJS)
-$(RM) $@
$(AR) $(ARFLAGS) -out:$@ $(OBJS) $(ERRFILE)
+pngtest$(O): png.h pngconf.h
+ $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
+
pngtest.exe: pngtest$(O) libpng.lib
$(LD) $(LDFLAGS) -out:$@ pngtest$(O) libpng.lib ..\zlib\zlib.lib $(ERRFILE)
diff --git a/src/3rdparty/libpng/scripts/makefile.vcwin32 b/src/3rdparty/libpng/scripts/makefile.vcwin32
index fc6ece6..8cd806a 100644
--- a/src/3rdparty/libpng/scripts/makefile.vcwin32
+++ b/src/3rdparty/libpng/scripts/makefile.vcwin32
@@ -1,6 +1,11 @@
# makefile for libpng
# Copyright (C) 1998 Tim Wegner
-# For conditions of distribution and use, see copyright notice in png.h
+# Copyright (C) 2006,2009 Glenn Randers-Pehrson
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
+
# Assumes that zlib.lib, zconf.h, and zlib.h have been copied to ..\zlib
# To use, do "nmake /f scripts\makefile.vcwin32"
@@ -64,9 +69,6 @@ pngrio$(O): png.h pngconf.h
pngwio$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-pngtest$(O): png.h pngconf.h
- $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
-
pngtrans$(O): png.h pngconf.h
$(CC) -c $(CFLAGS) $*.c $(ERRFILE)
@@ -83,6 +85,9 @@ libpng.lib: $(OBJS)
-$(RM) $@
$(AR) $(ARFLAGS) -out:$@ $(OBJS) $(ERRFILE)
+pngtest$(O): png.h pngconf.h
+ $(CC) -c $(CFLAGS) $*.c $(ERRFILE)
+
pngtest.exe: pngtest$(O) libpng.lib
$(LD) $(LDFLAGS) -out:$@ pngtest$(O) libpng.lib ..\zlib\zlib.lib $(ERRFILE)
diff --git a/src/3rdparty/libpng/scripts/makefile.watcom b/src/3rdparty/libpng/scripts/makefile.watcom
index 5e860fc..bbfeeeb 100644
--- a/src/3rdparty/libpng/scripts/makefile.watcom
+++ b/src/3rdparty/libpng/scripts/makefile.watcom
@@ -3,7 +3,10 @@
# Copyright (C) 2000, Pawel Mrochen, based on makefile.msc which is
# copyright 1995 Guy Eric Schalnat, Group 42, Inc.
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
# To use, do "wmake /f scripts\makefile.watcom"
diff --git a/src/3rdparty/libpng/scripts/makevms.com b/src/3rdparty/libpng/scripts/makevms.com
index b9e3895..36d1190 100644
--- a/src/3rdparty/libpng/scripts/makevms.com
+++ b/src/3rdparty/libpng/scripts/makevms.com
@@ -55,8 +55,6 @@ $ then
$ dele pngtest.obj;*
$ CALL MAKE png.OBJ "cc ''CCOPT' png" -
png.c png.h pngconf.h
-$ CALL MAKE pngpread.OBJ "cc ''CCOPT' pngpread" -
- pngpread.c png.h pngconf.h
$ CALL MAKE pngset.OBJ "cc ''CCOPT' pngset" -
pngset.c png.h pngconf.h
$ CALL MAKE pngget.OBJ "cc ''CCOPT' pngget" -
@@ -64,7 +62,7 @@ $ CALL MAKE pngget.OBJ "cc ''CCOPT' pngget" -
$ CALL MAKE pngread.OBJ "cc ''CCOPT' pngread" -
pngread.c png.h pngconf.h
$ CALL MAKE pngpread.OBJ "cc ''CCOPT' pngpread" -
- pngpread.c png.h pngconf.h
+ pngpread.c png.h pngconf.h
$ CALL MAKE pngrtran.OBJ "cc ''CCOPT' pngrtran" -
pngrtran.c png.h pngconf.h
$ CALL MAKE pngrutil.OBJ "cc ''CCOPT' pngrutil" -
diff --git a/src/3rdparty/libpng/scripts/pngos2.def b/src/3rdparty/libpng/scripts/pngos2.def
index 8ba7b41..0f371c8 100644
--- a/src/3rdparty/libpng/scripts/pngos2.def
+++ b/src/3rdparty/libpng/scripts/pngos2.def
@@ -2,7 +2,7 @@
; PNG.LIB module definition file for OS/2
;----------------------------------------
-; Version 1.2.29
+; Version 1.2.40
LIBRARY PNG
DESCRIPTION "PNG image compression library for OS/2"
diff --git a/src/3rdparty/libpng/scripts/pngw32.def b/src/3rdparty/libpng/scripts/pngw32.def
index 3ea55e6..e455018 100644
--- a/src/3rdparty/libpng/scripts/pngw32.def
+++ b/src/3rdparty/libpng/scripts/pngw32.def
@@ -5,7 +5,7 @@
LIBRARY
EXPORTS
-;Version 1.2.29
+;Version 1.2.40
png_build_grayscale_palette @1
png_check_sig @2
png_chunk_error @3
@@ -189,6 +189,7 @@ EXPORTS
; Added at version 1.0.12
; For compatibility with 1.0.7-1.0.11
; png_info_init @174
+; png_read_init_3, png_info_init_3, and png_write_init_3 are deprecated.
png_read_init_3 @175
png_write_init_3 @176
png_info_init_3 @177
diff --git a/src/3rdparty/libpng/scripts/smakefile.ppc b/src/3rdparty/libpng/scripts/smakefile.ppc
index e5c0278..91df6c1 100644
--- a/src/3rdparty/libpng/scripts/smakefile.ppc
+++ b/src/3rdparty/libpng/scripts/smakefile.ppc
@@ -1,7 +1,10 @@
# Amiga powerUP (TM) Makefile
# makefile for libpng and SAS C V6.58/7.00 PPC compiler
# Copyright (C) 1998 by Andreas R. Kleinert
-# For conditions of distribution and use, see copyright notice in png.h
+
+# This code is released under the libpng license.
+# For conditions of distribution and use, see the disclaimer
+# and license in png.h
CC = scppc
CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL IDIR /zlib \
diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
index 2fdb092..af2c31e 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
@@ -376,20 +376,20 @@ void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
setState(newState);
if (
- LoadingState == oldPhononState
- and StoppedState == newPhononState
- ) {
- // Ensure initial volume is set on MMF API before starting playback
- doVolumeChanged();
-
- // Check whether play() was called while clip was being loaded. If so,
- // playback should be started now
- if (m_playPending) {
- TRACE_0("play was called while loading; starting playback now");
- m_playPending = false;
- play();
- }
- }
+ LoadingState == oldPhononState
+ and StoppedState == newPhononState
+ ) {
+ // Ensure initial volume is set on MMF API before starting playback
+ doVolumeChanged();
+
+ // Check whether play() was called while clip was being loaded. If so,
+ // playback should be started now
+ if (m_playPending) {
+ TRACE_0("play was called while loading; starting playback now");
+ m_playPending = false;
+ play();
+ }
+ }
TRACE_EXIT_0();
}
@@ -400,7 +400,7 @@ void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
void MMF::AbstractMediaPlayer::tick()
{
- // For the MWC compiler, we need to qualify the base class.
+ // For the MWC compiler, we need to qualify the base class.
emit MMF::AbstractPlayer::tick(currentTime());
}
diff --git a/src/3rdparty/phonon/mmf/abstractplayer.h b/src/3rdparty/phonon/mmf/abstractplayer.h
index ec39ab1..08558cf 100644
--- a/src/3rdparty/phonon/mmf/abstractplayer.h
+++ b/src/3rdparty/phonon/mmf/abstractplayer.h
@@ -87,7 +87,7 @@ public:
// VolumeObserver
virtual void volumeChanged(qreal volume);
-
+
void setVideoOutput(VideoOutput* videoOutput);
/**
@@ -146,9 +146,9 @@ private:
protected:
// Not owned
VideoOutput* m_videoOutput;
-
+
qreal m_volume;
-
+
private:
PrivateState m_state;
Phonon::ErrorType m_error;
diff --git a/src/3rdparty/phonon/mmf/audiooutput.cpp b/src/3rdparty/phonon/mmf/audiooutput.cpp
index 5a00f60..82af9f1 100644
--- a/src/3rdparty/phonon/mmf/audiooutput.cpp
+++ b/src/3rdparty/phonon/mmf/audiooutput.cpp
@@ -102,15 +102,15 @@ bool MMF::AudioOutput::activateOnMediaObject(MediaObject *mo)
QHash<QByteArray, QVariant> MMF::AudioOutput::audioOutputDescription(int index)
{
- if (index == AudioOutputDeviceID) {
- QHash<QByteArray, QVariant> retval;
+ QHash<QByteArray, QVariant> retval;
+ if (index == AudioOutputDeviceID) {
retval.insert("name", QCoreApplication::translate("Phonon::MMF", "Audio Output"));
retval.insert("description", QCoreApplication::translate("Phonon::MMF", "The audio output device"));
retval.insert("available", true);
-
- return retval;
}
+
+ return retval;
}
QT_END_NAMESPACE
diff --git a/src/3rdparty/phonon/mmf/audioplayer.cpp b/src/3rdparty/phonon/mmf/audioplayer.cpp
index ceaf305..1d259a8 100644
--- a/src/3rdparty/phonon/mmf/audioplayer.cpp
+++ b/src/3rdparty/phonon/mmf/audioplayer.cpp
@@ -213,8 +213,8 @@ void MMF::AudioPlayer::MapcPlayComplete(TInt aError)
}
/*
- if(aError == KErrNone) {
- if(m_nextSource.type() == MediaSource::Empty) {
+ if (aError == KErrNone) {
+ if (m_nextSource.type() == MediaSource::Empty) {
emit finished();
} else {
setSource(m_nextSource);
diff --git a/src/3rdparty/phonon/mmf/mediaobject.cpp b/src/3rdparty/phonon/mmf/mediaobject.cpp
index 76db5cb..29ac2df 100644
--- a/src/3rdparty/phonon/mmf/mediaobject.cpp
+++ b/src/3rdparty/phonon/mmf/mediaobject.cpp
@@ -112,7 +112,7 @@ MMF::MediaType MMF::MediaObject::fileMediaType
MediaType result = MediaTypeUnknown;
if (openRecognizer()) {
-
+
const QHBufC fileNameSymbian(QDir::toNativeSeparators(fileName));
m_file.Close();
diff --git a/src/3rdparty/phonon/mmf/mmf_medianode.cpp b/src/3rdparty/phonon/mmf/mmf_medianode.cpp
index b60d6f4..253c5e7 100644
--- a/src/3rdparty/phonon/mmf/mmf_medianode.cpp
+++ b/src/3rdparty/phonon/mmf/mmf_medianode.cpp
@@ -74,7 +74,7 @@ bool MMF::MediaNode::applyNodesOnMediaObject(MediaNode *)
// data(length of the graph) which typically is very small.
// First, we go to the very beginning of the graph.
- MMF::MediaNode *current = this;
+ MMF::MediaNode *current = this;
do {
MediaNode *const candidate = current->source();
if (candidate)
diff --git a/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp b/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
index c7fa791..d1d2337 100644
--- a/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
+++ b/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
@@ -16,7 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <QApplication> // for QApplication::activeWindow
+#include <QApplication> // for QApplication::activeWindow
#include <QUrl>
#include <QTimer>
#include <QWidget>
@@ -27,7 +27,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "mmf_videoplayer.h"
#include "utils.h"
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
#include "objectdump.h"
#endif
@@ -45,8 +45,8 @@ using namespace Phonon::MMF;
//-----------------------------------------------------------------------------
MMF::VideoPlayer::VideoPlayer()
- : m_wsSession(0)
- , m_screenDevice(0)
+ : m_wsSession(CCoeEnv::Static()->WsSession())
+ , m_screenDevice(*CCoeEnv::Static()->ScreenDevice())
, m_window(0)
, m_totalTime(0)
, m_mmfOutputChangePending(false)
@@ -56,8 +56,8 @@ MMF::VideoPlayer::VideoPlayer()
MMF::VideoPlayer::VideoPlayer(const AbstractPlayer& player)
: AbstractMediaPlayer(player)
- , m_wsSession(0)
- , m_screenDevice(0)
+ , m_wsSession(CCoeEnv::Static()->WsSession())
+ , m_screenDevice(*CCoeEnv::Static()->ScreenDevice())
, m_window(0)
, m_totalTime(0)
, m_mmfOutputChangePending(false)
@@ -70,37 +70,37 @@ void MMF::VideoPlayer::construct()
TRACE_CONTEXT(VideoPlayer::VideoPlayer, EVideoApi);
TRACE_ENTRY_0();
- if(m_videoOutput)
- m_videoOutput->setObserver(this);
+ if (m_videoOutput)
+ m_videoOutput->setObserver(this);
const TInt priority = 0;
const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone;
+ // Ignore return value - first call must always return true
getNativeWindowSystemHandles();
// TODO: is this the correct way to handle errors which occur when
// creating a Symbian object in the constructor of a Qt object?
-
- // TODO: check whether videoOutput is visible? If not, then the
- // corresponding window will not be active, meaning that the
+
+ // TODO: check whether videoOutput is visible? If not, then the
+ // corresponding window will not be active, meaning that the
// clipping region will be set to empty and the video will not be
// visible. If this is the case, we should set m_mmfOutputChangePending
// and respond to future showEvents from the videoOutput widget.
-
- TRAPD(err,
- m_player.reset(CVideoPlayerUtility::NewL
- (
- *this,
- priority, preference,
- *m_wsSession, *m_screenDevice,
- *m_window,
- m_windowRect, m_clipRect
- ))
- );
- if (KErrNone != err) {
+ TRAPD(err,
+ m_player.reset(CVideoPlayerUtility::NewL
+ (
+ *this,
+ priority, preference,
+ m_wsSession, m_screenDevice,
+ *m_window,
+ m_rect, m_rect
+ ))
+ );
+
+ if (KErrNone != err)
changeState(ErrorState);
- }
TRACE_EXIT_0();
}
@@ -120,13 +120,13 @@ MMF::VideoPlayer::~VideoPlayer()
void MMF::VideoPlayer::doPlay()
{
TRACE_CONTEXT(VideoPlayer::doPlay, EVideoApi);
-
+
// See comment in updateMmfOutput
- if(m_mmfOutputChangePending) {
+ if (m_mmfOutputChangePending) {
TRACE_0("MMF output change pending - pushing now");
updateMmfOutput();
}
-
+
m_player->Play();
}
@@ -149,20 +149,20 @@ void MMF::VideoPlayer::doStop()
void MMF::VideoPlayer::doSeek(qint64 ms)
{
TRACE_CONTEXT(VideoPlayer::doSeek, EVideoApi);
-
+
bool wasPlaying = false;
- if(state() == PlayingState) {
- // The call to SetPositionL does not have any effect if playback is
- // ongoing, so we pause before seeking.
- doPause();
- wasPlaying = true;
+ if (state() == PlayingState) {
+ // The call to SetPositionL does not have any effect if playback is
+ // ongoing, so we pause before seeking.
+ doPause();
+ wasPlaying = true;
}
TRAPD(err, m_player->SetPositionL(TTimeIntervalMicroSeconds(ms * 1000)));
- if(KErrNone == err) {
- if(wasPlaying)
- doPlay();
+ if (KErrNone == err) {
+ if (wasPlaying)
+ doPlay();
}
else {
TRACE("SetPositionL error %d", err);
@@ -251,15 +251,15 @@ void MMF::VideoPlayer::MvpuoPrepareComplete(TInt aError)
if (KErrNone == err) {
maxVolumeChanged(m_player->MaxVolume());
- if(m_videoOutput)
- m_videoOutput->setFrameSize(m_frameSize);
+ if (m_videoOutput)
+ m_videoOutput->setFrameSize(m_frameSize);
// See comment in updateMmfOutput
- if(m_mmfOutputChangePending) {
+ if (m_mmfOutputChangePending) {
TRACE_0("MMF output change pending - pushing now");
updateMmfOutput();
- }
-
+ }
+
emit totalTimeChanged(totalTime());
changeState(StoppedState);
} else {
@@ -300,8 +300,8 @@ void MMF::VideoPlayer::MvpuoPlayComplete(TInt aError)
TRACE_CONTEXT(VideoPlayer::MvpuoPlayComplete, EVideoApi)
TRACE_ENTRY("state %d error %d", state(), aError);
- // TODO
Q_UNUSED(aError); // suppress warnings in release builds
+ changeState(StoppedState);
TRACE_EXIT_0();
}
@@ -327,82 +327,91 @@ void MMF::VideoPlayer::videoOutputRegionChanged()
TRACE_CONTEXT(VideoPlayer::videoOutputRegionChanged, EVideoInternal);
TRACE_ENTRY("state %d", state());
- getNativeWindowSystemHandles();
+ const bool changed = getNativeWindowSystemHandles();
// See comment in updateMmfOutput
- if(state() == LoadingState)
- m_mmfOutputChangePending = true;
- else
- updateMmfOutput();
-
+ if (changed) {
+ if (state() == LoadingState)
+ m_mmfOutputChangePending = true;
+ else
+ updateMmfOutput();
+ }
+
TRACE_EXIT_0();
}
-// DEBUGGING *** DO NOT INTEGRATE ***
+
+#ifndef QT_NO_DEBUG
+
+// The following code is for debugging problems related to video visibility. It allows
+// the VideoPlayer instance to query the window server in order to determine the
+// DSA drawing region for the video window.
+
class CDummyAO : public CActive
{
public:
- CDummyAO() : CActive(CActive::EPriorityStandard) { CActiveScheduler::Add(this); }
- void RunL() { }
- void DoCancel() { }
- TRequestStatus& Status() { return iStatus; }
- void SetActive() { CActive::SetActive(); }
+ CDummyAO() : CActive(CActive::EPriorityStandard) { CActiveScheduler::Add(this); }
+ void RunL() { }
+ void DoCancel() { }
+ TRequestStatus& Status() { return iStatus; }
+ void SetActive() { CActive::SetActive(); }
};
-// DEBUGGING *** DO NOT INTEGRATE ***
void getDsaRegion(RWsSession &session, const RWindowBase &window)
{
- RDirectScreenAccess dsa(session);
- TInt err = dsa.Construct();
- CDummyAO ao;
- RRegion* region;
- err = dsa.Request(region, ao.Status(), window);
- ao.SetActive();
- dsa.Close();
- ao.Cancel();
- if(region) {
- qDebug() << "Phonon::MMF::getDsaRegion count" << region->Count();
- for(int i=0; i<region->Count(); ++i) {
- const TRect& rect = region->RectangleList()[i];
- qDebug() << "Phonon::MMF::getDsaRegion rect" << rect.iTl.iX << rect.iTl.iY << rect.iBr.iX << rect.iBr.iY;
- }
- region->Close();
- }
+ RDirectScreenAccess dsa(session);
+ TInt err = dsa.Construct();
+ CDummyAO ao;
+ RRegion* region;
+ err = dsa.Request(region, ao.Status(), window);
+ ao.SetActive();
+ dsa.Close();
+ ao.Cancel();
+ if (region) {
+ qDebug() << "Phonon::MMF::getDsaRegion count" << region->Count();
+ for (int i=0; i<region->Count(); ++i) {
+ const TRect& rect = region->RectangleList()[i];
+ qDebug() << "Phonon::MMF::getDsaRegion rect"
+ << rect.iTl.iX << rect.iTl.iY << rect.iBr.iX << rect.iBr.iY;
+ }
+ region->Close();
+ }
}
+#endif // _DEBUG
+
void MMF::VideoPlayer::updateMmfOutput()
{
TRACE_CONTEXT(VideoPlayer::updateMmfOutput, EVideoInternal);
TRACE_ENTRY_0();
-
- // Calling SetDisplayWindowL is a no-op unless the MMF controller has
+
+ // Calling SetDisplayWindowL is a no-op unless the MMF controller has
// been loaded, so we shouldn't do it. Instead, the
// m_mmfOutputChangePending flag is used to record the fact that we
- // need to call SetDisplayWindowL, and this is checked in
+ // need to call SetDisplayWindowL, and this is checked in
// MvpuoPrepareComplete, at which point the MMF controller has been
// loaded.
-
- getNativeWindowSystemHandles();
-
-// DEBUGGING *** DO NOT INTEGRATE ***
-getDsaRegion(*m_wsSession, *m_window);
+
+#ifndef QT_NO_DEBUG
+ getDsaRegion(m_wsSession, *m_window);
+#endif
TRAPD(err,
- m_player->SetDisplayWindowL
- (
- *m_wsSession, *m_screenDevice,
- *m_window,
- m_windowRect, m_clipRect
- )
- );
+ m_player->SetDisplayWindowL
+ (
+ m_wsSession, m_screenDevice,
+ *m_window,
+ m_rect, m_rect
+ )
+ );
if (KErrNone != err) {
TRACE("SetDisplayWindowL error %d", err);
setError(NormalError);
}
-
+
m_mmfOutputChangePending = false;
-
+
TRACE_EXIT_0();
}
@@ -416,9 +425,9 @@ void MMF::VideoPlayer::videoOutputChanged()
TRACE_CONTEXT(VideoPlayer::videoOutputChanged, EVideoInternal);
TRACE_ENTRY_0();
- if(m_videoOutput) {
- m_videoOutput->setObserver(this);
- m_videoOutput->setFrameSize(m_frameSize);
+ if (m_videoOutput) {
+ m_videoOutput->setObserver(this);
+ m_videoOutput->setFrameSize(m_frameSize);
}
videoOutputRegionChanged();
@@ -426,58 +435,56 @@ void MMF::VideoPlayer::videoOutputChanged()
TRACE_EXIT_0();
}
-void MMF::VideoPlayer::getNativeWindowSystemHandles()
+bool MMF::VideoPlayer::getNativeWindowSystemHandles()
{
TRACE_CONTEXT(VideoPlayer::getNativeWindowSystemHandles, EVideoInternal);
TRACE_ENTRY_0();
-
+
CCoeControl *control = 0;
-
- if(m_videoOutput)
- // Create native window
- control = m_videoOutput->winId();
+
+ if (m_videoOutput)
+ // Create native window
+ control = m_videoOutput->winId();
else
- // Get top-level window
- control = QApplication::activeWindow()->effectiveWinId();
-
- CCoeEnv* const coeEnv = control->ControlEnv();
- m_wsSession = &(coeEnv->WsSession());
- m_screenDevice = coeEnv->ScreenDevice();
- m_window = control->DrawableWindow();
-
-#ifdef _DEBUG
- if(m_videoOutput) {
- QScopedPointer<ObjectDump::QDumper> dumper(new ObjectDump::QDumper);
- dumper->setPrefix("Phonon::MMF"); // to aid searchability of logs
- ObjectDump::addDefaultAnnotators(*dumper);
- TRACE_0("Dumping VideoOutput:");
- dumper->dumpObject(*m_videoOutput);
+ // Get top-level window
+ control = QApplication::activeWindow()->effectiveWinId();
+
+#ifndef QT_NO_DEBUG
+ if (m_videoOutput) {
+ QScopedPointer<ObjectDump::QDumper> dumper(new ObjectDump::QDumper);
+ dumper->setPrefix("Phonon::MMF"); // to aid searchability of logs
+ ObjectDump::addDefaultAnnotators(*dumper);
+ TRACE_0("Dumping VideoOutput:");
+ dumper->dumpObject(*m_videoOutput);
}
else {
- TRACE_0("m_videoOutput is null - dumping top-level control info:");
- TRACE("control %08x", control);
- TRACE("control.parent %08x", control->Parent());
- TRACE("control.isVisible %d", control->IsVisible());
- TRACE("control.rect %d,%d %dx%d",
- control->Position().iX, control->Position().iY,
- control->Size().iWidth, control->Size().iHeight);
- TRACE("control.ownsWindow %d", control->OwnsWindow());
+ TRACE_0("m_videoOutput is null - dumping top-level control info:");
+ TRACE("control %08x", control);
+ TRACE("control.parent %08x", control->Parent());
+ TRACE("control.isVisible %d", control->IsVisible());
+ TRACE("control.rect %d,%d %dx%d",
+ control->Position().iX, control->Position().iY,
+ control->Size().iWidth, control->Size().iHeight);
+ TRACE("control.ownsWindow %d", control->OwnsWindow());
}
#endif
- m_windowRect = TRect(
- control->DrawableWindow()->AbsPosition(),
- control->DrawableWindow()->Size());
- m_clipRect = m_windowRect;
-
- TRACE("windowRect %d %d - %d %d",
- m_windowRect.iTl.iX, m_windowRect.iTl.iY,
- m_windowRect.iBr.iX, m_windowRect.iBr.iY);
- TRACE("clipRect %d %d - %d %d",
- m_clipRect.iTl.iX, m_clipRect.iTl.iY,
- m_clipRect.iBr.iX, m_clipRect.iBr.iY);
-
- TRACE_EXIT_0();
+ RWindowBase *const window = control->DrawableWindow();
+ const TRect rect(window->AbsPosition(), window->Size());
+
+ TRACE("rect %d %d - %d %d",
+ rect.iTl.iX, rect.iTl.iY,
+ rect.iBr.iX, rect.iBr.iY);
+
+ bool changed = false;
+
+ if (window != m_window || rect != m_rect) {
+ m_window = window;
+ m_rect = rect;
+ changed = true;
+ }
+
+ TRACE_RETURN("changed %d", changed);
}
diff --git a/src/3rdparty/phonon/mmf/mmf_videoplayer.h b/src/3rdparty/phonon/mmf/mmf_videoplayer.h
index ee3650a..8072404 100644
--- a/src/3rdparty/phonon/mmf/mmf_videoplayer.h
+++ b/src/3rdparty/phonon/mmf/mmf_videoplayer.h
@@ -80,25 +80,26 @@ private:
// AbstractPlayer
virtual void videoOutputChanged();
-
- void getNativeWindowSystemHandles();
+
+ // Returns true if handles have changed
+ bool getNativeWindowSystemHandles();
+
void updateMmfOutput();
-
+
private:
QScopedPointer<CVideoPlayerUtility> m_player;
// Not owned
- RWsSession* m_wsSession;
- CWsScreenDevice* m_screenDevice;
+ RWsSession& m_wsSession;
+ CWsScreenDevice& m_screenDevice;
RWindowBase* m_window;
- TRect m_windowRect;
- TRect m_clipRect;
-
+ TRect m_rect;
+
QSize m_frameSize;
qint64 m_totalTime;
bool m_mmfOutputChangePending;
-
+
};
}
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.cpp b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.cpp
index ef2b81c..9add439 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.cpp
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.cpp
@@ -36,7 +36,7 @@ namespace ObjectDump
QAnnotator::~QAnnotator()
{
-
+
}
@@ -45,53 +45,53 @@ QAnnotator::~QAnnotator()
//-----------------------------------------------------------------------------
QList<QByteArray> QAnnotatorBasic::annotation(const QObject& object)
-{
+{
QList<QByteArray> result;
-
+
QByteArray array;
QTextStream stream(&array);
-
+
stream << '[' << &object << ']';
stream << ' ';
stream << object.metaObject()->className();
-
- if(object.objectName() != "")
+
+ if (object.objectName() != "")
stream << " \"" << object.objectName() << '"';
-
- if(object.isWidgetType())
+
+ if (object.isWidgetType())
stream << " isWidget";
-
+
stream.flush();
result.append(array);
return result;
}
QList<QByteArray> QAnnotatorWidget::annotation(const QObject& object)
-{
+{
QList<QByteArray> result;
-
+
const QWidget* widget = qobject_cast<const QWidget*>(&object);
- if(widget) {
-
+ if (widget) {
+
QByteArray array;
QTextStream stream(&array);
-
+
stream << "widget: ";
-
- if(widget->isVisible())
+
+ if (widget->isVisible())
stream << "visible ";
else
stream << "invisible ";
-
+
stream << widget->x() << ',' << widget->y() << ' ';
stream << widget->size().width() << 'x'<< widget->size().height() << ' ';
-
+
stream << "hint " << widget->sizeHint().width() << 'x' << widget->sizeHint().height();
-
+
stream.flush();
result.append(array);
}
-
+
return result;
}
@@ -105,12 +105,12 @@ class QDumperBase
public:
QDumperBase();
~QDumperBase();
-
+
void setPrefix(const QString& prefix);
void addAnnotator(QAnnotator* annotator);
-
+
protected:
- QByteArray m_prefix;
+ QByteArray m_prefix;
QList<QAnnotator*> m_annotators;
};
@@ -139,7 +139,7 @@ void QDumperBase::addAnnotator(QAnnotator* annotator)
// Protect against an exception occurring during QList::append
QScopedPointer<QAnnotator> holder(annotator);
m_annotators.append(annotator);
- holder.take();
+ holder.take();
}
@@ -148,13 +148,13 @@ void QDumperBase::addAnnotator(QAnnotator* annotator)
//-----------------------------------------------------------------------------
class QDumperPrivate : public QDumperBase
-{
+{
public:
QDumperPrivate();
~QDumperPrivate();
void dumpObject(const QObject& object);
-
+
};
@@ -206,27 +206,27 @@ void QDumper::addAnnotator(QAnnotator* annotator)
}
void QDumper::dumpObject(const QObject& object)
-{
+{
d_func()->dumpObject(object);
}
-
+
//-----------------------------------------------------------------------------
// QVisitor
//-----------------------------------------------------------------------------
class QVisitorPrivate : public QDumperBase
-{
+{
public:
QVisitorPrivate();
~QVisitorPrivate();
-
+
void setIndent(unsigned indent);
-
+
void visitNode(const QObject& object);
void visitComplete();
-private:
+private:
class Node
{
public:
@@ -235,24 +235,24 @@ private:
QList<QByteArray> m_annotation;
QList<Node*> m_children;
-
+
typedef QList<Node*>::const_iterator child_iterator;
};
-
+
private:
Node* findNode(const QObject* object) const;
QByteArray branchBuffer(const QList<bool>& branches, bool isNodeLine, bool isLastChild) const;
void dumpRecursive(const Node& node, QList<bool> branches, bool isLastChild);
void dumpNode(const Node& node, const QList<bool>& branches, bool isLastChild);
-
+
private:
unsigned m_indent;
-
+
QScopedPointer<Node> m_root;
-
+
// Hash table used to associate internal nodes with QObjects
typedef QHash<const QObject*, Node*> Hash;
- Hash m_hash;
+ Hash m_hash;
};
static const unsigned DefaultIndent = 2;
@@ -274,21 +274,21 @@ void QVisitorPrivate::setIndent(unsigned indent)
}
// Builds up a mirror of the object tree, rooted in m_root, with each node
-// storing annotations generated by
+// storing annotations generated by
void QVisitorPrivate::visitNode(const QObject& object)
-{
+{
QObject* const objectParent = object.parent();
Node* const nodeParent = objectParent ? findNode(objectParent) : 0;
// Create a new node and store in scoped pointer for exception safety
Node* node = new Node;
QScopedPointer<Node> nodePtr(node);
-
+
// Associate node with QObject
m_hash.insert(&object, node);
-
+
// Insert node into internal tree
- if(nodeParent)
+ if (nodeParent)
{
nodeParent->m_children.append(nodePtr.take());
}
@@ -297,7 +297,7 @@ void QVisitorPrivate::visitNode(const QObject& object)
Q_ASSERT(m_root.isNull());
m_root.reset(nodePtr.take());
}
-
+
// Generate and store annotations
QAnnotator* annotator;
foreach(annotator, m_annotators)
@@ -322,71 +322,71 @@ QByteArray QVisitorPrivate::branchBuffer
(const QList<bool>& branches, bool isNodeLine, bool isLastChild) const
{
const int depth = branches.count();
-
+
const QByteArray indent(m_indent, ' ');
const QByteArray horiz(m_indent, '-');
QByteArray buffer;
QTextStream stream(&buffer);
-
+
for (int i=0; i<depth-1; ++i) {
- if(branches[i])
+ if (branches[i])
stream << '|';
else
stream << ' ';
stream << indent;
}
-
- if(depth) {
- if(isNodeLine)
+
+ if (depth) {
+ if (isNodeLine)
stream << '+' << horiz;
else {
- if(!isLastChild)
+ if (!isLastChild)
stream << '|';
else
stream << ' ';
stream << indent;
}
}
-
+
stream.flush();
buffer.push_front(m_prefix);
-
+
return buffer;
}
void QVisitorPrivate::dumpRecursive
(const Node& node, QList<bool> branches, bool isLastChild)
-{
+{
dumpNode(node, branches, isLastChild);
-
+
// Recurse down tree
const Node::child_iterator begin = node.m_children.begin();
const Node::child_iterator end = node.m_children.end();
- for(Node::child_iterator i = begin; end != i; ++i) {
-
+ for (Node::child_iterator i = begin; end != i; ++i) {
+
isLastChild = (end == i + 1);
-
- if(begin == i)
+
+ if (begin == i)
branches.push_back(!isLastChild);
else
branches.back() = !isLastChild;
-
+
static const bool isNodeLine = false;
const QByteArray buffer = branchBuffer(branches, isNodeLine, false);
qDebug() << buffer.constData();
-
+
dumpRecursive(**i, branches, isLastChild);
}
}
void QVisitorPrivate::dumpNode
(const Node& node, const QList<bool>& branches, bool isLastChild)
-{
+{
const QList<QByteArray>::const_iterator
begin = node.m_annotation.begin(), end = node.m_annotation.end();
-
- if(begin == end) {
+
+ if (begin == end) {
// No annotations - just dump the object pointer
const bool isNodeLine = true;
QByteArray buffer = branchBuffer(branches, isNodeLine, isLastChild);
@@ -394,7 +394,7 @@ void QVisitorPrivate::dumpNode
}
else {
// Dump annotations
- for(QList<QByteArray>::const_iterator i = begin; end != i; ++i) {
+ for (QList<QByteArray>::const_iterator i = begin; end != i; ++i) {
const bool isNodeLine = (begin == i);
QByteArray buffer = branchBuffer(branches, isNodeLine, isLastChild);
buffer.append(*i);
@@ -408,7 +408,7 @@ void QVisitorPrivate::dumpNode
QVisitorPrivate::Node::Node()
{
-
+
}
QVisitorPrivate::Node::~Node()
@@ -453,7 +453,7 @@ void QVisitor::visitPrepare()
}
void QVisitor::visitNode(const QObject& object)
-{
+{
d_func()->visitNode(object);
}
@@ -474,7 +474,7 @@ void addDefaultAnnotators(QDumper& dumper)
{
dumper.addAnnotator(new QAnnotatorBasic);
dumper.addAnnotator(new QAnnotatorWidget);
-
+
// Add platform-specific annotators
addDefaultAnnotators_sys(dumper);
}
@@ -483,7 +483,7 @@ void addDefaultAnnotators(QVisitor& visitor)
{
visitor.addAnnotator(new QAnnotatorBasic);
visitor.addAnnotator(new QAnnotatorWidget);
-
+
// Add platform-specific annotators
addDefaultAnnotators_sys(visitor);
}
@@ -492,7 +492,7 @@ void dumpTreeFromRoot(const QObject& root, QVisitor& visitor)
{
// Set up iteration range
ObjectTree::DepthFirstConstIterator begin(root), end;
-
+
// Invoke generic visitor algorithm
ObjectTree::visit(begin, end, visitor);
}
@@ -505,7 +505,7 @@ void dumpTreeFromLeaf(const QObject& leaf, QVisitor& visitor)
{
root = root->parent();
}
-
+
dumpTreeFromRoot(*root, visitor);
}
@@ -513,7 +513,7 @@ void dumpAncestors(const QObject& leaf, QVisitor& visitor)
{
// Set up iteration range
ObjectTree::AncestorConstIterator begin(leaf), end;
-
+
// Invoke generic visitor algorithm
ObjectTree::visit(begin, end, visitor);
}
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.h b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.h
index cbd9bea..e94b3ac 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.h
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump.h
@@ -32,7 +32,7 @@ namespace ObjectDump
{
/**
- * Abstract base for annotator classes invoked by QVisitor.
+ * Abstract base for annotator classes invoked by QVisitor.
*/
class OBJECTDUMP_EXPORT QAnnotator : public QObject
{
@@ -72,29 +72,29 @@ class OBJECTDUMP_EXPORT QDumper : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QDumper)
-
+
public:
QDumper();
~QDumper();
-
+
/**
* Specify a prefix, to be printed on each line of output.
*/
void setPrefix(const QString& prefix);
-
+
/**
* Takes ownership of annotator.
*/
void addAnnotator(QAnnotator* annotator);
-
+
/**
* Invoke each annotator on the object and write to debug output.
*/
void dumpObject(const QObject& object);
-
+
private:
QScopedPointer<QDumperPrivate> d_ptr;
-
+
};
@@ -107,36 +107,36 @@ class OBJECTDUMP_EXPORT QVisitor : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QVisitor)
-
+
public:
QVisitor();
~QVisitor();
-
+
/**
* Specify a prefix, to be printed on each line of output.
*/
void setPrefix(const QString& prefix);
-
+
/**
* Set number of spaces by which each level of the tree is indented.
*/
void setIndent(unsigned indent);
-
+
/**
* Called by the visitor algorithm before starting the visit.
*/
void visitPrepare();
-
+
/**
* Called by the visitor algorithm as each node is visited.
*/
void visitNode(const QObject& object);
-
+
/**
* Called by the visitor algorithm when the visit is complete.
*/
void visitComplete();
-
+
/**
* Takes ownership of annotator.
*/
@@ -144,7 +144,7 @@ public:
private:
QScopedPointer<QVisitorPrivate> d_ptr;
-
+
};
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.cpp b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.cpp
index 5ae10f9..03220a7 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.cpp
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.cpp
@@ -21,6 +21,8 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
#include <coecntrl.h>
#include "objectdump_symbian.h"
+#include <QtGui/private/qwidget_p.h> // to access QWExtra
+
QT_BEGIN_NAMESPACE
namespace ObjectDump
@@ -28,92 +30,118 @@ namespace ObjectDump
namespace Symbian
{
+QList<QByteArray> QAnnotatorWidget::annotation(const QObject& object)
+{
+ QList<QByteArray> result;
+
+ const QWidget* widget = qobject_cast<const QWidget*>(&object);
+ if (widget) {
+
+ const QWExtra* extra = qt_widget_private(const_cast<QWidget *>(widget))->extraData();
+
+ if (extra) {
+
+ QByteArray array;
+ QTextStream stream(&array);
+
+ stream << "widget (Symbian): ";
+ stream << "activated " << extra->activated << ' ';
+ stream << "disableBlit " << extra->disableBlit << ' ';
+
+ stream.flush();
+ result.append(array);
+ }
+ }
+
+ return result;
+}
+
QList<QByteArray> QAnnotatorControl::annotation(const QObject& object)
{
QList<QByteArray> result;
-
+
const QWidget* widget = qobject_cast<const QWidget*>(&object);
- if(widget) {
-
+ if (widget) {
+
const CCoeControl* control = widget->effectiveWinId();
- if(control) {
-
+ if (control) {
+
QByteArray array;
QTextStream stream(&array);
-
+
stream << "control: " << control << ' ';
stream << "parent " << control->Parent() << ' ';
-
- if(control->IsVisible())
+
+ if (control->IsVisible())
stream << "visible ";
else
stream << "invisible ";
-
+
stream << control->Position().iX << ',' << control->Position().iY << ' ';
stream << control->Size().iWidth << 'x' << control->Size().iHeight;
-
- if(control->OwnsWindow())
+
+ if (control->OwnsWindow())
stream << " ownsWindow ";
-
+
stream.flush();
result.append(array);
}
}
-
+
return result;
}
QList<QByteArray> QAnnotatorWindow::annotation(const QObject& object)
{
QList<QByteArray> result;
-
+
const QWidget* widget = qobject_cast<const QWidget*>(&object);
- if(widget) {
-
+ if (widget) {
+
const CCoeControl* control = widget->effectiveWinId();
- if(control) {
-
- RDrawableWindow& window = *(control->DrawableWindow());
-
+ RDrawableWindow *window = 0;
+
+ if (control && (window = control->DrawableWindow())) {
+
QByteArray array;
QTextStream stream(&array);
-
+
stream << "window: ";
-
+
// ClientHandle() is available first in 5.0.
#if !defined(__SERIES60_31__) && !defined(__S60_32__)
if (QSysInfo::s60Version() > QSysInfo::SV_S60_3_2)
- // Client-side window handle
- // Cast to a void pointer so that log output is in hexadecimal format.
- stream << "cli " << reinterpret_cast<const void*>(window.ClientHandle()) << ' ';
+ // Client-side window handle
+ // Cast to a void pointer so that log output is in hexadecimal format.
+ stream << "cli " << reinterpret_cast<const void*>(window->ClientHandle()) << ' ';
#endif
// Server-side address of CWsWindow object
// This is useful for correlation with the window tree dumped by the window
// server (see RWsSession::LogCommand).
// Cast to a void pointer so that log output is in hexadecimal format.
- stream << "srv " << reinterpret_cast<const void*>(window.WsHandle()) << ' ';
-
- stream << "group " << window.WindowGroupId() << ' ';
-
+ stream << "srv " << reinterpret_cast<const void*>(window->WsHandle()) << ' ';
+
+ stream << "group " << window->WindowGroupId() << ' ';
+
// Client-side handle to the parent window.
- // Cast to a void pointer so that log output is in hexadecimal format.
- stream << "parent " << reinterpret_cast<const void*>(window.Parent()) << ' ';
-
- stream << window.Position().iX << ',' << window.Position().iY << ' ';
- stream << '(' << window.AbsPosition().iX << ',' << window.AbsPosition().iY << ") ";
- stream << window.Size().iWidth << 'x' << window.Size().iHeight << ' ';
-
- const TDisplayMode displayMode = window.DisplayMode();
+ // Cast to a void pointer so that log output is in hexadecimal format.
+ stream << "parent " << reinterpret_cast<const void*>(window->Parent()) << ' ';
+
+ stream << window->Position().iX << ',' << window->Position().iY << ' ';
+ stream << '(' << window->AbsPosition().iX << ',' << window->AbsPosition().iY << ") ";
+ stream << window->Size().iWidth << 'x' << window->Size().iHeight << ' ';
+
+ const TDisplayMode displayMode = window->DisplayMode();
stream << "mode " << displayMode << ' ';
-
- stream << "ord " << window.OrdinalPosition();
-
+
+ stream << "ord " << window->OrdinalPosition();
+
stream.flush();
result.append(array);
- }
+ }
}
-
+
return result;
}
@@ -121,12 +149,14 @@ QList<QByteArray> QAnnotatorWindow::annotation(const QObject& object)
void addDefaultAnnotators_sys(QDumper& dumper)
{
+ dumper.addAnnotator(new Symbian::QAnnotatorWidget);
dumper.addAnnotator(new Symbian::QAnnotatorControl);
dumper.addAnnotator(new Symbian::QAnnotatorWindow);
}
void addDefaultAnnotators_sys(QVisitor& visitor)
{
+ visitor.addAnnotator(new Symbian::QAnnotatorWidget);
visitor.addAnnotator(new Symbian::QAnnotatorControl);
visitor.addAnnotator(new Symbian::QAnnotatorWindow);
}
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.h b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.h
index 26ab308..563c862 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.h
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objectdump_symbian.h
@@ -29,6 +29,16 @@ namespace Symbian
{
/**
+ * Annotator which returns Symbian-specific widget information
+ */
+class QAnnotatorWidget : public QAnnotator
+{
+ Q_OBJECT
+public:
+ QList<QByteArray> annotation(const QObject& object);
+};
+
+/**
* Annotator which returns control information
*/
class QAnnotatorControl : public QAnnotator
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.cpp b/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.cpp
index 5053b2d..bc61435 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.cpp
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.cpp
@@ -28,38 +28,38 @@ namespace ObjectTree
DepthFirstConstIterator::DepthFirstConstIterator()
: m_pointee(0)
{
-
+
}
DepthFirstConstIterator::DepthFirstConstIterator
(const QObject& root)
: m_pointee(&root)
{
-
+
}
-
+
DepthFirstConstIterator&
DepthFirstConstIterator::operator++()
{
const QObjectList& children = m_pointee->children();
-
+
if (children.count() == 0) {
backtrack();
}
else {
m_history.push(0);
- m_pointee = children.first();
+ m_pointee = children.first();
}
-
+
return *this;
}
void DepthFirstConstIterator::backtrack()
-{
+{
if (m_history.count()) {
const int index = m_history.top();
m_history.pop();
-
+
const QObjectList& siblings = m_pointee->parent()->children();
if (siblings.count() > index + 1) {
m_history.push(index + 1);
@@ -70,7 +70,7 @@ void DepthFirstConstIterator::backtrack()
backtrack();
}
}
- else {
+ else {
// Reached end of search
m_pointee = 0;
}
@@ -80,7 +80,7 @@ void DepthFirstConstIterator::backtrack()
AncestorConstIterator::AncestorConstIterator()
{
-
+
}
AncestorConstIterator::AncestorConstIterator(const QObject& leaf)
diff --git a/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.h b/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.h
index f2729fa..98bdf14 100644
--- a/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.h
+++ b/src/3rdparty/phonon/mmf/mmfphonondebug/objecttree.h
@@ -34,24 +34,24 @@ namespace ObjectTree
*/
class OBJECTDUMP_EXPORT DepthFirstConstIterator
{
-public:
+public:
DepthFirstConstIterator();
DepthFirstConstIterator(const QObject& root);
-
+
DepthFirstConstIterator& operator++();
-
+
inline bool operator==(const DepthFirstConstIterator& other) const
{ return other.m_pointee == m_pointee; }
-
+
inline bool operator!=(const DepthFirstConstIterator& other) const
{ return other.m_pointee != m_pointee; }
-
+
inline const QObject* operator->() const { return m_pointee; }
inline const QObject& operator*() const { return *m_pointee; }
-
+
private:
void backtrack();
-
+
private:
const QObject* m_pointee;
QStack<int> m_history;
@@ -62,40 +62,40 @@ private:
*/
class OBJECTDUMP_EXPORT AncestorConstIterator
{
-public:
+public:
AncestorConstIterator();
AncestorConstIterator(const QObject& root);
-
+
inline AncestorConstIterator& operator++()
{ m_ancestors.pop(); return *this; }
-
+
inline bool operator==(const AncestorConstIterator& other) const
{ return other.m_ancestors == m_ancestors; }
-
+
inline bool operator!=(const AncestorConstIterator& other) const
{ return other.m_ancestors != m_ancestors; }
-
+
inline const QObject* operator->() const { return m_ancestors.top(); }
inline const QObject& operator*() const { return *m_ancestors.top(); }
-
+
private:
QStack<const QObject*> m_ancestors;
-
+
};
/**
* Generic algorithm for visiting nodes in an object tree. Nodes in the
* tree are visited in a const context, therefore they are not modified
* by this algorithm.
- *
+ *
* Visitor must provide functions with the following signatures:
- *
+ *
* Called before visit begins
* void visitPrepare()
- *
+ *
* Called on each node visited
* void visitNode(const QObject& object)
- *
+ *
* Called when visit is complete
* void visitComplete()
*/
@@ -103,8 +103,8 @@ template <class Iterator, class Visitor>
void visit(Iterator begin, Iterator end, Visitor& visitor)
{
visitor.visitPrepare();
-
- for( ; begin != end; ++begin)
+
+ for ( ; begin != end; ++begin)
visitor.visitNode(*begin);
visitor.visitComplete();
diff --git a/src/3rdparty/phonon/mmf/utils.cpp b/src/3rdparty/phonon/mmf/utils.cpp
index 2f5b68f..58d1ece 100644
--- a/src/3rdparty/phonon/mmf/utils.cpp
+++ b/src/3rdparty/phonon/mmf/utils.cpp
@@ -62,7 +62,7 @@ MMF::MediaType MMF::Utils::mimeTypeToMediaType(const TDesC& mimeType)
}
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
#include <hal.h>
#include <hal_data.h>
@@ -111,7 +111,7 @@ QColor MMF::Utils::getScreenPixel(const QPoint& pos)
TScreenInfo info;
TRAPD(err, getScreenInfoL(info));
QColor pixel;
- if(err == KErrNone and pos.x() < info.width and pos.y() < info.height)
+ if (err == KErrNone and pos.x() < info.width and pos.y() < info.height)
{
const int bytesPerPixel = info.bpp / 8;
Q_ASSERT(bytesPerPixel >= 3);
@@ -129,7 +129,7 @@ QColor MMF::Utils::getScreenPixel(const QPoint& pos)
pixel.setGreen(*ptr++);
pixel.setRed(*ptr++);
- if(bytesPerPixel == 4)
+ if (bytesPerPixel == 4)
pixel.setAlpha(*ptr++);
}
return pixel;
@@ -138,7 +138,7 @@ QColor MMF::Utils::getScreenPixel(const QPoint& pos)
// Debugging: for debugging video visibility
void MMF::Utils::dumpScreenPixelSample()
{
- for(int i=0; i<20; ++i) {
+ for (int i=0; i<20; ++i) {
const QPoint pos(i*10, i*10);
const QColor pixel = Utils::getScreenPixel(pos);
RDebug::Printf(
diff --git a/src/3rdparty/phonon/mmf/utils.h b/src/3rdparty/phonon/mmf/utils.h
index 38964d0..7e363e8 100644
--- a/src/3rdparty/phonon/mmf/utils.h
+++ b/src/3rdparty/phonon/mmf/utils.h
@@ -54,7 +54,7 @@ void panic(PanicCode code);
*/
MediaType mimeTypeToMediaType(const TDesC& mimeType);
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
/**
* Retrieve color of specified pixel from the screen.
*/
@@ -138,16 +138,16 @@ public:
#define _TRACE_MODULE Phonon::MMF
// Macros available for use by implementation code
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
#define TRACE_CONTEXT(_fn, _cat) const ::Phonon::MMF::TTraceContext _tc((TText*)L ## #_fn, (TUint)this, _cat);
-#define TRACE_ENTRY_0() { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "+ Phonon::MMF::%s [0x%08x]"), _tc.iFunction, _tc.iAddr); }
-#define TRACE_ENTRY(string, args...) { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "+ Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
-#define TRACE_EXIT_0() { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "- Phonon::MMF::%s [0x%08x]"), _tc.iFunction, _tc.iAddr); }
-#define TRACE_EXIT(string, args...) { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "- Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
-#define TRACE_RETURN(string, result) { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "r Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, result); } return result;
+#define TRACE_ENTRY_0() { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "+ Phonon::MMF::%s [0x%08x]"), _tc.iFunction, _tc.iAddr); }
+#define TRACE_ENTRY(string, args...) { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "+ Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
+#define TRACE_EXIT_0() { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "- Phonon::MMF::%s [0x%08x]"), _tc.iFunction, _tc.iAddr); }
+#define TRACE_EXIT(string, args...) { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "- Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
+#define TRACE_RETURN(string, result) { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## "r Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, result); } return result;
#define TRACE_PANIC(code) { _TRACE_PRINT(_TRACE_TEXT(L ## "! Phonon::MMF::%s [0x%08x] panic %d"), _tc.iFunction, _tc.iAddr, code); } Utils::panic(code);
-#define TRACE_0(string) { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## " Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr); }
-#define TRACE(string, args...) { if(_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## " Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
+#define TRACE_0(string) { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## " Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr); }
+#define TRACE(string, args...) { if (_tc.Enabled()) _TRACE_PRINT(_TRACE_TEXT(L ## " Phonon::MMF::%s [0x%08x] " L ## string), _tc.iFunction, _tc.iAddr, args); }
#else
#define TRACE_CONTEXT(_fn, _cat)
#define TRACE_ENTRY_0()
diff --git a/src/3rdparty/phonon/mmf/videooutput.cpp b/src/3rdparty/phonon/mmf/videooutput.cpp
index 041b0a8..f0393a7 100644
--- a/src/3rdparty/phonon/mmf/videooutput.cpp
+++ b/src/3rdparty/phonon/mmf/videooutput.cpp
@@ -20,7 +20,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "videooutput.h"
#include "videooutputobserver.h"
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
#include "objectdump.h"
#endif
@@ -52,19 +52,19 @@ MMF::VideoOutput::VideoOutput(QWidget* parent)
TRACE_ENTRY("parent 0x%08x", parent);
setPalette(QPalette(Qt::black));
- setAttribute(Qt::WA_OpaquePaintEvent, true);
- setAttribute(Qt::WA_NoSystemBackground, true);
- setAutoFillBackground(false);
+ setAttribute(Qt::WA_OpaquePaintEvent, true);
+ setAttribute(Qt::WA_NoSystemBackground, true);
+ setAutoFillBackground(false);
- // Causes QSymbianControl::Draw not to BitBlt this widget's region of the
- // backing store. Since the backing store is (by default) a 16MU bitmap,
- // blitting it results in this widget's screen region in the final
- // framebuffer having opaque alpha values. This in turn causes the video
- // to be invisible when running on the target device.
- qt_widget_private(this)->extraData()->disableBlit = true;
+ // Causes QSymbianControl::Draw not to BitBlt this widget's region of the
+ // backing store. Since the backing store is (by default) a 16MU bitmap,
+ // blitting it results in this widget's screen region in the final
+ // framebuffer having opaque alpha values. This in turn causes the video
+ // to be invisible when running on the target device.
+ qt_widget_private(this)->extraData()->disableBlit = true;
dump();
-
+
TRACE_EXIT_0();
}
@@ -123,9 +123,7 @@ void MMF::VideoOutput::paintEvent(QPaintEvent* event)
TRACE("regions %d", event->region().numRects());
TRACE("type %d", event->type());
- dump();
-
- // Do not paint anything
+ // Do nothing
}
void MMF::VideoOutput::resizeEvent(QResizeEvent* event)
@@ -135,10 +133,7 @@ void MMF::VideoOutput::resizeEvent(QResizeEvent* event)
event->oldSize().width(), event->oldSize().height(),
event->size().width(), event->size().height());
- QWidget::resizeEvent(event);
-
- if (m_observer)
- m_observer->videoOutputRegionChanged();
+ videoOutputRegionChanged();
}
void MMF::VideoOutput::moveEvent(QMoveEvent* event)
@@ -148,10 +143,20 @@ void MMF::VideoOutput::moveEvent(QMoveEvent* event)
event->oldPos().x(), event->oldPos().y(),
event->pos().x(), event->pos().y());
- QWidget::moveEvent(event);
+ videoOutputRegionChanged();
+}
- if (m_observer)
- m_observer->videoOutputRegionChanged();
+bool MMF::VideoOutput::event(QEvent* event)
+{
+ TRACE_CONTEXT(VideoOutput::event, EVideoInternal);
+
+ if (event->type() == QEvent::WinIdChange) {
+ TRACE_0("WinIdChange");
+ videoOutputRegionChanged();
+ return true;
+ }
+ else
+ return QWidget::event(event);
}
@@ -159,9 +164,16 @@ void MMF::VideoOutput::moveEvent(QMoveEvent* event)
// Private functions
//-----------------------------------------------------------------------------
-void VideoOutput::dump() const
+void MMF::VideoOutput::videoOutputRegionChanged()
+{
+ dump();
+ if (m_observer)
+ m_observer->videoOutputRegionChanged();
+}
+
+void MMF::VideoOutput::dump() const
{
-#ifdef _DEBUG
+#ifndef QT_NO_DEBUG
TRACE_CONTEXT(VideoOutput::dump, EVideoInternal);
QScopedPointer<ObjectDump::QVisitor> visitor(new ObjectDump::QVisitor);
visitor->setPrefix("Phonon::MMF"); // to aid searchability of logs
diff --git a/src/3rdparty/phonon/mmf/videooutput.h b/src/3rdparty/phonon/mmf/videooutput.h
index 639a5ed..7bc0b52 100644
--- a/src/3rdparty/phonon/mmf/videooutput.h
+++ b/src/3rdparty/phonon/mmf/videooutput.h
@@ -49,10 +49,12 @@ protected:
void paintEvent(QPaintEvent* event);
void resizeEvent(QResizeEvent* event);
void moveEvent(QMoveEvent* event);
+ bool event(QEvent* event);
private:
void dump() const;
-
+ void videoOutputRegionChanged();
+
private:
QSize m_frameSize;
diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c
index 7e604cb..46d3dfc 100644
--- a/src/3rdparty/sqlite/sqlite3.c
+++ b/src/3rdparty/sqlite/sqlite3.c
@@ -1,6 +1,6 @@
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-** version 3.5.9. By combining all the individual C code files into this
+** version 3.6.19. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a one translation
** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements
@@ -10,14 +10,14 @@
** This file is all you need to compile SQLite. To use SQLite in other
** programs, you need this file and the "sqlite3.h" header file that defines
** the programming interface to the SQLite library. (If you do not have
-** the "sqlite3.h" header file at hand, you will find a copy in the first
-** 5638 lines past this header comment.) Additional code files may be
-** needed if you want a wrapper to interface SQLite with your choice of
-** programming language. The code for the "sqlite3" command-line shell
-** is also in a separate file. This file contains only code for the core
-** SQLite library.
+** the "sqlite3.h" header file at hand, you will find a copy embedded within
+** the text of this file. Search for "Begin file sqlite3.h" to find the start
+** of the embedded sqlite3.h header file.) Additional code files may be needed
+** if you want a wrapper to interface SQLite with your choice of programming
+** language. The code for the "sqlite3" command-line shell is also in a
+** separate file. This file contains only code for the core SQLite library.
**
-** This amalgamation was generated on 2008-05-14 16:20:58 UTC.
+** This amalgamation was generated on 2009-10-14 11:35:02 UTC.
*/
#define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1
@@ -41,12 +41,38 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
-** @(#) $Id: sqliteInt.h,v 1.704 2008/05/13 13:27:34 drh Exp $
*/
#ifndef _SQLITEINT_H_
#define _SQLITEINT_H_
/*
+** These #defines should enable >2GB file support on POSIX if the
+** underlying operating system supports it. If the OS lacks
+** large file support, or if the OS is windows, these should be no-ops.
+**
+** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any
+** system #includes. Hence, this block of code must be the very first
+** code in all source files.
+**
+** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
+** on the compiler command line. This is necessary if you are compiling
+** on a recent machine (ex: Red Hat 7.2) but you want your code to work
+** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2
+** without this option, LFS is enable. But LFS does not exist in the kernel
+** in Red Hat 6.0, so the code won't work. Hence, for maximum binary
+** portability you should omit LFS.
+**
+** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later.
+*/
+#ifndef SQLITE_DISABLE_LFS
+# define _LARGE_FILE 1
+# ifndef _FILE_OFFSET_BITS
+# define _FILE_OFFSET_BITS 64
+# endif
+# define _LARGEFILE_SOURCE 1
+#endif
+
+/*
** Include the configuration header output by 'configure' if we're using the
** autoconf-based build
*/
@@ -70,7 +96,7 @@
**
** This file defines various limits of what SQLite can process.
**
-** @(#) $Id: sqliteLimit.h,v 1.8 2008/03/26 15:56:22 drh Exp $
+** @(#) $Id: sqliteLimit.h,v 1.10 2009/01/10 16:15:09 danielk1977 Exp $
*/
/*
@@ -154,7 +180,7 @@
** The maximum number of arguments to an SQL function.
*/
#ifndef SQLITE_MAX_FUNCTION_ARG
-# define SQLITE_MAX_FUNCTION_ARG 100
+# define SQLITE_MAX_FUNCTION_ARG 127
#endif
/*
@@ -188,6 +214,13 @@
/* Maximum page size. The upper bound on this value is 32768. This a limit
** imposed by the necessity of storing the value in a 2-byte unsigned integer
** and the fact that the page size must be a power of 2.
+**
+** If this limit is changed, then the compiled library is technically
+** incompatible with an SQLite library compiled with a different limit. If
+** a process operating on a database with a page-size of 65536 bytes
+** crashes, then an instance of SQLite compiled with the default page-size
+** limit will not be able to rollback the aborted transaction. This could
+** lead to database corruption.
*/
#ifndef SQLITE_MAX_PAGE_SIZE
# define SQLITE_MAX_PAGE_SIZE 32768
@@ -240,6 +273,21 @@
# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
#endif
+/*
+** Maximum depth of recursion for triggers.
+**
+** A value of 1 means that a trigger program will not be able to itself
+** fire any triggers. A value of 0 means that no trigger programs at all
+** may be executed.
+*/
+#ifndef SQLITE_MAX_TRIGGER_DEPTH
+#if defined(SQLITE_SMALL_STACK)
+# define SQLITE_MAX_TRIGGER_DEPTH 10
+#else
+# define SQLITE_MAX_TRIGGER_DEPTH 1000
+#endif
+#endif
+
/************** End of sqliteLimit.h *****************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
@@ -249,11 +297,13 @@
#pragma warn -ccc /* Condition is always true or false */
#pragma warn -aus /* Assigned value is never used */
#pragma warn -csu /* Comparing signed and unsigned */
-#pragma warn -spa /* Suspicous pointer arithmetic */
+#pragma warn -spa /* Suspicious pointer arithmetic */
#endif
/* Needed for various definitions... */
-#define _GNU_SOURCE
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
/*
** Include standard header files as necessary
@@ -265,61 +315,38 @@
#include <inttypes.h>
#endif
-/*
-** A macro used to aid in coverage testing. When doing coverage
-** testing, the condition inside the argument must be evaluated
-** both true and false in order to get full branch coverage.
-** This macro can be inserted to ensure adequate test coverage
-** in places where simple condition/decision coverage is inadequate.
-*/
-#ifdef SQLITE_COVERAGE_TEST
-SQLITE_PRIVATE void sqlite3Coverage(int);
-# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
-#else
-# define testcase(X)
-#endif
-
-
-/*
-** The macro unlikely() is a hint that surrounds a boolean
-** expression that is usually false. Macro likely() surrounds
-** a boolean expression that is usually true. GCC is able to
-** use these hints to generate better code, sometimes.
-*/
-#if defined(__GNUC__) && 0
-# define likely(X) __builtin_expect((X),1)
-# define unlikely(X) __builtin_expect((X),0)
-#else
-# define likely(X) !!(X)
-# define unlikely(X) !!(X)
-#endif
-
+#define SQLITE_INDEX_SAMPLES 10
/*
-** These #defines should enable >2GB file support on Posix if the
-** underlying operating system supports it. If the OS lacks
-** large file support, or if the OS is windows, these should be no-ops.
+** This macro is used to "hide" some ugliness in casting an int
+** value to a ptr value under the MSVC 64-bit compiler. Casting
+** non 64-bit values to ptr types results in a "hard" error with
+** the MSVC 64-bit compiler which this attempts to avoid.
**
-** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any
-** system #includes. Hence, this block of code must be the very first
-** code in all source files.
+** A simple compiler pragma or casting sequence could not be found
+** to correct this in all situations, so this macro was introduced.
**
-** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
-** on the compiler command line. This is necessary if you are compiling
-** on a recent machine (ex: RedHat 7.2) but you want your code to work
-** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2
-** without this option, LFS is enable. But LFS does not exist in the kernel
-** in RedHat 6.0, so the code won't work. Hence, for maximum binary
-** portability you should omit LFS.
+** It could be argued that the intptr_t type could be used in this
+** case, but that type is not available on all compilers, or
+** requires the #include of specific headers which differs between
+** platforms.
**
-** Similar is true for MacOS. LFS is only supported on MacOS 9 and later.
+** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on
+** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)).
+** So we have to define the macros in different ways depending on the
+** compiler.
*/
-#ifndef SQLITE_DISABLE_LFS
-# define _LARGE_FILE 1
-# ifndef _FILE_OFFSET_BITS
-# define _FILE_OFFSET_BITS 64
+#if defined(__GNUC__)
+# if defined(HAVE_STDINT_H)
+# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X))
+# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X))
+# else
+# define SQLITE_INT_TO_PTR(X) ((void*)(X))
+# define SQLITE_PTR_TO_INT(X) ((int)(X))
# endif
-# define _LARGEFILE_SOURCE 1
+#else
+# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X])
+# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0))
#endif
@@ -337,6 +364,16 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
#endif
/*
+** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1.
+** It determines whether or not the features related to
+** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can
+** be overridden at runtime using the sqlite3_config() API.
+*/
+#if !defined(SQLITE_DEFAULT_MEMSTATUS)
+# define SQLITE_DEFAULT_MEMSTATUS 1
+#endif
+
+/*
** Exactly one of the following macros must be defined in order to
** specify which memory allocation subsystem to use.
**
@@ -363,16 +400,16 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
#endif
/*
-** If SQLITE_MALLOC_SOFT_LIMIT is defined, then try to keep the
+** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the
** sizes of memory allocations below this value where possible.
*/
-#if defined(SQLITE_POW2_MEMORY_SIZE) && !defined(SQLITE_MALLOC_SOFT_LIMIT)
+#if !defined(SQLITE_MALLOC_SOFT_LIMIT)
# define SQLITE_MALLOC_SOFT_LIMIT 1024
#endif
/*
** We need to define _XOPEN_SOURCE as follows in order to enable
-** recursive mutexes on most unix systems. But Mac OS X is different.
+** recursive mutexes on most Unix systems. But Mac OS X is different.
** The _XOPEN_SOURCE define causes problems for Mac OS X we are told,
** so it is omitted there. See ticket #2673.
**
@@ -387,6 +424,9 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */
#endif
+/*
+** The TCL headers are only needed when compiling the TCL bindings.
+*/
#if defined(SQLITE_TCL) || defined(TCLSH)
# include <tcl.h>
#endif
@@ -402,6 +442,92 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
# define NDEBUG 1
#endif
+/*
+** The testcase() macro is used to aid in coverage testing. When
+** doing coverage testing, the condition inside the argument to
+** testcase() must be evaluated both true and false in order to
+** get full branch coverage. The testcase() macro is inserted
+** to help ensure adequate test coverage in places where simple
+** condition/decision coverage is inadequate. For example, testcase()
+** can be used to make sure boundary values are tested. For
+** bitmask tests, testcase() can be used to make sure each bit
+** is significant and used at least once. On switch statements
+** where multiple cases go to the same block of code, testcase()
+** can insure that all cases are evaluated.
+**
+*/
+#ifdef SQLITE_COVERAGE_TEST
+SQLITE_PRIVATE void sqlite3Coverage(int);
+# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
+#else
+# define testcase(X)
+#endif
+
+/*
+** The TESTONLY macro is used to enclose variable declarations or
+** other bits of code that are needed to support the arguments
+** within testcase() and assert() macros.
+*/
+#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST)
+# define TESTONLY(X) X
+#else
+# define TESTONLY(X)
+#endif
+
+/*
+** Sometimes we need a small amount of code such as a variable initialization
+** to setup for a later assert() statement. We do not want this code to
+** appear when assert() is disabled. The following macro is therefore
+** used to contain that setup code. The "VVA" acronym stands for
+** "Verification, Validation, and Accreditation". In other words, the
+** code within VVA_ONLY() will only run during verification processes.
+*/
+#ifndef NDEBUG
+# define VVA_ONLY(X) X
+#else
+# define VVA_ONLY(X)
+#endif
+
+/*
+** The ALWAYS and NEVER macros surround boolean expressions which
+** are intended to always be true or false, respectively. Such
+** expressions could be omitted from the code completely. But they
+** are included in a few cases in order to enhance the resilience
+** of SQLite to unexpected behavior - to make the code "self-healing"
+** or "ductile" rather than being "brittle" and crashing at the first
+** hint of unplanned behavior.
+**
+** In other words, ALWAYS and NEVER are added for defensive code.
+**
+** When doing coverage testing ALWAYS and NEVER are hard-coded to
+** be true and false so that the unreachable code then specify will
+** not be counted as untested code.
+*/
+#if defined(SQLITE_COVERAGE_TEST)
+# define ALWAYS(X) (1)
+# define NEVER(X) (0)
+#elif !defined(NDEBUG)
+# define ALWAYS(X) ((X)?1:(assert(0),0))
+# define NEVER(X) ((X)?(assert(0),1):0)
+#else
+# define ALWAYS(X) (X)
+# define NEVER(X) (X)
+#endif
+
+/*
+** The macro unlikely() is a hint that surrounds a boolean
+** expression that is usually false. Macro likely() surrounds
+** a boolean expression that is usually true. GCC is able to
+** use these hints to generate better code, sometimes.
+*/
+#if defined(__GNUC__) && 0
+# define likely(X) __builtin_expect((X),1)
+# define unlikely(X) __builtin_expect((X),0)
+#else
+# define likely(X) !!(X)
+# define unlikely(X) !!(X)
+#endif
+
/************** Include sqlite3.h in the middle of sqliteInt.h ***************/
/************** Begin file sqlite3.h *****************************************/
/*
@@ -423,9 +549,9 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
**
** Some of the definitions that are in this file are marked as
** "experimental". Experimental interfaces are normally new
-** features recently added to SQLite. We do not anticipate changes
-** to experimental interfaces but reserve to make minor changes if
-** experience from use "in the wild" suggest such changes are prudent.
+** features recently added to SQLite. We do not anticipate changes
+** to experimental interfaces but reserve the right to make minor changes
+** if experience from use "in the wild" suggest such changes are prudent.
**
** The official C-language API documentation for SQLite is derived
** from comments in this file. This file is the authoritative source
@@ -435,8 +561,6 @@ SQLITE_PRIVATE void sqlite3Coverage(int);
** The makefile makes some minor changes to this file (such as inserting
** the version number) and changes its name to "sqlite3.h" as
** part of the build process.
-**
-** @(#) $Id: sqlite.h.in,v 1.312 2008/05/12 12:39:56 drh Exp $
*/
#ifndef _SQLITE3_H_
#define _SQLITE3_H_
@@ -464,9 +588,29 @@ extern "C" {
# define SQLITE_EXTERN extern
#endif
+#ifndef SQLITE_API
+# define SQLITE_API
+#endif
+
+
/*
-** Make sure these symbols where not defined by some previous header
-** file.
+** These no-op macros are used in front of interfaces to mark those
+** interfaces as either deprecated or experimental. New applications
+** should not use deprecated interfaces - they are support for backwards
+** compatibility only. Application writers should be aware that
+** experimental interfaces are subject to change in point releases.
+**
+** These macros used to resolve to various kinds of compiler magic that
+** would generate warning messages when they were used. But that
+** compiler magic ended up generating such a flurry of bug reports
+** that we have taken it all out and gone back to using simple
+** noop macros.
+*/
+#define SQLITE_DEPRECATED
+#define SQLITE_EXPERIMENTAL
+
+/*
+** Ensure these symbols were not defined by some previous header file.
*/
#ifdef SQLITE_VERSION
# undef SQLITE_VERSION
@@ -476,130 +620,143 @@ extern "C" {
#endif
/*
-** CAPI3REF: Compile-Time Library Version Numbers {F10010}
+** CAPI3REF: Compile-Time Library Version Numbers {H10010} <S60100>
**
** The SQLITE_VERSION and SQLITE_VERSION_NUMBER #defines in
** the sqlite3.h file specify the version of SQLite with which
** that header file is associated.
**
-** The "version" of SQLite is a string of the form "X.Y.Z".
-** The phrase "alpha" or "beta" might be appended after the Z.
-** The X value is major version number always 3 in SQLite3.
-** The X value only changes when backwards compatibility is
-** broken and we intend to never break
-** backwards compatibility. The Y value is the minor version
-** number and only changes when
+** The "version" of SQLite is a string of the form "W.X.Y" or "W.X.Y.Z".
+** The W value is major version number and is always 3 in SQLite3.
+** The W value only changes when backwards compatibility is
+** broken and we intend to never break backwards compatibility.
+** The X value is the minor version number and only changes when
** there are major feature enhancements that are forwards compatible
-** but not backwards compatible. The Z value is release number
-** and is incremented with
-** each release but resets back to 0 when Y is incremented.
+** but not backwards compatible.
+** The Y value is the release number and is incremented with
+** each release but resets back to 0 whenever X is incremented.
+** The Z value only appears on branch releases.
**
-** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()].
+** The SQLITE_VERSION_NUMBER is an integer that is computed as
+** follows:
**
-** INVARIANTS:
+** <blockquote><pre>
+** SQLITE_VERSION_NUMBER = W*1000000 + X*1000 + Y
+** </pre></blockquote>
**
-** {F10011} The SQLITE_VERSION #define in the sqlite3.h header file
-** evaluates to a string literal that is the SQLite version
-** with which the header file is associated.
+** Since version 3.6.18, SQLite source code has been stored in the
+** <a href="http://www.fossil-scm.org/">fossil configuration management
+** system</a>. The SQLITE_SOURCE_ID
+** macro is a string which identifies a particular check-in of SQLite
+** within its configuration management system. The string contains the
+** date and time of the check-in (UTC) and an SHA1 hash of the entire
+** source tree.
**
-** {F10014} The SQLITE_VERSION_NUMBER #define resolves to an integer
-** with the value (X*1000000 + Y*1000 + Z) where X, Y, and
-** Z are the major version, minor version, and release number.
+** See also: [sqlite3_libversion()],
+** [sqlite3_libversion_number()], [sqlite3_sourceid()],
+** [sqlite_version()] and [sqlite_source_id()].
+**
+** Requirements: [H10011] [H10014]
*/
-#define SQLITE_VERSION "3.5.9"
-#define SQLITE_VERSION_NUMBER 3005009
+#define SQLITE_VERSION "3.6.19"
+#define SQLITE_VERSION_NUMBER 3006019
+#define SQLITE_SOURCE_ID "2009-10-14 11:33:55 c1d499afc50d54b376945b4efb65c56c787a073d"
/*
-** CAPI3REF: Run-Time Library Version Numbers {F10020}
+** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
** KEYWORDS: sqlite3_version
**
-** These features provide the same information as the [SQLITE_VERSION]
-** and [SQLITE_VERSION_NUMBER] #defines in the header, but are associated
-** with the library instead of the header file. Cautious programmers might
-** include a check in their application to verify that
-** sqlite3_libversion_number() always returns the value
-** [SQLITE_VERSION_NUMBER].
+** These interfaces provide the same information as the [SQLITE_VERSION],
+** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] #defines in the header,
+** but are associated with the library instead of the header file. Cautious
+** programmers might include assert() statements in their application to
+** verify that values returned by these interfaces match the macros in
+** the header, and thus insure that the application is
+** compiled with matching library and header files.
+**
+** <blockquote><pre>
+** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
+** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
+** assert( strcmp(sqlite3_libversion,SQLITE_VERSION)==0 );
+** </pre></blockquote>
**
** The sqlite3_libversion() function returns the same information as is
** in the sqlite3_version[] string constant. The function is provided
** for use in DLLs since DLL users usually do not have direct access to string
-** constants within the DLL.
-**
-** INVARIANTS:
+** constants within the DLL. Similarly, the sqlite3_sourceid() function
+** returns the same information as is in the [SQLITE_SOURCE_ID] #define of
+** the header file.
**
-** {F10021} The [sqlite3_libversion_number()] interface returns an integer
-** equal to [SQLITE_VERSION_NUMBER].
+** See also: [sqlite_version()] and [sqlite_source_id()].
**
-** {F10022} The [sqlite3_version] string constant contains the text of the
-** [SQLITE_VERSION] string.
-**
-** {F10023} The [sqlite3_libversion()] function returns
-** a pointer to the [sqlite3_version] string constant.
+** Requirements: [H10021] [H10022] [H10023]
*/
-SQLITE_API const char sqlite3_version[];
+SQLITE_API const char sqlite3_version[] = SQLITE_VERSION;
SQLITE_API const char *sqlite3_libversion(void);
+SQLITE_API const char *sqlite3_sourceid(void);
SQLITE_API int sqlite3_libversion_number(void);
/*
-** CAPI3REF: Test To See If The Library Is Threadsafe {F10100}
+** CAPI3REF: Test To See If The Library Is Threadsafe {H10100} <S60100>
**
** SQLite can be compiled with or without mutexes. When
-** the SQLITE_THREADSAFE C preprocessor macro is true, mutexes
-** are enabled and SQLite is threadsafe. When that macro is false,
+** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes
+** are enabled and SQLite is threadsafe. When the
+** [SQLITE_THREADSAFE] macro is 0,
** the mutexes are omitted. Without the mutexes, it is not safe
-** to use SQLite from more than one thread.
+** to use SQLite concurrently from more than one thread.
**
-** There is a measurable performance penalty for enabling mutexes.
+** Enabling mutexes incurs a measurable performance penalty.
** So if speed is of utmost importance, it makes sense to disable
** the mutexes. But for maximum safety, mutexes should be enabled.
** The default behavior is for mutexes to be enabled.
**
-** This interface can be used by a program to make sure that the
+** This interface can be used by an application to make sure that the
** version of SQLite that it is linking against was compiled with
-** the desired setting of the SQLITE_THREADSAFE macro.
+** the desired setting of the [SQLITE_THREADSAFE] macro.
+**
+** This interface only reports on the compile-time mutex setting
+** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with
+** SQLITE_THREADSAFE=1 then mutexes are enabled by default but
+** can be fully or partially disabled using a call to [sqlite3_config()]
+** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD],
+** or [SQLITE_CONFIG_MUTEX]. The return value of this function shows
+** only the default compile-time setting, not any run-time changes
+** to that setting.
**
-** INVARIANTS:
+** See the [threading mode] documentation for additional information.
**
-** {F10101} The [sqlite3_threadsafe()] function returns nonzero if
-** SQLite was compiled with its mutexes enabled or zero
-** if SQLite was compiled with mutexes disabled.
+** Requirements: [H10101] [H10102]
*/
SQLITE_API int sqlite3_threadsafe(void);
/*
-** CAPI3REF: Database Connection Handle {F12000}
+** CAPI3REF: Database Connection Handle {H12000} <S40200>
** KEYWORDS: {database connection} {database connections}
**
-** Each open SQLite database is represented by pointer to an instance of the
-** opaque structure named "sqlite3". It is useful to think of an sqlite3
+** Each open SQLite database is represented by a pointer to an instance of
+** the opaque structure named "sqlite3". It is useful to think of an sqlite3
** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces are its constructors
-** and [sqlite3_close()] is its destructor. There are many other interfaces
-** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and
-** [sqlite3_busy_timeout()] to name but three) that are methods on this
-** object.
+** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()]
+** is its destructor. There are many other interfaces (such as
+** [sqlite3_prepare_v2()], [sqlite3_create_function()], and
+** [sqlite3_busy_timeout()] to name but three) that are methods on an
+** sqlite3 object.
*/
typedef struct sqlite3 sqlite3;
-
/*
-** CAPI3REF: 64-Bit Integer Types {F10200}
+** CAPI3REF: 64-Bit Integer Types {H10200} <S10110>
** KEYWORDS: sqlite_int64 sqlite_uint64
**
** Because there is no cross-platform way to specify 64-bit integer types
** SQLite includes typedefs for 64-bit signed and unsigned integers.
**
-** The sqlite3_int64 and sqlite3_uint64 are the preferred type
-** definitions. The sqlite_int64 and sqlite_uint64 types are
-** supported for backwards compatibility only.
+** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions.
+** The sqlite_int64 and sqlite_uint64 types are supported for backwards
+** compatibility only.
**
-** INVARIANTS:
-**
-** {F10201} The [sqlite_int64] and [sqlite3_int64] types specify a
-** 64-bit signed integer.
-**
-** {F10202} The [sqlite_uint64] and [sqlite3_uint64] types specify
-** a 64-bit unsigned integer.
+** Requirements: [H10201] [H10202]
*/
#ifdef SQLITE_INT64_TYPE
typedef SQLITE_INT64_TYPE sqlite_int64;
@@ -616,50 +773,41 @@ typedef sqlite_uint64 sqlite3_uint64;
/*
** If compiling for a processor that lacks floating point support,
-** substitute integer for floating-point
+** substitute integer for floating-point.
*/
#ifdef SQLITE_OMIT_FLOATING_POINT
# define double sqlite3_int64
#endif
/*
-** CAPI3REF: Closing A Database Connection {F12010}
-**
-** This routine is the destructor for the [sqlite3] object.
-**
-** Applications should [sqlite3_finalize | finalize] all
-** [prepared statements] and
-** [sqlite3_blob_close | close] all [sqlite3_blob | BLOBs]
-** associated with the [sqlite3] object prior
-** to attempting to close the [sqlite3] object.
-**
-** <todo>What happens to pending transactions? Are they
-** rolled back, or abandoned?</todo>
+** CAPI3REF: Closing A Database Connection {H12010} <S30100><S40200>
**
-** INVARIANTS:
+** This routine is the destructor for the [sqlite3] object.
**
-** {F12011} The [sqlite3_close()] interface destroys an [sqlite3] object
-** allocated by a prior call to [sqlite3_open()],
-** [sqlite3_open16()], or [sqlite3_open_v2()].
+** Applications should [sqlite3_finalize | finalize] all [prepared statements]
+** and [sqlite3_blob_close | close] all [BLOB handles] associated with
+** the [sqlite3] object prior to attempting to close the object.
+** The [sqlite3_next_stmt()] interface can be used to locate all
+** [prepared statements] associated with a [database connection] if desired.
+** Typical code might look like this:
**
-** {F12012} The [sqlite3_close()] function releases all memory used by the
-** connection and closes all open files.
-**
-** {F12013} If the database connection contains
-** [prepared statements] that have not been
-** finalized by [sqlite3_finalize()], then [sqlite3_close()]
-** returns [SQLITE_BUSY] and leaves the connection open.
-**
-** {F12014} Giving sqlite3_close() a NULL pointer is a harmless no-op.
+** <blockquote><pre>
+** sqlite3_stmt *pStmt;
+** while( (pStmt = sqlite3_next_stmt(db, 0))!=0 ){
+** &nbsp; sqlite3_finalize(pStmt);
+** }
+** </pre></blockquote>
**
-** LIMITATIONS:
+** If [sqlite3_close()] is invoked while a transaction is open,
+** the transaction is automatically rolled back.
**
-** {U12015} The parameter to [sqlite3_close()] must be an [sqlite3] object
-** pointer previously obtained from [sqlite3_open()] or the
-** equivalent, or NULL.
+** The C parameter to [sqlite3_close(C)] must be either a NULL
+** pointer or an [sqlite3] object pointer obtained
+** from [sqlite3_open()], [sqlite3_open16()], or
+** [sqlite3_open_v2()], and not previously closed.
**
-** {U12016} The parameter to [sqlite3_close()] must not have been previously
-** closed.
+** Requirements:
+** [H12011] [H12012] [H12013] [H12014] [H12015] [H12019]
*/
SQLITE_API int sqlite3_close(sqlite3 *);
@@ -671,115 +819,67 @@ SQLITE_API int sqlite3_close(sqlite3 *);
typedef int (*sqlite3_callback)(void*,int,char**, char**);
/*
-** CAPI3REF: One-Step Query Execution Interface {F12100}
+** CAPI3REF: One-Step Query Execution Interface {H12100} <S10000>
**
-** The sqlite3_exec() interface is a convenient way of running
-** one or more SQL statements without a lot of C code. The
-** SQL statements are passed in as the second parameter to
-** sqlite3_exec(). The statements are evaluated one by one
-** until either an error or an interrupt is encountered or
-** until they are all done. The 3rd parameter is an optional
-** callback that is invoked once for each row of any query results
-** produced by the SQL statements. The 5th parameter tells where
+** The sqlite3_exec() interface is a convenient way of running one or more
+** SQL statements without having to write a lot of C code. The UTF-8 encoded
+** SQL statements are passed in as the second parameter to sqlite3_exec().
+** The statements are evaluated one by one until either an error or
+** an interrupt is encountered, or until they are all done. The 3rd parameter
+** is an optional callback that is invoked once for each row of any query
+** results produced by the SQL statements. The 5th parameter tells where
** to write any error messages.
**
+** The error message passed back through the 5th parameter is held
+** in memory obtained from [sqlite3_malloc()]. To avoid a memory leak,
+** the calling application should call [sqlite3_free()] on any error
+** message returned through the 5th parameter when it has finished using
+** the error message.
+**
+** If the SQL statement in the 2nd parameter is NULL or an empty string
+** or a string containing only whitespace and comments, then no SQL
+** statements are evaluated and the database is not changed.
+**
** The sqlite3_exec() interface is implemented in terms of
** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()].
-** The sqlite3_exec() routine does nothing that cannot be done
+** The sqlite3_exec() routine does nothing to the database that cannot be done
** by [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()].
-** The sqlite3_exec() is just a convenient wrapper.
-**
-** INVARIANTS:
-**
-** {F12101} The [sqlite3_exec()] interface evaluates zero or more UTF-8
-** encoded, semicolon-separated, SQL statements in the
-** zero-terminated string of its 2nd parameter within the
-** context of the [sqlite3] object given in the 1st parameter.
-**
-** {F12104} The return value of [sqlite3_exec()] is SQLITE_OK if all
-** SQL statements run successfully.
-**
-** {F12105} The return value of [sqlite3_exec()] is an appropriate
-** non-zero error code if any SQL statement fails.
-**
-** {F12107} If one or more of the SQL statements handed to [sqlite3_exec()]
-** return results and the 3rd parameter is not NULL, then
-** the callback function specified by the 3rd parameter is
-** invoked once for each row of result.
-**
-** {F12110} If the callback returns a non-zero value then [sqlite3_exec()]
-** will aborted the SQL statement it is currently evaluating,
-** skip all subsequent SQL statements, and return [SQLITE_ABORT].
-** <todo>What happens to *errmsg here? Does the result code for
-** sqlite3_errcode() get set?</todo>
-**
-** {F12113} The [sqlite3_exec()] routine will pass its 4th parameter through
-** as the 1st parameter of the callback.
-**
-** {F12116} The [sqlite3_exec()] routine sets the 2nd parameter of its
-** callback to be the number of columns in the current row of
-** result.
**
-** {F12119} The [sqlite3_exec()] routine sets the 3rd parameter of its
-** callback to be an array of pointers to strings holding the
-** values for each column in the current result set row as
-** obtained from [sqlite3_column_text()].
+** The first parameter to [sqlite3_exec()] must be an valid and open
+** [database connection].
**
-** {F12122} The [sqlite3_exec()] routine sets the 4th parameter of its
-** callback to be an array of pointers to strings holding the
-** names of result columns as obtained from [sqlite3_column_name()].
+** The database connection must not be closed while
+** [sqlite3_exec()] is running.
**
-** {F12125} If the 3rd parameter to [sqlite3_exec()] is NULL then
-** [sqlite3_exec()] never invokes a callback. All query
-** results are silently discarded.
+** The calling function should use [sqlite3_free()] to free
+** the memory that *errmsg is left pointing at once the error
+** message is no longer needed.
**
-** {F12128} If an error occurs while parsing or evaluating any of the SQL
-** statements handed to [sqlite3_exec()] then [sqlite3_exec()] will
-** return an [error code] other than [SQLITE_OK].
+** The SQL statement text in the 2nd parameter to [sqlite3_exec()]
+** must remain unchanged while [sqlite3_exec()] is running.
**
-** {F12131} If an error occurs while parsing or evaluating any of the SQL
-** handed to [sqlite3_exec()] and if the 5th parameter (errmsg)
-** to [sqlite3_exec()] is not NULL, then an error message is
-** allocated using the equivalent of [sqlite3_mprintf()] and
-** *errmsg is made to point to that message.
-**
-** {F12134} The [sqlite3_exec()] routine does not change the value of
-** *errmsg if errmsg is NULL or if there are no errors.
-**
-** {F12137} The [sqlite3_exec()] function sets the error code and message
-** accessible via [sqlite3_errcode()], [sqlite3_errmsg()], and
-** [sqlite3_errmsg16()].
-**
-** LIMITATIONS:
-**
-** {U12141} The first parameter to [sqlite3_exec()] must be an valid and open
-** [database connection].
-**
-** {U12142} The database connection must not be closed while
-** [sqlite3_exec()] is running.
-**
-** {U12143} The calling function is should use [sqlite3_free()] to free
-** the memory that *errmsg is left pointing at once the error
-** message is no longer needed.
-**
-** {U12145} The SQL statement text in the 2nd parameter to [sqlite3_exec()]
-** must remain unchanged while [sqlite3_exec()] is running.
+** Requirements:
+** [H12101] [H12102] [H12104] [H12105] [H12107] [H12110] [H12113] [H12116]
+** [H12119] [H12122] [H12125] [H12131] [H12134] [H12137] [H12138]
*/
SQLITE_API int sqlite3_exec(
sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluted */
+ const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
/*
-** CAPI3REF: Result Codes {F10210}
+** CAPI3REF: Result Codes {H10210} <S10700>
** KEYWORDS: SQLITE_OK {error code} {error codes}
+** KEYWORDS: {result code} {result codes}
**
** Many SQLite functions return an integer result code from the set shown
** here in order to indicates success or failure.
**
+** New error codes may be added in future versions of SQLite.
+**
** See also: [SQLITE_IOERR_READ | extended result codes]
*/
#define SQLITE_OK 0 /* Successful result */
@@ -815,20 +915,20 @@ SQLITE_API int sqlite3_exec(
/* end-of-error-codes */
/*
-** CAPI3REF: Extended Result Codes {F10220}
+** CAPI3REF: Extended Result Codes {H10220} <S10700>
** KEYWORDS: {extended error code} {extended error codes}
-** KEYWORDS: {extended result codes}
+** KEYWORDS: {extended result code} {extended result codes}
**
** In its default configuration, SQLite API routines return one of 26 integer
-** [SQLITE_OK | result codes]. However, experience has shown that
-** many of these result codes are too course-grained. They do not provide as
+** [SQLITE_OK | result codes]. However, experience has shown that many of
+** these result codes are too coarse-grained. They do not provide as
** much information about problems as programmers might like. In an effort to
** address this, newer versions of SQLite (version 3.3.8 and later) include
** support for additional result codes that provide more detailed information
** about errors. The extended result codes are enabled or disabled
-** for each database connection using the [sqlite3_extended_result_codes()]
-** API.
-**
+** on a per database connection basis using the
+** [sqlite3_extended_result_codes()] API.
+**
** Some of the available extended result codes are listed here.
** One may expect the number of extended result codes will be expand
** over time. Software that uses extended result codes should expect
@@ -836,56 +936,53 @@ SQLITE_API int sqlite3_exec(
**
** The SQLITE_OK result code will never be extended. It will always
** be exactly zero.
-**
-** INVARIANTS:
-**
-** {F10223} The symbolic name for an extended result code always contains
-** a related primary result code as a prefix.
-**
-** {F10224} Primary result code names contain a single "_" character.
-**
-** {F10225} Extended result code names contain two or more "_" characters.
-**
-** {F10226} The numeric value of an extended result code contains the
-** numeric value of its corresponding primary result code in
-** its least significant 8 bits.
*/
-#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
-#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
-#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
-#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
-#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
-#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
-#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
-#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
-#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
-#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
-#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
-#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
-
-/*
-** CAPI3REF: Flags For File Open Operations {F10230}
+#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
+#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
+#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
+#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
+#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
+#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
+#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
+#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
+#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
+#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
+#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
+#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
+#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
+#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
+#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
+#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
+#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
+#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) )
+
+/*
+** CAPI3REF: Flags For File Open Operations {H10230} <H11120> <H12700>
**
** These bit values are intended for use in the
** 3rd parameter to the [sqlite3_open_v2()] interface and
** in the 4th parameter to the xOpen method of the
** [sqlite3_vfs] object.
*/
-#define SQLITE_OPEN_READONLY 0x00000001
-#define SQLITE_OPEN_READWRITE 0x00000002
-#define SQLITE_OPEN_CREATE 0x00000004
-#define SQLITE_OPEN_DELETEONCLOSE 0x00000008
-#define SQLITE_OPEN_EXCLUSIVE 0x00000010
-#define SQLITE_OPEN_MAIN_DB 0x00000100
-#define SQLITE_OPEN_TEMP_DB 0x00000200
-#define SQLITE_OPEN_TRANSIENT_DB 0x00000400
-#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800
-#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000
-#define SQLITE_OPEN_SUBJOURNAL 0x00002000
-#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000
-
-/*
-** CAPI3REF: Device Characteristics {F10240}
+#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */
+#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */
+#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */
+#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */
+#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */
+#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */
+#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */
+#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */
+#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
+#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
+
+/*
+** CAPI3REF: Device Characteristics {H10240} <H11120>
**
** The xDeviceCapabilities method of the [sqlite3_io_methods]
** object returns an integer which is a vector of the these
@@ -917,7 +1014,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_IOCAP_SEQUENTIAL 0x00000400
/*
-** CAPI3REF: File Locking Levels {F10250}
+** CAPI3REF: File Locking Levels {H10250} <H11120> <H11310>
**
** SQLite uses one of these integer values as the second
** argument to calls it makes to the xLock() and xUnlock() methods
@@ -930,7 +1027,7 @@ SQLITE_API int sqlite3_exec(
#define SQLITE_LOCK_EXCLUSIVE 4
/*
-** CAPI3REF: Synchronization Type Flags {F10260}
+** CAPI3REF: Synchronization Type Flags {H10260} <H11120>
**
** When SQLite invokes the xSync() method of an
** [sqlite3_io_methods] object it uses a combination of
@@ -938,20 +1035,21 @@ SQLITE_API int sqlite3_exec(
**
** When the SQLITE_SYNC_DATAONLY flag is used, it means that the
** sync operation only needs to flush data to mass storage. Inode
-** information need not be flushed. The SQLITE_SYNC_NORMAL flag means
-** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means
-** to use Mac OS-X style fullsync instead of fsync().
+** information need not be flushed. If the lower four bits of the flag
+** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics.
+** If the lower four bits equal SQLITE_SYNC_FULL, that means
+** to use Mac OS X style fullsync instead of fsync().
*/
#define SQLITE_SYNC_NORMAL 0x00002
#define SQLITE_SYNC_FULL 0x00003
#define SQLITE_SYNC_DATAONLY 0x00010
-
/*
-** CAPI3REF: OS Interface Open File Handle {F11110}
+** CAPI3REF: OS Interface Open File Handle {H11110} <S20110>
**
-** An [sqlite3_file] object represents an open file in the OS
-** interface layer. Individual OS interface implementations will
+** An [sqlite3_file] object represents an open file in the
+** [sqlite3_vfs | OS interface layer]. Individual OS interface
+** implementations will
** want to subclass this object by appending additional fields
** for their own use. The pMethods entry is a pointer to an
** [sqlite3_io_methods] object that defines methods for performing
@@ -963,19 +1061,26 @@ struct sqlite3_file {
};
/*
-** CAPI3REF: OS Interface File Virtual Methods Object {F11120}
+** CAPI3REF: OS Interface File Virtual Methods Object {H11120} <S20110>
+**
+** Every file opened by the [sqlite3_vfs] xOpen method populates an
+** [sqlite3_file] object (or, more commonly, a subclass of the
+** [sqlite3_file] object) with a pointer to an instance of this object.
+** This object defines the methods used to perform various operations
+** against the open file represented by the [sqlite3_file] object.
**
-** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to
-** an instance of this object. This object defines the
-** methods used to perform various operations against the open file.
+** If the xOpen method sets the sqlite3_file.pMethods element
+** to a non-NULL pointer, then the sqlite3_io_methods.xClose method
+** may be invoked even if the xOpen reported that it failed. The
+** only way to prevent a call to xClose following a failed xOpen
+** is for the xOpen to set the sqlite3_file.pMethods element to NULL.
**
** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or
** [SQLITE_SYNC_FULL]. The first choice is the normal fsync().
-* The second choice is an
-** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to
-** indicate that only the data of the file and not its inode needs to be
-** synced.
-**
+** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY]
+** flag may be ORed in to indicate that only the data of the file
+** and not its inode needs to be synced.
+**
** The integer values to xLock() and xUnlock() are one of
** <ul>
** <li> [SQLITE_LOCK_NONE],
@@ -984,26 +1089,24 @@ struct sqlite3_file {
** <li> [SQLITE_LOCK_PENDING], or
** <li> [SQLITE_LOCK_EXCLUSIVE].
** </ul>
-** xLock() increases the lock. xUnlock() decreases the lock.
-** The xCheckReservedLock() method looks
-** to see if any database connection, either in this
-** process or in some other process, is holding an RESERVED,
+** xLock() increases the lock. xUnlock() decreases the lock.
+** The xCheckReservedLock() method checks whether any database connection,
+** either in this process or in some other process, is holding a RESERVED,
** PENDING, or EXCLUSIVE lock on the file. It returns true
-** if such a lock exists and false if not.
-**
+** if such a lock exists and false otherwise.
+**
** The xFileControl() method is a generic interface that allows custom
** VFS implementations to directly control an open file using the
-** [sqlite3_file_control()] interface. The second "op" argument
-** is an integer opcode. The third
-** argument is a generic pointer which is intended to be a pointer
-** to a structure that may contain arguments or space in which to
+** [sqlite3_file_control()] interface. The second "op" argument is an
+** integer opcode. The third argument is a generic pointer intended to
+** point to a structure that may contain arguments or space in which to
** write return values. Potential uses for xFileControl() might be
** functions to enable blocking locks with timeouts, to change the
** locking strategy (for example to use dot-file locks), to inquire
** about the status of a lock, or to break stale locks. The SQLite
-** core reserves opcodes less than 100 for its own use.
+** core reserves all opcodes less than 100 for its own use.
** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available.
-** Applications that define a custom xFileControl method should use opcodes
+** Applications that define a custom xFileControl method should use opcodes
** greater than 100 to avoid conflicts.
**
** The xSectorSize() method returns the sector size of the
@@ -1037,6 +1140,12 @@ struct sqlite3_file {
** way around. The SQLITE_IOCAP_SEQUENTIAL property means that
** information is written to disk in the same order as calls
** to xWrite().
+**
+** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill
+** in the unread portions of the buffer with zeros. A VFS that
+** fails to zero-fill short reads might seem to work. However,
+** failure to zero-fill short reads will eventually lead to
+** database corruption.
*/
typedef struct sqlite3_io_methods sqlite3_io_methods;
struct sqlite3_io_methods {
@@ -1049,7 +1158,7 @@ struct sqlite3_io_methods {
int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize);
int (*xLock)(sqlite3_file*, int);
int (*xUnlock)(sqlite3_file*, int);
- int (*xCheckReservedLock)(sqlite3_file*);
+ int (*xCheckReservedLock)(sqlite3_file*, int *pResOut);
int (*xFileControl)(sqlite3_file*, int op, void *pArg);
int (*xSectorSize)(sqlite3_file*);
int (*xDeviceCharacteristics)(sqlite3_file*);
@@ -1057,10 +1166,10 @@ struct sqlite3_io_methods {
};
/*
-** CAPI3REF: Standard File Control Opcodes {F11310}
+** CAPI3REF: Standard File Control Opcodes {H11310} <S30800>
**
** These integer constants are opcodes for the xFileControl method
-** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()]
+** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()]
** interface.
**
** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This
@@ -1072,9 +1181,12 @@ struct sqlite3_io_methods {
** is defined.
*/
#define SQLITE_FCNTL_LOCKSTATE 1
+#define SQLITE_GET_LOCKPROXYFILE 2
+#define SQLITE_SET_LOCKPROXYFILE 3
+#define SQLITE_LAST_ERRNO 4
/*
-** CAPI3REF: Mutex Handle {F17110}
+** CAPI3REF: Mutex Handle {H17110} <S20130>
**
** The mutex module within SQLite defines [sqlite3_mutex] to be an
** abstract type for a mutex object. The SQLite core never looks
@@ -1086,15 +1198,18 @@ struct sqlite3_io_methods {
typedef struct sqlite3_mutex sqlite3_mutex;
/*
-** CAPI3REF: OS Interface Object {F11140}
+** CAPI3REF: OS Interface Object {H11140} <S20100>
**
-** An instance of this object defines the interface between the
-** SQLite core and the underlying operating system. The "vfs"
+** An instance of the sqlite3_vfs object defines the interface between
+** the SQLite core and the underlying operating system. The "vfs"
** in the name of the object stands for "virtual file system".
**
-** The iVersion field is initially 1 but may be larger for future
-** versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased.
+** The value of the iVersion field is initially 1 but may be larger in
+** future versions of SQLite. Additional fields may be appended to this
+** object when the iVersion value is increased. Note that the structure
+** of the sqlite3_vfs object changes in the transaction between
+** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
+** modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -1104,9 +1219,10 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** the pNext pointer. The [sqlite3_vfs_register()]
** and [sqlite3_vfs_unregister()] interfaces manage this list
** in a thread-safe way. The [sqlite3_vfs_find()] interface
-** searches the list.
+** searches the list. Neither the application code nor the VFS
+** implementation should use the pNext pointer.
**
-** The pNext field is the only field in the sqlite3_vfs
+** The pNext field is the only field in the sqlite3_vfs
** structure that SQLite will ever modify. SQLite will only access
** or modify this field while holding a particular static mutex.
** The application should never modify anything within the sqlite3_vfs
@@ -1115,23 +1231,28 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** The zName field holds the name of the VFS module. The name must
** be unique across all VFS modules.
**
-** {F11141} SQLite will guarantee that the zFilename string passed to
-** xOpen() is a full pathname as generated by xFullPathname() and
-** that the string will be valid and unchanged until xClose() is
-** called. {END} So the [sqlite3_file] can store a pointer to the
+** SQLite will guarantee that the zFilename parameter to xOpen
+** is either a NULL pointer or string obtained
+** from xFullPathname(). SQLite further guarantees that
+** the string will be valid and unchanged until xClose() is
+** called. Because of the previous sentence,
+** the [sqlite3_file] can safely store a pointer to the
** filename if it needs to remember the filename for some reason.
+** If the zFilename parameter is xOpen is a NULL pointer then xOpen
+** must invent its own temporary name for the file. Whenever the
+** xFilename parameter is NULL it will also be the case that the
+** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE].
**
-** {F11142} The flags argument to xOpen() includes all bits set in
+** The flags argument to xOpen() includes all bits set in
** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()]
** or [sqlite3_open16()] is used, then flags includes at least
-** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. {END}
+** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE].
** If xOpen() opens a file read-only then it sets *pOutFlags to
-** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be
-** set.
-**
-** {F11143} SQLite will also add one of the following flags to the xOpen()
+** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set.
+**
+** SQLite will also add one of the following flags to the xOpen()
** call, depending on the object being opened:
-**
+**
** <ul>
** <li> [SQLITE_OPEN_MAIN_DB]
** <li> [SQLITE_OPEN_MAIN_JOURNAL]
@@ -1140,62 +1261,70 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** <li> [SQLITE_OPEN_TRANSIENT_DB]
** <li> [SQLITE_OPEN_SUBJOURNAL]
** <li> [SQLITE_OPEN_MASTER_JOURNAL]
-** </ul> {END}
+** </ul>
**
** The file I/O implementation can use the object type flags to
-** changes the way it deals with files. For example, an application
+** change the way it deals with files. For example, an application
** that does not care about crash recovery or rollback might make
** the open of a journal file a no-op. Writes to this journal would
-** also be no-ops, and any attempt to read the journal would return
-** SQLITE_IOERR. Or the implementation might recognize that a database
-** file will be doing page-aligned sector reads and writes in a random
+** also be no-ops, and any attempt to read the journal would return
+** SQLITE_IOERR. Or the implementation might recognize that a database
+** file will be doing page-aligned sector reads and writes in a random
** order and set up its I/O subsystem accordingly.
-**
-** SQLite might also add one of the following flags to the xOpen
-** method:
-**
+**
+** SQLite might also add one of the following flags to the xOpen method:
+**
** <ul>
** <li> [SQLITE_OPEN_DELETEONCLOSE]
** <li> [SQLITE_OPEN_EXCLUSIVE]
** </ul>
-**
-** {F11145} The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
-** deleted when it is closed. {F11146} The [SQLITE_OPEN_DELETEONCLOSE]
-** will be set for TEMP databases, journals and for subjournals.
-** {F11147} The [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened
-** for exclusive access. This flag is set for all files except
-** for the main database file. {END}
-**
-** {F11148} At least szOsFile bytes of memory are allocated by SQLite
-** to hold the [sqlite3_file] structure passed as the third
-** argument to xOpen. {END} The xOpen method does not have to
-** allocate the structure; it should just fill it in.
-**
-** {F11149} The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
-** to test for the existance of a file,
-** or [SQLITE_ACCESS_READWRITE] to test to see
-** if a file is readable and writable, or [SQLITE_ACCESS_READ]
-** to test to see if a file is at least readable. {END} The file can be a
+**
+** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
+** deleted when it is closed. The [SQLITE_OPEN_DELETEONCLOSE]
+** will be set for TEMP databases, journals and for subjournals.
+**
+** The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction
+** with the [SQLITE_OPEN_CREATE] flag, which are both directly
+** analogous to the O_EXCL and O_CREAT flags of the POSIX open()
+** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the
+** SQLITE_OPEN_CREATE, is used to indicate that file should always
+** be created, and that it is an error if it already exists.
+** It is <i>not</i> used to indicate the file should be opened
+** for exclusive access.
+**
+** At least szOsFile bytes of memory are allocated by SQLite
+** to hold the [sqlite3_file] structure passed as the third
+** argument to xOpen. The xOpen method does not have to
+** allocate the structure; it should just fill it in. Note that
+** the xOpen method must set the sqlite3_file.pMethods to either
+** a valid [sqlite3_io_methods] object or to NULL. xOpen must do
+** this even if the open fails. SQLite expects that the sqlite3_file.pMethods
+** element will be valid after xOpen returns regardless of the success
+** or failure of the xOpen call.
+**
+** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
+** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to
+** test whether a file is readable and writable, or [SQLITE_ACCESS_READ]
+** to test whether a file is at least readable. The file can be a
** directory.
-**
-** {F11150} SQLite will always allocate at least mxPathname+1 bytes for
-** the output buffers for xGetTempname and xFullPathname. {F11151} The exact
-** size of the output buffer is also passed as a parameter to both
-** methods. {END} If the output buffer is not large enough, SQLITE_CANTOPEN
-** should be returned. As this is handled as a fatal error by SQLite,
-** vfs implementations should endeavor to prevent this by setting
-** mxPathname to a sufficiently large value.
-**
+**
+** SQLite will always allocate at least mxPathname+1 bytes for the
+** output buffer xFullPathname. The exact size of the output buffer
+** is also passed as a parameter to both methods. If the output buffer
+** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is
+** handled as a fatal error by SQLite, vfs implementations should endeavor
+** to prevent this by setting mxPathname to a sufficiently large value.
+**
** The xRandomness(), xSleep(), and xCurrentTime() interfaces
** are not strictly a part of the filesystem, but they are
** included in the VFS structure for completeness.
** The xRandomness() function attempts to return nBytes bytes
** of good-quality randomness into zOut. The return value is
-** the actual number of bytes of randomness obtained. The
-** xSleep() method causes the calling thread to sleep for at
+** the actual number of bytes of randomness obtained.
+** The xSleep() method causes the calling thread to sleep for at
** least the number of microseconds given. The xCurrentTime()
-** method returns a Julian Day Number for the current date and
-** time.
+** method returns a Julian Day Number for the current date and time.
+**
*/
typedef struct sqlite3_vfs sqlite3_vfs;
struct sqlite3_vfs {
@@ -1208,134 +1337,540 @@ struct sqlite3_vfs {
int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
int flags, int *pOutFlags);
int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
- int (*xAccess)(sqlite3_vfs*, const char *zName, int flags);
- int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut);
+ int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);
void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
- void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol);
+ void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
void (*xDlClose)(sqlite3_vfs*, void*);
int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
int (*xSleep)(sqlite3_vfs*, int microseconds);
int (*xCurrentTime)(sqlite3_vfs*, double*);
+ int (*xGetLastError)(sqlite3_vfs*, int, char *);
/* New fields may be appended in figure versions. The iVersion
** value will increment whenever this happens. */
};
/*
-** CAPI3REF: Flags for the xAccess VFS method {F11190}
+** CAPI3REF: Flags for the xAccess VFS method {H11190} <H11140>
**
-** {F11191} These integer constants can be used as the third parameter to
+** These integer constants can be used as the third parameter to
** the xAccess method of an [sqlite3_vfs] object. {END} They determine
-** what kind of permissions the xAccess method is
-** looking for. {F11192} With SQLITE_ACCESS_EXISTS, the xAccess method
-** simply checks to see if the file exists. {F11193} With
-** SQLITE_ACCESS_READWRITE, the xAccess method checks to see
-** if the file is both readable and writable. {F11194} With
-** SQLITE_ACCESS_READ the xAccess method
-** checks to see if the file is readable.
+** what kind of permissions the xAccess method is looking for.
+** With SQLITE_ACCESS_EXISTS, the xAccess method
+** simply checks whether the file exists.
+** With SQLITE_ACCESS_READWRITE, the xAccess method
+** checks whether the file is both readable and writable.
+** With SQLITE_ACCESS_READ, the xAccess method
+** checks whether the file is readable.
*/
#define SQLITE_ACCESS_EXISTS 0
#define SQLITE_ACCESS_READWRITE 1
#define SQLITE_ACCESS_READ 2
/*
-** CAPI3REF: Enable Or Disable Extended Result Codes {F12200}
+** CAPI3REF: Initialize The SQLite Library {H10130} <S20000><S30100>
+**
+** The sqlite3_initialize() routine initializes the
+** SQLite library. The sqlite3_shutdown() routine
+** deallocates any resources that were allocated by sqlite3_initialize().
+**
+** A call to sqlite3_initialize() is an "effective" call if it is
+** the first time sqlite3_initialize() is invoked during the lifetime of
+** the process, or if it is the first time sqlite3_initialize() is invoked
+** following a call to sqlite3_shutdown(). Only an effective call
+** of sqlite3_initialize() does any initialization. All other calls
+** are harmless no-ops.
+**
+** A call to sqlite3_shutdown() is an "effective" call if it is the first
+** call to sqlite3_shutdown() since the last sqlite3_initialize(). Only
+** an effective call to sqlite3_shutdown() does any deinitialization.
+** All other calls to sqlite3_shutdown() are harmless no-ops.
+**
+** Among other things, sqlite3_initialize() shall invoke
+** sqlite3_os_init(). Similarly, sqlite3_shutdown()
+** shall invoke sqlite3_os_end().
+**
+** The sqlite3_initialize() routine returns [SQLITE_OK] on success.
+** If for some reason, sqlite3_initialize() is unable to initialize
+** the library (perhaps it is unable to allocate a needed resource such
+** as a mutex) it returns an [error code] other than [SQLITE_OK].
+**
+** The sqlite3_initialize() routine is called internally by many other
+** SQLite interfaces so that an application usually does not need to
+** invoke sqlite3_initialize() directly. For example, [sqlite3_open()]
+** calls sqlite3_initialize() so the SQLite library will be automatically
+** initialized when [sqlite3_open()] is called if it has not be initialized
+** already. However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT]
+** compile-time option, then the automatic calls to sqlite3_initialize()
+** are omitted and the application must call sqlite3_initialize() directly
+** prior to using any other SQLite interface. For maximum portability,
+** it is recommended that applications always invoke sqlite3_initialize()
+** directly prior to using any other SQLite interface. Future releases
+** of SQLite may require this. In other words, the behavior exhibited
+** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the
+** default behavior in some future release of SQLite.
+**
+** The sqlite3_os_init() routine does operating-system specific
+** initialization of the SQLite library. The sqlite3_os_end()
+** routine undoes the effect of sqlite3_os_init(). Typical tasks
+** performed by these routines include allocation or deallocation
+** of static resources, initialization of global variables,
+** setting up a default [sqlite3_vfs] module, or setting up
+** a default configuration using [sqlite3_config()].
+**
+** The application should never invoke either sqlite3_os_init()
+** or sqlite3_os_end() directly. The application should only invoke
+** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init()
+** interface is called automatically by sqlite3_initialize() and
+** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate
+** implementations for sqlite3_os_init() and sqlite3_os_end()
+** are built into SQLite when it is compiled for Unix, Windows, or OS/2.
+** When [custom builds | built for other platforms]
+** (using the [SQLITE_OS_OTHER=1] compile-time
+** option) the application must supply a suitable implementation for
+** sqlite3_os_init() and sqlite3_os_end(). An application-supplied
+** implementation of sqlite3_os_init() or sqlite3_os_end()
+** must return [SQLITE_OK] on success and some other [error code] upon
+** failure.
+*/
+SQLITE_API int sqlite3_initialize(void);
+SQLITE_API int sqlite3_shutdown(void);
+SQLITE_API int sqlite3_os_init(void);
+SQLITE_API int sqlite3_os_end(void);
+
+/*
+** CAPI3REF: Configuring The SQLite Library {H14100} <S20000><S30200>
+** EXPERIMENTAL
+**
+** The sqlite3_config() interface is used to make global configuration
+** changes to SQLite in order to tune SQLite to the specific needs of
+** the application. The default configuration is recommended for most
+** applications and so this routine is usually not necessary. It is
+** provided to support rare applications with unusual needs.
+**
+** The sqlite3_config() interface is not threadsafe. The application
+** must insure that no other SQLite interfaces are invoked by other
+** threads while sqlite3_config() is running. Furthermore, sqlite3_config()
+** may only be invoked prior to library initialization using
+** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
+** Note, however, that sqlite3_config() can be called as part of the
+** implementation of an application-defined [sqlite3_os_init()].
+**
+** The first argument to sqlite3_config() is an integer
+** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines
+** what property of SQLite is to be configured. Subsequent arguments
+** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option]
+** in the first argument.
+**
+** When a configuration option is set, sqlite3_config() returns [SQLITE_OK].
+** If the option is unknown or SQLite is unable to set the option
+** then this routine returns a non-zero [error code].
+**
+** Requirements:
+** [H14103] [H14106] [H14120] [H14123] [H14126] [H14129] [H14132] [H14135]
+** [H14138] [H14141] [H14144] [H14147] [H14150] [H14153] [H14156] [H14159]
+** [H14162] [H14165] [H14168]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...);
+
+/*
+** CAPI3REF: Configure database connections {H14200} <S20000>
+** EXPERIMENTAL
+**
+** The sqlite3_db_config() interface is used to make configuration
+** changes to a [database connection]. The interface is similar to
+** [sqlite3_config()] except that the changes apply to a single
+** [database connection] (specified in the first argument). The
+** sqlite3_db_config() interface can only be used immediately after
+** the database connection is created using [sqlite3_open()],
+** [sqlite3_open16()], or [sqlite3_open_v2()].
+**
+** The second argument to sqlite3_db_config(D,V,...) is the
+** configuration verb - an integer code that indicates what
+** aspect of the [database connection] is being configured.
+** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE].
+** New verbs are likely to be added in future releases of SQLite.
+** Additional arguments depend on the verb.
+**
+** Requirements:
+** [H14203] [H14206] [H14209] [H14212] [H14215]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...);
+
+/*
+** CAPI3REF: Memory Allocation Routines {H10155} <S20120>
+** EXPERIMENTAL
+**
+** An instance of this object defines the interface between SQLite
+** and low-level memory allocation routines.
+**
+** This object is used in only one place in the SQLite interface.
+** A pointer to an instance of this object is the argument to
+** [sqlite3_config()] when the configuration option is
+** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC].
+** By creating an instance of this object
+** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC])
+** during configuration, an application can specify an alternative
+** memory allocation subsystem for SQLite to use for all of its
+** dynamic memory needs.
+**
+** Note that SQLite comes with several [built-in memory allocators]
+** that are perfectly adequate for the overwhelming majority of applications
+** and that this object is only useful to a tiny minority of applications
+** with specialized memory allocation requirements. This object is
+** also used during testing of SQLite in order to specify an alternative
+** memory allocator that simulates memory out-of-memory conditions in
+** order to verify that SQLite recovers gracefully from such
+** conditions.
+**
+** The xMalloc and xFree methods must work like the
+** malloc() and free() functions from the standard C library.
+** The xRealloc method must work like realloc() from the standard C library
+** with the exception that if the second argument to xRealloc is zero,
+** xRealloc must be a no-op - it must not perform any allocation or
+** deallocation. SQLite guaranteeds that the second argument to
+** xRealloc is always a value returned by a prior call to xRoundup.
+** And so in cases where xRoundup always returns a positive number,
+** xRealloc can perform exactly as the standard library realloc() and
+** still be in compliance with this specification.
+**
+** xSize should return the allocated size of a memory allocation
+** previously obtained from xMalloc or xRealloc. The allocated size
+** is always at least as big as the requested size but may be larger.
+**
+** The xRoundup method returns what would be the allocated size of
+** a memory allocation given a particular requested size. Most memory
+** allocators round up memory allocations at least to the next multiple
+** of 8. Some allocators round up to a larger multiple or to a power of 2.
+** Every memory allocation request coming in through [sqlite3_malloc()]
+** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0,
+** that causes the corresponding memory allocation to fail.
+**
+** The xInit method initializes the memory allocator. (For example,
+** it might allocate any require mutexes or initialize internal data
+** structures. The xShutdown method is invoked (indirectly) by
+** [sqlite3_shutdown()] and should deallocate any resources acquired
+** by xInit. The pAppData pointer is used as the only parameter to
+** xInit and xShutdown.
+**
+** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes
+** the xInit method, so the xInit method need not be threadsafe. The
+** xShutdown method is only called from [sqlite3_shutdown()] so it does
+** not need to be threadsafe either. For all other methods, SQLite
+** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the
+** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which
+** it is by default) and so the methods are automatically serialized.
+** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other
+** methods must be threadsafe or else make their own arrangements for
+** serialization.
+**
+** SQLite will never invoke xInit() more than once without an intervening
+** call to xShutdown().
+*/
+typedef struct sqlite3_mem_methods sqlite3_mem_methods;
+struct sqlite3_mem_methods {
+ void *(*xMalloc)(int); /* Memory allocation function */
+ void (*xFree)(void*); /* Free a prior allocation */
+ void *(*xRealloc)(void*,int); /* Resize an allocation */
+ int (*xSize)(void*); /* Return the size of an allocation */
+ int (*xRoundup)(int); /* Round up request size to allocation size */
+ int (*xInit)(void*); /* Initialize the memory allocator */
+ void (*xShutdown)(void*); /* Deinitialize the memory allocator */
+ void *pAppData; /* Argument to xInit() and xShutdown() */
+};
+
+/*
+** CAPI3REF: Configuration Options {H10160} <S20000>
+** EXPERIMENTAL
**
-** The sqlite3_extended_result_codes() routine enables or disables the
-** [SQLITE_IOERR_READ | extended result codes] feature of SQLite.
-** The extended result codes are disabled by default for historical
-** compatibility.
+** These constants are the available integer configuration options that
+** can be passed as the first argument to the [sqlite3_config()] interface.
+**
+** New configuration options may be added in future releases of SQLite.
+** Existing configuration options might be discontinued. Applications
+** should check the return code from [sqlite3_config()] to make sure that
+** the call worked. The [sqlite3_config()] interface will return a
+** non-zero [error code] if a discontinued or unsupported configuration option
+** is invoked.
**
-** INVARIANTS:
+** <dl>
+** <dt>SQLITE_CONFIG_SINGLETHREAD</dt>
+** <dd>There are no arguments to this option. This option disables
+** all mutexing and puts SQLite into a mode where it can only be used
+** by a single thread.</dd>
+**
+** <dt>SQLITE_CONFIG_MULTITHREAD</dt>
+** <dd>There are no arguments to this option. This option disables
+** mutexing on [database connection] and [prepared statement] objects.
+** The application is responsible for serializing access to
+** [database connections] and [prepared statements]. But other mutexes
+** are enabled so that SQLite will be safe to use in a multi-threaded
+** environment as long as no two threads attempt to use the same
+** [database connection] at the same time. See the [threading mode]
+** documentation for additional information.</dd>
+**
+** <dt>SQLITE_CONFIG_SERIALIZED</dt>
+** <dd>There are no arguments to this option. This option enables
+** all mutexes including the recursive
+** mutexes on [database connection] and [prepared statement] objects.
+** In this mode (which is the default when SQLite is compiled with
+** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access
+** to [database connections] and [prepared statements] so that the
+** application is free to use the same [database connection] or the
+** same [prepared statement] in different threads at the same time.
+** See the [threading mode] documentation for additional information.</dd>
+**
+** <dt>SQLITE_CONFIG_MALLOC</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mem_methods] structure. The argument specifies
+** alternative low-level memory allocation routines to be used in place of
+** the memory allocation routines built into SQLite.</dd>
+**
+** <dt>SQLITE_CONFIG_GETMALLOC</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods]
+** structure is filled with the currently defined memory allocation routines.
+** This option can be used to overload the default memory allocation
+** routines with a wrapper that simulations memory allocation failure or
+** tracks memory usage, for example.</dd>
+**
+** <dt>SQLITE_CONFIG_MEMSTATUS</dt>
+** <dd>This option takes single argument of type int, interpreted as a
+** boolean, which enables or disables the collection of memory allocation
+** statistics. When disabled, the following SQLite interfaces become
+** non-operational:
+** <ul>
+** <li> [sqlite3_memory_used()]
+** <li> [sqlite3_memory_highwater()]
+** <li> [sqlite3_soft_heap_limit()]
+** <li> [sqlite3_status()]
+** </ul>
+** </dd>
+**
+** <dt>SQLITE_CONFIG_SCRATCH</dt>
+** <dd>This option specifies a static memory buffer that SQLite can use for
+** scratch memory. There are three arguments: A pointer an 8-byte
+** aligned memory buffer from which the scrach allocations will be
+** drawn, the size of each scratch allocation (sz),
+** and the maximum number of scratch allocations (N). The sz
+** argument must be a multiple of 16. The sz parameter should be a few bytes
+** larger than the actual scratch space required due to internal overhead.
+** The first argument should pointer to an 8-byte aligned buffer
+** of at least sz*N bytes of memory.
+** SQLite will use no more than one scratch buffer at once per thread, so
+** N should be set to the expected maximum number of threads. The sz
+** parameter should be 6 times the size of the largest database page size.
+** Scratch buffers are used as part of the btree balance operation. If
+** The btree balancer needs additional memory beyond what is provided by
+** scratch buffers or if no scratch buffer space is specified, then SQLite
+** goes to [sqlite3_malloc()] to obtain the memory it needs.</dd>
+**
+** <dt>SQLITE_CONFIG_PAGECACHE</dt>
+** <dd>This option specifies a static memory buffer that SQLite can use for
+** the database page cache with the default page cache implemenation.
+** This configuration should not be used if an application-define page
+** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option.
+** There are three arguments to this option: A pointer to 8-byte aligned
+** memory, the size of each page buffer (sz), and the number of pages (N).
+** The sz argument should be the size of the largest database page
+** (a power of two between 512 and 32768) plus a little extra for each
+** page header. The page header size is 20 to 40 bytes depending on
+** the host architecture. It is harmless, apart from the wasted memory,
+** to make sz a little too large. The first
+** argument should point to an allocation of at least sz*N bytes of memory.
+** SQLite will use the memory provided by the first argument to satisfy its
+** memory needs for the first N pages that it adds to cache. If additional
+** page cache memory is needed beyond what is provided by this option, then
+** SQLite goes to [sqlite3_malloc()] for the additional storage space.
+** The implementation might use one or more of the N buffers to hold
+** memory accounting information. The pointer in the first argument must
+** be aligned to an 8-byte boundary or subsequent behavior of SQLite
+** will be undefined.</dd>
+**
+** <dt>SQLITE_CONFIG_HEAP</dt>
+** <dd>This option specifies a static memory buffer that SQLite will use
+** for all of its dynamic memory allocation needs beyond those provided
+** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE].
+** There are three arguments: An 8-byte aligned pointer to the memory,
+** the number of bytes in the memory buffer, and the minimum allocation size.
+** If the first pointer (the memory pointer) is NULL, then SQLite reverts
+** to using its default memory allocator (the system malloc() implementation),
+** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the
+** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or
+** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory
+** allocator is engaged to handle all of SQLites memory allocation needs.
+** The first pointer (the memory pointer) must be aligned to an 8-byte
+** boundary or subsequent behavior of SQLite will be undefined.</dd>
+**
+** <dt>SQLITE_CONFIG_MUTEX</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mutex_methods] structure. The argument specifies
+** alternative low-level mutex routines to be used in place
+** the mutex routines built into SQLite.</dd>
+**
+** <dt>SQLITE_CONFIG_GETMUTEX</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mutex_methods] structure. The
+** [sqlite3_mutex_methods]
+** structure is filled with the currently defined mutex routines.
+** This option can be used to overload the default mutex allocation
+** routines with a wrapper used to track mutex usage for performance
+** profiling or testing, for example.</dd>
+**
+** <dt>SQLITE_CONFIG_LOOKASIDE</dt>
+** <dd>This option takes two arguments that determine the default
+** memory allocation lookaside optimization. The first argument is the
+** size of each lookaside buffer slot and the second is the number of
+** slots allocated to each database connection. This option sets the
+** <i>default</i> lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE]
+** verb to [sqlite3_db_config()] can be used to change the lookaside
+** configuration on individual connections.</dd>
+**
+** <dt>SQLITE_CONFIG_PCACHE</dt>
+** <dd>This option takes a single argument which is a pointer to
+** an [sqlite3_pcache_methods] object. This object specifies the interface
+** to a custom page cache implementation. SQLite makes a copy of the
+** object and uses it for page cache memory allocations.</dd>
+**
+** <dt>SQLITE_CONFIG_GETPCACHE</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** [sqlite3_pcache_methods] object. SQLite copies of the current
+** page cache implementation into that object.</dd>
**
-** {F12201} Each new [database connection] has the
-** [extended result codes] feature
-** disabled by default.
+** </dl>
+*/
+#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
+#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
+#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
+#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */
+#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
+#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
+#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
+#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
+#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
+/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
+#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
+#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */
+#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */
+
+/*
+** CAPI3REF: Configuration Options {H10170} <S20000>
+** EXPERIMENTAL
+**
+** These constants are the available integer configuration options that
+** can be passed as the second argument to the [sqlite3_db_config()] interface.
+**
+** New configuration options may be added in future releases of SQLite.
+** Existing configuration options might be discontinued. Applications
+** should check the return code from [sqlite3_db_config()] to make sure that
+** the call worked. The [sqlite3_db_config()] interface will return a
+** non-zero [error code] if a discontinued or unsupported configuration option
+** is invoked.
+**
+** <dl>
+** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt>
+** <dd>This option takes three additional arguments that determine the
+** [lookaside memory allocator] configuration for the [database connection].
+** The first argument (the third parameter to [sqlite3_db_config()] is a
+** pointer to an memory buffer to use for lookaside memory.
+** The first argument may be NULL in which case SQLite will allocate the
+** lookaside buffer itself using [sqlite3_malloc()]. The second argument is the
+** size of each lookaside buffer slot and the third argument is the number of
+** slots. The size of the buffer in the first argument must be greater than
+** or equal to the product of the second and third arguments. The buffer
+** must be aligned to an 8-byte boundary. If the second argument is not
+** a multiple of 8, it is internally rounded down to the next smaller
+** multiple of 8. See also: [SQLITE_CONFIG_LOOKASIDE]</dd>
+**
+** </dl>
+*/
+#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */
+
+
+/*
+** CAPI3REF: Enable Or Disable Extended Result Codes {H12200} <S10700>
+**
+** The sqlite3_extended_result_codes() routine enables or disables the
+** [extended result codes] feature of SQLite. The extended result
+** codes are disabled by default for historical compatibility considerations.
**
-** {F12202} The [sqlite3_extended_result_codes(D,F)] interface will enable
-** [extended result codes] for the
-** [database connection] D if the F parameter
-** is true, or disable them if F is false.
+** Requirements:
+** [H12201] [H12202]
*/
SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff);
/*
-** CAPI3REF: Last Insert Rowid {F12220}
+** CAPI3REF: Last Insert Rowid {H12220} <S10700>
**
** Each entry in an SQLite table has a unique 64-bit signed
-** integer key called the "rowid". The rowid is always available
+** integer key called the [ROWID | "rowid"]. The rowid is always available
** as an undeclared column named ROWID, OID, or _ROWID_ as long as those
** names are not also used by explicitly declared columns. If
-** the table has a column of type INTEGER PRIMARY KEY then that column
+** the table has a column of type [INTEGER PRIMARY KEY] then that column
** is another alias for the rowid.
**
-** This routine returns the rowid of the most recent
-** successful INSERT into the database from the database connection
-** shown in the first argument. If no successful inserts
-** have ever occurred on this database connection, zero is returned.
+** This routine returns the [rowid] of the most recent
+** successful [INSERT] into the database from the [database connection]
+** in the first argument. If no successful [INSERT]s
+** have ever occurred on that database connection, zero is returned.
**
-** If an INSERT occurs within a trigger, then the rowid of the
-** inserted row is returned by this routine as long as the trigger
-** is running. But once the trigger terminates, the value returned
-** by this routine reverts to the last value inserted before the
-** trigger fired.
+** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted
+** row is returned by this routine as long as the trigger is running.
+** But once the trigger terminates, the value returned by this routine
+** reverts to the last value inserted before the trigger fired.
**
-** An INSERT that fails due to a constraint violation is not a
-** successful insert and does not change the value returned by this
+** An [INSERT] that fails due to a constraint violation is not a
+** successful [INSERT] and does not change the value returned by this
** routine. Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK,
** and INSERT OR ABORT make no changes to the return value of this
-** routine when their insertion fails. When INSERT OR REPLACE
+** routine when their insertion fails. When INSERT OR REPLACE
** encounters a constraint violation, it does not fail. The
** INSERT continues to completion after deleting rows that caused
** the constraint problem so INSERT OR REPLACE will always change
-** the return value of this interface.
+** the return value of this interface.
**
-** For the purposes of this routine, an insert is considered to
+** For the purposes of this routine, an [INSERT] is considered to
** be successful even if it is subsequently rolled back.
**
-** INVARIANTS:
+** Requirements:
+** [H12221] [H12223]
**
-** {F12221} The [sqlite3_last_insert_rowid()] function returns the
-** rowid of the most recent successful insert done
-** on the same database connection and within the same
-** trigger context, or zero if there have
-** been no qualifying inserts on that connection.
-**
-** {F12223} The [sqlite3_last_insert_rowid()] function returns
-** same value when called from the same trigger context
-** immediately before and after a ROLLBACK.
-**
-** LIMITATIONS:
-**
-** {U12232} If a separate thread does a new insert on the same
-** database connection while the [sqlite3_last_insert_rowid()]
-** function is running and thus changes the last insert rowid,
-** then the value returned by [sqlite3_last_insert_rowid()] is
-** unpredictable and might not equal either the old or the new
-** last insert rowid.
+** If a separate thread performs a new [INSERT] on the same
+** database connection while the [sqlite3_last_insert_rowid()]
+** function is running and thus changes the last insert [rowid],
+** then the value returned by [sqlite3_last_insert_rowid()] is
+** unpredictable and might not equal either the old or the new
+** last insert [rowid].
*/
SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
/*
-** CAPI3REF: Count The Number Of Rows Modified {F12240}
+** CAPI3REF: Count The Number Of Rows Modified {H12240} <S10600>
**
** This function returns the number of database rows that were changed
** or inserted or deleted by the most recently completed SQL statement
-** on the connection specified by the first parameter. Only
-** changes that are directly specified by the INSERT, UPDATE, or
-** DELETE statement are counted. Auxiliary changes caused by
-** triggers are not counted. Use the [sqlite3_total_changes()] function
-** to find the total number of changes including changes caused by triggers.
+** on the [database connection] specified by the first parameter.
+** Only changes that are directly specified by the [INSERT], [UPDATE],
+** or [DELETE] statement are counted. Auxiliary changes caused by
+** triggers or [foreign key actions] are not counted. Use the
+** [sqlite3_total_changes()] function to find the total number of changes
+** including changes caused by triggers and foreign key actions.
+**
+** Changes to a view that are simulated by an [INSTEAD OF trigger]
+** are not counted. Only real table changes are counted.
**
** A "row change" is a change to a single row of a single table
** caused by an INSERT, DELETE, or UPDATE statement. Rows that
-** are changed as side effects of REPLACE constraint resolution,
-** rollback, ABORT processing, DROP TABLE, or by any other
+** are changed as side effects of [REPLACE] constraint resolution,
+** rollback, ABORT processing, [DROP TABLE], or by any other
** mechanisms do not count as direct row changes.
**
** A "trigger context" is a scope of execution that begins and
-** ends with the script of a trigger. Most SQL statements are
+** ends with the script of a [CREATE TRIGGER | trigger].
+** Most SQL statements are
** evaluated outside of any trigger. This is the "top level"
** trigger context. If a trigger fires from the top level, a
** new trigger context is entered for the duration of that one
@@ -1348,84 +1883,57 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
** most recent INSERT, UPDATE, or DELETE statement within the same
** trigger context.
**
-** So when called from the top level, this function returns the
+** Thus, when called from the top level, this function returns the
** number of changes in the most recent INSERT, UPDATE, or DELETE
-** that also occurred at the top level.
-** Within the body of a trigger, the sqlite3_changes() interface
-** can be called to find the number of
+** that also occurred at the top level. Within the body of a trigger,
+** the sqlite3_changes() interface can be called to find the number of
** changes in the most recently completed INSERT, UPDATE, or DELETE
** statement within the body of the same trigger.
-** However, the number returned does not include in changes
-** caused by subtriggers since they have their own context.
-**
-** SQLite implements the command "DELETE FROM table" without
-** a WHERE clause by dropping and recreating the table. (This is much
-** faster than going through and deleting individual elements from the
-** table.) Because of this optimization, the deletions in
-** "DELETE FROM table" are not row changes and will not be counted
-** by the sqlite3_changes() or [sqlite3_total_changes()] functions.
-** To get an accurate count of the number of rows deleted, use
-** "DELETE FROM table WHERE 1" instead.
-**
-** INVARIANTS:
+** However, the number returned does not include changes
+** caused by subtriggers since those have their own context.
**
-** {F12241} The [sqlite3_changes()] function returns the number of
-** row changes caused by the most recent INSERT, UPDATE,
-** or DELETE statement on the same database connection and
-** within the same trigger context, or zero if there have
-** not been any qualifying row changes.
+** See also the [sqlite3_total_changes()] interface and the
+** [count_changes pragma].
**
-** LIMITATIONS:
+** Requirements:
+** [H12241] [H12243]
**
-** {U12252} If a separate thread makes changes on the same database connection
-** while [sqlite3_changes()] is running then the value returned
-** is unpredictable and unmeaningful.
+** If a separate thread makes changes on the same database connection
+** while [sqlite3_changes()] is running then the value returned
+** is unpredictable and not meaningful.
*/
SQLITE_API int sqlite3_changes(sqlite3*);
/*
-** CAPI3REF: Total Number Of Rows Modified {F12260}
-***
-** This function returns the number of row changes caused
-** by INSERT, UPDATE or DELETE statements since the database handle
-** was opened. The count includes all changes from all trigger
-** contexts. But the count does not include changes used to
-** implement REPLACE constraints, do rollbacks or ABORT processing,
-** or DROP table processing.
-** The changes
-** are counted as soon as the statement that makes them is completed
-** (when the statement handle is passed to [sqlite3_reset()] or
-** [sqlite3_finalize()]).
+** CAPI3REF: Total Number Of Rows Modified {H12260} <S10600>
**
-** SQLite implements the command "DELETE FROM table" without
-** a WHERE clause by dropping and recreating the table. (This is much
-** faster than going
-** through and deleting individual elements from the table.) Because of
-** this optimization, the change count for "DELETE FROM table" will be
-** zero regardless of the number of elements that were originally in the
-** table. To get an accurate count of the number of rows deleted, use
-** "DELETE FROM table WHERE 1" instead.
+** This function returns the number of row changes caused by [INSERT],
+** [UPDATE] or [DELETE] statements since the [database connection] was opened.
+** The count includes all changes from all [CREATE TRIGGER | trigger]
+** contexts and changes made by [foreign key actions]. However,
+** the count does not include changes used to implement [REPLACE] constraints,
+** do rollbacks or ABORT processing, or [DROP TABLE] processing. The
+** count does not include rows of views that fire an [INSTEAD OF trigger],
+** though if the INSTEAD OF trigger makes changes of its own, those changes
+** are counted.
+** The changes are counted as soon as the statement that makes them is
+** completed (when the statement handle is passed to [sqlite3_reset()] or
+** [sqlite3_finalize()]).
**
-** See also the [sqlite3_changes()] interface.
+** See also the [sqlite3_changes()] interface and the
+** [count_changes pragma].
**
-** INVARIANTS:
-**
-** {F12261} The [sqlite3_total_changes()] returns the total number
-** of row changes caused by INSERT, UPDATE, and/or DELETE
-** statements on the same [database connection], in any
-** trigger context, since the database connection was
-** created.
+** Requirements:
+** [H12261] [H12263]
**
-** LIMITATIONS:
-**
-** {U12264} If a separate thread makes changes on the same database connection
-** while [sqlite3_total_changes()] is running then the value
-** returned is unpredictable and unmeaningful.
+** If a separate thread makes changes on the same database connection
+** while [sqlite3_total_changes()] is running then the value
+** returned is unpredictable and not meaningful.
*/
SQLITE_API int sqlite3_total_changes(sqlite3*);
/*
-** CAPI3REF: Interrupt A Long-Running Query {F12270}
+** CAPI3REF: Interrupt A Long-Running Query {H12270} <S30500>
**
** This function causes any pending database operation to abort and
** return at its earliest opportunity. This routine is typically
@@ -1435,98 +1943,99 @@ SQLITE_API int sqlite3_total_changes(sqlite3*);
**
** It is safe to call this routine from a thread different from the
** thread that is currently running the database operation. But it
-** is not safe to call this routine with a database connection that
+** is not safe to call this routine with a [database connection] that
** is closed or might close before sqlite3_interrupt() returns.
**
-** If an SQL is very nearly finished at the time when sqlite3_interrupt()
-** is called, then it might not have an opportunity to be interrupted.
-** It might continue to completion.
-** An SQL operation that is interrupted will return
-** [SQLITE_INTERRUPT]. If the interrupted SQL operation is an
-** INSERT, UPDATE, or DELETE that is inside an explicit transaction,
-** then the entire transaction will be rolled back automatically.
-** A call to sqlite3_interrupt() has no effect on SQL statements
-** that are started after sqlite3_interrupt() returns.
-**
-** INVARIANTS:
+** If an SQL operation is very nearly finished at the time when
+** sqlite3_interrupt() is called, then it might not have an opportunity
+** to be interrupted and might continue to completion.
**
-** {F12271} The [sqlite3_interrupt()] interface will force all running
-** SQL statements associated with the same database connection
-** to halt after processing at most one additional row of
-** data.
+** An SQL operation that is interrupted will return [SQLITE_INTERRUPT].
+** If the interrupted SQL operation is an INSERT, UPDATE, or DELETE
+** that is inside an explicit transaction, then the entire transaction
+** will be rolled back automatically.
**
-** {F12272} Any SQL statement that is interrupted by [sqlite3_interrupt()]
-** will return [SQLITE_INTERRUPT].
+** The sqlite3_interrupt(D) call is in effect until all currently running
+** SQL statements on [database connection] D complete. Any new SQL statements
+** that are started after the sqlite3_interrupt() call and before the
+** running statements reaches zero are interrupted as if they had been
+** running prior to the sqlite3_interrupt() call. New SQL statements
+** that are started after the running statement count reaches zero are
+** not effected by the sqlite3_interrupt().
+** A call to sqlite3_interrupt(D) that occurs when there are no running
+** SQL statements is a no-op and has no effect on SQL statements
+** that are started after the sqlite3_interrupt() call returns.
**
-** LIMITATIONS:
+** Requirements:
+** [H12271] [H12272]
**
-** {U12279} If the database connection closes while [sqlite3_interrupt()]
-** is running then bad things will likely happen.
+** If the database connection closes while [sqlite3_interrupt()]
+** is running then bad things will likely happen.
*/
SQLITE_API void sqlite3_interrupt(sqlite3*);
/*
-** CAPI3REF: Determine If An SQL Statement Is Complete {F10510}
+** CAPI3REF: Determine If An SQL Statement Is Complete {H10510} <S70200>
**
-** These routines are useful for command-line input to determine if the
-** currently entered text seems to form complete a SQL statement or
+** These routines are useful during command-line input to determine if the
+** currently entered text seems to form a complete SQL statement or
** if additional input is needed before sending the text into
-** SQLite for parsing. These routines return true if the input string
+** SQLite for parsing. These routines return 1 if the input string
** appears to be a complete SQL statement. A statement is judged to be
-** complete if it ends with a semicolon token and is not a fragment of a
-** CREATE TRIGGER statement. Semicolons that are embedded within
+** complete if it ends with a semicolon token and is not a prefix of a
+** well-formed CREATE TRIGGER statement. Semicolons that are embedded within
** string literals or quoted identifier names or comments are not
** independent tokens (they are part of the token in which they are
-** embedded) and thus do not count as a statement terminator.
+** embedded) and thus do not count as a statement terminator. Whitespace
+** and comments that follow the final semicolon are ignored.
**
-** These routines do not parse the SQL and
-** so will not detect syntactically incorrect SQL.
+** These routines return 0 if the statement is incomplete. If a
+** memory allocation fails, then SQLITE_NOMEM is returned.
**
-** INVARIANTS:
+** These routines do not parse the SQL statements thus
+** will not detect syntactically incorrect SQL.
**
-** {F10511} The sqlite3_complete() and sqlite3_complete16() functions
-** return true (non-zero) if and only if the last
-** non-whitespace token in their input is a semicolon that
-** is not in between the BEGIN and END of a CREATE TRIGGER
-** statement.
+** If SQLite has not been initialized using [sqlite3_initialize()] prior
+** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked
+** automatically by sqlite3_complete16(). If that initialization fails,
+** then the return value from sqlite3_complete16() will be non-zero
+** regardless of whether or not the input SQL is complete.
**
-** LIMITATIONS:
+** Requirements: [H10511] [H10512]
**
-** {U10512} The input to sqlite3_complete() must be a zero-terminated
-** UTF-8 string.
+** The input to [sqlite3_complete()] must be a zero-terminated
+** UTF-8 string.
**
-** {U10513} The input to sqlite3_complete16() must be a zero-terminated
-** UTF-16 string in native byte order.
+** The input to [sqlite3_complete16()] must be a zero-terminated
+** UTF-16 string in native byte order.
*/
SQLITE_API int sqlite3_complete(const char *sql);
SQLITE_API int sqlite3_complete16(const void *sql);
/*
-** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {F12310}
-**
-** This routine identifies a callback function that might be
-** invoked whenever an attempt is made to open a database table
-** that another thread or process has locked.
-** If the busy callback is NULL, then [SQLITE_BUSY]
-** or [SQLITE_IOERR_BLOCKED]
-** is returned immediately upon encountering the lock.
-** If the busy callback is not NULL, then the
-** callback will be invoked with two arguments. The
-** first argument to the handler is a copy of the void* pointer which
-** is the third argument to this routine. The second argument to
-** the handler is the number of times that the busy handler has
-** been invoked for this locking event. If the
+** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {H12310} <S40400>
+**
+** This routine sets a callback function that might be invoked whenever
+** an attempt is made to open a database table that another thread
+** or process has locked.
+**
+** If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]
+** is returned immediately upon encountering the lock. If the busy callback
+** is not NULL, then the callback will be invoked with two arguments.
+**
+** The first argument to the handler is a copy of the void* pointer which
+** is the third argument to sqlite3_busy_handler(). The second argument to
+** the handler callback is the number of times that the busy handler has
+** been invoked for this locking event. If the
** busy callback returns 0, then no additional attempts are made to
** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned.
** If the callback returns non-zero, then another attempt
** is made to open the database for reading and the cycle repeats.
**
-** The presence of a busy handler does not guarantee that
-** it will be invoked when there is lock contention.
-** If SQLite determines that invoking the busy handler could result in
-** a deadlock, it will go ahead and return [SQLITE_BUSY] or
-** [SQLITE_IOERR_BLOCKED] instead of invoking the
-** busy handler.
+** The presence of a busy handler does not guarantee that it will be invoked
+** when there is lock contention. If SQLite determines that invoking the busy
+** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY]
+** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler.
** Consider a scenario where one process is holding a read lock that
** it is trying to promote to a reserved lock and
** a second process is holding a reserved lock that it is trying
@@ -1551,82 +2060,52 @@ SQLITE_API int sqlite3_complete16(const void *sql);
** code is promoted from the relatively benign [SQLITE_BUSY] to
** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion
** forces an automatic rollback of the changes. See the
-** <a href="http://www.sqlite.org/cvstrac/wiki?p=CorruptionFollowingBusyError">
+** <a href="/cvstrac/wiki?p=CorruptionFollowingBusyError">
** CorruptionFollowingBusyError</a> wiki page for a discussion of why
** this is important.
-**
-** There can only be a single busy handler defined for each database
-** connection. Setting a new busy handler clears any previous one.
-** Note that calling [sqlite3_busy_timeout()] will also set or clear
-** the busy handler.
-**
-** INVARIANTS:
-**
-** {F12311} The [sqlite3_busy_handler()] function replaces the busy handler
-** callback in the database connection identified by the 1st
-** parameter with a new busy handler identified by the 2nd and 3rd
-** parameters.
**
-** {F12312} The default busy handler for new database connections is NULL.
+** There can only be a single busy handler defined for each
+** [database connection]. Setting a new busy handler clears any
+** previously set handler. Note that calling [sqlite3_busy_timeout()]
+** will also set or clear the busy handler.
**
-** {F12314} When two or more database connection share a common cache,
-** the busy handler for the database connection currently using
-** the cache is invoked when the cache encounters a lock.
-**
-** {F12316} If a busy handler callback returns zero, then the SQLite
-** interface that provoked the locking event will return
-** [SQLITE_BUSY].
-**
-** {F12318} SQLite will invokes the busy handler with two argument which
-** are a copy of the pointer supplied by the 3rd parameter to
-** [sqlite3_busy_handler()] and a count of the number of prior
-** invocations of the busy handler for the same locking event.
-**
-** LIMITATIONS:
+** The busy callback should not take any actions which modify the
+** database connection that invoked the busy handler. Any such actions
+** result in undefined behavior.
+**
+** Requirements:
+** [H12311] [H12312] [H12314] [H12316] [H12318]
**
-** {U12319} A busy handler should not call close the database connection
-** or prepared statement that invoked the busy handler.
+** A busy handler must not close the database connection
+** or [prepared statement] that invoked the busy handler.
*/
SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
/*
-** CAPI3REF: Set A Busy Timeout {F12340}
+** CAPI3REF: Set A Busy Timeout {H12340} <S40410>
**
-** This routine sets a [sqlite3_busy_handler | busy handler]
-** that sleeps for a while when a
-** table is locked. The handler will sleep multiple times until
-** at least "ms" milliseconds of sleeping have been done. {F12343} After
-** "ms" milliseconds of sleeping, the handler returns 0 which
-** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED].
+** This routine sets a [sqlite3_busy_handler | busy handler] that sleeps
+** for a specified amount of time when a table is locked. The handler
+** will sleep multiple times until at least "ms" milliseconds of sleeping
+** have accumulated. {H12343} After "ms" milliseconds of sleeping,
+** the handler returns 0 which causes [sqlite3_step()] to return
+** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED].
**
** Calling this routine with an argument less than or equal to zero
** turns off all busy handlers.
**
-** There can only be a single busy handler for a particular database
-** connection. If another busy handler was defined
-** (using [sqlite3_busy_handler()]) prior to calling
+** There can only be a single busy handler for a particular
+** [database connection] any any given moment. If another busy handler
+** was defined (using [sqlite3_busy_handler()]) prior to calling
** this routine, that other busy handler is cleared.
**
-** INVARIANTS:
-**
-** {F12341} The [sqlite3_busy_timeout()] function overrides any prior
-** [sqlite3_busy_timeout()] or [sqlite3_busy_handler()] setting
-** on the same database connection.
-**
-** {F12343} If the 2nd parameter to [sqlite3_busy_timeout()] is less than
-** or equal to zero, then the busy handler is cleared so that
-** all subsequent locking events immediately return [SQLITE_BUSY].
-**
-** {F12344} If the 2nd parameter to [sqlite3_busy_timeout()] is a positive
-** number N, then a busy handler is set that repeatedly calls
-** the xSleep() method in the VFS interface until either the
-** lock clears or until the cumulative sleep time reported back
-** by xSleep() exceeds N milliseconds.
+** Requirements:
+** [H12341] [H12343] [H12344]
*/
SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
/*
-** CAPI3REF: Convenience Routines For Running Queries {F12370}
+** CAPI3REF: Convenience Routines For Running Queries {H12370} <S10000>
**
** Definition: A <b>result table</b> is memory data structure created by the
** [sqlite3_get_table()] interface. A result table records the
@@ -1637,16 +2116,14 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
** numbers are obtained separately. Let N be the number of rows
** and M be the number of columns.
**
-** A result table is an array of pointers to zero-terminated
-** UTF-8 strings. There are (N+1)*M elements in the array.
-** The first M pointers point to zero-terminated strings that
-** contain the names of the columns.
-** The remaining entries all point to query results. NULL
-** values are give a NULL pointer. All other values are in
-** their UTF-8 zero-terminated string representation as returned by
-** [sqlite3_column_text()].
+** A result table is an array of pointers to zero-terminated UTF-8 strings.
+** There are (N+1)*M elements in the array. The first M pointers point
+** to zero-terminated strings that contain the names of the columns.
+** The remaining entries all point to query results. NULL values result
+** in NULL pointers. All other values are in their UTF-8 zero-terminated
+** string representation as returned by [sqlite3_column_text()].
**
-** A result table might consists of one or more memory allocations.
+** A result table might consist of one or more memory allocations.
** It is not safe to pass a result table directly to [sqlite3_free()].
** A result table should be deallocated using [sqlite3_free_table()].
**
@@ -1681,11 +2158,11 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
** string of its 2nd parameter. It returns a result table to the
** pointer given in its 3rd parameter.
**
-** After the calling function has finished using the result, it should
-** pass the pointer to the result table to sqlite3_free_table() in order to
-** release the memory that was malloc-ed. Because of the way the
+** After the calling function has finished using the result, it should
+** pass the pointer to the result table to sqlite3_free_table() in order to
+** release the memory that was malloced. Because of the way the
** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling
-** function must not try to call [sqlite3_free()] directly. Only
+** function must not try to call [sqlite3_free()] directly. Only
** [sqlite3_free_table()] is able to release the memory properly and safely.
**
** The sqlite3_get_table() interface is implemented as a wrapper around
@@ -1693,51 +2170,31 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
** to any internal data structures of SQLite. It uses only the public
** interface defined here. As a consequence, errors that occur in the
** wrapper layer outside of the internal [sqlite3_exec()] call are not
-** reflected in subsequent calls to [sqlite3_errcode()] or
-** [sqlite3_errmsg()].
-**
-** INVARIANTS:
-**
-** {F12371} If a [sqlite3_get_table()] fails a memory allocation, then
-** it frees the result table under construction, aborts the
-** query in process, skips any subsequent queries, sets the
-** *resultp output pointer to NULL and returns [SQLITE_NOMEM].
-**
-** {F12373} If the ncolumn parameter to [sqlite3_get_table()] is not NULL
-** then [sqlite3_get_table()] write the number of columns in the
-** result set of the query into *ncolumn if the query is
-** successful (if the function returns SQLITE_OK).
-**
-** {F12374} If the nrow parameter to [sqlite3_get_table()] is not NULL
-** then [sqlite3_get_table()] write the number of rows in the
-** result set of the query into *nrow if the query is
-** successful (if the function returns SQLITE_OK).
+** reflected in subsequent calls to [sqlite3_errcode()] or [sqlite3_errmsg()].
**
-** {F12376} The [sqlite3_get_table()] function sets its *ncolumn value
-** to the number of columns in the result set of the query in the
-** sql parameter, or to zero if the query in sql has an empty
-** result set.
+** Requirements:
+** [H12371] [H12373] [H12374] [H12376] [H12379] [H12382]
*/
SQLITE_API int sqlite3_get_table(
- sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluated */
- char ***pResult, /* Results of the query */
- int *nrow, /* Number of result rows written here */
- int *ncolumn, /* Number of result columns written here */
- char **errmsg /* Error msg written here */
+ sqlite3 *db, /* An open database */
+ const char *zSql, /* SQL to be evaluated */
+ char ***pazResult, /* Results of the query */
+ int *pnRow, /* Number of result rows written here */
+ int *pnColumn, /* Number of result columns written here */
+ char **pzErrmsg /* Error msg written here */
);
SQLITE_API void sqlite3_free_table(char **result);
/*
-** CAPI3REF: Formatted String Printing Functions {F17400}
+** CAPI3REF: Formatted String Printing Functions {H17400} <S70000><S20000>
**
-** These routines are workalikes of the "printf()" family of functions
+** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
**
** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
** results into memory obtained from [sqlite3_malloc()].
** The strings returned by these two routines should be
-** released by [sqlite3_free()]. Both routines return a
+** released by [sqlite3_free()]. Both routines return a
** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
** memory to hold the resulting string.
**
@@ -1762,7 +2219,7 @@ SQLITE_API void sqlite3_free_table(char **result);
**
** These routines all implement some additional formatting
** options that are useful for constructing SQL statements.
-** All of the usual printf formatting options apply. In addition, there
+** All of the usual printf() formatting options apply. In addition, there
** is are "%q", "%Q", and "%z" options.
**
** The %q option works like %s in that it substitutes a null-terminated
@@ -1771,7 +2228,7 @@ SQLITE_API void sqlite3_free_table(char **result);
** character it escapes that character and allows it to be inserted into
** the string.
**
-** For example, so some string variable contains text as follows:
+** For example, assume the string variable zText contains text as follows:
**
** <blockquote><pre>
** char *zText = "It's a happy day!";
@@ -1799,14 +2256,13 @@ SQLITE_API void sqlite3_free_table(char **result);
** INSERT INTO table1 VALUES('It's a happy day!');
** </pre></blockquote>
**
-** This second example is an SQL syntax error. As a general rule you
-** should always use %q instead of %s when inserting text into a string
-** literal.
+** This second example is an SQL syntax error. As a general rule you should
+** always use %q instead of %s when inserting text into a string literal.
**
** The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Or if the parameter in the argument
-** list is a NULL pointer, %Q substitutes the text "NULL" (without single
-** quotes) in place of the %Q option. {END} So, for example, one could say:
+** the outside of the total string. Additionally, if the parameter in the
+** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
+** single quotes) in place of the %Q option. So, for example, one could say:
**
** <blockquote><pre>
** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
@@ -1821,35 +2277,20 @@ SQLITE_API void sqlite3_free_table(char **result);
** addition that after the string has been read and copied into
** the result, [sqlite3_free()] is called on the input string. {END}
**
-** INVARIANTS:
-**
-** {F17403} The [sqlite3_mprintf()] and [sqlite3_vmprintf()] interfaces
-** return either pointers to zero-terminated UTF-8 strings held in
-** memory obtained from [sqlite3_malloc()] or NULL pointers if
-** a call to [sqlite3_malloc()] fails.
-**
-** {F17406} The [sqlite3_snprintf()] interface writes a zero-terminated
-** UTF-8 string into the buffer pointed to by the second parameter
-** provided that the first parameter is greater than zero.
-**
-** {F17407} The [sqlite3_snprintf()] interface does not writes slots of
-** its output buffer (the second parameter) outside the range
-** of 0 through N-1 (where N is the first parameter)
-** regardless of the length of the string
-** requested by the format specification.
-**
+** Requirements:
+** [H17403] [H17406] [H17407]
*/
SQLITE_API char *sqlite3_mprintf(const char*,...);
SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
/*
-** CAPI3REF: Memory Allocation Subsystem {F17300}
+** CAPI3REF: Memory Allocation Subsystem {H17300} <S20000>
**
** The SQLite core uses these three routines for all of its own
** internal memory allocation needs. "Core" in the previous sentence
** does not include operating-system specific VFS implementation. The
-** windows VFS uses native malloc and free for some operations.
+** Windows VFS uses native malloc() and free() for some operations.
**
** The sqlite3_malloc() routine returns a pointer to a block
** of memory at least N bytes in length, where N is the parameter.
@@ -1867,7 +2308,7 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
** memory might result in a segmentation fault or other severe error.
** Memory corruption, a segmentation fault, or other severe error
** might result if sqlite3_free() is called with a non-NULL pointer that
-** was not obtained from sqlite3_malloc() or sqlite3_free().
+** was not obtained from sqlite3_malloc() or sqlite3_realloc().
**
** The sqlite3_realloc() interface attempts to resize a
** prior memory allocation to be at least N bytes, where N is the
@@ -1878,7 +2319,7 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
** If the second parameter to sqlite3_realloc() is zero or
** negative then the behavior is exactly the same as calling
** sqlite3_free(P) where P is the first parameter to sqlite3_realloc().
-** Sqlite3_realloc() returns a pointer to a memory allocation
+** sqlite3_realloc() returns a pointer to a memory allocation
** of at least N bytes in size or NULL if sufficient memory is unavailable.
** If M is the size of the prior allocation, then min(N,M) bytes
** of the prior allocation are copied into the beginning of buffer returned
@@ -1889,128 +2330,66 @@ SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
** The memory returned by sqlite3_malloc() and sqlite3_realloc()
** is always aligned to at least an 8 byte boundary. {END}
**
-** The default implementation
-** of the memory allocation subsystem uses the malloc(), realloc()
-** and free() provided by the standard C library. {F17382} However, if
-** SQLite is compiled with the following C preprocessor macro
-**
-** <blockquote> SQLITE_MEMORY_SIZE=<i>NNN</i> </blockquote>
-**
-** where <i>NNN</i> is an integer, then SQLite create a static
-** array of at least <i>NNN</i> bytes in size and use that array
-** for all of its dynamic memory allocation needs. {END} Additional
-** memory allocator options may be added in future releases.
+** The default implementation of the memory allocation subsystem uses
+** the malloc(), realloc() and free() provided by the standard C library.
+** {H17382} However, if SQLite is compiled with the
+** SQLITE_MEMORY_SIZE=<i>NNN</i> C preprocessor macro (where <i>NNN</i>
+** is an integer), then SQLite create a static array of at least
+** <i>NNN</i> bytes in size and uses that array for all of its dynamic
+** memory allocation needs. {END} Additional memory allocator options
+** may be added in future releases.
**
** In SQLite version 3.5.0 and 3.5.1, it was possible to define
** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
** implementation of these routines to be omitted. That capability
-** is no longer provided. Only built-in memory allocators can be
-** used.
+** is no longer provided. Only built-in memory allocators can be used.
**
-** The windows OS interface layer calls
+** The Windows OS interface layer calls
** the system malloc() and free() directly when converting
** filenames between the UTF-8 encoding used by SQLite
-** and whatever filename encoding is used by the particular windows
+** and whatever filename encoding is used by the particular Windows
** installation. Memory allocation errors are detected, but
** they are reported back as [SQLITE_CANTOPEN] or
** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
**
-** INVARIANTS:
-**
-** {F17303} The [sqlite3_malloc(N)] interface returns either a pointer to
-** newly checked-out block of at least N bytes of memory
-** that is 8-byte aligned,
-** or it returns NULL if it is unable to fulfill the request.
-**
-** {F17304} The [sqlite3_malloc(N)] interface returns a NULL pointer if
-** N is less than or equal to zero.
-**
-** {F17305} The [sqlite3_free(P)] interface releases memory previously
-** returned from [sqlite3_malloc()] or [sqlite3_realloc()],
-** making it available for reuse.
-**
-** {F17306} A call to [sqlite3_free(NULL)] is a harmless no-op.
-**
-** {F17310} A call to [sqlite3_realloc(0,N)] is equivalent to a call
-** to [sqlite3_malloc(N)].
-**
-** {F17312} A call to [sqlite3_realloc(P,0)] is equivalent to a call
-** to [sqlite3_free(P)].
-**
-** {F17315} The SQLite core uses [sqlite3_malloc()], [sqlite3_realloc()],
-** and [sqlite3_free()] for all of its memory allocation and
-** deallocation needs.
-**
-** {F17318} The [sqlite3_realloc(P,N)] interface returns either a pointer
-** to a block of checked-out memory of at least N bytes in size
-** that is 8-byte aligned, or a NULL pointer.
+** Requirements:
+** [H17303] [H17304] [H17305] [H17306] [H17310] [H17312] [H17315] [H17318]
+** [H17321] [H17322] [H17323]
**
-** {F17321} When [sqlite3_realloc(P,N)] returns a non-NULL pointer, it first
-** copies the first K bytes of content from P into the newly allocated
-** where K is the lessor of N and the size of the buffer P.
-**
-** {F17322} When [sqlite3_realloc(P,N)] returns a non-NULL pointer, it first
-** releases the buffer P.
-**
-** {F17323} When [sqlite3_realloc(P,N)] returns NULL, the buffer P is
-** not modified or released.
-**
-** LIMITATIONS:
-**
-** {U17350} The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
-** must be either NULL or else a pointer obtained from a prior
-** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that has
-** not been released.
-**
-** {U17351} The application must not read or write any part of
-** a block of memory after it has been released using
-** [sqlite3_free()] or [sqlite3_realloc()].
+** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
+** must be either NULL or else pointers obtained from a prior
+** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
+** not yet been released.
**
+** The application must not read or write any part of
+** a block of memory after it has been released using
+** [sqlite3_free()] or [sqlite3_realloc()].
*/
SQLITE_API void *sqlite3_malloc(int);
SQLITE_API void *sqlite3_realloc(void*, int);
SQLITE_API void sqlite3_free(void*);
/*
-** CAPI3REF: Memory Allocator Statistics {F17370}
+** CAPI3REF: Memory Allocator Statistics {H17370} <S30210>
**
** SQLite provides these two interfaces for reporting on the status
** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()]
-** the memory allocation subsystem included within the SQLite.
-**
-** INVARIANTS:
+** routines, which form the built-in memory allocation subsystem.
**
-** {F17371} The [sqlite3_memory_used()] routine returns the
-** number of bytes of memory currently outstanding
-** (malloced but not freed).
-**
-** {F17373} The [sqlite3_memory_highwater()] routine returns the maximum
-** value of [sqlite3_memory_used()]
-** since the highwater mark was last reset.
-**
-** {F17374} The values returned by [sqlite3_memory_used()] and
-** [sqlite3_memory_highwater()] include any overhead
-** added by SQLite in its implementation of [sqlite3_malloc()],
-** but not overhead added by the any underlying system library
-** routines that [sqlite3_malloc()] may call.
-**
-** {F17375} The memory highwater mark is reset to the current value of
-** [sqlite3_memory_used()] if and only if the parameter to
-** [sqlite3_memory_highwater()] is true. The value returned
-** by [sqlite3_memory_highwater(1)] is the highwater mark
-** prior to the reset.
+** Requirements:
+** [H17371] [H17373] [H17374] [H17375]
*/
SQLITE_API sqlite3_int64 sqlite3_memory_used(void);
SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
/*
-** CAPI3REF: Pseudo-Random Number Generator {F17390}
+** CAPI3REF: Pseudo-Random Number Generator {H17390} <S20000>
**
** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
-** select random ROWIDs when inserting new records into a table that
-** already uses the largest possible ROWID. The PRNG is also used for
+** select random [ROWID | ROWIDs] when inserting new records into a table that
+** already uses the largest possible [ROWID]. The PRNG is also used for
** the build-in random() and randomblob() SQL functions. This interface allows
-** appliations to access the same PRNG for other purposes.
+** applications to access the same PRNG for other purposes.
**
** A call to this routine stores N bytes of randomness into buffer P.
**
@@ -2021,15 +2400,13 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
** internally and without recourse to the [sqlite3_vfs] xRandomness
** method.
**
-** INVARIANTS:
-**
-** {F17392} The [sqlite3_randomness(N,P)] interface writes N bytes of
-** high-quality pseudo-randomness into buffer P.
+** Requirements:
+** [H17392]
*/
SQLITE_API void sqlite3_randomness(int N, void *P);
/*
-** CAPI3REF: Compile-Time Authorization Callbacks {F12500}
+** CAPI3REF: Compile-Time Authorization Callbacks {H12500} <S70100>
**
** This routine registers a authorizer callback with a particular
** [database connection], supplied in the first argument.
@@ -2042,36 +2419,39 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the
** specific action but allow the SQL statement to continue to be
** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be
-** rejected with an error. If the authorizer callback returns
+** rejected with an error. If the authorizer callback returns
** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY]
-** then [sqlite3_prepare_v2()] or equivalent call that triggered
+** then the [sqlite3_prepare_v2()] or equivalent call that triggered
** the authorizer will fail with an error message.
**
** When the callback returns [SQLITE_OK], that means the operation
** requested is ok. When the callback returns [SQLITE_DENY], the
** [sqlite3_prepare_v2()] or equivalent call that triggered the
** authorizer will fail with an error message explaining that
-** access is denied. If the authorizer code is [SQLITE_READ]
+** access is denied.
+**
+** The first parameter to the authorizer callback is a copy of the third
+** parameter to the sqlite3_set_authorizer() interface. The second parameter
+** to the callback is an integer [SQLITE_COPY | action code] that specifies
+** the particular action to be authorized. The third through sixth parameters
+** to the callback are zero-terminated strings that contain additional
+** details about the action to be authorized.
+**
+** If the action code is [SQLITE_READ]
** and the callback returns [SQLITE_IGNORE] then the
** [prepared statement] statement is constructed to substitute
** a NULL value in place of the table column that would have
** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE]
** return can be used to deny an untrusted user access to individual
** columns of a table.
-**
-** The first parameter to the authorizer callback is a copy of
-** the third parameter to the sqlite3_set_authorizer() interface.
-** The second parameter to the callback is an integer
-** [SQLITE_COPY | action code] that specifies the particular action
-** to be authorized. The third through sixth
-** parameters to the callback are zero-terminated strings that contain
-** additional details about the action to be authorized.
+** If the action code is [SQLITE_DELETE] and the callback returns
+** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the
+** [truncate optimization] is disabled and all rows are deleted individually.
**
** An authorizer is used when [sqlite3_prepare | preparing]
-** SQL statements from an untrusted
-** source, to ensure that the SQL statements do not try to access data
-** that they are not allowed to see, or that they do not try to
-** execute malicious statements that damage the database. For
+** SQL statements from an untrusted source, to ensure that the SQL statements
+** do not try to access data they are not allowed to see, or that they do not
+** try to execute malicious statements that damage the database. For
** example, an application may allow a user to enter arbitrary
** SQL queries for evaluation by a database. But the application does
** not want the user to be able to make arbitrary changes to the
@@ -2089,61 +2469,25 @@ SQLITE_API void sqlite3_randomness(int N, void *P);
** previous call. Disable the authorizer by installing a NULL callback.
** The authorizer is disabled by default.
**
-** Note that the authorizer callback is invoked only during
-** [sqlite3_prepare()] or its variants. Authorization is not
-** performed during statement evaluation in [sqlite3_step()].
-**
-** INVARIANTS:
-**
-** {F12501} The [sqlite3_set_authorizer(D,...)] interface registers a
-** authorizer callback with database connection D.
-**
-** {F12502} The authorizer callback is invoked as SQL statements are
-** being compiled
-**
-** {F12503} If the authorizer callback returns any value other than
-** [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] then
-** the [sqlite3_prepare_v2()] or equivalent call that caused
-** the authorizer callback to run shall fail with an
-** [SQLITE_ERROR] error code and an appropriate error message.
-**
-** {F12504} When the authorizer callback returns [SQLITE_OK], the operation
-** described is coded normally.
-**
-** {F12505} When the authorizer callback returns [SQLITE_DENY], the
-** [sqlite3_prepare_v2()] or equivalent call that caused the
-** authorizer callback to run shall fail
-** with an [SQLITE_ERROR] error code and an error message
-** explaining that access is denied.
-**
-** {F12506} If the authorizer code (the 2nd parameter to the authorizer
-** callback) is [SQLITE_READ] and the authorizer callback returns
-** [SQLITE_IGNORE] then the prepared statement is constructed to
-** insert a NULL value in place of the table column that would have
-** been read if [SQLITE_OK] had been returned.
+** The authorizer callback must not do anything that will modify
+** the database connection that invoked the authorizer callback.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12507} If the authorizer code (the 2nd parameter to the authorizer
-** callback) is anything other than [SQLITE_READ], then
-** a return of [SQLITE_IGNORE] has the same effect as [SQLITE_DENY].
+** When [sqlite3_prepare_v2()] is used to prepare a statement, the
+** statement might be re-prepared during [sqlite3_step()] due to a
+** schema change. Hence, the application should ensure that the
+** correct authorizer callback remains in place during the [sqlite3_step()].
**
-** {F12510} The first parameter to the authorizer callback is a copy of
-** the third parameter to the [sqlite3_set_authorizer()] interface.
-**
-** {F12511} The second parameter to the callback is an integer
-** [SQLITE_COPY | action code] that specifies the particular action
-** to be authorized.
-**
-** {F12512} The third through sixth parameters to the callback are
-** zero-terminated strings that contain
-** additional details about the action to be authorized.
-**
-** {F12520} Each call to [sqlite3_set_authorizer()] overrides the
-** any previously installed authorizer.
-**
-** {F12521} A NULL authorizer means that no authorization
-** callback is invoked.
+** Note that the authorizer callback is invoked only during
+** [sqlite3_prepare()] or its variants. Authorization is not
+** performed during statement evaluation in [sqlite3_step()], unless
+** as stated in the previous paragraph, sqlite3_step() invokes
+** sqlite3_prepare_v2() to reprepare a statement after a schema change.
**
-** {F12522} The default authorizer is NULL.
+** Requirements:
+** [H12501] [H12502] [H12503] [H12504] [H12505] [H12506] [H12507] [H12510]
+** [H12511] [H12512] [H12520] [H12521] [H12522]
*/
SQLITE_API int sqlite3_set_authorizer(
sqlite3*,
@@ -2152,7 +2496,7 @@ SQLITE_API int sqlite3_set_authorizer(
);
/*
-** CAPI3REF: Authorizer Return Codes {F12590}
+** CAPI3REF: Authorizer Return Codes {H12590} <H12500>
**
** The [sqlite3_set_authorizer | authorizer callback function] must
** return either [SQLITE_OK] or one of these two constants in order
@@ -2164,45 +2508,26 @@ SQLITE_API int sqlite3_set_authorizer(
#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */
/*
-** CAPI3REF: Authorizer Action Codes {F12550}
+** CAPI3REF: Authorizer Action Codes {H12550} <H12500>
**
** The [sqlite3_set_authorizer()] interface registers a callback function
-** that is invoked to authorizer certain SQL statement actions. The
+** that is invoked to authorize certain SQL statement actions. The
** second parameter to the callback is an integer code that specifies
** what action is being authorized. These are the integer action codes that
** the authorizer callback may be passed.
**
-** These action code values signify what kind of operation is to be
+** These action code values signify what kind of operation is to be
** authorized. The 3rd and 4th parameters to the authorization
** callback function will be parameters or NULL depending on which of these
** codes is used as the second parameter. The 5th parameter to the
-** authorizer callback is the name of the database ("main", "temp",
+** authorizer callback is the name of the database ("main", "temp",
** etc.) if applicable. The 6th parameter to the authorizer callback
** is the name of the inner-most trigger or view that is responsible for
-** the access attempt or NULL if this access attempt is directly from
+** the access attempt or NULL if this access attempt is directly from
** top-level SQL code.
**
-** INVARIANTS:
-**
-** {F12551} The second parameter to an
-** [sqlite3_set_authorizer | authorizer callback is always an integer
-** [SQLITE_COPY | authorizer code] that specifies what action
-** is being authorized.
-**
-** {F12552} The 3rd and 4th parameters to the
-** [sqlite3_set_authorizer | authorization callback function]
-** will be parameters or NULL depending on which
-** [SQLITE_COPY | authorizer code] is used as the second parameter.
-**
-** {F12553} The 5th parameter to the
-** [sqlite3_set_authorizer | authorizer callback] is the name
-** of the database (example: "main", "temp", etc.) if applicable.
-**
-** {F12554} The 6th parameter to the
-** [sqlite3_set_authorizer | authorizer callback] is the name
-** of the inner-most trigger or view that is responsible for
-** the access attempt or NULL if this access attempt is directly from
-** top-level SQL code.
+** Requirements:
+** [H12551] [H12552] [H12553] [H12554]
*/
/******************************************* 3rd ************ 4th ***********/
#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */
@@ -2226,7 +2551,7 @@ SQLITE_API int sqlite3_set_authorizer(
#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */
#define SQLITE_READ 20 /* Table Name Column Name */
#define SQLITE_SELECT 21 /* NULL NULL */
-#define SQLITE_TRANSACTION 22 /* NULL NULL */
+#define SQLITE_TRANSACTION 22 /* Operation NULL */
#define SQLITE_UPDATE 23 /* Table Name Column Name */
#define SQLITE_ATTACH 24 /* Filename NULL */
#define SQLITE_DETACH 25 /* Database Name NULL */
@@ -2235,11 +2560,13 @@ SQLITE_API int sqlite3_set_authorizer(
#define SQLITE_ANALYZE 28 /* Table Name NULL */
#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */
#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */
-#define SQLITE_FUNCTION 31 /* Function Name NULL */
+#define SQLITE_FUNCTION 31 /* NULL Function Name */
+#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */
#define SQLITE_COPY 0 /* No longer used */
/*
-** CAPI3REF: Tracing And Profiling Functions {F12280}
+** CAPI3REF: Tracing And Profiling Functions {H12280} <S60400>
+** EXPERIMENTAL
**
** These routines register callback functions that can be used for
** tracing and profiling the execution of SQL statements.
@@ -2248,245 +2575,136 @@ SQLITE_API int sqlite3_set_authorizer(
** various times when an SQL statement is being run by [sqlite3_step()].
** The callback returns a UTF-8 rendering of the SQL statement text
** as the statement first begins executing. Additional callbacks occur
-** as each triggersubprogram is entered. The callbacks for triggers
+** as each triggered subprogram is entered. The callbacks for triggers
** contain a UTF-8 SQL comment that identifies the trigger.
-**
+**
** The callback function registered by sqlite3_profile() is invoked
** as each SQL statement finishes. The profile callback contains
** the original statement text and an estimate of wall-clock time
** of how long that statement took to run.
**
-** The sqlite3_profile() API is currently considered experimental and
-** is subject to change or removal in a future release.
-**
-** The trigger reporting feature of the trace callback is considered
-** experimental and is subject to change or removal in future releases.
-** Future versions of SQLite might also add new trace callback
-** invocations.
-**
-** INVARIANTS:
-**
-** {F12281} The callback function registered by [sqlite3_trace()] is
-** whenever an SQL statement first begins to execute and
-** whenever a trigger subprogram first begins to run.
-**
-** {F12282} Each call to [sqlite3_trace()] overrides the previously
-** registered trace callback.
-**
-** {F12283} A NULL trace callback disables tracing.
-**
-** {F12284} The first argument to the trace callback is a copy of
-** the pointer which was the 3rd argument to [sqlite3_trace()].
-**
-** {F12285} The second argument to the trace callback is a
-** zero-terminated UTF8 string containing the original text
-** of the SQL statement as it was passed into [sqlite3_prepare_v2()]
-** or the equivalent, or an SQL comment indicating the beginning
-** of a trigger subprogram.
-**
-** {F12287} The callback function registered by [sqlite3_profile()] is invoked
-** as each SQL statement finishes.
-**
-** {F12288} The first parameter to the profile callback is a copy of
-** the 3rd parameter to [sqlite3_profile()].
-**
-** {F12289} The second parameter to the profile callback is a
-** zero-terminated UTF-8 string that contains the complete text of
-** the SQL statement as it was processed by [sqlite3_prepare_v2()]
-** or the equivalent.
-**
-** {F12290} The third parameter to the profile callback is an estimate
-** of the number of nanoseconds of wall-clock time required to
-** run the SQL statement from start to finish.
+** Requirements:
+** [H12281] [H12282] [H12283] [H12284] [H12285] [H12287] [H12288] [H12289]
+** [H12290]
*/
-SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
-SQLITE_API void *sqlite3_profile(sqlite3*,
+SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
+SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
void(*xProfile)(void*,const char*,sqlite3_uint64), void*);
/*
-** CAPI3REF: Query Progress Callbacks {F12910}
+** CAPI3REF: Query Progress Callbacks {H12910} <S60400>
**
** This routine configures a callback function - the
** progress callback - that is invoked periodically during long
** running calls to [sqlite3_exec()], [sqlite3_step()] and
-** [sqlite3_get_table()]. An example use for this
+** [sqlite3_get_table()]. An example use for this
** interface is to keep a GUI updated during a large query.
**
-** If the progress callback returns non-zero, the opertion is
+** If the progress callback returns non-zero, the operation is
** interrupted. This feature can be used to implement a
-** "Cancel" button on a GUI dialog box.
-**
-** INVARIANTS:
-**
-** {F12911} The callback function registered by [sqlite3_progress_handler()]
-** is invoked periodically during long running calls to
-** [sqlite3_step()].
-**
-** {F12912} The progress callback is invoked once for every N virtual
-** machine opcodes, where N is the second argument to
-** the [sqlite3_progress_handler()] call that registered
-** the callback. <todo>What if N is less than 1?</todo>
+** "Cancel" button on a GUI progress dialog box.
**
-** {F12913} The progress callback itself is identified by the third
-** argument to [sqlite3_progress_handler()].
+** The progress handler must not do anything that will modify
+** the database connection that invoked the progress handler.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12914} The fourth argument [sqlite3_progress_handler()] is a
-*** void pointer passed to the progress callback
-** function each time it is invoked.
+** Requirements:
+** [H12911] [H12912] [H12913] [H12914] [H12915] [H12916] [H12917] [H12918]
**
-** {F12915} If a call to [sqlite3_step()] results in fewer than
-** N opcodes being executed,
-** then the progress callback is never invoked. {END}
-**
-** {F12916} Every call to [sqlite3_progress_handler()]
-** overwrites any previously registere progress handler.
-**
-** {F12917} If the progress handler callback is NULL then no progress
-** handler is invoked.
-**
-** {F12918} If the progress callback returns a result other than 0, then
-** the behavior is a if [sqlite3_interrupt()] had been called.
*/
SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
/*
-** CAPI3REF: Opening A New Database Connection {F12700}
-**
-** These routines open an SQLite database file whose name
-** is given by the filename argument.
-** The filename argument is interpreted as UTF-8
-** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16
-** in the native byte order for [sqlite3_open16()].
-** An [sqlite3*] handle is usually returned in *ppDb, even
-** if an error occurs. The only exception is if SQLite is unable
-** to allocate memory to hold the [sqlite3] object, a NULL will
-** be written into *ppDb instead of a pointer to the [sqlite3] object.
-** If the database is opened (and/or created)
-** successfully, then [SQLITE_OK] is returned. Otherwise an
-** error code is returned. The
-** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
+** CAPI3REF: Opening A New Database Connection {H12700} <S40200>
+**
+** These routines open an SQLite database file whose name is given by the
+** filename argument. The filename argument is interpreted as UTF-8 for
+** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte
+** order for sqlite3_open16(). A [database connection] handle is usually
+** returned in *ppDb, even if an error occurs. The only exception is that
+** if SQLite is unable to allocate memory to hold the [sqlite3] object,
+** a NULL will be written into *ppDb instead of a pointer to the [sqlite3]
+** object. If the database is opened (and/or created) successfully, then
+** [SQLITE_OK] is returned. Otherwise an [error code] is returned. The
+** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
** an English language description of the error.
**
** The default encoding for the database will be UTF-8 if
-** [sqlite3_open()] or [sqlite3_open_v2()] is called and
-** UTF-16 in the native byte order if [sqlite3_open16()] is used.
+** sqlite3_open() or sqlite3_open_v2() is called and
+** UTF-16 in the native byte order if sqlite3_open16() is used.
**
** Whether or not an error occurs when it is opened, resources
-** associated with the [sqlite3*] handle should be released by passing it
-** to [sqlite3_close()] when it is no longer required.
+** associated with the [database connection] handle should be released by
+** passing it to [sqlite3_close()] when it is no longer required.
**
-** The [sqlite3_open_v2()] interface works like [sqlite3_open()]
-** except that it acccepts two additional parameters for additional control
-** over the new database connection. The flags parameter can be
-** one of:
+** The sqlite3_open_v2() interface works like sqlite3_open()
+** except that it accepts two additional parameters for additional control
+** over the new database connection. The flags parameter can take one of
+** the following three values, optionally combined with the
+** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
+** and/or [SQLITE_OPEN_PRIVATECACHE] flags:
**
-** <ol>
-** <li> [SQLITE_OPEN_READONLY]
-** <li> [SQLITE_OPEN_READWRITE]
-** <li> [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
-** </ol>
+** <dl>
+** <dt>[SQLITE_OPEN_READONLY]</dt>
+** <dd>The database is opened in read-only mode. If the database does not
+** already exist, an error is returned.</dd>
+**
+** <dt>[SQLITE_OPEN_READWRITE]</dt>
+** <dd>The database is opened for reading and writing if possible, or reading
+** only if the file is write protected by the operating system. In either
+** case the database must already exist, otherwise an error is returned.</dd>
+**
+** <dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
+** <dd>The database is opened for reading and writing, and is creates it if
+** it does not already exist. This is the behavior that is always used for
+** sqlite3_open() and sqlite3_open16().</dd>
+** </dl>
+**
+** If the 3rd parameter to sqlite3_open_v2() is not one of the
+** combinations shown above or one of the combinations shown above combined
+** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX],
+** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_SHAREDCACHE] flags,
+** then the behavior is undefined.
**
-** The first value opens the database read-only.
-** If the database does not previously exist, an error is returned.
-** The second option opens
-** the database for reading and writing if possible, or reading only if
-** if the file is write protected. In either case the database
-** must already exist or an error is returned. The third option
-** opens the database for reading and writing and creates it if it does
-** not already exist.
-** The third options is behavior that is always used for [sqlite3_open()]
-** and [sqlite3_open16()].
-**
-** If the 3rd parameter to [sqlite3_open_v2()] is not one of the
-** combinations shown above then the behavior is undefined.
-**
-** If the filename is ":memory:", then an private
-** in-memory database is created for the connection. This in-memory
-** database will vanish when the database connection is closed. Future
-** version of SQLite might make use of additional special filenames
-** that begin with the ":" character. It is recommended that
-** when a database filename really does begin with
-** ":" that you prefix the filename with a pathname like "./" to
-** avoid ambiguity.
-**
-** If the filename is an empty string, then a private temporary
+** If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection
+** opens in the multi-thread [threading mode] as long as the single-thread
+** mode has not been set at compile-time or start-time. If the
+** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens
+** in the serialized [threading mode] unless single-thread was
+** previously selected at compile-time or start-time.
+** The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be
+** eligible to use [shared cache mode], regardless of whether or not shared
+** cache is enabled using [sqlite3_enable_shared_cache()]. The
+** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not
+** participate in [shared cache mode] even if it is enabled.
+**
+** If the filename is ":memory:", then a private, temporary in-memory database
+** is created for the connection. This in-memory database will vanish when
+** the database connection is closed. Future versions of SQLite might
+** make use of additional special filenames that begin with the ":" character.
+** It is recommended that when a database filename actually does begin with
+** a ":" character you should prefix the filename with a pathname such as
+** "./" to avoid ambiguity.
+**
+** If the filename is an empty string, then a private, temporary
** on-disk database will be created. This private database will be
** automatically deleted as soon as the database connection is closed.
**
** The fourth parameter to sqlite3_open_v2() is the name of the
-** [sqlite3_vfs] object that defines the operating system
-** interface that the new database connection should use. If the
-** fourth parameter is a NULL pointer then the default [sqlite3_vfs]
-** object is used.
+** [sqlite3_vfs] object that defines the operating system interface that
+** the new database connection should use. If the fourth parameter is
+** a NULL pointer then the default [sqlite3_vfs] object is used.
**
-** <b>Note to windows users:</b> The encoding used for the filename argument
-** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever
+** <b>Note to Windows users:</b> The encoding used for the filename argument
+** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever
** codepage is currently defined. Filenames containing international
** characters must be converted to UTF-8 prior to passing them into
-** [sqlite3_open()] or [sqlite3_open_v2()].
-**
-** INVARIANTS:
-**
-** {F12701} The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces create a new
-** [database connection] associated with
-** the database file given in their first parameter.
-**
-** {F12702} The filename argument is interpreted as UTF-8
-** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16
-** in the native byte order for [sqlite3_open16()].
-**
-** {F12703} A successful invocation of [sqlite3_open()], [sqlite3_open16()],
-** or [sqlite3_open_v2()] writes a pointer to a new
-** [database connection] into *ppDb.
-**
-** {F12704} The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces return [SQLITE_OK] upon success,
-** or an appropriate [error code] on failure.
+** sqlite3_open() or sqlite3_open_v2().
**
-** {F12706} The default text encoding for a new database created using
-** [sqlite3_open()] or [sqlite3_open_v2()] will be UTF-8.
-**
-** {F12707} The default text encoding for a new database created using
-** [sqlite3_open16()] will be UTF-16.
-**
-** {F12709} The [sqlite3_open(F,D)] interface is equivalent to
-** [sqlite3_open_v2(F,D,G,0)] where the G parameter is
-** [SQLITE_OPEN_READWRITE]|[SQLITE_OPEN_CREATE].
-**
-** {F12711} If the G parameter to [sqlite3_open_v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_READONLY] then the database is opened
-** for reading only.
-**
-** {F12712} If the G parameter to [sqlite3_open_v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_READWRITE] then the database is opened
-** reading and writing if possible, or for reading only if the
-** file is write protected by the operating system.
-**
-** {F12713} If the G parameter to [sqlite3_open(v2(F,D,G,V)] omits the
-** bit value [SQLITE_OPEN_CREATE] and the database does not
-** previously exist, an error is returned.
-**
-** {F12714} If the G parameter to [sqlite3_open(v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_CREATE] and the database does not
-** previously exist, then an attempt is made to create and
-** initialize the database.
-**
-** {F12717} If the filename argument to [sqlite3_open()], [sqlite3_open16()],
-** or [sqlite3_open_v2()] is ":memory:", then an private,
-** ephemeral, in-memory database is created for the connection.
-** <todo>Is SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE required
-** in sqlite3_open_v2()?</todo>
-**
-** {F12719} If the filename is NULL or an empty string, then a private,
-** ephermeral on-disk database will be created.
-** <todo>Is SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE required
-** in sqlite3_open_v2()?</todo>
-**
-** {F12721} The [database connection] created by
-** [sqlite3_open_v2(F,D,G,V)] will use the
-** [sqlite3_vfs] object identified by the V parameter, or
-** the default [sqlite3_vfs] object is V is a NULL pointer.
+** Requirements:
+** [H12701] [H12702] [H12703] [H12704] [H12706] [H12707] [H12709] [H12711]
+** [H12712] [H12713] [H12714] [H12717] [H12719] [H12721] [H12723]
*/
SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
@@ -2504,68 +2722,61 @@ SQLITE_API int sqlite3_open_v2(
);
/*
-** CAPI3REF: Error Codes And Messages {F12800}
+** CAPI3REF: Error Codes And Messages {H12800} <S60200>
**
-** The sqlite3_errcode() interface returns the numeric
-** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code]
-** for the most recent failed sqlite3_* API call associated
-** with [sqlite3] handle 'db'. If a prior API call failed but the
-** most recent API call succeeded, the return value from sqlite3_errcode()
-** is undefined.
+** The sqlite3_errcode() interface returns the numeric [result code] or
+** [extended result code] for the most recent failed sqlite3_* API call
+** associated with a [database connection]. If a prior API call failed
+** but the most recent API call succeeded, the return value from
+** sqlite3_errcode() is undefined. The sqlite3_extended_errcode()
+** interface is the same except that it always returns the
+** [extended result code] even when extended result codes are
+** disabled.
**
** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
-** text that describes the error, as either UTF8 or UTF16 respectively.
+** text that describes the error, as either UTF-8 or UTF-16 respectively.
** Memory to hold the error message string is managed internally.
-** The application does not need to worry with freeing the result.
+** The application does not need to worry about freeing the result.
** However, the error string might be overwritten or deallocated by
** subsequent calls to other SQLite interface functions.
**
-** INVARIANTS:
-**
-** {F12801} The [sqlite3_errcode(D)] interface returns the numeric
-** [SQLITE_OK | result code] or
-** [SQLITE_IOERR_READ | extended result code]
-** for the most recently failed interface call associated
-** with [database connection] D.
+** When the serialized [threading mode] is in use, it might be the
+** case that a second error occurs on a separate thread in between
+** the time of the first error and the call to these interfaces.
+** When that happens, the second error will be reported since these
+** interfaces always report the most recent result. To avoid
+** this, each thread can obtain exclusive use of the [database connection] D
+** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning
+** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after
+** all calls to the interfaces listed here are completed.
**
-** {F12803} The [sqlite3_errmsg(D)] and [sqlite3_errmsg16(D)]
-** interfaces return English-language text that describes
-** the error in the mostly recently failed interface call,
-** encoded as either UTF8 or UTF16 respectively.
+** If an interface fails with SQLITE_MISUSE, that means the interface
+** was invoked incorrectly by the application. In that case, the
+** error code and message may or may not be set.
**
-** {F12807} The strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]
-** are valid until the next SQLite interface call.
-**
-** {F12808} Calls to API routines that do not return an error code
-** (example: [sqlite3_data_count()]) do not
-** change the error code or message returned by
-** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()].
-**
-** {F12809} Interfaces that are not associated with a specific
-** [database connection] (examples:
-** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()]
-** do not change the values returned by
-** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()].
+** Requirements:
+** [H12801] [H12802] [H12803] [H12807] [H12808] [H12809]
*/
SQLITE_API int sqlite3_errcode(sqlite3 *db);
+SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
SQLITE_API const char *sqlite3_errmsg(sqlite3*);
SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
/*
-** CAPI3REF: SQL Statement Object {F13000}
+** CAPI3REF: SQL Statement Object {H13000} <H13010>
** KEYWORDS: {prepared statement} {prepared statements}
**
-** An instance of this object represent single SQL statements. This
-** object is variously known as a "prepared statement" or a
+** An instance of this object represents a single SQL statement.
+** This object is variously known as a "prepared statement" or a
** "compiled SQL statement" or simply as a "statement".
-**
+**
** The life of a statement object goes something like this:
**
** <ol>
** <li> Create the object using [sqlite3_prepare_v2()] or a related
** function.
-** <li> Bind values to host parameters using
-** [sqlite3_bind_blob | sqlite3_bind_* interfaces].
+** <li> Bind values to [host parameters] using the sqlite3_bind_*()
+** interfaces.
** <li> Run the SQL by calling [sqlite3_step()] one or more times.
** <li> Reset the statement using [sqlite3_reset()] then go back
** to step 2. Do this zero or more times.
@@ -2578,7 +2789,7 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
typedef struct sqlite3_stmt sqlite3_stmt;
/*
-** CAPI3REF: Run-time Limits {F12760}
+** CAPI3REF: Run-time Limits {H12760} <S20600>
**
** This interface allows the size of various constructs to be limited
** on a connection by connection basis. The first parameter is the
@@ -2588,8 +2799,10 @@ typedef struct sqlite3_stmt sqlite3_stmt;
** new limit for that construct. The function returns the old limit.
**
** If the new limit is a negative number, the limit is unchanged.
-** For the limit category of SQLITE_LIMIT_XYZ there is a hard upper
-** bound set by a compile-time C-preprocess macro named SQLITE_MAX_XYZ.
+** For the limit category of SQLITE_LIMIT_XYZ there is a
+** [limits | hard upper bound]
+** set by a compile-time C preprocessor macro named
+** [limits | SQLITE_MAX_XYZ].
** (The "_LIMIT_" in the name is changed to "_MAX_".)
** Attempts to increase a limit above its hard upper bound are
** silently truncated to the hard upper limit.
@@ -2597,55 +2810,42 @@ typedef struct sqlite3_stmt sqlite3_stmt;
** Run time limits are intended for use in applications that manage
** both their own internal database and also databases that are controlled
** by untrusted external sources. An example application might be a
-** webbrowser that has its own databases for storing history and
-** separate databases controlled by javascript applications downloaded
-** off the internet. The internal databases can be given the
+** web browser that has its own databases for storing history and
+** separate databases controlled by JavaScript applications downloaded
+** off the Internet. The internal databases can be given the
** large, default limits. Databases managed by external sources can
** be given much smaller limits designed to prevent a denial of service
-** attach. Developers might also want to use the [sqlite3_set_authorizer()]
+** attack. Developers might also want to use the [sqlite3_set_authorizer()]
** interface to further control untrusted SQL. The size of the database
** created by an untrusted script can be contained using the
** [max_page_count] [PRAGMA].
**
-** This interface is currently considered experimental and is subject
-** to change or removal without prior notice.
-**
-** INVARIANTS:
+** New run-time limit categories may be added in future releases.
**
-** {F12762} A successful call to [sqlite3_limit(D,C,V)] where V is
-** positive changes the
-** limit on the size of construct C in [database connection] D
-** to the lessor of V and the hard upper bound on the size
-** of C that is set at compile-time.
-**
-** {F12766} A successful call to [sqlite3_limit(D,C,V)] where V is negative
-** leaves the state of [database connection] D unchanged.
-**
-** {F12769} A successful call to [sqlite3_limit(D,C,V)] returns the
-** value of the limit on the size of construct C in
-** in [database connection] D as it was prior to the call.
+** Requirements:
+** [H12762] [H12766] [H12769]
*/
SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
/*
-** CAPI3REF: Run-Time Limit Categories {F12790}
+** CAPI3REF: Run-Time Limit Categories {H12790} <H12760>
** KEYWORDS: {limit category} {limit categories}
-**
-** These constants define various aspects of a [database connection]
-** that can be limited in size by calls to [sqlite3_limit()].
-** The meanings of the various limits are as follows:
+**
+** These constants define various performance limits
+** that can be lowered at run-time using [sqlite3_limit()].
+** The synopsis of the meanings of the various limits is shown below.
+** Additional information is available at [limits | Limits in SQLite].
**
** <dl>
** <dt>SQLITE_LIMIT_LENGTH</dt>
-** <dd>The maximum size of any
-** string or blob or table row.<dd>
+** <dd>The maximum size of any string or BLOB or table row.<dd>
**
** <dt>SQLITE_LIMIT_SQL_LENGTH</dt>
** <dd>The maximum length of an SQL statement.</dd>
**
** <dt>SQLITE_LIMIT_COLUMN</dt>
** <dd>The maximum number of columns in a table definition or in the
-** result set of a SELECT or the maximum number of columns in an index
+** result set of a [SELECT] or the maximum number of columns in an index
** or in an ORDER BY or GROUP BY clause.</dd>
**
** <dt>SQLITE_LIMIT_EXPR_DEPTH</dt>
@@ -2662,15 +2862,18 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** <dd>The maximum number of arguments on a function.</dd>
**
** <dt>SQLITE_LIMIT_ATTACHED</dt>
-** <dd>The maximum number of attached databases.</dd>
+** <dd>The maximum number of [ATTACH | attached databases].</dd>
**
** <dt>SQLITE_LIMIT_LIKE_PATTERN_LENGTH</dt>
-** <dd>The maximum length of the pattern argument to the LIKE or
-** GLOB operators.</dd>
+** <dd>The maximum length of the pattern argument to the [LIKE] or
+** [GLOB] operators.</dd>
**
** <dt>SQLITE_LIMIT_VARIABLE_NUMBER</dt>
** <dd>The maximum number of variables in an SQL statement that can
** be bound.</dd>
+**
+** <dt>SQLITE_LIMIT_TRIGGER_DEPTH</dt>
+** <dd>The maximum depth of recursion for triggers.</dd>
** </dl>
*/
#define SQLITE_LIMIT_LENGTH 0
@@ -2683,54 +2886,55 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
#define SQLITE_LIMIT_ATTACHED 7
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8
#define SQLITE_LIMIT_VARIABLE_NUMBER 9
+#define SQLITE_LIMIT_TRIGGER_DEPTH 10
/*
-** CAPI3REF: Compiling An SQL Statement {F13010}
+** CAPI3REF: Compiling An SQL Statement {H13010} <S10000>
+** KEYWORDS: {SQL statement compiler}
**
** To execute an SQL query, it must first be compiled into a byte-code
-** program using one of these routines.
+** program using one of these routines.
**
-** The first argument "db" is an [database connection]
-** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()]
-** or [sqlite3_open16()].
-** The second argument "zSql" is the statement to be compiled, encoded
+** The first argument, "db", is a [database connection] obtained from a
+** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or
+** [sqlite3_open16()]. The database connection must not have been closed.
+**
+** The second argument, "zSql", is the statement to be compiled, encoded
** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2()
-** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2()
-** use UTF-16. {END}
-**
-** If the nByte argument is less
-** than zero, then zSql is read up to the first zero terminator.
-** If nByte is non-negative, then it is the maximum number of
-** bytes read from zSql. When nByte is non-negative, the
-** zSql string ends at either the first '\000' or '\u0000' character or
+** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2()
+** use UTF-16.
+**
+** If the nByte argument is less than zero, then zSql is read up to the
+** first zero terminator. If nByte is non-negative, then it is the maximum
+** number of bytes read from zSql. When nByte is non-negative, the
+** zSql string ends at either the first '\000' or '\u0000' character or
** the nByte-th byte, whichever comes first. If the caller knows
** that the supplied string is nul-terminated, then there is a small
-** performance advantage to be had by passing an nByte parameter that
-** is equal to the number of bytes in the input string <i>including</i>
-** the nul-terminator bytes.{END}
+** performance advantage to be gained by passing an nByte parameter that
+** is equal to the number of bytes in the input string <i>including</i>
+** the nul-terminator bytes.
**
-** *pzTail is made to point to the first byte past the end of the
-** first SQL statement in zSql. These routines only compiles the first
-** statement in zSql, so *pzTail is left pointing to what remains
-** uncompiled.
+** If pzTail is not NULL then *pzTail is made to point to the first byte
+** past the end of the first SQL statement in zSql. These routines only
+** compile the first statement in zSql, so *pzTail is left pointing to
+** what remains uncompiled.
**
** *ppStmt is left pointing to a compiled [prepared statement] that can be
-** executed using [sqlite3_step()]. Or if there is an error, *ppStmt is
-** set to NULL. If the input text contains no SQL (if the input
-** is and empty string or a comment) then *ppStmt is set to NULL.
-** {U13018} The calling procedure is responsible for deleting the
-** compiled SQL statement
-** using [sqlite3_finalize()] after it has finished with it.
+** executed using [sqlite3_step()]. If there is an error, *ppStmt is set
+** to NULL. If the input text contains no SQL (if the input is an empty
+** string or a comment) then *ppStmt is set to NULL.
+** The calling procedure is responsible for deleting the compiled
+** SQL statement using [sqlite3_finalize()] after it has finished with it.
+** ppStmt may not be NULL.
**
-** On success, [SQLITE_OK] is returned. Otherwise an
-** [error code] is returned.
+** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned.
**
** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are
** recommended for all new programs. The two older interfaces are retained
** for backwards compatibility, but their use is discouraged.
** In the "v2" interfaces, the prepared statement
-** that is returned (the [sqlite3_stmt] object) contains a copy of the
-** original SQL text. {END} This causes the [sqlite3_step()] interface to
+** that is returned (the [sqlite3_stmt] object) contains a copy of the
+** original SQL text. This causes the [sqlite3_step()] interface to
** behave a differently in two ways:
**
** <ol>
@@ -2739,60 +2943,25 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
** always used to do, [sqlite3_step()] will automatically recompile the SQL
** statement and try to run it again. If the schema has changed in
** a way that makes the statement no longer valid, [sqlite3_step()] will still
-** return [SQLITE_SCHEMA]. But unlike the legacy behavior,
-** [SQLITE_SCHEMA] is now a fatal error. Calling
-** [sqlite3_prepare_v2()] again will not make the
+** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is
+** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the
** error go away. Note: use [sqlite3_errmsg()] to find the text
-** of the parsing error that results in an [SQLITE_SCHEMA] return. {END}
+** of the parsing error that results in an [SQLITE_SCHEMA] return.
** </li>
**
** <li>
-** When an error occurs,
-** [sqlite3_step()] will return one of the detailed
-** [error codes] or [extended error codes].
-** The legacy behavior was that [sqlite3_step()] would only return a generic
-** [SQLITE_ERROR] result code and you would have to make a second call to
-** [sqlite3_reset()] in order to find the underlying cause of the problem.
-** With the "v2" prepare interfaces, the underlying reason for the error is
-** returned immediately.
+** When an error occurs, [sqlite3_step()] will return one of the detailed
+** [error codes] or [extended error codes]. The legacy behavior was that
+** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code
+** and you would have to make a second call to [sqlite3_reset()] in order
+** to find the underlying cause of the problem. With the "v2" prepare
+** interfaces, the underlying reason for the error is returned immediately.
** </li>
** </ol>
**
-** INVARIANTS:
-**
-** {F13011} The [sqlite3_prepare(db,zSql,...)] and
-** [sqlite3_prepare_v2(db,zSql,...)] interfaces interpret the
-** text in their zSql parameter as UTF-8.
-**
-** {F13012} The [sqlite3_prepare16(db,zSql,...)] and
-** [sqlite3_prepare16_v2(db,zSql,...)] interfaces interpret the
-** text in their zSql parameter as UTF-16 in the native byte order.
-**
-** {F13013} If the nByte argument to [sqlite3_prepare_v2(db,zSql,nByte,...)]
-** and its variants is less than zero, then SQL text is
-** read from zSql is read up to the first zero terminator.
-**
-** {F13014} If the nByte argument to [sqlite3_prepare_v2(db,zSql,nByte,...)]
-** and its variants is non-negative, then at most nBytes bytes
-** SQL text is read from zSql.
+** Requirements:
+** [H13011] [H13012] [H13013] [H13014] [H13015] [H13016] [H13019] [H13021]
**
-** {F13015} In [sqlite3_prepare_v2(db,zSql,N,P,pzTail)] and its variants
-** if the zSql input text contains more than one SQL statement
-** and pzTail is not NULL, then *pzTail is made to point to the
-** first byte past the end of the first SQL statement in zSql.
-** <todo>What does *pzTail point to if there is one statement?</todo>
-**
-** {F13016} A successful call to [sqlite3_prepare_v2(db,zSql,N,ppStmt,...)]
-** or one of its variants writes into *ppStmt a pointer to a new
-** [prepared statement] or a pointer to NULL
-** if zSql contains nothing other than whitespace or comments.
-**
-** {F13019} The [sqlite3_prepare_v2()] interface and its variants return
-** [SQLITE_OK] or an appropriate [error code] upon failure.
-**
-** {F13021} Before [sqlite3_prepare(db,zSql,nByte,ppStmt,pzTail)] or its
-** variants returns an error (any value other than [SQLITE_OK])
-** it first sets *ppStmt to NULL.
*/
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
@@ -2824,85 +2993,78 @@ SQLITE_API int sqlite3_prepare16_v2(
);
/*
-** CAPIREF: Retrieving Statement SQL {F13100}
-**
-** This intereface can be used to retrieve a saved copy of the original
-** SQL text used to create a [prepared statement].
-**
-** INVARIANTS:
+** CAPI3REF: Retrieving Statement SQL {H13100} <H13000>
**
-** {F13101} If the [prepared statement] passed as
-** the an argument to [sqlite3_sql()] was compiled
-** compiled using either [sqlite3_prepare_v2()] or
-** [sqlite3_prepare16_v2()],
-** then [sqlite3_sql()] function returns a pointer to a
-** zero-terminated string containing a UTF-8 rendering
-** of the original SQL statement.
+** This interface can be used to retrieve a saved copy of the original
+** SQL text used to create a [prepared statement] if that statement was
+** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()].
**
-** {F13102} If the [prepared statement] passed as
-** the an argument to [sqlite3_sql()] was compiled
-** compiled using either [sqlite3_prepare()] or
-** [sqlite3_prepare16()],
-** then [sqlite3_sql()] function returns a NULL pointer.
-**
-** {F13103} The string returned by [sqlite3_sql(S)] is valid until the
-** [prepared statement] S is deleted using [sqlite3_finalize(S)].
+** Requirements:
+** [H13101] [H13102] [H13103]
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Dynamically Typed Value Object {F15000}
+** CAPI3REF: Dynamically Typed Value Object {H15000} <S20200>
** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value}
**
** SQLite uses the sqlite3_value object to represent all values
-** that can be stored in a database table.
-** SQLite uses dynamic typing for the values it stores.
-** Values stored in sqlite3_value objects can be
-** be integers, floating point values, strings, BLOBs, or NULL.
+** that can be stored in a database table. SQLite uses dynamic typing
+** for the values it stores. Values stored in sqlite3_value objects
+** can be integers, floating point values, strings, BLOBs, or NULL.
**
** An sqlite3_value object may be either "protected" or "unprotected".
** Some interfaces require a protected sqlite3_value. Other interfaces
** will accept either a protected or an unprotected sqlite3_value.
-** Every interface that accepts sqlite3_value arguments specifies
+** Every interface that accepts sqlite3_value arguments specifies
** whether or not it requires a protected sqlite3_value.
**
** The terms "protected" and "unprotected" refer to whether or not
** a mutex is held. A internal mutex is held for a protected
** sqlite3_value object but no mutex is held for an unprotected
** sqlite3_value object. If SQLite is compiled to be single-threaded
-** (with SQLITE_THREADSAFE=0 and with [sqlite3_threadsafe()] returning 0)
-** then there is no distinction between
-** protected and unprotected sqlite3_value objects and they can be
-** used interchangable. However, for maximum code portability it
-** is recommended that applications make the distinction between
-** between protected and unprotected sqlite3_value objects even if
-** they are single threaded.
+** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0)
+** or if SQLite is run in one of reduced mutex modes
+** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD]
+** then there is no distinction between protected and unprotected
+** sqlite3_value objects and they can be used interchangeably. However,
+** for maximum code portability it is recommended that applications
+** still make the distinction between between protected and unprotected
+** sqlite3_value objects even when not strictly required.
**
** The sqlite3_value objects that are passed as parameters into the
-** implementation of application-defined SQL functions are protected.
+** implementation of [application-defined SQL functions] are protected.
** The sqlite3_value object returned by
** [sqlite3_column_value()] is unprotected.
** Unprotected sqlite3_value objects may only be used with
-** [sqlite3_result_value()] and [sqlite3_bind_value()]. All other
-** interfaces that use sqlite3_value require protected sqlite3_value objects.
+** [sqlite3_result_value()] and [sqlite3_bind_value()].
+** The [sqlite3_value_blob | sqlite3_value_type()] family of
+** interfaces require protected sqlite3_value objects.
*/
typedef struct Mem sqlite3_value;
/*
-** CAPI3REF: SQL Function Context Object {F16001}
+** CAPI3REF: SQL Function Context Object {H16001} <S20200>
**
** The context in which an SQL function executes is stored in an
-** sqlite3_context object. A pointer to an sqlite3_context
-** object is always first parameter to application-defined SQL functions.
+** sqlite3_context object. A pointer to an sqlite3_context object
+** is always first parameter to [application-defined SQL functions].
+** The application-defined SQL function implementation will pass this
+** pointer through into calls to [sqlite3_result_int | sqlite3_result()],
+** [sqlite3_aggregate_context()], [sqlite3_user_data()],
+** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()],
+** and/or [sqlite3_set_auxdata()].
*/
typedef struct sqlite3_context sqlite3_context;
/*
-** CAPI3REF: Binding Values To Prepared Statements {F13500}
+** CAPI3REF: Binding Values To Prepared Statements {H13500} <S70300>
+** KEYWORDS: {host parameter} {host parameters} {host parameter name}
+** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding}
**
-** In the SQL strings input to [sqlite3_prepare_v2()] and its
-** variants, literals may be replace by a parameter in one
-** of these forms:
+** In the SQL strings input to [sqlite3_prepare_v2()] and its variants,
+** literals may be replaced by a [parameter] that matches one of following
+** templates:
**
** <ul>
** <li> ?
@@ -2912,33 +3074,32 @@ typedef struct sqlite3_context sqlite3_context;
** <li> $VVV
** </ul>
**
-** In the parameter forms shown above NNN is an integer literal,
-** VVV alpha-numeric parameter name.
-** The values of these parameters (also called "host parameter names"
-** or "SQL parameters")
+** In the templates above, NNN represents an integer literal,
+** and VVV represents an alphanumeric identifer. The values of these
+** parameters (also called "host parameter names" or "SQL parameters")
** can be set using the sqlite3_bind_*() routines defined here.
**
-** The first argument to the sqlite3_bind_*() routines always
-** is a pointer to the [sqlite3_stmt] object returned from
-** [sqlite3_prepare_v2()] or its variants. The second
-** argument is the index of the parameter to be set. The
-** first parameter has an index of 1. When the same named
-** parameter is used more than once, second and subsequent
-** occurrences have the same index as the first occurrence.
+** The first argument to the sqlite3_bind_*() routines is always
+** a pointer to the [sqlite3_stmt] object returned from
+** [sqlite3_prepare_v2()] or its variants.
+**
+** The second argument is the index of the SQL parameter to be set.
+** The leftmost SQL parameter has an index of 1. When the same named
+** SQL parameter is used more than once, second and subsequent
+** occurrences have the same index as the first occurrence.
** The index for named parameters can be looked up using the
-** [sqlite3_bind_parameter_name()] API if desired. The index
+** [sqlite3_bind_parameter_index()] API if desired. The index
** for "?NNN" parameters is the value of NNN.
-** The NNN value must be between 1 and the compile-time
-** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999).
+** The NNN value must be between 1 and the [sqlite3_limit()]
+** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999).
**
** The third argument is the value to bind to the parameter.
**
-** In those
-** routines that have a fourth argument, its value is the number of bytes
-** in the parameter. To be clear: the value is the number of <u>bytes</u>
-** in the value, not the number of characters.
+** In those routines that have a fourth argument, its value is the
+** number of bytes in the parameter. To be clear: the value is the
+** number of <u>bytes</u> in the value, not the number of characters.
** If the fourth parameter is negative, the length of the string is
-** number of bytes up to the first zero terminator.
+** the number of bytes up to the first zero terminator.
**
** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
@@ -2950,12 +3111,12 @@ typedef struct sqlite3_context sqlite3_context;
** the sqlite3_bind_*() routine returns.
**
** The sqlite3_bind_zeroblob() routine binds a BLOB of length N that
-** is filled with zeros. A zeroblob uses a fixed amount of memory
-** (just an integer to hold it size) while it is being processed.
-** Zeroblobs are intended to serve as place-holders for BLOBs whose
-** content is later written using
-** [sqlite3_blob_open | increment BLOB I/O] routines. A negative
-** value for the zeroblob results in a zero-length BLOB.
+** is filled with zeroes. A zeroblob uses a fixed amount of memory
+** (just an integer to hold its size) while it is being processed.
+** Zeroblobs are intended to serve as placeholders for BLOBs whose
+** content is later written using
+** [sqlite3_blob_open | incremental BLOB I/O] routines.
+** A negative value for the zeroblob results in a zero-length BLOB.
**
** The sqlite3_bind_*() routines must be called after
** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and
@@ -2965,7 +3126,7 @@ typedef struct sqlite3_context sqlite3_context;
**
** These routines return [SQLITE_OK] on success or an error code if
** anything goes wrong. [SQLITE_RANGE] is returned if the parameter
-** index is out of range. [SQLITE_NOMEM] is returned if malloc fails.
+** index is out of range. [SQLITE_NOMEM] is returned if malloc() fails.
** [SQLITE_MISUSE] might be returned if these routines are called on a
** virtual machine that is the wrong state or which has already been finalized.
** Detection of misuse is unreliable. Applications should not depend
@@ -2974,81 +3135,12 @@ typedef struct sqlite3_context sqlite3_context;
** panic rather than return SQLITE_MISUSE.
**
** See also: [sqlite3_bind_parameter_count()],
-** [sqlite3_bind_parameter_name()], and
-** [sqlite3_bind_parameter_index()].
-**
-** INVARIANTS:
-**
-** {F13506} The [sqlite3_prepare | SQL statement compiler] recognizes
-** tokens of the forms "?", "?NNN", "$VVV", ":VVV", and "@VVV"
-** as SQL parameters, where NNN is any sequence of one or more
-** digits and where VVV is any sequence of one or more
-** alphanumeric characters or "::" optionally followed by
-** a string containing no spaces and contained within parentheses.
-**
-** {F13509} The initial value of an SQL parameter is NULL.
-**
-** {F13512} The index of an "?" SQL parameter is one larger than the
-** largest index of SQL parameter to the left, or 1 if
-** the "?" is the leftmost SQL parameter.
-**
-** {F13515} The index of an "?NNN" SQL parameter is the integer NNN.
-**
-** {F13518} The index of an ":VVV", "$VVV", or "@VVV" SQL parameter is
-** the same as the index of leftmost occurances of the same
-** parameter, or one more than the largest index over all
-** parameters to the left if this is the first occurrance
-** of this parameter, or 1 if this is the leftmost parameter.
+** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()].
**
-** {F13521} The [sqlite3_prepare | SQL statement compiler] fail with
-** an [SQLITE_RANGE] error if the index of an SQL parameter
-** is less than 1 or greater than SQLITE_MAX_VARIABLE_NUMBER.
+** Requirements:
+** [H13506] [H13509] [H13512] [H13515] [H13518] [H13521] [H13524] [H13527]
+** [H13530] [H13533] [H13536] [H13539] [H13542] [H13545] [H13548] [H13551]
**
-** {F13524} Calls to [sqlite3_bind_text | sqlite3_bind(S,N,V,...)]
-** associate the value V with all SQL parameters having an
-** index of N in the [prepared statement] S.
-**
-** {F13527} Calls to [sqlite3_bind_text | sqlite3_bind(S,N,...)]
-** override prior calls with the same values of S and N.
-**
-** {F13530} Bindings established by [sqlite3_bind_text | sqlite3_bind(S,...)]
-** persist across calls to [sqlite3_reset(S)].
-**
-** {F13533} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] SQLite binds the first L
-** bytes of the blob or string pointed to by V, when L
-** is non-negative.
-**
-** {F13536} In calls to [sqlite3_bind_text(S,N,V,L,D)] or
-** [sqlite3_bind_text16(S,N,V,L,D)] SQLite binds characters
-** from V through the first zero character when L is negative.
-**
-** {F13539} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is the special
-** constant [SQLITE_STATIC], SQLite assumes that the value V
-** is held in static unmanaged space that will not change
-** during the lifetime of the binding.
-**
-** {F13542} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is the special
-** constant [SQLITE_TRANSIENT], the routine makes a
-** private copy of V value before it returns.
-**
-** {F13545} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is a pointer to
-** a function, SQLite invokes that function to destroy the
-** V value after it has finished using the V value.
-**
-** {F13548} In calls to [sqlite3_bind_zeroblob(S,N,V,L)] the value bound
-** is a blob of L bytes, or a zero-length blob if L is negative.
-**
-** {F13551} In calls to [sqlite3_bind_value(S,N,V)] the V argument may
-** be either a [protected sqlite3_value] object or an
-** [unprotected sqlite3_value] object.
*/
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
@@ -3061,49 +3153,46 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
/*
-** CAPI3REF: Number Of SQL Parameters {F13600}
+** CAPI3REF: Number Of SQL Parameters {H13600} <S70300>
**
-** This routine can be used to find the number of SQL parameters
-** in a prepared statement. SQL parameters are tokens of the
+** This routine can be used to find the number of [SQL parameters]
+** in a [prepared statement]. SQL parameters are tokens of the
** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as
-** place-holders for values that are [sqlite3_bind_blob | bound]
+** placeholders for values that are [sqlite3_bind_blob | bound]
** to the parameters at a later time.
**
-** This routine actually returns the index of the largest parameter.
-** For all forms except ?NNN, this will correspond to the number of
-** unique parameters. If parameters of the ?NNN are used, there may
-** be gaps in the list.
+** This routine actually returns the index of the largest (rightmost)
+** parameter. For all forms except ?NNN, this will correspond to the
+** number of unique parameters. If parameters of the ?NNN are used,
+** there may be gaps in the list.
**
** See also: [sqlite3_bind_blob|sqlite3_bind()],
** [sqlite3_bind_parameter_name()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13601} The [sqlite3_bind_parameter_count(S)] interface returns
-** the largest index of all SQL parameters in the
-** [prepared statement] S, or 0 if S
-** contains no SQL parameters.
+** Requirements:
+** [H13601]
*/
SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*);
/*
-** CAPI3REF: Name Of A Host Parameter {F13620}
+** CAPI3REF: Name Of A Host Parameter {H13620} <S70300>
**
** This routine returns a pointer to the name of the n-th
-** SQL parameter in a [prepared statement].
+** [SQL parameter] in a [prepared statement].
** SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA"
** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA"
** respectively.
** In other words, the initial ":" or "$" or "@" or "?"
** is included as part of the name.
-** Parameters of the form "?" without a following integer have no name.
+** Parameters of the form "?" without a following integer have no name
+** and are also referred to as "anonymous parameters".
**
** The first host parameter has an index of 1, not 0.
**
** If the value n is out of range or if the n-th parameter is
** nameless, then NULL is returned. The returned string is
-** always in the UTF-8 encoding even if the named parameter was
+** always in UTF-8 encoding even if the named parameter was
** originally specified as UTF-16 in [sqlite3_prepare16()] or
** [sqlite3_prepare16_v2()].
**
@@ -3111,18 +3200,13 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*);
** [sqlite3_bind_parameter_count()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13621} The [sqlite3_bind_parameter_name(S,N)] interface returns
-** a UTF-8 rendering of the name of the SQL parameter in
-** [prepared statement] S having index N, or
-** NULL if there is no SQL parameter with index N or if the
-** parameter with index N is an anonymous parameter "?".
+** Requirements:
+** [H13621]
*/
SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
/*
-** CAPI3REF: Index Of A Parameter With A Given Name {F13640}
+** CAPI3REF: Index Of A Parameter With A Given Name {H13640} <S70300>
**
** Return the index of an SQL parameter given its name. The
** index value returned is suitable for use as the second
@@ -3135,64 +3219,49 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
** [sqlite3_bind_parameter_count()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13641} The [sqlite3_bind_parameter_index(S,N)] interface returns
-** the index of SQL parameter in [prepared statement]
-** S whose name matches the UTF-8 string N, or 0 if there is
-** no match.
+** Requirements:
+** [H13641]
*/
SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
/*
-** CAPI3REF: Reset All Bindings On A Prepared Statement {F13660}
-**
-** Contrary to the intuition of many, [sqlite3_reset()] does not
-** reset the [sqlite3_bind_blob | bindings] on a
-** [prepared statement]. Use this routine to
-** reset all host parameters to NULL.
+** CAPI3REF: Reset All Bindings On A Prepared Statement {H13660} <S70300>
**
-** INVARIANTS:
+** Contrary to the intuition of many, [sqlite3_reset()] does not reset
+** the [sqlite3_bind_blob | bindings] on a [prepared statement].
+** Use this routine to reset all host parameters to NULL.
**
-** {F13661} The [sqlite3_clear_bindings(S)] interface resets all
-** SQL parameter bindings in [prepared statement] S
-** back to NULL.
+** Requirements:
+** [H13661]
*/
SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*);
/*
-** CAPI3REF: Number Of Columns In A Result Set {F13710}
-**
-** Return the number of columns in the result set returned by the
-** [prepared statement]. This routine returns 0
-** if pStmt is an SQL statement that does not return data (for
-** example an UPDATE).
+** CAPI3REF: Number Of Columns In A Result Set {H13710} <S10700>
**
-** INVARIANTS:
+** Return the number of columns in the result set returned by the
+** [prepared statement]. This routine returns 0 if pStmt is an SQL
+** statement that does not return data (for example an [UPDATE]).
**
-** {F13711} The [sqlite3_column_count(S)] interface returns the number of
-** columns in the result set generated by the
-** [prepared statement] S, or 0 if S does not generate
-** a result set.
+** Requirements:
+** [H13711]
*/
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Column Names In A Result Set {F13720}
+** CAPI3REF: Column Names In A Result Set {H13720} <S10700>
**
** These routines return the name assigned to a particular column
-** in the result set of a SELECT statement. The sqlite3_column_name()
-** interface returns a pointer to a zero-terminated UTF8 string
+** in the result set of a [SELECT] statement. The sqlite3_column_name()
+** interface returns a pointer to a zero-terminated UTF-8 string
** and sqlite3_column_name16() returns a pointer to a zero-terminated
-** UTF16 string. The first parameter is the
-** [prepared statement] that implements the SELECT statement.
-** The second parameter is the column number. The left-most column is
-** number 0.
+** UTF-16 string. The first parameter is the [prepared statement]
+** that implements the [SELECT] statement. The second parameter is the
+** column number. The leftmost column is number 0.
**
-** The returned string pointer is valid until either the
-** [prepared statement] is destroyed by [sqlite3_finalize()]
-** or until the next call sqlite3_column_name() or sqlite3_column_name16()
-** on the same column.
+** The returned string pointer is valid until either the [prepared statement]
+** is destroyed by [sqlite3_finalize()] or until the next call to
+** sqlite3_column_name() or sqlite3_column_name16() on the same column.
**
** If sqlite3_malloc() fails during the processing of either routine
** (for example during a conversion from UTF-8 to UTF-16) then a
@@ -3203,139 +3272,56 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
** then the name of the column is unspecified and may change from
** one release of SQLite to the next.
**
-** INVARIANTS:
-**
-** {F13721} A successful invocation of the [sqlite3_column_name(S,N)]
-** interface returns the name
-** of the Nth column (where 0 is the left-most column) for the
-** result set of [prepared statement] S as a
-** zero-terminated UTF-8 string.
-**
-** {F13723} A successful invocation of the [sqlite3_column_name16(S,N)]
-** interface returns the name
-** of the Nth column (where 0 is the left-most column) for the
-** result set of [prepared statement] S as a
-** zero-terminated UTF-16 string in the native byte order.
-**
-** {F13724} The [sqlite3_column_name()] and [sqlite3_column_name16()]
-** interfaces return a NULL pointer if they are unable to
-** allocate memory memory to hold there normal return strings.
-**
-** {F13725} If the N parameter to [sqlite3_column_name(S,N)] or
-** [sqlite3_column_name16(S,N)] is out of range, then the
-** interfaces returns a NULL pointer.
-**
-** {F13726} The strings returned by [sqlite3_column_name(S,N)] and
-** [sqlite3_column_name16(S,N)] are valid until the next
-** call to either routine with the same S and N parameters
-** or until [sqlite3_finalize(S)] is called.
-**
-** {F13727} When a result column of a [SELECT] statement contains
-** an AS clause, the name of that column is the indentifier
-** to the right of the AS keyword.
+** Requirements:
+** [H13721] [H13723] [H13724] [H13725] [H13726] [H13727]
*/
SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N);
SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N);
/*
-** CAPI3REF: Source Of Data In A Query Result {F13740}
+** CAPI3REF: Source Of Data In A Query Result {H13740} <S10700>
**
** These routines provide a means to determine what column of what
-** table in which database a result of a SELECT statement comes from.
+** table in which database a result of a [SELECT] statement comes from.
** The name of the database or table or column can be returned as
-** either a UTF8 or UTF16 string. The _database_ routines return
+** either a UTF-8 or UTF-16 string. The _database_ routines return
** the database name, the _table_ routines return the table name, and
** the origin_ routines return the column name.
-** The returned string is valid until
-** the [prepared statement] is destroyed using
-** [sqlite3_finalize()] or until the same information is requested
+** The returned string is valid until the [prepared statement] is destroyed
+** using [sqlite3_finalize()] or until the same information is requested
** again in a different encoding.
**
** The names returned are the original un-aliased names of the
** database, table, and column.
**
** The first argument to the following calls is a [prepared statement].
-** These functions return information about the Nth column returned by
+** These functions return information about the Nth column returned by
** the statement, where N is the second function argument.
**
-** If the Nth column returned by the statement is an expression
-** or subquery and is not a column value, then all of these functions
-** return NULL. These routine might also return NULL if a memory
-** allocation error occurs. Otherwise, they return the
-** name of the attached database, table and column that query result
-** column was extracted from.
+** If the Nth column returned by the statement is an expression or
+** subquery and is not a column value, then all of these functions return
+** NULL. These routine might also return NULL if a memory allocation error
+** occurs. Otherwise, they return the name of the attached database, table
+** and column that query result column was extracted from.
**
** As with all other SQLite APIs, those postfixed with "16" return
** UTF-16 encoded strings, the other functions return UTF-8. {END}
**
-** These APIs are only available if the library was compiled with the
-** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined.
+** These APIs are only available if the library was compiled with the
+** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined.
**
-** {U13751}
+** {A13751}
** If two or more threads call one or more of these routines against the same
** prepared statement and column at the same time then the results are
** undefined.
**
-** INVARIANTS:
-**
-** {F13741} The [sqlite3_column_database_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the database from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13742} The [sqlite3_column_database_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the database from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13743} The [sqlite3_column_table_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the table from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13744} The [sqlite3_column_table_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the table from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13745} The [sqlite3_column_origin_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the table column from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13746} The [sqlite3_column_origin_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the table column from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13748} The return values from
-** [sqlite3_column_database_name|column metadata interfaces]
-** are valid
-** for the lifetime of the [prepared statement]
-** or until the encoding is changed by another metadata
-** interface call for the same prepared statement and column.
-**
-** LIMITATIONS:
-**
-** {U13751} If two or more threads call one or more
-** [sqlite3_column_database_name|column metadata interfaces]
-** the same [prepared statement] and result column
-** at the same time then the results are undefined.
+** Requirements:
+** [H13741] [H13742] [H13743] [H13744] [H13745] [H13746] [H13748]
+**
+** If two or more threads call one or more
+** [sqlite3_column_database_name | column metadata interfaces]
+** for the same [prepared statement] and result column
+** at the same time then the results are undefined.
*/
SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int);
SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
@@ -3345,26 +3331,26 @@ SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
/*
-** CAPI3REF: Declared Datatype Of A Query Result {F13760}
+** CAPI3REF: Declared Datatype Of A Query Result {H13760} <S10700>
**
-** The first parameter is a [prepared statement].
-** If this statement is a SELECT statement and the Nth column of the
-** returned result set of that SELECT is a table column (not an
+** The first parameter is a [prepared statement].
+** If this statement is a [SELECT] statement and the Nth column of the
+** returned result set of that [SELECT] is a table column (not an
** expression or subquery) then the declared type of the table
** column is returned. If the Nth column of the result set is an
** expression or subquery, then a NULL pointer is returned.
-** The returned string is always UTF-8 encoded. {END}
-** For example, in the database schema:
+** The returned string is always UTF-8 encoded. {END}
+**
+** For example, given the database schema:
**
** CREATE TABLE t1(c1 VARIANT);
**
-** And the following statement compiled:
+** and the following statement to be compiled:
**
** SELECT c1 + 1, c1 FROM t1;
**
-** Then this routine would return the string "VARIANT" for the second
-** result column (i==1), and a NULL pointer for the first result column
-** (i==0).
+** this routine would return the string "VARIANT" for the second result
+** column (i==1), and a NULL pointer for the first result column (i==0).
**
** SQLite uses dynamic run-time typing. So just because a column
** is declared to contain a particular type does not mean that the
@@ -3373,57 +3359,36 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
** is associated with individual values, not with the containers
** used to hold those values.
**
-** INVARIANTS:
-**
-** {F13761} A successful call to [sqlite3_column_decltype(S,N)]
-** returns a zero-terminated UTF-8 string containing the
-** the declared datatype of the table column that appears
-** as the Nth column (numbered from 0) of the result set to the
-** [prepared statement] S.
-**
-** {F13762} A successful call to [sqlite3_column_decltype16(S,N)]
-** returns a zero-terminated UTF-16 native byte order string
-** containing the declared datatype of the table column that appears
-** as the Nth column (numbered from 0) of the result set to the
-** [prepared statement] S.
-**
-** {F13763} If N is less than 0 or N is greater than or equal to
-** the number of columns in [prepared statement] S
-** or if the Nth column of S is an expression or subquery rather
-** than a table column or if a memory allocation failure
-** occurs during encoding conversions, then
-** calls to [sqlite3_column_decltype(S,N)] or
-** [sqlite3_column_decltype16(S,N)] return NULL.
+** Requirements:
+** [H13761] [H13762] [H13763]
*/
SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int);
SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
-/*
-** CAPI3REF: Evaluate An SQL Statement {F13200}
+/*
+** CAPI3REF: Evaluate An SQL Statement {H13200} <S10000>
**
-** After an [prepared statement] has been prepared with a call
-** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of
-** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()],
-** then this function must be called one or more times to evaluate the
-** statement.
+** After a [prepared statement] has been prepared using either
+** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy
+** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function
+** must be called one or more times to evaluate the statement.
**
-** The details of the behavior of this sqlite3_step() interface depend
+** The details of the behavior of the sqlite3_step() interface depend
** on whether the statement was prepared using the newer "v2" interface
** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy
** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the
** new "v2" interface is recommended for new applications but the legacy
** interface will continue to be supported.
**
-** In the legacy interface, the return value will be either [SQLITE_BUSY],
+** In the legacy interface, the return value will be either [SQLITE_BUSY],
** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE].
-** With the "v2" interface, any of the other [SQLITE_OK | result code]
-** or [SQLITE_IOERR_READ | extended result code] might be returned as
-** well.
+** With the "v2" interface, any of the other [result codes] or
+** [extended result codes] might be returned as well.
**
** [SQLITE_BUSY] means that the database engine was unable to acquire the
-** database locks it needs to do its job. If the statement is a COMMIT
+** database locks it needs to do its job. If the statement is a [COMMIT]
** or occurs outside of an explicit transaction, then you can retry the
-** statement. If the statement is not a COMMIT and occurs within a
+** statement. If the statement is not a [COMMIT] and occurs within a
** explicit transaction then you should rollback the transaction before
** continuing.
**
@@ -3432,16 +3397,15 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
** machine without first calling [sqlite3_reset()] to reset the virtual
** machine back to its initial state.
**
-** If the SQL statement being executed returns any data, then
-** [SQLITE_ROW] is returned each time a new row of data is ready
-** for processing by the caller. The values may be accessed using
-** the [sqlite3_column_int | column access functions].
+** If the SQL statement being executed returns any data, then [SQLITE_ROW]
+** is returned each time a new row of data is ready for processing by the
+** caller. The values may be accessed using the [column access functions].
** sqlite3_step() is called again to retrieve the next row of data.
-**
+**
** [SQLITE_ERROR] means that a run-time error (such as a constraint
** violation) has occurred. sqlite3_step() should not be called again on
** the VM. More information may be found by calling [sqlite3_errmsg()].
-** With the legacy interface, a more specific error code (example:
+** With the legacy interface, a more specific error code (for example,
** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth)
** can be obtained by calling [sqlite3_reset()] on the
** [prepared statement]. In the "v2" interface,
@@ -3449,80 +3413,43 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
**
** [SQLITE_MISUSE] means that the this routine was called inappropriately.
** Perhaps it was called on a [prepared statement] that has
-** already been [sqlite3_finalize | finalized] or on one that had
+** already been [sqlite3_finalize | finalized] or on one that had
** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could
** be the case that the same database connection is being used by two or
** more threads at the same moment in time.
**
-** <b>Goofy Interface Alert:</b>
-** In the legacy interface,
-** the sqlite3_step() API always returns a generic error code,
-** [SQLITE_ERROR], following any error other than [SQLITE_BUSY]
-** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or
-** [sqlite3_finalize()] in order to find one of the specific
-** [error codes] that better describes the error.
+** <b>Goofy Interface Alert:</b> In the legacy interface, the sqlite3_step()
+** API always returns a generic error code, [SQLITE_ERROR], following any
+** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call
+** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the
+** specific [error codes] that better describes the error.
** We admit that this is a goofy design. The problem has been fixed
** with the "v2" interface. If you prepare all of your SQL statements
** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead
-** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the
-** more specific [error codes] are returned directly
+** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces,
+** then the more specific [error codes] are returned directly
** by sqlite3_step(). The use of the "v2" interface is recommended.
**
-** INVARIANTS:
-**
-** {F13202} If [prepared statement] S is ready to be
-** run, then [sqlite3_step(S)] advances that prepared statement
-** until to completion or until it is ready to return another
-** row of the result set or an interrupt or run-time error occurs.
-**
-** {F15304} When a call to [sqlite3_step(S)] causes the
-** [prepared statement] S to run to completion,
-** the function returns [SQLITE_DONE].
-**
-** {F15306} When a call to [sqlite3_step(S)] stops because it is ready
-** to return another row of the result set, it returns
-** [SQLITE_ROW].
-**
-** {F15308} If a call to [sqlite3_step(S)] encounters an
-** [sqlite3_interrupt|interrupt] or a run-time error,
-** it returns an appropraite error code that is not one of
-** [SQLITE_OK], [SQLITE_ROW], or [SQLITE_DONE].
-**
-** {F15310} If an [sqlite3_interrupt|interrupt] or run-time error
-** occurs during a call to [sqlite3_step(S)]
-** for a [prepared statement] S created using
-** legacy interfaces [sqlite3_prepare()] or
-** [sqlite3_prepare16()] then the function returns either
-** [SQLITE_ERROR], [SQLITE_BUSY], or [SQLITE_MISUSE].
+** Requirements:
+** [H13202] [H15304] [H15306] [H15308] [H15310]
*/
SQLITE_API int sqlite3_step(sqlite3_stmt*);
/*
-** CAPI3REF: Number of columns in a result set {F13770}
-**
-** Return the number of values in the current row of the result set.
+** CAPI3REF: Number of columns in a result set {H13770} <S10700>
**
-** INVARIANTS:
+** Returns the number of values in the current row of the result set.
**
-** {F13771} After a call to [sqlite3_step(S)] that returns
-** [SQLITE_ROW], the [sqlite3_data_count(S)] routine
-** will return the same value as the
-** [sqlite3_column_count(S)] function.
-**
-** {F13772} After [sqlite3_step(S)] has returned any value other than
-** [SQLITE_ROW] or before [sqlite3_step(S)] has been
-** called on the [prepared statement] for
-** the first time since it was [sqlite3_prepare|prepared]
-** or [sqlite3_reset|reset], the [sqlite3_data_count(S)]
-** routine returns zero.
+** Requirements:
+** [H13771] [H13772]
*/
SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Fundamental Datatypes {F10265}
+** CAPI3REF: Fundamental Datatypes {H10265} <S10110><S10120>
** KEYWORDS: SQLITE_TEXT
**
-** {F10266}Every value in SQLite has one of five fundamental datatypes:
+** {H10266} Every value in SQLite has one of five fundamental datatypes:
**
** <ul>
** <li> 64-bit signed integer
@@ -3536,7 +3463,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** Note that the SQLITE_TEXT constant was also used in SQLite version 2
** for a completely different meaning. Software that links against both
-** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not
+** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not
** SQLITE_TEXT.
*/
#define SQLITE_INTEGER 1
@@ -3551,33 +3478,31 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
#define SQLITE3_TEXT 3
/*
-** CAPI3REF: Results Values From A Query {F13800}
+** CAPI3REF: Result Values From A Query {H13800} <S10700>
+** KEYWORDS: {column access functions}
**
** These routines form the "result set query" interface.
**
-** These routines return information about
-** a single column of the current result row of a query. In every
-** case the first argument is a pointer to the
-** [prepared statement] that is being
-** evaluated (the [sqlite3_stmt*] that was returned from
-** [sqlite3_prepare_v2()] or one of its variants) and
-** the second argument is the index of the column for which information
-** should be returned. The left-most column of the result set
-** has an index of 0.
-**
-** If the SQL statement is not currently point to a valid row, or if the
-** the column index is out of range, the result is undefined.
+** These routines return information about a single column of the current
+** result row of a query. In every case the first argument is a pointer
+** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*]
+** that was returned from [sqlite3_prepare_v2()] or one of its variants)
+** and the second argument is the index of the column for which information
+** should be returned. The leftmost column of the result set has the index 0.
+**
+** If the SQL statement does not currently point to a valid row, or if the
+** column index is out of range, the result is undefined.
** These routines may only be called when the most recent call to
** [sqlite3_step()] has returned [SQLITE_ROW] and neither
-** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently.
+** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently.
** If any of these routines are called after [sqlite3_reset()] or
** [sqlite3_finalize()] or after [sqlite3_step()] has returned
** something other than [SQLITE_ROW], the results are undefined.
** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()]
** are called from a different thread while any of these routines
-** are pending, then the results are undefined.
+** are pending, then the results are undefined.
**
-** The sqlite3_column_type() routine returns
+** The sqlite3_column_type() routine returns the
** [SQLITE_INTEGER | datatype code] for the initial data type
** of the result column. The returned value is one of [SQLITE_INTEGER],
** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value
@@ -3587,7 +3512,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** versions of SQLite may change the behavior of sqlite3_column_type()
** following a type conversion.
**
-** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes()
+** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes()
** routine returns the number of bytes in that BLOB or string.
** If the result is a UTF-16 string, then sqlite3_column_bytes() converts
** the string to UTF-8 and then returns the number of bytes.
@@ -3600,11 +3525,11 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** Strings returned by sqlite3_column_text() and sqlite3_column_text16(),
** even empty strings, are always zero terminated. The return
-** value from sqlite3_column_blob() for a zero-length blob is an arbitrary
+** value from sqlite3_column_blob() for a zero-length BLOB is an arbitrary
** pointer, possibly even a NULL pointer.
**
** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes()
-** but leaves the result in UTF-16 in native byte order instead of UTF-8.
+** but leaves the result in UTF-16 in native byte order instead of UTF-8.
** The zero terminator is not included in this count.
**
** The object returned by [sqlite3_column_value()] is an
@@ -3612,15 +3537,14 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()].
** If the [unprotected sqlite3_value] object returned by
** [sqlite3_column_value()] is used in any other way, including calls
-** to routines like
-** [sqlite3_value_int()], [sqlite3_value_text()], or [sqlite3_value_bytes()],
-** then the behavior is undefined.
+** to routines like [sqlite3_value_int()], [sqlite3_value_text()],
+** or [sqlite3_value_bytes()], then the behavior is undefined.
**
** These routines attempt to convert the value where appropriate. For
** example, if the internal representation is FLOAT and a text result
-** is requested, [sqlite3_snprintf()] is used internally to do the conversion
-** automatically. The following table details the conversions that
-** are applied:
+** is requested, [sqlite3_snprintf()] is used internally to perform the
+** conversion automatically. The following table details the conversions
+** that are applied:
**
** <blockquote>
** <table border="1">
@@ -3632,7 +3556,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> NULL <td> BLOB <td> Result is NULL pointer
** <tr><td> INTEGER <td> FLOAT <td> Convert from integer to float
** <tr><td> INTEGER <td> TEXT <td> ASCII rendering of the integer
-** <tr><td> INTEGER <td> BLOB <td> Same as for INTEGER->TEXT
+** <tr><td> INTEGER <td> BLOB <td> Same as INTEGER->TEXT
** <tr><td> FLOAT <td> INTEGER <td> Convert from float to integer
** <tr><td> FLOAT <td> TEXT <td> ASCII rendering of the float
** <tr><td> FLOAT <td> BLOB <td> Same as FLOAT->TEXT
@@ -3647,57 +3571,56 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** The table above makes reference to standard C library functions atoi()
** and atof(). SQLite does not really use these functions. It has its
-** on equavalent internal routines. The atoi() and atof() names are
+** own equivalent internal routines. The atoi() and atof() names are
** used in the table for brevity and because they are familiar to most
** C programmers.
**
** Note that when type conversions occur, pointers returned by prior
** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or
-** sqlite3_column_text16() may be invalidated.
+** sqlite3_column_text16() may be invalidated.
** Type conversions and pointer invalidations might occur
** in the following cases:
**
** <ul>
-** <li><p> The initial content is a BLOB and sqlite3_column_text()
-** or sqlite3_column_text16() is called. A zero-terminator might
-** need to be added to the string.</p></li>
-**
-** <li><p> The initial content is UTF-8 text and sqlite3_column_bytes16() or
-** sqlite3_column_text16() is called. The content must be converted
-** to UTF-16.</p></li>
-**
-** <li><p> The initial content is UTF-16 text and sqlite3_column_bytes() or
-** sqlite3_column_text() is called. The content must be converted
-** to UTF-8.</p></li>
+** <li> The initial content is a BLOB and sqlite3_column_text() or
+** sqlite3_column_text16() is called. A zero-terminator might
+** need to be added to the string.</li>
+** <li> The initial content is UTF-8 text and sqlite3_column_bytes16() or
+** sqlite3_column_text16() is called. The content must be converted
+** to UTF-16.</li>
+** <li> The initial content is UTF-16 text and sqlite3_column_bytes() or
+** sqlite3_column_text() is called. The content must be converted
+** to UTF-8.</li>
** </ul>
**
** Conversions between UTF-16be and UTF-16le are always done in place and do
** not invalidate a prior pointer, though of course the content of the buffer
** that the prior pointer points to will have been modified. Other kinds
-** of conversion are done in place when it is possible, but sometime it is
-** not possible and in those cases prior pointers are invalidated.
+** of conversion are done in place when it is possible, but sometimes they
+** are not possible and in those cases prior pointers are invalidated.
**
** The safest and easiest to remember policy is to invoke these routines
** in one of the following ways:
**
-** <ul>
+** <ul>
** <li>sqlite3_column_text() followed by sqlite3_column_bytes()</li>
** <li>sqlite3_column_blob() followed by sqlite3_column_bytes()</li>
** <li>sqlite3_column_text16() followed by sqlite3_column_bytes16()</li>
-** </ul>
+** </ul>
**
-** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(),
-** or sqlite3_column_text16() first to force the result into the desired
-** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to
-** find the size of the result. Do not mix call to sqlite3_column_text() or
-** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not
-** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes().
+** In other words, you should call sqlite3_column_text(),
+** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result
+** into the desired format, then invoke sqlite3_column_bytes() or
+** sqlite3_column_bytes16() to find the size of the result. Do not mix calls
+** to sqlite3_column_text() or sqlite3_column_blob() with calls to
+** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16()
+** with calls to sqlite3_column_bytes().
**
** The pointers returned are valid until a type conversion occurs as
** described above, or until [sqlite3_step()] or [sqlite3_reset()] or
** [sqlite3_finalize()] is called. The memory space used to hold strings
-** and blobs is freed automatically. Do <b>not</b> pass the pointers returned
-** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
+** and BLOBs is freed automatically. Do <b>not</b> pass the pointers returned
+** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
** [sqlite3_free()].
**
** If a memory allocation error occurs during the evaluation of any
@@ -3706,60 +3629,9 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** pointer. Subsequent calls to [sqlite3_errcode()] will return
** [SQLITE_NOMEM].
**
-** INVARIANTS:
-**
-** {F13803} The [sqlite3_column_blob(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a blob and then returns a
-** pointer to the converted value.
-**
-** {F13806} The [sqlite3_column_bytes(S,N)] interface returns the
-** number of bytes in the blob or string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_column_blob(S,N)] or
-** [sqlite3_column_text(S,N)].
-**
-** {F13809} The [sqlite3_column_bytes16(S,N)] interface returns the
-** number of bytes in the string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_column_text16(S,N)].
-**
-** {F13812} The [sqlite3_column_double(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a floating point value and
-** returns a copy of that value.
-**
-** {F13815} The [sqlite3_column_int(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a 64-bit signed integer and
-** returns the lower 32 bits of that integer.
-**
-** {F13818} The [sqlite3_column_int64(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a 64-bit signed integer and
-** returns a copy of that integer.
-**
-** {F13821} The [sqlite3_column_text(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a zero-terminated UTF-8
-** string and returns a pointer to that string.
-**
-** {F13824} The [sqlite3_column_text16(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a zero-terminated 2-byte
-** aligned UTF-16 native byte order
-** string and returns a pointer to that string.
-**
-** {F13827} The [sqlite3_column_type(S,N)] interface returns
-** one of [SQLITE_NULL], [SQLITE_INTEGER], [SQLITE_FLOAT],
-** [SQLITE_TEXT], or [SQLITE_BLOB] as appropriate for
-** the Nth column in the current row of the result set for
-** [prepared statement] S.
-**
-** {F13830} The [sqlite3_column_value(S,N)] interface returns a
-** pointer to an [unprotected sqlite3_value] object for the
-** Nth column in the current row of the result set for
-** [prepared statement] S.
+** Requirements:
+** [H13803] [H13806] [H13809] [H13812] [H13815] [H13818] [H13821] [H13824]
+** [H13827] [H13830]
*/
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
@@ -3773,186 +3645,135 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
/*
-** CAPI3REF: Destroy A Prepared Statement Object {F13300}
+** CAPI3REF: Destroy A Prepared Statement Object {H13300} <S70300><S30100>
**
-** The sqlite3_finalize() function is called to delete a
-** [prepared statement]. If the statement was
-** executed successfully, or not executed at all, then SQLITE_OK is returned.
-** If execution of the statement failed then an
-** [error code] or [extended error code]
-** is returned.
+** The sqlite3_finalize() function is called to delete a [prepared statement].
+** If the statement was executed successfully or not executed at all, then
+** SQLITE_OK is returned. If execution of the statement failed then an
+** [error code] or [extended error code] is returned.
**
** This routine can be called at any point during the execution of the
-** [prepared statement]. If the virtual machine has not
+** [prepared statement]. If the virtual machine has not
** completed execution when this routine is called, that is like
-** encountering an error or an interrupt. (See [sqlite3_interrupt()].)
-** Incomplete updates may be rolled back and transactions cancelled,
-** depending on the circumstances, and the
+** encountering an error or an [sqlite3_interrupt | interrupt].
+** Incomplete updates may be rolled back and transactions canceled,
+** depending on the circumstances, and the
** [error code] returned will be [SQLITE_ABORT].
**
-** INVARIANTS:
-**
-** {F11302} The [sqlite3_finalize(S)] interface destroys the
-** [prepared statement] S and releases all
-** memory and file resources held by that object.
-**
-** {F11304} If the most recent call to [sqlite3_step(S)] for the
-** [prepared statement] S returned an error,
-** then [sqlite3_finalize(S)] returns that same error.
+** Requirements:
+** [H11302] [H11304]
*/
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Reset A Prepared Statement Object {F13330}
+** CAPI3REF: Reset A Prepared Statement Object {H13330} <S70300>
**
-** The sqlite3_reset() function is called to reset a
-** [prepared statement] object.
-** back to its initial state, ready to be re-executed.
+** The sqlite3_reset() function is called to reset a [prepared statement]
+** object back to its initial state, ready to be re-executed.
** Any SQL statement variables that had values bound to them using
** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values.
** Use [sqlite3_clear_bindings()] to reset the bindings.
**
-** {F11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S
+** {H11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S
** back to the beginning of its program.
**
-** {F11334} If the most recent call to [sqlite3_step(S)] for
+** {H11334} If the most recent call to [sqlite3_step(S)] for the
** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE],
** or if [sqlite3_step(S)] has never before been called on S,
** then [sqlite3_reset(S)] returns [SQLITE_OK].
**
-** {F11336} If the most recent call to [sqlite3_step(S)] for
+** {H11336} If the most recent call to [sqlite3_step(S)] for the
** [prepared statement] S indicated an error, then
** [sqlite3_reset(S)] returns an appropriate [error code].
**
-** {F11338} The [sqlite3_reset(S)] interface does not change the values
-** of any [sqlite3_bind_blob|bindings] on [prepared statement] S.
+** {H11338} The [sqlite3_reset(S)] interface does not change the values
+** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S.
*/
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Create Or Redefine SQL Functions {F16100}
-** KEYWORDS: {function creation routines}
+** CAPI3REF: Create Or Redefine SQL Functions {H16100} <S20200>
+** KEYWORDS: {function creation routines}
+** KEYWORDS: {application-defined SQL function}
+** KEYWORDS: {application-defined SQL functions}
**
-** These two functions (collectively known as
-** "function creation routines") are used to add SQL functions or aggregates
-** or to redefine the behavior of existing SQL functions or aggregates. The
-** difference only between the two is that the second parameter, the
-** name of the (scalar) function or aggregate, is encoded in UTF-8 for
-** sqlite3_create_function() and UTF-16 for sqlite3_create_function16().
+** These two functions (collectively known as "function creation routines")
+** are used to add SQL functions or aggregates or to redefine the behavior
+** of existing SQL functions or aggregates. The only difference between the
+** two is that the second parameter, the name of the (scalar) function or
+** aggregate, is encoded in UTF-8 for sqlite3_create_function() and UTF-16
+** for sqlite3_create_function16().
**
** The first parameter is the [database connection] to which the SQL
-** function is to be added. If a single
-** program uses more than one [database connection] internally, then SQL
-** functions must be added individually to each [database connection].
-**
-** The second parameter is the name of the SQL function to be created
-** or redefined.
-** The length of the name is limited to 255 bytes, exclusive of the
-** zero-terminator. Note that the name length limit is in bytes, not
-** characters. Any attempt to create a function with a longer name
-** will result in an SQLITE_ERROR error.
+** function is to be added. If a single program uses more than one database
+** connection internally, then SQL functions must be added individually to
+** each database connection.
**
-** The third parameter is the number of arguments that the SQL function or
-** aggregate takes. If this parameter is negative, then the SQL function or
-** aggregate may take any number of arguments.
+** The second parameter is the name of the SQL function to be created or
+** redefined. The length of the name is limited to 255 bytes, exclusive of
+** the zero-terminator. Note that the name length limit is in bytes, not
+** characters. Any attempt to create a function with a longer name
+** will result in [SQLITE_ERROR] being returned.
+**
+** The third parameter (nArg)
+** is the number of arguments that the SQL function or
+** aggregate takes. If this parameter is -1, then the SQL function or
+** aggregate may take any number of arguments between 0 and the limit
+** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third
+** parameter is less than -1 or greater than 127 then the behavior is
+** undefined.
**
-** The fourth parameter, eTextRep, specifies what
+** The fourth parameter, eTextRep, specifies what
** [SQLITE_UTF8 | text encoding] this SQL function prefers for
** its parameters. Any SQL function implementation should be able to work
** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be
-** more efficient with one encoding than another. It is allowed to
+** more efficient with one encoding than another. An application may
** invoke sqlite3_create_function() or sqlite3_create_function16() multiple
** times with the same function but with different values of eTextRep.
** When multiple implementations of the same function are available, SQLite
** will pick the one that involves the least amount of data conversion.
-** If there is only a single implementation which does not care what
-** text encoding is used, then the fourth argument should be
-** [SQLITE_ANY].
+** If there is only a single implementation which does not care what text
+** encoding is used, then the fourth argument should be [SQLITE_ANY].
**
-** The fifth parameter is an arbitrary pointer. The implementation
-** of the function can gain access to this pointer using
-** [sqlite3_user_data()].
+** The fifth parameter is an arbitrary pointer. The implementation of the
+** function can gain access to this pointer using [sqlite3_user_data()].
**
** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are
-** pointers to C-language functions that implement the SQL
-** function or aggregate. A scalar SQL function requires an implementation of
-** the xFunc callback only, NULL pointers should be passed as the xStep
-** and xFinal parameters. An aggregate SQL function requires an implementation
-** of xStep and xFinal and NULL should be passed for xFunc. To delete an
-** existing SQL function or aggregate, pass NULL for all three function
-** callback.
+** pointers to C-language functions that implement the SQL function or
+** aggregate. A scalar SQL function requires an implementation of the xFunc
+** callback only, NULL pointers should be passed as the xStep and xFinal
+** parameters. An aggregate SQL function requires an implementation of xStep
+** and xFinal and NULL should be passed for xFunc. To delete an existing
+** SQL function or aggregate, pass NULL for all three function callbacks.
**
** It is permitted to register multiple implementations of the same
** functions with the same name but with either differing numbers of
-** arguments or differing perferred text encodings. SQLite will use
-** the implementation most closely matches the way in which the
-** SQL function is used.
-**
-** INVARIANTS:
-**
-** {F16103} The [sqlite3_create_function16()] interface behaves exactly
-** like [sqlite3_create_function()] in every way except that it
-** interprets the zFunctionName argument as
-** zero-terminated UTF-16 native byte order instead of as a
-** zero-terminated UTF-8.
-**
-** {F16106} A successful invocation of
-** the [sqlite3_create_function(D,X,N,E,...)] interface registers
-** or replaces callback functions in [database connection] D
-** used to implement the SQL function named X with N parameters
-** and having a perferred text encoding of E.
-**
-** {F16109} A successful call to [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** replaces the P, F, S, and L values from any prior calls with
-** the same D, X, N, and E values.
-**
-** {F16112} The [sqlite3_create_function(D,X,...)] interface fails with
-** a return code of [SQLITE_ERROR] if the SQL function name X is
-** longer than 255 bytes exclusive of the zero terminator.
-**
-** {F16118} Either F must be NULL and S and L are non-NULL or else F
-** is non-NULL and S and L are NULL, otherwise
-** [sqlite3_create_function(D,X,N,E,P,F,S,L)] returns [SQLITE_ERROR].
-**
-** {F16121} The [sqlite3_create_function(D,...)] interface fails with an
-** error code of [SQLITE_BUSY] if there exist [prepared statements]
-** associated with the [database connection] D.
-**
-** {F16124} The [sqlite3_create_function(D,X,N,...)] interface fails with an
-** error code of [SQLITE_ERROR] if parameter N (specifying the number
-** of arguments to the SQL function being registered) is less
-** than -1 or greater than 127.
-**
-** {F16127} When N is non-negative, the [sqlite3_create_function(D,X,N,...)]
-** interface causes callbacks to be invoked for the SQL function
-** named X when the number of arguments to the SQL function is
-** exactly N.
-**
-** {F16130} When N is -1, the [sqlite3_create_function(D,X,N,...)]
-** interface causes callbacks to be invoked for the SQL function
-** named X with any number of arguments.
-**
-** {F16133} When calls to [sqlite3_create_function(D,X,N,...)]
-** specify multiple implementations of the same function X
-** and when one implementation has N>=0 and the other has N=(-1)
-** the implementation with a non-zero N is preferred.
-**
-** {F16136} When calls to [sqlite3_create_function(D,X,N,E,...)]
-** specify multiple implementations of the same function X with
-** the same number of arguments N but with different
-** encodings E, then the implementation where E matches the
-** database encoding is preferred.
-**
-** {F16139} For an aggregate SQL function created using
-** [sqlite3_create_function(D,X,N,E,P,0,S,L)] the finializer
-** function L will always be invoked exactly once if the
-** step function S is called one or more times.
-**
-** {F16142} When SQLite invokes either the xFunc or xStep function of
-** an application-defined SQL function or aggregate created
-** by [sqlite3_create_function()] or [sqlite3_create_function16()],
-** then the array of [sqlite3_value] objects passed as the
-** third parameter are always [protected sqlite3_value] objects.
+** arguments or differing preferred text encodings. SQLite will use
+** the implementation that most closely matches the way in which the
+** SQL function is used. A function implementation with a non-negative
+** nArg parameter is a better match than a function implementation with
+** a negative nArg. A function where the preferred text encoding
+** matches the database encoding is a better
+** match than a function where the encoding is different.
+** A function where the encoding difference is between UTF16le and UTF16be
+** is a closer match than a function where the encoding difference is
+** between UTF8 and UTF16.
+**
+** Built-in functions may be overloaded by new application-defined functions.
+** The first application-defined function with a given name overrides all
+** built-in functions in the same [database connection] with the same name.
+** Subsequent application-defined functions of the same name only override
+** prior application-defined functions that are an exact match for the
+** number of parameters and preferred encoding.
+**
+** An application-defined function is permitted to call other
+** SQLite interfaces. However, such calls must not
+** close the database connection nor finalize or reset the prepared
+** statement in which the function is running.
+**
+** Requirements:
+** [H16103] [H16106] [H16109] [H16112] [H16118] [H16121] [H16127]
+** [H16130] [H16133] [H16136] [H16139] [H16142]
*/
SQLITE_API int sqlite3_create_function(
sqlite3 *db,
@@ -3976,7 +3797,7 @@ SQLITE_API int sqlite3_create_function16(
);
/*
-** CAPI3REF: Text Encodings {F10267}
+** CAPI3REF: Text Encodings {H10267} <S50200> <H16100>
**
** These constant define integer codes that represent the various
** text encodings supported by SQLite.
@@ -3989,23 +3810,26 @@ SQLITE_API int sqlite3_create_function16(
#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */
/*
-** CAPI3REF: Obsolete Functions
+** CAPI3REF: Deprecated Functions
+** DEPRECATED
**
-** These functions are all now obsolete. In order to maintain
-** backwards compatibility with older code, we continue to support
-** these functions. However, new development projects should avoid
+** These functions are [deprecated]. In order to maintain
+** backwards compatibility with older code, these functions continue
+** to be supported. However, new applications should avoid
** the use of these functions. To help encourage people to avoid
-** using these functions, we are not going to tell you want they do.
+** using these functions, we are not going to tell you what they do.
*/
-SQLITE_API int sqlite3_aggregate_count(sqlite3_context*);
-SQLITE_API int sqlite3_expired(sqlite3_stmt*);
-SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*);
-SQLITE_API int sqlite3_global_recover(void);
-SQLITE_API void sqlite3_thread_cleanup(void);
-SQLITE_API int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
+#ifndef SQLITE_OMIT_DEPRECATED
+SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void);
+SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
+#endif
/*
-** CAPI3REF: Obtaining SQL Function Parameter Values {F15100}
+** CAPI3REF: Obtaining SQL Function Parameter Values {H15100} <S20200>
**
** The C-language implementation of SQL functions and aggregates uses
** this set of interface routines to access the parameter values on
@@ -4023,95 +3847,35 @@ SQLITE_API int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlit
** Any attempt to use these routines on an [unprotected sqlite3_value]
** object results in undefined behavior.
**
-** These routines work just like the corresponding
-** [sqlite3_column_blob | sqlite3_column_* routines] except that
-** these routines take a single [protected sqlite3_value] object pointer
-** instead of an [sqlite3_stmt*] pointer and an integer column number.
+** These routines work just like the corresponding [column access functions]
+** except that these routines take a single [protected sqlite3_value] object
+** pointer instead of a [sqlite3_stmt*] pointer and an integer column number.
**
-** The sqlite3_value_text16() interface extracts a UTF16 string
+** The sqlite3_value_text16() interface extracts a UTF-16 string
** in the native byte-order of the host machine. The
** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces
-** extract UTF16 strings as big-endian and little-endian respectively.
+** extract UTF-16 strings as big-endian and little-endian respectively.
**
** The sqlite3_value_numeric_type() interface attempts to apply
** numeric affinity to the value. This means that an attempt is
** made to convert the value to an integer or floating point. If
** such a conversion is possible without loss of information (in other
-** words if the value is a string that looks like a number)
-** then the conversion is done. Otherwise no conversion occurs. The
-** [SQLITE_INTEGER | datatype] after conversion is returned.
+** words, if the value is a string that looks like a number)
+** then the conversion is performed. Otherwise no conversion occurs.
+** The [SQLITE_INTEGER | datatype] after conversion is returned.
**
-** Please pay particular attention to the fact that the pointer that
-** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or
+** Please pay particular attention to the fact that the pointer returned
+** from [sqlite3_value_blob()], [sqlite3_value_text()], or
** [sqlite3_value_text16()] can be invalidated by a subsequent call to
** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()],
-** or [sqlite3_value_text16()].
+** or [sqlite3_value_text16()].
**
** These routines must be called from the same thread as
** the SQL function that supplied the [sqlite3_value*] parameters.
**
-**
-** INVARIANTS:
-**
-** {F15103} The [sqlite3_value_blob(V)] interface converts the
-** [protected sqlite3_value] object V into a blob and then returns a
-** pointer to the converted value.
-**
-** {F15106} The [sqlite3_value_bytes(V)] interface returns the
-** number of bytes in the blob or string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_value_blob(V)] or
-** [sqlite3_value_text(V)].
-**
-** {F15109} The [sqlite3_value_bytes16(V)] interface returns the
-** number of bytes in the string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_value_text16(V)],
-** [sqlite3_value_text16be(V)], or [sqlite3_value_text16le(V)].
-**
-** {F15112} The [sqlite3_value_double(V)] interface converts the
-** [protected sqlite3_value] object V into a floating point value and
-** returns a copy of that value.
-**
-** {F15115} The [sqlite3_value_int(V)] interface converts the
-** [protected sqlite3_value] object V into a 64-bit signed integer and
-** returns the lower 32 bits of that integer.
-**
-** {F15118} The [sqlite3_value_int64(V)] interface converts the
-** [protected sqlite3_value] object V into a 64-bit signed integer and
-** returns a copy of that integer.
-**
-** {F15121} The [sqlite3_value_text(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated UTF-8
-** string and returns a pointer to that string.
-**
-** {F15124} The [sqlite3_value_text16(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 native byte order
-** string and returns a pointer to that string.
-**
-** {F15127} The [sqlite3_value_text16be(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 big-endian
-** string and returns a pointer to that string.
-**
-** {F15130} The [sqlite3_value_text16le(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 little-endian
-** string and returns a pointer to that string.
-**
-** {F15133} The [sqlite3_value_type(V)] interface returns
-** one of [SQLITE_NULL], [SQLITE_INTEGER], [SQLITE_FLOAT],
-** [SQLITE_TEXT], or [SQLITE_BLOB] as appropriate for
-** the [sqlite3_value] object V.
-**
-** {F15136} The [sqlite3_value_numeric_type(V)] interface converts
-** the [protected sqlite3_value] object V into either an integer or
-** a floating point value if it can do so without loss of
-** information, and returns one of [SQLITE_NULL],
-** [SQLITE_INTEGER], [SQLITE_FLOAT], [SQLITE_TEXT], or
-** [SQLITE_BLOB] as appropriate for
-** the [protected sqlite3_value] object V after the conversion attempt.
+** Requirements:
+** [H15103] [H15106] [H15109] [H15112] [H15115] [H15118] [H15121] [H15124]
+** [H15127] [H15130] [H15133] [H15136]
*/
SQLITE_API const void *sqlite3_value_blob(sqlite3_value*);
SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
@@ -4127,175 +3891,120 @@ SQLITE_API int sqlite3_value_type(sqlite3_value*);
SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
/*
-** CAPI3REF: Obtain Aggregate Function Context {F16210}
+** CAPI3REF: Obtain Aggregate Function Context {H16210} <S20200>
**
** The implementation of aggregate SQL functions use this routine to allocate
-** a structure for storing their state.
-** The first time the sqlite3_aggregate_context() routine is
-** is called for a particular aggregate, SQLite allocates nBytes of memory
-** zeros that memory, and returns a pointer to it.
-** On second and subsequent calls to sqlite3_aggregate_context()
-** for the same aggregate function index, the same buffer is returned.
-** The implementation
-** of the aggregate can use the returned buffer to accumulate data.
+** a structure for storing their state.
+**
+** The first time the sqlite3_aggregate_context() routine is called for a
+** particular aggregate, SQLite allocates nBytes of memory, zeroes out that
+** memory, and returns a pointer to it. On second and subsequent calls to
+** sqlite3_aggregate_context() for the same aggregate function index,
+** the same buffer is returned. The implementation of the aggregate can use
+** the returned buffer to accumulate data.
**
** SQLite automatically frees the allocated buffer when the aggregate
** query concludes.
**
-** The first parameter should be a copy of the
-** [sqlite3_context | SQL function context] that is the first
-** parameter to the callback routine that implements the aggregate
-** function.
+** The first parameter should be a copy of the
+** [sqlite3_context | SQL function context] that is the first parameter
+** to the callback routine that implements the aggregate function.
**
** This routine must be called from the same thread in which
** the aggregate SQL function is running.
**
-** INVARIANTS:
-**
-** {F16211} The first invocation of [sqlite3_aggregate_context(C,N)] for
-** a particular instance of an aggregate function (for a particular
-** context C) causes SQLite to allocation N bytes of memory,
-** zero that memory, and return a pointer to the allocationed
-** memory.
-**
-** {F16213} If a memory allocation error occurs during
-** [sqlite3_aggregate_context(C,N)] then the function returns 0.
-**
-** {F16215} Second and subsequent invocations of
-** [sqlite3_aggregate_context(C,N)] for the same context pointer C
-** ignore the N parameter and return a pointer to the same
-** block of memory returned by the first invocation.
-**
-** {F16217} The memory allocated by [sqlite3_aggregate_context(C,N)] is
-** automatically freed on the next call to [sqlite3_reset()]
-** or [sqlite3_finalize()] for the [prepared statement] containing
-** the aggregate function associated with context C.
+** Requirements:
+** [H16211] [H16213] [H16215] [H16217]
*/
SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);
/*
-** CAPI3REF: User Data For Functions {F16240}
+** CAPI3REF: User Data For Functions {H16240} <S20200>
**
** The sqlite3_user_data() interface returns a copy of
** the pointer that was the pUserData parameter (the 5th parameter)
-** of the the [sqlite3_create_function()]
+** of the [sqlite3_create_function()]
** and [sqlite3_create_function16()] routines that originally
** registered the application defined function. {END}
**
** This routine must be called from the same thread in which
** the application-defined function is running.
**
-** INVARIANTS:
-**
-** {F16243} The [sqlite3_user_data(C)] interface returns a copy of the
-** P pointer from the [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** or [sqlite3_create_function16(D,X,N,E,P,F,S,L)] call that
-** registered the SQL function associated with
-** [sqlite3_context] C.
+** Requirements:
+** [H16243]
*/
SQLITE_API void *sqlite3_user_data(sqlite3_context*);
/*
-** CAPI3REF: Database Connection For Functions {F16250}
+** CAPI3REF: Database Connection For Functions {H16250} <S60600><S20200>
**
** The sqlite3_context_db_handle() interface returns a copy of
** the pointer to the [database connection] (the 1st parameter)
-** of the the [sqlite3_create_function()]
+** of the [sqlite3_create_function()]
** and [sqlite3_create_function16()] routines that originally
** registered the application defined function.
**
-** INVARIANTS:
-**
-** {F16253} The [sqlite3_context_db_handle(C)] interface returns a copy of the
-** D pointer from the [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** or [sqlite3_create_function16(D,X,N,E,P,F,S,L)] call that
-** registered the SQL function associated with
-** [sqlite3_context] C.
+** Requirements:
+** [H16253]
*/
SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
/*
-** CAPI3REF: Function Auxiliary Data {F16270}
+** CAPI3REF: Function Auxiliary Data {H16270} <S20200>
**
** The following two functions may be used by scalar SQL functions to
-** associate meta-data with argument values. If the same value is passed to
+** associate metadata with argument values. If the same value is passed to
** multiple invocations of the same SQL function during query execution, under
-** some circumstances the associated meta-data may be preserved. This may
+** some circumstances the associated metadata may be preserved. This may
** be used, for example, to add a regular-expression matching scalar
** function. The compiled version of the regular expression is stored as
-** meta-data associated with the SQL value passed as the regular expression
+** metadata associated with the SQL value passed as the regular expression
** pattern. The compiled regular expression can be reused on multiple
** invocations of the same function so that the original pattern string
** does not need to be recompiled on each invocation.
**
-** The sqlite3_get_auxdata() interface returns a pointer to the meta-data
+** The sqlite3_get_auxdata() interface returns a pointer to the metadata
** associated by the sqlite3_set_auxdata() function with the Nth argument
-** value to the application-defined function.
-** If no meta-data has been ever been set for the Nth
-** argument of the function, or if the cooresponding function parameter
-** has changed since the meta-data was set, then sqlite3_get_auxdata()
-** returns a NULL pointer.
-**
-** The sqlite3_set_auxdata() interface saves the meta-data
-** pointed to by its 3rd parameter as the meta-data for the N-th
+** value to the application-defined function. If no metadata has been ever
+** been set for the Nth argument of the function, or if the corresponding
+** function parameter has changed since the meta-data was set,
+** then sqlite3_get_auxdata() returns a NULL pointer.
+**
+** The sqlite3_set_auxdata() interface saves the metadata
+** pointed to by its 3rd parameter as the metadata for the N-th
** argument of the application-defined function. Subsequent
** calls to sqlite3_get_auxdata() might return this data, if it has
-** not been destroyed.
-** If it is not NULL, SQLite will invoke the destructor
+** not been destroyed.
+** If it is not NULL, SQLite will invoke the destructor
** function given by the 4th parameter to sqlite3_set_auxdata() on
-** the meta-data when the corresponding function parameter changes
+** the metadata when the corresponding function parameter changes
** or when the SQL statement completes, whichever comes first.
**
-** SQLite is free to call the destructor and drop meta-data on
-** any parameter of any function at any time. The only guarantee
-** is that the destructor will be called before the metadata is
-** dropped.
+** SQLite is free to call the destructor and drop metadata on any
+** parameter of any function at any time. The only guarantee is that
+** the destructor will be called before the metadata is dropped.
**
-** In practice, meta-data is preserved between function calls for
+** In practice, metadata is preserved between function calls for
** expressions that are constant at compile time. This includes literal
** values and SQL variables.
**
** These routines must be called from the same thread in which
** the SQL function is running.
**
-** INVARIANTS:
-**
-** {F16272} The [sqlite3_get_auxdata(C,N)] interface returns a pointer
-** to metadata associated with the Nth parameter of the SQL function
-** whose context is C, or NULL if there is no metadata associated
-** with that parameter.
-**
-** {F16274} The [sqlite3_set_auxdata(C,N,P,D)] interface assigns a metadata
-** pointer P to the Nth parameter of the SQL function with context
-** C.
-**
-** {F16276} SQLite will invoke the destructor D with a single argument
-** which is the metadata pointer P following a call to
-** [sqlite3_set_auxdata(C,N,P,D)] when SQLite ceases to hold
-** the metadata.
-**
-** {F16277} SQLite ceases to hold metadata for an SQL function parameter
-** when the value of that parameter changes.
-**
-** {F16278} When [sqlite3_set_auxdata(C,N,P,D)] is invoked, the destructor
-** is called for any prior metadata associated with the same function
-** context C and parameter N.
-**
-** {F16279} SQLite will call destructors for any metadata it is holding
-** in a particular [prepared statement] S when either
-** [sqlite3_reset(S)] or [sqlite3_finalize(S)] is called.
+** Requirements:
+** [H16272] [H16274] [H16276] [H16277] [H16278] [H16279]
*/
SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N);
SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
/*
-** CAPI3REF: Constants Defining Special Destructor Behavior {F10280}
+** CAPI3REF: Constants Defining Special Destructor Behavior {H10280} <S30100>
**
-** These are special value for the destructor that is passed in as the
+** These are special values for the destructor that is passed in as the
** final argument to routines like [sqlite3_result_blob()]. If the destructor
** argument is SQLITE_STATIC, it means that the content pointer is constant
-** and will never change. It does not need to be destroyed. The
+** and will never change. It does not need to be destroyed. The
** SQLITE_TRANSIENT value means that the content will likely change in
** the near future and that SQLite should make its own private copy of
** the content before returning.
@@ -4308,30 +4017,28 @@ typedef void (*sqlite3_destructor_type)(void*);
#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1)
/*
-** CAPI3REF: Setting The Result Of An SQL Function {F16400}
+** CAPI3REF: Setting The Result Of An SQL Function {H16400} <S20200>
**
** These routines are used by the xFunc or xFinal callbacks that
** implement SQL functions and aggregates. See
** [sqlite3_create_function()] and [sqlite3_create_function16()]
** for additional information.
**
-** These functions work very much like the
-** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used
-** to bind values to host parameters in prepared statements.
-** Refer to the
-** [sqlite3_bind_blob | sqlite3_bind_* documentation] for
-** additional information.
+** These functions work very much like the [parameter binding] family of
+** functions used to bind values to host parameters in prepared statements.
+** Refer to the [SQL parameter] documentation for additional information.
**
** The sqlite3_result_blob() interface sets the result from
-** an application defined function to be the BLOB whose content is pointed
+** an application-defined function to be the BLOB whose content is pointed
** to by the second parameter and which is N bytes long where N is the
-** third parameter.
-** The sqlite3_result_zeroblob() inerfaces set the result of
-** the application defined function to be a BLOB containing all zero
+** third parameter.
+**
+** The sqlite3_result_zeroblob() interfaces set the result of
+** the application-defined function to be a BLOB containing all zero
** bytes and N bytes in size, where N is the value of the 2nd parameter.
**
** The sqlite3_result_double() interface sets the result from
-** an application defined function to be a floating point value specified
+** an application-defined function to be a floating point value specified
** by its 2nd argument.
**
** The sqlite3_result_error() and sqlite3_result_error16() functions
@@ -4339,8 +4046,8 @@ typedef void (*sqlite3_destructor_type)(void*);
** SQLite uses the string pointed to by the
** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16()
** as the text of an error message. SQLite interprets the error
-** message string from sqlite3_result_error() as UTF8. SQLite
-** interprets the string from sqlite3_result_error16() as UTF16 in native
+** message string from sqlite3_result_error() as UTF-8. SQLite
+** interprets the string from sqlite3_result_error16() as UTF-16 in native
** byte order. If the third parameter to sqlite3_result_error()
** or sqlite3_result_error16() is negative then SQLite takes as the error
** message all text up through the first zero character.
@@ -4348,7 +4055,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** sqlite3_result_error16() is non-negative then SQLite takes that many
** bytes (not characters) from the 2nd parameter as the error message.
** The sqlite3_result_error() and sqlite3_result_error16()
-** routines make a copy private copy of the error message text before
+** routines make a private copy of the error message text before
** they return. Hence, the calling function can deallocate or
** modify the text after they return without harm.
** The sqlite3_result_error_code() function changes the error code
@@ -4356,11 +4063,11 @@ typedef void (*sqlite3_destructor_type)(void*);
** the error code is SQLITE_ERROR. A subsequent call to sqlite3_result_error()
** or sqlite3_result_error16() resets the error code to SQLITE_ERROR.
**
-** The sqlite3_result_toobig() interface causes SQLite
-** to throw an error indicating that a string or BLOB is to long
-** to represent. The sqlite3_result_nomem() interface
-** causes SQLite to throw an exception indicating that the a
-** memory allocation failed.
+** The sqlite3_result_toobig() interface causes SQLite to throw an error
+** indicating that a string or BLOB is to long to represent.
+**
+** The sqlite3_result_nomem() interface causes SQLite to throw an error
+** indicating that a memory allocation failed.
**
** The sqlite3_result_int() interface sets the return value
** of the application-defined function to be the 32-bit signed integer
@@ -4372,7 +4079,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** The sqlite3_result_null() interface sets the return value
** of the application-defined function to be NULL.
**
-** The sqlite3_result_text(), sqlite3_result_text16(),
+** The sqlite3_result_text(), sqlite3_result_text16(),
** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces
** set the return value of the application-defined function to be
** a text string which is represented as UTF-8, UTF-16 native byte order,
@@ -4380,7 +4087,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** SQLite takes the text result from the application from
** the 2nd parameter of the sqlite3_result_text* interfaces.
** If the 3rd parameter to the sqlite3_result_text* interfaces
-** is negative, then SQLite takes result text from the 2nd parameter
+** is negative, then SQLite takes result text from the 2nd parameter
** through the first zero character.
** If the 3rd parameter to the sqlite3_result_text* interfaces
** is non-negative, then as many bytes (not characters) of the text
@@ -4388,13 +4095,13 @@ typedef void (*sqlite3_destructor_type)(void*);
** function result.
** If the 4th parameter to the sqlite3_result_text* interfaces
** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
-** function as the destructor on the text or blob result when it has
-** finished using that result.
-** If the 4th parameter to the sqlite3_result_text* interfaces
-** or sqlite3_result_blob is the special constant SQLITE_STATIC, then
-** SQLite assumes that the text or blob result is constant space and
-** does not copy the space or call a destructor when it has
+** function as the destructor on the text or BLOB result when it has
** finished using that result.
+** If the 4th parameter to the sqlite3_result_text* interfaces or to
+** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite
+** assumes that the text or BLOB result is in constant space and does not
+** copy the content of the parameter nor call a destructor on the content
+** when it has finished using that result.
** If the 4th parameter to the sqlite3_result_text* interfaces
** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT
** then SQLite makes a copy of the result into space obtained from
@@ -4404,111 +4111,20 @@ typedef void (*sqlite3_destructor_type)(void*);
** the application-defined function to be a copy the
** [unprotected sqlite3_value] object specified by the 2nd parameter. The
** sqlite3_result_value() interface makes a copy of the [sqlite3_value]
-** so that [sqlite3_value] specified in the parameter may change or
+** so that the [sqlite3_value] specified in the parameter may change or
** be deallocated after sqlite3_result_value() returns without harm.
** A [protected sqlite3_value] object may always be used where an
** [unprotected sqlite3_value] object is required, so either
** kind of [sqlite3_value] object can be used with this interface.
**
-** If these routines are called from within the different thread
-** than the one containing the application-defined function that recieved
+** If these routines are called from within the different thread
+** than the one containing the application-defined function that received
** the [sqlite3_context] pointer, the results are undefined.
**
-** INVARIANTS:
-**
-** {F16403} The default return value from any SQL function is NULL.
-**
-** {F16406} The [sqlite3_result_blob(C,V,N,D)] interface changes the
-** return value of function C to be a blob that is N bytes
-** in length and with content pointed to by V.
-**
-** {F16409} The [sqlite3_result_double(C,V)] interface changes the
-** return value of function C to be the floating point value V.
-**
-** {F16412} The [sqlite3_result_error(C,V,N)] interface changes the return
-** value of function C to be an exception with error code
-** [SQLITE_ERROR] and a UTF8 error message copied from V up to the
-** first zero byte or until N bytes are read if N is positive.
-**
-** {F16415} The [sqlite3_result_error16(C,V,N)] interface changes the return
-** value of function C to be an exception with error code
-** [SQLITE_ERROR] and a UTF16 native byte order error message
-** copied from V up to the first zero terminator or until N bytes
-** are read if N is positive.
-**
-** {F16418} The [sqlite3_result_error_toobig(C)] interface changes the return
-** value of the function C to be an exception with error code
-** [SQLITE_TOOBIG] and an appropriate error message.
-**
-** {F16421} The [sqlite3_result_error_nomem(C)] interface changes the return
-** value of the function C to be an exception with error code
-** [SQLITE_NOMEM] and an appropriate error message.
-**
-** {F16424} The [sqlite3_result_error_code(C,E)] interface changes the return
-** value of the function C to be an exception with error code E.
-** The error message text is unchanged.
-**
-** {F16427} The [sqlite3_result_int(C,V)] interface changes the
-** return value of function C to be the 32-bit integer value V.
-**
-** {F16430} The [sqlite3_result_int64(C,V)] interface changes the
-** return value of function C to be the 64-bit integer value V.
-**
-** {F16433} The [sqlite3_result_null(C)] interface changes the
-** return value of function C to be NULL.
-**
-** {F16436} The [sqlite3_result_text(C,V,N,D)] interface changes the
-** return value of function C to be the UTF8 string
-** V up to the first zero if N is negative
-** or the first N bytes of V if N is non-negative.
-**
-** {F16439} The [sqlite3_result_text16(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 native byte order
-** string V up to the first zero if N is
-** negative or the first N bytes of V if N is non-negative.
-**
-** {F16442} The [sqlite3_result_text16be(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 big-endian
-** string V up to the first zero if N is
-** is negative or the first N bytes or V if N is non-negative.
-**
-** {F16445} The [sqlite3_result_text16le(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 little-endian
-** string V up to the first zero if N is
-** negative or the first N bytes of V if N is non-negative.
-**
-** {F16448} The [sqlite3_result_value(C,V)] interface changes the
-** return value of function C to be [unprotected sqlite3_value]
-** object V.
-**
-** {F16451} The [sqlite3_result_zeroblob(C,N)] interface changes the
-** return value of function C to be an N-byte blob of all zeros.
-**
-** {F16454} The [sqlite3_result_error()] and [sqlite3_result_error16()]
-** interfaces make a copy of their error message strings before
-** returning.
-**
-** {F16457} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is the constant [SQLITE_STATIC]
-** then no destructor is ever called on the pointer V and SQLite
-** assumes that V is immutable.
-**
-** {F16460} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is the constant
-** [SQLITE_TRANSIENT] then the interfaces makes a copy of the
-** content of V and retains the copy.
-**
-** {F16463} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is some value other than
-** the constants [SQLITE_STATIC] and [SQLITE_TRANSIENT] then
-** SQLite will invoke the destructor D with V as its only argument
-** when it has finished with the V value.
+** Requirements:
+** [H16403] [H16406] [H16409] [H16412] [H16415] [H16418] [H16421] [H16424]
+** [H16427] [H16430] [H16433] [H16436] [H16439] [H16442] [H16445] [H16448]
+** [H16451] [H16454] [H16457] [H16460] [H16463]
*/
SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
SQLITE_API void sqlite3_result_double(sqlite3_context*, double);
@@ -4528,10 +4144,10 @@ SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
/*
-** CAPI3REF: Define New Collating Sequences {F16600}
+** CAPI3REF: Define New Collating Sequences {H16600} <S20300>
**
** These functions are used to add new collation sequences to the
-** [sqlite3*] handle specified as the first argument.
+** [database connection] specified as the first argument.
**
** The name of the new collation sequence is specified as a UTF-8 string
** for sqlite3_create_collation() and sqlite3_create_collation_v2()
@@ -4539,86 +4155,43 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
** the name is passed as the second function argument.
**
** The third argument may be one of the constants [SQLITE_UTF8],
-** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied
+** [SQLITE_UTF16LE], or [SQLITE_UTF16BE], indicating that the user-supplied
** routine expects to be passed pointers to strings encoded using UTF-8,
-** UTF-16 little-endian or UTF-16 big-endian respectively. The
-** third argument might also be [SQLITE_UTF16_ALIGNED] to indicate that
+** UTF-16 little-endian, or UTF-16 big-endian, respectively. The
+** third argument might also be [SQLITE_UTF16] to indicate that the routine
+** expects pointers to be UTF-16 strings in the native byte order, or the
+** argument can be [SQLITE_UTF16_ALIGNED] if the
** the routine expects pointers to 16-bit word aligned strings
-** of UTF16 in the native byte order of the host computer.
+** of UTF-16 in the native byte order.
**
** A pointer to the user supplied routine must be passed as the fifth
** argument. If it is NULL, this is the same as deleting the collation
** sequence (so that SQLite cannot call it anymore).
-** Each time the application
-** supplied function is invoked, it is passed a copy of the void* passed as
-** the fourth argument to sqlite3_create_collation() or
-** sqlite3_create_collation16() as its first parameter.
+** Each time the application supplied function is invoked, it is passed
+** as its first parameter a copy of the void* passed as the fourth argument
+** to sqlite3_create_collation() or sqlite3_create_collation16().
**
** The remaining arguments to the application-supplied routine are two strings,
** each represented by a (length, data) pair and encoded in the encoding
** that was passed as the third argument when the collation sequence was
-** registered. {END} The application defined collation routine should
-** return negative, zero or positive if
-** the first string is less than, equal to, or greater than the second
-** string. i.e. (STRING1 - STRING2).
+** registered. {END} The application defined collation routine should
+** return negative, zero or positive if the first string is less than,
+** equal to, or greater than the second string. i.e. (STRING1 - STRING2).
**
** The sqlite3_create_collation_v2() works like sqlite3_create_collation()
-** excapt that it takes an extra argument which is a destructor for
+** except that it takes an extra argument which is a destructor for
** the collation. The destructor is called when the collation is
** destroyed and is passed a copy of the fourth parameter void* pointer
** of the sqlite3_create_collation_v2().
-** Collations are destroyed when
-** they are overridden by later calls to the collation creation functions
-** or when the [sqlite3*] database handle is closed using [sqlite3_close()].
-**
-** INVARIANTS:
-**
-** {F16603} A successful call to the
-** [sqlite3_create_collation_v2(B,X,E,P,F,D)] interface
-** registers function F as the comparison function used to
-** implement collation X on [database connection] B for
-** databases having encoding E.
-**
-** {F16604} SQLite understands the X parameter to
-** [sqlite3_create_collation_v2(B,X,E,P,F,D)] as a zero-terminated
-** UTF-8 string in which case is ignored for ASCII characters and
-** is significant for non-ASCII characters.
-**
-** {F16606} Successive calls to [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** with the same values for B, X, and E, override prior values
-** of P, F, and D.
-**
-** {F16609} The destructor D in [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** is not NULL then it is called with argument P when the
-** collating function is dropped by SQLite.
+** Collations are destroyed when they are overridden by later calls to the
+** collation creation functions or when the [database connection] is closed
+** using [sqlite3_close()].
**
-** {F16612} A collating function is dropped when it is overloaded.
+** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()].
**
-** {F16615} A collating function is dropped when the database connection
-** is closed using [sqlite3_close()].
-**
-** {F16618} The pointer P in [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** is passed through as the first parameter to the comparison
-** function F for all subsequent invocations of F.
-**
-** {F16621} A call to [sqlite3_create_collation(B,X,E,P,F)] is exactly
-** the same as a call to [sqlite3_create_collation_v2()] with
-** the same parameters and a NULL destructor.
-**
-** {F16624} Following a [sqlite3_create_collation_v2(B,X,E,P,F,D)],
-** SQLite uses the comparison function F for all text comparison
-** operations on [database connection] B on text values that
-** use the collating sequence name X.
-**
-** {F16627} The [sqlite3_create_collation16(B,X,E,P,F)] works the same
-** as [sqlite3_create_collation(B,X,E,P,F)] except that the
-** collation name X is understood as UTF-16 in native byte order
-** instead of UTF-8.
-**
-** {F16630} When multiple comparison functions are available for the same
-** collating sequence, SQLite chooses the one whose text encoding
-** requires the least amount of conversion from the default
-** text encoding of the database.
+** Requirements:
+** [H16603] [H16604] [H16606] [H16609] [H16612] [H16615] [H16618] [H16621]
+** [H16624] [H16627] [H16630]
*/
SQLITE_API int sqlite3_create_collation(
sqlite3*,
@@ -4637,59 +4210,40 @@ SQLITE_API int sqlite3_create_collation_v2(
);
SQLITE_API int sqlite3_create_collation16(
sqlite3*,
- const char *zName,
+ const void *zName,
int eTextRep,
void*,
int(*xCompare)(void*,int,const void*,int,const void*)
);
/*
-** CAPI3REF: Collation Needed Callbacks {F16700}
+** CAPI3REF: Collation Needed Callbacks {H16700} <S20300>
**
** To avoid having to register all collation sequences before a database
** can be used, a single callback function may be registered with the
-** database handle to be called whenever an undefined collation sequence is
-** required.
+** [database connection] to be called whenever an undefined collation
+** sequence is required.
**
** If the function is registered using the sqlite3_collation_needed() API,
** then it is passed the names of undefined collation sequences as strings
-** encoded in UTF-8. {F16703} If sqlite3_collation_needed16() is used, the names
-** are passed as UTF-16 in machine native byte order. A call to either
-** function replaces any existing callback.
+** encoded in UTF-8. {H16703} If sqlite3_collation_needed16() is used,
+** the names are passed as UTF-16 in machine native byte order.
+** A call to either function replaces any existing callback.
**
** When the callback is invoked, the first argument passed is a copy
** of the second argument to sqlite3_collation_needed() or
** sqlite3_collation_needed16(). The second argument is the database
-** handle. The third argument is one of [SQLITE_UTF8],
-** [SQLITE_UTF16BE], or [SQLITE_UTF16LE], indicating the most
-** desirable form of the collation sequence function required.
-** The fourth parameter is the name of the
+** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE],
+** or [SQLITE_UTF16LE], indicating the most desirable form of the collation
+** sequence function required. The fourth parameter is the name of the
** required collation sequence.
**
** The callback function should register the desired collation using
** [sqlite3_create_collation()], [sqlite3_create_collation16()], or
** [sqlite3_create_collation_v2()].
**
-** INVARIANTS:
-**
-** {F16702} A successful call to [sqlite3_collation_needed(D,P,F)]
-** or [sqlite3_collation_needed16(D,P,F)] causes
-** the [database connection] D to invoke callback F with first
-** parameter P whenever it needs a comparison function for a
-** collating sequence that it does not know about.
-**
-** {F16704} Each successful call to [sqlite3_collation_needed()] or
-** [sqlite3_collation_needed16()] overrides the callback registered
-** on the same [database connection] by prior calls to either
-** interface.
-**
-** {F16706} The name of the requested collating function passed in the
-** 4th parameter to the callback is in UTF-8 if the callback
-** was registered using [sqlite3_collation_needed()] and
-** is in UTF-16 native byte order if the callback was
-** registered using [sqlite3_collation_needed16()].
-**
-**
+** Requirements:
+** [H16702] [H16704] [H16706]
*/
SQLITE_API int sqlite3_collation_needed(
sqlite3*,
@@ -4728,128 +4282,143 @@ SQLITE_API int sqlite3_rekey(
);
/*
-** CAPI3REF: Suspend Execution For A Short Time {F10530}
+** CAPI3REF: Suspend Execution For A Short Time {H10530} <S40410>
**
-** The sqlite3_sleep() function
-** causes the current thread to suspend execution
+** The sqlite3_sleep() function causes the current thread to suspend execution
** for at least a number of milliseconds specified in its parameter.
**
-** If the operating system does not support sleep requests with
-** millisecond time resolution, then the time will be rounded up to
-** the nearest second. The number of milliseconds of sleep actually
+** If the operating system does not support sleep requests with
+** millisecond time resolution, then the time will be rounded up to
+** the nearest second. The number of milliseconds of sleep actually
** requested from the operating system is returned.
**
** SQLite implements this interface by calling the xSleep()
** method of the default [sqlite3_vfs] object.
**
-** INVARIANTS:
-**
-** {F10533} The [sqlite3_sleep(M)] interface invokes the xSleep
-** method of the default [sqlite3_vfs|VFS] in order to
-** suspend execution of the current thread for at least
-** M milliseconds.
-**
-** {F10536} The [sqlite3_sleep(M)] interface returns the number of
-** milliseconds of sleep actually requested of the operating
-** system, which might be larger than the parameter M.
+** Requirements: [H10533] [H10536]
*/
SQLITE_API int sqlite3_sleep(int);
/*
-** CAPI3REF: Name Of The Folder Holding Temporary Files {F10310}
+** CAPI3REF: Name Of The Folder Holding Temporary Files {H10310} <S20000>
**
** If this global variable is made to point to a string which is
-** the name of a folder (a.ka. directory), then all temporary files
+** the name of a folder (a.k.a. directory), then all temporary files
** created by SQLite will be placed in that directory. If this variable
-** is NULL pointer, then SQLite does a search for an appropriate temporary
-** file directory.
-**
-** It is not safe to modify this variable once a database connection
-** has been opened. It is intended that this variable be set once
+** is a NULL pointer, then SQLite performs a search for an appropriate
+** temporary file directory.
+**
+** It is not safe to read or modify this variable in more than one
+** thread at a time. It is not safe to read or modify this variable
+** if a [database connection] is being used at the same time in a separate
+** thread.
+** It is intended that this variable be set once
** as part of process initialization and before any SQLite interface
-** routines have been call and remain unchanged thereafter.
+** routines have been called and that this variable remain unchanged
+** thereafter.
+**
+** The [temp_store_directory pragma] may modify this variable and cause
+** it to point to memory obtained from [sqlite3_malloc]. Furthermore,
+** the [temp_store_directory pragma] always assumes that any string
+** that this variable points to is held in memory obtained from
+** [sqlite3_malloc] and the pragma may attempt to free that memory
+** using [sqlite3_free].
+** Hence, if this variable is modified directly, either it should be
+** made NULL or made to point to memory obtained from [sqlite3_malloc]
+** or else the use of the [temp_store_directory pragma] should be avoided.
*/
SQLITE_API char *sqlite3_temp_directory;
/*
-** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode {F12930}
+** CAPI3REF: Test For Auto-Commit Mode {H12930} <S60200>
+** KEYWORDS: {autocommit mode}
**
-** The sqlite3_get_autocommit() interfaces returns non-zero or
+** The sqlite3_get_autocommit() interface returns non-zero or
** zero if the given database connection is or is not in autocommit mode,
-** respectively. Autocommit mode is on
-** by default. Autocommit mode is disabled by a [BEGIN] statement.
-** Autocommit mode is reenabled by a [COMMIT] or [ROLLBACK].
+** respectively. Autocommit mode is on by default.
+** Autocommit mode is disabled by a [BEGIN] statement.
+** Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK].
**
** If certain kinds of errors occur on a statement within a multi-statement
-** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR],
+** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR],
** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the
** transaction might be rolled back automatically. The only way to
-** find out if SQLite automatically rolled back the transaction after
+** find out whether SQLite automatically rolled back the transaction after
** an error is to use this function.
**
-** INVARIANTS:
-**
-** {F12931} The [sqlite3_get_autocommit(D)] interface returns non-zero or
-** zero if the [database connection] D is or is not in autocommit
-** mode, respectively.
-**
-** {F12932} Autocommit mode is on by default.
-**
-** {F12933} Autocommit mode is disabled by a successful [BEGIN] statement.
-**
-** {F12934} Autocommit mode is enabled by a successful [COMMIT] or [ROLLBACK]
-** statement.
-**
+** If another thread changes the autocommit status of the database
+** connection while this routine is running, then the return value
+** is undefined.
**
-** LIMITATIONS:
-***
-** {U12936} If another thread changes the autocommit status of the database
-** connection while this routine is running, then the return value
-** is undefined.
+** Requirements: [H12931] [H12932] [H12933] [H12934]
*/
SQLITE_API int sqlite3_get_autocommit(sqlite3*);
/*
-** CAPI3REF: Find The Database Handle Of A Prepared Statement {F13120}
-**
-** The sqlite3_db_handle interface
-** returns the [sqlite3*] database handle to which a
-** [prepared statement] belongs.
-** The database handle returned by sqlite3_db_handle
-** is the same database handle that was
-** the first argument to the [sqlite3_prepare_v2()] or its variants
-** that was used to create the statement in the first place.
+** CAPI3REF: Find The Database Handle Of A Prepared Statement {H13120} <S60600>
**
-** INVARIANTS:
+** The sqlite3_db_handle interface returns the [database connection] handle
+** to which a [prepared statement] belongs. The [database connection]
+** returned by sqlite3_db_handle is the same [database connection] that was the first argument
+** to the [sqlite3_prepare_v2()] call (or its variants) that was used to
+** create the statement in the first place.
**
-** {F13123} The [sqlite3_db_handle(S)] interface returns a pointer
-** to the [database connection] associated with
-** [prepared statement] S.
+** Requirements: [H13123]
*/
SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
+/*
+** CAPI3REF: Find the next prepared statement {H13140} <S60600>
+**
+** This interface returns a pointer to the next [prepared statement] after
+** pStmt associated with the [database connection] pDb. If pStmt is NULL
+** then this interface returns a pointer to the first prepared statement
+** associated with the database connection pDb. If no prepared statement
+** satisfies the conditions of this routine, it returns NULL.
+**
+** The [database connection] pointer D in a call to
+** [sqlite3_next_stmt(D,S)] must refer to an open database
+** connection and in particular must not be a NULL pointer.
+**
+** Requirements: [H13143] [H13146] [H13149] [H13152]
+*/
+SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Commit And Rollback Notification Callbacks {F12950}
+** CAPI3REF: Commit And Rollback Notification Callbacks {H12950} <S60400>
**
** The sqlite3_commit_hook() interface registers a callback
-** function to be invoked whenever a transaction is committed.
+** function to be invoked whenever a transaction is [COMMIT | committed].
** Any callback set by a previous call to sqlite3_commit_hook()
** for the same database connection is overridden.
** The sqlite3_rollback_hook() interface registers a callback
-** function to be invoked whenever a transaction is committed.
+** function to be invoked whenever a transaction is [ROLLBACK | rolled back].
** Any callback set by a previous call to sqlite3_commit_hook()
** for the same database connection is overridden.
-** The pArg argument is passed through
-** to the callback. If the callback on a commit hook function
-** returns non-zero, then the commit is converted into a rollback.
+** The pArg argument is passed through to the callback.
+** If the callback on a commit hook function returns non-zero,
+** then the commit is converted into a rollback.
**
** If another function was previously registered, its
** pArg value is returned. Otherwise NULL is returned.
**
+** The callback implementation must not do anything that will modify
+** the database connection that invoked the callback. Any actions
+** to modify the database connection must be deferred until after the
+** completion of the [sqlite3_step()] call that triggered the commit
+** or rollback hook in the first place.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
+**
** Registering a NULL function disables the callback.
**
-** For the purposes of this API, a transaction is said to have been
+** When the commit hook callback routine returns zero, the [COMMIT]
+** operation is allowed to continue normally. If the commit hook
+** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK].
+** The rollback hook is invoked on a rollback that results from a commit
+** hook returning non-zero, just as it would be with any other rollback.
+**
+** For the purposes of this API, a transaction is said to have been
** rolled back if an explicit "ROLLBACK" statement is executed, or
** an error or constraint causes an implicit rollback to occur.
** The rollback callback is not invoked if a transaction is
@@ -4858,108 +4427,61 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
** rolled back because a commit callback returned non-zero.
** <todo> Check on this </todo>
**
-** These are experimental interfaces and are subject to change.
-**
-** INVARIANTS:
-**
-** {F12951} The [sqlite3_commit_hook(D,F,P)] interface registers the
-** callback function F to be invoked with argument P whenever
-** a transaction commits on [database connection] D.
-**
-** {F12952} The [sqlite3_commit_hook(D,F,P)] interface returns the P
-** argument from the previous call with the same
-** [database connection ] D , or NULL on the first call
-** for a particular [database connection] D.
+** See also the [sqlite3_update_hook()] interface.
**
-** {F12953} Each call to [sqlite3_commit_hook()] overwrites the callback
-** registered by prior calls.
-**
-** {F12954} If the F argument to [sqlite3_commit_hook(D,F,P)] is NULL
-** then the commit hook callback is cancelled and no callback
-** is invoked when a transaction commits.
-**
-** {F12955} If the commit callback returns non-zero then the commit is
-** converted into a rollback.
-**
-** {F12961} The [sqlite3_rollback_hook(D,F,P)] interface registers the
-** callback function F to be invoked with argument P whenever
-** a transaction rolls back on [database connection] D.
-**
-** {F12962} The [sqlite3_rollback_hook(D,F,P)] interface returns the P
-** argument from the previous call with the same
-** [database connection ] D , or NULL on the first call
-** for a particular [database connection] D.
-**
-** {F12963} Each call to [sqlite3_rollback_hook()] overwrites the callback
-** registered by prior calls.
-**
-** {F12964} If the F argument to [sqlite3_rollback_hook(D,F,P)] is NULL
-** then the rollback hook callback is cancelled and no callback
-** is invoked when a transaction rolls back.
+** Requirements:
+** [H12951] [H12952] [H12953] [H12954] [H12955]
+** [H12961] [H12962] [H12963] [H12964]
*/
SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
/*
-** CAPI3REF: Data Change Notification Callbacks {F12970}
-**
-** The sqlite3_update_hook() interface
-** registers a callback function with the database connection identified by the
-** first argument to be invoked whenever a row is updated, inserted or deleted.
-** Any callback set by a previous call to this function for the same
-** database connection is overridden.
-**
-** The second argument is a pointer to the function to invoke when a
-** row is updated, inserted or deleted.
-** The first argument to the callback is
-** a copy of the third argument to sqlite3_update_hook().
-** The second callback
-** argument is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE],
-** depending on the operation that caused the callback to be invoked.
-** The third and
-** fourth arguments to the callback contain pointers to the database and
-** table name containing the affected row.
-** The final callback parameter is
-** the rowid of the row.
-** In the case of an update, this is the rowid after
-** the update takes place.
+** CAPI3REF: Data Change Notification Callbacks {H12970} <S60400>
**
-** The update hook is not invoked when internal system tables are
-** modified (i.e. sqlite_master and sqlite_sequence).
-**
-** If another function was previously registered, its pArg value
-** is returned. Otherwise NULL is returned.
-**
-** INVARIANTS:
+** The sqlite3_update_hook() interface registers a callback function
+** with the [database connection] identified by the first argument
+** to be invoked whenever a row is updated, inserted or deleted.
+** Any callback set by a previous call to this function
+** for the same database connection is overridden.
**
-** {F12971} The [sqlite3_update_hook(D,F,P)] interface causes callback
-** function F to be invoked with first parameter P whenever
-** a table row is modified, inserted, or deleted on
-** [database connection] D.
+** The second argument is a pointer to the function to invoke when a
+** row is updated, inserted or deleted.
+** The first argument to the callback is a copy of the third argument
+** to sqlite3_update_hook().
+** The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE],
+** or [SQLITE_UPDATE], depending on the operation that caused the callback
+** to be invoked.
+** The third and fourth arguments to the callback contain pointers to the
+** database and table name containing the affected row.
+** The final callback parameter is the [rowid] of the row.
+** In the case of an update, this is the [rowid] after the update takes place.
**
-** {F12973} The [sqlite3_update_hook(D,F,P)] interface returns the value
-** of P for the previous call on the same [database connection] D,
-** or NULL for the first call.
+** The update hook is not invoked when internal system tables are
+** modified (i.e. sqlite_master and sqlite_sequence).
**
-** {F12975} If the update hook callback F in [sqlite3_update_hook(D,F,P)]
-** is NULL then the no update callbacks are made.
+** In the current implementation, the update hook
+** is not invoked when duplication rows are deleted because of an
+** [ON CONFLICT | ON CONFLICT REPLACE] clause. Nor is the update hook
+** invoked when rows are deleted using the [truncate optimization].
+** The exceptions defined in this paragraph might change in a future
+** release of SQLite.
**
-** {F12977} Each call to [sqlite3_update_hook(D,F,P)] overrides prior calls
-** to the same interface on the same [database connection] D.
+** The update hook implementation must not do anything that will modify
+** the database connection that invoked the update hook. Any actions
+** to modify the database connection must be deferred until after the
+** completion of the [sqlite3_step()] call that triggered the update hook.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12979} The update hook callback is not invoked when internal system
-** tables such as sqlite_master and sqlite_sequence are modified.
+** If another function was previously registered, its pArg value
+** is returned. Otherwise NULL is returned.
**
-** {F12981} The second parameter to the update callback
-** is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE],
-** depending on the operation that caused the callback to be invoked.
+** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()]
+** interfaces.
**
-** {F12983} The third and fourth arguments to the callback contain pointers
-** to zero-terminated UTF-8 strings which are the names of the
-** database and table that is being updated.
-
-** {F12985} The final callback parameter is the rowid of the row after
-** the change occurs.
+** Requirements:
+** [H12971] [H12973] [H12975] [H12977] [H12979] [H12981] [H12983] [H12986]
*/
SQLITE_API void *sqlite3_update_hook(
sqlite3*,
@@ -4968,96 +4490,74 @@ SQLITE_API void *sqlite3_update_hook(
);
/*
-** CAPI3REF: Enable Or Disable Shared Pager Cache {F10330}
+** CAPI3REF: Enable Or Disable Shared Pager Cache {H10330} <S30900>
+** KEYWORDS: {shared cache}
**
** This routine enables or disables the sharing of the database cache
-** and schema data structures between connections to the same database.
-** Sharing is enabled if the argument is true and disabled if the argument
-** is false.
+** and schema data structures between [database connection | connections]
+** to the same database. Sharing is enabled if the argument is true
+** and disabled if the argument is false.
**
-** Cache sharing is enabled and disabled
-** for an entire process. {END} This is a change as of SQLite version 3.5.0.
-** In prior versions of SQLite, sharing was
-** enabled or disabled for each thread separately.
+** Cache sharing is enabled and disabled for an entire process.
+** This is a change as of SQLite version 3.5.0. In prior versions of SQLite,
+** sharing was enabled or disabled for each thread separately.
**
** The cache sharing mode set by this interface effects all subsequent
** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()].
** Existing database connections continue use the sharing mode
** that was in effect at the time they were opened.
**
-** Virtual tables cannot be used with a shared cache. When shared
+** Virtual tables cannot be used with a shared cache. When shared
** cache is enabled, the [sqlite3_create_module()] API used to register
** virtual tables will always return an error.
**
-** This routine returns [SQLITE_OK] if shared cache was
-** enabled or disabled successfully. An [error code]
-** is returned otherwise.
+** This routine returns [SQLITE_OK] if shared cache was enabled or disabled
+** successfully. An [error code] is returned otherwise.
**
** Shared cache is disabled by default. But this might change in
** future releases of SQLite. Applications that care about shared
** cache setting should set it explicitly.
**
-** INVARIANTS:
-**
-** {F10331} A successful invocation of [sqlite3_enable_shared_cache(B)]
-** will enable or disable shared cache mode for any subsequently
-** created [database connection] in the same process.
-**
-** {F10336} When shared cache is enabled, the [sqlite3_create_module()]
-** interface will always return an error.
-**
-** {F10337} The [sqlite3_enable_shared_cache(B)] interface returns
-** [SQLITE_OK] if shared cache was enabled or disabled successfully.
+** See Also: [SQLite Shared-Cache Mode]
**
-** {F10339} Shared cache is disabled by default.
+** Requirements: [H10331] [H10336] [H10337] [H10339]
*/
SQLITE_API int sqlite3_enable_shared_cache(int);
/*
-** CAPI3REF: Attempt To Free Heap Memory {F17340}
+** CAPI3REF: Attempt To Free Heap Memory {H17340} <S30220>
**
-** The sqlite3_release_memory() interface attempts to
-** free N bytes of heap memory by deallocating non-essential memory
-** allocations held by the database labrary. {END} Memory used
-** to cache database pages to improve performance is an example of
-** non-essential memory. Sqlite3_release_memory() returns
-** the number of bytes actually freed, which might be more or less
-** than the amount requested.
+** The sqlite3_release_memory() interface attempts to free N bytes
+** of heap memory by deallocating non-essential memory allocations
+** held by the database library. {END} Memory used to cache database
+** pages to improve performance is an example of non-essential memory.
+** sqlite3_release_memory() returns the number of bytes actually freed,
+** which might be more or less than the amount requested.
**
-** INVARIANTS:
-**
-** {F17341} The [sqlite3_release_memory(N)] interface attempts to
-** free N bytes of heap memory by deallocating non-essential
-** memory allocations held by the database labrary.
-**
-** {F16342} The [sqlite3_release_memory(N)] returns the number
-** of bytes actually freed, which might be more or less
-** than the amount requested.
+** Requirements: [H17341] [H17342]
*/
SQLITE_API int sqlite3_release_memory(int);
/*
-** CAPI3REF: Impose A Limit On Heap Size {F17350}
+** CAPI3REF: Impose A Limit On Heap Size {H17350} <S30220>
**
-** The sqlite3_soft_heap_limit() interface
-** places a "soft" limit on the amount of heap memory that may be allocated
-** by SQLite. If an internal allocation is requested
-** that would exceed the soft heap limit, [sqlite3_release_memory()] is
-** invoked one or more times to free up some space before the allocation
-** is made.
+** The sqlite3_soft_heap_limit() interface places a "soft" limit
+** on the amount of heap memory that may be allocated by SQLite.
+** If an internal allocation is requested that would exceed the
+** soft heap limit, [sqlite3_release_memory()] is invoked one or
+** more times to free up some space before the allocation is performed.
**
-** The limit is called "soft", because if
-** [sqlite3_release_memory()] cannot
-** free sufficient memory to prevent the limit from being exceeded,
+** The limit is called "soft", because if [sqlite3_release_memory()]
+** cannot free sufficient memory to prevent the limit from being exceeded,
** the memory is allocated anyway and the current operation proceeds.
**
** A negative or zero value for N means that there is no soft heap limit and
** [sqlite3_release_memory()] will only be called when memory is exhausted.
** The default value for the soft heap limit is zero.
**
-** SQLite makes a best effort to honor the soft heap limit.
-** But if the soft heap limit cannot honored, execution will
-** continue without error or notification. This is why the limit is
+** SQLite makes a best effort to honor the soft heap limit.
+** But if the soft heap limit cannot be honored, execution will
+** continue without error or notification. This is why the limit is
** called a "soft" limit. It is advisory only.
**
** Prior to SQLite version 3.5.0, this routine only constrained the memory
@@ -5068,83 +4568,56 @@ SQLITE_API int sqlite3_release_memory(int);
** version 3.5.0 there is no mechanism for limiting the heap usage for
** individual threads.
**
-** INVARIANTS:
-**
-** {F16351} The [sqlite3_soft_heap_limit(N)] interface places a soft limit
-** of N bytes on the amount of heap memory that may be allocated
-** using [sqlite3_malloc()] or [sqlite3_realloc()] at any point
-** in time.
-**
-** {F16352} If a call to [sqlite3_malloc()] or [sqlite3_realloc()] would
-** cause the total amount of allocated memory to exceed the
-** soft heap limit, then [sqlite3_release_memory()] is invoked
-** in an attempt to reduce the memory usage prior to proceeding
-** with the memory allocation attempt.
-**
-** {F16353} Calls to [sqlite3_malloc()] or [sqlite3_realloc()] that trigger
-** attempts to reduce memory usage through the soft heap limit
-** mechanism continue even if the attempt to reduce memory
-** usage is unsuccessful.
-**
-** {F16354} A negative or zero value for N in a call to
-** [sqlite3_soft_heap_limit(N)] means that there is no soft
-** heap limit and [sqlite3_release_memory()] will only be
-** called when memory is completely exhausted.
-**
-** {F16355} The default value for the soft heap limit is zero.
-**
-** {F16358} Each call to [sqlite3_soft_heap_limit(N)] overrides the
-** values set by all prior calls.
+** Requirements:
+** [H16351] [H16352] [H16353] [H16354] [H16355] [H16358]
*/
SQLITE_API void sqlite3_soft_heap_limit(int);
/*
-** CAPI3REF: Extract Metadata About A Column Of A Table {F12850}
+** CAPI3REF: Extract Metadata About A Column Of A Table {H12850} <S60300>
**
-** This routine
-** returns meta-data about a specific column of a specific database
-** table accessible using the connection handle passed as the first function
-** argument.
+** This routine returns metadata about a specific column of a specific
+** database table accessible using the [database connection] handle
+** passed as the first function argument.
**
-** The column is identified by the second, third and fourth parameters to
+** The column is identified by the second, third and fourth parameters to
** this function. The second parameter is either the name of the database
** (i.e. "main", "temp" or an attached database) containing the specified
** table or NULL. If it is NULL, then all attached databases are searched
-** for the table using the same algorithm as the database engine uses to
+** for the table using the same algorithm used by the database engine to
** resolve unqualified table references.
**
-** The third and fourth parameters to this function are the table and column
-** name of the desired column, respectively. Neither of these parameters
+** The third and fourth parameters to this function are the table and column
+** name of the desired column, respectively. Neither of these parameters
** may be NULL.
**
-** Meta information is returned by writing to the memory locations passed as
-** the 5th and subsequent parameters to this function. Any of these
-** arguments may be NULL, in which case the corresponding element of meta
-** information is ommitted.
+** Metadata is returned by writing to the memory locations passed as the 5th
+** and subsequent parameters to this function. Any of these arguments may be
+** NULL, in which case the corresponding element of metadata is omitted.
**
-** <pre>
-** Parameter Output Type Description
-** -----------------------------------
-**
-** 5th const char* Data type
-** 6th const char* Name of the default collation sequence
-** 7th int True if the column has a NOT NULL constraint
-** 8th int True if the column is part of the PRIMARY KEY
-** 9th int True if the column is AUTOINCREMENT
-** </pre>
+** <blockquote>
+** <table border="1">
+** <tr><th> Parameter <th> Output<br>Type <th> Description
**
+** <tr><td> 5th <td> const char* <td> Data type
+** <tr><td> 6th <td> const char* <td> Name of default collation sequence
+** <tr><td> 7th <td> int <td> True if column has a NOT NULL constraint
+** <tr><td> 8th <td> int <td> True if column is part of the PRIMARY KEY
+** <tr><td> 9th <td> int <td> True if column is [AUTOINCREMENT]
+** </table>
+** </blockquote>
**
-** The memory pointed to by the character pointers returned for the
-** declaration type and collation sequence is valid only until the next
-** call to any sqlite API function.
+** The memory pointed to by the character pointers returned for the
+** declaration type and collation sequence is valid only until the next
+** call to any SQLite API function.
**
-** If the specified table is actually a view, then an error is returned.
+** If the specified table is actually a view, an [error code] is returned.
**
-** If the specified column is "rowid", "oid" or "_rowid_" and an
-** INTEGER PRIMARY KEY column has been explicitly declared, then the output
+** If the specified column is "rowid", "oid" or "_rowid_" and an
+** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output
** parameters are set for the explicitly declared column. If there is no
-** explicitly declared IPK column, then the output parameters are set as
-** follows:
+** explicitly declared [INTEGER PRIMARY KEY] column, then the output
+** parameters are set as follows:
**
** <pre>
** data type: "INTEGER"
@@ -5156,11 +4629,11 @@ SQLITE_API void sqlite3_soft_heap_limit(int);
**
** This function may load one or more schemas from database files. If an
** error occurs during this process, or if the requested table or column
-** cannot be found, an SQLITE error code is returned and an error message
-** left in the database handle (to be retrieved using sqlite3_errmsg()).
+** cannot be found, an [error code] is returned and an error message left
+** in the [database connection] (to be retrieved using sqlite3_errmsg()).
**
** This API is only available if the library was compiled with the
-** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined.
+** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined.
*/
SQLITE_API int sqlite3_table_column_metadata(
sqlite3 *db, /* Connection handle */
@@ -5175,27 +4648,30 @@ SQLITE_API int sqlite3_table_column_metadata(
);
/*
-** CAPI3REF: Load An Extension {F12600}
+** CAPI3REF: Load An Extension {H12600} <S20500>
**
-** {F12601} The sqlite3_load_extension() interface
-** attempts to load an SQLite extension library contained in the file
-** zFile. {F12602} The entry point is zProc. {F12603} zProc may be 0
-** in which case the name of the entry point defaults
-** to "sqlite3_extension_init".
+** This interface loads an SQLite extension library from the named file.
**
-** {F12604} The sqlite3_load_extension() interface shall
-** return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong.
+** {H12601} The sqlite3_load_extension() interface attempts to load an
+** SQLite extension library contained in the file zFile.
**
-** {F12605}
-** If an error occurs and pzErrMsg is not 0, then the
-** sqlite3_load_extension() interface shall attempt to fill *pzErrMsg with
-** error message text stored in memory obtained from [sqlite3_malloc()].
-** {END} The calling function should free this memory
-** by calling [sqlite3_free()].
+** {H12602} The entry point is zProc.
**
-** {F12606}
-** Extension loading must be enabled using [sqlite3_enable_load_extension()]
-** prior to calling this API or an error will be returned.
+** {H12603} zProc may be 0, in which case the name of the entry point
+** defaults to "sqlite3_extension_init".
+**
+** {H12604} The sqlite3_load_extension() interface shall return
+** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong.
+**
+** {H12605} If an error occurs and pzErrMsg is not 0, then the
+** [sqlite3_load_extension()] interface shall attempt to
+** fill *pzErrMsg with error message text stored in memory
+** obtained from [sqlite3_malloc()]. {END} The calling function
+** should free this memory by calling [sqlite3_free()].
+**
+** {H12606} Extension loading must be enabled using
+** [sqlite3_enable_load_extension()] prior to calling this API,
+** otherwise an error will be returned.
*/
SQLITE_API int sqlite3_load_extension(
sqlite3 *db, /* Load the extension into this database connection */
@@ -5205,65 +4681,64 @@ SQLITE_API int sqlite3_load_extension(
);
/*
-** CAPI3REF: Enable Or Disable Extension Loading {F12620}
+** CAPI3REF: Enable Or Disable Extension Loading {H12620} <S20500>
**
** So as not to open security holes in older applications that are
** unprepared to deal with extension loading, and as a means of disabling
-** extension loading while evaluating user-entered SQL, the following
-** API is provided to turn the [sqlite3_load_extension()] mechanism on and
-** off. {F12622} It is off by default. {END} See ticket #1863.
+** extension loading while evaluating user-entered SQL, the following API
+** is provided to turn the [sqlite3_load_extension()] mechanism on and off.
+**
+** Extension loading is off by default. See ticket #1863.
+**
+** {H12621} Call the sqlite3_enable_load_extension() routine with onoff==1
+** to turn extension loading on and call it with onoff==0 to turn
+** it back off again.
**
-** {F12621} Call the sqlite3_enable_load_extension() routine
-** with onoff==1 to turn extension loading on
-** and call it with onoff==0 to turn it back off again. {END}
+** {H12622} Extension loading is off by default.
*/
SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
/*
-** CAPI3REF: Make Arrangements To Automatically Load An Extension {F12640}
-**
-** {F12641} This function
-** registers an extension entry point that is automatically invoked
-** whenever a new database connection is opened using
-** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. {END}
+** CAPI3REF: Automatically Load An Extensions {H12640} <S20500>
**
** This API can be invoked at program startup in order to register
** one or more statically linked extensions that will be available
-** to all new database connections.
+** to all new [database connections]. {END}
+**
+** This routine stores a pointer to the extension in an array that is
+** obtained from [sqlite3_malloc()]. If you run a memory leak checker
+** on your program and it reports a leak because of this array, invoke
+** [sqlite3_reset_auto_extension()] prior to shutdown to free the memory.
**
-** {F12642} Duplicate extensions are detected so calling this routine multiple
-** times with the same extension is harmless.
+** {H12641} This function registers an extension entry point that is
+** automatically invoked whenever a new [database connection]
+** is opened using [sqlite3_open()], [sqlite3_open16()],
+** or [sqlite3_open_v2()].
**
-** {F12643} This routine stores a pointer to the extension in an array
-** that is obtained from sqlite_malloc(). {END} If you run a memory leak
-** checker on your program and it reports a leak because of this
-** array, then invoke [sqlite3_reset_auto_extension()] prior
-** to shutdown to free the memory.
+** {H12642} Duplicate extensions are detected so calling this routine
+** multiple times with the same extension is harmless.
**
-** {F12644} Automatic extensions apply across all threads. {END}
+** {H12643} This routine stores a pointer to the extension in an array
+** that is obtained from [sqlite3_malloc()].
**
-** This interface is experimental and is subject to change or
-** removal in future releases of SQLite.
+** {H12644} Automatic extensions apply across all threads.
*/
-SQLITE_API int sqlite3_auto_extension(void *xEntryPoint);
-
+SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void));
/*
-** CAPI3REF: Reset Automatic Extension Loading {F12660}
+** CAPI3REF: Reset Automatic Extension Loading {H12660} <S20500>
**
-** {F12661} This function disables all previously registered
-** automatic extensions. {END} This
-** routine undoes the effect of all prior [sqlite3_auto_extension()]
-** calls.
+** This function disables all previously registered automatic
+** extensions. {END} It undoes the effect of all prior
+** [sqlite3_auto_extension()] calls.
**
-** {F12662} This call disabled automatic extensions in all threads. {END}
+** {H12661} This function disables all previously registered
+** automatic extensions.
**
-** This interface is experimental and is subject to change or
-** removal in future releases of SQLite.
+** {H12662} This function disables automatic extensions in all threads.
*/
SQLITE_API void sqlite3_reset_auto_extension(void);
-
/*
****** EXPERIMENTAL - subject to change without notice **************
**
@@ -5271,7 +4746,7 @@ SQLITE_API void sqlite3_reset_auto_extension(void);
** to be experimental. The interface might change in incompatible ways.
** If this is a problem for you, do not use the interface at this time.
**
-** When the virtual-table mechanism stablizes, we will declare the
+** When the virtual-table mechanism stabilizes, we will declare the
** interface fixed, support it indefinitely, and remove this comment.
*/
@@ -5284,12 +4759,21 @@ typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor;
typedef struct sqlite3_module sqlite3_module;
/*
-** CAPI3REF: Virtual Table Object {F18000}
-** KEYWORDS: sqlite3_module
+** CAPI3REF: Virtual Table Object {H18000} <S20400>
+** KEYWORDS: sqlite3_module {virtual table module}
+** EXPERIMENTAL
+**
+** This structure, sometimes called a a "virtual table module",
+** defines the implementation of a [virtual tables].
+** This structure consists mostly of methods for the module.
**
-** A module is a class of virtual tables. Each module is defined
-** by an instance of the following structure. This structure consists
-** mostly of methods for the module.
+** A virtual table module is created by filling in a persistent
+** instance of this structure and passing a pointer to that instance
+** to [sqlite3_create_module()] or [sqlite3_create_module_v2()].
+** The registration remains valid until it is replaced by a different
+** module or until the [database connection] closes. The content
+** of this structure must not change while it is registered with
+** any database connection.
*/
struct sqlite3_module {
int iVersion;
@@ -5318,28 +4802,26 @@ struct sqlite3_module {
int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName,
void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
void **ppArg);
-
int (*xRename)(sqlite3_vtab *pVtab, const char *zNew);
};
/*
-** CAPI3REF: Virtual Table Indexing Information {F18100}
+** CAPI3REF: Virtual Table Indexing Information {H18100} <S20400>
** KEYWORDS: sqlite3_index_info
+** EXPERIMENTAL
**
** The sqlite3_index_info structure and its substructures is used to
-** pass information into and receive the reply from the xBestIndex
-** method of an sqlite3_module. The fields under **Inputs** are the
+** pass information into and receive the reply from the [xBestIndex]
+** method of a [virtual table module]. The fields under **Inputs** are the
** inputs to xBestIndex and are read-only. xBestIndex inserts its
** results into the **Outputs** fields.
**
-** The aConstraint[] array records WHERE clause constraints of the
-** form:
+** The aConstraint[] array records WHERE clause constraints of the form:
**
-** column OP expr
+** <pre>column OP expr</pre>
**
-** Where OP is =, &lt;, &lt;=, &gt;, or &gt;=.
-** The particular operator is stored
-** in aConstraint[].op. The index of the column is stored in
+** where OP is =, &lt;, &lt;=, &gt;, or &gt;=. The particular operator is
+** stored in aConstraint[].op. The index of the column is stored in
** aConstraint[].iColumn. aConstraint[].usable is TRUE if the
** expr on the right-hand side can be evaluated (and thus the constraint
** is usable) and false if it cannot.
@@ -5353,17 +4835,19 @@ struct sqlite3_module {
** Information about the ORDER BY clause is stored in aOrderBy[].
** Each term of aOrderBy records a column of the ORDER BY clause.
**
-** The xBestIndex method must fill aConstraintUsage[] with information
+** The [xBestIndex] method must fill aConstraintUsage[] with information
** about what parameters to pass to xFilter. If argvIndex>0 then
** the right-hand side of the corresponding aConstraint[] is evaluated
** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit
** is true, then the constraint is assumed to be fully handled by the
** virtual table and is not checked again by SQLite.
**
-** The idxNum and idxPtr values are recorded and passed into xFilter.
-** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true.
+** The idxNum and idxPtr values are recorded and passed into the
+** [xFilter] method.
+** [sqlite3_free()] is used to free idxPtr if and only iff
+** needToFreeIdxPtr is true.
**
-** The orderByConsumed means that output from xFilter will occur in
+** The orderByConsumed means that output from [xFilter]/[xNext] will occur in
** the correct order to satisfy the ORDER BY clause so that no separate
** sorting step is required.
**
@@ -5386,7 +4870,6 @@ struct sqlite3_index_info {
int iColumn; /* Column number */
unsigned char desc; /* True for DESC. False for ASC. */
} *aOrderBy; /* The ORDER BY clause */
-
/* Outputs */
struct sqlite3_index_constraint_usage {
int argvIndex; /* if >0, constraint is part of argv to xFilter */
@@ -5406,70 +4889,89 @@ struct sqlite3_index_info {
#define SQLITE_INDEX_CONSTRAINT_MATCH 64
/*
-** CAPI3REF: Register A Virtual Table Implementation {F18200}
+** CAPI3REF: Register A Virtual Table Implementation {H18200} <S20400>
+** EXPERIMENTAL
+**
+** This routine is used to register a new [virtual table module] name.
+** Module names must be registered before
+** creating a new [virtual table] using the module, or before using a
+** preexisting [virtual table] for the module.
+**
+** The module name is registered on the [database connection] specified
+** by the first parameter. The name of the module is given by the
+** second parameter. The third parameter is a pointer to
+** the implementation of the [virtual table module]. The fourth
+** parameter is an arbitrary client data pointer that is passed through
+** into the [xCreate] and [xConnect] methods of the virtual table module
+** when a new virtual table is be being created or reinitialized.
**
-** This routine is used to register a new module name with an SQLite
-** connection. Module names must be registered before creating new
-** virtual tables on the module, or before using preexisting virtual
-** tables of the module.
+** This interface has exactly the same effect as calling
+** [sqlite3_create_module_v2()] with a NULL client data destructor.
*/
-SQLITE_API int sqlite3_create_module(
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module(
sqlite3 *db, /* SQLite connection to register module with */
const char *zName, /* Name of the module */
- const sqlite3_module *, /* Methods for the module */
- void * /* Client data for xCreate/xConnect */
+ const sqlite3_module *p, /* Methods for the module */
+ void *pClientData /* Client data for xCreate/xConnect */
);
/*
-** CAPI3REF: Register A Virtual Table Implementation {F18210}
+** CAPI3REF: Register A Virtual Table Implementation {H18210} <S20400>
+** EXPERIMENTAL
**
-** This routine is identical to the sqlite3_create_module() method above,
-** except that it allows a destructor function to be specified. It is
-** even more experimental than the rest of the virtual tables API.
+** This routine is identical to the [sqlite3_create_module()] method,
+** except that it has an extra parameter to specify
+** a destructor function for the client data pointer. SQLite will
+** invoke the destructor function (if it is not NULL) when SQLite
+** no longer needs the pClientData pointer.
*/
-SQLITE_API int sqlite3_create_module_v2(
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2(
sqlite3 *db, /* SQLite connection to register module with */
const char *zName, /* Name of the module */
- const sqlite3_module *, /* Methods for the module */
- void *, /* Client data for xCreate/xConnect */
+ const sqlite3_module *p, /* Methods for the module */
+ void *pClientData, /* Client data for xCreate/xConnect */
void(*xDestroy)(void*) /* Module destructor function */
);
/*
-** CAPI3REF: Virtual Table Instance Object {F18010}
+** CAPI3REF: Virtual Table Instance Object {H18010} <S20400>
** KEYWORDS: sqlite3_vtab
+** EXPERIMENTAL
**
-** Every module implementation uses a subclass of the following structure
-** to describe a particular instance of the module. Each subclass will
-** be tailored to the specific needs of the module implementation. The
-** purpose of this superclass is to define certain fields that are common
-** to all module implementations.
+** Every [virtual table module] implementation uses a subclass
+** of the following structure to describe a particular instance
+** of the [virtual table]. Each subclass will
+** be tailored to the specific needs of the module implementation.
+** The purpose of this superclass is to define certain fields that are
+** common to all module implementations.
**
** Virtual tables methods can set an error message by assigning a
-** string obtained from sqlite3_mprintf() to zErrMsg. The method should
-** take care that any prior string is freed by a call to sqlite3_free()
+** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should
+** take care that any prior string is freed by a call to [sqlite3_free()]
** prior to assigning a new string to zErrMsg. After the error message
** is delivered up to the client application, the string will be automatically
-** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note
-** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field
-** since virtual tables are commonly implemented in loadable extensions which
-** do not have access to sqlite3MPrintf() or sqlite3Free().
+** freed by sqlite3_free() and the zErrMsg field will be zeroed.
*/
struct sqlite3_vtab {
const sqlite3_module *pModule; /* The module for this virtual table */
- int nRef; /* Used internally */
+ int nRef; /* NO LONGER USED */
char *zErrMsg; /* Error message from sqlite3_mprintf() */
/* Virtual table implementations will typically add additional fields */
};
/*
-** CAPI3REF: Virtual Table Cursor Object {F18020}
-** KEYWORDS: sqlite3_vtab_cursor
+** CAPI3REF: Virtual Table Cursor Object {H18020} <S20400>
+** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor}
+** EXPERIMENTAL
**
-** Every module implementation uses a subclass of the following structure
-** to describe cursors that point into the virtual table and are used
+** Every [virtual table module] implementation uses a subclass of the
+** following structure to describe cursors that point into the
+** [virtual table] and are used
** to loop through the virtual table. Cursors are created using the
-** xOpen method of the module. Each module implementation will define
+** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed
+** by the [sqlite3_module.xClose | xClose] method. Cussors are used
+** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods
+** of the module. Each module implementation will define
** the content of a cursor structure to suit its own needs.
**
** This superclass exists in order to define fields of the cursor that
@@ -5481,19 +4983,23 @@ struct sqlite3_vtab_cursor {
};
/*
-** CAPI3REF: Declare The Schema Of A Virtual Table {F18280}
+** CAPI3REF: Declare The Schema Of A Virtual Table {H18280} <S20400>
+** EXPERIMENTAL
**
-** The xCreate and xConnect methods of a module use the following API
+** The [xCreate] and [xConnect] methods of a
+** [virtual table module] call this interface
** to declare the format (the names and datatypes of the columns) of
** the virtual tables they implement.
*/
-SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable);
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_declare_vtab(sqlite3*, const char *zSQL);
/*
-** CAPI3REF: Overload A Function For A Virtual Table {F18300}
+** CAPI3REF: Overload A Function For A Virtual Table {H18300} <S20400>
+** EXPERIMENTAL
**
** Virtual tables can provide alternative implementations of functions
-** using the xFindFunction method. But global versions of those functions
+** using the [xFindFunction] method of the [virtual table module].
+** But global versions of those functions
** must exist in order to be overloaded.
**
** This API makes sure a global version of a function with a particular
@@ -5501,13 +5007,10 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable);
** before this API is called, a new function is created. The implementation
** of the new function always causes an exception to be thrown. So
** the new function is not good for anything by itself. Its only
-** purpose is to be a place-holder function that can be overloaded
-** by virtual tables.
-**
-** This API should be considered part of the virtual table interface,
-** which is experimental and subject to change.
+** purpose is to be a placeholder function that can be overloaded
+** by a [virtual table].
*/
-SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
/*
** The interface to the virtual-table mechanism defined above (back up
@@ -5522,68 +5025,77 @@ SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nA
*/
/*
-** CAPI3REF: A Handle To An Open BLOB {F17800}
+** CAPI3REF: A Handle To An Open BLOB {H17800} <S30230>
+** KEYWORDS: {BLOB handle} {BLOB handles}
**
** An instance of this object represents an open BLOB on which
-** incremental I/O can be preformed.
-** Objects of this type are created by
-** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()].
+** [sqlite3_blob_open | incremental BLOB I/O] can be performed.
+** Objects of this type are created by [sqlite3_blob_open()]
+** and destroyed by [sqlite3_blob_close()].
** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces
-** can be used to read or write small subsections of the blob.
-** The [sqlite3_blob_bytes()] interface returns the size of the
-** blob in bytes.
+** can be used to read or write small subsections of the BLOB.
+** The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes.
*/
typedef struct sqlite3_blob sqlite3_blob;
/*
-** CAPI3REF: Open A BLOB For Incremental I/O {F17810}
+** CAPI3REF: Open A BLOB For Incremental I/O {H17810} <S30230>
**
-** This interfaces opens a handle to the blob located
+** This interfaces opens a [BLOB handle | handle] to the BLOB located
** in row iRow, column zColumn, table zTable in database zDb;
-** in other words, the same blob that would be selected by:
+** in other words, the same BLOB that would be selected by:
**
** <pre>
-** SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
+** SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
** </pre> {END}
**
-** If the flags parameter is non-zero, the blob is opened for
-** read and write access. If it is zero, the blob is opened for read
-** access.
+** If the flags parameter is non-zero, then the BLOB is opened for read
+** and write access. If it is zero, the BLOB is opened for read access.
+** It is not possible to open a column that is part of an index or primary
+** key for writing. ^If [foreign key constraints] are enabled, it is
+** not possible to open a column that is part of a [child key] for writing.
**
** Note that the database name is not the filename that contains
** the database but rather the symbolic name of the database that
** is assigned when the database is connected using [ATTACH].
-** For the main database file, the database name is "main". For
-** TEMP tables, the database name is "temp".
-**
-** On success, [SQLITE_OK] is returned and the new
-** [sqlite3_blob | blob handle] is written to *ppBlob.
-** Otherwise an error code is returned and
-** any value written to *ppBlob should not be used by the caller.
-** This function sets the database-handle error code and message
-** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()].
-**
-** INVARIANTS:
-**
-** {F17813} A successful invocation of the [sqlite3_blob_open(D,B,T,C,R,F,P)]
-** interface opens an [sqlite3_blob] object P on the blob
-** in column C of table T in database B on [database connection] D.
-**
-** {F17814} A successful invocation of [sqlite3_blob_open(D,...)] starts
-** a new transaction on [database connection] D if that connection
-** is not already in a transaction.
-**
-** {F17816} The [sqlite3_blob_open(D,B,T,C,R,F,P)] interface opens the blob
-** for read and write access if and only if the F parameter
-** is non-zero.
-**
-** {F17819} The [sqlite3_blob_open()] interface returns [SQLITE_OK] on
-** success and an appropriate [error code] on failure.
-**
-** {F17821} If an error occurs during evaluation of [sqlite3_blob_open(D,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error.
+** For the main database file, the database name is "main".
+** For TEMP tables, the database name is "temp".
+**
+** On success, [SQLITE_OK] is returned and the new [BLOB handle] is written
+** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set
+** to be a null pointer.
+** This function sets the [database connection] error code and message
+** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related
+** functions. Note that the *ppBlob variable is always initialized in a
+** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob
+** regardless of the success or failure of this routine.
+**
+** If the row that a BLOB handle points to is modified by an
+** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects
+** then the BLOB handle is marked as "expired".
+** This is true if any column of the row is changed, even a column
+** other than the one the BLOB handle is open on.
+** Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for
+** a expired BLOB handle fail with an return code of [SQLITE_ABORT].
+** Changes written into a BLOB prior to the BLOB expiring are not
+** rollback by the expiration of the BLOB. Such changes will eventually
+** commit if the transaction continues to completion.
+**
+** Use the [sqlite3_blob_bytes()] interface to determine the size of
+** the opened blob. The size of a blob may not be changed by this
+** interface. Use the [UPDATE] SQL command to change the size of a
+** blob.
+**
+** The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces
+** and the built-in [zeroblob] SQL function can be used, if desired,
+** to create an empty, zero-filled blob in which to read or write using
+** this interface.
+**
+** To avoid a resource leak, every open [BLOB handle] should eventually
+** be released by a call to [sqlite3_blob_close()].
+**
+** Requirements:
+** [H17813] [H17814] [H17816] [H17819] [H17821] [H17824]
*/
SQLITE_API int sqlite3_blob_open(
sqlite3*,
@@ -5596,158 +5108,125 @@ SQLITE_API int sqlite3_blob_open(
);
/*
-** CAPI3REF: Close A BLOB Handle {F17830}
+** CAPI3REF: Close A BLOB Handle {H17830} <S30230>
**
-** Close an open [sqlite3_blob | blob handle].
+** Closes an open [BLOB handle].
**
** Closing a BLOB shall cause the current transaction to commit
** if there are no other BLOBs, no pending prepared statements, and the
-** database connection is in autocommit mode.
+** database connection is in [autocommit mode].
** If any writes were made to the BLOB, they might be held in cache
-** until the close operation if they will fit. {END}
+** until the close operation if they will fit.
+**
** Closing the BLOB often forces the changes
** out to disk and so if any I/O errors occur, they will likely occur
-** at the time when the BLOB is closed. {F17833} Any errors that occur during
+** at the time when the BLOB is closed. Any errors that occur during
** closing are reported as a non-zero return value.
**
** The BLOB is closed unconditionally. Even if this routine returns
** an error code, the BLOB is still closed.
**
-** INVARIANTS:
+** Calling this routine with a null pointer (which as would be returned
+** by failed call to [sqlite3_blob_open()]) is a harmless no-op.
**
-** {F17833} The [sqlite3_blob_close(P)] interface closes an
-** [sqlite3_blob] object P previously opened using
-** [sqlite3_blob_open()].
-**
-** {F17836} Closing an [sqlite3_blob] object using
-** [sqlite3_blob_close()] shall cause the current transaction to
-** commit if there are no other open [sqlite3_blob] objects
-** or [prepared statements] on the same [database connection] and
-** the [database connection] is in
-** [sqlite3_get_autocommit | autocommit mode].
-**
-** {F17839} The [sqlite3_blob_close(P)] interfaces closes the
-** [sqlite3_blob] object P unconditionally, even if
-** [sqlite3_blob_close(P)] returns something other than [SQLITE_OK].
-**
+** Requirements:
+** [H17833] [H17836] [H17839]
*/
SQLITE_API int sqlite3_blob_close(sqlite3_blob *);
/*
-** CAPI3REF: Return The Size Of An Open BLOB {F17840}
+** CAPI3REF: Return The Size Of An Open BLOB {H17840} <S30230>
**
-** Return the size in bytes of the blob accessible via the open
-** [sqlite3_blob] object in its only argument.
+** Returns the size in bytes of the BLOB accessible via the
+** successfully opened [BLOB handle] in its only argument. The
+** incremental blob I/O routines can only read or overwriting existing
+** blob content; they cannot change the size of a blob.
**
-** INVARIANTS:
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17843} The [sqlite3_blob_bytes(P)] interface returns the size
-** in bytes of the BLOB that the [sqlite3_blob] object P
-** refers to.
+** Requirements:
+** [H17843]
*/
SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *);
/*
-** CAPI3REF: Read Data From A BLOB Incrementally {F17850}
+** CAPI3REF: Read Data From A BLOB Incrementally {H17850} <S30230>
**
-** This function is used to read data from an open
-** [sqlite3_blob | blob-handle] into a caller supplied buffer.
-** N bytes of data are copied into buffer
-** Z from the open blob, starting at offset iOffset.
+** This function is used to read data from an open [BLOB handle] into a
+** caller-supplied buffer. N bytes of data are copied into buffer Z
+** from the open BLOB, starting at offset iOffset.
**
-** If offset iOffset is less than N bytes from the end of the blob,
+** If offset iOffset is less than N bytes from the end of the BLOB,
** [SQLITE_ERROR] is returned and no data is read. If N or iOffset is
-** less than zero [SQLITE_ERROR] is returned and no data is read.
-**
-** On success, SQLITE_OK is returned. Otherwise, an
-** [error code] or an [extended error code] is returned.
+** less than zero, [SQLITE_ERROR] is returned and no data is read.
+** The size of the blob (and hence the maximum value of N+iOffset)
+** can be determined using the [sqlite3_blob_bytes()] interface.
**
-** INVARIANTS:
+** An attempt to read from an expired [BLOB handle] fails with an
+** error code of [SQLITE_ABORT].
**
-** {F17853} The [sqlite3_blob_read(P,Z,N,X)] interface reads N bytes
-** beginning at offset X from
-** the blob that [sqlite3_blob] object P refers to
-** and writes those N bytes into buffer Z.
+** On success, SQLITE_OK is returned.
+** Otherwise, an [error code] or an [extended error code] is returned.
**
-** {F17856} In [sqlite3_blob_read(P,Z,N,X)] if the size of the blob
-** is less than N+X bytes, then the function returns [SQLITE_ERROR]
-** and nothing is read from the blob.
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17859} In [sqlite3_blob_read(P,Z,N,X)] if X or N is less than zero
-** then the function returns [SQLITE_ERROR]
-** and nothing is read from the blob.
+** See also: [sqlite3_blob_write()].
**
-** {F17862} The [sqlite3_blob_read(P,Z,N,X)] interface returns [SQLITE_OK]
-** if N bytes where successfully read into buffer Z.
-**
-** {F17865} If the requested read could not be completed,
-** the [sqlite3_blob_read(P,Z,N,X)] interface returns an
-** appropriate [error code] or [extended error code].
-**
-** {F17868} If an error occurs during evaluation of [sqlite3_blob_read(P,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error, where D is the
-** database handle that was used to open blob handle P.
+** Requirements:
+** [H17853] [H17856] [H17859] [H17862] [H17863] [H17865] [H17868]
*/
SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset);
/*
-** CAPI3REF: Write Data Into A BLOB Incrementally {F17870}
+** CAPI3REF: Write Data Into A BLOB Incrementally {H17870} <S30230>
**
-** This function is used to write data into an open
-** [sqlite3_blob | blob-handle] from a user supplied buffer.
-** n bytes of data are copied from the buffer
-** pointed to by z into the open blob, starting at offset iOffset.
+** This function is used to write data into an open [BLOB handle] from a
+** caller-supplied buffer. N bytes of data are copied from the buffer Z
+** into the open BLOB, starting at offset iOffset.
**
-** If the [sqlite3_blob | blob-handle] passed as the first argument
-** was not opened for writing (the flags parameter to [sqlite3_blob_open()]
-*** was zero), this function returns [SQLITE_READONLY].
+** If the [BLOB handle] passed as the first argument was not opened for
+** writing (the flags parameter to [sqlite3_blob_open()] was zero),
+** this function returns [SQLITE_READONLY].
**
-** This function may only modify the contents of the blob; it is
-** not possible to increase the size of a blob using this API.
-** If offset iOffset is less than n bytes from the end of the blob,
-** [SQLITE_ERROR] is returned and no data is written. If n is
+** This function may only modify the contents of the BLOB; it is
+** not possible to increase the size of a BLOB using this API.
+** If offset iOffset is less than N bytes from the end of the BLOB,
+** [SQLITE_ERROR] is returned and no data is written. If N is
** less than zero [SQLITE_ERROR] is returned and no data is written.
+** The size of the BLOB (and hence the maximum value of N+iOffset)
+** can be determined using the [sqlite3_blob_bytes()] interface.
**
-** On success, SQLITE_OK is returned. Otherwise, an
-** [error code] or an [extended error code] is returned.
-**
-** INVARIANTS:
+** An attempt to write to an expired [BLOB handle] fails with an
+** error code of [SQLITE_ABORT]. Writes to the BLOB that occurred
+** before the [BLOB handle] expired are not rolled back by the
+** expiration of the handle, though of course those changes might
+** have been overwritten by the statement that expired the BLOB handle
+** or by other independent statements.
**
-** {F17873} The [sqlite3_blob_write(P,Z,N,X)] interface writes N bytes
-** from buffer Z into
-** the blob that [sqlite3_blob] object P refers to
-** beginning at an offset of X into the blob.
+** On success, SQLITE_OK is returned.
+** Otherwise, an [error code] or an [extended error code] is returned.
**
-** {F17875} The [sqlite3_blob_write(P,Z,N,X)] interface returns
-** [SQLITE_READONLY] if the [sqlite3_blob] object P was
-** [sqlite3_blob_open | opened] for reading only.
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17876} In [sqlite3_blob_write(P,Z,N,X)] if the size of the blob
-** is less than N+X bytes, then the function returns [SQLITE_ERROR]
-** and nothing is written into the blob.
+** See also: [sqlite3_blob_read()].
**
-** {F17879} In [sqlite3_blob_write(P,Z,N,X)] if X or N is less than zero
-** then the function returns [SQLITE_ERROR]
-** and nothing is written into the blob.
-**
-** {F17882} The [sqlite3_blob_write(P,Z,N,X)] interface returns [SQLITE_OK]
-** if N bytes where successfully written into blob.
-**
-** {F17885} If the requested write could not be completed,
-** the [sqlite3_blob_write(P,Z,N,X)] interface returns an
-** appropriate [error code] or [extended error code].
-**
-** {F17888} If an error occurs during evaluation of [sqlite3_blob_write(D,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error.
+** Requirements:
+** [H17873] [H17874] [H17875] [H17876] [H17877] [H17879] [H17882] [H17885]
+** [H17888]
*/
SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
/*
-** CAPI3REF: Virtual File System Objects {F11200}
+** CAPI3REF: Virtual File System Objects {H11200} <S20100>
**
** A virtual filesystem (VFS) is an [sqlite3_vfs] object
** that SQLite uses to interact
@@ -5756,12 +5235,11 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOff
** New VFSes can be registered and existing VFSes can be unregistered.
** The following interfaces are provided.
**
-** The sqlite3_vfs_find() interface returns a pointer to
-** a VFS given its name. Names are case sensitive.
+** The sqlite3_vfs_find() interface returns a pointer to a VFS given its name.
+** Names are case sensitive.
** Names are zero-terminated UTF-8 strings.
-** If there is no match, a NULL
-** pointer is returned. If zVfsName is NULL then the default
-** VFS is returned.
+** If there is no match, a NULL pointer is returned.
+** If zVfsName is NULL then the default VFS is returned.
**
** New VFSes are registered with sqlite3_vfs_register().
** Each new VFS becomes the default VFS if the makeDflt flag is set.
@@ -5771,51 +5249,27 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOff
** same name are registered, the behavior is undefined. If a
** VFS is registered with a name that is NULL or an empty string,
** then the behavior is undefined.
-**
+**
** Unregister a VFS with the sqlite3_vfs_unregister() interface.
** If the default VFS is unregistered, another VFS is chosen as
** the default. The choice for the new VFS is arbitrary.
**
-** INVARIANTS:
-**
-** {F11203} The [sqlite3_vfs_find(N)] interface returns a pointer to the
-** registered [sqlite3_vfs] object whose name exactly matches
-** the zero-terminated UTF-8 string N, or it returns NULL if
-** there is no match.
-**
-** {F11206} If the N parameter to [sqlite3_vfs_find(N)] is NULL then
-** the function returns a pointer to the default [sqlite3_vfs]
-** object if there is one, or NULL if there is no default
-** [sqlite3_vfs] object.
-**
-** {F11209} The [sqlite3_vfs_register(P,F)] interface registers the
-** well-formed [sqlite3_vfs] object P using the name given
-** by the zName field of the object.
-**
-** {F11212} Using the [sqlite3_vfs_register(P,F)] interface to register
-** the same [sqlite3_vfs] object multiple times is a harmless no-op.
-**
-** {F11215} The [sqlite3_vfs_register(P,F)] interface makes the
-** the [sqlite3_vfs] object P the default [sqlite3_vfs] object
-** if F is non-zero.
-**
-** {F11218} The [sqlite3_vfs_unregister(P)] interface unregisters the
-** [sqlite3_vfs] object P so that it is no longer returned by
-** subsequent calls to [sqlite3_vfs_find()].
+** Requirements:
+** [H11203] [H11206] [H11209] [H11212] [H11215] [H11218]
*/
SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName);
SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt);
SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
/*
-** CAPI3REF: Mutexes {F17000}
+** CAPI3REF: Mutexes {H17000} <S20000>
**
** The SQLite core uses these routines for thread
-** synchronization. Though they are intended for internal
+** synchronization. Though they are intended for internal
** use by SQLite, code that links against SQLite is
** permitted to use any of these routines.
**
-** The SQLite source code contains multiple implementations
+** The SQLite source code contains multiple implementations
** of these mutex routines. An appropriate implementation
** is selected automatically at compile-time. The following
** implementations are available in the SQLite core:
@@ -5827,25 +5281,24 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
** <li> SQLITE_MUTEX_NOOP
** </ul>
**
-** The SQLITE_MUTEX_NOOP implementation is a set of routines
-** that does no real locking and is appropriate for use in
+** The SQLITE_MUTEX_NOOP implementation is a set of routines
+** that does no real locking and is appropriate for use in
** a single-threaded application. The SQLITE_MUTEX_OS2,
** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations
-** are appropriate for use on os/2, unix, and windows.
-**
+** are appropriate for use on OS/2, Unix, and Windows.
+**
** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor
** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex
-** implementation is included with the library. The
-** mutex interface routines defined here become external
-** references in the SQLite library for which implementations
-** must be provided by the application. This facility allows an
-** application that links against SQLite to provide its own mutex
-** implementation without having to modify the SQLite core.
-**
-** {F17011} The sqlite3_mutex_alloc() routine allocates a new
-** mutex and returns a pointer to it. {F17012} If it returns NULL
-** that means that a mutex could not be allocated. {F17013} SQLite
-** will unwind its stack and return an error. {F17014} The argument
+** implementation is included with the library. In this case the
+** application must supply a custom mutex implementation using the
+** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function
+** before calling sqlite3_initialize() or any other public sqlite3_
+** function that calls sqlite3_initialize().
+**
+** {H17011} The sqlite3_mutex_alloc() routine allocates a new
+** mutex and returns a pointer to it. {H17012} If it returns NULL
+** that means that a mutex could not be allocated. {H17013} SQLite
+** will unwind its stack and return an error. {H17014} The argument
** to sqlite3_mutex_alloc() is one of these integer constants:
**
** <ul>
@@ -5857,63 +5310,67 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
** <li> SQLITE_MUTEX_STATIC_PRNG
** <li> SQLITE_MUTEX_STATIC_LRU
** <li> SQLITE_MUTEX_STATIC_LRU2
-** </ul> {END}
+** </ul>
**
-** {F17015} The first two constants cause sqlite3_mutex_alloc() to create
+** {H17015} The first two constants cause sqlite3_mutex_alloc() to create
** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END}
** The mutex implementation does not need to make a distinction
** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
-** not want to. {F17016} But SQLite will only request a recursive mutex in
+** not want to. {H17016} But SQLite will only request a recursive mutex in
** cases where it really needs one. {END} If a faster non-recursive mutex
** implementation is available on the host platform, the mutex subsystem
** might return such a mutex in response to SQLITE_MUTEX_FAST.
**
-** {F17017} The other allowed parameters to sqlite3_mutex_alloc() each return
-** a pointer to a static preexisting mutex. {END} Four static mutexes are
+** {H17017} The other allowed parameters to sqlite3_mutex_alloc() each return
+** a pointer to a static preexisting mutex. {END} Six static mutexes are
** used by the current version of SQLite. Future versions of SQLite
** may add additional static mutexes. Static mutexes are for internal
** use by SQLite only. Applications that use SQLite mutexes should
** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
** SQLITE_MUTEX_RECURSIVE.
**
-** {F17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
+** {H17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
-** returns a different mutex on every call. {F17034} But for the static
+** returns a different mutex on every call. {H17034} But for the static
** mutex types, the same mutex is returned on every call that has
-** the same type number. {END}
+** the same type number.
**
-** {F17019} The sqlite3_mutex_free() routine deallocates a previously
-** allocated dynamic mutex. {F17020} SQLite is careful to deallocate every
-** dynamic mutex that it allocates. {U17021} The dynamic mutexes must not be in
-** use when they are deallocated. {U17022} Attempting to deallocate a static
-** mutex results in undefined behavior. {F17023} SQLite never deallocates
+** {H17019} The sqlite3_mutex_free() routine deallocates a previously
+** allocated dynamic mutex. {H17020} SQLite is careful to deallocate every
+** dynamic mutex that it allocates. {A17021} The dynamic mutexes must not be in
+** use when they are deallocated. {A17022} Attempting to deallocate a static
+** mutex results in undefined behavior. {H17023} SQLite never deallocates
** a static mutex. {END}
**
** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
-** to enter a mutex. {F17024} If another thread is already within the mutex,
+** to enter a mutex. {H17024} If another thread is already within the mutex,
** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
-** SQLITE_BUSY. {F17025} The sqlite3_mutex_try() interface returns SQLITE_OK
-** upon successful entry. {F17026} Mutexes created using
+** SQLITE_BUSY. {H17025} The sqlite3_mutex_try() interface returns [SQLITE_OK]
+** upon successful entry. {H17026} Mutexes created using
** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread.
-** {F17027} In such cases the,
+** {H17027} In such cases the,
** mutex must be exited an equal number of times before another thread
-** can enter. {U17028} If the same thread tries to enter any other
+** can enter. {A17028} If the same thread tries to enter any other
** kind of mutex more than once, the behavior is undefined.
-** {F17029} SQLite will never exhibit
-** such behavior in its own use of mutexes. {END}
+** {H17029} SQLite will never exhibit
+** such behavior in its own use of mutexes.
**
-** Some systems (ex: windows95) do not the operation implemented by
-** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will
-** always return SQLITE_BUSY. {F17030} The SQLite core only ever uses
-** sqlite3_mutex_try() as an optimization so this is acceptable behavior. {END}
+** Some systems (for example, Windows 95) do not support the operation
+** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try()
+** will always return SQLITE_BUSY. {H17030} The SQLite core only ever uses
+** sqlite3_mutex_try() as an optimization so this is acceptable behavior.
**
-** {F17031} The sqlite3_mutex_leave() routine exits a mutex that was
-** previously entered by the same thread. {U17032} The behavior
+** {H17031} The sqlite3_mutex_leave() routine exits a mutex that was
+** previously entered by the same thread. {A17032} The behavior
** is undefined if the mutex is not currently entered by the
-** calling thread or is not currently allocated. {F17033} SQLite will
+** calling thread or is not currently allocated. {H17033} SQLite will
** never do either. {END}
**
+** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
+** sqlite3_mutex_leave() is a NULL pointer, then all three routines
+** behave as no-ops.
+**
** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
*/
SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int);
@@ -5923,73 +5380,166 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*);
SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*);
/*
-** CAPI3REF: Mutex Verifcation Routines {F17080}
+** CAPI3REF: Mutex Methods Object {H17120} <S20130>
+** EXPERIMENTAL
+**
+** An instance of this structure defines the low-level routines
+** used to allocate and use mutexes.
+**
+** Usually, the default mutex implementations provided by SQLite are
+** sufficient, however the user has the option of substituting a custom
+** implementation for specialized deployments or systems for which SQLite
+** does not provide a suitable implementation. In this case, the user
+** creates and populates an instance of this structure to pass
+** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option.
+** Additionally, an instance of this structure can be used as an
+** output variable when querying the system for the current mutex
+** implementation, using the [SQLITE_CONFIG_GETMUTEX] option.
+**
+** The xMutexInit method defined by this structure is invoked as
+** part of system initialization by the sqlite3_initialize() function.
+** {H17001} The xMutexInit routine shall be called by SQLite once for each
+** effective call to [sqlite3_initialize()].
+**
+** The xMutexEnd method defined by this structure is invoked as
+** part of system shutdown by the sqlite3_shutdown() function. The
+** implementation of this method is expected to release all outstanding
+** resources obtained by the mutex methods implementation, especially
+** those obtained by the xMutexInit method. {H17003} The xMutexEnd()
+** interface shall be invoked once for each call to [sqlite3_shutdown()].
+**
+** The remaining seven methods defined by this structure (xMutexAlloc,
+** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and
+** xMutexNotheld) implement the following interfaces (respectively):
+**
+** <ul>
+** <li> [sqlite3_mutex_alloc()] </li>
+** <li> [sqlite3_mutex_free()] </li>
+** <li> [sqlite3_mutex_enter()] </li>
+** <li> [sqlite3_mutex_try()] </li>
+** <li> [sqlite3_mutex_leave()] </li>
+** <li> [sqlite3_mutex_held()] </li>
+** <li> [sqlite3_mutex_notheld()] </li>
+** </ul>
+**
+** The only difference is that the public sqlite3_XXX functions enumerated
+** above silently ignore any invocations that pass a NULL pointer instead
+** of a valid mutex handle. The implementations of the methods defined
+** by this structure are not required to handle this case, the results
+** of passing a NULL pointer instead of a valid mutex handle are undefined
+** (i.e. it is acceptable to provide an implementation that segfaults if
+** it is passed a NULL pointer).
+**
+** The xMutexInit() method must be threadsafe. It must be harmless to
+** invoke xMutexInit() mutiple times within the same process and without
+** intervening calls to xMutexEnd(). Second and subsequent calls to
+** xMutexInit() must be no-ops.
+**
+** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()]
+** and its associates). Similarly, xMutexAlloc() must not use SQLite memory
+** allocation for a static mutex. However xMutexAlloc() may use SQLite
+** memory allocation for a fast or recursive mutex.
+**
+** SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is
+** called, but only if the prior call to xMutexInit returned SQLITE_OK.
+** If xMutexInit fails in any way, it is expected to clean up after itself
+** prior to returning.
+*/
+typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
+struct sqlite3_mutex_methods {
+ int (*xMutexInit)(void);
+ int (*xMutexEnd)(void);
+ sqlite3_mutex *(*xMutexAlloc)(int);
+ void (*xMutexFree)(sqlite3_mutex *);
+ void (*xMutexEnter)(sqlite3_mutex *);
+ int (*xMutexTry)(sqlite3_mutex *);
+ void (*xMutexLeave)(sqlite3_mutex *);
+ int (*xMutexHeld)(sqlite3_mutex *);
+ int (*xMutexNotheld)(sqlite3_mutex *);
+};
+
+/*
+** CAPI3REF: Mutex Verification Routines {H17080} <S20130> <S30800>
**
** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines
-** are intended for use inside assert() statements. {F17081} The SQLite core
+** are intended for use inside assert() statements. {H17081} The SQLite core
** never uses these routines except inside an assert() and applications
-** are advised to follow the lead of the core. {F17082} The core only
+** are advised to follow the lead of the core. {H17082} The core only
** provides implementations for these routines when it is compiled
-** with the SQLITE_DEBUG flag. {U17087} External mutex implementations
+** with the SQLITE_DEBUG flag. {A17087} External mutex implementations
** are only required to provide these routines if SQLITE_DEBUG is
** defined and if NDEBUG is not defined.
**
-** {F17083} These routines should return true if the mutex in their argument
-** is held or not held, respectively, by the calling thread. {END}
+** {H17083} These routines should return true if the mutex in their argument
+** is held or not held, respectively, by the calling thread.
**
** {X17084} The implementation is not required to provided versions of these
-** routines that actually work.
-** If the implementation does not provide working
-** versions of these routines, it should at least provide stubs
-** that always return true so that one does not get spurious
-** assertion failures. {END}
+** routines that actually work. If the implementation does not provide working
+** versions of these routines, it should at least provide stubs that always
+** return true so that one does not get spurious assertion failures.
**
-** {F17085} If the argument to sqlite3_mutex_held() is a NULL pointer then
+** {H17085} If the argument to sqlite3_mutex_held() is a NULL pointer then
** the routine should return 1. {END} This seems counter-intuitive since
** clearly the mutex cannot be held if it does not exist. But the
** the reason the mutex does not exist is because the build is not
** using mutexes. And we do not want the assert() containing the
** call to sqlite3_mutex_held() to fail, so a non-zero return is
-** the appropriate thing to do. {F17086} The sqlite3_mutex_notheld()
+** the appropriate thing to do. {H17086} The sqlite3_mutex_notheld()
** interface should also return 1 when given a NULL pointer.
*/
SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*);
SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
/*
-** CAPI3REF: Mutex Types {F17001}
+** CAPI3REF: Mutex Types {H17001} <H17000>
**
-** {F17002} The [sqlite3_mutex_alloc()] interface takes a single argument
-** which is one of these integer constants. {END}
+** The [sqlite3_mutex_alloc()] interface takes a single argument
+** which is one of these integer constants.
+**
+** The set of static mutexes may change from one SQLite release to the
+** next. Applications that override the built-in mutex logic must be
+** prepared to accommodate additional static mutexes.
*/
#define SQLITE_MUTEX_FAST 0
#define SQLITE_MUTEX_RECURSIVE 1
#define SQLITE_MUTEX_STATIC_MASTER 2
#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */
-#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */
+#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */
+#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */
#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */
#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */
#define SQLITE_MUTEX_STATIC_LRU2 7 /* lru page list */
/*
-** CAPI3REF: Low-Level Control Of Database Files {F11300}
+** CAPI3REF: Retrieve the mutex for a database connection {H17002} <H17000>
+**
+** This interface returns a pointer the [sqlite3_mutex] object that
+** serializes access to the [database connection] given in the argument
+** when the [threading mode] is Serialized.
+** If the [threading mode] is Single-thread or Multi-thread then this
+** routine returns a NULL pointer.
+*/
+SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
+
+/*
+** CAPI3REF: Low-Level Control Of Database Files {H11300} <S30800>
**
-** {F11301} The [sqlite3_file_control()] interface makes a direct call to the
+** {H11301} The [sqlite3_file_control()] interface makes a direct call to the
** xFileControl method for the [sqlite3_io_methods] object associated
-** with a particular database identified by the second argument. {F11302} The
+** with a particular database identified by the second argument. {H11302} The
** name of the database is the name assigned to the database by the
** <a href="lang_attach.html">ATTACH</a> SQL command that opened the
-** database. {F11303} To control the main database file, use the name "main"
-** or a NULL pointer. {F11304} The third and fourth parameters to this routine
+** database. {H11303} To control the main database file, use the name "main"
+** or a NULL pointer. {H11304} The third and fourth parameters to this routine
** are passed directly through to the second and third parameters of
-** the xFileControl method. {F11305} The return value of the xFileControl
+** the xFileControl method. {H11305} The return value of the xFileControl
** method becomes the return value of this routine.
**
-** {F11306} If the second parameter (zDbName) does not match the name of any
-** open database file, then SQLITE_ERROR is returned. {F11307} This error
+** {H11306} If the second parameter (zDbName) does not match the name of any
+** open database file, then SQLITE_ERROR is returned. {H11307} This error
** code is not remembered and will not be recalled by [sqlite3_errcode()]
-** or [sqlite3_errmsg()]. {U11308} The underlying xFileControl method might
-** also return SQLITE_ERROR. {U11309} There is no way to distinguish between
+** or [sqlite3_errmsg()]. {A11308} The underlying xFileControl method might
+** also return SQLITE_ERROR. {A11309} There is no way to distinguish between
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method. {END}
**
@@ -5998,11 +5548,11 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
/*
-** CAPI3REF: Testing Interface {F11400}
+** CAPI3REF: Testing Interface {H11400} <S30800>
**
** The sqlite3_test_control() interface is used to read out internal
** state of SQLite and to inject faults into SQLite for testing
-** purposes. The first parameter a operation code that determines
+** purposes. The first parameter is an operation code that determines
** the number, meaning, and operation of all subsequent parameters.
**
** This interface is not for use by applications. It exists solely
@@ -6017,27 +5567,727 @@ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*
SQLITE_API int sqlite3_test_control(int op, ...);
/*
-** CAPI3REF: Testing Interface Operation Codes {F11410}
+** CAPI3REF: Testing Interface Operation Codes {H11410} <H11400>
**
** These constants are the valid operation code parameters used
** as the first argument to [sqlite3_test_control()].
**
-** These parameters and their meansing are subject to change
+** These parameters and their meanings are subject to change
** without notice. These values are for testing purposes only.
** Applications should not use any of these parameters or the
** [sqlite3_test_control()] interface.
*/
-#define SQLITE_TESTCTRL_FAULT_CONFIG 1
-#define SQLITE_TESTCTRL_FAULT_FAILURES 2
-#define SQLITE_TESTCTRL_FAULT_BENIGN_FAILURES 3
-#define SQLITE_TESTCTRL_FAULT_PENDING 4
#define SQLITE_TESTCTRL_PRNG_SAVE 5
#define SQLITE_TESTCTRL_PRNG_RESTORE 6
#define SQLITE_TESTCTRL_PRNG_RESET 7
#define SQLITE_TESTCTRL_BITVEC_TEST 8
+#define SQLITE_TESTCTRL_FAULT_INSTALL 9
+#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10
+#define SQLITE_TESTCTRL_PENDING_BYTE 11
+#define SQLITE_TESTCTRL_ASSERT 12
+#define SQLITE_TESTCTRL_ALWAYS 13
+#define SQLITE_TESTCTRL_RESERVE 14
+
+/*
+** CAPI3REF: SQLite Runtime Status {H17200} <S60200>
+** EXPERIMENTAL
+**
+** This interface is used to retrieve runtime status information
+** about the preformance of SQLite, and optionally to reset various
+** highwater marks. The first argument is an integer code for
+** the specific parameter to measure. Recognized integer codes
+** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].
+** The current value of the parameter is returned into *pCurrent.
+** The highest recorded value is returned in *pHighwater. If the
+** resetFlag is true, then the highest record value is reset after
+** *pHighwater is written. Some parameters do not record the highest
+** value. For those parameters
+** nothing is written into *pHighwater and the resetFlag is ignored.
+** Other parameters record only the highwater mark and not the current
+** value. For these latter parameters nothing is written into *pCurrent.
+**
+** This routine returns SQLITE_OK on success and a non-zero
+** [error code] on failure.
+**
+** This routine is threadsafe but is not atomic. This routine can be
+** called while other threads are running the same or different SQLite
+** interfaces. However the values returned in *pCurrent and
+** *pHighwater reflect the status of SQLite at different points in time
+** and it is possible that another thread might change the parameter
+** in between the times when *pCurrent and *pHighwater are written.
+**
+** See also: [sqlite3_db_status()]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag);
+
+
+/*
+** CAPI3REF: Status Parameters {H17250} <H17200>
+** EXPERIMENTAL
+**
+** These integer constants designate various run-time status parameters
+** that can be returned by [sqlite3_status()].
+**
+** <dl>
+** <dt>SQLITE_STATUS_MEMORY_USED</dt>
+** <dd>This parameter is the current amount of memory checked out
+** using [sqlite3_malloc()], either directly or indirectly. The
+** figure includes calls made to [sqlite3_malloc()] by the application
+** and internal memory usage by the SQLite library. Scratch memory
+** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache
+** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in
+** this parameter. The amount returned is the sum of the allocation
+** sizes as reported by the xSize method in [sqlite3_mem_methods].</dd>
+**
+** <dt>SQLITE_STATUS_MALLOC_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their
+** internal equivalents). Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_USED</dt>
+** <dd>This parameter returns the number of pages used out of the
+** [pagecache memory allocator] that was configured using
+** [SQLITE_CONFIG_PAGECACHE]. The
+** value returned is in pages, not in bytes.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_OVERFLOW</dt>
+** <dd>This parameter returns the number of bytes of page cache
+** allocation which could not be statisfied by the [SQLITE_CONFIG_PAGECACHE]
+** buffer and where forced to overflow to [sqlite3_malloc()]. The
+** returned value includes allocations that overflowed because they
+** where too large (they were larger than the "sz" parameter to
+** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because
+** no space was left in the page cache.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [pagecache memory allocator]. Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_USED</dt>
+** <dd>This parameter returns the number of allocations used out of the
+** [scratch memory allocator] configured using
+** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not
+** in bytes. Since a single thread may only have one scratch allocation
+** outstanding at time, this parameter also reports the number of threads
+** using scratch memory at the same time.</dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_OVERFLOW</dt>
+** <dd>This parameter returns the number of bytes of scratch memory
+** allocation which could not be statisfied by the [SQLITE_CONFIG_SCRATCH]
+** buffer and where forced to overflow to [sqlite3_malloc()]. The values
+** returned include overflows because the requested allocation was too
+** larger (that is, because the requested allocation was larger than the
+** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer
+** slots were available.
+** </dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [scratch memory allocator]. Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_PARSER_STACK</dt>
+** <dd>This parameter records the deepest parser stack. It is only
+** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>
+** </dl>
+**
+** New status parameters may be added from time to time.
+*/
+#define SQLITE_STATUS_MEMORY_USED 0
+#define SQLITE_STATUS_PAGECACHE_USED 1
+#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2
+#define SQLITE_STATUS_SCRATCH_USED 3
+#define SQLITE_STATUS_SCRATCH_OVERFLOW 4
+#define SQLITE_STATUS_MALLOC_SIZE 5
+#define SQLITE_STATUS_PARSER_STACK 6
+#define SQLITE_STATUS_PAGECACHE_SIZE 7
+#define SQLITE_STATUS_SCRATCH_SIZE 8
+
+/*
+** CAPI3REF: Database Connection Status {H17500} <S60200>
+** EXPERIMENTAL
+**
+** This interface is used to retrieve runtime status information
+** about a single [database connection]. The first argument is the
+** database connection object to be interrogated. The second argument
+** is the parameter to interrogate. Currently, the only allowed value
+** for the second parameter is [SQLITE_DBSTATUS_LOOKASIDE_USED].
+** Additional options will likely appear in future releases of SQLite.
+**
+** The current value of the requested parameter is written into *pCur
+** and the highest instantaneous value is written into *pHiwtr. If
+** the resetFlg is true, then the highest instantaneous value is
+** reset back down to the current value.
+**
+** See also: [sqlite3_status()] and [sqlite3_stmt_status()].
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg);
+
+/*
+** CAPI3REF: Status Parameters for database connections {H17520} <H17500>
+** EXPERIMENTAL
+**
+** These constants are the available integer "verbs" that can be passed as
+** the second argument to the [sqlite3_db_status()] interface.
+**
+** New verbs may be added in future releases of SQLite. Existing verbs
+** might be discontinued. Applications should check the return code from
+** [sqlite3_db_status()] to make sure that the call worked.
+** The [sqlite3_db_status()] interface will return a non-zero error code
+** if a discontinued or unsupported verb is invoked.
+**
+** <dl>
+** <dt>SQLITE_DBSTATUS_LOOKASIDE_USED</dt>
+** <dd>This parameter returns the number of lookaside memory slots currently
+** checked out.</dd>
+** </dl>
+*/
+#define SQLITE_DBSTATUS_LOOKASIDE_USED 0
/*
+** CAPI3REF: Prepared Statement Status {H17550} <S60200>
+** EXPERIMENTAL
+**
+** Each prepared statement maintains various
+** [SQLITE_STMTSTATUS_SORT | counters] that measure the number
+** of times it has performed specific operations. These counters can
+** be used to monitor the performance characteristics of the prepared
+** statements. For example, if the number of table steps greatly exceeds
+** the number of table searches or result rows, that would tend to indicate
+** that the prepared statement is using a full table scan rather than
+** an index.
+**
+** This interface is used to retrieve and reset counter values from
+** a [prepared statement]. The first argument is the prepared statement
+** object to be interrogated. The second argument
+** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter]
+** to be interrogated.
+** The current value of the requested counter is returned.
+** If the resetFlg is true, then the counter is reset to zero after this
+** interface call returns.
+**
+** See also: [sqlite3_status()] and [sqlite3_db_status()].
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
+
+/*
+** CAPI3REF: Status Parameters for prepared statements {H17570} <H17550>
+** EXPERIMENTAL
+**
+** These preprocessor macros define integer codes that name counter
+** values associated with the [sqlite3_stmt_status()] interface.
+** The meanings of the various counters are as follows:
+**
+** <dl>
+** <dt>SQLITE_STMTSTATUS_FULLSCAN_STEP</dt>
+** <dd>This is the number of times that SQLite has stepped forward in
+** a table as part of a full table scan. Large numbers for this counter
+** may indicate opportunities for performance improvement through
+** careful use of indices.</dd>
+**
+** <dt>SQLITE_STMTSTATUS_SORT</dt>
+** <dd>This is the number of sort operations that have occurred.
+** A non-zero value in this counter may indicate an opportunity to
+** improvement performance through careful use of indices.</dd>
+**
+** </dl>
+*/
+#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1
+#define SQLITE_STMTSTATUS_SORT 2
+
+/*
+** CAPI3REF: Custom Page Cache Object
+** EXPERIMENTAL
+**
+** The sqlite3_pcache type is opaque. It is implemented by
+** the pluggable module. The SQLite core has no knowledge of
+** its size or internal structure and never deals with the
+** sqlite3_pcache object except by holding and passing pointers
+** to the object.
+**
+** See [sqlite3_pcache_methods] for additional information.
+*/
+typedef struct sqlite3_pcache sqlite3_pcache;
+
+/*
+** CAPI3REF: Application Defined Page Cache.
+** KEYWORDS: {page cache}
+** EXPERIMENTAL
+**
+** The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can
+** register an alternative page cache implementation by passing in an
+** instance of the sqlite3_pcache_methods structure. The majority of the
+** heap memory used by SQLite is used by the page cache to cache data read
+** from, or ready to be written to, the database file. By implementing a
+** custom page cache using this API, an application can control more
+** precisely the amount of memory consumed by SQLite, the way in which
+** that memory is allocated and released, and the policies used to
+** determine exactly which parts of a database file are cached and for
+** how long.
+**
+** The contents of the sqlite3_pcache_methods structure are copied to an
+** internal buffer by SQLite within the call to [sqlite3_config]. Hence
+** the application may discard the parameter after the call to
+** [sqlite3_config()] returns.
+**
+** The xInit() method is called once for each call to [sqlite3_initialize()]
+** (usually only once during the lifetime of the process). It is passed
+** a copy of the sqlite3_pcache_methods.pArg value. It can be used to set
+** up global structures and mutexes required by the custom page cache
+** implementation.
+**
+** The xShutdown() method is called from within [sqlite3_shutdown()],
+** if the application invokes this API. It can be used to clean up
+** any outstanding resources before process shutdown, if required.
+**
+** SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes
+** the xInit method, so the xInit method need not be threadsafe. The
+** xShutdown method is only called from [sqlite3_shutdown()] so it does
+** not need to be threadsafe either. All other methods must be threadsafe
+** in multithreaded applications.
+**
+** SQLite will never invoke xInit() more than once without an intervening
+** call to xShutdown().
+**
+** The xCreate() method is used to construct a new cache instance. SQLite
+** will typically create one cache instance for each open database file,
+** though this is not guaranteed. The
+** first parameter, szPage, is the size in bytes of the pages that must
+** be allocated by the cache. szPage will not be a power of two. szPage
+** will the page size of the database file that is to be cached plus an
+** increment (here called "R") of about 100 or 200. SQLite will use the
+** extra R bytes on each page to store metadata about the underlying
+** database page on disk. The value of R depends
+** on the SQLite version, the target platform, and how SQLite was compiled.
+** R is constant for a particular build of SQLite. The second argument to
+** xCreate(), bPurgeable, is true if the cache being created will
+** be used to cache database pages of a file stored on disk, or
+** false if it is used for an in-memory database. The cache implementation
+** does not have to do anything special based with the value of bPurgeable;
+** it is purely advisory. On a cache where bPurgeable is false, SQLite will
+** never invoke xUnpin() except to deliberately delete a page.
+** In other words, a cache created with bPurgeable set to false will
+** never contain any unpinned pages.
+**
+** The xCachesize() method may be called at any time by SQLite to set the
+** suggested maximum cache-size (number of pages stored by) the cache
+** instance passed as the first argument. This is the value configured using
+** the SQLite "[PRAGMA cache_size]" command. As with the bPurgeable parameter,
+** the implementation is not required to do anything with this
+** value; it is advisory only.
+**
+** The xPagecount() method should return the number of pages currently
+** stored in the cache.
+**
+** The xFetch() method is used to fetch a page and return a pointer to it.
+** A 'page', in this context, is a buffer of szPage bytes aligned at an
+** 8-byte boundary. The page to be fetched is determined by the key. The
+** mimimum key value is 1. After it has been retrieved using xFetch, the page
+** is considered to be "pinned".
+**
+** If the requested page is already in the page cache, then the page cache
+** implementation must return a pointer to the page buffer with its content
+** intact. If the requested page is not already in the cache, then the
+** behavior of the cache implementation is determined by the value of the
+** createFlag parameter passed to xFetch, according to the following table:
+**
+** <table border=1 width=85% align=center>
+** <tr><th> createFlag <th> Behaviour when page is not already in cache
+** <tr><td> 0 <td> Do not allocate a new page. Return NULL.
+** <tr><td> 1 <td> Allocate a new page if it easy and convenient to do so.
+** Otherwise return NULL.
+** <tr><td> 2 <td> Make every effort to allocate a new page. Only return
+** NULL if allocating a new page is effectively impossible.
+** </table>
+**
+** SQLite will normally invoke xFetch() with a createFlag of 0 or 1. If
+** a call to xFetch() with createFlag==1 returns NULL, then SQLite will
+** attempt to unpin one or more cache pages by spilling the content of
+** pinned pages to disk and synching the operating system disk cache. After
+** attempting to unpin pages, the xFetch() method will be invoked again with
+** a createFlag of 2.
+**
+** xUnpin() is called by SQLite with a pointer to a currently pinned page
+** as its second argument. If the third parameter, discard, is non-zero,
+** then the page should be evicted from the cache. In this case SQLite
+** assumes that the next time the page is retrieved from the cache using
+** the xFetch() method, it will be zeroed. If the discard parameter is
+** zero, then the page is considered to be unpinned. The cache implementation
+** may choose to evict unpinned pages at any time.
+**
+** The cache is not required to perform any reference counting. A single
+** call to xUnpin() unpins the page regardless of the number of prior calls
+** to xFetch().
+**
+** The xRekey() method is used to change the key value associated with the
+** page passed as the second argument from oldKey to newKey. If the cache
+** previously contains an entry associated with newKey, it should be
+** discarded. Any prior cache entry associated with newKey is guaranteed not
+** to be pinned.
+**
+** When SQLite calls the xTruncate() method, the cache must discard all
+** existing cache entries with page numbers (keys) greater than or equal
+** to the value of the iLimit parameter passed to xTruncate(). If any
+** of these pages are pinned, they are implicitly unpinned, meaning that
+** they can be safely discarded.
+**
+** The xDestroy() method is used to delete a cache allocated by xCreate().
+** All resources associated with the specified cache should be freed. After
+** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*]
+** handle invalid, and will not use it with any other sqlite3_pcache_methods
+** functions.
+*/
+typedef struct sqlite3_pcache_methods sqlite3_pcache_methods;
+struct sqlite3_pcache_methods {
+ void *pArg;
+ int (*xInit)(void*);
+ void (*xShutdown)(void*);
+ sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable);
+ void (*xCachesize)(sqlite3_pcache*, int nCachesize);
+ int (*xPagecount)(sqlite3_pcache*);
+ void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag);
+ void (*xUnpin)(sqlite3_pcache*, void*, int discard);
+ void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey);
+ void (*xTruncate)(sqlite3_pcache*, unsigned iLimit);
+ void (*xDestroy)(sqlite3_pcache*);
+};
+
+/*
+** CAPI3REF: Online Backup Object
+** EXPERIMENTAL
+**
+** The sqlite3_backup object records state information about an ongoing
+** online backup operation. The sqlite3_backup object is created by
+** a call to [sqlite3_backup_init()] and is destroyed by a call to
+** [sqlite3_backup_finish()].
+**
+** See Also: [Using the SQLite Online Backup API]
+*/
+typedef struct sqlite3_backup sqlite3_backup;
+
+/*
+** CAPI3REF: Online Backup API.
+** EXPERIMENTAL
+**
+** This API is used to overwrite the contents of one database with that
+** of another. It is useful either for creating backups of databases or
+** for copying in-memory databases to or from persistent files.
+**
+** See Also: [Using the SQLite Online Backup API]
+**
+** Exclusive access is required to the destination database for the
+** duration of the operation. However the source database is only
+** read-locked while it is actually being read, it is not locked
+** continuously for the entire operation. Thus, the backup may be
+** performed on a live database without preventing other users from
+** writing to the database for an extended period of time.
+**
+** To perform a backup operation:
+** <ol>
+** <li><b>sqlite3_backup_init()</b> is called once to initialize the
+** backup,
+** <li><b>sqlite3_backup_step()</b> is called one or more times to transfer
+** the data between the two databases, and finally
+** <li><b>sqlite3_backup_finish()</b> is called to release all resources
+** associated with the backup operation.
+** </ol>
+** There should be exactly one call to sqlite3_backup_finish() for each
+** successful call to sqlite3_backup_init().
+**
+** <b>sqlite3_backup_init()</b>
+**
+** The first two arguments passed to [sqlite3_backup_init()] are the database
+** handle associated with the destination database and the database name
+** used to attach the destination database to the handle. The database name
+** is "main" for the main database, "temp" for the temporary database, or
+** the name specified as part of the [ATTACH] statement if the destination is
+** an attached database. The third and fourth arguments passed to
+** sqlite3_backup_init() identify the [database connection]
+** and database name used
+** to access the source database. The values passed for the source and
+** destination [database connection] parameters must not be the same.
+**
+** If an error occurs within sqlite3_backup_init(), then NULL is returned
+** and an error code and error message written into the [database connection]
+** passed as the first argument. They may be retrieved using the
+** [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] functions.
+** Otherwise, if successful, a pointer to an [sqlite3_backup] object is
+** returned. This pointer may be used with the sqlite3_backup_step() and
+** sqlite3_backup_finish() functions to perform the specified backup
+** operation.
+**
+** <b>sqlite3_backup_step()</b>
+**
+** Function [sqlite3_backup_step()] is used to copy up to nPage pages between
+** the source and destination databases, where nPage is the value of the
+** second parameter passed to sqlite3_backup_step(). If nPage is a negative
+** value, all remaining source pages are copied. If the required pages are
+** succesfully copied, but there are still more pages to copy before the
+** backup is complete, it returns [SQLITE_OK]. If no error occured and there
+** are no more pages to copy, then [SQLITE_DONE] is returned. If an error
+** occurs, then an SQLite error code is returned. As well as [SQLITE_OK] and
+** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY],
+** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code.
+**
+** As well as the case where the destination database file was opened for
+** read-only access, sqlite3_backup_step() may return [SQLITE_READONLY] if
+** the destination is an in-memory database with a different page size
+** from the source database.
+**
+** If sqlite3_backup_step() cannot obtain a required file-system lock, then
+** the [sqlite3_busy_handler | busy-handler function]
+** is invoked (if one is specified). If the
+** busy-handler returns non-zero before the lock is available, then
+** [SQLITE_BUSY] is returned to the caller. In this case the call to
+** sqlite3_backup_step() can be retried later. If the source
+** [database connection]
+** is being used to write to the source database when sqlite3_backup_step()
+** is called, then [SQLITE_LOCKED] is returned immediately. Again, in this
+** case the call to sqlite3_backup_step() can be retried later on. If
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or
+** [SQLITE_READONLY] is returned, then
+** there is no point in retrying the call to sqlite3_backup_step(). These
+** errors are considered fatal. At this point the application must accept
+** that the backup operation has failed and pass the backup operation handle
+** to the sqlite3_backup_finish() to release associated resources.
+**
+** Following the first call to sqlite3_backup_step(), an exclusive lock is
+** obtained on the destination file. It is not released until either
+** sqlite3_backup_finish() is called or the backup operation is complete
+** and sqlite3_backup_step() returns [SQLITE_DONE]. Additionally, each time
+** a call to sqlite3_backup_step() is made a [shared lock] is obtained on
+** the source database file. This lock is released before the
+** sqlite3_backup_step() call returns. Because the source database is not
+** locked between calls to sqlite3_backup_step(), it may be modified mid-way
+** through the backup procedure. If the source database is modified by an
+** external process or via a database connection other than the one being
+** used by the backup operation, then the backup will be transparently
+** restarted by the next call to sqlite3_backup_step(). If the source
+** database is modified by the using the same database connection as is used
+** by the backup operation, then the backup database is transparently
+** updated at the same time.
+**
+** <b>sqlite3_backup_finish()</b>
+**
+** Once sqlite3_backup_step() has returned [SQLITE_DONE], or when the
+** application wishes to abandon the backup operation, the [sqlite3_backup]
+** object should be passed to sqlite3_backup_finish(). This releases all
+** resources associated with the backup operation. If sqlite3_backup_step()
+** has not yet returned [SQLITE_DONE], then any active write-transaction on the
+** destination database is rolled back. The [sqlite3_backup] object is invalid
+** and may not be used following a call to sqlite3_backup_finish().
+**
+** The value returned by sqlite3_backup_finish is [SQLITE_OK] if no error
+** occurred, regardless or whether or not sqlite3_backup_step() was called
+** a sufficient number of times to complete the backup operation. Or, if
+** an out-of-memory condition or IO error occured during a call to
+** sqlite3_backup_step() then [SQLITE_NOMEM] or an
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] error code
+** is returned. In this case the error code and an error message are
+** written to the destination [database connection].
+**
+** A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() is
+** not a permanent error and does not affect the return value of
+** sqlite3_backup_finish().
+**
+** <b>sqlite3_backup_remaining(), sqlite3_backup_pagecount()</b>
+**
+** Each call to sqlite3_backup_step() sets two values stored internally
+** by an [sqlite3_backup] object. The number of pages still to be backed
+** up, which may be queried by sqlite3_backup_remaining(), and the total
+** number of pages in the source database file, which may be queried by
+** sqlite3_backup_pagecount().
+**
+** The values returned by these functions are only updated by
+** sqlite3_backup_step(). If the source database is modified during a backup
+** operation, then the values are not updated to account for any extra
+** pages that need to be updated or the size of the source database file
+** changing.
+**
+** <b>Concurrent Usage of Database Handles</b>
+**
+** The source [database connection] may be used by the application for other
+** purposes while a backup operation is underway or being initialized.
+** If SQLite is compiled and configured to support threadsafe database
+** connections, then the source database connection may be used concurrently
+** from within other threads.
+**
+** However, the application must guarantee that the destination database
+** connection handle is not passed to any other API (by any thread) after
+** sqlite3_backup_init() is called and before the corresponding call to
+** sqlite3_backup_finish(). Unfortunately SQLite does not currently check
+** for this, if the application does use the destination [database connection]
+** for some other purpose during a backup operation, things may appear to
+** work correctly but in fact be subtly malfunctioning. Use of the
+** destination database connection while a backup is in progress might
+** also cause a mutex deadlock.
+**
+** Furthermore, if running in [shared cache mode], the application must
+** guarantee that the shared cache used by the destination database
+** is not accessed while the backup is running. In practice this means
+** that the application must guarantee that the file-system file being
+** backed up to is not accessed by any connection within the process,
+** not just the specific connection that was passed to sqlite3_backup_init().
+**
+** The [sqlite3_backup] object itself is partially threadsafe. Multiple
+** threads may safely make multiple concurrent calls to sqlite3_backup_step().
+** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount()
+** APIs are not strictly speaking threadsafe. If they are invoked at the
+** same time as another thread is invoking sqlite3_backup_step() it is
+** possible that they return invalid values.
+*/
+SQLITE_API sqlite3_backup *sqlite3_backup_init(
+ sqlite3 *pDest, /* Destination database handle */
+ const char *zDestName, /* Destination database name */
+ sqlite3 *pSource, /* Source database handle */
+ const char *zSourceName /* Source database name */
+);
+SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage);
+SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p);
+SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p);
+SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p);
+
+/*
+** CAPI3REF: Unlock Notification
+** EXPERIMENTAL
+**
+** When running in shared-cache mode, a database operation may fail with
+** an [SQLITE_LOCKED] error if the required locks on the shared-cache or
+** individual tables within the shared-cache cannot be obtained. See
+** [SQLite Shared-Cache Mode] for a description of shared-cache locking.
+** This API may be used to register a callback that SQLite will invoke
+** when the connection currently holding the required lock relinquishes it.
+** This API is only available if the library was compiled with the
+** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined.
+**
+** See Also: [Using the SQLite Unlock Notification Feature].
+**
+** Shared-cache locks are released when a database connection concludes
+** its current transaction, either by committing it or rolling it back.
+**
+** When a connection (known as the blocked connection) fails to obtain a
+** shared-cache lock and SQLITE_LOCKED is returned to the caller, the
+** identity of the database connection (the blocking connection) that
+** has locked the required resource is stored internally. After an
+** application receives an SQLITE_LOCKED error, it may call the
+** sqlite3_unlock_notify() method with the blocked connection handle as
+** the first argument to register for a callback that will be invoked
+** when the blocking connections current transaction is concluded. The
+** callback is invoked from within the [sqlite3_step] or [sqlite3_close]
+** call that concludes the blocking connections transaction.
+**
+** If sqlite3_unlock_notify() is called in a multi-threaded application,
+** there is a chance that the blocking connection will have already
+** concluded its transaction by the time sqlite3_unlock_notify() is invoked.
+** If this happens, then the specified callback is invoked immediately,
+** from within the call to sqlite3_unlock_notify().
+**
+** If the blocked connection is attempting to obtain a write-lock on a
+** shared-cache table, and more than one other connection currently holds
+** a read-lock on the same table, then SQLite arbitrarily selects one of
+** the other connections to use as the blocking connection.
+**
+** There may be at most one unlock-notify callback registered by a
+** blocked connection. If sqlite3_unlock_notify() is called when the
+** blocked connection already has a registered unlock-notify callback,
+** then the new callback replaces the old. If sqlite3_unlock_notify() is
+** called with a NULL pointer as its second argument, then any existing
+** unlock-notify callback is cancelled. The blocked connections
+** unlock-notify callback may also be canceled by closing the blocked
+** connection using [sqlite3_close()].
+**
+** The unlock-notify callback is not reentrant. If an application invokes
+** any sqlite3_xxx API functions from within an unlock-notify callback, a
+** crash or deadlock may be the result.
+**
+** Unless deadlock is detected (see below), sqlite3_unlock_notify() always
+** returns SQLITE_OK.
+**
+** <b>Callback Invocation Details</b>
+**
+** When an unlock-notify callback is registered, the application provides a
+** single void* pointer that is passed to the callback when it is invoked.
+** However, the signature of the callback function allows SQLite to pass
+** it an array of void* context pointers. The first argument passed to
+** an unlock-notify callback is a pointer to an array of void* pointers,
+** and the second is the number of entries in the array.
+**
+** When a blocking connections transaction is concluded, there may be
+** more than one blocked connection that has registered for an unlock-notify
+** callback. If two or more such blocked connections have specified the
+** same callback function, then instead of invoking the callback function
+** multiple times, it is invoked once with the set of void* context pointers
+** specified by the blocked connections bundled together into an array.
+** This gives the application an opportunity to prioritize any actions
+** related to the set of unblocked database connections.
+**
+** <b>Deadlock Detection</b>
+**
+** Assuming that after registering for an unlock-notify callback a
+** database waits for the callback to be issued before taking any further
+** action (a reasonable assumption), then using this API may cause the
+** application to deadlock. For example, if connection X is waiting for
+** connection Y's transaction to be concluded, and similarly connection
+** Y is waiting on connection X's transaction, then neither connection
+** will proceed and the system may remain deadlocked indefinitely.
+**
+** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock
+** detection. If a given call to sqlite3_unlock_notify() would put the
+** system in a deadlocked state, then SQLITE_LOCKED is returned and no
+** unlock-notify callback is registered. The system is said to be in
+** a deadlocked state if connection A has registered for an unlock-notify
+** callback on the conclusion of connection B's transaction, and connection
+** B has itself registered for an unlock-notify callback when connection
+** A's transaction is concluded. Indirect deadlock is also detected, so
+** the system is also considered to be deadlocked if connection B has
+** registered for an unlock-notify callback on the conclusion of connection
+** C's transaction, where connection C is waiting on connection A. Any
+** number of levels of indirection are allowed.
+**
+** <b>The "DROP TABLE" Exception</b>
+**
+** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost
+** always appropriate to call sqlite3_unlock_notify(). There is however,
+** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement,
+** SQLite checks if there are any currently executing SELECT statements
+** that belong to the same connection. If there are, SQLITE_LOCKED is
+** returned. In this case there is no "blocking connection", so invoking
+** sqlite3_unlock_notify() results in the unlock-notify callback being
+** invoked immediately. If the application then re-attempts the "DROP TABLE"
+** or "DROP INDEX" query, an infinite loop might be the result.
+**
+** One way around this problem is to check the extended error code returned
+** by an sqlite3_step() call. If there is a blocking connection, then the
+** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in
+** the special "DROP TABLE/INDEX" case, the extended error code is just
+** SQLITE_LOCKED.
+*/
+SQLITE_API int sqlite3_unlock_notify(
+ sqlite3 *pBlocked, /* Waiting connection */
+ void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */
+ void *pNotifyArg /* Argument to pass to xNotify */
+);
+
+
+/*
+** CAPI3REF: String Comparison
+** EXPERIMENTAL
+**
+** The [sqlite3_strnicmp()] API allows applications and extensions to
+** compare the contents of two buffers containing UTF-8 strings in a
+** case-indendent fashion, using the same definition of case independence
+** that SQLite uses internally when comparing identifiers.
+*/
+SQLITE_API int sqlite3_strnicmp(const char *, const char *, int);
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -6050,6 +6300,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#endif
#endif
+
/************** End of sqlite3.h *********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
/************** Include hash.h in the middle of sqliteInt.h ******************/
@@ -6068,7 +6319,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
** This is the header file for the generic hash-table implemenation
** used in SQLite.
**
-** $Id: hash.h,v 1.11 2007/09/04 14:31:47 danielk1977 Exp $
+** $Id: hash.h,v 1.15 2009/05/02 13:29:38 drh Exp $
*/
#ifndef _SQLITE_HASH_H_
#define _SQLITE_HASH_H_
@@ -6081,19 +6332,30 @@ typedef struct HashElem HashElem;
** The internals of this structure are intended to be opaque -- client
** code should not attempt to access or modify the fields of this structure
** directly. Change this structure only by using the routines below.
-** However, many of the "procedures" and "functions" for modifying and
+** However, some of the "procedures" and "functions" for modifying and
** accessing this structure are really macros, so we can't really make
** this structure opaque.
+**
+** All elements of the hash table are on a single doubly-linked list.
+** Hash.first points to the head of this list.
+**
+** There are Hash.htsize buckets. Each bucket points to a spot in
+** the global doubly-linked list. The contents of the bucket are the
+** element pointed to plus the next _ht.count-1 elements in the list.
+**
+** Hash.htsize and Hash.ht may be zero. In that case lookup is done
+** by a linear search of the global list. For small tables, the
+** Hash.ht table is never allocated because if there are few elements
+** in the table, it is faster to do a linear search than to manage
+** the hash table.
*/
struct Hash {
- char keyClass; /* SQLITE_HASH_INT, _POINTER, _STRING, _BINARY */
- char copyKey; /* True if copy of key made on insert */
- int count; /* Number of entries in this table */
- int htsize; /* Number of buckets in the hash table */
- HashElem *first; /* The first element of the array */
- struct _ht { /* the hash table */
- int count; /* Number of entries with this hash */
- HashElem *chain; /* Pointer to first entry with this hash */
+ unsigned int htsize; /* Number of buckets in the hash table */
+ unsigned int count; /* Number of entries in this table */
+ HashElem *first; /* The first element of the array */
+ struct _ht { /* the hash table */
+ int count; /* Number of entries with this hash */
+ HashElem *chain; /* Pointer to first entry with this hash */
} *ht;
};
@@ -6104,40 +6366,17 @@ struct Hash {
** be opaque because it is used by macros.
*/
struct HashElem {
- HashElem *next, *prev; /* Next and previous elements in the table */
- void *data; /* Data associated with this element */
- void *pKey; int nKey; /* Key associated with this element */
+ HashElem *next, *prev; /* Next and previous elements in the table */
+ void *data; /* Data associated with this element */
+ const char *pKey; int nKey; /* Key associated with this element */
};
/*
-** There are 4 different modes of operation for a hash table:
-**
-** SQLITE_HASH_INT nKey is used as the key and pKey is ignored.
-**
-** SQLITE_HASH_POINTER pKey is used as the key and nKey is ignored.
-**
-** SQLITE_HASH_STRING pKey points to a string that is nKey bytes long
-** (including the null-terminator, if any). Case
-** is ignored in comparisons.
-**
-** SQLITE_HASH_BINARY pKey points to binary data nKey bytes long.
-** memcmp() is used to compare keys.
-**
-** A copy of the key is made for SQLITE_HASH_STRING and SQLITE_HASH_BINARY
-** if the copyKey parameter to HashInit is 1.
-*/
-/* #define SQLITE_HASH_INT 1 // NOT USED */
-/* #define SQLITE_HASH_POINTER 2 // NOT USED */
-#define SQLITE_HASH_STRING 3
-#define SQLITE_HASH_BINARY 4
-
-/*
** Access routines. To delete, insert a NULL pointer.
*/
-SQLITE_PRIVATE void sqlite3HashInit(Hash*, int keytype, int copyKey);
-SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const void *pKey, int nKey, void *pData);
-SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const void *pKey, int nKey);
-SQLITE_PRIVATE HashElem *sqlite3HashFindElem(const Hash*, const void *pKey, int nKey);
+SQLITE_PRIVATE void sqlite3HashInit(Hash*);
+SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData);
+SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey);
SQLITE_PRIVATE void sqlite3HashClear(Hash*);
/*
@@ -6155,13 +6394,13 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define sqliteHashFirst(H) ((H)->first)
#define sqliteHashNext(E) ((E)->next)
#define sqliteHashData(E) ((E)->data)
-#define sqliteHashKey(E) ((E)->pKey)
-#define sqliteHashKeysize(E) ((E)->nKey)
+/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */
+/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */
/*
** Number of entries in a hash table
*/
-#define sqliteHashCount(H) ((H)->count)
+/* #define sqliteHashCount(H) ((H)->count) // NOT USED */
#endif /* _SQLITE_HASH_H_ */
@@ -6181,146 +6420,151 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
#define TK_COMMIT 10
#define TK_END 11
#define TK_ROLLBACK 12
-#define TK_CREATE 13
-#define TK_TABLE 14
-#define TK_IF 15
-#define TK_NOT 16
-#define TK_EXISTS 17
-#define TK_TEMP 18
-#define TK_LP 19
-#define TK_RP 20
-#define TK_AS 21
-#define TK_COMMA 22
-#define TK_ID 23
-#define TK_ABORT 24
-#define TK_AFTER 25
-#define TK_ANALYZE 26
-#define TK_ASC 27
-#define TK_ATTACH 28
-#define TK_BEFORE 29
-#define TK_CASCADE 30
-#define TK_CAST 31
-#define TK_CONFLICT 32
-#define TK_DATABASE 33
-#define TK_DESC 34
-#define TK_DETACH 35
-#define TK_EACH 36
-#define TK_FAIL 37
-#define TK_FOR 38
-#define TK_IGNORE 39
-#define TK_INITIALLY 40
-#define TK_INSTEAD 41
-#define TK_LIKE_KW 42
-#define TK_MATCH 43
-#define TK_KEY 44
-#define TK_OF 45
-#define TK_OFFSET 46
-#define TK_PRAGMA 47
-#define TK_RAISE 48
-#define TK_REPLACE 49
-#define TK_RESTRICT 50
-#define TK_ROW 51
-#define TK_TRIGGER 52
-#define TK_VACUUM 53
-#define TK_VIEW 54
-#define TK_VIRTUAL 55
-#define TK_REINDEX 56
-#define TK_RENAME 57
-#define TK_CTIME_KW 58
-#define TK_ANY 59
-#define TK_OR 60
-#define TK_AND 61
-#define TK_IS 62
-#define TK_BETWEEN 63
-#define TK_IN 64
-#define TK_ISNULL 65
-#define TK_NOTNULL 66
-#define TK_NE 67
-#define TK_EQ 68
-#define TK_GT 69
-#define TK_LE 70
-#define TK_LT 71
-#define TK_GE 72
-#define TK_ESCAPE 73
-#define TK_BITAND 74
-#define TK_BITOR 75
-#define TK_LSHIFT 76
-#define TK_RSHIFT 77
-#define TK_PLUS 78
-#define TK_MINUS 79
-#define TK_STAR 80
-#define TK_SLASH 81
-#define TK_REM 82
-#define TK_CONCAT 83
-#define TK_COLLATE 84
-#define TK_UMINUS 85
-#define TK_UPLUS 86
-#define TK_BITNOT 87
-#define TK_STRING 88
-#define TK_JOIN_KW 89
-#define TK_CONSTRAINT 90
-#define TK_DEFAULT 91
-#define TK_NULL 92
-#define TK_PRIMARY 93
-#define TK_UNIQUE 94
-#define TK_CHECK 95
-#define TK_REFERENCES 96
-#define TK_AUTOINCR 97
-#define TK_ON 98
-#define TK_DELETE 99
-#define TK_UPDATE 100
-#define TK_INSERT 101
-#define TK_SET 102
-#define TK_DEFERRABLE 103
-#define TK_FOREIGN 104
-#define TK_DROP 105
-#define TK_UNION 106
-#define TK_ALL 107
-#define TK_EXCEPT 108
-#define TK_INTERSECT 109
-#define TK_SELECT 110
-#define TK_DISTINCT 111
-#define TK_DOT 112
-#define TK_FROM 113
-#define TK_JOIN 114
-#define TK_USING 115
-#define TK_ORDER 116
-#define TK_BY 117
-#define TK_GROUP 118
-#define TK_HAVING 119
-#define TK_LIMIT 120
-#define TK_WHERE 121
-#define TK_INTO 122
-#define TK_VALUES 123
-#define TK_INTEGER 124
-#define TK_FLOAT 125
-#define TK_BLOB 126
-#define TK_REGISTER 127
-#define TK_VARIABLE 128
-#define TK_CASE 129
-#define TK_WHEN 130
-#define TK_THEN 131
-#define TK_ELSE 132
-#define TK_INDEX 133
-#define TK_ALTER 134
-#define TK_TO 135
-#define TK_ADD 136
-#define TK_COLUMNKW 137
-#define TK_TO_TEXT 138
-#define TK_TO_BLOB 139
-#define TK_TO_NUMERIC 140
-#define TK_TO_INT 141
-#define TK_TO_REAL 142
-#define TK_END_OF_FILE 143
-#define TK_ILLEGAL 144
-#define TK_SPACE 145
-#define TK_UNCLOSED_STRING 146
-#define TK_COMMENT 147
-#define TK_FUNCTION 148
-#define TK_COLUMN 149
-#define TK_AGG_FUNCTION 150
-#define TK_AGG_COLUMN 151
-#define TK_CONST_FUNC 152
+#define TK_SAVEPOINT 13
+#define TK_RELEASE 14
+#define TK_TO 15
+#define TK_TABLE 16
+#define TK_CREATE 17
+#define TK_IF 18
+#define TK_NOT 19
+#define TK_EXISTS 20
+#define TK_TEMP 21
+#define TK_LP 22
+#define TK_RP 23
+#define TK_AS 24
+#define TK_COMMA 25
+#define TK_ID 26
+#define TK_INDEXED 27
+#define TK_ABORT 28
+#define TK_ACTION 29
+#define TK_AFTER 30
+#define TK_ANALYZE 31
+#define TK_ASC 32
+#define TK_ATTACH 33
+#define TK_BEFORE 34
+#define TK_BY 35
+#define TK_CASCADE 36
+#define TK_CAST 37
+#define TK_COLUMNKW 38
+#define TK_CONFLICT 39
+#define TK_DATABASE 40
+#define TK_DESC 41
+#define TK_DETACH 42
+#define TK_EACH 43
+#define TK_FAIL 44
+#define TK_FOR 45
+#define TK_IGNORE 46
+#define TK_INITIALLY 47
+#define TK_INSTEAD 48
+#define TK_LIKE_KW 49
+#define TK_MATCH 50
+#define TK_NO 51
+#define TK_KEY 52
+#define TK_OF 53
+#define TK_OFFSET 54
+#define TK_PRAGMA 55
+#define TK_RAISE 56
+#define TK_REPLACE 57
+#define TK_RESTRICT 58
+#define TK_ROW 59
+#define TK_TRIGGER 60
+#define TK_VACUUM 61
+#define TK_VIEW 62
+#define TK_VIRTUAL 63
+#define TK_REINDEX 64
+#define TK_RENAME 65
+#define TK_CTIME_KW 66
+#define TK_ANY 67
+#define TK_OR 68
+#define TK_AND 69
+#define TK_IS 70
+#define TK_BETWEEN 71
+#define TK_IN 72
+#define TK_ISNULL 73
+#define TK_NOTNULL 74
+#define TK_NE 75
+#define TK_EQ 76
+#define TK_GT 77
+#define TK_LE 78
+#define TK_LT 79
+#define TK_GE 80
+#define TK_ESCAPE 81
+#define TK_BITAND 82
+#define TK_BITOR 83
+#define TK_LSHIFT 84
+#define TK_RSHIFT 85
+#define TK_PLUS 86
+#define TK_MINUS 87
+#define TK_STAR 88
+#define TK_SLASH 89
+#define TK_REM 90
+#define TK_CONCAT 91
+#define TK_COLLATE 92
+#define TK_BITNOT 93
+#define TK_STRING 94
+#define TK_JOIN_KW 95
+#define TK_CONSTRAINT 96
+#define TK_DEFAULT 97
+#define TK_NULL 98
+#define TK_PRIMARY 99
+#define TK_UNIQUE 100
+#define TK_CHECK 101
+#define TK_REFERENCES 102
+#define TK_AUTOINCR 103
+#define TK_ON 104
+#define TK_DELETE 105
+#define TK_UPDATE 106
+#define TK_SET 107
+#define TK_DEFERRABLE 108
+#define TK_FOREIGN 109
+#define TK_DROP 110
+#define TK_UNION 111
+#define TK_ALL 112
+#define TK_EXCEPT 113
+#define TK_INTERSECT 114
+#define TK_SELECT 115
+#define TK_DISTINCT 116
+#define TK_DOT 117
+#define TK_FROM 118
+#define TK_JOIN 119
+#define TK_USING 120
+#define TK_ORDER 121
+#define TK_GROUP 122
+#define TK_HAVING 123
+#define TK_LIMIT 124
+#define TK_WHERE 125
+#define TK_INTO 126
+#define TK_VALUES 127
+#define TK_INSERT 128
+#define TK_INTEGER 129
+#define TK_FLOAT 130
+#define TK_BLOB 131
+#define TK_REGISTER 132
+#define TK_VARIABLE 133
+#define TK_CASE 134
+#define TK_WHEN 135
+#define TK_THEN 136
+#define TK_ELSE 137
+#define TK_INDEX 138
+#define TK_ALTER 139
+#define TK_ADD 140
+#define TK_TO_TEXT 141
+#define TK_TO_BLOB 142
+#define TK_TO_NUMERIC 143
+#define TK_TO_INT 144
+#define TK_TO_REAL 145
+#define TK_ISNOT 146
+#define TK_END_OF_FILE 147
+#define TK_ILLEGAL 148
+#define TK_SPACE 149
+#define TK_UNCLOSED_STRING 150
+#define TK_FUNCTION 151
+#define TK_COLUMN 152
+#define TK_AGG_FUNCTION 153
+#define TK_AGG_COLUMN 154
+#define TK_CONST_FUNC 155
+#define TK_UMINUS 156
+#define TK_UPLUS 157
/************** End of parse.h ***********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
@@ -6338,11 +6582,12 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
# define double sqlite_int64
# define LONGDOUBLE_TYPE sqlite_int64
# ifndef SQLITE_BIG_DBL
-# define SQLITE_BIG_DBL (0x7fffffffffffffff)
+# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50)
# endif
# define SQLITE_OMIT_DATETIME_FUNCS 1
# define SQLITE_OMIT_TRACE 1
# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
+# undef SQLITE_HAVE_ISNAN
#endif
#ifndef SQLITE_BIG_DBL
# define SQLITE_BIG_DBL (1e99)
@@ -6384,12 +6629,16 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*);
# define SQLITE_DEFAULT_FILE_FORMAT 1
#endif
+#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS
+# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0
+#endif
+
/*
-** Provide a default value for TEMP_STORE in case it is not specified
+** Provide a default value for SQLITE_TEMP_STORE in case it is not specified
** on the command-line
*/
-#ifndef TEMP_STORE
-# define TEMP_STORE 1
+#ifndef SQLITE_TEMP_STORE
+# define SQLITE_TEMP_STORE 1
#endif
/*
@@ -6461,18 +6710,27 @@ typedef UINT32_TYPE u32; /* 4-byte unsigned integer */
typedef UINT16_TYPE u16; /* 2-byte unsigned integer */
typedef INT16_TYPE i16; /* 2-byte signed integer */
typedef UINT8_TYPE u8; /* 1-byte unsigned integer */
-typedef UINT8_TYPE i8; /* 1-byte signed integer */
+typedef INT8_TYPE i8; /* 1-byte signed integer */
+
+/*
+** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value
+** that can be stored in a u32 without loss of data. The value
+** is 0x00000000ffffffff. But because of quirks of some compilers, we
+** have to specify the value in the less intuitive manner shown:
+*/
+#define SQLITE_MAX_U32 ((((u64)1)<<32)-1)
/*
** Macros to determine whether the machine is big or little endian,
** evaluated at runtime.
*/
#ifdef SQLITE_AMALGAMATION
-SQLITE_PRIVATE const int sqlite3one;
+SQLITE_PRIVATE const int sqlite3one = 1;
#else
SQLITE_PRIVATE const int sqlite3one;
#endif
-#if defined(i386) || defined(__i386__) || defined(_M_IX86)
+#if defined(i386) || defined(__i386__) || defined(_M_IX86)\
+ || defined(__x86_64) || defined(__x86_64__)
# define SQLITE_BIGENDIAN 0
# define SQLITE_LITTLEENDIAN 1
# define SQLITE_UTF16NATIVE SQLITE_UTF16LE
@@ -6490,6 +6748,23 @@ SQLITE_PRIVATE const int sqlite3one;
#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32))
#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64)
+/*
+** Round up a number to the next larger multiple of 8. This is used
+** to force 8-byte alignment on 64-bit architectures.
+*/
+#define ROUND8(x) (((x)+7)&~7)
+
+/*
+** Round down to the nearest multiple of 8
+*/
+#define ROUNDDOWN8(x) ((x)&~7)
+
+/*
+** Assert that the pointer X is aligned to an 8-byte boundary.
+*/
+#define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0)
+
+
/*
** An instance of the following structure is used to store the busy-handler
** callback for a given sqlite handle.
@@ -6528,38 +6803,101 @@ struct BusyHandler {
** A convenience macro that returns the number of elements in
** an array.
*/
-#define ArraySize(X) (sizeof(X)/sizeof(X[0]))
+#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0])))
+
+/*
+** The following value as a destructor means to use sqlite3DbFree().
+** This is an internal extension to SQLITE_STATIC and SQLITE_TRANSIENT.
+*/
+#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3DbFree)
+
+/*
+** When SQLITE_OMIT_WSD is defined, it means that the target platform does
+** not support Writable Static Data (WSD) such as global and static variables.
+** All variables must either be on the stack or dynamically allocated from
+** the heap. When WSD is unsupported, the variable declarations scattered
+** throughout the SQLite code must become constants instead. The SQLITE_WSD
+** macro is used for this purpose. And instead of referencing the variable
+** directly, we use its constant as a key to lookup the run-time allocated
+** buffer that holds real variable. The constant is also the initializer
+** for the run-time allocated buffer.
+**
+** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL
+** macros become no-ops and have zero performance impact.
+*/
+#ifdef SQLITE_OMIT_WSD
+ #define SQLITE_WSD const
+ #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v)))
+ #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config)
+SQLITE_API int sqlite3_wsd_init(int N, int J);
+SQLITE_API void *sqlite3_wsd_find(void *K, int L);
+#else
+ #define SQLITE_WSD
+ #define GLOBAL(t,v) v
+ #define sqlite3GlobalConfig sqlite3Config
+#endif
+
+/*
+** The following macros are used to suppress compiler warnings and to
+** make it clear to human readers when a function parameter is deliberately
+** left unused within the body of a function. This usually happens when
+** a function is called via a function pointer. For example the
+** implementation of an SQL aggregate step callback may not use the
+** parameter indicating the number of arguments passed to the aggregate,
+** if it knows that this is enforced elsewhere.
+**
+** When a function parameter is not used at all within the body of a function,
+** it is generally named "NotUsed" or "NotUsed2" to make things even clearer.
+** However, these macros may also be used to suppress warnings related to
+** parameters that may or may not be used depending on compilation options.
+** For example those parameters only used in assert() statements. In these
+** cases the parameters are named as per the usual conventions.
+*/
+#define UNUSED_PARAMETER(x) (void)(x)
+#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y)
/*
** Forward references to structures
*/
typedef struct AggInfo AggInfo;
typedef struct AuthContext AuthContext;
+typedef struct AutoincInfo AutoincInfo;
typedef struct Bitvec Bitvec;
+typedef struct RowSet RowSet;
typedef struct CollSeq CollSeq;
typedef struct Column Column;
typedef struct Db Db;
typedef struct Schema Schema;
typedef struct Expr Expr;
typedef struct ExprList ExprList;
+typedef struct ExprSpan ExprSpan;
typedef struct FKey FKey;
typedef struct FuncDef FuncDef;
+typedef struct FuncDefHash FuncDefHash;
typedef struct IdList IdList;
typedef struct Index Index;
+typedef struct IndexSample IndexSample;
typedef struct KeyClass KeyClass;
typedef struct KeyInfo KeyInfo;
+typedef struct Lookaside Lookaside;
+typedef struct LookasideSlot LookasideSlot;
typedef struct Module Module;
typedef struct NameContext NameContext;
typedef struct Parse Parse;
+typedef struct Savepoint Savepoint;
typedef struct Select Select;
typedef struct SrcList SrcList;
typedef struct StrAccum StrAccum;
typedef struct Table Table;
typedef struct TableLock TableLock;
typedef struct Token Token;
-typedef struct TriggerStack TriggerStack;
+typedef struct TriggerPrg TriggerPrg;
typedef struct TriggerStep TriggerStep;
typedef struct Trigger Trigger;
+typedef struct UnpackedRecord UnpackedRecord;
+typedef struct VTable VTable;
+typedef struct Walker Walker;
+typedef struct WherePlan WherePlan;
typedef struct WhereInfo WhereInfo;
typedef struct WhereLevel WhereLevel;
@@ -6585,7 +6923,7 @@ typedef struct WhereLevel WhereLevel;
** subsystem. See comments in the source code for a detailed description
** of what each interface routine does.
**
-** @(#) $Id: btree.h,v 1.98 2008/04/26 13:39:47 drh Exp $
+** @(#) $Id: btree.h,v 1.120 2009/07/22 00:35:24 drh Exp $
*/
#ifndef _BTREE_H_
#define _BTREE_H_
@@ -6630,7 +6968,7 @@ struct BtreeMutexArray {
SQLITE_PRIVATE int sqlite3BtreeOpen(
const char *zFilename, /* Name of database file to open */
sqlite3 *db, /* Associated database connection */
- Btree **, /* Return open Btree* here */
+ Btree **ppBtree, /* Return open Btree* here */
int flags, /* Flags */
int vfsFlags /* Flags passed through to VFS open */
);
@@ -6648,16 +6986,11 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
#define BTREE_READWRITE 16 /* Open for both reading and writing */
#define BTREE_CREATE 32 /* Create the database if it does not exist */
-/* Additional values for the 4th argument of sqlite3BtreeOpen that
-** are not associated with PAGER_ values.
-*/
-#define BTREE_PRIVATE 64 /* Never share with other connections */
-
SQLITE_PRIVATE int sqlite3BtreeClose(Btree*);
SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int);
SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int);
SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree*,int,int);
+SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix);
SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*);
SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int);
SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*);
@@ -6668,19 +7001,17 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*);
SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*);
SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeCommitStmt(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeRollbackStmt(Btree*);
+SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int);
SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags);
SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeIsInStmt(Btree*);
SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*);
+SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*);
SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
-SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *);
-SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *, int, u8);
+SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree);
+SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock);
+SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int);
SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *);
-SQLITE_PRIVATE const char *sqlite3BtreeGetDirname(Btree *);
SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *);
SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *);
@@ -6694,12 +7025,32 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *);
#define BTREE_LEAFDATA 4 /* Data stored in leaves only. Implies INTKEY */
SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*);
-SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int);
-SQLITE_PRIVATE int sqlite3BtreeGetMeta(Btree*, int idx, u32 *pValue);
-SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
+SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*);
SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int);
-struct UnpackedRecord; /* Forward declaration. Definition in vdbeaux.c. */
+SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue);
+SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
+
+/*
+** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta
+** should be one of the following values. The integer values are assigned
+** to constants so that the offset of the corresponding field in an
+** SQLite database header may be found using the following formula:
+**
+** offset = 36 + (idx * 4)
+**
+** For example, the free-page-count field is located at byte offset 36 of
+** the database file header. The incr-vacuum-flag field is located at
+** byte offset 64 (== 36+4*7).
+*/
+#define BTREE_FREE_PAGE_COUNT 0
+#define BTREE_SCHEMA_VERSION 1
+#define BTREE_FILE_FORMAT 2
+#define BTREE_DEFAULT_CACHE_SIZE 3
+#define BTREE_LARGEST_ROOT_PAGE 4
+#define BTREE_TEXT_ENCODING 5
+#define BTREE_USER_VERSION 6
+#define BTREE_INCR_VACUUM 7
SQLITE_PRIVATE int sqlite3BtreeCursor(
Btree*, /* BTree containing table to open */
@@ -6711,42 +7062,50 @@ SQLITE_PRIVATE int sqlite3BtreeCursor(
SQLITE_PRIVATE int sqlite3BtreeCursorSize(void);
SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*);
-SQLITE_PRIVATE int sqlite3BtreeMoveto(
+SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
BtCursor*,
- const void *pKey,
- struct UnpackedRecord *pUnKey,
- i64 nKey,
+ UnpackedRecord *pUnKey,
+ i64 intKey,
int bias,
int *pRes
);
+SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*);
SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*);
SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey,
const void *pData, int nData,
- int nZero, int bias);
+ int nZero, int bias, int seekResult);
SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes);
SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes);
SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes);
SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*);
-SQLITE_PRIVATE int sqlite3BtreeFlags(BtCursor*);
SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes);
SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize);
SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*);
-SQLITE_PRIVATE sqlite3 *sqlite3BtreeCursorDb(const BtCursor*);
SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt);
SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt);
SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize);
SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*);
+SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64);
+SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*);
SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*);
SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *);
+SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *);
+
+#ifndef NDEBUG
+SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*);
+#endif
+
+#ifndef SQLITE_OMIT_BTREECOUNT
+SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *);
+#endif
#ifdef SQLITE_TEST
SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*);
-SQLITE_PRIVATE int sqlite3BtreePageDump(Btree*, int, int recursive);
#endif
/*
@@ -6754,30 +7113,39 @@ SQLITE_PRIVATE int sqlite3BtreePageDump(Btree*, int, int recursive);
** use mutexes to access the BtShared structures. So make the
** Enter and Leave procedures no-ops.
*/
-#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
+#ifndef SQLITE_OMIT_SHARED_CACHE
SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*);
+SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*);
+#else
+# define sqlite3BtreeEnter(X)
+# define sqlite3BtreeEnterAll(X)
+#endif
+
+#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*);
-SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*);
SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*);
SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*);
-SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*);
SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*);
-SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*);
SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*);
SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*);
SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*);
+#ifndef NDEBUG
+ /* These routines are used inside assert() statements only. */
+SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*);
+SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*);
+#endif
#else
-# define sqlite3BtreeEnter(X)
+
# define sqlite3BtreeLeave(X)
-# define sqlite3BtreeHoldsMutex(X) 1
# define sqlite3BtreeEnterCursor(X)
# define sqlite3BtreeLeaveCursor(X)
-# define sqlite3BtreeEnterAll(X)
# define sqlite3BtreeLeaveAll(X)
-# define sqlite3BtreeHoldsAllMutexes(X) 1
# define sqlite3BtreeMutexArrayEnter(X)
# define sqlite3BtreeMutexArrayLeave(X)
# define sqlite3BtreeMutexArrayInsert(X,Y)
+
+# define sqlite3BtreeHoldsMutex(X) 1
+# define sqlite3BtreeHoldsAllMutexes(X) 1
#endif
@@ -6804,7 +7172,7 @@ SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*);
** or VDBE. The VDBE implements an abstract machine that runs a
** simple program to access and modify the underlying database.
**
-** $Id: vdbe.h,v 1.131 2008/05/01 17:03:49 drh Exp $
+** $Id: vdbe.h,v 1.142 2009/07/24 17:58:53 danielk1977 Exp $
*/
#ifndef _SQLITE_VDBE_H_
#define _SQLITE_VDBE_H_
@@ -6822,7 +7190,7 @@ typedef struct Vdbe Vdbe;
*/
typedef struct VdbeFunc VdbeFunc;
typedef struct Mem Mem;
-typedef struct UnpackedRecord UnpackedRecord;
+typedef struct SubProgram SubProgram;
/*
** A single instruction of the virtual machine has an opcode
@@ -6837,7 +7205,7 @@ struct VdbeOp {
int p1; /* First operand */
int p2; /* Second parameter (often the jump destination) */
int p3; /* The third parameter */
- union { /* forth parameter */
+ union { /* fourth parameter */
int i; /* Integer value if p4type==P4_INT32 */
void *p; /* Generic pointer */
char *z; /* Pointer to data for string (char array) types */
@@ -6847,19 +7215,34 @@ struct VdbeOp {
VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */
CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */
Mem *pMem; /* Used when p4type is P4_MEM */
- sqlite3_vtab *pVtab; /* Used when p4type is P4_VTAB */
+ VTable *pVtab; /* Used when p4type is P4_VTAB */
KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */
+ int *ai; /* Used when p4type is P4_INTARRAY */
+ SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */
} p4;
#ifdef SQLITE_DEBUG
- char *zComment; /* Comment to improve readability */
+ char *zComment; /* Comment to improve readability */
#endif
#ifdef VDBE_PROFILE
- int cnt; /* Number of times this instruction was executed */
- long long cycles; /* Total time spend executing this instruction */
+ int cnt; /* Number of times this instruction was executed */
+ u64 cycles; /* Total time spent executing this instruction */
#endif
};
typedef struct VdbeOp VdbeOp;
+
+/*
+** A sub-routine used to implement a trigger program.
+*/
+struct SubProgram {
+ VdbeOp *aOp; /* Array of opcodes for sub-program */
+ int nOp; /* Elements in aOp[] */
+ int nMem; /* Number of memory cells required */
+ int nCsr; /* Number of cursors required */
+ int nRef; /* Number of pointers to this structure */
+ void *token; /* id that may be used to recursive triggers */
+};
+
/*
** A smaller version of VdbeOp used for the VdbeAddOpList() function because
** it takes up less space.
@@ -6873,7 +7256,7 @@ struct VdbeOpList {
typedef struct VdbeOpList VdbeOpList;
/*
-** Allowed values of VdbeOp.p3type
+** Allowed values of VdbeOp.p4type
*/
#define P4_NOTUSED 0 /* The P4 parameter is not used */
#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */
@@ -6889,6 +7272,8 @@ typedef struct VdbeOpList VdbeOpList;
#define P4_REAL (-12) /* P4 is a 64-bit floating point value */
#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */
#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */
+#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
+#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */
/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure
** is made. That copy is freed when the Vdbe is finalized. But if the
@@ -6897,7 +7282,8 @@ typedef struct VdbeOpList VdbeOpList;
** from a single sqliteMalloc(). But no copy is made and the calling
** function should *not* try to free the KeyInfo.
*/
-#define P4_KEYINFO_HANDOFF (-9)
+#define P4_KEYINFO_HANDOFF (-16)
+#define P4_KEYINFO_STATIC (-17)
/*
** The Vdbe.aColName array contains 5n Mem structures, where n is the
@@ -6938,146 +7324,149 @@ typedef struct VdbeOpList VdbeOpList;
#define OP_Affinity 2
#define OP_Column 3
#define OP_SetCookie 4
-#define OP_Real 125 /* same as TK_FLOAT */
-#define OP_Sequence 5
-#define OP_MoveGt 6
-#define OP_Ge 72 /* same as TK_GE */
-#define OP_RowKey 7
-#define OP_SCopy 8
-#define OP_Eq 68 /* same as TK_EQ */
-#define OP_OpenWrite 9
-#define OP_NotNull 66 /* same as TK_NOTNULL */
-#define OP_If 10
-#define OP_ToInt 141 /* same as TK_TO_INT */
-#define OP_String8 88 /* same as TK_STRING */
-#define OP_VRowid 11
+#define OP_Seek 5
+#define OP_Real 130 /* same as TK_FLOAT */
+#define OP_Sequence 6
+#define OP_Savepoint 7
+#define OP_Ge 80 /* same as TK_GE */
+#define OP_RowKey 8
+#define OP_SCopy 9
+#define OP_Eq 76 /* same as TK_EQ */
+#define OP_OpenWrite 10
+#define OP_NotNull 74 /* same as TK_NOTNULL */
+#define OP_If 11
+#define OP_ToInt 144 /* same as TK_TO_INT */
+#define OP_String8 94 /* same as TK_STRING */
#define OP_CollSeq 12
#define OP_OpenRead 13
#define OP_Expire 14
#define OP_AutoCommit 15
-#define OP_Gt 69 /* same as TK_GT */
+#define OP_Gt 77 /* same as TK_GT */
+#define OP_Pagecount 16
#define OP_IntegrityCk 17
#define OP_Sort 18
-#define OP_Copy 19
-#define OP_Trace 20
-#define OP_Function 21
-#define OP_IfNeg 22
-#define OP_And 61 /* same as TK_AND */
-#define OP_Subtract 79 /* same as TK_MINUS */
-#define OP_Noop 23
-#define OP_Return 24
-#define OP_Remainder 82 /* same as TK_REM */
-#define OP_NewRowid 25
-#define OP_Multiply 80 /* same as TK_STAR */
-#define OP_Variable 26
-#define OP_String 27
-#define OP_RealAffinity 28
-#define OP_VRename 29
-#define OP_ParseSchema 30
-#define OP_VOpen 31
-#define OP_Close 32
-#define OP_CreateIndex 33
-#define OP_IsUnique 34
-#define OP_NotFound 35
-#define OP_Int64 36
-#define OP_MustBeInt 37
-#define OP_Halt 38
-#define OP_Rowid 39
-#define OP_IdxLT 40
-#define OP_AddImm 41
-#define OP_Statement 42
-#define OP_RowData 43
-#define OP_MemMax 44
-#define OP_Or 60 /* same as TK_OR */
-#define OP_NotExists 45
-#define OP_Gosub 46
-#define OP_Divide 81 /* same as TK_SLASH */
-#define OP_Integer 47
-#define OP_ToNumeric 140 /* same as TK_TO_NUMERIC*/
-#define OP_Prev 48
-#define OP_Concat 83 /* same as TK_CONCAT */
-#define OP_BitAnd 74 /* same as TK_BITAND */
-#define OP_VColumn 49
-#define OP_CreateTable 50
-#define OP_Last 51
-#define OP_IsNull 65 /* same as TK_ISNULL */
-#define OP_IncrVacuum 52
-#define OP_IdxRowid 53
-#define OP_ShiftRight 77 /* same as TK_RSHIFT */
-#define OP_ResetCount 54
-#define OP_FifoWrite 55
-#define OP_ContextPush 56
-#define OP_DropTrigger 57
-#define OP_DropIndex 58
-#define OP_IdxGE 59
-#define OP_IdxDelete 62
-#define OP_Vacuum 63
-#define OP_MoveLe 64
-#define OP_IfNot 73
-#define OP_DropTable 84
-#define OP_MakeRecord 85
-#define OP_ToBlob 139 /* same as TK_TO_BLOB */
-#define OP_ResultRow 86
-#define OP_Delete 89
-#define OP_AggFinal 90
-#define OP_ShiftLeft 76 /* same as TK_LSHIFT */
-#define OP_Goto 91
-#define OP_TableLock 92
-#define OP_FifoRead 93
-#define OP_Clear 94
-#define OP_MoveLt 95
-#define OP_Le 70 /* same as TK_LE */
-#define OP_VerifyCookie 96
-#define OP_AggStep 97
-#define OP_ToText 138 /* same as TK_TO_TEXT */
-#define OP_Not 16 /* same as TK_NOT */
-#define OP_ToReal 142 /* same as TK_TO_REAL */
-#define OP_SetNumColumns 98
-#define OP_Transaction 99
-#define OP_VFilter 100
-#define OP_Ne 67 /* same as TK_NE */
-#define OP_VDestroy 101
-#define OP_ContextPop 102
-#define OP_BitOr 75 /* same as TK_BITOR */
-#define OP_Next 103
-#define OP_IdxInsert 104
-#define OP_Lt 71 /* same as TK_LT */
-#define OP_Insert 105
-#define OP_Destroy 106
-#define OP_ReadCookie 107
-#define OP_ForceInt 108
-#define OP_LoadAnalysis 109
-#define OP_Explain 110
-#define OP_OpenPseudo 111
-#define OP_OpenEphemeral 112
-#define OP_Null 113
-#define OP_Move 114
-#define OP_Blob 115
-#define OP_Add 78 /* same as TK_PLUS */
-#define OP_Rewind 116
-#define OP_MoveGe 117
-#define OP_VBegin 118
-#define OP_VUpdate 119
-#define OP_IfZero 120
-#define OP_BitNot 87 /* same as TK_BITNOT */
-#define OP_VCreate 121
-#define OP_Found 122
-#define OP_IfPos 123
-#define OP_NullRow 124
+#define OP_Copy 20
+#define OP_Trace 21
+#define OP_Function 22
+#define OP_IfNeg 23
+#define OP_And 69 /* same as TK_AND */
+#define OP_Subtract 87 /* same as TK_MINUS */
+#define OP_Noop 24
+#define OP_Program 25
+#define OP_Return 26
+#define OP_Remainder 90 /* same as TK_REM */
+#define OP_NewRowid 27
+#define OP_Multiply 88 /* same as TK_STAR */
+#define OP_FkCounter 28
+#define OP_Variable 29
+#define OP_String 30
+#define OP_RealAffinity 31
+#define OP_VRename 32
+#define OP_ParseSchema 33
+#define OP_VOpen 34
+#define OP_Close 35
+#define OP_CreateIndex 36
+#define OP_IsUnique 37
+#define OP_NotFound 38
+#define OP_Int64 39
+#define OP_MustBeInt 40
+#define OP_Halt 41
+#define OP_Rowid 42
+#define OP_IdxLT 43
+#define OP_AddImm 44
+#define OP_RowData 45
+#define OP_MemMax 46
+#define OP_Or 68 /* same as TK_OR */
+#define OP_NotExists 47
+#define OP_Gosub 48
+#define OP_Divide 89 /* same as TK_SLASH */
+#define OP_Integer 49
+#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/
+#define OP_Prev 50
+#define OP_RowSetRead 51
+#define OP_Concat 91 /* same as TK_CONCAT */
+#define OP_RowSetAdd 52
+#define OP_BitAnd 82 /* same as TK_BITAND */
+#define OP_VColumn 53
+#define OP_CreateTable 54
+#define OP_Last 55
+#define OP_SeekLe 56
+#define OP_IsNull 73 /* same as TK_ISNULL */
+#define OP_IncrVacuum 57
+#define OP_IdxRowid 58
+#define OP_ShiftRight 85 /* same as TK_RSHIFT */
+#define OP_ResetCount 59
+#define OP_Yield 60
+#define OP_DropTrigger 61
+#define OP_DropIndex 62
+#define OP_Param 63
+#define OP_IdxGE 64
+#define OP_IdxDelete 65
+#define OP_Vacuum 66
+#define OP_IfNot 67
+#define OP_DropTable 70
+#define OP_SeekLt 71
+#define OP_MakeRecord 72
+#define OP_ToBlob 142 /* same as TK_TO_BLOB */
+#define OP_ResultRow 81
+#define OP_Delete 92
+#define OP_AggFinal 95
+#define OP_Compare 96
+#define OP_ShiftLeft 84 /* same as TK_LSHIFT */
+#define OP_Goto 97
+#define OP_TableLock 98
+#define OP_Clear 99
+#define OP_Le 78 /* same as TK_LE */
+#define OP_VerifyCookie 100
+#define OP_AggStep 101
+#define OP_ToText 141 /* same as TK_TO_TEXT */
+#define OP_Not 19 /* same as TK_NOT */
+#define OP_ToReal 145 /* same as TK_TO_REAL */
+#define OP_Transaction 102
+#define OP_VFilter 103
+#define OP_Ne 75 /* same as TK_NE */
+#define OP_VDestroy 104
+#define OP_BitOr 83 /* same as TK_BITOR */
+#define OP_Next 105
+#define OP_Count 106
+#define OP_IdxInsert 107
+#define OP_Lt 79 /* same as TK_LT */
+#define OP_FkIfZero 108
+#define OP_SeekGe 109
+#define OP_Insert 110
+#define OP_Destroy 111
+#define OP_ReadCookie 112
+#define OP_RowSetTest 113
+#define OP_LoadAnalysis 114
+#define OP_Explain 115
+#define OP_HaltIfNull 116
+#define OP_OpenPseudo 117
+#define OP_OpenEphemeral 118
+#define OP_Null 119
+#define OP_Move 120
+#define OP_Blob 121
+#define OP_Add 86 /* same as TK_PLUS */
+#define OP_Rewind 122
+#define OP_SeekGt 123
+#define OP_VBegin 124
+#define OP_VUpdate 125
+#define OP_IfZero 126
+#define OP_BitNot 93 /* same as TK_BITNOT */
+#define OP_VCreate 127
+#define OP_Found 128
+#define OP_IfPos 129
+#define OP_NullRow 131
+#define OP_Jump 132
+#define OP_Permutation 133
/* The following opcode values are never used */
-#define OP_NotUsed_126 126
-#define OP_NotUsed_127 127
-#define OP_NotUsed_128 128
-#define OP_NotUsed_129 129
-#define OP_NotUsed_130 130
-#define OP_NotUsed_131 131
-#define OP_NotUsed_132 132
-#define OP_NotUsed_133 133
#define OP_NotUsed_134 134
#define OP_NotUsed_135 135
#define OP_NotUsed_136 136
#define OP_NotUsed_137 137
+#define OP_NotUsed_138 138
+#define OP_NotUsed_139 139
+#define OP_NotUsed_140 140
/* Properties such as "out2" or "jump" that are specified in
@@ -7091,24 +7480,25 @@ typedef struct VdbeOpList VdbeOpList;
#define OPFLG_IN3 0x0010 /* in3: P3 is an input */
#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */
#define OPFLG_INITIALIZER {\
-/* 0 */ 0x00, 0x01, 0x00, 0x00, 0x10, 0x02, 0x11, 0x00,\
-/* 8 */ 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00,\
-/* 16 */ 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00,\
-/* 24 */ 0x00, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00,\
-/* 32 */ 0x00, 0x02, 0x11, 0x11, 0x02, 0x05, 0x00, 0x02,\
-/* 40 */ 0x11, 0x04, 0x00, 0x00, 0x0c, 0x11, 0x01, 0x02,\
-/* 48 */ 0x01, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00, 0x04,\
-/* 56 */ 0x00, 0x00, 0x00, 0x11, 0x2c, 0x2c, 0x00, 0x00,\
-/* 64 */ 0x11, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\
-/* 72 */ 0x15, 0x05, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,\
-/* 80 */ 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x00, 0x00, 0x04,\
-/* 88 */ 0x02, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x11,\
-/* 96 */ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,\
-/* 104 */ 0x08, 0x00, 0x02, 0x02, 0x05, 0x00, 0x00, 0x00,\
-/* 112 */ 0x00, 0x02, 0x00, 0x02, 0x01, 0x11, 0x00, 0x00,\
-/* 120 */ 0x05, 0x00, 0x11, 0x05, 0x00, 0x02, 0x00, 0x00,\
-/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
-/* 136 */ 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04,}
+/* 0 */ 0x00, 0x01, 0x00, 0x00, 0x10, 0x08, 0x02, 0x00,\
+/* 8 */ 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,\
+/* 16 */ 0x02, 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x05,\
+/* 24 */ 0x00, 0x01, 0x04, 0x02, 0x00, 0x00, 0x02, 0x04,\
+/* 32 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x11, 0x11, 0x02,\
+/* 40 */ 0x05, 0x00, 0x02, 0x11, 0x04, 0x00, 0x08, 0x11,\
+/* 48 */ 0x01, 0x02, 0x01, 0x21, 0x08, 0x00, 0x02, 0x01,\
+/* 56 */ 0x11, 0x01, 0x02, 0x00, 0x04, 0x00, 0x00, 0x02,\
+/* 64 */ 0x11, 0x00, 0x00, 0x05, 0x2c, 0x2c, 0x00, 0x11,\
+/* 72 */ 0x00, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\
+/* 80 */ 0x15, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,\
+/* 88 */ 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x04, 0x02, 0x00,\
+/* 96 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\
+/* 104 */ 0x00, 0x01, 0x02, 0x08, 0x01, 0x11, 0x00, 0x02,\
+/* 112 */ 0x02, 0x15, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02,\
+/* 120 */ 0x00, 0x02, 0x01, 0x11, 0x00, 0x00, 0x05, 0x00,\
+/* 128 */ 0x11, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,\
+/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\
+/* 144 */ 0x04, 0x04,}
/************** End of opcodes.h *********************************************/
/************** Continuing where we left off in vdbe.h ***********************/
@@ -7135,26 +7525,29 @@ SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int);
SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*);
-SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int);
+SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int,int,int);
SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int);
SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*);
#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int);
SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*);
#endif
SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*);
-SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*, int);
+SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int);
-SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, int);
+SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*));
SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*);
SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*);
-SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n);
+SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int);
SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*);
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*);
+SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *, SubProgram *, int);
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
SQLITE_PRIVATE int sqlite3VdbeReleaseMemory(int);
#endif
-SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,void*,int);
+SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int);
SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*);
SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
@@ -7162,8 +7555,11 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
#ifndef NDEBUG
SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...);
# define VdbeComment(X) sqlite3VdbeComment X
+SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...);
+# define VdbeNoopComment(X) sqlite3VdbeNoopComment X
#else
# define VdbeComment(X)
+# define VdbeNoopComment(X)
#endif
#endif
@@ -7187,17 +7583,26 @@ SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...);
** subsystem. The page cache subsystem reads and writes a file a page
** at a time and provides a journal for rollback.
**
-** @(#) $Id: pager.h,v 1.72 2008/05/01 17:03:49 drh Exp $
+** @(#) $Id: pager.h,v 1.104 2009/07/24 19:01:19 drh Exp $
*/
#ifndef _PAGER_H_
#define _PAGER_H_
/*
+** Default maximum size for persistent journal files. A negative
+** value means no limit. This value may be overridden using the
+** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit".
+*/
+#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
+ #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1
+#endif
+
+/*
** The type used to represent a page number. The first page in a file
** is called page 1. 0 is used to represent "not a page".
*/
-typedef unsigned int Pgno;
+typedef u32 Pgno;
/*
** Each open file is managed by a separate instance of the "Pager" structure.
@@ -7210,9 +7615,19 @@ typedef struct Pager Pager;
typedef struct PgHdr DbPage;
/*
+** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is
+** reserved for working around a windows/posix incompatibility). It is
+** used in the journal to signify that the remainder of the journal file
+** is devoted to storing a master journal name - there are no more pages to
+** roll back. See comments for function writeMasterJournal() in pager.c
+** for details.
+*/
+#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
+
+/*
** Allowed values for the flags parameter to sqlite3PagerOpen().
**
-** NOTE: This values must match the corresponding BTREE_ values in btree.h.
+** NOTE: These values must match the corresponding BTREE_ values in btree.h.
*/
#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */
#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */
@@ -7231,75 +7646,89 @@ typedef struct PgHdr DbPage;
#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */
#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */
#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */
+#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */
+#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */
/*
-** See source code comments for a detailed description of the following
-** routines:
+** The remainder of this file contains the declarations of the functions
+** that make up the Pager sub-system API. See source code comments for
+** a detailed description of each routine.
*/
-SQLITE_PRIVATE int sqlite3PagerOpen(sqlite3_vfs *, Pager **ppPager, const char*, int,int,int);
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, BusyHandler *pBusyHandler);
-SQLITE_PRIVATE void sqlite3PagerSetDestructor(Pager*, void(*)(DbPage*,int));
-SQLITE_PRIVATE void sqlite3PagerSetReiniter(Pager*, void(*)(DbPage*,int));
-SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u16*);
-SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int);
+
+/* Open and close a Pager connection. */
+SQLITE_PRIVATE int sqlite3PagerOpen(
+ sqlite3_vfs*,
+ Pager **ppPager,
+ const char*,
+ int,
+ int,
+ int,
+ void(*)(DbPage*)
+);
+SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager);
SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
+
+/* Functions used to configure a Pager object. */
+SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
+SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u16*, int);
+SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int);
SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int);
-SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager);
+SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int);
+SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int);
+SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *, int);
+SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64);
+SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*);
+
+/* Functions used to obtain and release page references. */
SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0)
SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno);
-SQLITE_PRIVATE int sqlite3PagerRef(DbPage*);
-SQLITE_PRIVATE int sqlite3PagerUnref(DbPage*);
+SQLITE_PRIVATE void sqlite3PagerRef(DbPage*);
+SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*);
+
+/* Operations on page references. */
SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*);
-SQLITE_PRIVATE int sqlite3PagerPagecount(Pager*);
-SQLITE_PRIVATE int sqlite3PagerTruncate(Pager*,Pgno);
-SQLITE_PRIVATE int sqlite3PagerBegin(DbPage*, int exFlag);
-SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, Pgno, int);
+SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*);
+SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int);
+SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*);
+SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *);
+SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *);
+
+/* Functions used to manage pager transactions and savepoints. */
+SQLITE_PRIVATE int sqlite3PagerPagecount(Pager*, int*);
+SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int);
+SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int);
+SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager);
SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*);
SQLITE_PRIVATE int sqlite3PagerRollback(Pager*);
-SQLITE_PRIVATE int sqlite3PagerIsreadonly(Pager*);
-SQLITE_PRIVATE int sqlite3PagerStmtBegin(Pager*);
-SQLITE_PRIVATE int sqlite3PagerStmtCommit(Pager*);
-SQLITE_PRIVATE int sqlite3PagerStmtRollback(Pager*);
-SQLITE_PRIVATE void sqlite3PagerDontRollback(DbPage*);
-SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*);
+SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n);
+SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint);
+SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager);
+
+/* Functions used to query pager state and configuration. */
+SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*);
SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*);
-SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int);
SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*);
SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*);
SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*);
-SQLITE_PRIVATE const char *sqlite3PagerDirname(Pager*);
SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*);
SQLITE_PRIVATE int sqlite3PagerNosync(Pager*);
-SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno);
-SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *);
-SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *);
-SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int);
-SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *, int);
SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*);
-SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager);
+SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*);
-#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) && !defined(SQLITE_OMIT_DISKIO)
-SQLITE_PRIVATE int sqlite3PagerReleaseMemory(int);
-#endif
-
-#ifdef SQLITE_HAS_CODEC
-SQLITE_PRIVATE void sqlite3PagerSetCodec(Pager*,void*(*)(void*,void*,Pgno,int),void*);
-#endif
+/* Functions used to truncate the database file. */
+SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno);
+/* Functions to support testing and debugging. */
#if !defined(NDEBUG) || defined(SQLITE_TEST)
SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*);
SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*);
#endif
-
#ifdef SQLITE_TEST
SQLITE_PRIVATE int *sqlite3PagerStats(Pager*);
SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*);
-#endif
-
-#ifdef SQLITE_TEST
-void disable_simulated_io_errors(void);
-void enable_simulated_io_errors(void);
+ void disable_simulated_io_errors(void);
+ void enable_simulated_io_errors(void);
#else
# define disable_simulated_io_errors()
# define enable_simulated_io_errors()
@@ -7309,6 +7738,168 @@ void enable_simulated_io_errors(void);
/************** End of pager.h ***********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
+/************** Include pcache.h in the middle of sqliteInt.h ****************/
+/************** Begin file pcache.h ******************************************/
+/*
+** 2008 August 05
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This header file defines the interface that the sqlite page cache
+** subsystem.
+**
+** @(#) $Id: pcache.h,v 1.20 2009/07/25 11:46:49 danielk1977 Exp $
+*/
+
+#ifndef _PCACHE_H_
+
+typedef struct PgHdr PgHdr;
+typedef struct PCache PCache;
+
+/*
+** Every page in the cache is controlled by an instance of the following
+** structure.
+*/
+struct PgHdr {
+ void *pData; /* Content of this page */
+ void *pExtra; /* Extra content */
+ PgHdr *pDirty; /* Transient list of dirty pages */
+ Pgno pgno; /* Page number for this page */
+ Pager *pPager; /* The pager this page is part of */
+#ifdef SQLITE_CHECK_PAGES
+ u32 pageHash; /* Hash of page content */
+#endif
+ u16 flags; /* PGHDR flags defined below */
+
+ /**********************************************************************
+ ** Elements above are public. All that follows is private to pcache.c
+ ** and should not be accessed by other modules.
+ */
+ i16 nRef; /* Number of users of this page */
+ PCache *pCache; /* Cache that owns this page */
+
+ PgHdr *pDirtyNext; /* Next element in list of dirty pages */
+ PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */
+};
+
+/* Bit values for PgHdr.flags */
+#define PGHDR_DIRTY 0x002 /* Page has changed */
+#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before
+ ** writing this page to the database */
+#define PGHDR_NEED_READ 0x008 /* Content is unread */
+#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */
+#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */
+
+/* Initialize and shutdown the page cache subsystem */
+SQLITE_PRIVATE int sqlite3PcacheInitialize(void);
+SQLITE_PRIVATE void sqlite3PcacheShutdown(void);
+
+/* Page cache buffer management:
+** These routines implement SQLITE_CONFIG_PAGECACHE.
+*/
+SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n);
+
+/* Create a new pager cache.
+** Under memory stress, invoke xStress to try to make pages clean.
+** Only clean and unpinned pages can be reclaimed.
+*/
+SQLITE_PRIVATE void sqlite3PcacheOpen(
+ int szPage, /* Size of every page */
+ int szExtra, /* Extra space associated with each page */
+ int bPurgeable, /* True if pages are on backing store */
+ int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */
+ void *pStress, /* Argument to xStress */
+ PCache *pToInit /* Preallocated space for the PCache */
+);
+
+/* Modify the page-size after the cache has been created. */
+SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int);
+
+/* Return the size in bytes of a PCache object. Used to preallocate
+** storage space.
+*/
+SQLITE_PRIVATE int sqlite3PcacheSize(void);
+
+/* One release per successful fetch. Page is pinned until released.
+** Reference counted.
+*/
+SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**);
+SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*);
+
+SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */
+SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */
+SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */
+SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */
+
+/* Change a page number. Used by incr-vacuum. */
+SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno);
+
+/* Remove all pages with pgno>x. Reset the cache if x==0 */
+SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x);
+
+/* Get a list of all dirty pages in the cache, sorted by page number */
+SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*);
+
+/* Reset and close the cache object */
+SQLITE_PRIVATE void sqlite3PcacheClose(PCache*);
+
+/* Clear flags from pages of the page cache */
+SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *);
+
+/* Discard the contents of the cache */
+SQLITE_PRIVATE void sqlite3PcacheClear(PCache*);
+
+/* Return the total number of outstanding page references */
+SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*);
+
+/* Increment the reference count of an existing page */
+SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*);
+
+SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*);
+
+/* Return the total number of pages stored in the cache */
+SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*);
+
+#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
+/* Iterate through all dirty pages currently stored in the cache. This
+** interface is only available if SQLITE_CHECK_PAGES is defined when the
+** library is built.
+*/
+SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *));
+#endif
+
+/* Set and get the suggested cache-size for the specified pager-cache.
+**
+** If no global maximum is configured, then the system attempts to limit
+** the total number of pages cached by purgeable pager-caches to the sum
+** of the suggested cache-sizes.
+*/
+SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int);
+#ifdef SQLITE_TEST
+SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *);
+#endif
+
+#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
+/* Try to return memory used by the pcache module to the main memory heap */
+SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int);
+#endif
+
+#ifdef SQLITE_TEST
+SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*);
+#endif
+
+SQLITE_PRIVATE void sqlite3PCacheSetDefault(void);
+
+#endif /* _PCACHE_H_ */
+
+/************** End of pcache.h **********************************************/
+/************** Continuing where we left off in sqliteInt.h ******************/
/************** Include os.h in the middle of sqliteInt.h ********************/
/************** Begin file os.h **********************************************/
@@ -7330,6 +7921,8 @@ void enable_simulated_io_errors(void);
**
** This header file is #include-ed by sqliteInt.h and thus ends up
** being included by every source file.
+**
+** $Id: os.h,v 1.108 2009/02/05 16:31:46 drh Exp $
*/
#ifndef _SQLITE_OS_H_
#define _SQLITE_OS_H_
@@ -7337,56 +7930,66 @@ void enable_simulated_io_errors(void);
/*
** Figure out if we are dealing with Unix, Windows, or some other
** operating system. After the following block of preprocess macros,
-** all of OS_UNIX, OS_WIN, OS_OS2, and OS_OTHER will defined to either
-** 1 or 0. One of the four will be 1. The other three will be 0.
-*/
-#if defined(OS_OTHER)
-# if OS_OTHER==1
-# undef OS_UNIX
-# define OS_UNIX 0
-# undef OS_WIN
-# define OS_WIN 0
-# undef OS_OS2
-# define OS_OS2 0
+** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, and SQLITE_OS_OTHER
+** will defined to either 1 or 0. One of the four will be 1. The other
+** three will be 0.
+*/
+#if defined(SQLITE_OS_OTHER)
+# if SQLITE_OS_OTHER==1
+# undef SQLITE_OS_UNIX
+# define SQLITE_OS_UNIX 0
+# undef SQLITE_OS_WIN
+# define SQLITE_OS_WIN 0
+# undef SQLITE_OS_OS2
+# define SQLITE_OS_OS2 0
# else
-# undef OS_OTHER
+# undef SQLITE_OS_OTHER
# endif
#endif
-#if !defined(OS_UNIX) && !defined(OS_OTHER)
-# define OS_OTHER 0
-# ifndef OS_WIN
+#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER)
+# define SQLITE_OS_OTHER 0
+# ifndef SQLITE_OS_WIN
# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
-# define OS_WIN 1
-# define OS_UNIX 0
-# define OS_OS2 0
+# define SQLITE_OS_WIN 1
+# define SQLITE_OS_UNIX 0
+# define SQLITE_OS_OS2 0
# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__)
-# define OS_WIN 0
-# define OS_UNIX 0
-# define OS_OS2 1
+# define SQLITE_OS_WIN 0
+# define SQLITE_OS_UNIX 0
+# define SQLITE_OS_OS2 1
# else
-# define OS_WIN 0
-# define OS_UNIX 1
-# define OS_OS2 0
+# define SQLITE_OS_WIN 0
+# define SQLITE_OS_UNIX 1
+# define SQLITE_OS_OS2 0
# endif
# else
-# define OS_UNIX 0
-# define OS_OS2 0
+# define SQLITE_OS_UNIX 0
+# define SQLITE_OS_OS2 0
# endif
#else
-# ifndef OS_WIN
-# define OS_WIN 0
+# ifndef SQLITE_OS_WIN
+# define SQLITE_OS_WIN 0
# endif
#endif
+/*
+** Determine if we are dealing with WindowsCE - which has a much
+** reduced API.
+*/
+#if defined(_WIN32_WCE)
+# define SQLITE_OS_WINCE 1
+#else
+# define SQLITE_OS_WINCE 0
+#endif
/*
** Define the maximum size of a temporary filename
*/
-#if OS_WIN
+#if SQLITE_OS_WIN
# include <windows.h>
# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50)
-#elif OS_OS2
+#elif SQLITE_OS_OS2
# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY)
# include <os2safe.h> /* has to be included before os2.h for linking to work */
# endif
@@ -7497,9 +8100,7 @@ void enable_simulated_io_errors(void);
** a random byte is selected for a shared lock. The pool of bytes for
** shared locks begins at SHARED_FIRST.
**
-** These #defines are available in sqlite_aux.h so that adaptors for
-** connecting SQLite to other operating systems can use the same byte
-** ranges for locking. In particular, the same locking strategy and
+** The same locking strategy and
** byte ranges are used for Unix. This leaves open the possiblity of having
** clients on win95, winNT, and unix all talking to the same shared file
** and all locking correctly. To do so would require that samba (or whatever
@@ -7523,17 +8124,16 @@ void enable_simulated_io_errors(void);
** 1GB boundary.
**
*/
-#ifndef SQLITE_TEST
-#define PENDING_BYTE 0x40000000 /* First byte past the 1GB boundary */
-#else
-SQLITE_API extern unsigned int sqlite3_pending_byte;
-#define PENDING_BYTE sqlite3_pending_byte
-#endif
-
+#define PENDING_BYTE sqlite3PendingByte
#define RESERVED_BYTE (PENDING_BYTE+1)
#define SHARED_FIRST (PENDING_BYTE+2)
#define SHARED_SIZE 510
+/*
+** Wrapper around OS specific sqlite3_os_init() function.
+*/
+SQLITE_PRIVATE int sqlite3OsInit(void);
+
/*
** Functions for accessing sqlite3_file methods
*/
@@ -7545,8 +8145,9 @@ SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int);
SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize);
SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int);
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
-SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id);
+SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
+#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
@@ -7555,13 +8156,14 @@ SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
*/
SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *);
SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int);
-SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int);
-SQLITE_PRIVATE int sqlite3OsGetTempname(sqlite3_vfs *, int, char *);
+SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut);
SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *);
+#ifndef SQLITE_OMIT_LOAD_EXTENSION
SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *);
SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *);
-SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);
+SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *);
+#endif /* SQLITE_OMIT_LOAD_EXTENSION */
SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *);
SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int);
SQLITE_PRIVATE int sqlite3OsCurrentTime(sqlite3_vfs *, double*);
@@ -7573,16 +8175,6 @@ SQLITE_PRIVATE int sqlite3OsCurrentTime(sqlite3_vfs *, double*);
SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*);
SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *);
-/*
-** Each OS-specific backend defines an instance of the following
-** structure for returning a pointer to its sqlite3_vfs. If OS_OTHER
-** is defined (meaning that the application-defined OS interface layer
-** is used) then there is no default VFS. The application must
-** register one or more VFS structures using sqlite3_vfs_register()
-** before attempting to use SQLite.
-*/
-SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void);
-
#endif /* _SQLITE_OS_H_ */
/************** End of os.h **************************************************/
@@ -7610,28 +8202,21 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void);
** Source files should #include the sqliteInt.h file and let that file
** include this one indirectly.
**
-** $Id: mutex.h,v 1.2 2007/08/30 14:10:30 drh Exp $
+** $Id: mutex.h,v 1.9 2008/10/07 15:25:48 drh Exp $
*/
-#ifdef SQLITE_MUTEX_APPDEF
-/*
-** If SQLITE_MUTEX_APPDEF is defined, then this whole module is
-** omitted and equivalent functionality must be provided by the
-** application that links against the SQLite library.
-*/
-#else
/*
** Figure out what version of the code to use. The choices are
**
-** SQLITE_MUTEX_NOOP For single-threaded applications that
-** do not desire error checking.
+** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The
+** mutexes implemention cannot be overridden
+** at start-time.
**
-** SQLITE_MUTEX_NOOP_DEBUG For single-threaded applications with
-** error checking to help verify that mutexes
-** are being used correctly even though they
-** are not needed. Used when SQLITE_DEBUG is
-** defined on single-threaded builds.
+** SQLITE_MUTEX_NOOP For single-threaded applications. No
+** mutual exclusion is provided. But this
+** implementation can be overridden at
+** start-time.
**
** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix.
**
@@ -7639,25 +8224,22 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void);
**
** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2.
*/
-#define SQLITE_MUTEX_NOOP 1 /* The default */
-#if defined(SQLITE_DEBUG) && !SQLITE_THREADSAFE
-# undef SQLITE_MUTEX_NOOP
-# define SQLITE_MUTEX_NOOP_DEBUG
-#endif
-#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_UNIX
-# undef SQLITE_MUTEX_NOOP
-# define SQLITE_MUTEX_PTHREADS
-#endif
-#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_WIN
-# undef SQLITE_MUTEX_NOOP
-# define SQLITE_MUTEX_W32
-#endif
-#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_OS2
-# undef SQLITE_MUTEX_NOOP
-# define SQLITE_MUTEX_OS2
+#if !SQLITE_THREADSAFE
+# define SQLITE_MUTEX_OMIT
+#endif
+#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP)
+# if SQLITE_OS_UNIX
+# define SQLITE_MUTEX_PTHREADS
+# elif SQLITE_OS_WIN
+# define SQLITE_MUTEX_W32
+# elif SQLITE_OS_OS2
+# define SQLITE_MUTEX_OS2
+# else
+# define SQLITE_MUTEX_NOOP
+# endif
#endif
-#ifdef SQLITE_MUTEX_NOOP
+#ifdef SQLITE_MUTEX_OMIT
/*
** If this is a no-op implementation, implement everything as macros.
*/
@@ -7668,9 +8250,10 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void);
#define sqlite3_mutex_leave(X)
#define sqlite3_mutex_held(X) 1
#define sqlite3_mutex_notheld(X) 1
-#endif
-
-#endif /* SQLITE_MUTEX_APPDEF */
+#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
+#define sqlite3MutexInit() SQLITE_OK
+#define sqlite3MutexEnd()
+#endif /* defined(SQLITE_MUTEX_OMIT) */
/************** End of mutex.h ***********************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
@@ -7687,9 +8270,7 @@ struct Db {
char *zName; /* Name of this database */
Btree *pBt; /* The B*Tree structure for this database file */
u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */
- u8 safety_level; /* How aggressive at synching data to disk */
- void *pAux; /* Auxiliary data. Usually NULL */
- void (*xFreeAux)(void*); /* Routine to free pAux */
+ u8 safety_level; /* How aggressive at syncing data to disk */
Schema *pSchema; /* Pointer to database schema (possibly shared) */
};
@@ -7709,7 +8290,7 @@ struct Schema {
Hash tblHash; /* All tables indexed by name */
Hash idxHash; /* All (named) indices indexed by name */
Hash trigHash; /* All triggers indexed by name */
- Hash aFKey; /* Foreign keys indexed by to-table */
+ Hash fkeyHash; /* All foreign keys by referenced table name */
Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */
u8 file_format; /* Schema format version for this file */
u8 enc; /* Text encoding used by this database */
@@ -7747,7 +8328,51 @@ struct Schema {
** The number of different kinds of things that can be limited
** using the sqlite3_limit() interface.
*/
-#define SQLITE_N_LIMIT (SQLITE_LIMIT_VARIABLE_NUMBER+1)
+#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1)
+
+/*
+** Lookaside malloc is a set of fixed-size buffers that can be used
+** to satisfy small transient memory allocation requests for objects
+** associated with a particular database connection. The use of
+** lookaside malloc provides a significant performance enhancement
+** (approx 10%) by avoiding numerous malloc/free requests while parsing
+** SQL statements.
+**
+** The Lookaside structure holds configuration information about the
+** lookaside malloc subsystem. Each available memory allocation in
+** the lookaside subsystem is stored on a linked list of LookasideSlot
+** objects.
+**
+** Lookaside allocations are only allowed for objects that are associated
+** with a particular database connection. Hence, schema information cannot
+** be stored in lookaside because in shared cache mode the schema information
+** is shared by multiple database connections. Therefore, while parsing
+** schema information, the Lookaside.bEnabled flag is cleared so that
+** lookaside allocations are not used to construct the schema objects.
+*/
+struct Lookaside {
+ u16 sz; /* Size of each buffer in bytes */
+ u8 bEnabled; /* False to disable new lookaside allocations */
+ u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */
+ int nOut; /* Number of buffers currently checked out */
+ int mxOut; /* Highwater mark for nOut */
+ LookasideSlot *pFree; /* List of available buffers */
+ void *pStart; /* First byte of available memory space */
+ void *pEnd; /* First byte past end of available space */
+};
+struct LookasideSlot {
+ LookasideSlot *pNext; /* Next buffer in the list of free buffers */
+};
+
+/*
+** A hash table for function definitions.
+**
+** Hash each FuncDef structure into one of the FuncDefHash.a[] slots.
+** Collisions are on the FuncDef.pHash chain.
+*/
+struct FuncDefHash {
+ FuncDef *a[23]; /* Hash table for functions */
+};
/*
** Each database is an instance of the following structure.
@@ -7779,7 +8404,7 @@ struct sqlite3 {
sqlite3_vfs *pVfs; /* OS Interface */
int nDb; /* Number of backends currently in use */
Db *aDb; /* All backends */
- int flags; /* Miscellanous flags. See below */
+ int flags; /* Miscellaneous flags. See below */
int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */
int errCode; /* Most recent error code (SQLITE_*) */
int errMask; /* & result codes with this before returning */
@@ -7793,8 +8418,7 @@ struct sqlite3 {
int nTable; /* Number of tables in the database */
CollSeq *pDfltColl; /* The default collating sequence (BINARY) */
i64 lastRowid; /* ROWID of most recent insert (see above) */
- i64 priorNewRowid; /* Last randomly generated ROWID */
- int magic; /* Magic number for detect library misuse */
+ u32 magic; /* Magic number for detect library misuse */
int nChange; /* Value returned by sqlite3_changes() */
int nTotalChange; /* Value returned by sqlite3_total_changes() */
sqlite3_mutex *mutex; /* Connection mutex */
@@ -7803,11 +8427,13 @@ struct sqlite3 {
int iDb; /* When back is being initialized */
int newTnum; /* Rootpage of table being initialized */
u8 busy; /* TRUE if currently initializing */
+ u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */
} init;
int nExtension; /* Number of loaded extensions */
- void **aExtension; /* Array of shared libraray handles */
+ void **aExtension; /* Array of shared library handles */
struct Vdbe *pVdbe; /* List of active virtual machines */
- int activeVdbeCnt; /* Number of vdbes currently executing */
+ int activeVdbeCnt; /* Number of VDBEs currently executing */
+ int writeVdbeCnt; /* Number of active VDBEs that are writing */
void (*xTrace)(void*,const char*); /* Trace function */
void *pTraceArg; /* Argument to the trace function */
void (*xProfile)(void*,const char*,u64); /* Profiling function */
@@ -7825,9 +8451,10 @@ struct sqlite3 {
char *zErrMsg; /* Most recent error message (UTF-8 encoded) */
char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */
union {
- int isInterrupted; /* True if sqlite3_interrupt has been called */
+ volatile int isInterrupted; /* True if sqlite3_interrupt has been called */
double notUsed1; /* Spacer */
} u1;
+ Lookaside lookaside; /* Lookaside malloc configuration */
#ifndef SQLITE_OMIT_AUTHORIZATION
int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
/* Access authorization function */
@@ -7841,16 +8468,37 @@ struct sqlite3 {
#ifndef SQLITE_OMIT_VIRTUALTABLE
Hash aModule; /* populated by sqlite3_create_module() */
Table *pVTab; /* vtab with active Connect/Create method */
- sqlite3_vtab **aVTrans; /* Virtual tables with open transactions */
+ VTable **aVTrans; /* Virtual tables with open transactions */
int nVTrans; /* Allocated size of aVTrans */
+ VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
#endif
- Hash aFunc; /* All functions that can be in SQL exprs */
+ FuncDefHash aFunc; /* Hash table of connection functions */
Hash aCollSeq; /* All collating sequences */
BusyHandler busyHandler; /* Busy callback */
int busyTimeout; /* Busy handler timeout, in msec */
Db aDbStatic[2]; /* Static space for the 2 default backends */
-#ifdef SQLITE_SSE
- sqlite3_stmt *pFetch; /* Used by SSE to fetch stored statements */
+ Savepoint *pSavepoint; /* List of active savepoints */
+ int nSavepoint; /* Number of non-transaction savepoints */
+ int nStatement; /* Number of nested statement-transactions */
+ u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */
+ i64 nDeferredCons; /* Net deferred constraints this transaction. */
+
+#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
+ /* The following variables are all protected by the STATIC_MASTER
+ ** mutex, not by sqlite3.mutex. They are used by code in notify.c.
+ **
+ ** When X.pUnlockConnection==Y, that means that X is waiting for Y to
+ ** unlock so that it can proceed.
+ **
+ ** When X.pBlockingConnection==Y, that means that something that X tried
+ ** tried to do recently failed with an SQLITE_LOCKED error due to locks
+ ** held by Y.
+ */
+ sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */
+ sqlite3 *pUnlockConnection; /* Connection to watch for unlock */
+ void *pUnlockArg; /* Argument to xUnlockNotify */
+ void (*xUnlockNotify)(void **, int); /* Unlock notify callback */
+ sqlite3 *pNextBlocked; /* Next in list of all blocked connections */
#endif
};
@@ -7888,8 +8536,9 @@ struct sqlite3 {
#define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */
#define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */
-#define SQLITE_SharedCache 0x00080000 /* Cache sharing is enabled */
-#define SQLITE_Vtab 0x00100000 /* There exists a virtual table */
+#define SQLITE_ReverseOrder 0x00100000 /* Reverse unordered SELECTs */
+#define SQLITE_RecTriggers 0x00200000 /* Enable recursive triggers */
+#define SQLITE_ForeignKeys 0x00400000 /* Enforce foreign key constraints */
/*
** Possible values for the sqlite.magic field.
@@ -7911,17 +8560,85 @@ struct sqlite3 {
struct FuncDef {
i16 nArg; /* Number of arguments. -1 means unlimited */
u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */
- u8 needCollSeq; /* True if sqlite3GetFuncCollSeq() might be called */
u8 flags; /* Some combination of SQLITE_FUNC_* */
void *pUserData; /* User data parameter */
FuncDef *pNext; /* Next function with same name */
void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */
void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */
- void (*xFinalize)(sqlite3_context*); /* Aggregate finializer */
- char zName[1]; /* SQL name of the function. MUST BE LAST */
+ void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */
+ char *zName; /* SQL name of the function. */
+ FuncDef *pHash; /* Next with a different name but the same hash */
};
/*
+** Possible values for FuncDef.flags
+*/
+#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */
+#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */
+#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */
+#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */
+#define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */
+#define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */
+
+/*
+** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
+** used to create the initializers for the FuncDef structures.
+**
+** FUNCTION(zName, nArg, iArg, bNC, xFunc)
+** Used to create a scalar function definition of a function zName
+** implemented by C function xFunc that accepts nArg arguments. The
+** value passed as iArg is cast to a (void*) and made available
+** as the user-data (sqlite3_user_data()) for the function. If
+** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set.
+**
+** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal)
+** Used to create an aggregate function definition implemented by
+** the C functions xStep and xFinal. The first four parameters
+** are interpreted in the same way as the first 4 parameters to
+** FUNCTION().
+**
+** LIKEFUNC(zName, nArg, pArg, flags)
+** Used to create a scalar function definition of a function zName
+** that accepts nArg arguments and is implemented by a call to C
+** function likeFunc. Argument pArg is cast to a (void *) and made
+** available as the function user-data (sqlite3_user_data()). The
+** FuncDef.flags variable is set to the value passed as the flags
+** parameter.
+*/
+#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
+ {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0}
+#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
+ {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \
+ pArg, 0, xFunc, 0, 0, #zName, 0}
+#define LIKEFUNC(zName, nArg, arg, flags) \
+ {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0}
+#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \
+ {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \
+ SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0}
+
+/*
+** All current savepoints are stored in a linked list starting at
+** sqlite3.pSavepoint. The first element in the list is the most recently
+** opened savepoint. Savepoints are added to the list by the vdbe
+** OP_Savepoint instruction.
+*/
+struct Savepoint {
+ char *zName; /* Savepoint name (nul-terminated) */
+ i64 nDeferredCons; /* Number of deferred fk violations */
+ Savepoint *pNext; /* Parent savepoint (if any) */
+};
+
+/*
+** The following are used as the second parameter to sqlite3Savepoint(),
+** and as the P1 argument to the OP_Savepoint instruction.
+*/
+#define SAVEPOINT_BEGIN 0
+#define SAVEPOINT_RELEASE 1
+#define SAVEPOINT_ROLLBACK 2
+
+
+/*
** Each SQLite module (virtual table definition) is defined by an
** instance of the following structure, stored in the sqlite3.aModule
** hash table.
@@ -7934,19 +8651,13 @@ struct Module {
};
/*
-** Possible values for FuncDef.flags
-*/
-#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */
-#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */
-#define SQLITE_FUNC_EPHEM 0x04 /* Ephermeral. Delete with VDBE */
-
-/*
** information about each column of an SQL table is held in an instance
** of this structure.
*/
struct Column {
char *zName; /* Name of this column */
Expr *pDflt; /* Default value of this column */
+ char *zDflt; /* Original text of the default value */
char *zType; /* Data type for this column */
char *zColl; /* Collating sequence. If NULL, use the default */
u8 notNull; /* True if there is a NOT NULL constraint */
@@ -7962,7 +8673,7 @@ struct Column {
** structure. Conceptually, a collating sequence consists of a name and
** a comparison routine that defines the order of that sequence.
**
-** There may two seperate implementations of the collation function, one
+** There may two separate implementations of the collation function, one
** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that
** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine
** native byte order. When a collation sequence is invoked, SQLite selects
@@ -7988,7 +8699,7 @@ struct CollSeq {
};
/*
-** Allowed values of CollSeq flags:
+** Allowed values of CollSeq.type:
*/
#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */
#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */
@@ -8006,7 +8717,7 @@ struct CollSeq {
**
** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and
** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve
-** the speed a little by number the values consecutively.
+** the speed a little by numbering the values consecutively.
**
** But rather than start with 0 or 1, we begin with 'a'. That way,
** when multiple affinity types are concatenated into a string and
@@ -8034,8 +8745,58 @@ struct CollSeq {
** changing the affinity.
*/
#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */
-#define SQLITE_NULLEQUAL 0x10 /* compare NULLs equal */
-#define SQLITE_STOREP2 0x80 /* Store result in reg[P2] rather than jump */
+#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */
+#define SQLITE_NULLEQ 0x80 /* NULL=NULL */
+
+/*
+** An object of this type is created for each virtual table present in
+** the database schema.
+**
+** If the database schema is shared, then there is one instance of this
+** structure for each database connection (sqlite3*) that uses the shared
+** schema. This is because each database connection requires its own unique
+** instance of the sqlite3_vtab* handle used to access the virtual table
+** implementation. sqlite3_vtab* handles can not be shared between
+** database connections, even when the rest of the in-memory database
+** schema is shared, as the implementation often stores the database
+** connection handle passed to it via the xConnect() or xCreate() method
+** during initialization internally. This database connection handle may
+** then used by the virtual table implementation to access real tables
+** within the database. So that they appear as part of the callers
+** transaction, these accesses need to be made via the same database
+** connection as that used to execute SQL operations on the virtual table.
+**
+** All VTable objects that correspond to a single table in a shared
+** database schema are initially stored in a linked-list pointed to by
+** the Table.pVTable member variable of the corresponding Table object.
+** When an sqlite3_prepare() operation is required to access the virtual
+** table, it searches the list for the VTable that corresponds to the
+** database connection doing the preparing so as to use the correct
+** sqlite3_vtab* handle in the compiled query.
+**
+** When an in-memory Table object is deleted (for example when the
+** schema is being reloaded for some reason), the VTable objects are not
+** deleted and the sqlite3_vtab* handles are not xDisconnect()ed
+** immediately. Instead, they are moved from the Table.pVTable list to
+** another linked list headed by the sqlite3.pDisconnect member of the
+** corresponding sqlite3 structure. They are then deleted/xDisconnected
+** next time a statement is prepared using said sqlite3*. This is done
+** to avoid deadlock issues involving multiple sqlite3.mutex mutexes.
+** Refer to comments above function sqlite3VtabUnlockList() for an
+** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect
+** list without holding the corresponding sqlite3.mutex mutex.
+**
+** The memory for objects of this type is always allocated by
+** sqlite3DbMalloc(), using the connection handle stored in VTable.db as
+** the first argument.
+*/
+struct VTable {
+ sqlite3 *db; /* Database connection associated with this table */
+ Module *pMod; /* Pointer to module implementation */
+ sqlite3_vtab *pVtab; /* Pointer to vtab instance */
+ int nRef; /* Number of pointers to this structure */
+ VTable *pNext; /* Next in linked list (see above) */
+};
/*
** Each SQL table is represented in memory by an instance of the
@@ -8053,14 +8814,14 @@ struct CollSeq {
** that the datatype of the PRIMARY KEY must be INTEGER for this field to
** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of
** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid
-** is generated for each row of the table. Table.hasPrimKey is true if
+** is generated for each row of the table. TF_HasPrimaryKey is set if
** the table has any PRIMARY KEY, INTEGER or otherwise.
**
** Table.tnum is the page number for the root BTree page of the table in the
** database file. If Table.iDb is the index of the database table backend
** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that
-** holds temporary tables and indices. If Table.isEphem
-** is true, then the table is stored in a file that is automatically deleted
+** holds temporary tables and indices. If TF_Ephemeral is set
+** then the table is stored in a file that is automatically deleted
** when the VDBE cursor to the table is closed. In this case Table.tnum
** refers VDBE cursor number that holds the table open, not to the root
** page number. Transient tables are used to hold the results of a
@@ -8068,46 +8829,54 @@ struct CollSeq {
** of a SELECT statement.
*/
struct Table {
- char *zName; /* Name of the table */
- int nCol; /* Number of columns in this table */
- Column *aCol; /* Information about each column */
- int iPKey; /* If not less then 0, use aCol[iPKey] as the primary key */
- Index *pIndex; /* List of SQL indexes on this table. */
- int tnum; /* Root BTree node for this table (see note above) */
- Select *pSelect; /* NULL for tables. Points to definition if a view. */
- int nRef; /* Number of pointers to this Table */
- Trigger *pTrigger; /* List of SQL triggers on this table */
- FKey *pFKey; /* Linked list of all foreign keys in this table */
- char *zColAff; /* String defining the affinity of each column */
+ sqlite3 *dbMem; /* DB connection used for lookaside allocations. */
+ char *zName; /* Name of the table or view */
+ int iPKey; /* If not negative, use aCol[iPKey] as the primary key */
+ int nCol; /* Number of columns in this table */
+ Column *aCol; /* Information about each column */
+ Index *pIndex; /* List of SQL indexes on this table. */
+ int tnum; /* Root BTree node for this table (see note above) */
+ Select *pSelect; /* NULL for tables. Points to definition if a view. */
+ u16 nRef; /* Number of pointers to this Table */
+ u8 tabFlags; /* Mask of TF_* values */
+ u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */
+ FKey *pFKey; /* Linked list of all foreign keys in this table */
+ char *zColAff; /* String defining the affinity of each column */
#ifndef SQLITE_OMIT_CHECK
- Expr *pCheck; /* The AND of all CHECK constraints */
+ Expr *pCheck; /* The AND of all CHECK constraints */
#endif
#ifndef SQLITE_OMIT_ALTERTABLE
- int addColOffset; /* Offset in CREATE TABLE statement to add a new column */
+ int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */
#endif
- u8 readOnly; /* True if this table should not be written by the user */
- u8 isEphem; /* True if created using OP_OpenEphermeral */
- u8 hasPrimKey; /* True if there exists a primary key */
- u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */
- u8 autoInc; /* True if the integer primary key is autoincrement */
#ifndef SQLITE_OMIT_VIRTUALTABLE
- u8 isVirtual; /* True if this is a virtual table */
- u8 isCommit; /* True once the CREATE TABLE has been committed */
- Module *pMod; /* Pointer to the implementation of the module */
- sqlite3_vtab *pVtab; /* Pointer to the module instance */
- int nModuleArg; /* Number of arguments to the module */
- char **azModuleArg; /* Text of all module args. [0] is module name */
-#endif
- Schema *pSchema; /* Schema that contains this table */
+ VTable *pVTable; /* List of VTable objects. */
+ int nModuleArg; /* Number of arguments to the module */
+ char **azModuleArg; /* Text of all module args. [0] is module name */
+#endif
+ Trigger *pTrigger; /* List of triggers stored in pSchema */
+ Schema *pSchema; /* Schema that contains this table */
+ Table *pNextZombie; /* Next on the Parse.pZombieTab list */
};
/*
+** Allowed values for Tabe.tabFlags.
+*/
+#define TF_Readonly 0x01 /* Read-only system table */
+#define TF_Ephemeral 0x02 /* An ephemeral table */
+#define TF_HasPrimaryKey 0x04 /* Table has a primary key */
+#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */
+#define TF_Virtual 0x10 /* Is a virtual table */
+#define TF_NeedMetadata 0x20 /* aCol[].zType and aCol[].pColl missing */
+
+
+
+/*
** Test to see whether or not a table is a virtual table. This is
** done as a macro so that it will be optimized out when virtual
** table support is omitted from the build.
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
-# define IsVirtual(X) ((X)->isVirtual)
+# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0)
# define IsHiddenColumn(X) ((X)->isHidden)
#else
# define IsVirtual(X) 0
@@ -8131,28 +8900,23 @@ struct Table {
**
** Each REFERENCES clause generates an instance of the following structure
** which is attached to the from-table. The to-table need not exist when
-** the from-table is created. The existance of the to-table is not checked
-** until an attempt is made to insert data into the from-table.
-**
-** The sqlite.aFKey hash table stores pointers to this structure
-** given the name of a to-table. For each to-table, all foreign keys
-** associated with that table are on a linked list using the FKey.pNextTo
-** field.
+** the from-table is created. The existence of the to-table is not checked.
*/
struct FKey {
- Table *pFrom; /* The table that constains the REFERENCES clause */
+ Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */
FKey *pNextFrom; /* Next foreign key in pFrom */
- char *zTo; /* Name of table that the key points to */
- FKey *pNextTo; /* Next foreign key that points to zTo */
+ char *zTo; /* Name of table that the key points to (aka: Parent) */
+ FKey *pNextTo; /* Next foreign key on table named zTo */
+ FKey *pPrevTo; /* Previous foreign key on table named zTo */
int nCol; /* Number of columns in this key */
+ /* EV: R-30323-21917 */
+ u8 isDeferred; /* True if constraint checking is deferred till COMMIT */
+ u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */
+ Trigger *apTrigger[2]; /* Triggers for aAction[] actions */
struct sColMap { /* Mapping of columns in pFrom to columns in zTo */
int iFrom; /* Index of column in pFrom */
char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */
- } *aCol; /* One entry for each of nCol column s */
- u8 isDeferred; /* True if constraint checking is deferred till COMMIT */
- u8 updateConf; /* How to resolve conflicts that occur on UPDATE */
- u8 deleteConf; /* How to resolve conflicts that occur on DELETE */
- u8 insertConf; /* How to resolve conflicts that occur on INSERT */
+ } aCol[1]; /* One entry for each of nCol column s */
};
/*
@@ -8199,22 +8963,48 @@ struct FKey {
** An instance of the following structure is passed as the first
** argument to sqlite3VdbeKeyCompare and is used to control the
** comparison of the two index keys.
-**
-** If the KeyInfo.incrKey value is true and the comparison would
-** otherwise be equal, then return a result as if the second key
-** were larger.
*/
struct KeyInfo {
sqlite3 *db; /* The database connection */
u8 enc; /* Text encoding - one of the TEXT_Utf* values */
- u8 incrKey; /* Increase 2nd key by epsilon before comparison */
- u8 prefixIsEqual; /* Treat a prefix as equal */
- int nField; /* Number of entries in aColl[] */
+ u16 nField; /* Number of entries in aColl[] */
u8 *aSortOrder; /* If defined an aSortOrder[i] is true, sort DESC */
CollSeq *aColl[1]; /* Collating sequence for each term of the key */
};
/*
+** An instance of the following structure holds information about a
+** single index record that has already been parsed out into individual
+** values.
+**
+** A record is an object that contains one or more fields of data.
+** Records are used to store the content of a table row and to store
+** the key of an index. A blob encoding of a record is created by
+** the OP_MakeRecord opcode of the VDBE and is disassembled by the
+** OP_Column opcode.
+**
+** This structure holds a record that has already been disassembled
+** into its constituent fields.
+*/
+struct UnpackedRecord {
+ KeyInfo *pKeyInfo; /* Collation and sort-order information */
+ u16 nField; /* Number of entries in apMem[] */
+ u16 flags; /* Boolean settings. UNPACKED_... below */
+ i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */
+ Mem *aMem; /* Values */
+};
+
+/*
+** Allowed values of UnpackedRecord.flags
+*/
+#define UNPACKED_NEED_FREE 0x0001 /* Memory is from sqlite3Malloc() */
+#define UNPACKED_NEED_DESTROY 0x0002 /* apMem[]s should all be destroyed */
+#define UNPACKED_IGNORE_ROWID 0x0004 /* Ignore trailing rowid on key1 */
+#define UNPACKED_INCRKEY 0x0008 /* Make this key an epsilon larger */
+#define UNPACKED_PREFIX_MATCH 0x0010 /* A prefix match is considered OK */
+#define UNPACKED_PREFIX_SEARCH 0x0020 /* A prefix match is considered OK */
+
+/*
** Each SQL index is represented in memory by an
** instance of the following structure.
**
@@ -8254,6 +9044,20 @@ struct Index {
Schema *pSchema; /* Schema containing this index */
u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */
char **azColl; /* Array of collation sequence names for index */
+ IndexSample *aSample; /* Array of SQLITE_INDEX_SAMPLES samples */
+};
+
+/*
+** Each sample stored in the sqlite_stat2 table is represented in memory
+** using a structure of this type.
+*/
+struct IndexSample {
+ union {
+ char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */
+ double r; /* Value if eType is SQLITE_FLOAT or SQLITE_INTEGER */
+ } u;
+ u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */
+ u8 nByte; /* Size in byte of text or blob. */
};
/*
@@ -8261,13 +9065,12 @@ struct Index {
** this structure. Tokens are also used as part of an expression.
**
** Note if Token.z==0 then Token.dyn and Token.n are undefined and
-** may contain random values. Do not make any assuptions about Token.dyn
+** may contain random values. Do not make any assumptions about Token.dyn
** and Token.n when Token.z==0.
*/
struct Token {
- const unsigned char *z; /* Text of the token. Not NULL-terminated! */
- unsigned dyn : 1; /* True for malloced memory, false for static */
- unsigned n : 31; /* Number of characters in this token */
+ const char *z; /* Text of the token. Not NULL-terminated! */
+ unsigned int n; /* Number of characters in this token */
};
/*
@@ -8308,7 +9111,7 @@ struct AggInfo {
Expr *pExpr; /* Expression encoding the function */
FuncDef *pFunc; /* The aggregate function implementation */
int iMem; /* Memory location that acts as accumulator */
- int iDistinct; /* Ephermeral table used to enforce DISTINCT */
+ int iDistinct; /* Ephemeral table used to enforce DISTINCT */
} *aFunc;
int nFunc; /* Number of entries in aFunc[] */
int nFuncAlloc; /* Number of slots allocated for aFunc[] */
@@ -8318,19 +9121,27 @@ struct AggInfo {
** Each node of an expression in the parse tree is an instance
** of this structure.
**
-** Expr.op is the opcode. The integer parser token codes are reused
-** as opcodes here. For example, the parser defines TK_GE to be an integer
-** code representing the ">=" operator. This same integer code is reused
+** Expr.op is the opcode. The integer parser token codes are reused
+** as opcodes here. For example, the parser defines TK_GE to be an integer
+** code representing the ">=" operator. This same integer code is reused
** to represent the greater-than-or-equal-to operator in the expression
** tree.
**
-** Expr.pRight and Expr.pLeft are subexpressions. Expr.pList is a list
-** of argument if the expression is a function.
+** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB,
+** or TK_STRING), then Expr.token contains the text of the SQL literal. If
+** the expression is a variable (TK_VARIABLE), then Expr.token contains the
+** variable name. Finally, if the expression is an SQL function (TK_FUNCTION),
+** then Expr.token contains the name of the function.
**
-** Expr.token is the operator token for this node. For some expressions
-** that have subexpressions, Expr.token can be the complete text that gave
-** rise to the Expr. In the latter case, the token is marked as being
-** a compound token.
+** Expr.pRight and Expr.pLeft are the left and right subexpressions of a
+** binary operator. Either or both may be NULL.
+**
+** Expr.x.pList is a list of arguments if the expression is an SQL function,
+** a CASE expression or an IN expression of the form "<lhs> IN (<y>, <z>...)".
+** Expr.x.pSelect is used if the expression is a sub-select or an expression of
+** the form "<lhs> IN (SELECT ...)". If the EP_xIsSelect bit is set in the
+** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is
+** valid.
**
** An expression of the form ID or ID.ID refers to a column in a table.
** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is
@@ -8340,10 +9151,9 @@ struct AggInfo {
** value is also stored in the Expr.iAgg column in the aggregate so that
** it can be accessed after all aggregates are computed.
**
-** If the expression is a function, the Expr.iTable is an integer code
-** representing which function. If the expression is an unbound variable
-** marker (a question mark character '?' in the original SQL) then the
-** Expr.iTable holds the index number for that variable.
+** If the expression is an unbound variable marker (a question mark
+** character '?' in the original SQL) then the Expr.iTable holds the index
+** number for that variable.
**
** If the expression is a subquery then Expr.iColumn holds an integer
** register number containing the result of the subquery. If the
@@ -8351,35 +9161,63 @@ struct AggInfo {
** gives a different answer at different times during statement processing
** then iTable is the address of a subroutine that computes the subquery.
**
-** The Expr.pSelect field points to a SELECT statement. The SELECT might
-** be the right operand of an IN operator. Or, if a scalar SELECT appears
-** in an expression the opcode is TK_SELECT and Expr.pSelect is the only
-** operand.
-**
** If the Expr is of type OP_Column, and the table it is selecting from
** is a disk table or the "old.*" pseudo-table, then pTab points to the
** corresponding table definition.
+**
+** ALLOCATION NOTES:
+**
+** Expr objects can use a lot of memory space in database schema. To
+** help reduce memory requirements, sometimes an Expr object will be
+** truncated. And to reduce the number of memory allocations, sometimes
+** two or more Expr objects will be stored in a single memory allocation,
+** together with Expr.zToken strings.
+**
+** If the EP_Reduced and EP_TokenOnly flags are set when
+** an Expr object is truncated. When EP_Reduced is set, then all
+** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees
+** are contained within the same memory allocation. Note, however, that
+** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately
+** allocated, regardless of whether or not EP_Reduced is set.
*/
struct Expr {
u8 op; /* Operation performed by this node */
char affinity; /* The affinity of the column or 0 if not a column */
- u16 flags; /* Various flags. See below */
+ u16 flags; /* Various flags. EP_* See below */
+ union {
+ char *zToken; /* Token value. Zero terminated and dequoted */
+ int iValue; /* Integer value if EP_IntValue */
+ } u;
+
+ /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no
+ ** space is allocated for the fields below this point. An attempt to
+ ** access them will result in a segfault or malfunction.
+ *********************************************************************/
+
+ Expr *pLeft; /* Left subnode */
+ Expr *pRight; /* Right subnode */
+ union {
+ ExprList *pList; /* Function arguments or in "<expr> IN (<expr-list)" */
+ Select *pSelect; /* Used for sub-selects and "<expr> IN (<select>)" */
+ } x;
CollSeq *pColl; /* The collation type of the column or 0 */
- Expr *pLeft, *pRight; /* Left and right subnodes */
- ExprList *pList; /* A list of expressions used as function arguments
- ** or in "<expr> IN (<expr-list)" */
- Token token; /* An operand token */
- Token span; /* Complete text of the expression */
- int iTable, iColumn; /* When op==TK_COLUMN, then this expr node means the
- ** iColumn-th field of the iTable-th table. */
+
+ /* If the EP_Reduced flag is set in the Expr.flags mask, then no
+ ** space is allocated for the fields below this point. An attempt to
+ ** access them will result in a segfault or malfunction.
+ *********************************************************************/
+
+ int iTable; /* TK_COLUMN: cursor number of table holding column
+ ** TK_REGISTER: register number
+ ** TK_TRIGGER: 1 -> new, 0 -> old */
+ i16 iColumn; /* TK_COLUMN: column index. -1 for rowid */
+ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
+ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */
+ u8 flags2; /* Second set of flags. EP2_... */
+ u8 op2; /* If a TK_REGISTER, the original value of Expr.op */
AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
- int iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
- int iRightJoinTable; /* If EP_FromJoin, the right table of the join */
- Select *pSelect; /* When the expression is a sub-select. Also the
- ** right side of "<expr> IN (<select>)" */
- Table *pTab; /* Table for OP_Column expressions. */
-/* Schema *pSchema; */
-#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0
+ Table *pTab; /* Table for TK_COLUMN expressions. */
+#if SQLITE_MAX_EXPR_DEPTH>0
int nHeight; /* Height of the tree headed by this node */
#endif
};
@@ -8393,11 +9231,35 @@ struct Expr {
#define EP_Error 0x0008 /* Expression contains one or more errors */
#define EP_Distinct 0x0010 /* Aggregate function with DISTINCT keyword */
#define EP_VarSelect 0x0020 /* pSelect is correlated, not constant */
-#define EP_Dequoted 0x0040 /* True if the string has been dequoted */
+#define EP_DblQuoted 0x0040 /* token.z was originally in "..." */
#define EP_InfixFunc 0x0080 /* True for an infix function: LIKE, GLOB, etc */
#define EP_ExpCollate 0x0100 /* Collating sequence specified explicitly */
#define EP_AnyAff 0x0200 /* Can take a cached column of any affinity */
#define EP_FixedDest 0x0400 /* Result needed in a specific register */
+#define EP_IntValue 0x0800 /* Integer value contained in u.iValue */
+#define EP_xIsSelect 0x1000 /* x.pSelect is valid (otherwise x.pList is) */
+
+#define EP_Reduced 0x2000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */
+#define EP_TokenOnly 0x4000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */
+#define EP_Static 0x8000 /* Held in memory not obtained from malloc() */
+
+/*
+** The following are the meanings of bits in the Expr.flags2 field.
+*/
+#define EP2_MallocedToken 0x0001 /* Need to sqlite3DbFree() Expr.zToken */
+#define EP2_Irreducible 0x0002 /* Cannot EXPRDUP_REDUCE this Expr */
+
+/*
+** The pseudo-routine sqlite3ExprSetIrreducible sets the EP2_Irreducible
+** flag on an expression structure. This flag is used for VV&A only. The
+** routine is implemented as a macro that only works when in debugging mode,
+** so as not to burden production code.
+*/
+#ifdef SQLITE_DEBUG
+# define ExprSetIrreducible(X) (X)->flags2 |= EP2_Irreducible
+#else
+# define ExprSetIrreducible(X)
+#endif
/*
** These macros can be used to test, set, or clear bits in the
@@ -8409,6 +9271,21 @@ struct Expr {
#define ExprClearProperty(E,P) (E)->flags&=~(P)
/*
+** Macros to determine the number of bytes required by a normal Expr
+** struct, an Expr struct with the EP_Reduced flag set in Expr.flags
+** and an Expr struct with the EP_TokenOnly flag set.
+*/
+#define EXPR_FULLSIZE sizeof(Expr) /* Full size */
+#define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */
+#define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */
+
+/*
+** Flags passed to the sqlite3ExprDup() function. See the header comment
+** above sqlite3ExprDup() for details.
+*/
+#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */
+
+/*
** A list of expressions. Each expression may optionally have a
** name. An expr/name combination can be used in several ways, such
** as the list of "expr AS ID" fields following a "SELECT" or in the
@@ -8423,13 +9300,26 @@ struct ExprList {
struct ExprList_item {
Expr *pExpr; /* The list of expressions */
char *zName; /* Token associated with this expression */
+ char *zSpan; /* Original text of the expression */
u8 sortOrder; /* 1 for DESC or 0 for ASC */
- u8 isAgg; /* True if this is an aggregate like count(*) */
u8 done; /* A flag to indicate when processing is finished */
+ u16 iCol; /* For ORDER BY, column number in result set */
+ u16 iAlias; /* Index into Parse.aAlias[] for zName */
} *a; /* One entry for each expression */
};
/*
+** An instance of this structure is used by the parser to record both
+** the parse tree for an expression and the span of input text for an
+** expression.
+*/
+struct ExprSpan {
+ Expr *pExpr; /* The expression parse tree */
+ const char *zStart; /* First character of input text */
+ const char *zEnd; /* One character past the end of input text */
+};
+
+/*
** An instance of this structure can hold a simple list of identifiers,
** such as the list "a,b,c" in the following statements:
**
@@ -8463,6 +9353,11 @@ struct IdList {
typedef u64 Bitmask;
/*
+** The number of bits in a Bitmask. "BMS" means "BitMask Size".
+*/
+#define BMS ((int)(sizeof(Bitmask)*8))
+
+/*
** The following structure describes the FROM clause of a SELECT statement.
** Each table or subquery in the FROM clause is a separate element of
** the SrcList.a[] array.
@@ -8489,10 +9384,13 @@ struct SrcList {
Select *pSelect; /* A SELECT statement used in place of a table name */
u8 isPopulated; /* Temporary table associated with SELECT is populated */
u8 jointype; /* Type of join between this able and the previous */
+ u8 notIndexed; /* True if there is a NOT INDEXED clause */
int iCursor; /* The VDBE cursor number used to access this table */
Expr *pOn; /* The ON clause of a join */
IdList *pUsing; /* The USING clause of a join */
- Bitmask colUsed; /* Bit N (1<<N) set if column N or pTab is used */
+ Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used */
+ char *zIndex; /* Identifier from "INDEXED BY <zIndex>" clause */
+ Index *pIndex; /* Index structure corresponding to zIndex, if any */
} a[1]; /* One entry for each identifier on the list */
};
@@ -8507,60 +9405,87 @@ struct SrcList {
#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */
#define JT_ERROR 0x0040 /* unknown or unsupported join type */
+
+/*
+** A WherePlan object holds information that describes a lookup
+** strategy.
+**
+** This object is intended to be opaque outside of the where.c module.
+** It is included here only so that that compiler will know how big it
+** is. None of the fields in this object should be used outside of
+** the where.c module.
+**
+** Within the union, pIdx is only used when wsFlags&WHERE_INDEXED is true.
+** pTerm is only used when wsFlags&WHERE_MULTI_OR is true. And pVtabIdx
+** is only used when wsFlags&WHERE_VIRTUALTABLE is true. It is never the
+** case that more than one of these conditions is true.
+*/
+struct WherePlan {
+ u32 wsFlags; /* WHERE_* flags that describe the strategy */
+ u32 nEq; /* Number of == constraints */
+ union {
+ Index *pIdx; /* Index when WHERE_INDEXED is true */
+ struct WhereTerm *pTerm; /* WHERE clause term for OR-search */
+ sqlite3_index_info *pVtabIdx; /* Virtual table index to use */
+ } u;
+};
+
/*
** For each nested loop in a WHERE clause implementation, the WhereInfo
** structure contains a single instance of this structure. This structure
** is intended to be private the the where.c module and should not be
** access or modified by other modules.
**
-** The pIdxInfo and pBestIdx fields are used to help pick the best
-** index on a virtual table. The pIdxInfo pointer contains indexing
+** The pIdxInfo field is used to help pick the best index on a
+** virtual table. The pIdxInfo pointer contains indexing
** information for the i-th table in the FROM clause before reordering.
** All the pIdxInfo pointers are freed by whereInfoFree() in where.c.
-** The pBestIdx pointer is a copy of pIdxInfo for the i-th table after
-** FROM clause ordering. This is a little confusing so I will repeat
-** it in different words. WhereInfo.a[i].pIdxInfo is index information
-** for WhereInfo.pTabList.a[i]. WhereInfo.a[i].pBestInfo is the
-** index information for the i-th loop of the join. pBestInfo is always
-** either NULL or a copy of some pIdxInfo. So for cleanup it is
-** sufficient to free all of the pIdxInfo pointers.
-**
+** All other information in the i-th WhereLevel object for the i-th table
+** after FROM clause ordering.
*/
struct WhereLevel {
- int iFrom; /* Which entry in the FROM clause */
- int flags; /* Flags associated with this level */
- int iMem; /* First memory cell used by this level */
+ WherePlan plan; /* query plan for this element of the FROM clause */
int iLeftJoin; /* Memory cell used to implement LEFT OUTER JOIN */
- Index *pIdx; /* Index used. NULL if no index */
int iTabCur; /* The VDBE cursor used to access the table */
- int iIdxCur; /* The VDBE cursor used to acesss pIdx */
- int brk; /* Jump here to break out of the loop */
- int nxt; /* Jump here to start the next IN combination */
- int cont; /* Jump here to continue with the next loop cycle */
- int top; /* First instruction of interior of the loop */
- int op, p1, p2; /* Opcode used to terminate the loop */
- int nEq; /* Number of == or IN constraints on this loop */
- int nIn; /* Number of IN operators constraining this loop */
- struct InLoop {
- int iCur; /* The VDBE cursor used by this IN operator */
- int topAddr; /* Top of the IN loop */
- } *aInLoop; /* Information about each nested IN operator */
- sqlite3_index_info *pBestIdx; /* Index information for this level */
+ int iIdxCur; /* The VDBE cursor used to access pIdx */
+ int addrBrk; /* Jump here to break out of the loop */
+ int addrNxt; /* Jump here to start the next IN combination */
+ int addrCont; /* Jump here to continue with the next loop cycle */
+ int addrFirst; /* First instruction of interior of the loop */
+ u8 iFrom; /* Which entry in the FROM clause */
+ u8 op, p5; /* Opcode and P5 of the opcode that ends the loop */
+ int p1, p2; /* Operands of the opcode used to ends the loop */
+ union { /* Information that depends on plan.wsFlags */
+ struct {
+ int nIn; /* Number of entries in aInLoop[] */
+ struct InLoop {
+ int iCur; /* The VDBE cursor used by this IN operator */
+ int addrInTop; /* Top of the IN loop */
+ } *aInLoop; /* Information about each nested IN operator */
+ } in; /* Used when plan.wsFlags&WHERE_IN_ABLE */
+ } u;
/* The following field is really not part of the current level. But
- ** we need a place to cache index information for each table in the
- ** FROM clause and the WhereLevel structure is a convenient place.
+ ** we need a place to cache virtual table index information for each
+ ** virtual table in the FROM clause and the WhereLevel structure is
+ ** a convenient place since there is one WhereLevel for each FROM clause
+ ** element.
*/
sqlite3_index_info *pIdxInfo; /* Index info for n-th source table */
};
/*
-** Flags appropriate for the wflags parameter of sqlite3WhereBegin().
+** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin()
+** and the WhereInfo.wctrlFlags member.
*/
-#define WHERE_ORDERBY_NORMAL 0 /* No-op */
-#define WHERE_ORDERBY_MIN 1 /* ORDER BY processing for min() func */
-#define WHERE_ORDERBY_MAX 2 /* ORDER BY processing for max() func */
-#define WHERE_ONEPASS_DESIRED 4 /* Want to do one-pass UPDATE/DELETE */
+#define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */
+#define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */
+#define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */
+#define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */
+#define WHERE_DUPLICATES_OK 0x0008 /* Ok to return a row more than once */
+#define WHERE_OMIT_OPEN 0x0010 /* Table cursor are already open */
+#define WHERE_OMIT_CLOSE 0x0020 /* Omit close of table & index cursors */
+#define WHERE_FORCE_TABLE 0x0040 /* Do not use an index-only search */
/*
** The WHERE clause processing routine has two halves. The
@@ -8571,14 +9496,15 @@ struct WhereLevel {
*/
struct WhereInfo {
Parse *pParse; /* Parsing and code generating context */
+ u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */
u8 okOnePass; /* Ok to use one-pass algorithm for UPDATE or DELETE */
- SrcList *pTabList; /* List of tables in the join */
- int iTop; /* The very beginning of the WHERE loop */
- int iContinue; /* Jump here to continue with next record */
- int iBreak; /* Jump here to break out of the loop */
- int nLevel; /* Number of nested loop */
- sqlite3_index_info **apInfo; /* Array of pointers to index info structures */
- WhereLevel a[1]; /* Information about each nest loop in the WHERE */
+ SrcList *pTabList; /* List of tables in the join */
+ int iTop; /* The very beginning of the WHERE loop */
+ int iContinue; /* Jump here to continue with next record */
+ int iBreak; /* Jump here to break out of the loop */
+ int nLevel; /* Number of nested loop */
+ struct WhereClause *pWC; /* Decomposition of the WHERE clause */
+ WhereLevel a[1]; /* Information about each nest loop in WHERE */
};
/*
@@ -8639,12 +9565,8 @@ struct NameContext {
struct Select {
ExprList *pEList; /* The fields of the result */
u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */
- u8 isDistinct; /* True if the DISTINCT keyword is present */
- u8 isResolved; /* True once sqlite3SelectResolve() has run. */
- u8 isAgg; /* True if this is an aggregate query */
- u8 usesEphm; /* True if uses an OpenEphemeral opcode */
- u8 disallowOrderBy; /* Do not allow an ORDER BY to be attached if TRUE */
char affinity; /* MakeRecord with this affinity for SRT_Set */
+ u16 selFlags; /* Various SF_* values */
SrcList *pSrc; /* The FROM clause */
Expr *pWhere; /* The WHERE clause */
ExprList *pGroupBy; /* The GROUP BY clause */
@@ -8660,7 +9582,20 @@ struct Select {
};
/*
-** The results of a select can be distributed in several ways.
+** Allowed values for Select.selFlags. The "SF" prefix stands for
+** "Select Flag".
+*/
+#define SF_Distinct 0x0001 /* Output should be DISTINCT */
+#define SF_Resolved 0x0002 /* Identifiers have been resolved */
+#define SF_Aggregate 0x0004 /* Contains aggregate functions */
+#define SF_UsesEphemeral 0x0008 /* Uses the OpenEphemeral opcode */
+#define SF_Expanded 0x0010 /* sqlite3SelectExpand() called on this */
+#define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */
+
+
+/*
+** The results of a select can be distributed in several ways. The
+** "SRT" prefix means "SELECT Result Type".
*/
#define SRT_Union 1 /* Store result as keys in an index */
#define SRT_Except 2 /* Remove result from a UNION index */
@@ -8670,15 +9605,15 @@ struct Select {
/* The ORDER BY clause is ignored for all of the above */
#define IgnorableOrderby(X) ((X->eDest)<=SRT_Discard)
-#define SRT_Callback 5 /* Invoke a callback with each row of result */
+#define SRT_Output 5 /* Output each row of result */
#define SRT_Mem 6 /* Store result in a memory cell */
-#define SRT_Set 7 /* Store non-null results as keys in an index */
+#define SRT_Set 7 /* Store results as keys in an index */
#define SRT_Table 8 /* Store result as data with an automatic rowid */
#define SRT_EphemTab 9 /* Create transient tab and store like SRT_Table */
-#define SRT_Subroutine 10 /* Call a subroutine to handle results */
+#define SRT_Coroutine 10 /* Generate a single row of result */
/*
-** A structure used to customize the behaviour of sqlite3Select(). See
+** A structure used to customize the behavior of sqlite3Select(). See
** comments above sqlite3Select() for details.
*/
typedef struct SelectDest SelectDest;
@@ -8691,6 +9626,54 @@ struct SelectDest {
};
/*
+** During code generation of statements that do inserts into AUTOINCREMENT
+** tables, the following information is attached to the Table.u.autoInc.p
+** pointer of each autoincrement table to record some side information that
+** the code generator needs. We have to keep per-table autoincrement
+** information in case inserts are down within triggers. Triggers do not
+** normally coordinate their activities, but we do need to coordinate the
+** loading and saving of autoincrement information.
+*/
+struct AutoincInfo {
+ AutoincInfo *pNext; /* Next info block in a list of them all */
+ Table *pTab; /* Table this info block refers to */
+ int iDb; /* Index in sqlite3.aDb[] of database holding pTab */
+ int regCtr; /* Memory register holding the rowid counter */
+};
+
+/*
+** Size of the column cache
+*/
+#ifndef SQLITE_N_COLCACHE
+# define SQLITE_N_COLCACHE 10
+#endif
+
+/*
+** At least one instance of the following structure is created for each
+** trigger that may be fired while parsing an INSERT, UPDATE or DELETE
+** statement. All such objects are stored in the linked list headed at
+** Parse.pTriggerPrg and deleted once statement compilation has been
+** completed.
+**
+** A Vdbe sub-program that implements the body and WHEN clause of trigger
+** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of
+** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable.
+** The Parse.pTriggerPrg list never contains two entries with the same
+** values for both pTrigger and orconf.
+**
+** The TriggerPrg.oldmask variable is set to a mask of old.* columns
+** accessed (or set to 0 for triggers fired as a result of INSERT
+** statements).
+*/
+struct TriggerPrg {
+ Trigger *pTrigger; /* Trigger this program was coded from */
+ int orconf; /* Default ON CONFLICT policy */
+ SubProgram *pProgram; /* Program implementing pTrigger/orconf */
+ u32 oldmask; /* Mask of old.* columns accessed */
+ TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */
+};
+
+/*
** An SQL parser context. A copy of this structure is passed through
** the parser and down into all the parser action routine in order to
** carry around information that is global to the entire parse.
@@ -8726,17 +9709,23 @@ struct Parse {
int nMem; /* Number of memory cells used so far */
int nSet; /* Number of sets used so far */
int ckBase; /* Base register of data during check constraints */
- int disableColCache; /* True to disable adding to column cache */
- int nColCache; /* Number of entries in the column cache */
- int iColCache; /* Next entry of the cache to replace */
+ int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
+ int iCacheCnt; /* Counter used to generate aColCache[].lru values */
+ u8 nColCache; /* Number of entries in the column cache */
+ u8 iColCache; /* Next entry of the cache to replace */
struct yColCache {
int iTable; /* Table cursor number */
int iColumn; /* Table column number */
- char affChange; /* True if this register has had an affinity change */
- int iReg; /* Register holding value of this column */
- } aColCache[10]; /* One for each valid column cache entry */
+ u8 affChange; /* True if this register has had an affinity change */
+ u8 tempReg; /* iReg is a temp register that needs to be freed */
+ int iLevel; /* Nesting level */
+ int iReg; /* Reg with value of this column. 0 means none. */
+ int lru; /* Least recently used entry has the smallest value */
+ } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */
u32 writeMask; /* Start a write transaction on these databases */
u32 cookieMask; /* Bitmask of schema verified databases */
+ u8 isMultiWrite; /* True if statement may affect/insert multiple rows */
+ u8 mayAbort; /* True if statement may throw an ABORT exception */
int cookieGoto; /* Address of OP_Goto to cookie verifier subroutine */
int cookieValue[SQLITE_MAX_ATTACHED+2]; /* Values of cookies to verify */
#ifndef SQLITE_OMIT_SHARED_CACHE
@@ -8745,6 +9734,16 @@ struct Parse {
#endif
int regRowid; /* Register holding rowid of CREATE TABLE entry */
int regRoot; /* Register holding root page number for new objects */
+ AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */
+ int nMaxArg; /* Max args passed to user function by sub-program */
+
+ /* Information used while coding trigger programs. */
+ Parse *pToplevel; /* Parse structure for main program (or NULL) */
+ Table *pTriggerTab; /* Table triggers are being coded for */
+ u32 oldmask; /* Mask of old.* columns referenced */
+ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */
+ u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */
+ u8 disableTriggers; /* True to disable triggers */
/* Above is constant between recursions. Below is reset before and after
** each recursion */
@@ -8753,15 +9752,15 @@ struct Parse {
int nVarExpr; /* Number of used slots in apVarExpr[] */
int nVarExprAlloc; /* Number of allocated slots in apVarExpr[] */
Expr **apVarExpr; /* Pointers to :aaa and $aaaa wildcard expressions */
+ int nAlias; /* Number of aliased result set columns */
+ int nAliasAlloc; /* Number of allocated slots for aAlias[] */
+ int *aAlias; /* Register used to hold aliased result */
u8 explain; /* True if the EXPLAIN flag is found on the query */
- Token sErrToken; /* The token at which the error occurred */
Token sNameToken; /* Token with unqualified schema object name */
Token sLastToken; /* The last token parsed */
- const char *zSql; /* All SQL text */
const char *zTail; /* All SQL text past the last semicolon parsed */
Table *pNewTable; /* A table being constructed by CREATE TABLE */
Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */
- TriggerStack *trigStack; /* Trigger actions being coded */
const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
#ifndef SQLITE_OMIT_VIRTUALTABLE
Token sArg; /* Complete text of a module argument */
@@ -8769,9 +9768,9 @@ struct Parse {
int nVtabLock; /* Number of virtual tables to lock */
Table **apVtabLock; /* Pointer to virtual tables needing locking */
#endif
-#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0
int nHeight; /* Expression tree height of current sub-select */
-#endif
+ Table *pZombieTab; /* List of Table objects to delete after code gen */
+ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
};
#ifdef SQLITE_OMIT_VIRTUALTABLE
@@ -8790,12 +9789,14 @@ struct AuthContext {
};
/*
-** Bitfield flags for P2 value in OP_Insert and OP_Delete
+** Bitfield flags for P5 value in OP_Insert and OP_Delete
*/
-#define OPFLAG_NCHANGE 1 /* Set to update db->nChange */
-#define OPFLAG_LASTROWID 2 /* Set to update db->lastRowid */
-#define OPFLAG_ISUPDATE 4 /* This OP_Insert is an sql UPDATE */
-#define OPFLAG_APPEND 8 /* This is likely to be an append */
+#define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */
+#define OPFLAG_LASTROWID 0x02 /* Set to update db->lastRowid */
+#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */
+#define OPFLAG_APPEND 0x08 /* This is likely to be an append */
+#define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */
+#define OPFLAG_CLEARCACHE 0x20 /* Clear pseudo-table cache in OP_Column */
/*
* Each trigger present in the database schema is stored as an instance of
@@ -8813,14 +9814,13 @@ struct AuthContext {
* containing the SQL statements specified as the trigger program.
*/
struct Trigger {
- char *name; /* The name of the trigger */
+ char *zName; /* The name of the trigger */
char *table; /* The table or view to which the trigger applies */
u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */
u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
- Expr *pWhen; /* The WHEN clause of the expresion (may be NULL) */
+ Expr *pWhen; /* The WHEN clause of the expression (may be NULL) */
IdList *pColumns; /* If this is an UPDATE OF <column-list> trigger,
the <column-list> is stored here */
- Token nameToken; /* Token containing zName. Use during parsing only */
Schema *pSchema; /* Schema containing the trigger */
Schema *pTabSchema; /* Schema containing the table */
TriggerStep *step_list; /* Link list of trigger program steps */
@@ -8854,7 +9854,7 @@ struct Trigger {
* orconf -> stores the ON CONFLICT algorithm
* pSelect -> If this is an INSERT INTO ... SELECT ... statement, then
* this stores a pointer to the SELECT statement. Otherwise NULL.
- * target -> A token holding the name of the table to insert into.
+ * target -> A token holding the quoted name of the table to insert into.
* pExprList -> If this is an INSERT INTO ... VALUES ... statement, then
* this stores values to be inserted. Otherwise NULL.
* pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ...
@@ -8862,12 +9862,12 @@ struct Trigger {
* inserted into.
*
* (op == TK_DELETE)
- * target -> A token holding the name of the table to delete from.
+ * target -> A token holding the quoted name of the table to delete from.
* pWhere -> The WHERE clause of the DELETE statement if one is specified.
* Otherwise NULL.
*
* (op == TK_UPDATE)
- * target -> A token holding the name of the table to update rows of.
+ * target -> A token holding the quoted name of the table to update rows of.
* pWhere -> The WHERE clause of the UPDATE statement if one is specified.
* Otherwise NULL.
* pExprList -> A list of the columns to update and the expressions to update
@@ -8876,61 +9876,19 @@ struct Trigger {
*
*/
struct TriggerStep {
- int op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */
- int orconf; /* OE_Rollback etc. */
+ u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */
+ u8 orconf; /* OE_Rollback etc. */
Trigger *pTrig; /* The trigger that this step is a part of */
-
- Select *pSelect; /* Valid for SELECT and sometimes
- INSERT steps (when pExprList == 0) */
- Token target; /* Valid for DELETE, UPDATE, INSERT steps */
- Expr *pWhere; /* Valid for DELETE, UPDATE steps */
- ExprList *pExprList; /* Valid for UPDATE statements and sometimes
- INSERT steps (when pSelect == 0) */
- IdList *pIdList; /* Valid for INSERT statements only */
+ Select *pSelect; /* SELECT statment or RHS of INSERT INTO .. SELECT ... */
+ Token target; /* Target table for DELETE, UPDATE, INSERT */
+ Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */
+ ExprList *pExprList; /* SET clause for UPDATE. VALUES clause for INSERT */
+ IdList *pIdList; /* Column names for INSERT */
TriggerStep *pNext; /* Next in the link-list */
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
};
/*
- * An instance of struct TriggerStack stores information required during code
- * generation of a single trigger program. While the trigger program is being
- * coded, its associated TriggerStack instance is pointed to by the
- * "pTriggerStack" member of the Parse structure.
- *
- * The pTab member points to the table that triggers are being coded on. The
- * newIdx member contains the index of the vdbe cursor that points at the temp
- * table that stores the new.* references. If new.* references are not valid
- * for the trigger being coded (for example an ON DELETE trigger), then newIdx
- * is set to -1. The oldIdx member is analogous to newIdx, for old.* references.
- *
- * The ON CONFLICT policy to be used for the trigger program steps is stored
- * as the orconf member. If this is OE_Default, then the ON CONFLICT clause
- * specified for individual triggers steps is used.
- *
- * struct TriggerStack has a "pNext" member, to allow linked lists to be
- * constructed. When coding nested triggers (triggers fired by other triggers)
- * each nested trigger stores its parent trigger's TriggerStack as the "pNext"
- * pointer. Once the nested trigger has been coded, the pNext value is restored
- * to the pTriggerStack member of the Parse stucture and coding of the parent
- * trigger continues.
- *
- * Before a nested trigger is coded, the linked list pointed to by the
- * pTriggerStack is scanned to ensure that the trigger is not about to be coded
- * recursively. If this condition is detected, the nested trigger is not coded.
- */
-struct TriggerStack {
- Table *pTab; /* Table that triggers are currently being coded on */
- int newIdx; /* Index of vdbe cursor to "new" temp table */
- int oldIdx; /* Index of vdbe cursor to "old" temp table */
- u32 newColMask;
- u32 oldColMask;
- int orconf; /* Current orconf policy */
- int ignoreJump; /* where to jump to for a RAISE(IGNORE) */
- Trigger *pTrigger; /* The trigger currently being coded */
- TriggerStack *pNext; /* Next trigger down on the trigger stack */
-};
-
-/*
** The following structure contains information used by the sqliteFix...
** routines as they walk the parse tree to make database references
** explicit.
@@ -8948,13 +9906,14 @@ struct DbFixer {
** do not necessarily know how big the string will be in the end.
*/
struct StrAccum {
- char *zBase; /* A base allocation. Not from malloc. */
- char *zText; /* The string collected so far */
- int nChar; /* Length of the string so far */
- int nAlloc; /* Amount of space allocated in zText */
+ sqlite3 *db; /* Optional database for lookaside. Can be NULL */
+ char *zBase; /* A base allocation. Not from malloc. */
+ char *zText; /* The string collected so far */
+ int nChar; /* Length of the string so far */
+ int nAlloc; /* Amount of space allocated in zText */
int mxAlloc; /* Maximum allowed string length */
u8 mallocFailed; /* Becomes true if any memory allocation fails */
- u8 useMalloc; /* True if zText is enlargable using realloc */
+ u8 useMalloc; /* True if zText is enlargeable using realloc */
u8 tooBig; /* Becomes true if string size exceeds limits */
};
@@ -8970,6 +9929,71 @@ typedef struct {
} InitData;
/*
+** Structure containing global configuration data for the SQLite library.
+**
+** This structure also contains some state information.
+*/
+struct Sqlite3Config {
+ int bMemstat; /* True to enable memory status */
+ int bCoreMutex; /* True to enable core mutexing */
+ int bFullMutex; /* True to enable full mutexing */
+ int mxStrlen; /* Maximum string length */
+ int szLookaside; /* Default lookaside buffer size */
+ int nLookaside; /* Default lookaside buffer count */
+ sqlite3_mem_methods m; /* Low-level memory allocation interface */
+ sqlite3_mutex_methods mutex; /* Low-level mutex interface */
+ sqlite3_pcache_methods pcache; /* Low-level page-cache interface */
+ void *pHeap; /* Heap storage space */
+ int nHeap; /* Size of pHeap[] */
+ int mnReq, mxReq; /* Min and max heap requests sizes */
+ void *pScratch; /* Scratch memory */
+ int szScratch; /* Size of each scratch buffer */
+ int nScratch; /* Number of scratch buffers */
+ void *pPage; /* Page cache memory */
+ int szPage; /* Size of each page in pPage[] */
+ int nPage; /* Number of pages in pPage[] */
+ int mxParserStack; /* maximum depth of the parser stack */
+ int sharedCacheEnabled; /* true if shared-cache mode enabled */
+ /* The above might be initialized to non-zero. The following need to always
+ ** initially be zero, however. */
+ int isInit; /* True after initialization has finished */
+ int inProgress; /* True while initialization in progress */
+ int isMutexInit; /* True after mutexes are initialized */
+ int isMallocInit; /* True after malloc is initialized */
+ int isPCacheInit; /* True after malloc is initialized */
+ sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */
+ int nRefInitMutex; /* Number of users of pInitMutex */
+};
+
+/*
+** Context pointer passed down through the tree-walk.
+*/
+struct Walker {
+ int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */
+ int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */
+ Parse *pParse; /* Parser context. */
+ union { /* Extra data for callback */
+ NameContext *pNC; /* Naming context */
+ int i; /* Integer value */
+ } u;
+};
+
+/* Forward declarations */
+SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*);
+SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*);
+SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*);
+SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*);
+SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*);
+
+/*
+** Return code from the parse-tree walking primitives and their
+** callbacks.
+*/
+#define WRC_Continue 0 /* Continue down into children */
+#define WRC_Prune 1 /* Omit children but continue walking siblings */
+#define WRC_Abort 2 /* Abandon the tree walk */
+
+/*
** Assuming zIn points to the first byte of a UTF-8 character,
** advance zIn to point to the first byte of the next UTF-8 character.
*/
@@ -8988,45 +10012,125 @@ typedef struct {
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3Corrupt(void);
# define SQLITE_CORRUPT_BKPT sqlite3Corrupt()
-# define DEBUGONLY(X) X
#else
# define SQLITE_CORRUPT_BKPT SQLITE_CORRUPT
-# define DEBUGONLY(X)
+#endif
+
+/*
+** The ctype.h header is needed for non-ASCII systems. It is also
+** needed by FTS3 when FTS3 is included in the amalgamation.
+*/
+#if !defined(SQLITE_ASCII) || \
+ (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION))
+# include <ctype.h>
+#endif
+
+/*
+** The following macros mimic the standard library functions toupper(),
+** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
+** sqlite versions only work for ASCII characters, regardless of locale.
+*/
+#ifdef SQLITE_ASCII
+# define sqlite3Toupper(x) ((x)&~(sqlite3CtypeMap[(unsigned char)(x)]&0x20))
+# define sqlite3Isspace(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x01)
+# define sqlite3Isalnum(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x06)
+# define sqlite3Isalpha(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x02)
+# define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04)
+# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08)
+# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)])
+#else
+# define sqlite3Toupper(x) toupper((unsigned char)(x))
+# define sqlite3Isspace(x) isspace((unsigned char)(x))
+# define sqlite3Isalnum(x) isalnum((unsigned char)(x))
+# define sqlite3Isalpha(x) isalpha((unsigned char)(x))
+# define sqlite3Isdigit(x) isdigit((unsigned char)(x))
+# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
+# define sqlite3Tolower(x) tolower((unsigned char)(x))
#endif
/*
** Internal function prototypes
*/
SQLITE_PRIVATE int sqlite3StrICmp(const char *, const char *);
-SQLITE_PRIVATE int sqlite3StrNICmp(const char *, const char *, int);
SQLITE_PRIVATE int sqlite3IsNumber(const char*, int*, u8);
-
-SQLITE_PRIVATE void *sqlite3MallocZero(unsigned);
-SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, unsigned);
-SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, unsigned);
-SQLITE_PRIVATE char *sqlite3StrDup(const char*);
-SQLITE_PRIVATE char *sqlite3StrNDup(const char*, int);
+SQLITE_PRIVATE int sqlite3Strlen30(const char*);
+#define sqlite3StrNICmp sqlite3_strnicmp
+
+SQLITE_PRIVATE int sqlite3MallocInit(void);
+SQLITE_PRIVATE void sqlite3MallocEnd(void);
+SQLITE_PRIVATE void *sqlite3Malloc(int);
+SQLITE_PRIVATE void *sqlite3MallocZero(int);
+SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, int);
+SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, int);
SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*);
SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, int);
+SQLITE_PRIVATE void *sqlite3Realloc(void*, int);
SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, int);
SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, int);
-SQLITE_PRIVATE int sqlite3MallocSize(void *);
+SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*);
+SQLITE_PRIVATE int sqlite3MallocSize(void*);
+SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*);
+SQLITE_PRIVATE void *sqlite3ScratchMalloc(int);
+SQLITE_PRIVATE void sqlite3ScratchFree(void*);
+SQLITE_PRIVATE void *sqlite3PageMalloc(int);
+SQLITE_PRIVATE void sqlite3PageFree(void*);
+SQLITE_PRIVATE void sqlite3MemSetDefault(void);
+SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void));
+SQLITE_PRIVATE int sqlite3MemoryAlarm(void (*)(void*, sqlite3_int64, int), void*, sqlite3_int64);
+
+/*
+** On systems with ample stack space and that support alloca(), make
+** use of alloca() to obtain space for large automatic objects. By default,
+** obtain space from malloc().
+**
+** The alloca() routine never returns NULL. This will cause code paths
+** that deal with sqlite3StackAlloc() failures to be unreachable.
+*/
+#ifdef SQLITE_USE_ALLOCA
+# define sqlite3StackAllocRaw(D,N) alloca(N)
+# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N)
+# define sqlite3StackFree(D,P)
+#else
+# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N)
+# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N)
+# define sqlite3StackFree(D,P) sqlite3DbFree(D,P)
+#endif
+
+#ifdef SQLITE_ENABLE_MEMSYS3
+SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void);
+#endif
+#ifdef SQLITE_ENABLE_MEMSYS5
+SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void);
+#endif
+
+
+#ifndef SQLITE_MUTEX_OMIT
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void);
+SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int);
+SQLITE_PRIVATE int sqlite3MutexInit(void);
+SQLITE_PRIVATE int sqlite3MutexEnd(void);
+#endif
+
+SQLITE_PRIVATE int sqlite3StatusValue(int);
+SQLITE_PRIVATE void sqlite3StatusAdd(int, int);
+SQLITE_PRIVATE void sqlite3StatusSet(int, int);
SQLITE_PRIVATE int sqlite3IsNaN(double);
+SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, int, const char*, va_list);
SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...);
SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
+SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3*,char*,const char*,...);
#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...);
#endif
#if defined(SQLITE_TEST)
-SQLITE_PRIVATE void *sqlite3TextToPtr(const char*);
+SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*);
#endif
-SQLITE_PRIVATE void sqlite3SetString(char **, ...);
+SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*, ...);
SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...);
SQLITE_PRIVATE void sqlite3ErrorClear(Parse*);
-SQLITE_PRIVATE void sqlite3Dequote(char*);
-SQLITE_PRIVATE void sqlite3DequoteExpr(sqlite3*, Expr*);
+SQLITE_PRIVATE int sqlite3Dequote(char*);
SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int);
SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **);
SQLITE_PRIVATE void sqlite3FinishCoding(Parse*);
@@ -9034,23 +10138,26 @@ SQLITE_PRIVATE int sqlite3GetTempReg(Parse*);
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int);
SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int);
SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int);
-SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*, int, Expr*, Expr*, const Token*);
+SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int);
+SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*);
+SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*);
SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*);
-SQLITE_PRIVATE Expr *sqlite3RegisterExpr(Parse*,Token*);
SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*);
-SQLITE_PRIVATE void sqlite3ExprSpan(Expr*,Token*,Token*);
SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*);
SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*);
-SQLITE_PRIVATE void sqlite3ExprDelete(Expr*);
-SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*,Token*);
-SQLITE_PRIVATE void sqlite3ExprListDelete(ExprList*);
+SQLITE_PRIVATE void sqlite3ExprClear(sqlite3*, Expr*);
+SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*);
+SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
+SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
+SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*);
+SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*);
SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**);
SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**);
SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int);
SQLITE_PRIVATE void sqlite3ResetInternalSchema(sqlite3*, int);
SQLITE_PRIVATE void sqlite3BeginParse(Parse*,int);
SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*);
-SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,char*,Select*);
+SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*);
SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int);
SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int);
SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*);
@@ -9058,17 +10165,24 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int);
SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*);
SQLITE_PRIVATE void sqlite3AddColumnType(Parse*,Token*);
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*);
+SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*);
SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*);
SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,Select*);
SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32);
SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32);
SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32);
-SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32);
+SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*);
SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*);
+SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*);
SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*);
+SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
+SQLITE_PRIVATE void sqlite3RowSetClear(RowSet*);
+SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64);
+SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, u8 iBatch, i64);
+SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*);
+
SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int);
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
@@ -9079,36 +10193,53 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*);
SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int);
SQLITE_PRIVATE void sqlite3DeleteTable(Table*);
+#ifndef SQLITE_OMIT_AUTOINCREMENT
+SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse);
+SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
+#else
+# define sqlite3AutoincrementBegin(X)
+# define sqlite3AutoincrementEnd(X)
+#endif
SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, ExprList*, Select*, IdList*, int);
SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int,int*,int*,int*);
SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*);
SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*);
+SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int);
SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*);
-SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*,
- Select*, Expr*, IdList*);
+SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*,
+ Token*, Select*, Expr*, IdList*);
+SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *);
+SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, struct SrcList_item *);
SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*);
SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*);
-SQLITE_PRIVATE void sqlite3IdListDelete(IdList*);
-SQLITE_PRIVATE void sqlite3SrcListDelete(SrcList*);
-SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*,
+SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*);
+SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*);
+SQLITE_PRIVATE Index *sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*,
Token*, int, int);
SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int);
-SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*, Select*, int, int*, char *aff);
+SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*);
SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*,
Expr*,ExprList*,int,Expr*,Expr*);
-SQLITE_PRIVATE void sqlite3SelectDelete(Select*);
+SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*);
SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*);
SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int);
SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int);
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
+SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse *, SrcList *, Expr *, ExprList *, Expr *, Expr *, char *);
+#endif
SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
-SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**, u8);
+SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**, u16);
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, int);
-SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int);
-SQLITE_PRIVATE void sqlite3ExprClearColumnCache(Parse*, int);
+SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
+SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, int, int, int);
+SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int);
+SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*);
+SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*, int);
+SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int);
+SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*);
SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int);
-SQLITE_PRIVATE int sqlite3ExprWritableRegister(Parse*,int,int);
SQLITE_PRIVATE void sqlite3ExprHardCopy(Parse*,int,int);
SQLITE_PRIVATE int sqlite3ExprCode(Parse*, Expr*, int);
SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*);
@@ -9127,7 +10258,6 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse*);
SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*);
SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*);
SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*);
-SQLITE_PRIVATE int sqlite3ExprResolveNames(NameContext *, Expr *);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*);
@@ -9140,28 +10270,34 @@ SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int);
SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int);
SQLITE_PRIVATE void sqlite3CommitTransaction(Parse*);
SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse*);
+SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*);
+SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *);
SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*);
SQLITE_PRIVATE int sqlite3IsRowid(const char*);
-SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int);
+SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int, Trigger *, int);
SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*);
SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int);
SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int,int,
- int*,int,int,int,int);
-SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*, Table*, int, int, int*,int,int,int,int);
+ int*,int,int,int,int,int*);
+SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*, Table*, int, int, int*, int, int, int);
SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, int);
SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int);
-SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*);
-SQLITE_PRIVATE void sqlite3TokenCopy(sqlite3*,Token*, Token*);
-SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*);
-SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*);
+SQLITE_PRIVATE void sqlite3MultiWrite(Parse*);
+SQLITE_PRIVATE void sqlite3MayAbort(Parse*);
+SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, char*, int);
+SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*,int);
+SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int);
+SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int);
SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*);
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*);
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int);
+SQLITE_PRIVATE void sqlite3FuncDefInsert(FuncDefHash*, FuncDef*);
SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,int,u8,int);
SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3*);
-SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(sqlite3*);
+SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void);
+SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void);
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3SafetyOn(sqlite3*);
SQLITE_PRIVATE int sqlite3SafetyOff(sqlite3*);
@@ -9172,7 +10308,10 @@ SQLITE_PRIVATE int sqlite3SafetyOff(sqlite3*);
SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*);
SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*);
SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int);
-SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Select*, Expr*, int);
+
+#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
+SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
+#endif
#ifndef SQLITE_OMIT_TRIGGER
SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*,
@@ -9180,24 +10319,32 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,
SQLITE_PRIVATE void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*);
SQLITE_PRIVATE void sqlite3DropTrigger(Parse*, SrcList*, int);
SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse*, Trigger*);
-SQLITE_PRIVATE int sqlite3TriggersExist(Parse*, Table*, int, ExprList*);
-SQLITE_PRIVATE int sqlite3CodeRowTrigger(Parse*, int, ExprList*, int, Table *, int, int,
- int, int, u32*, u32*);
+SQLITE_PRIVATE Trigger *sqlite3TriggersExist(Parse *, Table*, int, ExprList*, int *pMask);
+SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *, Table *);
+SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, int, Table *,
+ int, int, int);
+SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int);
void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*);
-SQLITE_PRIVATE void sqlite3DeleteTriggerStep(TriggerStep*);
+SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*);
SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*);
SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*,
- ExprList*,Select*,int);
-SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, int);
+ ExprList*,Select*,u8);
+SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8);
SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*);
-SQLITE_PRIVATE void sqlite3DeleteTrigger(Trigger*);
+SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*);
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
+SQLITE_PRIVATE u32 sqlite3TriggerOldmask(Parse*,Trigger*,ExprList*,Table*,int);
+# define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p))
#else
-# define sqlite3TriggersExist(A,B,C,D,E,F) 0
-# define sqlite3DeleteTrigger(A)
+# define sqlite3TriggersExist(B,C,D,E,F) 0
+# define sqlite3DeleteTrigger(A,B)
# define sqlite3DropTriggerPtr(A,B)
# define sqlite3UnlinkAndDeleteTrigger(A,B,C)
-# define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I,J,K) 0
+# define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I)
+# define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F)
+# define sqlite3TriggerList(X, Y) 0
+# define sqlite3ParseToplevel(p) p
+# define sqlite3TriggerOldmask(A,B,C,D,E) 0
#endif
SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*);
@@ -9208,6 +10355,7 @@ SQLITE_PRIVATE void sqlite3AuthRead(Parse*,Expr*,Schema*,SrcList*);
SQLITE_PRIVATE int sqlite3AuthCheck(Parse*,int, const char*, const char*, const char*);
SQLITE_PRIVATE void sqlite3AuthContextPush(Parse*, AuthContext*, const char*);
SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext*);
+SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int);
#else
# define sqlite3AuthRead(a,b,c,d)
# define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK
@@ -9225,12 +10373,11 @@ SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*);
SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*);
SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*);
-SQLITE_API char *sqlite3_snprintf(int,char*,const char*,...);
SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*);
SQLITE_PRIVATE int sqlite3FitsIn64Bits(const char *, int);
SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar);
SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte);
-SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8*, const u8**);
+SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8**);
/*
** Routines to read and write variable-length integers. These used to
@@ -9241,8 +10388,8 @@ SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8*, const u8**);
*/
SQLITE_PRIVATE int sqlite3PutVarint(unsigned char*, u64);
SQLITE_PRIVATE int sqlite3PutVarint32(unsigned char*, u32);
-SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *, u64 *);
-SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *, u32 *);
+SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *, u64 *);
+SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *, u32 *);
SQLITE_PRIVATE int sqlite3VarintLen(u64 v);
/*
@@ -9262,13 +10409,13 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v);
** x = putVarint32( A, B );
**
*/
-#define getVarint32(A,B) ((*(A)<(unsigned char)0x80) ? ((B) = (u32)*(A)),1 : sqlite3GetVarint32((A), &(B)))
-#define putVarint32(A,B) (((B)<(u32)0x80) ? (*(A) = (unsigned char)(B)),1 : sqlite3PutVarint32((A), (B)))
+#define getVarint32(A,B) (u8)((*(A)<(u8)0x80) ? ((B) = (u32)*(A)),1 : sqlite3GetVarint32((A), (u32 *)&(B)))
+#define putVarint32(A,B) (u8)(((u32)(B)<(u32)0x80) ? (*(A) = (unsigned char)(B)),1 : sqlite3PutVarint32((A), (B)))
#define getVarint sqlite3GetVarint
#define putVarint sqlite3PutVarint
-SQLITE_PRIVATE void sqlite3IndexAffinityStr(Vdbe *, Index *);
+SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *, Index *);
SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *, Table *);
SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2);
SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity);
@@ -9279,8 +10426,8 @@ SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n);
SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
SQLITE_PRIVATE const char *sqlite3ErrStr(int);
SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse);
-SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char *,int,int);
-SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName);
+SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int);
+SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName);
SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr);
SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *, Token *);
SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *);
@@ -9294,10 +10441,17 @@ SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8,
SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*);
SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *);
SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int);
+#ifdef SQLITE_ENABLE_STAT2
+SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *, u8, char *, int, int *);
+#endif
SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
#ifndef SQLITE_AMALGAMATION
SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[];
+SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[];
+SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config;
+SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
+SQLITE_PRIVATE int sqlite3PendingByte;
#endif
SQLITE_PRIVATE void sqlite3RootPageMoved(Db*, int, int);
SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
@@ -9306,21 +10460,25 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);
SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *);
SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...);
SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*);
-SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *, Expr *);
-SQLITE_PRIVATE int sqlite3SelectResolve(Parse *, Select *, NameContext *);
-SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int);
+SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *, Expr *, int, int);
+SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*);
+SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*);
+SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*);
+SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*);
+SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int);
SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *);
SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *);
-SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(sqlite3*, CollSeq *, const char *, int);
-SQLITE_PRIVATE char sqlite3AffinityType(const Token*);
+SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(sqlite3*, u8, CollSeq *, const char*);
+SQLITE_PRIVATE char sqlite3AffinityType(const char*);
SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*);
SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*);
SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*);
+SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *);
SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB);
+SQLITE_PRIVATE void sqlite3DeleteIndexSamples(Index*);
SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*);
SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int);
SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*);
-SQLITE_PRIVATE void sqlite3AttachFunctions(sqlite3 *);
SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse*, int, int);
SQLITE_PRIVATE void sqlite3SchemaFree(void *);
SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *);
@@ -9332,19 +10490,26 @@ SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int);
SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *);
+SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, char*, int, int);
SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int);
SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*);
SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*);
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int);
+SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *);
+SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *);
+
/*
** The interface to the LEMON-generated parser
*/
SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(size_t));
SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*));
SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*);
+#ifdef YYTRACKMAXSTACKDEPTH
+SQLITE_PRIVATE int sqlite3ParserStackPeak(void*);
+#endif
-SQLITE_PRIVATE int sqlite3AutoLoadExtensions(sqlite3*);
+SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*);
#ifndef SQLITE_OMIT_LOAD_EXTENSION
SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*);
#else
@@ -9362,19 +10527,25 @@ SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*);
#endif
#ifdef SQLITE_OMIT_VIRTUALTABLE
-# define sqlite3VtabClear(X)
-# define sqlite3VtabSync(X,Y) (Y)
+# define sqlite3VtabClear(Y)
+# define sqlite3VtabSync(X,Y) SQLITE_OK
# define sqlite3VtabRollback(X)
# define sqlite3VtabCommit(X)
+# define sqlite3VtabInSync(db) 0
+# define sqlite3VtabLock(X)
+# define sqlite3VtabUnlock(X)
+# define sqlite3VtabUnlockList(X)
#else
SQLITE_PRIVATE void sqlite3VtabClear(Table*);
-SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, int rc);
+SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **);
SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db);
SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db);
+SQLITE_PRIVATE void sqlite3VtabLock(VTable *);
+SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *);
+SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*);
+# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
#endif
SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
-SQLITE_PRIVATE void sqlite3VtabLock(sqlite3_vtab*);
-SQLITE_PRIVATE void sqlite3VtabUnlock(sqlite3*, sqlite3_vtab*);
SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*);
SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*);
SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*);
@@ -9382,12 +10553,42 @@ SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse*, Token*);
SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
-SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, sqlite3_vtab *);
+SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**);
+SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
+SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
+SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
+
+/* Declarations for functions in fkey.c. All of these are replaced by
+** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
+** key functionality is available. If OMIT_TRIGGER is defined but
+** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In
+** this case foreign keys are parsed, but no other functionality is
+** provided (enforcement of FK constraints requires the triggers sub-system).
+*/
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
+SQLITE_PRIVATE void sqlite3FkCheck(Parse*, Table*, int, int);
+SQLITE_PRIVATE void sqlite3FkDropTable(Parse*, SrcList *, Table*);
+SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int);
+SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int);
+SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*);
+SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *);
+#else
+ #define sqlite3FkActions(a,b,c,d)
+ #define sqlite3FkCheck(a,b,c,d)
+ #define sqlite3FkDropTable(a,b,c)
+ #define sqlite3FkOldmask(a,b) 0
+ #define sqlite3FkRequired(a,b,c,d) 0
+#endif
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+SQLITE_PRIVATE void sqlite3FkDelete(Table*);
+#else
+ #define sqlite3FkDelete(a)
+#endif
/*
@@ -9397,34 +10598,22 @@ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
#define SQLITE_FAULTINJECTOR_COUNT 1
/*
-** The interface to the fault injector subsystem. If the fault injector
-** mechanism is disabled at compile-time then set up macros so that no
-** unnecessary code is generated.
+** The interface to the code in fault.c used for identifying "benign"
+** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST
+** is not defined.
*/
#ifndef SQLITE_OMIT_BUILTIN_TEST
-SQLITE_PRIVATE void sqlite3FaultConfig(int,int,int);
-SQLITE_PRIVATE int sqlite3FaultFailures(int);
-SQLITE_PRIVATE int sqlite3FaultBenignFailures(int);
-SQLITE_PRIVATE int sqlite3FaultPending(int);
-SQLITE_PRIVATE void sqlite3FaultBeginBenign(int);
-SQLITE_PRIVATE void sqlite3FaultEndBenign(int);
-SQLITE_PRIVATE int sqlite3FaultStep(int);
+SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void);
+SQLITE_PRIVATE void sqlite3EndBenignMalloc(void);
#else
-# define sqlite3FaultConfig(A,B,C)
-# define sqlite3FaultFailures(A) 0
-# define sqlite3FaultBenignFailures(A) 0
-# define sqlite3FaultPending(A) (-1)
-# define sqlite3FaultBeginBenign(A)
-# define sqlite3FaultEndBenign(A)
-# define sqlite3FaultStep(A) 0
+ #define sqlite3BeginBenignMalloc()
+ #define sqlite3EndBenignMalloc()
#endif
-
-
#define IN_INDEX_ROWID 1
#define IN_INDEX_EPH 2
#define IN_INDEX_INDEX 3
-SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, int);
+SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, int*);
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
@@ -9434,18 +10623,31 @@ SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *);
#define sqlite3JournalSize(pVfs) ((pVfs)->szOsFile)
#endif
-#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0
-SQLITE_PRIVATE void sqlite3ExprSetHeight(Expr *);
+SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *);
+SQLITE_PRIVATE int sqlite3MemJournalSize(void);
+SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *);
+
+#if SQLITE_MAX_EXPR_DEPTH>0
+SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p);
SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *);
+SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int);
#else
- #define sqlite3ExprSetHeight(x)
+ #define sqlite3ExprSetHeight(x,y)
+ #define sqlite3SelectExprHeight(x) 0
+ #define sqlite3ExprCheckHeight(x,y)
#endif
SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*);
SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32);
-#ifdef SQLITE_SSE
-#include "sseInt.h"
+#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
+SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *, sqlite3 *);
+SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db);
+SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db);
+#else
+ #define sqlite3ConnectionBlocked(x,y)
+ #define sqlite3ConnectionUnlocked(x)
+ #define sqlite3ConnectionClosed(x)
#endif
#ifdef SQLITE_DEBUG
@@ -9469,6 +10671,322 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
#endif
/************** End of sqliteInt.h *******************************************/
+/************** Begin file global.c ******************************************/
+/*
+** 2008 June 13
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file contains definitions of global variables and contants.
+*/
+
+
+/* An array to map all upper-case characters into their corresponding
+** lower-case character.
+**
+** SQLite only considers US-ASCII (or EBCDIC) characters. We do not
+** handle case conversions for the UTF character set since the tables
+** involved are nearly as big or bigger than SQLite itself.
+*/
+SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = {
+#ifdef SQLITE_ASCII
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
+ 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
+ 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
+ 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
+ 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
+ 252,253,254,255
+#endif
+#ifdef SQLITE_EBCDIC
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */
+ 96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */
+ 112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */
+ 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */
+ 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */
+ 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */
+ 224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */
+ 239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */
+#endif
+};
+
+/*
+** The following 256 byte lookup table is used to support SQLites built-in
+** equivalents to the following standard library functions:
+**
+** isspace() 0x01
+** isalpha() 0x02
+** isdigit() 0x04
+** isalnum() 0x06
+** isxdigit() 0x08
+** toupper() 0x20
+**
+** Bit 0x20 is set if the mapped character requires translation to upper
+** case. i.e. if the character is a lower-case ASCII character.
+** If x is a lower-case ASCII character, then its upper-case equivalent
+** is (x - 0x20). Therefore toupper() can be implemented as:
+**
+** (x & ~(map[x]&0x20))
+**
+** Standard function tolower() is implemented using the sqlite3UpperToLower[]
+** array. tolower() is used more often than toupper() by SQLite.
+**
+** SQLite's versions are identical to the standard versions assuming a
+** locale of "C". They are implemented as macros in sqliteInt.h.
+*/
+#ifdef SQLITE_ASCII
+SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 20..27 !"#$%&' */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */
+ 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */
+
+ 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */
+ 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, /* 58..5f XYZ[\]^_ */
+ 0x00, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */
+ 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 80..87 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 88..8f ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 90..97 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 98..9f ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a0..a7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a8..af ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b0..b7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b8..bf ........ */
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c0..c7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c8..cf ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d0..d7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d8..df ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e0..e7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e8..ef ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f0..f7 ........ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* f8..ff ........ */
+};
+#endif
+
+
+
+/*
+** The following singleton contains the global configuration for
+** the SQLite library.
+*/
+SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
+ SQLITE_DEFAULT_MEMSTATUS, /* bMemstat */
+ 1, /* bCoreMutex */
+ SQLITE_THREADSAFE==1, /* bFullMutex */
+ 0x7ffffffe, /* mxStrlen */
+ 100, /* szLookaside */
+ 500, /* nLookaside */
+ {0,0,0,0,0,0,0,0}, /* m */
+ {0,0,0,0,0,0,0,0,0}, /* mutex */
+ {0,0,0,0,0,0,0,0,0,0,0}, /* pcache */
+ (void*)0, /* pHeap */
+ 0, /* nHeap */
+ 0, 0, /* mnHeap, mxHeap */
+ (void*)0, /* pScratch */
+ 0, /* szScratch */
+ 0, /* nScratch */
+ (void*)0, /* pPage */
+ 0, /* szPage */
+ 0, /* nPage */
+ 0, /* mxParserStack */
+ 0, /* sharedCacheEnabled */
+ /* All the rest should always be initialized to zero */
+ 0, /* isInit */
+ 0, /* inProgress */
+ 0, /* isMutexInit */
+ 0, /* isMallocInit */
+ 0, /* isPCacheInit */
+ 0, /* pInitMutex */
+ 0, /* nRefInitMutex */
+};
+
+
+/*
+** Hash table for global functions - functions common to all
+** database connections. After initialization, this table is
+** read-only.
+*/
+SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
+
+/*
+** The value of the "pending" byte must be 0x40000000 (1 byte past the
+** 1-gibabyte boundary) in a compatible database. SQLite never uses
+** the database page that contains the pending byte. It never attempts
+** to read or write that page. The pending byte page is set assign
+** for use by the VFS layers as space for managing file locks.
+**
+** During testing, it is often desirable to move the pending byte to
+** a different position in the file. This allows code that has to
+** deal with the pending byte to run on files that are much smaller
+** than 1 GiB. The sqlite3_test_control() interface can be used to
+** move the pending byte.
+**
+** IMPORTANT: Changing the pending byte to any value other than
+** 0x40000000 results in an incompatible database file format!
+** Changing the pending byte during operating results in undefined
+** and dileterious behavior.
+*/
+SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000;
+
+/************** End of global.c **********************************************/
+/************** Begin file status.c ******************************************/
+/*
+** 2008 June 18
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This module implements the sqlite3_status() interface and related
+** functionality.
+**
+** $Id: status.c,v 1.9 2008/09/02 00:52:52 drh Exp $
+*/
+
+/*
+** Variables in which to record status information.
+*/
+typedef struct sqlite3StatType sqlite3StatType;
+static SQLITE_WSD struct sqlite3StatType {
+ int nowValue[9]; /* Current value */
+ int mxValue[9]; /* Maximum value */
+} sqlite3Stat = { {0,}, {0,} };
+
+
+/* The "wsdStat" macro will resolve to the status information
+** state vector. If writable static data is unsupported on the target,
+** we have to locate the state vector at run-time. In the more common
+** case where writable static data is supported, wsdStat can refer directly
+** to the "sqlite3Stat" state vector declared above.
+*/
+#ifdef SQLITE_OMIT_WSD
+# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat)
+# define wsdStat x[0]
+#else
+# define wsdStatInit
+# define wsdStat sqlite3Stat
+#endif
+
+/*
+** Return the current value of a status parameter.
+*/
+SQLITE_PRIVATE int sqlite3StatusValue(int op){
+ wsdStatInit;
+ assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
+ return wsdStat.nowValue[op];
+}
+
+/*
+** Add N to the value of a status record. It is assumed that the
+** caller holds appropriate locks.
+*/
+SQLITE_PRIVATE void sqlite3StatusAdd(int op, int N){
+ wsdStatInit;
+ assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
+ wsdStat.nowValue[op] += N;
+ if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){
+ wsdStat.mxValue[op] = wsdStat.nowValue[op];
+ }
+}
+
+/*
+** Set the value of a status to X.
+*/
+SQLITE_PRIVATE void sqlite3StatusSet(int op, int X){
+ wsdStatInit;
+ assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
+ wsdStat.nowValue[op] = X;
+ if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){
+ wsdStat.mxValue[op] = wsdStat.nowValue[op];
+ }
+}
+
+/*
+** Query status information.
+**
+** This implementation assumes that reading or writing an aligned
+** 32-bit integer is an atomic operation. If that assumption is not true,
+** then this routine is not threadsafe.
+*/
+SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){
+ wsdStatInit;
+ if( op<0 || op>=ArraySize(wsdStat.nowValue) ){
+ return SQLITE_MISUSE;
+ }
+ *pCurrent = wsdStat.nowValue[op];
+ *pHighwater = wsdStat.mxValue[op];
+ if( resetFlag ){
+ wsdStat.mxValue[op] = wsdStat.nowValue[op];
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Query status information for a single database connection
+*/
+SQLITE_API int sqlite3_db_status(
+ sqlite3 *db, /* The database connection whose status is desired */
+ int op, /* Status verb */
+ int *pCurrent, /* Write current value here */
+ int *pHighwater, /* Write high-water mark here */
+ int resetFlag /* Reset high-water mark if true */
+){
+ switch( op ){
+ case SQLITE_DBSTATUS_LOOKASIDE_USED: {
+ *pCurrent = db->lookaside.nOut;
+ *pHighwater = db->lookaside.mxOut;
+ if( resetFlag ){
+ db->lookaside.mxOut = db->lookaside.nOut;
+ }
+ break;
+ }
+ default: {
+ return SQLITE_ERROR;
+ }
+ }
+ return SQLITE_OK;
+}
+
+/************** End of status.c **********************************************/
/************** Begin file date.c ********************************************/
/*
** 2003 October 31
@@ -9488,7 +11006,7 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
** sqlite3RegisterDateTimeFunctions() found at the bottom of the file.
** All other code has file scope.
**
-** $Id: date.c,v 1.79 2008/03/20 14:03:29 drh Exp $
+** $Id: date.c,v 1.107 2009/05/03 20:23:53 drh Exp $
**
** SQLite processes all times and dates as Julian Day numbers. The
** dates and times are stored as the number of days since noon
@@ -9517,25 +11035,41 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
** Willmann-Bell, Inc
** Richmond, Virginia (USA)
*/
-#include <ctype.h>
#include <time.h>
#ifndef SQLITE_OMIT_DATETIME_FUNCS
/*
+** On recent Windows platforms, the localtime_s() function is available
+** as part of the "Secure CRT". It is essentially equivalent to
+** localtime_r() available under most POSIX platforms, except that the
+** order of the parameters is reversed.
+**
+** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
+**
+** If the user has not indicated to use localtime_r() or localtime_s()
+** already, check for an MSVC build environment that provides
+** localtime_s().
+*/
+#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
+ defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
+#define HAVE_LOCALTIME_S 1
+#endif
+
+/*
** A structure for holding a single date and time.
*/
typedef struct DateTime DateTime;
struct DateTime {
- double rJD; /* The julian day number */
- int Y, M, D; /* Year, month, and day */
- int h, m; /* Hour and minutes */
- int tz; /* Timezone offset in minutes */
- double s; /* Seconds */
- char validYMD; /* True if Y,M,D are valid */
- char validHMS; /* True if h,m,s are valid */
- char validJD; /* True if rJD is valid */
- char validTZ; /* True if tz is valid */
+ sqlite3_int64 iJD; /* The julian day number times 86400000 */
+ int Y, M, D; /* Year, month, and day */
+ int h, m; /* Hour and minutes */
+ int tz; /* Timezone offset in minutes */
+ double s; /* Seconds */
+ char validYMD; /* True (1) if Y,M,D are valid */
+ char validHMS; /* True (1) if h,m,s are valid */
+ char validJD; /* True (1) if iJD is valid */
+ char validTZ; /* True (1) if tz is valid */
};
@@ -9570,7 +11104,7 @@ static int getDigits(const char *zDate, ...){
pVal = va_arg(ap, int*);
val = 0;
while( N-- ){
- if( !isdigit(*(u8*)zDate) ){
+ if( !sqlite3Isdigit(*zDate) ){
goto end_getDigits;
}
val = val*10 + *zDate - '0';
@@ -9614,7 +11148,7 @@ static int parseTimezone(const char *zDate, DateTime *p){
int sgn = 0;
int nHr, nMn;
int c;
- while( isspace(*(u8*)zDate) ){ zDate++; }
+ while( sqlite3Isspace(*zDate) ){ zDate++; }
p->tz = 0;
c = *zDate;
if( c=='-' ){
@@ -9634,7 +11168,7 @@ static int parseTimezone(const char *zDate, DateTime *p){
zDate += 5;
p->tz = sgn*(nMn + nHr*60);
zulu_time:
- while( isspace(*(u8*)zDate) ){ zDate++; }
+ while( sqlite3Isspace(*zDate) ){ zDate++; }
return *zDate!=0;
}
@@ -9658,10 +11192,10 @@ static int parseHhMmSs(const char *zDate, DateTime *p){
return 1;
}
zDate += 2;
- if( *zDate=='.' && isdigit((u8)zDate[1]) ){
+ if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){
double rScale = 1.0;
zDate++;
- while( isdigit(*(u8*)zDate) ){
+ while( sqlite3Isdigit(*zDate) ){
ms = ms*10.0 + *zDate - '0';
rScale *= 10.0;
zDate++;
@@ -9677,7 +11211,7 @@ static int parseHhMmSs(const char *zDate, DateTime *p){
p->m = m;
p->s = s + ms;
if( parseTimezone(zDate, p) ) return 1;
- p->validTZ = p->tz!=0;
+ p->validTZ = (p->tz!=0)?1:0;
return 0;
}
@@ -9706,14 +11240,14 @@ static void computeJD(DateTime *p){
}
A = Y/100;
B = 2 - A + (A/4);
- X1 = 365.25*(Y+4716);
- X2 = 30.6001*(M+1);
- p->rJD = X1 + X2 + D + B - 1524.5;
+ X1 = 36525*(Y+4716)/100;
+ X2 = 306001*(M+1)/10000;
+ p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000);
p->validJD = 1;
if( p->validHMS ){
- p->rJD += (p->h*3600.0 + p->m*60.0 + p->s)/86400.0;
+ p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000);
if( p->validTZ ){
- p->rJD -= p->tz*60/86400.0;
+ p->iJD -= p->tz*60000;
p->validYMD = 0;
p->validHMS = 0;
p->validTZ = 0;
@@ -9746,7 +11280,7 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){
return 1;
}
zDate += 10;
- while( isspace(*(u8*)zDate) || 'T'==*(u8*)zDate ){ zDate++; }
+ while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; }
if( parseHhMmSs(zDate, p)==0 ){
/* We got the time */
}else if( *zDate==0 ){
@@ -9766,6 +11300,17 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){
}
/*
+** Set the time to the current time reported by the VFS
+*/
+static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
+ double r;
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ sqlite3OsCurrentTime(db->pVfs, &r);
+ p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
+ p->validJD = 1;
+}
+
+/*
** Attempt to parse the given string into a Julian Day Number. Return
** the number of errors.
**
@@ -9786,20 +11331,18 @@ static int parseDateOrTime(
const char *zDate,
DateTime *p
){
- memset(p, 0, sizeof(*p));
+ int isRealNum; /* Return from sqlite3IsNumber(). Not used */
if( parseYyyyMmDd(zDate,p)==0 ){
return 0;
}else if( parseHhMmSs(zDate, p)==0 ){
return 0;
}else if( sqlite3StrICmp(zDate,"now")==0){
- double r;
- sqlite3 *db = sqlite3_context_db_handle(context);
- sqlite3OsCurrentTime(db->pVfs, &r);
- p->rJD = r;
- p->validJD = 1;
+ setDateTimeToCurrent(context, p);
return 0;
- }else if( sqlite3IsNumber(zDate, 0, SQLITE_UTF8) ){
- getValue(zDate, &p->rJD);
+ }else if( sqlite3IsNumber(zDate, &isRealNum, SQLITE_UTF8) ){
+ double r;
+ getValue(zDate, &r);
+ p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
p->validJD = 1;
return 0;
}
@@ -9817,14 +11360,14 @@ static void computeYMD(DateTime *p){
p->M = 1;
p->D = 1;
}else{
- Z = p->rJD + 0.5;
- A = (Z - 1867216.25)/36524.25;
+ Z = (int)((p->iJD + 43200000)/86400000);
+ A = (int)((Z - 1867216.25)/36524.25);
A = Z + 1 + A - (A/4);
B = A + 1524;
- C = (B - 122.1)/365.25;
- D = 365.25*C;
- E = (B-D)/30.6001;
- X1 = 30.6001*E;
+ C = (int)((B - 122.1)/365.25);
+ D = (36525*C)/100;
+ E = (int)((B-D)/30.6001);
+ X1 = (int)(30.6001*E);
p->D = B - D - X1;
p->M = E<14 ? E-1 : E-13;
p->Y = p->M>2 ? C - 4716 : C - 4715;
@@ -9836,13 +11379,12 @@ static void computeYMD(DateTime *p){
** Compute the Hour, Minute, and Seconds from the julian day number.
*/
static void computeHMS(DateTime *p){
- int Z, s;
+ int s;
if( p->validHMS ) return;
computeJD(p);
- Z = p->rJD + 0.5;
- s = (p->rJD + 0.5 - Z)*86400000.0 + 0.5;
- p->s = 0.001*s;
- s = p->s;
+ s = (int)((p->iJD + 43200000) % 86400000);
+ p->s = s/1000.0;
+ s = (int)p->s;
p->s -= s;
p->h = s/3600;
s -= p->h*3600;
@@ -9868,6 +11410,7 @@ static void clearYMD_HMS_TZ(DateTime *p){
p->validTZ = 0;
}
+#ifndef SQLITE_OMIT_LOCALTIME
/*
** Windows CE does not declare the localtime
** function as it is not defined anywhere.
@@ -9879,10 +11422,12 @@ struct tm *__cdecl localtime(const time_t *t);
#endif
/*
-** Compute the difference (in days) between localtime and UTC (a.k.a. GMT)
+** Compute the difference (in milliseconds)
+** between localtime and UTC (a.k.a. GMT)
+
** for the time value p where p is in UTC.
*/
-static double localtimeOffset(DateTime *p){
+static sqlite3_int64 localtimeOffset(DateTime *p){
DateTime x, y;
time_t t;
x = *p;
@@ -9895,13 +11440,13 @@ static double localtimeOffset(DateTime *p){
x.m = 0;
x.s = 0.0;
} else {
- int s = x.s + 0.5;
+ int s = (int)(x.s + 0.5);
x.s = s;
}
x.tz = 0;
x.validJD = 0;
computeJD(&x);
- t = (x.rJD-2440587.5)*86400.0 + 0.5;
+ t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
#ifdef HAVE_LOCALTIME_R
{
struct tm sLocal;
@@ -9913,10 +11458,21 @@ static double localtimeOffset(DateTime *p){
y.m = sLocal.tm_min;
y.s = sLocal.tm_sec;
}
+#elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S
+ {
+ struct tm sLocal;
+ localtime_s(&sLocal, &t);
+ y.Y = sLocal.tm_year + 1900;
+ y.M = sLocal.tm_mon + 1;
+ y.D = sLocal.tm_mday;
+ y.h = sLocal.tm_hour;
+ y.m = sLocal.tm_min;
+ y.s = sLocal.tm_sec;
+ }
#else
{
struct tm *pTm;
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
pTm = localtime(&t);
y.Y = pTm->tm_year + 1900;
y.M = pTm->tm_mon + 1;
@@ -9924,7 +11480,7 @@ static double localtimeOffset(DateTime *p){
y.h = pTm->tm_hour;
y.m = pTm->tm_min;
y.s = pTm->tm_sec;
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
}
#endif
y.validYMD = 1;
@@ -9932,8 +11488,9 @@ static double localtimeOffset(DateTime *p){
y.validJD = 0;
y.validTZ = 0;
computeJD(&y);
- return y.rJD - x.rJD;
+ return y.iJD - x.iJD;
}
+#endif /* SQLITE_OMIT_LOCALTIME */
/*
** Process a modifier to a date-time stamp. The modifiers are
@@ -9962,11 +11519,12 @@ static int parseModifier(const char *zMod, DateTime *p){
double r;
char *z, zBuf[30];
z = zBuf;
- for(n=0; n<sizeof(zBuf)-1 && zMod[n]; n++){
- z[n] = tolower(zMod[n]);
+ for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){
+ z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]];
}
z[n] = 0;
switch( z[0] ){
+#ifndef SQLITE_OMIT_LOCALTIME
case 'l': {
/* localtime
**
@@ -9975,32 +11533,36 @@ static int parseModifier(const char *zMod, DateTime *p){
*/
if( strcmp(z, "localtime")==0 ){
computeJD(p);
- p->rJD += localtimeOffset(p);
+ p->iJD += localtimeOffset(p);
clearYMD_HMS_TZ(p);
rc = 0;
}
break;
}
+#endif
case 'u': {
/*
** unixepoch
**
- ** Treat the current value of p->rJD as the number of
+ ** Treat the current value of p->iJD as the number of
** seconds since 1970. Convert to a real julian day number.
*/
if( strcmp(z, "unixepoch")==0 && p->validJD ){
- p->rJD = p->rJD/86400.0 + 2440587.5;
+ p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000;
clearYMD_HMS_TZ(p);
rc = 0;
- }else if( strcmp(z, "utc")==0 ){
- double c1;
+ }
+#ifndef SQLITE_OMIT_LOCALTIME
+ else if( strcmp(z, "utc")==0 ){
+ sqlite3_int64 c1;
computeJD(p);
c1 = localtimeOffset(p);
- p->rJD -= c1;
+ p->iJD -= c1;
clearYMD_HMS_TZ(p);
- p->rJD += c1 - localtimeOffset(p);
+ p->iJD += c1 - localtimeOffset(p);
rc = 0;
}
+#endif
break;
}
case 'w': {
@@ -10012,16 +11574,15 @@ static int parseModifier(const char *zMod, DateTime *p){
** date is already on the appropriate weekday, this is a no-op.
*/
if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0
- && (n=r)==r && n>=0 && r<7 ){
- int Z;
+ && (n=(int)r)==r && n>=0 && r<7 ){
+ sqlite3_int64 Z;
computeYMD_HMS(p);
p->validTZ = 0;
p->validJD = 0;
computeJD(p);
- Z = p->rJD + 1.5;
- Z %= 7;
+ Z = ((p->iJD + 129600000)/86400000) % 7;
if( Z>n ) Z -= 7;
- p->rJD += n - Z;
+ p->iJD += (n - Z)*86400000;
clearYMD_HMS_TZ(p);
rc = 0;
}
@@ -10067,6 +11628,7 @@ static int parseModifier(const char *zMod, DateTime *p){
case '7':
case '8':
case '9': {
+ double rRounder;
n = getValue(z, &r);
assert( n>=1 );
if( z[n]==':' ){
@@ -10077,54 +11639,59 @@ static int parseModifier(const char *zMod, DateTime *p){
*/
const char *z2 = z;
DateTime tx;
- int day;
- if( !isdigit(*(u8*)z2) ) z2++;
+ sqlite3_int64 day;
+ if( !sqlite3Isdigit(*z2) ) z2++;
memset(&tx, 0, sizeof(tx));
if( parseHhMmSs(z2, &tx) ) break;
computeJD(&tx);
- tx.rJD -= 0.5;
- day = (int)tx.rJD;
- tx.rJD -= day;
- if( z[0]=='-' ) tx.rJD = -tx.rJD;
+ tx.iJD -= 43200000;
+ day = tx.iJD/86400000;
+ tx.iJD -= day*86400000;
+ if( z[0]=='-' ) tx.iJD = -tx.iJD;
computeJD(p);
clearYMD_HMS_TZ(p);
- p->rJD += tx.rJD;
+ p->iJD += tx.iJD;
rc = 0;
break;
}
z += n;
- while( isspace(*(u8*)z) ) z++;
- n = strlen(z);
+ while( sqlite3Isspace(*z) ) z++;
+ n = sqlite3Strlen30(z);
if( n>10 || n<3 ) break;
if( z[n-1]=='s' ){ z[n-1] = 0; n--; }
computeJD(p);
rc = 0;
+ rRounder = r<0 ? -0.5 : +0.5;
if( n==3 && strcmp(z,"day")==0 ){
- p->rJD += r;
+ p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder);
}else if( n==4 && strcmp(z,"hour")==0 ){
- p->rJD += r/24.0;
+ p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder);
}else if( n==6 && strcmp(z,"minute")==0 ){
- p->rJD += r/(24.0*60.0);
+ p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder);
}else if( n==6 && strcmp(z,"second")==0 ){
- p->rJD += r/(24.0*60.0*60.0);
+ p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder);
}else if( n==5 && strcmp(z,"month")==0 ){
int x, y;
computeYMD_HMS(p);
- p->M += r;
+ p->M += (int)r;
x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12;
p->Y += x;
p->M -= x*12;
p->validJD = 0;
computeJD(p);
- y = r;
+ y = (int)r;
if( y!=r ){
- p->rJD += (r - y)*30.0;
+ p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder);
}
}else if( n==4 && strcmp(z,"year")==0 ){
+ int y = (int)r;
computeYMD_HMS(p);
- p->Y += r;
+ p->Y += y;
p->validJD = 0;
computeJD(p);
+ if( y!=r ){
+ p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder);
+ }
}else{
rc = 1;
}
@@ -10155,14 +11722,19 @@ static int isDate(
){
int i;
const unsigned char *z;
- static const unsigned char zDflt[] = "now";
+ int eType;
+ memset(p, 0, sizeof(*p));
if( argc==0 ){
- z = zDflt;
+ setDateTimeToCurrent(context, p);
+ }else if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
+ || eType==SQLITE_INTEGER ){
+ p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
+ p->validJD = 1;
}else{
z = sqlite3_value_text(argv[0]);
- }
- if( !z || parseDateOrTime(context, (char*)z, p) ){
- return 1;
+ if( !z || parseDateOrTime(context, (char*)z, p) ){
+ return 1;
+ }
}
for(i=1; i<argc; i++){
if( (z = sqlite3_value_text(argv[i]))==0 || parseModifier((char*)z, p) ){
@@ -10191,7 +11763,7 @@ static void juliandayFunc(
DateTime x;
if( isDate(context, argc, argv, &x)==0 ){
computeJD(&x);
- sqlite3_result_double(context, x.rJD);
+ sqlite3_result_double(context, x.iJD/86400000.0);
}
}
@@ -10279,11 +11851,13 @@ static void strftimeFunc(
){
DateTime x;
u64 n;
- int i, j;
+ size_t i,j;
char *z;
+ sqlite3 *db;
const char *zFmt = (const char*)sqlite3_value_text(argv[0]);
char zBuf[100];
if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return;
+ db = sqlite3_context_db_handle(context);
for(i=0, n=1; zFmt[i]; i++, n++){
if( zFmt[i]=='%' ){
switch( zFmt[i+1] ){
@@ -10317,13 +11891,17 @@ static void strftimeFunc(
i++;
}
}
+ testcase( n==sizeof(zBuf)-1 );
+ testcase( n==sizeof(zBuf) );
+ testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
+ testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] );
if( n<sizeof(zBuf) ){
z = zBuf;
- }else if( n>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
+ }else if( n>(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
return;
}else{
- z = sqlite3_malloc( n );
+ z = sqlite3DbMallocRaw(db, (int)n);
if( z==0 ){
sqlite3_result_error_nomem(context);
return;
@@ -10342,7 +11920,7 @@ static void strftimeFunc(
double s = x.s;
if( s>59.999 ) s = 59.999;
sqlite3_snprintf(7, &z[j],"%06.3f", s);
- j += strlen(&z[j]);
+ j += sqlite3Strlen30(&z[j]);
break;
}
case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break;
@@ -10354,10 +11932,10 @@ static void strftimeFunc(
y.M = 1;
y.D = 1;
computeJD(&y);
- nDay = x.rJD - y.rJD + 0.5;
+ nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
if( zFmt[i]=='W' ){
int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */
- wd = ((int)(x.rJD+0.5)) % 7;
+ wd = (int)(((x.iJD+43200000)/86400000)%7);
sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7);
j += 2;
}else{
@@ -10367,28 +11945,34 @@ static void strftimeFunc(
break;
}
case 'J': {
- sqlite3_snprintf(20, &z[j],"%.16g",x.rJD);
- j+=strlen(&z[j]);
+ sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0);
+ j+=sqlite3Strlen30(&z[j]);
break;
}
case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
case 's': {
- sqlite3_snprintf(30,&z[j],"%d",
- (int)((x.rJD-2440587.5)*86400.0 + 0.5));
- j += strlen(&z[j]);
+ sqlite3_snprintf(30,&z[j],"%lld",
+ (i64)(x.iJD/1000 - 21086676*(i64)10000));
+ j += sqlite3Strlen30(&z[j]);
break;
}
case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break;
- case 'w': z[j++] = (((int)(x.rJD+1.5)) % 7) + '0'; break;
- case 'Y': sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=strlen(&z[j]);break;
+ case 'w': {
+ z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0';
+ break;
+ }
+ case 'Y': {
+ sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]);
+ break;
+ }
default: z[j++] = '%'; break;
}
}
}
z[j] = 0;
sqlite3_result_text(context, z, -1,
- z==zBuf ? SQLITE_TRANSIENT : sqlite3_free);
+ z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC);
}
/*
@@ -10398,9 +11982,10 @@ static void strftimeFunc(
*/
static void ctimeFunc(
sqlite3_context *context,
- int argc,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
timeFunc(context, 0, 0);
}
@@ -10411,9 +11996,10 @@ static void ctimeFunc(
*/
static void cdateFunc(
sqlite3_context *context,
- int argc,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
dateFunc(context, 0, 0);
}
@@ -10424,9 +12010,10 @@ static void cdateFunc(
*/
static void ctimestampFunc(
sqlite3_context *context,
- int argc,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
datetimeFunc(context, 0, 0);
}
#endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */
@@ -10454,9 +12041,19 @@ static void currentTimeFunc(
double rT;
char zBuf[20];
+ UNUSED_PARAMETER(argc);
+ UNUSED_PARAMETER(argv);
+
db = sqlite3_context_db_handle(context);
sqlite3OsCurrentTime(db->pVfs, &rT);
+#ifndef SQLITE_OMIT_FLOATING_POINT
t = 86400.0*(rT - 2440587.5) + 0.5;
+#else
+ /* without floating point support, rT will have
+ ** already lost fractional day precision.
+ */
+ t = 86400 * (rT - 2440587) - 43200;
+#endif
#ifdef HAVE_GMTIME_R
{
struct tm sNow;
@@ -10466,10 +12063,10 @@ static void currentTimeFunc(
#else
{
struct tm *pTm;
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
pTm = gmtime(&t);
strftime(zBuf, 20, zFormat, pTm);
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
}
#endif
@@ -10482,44 +12079,30 @@ static void currentTimeFunc(
** functions. This should be the only routine in this file with
** external linkage.
*/
-SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(sqlite3 *db){
+SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){
+ static SQLITE_WSD FuncDef aDateTimeFuncs[] = {
#ifndef SQLITE_OMIT_DATETIME_FUNCS
- static const struct {
- char *zName;
- int nArg;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
- } aFuncs[] = {
- { "julianday", -1, juliandayFunc },
- { "date", -1, dateFunc },
- { "time", -1, timeFunc },
- { "datetime", -1, datetimeFunc },
- { "strftime", -1, strftimeFunc },
- { "current_time", 0, ctimeFunc },
- { "current_timestamp", 0, ctimestampFunc },
- { "current_date", 0, cdateFunc },
- };
- int i;
-
- for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
- SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
- }
+ FUNCTION(julianday, -1, 0, 0, juliandayFunc ),
+ FUNCTION(date, -1, 0, 0, dateFunc ),
+ FUNCTION(time, -1, 0, 0, timeFunc ),
+ FUNCTION(datetime, -1, 0, 0, datetimeFunc ),
+ FUNCTION(strftime, -1, 0, 0, strftimeFunc ),
+ FUNCTION(current_time, 0, 0, 0, ctimeFunc ),
+ FUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc),
+ FUNCTION(current_date, 0, 0, 0, cdateFunc ),
#else
- static const struct {
- char *zName;
- char *zFormat;
- } aFuncs[] = {
- { "current_time", "%H:%M:%S" },
- { "current_date", "%Y-%m-%d" },
- { "current_timestamp", "%Y-%m-%d %H:%M:%S" }
+ STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc),
+ STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d", 0, currentTimeFunc),
+ STR_FUNCTION(current_date, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc),
+#endif
};
int i;
+ FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
+ FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs);
- for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3CreateFunc(db, aFuncs[i].zName, 0, SQLITE_UTF8,
- aFuncs[i].zFormat, currentTimeFunc, 0, 0);
+ for(i=0; i<ArraySize(aDateTimeFuncs); i++){
+ sqlite3FuncDefInsert(pHash, &aFunc[i]);
}
-#endif
}
/************** End of date.c ************************************************/
@@ -10538,6 +12121,8 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(sqlite3 *db){
**
** This file contains OS interface code that is common to all
** architectures.
+**
+** $Id: os.c,v 1.127 2009/07/27 11:41:21 danielk1977 Exp $
*/
#define _SQLITE_OS_C_ 1
#undef _SQLITE_OS_C_
@@ -10559,14 +12144,14 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(sqlite3 *db){
** sqlite3OsLock()
**
*/
-#if defined(SQLITE_TEST) && (OS_WIN==0)
- #define DO_OS_MALLOC_TEST if (1) { \
- void *pTstAlloc = sqlite3_malloc(10); \
- if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \
- sqlite3_free(pTstAlloc); \
+#if defined(SQLITE_TEST) && (SQLITE_OS_WIN==0)
+ #define DO_OS_MALLOC_TEST(x) if (!x || !sqlite3IsMemJournal(x)) { \
+ void *pTstAlloc = sqlite3Malloc(10); \
+ if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \
+ sqlite3_free(pTstAlloc); \
}
#else
- #define DO_OS_MALLOC_TEST
+ #define DO_OS_MALLOC_TEST(x)
#endif
/*
@@ -10584,35 +12169,37 @@ SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file *pId){
return rc;
}
SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){
- DO_OS_MALLOC_TEST;
+ DO_OS_MALLOC_TEST(id);
return id->pMethods->xRead(id, pBuf, amt, offset);
}
SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){
- DO_OS_MALLOC_TEST;
+ DO_OS_MALLOC_TEST(id);
return id->pMethods->xWrite(id, pBuf, amt, offset);
}
SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){
return id->pMethods->xTruncate(id, size);
}
SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){
- DO_OS_MALLOC_TEST;
+ DO_OS_MALLOC_TEST(id);
return id->pMethods->xSync(id, flags);
}
SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){
+ DO_OS_MALLOC_TEST(id);
return id->pMethods->xFileSize(id, pSize);
}
SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){
- DO_OS_MALLOC_TEST;
+ DO_OS_MALLOC_TEST(id);
return id->pMethods->xLock(id, lockType);
}
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){
return id->pMethods->xUnlock(id, lockType);
}
-SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id){
- return id->pMethods->xCheckReservedLock(id);
+SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
+ DO_OS_MALLOC_TEST(id);
+ return id->pMethods->xCheckReservedLock(id, pResOut);
}
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
- return id->pMethods->xFileControl(id,op,pArg);
+ return id->pMethods->xFileControl(id, op, pArg);
}
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize;
@@ -10633,24 +12220,27 @@ SQLITE_PRIVATE int sqlite3OsOpen(
int flags,
int *pFlagsOut
){
- DO_OS_MALLOC_TEST;
- return pVfs->xOpen(pVfs, zPath, pFile, flags, pFlagsOut);
+ int rc;
+ DO_OS_MALLOC_TEST(0);
+ /* 0x7f1f is a mask of SQLITE_OPEN_ flags that are valid to be passed
+ ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example,
+ ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before
+ ** reaching the VFS. */
+ rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x7f1f, pFlagsOut);
+ assert( rc==SQLITE_OK || pFile->pMethods==0 );
+ return rc;
}
SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
return pVfs->xDelete(pVfs, zPath, dirSync);
}
-SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){
- int rc;
-#ifdef SQLITE_TEST
- void *pTstAlloc = sqlite3_malloc(10);
- if (!pTstAlloc) return -1;
- sqlite3_free(pTstAlloc);
-#endif
- rc = pVfs->xAccess(pVfs, zPath, flags);
- return rc;
-}
-SQLITE_PRIVATE int sqlite3OsGetTempname(sqlite3_vfs *pVfs, int nBufOut, char *zBufOut){
- return pVfs->xGetTempname(pVfs, nBufOut, zBufOut);
+SQLITE_PRIVATE int sqlite3OsAccess(
+ sqlite3_vfs *pVfs,
+ const char *zPath,
+ int flags,
+ int *pResOut
+){
+ DO_OS_MALLOC_TEST(0);
+ return pVfs->xAccess(pVfs, zPath, flags, pResOut);
}
SQLITE_PRIVATE int sqlite3OsFullPathname(
sqlite3_vfs *pVfs,
@@ -10660,18 +12250,20 @@ SQLITE_PRIVATE int sqlite3OsFullPathname(
){
return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut);
}
+#ifndef SQLITE_OMIT_LOAD_EXTENSION
SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){
return pVfs->xDlOpen(pVfs, zPath);
}
SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
pVfs->xDlError(pVfs, nByte, zBufOut);
}
-SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
- return pVfs->xDlSym(pVfs, pHandle, zSymbol);
+SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
+ return pVfs->xDlSym(pVfs, pHdle, zSym);
}
SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){
pVfs->xDlClose(pVfs, pHandle);
}
+#endif /* SQLITE_OMIT_LOAD_EXTENSION */
SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
return pVfs->xRandomness(pVfs, nByte, zBufOut);
}
@@ -10691,7 +12283,7 @@ SQLITE_PRIVATE int sqlite3OsOpenMalloc(
){
int rc = SQLITE_NOMEM;
sqlite3_file *pFile;
- pFile = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile);
+ pFile = (sqlite3_file *)sqlite3Malloc(pVfs->szOsFile);
if( pFile ){
rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags);
if( rc!=SQLITE_OK ){
@@ -10711,27 +12303,41 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *pFile){
}
/*
-** The list of all registered VFS implementations. This list is
-** initialized to the single VFS returned by sqlite3OsDefaultVfs()
-** upon the first call to sqlite3_vfs_find().
+** This function is a wrapper around the OS specific implementation of
+** sqlite3_os_init(). The purpose of the wrapper is to provide the
+** ability to simulate a malloc failure, so that the handling of an
+** error in sqlite3_os_init() by the upper layers can be tested.
*/
-static sqlite3_vfs *vfsList = 0;
+SQLITE_PRIVATE int sqlite3OsInit(void){
+ void *p = sqlite3_malloc(10);
+ if( p==0 ) return SQLITE_NOMEM;
+ sqlite3_free(p);
+ return sqlite3_os_init();
+}
+
+/*
+** The list of all registered VFS implementations.
+*/
+static sqlite3_vfs * SQLITE_WSD vfsList = 0;
+#define vfsList GLOBAL(sqlite3_vfs *, vfsList)
/*
** Locate a VFS by name. If no name is given, simply return the
** first VFS on the list.
*/
SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
-#endif
sqlite3_vfs *pVfs = 0;
- static int isInit = 0;
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex;
+#endif
+#ifndef SQLITE_OMIT_AUTOINIT
+ int rc = sqlite3_initialize();
+ if( rc ) return 0;
+#endif
+#if SQLITE_THREADSAFE
+ mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+#endif
sqlite3_mutex_enter(mutex);
- if( !isInit ){
- vfsList = sqlite3OsDefaultVfs();
- isInit = 1;
- }
for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){
if( zVfs==0 ) break;
if( strcmp(zVfs, pVfs->zName)==0 ) break;
@@ -10744,7 +12350,7 @@ SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){
** Unlink a VFS from the linked list
*/
static void vfsUnlink(sqlite3_vfs *pVfs){
- assert( sqlite3_mutex_held(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)) );
+ assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) );
if( pVfs==0 ){
/* No-op */
}else if( vfsList==pVfs ){
@@ -10766,10 +12372,12 @@ static void vfsUnlink(sqlite3_vfs *pVfs){
** true.
*/
SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+ sqlite3_mutex *mutex = 0;
+#ifndef SQLITE_OMIT_AUTOINIT
+ int rc = sqlite3_initialize();
+ if( rc ) return rc;
#endif
- sqlite3_vfs_find(0); /* Make sure we are initialized */
+ mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
sqlite3_mutex_enter(mutex);
vfsUnlink(pVfs);
if( makeDflt || vfsList==0 ){
@@ -10788,8 +12396,8 @@ SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
** Unregister a VFS so that it is no longer accessible.
*/
SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
#endif
sqlite3_mutex_enter(mutex);
vfsUnlink(pVfs);
@@ -10797,14 +12405,6 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){
return SQLITE_OK;
}
-/*
-** Provide a default sqlite3OsDefaultVfs() implementation in the
-** cases where none of the standard backends are used.
-*/
-#if !OS_UNIX && !OS_WIN && !OS_OS2
-SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){ return 0; }
-#endif
-
/************** End of os.c **************************************************/
/************** Begin file fault.c *******************************************/
/*
@@ -10818,161 +12418,150 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){ return 0; }
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file contains code to implement a fault-injector used for
-** testing and verification of SQLite.
**
-** Subsystems within SQLite can call sqlite3FaultStep() to see if
-** they should simulate a fault. sqlite3FaultStep() normally returns
-** zero but will return non-zero if a fault should be simulated.
-** Fault injectors can be used, for example, to simulate memory
-** allocation failures or I/O errors.
+** $Id: fault.c,v 1.11 2008/09/02 00:52:52 drh Exp $
+*/
+
+/*
+** This file contains code to support the concept of "benign"
+** malloc failures (when the xMalloc() or xRealloc() method of the
+** sqlite3_mem_methods structure fails to allocate a block of memory
+** and returns 0).
**
-** The fault injector is omitted from the code if SQLite is
-** compiled with -DSQLITE_OMIT_BUILTIN_TEST=1. There is a very
-** small performance hit for leaving the fault injector in the code.
-** Commerical products will probably want to omit the fault injector
-** from production builds. But safety-critical systems who work
-** under the motto "fly what you test and test what you fly" may
-** choose to leave the fault injector enabled even in production.
+** Most malloc failures are non-benign. After they occur, SQLite
+** abandons the current operation and returns an error code (usually
+** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily
+** fatal. For example, if a malloc fails while resizing a hash table, this
+** is completely recoverable simply by not carrying out the resize. The
+** hash table will continue to function normally. So a malloc failure
+** during a hash table resize is a benign fault.
*/
+
#ifndef SQLITE_OMIT_BUILTIN_TEST
/*
-** There can be various kinds of faults. For example, there can be
-** a memory allocation failure. Or an I/O failure. For each different
-** fault type, there is a separate FaultInjector structure to keep track
-** of the status of that fault.
+** Global variables.
*/
-static struct FaultInjector {
- int iCountdown; /* Number of pending successes before we hit a failure */
- int nRepeat; /* Number of times to repeat the failure */
- int nBenign; /* Number of benign failures seen since last config */
- int nFail; /* Number of failures seen since last config */
- u8 enable; /* True if enabled */
- i16 benign; /* Positive if next failure will be benign */
-} aFault[SQLITE_FAULTINJECTOR_COUNT];
+typedef struct BenignMallocHooks BenignMallocHooks;
+static SQLITE_WSD struct BenignMallocHooks {
+ void (*xBenignBegin)(void);
+ void (*xBenignEnd)(void);
+} sqlite3Hooks = { 0, 0 };
-/*
-** This routine configures and enables a fault injector. After
-** calling this routine, aFaultStep() will return false (zero)
-** nDelay times, then it will return true nRepeat times,
-** then it will again begin returning false.
+/* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks
+** structure. If writable static data is unsupported on the target,
+** we have to locate the state vector at run-time. In the more common
+** case where writable static data is supported, wsdHooks can refer directly
+** to the "sqlite3Hooks" state vector declared above.
*/
-SQLITE_PRIVATE void sqlite3FaultConfig(int id, int nDelay, int nRepeat){
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- aFault[id].iCountdown = nDelay;
- aFault[id].nRepeat = nRepeat;
- aFault[id].nBenign = 0;
- aFault[id].nFail = 0;
- aFault[id].enable = nDelay>=0;
- aFault[id].benign = 0;
-}
+#ifdef SQLITE_OMIT_WSD
+# define wsdHooksInit \
+ BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks)
+# define wsdHooks x[0]
+#else
+# define wsdHooksInit
+# define wsdHooks sqlite3Hooks
+#endif
-/*
-** Return the number of faults (both hard and benign faults) that have
-** occurred since the injector was last configured.
-*/
-SQLITE_PRIVATE int sqlite3FaultFailures(int id){
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- return aFault[id].nFail;
-}
/*
-** Return the number of benign faults that have occurred since the
-** injector was last configured.
+** Register hooks to call when sqlite3BeginBenignMalloc() and
+** sqlite3EndBenignMalloc() are called, respectively.
*/
-SQLITE_PRIVATE int sqlite3FaultBenignFailures(int id){
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- return aFault[id].nBenign;
+SQLITE_PRIVATE void sqlite3BenignMallocHooks(
+ void (*xBenignBegin)(void),
+ void (*xBenignEnd)(void)
+){
+ wsdHooksInit;
+ wsdHooks.xBenignBegin = xBenignBegin;
+ wsdHooks.xBenignEnd = xBenignEnd;
}
/*
-** Return the number of successes that will occur before the next failure.
-** If no failures are scheduled, return -1.
+** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that
+** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc()
+** indicates that subsequent malloc failures are non-benign.
*/
-SQLITE_PRIVATE int sqlite3FaultPending(int id){
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- if( aFault[id].enable ){
- return aFault[id].iCountdown;
- }else{
- return -1;
+SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){
+ wsdHooksInit;
+ if( wsdHooks.xBenignBegin ){
+ wsdHooks.xBenignBegin();
}
}
-
-/*
-** After this routine causes subsequent faults to be either benign
-** or hard (not benign), according to the "enable" parameter.
-**
-** Most faults are hard. In other words, most faults cause
-** an error to be propagated back up to the application interface.
-** However, sometimes a fault is easily recoverable. For example,
-** if a malloc fails while resizing a hash table, this is completely
-** recoverable simply by not carrying out the resize. The hash table
-** will continue to function normally. So a malloc failure during
-** a hash table resize is a benign fault.
-*/
-SQLITE_PRIVATE void sqlite3FaultBeginBenign(int id){
- if( id<0 ){
- for(id=0; id<SQLITE_FAULTINJECTOR_COUNT; id++){
- aFault[id].benign++;
- }
- }else{
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- aFault[id].benign++;
- }
-}
-SQLITE_PRIVATE void sqlite3FaultEndBenign(int id){
- if( id<0 ){
- for(id=0; id<SQLITE_FAULTINJECTOR_COUNT; id++){
- assert( aFault[id].benign>0 );
- aFault[id].benign--;
- }
- }else{
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- assert( aFault[id].benign>0 );
- aFault[id].benign--;
+SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){
+ wsdHooksInit;
+ if( wsdHooks.xBenignEnd ){
+ wsdHooks.xBenignEnd();
}
}
+#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */
+
+/************** End of fault.c ***********************************************/
+/************** Begin file mem0.c ********************************************/
+/*
+** 2008 October 28
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file contains a no-op memory allocation drivers for use when
+** SQLITE_ZERO_MALLOC is defined. The allocation drivers implemented
+** here always fail. SQLite will not operate with these drivers. These
+** are merely placeholders. Real drivers must be substituted using
+** sqlite3_config() before SQLite will operate.
+**
+** $Id: mem0.c,v 1.1 2008/10/28 18:58:20 drh Exp $
+*/
+
/*
-** This routine exists as a place to set a breakpoint that will
-** fire on any simulated fault.
+** This version of the memory allocator is the default. It is
+** used when no other memory allocator is specified using compile-time
+** macros.
*/
-static void sqlite3Fault(void){
- static int cnt = 0;
- cnt++;
-}
+#ifdef SQLITE_ZERO_MALLOC
+/*
+** No-op versions of all memory allocation routines
+*/
+static void *sqlite3MemMalloc(int nByte){ return 0; }
+static void sqlite3MemFree(void *pPrior){ return; }
+static void *sqlite3MemRealloc(void *pPrior, int nByte){ return 0; }
+static int sqlite3MemSize(void *pPrior){ return 0; }
+static int sqlite3MemRoundup(int n){ return n; }
+static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; }
+static void sqlite3MemShutdown(void *NotUsed){ return; }
/*
-** Check to see if a fault should be simulated. Return true to simulate
-** the fault. Return false if the fault should not be simulated.
+** This routine is the only routine in this file with external linkage.
+**
+** Populate the low-level memory allocation function pointers in
+** sqlite3GlobalConfig.m with pointers to the routines in this file.
*/
-SQLITE_PRIVATE int sqlite3FaultStep(int id){
- assert( id>=0 && id<SQLITE_FAULTINJECTOR_COUNT );
- if( likely(!aFault[id].enable) ){
- return 0;
- }
- if( aFault[id].iCountdown>0 ){
- aFault[id].iCountdown--;
- return 0;
- }
- sqlite3Fault();
- aFault[id].nFail++;
- if( aFault[id].benign>0 ){
- aFault[id].nBenign++;
- }
- aFault[id].nRepeat--;
- if( aFault[id].nRepeat<=0 ){
- aFault[id].enable = 0;
- }
- return 1;
+SQLITE_PRIVATE void sqlite3MemSetDefault(void){
+ static const sqlite3_mem_methods defaultMethods = {
+ sqlite3MemMalloc,
+ sqlite3MemFree,
+ sqlite3MemRealloc,
+ sqlite3MemSize,
+ sqlite3MemRoundup,
+ sqlite3MemInit,
+ sqlite3MemShutdown,
+ 0
+ };
+ sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
}
-#endif /* SQLITE_OMIT_BUILTIN_TEST */
+#endif /* SQLITE_ZERO_MALLOC */
-/************** End of fault.c ***********************************************/
+/************** End of mem0.c ************************************************/
/************** Begin file mem1.c ********************************************/
/*
** 2007 August 14
@@ -10985,10 +12574,15 @@ SQLITE_PRIVATE int sqlite3FaultStep(int id){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file contains the C functions that implement a memory
-** allocation subsystem for use by SQLite.
**
-** $Id: mem1.c,v 1.17 2008/03/18 00:07:11 drh Exp $
+** This file contains low-level memory allocation drivers for when
+** SQLite will use the standard C-library malloc/realloc/free interface
+** to obtain the memory it needs.
+**
+** This file contains implementations of the low-level memory allocation
+** routines specified in the sqlite3_mem_methods object.
+**
+** $Id: mem1.c,v 1.30 2009/03/23 04:33:33 danielk1977 Exp $
*/
/*
@@ -10999,212 +12593,117 @@ SQLITE_PRIVATE int sqlite3FaultStep(int id){
#ifdef SQLITE_SYSTEM_MALLOC
/*
-** All of the static variables used by this module are collected
-** into a single structure named "mem". This is to keep the
-** static variables organized and to reduce namespace pollution
-** when this module is combined with other in the amalgamation.
-*/
-static struct {
- /*
- ** The alarm callback and its arguments. The mem.mutex lock will
- ** be held while the callback is running. Recursive calls into
- ** the memory subsystem are allowed, but no new callbacks will be
- ** issued. The alarmBusy variable is set to prevent recursive
- ** callbacks.
- */
- sqlite3_int64 alarmThreshold;
- void (*alarmCallback)(void*, sqlite3_int64,int);
- void *alarmArg;
- int alarmBusy;
-
- /*
- ** Mutex to control access to the memory allocation subsystem.
- */
- sqlite3_mutex *mutex;
-
- /*
- ** Current allocation and high-water mark.
- */
- sqlite3_int64 nowUsed;
- sqlite3_int64 mxUsed;
-
-
-} mem;
-
-/*
-** Enter the mutex mem.mutex. Allocate it if it is not already allocated.
+** Like malloc(), but remember the size of the allocation
+** so that we can find it later using sqlite3MemSize().
+**
+** For this low-level routine, we are guaranteed that nByte>0 because
+** cases of nByte<=0 will be intercepted and dealt with by higher level
+** routines.
*/
-static void enterMem(void){
- if( mem.mutex==0 ){
- mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM);
+static void *sqlite3MemMalloc(int nByte){
+ sqlite3_int64 *p;
+ assert( nByte>0 );
+ nByte = ROUND8(nByte);
+ p = malloc( nByte+8 );
+ if( p ){
+ p[0] = nByte;
+ p++;
}
- sqlite3_mutex_enter(mem.mutex);
+ return (void *)p;
}
/*
-** Return the amount of memory currently checked out.
+** Like free() but works for allocations obtained from sqlite3MemMalloc()
+** or sqlite3MemRealloc().
+**
+** For this low-level routine, we already know that pPrior!=0 since
+** cases where pPrior==0 will have been intecepted and dealt with
+** by higher-level routines.
*/
-SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
- sqlite3_int64 n;
- enterMem();
- n = mem.nowUsed;
- sqlite3_mutex_leave(mem.mutex);
- return n;
+static void sqlite3MemFree(void *pPrior){
+ sqlite3_int64 *p = (sqlite3_int64*)pPrior;
+ assert( pPrior!=0 );
+ p--;
+ free(p);
}
/*
-** Return the maximum amount of memory that has ever been
-** checked out since either the beginning of this process
-** or since the most recent reset.
+** Like realloc(). Resize an allocation previously obtained from
+** sqlite3MemMalloc().
+**
+** For this low-level interface, we know that pPrior!=0. Cases where
+** pPrior==0 while have been intercepted by higher-level routine and
+** redirected to xMalloc. Similarly, we know that nByte>0 becauses
+** cases where nByte<=0 will have been intercepted by higher-level
+** routines and redirected to xFree.
*/
-SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
- sqlite3_int64 n;
- enterMem();
- n = mem.mxUsed;
- if( resetFlag ){
- mem.mxUsed = mem.nowUsed;
+static void *sqlite3MemRealloc(void *pPrior, int nByte){
+ sqlite3_int64 *p = (sqlite3_int64*)pPrior;
+ assert( pPrior!=0 && nByte>0 );
+ nByte = ROUND8(nByte);
+ p = (sqlite3_int64*)pPrior;
+ p--;
+ p = realloc(p, nByte+8 );
+ if( p ){
+ p[0] = nByte;
+ p++;
}
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-/*
-** Change the alarm callback
-*/
-SQLITE_API int sqlite3_memory_alarm(
- void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
- void *pArg,
- sqlite3_int64 iThreshold
-){
- enterMem();
- mem.alarmCallback = xCallback;
- mem.alarmArg = pArg;
- mem.alarmThreshold = iThreshold;
- sqlite3_mutex_leave(mem.mutex);
- return SQLITE_OK;
+ return (void*)p;
}
/*
-** Trigger the alarm
+** Report the allocated size of a prior return from xMalloc()
+** or xRealloc().
*/
-static void sqlite3MemsysAlarm(int nByte){
- void (*xCallback)(void*,sqlite3_int64,int);
- sqlite3_int64 nowUsed;
- void *pArg;
- if( mem.alarmCallback==0 || mem.alarmBusy ) return;
- mem.alarmBusy = 1;
- xCallback = mem.alarmCallback;
- nowUsed = mem.nowUsed;
- pArg = mem.alarmArg;
- sqlite3_mutex_leave(mem.mutex);
- xCallback(pArg, nowUsed, nByte);
- sqlite3_mutex_enter(mem.mutex);
- mem.alarmBusy = 0;
+static int sqlite3MemSize(void *pPrior){
+ sqlite3_int64 *p;
+ if( pPrior==0 ) return 0;
+ p = (sqlite3_int64*)pPrior;
+ p--;
+ return (int)p[0];
}
/*
-** Allocate nBytes of memory
+** Round up a request size to the next valid allocation size.
*/
-SQLITE_API void *sqlite3_malloc(int nBytes){
- sqlite3_int64 *p = 0;
- if( nBytes>0 ){
- enterMem();
- if( mem.alarmCallback!=0 && mem.nowUsed+nBytes>=mem.alarmThreshold ){
- sqlite3MemsysAlarm(nBytes);
- }
- if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
- p = 0;
- }else{
- p = malloc(nBytes+8);
- if( p==0 ){
- sqlite3MemsysAlarm(nBytes);
- p = malloc(nBytes+8);
- }
- }
- if( p ){
- p[0] = nBytes;
- p++;
- mem.nowUsed += nBytes;
- if( mem.nowUsed>mem.mxUsed ){
- mem.mxUsed = mem.nowUsed;
- }
- }
- sqlite3_mutex_leave(mem.mutex);
- }
- return (void*)p;
+static int sqlite3MemRoundup(int n){
+ return ROUND8(n);
}
/*
-** Free memory.
+** Initialize this module.
*/
-SQLITE_API void sqlite3_free(void *pPrior){
- sqlite3_int64 *p;
- int nByte;
- if( pPrior==0 ){
- return;
- }
- assert( mem.mutex!=0 );
- p = pPrior;
- p--;
- nByte = (int)*p;
- sqlite3_mutex_enter(mem.mutex);
- mem.nowUsed -= nByte;
- free(p);
- sqlite3_mutex_leave(mem.mutex);
+static int sqlite3MemInit(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ return SQLITE_OK;
}
/*
-** Return the number of bytes allocated at p.
+** Deinitialize this module.
*/
-SQLITE_PRIVATE int sqlite3MallocSize(void *p){
- sqlite3_int64 *pInt;
- if( !p ) return 0;
- pInt = p;
- return pInt[-1];
+static void sqlite3MemShutdown(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ return;
}
/*
-** Change the size of an existing memory allocation
+** This routine is the only routine in this file with external linkage.
+**
+** Populate the low-level memory allocation function pointers in
+** sqlite3GlobalConfig.m with pointers to the routines in this file.
*/
-SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
- int nOld;
- sqlite3_int64 *p;
- if( pPrior==0 ){
- return sqlite3_malloc(nBytes);
- }
- if( nBytes<=0 ){
- sqlite3_free(pPrior);
- return 0;
- }
- p = pPrior;
- p--;
- nOld = (int)p[0];
- assert( mem.mutex!=0 );
- sqlite3_mutex_enter(mem.mutex);
- if( mem.nowUsed+nBytes-nOld>=mem.alarmThreshold ){
- sqlite3MemsysAlarm(nBytes-nOld);
- }
- if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
- p = 0;
- }else{
- p = realloc(p, nBytes+8);
- if( p==0 ){
- sqlite3MemsysAlarm(nBytes);
- p = pPrior;
- p--;
- p = realloc(p, nBytes+8);
- }
- }
- if( p ){
- p[0] = nBytes;
- p++;
- mem.nowUsed += nBytes-nOld;
- if( mem.nowUsed>mem.mxUsed ){
- mem.mxUsed = mem.nowUsed;
- }
- }
- sqlite3_mutex_leave(mem.mutex);
- return (void*)p;
+SQLITE_PRIVATE void sqlite3MemSetDefault(void){
+ static const sqlite3_mem_methods defaultMethods = {
+ sqlite3MemMalloc,
+ sqlite3MemFree,
+ sqlite3MemRealloc,
+ sqlite3MemSize,
+ sqlite3MemRoundup,
+ sqlite3MemInit,
+ sqlite3MemShutdown,
+ 0
+ };
+ sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
}
#endif /* SQLITE_SYSTEM_MALLOC */
@@ -11222,10 +12721,17 @@ SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file contains the C functions that implement a memory
-** allocation subsystem for use by SQLite.
**
-** $Id: mem2.c,v 1.26 2008/04/10 14:57:25 drh Exp $
+** This file contains low-level memory allocation drivers for when
+** SQLite will use the standard C-library malloc/realloc/free interface
+** to obtain the memory it needs while adding lots of additional debugging
+** information to each allocation in order to help detect and fix memory
+** leaks and memory usage errors.
+**
+** This file contains implementations of the low-level memory allocation
+** routines specified in the sqlite3_mem_methods object.
+**
+** $Id: mem2.c,v 1.45 2009/03/23 04:33:33 danielk1977 Exp $
*/
/*
@@ -11241,7 +12747,7 @@ SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
extern int backtrace(void**,int);
extern void backtrace_symbols_fd(void*const*,int,int);
#else
-# define backtrace(A,B) 0
+# define backtrace(A,B) 1
# define backtrace_symbols_fd(A,B,C)
#endif
@@ -11285,29 +12791,12 @@ struct MemBlockHdr {
** when this module is combined with other in the amalgamation.
*/
static struct {
- /*
- ** The alarm callback and its arguments. The mem.mutex lock will
- ** be held while the callback is running. Recursive calls into
- ** the memory subsystem are allowed, but no new callbacks will be
- ** issued. The alarmBusy variable is set to prevent recursive
- ** callbacks.
- */
- sqlite3_int64 alarmThreshold;
- void (*alarmCallback)(void*, sqlite3_int64, int);
- void *alarmArg;
- int alarmBusy;
/*
** Mutex to control access to the memory allocation subsystem.
*/
sqlite3_mutex *mutex;
-
- /*
- ** Current allocation and high-water mark.
- */
- sqlite3_int64 nowUsed;
- sqlite3_int64 mxUsed;
-
+
/*
** Head and tail of a linked list of all outstanding allocations
*/
@@ -11334,84 +12823,35 @@ static struct {
/*
** Gather statistics on the sizes of memory allocations.
- ** sizeCnt[i] is the number of allocation attempts of i*8
+ ** nAlloc[i] is the number of allocation attempts of i*8
** bytes. i==NCSIZE is the number of allocation attempts for
** sizes more than NCSIZE*8 bytes.
*/
- int sizeCnt[NCSIZE];
+ int nAlloc[NCSIZE]; /* Total number of allocations */
+ int nCurrent[NCSIZE]; /* Current number of allocations */
+ int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */
} mem;
/*
-** Enter the mutex mem.mutex. Allocate it if it is not already allocated.
+** Adjust memory usage statistics
*/
-static void enterMem(void){
- if( mem.mutex==0 ){
- mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM);
+static void adjustStats(int iSize, int increment){
+ int i = ROUND8(iSize)/8;
+ if( i>NCSIZE-1 ){
+ i = NCSIZE - 1;
}
- sqlite3_mutex_enter(mem.mutex);
-}
-
-/*
-** Return the amount of memory currently checked out.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
- sqlite3_int64 n;
- enterMem();
- n = mem.nowUsed;
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-/*
-** Return the maximum amount of memory that has ever been
-** checked out since either the beginning of this process
-** or since the most recent reset.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
- sqlite3_int64 n;
- enterMem();
- n = mem.mxUsed;
- if( resetFlag ){
- mem.mxUsed = mem.nowUsed;
+ if( increment>0 ){
+ mem.nAlloc[i]++;
+ mem.nCurrent[i]++;
+ if( mem.nCurrent[i]>mem.mxCurrent[i] ){
+ mem.mxCurrent[i] = mem.nCurrent[i];
+ }
+ }else{
+ mem.nCurrent[i]--;
+ assert( mem.nCurrent[i]>=0 );
}
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-/*
-** Change the alarm callback
-*/
-SQLITE_API int sqlite3_memory_alarm(
- void(*xCallback)(void *pArg, sqlite3_int64 used, int N),
- void *pArg,
- sqlite3_int64 iThreshold
-){
- enterMem();
- mem.alarmCallback = xCallback;
- mem.alarmArg = pArg;
- mem.alarmThreshold = iThreshold;
- sqlite3_mutex_leave(mem.mutex);
- return SQLITE_OK;
-}
-
-/*
-** Trigger the alarm
-*/
-static void sqlite3MemsysAlarm(int nByte){
- void (*xCallback)(void*,sqlite3_int64,int);
- sqlite3_int64 nowUsed;
- void *pArg;
- if( mem.alarmCallback==0 || mem.alarmBusy ) return;
- mem.alarmBusy = 1;
- xCallback = mem.alarmCallback;
- nowUsed = mem.nowUsed;
- pArg = mem.alarmArg;
- sqlite3_mutex_leave(mem.mutex);
- xCallback(pArg, nowUsed, nByte);
- sqlite3_mutex_enter(mem.mutex);
- mem.alarmBusy = 0;
}
/*
@@ -11428,21 +12868,23 @@ static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){
p = (struct MemBlockHdr*)pAllocation;
p--;
- assert( p->iForeGuard==FOREGUARD );
- nReserve = (p->iSize+7)&~7;
+ assert( p->iForeGuard==(int)FOREGUARD );
+ nReserve = ROUND8(p->iSize);
pInt = (int*)pAllocation;
pU8 = (u8*)pAllocation;
- assert( pInt[nReserve/sizeof(int)]==REARGUARD );
- assert( (nReserve-0)<=p->iSize || pU8[nReserve-1]==0x65 );
- assert( (nReserve-1)<=p->iSize || pU8[nReserve-2]==0x65 );
- assert( (nReserve-2)<=p->iSize || pU8[nReserve-3]==0x65 );
+ assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD );
+ /* This checks any of the "extra" bytes allocated due
+ ** to rounding up to an 8 byte boundary to ensure
+ ** they haven't been overwritten.
+ */
+ while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 );
return p;
}
/*
** Return the number of bytes currently allocated at address p.
*/
-SQLITE_PRIVATE int sqlite3MallocSize(void *p){
+static int sqlite3MemSize(void *p){
struct MemBlockHdr *pHdr;
if( !p ){
return 0;
@@ -11452,99 +12894,103 @@ SQLITE_PRIVATE int sqlite3MallocSize(void *p){
}
/*
+** Initialize the memory allocation subsystem.
+*/
+static int sqlite3MemInit(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ assert( (sizeof(struct MemBlockHdr)&7) == 0 );
+ if( !sqlite3GlobalConfig.bMemstat ){
+ /* If memory status is enabled, then the malloc.c wrapper will already
+ ** hold the STATIC_MEM mutex when the routines here are invoked. */
+ mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Deinitialize the memory allocation subsystem.
+*/
+static void sqlite3MemShutdown(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ mem.mutex = 0;
+}
+
+/*
+** Round up a request size to the next valid allocation size.
+*/
+static int sqlite3MemRoundup(int n){
+ return ROUND8(n);
+}
+
+/*
** Allocate nByte bytes of memory.
*/
-SQLITE_API void *sqlite3_malloc(int nByte){
+static void *sqlite3MemMalloc(int nByte){
struct MemBlockHdr *pHdr;
void **pBt;
char *z;
int *pInt;
void *p = 0;
int totalSize;
-
- if( nByte>0 ){
- int nReserve;
- enterMem();
- assert( mem.disallow==0 );
- if( mem.alarmCallback!=0 && mem.nowUsed+nByte>=mem.alarmThreshold ){
- sqlite3MemsysAlarm(nByte);
- }
- nReserve = (nByte+7)&~7;
- if( nReserve/8>NCSIZE-1 ){
- mem.sizeCnt[NCSIZE-1]++;
- }else{
- mem.sizeCnt[nReserve/8]++;
- }
- totalSize = nReserve + sizeof(*pHdr) + sizeof(int) +
- mem.nBacktrace*sizeof(void*) + mem.nTitle;
- if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
- p = 0;
+ int nReserve;
+ sqlite3_mutex_enter(mem.mutex);
+ assert( mem.disallow==0 );
+ nReserve = ROUND8(nByte);
+ totalSize = nReserve + sizeof(*pHdr) + sizeof(int) +
+ mem.nBacktrace*sizeof(void*) + mem.nTitle;
+ p = malloc(totalSize);
+ if( p ){
+ z = p;
+ pBt = (void**)&z[mem.nTitle];
+ pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace];
+ pHdr->pNext = 0;
+ pHdr->pPrev = mem.pLast;
+ if( mem.pLast ){
+ mem.pLast->pNext = pHdr;
}else{
- p = malloc(totalSize);
- if( p==0 ){
- sqlite3MemsysAlarm(nByte);
- p = malloc(totalSize);
+ mem.pFirst = pHdr;
+ }
+ mem.pLast = pHdr;
+ pHdr->iForeGuard = FOREGUARD;
+ pHdr->nBacktraceSlots = mem.nBacktrace;
+ pHdr->nTitle = mem.nTitle;
+ if( mem.nBacktrace ){
+ void *aAddr[40];
+ pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1;
+ memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*));
+ assert(pBt[0]);
+ if( mem.xBacktrace ){
+ mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]);
}
+ }else{
+ pHdr->nBacktrace = 0;
}
- if( p ){
- z = p;
- pBt = (void**)&z[mem.nTitle];
- pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace];
- pHdr->pNext = 0;
- pHdr->pPrev = mem.pLast;
- if( mem.pLast ){
- mem.pLast->pNext = pHdr;
- }else{
- mem.pFirst = pHdr;
- }
- mem.pLast = pHdr;
- pHdr->iForeGuard = FOREGUARD;
- pHdr->nBacktraceSlots = mem.nBacktrace;
- pHdr->nTitle = mem.nTitle;
- if( mem.nBacktrace ){
- void *aAddr[40];
- pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1;
- memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*));
- if( mem.xBacktrace ){
- mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]);
- }
- }else{
- pHdr->nBacktrace = 0;
- }
- if( mem.nTitle ){
- memcpy(z, mem.zTitle, mem.nTitle);
- }
- pHdr->iSize = nByte;
- pInt = (int*)&pHdr[1];
- pInt[nReserve/sizeof(int)] = REARGUARD;
- memset(pInt, 0x65, nReserve);
- mem.nowUsed += nByte;
- if( mem.nowUsed>mem.mxUsed ){
- mem.mxUsed = mem.nowUsed;
- }
- p = (void*)pInt;
+ if( mem.nTitle ){
+ memcpy(z, mem.zTitle, mem.nTitle);
}
- sqlite3_mutex_leave(mem.mutex);
+ pHdr->iSize = nByte;
+ adjustStats(nByte, +1);
+ pInt = (int*)&pHdr[1];
+ pInt[nReserve/sizeof(int)] = REARGUARD;
+ memset(pInt, 0x65, nReserve);
+ p = (void*)pInt;
}
+ sqlite3_mutex_leave(mem.mutex);
return p;
}
/*
** Free memory.
*/
-SQLITE_API void sqlite3_free(void *pPrior){
+static void sqlite3MemFree(void *pPrior){
struct MemBlockHdr *pHdr;
void **pBt;
char *z;
- if( pPrior==0 ){
- return;
- }
- assert( mem.mutex!=0 );
+ assert( sqlite3GlobalConfig.bMemstat || mem.mutex!=0 );
pHdr = sqlite3MemsysGetHeader(pPrior);
pBt = (void**)pHdr;
pBt -= pHdr->nBacktraceSlots;
sqlite3_mutex_enter(mem.mutex);
- mem.nowUsed -= pHdr->iSize;
if( pHdr->pPrev ){
assert( pHdr->pPrev->pNext==pHdr );
pHdr->pPrev->pNext = pHdr->pNext;
@@ -11561,6 +13007,7 @@ SQLITE_API void sqlite3_free(void *pPrior){
}
z = (char*)pBt;
z -= pHdr->nTitle;
+ adjustStats(pHdr->iSize, -1);
memset(z, 0x2b, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) +
pHdr->iSize + sizeof(int) + pHdr->nTitle);
free(z);
@@ -11576,32 +13023,43 @@ SQLITE_API void sqlite3_free(void *pPrior){
** much more likely to break and we are much more liking to find
** the error.
*/
-SQLITE_API void *sqlite3_realloc(void *pPrior, int nByte){
+static void *sqlite3MemRealloc(void *pPrior, int nByte){
struct MemBlockHdr *pOldHdr;
void *pNew;
- if( pPrior==0 ){
- return sqlite3_malloc(nByte);
- }
- if( nByte<=0 ){
- sqlite3_free(pPrior);
- return 0;
- }
assert( mem.disallow==0 );
pOldHdr = sqlite3MemsysGetHeader(pPrior);
- pNew = sqlite3_malloc(nByte);
+ pNew = sqlite3MemMalloc(nByte);
if( pNew ){
memcpy(pNew, pPrior, nByte<pOldHdr->iSize ? nByte : pOldHdr->iSize);
if( nByte>pOldHdr->iSize ){
memset(&((char*)pNew)[pOldHdr->iSize], 0x2b, nByte - pOldHdr->iSize);
}
- sqlite3_free(pPrior);
+ sqlite3MemFree(pPrior);
}
return pNew;
}
/*
+** Populate the low-level memory allocation function pointers in
+** sqlite3GlobalConfig.m with pointers to the routines in this file.
+*/
+SQLITE_PRIVATE void sqlite3MemSetDefault(void){
+ static const sqlite3_mem_methods defaultMethods = {
+ sqlite3MemMalloc,
+ sqlite3MemFree,
+ sqlite3MemRealloc,
+ sqlite3MemSize,
+ sqlite3MemRoundup,
+ sqlite3MemInit,
+ sqlite3MemShutdown,
+ 0
+ };
+ sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
+}
+
+/*
** Set the number of backtrace levels kept for each allocation.
-** A value of zero turns of backtracing. The number is always rounded
+** A value of zero turns off backtracing. The number is always rounded
** up to a multiple of 2.
*/
SQLITE_PRIVATE void sqlite3MemdebugBacktrace(int depth){
@@ -11619,12 +13077,12 @@ SQLITE_PRIVATE void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int
** Set the title string for subsequent allocations.
*/
SQLITE_PRIVATE void sqlite3MemdebugSettitle(const char *zTitle){
- int n = strlen(zTitle) + 1;
- enterMem();
+ unsigned int n = sqlite3Strlen30(zTitle) + 1;
+ sqlite3_mutex_enter(mem.mutex);
if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1;
memcpy(mem.zTitle, zTitle, n);
mem.zTitle[n] = 0;
- mem.nTitle = (n+7)&~7;
+ mem.nTitle = ROUND8(n);
sqlite3_mutex_leave(mem.mutex);
}
@@ -11667,24 +13125,27 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
}
fprintf(out, "COUNTS:\n");
for(i=0; i<NCSIZE-1; i++){
- if( mem.sizeCnt[i] ){
- fprintf(out, " %3d: %d\n", i*8+8, mem.sizeCnt[i]);
+ if( mem.nAlloc[i] ){
+ fprintf(out, " %5d: %10d %10d %10d\n",
+ i*8, mem.nAlloc[i], mem.nCurrent[i], mem.mxCurrent[i]);
}
}
- if( mem.sizeCnt[NCSIZE-1] ){
- fprintf(out, " >%3d: %d\n", NCSIZE*8, mem.sizeCnt[NCSIZE-1]);
+ if( mem.nAlloc[NCSIZE-1] ){
+ fprintf(out, " %5d: %10d %10d %10d\n",
+ NCSIZE*8-8, mem.nAlloc[NCSIZE-1],
+ mem.nCurrent[NCSIZE-1], mem.mxCurrent[NCSIZE-1]);
}
fclose(out);
}
/*
-** Return the number of times sqlite3_malloc() has been called.
+** Return the number of times sqlite3MemMalloc() has been called.
*/
SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){
int i;
int nTotal = 0;
for(i=0; i<NCSIZE; i++){
- nTotal += mem.sizeCnt[i];
+ nTotal += mem.nAlloc[i];
}
return nTotal;
}
@@ -11709,21 +13170,27 @@ SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){
** allocation subsystem for use by SQLite.
**
** This version of the memory allocation subsystem omits all
-** use of malloc(). All dynamically allocatable memory is
-** contained in a static array, mem.aPool[]. The size of this
-** fixed memory pool is SQLITE_MEMORY_SIZE bytes.
+** use of malloc(). The SQLite user supplies a block of memory
+** before calling sqlite3_initialize() from which allocations
+** are made and returned by the xMalloc() and xRealloc()
+** implementations. Once sqlite3_initialize() has been called,
+** the amount of memory available to SQLite is fixed and cannot
+** be changed.
**
-** This version of the memory allocation subsystem is used if
-** and only if SQLITE_MEMORY_SIZE is defined.
+** This version of the memory allocation subsystem is included
+** in the build only if SQLITE_ENABLE_MEMSYS3 is defined.
**
-** $Id: mem3.c,v 1.12 2008/02/19 15:15:16 drh Exp $
+** $Id: mem3.c,v 1.25 2008/11/19 16:52:44 danielk1977 Exp $
*/
/*
-** This version of the memory allocator is used only when
-** SQLITE_MEMORY_SIZE is defined.
+** This version of the memory allocator is only built into the library
+** SQLITE_ENABLE_MEMSYS3 is defined. Defining this symbol does not
+** mean that the library will use a memory-pool by default, just that
+** it is available. The mempool allocator is activated by calling
+** sqlite3_config().
*/
-#ifdef SQLITE_MEMORY_SIZE
+#ifdef SQLITE_ENABLE_MEMSYS3
/*
** Maximum size (in Mem3Blocks) of a "small" chunk.
@@ -11753,7 +13220,7 @@ SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){
** u.hdr.prevSize can be part of the data for that chunk and should
** not be read or written.
**
-** We often identify a chunk by its index in mem.aPool[]. When
+** We often identify a chunk by its index in mem3.aPool[]. When
** this is done, the chunk index refers to the second block of
** the chunk. In this way, the first chunk has an index of 1.
** A chunk index of 0 means "no such chunk" and is the equivalent
@@ -11761,8 +13228,8 @@ SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){
**
** The second block of free chunks is of the form u.list. The
** two fields form a double-linked list of chunks of related sizes.
-** Pointers to the head of the list are stored in mem.aiSmall[]
-** for smaller chunks and mem.aiHash[] for larger chunks.
+** Pointers to the head of the list are stored in mem3.aiSmall[]
+** for smaller chunks and mem3.aiHash[] for larger chunks.
**
** The second block of a chunk is user data if the chunk is checked
** out. If a chunk is checked out, the user data may extend into
@@ -11776,19 +13243,26 @@ struct Mem3Block {
u32 size4x; /* 4x the size of current chunk in Mem3Block elements */
} hdr;
struct {
- u32 next; /* Index in mem.aPool[] of next free chunk */
- u32 prev; /* Index in mem.aPool[] of previous free chunk */
+ u32 next; /* Index in mem3.aPool[] of next free chunk */
+ u32 prev; /* Index in mem3.aPool[] of previous free chunk */
} list;
} u;
};
/*
** All of the static variables used by this module are collected
-** into a single structure named "mem". This is to keep the
+** into a single structure named "mem3". This is to keep the
** static variables organized and to reduce namespace pollution
** when this module is combined with other in the amalgamation.
*/
-static struct {
+static SQLITE_WSD struct Mem3Global {
+ /*
+ ** Memory available for allocation. nPool is the size of the array
+ ** (in Mem3Blocks) pointed to by aPool less 2.
+ */
+ u32 nPool;
+ Mem3Block *aPool;
+
/*
** True if we are evaluating an out-of-memory callback.
*/
@@ -11820,31 +13294,28 @@ static struct {
*/
u32 aiSmall[MX_SMALL-1]; /* For sizes 2 through MX_SMALL, inclusive */
u32 aiHash[N_HASH]; /* For sizes MX_SMALL+1 and larger */
+} mem3 = { 97535575 };
- /*
- ** Memory available for allocation
- */
- Mem3Block aPool[SQLITE_MEMORY_SIZE/sizeof(Mem3Block)+2];
-} mem;
+#define mem3 GLOBAL(struct Mem3Global, mem3)
/*
-** Unlink the chunk at mem.aPool[i] from list it is currently
+** Unlink the chunk at mem3.aPool[i] from list it is currently
** on. *pRoot is the list that i is a member of.
*/
static void memsys3UnlinkFromList(u32 i, u32 *pRoot){
- u32 next = mem.aPool[i].u.list.next;
- u32 prev = mem.aPool[i].u.list.prev;
- assert( sqlite3_mutex_held(mem.mutex) );
+ u32 next = mem3.aPool[i].u.list.next;
+ u32 prev = mem3.aPool[i].u.list.prev;
+ assert( sqlite3_mutex_held(mem3.mutex) );
if( prev==0 ){
*pRoot = next;
}else{
- mem.aPool[prev].u.list.next = next;
+ mem3.aPool[prev].u.list.next = next;
}
if( next ){
- mem.aPool[next].u.list.prev = prev;
+ mem3.aPool[next].u.list.prev = prev;
}
- mem.aPool[i].u.list.next = 0;
- mem.aPool[i].u.list.prev = 0;
+ mem3.aPool[i].u.list.next = 0;
+ mem3.aPool[i].u.list.prev = 0;
}
/*
@@ -11853,30 +13324,30 @@ static void memsys3UnlinkFromList(u32 i, u32 *pRoot){
*/
static void memsys3Unlink(u32 i){
u32 size, hash;
- assert( sqlite3_mutex_held(mem.mutex) );
- assert( (mem.aPool[i-1].u.hdr.size4x & 1)==0 );
+ assert( sqlite3_mutex_held(mem3.mutex) );
+ assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 );
assert( i>=1 );
- size = mem.aPool[i-1].u.hdr.size4x/4;
- assert( size==mem.aPool[i+size-1].u.hdr.prevSize );
+ size = mem3.aPool[i-1].u.hdr.size4x/4;
+ assert( size==mem3.aPool[i+size-1].u.hdr.prevSize );
assert( size>=2 );
if( size <= MX_SMALL ){
- memsys3UnlinkFromList(i, &mem.aiSmall[size-2]);
+ memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]);
}else{
hash = size % N_HASH;
- memsys3UnlinkFromList(i, &mem.aiHash[hash]);
+ memsys3UnlinkFromList(i, &mem3.aiHash[hash]);
}
}
/*
-** Link the chunk at mem.aPool[i] so that is on the list rooted
+** Link the chunk at mem3.aPool[i] so that is on the list rooted
** at *pRoot.
*/
static void memsys3LinkIntoList(u32 i, u32 *pRoot){
- assert( sqlite3_mutex_held(mem.mutex) );
- mem.aPool[i].u.list.next = *pRoot;
- mem.aPool[i].u.list.prev = 0;
+ assert( sqlite3_mutex_held(mem3.mutex) );
+ mem3.aPool[i].u.list.next = *pRoot;
+ mem3.aPool[i].u.list.prev = 0;
if( *pRoot ){
- mem.aPool[*pRoot].u.list.prev = i;
+ mem3.aPool[*pRoot].u.list.prev = i;
}
*pRoot = i;
}
@@ -11887,174 +13358,113 @@ static void memsys3LinkIntoList(u32 i, u32 *pRoot){
*/
static void memsys3Link(u32 i){
u32 size, hash;
- assert( sqlite3_mutex_held(mem.mutex) );
+ assert( sqlite3_mutex_held(mem3.mutex) );
assert( i>=1 );
- assert( (mem.aPool[i-1].u.hdr.size4x & 1)==0 );
- size = mem.aPool[i-1].u.hdr.size4x/4;
- assert( size==mem.aPool[i+size-1].u.hdr.prevSize );
+ assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 );
+ size = mem3.aPool[i-1].u.hdr.size4x/4;
+ assert( size==mem3.aPool[i+size-1].u.hdr.prevSize );
assert( size>=2 );
if( size <= MX_SMALL ){
- memsys3LinkIntoList(i, &mem.aiSmall[size-2]);
+ memsys3LinkIntoList(i, &mem3.aiSmall[size-2]);
}else{
hash = size % N_HASH;
- memsys3LinkIntoList(i, &mem.aiHash[hash]);
+ memsys3LinkIntoList(i, &mem3.aiHash[hash]);
}
}
/*
-** Enter the mutex mem.mutex. Allocate it if it is not already allocated.
-**
-** Also: Initialize the memory allocation subsystem the first time
-** this routine is called.
+** If the STATIC_MEM mutex is not already held, obtain it now. The mutex
+** will already be held (obtained by code in malloc.c) if
+** sqlite3GlobalConfig.bMemStat is true.
*/
static void memsys3Enter(void){
- if( mem.mutex==0 ){
- mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM);
- mem.aPool[0].u.hdr.size4x = SQLITE_MEMORY_SIZE/2 + 2;
- mem.aPool[SQLITE_MEMORY_SIZE/8].u.hdr.prevSize = SQLITE_MEMORY_SIZE/8;
- mem.aPool[SQLITE_MEMORY_SIZE/8].u.hdr.size4x = 1;
- mem.iMaster = 1;
- mem.szMaster = SQLITE_MEMORY_SIZE/8;
- mem.mnMaster = mem.szMaster;
+ if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){
+ mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
}
- sqlite3_mutex_enter(mem.mutex);
+ sqlite3_mutex_enter(mem3.mutex);
}
-
-/*
-** Return the amount of memory currently checked out.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
- sqlite3_int64 n;
- memsys3Enter();
- n = SQLITE_MEMORY_SIZE - mem.szMaster*8;
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-/*
-** Return the maximum amount of memory that has ever been
-** checked out since either the beginning of this process
-** or since the most recent reset.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
- sqlite3_int64 n;
- memsys3Enter();
- n = SQLITE_MEMORY_SIZE - mem.mnMaster*8;
- if( resetFlag ){
- mem.mnMaster = mem.szMaster;
- }
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-/*
-** Change the alarm callback.
-**
-** This is a no-op for the static memory allocator. The purpose
-** of the memory alarm is to support sqlite3_soft_heap_limit().
-** But with this memory allocator, the soft_heap_limit is really
-** a hard limit that is fixed at SQLITE_MEMORY_SIZE.
-*/
-SQLITE_API int sqlite3_memory_alarm(
- void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
- void *pArg,
- sqlite3_int64 iThreshold
-){
- return SQLITE_OK;
+static void memsys3Leave(void){
+ sqlite3_mutex_leave(mem3.mutex);
}
/*
** Called when we are unable to satisfy an allocation of nBytes.
*/
static void memsys3OutOfMemory(int nByte){
- if( !mem.alarmBusy ){
- mem.alarmBusy = 1;
- assert( sqlite3_mutex_held(mem.mutex) );
- sqlite3_mutex_leave(mem.mutex);
+ if( !mem3.alarmBusy ){
+ mem3.alarmBusy = 1;
+ assert( sqlite3_mutex_held(mem3.mutex) );
+ sqlite3_mutex_leave(mem3.mutex);
sqlite3_release_memory(nByte);
- sqlite3_mutex_enter(mem.mutex);
- mem.alarmBusy = 0;
+ sqlite3_mutex_enter(mem3.mutex);
+ mem3.alarmBusy = 0;
}
}
-/*
-** Return the size of an outstanding allocation, in bytes. The
-** size returned omits the 8-byte header overhead. This only
-** works for chunks that are currently checked out.
-*/
-SQLITE_PRIVATE int sqlite3MallocSize(void *p){
- int iSize = 0;
- if( p ){
- Mem3Block *pBlock = (Mem3Block*)p;
- assert( (pBlock[-1].u.hdr.size4x&1)!=0 );
- iSize = (pBlock[-1].u.hdr.size4x&~3)*2 - 4;
- }
- return iSize;
-}
/*
** Chunk i is a free chunk that has been unlinked. Adjust its
** size parameters for check-out and return a pointer to the
** user portion of the chunk.
*/
-static void *memsys3Checkout(u32 i, int nBlock){
+static void *memsys3Checkout(u32 i, u32 nBlock){
u32 x;
- assert( sqlite3_mutex_held(mem.mutex) );
+ assert( sqlite3_mutex_held(mem3.mutex) );
assert( i>=1 );
- assert( mem.aPool[i-1].u.hdr.size4x/4==nBlock );
- assert( mem.aPool[i+nBlock-1].u.hdr.prevSize==nBlock );
- x = mem.aPool[i-1].u.hdr.size4x;
- mem.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2);
- mem.aPool[i+nBlock-1].u.hdr.prevSize = nBlock;
- mem.aPool[i+nBlock-1].u.hdr.size4x |= 2;
- return &mem.aPool[i];
+ assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock );
+ assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock );
+ x = mem3.aPool[i-1].u.hdr.size4x;
+ mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2);
+ mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock;
+ mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2;
+ return &mem3.aPool[i];
}
/*
-** Carve a piece off of the end of the mem.iMaster free chunk.
+** Carve a piece off of the end of the mem3.iMaster free chunk.
** Return a pointer to the new allocation. Or, if the master chunk
** is not large enough, return 0.
*/
-static void *memsys3FromMaster(int nBlock){
- assert( sqlite3_mutex_held(mem.mutex) );
- assert( mem.szMaster>=nBlock );
- if( nBlock>=mem.szMaster-1 ){
+static void *memsys3FromMaster(u32 nBlock){
+ assert( sqlite3_mutex_held(mem3.mutex) );
+ assert( mem3.szMaster>=nBlock );
+ if( nBlock>=mem3.szMaster-1 ){
/* Use the entire master */
- void *p = memsys3Checkout(mem.iMaster, mem.szMaster);
- mem.iMaster = 0;
- mem.szMaster = 0;
- mem.mnMaster = 0;
+ void *p = memsys3Checkout(mem3.iMaster, mem3.szMaster);
+ mem3.iMaster = 0;
+ mem3.szMaster = 0;
+ mem3.mnMaster = 0;
return p;
}else{
/* Split the master block. Return the tail. */
u32 newi, x;
- newi = mem.iMaster + mem.szMaster - nBlock;
- assert( newi > mem.iMaster+1 );
- mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.prevSize = nBlock;
- mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.size4x |= 2;
- mem.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1;
- mem.szMaster -= nBlock;
- mem.aPool[newi-1].u.hdr.prevSize = mem.szMaster;
- x = mem.aPool[mem.iMaster-1].u.hdr.size4x & 2;
- mem.aPool[mem.iMaster-1].u.hdr.size4x = mem.szMaster*4 | x;
- if( mem.szMaster < mem.mnMaster ){
- mem.mnMaster = mem.szMaster;
+ newi = mem3.iMaster + mem3.szMaster - nBlock;
+ assert( newi > mem3.iMaster+1 );
+ mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = nBlock;
+ mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x |= 2;
+ mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1;
+ mem3.szMaster -= nBlock;
+ mem3.aPool[newi-1].u.hdr.prevSize = mem3.szMaster;
+ x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
+ mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
+ if( mem3.szMaster < mem3.mnMaster ){
+ mem3.mnMaster = mem3.szMaster;
}
- return (void*)&mem.aPool[newi];
+ return (void*)&mem3.aPool[newi];
}
}
/*
** *pRoot is the head of a list of free chunks of the same size
** or same size hash. In other words, *pRoot is an entry in either
-** mem.aiSmall[] or mem.aiHash[].
+** mem3.aiSmall[] or mem3.aiHash[].
**
** This routine examines all entries on the given list and tries
** to coalesce each entries with adjacent free chunks.
**
-** If it sees a chunk that is larger than mem.iMaster, it replaces
-** the current mem.iMaster with the new larger chunk. In order for
-** this mem.iMaster replacement to work, the master chunk must be
+** If it sees a chunk that is larger than mem3.iMaster, it replaces
+** the current mem3.iMaster with the new larger chunk. In order for
+** this mem3.iMaster replacement to work, the master chunk must be
** linked into the hash tables. That is not the normal state of
** affairs, of course. The calling routine must link the master
** chunk before invoking this routine, then must unlink the (possibly
@@ -12063,31 +13473,31 @@ static void *memsys3FromMaster(int nBlock){
static void memsys3Merge(u32 *pRoot){
u32 iNext, prev, size, i, x;
- assert( sqlite3_mutex_held(mem.mutex) );
+ assert( sqlite3_mutex_held(mem3.mutex) );
for(i=*pRoot; i>0; i=iNext){
- iNext = mem.aPool[i].u.list.next;
- size = mem.aPool[i-1].u.hdr.size4x;
+ iNext = mem3.aPool[i].u.list.next;
+ size = mem3.aPool[i-1].u.hdr.size4x;
assert( (size&1)==0 );
if( (size&2)==0 ){
memsys3UnlinkFromList(i, pRoot);
- assert( i > mem.aPool[i-1].u.hdr.prevSize );
- prev = i - mem.aPool[i-1].u.hdr.prevSize;
+ assert( i > mem3.aPool[i-1].u.hdr.prevSize );
+ prev = i - mem3.aPool[i-1].u.hdr.prevSize;
if( prev==iNext ){
- iNext = mem.aPool[prev].u.list.next;
+ iNext = mem3.aPool[prev].u.list.next;
}
memsys3Unlink(prev);
size = i + size/4 - prev;
- x = mem.aPool[prev-1].u.hdr.size4x & 2;
- mem.aPool[prev-1].u.hdr.size4x = size*4 | x;
- mem.aPool[prev+size-1].u.hdr.prevSize = size;
+ x = mem3.aPool[prev-1].u.hdr.size4x & 2;
+ mem3.aPool[prev-1].u.hdr.size4x = size*4 | x;
+ mem3.aPool[prev+size-1].u.hdr.prevSize = size;
memsys3Link(prev);
i = prev;
}else{
size /= 4;
}
- if( size>mem.szMaster ){
- mem.iMaster = i;
- mem.szMaster = size;
+ if( size>mem3.szMaster ){
+ mem3.iMaster = i;
+ mem3.szMaster = size;
}
}
}
@@ -12095,20 +13505,23 @@ static void memsys3Merge(u32 *pRoot){
/*
** Return a block of memory of at least nBytes in size.
** Return NULL if unable.
+**
+** This function assumes that the necessary mutexes, if any, are
+** already held by the caller. Hence "Unsafe".
*/
-static void *memsys3Malloc(int nByte){
+static void *memsys3MallocUnsafe(int nByte){
u32 i;
- int nBlock;
- int toFree;
+ u32 nBlock;
+ u32 toFree;
- assert( sqlite3_mutex_held(mem.mutex) );
+ assert( sqlite3_mutex_held(mem3.mutex) );
assert( sizeof(Mem3Block)==8 );
if( nByte<=12 ){
nBlock = 2;
}else{
nBlock = (nByte + 11)/8;
}
- assert( nBlock >= 2 );
+ assert( nBlock>=2 );
/* STEP 1:
** Look for an entry of the correct size in either the small
@@ -12116,16 +13529,16 @@ static void *memsys3Malloc(int nByte){
** successful most of the time (about 9 times out of 10).
*/
if( nBlock <= MX_SMALL ){
- i = mem.aiSmall[nBlock-2];
+ i = mem3.aiSmall[nBlock-2];
if( i>0 ){
- memsys3UnlinkFromList(i, &mem.aiSmall[nBlock-2]);
+ memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]);
return memsys3Checkout(i, nBlock);
}
}else{
int hash = nBlock % N_HASH;
- for(i=mem.aiHash[hash]; i>0; i=mem.aPool[i].u.list.next){
- if( mem.aPool[i-1].u.hdr.size4x/4==nBlock ){
- memsys3UnlinkFromList(i, &mem.aiHash[hash]);
+ for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){
+ if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){
+ memsys3UnlinkFromList(i, &mem3.aiHash[hash]);
return memsys3Checkout(i, nBlock);
}
}
@@ -12135,7 +13548,7 @@ static void *memsys3Malloc(int nByte){
** Try to satisfy the allocation by carving a piece off of the end
** of the master chunk. This step usually works if step 1 fails.
*/
- if( mem.szMaster>=nBlock ){
+ if( mem3.szMaster>=nBlock ){
return memsys3FromMaster(nBlock);
}
@@ -12147,22 +13560,22 @@ static void *memsys3Malloc(int nByte){
** of the end of the master chunk. This step happens very
** rarely (we hope!)
*/
- for(toFree=nBlock*16; toFree<SQLITE_MEMORY_SIZE*2; toFree *= 2){
+ for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){
memsys3OutOfMemory(toFree);
- if( mem.iMaster ){
- memsys3Link(mem.iMaster);
- mem.iMaster = 0;
- mem.szMaster = 0;
+ if( mem3.iMaster ){
+ memsys3Link(mem3.iMaster);
+ mem3.iMaster = 0;
+ mem3.szMaster = 0;
}
for(i=0; i<N_HASH; i++){
- memsys3Merge(&mem.aiHash[i]);
+ memsys3Merge(&mem3.aiHash[i]);
}
for(i=0; i<MX_SMALL-1; i++){
- memsys3Merge(&mem.aiSmall[i]);
+ memsys3Merge(&mem3.aiSmall[i]);
}
- if( mem.szMaster ){
- memsys3Unlink(mem.iMaster);
- if( mem.szMaster>=nBlock ){
+ if( mem3.szMaster ){
+ memsys3Unlink(mem3.iMaster);
+ if( mem3.szMaster>=nBlock ){
return memsys3FromMaster(nBlock);
}
}
@@ -12174,73 +13587,96 @@ static void *memsys3Malloc(int nByte){
/*
** Free an outstanding memory allocation.
+**
+** This function assumes that the necessary mutexes, if any, are
+** already held by the caller. Hence "Unsafe".
*/
-void memsys3Free(void *pOld){
+void memsys3FreeUnsafe(void *pOld){
Mem3Block *p = (Mem3Block*)pOld;
int i;
u32 size, x;
- assert( sqlite3_mutex_held(mem.mutex) );
- assert( p>mem.aPool && p<&mem.aPool[SQLITE_MEMORY_SIZE/8] );
- i = p - mem.aPool;
- assert( (mem.aPool[i-1].u.hdr.size4x&1)==1 );
- size = mem.aPool[i-1].u.hdr.size4x/4;
- assert( i+size<=SQLITE_MEMORY_SIZE/8+1 );
- mem.aPool[i-1].u.hdr.size4x &= ~1;
- mem.aPool[i+size-1].u.hdr.prevSize = size;
- mem.aPool[i+size-1].u.hdr.size4x &= ~2;
+ assert( sqlite3_mutex_held(mem3.mutex) );
+ assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] );
+ i = p - mem3.aPool;
+ assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 );
+ size = mem3.aPool[i-1].u.hdr.size4x/4;
+ assert( i+size<=mem3.nPool+1 );
+ mem3.aPool[i-1].u.hdr.size4x &= ~1;
+ mem3.aPool[i+size-1].u.hdr.prevSize = size;
+ mem3.aPool[i+size-1].u.hdr.size4x &= ~2;
memsys3Link(i);
/* Try to expand the master using the newly freed chunk */
- if( mem.iMaster ){
- while( (mem.aPool[mem.iMaster-1].u.hdr.size4x&2)==0 ){
- size = mem.aPool[mem.iMaster-1].u.hdr.prevSize;
- mem.iMaster -= size;
- mem.szMaster += size;
- memsys3Unlink(mem.iMaster);
- x = mem.aPool[mem.iMaster-1].u.hdr.size4x & 2;
- mem.aPool[mem.iMaster-1].u.hdr.size4x = mem.szMaster*4 | x;
- mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.prevSize = mem.szMaster;
+ if( mem3.iMaster ){
+ while( (mem3.aPool[mem3.iMaster-1].u.hdr.size4x&2)==0 ){
+ size = mem3.aPool[mem3.iMaster-1].u.hdr.prevSize;
+ mem3.iMaster -= size;
+ mem3.szMaster += size;
+ memsys3Unlink(mem3.iMaster);
+ x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
+ mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
+ mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster;
}
- x = mem.aPool[mem.iMaster-1].u.hdr.size4x & 2;
- while( (mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.size4x&1)==0 ){
- memsys3Unlink(mem.iMaster+mem.szMaster);
- mem.szMaster += mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.size4x/4;
- mem.aPool[mem.iMaster-1].u.hdr.size4x = mem.szMaster*4 | x;
- mem.aPool[mem.iMaster+mem.szMaster-1].u.hdr.prevSize = mem.szMaster;
+ x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
+ while( (mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x&1)==0 ){
+ memsys3Unlink(mem3.iMaster+mem3.szMaster);
+ mem3.szMaster += mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x/4;
+ mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
+ mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster;
}
}
}
/*
-** Allocate nBytes of memory
+** Return the size of an outstanding allocation, in bytes. The
+** size returned omits the 8-byte header overhead. This only
+** works for chunks that are currently checked out.
*/
-SQLITE_API void *sqlite3_malloc(int nBytes){
- sqlite3_int64 *p = 0;
- if( nBytes>0 ){
- memsys3Enter();
- p = memsys3Malloc(nBytes);
- sqlite3_mutex_leave(mem.mutex);
+static int memsys3Size(void *p){
+ Mem3Block *pBlock;
+ if( p==0 ) return 0;
+ pBlock = (Mem3Block*)p;
+ assert( (pBlock[-1].u.hdr.size4x&1)!=0 );
+ return (pBlock[-1].u.hdr.size4x&~3)*2 - 4;
+}
+
+/*
+** Round up a request size to the next valid allocation size.
+*/
+static int memsys3Roundup(int n){
+ if( n<=12 ){
+ return 12;
+ }else{
+ return ((n+11)&~7) - 4;
}
+}
+
+/*
+** Allocate nBytes of memory.
+*/
+static void *memsys3Malloc(int nBytes){
+ sqlite3_int64 *p;
+ assert( nBytes>0 ); /* malloc.c filters out 0 byte requests */
+ memsys3Enter();
+ p = memsys3MallocUnsafe(nBytes);
+ memsys3Leave();
return (void*)p;
}
/*
** Free memory.
*/
-SQLITE_API void sqlite3_free(void *pPrior){
- if( pPrior==0 ){
- return;
- }
- assert( mem.mutex!=0 );
- sqlite3_mutex_enter(mem.mutex);
- memsys3Free(pPrior);
- sqlite3_mutex_leave(mem.mutex);
+void memsys3Free(void *pPrior){
+ assert( pPrior );
+ memsys3Enter();
+ memsys3FreeUnsafe(pPrior);
+ memsys3Leave();
}
/*
** Change the size of an existing memory allocation
*/
-SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
+void *memsys3Realloc(void *pPrior, int nBytes){
int nOld;
void *p;
if( pPrior==0 ){
@@ -12250,33 +13686,68 @@ SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
sqlite3_free(pPrior);
return 0;
}
- assert( mem.mutex!=0 );
- nOld = sqlite3MallocSize(pPrior);
+ nOld = memsys3Size(pPrior);
if( nBytes<=nOld && nBytes>=nOld-128 ){
return pPrior;
}
- sqlite3_mutex_enter(mem.mutex);
- p = memsys3Malloc(nBytes);
+ memsys3Enter();
+ p = memsys3MallocUnsafe(nBytes);
if( p ){
if( nOld<nBytes ){
memcpy(p, pPrior, nOld);
}else{
memcpy(p, pPrior, nBytes);
}
- memsys3Free(pPrior);
+ memsys3FreeUnsafe(pPrior);
}
- sqlite3_mutex_leave(mem.mutex);
+ memsys3Leave();
return p;
}
/*
+** Initialize this module.
+*/
+static int memsys3Init(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ if( !sqlite3GlobalConfig.pHeap ){
+ return SQLITE_ERROR;
+ }
+
+ /* Store a pointer to the memory block in global structure mem3. */
+ assert( sizeof(Mem3Block)==8 );
+ mem3.aPool = (Mem3Block *)sqlite3GlobalConfig.pHeap;
+ mem3.nPool = (sqlite3GlobalConfig.nHeap / sizeof(Mem3Block)) - 2;
+
+ /* Initialize the master block. */
+ mem3.szMaster = mem3.nPool;
+ mem3.mnMaster = mem3.szMaster;
+ mem3.iMaster = 1;
+ mem3.aPool[0].u.hdr.size4x = (mem3.szMaster<<2) + 2;
+ mem3.aPool[mem3.nPool].u.hdr.prevSize = mem3.nPool;
+ mem3.aPool[mem3.nPool].u.hdr.size4x = 1;
+
+ return SQLITE_OK;
+}
+
+/*
+** Deinitialize this module.
+*/
+static void memsys3Shutdown(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ mem3.mutex = 0;
+ return;
+}
+
+
+
+/*
** Open the file indicated and write a log of all unfreed memory
** allocations into that log.
*/
-SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
+SQLITE_PRIVATE void sqlite3Memsys3Dump(const char *zFilename){
#ifdef SQLITE_DEBUG
FILE *out;
- int i, j;
+ u32 i, j;
u32 size;
if( zFilename==0 || zFilename[0]==0 ){
out = stdout;
@@ -12290,62 +13761,88 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
}
memsys3Enter();
fprintf(out, "CHUNKS:\n");
- for(i=1; i<=SQLITE_MEMORY_SIZE/8; i+=size/4){
- size = mem.aPool[i-1].u.hdr.size4x;
+ for(i=1; i<=mem3.nPool; i+=size/4){
+ size = mem3.aPool[i-1].u.hdr.size4x;
if( size/4<=1 ){
- fprintf(out, "%p size error\n", &mem.aPool[i]);
+ fprintf(out, "%p size error\n", &mem3.aPool[i]);
assert( 0 );
break;
}
- if( (size&1)==0 && mem.aPool[i+size/4-1].u.hdr.prevSize!=size/4 ){
- fprintf(out, "%p tail size does not match\n", &mem.aPool[i]);
+ if( (size&1)==0 && mem3.aPool[i+size/4-1].u.hdr.prevSize!=size/4 ){
+ fprintf(out, "%p tail size does not match\n", &mem3.aPool[i]);
assert( 0 );
break;
}
- if( ((mem.aPool[i+size/4-1].u.hdr.size4x&2)>>1)!=(size&1) ){
- fprintf(out, "%p tail checkout bit is incorrect\n", &mem.aPool[i]);
+ if( ((mem3.aPool[i+size/4-1].u.hdr.size4x&2)>>1)!=(size&1) ){
+ fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]);
assert( 0 );
break;
}
if( size&1 ){
- fprintf(out, "%p %6d bytes checked out\n", &mem.aPool[i], (size/4)*8-8);
+ fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8);
}else{
- fprintf(out, "%p %6d bytes free%s\n", &mem.aPool[i], (size/4)*8-8,
- i==mem.iMaster ? " **master**" : "");
+ fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8,
+ i==mem3.iMaster ? " **master**" : "");
}
}
for(i=0; i<MX_SMALL-1; i++){
- if( mem.aiSmall[i]==0 ) continue;
+ if( mem3.aiSmall[i]==0 ) continue;
fprintf(out, "small(%2d):", i);
- for(j = mem.aiSmall[i]; j>0; j=mem.aPool[j].u.list.next){
- fprintf(out, " %p(%d)", &mem.aPool[j],
- (mem.aPool[j-1].u.hdr.size4x/4)*8-8);
+ for(j = mem3.aiSmall[i]; j>0; j=mem3.aPool[j].u.list.next){
+ fprintf(out, " %p(%d)", &mem3.aPool[j],
+ (mem3.aPool[j-1].u.hdr.size4x/4)*8-8);
}
fprintf(out, "\n");
}
for(i=0; i<N_HASH; i++){
- if( mem.aiHash[i]==0 ) continue;
+ if( mem3.aiHash[i]==0 ) continue;
fprintf(out, "hash(%2d):", i);
- for(j = mem.aiHash[i]; j>0; j=mem.aPool[j].u.list.next){
- fprintf(out, " %p(%d)", &mem.aPool[j],
- (mem.aPool[j-1].u.hdr.size4x/4)*8-8);
+ for(j = mem3.aiHash[i]; j>0; j=mem3.aPool[j].u.list.next){
+ fprintf(out, " %p(%d)", &mem3.aPool[j],
+ (mem3.aPool[j-1].u.hdr.size4x/4)*8-8);
}
fprintf(out, "\n");
}
- fprintf(out, "master=%d\n", mem.iMaster);
- fprintf(out, "nowUsed=%d\n", SQLITE_MEMORY_SIZE - mem.szMaster*8);
- fprintf(out, "mxUsed=%d\n", SQLITE_MEMORY_SIZE - mem.mnMaster*8);
- sqlite3_mutex_leave(mem.mutex);
+ fprintf(out, "master=%d\n", mem3.iMaster);
+ fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szMaster*8);
+ fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnMaster*8);
+ sqlite3_mutex_leave(mem3.mutex);
if( out==stdout ){
fflush(stdout);
}else{
fclose(out);
}
+#else
+ UNUSED_PARAMETER(zFilename);
#endif
}
+/*
+** This routine is the only routine in this file with external
+** linkage.
+**
+** Populate the low-level memory allocation function pointers in
+** sqlite3GlobalConfig.m with pointers to the routines in this file. The
+** arguments specify the block of memory to manage.
+**
+** This routine is only called by sqlite3_config(), and therefore
+** is not required to be threadsafe (it is not).
+*/
+SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){
+ static const sqlite3_mem_methods mempoolMethods = {
+ memsys3Malloc,
+ memsys3Free,
+ memsys3Realloc,
+ memsys3Size,
+ memsys3Roundup,
+ memsys3Init,
+ memsys3Shutdown,
+ 0
+ };
+ return &mempoolMethods;
+}
-#endif /* !SQLITE_MEMORY_SIZE */
+#endif /* SQLITE_ENABLE_MEMSYS3 */
/************** End of mem3.c ************************************************/
/************** Begin file mem5.c ********************************************/
@@ -12364,95 +13861,88 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
** allocation subsystem for use by SQLite.
**
** This version of the memory allocation subsystem omits all
-** use of malloc(). All dynamically allocatable memory is
-** contained in a static array, mem.aPool[]. The size of this
-** fixed memory pool is SQLITE_POW2_MEMORY_SIZE bytes.
+** use of malloc(). The application gives SQLite a block of memory
+** before calling sqlite3_initialize() from which allocations
+** are made and returned by the xMalloc() and xRealloc()
+** implementations. Once sqlite3_initialize() has been called,
+** the amount of memory available to SQLite is fixed and cannot
+** be changed.
+**
+** This version of the memory allocation subsystem is included
+** in the build only if SQLITE_ENABLE_MEMSYS5 is defined.
+**
+** This memory allocator uses the following algorithm:
+**
+** 1. All memory allocations sizes are rounded up to a power of 2.
**
-** This version of the memory allocation subsystem is used if
-** and only if SQLITE_POW2_MEMORY_SIZE is defined.
+** 2. If two adjacent free blocks are the halves of a larger block,
+** then the two blocks are coalesed into the single larger block.
**
-** $Id: mem5.c,v 1.4 2008/02/19 15:15:16 drh Exp $
+** 3. New memory is allocated from the first available free block.
+**
+** This algorithm is described in: J. M. Robson. "Bounds for Some Functions
+** Concerning Dynamic Storage Allocation". Journal of the Association for
+** Computing Machinery, Volume 21, Number 8, July 1974, pages 491-499.
+**
+** Let n be the size of the largest allocation divided by the minimum
+** allocation size (after rounding all sizes up to a power of 2.) Let M
+** be the maximum amount of memory ever outstanding at one time. Let
+** N be the total amount of memory available for allocation. Robson
+** proved that this memory allocator will never breakdown due to
+** fragmentation as long as the following constraint holds:
+**
+** N >= M*(1 + log2(n)/2) - n + 1
+**
+** The sqlite3_status() logic tracks the maximum values of n and M so
+** that an application can, at any time, verify this constraint.
*/
/*
** This version of the memory allocator is used only when
-** SQLITE_POW2_MEMORY_SIZE is defined.
-*/
-#ifdef SQLITE_POW2_MEMORY_SIZE
-
-/*
-** Log2 of the minimum size of an allocation. For example, if
-** 4 then all allocations will be rounded up to at least 16 bytes.
-** If 5 then all allocations will be rounded up to at least 32 bytes.
+** SQLITE_ENABLE_MEMSYS5 is defined.
*/
-#ifndef SQLITE_POW2_LOGMIN
-# define SQLITE_POW2_LOGMIN 6
-#endif
-#define POW2_MIN (1<<SQLITE_POW2_LOGMIN)
-
-/*
-** Log2 of the maximum size of an allocation.
-*/
-#ifndef SQLITE_POW2_LOGMAX
-# define SQLITE_POW2_LOGMAX 18
-#endif
-#define POW2_MAX (((unsigned int)1)<<SQLITE_POW2_LOGMAX)
-
-/*
-** Number of distinct allocation sizes.
-*/
-#define NSIZE (SQLITE_POW2_LOGMAX - SQLITE_POW2_LOGMIN + 1)
+#ifdef SQLITE_ENABLE_MEMSYS5
/*
** A minimum allocation is an instance of the following structure.
** Larger allocations are an array of these structures where the
** size of the array is a power of 2.
+**
+** The size of this object must be a power of two. That fact is
+** verified in memsys5Init().
*/
-typedef struct Mem5Block Mem5Block;
-struct Mem5Block {
- union {
- char aData[POW2_MIN];
- struct {
- int next; /* Index in mem.aPool[] of next free chunk */
- int prev; /* Index in mem.aPool[] of previous free chunk */
- } list;
- } u;
+typedef struct Mem5Link Mem5Link;
+struct Mem5Link {
+ int next; /* Index of next free chunk */
+ int prev; /* Index of previous free chunk */
};
/*
-** Number of blocks of memory available for allocation.
-*/
-#define NBLOCK (SQLITE_POW2_MEMORY_SIZE/POW2_MIN)
-
-/*
-** The size in blocks of an POW2_MAX allocation
+** Maximum size of any allocation is ((1<<LOGMAX)*mem5.szAtom). Since
+** mem5.szAtom is always at least 8 and 32-bit integers are used,
+** it is not actually possible to reach this limit.
*/
-#define SZ_MAX (1<<(NSIZE-1))
+#define LOGMAX 30
/*
-** Masks used for mem.aCtrl[] elements.
+** Masks used for mem5.aCtrl[] elements.
*/
-#define CTRL_LOGSIZE 0x1f /* Log2 Size of this block relative to POW2_MIN */
+#define CTRL_LOGSIZE 0x1f /* Log2 Size of this block */
#define CTRL_FREE 0x20 /* True if not checked out */
/*
** All of the static variables used by this module are collected
-** into a single structure named "mem". This is to keep the
+** into a single structure named "mem5". This is to keep the
** static variables organized and to reduce namespace pollution
** when this module is combined with other in the amalgamation.
*/
-static struct {
+static SQLITE_WSD struct Mem5Global {
/*
- ** The alarm callback and its arguments. The mem.mutex lock will
- ** be held while the callback is running. Recursive calls into
- ** the memory subsystem are allowed, but no new callbacks will be
- ** issued. The alarmBusy variable is set to prevent recursive
- ** callbacks.
+ ** Memory available for allocation
*/
- sqlite3_int64 alarmThreshold;
- void (*alarmCallback)(void*, sqlite3_int64,int);
- void *alarmArg;
- int alarmBusy;
+ int szAtom; /* Smallest possible allocation in bytes */
+ int nBlock; /* Number of szAtom sized blocks in zPool */
+ u8 *zPool; /* Memory available to be allocated */
/*
** Mutex to control access to the memory allocation subsystem.
@@ -12472,150 +13962,83 @@ static struct {
u32 maxRequest; /* Largest allocation (exclusive of internal frag) */
/*
- ** Lists of free blocks of various sizes.
+ ** Lists of free blocks. aiFreelist[0] is a list of free blocks of
+ ** size mem5.szAtom. aiFreelist[1] holds blocks of size szAtom*2.
+ ** and so forth.
*/
- int aiFreelist[NSIZE];
+ int aiFreelist[LOGMAX+1];
/*
** Space for tracking which blocks are checked out and the size
** of each block. One byte per block.
*/
- u8 aCtrl[NBLOCK];
+ u8 *aCtrl;
- /*
- ** Memory available for allocation
- */
- Mem5Block aPool[NBLOCK];
-} mem;
+} mem5 = { 0 };
/*
-** Unlink the chunk at mem.aPool[i] from list it is currently
-** on. It should be found on mem.aiFreelist[iLogsize].
+** Access the static variable through a macro for SQLITE_OMIT_WSD
+*/
+#define mem5 GLOBAL(struct Mem5Global, mem5)
+
+/*
+** Assuming mem5.zPool is divided up into an array of Mem5Link
+** structures, return a pointer to the idx-th such lik.
+*/
+#define MEM5LINK(idx) ((Mem5Link *)(&mem5.zPool[(idx)*mem5.szAtom]))
+
+/*
+** Unlink the chunk at mem5.aPool[i] from list it is currently
+** on. It should be found on mem5.aiFreelist[iLogsize].
*/
static void memsys5Unlink(int i, int iLogsize){
int next, prev;
- assert( i>=0 && i<NBLOCK );
- assert( iLogsize>=0 && iLogsize<NSIZE );
- assert( (mem.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
- assert( sqlite3_mutex_held(mem.mutex) );
+ assert( i>=0 && i<mem5.nBlock );
+ assert( iLogsize>=0 && iLogsize<=LOGMAX );
+ assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
- next = mem.aPool[i].u.list.next;
- prev = mem.aPool[i].u.list.prev;
+ next = MEM5LINK(i)->next;
+ prev = MEM5LINK(i)->prev;
if( prev<0 ){
- mem.aiFreelist[iLogsize] = next;
+ mem5.aiFreelist[iLogsize] = next;
}else{
- mem.aPool[prev].u.list.next = next;
+ MEM5LINK(prev)->next = next;
}
if( next>=0 ){
- mem.aPool[next].u.list.prev = prev;
+ MEM5LINK(next)->prev = prev;
}
}
/*
-** Link the chunk at mem.aPool[i] so that is on the iLogsize
+** Link the chunk at mem5.aPool[i] so that is on the iLogsize
** free list.
*/
static void memsys5Link(int i, int iLogsize){
int x;
- assert( sqlite3_mutex_held(mem.mutex) );
- assert( i>=0 && i<NBLOCK );
- assert( iLogsize>=0 && iLogsize<NSIZE );
- assert( (mem.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
+ assert( sqlite3_mutex_held(mem5.mutex) );
+ assert( i>=0 && i<mem5.nBlock );
+ assert( iLogsize>=0 && iLogsize<=LOGMAX );
+ assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
- mem.aPool[i].u.list.next = x = mem.aiFreelist[iLogsize];
- mem.aPool[i].u.list.prev = -1;
+ x = MEM5LINK(i)->next = mem5.aiFreelist[iLogsize];
+ MEM5LINK(i)->prev = -1;
if( x>=0 ){
- assert( x<NBLOCK );
- mem.aPool[x].u.list.prev = i;
+ assert( x<mem5.nBlock );
+ MEM5LINK(x)->prev = i;
}
- mem.aiFreelist[iLogsize] = i;
+ mem5.aiFreelist[iLogsize] = i;
}
/*
-** Enter the mutex mem.mutex. Allocate it if it is not already allocated.
-**
-** Also: Initialize the memory allocation subsystem the first time
-** this routine is called.
+** If the STATIC_MEM mutex is not already held, obtain it now. The mutex
+** will already be held (obtained by code in malloc.c) if
+** sqlite3GlobalConfig.bMemStat is true.
*/
static void memsys5Enter(void){
- if( mem.mutex==0 ){
- int i;
- assert( sizeof(Mem5Block)==POW2_MIN );
- assert( (SQLITE_POW2_MEMORY_SIZE % POW2_MAX)==0 );
- assert( SQLITE_POW2_MEMORY_SIZE>=POW2_MAX );
- mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM);
- sqlite3_mutex_enter(mem.mutex);
- for(i=0; i<NSIZE; i++) mem.aiFreelist[i] = -1;
- for(i=0; i<=NBLOCK-SZ_MAX; i += SZ_MAX){
- mem.aCtrl[i] = (NSIZE-1) | CTRL_FREE;
- memsys5Link(i, NSIZE-1);
- }
- }else{
- sqlite3_mutex_enter(mem.mutex);
- }
-}
-
-/*
-** Return the amount of memory currently checked out.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
- return mem.currentOut;
-}
-
-/*
-** Return the maximum amount of memory that has ever been
-** checked out since either the beginning of this process
-** or since the most recent reset.
-*/
-SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
- sqlite3_int64 n;
- memsys5Enter();
- n = mem.maxOut;
- if( resetFlag ){
- mem.maxOut = mem.currentOut;
- }
- sqlite3_mutex_leave(mem.mutex);
- return n;
-}
-
-
-/*
-** Trigger the alarm
-*/
-static void memsys5Alarm(int nByte){
- void (*xCallback)(void*,sqlite3_int64,int);
- sqlite3_int64 nowUsed;
- void *pArg;
- if( mem.alarmCallback==0 || mem.alarmBusy ) return;
- mem.alarmBusy = 1;
- xCallback = mem.alarmCallback;
- nowUsed = mem.currentOut;
- pArg = mem.alarmArg;
- sqlite3_mutex_leave(mem.mutex);
- xCallback(pArg, nowUsed, nByte);
- sqlite3_mutex_enter(mem.mutex);
- mem.alarmBusy = 0;
+ sqlite3_mutex_enter(mem5.mutex);
}
-
-/*
-** Change the alarm callback.
-**
-** This is a no-op for the static memory allocator. The purpose
-** of the memory alarm is to support sqlite3_soft_heap_limit().
-** But with this memory allocator, the soft_heap_limit is really
-** a hard limit that is fixed at SQLITE_POW2_MEMORY_SIZE.
-*/
-SQLITE_API int sqlite3_memory_alarm(
- void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
- void *pArg,
- sqlite3_int64 iThreshold
-){
- memsys5Enter();
- mem.alarmCallback = xCallback;
- mem.alarmArg = pArg;
- mem.alarmThreshold = iThreshold;
- sqlite3_mutex_leave(mem.mutex);
- return SQLITE_OK;
+static void memsys5Leave(void){
+ sqlite3_mutex_leave(mem5.mutex);
}
/*
@@ -12623,12 +14046,12 @@ SQLITE_API int sqlite3_memory_alarm(
** size returned omits the 8-byte header overhead. This only
** works for chunks that are currently checked out.
*/
-SQLITE_PRIVATE int sqlite3MallocSize(void *p){
+static int memsys5Size(void *p){
int iSize = 0;
if( p ){
- int i = ((Mem5Block*)p) - mem.aPool;
- assert( i>=0 && i<NBLOCK );
- iSize = 1 << ((mem.aCtrl[i]&CTRL_LOGSIZE) + SQLITE_POW2_LOGMIN);
+ int i = ((u8 *)p-mem5.zPool)/mem5.szAtom;
+ assert( i>=0 && i<mem5.nBlock );
+ iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE));
}
return iSize;
}
@@ -12641,12 +14064,12 @@ static int memsys5UnlinkFirst(int iLogsize){
int i;
int iFirst;
- assert( iLogsize>=0 && iLogsize<NSIZE );
- i = iFirst = mem.aiFreelist[iLogsize];
+ assert( iLogsize>=0 && iLogsize<=LOGMAX );
+ i = iFirst = mem5.aiFreelist[iLogsize];
assert( iFirst>=0 );
while( i>0 ){
if( i<iFirst ) iFirst = i;
- i = mem.aPool[i].u.list.next;
+ i = MEM5LINK(i)->next;
}
memsys5Unlink(iFirst, iLogsize);
return iFirst;
@@ -12654,176 +14077,296 @@ static int memsys5UnlinkFirst(int iLogsize){
/*
** Return a block of memory of at least nBytes in size.
-** Return NULL if unable.
+** Return NULL if unable. Return NULL if nBytes==0.
+**
+** The caller guarantees that nByte positive.
+**
+** The caller has obtained a mutex prior to invoking this
+** routine so there is never any chance that two or more
+** threads can be in this routine at the same time.
*/
-static void *memsys5Malloc(int nByte){
- int i; /* Index of a mem.aPool[] slot */
- int iBin; /* Index into mem.aiFreelist[] */
+static void *memsys5MallocUnsafe(int nByte){
+ int i; /* Index of a mem5.aPool[] slot */
+ int iBin; /* Index into mem5.aiFreelist[] */
int iFullSz; /* Size of allocation rounded up to power of 2 */
int iLogsize; /* Log2 of iFullSz/POW2_MIN */
- assert( sqlite3_mutex_held(mem.mutex) );
+ /* nByte must be a positive */
+ assert( nByte>0 );
/* Keep track of the maximum allocation request. Even unfulfilled
** requests are counted */
- if( nByte>mem.maxRequest ){
- mem.maxRequest = nByte;
+ if( (u32)nByte>mem5.maxRequest ){
+ mem5.maxRequest = nByte;
}
- /* Simulate a memory allocation fault */
- if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ) return 0;
+ /* Abort if the requested allocation size is larger than the largest
+ ** power of two that we can represent using 32-bit signed integers.
+ */
+ if( nByte > 0x40000000 ){
+ return 0;
+ }
/* Round nByte up to the next valid power of two */
- if( nByte>POW2_MAX ) return 0;
- for(iFullSz=POW2_MIN, iLogsize=0; iFullSz<nByte; iFullSz *= 2, iLogsize++){}
+ for(iFullSz=mem5.szAtom, iLogsize=0; iFullSz<nByte; iFullSz *= 2, iLogsize++){}
- /* If we will be over the memory alarm threshold after this allocation,
- ** then trigger the memory overflow alarm */
- if( mem.alarmCallback!=0 && mem.currentOut+iFullSz>=mem.alarmThreshold ){
- memsys5Alarm(iFullSz);
- }
-
- /* Make sure mem.aiFreelist[iLogsize] contains at least one free
+ /* Make sure mem5.aiFreelist[iLogsize] contains at least one free
** block. If not, then split a block of the next larger power of
** two in order to create a new free block of size iLogsize.
*/
- for(iBin=iLogsize; mem.aiFreelist[iBin]<0 && iBin<NSIZE; iBin++){}
- if( iBin>=NSIZE ) return 0;
+ for(iBin=iLogsize; mem5.aiFreelist[iBin]<0 && iBin<=LOGMAX; iBin++){}
+ if( iBin>LOGMAX ) return 0;
i = memsys5UnlinkFirst(iBin);
while( iBin>iLogsize ){
int newSize;
iBin--;
newSize = 1 << iBin;
- mem.aCtrl[i+newSize] = CTRL_FREE | iBin;
+ mem5.aCtrl[i+newSize] = CTRL_FREE | iBin;
memsys5Link(i+newSize, iBin);
}
- mem.aCtrl[i] = iLogsize;
+ mem5.aCtrl[i] = iLogsize;
/* Update allocator performance statistics. */
- mem.nAlloc++;
- mem.totalAlloc += iFullSz;
- mem.totalExcess += iFullSz - nByte;
- mem.currentCount++;
- mem.currentOut += iFullSz;
- if( mem.maxCount<mem.currentCount ) mem.maxCount = mem.currentCount;
- if( mem.maxOut<mem.currentOut ) mem.maxOut = mem.currentOut;
+ mem5.nAlloc++;
+ mem5.totalAlloc += iFullSz;
+ mem5.totalExcess += iFullSz - nByte;
+ mem5.currentCount++;
+ mem5.currentOut += iFullSz;
+ if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount;
+ if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut;
/* Return a pointer to the allocated memory. */
- return (void*)&mem.aPool[i];
+ return (void*)&mem5.zPool[i*mem5.szAtom];
}
/*
** Free an outstanding memory allocation.
*/
-void memsys5Free(void *pOld){
+static void memsys5FreeUnsafe(void *pOld){
u32 size, iLogsize;
- int i;
+ int iBlock;
- i = ((Mem5Block*)pOld) - mem.aPool;
- assert( sqlite3_mutex_held(mem.mutex) );
- assert( i>=0 && i<NBLOCK );
- assert( (mem.aCtrl[i] & CTRL_FREE)==0 );
- iLogsize = mem.aCtrl[i] & CTRL_LOGSIZE;
+ /* Set iBlock to the index of the block pointed to by pOld in
+ ** the array of mem5.szAtom byte blocks pointed to by mem5.zPool.
+ */
+ iBlock = ((u8 *)pOld-mem5.zPool)/mem5.szAtom;
+
+ /* Check that the pointer pOld points to a valid, non-free block. */
+ assert( iBlock>=0 && iBlock<mem5.nBlock );
+ assert( ((u8 *)pOld-mem5.zPool)%mem5.szAtom==0 );
+ assert( (mem5.aCtrl[iBlock] & CTRL_FREE)==0 );
+
+ iLogsize = mem5.aCtrl[iBlock] & CTRL_LOGSIZE;
size = 1<<iLogsize;
- assert( i+size-1<NBLOCK );
- mem.aCtrl[i] |= CTRL_FREE;
- mem.aCtrl[i+size-1] |= CTRL_FREE;
- assert( mem.currentCount>0 );
- assert( mem.currentOut>=0 );
- mem.currentCount--;
- mem.currentOut -= size*POW2_MIN;
- assert( mem.currentOut>0 || mem.currentCount==0 );
- assert( mem.currentCount>0 || mem.currentOut==0 );
-
- mem.aCtrl[i] = CTRL_FREE | iLogsize;
- while( iLogsize<NSIZE-1 ){
+ assert( iBlock+size-1<(u32)mem5.nBlock );
+
+ mem5.aCtrl[iBlock] |= CTRL_FREE;
+ mem5.aCtrl[iBlock+size-1] |= CTRL_FREE;
+ assert( mem5.currentCount>0 );
+ assert( mem5.currentOut>=(size*mem5.szAtom) );
+ mem5.currentCount--;
+ mem5.currentOut -= size*mem5.szAtom;
+ assert( mem5.currentOut>0 || mem5.currentCount==0 );
+ assert( mem5.currentCount>0 || mem5.currentOut==0 );
+
+ mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize;
+ while( ALWAYS(iLogsize<LOGMAX) ){
int iBuddy;
-
- if( (i>>iLogsize) & 1 ){
- iBuddy = i - size;
+ if( (iBlock>>iLogsize) & 1 ){
+ iBuddy = iBlock - size;
}else{
- iBuddy = i + size;
+ iBuddy = iBlock + size;
}
- assert( iBuddy>=0 && iBuddy<NBLOCK );
- if( mem.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break;
+ assert( iBuddy>=0 );
+ if( (iBuddy+(1<<iLogsize))>mem5.nBlock ) break;
+ if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break;
memsys5Unlink(iBuddy, iLogsize);
iLogsize++;
- if( iBuddy<i ){
- mem.aCtrl[iBuddy] = CTRL_FREE | iLogsize;
- mem.aCtrl[i] = 0;
- i = iBuddy;
+ if( iBuddy<iBlock ){
+ mem5.aCtrl[iBuddy] = CTRL_FREE | iLogsize;
+ mem5.aCtrl[iBlock] = 0;
+ iBlock = iBuddy;
}else{
- mem.aCtrl[i] = CTRL_FREE | iLogsize;
- mem.aCtrl[iBuddy] = 0;
+ mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize;
+ mem5.aCtrl[iBuddy] = 0;
}
size *= 2;
}
- memsys5Link(i, iLogsize);
+ memsys5Link(iBlock, iLogsize);
}
/*
** Allocate nBytes of memory
*/
-SQLITE_API void *sqlite3_malloc(int nBytes){
+static void *memsys5Malloc(int nBytes){
sqlite3_int64 *p = 0;
if( nBytes>0 ){
memsys5Enter();
- p = memsys5Malloc(nBytes);
- sqlite3_mutex_leave(mem.mutex);
+ p = memsys5MallocUnsafe(nBytes);
+ memsys5Leave();
}
return (void*)p;
}
/*
** Free memory.
+**
+** The outer layer memory allocator prevents this routine from
+** being called with pPrior==0.
*/
-SQLITE_API void sqlite3_free(void *pPrior){
- if( pPrior==0 ){
- return;
- }
- assert( mem.mutex!=0 );
- sqlite3_mutex_enter(mem.mutex);
- memsys5Free(pPrior);
- sqlite3_mutex_leave(mem.mutex);
+static void memsys5Free(void *pPrior){
+ assert( pPrior!=0 );
+ memsys5Enter();
+ memsys5FreeUnsafe(pPrior);
+ memsys5Leave();
}
/*
-** Change the size of an existing memory allocation
+** Change the size of an existing memory allocation.
+**
+** The outer layer memory allocator prevents this routine from
+** being called with pPrior==0.
+**
+** nBytes is always a value obtained from a prior call to
+** memsys5Round(). Hence nBytes is always a non-negative power
+** of two. If nBytes==0 that means that an oversize allocation
+** (an allocation larger than 0x40000000) was requested and this
+** routine should return 0 without freeing pPrior.
*/
-SQLITE_API void *sqlite3_realloc(void *pPrior, int nBytes){
+static void *memsys5Realloc(void *pPrior, int nBytes){
int nOld;
void *p;
- if( pPrior==0 ){
- return sqlite3_malloc(nBytes);
- }
- if( nBytes<=0 ){
- sqlite3_free(pPrior);
+ assert( pPrior!=0 );
+ assert( (nBytes&(nBytes-1))==0 );
+ assert( nBytes>=0 );
+ if( nBytes==0 ){
return 0;
}
- assert( mem.mutex!=0 );
- nOld = sqlite3MallocSize(pPrior);
+ nOld = memsys5Size(pPrior);
if( nBytes<=nOld ){
return pPrior;
}
- sqlite3_mutex_enter(mem.mutex);
- p = memsys5Malloc(nBytes);
+ memsys5Enter();
+ p = memsys5MallocUnsafe(nBytes);
if( p ){
memcpy(p, pPrior, nOld);
- memsys5Free(pPrior);
+ memsys5FreeUnsafe(pPrior);
}
- sqlite3_mutex_leave(mem.mutex);
+ memsys5Leave();
return p;
}
/*
+** Round up a request size to the next valid allocation size. If
+** the allocation is too large to be handled by this allocation system,
+** return 0.
+**
+** All allocations must be a power of two and must be expressed by a
+** 32-bit signed integer. Hence the largest allocation is 0x40000000
+** or 1073741824 bytes.
+*/
+static int memsys5Roundup(int n){
+ int iFullSz;
+ if( n > 0x40000000 ) return 0;
+ for(iFullSz=mem5.szAtom; iFullSz<n; iFullSz *= 2);
+ return iFullSz;
+}
+
+/*
+** Return the ceiling of the logarithm base 2 of iValue.
+**
+** Examples: memsys5Log(1) -> 0
+** memsys5Log(2) -> 1
+** memsys5Log(4) -> 2
+** memsys5Log(5) -> 3
+** memsys5Log(8) -> 3
+** memsys5Log(9) -> 4
+*/
+static int memsys5Log(int iValue){
+ int iLog;
+ for(iLog=0; (1<<iLog)<iValue; iLog++);
+ return iLog;
+}
+
+/*
+** Initialize the memory allocator.
+**
+** This routine is not threadsafe. The caller must be holding a mutex
+** to prevent multiple threads from entering at the same time.
+*/
+static int memsys5Init(void *NotUsed){
+ int ii; /* Loop counter */
+ int nByte; /* Number of bytes of memory available to this allocator */
+ u8 *zByte; /* Memory usable by this allocator */
+ int nMinLog; /* Log base 2 of minimum allocation size in bytes */
+ int iOffset; /* An offset into mem5.aCtrl[] */
+
+ UNUSED_PARAMETER(NotUsed);
+
+ /* For the purposes of this routine, disable the mutex */
+ mem5.mutex = 0;
+
+ /* The size of a Mem5Link object must be a power of two. Verify that
+ ** this is case.
+ */
+ assert( (sizeof(Mem5Link)&(sizeof(Mem5Link)-1))==0 );
+
+ nByte = sqlite3GlobalConfig.nHeap;
+ zByte = (u8*)sqlite3GlobalConfig.pHeap;
+ assert( zByte!=0 ); /* sqlite3_config() does not allow otherwise */
+
+ nMinLog = memsys5Log(sqlite3GlobalConfig.mnReq);
+ mem5.szAtom = (1<<nMinLog);
+ while( (int)sizeof(Mem5Link)>mem5.szAtom ){
+ mem5.szAtom = mem5.szAtom << 1;
+ }
+
+ mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8)));
+ mem5.zPool = zByte;
+ mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom];
+
+ for(ii=0; ii<=LOGMAX; ii++){
+ mem5.aiFreelist[ii] = -1;
+ }
+
+ iOffset = 0;
+ for(ii=LOGMAX; ii>=0; ii--){
+ int nAlloc = (1<<ii);
+ if( (iOffset+nAlloc)<=mem5.nBlock ){
+ mem5.aCtrl[iOffset] = ii | CTRL_FREE;
+ memsys5Link(iOffset, ii);
+ iOffset += nAlloc;
+ }
+ assert((iOffset+nAlloc)>mem5.nBlock);
+ }
+
+ /* If a mutex is required for normal operation, allocate one */
+ if( sqlite3GlobalConfig.bMemstat==0 ){
+ mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
+ }
+
+ return SQLITE_OK;
+}
+
+/*
+** Deinitialize this module.
+*/
+static void memsys5Shutdown(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ mem5.mutex = 0;
+ return;
+}
+
+#ifdef SQLITE_TEST
+/*
** Open the file indicated and write a log of all unfreed memory
** allocations into that log.
*/
-SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
-#ifdef SQLITE_DEBUG
+SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){
FILE *out;
int i, j, n;
+ int nMinLog;
if( zFilename==0 || zFilename[0]==0 ){
out = stdout;
@@ -12836,29 +14379,48 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
}
}
memsys5Enter();
- for(i=0; i<NSIZE; i++){
- for(n=0, j=mem.aiFreelist[i]; j>=0; j = mem.aPool[j].u.list.next, n++){}
- fprintf(out, "freelist items of size %d: %d\n", POW2_MIN << i, n);
- }
- fprintf(out, "mem.nAlloc = %llu\n", mem.nAlloc);
- fprintf(out, "mem.totalAlloc = %llu\n", mem.totalAlloc);
- fprintf(out, "mem.totalExcess = %llu\n", mem.totalExcess);
- fprintf(out, "mem.currentOut = %u\n", mem.currentOut);
- fprintf(out, "mem.currentCount = %u\n", mem.currentCount);
- fprintf(out, "mem.maxOut = %u\n", mem.maxOut);
- fprintf(out, "mem.maxCount = %u\n", mem.maxCount);
- fprintf(out, "mem.maxRequest = %u\n", mem.maxRequest);
- sqlite3_mutex_leave(mem.mutex);
+ nMinLog = memsys5Log(mem5.szAtom);
+ for(i=0; i<=LOGMAX && i+nMinLog<32; i++){
+ for(n=0, j=mem5.aiFreelist[i]; j>=0; j = MEM5LINK(j)->next, n++){}
+ fprintf(out, "freelist items of size %d: %d\n", mem5.szAtom << i, n);
+ }
+ fprintf(out, "mem5.nAlloc = %llu\n", mem5.nAlloc);
+ fprintf(out, "mem5.totalAlloc = %llu\n", mem5.totalAlloc);
+ fprintf(out, "mem5.totalExcess = %llu\n", mem5.totalExcess);
+ fprintf(out, "mem5.currentOut = %u\n", mem5.currentOut);
+ fprintf(out, "mem5.currentCount = %u\n", mem5.currentCount);
+ fprintf(out, "mem5.maxOut = %u\n", mem5.maxOut);
+ fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount);
+ fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest);
+ memsys5Leave();
if( out==stdout ){
fflush(stdout);
}else{
fclose(out);
}
-#endif
}
+#endif
+/*
+** This routine is the only routine in this file with external
+** linkage. It returns a pointer to a static sqlite3_mem_methods
+** struct populated with the memsys5 methods.
+*/
+SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){
+ static const sqlite3_mem_methods memsys5Methods = {
+ memsys5Malloc,
+ memsys5Free,
+ memsys5Realloc,
+ memsys5Size,
+ memsys5Roundup,
+ memsys5Init,
+ memsys5Shutdown,
+ 0
+ };
+ return &memsys5Methods;
+}
-#endif /* !SQLITE_POW2_MEMORY_SIZE */
+#endif /* SQLITE_ENABLE_MEMSYS5 */
/************** End of mem5.c ************************************************/
/************** Begin file mutex.c *******************************************/
@@ -12875,22 +14437,218 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
*************************************************************************
** This file contains the C functions that implement mutexes.
**
-** The implementation in this file does not provide any mutual
+** This file contains code that is common across all mutex implementations.
+
+**
+** $Id: mutex.c,v 1.31 2009/07/16 18:21:18 drh Exp $
+*/
+
+#if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT)
+/*
+** For debugging purposes, record when the mutex subsystem is initialized
+** and uninitialized so that we can assert() if there is an attempt to
+** allocate a mutex while the system is uninitialized.
+*/
+static SQLITE_WSD int mutexIsInit = 0;
+#endif /* SQLITE_DEBUG */
+
+
+#ifndef SQLITE_MUTEX_OMIT
+/*
+** Initialize the mutex system.
+*/
+SQLITE_PRIVATE int sqlite3MutexInit(void){
+ int rc = SQLITE_OK;
+ if( sqlite3GlobalConfig.bCoreMutex ){
+ if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
+ /* If the xMutexAlloc method has not been set, then the user did not
+ ** install a mutex implementation via sqlite3_config() prior to
+ ** sqlite3_initialize() being called. This block copies pointers to
+ ** the default implementation into the sqlite3GlobalConfig structure.
+ */
+ sqlite3_mutex_methods *pFrom = sqlite3DefaultMutex();
+ sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
+
+ memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
+ memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
+ sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
+ pTo->xMutexAlloc = pFrom->xMutexAlloc;
+ }
+ rc = sqlite3GlobalConfig.mutex.xMutexInit();
+ }
+
+#ifdef SQLITE_DEBUG
+ GLOBAL(int, mutexIsInit) = 1;
+#endif
+
+ return rc;
+}
+
+/*
+** Shutdown the mutex system. This call frees resources allocated by
+** sqlite3MutexInit().
+*/
+SQLITE_PRIVATE int sqlite3MutexEnd(void){
+ int rc = SQLITE_OK;
+ if( sqlite3GlobalConfig.mutex.xMutexEnd ){
+ rc = sqlite3GlobalConfig.mutex.xMutexEnd();
+ }
+
+#ifdef SQLITE_DEBUG
+ GLOBAL(int, mutexIsInit) = 0;
+#endif
+
+ return rc;
+}
+
+/*
+** Retrieve a pointer to a static mutex or allocate a new dynamic one.
+*/
+SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize() ) return 0;
+#endif
+ return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
+}
+
+SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){
+ if( !sqlite3GlobalConfig.bCoreMutex ){
+ return 0;
+ }
+ assert( GLOBAL(int, mutexIsInit) );
+ return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
+}
+
+/*
+** Free a dynamic mutex.
+*/
+SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
+ if( p ){
+ sqlite3GlobalConfig.mutex.xMutexFree(p);
+ }
+}
+
+/*
+** Obtain the mutex p. If some other thread already has the mutex, block
+** until it can be obtained.
+*/
+SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
+ if( p ){
+ sqlite3GlobalConfig.mutex.xMutexEnter(p);
+ }
+}
+
+/*
+** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another
+** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY.
+*/
+SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
+ int rc = SQLITE_OK;
+ if( p ){
+ return sqlite3GlobalConfig.mutex.xMutexTry(p);
+ }
+ return rc;
+}
+
+/*
+** The sqlite3_mutex_leave() routine exits a mutex that was previously
+** entered by the same thread. The behavior is undefined if the mutex
+** is not currently entered. If a NULL pointer is passed as an argument
+** this function is a no-op.
+*/
+SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
+ if( p ){
+ sqlite3GlobalConfig.mutex.xMutexLeave(p);
+ }
+}
+
+#ifndef NDEBUG
+/*
+** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
+** intended for use inside assert() statements.
+*/
+SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
+ return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p);
+}
+SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
+ return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p);
+}
+#endif
+
+#endif /* SQLITE_MUTEX_OMIT */
+
+/************** End of mutex.c ***********************************************/
+/************** Begin file mutex_noop.c **************************************/
+/*
+** 2008 October 07
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains the C functions that implement mutexes.
+**
+** This implementation in this file does not provide any mutual
** exclusion and is thus suitable for use only in applications
-** that use SQLite in a single thread. But this implementation
-** does do a lot of error checking on mutexes to make sure they
-** are called correctly and at appropriate times. Hence, this
-** implementation is suitable for testing.
-** debugging purposes
+** that use SQLite in a single thread. The routines defined
+** here are place-holders. Applications can substitute working
+** mutex routines at start-time using the
+**
+** sqlite3_config(SQLITE_CONFIG_MUTEX,...)
+**
+** interface.
+**
+** If compiled with SQLITE_DEBUG, then additional logic is inserted
+** that does error checking on mutexes to make sure they are being
+** called correctly.
+**
+** $Id: mutex_noop.c,v 1.3 2008/12/05 17:17:08 drh Exp $
+*/
+
+
+#if defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG)
+/*
+** Stub routines for all mutex methods.
**
-** $Id: mutex.c,v 1.17 2008/03/26 18:34:43 danielk1977 Exp $
+** This routines provide no mutual exclusion or error checking.
*/
+static int noopMutexHeld(sqlite3_mutex *p){ return 1; }
+static int noopMutexNotheld(sqlite3_mutex *p){ return 1; }
+static int noopMutexInit(void){ return SQLITE_OK; }
+static int noopMutexEnd(void){ return SQLITE_OK; }
+static sqlite3_mutex *noopMutexAlloc(int id){ return (sqlite3_mutex*)8; }
+static void noopMutexFree(sqlite3_mutex *p){ return; }
+static void noopMutexEnter(sqlite3_mutex *p){ return; }
+static int noopMutexTry(sqlite3_mutex *p){ return SQLITE_OK; }
+static void noopMutexLeave(sqlite3_mutex *p){ return; }
+
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
+ static sqlite3_mutex_methods sMutex = {
+ noopMutexInit,
+ noopMutexEnd,
+ noopMutexAlloc,
+ noopMutexFree,
+ noopMutexEnter,
+ noopMutexTry,
+ noopMutexLeave,
-#ifdef SQLITE_MUTEX_NOOP_DEBUG
+ noopMutexHeld,
+ noopMutexNotheld
+ };
+
+ return &sMutex;
+}
+#endif /* defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG) */
+
+#if defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG)
/*
-** In this implementation, mutexes do not provide any mutual exclusion.
-** But the error checking is provided. This implementation is useful
-** for test purposes.
+** In this implementation, error checking is provided for testing
+** and debugging purposes. The mutexes still do not provide any
+** mutual exclusion.
*/
/*
@@ -12902,17 +14660,34 @@ struct sqlite3_mutex {
};
/*
+** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
+** intended for use inside assert() statements.
+*/
+static int debugMutexHeld(sqlite3_mutex *p){
+ return p==0 || p->cnt>0;
+}
+static int debugMutexNotheld(sqlite3_mutex *p){
+ return p==0 || p->cnt==0;
+}
+
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static int debugMutexInit(void){ return SQLITE_OK; }
+static int debugMutexEnd(void){ return SQLITE_OK; }
+
+/*
** The sqlite3_mutex_alloc() routine allocates a new
** mutex and returns a pointer to it. If it returns NULL
** that means that a mutex could not be allocated.
*/
-SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){
+static sqlite3_mutex *debugMutexAlloc(int id){
static sqlite3_mutex aStatic[6];
sqlite3_mutex *pNew = 0;
switch( id ){
case SQLITE_MUTEX_FAST:
case SQLITE_MUTEX_RECURSIVE: {
- pNew = sqlite3_malloc(sizeof(*pNew));
+ pNew = sqlite3Malloc(sizeof(*pNew));
if( pNew ){
pNew->id = id;
pNew->cnt = 0;
@@ -12921,7 +14696,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){
}
default: {
assert( id-2 >= 0 );
- assert( id-2 < sizeof(aStatic)/sizeof(aStatic[0]) );
+ assert( id-2 < (int)(sizeof(aStatic)/sizeof(aStatic[0])) );
pNew = &aStatic[id-2];
pNew->id = id;
break;
@@ -12933,8 +14708,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){
/*
** This routine deallocates a previously allocated mutex.
*/
-SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
- assert( p );
+static void debugMutexFree(sqlite3_mutex *p){
assert( p->cnt==0 );
assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
sqlite3_free(p);
@@ -12951,14 +14725,12 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
** can enter. If the same thread tries to enter any other kind of mutex
** more than once, the behavior is undefined.
*/
-SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+static void debugMutexEnter(sqlite3_mutex *p){
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
p->cnt++;
}
-SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+static int debugMutexTry(sqlite3_mutex *p){
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
p->cnt++;
return SQLITE_OK;
}
@@ -12969,26 +14741,31 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
** is undefined if the mutex is not currently entered or
** is not currently allocated. SQLite will never do either.
*/
-SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
- assert( p );
- assert( sqlite3_mutex_held(p) );
+static void debugMutexLeave(sqlite3_mutex *p){
+ assert( debugMutexHeld(p) );
p->cnt--;
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) );
}
-/*
-** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
-** intended for use inside assert() statements.
-*/
-SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
- return p==0 || p->cnt>0;
-}
-SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
- return p==0 || p->cnt==0;
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
+ static sqlite3_mutex_methods sMutex = {
+ debugMutexInit,
+ debugMutexEnd,
+ debugMutexAlloc,
+ debugMutexFree,
+ debugMutexEnter,
+ debugMutexTry,
+ debugMutexLeave,
+
+ debugMutexHeld,
+ debugMutexNotheld
+ };
+
+ return &sMutex;
}
-#endif /* SQLITE_MUTEX_NOOP_DEBUG */
+#endif /* defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG) */
-/************** End of mutex.c ***********************************************/
+/************** End of mutex_noop.c ******************************************/
/************** Begin file mutex_os2.c ***************************************/
/*
** 2007 August 28
@@ -13003,7 +14780,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
*************************************************************************
** This file contains the C functions that implement mutexes for OS/2
**
-** $Id: mutex_os2.c,v 1.6 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: mutex_os2.c,v 1.11 2008/11/22 19:50:54 pweilbacher Exp $
*/
/*
@@ -13031,6 +14808,12 @@ struct sqlite3_mutex {
#define OS2_MUTEX_INITIALIZER 0,0,0,0
/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static int os2MutexInit(void){ return SQLITE_OK; }
+static int os2MutexEnd(void){ return SQLITE_OK; }
+
+/*
** The sqlite3_mutex_alloc() routine allocates a new
** mutex and returns a pointer to it. If it returns NULL
** that means that a mutex could not be allocated.
@@ -13069,7 +14852,7 @@ struct sqlite3_mutex {
** mutex types, the same mutex is returned on every call that has
** the same type number.
*/
-SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
+static sqlite3_mutex *os2MutexAlloc(int iType){
sqlite3_mutex *p = NULL;
switch( iType ){
case SQLITE_MUTEX_FAST:
@@ -13107,7 +14890,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
mutex = 0;
rc = DosCreateMutexSem( name, &mutex, 0, FALSE);
if( rc == NO_ERROR ){
- int i;
+ unsigned int i;
if( !isInit ){
for( i = 0; i < sizeof(staticMutexes)/sizeof(staticMutexes[0]); i++ ){
DosCreateMutexSem( 0, &staticMutexes[i].mutex, 0, FALSE );
@@ -13137,8 +14920,8 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
** This routine deallocates a previously allocated mutex.
** SQLite is careful to deallocate every mutex that it allocates.
*/
-SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
- assert( p );
+static void os2MutexFree(sqlite3_mutex *p){
+ if( p==0 ) return;
assert( p->nRef==0 );
assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
DosCloseMutexSem( p->mutex );
@@ -13156,24 +14939,24 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
** can enter. If the same thread tries to enter any other kind of mutex
** more than once, the behavior is undefined.
*/
-SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
+static void os2MutexEnter(sqlite3_mutex *p){
TID tid;
PID holder1;
ULONG holder2;
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+ if( p==0 ) return;
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) );
DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT);
DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
p->owner = tid;
p->nRef++;
}
-SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
+static int os2MutexTry(sqlite3_mutex *p){
int rc;
TID tid;
PID holder1;
ULONG holder2;
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+ if( p==0 ) return SQLITE_OK;
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || os2MutexNotheld(p) );
if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) {
DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
p->owner = tid;
@@ -13192,10 +14975,11 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
** is undefined if the mutex is not currently entered or
** is not currently allocated. SQLite will never do either.
*/
-SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
+static void os2MutexLeave(sqlite3_mutex *p){
TID tid;
PID holder1;
ULONG holder2;
+ if( p==0 ) return;
assert( p->nRef>0 );
DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
assert( p->owner==tid );
@@ -13204,11 +14988,12 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
DosReleaseMutexSem(p->mutex);
}
+#ifdef SQLITE_DEBUG
/*
** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
** intended for use inside assert() statements.
*/
-SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
+static int os2MutexHeld(sqlite3_mutex *p){
TID tid;
PID pid;
ULONG ulCount;
@@ -13221,7 +15006,7 @@ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
}
return p==0 || (p->nRef!=0 && p->owner==tid);
}
-SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
+static int os2MutexNotheld(sqlite3_mutex *p){
TID tid;
PID pid;
ULONG ulCount;
@@ -13234,6 +15019,25 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
}
return p==0 || p->nRef==0 || p->owner!=tid;
}
+#endif
+
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
+ static sqlite3_mutex_methods sMutex = {
+ os2MutexInit,
+ os2MutexEnd,
+ os2MutexAlloc,
+ os2MutexFree,
+ os2MutexEnter,
+ os2MutexTry,
+ os2MutexLeave,
+#ifdef SQLITE_DEBUG
+ os2MutexHeld,
+ os2MutexNotheld
+#endif
+ };
+
+ return &sMutex;
+}
#endif /* SQLITE_MUTEX_OS2 */
/************** End of mutex_os2.c *******************************************/
@@ -13251,7 +15055,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
*************************************************************************
** This file contains the C functions that implement mutexes for pthreads
**
-** $Id: mutex_unix.c,v 1.7 2008/03/29 12:47:27 rse Exp $
+** $Id: mutex_unix.c,v 1.16 2008/12/08 18:19:18 drh Exp $
*/
/*
@@ -13285,6 +15089,37 @@ struct sqlite3_mutex {
#endif
/*
+** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
+** intended for use only inside assert() statements. On some platforms,
+** there might be race conditions that can cause these routines to
+** deliver incorrect results. In particular, if pthread_equal() is
+** not an atomic operation, then these routines might delivery
+** incorrect results. On most platforms, pthread_equal() is a
+** comparison of two integers and is therefore atomic. But we are
+** told that HPUX is not such a platform. If so, then these routines
+** will not always work correctly on HPUX.
+**
+** On those platforms where pthread_equal() is not atomic, SQLite
+** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to
+** make sure no assert() statements are evaluated and hence these
+** routines are never called.
+*/
+#if !defined(NDEBUG) || defined(SQLITE_DEBUG)
+static int pthreadMutexHeld(sqlite3_mutex *p){
+ return (p->nRef!=0 && pthread_equal(p->owner, pthread_self()));
+}
+static int pthreadMutexNotheld(sqlite3_mutex *p){
+ return p->nRef==0 || pthread_equal(p->owner, pthread_self())==0;
+}
+#endif
+
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static int pthreadMutexInit(void){ return SQLITE_OK; }
+static int pthreadMutexEnd(void){ return SQLITE_OK; }
+
+/*
** The sqlite3_mutex_alloc() routine allocates a new
** mutex and returns a pointer to it. If it returns NULL
** that means that a mutex could not be allocated. SQLite
@@ -13299,6 +15134,7 @@ struct sqlite3_mutex {
** <li> SQLITE_MUTEX_STATIC_MEM2
** <li> SQLITE_MUTEX_STATIC_PRNG
** <li> SQLITE_MUTEX_STATIC_LRU
+** <li> SQLITE_MUTEX_STATIC_LRU2
** </ul>
**
** The first two constants cause sqlite3_mutex_alloc() to create
@@ -13312,7 +15148,7 @@ struct sqlite3_mutex {
** might return such a mutex in response to SQLITE_MUTEX_FAST.
**
** The other allowed parameters to sqlite3_mutex_alloc() each return
-** a pointer to a static preexisting mutex. Three static mutexes are
+** a pointer to a static preexisting mutex. Six static mutexes are
** used by the current version of SQLite. Future versions of SQLite
** may add additional static mutexes. Static mutexes are for internal
** use by SQLite only. Applications that use SQLite mutexes should
@@ -13325,7 +15161,7 @@ struct sqlite3_mutex {
** mutex types, the same mutex is returned on every call that has
** the same type number.
*/
-SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
+static sqlite3_mutex *pthreadMutexAlloc(int iType){
static sqlite3_mutex staticMutexes[] = {
SQLITE3_MUTEX_INITIALIZER,
SQLITE3_MUTEX_INITIALIZER,
@@ -13365,7 +15201,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
}
default: {
assert( iType-2 >= 0 );
- assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) );
+ assert( iType-2 < ArraySize(staticMutexes) );
p = &staticMutexes[iType-2];
p->id = iType;
break;
@@ -13380,8 +15216,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
** allocated mutex. SQLite is careful to deallocate every
** mutex that it allocates.
*/
-SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
- assert( p );
+static void pthreadMutexFree(sqlite3_mutex *p){
assert( p->nRef==0 );
assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
pthread_mutex_destroy(&p->mutex);
@@ -13399,9 +15234,8 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
** can enter. If the same thread tries to enter any other kind of mutex
** more than once, the behavior is undefined.
*/
-SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+static void pthreadMutexEnter(sqlite3_mutex *p){
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) );
#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
/* If recursive mutexes are not available, then we have to grow
@@ -13439,10 +15273,9 @@ SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
}
#endif
}
-SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
+static int pthreadMutexTry(sqlite3_mutex *p){
int rc;
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) );
#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
/* If recursive mutexes are not available, then we have to grow
@@ -13460,7 +15293,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
if( p->nRef>0 && pthread_equal(p->owner, self) ){
p->nRef++;
rc = SQLITE_OK;
- }else if( pthread_mutex_lock(&p->mutex)==0 ){
+ }else if( pthread_mutex_trylock(&p->mutex)==0 ){
assert( p->nRef==0 );
p->owner = self;
p->nRef = 1;
@@ -13495,9 +15328,8 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
** is undefined if the mutex is not currently entered or
** is not currently allocated. SQLite will never do either.
*/
-SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
- assert( p );
- assert( sqlite3_mutex_held(p) );
+static void pthreadMutexLeave(sqlite3_mutex *p){
+ assert( pthreadMutexHeld(p) );
p->nRef--;
assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
@@ -13516,30 +15348,27 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
#endif
}
-/*
-** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
-** intended for use only inside assert() statements. On some platforms,
-** there might be race conditions that can cause these routines to
-** deliver incorrect results. In particular, if pthread_equal() is
-** not an atomic operation, then these routines might delivery
-** incorrect results. On most platforms, pthread_equal() is a
-** comparison of two integers and is therefore atomic. But we are
-** told that HPUX is not such a platform. If so, then these routines
-** will not always work correctly on HPUX.
-**
-** On those platforms where pthread_equal() is not atomic, SQLite
-** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to
-** make sure no assert() statements are evaluated and hence these
-** routines are never called.
-*/
-#ifndef NDEBUG
-SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
- return p==0 || (p->nRef!=0 && pthread_equal(p->owner, pthread_self()));
-}
-SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
- return p==0 || p->nRef==0 || pthread_equal(p->owner, pthread_self())==0;
-}
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
+ static sqlite3_mutex_methods sMutex = {
+ pthreadMutexInit,
+ pthreadMutexEnd,
+ pthreadMutexAlloc,
+ pthreadMutexFree,
+ pthreadMutexEnter,
+ pthreadMutexTry,
+ pthreadMutexLeave,
+#ifdef SQLITE_DEBUG
+ pthreadMutexHeld,
+ pthreadMutexNotheld
+#else
+ 0,
+ 0
#endif
+ };
+
+ return &sMutex;
+}
+
#endif /* SQLITE_MUTEX_PTHREAD */
/************** End of mutex_unix.c ******************************************/
@@ -13557,7 +15386,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
*************************************************************************
** This file contains the C functions that implement mutexes for win32
**
-** $Id: mutex_w32.c,v 1.6 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: mutex_w32.c,v 1.18 2009/08/10 03:23:21 shane Exp $
*/
/*
@@ -13586,8 +15415,15 @@ struct sqlite3_mutex {
** this routine is used to determine if the host is Win95/98/ME or
** WinNT/2K/XP so that we will know whether or not we can safely call
** the LockFileEx() API.
+**
+** mutexIsNT() is only used for the TryEnterCriticalSection() API call,
+** which is only available if your application was compiled with
+** _WIN32_WINNT defined to a value >= 0x0400. Currently, the only
+** call to TryEnterCriticalSection() is #ifdef'ed out, so #ifdef
+** this out as well.
*/
-#if OS_WINCE
+#if 0
+#if SQLITE_OS_WINCE
# define mutexIsNT() (1)
#else
static int mutexIsNT(void){
@@ -13600,8 +15436,66 @@ struct sqlite3_mutex {
}
return osType==2;
}
-#endif /* OS_WINCE */
+#endif /* SQLITE_OS_WINCE */
+#endif
+
+#ifdef SQLITE_DEBUG
+/*
+** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
+** intended for use only inside assert() statements.
+*/
+static int winMutexHeld(sqlite3_mutex *p){
+ return p->nRef!=0 && p->owner==GetCurrentThreadId();
+}
+static int winMutexNotheld(sqlite3_mutex *p){
+ return p->nRef==0 || p->owner!=GetCurrentThreadId();
+}
+#endif
+
+
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+static sqlite3_mutex winMutex_staticMutexes[6];
+static int winMutex_isInit = 0;
+/* As winMutexInit() and winMutexEnd() are called as part
+** of the sqlite3_initialize and sqlite3_shutdown()
+** processing, the "interlocked" magic is probably not
+** strictly necessary.
+*/
+static long winMutex_lock = 0;
+
+static int winMutexInit(void){
+ /* The first to increment to 1 does actual initialization */
+ if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){
+ int i;
+ for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
+ InitializeCriticalSection(&winMutex_staticMutexes[i].mutex);
+ }
+ winMutex_isInit = 1;
+ }else{
+ /* Someone else is in the process of initing the static mutexes */
+ while( !winMutex_isInit ){
+ Sleep(1);
+ }
+ }
+ return SQLITE_OK;
+}
+static int winMutexEnd(void){
+ /* The first to decrement to 0 does actual shutdown
+ ** (which should be the last to shutdown.) */
+ if( InterlockedCompareExchange(&winMutex_lock, 0, 1)==1 ){
+ if( winMutex_isInit==1 ){
+ int i;
+ for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
+ DeleteCriticalSection(&winMutex_staticMutexes[i].mutex);
+ }
+ winMutex_isInit = 0;
+ }
+ }
+ return SQLITE_OK;
+}
/*
** The sqlite3_mutex_alloc() routine allocates a new
@@ -13611,11 +15505,14 @@ struct sqlite3_mutex {
** to sqlite3_mutex_alloc() is one of these integer constants:
**
** <ul>
-** <li> SQLITE_MUTEX_FAST 0
-** <li> SQLITE_MUTEX_RECURSIVE 1
-** <li> SQLITE_MUTEX_STATIC_MASTER 2
-** <li> SQLITE_MUTEX_STATIC_MEM 3
-** <li> SQLITE_MUTEX_STATIC_PRNG 4
+** <li> SQLITE_MUTEX_FAST
+** <li> SQLITE_MUTEX_RECURSIVE
+** <li> SQLITE_MUTEX_STATIC_MASTER
+** <li> SQLITE_MUTEX_STATIC_MEM
+** <li> SQLITE_MUTEX_STATIC_MEM2
+** <li> SQLITE_MUTEX_STATIC_PRNG
+** <li> SQLITE_MUTEX_STATIC_LRU
+** <li> SQLITE_MUTEX_STATIC_LRU2
** </ul>
**
** The first two constants cause sqlite3_mutex_alloc() to create
@@ -13629,7 +15526,7 @@ struct sqlite3_mutex {
** might return such a mutex in response to SQLITE_MUTEX_FAST.
**
** The other allowed parameters to sqlite3_mutex_alloc() each return
-** a pointer to a static preexisting mutex. Three static mutexes are
+** a pointer to a static preexisting mutex. Six static mutexes are
** used by the current version of SQLite. Future versions of SQLite
** may add additional static mutexes. Static mutexes are for internal
** use by SQLite only. Applications that use SQLite mutexes should
@@ -13642,37 +15539,24 @@ struct sqlite3_mutex {
** mutex types, the same mutex is returned on every call that has
** the same type number.
*/
-SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
+static sqlite3_mutex *winMutexAlloc(int iType){
sqlite3_mutex *p;
switch( iType ){
case SQLITE_MUTEX_FAST:
case SQLITE_MUTEX_RECURSIVE: {
p = sqlite3MallocZero( sizeof(*p) );
- if( p ){
+ if( p ){
p->id = iType;
InitializeCriticalSection(&p->mutex);
}
break;
}
default: {
- static sqlite3_mutex staticMutexes[6];
- static int isInit = 0;
- while( !isInit ){
- static long lock = 0;
- if( InterlockedIncrement(&lock)==1 ){
- int i;
- for(i=0; i<sizeof(staticMutexes)/sizeof(staticMutexes[0]); i++){
- InitializeCriticalSection(&staticMutexes[i].mutex);
- }
- isInit = 1;
- }else{
- Sleep(1);
- }
- }
+ assert( winMutex_isInit==1 );
assert( iType-2 >= 0 );
- assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) );
- p = &staticMutexes[iType-2];
+ assert( iType-2 < ArraySize(winMutex_staticMutexes) );
+ p = &winMutex_staticMutexes[iType-2];
p->id = iType;
break;
}
@@ -13686,7 +15570,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int iType){
** allocated mutex. SQLite is careful to deallocate every
** mutex that it allocates.
*/
-SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
+static void winMutexFree(sqlite3_mutex *p){
assert( p );
assert( p->nRef==0 );
assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
@@ -13705,17 +15589,15 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
** can enter. If the same thread tries to enter any other kind of mutex
** more than once, the behavior is undefined.
*/
-SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+static void winMutexEnter(sqlite3_mutex *p){
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld(p) );
EnterCriticalSection(&p->mutex);
p->owner = GetCurrentThreadId();
p->nRef++;
}
-SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
+static int winMutexTry(sqlite3_mutex *p){
int rc = SQLITE_BUSY;
- assert( p );
- assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
+ assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld(p) );
/*
** The sqlite3_mutex_try() routine is very rarely used, and when it
** is used it is merely an optimization. So it is OK for it to always
@@ -13733,6 +15615,8 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
p->nRef++;
rc = SQLITE_OK;
}
+#else
+ UNUSED_PARAMETER(p);
#endif
return rc;
}
@@ -13743,7 +15627,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
** is undefined if the mutex is not currently entered or
** is not currently allocated. SQLite will never do either.
*/
-SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
+static void winMutexLeave(sqlite3_mutex *p){
assert( p->nRef>0 );
assert( p->owner==GetCurrentThreadId() );
p->nRef--;
@@ -13751,15 +15635,25 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
LeaveCriticalSection(&p->mutex);
}
-/*
-** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
-** intended for use only inside assert() statements.
-*/
-SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
- return p==0 || (p->nRef!=0 && p->owner==GetCurrentThreadId());
-}
-SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
- return p==0 || p->nRef==0 || p->owner!=GetCurrentThreadId();
+SQLITE_PRIVATE sqlite3_mutex_methods *sqlite3DefaultMutex(void){
+ static sqlite3_mutex_methods sMutex = {
+ winMutexInit,
+ winMutexEnd,
+ winMutexAlloc,
+ winMutexFree,
+ winMutexEnter,
+ winMutexTry,
+ winMutexLeave,
+#ifdef SQLITE_DEBUG
+ winMutexHeld,
+ winMutexNotheld
+#else
+ 0,
+ 0
+#endif
+ };
+
+ return &sMutex;
}
#endif /* SQLITE_MUTEX_W32 */
@@ -13776,10 +15670,10 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** Memory allocation functions used throughout sqlite.
**
+** Memory allocation functions used throughout sqlite.
**
-** $Id: malloc.c,v 1.15 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: malloc.c,v 1.66 2009/07/17 11:44:07 drh Exp $
*/
/*
@@ -13789,15 +15683,16 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
*/
static void softHeapLimitEnforcer(
void *NotUsed,
- sqlite3_int64 inUse,
+ sqlite3_int64 NotUsed2,
int allocSize
){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_release_memory(allocSize);
}
/*
-** Set the soft heap-size limit for the current thread. Passing a
-** zero or negative value indicates no limit.
+** Set the soft heap-size limit for the library. Passing a zero or
+** negative value indicates no limit.
*/
SQLITE_API void sqlite3_soft_heap_limit(int n){
sqlite3_uint64 iLimit;
@@ -13807,36 +15702,487 @@ SQLITE_API void sqlite3_soft_heap_limit(int n){
}else{
iLimit = n;
}
+#ifndef SQLITE_OMIT_AUTOINIT
+ sqlite3_initialize();
+#endif
if( iLimit>0 ){
- sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit);
+ sqlite3MemoryAlarm(softHeapLimitEnforcer, 0, iLimit);
}else{
- sqlite3_memory_alarm(0, 0, 0);
+ sqlite3MemoryAlarm(0, 0, 0);
}
- overage = sqlite3_memory_used() - n;
+ overage = (int)(sqlite3_memory_used() - (i64)n);
if( overage>0 ){
sqlite3_release_memory(overage);
}
}
/*
-** Release memory held by SQLite instances created by the current thread.
+** Attempt to release up to n bytes of non-essential memory currently
+** held by SQLite. An example of non-essential memory is memory used to
+** cache database pages that are not currently in use.
*/
SQLITE_API int sqlite3_release_memory(int n){
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- int nRet = sqlite3VdbeReleaseMemory(n);
- nRet += sqlite3PagerReleaseMemory(n-nRet);
+ int nRet = 0;
+#if 0
+ nRet += sqlite3VdbeReleaseMemory(n);
+#endif
+ nRet += sqlite3PcacheReleaseMemory(n-nRet);
return nRet;
#else
+ UNUSED_PARAMETER(n);
return SQLITE_OK;
#endif
}
+/*
+** State information local to the memory allocation subsystem.
+*/
+static SQLITE_WSD struct Mem0Global {
+ /* Number of free pages for scratch and page-cache memory */
+ u32 nScratchFree;
+ u32 nPageFree;
+
+ sqlite3_mutex *mutex; /* Mutex to serialize access */
+
+ /*
+ ** The alarm callback and its arguments. The mem0.mutex lock will
+ ** be held while the callback is running. Recursive calls into
+ ** the memory subsystem are allowed, but no new callbacks will be
+ ** issued.
+ */
+ sqlite3_int64 alarmThreshold;
+ void (*alarmCallback)(void*, sqlite3_int64,int);
+ void *alarmArg;
+
+ /*
+ ** Pointers to the end of sqlite3GlobalConfig.pScratch and
+ ** sqlite3GlobalConfig.pPage to a block of memory that records
+ ** which pages are available.
+ */
+ u32 *aScratchFree;
+ u32 *aPageFree;
+} mem0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+#define mem0 GLOBAL(struct Mem0Global, mem0)
+
+/*
+** Initialize the memory allocation subsystem.
+*/
+SQLITE_PRIVATE int sqlite3MallocInit(void){
+ if( sqlite3GlobalConfig.m.xMalloc==0 ){
+ sqlite3MemSetDefault();
+ }
+ memset(&mem0, 0, sizeof(mem0));
+ if( sqlite3GlobalConfig.bCoreMutex ){
+ mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
+ }
+ if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100
+ && sqlite3GlobalConfig.nScratch>=0 ){
+ int i;
+ sqlite3GlobalConfig.szScratch = ROUNDDOWN8(sqlite3GlobalConfig.szScratch-4);
+ mem0.aScratchFree = (u32*)&((char*)sqlite3GlobalConfig.pScratch)
+ [sqlite3GlobalConfig.szScratch*sqlite3GlobalConfig.nScratch];
+ for(i=0; i<sqlite3GlobalConfig.nScratch; i++){ mem0.aScratchFree[i] = i; }
+ mem0.nScratchFree = sqlite3GlobalConfig.nScratch;
+ }else{
+ sqlite3GlobalConfig.pScratch = 0;
+ sqlite3GlobalConfig.szScratch = 0;
+ }
+ if( sqlite3GlobalConfig.pPage && sqlite3GlobalConfig.szPage>=512
+ && sqlite3GlobalConfig.nPage>=1 ){
+ int i;
+ int overhead;
+ int sz = ROUNDDOWN8(sqlite3GlobalConfig.szPage);
+ int n = sqlite3GlobalConfig.nPage;
+ overhead = (4*n + sz - 1)/sz;
+ sqlite3GlobalConfig.nPage -= overhead;
+ mem0.aPageFree = (u32*)&((char*)sqlite3GlobalConfig.pPage)
+ [sqlite3GlobalConfig.szPage*sqlite3GlobalConfig.nPage];
+ for(i=0; i<sqlite3GlobalConfig.nPage; i++){ mem0.aPageFree[i] = i; }
+ mem0.nPageFree = sqlite3GlobalConfig.nPage;
+ }else{
+ sqlite3GlobalConfig.pPage = 0;
+ sqlite3GlobalConfig.szPage = 0;
+ }
+ return sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData);
+}
+
+/*
+** Deinitialize the memory allocation subsystem.
+*/
+SQLITE_PRIVATE void sqlite3MallocEnd(void){
+ if( sqlite3GlobalConfig.m.xShutdown ){
+ sqlite3GlobalConfig.m.xShutdown(sqlite3GlobalConfig.m.pAppData);
+ }
+ memset(&mem0, 0, sizeof(mem0));
+}
+
+/*
+** Return the amount of memory currently checked out.
+*/
+SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
+ int n, mx;
+ sqlite3_int64 res;
+ sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, 0);
+ res = (sqlite3_int64)n; /* Work around bug in Borland C. Ticket #3216 */
+ return res;
+}
+
+/*
+** Return the maximum amount of memory that has ever been
+** checked out since either the beginning of this process
+** or since the most recent reset.
+*/
+SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
+ int n, mx;
+ sqlite3_int64 res;
+ sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, resetFlag);
+ res = (sqlite3_int64)mx; /* Work around bug in Borland C. Ticket #3216 */
+ return res;
+}
+
+/*
+** Change the alarm callback
+*/
+SQLITE_PRIVATE int sqlite3MemoryAlarm(
+ void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
+ void *pArg,
+ sqlite3_int64 iThreshold
+){
+ sqlite3_mutex_enter(mem0.mutex);
+ mem0.alarmCallback = xCallback;
+ mem0.alarmArg = pArg;
+ mem0.alarmThreshold = iThreshold;
+ sqlite3_mutex_leave(mem0.mutex);
+ return SQLITE_OK;
+}
+
+#ifndef SQLITE_OMIT_DEPRECATED
+/*
+** Deprecated external interface. Internal/core SQLite code
+** should call sqlite3MemoryAlarm.
+*/
+SQLITE_API int sqlite3_memory_alarm(
+ void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
+ void *pArg,
+ sqlite3_int64 iThreshold
+){
+ return sqlite3MemoryAlarm(xCallback, pArg, iThreshold);
+}
+#endif
+
+/*
+** Trigger the alarm
+*/
+static void sqlite3MallocAlarm(int nByte){
+ void (*xCallback)(void*,sqlite3_int64,int);
+ sqlite3_int64 nowUsed;
+ void *pArg;
+ if( mem0.alarmCallback==0 ) return;
+ xCallback = mem0.alarmCallback;
+ nowUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
+ pArg = mem0.alarmArg;
+ mem0.alarmCallback = 0;
+ sqlite3_mutex_leave(mem0.mutex);
+ xCallback(pArg, nowUsed, nByte);
+ sqlite3_mutex_enter(mem0.mutex);
+ mem0.alarmCallback = xCallback;
+ mem0.alarmArg = pArg;
+}
+
+/*
+** Do a memory allocation with statistics and alarms. Assume the
+** lock is already held.
+*/
+static int mallocWithAlarm(int n, void **pp){
+ int nFull;
+ void *p;
+ assert( sqlite3_mutex_held(mem0.mutex) );
+ nFull = sqlite3GlobalConfig.m.xRoundup(n);
+ sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, n);
+ if( mem0.alarmCallback!=0 ){
+ int nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
+ if( nUsed+nFull >= mem0.alarmThreshold ){
+ sqlite3MallocAlarm(nFull);
+ }
+ }
+ p = sqlite3GlobalConfig.m.xMalloc(nFull);
+ if( p==0 && mem0.alarmCallback ){
+ sqlite3MallocAlarm(nFull);
+ p = sqlite3GlobalConfig.m.xMalloc(nFull);
+ }
+ if( p ){
+ nFull = sqlite3MallocSize(p);
+ sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nFull);
+ }
+ *pp = p;
+ return nFull;
+}
+
+/*
+** Allocate memory. This routine is like sqlite3_malloc() except that it
+** assumes the memory subsystem has already been initialized.
+*/
+SQLITE_PRIVATE void *sqlite3Malloc(int n){
+ void *p;
+ if( n<=0 || n>=0x7fffff00 ){
+ /* A memory allocation of a number of bytes which is near the maximum
+ ** signed integer value might cause an integer overflow inside of the
+ ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving
+ ** 255 bytes of overhead. SQLite itself will never use anything near
+ ** this amount. The only way to reach the limit is with sqlite3_malloc() */
+ p = 0;
+ }else if( sqlite3GlobalConfig.bMemstat ){
+ sqlite3_mutex_enter(mem0.mutex);
+ mallocWithAlarm(n, &p);
+ sqlite3_mutex_leave(mem0.mutex);
+ }else{
+ p = sqlite3GlobalConfig.m.xMalloc(n);
+ }
+ return p;
+}
+
+/*
+** This version of the memory allocation is for use by the application.
+** First make sure the memory subsystem is initialized, then do the
+** allocation.
+*/
+SQLITE_API void *sqlite3_malloc(int n){
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize() ) return 0;
+#endif
+ return sqlite3Malloc(n);
+}
+
+/*
+** Each thread may only have a single outstanding allocation from
+** xScratchMalloc(). We verify this constraint in the single-threaded
+** case by setting scratchAllocOut to 1 when an allocation
+** is outstanding clearing it when the allocation is freed.
+*/
+#if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
+static int scratchAllocOut = 0;
+#endif
+
+
+/*
+** Allocate memory that is to be used and released right away.
+** This routine is similar to alloca() in that it is not intended
+** for situations where the memory might be held long-term. This
+** routine is intended to get memory to old large transient data
+** structures that would not normally fit on the stack of an
+** embedded processor.
+*/
+SQLITE_PRIVATE void *sqlite3ScratchMalloc(int n){
+ void *p;
+ assert( n>0 );
+
+#if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
+ /* Verify that no more than one scratch allocation per thread
+ ** is outstanding at one time. (This is only checked in the
+ ** single-threaded case since checking in the multi-threaded case
+ ** would be much more complicated.) */
+ assert( scratchAllocOut==0 );
+#endif
+
+ if( sqlite3GlobalConfig.szScratch<n ){
+ goto scratch_overflow;
+ }else{
+ sqlite3_mutex_enter(mem0.mutex);
+ if( mem0.nScratchFree==0 ){
+ sqlite3_mutex_leave(mem0.mutex);
+ goto scratch_overflow;
+ }else{
+ int i;
+ i = mem0.aScratchFree[--mem0.nScratchFree];
+ i *= sqlite3GlobalConfig.szScratch;
+ sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, 1);
+ sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
+ sqlite3_mutex_leave(mem0.mutex);
+ p = (void*)&((char*)sqlite3GlobalConfig.pScratch)[i];
+ assert( (((u8*)p - (u8*)0) & 7)==0 );
+ }
+ }
+#if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
+ scratchAllocOut = p!=0;
+#endif
+
+ return p;
+
+scratch_overflow:
+ if( sqlite3GlobalConfig.bMemstat ){
+ sqlite3_mutex_enter(mem0.mutex);
+ sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
+ n = mallocWithAlarm(n, &p);
+ if( p ) sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, n);
+ sqlite3_mutex_leave(mem0.mutex);
+ }else{
+ p = sqlite3GlobalConfig.m.xMalloc(n);
+ }
+#if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
+ scratchAllocOut = p!=0;
+#endif
+ return p;
+}
+SQLITE_PRIVATE void sqlite3ScratchFree(void *p){
+ if( p ){
+
+#if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
+ /* Verify that no more than one scratch allocation per thread
+ ** is outstanding at one time. (This is only checked in the
+ ** single-threaded case since checking in the multi-threaded case
+ ** would be much more complicated.) */
+ assert( scratchAllocOut==1 );
+ scratchAllocOut = 0;
+#endif
+
+ if( sqlite3GlobalConfig.pScratch==0
+ || p<sqlite3GlobalConfig.pScratch
+ || p>=(void*)mem0.aScratchFree ){
+ if( sqlite3GlobalConfig.bMemstat ){
+ int iSize = sqlite3MallocSize(p);
+ sqlite3_mutex_enter(mem0.mutex);
+ sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, -iSize);
+ sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -iSize);
+ sqlite3GlobalConfig.m.xFree(p);
+ sqlite3_mutex_leave(mem0.mutex);
+ }else{
+ sqlite3GlobalConfig.m.xFree(p);
+ }
+ }else{
+ int i;
+ i = (int)((u8*)p - (u8*)sqlite3GlobalConfig.pScratch);
+ i /= sqlite3GlobalConfig.szScratch;
+ assert( i>=0 && i<sqlite3GlobalConfig.nScratch );
+ sqlite3_mutex_enter(mem0.mutex);
+ assert( mem0.nScratchFree<(u32)sqlite3GlobalConfig.nScratch );
+ mem0.aScratchFree[mem0.nScratchFree++] = i;
+ sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, -1);
+ sqlite3_mutex_leave(mem0.mutex);
+ }
+ }
+}
+
+/*
+** TRUE if p is a lookaside memory allocation from db
+*/
+#ifndef SQLITE_OMIT_LOOKASIDE
+static int isLookaside(sqlite3 *db, void *p){
+ return db && p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
+}
+#else
+#define isLookaside(A,B) 0
+#endif
+
+/*
+** Return the size of a memory allocation previously obtained from
+** sqlite3Malloc() or sqlite3_malloc().
+*/
+SQLITE_PRIVATE int sqlite3MallocSize(void *p){
+ return sqlite3GlobalConfig.m.xSize(p);
+}
+SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
+ assert( db==0 || sqlite3_mutex_held(db->mutex) );
+ if( isLookaside(db, p) ){
+ return db->lookaside.sz;
+ }else{
+ return sqlite3GlobalConfig.m.xSize(p);
+ }
+}
+
+/*
+** Free memory previously obtained from sqlite3Malloc().
+*/
+SQLITE_API void sqlite3_free(void *p){
+ if( p==0 ) return;
+ if( sqlite3GlobalConfig.bMemstat ){
+ sqlite3_mutex_enter(mem0.mutex);
+ sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -sqlite3MallocSize(p));
+ sqlite3GlobalConfig.m.xFree(p);
+ sqlite3_mutex_leave(mem0.mutex);
+ }else{
+ sqlite3GlobalConfig.m.xFree(p);
+ }
+}
+
+/*
+** Free memory that might be associated with a particular database
+** connection.
+*/
+SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){
+ assert( db==0 || sqlite3_mutex_held(db->mutex) );
+ if( isLookaside(db, p) ){
+ LookasideSlot *pBuf = (LookasideSlot*)p;
+ pBuf->pNext = db->lookaside.pFree;
+ db->lookaside.pFree = pBuf;
+ db->lookaside.nOut--;
+ }else{
+ sqlite3_free(p);
+ }
+}
+
+/*
+** Change the size of an existing memory allocation
+*/
+SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, int nBytes){
+ int nOld, nNew;
+ void *pNew;
+ if( pOld==0 ){
+ return sqlite3Malloc(nBytes);
+ }
+ if( nBytes<=0 ){
+ sqlite3_free(pOld);
+ return 0;
+ }
+ if( nBytes>=0x7fffff00 ){
+ /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */
+ return 0;
+ }
+ nOld = sqlite3MallocSize(pOld);
+ nNew = sqlite3GlobalConfig.m.xRoundup(nBytes);
+ if( nOld==nNew ){
+ pNew = pOld;
+ }else if( sqlite3GlobalConfig.bMemstat ){
+ sqlite3_mutex_enter(mem0.mutex);
+ sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, nBytes);
+ if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED)+nNew-nOld >=
+ mem0.alarmThreshold ){
+ sqlite3MallocAlarm(nNew-nOld);
+ }
+ pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
+ if( pNew==0 && mem0.alarmCallback ){
+ sqlite3MallocAlarm(nBytes);
+ pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
+ }
+ if( pNew ){
+ nNew = sqlite3MallocSize(pNew);
+ sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nNew-nOld);
+ }
+ sqlite3_mutex_leave(mem0.mutex);
+ }else{
+ pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
+ }
+ return pNew;
+}
+
+/*
+** The public interface to sqlite3Realloc. Make sure that the memory
+** subsystem is initialized prior to invoking sqliteRealloc.
+*/
+SQLITE_API void *sqlite3_realloc(void *pOld, int n){
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize() ) return 0;
+#endif
+ return sqlite3Realloc(pOld, n);
+}
+
/*
** Allocate and zero memory.
*/
-SQLITE_PRIVATE void *sqlite3MallocZero(unsigned n){
- void *p = sqlite3_malloc(n);
+SQLITE_PRIVATE void *sqlite3MallocZero(int n){
+ void *p = sqlite3Malloc(n);
if( p ){
memset(p, 0, n);
}
@@ -13847,7 +16193,7 @@ SQLITE_PRIVATE void *sqlite3MallocZero(unsigned n){
** Allocate and zero memory. If the allocation fails, make
** the mallocFailed flag in the connection pointer.
*/
-SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, unsigned n){
+SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, int n){
void *p = sqlite3DbMallocRaw(db, n);
if( p ){
memset(p, 0, n);
@@ -13858,28 +16204,78 @@ SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, unsigned n){
/*
** Allocate and zero memory. If the allocation fails, make
** the mallocFailed flag in the connection pointer.
+**
+** If db!=0 and db->mallocFailed is true (indicating a prior malloc
+** failure on the same database connection) then always return 0.
+** Hence for a particular database connection, once malloc starts
+** failing, it fails consistently until mallocFailed is reset.
+** This is an important assumption. There are many places in the
+** code that do things like this:
+**
+** int *a = (int*)sqlite3DbMallocRaw(db, 100);
+** int *b = (int*)sqlite3DbMallocRaw(db, 200);
+** if( b ) a[10] = 9;
+**
+** In other words, if a subsequent malloc (ex: "b") worked, it is assumed
+** that all prior mallocs (ex: "a") worked too.
*/
-SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, unsigned n){
- void *p = 0;
- if( !db || db->mallocFailed==0 ){
- p = sqlite3_malloc(n);
- if( !p && db ){
- db->mallocFailed = 1;
+SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, int n){
+ void *p;
+ assert( db==0 || sqlite3_mutex_held(db->mutex) );
+#ifndef SQLITE_OMIT_LOOKASIDE
+ if( db ){
+ LookasideSlot *pBuf;
+ if( db->mallocFailed ){
+ return 0;
+ }
+ if( db->lookaside.bEnabled && n<=db->lookaside.sz
+ && (pBuf = db->lookaside.pFree)!=0 ){
+ db->lookaside.pFree = pBuf->pNext;
+ db->lookaside.nOut++;
+ if( db->lookaside.nOut>db->lookaside.mxOut ){
+ db->lookaside.mxOut = db->lookaside.nOut;
+ }
+ return (void*)pBuf;
}
}
+#else
+ if( db && db->mallocFailed ){
+ return 0;
+ }
+#endif
+ p = sqlite3Malloc(n);
+ if( !p && db ){
+ db->mallocFailed = 1;
+ }
return p;
}
/*
** Resize the block of memory pointed to by p to n bytes. If the
-** resize fails, set the mallocFailed flag inthe connection object.
+** resize fails, set the mallocFailed flag in the connection object.
*/
SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
void *pNew = 0;
+ assert( db!=0 );
+ assert( sqlite3_mutex_held(db->mutex) );
if( db->mallocFailed==0 ){
- pNew = sqlite3_realloc(p, n);
- if( !pNew ){
- db->mallocFailed = 1;
+ if( p==0 ){
+ return sqlite3DbMallocRaw(db, n);
+ }
+ if( isLookaside(db, p) ){
+ if( n<=db->lookaside.sz ){
+ return p;
+ }
+ pNew = sqlite3DbMallocRaw(db, n);
+ if( pNew ){
+ memcpy(pNew, p, db->lookaside.sz);
+ sqlite3DbFree(db, p);
+ }
+ }else{
+ pNew = sqlite3_realloc(p, n);
+ if( !pNew ){
+ db->mallocFailed = 1;
+ }
}
}
return pNew;
@@ -13893,7 +16289,7 @@ SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
void *pNew;
pNew = sqlite3DbRealloc(db, p, n);
if( !pNew ){
- sqlite3_free(p);
+ sqlite3DbFree(db, p);
}
return pNew;
}
@@ -13905,75 +16301,48 @@ SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
** called via macros that record the current file and line number in the
** ThreadData structure.
*/
-SQLITE_PRIVATE char *sqlite3StrDup(const char *z){
- char *zNew;
- int n;
- if( z==0 ) return 0;
- n = strlen(z)+1;
- zNew = sqlite3_malloc(n);
- if( zNew ) memcpy(zNew, z, n);
- return zNew;
-}
-SQLITE_PRIVATE char *sqlite3StrNDup(const char *z, int n){
+SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){
char *zNew;
- if( z==0 ) return 0;
- zNew = sqlite3_malloc(n+1);
+ size_t n;
+ if( z==0 ){
+ return 0;
+ }
+ n = sqlite3Strlen30(z) + 1;
+ assert( (n&0x7fffffff)==n );
+ zNew = sqlite3DbMallocRaw(db, (int)n);
if( zNew ){
memcpy(zNew, z, n);
- zNew[n] = 0;
- }
- return zNew;
-}
-
-SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){
- char *zNew = sqlite3StrDup(z);
- if( z && !zNew ){
- db->mallocFailed = 1;
}
return zNew;
}
SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){
- char *zNew = sqlite3StrNDup(z, n);
- if( z && !zNew ){
- db->mallocFailed = 1;
+ char *zNew;
+ if( z==0 ){
+ return 0;
+ }
+ assert( (n&0x7fffffff)==n );
+ zNew = sqlite3DbMallocRaw(db, n+1);
+ if( zNew ){
+ memcpy(zNew, z, n);
+ zNew[n] = 0;
}
return zNew;
}
/*
-** Create a string from the 2nd and subsequent arguments (up to the
-** first NULL argument), store the string in memory obtained from
-** sqliteMalloc() and make the pointer indicated by the 1st argument
-** point to that string. The 1st argument must either be NULL or
-** point to memory obtained from sqliteMalloc().
+** Create a string from the zFromat argument and the va_list that follows.
+** Store the string in memory obtained from sqliteMalloc() and make *pz
+** point to that string.
*/
-SQLITE_PRIVATE void sqlite3SetString(char **pz, ...){
+SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zFormat, ...){
va_list ap;
- int nByte;
- const char *z;
- char *zResult;
+ char *z;
- assert( pz!=0 );
- nByte = 1;
- va_start(ap, pz);
- while( (z = va_arg(ap, const char*))!=0 ){
- nByte += strlen(z);
- }
- va_end(ap);
- sqlite3_free(*pz);
- *pz = zResult = sqlite3_malloc(nByte);
- if( zResult==0 ){
- return;
- }
- *zResult = 0;
- va_start(ap, pz);
- while( (z = va_arg(ap, const char*))!=0 ){
- int n = strlen(z);
- memcpy(zResult, z, n);
- zResult += n;
- }
- zResult[0] = 0;
+ va_start(ap, zFormat);
+ z = sqlite3VMPrintf(db, zFormat, ap);
va_end(ap);
+ sqlite3DbFree(db, *pz);
+ *pz = z;
}
@@ -13983,10 +16352,10 @@ SQLITE_PRIVATE void sqlite3SetString(char **pz, ...){
** sqlite3_realloc.
**
** The returned value is normally a copy of the second argument to this
-** function. However, if a malloc() failure has occured since the previous
+** function. However, if a malloc() failure has occurred since the previous
** invocation SQLITE_NOMEM is returned instead.
**
-** If the first argument, db, is not NULL and a malloc() error has occured,
+** If the first argument, db, is not NULL and a malloc() error has occurred,
** then the connection error-code (the value returned by sqlite3_errcode())
** is set to SQLITE_NOMEM.
*/
@@ -13996,7 +16365,7 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){
** is unsafe, as is the call to sqlite3Error().
*/
assert( !db || sqlite3_mutex_held(db->mutex) );
- if( db && db->mallocFailed ){
+ if( db && (db->mallocFailed || rc==SQLITE_IOERR_NOMEM) ){
sqlite3Error(db, SQLITE_NOMEM, 0);
db->mallocFailed = 0;
rc = SQLITE_NOMEM;
@@ -14013,6 +16382,8 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){
** an historical reference. Most of the "enhancements" have been backed
** out so that the functionality is now the same as standard printf().
**
+** $Id: printf.c,v 1.104 2009/06/03 01:24:54 drh Exp $
+**
**************************************************************************
**
** The following modules is an enhanced replacement for the "printf" subroutines
@@ -14073,15 +16444,16 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){
#define etPERCENT 8 /* Percent symbol. %% */
#define etCHARX 9 /* Characters. %c */
/* The rest are extensions, not normally found in printf() */
-#define etCHARLIT 10 /* Literal characters. %' */
-#define etSQLESCAPE 11 /* Strings with '\'' doubled. %q */
-#define etSQLESCAPE2 12 /* Strings with '\'' doubled and enclosed in '',
+#define etSQLESCAPE 10 /* Strings with '\'' doubled. %q */
+#define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '',
NULL pointers replaced by SQL NULL. %Q */
-#define etTOKEN 13 /* a pointer to a Token structure */
-#define etSRCLIST 14 /* a pointer to a SrcList */
-#define etPOINTER 15 /* The %p conversion */
-#define etSQLESCAPE3 16 /* %w -> Strings with '\"' doubled */
-#define etORDINAL 17 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
+#define etTOKEN 12 /* a pointer to a Token structure */
+#define etSRCLIST 13 /* a pointer to a SrcList */
+#define etPOINTER 14 /* The %p conversion */
+#define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */
+#define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
+
+#define etINVALID 0 /* Any unrecognized conversion type */
/*
@@ -14139,11 +16511,13 @@ static const et_info fmtinfo[] = {
{ 'n', 0, 0, etSIZE, 0, 0 },
{ '%', 0, 0, etPERCENT, 0, 0 },
{ 'p', 16, 0, etPOINTER, 0, 1 },
+
+/* All the rest have the FLAG_INTERN bit set and are thus for internal
+** use only */
{ 'T', 0, 2, etTOKEN, 0, 0 },
{ 'S', 0, 2, etSRCLIST, 0, 0 },
{ 'r', 10, 3, etORDINAL, 0, 0 },
};
-#define etNINFO (sizeof(fmtinfo)/sizeof(fmtinfo[0]))
/*
** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point
@@ -14163,7 +16537,7 @@ static const et_info fmtinfo[] = {
** 16 (the number of significant digits in a 64-bit float) '0' is
** always returned.
*/
-static int et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
+static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
int digit;
LONGDOUBLE_TYPE d;
if( (*cnt)++ >= 16 ) return '0';
@@ -14171,7 +16545,7 @@ static int et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
d = digit;
digit += '0';
*val = (*val - d)*10.0;
- return digit;
+ return (char)digit;
}
#endif /* SQLITE_OMIT_FLOATING_POINT */
@@ -14180,7 +16554,7 @@ static int et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
*/
static void appendSpace(StrAccum *pAccum, int N){
static const char zSpaces[] = " ";
- while( N>=sizeof(zSpaces)-1 ){
+ while( N>=(int)sizeof(zSpaces)-1 ){
sqlite3StrAccumAppend(pAccum, zSpaces, sizeof(zSpaces)-1);
N -= sizeof(zSpaces)-1;
}
@@ -14191,11 +16565,14 @@ static void appendSpace(StrAccum *pAccum, int N){
/*
** On machines with a small stack size, you can redefine the
-** SQLITE_PRINT_BUF_SIZE to be less than 350. But beware - for
-** smaller values some %f conversions may go into an infinite loop.
+** SQLITE_PRINT_BUF_SIZE to be less than 350.
*/
#ifndef SQLITE_PRINT_BUF_SIZE
-# define SQLITE_PRINT_BUF_SIZE 350
+# if defined(SQLITE_SMALL_STACK)
+# define SQLITE_PRINT_BUF_SIZE 50
+# else
+# define SQLITE_PRINT_BUF_SIZE 350
+# endif
#endif
#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
@@ -14226,7 +16603,7 @@ static void appendSpace(StrAccum *pAccum, int N){
** seems to make a big difference in determining how fast this beast
** will run.
*/
-static void vxprintf(
+SQLITE_PRIVATE void sqlite3VXPrintf(
StrAccum *pAccum, /* Accumulate results here */
int useExtended, /* Allow extended %-conversions */
const char *fmt, /* Format string */
@@ -14252,8 +16629,7 @@ static void vxprintf(
const et_info *infop; /* Pointer to the appropriate info structure */
char buf[etBUFSIZE]; /* Conversion buffer */
char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
- etByte errorflag = 0; /* True if an error is encountered */
- etByte xtype; /* Conversion paradigm */
+ etByte xtype = 0; /* Conversion paradigm */
char *zExtra; /* Extra memory used for etTCLESCAPE conversions */
#ifndef SQLITE_OMIT_FLOATING_POINT
int exp, e2; /* exponent of real numbers */
@@ -14276,7 +16652,6 @@ static void vxprintf(
if( c==0 ) break;
}
if( (c=(*++fmt))==0 ){
- errorflag = 1;
sqlite3StrAccumAppend(pAccum, "%", 1);
break;
}
@@ -14344,8 +16719,9 @@ static void vxprintf(
flag_long = flag_longlong = 0;
}
/* Fetch the info entry for the field */
- infop = 0;
- for(idx=0; idx<etNINFO; idx++){
+ infop = &fmtinfo[0];
+ xtype = etINVALID;
+ for(idx=0; idx<ArraySize(fmtinfo); idx++){
if( c==fmtinfo[idx].fmttype ){
infop = &fmtinfo[idx];
if( useExtended || (infop->flags & FLAG_INTERN)==0 ){
@@ -14357,9 +16733,6 @@ static void vxprintf(
}
}
zExtra = 0;
- if( infop==0 ){
- return;
- }
/* Limit the precision to prevent overflowing buf[] during conversion */
@@ -14397,9 +16770,13 @@ static void vxprintf(
case etRADIX:
if( infop->flags & FLAG_SIGNED ){
i64 v;
- if( flag_longlong ) v = va_arg(ap,i64);
- else if( flag_long ) v = va_arg(ap,long int);
- else v = va_arg(ap,int);
+ if( flag_longlong ){
+ v = va_arg(ap,i64);
+ }else if( flag_long ){
+ v = va_arg(ap,long int);
+ }else{
+ v = va_arg(ap,int);
+ }
if( v<0 ){
longvalue = -v;
prefix = '-';
@@ -14410,9 +16787,13 @@ static void vxprintf(
else prefix = 0;
}
}else{
- if( flag_longlong ) longvalue = va_arg(ap,u64);
- else if( flag_long ) longvalue = va_arg(ap,unsigned long int);
- else longvalue = va_arg(ap,unsigned int);
+ if( flag_longlong ){
+ longvalue = va_arg(ap,u64);
+ }else if( flag_long ){
+ longvalue = va_arg(ap,unsigned long int);
+ }else{
+ longvalue = va_arg(ap,unsigned int);
+ }
prefix = 0;
}
if( longvalue==0 ) flag_alternateform = 0;
@@ -14422,7 +16803,7 @@ static void vxprintf(
bufpt = &buf[etBUFSIZE-1];
if( xtype==etORDINAL ){
static const char zOrd[] = "thstndrd";
- int x = longvalue % 10;
+ int x = (int)(longvalue % 10);
if( x>=4 || (longvalue/10)%10==1 ){
x = 0;
}
@@ -14440,7 +16821,7 @@ static void vxprintf(
longvalue = longvalue/base;
}while( longvalue>0 );
}
- length = &buf[etBUFSIZE-1]-bufpt;
+ length = (int)(&buf[etBUFSIZE-1]-bufpt);
for(idx=precision-length; idx>0; idx--){
*(--bufpt) = '0'; /* Zero pad */
}
@@ -14449,11 +16830,9 @@ static void vxprintf(
const char *pre;
char x;
pre = &aPrefix[infop->prefix];
- if( *bufpt!=pre[0] ){
- for(; (x=(*pre))!=0; pre++) *(--bufpt) = x;
- }
+ for(; (x=(*pre))!=0; pre++) *(--bufpt) = x;
}
- length = &buf[etBUFSIZE-1]-bufpt;
+ length = (int)(&buf[etBUFSIZE-1]-bufpt);
break;
case etFLOAT:
case etEXP:
@@ -14481,7 +16860,7 @@ static void vxprintf(
if( xtype==etFLOAT ) realvalue += rounder;
/* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
exp = 0;
- if( sqlite3IsNaN(realvalue) ){
+ if( sqlite3IsNaN((double)realvalue) ){
bufpt = "NaN";
length = 3;
break;
@@ -14490,9 +16869,9 @@ static void vxprintf(
while( realvalue>=1e32 && exp<=350 ){ realvalue *= 1e-32; exp+=32; }
while( realvalue>=1e8 && exp<=350 ){ realvalue *= 1e-8; exp+=8; }
while( realvalue>=10.0 && exp<=350 ){ realvalue *= 0.1; exp++; }
- while( realvalue<1e-8 && exp>=-350 ){ realvalue *= 1e8; exp-=8; }
- while( realvalue<1.0 && exp>=-350 ){ realvalue *= 10.0; exp--; }
- if( exp>350 || exp<-350 ){
+ while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; }
+ while( realvalue<1.0 ){ realvalue *= 10.0; exp--; }
+ if( exp>350 ){
if( prefix=='-' ){
bufpt = "-Inf";
}else if( prefix=='+' ){
@@ -14500,7 +16879,7 @@ static void vxprintf(
}else{
bufpt = "Inf";
}
- length = strlen(bufpt);
+ length = sqlite3Strlen30(bufpt);
break;
}
}
@@ -14531,7 +16910,7 @@ static void vxprintf(
e2 = exp;
}
nsd = 0;
- flag_dp = (precision>0) | flag_alternateform | flag_altform2;
+ flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2;
/* The sign in front of the number */
if( prefix ){
*(bufpt++) = prefix;
@@ -14550,7 +16929,8 @@ static void vxprintf(
}
/* "0" digits after the decimal point but before the first
** significant digit of the number */
- for(e2++; e2<0 && precision>0; precision--, e2++){
+ for(e2++; e2<0; precision--, e2++){
+ assert( precision>0 );
*(bufpt++) = '0';
}
/* Significant digits after the decimal point */
@@ -14570,7 +16950,7 @@ static void vxprintf(
}
}
/* Add the "eNNN" suffix */
- if( flag_exp || (xtype==etEXP && exp) ){
+ if( flag_exp || xtype==etEXP ){
*(bufpt++) = aDigits[infop->charset];
if( exp<0 ){
*(bufpt++) = '-'; exp = -exp;
@@ -14578,18 +16958,18 @@ static void vxprintf(
*(bufpt++) = '+';
}
if( exp>=100 ){
- *(bufpt++) = (exp/100)+'0'; /* 100's digit */
+ *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */
exp %= 100;
}
- *(bufpt++) = exp/10+'0'; /* 10's digit */
- *(bufpt++) = exp%10+'0'; /* 1's digit */
+ *(bufpt++) = (char)(exp/10+'0'); /* 10's digit */
+ *(bufpt++) = (char)(exp%10+'0'); /* 1's digit */
}
*bufpt = 0;
/* The converted number is in buf[] and zero terminated. Output it.
** Note that the number is in the usual order, not reversed as with
** integer conversions. */
- length = bufpt-buf;
+ length = (int)(bufpt-buf);
bufpt = buf;
/* Special case: Add leading zeros if the flag_zeropad flag is
@@ -14615,11 +16995,11 @@ static void vxprintf(
bufpt = buf;
length = 1;
break;
- case etCHARLIT:
case etCHARX:
- c = buf[0] = (xtype==etCHARX ? va_arg(ap,int) : *++fmt);
+ c = va_arg(ap,int);
+ buf[0] = (char)c;
if( precision>=0 ){
- for(idx=1; idx<precision; idx++) buf[idx] = c;
+ for(idx=1; idx<precision; idx++) buf[idx] = (char)c;
length = precision;
}else{
length =1;
@@ -14637,14 +17017,15 @@ static void vxprintf(
if( precision>=0 ){
for(length=0; length<precision && bufpt[length]; length++){}
}else{
- length = strlen(bufpt);
+ length = sqlite3Strlen30(bufpt);
}
break;
case etSQLESCAPE:
case etSQLESCAPE2:
case etSQLESCAPE3: {
- int i, j, n, ch, isnull;
+ int i, j, n, isnull;
int needQuote;
+ char ch;
char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
char *escarg = va_arg(ap,char*);
isnull = escarg==0;
@@ -14655,8 +17036,11 @@ static void vxprintf(
needQuote = !isnull && xtype==etSQLESCAPE2;
n += i + 1 + needQuote*2;
if( n>etBUFSIZE ){
- bufpt = zExtra = sqlite3_malloc( n );
- if( bufpt==0 ) return;
+ bufpt = zExtra = sqlite3Malloc( n );
+ if( bufpt==0 ){
+ pAccum->mallocFailed = 1;
+ return;
+ }
}else{
bufpt = buf;
}
@@ -14675,7 +17059,7 @@ static void vxprintf(
}
case etTOKEN: {
Token *pToken = va_arg(ap, Token*);
- if( pToken && pToken->z ){
+ if( pToken ){
sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
}
length = width = 0;
@@ -14686,7 +17070,7 @@ static void vxprintf(
int k = va_arg(ap, int);
struct SrcList_item *pItem = &pSrc->a[k];
assert( k>=0 && k<pSrc->nSrc );
- if( pItem->zDatabase && pItem->zDatabase[0] ){
+ if( pItem->zDatabase ){
sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1);
sqlite3StrAccumAppend(pAccum, ".", 1);
}
@@ -14694,6 +17078,10 @@ static void vxprintf(
length = width = 0;
break;
}
+ default: {
+ assert( xtype==etINVALID );
+ return;
+ }
}/* End switch over the format type */
/*
** The text of the conversion is pointed to by "bufpt" and is
@@ -14727,13 +17115,16 @@ static void vxprintf(
** Append N bytes of text from z to the StrAccum object.
*/
SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
+ assert( z!=0 || N==0 );
if( p->tooBig | p->mallocFailed ){
+ testcase(p->tooBig);
+ testcase(p->mallocFailed);
return;
}
if( N<0 ){
- N = strlen(z);
+ N = sqlite3Strlen30(z);
}
- if( N==0 ){
+ if( N==0 || NEVER(z==0) ){
return;
}
if( p->nChar+N >= p->nAlloc ){
@@ -14745,19 +17136,16 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
return;
}
}else{
- i64 szNew = p->nAlloc;
+ i64 szNew = p->nChar;
szNew += N + 1;
if( szNew > p->mxAlloc ){
- p->nAlloc = p->mxAlloc;
- if( ((i64)p->nChar)+((i64)N) >= p->nAlloc ){
- sqlite3StrAccumReset(p);
- p->tooBig = 1;
- return;
- }
+ sqlite3StrAccumReset(p);
+ p->tooBig = 1;
+ return;
}else{
- p->nAlloc = szNew;
+ p->nAlloc = (int)szNew;
}
- zNew = sqlite3_malloc( p->nAlloc );
+ zNew = sqlite3DbMallocRaw(p->db, p->nAlloc );
if( zNew ){
memcpy(zNew, p->zText, p->nChar);
sqlite3StrAccumReset(p);
@@ -14782,7 +17170,7 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
if( p->zText ){
p->zText[p->nChar] = 0;
if( p->useMalloc && p->zText==p->zBase ){
- p->zText = sqlite3_malloc( p->nChar+1 );
+ p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
if( p->zText ){
memcpy(p->zText, p->zBase, p->nChar+1);
}else{
@@ -14798,16 +17186,17 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
*/
SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){
if( p->zText!=p->zBase ){
- sqlite3_free(p->zText);
- p->zText = 0;
+ sqlite3DbFree(p->db, p->zText);
}
+ p->zText = 0;
}
/*
** Initialize a string accumulator
*/
-static void sqlite3StrAccumInit(StrAccum *p, char *zBase, int n, int mx){
+SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, char *zBase, int n, int mx){
p->zText = p->zBase = zBase;
+ p->db = 0;
p->nChar = 0;
p->nAlloc = n;
p->mxAlloc = mx;
@@ -14824,11 +17213,13 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list a
char *z;
char zBase[SQLITE_PRINT_BUF_SIZE];
StrAccum acc;
+ assert( db!=0 );
sqlite3StrAccumInit(&acc, zBase, sizeof(zBase),
- db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH);
- vxprintf(&acc, 1, zFormat, ap);
+ db->aLimit[SQLITE_LIMIT_LENGTH]);
+ acc.db = db;
+ sqlite3VXPrintf(&acc, 1, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
- if( acc.mallocFailed && db ){
+ if( acc.mallocFailed ){
db->mallocFailed = 1;
}
return z;
@@ -14848,6 +17239,24 @@ SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){
}
/*
+** Like sqlite3MPrintf(), but call sqlite3DbFree() on zStr after formatting
+** the string and before returnning. This routine is intended to be used
+** to modify an existing string. For example:
+**
+** x = sqlite3MPrintf(db, x, "prefix %s suffix", x);
+**
+*/
+SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3 *db, char *zStr, const char *zFormat, ...){
+ va_list ap;
+ char *z;
+ va_start(ap, zFormat);
+ z = sqlite3VMPrintf(db, zFormat, ap);
+ va_end(ap);
+ sqlite3DbFree(db, zStr);
+ return z;
+}
+
+/*
** Print into memory obtained from sqlite3_malloc(). Omit the internal
** %-conversion extensions.
*/
@@ -14855,8 +17264,11 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
char *z;
char zBase[SQLITE_PRINT_BUF_SIZE];
StrAccum acc;
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize() ) return 0;
+#endif
sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
- vxprintf(&acc, 0, zFormat, ap);
+ sqlite3VXPrintf(&acc, 0, zFormat, ap);
z = sqlite3StrAccumFinish(&acc);
return z;
}
@@ -14868,6 +17280,9 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){
va_list ap;
char *z;
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize() ) return 0;
+#endif
va_start(ap, zFormat);
z = sqlite3_vmprintf(zFormat, ap);
va_end(ap);
@@ -14891,13 +17306,13 @@ SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
sqlite3StrAccumInit(&acc, zBuf, n, 0);
acc.useMalloc = 0;
va_start(ap,zFormat);
- vxprintf(&acc, 0, zFormat, ap);
+ sqlite3VXPrintf(&acc, 0, zFormat, ap);
va_end(ap);
z = sqlite3StrAccumFinish(&acc);
return z;
}
-#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) || defined(SQLITE_MEMDEBUG)
+#if defined(SQLITE_DEBUG)
/*
** A version of printf() that understands %lld. Used for debugging.
** The printf() built into some versions of windows does not understand %lld
@@ -14910,7 +17325,7 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
sqlite3StrAccumInit(&acc, zBuf, sizeof(zBuf), 0);
acc.useMalloc = 0;
va_start(ap,zFormat);
- vxprintf(&acc, 0, zFormat, ap);
+ sqlite3VXPrintf(&acc, 0, zFormat, ap);
va_end(ap);
sqlite3StrAccumFinish(&acc);
fprintf(stdout,"%s", zBuf);
@@ -14937,14 +17352,14 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
** Random numbers are used by some of the database backends in order
** to generate random integer keys for tables or random filenames.
**
-** $Id: random.c,v 1.23 2008/03/21 16:45:47 drh Exp $
+** $Id: random.c,v 1.29 2008/12/10 19:26:24 drh Exp $
*/
/* All threads share a single random number generator.
** This structure is the current state of the generator.
*/
-static struct sqlite3PrngType {
+static SQLITE_WSD struct sqlite3PrngType {
unsigned char isInit; /* True if initialized */
unsigned char i, j; /* State variables */
unsigned char s[256]; /* State variables */
@@ -14966,10 +17381,24 @@ static struct sqlite3PrngType {
** (Later): Actually, OP_NewRowid does not depend on a good source of
** randomness any more. But we will leave this code in all the same.
*/
-static int randomByte(void){
+static u8 randomByte(void){
unsigned char t;
+ /* The "wsdPrng" macro will resolve to the pseudo-random number generator
+ ** state vector. If writable static data is unsupported on the target,
+ ** we have to locate the state vector at run-time. In the more common
+ ** case where writable static data is supported, wsdPrng can refer directly
+ ** to the "sqlite3Prng" state vector declared above.
+ */
+#ifdef SQLITE_OMIT_WSD
+ struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng);
+# define wsdPrng p[0]
+#else
+# define wsdPrng sqlite3Prng
+#endif
+
+
/* Initialize the state of the random number generator once,
** the first time this routine is called. The seed value does
** not need to contain a lot of randomness since we are not
@@ -14979,33 +17408,33 @@ static int randomByte(void){
** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random
** number generator) not as an encryption device.
*/
- if( !sqlite3Prng.isInit ){
+ if( !wsdPrng.isInit ){
int i;
char k[256];
- sqlite3Prng.j = 0;
- sqlite3Prng.i = 0;
+ wsdPrng.j = 0;
+ wsdPrng.i = 0;
sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k);
for(i=0; i<256; i++){
- sqlite3Prng.s[i] = i;
+ wsdPrng.s[i] = (u8)i;
}
for(i=0; i<256; i++){
- sqlite3Prng.j += sqlite3Prng.s[i] + k[i];
- t = sqlite3Prng.s[sqlite3Prng.j];
- sqlite3Prng.s[sqlite3Prng.j] = sqlite3Prng.s[i];
- sqlite3Prng.s[i] = t;
+ wsdPrng.j += wsdPrng.s[i] + k[i];
+ t = wsdPrng.s[wsdPrng.j];
+ wsdPrng.s[wsdPrng.j] = wsdPrng.s[i];
+ wsdPrng.s[i] = t;
}
- sqlite3Prng.isInit = 1;
+ wsdPrng.isInit = 1;
}
/* Generate and return single random byte
*/
- sqlite3Prng.i++;
- t = sqlite3Prng.s[sqlite3Prng.i];
- sqlite3Prng.j += t;
- sqlite3Prng.s[sqlite3Prng.i] = sqlite3Prng.s[sqlite3Prng.j];
- sqlite3Prng.s[sqlite3Prng.j] = t;
- t += sqlite3Prng.s[sqlite3Prng.i];
- return sqlite3Prng.s[t];
+ wsdPrng.i++;
+ t = wsdPrng.s[wsdPrng.i];
+ wsdPrng.j += t;
+ wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j];
+ wsdPrng.s[wsdPrng.j] = t;
+ t += wsdPrng.s[wsdPrng.i];
+ return wsdPrng.s[t];
}
/*
@@ -15013,10 +17442,9 @@ static int randomByte(void){
*/
SQLITE_API void sqlite3_randomness(int N, void *pBuf){
unsigned char *zBuf = pBuf;
- static sqlite3_mutex *mutex = 0;
- if( mutex==0 ){
- mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PRNG);
- }
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG);
+#endif
sqlite3_mutex_enter(mutex);
while( N-- ){
*(zBuf++) = randomByte();
@@ -15027,19 +17455,30 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){
#ifndef SQLITE_OMIT_BUILTIN_TEST
/*
** For testing purposes, we sometimes want to preserve the state of
-** PRNG and restore the PRNG to its saved state at a later time.
+** PRNG and restore the PRNG to its saved state at a later time, or
+** to reset the PRNG to its initial state. These routines accomplish
+** those tasks.
+**
** The sqlite3_test_control() interface calls these routines to
** control the PRNG.
*/
-static struct sqlite3PrngType sqlite3SavedPrng;
+static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng;
SQLITE_PRIVATE void sqlite3PrngSaveState(void){
- memcpy(&sqlite3SavedPrng, &sqlite3Prng, sizeof(sqlite3Prng));
+ memcpy(
+ &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
+ &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
+ sizeof(sqlite3Prng)
+ );
}
SQLITE_PRIVATE void sqlite3PrngRestoreState(void){
- memcpy(&sqlite3Prng, &sqlite3SavedPrng, sizeof(sqlite3Prng));
+ memcpy(
+ &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
+ &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
+ sizeof(sqlite3Prng)
+ );
}
SQLITE_PRIVATE void sqlite3PrngResetState(void){
- sqlite3Prng.isInit = 0;
+ GLOBAL(struct sqlite3PrngType, sqlite3Prng).isInit = 0;
}
#endif /* SQLITE_OMIT_BUILTIN_TEST */
@@ -15059,7 +17498,7 @@ SQLITE_PRIVATE void sqlite3PrngResetState(void){
** This file contains routines used to translate between UTF-8,
** UTF-16, UTF-16BE, and UTF-16LE.
**
-** $Id: utf.c,v 1.61 2008/03/28 15:44:10 danielk1977 Exp $
+** $Id: utf.c,v 1.73 2009/04/01 18:40:32 drh Exp $
**
** Notes on UTF-8:
**
@@ -15100,19 +17539,13 @@ SQLITE_PRIVATE void sqlite3PrngResetState(void){
** source code file "vdbe.c". When that file became too big (over
** 6000 lines long) it was split up into several smaller files and
** this header information was factored out.
+**
+** $Id: vdbeInt.h,v 1.174 2009/06/23 14:15:04 drh Exp $
*/
#ifndef _VDBEINT_H_
#define _VDBEINT_H_
/*
-** intToKey() and keyToInt() used to transform the rowid. But with
-** the latest versions of the design they are no-ops.
-*/
-#define keyToInt(X) (X)
-#define intToKey(X) (X)
-
-
-/*
** SQL is translated into a sequence of instructions to be
** executed by a virtual machine. Each instruction is an instance
** of the following structure.
@@ -15134,55 +17567,88 @@ typedef unsigned char Bool;
** Every cursor that the virtual machine has open is represented by an
** instance of the following structure.
**
-** If the Cursor.isTriggerRow flag is set it means that this cursor is
+** If the VdbeCursor.isTriggerRow flag is set it means that this cursor is
** really a single row that represents the NEW or OLD pseudo-table of
-** a row trigger. The data for the row is stored in Cursor.pData and
-** the rowid is in Cursor.iKey.
+** a row trigger. The data for the row is stored in VdbeCursor.pData and
+** the rowid is in VdbeCursor.iKey.
*/
-struct Cursor {
+struct VdbeCursor {
BtCursor *pCursor; /* The cursor structure of the backend */
int iDb; /* Index of cursor database in db->aDb[] (or -1) */
i64 lastRowid; /* Last rowid from a Next or NextIdx operation */
- i64 nextRowid; /* Next rowid returned by OP_NewRowid */
Bool zeroed; /* True if zeroed out and ready for reuse */
Bool rowidIsValid; /* True if lastRowid is valid */
Bool atFirst; /* True if pointing to first entry */
Bool useRandomRowid; /* Generate new record numbers semi-randomly */
Bool nullRow; /* True if pointing to a row with no data */
- Bool nextRowidValid; /* True if the nextRowid field is valid */
- Bool pseudoTable; /* This is a NEW or OLD pseudo-tables of a trigger */
- Bool ephemPseudoTable;
Bool deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */
Bool isTable; /* True if a table requiring integer keys */
Bool isIndex; /* True if an index containing keys only - no data */
- u8 bogusIncrKey; /* Something for pIncrKey to point to if pKeyInfo==0 */
i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */
Btree *pBt; /* Separate file holding temporary table */
- int nData; /* Number of bytes in pData */
- char *pData; /* Data for a NEW or OLD pseudo-table */
- i64 iKey; /* Key for the NEW or OLD pseudo-table row */
- u8 *pIncrKey; /* Pointer to pKeyInfo->incrKey */
+ int pseudoTableReg; /* Register holding pseudotable content. */
KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */
int nField; /* Number of fields in the header */
i64 seqCount; /* Sequence counter */
sqlite3_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */
const sqlite3_module *pModule; /* Module for cursor pVtabCursor */
+ /* Result of last sqlite3BtreeMoveto() done by an OP_NotExists or
+ ** OP_IsUnique opcode on this cursor. */
+ int seekResult;
+
/* Cached information about the header for the data record that the
- ** cursor is currently pointing to. Only valid if cacheValid is true.
+ ** cursor is currently pointing to. Only valid if cacheStatus matches
+ ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of
+ ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that
+ ** the cache is out of date.
+ **
** aRow might point to (ephemeral) data for the current row, or it might
** be NULL.
*/
- int cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */
+ u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */
int payloadSize; /* Total number of bytes in the record */
u32 *aType; /* Type values for all entries in the record */
u32 *aOffset; /* Cached offsets to the start of each columns data */
u8 *aRow; /* Data for the current row, if all on one page */
};
-typedef struct Cursor Cursor;
+typedef struct VdbeCursor VdbeCursor;
+
+/*
+** When a sub-program is executed (OP_Program), a structure of this type
+** is allocated to store the current value of the program counter, as
+** well as the current memory cell array and various other frame specific
+** values stored in the Vdbe struct. When the sub-program is finished,
+** these values are copied back to the Vdbe from the VdbeFrame structure,
+** restoring the state of the VM to as it was before the sub-program
+** began executing.
+**
+** Frames are stored in a linked list headed at Vdbe.pParent. Vdbe.pParent
+** is the parent of the current frame, or zero if the current frame
+** is the main Vdbe program.
+*/
+typedef struct VdbeFrame VdbeFrame;
+struct VdbeFrame {
+ Vdbe *v; /* VM this frame belongs to */
+ int pc; /* Program Counter */
+ Op *aOp; /* Program instructions */
+ int nOp; /* Size of aOp array */
+ Mem *aMem; /* Array of memory cells */
+ int nMem; /* Number of entries in aMem */
+ VdbeCursor **apCsr; /* Element of Vdbe cursors */
+ u16 nCursor; /* Number of entries in apCsr */
+ void *token; /* Copy of SubProgram.token */
+ int nChildMem; /* Number of memory cells for child frame */
+ int nChildCsr; /* Number of cursors for child frame */
+ i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */
+ int nChange; /* Statement changes (Vdbe.nChanges) */
+ VdbeFrame *pParent; /* Parent of this frame */
+};
+
+#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
/*
-** A value for Cursor.cacheValid that means the cache is always invalid.
+** A value for VdbeCursor.cacheValid that means the cache is always invalid.
*/
#define CACHE_STALE 0
@@ -15199,8 +17665,11 @@ typedef struct Cursor Cursor;
*/
struct Mem {
union {
- i64 i; /* Integer value. Or FuncDef* when flags==MEM_Agg */
+ i64 i; /* Integer value. */
+ int nZero; /* Used when bit MEM_Zero is set in flags */
FuncDef *pDef; /* Used only when flags==MEM_Agg */
+ RowSet *pRowSet; /* Used only when flags==MEM_RowSet */
+ VdbeFrame *pFrame; /* Used when flags==MEM_Frame */
} u;
double r; /* Real value */
sqlite3 *db; /* The associated database connection */
@@ -15233,21 +17702,21 @@ struct Mem {
#define MEM_Int 0x0004 /* Value is an integer */
#define MEM_Real 0x0008 /* Value is a real number */
#define MEM_Blob 0x0010 /* Value is a BLOB */
-
-#define MemSetTypeFlag(p, f) \
- ((p)->flags = ((p)->flags&~(MEM_Int|MEM_Real|MEM_Null|MEM_Blob|MEM_Str))|f)
+#define MEM_RowSet 0x0020 /* Value is a RowSet object */
+#define MEM_Frame 0x0040 /* Value is a VdbeFrame object */
+#define MEM_TypeMask 0x00ff /* Mask of type bits */
/* Whenever Mem contains a valid string or blob representation, one of
** the following flags must be set to determine the memory management
** policy for Mem.z. The MEM_Term flag tells us whether or not the
** string is \000 or \u0000 terminated
*/
-#define MEM_Term 0x0020 /* String rep is nul terminated */
-#define MEM_Dyn 0x0040 /* Need to call sqliteFree() on Mem.z */
-#define MEM_Static 0x0080 /* Mem.z points to a static string */
-#define MEM_Ephem 0x0100 /* Mem.z points to an ephemeral string */
-#define MEM_Agg 0x0400 /* Mem.z points to an agg function context */
-#define MEM_Zero 0x0800 /* Mem.i contains count of 0s appended to blob */
+#define MEM_Term 0x0200 /* String rep is nul terminated */
+#define MEM_Dyn 0x0400 /* Need to call sqliteFree() on Mem.z */
+#define MEM_Static 0x0800 /* Mem.z points to a static string */
+#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */
+#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */
+#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */
#ifdef SQLITE_OMIT_INCRBLOB
#undef MEM_Zero
@@ -15255,6 +17724,13 @@ struct Mem {
#endif
+/*
+** Clear any existing type flags from a Mem and replace them with f
+*/
+#define MemSetTypeFlag(p, f) \
+ ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f)
+
+
/* A VdbeFunc is just a FuncDef (defined in sqliteInt.h) that contains
** additional information about auxiliary information bound to arguments
** of the function. This is used to implement the sqlite3_get_auxdata()
@@ -15308,48 +17784,6 @@ struct Set {
};
/*
-** A FifoPage structure holds a single page of valves. Pages are arranged
-** in a list.
-*/
-typedef struct FifoPage FifoPage;
-struct FifoPage {
- int nSlot; /* Number of entries aSlot[] */
- int iWrite; /* Push the next value into this entry in aSlot[] */
- int iRead; /* Read the next value from this entry in aSlot[] */
- FifoPage *pNext; /* Next page in the fifo */
- i64 aSlot[1]; /* One or more slots for rowid values */
-};
-
-/*
-** The Fifo structure is typedef-ed in vdbeInt.h. But the implementation
-** of that structure is private to this file.
-**
-** The Fifo structure describes the entire fifo.
-*/
-typedef struct Fifo Fifo;
-struct Fifo {
- int nEntry; /* Total number of entries */
- FifoPage *pFirst; /* First page on the list */
- FifoPage *pLast; /* Last page on the list */
-};
-
-/*
-** A Context stores the last insert rowid, the last statement change count,
-** and the current statement change count (i.e. changes since last statement).
-** The current keylist is also stored in the context.
-** Elements of Context structure type make up the ContextStack, which is
-** updated by the ContextPush and ContextPop opcodes (used by triggers).
-** The context is pushed before executing a trigger a popped when the
-** trigger finishes.
-*/
-typedef struct Context Context;
-struct Context {
- i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */
- int nChange; /* Statement changes (Vdbe.nChanges) */
- Fifo sFifo; /* Records that will participate in a DELETE or UPDATE */
-};
-
-/*
** An instance of the virtual machine. This structure contains the complete
** state of the virtual machine.
**
@@ -15365,88 +17799,55 @@ struct Context {
** method function.
*/
struct Vdbe {
- sqlite3 *db; /* The whole database */
- Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
- int nOp; /* Number of instructions in the program */
- int nOpAlloc; /* Number of slots allocated for aOp[] */
- Op *aOp; /* Space to hold the virtual machine's program */
- int nLabel; /* Number of labels used */
- int nLabelAlloc; /* Number of slots allocated in aLabel[] */
- int *aLabel; /* Space to hold the labels */
- Mem **apArg; /* Arguments to currently executing user function */
- Mem *aColName; /* Column names to return */
- int nCursor; /* Number of slots in apCsr[] */
- Cursor **apCsr; /* One element of this array for each open cursor */
- int nVar; /* Number of entries in aVar[] */
- Mem *aVar; /* Values for the OP_Variable opcode. */
- char **azVar; /* Name of variables */
- int okVar; /* True if azVar[] has been initialized */
- int magic; /* Magic number for sanity checking */
+ sqlite3 *db; /* The database connection that owns this statement */
+ Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
+ int nOp; /* Number of instructions in the program */
+ int nOpAlloc; /* Number of slots allocated for aOp[] */
+ Op *aOp; /* Space to hold the virtual machine's program */
+ int nLabel; /* Number of labels used */
+ int nLabelAlloc; /* Number of slots allocated in aLabel[] */
+ int *aLabel; /* Space to hold the labels */
+ Mem **apArg; /* Arguments to currently executing user function */
+ Mem *aColName; /* Column names to return */
+ Mem *pResultSet; /* Pointer to an array of results */
+ u16 nResColumn; /* Number of columns in one row of the result set */
+ u16 nCursor; /* Number of slots in apCsr[] */
+ VdbeCursor **apCsr; /* One element of this array for each open cursor */
+ u8 errorAction; /* Recovery action to do in case of an error */
+ u8 okVar; /* True if azVar[] has been initialized */
+ u16 nVar; /* Number of entries in aVar[] */
+ Mem *aVar; /* Values for the OP_Variable opcode. */
+ char **azVar; /* Name of variables */
+ u32 magic; /* Magic number for sanity checking */
int nMem; /* Number of memory locations currently allocated */
Mem *aMem; /* The memory locations */
- int nCallback; /* Number of callbacks invoked so far */
- int cacheCtr; /* Cursor row cache generation counter */
- Fifo sFifo; /* A list of ROWIDs */
- int contextStackTop; /* Index of top element in the context stack */
- int contextStackDepth; /* The size of the "context" stack */
- Context *contextStack; /* Stack used by opcodes ContextPush & ContextPop*/
+ u32 cacheCtr; /* VdbeCursor row cache generation counter */
int pc; /* The program counter */
int rc; /* Value to return */
- unsigned uniqueCnt; /* Used by OP_MakeRecord when P2!=0 */
- int errorAction; /* Recovery action to do in case of an error */
- int inTempTrans; /* True if temp database is transactioned */
- int returnStack[25]; /* Return address stack for OP_Gosub & OP_Return */
- int returnDepth; /* Next unused element in returnStack[] */
- int nResColumn; /* Number of columns in one row of the result set */
- char **azResColumn; /* Values for one row of result */
char *zErrMsg; /* Error message written here */
- Mem *pResultSet; /* Pointer to an array of results */
u8 explain; /* True if EXPLAIN present on SQL command */
u8 changeCntOn; /* True to update the change-counter */
- u8 aborted; /* True if ROLLBACK in another VM causes an abort */
u8 expired; /* True if the VM needs to be recompiled */
u8 minWriteFileFormat; /* Minimum file format for writable database files */
u8 inVtabMethod; /* See comments above */
+ u8 usesStmtJournal; /* True if uses a statement journal */
+ u8 readOnly; /* True for read-only statements */
+ u8 isPrepareV2; /* True if prepared with prepare_v2() */
int nChange; /* Number of db changes made since last reset */
- i64 startTime; /* Time when query started - used for profiling */
int btreeMask; /* Bitmask of db->aDb[] entries referenced */
+ i64 startTime; /* Time when query started - used for profiling */
BtreeMutexArray aMutex; /* An array of Btree used here and needing locks */
- int nSql; /* Number of bytes in zSql */
- char *zSql; /* Text of the SQL statement that generated this */
+ int aCounter[2]; /* Counters used by sqlite3_stmt_status() */
+ char *zSql; /* Text of the SQL statement that generated this */
+ void *pFree; /* Free this when deleting the vdbe */
+ i64 nFkConstraint; /* Number of imm. FK constraints this VM */
+ i64 nStmtDefCons; /* Number of def. constraints when stmt started */
+ int iStatement; /* Statement number (or 0 if has not opened stmt) */
#ifdef SQLITE_DEBUG
- FILE *trace; /* Write an execution trace here, if not NULL */
-#endif
- int openedStatement; /* True if this VM has opened a statement journal */
-#ifdef SQLITE_SSE
- int fetchId; /* Statement number used by sqlite3_fetch_statement */
- int lru; /* Counter used for LRU cache replacement */
+ FILE *trace; /* Write an execution trace here, if not NULL */
#endif
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- Vdbe *pLruPrev;
- Vdbe *pLruNext;
-#endif
-};
-
-/*
-** An instance of the following structure holds information about a
-** single index record that has already been parsed out into individual
-** values.
-**
-** A record is an object that contains one or more fields of data.
-** Records are used to store the content of a table row and to store
-** the key of an index. A blob encoding of a record is created by
-** the OP_MakeRecord opcode of the VDBE and is disassemblied by the
-** OP_Column opcode.
-**
-** This structure holds a record that has already been disassembled
-** into its constitutent fields.
-*/
-struct UnpackedRecord {
- KeyInfo *pKeyInfo; /* Collation and sort-order information */
- u16 nField; /* Number of entries in apMem[] */
- u8 needFree; /* True if memory obtained from sqlite3_malloc() */
- u8 needDestroy; /* True if apMem[]s should be destroyed on close */
- Mem *aMem; /* Values */
+ VdbeFrame *pFrame; /* Parent frame */
+ int nFrame; /* Number of frames in pFrame list */
};
/*
@@ -15460,23 +17861,22 @@ struct UnpackedRecord {
/*
** Function prototypes
*/
-SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, Cursor*);
+SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
void sqliteVdbePopStack(Vdbe*,int);
-SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(Cursor*);
+SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor*);
#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*);
#endif
-SQLITE_PRIVATE int sqlite3VdbeSerialTypeLen(u32);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int);
-SQLITE_PRIVATE int sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
-SQLITE_PRIVATE int sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
+SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc*, int);
int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
-SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(Cursor*,UnpackedRecord *,int,const unsigned char*,int*);
-SQLITE_PRIVATE int sqlite3VdbeIdxRowid(BtCursor *, i64 *);
+SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*);
+SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *);
SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
-SQLITE_PRIVATE int sqlite3VdbeIdxRowidLen(const u8*);
SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*);
SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*);
SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*);
@@ -15491,8 +17891,8 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64);
SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double);
SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
+SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
-SQLITE_PRIVATE int sqlite3VdbeMemDynamicify(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, int);
SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
@@ -15507,23 +17907,31 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
SQLITE_PRIVATE const char *sqlite3OpcodeName(int);
SQLITE_PRIVATE int sqlite3VdbeOpcodeHasProperty(int, int);
SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
+SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int);
+SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*);
+SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *);
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p);
#endif
-#ifndef NDEBUG
-SQLITE_PRIVATE void sqlite3VdbeMemSanity(Mem*);
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int);
+#else
+# define sqlite3VdbeCheckFk(p,i) 0
+#endif
+
+#ifndef SQLITE_OMIT_SHARED_CACHE
+SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p);
+#else
+# define sqlite3VdbeMutexArrayEnter(p)
#endif
+
SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8);
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*);
SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf);
#endif
SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem);
-SQLITE_PRIVATE void sqlite3VdbeFifoInit(Fifo*);
-SQLITE_PRIVATE int sqlite3VdbeFifoPush(Fifo*, i64);
-SQLITE_PRIVATE int sqlite3VdbeFifoPop(Fifo*, i64*);
-SQLITE_PRIVATE void sqlite3VdbeFifoClear(Fifo*);
#ifndef SQLITE_OMIT_INCRBLOB
SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *);
@@ -15536,17 +17944,19 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *);
/************** End of vdbeInt.h *********************************************/
/************** Continuing where we left off in utf.c ************************/
+#ifndef SQLITE_AMALGAMATION
/*
** The following constant value is used by the SQLITE_BIGENDIAN and
** SQLITE_LITTLEENDIAN macros.
*/
SQLITE_PRIVATE const int sqlite3one = 1;
+#endif /* SQLITE_AMALGAMATION */
/*
** This lookup table is used to help decode the first byte of
** a multi-byte UTF8 character.
*/
-static const unsigned char sqlite3UtfTrans1[] = {
+static const unsigned char sqlite3Utf8Trans1[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
@@ -15560,67 +17970,65 @@ static const unsigned char sqlite3UtfTrans1[] = {
#define WRITE_UTF8(zOut, c) { \
if( c<0x00080 ){ \
- *zOut++ = (c&0xFF); \
+ *zOut++ = (u8)(c&0xFF); \
} \
else if( c<0x00800 ){ \
- *zOut++ = 0xC0 + ((c>>6)&0x1F); \
- *zOut++ = 0x80 + (c & 0x3F); \
+ *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \
+ *zOut++ = 0x80 + (u8)(c & 0x3F); \
} \
else if( c<0x10000 ){ \
- *zOut++ = 0xE0 + ((c>>12)&0x0F); \
- *zOut++ = 0x80 + ((c>>6) & 0x3F); \
- *zOut++ = 0x80 + (c & 0x3F); \
+ *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \
+ *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
+ *zOut++ = 0x80 + (u8)(c & 0x3F); \
}else{ \
- *zOut++ = 0xF0 + ((c>>18) & 0x07); \
- *zOut++ = 0x80 + ((c>>12) & 0x3F); \
- *zOut++ = 0x80 + ((c>>6) & 0x3F); \
- *zOut++ = 0x80 + (c & 0x3F); \
+ *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \
+ *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \
+ *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
+ *zOut++ = 0x80 + (u8)(c & 0x3F); \
} \
}
-#define WRITE_UTF16LE(zOut, c) { \
- if( c<=0xFFFF ){ \
- *zOut++ = (c&0x00FF); \
- *zOut++ = ((c>>8)&0x00FF); \
- }else{ \
- *zOut++ = (((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
- *zOut++ = (0x00D8 + (((c-0x10000)>>18)&0x03)); \
- *zOut++ = (c&0x00FF); \
- *zOut++ = (0x00DC + ((c>>8)&0x03)); \
- } \
+#define WRITE_UTF16LE(zOut, c) { \
+ if( c<=0xFFFF ){ \
+ *zOut++ = (u8)(c&0x00FF); \
+ *zOut++ = (u8)((c>>8)&0x00FF); \
+ }else{ \
+ *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
+ *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \
+ *zOut++ = (u8)(c&0x00FF); \
+ *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \
+ } \
}
-#define WRITE_UTF16BE(zOut, c) { \
- if( c<=0xFFFF ){ \
- *zOut++ = ((c>>8)&0x00FF); \
- *zOut++ = (c&0x00FF); \
- }else{ \
- *zOut++ = (0x00D8 + (((c-0x10000)>>18)&0x03)); \
- *zOut++ = (((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
- *zOut++ = (0x00DC + ((c>>8)&0x03)); \
- *zOut++ = (c&0x00FF); \
- } \
+#define WRITE_UTF16BE(zOut, c) { \
+ if( c<=0xFFFF ){ \
+ *zOut++ = (u8)((c>>8)&0x00FF); \
+ *zOut++ = (u8)(c&0x00FF); \
+ }else{ \
+ *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \
+ *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
+ *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \
+ *zOut++ = (u8)(c&0x00FF); \
+ } \
}
#define READ_UTF16LE(zIn, c){ \
c = (*zIn++); \
c += ((*zIn++)<<8); \
- if( c>=0xD800 && c<0xE000 ){ \
+ if( c>=0xD800 && c<0xE000 ){ \
int c2 = (*zIn++); \
c2 += ((*zIn++)<<8); \
c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \
- if( (c & 0xFFFF0000)==0 ) c = 0xFFFD; \
} \
}
#define READ_UTF16BE(zIn, c){ \
c = ((*zIn++)<<8); \
c += (*zIn++); \
- if( c>=0xD800 && c<0xE000 ){ \
+ if( c>=0xD800 && c<0xE000 ){ \
int c2 = ((*zIn++)<<8); \
c2 += (*zIn++); \
c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \
- if( (c & 0xFFFF0000)==0 ) c = 0xFFFD; \
} \
}
@@ -15651,27 +18059,43 @@ static const unsigned char sqlite3UtfTrans1[] = {
** for unicode values 0x80 and greater. It do not change over-length
** encodings to 0xfffd as some systems recommend.
*/
+#define READ_UTF8(zIn, zTerm, c) \
+ c = *(zIn++); \
+ if( c>=0xc0 ){ \
+ c = sqlite3Utf8Trans1[c-0xc0]; \
+ while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \
+ c = (c<<6) + (0x3f & *(zIn++)); \
+ } \
+ if( c<0x80 \
+ || (c&0xFFFFF800)==0xD800 \
+ || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \
+ }
SQLITE_PRIVATE int sqlite3Utf8Read(
- const unsigned char *z, /* First byte of UTF-8 character */
- const unsigned char *zTerm, /* Pretend this byte is 0x00 */
+ const unsigned char *zIn, /* First byte of UTF-8 character */
const unsigned char **pzNext /* Write first byte past UTF-8 char here */
){
- int c = *(z++);
+ int c;
+
+ /* Same as READ_UTF8() above but without the zTerm parameter.
+ ** For this routine, we assume the UTF8 string is always zero-terminated.
+ */
+ c = *(zIn++);
if( c>=0xc0 ){
- c = sqlite3UtfTrans1[c-0xc0];
- while( z!=zTerm && (*z & 0xc0)==0x80 ){
- c = (c<<6) + (0x3f & *(z++));
+ c = sqlite3Utf8Trans1[c-0xc0];
+ while( (*zIn & 0xc0)==0x80 ){
+ c = (c<<6) + (0x3f & *(zIn++));
}
if( c<0x80
|| (c&0xFFFFF800)==0xD800
|| (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; }
}
- *pzNext = z;
+ *pzNext = zIn;
return c;
}
+
/*
** If the TRANSLATE_TRACE macro is defined, the value of each Mem is
** printed on stderr on the way into and out of sqlite3VdbeMemTranslate().
@@ -15719,7 +18143,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
return SQLITE_NOMEM;
}
zIn = (u8*)pMem->z;
- zTerm = &zIn[pMem->n];
+ zTerm = &zIn[pMem->n&~1];
while( zIn<zTerm ){
temp = *zIn;
*zIn = *(zIn+1);
@@ -15737,6 +18161,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
** A single byte is required for the output string
** nul-terminator.
*/
+ pMem->n &= ~1;
len = pMem->n * 2 + 1;
}else{
/* When converting from UTF-8 to UTF-16 the maximum growth is caused
@@ -15765,18 +18190,20 @@ SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
if( desiredEnc==SQLITE_UTF16LE ){
/* UTF-8 -> UTF-16 Little-endian */
while( zIn<zTerm ){
- c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn);
+ /* c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn); */
+ READ_UTF8(zIn, zTerm, c);
WRITE_UTF16LE(z, c);
}
}else{
assert( desiredEnc==SQLITE_UTF16BE );
/* UTF-8 -> UTF-16 Big-endian */
while( zIn<zTerm ){
- c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn);
+ /* c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn); */
+ READ_UTF8(zIn, zTerm, c);
WRITE_UTF16BE(z, c);
}
}
- pMem->n = z - zOut;
+ pMem->n = (int)(z - zOut);
*z++ = 0;
}else{
assert( desiredEnc==SQLITE_UTF8 );
@@ -15787,13 +18214,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
WRITE_UTF8(z, c);
}
}else{
- /* UTF-16 Little-endian -> UTF-8 */
+ /* UTF-16 Big-endian -> UTF-8 */
while( zIn<zTerm ){
READ_UTF16BE(zIn, c);
WRITE_UTF8(z, c);
}
}
- pMem->n = z - zOut;
+ pMem->n = (int)(z - zOut);
}
*z = 0;
assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len );
@@ -15829,7 +18256,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){
int rc = SQLITE_OK;
u8 bom = 0;
- if( pMem->n<0 || pMem->n>1 ){
+ assert( pMem->n>=0 );
+ if( pMem->n>1 ){
u8 b1 = *(u8 *)pMem->z;
u8 b2 = *(((u8 *)pMem->z) + 1);
if( b1==0xFE && b2==0xFF ){
@@ -15895,17 +18323,16 @@ SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *zIn, int nByte){
SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char *zIn){
unsigned char *zOut = zIn;
unsigned char *zStart = zIn;
- unsigned char *zTerm;
u32 c;
while( zIn[0] ){
- c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn);
+ c = sqlite3Utf8Read(zIn, (const u8**)&zIn);
if( c!=0xfffd ){
WRITE_UTF8(zOut, c);
}
}
*zOut = 0;
- return zOut - zStart;
+ return (int)(zOut - zStart);
}
#endif
@@ -15933,15 +18360,39 @@ SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *db, const void *z, int nByte){
}
/*
-** pZ is a UTF-16 encoded unicode string. If nChar is less than zero,
-** return the number of bytes up to (but not including), the first pair
-** of consecutive 0x00 bytes in pZ. If nChar is not less than zero,
-** then return the number of bytes in the first nChar unicode characters
-** in pZ (or up until the first pair of 0x00 bytes, whichever comes first).
+** Convert a UTF-8 string to the UTF-16 encoding specified by parameter
+** enc. A pointer to the new string is returned, and the value of *pnOut
+** is set to the length of the returned string in bytes. The call should
+** arrange to call sqlite3DbFree() on the returned pointer when it is
+** no longer required.
+**
+** If a malloc failure occurs, NULL is returned and the db.mallocFailed
+** flag set.
+*/
+#ifdef SQLITE_ENABLE_STAT2
+SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *db, u8 enc, char *z, int n, int *pnOut){
+ Mem m;
+ memset(&m, 0, sizeof(m));
+ m.db = db;
+ sqlite3VdbeMemSetStr(&m, z, n, SQLITE_UTF8, SQLITE_STATIC);
+ if( sqlite3VdbeMemTranslate(&m, enc) ){
+ assert( db->mallocFailed );
+ return 0;
+ }
+ assert( m.z==m.zMalloc );
+ *pnOut = m.n;
+ return m.z;
+}
+#endif
+
+/*
+** pZ is a UTF-16 encoded unicode string at least nChar characters long.
+** Return the number of bytes in the first nChar unicode characters
+** in pZ. nChar must be non-negative.
*/
SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){
- unsigned int c = 1;
- char const *z = zIn;
+ int c;
+ unsigned char const *z = zIn;
int n = 0;
if( SQLITE_UTF16NATIVE==SQLITE_UTF16BE ){
/* Using an "if (SQLITE_UTF16NATIVE==SQLITE_UTF16BE)" construct here
@@ -15953,17 +18404,17 @@ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){
** which branch will be followed. It is therefore assumed that no runtime
** penalty is paid for this "if" statement.
*/
- while( c && ((nChar<0) || n<nChar) ){
+ while( n<nChar ){
READ_UTF16BE(z, c);
n++;
}
}else{
- while( c && ((nChar<0) || n<nChar) ){
+ while( n<nChar ){
READ_UTF16LE(z, c);
n++;
}
}
- return (z-(char const *)zIn)-((c==0)?2:0);
+ return (int)(z-(unsigned char const *)zIn);
}
#if defined(SQLITE_TEST)
@@ -15972,22 +18423,21 @@ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){
** It checks that the primitives for serializing and deserializing
** characters in each encoding are inverses of each other.
*/
-SQLITE_PRIVATE void sqlite3UtfSelfTest(){
+SQLITE_PRIVATE void sqlite3UtfSelfTest(void){
unsigned int i, t;
unsigned char zBuf[20];
unsigned char *z;
- unsigned char *zTerm;
int n;
unsigned int c;
for(i=0; i<0x00110000; i++){
z = zBuf;
WRITE_UTF8(z, i);
- n = z-zBuf;
+ n = (int)(z-zBuf);
+ assert( n>0 && n<=4 );
z[0] = 0;
- zTerm = z;
z = zBuf;
- c = sqlite3Utf8Read(z, zTerm, (const u8**)&z);
+ c = sqlite3Utf8Read(z, (const u8**)&z);
t = i;
if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD;
if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD;
@@ -15998,7 +18448,8 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(){
if( i>=0xD800 && i<0xE000 ) continue;
z = zBuf;
WRITE_UTF16LE(z, i);
- n = z-zBuf;
+ n = (int)(z-zBuf);
+ assert( n>0 && n<=4 );
z[0] = 0;
z = zBuf;
READ_UTF16LE(z, c);
@@ -16009,7 +18460,8 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(){
if( i>=0xD800 && i<0xE000 ) continue;
z = zBuf;
WRITE_UTF16BE(z, i);
- n = z-zBuf;
+ n = (int)(z-zBuf);
+ assert( n>0 && n<=4 );
z[0] = 0;
z = zBuf;
READ_UTF16BE(z, c);
@@ -16038,15 +18490,37 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(){
** This file contains functions for allocating memory, comparing
** strings, and stuff like that.
**
-** $Id: util.c,v 1.229 2008/05/13 16:41:50 drh Exp $
*/
+#ifdef SQLITE_HAVE_ISNAN
+# include <math.h>
+#endif
+/*
+** Routine needed to support the testcase() macro.
+*/
+#ifdef SQLITE_COVERAGE_TEST
+SQLITE_PRIVATE void sqlite3Coverage(int x){
+ static int dummy = 0;
+ dummy += x;
+}
+#endif
/*
-** Return true if the floating point value is Not a Number.
+** Return true if the floating point value is Not a Number (NaN).
+**
+** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN.
+** Otherwise, we have our own implementation that works on most systems.
*/
SQLITE_PRIVATE int sqlite3IsNaN(double x){
- /* This NaN test sometimes fails if compiled on GCC with -ffast-math.
+ int rc; /* The value return */
+#if !defined(SQLITE_HAVE_ISNAN)
+ /*
+ ** Systems that support the isnan() library function should probably
+ ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have
+ ** found that many systems do not have a working isnan() function so
+ ** this implementation is provided as an alternative.
+ **
+ ** This NaN test sometimes fails if compiled on GCC with -ffast-math.
** On the other hand, the use of -ffast-math comes with the following
** warning:
**
@@ -16054,9 +18528,41 @@ SQLITE_PRIVATE int sqlite3IsNaN(double x){
** -O option since it can result in incorrect output for programs
** which depend on an exact implementation of IEEE or ISO
** rules/specifications for math functions.
+ **
+ ** Under MSVC, this NaN test may fail if compiled with a floating-
+ ** point precision mode other than /fp:precise. From the MSDN
+ ** documentation:
+ **
+ ** The compiler [with /fp:precise] will properly handle comparisons
+ ** involving NaN. For example, x != x evaluates to true if x is NaN
+ ** ...
*/
+#ifdef __FAST_MATH__
+# error SQLite will not work correctly with the -ffast-math option of GCC.
+#endif
volatile double y = x;
- return x!=y;
+ volatile double z = y;
+ rc = (y!=z);
+#else /* if defined(SQLITE_HAVE_ISNAN) */
+ rc = isnan(x);
+#endif /* SQLITE_HAVE_ISNAN */
+ testcase( rc );
+ return rc;
+}
+
+/*
+** Compute a string length that is limited to what can be stored in
+** lower 30 bits of a 32-bit signed integer.
+**
+** The value returned will never be negative. Nor will it ever be greater
+** than the actual length of the string. For very long strings (greater
+** than 1GiB) the value returned might be less than the true string length.
+*/
+SQLITE_PRIVATE int sqlite3Strlen30(const char *z){
+ const char *z2 = z;
+ if( z==0 ) return 0;
+ while( *z2 ){ z2++; }
+ return 0x3fffffff & (int)(z2 - z);
}
/*
@@ -16089,7 +18595,7 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat,
va_start(ap, zFormat);
z = sqlite3VMPrintf(db, zFormat, ap);
va_end(ap);
- sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, sqlite3_free);
+ sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC);
}else{
sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC);
}
@@ -16115,21 +18621,20 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat,
*/
SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
va_list ap;
+ sqlite3 *db = pParse->db;
pParse->nErr++;
- sqlite3_free(pParse->zErrMsg);
+ sqlite3DbFree(db, pParse->zErrMsg);
va_start(ap, zFormat);
- pParse->zErrMsg = sqlite3VMPrintf(pParse->db, zFormat, ap);
+ pParse->zErrMsg = sqlite3VMPrintf(db, zFormat, ap);
va_end(ap);
- if( pParse->rc==SQLITE_OK ){
- pParse->rc = SQLITE_ERROR;
- }
+ pParse->rc = SQLITE_ERROR;
}
/*
** Clear the error message in pParse, if any
*/
SQLITE_PRIVATE void sqlite3ErrorClear(Parse *pParse){
- sqlite3_free(pParse->zErrMsg);
+ sqlite3DbFree(pParse->db, pParse->zErrMsg);
pParse->zErrMsg = 0;
pParse->nErr = 0;
}
@@ -16140,77 +18645,46 @@ SQLITE_PRIVATE void sqlite3ErrorClear(Parse *pParse){
** input does not begin with a quote character, then this routine
** is a no-op.
**
+** The input string must be zero-terminated. A new zero-terminator
+** is added to the dequoted string.
+**
+** The return value is -1 if no dequoting occurs or the length of the
+** dequoted string, exclusive of the zero terminator, if dequoting does
+** occur.
+**
** 2002-Feb-14: This routine is extended to remove MS-Access style
** brackets from around identifers. For example: "[a-b-c]" becomes
** "a-b-c".
*/
-SQLITE_PRIVATE void sqlite3Dequote(char *z){
- int quote;
+SQLITE_PRIVATE int sqlite3Dequote(char *z){
+ char quote;
int i, j;
- if( z==0 ) return;
+ if( z==0 ) return -1;
quote = z[0];
switch( quote ){
case '\'': break;
case '"': break;
case '`': break; /* For MySQL compatibility */
case '[': quote = ']'; break; /* For MS SqlServer compatibility */
- default: return;
+ default: return -1;
}
- for(i=1, j=0; z[i]; i++){
+ for(i=1, j=0; ALWAYS(z[i]); i++){
if( z[i]==quote ){
if( z[i+1]==quote ){
z[j++] = quote;
i++;
}else{
- z[j++] = 0;
break;
}
}else{
z[j++] = z[i];
}
}
+ z[j] = 0;
+ return j;
}
-/* An array to map all upper-case characters into their corresponding
-** lower-case character.
-*/
-SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = {
-#ifdef SQLITE_ASCII
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
- 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
- 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
- 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
- 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
- 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
- 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
- 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
- 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
- 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
- 252,253,254,255
-#endif
-#ifdef SQLITE_EBCDIC
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */
- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */
- 96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */
- 112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */
- 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */
- 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */
- 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */
- 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */
- 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */
- 224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */
- 239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */
-#endif
-};
+/* Convenient short-hand */
#define UpperToLower sqlite3UpperToLower
/*
@@ -16224,7 +18698,7 @@ SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){
while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
return UpperToLower[*a] - UpperToLower[*b];
}
-SQLITE_PRIVATE int sqlite3StrNICmp(const char *zLeft, const char *zRight, int N){
+SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){
register unsigned char *a, *b;
a = (unsigned char *)zLeft;
b = (unsigned char *)zRight;
@@ -16233,10 +18707,15 @@ SQLITE_PRIVATE int sqlite3StrNICmp(const char *zLeft, const char *zRight, int N)
}
/*
-** Return TRUE if z is a pure numeric string. Return FALSE if the
-** string contains any character which is not part of a number. If
-** the string is numeric and contains the '.' character, set *realnum
-** to TRUE (otherwise FALSE).
+** Return TRUE if z is a pure numeric string. Return FALSE and leave
+** *realnum unchanged if the string contains any character which is not
+** part of a number.
+**
+** If the string is pure numeric, set *realnum to TRUE if the string
+** contains the '.' character or an "E+000" style exponentiation suffix.
+** Otherwise set *realnum to FALSE. Note that just becaue *realnum is
+** false does not mean that the number can be successfully converted into
+** an integer - it might be too big.
**
** An empty string is considered non-numeric.
*/
@@ -16244,30 +18723,30 @@ SQLITE_PRIVATE int sqlite3IsNumber(const char *z, int *realnum, u8 enc){
int incr = (enc==SQLITE_UTF8?1:2);
if( enc==SQLITE_UTF16BE ) z++;
if( *z=='-' || *z=='+' ) z += incr;
- if( !isdigit(*(u8*)z) ){
+ if( !sqlite3Isdigit(*z) ){
return 0;
}
z += incr;
- if( realnum ) *realnum = 0;
- while( isdigit(*(u8*)z) ){ z += incr; }
+ *realnum = 0;
+ while( sqlite3Isdigit(*z) ){ z += incr; }
if( *z=='.' ){
z += incr;
- if( !isdigit(*(u8*)z) ) return 0;
- while( isdigit(*(u8*)z) ){ z += incr; }
- if( realnum ) *realnum = 1;
+ if( !sqlite3Isdigit(*z) ) return 0;
+ while( sqlite3Isdigit(*z) ){ z += incr; }
+ *realnum = 1;
}
if( *z=='e' || *z=='E' ){
z += incr;
if( *z=='+' || *z=='-' ) z += incr;
- if( !isdigit(*(u8*)z) ) return 0;
- while( isdigit(*(u8*)z) ){ z += incr; }
- if( realnum ) *realnum = 1;
+ if( !sqlite3Isdigit(*z) ) return 0;
+ while( sqlite3Isdigit(*z) ){ z += incr; }
+ *realnum = 1;
}
return *z==0;
}
/*
-** The string z[] is an ascii representation of a real number.
+** The string z[] is an ASCII representation of a real number.
** Convert this string to a double.
**
** This routine assumes that z[] really is a valid number. If it
@@ -16280,71 +18759,127 @@ SQLITE_PRIVATE int sqlite3IsNumber(const char *z, int *realnum, u8 enc){
*/
SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult){
#ifndef SQLITE_OMIT_FLOATING_POINT
- int sign = 1;
const char *zBegin = z;
- LONGDOUBLE_TYPE v1 = 0.0;
- int nSignificant = 0;
- while( isspace(*(u8*)z) ) z++;
+ /* sign * significand * (10 ^ (esign * exponent)) */
+ int sign = 1; /* sign of significand */
+ i64 s = 0; /* significand */
+ int d = 0; /* adjust exponent for shifting decimal point */
+ int esign = 1; /* sign of exponent */
+ int e = 0; /* exponent */
+ double result;
+ int nDigits = 0;
+
+ /* skip leading spaces */
+ while( sqlite3Isspace(*z) ) z++;
+ /* get sign of significand */
if( *z=='-' ){
sign = -1;
z++;
}else if( *z=='+' ){
z++;
}
- while( z[0]=='0' ){
- z++;
- }
- while( isdigit(*(u8*)z) ){
- v1 = v1*10.0 + (*z - '0');
- z++;
- nSignificant++;
+ /* skip leading zeroes */
+ while( z[0]=='0' ) z++, nDigits++;
+
+ /* copy max significant digits to significand */
+ while( sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
+ s = s*10 + (*z - '0');
+ z++, nDigits++;
}
+ /* skip non-significant significand digits
+ ** (increase exponent by d to shift decimal left) */
+ while( sqlite3Isdigit(*z) ) z++, nDigits++, d++;
+
+ /* if decimal point is present */
if( *z=='.' ){
- LONGDOUBLE_TYPE divisor = 1.0;
z++;
- if( nSignificant==0 ){
- while( z[0]=='0' ){
- divisor *= 10.0;
- z++;
- }
- }
- while( isdigit(*(u8*)z) ){
- if( nSignificant<18 ){
- v1 = v1*10.0 + (*z - '0');
- divisor *= 10.0;
- nSignificant++;
- }
- z++;
+ /* copy digits from after decimal to significand
+ ** (decrease exponent by d to shift decimal right) */
+ while( sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
+ s = s*10 + (*z - '0');
+ z++, nDigits++, d--;
}
- v1 /= divisor;
+ /* skip non-significant digits */
+ while( sqlite3Isdigit(*z) ) z++, nDigits++;
}
+
+ /* if exponent is present */
if( *z=='e' || *z=='E' ){
- int esign = 1;
- int eval = 0;
- LONGDOUBLE_TYPE scale = 1.0;
z++;
+ /* get sign of exponent */
if( *z=='-' ){
esign = -1;
z++;
}else if( *z=='+' ){
z++;
}
- while( isdigit(*(u8*)z) ){
- eval = eval*10 + *z - '0';
+ /* copy digits to exponent */
+ while( sqlite3Isdigit(*z) ){
+ e = e*10 + (*z - '0');
z++;
}
- while( eval>=64 ){ scale *= 1.0e+64; eval -= 64; }
- while( eval>=16 ){ scale *= 1.0e+16; eval -= 16; }
- while( eval>=4 ){ scale *= 1.0e+4; eval -= 4; }
- while( eval>=1 ){ scale *= 1.0e+1; eval -= 1; }
- if( esign<0 ){
- v1 /= scale;
+ }
+
+ /* adjust exponent by d, and update sign */
+ e = (e*esign) + d;
+ if( e<0 ) {
+ esign = -1;
+ e *= -1;
+ } else {
+ esign = 1;
+ }
+
+ /* if 0 significand */
+ if( !s ) {
+ /* In the IEEE 754 standard, zero is signed.
+ ** Add the sign if we've seen at least one digit */
+ result = (sign<0 && nDigits) ? -(double)0 : (double)0;
+ } else {
+ /* attempt to reduce exponent */
+ if( esign>0 ){
+ while( s<(LARGEST_INT64/10) && e>0 ) e--,s*=10;
}else{
- v1 *= scale;
+ while( !(s%10) && e>0 ) e--,s/=10;
+ }
+
+ /* adjust the sign of significand */
+ s = sign<0 ? -s : s;
+
+ /* if exponent, scale significand as appropriate
+ ** and store in result. */
+ if( e ){
+ double scale = 1.0;
+ /* attempt to handle extremely small/large numbers better */
+ if( e>307 && e<342 ){
+ while( e%308 ) { scale *= 1.0e+1; e -= 1; }
+ if( esign<0 ){
+ result = s / scale;
+ result /= 1.0e+308;
+ }else{
+ result = s * scale;
+ result *= 1.0e+308;
+ }
+ }else{
+ /* 1.0e+22 is the largest power of 10 than can be
+ ** represented exactly. */
+ while( e%22 ) { scale *= 1.0e+1; e -= 1; }
+ while( e>0 ) { scale *= 1.0e+22; e -= 22; }
+ if( esign<0 ){
+ result = s / scale;
+ }else{
+ result = s * scale;
+ }
+ }
+ } else {
+ result = (double)s;
}
}
- *pResult = sign<0 ? -v1 : v1;
- return z - zBegin;
+
+ /* store the result */
+ *pResult = result;
+
+ /* return number of characters used */
+ return (int)(z - zBegin);
#else
return sqlite3Atoi64(z, pResult);
#endif /* SQLITE_OMIT_FLOATING_POINT */
@@ -16365,7 +18900,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult){
*/
static int compare2pow63(const char *zNum){
int c;
- c = memcmp(zNum,"922337203685477580",18);
+ c = memcmp(zNum,"922337203685477580",18)*10;
if( c==0 ){
c = zNum[18] - '8';
}
@@ -16387,7 +18922,8 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum){
i64 v = 0;
int neg;
int i, c;
- while( isspace(*(u8*)zNum) ) zNum++;
+ const char *zStart;
+ while( sqlite3Isspace(*zNum) ) zNum++;
if( *zNum=='-' ){
neg = 1;
zNum++;
@@ -16397,12 +18933,13 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum){
}else{
neg = 0;
}
+ zStart = zNum;
while( zNum[0]=='0' ){ zNum++; } /* Skip over leading zeros. Ticket #2454 */
for(i=0; (c=zNum[i])>='0' && c<='9'; i++){
v = v*10 + c - '0';
}
*pNum = neg ? -v : v;
- if( c!=0 || i==0 || i>19 ){
+ if( c!=0 || (i==0 && zStart==zNum) || i>19 ){
/* zNum is empty or contains non-numeric text or is longer
** than 19 digits (thus guaranting that it is too large) */
return 0;
@@ -16418,30 +18955,33 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum){
}
/*
-** The string zNum represents an integer. There might be some other
-** information following the integer too, but that part is ignored.
-** If the integer that the prefix of zNum represents will fit in a
+** The string zNum represents an unsigned integer. The zNum string
+** consists of one or more digit characters and is terminated by
+** a zero character. Any stray characters in zNum result in undefined
+** behavior.
+**
+** If the unsigned integer that zNum represents will fit in a
** 64-bit signed integer, return TRUE. Otherwise return FALSE.
**
-** This routine returns FALSE for the string -9223372036854775808 even that
-** that number will, in theory fit in a 64-bit integer. Positive
-** 9223373036854775808 will not fit in 64 bits. So it seems safer to return
-** false.
+** If the negFlag parameter is true, that means that zNum really represents
+** a negative number. (The leading "-" is omitted from zNum.) This
+** parameter is needed to determine a boundary case. A string
+** of "9223373036854775808" returns false if negFlag is false or true
+** if negFlag is true.
+**
+** Leading zeros are ignored.
*/
SQLITE_PRIVATE int sqlite3FitsIn64Bits(const char *zNum, int negFlag){
- int i, c;
+ int i;
int neg = 0;
- if( *zNum=='-' ){
- neg = 1;
- zNum++;
- }else if( *zNum=='+' ){
- zNum++;
- }
+
+ assert( zNum[0]>='0' && zNum[0]<='9' ); /* zNum is an unsigned number */
+
if( negFlag ) neg = 1-neg;
while( *zNum=='0' ){
zNum++; /* Skip leading zeros. Ticket #2454 */
}
- for(i=0; (c=zNum[i])>='0' && c<='9'; i++){}
+ for(i=0; zNum[i]; i++){ assert( zNum[i]>='0' && zNum[i]<='9' ); }
if( i<19 ){
/* Guaranteed to fit if less than 19 digits */
return 1;
@@ -16528,17 +19068,17 @@ SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){
int i, j, n;
u8 buf[10];
if( v & (((u64)0xff000000)<<32) ){
- p[8] = v;
+ p[8] = (u8)v;
v >>= 8;
for(i=7; i>=0; i--){
- p[i] = (v & 0x7f) | 0x80;
+ p[i] = (u8)((v & 0x7f) | 0x80);
v >>= 7;
}
return 9;
}
n = 0;
do{
- buf[n++] = (v & 0x7f) | 0x80;
+ buf[n++] = (u8)((v & 0x7f) | 0x80);
v >>= 7;
}while( v!=0 );
buf[0] &= 0x7f;
@@ -16565,8 +19105,8 @@ SQLITE_PRIVATE int sqlite3PutVarint32(unsigned char *p, u32 v){
}
#endif
if( (v & ~0x3fff)==0 ){
- p[0] = (v>>7) | 0x80;
- p[1] = v & 0x7f;
+ p[0] = (u8)((v>>7) | 0x80);
+ p[1] = (u8)(v & 0x7f);
return 2;
}
return sqlite3PutVarint(p, v);
@@ -16576,11 +19116,11 @@ SQLITE_PRIVATE int sqlite3PutVarint32(unsigned char *p, u32 v){
** Read a 64-bit variable-length integer from memory starting at p[0].
** Return the number of bytes read. The value is stored in *v.
*/
-SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
+SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){
u32 a,b,s;
a = *p;
- /* a: p0 (unmasked)*/
+ /* a: p0 (unmasked) */
if (!(a&0x80))
{
*v = a;
@@ -16589,7 +19129,7 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
p++;
b = *p;
- /* b: p1 (unmasked)*/
+ /* b: p1 (unmasked) */
if (!(b&0x80))
{
a &= 0x7f;
@@ -16602,7 +19142,7 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
p++;
a = a<<14;
a |= *p;
- /* a: p0<<14 | p2 (unmasked)*/
+ /* a: p0<<14 | p2 (unmasked) */
if (!(a&0x80))
{
a &= (0x7f<<14)|(0x7f);
@@ -16613,41 +19153,41 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
return 3;
}
- /* CSE1 from below*/
+ /* CSE1 from below */
a &= (0x7f<<14)|(0x7f);
p++;
b = b<<14;
b |= *p;
- /* b: p1<<14 | p3 (unmasked)*/
+ /* b: p1<<14 | p3 (unmasked) */
if (!(b&0x80))
{
b &= (0x7f<<14)|(0x7f);
- /* moved CSE1 up*/
- /* a &= (0x7f<<14)|(0x7f);*/
+ /* moved CSE1 up */
+ /* a &= (0x7f<<14)|(0x7f); */
a = a<<7;
a |= b;
*v = a;
return 4;
}
- /* a: p0<<14 | p2 (masked)*/
- /* b: p1<<14 | p3 (unmasked)*/
- /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked)*/
- /* moved CSE1 up*/
- /* a &= (0x7f<<14)|(0x7f);*/
+ /* a: p0<<14 | p2 (masked) */
+ /* b: p1<<14 | p3 (unmasked) */
+ /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
+ /* moved CSE1 up */
+ /* a &= (0x7f<<14)|(0x7f); */
b &= (0x7f<<14)|(0x7f);
s = a;
- /* s: p0<<14 | p2 (masked)*/
+ /* s: p0<<14 | p2 (masked) */
p++;
a = a<<14;
a |= *p;
- /* a: p0<<28 | p2<<14 | p4 (unmasked)*/
+ /* a: p0<<28 | p2<<14 | p4 (unmasked) */
if (!(a&0x80))
{
- /* we can skip these cause they were (effectively) done above in calc'ing s*/
- /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f);*/
- /* b &= (0x7f<<14)|(0x7f);*/
+ /* we can skip these cause they were (effectively) done above in calc'ing s */
+ /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
+ /* b &= (0x7f<<14)|(0x7f); */
b = b<<7;
a |= b;
s = s>>18;
@@ -16655,19 +19195,19 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
return 5;
}
- /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked)*/
+ /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
s = s<<7;
s |= b;
- /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked)*/
+ /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
p++;
b = b<<14;
b |= *p;
- /* b: p1<<28 | p3<<14 | p5 (unmasked)*/
+ /* b: p1<<28 | p3<<14 | p5 (unmasked) */
if (!(b&0x80))
{
- /* we can skip this cause it was (effectively) done above in calc'ing s*/
- /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f);*/
+ /* we can skip this cause it was (effectively) done above in calc'ing s */
+ /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
a &= (0x7f<<14)|(0x7f);
a = a<<7;
a |= b;
@@ -16679,10 +19219,10 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
p++;
a = a<<14;
a |= *p;
- /* a: p2<<28 | p4<<14 | p6 (unmasked)*/
+ /* a: p2<<28 | p4<<14 | p6 (unmasked) */
if (!(a&0x80))
{
- a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
+ a &= (0x1f<<28)|(0x7f<<14)|(0x7f);
b &= (0x7f<<14)|(0x7f);
b = b<<7;
a |= b;
@@ -16691,17 +19231,17 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
return 7;
}
- /* CSE2 from below*/
+ /* CSE2 from below */
a &= (0x7f<<14)|(0x7f);
p++;
b = b<<14;
b |= *p;
- /* b: p3<<28 | p5<<14 | p7 (unmasked)*/
+ /* b: p3<<28 | p5<<14 | p7 (unmasked) */
if (!(b&0x80))
{
- b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
- /* moved CSE2 up*/
- /* a &= (0x7f<<14)|(0x7f);*/
+ b &= (0x1f<<28)|(0x7f<<14)|(0x7f);
+ /* moved CSE2 up */
+ /* a &= (0x7f<<14)|(0x7f); */
a = a<<7;
a |= b;
s = s>>4;
@@ -16712,10 +19252,10 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
p++;
a = a<<15;
a |= *p;
- /* a: p4<<29 | p6<<15 | p8 (unmasked)*/
+ /* a: p4<<29 | p6<<15 | p8 (unmasked) */
- /* moved CSE2 up*/
- /* a &= (0x7f<<29)|(0x7f<<15)|(0xff);*/
+ /* moved CSE2 up */
+ /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
b &= (0x7f<<14)|(0x7f);
b = b<<8;
a |= b;
@@ -16734,40 +19274,51 @@ SQLITE_PRIVATE int sqlite3GetVarint(const unsigned char *p, u64 *v){
/*
** Read a 32-bit variable-length integer from memory starting at p[0].
** Return the number of bytes read. The value is stored in *v.
+**
+** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned
+** integer, then set *v to 0xffffffff.
+**
** A MACRO version, getVarint32, is provided which inlines the
** single-byte case. All code should use the MACRO version as
** this function assumes the single-byte case has already been handled.
*/
-SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *p, u32 *v){
+SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){
u32 a,b;
+ /* The 1-byte case. Overwhelmingly the most common. Handled inline
+ ** by the getVarin32() macro */
a = *p;
- /* a: p0 (unmasked)*/
+ /* a: p0 (unmasked) */
#ifndef getVarint32
if (!(a&0x80))
{
+ /* Values between 0 and 127 */
*v = a;
return 1;
}
#endif
+ /* The 2-byte case */
p++;
b = *p;
- /* b: p1 (unmasked)*/
+ /* b: p1 (unmasked) */
if (!(b&0x80))
{
+ /* Values between 128 and 16383 */
a &= 0x7f;
a = a<<7;
*v = a | b;
return 2;
}
+ /* The 3-byte case */
p++;
a = a<<14;
a |= *p;
- /* a: p0<<14 | p2 (unmasked)*/
+ /* a: p0<<14 | p2 (unmasked) */
if (!(a&0x80))
{
+ /* Values between 16384 and 2097151 */
a &= (0x7f<<14)|(0x7f);
b &= 0x7f;
b = b<<7;
@@ -16775,12 +19326,43 @@ SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *p, u32 *v){
return 3;
}
+ /* A 32-bit varint is used to store size information in btrees.
+ ** Objects are rarely larger than 2MiB limit of a 3-byte varint.
+ ** A 3-byte varint is sufficient, for example, to record the size
+ ** of a 1048569-byte BLOB or string.
+ **
+ ** We only unroll the first 1-, 2-, and 3- byte cases. The very
+ ** rare larger cases can be handled by the slower 64-bit varint
+ ** routine.
+ */
+#if 1
+ {
+ u64 v64;
+ u8 n;
+
+ p -= 2;
+ n = sqlite3GetVarint(p, &v64);
+ assert( n>3 && n<=9 );
+ if( (v64 & SQLITE_MAX_U32)!=v64 ){
+ *v = 0xffffffff;
+ }else{
+ *v = (u32)v64;
+ }
+ return n;
+ }
+
+#else
+ /* For following code (kept for historical record only) shows an
+ ** unrolling for the 3- and 4-byte varint cases. This code is
+ ** slightly faster, but it is also larger and much harder to test.
+ */
p++;
b = b<<14;
b |= *p;
- /* b: p1<<14 | p3 (unmasked)*/
+ /* b: p1<<14 | p3 (unmasked) */
if (!(b&0x80))
{
+ /* Values between 2097152 and 268435455 */
b &= (0x7f<<14)|(0x7f);
a &= (0x7f<<14)|(0x7f);
a = a<<7;
@@ -16791,11 +19373,12 @@ SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *p, u32 *v){
p++;
a = a<<14;
a |= *p;
- /* a: p0<<28 | p2<<14 | p4 (unmasked)*/
+ /* a: p0<<28 | p2<<14 | p4 (unmasked) */
if (!(a&0x80))
{
- a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
- b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
+ /* Walues between 268435456 and 34359738367 */
+ a &= (0x1f<<28)|(0x7f<<14)|(0x7f);
+ b &= (0x1f<<28)|(0x7f<<14)|(0x7f);
b = b<<7;
*v = a | b;
return 5;
@@ -16807,7 +19390,7 @@ SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *p, u32 *v){
** value. */
{
u64 v64;
- int n;
+ u8 n;
p -= 4;
n = sqlite3GetVarint(p, &v64);
@@ -16815,6 +19398,7 @@ SQLITE_PRIVATE int sqlite3GetVarint32(const unsigned char *p, u32 *v){
*v = (u32)v64;
return n;
}
+#endif
}
/*
@@ -16826,7 +19410,7 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v){
do{
i++;
v >>= 7;
- }while( v!=0 && i<9 );
+ }while( v!=0 && ALWAYS(i<9) );
return i;
}
@@ -16838,10 +19422,10 @@ SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){
return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
}
SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){
- p[0] = v>>24;
- p[1] = v>>16;
- p[2] = v>>8;
- p[3] = v;
+ p[0] = (u8)(v>>24);
+ p[1] = (u8)(v>>16);
+ p[2] = (u8)(v>>8);
+ p[3] = (u8)v;
}
@@ -16849,10 +19433,10 @@ SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){
#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC)
/*
** Translate a single byte of Hex into an integer.
-** This routinen only works if h really is a valid hexadecimal
+** This routine only works if h really is a valid hexadecimal
** character: 0..9a..fA..F
*/
-static int hexToInt(int h){
+static u8 hexToInt(int h){
assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') );
#ifdef SQLITE_ASCII
h += 9*(1&(h>>6));
@@ -16860,7 +19444,7 @@ static int hexToInt(int h){
#ifdef SQLITE_EBCDIC
h += 9*(1&~(h>>4));
#endif
- return h & 0xf;
+ return (u8)(h & 0xf);
}
#endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC */
@@ -16961,16 +19545,21 @@ SQLITE_PRIVATE int sqlite3SafetyOff(sqlite3 *db){
** used as an argument to sqlite3_errmsg() or sqlite3_close().
*/
SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3 *db){
- int magic;
+ u32 magic;
if( db==0 ) return 0;
magic = db->magic;
- if( magic!=SQLITE_MAGIC_OPEN &&
- magic!=SQLITE_MAGIC_BUSY ) return 0;
- return 1;
+ if( magic!=SQLITE_MAGIC_OPEN
+#ifdef SQLITE_DEBUG
+ && magic!=SQLITE_MAGIC_BUSY
+#endif
+ ){
+ return 0;
+ }else{
+ return 1;
+ }
}
SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
- int magic;
- if( db==0 ) return 0;
+ u32 magic;
magic = db->magic;
if( magic!=SQLITE_MAGIC_SICK &&
magic!=SQLITE_MAGIC_OPEN &&
@@ -16994,29 +19583,16 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
** This is the implementation of generic hash-tables
** used in SQLite.
**
-** $Id: hash.c,v 1.28 2008/05/13 13:27:34 drh Exp $
+** $Id: hash.c,v 1.38 2009/05/09 23:29:12 drh Exp $
*/
/* Turn bulk memory into a hash table object by initializing the
** fields of the Hash structure.
**
** "pNew" is a pointer to the hash table that is to be initialized.
-** keyClass is one of the constants SQLITE_HASH_INT, SQLITE_HASH_POINTER,
-** SQLITE_HASH_BINARY, or SQLITE_HASH_STRING. The value of keyClass
-** determines what kind of key the hash table will use. "copyKey" is
-** true if the hash table should make its own private copy of keys and
-** false if it should just use the supplied pointer. CopyKey only makes
-** sense for SQLITE_HASH_STRING and SQLITE_HASH_BINARY and is ignored
-** for other key classes.
*/
-SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew, int keyClass, int copyKey){
+SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){
assert( pNew!=0 );
- assert( keyClass>=SQLITE_HASH_STRING && keyClass<=SQLITE_HASH_BINARY );
- pNew->keyClass = keyClass;
-#if 0
- if( keyClass==SQLITE_HASH_POINTER || keyClass==SQLITE_HASH_INT ) copyKey = 0;
-#endif
- pNew->copyKey = copyKey;
pNew->first = 0;
pNew->count = 0;
pNew->htsize = 0;
@@ -17038,135 +19614,28 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){
pH->htsize = 0;
while( elem ){
HashElem *next_elem = elem->next;
- if( pH->copyKey && elem->pKey ){
- sqlite3_free(elem->pKey);
- }
sqlite3_free(elem);
elem = next_elem;
}
pH->count = 0;
}
-#if 0 /* NOT USED */
-/*
-** Hash and comparison functions when the mode is SQLITE_HASH_INT
-*/
-static int intHash(const void *pKey, int nKey){
- return nKey ^ (nKey<<8) ^ (nKey>>8);
-}
-static int intCompare(const void *pKey1, int n1, const void *pKey2, int n2){
- return n2 - n1;
-}
-#endif
-
-#if 0 /* NOT USED */
/*
-** Hash and comparison functions when the mode is SQLITE_HASH_POINTER
+** The hashing function.
*/
-static int ptrHash(const void *pKey, int nKey){
- uptr x = Addr(pKey);
- return x ^ (x<<8) ^ (x>>8);
-}
-static int ptrCompare(const void *pKey1, int n1, const void *pKey2, int n2){
- if( pKey1==pKey2 ) return 0;
- if( pKey1<pKey2 ) return -1;
- return 1;
-}
-#endif
-
-/*
-** Hash and comparison functions when the mode is SQLITE_HASH_STRING
-*/
-static int strHash(const void *pKey, int nKey){
- const char *z = (const char *)pKey;
+static unsigned int strHash(const char *z, int nKey){
int h = 0;
- if( nKey<=0 ) nKey = strlen(z);
+ assert( nKey>=0 );
while( nKey > 0 ){
h = (h<<3) ^ h ^ sqlite3UpperToLower[(unsigned char)*z++];
nKey--;
}
- return h & 0x7fffffff;
-}
-static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){
- if( n1!=n2 ) return 1;
- return sqlite3StrNICmp((const char*)pKey1,(const char*)pKey2,n1);
-}
-
-/*
-** Hash and comparison functions when the mode is SQLITE_HASH_BINARY
-*/
-static int binHash(const void *pKey, int nKey){
- int h = 0;
- const char *z = (const char *)pKey;
- while( nKey-- > 0 ){
- h = (h<<3) ^ h ^ *(z++);
- }
- return h & 0x7fffffff;
-}
-static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){
- if( n1!=n2 ) return 1;
- return memcmp(pKey1,pKey2,n1);
-}
-
-/*
-** Return a pointer to the appropriate hash function given the key class.
-**
-** The C syntax in this function definition may be unfamilar to some
-** programmers, so we provide the following additional explanation:
-**
-** The name of the function is "hashFunction". The function takes a
-** single parameter "keyClass". The return value of hashFunction()
-** is a pointer to another function. Specifically, the return value
-** of hashFunction() is a pointer to a function that takes two parameters
-** with types "const void*" and "int" and returns an "int".
-*/
-static int (*hashFunction(int keyClass))(const void*,int){
-#if 0 /* HASH_INT and HASH_POINTER are never used */
- switch( keyClass ){
- case SQLITE_HASH_INT: return &intHash;
- case SQLITE_HASH_POINTER: return &ptrHash;
- case SQLITE_HASH_STRING: return &strHash;
- case SQLITE_HASH_BINARY: return &binHash;;
- default: break;
- }
- return 0;
-#else
- if( keyClass==SQLITE_HASH_STRING ){
- return &strHash;
- }else{
- assert( keyClass==SQLITE_HASH_BINARY );
- return &binHash;
- }
-#endif
+ return h;
}
-/*
-** Return a pointer to the appropriate hash function given the key class.
-**
-** For help in interpreted the obscure C code in the function definition,
-** see the header comment on the previous function.
-*/
-static int (*compareFunction(int keyClass))(const void*,int,const void*,int){
-#if 0 /* HASH_INT and HASH_POINTER are never used */
- switch( keyClass ){
- case SQLITE_HASH_INT: return &intCompare;
- case SQLITE_HASH_POINTER: return &ptrCompare;
- case SQLITE_HASH_STRING: return &strCompare;
- case SQLITE_HASH_BINARY: return &binCompare;
- default: break;
- }
- return 0;
-#else
- if( keyClass==SQLITE_HASH_STRING ){
- return &strCompare;
- }else{
- assert( keyClass==SQLITE_HASH_BINARY );
- return &binCompare;
- }
-#endif
-}
-/* Link an element into the hash table
+/* Link pNew element into the hash table pH. If pEntry!=0 then also
+** insert pNew into the pEntry hash bucket.
*/
static void insertElement(
Hash *pH, /* The complete hash table */
@@ -17174,7 +19643,13 @@ static void insertElement(
HashElem *pNew /* The element to be inserted */
){
HashElem *pHead; /* First element already in pEntry */
- pHead = pEntry->chain;
+ if( pEntry ){
+ pHead = pEntry->count ? pEntry->chain : 0;
+ pEntry->count++;
+ pEntry->chain = pNew;
+ }else{
+ pHead = 0;
+ }
if( pHead ){
pNew->next = pHead;
pNew->prev = pHead->prev;
@@ -17187,46 +19662,45 @@ static void insertElement(
pNew->prev = 0;
pH->first = pNew;
}
- pEntry->count++;
- pEntry->chain = pNew;
}
/* Resize the hash table so that it cantains "new_size" buckets.
-** "new_size" must be a power of 2. The hash table might fail
-** to resize if sqlite3_malloc() fails.
+**
+** The hash table might fail to resize if sqlite3_malloc() fails or
+** if the new size is the same as the prior size.
+** Return TRUE if the resize occurs and false if not.
*/
-static void rehash(Hash *pH, int new_size){
+static int rehash(Hash *pH, unsigned int new_size){
struct _ht *new_ht; /* The new hash table */
HashElem *elem, *next_elem; /* For looping over existing elements */
- int (*xHash)(const void*,int); /* The hash function */
-#ifdef SQLITE_MALLOC_SOFT_LIMIT
+#if SQLITE_MALLOC_SOFT_LIMIT>0
if( new_size*sizeof(struct _ht)>SQLITE_MALLOC_SOFT_LIMIT ){
new_size = SQLITE_MALLOC_SOFT_LIMIT/sizeof(struct _ht);
}
- if( new_size==pH->htsize ) return;
+ if( new_size==pH->htsize ) return 0;
#endif
- /* There is a call to sqlite3_malloc() inside rehash(). If there is
- ** already an allocation at pH->ht, then if this malloc() fails it
- ** is benign (since failing to resize a hash table is a performance
- ** hit only, not a fatal error).
+ /* The inability to allocates space for a larger hash table is
+ ** a performance hit but it is not a fatal error. So mark the
+ ** allocation as a benign.
*/
- if( pH->htsize>0 ) sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC);
- new_ht = (struct _ht *)sqlite3MallocZero( new_size*sizeof(struct _ht) );
- if( pH->htsize>0 ) sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC);
+ sqlite3BeginBenignMalloc();
+ new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) );
+ sqlite3EndBenignMalloc();
- if( new_ht==0 ) return;
+ if( new_ht==0 ) return 0;
sqlite3_free(pH->ht);
pH->ht = new_ht;
- pH->htsize = new_size;
- xHash = hashFunction(pH->keyClass);
+ pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht);
+ memset(new_ht, 0, new_size*sizeof(struct _ht));
for(elem=pH->first, pH->first=0; elem; elem = next_elem){
- int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1);
+ unsigned int h = strHash(elem->pKey, elem->nKey) % new_size;
next_elem = elem->next;
insertElement(pH, &new_ht[h], elem);
}
+ return 1;
}
/* This function (for internal use only) locates an element in an
@@ -17235,25 +19709,26 @@ static void rehash(Hash *pH, int new_size){
*/
static HashElem *findElementGivenHash(
const Hash *pH, /* The pH to be searched */
- const void *pKey, /* The key we are searching for */
- int nKey,
- int h /* The hash for this key. */
+ const char *pKey, /* The key we are searching for */
+ int nKey, /* Bytes in key (not counting zero terminator) */
+ unsigned int h /* The hash for this key. */
){
HashElem *elem; /* Used to loop thru the element list */
int count; /* Number of elements left to test */
- int (*xCompare)(const void*,int,const void*,int); /* comparison function */
if( pH->ht ){
struct _ht *pEntry = &pH->ht[h];
elem = pEntry->chain;
count = pEntry->count;
- xCompare = compareFunction(pH->keyClass);
- while( count-- && elem ){
- if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){
- return elem;
- }
- elem = elem->next;
+ }else{
+ elem = pH->first;
+ count = pH->count;
+ }
+ while( count-- && ALWAYS(elem) ){
+ if( elem->nKey==nKey && sqlite3StrNICmp(elem->pKey,pKey,nKey)==0 ){
+ return elem;
}
+ elem = elem->next;
}
return 0;
}
@@ -17264,7 +19739,7 @@ static HashElem *findElementGivenHash(
static void removeElementGivenHash(
Hash *pH, /* The pH containing "elem" */
HashElem* elem, /* The element to be removed from the pH */
- int h /* Hash value for the element */
+ unsigned int h /* Hash value for the element */
){
struct _ht *pEntry;
if( elem->prev ){
@@ -17275,16 +19750,13 @@ static void removeElementGivenHash(
if( elem->next ){
elem->next->prev = elem->prev;
}
- pEntry = &pH->ht[h];
- if( pEntry->chain==elem ){
- pEntry->chain = elem->next;
- }
- pEntry->count--;
- if( pEntry->count<=0 ){
- pEntry->chain = 0;
- }
- if( pH->copyKey ){
- sqlite3_free(elem->pKey);
+ if( pH->ht ){
+ pEntry = &pH->ht[h];
+ if( pEntry->chain==elem ){
+ pEntry->chain = elem->next;
+ }
+ pEntry->count--;
+ assert( pEntry->count>=0 );
}
sqlite3_free( elem );
pH->count--;
@@ -17296,30 +19768,22 @@ static void removeElementGivenHash(
}
/* Attempt to locate an element of the hash table pH with a key
-** that matches pKey,nKey. Return a pointer to the corresponding
-** HashElem structure for this element if it is found, or NULL
-** otherwise.
-*/
-SQLITE_PRIVATE HashElem *sqlite3HashFindElem(const Hash *pH, const void *pKey, int nKey){
- int h; /* A hash on key */
- HashElem *elem; /* The element that matches key */
- int (*xHash)(const void*,int); /* The hash function */
-
- if( pH==0 || pH->ht==0 ) return 0;
- xHash = hashFunction(pH->keyClass);
- assert( xHash!=0 );
- h = (*xHash)(pKey,nKey);
- elem = findElementGivenHash(pH,pKey,nKey, h % pH->htsize);
- return elem;
-}
-
-/* Attempt to locate an element of the hash table pH with a key
** that matches pKey,nKey. Return the data for this element if it is
** found, or NULL if there is no match.
*/
-SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const void *pKey, int nKey){
+SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey, int nKey){
HashElem *elem; /* The element that matches key */
- elem = sqlite3HashFindElem(pH, pKey, nKey);
+ unsigned int h; /* A hash on key */
+
+ assert( pH!=0 );
+ assert( pKey!=0 );
+ assert( nKey>=0 );
+ if( pH->ht ){
+ h = strHash(pKey, nKey) % pH->htsize;
+ }else{
+ h = 0;
+ }
+ elem = findElementGivenHash(pH, pKey, nKey, h);
return elem ? elem->data : 0;
}
@@ -17327,8 +19791,7 @@ SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const void *pKey, int nKey)
** and the data is "data".
**
** If no element exists with a matching key, then a new
-** element is created. A copy of the key is made if the copyKey
-** flag is set. NULL is returned.
+** element is created and NULL is returned.
**
** If another element already exists with the same key, then the
** new data replaces the old data and the old data is returned.
@@ -17338,67 +19801,49 @@ SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const void *pKey, int nKey)
** If the "data" parameter to this function is NULL, then the
** element corresponding to "key" is removed from the hash table.
*/
-SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const void *pKey, int nKey, void *data){
- int hraw; /* Raw hash value of the key */
- int h; /* the hash of the key modulo hash table size */
+SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, int nKey, void *data){
+ unsigned int h; /* the hash of the key modulo hash table size */
HashElem *elem; /* Used to loop thru the element list */
HashElem *new_elem; /* New element added to the pH */
- int (*xHash)(const void*,int); /* The hash function */
assert( pH!=0 );
- xHash = hashFunction(pH->keyClass);
- assert( xHash!=0 );
- hraw = (*xHash)(pKey, nKey);
+ assert( pKey!=0 );
+ assert( nKey>=0 );
if( pH->htsize ){
- h = hraw % pH->htsize;
- elem = findElementGivenHash(pH,pKey,nKey,h);
- if( elem ){
- void *old_data = elem->data;
- if( data==0 ){
- removeElementGivenHash(pH,elem,h);
- }else{
- elem->data = data;
- if( !pH->copyKey ){
- elem->pKey = (void *)pKey;
- }
- assert(nKey==elem->nKey);
- }
- return old_data;
+ h = strHash(pKey, nKey) % pH->htsize;
+ }else{
+ h = 0;
+ }
+ elem = findElementGivenHash(pH,pKey,nKey,h);
+ if( elem ){
+ void *old_data = elem->data;
+ if( data==0 ){
+ removeElementGivenHash(pH,elem,h);
+ }else{
+ elem->data = data;
+ elem->pKey = pKey;
+ assert(nKey==elem->nKey);
}
+ return old_data;
}
if( data==0 ) return 0;
- new_elem = (HashElem*)sqlite3_malloc( sizeof(HashElem) );
+ new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) );
if( new_elem==0 ) return data;
- if( pH->copyKey && pKey!=0 ){
- new_elem->pKey = sqlite3_malloc( nKey );
- if( new_elem->pKey==0 ){
- sqlite3_free(new_elem);
- return data;
- }
- memcpy((void*)new_elem->pKey, pKey, nKey);
- }else{
- new_elem->pKey = (void*)pKey;
- }
+ new_elem->pKey = pKey;
new_elem->nKey = nKey;
+ new_elem->data = data;
pH->count++;
- if( pH->htsize==0 ){
- rehash(pH, 128/sizeof(pH->ht[0]));
- if( pH->htsize==0 ){
- pH->count = 0;
- if( pH->copyKey ){
- sqlite3_free(new_elem->pKey);
- }
- sqlite3_free(new_elem);
- return data;
+ if( pH->count>=10 && pH->count > 2*pH->htsize ){
+ if( rehash(pH, pH->count*2) ){
+ assert( pH->htsize>0 );
+ h = strHash(pKey, nKey) % pH->htsize;
}
}
- if( pH->count > pH->htsize ){
- rehash(pH,pH->htsize*2);
+ if( pH->ht ){
+ insertElement(pH, &pH->ht[h], new_elem);
+ }else{
+ insertElement(pH, 0, new_elem);
}
- assert( pH->htsize>0 );
- h = hraw % pH->htsize;
- insertElement(pH, &pH->ht[h], new_elem);
- new_elem->data = data;
return 0;
}
@@ -17413,144 +19858,147 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
/* 2 */ "Affinity",
/* 3 */ "Column",
/* 4 */ "SetCookie",
- /* 5 */ "Sequence",
- /* 6 */ "MoveGt",
- /* 7 */ "RowKey",
- /* 8 */ "SCopy",
- /* 9 */ "OpenWrite",
- /* 10 */ "If",
- /* 11 */ "VRowid",
+ /* 5 */ "Seek",
+ /* 6 */ "Sequence",
+ /* 7 */ "Savepoint",
+ /* 8 */ "RowKey",
+ /* 9 */ "SCopy",
+ /* 10 */ "OpenWrite",
+ /* 11 */ "If",
/* 12 */ "CollSeq",
/* 13 */ "OpenRead",
/* 14 */ "Expire",
/* 15 */ "AutoCommit",
- /* 16 */ "Not",
+ /* 16 */ "Pagecount",
/* 17 */ "IntegrityCk",
/* 18 */ "Sort",
- /* 19 */ "Copy",
- /* 20 */ "Trace",
- /* 21 */ "Function",
- /* 22 */ "IfNeg",
- /* 23 */ "Noop",
- /* 24 */ "Return",
- /* 25 */ "NewRowid",
- /* 26 */ "Variable",
- /* 27 */ "String",
- /* 28 */ "RealAffinity",
- /* 29 */ "VRename",
- /* 30 */ "ParseSchema",
- /* 31 */ "VOpen",
- /* 32 */ "Close",
- /* 33 */ "CreateIndex",
- /* 34 */ "IsUnique",
- /* 35 */ "NotFound",
- /* 36 */ "Int64",
- /* 37 */ "MustBeInt",
- /* 38 */ "Halt",
- /* 39 */ "Rowid",
- /* 40 */ "IdxLT",
- /* 41 */ "AddImm",
- /* 42 */ "Statement",
- /* 43 */ "RowData",
- /* 44 */ "MemMax",
- /* 45 */ "NotExists",
- /* 46 */ "Gosub",
- /* 47 */ "Integer",
- /* 48 */ "Prev",
- /* 49 */ "VColumn",
- /* 50 */ "CreateTable",
- /* 51 */ "Last",
- /* 52 */ "IncrVacuum",
- /* 53 */ "IdxRowid",
- /* 54 */ "ResetCount",
- /* 55 */ "FifoWrite",
- /* 56 */ "ContextPush",
- /* 57 */ "DropTrigger",
- /* 58 */ "DropIndex",
- /* 59 */ "IdxGE",
- /* 60 */ "Or",
- /* 61 */ "And",
- /* 62 */ "IdxDelete",
- /* 63 */ "Vacuum",
- /* 64 */ "MoveLe",
- /* 65 */ "IsNull",
- /* 66 */ "NotNull",
- /* 67 */ "Ne",
- /* 68 */ "Eq",
- /* 69 */ "Gt",
- /* 70 */ "Le",
- /* 71 */ "Lt",
- /* 72 */ "Ge",
- /* 73 */ "IfNot",
- /* 74 */ "BitAnd",
- /* 75 */ "BitOr",
- /* 76 */ "ShiftLeft",
- /* 77 */ "ShiftRight",
- /* 78 */ "Add",
- /* 79 */ "Subtract",
- /* 80 */ "Multiply",
- /* 81 */ "Divide",
- /* 82 */ "Remainder",
- /* 83 */ "Concat",
- /* 84 */ "DropTable",
- /* 85 */ "MakeRecord",
- /* 86 */ "ResultRow",
- /* 87 */ "BitNot",
- /* 88 */ "String8",
- /* 89 */ "Delete",
- /* 90 */ "AggFinal",
- /* 91 */ "Goto",
- /* 92 */ "TableLock",
- /* 93 */ "FifoRead",
- /* 94 */ "Clear",
- /* 95 */ "MoveLt",
- /* 96 */ "VerifyCookie",
- /* 97 */ "AggStep",
- /* 98 */ "SetNumColumns",
- /* 99 */ "Transaction",
- /* 100 */ "VFilter",
- /* 101 */ "VDestroy",
- /* 102 */ "ContextPop",
- /* 103 */ "Next",
- /* 104 */ "IdxInsert",
- /* 105 */ "Insert",
- /* 106 */ "Destroy",
- /* 107 */ "ReadCookie",
- /* 108 */ "ForceInt",
- /* 109 */ "LoadAnalysis",
- /* 110 */ "Explain",
- /* 111 */ "OpenPseudo",
- /* 112 */ "OpenEphemeral",
- /* 113 */ "Null",
- /* 114 */ "Move",
- /* 115 */ "Blob",
- /* 116 */ "Rewind",
- /* 117 */ "MoveGe",
- /* 118 */ "VBegin",
- /* 119 */ "VUpdate",
- /* 120 */ "IfZero",
- /* 121 */ "VCreate",
- /* 122 */ "Found",
- /* 123 */ "IfPos",
- /* 124 */ "NullRow",
- /* 125 */ "Real",
- /* 126 */ "NotUsed_126",
- /* 127 */ "NotUsed_127",
- /* 128 */ "NotUsed_128",
- /* 129 */ "NotUsed_129",
- /* 130 */ "NotUsed_130",
- /* 131 */ "NotUsed_131",
- /* 132 */ "NotUsed_132",
- /* 133 */ "NotUsed_133",
+ /* 19 */ "Not",
+ /* 20 */ "Copy",
+ /* 21 */ "Trace",
+ /* 22 */ "Function",
+ /* 23 */ "IfNeg",
+ /* 24 */ "Noop",
+ /* 25 */ "Program",
+ /* 26 */ "Return",
+ /* 27 */ "NewRowid",
+ /* 28 */ "FkCounter",
+ /* 29 */ "Variable",
+ /* 30 */ "String",
+ /* 31 */ "RealAffinity",
+ /* 32 */ "VRename",
+ /* 33 */ "ParseSchema",
+ /* 34 */ "VOpen",
+ /* 35 */ "Close",
+ /* 36 */ "CreateIndex",
+ /* 37 */ "IsUnique",
+ /* 38 */ "NotFound",
+ /* 39 */ "Int64",
+ /* 40 */ "MustBeInt",
+ /* 41 */ "Halt",
+ /* 42 */ "Rowid",
+ /* 43 */ "IdxLT",
+ /* 44 */ "AddImm",
+ /* 45 */ "RowData",
+ /* 46 */ "MemMax",
+ /* 47 */ "NotExists",
+ /* 48 */ "Gosub",
+ /* 49 */ "Integer",
+ /* 50 */ "Prev",
+ /* 51 */ "RowSetRead",
+ /* 52 */ "RowSetAdd",
+ /* 53 */ "VColumn",
+ /* 54 */ "CreateTable",
+ /* 55 */ "Last",
+ /* 56 */ "SeekLe",
+ /* 57 */ "IncrVacuum",
+ /* 58 */ "IdxRowid",
+ /* 59 */ "ResetCount",
+ /* 60 */ "Yield",
+ /* 61 */ "DropTrigger",
+ /* 62 */ "DropIndex",
+ /* 63 */ "Param",
+ /* 64 */ "IdxGE",
+ /* 65 */ "IdxDelete",
+ /* 66 */ "Vacuum",
+ /* 67 */ "IfNot",
+ /* 68 */ "Or",
+ /* 69 */ "And",
+ /* 70 */ "DropTable",
+ /* 71 */ "SeekLt",
+ /* 72 */ "MakeRecord",
+ /* 73 */ "IsNull",
+ /* 74 */ "NotNull",
+ /* 75 */ "Ne",
+ /* 76 */ "Eq",
+ /* 77 */ "Gt",
+ /* 78 */ "Le",
+ /* 79 */ "Lt",
+ /* 80 */ "Ge",
+ /* 81 */ "ResultRow",
+ /* 82 */ "BitAnd",
+ /* 83 */ "BitOr",
+ /* 84 */ "ShiftLeft",
+ /* 85 */ "ShiftRight",
+ /* 86 */ "Add",
+ /* 87 */ "Subtract",
+ /* 88 */ "Multiply",
+ /* 89 */ "Divide",
+ /* 90 */ "Remainder",
+ /* 91 */ "Concat",
+ /* 92 */ "Delete",
+ /* 93 */ "BitNot",
+ /* 94 */ "String8",
+ /* 95 */ "AggFinal",
+ /* 96 */ "Compare",
+ /* 97 */ "Goto",
+ /* 98 */ "TableLock",
+ /* 99 */ "Clear",
+ /* 100 */ "VerifyCookie",
+ /* 101 */ "AggStep",
+ /* 102 */ "Transaction",
+ /* 103 */ "VFilter",
+ /* 104 */ "VDestroy",
+ /* 105 */ "Next",
+ /* 106 */ "Count",
+ /* 107 */ "IdxInsert",
+ /* 108 */ "FkIfZero",
+ /* 109 */ "SeekGe",
+ /* 110 */ "Insert",
+ /* 111 */ "Destroy",
+ /* 112 */ "ReadCookie",
+ /* 113 */ "RowSetTest",
+ /* 114 */ "LoadAnalysis",
+ /* 115 */ "Explain",
+ /* 116 */ "HaltIfNull",
+ /* 117 */ "OpenPseudo",
+ /* 118 */ "OpenEphemeral",
+ /* 119 */ "Null",
+ /* 120 */ "Move",
+ /* 121 */ "Blob",
+ /* 122 */ "Rewind",
+ /* 123 */ "SeekGt",
+ /* 124 */ "VBegin",
+ /* 125 */ "VUpdate",
+ /* 126 */ "IfZero",
+ /* 127 */ "VCreate",
+ /* 128 */ "Found",
+ /* 129 */ "IfPos",
+ /* 130 */ "Real",
+ /* 131 */ "NullRow",
+ /* 132 */ "Jump",
+ /* 133 */ "Permutation",
/* 134 */ "NotUsed_134",
/* 135 */ "NotUsed_135",
/* 136 */ "NotUsed_136",
/* 137 */ "NotUsed_137",
- /* 138 */ "ToText",
- /* 139 */ "ToBlob",
- /* 140 */ "ToNumeric",
- /* 141 */ "ToInt",
- /* 142 */ "ToReal",
+ /* 138 */ "NotUsed_138",
+ /* 139 */ "NotUsed_139",
+ /* 140 */ "NotUsed_140",
+ /* 141 */ "ToText",
+ /* 142 */ "ToBlob",
+ /* 143 */ "ToNumeric",
+ /* 144 */ "ToInt",
+ /* 145 */ "ToReal",
};
return azName[i];
}
@@ -17571,10 +20019,12 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
******************************************************************************
**
** This file contains code that is specific to OS/2.
+**
+** $Id: os_os2.c,v 1.63 2008/12/10 19:26:24 drh Exp $
*/
-#if OS_OS2
+#if SQLITE_OS_OS2
/*
** A Note About Memory Allocation:
@@ -17632,7 +20082,11 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
**
** This file should be #included by the os_*.c files only. It is not a
** general purpose header file.
+**
+** $Id: os_common.h,v 1.38 2009/02/24 18:40:50 danielk1977 Exp $
*/
+#ifndef _OS_COMMON_H_
+#define _OS_COMMON_H_
/*
** At least two bugs have slipped in because we changed the MEMORY_DEBUG
@@ -17643,15 +20097,6 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
#endif
-
-/*
- * When testing, this global variable stores the location of the
- * pending-byte in the database file.
- */
-#ifdef SQLITE_TEST
-SQLITE_API unsigned int sqlite3_pending_byte = 0x40000000;
-#endif
-
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3OSTrace = 0;
#define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
@@ -17678,22 +20123,113 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0;
** on i486 hardware.
*/
#ifdef SQLITE_PERFORMANCE_TRACE
-__inline__ unsigned long long int hwtime(void){
- unsigned long long int x;
- __asm__("rdtsc\n\t"
- "mov %%edx, %%ecx\n\t"
- :"=A" (x));
- return x;
-}
-static unsigned long long int g_start;
-static unsigned int elapse;
-#define TIMER_START g_start=hwtime()
-#define TIMER_END elapse=hwtime()-g_start
-#define TIMER_ELAPSED elapse
+
+/*
+** hwtime.h contains inline assembler code for implementing
+** high-performance timing routines.
+*/
+/************** Include hwtime.h in the middle of os_common.h ****************/
+/************** Begin file hwtime.h ******************************************/
+/*
+** 2008 May 27
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains inline asm code for retrieving "high-performance"
+** counters for x86 class CPUs.
+**
+** $Id: hwtime.h,v 1.3 2008/08/01 14:33:15 shane Exp $
+*/
+#ifndef _HWTIME_H_
+#define _HWTIME_H_
+
+/*
+** The following routine only works on pentium-class (or newer) processors.
+** It uses the RDTSC opcode to read the cycle count value out of the
+** processor and returns that value. This can be used for high-res
+** profiling.
+*/
+#if (defined(__GNUC__) || defined(_MSC_VER)) && \
+ (defined(i386) || defined(__i386__) || defined(_M_IX86))
+
+ #if defined(__GNUC__)
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+ #elif defined(_MSC_VER)
+
+ __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
+ __asm {
+ rdtsc
+ ret ; return value at EDX:EAX
+ }
+ }
+
+ #endif
+
+#elif (defined(__GNUC__) && defined(__x86_64__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long val;
+ __asm__ __volatile__ ("rdtsc" : "=A" (val));
+ return val;
+ }
+
+#elif (defined(__GNUC__) && defined(__ppc__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long long retval;
+ unsigned long junk;
+ __asm__ __volatile__ ("\n\
+ 1: mftbu %1\n\
+ mftb %L0\n\
+ mftbu %0\n\
+ cmpw %0,%1\n\
+ bne 1b"
+ : "=r" (retval), "=r" (junk));
+ return retval;
+ }
+
+#else
+
+ #error Need implementation of sqlite3Hwtime() for your platform.
+
+ /*
+ ** To compile without implementing sqlite3Hwtime() for your platform,
+ ** you can remove the above #error and use the following
+ ** stub function. You will lose timing support for many
+ ** of the debugging and testing utilities, but it should at
+ ** least compile and run.
+ */
+SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
+
+#endif
+
+#endif /* !defined(_HWTIME_H_) */
+
+/************** End of hwtime.h **********************************************/
+/************** Continuing where we left off in os_common.h ******************/
+
+static sqlite_uint64 g_start;
+static sqlite_uint64 g_elapsed;
+#define TIMER_START g_start=sqlite3Hwtime()
+#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
+#define TIMER_ELAPSED g_elapsed
#else
#define TIMER_START
#define TIMER_END
-#define TIMER_ELAPSED 0
+#define TIMER_ELAPSED ((sqlite_uint64)0)
#endif
/*
@@ -17746,6 +20282,8 @@ SQLITE_API int sqlite3_open_file_count = 0;
#define OpenCounter(X)
#endif
+#endif /* !defined(_OS_COMMON_H_) */
+
/************** End of os_common.h *******************************************/
/************** Continuing where we left off in os_os2.c *********************/
@@ -17771,7 +20309,7 @@ struct os2File {
/*
** Close a file.
*/
-int os2Close( sqlite3_file *id ){
+static int os2Close( sqlite3_file *id ){
APIRET rc = NO_ERROR;
os2File *pFile;
if( id && (pFile = (os2File*)id) != 0 ){
@@ -17795,7 +20333,7 @@ int os2Close( sqlite3_file *id ){
** bytes were read successfully and SQLITE_IOERR if anything goes
** wrong.
*/
-int os2Read(
+static int os2Read(
sqlite3_file *id, /* File to read from */
void *pBuf, /* Write content into this buffer */
int amt, /* Number of bytes to read */
@@ -17816,6 +20354,7 @@ int os2Read(
if( got == (ULONG)amt )
return SQLITE_OK;
else {
+ /* Unread portions of the input buffer must be zero-filled */
memset(&((char*)pBuf)[got], 0, amt-got);
return SQLITE_IOERR_SHORT_READ;
}
@@ -17825,7 +20364,7 @@ int os2Read(
** Write data from a buffer into a file. Return SQLITE_OK on success
** or some other error code on failure.
*/
-int os2Write(
+static int os2Write(
sqlite3_file *id, /* File to write into */
const void *pBuf, /* The bytes to be written */
int amt, /* Number of bytes to write */
@@ -17857,13 +20396,13 @@ int os2Write(
/*
** Truncate an open file to a specified size
*/
-int os2Truncate( sqlite3_file *id, i64 nByte ){
+static int os2Truncate( sqlite3_file *id, i64 nByte ){
APIRET rc = NO_ERROR;
os2File *pFile = (os2File*)id;
OSTRACE3( "TRUNCATE %d %lld\n", pFile->h, nByte );
SimulateIOError( return SQLITE_IOERR_TRUNCATE );
rc = DosSetFileSize( pFile->h, nByte );
- return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;
+ return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR_TRUNCATE;
}
#ifdef SQLITE_TEST
@@ -17878,7 +20417,7 @@ SQLITE_API int sqlite3_fullsync_count = 0;
/*
** Make sure all writes to a particular file are committed to disk.
*/
-int os2Sync( sqlite3_file *id, int flags ){
+static int os2Sync( sqlite3_file *id, int flags ){
os2File *pFile = (os2File*)id;
OSTRACE3( "SYNC %d lock=%d\n", pFile->h, pFile->locktype );
#ifdef SQLITE_TEST
@@ -17887,24 +20426,32 @@ int os2Sync( sqlite3_file *id, int flags ){
}
sqlite3_sync_count++;
#endif
+ /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
+ ** no-op
+ */
+#ifdef SQLITE_NO_SYNC
+ UNUSED_PARAMETER(pFile);
+ return SQLITE_OK;
+#else
return DosResetBuffer( pFile->h ) == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;
+#endif
}
/*
** Determine the current size of a file in bytes
*/
-int os2FileSize( sqlite3_file *id, sqlite3_int64 *pSize ){
+static int os2FileSize( sqlite3_file *id, sqlite3_int64 *pSize ){
APIRET rc = NO_ERROR;
FILESTATUS3 fsts3FileInfo;
memset(&fsts3FileInfo, 0, sizeof(fsts3FileInfo));
assert( id!=0 );
- SimulateIOError( return SQLITE_IOERR );
+ SimulateIOError( return SQLITE_IOERR_FSTAT );
rc = DosQueryFileInfo( ((os2File*)id)->h, FIL_STANDARD, &fsts3FileInfo, sizeof(FILESTATUS3) );
if( rc == NO_ERROR ){
*pSize = fsts3FileInfo.cbFile;
return SQLITE_OK;
}else{
- return SQLITE_IOERR;
+ return SQLITE_IOERR_FSTAT;
}
}
@@ -17970,7 +20517,7 @@ static int unlockReadLock( os2File *id ){
** It is not possible to lower the locking level one step at a time. You
** must go straight to locking level 0.
*/
-int os2Lock( sqlite3_file *id, int locktype ){
+static int os2Lock( sqlite3_file *id, int locktype ){
int rc = SQLITE_OK; /* Return code from subroutines */
APIRET res = NO_ERROR; /* Result of an OS/2 lock call */
int newLocktype; /* Set pFile->locktype to this value before exiting */
@@ -18106,7 +20653,7 @@ int os2Lock( sqlite3_file *id, int locktype ){
** file by this or any other process. If such a lock is held, return
** non-zero, otherwise zero.
*/
-int os2CheckReservedLock( sqlite3_file *id ){
+static int os2CheckReservedLock( sqlite3_file *id, int *pOut ){
int r = 0;
os2File *pFile = (os2File*)id;
assert( pFile!=0 );
@@ -18137,7 +20684,8 @@ int os2CheckReservedLock( sqlite3_file *id ){
r = !(rc == NO_ERROR);
OSTRACE3( "TEST WR-LOCK %d %d (remote)\n", pFile->h, r );
}
- return r;
+ *pOut = r;
+ return SQLITE_OK;
}
/*
@@ -18151,7 +20699,7 @@ int os2CheckReservedLock( sqlite3_file *id ){
** is NO_LOCK. If the second argument is SHARED_LOCK then this routine
** might return SQLITE_IOERR;
*/
-int os2Unlock( sqlite3_file *id, int locktype ){
+static int os2Unlock( sqlite3_file *id, int locktype ){
int type;
os2File *pFile = (os2File*)id;
APIRET rc = SQLITE_OK;
@@ -18238,32 +20786,57 @@ static int os2DeviceCharacteristics(sqlite3_file *id){
return 0;
}
+
+/*
+** Character set conversion objects used by conversion routines.
+*/
+static UconvObject ucUtf8 = NULL; /* convert between UTF-8 and UCS-2 */
+static UconvObject uclCp = NULL; /* convert between local codepage and UCS-2 */
+
+/*
+** Helper function to initialize the conversion objects from and to UTF-8.
+*/
+static void initUconvObjects( void ){
+ if( UniCreateUconvObject( UTF_8, &ucUtf8 ) != ULS_SUCCESS )
+ ucUtf8 = NULL;
+ if ( UniCreateUconvObject( (UniChar *)L"@path=yes", &uclCp ) != ULS_SUCCESS )
+ uclCp = NULL;
+}
+
+/*
+** Helper function to free the conversion objects from and to UTF-8.
+*/
+static void freeUconvObjects( void ){
+ if ( ucUtf8 )
+ UniFreeUconvObject( ucUtf8 );
+ if ( uclCp )
+ UniFreeUconvObject( uclCp );
+ ucUtf8 = NULL;
+ uclCp = NULL;
+}
+
/*
** Helper function to convert UTF-8 filenames to local OS/2 codepage.
** The two-step process: first convert the incoming UTF-8 string
** into UCS-2 and then from UCS-2 to the current codepage.
** The returned char pointer has to be freed.
*/
-char *convertUtf8PathToCp(const char *in)
-{
- UconvObject uconv;
- UniChar ucsUtf8Cp[12],
- tempPath[CCHMAXPATH];
- char *out;
- int rc = 0;
+static char *convertUtf8PathToCp( const char *in ){
+ UniChar tempPath[CCHMAXPATH];
+ char *out = (char *)calloc( CCHMAXPATH, 1 );
+
+ if( !out )
+ return NULL;
- out = (char *)calloc(CCHMAXPATH, 1);
+ if( !ucUtf8 || !uclCp )
+ initUconvObjects();
/* determine string for the conversion of UTF-8 which is CP1208 */
- rc = UniMapCpToUcsCp(1208, ucsUtf8Cp, 12);
- rc = UniCreateUconvObject(ucsUtf8Cp, &uconv);
- rc = UniStrToUcs(uconv, tempPath, (char *)in, CCHMAXPATH);
- rc = UniFreeUconvObject(uconv);
+ if( UniStrToUcs( ucUtf8, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )
+ return out; /* if conversion fails, return the empty string */
/* conversion for current codepage which can be used for paths */
- rc = UniCreateUconvObject((UniChar *)L"@path=yes", &uconv);
- rc = UniStrFromUcs(uconv, out, tempPath, CCHMAXPATH);
- rc = UniFreeUconvObject(uconv);
+ UniStrFromUcs( uclCp, out, tempPath, CCHMAXPATH );
return out;
}
@@ -18273,27 +20846,26 @@ char *convertUtf8PathToCp(const char *in)
** The two-step process: first convert the incoming codepage-specific
** string into UCS-2 and then from UCS-2 to the codepage of UTF-8.
** The returned char pointer has to be freed.
+**
+** This function is non-static to be able to use this in shell.c and
+** similar applications that take command line arguments.
*/
-char *convertCpPathToUtf8(const char *in)
-{
- UconvObject uconv;
- UniChar ucsUtf8Cp[12],
- tempPath[CCHMAXPATH];
- char *out;
- int rc = 0;
+char *convertCpPathToUtf8( const char *in ){
+ UniChar tempPath[CCHMAXPATH];
+ char *out = (char *)calloc( CCHMAXPATH, 1 );
+
+ if( !out )
+ return NULL;
- out = (char *)calloc(CCHMAXPATH, 1);
+ if( !ucUtf8 || !uclCp )
+ initUconvObjects();
/* conversion for current codepage which can be used for paths */
- rc = UniCreateUconvObject((UniChar *)L"@path=yes", &uconv);
- rc = UniStrToUcs(uconv, tempPath, (char *)in, CCHMAXPATH);
- rc = UniFreeUconvObject(uconv);
+ if( UniStrToUcs( uclCp, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )
+ return out; /* if conversion fails, return the empty string */
/* determine string for the conversion of UTF-8 which is CP1208 */
- rc = UniMapCpToUcsCp(1208, ucsUtf8Cp, 12);
- rc = UniCreateUconvObject(ucsUtf8Cp, &uconv);
- rc = UniStrFromUcs(uconv, out, tempPath, CCHMAXPATH);
- rc = UniFreeUconvObject(uconv);
+ UniStrFromUcs( ucUtf8, out, tempPath, CCHMAXPATH );
return out;
}
@@ -18325,6 +20897,84 @@ static const sqlite3_io_methods os2IoMethod = {
****************************************************************************/
/*
+** Create a temporary file name in zBuf. zBuf must be big enough to
+** hold at pVfs->mxPathname characters.
+*/
+static int getTempname(int nBuf, char *zBuf ){
+ static const unsigned char zChars[] =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789";
+ int i, j;
+ char zTempPathBuf[3];
+ PSZ zTempPath = (PSZ)&zTempPathBuf;
+ if( sqlite3_temp_directory ){
+ zTempPath = sqlite3_temp_directory;
+ }else{
+ if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){
+ if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){
+ if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){
+ ULONG ulDriveNum = 0, ulDriveMap = 0;
+ DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap );
+ sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) );
+ }
+ }
+ }
+ }
+ /* Strip off a trailing slashes or backslashes, otherwise we would get *
+ * multiple (back)slashes which causes DosOpen() to fail. *
+ * Trailing spaces are not allowed, either. */
+ j = sqlite3Strlen30(zTempPath);
+ while( j > 0 && ( zTempPath[j-1] == '\\' || zTempPath[j-1] == '/'
+ || zTempPath[j-1] == ' ' ) ){
+ j--;
+ }
+ zTempPath[j] = '\0';
+ if( !sqlite3_temp_directory ){
+ char *zTempPathUTF = convertCpPathToUtf8( zTempPath );
+ sqlite3_snprintf( nBuf-30, zBuf,
+ "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPathUTF );
+ free( zTempPathUTF );
+ }else{
+ sqlite3_snprintf( nBuf-30, zBuf,
+ "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath );
+ }
+ j = sqlite3Strlen30( zBuf );
+ sqlite3_randomness( 20, &zBuf[j] );
+ for( i = 0; i < 20; i++, j++ ){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
+ }
+ zBuf[j] = 0;
+ OSTRACE2( "TEMP FILENAME: %s\n", zBuf );
+ return SQLITE_OK;
+}
+
+
+/*
+** Turn a relative pathname into a full pathname. Write the full
+** pathname into zFull[]. zFull[] will be at least pVfs->mxPathname
+** bytes in size.
+*/
+static int os2FullPathname(
+ sqlite3_vfs *pVfs, /* Pointer to vfs object */
+ const char *zRelative, /* Possibly relative input path */
+ int nFull, /* Size of output buffer in bytes */
+ char *zFull /* Output buffer */
+){
+ char *zRelativeCp = convertUtf8PathToCp( zRelative );
+ char zFullCp[CCHMAXPATH] = "\0";
+ char *zFullUTF;
+ APIRET rc = DosQueryPathInfo( zRelativeCp, FIL_QUERYFULLNAME, zFullCp,
+ CCHMAXPATH );
+ free( zRelativeCp );
+ zFullUTF = convertCpPathToUtf8( zFullCp );
+ sqlite3_snprintf( nFull, zFull, zFullUTF );
+ free( zFullUTF );
+ return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;
+}
+
+
+/*
** Open a file.
*/
static int os2Open(
@@ -18335,18 +20985,31 @@ static int os2Open(
int *pOutFlags /* Status return flags */
){
HFILE h;
- ULONG ulFileAttribute = 0;
+ ULONG ulFileAttribute = FILE_NORMAL;
ULONG ulOpenFlags = 0;
ULONG ulOpenMode = 0;
os2File *pFile = (os2File*)id;
APIRET rc = NO_ERROR;
ULONG ulAction;
+ char *zNameCp;
+ char zTmpname[CCHMAXPATH+1]; /* Buffer to hold name of temp file */
+
+ /* If the second argument to this function is NULL, generate a
+ ** temporary file name to use
+ */
+ if( !zName ){
+ int rc = getTempname(CCHMAXPATH+1, zTmpname);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ zName = zTmpname;
+ }
+
memset( pFile, 0, sizeof(*pFile) );
OSTRACE2( "OPEN want %d\n", flags );
- /*ulOpenMode = flags & SQLITE_OPEN_READWRITE ? OPEN_ACCESS_READWRITE : OPEN_ACCESS_READONLY;*/
if( flags & SQLITE_OPEN_READWRITE ){
ulOpenMode |= OPEN_ACCESS_READWRITE;
OSTRACE1( "OPEN read/write\n" );
@@ -18355,7 +21018,6 @@ static int os2Open(
OSTRACE1( "OPEN read only\n" );
}
- /*ulOpenFlags = flags & SQLITE_OPEN_CREATE ? OPEN_ACTION_CREATE_IF_NEW : OPEN_ACTION_FAIL_IF_NEW;*/
if( flags & SQLITE_OPEN_CREATE ){
ulOpenFlags |= OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
OSTRACE1( "OPEN open new/create\n" );
@@ -18364,7 +21026,6 @@ static int os2Open(
OSTRACE1( "OPEN open existing\n" );
}
- /*ulOpenMode |= flags & SQLITE_OPEN_MAIN_DB ? OPEN_SHARE_DENYNONE : OPEN_SHARE_DENYWRITE;*/
if( flags & SQLITE_OPEN_MAIN_DB ){
ulOpenMode |= OPEN_SHARE_DENYNONE;
OSTRACE1( "OPEN share read/write\n" );
@@ -18373,16 +21034,15 @@ static int os2Open(
OSTRACE1( "OPEN share read only\n" );
}
- if( flags & (SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TEMP_JOURNAL
- | SQLITE_OPEN_SUBJOURNAL) ){
+ if( flags & SQLITE_OPEN_DELETEONCLOSE ){
char pathUtf8[CCHMAXPATH];
- /*ulFileAttribute = FILE_HIDDEN; //for debugging, we want to make sure it is deleted*/
- ulFileAttribute = FILE_NORMAL;
- sqlite3OsFullPathname( pVfs, zName, CCHMAXPATH, pathUtf8 );
+#ifdef NDEBUG /* when debugging we want to make sure it is deleted */
+ ulFileAttribute = FILE_HIDDEN;
+#endif
+ os2FullPathname( pVfs, zName, CCHMAXPATH, pathUtf8 );
pFile->pathToDel = convertUtf8PathToCp( pathUtf8 );
OSTRACE1( "OPEN hidden/delete on close file attributes\n" );
}else{
- ulFileAttribute = FILE_ARCHIVED | FILE_NORMAL;
pFile->pathToDel = NULL;
OSTRACE1( "OPEN normal file attribute\n" );
}
@@ -18392,7 +21052,7 @@ static int os2Open(
ulOpenMode |= OPEN_FLAGS_FAIL_ON_ERROR;
ulOpenMode |= OPEN_FLAGS_NOINHERIT;
- char *zNameCp = convertUtf8PathToCp( zName );
+ zNameCp = convertUtf8PathToCp( zName );
rc = DosOpen( (PSZ)zNameCp,
&h,
&ulAction,
@@ -18405,11 +21065,12 @@ static int os2Open(
if( rc != NO_ERROR ){
OSTRACE7( "OPEN Invalid handle rc=%d: zName=%s, ulAction=%#lx, ulAttr=%#lx, ulFlags=%#lx, ulMode=%#lx\n",
rc, zName, ulAction, ulFileAttribute, ulOpenFlags, ulOpenMode );
- free( pFile->pathToDel );
+ if( pFile->pathToDel )
+ free( pFile->pathToDel );
pFile->pathToDel = NULL;
if( flags & SQLITE_OPEN_READWRITE ){
OSTRACE2( "OPEN %d Invalid handle\n", ((flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE) );
- return os2Open( 0, zName, id,
+ return os2Open( pVfs, zName, id,
((flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE),
pOutFlags );
}else{
@@ -18431,18 +21092,18 @@ static int os2Open(
/*
** Delete the named file.
*/
-int os2Delete(
+static int os2Delete(
sqlite3_vfs *pVfs, /* Not used on os2 */
const char *zFilename, /* Name of file to delete */
int syncDir /* Not used on os2 */
){
APIRET rc = NO_ERROR;
- SimulateIOError(return SQLITE_IOERR_DELETE);
char *zFilenameCp = convertUtf8PathToCp( zFilename );
+ SimulateIOError( return SQLITE_IOERR_DELETE );
rc = DosDelete( (PSZ)zFilenameCp );
free( zFilenameCp );
OSTRACE2( "DELETE \"%s\"\n", zFilename );
- return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;
+ return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR_DELETE;
}
/*
@@ -18451,13 +21112,14 @@ int os2Delete(
static int os2Access(
sqlite3_vfs *pVfs, /* Not used on os2 */
const char *zFilename, /* Name of file to check */
- int flags /* Type of test to make on this file */
+ int flags, /* Type of test to make on this file */
+ int *pOut /* Write results here */
){
FILESTATUS3 fsts3ConfigInfo;
APIRET rc = NO_ERROR;
+ char *zFilenameCp = convertUtf8PathToCp( zFilename );
memset( &fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo) );
- char *zFilenameCp = convertUtf8PathToCp( zFilename );
rc = DosQueryPathInfo( (PSZ)zFilenameCp, FIL_STANDARD,
&fsts3ConfigInfo, sizeof(FILESTATUS3) );
free( zFilenameCp );
@@ -18470,83 +21132,17 @@ static int os2Access(
OSTRACE3( "ACCESS %s access of read and exists rc=%d\n", zFilename, rc );
break;
case SQLITE_ACCESS_READWRITE:
- rc = (fsts3ConfigInfo.attrFile & FILE_READONLY) == 0;
+ rc = (rc == NO_ERROR) && ( (fsts3ConfigInfo.attrFile & FILE_READONLY) == 0 );
OSTRACE3( "ACCESS %s access of read/write rc=%d\n", zFilename, rc );
break;
default:
assert( !"Invalid flags argument" );
}
- return rc;
-}
-
-
-/*
-** Create a temporary file name in zBuf. zBuf must be big enough to
-** hold at pVfs->mxPathname characters.
-*/
-static int os2GetTempname( sqlite3_vfs *pVfs, int nBuf, char *zBuf ){
- static const unsigned char zChars[] =
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "0123456789";
- int i, j;
- char zTempPathBuf[3];
- PSZ zTempPath = (PSZ)&zTempPathBuf;
- char *zTempPathUTF;
- if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){
- if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){
- if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){
- ULONG ulDriveNum = 0, ulDriveMap = 0;
- DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap );
- sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) );
- }
- }
- }
- /* strip off a trailing slashes or backslashes, otherwise we would get *
- * multiple (back)slashes which causes DosOpen() to fail */
- j = strlen(zTempPath);
- while( j > 0 && ( zTempPath[j-1] == '\\' || zTempPath[j-1] == '/' ) ){
- j--;
- }
- zTempPath[j] = '\0';
- zTempPathUTF = convertCpPathToUtf8( zTempPath );
- sqlite3_snprintf( nBuf-30, zBuf,
- "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPathUTF );
- free( zTempPathUTF );
- j = strlen( zBuf );
- sqlite3_randomness( 20, &zBuf[j] );
- for( i = 0; i < 20; i++, j++ ){
- zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
- }
- zBuf[j] = 0;
- OSTRACE2( "TEMP FILENAME: %s\n", zBuf );
+ *pOut = rc;
return SQLITE_OK;
}
-/*
-** Turn a relative pathname into a full pathname. Write the full
-** pathname into zFull[]. zFull[] will be at least pVfs->mxPathname
-** bytes in size.
-*/
-static int os2FullPathname(
- sqlite3_vfs *pVfs, /* Pointer to vfs object */
- const char *zRelative, /* Possibly relative input path */
- int nFull, /* Size of output buffer in bytes */
- char *zFull /* Output buffer */
-){
- char *zRelativeCp = convertUtf8PathToCp( zRelative );
- char zFullCp[CCHMAXPATH];
- char *zFullUTF;
- APIRET rc = DosQueryPathInfo( zRelativeCp, FIL_QUERYFULLNAME, zFullCp,
- CCHMAXPATH );
- free( zRelativeCp );
- zFullUTF = convertCpPathToUtf8( zFullCp );
- sqlite3_snprintf( nFull, zFull, zFullUTF );
- free( zFullUTF );
- return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;
-}
-
#ifndef SQLITE_OMIT_LOAD_EXTENSION
/*
** Interfaces for opening a shared library, finding entry points
@@ -18572,7 +21168,7 @@ static void *os2DlOpen(sqlite3_vfs *pVfs, const char *zFilename){
static void os2DlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
/* no-op */
}
-void *os2DlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
+static void *os2DlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
PFN pfn;
APIRET rc;
rc = DosQueryProcAddr((HMODULE)pHandle, 0L, zSymbol, &pfn);
@@ -18586,7 +21182,7 @@ void *os2DlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
}
return rc != NO_ERROR ? 0 : (void*)pfn;
}
-void os2DlClose(sqlite3_vfs *pVfs, void *pHandle){
+static void os2DlClose(sqlite3_vfs *pVfs, void *pHandle){
DosFreeModule((HMODULE)pHandle);
}
#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
@@ -18601,9 +21197,13 @@ void os2DlClose(sqlite3_vfs *pVfs, void *pHandle){
** Write up to nBuf bytes of randomness into zBuf.
*/
static int os2Randomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf ){
- ULONG sizeofULong = sizeof(ULONG);
int n = 0;
- if( sizeof(DATETIME) <= nBuf - n ){
+#if defined(SQLITE_TEST)
+ n = nBuf;
+ memset(zBuf, 0, nBuf);
+#else
+ int sizeofULong = sizeof(ULONG);
+ if( (int)sizeof(DATETIME) <= nBuf - n ){
DATETIME x;
DosGetDateTime(&x);
memcpy(&zBuf[n], &x, sizeof(x));
@@ -18650,6 +21250,7 @@ static int os2Randomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf ){
n += sizeofULong;
}
}
+#endif
return n;
}
@@ -18715,13 +21316,14 @@ int os2CurrentTime( sqlite3_vfs *pVfs, double *prNow ){
return 0;
}
+static int os2GetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
+ return 0;
+}
+
/*
-** Return a pointer to the sqlite3DefaultVfs structure. We use
-** a function rather than give the structure global scope because
-** some compilers (MSVC) do not allow forward declarations of
-** initialized structures.
+** Initialize and deinitialize the operating system interface.
*/
-SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
+SQLITE_API int sqlite3_os_init(void){
static sqlite3_vfs os2Vfs = {
1, /* iVersion */
sizeof(os2File), /* szOsFile */
@@ -18733,7 +21335,6 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
os2Open, /* xOpen */
os2Delete, /* xDelete */
os2Access, /* xAccess */
- os2GetTempname, /* xGetTempname */
os2FullPathname, /* xFullPathname */
os2DlOpen, /* xDlOpen */
os2DlError, /* xDlError */
@@ -18741,13 +21342,19 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
os2DlClose, /* xDlClose */
os2Randomness, /* xRandomness */
os2Sleep, /* xSleep */
- os2CurrentTime /* xCurrentTime */
+ os2CurrentTime, /* xCurrentTime */
+ os2GetLastError /* xGetLastError */
};
-
- return &os2Vfs;
+ sqlite3_vfs_register(&os2Vfs, 1);
+ initUconvObjects();
+ return SQLITE_OK;
+}
+SQLITE_API int sqlite3_os_end(void){
+ freeUconvObjects();
+ return SQLITE_OK;
}
-#endif /* OS_OS2 */
+#endif /* SQLITE_OS_OS2 */
/************** End of os_os2.c **********************************************/
/************** Begin file os_unix.c *****************************************/
@@ -18763,13 +21370,79 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
**
******************************************************************************
**
-** This file contains code that is specific to Unix systems.
-*/
-#if OS_UNIX /* This file is used on unix only */
+** This file contains the VFS implementation for unix-like operating systems
+** include Linux, MacOSX, *BSD, QNX, VxWorks, AIX, HPUX, and others.
+**
+** There are actually several different VFS implementations in this file.
+** The differences are in the way that file locking is done. The default
+** implementation uses Posix Advisory Locks. Alternative implementations
+** use flock(), dot-files, various proprietary locking schemas, or simply
+** skip locking all together.
+**
+** This source file is organized into divisions where the logic for various
+** subfunctions is contained within the appropriate division. PLEASE
+** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed
+** in the correct division and should be clearly labeled.
+**
+** The layout of divisions is as follows:
+**
+** * General-purpose declarations and utility functions.
+** * Unique file ID logic used by VxWorks.
+** * Various locking primitive implementations (all except proxy locking):
+** + for Posix Advisory Locks
+** + for no-op locks
+** + for dot-file locks
+** + for flock() locking
+** + for named semaphore locks (VxWorks only)
+** + for AFP filesystem locks (MacOSX only)
+** * sqlite3_file methods not associated with locking.
+** * Definitions of sqlite3_io_methods objects for all locking
+** methods plus "finder" functions for each locking method.
+** * sqlite3_vfs method implementations.
+** * Locking primitives for the proxy uber-locking-method. (MacOSX only)
+** * Definitions of sqlite3_vfs objects for all locking methods
+** plus implementations of sqlite3_os_init() and sqlite3_os_end().
+*/
+#if SQLITE_OS_UNIX /* This file is used on unix only */
#include <qconfig.h>
-/* #define SQLITE_ENABLE_LOCKING_STYLE 0 */
+/*
+** There are various methods for file locking used for concurrency
+** control:
+**
+** 1. POSIX locking (the default),
+** 2. No locking,
+** 3. Dot-file locking,
+** 4. flock() locking,
+** 5. AFP locking (OSX only),
+** 6. Named POSIX semaphores (VXWorks only),
+** 7. proxy locking. (OSX only)
+**
+** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE
+** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic
+** selection of the appropriate locking style based on the filesystem
+** where the database is located.
+*/
+#if !defined(SQLITE_ENABLE_LOCKING_STYLE)
+# if defined(__APPLE__)
+# define SQLITE_ENABLE_LOCKING_STYLE 1
+# else
+# define SQLITE_ENABLE_LOCKING_STYLE 0
+# endif
+#endif
+
+/*
+** Define the OS_VXWORKS pre-processor macro to 1 if building on
+** vxworks, or 0 otherwise.
+*/
+#ifndef OS_VXWORKS
+# if defined(__RTP__) || defined(_WRS_KERNEL)
+# define OS_VXWORKS 1
+# else
+# define OS_VXWORKS 0
+# endif
+#endif
/*
** These #defines should enable >2GB file support on Posix if the
@@ -18783,6 +21456,11 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
** without this option, LFS is enable. But LFS does not exist in the kernel
** in RedHat 6.0, so the code won't work. Hence, for maximum binary
** portability you should omit LFS.
+**
+** The previous paragraph was written in 2005. (This paragraph is written
+** on 2008-11-28.) These days, all Linux kernels support large files, so
+** you should probably leave LFS enabled. But some embedded platforms might
+** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful.
*/
#ifndef SQLITE_DISABLE_LFS
# define _LARGE_FILE 1
@@ -18805,10 +21483,17 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
# include <sys/time.h>
#endif
#include <errno.h>
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/mount.h>
+
+#if SQLITE_ENABLE_LOCKING_STYLE
+# include <sys/ioctl.h>
+# if OS_VXWORKS
+# include <semaphore.h>
+# include <limits.h>
+# else
+# include <sys/file.h>
+# include <sys/param.h>
+# include <sys/mount.h>
+# endif
#endif /* SQLITE_ENABLE_LOCKING_STYLE */
/*
@@ -18827,38 +21512,89 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
#endif
/*
+ ** Default permissions when creating auto proxy dir
+ */
+#ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
+# define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755
+#endif
+
+/*
** Maximum supported path-length.
*/
#define MAX_PATHNAME 512
+/*
+** Only set the lastErrno if the error code is a real error and not
+** a normal expected return code of SQLITE_BUSY or SQLITE_OK
+*/
+#define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY))
+
/*
-** The unixFile structure is subclass of sqlite3_file specific for the unix
-** protability layer.
+** Sometimes, after a file handle is closed by SQLite, the file descriptor
+** cannot be closed immediately. In these cases, instances of the following
+** structure are used to store the file descriptor while waiting for an
+** opportunity to either close or reuse it.
+*/
+typedef struct UnixUnusedFd UnixUnusedFd;
+struct UnixUnusedFd {
+ int fd; /* File descriptor to close */
+ int flags; /* Flags this file descriptor was opened with */
+ UnixUnusedFd *pNext; /* Next unused file descriptor on same file */
+};
+
+/*
+** The unixFile structure is subclass of sqlite3_file specific to the unix
+** VFS implementations.
*/
typedef struct unixFile unixFile;
struct unixFile {
sqlite3_io_methods const *pMethod; /* Always the first entry */
+ struct unixOpenCnt *pOpen; /* Info about all open fd's on this inode */
+ struct unixLockInfo *pLock; /* Info about locks on this inode */
+ int h; /* The file descriptor */
+ int dirfd; /* File descriptor for the directory */
+ unsigned char locktype; /* The type of lock held on this fd */
+ int lastErrno; /* The unix errno from the last I/O error */
+ void *lockingContext; /* Locking style specific state */
+ UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */
+ int fileFlags; /* Miscellanous flags */
+#if SQLITE_ENABLE_LOCKING_STYLE
+ int openFlags; /* The flags specified at open() */
+#endif
+#if SQLITE_THREADSAFE && defined(__linux__)
+ pthread_t tid; /* The thread that "owns" this unixFile */
+#endif
+#if OS_VXWORKS
+ int isDelete; /* Delete on close if true */
+ struct vxworksFileId *pId; /* Unique file ID */
+#endif
+#ifndef NDEBUG
+ /* The next group of variables are used to track whether or not the
+ ** transaction counter in bytes 24-27 of database files are updated
+ ** whenever any part of the database changes. An assertion fault will
+ ** occur if a file is updated without also updating the transaction
+ ** counter. This test is made to avoid new problems similar to the
+ ** one described by ticket #3584.
+ */
+ unsigned char transCntrChng; /* True if the transaction counter changed */
+ unsigned char dbUpdate; /* True if any part of database file changed */
+ unsigned char inNormalWrite; /* True if in a normal write operation */
+#endif
#ifdef SQLITE_TEST
/* In test mode, increase the size of this structure a bit so that
** it is larger than the struct CrashFile defined in test6.c.
*/
char aPadding[32];
#endif
- struct openCnt *pOpen; /* Info about all open fd's on this inode */
- struct lockInfo *pLock; /* Info about locks on this inode */
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
- void *lockingContext; /* Locking style specific state */
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
- int h; /* The file descriptor */
- unsigned char locktype; /* The type of lock held on this fd */
- int dirfd; /* File descriptor for the directory */
-#if SQLITE_THREADSAFE
- pthread_t tid; /* The thread that "owns" this unixFile */
-#endif
};
/*
+** The following macros define bits in unixFile.fileFlags
+*/
+#define SQLITE_WHOLE_FILE_LOCKING 0x0001 /* Use whole-file locking */
+
+/*
** Include code that is common to all os_*.c files
*/
/************** Include os_common.h in the middle of os_unix.c ***************/
@@ -18881,7 +21617,11 @@ struct unixFile {
**
** This file should be #included by the os_*.c files only. It is not a
** general purpose header file.
+**
+** $Id: os_common.h,v 1.38 2009/02/24 18:40:50 danielk1977 Exp $
*/
+#ifndef _OS_COMMON_H_
+#define _OS_COMMON_H_
/*
** At least two bugs have slipped in because we changed the MEMORY_DEBUG
@@ -18892,15 +21632,6 @@ struct unixFile {
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
#endif
-
-/*
- * When testing, this global variable stores the location of the
- * pending-byte in the database file.
- */
-#ifdef SQLITE_TEST
-SQLITE_API unsigned int sqlite3_pending_byte = 0x40000000;
-#endif
-
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3OSTrace = 0;
#define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
@@ -18927,22 +21658,113 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0;
** on i486 hardware.
*/
#ifdef SQLITE_PERFORMANCE_TRACE
-__inline__ unsigned long long int hwtime(void){
- unsigned long long int x;
- __asm__("rdtsc\n\t"
- "mov %%edx, %%ecx\n\t"
- :"=A" (x));
- return x;
-}
-static unsigned long long int g_start;
-static unsigned int elapse;
-#define TIMER_START g_start=hwtime()
-#define TIMER_END elapse=hwtime()-g_start
-#define TIMER_ELAPSED elapse
+
+/*
+** hwtime.h contains inline assembler code for implementing
+** high-performance timing routines.
+*/
+/************** Include hwtime.h in the middle of os_common.h ****************/
+/************** Begin file hwtime.h ******************************************/
+/*
+** 2008 May 27
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains inline asm code for retrieving "high-performance"
+** counters for x86 class CPUs.
+**
+** $Id: hwtime.h,v 1.3 2008/08/01 14:33:15 shane Exp $
+*/
+#ifndef _HWTIME_H_
+#define _HWTIME_H_
+
+/*
+** The following routine only works on pentium-class (or newer) processors.
+** It uses the RDTSC opcode to read the cycle count value out of the
+** processor and returns that value. This can be used for high-res
+** profiling.
+*/
+#if (defined(__GNUC__) || defined(_MSC_VER)) && \
+ (defined(i386) || defined(__i386__) || defined(_M_IX86))
+
+ #if defined(__GNUC__)
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+ #elif defined(_MSC_VER)
+
+ __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
+ __asm {
+ rdtsc
+ ret ; return value at EDX:EAX
+ }
+ }
+
+ #endif
+
+#elif (defined(__GNUC__) && defined(__x86_64__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long val;
+ __asm__ __volatile__ ("rdtsc" : "=A" (val));
+ return val;
+ }
+
+#elif (defined(__GNUC__) && defined(__ppc__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long long retval;
+ unsigned long junk;
+ __asm__ __volatile__ ("\n\
+ 1: mftbu %1\n\
+ mftb %L0\n\
+ mftbu %0\n\
+ cmpw %0,%1\n\
+ bne 1b"
+ : "=r" (retval), "=r" (junk));
+ return retval;
+ }
+
+#else
+
+ #error Need implementation of sqlite3Hwtime() for your platform.
+
+ /*
+ ** To compile without implementing sqlite3Hwtime() for your platform,
+ ** you can remove the above #error and use the following
+ ** stub function. You will lose timing support for many
+ ** of the debugging and testing utilities, but it should at
+ ** least compile and run.
+ */
+SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
+
+#endif
+
+#endif /* !defined(_HWTIME_H_) */
+
+/************** End of hwtime.h **********************************************/
+/************** Continuing where we left off in os_common.h ******************/
+
+static sqlite_uint64 g_start;
+static sqlite_uint64 g_elapsed;
+#define TIMER_START g_start=sqlite3Hwtime()
+#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
+#define TIMER_ELAPSED g_elapsed
#else
#define TIMER_START
#define TIMER_END
-#define TIMER_ELAPSED 0
+#define TIMER_ELAPSED ((sqlite_uint64)0)
#endif
/*
@@ -18995,6 +21817,8 @@ SQLITE_API int sqlite3_open_file_count = 0;
#define OpenCounter(X)
#endif
+#endif /* !defined(_OS_COMMON_H_) */
+
/************** End of os_common.h *******************************************/
/************** Continuing where we left off in os_unix.c ********************/
@@ -19035,33 +21859,322 @@ SQLITE_API int sqlite3_open_file_count = 0;
#define threadid 0
#endif
+
/*
-** Set or check the unixFile.tid field. This field is set when an unixFile
-** is first opened. All subsequent uses of the unixFile verify that the
-** same thread is operating on the unixFile. Some operating systems do
-** not allow locks to be overridden by other threads and that restriction
-** means that sqlite3* database handles cannot be moved from one thread
-** to another. This logic makes sure a user does not try to do that
-** by mistake.
+** Helper functions to obtain and relinquish the global mutex. The
+** global mutex is used to protect the unixOpenCnt, unixLockInfo and
+** vxworksFileId objects used by this file, all of which may be
+** shared by multiple threads.
**
-** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to
-** another as long as we are running on a system that supports threads
-** overriding each others locks (which now the most common behavior)
-** or if no locks are held. But the unixFile.pLock field needs to be
-** recomputed because its key includes the thread-id. See the
-** transferOwnership() function below for additional information
+** Function unixMutexHeld() is used to assert() that the global mutex
+** is held when required. This function is only used as part of assert()
+** statements. e.g.
+**
+** unixEnterMutex()
+** assert( unixMutexHeld() );
+** unixEnterLeave()
*/
-#if SQLITE_THREADSAFE
-# define SET_THREADID(X) (X)->tid = pthread_self()
-# define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \
- !pthread_equal((X)->tid, pthread_self()))
-#else
-# define SET_THREADID(X)
-# define CHECK_THREADID(X) 0
+static void unixEnterMutex(void){
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
+}
+static void unixLeaveMutex(void){
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
+}
+#ifdef SQLITE_DEBUG
+static int unixMutexHeld(void) {
+ return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
+}
+#endif
+
+
+#ifdef SQLITE_DEBUG
+/*
+** Helper function for printing out trace information from debugging
+** binaries. This returns the string represetation of the supplied
+** integer lock-type.
+*/
+static const char *locktypeName(int locktype){
+ switch( locktype ){
+ case NO_LOCK: return "NONE";
+ case SHARED_LOCK: return "SHARED";
+ case RESERVED_LOCK: return "RESERVED";
+ case PENDING_LOCK: return "PENDING";
+ case EXCLUSIVE_LOCK: return "EXCLUSIVE";
+ }
+ return "ERROR";
+}
#endif
+#ifdef SQLITE_LOCK_TRACE
+/*
+** Print out information about all locking operations.
+**
+** This routine is used for troubleshooting locks on multithreaded
+** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE
+** command-line option on the compiler. This code is normally
+** turned off.
+*/
+static int lockTrace(int fd, int op, struct flock *p){
+ char *zOpName, *zType;
+ int s;
+ int savedErrno;
+ if( op==F_GETLK ){
+ zOpName = "GETLK";
+ }else if( op==F_SETLK ){
+ zOpName = "SETLK";
+ }else{
+ s = fcntl(fd, op, p);
+ sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s);
+ return s;
+ }
+ if( p->l_type==F_RDLCK ){
+ zType = "RDLCK";
+ }else if( p->l_type==F_WRLCK ){
+ zType = "WRLCK";
+ }else if( p->l_type==F_UNLCK ){
+ zType = "UNLCK";
+ }else{
+ assert( 0 );
+ }
+ assert( p->l_whence==SEEK_SET );
+ s = fcntl(fd, op, p);
+ savedErrno = errno;
+ sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n",
+ threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len,
+ (int)p->l_pid, s);
+ if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){
+ struct flock l2;
+ l2 = *p;
+ fcntl(fd, F_GETLK, &l2);
+ if( l2.l_type==F_RDLCK ){
+ zType = "RDLCK";
+ }else if( l2.l_type==F_WRLCK ){
+ zType = "WRLCK";
+ }else if( l2.l_type==F_UNLCK ){
+ zType = "UNLCK";
+ }else{
+ assert( 0 );
+ }
+ sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n",
+ zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid);
+ }
+ errno = savedErrno;
+ return s;
+}
+#define fcntl lockTrace
+#endif /* SQLITE_LOCK_TRACE */
+
+
+
+/*
+** This routine translates a standard POSIX errno code into something
+** useful to the clients of the sqlite3 functions. Specifically, it is
+** intended to translate a variety of "try again" errors into SQLITE_BUSY
+** and a variety of "please close the file descriptor NOW" errors into
+** SQLITE_IOERR
+**
+** Errors during initialization of locks, or file system support for locks,
+** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately.
+*/
+static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) {
+ switch (posixError) {
+ case 0:
+ return SQLITE_OK;
+
+ case EAGAIN:
+ case ETIMEDOUT:
+ case EBUSY:
+ case EINTR:
+ case ENOLCK:
+ /* random NFS retry error, unless during file system support
+ * introspection, in which it actually means what it says */
+ return SQLITE_BUSY;
+
+ case EACCES:
+ /* EACCES is like EAGAIN during locking operations, but not any other time*/
+ if( (sqliteIOErr == SQLITE_IOERR_LOCK) ||
+ (sqliteIOErr == SQLITE_IOERR_UNLOCK) ||
+ (sqliteIOErr == SQLITE_IOERR_RDLOCK) ||
+ (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ){
+ return SQLITE_BUSY;
+ }
+ /* else fall through */
+ case EPERM:
+ return SQLITE_PERM;
+
+ case EDEADLK:
+ return SQLITE_IOERR_BLOCKED;
+
+#if EOPNOTSUPP!=ENOTSUP
+ case EOPNOTSUPP:
+ /* something went terribly awry, unless during file system support
+ * introspection, in which it actually means what it says */
+#endif
+#ifdef ENOTSUP
+ case ENOTSUP:
+ /* invalid fd, unless during file system support introspection, in which
+ * it actually means what it says */
+#endif
+ case EIO:
+ case EBADF:
+ case EINVAL:
+ case ENOTCONN:
+ case ENODEV:
+ case ENXIO:
+ case ENOENT:
+ case ESTALE:
+ case ENOSYS:
+ /* these should force the client to close the file and reconnect */
+
+ default:
+ return sqliteIOErr;
+ }
+}
+
+
+
+/******************************************************************************
+****************** Begin Unique File ID Utility Used By VxWorks ***************
+**
+** On most versions of unix, we can get a unique ID for a file by concatenating
+** the device number and the inode number. But this does not work on VxWorks.
+** On VxWorks, a unique file id must be based on the canonical filename.
+**
+** A pointer to an instance of the following structure can be used as a
+** unique file ID in VxWorks. Each instance of this structure contains
+** a copy of the canonical filename. There is also a reference count.
+** The structure is reclaimed when the number of pointers to it drops to
+** zero.
+**
+** There are never very many files open at one time and lookups are not
+** a performance-critical path, so it is sufficient to put these
+** structures on a linked list.
+*/
+struct vxworksFileId {
+ struct vxworksFileId *pNext; /* Next in a list of them all */
+ int nRef; /* Number of references to this one */
+ int nName; /* Length of the zCanonicalName[] string */
+ char *zCanonicalName; /* Canonical filename */
+};
+
+#if OS_VXWORKS
+/*
+** All unique filenames are held on a linked list headed by this
+** variable:
+*/
+static struct vxworksFileId *vxworksFileList = 0;
+
+/*
+** Simplify a filename into its canonical form
+** by making the following changes:
+**
+** * removing any trailing and duplicate /
+** * convert /./ into just /
+** * convert /A/../ where A is any simple name into just /
+**
+** Changes are made in-place. Return the new name length.
+**
+** The original filename is in z[0..n-1]. Return the number of
+** characters in the simplified name.
+*/
+static int vxworksSimplifyName(char *z, int n){
+ int i, j;
+ while( n>1 && z[n-1]=='/' ){ n--; }
+ for(i=j=0; i<n; i++){
+ if( z[i]=='/' ){
+ if( z[i+1]=='/' ) continue;
+ if( z[i+1]=='.' && i+2<n && z[i+2]=='/' ){
+ i += 1;
+ continue;
+ }
+ if( z[i+1]=='.' && i+3<n && z[i+2]=='.' && z[i+3]=='/' ){
+ while( j>0 && z[j-1]!='/' ){ j--; }
+ if( j>0 ){ j--; }
+ i += 2;
+ continue;
+ }
+ }
+ z[j++] = z[i];
+ }
+ z[j] = 0;
+ return j;
+}
+
/*
-** Here is the dirt on POSIX advisory locks: ANSI STD 1003.1 (1996)
+** Find a unique file ID for the given absolute pathname. Return
+** a pointer to the vxworksFileId object. This pointer is the unique
+** file ID.
+**
+** The nRef field of the vxworksFileId object is incremented before
+** the object is returned. A new vxworksFileId object is created
+** and added to the global list if necessary.
+**
+** If a memory allocation error occurs, return NULL.
+*/
+static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){
+ struct vxworksFileId *pNew; /* search key and new file ID */
+ struct vxworksFileId *pCandidate; /* For looping over existing file IDs */
+ int n; /* Length of zAbsoluteName string */
+
+ assert( zAbsoluteName[0]=='/' );
+ n = (int)strlen(zAbsoluteName);
+ pNew = sqlite3_malloc( sizeof(*pNew) + (n+1) );
+ if( pNew==0 ) return 0;
+ pNew->zCanonicalName = (char*)&pNew[1];
+ memcpy(pNew->zCanonicalName, zAbsoluteName, n+1);
+ n = vxworksSimplifyName(pNew->zCanonicalName, n);
+
+ /* Search for an existing entry that matching the canonical name.
+ ** If found, increment the reference count and return a pointer to
+ ** the existing file ID.
+ */
+ unixEnterMutex();
+ for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){
+ if( pCandidate->nName==n
+ && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0
+ ){
+ sqlite3_free(pNew);
+ pCandidate->nRef++;
+ unixLeaveMutex();
+ return pCandidate;
+ }
+ }
+
+ /* No match was found. We will make a new file ID */
+ pNew->nRef = 1;
+ pNew->nName = n;
+ pNew->pNext = vxworksFileList;
+ vxworksFileList = pNew;
+ unixLeaveMutex();
+ return pNew;
+}
+
+/*
+** Decrement the reference count on a vxworksFileId object. Free
+** the object when the reference count reaches zero.
+*/
+static void vxworksReleaseFileId(struct vxworksFileId *pId){
+ unixEnterMutex();
+ assert( pId->nRef>0 );
+ pId->nRef--;
+ if( pId->nRef==0 ){
+ struct vxworksFileId **pp;
+ for(pp=&vxworksFileList; *pp && *pp!=pId; pp = &((*pp)->pNext)){}
+ assert( *pp==pId );
+ *pp = pId->pNext;
+ sqlite3_free(pId);
+ }
+ unixLeaveMutex();
+}
+#endif /* OS_VXWORKS */
+/*************** End of Unique File ID Utility Used By VxWorks ****************
+******************************************************************************/
+
+
+/******************************************************************************
+*************************** Posix Advisory Locking ****************************
+**
+** POSIX advisory locks are broken by design. ANSI STD 1003.1 (1996)
** section 6.5.2.2 lines 483 through 490 specify that when a process
** sets or clears a lock, that operation overrides any prior locks set
** by the same process. It does not explicitly say so, but this implies
@@ -19080,9 +22193,8 @@ SQLITE_API int sqlite3_open_file_count = 0;
** second overrides the first, even though they were on different
** file descriptors opened on different file names.
**
-** Bummer. If you ask me, this is broken. Badly broken. It means
-** that we cannot use POSIX locks to synchronize file access among
-** competing threads of the same process. POSIX locks will work fine
+** This means that we cannot use POSIX locks to synchronize file access
+** among competing threads of the same process. POSIX locks will work fine
** to synchronize access for threads in separate processes, but not
** threads within the same process.
**
@@ -19095,6 +22207,10 @@ SQLITE_API int sqlite3_open_file_count = 0;
** locks to see if another thread has previously set a lock on that same
** inode.
**
+** (Aside: The use of inode numbers as unique IDs does not work on VxWorks.
+** For VxWorks, we have to use the alternative unique ID system based on
+** canonical filename and implemented in the previous division.)
+**
** The sqlite3_file structure for POSIX is no longer just an integer file
** descriptor. It is now a structure that holds the integer file
** descriptor and a pointer to a structure that describes the internal
@@ -19111,96 +22227,114 @@ SQLITE_API int sqlite3_open_file_count = 0;
** POSIX lock if the internal lock structure transitions between
** a locked and an unlocked state.
**
-** 2004-Jan-11:
-** More recent discoveries about POSIX advisory locks. (The more
-** I discover, the more I realize the a POSIX advisory locks are
-** an abomination.)
+** But wait: there are yet more problems with POSIX advisory locks.
**
** If you close a file descriptor that points to a file that has locks,
** all locks on that file that are owned by the current process are
** released. To work around this problem, each unixFile structure contains
-** a pointer to an openCnt structure. There is one openCnt structure
+** a pointer to an unixOpenCnt structure. There is one unixOpenCnt structure
** per open inode, which means that multiple unixFile can point to a single
-** openCnt. When an attempt is made to close an unixFile, if there are
+** unixOpenCnt. When an attempt is made to close an unixFile, if there are
** other unixFile open on the same inode that are holding locks, the call
** to close() the file descriptor is deferred until all of the locks clear.
-** The openCnt structure keeps a list of file descriptors that need to
+** The unixOpenCnt structure keeps a list of file descriptors that need to
** be closed and that list is walked (and cleared) when the last lock
** clears.
**
-** First, under Linux threads, because each thread has a separate
-** process ID, lock operations in one thread do not override locks
-** to the same file in other threads. Linux threads behave like
-** separate processes in this respect. But, if you close a file
-** descriptor in linux threads, all locks are cleared, even locks
-** on other threads and even though the other threads have different
-** process IDs. Linux threads is inconsistent in this respect.
-** (I'm beginning to think that linux threads is an abomination too.)
-** The consequence of this all is that the hash table for the lockInfo
-** structure has to include the process id as part of its key because
-** locks in different threads are treated as distinct. But the
-** openCnt structure should not include the process id in its
-** key because close() clears lock on all threads, not just the current
-** thread. Were it not for this goofiness in linux threads, we could
-** combine the lockInfo and openCnt structures into a single structure.
-**
-** 2004-Jun-28:
-** On some versions of linux, threads can override each others locks.
-** On others not. Sometimes you can change the behavior on the same
-** system by setting the LD_ASSUME_KERNEL environment variable. The
-** POSIX standard is silent as to which behavior is correct, as far
-** as I can tell, so other versions of unix might show the same
-** inconsistency. There is no little doubt in my mind that posix
-** advisory locks and linux threads are profoundly broken.
-**
-** To work around the inconsistencies, we have to test at runtime
-** whether or not threads can override each others locks. This test
-** is run once, the first time any lock is attempted. A static
-** variable is set to record the results of this test for future
-** use.
+** Yet another problem: LinuxThreads do not play well with posix locks.
+**
+** Many older versions of linux use the LinuxThreads library which is
+** not posix compliant. Under LinuxThreads, a lock created by thread
+** A cannot be modified or overridden by a different thread B.
+** Only thread A can modify the lock. Locking behavior is correct
+** if the appliation uses the newer Native Posix Thread Library (NPTL)
+** on linux - with NPTL a lock created by thread A can override locks
+** in thread B. But there is no way to know at compile-time which
+** threading library is being used. So there is no way to know at
+** compile-time whether or not thread A can override locks on thread B.
+** We have to do a run-time check to discover the behavior of the
+** current process.
+**
+** On systems where thread A is unable to modify locks created by
+** thread B, we have to keep track of which thread created each
+** lock. Hence there is an extra field in the key to the unixLockInfo
+** structure to record this information. And on those systems it
+** is illegal to begin a transaction in one thread and finish it
+** in another. For this latter restriction, there is no work-around.
+** It is a limitation of LinuxThreads.
+*/
+
+/*
+** Set or check the unixFile.tid field. This field is set when an unixFile
+** is first opened. All subsequent uses of the unixFile verify that the
+** same thread is operating on the unixFile. Some operating systems do
+** not allow locks to be overridden by other threads and that restriction
+** means that sqlite3* database handles cannot be moved from one thread
+** to another while locks are held.
+**
+** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to
+** another as long as we are running on a system that supports threads
+** overriding each others locks (which is now the most common behavior)
+** or if no locks are held. But the unixFile.pLock field needs to be
+** recomputed because its key includes the thread-id. See the
+** transferOwnership() function below for additional information
+*/
+#if SQLITE_THREADSAFE && defined(__linux__)
+# define SET_THREADID(X) (X)->tid = pthread_self()
+# define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \
+ !pthread_equal((X)->tid, pthread_self()))
+#else
+# define SET_THREADID(X)
+# define CHECK_THREADID(X) 0
+#endif
+
+/*
+** An instance of the following structure serves as the key used
+** to locate a particular unixOpenCnt structure given its inode. This
+** is the same as the unixLockKey except that the thread ID is omitted.
*/
+struct unixFileId {
+ dev_t dev; /* Device number */
+#if OS_VXWORKS
+ struct vxworksFileId *pId; /* Unique file ID for vxworks. */
+#else
+ ino_t ino; /* Inode number */
+#endif
+};
/*
** An instance of the following structure serves as the key used
-** to locate a particular lockInfo structure given its inode.
+** to locate a particular unixLockInfo structure given its inode.
**
-** If threads cannot override each others locks, then we set the
-** lockKey.tid field to the thread ID. If threads can override
-** each others locks then tid is always set to zero. tid is omitted
-** if we compile without threading support.
+** If threads cannot override each others locks (LinuxThreads), then we
+** set the unixLockKey.tid field to the thread ID. If threads can override
+** each others locks (Posix and NPTL) then tid is always set to zero.
+** tid is omitted if we compile without threading support or on an OS
+** other than linux.
*/
-struct lockKey {
- dev_t dev; /* Device number */
- ino_t ino; /* Inode number */
-#if SQLITE_THREADSAFE
- pthread_t tid; /* Thread ID or zero if threads can override each other */
+struct unixLockKey {
+ struct unixFileId fid; /* Unique identifier for the file */
+#if SQLITE_THREADSAFE && defined(__linux__)
+ pthread_t tid; /* Thread ID of lock owner. Zero if not using LinuxThreads */
#endif
};
/*
** An instance of the following structure is allocated for each open
-** inode on each thread with a different process ID. (Threads have
-** different process IDs on linux, but not on most other unixes.)
+** inode. Or, on LinuxThreads, there is one of these structures for
+** each inode opened by each thread.
**
** A single inode can have multiple file descriptors, so each unixFile
** structure contains a pointer to an instance of this object and this
** object keeps a count of the number of unixFile pointing to it.
*/
-struct lockInfo {
- struct lockKey key; /* The lookup key */
- int cnt; /* Number of SHARED locks held */
- int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
- int nRef; /* Number of pointers to this structure */
-};
-
-/*
-** An instance of the following structure serves as the key used
-** to locate a particular openCnt structure given its inode. This
-** is the same as the lockKey except that the thread ID is omitted.
-*/
-struct openKey {
- dev_t dev; /* Device number */
- ino_t ino; /* Inode number */
+struct unixLockInfo {
+ struct unixLockKey lockKey; /* The lookup key */
+ int cnt; /* Number of SHARED locks held */
+ int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
+ int nRef; /* Number of pointers to this structure */
+ struct unixLockInfo *pNext; /* List of all unixLockInfo objects */
+ struct unixLockInfo *pPrev; /* .... doubly linked */
};
/*
@@ -19209,66 +22343,39 @@ struct openKey {
** inode. If a close is attempted against an inode that is holding
** locks, the close is deferred until all locks clear by adding the
** file descriptor to be closed to the pending list.
-*/
-struct openCnt {
- struct openKey key; /* The lookup key */
- int nRef; /* Number of pointers to this structure */
- int nLock; /* Number of outstanding locks */
- int nPending; /* Number of pending close() operations */
- int *aPending; /* Malloced space holding fd's awaiting a close() */
+**
+** TODO: Consider changing this so that there is only a single file
+** descriptor for each open file, even when it is opened multiple times.
+** The close() system call would only occur when the last database
+** using the file closes.
+*/
+struct unixOpenCnt {
+ struct unixFileId fileId; /* The lookup key */
+ int nRef; /* Number of pointers to this structure */
+ int nLock; /* Number of outstanding locks */
+ UnixUnusedFd *pUnused; /* Unused file descriptors to close */
+#if OS_VXWORKS
+ sem_t *pSem; /* Named POSIX semaphore */
+ char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */
+#endif
+ struct unixOpenCnt *pNext, *pPrev; /* List of all unixOpenCnt objects */
};
-/*
-** These hash tables map inodes and file descriptors (really, lockKey and
-** openKey structures) into lockInfo and openCnt structures. Access to
-** these hash tables must be protected by a mutex.
-*/
-static Hash lockHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0};
-static Hash openHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0};
-
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
-/*
-** The locking styles are associated with the different file locking
-** capabilities supported by different file systems.
-**
-** POSIX locking style fully supports shared and exclusive byte-range locks
-** ADP locking only supports exclusive byte-range locks
-** FLOCK only supports a single file-global exclusive lock
-** DOTLOCK isn't a true locking style, it refers to the use of a special
-** file named the same as the database file with a '.lock' extension, this
-** can be used on file systems that do not offer any reliable file locking
-** NO locking means that no locking will be attempted, this is only used for
-** read-only file systems currently
-** UNSUPPORTED means that no locking will be attempted, this is only used for
-** file systems that are known to be unsupported
-*/
-typedef enum {
- posixLockingStyle = 0, /* standard posix-advisory locks */
- afpLockingStyle, /* use afp locks */
- flockLockingStyle, /* use flock() */
- dotlockLockingStyle, /* use <file>.lock files */
- noLockingStyle, /* useful for read-only file system */
- unsupportedLockingStyle /* indicates unsupported file system */
-} sqlite3LockingStyle;
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
-
/*
-** Helper functions to obtain and relinquish the global mutex.
+** Lists of all unixLockInfo and unixOpenCnt objects. These used to be hash
+** tables. But the number of objects is rarely more than a dozen and
+** never exceeds a few thousand. And lookup is not on a critical
+** path so a simple linked list will suffice.
*/
-static void enterMutex(){
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
-}
-static void leaveMutex(){
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER));
-}
+static struct unixLockInfo *lockList = 0;
+static struct unixOpenCnt *openList = 0;
-#if SQLITE_THREADSAFE
/*
-** This variable records whether or not threads can override each others
+** This variable remembers whether or not threads can override each others
** locks.
**
-** 0: No. Threads cannot override each others locks.
-** 1: Yes. Threads can override each others locks.
+** 0: No. Threads cannot override each others locks. (LinuxThreads)
+** 1: Yes. Threads can override each others locks. (Posix & NLPT)
** -1: We don't know yet.
**
** On some systems, we know at compile-time if threads can override each
@@ -19281,13 +22388,15 @@ static void leaveMutex(){
** it a global so that the test code can change its value in order to verify
** that the right stuff happens in either case.
*/
-#ifndef SQLITE_THREAD_OVERRIDE_LOCK
-# define SQLITE_THREAD_OVERRIDE_LOCK -1
-#endif
-#ifdef SQLITE_TEST
+#if SQLITE_THREADSAFE && defined(__linux__)
+# ifndef SQLITE_THREAD_OVERRIDE_LOCK
+# define SQLITE_THREAD_OVERRIDE_LOCK -1
+# endif
+# ifdef SQLITE_TEST
int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
-#else
+# else
static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK;
+# endif
#endif
/*
@@ -19300,78 +22409,25 @@ struct threadTestData {
int result; /* Result of the locking operation */
};
-#ifdef SQLITE_LOCK_TRACE
+#if SQLITE_THREADSAFE && defined(__linux__)
/*
-** Print out information about all locking operations.
+** This function is used as the main routine for a thread launched by
+** testThreadLockingBehavior(). It tests whether the shared-lock obtained
+** by the main thread in testThreadLockingBehavior() conflicts with a
+** hypothetical write-lock obtained by this thread on the same file.
**
-** This routine is used for troubleshooting locks on multithreaded
-** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE
-** command-line option on the compiler. This code is normally
-** turned off.
-*/
-static int lockTrace(int fd, int op, struct flock *p){
- char *zOpName, *zType;
- int s;
- int savedErrno;
- if( op==F_GETLK ){
- zOpName = "GETLK";
- }else if( op==F_SETLK ){
- zOpName = "SETLK";
- }else{
- s = fcntl(fd, op, p);
- sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s);
- return s;
- }
- if( p->l_type==F_RDLCK ){
- zType = "RDLCK";
- }else if( p->l_type==F_WRLCK ){
- zType = "WRLCK";
- }else if( p->l_type==F_UNLCK ){
- zType = "UNLCK";
- }else{
- assert( 0 );
- }
- assert( p->l_whence==SEEK_SET );
- s = fcntl(fd, op, p);
- savedErrno = errno;
- sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n",
- threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len,
- (int)p->l_pid, s);
- if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){
- struct flock l2;
- l2 = *p;
- fcntl(fd, F_GETLK, &l2);
- if( l2.l_type==F_RDLCK ){
- zType = "RDLCK";
- }else if( l2.l_type==F_WRLCK ){
- zType = "WRLCK";
- }else if( l2.l_type==F_UNLCK ){
- zType = "UNLCK";
- }else{
- assert( 0 );
- }
- sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n",
- zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid);
- }
- errno = savedErrno;
- return s;
-}
-#define fcntl lockTrace
-#endif /* SQLITE_LOCK_TRACE */
-
-/*
-** The testThreadLockingBehavior() routine launches two separate
-** threads on this routine. This routine attempts to lock a file
-** descriptor then returns. The success or failure of that attempt
-** allows the testThreadLockingBehavior() procedure to determine
-** whether or not threads can override each others locks.
-*/
+** The write-lock is not actually acquired, as this is not possible if
+** the file is open in read-only mode (see ticket #3472).
+*/
static void *threadLockingTest(void *pArg){
struct threadTestData *pData = (struct threadTestData*)pArg;
- pData->result = fcntl(pData->fd, F_SETLK, &pData->lock);
+ pData->result = fcntl(pData->fd, F_GETLK, &pData->lock);
return pArg;
}
+#endif /* SQLITE_THREADSAFE && defined(__linux__) */
+
+#if SQLITE_THREADSAFE && defined(__linux__)
/*
** This procedure attempts to determine whether or not threads
** can override each others locks then sets the
@@ -19379,214 +22435,216 @@ static void *threadLockingTest(void *pArg){
*/
static void testThreadLockingBehavior(int fd_orig){
int fd;
- struct threadTestData d[2];
- pthread_t t[2];
+ int rc;
+ struct threadTestData d;
+ struct flock l;
+ pthread_t t;
fd = dup(fd_orig);
if( fd<0 ) return;
- memset(d, 0, sizeof(d));
- d[0].fd = fd;
- d[0].lock.l_type = F_RDLCK;
- d[0].lock.l_len = 1;
- d[0].lock.l_start = 0;
- d[0].lock.l_whence = SEEK_SET;
- d[1] = d[0];
- d[1].lock.l_type = F_WRLCK;
- pthread_create(&t[0], 0, threadLockingTest, &d[0]);
- pthread_create(&t[1], 0, threadLockingTest, &d[1]);
- pthread_join(t[0], 0);
- pthread_join(t[1], 0);
- close(fd);
- threadsOverrideEachOthersLocks = d[0].result==0 && d[1].result==0;
-}
-#endif /* SQLITE_THREADSAFE */
-
-/*
-** Release a lockInfo structure previously allocated by findLockInfo().
-*/
-static void releaseLockInfo(struct lockInfo *pLock){
- if (pLock == NULL)
- return;
- pLock->nRef--;
- if( pLock->nRef==0 ){
- sqlite3HashInsert(&lockHash, &pLock->key, sizeof(pLock->key), 0);
- sqlite3_free(pLock);
+ memset(&l, 0, sizeof(l));
+ l.l_type = F_RDLCK;
+ l.l_len = 1;
+ l.l_start = 0;
+ l.l_whence = SEEK_SET;
+ rc = fcntl(fd_orig, F_SETLK, &l);
+ if( rc!=0 ) return;
+ memset(&d, 0, sizeof(d));
+ d.fd = fd;
+ d.lock = l;
+ d.lock.l_type = F_WRLCK;
+ if( pthread_create(&t, 0, threadLockingTest, &d)==0 ){
+ pthread_join(t, 0);
}
+ close(fd);
+ if( d.result!=0 ) return;
+ threadsOverrideEachOthersLocks = (d.lock.l_type==F_UNLCK);
}
+#endif /* SQLITE_THREADSAFE && defined(__linux__) */
/*
-** Release a openCnt structure previously allocated by findLockInfo().
+** Release a unixLockInfo structure previously allocated by findLockInfo().
+**
+** The mutex entered using the unixEnterMutex() function must be held
+** when this function is called.
*/
-static void releaseOpenCnt(struct openCnt *pOpen){
- if (pOpen == NULL)
- return;
- pOpen->nRef--;
- if( pOpen->nRef==0 ){
- sqlite3HashInsert(&openHash, &pOpen->key, sizeof(pOpen->key), 0);
- free(pOpen->aPending);
- sqlite3_free(pOpen);
+static void releaseLockInfo(struct unixLockInfo *pLock){
+ assert( unixMutexHeld() );
+ if( pLock ){
+ pLock->nRef--;
+ if( pLock->nRef==0 ){
+ if( pLock->pPrev ){
+ assert( pLock->pPrev->pNext==pLock );
+ pLock->pPrev->pNext = pLock->pNext;
+ }else{
+ assert( lockList==pLock );
+ lockList = pLock->pNext;
+ }
+ if( pLock->pNext ){
+ assert( pLock->pNext->pPrev==pLock );
+ pLock->pNext->pPrev = pLock->pPrev;
+ }
+ sqlite3_free(pLock);
+ }
}
}
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
/*
-** Tests a byte-range locking query to see if byte range locks are
-** supported, if not we fall back to dotlockLockingStyle.
+** Release a unixOpenCnt structure previously allocated by findLockInfo().
+**
+** The mutex entered using the unixEnterMutex() function must be held
+** when this function is called.
*/
-static sqlite3LockingStyle sqlite3TestLockingStyle(
- const char *filePath,
- int fd
-){
- /* test byte-range lock using fcntl */
- struct flock lockInfo;
-
- lockInfo.l_len = 1;
- lockInfo.l_start = 0;
- lockInfo.l_whence = SEEK_SET;
- lockInfo.l_type = F_RDLCK;
-
- if( fcntl(fd, F_GETLK, &lockInfo)!=-1 ) {
- return posixLockingStyle;
- }
-
- /* testing for flock can give false positives. So if if the above test
- ** fails, then we fall back to using dot-lock style locking.
- */
- return dotlockLockingStyle;
-}
-
-/*
-** Examines the f_fstypename entry in the statfs structure as returned by
-** stat() for the file system hosting the database file, assigns the
-** appropriate locking style based on its value. These values and
-** assignments are based on Darwin/OSX behavior and have not been tested on
-** other systems.
-*/
-static sqlite3LockingStyle sqlite3DetectLockingStyle(
- const char *filePath,
- int fd
-){
-
-#ifdef SQLITE_FIXED_LOCKING_STYLE
- return (sqlite3LockingStyle)SQLITE_FIXED_LOCKING_STYLE;
-#else
- struct statfs fsInfo;
+static void releaseOpenCnt(struct unixOpenCnt *pOpen){
+ assert( unixMutexHeld() );
+ if( pOpen ){
+ pOpen->nRef--;
+ if( pOpen->nRef==0 ){
+ if( pOpen->pPrev ){
+ assert( pOpen->pPrev->pNext==pOpen );
+ pOpen->pPrev->pNext = pOpen->pNext;
+ }else{
+ assert( openList==pOpen );
+ openList = pOpen->pNext;
+ }
+ if( pOpen->pNext ){
+ assert( pOpen->pNext->pPrev==pOpen );
+ pOpen->pNext->pPrev = pOpen->pPrev;
+ }
+#if SQLITE_THREADSAFE && defined(__linux__)
+ assert( !pOpen->pUnused || threadsOverrideEachOthersLocks==0 );
+#endif
- if( statfs(filePath, &fsInfo) == -1 ){
- return sqlite3TestLockingStyle(filePath, fd);
- }
- if( fsInfo.f_flags & MNT_RDONLY ){
- return noLockingStyle;
- }
- if( strcmp(fsInfo.f_fstypename, "hfs")==0 ||
- strcmp(fsInfo.f_fstypename, "ufs")==0 ){
- return posixLockingStyle;
- }
- if( strcmp(fsInfo.f_fstypename, "afpfs")==0 ){
- return afpLockingStyle;
- }
- if( strcmp(fsInfo.f_fstypename, "nfs")==0 ){
- return sqlite3TestLockingStyle(filePath, fd);
- }
- if( strcmp(fsInfo.f_fstypename, "smbfs")==0 ){
- return flockLockingStyle;
- }
- if( strcmp(fsInfo.f_fstypename, "msdos")==0 ){
- return dotlockLockingStyle;
- }
- if( strcmp(fsInfo.f_fstypename, "webdav")==0 ){
- return unsupportedLockingStyle;
+ /* If pOpen->pUnused is not null, then memory and file-descriptors
+ ** are leaked.
+ **
+ ** This will only happen if, under Linuxthreads, the user has opened
+ ** a transaction in one thread, then attempts to close the database
+ ** handle from another thread (without first unlocking the db file).
+ ** This is a misuse. */
+ sqlite3_free(pOpen);
+ }
}
- return sqlite3TestLockingStyle(filePath, fd);
-#endif /* SQLITE_FIXED_LOCKING_STYLE */
}
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
-
/*
-** Given a file descriptor, locate lockInfo and openCnt structures that
+** Given a file descriptor, locate unixLockInfo and unixOpenCnt structures that
** describes that file descriptor. Create new ones if necessary. The
** return values might be uninitialized if an error occurs.
**
+** The mutex entered using the unixEnterMutex() function must be held
+** when this function is called.
+**
** Return an appropriate error code.
*/
static int findLockInfo(
- int fd, /* The file descriptor used in the key */
- struct lockInfo **ppLock, /* Return the lockInfo structure here */
- struct openCnt **ppOpen /* Return the openCnt structure here */
+ unixFile *pFile, /* Unix file with file desc used in the key */
+ struct unixLockInfo **ppLock, /* Return the unixLockInfo structure here */
+ struct unixOpenCnt **ppOpen /* Return the unixOpenCnt structure here */
){
- int rc;
- struct lockKey key1;
- struct openKey key2;
- struct stat statbuf;
- struct lockInfo *pLock;
- struct openCnt *pOpen;
+ int rc; /* System call return code */
+ int fd; /* The file descriptor for pFile */
+ struct unixLockKey lockKey; /* Lookup key for the unixLockInfo structure */
+ struct unixFileId fileId; /* Lookup key for the unixOpenCnt struct */
+ struct stat statbuf; /* Low-level file information */
+ struct unixLockInfo *pLock = 0;/* Candidate unixLockInfo object */
+ struct unixOpenCnt *pOpen; /* Candidate unixOpenCnt object */
+
+ assert( unixMutexHeld() );
+
+ /* Get low-level information about the file that we can used to
+ ** create a unique name for the file.
+ */
+ fd = pFile->h;
rc = fstat(fd, &statbuf);
if( rc!=0 ){
+ pFile->lastErrno = errno;
#ifdef EOVERFLOW
- if( errno==EOVERFLOW ) return SQLITE_NOLFS;
+ if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS;
#endif
return SQLITE_IOERR;
}
- memset(&key1, 0, sizeof(key1));
- key1.dev = statbuf.st_dev;
- key1.ino = statbuf.st_ino;
-#if SQLITE_THREADSAFE
+#ifdef __APPLE__
+ /* On OS X on an msdos filesystem, the inode number is reported
+ ** incorrectly for zero-size files. See ticket #3260. To work
+ ** around this problem (we consider it a bug in OS X, not SQLite)
+ ** we always increase the file size to 1 by writing a single byte
+ ** prior to accessing the inode number. The one byte written is
+ ** an ASCII 'S' character which also happens to be the first byte
+ ** in the header of every SQLite database. In this way, if there
+ ** is a race condition such that another thread has already populated
+ ** the first page of the database, no damage is done.
+ */
+ if( statbuf.st_size==0 ){
+ rc = write(fd, "S", 1);
+ if( rc!=1 ){
+ return SQLITE_IOERR;
+ }
+ rc = fstat(fd, &statbuf);
+ if( rc!=0 ){
+ pFile->lastErrno = errno;
+ return SQLITE_IOERR;
+ }
+ }
+#endif
+
+ memset(&lockKey, 0, sizeof(lockKey));
+ lockKey.fid.dev = statbuf.st_dev;
+#if OS_VXWORKS
+ lockKey.fid.pId = pFile->pId;
+#else
+ lockKey.fid.ino = statbuf.st_ino;
+#endif
+#if SQLITE_THREADSAFE && defined(__linux__)
if( threadsOverrideEachOthersLocks<0 ){
testThreadLockingBehavior(fd);
}
- key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
+ lockKey.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self();
#endif
- memset(&key2, 0, sizeof(key2));
- key2.dev = statbuf.st_dev;
- key2.ino = statbuf.st_ino;
- pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1));
- if( pLock==0 ){
- struct lockInfo *pOld;
- pLock = sqlite3_malloc( sizeof(*pLock) );
+ fileId = lockKey.fid;
+ if( ppLock!=0 ){
+ pLock = lockList;
+ while( pLock && memcmp(&lockKey, &pLock->lockKey, sizeof(lockKey)) ){
+ pLock = pLock->pNext;
+ }
if( pLock==0 ){
- rc = SQLITE_NOMEM;
- goto exit_findlockinfo;
- }
- pLock->key = key1;
- pLock->nRef = 1;
- pLock->cnt = 0;
- pLock->locktype = 0;
- pOld = sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock);
- if( pOld!=0 ){
- assert( pOld==pLock );
- sqlite3_free(pLock);
- rc = SQLITE_NOMEM;
- goto exit_findlockinfo;
+ pLock = sqlite3_malloc( sizeof(*pLock) );
+ if( pLock==0 ){
+ rc = SQLITE_NOMEM;
+ goto exit_findlockinfo;
+ }
+ memcpy(&pLock->lockKey,&lockKey,sizeof(lockKey));
+ pLock->nRef = 1;
+ pLock->cnt = 0;
+ pLock->locktype = 0;
+ pLock->pNext = lockList;
+ pLock->pPrev = 0;
+ if( lockList ) lockList->pPrev = pLock;
+ lockList = pLock;
+ }else{
+ pLock->nRef++;
}
- }else{
- pLock->nRef++;
+ *ppLock = pLock;
}
- *ppLock = pLock;
if( ppOpen!=0 ){
- pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2));
+ pOpen = openList;
+ while( pOpen && memcmp(&fileId, &pOpen->fileId, sizeof(fileId)) ){
+ pOpen = pOpen->pNext;
+ }
if( pOpen==0 ){
- struct openCnt *pOld;
pOpen = sqlite3_malloc( sizeof(*pOpen) );
if( pOpen==0 ){
releaseLockInfo(pLock);
rc = SQLITE_NOMEM;
goto exit_findlockinfo;
}
- pOpen->key = key2;
+ memset(pOpen, 0, sizeof(*pOpen));
+ pOpen->fileId = fileId;
pOpen->nRef = 1;
- pOpen->nLock = 0;
- pOpen->nPending = 0;
- pOpen->aPending = 0;
- pOld = sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen);
- if( pOld!=0 ){
- assert( pOld==pOpen );
- sqlite3_free(pOpen);
- releaseLockInfo(pLock);
- rc = SQLITE_NOMEM;
- goto exit_findlockinfo;
- }
+ pOpen->pNext = openList;
+ if( openList ) openList->pPrev = pOpen;
+ openList = pOpen;
}else{
pOpen->nRef++;
}
@@ -19597,38 +22655,18 @@ exit_findlockinfo:
return rc;
}
-#ifdef SQLITE_DEBUG
-/*
-** Helper function for printing out trace information from debugging
-** binaries. This returns the string represetation of the supplied
-** integer lock-type.
-*/
-static const char *locktypeName(int locktype){
- switch( locktype ){
- case NO_LOCK: return "NONE";
- case SHARED_LOCK: return "SHARED";
- case RESERVED_LOCK: return "RESERVED";
- case PENDING_LOCK: return "PENDING";
- case EXCLUSIVE_LOCK: return "EXCLUSIVE";
- }
- return "ERROR";
-}
-#endif
-
/*
** If we are currently in a different thread than the thread that the
** unixFile argument belongs to, then transfer ownership of the unixFile
** over to the current thread.
**
-** A unixFile is only owned by a thread on systems where one thread is
-** unable to override locks created by a different thread. RedHat9 is
-** an example of such a system.
+** A unixFile is only owned by a thread on systems that use LinuxThreads.
**
** Ownership transfer is only allowed if the unixFile is currently unlocked.
** If the unixFile is locked and an ownership is wrong, then return
** SQLITE_MISUSE. SQLITE_OK is returned if everything works.
*/
-#if SQLITE_THREADSAFE
+#if SQLITE_THREADSAFE && defined(__linux__)
static int transferOwnership(unixFile *pFile){
int rc;
pthread_t hSelf;
@@ -19651,7 +22689,7 @@ static int transferOwnership(unixFile *pFile){
pFile->tid = hSelf;
if (pFile->pLock != NULL) {
releaseLockInfo(pFile->pLock);
- rc = findLockInfo(pFile->h, &pFile->pLock, 0);
+ rc = findLockInfo(pFile, &pFile->pLock, 0);
OSTRACE5("LOCK %d is now %s(%s,%d)\n", pFile->h,
locktypeName(pFile->locktype),
locktypeName(pFile->pLock->locktype), pFile->pLock->cnt);
@@ -19660,339 +22698,113 @@ static int transferOwnership(unixFile *pFile){
return SQLITE_OK;
}
}
-#else
+#else /* if not SQLITE_THREADSAFE */
/* On single-threaded builds, ownership transfer is a no-op */
# define transferOwnership(X) SQLITE_OK
-#endif
-
-/*
-** Seek to the offset passed as the second argument, then read cnt
-** bytes into pBuf. Return the number of bytes actually read.
-**
-** NB: If you define USE_PREAD or USE_PREAD64, then it might also
-** be necessary to define _XOPEN_SOURCE to be 500. This varies from
-** one system to another. Since SQLite does not define USE_PREAD
-** any any form by default, we will not attempt to define _XOPEN_SOURCE.
-** See tickets #2741 and #2681.
-*/
-static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){
- int got;
- i64 newOffset;
- TIMER_START;
-#if defined(USE_PREAD)
- got = pread(id->h, pBuf, cnt, offset);
- SimulateIOError( got = -1 );
-#elif defined(USE_PREAD64)
- got = pread64(id->h, pBuf, cnt, offset);
- SimulateIOError( got = -1 );
-#else
- newOffset = lseek(id->h, offset, SEEK_SET);
- SimulateIOError( newOffset-- );
- if( newOffset!=offset ){
- return -1;
- }
- got = read(id->h, pBuf, cnt);
-#endif
- TIMER_END;
- OSTRACE5("READ %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED);
- return got;
-}
-
-/*
-** Read data from a file into a buffer. Return SQLITE_OK if all
-** bytes were read successfully and SQLITE_IOERR if anything goes
-** wrong.
-*/
-static int unixRead(
- sqlite3_file *id,
- void *pBuf,
- int amt,
- sqlite3_int64 offset
-){
- int got;
- assert( id );
- got = seekAndRead((unixFile*)id, offset, pBuf, amt);
- if( got==amt ){
- return SQLITE_OK;
- }else if( got<0 ){
- return SQLITE_IOERR_READ;
- }else{
- memset(&((char*)pBuf)[got], 0, amt-got);
- return SQLITE_IOERR_SHORT_READ;
- }
-}
-
-/*
-** Seek to the offset in id->offset then read cnt bytes into pBuf.
-** Return the number of bytes actually read. Update the offset.
-*/
-static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){
- int got;
- i64 newOffset;
- TIMER_START;
-#if defined(USE_PREAD)
- got = pwrite(id->h, pBuf, cnt, offset);
-#elif defined(USE_PREAD64)
- got = pwrite64(id->h, pBuf, cnt, offset);
-#else
- newOffset = lseek(id->h, offset, SEEK_SET);
- if( newOffset!=offset ){
- return -1;
- }
-# ifndef VXWORKS
- got = write(id->h, pBuf, cnt);
-# else
- got = write(id->h, (char *)pBuf, cnt);
-# endif
-#endif
- TIMER_END;
- OSTRACE5("WRITE %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED);
- return got;
-}
-
-
-/*
-** Write data from a buffer into a file. Return SQLITE_OK on success
-** or some other error code on failure.
-*/
-static int unixWrite(
- sqlite3_file *id,
- const void *pBuf,
- int amt,
- sqlite3_int64 offset
-){
- int wrote = 0;
- assert( id );
- assert( amt>0 );
- while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){
- amt -= wrote;
- offset += wrote;
- pBuf = &((char*)pBuf)[wrote];
- }
- SimulateIOError(( wrote=(-1), amt=1 ));
- SimulateDiskfullError(( wrote=0, amt=1 ));
- if( amt>0 ){
- if( wrote<0 ){
- return SQLITE_IOERR_WRITE;
- }else{
- return SQLITE_FULL;
- }
- }
- return SQLITE_OK;
-}
-
-#ifdef SQLITE_TEST
-/*
-** Count the number of fullsyncs and normal syncs. This is used to test
-** that syncs and fullsyncs are occuring at the right times.
-*/
-SQLITE_API int sqlite3_sync_count = 0;
-SQLITE_API int sqlite3_fullsync_count = 0;
-#endif
-
-/*
-** Use the fdatasync() API only if the HAVE_FDATASYNC macro is defined.
-** Otherwise use fsync() in its place.
-*/
-#ifndef HAVE_FDATASYNC
-# define fdatasync fsync
-#endif
-
-/*
-** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not
-** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently
-** only available on Mac OS X. But that could change.
-*/
-#ifdef F_FULLFSYNC
-# define HAVE_FULLFSYNC 1
-#else
-# define HAVE_FULLFSYNC 0
-#endif
-
-
-/*
-** The fsync() system call does not work as advertised on many
-** unix systems. The following procedure is an attempt to make
-** it work better.
-**
-** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful
-** for testing when we want to run through the test suite quickly.
-** You are strongly advised *not* to deploy with SQLITE_NO_SYNC
-** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash
-** or power failure will likely corrupt the database file.
-*/
-static int full_fsync(int fd, int fullSync, int dataOnly){
- int rc;
-
- /* Record the number of times that we do a normal fsync() and
- ** FULLSYNC. This is used during testing to verify that this procedure
- ** gets called with the correct arguments.
- */
-#ifdef SQLITE_TEST
- if( fullSync ) sqlite3_fullsync_count++;
- sqlite3_sync_count++;
-#endif
-
- /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
- ** no-op
- */
-#ifdef SQLITE_NO_SYNC
- rc = SQLITE_OK;
-#else
-
-#if HAVE_FULLFSYNC
- if( fullSync ){
- rc = fcntl(fd, F_FULLFSYNC, 0);
- }else{
- rc = 1;
- }
- /* If the FULLFSYNC failed, fall back to attempting an fsync().
- * It shouldn't be possible for fullfsync to fail on the local
- * file system (on OSX), so failure indicates that FULLFSYNC
- * isn't supported for this file system. So, attempt an fsync
- * and (for now) ignore the overhead of a superfluous fcntl call.
- * It'd be better to detect fullfsync support once and avoid
- * the fcntl call every time sync is called.
- */
- if( rc ) rc = fsync(fd);
-
-#else
- if( dataOnly ){
- rc = fdatasync(fd);
- }else{
- rc = fsync(fd);
- }
-#endif /* HAVE_FULLFSYNC */
-#endif /* defined(SQLITE_NO_SYNC) */
-
- return rc;
-}
-
-/*
-** Make sure all writes to a particular file are committed to disk.
-**
-** If dataOnly==0 then both the file itself and its metadata (file
-** size, access time, etc) are synced. If dataOnly!=0 then only the
-** file data is synced.
-**
-** Under Unix, also make sure that the directory entry for the file
-** has been created by fsync-ing the directory that contains the file.
-** If we do not do this and we encounter a power failure, the directory
-** entry for the journal might not exist after we reboot. The next
-** SQLite to access the file will not know that the journal exists (because
-** the directory entry for the journal was never created) and the transaction
-** will not roll back - possibly leading to database corruption.
-*/
-static int unixSync(sqlite3_file *id, int flags){
- int rc;
- unixFile *pFile = (unixFile*)id;
-
- int isDataOnly = (flags&SQLITE_SYNC_DATAONLY);
- int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL;
-
- /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
- assert((flags&0x0F)==SQLITE_SYNC_NORMAL
- || (flags&0x0F)==SQLITE_SYNC_FULL
- );
-
- assert( pFile );
- OSTRACE2("SYNC %-3d\n", pFile->h);
- rc = full_fsync(pFile->h, isFullsync, isDataOnly);
- SimulateIOError( rc=1 );
- if( rc ){
- return SQLITE_IOERR_FSYNC;
- }
- if( pFile->dirfd>=0 ){
- OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
- HAVE_FULLFSYNC, isFullsync);
-#ifndef SQLITE_DISABLE_DIRSYNC
- /* The directory sync is only attempted if full_fsync is
- ** turned off or unavailable. If a full_fsync occurred above,
- ** then the directory sync is superfluous.
- */
- if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){
- /*
- ** We have received multiple reports of fsync() returning
- ** errors when applied to directories on certain file systems.
- ** A failed directory sync is not a big deal. So it seems
- ** better to ignore the error. Ticket #1657
- */
- /* return SQLITE_IOERR; */
- }
-#endif
- close(pFile->dirfd); /* Only need to sync once, so close the directory */
- pFile->dirfd = -1; /* when we are done. */
- }
- return SQLITE_OK;
-}
-
-/*
-** Truncate an open file to a specified size
-*/
-static int unixTruncate(sqlite3_file *id, i64 nByte){
- int rc;
- assert( id );
- SimulateIOError( return SQLITE_IOERR_TRUNCATE );
- rc = ftruncate(((unixFile*)id)->h, (off_t)nByte);
- if( rc ){
- return SQLITE_IOERR_TRUNCATE;
- }else{
- return SQLITE_OK;
- }
-}
+#endif /* SQLITE_THREADSAFE */
-/*
-** Determine the current size of a file in bytes
-*/
-static int unixFileSize(sqlite3_file *id, i64 *pSize){
- int rc;
- struct stat buf;
- assert( id );
- rc = fstat(((unixFile*)id)->h, &buf);
- SimulateIOError( rc=1 );
- if( rc!=0 ){
- return SQLITE_IOERR_FSTAT;
- }
- *pSize = buf.st_size;
- return SQLITE_OK;
-}
/*
** This routine checks if there is a RESERVED lock held on the specified
-** file by this or any other process. If such a lock is held, return
-** non-zero. If the file is unlocked or holds only SHARED locks, then
-** return zero.
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
*/
-static int unixCheckReservedLock(sqlite3_file *id){
- int r = 0;
+static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
+ int rc = SQLITE_OK;
+ int reserved = 0;
unixFile *pFile = (unixFile*)id;
+ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
+
assert( pFile );
- enterMutex(); /* Because pFile->pLock is shared across threads */
+ unixEnterMutex(); /* Because pFile->pLock is shared across threads */
/* Check if a thread in this process holds such a lock */
if( pFile->pLock->locktype>SHARED_LOCK ){
- r = 1;
+ reserved = 1;
}
/* Otherwise see if some other process holds it.
*/
- if( !r ){
+#ifndef __DJGPP__
+ if( !reserved ){
struct flock lock;
lock.l_whence = SEEK_SET;
lock.l_start = RESERVED_BYTE;
lock.l_len = 1;
lock.l_type = F_WRLCK;
- fcntl(pFile->h, F_GETLK, &lock);
- if( lock.l_type!=F_UNLCK ){
- r = 1;
+ if (-1 == fcntl(pFile->h, F_GETLK, &lock)) {
+ int tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK);
+ pFile->lastErrno = tErrno;
+ } else if( lock.l_type!=F_UNLCK ){
+ reserved = 1;
}
}
+#endif
- leaveMutex();
- OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r);
+ unixLeaveMutex();
+ OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved);
- return r;
+ *pResOut = reserved;
+ return rc;
+}
+
+/*
+** Perform a file locking operation on a range of bytes in a file.
+** The "op" parameter should be one of F_RDLCK, F_WRLCK, or F_UNLCK.
+** Return 0 on success or -1 for failure. On failure, write the error
+** code into *pErrcode.
+**
+** If the SQLITE_WHOLE_FILE_LOCKING bit is clear, then only lock
+** the range of bytes on the locking page between SHARED_FIRST and
+** SHARED_SIZE. If SQLITE_WHOLE_FILE_LOCKING is set, then lock all
+** bytes from 0 up to but not including PENDING_BYTE, and all bytes
+** that follow SHARED_FIRST.
+**
+** In other words, of SQLITE_WHOLE_FILE_LOCKING if false (the historical
+** default case) then only lock a small range of bytes from SHARED_FIRST
+** through SHARED_FIRST+SHARED_SIZE-1. But if SQLITE_WHOLE_FILE_LOCKING is
+** true then lock every byte in the file except for PENDING_BYTE and
+** RESERVED_BYTE.
+**
+** SQLITE_WHOLE_FILE_LOCKING=true overlaps SQLITE_WHOLE_FILE_LOCKING=false
+** and so the locking schemes are compatible. One type of lock will
+** effectively exclude the other type. The reason for using the
+** SQLITE_WHOLE_FILE_LOCKING=true is that by indicating the full range
+** of bytes to be read or written, we give hints to NFS to help it
+** maintain cache coherency. On the other hand, whole file locking
+** is slower, so we don't want to use it except for NFS.
+*/
+static int rangeLock(unixFile *pFile, int op, int *pErrcode){
+ struct flock lock;
+ int rc;
+ lock.l_type = op;
+ lock.l_start = SHARED_FIRST;
+ lock.l_whence = SEEK_SET;
+ if( (pFile->fileFlags & SQLITE_WHOLE_FILE_LOCKING)==0 ){
+ lock.l_len = SHARED_SIZE;
+ rc = fcntl(pFile->h, F_SETLK, &lock);
+ *pErrcode = errno;
+ }else{
+ lock.l_len = 0;
+ rc = fcntl(pFile->h, F_SETLK, &lock);
+ *pErrcode = errno;
+ if( NEVER(op==F_UNLCK) || rc!=(-1) ){
+ lock.l_start = 0;
+ lock.l_len = PENDING_BYTE;
+ rc = fcntl(pFile->h, F_SETLK, &lock);
+ if( ALWAYS(op!=F_UNLCK) && rc==(-1) ){
+ *pErrcode = errno;
+ lock.l_type = F_UNLCK;
+ lock.l_start = SHARED_FIRST;
+ lock.l_len = 0;
+ fcntl(pFile->h, F_SETLK, &lock);
+ }
+ }
+ }
+ return rc;
}
/*
@@ -20060,9 +22872,10 @@ static int unixLock(sqlite3_file *id, int locktype){
*/
int rc = SQLITE_OK;
unixFile *pFile = (unixFile*)id;
- struct lockInfo *pLock = pFile->pLock;
+ struct unixLockInfo *pLock = pFile->pLock;
struct flock lock;
- int s;
+ int s = 0;
+ int tErrno;
assert( pFile );
OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d\n", pFile->h,
@@ -20071,7 +22884,7 @@ static int unixLock(sqlite3_file *id, int locktype){
/* If there is already a lock of this type or more restrictive on the
** unixFile, do nothing. Don't use the end_lock: exit path, as
- ** enterMutex() hasn't been called yet.
+ ** unixEnterMutex() hasn't been called yet.
*/
if( pFile->locktype>=locktype ){
OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h,
@@ -20079,7 +22892,10 @@ static int unixLock(sqlite3_file *id, int locktype){
return SQLITE_OK;
}
- /* Make sure the locking sequence is correct
+ /* Make sure the locking sequence is correct.
+ ** (1) We never move from unlocked to anything higher than shared lock.
+ ** (2) SQLite never explicitly requests a pendig lock.
+ ** (3) A shared lock is always held when a reserve lock is requested.
*/
assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
assert( locktype!=PENDING_LOCK );
@@ -20087,13 +22903,13 @@ static int unixLock(sqlite3_file *id, int locktype){
/* This mutex is needed because pFile->pLock is shared across threads
*/
- enterMutex();
+ unixEnterMutex();
/* Make sure the current thread owns the pFile.
*/
rc = transferOwnership(pFile);
if( rc!=SQLITE_OK ){
- leaveMutex();
+ unixLeaveMutex();
return rc;
}
pLock = pFile->pLock;
@@ -20123,14 +22939,13 @@ static int unixLock(sqlite3_file *id, int locktype){
goto end_lock;
}
- lock.l_len = 1L;
-
- lock.l_whence = SEEK_SET;
/* A PENDING lock is needed before acquiring a SHARED lock and before
** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
** be released.
*/
+ lock.l_len = 1L;
+ lock.l_whence = SEEK_SET;
if( locktype==SHARED_LOCK
|| (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
){
@@ -20138,7 +22953,11 @@ static int unixLock(sqlite3_file *id, int locktype){
lock.l_start = PENDING_BYTE;
s = fcntl(pFile->h, F_SETLK, &lock);
if( s==(-1) ){
- rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
+ tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
goto end_lock;
}
}
@@ -20152,20 +22971,28 @@ static int unixLock(sqlite3_file *id, int locktype){
assert( pLock->locktype==0 );
/* Now get the read-lock */
- lock.l_start = SHARED_FIRST;
- lock.l_len = SHARED_SIZE;
- s = fcntl(pFile->h, F_SETLK, &lock);
+ s = rangeLock(pFile, F_RDLCK, &tErrno);
/* Drop the temporary PENDING lock */
lock.l_start = PENDING_BYTE;
lock.l_len = 1L;
lock.l_type = F_UNLCK;
if( fcntl(pFile->h, F_SETLK, &lock)!=0 ){
- rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
- goto end_lock;
+ if( s != -1 ){
+ /* This could happen with a network mount */
+ tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ goto end_lock;
+ }
}
if( s==(-1) ){
- rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
}else{
pFile->locktype = SHARED_LOCK;
pFile->pOpen->nLock++;
@@ -20185,20 +23012,41 @@ static int unixLock(sqlite3_file *id, int locktype){
switch( locktype ){
case RESERVED_LOCK:
lock.l_start = RESERVED_BYTE;
+ s = fcntl(pFile->h, F_SETLK, &lock);
+ tErrno = errno;
break;
case EXCLUSIVE_LOCK:
- lock.l_start = SHARED_FIRST;
- lock.l_len = SHARED_SIZE;
+ s = rangeLock(pFile, F_WRLCK, &tErrno);
break;
default:
assert(0);
}
- s = fcntl(pFile->h, F_SETLK, &lock);
if( s==(-1) ){
- rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
}
}
+
+#ifndef NDEBUG
+ /* Set up the transaction-counter change checking flags when
+ ** transitioning from a SHARED to a RESERVED lock. The change
+ ** from SHARED to RESERVED marks the beginning of a normal
+ ** write operation (not a hot journal rollback).
+ */
+ if( rc==SQLITE_OK
+ && pFile->locktype<=SHARED_LOCK
+ && locktype==RESERVED_LOCK
+ ){
+ pFile->transCntrChng = 0;
+ pFile->dbUpdate = 0;
+ pFile->inNormalWrite = 1;
+ }
+#endif
+
+
if( rc==SQLITE_OK ){
pFile->locktype = locktype;
pLock->locktype = locktype;
@@ -20208,13 +23056,56 @@ static int unixLock(sqlite3_file *id, int locktype){
}
end_lock:
- leaveMutex();
+ unixLeaveMutex();
OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype),
rc==SQLITE_OK ? "ok" : "failed");
return rc;
}
/*
+** Close all file descriptors accumuated in the unixOpenCnt->pUnused list.
+** If all such file descriptors are closed without error, the list is
+** cleared and SQLITE_OK returned.
+**
+** Otherwise, if an error occurs, then successfully closed file descriptor
+** entries are removed from the list, and SQLITE_IOERR_CLOSE returned.
+** not deleted and SQLITE_IOERR_CLOSE returned.
+*/
+static int closePendingFds(unixFile *pFile){
+ int rc = SQLITE_OK;
+ struct unixOpenCnt *pOpen = pFile->pOpen;
+ UnixUnusedFd *pError = 0;
+ UnixUnusedFd *p;
+ UnixUnusedFd *pNext;
+ for(p=pOpen->pUnused; p; p=pNext){
+ pNext = p->pNext;
+ if( close(p->fd) ){
+ pFile->lastErrno = errno;
+ rc = SQLITE_IOERR_CLOSE;
+ p->pNext = pError;
+ pError = p;
+ }else{
+ sqlite3_free(p);
+ }
+ }
+ pOpen->pUnused = pError;
+ return rc;
+}
+
+/*
+** Add the file descriptor used by file handle pFile to the corresponding
+** pUnused list.
+*/
+static void setPendingFd(unixFile *pFile){
+ struct unixOpenCnt *pOpen = pFile->pOpen;
+ UnixUnusedFd *p = pFile->pUnused;
+ p->pNext = pOpen->pUnused;
+ pOpen->pUnused = p;
+ pFile->h = -1;
+ pFile->pUnused = 0;
+}
+
+/*
** Lower the locking level on file descriptor pFile to locktype. locktype
** must be either NO_LOCK or SHARED_LOCK.
**
@@ -20222,11 +23113,12 @@ end_lock:
** the requested locking level, this routine is a no-op.
*/
static int unixUnlock(sqlite3_file *id, int locktype){
- struct lockInfo *pLock;
- struct flock lock;
- int rc = SQLITE_OK;
- unixFile *pFile = (unixFile*)id;
- int h;
+ unixFile *pFile = (unixFile*)id; /* The open file */
+ struct unixLockInfo *pLock; /* Structure describing current lock state */
+ struct flock lock; /* Information passed into fcntl() */
+ int rc = SQLITE_OK; /* Return code from this interface */
+ int h; /* The underlying file descriptor */
+ int tErrno; /* Error code from system call errors */
assert( pFile );
OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d\n", pFile->h, locktype,
@@ -20239,7 +23131,7 @@ static int unixUnlock(sqlite3_file *id, int locktype){
if( CHECK_THREADID(pFile) ){
return SQLITE_MISUSE;
}
- enterMutex();
+ unixEnterMutex();
h = pFile->h;
pLock = pFile->pLock;
assert( pLock->cnt!=0 );
@@ -20248,13 +23140,30 @@ static int unixUnlock(sqlite3_file *id, int locktype){
SimulateIOErrorBenign(1);
SimulateIOError( h=(-1) )
SimulateIOErrorBenign(0);
+
+#ifndef NDEBUG
+ /* When reducing a lock such that other processes can start
+ ** reading the database file again, make sure that the
+ ** transaction counter was updated if any part of the database
+ ** file changed. If the transaction counter is not updated,
+ ** other connections to the same file might not realize that
+ ** the file has changed and hence might not know to flush their
+ ** cache. The use of a stale cache can lead to database corruption.
+ */
+ assert( pFile->inNormalWrite==0
+ || pFile->dbUpdate==0
+ || pFile->transCntrChng==1 );
+ pFile->inNormalWrite = 0;
+#endif
+
+
if( locktype==SHARED_LOCK ){
- lock.l_type = F_RDLCK;
- lock.l_whence = SEEK_SET;
- lock.l_start = SHARED_FIRST;
- lock.l_len = SHARED_SIZE;
- if( fcntl(h, F_SETLK, &lock)==(-1) ){
- rc = SQLITE_IOERR_RDLOCK;
+ if( rangeLock(pFile, F_RDLCK, &tErrno)==(-1) ){
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ goto end_unlock;
}
}
lock.l_type = F_UNLCK;
@@ -20264,11 +23173,16 @@ static int unixUnlock(sqlite3_file *id, int locktype){
if( fcntl(h, F_SETLK, &lock)!=(-1) ){
pLock->locktype = SHARED_LOCK;
}else{
- rc = SQLITE_IOERR_UNLOCK;
+ tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ goto end_unlock;
}
}
if( locktype==NO_LOCK ){
- struct openCnt *pOpen;
+ struct unixOpenCnt *pOpen;
/* Decrement the shared lock counter. Release the lock using an
** OS call only when all threads in this same process have released
@@ -20285,8 +23199,13 @@ static int unixUnlock(sqlite3_file *id, int locktype){
if( fcntl(h, F_SETLK, &lock)!=(-1) ){
pLock->locktype = NO_LOCK;
}else{
- rc = SQLITE_IOERR_UNLOCK;
- pLock->cnt = 1;
+ tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ pLock->locktype = NO_LOCK;
+ pFile->locktype = NO_LOCK;
}
}
@@ -20294,78 +23213,736 @@ static int unixUnlock(sqlite3_file *id, int locktype){
** count reaches zero, close any other file descriptors whose close
** was deferred because of outstanding locks.
*/
- if( rc==SQLITE_OK ){
- pOpen = pFile->pOpen;
- pOpen->nLock--;
- assert( pOpen->nLock>=0 );
- if( pOpen->nLock==0 && pOpen->nPending>0 ){
- int i;
- for(i=0; i<pOpen->nPending; i++){
- close(pOpen->aPending[i]);
- }
- free(pOpen->aPending);
- pOpen->nPending = 0;
- pOpen->aPending = 0;
+ pOpen = pFile->pOpen;
+ pOpen->nLock--;
+ assert( pOpen->nLock>=0 );
+ if( pOpen->nLock==0 ){
+ int rc2 = closePendingFds(pFile);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
}
}
}
- leaveMutex();
+
+end_unlock:
+ unixLeaveMutex();
if( rc==SQLITE_OK ) pFile->locktype = locktype;
return rc;
}
/*
+** This function performs the parts of the "close file" operation
+** common to all locking schemes. It closes the directory and file
+** handles, if they are valid, and sets all fields of the unixFile
+** structure to 0.
+**
+** It is *not* necessary to hold the mutex when this routine is called,
+** even on VxWorks. A mutex will be acquired on VxWorks by the
+** vxworksReleaseFileId() routine.
+*/
+static int closeUnixFile(sqlite3_file *id){
+ unixFile *pFile = (unixFile*)id;
+ if( pFile ){
+ if( pFile->dirfd>=0 ){
+ int err = close(pFile->dirfd);
+ if( err ){
+ pFile->lastErrno = errno;
+ return SQLITE_IOERR_DIR_CLOSE;
+ }else{
+ pFile->dirfd=-1;
+ }
+ }
+ if( pFile->h>=0 ){
+ int err = close(pFile->h);
+ if( err ){
+ pFile->lastErrno = errno;
+ return SQLITE_IOERR_CLOSE;
+ }
+ }
+#if OS_VXWORKS
+ if( pFile->pId ){
+ if( pFile->isDelete ){
+ unlink(pFile->pId->zCanonicalName);
+ }
+ vxworksReleaseFileId(pFile->pId);
+ pFile->pId = 0;
+ }
+#endif
+ OSTRACE2("CLOSE %-3d\n", pFile->h);
+ OpenCounter(-1);
+ sqlite3_free(pFile->pUnused);
+ memset(pFile, 0, sizeof(unixFile));
+ }
+ return SQLITE_OK;
+}
+
+/*
** Close a file.
*/
static int unixClose(sqlite3_file *id){
- unixFile *pFile = (unixFile *)id;
- if( !pFile ) return SQLITE_OK;
- unixUnlock(id, NO_LOCK);
- if( pFile->dirfd>=0 ) close(pFile->dirfd);
- pFile->dirfd = -1;
- enterMutex();
-
- if( pFile->pOpen->nLock ){
- /* If there are outstanding locks, do not actually close the file just
- ** yet because that would clear those locks. Instead, add the file
- ** descriptor to pOpen->aPending. It will be automatically closed when
- ** the last lock is cleared.
- */
- int *aNew;
- struct openCnt *pOpen = pFile->pOpen;
- aNew = realloc( pOpen->aPending, (pOpen->nPending+1)*sizeof(int) );
- if( aNew==0 ){
- /* If a malloc fails, just leak the file descriptor */
- }else{
- pOpen->aPending = aNew;
- pOpen->aPending[pOpen->nPending] = pFile->h;
- pOpen->nPending++;
+ int rc = SQLITE_OK;
+ if( id ){
+ unixFile *pFile = (unixFile *)id;
+ unixUnlock(id, NO_LOCK);
+ unixEnterMutex();
+ if( pFile->pOpen && pFile->pOpen->nLock ){
+ /* If there are outstanding locks, do not actually close the file just
+ ** yet because that would clear those locks. Instead, add the file
+ ** descriptor to pOpen->pUnused list. It will be automatically closed
+ ** when the last lock is cleared.
+ */
+ setPendingFd(pFile);
}
+ releaseLockInfo(pFile->pLock);
+ releaseOpenCnt(pFile->pOpen);
+ rc = closeUnixFile(id);
+ unixLeaveMutex();
+ }
+ return rc;
+}
+
+/************** End of the posix advisory lock implementation *****************
+******************************************************************************/
+
+/******************************************************************************
+****************************** No-op Locking **********************************
+**
+** Of the various locking implementations available, this is by far the
+** simplest: locking is ignored. No attempt is made to lock the database
+** file for reading or writing.
+**
+** This locking mode is appropriate for use on read-only databases
+** (ex: databases that are burned into CD-ROM, for example.) It can
+** also be used if the application employs some external mechanism to
+** prevent simultaneous access of the same database by two or more
+** database connections. But there is a serious risk of database
+** corruption if this locking mode is used in situations where multiple
+** database connections are accessing the same database file at the same
+** time and one or more of those connections are writing.
+*/
+
+static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){
+ UNUSED_PARAMETER(NotUsed);
+ *pResOut = 0;
+ return SQLITE_OK;
+}
+static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ return SQLITE_OK;
+}
+static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ return SQLITE_OK;
+}
+
+/*
+** Close the file.
+*/
+static int nolockClose(sqlite3_file *id) {
+ return closeUnixFile(id);
+}
+
+/******************* End of the no-op lock implementation *********************
+******************************************************************************/
+
+/******************************************************************************
+************************* Begin dot-file Locking ******************************
+**
+** The dotfile locking implementation uses the existance of separate lock
+** files in order to control access to the database. This works on just
+** about every filesystem imaginable. But there are serious downsides:
+**
+** (1) There is zero concurrency. A single reader blocks all other
+** connections from reading or writing the database.
+**
+** (2) An application crash or power loss can leave stale lock files
+** sitting around that need to be cleared manually.
+**
+** Nevertheless, a dotlock is an appropriate locking mode for use if no
+** other locking strategy is available.
+**
+** Dotfile locking works by creating a file in the same directory as the
+** database and with the same name but with a ".lock" extension added.
+** The existance of a lock file implies an EXCLUSIVE lock. All other lock
+** types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE.
+*/
+
+/*
+** The file suffix added to the data base filename in order to create the
+** lock file.
+*/
+#define DOTLOCK_SUFFIX ".lock"
+
+/*
+** This routine checks if there is a RESERVED lock held on the specified
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
+**
+** In dotfile locking, either a lock exists or it does not. So in this
+** variation of CheckReservedLock(), *pResOut is set to true if any lock
+** is held on the file and false if the file is unlocked.
+*/
+static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) {
+ int rc = SQLITE_OK;
+ int reserved = 0;
+ unixFile *pFile = (unixFile*)id;
+
+ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
+
+ assert( pFile );
+
+ /* Check if a thread in this process holds such a lock */
+ if( pFile->locktype>SHARED_LOCK ){
+ /* Either this connection or some other connection in the same process
+ ** holds a lock on the file. No need to check further. */
+ reserved = 1;
}else{
- /* There are no outstanding locks so we can close the file immediately */
- close(pFile->h);
+ /* The lock is held if and only if the lockfile exists */
+ const char *zLockFile = (const char*)pFile->lockingContext;
+ reserved = access(zLockFile, 0)==0;
}
- releaseLockInfo(pFile->pLock);
- releaseOpenCnt(pFile->pOpen);
+ OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved);
+ *pResOut = reserved;
+ return rc;
+}
- leaveMutex();
- OSTRACE2("CLOSE %-3d\n", pFile->h);
- OpenCounter(-1);
- memset(pFile, 0, sizeof(unixFile));
+/*
+** Lock the file with the lock specified by parameter locktype - one
+** of the following:
+**
+** (1) SHARED_LOCK
+** (2) RESERVED_LOCK
+** (3) PENDING_LOCK
+** (4) EXCLUSIVE_LOCK
+**
+** Sometimes when requesting one lock state, additional lock states
+** are inserted in between. The locking might fail on one of the later
+** transitions leaving the lock state different from what it started but
+** still short of its goal. The following chart shows the allowed
+** transitions and the inserted intermediate states:
+**
+** UNLOCKED -> SHARED
+** SHARED -> RESERVED
+** SHARED -> (PENDING) -> EXCLUSIVE
+** RESERVED -> (PENDING) -> EXCLUSIVE
+** PENDING -> EXCLUSIVE
+**
+** This routine will only increase a lock. Use the sqlite3OsUnlock()
+** routine to lower a locking level.
+**
+** With dotfile locking, we really only support state (4): EXCLUSIVE.
+** But we track the other locking levels internally.
+*/
+static int dotlockLock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ int fd;
+ char *zLockFile = (char *)pFile->lockingContext;
+ int rc = SQLITE_OK;
+
+
+ /* If we have any lock, then the lock file already exists. All we have
+ ** to do is adjust our internal record of the lock level.
+ */
+ if( pFile->locktype > NO_LOCK ){
+ pFile->locktype = locktype;
+#if !OS_VXWORKS
+ /* Always update the timestamp on the old file */
+ utimes(zLockFile, NULL);
+#endif
+ return SQLITE_OK;
+ }
+
+ /* grab an exclusive lock */
+ fd = open(zLockFile,O_RDONLY|O_CREAT|O_EXCL,0600);
+ if( fd<0 ){
+ /* failed to open/create the file, someone else may have stolen the lock */
+ int tErrno = errno;
+ if( EEXIST == tErrno ){
+ rc = SQLITE_BUSY;
+ } else {
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ }
+ return rc;
+ }
+ if( close(fd) ){
+ pFile->lastErrno = errno;
+ rc = SQLITE_IOERR_CLOSE;
+ }
+
+ /* got it, set the type and return ok */
+ pFile->locktype = locktype;
+ return rc;
+}
+
+/*
+** Lower the locking level on file descriptor pFile to locktype. locktype
+** must be either NO_LOCK or SHARED_LOCK.
+**
+** If the locking level of the file descriptor is already at or below
+** the requested locking level, this routine is a no-op.
+**
+** When the locking level reaches NO_LOCK, delete the lock file.
+*/
+static int dotlockUnlock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ char *zLockFile = (char *)pFile->lockingContext;
+
+ assert( pFile );
+ OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype,
+ pFile->locktype, getpid());
+ assert( locktype<=SHARED_LOCK );
+
+ /* no-op if possible */
+ if( pFile->locktype==locktype ){
+ return SQLITE_OK;
+ }
+
+ /* To downgrade to shared, simply update our internal notion of the
+ ** lock state. No need to mess with the file on disk.
+ */
+ if( locktype==SHARED_LOCK ){
+ pFile->locktype = SHARED_LOCK;
+ return SQLITE_OK;
+ }
+
+ /* To fully unlock the database, delete the lock file */
+ assert( locktype==NO_LOCK );
+ if( unlink(zLockFile) ){
+ int rc = 0;
+ int tErrno = errno;
+ if( ENOENT != tErrno ){
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ }
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ return rc;
+ }
+ pFile->locktype = NO_LOCK;
return SQLITE_OK;
}
+/*
+** Close a file. Make sure the lock has been released before closing.
+*/
+static int dotlockClose(sqlite3_file *id) {
+ int rc;
+ if( id ){
+ unixFile *pFile = (unixFile*)id;
+ dotlockUnlock(id, NO_LOCK);
+ sqlite3_free(pFile->lockingContext);
+ }
+ rc = closeUnixFile(id);
+ return rc;
+}
+/****************** End of the dot-file lock implementation *******************
+******************************************************************************/
+
+/******************************************************************************
+************************** Begin flock Locking ********************************
+**
+** Use the flock() system call to do file locking.
+**
+** flock() locking is like dot-file locking in that the various
+** fine-grain locking levels supported by SQLite are collapsed into
+** a single exclusive lock. In other words, SHARED, RESERVED, and
+** PENDING locks are the same thing as an EXCLUSIVE lock. SQLite
+** still works when you do this, but concurrency is reduced since
+** only a single process can be reading the database at a time.
+**
+** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off or if
+** compiling for VXWORKS.
+*/
+#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS
+
+/*
+** This routine checks if there is a RESERVED lock held on the specified
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
+*/
+static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){
+ int rc = SQLITE_OK;
+ int reserved = 0;
+ unixFile *pFile = (unixFile*)id;
+
+ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
+
+ assert( pFile );
+
+ /* Check if a thread in this process holds such a lock */
+ if( pFile->locktype>SHARED_LOCK ){
+ reserved = 1;
+ }
+
+ /* Otherwise see if some other process holds it. */
+ if( !reserved ){
+ /* attempt to get the lock */
+ int lrc = flock(pFile->h, LOCK_EX | LOCK_NB);
+ if( !lrc ){
+ /* got the lock, unlock it */
+ lrc = flock(pFile->h, LOCK_UN);
+ if ( lrc ) {
+ int tErrno = errno;
+ /* unlock failed with an error */
+ lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(lrc) ){
+ pFile->lastErrno = tErrno;
+ rc = lrc;
+ }
+ }
+ } else {
+ int tErrno = errno;
+ reserved = 1;
+ /* someone else might have it reserved */
+ lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(lrc) ){
+ pFile->lastErrno = tErrno;
+ rc = lrc;
+ }
+ }
+ }
+ OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved);
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
-#pragma mark AFP Support
+#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
+ if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
+ rc = SQLITE_OK;
+ reserved=1;
+ }
+#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
+ *pResOut = reserved;
+ return rc;
+}
/*
- ** The afpLockingContext structure contains all afp lock specific state
+** Lock the file with the lock specified by parameter locktype - one
+** of the following:
+**
+** (1) SHARED_LOCK
+** (2) RESERVED_LOCK
+** (3) PENDING_LOCK
+** (4) EXCLUSIVE_LOCK
+**
+** Sometimes when requesting one lock state, additional lock states
+** are inserted in between. The locking might fail on one of the later
+** transitions leaving the lock state different from what it started but
+** still short of its goal. The following chart shows the allowed
+** transitions and the inserted intermediate states:
+**
+** UNLOCKED -> SHARED
+** SHARED -> RESERVED
+** SHARED -> (PENDING) -> EXCLUSIVE
+** RESERVED -> (PENDING) -> EXCLUSIVE
+** PENDING -> EXCLUSIVE
+**
+** flock() only really support EXCLUSIVE locks. We track intermediate
+** lock states in the sqlite3_file structure, but all locks SHARED or
+** above are really EXCLUSIVE locks and exclude all other processes from
+** access the file.
+**
+** This routine will only increase a lock. Use the sqlite3OsUnlock()
+** routine to lower a locking level.
+*/
+static int flockLock(sqlite3_file *id, int locktype) {
+ int rc = SQLITE_OK;
+ unixFile *pFile = (unixFile*)id;
+
+ assert( pFile );
+
+ /* if we already have a lock, it is exclusive.
+ ** Just adjust level and punt on outta here. */
+ if (pFile->locktype > NO_LOCK) {
+ pFile->locktype = locktype;
+ return SQLITE_OK;
+ }
+
+ /* grab an exclusive lock */
+
+ if (flock(pFile->h, LOCK_EX | LOCK_NB)) {
+ int tErrno = errno;
+ /* didn't get, must be busy */
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ } else {
+ /* got it, set the type and return ok */
+ pFile->locktype = locktype;
+ }
+ OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype),
+ rc==SQLITE_OK ? "ok" : "failed");
+#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
+ if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
+ rc = SQLITE_BUSY;
+ }
+#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
+ return rc;
+}
+
+
+/*
+** Lower the locking level on file descriptor pFile to locktype. locktype
+** must be either NO_LOCK or SHARED_LOCK.
+**
+** If the locking level of the file descriptor is already at or below
+** the requested locking level, this routine is a no-op.
+*/
+static int flockUnlock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+
+ assert( pFile );
+ OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype,
+ pFile->locktype, getpid());
+ assert( locktype<=SHARED_LOCK );
+
+ /* no-op if possible */
+ if( pFile->locktype==locktype ){
+ return SQLITE_OK;
+ }
+
+ /* shared can just be set because we always have an exclusive */
+ if (locktype==SHARED_LOCK) {
+ pFile->locktype = locktype;
+ return SQLITE_OK;
+ }
+
+ /* no, really, unlock. */
+ int rc = flock(pFile->h, LOCK_UN);
+ if (rc) {
+ int r, tErrno = errno;
+ r = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(r) ){
+ pFile->lastErrno = tErrno;
+ }
+#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
+ if( (r & SQLITE_IOERR) == SQLITE_IOERR ){
+ r = SQLITE_BUSY;
+ }
+#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
+
+ return r;
+ } else {
+ pFile->locktype = NO_LOCK;
+ return SQLITE_OK;
+ }
+}
+
+/*
+** Close a file.
+*/
+static int flockClose(sqlite3_file *id) {
+ if( id ){
+ flockUnlock(id, NO_LOCK);
+ }
+ return closeUnixFile(id);
+}
+
+#endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */
+
+/******************* End of the flock lock implementation *********************
+******************************************************************************/
+
+/******************************************************************************
+************************ Begin Named Semaphore Locking ************************
+**
+** Named semaphore locking is only supported on VxWorks.
+**
+** Semaphore locking is like dot-lock and flock in that it really only
+** supports EXCLUSIVE locking. Only a single process can read or write
+** the database file at a time. This reduces potential concurrency, but
+** makes the lock implementation much easier.
+*/
+#if OS_VXWORKS
+
+/*
+** This routine checks if there is a RESERVED lock held on the specified
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
+*/
+static int semCheckReservedLock(sqlite3_file *id, int *pResOut) {
+ int rc = SQLITE_OK;
+ int reserved = 0;
+ unixFile *pFile = (unixFile*)id;
+
+ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
+
+ assert( pFile );
+
+ /* Check if a thread in this process holds such a lock */
+ if( pFile->locktype>SHARED_LOCK ){
+ reserved = 1;
+ }
+
+ /* Otherwise see if some other process holds it. */
+ if( !reserved ){
+ sem_t *pSem = pFile->pOpen->pSem;
+ struct stat statBuf;
+
+ if( sem_trywait(pSem)==-1 ){
+ int tErrno = errno;
+ if( EAGAIN != tErrno ){
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK);
+ pFile->lastErrno = tErrno;
+ } else {
+ /* someone else has the lock when we are in NO_LOCK */
+ reserved = (pFile->locktype < SHARED_LOCK);
+ }
+ }else{
+ /* we could have it if we want it */
+ sem_post(pSem);
+ }
+ }
+ OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved);
+
+ *pResOut = reserved;
+ return rc;
+}
+
+/*
+** Lock the file with the lock specified by parameter locktype - one
+** of the following:
+**
+** (1) SHARED_LOCK
+** (2) RESERVED_LOCK
+** (3) PENDING_LOCK
+** (4) EXCLUSIVE_LOCK
+**
+** Sometimes when requesting one lock state, additional lock states
+** are inserted in between. The locking might fail on one of the later
+** transitions leaving the lock state different from what it started but
+** still short of its goal. The following chart shows the allowed
+** transitions and the inserted intermediate states:
+**
+** UNLOCKED -> SHARED
+** SHARED -> RESERVED
+** SHARED -> (PENDING) -> EXCLUSIVE
+** RESERVED -> (PENDING) -> EXCLUSIVE
+** PENDING -> EXCLUSIVE
+**
+** Semaphore locks only really support EXCLUSIVE locks. We track intermediate
+** lock states in the sqlite3_file structure, but all locks SHARED or
+** above are really EXCLUSIVE locks and exclude all other processes from
+** access the file.
+**
+** This routine will only increase a lock. Use the sqlite3OsUnlock()
+** routine to lower a locking level.
+*/
+static int semLock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ int fd;
+ sem_t *pSem = pFile->pOpen->pSem;
+ int rc = SQLITE_OK;
+
+ /* if we already have a lock, it is exclusive.
+ ** Just adjust level and punt on outta here. */
+ if (pFile->locktype > NO_LOCK) {
+ pFile->locktype = locktype;
+ rc = SQLITE_OK;
+ goto sem_end_lock;
+ }
+
+ /* lock semaphore now but bail out when already locked. */
+ if( sem_trywait(pSem)==-1 ){
+ rc = SQLITE_BUSY;
+ goto sem_end_lock;
+ }
+
+ /* got it, set the type and return ok */
+ pFile->locktype = locktype;
+
+ sem_end_lock:
+ return rc;
+}
+
+/*
+** Lower the locking level on file descriptor pFile to locktype. locktype
+** must be either NO_LOCK or SHARED_LOCK.
+**
+** If the locking level of the file descriptor is already at or below
+** the requested locking level, this routine is a no-op.
+*/
+static int semUnlock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ sem_t *pSem = pFile->pOpen->pSem;
+
+ assert( pFile );
+ assert( pSem );
+ OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype,
+ pFile->locktype, getpid());
+ assert( locktype<=SHARED_LOCK );
+
+ /* no-op if possible */
+ if( pFile->locktype==locktype ){
+ return SQLITE_OK;
+ }
+
+ /* shared can just be set because we always have an exclusive */
+ if (locktype==SHARED_LOCK) {
+ pFile->locktype = locktype;
+ return SQLITE_OK;
+ }
+
+ /* no, really unlock. */
+ if ( sem_post(pSem)==-1 ) {
+ int rc, tErrno = errno;
+ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ return rc;
+ }
+ pFile->locktype = NO_LOCK;
+ return SQLITE_OK;
+}
+
+/*
+ ** Close a file.
*/
+static int semClose(sqlite3_file *id) {
+ if( id ){
+ unixFile *pFile = (unixFile*)id;
+ semUnlock(id, NO_LOCK);
+ assert( pFile );
+ unixEnterMutex();
+ releaseLockInfo(pFile->pLock);
+ releaseOpenCnt(pFile->pOpen);
+ unixLeaveMutex();
+ closeUnixFile(id);
+ }
+ return SQLITE_OK;
+}
+
+#endif /* OS_VXWORKS */
+/*
+** Named semaphore locking is only available on VxWorks.
+**
+*************** End of the named semaphore lock implementation ****************
+******************************************************************************/
+
+
+/******************************************************************************
+*************************** Begin AFP Locking *********************************
+**
+** AFP is the Apple Filing Protocol. AFP is a network filesystem found
+** on Apple Macintosh computers - both OS9 and OSX.
+**
+** Third-party implementations of AFP are available. But this code here
+** only works on OSX.
+*/
+
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+/*
+** The afpLockingContext structure contains all afp lock specific state
+*/
typedef struct afpLockingContext afpLockingContext;
struct afpLockingContext {
- unsigned long long sharedLockByte;
- const char *filePath;
+ unsigned long long sharedByte;
+ const char *dbPath; /* Name of the open file */
};
struct ByteRangeLockPB2
@@ -20380,83 +23957,125 @@ struct ByteRangeLockPB2
#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2)
-/*
-** Return 0 on success, 1 on failure. To match the behavior of the
-** normal posix file locking (used in unixLock for example), we should
-** provide 'richer' return codes - specifically to differentiate between
-** 'file busy' and 'file system error' results.
-*/
-static int _AFPFSSetLock(
- const char *path,
- int fd,
- unsigned long long offset,
- unsigned long long length,
- int setLockFlag
+/*
+** This is a utility for setting or clearing a bit-range lock on an
+** AFP filesystem.
+**
+** Return SQLITE_OK on success, SQLITE_BUSY on failure.
+*/
+static int afpSetLock(
+ const char *path, /* Name of the file to be locked or unlocked */
+ unixFile *pFile, /* Open file descriptor on path */
+ unsigned long long offset, /* First byte to be locked */
+ unsigned long long length, /* Number of bytes to lock */
+ int setLockFlag /* True to set lock. False to clear lock */
){
- struct ByteRangeLockPB2 pb;
- int err;
+ struct ByteRangeLockPB2 pb;
+ int err;
pb.unLockFlag = setLockFlag ? 0 : 1;
pb.startEndFlag = 0;
pb.offset = offset;
pb.length = length;
- pb.fd = fd;
- OSTRACE5("AFPLOCK setting lock %s for %d in range %llx:%llx\n",
- (setLockFlag?"ON":"OFF"), fd, offset, length);
+ pb.fd = pFile->h;
+
+ OSTRACE6("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n",
+ (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""),
+ offset, length);
err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0);
if ( err==-1 ) {
- OSTRACE4("AFPLOCK failed to fsctl() '%s' %d %s\n", path, errno,
- strerror(errno));
- return 1; /* error */
+ int rc;
+ int tErrno = errno;
+ OSTRACE4("AFPSETLOCK failed to fsctl() '%s' %d %s\n",
+ path, tErrno, strerror(tErrno));
+#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
+ rc = SQLITE_BUSY;
+#else
+ rc = sqliteErrorFromPosixError(tErrno,
+ setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK);
+#endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */
+ if( IS_LOCK_ERROR(rc) ){
+ pFile->lastErrno = tErrno;
+ }
+ return rc;
} else {
- return 0;
+ return SQLITE_OK;
}
}
/*
- ** This routine checks if there is a RESERVED lock held on the specified
- ** file by this or any other process. If such a lock is held, return
- ** non-zero. If the file is unlocked or holds only SHARED locks, then
- ** return zero.
- */
-static int afpUnixCheckReservedLock(sqlite3_file *id){
- int r = 0;
+** This routine checks if there is a RESERVED lock held on the specified
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
+*/
+static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){
+ int rc = SQLITE_OK;
+ int reserved = 0;
unixFile *pFile = (unixFile*)id;
- assert( pFile );
+ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
+
+ assert( pFile );
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
/* Check if a thread in this process holds such a lock */
if( pFile->locktype>SHARED_LOCK ){
- r = 1;
+ reserved = 1;
}
/* Otherwise see if some other process holds it.
*/
- if ( !r ) {
- /* lock the byte */
- int failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1);
- if (failed) {
- /* if we failed to get the lock then someone else must have it */
- r = 1;
- } else {
+ if( !reserved ){
+ /* lock the RESERVED byte */
+ int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1);
+ if( SQLITE_OK==lrc ){
/* if we succeeded in taking the reserved lock, unlock it to restore
** the original state */
- _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0);
+ lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0);
+ } else {
+ /* if we failed to get the lock then someone else must have it */
+ reserved = 1;
+ }
+ if( IS_LOCK_ERROR(lrc) ){
+ rc=lrc;
}
}
- OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r);
- return r;
+ OSTRACE4("TEST WR-LOCK %d %d %d\n", pFile->h, rc, reserved);
+
+ *pResOut = reserved;
+ return rc;
}
-/* AFP-style locking following the behavior of unixLock, see the unixLock
-** function comments for details of lock management. */
-static int afpUnixLock(sqlite3_file *id, int locktype){
+/*
+** Lock the file with the lock specified by parameter locktype - one
+** of the following:
+**
+** (1) SHARED_LOCK
+** (2) RESERVED_LOCK
+** (3) PENDING_LOCK
+** (4) EXCLUSIVE_LOCK
+**
+** Sometimes when requesting one lock state, additional lock states
+** are inserted in between. The locking might fail on one of the later
+** transitions leaving the lock state different from what it started but
+** still short of its goal. The following chart shows the allowed
+** transitions and the inserted intermediate states:
+**
+** UNLOCKED -> SHARED
+** SHARED -> RESERVED
+** SHARED -> (PENDING) -> EXCLUSIVE
+** RESERVED -> (PENDING) -> EXCLUSIVE
+** PENDING -> EXCLUSIVE
+**
+** This routine will only increase a lock. Use the sqlite3OsUnlock()
+** routine to lower a locking level.
+*/
+static int afpLock(sqlite3_file *id, int locktype){
int rc = SQLITE_OK;
unixFile *pFile = (unixFile*)id;
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
- int gotPendingLock = 0;
assert( pFile );
OSTRACE5("LOCK %d %s was %s pid=%d\n", pFile->h,
@@ -20464,7 +24083,7 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
/* If there is already a lock of this type or more restrictive on the
** unixFile, do nothing. Don't use the afp_end_lock: exit path, as
- ** enterMutex() hasn't been called yet.
+ ** unixEnterMutex() hasn't been called yet.
*/
if( pFile->locktype>=locktype ){
OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h,
@@ -20480,13 +24099,13 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
/* This mutex is needed because pFile->pLock is shared across threads
*/
- enterMutex();
+ unixEnterMutex();
/* Make sure the current thread owns the pFile.
*/
rc = transferOwnership(pFile);
if( rc!=SQLITE_OK ){
- leaveMutex();
+ unixLeaveMutex();
return rc;
}
@@ -20498,9 +24117,9 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
|| (locktype==EXCLUSIVE_LOCK && pFile->locktype<PENDING_LOCK)
){
int failed;
- failed = _AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 1);
+ failed = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 1);
if (failed) {
- rc = SQLITE_BUSY;
+ rc = failed;
goto afp_end_lock;
}
}
@@ -20509,26 +24128,32 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
** operating system calls for the specified lock.
*/
if( locktype==SHARED_LOCK ){
- int lk, failed;
- int tries = 0;
+ int lk, lrc1, lrc2, lrc1Errno;
- /* Now get the read-lock */
+ /* Now get the read-lock SHARED_LOCK */
/* note that the quality of the randomness doesn't matter that much */
lk = random();
- context->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1);
- failed = _AFPFSSetLock(context->filePath, pFile->h,
- SHARED_FIRST+context->sharedLockByte, 1, 1);
-
- /* Drop the temporary PENDING lock */
- if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)) {
- rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
- goto afp_end_lock;
+ context->sharedByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1);
+ lrc1 = afpSetLock(context->dbPath, pFile,
+ SHARED_FIRST+context->sharedByte, 1, 1);
+ if( IS_LOCK_ERROR(lrc1) ){
+ lrc1Errno = pFile->lastErrno;
}
+ /* Drop the temporary PENDING lock */
+ lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0);
- if( failed ){
- rc = SQLITE_BUSY;
+ if( IS_LOCK_ERROR(lrc1) ) {
+ pFile->lastErrno = lrc1Errno;
+ rc = lrc1;
+ goto afp_end_lock;
+ } else if( IS_LOCK_ERROR(lrc2) ){
+ rc = lrc2;
+ goto afp_end_lock;
+ } else if( lrc1 != SQLITE_OK ) {
+ rc = lrc1;
} else {
pFile->locktype = SHARED_LOCK;
+ pFile->pOpen->nLock++;
}
}else{
/* The request was for a RESERVED or EXCLUSIVE lock. It is
@@ -20539,30 +24164,35 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
assert( 0!=pFile->locktype );
if (locktype >= RESERVED_LOCK && pFile->locktype < RESERVED_LOCK) {
/* Acquire a RESERVED lock */
- failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1);
+ failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1);
}
if (!failed && locktype == EXCLUSIVE_LOCK) {
/* Acquire an EXCLUSIVE lock */
/* Remove the shared lock before trying the range. we'll need to
- ** reestablish the shared lock if we can't get the afpUnixUnlock
+ ** reestablish the shared lock if we can't get the afpUnlock
*/
- if (!_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST +
- context->sharedLockByte, 1, 0)) {
+ if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST +
+ context->sharedByte, 1, 0)) ){
+ int failed2 = SQLITE_OK;
/* now attemmpt to get the exclusive lock range */
- failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST,
+ failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST,
SHARED_SIZE, 1);
- if (failed && _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST +
- context->sharedLockByte, 1, 1)) {
- rc = SQLITE_IOERR_RDLOCK; /* this should never happen */
- }
- } else {
- /* */
- rc = SQLITE_IOERR_UNLOCK; /* this should never happen */
+ if( failed && (failed2 = afpSetLock(context->dbPath, pFile,
+ SHARED_FIRST + context->sharedByte, 1, 1)) ){
+ /* Can't reestablish the shared lock. Sqlite can't deal, this is
+ ** a critical I/O error
+ */
+ rc = ((failed & SQLITE_IOERR) == SQLITE_IOERR) ? failed2 :
+ SQLITE_IOERR_LOCK;
+ goto afp_end_lock;
+ }
+ }else{
+ rc = failed;
}
}
- if( failed && rc == SQLITE_OK){
- rc = SQLITE_BUSY;
+ if( failed ){
+ rc = failed;
}
}
@@ -20573,7 +24203,7 @@ static int afpUnixLock(sqlite3_file *id, int locktype){
}
afp_end_lock:
- leaveMutex();
+ unixLeaveMutex();
OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype),
rc==SQLITE_OK ? "ok" : "failed");
return rc;
@@ -20586,16 +24216,15 @@ afp_end_lock:
** If the locking level of the file descriptor is already at or below
** the requested locking level, this routine is a no-op.
*/
-static int afpUnixUnlock(sqlite3_file *id, int locktype) {
- struct flock lock;
+static int afpUnlock(sqlite3_file *id, int locktype) {
int rc = SQLITE_OK;
unixFile *pFile = (unixFile*)id;
- afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
+ afpLockingContext *pCtx = (afpLockingContext *) pFile->lockingContext;
assert( pFile );
OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype,
pFile->locktype, getpid());
-
+
assert( locktype<=SHARED_LOCK );
if( pFile->locktype<=locktype ){
return SQLITE_OK;
@@ -20603,319 +24232,514 @@ static int afpUnixUnlock(sqlite3_file *id, int locktype) {
if( CHECK_THREADID(pFile) ){
return SQLITE_MISUSE;
}
- enterMutex();
+ unixEnterMutex();
if( pFile->locktype>SHARED_LOCK ){
- if( locktype==SHARED_LOCK ){
- int failed = 0;
-
- /* unlock the exclusive range - then re-establish the shared lock */
- if (pFile->locktype==EXCLUSIVE_LOCK) {
- failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST,
- SHARED_SIZE, 0);
- if (!failed) {
- /* successfully removed the exclusive lock */
- if (_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST+
- context->sharedLockByte, 1, 1)) {
- /* failed to re-establish our shared lock */
- rc = SQLITE_IOERR_RDLOCK; /* This should never happen */
- }
- } else {
- /* This should never happen - failed to unlock the exclusive range */
- rc = SQLITE_IOERR_UNLOCK;
- }
+
+ if( pFile->locktype==EXCLUSIVE_LOCK ){
+ rc = afpSetLock(pCtx->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0);
+ if( rc==SQLITE_OK && locktype==SHARED_LOCK ){
+ /* only re-establish the shared lock if necessary */
+ int sharedLockByte = SHARED_FIRST+pCtx->sharedByte;
+ rc = afpSetLock(pCtx->dbPath, pFile, sharedLockByte, 1, 1);
}
}
- if (rc == SQLITE_OK && pFile->locktype>=PENDING_LOCK) {
- if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)){
- /* failed to release the pending lock */
- rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
- }
- }
- if (rc == SQLITE_OK && pFile->locktype>=RESERVED_LOCK) {
- if (_AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0)) {
- /* failed to release the reserved lock */
- rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
- }
+ if( rc==SQLITE_OK && pFile->locktype>=PENDING_LOCK ){
+ rc = afpSetLock(pCtx->dbPath, pFile, PENDING_BYTE, 1, 0);
}
+ if( rc==SQLITE_OK && pFile->locktype>=RESERVED_LOCK ){
+ rc = afpSetLock(pCtx->dbPath, pFile, RESERVED_BYTE, 1, 0);
+ }
+ }else if( locktype==NO_LOCK ){
+ /* clear the shared lock */
+ int sharedLockByte = SHARED_FIRST+pCtx->sharedByte;
+ rc = afpSetLock(pCtx->dbPath, pFile, sharedLockByte, 1, 0);
}
- if( locktype==NO_LOCK ){
- int failed = _AFPFSSetLock(context->filePath, pFile->h,
- SHARED_FIRST + context->sharedLockByte, 1, 0);
- if (failed) {
- rc = SQLITE_IOERR_UNLOCK; /* This should never happen */
+
+ if( rc==SQLITE_OK ){
+ if( locktype==NO_LOCK ){
+ struct unixOpenCnt *pOpen = pFile->pOpen;
+ pOpen->nLock--;
+ assert( pOpen->nLock>=0 );
+ if( pOpen->nLock==0 ){
+ rc = closePendingFds(pFile);
+ }
}
}
- if (rc == SQLITE_OK)
+ unixLeaveMutex();
+ if( rc==SQLITE_OK ){
pFile->locktype = locktype;
- leaveMutex();
+ }
return rc;
}
/*
** Close a file & cleanup AFP specific locking context
*/
-static int afpUnixClose(sqlite3_file *id) {
- unixFile *pFile = (unixFile*)id;
-
- if( !pFile ) return SQLITE_OK;
- afpUnixUnlock(id, NO_LOCK);
- sqlite3_free(pFile->lockingContext);
- if( pFile->dirfd>=0 ) close(pFile->dirfd);
- pFile->dirfd = -1;
- enterMutex();
- close(pFile->h);
- leaveMutex();
- OSTRACE2("CLOSE %-3d\n", pFile->h);
- OpenCounter(-1);
- memset(pFile, 0, sizeof(unixFile));
+static int afpClose(sqlite3_file *id) {
+ if( id ){
+ unixFile *pFile = (unixFile*)id;
+ afpUnlock(id, NO_LOCK);
+ unixEnterMutex();
+ if( pFile->pOpen && pFile->pOpen->nLock ){
+ /* If there are outstanding locks, do not actually close the file just
+ ** yet because that would clear those locks. Instead, add the file
+ ** descriptor to pOpen->aPending. It will be automatically closed when
+ ** the last lock is cleared.
+ */
+ setPendingFd(pFile);
+ }
+ releaseOpenCnt(pFile->pOpen);
+ sqlite3_free(pFile->lockingContext);
+ closeUnixFile(id);
+ unixLeaveMutex();
+ }
return SQLITE_OK;
}
+#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
+/*
+** The code above is the AFP lock implementation. The code is specific
+** to MacOSX and does not work on other unix platforms. No alternative
+** is available. If you don't compile for a mac, then the "unix-afp"
+** VFS is not available.
+**
+********************* End of the AFP lock implementation **********************
+******************************************************************************/
-#pragma mark flock() style locking
-/*
-** The flockLockingContext is not used
+/******************************************************************************
+**************** Non-locking sqlite3_file methods *****************************
+**
+** The next division contains implementations for all methods of the
+** sqlite3_file object other than the locking methods. The locking
+** methods were defined in divisions above (one locking method per
+** division). Those methods that are common to all locking modes
+** are gather together into this division.
*/
-typedef void flockLockingContext;
-static int flockUnixCheckReservedLock(sqlite3_file *id){
- unixFile *pFile = (unixFile*)id;
-
- if (pFile->locktype == RESERVED_LOCK) {
- return 1; /* already have a reserved lock */
- } else {
- /* attempt to get the lock */
- int rc = flock(pFile->h, LOCK_EX | LOCK_NB);
- if (!rc) {
- /* got the lock, unlock it */
- flock(pFile->h, LOCK_UN);
- return 0; /* no one has it reserved */
+/*
+** Seek to the offset passed as the second argument, then read cnt
+** bytes into pBuf. Return the number of bytes actually read.
+**
+** NB: If you define USE_PREAD or USE_PREAD64, then it might also
+** be necessary to define _XOPEN_SOURCE to be 500. This varies from
+** one system to another. Since SQLite does not define USE_PREAD
+** any any form by default, we will not attempt to define _XOPEN_SOURCE.
+** See tickets #2741 and #2681.
+**
+** To avoid stomping the errno value on a failed read the lastErrno value
+** is set before returning.
+*/
+static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){
+ int got;
+ i64 newOffset;
+ TIMER_START;
+#if defined(USE_PREAD)
+ got = pread(id->h, pBuf, cnt, offset);
+ SimulateIOError( got = -1 );
+#elif defined(USE_PREAD64)
+ got = pread64(id->h, pBuf, cnt, offset);
+ SimulateIOError( got = -1 );
+#else
+ newOffset = lseek(id->h, offset, SEEK_SET);
+ SimulateIOError( newOffset-- );
+ if( newOffset!=offset ){
+ if( newOffset == -1 ){
+ ((unixFile*)id)->lastErrno = errno;
+ }else{
+ ((unixFile*)id)->lastErrno = 0;
}
- return 1; /* someone else might have it reserved */
+ return -1;
+ }
+ got = read(id->h, pBuf, cnt);
+#endif
+ TIMER_END;
+ if( got<0 ){
+ ((unixFile*)id)->lastErrno = errno;
}
+ OSTRACE5("READ %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED);
+ return got;
}
-static int flockUnixLock(sqlite3_file *id, int locktype) {
- unixFile *pFile = (unixFile*)id;
-
- /* if we already have a lock, it is exclusive.
- ** Just adjust level and punt on outta here. */
- if (pFile->locktype > NO_LOCK) {
- pFile->locktype = locktype;
- return SQLITE_OK;
- }
-
- /* grab an exclusive lock */
- int rc = flock(pFile->h, LOCK_EX | LOCK_NB);
- if (rc) {
- /* didn't get, must be busy */
- return SQLITE_BUSY;
- } else {
- /* got it, set the type and return ok */
- pFile->locktype = locktype;
+/*
+** Read data from a file into a buffer. Return SQLITE_OK if all
+** bytes were read successfully and SQLITE_IOERR if anything goes
+** wrong.
+*/
+static int unixRead(
+ sqlite3_file *id,
+ void *pBuf,
+ int amt,
+ sqlite3_int64 offset
+){
+ unixFile *pFile = (unixFile *)id;
+ int got;
+ assert( id );
+
+ /* If this is a database file (not a journal, master-journal or temp
+ ** file), the bytes in the locking range should never be read or written. */
+ assert( pFile->pUnused==0
+ || offset>=PENDING_BYTE+512
+ || offset+amt<=PENDING_BYTE
+ );
+
+ got = seekAndRead(pFile, offset, pBuf, amt);
+ if( got==amt ){
return SQLITE_OK;
+ }else if( got<0 ){
+ /* lastErrno set by seekAndRead */
+ return SQLITE_IOERR_READ;
+ }else{
+ pFile->lastErrno = 0; /* not a system error */
+ /* Unread parts of the buffer must be zero-filled */
+ memset(&((char*)pBuf)[got], 0, amt-got);
+ return SQLITE_IOERR_SHORT_READ;
}
}
-static int flockUnixUnlock(sqlite3_file *id, int locktype) {
- unixFile *pFile = (unixFile*)id;
-
- assert( locktype<=SHARED_LOCK );
-
- /* no-op if possible */
- if( pFile->locktype==locktype ){
- return SQLITE_OK;
- }
-
- /* shared can just be set because we always have an exclusive */
- if (locktype==SHARED_LOCK) {
- pFile->locktype = locktype;
- return SQLITE_OK;
+/*
+** Seek to the offset in id->offset then read cnt bytes into pBuf.
+** Return the number of bytes actually read. Update the offset.
+**
+** To avoid stomping the errno value on a failed write the lastErrno value
+** is set before returning.
+*/
+static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){
+ int got;
+ i64 newOffset;
+ TIMER_START;
+#if defined(USE_PREAD)
+ got = pwrite(id->h, pBuf, cnt, offset);
+#elif defined(USE_PREAD64)
+ got = pwrite64(id->h, pBuf, cnt, offset);
+#else
+ newOffset = lseek(id->h, offset, SEEK_SET);
+ if( newOffset!=offset ){
+ if( newOffset == -1 ){
+ ((unixFile*)id)->lastErrno = errno;
+ }else{
+ ((unixFile*)id)->lastErrno = 0;
+ }
+ return -1;
}
-
- /* no, really, unlock. */
- int rc = flock(pFile->h, LOCK_UN);
- if (rc)
- return SQLITE_IOERR_UNLOCK;
- else {
- pFile->locktype = NO_LOCK;
- return SQLITE_OK;
+# ifndef VXWORKS
+ got = write(id->h, pBuf, cnt);
+# else
+ got = write(id->h, (char *)pBuf, cnt);
+# endif
+#endif
+ TIMER_END;
+ if( got<0 ){
+ ((unixFile*)id)->lastErrno = errno;
}
+
+ OSTRACE5("WRITE %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED);
+ return got;
}
+
/*
-** Close a file.
+** Write data from a buffer into a file. Return SQLITE_OK on success
+** or some other error code on failure.
*/
-static int flockUnixClose(sqlite3_file *id) {
+static int unixWrite(
+ sqlite3_file *id,
+ const void *pBuf,
+ int amt,
+ sqlite3_int64 offset
+){
unixFile *pFile = (unixFile*)id;
-
- if( !pFile ) return SQLITE_OK;
- flockUnixUnlock(id, NO_LOCK);
-
- if( pFile->dirfd>=0 ) close(pFile->dirfd);
- pFile->dirfd = -1;
+ int wrote = 0;
+ assert( id );
+ assert( amt>0 );
- enterMutex();
- close(pFile->h);
- leaveMutex();
- OSTRACE2("CLOSE %-3d\n", pFile->h);
- OpenCounter(-1);
- memset(pFile, 0, sizeof(unixFile));
+ /* If this is a database file (not a journal, master-journal or temp
+ ** file), the bytes in the locking range should never be read or written. */
+ assert( pFile->pUnused==0
+ || offset>=PENDING_BYTE+512
+ || offset+amt<=PENDING_BYTE
+ );
+
+#ifndef NDEBUG
+ /* If we are doing a normal write to a database file (as opposed to
+ ** doing a hot-journal rollback or a write to some file other than a
+ ** normal database file) then record the fact that the database
+ ** has changed. If the transaction counter is modified, record that
+ ** fact too.
+ */
+ if( pFile->inNormalWrite ){
+ pFile->dbUpdate = 1; /* The database has been modified */
+ if( offset<=24 && offset+amt>=27 ){
+ int rc;
+ char oldCntr[4];
+ SimulateIOErrorBenign(1);
+ rc = seekAndRead(pFile, 24, oldCntr, 4);
+ SimulateIOErrorBenign(0);
+ if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){
+ pFile->transCntrChng = 1; /* The transaction counter has changed */
+ }
+ }
+ }
+#endif
+
+ while( amt>0 && (wrote = seekAndWrite(pFile, offset, pBuf, amt))>0 ){
+ amt -= wrote;
+ offset += wrote;
+ pBuf = &((char*)pBuf)[wrote];
+ }
+ SimulateIOError(( wrote=(-1), amt=1 ));
+ SimulateDiskfullError(( wrote=0, amt=1 ));
+ if( amt>0 ){
+ if( wrote<0 ){
+ /* lastErrno set by seekAndWrite */
+ return SQLITE_IOERR_WRITE;
+ }else{
+ pFile->lastErrno = 0; /* not a system error */
+ return SQLITE_FULL;
+ }
+ }
return SQLITE_OK;
}
-#pragma mark Old-School .lock file based locking
+#ifdef SQLITE_TEST
+/*
+** Count the number of fullsyncs and normal syncs. This is used to test
+** that syncs and fullsyncs are occurring at the right times.
+*/
+SQLITE_API int sqlite3_sync_count = 0;
+SQLITE_API int sqlite3_fullsync_count = 0;
+#endif
/*
-** The dotlockLockingContext structure contains all dotlock (.lock) lock
-** specific state
+** We do not trust systems to provide a working fdatasync(). Some do.
+** Others do no. To be safe, we will stick with the (slower) fsync().
+** If you know that your system does support fdatasync() correctly,
+** then simply compile with -Dfdatasync=fdatasync
*/
-typedef struct dotlockLockingContext dotlockLockingContext;
-struct dotlockLockingContext {
- char *lockPath;
-};
+#if !defined(fdatasync) && !defined(__linux__)
+# define fdatasync fsync
+#endif
+/*
+** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not
+** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently
+** only available on Mac OS X. But that could change.
+*/
+#ifdef F_FULLFSYNC
+# define HAVE_FULLFSYNC 1
+#else
+# define HAVE_FULLFSYNC 0
+#endif
-static int dotlockUnixCheckReservedLock(sqlite3_file *id) {
- unixFile *pFile = (unixFile*)id;
- dotlockLockingContext *context;
- context = (dotlockLockingContext*)pFile->lockingContext;
- if (pFile->locktype == RESERVED_LOCK) {
- return 1; /* already have a reserved lock */
- } else {
- struct stat statBuf;
- if (lstat(context->lockPath,&statBuf) == 0){
- /* file exists, someone else has the lock */
- return 1;
- }else{
- /* file does not exist, we could have it if we want it */
- return 0;
- }
- }
-}
+/*
+** The fsync() system call does not work as advertised on many
+** unix systems. The following procedure is an attempt to make
+** it work better.
+**
+** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful
+** for testing when we want to run through the test suite quickly.
+** You are strongly advised *not* to deploy with SQLITE_NO_SYNC
+** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash
+** or power failure will likely corrupt the database file.
+**
+** SQLite sets the dataOnly flag if the size of the file is unchanged.
+** The idea behind dataOnly is that it should only write the file content
+** to disk, not the inode. We only set dataOnly if the file size is
+** unchanged since the file size is part of the inode. However,
+** Ted Ts'o tells us that fdatasync() will also write the inode if the
+** file size has changed. The only real difference between fdatasync()
+** and fsync(), Ted tells us, is that fdatasync() will not flush the
+** inode if the mtime or owner or other inode attributes have changed.
+** We only care about the file size, not the other file attributes, so
+** as far as SQLite is concerned, an fdatasync() is always adequate.
+** So, we always use fdatasync() if it is available, regardless of
+** the value of the dataOnly flag.
+*/
+static int full_fsync(int fd, int fullSync, int dataOnly){
+ int rc;
-static int dotlockUnixLock(sqlite3_file *id, int locktype) {
- unixFile *pFile = (unixFile*)id;
- dotlockLockingContext *context;
- int fd;
+ /* The following "ifdef/elif/else/" block has the same structure as
+ ** the one below. It is replicated here solely to avoid cluttering
+ ** up the real code with the UNUSED_PARAMETER() macros.
+ */
+#ifdef SQLITE_NO_SYNC
+ UNUSED_PARAMETER(fd);
+ UNUSED_PARAMETER(fullSync);
+ UNUSED_PARAMETER(dataOnly);
+#elif HAVE_FULLFSYNC
+ UNUSED_PARAMETER(dataOnly);
+#else
+ UNUSED_PARAMETER(fullSync);
+ UNUSED_PARAMETER(dataOnly);
+#endif
- context = (dotlockLockingContext*)pFile->lockingContext;
-
- /* if we already have a lock, it is exclusive.
- ** Just adjust level and punt on outta here. */
- if (pFile->locktype > NO_LOCK) {
- pFile->locktype = locktype;
-
- /* Always update the timestamp on the old file */
- utimes(context->lockPath,NULL);
- return SQLITE_OK;
+ /* Record the number of times that we do a normal fsync() and
+ ** FULLSYNC. This is used during testing to verify that this procedure
+ ** gets called with the correct arguments.
+ */
+#ifdef SQLITE_TEST
+ if( fullSync ) sqlite3_fullsync_count++;
+ sqlite3_sync_count++;
+#endif
+
+ /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
+ ** no-op
+ */
+#ifdef SQLITE_NO_SYNC
+ rc = SQLITE_OK;
+#elif HAVE_FULLFSYNC
+ if( fullSync ){
+ rc = fcntl(fd, F_FULLFSYNC, 0);
+ }else{
+ rc = 1;
}
-
- /* check to see if lock file already exists */
- struct stat statBuf;
- if (lstat(context->lockPath,&statBuf) == 0){
- return SQLITE_BUSY; /* it does, busy */
+ /* If the FULLFSYNC failed, fall back to attempting an fsync().
+ ** It shouldn't be possible for fullfsync to fail on the local
+ ** file system (on OSX), so failure indicates that FULLFSYNC
+ ** isn't supported for this file system. So, attempt an fsync
+ ** and (for now) ignore the overhead of a superfluous fcntl call.
+ ** It'd be better to detect fullfsync support once and avoid
+ ** the fcntl call every time sync is called.
+ */
+ if( rc ) rc = fsync(fd);
+
+#else
+ rc = fdatasync(fd);
+#if OS_VXWORKS
+ if( rc==-1 && errno==ENOTSUP ){
+ rc = fsync(fd);
}
-
- /* grab an exclusive lock */
- fd = open(context->lockPath,O_RDONLY|O_CREAT|O_EXCL,0600);
- if( fd<0 ){
- /* failed to open/create the file, someone else may have stolen the lock */
- return SQLITE_BUSY;
+#endif /* OS_VXWORKS */
+#endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */
+
+ if( OS_VXWORKS && rc!= -1 ){
+ rc = 0;
}
- close(fd);
-
- /* got it, set the type and return ok */
- pFile->locktype = locktype;
- return SQLITE_OK;
+ return rc;
}
-static int dotlockUnixUnlock(sqlite3_file *id, int locktype) {
+/*
+** Make sure all writes to a particular file are committed to disk.
+**
+** If dataOnly==0 then both the file itself and its metadata (file
+** size, access time, etc) are synced. If dataOnly!=0 then only the
+** file data is synced.
+**
+** Under Unix, also make sure that the directory entry for the file
+** has been created by fsync-ing the directory that contains the file.
+** If we do not do this and we encounter a power failure, the directory
+** entry for the journal might not exist after we reboot. The next
+** SQLite to access the file will not know that the journal exists (because
+** the directory entry for the journal was never created) and the transaction
+** will not roll back - possibly leading to database corruption.
+*/
+static int unixSync(sqlite3_file *id, int flags){
+ int rc;
unixFile *pFile = (unixFile*)id;
- dotlockLockingContext *context;
- context = (dotlockLockingContext*)pFile->lockingContext;
-
- assert( locktype<=SHARED_LOCK );
-
- /* no-op if possible */
- if( pFile->locktype==locktype ){
- return SQLITE_OK;
+ int isDataOnly = (flags&SQLITE_SYNC_DATAONLY);
+ int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL;
+
+ /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
+ assert((flags&0x0F)==SQLITE_SYNC_NORMAL
+ || (flags&0x0F)==SQLITE_SYNC_FULL
+ );
+
+ /* Unix cannot, but some systems may return SQLITE_FULL from here. This
+ ** line is to test that doing so does not cause any problems.
+ */
+ SimulateDiskfullError( return SQLITE_FULL );
+
+ assert( pFile );
+ OSTRACE2("SYNC %-3d\n", pFile->h);
+ rc = full_fsync(pFile->h, isFullsync, isDataOnly);
+ SimulateIOError( rc=1 );
+ if( rc ){
+ pFile->lastErrno = errno;
+ return SQLITE_IOERR_FSYNC;
}
-
- /* shared can just be set because we always have an exclusive */
- if (locktype==SHARED_LOCK) {
- pFile->locktype = locktype;
- return SQLITE_OK;
+ if( pFile->dirfd>=0 ){
+ int err;
+ OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
+ HAVE_FULLFSYNC, isFullsync);
+#ifndef SQLITE_DISABLE_DIRSYNC
+ /* The directory sync is only attempted if full_fsync is
+ ** turned off or unavailable. If a full_fsync occurred above,
+ ** then the directory sync is superfluous.
+ */
+ if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){
+ /*
+ ** We have received multiple reports of fsync() returning
+ ** errors when applied to directories on certain file systems.
+ ** A failed directory sync is not a big deal. So it seems
+ ** better to ignore the error. Ticket #1657
+ */
+ /* pFile->lastErrno = errno; */
+ /* return SQLITE_IOERR; */
+ }
+#endif
+ err = close(pFile->dirfd); /* Only need to sync once, so close the */
+ if( err==0 ){ /* directory when we are done */
+ pFile->dirfd = -1;
+ }else{
+ pFile->lastErrno = errno;
+ rc = SQLITE_IOERR_DIR_CLOSE;
+ }
}
-
- /* no, really, unlock. */
- unlink(context->lockPath);
- pFile->locktype = NO_LOCK;
- return SQLITE_OK;
+ return rc;
}
/*
- ** Close a file.
- */
-static int dotlockUnixClose(sqlite3_file *id) {
- unixFile *pFile = (unixFile*)id;
-
- if( !pFile ) return SQLITE_OK;
- dotlockUnixUnlock(id, NO_LOCK);
- sqlite3_free(pFile->lockingContext);
- if( pFile->dirfd>=0 ) close(pFile->dirfd);
- pFile->dirfd = -1;
- enterMutex();
- close(pFile->h);
- leaveMutex();
- OSTRACE2("CLOSE %-3d\n", pFile->h);
- OpenCounter(-1);
- memset(pFile, 0, sizeof(unixFile));
- return SQLITE_OK;
+** Truncate an open file to a specified size
+*/
+static int unixTruncate(sqlite3_file *id, i64 nByte){
+ int rc;
+ assert( id );
+ SimulateIOError( return SQLITE_IOERR_TRUNCATE );
+ rc = ftruncate(((unixFile*)id)->h, (off_t)nByte);
+ if( rc ){
+ ((unixFile*)id)->lastErrno = errno;
+ return SQLITE_IOERR_TRUNCATE;
+ }else{
+ return SQLITE_OK;
+ }
}
-
-#pragma mark No locking
-
/*
-** The nolockLockingContext is void
+** Determine the current size of a file in bytes
*/
-typedef void nolockLockingContext;
+static int unixFileSize(sqlite3_file *id, i64 *pSize){
+ int rc;
+ struct stat buf;
+ assert( id );
+ rc = fstat(((unixFile*)id)->h, &buf);
+ SimulateIOError( rc=1 );
+ if( rc!=0 ){
+ ((unixFile*)id)->lastErrno = errno;
+ return SQLITE_IOERR_FSTAT;
+ }
+ *pSize = buf.st_size;
-static int nolockUnixCheckReservedLock(sqlite3_file *id) {
- return 0;
-}
+ /* When opening a zero-size database, the findLockInfo() procedure
+ ** writes a single byte into that file in order to work around a bug
+ ** in the OS-X msdos filesystem. In order to avoid problems with upper
+ ** layers, we need to report this file size as zero even though it is
+ ** really 1. Ticket #3260.
+ */
+ if( *pSize==1 ) *pSize = 0;
-static int nolockUnixLock(sqlite3_file *id, int locktype) {
- return SQLITE_OK;
-}
-static int nolockUnixUnlock(sqlite3_file *id, int locktype) {
return SQLITE_OK;
}
+#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
/*
-** Close a file.
+** Handler for proxy-locking file-control verbs. Defined below in the
+** proxying locking division.
*/
-static int nolockUnixClose(sqlite3_file *id) {
- unixFile *pFile = (unixFile*)id;
-
- if( !pFile ) return SQLITE_OK;
- if( pFile->dirfd>=0 ) close(pFile->dirfd);
- pFile->dirfd = -1;
- enterMutex();
- close(pFile->h);
- leaveMutex();
- OSTRACE2("CLOSE %-3d\n", pFile->h);
- OpenCounter(-1);
- memset(pFile, 0, sizeof(unixFile));
- return SQLITE_OK;
-}
-
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
+static int proxyFileControl(sqlite3_file*,int,void*);
+#endif
/*
@@ -20927,6 +24751,27 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
*(int*)pArg = ((unixFile*)id)->locktype;
return SQLITE_OK;
}
+ case SQLITE_LAST_ERRNO: {
+ *(int*)pArg = ((unixFile*)id)->lastErrno;
+ return SQLITE_OK;
+ }
+#ifndef NDEBUG
+ /* The pager calls this method to signal that it has done
+ ** a rollback and that the database is therefore unchanged and
+ ** it hence it is OK for the transaction change counter to be
+ ** unchanged.
+ */
+ case SQLITE_FCNTL_DB_UNCHANGED: {
+ ((unixFile*)id)->dbUpdate = 0;
+ return SQLITE_OK;
+ }
+#endif
+#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
+ case SQLITE_SET_LOCKPROXYFILE:
+ case SQLITE_GET_LOCKPROXYFILE: {
+ return proxyFileControl(id,op,pArg);
+ }
+#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */
}
return SQLITE_ERROR;
}
@@ -20941,257 +24786,462 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
** a database and its journal file) that the sector size will be the
** same for both.
*/
-static int unixSectorSize(sqlite3_file *id){
+static int unixSectorSize(sqlite3_file *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
return SQLITE_DEFAULT_SECTOR_SIZE;
}
/*
-** Return the device characteristics for the file. This is always 0.
+** Return the device characteristics for the file. This is always 0 for unix.
*/
-static int unixDeviceCharacteristics(sqlite3_file *id){
+static int unixDeviceCharacteristics(sqlite3_file *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
return 0;
}
/*
-** This vector defines all the methods that can operate on an sqlite3_file
-** for unix.
-*/
-static const sqlite3_io_methods sqlite3UnixIoMethod = {
- 1, /* iVersion */
- unixClose,
- unixRead,
- unixWrite,
- unixTruncate,
- unixSync,
- unixFileSize,
- unixLock,
- unixUnlock,
- unixCheckReservedLock,
- unixFileControl,
- unixSectorSize,
- unixDeviceCharacteristics
-};
+** Here ends the implementation of all sqlite3_file methods.
+**
+********************** End sqlite3_file Methods *******************************
+******************************************************************************/
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
/*
-** This vector defines all the methods that can operate on an sqlite3_file
-** for unix with AFP style file locking.
+** This division contains definitions of sqlite3_io_methods objects that
+** implement various file locking strategies. It also contains definitions
+** of "finder" functions. A finder-function is used to locate the appropriate
+** sqlite3_io_methods object for a particular database file. The pAppData
+** field of the sqlite3_vfs VFS objects are initialized to be pointers to
+** the correct finder-function for that VFS.
+**
+** Most finder functions return a pointer to a fixed sqlite3_io_methods
+** object. The only interesting finder-function is autolockIoFinder, which
+** looks at the filesystem type and tries to guess the best locking
+** strategy from that.
+**
+** For finder-funtion F, two objects are created:
+**
+** (1) The real finder-function named "FImpt()".
+**
+** (2) A constant pointer to this function named just "F".
+**
+**
+** A pointer to the F pointer is used as the pAppData value for VFS
+** objects. We have to do this instead of letting pAppData point
+** directly at the finder-function since C90 rules prevent a void*
+** from be cast into a function pointer.
+**
+**
+** Each instance of this macro generates two objects:
+**
+** * A constant sqlite3_io_methods object call METHOD that has locking
+** methods CLOSE, LOCK, UNLOCK, CKRESLOCK.
+**
+** * An I/O method finder function called FINDER that returns a pointer
+** to the METHOD object in the previous bullet.
+*/
+#define IOMETHODS(FINDER, METHOD, CLOSE, LOCK, UNLOCK, CKLOCK) \
+static const sqlite3_io_methods METHOD = { \
+ 1, /* iVersion */ \
+ CLOSE, /* xClose */ \
+ unixRead, /* xRead */ \
+ unixWrite, /* xWrite */ \
+ unixTruncate, /* xTruncate */ \
+ unixSync, /* xSync */ \
+ unixFileSize, /* xFileSize */ \
+ LOCK, /* xLock */ \
+ UNLOCK, /* xUnlock */ \
+ CKLOCK, /* xCheckReservedLock */ \
+ unixFileControl, /* xFileControl */ \
+ unixSectorSize, /* xSectorSize */ \
+ unixDeviceCharacteristics /* xDeviceCapabilities */ \
+}; \
+static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \
+ UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \
+ return &METHOD; \
+} \
+static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \
+ = FINDER##Impl;
+
+/*
+** Here are all of the sqlite3_io_methods objects for each of the
+** locking strategies. Functions that return pointers to these methods
+** are also created.
+*/
+IOMETHODS(
+ posixIoFinder, /* Finder function name */
+ posixIoMethods, /* sqlite3_io_methods object name */
+ unixClose, /* xClose method */
+ unixLock, /* xLock method */
+ unixUnlock, /* xUnlock method */
+ unixCheckReservedLock /* xCheckReservedLock method */
+)
+IOMETHODS(
+ nolockIoFinder, /* Finder function name */
+ nolockIoMethods, /* sqlite3_io_methods object name */
+ nolockClose, /* xClose method */
+ nolockLock, /* xLock method */
+ nolockUnlock, /* xUnlock method */
+ nolockCheckReservedLock /* xCheckReservedLock method */
+)
+IOMETHODS(
+ dotlockIoFinder, /* Finder function name */
+ dotlockIoMethods, /* sqlite3_io_methods object name */
+ dotlockClose, /* xClose method */
+ dotlockLock, /* xLock method */
+ dotlockUnlock, /* xUnlock method */
+ dotlockCheckReservedLock /* xCheckReservedLock method */
+)
+
+#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS
+IOMETHODS(
+ flockIoFinder, /* Finder function name */
+ flockIoMethods, /* sqlite3_io_methods object name */
+ flockClose, /* xClose method */
+ flockLock, /* xLock method */
+ flockUnlock, /* xUnlock method */
+ flockCheckReservedLock /* xCheckReservedLock method */
+)
+#endif
+
+#if OS_VXWORKS
+IOMETHODS(
+ semIoFinder, /* Finder function name */
+ semIoMethods, /* sqlite3_io_methods object name */
+ semClose, /* xClose method */
+ semLock, /* xLock method */
+ semUnlock, /* xUnlock method */
+ semCheckReservedLock /* xCheckReservedLock method */
+)
+#endif
+
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+IOMETHODS(
+ afpIoFinder, /* Finder function name */
+ afpIoMethods, /* sqlite3_io_methods object name */
+ afpClose, /* xClose method */
+ afpLock, /* xLock method */
+ afpUnlock, /* xUnlock method */
+ afpCheckReservedLock /* xCheckReservedLock method */
+)
+#endif
+
+/*
+** The "Whole File Locking" finder returns the same set of methods as
+** the posix locking finder. But it also sets the SQLITE_WHOLE_FILE_LOCKING
+** flag to force the posix advisory locks to cover the whole file instead
+** of just a small span of bytes near the 1GiB boundary. Whole File Locking
+** is useful on NFS-mounted files since it helps NFS to maintain cache
+** coherency. But it is a detriment to other filesystems since it runs
+** slower.
+*/
+static const sqlite3_io_methods *posixWflIoFinderImpl(const char*z, unixFile*p){
+ UNUSED_PARAMETER(z);
+ p->fileFlags = SQLITE_WHOLE_FILE_LOCKING;
+ return &posixIoMethods;
+}
+static const sqlite3_io_methods
+ *(*const posixWflIoFinder)(const char*,unixFile *p) = posixWflIoFinderImpl;
+
+/*
+** The proxy locking method is a "super-method" in the sense that it
+** opens secondary file descriptors for the conch and lock files and
+** it uses proxy, dot-file, AFP, and flock() locking methods on those
+** secondary files. For this reason, the division that implements
+** proxy locking is located much further down in the file. But we need
+** to go ahead and define the sqlite3_io_methods and finder function
+** for proxy locking here. So we forward declare the I/O methods.
+*/
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+static int proxyClose(sqlite3_file*);
+static int proxyLock(sqlite3_file*, int);
+static int proxyUnlock(sqlite3_file*, int);
+static int proxyCheckReservedLock(sqlite3_file*, int*);
+IOMETHODS(
+ proxyIoFinder, /* Finder function name */
+ proxyIoMethods, /* sqlite3_io_methods object name */
+ proxyClose, /* xClose method */
+ proxyLock, /* xLock method */
+ proxyUnlock, /* xUnlock method */
+ proxyCheckReservedLock /* xCheckReservedLock method */
+)
+#endif
+
+
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+/*
+** This "finder" function attempts to determine the best locking strategy
+** for the database file "filePath". It then returns the sqlite3_io_methods
+** object that implements that strategy.
+**
+** This is for MacOSX only.
*/
-static const sqlite3_io_methods sqlite3AFPLockingUnixIoMethod = {
- 1, /* iVersion */
- afpUnixClose,
- unixRead,
- unixWrite,
- unixTruncate,
- unixSync,
- unixFileSize,
- afpUnixLock,
- afpUnixUnlock,
- afpUnixCheckReservedLock,
- unixFileControl,
- unixSectorSize,
- unixDeviceCharacteristics
-};
+static const sqlite3_io_methods *autolockIoFinderImpl(
+ const char *filePath, /* name of the database file */
+ unixFile *pNew /* open file object for the database file */
+){
+ static const struct Mapping {
+ const char *zFilesystem; /* Filesystem type name */
+ const sqlite3_io_methods *pMethods; /* Appropriate locking method */
+ } aMap[] = {
+ { "hfs", &posixIoMethods },
+ { "ufs", &posixIoMethods },
+ { "afpfs", &afpIoMethods },
+#ifdef SQLITE_ENABLE_AFP_LOCKING_SMB
+ { "smbfs", &afpIoMethods },
+#else
+ { "smbfs", &flockIoMethods },
+#endif
+ { "webdav", &nolockIoMethods },
+ { 0, 0 }
+ };
+ int i;
+ struct statfs fsInfo;
+ struct flock lockInfo;
-/*
-** This vector defines all the methods that can operate on an sqlite3_file
-** for unix with flock() style file locking.
-*/
-static const sqlite3_io_methods sqlite3FlockLockingUnixIoMethod = {
- 1, /* iVersion */
- flockUnixClose,
- unixRead,
- unixWrite,
- unixTruncate,
- unixSync,
- unixFileSize,
- flockUnixLock,
- flockUnixUnlock,
- flockUnixCheckReservedLock,
- unixFileControl,
- unixSectorSize,
- unixDeviceCharacteristics
-};
+ if( !filePath ){
+ /* If filePath==NULL that means we are dealing with a transient file
+ ** that does not need to be locked. */
+ return &nolockIoMethods;
+ }
+ if( statfs(filePath, &fsInfo) != -1 ){
+ if( fsInfo.f_flags & MNT_RDONLY ){
+ return &nolockIoMethods;
+ }
+ for(i=0; aMap[i].zFilesystem; i++){
+ if( strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem)==0 ){
+ return aMap[i].pMethods;
+ }
+ }
+ }
-/*
-** This vector defines all the methods that can operate on an sqlite3_file
-** for unix with dotlock style file locking.
+ /* Default case. Handles, amongst others, "nfs".
+ ** Test byte-range lock using fcntl(). If the call succeeds,
+ ** assume that the file-system supports POSIX style locks.
+ */
+ lockInfo.l_len = 1;
+ lockInfo.l_start = 0;
+ lockInfo.l_whence = SEEK_SET;
+ lockInfo.l_type = F_RDLCK;
+ if( fcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) {
+ pNew->fileFlags = SQLITE_WHOLE_FILE_LOCKING;
+ return &posixIoMethods;
+ }else{
+ return &dotlockIoMethods;
+ }
+}
+static const sqlite3_io_methods
+ *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl;
+
+#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
+
+#if OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE
+/*
+** This "finder" function attempts to determine the best locking strategy
+** for the database file "filePath". It then returns the sqlite3_io_methods
+** object that implements that strategy.
+**
+** This is for VXWorks only.
*/
-static const sqlite3_io_methods sqlite3DotlockLockingUnixIoMethod = {
- 1, /* iVersion */
- dotlockUnixClose,
- unixRead,
- unixWrite,
- unixTruncate,
- unixSync,
- unixFileSize,
- dotlockUnixLock,
- dotlockUnixUnlock,
- dotlockUnixCheckReservedLock,
- unixFileControl,
- unixSectorSize,
- unixDeviceCharacteristics
-};
+static const sqlite3_io_methods *autolockIoFinderImpl(
+ const char *filePath, /* name of the database file */
+ unixFile *pNew /* the open file object */
+){
+ struct flock lockInfo;
+
+ if( !filePath ){
+ /* If filePath==NULL that means we are dealing with a transient file
+ ** that does not need to be locked. */
+ return &nolockIoMethods;
+ }
+
+ /* Test if fcntl() is supported and use POSIX style locks.
+ ** Otherwise fall back to the named semaphore method.
+ */
+ lockInfo.l_len = 1;
+ lockInfo.l_start = 0;
+ lockInfo.l_whence = SEEK_SET;
+ lockInfo.l_type = F_RDLCK;
+ if( fcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) {
+ return &posixIoMethods;
+ }else{
+ return &semIoMethods;
+ }
+}
+static const sqlite3_io_methods
+ *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl;
+
+#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */
/*
-** This vector defines all the methods that can operate on an sqlite3_file
-** for unix with nolock style file locking.
+** An abstract type for a pointer to a IO method finder function:
*/
-static const sqlite3_io_methods sqlite3NolockLockingUnixIoMethod = {
- 1, /* iVersion */
- nolockUnixClose,
- unixRead,
- unixWrite,
- unixTruncate,
- unixSync,
- unixFileSize,
- nolockUnixLock,
- nolockUnixUnlock,
- nolockUnixCheckReservedLock,
- unixFileControl,
- unixSectorSize,
- unixDeviceCharacteristics
-};
+typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*);
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
-/*
-** Allocate memory for a new unixFile and initialize that unixFile.
-** Write a pointer to the new unixFile into *pId.
-** If we run out of memory, close the file and return an error.
+/****************************************************************************
+**************************** sqlite3_vfs methods ****************************
+**
+** This division contains the implementation of methods on the
+** sqlite3_vfs object.
*/
-#ifdef SQLITE_ENABLE_LOCKING_STYLE
-/*
-** When locking extensions are enabled, the filepath and locking style
-** are needed to determine the unixFile pMethod to use for locking operations.
-** The locking-style specific lockingContext data structure is created
-** and assigned here also.
+
+/*
+** Initialize the contents of the unixFile structure pointed to by pId.
*/
static int fillInUnixFile(
+ sqlite3_vfs *pVfs, /* Pointer to vfs object */
int h, /* Open file descriptor of file being opened */
int dirfd, /* Directory file descriptor */
sqlite3_file *pId, /* Write to the unixFile structure here */
- const char *zFilename /* Name of the file being opened */
+ const char *zFilename, /* Name of the file being opened */
+ int noLock, /* Omit locking if true */
+ int isDelete /* Delete on close if true */
){
- sqlite3LockingStyle lockingStyle;
+ const sqlite3_io_methods *pLockingStyle;
unixFile *pNew = (unixFile *)pId;
- int rc;
+ int rc = SQLITE_OK;
-#ifdef FD_CLOEXEC
- fcntl(h, F_SETFD, fcntl(h, F_GETFD, 0) | FD_CLOEXEC);
-#endif
+ assert( pNew->pLock==NULL );
+ assert( pNew->pOpen==NULL );
- lockingStyle = sqlite3DetectLockingStyle(zFilename, h);
- if ( lockingStyle==posixLockingStyle ){
- enterMutex();
- rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen);
- leaveMutex();
- if( rc ){
- if( dirfd>=0 ) close(dirfd);
- close(h);
- return rc;
- }
- } else {
- /* pLock and pOpen are only used for posix advisory locking */
- pNew->pLock = NULL;
- pNew->pOpen = NULL;
- }
+ /* Parameter isDelete is only used on vxworks. Express this explicitly
+ ** here to prevent compiler warnings about unused parameters.
+ */
+ UNUSED_PARAMETER(isDelete);
OSTRACE3("OPEN %-3d %s\n", h, zFilename);
- pNew->dirfd = -1;
pNew->h = h;
pNew->dirfd = dirfd;
SET_THREADID(pNew);
-
- switch(lockingStyle) {
- case afpLockingStyle: {
- /* afp locking uses the file path so it needs to be included in
- ** the afpLockingContext */
- afpLockingContext *context;
- pNew->pMethod = &sqlite3AFPLockingUnixIoMethod;
- pNew->lockingContext = context = sqlite3_malloc( sizeof(*context) );
- if( context==0 ){
- close(h);
- if( dirfd>=0 ) close(dirfd);
- return SQLITE_NOMEM;
- }
+ pNew->fileFlags = 0;
+
+#if OS_VXWORKS
+ pNew->pId = vxworksFindFileId(zFilename);
+ if( pNew->pId==0 ){
+ noLock = 1;
+ rc = SQLITE_NOMEM;
+ }
+#endif
+
+ if( noLock ){
+ pLockingStyle = &nolockIoMethods;
+ }else{
+ pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew);
+#if SQLITE_ENABLE_LOCKING_STYLE
+ /* Cache zFilename in the locking context (AFP and dotlock override) for
+ ** proxyLock activation is possible (remote proxy is based on db name)
+ ** zFilename remains valid until file is closed, to support */
+ pNew->lockingContext = (void*)zFilename;
+#endif
+ }
+
+ if( pLockingStyle == &posixIoMethods ){
+ unixEnterMutex();
+ rc = findLockInfo(pNew, &pNew->pLock, &pNew->pOpen);
+ if( rc!=SQLITE_OK ){
+ /* If an error occured in findLockInfo(), close the file descriptor
+ ** immediately, before releasing the mutex. findLockInfo() may fail
+ ** in two scenarios:
+ **
+ ** (a) A call to fstat() failed.
+ ** (b) A malloc failed.
+ **
+ ** Scenario (b) may only occur if the process is holding no other
+ ** file descriptors open on the same file. If there were other file
+ ** descriptors on this file, then no malloc would be required by
+ ** findLockInfo(). If this is the case, it is quite safe to close
+ ** handle h - as it is guaranteed that no posix locks will be released
+ ** by doing so.
+ **
+ ** If scenario (a) caused the error then things are not so safe. The
+ ** implicit assumption here is that if fstat() fails, things are in
+ ** such bad shape that dropping a lock or two doesn't matter much.
+ */
+ close(h);
+ h = -1;
+ }
+ unixLeaveMutex();
+ }
+#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
+ else if( pLockingStyle == &afpIoMethods ){
+ /* AFP locking uses the file path so it needs to be included in
+ ** the afpLockingContext.
+ */
+ afpLockingContext *pCtx;
+ pNew->lockingContext = pCtx = sqlite3_malloc( sizeof(*pCtx) );
+ if( pCtx==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
/* NB: zFilename exists and remains valid until the file is closed
** according to requirement F11141. So we do not need to make a
** copy of the filename. */
- context->filePath = zFilename;
+ pCtx->dbPath = zFilename;
srandomdev();
- break;
+ unixEnterMutex();
+ rc = findLockInfo(pNew, NULL, &pNew->pOpen);
+ unixLeaveMutex();
}
- case flockLockingStyle:
- /* flock locking doesn't need additional lockingContext information */
- pNew->pMethod = &sqlite3FlockLockingUnixIoMethod;
- break;
- case dotlockLockingStyle: {
- /* dotlock locking uses the file path so it needs to be included in
- ** the dotlockLockingContext */
- dotlockLockingContext *context;
- int nFilename;
- nFilename = strlen(zFilename);
- pNew->pMethod = &sqlite3DotlockLockingUnixIoMethod;
- pNew->lockingContext = context =
- sqlite3_malloc( sizeof(*context) + nFilename + 6 );
- if( context==0 ){
- close(h);
- if( dirfd>=0 ) close(dirfd);
- return SQLITE_NOMEM;
- }
- context->lockPath = (char*)&context[1];
- sqlite3_snprintf(nFilename, context->lockPath,
- "%s.lock", zFilename);
- break;
- }
- case posixLockingStyle:
- /* posix locking doesn't need additional lockingContext information */
- pNew->pMethod = &sqlite3UnixIoMethod;
- break;
- case noLockingStyle:
- case unsupportedLockingStyle:
- default:
- pNew->pMethod = &sqlite3NolockLockingUnixIoMethod;
}
- OpenCounter(+1);
- return SQLITE_OK;
-}
-#else /* SQLITE_ENABLE_LOCKING_STYLE */
-static int fillInUnixFile(
- int h, /* Open file descriptor on file being opened */
- int dirfd,
- sqlite3_file *pId, /* Write to the unixFile structure here */
- const char *zFilename /* Name of the file being opened */
-){
- unixFile *pNew = (unixFile *)pId;
- int rc;
-
-#ifdef FD_CLOEXEC
- fcntl(h, F_SETFD, fcntl(h, F_GETFD, 0) | FD_CLOEXEC);
#endif
- enterMutex();
- rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen);
- leaveMutex();
- if( rc ){
- if( dirfd>=0 ) close(dirfd);
- close(h);
- return rc;
+ else if( pLockingStyle == &dotlockIoMethods ){
+ /* Dotfile locking uses the file path so it needs to be included in
+ ** the dotlockLockingContext
+ */
+ char *zLockFile;
+ int nFilename;
+ nFilename = (int)strlen(zFilename) + 6;
+ zLockFile = (char *)sqlite3_malloc(nFilename);
+ if( zLockFile==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename);
+ }
+ pNew->lockingContext = zLockFile;
}
- OSTRACE3("OPEN %-3d %s\n", h, zFilename);
- pNew->dirfd = -1;
- pNew->h = h;
- pNew->dirfd = dirfd;
- SET_THREADID(pNew);
-
- pNew->pMethod = &sqlite3UnixIoMethod;
- OpenCounter(+1);
- return SQLITE_OK;
+#if OS_VXWORKS
+ else if( pLockingStyle == &semIoMethods ){
+ /* Named semaphore locking uses the file path so it needs to be
+ ** included in the semLockingContext
+ */
+ unixEnterMutex();
+ rc = findLockInfo(pNew, &pNew->pLock, &pNew->pOpen);
+ if( (rc==SQLITE_OK) && (pNew->pOpen->pSem==NULL) ){
+ char *zSemName = pNew->pOpen->aSemName;
+ int n;
+ sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem",
+ pNew->pId->zCanonicalName);
+ for( n=1; zSemName[n]; n++ )
+ if( zSemName[n]=='/' ) zSemName[n] = '_';
+ pNew->pOpen->pSem = sem_open(zSemName, O_CREAT, 0666, 1);
+ if( pNew->pOpen->pSem == SEM_FAILED ){
+ rc = SQLITE_NOMEM;
+ pNew->pOpen->aSemName[0] = '\0';
+ }
+ }
+ unixLeaveMutex();
+ }
+#endif
+
+ pNew->lastErrno = 0;
+#if OS_VXWORKS
+ if( rc!=SQLITE_OK ){
+ unlink(zFilename);
+ isDelete = 0;
+ }
+ pNew->isDelete = isDelete;
+#endif
+ if( rc!=SQLITE_OK ){
+ if( dirfd>=0 ) close(dirfd); /* silent leak if fail, already in error */
+ if( h>=0 ) close(h);
+ }else{
+ pNew->pMethod = pLockingStyle;
+ OpenCounter(+1);
+ }
+ return rc;
}
-#endif /* SQLITE_ENABLE_LOCKING_STYLE */
/*
** Open a file descriptor to the directory containing file zFilename.
@@ -21209,7 +25259,7 @@ static int openDirectory(const char *zFilename, int *pFd){
char zDirname[MAX_PATHNAME+1];
sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename);
- for(ii=strlen(zDirname); ii>=0 && zDirname[ii]!='/'; ii--);
+ for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--);
if( ii>0 ){
zDirname[ii] = '\0';
fd = open(zDirname, O_RDONLY|O_BINARY, 0);
@@ -21225,6 +25275,133 @@ static int openDirectory(const char *zFilename, int *pFd){
}
/*
+** Create a temporary file name in zBuf. zBuf must be allocated
+** by the calling process and must be big enough to hold at least
+** pVfs->mxPathname bytes.
+*/
+static int getTempname(int nBuf, char *zBuf){
+ static const char *azDirs[] = {
+ 0,
+ 0,
+ "/var/tmp",
+ "/usr/tmp",
+ "/tmp",
+ ".",
+ };
+ static const unsigned char zChars[] =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789";
+ unsigned int i, j;
+ struct stat buf;
+ const char *zDir = ".";
+
+ /* It's odd to simulate an io-error here, but really this is just
+ ** using the io-error infrastructure to test that SQLite handles this
+ ** function failing.
+ */
+ SimulateIOError( return SQLITE_IOERR );
+
+ azDirs[0] = sqlite3_temp_directory;
+ if (NULL == azDirs[1]) {
+ azDirs[1] = getenv("TMPDIR");
+ }
+
+ for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
+ if( azDirs[i]==0 ) continue;
+ if( stat(azDirs[i], &buf) ) continue;
+ if( !S_ISDIR(buf.st_mode) ) continue;
+ if( access(azDirs[i], 07) ) continue;
+ zDir = azDirs[i];
+ break;
+ }
+
+ /* Check that the output buffer is large enough for the temporary file
+ ** name. If it is not, return SQLITE_ERROR.
+ */
+ if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 17) >= (size_t)nBuf ){
+ return SQLITE_ERROR;
+ }
+
+ do{
+ sqlite3_snprintf(nBuf-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir);
+ j = (int)strlen(zBuf);
+ sqlite3_randomness(15, &zBuf[j]);
+ for(i=0; i<15; i++, j++){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
+ }
+ zBuf[j] = 0;
+ }while( access(zBuf,0)==0 );
+ return SQLITE_OK;
+}
+
+#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
+/*
+** Routine to transform a unixFile into a proxy-locking unixFile.
+** Implementation in the proxy-lock division, but used by unixOpen()
+** if SQLITE_PREFER_PROXY_LOCKING is defined.
+*/
+static int proxyTransformUnixFile(unixFile*, const char*);
+#endif
+
+/*
+** Search for an unused file descriptor that was opened on the database
+** file (not a journal or master-journal file) identified by pathname
+** zPath with SQLITE_OPEN_XXX flags matching those passed as the second
+** argument to this function.
+**
+** Such a file descriptor may exist if a database connection was closed
+** but the associated file descriptor could not be closed because some
+** other file descriptor open on the same file is holding a file-lock.
+** Refer to comments in the unixClose() function and the lengthy comment
+** describing "Posix Advisory Locking" at the start of this file for
+** further details. Also, ticket #4018.
+**
+** If a suitable file descriptor is found, then it is returned. If no
+** such file descriptor is located, -1 is returned.
+*/
+static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
+ UnixUnusedFd *pUnused = 0;
+
+ /* Do not search for an unused file descriptor on vxworks. Not because
+ ** vxworks would not benefit from the change (it might, we're not sure),
+ ** but because no way to test it is currently available. It is better
+ ** not to risk breaking vxworks support for the sake of such an obscure
+ ** feature. */
+#if !OS_VXWORKS
+ struct stat sStat; /* Results of stat() call */
+
+ /* A stat() call may fail for various reasons. If this happens, it is
+ ** almost certain that an open() call on the same path will also fail.
+ ** For this reason, if an error occurs in the stat() call here, it is
+ ** ignored and -1 is returned. The caller will try to open a new file
+ ** descriptor on the same path, fail, and return an error to SQLite.
+ **
+ ** Even if a subsequent open() call does succeed, the consequences of
+ ** not searching for a resusable file descriptor are not dire. */
+ if( 0==stat(zPath, &sStat) ){
+ struct unixOpenCnt *pO;
+ struct unixFileId id;
+ id.dev = sStat.st_dev;
+ id.ino = sStat.st_ino;
+
+ unixEnterMutex();
+ for(pO=openList; pO && memcmp(&id, &pO->fileId, sizeof(id)); pO=pO->pNext);
+ if( pO ){
+ UnixUnusedFd **pp;
+ for(pp=&pO->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext));
+ pUnused = *pp;
+ if( pUnused ){
+ *pp = pUnused->pNext;
+ }
+ }
+ unixLeaveMutex();
+ }
+#endif /* if !OS_VXWORKS */
+ return pUnused;
+}
+
+/*
** Open the file zPath.
**
** Previously, the SQLite OS layer used three functions in place of this
@@ -21247,16 +25424,19 @@ static int openDirectory(const char *zFilename, int *pFd){
** OpenExclusive().
*/
static int unixOpen(
- sqlite3_vfs *pVfs,
- const char *zPath,
- sqlite3_file *pFile,
- int flags,
- int *pOutFlags
+ sqlite3_vfs *pVfs, /* The VFS for which this is the xOpen method */
+ const char *zPath, /* Pathname of file to be opened */
+ sqlite3_file *pFile, /* The file descriptor to be filled in */
+ int flags, /* Input flags to control the opening */
+ int *pOutFlags /* Output flags returned to SQLite core */
){
- int fd = 0; /* File descriptor returned by open() */
+ unixFile *p = (unixFile *)pFile;
+ int fd = -1; /* File descriptor returned by open() */
int dirfd = -1; /* Directory file descriptor */
- int oflags = 0; /* Flags to pass to open() */
+ int openFlags = 0; /* Flags to pass to open() */
int eType = flags&0xFFFFFF00; /* Type of file to open */
+ int noLock; /* True to omit locking primitives */
+ int rc = SQLITE_OK; /* Function Return Code */
int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE);
@@ -21272,6 +25452,12 @@ static int unixOpen(
(eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL)
);
+ /* If argument zPath is a NULL pointer, this function is required to open
+ ** a temporary file. Use this buffer to store the file name in.
+ */
+ char zTmpname[MAX_PATHNAME+1];
+ const char *zName = zPath;
+
/* Check the following statements are true:
**
** (a) Exactly one of the READWRITE and READONLY flags must be set, and
@@ -21284,13 +25470,11 @@ static int unixOpen(
assert(isExclusive==0 || isCreate);
assert(isDelete==0 || isCreate);
-
/* The main DB, main journal, and master journal are never automatically
- ** deleted
- */
- assert( eType!=SQLITE_OPEN_MAIN_DB || !isDelete );
- assert( eType!=SQLITE_OPEN_MAIN_JOURNAL || !isDelete );
- assert( eType!=SQLITE_OPEN_MASTER_JOURNAL || !isDelete );
+ ** deleted. Nor are they ever temporary files. */
+ assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB );
+ assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL );
+ assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL );
/* Assert that the upper layer has set one of the "file-type" flags. */
assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
@@ -21299,59 +25483,179 @@ static int unixOpen(
|| eType==SQLITE_OPEN_TRANSIENT_DB
);
- if( isReadonly ) oflags |= O_RDONLY;
- if( isReadWrite ) oflags |= O_RDWR;
- if( isCreate ) oflags |= O_CREAT;
- if( isExclusive ) oflags |= (O_EXCL|O_NOFOLLOW);
- oflags |= (O_LARGEFILE|O_BINARY);
+ memset(p, 0, sizeof(unixFile));
- memset(pFile, 0, sizeof(unixFile));
- fd = open(zPath, oflags, isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS);
- if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){
- /* Failed to open the file for read/write access. Try read-only. */
- flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
- flags |= SQLITE_OPEN_READONLY;
- return unixOpen(pVfs, zPath, pFile, flags, pOutFlags);
+ if( eType==SQLITE_OPEN_MAIN_DB ){
+ UnixUnusedFd *pUnused;
+ pUnused = findReusableFd(zName, flags);
+ if( pUnused ){
+ fd = pUnused->fd;
+ }else{
+ pUnused = sqlite3_malloc(sizeof(*pUnused));
+ if( !pUnused ){
+ return SQLITE_NOMEM;
+ }
+ }
+ p->pUnused = pUnused;
+ }else if( !zName ){
+ /* If zName is NULL, the upper layer is requesting a temp file. */
+ assert(isDelete && !isOpenDirectory);
+ rc = getTempname(MAX_PATHNAME+1, zTmpname);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ zName = zTmpname;
}
+
+ /* Determine the value of the flags parameter passed to POSIX function
+ ** open(). These must be calculated even if open() is not called, as
+ ** they may be stored as part of the file handle and used by the
+ ** 'conch file' locking functions later on. */
+ if( isReadonly ) openFlags |= O_RDONLY;
+ if( isReadWrite ) openFlags |= O_RDWR;
+ if( isCreate ) openFlags |= O_CREAT;
+ if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW);
+ openFlags |= (O_LARGEFILE|O_BINARY);
+
if( fd<0 ){
- return SQLITE_CANTOPEN;
- }
- if( isDelete ){
- unlink(zPath);
+ mode_t openMode = (isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS);
+ fd = open(zName, openFlags, openMode);
+ OSTRACE4("OPENX %-3d %s 0%o\n", fd, zName, openFlags);
+ if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){
+ /* Failed to open the file for read/write access. Try read-only. */
+ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
+ openFlags &= ~(O_RDWR|O_CREAT);
+ flags |= SQLITE_OPEN_READONLY;
+ openFlags |= O_RDONLY;
+ fd = open(zName, openFlags, openMode);
+ }
+ if( fd<0 ){
+ rc = SQLITE_CANTOPEN;
+ goto open_finished;
+ }
}
+ assert( fd>=0 );
if( pOutFlags ){
*pOutFlags = flags;
}
- assert(fd!=0);
+ if( p->pUnused ){
+ p->pUnused->fd = fd;
+ p->pUnused->flags = flags;
+ }
+
+ if( isDelete ){
+#if OS_VXWORKS
+ zPath = zName;
+#else
+ unlink(zName);
+#endif
+ }
+#if SQLITE_ENABLE_LOCKING_STYLE
+ else{
+ p->openFlags = openFlags;
+ }
+#endif
+
if( isOpenDirectory ){
- int rc = openDirectory(zPath, &dirfd);
+ rc = openDirectory(zPath, &dirfd);
if( rc!=SQLITE_OK ){
- close(fd);
- return rc;
+ /* It is safe to close fd at this point, because it is guaranteed not
+ ** to be open on a database file. If it were open on a database file,
+ ** it would not be safe to close as this would release any locks held
+ ** on the file by this process. */
+ assert( eType!=SQLITE_OPEN_MAIN_DB );
+ close(fd); /* silently leak if fail, already in error */
+ goto open_finished;
+ }
+ }
+
+#ifdef FD_CLOEXEC
+ fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
+#endif
+
+ noLock = eType!=SQLITE_OPEN_MAIN_DB;
+
+#if SQLITE_PREFER_PROXY_LOCKING
+ if( zPath!=NULL && !noLock && pVfs->xOpen ){
+ char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING");
+ int useProxy = 0;
+
+ /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means
+ ** never use proxy, NULL means use proxy for non-local files only. */
+ if( envforce!=NULL ){
+ useProxy = atoi(envforce)>0;
+ }else{
+ struct statfs fsInfo;
+ if( statfs(zPath, &fsInfo) == -1 ){
+ /* In theory, the close(fd) call is sub-optimal. If the file opened
+ ** with fd is a database file, and there are other connections open
+ ** on that file that are currently holding advisory locks on it,
+ ** then the call to close() will cancel those locks. In practice,
+ ** we're assuming that statfs() doesn't fail very often. At least
+ ** not while other file descriptors opened by the same process on
+ ** the same file are working. */
+ p->lastErrno = errno;
+ if( dirfd>=0 ){
+ close(dirfd); /* silently leak if fail, in error */
+ }
+ close(fd); /* silently leak if fail, in error */
+ rc = SQLITE_IOERR_ACCESS;
+ goto open_finished;
+ }
+ useProxy = !(fsInfo.f_flags&MNT_LOCAL);
+ }
+ if( useProxy ){
+ rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, isDelete);
+ if( rc==SQLITE_OK ){
+ rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:");
+ }
+ goto open_finished;
}
}
- return fillInUnixFile(fd, dirfd, pFile, zPath);
+#endif
+
+ rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, isDelete);
+open_finished:
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(p->pUnused);
+ }
+ return rc;
}
+
/*
** Delete the file at zPath. If the dirSync argument is true, fsync()
** the directory after deleting the file.
*/
-static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
+static int unixDelete(
+ sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */
+ const char *zPath, /* Name of file to be deleted */
+ int dirSync /* If true, fsync() directory after deleting file */
+){
int rc = SQLITE_OK;
+ UNUSED_PARAMETER(NotUsed);
SimulateIOError(return SQLITE_IOERR_DELETE);
unlink(zPath);
+#ifndef SQLITE_DISABLE_DIRSYNC
if( dirSync ){
int fd;
rc = openDirectory(zPath, &fd);
if( rc==SQLITE_OK ){
- if( fsync(fd) ){
+#if OS_VXWORKS
+ if( fsync(fd)==-1 )
+#else
+ if( fsync(fd) )
+#endif
+ {
rc = SQLITE_IOERR_DIR_FSYNC;
}
- close(fd);
+ if( close(fd)&&!rc ){
+ rc = SQLITE_IOERR_DIR_CLOSE;
+ }
}
}
+#endif
return rc;
}
@@ -21365,8 +25669,15 @@ static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
**
** Otherwise return 0.
*/
-static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){
+static int unixAccess(
+ sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */
+ const char *zPath, /* Path of the file to examine */
+ int flags, /* What do we want to learn about the zPath file? */
+ int *pResOut /* Write result boolean here */
+){
int amode = 0;
+ UNUSED_PARAMETER(NotUsed);
+ SimulateIOError( return SQLITE_IOERR_ACCESS; );
switch( flags ){
case SQLITE_ACCESS_EXISTS:
amode = F_OK;
@@ -21381,63 +25692,7 @@ static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){
default:
assert(!"Invalid flags argument");
}
- return (access(zPath, amode)==0);
-}
-
-/*
-** Create a temporary file name in zBuf. zBuf must be allocated
-** by the calling process and must be big enough to hold at least
-** pVfs->mxPathname bytes.
-*/
-static int unixGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
- static const char *azDirs[] = {
- 0,
- "/var/tmp",
- "/usr/tmp",
- "/tmp",
- ".",
- };
- static const unsigned char zChars[] =
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "0123456789";
- int i, j;
- struct stat buf;
- const char *zDir = ".";
-
- /* It's odd to simulate an io-error here, but really this is just
- ** using the io-error infrastructure to test that SQLite handles this
- ** function failing.
- */
- SimulateIOError( return SQLITE_ERROR );
-
- azDirs[0] = sqlite3_temp_directory;
- for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
- if( azDirs[i]==0 ) continue;
- if( stat(azDirs[i], &buf) ) continue;
- if( !S_ISDIR(buf.st_mode) ) continue;
- if( access(azDirs[i], 07) ) continue;
- zDir = azDirs[i];
- break;
- }
-
- /* Check that the output buffer is large enough for the temporary file
- ** name. If it is not, return SQLITE_ERROR.
- */
- if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 17) >= nBuf ){
- return SQLITE_ERROR;
- }
-
- do{
- assert( pVfs->mxPathname==MAX_PATHNAME );
- sqlite3_snprintf(nBuf-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir);
- j = strlen(zBuf);
- sqlite3_randomness(15, &zBuf[j]);
- for(i=0; i<15; i++, j++){
- zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
- }
- zBuf[j] = 0;
- }while( access(zBuf,0)==0 );
+ *pResOut = (access(zPath, amode)==0);
return SQLITE_OK;
}
@@ -21461,11 +25716,13 @@ static int unixFullPathname(
/* It's odd to simulate an io-error here, but really this is just
** using the io-error infrastructure to test that SQLite handles this
** function failing. This function could fail if, for example, the
- ** current working directly has been unlinked.
+ ** current working directory has been unlinked.
*/
SimulateIOError( return SQLITE_ERROR );
assert( pVfs->mxPathname==MAX_PATHNAME );
+ UNUSED_PARAMETER(pVfs);
+
zOut[nOut-1] = '\0';
if( zPath[0]=='/' ){
sqlite3_snprintf(nOut, zOut, "%s", zPath);
@@ -21474,36 +25731,10 @@ static int unixFullPathname(
if( getcwd(zOut, nOut-1)==0 ){
return SQLITE_CANTOPEN;
}
- nCwd = strlen(zOut);
+ nCwd = (int)strlen(zOut);
sqlite3_snprintf(nOut-nCwd, &zOut[nCwd], "/%s", zPath);
}
return SQLITE_OK;
-
-#if 0
- /*
- ** Remove "/./" path elements and convert "/A/./" path elements
- ** to just "/".
- */
- if( zFull ){
- int i, j;
- for(i=j=0; zFull[i]; i++){
- if( zFull[i]=='/' ){
- if( zFull[i+1]=='/' ) continue;
- if( zFull[i+1]=='.' && zFull[i+2]=='/' ){
- i += 1;
- continue;
- }
- if( zFull[i+1]=='.' && zFull[i+2]=='.' && zFull[i+3]=='/' ){
- while( j>0 && zFull[j-1]!='/' ){ j--; }
- i += 3;
- continue;
- }
- }
- zFull[j++] = zFull[i];
- }
- zFull[j] = 0;
- }
-#endif
}
@@ -21513,7 +25744,8 @@ static int unixFullPathname(
** within the shared library, and closing the shared library.
*/
#include <dlfcn.h>
-static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
+static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){
+ UNUSED_PARAMETER(NotUsed);
return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL);
}
@@ -21524,19 +25756,41 @@ static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
** is available, zBufOut is left unmodified and SQLite uses a default
** error message.
*/
-static void unixDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
+static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){
char *zErr;
- enterMutex();
+ UNUSED_PARAMETER(NotUsed);
+ unixEnterMutex();
zErr = dlerror();
if( zErr ){
sqlite3_snprintf(nBuf, zBufOut, "%s", zErr);
}
- leaveMutex();
+ unixLeaveMutex();
}
-static void *unixDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
- return dlsym(pHandle, zSymbol);
-}
-static void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){
+static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){
+ /*
+ ** GCC with -pedantic-errors says that C90 does not allow a void* to be
+ ** cast into a pointer to a function. And yet the library dlsym() routine
+ ** returns a void* which is really a pointer to a function. So how do we
+ ** use dlsym() with -pedantic-errors?
+ **
+ ** Variable x below is defined to be a pointer to a function taking
+ ** parameters void* and const char* and returning a pointer to a function.
+ ** We initialize x by assigning it a pointer to the dlsym() function.
+ ** (That assignment requires a cast.) Then we call the function that
+ ** x points to.
+ **
+ ** This work-around is unlikely to work correctly on any system where
+ ** you really cannot cast a function pointer into void*. But then, on the
+ ** other hand, dlsym() will not work on such a system either, so we have
+ ** not really lost anything.
+ */
+ void (*(*x)(void*,const char*))(void);
+ UNUSED_PARAMETER(NotUsed);
+ x = (void(*(*)(void*,const char*))(void))dlsym;
+ return (*x)(p, zSym);
+}
+static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){
+ UNUSED_PARAMETER(NotUsed);
dlclose(pHandle);
}
#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
@@ -21549,9 +25803,9 @@ static void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){
/*
** Write nBuf bytes of random data to the supplied buffer zBuf.
*/
-static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
-
- assert(nBuf>=(sizeof(time_t)+sizeof(int)));
+static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){
+ UNUSED_PARAMETER(NotUsed);
+ assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int)));
/* We have to initialize zBuf to prevent valgrind from reporting
** errors. The reports issued by valgrind are incorrect - we would
@@ -21575,18 +25829,20 @@ static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
time(&t);
memcpy(zBuf, &t, sizeof(t));
#ifndef VXWORKS
- pid = getpid();
+ pid = getpid();
#else
pid = (int)taskIdCurrent();
#endif
memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid));
+ assert( sizeof(t)+sizeof(pid)<=(size_t)nBuf );
+ nBuf = sizeof(t) + sizeof(pid);
}else{
- read(fd, zBuf, nBuf);
+ nBuf = read(fd, zBuf, nBuf);
close(fd);
}
}
#endif
- return SQLITE_OK;
+ return nBuf;
}
@@ -21598,23 +25854,34 @@ static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
** might be greater than or equal to the argument, but not less
** than the argument.
*/
-static int unixSleep(sqlite3_vfs *pVfs, int microseconds){
-#if defined(HAVE_USLEEP) && HAVE_USLEEP
+static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){
+#if OS_VXWORKS
+ struct timespec sp;
+
+ sp.tv_sec = microseconds / 1000000;
+ sp.tv_nsec = (microseconds % 1000000) * 1000;
+ nanosleep(&sp, NULL);
+ UNUSED_PARAMETER(NotUsed);
+ return microseconds;
+#elif defined(HAVE_USLEEP) && HAVE_USLEEP
usleep(microseconds);
+ UNUSED_PARAMETER(NotUsed);
return microseconds;
#else
int seconds = (microseconds+999999)/1000000;
sleep(seconds);
+ UNUSED_PARAMETER(NotUsed);
return seconds*1000000;
#endif
}
/*
-** The following variable, if set to a non-zero value, becomes the result
-** returned from sqlite3OsCurrentTime(). This is used for testing.
+** The following variable, if set to a non-zero value, is interpreted as
+** the number of seconds since 1970 and is used to set the result of
+** sqlite3OsCurrentTime() during testing.
*/
#ifdef SQLITE_TEST
-SQLITE_API int sqlite3_current_time = 0;
+SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
#endif
/*
@@ -21622,57 +25889,1098 @@ SQLITE_API int sqlite3_current_time = 0;
** current time and date as a Julian Day number into *prNow and
** return 0. Return 1 if the time and date cannot be found.
*/
-static int unixCurrentTime(sqlite3_vfs *pVfs, double *prNow){
-#ifdef NO_GETTOD
+static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
+#if defined(SQLITE_OMIT_FLOATING_POINT)
+ time_t t;
+ time(&t);
+ *prNow = (((sqlite3_int64)t)/8640 + 24405875)/10;
+#elif defined(NO_GETTOD)
time_t t;
time(&t);
*prNow = t/86400.0 + 2440587.5;
+#elif OS_VXWORKS
+ struct timespec sNow;
+ clock_gettime(CLOCK_REALTIME, &sNow);
+ *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_nsec/86400000000000.0;
#else
struct timeval sNow;
gettimeofday(&sNow, 0);
*prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0;
#endif
+
#ifdef SQLITE_TEST
if( sqlite3_current_time ){
*prNow = sqlite3_current_time/86400.0 + 2440587.5;
}
#endif
+ UNUSED_PARAMETER(NotUsed);
+ return 0;
+}
+
+/*
+** We added the xGetLastError() method with the intention of providing
+** better low-level error messages when operating-system problems come up
+** during SQLite operation. But so far, none of that has been implemented
+** in the core. So this routine is never called. For now, it is merely
+** a place-holder.
+*/
+static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){
+ UNUSED_PARAMETER(NotUsed);
+ UNUSED_PARAMETER(NotUsed2);
+ UNUSED_PARAMETER(NotUsed3);
return 0;
}
/*
-** Return a pointer to the sqlite3DefaultVfs structure. We use
-** a function rather than give the structure global scope because
-** some compilers (MSVC) do not allow forward declarations of
-** initialized structures.
+************************ End of sqlite3_vfs methods ***************************
+******************************************************************************/
+
+/******************************************************************************
+************************** Begin Proxy Locking ********************************
+**
+** Proxy locking is a "uber-locking-method" in this sense: It uses the
+** other locking methods on secondary lock files. Proxy locking is a
+** meta-layer over top of the primitive locking implemented above. For
+** this reason, the division that implements of proxy locking is deferred
+** until late in the file (here) after all of the other I/O methods have
+** been defined - so that the primitive locking methods are available
+** as services to help with the implementation of proxy locking.
+**
+****
+**
+** The default locking schemes in SQLite use byte-range locks on the
+** database file to coordinate safe, concurrent access by multiple readers
+** and writers [http://sqlite.org/lockingv3.html]. The five file locking
+** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented
+** as POSIX read & write locks over fixed set of locations (via fsctl),
+** on AFP and SMB only exclusive byte-range locks are available via fsctl
+** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states.
+** To simulate a F_RDLCK on the shared range, on AFP a randomly selected
+** address in the shared range is taken for a SHARED lock, the entire
+** shared range is taken for an EXCLUSIVE lock):
+**
+** PENDING_BYTE 0x40000000
+** RESERVED_BYTE 0x40000001
+** SHARED_RANGE 0x40000002 -> 0x40000200
+**
+** This works well on the local file system, but shows a nearly 100x
+** slowdown in read performance on AFP because the AFP client disables
+** the read cache when byte-range locks are present. Enabling the read
+** cache exposes a cache coherency problem that is present on all OS X
+** supported network file systems. NFS and AFP both observe the
+** close-to-open semantics for ensuring cache coherency
+** [http://nfs.sourceforge.net/#faq_a8], which does not effectively
+** address the requirements for concurrent database access by multiple
+** readers and writers
+** [http://www.nabble.com/SQLite-on-NFS-cache-coherency-td15655701.html].
+**
+** To address the performance and cache coherency issues, proxy file locking
+** changes the way database access is controlled by limiting access to a
+** single host at a time and moving file locks off of the database file
+** and onto a proxy file on the local file system.
+**
+**
+** Using proxy locks
+** -----------------
+**
+** C APIs
+**
+** sqlite3_file_control(db, dbname, SQLITE_SET_LOCKPROXYFILE,
+** <proxy_path> | ":auto:");
+** sqlite3_file_control(db, dbname, SQLITE_GET_LOCKPROXYFILE, &<proxy_path>);
+**
+**
+** SQL pragmas
+**
+** PRAGMA [database.]lock_proxy_file=<proxy_path> | :auto:
+** PRAGMA [database.]lock_proxy_file
+**
+** Specifying ":auto:" means that if there is a conch file with a matching
+** host ID in it, the proxy path in the conch file will be used, otherwise
+** a proxy path based on the user's temp dir
+** (via confstr(_CS_DARWIN_USER_TEMP_DIR,...)) will be used and the
+** actual proxy file name is generated from the name and path of the
+** database file. For example:
+**
+** For database path "/Users/me/foo.db"
+** The lock path will be "<tmpdir>/sqliteplocks/_Users_me_foo.db:auto:")
+**
+** Once a lock proxy is configured for a database connection, it can not
+** be removed, however it may be switched to a different proxy path via
+** the above APIs (assuming the conch file is not being held by another
+** connection or process).
+**
+**
+** How proxy locking works
+** -----------------------
+**
+** Proxy file locking relies primarily on two new supporting files:
+**
+** * conch file to limit access to the database file to a single host
+** at a time
+**
+** * proxy file to act as a proxy for the advisory locks normally
+** taken on the database
+**
+** The conch file - to use a proxy file, sqlite must first "hold the conch"
+** by taking an sqlite-style shared lock on the conch file, reading the
+** contents and comparing the host's unique host ID (see below) and lock
+** proxy path against the values stored in the conch. The conch file is
+** stored in the same directory as the database file and the file name
+** is patterned after the database file name as ".<databasename>-conch".
+** If the conch file does not exist, or it's contents do not match the
+** host ID and/or proxy path, then the lock is escalated to an exclusive
+** lock and the conch file contents is updated with the host ID and proxy
+** path and the lock is downgraded to a shared lock again. If the conch
+** is held by another process (with a shared lock), the exclusive lock
+** will fail and SQLITE_BUSY is returned.
+**
+** The proxy file - a single-byte file used for all advisory file locks
+** normally taken on the database file. This allows for safe sharing
+** of the database file for multiple readers and writers on the same
+** host (the conch ensures that they all use the same local lock file).
+**
+** There is a third file - the host ID file - used as a persistent record
+** of a unique identifier for the host, a 128-byte unique host id file
+** in the path defined by the HOSTIDPATH macro (default value is
+** /Library/Caches/.com.apple.sqliteConchHostId).
+**
+** Requesting the lock proxy does not immediately take the conch, it is
+** only taken when the first request to lock database file is made.
+** This matches the semantics of the traditional locking behavior, where
+** opening a connection to a database file does not take a lock on it.
+** The shared lock and an open file descriptor are maintained until
+** the connection to the database is closed.
+**
+** The proxy file and the lock file are never deleted so they only need
+** to be created the first time they are used.
+**
+** Configuration options
+** ---------------------
+**
+** SQLITE_PREFER_PROXY_LOCKING
+**
+** Database files accessed on non-local file systems are
+** automatically configured for proxy locking, lock files are
+** named automatically using the same logic as
+** PRAGMA lock_proxy_file=":auto:"
+**
+** SQLITE_PROXY_DEBUG
+**
+** Enables the logging of error messages during host id file
+** retrieval and creation
+**
+** HOSTIDPATH
+**
+** Overrides the default host ID file path location
+**
+** LOCKPROXYDIR
+**
+** Overrides the default directory used for lock proxy files that
+** are named automatically via the ":auto:" setting
+**
+** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
+**
+** Permissions to use when creating a directory for storing the
+** lock proxy files, only used when LOCKPROXYDIR is not set.
+**
+**
+** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING,
+** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will
+** force proxy locking to be used for every database file opened, and 0
+** will force automatic proxy locking to be disabled for all database
+** files (explicity calling the SQLITE_SET_LOCKPROXYFILE pragma or
+** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING).
+*/
+
+/*
+** Proxy locking is only available on MacOSX
*/
-SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
- static sqlite3_vfs unixVfs = {
- 1, /* iVersion */
- sizeof(unixFile), /* szOsFile */
- MAX_PATHNAME, /* mxPathname */
- 0, /* pNext */
- "unix", /* zName */
- 0, /* pAppData */
+#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
+
+#ifdef SQLITE_TEST
+/* simulate multiple hosts by creating unique hostid file paths */
+SQLITE_API int sqlite3_hostid_num = 0;
+#endif
+
+/*
+** The proxyLockingContext has the path and file structures for the remote
+** and local proxy files in it
+*/
+typedef struct proxyLockingContext proxyLockingContext;
+struct proxyLockingContext {
+ unixFile *conchFile; /* Open conch file */
+ char *conchFilePath; /* Name of the conch file */
+ unixFile *lockProxy; /* Open proxy lock file */
+ char *lockProxyPath; /* Name of the proxy lock file */
+ char *dbPath; /* Name of the open file */
+ int conchHeld; /* True if the conch is currently held */
+ void *oldLockingContext; /* Original lockingcontext to restore on close */
+ sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */
+};
+
+/* HOSTIDLEN and CONCHLEN both include space for the string
+** terminating nul
+*/
+#define HOSTIDLEN 128
+#define CONCHLEN (MAXPATHLEN+HOSTIDLEN+1)
+#ifndef HOSTIDPATH
+# define HOSTIDPATH "/Library/Caches/.com.apple.sqliteConchHostId"
+#endif
+
+/* basically a copy of unixRandomness with different
+** test behavior built in */
+static int proxyGenerateHostID(char *pHostID){
+ int pid, fd, len;
+ unsigned char *key = (unsigned char *)pHostID;
- unixOpen, /* xOpen */
- unixDelete, /* xDelete */
- unixAccess, /* xAccess */
- unixGetTempname, /* xGetTempName */
- unixFullPathname, /* xFullPathname */
- unixDlOpen, /* xDlOpen */
- unixDlError, /* xDlError */
- unixDlSym, /* xDlSym */
- unixDlClose, /* xDlClose */
- unixRandomness, /* xRandomness */
- unixSleep, /* xSleep */
- unixCurrentTime /* xCurrentTime */
- };
+ memset(key, 0, HOSTIDLEN);
+ len = 0;
+ fd = open("/dev/urandom", O_RDONLY);
+ if( fd>=0 ){
+ len = read(fd, key, HOSTIDLEN);
+ close(fd); /* silently leak the fd if it fails */
+ }
+ if( len < HOSTIDLEN ){
+ time_t t;
+ time(&t);
+ memcpy(key, &t, sizeof(t));
+ pid = getpid();
+ memcpy(&key[sizeof(t)], &pid, sizeof(pid));
+ }
- return &unixVfs;
+#ifdef MAKE_PRETTY_HOSTID
+ {
+ int i;
+ /* filter the bytes into printable ascii characters and NUL terminate */
+ key[(HOSTIDLEN-1)] = 0x00;
+ for( i=0; i<(HOSTIDLEN-1); i++ ){
+ unsigned char pa = key[i]&0x7F;
+ if( pa<0x20 ){
+ key[i] = (key[i]&0x80 == 0x80) ? pa+0x40 : pa+0x20;
+ }else if( pa==0x7F ){
+ key[i] = (key[i]&0x80 == 0x80) ? pa=0x20 : pa+0x7E;
+ }
+ }
+ }
+#endif
+ return SQLITE_OK;
+}
+
+/* writes the host id path to path, path should be an pre-allocated buffer
+** with enough space for a path
+*/
+static void proxyGetHostIDPath(char *path, size_t len){
+ strlcpy(path, HOSTIDPATH, len);
+#ifdef SQLITE_TEST
+ if( sqlite3_hostid_num>0 ){
+ char suffix[2] = "1";
+ suffix[0] = suffix[0] + sqlite3_hostid_num;
+ strlcat(path, suffix, len);
+ }
+#endif
+ OSTRACE3("GETHOSTIDPATH %s pid=%d\n", path, getpid());
+}
+
+/* get the host ID from a sqlite hostid file stored in the
+** user-specific tmp directory, create the ID if it's not there already
+*/
+static int proxyGetHostID(char *pHostID, int *pError){
+ int fd;
+ char path[MAXPATHLEN];
+ size_t len;
+ int rc=SQLITE_OK;
+
+ proxyGetHostIDPath(path, MAXPATHLEN);
+ /* try to create the host ID file, if it already exists read the contents */
+ fd = open(path, O_CREAT|O_WRONLY|O_EXCL, 0644);
+ if( fd<0 ){
+ int err=errno;
+
+ if( err!=EEXIST ){
+#ifdef SQLITE_PROXY_DEBUG /* set the sqlite error message instead */
+ fprintf(stderr, "sqlite error creating host ID file %s: %s\n",
+ path, strerror(err));
+#endif
+ return SQLITE_PERM;
+ }
+ /* couldn't create the file, read it instead */
+ fd = open(path, O_RDONLY|O_EXCL);
+ if( fd<0 ){
+#ifdef SQLITE_PROXY_DEBUG /* set the sqlite error message instead */
+ int err = errno;
+ fprintf(stderr, "sqlite error opening host ID file %s: %s\n",
+ path, strerror(err));
+#endif
+ return SQLITE_PERM;
+ }
+ len = pread(fd, pHostID, HOSTIDLEN, 0);
+ if( len<0 ){
+ *pError = errno;
+ rc = SQLITE_IOERR_READ;
+ }else if( len<HOSTIDLEN ){
+ *pError = 0;
+ rc = SQLITE_IOERR_SHORT_READ;
+ }
+ close(fd); /* silently leak the fd if it fails */
+ OSTRACE3("GETHOSTID read %s pid=%d\n", pHostID, getpid());
+ return rc;
+ }else{
+ /* we're creating the host ID file (use a random string of bytes) */
+ proxyGenerateHostID(pHostID);
+ len = pwrite(fd, pHostID, HOSTIDLEN, 0);
+ if( len<0 ){
+ *pError = errno;
+ rc = SQLITE_IOERR_WRITE;
+ }else if( len<HOSTIDLEN ){
+ *pError = 0;
+ rc = SQLITE_IOERR_WRITE;
+ }
+ close(fd); /* silently leak the fd if it fails */
+ OSTRACE3("GETHOSTID wrote %s pid=%d\n", pHostID, getpid());
+ return rc;
+ }
+}
+
+static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){
+ int len;
+ int dbLen;
+ int i;
+
+#ifdef LOCKPROXYDIR
+ len = strlcpy(lPath, LOCKPROXYDIR, maxLen);
+#else
+# ifdef _CS_DARWIN_USER_TEMP_DIR
+ {
+ confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen);
+ len = strlcat(lPath, "sqliteplocks", maxLen);
+ if( mkdir(lPath, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){
+ /* if mkdir fails, handle as lock file creation failure */
+# ifdef SQLITE_DEBUG
+ int err = errno;
+ if( err!=EEXIST ){
+ fprintf(stderr, "proxyGetLockPath: mkdir(%s,0%o) error %d %s\n", lPath,
+ SQLITE_DEFAULT_PROXYDIR_PERMISSIONS, err, strerror(err));
+ }
+# endif
+ }else{
+ OSTRACE3("GETLOCKPATH mkdir %s pid=%d\n", lPath, getpid());
+ }
+
+ }
+# else
+ len = strlcpy(lPath, "/tmp/", maxLen);
+# endif
+#endif
+
+ if( lPath[len-1]!='/' ){
+ len = strlcat(lPath, "/", maxLen);
+ }
+
+ /* transform the db path to a unique cache name */
+ dbLen = (int)strlen(dbPath);
+ for( i=0; i<dbLen && (i+len+7)<maxLen; i++){
+ char c = dbPath[i];
+ lPath[i+len] = (c=='/')?'_':c;
+ }
+ lPath[i+len]='\0';
+ strlcat(lPath, ":auto:", maxLen);
+ return SQLITE_OK;
+}
+
+/*
+** Create a new VFS file descriptor (stored in memory obtained from
+** sqlite3_malloc) and open the file named "path" in the file descriptor.
+**
+** The caller is responsible not only for closing the file descriptor
+** but also for freeing the memory associated with the file descriptor.
+*/
+static int proxyCreateUnixFile(const char *path, unixFile **ppFile) {
+ unixFile *pNew;
+ int flags = SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
+ int rc = SQLITE_OK;
+ sqlite3_vfs dummyVfs;
+
+ pNew = (unixFile *)sqlite3_malloc(sizeof(unixFile));
+ if( !pNew ){
+ return SQLITE_NOMEM;
+ }
+ memset(pNew, 0, sizeof(unixFile));
+
+ /* Call unixOpen() to open the proxy file. The flags passed to unixOpen()
+ ** suggest that the file being opened is a "main database". This is
+ ** necessary as other file types do not necessarily support locking. It
+ ** is better to use unixOpen() instead of opening the file directly with
+ ** open(), as unixOpen() sets up the various mechanisms required to
+ ** make sure a call to close() does not cause the system to discard
+ ** POSIX locks prematurely.
+ **
+ ** It is important that the xOpen member of the VFS object passed to
+ ** unixOpen() is NULL. This tells unixOpen() may try to open a proxy-file
+ ** for the proxy-file (creating a potential infinite loop).
+ */
+ dummyVfs.pAppData = (void*)&autolockIoFinder;
+ dummyVfs.xOpen = 0;
+ rc = unixOpen(&dummyVfs, path, (sqlite3_file *)pNew, flags, &flags);
+ if( rc==SQLITE_OK && (flags&SQLITE_OPEN_READONLY) ){
+ pNew->pMethod->xClose((sqlite3_file *)pNew);
+ rc = SQLITE_CANTOPEN;
+ }
+
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(pNew);
+ pNew = 0;
+ }
+
+ *ppFile = pNew;
+ return rc;
+}
+
+/* takes the conch by taking a shared lock and read the contents conch, if
+** lockPath is non-NULL, the host ID and lock file path must match. A NULL
+** lockPath means that the lockPath in the conch file will be used if the
+** host IDs match, or a new lock path will be generated automatically
+** and written to the conch file.
+*/
+static int proxyTakeConch(unixFile *pFile){
+ proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
+
+ if( pCtx->conchHeld>0 ){
+ return SQLITE_OK;
+ }else{
+ unixFile *conchFile = pCtx->conchFile;
+ char testValue[CONCHLEN];
+ char conchValue[CONCHLEN];
+ char lockPath[MAXPATHLEN];
+ char *tLockPath = NULL;
+ int rc = SQLITE_OK;
+ int readRc = SQLITE_OK;
+ int syncPerms = 0;
+
+ OSTRACE4("TAKECONCH %d for %s pid=%d\n", conchFile->h,
+ (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid());
+
+ rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK);
+ if( rc==SQLITE_OK ){
+ int pError = 0;
+ memset(testValue, 0, CONCHLEN); /* conch is fixed size */
+ rc = proxyGetHostID(testValue, &pError);
+ if( (rc&0xff)==SQLITE_IOERR ){
+ pFile->lastErrno = pError;
+ }
+ if( pCtx->lockProxyPath ){
+ strlcpy(&testValue[HOSTIDLEN], pCtx->lockProxyPath, MAXPATHLEN);
+ }
+ }
+ if( rc!=SQLITE_OK ){
+ goto end_takeconch;
+ }
+
+ readRc = unixRead((sqlite3_file *)conchFile, conchValue, CONCHLEN, 0);
+ if( readRc!=SQLITE_IOERR_SHORT_READ ){
+ if( readRc!=SQLITE_OK ){
+ if( (rc&0xff)==SQLITE_IOERR ){
+ pFile->lastErrno = conchFile->lastErrno;
+ }
+ rc = readRc;
+ goto end_takeconch;
+ }
+ /* if the conch has data compare the contents */
+ if( !pCtx->lockProxyPath ){
+ /* for auto-named local lock file, just check the host ID and we'll
+ ** use the local lock file path that's already in there */
+ if( !memcmp(testValue, conchValue, HOSTIDLEN) ){
+ tLockPath = (char *)&conchValue[HOSTIDLEN];
+ goto end_takeconch;
+ }
+ }else{
+ /* we've got the conch if conchValue matches our path and host ID */
+ if( !memcmp(testValue, conchValue, CONCHLEN) ){
+ goto end_takeconch;
+ }
+ }
+ }else{
+ /* a short read means we're "creating" the conch (even though it could
+ ** have been user-intervention), if we acquire the exclusive lock,
+ ** we'll try to match the current on-disk permissions of the database
+ */
+ syncPerms = 1;
+ }
+
+ /* either conch was emtpy or didn't match */
+ if( !pCtx->lockProxyPath ){
+ proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN);
+ tLockPath = lockPath;
+ strlcpy(&testValue[HOSTIDLEN], lockPath, MAXPATHLEN);
+ }
+
+ /* update conch with host and path (this will fail if other process
+ ** has a shared lock already) */
+ rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, EXCLUSIVE_LOCK);
+ if( rc==SQLITE_OK ){
+ rc = unixWrite((sqlite3_file *)conchFile, testValue, CONCHLEN, 0);
+ if( rc==SQLITE_OK && syncPerms ){
+ struct stat buf;
+ int err = fstat(pFile->h, &buf);
+ if( err==0 ){
+ /* try to match the database file permissions, ignore failure */
+#ifndef SQLITE_PROXY_DEBUG
+ fchmod(conchFile->h, buf.st_mode);
+#else
+ if( fchmod(conchFile->h, buf.st_mode)!=0 ){
+ int code = errno;
+ fprintf(stderr, "fchmod %o FAILED with %d %s\n",
+ buf.st_mode, code, strerror(code));
+ } else {
+ fprintf(stderr, "fchmod %o SUCCEDED\n",buf.st_mode);
+ }
+ }else{
+ int code = errno;
+ fprintf(stderr, "STAT FAILED[%d] with %d %s\n",
+ err, code, strerror(code));
+#endif
+ }
+ }
+ }
+ conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK);
+
+end_takeconch:
+ OSTRACE2("TRANSPROXY: CLOSE %d\n", pFile->h);
+ if( rc==SQLITE_OK && pFile->openFlags ){
+ if( pFile->h>=0 ){
+#ifdef STRICT_CLOSE_ERROR
+ if( close(pFile->h) ){
+ pFile->lastErrno = errno;
+ return SQLITE_IOERR_CLOSE;
+ }
+#else
+ close(pFile->h); /* silently leak fd if fail */
+#endif
+ }
+ pFile->h = -1;
+ int fd = open(pCtx->dbPath, pFile->openFlags,
+ SQLITE_DEFAULT_FILE_PERMISSIONS);
+ OSTRACE2("TRANSPROXY: OPEN %d\n", fd);
+ if( fd>=0 ){
+ pFile->h = fd;
+ }else{
+ rc=SQLITE_CANTOPEN; /* SQLITE_BUSY? proxyTakeConch called
+ during locking */
+ }
+ }
+ if( rc==SQLITE_OK && !pCtx->lockProxy ){
+ char *path = tLockPath ? tLockPath : pCtx->lockProxyPath;
+ /* ACS: Need to make a copy of path sometimes */
+ rc = proxyCreateUnixFile(path, &pCtx->lockProxy);
+ }
+ if( rc==SQLITE_OK ){
+ pCtx->conchHeld = 1;
+
+ if( tLockPath ){
+ pCtx->lockProxyPath = sqlite3DbStrDup(0, tLockPath);
+ if( pCtx->lockProxy->pMethod == &afpIoMethods ){
+ ((afpLockingContext *)pCtx->lockProxy->lockingContext)->dbPath =
+ pCtx->lockProxyPath;
+ }
+ }
+ } else {
+ conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
+ }
+ OSTRACE3("TAKECONCH %d %s\n", conchFile->h, rc==SQLITE_OK?"ok":"failed");
+ return rc;
+ }
+}
+
+/*
+** If pFile holds a lock on a conch file, then release that lock.
+*/
+static int proxyReleaseConch(unixFile *pFile){
+ int rc; /* Subroutine return code */
+ proxyLockingContext *pCtx; /* The locking context for the proxy lock */
+ unixFile *conchFile; /* Name of the conch file */
+
+ pCtx = (proxyLockingContext *)pFile->lockingContext;
+ conchFile = pCtx->conchFile;
+ OSTRACE4("RELEASECONCH %d for %s pid=%d\n", conchFile->h,
+ (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"),
+ getpid());
+ pCtx->conchHeld = 0;
+ rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
+ OSTRACE3("RELEASECONCH %d %s\n", conchFile->h,
+ (rc==SQLITE_OK ? "ok" : "failed"));
+ return rc;
+}
+
+/*
+** Given the name of a database file, compute the name of its conch file.
+** Store the conch filename in memory obtained from sqlite3_malloc().
+** Make *pConchPath point to the new name. Return SQLITE_OK on success
+** or SQLITE_NOMEM if unable to obtain memory.
+**
+** The caller is responsible for ensuring that the allocated memory
+** space is eventually freed.
+**
+** *pConchPath is set to NULL if a memory allocation error occurs.
+*/
+static int proxyCreateConchPathname(char *dbPath, char **pConchPath){
+ int i; /* Loop counter */
+ int len = (int)strlen(dbPath); /* Length of database filename - dbPath */
+ char *conchPath; /* buffer in which to construct conch name */
+
+ /* Allocate space for the conch filename and initialize the name to
+ ** the name of the original database file. */
+ *pConchPath = conchPath = (char *)sqlite3_malloc(len + 8);
+ if( conchPath==0 ){
+ return SQLITE_NOMEM;
+ }
+ memcpy(conchPath, dbPath, len+1);
+
+ /* now insert a "." before the last / character */
+ for( i=(len-1); i>=0; i-- ){
+ if( conchPath[i]=='/' ){
+ i++;
+ break;
+ }
+ }
+ conchPath[i]='.';
+ while ( i<len ){
+ conchPath[i+1]=dbPath[i];
+ i++;
+ }
+
+ /* append the "-conch" suffix to the file */
+ memcpy(&conchPath[i+1], "-conch", 7);
+ assert( (int)strlen(conchPath) == len+7 );
+
+ return SQLITE_OK;
+}
+
+
+/* Takes a fully configured proxy locking-style unix file and switches
+** the local lock file path
+*/
+static int switchLockProxyPath(unixFile *pFile, const char *path) {
+ proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
+ char *oldPath = pCtx->lockProxyPath;
+ int rc = SQLITE_OK;
+
+ if( pFile->locktype!=NO_LOCK ){
+ return SQLITE_BUSY;
+ }
+
+ /* nothing to do if the path is NULL, :auto: or matches the existing path */
+ if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ||
+ (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){
+ return SQLITE_OK;
+ }else{
+ unixFile *lockProxy = pCtx->lockProxy;
+ pCtx->lockProxy=NULL;
+ pCtx->conchHeld = 0;
+ if( lockProxy!=NULL ){
+ rc=lockProxy->pMethod->xClose((sqlite3_file *)lockProxy);
+ if( rc ) return rc;
+ sqlite3_free(lockProxy);
+ }
+ sqlite3_free(oldPath);
+ pCtx->lockProxyPath = sqlite3DbStrDup(0, path);
+ }
+
+ return rc;
+}
+
+/*
+** pFile is a file that has been opened by a prior xOpen call. dbPath
+** is a string buffer at least MAXPATHLEN+1 characters in size.
+**
+** This routine find the filename associated with pFile and writes it
+** int dbPath.
+*/
+static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){
+#if defined(__APPLE__)
+ if( pFile->pMethod == &afpIoMethods ){
+ /* afp style keeps a reference to the db path in the filePath field
+ ** of the struct */
+ assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN );
+ strcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath);
+ }else
+#endif
+ if( pFile->pMethod == &dotlockIoMethods ){
+ /* dot lock style uses the locking context to store the dot lock
+ ** file path */
+ int len = strlen((char *)pFile->lockingContext) - strlen(DOTLOCK_SUFFIX);
+ memcpy(dbPath, (char *)pFile->lockingContext, len + 1);
+ }else{
+ /* all other styles use the locking context to store the db file path */
+ assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN );
+ strcpy(dbPath, (char *)pFile->lockingContext);
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Takes an already filled in unix file and alters it so all file locking
+** will be performed on the local proxy lock file. The following fields
+** are preserved in the locking context so that they can be restored and
+** the unix structure properly cleaned up at close time:
+** ->lockingContext
+** ->pMethod
+*/
+static int proxyTransformUnixFile(unixFile *pFile, const char *path) {
+ proxyLockingContext *pCtx;
+ char dbPath[MAXPATHLEN+1]; /* Name of the database file */
+ char *lockPath=NULL;
+ int rc = SQLITE_OK;
+
+ if( pFile->locktype!=NO_LOCK ){
+ return SQLITE_BUSY;
+ }
+ proxyGetDbPathForUnixFile(pFile, dbPath);
+ if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){
+ lockPath=NULL;
+ }else{
+ lockPath=(char *)path;
+ }
+
+ OSTRACE4("TRANSPROXY %d for %s pid=%d\n", pFile->h,
+ (lockPath ? lockPath : ":auto:"), getpid());
+
+ pCtx = sqlite3_malloc( sizeof(*pCtx) );
+ if( pCtx==0 ){
+ return SQLITE_NOMEM;
+ }
+ memset(pCtx, 0, sizeof(*pCtx));
+
+ rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath);
+ if( rc==SQLITE_OK ){
+ rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile);
+ }
+ if( rc==SQLITE_OK && lockPath ){
+ pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath);
+ }
+
+ if( rc==SQLITE_OK ){
+ /* all memory is allocated, proxys are created and assigned,
+ ** switch the locking context and pMethod then return.
+ */
+ pCtx->dbPath = sqlite3DbStrDup(0, dbPath);
+ pCtx->oldLockingContext = pFile->lockingContext;
+ pFile->lockingContext = pCtx;
+ pCtx->pOldMethod = pFile->pMethod;
+ pFile->pMethod = &proxyIoMethods;
+ }else{
+ if( pCtx->conchFile ){
+ rc = pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile);
+ if( rc ) return rc;
+ sqlite3_free(pCtx->conchFile);
+ }
+ sqlite3_free(pCtx->conchFilePath);
+ sqlite3_free(pCtx);
+ }
+ OSTRACE3("TRANSPROXY %d %s\n", pFile->h,
+ (rc==SQLITE_OK ? "ok" : "failed"));
+ return rc;
+}
+
+
+/*
+** This routine handles sqlite3_file_control() calls that are specific
+** to proxy locking.
+*/
+static int proxyFileControl(sqlite3_file *id, int op, void *pArg){
+ switch( op ){
+ case SQLITE_GET_LOCKPROXYFILE: {
+ unixFile *pFile = (unixFile*)id;
+ if( pFile->pMethod == &proxyIoMethods ){
+ proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
+ proxyTakeConch(pFile);
+ if( pCtx->lockProxyPath ){
+ *(const char **)pArg = pCtx->lockProxyPath;
+ }else{
+ *(const char **)pArg = ":auto: (not held)";
+ }
+ } else {
+ *(const char **)pArg = NULL;
+ }
+ return SQLITE_OK;
+ }
+ case SQLITE_SET_LOCKPROXYFILE: {
+ unixFile *pFile = (unixFile*)id;
+ int rc = SQLITE_OK;
+ int isProxyStyle = (pFile->pMethod == &proxyIoMethods);
+ if( pArg==NULL || (const char *)pArg==0 ){
+ if( isProxyStyle ){
+ /* turn off proxy locking - not supported */
+ rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/;
+ }else{
+ /* turn off proxy locking - already off - NOOP */
+ rc = SQLITE_OK;
+ }
+ }else{
+ const char *proxyPath = (const char *)pArg;
+ if( isProxyStyle ){
+ proxyLockingContext *pCtx =
+ (proxyLockingContext*)pFile->lockingContext;
+ if( !strcmp(pArg, ":auto:")
+ || (pCtx->lockProxyPath &&
+ !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN))
+ ){
+ rc = SQLITE_OK;
+ }else{
+ rc = switchLockProxyPath(pFile, proxyPath);
+ }
+ }else{
+ /* turn on proxy file locking */
+ rc = proxyTransformUnixFile(pFile, proxyPath);
+ }
+ }
+ return rc;
+ }
+ default: {
+ assert( 0 ); /* The call assures that only valid opcodes are sent */
+ }
+ }
+ /*NOTREACHED*/
+ return SQLITE_ERROR;
+}
+
+/*
+** Within this division (the proxying locking implementation) the procedures
+** above this point are all utilities. The lock-related methods of the
+** proxy-locking sqlite3_io_method object follow.
+*/
+
+
+/*
+** This routine checks if there is a RESERVED lock held on the specified
+** file by this or any other process. If such a lock is held, set *pResOut
+** to a non-zero value otherwise *pResOut is set to zero. The return value
+** is set to SQLITE_OK unless an I/O error occurs during lock checking.
+*/
+static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) {
+ unixFile *pFile = (unixFile*)id;
+ int rc = proxyTakeConch(pFile);
+ if( rc==SQLITE_OK ){
+ proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
+ unixFile *proxy = pCtx->lockProxy;
+ return proxy->pMethod->xCheckReservedLock((sqlite3_file*)proxy, pResOut);
+ }
+ return rc;
+}
+
+/*
+** Lock the file with the lock specified by parameter locktype - one
+** of the following:
+**
+** (1) SHARED_LOCK
+** (2) RESERVED_LOCK
+** (3) PENDING_LOCK
+** (4) EXCLUSIVE_LOCK
+**
+** Sometimes when requesting one lock state, additional lock states
+** are inserted in between. The locking might fail on one of the later
+** transitions leaving the lock state different from what it started but
+** still short of its goal. The following chart shows the allowed
+** transitions and the inserted intermediate states:
+**
+** UNLOCKED -> SHARED
+** SHARED -> RESERVED
+** SHARED -> (PENDING) -> EXCLUSIVE
+** RESERVED -> (PENDING) -> EXCLUSIVE
+** PENDING -> EXCLUSIVE
+**
+** This routine will only increase a lock. Use the sqlite3OsUnlock()
+** routine to lower a locking level.
+*/
+static int proxyLock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ int rc = proxyTakeConch(pFile);
+ if( rc==SQLITE_OK ){
+ proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
+ unixFile *proxy = pCtx->lockProxy;
+ rc = proxy->pMethod->xLock((sqlite3_file*)proxy, locktype);
+ pFile->locktype = proxy->locktype;
+ }
+ return rc;
+}
+
+
+/*
+** Lower the locking level on file descriptor pFile to locktype. locktype
+** must be either NO_LOCK or SHARED_LOCK.
+**
+** If the locking level of the file descriptor is already at or below
+** the requested locking level, this routine is a no-op.
+*/
+static int proxyUnlock(sqlite3_file *id, int locktype) {
+ unixFile *pFile = (unixFile*)id;
+ int rc = proxyTakeConch(pFile);
+ if( rc==SQLITE_OK ){
+ proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
+ unixFile *proxy = pCtx->lockProxy;
+ rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, locktype);
+ pFile->locktype = proxy->locktype;
+ }
+ return rc;
+}
+
+/*
+** Close a file that uses proxy locks.
+*/
+static int proxyClose(sqlite3_file *id) {
+ if( id ){
+ unixFile *pFile = (unixFile*)id;
+ proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
+ unixFile *lockProxy = pCtx->lockProxy;
+ unixFile *conchFile = pCtx->conchFile;
+ int rc = SQLITE_OK;
+
+ if( lockProxy ){
+ rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK);
+ if( rc ) return rc;
+ rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy);
+ if( rc ) return rc;
+ sqlite3_free(lockProxy);
+ pCtx->lockProxy = 0;
+ }
+ if( conchFile ){
+ if( pCtx->conchHeld ){
+ rc = proxyReleaseConch(pFile);
+ if( rc ) return rc;
+ }
+ rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile);
+ if( rc ) return rc;
+ sqlite3_free(conchFile);
+ }
+ sqlite3_free(pCtx->lockProxyPath);
+ sqlite3_free(pCtx->conchFilePath);
+ sqlite3_free(pCtx->dbPath);
+ /* restore the original locking context and pMethod then close it */
+ pFile->lockingContext = pCtx->oldLockingContext;
+ pFile->pMethod = pCtx->pOldMethod;
+ sqlite3_free(pCtx);
+ return pFile->pMethod->xClose(id);
+ }
+ return SQLITE_OK;
+}
+
+
+
+#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
+/*
+** The proxy locking style is intended for use with AFP filesystems.
+** And since AFP is only supported on MacOSX, the proxy locking is also
+** restricted to MacOSX.
+**
+**
+******************* End of the proxy lock implementation **********************
+******************************************************************************/
+
+/*
+** Initialize the operating system interface.
+**
+** This routine registers all VFS implementations for unix-like operating
+** systems. This routine, and the sqlite3_os_end() routine that follows,
+** should be the only routines in this file that are visible from other
+** files.
+**
+** This routine is called once during SQLite initialization and by a
+** single thread. The memory allocation and mutex subsystems have not
+** necessarily been initialized when this routine is called, and so they
+** should not be used.
+*/
+SQLITE_API int sqlite3_os_init(void){
+ /*
+ ** The following macro defines an initializer for an sqlite3_vfs object.
+ ** The name of the VFS is NAME. The pAppData is a pointer to a pointer
+ ** to the "finder" function. (pAppData is a pointer to a pointer because
+ ** silly C90 rules prohibit a void* from being cast to a function pointer
+ ** and so we have to go through the intermediate pointer to avoid problems
+ ** when compiling with -pedantic-errors on GCC.)
+ **
+ ** The FINDER parameter to this macro is the name of the pointer to the
+ ** finder-function. The finder-function returns a pointer to the
+ ** sqlite_io_methods object that implements the desired locking
+ ** behaviors. See the division above that contains the IOMETHODS
+ ** macro for addition information on finder-functions.
+ **
+ ** Most finders simply return a pointer to a fixed sqlite3_io_methods
+ ** object. But the "autolockIoFinder" available on MacOSX does a little
+ ** more than that; it looks at the filesystem type that hosts the
+ ** database file and tries to choose an locking method appropriate for
+ ** that filesystem time.
+ */
+ #define UNIXVFS(VFSNAME, FINDER) { \
+ 1, /* iVersion */ \
+ sizeof(unixFile), /* szOsFile */ \
+ MAX_PATHNAME, /* mxPathname */ \
+ 0, /* pNext */ \
+ VFSNAME, /* zName */ \
+ (void*)&FINDER, /* pAppData */ \
+ unixOpen, /* xOpen */ \
+ unixDelete, /* xDelete */ \
+ unixAccess, /* xAccess */ \
+ unixFullPathname, /* xFullPathname */ \
+ unixDlOpen, /* xDlOpen */ \
+ unixDlError, /* xDlError */ \
+ unixDlSym, /* xDlSym */ \
+ unixDlClose, /* xDlClose */ \
+ unixRandomness, /* xRandomness */ \
+ unixSleep, /* xSleep */ \
+ unixCurrentTime, /* xCurrentTime */ \
+ unixGetLastError /* xGetLastError */ \
+ }
+
+ /*
+ ** All default VFSes for unix are contained in the following array.
+ **
+ ** Note that the sqlite3_vfs.pNext field of the VFS object is modified
+ ** by the SQLite core when the VFS is registered. So the following
+ ** array cannot be const.
+ */
+ static sqlite3_vfs aVfs[] = {
+#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__))
+ UNIXVFS("unix", autolockIoFinder ),
+#else
+ UNIXVFS("unix", posixIoFinder ),
+#endif
+ UNIXVFS("unix-none", nolockIoFinder ),
+ UNIXVFS("unix-dotfile", dotlockIoFinder ),
+ UNIXVFS("unix-wfl", posixWflIoFinder ),
+#if OS_VXWORKS
+ UNIXVFS("unix-namedsem", semIoFinder ),
+#endif
+#if SQLITE_ENABLE_LOCKING_STYLE
+ UNIXVFS("unix-posix", posixIoFinder ),
+#if !OS_VXWORKS
+ UNIXVFS("unix-flock", flockIoFinder ),
+#endif
+#endif
+#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
+ UNIXVFS("unix-afp", afpIoFinder ),
+ UNIXVFS("unix-proxy", proxyIoFinder ),
+#endif
+ };
+ unsigned int i; /* Loop counter */
+
+ /* Register all VFSes defined in the aVfs[] array */
+ for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
+ sqlite3_vfs_register(&aVfs[i], i==0);
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Shutdown the operating system interface.
+**
+** Some operating systems might need to do some cleanup in this routine,
+** to release dynamically allocated objects. But not on unix.
+** This routine is a no-op for unix.
+*/
+SQLITE_API int sqlite3_os_end(void){
+ return SQLITE_OK;
}
-#endif /* OS_UNIX */
+#endif /* SQLITE_OS_UNIX */
/************** End of os_unix.c *********************************************/
/************** Begin file os_win.c ******************************************/
@@ -21690,7 +26998,7 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
**
** This file contains code that is specific to windows.
*/
-#if OS_WIN /* This file is used for windows only */
+#if SQLITE_OS_WIN /* This file is used for windows only */
/*
@@ -21757,7 +27065,11 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
**
** This file should be #included by the os_*.c files only. It is not a
** general purpose header file.
+**
+** $Id: os_common.h,v 1.38 2009/02/24 18:40:50 danielk1977 Exp $
*/
+#ifndef _OS_COMMON_H_
+#define _OS_COMMON_H_
/*
** At least two bugs have slipped in because we changed the MEMORY_DEBUG
@@ -21768,15 +27080,6 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
#endif
-
-/*
- * When testing, this global variable stores the location of the
- * pending-byte in the database file.
- */
-#ifdef SQLITE_TEST
-SQLITE_API unsigned int sqlite3_pending_byte = 0x40000000;
-#endif
-
#ifdef SQLITE_DEBUG
SQLITE_PRIVATE int sqlite3OSTrace = 0;
#define OSTRACE1(X) if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
@@ -21803,22 +27106,113 @@ SQLITE_PRIVATE int sqlite3OSTrace = 0;
** on i486 hardware.
*/
#ifdef SQLITE_PERFORMANCE_TRACE
-__inline__ unsigned long long int hwtime(void){
- unsigned long long int x;
- __asm__("rdtsc\n\t"
- "mov %%edx, %%ecx\n\t"
- :"=A" (x));
- return x;
-}
-static unsigned long long int g_start;
-static unsigned int elapse;
-#define TIMER_START g_start=hwtime()
-#define TIMER_END elapse=hwtime()-g_start
-#define TIMER_ELAPSED elapse
+
+/*
+** hwtime.h contains inline assembler code for implementing
+** high-performance timing routines.
+*/
+/************** Include hwtime.h in the middle of os_common.h ****************/
+/************** Begin file hwtime.h ******************************************/
+/*
+** 2008 May 27
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains inline asm code for retrieving "high-performance"
+** counters for x86 class CPUs.
+**
+** $Id: hwtime.h,v 1.3 2008/08/01 14:33:15 shane Exp $
+*/
+#ifndef _HWTIME_H_
+#define _HWTIME_H_
+
+/*
+** The following routine only works on pentium-class (or newer) processors.
+** It uses the RDTSC opcode to read the cycle count value out of the
+** processor and returns that value. This can be used for high-res
+** profiling.
+*/
+#if (defined(__GNUC__) || defined(_MSC_VER)) && \
+ (defined(i386) || defined(__i386__) || defined(_M_IX86))
+
+ #if defined(__GNUC__)
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+ #elif defined(_MSC_VER)
+
+ __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
+ __asm {
+ rdtsc
+ ret ; return value at EDX:EAX
+ }
+ }
+
+ #endif
+
+#elif (defined(__GNUC__) && defined(__x86_64__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long val;
+ __asm__ __volatile__ ("rdtsc" : "=A" (val));
+ return val;
+ }
+
+#elif (defined(__GNUC__) && defined(__ppc__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long long retval;
+ unsigned long junk;
+ __asm__ __volatile__ ("\n\
+ 1: mftbu %1\n\
+ mftb %L0\n\
+ mftbu %0\n\
+ cmpw %0,%1\n\
+ bne 1b"
+ : "=r" (retval), "=r" (junk));
+ return retval;
+ }
+
+#else
+
+ #error Need implementation of sqlite3Hwtime() for your platform.
+
+ /*
+ ** To compile without implementing sqlite3Hwtime() for your platform,
+ ** you can remove the above #error and use the following
+ ** stub function. You will lose timing support for many
+ ** of the debugging and testing utilities, but it should at
+ ** least compile and run.
+ */
+SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
+
+#endif
+
+#endif /* !defined(_HWTIME_H_) */
+
+/************** End of hwtime.h **********************************************/
+/************** Continuing where we left off in os_common.h ******************/
+
+static sqlite_uint64 g_start;
+static sqlite_uint64 g_elapsed;
+#define TIMER_START g_start=sqlite3Hwtime()
+#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
+#define TIMER_ELAPSED g_elapsed
#else
#define TIMER_START
#define TIMER_END
-#define TIMER_ELAPSED 0
+#define TIMER_ELAPSED ((sqlite_uint64)0)
#endif
/*
@@ -21871,25 +27265,32 @@ SQLITE_API int sqlite3_open_file_count = 0;
#define OpenCounter(X)
#endif
+#endif /* !defined(_OS_COMMON_H_) */
+
/************** End of os_common.h *******************************************/
/************** Continuing where we left off in os_win.c *********************/
/*
+** Some microsoft compilers lack this definition.
+*/
+#ifndef INVALID_FILE_ATTRIBUTES
+# define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
+#endif
+
+/*
** Determine if we are dealing with WindowsCE - which has a much
** reduced API.
*/
-#if defined(_WIN32_WCE)
-# define OS_WINCE 1
+#if SQLITE_OS_WINCE
# define AreFileApisANSI() 1
-#else
-# define OS_WINCE 0
+# define GetDiskFreeSpaceW() 0
#endif
/*
** WinCE lacks native support for file locking so we have to fake it
** with some code of our own.
*/
-#if OS_WINCE
+#if SQLITE_OS_WINCE
typedef struct winceLock {
int nReaders; /* Number of reader locks obtained */
BOOL bPending; /* Indicates a pending lock has been obtained */
@@ -21908,7 +27309,9 @@ struct winFile {
HANDLE h; /* Handle for accessing the file */
unsigned char locktype; /* Type of lock currently held on this file */
short sharedLockByte; /* Randomly chosen byte used as a shared lock */
-#if OS_WINCE
+ DWORD lastErrno; /* The Windows errno from the last I/O error */
+ DWORD sectorSize; /* Sector size of the device file is on */
+#if SQLITE_OS_WINCE
WCHAR *zDeleteOnClose; /* Name of file to delete when closing */
HANDLE hMutex; /* Mutex used to control access to shared lock */
HANDLE hShared; /* Shared memory segment used for locking */
@@ -21917,6 +27320,13 @@ struct winFile {
#endif
};
+/*
+** Forward prototypes.
+*/
+static int getSectorSize(
+ sqlite3_vfs *pVfs,
+ const char *zRelative /* UTF-8 file name */
+);
/*
** The following variable is (normally) set once and never changes
@@ -21942,12 +27352,12 @@ static int sqlite3_os_type = 0;
**
** Here is an interesting observation: Win95, Win98, and WinME lack
** the LockFileEx() API. But we can still statically link against that
-** API as long as we don't call it win running Win95/98/ME. A call to
+** API as long as we don't call it when running Win95/98/ME. A call to
** this routine is used to determine if the host is Win95/98/ME or
** WinNT/2K/XP so that we will know whether or not we can safely call
** the LockFileEx() API.
*/
-#if OS_WINCE
+#if SQLITE_OS_WINCE
# define isNT() (1)
#else
static int isNT(void){
@@ -21959,7 +27369,7 @@ static int sqlite3_os_type = 0;
}
return sqlite3_os_type==2;
}
-#endif /* OS_WINCE */
+#endif /* SQLITE_OS_WINCE */
/*
** Convert a UTF-8 string to microsoft unicode (UTF-16?).
@@ -22060,7 +27470,7 @@ static char *unicodeToMbcs(const WCHAR *zWideFilename){
** Convert multibyte character string to UTF-8. Space to hold the
** returned string is obtained from malloc().
*/
-static char *mbcsToUtf8(const char *zFilename){
+SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){
char *zFilenameUtf8;
WCHAR *zTmpWide;
@@ -22090,7 +27500,7 @@ static char *utf8ToMbcs(const char *zFilename){
return zFilenameMbcs;
}
-#if OS_WINCE
+#if SQLITE_OS_WINCE
/*************************************************************************
** This section contains code for WinCE only.
*/
@@ -22106,8 +27516,8 @@ static struct tm *__cdecl localtime(const time_t *t)
sqlite3_int64 t64;
t64 = *t;
t64 = (t64 + 11644473600)*10000000;
- uTm.dwLowDateTime = t64 & 0xFFFFFFFF;
- uTm.dwHighDateTime= t64 >> 32;
+ uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF);
+ uTm.dwHighDateTime= (DWORD)(t64 >> 32);
FileTimeToLocalFileTime(&uTm,&lTm);
FileTimeToSystemTime(&lTm,&pTm);
y.tm_year = pTm.wYear - 1900;
@@ -22127,7 +27537,7 @@ static struct tm *__cdecl localtime(const time_t *t)
#define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e)
#define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f)
-#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-offsetof(winFile,h)]
+#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)]
/*
** Acquire a lock on the handle h
@@ -22165,6 +27575,7 @@ static BOOL winceCreateLock(const char *zFilename, winFile *pFile){
/* Create/open the named mutex */
pFile->hMutex = CreateMutexW(NULL, FALSE, zName);
if (!pFile->hMutex){
+ pFile->lastErrno = GetLastError();
free(zName);
return FALSE;
}
@@ -22195,6 +27606,7 @@ static BOOL winceCreateLock(const char *zFilename, winFile *pFile){
FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock));
/* If mapping failed, close the shared memory handle and erase it */
if (!pFile->shared){
+ pFile->lastErrno = GetLastError();
CloseHandle(pFile->hShared);
pFile->hShared = NULL;
}
@@ -22264,12 +27676,15 @@ static BOOL winceLockFile(
winFile *pFile = HANDLE_TO_WINFILE(phFile);
BOOL bReturn = FALSE;
+ UNUSED_PARAMETER(dwFileOffsetHigh);
+ UNUSED_PARAMETER(nNumberOfBytesToLockHigh);
+
if (!pFile->hMutex) return TRUE;
winceMutexAcquire(pFile->hMutex);
/* Wanting an exclusive lock? */
- if (dwFileOffsetLow == SHARED_FIRST
- && nNumberOfBytesToLockLow == SHARED_SIZE){
+ if (dwFileOffsetLow == (DWORD)SHARED_FIRST
+ && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){
if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){
pFile->shared->bExclusive = TRUE;
pFile->local.bExclusive = TRUE;
@@ -22278,9 +27693,8 @@ static BOOL winceLockFile(
}
/* Want a read-only lock? */
- else if ((dwFileOffsetLow >= SHARED_FIRST &&
- dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE) &&
- nNumberOfBytesToLockLow == 1){
+ else if (dwFileOffsetLow == (DWORD)SHARED_FIRST &&
+ nNumberOfBytesToLockLow == 1){
if (pFile->shared->bExclusive == 0){
pFile->local.nReaders ++;
if (pFile->local.nReaders == 1){
@@ -22291,7 +27705,7 @@ static BOOL winceLockFile(
}
/* Want a pending lock? */
- else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToLockLow == 1){
+ else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToLockLow == 1){
/* If no pending lock has been acquired, then acquire it */
if (pFile->shared->bPending == 0) {
pFile->shared->bPending = TRUE;
@@ -22299,8 +27713,9 @@ static BOOL winceLockFile(
bReturn = TRUE;
}
}
+
/* Want a reserved lock? */
- else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToLockLow == 1){
+ else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToLockLow == 1){
if (pFile->shared->bReserved == 0) {
pFile->shared->bReserved = TRUE;
pFile->local.bReserved = TRUE;
@@ -22325,14 +27740,17 @@ static BOOL winceUnlockFile(
winFile *pFile = HANDLE_TO_WINFILE(phFile);
BOOL bReturn = FALSE;
+ UNUSED_PARAMETER(dwFileOffsetHigh);
+ UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh);
+
if (!pFile->hMutex) return TRUE;
winceMutexAcquire(pFile->hMutex);
/* Releasing a reader lock or an exclusive lock */
- if (dwFileOffsetLow >= SHARED_FIRST &&
- dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE){
+ if (dwFileOffsetLow == (DWORD)SHARED_FIRST){
/* Did we have an exclusive lock? */
if (pFile->local.bExclusive){
+ assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE);
pFile->local.bExclusive = FALSE;
pFile->shared->bExclusive = FALSE;
bReturn = TRUE;
@@ -22340,6 +27758,7 @@ static BOOL winceUnlockFile(
/* Did we just have a reader lock? */
else if (pFile->local.nReaders){
+ assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE || nNumberOfBytesToUnlockLow == 1);
pFile->local.nReaders --;
if (pFile->local.nReaders == 0)
{
@@ -22350,7 +27769,7 @@ static BOOL winceUnlockFile(
}
/* Releasing a pending lock */
- else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){
+ else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){
if (pFile->local.bPending){
pFile->local.bPending = FALSE;
pFile->shared->bPending = FALSE;
@@ -22358,7 +27777,7 @@ static BOOL winceUnlockFile(
}
}
/* Releasing a reserved lock */
- else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){
+ else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){
if (pFile->local.bReserved) {
pFile->local.bReserved = FALSE;
pFile->shared->bReserved = FALSE;
@@ -22381,11 +27800,14 @@ static BOOL winceLockFileEx(
DWORD nNumberOfBytesToLockHigh,
LPOVERLAPPED lpOverlapped
){
+ UNUSED_PARAMETER(dwReserved);
+ UNUSED_PARAMETER(nNumberOfBytesToLockHigh);
+
/* If the caller wants a shared read lock, forward this call
** to winceLockFile */
- if (lpOverlapped->Offset == SHARED_FIRST &&
+ if (lpOverlapped->Offset == (DWORD)SHARED_FIRST &&
dwFlags == 1 &&
- nNumberOfBytesToLockLow == SHARED_SIZE){
+ nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){
return winceLockFile(phFile, SHARED_FIRST, 0, 1, 0);
}
return FALSE;
@@ -22393,7 +27815,7 @@ static BOOL winceLockFileEx(
/*
** End of the special code for wince
*****************************************************************************/
-#endif /* OS_WINCE */
+#endif /* SQLITE_OS_WINCE */
/*****************************************************************************
** The next group of routines implement the I/O methods specified
@@ -22414,11 +27836,13 @@ static BOOL winceLockFileEx(
static int winClose(sqlite3_file *id){
int rc, cnt = 0;
winFile *pFile = (winFile*)id;
+
+ assert( id!=0 );
OSTRACE2("CLOSE %d\n", pFile->h);
do{
rc = CloseHandle(pFile->h);
- }while( rc==0 && cnt++ < MX_CLOSE_ATTEMPT && (Sleep(100), 1) );
-#if OS_WINCE
+ }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (Sleep(100), 1) );
+#if SQLITE_OS_WINCE
#define WINCE_DELETION_ATTEMPTS 3
winceDestroyLock(pFile);
if( pFile->zDeleteOnClose ){
@@ -22455,24 +27879,29 @@ static int winRead(
int amt, /* Number of bytes to read */
sqlite3_int64 offset /* Begin reading at this offset */
){
- LONG upperBits = (offset>>32) & 0x7fffffff;
- LONG lowerBits = offset & 0xffffffff;
+ LONG upperBits = (LONG)((offset>>32) & 0x7fffffff);
+ LONG lowerBits = (LONG)(offset & 0xffffffff);
DWORD rc;
- DWORD got;
winFile *pFile = (winFile*)id;
+ DWORD error;
+ DWORD got;
+
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_READ);
OSTRACE3("READ %d lock=%d\n", pFile->h, pFile->locktype);
rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
- if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){
+ if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
+ pFile->lastErrno = error;
return SQLITE_FULL;
}
if( !ReadFile(pFile->h, pBuf, amt, &got, 0) ){
+ pFile->lastErrno = GetLastError();
return SQLITE_IOERR_READ;
}
if( got==(DWORD)amt ){
return SQLITE_OK;
}else{
+ /* Unread parts of the buffer must be zero-filled */
memset(&((char*)pBuf)[got], 0, amt-got);
return SQLITE_IOERR_SHORT_READ;
}
@@ -22488,17 +27917,20 @@ static int winWrite(
int amt, /* Number of bytes to write */
sqlite3_int64 offset /* Offset into the file to begin writing at */
){
- LONG upperBits = (offset>>32) & 0x7fffffff;
- LONG lowerBits = offset & 0xffffffff;
+ LONG upperBits = (LONG)((offset>>32) & 0x7fffffff);
+ LONG lowerBits = (LONG)(offset & 0xffffffff);
DWORD rc;
- DWORD wrote;
winFile *pFile = (winFile*)id;
+ DWORD error;
+ DWORD wrote = 0;
+
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_WRITE);
SimulateDiskfullError(return SQLITE_FULL);
OSTRACE3("WRITE %d lock=%d\n", pFile->h, pFile->locktype);
rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
- if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){
+ if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
+ pFile->lastErrno = error;
return SQLITE_FULL;
}
assert( amt>0 );
@@ -22511,6 +27943,7 @@ static int winWrite(
pBuf = &((char*)pBuf)[wrote];
}
if( !rc || amt>(int)wrote ){
+ pFile->lastErrno = GetLastError();
return SQLITE_FULL;
}
return SQLITE_OK;
@@ -22520,13 +27953,25 @@ static int winWrite(
** Truncate an open file to a specified size
*/
static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
- LONG upperBits = (nByte>>32) & 0x7fffffff;
- LONG lowerBits = nByte & 0xffffffff;
+ LONG upperBits = (LONG)((nByte>>32) & 0x7fffffff);
+ LONG lowerBits = (LONG)(nByte & 0xffffffff);
+ DWORD rc;
winFile *pFile = (winFile*)id;
+ DWORD error;
+
+ assert( id!=0 );
OSTRACE3("TRUNCATE %d %lld\n", pFile->h, nByte);
SimulateIOError(return SQLITE_IOERR_TRUNCATE);
- SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
- SetEndOfFile(pFile->h);
+ rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
+ if( rc==INVALID_SET_FILE_POINTER && (error=GetLastError())!=NO_ERROR ){
+ pFile->lastErrno = error;
+ return SQLITE_IOERR_TRUNCATE;
+ }
+ /* SetEndOfFile will fail if nByte is negative */
+ if( !SetEndOfFile(pFile->h) ){
+ pFile->lastErrno = GetLastError();
+ return SQLITE_IOERR_TRUNCATE;
+ }
return SQLITE_OK;
}
@@ -22543,29 +27988,55 @@ SQLITE_API int sqlite3_fullsync_count = 0;
** Make sure all writes to a particular file are committed to disk.
*/
static int winSync(sqlite3_file *id, int flags){
+#ifndef SQLITE_NO_SYNC
winFile *pFile = (winFile*)id;
+
+ assert( id!=0 );
OSTRACE3("SYNC %d lock=%d\n", pFile->h, pFile->locktype);
-#ifdef SQLITE_TEST
+#else
+ UNUSED_PARAMETER(id);
+#endif
+#ifndef SQLITE_TEST
+ UNUSED_PARAMETER(flags);
+#else
if( flags & SQLITE_SYNC_FULL ){
sqlite3_fullsync_count++;
}
sqlite3_sync_count++;
#endif
+ /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
+ ** no-op
+ */
+#ifdef SQLITE_NO_SYNC
+ return SQLITE_OK;
+#else
if( FlushFileBuffers(pFile->h) ){
return SQLITE_OK;
}else{
+ pFile->lastErrno = GetLastError();
return SQLITE_IOERR;
}
+#endif
}
/*
** Determine the current size of a file in bytes
*/
static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){
+ DWORD upperBits;
+ DWORD lowerBits;
winFile *pFile = (winFile*)id;
- DWORD upperBits, lowerBits;
+ DWORD error;
+
+ assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_FSTAT);
lowerBits = GetFileSize(pFile->h, &upperBits);
+ if( (lowerBits == INVALID_FILE_SIZE)
+ && ((error = GetLastError()) != NO_ERROR) )
+ {
+ pFile->lastErrno = error;
+ return SQLITE_IOERR_FSTAT;
+ }
*pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits;
return SQLITE_OK;
}
@@ -22591,11 +28062,18 @@ static int getReadLock(winFile *pFile){
ovlp.hEvent = 0;
res = LockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY,
0, SHARED_SIZE, 0, &ovlp);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+*/
+#if SQLITE_OS_WINCE==0
}else{
int lk;
sqlite3_randomness(sizeof(lk), &lk);
- pFile->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1);
+ pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1));
res = LockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0);
+#endif
+ }
+ if( res == 0 ){
+ pFile->lastErrno = GetLastError();
}
return res;
}
@@ -22607,8 +28085,15 @@ static int unlockReadLock(winFile *pFile){
int res;
if( isNT() ){
res = UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+*/
+#if SQLITE_OS_WINCE==0
}else{
res = UnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0);
+#endif
+ }
+ if( res == 0 ){
+ pFile->lastErrno = GetLastError();
}
return res;
}
@@ -22645,8 +28130,9 @@ static int winLock(sqlite3_file *id, int locktype){
int newLocktype; /* Set pFile->locktype to this value before exiting */
int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */
winFile *pFile = (winFile*)id;
+ DWORD error = NO_ERROR;
- assert( pFile!=0 );
+ assert( id!=0 );
OSTRACE5("LOCK %d %d was %d(%d)\n",
pFile->h, locktype, pFile->locktype, pFile->sharedLockByte);
@@ -22669,8 +28155,9 @@ static int winLock(sqlite3_file *id, int locktype){
** the PENDING_LOCK byte is temporary.
*/
newLocktype = pFile->locktype;
- if( pFile->locktype==NO_LOCK
- || (locktype==EXCLUSIVE_LOCK && pFile->locktype==RESERVED_LOCK)
+ if( (pFile->locktype==NO_LOCK)
+ || ( (locktype==EXCLUSIVE_LOCK)
+ && (pFile->locktype==RESERVED_LOCK))
){
int cnt = 3;
while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){
@@ -22681,6 +28168,9 @@ static int winLock(sqlite3_file *id, int locktype){
Sleep(1);
}
gotPendingLock = res;
+ if( !res ){
+ error = GetLastError();
+ }
}
/* Acquire a shared lock
@@ -22690,6 +28180,8 @@ static int winLock(sqlite3_file *id, int locktype){
res = getReadLock(pFile);
if( res ){
newLocktype = SHARED_LOCK;
+ }else{
+ error = GetLastError();
}
}
@@ -22700,6 +28192,8 @@ static int winLock(sqlite3_file *id, int locktype){
res = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0);
if( res ){
newLocktype = RESERVED_LOCK;
+ }else{
+ error = GetLastError();
}
}
@@ -22720,7 +28214,8 @@ static int winLock(sqlite3_file *id, int locktype){
if( res ){
newLocktype = EXCLUSIVE_LOCK;
}else{
- OSTRACE2("error-code = %d\n", GetLastError());
+ error = GetLastError();
+ OSTRACE2("error-code = %d\n", error);
getReadLock(pFile);
}
}
@@ -22740,9 +28235,10 @@ static int winLock(sqlite3_file *id, int locktype){
}else{
OSTRACE4("LOCK FAILED %d trying for %d but got %d\n", pFile->h,
locktype, newLocktype);
+ pFile->lastErrno = error;
rc = SQLITE_BUSY;
}
- pFile->locktype = newLocktype;
+ pFile->locktype = (u8)newLocktype;
return rc;
}
@@ -22751,10 +28247,11 @@ static int winLock(sqlite3_file *id, int locktype){
** file by this or any other process. If such a lock is held, return
** non-zero, otherwise zero.
*/
-static int winCheckReservedLock(sqlite3_file *id){
+static int winCheckReservedLock(sqlite3_file *id, int *pResOut){
int rc;
winFile *pFile = (winFile*)id;
- assert( pFile!=0 );
+
+ assert( id!=0 );
if( pFile->locktype>=RESERVED_LOCK ){
rc = 1;
OSTRACE3("TEST WR-LOCK %d %d (local)\n", pFile->h, rc);
@@ -22766,7 +28263,8 @@ static int winCheckReservedLock(sqlite3_file *id){
rc = !rc;
OSTRACE3("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc);
}
- return rc;
+ *pResOut = rc;
+ return SQLITE_OK;
}
/*
@@ -22806,7 +28304,7 @@ static int winUnlock(sqlite3_file *id, int locktype){
if( type>=PENDING_LOCK ){
UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0);
}
- pFile->locktype = locktype;
+ pFile->locktype = (u8)locktype;
return rc;
}
@@ -22819,6 +28317,10 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){
*(int*)pArg = ((winFile*)id)->locktype;
return SQLITE_OK;
}
+ case SQLITE_LAST_ERRNO: {
+ *(int*)pArg = (int)((winFile*)id)->lastErrno;
+ return SQLITE_OK;
+ }
}
return SQLITE_ERROR;
}
@@ -22834,13 +28336,15 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){
** same for both.
*/
static int winSectorSize(sqlite3_file *id){
- return SQLITE_DEFAULT_SECTOR_SIZE;
+ assert( id!=0 );
+ return (int)(((winFile*)id)->sectorSize);
}
/*
** Return a vector of device characteristics.
*/
static int winDeviceCharacteristics(sqlite3_file *id){
+ UNUSED_PARAMETER(id);
return 0;
}
@@ -22880,14 +28384,104 @@ static void *convertUtf8Filename(const char *zFilename){
void *zConverted = 0;
if( isNT() ){
zConverted = utf8ToUnicode(zFilename);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+*/
+#if SQLITE_OS_WINCE==0
}else{
zConverted = utf8ToMbcs(zFilename);
+#endif
}
/* caller will handle out of memory */
return zConverted;
}
/*
+** Create a temporary file name in zBuf. zBuf must be big enough to
+** hold at pVfs->mxPathname characters.
+*/
+static int getTempname(int nBuf, char *zBuf){
+ static char zChars[] =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789";
+ size_t i, j;
+ char zTempPath[MAX_PATH+1];
+ if( sqlite3_temp_directory ){
+ sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory);
+ }else if( isNT() ){
+ char *zMulti;
+ WCHAR zWidePath[MAX_PATH];
+ GetTempPathW(MAX_PATH-30, zWidePath);
+ zMulti = unicodeToUtf8(zWidePath);
+ if( zMulti ){
+ sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti);
+ free(zMulti);
+ }else{
+ return SQLITE_NOMEM;
+ }
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
+ }else{
+ char *zUtf8;
+ char zMbcsPath[MAX_PATH];
+ GetTempPathA(MAX_PATH-30, zMbcsPath);
+ zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath);
+ if( zUtf8 ){
+ sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8);
+ free(zUtf8);
+ }else{
+ return SQLITE_NOMEM;
+ }
+#endif
+ }
+ for(i=sqlite3Strlen30(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){}
+ zTempPath[i] = 0;
+ sqlite3_snprintf(nBuf-30, zBuf,
+ "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath);
+ j = sqlite3Strlen30(zBuf);
+ sqlite3_randomness(20, &zBuf[j]);
+ for(i=0; i<20; i++, j++){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
+ }
+ zBuf[j] = 0;
+ OSTRACE2("TEMP FILENAME: %s\n", zBuf);
+ return SQLITE_OK;
+}
+
+/*
+** The return value of getLastErrorMsg
+** is zero if the error message fits in the buffer, or non-zero
+** otherwise (if the message was truncated).
+*/
+static int getLastErrorMsg(int nBuf, char *zBuf){
+ DWORD error = GetLastError();
+
+#if SQLITE_OS_WINCE
+ sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error);
+#else
+ /* FormatMessage returns 0 on failure. Otherwise it
+ ** returns the number of TCHARs written to the output
+ ** buffer, excluding the terminating null char.
+ */
+ if (!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ error,
+ 0,
+ zBuf,
+ nBuf-1,
+ 0))
+ {
+ sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error);
+ }
+#endif
+
+ return 0;
+}
+
+/*
** Open a file.
*/
static int winOpen(
@@ -22902,9 +28496,30 @@ static int winOpen(
DWORD dwShareMode;
DWORD dwCreationDisposition;
DWORD dwFlagsAndAttributes = 0;
- int isTemp;
+#if SQLITE_OS_WINCE
+ int isTemp = 0;
+#endif
winFile *pFile = (winFile*)id;
- void *zConverted = convertUtf8Filename(zName);
+ void *zConverted; /* Filename in OS encoding */
+ const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
+ char zTmpname[MAX_PATH+1]; /* Buffer used to create temp filename */
+
+ assert( id!=0 );
+ UNUSED_PARAMETER(pVfs);
+
+ /* If the second argument to this function is NULL, generate a
+ ** temporary file name to use
+ */
+ if( !zUtf8Name ){
+ int rc = getTempname(MAX_PATH+1, zTmpname);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ zUtf8Name = zTmpname;
+ }
+
+ /* Convert the filename to the system encoding. */
+ zConverted = convertUtf8Filename(zUtf8Name);
if( zConverted==0 ){
return SQLITE_NOMEM;
}
@@ -22914,32 +28529,40 @@ static int winOpen(
}else{
dwDesiredAccess = GENERIC_READ;
}
- if( flags & SQLITE_OPEN_CREATE ){
+ /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is
+ ** created. SQLite doesn't use it to indicate "exclusive access"
+ ** as it is usually understood.
+ */
+ assert(!(flags & SQLITE_OPEN_EXCLUSIVE) || (flags & SQLITE_OPEN_CREATE));
+ if( flags & SQLITE_OPEN_EXCLUSIVE ){
+ /* Creates a new file, only if it does not already exist. */
+ /* If the file exists, it fails. */
+ dwCreationDisposition = CREATE_NEW;
+ }else if( flags & SQLITE_OPEN_CREATE ){
+ /* Open existing file, or create if it doesn't exist */
dwCreationDisposition = OPEN_ALWAYS;
}else{
+ /* Opens a file, only if it exists. */
dwCreationDisposition = OPEN_EXISTING;
}
- if( flags & SQLITE_OPEN_MAIN_DB ){
- dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
- }else{
- dwShareMode = 0;
- }
+ dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
if( flags & SQLITE_OPEN_DELETEONCLOSE ){
-#if OS_WINCE
+#if SQLITE_OS_WINCE
dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN;
+ isTemp = 1;
#else
dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY
| FILE_ATTRIBUTE_HIDDEN
| FILE_FLAG_DELETE_ON_CLOSE;
#endif
- isTemp = 1;
}else{
dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
- isTemp = 0;
}
/* Reports from the internet are that performance is always
** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */
+#if SQLITE_OS_WINCE
dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;
+#endif
if( isNT() ){
h = CreateFileW((WCHAR*)zConverted,
dwDesiredAccess,
@@ -22949,10 +28572,12 @@ static int winOpen(
dwFlagsAndAttributes,
NULL
);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
}else{
-#if OS_WINCE
- return SQLITE_NOMEM;
-#else
h = CreateFileA((char*)zConverted,
dwDesiredAccess,
dwShareMode,
@@ -22966,7 +28591,7 @@ static int winOpen(
if( h==INVALID_HANDLE_VALUE ){
free(zConverted);
if( flags & SQLITE_OPEN_READWRITE ){
- return winOpen(0, zName, id,
+ return winOpen(pVfs, zName, id,
((flags|SQLITE_OPEN_READONLY)&~SQLITE_OPEN_READWRITE), pOutFlags);
}else{
return SQLITE_CANTOPEN;
@@ -22982,7 +28607,9 @@ static int winOpen(
memset(pFile, 0, sizeof(*pFile));
pFile->pMethod = &winIoMethod;
pFile->h = h;
-#if OS_WINCE
+ pFile->lastErrno = NO_ERROR;
+ pFile->sectorSize = getSectorSize(pVfs, zUtf8Name);
+#if SQLITE_OS_WINCE
if( (flags & (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)) ==
(SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)
&& !winceCreateLock(zName, pFile)
@@ -23008,7 +28635,7 @@ static int winOpen(
** Note that windows does not allow a file to be deleted if some other
** process has it open. Sometimes a virus scanner or indexing program
** will open a journal file shortly after it is created in order to do
-** whatever does. While this other process is holding the
+** whatever it does. While this other process is holding the
** file open, we will be unable to delete it. To work around this
** problem, we delay 100 milliseconds and try to delete again. Up
** to MX_DELETION_ATTEMPTs deletion attempts are run before giving
@@ -23021,8 +28648,11 @@ static int winDelete(
int syncDir /* Not used on win32 */
){
int cnt = 0;
- int rc;
+ DWORD rc;
+ DWORD error = 0;
void *zConverted = convertUtf8Filename(zFilename);
+ UNUSED_PARAMETER(pVfs);
+ UNUSED_PARAMETER(syncDir);
if( zConverted==0 ){
return SQLITE_NOMEM;
}
@@ -23030,21 +28660,28 @@ static int winDelete(
if( isNT() ){
do{
DeleteFileW(zConverted);
- }while( (rc = GetFileAttributesW(zConverted))!=0xffffffff
- && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) );
+ }while( ( ((rc = GetFileAttributesW(zConverted)) != INVALID_FILE_ATTRIBUTES)
+ || ((error = GetLastError()) == ERROR_ACCESS_DENIED))
+ && (++cnt < MX_DELETION_ATTEMPTS)
+ && (Sleep(100), 1) );
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
}else{
-#if OS_WINCE
- return SQLITE_NOMEM;
-#else
do{
DeleteFileA(zConverted);
- }while( (rc = GetFileAttributesA(zConverted))!=0xffffffff
- && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) );
+ }while( ( ((rc = GetFileAttributesA(zConverted)) != INVALID_FILE_ATTRIBUTES)
+ || ((error = GetLastError()) == ERROR_ACCESS_DENIED))
+ && (++cnt < MX_DELETION_ATTEMPTS)
+ && (Sleep(100), 1) );
#endif
}
free(zConverted);
OSTRACE2("DELETE \"%s\"\n", zFilename);
- return rc==0xffffffff ? SQLITE_OK : SQLITE_IOERR_DELETE;
+ return ( (rc == INVALID_FILE_ATTRIBUTES)
+ && (error == ERROR_FILE_NOT_FOUND)) ? SQLITE_OK : SQLITE_IOERR_DELETE;
}
/*
@@ -23053,20 +28690,24 @@ static int winDelete(
static int winAccess(
sqlite3_vfs *pVfs, /* Not used on win32 */
const char *zFilename, /* Name of file to check */
- int flags /* Type of test to make on this file */
+ int flags, /* Type of test to make on this file */
+ int *pResOut /* OUT: Result */
){
DWORD attr;
- int rc;
+ int rc = 0;
void *zConverted = convertUtf8Filename(zFilename);
+ UNUSED_PARAMETER(pVfs);
if( zConverted==0 ){
return SQLITE_NOMEM;
}
if( isNT() ){
attr = GetFileAttributesW((WCHAR*)zConverted);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
}else{
-#if OS_WINCE
- return SQLITE_NOMEM;
-#else
attr = GetFileAttributesA((char*)zConverted);
#endif
}
@@ -23074,7 +28715,7 @@ static int winAccess(
switch( flags ){
case SQLITE_ACCESS_READ:
case SQLITE_ACCESS_EXISTS:
- rc = attr!=0xffffffff;
+ rc = attr!=INVALID_FILE_ATTRIBUTES;
break;
case SQLITE_ACCESS_READWRITE:
rc = (attr & FILE_ATTRIBUTE_READONLY)==0;
@@ -23082,61 +28723,12 @@ static int winAccess(
default:
assert(!"Invalid flags argument");
}
- return rc;
+ *pResOut = rc;
+ return SQLITE_OK;
}
/*
-** Create a temporary file name in zBuf. zBuf must be big enough to
-** hold at pVfs->mxPathname characters.
-*/
-static int winGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
- static char zChars[] =
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "0123456789";
- int i, j;
- char zTempPath[MAX_PATH+1];
- if( sqlite3_temp_directory ){
- sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory);
- }else if( isNT() ){
- char *zMulti;
- WCHAR zWidePath[MAX_PATH];
- GetTempPathW(MAX_PATH-30, zWidePath);
- zMulti = unicodeToUtf8(zWidePath);
- if( zMulti ){
- sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti);
- free(zMulti);
- }else{
- return SQLITE_NOMEM;
- }
- }else{
- char *zUtf8;
- char zMbcsPath[MAX_PATH];
- GetTempPathA(MAX_PATH-30, zMbcsPath);
- zUtf8 = mbcsToUtf8(zMbcsPath);
- if( zUtf8 ){
- sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8);
- free(zUtf8);
- }else{
- return SQLITE_NOMEM;
- }
- }
- for(i=strlen(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){}
- zTempPath[i] = 0;
- sqlite3_snprintf(nBuf-30, zBuf,
- "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath);
- j = strlen(zBuf);
- sqlite3_randomness(20, &zBuf[j]);
- for(i=0; i<20; i++, j++){
- zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
- }
- zBuf[j] = 0;
- OSTRACE2("TEMP FILENAME: %s\n", zBuf);
- return SQLITE_OK;
-}
-
-/*
** Turn a relative pathname into a full pathname. Write the full
** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname
** bytes in size.
@@ -23147,22 +28739,25 @@ static int winFullPathname(
int nFull, /* Size of output buffer in bytes */
char *zFull /* Output buffer */
){
-
+
#if defined(__CYGWIN__)
+ UNUSED_PARAMETER(nFull);
cygwin_conv_to_full_win32_path(zRelative, zFull);
return SQLITE_OK;
#endif
-#if OS_WINCE
+#if SQLITE_OS_WINCE
+ UNUSED_PARAMETER(nFull);
/* WinCE has no concept of a relative pathname, or so I am told. */
sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zRelative);
return SQLITE_OK;
#endif
-#if !OS_WINCE && !defined(__CYGWIN__)
+#if !SQLITE_OS_WINCE && !defined(__CYGWIN__)
int nByte;
void *zConverted;
char *zOut;
+ UNUSED_PARAMETER(nFull);
zConverted = convertUtf8Filename(zRelative);
if( isNT() ){
WCHAR *zTemp;
@@ -23176,6 +28771,11 @@ static int winFullPathname(
free(zConverted);
zOut = unicodeToUtf8(zTemp);
free(zTemp);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
}else{
char *zTemp;
nByte = GetFullPathNameA((char*)zConverted, 0, 0, 0) + 3;
@@ -23186,8 +28786,9 @@ static int winFullPathname(
}
GetFullPathNameA((char*)zConverted, nByte, zTemp, 0);
free(zConverted);
- zOut = mbcsToUtf8(zTemp);
+ zOut = sqlite3_win32_mbcs_to_utf8(zTemp);
free(zTemp);
+#endif
}
if( zOut ){
sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zOut);
@@ -23199,6 +28800,74 @@ static int winFullPathname(
#endif
}
+/*
+** Get the sector size of the device used to store
+** file.
+*/
+static int getSectorSize(
+ sqlite3_vfs *pVfs,
+ const char *zRelative /* UTF-8 file name */
+){
+ DWORD bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE;
+ /* GetDiskFreeSpace is not supported under WINCE */
+#if SQLITE_OS_WINCE
+ UNUSED_PARAMETER(pVfs);
+ UNUSED_PARAMETER(zRelative);
+#else
+ char zFullpath[MAX_PATH+1];
+ int rc;
+ DWORD dwRet = 0;
+ DWORD dwDummy;
+
+ /*
+ ** We need to get the full path name of the file
+ ** to get the drive letter to look up the sector
+ ** size.
+ */
+ rc = winFullPathname(pVfs, zRelative, MAX_PATH, zFullpath);
+ if( rc == SQLITE_OK )
+ {
+ void *zConverted = convertUtf8Filename(zFullpath);
+ if( zConverted ){
+ if( isNT() ){
+ /* trim path to just drive reference */
+ WCHAR *p = zConverted;
+ for(;*p;p++){
+ if( *p == '\\' ){
+ *p = '\0';
+ break;
+ }
+ }
+ dwRet = GetDiskFreeSpaceW((WCHAR*)zConverted,
+ &dwDummy,
+ &bytesPerSector,
+ &dwDummy,
+ &dwDummy);
+ }else{
+ /* trim path to just drive reference */
+ CHAR *p = (CHAR *)zConverted;
+ for(;*p;p++){
+ if( *p == '\\' ){
+ *p = '\0';
+ break;
+ }
+ }
+ dwRet = GetDiskFreeSpaceA((CHAR*)zConverted,
+ &dwDummy,
+ &bytesPerSector,
+ &dwDummy,
+ &dwDummy);
+ }
+ free(zConverted);
+ }
+ if( !dwRet ){
+ bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE;
+ }
+ }
+#endif
+ return (int) bytesPerSector;
+}
+
#ifndef SQLITE_OMIT_LOAD_EXTENSION
/*
** Interfaces for opening a shared library, finding entry points
@@ -23211,15 +28880,18 @@ static int winFullPathname(
static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
HANDLE h;
void *zConverted = convertUtf8Filename(zFilename);
+ UNUSED_PARAMETER(pVfs);
if( zConverted==0 ){
return 0;
}
if( isNT() ){
h = LoadLibraryW((WCHAR*)zConverted);
+/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
+** Since the ASCII version of these Windows API do not exist for WINCE,
+** it's important to not reference them for WINCE builds.
+*/
+#if SQLITE_OS_WINCE==0
}else{
-#if OS_WINCE
- return 0;
-#else
h = LoadLibraryA((char*)zConverted);
#endif
}
@@ -23227,36 +28899,22 @@ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
return (void*)h;
}
static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
-#if OS_WINCE
- int error = GetLastError();
- if( error>0x7FFFFFF ){
- sqlite3_snprintf(nBuf, zBufOut, "OsError 0x%x", error);
- }else{
- sqlite3_snprintf(nBuf, zBufOut, "OsError %d", error);
- }
-#else
- FormatMessageA(
- FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- GetLastError(),
- 0,
- zBufOut,
- nBuf-1,
- 0
- );
-#endif
+ UNUSED_PARAMETER(pVfs);
+ getLastErrorMsg(nBuf, zBufOut);
}
-void *winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){
-#if OS_WINCE
+void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
+ UNUSED_PARAMETER(pVfs);
+#if SQLITE_OS_WINCE
/* The GetProcAddressA() routine is only available on wince. */
- return GetProcAddressA((HANDLE)pHandle, zSymbol);
+ return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol);
#else
/* All other windows platforms expect GetProcAddress() to take
** an Ansi string regardless of the _UNICODE setting */
- return GetProcAddress((HANDLE)pHandle, zSymbol);
+ return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol);
#endif
}
void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
+ UNUSED_PARAMETER(pVfs);
FreeLibrary((HANDLE)pHandle);
}
#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
@@ -23272,6 +28930,11 @@ void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
*/
static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
int n = 0;
+ UNUSED_PARAMETER(pVfs);
+#if defined(SQLITE_TEST)
+ n = nBuf;
+ memset(zBuf, 0, nBuf);
+#else
if( sizeof(SYSTEMTIME)<=nBuf-n ){
SYSTEMTIME x;
GetSystemTime(&x);
@@ -23294,6 +28957,7 @@ static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
memcpy(&zBuf[n], &i, sizeof(i));
n += sizeof(i);
}
+#endif
return n;
}
@@ -23303,6 +28967,7 @@ static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
*/
static int winSleep(sqlite3_vfs *pVfs, int microsec){
Sleep((microsec+999)/1000);
+ UNUSED_PARAMETER(pVfs);
return ((microsec+999)/1000)*1000;
}
@@ -23324,32 +28989,87 @@ int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
/* FILETIME structure is a 64-bit value representing the number of
100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
*/
- double now;
-#if OS_WINCE
+ sqlite3_int64 timeW; /* Whole days */
+ sqlite3_int64 timeF; /* Fractional Days */
+
+ /* Number of 100-nanosecond intervals in a single day */
+ static const sqlite3_int64 ntuPerDay =
+ 10000000*(sqlite3_int64)86400;
+
+ /* Number of 100-nanosecond intervals in half of a day */
+ static const sqlite3_int64 ntuPerHalfDay =
+ 10000000*(sqlite3_int64)43200;
+
+ /* 2^32 - to avoid use of LL and warnings in gcc */
+ static const sqlite3_int64 max32BitValue =
+ (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + (sqlite3_int64)294967296;
+
+#if SQLITE_OS_WINCE
SYSTEMTIME time;
GetSystemTime(&time);
- SystemTimeToFileTime(&time,&ft);
+ /* if SystemTimeToFileTime() fails, it returns zero. */
+ if (!SystemTimeToFileTime(&time,&ft)){
+ return 1;
+ }
#else
GetSystemTimeAsFileTime( &ft );
#endif
- now = ((double)ft.dwHighDateTime) * 4294967296.0;
- *prNow = (now + ft.dwLowDateTime)/864000000000.0 + 2305813.5;
+ UNUSED_PARAMETER(pVfs);
+ timeW = (((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + (sqlite3_int64)ft.dwLowDateTime;
+ timeF = timeW % ntuPerDay; /* fractional days (100-nanoseconds) */
+ timeW = timeW / ntuPerDay; /* whole days */
+ timeW = timeW + 2305813; /* add whole days (from 2305813.5) */
+ timeF = timeF + ntuPerHalfDay; /* add half a day (from 2305813.5) */
+ timeW = timeW + (timeF/ntuPerDay); /* add whole day if half day made one */
+ timeF = timeF % ntuPerDay; /* compute new fractional days */
+ *prNow = (double)timeW + ((double)timeF / (double)ntuPerDay);
#ifdef SQLITE_TEST
if( sqlite3_current_time ){
- *prNow = sqlite3_current_time/86400.0 + 2440587.5;
+ *prNow = ((double)sqlite3_current_time + (double)43200) / (double)86400 + (double)2440587;
}
#endif
return 0;
}
+/*
+** The idea is that this function works like a combination of
+** GetLastError() and FormatMessage() on windows (or errno and
+** strerror_r() on unix). After an error is returned by an OS
+** function, SQLite calls this function with zBuf pointing to
+** a buffer of nBuf bytes. The OS layer should populate the
+** buffer with a nul-terminated UTF-8 encoded error message
+** describing the last IO error to have occurred within the calling
+** thread.
+**
+** If the error message is too large for the supplied buffer,
+** it should be truncated. The return value of xGetLastError
+** is zero if the error message fits in the buffer, or non-zero
+** otherwise (if the message was truncated). If non-zero is returned,
+** then it is not necessary to include the nul-terminator character
+** in the output buffer.
+**
+** Not supplying an error message will have no adverse effect
+** on SQLite. It is fine to have an implementation that never
+** returns an error message:
+**
+** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
+** assert(zBuf[0]=='\0');
+** return 0;
+** }
+**
+** However if an error message is supplied, it will be incorporated
+** by sqlite into the error message available to the user using
+** sqlite3_errmsg(), possibly making IO errors easier to debug.
+*/
+static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
+ UNUSED_PARAMETER(pVfs);
+ return getLastErrorMsg(nBuf, zBuf);
+}
/*
-** Return a pointer to the sqlite3DefaultVfs structure. We use
-** a function rather than give the structure global scope because
-** some compilers (MSVC) do not allow forward declarations of
-** initialized structures.
+** Initialize and deinitialize the operating system interface.
*/
-SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
+SQLITE_API int sqlite3_os_init(void){
static sqlite3_vfs winVfs = {
1, /* iVersion */
sizeof(winFile), /* szOsFile */
@@ -23357,11 +29077,10 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
0, /* pNext */
"win32", /* zName */
0, /* pAppData */
-
+
winOpen, /* xOpen */
winDelete, /* xDelete */
winAccess, /* xAccess */
- winGetTempname, /* xGetTempName */
winFullPathname, /* xFullPathname */
winDlOpen, /* xDlOpen */
winDlError, /* xDlError */
@@ -23369,13 +29088,18 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
winDlClose, /* xDlClose */
winRandomness, /* xRandomness */
winSleep, /* xSleep */
- winCurrentTime /* xCurrentTime */
+ winCurrentTime, /* xCurrentTime */
+ winGetLastError /* xGetLastError */
};
-
- return &winVfs;
+
+ sqlite3_vfs_register(&winVfs, 1);
+ return SQLITE_OK;
+}
+SQLITE_API int sqlite3_os_end(void){
+ return SQLITE_OK;
}
-#endif /* OS_WIN */
+#endif /* SQLITE_OS_WIN */
/************** End of os_win.c **********************************************/
/************** Begin file bitvec.c ******************************************/
@@ -23393,12 +29117,14 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
** This file implements an object that represents a fixed-length
** bitmap. Bits are numbered starting with 1.
**
-** A bitmap is used to record what pages a database file have been
-** journalled during a transaction. Usually only a few pages are
-** journalled. So the bitmap is usually sparse and has low cardinality.
+** A bitmap is used to record which pages of a database file have been
+** journalled during a transaction, or which pages have the "dont-write"
+** property. Usually only a few pages are meet either condition.
+** So the bitmap is usually sparse and has low cardinality.
** But sometimes (for example when during a DROP of a large table) most
-** or all of the pages get journalled. In those cases, the bitmap becomes
-** dense. The algorithm needs to handle both cases well.
+** or all of the pages in a database can get journalled. In those cases,
+** the bitmap becomes dense with high cardinality. The algorithm needs
+** to handle both cases well.
**
** The size of the bitmap is fixed when the object is created.
**
@@ -23413,20 +29139,41 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
** start of a transaction, and is thus usually less than a few thousand,
** but can be as large as 2 billion for a really big database.
**
-** @(#) $Id: bitvec.c,v 1.5 2008/05/13 13:27:34 drh Exp $
+** @(#) $Id: bitvec.c,v 1.17 2009/07/25 17:33:26 drh Exp $
*/
-#define BITVEC_SZ 512
+/* Size of the Bitvec structure in bytes. */
+#define BITVEC_SZ (sizeof(void*)*128) /* 512 on 32bit. 1024 on 64bit */
+
/* Round the union size down to the nearest pointer boundary, since that's how
** it will be aligned within the Bitvec struct. */
-#define BITVEC_USIZE (((BITVEC_SZ-12)/sizeof(Bitvec*))*sizeof(Bitvec*))
-#define BITVEC_NCHAR BITVEC_USIZE
-#define BITVEC_NBIT (BITVEC_NCHAR*8)
-#define BITVEC_NINT (BITVEC_USIZE/4)
+#define BITVEC_USIZE (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*))
+
+/* Type of the array "element" for the bitmap representation.
+** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE.
+** Setting this to the "natural word" size of your CPU may improve
+** performance. */
+#define BITVEC_TELEM u8
+/* Size, in bits, of the bitmap element. */
+#define BITVEC_SZELEM 8
+/* Number of elements in a bitmap array. */
+#define BITVEC_NELEM (BITVEC_USIZE/sizeof(BITVEC_TELEM))
+/* Number of bits in the bitmap array. */
+#define BITVEC_NBIT (BITVEC_NELEM*BITVEC_SZELEM)
+
+/* Number of u32 values in hash table. */
+#define BITVEC_NINT (BITVEC_USIZE/sizeof(u32))
+/* Maximum number of entries in hash table before
+** sub-dividing and re-hashing. */
#define BITVEC_MXHASH (BITVEC_NINT/2)
+/* Hashing function for the aHash representation.
+** Empirical testing showed that the *37 multiplier
+** (an arbitrary prime)in the hash function provided
+** no fewer collisions than the no-op *1. */
+#define BITVEC_HASH(X) (((X)*1)%BITVEC_NINT)
+
#define BITVEC_NPTR (BITVEC_USIZE/sizeof(Bitvec *))
-#define BITVEC_HASH(X) (((X)*37)%BITVEC_NINT)
/*
** A bitmap is an instance of the following structure.
@@ -23450,11 +29197,16 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3OsDefaultVfs(void){
** to hold deal with values between 1 and iDivisor.
*/
struct Bitvec {
- u32 iSize; /* Maximum bit index */
- u32 nSet; /* Number of bits that are set */
- u32 iDivisor; /* Number of bits handled by each apSub[] entry */
+ u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */
+ u32 nSet; /* Number of bits that are set - only valid for aHash
+ ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512,
+ ** this would be 125. */
+ u32 iDivisor; /* Number of bits handled by each apSub[] entry. */
+ /* Should >=0 for apSub element. */
+ /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */
+ /* For a BITVEC_SZ of 512, this would be 34,359,739. */
union {
- u8 aBitmap[BITVEC_NCHAR]; /* Bitmap representation */
+ BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */
u32 aHash[BITVEC_NINT]; /* Hash table representation */
Bitvec *apSub[BITVEC_NPTR]; /* Recursive representation */
} u;
@@ -23483,20 +29235,22 @@ SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){
SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){
if( p==0 ) return 0;
if( i>p->iSize || i==0 ) return 0;
- if( p->iSize<=BITVEC_NBIT ){
- i--;
- return (p->u.aBitmap[i/8] & (1<<(i&7)))!=0;
+ i--;
+ while( p->iDivisor ){
+ u32 bin = i/p->iDivisor;
+ i = i%p->iDivisor;
+ p = p->u.apSub[bin];
+ if (!p) {
+ return 0;
+ }
}
- if( p->iDivisor>0 ){
- u32 bin = (i-1)/p->iDivisor;
- i = (i-1)%p->iDivisor + 1;
- return sqlite3BitvecTest(p->u.apSub[bin], i);
- }else{
- u32 h = BITVEC_HASH(i);
+ if( p->iSize<=BITVEC_NBIT ){
+ return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0;
+ } else{
+ u32 h = BITVEC_HASH(i++);
while( p->u.aHash[h] ){
if( p->u.aHash[h]==i ) return 1;
- h++;
- if( h>=BITVEC_NINT ) h = 0;
+ h = (h+1) % BITVEC_NINT;
}
return 0;
}
@@ -23505,76 +29259,115 @@ SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){
/*
** Set the i-th bit. Return 0 on success and an error code if
** anything goes wrong.
+**
+** This routine might cause sub-bitmaps to be allocated. Failing
+** to get the memory needed to hold the sub-bitmap is the only
+** that can go wrong with an insert, assuming p and i are valid.
+**
+** The calling function must ensure that p is a valid Bitvec object
+** and that the value for "i" is within range of the Bitvec object.
+** Otherwise the behavior is undefined.
*/
SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){
u32 h;
- assert( p!=0 );
+ if( p==0 ) return SQLITE_OK;
assert( i>0 );
assert( i<=p->iSize );
- if( p->iSize<=BITVEC_NBIT ){
- i--;
- p->u.aBitmap[i/8] |= 1 << (i&7);
- return SQLITE_OK;
- }
- if( p->iDivisor ){
- u32 bin = (i-1)/p->iDivisor;
- i = (i-1)%p->iDivisor + 1;
+ i--;
+ while((p->iSize > BITVEC_NBIT) && p->iDivisor) {
+ u32 bin = i/p->iDivisor;
+ i = i%p->iDivisor;
if( p->u.apSub[bin]==0 ){
- sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC);
p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor );
- sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC);
if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM;
}
- return sqlite3BitvecSet(p->u.apSub[bin], i);
+ p = p->u.apSub[bin];
+ }
+ if( p->iSize<=BITVEC_NBIT ){
+ p->u.aBitmap[i/BITVEC_SZELEM] |= 1 << (i&(BITVEC_SZELEM-1));
+ return SQLITE_OK;
+ }
+ h = BITVEC_HASH(i++);
+ /* if there wasn't a hash collision, and this doesn't */
+ /* completely fill the hash, then just add it without */
+ /* worring about sub-dividing and re-hashing. */
+ if( !p->u.aHash[h] ){
+ if (p->nSet<(BITVEC_NINT-1)) {
+ goto bitvec_set_end;
+ } else {
+ goto bitvec_set_rehash;
+ }
}
- h = BITVEC_HASH(i);
- while( p->u.aHash[h] ){
+ /* there was a collision, check to see if it's already */
+ /* in hash, if not, try to find a spot for it */
+ do {
if( p->u.aHash[h]==i ) return SQLITE_OK;
h++;
- if( h==BITVEC_NINT ) h = 0;
- }
- p->nSet++;
+ if( h>=BITVEC_NINT ) h = 0;
+ } while( p->u.aHash[h] );
+ /* we didn't find it in the hash. h points to the first */
+ /* available free spot. check to see if this is going to */
+ /* make our hash too "full". */
+bitvec_set_rehash:
if( p->nSet>=BITVEC_MXHASH ){
- int j, rc;
- u32 aiValues[BITVEC_NINT];
- memcpy(aiValues, p->u.aHash, sizeof(aiValues));
- memset(p->u.apSub, 0, sizeof(p->u.apSub[0])*BITVEC_NPTR);
- p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR;
- rc = sqlite3BitvecSet(p, i);
- for(j=0; j<BITVEC_NINT; j++){
- if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]);
+ unsigned int j;
+ int rc;
+ u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash));
+ if( aiValues==0 ){
+ return SQLITE_NOMEM;
+ }else{
+ memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
+ memset(p->u.apSub, 0, sizeof(p->u.apSub));
+ p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR;
+ rc = sqlite3BitvecSet(p, i);
+ for(j=0; j<BITVEC_NINT; j++){
+ if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]);
+ }
+ sqlite3StackFree(0, aiValues);
+ return rc;
}
- return rc;
}
+bitvec_set_end:
+ p->nSet++;
p->u.aHash[h] = i;
return SQLITE_OK;
}
/*
-** Clear the i-th bit. Return 0 on success and an error code if
-** anything goes wrong.
+** Clear the i-th bit.
+**
+** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage
+** that BitvecClear can use to rebuilt its hash table.
*/
-SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i){
- assert( p!=0 );
+SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){
+ if( p==0 ) return;
assert( i>0 );
- if( p->iSize<=BITVEC_NBIT ){
- i--;
- p->u.aBitmap[i/8] &= ~(1 << (i&7));
- }else if( p->iDivisor ){
- u32 bin = (i-1)/p->iDivisor;
- i = (i-1)%p->iDivisor + 1;
- if( p->u.apSub[bin] ){
- sqlite3BitvecClear(p->u.apSub[bin], i);
+ i--;
+ while( p->iDivisor ){
+ u32 bin = i/p->iDivisor;
+ i = i%p->iDivisor;
+ p = p->u.apSub[bin];
+ if (!p) {
+ return;
}
+ }
+ if( p->iSize<=BITVEC_NBIT ){
+ p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1)));
}else{
- int j;
- u32 aiValues[BITVEC_NINT];
- memcpy(aiValues, p->u.aHash, sizeof(aiValues));
- memset(p->u.aHash, 0, sizeof(p->u.aHash[0])*BITVEC_NINT);
+ unsigned int j;
+ u32 *aiValues = pBuf;
+ memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
+ memset(p->u.aHash, 0, sizeof(p->u.aHash));
p->nSet = 0;
for(j=0; j<BITVEC_NINT; j++){
- if( aiValues[j] && aiValues[j]!=i ){
- sqlite3BitvecSet(p, aiValues[j]);
+ if( aiValues[j] && aiValues[j]!=(i+1) ){
+ u32 h = BITVEC_HASH(aiValues[j]-1);
+ p->nSet++;
+ while( p->u.aHash[h] ){
+ h++;
+ if( h>=BITVEC_NINT ) h = 0;
+ }
+ p->u.aHash[h] = aiValues[j];
}
}
}
@@ -23586,7 +29379,7 @@ SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i){
SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){
if( p==0 ) return;
if( p->iDivisor ){
- int i;
+ unsigned int i;
for(i=0; i<BITVEC_NPTR; i++){
sqlite3BitvecDestroy(p->u.apSub[i]);
}
@@ -23594,6 +29387,14 @@ SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){
sqlite3_free(p);
}
+/*
+** Return the value of the iSize parameter specified when Bitvec *p
+** was created.
+*/
+SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){
+ return p->iSize;
+}
+
#ifndef SQLITE_OMIT_BUILTIN_TEST
/*
** Let V[] be an array of unsigned characters sufficient to hold
@@ -23640,14 +29441,20 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
unsigned char *pV = 0;
int rc = -1;
int i, nx, pc, op;
+ void *pTmpSpace;
/* Allocate the Bitvec to be tested and a linear array of
** bits to act as the reference */
pBitvec = sqlite3BitvecCreate( sz );
pV = sqlite3_malloc( (sz+7)/8 + 1 );
- if( pBitvec==0 || pV==0 ) goto bitvec_end;
+ pTmpSpace = sqlite3_malloc(BITVEC_SZ);
+ if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end;
memset(pV, 0, (sz+7)/8 + 1);
+ /* NULL pBitvec tests */
+ sqlite3BitvecSet(0, 1);
+ sqlite3BitvecClear(0, 1, pTmpSpace);
+
/* Run the program */
pc = 0;
while( (op = aOp[pc])!=0 ){
@@ -23678,7 +29485,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
}
}else{
CLEARBIT(pV, (i+1));
- sqlite3BitvecClear(pBitvec, i+1);
+ sqlite3BitvecClear(pBitvec, i+1, pTmpSpace);
}
}
@@ -23688,7 +29495,8 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
** is found.
*/
rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1)
- + sqlite3BitvecTest(pBitvec, 0);
+ + sqlite3BitvecTest(pBitvec, 0)
+ + (sqlite3BitvecSize(pBitvec) - sz);
for(i=1; i<=sz; i++){
if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){
rc = i;
@@ -23698,6 +29506,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
/* Free allocated structure */
bitvec_end:
+ sqlite3_free(pTmpSpace);
sqlite3_free(pV);
sqlite3BitvecDestroy(pBitvec);
return rc;
@@ -23705,6 +29514,1801 @@ bitvec_end:
#endif /* SQLITE_OMIT_BUILTIN_TEST */
/************** End of bitvec.c **********************************************/
+/************** Begin file pcache.c ******************************************/
+/*
+** 2008 August 05
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file implements that page cache.
+**
+** @(#) $Id: pcache.c,v 1.47 2009/07/25 11:46:49 danielk1977 Exp $
+*/
+
+/*
+** A complete page cache is an instance of this structure.
+*/
+struct PCache {
+ PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */
+ PgHdr *pSynced; /* Last synced page in dirty page list */
+ int nRef; /* Number of referenced pages */
+ int nMax; /* Configured cache size */
+ int szPage; /* Size of every page in this cache */
+ int szExtra; /* Size of extra space for each page */
+ int bPurgeable; /* True if pages are on backing store */
+ int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */
+ void *pStress; /* Argument to xStress */
+ sqlite3_pcache *pCache; /* Pluggable cache module */
+ PgHdr *pPage1; /* Reference to page 1 */
+};
+
+/*
+** Some of the assert() macros in this code are too expensive to run
+** even during normal debugging. Use them only rarely on long-running
+** tests. Enable the expensive asserts using the
+** -DSQLITE_ENABLE_EXPENSIVE_ASSERT=1 compile-time option.
+*/
+#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
+# define expensive_assert(X) assert(X)
+#else
+# define expensive_assert(X)
+#endif
+
+/********************************** Linked List Management ********************/
+
+#if !defined(NDEBUG) && defined(SQLITE_ENABLE_EXPENSIVE_ASSERT)
+/*
+** Check that the pCache->pSynced variable is set correctly. If it
+** is not, either fail an assert or return zero. Otherwise, return
+** non-zero. This is only used in debugging builds, as follows:
+**
+** expensive_assert( pcacheCheckSynced(pCache) );
+*/
+static int pcacheCheckSynced(PCache *pCache){
+ PgHdr *p;
+ for(p=pCache->pDirtyTail; p!=pCache->pSynced; p=p->pDirtyPrev){
+ assert( p->nRef || (p->flags&PGHDR_NEED_SYNC) );
+ }
+ return (p==0 || p->nRef || (p->flags&PGHDR_NEED_SYNC)==0);
+}
+#endif /* !NDEBUG && SQLITE_ENABLE_EXPENSIVE_ASSERT */
+
+/*
+** Remove page pPage from the list of dirty pages.
+*/
+static void pcacheRemoveFromDirtyList(PgHdr *pPage){
+ PCache *p = pPage->pCache;
+
+ assert( pPage->pDirtyNext || pPage==p->pDirtyTail );
+ assert( pPage->pDirtyPrev || pPage==p->pDirty );
+
+ /* Update the PCache1.pSynced variable if necessary. */
+ if( p->pSynced==pPage ){
+ PgHdr *pSynced = pPage->pDirtyPrev;
+ while( pSynced && (pSynced->flags&PGHDR_NEED_SYNC) ){
+ pSynced = pSynced->pDirtyPrev;
+ }
+ p->pSynced = pSynced;
+ }
+
+ if( pPage->pDirtyNext ){
+ pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev;
+ }else{
+ assert( pPage==p->pDirtyTail );
+ p->pDirtyTail = pPage->pDirtyPrev;
+ }
+ if( pPage->pDirtyPrev ){
+ pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext;
+ }else{
+ assert( pPage==p->pDirty );
+ p->pDirty = pPage->pDirtyNext;
+ }
+ pPage->pDirtyNext = 0;
+ pPage->pDirtyPrev = 0;
+
+ expensive_assert( pcacheCheckSynced(p) );
+}
+
+/*
+** Add page pPage to the head of the dirty list (PCache1.pDirty is set to
+** pPage).
+*/
+static void pcacheAddToDirtyList(PgHdr *pPage){
+ PCache *p = pPage->pCache;
+
+ assert( pPage->pDirtyNext==0 && pPage->pDirtyPrev==0 && p->pDirty!=pPage );
+
+ pPage->pDirtyNext = p->pDirty;
+ if( pPage->pDirtyNext ){
+ assert( pPage->pDirtyNext->pDirtyPrev==0 );
+ pPage->pDirtyNext->pDirtyPrev = pPage;
+ }
+ p->pDirty = pPage;
+ if( !p->pDirtyTail ){
+ p->pDirtyTail = pPage;
+ }
+ if( !p->pSynced && 0==(pPage->flags&PGHDR_NEED_SYNC) ){
+ p->pSynced = pPage;
+ }
+ expensive_assert( pcacheCheckSynced(p) );
+}
+
+/*
+** Wrapper around the pluggable caches xUnpin method. If the cache is
+** being used for an in-memory database, this function is a no-op.
+*/
+static void pcacheUnpin(PgHdr *p){
+ PCache *pCache = p->pCache;
+ if( pCache->bPurgeable ){
+ if( p->pgno==1 ){
+ pCache->pPage1 = 0;
+ }
+ sqlite3GlobalConfig.pcache.xUnpin(pCache->pCache, p, 0);
+ }
+}
+
+/*************************************************** General Interfaces ******
+**
+** Initialize and shutdown the page cache subsystem. Neither of these
+** functions are threadsafe.
+*/
+SQLITE_PRIVATE int sqlite3PcacheInitialize(void){
+ if( sqlite3GlobalConfig.pcache.xInit==0 ){
+ sqlite3PCacheSetDefault();
+ }
+ return sqlite3GlobalConfig.pcache.xInit(sqlite3GlobalConfig.pcache.pArg);
+}
+SQLITE_PRIVATE void sqlite3PcacheShutdown(void){
+ if( sqlite3GlobalConfig.pcache.xShutdown ){
+ sqlite3GlobalConfig.pcache.xShutdown(sqlite3GlobalConfig.pcache.pArg);
+ }
+}
+
+/*
+** Return the size in bytes of a PCache object.
+*/
+SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); }
+
+/*
+** Create a new PCache object. Storage space to hold the object
+** has already been allocated and is passed in as the p pointer.
+** The caller discovers how much space needs to be allocated by
+** calling sqlite3PcacheSize().
+*/
+SQLITE_PRIVATE void sqlite3PcacheOpen(
+ int szPage, /* Size of every page */
+ int szExtra, /* Extra space associated with each page */
+ int bPurgeable, /* True if pages are on backing store */
+ int (*xStress)(void*,PgHdr*),/* Call to try to make pages clean */
+ void *pStress, /* Argument to xStress */
+ PCache *p /* Preallocated space for the PCache */
+){
+ memset(p, 0, sizeof(PCache));
+ p->szPage = szPage;
+ p->szExtra = szExtra;
+ p->bPurgeable = bPurgeable;
+ p->xStress = xStress;
+ p->pStress = pStress;
+ p->nMax = 100;
+}
+
+/*
+** Change the page size for PCache object. The caller must ensure that there
+** are no outstanding page references when this function is called.
+*/
+SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *pCache, int szPage){
+ assert( pCache->nRef==0 && pCache->pDirty==0 );
+ if( pCache->pCache ){
+ sqlite3GlobalConfig.pcache.xDestroy(pCache->pCache);
+ pCache->pCache = 0;
+ }
+ pCache->szPage = szPage;
+}
+
+/*
+** Try to obtain a page from the cache.
+*/
+SQLITE_PRIVATE int sqlite3PcacheFetch(
+ PCache *pCache, /* Obtain the page from this cache */
+ Pgno pgno, /* Page number to obtain */
+ int createFlag, /* If true, create page if it does not exist already */
+ PgHdr **ppPage /* Write the page here */
+){
+ PgHdr *pPage = 0;
+ int eCreate;
+
+ assert( pCache!=0 );
+ assert( createFlag==1 || createFlag==0 );
+ assert( pgno>0 );
+
+ /* If the pluggable cache (sqlite3_pcache*) has not been allocated,
+ ** allocate it now.
+ */
+ if( !pCache->pCache && createFlag ){
+ sqlite3_pcache *p;
+ int nByte;
+ nByte = pCache->szPage + pCache->szExtra + sizeof(PgHdr);
+ p = sqlite3GlobalConfig.pcache.xCreate(nByte, pCache->bPurgeable);
+ if( !p ){
+ return SQLITE_NOMEM;
+ }
+ sqlite3GlobalConfig.pcache.xCachesize(p, pCache->nMax);
+ pCache->pCache = p;
+ }
+
+ eCreate = createFlag * (1 + (!pCache->bPurgeable || !pCache->pDirty));
+ if( pCache->pCache ){
+ pPage = sqlite3GlobalConfig.pcache.xFetch(pCache->pCache, pgno, eCreate);
+ }
+
+ if( !pPage && eCreate==1 ){
+ PgHdr *pPg;
+
+ /* Find a dirty page to write-out and recycle. First try to find a
+ ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC
+ ** cleared), but if that is not possible settle for any other
+ ** unreferenced dirty page.
+ */
+ expensive_assert( pcacheCheckSynced(pCache) );
+ for(pPg=pCache->pSynced;
+ pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC));
+ pPg=pPg->pDirtyPrev
+ );
+ if( !pPg ){
+ for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev);
+ }
+ if( pPg ){
+ int rc;
+ rc = pCache->xStress(pCache->pStress, pPg);
+ if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
+ return rc;
+ }
+ }
+
+ pPage = sqlite3GlobalConfig.pcache.xFetch(pCache->pCache, pgno, 2);
+ }
+
+ if( pPage ){
+ if( !pPage->pData ){
+ memset(pPage, 0, sizeof(PgHdr) + pCache->szExtra);
+ pPage->pExtra = (void*)&pPage[1];
+ pPage->pData = (void *)&((char *)pPage)[sizeof(PgHdr) + pCache->szExtra];
+ pPage->pCache = pCache;
+ pPage->pgno = pgno;
+ }
+ assert( pPage->pCache==pCache );
+ assert( pPage->pgno==pgno );
+ assert( pPage->pExtra==(void *)&pPage[1] );
+
+ if( 0==pPage->nRef ){
+ pCache->nRef++;
+ }
+ pPage->nRef++;
+ if( pgno==1 ){
+ pCache->pPage1 = pPage;
+ }
+ }
+ *ppPage = pPage;
+ return (pPage==0 && eCreate) ? SQLITE_NOMEM : SQLITE_OK;
+}
+
+/*
+** Decrement the reference count on a page. If the page is clean and the
+** reference count drops to 0, then it is made elible for recycling.
+*/
+SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr *p){
+ assert( p->nRef>0 );
+ p->nRef--;
+ if( p->nRef==0 ){
+ PCache *pCache = p->pCache;
+ pCache->nRef--;
+ if( (p->flags&PGHDR_DIRTY)==0 ){
+ pcacheUnpin(p);
+ }else{
+ /* Move the page to the head of the dirty list. */
+ pcacheRemoveFromDirtyList(p);
+ pcacheAddToDirtyList(p);
+ }
+ }
+}
+
+/*
+** Increase the reference count of a supplied page by 1.
+*/
+SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){
+ assert(p->nRef>0);
+ p->nRef++;
+}
+
+/*
+** Drop a page from the cache. There must be exactly one reference to the
+** page. This function deletes that reference, so after it returns the
+** page pointed to by p is invalid.
+*/
+SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){
+ PCache *pCache;
+ assert( p->nRef==1 );
+ if( p->flags&PGHDR_DIRTY ){
+ pcacheRemoveFromDirtyList(p);
+ }
+ pCache = p->pCache;
+ pCache->nRef--;
+ if( p->pgno==1 ){
+ pCache->pPage1 = 0;
+ }
+ sqlite3GlobalConfig.pcache.xUnpin(pCache->pCache, p, 1);
+}
+
+/*
+** Make sure the page is marked as dirty. If it isn't dirty already,
+** make it so.
+*/
+SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
+ p->flags &= ~PGHDR_DONT_WRITE;
+ assert( p->nRef>0 );
+ if( 0==(p->flags & PGHDR_DIRTY) ){
+ p->flags |= PGHDR_DIRTY;
+ pcacheAddToDirtyList( p);
+ }
+}
+
+/*
+** Make sure the page is marked as clean. If it isn't clean already,
+** make it so.
+*/
+SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){
+ if( (p->flags & PGHDR_DIRTY) ){
+ pcacheRemoveFromDirtyList(p);
+ p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC);
+ if( p->nRef==0 ){
+ pcacheUnpin(p);
+ }
+ }
+}
+
+/*
+** Make every page in the cache clean.
+*/
+SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){
+ PgHdr *p;
+ while( (p = pCache->pDirty)!=0 ){
+ sqlite3PcacheMakeClean(p);
+ }
+}
+
+/*
+** Clear the PGHDR_NEED_SYNC flag from all dirty pages.
+*/
+SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){
+ PgHdr *p;
+ for(p=pCache->pDirty; p; p=p->pDirtyNext){
+ p->flags &= ~PGHDR_NEED_SYNC;
+ }
+ pCache->pSynced = pCache->pDirtyTail;
+}
+
+/*
+** Change the page number of page p to newPgno.
+*/
+SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){
+ PCache *pCache = p->pCache;
+ assert( p->nRef>0 );
+ assert( newPgno>0 );
+ sqlite3GlobalConfig.pcache.xRekey(pCache->pCache, p, p->pgno, newPgno);
+ p->pgno = newPgno;
+ if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){
+ pcacheRemoveFromDirtyList(p);
+ pcacheAddToDirtyList(p);
+ }
+}
+
+/*
+** Drop every cache entry whose page number is greater than "pgno". The
+** caller must ensure that there are no outstanding references to any pages
+** other than page 1 with a page number greater than pgno.
+**
+** If there is a reference to page 1 and the pgno parameter passed to this
+** function is 0, then the data area associated with page 1 is zeroed, but
+** the page object is not dropped.
+*/
+SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){
+ if( pCache->pCache ){
+ PgHdr *p;
+ PgHdr *pNext;
+ for(p=pCache->pDirty; p; p=pNext){
+ pNext = p->pDirtyNext;
+ if( p->pgno>pgno ){
+ assert( p->flags&PGHDR_DIRTY );
+ sqlite3PcacheMakeClean(p);
+ }
+ }
+ if( pgno==0 && pCache->pPage1 ){
+ memset(pCache->pPage1->pData, 0, pCache->szPage);
+ pgno = 1;
+ }
+ sqlite3GlobalConfig.pcache.xTruncate(pCache->pCache, pgno+1);
+ }
+}
+
+/*
+** Close a cache.
+*/
+SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){
+ if( pCache->pCache ){
+ sqlite3GlobalConfig.pcache.xDestroy(pCache->pCache);
+ }
+}
+
+/*
+** Discard the contents of the cache.
+*/
+SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){
+ sqlite3PcacheTruncate(pCache, 0);
+}
+
+/*
+** Merge two lists of pages connected by pDirty and in pgno order.
+** Do not both fixing the pDirtyPrev pointers.
+*/
+static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){
+ PgHdr result, *pTail;
+ pTail = &result;
+ while( pA && pB ){
+ if( pA->pgno<pB->pgno ){
+ pTail->pDirty = pA;
+ pTail = pA;
+ pA = pA->pDirty;
+ }else{
+ pTail->pDirty = pB;
+ pTail = pB;
+ pB = pB->pDirty;
+ }
+ }
+ if( pA ){
+ pTail->pDirty = pA;
+ }else if( pB ){
+ pTail->pDirty = pB;
+ }else{
+ pTail->pDirty = 0;
+ }
+ return result.pDirty;
+}
+
+/*
+** Sort the list of pages in accending order by pgno. Pages are
+** connected by pDirty pointers. The pDirtyPrev pointers are
+** corrupted by this sort.
+**
+** Since there cannot be more than 2^31 distinct pages in a database,
+** there cannot be more than 31 buckets required by the merge sorter.
+** One extra bucket is added to catch overflow in case something
+** ever changes to make the previous sentence incorrect.
+*/
+#define N_SORT_BUCKET 32
+static PgHdr *pcacheSortDirtyList(PgHdr *pIn){
+ PgHdr *a[N_SORT_BUCKET], *p;
+ int i;
+ memset(a, 0, sizeof(a));
+ while( pIn ){
+ p = pIn;
+ pIn = p->pDirty;
+ p->pDirty = 0;
+ for(i=0; ALWAYS(i<N_SORT_BUCKET-1); i++){
+ if( a[i]==0 ){
+ a[i] = p;
+ break;
+ }else{
+ p = pcacheMergeDirtyList(a[i], p);
+ a[i] = 0;
+ }
+ }
+ if( NEVER(i==N_SORT_BUCKET-1) ){
+ /* To get here, there need to be 2^(N_SORT_BUCKET) elements in
+ ** the input list. But that is impossible.
+ */
+ a[i] = pcacheMergeDirtyList(a[i], p);
+ }
+ }
+ p = a[0];
+ for(i=1; i<N_SORT_BUCKET; i++){
+ p = pcacheMergeDirtyList(p, a[i]);
+ }
+ return p;
+}
+
+/*
+** Return a list of all dirty pages in the cache, sorted by page number.
+*/
+SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){
+ PgHdr *p;
+ for(p=pCache->pDirty; p; p=p->pDirtyNext){
+ p->pDirty = p->pDirtyNext;
+ }
+ return pcacheSortDirtyList(pCache->pDirty);
+}
+
+/*
+** Return the total number of referenced pages held by the cache.
+*/
+SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){
+ return pCache->nRef;
+}
+
+/*
+** Return the number of references to the page supplied as an argument.
+*/
+SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){
+ return p->nRef;
+}
+
+/*
+** Return the total number of pages in the cache.
+*/
+SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){
+ int nPage = 0;
+ if( pCache->pCache ){
+ nPage = sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache);
+ }
+ return nPage;
+}
+
+#ifdef SQLITE_TEST
+/*
+** Get the suggested cache-size value.
+*/
+SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){
+ return pCache->nMax;
+}
+#endif
+
+/*
+** Set the suggested cache-size value.
+*/
+SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){
+ pCache->nMax = mxPage;
+ if( pCache->pCache ){
+ sqlite3GlobalConfig.pcache.xCachesize(pCache->pCache, mxPage);
+ }
+}
+
+#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
+/*
+** For all dirty pages currently in the cache, invoke the specified
+** callback. This is only used if the SQLITE_CHECK_PAGES macro is
+** defined.
+*/
+SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)){
+ PgHdr *pDirty;
+ for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext){
+ xIter(pDirty);
+ }
+}
+#endif
+
+/************** End of pcache.c **********************************************/
+/************** Begin file pcache1.c *****************************************/
+/*
+** 2008 November 05
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file implements the default page cache implementation (the
+** sqlite3_pcache interface). It also contains part of the implementation
+** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features.
+** If the default page cache implementation is overriden, then neither of
+** these two features are available.
+**
+** @(#) $Id: pcache1.c,v 1.19 2009/07/17 11:44:07 drh Exp $
+*/
+
+
+typedef struct PCache1 PCache1;
+typedef struct PgHdr1 PgHdr1;
+typedef struct PgFreeslot PgFreeslot;
+
+/* Pointers to structures of this type are cast and returned as
+** opaque sqlite3_pcache* handles
+*/
+struct PCache1 {
+ /* Cache configuration parameters. Page size (szPage) and the purgeable
+ ** flag (bPurgeable) are set when the cache is created. nMax may be
+ ** modified at any time by a call to the pcache1CacheSize() method.
+ ** The global mutex must be held when accessing nMax.
+ */
+ int szPage; /* Size of allocated pages in bytes */
+ int bPurgeable; /* True if cache is purgeable */
+ unsigned int nMin; /* Minimum number of pages reserved */
+ unsigned int nMax; /* Configured "cache_size" value */
+
+ /* Hash table of all pages. The following variables may only be accessed
+ ** when the accessor is holding the global mutex (see pcache1EnterMutex()
+ ** and pcache1LeaveMutex()).
+ */
+ unsigned int nRecyclable; /* Number of pages in the LRU list */
+ unsigned int nPage; /* Total number of pages in apHash */
+ unsigned int nHash; /* Number of slots in apHash[] */
+ PgHdr1 **apHash; /* Hash table for fast lookup by key */
+
+ unsigned int iMaxKey; /* Largest key seen since xTruncate() */
+};
+
+/*
+** Each cache entry is represented by an instance of the following
+** structure. A buffer of PgHdr1.pCache->szPage bytes is allocated
+** directly before this structure in memory (see the PGHDR1_TO_PAGE()
+** macro below).
+*/
+struct PgHdr1 {
+ unsigned int iKey; /* Key value (page number) */
+ PgHdr1 *pNext; /* Next in hash table chain */
+ PCache1 *pCache; /* Cache that currently owns this page */
+ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */
+ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */
+};
+
+/*
+** Free slots in the allocator used to divide up the buffer provided using
+** the SQLITE_CONFIG_PAGECACHE mechanism.
+*/
+struct PgFreeslot {
+ PgFreeslot *pNext; /* Next free slot */
+};
+
+/*
+** Global data used by this cache.
+*/
+static SQLITE_WSD struct PCacheGlobal {
+ sqlite3_mutex *mutex; /* static mutex MUTEX_STATIC_LRU */
+
+ int nMaxPage; /* Sum of nMaxPage for purgeable caches */
+ int nMinPage; /* Sum of nMinPage for purgeable caches */
+ int nCurrentPage; /* Number of purgeable pages allocated */
+ PgHdr1 *pLruHead, *pLruTail; /* LRU list of unpinned pages */
+
+ /* Variables related to SQLITE_CONFIG_PAGECACHE settings. */
+ int szSlot; /* Size of each free slot */
+ void *pStart, *pEnd; /* Bounds of pagecache malloc range */
+ PgFreeslot *pFree; /* Free page blocks */
+ int isInit; /* True if initialized */
+} pcache1_g;
+
+/*
+** All code in this file should access the global structure above via the
+** alias "pcache1". This ensures that the WSD emulation is used when
+** compiling for systems that do not support real WSD.
+*/
+#define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g))
+
+/*
+** When a PgHdr1 structure is allocated, the associated PCache1.szPage
+** bytes of data are located directly before it in memory (i.e. the total
+** size of the allocation is sizeof(PgHdr1)+PCache1.szPage byte). The
+** PGHDR1_TO_PAGE() macro takes a pointer to a PgHdr1 structure as
+** an argument and returns a pointer to the associated block of szPage
+** bytes. The PAGE_TO_PGHDR1() macro does the opposite: its argument is
+** a pointer to a block of szPage bytes of data and the return value is
+** a pointer to the associated PgHdr1 structure.
+**
+** assert( PGHDR1_TO_PAGE(PAGE_TO_PGHDR1(pCache, X))==X );
+*/
+#define PGHDR1_TO_PAGE(p) (void*)(((char*)p) - p->pCache->szPage)
+#define PAGE_TO_PGHDR1(c, p) (PgHdr1*)(((char*)p) + c->szPage)
+
+/*
+** Macros to enter and leave the global LRU mutex.
+*/
+#define pcache1EnterMutex() sqlite3_mutex_enter(pcache1.mutex)
+#define pcache1LeaveMutex() sqlite3_mutex_leave(pcache1.mutex)
+
+/******************************************************************************/
+/******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/
+
+/*
+** This function is called during initialization if a static buffer is
+** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE
+** verb to sqlite3_config(). Parameter pBuf points to an allocation large
+** enough to contain 'n' buffers of 'sz' bytes each.
+*/
+SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){
+ if( pcache1.isInit ){
+ PgFreeslot *p;
+ sz = ROUNDDOWN8(sz);
+ pcache1.szSlot = sz;
+ pcache1.pStart = pBuf;
+ pcache1.pFree = 0;
+ while( n-- ){
+ p = (PgFreeslot*)pBuf;
+ p->pNext = pcache1.pFree;
+ pcache1.pFree = p;
+ pBuf = (void*)&((char*)pBuf)[sz];
+ }
+ pcache1.pEnd = pBuf;
+ }
+}
+
+/*
+** Malloc function used within this file to allocate space from the buffer
+** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no
+** such buffer exists or there is no space left in it, this function falls
+** back to sqlite3Malloc().
+*/
+static void *pcache1Alloc(int nByte){
+ void *p;
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+ if( nByte<=pcache1.szSlot && pcache1.pFree ){
+ assert( pcache1.isInit );
+ p = (PgHdr1 *)pcache1.pFree;
+ pcache1.pFree = pcache1.pFree->pNext;
+ sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
+ sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, 1);
+ }else{
+
+ /* Allocate a new buffer using sqlite3Malloc. Before doing so, exit the
+ ** global pcache mutex and unlock the pager-cache object pCache. This is
+ ** so that if the attempt to allocate a new buffer causes the the
+ ** configured soft-heap-limit to be breached, it will be possible to
+ ** reclaim memory from this pager-cache.
+ */
+ pcache1LeaveMutex();
+ p = sqlite3Malloc(nByte);
+ pcache1EnterMutex();
+ if( p ){
+ int sz = sqlite3MallocSize(p);
+ sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz);
+ }
+ }
+ return p;
+}
+
+/*
+** Free an allocated buffer obtained from pcache1Alloc().
+*/
+static void pcache1Free(void *p){
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+ if( p==0 ) return;
+ if( p>=pcache1.pStart && p<pcache1.pEnd ){
+ PgFreeslot *pSlot;
+ sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, -1);
+ pSlot = (PgFreeslot*)p;
+ pSlot->pNext = pcache1.pFree;
+ pcache1.pFree = pSlot;
+ }else{
+ int iSize = sqlite3MallocSize(p);
+ sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, -iSize);
+ sqlite3_free(p);
+ }
+}
+
+/*
+** Allocate a new page object initially associated with cache pCache.
+*/
+static PgHdr1 *pcache1AllocPage(PCache1 *pCache){
+ int nByte = sizeof(PgHdr1) + pCache->szPage;
+ void *pPg = pcache1Alloc(nByte);
+ PgHdr1 *p;
+ if( pPg ){
+ p = PAGE_TO_PGHDR1(pCache, pPg);
+ if( pCache->bPurgeable ){
+ pcache1.nCurrentPage++;
+ }
+ }else{
+ p = 0;
+ }
+ return p;
+}
+
+/*
+** Free a page object allocated by pcache1AllocPage().
+**
+** The pointer is allowed to be NULL, which is prudent. But it turns out
+** that the current implementation happens to never call this routine
+** with a NULL pointer, so we mark the NULL test with ALWAYS().
+*/
+static void pcache1FreePage(PgHdr1 *p){
+ if( ALWAYS(p) ){
+ if( p->pCache->bPurgeable ){
+ pcache1.nCurrentPage--;
+ }
+ pcache1Free(PGHDR1_TO_PAGE(p));
+ }
+}
+
+/*
+** Malloc function used by SQLite to obtain space from the buffer configured
+** using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer
+** exists, this function falls back to sqlite3Malloc().
+*/
+SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){
+ void *p;
+ pcache1EnterMutex();
+ p = pcache1Alloc(sz);
+ pcache1LeaveMutex();
+ return p;
+}
+
+/*
+** Free an allocated buffer obtained from sqlite3PageMalloc().
+*/
+SQLITE_PRIVATE void sqlite3PageFree(void *p){
+ pcache1EnterMutex();
+ pcache1Free(p);
+ pcache1LeaveMutex();
+}
+
+/******************************************************************************/
+/******** General Implementation Functions ************************************/
+
+/*
+** This function is used to resize the hash table used by the cache passed
+** as the first argument.
+**
+** The global mutex must be held when this function is called.
+*/
+static int pcache1ResizeHash(PCache1 *p){
+ PgHdr1 **apNew;
+ unsigned int nNew;
+ unsigned int i;
+
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+
+ nNew = p->nHash*2;
+ if( nNew<256 ){
+ nNew = 256;
+ }
+
+ pcache1LeaveMutex();
+ if( p->nHash ){ sqlite3BeginBenignMalloc(); }
+ apNew = (PgHdr1 **)sqlite3_malloc(sizeof(PgHdr1 *)*nNew);
+ if( p->nHash ){ sqlite3EndBenignMalloc(); }
+ pcache1EnterMutex();
+ if( apNew ){
+ memset(apNew, 0, sizeof(PgHdr1 *)*nNew);
+ for(i=0; i<p->nHash; i++){
+ PgHdr1 *pPage;
+ PgHdr1 *pNext = p->apHash[i];
+ while( (pPage = pNext)!=0 ){
+ unsigned int h = pPage->iKey % nNew;
+ pNext = pPage->pNext;
+ pPage->pNext = apNew[h];
+ apNew[h] = pPage;
+ }
+ }
+ sqlite3_free(p->apHash);
+ p->apHash = apNew;
+ p->nHash = nNew;
+ }
+
+ return (p->apHash ? SQLITE_OK : SQLITE_NOMEM);
+}
+
+/*
+** This function is used internally to remove the page pPage from the
+** global LRU list, if is part of it. If pPage is not part of the global
+** LRU list, then this function is a no-op.
+**
+** The global mutex must be held when this function is called.
+*/
+static void pcache1PinPage(PgHdr1 *pPage){
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+ if( pPage && (pPage->pLruNext || pPage==pcache1.pLruTail) ){
+ if( pPage->pLruPrev ){
+ pPage->pLruPrev->pLruNext = pPage->pLruNext;
+ }
+ if( pPage->pLruNext ){
+ pPage->pLruNext->pLruPrev = pPage->pLruPrev;
+ }
+ if( pcache1.pLruHead==pPage ){
+ pcache1.pLruHead = pPage->pLruNext;
+ }
+ if( pcache1.pLruTail==pPage ){
+ pcache1.pLruTail = pPage->pLruPrev;
+ }
+ pPage->pLruNext = 0;
+ pPage->pLruPrev = 0;
+ pPage->pCache->nRecyclable--;
+ }
+}
+
+
+/*
+** Remove the page supplied as an argument from the hash table
+** (PCache1.apHash structure) that it is currently stored in.
+**
+** The global mutex must be held when this function is called.
+*/
+static void pcache1RemoveFromHash(PgHdr1 *pPage){
+ unsigned int h;
+ PCache1 *pCache = pPage->pCache;
+ PgHdr1 **pp;
+
+ h = pPage->iKey % pCache->nHash;
+ for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext);
+ *pp = (*pp)->pNext;
+
+ pCache->nPage--;
+}
+
+/*
+** If there are currently more than pcache.nMaxPage pages allocated, try
+** to recycle pages to reduce the number allocated to pcache.nMaxPage.
+*/
+static void pcache1EnforceMaxPage(void){
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+ while( pcache1.nCurrentPage>pcache1.nMaxPage && pcache1.pLruTail ){
+ PgHdr1 *p = pcache1.pLruTail;
+ pcache1PinPage(p);
+ pcache1RemoveFromHash(p);
+ pcache1FreePage(p);
+ }
+}
+
+/*
+** Discard all pages from cache pCache with a page number (key value)
+** greater than or equal to iLimit. Any pinned pages that meet this
+** criteria are unpinned before they are discarded.
+**
+** The global mutex must be held when this function is called.
+*/
+static void pcache1TruncateUnsafe(
+ PCache1 *pCache,
+ unsigned int iLimit
+){
+ TESTONLY( unsigned int nPage = 0; ) /* Used to assert pCache->nPage is correct */
+ unsigned int h;
+ assert( sqlite3_mutex_held(pcache1.mutex) );
+ for(h=0; h<pCache->nHash; h++){
+ PgHdr1 **pp = &pCache->apHash[h];
+ PgHdr1 *pPage;
+ while( (pPage = *pp)!=0 ){
+ if( pPage->iKey>=iLimit ){
+ pCache->nPage--;
+ *pp = pPage->pNext;
+ pcache1PinPage(pPage);
+ pcache1FreePage(pPage);
+ }else{
+ pp = &pPage->pNext;
+ TESTONLY( nPage++; )
+ }
+ }
+ }
+ assert( pCache->nPage==nPage );
+}
+
+/******************************************************************************/
+/******** sqlite3_pcache Methods **********************************************/
+
+/*
+** Implementation of the sqlite3_pcache.xInit method.
+*/
+static int pcache1Init(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ assert( pcache1.isInit==0 );
+ memset(&pcache1, 0, sizeof(pcache1));
+ if( sqlite3GlobalConfig.bCoreMutex ){
+ pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU);
+ }
+ pcache1.isInit = 1;
+ return SQLITE_OK;
+}
+
+/*
+** Implementation of the sqlite3_pcache.xShutdown method.
+** Note that the static mutex allocated in xInit does
+** not need to be freed.
+*/
+static void pcache1Shutdown(void *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ assert( pcache1.isInit!=0 );
+ memset(&pcache1, 0, sizeof(pcache1));
+}
+
+/*
+** Implementation of the sqlite3_pcache.xCreate method.
+**
+** Allocate a new cache.
+*/
+static sqlite3_pcache *pcache1Create(int szPage, int bPurgeable){
+ PCache1 *pCache;
+
+ pCache = (PCache1 *)sqlite3_malloc(sizeof(PCache1));
+ if( pCache ){
+ memset(pCache, 0, sizeof(PCache1));
+ pCache->szPage = szPage;
+ pCache->bPurgeable = (bPurgeable ? 1 : 0);
+ if( bPurgeable ){
+ pCache->nMin = 10;
+ pcache1EnterMutex();
+ pcache1.nMinPage += pCache->nMin;
+ pcache1LeaveMutex();
+ }
+ }
+ return (sqlite3_pcache *)pCache;
+}
+
+/*
+** Implementation of the sqlite3_pcache.xCachesize method.
+**
+** Configure the cache_size limit for a cache.
+*/
+static void pcache1Cachesize(sqlite3_pcache *p, int nMax){
+ PCache1 *pCache = (PCache1 *)p;
+ if( pCache->bPurgeable ){
+ pcache1EnterMutex();
+ pcache1.nMaxPage += (nMax - pCache->nMax);
+ pCache->nMax = nMax;
+ pcache1EnforceMaxPage();
+ pcache1LeaveMutex();
+ }
+}
+
+/*
+** Implementation of the sqlite3_pcache.xPagecount method.
+*/
+static int pcache1Pagecount(sqlite3_pcache *p){
+ int n;
+ pcache1EnterMutex();
+ n = ((PCache1 *)p)->nPage;
+ pcache1LeaveMutex();
+ return n;
+}
+
+/*
+** Implementation of the sqlite3_pcache.xFetch method.
+**
+** Fetch a page by key value.
+**
+** Whether or not a new page may be allocated by this function depends on
+** the value of the createFlag argument. 0 means do not allocate a new
+** page. 1 means allocate a new page if space is easily available. 2
+** means to try really hard to allocate a new page.
+**
+** For a non-purgeable cache (a cache used as the storage for an in-memory
+** database) there is really no difference between createFlag 1 and 2. So
+** the calling function (pcache.c) will never have a createFlag of 1 on
+** a non-purgable cache.
+**
+** There are three different approaches to obtaining space for a page,
+** depending on the value of parameter createFlag (which may be 0, 1 or 2).
+**
+** 1. Regardless of the value of createFlag, the cache is searched for a
+** copy of the requested page. If one is found, it is returned.
+**
+** 2. If createFlag==0 and the page is not already in the cache, NULL is
+** returned.
+**
+** 3. If createFlag is 1, and the page is not already in the cache,
+** and if either of the following are true, return NULL:
+**
+** (a) the number of pages pinned by the cache is greater than
+** PCache1.nMax, or
+** (b) the number of pages pinned by the cache is greater than
+** the sum of nMax for all purgeable caches, less the sum of
+** nMin for all other purgeable caches.
+**
+** 4. If none of the first three conditions apply and the cache is marked
+** as purgeable, and if one of the following is true:
+**
+** (a) The number of pages allocated for the cache is already
+** PCache1.nMax, or
+**
+** (b) The number of pages allocated for all purgeable caches is
+** already equal to or greater than the sum of nMax for all
+** purgeable caches,
+**
+** then attempt to recycle a page from the LRU list. If it is the right
+** size, return the recycled buffer. Otherwise, free the buffer and
+** proceed to step 5.
+**
+** 5. Otherwise, allocate and return a new page buffer.
+*/
+static void *pcache1Fetch(sqlite3_pcache *p, unsigned int iKey, int createFlag){
+ unsigned int nPinned;
+ PCache1 *pCache = (PCache1 *)p;
+ PgHdr1 *pPage = 0;
+
+ assert( pCache->bPurgeable || createFlag!=1 );
+ pcache1EnterMutex();
+ if( createFlag==1 ) sqlite3BeginBenignMalloc();
+
+ /* Search the hash table for an existing entry. */
+ if( pCache->nHash>0 ){
+ unsigned int h = iKey % pCache->nHash;
+ for(pPage=pCache->apHash[h]; pPage&&pPage->iKey!=iKey; pPage=pPage->pNext);
+ }
+
+ if( pPage || createFlag==0 ){
+ pcache1PinPage(pPage);
+ goto fetch_out;
+ }
+
+ /* Step 3 of header comment. */
+ nPinned = pCache->nPage - pCache->nRecyclable;
+ if( createFlag==1 && (
+ nPinned>=(pcache1.nMaxPage+pCache->nMin-pcache1.nMinPage)
+ || nPinned>=(pCache->nMax * 9 / 10)
+ )){
+ goto fetch_out;
+ }
+
+ if( pCache->nPage>=pCache->nHash && pcache1ResizeHash(pCache) ){
+ goto fetch_out;
+ }
+
+ /* Step 4. Try to recycle a page buffer if appropriate. */
+ if( pCache->bPurgeable && pcache1.pLruTail && (
+ (pCache->nPage+1>=pCache->nMax) || pcache1.nCurrentPage>=pcache1.nMaxPage
+ )){
+ pPage = pcache1.pLruTail;
+ pcache1RemoveFromHash(pPage);
+ pcache1PinPage(pPage);
+ if( pPage->pCache->szPage!=pCache->szPage ){
+ pcache1FreePage(pPage);
+ pPage = 0;
+ }else{
+ pcache1.nCurrentPage -= (pPage->pCache->bPurgeable - pCache->bPurgeable);
+ }
+ }
+
+ /* Step 5. If a usable page buffer has still not been found,
+ ** attempt to allocate a new one.
+ */
+ if( !pPage ){
+ pPage = pcache1AllocPage(pCache);
+ }
+
+ if( pPage ){
+ unsigned int h = iKey % pCache->nHash;
+ pCache->nPage++;
+ pPage->iKey = iKey;
+ pPage->pNext = pCache->apHash[h];
+ pPage->pCache = pCache;
+ pPage->pLruPrev = 0;
+ pPage->pLruNext = 0;
+ *(void **)(PGHDR1_TO_PAGE(pPage)) = 0;
+ pCache->apHash[h] = pPage;
+ }
+
+fetch_out:
+ if( pPage && iKey>pCache->iMaxKey ){
+ pCache->iMaxKey = iKey;
+ }
+ if( createFlag==1 ) sqlite3EndBenignMalloc();
+ pcache1LeaveMutex();
+ return (pPage ? PGHDR1_TO_PAGE(pPage) : 0);
+}
+
+
+/*
+** Implementation of the sqlite3_pcache.xUnpin method.
+**
+** Mark a page as unpinned (eligible for asynchronous recycling).
+*/
+static void pcache1Unpin(sqlite3_pcache *p, void *pPg, int reuseUnlikely){
+ PCache1 *pCache = (PCache1 *)p;
+ PgHdr1 *pPage = PAGE_TO_PGHDR1(pCache, pPg);
+
+ assert( pPage->pCache==pCache );
+ pcache1EnterMutex();
+
+ /* It is an error to call this function if the page is already
+ ** part of the global LRU list.
+ */
+ assert( pPage->pLruPrev==0 && pPage->pLruNext==0 );
+ assert( pcache1.pLruHead!=pPage && pcache1.pLruTail!=pPage );
+
+ if( reuseUnlikely || pcache1.nCurrentPage>pcache1.nMaxPage ){
+ pcache1RemoveFromHash(pPage);
+ pcache1FreePage(pPage);
+ }else{
+ /* Add the page to the global LRU list. Normally, the page is added to
+ ** the head of the list (last page to be recycled). However, if the
+ ** reuseUnlikely flag passed to this function is true, the page is added
+ ** to the tail of the list (first page to be recycled).
+ */
+ if( pcache1.pLruHead ){
+ pcache1.pLruHead->pLruPrev = pPage;
+ pPage->pLruNext = pcache1.pLruHead;
+ pcache1.pLruHead = pPage;
+ }else{
+ pcache1.pLruTail = pPage;
+ pcache1.pLruHead = pPage;
+ }
+ pCache->nRecyclable++;
+ }
+
+ pcache1LeaveMutex();
+}
+
+/*
+** Implementation of the sqlite3_pcache.xRekey method.
+*/
+static void pcache1Rekey(
+ sqlite3_pcache *p,
+ void *pPg,
+ unsigned int iOld,
+ unsigned int iNew
+){
+ PCache1 *pCache = (PCache1 *)p;
+ PgHdr1 *pPage = PAGE_TO_PGHDR1(pCache, pPg);
+ PgHdr1 **pp;
+ unsigned int h;
+ assert( pPage->iKey==iOld );
+ assert( pPage->pCache==pCache );
+
+ pcache1EnterMutex();
+
+ h = iOld%pCache->nHash;
+ pp = &pCache->apHash[h];
+ while( (*pp)!=pPage ){
+ pp = &(*pp)->pNext;
+ }
+ *pp = pPage->pNext;
+
+ h = iNew%pCache->nHash;
+ pPage->iKey = iNew;
+ pPage->pNext = pCache->apHash[h];
+ pCache->apHash[h] = pPage;
+
+ /* The xRekey() interface is only used to move pages earlier in the
+ ** database file (in order to move all free pages to the end of the
+ ** file where they can be truncated off.) Hence, it is not possible
+ ** for the new page number to be greater than the largest previously
+ ** fetched page. But we retain the following test in case xRekey()
+ ** begins to be used in different ways in the future.
+ */
+ if( NEVER(iNew>pCache->iMaxKey) ){
+ pCache->iMaxKey = iNew;
+ }
+
+ pcache1LeaveMutex();
+}
+
+/*
+** Implementation of the sqlite3_pcache.xTruncate method.
+**
+** Discard all unpinned pages in the cache with a page number equal to
+** or greater than parameter iLimit. Any pinned pages with a page number
+** equal to or greater than iLimit are implicitly unpinned.
+*/
+static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){
+ PCache1 *pCache = (PCache1 *)p;
+ pcache1EnterMutex();
+ if( iLimit<=pCache->iMaxKey ){
+ pcache1TruncateUnsafe(pCache, iLimit);
+ pCache->iMaxKey = iLimit-1;
+ }
+ pcache1LeaveMutex();
+}
+
+/*
+** Implementation of the sqlite3_pcache.xDestroy method.
+**
+** Destroy a cache allocated using pcache1Create().
+*/
+static void pcache1Destroy(sqlite3_pcache *p){
+ PCache1 *pCache = (PCache1 *)p;
+ pcache1EnterMutex();
+ pcache1TruncateUnsafe(pCache, 0);
+ pcache1.nMaxPage -= pCache->nMax;
+ pcache1.nMinPage -= pCache->nMin;
+ pcache1EnforceMaxPage();
+ pcache1LeaveMutex();
+ sqlite3_free(pCache->apHash);
+ sqlite3_free(pCache);
+}
+
+/*
+** This function is called during initialization (sqlite3_initialize()) to
+** install the default pluggable cache module, assuming the user has not
+** already provided an alternative.
+*/
+SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){
+ static sqlite3_pcache_methods defaultMethods = {
+ 0, /* pArg */
+ pcache1Init, /* xInit */
+ pcache1Shutdown, /* xShutdown */
+ pcache1Create, /* xCreate */
+ pcache1Cachesize, /* xCachesize */
+ pcache1Pagecount, /* xPagecount */
+ pcache1Fetch, /* xFetch */
+ pcache1Unpin, /* xUnpin */
+ pcache1Rekey, /* xRekey */
+ pcache1Truncate, /* xTruncate */
+ pcache1Destroy /* xDestroy */
+ };
+ sqlite3_config(SQLITE_CONFIG_PCACHE, &defaultMethods);
+}
+
+#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
+/*
+** This function is called to free superfluous dynamically allocated memory
+** held by the pager system. Memory in use by any SQLite pager allocated
+** by the current thread may be sqlite3_free()ed.
+**
+** nReq is the number of bytes of memory required. Once this much has
+** been released, the function returns. The return value is the total number
+** of bytes of memory released.
+*/
+SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){
+ int nFree = 0;
+ if( pcache1.pStart==0 ){
+ PgHdr1 *p;
+ pcache1EnterMutex();
+ while( (nReq<0 || nFree<nReq) && (p=pcache1.pLruTail) ){
+ nFree += sqlite3MallocSize(PGHDR1_TO_PAGE(p));
+ pcache1PinPage(p);
+ pcache1RemoveFromHash(p);
+ pcache1FreePage(p);
+ }
+ pcache1LeaveMutex();
+ }
+ return nFree;
+}
+#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
+
+#ifdef SQLITE_TEST
+/*
+** This function is used by test procedures to inspect the internal state
+** of the global cache.
+*/
+SQLITE_PRIVATE void sqlite3PcacheStats(
+ int *pnCurrent, /* OUT: Total number of pages cached */
+ int *pnMax, /* OUT: Global maximum cache size */
+ int *pnMin, /* OUT: Sum of PCache1.nMin for purgeable caches */
+ int *pnRecyclable /* OUT: Total number of pages available for recycling */
+){
+ PgHdr1 *p;
+ int nRecyclable = 0;
+ for(p=pcache1.pLruHead; p; p=p->pLruNext){
+ nRecyclable++;
+ }
+ *pnCurrent = pcache1.nCurrentPage;
+ *pnMax = pcache1.nMaxPage;
+ *pnMin = pcache1.nMinPage;
+ *pnRecyclable = nRecyclable;
+}
+#endif
+
+/************** End of pcache1.c *********************************************/
+/************** Begin file rowset.c ******************************************/
+/*
+** 2008 December 3
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This module implements an object we call a "RowSet".
+**
+** The RowSet object is a collection of rowids. Rowids
+** are inserted into the RowSet in an arbitrary order. Inserts
+** can be intermixed with tests to see if a given rowid has been
+** previously inserted into the RowSet.
+**
+** After all inserts are finished, it is possible to extract the
+** elements of the RowSet in sorted order. Once this extraction
+** process has started, no new elements may be inserted.
+**
+** Hence, the primitive operations for a RowSet are:
+**
+** CREATE
+** INSERT
+** TEST
+** SMALLEST
+** DESTROY
+**
+** The CREATE and DESTROY primitives are the constructor and destructor,
+** obviously. The INSERT primitive adds a new element to the RowSet.
+** TEST checks to see if an element is already in the RowSet. SMALLEST
+** extracts the least value from the RowSet.
+**
+** The INSERT primitive might allocate additional memory. Memory is
+** allocated in chunks so most INSERTs do no allocation. There is an
+** upper bound on the size of allocated memory. No memory is freed
+** until DESTROY.
+**
+** The TEST primitive includes a "batch" number. The TEST primitive
+** will only see elements that were inserted before the last change
+** in the batch number. In other words, if an INSERT occurs between
+** two TESTs where the TESTs have the same batch nubmer, then the
+** value added by the INSERT will not be visible to the second TEST.
+** The initial batch number is zero, so if the very first TEST contains
+** a non-zero batch number, it will see all prior INSERTs.
+**
+** No INSERTs may occurs after a SMALLEST. An assertion will fail if
+** that is attempted.
+**
+** The cost of an INSERT is roughly constant. (Sometime new memory
+** has to be allocated on an INSERT.) The cost of a TEST with a new
+** batch number is O(NlogN) where N is the number of elements in the RowSet.
+** The cost of a TEST using the same batch number is O(logN). The cost
+** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST
+** primitives are constant time. The cost of DESTROY is O(N).
+**
+** There is an added cost of O(N) when switching between TEST and
+** SMALLEST primitives.
+**
+** $Id: rowset.c,v 1.7 2009/05/22 01:00:13 drh Exp $
+*/
+
+
+/*
+** Target size for allocation chunks.
+*/
+#define ROWSET_ALLOCATION_SIZE 1024
+
+/*
+** The number of rowset entries per allocation chunk.
+*/
+#define ROWSET_ENTRY_PER_CHUNK \
+ ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry))
+
+/*
+** Each entry in a RowSet is an instance of the following object.
+*/
+struct RowSetEntry {
+ i64 v; /* ROWID value for this entry */
+ struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */
+ struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */
+};
+
+/*
+** RowSetEntry objects are allocated in large chunks (instances of the
+** following structure) to reduce memory allocation overhead. The
+** chunks are kept on a linked list so that they can be deallocated
+** when the RowSet is destroyed.
+*/
+struct RowSetChunk {
+ struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */
+ struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */
+};
+
+/*
+** A RowSet in an instance of the following structure.
+**
+** A typedef of this structure if found in sqliteInt.h.
+*/
+struct RowSet {
+ struct RowSetChunk *pChunk; /* List of all chunk allocations */
+ sqlite3 *db; /* The database connection */
+ struct RowSetEntry *pEntry; /* List of entries using pRight */
+ struct RowSetEntry *pLast; /* Last entry on the pEntry list */
+ struct RowSetEntry *pFresh; /* Source of new entry objects */
+ struct RowSetEntry *pTree; /* Binary tree of entries */
+ u16 nFresh; /* Number of objects on pFresh */
+ u8 isSorted; /* True if pEntry is sorted */
+ u8 iBatch; /* Current insert batch */
+};
+
+/*
+** Turn bulk memory into a RowSet object. N bytes of memory
+** are available at pSpace. The db pointer is used as a memory context
+** for any subsequent allocations that need to occur.
+** Return a pointer to the new RowSet object.
+**
+** It must be the case that N is sufficient to make a Rowset. If not
+** an assertion fault occurs.
+**
+** If N is larger than the minimum, use the surplus as an initial
+** allocation of entries available to be filled.
+*/
+SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db, void *pSpace, unsigned int N){
+ RowSet *p;
+ assert( N >= ROUND8(sizeof(*p)) );
+ p = pSpace;
+ p->pChunk = 0;
+ p->db = db;
+ p->pEntry = 0;
+ p->pLast = 0;
+ p->pTree = 0;
+ p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p);
+ p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry));
+ p->isSorted = 1;
+ p->iBatch = 0;
+ return p;
+}
+
+/*
+** Deallocate all chunks from a RowSet. This frees all memory that
+** the RowSet has allocated over its lifetime. This routine is
+** the destructor for the RowSet.
+*/
+SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){
+ struct RowSetChunk *pChunk, *pNextChunk;
+ for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){
+ pNextChunk = pChunk->pNextChunk;
+ sqlite3DbFree(p->db, pChunk);
+ }
+ p->pChunk = 0;
+ p->nFresh = 0;
+ p->pEntry = 0;
+ p->pLast = 0;
+ p->pTree = 0;
+ p->isSorted = 1;
+}
+
+/*
+** Insert a new value into a RowSet.
+**
+** The mallocFailed flag of the database connection is set if a
+** memory allocation fails.
+*/
+SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){
+ struct RowSetEntry *pEntry; /* The new entry */
+ struct RowSetEntry *pLast; /* The last prior entry */
+ assert( p!=0 );
+ if( p->nFresh==0 ){
+ struct RowSetChunk *pNew;
+ pNew = sqlite3DbMallocRaw(p->db, sizeof(*pNew));
+ if( pNew==0 ){
+ return;
+ }
+ pNew->pNextChunk = p->pChunk;
+ p->pChunk = pNew;
+ p->pFresh = pNew->aEntry;
+ p->nFresh = ROWSET_ENTRY_PER_CHUNK;
+ }
+ pEntry = p->pFresh++;
+ p->nFresh--;
+ pEntry->v = rowid;
+ pEntry->pRight = 0;
+ pLast = p->pLast;
+ if( pLast ){
+ if( p->isSorted && rowid<=pLast->v ){
+ p->isSorted = 0;
+ }
+ pLast->pRight = pEntry;
+ }else{
+ assert( p->pEntry==0 ); /* Fires if INSERT after SMALLEST */
+ p->pEntry = pEntry;
+ }
+ p->pLast = pEntry;
+}
+
+/*
+** Merge two lists of RowSetEntry objects. Remove duplicates.
+**
+** The input lists are connected via pRight pointers and are
+** assumed to each already be in sorted order.
+*/
+static struct RowSetEntry *rowSetMerge(
+ struct RowSetEntry *pA, /* First sorted list to be merged */
+ struct RowSetEntry *pB /* Second sorted list to be merged */
+){
+ struct RowSetEntry head;
+ struct RowSetEntry *pTail;
+
+ pTail = &head;
+ while( pA && pB ){
+ assert( pA->pRight==0 || pA->v<=pA->pRight->v );
+ assert( pB->pRight==0 || pB->v<=pB->pRight->v );
+ if( pA->v<pB->v ){
+ pTail->pRight = pA;
+ pA = pA->pRight;
+ pTail = pTail->pRight;
+ }else if( pB->v<pA->v ){
+ pTail->pRight = pB;
+ pB = pB->pRight;
+ pTail = pTail->pRight;
+ }else{
+ pA = pA->pRight;
+ }
+ }
+ if( pA ){
+ assert( pA->pRight==0 || pA->v<=pA->pRight->v );
+ pTail->pRight = pA;
+ }else{
+ assert( pB==0 || pB->pRight==0 || pB->v<=pB->pRight->v );
+ pTail->pRight = pB;
+ }
+ return head.pRight;
+}
+
+/*
+** Sort all elements on the pEntry list of the RowSet into ascending order.
+*/
+static void rowSetSort(RowSet *p){
+ unsigned int i;
+ struct RowSetEntry *pEntry;
+ struct RowSetEntry *aBucket[40];
+
+ assert( p->isSorted==0 );
+ memset(aBucket, 0, sizeof(aBucket));
+ while( p->pEntry ){
+ pEntry = p->pEntry;
+ p->pEntry = pEntry->pRight;
+ pEntry->pRight = 0;
+ for(i=0; aBucket[i]; i++){
+ pEntry = rowSetMerge(aBucket[i], pEntry);
+ aBucket[i] = 0;
+ }
+ aBucket[i] = pEntry;
+ }
+ pEntry = 0;
+ for(i=0; i<sizeof(aBucket)/sizeof(aBucket[0]); i++){
+ pEntry = rowSetMerge(pEntry, aBucket[i]);
+ }
+ p->pEntry = pEntry;
+ p->pLast = 0;
+ p->isSorted = 1;
+}
+
+
+/*
+** The input, pIn, is a binary tree (or subtree) of RowSetEntry objects.
+** Convert this tree into a linked list connected by the pRight pointers
+** and return pointers to the first and last elements of the new list.
+*/
+static void rowSetTreeToList(
+ struct RowSetEntry *pIn, /* Root of the input tree */
+ struct RowSetEntry **ppFirst, /* Write head of the output list here */
+ struct RowSetEntry **ppLast /* Write tail of the output list here */
+){
+ assert( pIn!=0 );
+ if( pIn->pLeft ){
+ struct RowSetEntry *p;
+ rowSetTreeToList(pIn->pLeft, ppFirst, &p);
+ p->pRight = pIn;
+ }else{
+ *ppFirst = pIn;
+ }
+ if( pIn->pRight ){
+ rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast);
+ }else{
+ *ppLast = pIn;
+ }
+ assert( (*ppLast)->pRight==0 );
+}
+
+
+/*
+** Convert a sorted list of elements (connected by pRight) into a binary
+** tree with depth of iDepth. A depth of 1 means the tree contains a single
+** node taken from the head of *ppList. A depth of 2 means a tree with
+** three nodes. And so forth.
+**
+** Use as many entries from the input list as required and update the
+** *ppList to point to the unused elements of the list. If the input
+** list contains too few elements, then construct an incomplete tree
+** and leave *ppList set to NULL.
+**
+** Return a pointer to the root of the constructed binary tree.
+*/
+static struct RowSetEntry *rowSetNDeepTree(
+ struct RowSetEntry **ppList,
+ int iDepth
+){
+ struct RowSetEntry *p; /* Root of the new tree */
+ struct RowSetEntry *pLeft; /* Left subtree */
+ if( *ppList==0 ){
+ return 0;
+ }
+ if( iDepth==1 ){
+ p = *ppList;
+ *ppList = p->pRight;
+ p->pLeft = p->pRight = 0;
+ return p;
+ }
+ pLeft = rowSetNDeepTree(ppList, iDepth-1);
+ p = *ppList;
+ if( p==0 ){
+ return pLeft;
+ }
+ p->pLeft = pLeft;
+ *ppList = p->pRight;
+ p->pRight = rowSetNDeepTree(ppList, iDepth-1);
+ return p;
+}
+
+/*
+** Convert a sorted list of elements into a binary tree. Make the tree
+** as deep as it needs to be in order to contain the entire list.
+*/
+static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){
+ int iDepth; /* Depth of the tree so far */
+ struct RowSetEntry *p; /* Current tree root */
+ struct RowSetEntry *pLeft; /* Left subtree */
+
+ assert( pList!=0 );
+ p = pList;
+ pList = p->pRight;
+ p->pLeft = p->pRight = 0;
+ for(iDepth=1; pList; iDepth++){
+ pLeft = p;
+ p = pList;
+ pList = p->pRight;
+ p->pLeft = pLeft;
+ p->pRight = rowSetNDeepTree(&pList, iDepth);
+ }
+ return p;
+}
+
+/*
+** Convert the list in p->pEntry into a sorted list if it is not
+** sorted already. If there is a binary tree on p->pTree, then
+** convert it into a list too and merge it into the p->pEntry list.
+*/
+static void rowSetToList(RowSet *p){
+ if( !p->isSorted ){
+ rowSetSort(p);
+ }
+ if( p->pTree ){
+ struct RowSetEntry *pHead, *pTail;
+ rowSetTreeToList(p->pTree, &pHead, &pTail);
+ p->pTree = 0;
+ p->pEntry = rowSetMerge(p->pEntry, pHead);
+ }
+}
+
+/*
+** Extract the smallest element from the RowSet.
+** Write the element into *pRowid. Return 1 on success. Return
+** 0 if the RowSet is already empty.
+**
+** After this routine has been called, the sqlite3RowSetInsert()
+** routine may not be called again.
+*/
+SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){
+ rowSetToList(p);
+ if( p->pEntry ){
+ *pRowid = p->pEntry->v;
+ p->pEntry = p->pEntry->pRight;
+ if( p->pEntry==0 ){
+ sqlite3RowSetClear(p);
+ }
+ return 1;
+ }else{
+ return 0;
+ }
+}
+
+/*
+** Check to see if element iRowid was inserted into the the rowset as
+** part of any insert batch prior to iBatch. Return 1 or 0.
+*/
+SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, u8 iBatch, sqlite3_int64 iRowid){
+ struct RowSetEntry *p;
+ if( iBatch!=pRowSet->iBatch ){
+ if( pRowSet->pEntry ){
+ rowSetToList(pRowSet);
+ pRowSet->pTree = rowSetListToTree(pRowSet->pEntry);
+ pRowSet->pEntry = 0;
+ pRowSet->pLast = 0;
+ }
+ pRowSet->iBatch = iBatch;
+ }
+ p = pRowSet->pTree;
+ while( p ){
+ if( p->v<iRowid ){
+ p = p->pRight;
+ }else if( p->v>iRowid ){
+ p = p->pLeft;
+ }else{
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/************** End of rowset.c **********************************************/
/************** Begin file pager.c *******************************************/
/*
** 2001 September 15
@@ -23726,7 +31330,7 @@ bitvec_end:
** file simultaneously, or one process from reading the database while
** another is writing.
**
-** @(#) $Id: pager.c,v 1.446 2008/05/13 13:27:34 drh Exp $
+** @(#) $Id: pager.c,v 1.629 2009/08/10 17:48:57 drh Exp $
*/
#ifndef SQLITE_OMIT_DISKIO
@@ -23734,22 +31338,15 @@ bitvec_end:
** Macros for troubleshooting. Normally turned off
*/
#if 0
+int sqlite3PagerTrace=1; /* True to enable tracing */
#define sqlite3DebugPrintf printf
-#define PAGERTRACE1(X) sqlite3DebugPrintf(X)
-#define PAGERTRACE2(X,Y) sqlite3DebugPrintf(X,Y)
-#define PAGERTRACE3(X,Y,Z) sqlite3DebugPrintf(X,Y,Z)
-#define PAGERTRACE4(X,Y,Z,W) sqlite3DebugPrintf(X,Y,Z,W)
-#define PAGERTRACE5(X,Y,Z,W,V) sqlite3DebugPrintf(X,Y,Z,W,V)
+#define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; }
#else
-#define PAGERTRACE1(X)
-#define PAGERTRACE2(X,Y)
-#define PAGERTRACE3(X,Y,Z)
-#define PAGERTRACE4(X,Y,Z,W)
-#define PAGERTRACE5(X,Y,Z,W,V)
+#define PAGERTRACE(X)
#endif
/*
-** The following two macros are used within the PAGERTRACEX() macros above
+** The following two macros are used within the PAGERTRACE() macros above
** to print out file-descriptors.
**
** PAGERID() takes a pointer to a Pager struct as its argument. The
@@ -23814,303 +31411,220 @@ bitvec_end:
#define PAGER_SYNCED 5
/*
-** If the SQLITE_BUSY_RESERVED_LOCK macro is set to true at compile-time,
-** then failed attempts to get a reserved lock will invoke the busy callback.
-** This is off by default. To see why, consider the following scenario:
-**
-** Suppose thread A already has a shared lock and wants a reserved lock.
-** Thread B already has a reserved lock and wants an exclusive lock. If
-** both threads are using their busy callbacks, it might be a long time
-** be for one of the threads give up and allows the other to proceed.
-** But if the thread trying to get the reserved lock gives up quickly
-** (if it never invokes its busy callback) then the contention will be
-** resolved quickly.
+** A macro used for invoking the codec if there is one
*/
-#ifndef SQLITE_BUSY_RESERVED_LOCK
-# define SQLITE_BUSY_RESERVED_LOCK 0
+#ifdef SQLITE_HAS_CODEC
+# define CODEC1(P,D,N,X,E) \
+ if( P->xCodec && P->xCodec(P->pCodec,D,N,X)==0 ){ E; }
+# define CODEC2(P,D,N,X,E,O) \
+ if( P->xCodec==0 ){ O=(char*)D; }else \
+ if( (O=(char*)(P->xCodec(P->pCodec,D,N,X)))==0 ){ E; }
+#else
+# define CODEC1(P,D,N,X,E) /* NO-OP */
+# define CODEC2(P,D,N,X,E,O) O=(char*)D
#endif
/*
-** This macro rounds values up so that if the value is an address it
-** is guaranteed to be an address that is aligned to an 8-byte boundary.
+** The maximum allowed sector size. 64KiB. If the xSectorsize() method
+** returns a value larger than this, then MAX_SECTOR_SIZE is used instead.
+** This could conceivably cause corruption following a power failure on
+** such a system. This is currently an undocumented limit.
*/
-#define FORCE_ALIGNMENT(X) (((X)+7)&~7)
-
-typedef struct PgHdr PgHdr;
+#define MAX_SECTOR_SIZE 0x10000
/*
-** Each pager stores all currently unreferenced pages in a list sorted
-** in least-recently-used (LRU) order (i.e. the first item on the list has
-** not been referenced in a long time, the last item has been recently
-** used). An instance of this structure is included as part of each
-** pager structure for this purpose (variable Pager.lru).
+** An instance of the following structure is allocated for each active
+** savepoint and statement transaction in the system. All such structures
+** are stored in the Pager.aSavepoint[] array, which is allocated and
+** resized using sqlite3Realloc().
**
-** Additionally, if memory-management is enabled, all unreferenced pages
-** are stored in a global LRU list (global variable sqlite3LruPageList).
-**
-** In both cases, the PagerLruList.pFirstSynced variable points to
-** the first page in the corresponding list that does not require an
-** fsync() operation before its memory can be reclaimed. If no such
-** page exists, PagerLruList.pFirstSynced is set to NULL.
-*/
-typedef struct PagerLruList PagerLruList;
-struct PagerLruList {
- PgHdr *pFirst; /* First page in LRU list */
- PgHdr *pLast; /* Last page in LRU list (the most recently used) */
- PgHdr *pFirstSynced; /* First page in list with PgHdr.needSync==0 */
-};
-
-/*
-** The following structure contains the next and previous pointers used
-** to link a PgHdr structure into a PagerLruList linked list.
+** When a savepoint is created, the PagerSavepoint.iHdrOffset field is
+** set to 0. If a journal-header is written into the main journal while
+** the savepoint is active, then iHdrOffset is set to the byte offset
+** immediately following the last journal record written into the main
+** journal before the journal-header. This is required during savepoint
+** rollback (see pagerPlaybackSavepoint()).
*/
-typedef struct PagerLruLink PagerLruLink;
-struct PagerLruLink {
- PgHdr *pNext;
- PgHdr *pPrev;
+typedef struct PagerSavepoint PagerSavepoint;
+struct PagerSavepoint {
+ i64 iOffset; /* Starting offset in main journal */
+ i64 iHdrOffset; /* See above */
+ Bitvec *pInSavepoint; /* Set of pages in this savepoint */
+ Pgno nOrig; /* Original number of pages in file */
+ Pgno iSubRec; /* Index of first record in sub-journal */
};
/*
-** Each in-memory image of a page begins with the following header.
-** This header is only visible to this pager module. The client
-** code that calls pager sees only the data that follows the header.
+** A open page cache is an instance of the following structure.
+**
+** errCode
**
-** Client code should call sqlite3PagerWrite() on a page prior to making
-** any modifications to that page. The first time sqlite3PagerWrite()
-** is called, the original page contents are written into the rollback
-** journal and PgHdr.inJournal and PgHdr.needSync are set. Later, once
-** the journal page has made it onto the disk surface, PgHdr.needSync
-** is cleared. The modified page cannot be written back into the original
-** database file until the journal pages has been synced to disk and the
-** PgHdr.needSync has been cleared.
+** Pager.errCode may be set to SQLITE_IOERR, SQLITE_CORRUPT, or
+** or SQLITE_FULL. Once one of the first three errors occurs, it persists
+** and is returned as the result of every major pager API call. The
+** SQLITE_FULL return code is slightly different. It persists only until the
+** next successful rollback is performed on the pager cache. Also,
+** SQLITE_FULL does not affect the sqlite3PagerGet() and sqlite3PagerLookup()
+** APIs, they may still be used successfully.
**
-** The PgHdr.dirty flag is set when sqlite3PagerWrite() is called and
-** is cleared again when the page content is written back to the original
-** database file.
+** dbSizeValid, dbSize, dbOrigSize, dbFileSize
**
-** Details of important structure elements:
+** Managing the size of the database file in pages is a little complicated.
+** The variable Pager.dbSize contains the number of pages that the database
+** image currently contains. As the database image grows or shrinks this
+** variable is updated. The variable Pager.dbFileSize contains the number
+** of pages in the database file. This may be different from Pager.dbSize
+** if some pages have been appended to the database image but not yet written
+** out from the cache to the actual file on disk. Or if the image has been
+** truncated by an incremental-vacuum operation. The Pager.dbOrigSize variable
+** contains the number of pages in the database image when the current
+** transaction was opened. The contents of all three of these variables is
+** only guaranteed to be correct if the boolean Pager.dbSizeValid is true.
+**
+** TODO: Under what conditions is dbSizeValid set? Cleared?
+**
+** changeCountDone
+**
+** This boolean variable is used to make sure that the change-counter
+** (the 4-byte header field at byte offset 24 of the database file) is
+** not updated more often than necessary.
+**
+** It is set to true when the change-counter field is updated, which
+** can only happen if an exclusive lock is held on the database file.
+** It is cleared (set to false) whenever an exclusive lock is
+** relinquished on the database file. Each time a transaction is committed,
+** The changeCountDone flag is inspected. If it is true, the work of
+** updating the change-counter is omitted for the current transaction.
+**
+** This mechanism means that when running in exclusive mode, a connection
+** need only update the change-counter once, for the first transaction
+** committed.
+**
+** dbModified
+**
+** The dbModified flag is set whenever a database page is dirtied.
+** It is cleared at the end of each transaction.
+**
+** It is used when committing or otherwise ending a transaction. If
+** the dbModified flag is clear then less work has to be done.
+**
+** journalStarted
+**
+** This flag is set whenever the the main journal is synced.
+**
+** The point of this flag is that it must be set after the
+** first journal header in a journal file has been synced to disk.
+** After this has happened, new pages appended to the database
+** do not need the PGHDR_NEED_SYNC flag set, as they do not need
+** to wait for a journal sync before they can be written out to
+** the database file (see function pager_write()).
+**
+** setMaster
+**
+** This variable is used to ensure that the master journal file name
+** (if any) is only written into the journal file once.
+**
+** When committing a transaction, the master journal file name (if any)
+** may be written into the journal file while the pager is still in
+** PAGER_RESERVED state (see CommitPhaseOne() for the action). It
+** then attempts to upgrade to an exclusive lock. If this attempt
+** fails, then SQLITE_BUSY may be returned to the user and the user
+** may attempt to commit the transaction again later (calling
+** CommitPhaseOne() again). This flag is used to ensure that the
+** master journal name is only written to the journal file the first
+** time CommitPhaseOne() is called.
+**
+** doNotSync
+**
+** This variable is set and cleared by sqlite3PagerWrite().
**
** needSync
**
-** If this is true, this means that it is not safe to write the page
-** content to the database because the original content needed
-** for rollback has not by synced to the main rollback journal.
-** The original content may have been written to the rollback journal
-** but it has not yet been synced. So we cannot write to the database
-** file because power failure might cause the page in the journal file
-** to never reach the disk. It is as if the write to the journal file
-** does not occur until the journal file is synced.
-**
-** This flag is false if the page content exactly matches what
-** currently exists in the database file. The needSync flag is also
-** false if the original content has been written to the main rollback
-** journal and synced. If the page represents a new page that has
-** been added onto the end of the database during the current
-** transaction, the needSync flag is true until the original database
-** size in the journal header has been synced to disk.
-**
-** inJournal
-**
-** This is true if the original page has been written into the main
-** rollback journal. This is always false for new pages added to
-** the end of the database file during the current transaction.
-** And this flag says nothing about whether or not the journal
-** has been synced to disk. For pages that are in the original
-** database file, the following expression should always be true:
-**
-** inJournal = sqlite3BitvecTest(pPager->pInJournal, pgno)
-**
-** The pPager->pInJournal object is only valid for the original
-** pages of the database, not new pages that are added to the end
-** of the database, so obviously the above expression cannot be
-** valid for new pages. For new pages inJournal is always 0.
-**
-** dirty
-**
-** When true, this means that the content of the page has been
-** modified and needs to be written back to the database file.
-** If false, it means that either the content of the page is
-** unchanged or else the content is unimportant and we do not
-** care whether or not it is preserved.
-**
-** alwaysRollback
-**
-** This means that the sqlite3PagerDontRollback() API should be
-** ignored for this page. The DontRollback() API attempts to say
-** that the content of the page on disk is unimportant (it is an
-** unused page on the freelist) so that it is unnecessary to
-** rollback changes to this page because the content of the page
-** can change without changing the meaning of the database. This
-** flag overrides any DontRollback() attempt. This flag is set
-** when a page that originally contained valid data is added to
-** the freelist. Later in the same transaction, this page might
-** be pulled from the freelist and reused for something different
-** and at that point the DontRollback() API will be called because
-** pages taken from the freelist do not need to be protected by
-** the rollback journal. But this flag says that the page was
-** not originally part of the freelist so that it still needs to
-** be rolled back in spite of any subsequent DontRollback() calls.
-**
-** needRead
-**
-** This flag means (when true) that the content of the page has
-** not yet been loaded from disk. The in-memory content is just
-** garbage. (Actually, we zero the content, but you should not
-** make any assumptions about the content nevertheless.) If the
-** content is needed in the future, it should be read from the
-** original database file.
-*/
-struct PgHdr {
- Pager *pPager; /* The pager to which this page belongs */
- Pgno pgno; /* The page number for this page */
- PgHdr *pNextHash, *pPrevHash; /* Hash collision chain for PgHdr.pgno */
- PagerLruLink free; /* Next and previous free pages */
- PgHdr *pNextAll; /* A list of all pages */
- u8 inJournal; /* TRUE if has been written to journal */
- u8 dirty; /* TRUE if we need to write back changes */
- u8 needSync; /* Sync journal before writing this page */
- u8 alwaysRollback; /* Disable DontRollback() for this page */
- u8 needRead; /* Read content if PagerWrite() is called */
- short int nRef; /* Number of users of this page */
- PgHdr *pDirty, *pPrevDirty; /* Dirty pages */
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- PagerLruLink gfree; /* Global list of nRef==0 pages */
-#endif
-#ifdef SQLITE_CHECK_PAGES
- u32 pageHash;
-#endif
- void *pData; /* Page data */
- /* Pager.nExtra bytes of local data appended to this header */
-};
-
-/*
-** For an in-memory only database, some extra information is recorded about
-** each page so that changes can be rolled back. (Journal files are not
-** used for in-memory databases.) The following information is added to
-** the end of every EXTRA block for in-memory databases.
+** TODO: It might be easier to set this variable in writeJournalHdr()
+** and writeMasterJournal() only. Change its meaning to "unsynced data
+** has been written to the journal".
**
-** This information could have been added directly to the PgHdr structure.
-** But then it would take up an extra 8 bytes of storage on every PgHdr
-** even for disk-based databases. Splitting it out saves 8 bytes. This
-** is only a savings of 0.8% but those percentages add up.
-*/
-typedef struct PgHistory PgHistory;
-struct PgHistory {
- u8 *pOrig; /* Original page text. Restore to this on a full rollback */
- u8 *pStmt; /* Text as it was at the beginning of the current statement */
- PgHdr *pNextStmt, *pPrevStmt; /* List of pages in the statement journal */
- u8 inStmt; /* TRUE if in the statement subjournal */
-};
-
-/*
-** A macro used for invoking the codec if there is one
-*/
-#ifdef SQLITE_HAS_CODEC
-# define CODEC1(P,D,N,X) if( P->xCodec!=0 ){ P->xCodec(P->pCodecArg,D,N,X); }
-# define CODEC2(P,D,N,X) ((char*)(P->xCodec!=0?P->xCodec(P->pCodecArg,D,N,X):D))
-#else
-# define CODEC1(P,D,N,X) /* NO-OP */
-# define CODEC2(P,D,N,X) ((char*)D)
-#endif
-
-/*
-** Convert a pointer to a PgHdr into a pointer to its data
-** and back again.
-*/
-#define PGHDR_TO_DATA(P) ((P)->pData)
-#define PGHDR_TO_EXTRA(G,P) ((void*)&((G)[1]))
-#define PGHDR_TO_HIST(P,PGR) \
- ((PgHistory*)&((char*)(&(P)[1]))[(PGR)->nExtra])
-
-/*
-** A open page cache is an instance of the following structure.
+** subjInMemory
**
-** Pager.errCode may be set to SQLITE_IOERR, SQLITE_CORRUPT, or
-** or SQLITE_FULL. Once one of the first three errors occurs, it persists
-** and is returned as the result of every major pager API call. The
-** SQLITE_FULL return code is slightly different. It persists only until the
-** next successful rollback is performed on the pager cache. Also,
-** SQLITE_FULL does not affect the sqlite3PagerGet() and sqlite3PagerLookup()
-** APIs, they may still be used successfully.
+** This is a boolean variable. If true, then any required sub-journal
+** is opened as an in-memory journal file. If false, then in-memory
+** sub-journals are only used for in-memory pager files.
*/
struct Pager {
sqlite3_vfs *pVfs; /* OS functions to use for IO */
- u8 journalOpen; /* True if journal file descriptors is valid */
- u8 journalStarted; /* True if header of journal is synced */
+ u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */
+ u8 journalMode; /* On of the PAGER_JOURNALMODE_* values */
u8 useJournal; /* Use a rollback journal on this file */
u8 noReadlock; /* Do not bother to obtain readlocks */
- u8 stmtOpen; /* True if the statement subjournal is open */
- u8 stmtInUse; /* True we are in a statement subtransaction */
- u8 stmtAutoopen; /* Open stmt journal when main journal is opened*/
u8 noSync; /* Do not sync the journal if true */
u8 fullSync; /* Do extra syncs of the journal for robustness */
u8 sync_flags; /* One of SYNC_NORMAL or SYNC_FULL */
- u8 state; /* PAGER_UNLOCK, _SHARED, _RESERVED, etc. */
u8 tempFile; /* zFilename is a temporary file */
u8 readOnly; /* True for a read-only database */
- u8 needSync; /* True if an fsync() is needed on the journal */
- u8 dirtyCache; /* True if cached pages have changed */
- u8 alwaysRollback; /* Disable DontRollback() for all pages */
u8 memDb; /* True to inhibit all file I/O */
- u8 setMaster; /* True if a m-j name has been written to jrnl */
- u8 doNotSync; /* Boolean. While true, do not spill the cache */
- u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */
- u8 journalMode; /* On of the PAGER_JOURNALMODE_* values */
+
+ /* The following block contains those class members that are dynamically
+ ** modified during normal operations. The other variables in this structure
+ ** are either constant throughout the lifetime of the pager, or else
+ ** used to store configuration parameters that affect the way the pager
+ ** operates.
+ **
+ ** The 'state' variable is described in more detail along with the
+ ** descriptions of the values it may take - PAGER_UNLOCK etc. Many of the
+ ** other variables in this block are described in the comment directly
+ ** above this class definition.
+ */
+ u8 state; /* PAGER_UNLOCK, _SHARED, _RESERVED, etc. */
u8 dbModified; /* True if there are any changes to the Db */
+ u8 needSync; /* True if an fsync() is needed on the journal */
+ u8 journalStarted; /* True if header of journal is synced */
u8 changeCountDone; /* Set after incrementing the change-counter */
- u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */
+ u8 setMaster; /* True if a m-j name has been written to jrnl */
+ u8 doNotSync; /* Boolean. While true, do not spill the cache */
+ u8 dbSizeValid; /* Set when dbSize is correct */
+ u8 subjInMemory; /* True to use in-memory sub-journals */
+ Pgno dbSize; /* Number of pages in the database */
+ Pgno dbOrigSize; /* dbSize before the current transaction */
+ Pgno dbFileSize; /* Number of pages in the database file */
int errCode; /* One of several kinds of errors */
- int dbSize; /* Number of pages in the file */
- int origDbSize; /* dbSize before the current change */
- int stmtSize; /* Size of database (in pages) at stmt_begin() */
- int nRec; /* Number of pages written to the journal */
+ int nRec; /* Pages journalled since last j-header written */
u32 cksumInit; /* Quasi-random value added to every checksum */
- int stmtNRec; /* Number of records in stmt subjournal */
- int nExtra; /* Add this many bytes to each in-memory page */
+ u32 nSubRec; /* Number of records written to sub-journal */
+ Bitvec *pInJournal; /* One bit for each page in the database file */
+ sqlite3_file *fd; /* File descriptor for database */
+ sqlite3_file *jfd; /* File descriptor for main journal */
+ sqlite3_file *sjfd; /* File descriptor for sub-journal */
+ i64 journalOff; /* Current write offset in the journal file */
+ i64 journalHdr; /* Byte offset to previous journal header */
+ PagerSavepoint *aSavepoint; /* Array of active savepoints */
+ int nSavepoint; /* Number of elements in aSavepoint[] */
+ char dbFileVers[16]; /* Changes whenever database file changes */
+ u32 sectorSize; /* Assumed sector size during rollback */
+
+ u16 nExtra; /* Add this many bytes to each in-memory page */
+ i16 nReserve; /* Number of unused bytes at end of each page */
+ u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */
int pageSize; /* Number of bytes in a page */
- int nPage; /* Total number of in-memory pages */
- int nRef; /* Number of in-memory pages with PgHdr.nRef>0 */
- int mxPage; /* Maximum number of pages to hold in cache */
Pgno mxPgno; /* Maximum allowed size of the database */
- Bitvec *pInJournal; /* One bit for each page in the database file */
- Bitvec *pInStmt; /* One bit for each page in the database */
char *zFilename; /* Name of the database file */
char *zJournal; /* Name of the journal file */
- char *zDirectory; /* Directory hold database and journal files */
- char *zStmtJrnl; /* Name of the statement journal file */
- sqlite3_file *fd, *jfd; /* File descriptors for database and journal */
- sqlite3_file *stfd; /* File descriptor for the statement subjournal*/
- BusyHandler *pBusyHandler; /* Pointer to sqlite.busyHandler */
- PagerLruList lru; /* LRU list of free pages */
- PgHdr *pAll; /* List of all pages */
- PgHdr *pStmt; /* List of pages in the statement subjournal */
- PgHdr *pDirty; /* List of all dirty pages */
- i64 journalOff; /* Current byte offset in the journal file */
- i64 journalHdr; /* Byte offset to previous journal header */
- i64 stmtHdrOff; /* First journal header written this statement */
- i64 stmtCksum; /* cksumInit when statement was started */
- i64 stmtJSize; /* Size of journal at stmt_begin() */
- int sectorSize; /* Assumed sector size during rollback */
+ int (*xBusyHandler)(void*); /* Function to call when busy */
+ void *pBusyHandlerArg; /* Context argument for xBusyHandler */
#ifdef SQLITE_TEST
int nHit, nMiss; /* Cache hits and missing */
int nRead, nWrite; /* Database pages read/written */
#endif
- void (*xDestructor)(DbPage*,int); /* Call this routine when freeing pages */
- void (*xReiniter)(DbPage*,int); /* Call this routine when reloading pages */
+ void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */
#ifdef SQLITE_HAS_CODEC
void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */
- void *pCodecArg; /* First argument to xCodec() */
-#endif
- int nHash; /* Size of the pager hash table */
- PgHdr **aHash; /* Hash table to map page number to PgHdr */
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- Pager *pNext; /* Doubly linked list of pagers on which */
- Pager *pPrev; /* sqlite3_release_memory() will work */
- int iInUseMM; /* Non-zero if unavailable to MM */
- int iInUseDB; /* Non-zero if in sqlite3_release_memory() */
+ void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */
+ void (*xCodecFree)(void*); /* Destructor for the codec */
+ void *pCodec; /* First argument to xCodec... methods */
#endif
char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */
- char dbFileVers[16]; /* Changes whenever database file changes */
+ i64 journalSizeLimit; /* Size limit for persistent journal files */
+ PCache *pPCache; /* Pointer to page cache object */
+ sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */
};
/*
@@ -24122,22 +31636,11 @@ struct Pager {
SQLITE_API int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */
SQLITE_API int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */
SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */
-SQLITE_API int sqlite3_pager_pgfree_count = 0; /* Number of cache pages freed */
# define PAGER_INCR(v) v++
#else
# define PAGER_INCR(v)
#endif
-/*
-** The following variable points to the head of a double-linked list
-** of all pagers that are eligible for page stealing by the
-** sqlite3_release_memory() interface. Access to this list is
-** protected by the SQLITE_MUTEX_STATIC_MEM2 mutex.
-*/
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
-static Pager *sqlite3PagerList = 0;
-static PagerLruList sqlite3LruPageList = {0, 0, 0};
-#endif
/*
@@ -24145,7 +31648,7 @@ static PagerLruList sqlite3LruPageList = {0, 0, 0};
** was obtained from /dev/random. It is used only as a sanity check.
**
** Since version 2.8.0, the journal format contains additional sanity
-** checking information. If the power fails while the journal is begin
+** checking information. If the power fails while the journal is being
** written, semi-random garbage data might appear in the journal
** file after power is restored. If an attempt is then made
** to roll the journal back, the database could be corrupted. The additional
@@ -24168,15 +31671,14 @@ static const unsigned char aJournalMagic[] = {
};
/*
-** The size of the header and of each page in the journal is determined
-** by the following macros.
+** The size of the of each page record in the journal is given by
+** the following macro.
*/
#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8)
/*
-** The journal header size for this pager. In the future, this could be
-** set to some value read from the disk controller. The important
-** characteristic is that it is the same size as a disk sector.
+** The journal header size for this pager. This is usually the same
+** size as a single disk sector. See also setSectorSize().
*/
#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize)
@@ -24193,231 +31695,55 @@ static const unsigned char aJournalMagic[] = {
#endif
/*
-** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is
-** reserved for working around a windows/posix incompatibility). It is
-** used in the journal to signify that the remainder of the journal file
-** is devoted to storing a master journal name - there are no more pages to
-** roll back. See comments for function writeMasterJournal() for details.
-*/
-/* #define PAGER_MJ_PGNO(x) (PENDING_BYTE/((x)->pageSize)) */
-#define PAGER_MJ_PGNO(x) ((PENDING_BYTE/((x)->pageSize))+1)
-
-/*
** The maximum legal page number is (2^31 - 1).
*/
#define PAGER_MAX_PGNO 2147483647
+#ifndef NDEBUG
/*
-** The pagerEnter() and pagerLeave() routines acquire and release
-** a mutex on each pager. The mutex is recursive.
-**
-** This is a special-purpose mutex. It only provides mutual exclusion
-** between the Btree and the Memory Management sqlite3_release_memory()
-** function. It does not prevent, for example, two Btrees from accessing
-** the same pager at the same time. Other general-purpose mutexes in
-** the btree layer handle that chore.
-*/
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- static void pagerEnter(Pager *p){
- p->iInUseDB++;
- if( p->iInUseMM && p->iInUseDB==1 ){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex;
- mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2);
-#endif
- p->iInUseDB = 0;
- sqlite3_mutex_enter(mutex);
- p->iInUseDB = 1;
- sqlite3_mutex_leave(mutex);
- }
- assert( p->iInUseMM==0 );
- }
- static void pagerLeave(Pager *p){
- p->iInUseDB--;
- assert( p->iInUseDB>=0 );
- }
-#else
-# define pagerEnter(X)
-# define pagerLeave(X)
-#endif
-
-/*
-** Add page pPg to the end of the linked list managed by structure
-** pList (pPg becomes the last entry in the list - the most recently
-** used). Argument pLink should point to either pPg->free or pPg->gfree,
-** depending on whether pPg is being added to the pager-specific or
-** global LRU list.
-*/
-static void listAdd(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){
- pLink->pNext = 0;
- pLink->pPrev = pList->pLast;
-
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- assert(pLink==&pPg->free || pLink==&pPg->gfree);
- assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList);
-#endif
-
- if( pList->pLast ){
- int iOff = (char *)pLink - (char *)pPg;
- PagerLruLink *pLastLink = (PagerLruLink *)(&((u8 *)pList->pLast)[iOff]);
- pLastLink->pNext = pPg;
- }else{
- assert(!pList->pFirst);
- pList->pFirst = pPg;
- }
-
- pList->pLast = pPg;
- if( !pList->pFirstSynced && pPg->needSync==0 ){
- pList->pFirstSynced = pPg;
- }
-}
-
-/*
-** Remove pPg from the list managed by the structure pointed to by pList.
+** Usage:
**
-** Argument pLink should point to either pPg->free or pPg->gfree, depending
-** on whether pPg is being added to the pager-specific or global LRU list.
+** assert( assert_pager_state(pPager) );
*/
-static void listRemove(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){
- int iOff = (char *)pLink - (char *)pPg;
-
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- assert(pLink==&pPg->free || pLink==&pPg->gfree);
- assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList);
-#endif
+static int assert_pager_state(Pager *pPager){
- if( pPg==pList->pFirst ){
- pList->pFirst = pLink->pNext;
- }
- if( pPg==pList->pLast ){
- pList->pLast = pLink->pPrev;
- }
- if( pLink->pPrev ){
- PagerLruLink *pPrevLink = (PagerLruLink *)(&((u8 *)pLink->pPrev)[iOff]);
- pPrevLink->pNext = pLink->pNext;
- }
- if( pLink->pNext ){
- PagerLruLink *pNextLink = (PagerLruLink *)(&((u8 *)pLink->pNext)[iOff]);
- pNextLink->pPrev = pLink->pPrev;
- }
- if( pPg==pList->pFirstSynced ){
- PgHdr *p = pLink->pNext;
- while( p && p->needSync ){
- PagerLruLink *pL = (PagerLruLink *)(&((u8 *)p)[iOff]);
- p = pL->pNext;
- }
- pList->pFirstSynced = p;
- }
+ /* A temp-file is always in PAGER_EXCLUSIVE or PAGER_SYNCED state. */
+ assert( pPager->tempFile==0 || pPager->state>=PAGER_EXCLUSIVE );
- pLink->pNext = pLink->pPrev = 0;
-}
+ /* The changeCountDone flag is always set for temp-files */
+ assert( pPager->tempFile==0 || pPager->changeCountDone );
-/*
-** Add page pPg to the list of free pages for the pager. If
-** memory-management is enabled, also add the page to the global
-** list of free pages.
-*/
-static void lruListAdd(PgHdr *pPg){
- listAdd(&pPg->pPager->lru, &pPg->free, pPg);
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- if( !pPg->pPager->memDb ){
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- listAdd(&sqlite3LruPageList, &pPg->gfree, pPg);
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- }
-#endif
-}
-
-/*
-** Remove page pPg from the list of free pages for the associated pager.
-** If memory-management is enabled, also remove pPg from the global list
-** of free pages.
-*/
-static void lruListRemove(PgHdr *pPg){
- listRemove(&pPg->pPager->lru, &pPg->free, pPg);
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- if( !pPg->pPager->memDb ){
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- listRemove(&sqlite3LruPageList, &pPg->gfree, pPg);
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- }
-#endif
+ return 1;
}
-
-/*
-** This function is called just after the needSync flag has been cleared
-** from all pages managed by pPager (usually because the journal file
-** has just been synced). It updates the pPager->lru.pFirstSynced variable
-** and, if memory-management is enabled, the sqlite3LruPageList.pFirstSynced
-** variable also.
-*/
-static void lruListSetFirstSynced(Pager *pPager){
- pPager->lru.pFirstSynced = pPager->lru.pFirst;
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- if( !pPager->memDb ){
- PgHdr *p;
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- for(p=sqlite3LruPageList.pFirst; p && p->needSync; p=p->gfree.pNext);
- assert(p==pPager->lru.pFirstSynced || p==sqlite3LruPageList.pFirstSynced);
- sqlite3LruPageList.pFirstSynced = p;
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- }
#endif
-}
/*
-** Return true if page *pPg has already been written to the statement
-** journal (or statement snapshot has been created, if *pPg is part
-** of an in-memory database).
+** Return true if it is necessary to write page *pPg into the sub-journal.
+** A page needs to be written into the sub-journal if there exists one
+** or more open savepoints for which:
+**
+** * The page-number is less than or equal to PagerSavepoint.nOrig, and
+** * The bit corresponding to the page-number is not set in
+** PagerSavepoint.pInSavepoint.
*/
-static int pageInStatement(PgHdr *pPg){
+static int subjRequiresPage(PgHdr *pPg){
+ Pgno pgno = pPg->pgno;
Pager *pPager = pPg->pPager;
- if( MEMDB ){
- return PGHDR_TO_HIST(pPg, pPager)->inStmt;
- }else{
- return sqlite3BitvecTest(pPager->pInStmt, pPg->pgno);
+ int i;
+ for(i=0; i<pPager->nSavepoint; i++){
+ PagerSavepoint *p = &pPager->aSavepoint[i];
+ if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){
+ return 1;
+ }
}
+ return 0;
}
/*
-** Change the size of the pager hash table to N. N must be a power
-** of two.
+** Return true if the page is already in the journal file.
*/
-static void pager_resize_hash_table(Pager *pPager, int N){
- PgHdr **aHash, *pPg;
- assert( N>0 && (N&(N-1))==0 );
-#ifdef SQLITE_MALLOC_SOFT_LIMIT
- if( N*sizeof(aHash[0])>SQLITE_MALLOC_SOFT_LIMIT ){
- N = SQLITE_MALLOC_SOFT_LIMIT/sizeof(aHash[0]);
- }
- if( N==pPager->nHash ) return;
-#endif
- pagerLeave(pPager);
- if( pPager->aHash!=0 ) sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC);
- aHash = sqlite3MallocZero( sizeof(aHash[0])*N );
- if( pPager->aHash!=0 ) sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC);
- pagerEnter(pPager);
- if( aHash==0 ){
- /* Failure to rehash is not an error. It is only a performance hit. */
- return;
- }
- sqlite3_free(pPager->aHash);
- pPager->nHash = N;
- pPager->aHash = aHash;
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- int h;
- if( pPg->pgno==0 ){
- assert( pPg->pNextHash==0 && pPg->pPrevHash==0 );
- continue;
- }
- h = pPg->pgno & (N-1);
- pPg->pNextHash = aHash[h];
- if( aHash[h] ){
- aHash[h]->pPrevHash = pPg;
- }
- aHash[h] = pPg;
- pPg->pPrevHash = 0;
- }
+static int pageInJournal(PgHdr *pPg){
+ return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno);
}
/*
@@ -24452,10 +31778,24 @@ static int write32bits(sqlite3_file *fd, i64 offset, u32 val){
}
/*
+** The argument to this macro is a file descriptor (type sqlite3_file*).
+** Return 0 if it is not open, or non-zero (but not 1) if it is.
+**
+** This is so that expressions can be written as:
+**
+** if( isOpen(pPager->jfd) ){ ...
+**
+** instead of
+**
+** if( pPager->jfd->pMethods ){ ...
+*/
+#define isOpen(pFd) ((pFd)->pMethods)
+
+/*
** If file pFd is open, call sqlite3OsUnlock() on it.
*/
static int osUnlock(sqlite3_file *pFd, int eLock){
- if( !pFd->pMethods ){
+ if( !isOpen(pFd) ){
return SQLITE_OK;
}
return sqlite3OsUnlock(pFd, eLock);
@@ -24470,76 +31810,39 @@ static int osUnlock(sqlite3_file *pFd, int eLock){
** (b) the value returned by OsSectorSize() is less than or equal
** to the page size.
**
+** The optimization is also always enabled for temporary files. It is
+** an error to call this function if pPager is opened on an in-memory
+** database.
+**
** If the optimization cannot be used, 0 is returned. If it can be used,
** then the value returned is the size of the journal file when it
** contains rollback data for exactly one page.
*/
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
static int jrnlBufferSize(Pager *pPager){
- int dc; /* Device characteristics */
- int nSector; /* Sector size */
- int nPage; /* Page size */
- sqlite3_file *fd = pPager->fd;
-
- if( fd->pMethods ){
- dc = sqlite3OsDeviceCharacteristics(fd);
- nSector = sqlite3OsSectorSize(fd);
- nPage = pPager->pageSize;
+ assert( !MEMDB );
+ if( !pPager->tempFile ){
+ int dc; /* Device characteristics */
+ int nSector; /* Sector size */
+ int szPage; /* Page size */
+
+ assert( isOpen(pPager->fd) );
+ dc = sqlite3OsDeviceCharacteristics(pPager->fd);
+ nSector = pPager->sectorSize;
+ szPage = pPager->pageSize;
+
+ assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
+ assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
+ if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){
+ return 0;
+ }
}
- assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
- assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
-
- if( !fd->pMethods || (dc&(SQLITE_IOCAP_ATOMIC|(nPage>>8))&&nSector<=nPage) ){
- return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
- }
- return 0;
+ return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
}
#endif
/*
-** This function should be called when an error occurs within the pager
-** code. The first argument is a pointer to the pager structure, the
-** second the error-code about to be returned by a pager API function.
-** The value returned is a copy of the second argument to this function.
-**
-** If the second argument is SQLITE_IOERR, SQLITE_CORRUPT, or SQLITE_FULL
-** the error becomes persistent. Until the persisten error is cleared,
-** subsequent API calls on this Pager will immediately return the same
-** error code.
-**
-** A persistent error indicates that the contents of the pager-cache
-** cannot be trusted. This state can be cleared by completely discarding
-** the contents of the pager-cache. If a transaction was active when
-** the persistent error occured, then the rollback journal may need
-** to be replayed.
-*/
-static void pager_unlock(Pager *pPager);
-static int pager_error(Pager *pPager, int rc){
- int rc2 = rc & 0xff;
- assert(
- pPager->errCode==SQLITE_FULL ||
- pPager->errCode==SQLITE_OK ||
- (pPager->errCode & 0xff)==SQLITE_IOERR
- );
- if(
- rc2==SQLITE_FULL ||
- rc2==SQLITE_IOERR ||
- rc2==SQLITE_CORRUPT
- ){
- pPager->errCode = rc;
- if( pPager->state==PAGER_UNLOCK && pPager->nRef==0 ){
- /* If the pager is already unlocked, call pager_unlock() now to
- ** clear the error state and ensure that the pager-cache is
- ** completely empty.
- */
- pager_unlock(pPager);
- }
- }
- return rc;
-}
-
-/*
** If SQLITE_CHECK_PAGES is defined then we do some sanity checking
** on the cache using a hash function. This is used for testing
** and debugging only.
@@ -24557,8 +31860,10 @@ static u32 pager_datahash(int nByte, unsigned char *pData){
return hash;
}
static u32 pager_pagehash(PgHdr *pPage){
- return pager_datahash(pPage->pPager->pageSize,
- (unsigned char *)PGHDR_TO_DATA(pPage));
+ return pager_datahash(pPage->pPager->pageSize, (unsigned char *)pPage->pData);
+}
+static void pager_set_pagehash(PgHdr *pPage){
+ pPage->pageHash = pager_pagehash(pPage);
}
/*
@@ -24569,20 +31874,22 @@ static u32 pager_pagehash(PgHdr *pPage){
#define CHECK_PAGE(x) checkPage(x)
static void checkPage(PgHdr *pPg){
Pager *pPager = pPg->pPager;
- assert( !pPg->pageHash || pPager->errCode || MEMDB || pPg->dirty ||
- pPg->pageHash==pager_pagehash(pPg) );
+ assert( !pPg->pageHash || pPager->errCode
+ || (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) );
}
#else
#define pager_datahash(X,Y) 0
#define pager_pagehash(X) 0
#define CHECK_PAGE(x)
-#endif
+#endif /* SQLITE_CHECK_PAGES */
/*
** When this is called the journal file for pager pPager must be open.
-** The master journal file name is read from the end of the file and
-** written into memory supplied by the caller.
+** This function attempts to read a master journal file name from the
+** end of the file and, if successful, copies it into memory supplied
+** by the caller. See comments above writeMasterJournal() for the format
+** used to store a master journal file name at the end of a journal file.
**
** zMaster must point to a buffer of at least nMaster bytes allocated by
** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is
@@ -24591,73 +31898,71 @@ static void checkPage(PgHdr *pPg){
** nul-terminator), then this is handled as if no master journal name
** were present in the journal.
**
-** If no master journal file name is present zMaster[0] is set to 0 and
-** SQLITE_OK returned.
+** If a master journal file name is present at the end of the journal
+** file, then it is copied into the buffer pointed to by zMaster. A
+** nul-terminator byte is appended to the buffer following the master
+** journal file name.
+**
+** If it is determined that no master journal file name is present
+** zMaster[0] is set to 0 and SQLITE_OK returned.
+**
+** If an error occurs while reading from the journal file, an SQLite
+** error code is returned.
*/
-static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, int nMaster){
- int rc;
- u32 len;
- i64 szJ;
- u32 cksum;
- int i;
- unsigned char aMagic[8]; /* A buffer to hold the magic header */
-
+static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){
+ int rc; /* Return code */
+ u32 len; /* Length in bytes of master journal name */
+ i64 szJ; /* Total size in bytes of journal file pJrnl */
+ u32 cksum; /* MJ checksum value read from journal */
+ u32 u; /* Unsigned loop counter */
+ unsigned char aMagic[8]; /* A buffer to hold the magic header */
zMaster[0] = '\0';
- rc = sqlite3OsFileSize(pJrnl, &szJ);
- if( rc!=SQLITE_OK || szJ<16 ) return rc;
-
- rc = read32bits(pJrnl, szJ-16, &len);
- if( rc!=SQLITE_OK ) return rc;
-
- if( len>=nMaster ){
- return SQLITE_OK;
- }
-
- rc = read32bits(pJrnl, szJ-12, &cksum);
- if( rc!=SQLITE_OK ) return rc;
-
- rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8);
- if( rc!=SQLITE_OK || memcmp(aMagic, aJournalMagic, 8) ) return rc;
-
- rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len);
- if( rc!=SQLITE_OK ){
+ if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ))
+ || szJ<16
+ || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len))
+ || len>=nMaster
+ || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum))
+ || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8))
+ || memcmp(aMagic, aJournalMagic, 8)
+ || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len))
+ ){
return rc;
}
- zMaster[len] = '\0';
/* See if the checksum matches the master journal name */
- for(i=0; i<len; i++){
- cksum -= zMaster[i];
- }
+ for(u=0; u<len; u++){
+ cksum -= zMaster[u];
+ }
if( cksum ){
/* If the checksum doesn't add up, then one or more of the disk sectors
** containing the master journal filename is corrupted. This means
** definitely roll back, so just return SQLITE_OK and report a (nul)
** master-journal filename.
*/
- zMaster[0] = '\0';
+ len = 0;
}
+ zMaster[len] = '\0';
return SQLITE_OK;
}
/*
-** Seek the journal file descriptor to the next sector boundary where a
-** journal header may be read or written. Pager.journalOff is updated with
-** the new seek offset.
+** Return the offset of the sector boundary at or immediately
+** following the value in pPager->journalOff, assuming a sector
+** size of pPager->sectorSize bytes.
**
** i.e for a sector size of 512:
**
-** Input Offset Output Offset
-** ---------------------------------------
-** 0 0
-** 512 512
-** 100 512
-** 2000 2048
+** Pager.journalOff Return value
+** ---------------------------------------
+** 0 0
+** 512 512
+** 100 512
+** 2000 2048
**
*/
-static void seekJournalHdr(Pager *pPager){
+static i64 journalHdrOffset(Pager *pPager){
i64 offset = 0;
i64 c = pPager->journalOff;
if( c ){
@@ -24666,28 +31971,60 @@ static void seekJournalHdr(Pager *pPager){
assert( offset%JOURNAL_HDR_SZ(pPager)==0 );
assert( offset>=c );
assert( (offset-c)<JOURNAL_HDR_SZ(pPager) );
- pPager->journalOff = offset;
+ return offset;
}
/*
-** Write zeros over the header of the journal file. This has the
-** effect of invalidating the journal file and committing the
-** transaction.
+** The journal file must be open when this function is called.
+**
+** This function is a no-op if the journal file has not been written to
+** within the current transaction (i.e. if Pager.journalOff==0).
+**
+** If doTruncate is non-zero or the Pager.journalSizeLimit variable is
+** set to 0, then truncate the journal file to zero bytes in size. Otherwise,
+** zero the 28-byte header at the start of the journal file. In either case,
+** if the pager is not in no-sync mode, sync the journal file immediately
+** after writing or truncating it.
+**
+** If Pager.journalSizeLimit is set to a positive, non-zero value, and
+** following the truncation or zeroing described above the size of the
+** journal file in bytes is larger than this value, then truncate the
+** journal file to Pager.journalSizeLimit bytes. The journal file does
+** not need to be synced following this operation.
+**
+** If an IO error occurs, abandon processing and return the IO error code.
+** Otherwise, return SQLITE_OK.
*/
static int zeroJournalHdr(Pager *pPager, int doTruncate){
- int rc = SQLITE_OK;
- static const char zeroHdr[28];
-
+ int rc = SQLITE_OK; /* Return code */
+ assert( isOpen(pPager->jfd) );
if( pPager->journalOff ){
+ const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */
+
IOTRACE(("JZEROHDR %p\n", pPager))
- if( doTruncate ){
+ if( doTruncate || iLimit==0 ){
rc = sqlite3OsTruncate(pPager->jfd, 0);
}else{
+ static const char zeroHdr[28] = {0};
rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0);
}
- if( rc==SQLITE_OK ){
+ if( rc==SQLITE_OK && !pPager->noSync ){
rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->sync_flags);
}
+
+ /* At this point the transaction is committed but the write lock
+ ** is still held on the file. If there is a size limit configured for
+ ** the persistent journal and the journal file currently consumes more
+ ** space than that limit allows for, truncate it now. There is no need
+ ** to sync the file following this operation.
+ */
+ if( rc==SQLITE_OK && iLimit>0 ){
+ i64 sz;
+ rc = sqlite3OsFileSize(pPager->jfd, &sz);
+ if( rc==SQLITE_OK && sz>iLimit ){
+ rc = sqlite3OsTruncate(pPager->jfd, iLimit);
+ }
+ }
}
return rc;
}
@@ -24708,23 +32045,29 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){
** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space.
*/
static int writeJournalHdr(Pager *pPager){
- int rc = SQLITE_OK;
- char *zHeader = pPager->pTmpSpace;
- int nHeader = pPager->pageSize;
- int nWrite;
+ int rc = SQLITE_OK; /* Return code */
+ char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */
+ u32 nHeader = pPager->pageSize; /* Size of buffer pointed to by zHeader */
+ u32 nWrite; /* Bytes of header sector written */
+ int ii; /* Loop counter */
+
+ assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
if( nHeader>JOURNAL_HDR_SZ(pPager) ){
nHeader = JOURNAL_HDR_SZ(pPager);
}
- if( pPager->stmtHdrOff==0 ){
- pPager->stmtHdrOff = pPager->journalOff;
+ /* If there are active savepoints and any of them were created
+ ** since the most recent journal header was written, update the
+ ** PagerSavepoint.iHdrOffset fields now.
+ */
+ for(ii=0; ii<pPager->nSavepoint; ii++){
+ if( pPager->aSavepoint[ii].iHdrOffset==0 ){
+ pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff;
+ }
}
- seekJournalHdr(pPager);
- pPager->journalHdr = pPager->journalOff;
-
- memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
+ pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager);
/*
** Write the nRec Field - the number of page records that follow this
@@ -24736,7 +32079,7 @@ static int writeJournalHdr(Pager *pPager){
** A faster alternative is to write 0xFFFFFFFF to the nRec field. When
** reading the journal this value tells SQLite to assume that the
** rest of the journal file contains valid page records. This assumption
- ** is dangerous, as if a failure occured whilst writing to the journal
+ ** is dangerous, as if a failure occurred whilst writing to the journal
** file it may contain some garbage data. There are two scenarios
** where this risk can be ignored:
**
@@ -24746,27 +32089,52 @@ static int writeJournalHdr(Pager *pPager){
** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees
** that garbage data is never appended to the journal file.
*/
- assert(pPager->fd->pMethods||pPager->noSync);
- if( (pPager->noSync)
+ assert( isOpen(pPager->fd) || pPager->noSync );
+ if( (pPager->noSync) || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY)
|| (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
){
+ memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff);
}else{
- put32bits(&zHeader[sizeof(aJournalMagic)], 0);
+ memset(zHeader, 0, sizeof(aJournalMagic)+4);
}
/* The random check-hash initialiser */
sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit);
put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit);
/* The initial database size */
- put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbSize);
+ put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize);
/* The assumed sector size for this process */
put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize);
- if( pPager->journalHdr==0 ){
- /* The page size */
- put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
- }
+ /* The page size */
+ put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
+
+ /* Initializing the tail of the buffer is not necessary. Everything
+ ** works find if the following memset() is omitted. But initializing
+ ** the memory prevents valgrind from complaining, so we are willing to
+ ** take the performance hit.
+ */
+ memset(&zHeader[sizeof(aJournalMagic)+20], 0,
+ nHeader-(sizeof(aJournalMagic)+20));
+
+ /* In theory, it is only necessary to write the 28 bytes that the
+ ** journal header consumes to the journal file here. Then increment the
+ ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next
+ ** record is written to the following sector (leaving a gap in the file
+ ** that will be implicitly filled in by the OS).
+ **
+ ** However it has been discovered that on some systems this pattern can
+ ** be significantly slower than contiguously writing data to the file,
+ ** even if that means explicitly writing data to the block of
+ ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what
+ ** is done.
+ **
+ ** The loop is required here in case the sector-size is larger than the
+ ** database page size. Since the zHeader buffer is only Pager.pageSize
+ ** bytes in size, more than one call to sqlite3OsWrite() may be required
+ ** to populate the entire journal header sector.
+ */
for(nWrite=0; rc==SQLITE_OK&&nWrite<JOURNAL_HDR_SZ(pPager); nWrite+=nHeader){
IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, nHeader))
rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff);
@@ -24779,75 +32147,118 @@ static int writeJournalHdr(Pager *pPager){
/*
** The journal file must be open when this is called. A journal header file
** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal
-** file. See comments above function writeJournalHdr() for a description of
-** the journal header format.
+** file. The current location in the journal file is given by
+** pPager->journalOff. See comments above function writeJournalHdr() for
+** a description of the journal header format.
**
-** If the header is read successfully, *nRec is set to the number of
-** page records following this header and *dbSize is set to the size of the
+** If the header is read successfully, *pNRec is set to the number of
+** page records following this header and *pDbSize is set to the size of the
** database before the transaction began, in pages. Also, pPager->cksumInit
** is set to the value read from the journal header. SQLITE_OK is returned
** in this case.
**
** If the journal header file appears to be corrupted, SQLITE_DONE is
-** returned and *nRec and *dbSize are not set. If JOURNAL_HDR_SZ bytes
+** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes
** cannot be read from the journal file an error code is returned.
*/
static int readJournalHdr(
- Pager *pPager,
- i64 journalSize,
- u32 *pNRec,
- u32 *pDbSize
+ Pager *pPager, /* Pager object */
+ int isHot,
+ i64 journalSize, /* Size of the open journal file in bytes */
+ u32 *pNRec, /* OUT: Value read from the nRec field */
+ u32 *pDbSize /* OUT: Value of original database size field */
){
- int rc;
- unsigned char aMagic[8]; /* A buffer to hold the magic header */
- i64 jrnlOff;
- int iPageSize;
+ int rc; /* Return code */
+ unsigned char aMagic[8]; /* A buffer to hold the magic header */
+ i64 iHdrOff; /* Offset of journal header being read */
+
+ assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
- seekJournalHdr(pPager);
+ /* Advance Pager.journalOff to the start of the next sector. If the
+ ** journal file is too small for there to be a header stored at this
+ ** point, return SQLITE_DONE.
+ */
+ pPager->journalOff = journalHdrOffset(pPager);
if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){
return SQLITE_DONE;
}
- jrnlOff = pPager->journalOff;
+ iHdrOff = pPager->journalOff;
- rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), jrnlOff);
- if( rc ) return rc;
- jrnlOff += sizeof(aMagic);
+ /* Read in the first 8 bytes of the journal header. If they do not match
+ ** the magic string found at the start of each journal header, return
+ ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise,
+ ** proceed.
+ */
+ if( isHot || iHdrOff!=pPager->journalHdr ){
+ rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff);
+ if( rc ){
+ return rc;
+ }
+ if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){
+ return SQLITE_DONE;
+ }
+ }
- if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){
- return SQLITE_DONE;
+ /* Read the first three 32-bit fields of the journal header: The nRec
+ ** field, the checksum-initializer and the database size at the start
+ ** of the transaction. Return an error code if anything goes wrong.
+ */
+ if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec))
+ || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit))
+ || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize))
+ ){
+ return rc;
}
- rc = read32bits(pPager->jfd, jrnlOff, pNRec);
- if( rc ) return rc;
+ if( pPager->journalOff==0 ){
+ u32 iPageSize; /* Page-size field of journal header */
+ u32 iSectorSize; /* Sector-size field of journal header */
+ u16 iPageSize16; /* Copy of iPageSize in 16-bit variable */
- rc = read32bits(pPager->jfd, jrnlOff+4, &pPager->cksumInit);
- if( rc ) return rc;
+ /* Read the page-size and sector-size journal header fields. */
+ if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize))
+ || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize))
+ ){
+ return rc;
+ }
- rc = read32bits(pPager->jfd, jrnlOff+8, pDbSize);
- if( rc ) return rc;
+ /* Check that the values read from the page-size and sector-size fields
+ ** are within range. To be 'in range', both values need to be a power
+ ** of two greater than or equal to 512, and not greater than their
+ ** respective compile time maximum limits.
+ */
+ if( iPageSize<512 || iSectorSize<512
+ || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE
+ || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0
+ ){
+ /* If the either the page-size or sector-size in the journal-header is
+ ** invalid, then the process that wrote the journal-header must have
+ ** crashed before the header was synced. In this case stop reading
+ ** the journal file here.
+ */
+ return SQLITE_DONE;
+ }
- rc = read32bits(pPager->jfd, jrnlOff+16, (u32 *)&iPageSize);
- if( rc==SQLITE_OK
- && iPageSize>=512
- && iPageSize<=SQLITE_MAX_PAGE_SIZE
- && ((iPageSize-1)&iPageSize)==0
- ){
- u16 pagesize = iPageSize;
- rc = sqlite3PagerSetPagesize(pPager, &pagesize);
+ /* Update the page-size to match the value read from the journal.
+ ** Use a testcase() macro to make sure that malloc failure within
+ ** PagerSetPagesize() is tested.
+ */
+ iPageSize16 = (u16)iPageSize;
+ rc = sqlite3PagerSetPagesize(pPager, &iPageSize16, -1);
+ testcase( rc!=SQLITE_OK );
+ assert( rc!=SQLITE_OK || iPageSize16==(u16)iPageSize );
+
+ /* Update the assumed sector-size to match the value used by
+ ** the process that created this journal. If this journal was
+ ** created by a process other than this one, then this routine
+ ** is being called from within pager_playback(). The local value
+ ** of Pager.sectorSize is restored at the end of that routine.
+ */
+ pPager->sectorSize = iSectorSize;
}
- if( rc ) return rc;
-
- /* Update the assumed sector-size to match the value used by
- ** the process that created this journal. If this journal was
- ** created by a process other than this one, then this routine
- ** is being called from within pager_playback(). The local value
- ** of Pager.sectorSize is restored at the end of that routine.
- */
- rc = read32bits(pPager->jfd, jrnlOff+12, (u32 *)&pPager->sectorSize);
- if( rc ) return rc;
pPager->journalOff += JOURNAL_HDR_SZ(pPager);
- return SQLITE_OK;
+ return rc;
}
@@ -24858,33 +32269,37 @@ static int readJournalHdr(
** journal file descriptor is advanced to the next sector boundary before
** anything is written. The format is:
**
-** + 4 bytes: PAGER_MJ_PGNO.
-** + N bytes: length of master journal name.
-** + 4 bytes: N
-** + 4 bytes: Master journal name checksum.
-** + 8 bytes: aJournalMagic[].
+** + 4 bytes: PAGER_MJ_PGNO.
+** + N bytes: Master journal filename in utf-8.
+** + 4 bytes: N (length of master journal name in bytes, no nul-terminator).
+** + 4 bytes: Master journal name checksum.
+** + 8 bytes: aJournalMagic[].
**
** The master journal page checksum is the sum of the bytes in the master
-** journal name.
+** journal name, where each byte is interpreted as a signed 8-bit integer.
**
** If zMaster is a NULL pointer (occurs for a single database transaction),
** this call is a no-op.
*/
static int writeMasterJournal(Pager *pPager, const char *zMaster){
- int rc;
- int len;
- int i;
- i64 jrnlOff;
- i64 jrnlSize;
- u32 cksum = 0;
- char zBuf[sizeof(aJournalMagic)+2*4];
-
- if( !zMaster || pPager->setMaster) return SQLITE_OK;
+ int rc; /* Return code */
+ int nMaster; /* Length of string zMaster */
+ i64 iHdrOff; /* Offset of header in journal file */
+ i64 jrnlSize; /* Size of journal file on disk */
+ u32 cksum = 0; /* Checksum of string zMaster */
+
+ if( !zMaster || pPager->setMaster
+ || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
+ || pPager->journalMode==PAGER_JOURNALMODE_OFF
+ ){
+ return SQLITE_OK;
+ }
pPager->setMaster = 1;
+ assert( isOpen(pPager->jfd) );
- len = strlen(zMaster);
- for(i=0; i<len; i++){
- cksum += zMaster[i];
+ /* Calculate the length in bytes and the checksum of zMaster */
+ for(nMaster=0; zMaster[nMaster]; nMaster++){
+ cksum += zMaster[nMaster];
}
/* If in full-sync mode, advance to the next disk sector before writing
@@ -24892,24 +32307,22 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){
** the journal has already been synced.
*/
if( pPager->fullSync ){
- seekJournalHdr(pPager);
+ pPager->journalOff = journalHdrOffset(pPager);
}
- jrnlOff = pPager->journalOff;
- pPager->journalOff += (len+20);
+ iHdrOff = pPager->journalOff;
- rc = write32bits(pPager->jfd, jrnlOff, PAGER_MJ_PGNO(pPager));
- if( rc!=SQLITE_OK ) return rc;
- jrnlOff += 4;
-
- rc = sqlite3OsWrite(pPager->jfd, zMaster, len, jrnlOff);
- if( rc!=SQLITE_OK ) return rc;
- jrnlOff += len;
-
- put32bits(zBuf, len);
- put32bits(&zBuf[4], cksum);
- memcpy(&zBuf[8], aJournalMagic, sizeof(aJournalMagic));
- rc = sqlite3OsWrite(pPager->jfd, zBuf, 8+sizeof(aJournalMagic), jrnlOff);
- jrnlOff += 8+sizeof(aJournalMagic);
+ /* Write the master journal data to the end of the journal file. If
+ ** an error occurs, return the error code to the caller.
+ */
+ if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager))))
+ || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4)))
+ || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster)))
+ || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum)))
+ || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, iHdrOff+4+nMaster+8)))
+ ){
+ return rc;
+ }
+ pPager->journalOff += (nMaster+20);
pPager->needSync = !pPager->noSync;
/* If the pager is in peristent-journal mode, then the physical
@@ -24922,85 +32335,85 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){
** Easiest thing to do in this scenario is to truncate the journal
** file to the required size.
*/
- if( (rc==SQLITE_OK)
- && (rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize))==SQLITE_OK
- && jrnlSize>jrnlOff
+ if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize))
+ && jrnlSize>pPager->journalOff
){
- rc = sqlite3OsTruncate(pPager->jfd, jrnlOff);
+ rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff);
}
return rc;
}
/*
-** Add or remove a page from the list of all pages that are in the
-** statement journal.
+** Find a page in the hash table given its page number. Return
+** a pointer to the page or NULL if the requested page is not
+** already in memory.
+*/
+static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){
+ PgHdr *p; /* Return value */
+
+ /* It is not possible for a call to PcacheFetch() with createFlag==0 to
+ ** fail, since no attempt to allocate dynamic memory will be made.
+ */
+ (void)sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &p);
+ return p;
+}
+
+/*
+** Unless the pager is in error-state, discard all in-memory pages. If
+** the pager is in error-state, then this call is a no-op.
**
-** The Pager keeps a separate list of pages that are currently in
-** the statement journal. This helps the sqlite3PagerStmtCommit()
-** routine run MUCH faster for the common case where there are many
-** pages in memory but only a few are in the statement journal.
+** TODO: Why can we not reset the pager while in error state?
*/
-static void page_add_to_stmt_list(PgHdr *pPg){
- Pager *pPager = pPg->pPager;
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- assert( MEMDB );
- if( !pHist->inStmt ){
- assert( pHist->pPrevStmt==0 && pHist->pNextStmt==0 );
- if( pPager->pStmt ){
- PGHDR_TO_HIST(pPager->pStmt, pPager)->pPrevStmt = pPg;
- }
- pHist->pNextStmt = pPager->pStmt;
- pPager->pStmt = pPg;
- pHist->inStmt = 1;
+static void pager_reset(Pager *pPager){
+ if( SQLITE_OK==pPager->errCode ){
+ sqlite3BackupRestart(pPager->pBackup);
+ sqlite3PcacheClear(pPager->pPCache);
+ pPager->dbSizeValid = 0;
}
}
/*
-** Find a page in the hash table given its page number. Return
-** a pointer to the page or NULL if not found.
+** Free all structures in the Pager.aSavepoint[] array and set both
+** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal
+** if it is open and the pager is not in exclusive mode.
*/
-static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){
- PgHdr *p;
- if( pPager->aHash==0 ) return 0;
- p = pPager->aHash[pgno & (pPager->nHash-1)];
- while( p && p->pgno!=pgno ){
- p = p->pNextHash;
+static void releaseAllSavepoints(Pager *pPager){
+ int ii; /* Iterator for looping through Pager.aSavepoint */
+ for(ii=0; ii<pPager->nSavepoint; ii++){
+ sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
}
- return p;
+ if( !pPager->exclusiveMode || sqlite3IsMemJournal(pPager->sjfd) ){
+ sqlite3OsClose(pPager->sjfd);
+ }
+ sqlite3_free(pPager->aSavepoint);
+ pPager->aSavepoint = 0;
+ pPager->nSavepoint = 0;
+ pPager->nSubRec = 0;
}
/*
-** Clear the in-memory cache. This routine
-** sets the state of the pager back to what it was when it was first
-** opened. Any outstanding pages are invalidated and subsequent attempts
-** to access those pages will likely result in a coredump.
+** Set the bit number pgno in the PagerSavepoint.pInSavepoint
+** bitvecs of all open savepoints. Return SQLITE_OK if successful
+** or SQLITE_NOMEM if a malloc failure occurs.
*/
-static void pager_reset(Pager *pPager){
- PgHdr *pPg, *pNext;
- if( pPager->errCode ) return;
- for(pPg=pPager->pAll; pPg; pPg=pNext){
- IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno));
- PAGER_INCR(sqlite3_pager_pgfree_count);
- pNext = pPg->pNextAll;
- lruListRemove(pPg);
- sqlite3_free(pPg->pData);
- sqlite3_free(pPg);
- }
- assert(pPager->lru.pFirst==0);
- assert(pPager->lru.pFirstSynced==0);
- assert(pPager->lru.pLast==0);
- pPager->pStmt = 0;
- pPager->pAll = 0;
- pPager->pDirty = 0;
- pPager->nHash = 0;
- sqlite3_free(pPager->aHash);
- pPager->nPage = 0;
- pPager->aHash = 0;
- pPager->nRef = 0;
-}
-
-/*
-** Unlock the database file.
+static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){
+ int ii; /* Loop counter */
+ int rc = SQLITE_OK; /* Result code */
+
+ for(ii=0; ii<pPager->nSavepoint; ii++){
+ PagerSavepoint *p = &pPager->aSavepoint[ii];
+ if( pgno<=p->nOrig ){
+ rc |= sqlite3BitvecSet(p->pInSavepoint, pgno);
+ testcase( rc==SQLITE_NOMEM );
+ assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
+ }
+ }
+ return rc;
+}
+
+/*
+** Unlock the database file. This function is a no-op if the pager
+** is in exclusive mode.
**
** If the pager is currently in error state, discard the contents of
** the cache and reset the Pager structure internal state. If there is
@@ -25010,102 +32423,186 @@ static void pager_reset(Pager *pPager){
*/
static void pager_unlock(Pager *pPager){
if( !pPager->exclusiveMode ){
- if( !MEMDB ){
- int rc = osUnlock(pPager->fd, NO_LOCK);
- if( rc ) pPager->errCode = rc;
- pPager->dbSize = -1;
- IOTRACE(("UNLOCK %p\n", pPager))
-
- /* Always close the journal file when dropping the database lock.
- ** Otherwise, another connection with journal_mode=delete might
- ** delete the file out from under us.
- */
- if( pPager->journalOpen ){
- sqlite3OsClose(pPager->jfd);
- pPager->journalOpen = 0;
- sqlite3BitvecDestroy(pPager->pInJournal);
- pPager->pInJournal = 0;
- }
+ int rc; /* Return code */
- /* If Pager.errCode is set, the contents of the pager cache cannot be
- ** trusted. Now that the pager file is unlocked, the contents of the
- ** cache can be discarded and the error code safely cleared.
- */
- if( pPager->errCode ){
- if( rc==SQLITE_OK ) pPager->errCode = SQLITE_OK;
- pager_reset(pPager);
- if( pPager->stmtOpen ){
- sqlite3OsClose(pPager->stfd);
- sqlite3BitvecDestroy(pPager->pInStmt);
- pPager->pInStmt = 0;
- }
- pPager->stmtOpen = 0;
- pPager->stmtInUse = 0;
- pPager->journalOff = 0;
- pPager->journalStarted = 0;
- pPager->stmtAutoopen = 0;
- pPager->origDbSize = 0;
- }
+ /* Always close the journal file when dropping the database lock.
+ ** Otherwise, another connection with journal_mode=delete might
+ ** delete the file out from under us.
+ */
+ sqlite3OsClose(pPager->jfd);
+ sqlite3BitvecDestroy(pPager->pInJournal);
+ pPager->pInJournal = 0;
+ releaseAllSavepoints(pPager);
+
+ /* If the file is unlocked, somebody else might change it. The
+ ** values stored in Pager.dbSize etc. might become invalid if
+ ** this happens. TODO: Really, this doesn't need to be cleared
+ ** until the change-counter check fails in PagerSharedLock().
+ */
+ pPager->dbSizeValid = 0;
+
+ rc = osUnlock(pPager->fd, NO_LOCK);
+ if( rc ){
+ pPager->errCode = rc;
}
+ IOTRACE(("UNLOCK %p\n", pPager))
- if( !MEMDB || pPager->errCode==SQLITE_OK ){
- pPager->state = PAGER_UNLOCK;
- pPager->changeCountDone = 0;
+ /* If Pager.errCode is set, the contents of the pager cache cannot be
+ ** trusted. Now that the pager file is unlocked, the contents of the
+ ** cache can be discarded and the error code safely cleared.
+ */
+ if( pPager->errCode ){
+ if( rc==SQLITE_OK ){
+ pPager->errCode = SQLITE_OK;
+ }
+ pager_reset(pPager);
}
+
+ pPager->changeCountDone = 0;
+ pPager->state = PAGER_UNLOCK;
}
}
/*
-** Execute a rollback if a transaction is active and unlock the
-** database file. If the pager has already entered the error state,
-** do not attempt the rollback.
+** This function should be called when an IOERR, CORRUPT or FULL error
+** may have occurred. The first argument is a pointer to the pager
+** structure, the second the error-code about to be returned by a pager
+** API function. The value returned is a copy of the second argument
+** to this function.
+**
+** If the second argument is SQLITE_IOERR, SQLITE_CORRUPT, or SQLITE_FULL
+** the error becomes persistent. Until the persisten error is cleared,
+** subsequent API calls on this Pager will immediately return the same
+** error code.
+**
+** A persistent error indicates that the contents of the pager-cache
+** cannot be trusted. This state can be cleared by completely discarding
+** the contents of the pager-cache. If a transaction was active when
+** the persistent error occurred, then the rollback journal may need
+** to be replayed to restore the contents of the database file (as if
+** it were a hot-journal).
*/
-static void pagerUnlockAndRollback(Pager *p){
- /* assert( p->state>=PAGER_RESERVED || p->journalOpen==0 ); */
- if( p->errCode==SQLITE_OK && p->state>=PAGER_RESERVED ){
- sqlite3FaultBeginBenign(-1);
- sqlite3PagerRollback(p);
- sqlite3FaultEndBenign(-1);
+static int pager_error(Pager *pPager, int rc){
+ int rc2 = rc & 0xff;
+ assert( rc==SQLITE_OK || !MEMDB );
+ assert(
+ pPager->errCode==SQLITE_FULL ||
+ pPager->errCode==SQLITE_OK ||
+ (pPager->errCode & 0xff)==SQLITE_IOERR
+ );
+ if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){
+ pPager->errCode = rc;
}
- pager_unlock(p);
-#if 0
- assert( p->errCode || !p->journalOpen || (p->exclusiveMode&&!p->journalOff) );
- assert( p->errCode || !p->stmtOpen || p->exclusiveMode );
-#endif
+ return rc;
}
/*
-** This routine ends a transaction. A transaction is ended by either
-** a COMMIT or a ROLLBACK.
-**
-** When this routine is called, the pager has the journal file open and
-** a RESERVED or EXCLUSIVE lock on the database. This routine will release
-** the database lock and acquires a SHARED lock in its place if that is
-** the appropriate thing to do. Release locks usually is appropriate,
-** unless we are in exclusive access mode or unless this is a
-** COMMIT AND BEGIN or ROLLBACK AND BEGIN operation.
+** Execute a rollback if a transaction is active and unlock the
+** database file.
**
-** The journal file is either deleted or truncated.
+** If the pager has already entered the error state, do not attempt
+** the rollback at this time. Instead, pager_unlock() is called. The
+** call to pager_unlock() will discard all in-memory pages, unlock
+** the database file and clear the error state. If this means that
+** there is a hot-journal left in the file-system, the next connection
+** to obtain a shared lock on the pager (which may be this one) will
+** roll it back.
**
-** TODO: Consider keeping the journal file open for temporary databases.
-** This might give a performance improvement on windows where opening
-** a file is an expensive operation.
+** If the pager has not already entered the error state, but an IO or
+** malloc error occurs during a rollback, then this will itself cause
+** the pager to enter the error state. Which will be cleared by the
+** call to pager_unlock(), as described above.
+*/
+static void pagerUnlockAndRollback(Pager *pPager){
+ if( pPager->errCode==SQLITE_OK && pPager->state>=PAGER_RESERVED ){
+ sqlite3BeginBenignMalloc();
+ sqlite3PagerRollback(pPager);
+ sqlite3EndBenignMalloc();
+ }
+ pager_unlock(pPager);
+}
+
+/*
+** This routine ends a transaction. A transaction is usually ended by
+** either a COMMIT or a ROLLBACK operation. This routine may be called
+** after rollback of a hot-journal, or if an error occurs while opening
+** the journal file or writing the very first journal-header of a
+** database transaction.
+**
+** If the pager is in PAGER_SHARED or PAGER_UNLOCK state when this
+** routine is called, it is a no-op (returns SQLITE_OK).
+**
+** Otherwise, any active savepoints are released.
+**
+** If the journal file is open, then it is "finalized". Once a journal
+** file has been finalized it is not possible to use it to roll back a
+** transaction. Nor will it be considered to be a hot-journal by this
+** or any other database connection. Exactly how a journal is finalized
+** depends on whether or not the pager is running in exclusive mode and
+** the current journal-mode (Pager.journalMode value), as follows:
+**
+** journalMode==MEMORY
+** Journal file descriptor is simply closed. This destroys an
+** in-memory journal.
+**
+** journalMode==TRUNCATE
+** Journal file is truncated to zero bytes in size.
+**
+** journalMode==PERSIST
+** The first 28 bytes of the journal file are zeroed. This invalidates
+** the first journal header in the file, and hence the entire journal
+** file. An invalid journal file cannot be rolled back.
+**
+** journalMode==DELETE
+** The journal file is closed and deleted using sqlite3OsDelete().
+**
+** If the pager is running in exclusive mode, this method of finalizing
+** the journal file is never used. Instead, if the journalMode is
+** DELETE and the pager is in exclusive mode, the method described under
+** journalMode==PERSIST is used instead.
+**
+** After the journal is finalized, if running in non-exclusive mode, the
+** pager moves to PAGER_SHARED state (and downgrades the lock on the
+** database file accordingly).
+**
+** If the pager is running in exclusive mode and is in PAGER_SYNCED state,
+** it moves to PAGER_EXCLUSIVE. No locks are downgraded when running in
+** exclusive mode.
+**
+** SQLITE_OK is returned if no error occurs. If an error occurs during
+** any of the IO operations to finalize the journal file or unlock the
+** database then the IO error code is returned to the user. If the
+** operation to finalize the journal file fails, then the code still
+** tries to unlock the database file if not in exclusive mode. If the
+** unlock operation fails as well, then the first error code related
+** to the first error encountered (the journal finalization one) is
+** returned.
*/
static int pager_end_transaction(Pager *pPager, int hasMaster){
- PgHdr *pPg;
- int rc = SQLITE_OK;
- int rc2 = SQLITE_OK;
- assert( !MEMDB );
+ int rc = SQLITE_OK; /* Error code from journal finalization operation */
+ int rc2 = SQLITE_OK; /* Error code from db file unlock operation */
+
if( pPager->state<PAGER_RESERVED ){
return SQLITE_OK;
}
- sqlite3PagerStmtCommit(pPager);
- if( pPager->stmtOpen && !pPager->exclusiveMode ){
- sqlite3OsClose(pPager->stfd);
- pPager->stmtOpen = 0;
- }
- if( pPager->journalOpen ){
- if( pPager->exclusiveMode
+ releaseAllSavepoints(pPager);
+
+ assert( isOpen(pPager->jfd) || pPager->pInJournal==0 );
+ if( isOpen(pPager->jfd) ){
+
+ /* Finalize the journal file. */
+ if( sqlite3IsMemJournal(pPager->jfd) ){
+ assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
+ sqlite3OsClose(pPager->jfd);
+ }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){
+ if( pPager->journalOff==0 ){
+ rc = SQLITE_OK;
+ }else{
+ rc = sqlite3OsTruncate(pPager->jfd, 0);
+ }
+ pPager->journalOff = 0;
+ pPager->journalStarted = 0;
+ }else if( pPager->exclusiveMode
|| pPager->journalMode==PAGER_JOURNALMODE_PERSIST
){
rc = zeroJournalHdr(pPager, hasMaster);
@@ -25113,69 +32610,73 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
pPager->journalOff = 0;
pPager->journalStarted = 0;
}else{
+ /* This branch may be executed with Pager.journalMode==MEMORY if
+ ** a hot-journal was just rolled back. In this case the journal
+ ** file should be closed and deleted. If this connection writes to
+ ** the database file, it will do so using an in-memory journal. */
+ assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE
+ || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
+ );
sqlite3OsClose(pPager->jfd);
- pPager->journalOpen = 0;
- if( rc==SQLITE_OK ){
+ if( !pPager->tempFile ){
rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
}
}
- sqlite3BitvecDestroy(pPager->pInJournal);
- pPager->pInJournal = 0;
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- pPg->inJournal = 0;
- pPg->dirty = 0;
- pPg->needSync = 0;
- pPg->alwaysRollback = 0;
+
#ifdef SQLITE_CHECK_PAGES
- pPg->pageHash = pager_pagehash(pPg);
+ sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
#endif
- }
- pPager->pDirty = 0;
- pPager->dirtyCache = 0;
+
+ sqlite3PcacheCleanAll(pPager->pPCache);
+ sqlite3BitvecDestroy(pPager->pInJournal);
+ pPager->pInJournal = 0;
pPager->nRec = 0;
- }else{
- assert( pPager->pInJournal==0 );
}
if( !pPager->exclusiveMode ){
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
pPager->state = PAGER_SHARED;
+ pPager->changeCountDone = 0;
}else if( pPager->state==PAGER_SYNCED ){
pPager->state = PAGER_EXCLUSIVE;
}
- pPager->origDbSize = 0;
pPager->setMaster = 0;
pPager->needSync = 0;
- lruListSetFirstSynced(pPager);
- pPager->dbSize = -1;
pPager->dbModified = 0;
+ /* TODO: Is this optimal? Why is the db size invalidated here
+ ** when the database file is not unlocked? */
+ pPager->dbOrigSize = 0;
+ sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize);
+ if( !MEMDB ){
+ pPager->dbSizeValid = 0;
+ }
+
return (rc==SQLITE_OK?rc2:rc);
}
/*
-** Compute and return a checksum for the page of data.
+** Parameter aData must point to a buffer of pPager->pageSize bytes
+** of data. Compute and return a checksum based ont the contents of the
+** page of data and the current value of pPager->cksumInit.
+**
+** This is not a real checksum. It is really just the sum of the
+** random initial value (pPager->cksumInit) and every 200th byte
+** of the page data, starting with byte offset (pPager->pageSize%200).
+** Each byte is interpreted as an 8-bit unsigned integer.
**
-** This is not a real checksum. It is really just the sum of the
-** random initial value and the page number. We experimented with
-** a checksum of the entire data, but that was found to be too slow.
+** Changing the formula used to compute this checksum results in an
+** incompatible journal file format.
**
-** Note that the page number is stored at the beginning of data and
-** the checksum is stored at the end. This is important. If journal
-** corruption occurs due to a power failure, the most likely scenario
-** is that one end or the other of the record will be changed. It is
-** much less likely that the two ends of the journal record will be
+** If journal corruption occurs due to a power failure, the most likely
+** scenario is that one end or the other of the record will be changed.
+** It is much less likely that the two ends of the journal record will be
** correct and the middle be corrupt. Thus, this "checksum" scheme,
** though fast and simple, catches the mostly likely kind of corruption.
-**
-** FIX ME: Consider adding every 200th (or so) byte of the data to the
-** checksum. That way if a single page spans 3 or more disk sectors and
-** only the middle sector is corrupt, we will still have a reasonable
-** chance of failing the checksum and thus detecting the problem.
*/
static u32 pager_cksum(Pager *pPager, const u8 *aData){
- u32 cksum = pPager->cksumInit;
- int i = pPager->pageSize-200;
+ u32 cksum = pPager->cksumInit; /* Checksum value to return */
+ int i = pPager->pageSize-200; /* Loop counter */
while( i>0 ){
cksum += aData[i];
i -= 200;
@@ -25183,40 +32684,76 @@ static u32 pager_cksum(Pager *pPager, const u8 *aData){
return cksum;
}
-/* Forward declaration */
-static void makeClean(PgHdr*);
-
/*
-** Read a single page from the journal file opened on file descriptor
-** jfd. Playback this one page.
+** Read a single page from either the journal file (if isMainJrnl==1) or
+** from the sub-journal (if isMainJrnl==0) and playback that page.
+** The page begins at offset *pOffset into the file. The *pOffset
+** value is increased to the start of the next page in the journal.
+**
+** The isMainJrnl flag is true if this is the main rollback journal and
+** false for the statement journal. The main rollback journal uses
+** checksums - the statement journal does not.
+**
+** If the page number of the page record read from the (sub-)journal file
+** is greater than the current value of Pager.dbSize, then playback is
+** skipped and SQLITE_OK is returned.
+**
+** If pDone is not NULL, then it is a record of pages that have already
+** been played back. If the page at *pOffset has already been played back
+** (if the corresponding pDone bit is set) then skip the playback.
+** Make sure the pDone bit corresponding to the *pOffset page is set
+** prior to returning.
+**
+** If the page record is successfully read from the (sub-)journal file
+** and played back, then SQLITE_OK is returned. If an IO error occurs
+** while reading the record from the (sub-)journal file or while writing
+** to the database file, then the IO error code is returned. If data
+** is successfully read from the (sub-)journal file but appears to be
+** corrupted, SQLITE_DONE is returned. Data is considered corrupted in
+** two circumstances:
+**
+** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or
+** * If the record is being rolled back from the main journal file
+** and the checksum field does not match the record content.
+**
+** Neither of these two scenarios are possible during a savepoint rollback.
**
-** If useCksum==0 it means this journal does not use checksums. Checksums
-** are not used in statement journals because statement journals do not
-** need to survive power failures.
+** If this is a savepoint rollback, then memory may have to be dynamically
+** allocated by this function. If this is the case and an allocation fails,
+** SQLITE_NOMEM is returned.
*/
static int pager_playback_one_page(
- Pager *pPager,
- sqlite3_file *jfd,
- i64 offset,
- int useCksum
+ Pager *pPager, /* The pager being played back */
+ int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */
+ int isUnsync, /* True if reading from unsynced main journal */
+ i64 *pOffset, /* Offset of record to playback */
+ int isSavepnt, /* True for a savepoint rollback */
+ Bitvec *pDone /* Bitvec of pages already played back */
){
int rc;
PgHdr *pPg; /* An existing page in the cache */
Pgno pgno; /* The page number of a page in journal */
u32 cksum; /* Checksum used for sanity checking */
- u8 *aData = (u8 *)pPager->pTmpSpace; /* Temp storage for a page */
+ u8 *aData; /* Temporary storage for the page */
+ sqlite3_file *jfd; /* The file descriptor for the journal file */
- /* useCksum should be true for the main journal and false for
- ** statement journals. Verify that this is always the case
- */
- assert( jfd == (useCksum ? pPager->jfd : pPager->stfd) );
- assert( aData );
+ assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */
+ assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */
+ assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */
+ assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */
- rc = read32bits(jfd, offset, &pgno);
+ aData = (u8*)pPager->pTmpSpace;
+ assert( aData ); /* Temp storage must have already been allocated */
+
+ /* Read the page number and page data from the journal or sub-journal
+ ** file. Return an error code to the caller if an IO error occurs.
+ */
+ jfd = isMainJrnl ? pPager->jfd : pPager->sjfd;
+ rc = read32bits(jfd, *pOffset, &pgno);
if( rc!=SQLITE_OK ) return rc;
- rc = sqlite3OsRead(jfd, aData, pPager->pageSize, offset+4);
+ rc = sqlite3OsRead(jfd, aData, pPager->pageSize, (*pOffset)+4);
if( rc!=SQLITE_OK ) return rc;
- pPager->journalOff += pPager->pageSize + 4;
+ *pOffset += pPager->pageSize + 4 + isMainJrnl*4;
/* Sanity checking on the page. This is more important that I originally
** thought. If a power failure occurs while the journal is being written,
@@ -25224,20 +32761,24 @@ static int pager_playback_one_page(
** detect this invalid data (with high probability) and ignore it.
*/
if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
+ assert( !isSavepnt );
return SQLITE_DONE;
}
- if( pgno>(unsigned)pPager->dbSize ){
+ if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){
return SQLITE_OK;
}
- if( useCksum ){
- rc = read32bits(jfd, offset+pPager->pageSize+4, &cksum);
+ if( isMainJrnl ){
+ rc = read32bits(jfd, (*pOffset)-4, &cksum);
if( rc ) return rc;
- pPager->journalOff += 4;
- if( pager_cksum(pPager, aData)!=cksum ){
+ if( !isSavepnt && pager_cksum(pPager, aData)!=cksum ){
return SQLITE_DONE;
}
}
+ if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){
+ return rc;
+ }
+
assert( pPager->state==PAGER_RESERVED || pPager->state>=PAGER_EXCLUSIVE );
/* If the pager is in RESERVED state, then there must be a copy of this
@@ -25273,15 +32814,49 @@ static int pager_playback_one_page(
** Do not attempt to write if database file has never been opened.
*/
pPg = pager_lookup(pPager, pgno);
- PAGERTRACE4("PLAYBACK %d page %d hash(%08x)\n",
- PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData));
- if( pPager->state>=PAGER_EXCLUSIVE && (pPg==0 || pPg->needSync==0)
- && pPager->fd->pMethods ){
- i64 offset = (pgno-1)*(i64)pPager->pageSize;
- rc = sqlite3OsWrite(pPager->fd, aData, pPager->pageSize, offset);
- if( pPg ){
- makeClean(pPg);
+ assert( pPg || !MEMDB );
+ PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n",
+ PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData),
+ (isMainJrnl?"main-journal":"sub-journal")
+ ));
+ if( (pPager->state>=PAGER_EXCLUSIVE)
+ && (pPg==0 || 0==(pPg->flags&PGHDR_NEED_SYNC))
+ && isOpen(pPager->fd)
+ && !isUnsync
+ ){
+ i64 ofst = (pgno-1)*(i64)pPager->pageSize;
+ rc = sqlite3OsWrite(pPager->fd, aData, pPager->pageSize, ofst);
+ if( pgno>pPager->dbFileSize ){
+ pPager->dbFileSize = pgno;
+ }
+ if( pPager->pBackup ){
+ CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM);
+ sqlite3BackupUpdate(pPager->pBackup, pgno, aData);
+ CODEC1(pPager, aData, pgno, 0, rc=SQLITE_NOMEM);
+ }
+ }else if( !isMainJrnl && pPg==0 ){
+ /* If this is a rollback of a savepoint and data was not written to
+ ** the database and the page is not in-memory, there is a potential
+ ** problem. When the page is next fetched by the b-tree layer, it
+ ** will be read from the database file, which may or may not be
+ ** current.
+ **
+ ** There are a couple of different ways this can happen. All are quite
+ ** obscure. When running in synchronous mode, this can only happen
+ ** if the page is on the free-list at the start of the transaction, then
+ ** populated, then moved using sqlite3PagerMovepage().
+ **
+ ** The solution is to add an in-memory page to the cache containing
+ ** the data just read from the sub-journal. Mark the page as dirty
+ ** and if the pager requires a journal-sync, then mark the page as
+ ** requiring a journal-sync before it is written.
+ */
+ assert( isSavepnt );
+ if( (rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1))!=SQLITE_OK ){
+ return rc;
}
+ pPg->flags &= ~PGHDR_NEED_READ;
+ sqlite3PcacheMakeDirty(pPg);
}
if( pPg ){
/* No page should ever be explicitly rolled back that is in use, except
@@ -25291,11 +32866,29 @@ static int pager_playback_one_page(
** sqlite3PagerRollback().
*/
void *pData;
- /* assert( pPg->nRef==0 || pPg->pgno==1 ); */
- pData = PGHDR_TO_DATA(pPg);
+ pData = pPg->pData;
memcpy(pData, aData, pPager->pageSize);
- if( pPager->xReiniter ){
- pPager->xReiniter(pPg, pPager->pageSize);
+ pPager->xReiniter(pPg);
+ if( isMainJrnl && (!isSavepnt || *pOffset<=pPager->journalHdr) ){
+ /* If the contents of this page were just restored from the main
+ ** journal file, then its content must be as they were when the
+ ** transaction was first opened. In this case we can mark the page
+ ** as clean, since there will be no need to write it out to the.
+ **
+ ** There is one exception to this rule. If the page is being rolled
+ ** back as part of a savepoint (or statement) rollback from an
+ ** unsynced portion of the main journal file, then it is not safe
+ ** to mark the page as clean. This is because marking the page as
+ ** clean will clear the PGHDR_NEED_SYNC flag. Since the page is
+ ** already in the journal file (recorded in Pager.pInJournal) and
+ ** the PGHDR_NEED_SYNC flag is cleared, if the page is written to
+ ** again within this transaction, it will be marked as dirty but
+ ** the PGHDR_NEED_SYNC flag will not be set. It could then potentially
+ ** be written out into the database file before its journal file
+ ** segment is synced. If a crash occurs during or following this,
+ ** database corruption may ensue.
+ */
+ sqlite3PcacheMakeClean(pPg);
}
#ifdef SQLITE_CHECK_PAGES
pPg->pageHash = pager_pagehash(pPg);
@@ -25307,7 +32900,8 @@ static int pager_playback_one_page(
}
/* Decode the page just read from disk */
- CODEC1(pPager, pData, pPg->pgno, 3);
+ CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM);
+ sqlite3PcacheRelease(pPg);
}
return rc;
}
@@ -25321,34 +32915,60 @@ static int pager_playback_one_page(
** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not
** available for use within this function.
**
+** When a master journal file is created, it is populated with the names
+** of all of its child journals, one after another, formatted as utf-8
+** encoded text. The end of each child journal file is marked with a
+** nul-terminator byte (0x00). i.e. the entire contents of a master journal
+** file for a transaction involving two databases might be:
**
-** The master journal file contains the names of all child journals.
-** To tell if a master journal can be deleted, check to each of the
-** children. If all children are either missing or do not refer to
-** a different master journal, then this master journal can be deleted.
+** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00"
+**
+** A master journal file may only be deleted once all of its child
+** journals have been rolled back.
+**
+** This function reads the contents of the master-journal file into
+** memory and loops through each of the child journal names. For
+** each child journal, it checks if:
+**
+** * if the child journal exists, and if so
+** * if the child journal contains a reference to master journal
+** file zMaster
+**
+** If a child journal can be found that matches both of the criteria
+** above, this function returns without doing anything. Otherwise, if
+** no such child journal can be found, file zMaster is deleted from
+** the file-system using sqlite3OsDelete().
+**
+** If an IO error within this function, an error code is returned. This
+** function allocates memory by calling sqlite3Malloc(). If an allocation
+** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors
+** occur, SQLITE_OK is returned.
+**
+** TODO: This function allocates a single block of memory to load
+** the entire contents of the master journal file. This could be
+** a couple of kilobytes or so - potentially larger than the page
+** size.
*/
static int pager_delmaster(Pager *pPager, const char *zMaster){
sqlite3_vfs *pVfs = pPager->pVfs;
- int rc;
- int master_open = 0;
- sqlite3_file *pMaster;
- sqlite3_file *pJournal;
+ int rc; /* Return code */
+ sqlite3_file *pMaster; /* Malloc'd master-journal file descriptor */
+ sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */
char *zMasterJournal = 0; /* Contents of master journal file */
i64 nMasterJournal; /* Size of master journal file */
- /* Open the master journal file exclusively in case some other process
- ** is running this routine also. Not that it makes too much difference.
+ /* Allocate space for both the pJournal and pMaster file descriptors.
+ ** If successful, open the master journal file for reading.
*/
- pMaster = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile * 2);
+ pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2);
pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile);
if( !pMaster ){
rc = SQLITE_NOMEM;
}else{
- int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
+ const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0);
}
if( rc!=SQLITE_OK ) goto delmaster_out;
- master_open = 1;
rc = sqlite3OsFileSize(pMaster, &nMasterJournal);
if( rc!=SQLITE_OK ) goto delmaster_out;
@@ -25356,28 +32976,29 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){
if( nMasterJournal>0 ){
char *zJournal;
char *zMasterPtr = 0;
- int nMasterPtr = pPager->pVfs->mxPathname+1;
+ int nMasterPtr = pVfs->mxPathname+1;
/* Load the entire master journal file into space obtained from
** sqlite3_malloc() and pointed to by zMasterJournal.
*/
- zMasterJournal = (char *)sqlite3_malloc(nMasterJournal + nMasterPtr);
+ zMasterJournal = sqlite3Malloc((int)nMasterJournal + nMasterPtr + 1);
if( !zMasterJournal ){
rc = SQLITE_NOMEM;
goto delmaster_out;
}
- zMasterPtr = &zMasterJournal[nMasterJournal];
- rc = sqlite3OsRead(pMaster, zMasterJournal, nMasterJournal, 0);
+ zMasterPtr = &zMasterJournal[nMasterJournal+1];
+ rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0);
if( rc!=SQLITE_OK ) goto delmaster_out;
+ zMasterJournal[nMasterJournal] = 0;
zJournal = zMasterJournal;
while( (zJournal-zMasterJournal)<nMasterJournal ){
- rc = sqlite3OsAccess(pVfs, zJournal, SQLITE_ACCESS_EXISTS);
- if( rc!=0 && rc!=1 ){
- rc = SQLITE_IOERR_NOMEM;
+ int exists;
+ rc = sqlite3OsAccess(pVfs, zJournal, SQLITE_ACCESS_EXISTS, &exists);
+ if( rc!=SQLITE_OK ){
goto delmaster_out;
}
- if( rc==1 ){
+ if( exists ){
/* One of the journals pointed to by the master journal exists.
** Open it and check if it points at the master journal. If
** so, return without deleting the master journal file.
@@ -25401,7 +33022,7 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){
goto delmaster_out;
}
}
- zJournal += (strlen(zJournal)+1);
+ zJournal += (sqlite3Strlen30(zJournal)+1);
}
}
@@ -25411,33 +33032,40 @@ delmaster_out:
if( zMasterJournal ){
sqlite3_free(zMasterJournal);
}
- if( master_open ){
+ if( pMaster ){
sqlite3OsClose(pMaster);
+ assert( !isOpen(pJournal) );
}
sqlite3_free(pMaster);
return rc;
}
-static void pager_truncate_cache(Pager *pPager);
-
/*
-** Truncate the main file of the given pager to the number of pages
-** indicated. Also truncate the cached representation of the file.
+** This function is used to change the actual size of the database
+** file in the file-system. This only happens when committing a transaction,
+** or rolling back a transaction (including rolling back a hot-journal).
+**
+** If the main database file is not open, or an exclusive lock is not
+** held, this function is a no-op. Otherwise, the size of the file is
+** changed to nPage pages (nPage*pPager->pageSize bytes). If the file
+** on disk is currently larger than nPage pages, then use the VFS
+** xTruncate() method to truncate it.
**
-** Might might be the case that the file on disk is smaller than nPage.
-** This can happen, for example, if we are in the middle of a transaction
-** which has extended the file size and the new pages are still all held
-** in cache, then an INSERT or UPDATE does a statement rollback. Some
-** operating system implementations can get confused if you try to
-** truncate a file to some size that is larger than it currently is,
-** so detect this case and write a single zero byte to the end of the new
-** file instead.
+** Or, it might might be the case that the file on disk is smaller than
+** nPage pages. Some operating system implementations can get confused if
+** you try to truncate a file to some size that is larger than it
+** currently is, so detect this case and write a single zero byte to
+** the end of the new file instead.
+**
+** If successful, return SQLITE_OK. If an IO error occurs while modifying
+** the database file, return the error code to the caller.
*/
-static int pager_truncate(Pager *pPager, int nPage){
+static int pager_truncate(Pager *pPager, Pgno nPage){
int rc = SQLITE_OK;
- if( pPager->state>=PAGER_EXCLUSIVE && pPager->fd->pMethods ){
+ if( pPager->state>=PAGER_EXCLUSIVE && isOpen(pPager->fd) ){
i64 currentSize, newSize;
+ /* TODO: Is it safe to use Pager.dbFileSize here? */
rc = sqlite3OsFileSize(pPager->fd, &currentSize);
newSize = pPager->pageSize*(i64)nPage;
if( rc==SQLITE_OK && currentSize!=newSize ){
@@ -25446,26 +33074,34 @@ static int pager_truncate(Pager *pPager, int nPage){
}else{
rc = sqlite3OsWrite(pPager->fd, "", 1, newSize-1);
}
+ if( rc==SQLITE_OK ){
+ pPager->dbFileSize = nPage;
+ }
}
}
- if( rc==SQLITE_OK ){
- pPager->dbSize = nPage;
- pager_truncate_cache(pPager);
- }
return rc;
}
/*
-** Set the sectorSize for the given pager.
+** Set the value of the Pager.sectorSize variable for the given
+** pager based on the value returned by the xSectorSize method
+** of the open database file. The sector size will be used used
+** to determine the size and alignment of journal header and
+** master journal pointers within created journal files.
+**
+** For temporary files the effective sector size is always 512 bytes.
**
-** The sector size is at least as big as the sector size reported
-** by sqlite3OsSectorSize(). The minimum sector size is 512.
+** Otherwise, for non-temporary files, the effective sector size is
+** the value returned by the xSectorSize() method rounded up to 512 if
+** it is less than 512, or rounded down to MAX_SECTOR_SIZE if it
+** is greater than MAX_SECTOR_SIZE.
*/
static void setSectorSize(Pager *pPager){
- assert(pPager->fd->pMethods||pPager->tempFile);
+ assert( isOpen(pPager->fd) || pPager->tempFile );
+
if( !pPager->tempFile ){
/* Sector size doesn't matter for temporary files. Also, the file
- ** may not have been opened yet, in whcih case the OsSectorSize()
+ ** may not have been opened yet, in which case the OsSectorSize()
** call will segfault.
*/
pPager->sectorSize = sqlite3OsSectorSize(pPager->fd);
@@ -25473,6 +33109,10 @@ static void setSectorSize(Pager *pPager){
if( pPager->sectorSize<512 ){
pPager->sectorSize = 512;
}
+ if( pPager->sectorSize>MAX_SECTOR_SIZE ){
+ assert( MAX_SECTOR_SIZE>=512 );
+ pPager->sectorSize = MAX_SECTOR_SIZE;
+ }
}
/*
@@ -25530,21 +33170,29 @@ static void setSectorSize(Pager *pPager){
**
** If an I/O or malloc() error occurs, the journal-file is not deleted
** and an error code is returned.
+**
+** The isHot parameter indicates that we are trying to rollback a journal
+** that might be a hot journal. Or, it could be that the journal is
+** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE.
+** If the journal really is hot, reset the pager cache prior rolling
+** back any content. If the journal is merely persistent, no reset is
+** needed.
*/
static int pager_playback(Pager *pPager, int isHot){
sqlite3_vfs *pVfs = pPager->pVfs;
i64 szJ; /* Size of the journal file in bytes */
u32 nRec; /* Number of Records in the journal */
- int i; /* Loop counter */
+ u32 u; /* Unsigned loop counter */
Pgno mxPg = 0; /* Size of the original file in pages */
int rc; /* Result code of a subroutine */
- int res = 0; /* Value returned by sqlite3OsAccess() */
+ int res = 1; /* Value returned by sqlite3OsAccess() */
char *zMaster = 0; /* Name of master journal file if any */
+ int needPagerReset; /* True to reset page prior to first page rollback */
/* Figure out how many records are in the journal. Abort early if
** the journal is empty.
*/
- assert( pPager->journalOpen );
+ assert( isOpen(pPager->jfd) );
rc = sqlite3OsFileSize(pPager->jfd, &szJ);
if( rc!=SQLITE_OK || szJ==0 ){
goto end_playback;
@@ -25554,32 +33202,38 @@ static int pager_playback(Pager *pPager, int isHot){
** If a master journal file name is specified, but the file is not
** present on disk, then the journal is not hot and does not need to be
** played back.
+ **
+ ** TODO: Technically the following is an error because it assumes that
+ ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that
+ ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c,
+ ** mxPathname is 512, which is the same as the minimum allowable value
+ ** for pageSize.
*/
zMaster = pPager->pTmpSpace;
rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
- if( rc!=SQLITE_OK || (zMaster[0]
- && (res=sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS))==0 )
- ){
- zMaster = 0;
- goto end_playback;
+ if( rc==SQLITE_OK && zMaster[0] ){
+ rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res);
}
zMaster = 0;
- if( res<0 ){
- rc = SQLITE_IOERR_NOMEM;
+ if( rc!=SQLITE_OK || !res ){
goto end_playback;
}
pPager->journalOff = 0;
+ needPagerReset = isHot;
- /* This loop terminates either when the readJournalHdr() call returns
- ** SQLITE_DONE or an IO error occurs. */
+ /* This loop terminates either when a readJournalHdr() or
+ ** pager_playback_one_page() call returns SQLITE_DONE or an IO error
+ ** occurs.
+ */
while( 1 ){
+ int isUnsync = 0;
/* Read the next journal header from the journal file. If there are
** not enough bytes left in the journal file for a complete header, or
** it is corrupted, then a process must of failed while writing it.
** This indicates nothing more needs to be rolled back.
*/
- rc = readJournalHdr(pPager, szJ, &nRec, &mxPg);
+ rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg);
if( rc!=SQLITE_OK ){
if( rc==SQLITE_DONE ){
rc = SQLITE_OK;
@@ -25594,7 +33248,7 @@ static int pager_playback(Pager *pPager, int isHot){
*/
if( nRec==0xffffffff ){
assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) );
- nRec = (szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager);
+ nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager));
}
/* If nRec is 0 and this rollback is of a transaction created by this
@@ -25604,10 +33258,17 @@ static int pager_playback(Pager *pPager, int isHot){
** size of the file.
**
** The third term of the test was added to fix ticket #2565.
+ ** When rolling back a hot journal, nRec==0 always means that the next
+ ** chunk of the journal contains zero pages to be rolled back. But
+ ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in
+ ** the journal, it means that the journal might contain additional
+ ** pages that need to be rolled back and that the number of pages
+ ** should be computed based on the journal file size.
*/
if( nRec==0 && !isHot &&
pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){
- nRec = (szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager);
+ nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager));
+ isUnsync = 1;
}
/* If this is the first header read from the journal, truncate the
@@ -25618,18 +33279,29 @@ static int pager_playback(Pager *pPager, int isHot){
if( rc!=SQLITE_OK ){
goto end_playback;
}
+ pPager->dbSize = mxPg;
}
- /* Copy original pages out of the journal and back into the database file.
+ /* Copy original pages out of the journal and back into the
+ ** database file and/or page cache.
*/
- for(i=0; i<nRec; i++){
- rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1);
+ for(u=0; u<nRec; u++){
+ if( needPagerReset ){
+ pager_reset(pPager);
+ needPagerReset = 0;
+ }
+ rc = pager_playback_one_page(pPager,1,isUnsync,&pPager->journalOff,0,0);
if( rc!=SQLITE_OK ){
if( rc==SQLITE_DONE ){
rc = SQLITE_OK;
pPager->journalOff = szJ;
break;
}else{
+ /* If we are unable to rollback, quit and return the error
+ ** code. This will cause the pager to enter the error state
+ ** so that no further harm will be done. Perhaps the next
+ ** process to come along will be able to rollback the database.
+ */
goto end_playback;
}
}
@@ -25639,18 +33311,42 @@ static int pager_playback(Pager *pPager, int isHot){
assert( 0 );
end_playback:
+ /* Following a rollback, the database file should be back in its original
+ ** state prior to the start of the transaction, so invoke the
+ ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the
+ ** assertion that the transaction counter was modified.
+ */
+ assert(
+ pPager->fd->pMethods==0 ||
+ sqlite3OsFileControl(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0)>=SQLITE_OK
+ );
+
+ /* If this playback is happening automatically as a result of an IO or
+ ** malloc error that occurred after the change-counter was updated but
+ ** before the transaction was committed, then the change-counter
+ ** modification may just have been reverted. If this happens in exclusive
+ ** mode, then subsequent transactions performed by the connection will not
+ ** update the change-counter at all. This may lead to cache inconsistency
+ ** problems for other processes at some point in the future. So, just
+ ** in case this has happened, clear the changeCountDone flag now.
+ */
+ pPager->changeCountDone = pPager->tempFile;
+
if( rc==SQLITE_OK ){
zMaster = pPager->pTmpSpace;
rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
+ testcase( rc!=SQLITE_OK );
}
if( rc==SQLITE_OK ){
rc = pager_end_transaction(pPager, zMaster[0]!='\0');
+ testcase( rc!=SQLITE_OK );
}
- if( rc==SQLITE_OK && zMaster[0] ){
+ if( rc==SQLITE_OK && zMaster[0] && res ){
/* If there was a master journal and this routine will return success,
** see if it is possible to delete the master journal.
*/
rc = pager_delmaster(pPager, zMaster);
+ testcase( rc!=SQLITE_OK );
}
/* The Pager.sectorSize variable may have been updated while rolling
@@ -25662,101 +33358,133 @@ end_playback:
}
/*
-** Playback the statement journal.
+** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback
+** the entire master journal file. The case pSavepoint==NULL occurs when
+** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction
+** savepoint.
+**
+** When pSavepoint is not NULL (meaning a non-transaction savepoint is
+** being rolled back), then the rollback consists of up to three stages,
+** performed in the order specified:
+**
+** * Pages are played back from the main journal starting at byte
+** offset PagerSavepoint.iOffset and continuing to
+** PagerSavepoint.iHdrOffset, or to the end of the main journal
+** file if PagerSavepoint.iHdrOffset is zero.
**
-** This is similar to playing back the transaction journal but with
-** a few extra twists.
+** * If PagerSavepoint.iHdrOffset is not zero, then pages are played
+** back starting from the journal header immediately following
+** PagerSavepoint.iHdrOffset to the end of the main journal file.
**
-** (1) The number of pages in the database file at the start of
-** the statement is stored in pPager->stmtSize, not in the
-** journal file itself.
+** * Pages are then played back from the sub-journal file, starting
+** with the PagerSavepoint.iSubRec and continuing to the end of
+** the journal file.
**
-** (2) In addition to playing back the statement journal, also
-** playback all pages of the transaction journal beginning
-** at offset pPager->stmtJSize.
+** Throughout the rollback process, each time a page is rolled back, the
+** corresponding bit is set in a bitvec structure (variable pDone in the
+** implementation below). This is used to ensure that a page is only
+** rolled back the first time it is encountered in either journal.
+**
+** If pSavepoint is NULL, then pages are only played back from the main
+** journal file. There is no need for a bitvec in this case.
+**
+** In either case, before playback commences the Pager.dbSize variable
+** is reset to the value that it held at the start of the savepoint
+** (or transaction). No page with a page-number greater than this value
+** is played back. If one is encountered it is simply skipped.
*/
-static int pager_stmt_playback(Pager *pPager){
- i64 szJ; /* Size of the full journal */
- i64 hdrOff;
- int nRec; /* Number of Records */
- int i; /* Loop counter */
- int rc;
+static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
+ i64 szJ; /* Effective size of the main journal */
+ i64 iHdrOff; /* End of first segment of main-journal records */
+ int rc = SQLITE_OK; /* Return code */
+ Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */
- szJ = pPager->journalOff;
+ assert( pPager->state>=PAGER_SHARED );
- /* Set hdrOff to be the offset just after the end of the last journal
- ** page written before the first journal-header for this statement
- ** transaction was written, or the end of the file if no journal
- ** header was written.
- */
- hdrOff = pPager->stmtHdrOff;
- assert( pPager->fullSync || !hdrOff );
- if( !hdrOff ){
- hdrOff = szJ;
+ /* Allocate a bitvec to use to store the set of pages rolled back */
+ if( pSavepoint ){
+ pDone = sqlite3BitvecCreate(pSavepoint->nOrig);
+ if( !pDone ){
+ return SQLITE_NOMEM;
+ }
}
-
- /* Truncate the database back to its original size.
+
+ /* Set the database size back to the value it was before the savepoint
+ ** being reverted was opened.
*/
- rc = pager_truncate(pPager, pPager->stmtSize);
- assert( pPager->state>=PAGER_SHARED );
+ pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize;
- /* Figure out how many records are in the statement journal.
+ /* Use pPager->journalOff as the effective size of the main rollback
+ ** journal. The actual file might be larger than this in
+ ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything
+ ** past pPager->journalOff is off-limits to us.
*/
- assert( pPager->stmtInUse && pPager->journalOpen );
- nRec = pPager->stmtNRec;
-
- /* Copy original pages out of the statement journal and back into the
- ** database file. Note that the statement journal omits checksums from
- ** each record since power-failure recovery is not important to statement
- ** journals.
- */
- for(i=0; i<nRec; i++){
- i64 offset = i*(4+pPager->pageSize);
- rc = pager_playback_one_page(pPager, pPager->stfd, offset, 0);
- assert( rc!=SQLITE_DONE );
- if( rc!=SQLITE_OK ) goto end_stmt_playback;
- }
+ szJ = pPager->journalOff;
- /* Now roll some pages back from the transaction journal. Pager.stmtJSize
- ** was the size of the journal file when this statement was started, so
- ** everything after that needs to be rolled back, either into the
- ** database, the memory cache, or both.
- **
- ** If it is not zero, then Pager.stmtHdrOff is the offset to the start
- ** of the first journal header written during this statement transaction.
+ /* Begin by rolling back records from the main journal starting at
+ ** PagerSavepoint.iOffset and continuing to the next journal header.
+ ** There might be records in the main journal that have a page number
+ ** greater than the current database size (pPager->dbSize) but those
+ ** will be skipped automatically. Pages are added to pDone as they
+ ** are played back.
*/
- pPager->journalOff = pPager->stmtJSize;
- pPager->cksumInit = pPager->stmtCksum;
- while( pPager->journalOff < hdrOff ){
- rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1);
+ if( pSavepoint ){
+ iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
+ pPager->journalOff = pSavepoint->iOffset;
+ while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
+ rc = pager_playback_one_page(pPager, 1, 0, &pPager->journalOff, 1, pDone);
+ }
assert( rc!=SQLITE_DONE );
- if( rc!=SQLITE_OK ) goto end_stmt_playback;
+ }else{
+ pPager->journalOff = 0;
}
- while( pPager->journalOff < szJ ){
- u32 nJRec; /* Number of Journal Records */
+ /* Continue rolling back records out of the main journal starting at
+ ** the first journal header seen and continuing until the effective end
+ ** of the main journal file. Continue to skip out-of-range pages and
+ ** continue adding pages rolled back to pDone.
+ */
+ while( rc==SQLITE_OK && pPager->journalOff<szJ ){
+ u32 ii; /* Loop counter */
+ u32 nJRec = 0; /* Number of Journal Records */
u32 dummy;
- rc = readJournalHdr(pPager, szJ, &nJRec, &dummy);
- if( rc!=SQLITE_OK ){
- assert( rc!=SQLITE_DONE );
- goto end_stmt_playback;
+ rc = readJournalHdr(pPager, 0, szJ, &nJRec, &dummy);
+ assert( rc!=SQLITE_DONE );
+
+ /*
+ ** The "pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff"
+ ** test is related to ticket #2565. See the discussion in the
+ ** pager_playback() function for additional information.
+ */
+ if( nJRec==0
+ && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff
+ ){
+ nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager));
}
- if( nJRec==0 ){
- nJRec = (szJ - pPager->journalOff) / (pPager->pageSize+8);
+ for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){
+ rc = pager_playback_one_page(pPager, 1, 0, &pPager->journalOff, 1, pDone);
}
- for(i=nJRec-1; i>=0 && pPager->journalOff < szJ; i--){
- rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1);
- assert( rc!=SQLITE_DONE );
- if( rc!=SQLITE_OK ) goto end_stmt_playback;
+ assert( rc!=SQLITE_DONE );
+ }
+ assert( rc!=SQLITE_OK || pPager->journalOff==szJ );
+
+ /* Finally, rollback pages from the sub-journal. Page that were
+ ** previously rolled back out of the main journal (and are hence in pDone)
+ ** will be skipped. Out-of-range pages are also skipped.
+ */
+ if( pSavepoint ){
+ u32 ii; /* Loop counter */
+ i64 offset = pSavepoint->iSubRec*(4+pPager->pageSize);
+ for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){
+ assert( offset==ii*(4+pPager->pageSize) );
+ rc = pager_playback_one_page(pPager, 0, 0, &offset, 1, pDone);
}
+ assert( rc!=SQLITE_DONE );
}
- pPager->journalOff = szJ;
-
-end_stmt_playback:
- if( rc==SQLITE_OK) {
+ sqlite3BitvecDestroy(pDone);
+ if( rc==SQLITE_OK ){
pPager->journalOff = szJ;
- /* pager_reload_cache(pPager); */
}
return rc;
}
@@ -25765,11 +33493,7 @@ end_stmt_playback:
** Change the maximum number of in-memory pages that are allowed.
*/
SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){
- if( mxPage>10 ){
- pPager->mxPage = mxPage;
- }else{
- pPager->mxPage = 10;
- }
+ sqlite3PcacheSetCachesize(pPager->pPCache, mxPage);
}
/*
@@ -25799,10 +33523,10 @@ SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){
** and FULL=3.
*/
#ifndef SQLITE_OMIT_PAGER_PRAGMAS
-SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager *pPager, int level, int full_fsync){
- pPager->noSync = level==1 || pPager->tempFile;
- pPager->fullSync = level==3 && !pPager->tempFile;
- pPager->sync_flags = (full_fsync?SQLITE_SYNC_FULL:SQLITE_SYNC_NORMAL);
+SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager *pPager, int level, int bFullFsync){
+ pPager->noSync = (level==1 || pPager->tempFile) ?1:0;
+ pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0;
+ pPager->sync_flags = (bFullFsync?SQLITE_SYNC_FULL:SQLITE_SYNC_NORMAL);
if( pPager->noSync ) pPager->needSync = 0;
}
#endif
@@ -25817,20 +33541,26 @@ SQLITE_API int sqlite3_opentemp_count = 0;
#endif
/*
-** Open a temporary file.
+** Open a temporary file.
+**
+** Write the file descriptor into *pFile. Return SQLITE_OK on success
+** or some other error code if we fail. The OS will automatically
+** delete the temporary file when it is closed.
**
-** Write the file descriptor into *fd. Return SQLITE_OK on success or some
-** other error code if we fail. The OS will automatically delete the temporary
-** file when it is closed.
+** The flags passed to the VFS layer xOpen() call are those specified
+** by parameter vfsFlags ORed with the following:
+**
+** SQLITE_OPEN_READWRITE
+** SQLITE_OPEN_CREATE
+** SQLITE_OPEN_EXCLUSIVE
+** SQLITE_OPEN_DELETEONCLOSE
*/
-static int sqlite3PagerOpentemp(
- sqlite3_vfs *pVfs, /* The virtual file system layer */
+static int pagerOpentemp(
+ Pager *pPager, /* The pager object */
sqlite3_file *pFile, /* Write the file descriptor here */
- char *zFilename, /* Name of the file. Might be NULL */
int vfsFlags /* Flags passed through to the VFS */
){
- int rc;
- assert( zFilename!=0 );
+ int rc; /* Return code */
#ifdef SQLITE_TEST
sqlite3_opentemp_count++; /* Used for testing and analysis only */
@@ -25838,308 +33568,113 @@ static int sqlite3PagerOpentemp(
vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE;
- rc = sqlite3OsOpen(pVfs, zFilename, pFile, vfsFlags, 0);
- assert( rc!=SQLITE_OK || pFile->pMethods );
+ rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0);
+ assert( rc!=SQLITE_OK || isOpen(pFile) );
return rc;
}
/*
-** Create a new page cache and put a pointer to the page cache in *ppPager.
-** The file to be cached need not exist. The file is not locked until
-** the first call to sqlite3PagerGet() and is only held open until the
-** last page is released using sqlite3PagerUnref().
+** Set the busy handler function.
**
-** If zFilename is NULL then a randomly-named temporary file is created
-** and used as the file to be cached. The file will be deleted
-** automatically when it is closed.
+** The pager invokes the busy-handler if sqlite3OsLock() returns
+** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock,
+** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE
+** lock. It does *not* invoke the busy handler when upgrading from
+** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE
+** (which occurs during hot-journal rollback). Summary:
+**
+** Transition | Invokes xBusyHandler
+** --------------------------------------------------------
+** NO_LOCK -> SHARED_LOCK | Yes
+** SHARED_LOCK -> RESERVED_LOCK | No
+** SHARED_LOCK -> EXCLUSIVE_LOCK | No
+** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes
**
-** If zFilename is ":memory:" then all information is held in cache.
-** It is never written to disk. This can be used to implement an
-** in-memory database.
+** If the busy-handler callback returns non-zero, the lock is
+** retried. If it returns zero, then the SQLITE_BUSY error is
+** returned to the caller of the pager API function.
*/
-SQLITE_PRIVATE int sqlite3PagerOpen(
- sqlite3_vfs *pVfs, /* The virtual file system to use */
- Pager **ppPager, /* Return the Pager structure here */
- const char *zFilename, /* Name of the database file to open */
- int nExtra, /* Extra bytes append to each in-memory page */
- int flags, /* flags controlling this file */
- int vfsFlags /* flags passed through to sqlite3_vfs.xOpen() */
-){
- u8 *pPtr;
- Pager *pPager = 0;
- int rc = SQLITE_OK;
- int i;
- int tempFile = 0;
- int memDb = 0;
- int readOnly = 0;
- int useJournal = (flags & PAGER_OMIT_JOURNAL)==0;
- int noReadlock = (flags & PAGER_NO_READLOCK)!=0;
- int journalFileSize = sqlite3JournalSize(pVfs);
- int nDefaultPage = SQLITE_DEFAULT_PAGE_SIZE;
- char *zPathname;
- int nPathname;
- char *zStmtJrnl;
- int nStmtJrnl;
-
- /* The default return is a NULL pointer */
- *ppPager = 0;
-
- /* Compute the full pathname */
- nPathname = pVfs->mxPathname+1;
- zPathname = sqlite3_malloc(nPathname*2);
- if( zPathname==0 ){
- return SQLITE_NOMEM;
- }
- if( zFilename && zFilename[0] ){
-#ifndef SQLITE_OMIT_MEMORYDB
- if( strcmp(zFilename,":memory:")==0 ){
- memDb = 1;
- zPathname[0] = 0;
- }else
-#endif
- {
- rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname);
- }
- }else{
- rc = sqlite3OsGetTempname(pVfs, nPathname, zPathname);
- }
- if( rc!=SQLITE_OK ){
- sqlite3_free(zPathname);
- return rc;
- }
- nPathname = strlen(zPathname);
-
- /* Put the statement journal in temporary disk space since this is
- ** sometimes RAM disk or other optimized storage. Unlikely the main
- ** main journal file, the statement journal does not need to be
- ** colocated with the database nor does it need to be persistent.
- */
- zStmtJrnl = &zPathname[nPathname+1];
- rc = sqlite3OsGetTempname(pVfs, pVfs->mxPathname+1, zStmtJrnl);
- if( rc!=SQLITE_OK ){
- sqlite3_free(zPathname);
- return rc;
- }
- nStmtJrnl = strlen(zStmtJrnl);
-
- /* Allocate memory for the pager structure */
- pPager = sqlite3MallocZero(
- sizeof(*pPager) + /* Pager structure */
- journalFileSize + /* The journal file structure */
- pVfs->szOsFile * 3 + /* The main db and two journal files */
- 3*nPathname + 40 + /* zFilename, zDirectory, zJournal */
- nStmtJrnl /* zStmtJrnl */
- );
- if( !pPager ){
- sqlite3_free(zPathname);
- return SQLITE_NOMEM;
- }
- pPtr = (u8 *)&pPager[1];
- pPager->vfsFlags = vfsFlags;
- pPager->fd = (sqlite3_file*)&pPtr[pVfs->szOsFile*0];
- pPager->stfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*1];
- pPager->jfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*2];
- pPager->zFilename = (char*)&pPtr[pVfs->szOsFile*2+journalFileSize];
- pPager->zDirectory = &pPager->zFilename[nPathname+1];
- pPager->zJournal = &pPager->zDirectory[nPathname+1];
- pPager->zStmtJrnl = &pPager->zJournal[nPathname+10];
- pPager->pVfs = pVfs;
- memcpy(pPager->zFilename, zPathname, nPathname+1);
- memcpy(pPager->zStmtJrnl, zStmtJrnl, nStmtJrnl+1);
- sqlite3_free(zPathname);
-
- /* Open the pager file.
- */
- if( zFilename && zFilename[0] && !memDb ){
- if( nPathname>(pVfs->mxPathname - sizeof("-journal")) ){
- rc = SQLITE_CANTOPEN;
- }else{
- int fout = 0;
- rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd,
- pPager->vfsFlags, &fout);
- readOnly = (fout&SQLITE_OPEN_READONLY);
-
- /* If the file was successfully opened for read/write access,
- ** choose a default page size in case we have to create the
- ** database file. The default page size is the maximum of:
- **
- ** + SQLITE_DEFAULT_PAGE_SIZE,
- ** + The value returned by sqlite3OsSectorSize()
- ** + The largest page size that can be written atomically.
- */
- if( rc==SQLITE_OK && !readOnly ){
- int iSectorSize = sqlite3OsSectorSize(pPager->fd);
- if( nDefaultPage<iSectorSize ){
- nDefaultPage = iSectorSize;
- }
-#ifdef SQLITE_ENABLE_ATOMIC_WRITE
- {
- int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
- int ii;
- assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
- assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
- assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536);
- for(ii=nDefaultPage; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){
- if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ) nDefaultPage = ii;
- }
- }
-#endif
- if( nDefaultPage>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
- nDefaultPage = SQLITE_MAX_DEFAULT_PAGE_SIZE;
- }
- }
- }
- }else if( !memDb ){
- /* If a temporary file is requested, it is not opened immediately.
- ** In this case we accept the default page size and delay actually
- ** opening the file until the first call to OsWrite().
- */
- tempFile = 1;
- pPager->state = PAGER_EXCLUSIVE;
- }
-
- if( pPager && rc==SQLITE_OK ){
- pPager->pTmpSpace = sqlite3MallocZero(nDefaultPage);
- }
-
- /* If an error occured in either of the blocks above.
- ** Free the Pager structure and close the file.
- ** Since the pager is not allocated there is no need to set
- ** any Pager.errMask variables.
- */
- if( !pPager || !pPager->pTmpSpace ){
- sqlite3OsClose(pPager->fd);
- sqlite3_free(pPager);
- return ((rc==SQLITE_OK)?SQLITE_NOMEM:rc);
- }
-
- PAGERTRACE3("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename);
- IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename))
-
- /* Fill in Pager.zDirectory[] */
- memcpy(pPager->zDirectory, pPager->zFilename, nPathname+1);
- for(i=strlen(pPager->zDirectory); i>0 && pPager->zDirectory[i-1]!='/'; i--){}
- if( i>0 ) pPager->zDirectory[i-1] = 0;
-
- /* Fill in Pager.zJournal[] */
- memcpy(pPager->zJournal, pPager->zFilename, nPathname);
- memcpy(&pPager->zJournal[nPathname], "-journal", 9);
-
- /* pPager->journalOpen = 0; */
- pPager->useJournal = useJournal && !memDb;
- pPager->noReadlock = noReadlock && readOnly;
- /* pPager->stmtOpen = 0; */
- /* pPager->stmtInUse = 0; */
- /* pPager->nRef = 0; */
- pPager->dbSize = memDb-1;
- pPager->pageSize = nDefaultPage;
- /* pPager->stmtSize = 0; */
- /* pPager->stmtJSize = 0; */
- /* pPager->nPage = 0; */
- pPager->mxPage = 100;
- pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
- /* pPager->state = PAGER_UNLOCK; */
- assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) );
- /* pPager->errMask = 0; */
- pPager->tempFile = tempFile;
- assert( tempFile==PAGER_LOCKINGMODE_NORMAL
- || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE );
- assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 );
- pPager->exclusiveMode = tempFile;
- pPager->memDb = memDb;
- pPager->readOnly = readOnly;
- /* pPager->needSync = 0; */
- pPager->noSync = pPager->tempFile || !useJournal;
- pPager->fullSync = (pPager->noSync?0:1);
- pPager->sync_flags = SQLITE_SYNC_NORMAL;
- /* pPager->pFirst = 0; */
- /* pPager->pFirstSynced = 0; */
- /* pPager->pLast = 0; */
- pPager->nExtra = FORCE_ALIGNMENT(nExtra);
- assert(pPager->fd->pMethods||memDb||tempFile);
- if( !memDb ){
- setSectorSize(pPager);
- }
- /* pPager->pBusyHandler = 0; */
- /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
- *ppPager = pPager;
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- pPager->iInUseMM = 0;
- pPager->iInUseDB = 0;
- if( !memDb ){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2);
-#endif
- sqlite3_mutex_enter(mutex);
- pPager->pNext = sqlite3PagerList;
- if( sqlite3PagerList ){
- assert( sqlite3PagerList->pPrev==0 );
- sqlite3PagerList->pPrev = pPager;
- }
- pPager->pPrev = 0;
- sqlite3PagerList = pPager;
- sqlite3_mutex_leave(mutex);
- }
-#endif
- return SQLITE_OK;
+SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
+ Pager *pPager, /* Pager object */
+ int (*xBusyHandler)(void *), /* Pointer to busy-handler function */
+ void *pBusyHandlerArg /* Argument to pass to xBusyHandler */
+){
+ pPager->xBusyHandler = xBusyHandler;
+ pPager->pBusyHandlerArg = pBusyHandlerArg;
}
/*
-** Set the busy handler function.
+** Report the current page size and number of reserved bytes back
+** to the codec.
*/
-SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager *pPager, BusyHandler *pBusyHandler){
- pPager->pBusyHandler = pBusyHandler;
+#ifdef SQLITE_HAS_CODEC
+static void pagerReportSize(Pager *pPager){
+ if( pPager->xCodecSizeChng ){
+ pPager->xCodecSizeChng(pPager->pCodec, pPager->pageSize,
+ (int)pPager->nReserve);
+ }
}
+#else
+# define pagerReportSize(X) /* No-op if we do not support a codec */
+#endif
/*
-** Set the destructor for this pager. If not NULL, the destructor is called
-** when the reference count on each page reaches zero. The destructor can
-** be used to clean up information in the extra segment appended to each page.
+** Change the page size used by the Pager object. The new page size
+** is passed in *pPageSize.
**
-** The destructor is not called as a result sqlite3PagerClose().
-** Destructors are only called by sqlite3PagerUnref().
-*/
-SQLITE_PRIVATE void sqlite3PagerSetDestructor(Pager *pPager, void (*xDesc)(DbPage*,int)){
- pPager->xDestructor = xDesc;
-}
-
-/*
-** Set the reinitializer for this pager. If not NULL, the reinitializer
-** is called when the content of a page in cache is restored to its original
-** value as a result of a rollback. The callback gives higher-level code
-** an opportunity to restore the EXTRA section to agree with the restored
-** page data.
+** If the pager is in the error state when this function is called, it
+** is a no-op. The value returned is the error state error code (i.e.
+** one of SQLITE_IOERR, SQLITE_CORRUPT or SQLITE_FULL).
+**
+** Otherwise, if all of the following are true:
+**
+** * the new page size (value of *pPageSize) is valid (a power
+** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and
+**
+** * there are no outstanding page references, and
+**
+** * the database is either not an in-memory database or it is
+** an in-memory database that currently consists of zero pages.
+**
+** then the pager object page size is set to *pPageSize.
+**
+** If the page size is changed, then this function uses sqlite3PagerMalloc()
+** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt
+** fails, SQLITE_NOMEM is returned and the page size remains unchanged.
+** In all other cases, SQLITE_OK is returned.
+**
+** If the page size is not changed, either because one of the enumerated
+** conditions above is not true, the pager was in error state when this
+** function was called, or because the memory allocation attempt failed,
+** then *pPageSize is set to the old, retained page size before returning.
*/
-SQLITE_PRIVATE void sqlite3PagerSetReiniter(Pager *pPager, void (*xReinit)(DbPage*,int)){
- pPager->xReiniter = xReinit;
-}
+SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize, int nReserve){
+ int rc = pPager->errCode;
-/*
-** Set the page size to *pPageSize. If the suggest new page size is
-** inappropriate, then an alternative page size is set to that
-** value before returning.
-*/
-SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){
- int rc = SQLITE_OK;
- u16 pageSize = *pPageSize;
- assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
- if( pageSize && pageSize!=pPager->pageSize
- && !pPager->memDb && pPager->nRef==0
- ){
- char *pNew = (char *)sqlite3_malloc(pageSize);
- if( !pNew ){
- rc = SQLITE_NOMEM;
- }else{
- pagerEnter(pPager);
- pager_reset(pPager);
- pPager->pageSize = pageSize;
- setSectorSize(pPager);
- sqlite3_free(pPager->pTmpSpace);
- pPager->pTmpSpace = pNew;
- pagerLeave(pPager);
+ if( rc==SQLITE_OK ){
+ u16 pageSize = *pPageSize;
+ assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
+ if( (pPager->memDb==0 || pPager->dbSize==0)
+ && sqlite3PcacheRefCount(pPager->pPCache)==0
+ && pageSize && pageSize!=pPager->pageSize
+ ){
+ char *pNew = (char *)sqlite3PageMalloc(pageSize);
+ if( !pNew ){
+ rc = SQLITE_NOMEM;
+ }else{
+ pager_reset(pPager);
+ pPager->pageSize = pageSize;
+ sqlite3PageFree(pPager->pTmpSpace);
+ pPager->pTmpSpace = pNew;
+ sqlite3PcacheSetPageSize(pPager->pPCache, pageSize);
+ }
}
+ *pPageSize = (u16)pPager->pageSize;
+ if( nReserve<0 ) nReserve = pPager->nReserve;
+ assert( nReserve>=0 && nReserve<1000 );
+ pPager->nReserve = (i16)nReserve;
+ pagerReportSize(pPager);
}
- *pPageSize = pPager->pageSize;
return rc;
}
@@ -26166,7 +33701,7 @@ SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){
if( mxPage>0 ){
pPager->mxPgno = mxPage;
}
- sqlite3PagerPagecount(pPager);
+ sqlite3PagerPagecount(pPager, 0);
return pPager->mxPgno;
}
@@ -26198,17 +33733,21 @@ void enable_simulated_io_errors(void){
** Read the first N bytes from the beginning of the file into memory
** that pDest points to.
**
-** No error checking is done. The rational for this is that this function
-** may be called even if the file does not exist or contain a header. In
-** these cases sqlite3OsRead() will return an error, to which the correct
-** response is to zero the memory at pDest and continue. A real IO error
-** will presumably recur and be picked up later (Todo: Think about this).
+** If the pager was opened on a transient file (zFilename==""), or
+** opened on a file less than N bytes in size, the output buffer is
+** zeroed and SQLITE_OK returned. The rationale for this is that this
+** function is used to read database headers, and a new transient or
+** zero sized database has a header than consists entirely of zeroes.
+**
+** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered,
+** the error code is returned to the caller and the contents of the
+** output buffer undefined.
*/
SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){
int rc = SQLITE_OK;
memset(pDest, 0, N);
- assert(MEMDB||pPager->fd->pMethods||pPager->tempFile);
- if( pPager->fd->pMethods ){
+ assert( isOpen(pPager->fd) || pPager->tempFile );
+ if( isOpen(pPager->fd) ){
IOTRACE(("DBHDR %p 0 %d\n", pPager, N))
rc = sqlite3OsRead(pPager->fd, pDest, N, 0);
if( rc==SQLITE_IOERR_SHORT_READ ){
@@ -26219,159 +33758,84 @@ SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned cha
}
/*
-** Return the total number of pages in the disk file associated with
-** pPager.
+** Return the total number of pages in the database file associated
+** with pPager. Normally, this is calculated as (<db file size>/<page-size>).
+** However, if the file is between 1 and <page-size> bytes in size, then
+** this is considered a 1 page file.
**
-** If the PENDING_BYTE lies on the page directly after the end of the
-** file, then consider this page part of the file too. For example, if
-** PENDING_BYTE is byte 4096 (the first byte of page 5) and the size of the
-** file is 4096 bytes, 5 is returned instead of 4.
+** If the pager is in error state when this function is called, then the
+** error state error code is returned and *pnPage left unchanged. Or,
+** if the file system has to be queried for the size of the file and
+** the query attempt returns an IO error, the IO error code is returned
+** and *pnPage is left unchanged.
+**
+** Otherwise, if everything is successful, then SQLITE_OK is returned
+** and *pnPage is set to the number of pages in the database.
*/
-SQLITE_PRIVATE int sqlite3PagerPagecount(Pager *pPager){
- i64 n = 0;
- int rc;
- assert( pPager!=0 );
+SQLITE_PRIVATE int sqlite3PagerPagecount(Pager *pPager, int *pnPage){
+ Pgno nPage; /* Value to return via *pnPage */
+
+ /* If the pager is already in the error state, return the error code. */
if( pPager->errCode ){
- return -1;
+ return pPager->errCode;
}
- if( pPager->dbSize>=0 ){
- n = pPager->dbSize;
- } else {
- assert(pPager->fd->pMethods||pPager->tempFile);
- if( (pPager->fd->pMethods)
- && (rc = sqlite3OsFileSize(pPager->fd, &n))!=SQLITE_OK ){
- pPager->nRef++;
+
+ /* Determine the number of pages in the file. Store this in nPage. */
+ if( pPager->dbSizeValid ){
+ nPage = pPager->dbSize;
+ }else{
+ int rc; /* Error returned by OsFileSize() */
+ i64 n = 0; /* File size in bytes returned by OsFileSize() */
+
+ assert( isOpen(pPager->fd) || pPager->tempFile );
+ if( isOpen(pPager->fd) && (0 != (rc = sqlite3OsFileSize(pPager->fd, &n))) ){
pager_error(pPager, rc);
- pPager->nRef--;
- return -1;
+ return rc;
}
if( n>0 && n<pPager->pageSize ){
- n = 1;
+ nPage = 1;
}else{
- n /= pPager->pageSize;
+ nPage = (Pgno)(n / pPager->pageSize);
}
if( pPager->state!=PAGER_UNLOCK ){
- pPager->dbSize = n;
+ pPager->dbSize = nPage;
+ pPager->dbFileSize = nPage;
+ pPager->dbSizeValid = 1;
}
}
- if( n==(PENDING_BYTE/pPager->pageSize) ){
- n++;
- }
- if( n>pPager->mxPgno ){
- pPager->mxPgno = n;
- }
- return n;
-}
-
-#ifndef SQLITE_OMIT_MEMORYDB
-/*
-** Clear a PgHistory block
-*/
-static void clearHistory(PgHistory *pHist){
- sqlite3_free(pHist->pOrig);
- sqlite3_free(pHist->pStmt);
- pHist->pOrig = 0;
- pHist->pStmt = 0;
-}
-#else
-#define clearHistory(x)
-#endif
-
-/*
-** Forward declaration
-*/
-static int syncJournal(Pager*);
-
-/*
-** Unlink pPg from its hash chain. Also set the page number to 0 to indicate
-** that the page is not part of any hash chain. This is required because the
-** sqlite3PagerMovepage() routine can leave a page in the
-** pNextFree/pPrevFree list that is not a part of any hash-chain.
-*/
-static void unlinkHashChain(Pager *pPager, PgHdr *pPg){
- if( pPg->pgno==0 ){
- assert( pPg->pNextHash==0 && pPg->pPrevHash==0 );
- return;
- }
- if( pPg->pNextHash ){
- pPg->pNextHash->pPrevHash = pPg->pPrevHash;
- }
- if( pPg->pPrevHash ){
- assert( pPager->aHash[pPg->pgno & (pPager->nHash-1)]!=pPg );
- pPg->pPrevHash->pNextHash = pPg->pNextHash;
- }else{
- int h = pPg->pgno & (pPager->nHash-1);
- pPager->aHash[h] = pPg->pNextHash;
+ /* If the current number of pages in the file is greater than the
+ ** configured maximum pager number, increase the allowed limit so
+ ** that the file can be read.
+ */
+ if( nPage>pPager->mxPgno ){
+ pPager->mxPgno = (Pgno)nPage;
}
- if( MEMDB ){
- clearHistory(PGHDR_TO_HIST(pPg, pPager));
+
+ /* Set the output variable and return SQLITE_OK */
+ if( pnPage ){
+ *pnPage = nPage;
}
- pPg->pgno = 0;
- pPg->pNextHash = pPg->pPrevHash = 0;
+ return SQLITE_OK;
}
-/*
-** Unlink a page from the free list (the list of all pages where nRef==0)
-** and from its hash collision chain.
-*/
-static void unlinkPage(PgHdr *pPg){
- Pager *pPager = pPg->pPager;
-
- /* Unlink from free page list */
- lruListRemove(pPg);
-
- /* Unlink from the pgno hash table */
- unlinkHashChain(pPager, pPg);
-}
/*
-** This routine is used to truncate the cache when a database
-** is truncated. Drop from the cache all pages whose pgno is
-** larger than pPager->dbSize and is unreferenced.
+** Try to obtain a lock of type locktype on the database file. If
+** a similar or greater lock is already held, this function is a no-op
+** (returning SQLITE_OK immediately).
**
-** Referenced pages larger than pPager->dbSize are zeroed.
-**
-** Actually, at the point this routine is called, it would be
-** an error to have a referenced page. But rather than delete
-** that page and guarantee a subsequent segfault, it seems better
-** to zero it and hope that we error out sanely.
-*/
-static void pager_truncate_cache(Pager *pPager){
- PgHdr *pPg;
- PgHdr **ppPg;
- int dbSize = pPager->dbSize;
-
- ppPg = &pPager->pAll;
- while( (pPg = *ppPg)!=0 ){
- if( pPg->pgno<=dbSize ){
- ppPg = &pPg->pNextAll;
- }else if( pPg->nRef>0 ){
- memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize);
- ppPg = &pPg->pNextAll;
- }else{
- *ppPg = pPg->pNextAll;
- IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno));
- PAGER_INCR(sqlite3_pager_pgfree_count);
- unlinkPage(pPg);
- makeClean(pPg);
- sqlite3_free(pPg->pData);
- sqlite3_free(pPg);
- pPager->nPage--;
- }
- }
-}
-
-/*
-** Try to obtain a lock on a file. Invoke the busy callback if the lock
-** is currently not available. Repeat until the busy callback returns
-** false or until the lock succeeds.
+** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke
+** the busy callback if the lock is currently not available. Repeat
+** until the busy callback returns false or until the attempt to
+** obtain the lock succeeds.
**
** Return SQLITE_OK on success and an error code if we cannot obtain
-** the lock.
+** the lock. If the lock is obtained successfully, set the Pager.state
+** variable to locktype before returning.
*/
static int pager_wait_on_lock(Pager *pPager, int locktype){
- int rc;
+ int rc; /* Return code */
/* The OS lock values must be the same as the Pager lock values */
assert( PAGER_SHARED==SHARED_LOCK );
@@ -26379,17 +33843,26 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){
assert( PAGER_EXCLUSIVE==EXCLUSIVE_LOCK );
/* If the file is currently unlocked then the size must be unknown */
- assert( pPager->state>=PAGER_SHARED || pPager->dbSize<0 || MEMDB );
+ assert( pPager->state>=PAGER_SHARED || pPager->dbSizeValid==0 );
+
+ /* Check that this is either a no-op (because the requested lock is
+ ** already held, or one of the transistions that the busy-handler
+ ** may be invoked during, according to the comment above
+ ** sqlite3PagerSetBusyhandler().
+ */
+ assert( (pPager->state>=locktype)
+ || (pPager->state==PAGER_UNLOCK && locktype==PAGER_SHARED)
+ || (pPager->state==PAGER_RESERVED && locktype==PAGER_EXCLUSIVE)
+ );
if( pPager->state>=locktype ){
rc = SQLITE_OK;
}else{
- if( pPager->pBusyHandler ) pPager->pBusyHandler->nBusy = 0;
do {
rc = sqlite3OsLock(pPager->fd, locktype);
- }while( rc==SQLITE_BUSY && sqlite3InvokeBusyHandler(pPager->pBusyHandler) );
+ }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) );
if( rc==SQLITE_OK ){
- pPager->state = locktype;
+ pPager->state = (u8)locktype;
IOTRACE(("LOCK %p %d\n", pPager, locktype))
}
}
@@ -26397,41 +33870,51 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){
}
/*
-** Truncate the file to the number of pages specified.
+** Function assertTruncateConstraint(pPager) checks that one of the
+** following is true for all dirty pages currently in the page-cache:
+**
+** a) The page number is less than or equal to the size of the
+** current database image, in pages, OR
+**
+** b) if the page content were written at this time, it would not
+** be necessary to write the current content out to the sub-journal
+** (as determined by function subjRequiresPage()).
+**
+** If the condition asserted by this function were not true, and the
+** dirty page were to be discarded from the cache via the pagerStress()
+** routine, pagerStress() would not write the current page content to
+** the database file. If a savepoint transaction were rolled back after
+** this happened, the correct behaviour would be to restore the current
+** content of the page. However, since this content is not present in either
+** the database file or the portion of the rollback journal and
+** sub-journal rolled back the content could not be restored and the
+** database image would become corrupt. It is therefore fortunate that
+** this circumstance cannot arise.
*/
-SQLITE_PRIVATE int sqlite3PagerTruncate(Pager *pPager, Pgno nPage){
- int rc;
- assert( pPager->state>=PAGER_SHARED || MEMDB );
- sqlite3PagerPagecount(pPager);
- if( pPager->errCode ){
- rc = pPager->errCode;
- return rc;
- }
- if( nPage>=(unsigned)pPager->dbSize ){
- return SQLITE_OK;
- }
- if( MEMDB ){
- pPager->dbSize = nPage;
- pager_truncate_cache(pPager);
- return SQLITE_OK;
- }
- pagerEnter(pPager);
- rc = syncJournal(pPager);
- pagerLeave(pPager);
- if( rc!=SQLITE_OK ){
- return rc;
- }
-
- /* Get an exclusive lock on the database before truncating. */
- pagerEnter(pPager);
- rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
- pagerLeave(pPager);
- if( rc!=SQLITE_OK ){
- return rc;
- }
+#if defined(SQLITE_DEBUG)
+static void assertTruncateConstraintCb(PgHdr *pPg){
+ assert( pPg->flags&PGHDR_DIRTY );
+ assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize );
+}
+static void assertTruncateConstraint(Pager *pPager){
+ sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb);
+}
+#else
+# define assertTruncateConstraint(pPager)
+#endif
- rc = pager_truncate(pPager, nPage);
- return rc;
+/*
+** Truncate the in-memory database file image to nPage pages. This
+** function does not actually modify the database file on disk. It
+** just sets the internal state of the pager object so that the
+** truncation will be done when the current transaction is committed.
+*/
+SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){
+ assert( pPager->dbSizeValid );
+ assert( pPager->dbSize>=nPage );
+ assert( pPager->state>=PAGER_RESERVED );
+ pPager->dbSize = nPage;
+ assertTruncateConstraint(pPager);
}
/*
@@ -26449,142 +33932,144 @@ SQLITE_PRIVATE int sqlite3PagerTruncate(Pager *pPager, Pgno nPage){
** to the caller.
*/
SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
- if( !MEMDB ){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2);
-#endif
- sqlite3_mutex_enter(mutex);
- if( pPager->pPrev ){
- pPager->pPrev->pNext = pPager->pNext;
- }else{
- sqlite3PagerList = pPager->pNext;
- }
- if( pPager->pNext ){
- pPager->pNext->pPrev = pPager->pPrev;
- }
- sqlite3_mutex_leave(mutex);
- }
-#endif
-
disable_simulated_io_errors();
- sqlite3FaultBeginBenign(-1);
+ sqlite3BeginBenignMalloc();
pPager->errCode = 0;
pPager->exclusiveMode = 0;
pager_reset(pPager);
- pagerUnlockAndRollback(pPager);
+ if( MEMDB ){
+ pager_unlock(pPager);
+ }else{
+ /* Set Pager.journalHdr to -1 for the benefit of the pager_playback()
+ ** call which may be made from within pagerUnlockAndRollback(). If it
+ ** is not -1, then the unsynced portion of an open journal file may
+ ** be played back into the database. If a power failure occurs while
+ ** this is happening, the database may become corrupt.
+ */
+ pPager->journalHdr = -1;
+ pagerUnlockAndRollback(pPager);
+ }
+ sqlite3EndBenignMalloc();
enable_simulated_io_errors();
- sqlite3FaultEndBenign(-1);
- PAGERTRACE2("CLOSE %d\n", PAGERID(pPager));
+ PAGERTRACE(("CLOSE %d\n", PAGERID(pPager)));
IOTRACE(("CLOSE %p\n", pPager))
- if( pPager->journalOpen ){
- sqlite3OsClose(pPager->jfd);
- }
- sqlite3BitvecDestroy(pPager->pInJournal);
- if( pPager->stmtOpen ){
- sqlite3OsClose(pPager->stfd);
- }
sqlite3OsClose(pPager->fd);
- /* Temp files are automatically deleted by the OS
- ** if( pPager->tempFile ){
- ** sqlite3OsDelete(pPager->zFilename);
- ** }
- */
+ sqlite3PageFree(pPager->pTmpSpace);
+ sqlite3PcacheClose(pPager->pPCache);
+
+#ifdef SQLITE_HAS_CODEC
+ if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
+#endif
+
+ assert( !pPager->aSavepoint && !pPager->pInJournal );
+ assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) );
- sqlite3_free(pPager->aHash);
- sqlite3_free(pPager->pTmpSpace);
sqlite3_free(pPager);
return SQLITE_OK;
}
#if !defined(NDEBUG) || defined(SQLITE_TEST)
/*
-** Return the page number for the given page data.
+** Return the page number for page pPg.
*/
-SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *p){
- return p->pgno;
+SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){
+ return pPg->pgno;
}
#endif
/*
-** The page_ref() function increments the reference count for a page.
-** If the page is currently on the freelist (the reference count is zero) then
-** remove it from the freelist.
-**
-** For non-test systems, page_ref() is a macro that calls _page_ref()
-** online of the reference count is zero. For test systems, page_ref()
-** is a real function so that we can set breakpoints and trace it.
+** Increment the reference count for page pPg.
*/
-static void _page_ref(PgHdr *pPg){
- if( pPg->nRef==0 ){
- /* The page is currently on the freelist. Remove it. */
- lruListRemove(pPg);
- pPg->pPager->nRef++;
- }
- pPg->nRef++;
-}
-#ifdef SQLITE_DEBUG
- static void page_ref(PgHdr *pPg){
- if( pPg->nRef==0 ){
- _page_ref(pPg);
- }else{
- pPg->nRef++;
- }
- }
-#else
-# define page_ref(P) ((P)->nRef==0?_page_ref(P):(void)(P)->nRef++)
-#endif
-
-/*
-** Increment the reference count for a page. The input pointer is
-** a reference to the page data.
-*/
-SQLITE_PRIVATE int sqlite3PagerRef(DbPage *pPg){
- pagerEnter(pPg->pPager);
- page_ref(pPg);
- pagerLeave(pPg->pPager);
- return SQLITE_OK;
+SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){
+ sqlite3PcacheRef(pPg);
}
/*
-** Sync the journal. In other words, make sure all the pages that have
+** Sync the journal. In other words, make sure all the pages that have
** been written to the journal have actually reached the surface of the
-** disk. It is not safe to modify the original database file until after
-** the journal has been synced. If the original database is modified before
-** the journal is synced and a power failure occurs, the unsynced journal
-** data would be lost and we would be unable to completely rollback the
-** database changes. Database corruption would occur.
-**
-** This routine also updates the nRec field in the header of the journal.
-** (See comments on the pager_playback() routine for additional information.)
-** If the sync mode is FULL, two syncs will occur. First the whole journal
-** is synced, then the nRec field is updated, then a second sync occurs.
+** disk and can be restored in the event of a hot-journal rollback.
**
-** For temporary databases, we do not care if we are able to rollback
-** after a power failure, so no sync occurs.
+** If the Pager.needSync flag is not set, then this function is a
+** no-op. Otherwise, the actions required depend on the journal-mode
+** and the device characteristics of the the file-system, as follows:
**
-** If the IOCAP_SEQUENTIAL flag is set for the persistent media on which
-** the database is stored, then OsSync() is never called on the journal
-** file. In this case all that is required is to update the nRec field in
-** the journal header.
+** * If the journal file is an in-memory journal file, no action need
+** be taken.
**
-** This routine clears the needSync field of every page current held in
-** memory.
+** * Otherwise, if the device does not support the SAFE_APPEND property,
+** then the nRec field of the most recently written journal header
+** is updated to contain the number of journal records that have
+** been written following it. If the pager is operating in full-sync
+** mode, then the journal file is synced before this field is updated.
+**
+** * If the device does not support the SEQUENTIAL property, then
+** journal file is synced.
+**
+** Or, in pseudo-code:
+**
+** if( NOT <in-memory journal> ){
+** if( NOT SAFE_APPEND ){
+** if( <full-sync mode> ) xSync(<journal file>);
+** <update nRec field>
+** }
+** if( NOT SEQUENTIAL ) xSync(<journal file>);
+** }
+**
+** The Pager.needSync flag is never be set for temporary files, or any
+** file operating in no-sync mode (Pager.noSync set to non-zero).
+**
+** If successful, this routine clears the PGHDR_NEED_SYNC flag of every
+** page currently held in memory before returning SQLITE_OK. If an IO
+** error is encountered, then the IO error code is returned to the caller.
*/
static int syncJournal(Pager *pPager){
- PgHdr *pPg;
- int rc = SQLITE_OK;
-
-
- /* Sync the journal before modifying the main database
- ** (assuming there is a journal and it needs to be synced.)
- */
if( pPager->needSync ){
- if( !pPager->tempFile ){
- int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
- assert( pPager->journalOpen );
+ assert( !pPager->tempFile );
+ if( pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){
+ int rc; /* Return code */
+ const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
+ assert( isOpen(pPager->jfd) );
if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
+ /* This block deals with an obscure problem. If the last connection
+ ** that wrote to this database was operating in persistent-journal
+ ** mode, then the journal file may at this point actually be larger
+ ** than Pager.journalOff bytes. If the next thing in the journal
+ ** file happens to be a journal-header (written as part of the
+ ** previous connections transaction), and a crash or power-failure
+ ** occurs after nRec is updated but before this connection writes
+ ** anything else to the journal file (or commits/rolls back its
+ ** transaction), then SQLite may become confused when doing the
+ ** hot-journal rollback following recovery. It may roll back all
+ ** of this connections data, then proceed to rolling back the old,
+ ** out-of-date data that follows it. Database corruption.
+ **
+ ** To work around this, if the journal file does appear to contain
+ ** a valid header following Pager.journalOff, then write a 0x00
+ ** byte to the start of it to prevent it from being recognized.
+ **
+ ** Variable iNextHdrOffset is set to the offset at which this
+ ** problematic header will occur, if it exists. aMagic is used
+ ** as a temporary buffer to inspect the first couple of bytes of
+ ** the potential journal header.
+ */
+ i64 iNextHdrOffset;
+ u8 aMagic[8];
+ u8 zHeader[sizeof(aJournalMagic)+4];
+
+ memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
+ put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec);
+
+ iNextHdrOffset = journalHdrOffset(pPager);
+ rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset);
+ if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){
+ static const u8 zerobyte = 0;
+ rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset);
+ }
+ if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
+ return rc;
+ }
+
/* Write the nRec value into the journal file header. If in
** full-synchronous mode, sync the journal first. This ensures that
** all data has really hit the disk before nRec is updated to mark
@@ -26596,145 +34081,81 @@ static int syncJournal(Pager *pPager){
** is populated with 0xFFFFFFFF when the journal header is written
** and never needs to be updated.
*/
- i64 jrnlOff;
if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
- PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager));
+ PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
IOTRACE(("JSYNC %p\n", pPager))
rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags);
- if( rc!=0 ) return rc;
+ if( rc!=SQLITE_OK ) return rc;
}
-
- jrnlOff = pPager->journalHdr + sizeof(aJournalMagic);
- IOTRACE(("JHDR %p %lld %d\n", pPager, jrnlOff, 4));
- rc = write32bits(pPager->jfd, jrnlOff, pPager->nRec);
- if( rc ) return rc;
+ IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr));
+ rc = sqlite3OsWrite(
+ pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr
+ );
+ if( rc!=SQLITE_OK ) return rc;
}
if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
- PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager));
+ PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
IOTRACE(("JSYNC %p\n", pPager))
rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags|
(pPager->sync_flags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0)
);
- if( rc!=0 ) return rc;
+ if( rc!=SQLITE_OK ) return rc;
}
- pPager->journalStarted = 1;
}
- pPager->needSync = 0;
- /* Erase the needSync flag from every page.
+ /* The journal file was just successfully synced. Set Pager.needSync
+ ** to zero and clear the PGHDR_NEED_SYNC flag on all pagess.
*/
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- pPg->needSync = 0;
- }
- lruListSetFirstSynced(pPager);
- }
-
-#ifndef NDEBUG
- /* If the Pager.needSync flag is clear then the PgHdr.needSync
- ** flag must also be clear for all pages. Verify that this
- ** invariant is true.
- */
- else{
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- assert( pPg->needSync==0 );
- }
- assert( pPager->lru.pFirstSynced==pPager->lru.pFirst );
- }
-#endif
-
- return rc;
-}
-
-/*
-** Merge two lists of pages connected by pDirty and in pgno order.
-** Do not both fixing the pPrevDirty pointers.
-*/
-static PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB){
- PgHdr result, *pTail;
- pTail = &result;
- while( pA && pB ){
- if( pA->pgno<pB->pgno ){
- pTail->pDirty = pA;
- pTail = pA;
- pA = pA->pDirty;
- }else{
- pTail->pDirty = pB;
- pTail = pB;
- pB = pB->pDirty;
- }
- }
- if( pA ){
- pTail->pDirty = pA;
- }else if( pB ){
- pTail->pDirty = pB;
- }else{
- pTail->pDirty = 0;
+ pPager->needSync = 0;
+ pPager->journalStarted = 1;
+ sqlite3PcacheClearSyncFlags(pPager->pPCache);
}
- return result.pDirty;
-}
-/*
-** Sort the list of pages in accending order by pgno. Pages are
-** connected by pDirty pointers. The pPrevDirty pointers are
-** corrupted by this sort.
-*/
-#define N_SORT_BUCKET_ALLOC 25
-#define N_SORT_BUCKET 25
-#ifdef SQLITE_TEST
- int sqlite3_pager_n_sort_bucket = 0;
- #undef N_SORT_BUCKET
- #define N_SORT_BUCKET \
- (sqlite3_pager_n_sort_bucket?sqlite3_pager_n_sort_bucket:N_SORT_BUCKET_ALLOC)
-#endif
-static PgHdr *sort_pagelist(PgHdr *pIn){
- PgHdr *a[N_SORT_BUCKET_ALLOC], *p;
- int i;
- memset(a, 0, sizeof(a));
- while( pIn ){
- p = pIn;
- pIn = p->pDirty;
- p->pDirty = 0;
- for(i=0; i<N_SORT_BUCKET-1; i++){
- if( a[i]==0 ){
- a[i] = p;
- break;
- }else{
- p = merge_pagelist(a[i], p);
- a[i] = 0;
- }
- }
- if( i==N_SORT_BUCKET-1 ){
- /* Coverage: To get here, there need to be 2^(N_SORT_BUCKET)
- ** elements in the input list. This is possible, but impractical.
- ** Testing this line is the point of global variable
- ** sqlite3_pager_n_sort_bucket.
- */
- a[i] = merge_pagelist(a[i], p);
- }
- }
- p = a[0];
- for(i=1; i<N_SORT_BUCKET; i++){
- p = merge_pagelist(p, a[i]);
- }
- return p;
+ return SQLITE_OK;
}
/*
-** Given a list of pages (connected by the PgHdr.pDirty pointer) write
-** every one of those pages out to the database file and mark them all
-** as clean.
+** The argument is the first in a linked list of dirty pages connected
+** by the PgHdr.pDirty pointer. This function writes each one of the
+** in-memory pages in the list to the database file. The argument may
+** be NULL, representing an empty list. In this case this function is
+** a no-op.
+**
+** The pager must hold at least a RESERVED lock when this function
+** is called. Before writing anything to the database file, this lock
+** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained,
+** SQLITE_BUSY is returned and no data is written to the database file.
+**
+** If the pager is a temp-file pager and the actual file-system file
+** is not yet open, it is created and opened before any data is
+** written out.
+**
+** Once the lock has been upgraded and, if necessary, the file opened,
+** the pages are written out to the database file in list order. Writing
+** a page is skipped if it meets either of the following criteria:
+**
+** * The page number is greater than Pager.dbSize, or
+** * The PGHDR_DONT_WRITE flag is set on the page.
+**
+** If writing out a page causes the database file to grow, Pager.dbFileSize
+** is updated accordingly. If page 1 is written out, then the value cached
+** in Pager.dbFileVers[] is updated to match the new value stored in
+** the database file.
+**
+** If everything is successful, SQLITE_OK is returned. If an IO error
+** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot
+** be obtained, SQLITE_BUSY is returned.
*/
static int pager_write_pagelist(PgHdr *pList){
- Pager *pPager;
- PgHdr *p;
- int rc;
+ Pager *pPager; /* Pager object */
+ int rc; /* Return code */
- if( pList==0 ) return SQLITE_OK;
+ if( NEVER(pList==0) ) return SQLITE_OK;
pPager = pList->pPager;
/* At this point there may be either a RESERVED or EXCLUSIVE lock on the
** database file. If there is already an EXCLUSIVE lock, the following
- ** calls to sqlite3OsLock() are no-ops.
+ ** call is a no-op.
**
** Moving the lock from RESERVED to EXCLUSIVE actually involves going
** through an intermediate state PENDING. A PENDING lock prevents new
@@ -26748,534 +34169,854 @@ static int pager_write_pagelist(PgHdr *pList){
** EXCLUSIVE, it means the database file has been changed and any rollback
** will require a journal playback.
*/
+ assert( pPager->state>=PAGER_RESERVED );
rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- pList = sort_pagelist(pList);
- for(p=pList; p; p=p->pDirty){
- assert( p->dirty );
- p->dirty = 0;
+ /* If the file is a temp-file has not yet been opened, open it now. It
+ ** is not possible for rc to be other than SQLITE_OK if this branch
+ ** is taken, as pager_wait_on_lock() is a no-op for temp-files.
+ */
+ if( !isOpen(pPager->fd) ){
+ assert( pPager->tempFile && rc==SQLITE_OK );
+ rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags);
}
- while( pList ){
- /* If the file has not yet been opened, open it now. */
- if( !pPager->fd->pMethods ){
- assert(pPager->tempFile);
- rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->fd, pPager->zFilename,
- pPager->vfsFlags);
- if( rc ) return rc;
- }
+ while( rc==SQLITE_OK && pList ){
+ Pgno pgno = pList->pgno;
/* If there are dirty pages in the page cache with page numbers greater
- ** than Pager.dbSize, this means sqlite3PagerTruncate() was called to
+ ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to
** make the file smaller (presumably by auto-vacuum code). Do not write
** any such pages to the file.
+ **
+ ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag
+ ** set (set by sqlite3PagerDontWrite()).
*/
- if( pList->pgno<=pPager->dbSize ){
- i64 offset = (pList->pgno-1)*(i64)pPager->pageSize;
- char *pData = CODEC2(pPager, PGHDR_TO_DATA(pList), pList->pgno, 6);
- PAGERTRACE4("STORE %d page %d hash(%08x)\n",
- PAGERID(pPager), pList->pgno, pager_pagehash(pList));
- IOTRACE(("PGOUT %p %d\n", pPager, pList->pgno));
+ if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){
+ i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */
+ char *pData; /* Data to write */
+
+ /* Encode the database */
+ CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData);
+
+ /* Write out the page data. */
rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset);
- PAGER_INCR(sqlite3_pager_writedb_count);
- PAGER_INCR(pPager->nWrite);
- if( pList->pgno==1 ){
+
+ /* If page 1 was just written, update Pager.dbFileVers to match
+ ** the value now stored in the database file. If writing this
+ ** page caused the database file to grow, update dbFileSize.
+ */
+ if( pgno==1 ){
memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers));
}
+ if( pgno>pPager->dbFileSize ){
+ pPager->dbFileSize = pgno;
+ }
+
+ /* Update any backup objects copying the contents of this pager. */
+ sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData);
+
+ PAGERTRACE(("STORE %d page %d hash(%08x)\n",
+ PAGERID(pPager), pgno, pager_pagehash(pList)));
+ IOTRACE(("PGOUT %p %d\n", pPager, pgno));
+ PAGER_INCR(sqlite3_pager_writedb_count);
+ PAGER_INCR(pPager->nWrite);
+ }else{
+ PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno));
}
-#ifndef NDEBUG
- else{
- PAGERTRACE3("NOSTORE %d page %d\n", PAGERID(pPager), pList->pgno);
- }
-#endif
- if( rc ) return rc;
#ifdef SQLITE_CHECK_PAGES
pList->pageHash = pager_pagehash(pList);
#endif
pList = pList->pDirty;
}
- return SQLITE_OK;
+
+ return rc;
}
/*
-** Collect every dirty page into a dirty list and
-** return a pointer to the head of that list. All pages are
-** collected even if they are still in use.
+** Append a record of the current state of page pPg to the sub-journal.
+** It is the callers responsibility to use subjRequiresPage() to check
+** that it is really required before calling this function.
+**
+** If successful, set the bit corresponding to pPg->pgno in the bitvecs
+** for all open savepoints before returning.
+**
+** This function returns SQLITE_OK if everything is successful, an IO
+** error code if the attempt to write to the sub-journal fails, or
+** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint
+** bitvec.
*/
-static PgHdr *pager_get_all_dirty_pages(Pager *pPager){
-
-#ifndef NDEBUG
- /* Verify the sanity of the dirty list when we are running
- ** in debugging mode. This is expensive, so do not
- ** do this on a normal build. */
- int n1 = 0;
- int n2 = 0;
- PgHdr *p;
- for(p=pPager->pAll; p; p=p->pNextAll){ if( p->dirty ) n1++; }
- for(p=pPager->pDirty; p; p=p->pDirty){ n2++; }
- assert( n1==n2 );
-#endif
+static int subjournalPage(PgHdr *pPg){
+ int rc = SQLITE_OK;
+ Pager *pPager = pPg->pPager;
+ if( isOpen(pPager->sjfd) ){
+ void *pData = pPg->pData;
+ i64 offset = pPager->nSubRec*(4+pPager->pageSize);
+ char *pData2;
- return pPager->pDirty;
+ CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
+ PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno));
+
+ assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
+ rc = write32bits(pPager->sjfd, offset, pPg->pgno);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4);
+ }
+ }
+ if( rc==SQLITE_OK ){
+ pPager->nSubRec++;
+ assert( pPager->nSavepoint>0 );
+ rc = addToSavepointBitvecs(pPager, pPg->pgno);
+ }
+ return rc;
}
+
/*
-** Return 1 if there is a hot journal on the given pager.
-** A hot journal is one that needs to be played back.
-**
-** If the current size of the database file is 0 but a journal file
-** exists, that is probably an old journal left over from a prior
-** database with the same name. Just delete the journal.
+** This function is called by the pcache layer when it has reached some
+** soft memory limit. The first argument is a pointer to a Pager object
+** (cast as a void*). The pager is always 'purgeable' (not an in-memory
+** database). The second argument is a reference to a page that is
+** currently dirty but has no outstanding references. The page
+** is always associated with the Pager object passed as the first
+** argument.
**
-** Return negative if unable to determine the status of the journal.
+** The job of this function is to make pPg clean by writing its contents
+** out to the database file, if possible. This may involve syncing the
+** journal file.
**
-** This routine does not open the journal file to examine its
-** content. Hence, the journal might contain the name of a master
-** journal file that has been deleted, and hence not be hot. Or
-** the header of the journal might be zeroed out. This routine
-** does not discover these cases of a non-hot journal - if the
-** journal file exists and is not empty this routine assumes it
-** is hot. The pager_playback() routine will discover that the
-** journal file is not really hot and will no-op.
+** If successful, sqlite3PcacheMakeClean() is called on the page and
+** SQLITE_OK returned. If an IO error occurs while trying to make the
+** page clean, the IO error code is returned. If the page cannot be
+** made clean for some other reason, but no error occurs, then SQLITE_OK
+** is returned by sqlite3PcacheMakeClean() is not called.
*/
-static int hasHotJournal(Pager *pPager){
- sqlite3_vfs *pVfs = pPager->pVfs;
- int rc;
- if( !pPager->useJournal ) return 0;
- if( !pPager->fd->pMethods ) return 0;
- rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS);
- if( rc<=0 ){
- return rc;
+static int pagerStress(void *p, PgHdr *pPg){
+ Pager *pPager = (Pager *)p;
+ int rc = SQLITE_OK;
+
+ assert( pPg->pPager==pPager );
+ assert( pPg->flags&PGHDR_DIRTY );
+
+ /* The doNotSync flag is set by the sqlite3PagerWrite() function while it
+ ** is journalling a set of two or more database pages that are stored
+ ** on the same disk sector. Syncing the journal is not allowed while
+ ** this is happening as it is important that all members of such a
+ ** set of pages are synced to disk together. So, if the page this function
+ ** is trying to make clean will require a journal sync and the doNotSync
+ ** flag is set, return without doing anything. The pcache layer will
+ ** just have to go ahead and allocate a new page buffer instead of
+ ** reusing pPg.
+ **
+ ** Similarly, if the pager has already entered the error state, do not
+ ** try to write the contents of pPg to disk.
+ */
+ if( NEVER(pPager->errCode)
+ || (pPager->doNotSync && pPg->flags&PGHDR_NEED_SYNC)
+ ){
+ return SQLITE_OK;
}
- if( sqlite3OsCheckReservedLock(pPager->fd) ){
- return 0;
+
+ /* Sync the journal file if required. */
+ if( pPg->flags&PGHDR_NEED_SYNC ){
+ rc = syncJournal(pPager);
+ if( rc==SQLITE_OK && pPager->fullSync &&
+ !(pPager->journalMode==PAGER_JOURNALMODE_MEMORY) &&
+ !(sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
+ ){
+ pPager->nRec = 0;
+ rc = writeJournalHdr(pPager);
+ }
}
- if( sqlite3PagerPagecount(pPager)==0 ){
- sqlite3OsDelete(pVfs, pPager->zJournal, 0);
- return 0;
- }else{
- return 1;
+
+ /* If the page number of this page is larger than the current size of
+ ** the database image, it may need to be written to the sub-journal.
+ ** This is because the call to pager_write_pagelist() below will not
+ ** actually write data to the file in this case.
+ **
+ ** Consider the following sequence of events:
+ **
+ ** BEGIN;
+ ** <journal page X>
+ ** <modify page X>
+ ** SAVEPOINT sp;
+ ** <shrink database file to Y pages>
+ ** pagerStress(page X)
+ ** ROLLBACK TO sp;
+ **
+ ** If (X>Y), then when pagerStress is called page X will not be written
+ ** out to the database file, but will be dropped from the cache. Then,
+ ** following the "ROLLBACK TO sp" statement, reading page X will read
+ ** data from the database file. This will be the copy of page X as it
+ ** was when the transaction started, not as it was when "SAVEPOINT sp"
+ ** was executed.
+ **
+ ** The solution is to write the current data for page X into the
+ ** sub-journal file now (if it is not already there), so that it will
+ ** be restored to its current value when the "ROLLBACK TO sp" is
+ ** executed.
+ */
+ if( NEVER(
+ rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg)
+ ) ){
+ rc = subjournalPage(pPg);
}
+
+ /* Write the contents of the page out to the database file. */
+ if( rc==SQLITE_OK ){
+ pPg->pDirty = 0;
+ rc = pager_write_pagelist(pPg);
+ }
+
+ /* Mark the page as clean. */
+ if( rc==SQLITE_OK ){
+ PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno));
+ sqlite3PcacheMakeClean(pPg);
+ }
+
+ return pager_error(pPager, rc);
}
+
/*
-** Try to find a page in the cache that can be recycled.
+** Allocate and initialize a new Pager object and put a pointer to it
+** in *ppPager. The pager should eventually be freed by passing it
+** to sqlite3PagerClose().
+**
+** The zFilename argument is the path to the database file to open.
+** If zFilename is NULL then a randomly-named temporary file is created
+** and used as the file to be cached. Temporary files are be deleted
+** automatically when they are closed. If zFilename is ":memory:" then
+** all information is held in cache. It is never written to disk.
+** This can be used to implement an in-memory database.
+**
+** The nExtra parameter specifies the number of bytes of space allocated
+** along with each page reference. This space is available to the user
+** via the sqlite3PagerGetExtra() API.
+**
+** The flags argument is used to specify properties that affect the
+** operation of the pager. It should be passed some bitwise combination
+** of the PAGER_OMIT_JOURNAL and PAGER_NO_READLOCK flags.
**
-** This routine may return SQLITE_IOERR, SQLITE_FULL or SQLITE_OK. It
-** does not set the pPager->errCode variable.
+** The vfsFlags parameter is a bitmask to pass to the flags parameter
+** of the xOpen() method of the supplied VFS when opening files.
+**
+** If the pager object is allocated and the specified file opened
+** successfully, SQLITE_OK is returned and *ppPager set to point to
+** the new pager object. If an error occurs, *ppPager is set to NULL
+** and error code returned. This function may return SQLITE_NOMEM
+** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or
+** various SQLITE_IO_XXX errors.
*/
-static int pager_recycle(Pager *pPager, PgHdr **ppPg){
- PgHdr *pPg;
- *ppPg = 0;
-
- /* It is illegal to call this function unless the pager object
- ** pointed to by pPager has at least one free page (page with nRef==0).
- */
- assert(!MEMDB);
- assert(pPager->lru.pFirst);
+SQLITE_PRIVATE int sqlite3PagerOpen(
+ sqlite3_vfs *pVfs, /* The virtual file system to use */
+ Pager **ppPager, /* OUT: Return the Pager structure here */
+ const char *zFilename, /* Name of the database file to open */
+ int nExtra, /* Extra bytes append to each in-memory page */
+ int flags, /* flags controlling this file */
+ int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */
+ void (*xReinit)(DbPage*) /* Function to reinitialize pages */
+){
+ u8 *pPtr;
+ Pager *pPager = 0; /* Pager object to allocate and return */
+ int rc = SQLITE_OK; /* Return code */
+ int tempFile = 0; /* True for temp files (incl. in-memory files) */
+ int memDb = 0; /* True if this is an in-memory file */
+ int readOnly = 0; /* True if this is a read-only file */
+ int journalFileSize; /* Bytes to allocate for each journal fd */
+ char *zPathname = 0; /* Full path to database file */
+ int nPathname = 0; /* Number of bytes in zPathname */
+ int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */
+ int noReadlock = (flags & PAGER_NO_READLOCK)!=0; /* True to omit read-lock */
+ int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */
+ u16 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */
+
+ /* Figure out how much space is required for each journal file-handle
+ ** (there are two of them, the main journal and the sub-journal). This
+ ** is the maximum space required for an in-memory journal file handle
+ ** and a regular journal file-handle. Note that a "regular journal-handle"
+ ** may be a wrapper capable of caching the first portion of the journal
+ ** file in memory to implement the atomic-write optimization (see
+ ** source file journal.c).
+ */
+ if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){
+ journalFileSize = ROUND8(sqlite3JournalSize(pVfs));
+ }else{
+ journalFileSize = ROUND8(sqlite3MemJournalSize());
+ }
- /* Find a page to recycle. Try to locate a page that does not
- ** require us to do an fsync() on the journal.
- */
- pPg = pPager->lru.pFirstSynced;
+ /* Set the output variable to NULL in case an error occurs. */
+ *ppPager = 0;
- /* If we could not find a page that does not require an fsync()
- ** on the journal file then fsync the journal file. This is a
- ** very slow operation, so we work hard to avoid it. But sometimes
- ** it can't be helped.
+ /* Compute and store the full pathname in an allocated buffer pointed
+ ** to by zPathname, length nPathname. Or, if this is a temporary file,
+ ** leave both nPathname and zPathname set to 0.
*/
- if( pPg==0 && pPager->lru.pFirst){
- int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
- int rc = syncJournal(pPager);
- if( rc!=0 ){
- return rc;
+ if( zFilename && zFilename[0] ){
+ nPathname = pVfs->mxPathname+1;
+ zPathname = sqlite3Malloc(nPathname*2);
+ if( zPathname==0 ){
+ return SQLITE_NOMEM;
}
- if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
- /* If in full-sync mode, write a new journal header into the
- ** journal file. This is done to avoid ever modifying a journal
- ** header that is involved in the rollback of pages that have
- ** already been written to the database (in case the header is
- ** trashed when the nRec field is updated).
+#ifndef SQLITE_OMIT_MEMORYDB
+ if( strcmp(zFilename,":memory:")==0 ){
+ memDb = 1;
+ zPathname[0] = 0;
+ }else
+#endif
+ {
+ zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */
+ rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname);
+ }
+
+ nPathname = sqlite3Strlen30(zPathname);
+ if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){
+ /* This branch is taken when the journal path required by
+ ** the database being opened will be more than pVfs->mxPathname
+ ** bytes in length. This means the database cannot be opened,
+ ** as it will not be possible to open the journal file or even
+ ** check for a hot-journal before reading.
*/
- pPager->nRec = 0;
- assert( pPager->journalOff > 0 );
- assert( pPager->doNotSync==0 );
- rc = writeJournalHdr(pPager);
- if( rc!=0 ){
- return rc;
- }
+ rc = SQLITE_CANTOPEN;
+ }
+ if( rc!=SQLITE_OK ){
+ sqlite3_free(zPathname);
+ return rc;
}
- pPg = pPager->lru.pFirst;
}
- assert( pPg->nRef==0 );
+ /* Allocate memory for the Pager structure, PCache object, the
+ ** three file descriptors, the database file name and the journal
+ ** file name. The layout in memory is as follows:
+ **
+ ** Pager object (sizeof(Pager) bytes)
+ ** PCache object (sqlite3PcacheSize() bytes)
+ ** Database file handle (pVfs->szOsFile bytes)
+ ** Sub-journal file handle (journalFileSize bytes)
+ ** Main journal file handle (journalFileSize bytes)
+ ** Database file name (nPathname+1 bytes)
+ ** Journal file name (nPathname+8+1 bytes)
+ */
+ pPtr = (u8 *)sqlite3MallocZero(
+ ROUND8(sizeof(*pPager)) + /* Pager structure */
+ ROUND8(pcacheSize) + /* PCache object */
+ ROUND8(pVfs->szOsFile) + /* The main db file */
+ journalFileSize * 2 + /* The two journal files */
+ nPathname + 1 + /* zFilename */
+ nPathname + 8 + 1 /* zJournal */
+ );
+ assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) );
+ if( !pPtr ){
+ sqlite3_free(zPathname);
+ return SQLITE_NOMEM;
+ }
+ pPager = (Pager*)(pPtr);
+ pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager)));
+ pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize));
+ pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile));
+ pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize);
+ pPager->zFilename = (char*)(pPtr += journalFileSize);
+ assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) );
+
+ /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */
+ if( zPathname ){
+ pPager->zJournal = (char*)(pPtr += nPathname + 1);
+ memcpy(pPager->zFilename, zPathname, nPathname);
+ memcpy(pPager->zJournal, zPathname, nPathname);
+ memcpy(&pPager->zJournal[nPathname], "-journal", 8);
+ if( pPager->zFilename[0]==0 ) pPager->zJournal[0] = 0;
+ sqlite3_free(zPathname);
+ }
+ pPager->pVfs = pVfs;
+ pPager->vfsFlags = vfsFlags;
- /* Write the page to the database file if it is dirty.
+ /* Open the pager file.
*/
- if( pPg->dirty ){
- int rc;
- assert( pPg->needSync==0 );
- makeClean(pPg);
- pPg->dirty = 1;
- pPg->pDirty = 0;
- rc = pager_write_pagelist( pPg );
- pPg->dirty = 0;
- if( rc!=SQLITE_OK ){
- return rc;
+ if( zFilename && zFilename[0] && !memDb ){
+ int fout = 0; /* VFS flags returned by xOpen() */
+ rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
+ readOnly = (fout&SQLITE_OPEN_READONLY);
+
+ /* If the file was successfully opened for read/write access,
+ ** choose a default page size in case we have to create the
+ ** database file. The default page size is the maximum of:
+ **
+ ** + SQLITE_DEFAULT_PAGE_SIZE,
+ ** + The value returned by sqlite3OsSectorSize()
+ ** + The largest page size that can be written atomically.
+ */
+ if( rc==SQLITE_OK && !readOnly ){
+ setSectorSize(pPager);
+ assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE);
+ if( szPageDflt<pPager->sectorSize ){
+ if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
+ szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
+ }else{
+ szPageDflt = (u16)pPager->sectorSize;
+ }
+ }
+#ifdef SQLITE_ENABLE_ATOMIC_WRITE
+ {
+ int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
+ int ii;
+ assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
+ assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
+ assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536);
+ for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){
+ if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){
+ szPageDflt = ii;
+ }
+ }
+ }
+#endif
}
+ }else{
+ /* If a temporary file is requested, it is not opened immediately.
+ ** In this case we accept the default page size and delay actually
+ ** opening the file until the first call to OsWrite().
+ **
+ ** This branch is also run for an in-memory database. An in-memory
+ ** database is the same as a temp-file that is never written out to
+ ** disk and uses an in-memory rollback journal.
+ */
+ tempFile = 1;
+ pPager->state = PAGER_EXCLUSIVE;
+ readOnly = (vfsFlags&SQLITE_OPEN_READONLY);
}
- assert( pPg->dirty==0 );
- /* If the page we are recycling is marked as alwaysRollback, then
- ** set the global alwaysRollback flag, thus disabling the
- ** sqlite3PagerDontRollback() optimization for the rest of this transaction.
- ** It is necessary to do this because the page marked alwaysRollback
- ** might be reloaded at a later time but at that point we won't remember
- ** that is was marked alwaysRollback. This means that all pages must
- ** be marked as alwaysRollback from here on out.
+ /* The following call to PagerSetPagesize() serves to set the value of
+ ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer.
*/
- if( pPg->alwaysRollback ){
- IOTRACE(("ALWAYS_ROLLBACK %p\n", pPager))
- pPager->alwaysRollback = 1;
+ if( rc==SQLITE_OK ){
+ assert( pPager->memDb==0 );
+ rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1);
+ testcase( rc!=SQLITE_OK );
}
- /* Unlink the old page from the free list and the hash table
+ /* If an error occurred in either of the blocks above, free the
+ ** Pager structure and close the file.
*/
- unlinkPage(pPg);
- assert( pPg->pgno==0 );
+ if( rc!=SQLITE_OK ){
+ assert( !pPager->pTmpSpace );
+ sqlite3OsClose(pPager->fd);
+ sqlite3_free(pPager);
+ return rc;
+ }
+
+ /* Initialize the PCache object. */
+ assert( nExtra<1000 );
+ nExtra = ROUND8(nExtra);
+ sqlite3PcacheOpen(szPageDflt, nExtra, !memDb,
+ !memDb?pagerStress:0, (void *)pPager, pPager->pPCache);
+
+ PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename));
+ IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename))
- *ppPg = pPg;
+ pPager->useJournal = (u8)useJournal;
+ pPager->noReadlock = (noReadlock && readOnly) ?1:0;
+ /* pPager->stmtOpen = 0; */
+ /* pPager->stmtInUse = 0; */
+ /* pPager->nRef = 0; */
+ pPager->dbSizeValid = (u8)memDb;
+ /* pPager->stmtSize = 0; */
+ /* pPager->stmtJSize = 0; */
+ /* pPager->nPage = 0; */
+ pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
+ /* pPager->state = PAGER_UNLOCK; */
+ assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) );
+ /* pPager->errMask = 0; */
+ pPager->tempFile = (u8)tempFile;
+ assert( tempFile==PAGER_LOCKINGMODE_NORMAL
+ || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE );
+ assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 );
+ pPager->exclusiveMode = (u8)tempFile;
+ pPager->changeCountDone = pPager->tempFile;
+ pPager->memDb = (u8)memDb;
+ pPager->readOnly = (u8)readOnly;
+ /* pPager->needSync = 0; */
+ assert( useJournal || pPager->tempFile );
+ pPager->noSync = pPager->tempFile;
+ pPager->fullSync = pPager->noSync ?0:1;
+ pPager->sync_flags = SQLITE_SYNC_NORMAL;
+ /* pPager->pFirst = 0; */
+ /* pPager->pFirstSynced = 0; */
+ /* pPager->pLast = 0; */
+ pPager->nExtra = (u16)nExtra;
+ pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT;
+ assert( isOpen(pPager->fd) || tempFile );
+ setSectorSize(pPager);
+ if( !useJournal ){
+ pPager->journalMode = PAGER_JOURNALMODE_OFF;
+ }else if( memDb ){
+ pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
+ }
+ /* pPager->xBusyHandler = 0; */
+ /* pPager->pBusyHandlerArg = 0; */
+ pPager->xReiniter = xReinit;
+ /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
+ *ppPager = pPager;
return SQLITE_OK;
}
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
+
+
/*
-** This function is called to free superfluous dynamically allocated memory
-** held by the pager system. Memory in use by any SQLite pager allocated
-** by the current thread may be sqlite3_free()ed.
+** This function is called after transitioning from PAGER_UNLOCK to
+** PAGER_SHARED state. It tests if there is a hot journal present in
+** the file-system for the given pager. A hot journal is one that
+** needs to be played back. According to this function, a hot-journal
+** file exists if the following criteria are met:
**
-** nReq is the number of bytes of memory required. Once this much has
-** been released, the function returns. The return value is the total number
-** of bytes of memory released.
+** * The journal file exists in the file system, and
+** * No process holds a RESERVED or greater lock on the database file, and
+** * The database file itself is greater than 0 bytes in size, and
+** * The first byte of the journal file exists and is not 0x00.
+**
+** If the current size of the database file is 0 but a journal file
+** exists, that is probably an old journal left over from a prior
+** database with the same name. In this case the journal file is
+** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK
+** is returned.
+**
+** This routine does not check if there is a master journal filename
+** at the end of the file. If there is, and that master journal file
+** does not exist, then the journal file is not really hot. In this
+** case this routine will return a false-positive. The pager_playback()
+** routine will discover that the journal file is not really hot and
+** will not roll it back.
+**
+** If a hot-journal file is found to exist, *pExists is set to 1 and
+** SQLITE_OK returned. If no hot-journal file is present, *pExists is
+** set to 0 and SQLITE_OK returned. If an IO error occurs while trying
+** to determine whether or not a hot-journal file exists, the IO error
+** code is returned and the value of *pExists is undefined.
*/
-SQLITE_PRIVATE int sqlite3PagerReleaseMemory(int nReq){
- int nReleased = 0; /* Bytes of memory released so far */
- Pager *pPager; /* For looping over pagers */
- BusyHandler *savedBusy; /* Saved copy of the busy handler */
- int rc = SQLITE_OK;
-
- /* Acquire the memory-management mutex
- */
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex; /* The MEM2 mutex */
- mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2);
-#endif
- sqlite3_mutex_enter(mutex);
-
- /* Signal all database connections that memory management wants
- ** to have access to the pagers.
- */
- for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){
- pPager->iInUseMM = 1;
- }
-
- while( rc==SQLITE_OK && (nReq<0 || nReleased<nReq) ){
- PgHdr *pPg;
- PgHdr *pRecycled;
-
- /* Try to find a page to recycle that does not require a sync(). If
- ** this is not possible, find one that does require a sync().
- */
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
- pPg = sqlite3LruPageList.pFirstSynced;
- while( pPg && (pPg->needSync || pPg->pPager->iInUseDB) ){
- pPg = pPg->gfree.pNext;
- }
- if( !pPg ){
- pPg = sqlite3LruPageList.pFirst;
- while( pPg && pPg->pPager->iInUseDB ){
- pPg = pPg->gfree.pNext;
- }
- }
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU));
+static int hasHotJournal(Pager *pPager, int *pExists){
+ sqlite3_vfs * const pVfs = pPager->pVfs;
+ int rc; /* Return code */
+ int exists; /* True if a journal file is present */
- /* If pPg==0, then the block above has failed to find a page to
- ** recycle. In this case return early - no further memory will
- ** be released.
+ assert( pPager!=0 );
+ assert( pPager->useJournal );
+ assert( isOpen(pPager->fd) );
+ assert( !isOpen(pPager->jfd) );
+ assert( pPager->state <= PAGER_SHARED );
+
+ *pExists = 0;
+ rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists);
+ if( rc==SQLITE_OK && exists ){
+ int locked; /* True if some process holds a RESERVED lock */
+
+ /* Race condition here: Another process might have been holding the
+ ** the RESERVED lock and have a journal open at the sqlite3OsAccess()
+ ** call above, but then delete the journal and drop the lock before
+ ** we get to the following sqlite3OsCheckReservedLock() call. If that
+ ** is the case, this routine might think there is a hot journal when
+ ** in fact there is none. This results in a false-positive which will
+ ** be dealt with by the playback routine. Ticket #3883.
*/
- if( !pPg ) break;
-
- pPager = pPg->pPager;
- assert(!pPg->needSync || pPg==pPager->lru.pFirst);
- assert(pPg->needSync || pPg==pPager->lru.pFirstSynced);
-
- savedBusy = pPager->pBusyHandler;
- pPager->pBusyHandler = 0;
- rc = pager_recycle(pPager, &pRecycled);
- pPager->pBusyHandler = savedBusy;
- assert(pRecycled==pPg || rc!=SQLITE_OK);
- if( rc==SQLITE_OK ){
- /* We've found a page to free. At this point the page has been
- ** removed from the page hash-table, free-list and synced-list
- ** (pFirstSynced). It is still in the all pages (pAll) list.
- ** Remove it from this list before freeing.
- **
- ** Todo: Check the Pager.pStmt list to make sure this is Ok. It
- ** probably is though.
+ rc = sqlite3OsCheckReservedLock(pPager->fd, &locked);
+ if( rc==SQLITE_OK && !locked ){
+ int nPage;
+
+ /* Check the size of the database file. If it consists of 0 pages,
+ ** then delete the journal file. See the header comment above for
+ ** the reasoning here. Delete the obsolete journal file under
+ ** a RESERVED lock to avoid race conditions and to avoid violating
+ ** [H33020].
*/
- PgHdr *pTmp;
- assert( pPg );
- if( pPg==pPager->pAll ){
- pPager->pAll = pPg->pNextAll;
- }else{
- for( pTmp=pPager->pAll; pTmp->pNextAll!=pPg; pTmp=pTmp->pNextAll ){}
- pTmp->pNextAll = pPg->pNextAll;
+ rc = sqlite3PagerPagecount(pPager, &nPage);
+ if( rc==SQLITE_OK ){
+ if( nPage==0 ){
+ sqlite3BeginBenignMalloc();
+ if( sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){
+ sqlite3OsDelete(pVfs, pPager->zJournal, 0);
+ sqlite3OsUnlock(pPager->fd, SHARED_LOCK);
+ }
+ sqlite3EndBenignMalloc();
+ }else{
+ /* The journal file exists and no other connection has a reserved
+ ** or greater lock on the database file. Now check that there is
+ ** at least one non-zero bytes at the start of the journal file.
+ ** If there is, then we consider this journal to be hot. If not,
+ ** it can be ignored.
+ */
+ int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL;
+ rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f);
+ if( rc==SQLITE_OK ){
+ u8 first = 0;
+ rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0);
+ if( rc==SQLITE_IOERR_SHORT_READ ){
+ rc = SQLITE_OK;
+ }
+ sqlite3OsClose(pPager->jfd);
+ *pExists = (first!=0);
+ }else if( rc==SQLITE_CANTOPEN ){
+ /* If we cannot open the rollback journal file in order to see if
+ ** its has a zero header, that might be due to an I/O error, or
+ ** it might be due to the race condition described above and in
+ ** ticket #3883. Either way, assume that the journal is hot.
+ ** This might be a false positive. But if it is, then the
+ ** automatic journal playback and recovery mechanism will deal
+ ** with it under an EXCLUSIVE lock where we do not need to
+ ** worry so much with race conditions.
+ */
+ *pExists = 1;
+ rc = SQLITE_OK;
+ }
+ }
}
- nReleased += (
- sizeof(*pPg) + pPager->pageSize
- + sizeof(u32) + pPager->nExtra
- + MEMDB*sizeof(PgHistory)
- );
- IOTRACE(("PGFREE %p %d *\n", pPager, pPg->pgno));
- PAGER_INCR(sqlite3_pager_pgfree_count);
- sqlite3_free(pPg->pData);
- sqlite3_free(pPg);
- pPager->nPage--;
- }else{
- /* An error occured whilst writing to the database file or
- ** journal in pager_recycle(). The error is not returned to the
- ** caller of this function. Instead, set the Pager.errCode variable.
- ** The error will be returned to the user (or users, in the case
- ** of a shared pager cache) of the pager for which the error occured.
- */
- assert(
- (rc&0xff)==SQLITE_IOERR ||
- rc==SQLITE_FULL ||
- rc==SQLITE_BUSY
- );
- assert( pPager->state>=PAGER_RESERVED );
- pager_error(pPager, rc);
}
}
- /* Clear the memory management flags and release the mutex
- */
- for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){
- pPager->iInUseMM = 0;
- }
- sqlite3_mutex_leave(mutex);
-
- /* Return the number of bytes released
- */
- return nReleased;
+ return rc;
}
-#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
/*
-** Read the content of page pPg out of the database file.
+** Read the content for page pPg out of the database file and into
+** pPg->pData. A shared lock or greater must be held on the database
+** file before this function is called.
+**
+** If page 1 is read, then the value of Pager.dbFileVers[] is set to
+** the value read from the database file.
+**
+** If an IO error occurs, then the IO error is returned to the caller.
+** Otherwise, SQLITE_OK is returned.
*/
-static int readDbPage(Pager *pPager, PgHdr *pPg, Pgno pgno){
- int rc;
- i64 offset;
- assert( MEMDB==0 );
- assert(pPager->fd->pMethods||pPager->tempFile);
- if( !pPager->fd->pMethods ){
- return SQLITE_IOERR_SHORT_READ;
+static int readDbPage(PgHdr *pPg){
+ Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */
+ Pgno pgno = pPg->pgno; /* Page number to read */
+ int rc; /* Return code */
+ i64 iOffset; /* Byte offset of file to read from */
+
+ assert( pPager->state>=PAGER_SHARED && !MEMDB );
+ assert( isOpen(pPager->fd) );
+
+ if( NEVER(!isOpen(pPager->fd)) ){
+ assert( pPager->tempFile );
+ memset(pPg->pData, 0, pPager->pageSize);
+ return SQLITE_OK;
}
- offset = (pgno-1)*(i64)pPager->pageSize;
- rc = sqlite3OsRead(pPager->fd, PGHDR_TO_DATA(pPg), pPager->pageSize, offset);
+ iOffset = (pgno-1)*(i64)pPager->pageSize;
+ rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset);
+ if( rc==SQLITE_IOERR_SHORT_READ ){
+ rc = SQLITE_OK;
+ }
+ if( pgno==1 ){
+ u8 *dbFileVers = &((u8*)pPg->pData)[24];
+ memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers));
+ }
+ CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM);
+
PAGER_INCR(sqlite3_pager_readdb_count);
PAGER_INCR(pPager->nRead);
IOTRACE(("PGIN %p %d\n", pPager, pgno));
- if( pgno==1 ){
- memcpy(&pPager->dbFileVers, &((u8*)PGHDR_TO_DATA(pPg))[24],
- sizeof(pPager->dbFileVers));
- }
- CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3);
- PAGERTRACE4("FETCH %d page %d hash(%08x)\n",
- PAGERID(pPager), pPg->pgno, pager_pagehash(pPg));
+ PAGERTRACE(("FETCH %d page %d hash(%08x)\n",
+ PAGERID(pPager), pgno, pager_pagehash(pPg)));
+
return rc;
}
-
/*
-** This function is called to obtain the shared lock required before
-** data may be read from the pager cache. If the shared lock has already
-** been obtained, this function is a no-op.
+** This function is called to obtain a shared lock on the database file.
+** It is illegal to call sqlite3PagerAcquire() until after this function
+** has been successfully called. If a shared-lock is already held when
+** this function is called, it is a no-op.
+**
+** The following operations are also performed by this function.
+**
+** 1) If the pager is currently in PAGER_UNLOCK state (no lock held
+** on the database file), then an attempt is made to obtain a
+** SHARED lock on the database file. Immediately after obtaining
+** the SHARED lock, the file-system is checked for a hot-journal,
+** which is played back if present. Following any hot-journal
+** rollback, the contents of the cache are validated by checking
+** the 'change-counter' field of the database file header and
+** discarded if they are found to be invalid.
**
-** Immediately after obtaining the shared lock (if required), this function
-** checks for a hot-journal file. If one is found, an emergency rollback
-** is performed immediately.
+** 2) If the pager is running in exclusive-mode, and there are currently
+** no outstanding references to any pages, and is in the error state,
+** then an attempt is made to clear the error state by discarding
+** the contents of the page cache and rolling back any open journal
+** file.
+**
+** If the operation described by (2) above is not attempted, and if the
+** pager is in an error state other than SQLITE_FULL when this is called,
+** the error state error code is returned. It is permitted to read the
+** database when in SQLITE_FULL error state.
+**
+** Otherwise, if everything is successful, SQLITE_OK is returned. If an
+** IO error occurs while locking the database, checking for a hot-journal
+** file or rolling back a journal file, the IO error code is returned.
*/
-static int pagerSharedLock(Pager *pPager){
- int rc = SQLITE_OK;
- int isHot = 0;
+SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
+ int rc = SQLITE_OK; /* Return code */
+ int isErrorReset = 0; /* True if recovering from error state */
- /* If this database is opened for exclusive access, has no outstanding
- ** page references and is in an error-state, now is the chance to clear
- ** the error. Discard the contents of the pager-cache and treat any
- ** open journal file as a hot-journal.
+ /* This routine is only called from b-tree and only when there are no
+ ** outstanding pages */
+ assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
+ if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; }
+
+ /* If this database is in an error-state, now is a chance to clear
+ ** the error. Discard the contents of the pager-cache and rollback
+ ** any hot journal in the file-system.
*/
- if( !MEMDB && pPager->exclusiveMode && pPager->nRef==0 && pPager->errCode ){
- if( pPager->journalOpen ){
- isHot = 1;
+ if( pPager->errCode ){
+ if( isOpen(pPager->jfd) || pPager->zJournal ){
+ isErrorReset = 1;
}
pPager->errCode = SQLITE_OK;
pager_reset(pPager);
}
- /* If the pager is still in an error state, do not proceed. The error
- ** state will be cleared at some point in the future when all page
- ** references are dropped and the cache can be discarded.
- */
- if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
- return pPager->errCode;
- }
-
- if( pPager->state==PAGER_UNLOCK || isHot ){
- sqlite3_vfs *pVfs = pPager->pVfs;
- if( !MEMDB ){
- assert( pPager->nRef==0 );
- if( !pPager->noReadlock ){
- rc = pager_wait_on_lock(pPager, SHARED_LOCK);
- if( rc!=SQLITE_OK ){
- assert( pPager->state==PAGER_UNLOCK );
- return pager_error(pPager, rc);
- }
- assert( pPager->state>=SHARED_LOCK );
+ if( pPager->state==PAGER_UNLOCK || isErrorReset ){
+ sqlite3_vfs * const pVfs = pPager->pVfs;
+ int isHotJournal = 0;
+ assert( !MEMDB );
+ assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
+ if( pPager->noReadlock ){
+ assert( pPager->readOnly );
+ pPager->state = PAGER_SHARED;
+ }else{
+ rc = pager_wait_on_lock(pPager, SHARED_LOCK);
+ if( rc!=SQLITE_OK ){
+ assert( pPager->state==PAGER_UNLOCK );
+ return pager_error(pPager, rc);
}
-
- /* If a journal file exists, and there is no RESERVED lock on the
- ** database file, then it either needs to be played back or deleted.
- */
- rc = hasHotJournal(pPager);
- if( rc<0 ){
- rc = SQLITE_IOERR_NOMEM;
+ }
+ assert( pPager->state>=SHARED_LOCK );
+
+ /* If a journal file exists, and there is no RESERVED lock on the
+ ** database file, then it either needs to be played back or deleted.
+ */
+ if( !isErrorReset ){
+ assert( pPager->state <= PAGER_SHARED );
+ rc = hasHotJournal(pPager, &isHotJournal);
+ if( rc!=SQLITE_OK ){
goto failed;
}
- if( rc==1 || isHot ){
- /* Get an EXCLUSIVE lock on the database file. At this point it is
- ** important that a RESERVED lock is not obtained on the way to the
- ** EXCLUSIVE lock. If it were, another process might open the
- ** database file, detect the RESERVED lock, and conclude that the
- ** database is safe to read while this process is still rolling it
- ** back.
- **
- ** Because the intermediate RESERVED lock is not requested, the
- ** second process will get to this point in the code and fail to
- ** obtain its own EXCLUSIVE lock on the database file.
- */
- if( pPager->state<EXCLUSIVE_LOCK ){
- rc = sqlite3OsLock(pPager->fd, EXCLUSIVE_LOCK);
- if( rc!=SQLITE_OK ){
- rc = pager_error(pPager, rc);
- goto failed;
- }
- pPager->state = PAGER_EXCLUSIVE;
+ }
+ if( isErrorReset || isHotJournal ){
+ /* Get an EXCLUSIVE lock on the database file. At this point it is
+ ** important that a RESERVED lock is not obtained on the way to the
+ ** EXCLUSIVE lock. If it were, another process might open the
+ ** database file, detect the RESERVED lock, and conclude that the
+ ** database is safe to read while this process is still rolling the
+ ** hot-journal back.
+ **
+ ** Because the intermediate RESERVED lock is not requested, any
+ ** other process attempting to access the database file will get to
+ ** this point in the code and fail to obtain its own EXCLUSIVE lock
+ ** on the database file.
+ */
+ if( pPager->state<EXCLUSIVE_LOCK ){
+ rc = sqlite3OsLock(pPager->fd, EXCLUSIVE_LOCK);
+ if( rc!=SQLITE_OK ){
+ rc = pager_error(pPager, rc);
+ goto failed;
}
+ pPager->state = PAGER_EXCLUSIVE;
+ }
- /* Open the journal for read/write access. This is because in
- ** exclusive-access mode the file descriptor will be kept open and
- ** possibly used for a transaction later on. On some systems, the
- ** OsTruncate() call used in exclusive-access mode also requires
- ** a read/write file handle.
- */
- if( !isHot && pPager->journalOpen==0 ){
- int res = sqlite3OsAccess(pVfs,pPager->zJournal,SQLITE_ACCESS_EXISTS);
- if( res==1 ){
+ /* Open the journal for read/write access. This is because in
+ ** exclusive-access mode the file descriptor will be kept open and
+ ** possibly used for a transaction later on. On some systems, the
+ ** OsTruncate() call used in exclusive-access mode also requires
+ ** a read/write file handle.
+ */
+ if( !isOpen(pPager->jfd) ){
+ int res;
+ rc = sqlite3OsAccess(pVfs,pPager->zJournal,SQLITE_ACCESS_EXISTS,&res);
+ if( rc==SQLITE_OK ){
+ if( res ){
int fout = 0;
int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
assert( !pPager->tempFile );
rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
- assert( rc!=SQLITE_OK || pPager->jfd->pMethods );
- if( fout&SQLITE_OPEN_READONLY ){
- rc = SQLITE_BUSY;
+ assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
+ if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){
+ rc = SQLITE_CANTOPEN;
sqlite3OsClose(pPager->jfd);
}
- }else if( res==0 ){
- /* If the journal does not exist, that means some other process
- ** has already rolled it back */
- rc = SQLITE_BUSY;
}else{
- /* If sqlite3OsAccess() returns a negative value, that means it
- ** failed a memory allocation */
- rc = SQLITE_IOERR_NOMEM;
+ /* If the journal does not exist, it usually means that some
+ ** other connection managed to get in and roll it back before
+ ** this connection obtained the exclusive lock above. Or, it
+ ** may mean that the pager was in the error-state when this
+ ** function was called and the journal file does not exist. */
+ rc = pager_end_transaction(pPager, 0);
}
}
- if( rc!=SQLITE_OK ){
- if( rc!=SQLITE_NOMEM && rc!=SQLITE_IOERR_UNLOCK
- && rc!=SQLITE_IOERR_NOMEM
- ){
- rc = SQLITE_BUSY;
- }
- goto failed;
- }
- pPager->journalOpen = 1;
- pPager->journalStarted = 0;
- pPager->journalOff = 0;
- pPager->setMaster = 0;
- pPager->journalHdr = 0;
+ }
+ if( rc!=SQLITE_OK ){
+ goto failed;
+ }
+
+ /* TODO: Why are these cleared here? Is it necessary? */
+ pPager->journalStarted = 0;
+ pPager->journalOff = 0;
+ pPager->setMaster = 0;
+ pPager->journalHdr = 0;
- /* Playback and delete the journal. Drop the database write
- ** lock and reacquire the read lock.
- */
+ /* Playback and delete the journal. Drop the database write
+ ** lock and reacquire the read lock. Purge the cache before
+ ** playing back the hot-journal so that we don't end up with
+ ** an inconsistent cache.
+ */
+ if( isOpen(pPager->jfd) ){
rc = pager_playback(pPager, 1);
if( rc!=SQLITE_OK ){
rc = pager_error(pPager, rc);
goto failed;
}
- assert(pPager->state==PAGER_SHARED ||
- (pPager->exclusiveMode && pPager->state>PAGER_SHARED)
- );
}
+ assert( (pPager->state==PAGER_SHARED)
+ || (pPager->exclusiveMode && pPager->state>PAGER_SHARED)
+ );
+ }
- if( pPager->pAll ){
- /* The shared-lock has just been acquired on the database file
- ** and there are already pages in the cache (from a previous
- ** read or write transaction). Check to see if the database
- ** has been modified. If the database has changed, flush the
- ** cache.
- **
- ** Database changes is detected by looking at 15 bytes beginning
- ** at offset 24 into the file. The first 4 of these 16 bytes are
- ** a 32-bit counter that is incremented with each change. The
- ** other bytes change randomly with each file change when
- ** a codec is in use.
- **
- ** There is a vanishingly small chance that a change will not be
- ** detected. The chance of an undetected change is so small that
- ** it can be neglected.
- */
- char dbFileVers[sizeof(pPager->dbFileVers)];
- sqlite3PagerPagecount(pPager);
+ if( pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0 ){
+ /* The shared-lock has just been acquired on the database file
+ ** and there are already pages in the cache (from a previous
+ ** read or write transaction). Check to see if the database
+ ** has been modified. If the database has changed, flush the
+ ** cache.
+ **
+ ** Database changes is detected by looking at 15 bytes beginning
+ ** at offset 24 into the file. The first 4 of these 16 bytes are
+ ** a 32-bit counter that is incremented with each change. The
+ ** other bytes change randomly with each file change when
+ ** a codec is in use.
+ **
+ ** There is a vanishingly small chance that a change will not be
+ ** detected. The chance of an undetected change is so small that
+ ** it can be neglected.
+ */
+ char dbFileVers[sizeof(pPager->dbFileVers)];
+ sqlite3PagerPagecount(pPager, 0);
- if( pPager->errCode ){
- rc = pPager->errCode;
- goto failed;
- }
+ if( pPager->errCode ){
+ rc = pPager->errCode;
+ goto failed;
+ }
- if( pPager->dbSize>0 ){
- IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers)));
- rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24);
- if( rc!=SQLITE_OK ){
- goto failed;
- }
- }else{
- memset(dbFileVers, 0, sizeof(dbFileVers));
+ assert( pPager->dbSizeValid );
+ if( pPager->dbSize>0 ){
+ IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers)));
+ rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24);
+ if( rc!=SQLITE_OK ){
+ goto failed;
}
+ }else{
+ memset(dbFileVers, 0, sizeof(dbFileVers));
+ }
- if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){
- pager_reset(pPager);
- }
+ if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){
+ pager_reset(pPager);
}
}
- assert( pPager->exclusiveMode || pPager->state<=PAGER_SHARED );
- if( pPager->state==PAGER_UNLOCK ){
- pPager->state = PAGER_SHARED;
- }
+ assert( pPager->exclusiveMode || pPager->state==PAGER_SHARED );
}
failed:
@@ -27287,128 +35028,59 @@ static int pagerSharedLock(Pager *pPager){
}
/*
-** Allocate a PgHdr object. Either create a new one or reuse
-** an existing one that is not otherwise in use.
-**
-** A new PgHdr structure is created if any of the following are
-** true:
-**
-** (1) We have not exceeded our maximum allocated cache size
-** as set by the "PRAGMA cache_size" command.
+** If the reference count has reached zero, rollback any active
+** transaction and unlock the pager.
**
-** (2) There are no unused PgHdr objects available at this time.
-**
-** (3) This is an in-memory database.
-**
-** (4) There are no PgHdr objects that do not require a journal
-** file sync and a sync of the journal file is currently
-** prohibited.
-**
-** Otherwise, reuse an existing PgHdr. In other words, reuse an
-** existing PgHdr if all of the following are true:
-**
-** (1) We have reached or exceeded the maximum cache size
-** allowed by "PRAGMA cache_size".
-**
-** (2) There is a PgHdr available with PgHdr->nRef==0
-**
-** (3) We are not in an in-memory database
-**
-** (4) Either there is an available PgHdr that does not need
-** to be synced to disk or else disk syncing is currently
-** allowed.
-*/
-static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){
- int rc = SQLITE_OK;
- PgHdr *pPg;
- int nByteHdr;
-
- /* Create a new PgHdr if any of the four conditions defined
- ** above are met: */
- if( pPager->nPage<pPager->mxPage
- || pPager->lru.pFirst==0
- || MEMDB
- || (pPager->lru.pFirstSynced==0 && pPager->doNotSync)
+** Except, in locking_mode=EXCLUSIVE when there is nothing to in
+** the rollback journal, the unlock is not performed and there is
+** nothing to rollback, so this routine is a no-op.
+*/
+static void pagerUnlockIfUnused(Pager *pPager){
+ if( (sqlite3PcacheRefCount(pPager->pPCache)==0)
+ && (!pPager->exclusiveMode || pPager->journalOff>0)
){
- void *pData;
- if( pPager->nPage>=pPager->nHash ){
- pager_resize_hash_table(pPager,
- pPager->nHash<256 ? 256 : pPager->nHash*2);
- if( pPager->nHash==0 ){
- rc = SQLITE_NOMEM;
- goto pager_allocate_out;
- }
- }
- pagerLeave(pPager);
- nByteHdr = sizeof(*pPg) + sizeof(u32) + pPager->nExtra
- + MEMDB*sizeof(PgHistory);
- pPg = sqlite3_malloc( nByteHdr );
- if( pPg ){
- pData = sqlite3_malloc( pPager->pageSize );
- if( pData==0 ){
- sqlite3_free(pPg);
- pPg = 0;
- }
- }
- pagerEnter(pPager);
- if( pPg==0 ){
- rc = SQLITE_NOMEM;
- goto pager_allocate_out;
- }
- memset(pPg, 0, nByteHdr);
- pPg->pData = pData;
- pPg->pPager = pPager;
- pPg->pNextAll = pPager->pAll;
- pPager->pAll = pPg;
- pPager->nPage++;
- }else{
- /* Recycle an existing page with a zero ref-count. */
- rc = pager_recycle(pPager, &pPg);
- if( rc==SQLITE_BUSY ){
- rc = SQLITE_IOERR_BLOCKED;
- }
- if( rc!=SQLITE_OK ){
- goto pager_allocate_out;
- }
- assert( pPager->state>=SHARED_LOCK );
- assert(pPg);
+ pagerUnlockAndRollback(pPager);
}
- *ppPg = pPg;
-
-pager_allocate_out:
- return rc;
}
/*
-** Make sure we have the content for a page. If the page was
-** previously acquired with noContent==1, then the content was
-** just initialized to zeros instead of being read from disk.
-** But now we need the real data off of disk. So make sure we
-** have it. Read it in if we do not have it already.
-*/
-static int pager_get_content(PgHdr *pPg){
- if( pPg->needRead ){
- int rc = readDbPage(pPg->pPager, pPg, pPg->pgno);
- if( rc==SQLITE_OK ){
- pPg->needRead = 0;
- }else{
- return rc;
- }
- }
- return SQLITE_OK;
-}
-
-/*
-** Acquire a page.
+** Acquire a reference to page number pgno in pager pPager (a page
+** reference has type DbPage*). If the requested reference is
+** successfully obtained, it is copied to *ppPage and SQLITE_OK returned.
+**
+** If the requested page is already in the cache, it is returned.
+** Otherwise, a new page object is allocated and populated with data
+** read from the database file. In some cases, the pcache module may
+** choose not to allocate a new page object and may reuse an existing
+** object with no outstanding references.
+**
+** The extra data appended to a page is always initialized to zeros the
+** first time a page is loaded into memory. If the page requested is
+** already in the cache when this function is called, then the extra
+** data is left as it was when the page object was last used.
+**
+** If the database image is smaller than the requested page or if a
+** non-zero value is passed as the noContent parameter and the
+** requested page is not already stored in the cache, then no
+** actual disk read occurs. In this case the memory image of the
+** page is initialized to all zeros.
**
-** A read lock on the disk file is obtained when the first page is acquired.
-** This read lock is dropped when the last page is released.
+** If noContent is true, it means that we do not care about the contents
+** of the page. This occurs in two seperate scenarios:
+**
+** a) When reading a free-list leaf page from the database, and
+**
+** b) When a savepoint is being rolled back and we need to load
+** a new page into the cache to populate with the data read
+** from the savepoint journal.
**
-** This routine works for any page number greater than 0. If the database
-** file is smaller than the requested page, then no actual disk
-** read occurs and the memory image of the page is initialized to
-** all zeros. The extra data appended to a page is always initialized
-** to zeros the first time a page is loaded into memory.
+** If noContent is true, then the data returned is zeroed instead of
+** being read from the database. Additionally, the bits corresponding
+** to pgno in Pager.pInJournal (bitvec of pages already written to the
+** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open
+** savepoints are set. This means if the page is made writable at any
+** point in the future, using a call to sqlite3PagerWrite(), its contents
+** will not be journaled. This saves IO.
**
** The acquisition might fail for several reasons. In all cases,
** an appropriate error code is returned and *ppPage is set to NULL.
@@ -27420,146 +35092,124 @@ static int pager_get_content(PgHdr *pPg){
** has to go to disk, and could also playback an old journal if necessary.
** Since Lookup() never goes to disk, it never has to deal with locks
** or journal files.
-**
-** If noContent is false, the page contents are actually read from disk.
-** If noContent is true, it means that we do not care about the contents
-** of the page at this time, so do not do a disk read. Just fill in the
-** page content with zeros. But mark the fact that we have not read the
-** content by setting the PgHdr.needRead flag. Later on, if
-** sqlite3PagerWrite() is called on this page or if this routine is
-** called again with noContent==0, that means that the content is needed
-** and the disk read should occur at that point.
-*/
-static int pagerAcquire(
+*/
+SQLITE_PRIVATE int sqlite3PagerAcquire(
Pager *pPager, /* The pager open on the database file */
Pgno pgno, /* Page number to fetch */
DbPage **ppPage, /* Write a pointer to the page here */
int noContent /* Do not bother reading content from disk if true */
){
- PgHdr *pPg;
int rc;
+ PgHdr *pPg;
- assert( pPager->state==PAGER_UNLOCK || pPager->nRef>0 || pgno==1 );
+ assert( assert_pager_state(pPager) );
+ assert( pPager->state>PAGER_UNLOCK );
- /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page
- ** number greater than this, or zero, is requested.
- */
- if( pgno>PAGER_MAX_PGNO || pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
+ if( pgno==0 ){
return SQLITE_CORRUPT_BKPT;
}
- /* Make sure we have not hit any critical errors.
- */
- assert( pPager!=0 );
- *ppPage = 0;
+ /* If the pager is in the error state, return an error immediately.
+ ** Otherwise, request the page from the PCache layer. */
+ if( pPager->errCode!=SQLITE_OK && pPager->errCode!=SQLITE_FULL ){
+ rc = pPager->errCode;
+ }else{
+ rc = sqlite3PcacheFetch(pPager->pPCache, pgno, 1, ppPage);
+ }
- /* If this is the first page accessed, then get a SHARED lock
- ** on the database file. pagerSharedLock() is a no-op if
- ** a database lock is already held.
- */
- rc = pagerSharedLock(pPager);
if( rc!=SQLITE_OK ){
- return rc;
- }
- assert( pPager->state!=PAGER_UNLOCK );
+ /* Either the call to sqlite3PcacheFetch() returned an error or the
+ ** pager was already in the error-state when this function was called.
+ ** Set pPg to 0 and jump to the exception handler. */
+ pPg = 0;
+ goto pager_acquire_err;
+ }
+ assert( (*ppPage)->pgno==pgno );
+ assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 );
+
+ if( (*ppPage)->pPager ){
+ /* In this case the pcache already contains an initialized copy of
+ ** the page. Return without further ado. */
+ assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) );
+ PAGER_INCR(pPager->nHit);
+ return SQLITE_OK;
- pPg = pager_lookup(pPager, pgno);
- if( pPg==0 ){
- /* The requested page is not in the page cache. */
+ }else{
+ /* The pager cache has created a new page. Its content needs to
+ ** be initialized. */
int nMax;
- int h;
- PAGER_INCR(pPager->nMiss);
- rc = pagerAllocatePage(pPager, &pPg);
- if( rc!=SQLITE_OK ){
- return rc;
- }
-
- pPg->pgno = pgno;
- assert( !MEMDB || pgno>pPager->stmtSize );
- pPg->inJournal = sqlite3BitvecTest(pPager->pInJournal, pgno);
- pPg->needSync = 0;
- makeClean(pPg);
- pPg->nRef = 1;
+ PAGER_INCR(pPager->nMiss);
+ pPg = *ppPage;
+ pPg->pPager = pPager;
- pPager->nRef++;
- if( pPager->nExtra>0 ){
- memset(PGHDR_TO_EXTRA(pPg, pPager), 0, pPager->nExtra);
+ /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page
+ ** number greater than this, or the unused locking-page, is requested. */
+ if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto pager_acquire_err;
}
- nMax = sqlite3PagerPagecount(pPager);
- if( pPager->errCode ){
- rc = pPager->errCode;
- sqlite3PagerUnref(pPg);
- return rc;
+
+ rc = sqlite3PagerPagecount(pPager, &nMax);
+ if( rc!=SQLITE_OK ){
+ goto pager_acquire_err;
}
- /* Populate the page with data, either by reading from the database
- ** file, or by setting the entire page to zero.
- */
- if( nMax<(int)pgno || MEMDB || (noContent && !pPager->alwaysRollback) ){
+ if( nMax<(int)pgno || MEMDB || noContent ){
if( pgno>pPager->mxPgno ){
- sqlite3PagerUnref(pPg);
- return SQLITE_FULL;
+ rc = SQLITE_FULL;
+ goto pager_acquire_err;
+ }
+ if( noContent ){
+ /* Failure to set the bits in the InJournal bit-vectors is benign.
+ ** It merely means that we might do some extra work to journal a
+ ** page that does not need to be journaled. Nevertheless, be sure
+ ** to test the case where a malloc error occurs while trying to set
+ ** a bit in a bit vector.
+ */
+ sqlite3BeginBenignMalloc();
+ if( pgno<=pPager->dbOrigSize ){
+ TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno);
+ testcase( rc==SQLITE_NOMEM );
+ }
+ TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno);
+ testcase( rc==SQLITE_NOMEM );
+ sqlite3EndBenignMalloc();
+ }else{
+ memset(pPg->pData, 0, pPager->pageSize);
}
- memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize);
- pPg->needRead = noContent && !pPager->alwaysRollback;
IOTRACE(("ZERO %p %d\n", pPager, pgno));
}else{
- rc = readDbPage(pPager, pPg, pgno);
- if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
- pPg->pgno = 0;
- sqlite3PagerUnref(pPg);
- return rc;
+ assert( pPg->pPager==pPager );
+ rc = readDbPage(pPg);
+ if( rc!=SQLITE_OK ){
+ goto pager_acquire_err;
}
- pPg->needRead = 0;
- }
-
- /* Link the page into the page hash table */
- h = pgno & (pPager->nHash-1);
- assert( pgno!=0 );
- pPg->pNextHash = pPager->aHash[h];
- pPager->aHash[h] = pPg;
- if( pPg->pNextHash ){
- assert( pPg->pNextHash->pPrevHash==0 );
- pPg->pNextHash->pPrevHash = pPg;
}
-
#ifdef SQLITE_CHECK_PAGES
pPg->pageHash = pager_pagehash(pPg);
#endif
- }else{
- /* The requested page is in the page cache. */
- assert(pPager->nRef>0 || pgno==1);
- PAGER_INCR(pPager->nHit);
- if( !noContent ){
- rc = pager_get_content(pPg);
- if( rc ){
- return rc;
- }
- }
- page_ref(pPg);
}
- *ppPage = pPg;
+
return SQLITE_OK;
-}
-SQLITE_PRIVATE int sqlite3PagerAcquire(
- Pager *pPager, /* The pager open on the database file */
- Pgno pgno, /* Page number to fetch */
- DbPage **ppPage, /* Write a pointer to the page here */
- int noContent /* Do not bother reading content from disk if true */
-){
- int rc;
- pagerEnter(pPager);
- rc = pagerAcquire(pPager, pgno, ppPage, noContent);
- pagerLeave(pPager);
+
+pager_acquire_err:
+ assert( rc!=SQLITE_OK );
+ if( pPg ){
+ sqlite3PcacheDrop(pPg);
+ }
+ pagerUnlockIfUnused(pPager);
+
+ *ppPage = 0;
return rc;
}
-
/*
** Acquire a page if it is already in the in-memory cache. Do
** not read the page from disk. Return a pointer to the page,
-** or 0 if the page is not in cache.
+** or 0 if the page is not in cache. Also, return 0 if the
+** pager is in PAGER_UNLOCK state when this function is called,
+** or if the pager is in an error state other than SQLITE_FULL.
**
** See also sqlite3PagerGet(). The difference between this routine
** and sqlite3PagerGet() is that _get() will go to the disk and read
@@ -27569,204 +35219,199 @@ SQLITE_PRIVATE int sqlite3PagerAcquire(
*/
SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
PgHdr *pPg = 0;
-
assert( pPager!=0 );
assert( pgno!=0 );
-
- pagerEnter(pPager);
- if( pPager->state==PAGER_UNLOCK ){
- assert( !pPager->pAll || pPager->exclusiveMode );
- }else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
- /* Do nothing */
- }else if( (pPg = pager_lookup(pPager, pgno))!=0 ){
- page_ref(pPg);
- }
- pagerLeave(pPager);
+ assert( pPager->pPCache!=0 );
+ assert( pPager->state > PAGER_UNLOCK );
+ sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &pPg);
return pPg;
}
/*
-** Release a page.
+** Release a page reference.
**
** If the number of references to the page drop to zero, then the
** page is added to the LRU list. When all references to all pages
** are released, a rollback occurs and the lock on the database is
** removed.
*/
-SQLITE_PRIVATE int sqlite3PagerUnref(DbPage *pPg){
- Pager *pPager;
-
- if( pPg==0 ) return SQLITE_OK;
- pPager = pPg->pPager;
-
- /* Decrement the reference count for this page
- */
- assert( pPg->nRef>0 );
- pagerEnter(pPg->pPager);
- pPg->nRef--;
-
- CHECK_PAGE(pPg);
-
- /* When the number of references to a page reach 0, call the
- ** destructor and add the page to the freelist.
- */
- if( pPg->nRef==0 ){
+SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){
+ if( pPg ){
+ Pager *pPager = pPg->pPager;
+ sqlite3PcacheRelease(pPg);
+ pagerUnlockIfUnused(pPager);
+ }
+}
- lruListAdd(pPg);
- if( pPager->xDestructor ){
- pPager->xDestructor(pPg, pPager->pageSize);
- }
-
- /* When all pages reach the freelist, drop the read lock from
- ** the database file.
- */
- pPager->nRef--;
- assert( pPager->nRef>=0 );
- if( pPager->nRef==0 && (!pPager->exclusiveMode || pPager->journalOff>0) ){
- pagerUnlockAndRollback(pPager);
+/*
+** If the main journal file has already been opened, ensure that the
+** sub-journal file is open too. If the main journal is not open,
+** this function is a no-op.
+**
+** SQLITE_OK is returned if everything goes according to plan.
+** An SQLITE_IOERR_XXX error code is returned if a call to
+** sqlite3OsOpen() fails.
+*/
+static int openSubJournal(Pager *pPager){
+ int rc = SQLITE_OK;
+ if( isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ){
+ if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
+ sqlite3MemJournalOpen(pPager->sjfd);
+ }else{
+ rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
}
}
- pagerLeave(pPager);
- return SQLITE_OK;
+ return rc;
}
/*
-** Create a journal file for pPager. There should already be a RESERVED
-** or EXCLUSIVE lock on the database file when this routine is called.
+** This function is called at the start of every write transaction.
+** There must already be a RESERVED or EXCLUSIVE lock on the database
+** file when this routine is called.
+**
+** Open the journal file for pager pPager and write a journal header
+** to the start of it. If there are active savepoints, open the sub-journal
+** as well. This function is only used when the journal file is being
+** opened to write a rollback log for a transaction. It is not used
+** when opening a hot journal file to roll it back.
+**
+** If the journal file is already open (as it may be in exclusive mode),
+** then this function just writes a journal header to the start of the
+** already open file.
**
-** Return SQLITE_OK if everything. Return an error code and release the
-** write lock if anything goes wrong.
+** Whether or not the journal file is opened by this function, the
+** Pager.pInJournal bitvec structure is allocated.
+**
+** Return SQLITE_OK if everything is successful. Otherwise, return
+** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or
+** an IO error code if opening or writing the journal file fails.
*/
static int pager_open_journal(Pager *pPager){
- sqlite3_vfs *pVfs = pPager->pVfs;
- int flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_CREATE);
+ int rc = SQLITE_OK; /* Return code */
+ sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */
- int rc;
- assert( !MEMDB );
assert( pPager->state>=PAGER_RESERVED );
assert( pPager->useJournal );
+ assert( pPager->journalMode!=PAGER_JOURNALMODE_OFF );
assert( pPager->pInJournal==0 );
- sqlite3PagerPagecount(pPager);
- pagerLeave(pPager);
+
+ /* If already in the error state, this function is a no-op. But on
+ ** the other hand, this routine is never called if we are already in
+ ** an error state. */
+ if( NEVER(pPager->errCode) ) return pPager->errCode;
+
+ /* TODO: Is it really possible to get here with dbSizeValid==0? If not,
+ ** the call to PagerPagecount() can be removed.
+ */
+ testcase( pPager->dbSizeValid==0 );
+ sqlite3PagerPagecount(pPager, 0);
+
pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize);
- pagerEnter(pPager);
if( pPager->pInJournal==0 ){
- rc = SQLITE_NOMEM;
- goto failed_to_open_journal;
+ return SQLITE_NOMEM;
}
- if( pPager->journalOpen==0 ){
- if( pPager->tempFile ){
- flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL);
+ /* Open the journal file if it is not already open. */
+ if( !isOpen(pPager->jfd) ){
+ if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
+ sqlite3MemJournalOpen(pPager->jfd);
}else{
- flags |= (SQLITE_OPEN_MAIN_JOURNAL);
- }
+ const int flags = /* VFS flags to open journal file */
+ SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
+ (pPager->tempFile ?
+ (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
+ (SQLITE_OPEN_MAIN_JOURNAL)
+ );
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
- rc = sqlite3JournalOpen(
- pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
- );
+ rc = sqlite3JournalOpen(
+ pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
+ );
#else
- rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
+ rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
#endif
- assert( rc!=SQLITE_OK || pPager->jfd->pMethods );
- pPager->journalOff = 0;
- pPager->setMaster = 0;
- pPager->journalHdr = 0;
- if( rc!=SQLITE_OK ){
- if( rc==SQLITE_NOMEM ){
- sqlite3OsDelete(pVfs, pPager->zJournal, 0);
- }
- goto failed_to_open_journal;
}
+ assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
}
- pPager->journalOpen = 1;
- pPager->journalStarted = 0;
- pPager->needSync = 0;
- pPager->alwaysRollback = 0;
- pPager->nRec = 0;
- if( pPager->errCode ){
- rc = pPager->errCode;
- goto failed_to_open_journal;
- }
- pPager->origDbSize = pPager->dbSize;
- rc = writeJournalHdr(pPager);
- if( pPager->stmtAutoopen && rc==SQLITE_OK ){
- rc = sqlite3PagerStmtBegin(pPager);
+ /* Write the first journal header to the journal file and open
+ ** the sub-journal if necessary.
+ */
+ if( rc==SQLITE_OK ){
+ /* TODO: Check if all of these are really required. */
+ pPager->dbOrigSize = pPager->dbSize;
+ pPager->journalStarted = 0;
+ pPager->needSync = 0;
+ pPager->nRec = 0;
+ pPager->journalOff = 0;
+ pPager->setMaster = 0;
+ pPager->journalHdr = 0;
+ rc = writeJournalHdr(pPager);
}
- if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && rc!=SQLITE_IOERR_NOMEM ){
- rc = pager_end_transaction(pPager, 0);
- if( rc==SQLITE_OK ){
- rc = SQLITE_FULL;
- }
+ if( rc==SQLITE_OK && pPager->nSavepoint ){
+ rc = openSubJournal(pPager);
}
- return rc;
-failed_to_open_journal:
- sqlite3BitvecDestroy(pPager->pInJournal);
- pPager->pInJournal = 0;
+ if( rc!=SQLITE_OK ){
+ sqlite3BitvecDestroy(pPager->pInJournal);
+ pPager->pInJournal = 0;
+ }
return rc;
}
/*
-** Acquire a write-lock on the database. The lock is removed when
-** the any of the following happen:
-**
-** * sqlite3PagerCommitPhaseTwo() is called.
-** * sqlite3PagerRollback() is called.
-** * sqlite3PagerClose() is called.
-** * sqlite3PagerUnref() is called to on every outstanding page.
-**
-** The first parameter to this routine is a pointer to any open page of the
-** database file. Nothing changes about the page - it is used merely to
-** acquire a pointer to the Pager structure and as proof that there is
-** already a read-lock on the database.
+** Begin a write-transaction on the specified pager object. If a
+** write-transaction has already been opened, this function is a no-op.
**
-** The second parameter indicates how much space in bytes to reserve for a
-** master journal file-name at the start of the journal when it is created.
+** If the exFlag argument is false, then acquire at least a RESERVED
+** lock on the database file. If exFlag is true, then acquire at least
+** an EXCLUSIVE lock. If such a lock is already held, no locking
+** functions need be called.
**
-** A journal file is opened if this is not a temporary file. For temporary
-** files, the opening of the journal file is deferred until there is an
-** actual need to write to the journal.
+** If this is not a temporary or in-memory file and, the journal file is
+** opened if it has not been already. For a temporary file, the opening
+** of the journal file is deferred until there is an actual need to
+** write to the journal. TODO: Why handle temporary files differently?
**
-** If the database is already reserved for writing, this routine is a no-op.
+** If the journal file is opened (or if it is already open), then a
+** journal-header is written to the start of it.
**
-** If exFlag is true, go ahead and get an EXCLUSIVE lock on the file
-** immediately instead of waiting until we try to flush the cache. The
-** exFlag is ignored if a transaction is already active.
+** If the subjInMemory argument is non-zero, then any sub-journal opened
+** within this transaction will be opened as an in-memory file. This
+** has no effect if the sub-journal is already opened (as it may be when
+** running in exclusive mode) or if the transaction does not require a
+** sub-journal. If the subjInMemory argument is zero, then any required
+** sub-journal is implemented in-memory if pPager is an in-memory database,
+** or using a temporary file otherwise.
*/
-SQLITE_PRIVATE int sqlite3PagerBegin(DbPage *pPg, int exFlag){
- Pager *pPager = pPg->pPager;
+SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
int rc = SQLITE_OK;
- pagerEnter(pPager);
- assert( pPg->nRef>0 );
assert( pPager->state!=PAGER_UNLOCK );
+ pPager->subjInMemory = (u8)subjInMemory;
if( pPager->state==PAGER_SHARED ){
assert( pPager->pInJournal==0 );
- if( MEMDB ){
- pPager->state = PAGER_EXCLUSIVE;
- pPager->origDbSize = pPager->dbSize;
- }else{
- rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
- if( rc==SQLITE_OK ){
- pPager->state = PAGER_RESERVED;
- if( exFlag ){
- rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
- }
- }
- if( rc!=SQLITE_OK ){
- pagerLeave(pPager);
- return rc;
- }
- pPager->dirtyCache = 0;
- PAGERTRACE2("TRANSACTION %d\n", PAGERID(pPager));
- if( pPager->useJournal && !pPager->tempFile
- && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
- rc = pager_open_journal(pPager);
+ assert( !MEMDB && !pPager->tempFile );
+
+ /* Obtain a RESERVED lock on the database file. If the exFlag parameter
+ ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
+ ** busy-handler callback can be used when upgrading to the EXCLUSIVE
+ ** lock, but not when obtaining the RESERVED lock.
+ */
+ rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK);
+ if( rc==SQLITE_OK ){
+ pPager->state = PAGER_RESERVED;
+ if( exFlag ){
+ rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
}
}
- }else if( pPager->journalOpen && pPager->journalOff==0 ){
+
+ /* If the required locks were successfully obtained, open the journal
+ ** file and write the first journal-header to it.
+ */
+ if( rc==SQLITE_OK && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
+ rc = pager_open_journal(pPager);
+ }
+ }else if( isOpen(pPager->jfd) && pPager->journalOff==0 ){
/* This happens when the pager was in exclusive-access mode the last
** time a (read or write) transaction was successfully concluded
** by this connection. Instead of deleting the journal file it was
@@ -27774,117 +35419,60 @@ SQLITE_PRIVATE int sqlite3PagerBegin(DbPage *pPg, int exFlag){
** overwritten with zeros.
*/
assert( pPager->nRec==0 );
- assert( pPager->origDbSize==0 );
+ assert( pPager->dbOrigSize==0 );
assert( pPager->pInJournal==0 );
- sqlite3PagerPagecount(pPager);
- pagerLeave(pPager);
- pPager->pInJournal = sqlite3BitvecCreate( pPager->dbSize );
- pagerEnter(pPager);
- if( !pPager->pInJournal ){
- rc = SQLITE_NOMEM;
- }else{
- pPager->origDbSize = pPager->dbSize;
- rc = writeJournalHdr(pPager);
- }
+ rc = pager_open_journal(pPager);
}
- assert( !pPager->journalOpen || pPager->journalOff>0 || rc!=SQLITE_OK );
- pagerLeave(pPager);
- return rc;
-}
-
-/*
-** Make a page dirty. Set its dirty flag and add it to the dirty
-** page list.
-*/
-static void makeDirty(PgHdr *pPg){
- if( pPg->dirty==0 ){
- Pager *pPager = pPg->pPager;
- pPg->dirty = 1;
- pPg->pDirty = pPager->pDirty;
- if( pPager->pDirty ){
- pPager->pDirty->pPrevDirty = pPg;
- }
- pPg->pPrevDirty = 0;
- pPager->pDirty = pPg;
- }
-}
-/*
-** Make a page clean. Clear its dirty bit and remove it from the
-** dirty page list.
-*/
-static void makeClean(PgHdr *pPg){
- if( pPg->dirty ){
- pPg->dirty = 0;
- if( pPg->pDirty ){
- assert( pPg->pDirty->pPrevDirty==pPg );
- pPg->pDirty->pPrevDirty = pPg->pPrevDirty;
- }
- if( pPg->pPrevDirty ){
- assert( pPg->pPrevDirty->pDirty==pPg );
- pPg->pPrevDirty->pDirty = pPg->pDirty;
- }else{
- assert( pPg->pPager->pDirty==pPg );
- pPg->pPager->pDirty = pPg->pDirty;
- }
+ PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
+ assert( !isOpen(pPager->jfd) || pPager->journalOff>0 || rc!=SQLITE_OK );
+ if( rc!=SQLITE_OK ){
+ assert( !pPager->dbModified );
+ /* Ignore any IO error that occurs within pager_end_transaction(). The
+ ** purpose of this call is to reset the internal state of the pager
+ ** sub-system. It doesn't matter if the journal-file is not properly
+ ** finalized at this point (since it is not a valid journal file anyway).
+ */
+ pager_end_transaction(pPager, 0);
}
+ return rc;
}
-
/*
-** Mark a data page as writeable. The page is written into the journal
-** if it is not there already. This routine must be called before making
-** changes to a page.
-**
-** The first time this routine is called, the pager creates a new
-** journal and acquires a RESERVED lock on the database. If the RESERVED
-** lock could not be acquired, this routine returns SQLITE_BUSY. The
-** calling routine must check for that return value and be careful not to
-** change any page data until this routine returns SQLITE_OK.
-**
-** If the journal file could not be written because the disk is full,
-** then this routine returns SQLITE_FULL and does an immediate rollback.
-** All subsequent write attempts also return SQLITE_FULL until there
-** is a call to sqlite3PagerCommit() or sqlite3PagerRollback() to
-** reset.
+** Mark a single data page as writeable. The page is written into the
+** main journal or sub-journal as required. If the page is written into
+** one of the journals, the corresponding bit is set in the
+** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs
+** of any open savepoints as appropriate.
*/
static int pager_write(PgHdr *pPg){
- void *pData = PGHDR_TO_DATA(pPg);
+ void *pData = pPg->pData;
Pager *pPager = pPg->pPager;
int rc = SQLITE_OK;
- /* Check for errors
+ /* This routine is not called unless a transaction has already been
+ ** started.
*/
- if( pPager->errCode ){
- return pPager->errCode;
- }
- if( pPager->readOnly ){
- return SQLITE_PERM;
- }
+ assert( pPager->state>=PAGER_RESERVED );
+
+ /* If an error has been previously detected, we should not be
+ ** calling this routine. Repeat the error for robustness.
+ */
+ if( NEVER(pPager->errCode) ) return pPager->errCode;
+
+ /* Higher-level routines never call this function if database is not
+ ** writable. But check anyway, just for robustness. */
+ if( NEVER(pPager->readOnly) ) return SQLITE_PERM;
assert( !pPager->setMaster );
CHECK_PAGE(pPg);
- /* If this page was previously acquired with noContent==1, that means
- ** we didn't really read in the content of the page. This can happen
- ** (for example) when the page is being moved to the freelist. But
- ** now we are (perhaps) moving the page off of the freelist for
- ** reuse and we need to know its original content so that content
- ** can be stored in the rollback journal. So do the read at this
- ** time.
- */
- rc = pager_get_content(pPg);
- if( rc ){
- return rc;
- }
-
/* Mark the page as dirty. If the page has already been written
** to the journal then we can return right away.
*/
- makeDirty(pPg);
- if( pPg->inJournal && (pageInStatement(pPg) || pPager->stmtInUse==0) ){
- pPager->dirtyCache = 1;
+ sqlite3PcacheMakeDirty(pPg);
+ if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){
pPager->dbModified = 1;
}else{
@@ -27892,88 +35480,91 @@ static int pager_write(PgHdr *pPg){
** written to the transaction journal or the ckeckpoint journal
** or both.
**
- ** First check to see that the transaction journal exists and
- ** create it if it does not.
+ ** Higher level routines should have already started a transaction,
+ ** which means they have acquired the necessary locks and opened
+ ** a rollback journal. Double-check to makes sure this is the case.
*/
- assert( pPager->state!=PAGER_UNLOCK );
- rc = sqlite3PagerBegin(pPg, 0);
- if( rc!=SQLITE_OK ){
+ rc = sqlite3PagerBegin(pPager, 0, pPager->subjInMemory);
+ if( NEVER(rc!=SQLITE_OK) ){
return rc;
}
- assert( pPager->state>=PAGER_RESERVED );
- if( !pPager->journalOpen && pPager->useJournal
- && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
+ if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
+ assert( pPager->useJournal );
rc = pager_open_journal(pPager);
if( rc!=SQLITE_OK ) return rc;
}
- pPager->dirtyCache = 1;
pPager->dbModified = 1;
/* The transaction journal now exists and we have a RESERVED or an
** EXCLUSIVE lock on the main database file. Write the current page to
** the transaction journal if it is not there already.
*/
- if( !pPg->inJournal && (pPager->journalOpen || MEMDB) ){
- if( (int)pPg->pgno <= pPager->origDbSize ){
- if( MEMDB ){
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- PAGERTRACE3("JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno);
- assert( pHist->pOrig==0 );
- pHist->pOrig = sqlite3_malloc( pPager->pageSize );
- if( !pHist->pOrig ){
- return SQLITE_NOMEM;
- }
- memcpy(pHist->pOrig, PGHDR_TO_DATA(pPg), pPager->pageSize);
- }else{
- u32 cksum;
- char *pData2;
-
- /* We should never write to the journal file the page that
- ** contains the database locks. The following assert verifies
- ** that we do not. */
- assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
- pData2 = CODEC2(pPager, pData, pPg->pgno, 7);
- cksum = pager_cksum(pPager, (u8*)pData2);
- rc = write32bits(pPager->jfd, pPager->journalOff, pPg->pgno);
- if( rc==SQLITE_OK ){
- rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize,
- pPager->journalOff + 4);
- pPager->journalOff += pPager->pageSize+4;
- }
- if( rc==SQLITE_OK ){
- rc = write32bits(pPager->jfd, pPager->journalOff, cksum);
- pPager->journalOff += 4;
- }
- IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno,
- pPager->journalOff, pPager->pageSize));
- PAGER_INCR(sqlite3_pager_writej_count);
- PAGERTRACE5("JOURNAL %d page %d needSync=%d hash(%08x)\n",
- PAGERID(pPager), pPg->pgno, pPg->needSync, pager_pagehash(pPg));
-
- /* An error has occured writing to the journal file. The
- ** transaction will be rolled back by the layer above.
- */
- if( rc!=SQLITE_OK ){
- return rc;
- }
+ if( !pageInJournal(pPg) && isOpen(pPager->jfd) ){
+ if( pPg->pgno<=pPager->dbOrigSize ){
+ u32 cksum;
+ char *pData2;
+
+ /* We should never write to the journal file the page that
+ ** contains the database locks. The following assert verifies
+ ** that we do not. */
+ assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
+ CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
+ cksum = pager_cksum(pPager, (u8*)pData2);
+ rc = write32bits(pPager->jfd, pPager->journalOff, pPg->pgno);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize,
+ pPager->journalOff + 4);
+ pPager->journalOff += pPager->pageSize+4;
+ }
+ if( rc==SQLITE_OK ){
+ rc = write32bits(pPager->jfd, pPager->journalOff, cksum);
+ pPager->journalOff += 4;
+ }
+ IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno,
+ pPager->journalOff, pPager->pageSize));
+ PAGER_INCR(sqlite3_pager_writej_count);
+ PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n",
+ PAGERID(pPager), pPg->pgno,
+ ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg)));
+
+ /* Even if an IO or diskfull error occurred while journalling the
+ ** page in the block above, set the need-sync flag for the page.
+ ** Otherwise, when the transaction is rolled back, the logic in
+ ** playback_one_page() will think that the page needs to be restored
+ ** in the database file. And if an IO error occurs while doing so,
+ ** then corruption may follow.
+ */
+ if( !pPager->noSync ){
+ pPg->flags |= PGHDR_NEED_SYNC;
+ pPager->needSync = 1;
+ }
- pPager->nRec++;
- assert( pPager->pInJournal!=0 );
- sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
- pPg->needSync = !pPager->noSync;
- if( pPager->stmtInUse ){
- sqlite3BitvecSet(pPager->pInStmt, pPg->pgno);
- }
+ /* An error has occurred writing to the journal file. The
+ ** transaction will be rolled back by the layer above.
+ */
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ pPager->nRec++;
+ assert( pPager->pInJournal!=0 );
+ rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
+ testcase( rc==SQLITE_NOMEM );
+ assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
+ rc |= addToSavepointBitvecs(pPager, pPg->pgno);
+ if( rc!=SQLITE_OK ){
+ assert( rc==SQLITE_NOMEM );
+ return rc;
}
}else{
- pPg->needSync = !pPager->journalStarted && !pPager->noSync;
- PAGERTRACE4("APPEND %d page %d needSync=%d\n",
- PAGERID(pPager), pPg->pgno, pPg->needSync);
- }
- if( pPg->needSync ){
- pPager->needSync = 1;
+ if( !pPager->journalStarted && !pPager->noSync ){
+ pPg->flags |= PGHDR_NEED_SYNC;
+ pPager->needSync = 1;
+ }
+ PAGERTRACE(("APPEND %d page %d needSync=%d\n",
+ PAGERID(pPager), pPg->pgno,
+ ((pPg->flags&PGHDR_NEED_SYNC)?1:0)));
}
- pPg->inJournal = 1;
}
/* If the statement journal is open and the page is not in it,
@@ -27981,59 +35572,33 @@ static int pager_write(PgHdr *pPg){
** the statement journal format differs from the standard journal format
** in that it omits the checksums and the header.
*/
- if( pPager->stmtInUse
- && !pageInStatement(pPg)
- && (int)pPg->pgno<=pPager->stmtSize
- ){
- assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize );
- if( MEMDB ){
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- assert( pHist->pStmt==0 );
- pHist->pStmt = sqlite3_malloc( pPager->pageSize );
- if( pHist->pStmt ){
- memcpy(pHist->pStmt, PGHDR_TO_DATA(pPg), pPager->pageSize);
- }
- PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno);
- page_add_to_stmt_list(pPg);
- }else{
- i64 offset = pPager->stmtNRec*(4+pPager->pageSize);
- char *pData2 = CODEC2(pPager, pData, pPg->pgno, 7);
- rc = write32bits(pPager->stfd, offset, pPg->pgno);
- if( rc==SQLITE_OK ){
- rc = sqlite3OsWrite(pPager->stfd, pData2, pPager->pageSize, offset+4);
- }
- PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- pPager->stmtNRec++;
- assert( pPager->pInStmt!=0 );
- sqlite3BitvecSet(pPager->pInStmt, pPg->pgno);
- }
+ if( subjRequiresPage(pPg) ){
+ rc = subjournalPage(pPg);
}
}
/* Update the database size and return.
*/
assert( pPager->state>=PAGER_SHARED );
- if( pPager->dbSize<(int)pPg->pgno ){
+ if( pPager->dbSize<pPg->pgno ){
pPager->dbSize = pPg->pgno;
- if( !MEMDB && pPager->dbSize==PENDING_BYTE/pPager->pageSize ){
- pPager->dbSize++;
- }
}
return rc;
}
/*
-** This function is used to mark a data-page as writable. It uses
-** pager_write() to open a journal file (if it is not already open)
-** and write the page *pData to the journal.
+** Mark a data page as writeable. This routine must be called before
+** making changes to a page. The caller must check the return value
+** of this function and be careful not to change any page data unless
+** this routine returns SQLITE_OK.
**
** The difference between this function and pager_write() is that this
** function also deals with the special case where 2 or more pages
** fit on a single disk sector. In this case all co-resident pages
** must have been written to the journal file before returning.
+**
+** If an error occurs, SQLITE_NOMEM or an IO error code is returned
+** as appropriate. Otherwise, SQLITE_OK.
*/
SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
int rc = SQLITE_OK;
@@ -28042,17 +35607,17 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
Pager *pPager = pPg->pPager;
Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize);
- pagerEnter(pPager);
- if( !MEMDB && nPagePerSector>1 ){
+ if( nPagePerSector>1 ){
Pgno nPageCount; /* Total number of pages in database file */
Pgno pg1; /* First page of the sector pPg is located on. */
int nPage; /* Number of pages starting at pg1 to journal */
- int ii;
- int needSync = 0;
+ int ii; /* Loop counter */
+ int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */
/* Set the doNotSync flag to 1. This is because we cannot allow a journal
** header to be written between the pages journaled by this function.
*/
+ assert( !MEMDB );
assert( pPager->doNotSync==0 );
pPager->doNotSync = 1;
@@ -28062,7 +35627,7 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
*/
pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1;
- nPageCount = sqlite3PagerPagecount(pPager);
+ sqlite3PagerPagecount(pPager, (int *)&nPageCount);
if( pPg->pgno>nPageCount ){
nPage = (pPg->pgno - pg1)+1;
}else if( (pg1+nPagePerSector-1)>nPageCount ){
@@ -28082,29 +35647,35 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
rc = sqlite3PagerGet(pPager, pg, &pPage);
if( rc==SQLITE_OK ){
rc = pager_write(pPage);
- if( pPage->needSync ){
+ if( pPage->flags&PGHDR_NEED_SYNC ){
needSync = 1;
+ assert(pPager->needSync);
}
sqlite3PagerUnref(pPage);
}
}
}else if( (pPage = pager_lookup(pPager, pg))!=0 ){
- if( pPage->needSync ){
+ if( pPage->flags&PGHDR_NEED_SYNC ){
needSync = 1;
}
+ sqlite3PagerUnref(pPage);
}
}
- /* If the PgHdr.needSync flag is set for any of the nPage pages
+ /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages
** starting at pg1, then it needs to be set for all of them. Because
** writing to any of these nPage pages may damage the others, the
** journal file must contain sync()ed copies of all of them
** before any of them can be written out to the database file.
*/
- if( needSync ){
- for(ii=0; ii<nPage && needSync; ii++){
+ if( rc==SQLITE_OK && needSync ){
+ assert( !MEMDB && pPager->noSync==0 );
+ for(ii=0; ii<nPage; ii++){
PgHdr *pPage = pager_lookup(pPager, pg1+ii);
- if( pPage ) pPage->needSync = 1;
+ if( pPage ){
+ pPage->flags |= PGHDR_NEED_SYNC;
+ sqlite3PagerUnref(pPage);
+ }
}
assert(pPager->needSync);
}
@@ -28114,7 +35685,6 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
}else{
rc = pager_write(pDbPage);
}
- pagerLeave(pPager);
return rc;
}
@@ -28125,166 +35695,133 @@ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
*/
#ifndef NDEBUG
SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){
- return pPg->dirty;
+ return pPg->flags&PGHDR_DIRTY;
}
#endif
/*
** A call to this routine tells the pager that it is not necessary to
** write the information on page pPg back to the disk, even though
-** that page might be marked as dirty.
+** that page might be marked as dirty. This happens, for example, when
+** the page has been added as a leaf of the freelist and so its
+** content no longer matters.
**
** The overlying software layer calls this routine when all of the data
-** on the given page is unused. The pager marks the page as clean so
+** on the given page is unused. The pager marks the page as clean so
** that it does not get written to disk.
**
-** Tests show that this optimization, together with the
-** sqlite3PagerDontRollback() below, more than double the speed
-** of large INSERT operations and quadruple the speed of large DELETEs.
-**
-** When this routine is called, set the alwaysRollback flag to true.
-** Subsequent calls to sqlite3PagerDontRollback() for the same page
-** will thereafter be ignored. This is necessary to avoid a problem
-** where a page with data is added to the freelist during one part of
-** a transaction then removed from the freelist during a later part
-** of the same transaction and reused for some other purpose. When it
-** is first added to the freelist, this routine is called. When reused,
-** the sqlite3PagerDontRollback() routine is called. But because the
-** page contains critical data, we still need to be sure it gets
-** rolled back in spite of the sqlite3PagerDontRollback() call.
-*/
-SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage *pDbPage){
- PgHdr *pPg = pDbPage;
+** Tests show that this optimization can quadruple the speed of large
+** DELETE operations.
+*/
+SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){
Pager *pPager = pPg->pPager;
-
- if( MEMDB ) return;
- pagerEnter(pPager);
- pPg->alwaysRollback = 1;
- if( pPg->dirty && !pPager->stmtInUse ){
- assert( pPager->state>=PAGER_SHARED );
- if( pPager->dbSize==(int)pPg->pgno && pPager->origDbSize<pPager->dbSize ){
- /* If this pages is the last page in the file and the file has grown
- ** during the current transaction, then do NOT mark the page as clean.
- ** When the database file grows, we must make sure that the last page
- ** gets written at least once so that the disk file will be the correct
- ** size. If you do not write this page and the size of the file
- ** on the disk ends up being too small, that can lead to database
- ** corruption during the next transaction.
- */
- }else{
- PAGERTRACE3("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager));
- IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno))
- makeClean(pPg);
+ if( (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){
+ PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)));
+ IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno))
+ pPg->flags |= PGHDR_DONT_WRITE;
#ifdef SQLITE_CHECK_PAGES
- pPg->pageHash = pager_pagehash(pPg);
+ pPg->pageHash = pager_pagehash(pPg);
#endif
- }
}
- pagerLeave(pPager);
}
/*
-** A call to this routine tells the pager that if a rollback occurs,
-** it is not necessary to restore the data on the given page. This
-** means that the pager does not have to record the given page in the
-** rollback journal.
+** This routine is called to increment the value of the database file
+** change-counter, stored as a 4-byte big-endian integer starting at
+** byte offset 24 of the pager file.
+**
+** If the isDirectMode flag is zero, then this is done by calling
+** sqlite3PagerWrite() on page 1, then modifying the contents of the
+** page data. In this case the file will be updated when the current
+** transaction is committed.
**
-** If we have not yet actually read the content of this page (if
-** the PgHdr.needRead flag is set) then this routine acts as a promise
-** that we will never need to read the page content in the future.
-** so the needRead flag can be cleared at this point.
+** The isDirectMode flag may only be non-zero if the library was compiled
+** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case,
+** if isDirect is non-zero, then the database file is updated directly
+** by writing an updated version of page 1 using a call to the
+** sqlite3OsWrite() function.
*/
-SQLITE_PRIVATE void sqlite3PagerDontRollback(DbPage *pPg){
- Pager *pPager = pPg->pPager;
-
- pagerEnter(pPager);
- assert( pPager->state>=PAGER_RESERVED );
-
- /* If the journal file is not open, or DontWrite() has been called on
- ** this page (DontWrite() sets the alwaysRollback flag), then this
- ** function is a no-op.
- */
- if( pPager->journalOpen==0 || pPg->alwaysRollback || pPager->alwaysRollback ){
- pagerLeave(pPager);
- return;
- }
- assert( !MEMDB ); /* For a memdb, pPager->journalOpen is always 0 */
+static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
+ int rc = SQLITE_OK;
-#ifdef SQLITE_SECURE_DELETE
- if( pPg->inJournal || (int)pPg->pgno > pPager->origDbSize ){
- return;
- }
+ /* Declare and initialize constant integer 'isDirect'. If the
+ ** atomic-write optimization is enabled in this build, then isDirect
+ ** is initialized to the value passed as the isDirectMode parameter
+ ** to this function. Otherwise, it is always set to zero.
+ **
+ ** The idea is that if the atomic-write optimization is not
+ ** enabled at compile time, the compiler can omit the tests of
+ ** 'isDirect' below, as well as the block enclosed in the
+ ** "if( isDirect )" condition.
+ */
+#ifndef SQLITE_ENABLE_ATOMIC_WRITE
+# define DIRECT_MODE 0
+ assert( isDirectMode==0 );
+ UNUSED_PARAMETER(isDirectMode);
+#else
+# define DIRECT_MODE isDirectMode
#endif
- /* If SECURE_DELETE is disabled, then there is no way that this
- ** routine can be called on a page for which sqlite3PagerDontWrite()
- ** has not been previously called during the same transaction.
- ** And if DontWrite() has previously been called, the following
- ** conditions must be met.
- */
- assert( !pPg->inJournal && (int)pPg->pgno <= pPager->origDbSize );
-
- assert( pPager->pInJournal!=0 );
- sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
- pPg->inJournal = 1;
- pPg->needRead = 0;
- if( pPager->stmtInUse ){
- assert( pPager->stmtSize >= pPager->origDbSize );
- sqlite3BitvecSet(pPager->pInStmt, pPg->pgno);
- }
- PAGERTRACE3("DONT_ROLLBACK page %d of %d\n", pPg->pgno, PAGERID(pPager));
- IOTRACE(("GARBAGE %p %d\n", pPager, pPg->pgno))
- pagerLeave(pPager);
-}
+ assert( pPager->state>=PAGER_RESERVED );
+ if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){
+ PgHdr *pPgHdr; /* Reference to page 1 */
+ u32 change_counter; /* Initial value of change-counter field */
+ assert( !pPager->tempFile && isOpen(pPager->fd) );
-/*
-** This routine is called to increment the database file change-counter,
-** stored at byte 24 of the pager file.
-*/
-static int pager_incr_changecounter(Pager *pPager, int isDirect){
- PgHdr *pPgHdr;
- u32 change_counter;
- int rc = SQLITE_OK;
-
- if( !pPager->changeCountDone ){
/* Open page 1 of the file for writing. */
rc = sqlite3PagerGet(pPager, 1, &pPgHdr);
- if( rc!=SQLITE_OK ) return rc;
+ assert( pPgHdr==0 || rc==SQLITE_OK );
- if( !isDirect ){
+ /* If page one was fetched successfully, and this function is not
+ ** operating in direct-mode, make page 1 writable. When not in
+ ** direct mode, page 1 is always held in cache and hence the PagerGet()
+ ** above is always successful - hence the ALWAYS on rc==SQLITE_OK.
+ */
+ if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){
rc = sqlite3PagerWrite(pPgHdr);
- if( rc!=SQLITE_OK ){
- sqlite3PagerUnref(pPgHdr);
- return rc;
- }
}
- /* Increment the value just read and write it back to byte 24. */
- change_counter = sqlite3Get4byte((u8*)pPager->dbFileVers);
- change_counter++;
- put32bits(((char*)PGHDR_TO_DATA(pPgHdr))+24, change_counter);
-
- if( isDirect && pPager->fd->pMethods ){
- const void *zBuf = PGHDR_TO_DATA(pPgHdr);
- rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0);
+ if( rc==SQLITE_OK ){
+ /* Increment the value just read and write it back to byte 24. */
+ change_counter = sqlite3Get4byte((u8*)pPager->dbFileVers);
+ change_counter++;
+ put32bits(((char*)pPgHdr->pData)+24, change_counter);
+
+ /* If running in direct mode, write the contents of page 1 to the file. */
+ if( DIRECT_MODE ){
+ const void *zBuf = pPgHdr->pData;
+ assert( pPager->dbFileSize>0 );
+ rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0);
+ if( rc==SQLITE_OK ){
+ pPager->changeCountDone = 1;
+ }
+ }else{
+ pPager->changeCountDone = 1;
+ }
}
/* Release the page reference. */
sqlite3PagerUnref(pPgHdr);
- pPager->changeCountDone = 1;
}
return rc;
}
/*
-** Sync the pager file to disk.
+** Sync the pager file to disk. This is a no-op for in-memory files
+** or pages with the Pager.noSync flag set.
+**
+** If successful, or called on a pager for which it is a no-op, this
+** function returns SQLITE_OK. Otherwise, an IO error code is returned.
*/
SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager){
- int rc;
- pagerEnter(pPager);
- rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
- pagerLeave(pPager);
+ int rc; /* Return code */
+ assert( !MEMDB );
+ if( pPager->noSync ){
+ rc = SQLITE_OK;
+ }else{
+ rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
+ }
return rc;
}
@@ -28294,315 +35831,310 @@ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager){
** journal file. zMaster may be NULL, which is interpreted as no master
** journal (a single database transaction).
**
-** This routine ensures that the journal is synced, all dirty pages written
-** to the database file and the database file synced. The only thing that
-** remains to commit the transaction is to delete the journal file (or
-** master journal file if specified).
+** This routine ensures that:
+**
+** * The database file change-counter is updated,
+** * the journal is synced (unless the atomic-write optimization is used),
+** * all dirty pages are written to the database file,
+** * the database file is truncated (if required), and
+** * the database file synced.
+**
+** The only thing that remains to commit the transaction is to finalize
+** (delete, truncate or zero the first part of) the journal file (or
+** delete the master journal file if specified).
**
** Note that if zMaster==NULL, this does not overwrite a previous value
** passed to an sqlite3PagerCommitPhaseOne() call.
**
-** If parameter nTrunc is non-zero, then the pager file is truncated to
-** nTrunc pages (this is used by auto-vacuum databases).
-**
** If the final parameter - noSync - is true, then the database file itself
** is not synced. The caller must call sqlite3PagerSync() directly to
** sync the database file before calling CommitPhaseTwo() to delete the
** journal file in this case.
*/
SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
- Pager *pPager,
- const char *zMaster,
- Pgno nTrunc,
- int noSync
+ Pager *pPager, /* Pager object */
+ const char *zMaster, /* If not NULL, the master journal name */
+ int noSync /* True to omit the xSync on the db file */
){
- int rc = SQLITE_OK;
+ int rc = SQLITE_OK; /* Return code */
- /* If no changes have been made, we can leave the transaction early.
- */
- if( pPager->dbModified==0 &&
- (pPager->journalMode!=PAGER_JOURNALMODE_DELETE ||
- pPager->exclusiveMode!=0) ){
- assert( pPager->dirtyCache==0 || pPager->journalOpen==0 );
- return SQLITE_OK;
- }
+ /* The dbOrigSize is never set if journal_mode=OFF */
+ assert( pPager->journalMode!=PAGER_JOURNALMODE_OFF || pPager->dbOrigSize==0 );
- PAGERTRACE4("DATABASE SYNC: File=%s zMaster=%s nTrunc=%d\n",
- pPager->zFilename, zMaster, nTrunc);
- pagerEnter(pPager);
+ /* If a prior error occurred, this routine should not be called. ROLLBACK
+ ** is the appropriate response to an error, not COMMIT. Guard against
+ ** coding errors by repeating the prior error. */
+ if( NEVER(pPager->errCode) ) return pPager->errCode;
- /* If this is an in-memory db, or no pages have been written to, or this
- ** function has already been called, it is a no-op.
- */
- if( pPager->state!=PAGER_SYNCED && !MEMDB && pPager->dirtyCache ){
- PgHdr *pPg;
+ PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n",
+ pPager->zFilename, zMaster, pPager->dbSize));
-#ifdef SQLITE_ENABLE_ATOMIC_WRITE
- /* The atomic-write optimization can be used if all of the
- ** following are true:
+ if( MEMDB && pPager->dbModified ){
+ /* If this is an in-memory db, or no pages have been written to, or this
+ ** function has already been called, it is mostly a no-op. However, any
+ ** backup in progress needs to be restarted.
+ */
+ sqlite3BackupRestart(pPager->pBackup);
+ }else if( pPager->state!=PAGER_SYNCED && pPager->dbModified ){
+
+ /* The following block updates the change-counter. Exactly how it
+ ** does this depends on whether or not the atomic-update optimization
+ ** was enabled at compile time, and if this transaction meets the
+ ** runtime criteria to use the operation:
+ **
+ ** * The file-system supports the atomic-write property for
+ ** blocks of size page-size, and
+ ** * This commit is not part of a multi-file transaction, and
+ ** * Exactly one page has been modified and store in the journal file.
**
- ** + The file-system supports the atomic-write property for
- ** blocks of size page-size, and
- ** + This commit is not part of a multi-file transaction, and
- ** + Exactly one page has been modified and store in the journal file.
+ ** If the optimization was not enabled at compile time, then the
+ ** pager_incr_changecounter() function is called to update the change
+ ** counter in 'indirect-mode'. If the optimization is compiled in but
+ ** is not applicable to this transaction, call sqlite3JournalCreate()
+ ** to make sure the journal file has actually been created, then call
+ ** pager_incr_changecounter() to update the change-counter in indirect
+ ** mode.
**
- ** If the optimization can be used, then the journal file will never
- ** be created for this transaction.
+ ** Otherwise, if the optimization is both enabled and applicable,
+ ** then call pager_incr_changecounter() to update the change-counter
+ ** in 'direct' mode. In this case the journal file will never be
+ ** created for this transaction.
*/
- int useAtomicWrite = (
- !zMaster &&
- pPager->journalOpen &&
- pPager->journalOff==jrnlBufferSize(pPager) &&
- nTrunc==0 &&
- (0==pPager->pDirty || 0==pPager->pDirty->pDirty)
- );
- assert( pPager->journalOpen || pPager->journalMode==PAGER_JOURNALMODE_OFF );
- if( useAtomicWrite ){
- /* Update the nRec field in the journal file. */
- int offset = pPager->journalHdr + sizeof(aJournalMagic);
- assert(pPager->nRec==1);
- rc = write32bits(pPager->jfd, offset, pPager->nRec);
-
- /* Update the db file change counter. The following call will modify
- ** the in-memory representation of page 1 to include the updated
- ** change counter and then write page 1 directly to the database
- ** file. Because of the atomic-write property of the host file-system,
- ** this is safe.
+#ifdef SQLITE_ENABLE_ATOMIC_WRITE
+ PgHdr *pPg;
+ assert( isOpen(pPager->jfd) || pPager->journalMode==PAGER_JOURNALMODE_OFF );
+ if( !zMaster && isOpen(pPager->jfd)
+ && pPager->journalOff==jrnlBufferSize(pPager)
+ && pPager->dbSize>=pPager->dbFileSize
+ && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
+ ){
+ /* Update the db file change counter via the direct-write method. The
+ ** following call will modify the in-memory representation of page 1
+ ** to include the updated change counter and then write page 1
+ ** directly to the database file. Because of the atomic-write
+ ** property of the host file-system, this is safe.
*/
- if( rc==SQLITE_OK ){
- rc = pager_incr_changecounter(pPager, 1);
- }
+ rc = pager_incr_changecounter(pPager, 1);
}else{
rc = sqlite3JournalCreate(pPager->jfd);
+ if( rc==SQLITE_OK ){
+ rc = pager_incr_changecounter(pPager, 0);
+ }
}
-
- if( !useAtomicWrite && rc==SQLITE_OK )
+#else
+ rc = pager_incr_changecounter(pPager, 0);
#endif
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
- /* If a master journal file name has already been written to the
- ** journal file, then no sync is required. This happens when it is
- ** written, then the process fails to upgrade from a RESERVED to an
- ** EXCLUSIVE lock. The next time the process tries to commit the
- ** transaction the m-j name will have already been written.
+ /* If this transaction has made the database smaller, then all pages
+ ** being discarded by the truncation must be written to the journal
+ ** file. This can only happen in auto-vacuum mode.
+ **
+ ** Before reading the pages with page numbers larger than the
+ ** current value of Pager.dbSize, set dbSize back to the value
+ ** that it took at the start of the transaction. Otherwise, the
+ ** calls to sqlite3PagerGet() return zeroed pages instead of
+ ** reading data from the database file.
+ **
+ ** When journal_mode==OFF the dbOrigSize is always zero, so this
+ ** block never runs if journal_mode=OFF.
*/
- if( !pPager->setMaster ){
- rc = pager_incr_changecounter(pPager, 0);
- if( rc!=SQLITE_OK ) goto sync_exit;
#ifndef SQLITE_OMIT_AUTOVACUUM
- if( nTrunc!=0 ){
- /* If this transaction has made the database smaller, then all pages
- ** being discarded by the truncation must be written to the journal
- ** file.
- */
- Pgno i;
- int iSkip = PAGER_MJ_PGNO(pPager);
- for( i=nTrunc+1; i<=pPager->origDbSize; i++ ){
- if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
- rc = sqlite3PagerGet(pPager, i, &pPg);
- if( rc!=SQLITE_OK ) goto sync_exit;
- rc = sqlite3PagerWrite(pPg);
- sqlite3PagerUnref(pPg);
- if( rc!=SQLITE_OK ) goto sync_exit;
- }
- }
- }
-#endif
- rc = writeMasterJournal(pPager, zMaster);
- if( rc!=SQLITE_OK ) goto sync_exit;
- rc = syncJournal(pPager);
- }
- if( rc!=SQLITE_OK ) goto sync_exit;
-
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( nTrunc!=0 ){
- rc = sqlite3PagerTruncate(pPager, nTrunc);
- if( rc!=SQLITE_OK ) goto sync_exit;
+ if( pPager->dbSize<pPager->dbOrigSize
+ && ALWAYS(pPager->journalMode!=PAGER_JOURNALMODE_OFF)
+ ){
+ Pgno i; /* Iterator variable */
+ const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
+ const Pgno dbSize = pPager->dbSize; /* Database image size */
+ pPager->dbSize = pPager->dbOrigSize;
+ for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){
+ if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
+ PgHdr *pPage; /* Page to journal */
+ rc = sqlite3PagerGet(pPager, i, &pPage);
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+ rc = sqlite3PagerWrite(pPage);
+ sqlite3PagerUnref(pPage);
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+ }
+ }
+ pPager->dbSize = dbSize;
}
#endif
- /* Write all dirty pages to the database file */
- pPg = pager_get_all_dirty_pages(pPager);
- rc = pager_write_pagelist(pPg);
+ /* Write the master journal name into the journal file. If a master
+ ** journal file name has already been written to the journal file,
+ ** or if zMaster is NULL (no master journal), then this call is a no-op.
+ */
+ rc = writeMasterJournal(pPager, zMaster);
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+
+ /* Sync the journal file. If the atomic-update optimization is being
+ ** used, this call will not create the journal file or perform any
+ ** real IO.
+ */
+ rc = syncJournal(pPager);
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+
+ /* Write all dirty pages to the database file. */
+ rc = pager_write_pagelist(sqlite3PcacheDirtyList(pPager->pPCache));
if( rc!=SQLITE_OK ){
assert( rc!=SQLITE_IOERR_BLOCKED );
- /* The error might have left the dirty list all fouled up here,
- ** but that does not matter because if the if the dirty list did
- ** get corrupted, then the transaction will roll back and
- ** discard the dirty list. There is an assert in
- ** pager_get_all_dirty_pages() that verifies that no attempt
- ** is made to use an invalid dirty list.
- */
- goto sync_exit;
+ goto commit_phase_one_exit;
}
- pPager->pDirty = 0;
+ sqlite3PcacheCleanAll(pPager->pPCache);
- /* Sync the database file. */
+ /* If the file on disk is not the same size as the database image,
+ ** then use pager_truncate to grow or shrink the file here.
+ */
+ if( pPager->dbSize!=pPager->dbFileSize ){
+ Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
+ assert( pPager->state>=PAGER_EXCLUSIVE );
+ rc = pager_truncate(pPager, nNew);
+ if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
+ }
+
+ /* Finally, sync the database file. */
if( !pPager->noSync && !noSync ){
rc = sqlite3OsSync(pPager->fd, pPager->sync_flags);
}
IOTRACE(("DBSYNC %p\n", pPager))
pPager->state = PAGER_SYNCED;
- }else if( MEMDB && nTrunc!=0 ){
- rc = sqlite3PagerTruncate(pPager, nTrunc);
}
-sync_exit:
- if( rc==SQLITE_IOERR_BLOCKED ){
- /* pager_incr_changecounter() may attempt to obtain an exclusive
- * lock to spill the cache and return IOERR_BLOCKED. But since
- * there is no chance the cache is inconsistent, it is
- * better to return SQLITE_BUSY.
- */
- rc = SQLITE_BUSY;
- }
- pagerLeave(pPager);
+commit_phase_one_exit:
return rc;
}
/*
-** Commit all changes to the database and release the write lock.
+** When this function is called, the database file has been completely
+** updated to reflect the changes made by the current transaction and
+** synced to disk. The journal file still exists in the file-system
+** though, and if a failure occurs at this point it will eventually
+** be used as a hot-journal and the current transaction rolled back.
**
-** If the commit fails for any reason, a rollback attempt is made
-** and an error code is returned. If the commit worked, SQLITE_OK
-** is returned.
+** This function finalizes the journal file, either by deleting,
+** truncating or partially zeroing it, so that it cannot be used
+** for hot-journal rollback. Once this is done the transaction is
+** irrevocably committed.
+**
+** If an error occurs, an IO error code is returned and the pager
+** moves into the error state. Otherwise, SQLITE_OK is returned.
*/
SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){
- int rc;
- PgHdr *pPg;
+ int rc = SQLITE_OK; /* Return code */
- if( pPager->errCode ){
- return pPager->errCode;
- }
- if( pPager->state<PAGER_RESERVED ){
- return SQLITE_ERROR;
- }
- if( pPager->dbModified==0 &&
- (pPager->journalMode!=PAGER_JOURNALMODE_DELETE ||
- pPager->exclusiveMode!=0) ){
- assert( pPager->dirtyCache==0 || pPager->journalOpen==0 );
- return SQLITE_OK;
- }
- pagerEnter(pPager);
- PAGERTRACE2("COMMIT %d\n", PAGERID(pPager));
- if( MEMDB ){
- pPg = pager_get_all_dirty_pages(pPager);
- while( pPg ){
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- clearHistory(pHist);
- pPg->dirty = 0;
- pPg->inJournal = 0;
- pHist->inStmt = 0;
- pPg->needSync = 0;
- pHist->pPrevStmt = pHist->pNextStmt = 0;
- pPg = pPg->pDirty;
- }
- pPager->pDirty = 0;
-#ifndef NDEBUG
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- assert( !pPg->alwaysRollback );
- assert( !pHist->pOrig );
- assert( !pHist->pStmt );
- }
-#endif
- pPager->pStmt = 0;
- pPager->state = PAGER_SHARED;
- pagerLeave(pPager);
+ /* This routine should not be called if a prior error has occurred.
+ ** But if (due to a coding error elsewhere in the system) it does get
+ ** called, just return the same error code without doing anything. */
+ if( NEVER(pPager->errCode) ) return pPager->errCode;
+
+ /* This function should not be called if the pager is not in at least
+ ** PAGER_RESERVED state. And indeed SQLite never does this. But it is
+ ** nice to have this defensive test here anyway.
+ */
+ if( NEVER(pPager->state<PAGER_RESERVED) ) return SQLITE_ERROR;
+
+ /* An optimization. If the database was not actually modified during
+ ** this transaction, the pager is running in exclusive-mode and is
+ ** using persistent journals, then this function is a no-op.
+ **
+ ** The start of the journal file currently contains a single journal
+ ** header with the nRec field set to 0. If such a journal is used as
+ ** a hot-journal during hot-journal rollback, 0 changes will be made
+ ** to the database file. So there is no need to zero the journal
+ ** header. Since the pager is in exclusive mode, there is no need
+ ** to drop any locks either.
+ */
+ if( pPager->dbModified==0 && pPager->exclusiveMode
+ && pPager->journalMode==PAGER_JOURNALMODE_PERSIST
+ ){
+ assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) );
return SQLITE_OK;
}
- assert( pPager->state==PAGER_SYNCED || !pPager->dirtyCache );
+
+ PAGERTRACE(("COMMIT %d\n", PAGERID(pPager)));
+ assert( pPager->state==PAGER_SYNCED || MEMDB || !pPager->dbModified );
rc = pager_end_transaction(pPager, pPager->setMaster);
- rc = pager_error(pPager, rc);
- pagerLeave(pPager);
- return rc;
+ return pager_error(pPager, rc);
}
/*
-** Rollback all changes. The database falls back to PAGER_SHARED mode.
-** All in-memory cache pages revert to their original data contents.
-** The journal is deleted.
+** Rollback all changes. The database falls back to PAGER_SHARED mode.
**
-** This routine cannot fail unless some other process is not following
-** the correct locking protocol or unless some other
-** process is writing trash into the journal file (SQLITE_CORRUPT) or
-** unless a prior malloc() failed (SQLITE_NOMEM). Appropriate error
-** codes are returned for all these occasions. Otherwise,
-** SQLITE_OK is returned.
+** This function performs two tasks:
+**
+** 1) It rolls back the journal file, restoring all database file and
+** in-memory cache pages to the state they were in when the transaction
+** was opened, and
+** 2) It finalizes the journal file, so that it is not used for hot
+** rollback at any point in the future.
+**
+** subject to the following qualifications:
+**
+** * If the journal file is not yet open when this function is called,
+** then only (2) is performed. In this case there is no journal file
+** to roll back.
+**
+** * If in an error state other than SQLITE_FULL, then task (1) is
+** performed. If successful, task (2). Regardless of the outcome
+** of either, the error state error code is returned to the caller
+** (i.e. either SQLITE_IOERR or SQLITE_CORRUPT).
+**
+** * If the pager is in PAGER_RESERVED state, then attempt (1). Whether
+** or not (1) is succussful, also attempt (2). If successful, return
+** SQLITE_OK. Otherwise, enter the error state and return the first
+** error code encountered.
+**
+** In this case there is no chance that the database was written to.
+** So is safe to finalize the journal file even if the playback
+** (operation 1) failed. However the pager must enter the error state
+** as the contents of the in-memory cache are now suspect.
+**
+** * Finally, if in PAGER_EXCLUSIVE state, then attempt (1). Only
+** attempt (2) if (1) is successful. Return SQLITE_OK if successful,
+** otherwise enter the error state and return the error code from the
+** failing operation.
+**
+** In this case the database file may have been written to. So if the
+** playback operation did not succeed it would not be safe to finalize
+** the journal file. It needs to be left in the file-system so that
+** some other process can use it to restore the database state (by
+** hot-journal rollback).
*/
SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){
- int rc;
- PAGERTRACE2("ROLLBACK %d\n", PAGERID(pPager));
- if( MEMDB ){
- PgHdr *p;
- for(p=pPager->pAll; p; p=p->pNextAll){
- PgHistory *pHist;
- assert( !p->alwaysRollback );
- if( !p->dirty ){
- assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pOrig );
- assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pStmt );
- continue;
- }
-
- pHist = PGHDR_TO_HIST(p, pPager);
- if( pHist->pOrig ){
- memcpy(PGHDR_TO_DATA(p), pHist->pOrig, pPager->pageSize);
- PAGERTRACE3("ROLLBACK-PAGE %d of %d\n", p->pgno, PAGERID(pPager));
- }else{
- PAGERTRACE3("PAGE %d is clean on %d\n", p->pgno, PAGERID(pPager));
- }
- clearHistory(pHist);
- p->dirty = 0;
- p->inJournal = 0;
- pHist->inStmt = 0;
- pHist->pPrevStmt = pHist->pNextStmt = 0;
- if( pPager->xReiniter ){
- pPager->xReiniter(p, pPager->pageSize);
- }
- }
- pPager->pDirty = 0;
- pPager->pStmt = 0;
- pPager->dbSize = pPager->origDbSize;
- pager_truncate_cache(pPager);
- pPager->stmtInUse = 0;
- pPager->state = PAGER_SHARED;
- return SQLITE_OK;
- }
-
- pagerEnter(pPager);
- if( !pPager->dirtyCache || !pPager->journalOpen ){
+ int rc = SQLITE_OK; /* Return code */
+ PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager)));
+ if( !pPager->dbModified || !isOpen(pPager->jfd) ){
rc = pager_end_transaction(pPager, pPager->setMaster);
- pagerLeave(pPager);
- return rc;
- }
-
- if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
+ }else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){
if( pPager->state>=PAGER_EXCLUSIVE ){
pager_playback(pPager, 0);
}
- pagerLeave(pPager);
- return pPager->errCode;
- }
- if( pPager->state==PAGER_RESERVED ){
- int rc2;
- rc = pager_playback(pPager, 0);
- rc2 = pager_end_transaction(pPager, pPager->setMaster);
- if( rc==SQLITE_OK ){
- rc = rc2;
- }
+ rc = pPager->errCode;
}else{
- rc = pager_playback(pPager, 0);
- }
- /* pager_reset(pPager); */
- pPager->dbSize = -1;
+ if( pPager->state==PAGER_RESERVED ){
+ int rc2;
+ rc = pager_playback(pPager, 0);
+ rc2 = pager_end_transaction(pPager, pPager->setMaster);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }else{
+ rc = pager_playback(pPager, 0);
+ }
- /* If an error occurs during a ROLLBACK, we can no longer trust the pager
- ** cache. So call pager_error() on the way out to make any error
- ** persistent.
- */
- rc = pager_error(pPager, rc);
- pagerLeave(pPager);
+ if( !MEMDB ){
+ pPager->dbSizeValid = 0;
+ }
+
+ /* If an error occurs during a ROLLBACK, we can no longer trust the pager
+ ** cache. So call pager_error() on the way out to make any error
+ ** persistent.
+ */
+ rc = pager_error(pPager, rc);
+ }
return rc;
}
@@ -28610,7 +36142,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){
** Return TRUE if the database file is opened read-only. Return FALSE
** if the database is (in theory) writable.
*/
-SQLITE_PRIVATE int sqlite3PagerIsreadonly(Pager *pPager){
+SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){
return pPager->readOnly;
}
@@ -28618,7 +36150,14 @@ SQLITE_PRIVATE int sqlite3PagerIsreadonly(Pager *pPager){
** Return the number of references to the pager.
*/
SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){
- return pPager->nRef;
+ return sqlite3PcacheRefCount(pPager->pPCache);
+}
+
+/*
+** Return the number of references to the specified page.
+*/
+SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){
+ return sqlite3PcachePageRefcount(pPage);
}
#ifdef SQLITE_TEST
@@ -28627,10 +36166,10 @@ SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){
*/
SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
static int a[11];
- a[0] = pPager->nRef;
- a[1] = pPager->nPage;
- a[2] = pPager->mxPage;
- a[3] = pPager->dbSize;
+ a[0] = sqlite3PcacheRefCount(pPager->pPCache);
+ a[1] = sqlite3PcachePagecount(pPager->pPCache);
+ a[2] = sqlite3PcacheGetCachesize(pPager->pPCache);
+ a[3] = pPager->dbSizeValid ? (int) pPager->dbSize : -1;
a[4] = pPager->state;
a[5] = pPager->errCode;
a[6] = pPager->nHit;
@@ -28643,130 +36182,142 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
#endif
/*
-** Set the statement rollback point.
+** Return true if this is an in-memory pager.
+*/
+SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){
+ return MEMDB;
+}
+
+/*
+** Check that there are at least nSavepoint savepoints open. If there are
+** currently less than nSavepoints open, then open one or more savepoints
+** to make up the difference. If the number of savepoints is already
+** equal to nSavepoint, then this function is a no-op.
**
-** This routine should be called with the transaction journal already
-** open. A new statement journal is created that can be used to rollback
-** changes of a single SQL command within a larger transaction.
+** If a memory allocation fails, SQLITE_NOMEM is returned. If an error
+** occurs while opening the sub-journal file, then an IO error code is
+** returned. Otherwise, SQLITE_OK.
*/
-static int pagerStmtBegin(Pager *pPager){
- int rc;
- assert( !pPager->stmtInUse );
- assert( pPager->state>=PAGER_SHARED );
- assert( pPager->dbSize>=0 );
- PAGERTRACE2("STMT-BEGIN %d\n", PAGERID(pPager));
- if( MEMDB ){
- pPager->stmtInUse = 1;
- pPager->stmtSize = pPager->dbSize;
- return SQLITE_OK;
- }
- if( !pPager->journalOpen ){
- pPager->stmtAutoopen = 1;
- return SQLITE_OK;
- }
- assert( pPager->journalOpen );
- pagerLeave(pPager);
- assert( pPager->pInStmt==0 );
- pPager->pInStmt = sqlite3BitvecCreate(pPager->dbSize);
- pagerEnter(pPager);
- if( pPager->pInStmt==0 ){
- /* sqlite3OsLock(pPager->fd, SHARED_LOCK); */
- return SQLITE_NOMEM;
- }
- pPager->stmtJSize = pPager->journalOff;
- pPager->stmtSize = pPager->dbSize;
- pPager->stmtHdrOff = 0;
- pPager->stmtCksum = pPager->cksumInit;
- if( !pPager->stmtOpen ){
- rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->stfd, pPager->zStmtJrnl,
- SQLITE_OPEN_SUBJOURNAL);
- if( rc ){
- goto stmt_begin_failed;
+SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
+ int rc = SQLITE_OK; /* Return code */
+ int nCurrent = pPager->nSavepoint; /* Current number of savepoints */
+
+ if( nSavepoint>nCurrent && pPager->useJournal ){
+ int ii; /* Iterator variable */
+ PagerSavepoint *aNew; /* New Pager.aSavepoint array */
+
+ /* Either there is no active journal or the sub-journal is open or
+ ** the journal is always stored in memory */
+ assert( pPager->nSavepoint==0 || isOpen(pPager->sjfd) ||
+ pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
+
+ /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
+ ** if the allocation fails. Otherwise, zero the new portion in case a
+ ** malloc failure occurs while populating it in the for(...) loop below.
+ */
+ aNew = (PagerSavepoint *)sqlite3Realloc(
+ pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint
+ );
+ if( !aNew ){
+ return SQLITE_NOMEM;
}
- pPager->stmtOpen = 1;
- pPager->stmtNRec = 0;
- }
- pPager->stmtInUse = 1;
- return SQLITE_OK;
-
-stmt_begin_failed:
- if( pPager->pInStmt ){
- sqlite3BitvecDestroy(pPager->pInStmt);
- pPager->pInStmt = 0;
+ memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint));
+ pPager->aSavepoint = aNew;
+ pPager->nSavepoint = nSavepoint;
+
+ /* Populate the PagerSavepoint structures just allocated. */
+ for(ii=nCurrent; ii<nSavepoint; ii++){
+ assert( pPager->dbSizeValid );
+ aNew[ii].nOrig = pPager->dbSize;
+ if( isOpen(pPager->jfd) && ALWAYS(pPager->journalOff>0) ){
+ aNew[ii].iOffset = pPager->journalOff;
+ }else{
+ aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
+ }
+ aNew[ii].iSubRec = pPager->nSubRec;
+ aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize);
+ if( !aNew[ii].pInSavepoint ){
+ return SQLITE_NOMEM;
+ }
+ }
+
+ /* Open the sub-journal, if it is not already opened. */
+ rc = openSubJournal(pPager);
+ assertTruncateConstraint(pPager);
}
- return rc;
-}
-SQLITE_PRIVATE int sqlite3PagerStmtBegin(Pager *pPager){
- int rc;
- pagerEnter(pPager);
- rc = pagerStmtBegin(pPager);
- pagerLeave(pPager);
+
return rc;
}
/*
-** Commit a statement.
-*/
-SQLITE_PRIVATE int sqlite3PagerStmtCommit(Pager *pPager){
- pagerEnter(pPager);
- if( pPager->stmtInUse ){
- PgHdr *pPg, *pNext;
- PAGERTRACE2("STMT-COMMIT %d\n", PAGERID(pPager));
- if( !MEMDB ){
- /* sqlite3OsTruncate(pPager->stfd, 0); */
- sqlite3BitvecDestroy(pPager->pInStmt);
- pPager->pInStmt = 0;
- }else{
- for(pPg=pPager->pStmt; pPg; pPg=pNext){
- PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager);
- pNext = pHist->pNextStmt;
- assert( pHist->inStmt );
- pHist->inStmt = 0;
- pHist->pPrevStmt = pHist->pNextStmt = 0;
- sqlite3_free(pHist->pStmt);
- pHist->pStmt = 0;
- }
- }
- pPager->stmtNRec = 0;
- pPager->stmtInUse = 0;
- pPager->pStmt = 0;
- }
- pPager->stmtAutoopen = 0;
- pagerLeave(pPager);
- return SQLITE_OK;
-}
+** This function is called to rollback or release (commit) a savepoint.
+** The savepoint to release or rollback need not be the most recently
+** created savepoint.
+**
+** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE.
+** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with
+** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes
+** that have occurred since the specified savepoint was created.
+**
+** The savepoint to rollback or release is identified by parameter
+** iSavepoint. A value of 0 means to operate on the outermost savepoint
+** (the first created). A value of (Pager.nSavepoint-1) means operate
+** on the most recently created savepoint. If iSavepoint is greater than
+** (Pager.nSavepoint-1), then this function is a no-op.
+**
+** If a negative value is passed to this function, then the current
+** transaction is rolled back. This is different to calling
+** sqlite3PagerRollback() because this function does not terminate
+** the transaction or unlock the database, it just restores the
+** contents of the database to its original state.
+**
+** In any case, all savepoints with an index greater than iSavepoint
+** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE),
+** then savepoint iSavepoint is also destroyed.
+**
+** This function may return SQLITE_NOMEM if a memory allocation fails,
+** or an IO error code if an IO error occurs while rolling back a
+** savepoint. If no errors occur, SQLITE_OK is returned.
+*/
+SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
+ int rc = SQLITE_OK;
-/*
-** Rollback a statement.
-*/
-SQLITE_PRIVATE int sqlite3PagerStmtRollback(Pager *pPager){
- int rc;
- pagerEnter(pPager);
- if( pPager->stmtInUse ){
- PAGERTRACE2("STMT-ROLLBACK %d\n", PAGERID(pPager));
- if( MEMDB ){
- PgHdr *pPg;
- PgHistory *pHist;
- for(pPg=pPager->pStmt; pPg; pPg=pHist->pNextStmt){
- pHist = PGHDR_TO_HIST(pPg, pPager);
- if( pHist->pStmt ){
- memcpy(PGHDR_TO_DATA(pPg), pHist->pStmt, pPager->pageSize);
- sqlite3_free(pHist->pStmt);
- pHist->pStmt = 0;
- }
- }
- pPager->dbSize = pPager->stmtSize;
- pager_truncate_cache(pPager);
- rc = SQLITE_OK;
- }else{
- rc = pager_stmt_playback(pPager);
+ assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
+ assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK );
+
+ if( iSavepoint<pPager->nSavepoint ){
+ int ii; /* Iterator variable */
+ int nNew; /* Number of remaining savepoints after this op. */
+
+ /* Figure out how many savepoints will still be active after this
+ ** operation. Store this value in nNew. Then free resources associated
+ ** with any savepoints that are destroyed by this operation.
+ */
+ nNew = iSavepoint + (op==SAVEPOINT_ROLLBACK);
+ for(ii=nNew; ii<pPager->nSavepoint; ii++){
+ sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
+ }
+ pPager->nSavepoint = nNew;
+
+ /* If this is a rollback operation, playback the specified savepoint.
+ ** If this is a temp-file, it is possible that the journal file has
+ ** not yet been opened. In this case there have been no changes to
+ ** the database file, so the playback operation can be skipped.
+ */
+ if( op==SAVEPOINT_ROLLBACK && isOpen(pPager->jfd) ){
+ PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1];
+ rc = pagerPlaybackSavepoint(pPager, pSavepoint);
+ assert(rc!=SQLITE_DONE);
+ }
+
+ /* If this is a release of the outermost savepoint, truncate
+ ** the sub-journal to zero bytes in size. */
+ if( nNew==0 && op==SAVEPOINT_RELEASE && isOpen(pPager->sjfd) ){
+ assert( rc==SQLITE_OK );
+ rc = sqlite3OsTruncate(pPager->sjfd, 0);
+ pPager->nSubRec = 0;
}
- sqlite3PagerStmtCommit(pPager);
- }else{
- rc = SQLITE_OK;
}
- pPager->stmtAutoopen = 0;
- pagerLeave(pPager);
return rc;
}
@@ -28794,13 +36345,6 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){
}
/*
-** Return the directory of the database file.
-*/
-SQLITE_PRIVATE const char *sqlite3PagerDirname(Pager *pPager){
- return pPager->zDirectory;
-}
-
-/*
** Return the full pathname of the journal file.
*/
SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){
@@ -28817,15 +36361,24 @@ SQLITE_PRIVATE int sqlite3PagerNosync(Pager *pPager){
#ifdef SQLITE_HAS_CODEC
/*
-** Set the codec for this pager
+** Set or retrieve the codec for this pager
*/
-SQLITE_PRIVATE void sqlite3PagerSetCodec(
+static void sqlite3PagerSetCodec(
Pager *pPager,
void *(*xCodec)(void*,void*,Pgno,int),
- void *pCodecArg
+ void (*xCodecSizeChng)(void*,int,int),
+ void (*xCodecFree)(void*),
+ void *pCodec
){
+ if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
pPager->xCodec = xCodec;
- pPager->pCodecArg = pCodecArg;
+ pPager->xCodecSizeChng = xCodecSizeChng;
+ pPager->xCodecFree = xCodecFree;
+ pPager->pCodec = pCodec;
+ pagerReportSize(pPager);
+}
+static void *sqlite3PagerGetCodec(Pager *pPager){
+ return pPager->pCodec;
}
#endif
@@ -28835,7 +36388,7 @@ SQLITE_PRIVATE void sqlite3PagerSetCodec(
**
** There must be no references to the page previously located at
** pgno (which we call pPgOld) though that page is allowed to be
-** in cache. If the page previous located at pgno is not already
+** in cache. If the page previously located at pgno is not already
** in the rollback journal, it is not put there by by this routine.
**
** References to the page pPg remain valid. Updating any
@@ -28846,69 +36399,91 @@ SQLITE_PRIVATE void sqlite3PagerSetCodec(
** required that a statement transaction was not active, but this restriction
** has been removed (CREATE INDEX needs to move a page when a statement
** transaction is active).
+**
+** If the fourth argument, isCommit, is non-zero, then this page is being
+** moved as part of a database reorganization just before the transaction
+** is being committed. In this case, it is guaranteed that the database page
+** pPg refers to will not be written to again within this transaction.
+**
+** This function may return SQLITE_NOMEM or an IO error code if an error
+** occurs. Otherwise, it returns SQLITE_OK.
*/
-SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno){
- PgHdr *pPgOld; /* The page being overwritten. */
- int h;
- Pgno needSyncPgno = 0;
+SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){
+ PgHdr *pPgOld; /* The page being overwritten. */
+ Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */
+ int rc; /* Return code */
+ Pgno origPgno; /* The original page number */
- pagerEnter(pPager);
assert( pPg->nRef>0 );
- PAGERTRACE5("MOVE %d page %d (needSync=%d) moves to %d\n",
- PAGERID(pPager), pPg->pgno, pPg->needSync, pgno);
+ /* If the page being moved is dirty and has not been saved by the latest
+ ** savepoint, then save the current contents of the page into the
+ ** sub-journal now. This is required to handle the following scenario:
+ **
+ ** BEGIN;
+ ** <journal page X, then modify it in memory>
+ ** SAVEPOINT one;
+ ** <Move page X to location Y>
+ ** ROLLBACK TO one;
+ **
+ ** If page X were not written to the sub-journal here, it would not
+ ** be possible to restore its contents when the "ROLLBACK TO one"
+ ** statement were is processed.
+ **
+ ** subjournalPage() may need to allocate space to store pPg->pgno into
+ ** one or more savepoint bitvecs. This is the reason this function
+ ** may return SQLITE_NOMEM.
+ */
+ if( pPg->flags&PGHDR_DIRTY
+ && subjRequiresPage(pPg)
+ && SQLITE_OK!=(rc = subjournalPage(pPg))
+ ){
+ return rc;
+ }
+
+ PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n",
+ PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno));
IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno))
- pager_get_content(pPg);
- if( pPg->needSync ){
+ /* If the journal needs to be sync()ed before page pPg->pgno can
+ ** be written to, store pPg->pgno in local variable needSyncPgno.
+ **
+ ** If the isCommit flag is set, there is no need to remember that
+ ** the journal needs to be sync()ed before database page pPg->pgno
+ ** can be written to. The caller has already promised not to write to it.
+ */
+ if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){
needSyncPgno = pPg->pgno;
- assert( pPg->inJournal || (int)pgno>pPager->origDbSize );
- assert( pPg->dirty );
+ assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
+ assert( pPg->flags&PGHDR_DIRTY );
assert( pPager->needSync );
}
- /* Unlink pPg from its hash-chain */
- unlinkHashChain(pPager, pPg);
-
/* If the cache contains a page with page-number pgno, remove it
** from its hash chain. Also, if the PgHdr.needSync was set for
** page pgno before the 'move' operation, it needs to be retained
** for the page moved there.
*/
- pPg->needSync = 0;
+ pPg->flags &= ~PGHDR_NEED_SYNC;
pPgOld = pager_lookup(pPager, pgno);
+ assert( !pPgOld || pPgOld->nRef==1 );
if( pPgOld ){
- assert( pPgOld->nRef==0 );
- unlinkHashChain(pPager, pPgOld);
- makeClean(pPgOld);
- pPg->needSync = pPgOld->needSync;
- }else{
- pPg->needSync = 0;
+ pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC);
+ sqlite3PcacheDrop(pPgOld);
}
- pPg->inJournal = sqlite3BitvecTest(pPager->pInJournal, pgno);
- /* Change the page number for pPg and insert it into the new hash-chain. */
- assert( pgno!=0 );
- pPg->pgno = pgno;
- h = pgno & (pPager->nHash-1);
- if( pPager->aHash[h] ){
- assert( pPager->aHash[h]->pPrevHash==0 );
- pPager->aHash[h]->pPrevHash = pPg;
- }
- pPg->pNextHash = pPager->aHash[h];
- pPager->aHash[h] = pPg;
- pPg->pPrevHash = 0;
-
- makeDirty(pPg);
- pPager->dirtyCache = 1;
+ origPgno = pPg->pgno;
+ sqlite3PcacheMove(pPg, pgno);
+ sqlite3PcacheMakeDirty(pPg);
pPager->dbModified = 1;
if( needSyncPgno ){
/* If needSyncPgno is non-zero, then the journal file needs to be
** sync()ed before any data is written to database file page needSyncPgno.
** Currently, no such page exists in the page-cache and the
- ** Pager.pInJournal bit has been set. This needs to be remedied by loading
- ** the page into the pager-cache and setting the PgHdr.needSync flag.
+ ** "is journaled" bitvec flag has been set. This needs to be remedied by
+ ** loading the page into the pager-cache and setting the PgHdr.needSync
+ ** flag.
**
** If the attempt to load the page into the page-cache fails, (due
** to a malloc() or IO failure), clear the bit in the pInJournal[]
@@ -28920,25 +36495,39 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno){
** The sqlite3PagerGet() call may cause the journal to sync. So make
** sure the Pager.needSync flag is set too.
*/
- int rc;
PgHdr *pPgHdr;
assert( pPager->needSync );
rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr);
if( rc!=SQLITE_OK ){
- if( pPager->pInJournal && (int)needSyncPgno<=pPager->origDbSize ){
- sqlite3BitvecClear(pPager->pInJournal, needSyncPgno);
+ if( needSyncPgno<=pPager->dbOrigSize ){
+ assert( pPager->pTmpSpace!=0 );
+ sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace);
}
- pagerLeave(pPager);
return rc;
}
pPager->needSync = 1;
- pPgHdr->needSync = 1;
- pPgHdr->inJournal = 1;
- makeDirty(pPgHdr);
+ assert( pPager->noSync==0 && !MEMDB );
+ pPgHdr->flags |= PGHDR_NEED_SYNC;
+ sqlite3PcacheMakeDirty(pPgHdr);
sqlite3PagerUnref(pPgHdr);
}
- pagerLeave(pPager);
+ /*
+ ** For an in-memory database, make sure the original page continues
+ ** to exist, in case the transaction needs to roll back. We allocate
+ ** the page now, instead of at rollback, because we can better deal
+ ** with an out-of-memory error now. Ticket #3761.
+ */
+ if( MEMDB ){
+ DbPage *pNew;
+ rc = sqlite3PagerAcquire(pPager, origPgno, &pNew, 1);
+ if( rc!=SQLITE_OK ){
+ sqlite3PcacheMove(pPg, origPgno);
+ return rc;
+ }
+ sqlite3PagerUnref(pNew);
+ }
+
return SQLITE_OK;
}
#endif
@@ -28947,7 +36536,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno){
** Return a pointer to the data for the specified page.
*/
SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){
- return PGHDR_TO_DATA(pPg);
+ assert( pPg->nRef>0 || pPg->pPager->memDb );
+ return pPg->pData;
}
/*
@@ -28955,8 +36545,7 @@ SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){
** allocated along with the specified page.
*/
SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){
- Pager *pPager = pPg->pPager;
- return (pPager?PGHDR_TO_EXTRA(pPg, pPager):0);
+ return pPg->pExtra;
}
/*
@@ -28976,47 +36565,76 @@ SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){
assert( PAGER_LOCKINGMODE_QUERY<0 );
assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 );
if( eMode>=0 && !pPager->tempFile ){
- pPager->exclusiveMode = eMode;
+ pPager->exclusiveMode = (u8)eMode;
}
return (int)pPager->exclusiveMode;
}
/*
-** Get/set the journal-mode for this pager. Parameter eMode must be one
-** of PAGER_JOURNALMODE_QUERY, PAGER_JOURNALMODE_DELETE or
-** PAGER_JOURNALMODE_PERSIST. If the parameter is not _QUERY, then
-** the journal-mode is set to the value specified.
+** Get/set the journal-mode for this pager. Parameter eMode must be one of:
+**
+** PAGER_JOURNALMODE_QUERY
+** PAGER_JOURNALMODE_DELETE
+** PAGER_JOURNALMODE_TRUNCATE
+** PAGER_JOURNALMODE_PERSIST
+** PAGER_JOURNALMODE_OFF
+** PAGER_JOURNALMODE_MEMORY
+**
+** If the parameter is not _QUERY, then the journal_mode is set to the
+** value specified if the change is allowed. The change is disallowed
+** for the following reasons:
**
-** The returned value is either PAGER_JOURNALMODE_DELETE or
-** PAGER_JOURNALMODE_PERSIST, indicating the current (possibly updated)
-** journal-mode.
+** * An in-memory database can only have its journal_mode set to _OFF
+** or _MEMORY.
+**
+** * The journal mode may not be changed while a transaction is active.
+**
+** The returned indicate the current (possibly updated) journal-mode.
*/
SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *pPager, int eMode){
assert( eMode==PAGER_JOURNALMODE_QUERY
|| eMode==PAGER_JOURNALMODE_DELETE
+ || eMode==PAGER_JOURNALMODE_TRUNCATE
|| eMode==PAGER_JOURNALMODE_PERSIST
- || eMode==PAGER_JOURNALMODE_OFF );
+ || eMode==PAGER_JOURNALMODE_OFF
+ || eMode==PAGER_JOURNALMODE_MEMORY );
assert( PAGER_JOURNALMODE_QUERY<0 );
- assert( PAGER_JOURNALMODE_DELETE>=0 && PAGER_JOURNALMODE_PERSIST>=0 );
- if( eMode>=0 ){
- pPager->journalMode = eMode;
+ if( eMode>=0
+ && (!MEMDB || eMode==PAGER_JOURNALMODE_MEMORY
+ || eMode==PAGER_JOURNALMODE_OFF)
+ && !pPager->dbModified
+ && (!isOpen(pPager->jfd) || 0==pPager->journalOff)
+ ){
+ if( isOpen(pPager->jfd) ){
+ sqlite3OsClose(pPager->jfd);
+ }
+ pPager->journalMode = (u8)eMode;
}
return (int)pPager->journalMode;
}
-#ifdef SQLITE_TEST
/*
-** Print a listing of all referenced pages and their ref count.
+** Get/set the size-limit used for persistent journal files.
+**
+** Setting the size limit to -1 means no limit is enforced.
+** An attempt to set a limit smaller than -1 is a no-op.
*/
-SQLITE_PRIVATE void sqlite3PagerRefdump(Pager *pPager){
- PgHdr *pPg;
- for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
- if( pPg->nRef<=0 ) continue;
- sqlite3DebugPrintf("PAGE %3d addr=%p nRef=%d\n",
- pPg->pgno, PGHDR_TO_DATA(pPg), pPg->nRef);
+SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){
+ if( iLimit>=-1 ){
+ pPager->journalSizeLimit = iLimit;
}
+ return pPager->journalSizeLimit;
+}
+
+/*
+** Return a pointer to the pPager->pBackup variable. The backup module
+** in backup.c maintains the content of this variable. This module
+** uses it opaquely as an argument to sqlite3BackupRestart() and
+** sqlite3BackupUpdate() only.
+*/
+SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){
+ return &pPager->pBackup;
}
-#endif
#endif /* SQLITE_OMIT_DISKIO */
@@ -29034,7 +36652,7 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager *pPager){
**
*************************************************************************
**
-** $Id: btmutex.c,v 1.9 2008/01/23 12:52:41 drh Exp $
+** $Id: btmutex.c,v 1.17 2009/07/20 12:33:33 drh Exp $
**
** This file contains code used to implement mutexes on Btree objects.
** This code really belongs in btree.c. But btree.c is getting too
@@ -29054,7 +36672,7 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager *pPager){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** $Id: btreeInt.h,v 1.21 2008/04/24 19:15:10 shane Exp $
+** $Id: btreeInt.h,v 1.52 2009/07/15 17:25:46 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
@@ -29116,6 +36734,17 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager *pPager){
** 36 4 Number of freelist pages in the file
** 40 60 15 4-byte meta values passed to higher layers
**
+** 40 4 Schema cookie
+** 44 4 File format of schema layer
+** 48 4 Size of page cache
+** 52 4 Largest root-page (auto/incr_vacuum)
+** 56 4 1=UTF-8 2=UTF16le 3=UTF16be
+** 60 4 User version
+** 64 4 Incremental vacuum mode
+** 68 4 unused
+** 72 4 unused
+** 76 4 unused
+**
** All of the integer values are big-endian (most significant byte first).
**
** The file change counter is incremented when the database is changed
@@ -29249,11 +36878,6 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager *pPager){
** * zero or more pages numbers of leaves
*/
-/* Round up a number to the next larger multiple of 8. This is used
-** to force 8-byte alignment on 64-bit architectures.
-*/
-#define ROUND8(x) ((x+7)&~7)
-
/* The following value is the maximum cell size assuming a maximum page
** size give above.
@@ -29311,21 +36935,18 @@ typedef struct BtLock BtLock;
*/
struct MemPage {
u8 isInit; /* True if previously initialized. MUST BE FIRST! */
- u8 idxShift; /* True if Cell indices have changed */
u8 nOverflow; /* Number of overflow cell bodies in aCell[] */
u8 intKey; /* True if intkey flag is set */
u8 leaf; /* True if leaf flag is set */
- u8 zeroData; /* True if table stores keys only */
- u8 leafData; /* True if tables stores data on leaves only */
u8 hasData; /* True if this page stores data */
u8 hdrOffset; /* 100 for page 1. 0 otherwise */
u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */
u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */
u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */
u16 cellOffset; /* Index in aData of first cell pointer */
- u16 idxParent; /* Index in parent of this node */
u16 nFree; /* Number of free bytes on the page */
u16 nCell; /* Number of cells on this page, local and ovfl */
+ u16 maskPage; /* Mask for page offset */
struct _OvflCell { /* Cells that will not fit on aData[] */
u8 *pCell; /* Pointers to the body of the overflow cell */
u16 idx; /* Insert this cell before idx-th non-overflow cell */
@@ -29334,7 +36955,6 @@ struct MemPage {
u8 *aData; /* Pointer to disk image of the page data */
DbPage *pDbPage; /* Pager page handle */
Pgno pgno; /* Page number for this page */
- MemPage *pParent; /* The parent of this page. NULL for root */
};
/*
@@ -29344,6 +36964,24 @@ struct MemPage {
*/
#define EXTRA_SIZE sizeof(MemPage)
+/*
+** A linked list of the following structures is stored at BtShared.pLock.
+** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor
+** is opened on the table with root page BtShared.iTable. Locks are removed
+** from this list when a transaction is committed or rolled back, or when
+** a btree handle is closed.
+*/
+struct BtLock {
+ Btree *pBtree; /* Btree handle holding this lock */
+ Pgno iTable; /* Root page of table */
+ u8 eLock; /* READ_LOCK or WRITE_LOCK */
+ BtLock *pNext; /* Next in BtShared.pLock list */
+};
+
+/* Candidate values for BtLock.eLock */
+#define READ_LOCK 1
+#define WRITE_LOCK 2
+
/* A Btree handle
**
** A database connection contains a pointer to an instance of
@@ -29372,8 +37010,12 @@ struct Btree {
u8 sharable; /* True if we can share pBt with another db */
u8 locked; /* True if db currently has pBt locked */
int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */
+ int nBackup; /* Number of backup operations reading this btree */
Btree *pNext; /* List of other sharable Btrees from the same db */
Btree *pPrev; /* Back pointer of the same list */
+#ifndef SQLITE_OMIT_SHARED_CACHE
+ BtLock lock; /* Object used to lock page 1 */
+#endif
};
/*
@@ -29403,40 +37045,55 @@ struct Btree {
** may not be modified once it is initially set as long as nRef>0.
** The pSchema field may be set once under BtShared.mutex and
** thereafter is unchanged as long as nRef>0.
+**
+** isPending:
+**
+** If a BtShared client fails to obtain a write-lock on a database
+** table (because there exists one or more read-locks on the table),
+** the shared-cache enters 'pending-lock' state and isPending is
+** set to true.
+**
+** The shared-cache leaves the 'pending lock' state when either of
+** the following occur:
+**
+** 1) The current writer (BtShared.pWriter) concludes its transaction, OR
+** 2) The number of locks held by other connections drops to zero.
+**
+** while in the 'pending-lock' state, no connection may start a new
+** transaction.
+**
+** This feature is included to help prevent writer-starvation.
*/
struct BtShared {
Pager *pPager; /* The page cache */
sqlite3 *db; /* Database connection currently using this Btree */
BtCursor *pCursor; /* A list of all open cursors */
MemPage *pPage1; /* First page of the database */
- u8 inStmt; /* True if we are in a statement subtransaction */
u8 readOnly; /* True if the underlying file is readonly */
- u8 maxEmbedFrac; /* Maximum payload as % of total page size */
- u8 minEmbedFrac; /* Minimum payload as % of total page size */
- u8 minLeafFrac; /* Minimum leaf payload as % of total page size */
u8 pageSizeFixed; /* True if the page size can no longer be changed */
#ifndef SQLITE_OMIT_AUTOVACUUM
u8 autoVacuum; /* True if auto-vacuum is enabled */
u8 incrVacuum; /* True if incr-vacuum is enabled */
- Pgno nTrunc; /* Non-zero if the db will be truncated (incr vacuum) */
#endif
u16 pageSize; /* Total number of bytes on a page */
u16 usableSize; /* Number of usable bytes on each page */
- int maxLocal; /* Maximum local payload in non-LEAFDATA tables */
- int minLocal; /* Minimum local payload in non-LEAFDATA tables */
- int maxLeaf; /* Maximum local payload in a LEAFDATA table */
- int minLeaf; /* Minimum local payload in a LEAFDATA table */
+ u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */
+ u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */
+ u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */
+ u16 minLeaf; /* Minimum local payload in a LEAFDATA table */
u8 inTransaction; /* Transaction state */
int nTransaction; /* Number of open transactions (read + write) */
void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */
void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */
sqlite3_mutex *mutex; /* Non-recursive mutex required to access this struct */
- BusyHandler busyHdr; /* The busy handler for this btree */
+ Bitvec *pHasContent; /* Set of pages moved to free-list this transaction */
#ifndef SQLITE_OMIT_SHARED_CACHE
int nRef; /* Number of references to this structure */
BtShared *pNext; /* Next on a list of sharable BtShared structs */
BtLock *pLock; /* List of locks held on this shared-btree struct */
- Btree *pExclusive; /* Btree with an EXCLUSIVE lock on the whole db */
+ Btree *pWriter; /* Btree with currently open write transaction */
+ u8 isExclusive; /* True if pWriter has an EXCLUSIVE lock on the db */
+ u8 isPending; /* If waiting for read-locks to clear */
#endif
u8 *pTmpSpace; /* BtShared.pageSize bytes of space for tmp use */
};
@@ -29459,6 +37116,17 @@ struct CellInfo {
};
/*
+** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than
+** this will be declared corrupt. This value is calculated based on a
+** maximum database size of 2^31 pages a minimum fanout of 2 for a
+** root-node and 3 for all other internal nodes.
+**
+** If a tree that appears to be taller than this is encountered, it is
+** assumed that the database is corrupt.
+*/
+#define BTCURSOR_MAX_DEPTH 20
+
+/*
** A cursor is a pointer to a particular entry within a particular
** b-tree within a database file.
**
@@ -29478,8 +37146,7 @@ struct BtCursor {
BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */
struct KeyInfo *pKeyInfo; /* Argument passed to comparison function */
Pgno pgnoRoot; /* The root page of this tree */
- MemPage *pPage; /* Page that contains the entry */
- int idx; /* Index of the entry in pPage->aCell[] */
+ sqlite3_int64 cachedRowid; /* Next rowid cache. 0 means not valid */
CellInfo info; /* A parse of the cell we are pointing at */
u8 wrFlag; /* True if writable */
u8 atLast; /* Cursor pointing to the last entry */
@@ -29487,11 +37154,14 @@ struct BtCursor {
u8 eState; /* One of the CURSOR_XXX constants (see below) */
void *pKey; /* Saved key that was cursor's last known position */
i64 nKey; /* Size of pKey, or last integer key */
- int skip; /* (skip<0) -> Prev() is a no-op. (skip>0) -> Next() is */
+ int skipNext; /* Prev() is noop if negative. Next() is noop if positive */
#ifndef SQLITE_OMIT_INCRBLOB
u8 isIncrblobHandle; /* True if this cursor is an incr. io handle */
Pgno *aOverflow; /* Cache of overflow page locations */
#endif
+ i16 iPage; /* Index of current page in apPage */
+ MemPage *apPage[BTCURSOR_MAX_DEPTH]; /* Pages from root to current page */
+ u16 aiIdx[BTCURSOR_MAX_DEPTH]; /* Current index in apPage[i] */
};
/*
@@ -29509,7 +37179,7 @@ struct BtCursor {
** The table that this cursor was opened on still exists, but has been
** modified since the cursor was last used. The cursor position is saved
** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in
-** this state, restoreOrClearCursorPosition() can be called to attempt to
+** this state, restoreCursorPosition() can be called to attempt to
** seek the cursor to the saved position.
**
** CURSOR_FAULT:
@@ -29524,47 +37194,10 @@ struct BtCursor {
#define CURSOR_REQUIRESEEK 2
#define CURSOR_FAULT 3
-/*
-** The TRACE macro will print high-level status information about the
-** btree operation when the global variable sqlite3BtreeTrace is
-** enabled.
-*/
-#if SQLITE_TEST
-# define TRACE(X) if( sqlite3BtreeTrace ){ printf X; fflush(stdout); }
-#else
-# define TRACE(X)
-#endif
-
-/* The database page the PENDING_BYTE occupies. This page is never used.
-** TODO: This macro is very similary to PAGER_MJ_PGNO() in pager.c. They
-** should possibly be consolidated (presumably in pager.h).
-**
-** If disk I/O is omitted (meaning that the database is stored purely
-** in memory) then there is no pending byte.
-*/
-#ifdef SQLITE_OMIT_DISKIO
-# define PENDING_BYTE_PAGE(pBt) 0x7fffffff
-#else
-# define PENDING_BYTE_PAGE(pBt) ((PENDING_BYTE/(pBt)->pageSize)+1)
-#endif
-
-/*
-** A linked list of the following structures is stored at BtShared.pLock.
-** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor
-** is opened on the table with root page BtShared.iTable. Locks are removed
-** from this list when a transaction is committed or rolled back, or when
-** a btree handle is closed.
+/*
+** The database page the PENDING_BYTE occupies. This page is never used.
*/
-struct BtLock {
- Btree *pBtree; /* Btree handle holding this lock */
- Pgno iTable; /* Root page of table */
- u8 eLock; /* READ_LOCK or WRITE_LOCK */
- BtLock *pNext; /* Next in BtShared.pLock list */
-};
-
-/* Candidate values for BtLock.eLock */
-#define READ_LOCK 1
-#define WRITE_LOCK 2
+# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt)
/*
** These macros define the location of the pointer-map entry for a
@@ -29582,7 +37215,7 @@ struct BtLock {
** this test.
*/
#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno)
-#define PTRMAP_PTROFFSET(pBt, pgno) (5*(pgno-ptrmapPageno(pBt, pgno)-1))
+#define PTRMAP_PTROFFSET(pgptrmap, pgno) (5*(pgno-pgptrmap-1))
#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno))
/*
@@ -29652,41 +37285,55 @@ typedef struct IntegrityCk IntegrityCk;
struct IntegrityCk {
BtShared *pBt; /* The tree being checked out */
Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */
- int nPage; /* Number of pages in the database */
+ Pgno nPage; /* Number of pages in the database */
int *anRef; /* Number of times each page is referenced */
int mxErr; /* Stop accumulating errors when this reaches zero */
- char *zErrMsg; /* An error message. NULL if no errors seen. */
int nErr; /* Number of messages written to zErrMsg so far */
+ int mallocFailed; /* A memory allocation error has occurred */
+ StrAccum errMsg; /* Accumulate the error message text here */
};
/*
** Read or write a two- and four-byte big-endian integer values.
*/
#define get2byte(x) ((x)[0]<<8 | (x)[1])
-#define put2byte(p,v) ((p)[0] = (v)>>8, (p)[1] = (v))
+#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v))
#define get4byte sqlite3Get4byte
#define put4byte sqlite3Put4byte
+/************** End of btreeInt.h ********************************************/
+/************** Continuing where we left off in btmutex.c ********************/
+#ifndef SQLITE_OMIT_SHARED_CACHE
+#if SQLITE_THREADSAFE
+
/*
-** Internal routines that should be accessed by the btree layer only.
+** Obtain the BtShared mutex associated with B-Tree handle p. Also,
+** set BtShared.db to the database handle associated with p and the
+** p->locked boolean to true.
*/
-SQLITE_PRIVATE int sqlite3BtreeGetPage(BtShared*, Pgno, MemPage**, int);
-SQLITE_PRIVATE int sqlite3BtreeInitPage(MemPage *pPage, MemPage *pParent);
-SQLITE_PRIVATE void sqlite3BtreeParseCellPtr(MemPage*, u8*, CellInfo*);
-SQLITE_PRIVATE void sqlite3BtreeParseCell(MemPage*, int, CellInfo*);
-#ifdef SQLITE_TEST
-SQLITE_PRIVATE u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell);
-#endif
-SQLITE_PRIVATE int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur);
-SQLITE_PRIVATE void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur);
-SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur);
-SQLITE_PRIVATE int sqlite3BtreeIsRootPage(MemPage *pPage);
-SQLITE_PRIVATE void sqlite3BtreeMoveToParent(BtCursor *pCur);
+static void lockBtreeMutex(Btree *p){
+ assert( p->locked==0 );
+ assert( sqlite3_mutex_notheld(p->pBt->mutex) );
+ assert( sqlite3_mutex_held(p->db->mutex) );
-/************** End of btreeInt.h ********************************************/
-/************** Continuing where we left off in btmutex.c ********************/
-#if SQLITE_THREADSAFE && !defined(SQLITE_OMIT_SHARED_CACHE)
+ sqlite3_mutex_enter(p->pBt->mutex);
+ p->pBt->db = p->db;
+ p->locked = 1;
+}
+
+/*
+** Release the BtShared mutex associated with B-Tree handle p and
+** clear the p->locked boolean.
+*/
+static void unlockBtreeMutex(Btree *p){
+ assert( p->locked==1 );
+ assert( sqlite3_mutex_held(p->pBt->mutex) );
+ assert( sqlite3_mutex_held(p->db->mutex) );
+ assert( p->db==p->pBt->db );
+ sqlite3_mutex_leave(p->pBt->mutex);
+ p->locked = 0;
+}
/*
** Enter a mutex on the given BTree object.
@@ -29724,16 +37371,20 @@ SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){
/* We should already hold a lock on the database connection */
assert( sqlite3_mutex_held(p->db->mutex) );
+ /* Unless the database is sharable and unlocked, then BtShared.db
+ ** should already be set correctly. */
+ assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db );
+
if( !p->sharable ) return;
p->wantToLock++;
if( p->locked ) return;
-#ifndef SQLITE_MUTEX_NOOP
/* In most cases, we should be able to acquire the lock we
** want without having to go throught the ascending lock
** procedure that follows. Just be sure not to block.
*/
if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){
+ p->pBt->db = p->db;
p->locked = 1;
return;
}
@@ -29748,19 +37399,15 @@ SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){
assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt );
assert( !pLater->locked || pLater->wantToLock>0 );
if( pLater->locked ){
- sqlite3_mutex_leave(pLater->pBt->mutex);
- pLater->locked = 0;
+ unlockBtreeMutex(pLater);
}
}
- sqlite3_mutex_enter(p->pBt->mutex);
- p->locked = 1;
+ lockBtreeMutex(p);
for(pLater=p->pNext; pLater; pLater=pLater->pNext){
if( pLater->wantToLock ){
- sqlite3_mutex_enter(pLater->pBt->mutex);
- pLater->locked = 1;
+ lockBtreeMutex(pLater);
}
}
-#endif /* SQLITE_MUTEX_NOOP */
}
/*
@@ -29771,25 +37418,25 @@ SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){
assert( p->wantToLock>0 );
p->wantToLock--;
if( p->wantToLock==0 ){
- assert( p->locked );
- sqlite3_mutex_leave(p->pBt->mutex);
- p->locked = 0;
+ unlockBtreeMutex(p);
}
}
}
#ifndef NDEBUG
/*
-** Return true if the BtShared mutex is held on the btree.
-**
-** This routine makes no determination one why or another if the
-** database connection mutex is held.
+** Return true if the BtShared mutex is held on the btree, or if the
+** B-Tree is not marked as sharable.
**
** This routine is used only from within assert() statements.
*/
SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){
- return (p->sharable==0 ||
- (p->locked && p->wantToLock && sqlite3_mutex_held(p->pBt->mutex)));
+ assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 );
+ assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db );
+ assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) );
+ assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) );
+
+ return (p->sharable==0 || p->locked);
}
#endif
@@ -29829,21 +37476,22 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
assert( sqlite3_mutex_held(db->mutex) );
for(i=0; i<db->nDb; i++){
p = db->aDb[i].pBt;
+ assert( !p || (p->locked==0 && p->sharable) || p->pBt->db==p->db );
if( p && p->sharable ){
p->wantToLock++;
if( !p->locked ){
assert( p->wantToLock==1 );
while( p->pPrev ) p = p->pPrev;
- while( p->locked && p->pNext ) p = p->pNext;
+ /* Reason for ALWAYS: There must be at least on unlocked Btree in
+ ** the chain. Otherwise the !p->locked test above would have failed */
+ while( p->locked && ALWAYS(p->pNext) ) p = p->pNext;
for(pLater = p->pNext; pLater; pLater=pLater->pNext){
if( pLater->locked ){
- sqlite3_mutex_leave(pLater->pBt->mutex);
- pLater->locked = 0;
+ unlockBtreeMutex(pLater);
}
}
while( p ){
- sqlite3_mutex_enter(p->pBt->mutex);
- p->locked++;
+ lockBtreeMutex(p);
p = p->pNext;
}
}
@@ -29860,9 +37508,7 @@ SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){
assert( p->wantToLock>0 );
p->wantToLock--;
if( p->wantToLock==0 ){
- assert( p->locked );
- sqlite3_mutex_leave(p->pBt->mutex);
- p->locked = 0;
+ unlockBtreeMutex(p);
}
}
}
@@ -29893,11 +37539,11 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){
#endif /* NDEBUG */
/*
-** Potentially dd a new Btree pointer to a BtreeMutexArray.
-** Really only add the Btree if it can possibly be shared with
+** Add a new Btree pointer to a BtreeMutexArray.
+** if the pointer can possibly be shared with
** another database connection.
**
-** The Btrees are kept in sorted order by pBtree->pBt. That
+** The pointers are kept in sorted order by pBtree->pBt. That
** way when we go to enter all the mutexes, we can enter them
** in order without every having to backup and retry and without
** worrying about deadlock.
@@ -29917,7 +37563,7 @@ SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray *pArray, Btree
}
#endif
assert( pArray->nMutex>=0 );
- assert( pArray->nMutex<sizeof(pArray->aBtree)/sizeof(pArray->aBtree[0])-1 );
+ assert( pArray->nMutex<ArraySize(pArray->aBtree)-1 );
pBt = pBtree->pBt;
for(i=0; i<pArray->nMutex; i++){
assert( pArray->aBtree[i]!=pBtree );
@@ -29949,10 +37595,13 @@ SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray *pArray){
/* We should already hold a lock on the database connection */
assert( sqlite3_mutex_held(p->db->mutex) );
+ /* The Btree is sharable because only sharable Btrees are entered
+ ** into the array in the first place. */
+ assert( p->sharable );
+
p->wantToLock++;
- if( !p->locked && p->sharable ){
- sqlite3_mutex_enter(p->pBt->mutex);
- p->locked = 1;
+ if( !p->locked ){
+ lockBtreeMutex(p);
}
}
}
@@ -29966,22 +37615,34 @@ SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray *pArray){
Btree *p = pArray->aBtree[i];
/* Some basic sanity checking */
assert( i==0 || pArray->aBtree[i-1]->pBt<p->pBt );
- assert( p->locked || !p->sharable );
+ assert( p->locked );
assert( p->wantToLock>0 );
/* We should already hold a lock on the database connection */
assert( sqlite3_mutex_held(p->db->mutex) );
p->wantToLock--;
- if( p->wantToLock==0 && p->locked ){
- sqlite3_mutex_leave(p->pBt->mutex);
- p->locked = 0;
+ if( p->wantToLock==0 ){
+ unlockBtreeMutex(p);
}
}
}
-
-#endif /* SQLITE_THREADSAFE && !SQLITE_OMIT_SHARED_CACHE */
+#else
+SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){
+ p->pBt->db = p->db;
+}
+SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
+ int i;
+ for(i=0; i<db->nDb; i++){
+ Btree *p = db->aDb[i].pBt;
+ if( p ){
+ p->pBt->db = p->db;
+ }
+ }
+}
+#endif /* if SQLITE_THREADSAFE */
+#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */
/************** End of btmutex.c *********************************************/
/************** Begin file btree.c *******************************************/
@@ -29996,7 +37657,7 @@ SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray *pArray){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** $Id: btree.c,v 1.458 2008/05/09 16:57:51 danielk1977 Exp $
+** $Id: btree.c,v 1.705 2009/08/10 03:57:58 shane Exp $
**
** This file implements a external (disk-based) database using BTrees.
** See the header comment on "btreeInt.h" for additional information.
@@ -30013,26 +37674,28 @@ static const char zMagicHeader[] = SQLITE_FILE_HEADER;
** Set this global variable to 1 to enable tracing using the TRACE
** macro.
*/
-#if SQLITE_TEST
-int sqlite3BtreeTrace=0; /* True to enable tracing */
+#if 0
+int sqlite3BtreeTrace=1; /* True to enable tracing */
+# define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);}
+#else
+# define TRACE(X)
#endif
#ifndef SQLITE_OMIT_SHARED_CACHE
/*
-** A flag to indicate whether or not shared cache is enabled. Also,
-** a list of BtShared objects that are eligible for participation
-** in shared cache. The variables have file scope during normal builds,
-** but the test harness needs to access these variables so we make them
-** global for test builds.
+** A list of BtShared objects that are eligible for participation
+** in shared cache. This variable has file scope during normal builds,
+** but the test harness needs to access it so we make it global for
+** test builds.
+**
+** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER.
*/
#ifdef SQLITE_TEST
-SQLITE_PRIVATE BtShared *sqlite3SharedCacheList = 0;
-SQLITE_PRIVATE int sqlite3SharedCacheEnabled = 0;
+SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
#else
-static BtShared *sqlite3SharedCacheList = 0;
-static int sqlite3SharedCacheEnabled = 0;
+static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
#endif
#endif /* SQLITE_OMIT_SHARED_CACHE */
@@ -30045,44 +37708,155 @@ static int sqlite3SharedCacheEnabled = 0;
** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2().
*/
SQLITE_API int sqlite3_enable_shared_cache(int enable){
- sqlite3SharedCacheEnabled = enable;
+ sqlite3GlobalConfig.sharedCacheEnabled = enable;
return SQLITE_OK;
}
#endif
-/*
-** Forward declaration
-*/
-static int checkReadLocks(Btree*,Pgno,BtCursor*);
-
#ifdef SQLITE_OMIT_SHARED_CACHE
/*
- ** The functions queryTableLock(), lockTable() and unlockAllTables()
+ ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(),
+ ** and clearAllSharedCacheTableLocks()
** manipulate entries in the BtShared.pLock linked list used to store
** shared-cache table level locks. If the library is compiled with the
** shared-cache feature disabled, then there is only ever one user
** of each BtShared structure and so this locking is not necessary.
** So define the lock related functions as no-ops.
*/
- #define queryTableLock(a,b,c) SQLITE_OK
- #define lockTable(a,b,c) SQLITE_OK
- #define unlockAllTables(a)
+ #define querySharedCacheTableLock(a,b,c) SQLITE_OK
+ #define setSharedCacheTableLock(a,b,c) SQLITE_OK
+ #define clearAllSharedCacheTableLocks(a)
+ #define downgradeAllSharedCacheTableLocks(a)
+ #define hasSharedCacheTableLock(a,b,c,d) 1
+ #define hasReadConflicts(a, b) 0
#endif
#ifndef SQLITE_OMIT_SHARED_CACHE
+
+#ifdef SQLITE_DEBUG
+/*
+** This function is only used as part of an assert() statement. It checks
+** that connection p holds the required locks to read or write to the
+** b-tree with root page iRoot. If so, true is returned. Otherwise, false.
+** For example, when writing to a table b-tree with root-page iRoot via
+** Btree connection pBtree:
+**
+** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) );
+**
+** When writing to an index b-tree that resides in a sharable database, the
+** caller should have first obtained a lock specifying the root page of
+** the corresponding table b-tree. This makes things a bit more complicated,
+** as this module treats each b-tree as a separate structure. To determine
+** the table b-tree corresponding to the index b-tree being written, this
+** function has to search through the database schema.
+**
+** Instead of a lock on the b-tree rooted at page iRoot, the caller may
+** hold a write-lock on the schema table (root page 1). This is also
+** acceptable.
+*/
+static int hasSharedCacheTableLock(
+ Btree *pBtree, /* Handle that must hold lock */
+ Pgno iRoot, /* Root page of b-tree */
+ int isIndex, /* True if iRoot is the root of an index b-tree */
+ int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */
+){
+ Schema *pSchema = (Schema *)pBtree->pBt->pSchema;
+ Pgno iTab = 0;
+ BtLock *pLock;
+
+ /* If this b-tree database is not shareable, or if the client is reading
+ ** and has the read-uncommitted flag set, then no lock is required.
+ ** In these cases return true immediately. If the client is reading
+ ** or writing an index b-tree, but the schema is not loaded, then return
+ ** true also. In this case the lock is required, but it is too difficult
+ ** to check if the client actually holds it. This doesn't happen very
+ ** often. */
+ if( (pBtree->sharable==0)
+ || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted))
+ || (isIndex && (!pSchema || (pSchema->flags&DB_SchemaLoaded)==0 ))
+ ){
+ return 1;
+ }
+
+ /* Figure out the root-page that the lock should be held on. For table
+ ** b-trees, this is just the root page of the b-tree being read or
+ ** written. For index b-trees, it is the root page of the associated
+ ** table. */
+ if( isIndex ){
+ HashElem *p;
+ for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){
+ Index *pIdx = (Index *)sqliteHashData(p);
+ if( pIdx->tnum==(int)iRoot ){
+ iTab = pIdx->pTable->tnum;
+ }
+ }
+ }else{
+ iTab = iRoot;
+ }
+
+ /* Search for the required lock. Either a write-lock on root-page iTab, a
+ ** write-lock on the schema table, or (if the client is reading) a
+ ** read-lock on iTab will suffice. Return 1 if any of these are found. */
+ for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){
+ if( pLock->pBtree==pBtree
+ && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1))
+ && pLock->eLock>=eLockType
+ ){
+ return 1;
+ }
+ }
+
+ /* Failed to find the required lock. */
+ return 0;
+}
+
+/*
+** This function is also used as part of assert() statements only. It
+** returns true if there exist one or more cursors open on the table
+** with root page iRoot that do not belong to either connection pBtree
+** or some other connection that has the read-uncommitted flag set.
+**
+** For example, before writing to page iRoot:
+**
+** assert( !hasReadConflicts(pBtree, iRoot) );
+*/
+static int hasReadConflicts(Btree *pBtree, Pgno iRoot){
+ BtCursor *p;
+ for(p=pBtree->pBt->pCursor; p; p=p->pNext){
+ if( p->pgnoRoot==iRoot
+ && p->pBtree!=pBtree
+ && 0==(p->pBtree->db->flags & SQLITE_ReadUncommitted)
+ ){
+ return 1;
+ }
+ }
+ return 0;
+}
+#endif /* #ifdef SQLITE_DEBUG */
+
/*
** Query to see if btree handle p may obtain a lock of type eLock
** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return
-** SQLITE_OK if the lock may be obtained (by calling lockTable()), or
-** SQLITE_LOCKED if not.
+** SQLITE_OK if the lock may be obtained (by calling
+** setSharedCacheTableLock()), or SQLITE_LOCKED if not.
*/
-static int queryTableLock(Btree *p, Pgno iTab, u8 eLock){
+static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){
BtShared *pBt = p->pBt;
BtLock *pIter;
assert( sqlite3BtreeHoldsMutex(p) );
+ assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
+ assert( p->db!=0 );
+ assert( !(p->db->flags&SQLITE_ReadUncommitted)||eLock==WRITE_LOCK||iTab==1 );
+
+ /* If requesting a write-lock, then the Btree must have an open write
+ ** transaction on this file. And, obviously, for this to be so there
+ ** must be an open write transaction on the file itself.
+ */
+ assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) );
+ assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE );
/* This is a no-op if the shared-cache is not enabled */
if( !p->sharable ){
@@ -30092,35 +37866,30 @@ static int queryTableLock(Btree *p, Pgno iTab, u8 eLock){
/* If some other connection is holding an exclusive lock, the
** requested lock may not be obtained.
*/
- if( pBt->pExclusive && pBt->pExclusive!=p ){
- return SQLITE_LOCKED;
+ if( pBt->pWriter!=p && pBt->isExclusive ){
+ sqlite3ConnectionBlocked(p->db, pBt->pWriter->db);
+ return SQLITE_LOCKED_SHAREDCACHE;
}
- /* This (along with lockTable()) is where the ReadUncommitted flag is
- ** dealt with. If the caller is querying for a read-lock and the flag is
- ** set, it is unconditionally granted - even if there are write-locks
- ** on the table. If a write-lock is requested, the ReadUncommitted flag
- ** is not considered.
- **
- ** In function lockTable(), if a read-lock is demanded and the
- ** ReadUncommitted flag is set, no entry is added to the locks list
- ** (BtShared.pLock).
- **
- ** To summarize: If the ReadUncommitted flag is set, then read cursors do
- ** not create or respect table locks. The locking procedure for a
- ** write-cursor does not change.
- */
- if(
- !p->db ||
- 0==(p->db->flags&SQLITE_ReadUncommitted) ||
- eLock==WRITE_LOCK ||
- iTab==MASTER_ROOT
- ){
- for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
- if( pIter->pBtree!=p && pIter->iTable==iTab &&
- (pIter->eLock!=eLock || eLock!=READ_LOCK) ){
- return SQLITE_LOCKED;
+ for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
+ /* The condition (pIter->eLock!=eLock) in the following if(...)
+ ** statement is a simplification of:
+ **
+ ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK)
+ **
+ ** since we know that if eLock==WRITE_LOCK, then no other connection
+ ** may hold a WRITE_LOCK on any table in this file (since there can
+ ** only be a single writer).
+ */
+ assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK );
+ assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK);
+ if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){
+ sqlite3ConnectionBlocked(p->db, pIter->pBtree->db);
+ if( eLock==WRITE_LOCK ){
+ assert( p==pBt->pWriter );
+ pBt->isPending = 1;
}
+ return SQLITE_LOCKED_SHAREDCACHE;
}
}
return SQLITE_OK;
@@ -30133,36 +37902,37 @@ static int queryTableLock(Btree *p, Pgno iTab, u8 eLock){
** by Btree handle p. Parameter eLock must be either READ_LOCK or
** WRITE_LOCK.
**
-** SQLITE_OK is returned if the lock is added successfully. SQLITE_BUSY and
-** SQLITE_NOMEM may also be returned.
+** This function assumes the following:
+**
+** (a) The specified b-tree connection handle is connected to a sharable
+** b-tree database (one with the BtShared.sharable) flag set, and
+**
+** (b) No other b-tree connection handle holds a lock that conflicts
+** with the requested lock (i.e. querySharedCacheTableLock() has
+** already been called and returned SQLITE_OK).
+**
+** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM
+** is returned if a malloc attempt fails.
*/
-static int lockTable(Btree *p, Pgno iTable, u8 eLock){
+static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){
BtShared *pBt = p->pBt;
BtLock *pLock = 0;
BtLock *pIter;
assert( sqlite3BtreeHoldsMutex(p) );
+ assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
+ assert( p->db!=0 );
- /* This is a no-op if the shared-cache is not enabled */
- if( !p->sharable ){
- return SQLITE_OK;
- }
-
- assert( SQLITE_OK==queryTableLock(p, iTable, eLock) );
+ /* A connection with the read-uncommitted flag set will never try to
+ ** obtain a read-lock using this function. The only read-lock obtained
+ ** by a connection in read-uncommitted mode is on the sqlite_master
+ ** table, and that lock is obtained in BtreeBeginTrans(). */
+ assert( 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK );
- /* If the read-uncommitted flag is set and a read-lock is requested,
- ** return early without adding an entry to the BtShared.pLock list. See
- ** comment in function queryTableLock() for more info on handling
- ** the ReadUncommitted flag.
- */
- if(
- (p->db) &&
- (p->db->flags&SQLITE_ReadUncommitted) &&
- (eLock==READ_LOCK) &&
- iTable!=MASTER_ROOT
- ){
- return SQLITE_OK;
- }
+ /* This function should only be called on a sharable b-tree after it
+ ** has been determined that no other b-tree holds a conflicting lock. */
+ assert( p->sharable );
+ assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) );
/* First search the list for an existing lock on this table. */
for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
@@ -30201,31 +37971,72 @@ static int lockTable(Btree *p, Pgno iTable, u8 eLock){
#ifndef SQLITE_OMIT_SHARED_CACHE
/*
-** Release all the table locks (locks obtained via calls to the lockTable()
-** procedure) held by Btree handle p.
+** Release all the table locks (locks obtained via calls to
+** the setSharedCacheTableLock() procedure) held by Btree handle p.
+**
+** This function assumes that handle p has an open read or write
+** transaction. If it does not, then the BtShared.isPending variable
+** may be incorrectly cleared.
*/
-static void unlockAllTables(Btree *p){
+static void clearAllSharedCacheTableLocks(Btree *p){
BtShared *pBt = p->pBt;
BtLock **ppIter = &pBt->pLock;
assert( sqlite3BtreeHoldsMutex(p) );
assert( p->sharable || 0==*ppIter );
+ assert( p->inTrans>0 );
while( *ppIter ){
BtLock *pLock = *ppIter;
- assert( pBt->pExclusive==0 || pBt->pExclusive==pLock->pBtree );
+ assert( pBt->isExclusive==0 || pBt->pWriter==pLock->pBtree );
+ assert( pLock->pBtree->inTrans>=pLock->eLock );
if( pLock->pBtree==p ){
*ppIter = pLock->pNext;
- sqlite3_free(pLock);
+ assert( pLock->iTable!=1 || pLock==&p->lock );
+ if( pLock->iTable!=1 ){
+ sqlite3_free(pLock);
+ }
}else{
ppIter = &pLock->pNext;
}
}
- if( pBt->pExclusive==p ){
- pBt->pExclusive = 0;
+ assert( pBt->isPending==0 || pBt->pWriter );
+ if( pBt->pWriter==p ){
+ pBt->pWriter = 0;
+ pBt->isExclusive = 0;
+ pBt->isPending = 0;
+ }else if( pBt->nTransaction==2 ){
+ /* This function is called when connection p is concluding its
+ ** transaction. If there currently exists a writer, and p is not
+ ** that writer, then the number of locks held by connections other
+ ** than the writer must be about to drop to zero. In this case
+ ** set the isPending flag to 0.
+ **
+ ** If there is not currently a writer, then BtShared.isPending must
+ ** be zero already. So this next line is harmless in that case.
+ */
+ pBt->isPending = 0;
+ }
+}
+
+/*
+** This function changes all write-locks held by connection p to read-locks.
+*/
+static void downgradeAllSharedCacheTableLocks(Btree *p){
+ BtShared *pBt = p->pBt;
+ if( pBt->pWriter==p ){
+ BtLock *pLock;
+ pBt->pWriter = 0;
+ pBt->isExclusive = 0;
+ pBt->isPending = 0;
+ for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){
+ assert( pLock->eLock==READ_LOCK || pLock->pBtree==p );
+ pLock->eLock = READ_LOCK;
+ }
}
}
+
#endif /* SQLITE_OMIT_SHARED_CACHE */
static void releasePage(MemPage *pPage); /* Forward reference */
@@ -30261,14 +38072,121 @@ static void invalidateAllOverflowCache(BtShared *pBt){
invalidateOverflowCache(p);
}
}
+
+/*
+** This function is called before modifying the contents of a table
+** b-tree to invalidate any incrblob cursors that are open on the
+** row or one of the rows being modified.
+**
+** If argument isClearTable is true, then the entire contents of the
+** table is about to be deleted. In this case invalidate all incrblob
+** cursors open on any row within the table with root-page pgnoRoot.
+**
+** Otherwise, if argument isClearTable is false, then the row with
+** rowid iRow is being replaced or deleted. In this case invalidate
+** only those incrblob cursors open on this specific row.
+*/
+static void invalidateIncrblobCursors(
+ Btree *pBtree, /* The database file to check */
+ i64 iRow, /* The rowid that might be changing */
+ int isClearTable /* True if all rows are being deleted */
+){
+ BtCursor *p;
+ BtShared *pBt = pBtree->pBt;
+ assert( sqlite3BtreeHoldsMutex(pBtree) );
+ for(p=pBt->pCursor; p; p=p->pNext){
+ if( p->isIncrblobHandle && (isClearTable || p->info.nKey==iRow) ){
+ p->eState = CURSOR_INVALID;
+ }
+ }
+}
+
#else
#define invalidateOverflowCache(x)
#define invalidateAllOverflowCache(x)
+ #define invalidateIncrblobCursors(x,y,z)
#endif
/*
+** Set bit pgno of the BtShared.pHasContent bitvec. This is called
+** when a page that previously contained data becomes a free-list leaf
+** page.
+**
+** The BtShared.pHasContent bitvec exists to work around an obscure
+** bug caused by the interaction of two useful IO optimizations surrounding
+** free-list leaf pages:
+**
+** 1) When all data is deleted from a page and the page becomes
+** a free-list leaf page, the page is not written to the database
+** (as free-list leaf pages contain no meaningful data). Sometimes
+** such a page is not even journalled (as it will not be modified,
+** why bother journalling it?).
+**
+** 2) When a free-list leaf page is reused, its content is not read
+** from the database or written to the journal file (why should it
+** be, if it is not at all meaningful?).
+**
+** By themselves, these optimizations work fine and provide a handy
+** performance boost to bulk delete or insert operations. However, if
+** a page is moved to the free-list and then reused within the same
+** transaction, a problem comes up. If the page is not journalled when
+** it is moved to the free-list and it is also not journalled when it
+** is extracted from the free-list and reused, then the original data
+** may be lost. In the event of a rollback, it may not be possible
+** to restore the database to its original configuration.
+**
+** The solution is the BtShared.pHasContent bitvec. Whenever a page is
+** moved to become a free-list leaf page, the corresponding bit is
+** set in the bitvec. Whenever a leaf page is extracted from the free-list,
+** optimization 2 above is ommitted if the corresponding bit is already
+** set in BtShared.pHasContent. The contents of the bitvec are cleared
+** at the end of every transaction.
+*/
+static int btreeSetHasContent(BtShared *pBt, Pgno pgno){
+ int rc = SQLITE_OK;
+ if( !pBt->pHasContent ){
+ int nPage = 100;
+ sqlite3PagerPagecount(pBt->pPager, &nPage);
+ /* If sqlite3PagerPagecount() fails there is no harm because the
+ ** nPage variable is unchanged from its default value of 100 */
+ pBt->pHasContent = sqlite3BitvecCreate((u32)nPage);
+ if( !pBt->pHasContent ){
+ rc = SQLITE_NOMEM;
+ }
+ }
+ if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){
+ rc = sqlite3BitvecSet(pBt->pHasContent, pgno);
+ }
+ return rc;
+}
+
+/*
+** Query the BtShared.pHasContent vector.
+**
+** This function is called when a free-list leaf page is removed from the
+** free-list for reuse. It returns false if it is safe to retrieve the
+** page from the pager layer with the 'no-content' flag set. True otherwise.
+*/
+static int btreeGetHasContent(BtShared *pBt, Pgno pgno){
+ Bitvec *p = pBt->pHasContent;
+ return (p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTest(p, pgno)));
+}
+
+/*
+** Clear (destroy) the BtShared.pHasContent bitvec. This should be
+** invoked at the conclusion of each write-transaction.
+*/
+static void btreeClearHasContent(BtShared *pBt){
+ sqlite3BitvecDestroy(pBt->pHasContent);
+ pBt->pHasContent = 0;
+}
+
+/*
** Save the current cursor position in the variables BtCursor.nKey
** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK.
+**
+** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID)
+** prior to calling this routine.
*/
static int saveCursorPosition(BtCursor *pCur){
int rc;
@@ -30278,6 +38196,7 @@ static int saveCursorPosition(BtCursor *pCur){
assert( cursorHoldsMutex(pCur) );
rc = sqlite3BtreeKeySize(pCur, &pCur->nKey);
+ assert( rc==SQLITE_OK ); /* KeySize() cannot fail */
/* If this is an intKey table, then the above call to BtreeKeySize()
** stores the integer key in pCur->nKey. In this case this value is
@@ -30285,10 +38204,10 @@ static int saveCursorPosition(BtCursor *pCur){
** table, then malloc space for and store the pCur->nKey bytes of key
** data.
*/
- if( rc==SQLITE_OK && 0==pCur->pPage->intKey){
- void *pKey = sqlite3_malloc(pCur->nKey);
+ if( 0==pCur->apPage[0]->intKey ){
+ void *pKey = sqlite3Malloc( (int)pCur->nKey );
if( pKey ){
- rc = sqlite3BtreeKey(pCur, 0, pCur->nKey, pKey);
+ rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey);
if( rc==SQLITE_OK ){
pCur->pKey = pKey;
}else{
@@ -30298,11 +38217,15 @@ static int saveCursorPosition(BtCursor *pCur){
rc = SQLITE_NOMEM;
}
}
- assert( !pCur->pPage->intKey || !pCur->pKey );
+ assert( !pCur->apPage[0]->intKey || !pCur->pKey );
if( rc==SQLITE_OK ){
- releasePage(pCur->pPage);
- pCur->pPage = 0;
+ int i;
+ for(i=0; i<=pCur->iPage; i++){
+ releasePage(pCur->apPage[i]);
+ pCur->apPage[i] = 0;
+ }
+ pCur->iPage = -1;
pCur->eState = CURSOR_REQUIRESEEK;
}
@@ -30334,7 +38257,7 @@ static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){
/*
** Clear the current cursor position.
*/
-static void clearCursorPosition(BtCursor *pCur){
+SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){
assert( cursorHoldsMutex(pCur) );
sqlite3_free(pCur->pKey);
pCur->pKey = 0;
@@ -30342,30 +38265,52 @@ static void clearCursorPosition(BtCursor *pCur){
}
/*
+** In this version of BtreeMoveto, pKey is a packed index record
+** such as is generated by the OP_MakeRecord opcode. Unpack the
+** record and then call BtreeMovetoUnpacked() to do the work.
+*/
+static int btreeMoveto(
+ BtCursor *pCur, /* Cursor open on the btree to be searched */
+ const void *pKey, /* Packed key if the btree is an index */
+ i64 nKey, /* Integer key for tables. Size of pKey for indices */
+ int bias, /* Bias search to the high end */
+ int *pRes /* Write search results here */
+){
+ int rc; /* Status code */
+ UnpackedRecord *pIdxKey; /* Unpacked index key */
+ char aSpace[150]; /* Temp space for pIdxKey - to avoid a malloc */
+
+ if( pKey ){
+ assert( nKey==(i64)(int)nKey );
+ pIdxKey = sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey,
+ aSpace, sizeof(aSpace));
+ if( pIdxKey==0 ) return SQLITE_NOMEM;
+ }else{
+ pIdxKey = 0;
+ }
+ rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes);
+ if( pKey ){
+ sqlite3VdbeDeleteUnpackedRecord(pIdxKey);
+ }
+ return rc;
+}
+
+/*
** Restore the cursor to the position it was in (or as close to as possible)
** when saveCursorPosition() was called. Note that this call deletes the
** saved position info stored by saveCursorPosition(), so there can be
-** at most one effective restoreOrClearCursorPosition() call after each
+** at most one effective restoreCursorPosition() call after each
** saveCursorPosition().
-**
-** If the second argument argument - doSeek - is false, then instead of
-** returning the cursor to its saved position, any saved position is deleted
-** and the cursor state set to CURSOR_INVALID.
*/
-SQLITE_PRIVATE int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur){
+static int btreeRestoreCursorPosition(BtCursor *pCur){
int rc;
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState>=CURSOR_REQUIRESEEK );
if( pCur->eState==CURSOR_FAULT ){
- return pCur->skip;
+ return pCur->skipNext;
}
-#ifndef SQLITE_OMIT_INCRBLOB
- if( pCur->isIncrblobHandle ){
- return SQLITE_ABORT;
- }
-#endif
pCur->eState = CURSOR_INVALID;
- rc = sqlite3BtreeMoveto(pCur, pCur->pKey, 0, pCur->nKey, 0, &pCur->skip);
+ rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skipNext);
if( rc==SQLITE_OK ){
sqlite3_free(pCur->pKey);
pCur->pKey = 0;
@@ -30374,11 +38319,35 @@ SQLITE_PRIVATE int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur){
return rc;
}
-#define restoreOrClearCursorPosition(p) \
+#define restoreCursorPosition(p) \
(p->eState>=CURSOR_REQUIRESEEK ? \
- sqlite3BtreeRestoreOrClearCursorPosition(p) : \
+ btreeRestoreCursorPosition(p) : \
SQLITE_OK)
+/*
+** Determine whether or not a cursor has moved from the position it
+** was last placed at. Cursors can move when the row they are pointing
+** at is deleted out from under them.
+**
+** This routine returns an error code if something goes wrong. The
+** integer *pHasMoved is set to one if the cursor has moved and 0 if not.
+*/
+SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur, int *pHasMoved){
+ int rc;
+
+ rc = restoreCursorPosition(pCur);
+ if( rc ){
+ *pHasMoved = 1;
+ return rc;
+ }
+ if( pCur->eState!=CURSOR_VALID || pCur->skipNext!=0 ){
+ *pHasMoved = 1;
+ }else{
+ *pHasMoved = 0;
+ }
+ return SQLITE_OK;
+}
+
#ifndef SQLITE_OMIT_AUTOVACUUM
/*
** Given a page number of a regular database page, return the page
@@ -30386,7 +38355,8 @@ SQLITE_PRIVATE int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur){
** input page number.
*/
static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){
- int nPagesPerMapPage, iPtrMap, ret;
+ int nPagesPerMapPage;
+ Pgno iPtrMap, ret;
assert( sqlite3_mutex_held(pBt->mutex) );
nPagesPerMapPage = (pBt->usableSize/5)+1;
iPtrMap = (pgno-2)/nPagesPerMapPage;
@@ -30402,14 +38372,19 @@ static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){
**
** This routine updates the pointer map entry for page number 'key'
** so that it maps to type 'eType' and parent page number 'pgno'.
-** An error code is returned if something goes wrong, otherwise SQLITE_OK.
+**
+** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is
+** a no-op. If an error occurs, the appropriate error code is written
+** into *pRC.
*/
-static int ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent){
+static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){
DbPage *pDbPage; /* The pointer map page */
u8 *pPtrmap; /* The pointer map data */
Pgno iPtrmap; /* The pointer map page number */
int offset; /* Offset in pointer map page */
- int rc;
+ int rc; /* Return code from subfunctions */
+
+ if( *pRC ) return;
assert( sqlite3_mutex_held(pBt->mutex) );
/* The master-journal page number must never be used as a pointer map page */
@@ -30417,27 +38392,33 @@ static int ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent){
assert( pBt->autoVacuum );
if( key==0 ){
- return SQLITE_CORRUPT_BKPT;
+ *pRC = SQLITE_CORRUPT_BKPT;
+ return;
}
iPtrmap = PTRMAP_PAGENO(pBt, key);
rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
if( rc!=SQLITE_OK ){
- return rc;
+ *pRC = rc;
+ return;
+ }
+ offset = PTRMAP_PTROFFSET(iPtrmap, key);
+ if( offset<0 ){
+ *pRC = SQLITE_CORRUPT_BKPT;
+ goto ptrmap_exit;
}
- offset = PTRMAP_PTROFFSET(pBt, key);
pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){
TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent));
- rc = sqlite3PagerWrite(pDbPage);
+ *pRC= rc = sqlite3PagerWrite(pDbPage);
if( rc==SQLITE_OK ){
pPtrmap[offset] = eType;
put4byte(&pPtrmap[offset+1], parent);
}
}
+ptrmap_exit:
sqlite3PagerUnref(pDbPage);
- return rc;
}
/*
@@ -30463,7 +38444,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
}
pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
- offset = PTRMAP_PTROFFSET(pBt, key);
+ offset = PTRMAP_PTROFFSET(iPtrmap, key);
assert( pEType!=0 );
*pEType = pPtrmap[offset];
if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]);
@@ -30473,7 +38454,11 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
return SQLITE_OK;
}
-#endif /* SQLITE_OMIT_AUTOVACUUM */
+#else /* if defined SQLITE_OMIT_AUTOVACUUM */
+ #define ptrmapPut(w,x,y,z,rc)
+ #define ptrmapGet(w,x,y,z) SQLITE_OK
+ #define ptrmapPutOvflPtr(x, y, rc)
+#endif
/*
** Given a btree page and a cell index (0 means the first cell on
@@ -30482,19 +38467,12 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
**
** This routine works only for pages that do not contain overflow cells.
*/
-#define findCell(pPage, iCell) \
- ((pPage)->aData + get2byte(&(pPage)->aData[(pPage)->cellOffset+2*(iCell)]))
-#ifdef SQLITE_TEST
-SQLITE_PRIVATE u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell){
- assert( iCell>=0 );
- assert( iCell<get2byte(&pPage->aData[pPage->hdrOffset+3]) );
- return findCell(pPage, iCell);
-}
-#endif
+#define findCell(P,I) \
+ ((P)->aData + ((P)->maskPage & get2byte(&(P)->aData[(P)->cellOffset+2*(I)])))
/*
-** This a more complex version of sqlite3BtreeFindCell() that works for
-** pages that do contain overflow cells. See insert
+** This a more complex version of findCell() that works for
+** pages that do contain overflow cells.
*/
static u8 *findOverflowCell(MemPage *pPage, int iCell){
int i;
@@ -30516,19 +38494,19 @@ static u8 *findOverflowCell(MemPage *pPage, int iCell){
/*
** Parse a cell content block and fill in the CellInfo structure. There
-** are two versions of this function. sqlite3BtreeParseCell() takes a
-** cell index as the second argument and sqlite3BtreeParseCellPtr()
+** are two versions of this function. btreeParseCell() takes a
+** cell index as the second argument and btreeParseCellPtr()
** takes a pointer to the body of the cell as its second argument.
**
** Within this file, the parseCell() macro can be called instead of
-** sqlite3BtreeParseCellPtr(). Using some compilers, this will be faster.
+** btreeParseCellPtr(). Using some compilers, this will be faster.
*/
-SQLITE_PRIVATE void sqlite3BtreeParseCellPtr(
+static void btreeParseCellPtr(
MemPage *pPage, /* Page containing the cell */
u8 *pCell, /* Pointer to the cell text. */
CellInfo *pInfo /* Fill in this structure */
){
- int n; /* Number bytes in cell content header */
+ u16 n; /* Number bytes in cell content header */
u32 nPayload; /* Number of bytes of cell payload */
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
@@ -30537,34 +38515,35 @@ SQLITE_PRIVATE void sqlite3BtreeParseCellPtr(
assert( pPage->leaf==0 || pPage->leaf==1 );
n = pPage->childPtrSize;
assert( n==4-4*pPage->leaf );
- if( pPage->hasData ){
- n += getVarint32(&pCell[n], nPayload);
- }else{
- nPayload = 0;
- }
- pInfo->nData = nPayload;
if( pPage->intKey ){
- n += getVarint(&pCell[n], (u64 *)&pInfo->nKey);
+ if( pPage->hasData ){
+ n += getVarint32(&pCell[n], nPayload);
+ }else{
+ nPayload = 0;
+ }
+ n += getVarint(&pCell[n], (u64*)&pInfo->nKey);
+ pInfo->nData = nPayload;
}else{
- u32 x;
- n += getVarint32(&pCell[n], x);
- pInfo->nKey = x;
- nPayload += x;
+ pInfo->nData = 0;
+ n += getVarint32(&pCell[n], nPayload);
+ pInfo->nKey = nPayload;
}
pInfo->nPayload = nPayload;
pInfo->nHeader = n;
- if( nPayload<=pPage->maxLocal ){
+ testcase( nPayload==pPage->maxLocal );
+ testcase( nPayload==pPage->maxLocal+1 );
+ if( likely(nPayload<=pPage->maxLocal) ){
/* This is the (easy) common case where the entire payload fits
** on the local page. No overflow is required.
*/
int nSize; /* Total size of cell content in bytes */
- pInfo->nLocal = nPayload;
- pInfo->iOverflow = 0;
nSize = nPayload + n;
- if( nSize<4 ){
+ pInfo->nLocal = (u16)nPayload;
+ pInfo->iOverflow = 0;
+ if( (nSize & ~3)==0 ){
nSize = 4; /* Minimum cell size is 4 */
}
- pInfo->nSize = nSize;
+ pInfo->nSize = (u16)nSize;
}else{
/* If the payload will not fit completely on the local page, we have
** to decide how much to store locally and how much to spill onto
@@ -30582,18 +38561,20 @@ SQLITE_PRIVATE void sqlite3BtreeParseCellPtr(
minLocal = pPage->minLocal;
maxLocal = pPage->maxLocal;
surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4);
+ testcase( surplus==maxLocal );
+ testcase( surplus==maxLocal+1 );
if( surplus <= maxLocal ){
- pInfo->nLocal = surplus;
+ pInfo->nLocal = (u16)surplus;
}else{
- pInfo->nLocal = minLocal;
+ pInfo->nLocal = (u16)minLocal;
}
- pInfo->iOverflow = pInfo->nLocal + n;
+ pInfo->iOverflow = (u16)(pInfo->nLocal + n);
pInfo->nSize = pInfo->iOverflow + 4;
}
}
#define parseCell(pPage, iCell, pInfo) \
- sqlite3BtreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo))
-SQLITE_PRIVATE void sqlite3BtreeParseCell(
+ btreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo))
+static void btreeParseCell(
MemPage *pPage, /* Page containing the cell */
int iCell, /* The cell index. First cell is 0 */
CellInfo *pInfo /* Fill in this structure */
@@ -30607,18 +38588,63 @@ SQLITE_PRIVATE void sqlite3BtreeParseCell(
** data header and the local payload, but not any overflow page or
** the space used by the cell pointer.
*/
+static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
+ u8 *pIter = &pCell[pPage->childPtrSize];
+ u32 nSize;
+
+#ifdef SQLITE_DEBUG
+ /* The value returned by this function should always be the same as
+ ** the (CellInfo.nSize) value found by doing a full parse of the
+ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of
+ ** this function verifies that this invariant is not violated. */
+ CellInfo debuginfo;
+ btreeParseCellPtr(pPage, pCell, &debuginfo);
+#endif
+
+ if( pPage->intKey ){
+ u8 *pEnd;
+ if( pPage->hasData ){
+ pIter += getVarint32(pIter, nSize);
+ }else{
+ nSize = 0;
+ }
+
+ /* pIter now points at the 64-bit integer key value, a variable length
+ ** integer. The following block moves pIter to point at the first byte
+ ** past the end of the key value. */
+ pEnd = &pIter[9];
+ while( (*pIter++)&0x80 && pIter<pEnd );
+ }else{
+ pIter += getVarint32(pIter, nSize);
+ }
+
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==pPage->maxLocal+1 );
+ if( nSize>pPage->maxLocal ){
+ int minLocal = pPage->minLocal;
+ nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
+ testcase( nSize==pPage->maxLocal );
+ testcase( nSize==pPage->maxLocal+1 );
+ if( nSize>pPage->maxLocal ){
+ nSize = minLocal;
+ }
+ nSize += 4;
+ }
+ nSize += (u32)(pIter - pCell);
+
+ /* The minimum size of any cell is 4 bytes. */
+ if( nSize<4 ){
+ nSize = 4;
+ }
+
+ assert( nSize==debuginfo.nSize );
+ return (u16)nSize;
+}
#ifndef NDEBUG
static u16 cellSize(MemPage *pPage, int iCell){
- CellInfo info;
- sqlite3BtreeParseCell(pPage, iCell, &info);
- return info.nSize;
+ return cellSizePtr(pPage, findCell(pPage, iCell));
}
#endif
-static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
- CellInfo info;
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
- return info.nSize;
-}
#ifndef SQLITE_OMIT_AUTOVACUUM
/*
@@ -30626,28 +38652,16 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
** to an overflow page, insert an entry into the pointer-map
** for the overflow page.
*/
-static int ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell){
- if( pCell ){
- CellInfo info;
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
- assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload );
- if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){
- Pgno ovfl = get4byte(&pCell[info.iOverflow]);
- return ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno);
- }
+static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
+ CellInfo info;
+ if( *pRC ) return;
+ assert( pCell!=0 );
+ btreeParseCellPtr(pPage, pCell, &info);
+ assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload );
+ if( info.iOverflow ){
+ Pgno ovfl = get4byte(&pCell[info.iOverflow]);
+ ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC);
}
- return SQLITE_OK;
-}
-/*
-** If the cell with index iCell on page pPage contains a pointer
-** to an overflow page, insert an entry into the pointer-map
-** for the overflow page.
-*/
-static int ptrmapPutOvfl(MemPage *pPage, int iCell){
- u8 *pCell;
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- pCell = findOverflowCell(pPage, iCell);
- return ptrmapPutOvflPtr(pPage, pCell);
}
#endif
@@ -30661,15 +38675,17 @@ static int ptrmapPutOvfl(MemPage *pPage, int iCell){
static int defragmentPage(MemPage *pPage){
int i; /* Loop counter */
int pc; /* Address of a i-th cell */
- int addr; /* Offset of first byte after cell pointer array */
int hdr; /* Offset to the page header */
int size; /* Size of a cell */
int usableSize; /* Number of usable bytes on a page */
int cellOffset; /* Offset to the cell pointer array */
- int brk; /* Offset to the cell content area */
+ int cbrk; /* Offset to the cell content area */
int nCell; /* Number of cells on the page */
unsigned char *data; /* The page data */
unsigned char *temp; /* Temp area for cell content */
+ int iCellFirst; /* First allowable cell index */
+ int iCellLast; /* Last possible cell index */
+
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
assert( pPage->pBt!=0 );
@@ -30683,94 +38699,150 @@ static int defragmentPage(MemPage *pPage){
nCell = pPage->nCell;
assert( nCell==get2byte(&data[hdr+3]) );
usableSize = pPage->pBt->usableSize;
- brk = get2byte(&data[hdr+5]);
- memcpy(&temp[brk], &data[brk], usableSize - brk);
- brk = usableSize;
+ cbrk = get2byte(&data[hdr+5]);
+ memcpy(&temp[cbrk], &data[cbrk], usableSize - cbrk);
+ cbrk = usableSize;
+ iCellFirst = cellOffset + 2*nCell;
+ iCellLast = usableSize - 4;
for(i=0; i<nCell; i++){
u8 *pAddr; /* The i-th cell pointer */
pAddr = &data[cellOffset + i*2];
pc = get2byte(pAddr);
- assert( pc<pPage->pBt->usableSize );
+ testcase( pc==iCellFirst );
+ testcase( pc==iCellLast );
+#if !defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
+ /* These conditions have already been verified in btreeInitPage()
+ ** if SQLITE_ENABLE_OVERSIZE_CELL_CHECK is defined
+ */
+ if( pc<iCellFirst || pc>iCellLast ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+#endif
+ assert( pc>=iCellFirst && pc<=iCellLast );
size = cellSizePtr(pPage, &temp[pc]);
- brk -= size;
- memcpy(&data[brk], &temp[pc], size);
- put2byte(pAddr, brk);
+ cbrk -= size;
+#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
+ if( cbrk<iCellFirst ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+#else
+ if( cbrk<iCellFirst || pc+size>usableSize ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+#endif
+ assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
+ testcase( cbrk+size==usableSize );
+ testcase( pc+size==usableSize );
+ memcpy(&data[cbrk], &temp[pc], size);
+ put2byte(pAddr, cbrk);
}
- assert( brk>=cellOffset+2*nCell );
- put2byte(&data[hdr+5], brk);
+ assert( cbrk>=iCellFirst );
+ put2byte(&data[hdr+5], cbrk);
data[hdr+1] = 0;
data[hdr+2] = 0;
data[hdr+7] = 0;
- addr = cellOffset+2*nCell;
- memset(&data[addr], 0, brk-addr);
+ memset(&data[iCellFirst], 0, cbrk-iCellFirst);
+ assert( sqlite3PagerIswriteable(pPage->pDbPage) );
+ if( cbrk-iCellFirst!=pPage->nFree ){
+ return SQLITE_CORRUPT_BKPT;
+ }
return SQLITE_OK;
}
/*
-** Allocate nByte bytes of space on a page.
+** Allocate nByte bytes of space from within the B-Tree page passed
+** as the first argument. Write into *pIdx the index into pPage->aData[]
+** of the first byte of allocated space. Return either SQLITE_OK or
+** an error code (usually SQLITE_CORRUPT).
**
-** Return the index into pPage->aData[] of the first byte of
-** the new allocation. Or return 0 if there is not enough free
-** space on the page to satisfy the allocation request.
-**
-** If the page contains nBytes of free space but does not contain
-** nBytes of contiguous free space, then this routine automatically
-** calls defragementPage() to consolidate all free space before
-** allocating the new chunk.
+** The caller guarantees that there is sufficient space to make the
+** allocation. This routine might need to defragment in order to bring
+** all the space together, however. This routine will avoid using
+** the first two bytes past the cell pointer area since presumably this
+** allocation is being made in order to insert a new cell, so we will
+** also end up needing a new cell pointer.
*/
-static int allocateSpace(MemPage *pPage, int nByte){
- int addr, pc, hdr;
- int size;
- int nFrag;
- int top;
- int nCell;
- int cellOffset;
- unsigned char *data;
+static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
+ const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */
+ u8 * const data = pPage->aData; /* Local cache of pPage->aData */
+ int nFrag; /* Number of fragmented bytes on pPage */
+ int top; /* First byte of cell content area */
+ int gap; /* First byte of gap between cell pointers and cell content */
+ int rc; /* Integer return code */
- data = pPage->aData;
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
assert( pPage->pBt );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- if( nByte<4 ) nByte = 4;
- if( pPage->nFree<nByte || pPage->nOverflow>0 ) return 0;
- pPage->nFree -= nByte;
- hdr = pPage->hdrOffset;
+ assert( nByte>=0 ); /* Minimum cell size is 4 */
+ assert( pPage->nFree>=nByte );
+ assert( pPage->nOverflow==0 );
+ assert( nByte<pPage->pBt->usableSize-8 );
nFrag = data[hdr+7];
- if( nFrag<60 ){
- /* Search the freelist looking for a slot big enough to satisfy the
- ** space request. */
- addr = hdr+1;
- while( (pc = get2byte(&data[addr]))>0 ){
- size = get2byte(&data[pc+2]);
+ assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf );
+ gap = pPage->cellOffset + 2*pPage->nCell;
+ top = get2byte(&data[hdr+5]);
+ if( gap>top ) return SQLITE_CORRUPT_BKPT;
+ testcase( gap+2==top );
+ testcase( gap+1==top );
+ testcase( gap==top );
+
+ if( nFrag>=60 ){
+ /* Always defragment highly fragmented pages */
+ rc = defragmentPage(pPage);
+ if( rc ) return rc;
+ top = get2byte(&data[hdr+5]);
+ }else if( gap+2<=top ){
+ /* Search the freelist looking for a free slot big enough to satisfy
+ ** the request. The allocation is made from the first free slot in
+ ** the list that is large enough to accomadate it.
+ */
+ int pc, addr;
+ for(addr=hdr+1; (pc = get2byte(&data[addr]))>0; addr=pc){
+ int size = get2byte(&data[pc+2]); /* Size of free slot */
if( size>=nByte ){
- if( size<nByte+4 ){
+ int x = size - nByte;
+ testcase( x==4 );
+ testcase( x==3 );
+ if( x<4 ){
+ /* Remove the slot from the free-list. Update the number of
+ ** fragmented bytes within the page. */
memcpy(&data[addr], &data[pc], 2);
- data[hdr+7] = nFrag + size - nByte;
- return pc;
+ data[hdr+7] = (u8)(nFrag + x);
}else{
- put2byte(&data[pc+2], size-nByte);
- return pc + size - nByte;
+ /* The slot remains on the free-list. Reduce its size to account
+ ** for the portion used by the new allocation. */
+ put2byte(&data[pc+2], x);
}
+ *pIdx = pc + x;
+ return SQLITE_OK;
}
- addr = pc;
}
}
- /* Allocate memory from the gap in between the cell pointer array
- ** and the cell content area.
+ /* Check to make sure there is enough space in the gap to satisfy
+ ** the allocation. If not, defragment.
*/
- top = get2byte(&data[hdr+5]);
- nCell = get2byte(&data[hdr+3]);
- cellOffset = pPage->cellOffset;
- if( nFrag>=60 || cellOffset + 2*nCell > top - nByte ){
- if( defragmentPage(pPage) ) return 0;
+ testcase( gap+2+nByte==top );
+ if( gap+2+nByte>top ){
+ rc = defragmentPage(pPage);
+ if( rc ) return rc;
top = get2byte(&data[hdr+5]);
+ assert( gap+nByte<=top );
}
+
+
+ /* Allocate memory from the gap in between the cell pointer array
+ ** and the cell content area. The btreeInitPage() call has already
+ ** validated the freelist. Given that the freelist is valid, there
+ ** is no way that the allocation can extend off the end of the page.
+ ** The assert() below verifies the previous sentence.
+ */
top -= nByte;
- assert( cellOffset + 2*nCell <= top );
put2byte(&data[hdr+5], top);
- return top;
+ assert( top+nByte <= pPage->pBt->usableSize );
+ *pIdx = top;
+ return SQLITE_OK;
}
/*
@@ -30781,16 +38853,17 @@ static int allocateSpace(MemPage *pPage, int nByte){
** Most of the effort here is involved in coalesing adjacent
** free blocks into a single big free block.
*/
-static void freeSpace(MemPage *pPage, int start, int size){
+static int freeSpace(MemPage *pPage, int start, int size){
int addr, pbegin, hdr;
+ int iLast; /* Largest possible freeblock offset */
unsigned char *data = pPage->aData;
assert( pPage->pBt!=0 );
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
- assert( start>=pPage->hdrOffset+6+(pPage->leaf?0:4) );
+ assert( start>=pPage->hdrOffset+6+pPage->childPtrSize );
assert( (start + size)<=pPage->pBt->usableSize );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- if( size<4 ) size = 4;
+ assert( size>=0 ); /* Minimum cell size is 4 */
#ifdef SQLITE_SECURE_DELETE
/* Overwrite deleted information with zeros when the SECURE_DELETE
@@ -30798,35 +38871,52 @@ static void freeSpace(MemPage *pPage, int start, int size){
memset(&data[start], 0, size);
#endif
- /* Add the space back into the linked list of freeblocks */
+ /* Add the space back into the linked list of freeblocks. Note that
+ ** even though the freeblock list was checked by btreeInitPage(),
+ ** btreeInitPage() did not detect overlapping cells or
+ ** freeblocks that overlapped cells. Nor does it detect when the
+ ** cell content area exceeds the value in the page header. If these
+ ** situations arise, then subsequent insert operations might corrupt
+ ** the freelist. So we do need to check for corruption while scanning
+ ** the freelist.
+ */
hdr = pPage->hdrOffset;
addr = hdr + 1;
+ iLast = pPage->pBt->usableSize - 4;
+ assert( start<=iLast );
while( (pbegin = get2byte(&data[addr]))<start && pbegin>0 ){
- assert( pbegin<=pPage->pBt->usableSize-4 );
- assert( pbegin>addr );
+ if( pbegin<addr+4 ){
+ return SQLITE_CORRUPT_BKPT;
+ }
addr = pbegin;
}
- assert( pbegin<=pPage->pBt->usableSize-4 );
+ if( pbegin>iLast ){
+ return SQLITE_CORRUPT_BKPT;
+ }
assert( pbegin>addr || pbegin==0 );
put2byte(&data[addr], start);
put2byte(&data[start], pbegin);
put2byte(&data[start+2], size);
- pPage->nFree += size;
+ pPage->nFree = pPage->nFree + (u16)size;
/* Coalesce adjacent free blocks */
- addr = pPage->hdrOffset + 1;
+ addr = hdr + 1;
while( (pbegin = get2byte(&data[addr]))>0 ){
- int pnext, psize;
+ int pnext, psize, x;
assert( pbegin>addr );
assert( pbegin<=pPage->pBt->usableSize-4 );
pnext = get2byte(&data[pbegin]);
psize = get2byte(&data[pbegin+2]);
if( pbegin + psize + 3 >= pnext && pnext>0 ){
int frag = pnext - (pbegin+psize);
- assert( frag<=data[pPage->hdrOffset+7] );
- data[pPage->hdrOffset+7] -= frag;
- put2byte(&data[pbegin], get2byte(&data[pnext]));
- put2byte(&data[pbegin+2], pnext+get2byte(&data[pnext+2])-pbegin);
+ if( (frag<0) || (frag>(int)data[hdr+7]) ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ data[hdr+7] -= (u8)frag;
+ x = get2byte(&data[pnext]);
+ put2byte(&data[pbegin], x);
+ x = pnext + get2byte(&data[pnext+2]) - pbegin;
+ put2byte(&data[pbegin+2], x);
}else{
addr = pbegin;
}
@@ -30837,122 +38927,162 @@ static void freeSpace(MemPage *pPage, int start, int size){
int top;
pbegin = get2byte(&data[hdr+1]);
memcpy(&data[hdr+1], &data[pbegin], 2);
- top = get2byte(&data[hdr+5]);
- put2byte(&data[hdr+5], top + get2byte(&data[pbegin+2]));
+ top = get2byte(&data[hdr+5]) + get2byte(&data[pbegin+2]);
+ put2byte(&data[hdr+5], top);
}
+ assert( sqlite3PagerIswriteable(pPage->pDbPage) );
+ return SQLITE_OK;
}
/*
** Decode the flags byte (the first byte of the header) for a page
** and initialize fields of the MemPage structure accordingly.
+**
+** Only the following combinations are supported. Anything different
+** indicates a corrupt database files:
+**
+** PTF_ZERODATA
+** PTF_ZERODATA | PTF_LEAF
+** PTF_LEAFDATA | PTF_INTKEY
+** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF
*/
-static void decodeFlags(MemPage *pPage, int flagByte){
+static int decodeFlags(MemPage *pPage, int flagByte){
BtShared *pBt; /* A copy of pPage->pBt */
assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- pPage->intKey = (flagByte & (PTF_INTKEY|PTF_LEAFDATA))!=0;
- pPage->zeroData = (flagByte & PTF_ZERODATA)!=0;
- pPage->leaf = (flagByte & PTF_LEAF)!=0;
- pPage->childPtrSize = 4*(pPage->leaf==0);
+ pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 );
+ flagByte &= ~PTF_LEAF;
+ pPage->childPtrSize = 4-4*pPage->leaf;
pBt = pPage->pBt;
- if( flagByte & PTF_LEAFDATA ){
- pPage->leafData = 1;
+ if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
+ pPage->intKey = 1;
+ pPage->hasData = pPage->leaf;
pPage->maxLocal = pBt->maxLeaf;
pPage->minLocal = pBt->minLeaf;
- }else{
- pPage->leafData = 0;
+ }else if( flagByte==PTF_ZERODATA ){
+ pPage->intKey = 0;
+ pPage->hasData = 0;
pPage->maxLocal = pBt->maxLocal;
pPage->minLocal = pBt->minLocal;
+ }else{
+ return SQLITE_CORRUPT_BKPT;
}
- pPage->hasData = !(pPage->zeroData || (!pPage->leaf && pPage->leafData));
+ return SQLITE_OK;
}
/*
** Initialize the auxiliary information for a disk block.
**
-** The pParent parameter must be a pointer to the MemPage which
-** is the parent of the page being initialized. The root of a
-** BTree has no parent and so for that page, pParent==NULL.
-**
** Return SQLITE_OK on success. If we see that the page does
** not contain a well-formed database page, then return
** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not
** guarantee that the page is well-formed. It only shows that
** we failed to detect any corruption.
*/
-SQLITE_PRIVATE int sqlite3BtreeInitPage(
- MemPage *pPage, /* The page to be initialized */
- MemPage *pParent /* The parent. Might be NULL */
-){
- int pc; /* Address of a freeblock within pPage->aData[] */
- int hdr; /* Offset to beginning of page header */
- u8 *data; /* Equal to pPage->aData */
- BtShared *pBt; /* The main btree structure */
- int usableSize; /* Amount of usable space on each page */
- int cellOffset; /* Offset from start of page to first cell pointer */
- int nFree; /* Number of unused bytes on the page */
- int top; /* First byte of the cell content area */
+static int btreeInitPage(MemPage *pPage){
- pBt = pPage->pBt;
- assert( pBt!=0 );
- assert( pParent==0 || pParent->pBt==pBt );
- assert( sqlite3_mutex_held(pBt->mutex) );
+ assert( pPage->pBt!=0 );
+ assert( sqlite3_mutex_held(pPage->pBt->mutex) );
assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) );
assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) );
assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) );
- if( pPage->pParent!=pParent && (pPage->pParent!=0 || pPage->isInit) ){
- /* The parent page should never change unless the file is corrupt */
- return SQLITE_CORRUPT_BKPT;
- }
- if( pPage->isInit ) return SQLITE_OK;
- if( pPage->pParent==0 && pParent!=0 ){
- pPage->pParent = pParent;
- sqlite3PagerRef(pParent->pDbPage);
- }
- hdr = pPage->hdrOffset;
- data = pPage->aData;
- decodeFlags(pPage, data[hdr]);
- pPage->nOverflow = 0;
- pPage->idxShift = 0;
- usableSize = pBt->usableSize;
- pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf;
- top = get2byte(&data[hdr+5]);
- pPage->nCell = get2byte(&data[hdr+3]);
- if( pPage->nCell>MX_CELL(pBt) ){
- /* To many cells for a single page. The page must be corrupt */
- return SQLITE_CORRUPT_BKPT;
- }
- if( pPage->nCell==0 && pParent!=0 && pParent->pgno!=1 ){
- /* All pages must have at least one cell, except for root pages */
- return SQLITE_CORRUPT_BKPT;
- }
- /* Compute the total free space on the page */
- pc = get2byte(&data[hdr+1]);
- nFree = data[hdr+7] + top - (cellOffset + 2*pPage->nCell);
- while( pc>0 ){
- int next, size;
- if( pc>usableSize-4 ){
- /* Free block is off the page */
- return SQLITE_CORRUPT_BKPT;
+ if( !pPage->isInit ){
+ u16 pc; /* Address of a freeblock within pPage->aData[] */
+ u8 hdr; /* Offset to beginning of page header */
+ u8 *data; /* Equal to pPage->aData */
+ BtShared *pBt; /* The main btree structure */
+ u16 usableSize; /* Amount of usable space on each page */
+ u16 cellOffset; /* Offset from start of page to first cell pointer */
+ u16 nFree; /* Number of unused bytes on the page */
+ u16 top; /* First byte of the cell content area */
+ int iCellFirst; /* First allowable cell or freeblock offset */
+ int iCellLast; /* Last possible cell or freeblock offset */
+
+ pBt = pPage->pBt;
+
+ hdr = pPage->hdrOffset;
+ data = pPage->aData;
+ if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT;
+ assert( pBt->pageSize>=512 && pBt->pageSize<=32768 );
+ pPage->maskPage = pBt->pageSize - 1;
+ pPage->nOverflow = 0;
+ usableSize = pBt->usableSize;
+ pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf;
+ top = get2byte(&data[hdr+5]);
+ pPage->nCell = get2byte(&data[hdr+3]);
+ if( pPage->nCell>MX_CELL(pBt) ){
+ /* To many cells for a single page. The page must be corrupt */
+ return SQLITE_CORRUPT_BKPT;
+ }
+ testcase( pPage->nCell==MX_CELL(pBt) );
+
+ /* A malformed database page might cause us to read past the end
+ ** of page when parsing a cell.
+ **
+ ** The following block of code checks early to see if a cell extends
+ ** past the end of a page boundary and causes SQLITE_CORRUPT to be
+ ** returned if it does.
+ */
+ iCellFirst = cellOffset + 2*pPage->nCell;
+ iCellLast = usableSize - 4;
+#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
+ {
+ int i; /* Index into the cell pointer array */
+ int sz; /* Size of a cell */
+
+ if( !pPage->leaf ) iCellLast--;
+ for(i=0; i<pPage->nCell; i++){
+ pc = get2byte(&data[cellOffset+i*2]);
+ testcase( pc==iCellFirst );
+ testcase( pc==iCellLast );
+ if( pc<iCellFirst || pc>iCellLast ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ sz = cellSizePtr(pPage, &data[pc]);
+ testcase( pc+sz==usableSize );
+ if( pc+sz>usableSize ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ }
+ if( !pPage->leaf ) iCellLast++;
+ }
+#endif
+
+ /* Compute the total free space on the page */
+ pc = get2byte(&data[hdr+1]);
+ nFree = data[hdr+7] + top;
+ while( pc>0 ){
+ u16 next, size;
+ if( pc<iCellFirst || pc>iCellLast ){
+ /* Start of free block is off the page */
+ return SQLITE_CORRUPT_BKPT;
+ }
+ next = get2byte(&data[pc]);
+ size = get2byte(&data[pc+2]);
+ if( (next>0 && next<=pc+size+3) || pc+size>usableSize ){
+ /* Free blocks must be in ascending order. And the last byte of
+ ** the free-block must lie on the database page. */
+ return SQLITE_CORRUPT_BKPT;
+ }
+ nFree = nFree + size;
+ pc = next;
}
- next = get2byte(&data[pc]);
- size = get2byte(&data[pc+2]);
- if( next>0 && next<=pc+size+3 ){
- /* Free blocks must be in accending order */
+
+ /* At this point, nFree contains the sum of the offset to the start
+ ** of the cell-content area plus the number of free bytes within
+ ** the cell-content area. If this is greater than the usable-size
+ ** of the page, then the page must be corrupted. This check also
+ ** serves to verify that the offset to the start of the cell-content
+ ** area, according to the page header, lies within the page.
+ */
+ if( nFree>usableSize ){
return SQLITE_CORRUPT_BKPT;
}
- nFree += size;
- pc = next;
- }
- pPage->nFree = nFree;
- if( nFree>=usableSize ){
- /* Free space cannot exceed total page size */
- return SQLITE_CORRUPT_BKPT;
+ pPage->nFree = (u16)(nFree - iCellFirst);
+ pPage->isInit = 1;
}
-
- pPage->isInit = 1;
return SQLITE_OK;
}
@@ -30963,17 +39093,17 @@ SQLITE_PRIVATE int sqlite3BtreeInitPage(
static void zeroPage(MemPage *pPage, int flags){
unsigned char *data = pPage->aData;
BtShared *pBt = pPage->pBt;
- int hdr = pPage->hdrOffset;
- int first;
+ u8 hdr = pPage->hdrOffset;
+ u16 first;
assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
assert( sqlite3PagerGetData(pPage->pDbPage) == data );
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
assert( sqlite3_mutex_held(pBt->mutex) );
- memset(&data[hdr], 0, pBt->usableSize - hdr);
- data[hdr] = flags;
- first = hdr + 8 + 4*((flags&PTF_LEAF)==0);
+ /*memset(&data[hdr], 0, pBt->usableSize - hdr);*/
+ data[hdr] = (char)flags;
+ first = hdr + 8 + 4*((flags&PTF_LEAF)==0 ?1:0);
memset(&data[hdr+1], 0, 4);
data[hdr+7] = 0;
put2byte(&data[hdr+5], pBt->usableSize);
@@ -30982,11 +39112,27 @@ static void zeroPage(MemPage *pPage, int flags){
pPage->hdrOffset = hdr;
pPage->cellOffset = first;
pPage->nOverflow = 0;
- pPage->idxShift = 0;
+ assert( pBt->pageSize>=512 && pBt->pageSize<=32768 );
+ pPage->maskPage = pBt->pageSize - 1;
pPage->nCell = 0;
pPage->isInit = 1;
}
+
+/*
+** Convert a DbPage obtained from the pager into a MemPage used by
+** the btree layer.
+*/
+static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){
+ MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage);
+ pPage->aData = sqlite3PagerGetData(pDbPage);
+ pPage->pDbPage = pDbPage;
+ pPage->pBt = pBt;
+ pPage->pgno = pgno;
+ pPage->hdrOffset = pPage->pgno==1 ? 100 : 0;
+ return pPage;
+}
+
/*
** Get a page from the pager. Initialize the MemPage.pBt and
** MemPage.aData elements if needed.
@@ -30998,62 +39144,93 @@ static void zeroPage(MemPage *pPage, int flags){
** means we have started to be concerned about content and the disk
** read should occur at that point.
*/
-SQLITE_PRIVATE int sqlite3BtreeGetPage(
+static int btreeGetPage(
BtShared *pBt, /* The btree */
Pgno pgno, /* Number of the page to fetch */
MemPage **ppPage, /* Return the page in this parameter */
int noContent /* Do not load page content if true */
){
int rc;
- MemPage *pPage;
DbPage *pDbPage;
assert( sqlite3_mutex_held(pBt->mutex) );
rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, noContent);
if( rc ) return rc;
- pPage = (MemPage *)sqlite3PagerGetExtra(pDbPage);
- pPage->aData = sqlite3PagerGetData(pDbPage);
- pPage->pDbPage = pDbPage;
- pPage->pBt = pBt;
- pPage->pgno = pgno;
- pPage->hdrOffset = pPage->pgno==1 ? 100 : 0;
- *ppPage = pPage;
+ *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt);
return SQLITE_OK;
}
/*
-** Get a page from the pager and initialize it. This routine
-** is just a convenience wrapper around separate calls to
-** sqlite3BtreeGetPage() and sqlite3BtreeInitPage().
+** Retrieve a page from the pager cache. If the requested page is not
+** already in the pager cache return NULL. Initialize the MemPage.pBt and
+** MemPage.aData elements if needed.
+*/
+static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){
+ DbPage *pDbPage;
+ assert( sqlite3_mutex_held(pBt->mutex) );
+ pDbPage = sqlite3PagerLookup(pBt->pPager, pgno);
+ if( pDbPage ){
+ return btreePageFromDbPage(pDbPage, pgno, pBt);
+ }
+ return 0;
+}
+
+/*
+** Return the size of the database file in pages. If there is any kind of
+** error, return ((unsigned int)-1).
+*/
+static Pgno pagerPagecount(BtShared *pBt){
+ int nPage = -1;
+ int rc;
+ assert( pBt->pPage1 );
+ rc = sqlite3PagerPagecount(pBt->pPager, &nPage);
+ assert( rc==SQLITE_OK || nPage==-1 );
+ return (Pgno)nPage;
+}
+
+/*
+** Get a page from the pager and initialize it. This routine is just a
+** convenience wrapper around separate calls to btreeGetPage() and
+** btreeInitPage().
+**
+** If an error occurs, then the value *ppPage is set to is undefined. It
+** may remain unchanged, or it may be set to an invalid value.
*/
static int getAndInitPage(
BtShared *pBt, /* The database file */
Pgno pgno, /* Number of the page to get */
- MemPage **ppPage, /* Write the page pointer here */
- MemPage *pParent /* Parent of the page */
+ MemPage **ppPage /* Write the page pointer here */
){
int rc;
+ TESTONLY( Pgno iLastPg = pagerPagecount(pBt); )
assert( sqlite3_mutex_held(pBt->mutex) );
- if( pgno==0 ){
- return SQLITE_CORRUPT_BKPT;
- }
- rc = sqlite3BtreeGetPage(pBt, pgno, ppPage, 0);
- if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){
- rc = sqlite3BtreeInitPage(*ppPage, pParent);
+
+ rc = btreeGetPage(pBt, pgno, ppPage, 0);
+ if( rc==SQLITE_OK ){
+ rc = btreeInitPage(*ppPage);
if( rc!=SQLITE_OK ){
releasePage(*ppPage);
- *ppPage = 0;
}
}
+
+ /* If the requested page number was either 0 or greater than the page
+ ** number of the last page in the database, this function should return
+ ** SQLITE_CORRUPT or some other error (i.e. SQLITE_FULL). Check that this
+ ** is the case. */
+ assert( (pgno>0 && pgno<=iLastPg) || rc!=SQLITE_OK );
+ testcase( pgno==0 );
+ testcase( pgno==iLastPg );
+
return rc;
}
/*
** Release a MemPage. This should be called once for each prior
-** call to sqlite3BtreeGetPage.
+** call to btreeGetPage.
*/
static void releasePage(MemPage *pPage){
if( pPage ){
+ assert( pPage->nOverflow==0 || sqlite3PagerPageRefcount(pPage->pDbPage)>1 );
assert( pPage->aData );
assert( pPage->pBt );
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
@@ -31064,25 +39241,6 @@ static void releasePage(MemPage *pPage){
}
/*
-** This routine is called when the reference count for a page
-** reaches zero. We need to unref the pParent pointer when that
-** happens.
-*/
-static void pageDestructor(DbPage *pData, int pageSize){
- MemPage *pPage;
- assert( (pageSize & 7)==0 );
- pPage = (MemPage *)sqlite3PagerGetExtra(pData);
- assert( pPage->isInit==0 || sqlite3_mutex_held(pPage->pBt->mutex) );
- if( pPage->pParent ){
- MemPage *pParent = pPage->pParent;
- assert( pParent->pBt==pPage->pBt );
- pPage->pParent = 0;
- releasePage(pParent);
- }
- pPage->isInit = 0;
-}
-
-/*
** During a rollback, when the pager reloads information into the cache
** so that the cache is restored to its original state at the start of
** the transaction, for each page restored this routine is called.
@@ -31090,21 +39248,29 @@ static void pageDestructor(DbPage *pData, int pageSize){
** This routine needs to reset the extra data section at the end of the
** page to agree with the restored data.
*/
-static void pageReinit(DbPage *pData, int pageSize){
+static void pageReinit(DbPage *pData){
MemPage *pPage;
- assert( (pageSize & 7)==0 );
pPage = (MemPage *)sqlite3PagerGetExtra(pData);
+ assert( sqlite3PagerPageRefcount(pData)>0 );
if( pPage->isInit ){
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
pPage->isInit = 0;
- sqlite3BtreeInitPage(pPage, pPage->pParent);
+ if( sqlite3PagerPageRefcount(pData)>1 ){
+ /* pPage might not be a btree page; it might be an overflow page
+ ** or ptrmap page or a free page. In those cases, the following
+ ** call to btreeInitPage() will likely return SQLITE_CORRUPT.
+ ** But no harm is done by this. And it is very important that
+ ** btreeInitPage() be called on every btree page so we make
+ ** the call for every page that comes in for re-initing. */
+ btreeInitPage(pPage);
+ }
}
}
/*
** Invoke the busy handler for a btree.
*/
-static int sqlite3BtreeInvokeBusyHandler(void *pArg, int n){
+static int btreeInvokeBusyHandler(void *pArg){
BtShared *pBt = (BtShared*)pArg;
assert( pBt->db );
assert( sqlite3_mutex_held(pBt->db->mutex) );
@@ -31119,6 +39285,12 @@ static int sqlite3BtreeInvokeBusyHandler(void *pArg, int n){
** database file will be deleted when sqlite3BtreeClose() is called.
** If zFilename is ":memory:" then an in-memory database is created
** that is automatically destroyed when it is closed.
+**
+** If the database is already opened in the same database connection
+** and we are in shared cache mode, then the open will fail with an
+** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared
+** objects in the same database connection since doing so will lead
+** to problems with locking.
*/
SQLITE_PRIVATE int sqlite3BtreeOpen(
const char *zFilename, /* Name of the file containing the BTree database */
@@ -31127,12 +39299,13 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
int flags, /* Options */
int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */
){
- sqlite3_vfs *pVfs; /* The VFS to use for this btree */
- BtShared *pBt = 0; /* Shared part of btree structure */
- Btree *p; /* Handle to return */
- int rc = SQLITE_OK;
- int nReserve;
- unsigned char zDbHeader[100];
+ sqlite3_vfs *pVfs; /* The VFS to use for this btree */
+ BtShared *pBt = 0; /* Shared part of btree structure */
+ Btree *p; /* Handle to return */
+ sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */
+ int rc = SQLITE_OK; /* Result code from this function */
+ u8 nReserve; /* Byte of unused space on each page */
+ unsigned char zDbHeader[100]; /* Database header content */
/* Set the variable isMemdb to true for an in-memory database, or
** false for a file-based database. This symbol is only required if
@@ -31157,36 +39330,46 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
}
p->inTrans = TRANS_NONE;
p->db = db;
+#ifndef SQLITE_OMIT_SHARED_CACHE
+ p->lock.pBtree = p;
+ p->lock.iTable = 1;
+#endif
#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
/*
** If this Btree is a candidate for shared cache, try to find an
** existing BtShared object that we can share with
*/
- if( (flags & BTREE_PRIVATE)==0
- && isMemdb==0
- && (db->flags & SQLITE_Vtab)==0
- && zFilename && zFilename[0]
- ){
- if( sqlite3SharedCacheEnabled ){
+ if( isMemdb==0 && zFilename && zFilename[0] ){
+ if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
int nFullPathname = pVfs->mxPathname+1;
- char *zFullPathname = (char *)sqlite3_malloc(nFullPathname);
+ char *zFullPathname = sqlite3Malloc(nFullPathname);
sqlite3_mutex *mutexShared;
p->sharable = 1;
- if( db ){
- db->flags |= SQLITE_SharedCache;
- }
if( !zFullPathname ){
sqlite3_free(p);
return SQLITE_NOMEM;
}
sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
- mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+ mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
+ sqlite3_mutex_enter(mutexOpen);
+ mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
sqlite3_mutex_enter(mutexShared);
- for(pBt=sqlite3SharedCacheList; pBt; pBt=pBt->pNext){
+ for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
assert( pBt->nRef>0 );
if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager))
&& sqlite3PagerVfs(pBt->pPager)==pVfs ){
+ int iDb;
+ for(iDb=db->nDb-1; iDb>=0; iDb--){
+ Btree *pExisting = db->aDb[iDb].pBt;
+ if( pExisting && pExisting->pBt==pBt ){
+ sqlite3_mutex_leave(mutexShared);
+ sqlite3_mutex_leave(mutexOpen);
+ sqlite3_free(zFullPathname);
+ sqlite3_free(p);
+ return SQLITE_CONSTRAINT;
+ }
+ }
p->pBt = pBt;
pBt->nRef++;
break;
@@ -31224,21 +39407,18 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
rc = SQLITE_NOMEM;
goto btree_open_out;
}
- pBt->busyHdr.xFunc = sqlite3BtreeInvokeBusyHandler;
- pBt->busyHdr.pArg = pBt;
rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename,
- EXTRA_SIZE, flags, vfsFlags);
+ EXTRA_SIZE, flags, vfsFlags, pageReinit);
if( rc==SQLITE_OK ){
rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);
}
if( rc!=SQLITE_OK ){
goto btree_open_out;
}
- sqlite3PagerSetBusyhandler(pBt->pPager, &pBt->busyHdr);
+ pBt->db = db;
+ sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
p->pBt = pBt;
- sqlite3PagerSetDestructor(pBt->pPager, pageDestructor);
- sqlite3PagerSetReiniter(pBt->pPager, pageReinit);
pBt->pCursor = 0;
pBt->pPage1 = 0;
pBt->readOnly = sqlite3PagerIsreadonly(pBt->pPager);
@@ -31246,10 +39426,6 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
|| ((pBt->pageSize-1)&pBt->pageSize)!=0 ){
pBt->pageSize = 0;
- sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize);
- pBt->maxEmbedFrac = 64; /* 25% */
- pBt->minEmbedFrac = 32; /* 12.5% */
- pBt->minLeafFrac = 32; /* 12.5% */
#ifndef SQLITE_OMIT_AUTOVACUUM
/* If the magic name ":memory:" will create an in-memory database, then
** leave the autoVacuum mode at 0 (do not auto-vacuum), even if
@@ -31265,18 +39441,16 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
nReserve = 0;
}else{
nReserve = zDbHeader[20];
- pBt->maxEmbedFrac = zDbHeader[21];
- pBt->minEmbedFrac = zDbHeader[22];
- pBt->minLeafFrac = zDbHeader[23];
pBt->pageSizeFixed = 1;
#ifndef SQLITE_OMIT_AUTOVACUUM
pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0);
pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0);
#endif
}
+ rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
+ if( rc ) goto btree_open_out;
pBt->usableSize = pBt->pageSize - nReserve;
assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */
- sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize);
#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
/* Add the new BtShared object to the linked list sharable BtShareds.
@@ -31284,9 +39458,9 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
if( p->sharable ){
sqlite3_mutex *mutexShared;
pBt->nRef = 1;
- mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
- if( SQLITE_THREADSAFE ){
- pBt->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
+ mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+ if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
+ pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
if( pBt->mutex==0 ){
rc = SQLITE_NOMEM;
db->mallocFailed = 0;
@@ -31294,8 +39468,8 @@ SQLITE_PRIVATE int sqlite3BtreeOpen(
}
}
sqlite3_mutex_enter(mutexShared);
- pBt->pNext = sqlite3SharedCacheList;
- sqlite3SharedCacheList = pBt;
+ pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList);
+ GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt;
sqlite3_mutex_leave(mutexShared);
}
#endif
@@ -31343,6 +39517,10 @@ btree_open_out:
sqlite3_free(p);
*ppBtree = 0;
}
+ if( mutexOpen ){
+ assert( sqlite3_mutex_held(mutexOpen) );
+ sqlite3_mutex_leave(mutexOpen);
+ }
return rc;
}
@@ -31359,18 +39537,18 @@ static int removeFromSharingList(BtShared *pBt){
int removed = 0;
assert( sqlite3_mutex_notheld(pBt->mutex) );
- pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+ pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
sqlite3_mutex_enter(pMaster);
pBt->nRef--;
if( pBt->nRef<=0 ){
- if( sqlite3SharedCacheList==pBt ){
- sqlite3SharedCacheList = pBt->pNext;
+ if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
+ GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
}else{
- pList = sqlite3SharedCacheList;
- while( pList && pList->pNext!=pBt ){
+ pList = GLOBAL(BtShared*,sqlite3SharedCacheList);
+ while( ALWAYS(pList) && pList->pNext!=pBt ){
pList=pList->pNext;
}
- if( pList ){
+ if( ALWAYS(pList) ){
pList->pNext = pBt->pNext;
}
}
@@ -31387,6 +39565,24 @@ static int removeFromSharingList(BtShared *pBt){
}
/*
+** Make sure pBt->pTmpSpace points to an allocation of
+** MX_CELL_SIZE(pBt) bytes.
+*/
+static void allocateTempSpace(BtShared *pBt){
+ if( !pBt->pTmpSpace ){
+ pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize );
+ }
+}
+
+/*
+** Free the pBt->pTmpSpace allocation
+*/
+static void freeTempSpace(BtShared *pBt){
+ sqlite3PageFree( pBt->pTmpSpace);
+ pBt->pTmpSpace = 0;
+}
+
+/*
** Close an open database and invalidate all cursors.
*/
SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){
@@ -31396,7 +39592,6 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){
/* Close all cursors opened via this handle. */
assert( sqlite3_mutex_held(p->db->mutex) );
sqlite3BtreeEnter(p);
- pBt->db = p->db;
pCur = pBt->pCursor;
while( pCur ){
BtCursor *pTmp = pCur;
@@ -31430,7 +39625,7 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){
pBt->xFreeSchema(pBt->pSchema);
}
sqlite3_free(pBt->pSchema);
- sqlite3_free(pBt->pTmpSpace);
+ freeTempSpace(pBt);
sqlite3_free(pBt);
}
@@ -31506,6 +39701,8 @@ SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree *p){
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM)
/*
** Change the default pages size and the number of reserved bytes per page.
+** Or, if the page size has already been fixed, return SQLITE_READONLY
+** without changing anything.
**
** The page size must be a power of 2 between 512 and 65536. If the page
** size supplied does not meet this constraint then the page size is not
@@ -31518,10 +39715,14 @@ SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree *p){
**
** If parameter nReserve is less than zero, then the number of reserved
** bytes per page is left unchanged.
+**
+** If the iFix!=0 then the pageSizeFixed flag is set so that the page size
+** and autovacuum mode can no longer be changed.
*/
-SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){
+SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){
int rc = SQLITE_OK;
BtShared *pBt = p->pBt;
+ assert( nReserve>=-1 && nReserve<=255 );
sqlite3BtreeEnter(p);
if( pBt->pageSizeFixed ){
sqlite3BtreeLeave(p);
@@ -31530,16 +39731,17 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve)
if( nReserve<0 ){
nReserve = pBt->pageSize - pBt->usableSize;
}
+ assert( nReserve>=0 && nReserve<=255 );
if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE &&
((pageSize-1)&pageSize)==0 ){
assert( (pageSize & 7)==0 );
assert( !pBt->pPage1 && !pBt->pCursor );
- pBt->pageSize = pageSize;
- sqlite3_free(pBt->pTmpSpace);
- pBt->pTmpSpace = 0;
- rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize);
+ pBt->pageSize = (u16)pageSize;
+ freeTempSpace(pBt);
}
- pBt->usableSize = pBt->pageSize - nReserve;
+ rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
+ pBt->usableSize = pBt->pageSize - (u16)nReserve;
+ if( iFix ) pBt->pageSizeFixed = 1;
sqlite3BtreeLeave(p);
return rc;
}
@@ -31550,6 +39752,12 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve)
SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){
return p->pBt->pageSize;
}
+
+/*
+** Return the number of bytes of space at the end of every page that
+** are intentually left unused. This is the "reserved" space that is
+** sometimes used by extensions.
+*/
SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree *p){
int n;
sqlite3BtreeEnter(p);
@@ -31584,13 +39792,14 @@ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){
#else
BtShared *pBt = p->pBt;
int rc = SQLITE_OK;
- int av = (autoVacuum?1:0);
+ u8 av = (u8)autoVacuum;
sqlite3BtreeEnter(p);
- if( pBt->pageSizeFixed && av!=pBt->autoVacuum ){
+ if( pBt->pageSizeFixed && (av ?1:0)!=pBt->autoVacuum ){
rc = SQLITE_READONLY;
}else{
- pBt->autoVacuum = av;
+ pBt->autoVacuum = av ?1:0;
+ pBt->incrVacuum = av==2 ?1:0;
}
sqlite3BtreeLeave(p);
return rc;
@@ -31633,22 +39842,23 @@ static int lockBtree(BtShared *pBt){
int nPage;
assert( sqlite3_mutex_held(pBt->mutex) );
- if( pBt->pPage1 ) return SQLITE_OK;
- rc = sqlite3BtreeGetPage(pBt, 1, &pPage1, 0);
+ assert( pBt->pPage1==0 );
+ rc = sqlite3PagerSharedLock(pBt->pPager);
+ if( rc!=SQLITE_OK ) return rc;
+ rc = btreeGetPage(pBt, 1, &pPage1, 0);
if( rc!=SQLITE_OK ) return rc;
/* Do some checking to help insure the file we opened really is
** a valid database file.
*/
- rc = SQLITE_NOTADB;
- nPage = sqlite3PagerPagecount(pBt->pPager);
- if( nPage<0 ){
- rc = SQLITE_IOERR;
+ rc = sqlite3PagerPagecount(pBt->pPager, &nPage);
+ if( rc!=SQLITE_OK ){
goto page1_init_failed;
}else if( nPage>0 ){
int pageSize;
int usableSize;
u8 *page1 = pPage1->aData;
+ rc = SQLITE_NOTADB;
if( memcmp(page1, zMagicHeader, 16)!=0 ){
goto page1_init_failed;
}
@@ -31658,6 +39868,15 @@ static int lockBtree(BtShared *pBt){
if( page1[19]>1 ){
goto page1_init_failed;
}
+
+ /* The maximum embedded fraction must be exactly 25%. And the minimum
+ ** embedded fraction must be 12.5% for both leaf-data and non-leaf-data.
+ ** The original design allowed these amounts to vary, but as of
+ ** version 3.6.0, we require them to be fixed.
+ */
+ if( memcmp(&page1[21], "\100\040\040",3)!=0 ){
+ goto page1_init_failed;
+ }
pageSize = get2byte(&page1[16]);
if( ((pageSize-1)&pageSize)!=0 || pageSize<512 ||
(SQLITE_MAX_PAGE_SIZE<32768 && pageSize>SQLITE_MAX_PAGE_SIZE)
@@ -31674,21 +39893,18 @@ static int lockBtree(BtShared *pBt){
** again with the correct page-size.
*/
releasePage(pPage1);
- pBt->usableSize = usableSize;
- pBt->pageSize = pageSize;
- sqlite3_free(pBt->pTmpSpace);
- pBt->pTmpSpace = 0;
- sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize);
- return SQLITE_OK;
+ pBt->usableSize = (u16)usableSize;
+ pBt->pageSize = (u16)pageSize;
+ freeTempSpace(pBt);
+ rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize,
+ pageSize-usableSize);
+ return rc;
}
- if( usableSize<500 ){
+ if( usableSize<480 ){
goto page1_init_failed;
}
- pBt->pageSize = pageSize;
- pBt->usableSize = usableSize;
- pBt->maxEmbedFrac = page1[21];
- pBt->minEmbedFrac = page1[22];
- pBt->minLeafFrac = page1[23];
+ pBt->pageSize = (u16)pageSize;
+ pBt->usableSize = (u16)usableSize;
#ifndef SQLITE_OMIT_AUTOVACUUM
pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0);
pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0);
@@ -31708,13 +39924,10 @@ static int lockBtree(BtShared *pBt){
** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow
** page pointer.
*/
- pBt->maxLocal = (pBt->usableSize-12)*pBt->maxEmbedFrac/255 - 23;
- pBt->minLocal = (pBt->usableSize-12)*pBt->minEmbedFrac/255 - 23;
+ pBt->maxLocal = (pBt->usableSize-12)*64/255 - 23;
+ pBt->minLocal = (pBt->usableSize-12)*32/255 - 23;
pBt->maxLeaf = pBt->usableSize - 35;
- pBt->minLeaf = (pBt->usableSize-12)*pBt->minLeafFrac/255 - 23;
- if( pBt->minLocal>pBt->maxLocal || pBt->maxLocal<0 ){
- goto page1_init_failed;
- }
+ pBt->minLeaf = (pBt->usableSize-12)*32/255 - 23;
assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) );
pBt->pPage1 = pPage1;
return SQLITE_OK;
@@ -31726,69 +39939,44 @@ page1_init_failed:
}
/*
-** This routine works like lockBtree() except that it also invokes the
-** busy callback if there is lock contention.
-*/
-static int lockBtreeWithRetry(Btree *pRef){
- int rc = SQLITE_OK;
-
- assert( sqlite3BtreeHoldsMutex(pRef) );
- if( pRef->inTrans==TRANS_NONE ){
- u8 inTransaction = pRef->pBt->inTransaction;
- btreeIntegrity(pRef);
- rc = sqlite3BtreeBeginTrans(pRef, 0);
- pRef->pBt->inTransaction = inTransaction;
- pRef->inTrans = TRANS_NONE;
- if( rc==SQLITE_OK ){
- pRef->pBt->nTransaction--;
- }
- btreeIntegrity(pRef);
- }
- return rc;
-}
-
-
-/*
** If there are no outstanding cursors and we are not in the middle
** of a transaction but there is a read lock on the database, then
** this routine unrefs the first page of the database file which
** has the effect of releasing the read lock.
**
-** If there are any outstanding cursors, this routine is a no-op.
-**
** If there is a transaction in progress, this routine is a no-op.
*/
static void unlockBtreeIfUnused(BtShared *pBt){
assert( sqlite3_mutex_held(pBt->mutex) );
- if( pBt->inTransaction==TRANS_NONE && pBt->pCursor==0 && pBt->pPage1!=0 ){
- if( sqlite3PagerRefcount(pBt->pPager)>=1 ){
- assert( pBt->pPage1->aData );
-#if 0
- if( pBt->pPage1->aData==0 ){
- MemPage *pPage = pBt->pPage1;
- pPage->aData = sqlite3PagerGetData(pPage->pDbPage);
- pPage->pBt = pBt;
- pPage->pgno = 1;
- }
-#endif
- releasePage(pBt->pPage1);
- }
+ assert( pBt->pCursor==0 || pBt->inTransaction>TRANS_NONE );
+ if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){
+ assert( pBt->pPage1->aData );
+ assert( sqlite3PagerRefcount(pBt->pPager)==1 );
+ assert( pBt->pPage1->aData );
+ releasePage(pBt->pPage1);
pBt->pPage1 = 0;
- pBt->inStmt = 0;
}
}
/*
-** Create a new database by initializing the first page of the
-** file.
+** If pBt points to an empty file then convert that empty file
+** into a new empty database by initializing the first page of
+** the database.
*/
static int newDatabase(BtShared *pBt){
MemPage *pP1;
unsigned char *data;
int rc;
+ int nPage;
assert( sqlite3_mutex_held(pBt->mutex) );
- if( sqlite3PagerPagecount(pBt->pPager)>0 ) return SQLITE_OK;
+ /* The database size has already been measured and cached, so failure
+ ** is impossible here. If the original size measurement failed, then
+ ** processing aborts before entering this routine. */
+ rc = sqlite3PagerPagecount(pBt->pPager, &nPage);
+ if( NEVER(rc!=SQLITE_OK) || nPage>0 ){
+ return rc;
+ }
pP1 = pBt->pPage1;
assert( pP1!=0 );
data = pP1->aData;
@@ -31799,10 +39987,11 @@ static int newDatabase(BtShared *pBt){
put2byte(&data[16], pBt->pageSize);
data[18] = 1;
data[19] = 1;
- data[20] = pBt->pageSize - pBt->usableSize;
- data[21] = pBt->maxEmbedFrac;
- data[22] = pBt->minEmbedFrac;
- data[23] = pBt->minLeafFrac;
+ assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize);
+ data[20] = (u8)(pBt->pageSize - pBt->usableSize);
+ data[21] = 64;
+ data[22] = 32;
+ data[23] = 32;
memset(&data[24], 0, 100-24);
zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA );
pBt->pageSizeFixed = 1;
@@ -31851,11 +40040,11 @@ static int newDatabase(BtShared *pBt){
** proceed.
*/
SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
+ sqlite3 *pBlock = 0;
BtShared *pBt = p->pBt;
int rc = SQLITE_OK;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
btreeIntegrity(p);
/* If the btree is already in a write-transaction, or it
@@ -31872,71 +40061,97 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
goto trans_begun;
}
+#ifndef SQLITE_OMIT_SHARED_CACHE
/* If another database handle has already opened a write transaction
** on this shared-btree structure and a second write transaction is
- ** requested, return SQLITE_BUSY.
+ ** requested, return SQLITE_LOCKED.
*/
- if( pBt->inTransaction==TRANS_WRITE && wrflag ){
- rc = SQLITE_BUSY;
- goto trans_begun;
- }
-
-#ifndef SQLITE_OMIT_SHARED_CACHE
- if( wrflag>1 ){
+ if( (wrflag && pBt->inTransaction==TRANS_WRITE) || pBt->isPending ){
+ pBlock = pBt->pWriter->db;
+ }else if( wrflag>1 ){
BtLock *pIter;
for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
if( pIter->pBtree!=p ){
- rc = SQLITE_BUSY;
- goto trans_begun;
+ pBlock = pIter->pBtree->db;
+ break;
}
}
}
+ if( pBlock ){
+ sqlite3ConnectionBlocked(p->db, pBlock);
+ rc = SQLITE_LOCKED_SHAREDCACHE;
+ goto trans_begun;
+ }
#endif
+ /* Any read-only or read-write transaction implies a read-lock on
+ ** page 1. So if some other shared-cache client already has a write-lock
+ ** on page 1, the transaction cannot be opened. */
+ rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
+ if( SQLITE_OK!=rc ) goto trans_begun;
+
do {
- if( pBt->pPage1==0 ){
- do{
- rc = lockBtree(pBt);
- }while( pBt->pPage1==0 && rc==SQLITE_OK );
- }
+ /* Call lockBtree() until either pBt->pPage1 is populated or
+ ** lockBtree() returns something other than SQLITE_OK. lockBtree()
+ ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after
+ ** reading page 1 it discovers that the page-size of the database
+ ** file is not pBt->pageSize. In this case lockBtree() will update
+ ** pBt->pageSize to the page-size of the file on disk.
+ */
+ while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) );
if( rc==SQLITE_OK && wrflag ){
if( pBt->readOnly ){
rc = SQLITE_READONLY;
}else{
- rc = sqlite3PagerBegin(pBt->pPage1->pDbPage, wrflag>1);
+ rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db));
if( rc==SQLITE_OK ){
rc = newDatabase(pBt);
}
}
}
- if( rc==SQLITE_OK ){
- if( wrflag ) pBt->inStmt = 0;
- }else{
+ if( rc!=SQLITE_OK ){
unlockBtreeIfUnused(pBt);
}
}while( rc==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
- sqlite3BtreeInvokeBusyHandler(pBt, 0) );
+ btreeInvokeBusyHandler(pBt) );
if( rc==SQLITE_OK ){
if( p->inTrans==TRANS_NONE ){
pBt->nTransaction++;
+#ifndef SQLITE_OMIT_SHARED_CACHE
+ if( p->sharable ){
+ assert( p->lock.pBtree==p && p->lock.iTable==1 );
+ p->lock.eLock = READ_LOCK;
+ p->lock.pNext = pBt->pLock;
+ pBt->pLock = &p->lock;
+ }
+#endif
}
p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ);
if( p->inTrans>pBt->inTransaction ){
pBt->inTransaction = p->inTrans;
}
#ifndef SQLITE_OMIT_SHARED_CACHE
- if( wrflag>1 ){
- assert( !pBt->pExclusive );
- pBt->pExclusive = p;
+ if( wrflag ){
+ assert( !pBt->pWriter );
+ pBt->pWriter = p;
+ pBt->isExclusive = (u8)(wrflag>1);
}
#endif
}
trans_begun:
+ if( rc==SQLITE_OK && wrflag ){
+ /* This call makes sure that the pager has the correct number of
+ ** open savepoints. If the second parameter is greater than 0 and
+ ** the sub-journal is not already open, then it will be opened here.
+ */
+ rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
+ }
+
btreeIntegrity(p);
sqlite3BtreeLeave(p);
return rc;
@@ -31954,11 +40169,11 @@ static int setChildPtrmaps(MemPage *pPage){
int nCell; /* Number of cells in page pPage */
int rc; /* Return code */
BtShared *pBt = pPage->pBt;
- int isInitOrig = pPage->isInit;
+ u8 isInitOrig = pPage->isInit;
Pgno pgno = pPage->pgno;
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- rc = sqlite3BtreeInitPage(pPage, pPage->pParent);
+ rc = btreeInitPage(pPage);
if( rc!=SQLITE_OK ){
goto set_child_ptrmaps_out;
}
@@ -31967,21 +40182,17 @@ static int setChildPtrmaps(MemPage *pPage){
for(i=0; i<nCell; i++){
u8 *pCell = findCell(pPage, i);
- rc = ptrmapPutOvflPtr(pPage, pCell);
- if( rc!=SQLITE_OK ){
- goto set_child_ptrmaps_out;
- }
+ ptrmapPutOvflPtr(pPage, pCell, &rc);
if( !pPage->leaf ){
Pgno childPgno = get4byte(pCell);
- rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno);
- if( rc!=SQLITE_OK ) goto set_child_ptrmaps_out;
+ ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
}
}
if( !pPage->leaf ){
Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
- rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno);
+ ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
}
set_child_ptrmaps_out:
@@ -31990,10 +40201,9 @@ set_child_ptrmaps_out:
}
/*
-** Somewhere on pPage, which is guarenteed to be a btree page, not an overflow
-** page, is a pointer to page iFrom. Modify this pointer so that it points to
-** iTo. Parameter eType describes the type of pointer to be modified, as
-** follows:
+** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so
+** that it points to iTo. Parameter eType describes the type of pointer to
+** be modified, as follows:
**
** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child
** page of pPage.
@@ -32006,6 +40216,7 @@ set_child_ptrmaps_out:
*/
static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+ assert( sqlite3PagerIswriteable(pPage->pDbPage) );
if( eType==PTRMAP_OVERFLOW2 ){
/* The pointer is always the first 4 bytes of the page in this case. */
if( get4byte(pPage->aData)!=iFrom ){
@@ -32013,18 +40224,18 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
}
put4byte(pPage->aData, iTo);
}else{
- int isInitOrig = pPage->isInit;
+ u8 isInitOrig = pPage->isInit;
int i;
int nCell;
- sqlite3BtreeInitPage(pPage, 0);
+ btreeInitPage(pPage);
nCell = pPage->nCell;
for(i=0; i<nCell; i++){
u8 *pCell = findCell(pPage, i);
if( eType==PTRMAP_OVERFLOW1 ){
CellInfo info;
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
+ btreeParseCellPtr(pPage, pCell, &info);
if( info.iOverflow ){
if( iFrom==get4byte(&pCell[info.iOverflow]) ){
put4byte(&pCell[info.iOverflow], iTo);
@@ -32056,13 +40267,19 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
/*
** Move the open database page pDbPage to location iFreePage in the
** database. The pDbPage reference remains valid.
+**
+** The isCommit flag indicates that there is no need to remember that
+** the journal needs to be sync()ed before database page pDbPage->pgno
+** can be written to. The caller has already promised not to write to that
+** page.
*/
static int relocatePage(
BtShared *pBt, /* Btree */
MemPage *pDbPage, /* Open page to move */
u8 eType, /* Pointer map 'type' entry for pDbPage */
Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */
- Pgno iFreePage /* The location to move pDbPage to */
+ Pgno iFreePage, /* The location to move pDbPage to */
+ int isCommit /* isCommit flag passed to sqlite3PagerMovepage */
){
MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */
Pgno iDbPage = pDbPage->pgno;
@@ -32077,7 +40294,7 @@ static int relocatePage(
/* Move page iDbPage from its current location to page number iFreePage */
TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
iDbPage, iFreePage, iPtrPage, eType));
- rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage);
+ rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -32099,7 +40316,7 @@ static int relocatePage(
}else{
Pgno nextOvfl = get4byte(pDbPage->aData);
if( nextOvfl!=0 ){
- rc = ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage);
+ ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -32111,7 +40328,7 @@ static int relocatePage(
** iPtrPage.
*/
if( eType!=PTRMAP_ROOTPAGE ){
- rc = sqlite3BtreeGetPage(pBt, iPtrPage, &pPtrPage, 0);
+ rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -32123,7 +40340,7 @@ static int relocatePage(
rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType);
releasePage(pPtrPage);
if( rc==SQLITE_OK ){
- rc = ptrmapPut(pBt, iFreePage, eType, iPtrPage);
+ ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc);
}
}
return rc;
@@ -32141,21 +40358,20 @@ static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8);
** database so that the last page of the file currently in use
** is no longer in use.
**
-** If the nFin parameter is non-zero, the implementation assumes
+** If the nFin parameter is non-zero, this function assumes
** that the caller will keep calling incrVacuumStep() until
** it returns SQLITE_DONE or an error, and that nFin is the
** number of pages the database file will contain after this
-** process is complete.
+** process is complete. If nFin is zero, it is assumed that
+** incrVacuumStep() will be called a finite amount of times
+** which may or may not empty the freelist. A full autovacuum
+** has nFin>0. A "PRAGMA incremental_vacuum" has nFin==0.
*/
-static int incrVacuumStep(BtShared *pBt, Pgno nFin){
- Pgno iLastPg; /* Last page in the database */
+static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg){
Pgno nFreeList; /* Number of pages still on the free-list */
assert( sqlite3_mutex_held(pBt->mutex) );
- iLastPg = pBt->nTrunc;
- if( iLastPg==0 ){
- iLastPg = sqlite3PagerPagecount(pBt->pPager);
- }
+ assert( iLastPg>nFin );
if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){
int rc;
@@ -32163,7 +40379,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin){
Pgno iPtrPage;
nFreeList = get4byte(&pBt->pPage1->aData[36]);
- if( nFreeList==0 || nFin==iLastPg ){
+ if( nFreeList==0 ){
return SQLITE_DONE;
}
@@ -32195,7 +40411,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin){
Pgno iFreePg; /* Index of free page to move pLastPg to */
MemPage *pLastPg;
- rc = sqlite3BtreeGetPage(pBt, iLastPg, &pLastPg, 0);
+ rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -32220,7 +40436,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin){
rc = sqlite3PagerWrite(pLastPg->pDbPage);
if( rc==SQLITE_OK ){
- rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg);
+ rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg, nFin!=0);
}
releasePage(pLastPg);
if( rc!=SQLITE_OK ){
@@ -32229,9 +40445,24 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin){
}
}
- pBt->nTrunc = iLastPg - 1;
- while( pBt->nTrunc==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, pBt->nTrunc) ){
- pBt->nTrunc--;
+ if( nFin==0 ){
+ iLastPg--;
+ while( iLastPg==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, iLastPg) ){
+ if( PTRMAP_ISPAGE(pBt, iLastPg) ){
+ MemPage *pPg;
+ int rc = btreeGetPage(pBt, iLastPg, &pPg, 0);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ rc = sqlite3PagerWrite(pPg->pDbPage);
+ releasePage(pPg);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ }
+ iLastPg--;
+ }
+ sqlite3PagerTruncateImage(pBt->pPager, iLastPg);
}
return SQLITE_OK;
}
@@ -32241,7 +40472,7 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin){
** It performs a single unit of work towards an incremental vacuum.
**
** If the incremental vacuum is finished after this function has run,
-** SQLITE_DONE is returned. If it is not finished, but no error occured,
+** SQLITE_DONE is returned. If it is not finished, but no error occurred,
** SQLITE_OK is returned. Otherwise an SQLite error code.
*/
SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){
@@ -32249,13 +40480,12 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE );
if( !pBt->autoVacuum ){
rc = SQLITE_DONE;
}else{
invalidateAllOverflowCache(pBt);
- rc = incrVacuumStep(pBt, 0);
+ rc = incrVacuumStep(pBt, 0, pagerPagecount(pBt));
}
sqlite3BtreeLeave(p);
return rc;
@@ -32270,68 +40500,64 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){
** i.e. the database has been reorganized so that only the first *pnTrunc
** pages are in use.
*/
-static int autoVacuumCommit(BtShared *pBt, Pgno *pnTrunc){
+static int autoVacuumCommit(BtShared *pBt){
int rc = SQLITE_OK;
Pager *pPager = pBt->pPager;
-#ifndef NDEBUG
- int nRef = sqlite3PagerRefcount(pPager);
-#endif
+ VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager) );
assert( sqlite3_mutex_held(pBt->mutex) );
invalidateAllOverflowCache(pBt);
assert(pBt->autoVacuum);
if( !pBt->incrVacuum ){
- Pgno nFin = 0;
-
- if( pBt->nTrunc==0 ){
- Pgno nFree;
- Pgno nPtrmap;
- const int pgsz = pBt->pageSize;
- Pgno nOrig = sqlite3PagerPagecount(pBt->pPager);
+ Pgno nFin; /* Number of pages in database after autovacuuming */
+ Pgno nFree; /* Number of pages on the freelist initially */
+ Pgno nPtrmap; /* Number of PtrMap pages to be freed */
+ Pgno iFree; /* The next page to be freed */
+ int nEntry; /* Number of entries on one ptrmap page */
+ Pgno nOrig; /* Database size before freeing */
+
+ nOrig = pagerPagecount(pBt);
+ if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){
+ /* It is not possible to create a database for which the final page
+ ** is either a pointer-map page or the pending-byte page. If one
+ ** is encountered, this indicates corruption.
+ */
+ return SQLITE_CORRUPT_BKPT;
+ }
- if( PTRMAP_ISPAGE(pBt, nOrig) ){
- return SQLITE_CORRUPT_BKPT;
- }
- if( nOrig==PENDING_BYTE_PAGE(pBt) ){
- nOrig--;
- }
- nFree = get4byte(&pBt->pPage1->aData[36]);
- nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+pgsz/5)/(pgsz/5);
- nFin = nOrig - nFree - nPtrmap;
- if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){
- nFin--;
- }
- while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){
- nFin--;
- }
+ nFree = get4byte(&pBt->pPage1->aData[36]);
+ nEntry = pBt->usableSize/5;
+ nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry;
+ nFin = nOrig - nFree - nPtrmap;
+ if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<PENDING_BYTE_PAGE(pBt) ){
+ nFin--;
}
+ while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){
+ nFin--;
+ }
+ if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT;
- while( rc==SQLITE_OK ){
- rc = incrVacuumStep(pBt, nFin);
+ for(iFree=nOrig; iFree>nFin && rc==SQLITE_OK; iFree--){
+ rc = incrVacuumStep(pBt, nFin, iFree);
}
- if( rc==SQLITE_DONE ){
- assert(nFin==0 || pBt->nTrunc==0 || nFin<=pBt->nTrunc);
+ if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){
rc = SQLITE_OK;
- if( pBt->nTrunc && nFin ){
- rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
- put4byte(&pBt->pPage1->aData[32], 0);
- put4byte(&pBt->pPage1->aData[36], 0);
- pBt->nTrunc = nFin;
- }
+ rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
+ put4byte(&pBt->pPage1->aData[32], 0);
+ put4byte(&pBt->pPage1->aData[36], 0);
+ sqlite3PagerTruncateImage(pBt->pPager, nFin);
}
if( rc!=SQLITE_OK ){
sqlite3PagerRollback(pPager);
}
}
- if( rc==SQLITE_OK ){
- *pnTrunc = pBt->nTrunc;
- pBt->nTrunc = 0;
- }
assert( nRef==sqlite3PagerRefcount(pPager) );
return rc;
}
+#else /* ifndef SQLITE_OMIT_AUTOVACUUM */
+# define setChildPtrmaps(x) SQLITE_OK
#endif
/*
@@ -32344,7 +40570,7 @@ static int autoVacuumCommit(BtShared *pBt, Pgno *pnTrunc){
** database are written into the database file and flushed to oxide.
** At the end of this call, the rollback journal still exists on the
** disk and we are still holding all locks, so the transaction has not
-** committed. See sqlite3BtreeCommit() for the second phase of the
+** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the
** commit process.
**
** This call is a no-op if no write-transaction is currently active on pBt.
@@ -32364,34 +40590,75 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){
int rc = SQLITE_OK;
if( p->inTrans==TRANS_WRITE ){
BtShared *pBt = p->pBt;
- Pgno nTrunc = 0;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pBt->autoVacuum ){
- rc = autoVacuumCommit(pBt, &nTrunc);
+ rc = autoVacuumCommit(pBt);
if( rc!=SQLITE_OK ){
sqlite3BtreeLeave(p);
return rc;
}
}
#endif
- rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, nTrunc, 0);
+ rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0);
sqlite3BtreeLeave(p);
}
return rc;
}
/*
+** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback()
+** at the conclusion of a transaction.
+*/
+static void btreeEndTransaction(Btree *p){
+ BtShared *pBt = p->pBt;
+ BtCursor *pCsr;
+ assert( sqlite3BtreeHoldsMutex(p) );
+
+ /* Search for a cursor held open by this b-tree connection. If one exists,
+ ** then the transaction will be downgraded to a read-only transaction
+ ** instead of actually concluded. A subsequent call to CommitPhaseTwo()
+ ** or Rollback() will finish the transaction and unlock the database. */
+ for(pCsr=pBt->pCursor; pCsr && pCsr->pBtree!=p; pCsr=pCsr->pNext);
+ assert( pCsr==0 || p->inTrans>TRANS_NONE );
+
+ btreeClearHasContent(pBt);
+ if( pCsr ){
+ downgradeAllSharedCacheTableLocks(p);
+ p->inTrans = TRANS_READ;
+ }else{
+ /* If the handle had any kind of transaction open, decrement the
+ ** transaction count of the shared btree. If the transaction count
+ ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused()
+ ** call below will unlock the pager. */
+ if( p->inTrans!=TRANS_NONE ){
+ clearAllSharedCacheTableLocks(p);
+ pBt->nTransaction--;
+ if( 0==pBt->nTransaction ){
+ pBt->inTransaction = TRANS_NONE;
+ }
+ }
+
+ /* Set the current transaction state to TRANS_NONE and unlock the
+ ** pager if this call closed the only read or write transaction. */
+ p->inTrans = TRANS_NONE;
+ unlockBtreeIfUnused(pBt);
+ }
+
+ btreeIntegrity(p);
+}
+
+/*
** Commit the transaction currently in progress.
**
** This routine implements the second phase of a 2-phase commit. The
-** sqlite3BtreeSync() routine does the first phase and should be invoked
-** prior to calling this routine. The sqlite3BtreeSync() routine did
-** all the work of writing information out to disk and flushing the
+** sqlite3BtreeCommitPhaseOne() routine does the first phase and should
+** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne()
+** routine did all the work of writing information out to disk and flushing the
** contents so that they are written onto the disk platter. All this
-** routine has to do is delete or truncate the rollback journal
-** (which causes the transaction to commit) and drop locks.
+** routine has to do is delete or truncate or zero the header in the
+** the rollback journal (which causes the transaction to commit) and
+** drop locks.
**
** This will release the write lock on the database file. If there
** are no active cursors, it also releases the read lock.
@@ -32400,7 +40667,6 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p){
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
btreeIntegrity(p);
/* If the handle has a write-transaction open, commit the shared-btrees
@@ -32416,29 +40682,9 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p){
return rc;
}
pBt->inTransaction = TRANS_READ;
- pBt->inStmt = 0;
}
- unlockAllTables(p);
- /* If the handle has any kind of transaction open, decrement the transaction
- ** count of the shared btree. If the transaction count reaches 0, set
- ** the shared state to TRANS_NONE. The unlockBtreeIfUnused() call below
- ** will unlock the pager.
- */
- if( p->inTrans!=TRANS_NONE ){
- pBt->nTransaction--;
- if( 0==pBt->nTransaction ){
- pBt->inTransaction = TRANS_NONE;
- }
- }
-
- /* Set the handles current transaction state to TRANS_NONE and unlock
- ** the pager if this call closed the only read or write transaction.
- */
- p->inTrans = TRANS_NONE;
- unlockBtreeIfUnused(pBt);
-
- btreeIntegrity(p);
+ btreeEndTransaction(p);
sqlite3BtreeLeave(p);
return SQLITE_OK;
}
@@ -32499,9 +40745,14 @@ SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode){
BtCursor *p;
sqlite3BtreeEnter(pBtree);
for(p=pBtree->pBt->pCursor; p; p=p->pNext){
- clearCursorPosition(p);
+ int i;
+ sqlite3BtreeClearCursor(p);
p->eState = CURSOR_FAULT;
- p->skip = errCode;
+ p->skipNext = errCode;
+ for(i=0; i<=p->iPage; i++){
+ releasePage(p->apPage[i]);
+ p->apPage[i] = 0;
+ }
}
sqlite3BtreeLeave(pBtree);
}
@@ -32521,11 +40772,10 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p){
MemPage *pPage1;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
rc = saveAllCursors(pBt, 0, 0);
#ifndef SQLITE_OMIT_SHARED_CACHE
if( rc!=SQLITE_OK ){
- /* This is a horrible situation. An IO or malloc() error occured whilst
+ /* This is a horrible situation. An IO or malloc() error occurred whilst
** trying to save cursor positions. If this is an automatic rollback (as
** the result of a constraint, malloc() failure or IO error) then
** the cache may be internally inconsistent (not contain valid trees) so
@@ -32536,15 +40786,10 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p){
}
#endif
btreeIntegrity(p);
- unlockAllTables(p);
if( p->inTrans==TRANS_WRITE ){
int rc2;
-#ifndef SQLITE_OMIT_AUTOVACUUM
- pBt->nTrunc = 0;
-#endif
-
assert( TRANS_WRITE==pBt->inTransaction );
rc2 = sqlite3PagerRollback(pBt->pPager);
if( rc2!=SQLITE_OK ){
@@ -32552,109 +40797,95 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p){
}
/* The rollback may have destroyed the pPage1->aData value. So
- ** call sqlite3BtreeGetPage() on page 1 again to make
+ ** call btreeGetPage() on page 1 again to make
** sure pPage1->aData is set correctly. */
- if( sqlite3BtreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){
+ if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){
releasePage(pPage1);
}
assert( countWriteCursors(pBt)==0 );
pBt->inTransaction = TRANS_READ;
}
- if( p->inTrans!=TRANS_NONE ){
- assert( pBt->nTransaction>0 );
- pBt->nTransaction--;
- if( 0==pBt->nTransaction ){
- pBt->inTransaction = TRANS_NONE;
- }
- }
-
- p->inTrans = TRANS_NONE;
- pBt->inStmt = 0;
- unlockBtreeIfUnused(pBt);
-
- btreeIntegrity(p);
+ btreeEndTransaction(p);
sqlite3BtreeLeave(p);
return rc;
}
/*
-** Start a statement subtransaction. The subtransaction can
-** can be rolled back independently of the main transaction.
-** You must start a transaction before starting a subtransaction.
-** The subtransaction is ended automatically if the main transaction
-** commits or rolls back.
-**
-** Only one subtransaction may be active at a time. It is an error to try
-** to start a new subtransaction if another subtransaction is already active.
+** Start a statement subtransaction. The subtransaction can can be rolled
+** back independently of the main transaction. You must start a transaction
+** before starting a subtransaction. The subtransaction is ended automatically
+** if the main transaction commits or rolls back.
**
** Statement subtransactions are used around individual SQL statements
** that are contained within a BEGIN...COMMIT block. If a constraint
** error occurs within the statement, the effect of that one statement
** can be rolled back without having to rollback the entire transaction.
+**
+** A statement sub-transaction is implemented as an anonymous savepoint. The
+** value passed as the second parameter is the total number of savepoints,
+** including the new anonymous savepoint, open on the B-Tree. i.e. if there
+** are no active savepoints and no other statement-transactions open,
+** iStatement is 1. This anonymous savepoint can be released or rolled back
+** using the sqlite3BtreeSavepoint() function.
*/
-SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p){
+SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){
int rc;
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
- if( (p->inTrans!=TRANS_WRITE) || pBt->inStmt ){
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
+ assert( p->inTrans==TRANS_WRITE );
+ assert( pBt->readOnly==0 );
+ assert( iStatement>0 );
+ assert( iStatement>p->db->nSavepoint );
+ if( NEVER(p->inTrans!=TRANS_WRITE || pBt->readOnly) ){
+ rc = SQLITE_INTERNAL;
}else{
assert( pBt->inTransaction==TRANS_WRITE );
- rc = pBt->readOnly ? SQLITE_OK : sqlite3PagerStmtBegin(pBt->pPager);
- pBt->inStmt = 1;
- }
- sqlite3BtreeLeave(p);
- return rc;
-}
-
-
-/*
-** Commit the statment subtransaction currently in progress. If no
-** subtransaction is active, this is a no-op.
-*/
-SQLITE_PRIVATE int sqlite3BtreeCommitStmt(Btree *p){
- int rc;
- BtShared *pBt = p->pBt;
- sqlite3BtreeEnter(p);
- pBt->db = p->db;
- if( pBt->inStmt && !pBt->readOnly ){
- rc = sqlite3PagerStmtCommit(pBt->pPager);
- }else{
- rc = SQLITE_OK;
+ /* At the pager level, a statement transaction is a savepoint with
+ ** an index greater than all savepoints created explicitly using
+ ** SQL statements. It is illegal to open, release or rollback any
+ ** such savepoints while the statement transaction savepoint is active.
+ */
+ rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement);
}
- pBt->inStmt = 0;
sqlite3BtreeLeave(p);
return rc;
}
/*
-** Rollback the active statement subtransaction. If no subtransaction
-** is active this routine is a no-op.
+** The second argument to this function, op, is always SAVEPOINT_ROLLBACK
+** or SAVEPOINT_RELEASE. This function either releases or rolls back the
+** savepoint identified by parameter iSavepoint, depending on the value
+** of op.
**
-** All cursors will be invalidated by this operation. Any attempt
-** to use a cursor that was open at the beginning of this operation
-** will result in an error.
+** Normally, iSavepoint is greater than or equal to zero. However, if op is
+** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the
+** contents of the entire transaction are rolled back. This is different
+** from a normal transaction rollback, as no locks are released and the
+** transaction remains open.
*/
-SQLITE_PRIVATE int sqlite3BtreeRollbackStmt(Btree *p){
+SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){
int rc = SQLITE_OK;
- BtShared *pBt = p->pBt;
- sqlite3BtreeEnter(p);
- pBt->db = p->db;
- if( pBt->inStmt && !pBt->readOnly ){
- rc = sqlite3PagerStmtRollback(pBt->pPager);
- assert( countWriteCursors(pBt)==0 );
- pBt->inStmt = 0;
+ if( p && p->inTrans==TRANS_WRITE ){
+ BtShared *pBt = p->pBt;
+ assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
+ assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) );
+ sqlite3BtreeEnter(p);
+ rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint);
+ if( rc==SQLITE_OK ){
+ rc = newDatabase(pBt);
+ }
+ sqlite3BtreeLeave(p);
}
- sqlite3BtreeLeave(p);
return rc;
}
/*
** Create a new cursor for the BTree whose root is on the page
-** iTable. The act of acquiring a cursor gets a read lock on
-** the database file.
+** iTable. If a read-only cursor is requested, it is assumed that
+** the caller already has at least a read-only transaction open
+** on the database already. If a write-cursor is requested, then
+** the caller is assumed to have an open write transaction.
**
** If wrFlag==0, then the cursor can only be used for reading.
** If wrFlag==1, then the cursor can be used for reading or for
@@ -32677,6 +40908,9 @@ SQLITE_PRIVATE int sqlite3BtreeRollbackStmt(Btree *p){
** No checking is done to make sure that page iTable really is the
** root page of a b-tree. If it is not, then the cursor acquired
** will not work correctly.
+**
+** It is assumed that the sqlite3BtreeCursorSize() bytes of memory
+** pointed to by pCur have been zeroed by the caller.
*/
static int btreeCursor(
Btree *p, /* The btree */
@@ -32685,61 +40919,46 @@ static int btreeCursor(
struct KeyInfo *pKeyInfo, /* First arg to comparison function */
BtCursor *pCur /* Space for new cursor */
){
- int rc;
- BtShared *pBt = p->pBt;
+ BtShared *pBt = p->pBt; /* Shared b-tree handle */
assert( sqlite3BtreeHoldsMutex(p) );
- if( wrFlag ){
- if( pBt->readOnly ){
- return SQLITE_READONLY;
- }
- if( checkReadLocks(p, iTable, 0) ){
- return SQLITE_LOCKED;
- }
- }
+ assert( wrFlag==0 || wrFlag==1 );
- if( pBt->pPage1==0 ){
- rc = lockBtreeWithRetry(p);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- if( pBt->readOnly && wrFlag ){
- return SQLITE_READONLY;
- }
- }
- pCur->pgnoRoot = (Pgno)iTable;
- if( iTable==1 && sqlite3PagerPagecount(pBt->pPager)==0 ){
- rc = SQLITE_EMPTY;
- goto create_cursor_exception;
+ /* The following assert statements verify that if this is a sharable
+ ** b-tree database, the connection is holding the required table locks,
+ ** and that no other connection has any open cursor that conflicts with
+ ** this lock. */
+ assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, wrFlag+1) );
+ assert( wrFlag==0 || !hasReadConflicts(p, iTable) );
+
+ /* Assert that the caller has opened the required transaction. */
+ assert( p->inTrans>TRANS_NONE );
+ assert( wrFlag==0 || p->inTrans==TRANS_WRITE );
+ assert( pBt->pPage1 && pBt->pPage1->aData );
+
+ if( NEVER(wrFlag && pBt->readOnly) ){
+ return SQLITE_READONLY;
}
- rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->pPage, 0);
- if( rc!=SQLITE_OK ){
- goto create_cursor_exception;
+ if( iTable==1 && pagerPagecount(pBt)==0 ){
+ return SQLITE_EMPTY;
}
/* Now that no other errors can occur, finish filling in the BtCursor
- ** variables, link the cursor into the BtShared list and set *ppCur (the
- ** output argument to this function).
- */
+ ** variables and link the cursor into the BtShared list. */
+ pCur->pgnoRoot = (Pgno)iTable;
+ pCur->iPage = -1;
pCur->pKeyInfo = pKeyInfo;
pCur->pBtree = p;
pCur->pBt = pBt;
- pCur->wrFlag = wrFlag;
+ pCur->wrFlag = (u8)wrFlag;
pCur->pNext = pBt->pCursor;
if( pCur->pNext ){
pCur->pNext->pPrev = pCur;
}
pBt->pCursor = pCur;
pCur->eState = CURSOR_INVALID;
-
+ pCur->cachedRowid = 0;
return SQLITE_OK;
-
-create_cursor_exception:
- if( pCur ){
- releasePage(pCur->pPage);
- }
- unlockBtreeIfUnused(pBt);
- return rc;
}
SQLITE_PRIVATE int sqlite3BtreeCursor(
Btree *p, /* The btree */
@@ -32750,16 +40969,52 @@ SQLITE_PRIVATE int sqlite3BtreeCursor(
){
int rc;
sqlite3BtreeEnter(p);
- p->pBt->db = p->db;
rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur);
sqlite3BtreeLeave(p);
return rc;
}
-SQLITE_PRIVATE int sqlite3BtreeCursorSize(){
+
+/*
+** Return the size of a BtCursor object in bytes.
+**
+** This interfaces is needed so that users of cursors can preallocate
+** sufficient storage to hold a cursor. The BtCursor object is opaque
+** to users so they cannot do the sizeof() themselves - they must call
+** this routine.
+*/
+SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){
return sizeof(BtCursor);
}
+/*
+** Set the cached rowid value of every cursor in the same database file
+** as pCur and having the same root page number as pCur. The value is
+** set to iRowid.
+**
+** Only positive rowid values are considered valid for this cache.
+** The cache is initialized to zero, indicating an invalid cache.
+** A btree will work fine with zero or negative rowids. We just cannot
+** cache zero or negative rowids, which means tables that use zero or
+** negative rowids might run a little slower. But in practice, zero
+** or negative rowids are very uncommon so this should not be a problem.
+*/
+SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor *pCur, sqlite3_int64 iRowid){
+ BtCursor *p;
+ for(p=pCur->pBt->pCursor; p; p=p->pNext){
+ if( p->pgnoRoot==pCur->pgnoRoot ) p->cachedRowid = iRowid;
+ }
+ assert( pCur->cachedRowid==iRowid );
+}
+/*
+** Return the cached rowid for the given cursor. A negative or zero
+** return value indicates that the rowid cache is invalid and should be
+** ignored. If the rowid cache has never before been set, then a
+** zero is returned.
+*/
+SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor *pCur){
+ return pCur->cachedRowid;
+}
/*
** Close a cursor. The read lock on the database file is released
@@ -32768,10 +41023,10 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(){
SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
Btree *pBtree = pCur->pBtree;
if( pBtree ){
+ int i;
BtShared *pBt = pCur->pBt;
sqlite3BtreeEnter(pBtree);
- pBt->db = pBtree->db;
- clearCursorPosition(pCur);
+ sqlite3BtreeClearCursor(pCur);
if( pCur->pPrev ){
pCur->pPrev->pNext = pCur->pNext;
}else{
@@ -32780,7 +41035,9 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
if( pCur->pNext ){
pCur->pNext->pPrev = pCur->pPrev;
}
- releasePage(pCur->pPage);
+ for(i=0; i<=pCur->iPage; i++){
+ releasePage(pCur->apPage[i]);
+ }
unlockBtreeIfUnused(pBt);
invalidateOverflowCache(pCur);
/* sqlite3_free(pCur); */
@@ -32790,37 +41047,12 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
}
/*
-** Make a temporary cursor by filling in the fields of pTempCur.
-** The temporary cursor is not on the cursor list for the Btree.
-*/
-SQLITE_PRIVATE void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur){
- assert( cursorHoldsMutex(pCur) );
- memcpy(pTempCur, pCur, sizeof(*pCur));
- pTempCur->pNext = 0;
- pTempCur->pPrev = 0;
- if( pTempCur->pPage ){
- sqlite3PagerRef(pTempCur->pPage->pDbPage);
- }
-}
-
-/*
-** Delete a temporary cursor such as was made by the CreateTemporaryCursor()
-** function above.
-*/
-SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
- assert( cursorHoldsMutex(pCur) );
- if( pCur->pPage ){
- sqlite3PagerUnref(pCur->pPage->pDbPage);
- }
-}
-
-/*
** Make sure the BtCursor* given in the argument has a valid
** BtCursor.info structure. If it is not already valid, call
-** sqlite3BtreeParseCell() to fill it in.
+** btreeParseCell() to fill it in.
**
** BtCursor.info is a cache of the information in the current cell.
-** Using this cache reduces the number of calls to sqlite3BtreeParseCell().
+** Using this cache reduces the number of calls to btreeParseCell().
**
** 2007-06-25: There is a bug in some versions of MSVC that cause the
** compiler to crash when getCellInfo() is implemented as a macro.
@@ -32832,8 +41064,9 @@ SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
#ifndef NDEBUG
static void assertCellInfo(BtCursor *pCur){
CellInfo info;
+ int iPage = pCur->iPage;
memset(&info, 0, sizeof(info));
- sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &info);
+ btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info);
assert( memcmp(&info, &pCur->info, sizeof(info))==0 );
}
#else
@@ -32843,7 +41076,8 @@ SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
/* Use a real function in MSVC to work around bugs in that compiler. */
static void getCellInfo(BtCursor *pCur){
if( pCur->info.nSize==0 ){
- sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info);
+ int iPage = pCur->iPage;
+ btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
pCur->validNKey = 1;
}else{
assertCellInfo(pCur);
@@ -32851,15 +41085,27 @@ SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
}
#else /* if not _MSC_VER */
/* Use a macro in all other compilers so that the function is inlined */
-#define getCellInfo(pCur) \
- if( pCur->info.nSize==0 ){ \
- sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); \
- pCur->validNKey = 1; \
- }else{ \
- assertCellInfo(pCur); \
+#define getCellInfo(pCur) \
+ if( pCur->info.nSize==0 ){ \
+ int iPage = pCur->iPage; \
+ btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \
+ pCur->validNKey = 1; \
+ }else{ \
+ assertCellInfo(pCur); \
}
#endif /* _MSC_VER */
+#ifndef NDEBUG /* The next routine used only within assert() statements */
+/*
+** Return true if the given BtCursor is valid. A valid cursor is one
+** that is currently pointing to a row in a (non-empty) table.
+** This is a verification routine is used only within assert() statements.
+*/
+SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){
+ return pCur && pCur->eState==CURSOR_VALID;
+}
+#endif /* NDEBUG */
+
/*
** Set *pSize to the size of the buffer needed to hold the value of
** the key for the current entry. If the cursor is not pointing
@@ -32867,47 +41113,41 @@ SQLITE_PRIVATE void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
**
** For a table with the INTKEY flag set, this routine returns the key
** itself, not the number of bytes in the key.
+**
+** The caller must position the cursor prior to invoking this routine.
+**
+** This routine cannot fail. It always returns SQLITE_OK.
*/
SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){
- int rc;
-
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
- if( rc==SQLITE_OK ){
- assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID );
- if( pCur->eState==CURSOR_INVALID ){
- *pSize = 0;
- }else{
- getCellInfo(pCur);
- *pSize = pCur->info.nKey;
- }
+ assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID );
+ if( pCur->eState!=CURSOR_VALID ){
+ *pSize = 0;
+ }else{
+ getCellInfo(pCur);
+ *pSize = pCur->info.nKey;
}
- return rc;
+ return SQLITE_OK;
}
/*
** Set *pSize to the number of bytes of data in the entry the
-** cursor currently points to. Always return SQLITE_OK.
-** Failure is not possible. If the cursor is not currently
-** pointing to an entry (which can happen, for example, if
-** the database is empty) then *pSize is set to 0.
+** cursor currently points to.
+**
+** The caller must guarantee that the cursor is pointing to a non-NULL
+** valid entry. In other words, the calling procedure must guarantee
+** that the cursor has Cursor.eState==CURSOR_VALID.
+**
+** Failure is not possible. This function always returns SQLITE_OK.
+** It might just as well be a procedure (returning void) but we continue
+** to return an integer result code for historical reasons.
*/
SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
- int rc;
-
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
- if( rc==SQLITE_OK ){
- assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID );
- if( pCur->eState==CURSOR_INVALID ){
- /* Not pointing at a valid entry - set *pSize to 0. */
- *pSize = 0;
- }else{
- getCellInfo(pCur);
- *pSize = pCur->info.nData;
- }
- }
- return rc;
+ assert( pCur->eState==CURSOR_VALID );
+ getCellInfo(pCur);
+ *pSize = pCur->info.nData;
+ return SQLITE_OK;
}
/*
@@ -32918,34 +41158,29 @@ SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
**
** If an error occurs an SQLite error code is returned. Otherwise:
**
-** Unless pPgnoNext is NULL, the page number of the next overflow
-** page in the linked list is written to *pPgnoNext. If page ovfl
-** is the last page in its linked list, *pPgnoNext is set to zero.
+** The page number of the next overflow page in the linked list is
+** written to *pPgnoNext. If page ovfl is the last page in its linked
+** list, *pPgnoNext is set to zero.
**
-** If ppPage is not NULL, *ppPage is set to the MemPage* handle
-** for page ovfl. The underlying pager page may have been requested
-** with the noContent flag set, so the page data accessable via
-** this handle may not be trusted.
+** If ppPage is not NULL, and a reference to the MemPage object corresponding
+** to page number pOvfl was obtained, then *ppPage is set to point to that
+** reference. It is the responsibility of the caller to call releasePage()
+** on *ppPage to free the reference. In no reference was obtained (because
+** the pointer-map was used to obtain the value for *pPgnoNext), then
+** *ppPage is set to zero.
*/
static int getOverflowPage(
- BtShared *pBt,
- Pgno ovfl, /* Overflow page */
- MemPage **ppPage, /* OUT: MemPage handle */
+ BtShared *pBt, /* The database file */
+ Pgno ovfl, /* Current overflow page number */
+ MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */
Pgno *pPgnoNext /* OUT: Next overflow page number */
){
Pgno next = 0;
- int rc;
+ MemPage *pPage = 0;
+ int rc = SQLITE_OK;
assert( sqlite3_mutex_held(pBt->mutex) );
- /* One of these must not be NULL. Otherwise, why call this function? */
- assert(ppPage || pPgnoNext);
-
- /* If pPgnoNext is NULL, then this function is being called to obtain
- ** a MemPage* reference only. No page-data is required in this case.
- */
- if( !pPgnoNext ){
- return sqlite3BtreeGetPage(pBt, ovfl, ppPage, 1);
- }
+ assert(pPgnoNext);
#ifndef SQLITE_OMIT_AUTOVACUUM
/* Try to find the next page in the overflow list using the
@@ -32963,36 +41198,32 @@ static int getOverflowPage(
iGuess++;
}
- if( iGuess<=sqlite3PagerPagecount(pBt->pPager) ){
+ if( iGuess<=pagerPagecount(pBt) ){
rc = ptrmapGet(pBt, iGuess, &eType, &pgno);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- if( eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){
+ if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){
next = iGuess;
+ rc = SQLITE_DONE;
}
}
}
#endif
- if( next==0 || ppPage ){
- MemPage *pPage = 0;
-
- rc = sqlite3BtreeGetPage(pBt, ovfl, &pPage, next!=0);
- assert(rc==SQLITE_OK || pPage==0);
- if( next==0 && rc==SQLITE_OK ){
+ assert( next==0 || rc==SQLITE_DONE );
+ if( rc==SQLITE_OK ){
+ rc = btreeGetPage(pBt, ovfl, &pPage, 0);
+ assert( rc==SQLITE_OK || pPage==0 );
+ if( rc==SQLITE_OK ){
next = get4byte(pPage->aData);
}
-
- if( ppPage ){
- *ppPage = pPage;
- }else{
- releasePage(pPage);
- }
}
- *pPgnoNext = next;
- return rc;
+ *pPgnoNext = next;
+ if( ppPage ){
+ *ppPage = pPage;
+ }else{
+ releasePage(pPage);
+ }
+ return (rc==SQLITE_DONE ? SQLITE_OK : rc);
}
/*
@@ -33037,10 +41268,8 @@ static int copyPayload(
** A total of "amt" bytes are read or written beginning at "offset".
** Data is read to or from the buffer pBuf.
**
-** This routine does not make a distinction between key and data.
-** It just reads or writes bytes from the payload area. Data might
-** appear on the main page or be scattered out on multiple overflow
-** pages.
+** The content being read or written might appear on the main page
+** or be scattered out on multiple overflow pages.
**
** If the BtCursor.isIncrblobHandle flag is set, and the current
** cursor entry uses one or more overflow pages, this function
@@ -33059,35 +41288,32 @@ static int copyPayload(
*/
static int accessPayload(
BtCursor *pCur, /* Cursor pointing to entry to read from */
- int offset, /* Begin reading this far into payload */
- int amt, /* Read this many bytes */
+ u32 offset, /* Begin reading this far into payload */
+ u32 amt, /* Read this many bytes */
unsigned char *pBuf, /* Write the bytes into this buffer */
- int skipKey, /* offset begins at data if this is true */
int eOp /* zero to read. non-zero to write. */
){
unsigned char *aPayload;
int rc = SQLITE_OK;
u32 nKey;
int iIdx = 0;
- MemPage *pPage = pCur->pPage; /* Btree page of current cursor entry */
- BtShared *pBt; /* Btree this cursor belongs to */
+ MemPage *pPage = pCur->apPage[pCur->iPage]; /* Btree page of current entry */
+ BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */
assert( pPage );
assert( pCur->eState==CURSOR_VALID );
- assert( pCur->idx>=0 && pCur->idx<pPage->nCell );
- assert( offset>=0 );
+ assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
assert( cursorHoldsMutex(pCur) );
getCellInfo(pCur);
aPayload = pCur->info.pCell + pCur->info.nHeader;
- nKey = (pPage->intKey ? 0 : pCur->info.nKey);
+ nKey = (pPage->intKey ? 0 : (int)pCur->info.nKey);
- if( skipKey ){
- offset += nKey;
- }
- if( offset+amt > nKey+pCur->info.nData ){
+ if( NEVER(offset+amt > nKey+pCur->info.nData)
+ || &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize]
+ ){
/* Trying to read or write past the end of the data is an error */
- return SQLITE_ERROR;
+ return SQLITE_CORRUPT_BKPT;
}
/* Check if data must be read/written to/from the btree page itself. */
@@ -33104,9 +41330,8 @@ static int accessPayload(
offset -= pCur->info.nLocal;
}
- pBt = pCur->pBt;
if( rc==SQLITE_OK && amt>0 ){
- const int ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */
+ const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */
Pgno nextPage;
nextPage = get4byte(&aPayload[pCur->info.nLocal]);
@@ -33122,7 +41347,9 @@ static int accessPayload(
if( pCur->isIncrblobHandle && !pCur->aOverflow ){
int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
pCur->aOverflow = (Pgno *)sqlite3MallocZero(sizeof(Pgno)*nOvfl);
- if( nOvfl && !pCur->aOverflow ){
+ /* nOvfl is always positive. If it were zero, fetchPayload would have
+ ** been used instead of this routine. */
+ if( ALWAYS(nOvfl) && !pCur->aOverflow ){
rc = SQLITE_NOMEM;
}
}
@@ -33196,26 +41423,19 @@ static int accessPayload(
** "amt" bytes will be transfered into pBuf[]. The transfer
** begins at "offset".
**
+** The caller must ensure that pCur is pointing to a valid row
+** in the table.
+**
** Return SQLITE_OK on success or an error code if anything goes
** wrong. An error is returned if "offset+amt" is larger than
** the available payload.
*/
SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
- int rc;
-
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
- if( rc==SQLITE_OK ){
- assert( pCur->eState==CURSOR_VALID );
- assert( pCur->pPage!=0 );
- if( pCur->pPage->intKey ){
- return SQLITE_CORRUPT_BKPT;
- }
- assert( pCur->pPage->intKey==0 );
- assert( pCur->idx>=0 && pCur->idx<pCur->pPage->nCell );
- rc = accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0, 0);
- }
- return rc;
+ assert( pCur->eState==CURSOR_VALID );
+ assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
+ assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
+ return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0);
}
/*
@@ -33230,13 +41450,19 @@ SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pB
SQLITE_PRIVATE int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
int rc;
+#ifndef SQLITE_OMIT_INCRBLOB
+ if ( pCur->eState==CURSOR_INVALID ){
+ return SQLITE_ABORT;
+ }
+#endif
+
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
+ rc = restoreCursorPosition(pCur);
if( rc==SQLITE_OK ){
assert( pCur->eState==CURSOR_VALID );
- assert( pCur->pPage!=0 );
- assert( pCur->idx>=0 && pCur->idx<pCur->pPage->nCell );
- rc = accessPayload(pCur, offset, amt, pBuf, 1, 0);
+ assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
+ assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
+ rc = accessPayload(pCur, offset, amt, pBuf, 0);
}
return rc;
}
@@ -33253,7 +41479,7 @@ SQLITE_PRIVATE int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *p
** and data to fit on the local page and for there to be no overflow
** pages. When that is so, this routine can be used to access the
** key and data without making a copy. If the key and/or data spills
-** onto overflow pages, then accessPayload() must be used to reassembly
+** onto overflow pages, then accessPayload() must be used to reassemble
** the key/data and copy it into a preallocated buffer.
**
** The pointer returned by this routine looks directly into the cached
@@ -33268,29 +41494,30 @@ static const unsigned char *fetchPayload(
unsigned char *aPayload;
MemPage *pPage;
u32 nKey;
- int nLocal;
+ u32 nLocal;
- assert( pCur!=0 && pCur->pPage!=0 );
+ assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]);
assert( pCur->eState==CURSOR_VALID );
assert( cursorHoldsMutex(pCur) );
- pPage = pCur->pPage;
- assert( pCur->idx>=0 && pCur->idx<pPage->nCell );
- getCellInfo(pCur);
+ pPage = pCur->apPage[pCur->iPage];
+ assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
+ if( NEVER(pCur->info.nSize==0) ){
+ btreeParseCell(pCur->apPage[pCur->iPage], pCur->aiIdx[pCur->iPage],
+ &pCur->info);
+ }
aPayload = pCur->info.pCell;
aPayload += pCur->info.nHeader;
if( pPage->intKey ){
nKey = 0;
}else{
- nKey = pCur->info.nKey;
+ nKey = (int)pCur->info.nKey;
}
if( skipKey ){
aPayload += nKey;
nLocal = pCur->info.nLocal - nKey;
}else{
nLocal = pCur->info.nLocal;
- if( nLocal>nKey ){
- nLocal = nKey;
- }
+ assert( nLocal<=nKey );
}
*pAmt = nLocal;
return aPayload;
@@ -33312,68 +41539,79 @@ static const unsigned char *fetchPayload(
** in the common case where no overflow pages are used.
*/
SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor *pCur, int *pAmt){
+ const void *p = 0;
+ assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
assert( cursorHoldsMutex(pCur) );
- if( pCur->eState==CURSOR_VALID ){
- return (const void*)fetchPayload(pCur, pAmt, 0);
+ if( ALWAYS(pCur->eState==CURSOR_VALID) ){
+ p = (const void*)fetchPayload(pCur, pAmt, 0);
}
- return 0;
+ return p;
}
SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor *pCur, int *pAmt){
+ const void *p = 0;
+ assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
assert( cursorHoldsMutex(pCur) );
- if( pCur->eState==CURSOR_VALID ){
- return (const void*)fetchPayload(pCur, pAmt, 1);
+ if( ALWAYS(pCur->eState==CURSOR_VALID) ){
+ p = (const void*)fetchPayload(pCur, pAmt, 1);
}
- return 0;
+ return p;
}
/*
** Move the cursor down to a new child page. The newPgno argument is the
** page number of the child page to move to.
+**
+** This function returns SQLITE_CORRUPT if the page-header flags field of
+** the new child page does not match the flags field of the parent (i.e.
+** if an intkey page appears to be the parent of a non-intkey page, or
+** vice-versa).
*/
static int moveToChild(BtCursor *pCur, u32 newPgno){
int rc;
+ int i = pCur->iPage;
MemPage *pNewPage;
- MemPage *pOldPage;
BtShared *pBt = pCur->pBt;
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
- rc = getAndInitPage(pBt, newPgno, &pNewPage, pCur->pPage);
+ assert( pCur->iPage<BTCURSOR_MAX_DEPTH );
+ if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ rc = getAndInitPage(pBt, newPgno, &pNewPage);
if( rc ) return rc;
- pNewPage->idxParent = pCur->idx;
- pOldPage = pCur->pPage;
- pOldPage->idxShift = 0;
- releasePage(pOldPage);
- pCur->pPage = pNewPage;
- pCur->idx = 0;
+ pCur->apPage[i+1] = pNewPage;
+ pCur->aiIdx[i+1] = 0;
+ pCur->iPage++;
+
pCur->info.nSize = 0;
pCur->validNKey = 0;
- if( pNewPage->nCell<1 ){
+ if( pNewPage->nCell<1 || pNewPage->intKey!=pCur->apPage[i]->intKey ){
return SQLITE_CORRUPT_BKPT;
}
return SQLITE_OK;
}
+#ifndef NDEBUG
/*
-** Return true if the page is the virtual root of its table.
-**
-** The virtual root page is the root page for most tables. But
-** for the table rooted on page 1, sometime the real root page
-** is empty except for the right-pointer. In such cases the
-** virtual root page is the page that the right-pointer of page
-** 1 is pointing to.
+** Page pParent is an internal (non-leaf) tree page. This function
+** asserts that page number iChild is the left-child if the iIdx'th
+** cell in page pParent. Or, if iIdx is equal to the total number of
+** cells in pParent, that page number iChild is the right-child of
+** the page.
*/
-SQLITE_PRIVATE int sqlite3BtreeIsRootPage(MemPage *pPage){
- MemPage *pParent;
-
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- pParent = pPage->pParent;
- if( pParent==0 ) return 1;
- if( pParent->pgno>1 ) return 0;
- if( get2byte(&pParent->aData[pParent->hdrOffset+3])==0 ) return 1;
- return 0;
+static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){
+ assert( iIdx<=pParent->nCell );
+ if( iIdx==pParent->nCell ){
+ assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild );
+ }else{
+ assert( get4byte(findCell(pParent, iIdx))==iChild );
+ }
}
+#else
+# define assertParentIndex(x,y,z)
+#endif
/*
** Move the cursor up to the parent page.
@@ -33383,30 +41621,42 @@ SQLITE_PRIVATE int sqlite3BtreeIsRootPage(MemPage *pPage){
** right-most child page then pCur->idx is set to one more than
** the largest cell index.
*/
-SQLITE_PRIVATE void sqlite3BtreeMoveToParent(BtCursor *pCur){
- MemPage *pParent;
- MemPage *pPage;
- int idxParent;
-
+static void moveToParent(BtCursor *pCur){
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
- pPage = pCur->pPage;
- assert( pPage!=0 );
- assert( !sqlite3BtreeIsRootPage(pPage) );
- pParent = pPage->pParent;
- assert( pParent!=0 );
- idxParent = pPage->idxParent;
- sqlite3PagerRef(pParent->pDbPage);
- releasePage(pPage);
- pCur->pPage = pParent;
+ assert( pCur->iPage>0 );
+ assert( pCur->apPage[pCur->iPage] );
+ assertParentIndex(
+ pCur->apPage[pCur->iPage-1],
+ pCur->aiIdx[pCur->iPage-1],
+ pCur->apPage[pCur->iPage]->pgno
+ );
+ releasePage(pCur->apPage[pCur->iPage]);
+ pCur->iPage--;
pCur->info.nSize = 0;
pCur->validNKey = 0;
- assert( pParent->idxShift==0 );
- pCur->idx = idxParent;
}
/*
-** Move the cursor to the root page
+** Move the cursor to point to the root page of its b-tree structure.
+**
+** If the table has a virtual root page, then the cursor is moved to point
+** to the virtual root page instead of the actual root page. A table has a
+** virtual root page when the actual root page contains no cells and a
+** single child page. This can only happen with the table rooted at page 1.
+**
+** If the b-tree structure is empty, the cursor state is set to
+** CURSOR_INVALID. Otherwise, the cursor is set to point to the first
+** cell located on the root (or virtual root) page and the cursor state
+** is set to CURSOR_VALID.
+**
+** If this function returns successfully, it may be assumed that the
+** page-header flags indicate that the [virtual] root-page is the expected
+** kind of b-tree page (i.e. if when opening the cursor the caller did not
+** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D,
+** indicating a table b-tree, or if the caller did specify a KeyInfo
+** structure the flags byte is set to 0x02 or 0x0A, indicating an index
+** b-tree).
*/
static int moveToRoot(BtCursor *pCur){
MemPage *pRoot;
@@ -33420,36 +41670,60 @@ static int moveToRoot(BtCursor *pCur){
assert( CURSOR_FAULT > CURSOR_REQUIRESEEK );
if( pCur->eState>=CURSOR_REQUIRESEEK ){
if( pCur->eState==CURSOR_FAULT ){
- return pCur->skip;
+ assert( pCur->skipNext!=SQLITE_OK );
+ return pCur->skipNext;
}
- clearCursorPosition(pCur);
+ sqlite3BtreeClearCursor(pCur);
}
- pRoot = pCur->pPage;
- if( pRoot && pRoot->pgno==pCur->pgnoRoot ){
- assert( pRoot->isInit );
+
+ if( pCur->iPage>=0 ){
+ int i;
+ for(i=1; i<=pCur->iPage; i++){
+ releasePage(pCur->apPage[i]);
+ }
+ pCur->iPage = 0;
}else{
- if(
- SQLITE_OK!=(rc = getAndInitPage(pBt, pCur->pgnoRoot, &pRoot, 0))
- ){
+ rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0]);
+ if( rc!=SQLITE_OK ){
pCur->eState = CURSOR_INVALID;
return rc;
}
- releasePage(pCur->pPage);
- pCur->pPage = pRoot;
+ pCur->iPage = 0;
+
+ /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
+ ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
+ ** NULL, the caller expects a table b-tree. If this is not the case,
+ ** return an SQLITE_CORRUPT error. */
+ assert( pCur->apPage[0]->intKey==1 || pCur->apPage[0]->intKey==0 );
+ if( (pCur->pKeyInfo==0)!=pCur->apPage[0]->intKey ){
+ return SQLITE_CORRUPT_BKPT;
+ }
}
- pCur->idx = 0;
+
+ /* Assert that the root page is of the correct type. This must be the
+ ** case as the call to this function that loaded the root-page (either
+ ** this call or a previous invocation) would have detected corruption
+ ** if the assumption were not true, and it is not possible for the flags
+ ** byte to have been modified while this cursor is holding a reference
+ ** to the page. */
+ pRoot = pCur->apPage[0];
+ assert( pRoot->pgno==pCur->pgnoRoot );
+ assert( pRoot->isInit && (pCur->pKeyInfo==0)==pRoot->intKey );
+
+ pCur->aiIdx[0] = 0;
pCur->info.nSize = 0;
pCur->atLast = 0;
pCur->validNKey = 0;
+
if( pRoot->nCell==0 && !pRoot->leaf ){
Pgno subpage;
- assert( pRoot->pgno==1 );
+ if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT;
subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]);
- assert( subpage>0 );
pCur->eState = CURSOR_VALID;
rc = moveToChild(pCur, subpage);
+ }else{
+ pCur->eState = ((pRoot->nCell>0)?CURSOR_VALID:CURSOR_INVALID);
}
- pCur->eState = ((pCur->pPage->nCell>0)?CURSOR_VALID:CURSOR_INVALID);
return rc;
}
@@ -33467,9 +41741,9 @@ static int moveToLeftmost(BtCursor *pCur){
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
- while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){
- assert( pCur->idx>=0 && pCur->idx<pPage->nCell );
- pgno = get4byte(findCell(pPage, pCur->idx));
+ while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
+ assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
+ pgno = get4byte(findCell(pPage, pCur->aiIdx[pCur->iPage]));
rc = moveToChild(pCur, pgno);
}
return rc;
@@ -33488,21 +41762,21 @@ static int moveToLeftmost(BtCursor *pCur){
static int moveToRightmost(BtCursor *pCur){
Pgno pgno;
int rc = SQLITE_OK;
- MemPage *pPage;
+ MemPage *pPage = 0;
assert( cursorHoldsMutex(pCur) );
assert( pCur->eState==CURSOR_VALID );
- while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){
+ while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
- pCur->idx = pPage->nCell;
+ pCur->aiIdx[pCur->iPage] = pPage->nCell;
rc = moveToChild(pCur, pgno);
}
if( rc==SQLITE_OK ){
- pCur->idx = pPage->nCell - 1;
+ pCur->aiIdx[pCur->iPage] = pPage->nCell-1;
pCur->info.nSize = 0;
pCur->validNKey = 0;
}
- return SQLITE_OK;
+ return rc;
}
/* Move the cursor to the first entry in the table. Return SQLITE_OK
@@ -33517,11 +41791,11 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){
rc = moveToRoot(pCur);
if( rc==SQLITE_OK ){
if( pCur->eState==CURSOR_INVALID ){
- assert( pCur->pPage->nCell==0 );
+ assert( pCur->apPage[pCur->iPage]->nCell==0 );
*pRes = 1;
rc = SQLITE_OK;
}else{
- assert( pCur->pPage->nCell>0 );
+ assert( pCur->apPage[pCur->iPage]->nCell>0 );
*pRes = 0;
rc = moveToLeftmost(pCur);
}
@@ -33538,184 +41812,215 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
assert( cursorHoldsMutex(pCur) );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
+
+ /* If the cursor already points to the last entry, this is a no-op. */
+ if( CURSOR_VALID==pCur->eState && pCur->atLast ){
+#ifdef SQLITE_DEBUG
+ /* This block serves to assert() that the cursor really does point
+ ** to the last entry in the b-tree. */
+ int ii;
+ for(ii=0; ii<pCur->iPage; ii++){
+ assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell );
+ }
+ assert( pCur->aiIdx[pCur->iPage]==pCur->apPage[pCur->iPage]->nCell-1 );
+ assert( pCur->apPage[pCur->iPage]->leaf );
+#endif
+ return SQLITE_OK;
+ }
+
rc = moveToRoot(pCur);
if( rc==SQLITE_OK ){
if( CURSOR_INVALID==pCur->eState ){
- assert( pCur->pPage->nCell==0 );
+ assert( pCur->apPage[pCur->iPage]->nCell==0 );
*pRes = 1;
}else{
assert( pCur->eState==CURSOR_VALID );
*pRes = 0;
rc = moveToRightmost(pCur);
- getCellInfo(pCur);
- pCur->atLast = rc==SQLITE_OK;
+ pCur->atLast = rc==SQLITE_OK ?1:0;
}
}
return rc;
}
/* Move the cursor so that it points to an entry near the key
-** specified by pKey/nKey/pUnKey. Return a success code.
+** specified by pIdxKey or intKey. Return a success code.
**
-** For INTKEY tables, only the nKey parameter is used. pKey
-** and pUnKey must be NULL. For index tables, either pUnKey
-** must point to a key that has already been unpacked, or else
-** pKey/nKey describes a blob containing the key.
+** For INTKEY tables, the intKey parameter is used. pIdxKey
+** must be NULL. For index tables, pIdxKey is used and intKey
+** is ignored.
**
** If an exact match is not found, then the cursor is always
** left pointing at a leaf page which would hold the entry if it
** were present. The cursor might point to an entry that comes
** before or after the key.
**
-** The result of comparing the key with the entry to which the
-** cursor is written to *pRes if pRes!=NULL. The meaning of
-** this value is as follows:
+** An integer is written into *pRes which is the result of
+** comparing the key with the entry to which the cursor is
+** pointing. The meaning of the integer written into
+** *pRes is as follows:
**
** *pRes<0 The cursor is left pointing at an entry that
-** is smaller than pKey or if the table is empty
+** is smaller than intKey/pIdxKey or if the table is empty
** and the cursor is therefore left point to nothing.
**
** *pRes==0 The cursor is left pointing at an entry that
-** exactly matches pKey.
+** exactly matches intKey/pIdxKey.
**
** *pRes>0 The cursor is left pointing at an entry that
-** is larger than pKey.
+** is larger than intKey/pIdxKey.
**
*/
-SQLITE_PRIVATE int sqlite3BtreeMoveto(
- BtCursor *pCur, /* The cursor to be moved */
- const void *pKey, /* The key content for indices. Not used by tables */
- UnpackedRecord *pUnKey,/* Unpacked version of pKey */
- i64 nKey, /* Size of pKey. Or the key for tables */
- int biasRight, /* If true, bias the search to the high end */
- int *pRes /* Search result flag */
+SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
+ BtCursor *pCur, /* The cursor to be moved */
+ UnpackedRecord *pIdxKey, /* Unpacked index key */
+ i64 intKey, /* The table key */
+ int biasRight, /* If true, bias the search to the high end */
+ int *pRes /* Write search results here */
){
int rc;
- char aSpace[200];
assert( cursorHoldsMutex(pCur) );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
+ assert( pRes );
+ assert( (pIdxKey==0)==(pCur->pKeyInfo==0) );
/* If the cursor is already positioned at the point we are trying
** to move to, then just return without doing any work */
- if( pCur->eState==CURSOR_VALID && pCur->validNKey && pCur->pPage->intKey ){
- if( pCur->info.nKey==nKey ){
+ if( pCur->eState==CURSOR_VALID && pCur->validNKey
+ && pCur->apPage[0]->intKey
+ ){
+ if( pCur->info.nKey==intKey ){
*pRes = 0;
return SQLITE_OK;
}
- if( pCur->atLast && pCur->info.nKey<nKey ){
+ if( pCur->atLast && pCur->info.nKey<intKey ){
*pRes = -1;
return SQLITE_OK;
}
}
-
rc = moveToRoot(pCur);
if( rc ){
return rc;
}
- assert( pCur->pPage );
- assert( pCur->pPage->isInit );
+ assert( pCur->apPage[pCur->iPage] );
+ assert( pCur->apPage[pCur->iPage]->isInit );
+ assert( pCur->apPage[pCur->iPage]->nCell>0 || pCur->eState==CURSOR_INVALID );
if( pCur->eState==CURSOR_INVALID ){
*pRes = -1;
- assert( pCur->pPage->nCell==0 );
+ assert( pCur->apPage[pCur->iPage]->nCell==0 );
return SQLITE_OK;
}
- if( pCur->pPage->intKey ){
- /* We are given an SQL table to search. The key is the integer
- ** rowid contained in nKey. pKey and pUnKey should both be NULL */
- assert( pUnKey==0 );
- assert( pKey==0 );
- }else if( pUnKey==0 ){
- /* We are to search an SQL index using a key encoded as a blob.
- ** The blob is found at pKey and is nKey bytes in length. Unpack
- ** this key so that we can use it. */
- assert( pKey!=0 );
- pUnKey = sqlite3VdbeRecordUnpack(pCur->pKeyInfo, nKey, pKey,
- aSpace, sizeof(aSpace));
- if( pUnKey==0 ) return SQLITE_NOMEM;
- }else{
- /* We are to search an SQL index using a key that is already unpacked
- ** and handed to us in pUnKey. */
- assert( pKey==0 );
- }
+ assert( pCur->apPage[0]->intKey || pIdxKey );
for(;;){
int lwr, upr;
Pgno chldPg;
- MemPage *pPage = pCur->pPage;
- int c = -1; /* pRes return if table is empty must be -1 */
+ MemPage *pPage = pCur->apPage[pCur->iPage];
+ int c;
+
+ /* pPage->nCell must be greater than zero. If this is the root-page
+ ** the cursor would have been INVALID above and this for(;;) loop
+ ** not run. If this is not the root-page, then the moveToChild() routine
+ ** would have already detected db corruption. Similarly, pPage must
+ ** be the right kind (index or table) of b-tree page. Otherwise
+ ** a moveToChild() or moveToRoot() call would have detected corruption. */
+ assert( pPage->nCell>0 );
+ assert( pPage->intKey==(pIdxKey==0) );
lwr = 0;
upr = pPage->nCell-1;
- if( !pPage->intKey && pUnKey==0 ){
- rc = SQLITE_CORRUPT_BKPT;
- goto moveto_finish;
- }
if( biasRight ){
- pCur->idx = upr;
+ pCur->aiIdx[pCur->iPage] = (u16)upr;
}else{
- pCur->idx = (upr+lwr)/2;
+ pCur->aiIdx[pCur->iPage] = (u16)((upr+lwr)/2);
}
- if( lwr<=upr ) for(;;){
- void *pCellKey;
- i64 nCellKey;
+ for(;;){
+ int idx = pCur->aiIdx[pCur->iPage]; /* Index of current cell in pPage */
+ u8 *pCell; /* Pointer to current cell in pPage */
+
pCur->info.nSize = 0;
- pCur->validNKey = 1;
+ pCell = findCell(pPage, idx) + pPage->childPtrSize;
if( pPage->intKey ){
- u8 *pCell;
- pCell = findCell(pPage, pCur->idx) + pPage->childPtrSize;
+ i64 nCellKey;
if( pPage->hasData ){
u32 dummy;
pCell += getVarint32(pCell, dummy);
}
getVarint(pCell, (u64*)&nCellKey);
- if( nCellKey==nKey ){
+ if( nCellKey==intKey ){
c = 0;
- }else if( nCellKey<nKey ){
+ }else if( nCellKey<intKey ){
c = -1;
}else{
- assert( nCellKey>nKey );
+ assert( nCellKey>intKey );
c = +1;
}
+ pCur->validNKey = 1;
+ pCur->info.nKey = nCellKey;
}else{
- int available;
- pCellKey = (void *)fetchPayload(pCur, &available, 0);
- nCellKey = pCur->info.nKey;
- if( available>=nCellKey ){
- c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey);
+ /* The maximum supported page-size is 32768 bytes. This means that
+ ** the maximum number of record bytes stored on an index B-Tree
+ ** page is at most 8198 bytes, which may be stored as a 2-byte
+ ** varint. This information is used to attempt to avoid parsing
+ ** the entire cell by checking for the cases where the record is
+ ** stored entirely within the b-tree page by inspecting the first
+ ** 2 bytes of the cell.
+ */
+ int nCell = pCell[0];
+ if( !(nCell & 0x80) && nCell<=pPage->maxLocal ){
+ /* This branch runs if the record-size field of the cell is a
+ ** single byte varint and the record fits entirely on the main
+ ** b-tree page. */
+ c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
+ }else if( !(pCell[1] & 0x80)
+ && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
+ ){
+ /* The record-size field is a 2 byte varint and the record
+ ** fits entirely on the main b-tree page. */
+ c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
}else{
- pCellKey = sqlite3_malloc( nCellKey );
+ /* The record flows over onto one or more overflow pages. In
+ ** this case the whole cell needs to be parsed, a buffer allocated
+ ** and accessPayload() used to retrieve the record into the
+ ** buffer before VdbeRecordCompare() can be called. */
+ void *pCellKey;
+ u8 * const pCellBody = pCell - pPage->childPtrSize;
+ btreeParseCellPtr(pPage, pCellBody, &pCur->info);
+ nCell = (int)pCur->info.nKey;
+ pCellKey = sqlite3Malloc( nCell );
if( pCellKey==0 ){
rc = SQLITE_NOMEM;
goto moveto_finish;
}
- rc = sqlite3BtreeKey(pCur, 0, nCellKey, (void *)pCellKey);
- c = sqlite3VdbeRecordCompare(nCellKey, pCellKey, pUnKey);
+ rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
+ if( rc ){
+ sqlite3_free(pCellKey);
+ goto moveto_finish;
+ }
+ c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey);
sqlite3_free(pCellKey);
- if( rc ) goto moveto_finish;
}
}
if( c==0 ){
- pCur->info.nKey = nCellKey;
- if( pPage->leafData && !pPage->leaf ){
- lwr = pCur->idx;
+ if( pPage->intKey && !pPage->leaf ){
+ lwr = idx;
upr = lwr - 1;
break;
}else{
- if( pRes ) *pRes = 0;
+ *pRes = 0;
rc = SQLITE_OK;
goto moveto_finish;
}
}
if( c<0 ){
- lwr = pCur->idx+1;
+ lwr = idx+1;
}else{
- upr = pCur->idx-1;
+ upr = idx-1;
}
if( lwr>upr ){
- pCur->info.nKey = nCellKey;
break;
}
- pCur->idx = (lwr+upr)/2;
+ pCur->aiIdx[pCur->iPage] = (u16)((lwr+upr)/2);
}
assert( lwr==upr+1 );
assert( pPage->isInit );
@@ -33727,23 +42032,18 @@ SQLITE_PRIVATE int sqlite3BtreeMoveto(
chldPg = get4byte(findCell(pPage, lwr));
}
if( chldPg==0 ){
- assert( pCur->idx>=0 && pCur->idx<pCur->pPage->nCell );
- if( pRes ) *pRes = c;
+ assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
+ *pRes = c;
rc = SQLITE_OK;
goto moveto_finish;
}
- pCur->idx = lwr;
+ pCur->aiIdx[pCur->iPage] = (u16)lwr;
pCur->info.nSize = 0;
pCur->validNKey = 0;
rc = moveToChild(pCur, chldPg);
if( rc ) goto moveto_finish;
}
moveto_finish:
- if( pKey ){
- /* If we created our own unpacked key at the top of this
- ** procedure, then destroy that key before returning. */
- sqlite3VdbeDeleteUnpackedRecord(pUnKey);
- }
return rc;
}
@@ -33764,14 +42064,6 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){
}
/*
-** Return the database connection handle for a cursor.
-*/
-SQLITE_PRIVATE sqlite3 *sqlite3BtreeCursorDb(const BtCursor *pCur){
- assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
- return pCur->pBtree->db;
-}
-
-/*
** Advance the cursor to the next entry in the database. If
** successful then set *pRes=0. If the cursor
** was already pointing to the last entry in the database before
@@ -33779,33 +42071,34 @@ SQLITE_PRIVATE sqlite3 *sqlite3BtreeCursorDb(const BtCursor *pCur){
*/
SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
int rc;
+ int idx;
MemPage *pPage;
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
+ rc = restoreCursorPosition(pCur);
if( rc!=SQLITE_OK ){
return rc;
}
assert( pRes!=0 );
- pPage = pCur->pPage;
if( CURSOR_INVALID==pCur->eState ){
*pRes = 1;
return SQLITE_OK;
}
- if( pCur->skip>0 ){
- pCur->skip = 0;
+ if( pCur->skipNext>0 ){
+ pCur->skipNext = 0;
*pRes = 0;
return SQLITE_OK;
}
- pCur->skip = 0;
+ pCur->skipNext = 0;
+ pPage = pCur->apPage[pCur->iPage];
+ idx = ++pCur->aiIdx[pCur->iPage];
assert( pPage->isInit );
- assert( pCur->idx<pPage->nCell );
+ assert( idx<=pPage->nCell );
- pCur->idx++;
pCur->info.nSize = 0;
pCur->validNKey = 0;
- if( pCur->idx>=pPage->nCell ){
+ if( idx>=pPage->nCell ){
if( !pPage->leaf ){
rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
if( rc ) return rc;
@@ -33814,16 +42107,16 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
return rc;
}
do{
- if( sqlite3BtreeIsRootPage(pPage) ){
+ if( pCur->iPage==0 ){
*pRes = 1;
pCur->eState = CURSOR_INVALID;
return SQLITE_OK;
}
- sqlite3BtreeMoveToParent(pCur);
- pPage = pCur->pPage;
- }while( pCur->idx>=pPage->nCell );
+ moveToParent(pCur);
+ pPage = pCur->apPage[pCur->iPage];
+ }while( pCur->aiIdx[pCur->iPage]>=pPage->nCell );
*pRes = 0;
- if( pPage->leafData ){
+ if( pPage->intKey ){
rc = sqlite3BtreeNext(pCur, pRes);
}else{
rc = SQLITE_OK;
@@ -33847,11 +42140,10 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
*/
SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){
int rc;
- Pgno pgno;
MemPage *pPage;
assert( cursorHoldsMutex(pCur) );
- rc = restoreOrClearCursorPosition(pCur);
+ rc = restoreCursorPosition(pCur);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -33860,37 +42152,37 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){
*pRes = 1;
return SQLITE_OK;
}
- if( pCur->skip<0 ){
- pCur->skip = 0;
+ if( pCur->skipNext<0 ){
+ pCur->skipNext = 0;
*pRes = 0;
return SQLITE_OK;
}
- pCur->skip = 0;
+ pCur->skipNext = 0;
- pPage = pCur->pPage;
+ pPage = pCur->apPage[pCur->iPage];
assert( pPage->isInit );
- assert( pCur->idx>=0 );
if( !pPage->leaf ){
- pgno = get4byte( findCell(pPage, pCur->idx) );
- rc = moveToChild(pCur, pgno);
+ int idx = pCur->aiIdx[pCur->iPage];
+ rc = moveToChild(pCur, get4byte(findCell(pPage, idx)));
if( rc ){
return rc;
}
rc = moveToRightmost(pCur);
}else{
- while( pCur->idx==0 ){
- if( sqlite3BtreeIsRootPage(pPage) ){
+ while( pCur->aiIdx[pCur->iPage]==0 ){
+ if( pCur->iPage==0 ){
pCur->eState = CURSOR_INVALID;
*pRes = 1;
return SQLITE_OK;
}
- sqlite3BtreeMoveToParent(pCur);
- pPage = pCur->pPage;
+ moveToParent(pCur);
}
- pCur->idx--;
pCur->info.nSize = 0;
pCur->validNKey = 0;
- if( pPage->leafData && !pPage->leaf ){
+
+ pCur->aiIdx[pCur->iPage]--;
+ pPage = pCur->apPage[pCur->iPage];
+ if( pPage->intKey && !pPage->leaf ){
rc = sqlite3BtreePrevious(pCur, pRes);
}else{
rc = SQLITE_OK;
@@ -33930,14 +42222,20 @@ static int allocateBtreePage(
){
MemPage *pPage1;
int rc;
- int n; /* Number of pages on the freelist */
- int k; /* Number of leaves on the trunk of the freelist */
+ u32 n; /* Number of pages on the freelist */
+ u32 k; /* Number of leaves on the trunk of the freelist */
MemPage *pTrunk = 0;
MemPage *pPrevTrunk = 0;
+ Pgno mxPage; /* Total size of the database file */
assert( sqlite3_mutex_held(pBt->mutex) );
pPage1 = pBt->pPage1;
+ mxPage = pagerPagecount(pBt);
n = get4byte(&pPage1->aData[36]);
+ testcase( n==mxPage-1 );
+ if( n>=mxPage ){
+ return SQLITE_CORRUPT_BKPT;
+ }
if( n>0 ){
/* There are pages on the freelist. Reuse one of those pages. */
Pgno iTrunk;
@@ -33948,7 +42246,7 @@ static int allocateBtreePage(
** the entire-list will be searched for that page.
*/
#ifndef SQLITE_OMIT_AUTOVACUUM
- if( exact && nearby<=sqlite3PagerPagecount(pBt->pPager) ){
+ if( exact && nearby<=mxPage ){
u8 eType;
assert( nearby>0 );
assert( pBt->autoVacuum );
@@ -33979,7 +42277,12 @@ static int allocateBtreePage(
}else{
iTrunk = get4byte(&pPage1->aData[32]);
}
- rc = sqlite3BtreeGetPage(pBt, iTrunk, &pTrunk, 0);
+ testcase( iTrunk==mxPage );
+ if( iTrunk>mxPage ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
+ }
if( rc ){
pTrunk = 0;
goto end_allocate_page;
@@ -34000,7 +42303,7 @@ static int allocateBtreePage(
*ppPage = pTrunk;
pTrunk = 0;
TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
- }else if( k>pBt->usableSize/4 - 8 ){
+ }else if( k>(u32)(pBt->usableSize/4 - 2) ){
/* Value of k is out of range. Database corruption */
rc = SQLITE_CORRUPT_BKPT;
goto end_allocate_page;
@@ -34029,7 +42332,12 @@ static int allocateBtreePage(
*/
MemPage *pNewTrunk;
Pgno iNewTrunk = get4byte(&pTrunk->aData[8]);
- rc = sqlite3BtreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0);
+ if( iNewTrunk>mxPage ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto end_allocate_page;
+ }
+ testcase( iNewTrunk==mxPage );
+ rc = btreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0);
if( rc!=SQLITE_OK ){
goto end_allocate_page;
}
@@ -34043,6 +42351,7 @@ static int allocateBtreePage(
memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4);
releasePage(pNewTrunk);
if( !pPrevTrunk ){
+ assert( sqlite3PagerIswriteable(pPage1->pDbPage) );
put4byte(&pPage1->aData[32], iNewTrunk);
}else{
rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
@@ -34055,9 +42364,9 @@ static int allocateBtreePage(
pTrunk = 0;
TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
#endif
- }else{
+ }else if( k>0 ){
/* Extract a leaf from the trunk */
- int closest;
+ u32 closest;
Pgno iPage;
unsigned char *aData = pTrunk->aData;
rc = sqlite3PagerWrite(pTrunk->pDbPage);
@@ -34065,7 +42374,8 @@ static int allocateBtreePage(
goto end_allocate_page;
}
if( nearby>0 ){
- int i, dist;
+ u32 i;
+ int dist;
closest = 0;
dist = get4byte(&aData[8]) - nearby;
if( dist<0 ) dist = -dist;
@@ -34082,13 +42392,15 @@ static int allocateBtreePage(
}
iPage = get4byte(&aData[8+closest*4]);
+ testcase( iPage==mxPage );
+ if( iPage>mxPage ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto end_allocate_page;
+ }
+ testcase( iPage==mxPage );
if( !searchList || iPage==nearby ){
+ int noContent;
*pPgno = iPage;
- if( *pPgno>sqlite3PagerPagecount(pBt->pPager) ){
- /* Free page off the end of the file */
- rc = SQLITE_CORRUPT_BKPT;
- goto end_allocate_page;
- }
TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d"
": %d more free pages\n",
*pPgno, closest+1, k, pTrunk->pgno, n-1));
@@ -34096,9 +42408,10 @@ static int allocateBtreePage(
memcpy(&aData[8+closest*4], &aData[4+k*4], 4);
}
put4byte(&aData[4], k-1);
- rc = sqlite3BtreeGetPage(pBt, *pPgno, ppPage, 1);
+ assert( sqlite3PagerIswriteable(pTrunk->pDbPage) );
+ noContent = !btreeGetHasContent(pBt, *pPgno);
+ rc = btreeGetPage(pBt, *pPgno, ppPage, noContent);
if( rc==SQLITE_OK ){
- sqlite3PagerDontRollback((*ppPage)->pDbPage);
rc = sqlite3PagerWrite((*ppPage)->pDbPage);
if( rc!=SQLITE_OK ){
releasePage(*ppPage);
@@ -34113,36 +42426,35 @@ static int allocateBtreePage(
}else{
/* There are no pages on the freelist, so create a new page at the
** end of the file */
- *pPgno = sqlite3PagerPagecount(pBt->pPager) + 1;
+ int nPage = pagerPagecount(pBt);
+ *pPgno = nPage + 1;
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->nTrunc ){
- /* An incr-vacuum has already run within this transaction. So the
- ** page to allocate is not from the physical end of the file, but
- ** at pBt->nTrunc.
- */
- *pPgno = pBt->nTrunc+1;
- if( *pPgno==PENDING_BYTE_PAGE(pBt) ){
- (*pPgno)++;
- }
+ if( *pPgno==PENDING_BYTE_PAGE(pBt) ){
+ (*pPgno)++;
}
+
+#ifndef SQLITE_OMIT_AUTOVACUUM
if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, *pPgno) ){
/* If *pPgno refers to a pointer-map page, allocate two new pages
** at the end of the file instead of one. The first allocated page
** becomes a new pointer-map page, the second is used by the caller.
*/
+ MemPage *pPg = 0;
TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", *pPgno));
assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
+ rc = btreeGetPage(pBt, *pPgno, &pPg, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3PagerWrite(pPg->pDbPage);
+ releasePage(pPg);
+ }
+ if( rc ) return rc;
(*pPgno)++;
if( *pPgno==PENDING_BYTE_PAGE(pBt) ){ (*pPgno)++; }
}
- if( pBt->nTrunc ){
- pBt->nTrunc = *pPgno;
- }
#endif
assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
- rc = sqlite3BtreeGetPage(pBt, *pPgno, ppPage, 0);
+ rc = btreeGetPage(pBt, *pPgno, ppPage, 0);
if( rc ) return rc;
rc = sqlite3PagerWrite((*ppPage)->pDbPage);
if( rc!=SQLITE_OK ){
@@ -34156,94 +42468,159 @@ static int allocateBtreePage(
end_allocate_page:
releasePage(pTrunk);
releasePage(pPrevTrunk);
+ if( rc==SQLITE_OK ){
+ if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){
+ releasePage(*ppPage);
+ return SQLITE_CORRUPT_BKPT;
+ }
+ (*ppPage)->isInit = 0;
+ }else{
+ *ppPage = 0;
+ }
return rc;
}
/*
-** Add a page of the database file to the freelist.
+** This function is used to add page iPage to the database file free-list.
+** It is assumed that the page is not already a part of the free-list.
**
-** sqlite3PagerUnref() is NOT called for pPage.
+** The value passed as the second argument to this function is optional.
+** If the caller happens to have a pointer to the MemPage object
+** corresponding to page iPage handy, it may pass it as the second value.
+** Otherwise, it may pass NULL.
+**
+** If a pointer to a MemPage object is passed as the second argument,
+** its reference count is not altered by this function.
*/
-static int freePage(MemPage *pPage){
- BtShared *pBt = pPage->pBt;
- MemPage *pPage1 = pBt->pPage1;
- int rc, n, k;
+static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
+ MemPage *pTrunk = 0; /* Free-list trunk page */
+ Pgno iTrunk = 0; /* Page number of free-list trunk page */
+ MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */
+ MemPage *pPage; /* Page being freed. May be NULL. */
+ int rc; /* Return Code */
+ int nFree; /* Initial number of pages on free-list */
- /* Prepare the page for freeing */
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- assert( pPage->pgno>1 );
- pPage->isInit = 0;
- releasePage(pPage->pParent);
- pPage->pParent = 0;
+ assert( sqlite3_mutex_held(pBt->mutex) );
+ assert( iPage>1 );
+ assert( !pMemPage || pMemPage->pgno==iPage );
+
+ if( pMemPage ){
+ pPage = pMemPage;
+ sqlite3PagerRef(pPage->pDbPage);
+ }else{
+ pPage = btreePageLookup(pBt, iPage);
+ }
/* Increment the free page count on pPage1 */
rc = sqlite3PagerWrite(pPage1->pDbPage);
- if( rc ) return rc;
- n = get4byte(&pPage1->aData[36]);
- put4byte(&pPage1->aData[36], n+1);
+ if( rc ) goto freepage_out;
+ nFree = get4byte(&pPage1->aData[36]);
+ put4byte(&pPage1->aData[36], nFree+1);
#ifdef SQLITE_SECURE_DELETE
/* If the SQLITE_SECURE_DELETE compile-time option is enabled, then
** always fully overwrite deleted information with zeros.
*/
- rc = sqlite3PagerWrite(pPage->pDbPage);
- if( rc ) return rc;
+ if( (!pPage && (rc = btreeGetPage(pBt, iPage, &pPage, 0)))
+ || (rc = sqlite3PagerWrite(pPage->pDbPage))
+ ){
+ goto freepage_out;
+ }
memset(pPage->aData, 0, pPage->pBt->pageSize);
#endif
-#ifndef SQLITE_OMIT_AUTOVACUUM
/* If the database supports auto-vacuum, write an entry in the pointer-map
** to indicate that the page is free.
*/
- if( pBt->autoVacuum ){
- rc = ptrmapPut(pBt, pPage->pgno, PTRMAP_FREEPAGE, 0);
- if( rc ) return rc;
+ if( ISAUTOVACUUM ){
+ ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc);
+ if( rc ) goto freepage_out;
}
-#endif
- if( n==0 ){
- /* This is the first free page */
- rc = sqlite3PagerWrite(pPage->pDbPage);
- if( rc ) return rc;
- memset(pPage->aData, 0, 8);
- put4byte(&pPage1->aData[32], pPage->pgno);
- TRACE(("FREE-PAGE: %d first\n", pPage->pgno));
- }else{
- /* Other free pages already exist. Retrive the first trunk page
- ** of the freelist and find out how many leaves it has. */
- MemPage *pTrunk;
- rc = sqlite3BtreeGetPage(pBt, get4byte(&pPage1->aData[32]), &pTrunk, 0);
- if( rc ) return rc;
- k = get4byte(&pTrunk->aData[4]);
- if( k>=pBt->usableSize/4 - 8 ){
- /* The trunk is full. Turn the page being freed into a new
- ** trunk page with no leaves. */
- rc = sqlite3PagerWrite(pPage->pDbPage);
- if( rc==SQLITE_OK ){
- put4byte(pPage->aData, pTrunk->pgno);
- put4byte(&pPage->aData[4], 0);
- put4byte(&pPage1->aData[32], pPage->pgno);
- TRACE(("FREE-PAGE: %d new trunk page replacing %d\n",
- pPage->pgno, pTrunk->pgno));
- }
- }else if( k<0 ){
- rc = SQLITE_CORRUPT;
- }else{
- /* Add the newly freed page as a leaf on the current trunk */
+ /* Now manipulate the actual database free-list structure. There are two
+ ** possibilities. If the free-list is currently empty, or if the first
+ ** trunk page in the free-list is full, then this page will become a
+ ** new free-list trunk page. Otherwise, it will become a leaf of the
+ ** first trunk page in the current free-list. This block tests if it
+ ** is possible to add the page as a new free-list leaf.
+ */
+ if( nFree!=0 ){
+ u32 nLeaf; /* Initial number of leaf cells on trunk page */
+
+ iTrunk = get4byte(&pPage1->aData[32]);
+ rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
+ if( rc!=SQLITE_OK ){
+ goto freepage_out;
+ }
+
+ nLeaf = get4byte(&pTrunk->aData[4]);
+ assert( pBt->usableSize>32 );
+ if( nLeaf > (u32)pBt->usableSize/4 - 2 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto freepage_out;
+ }
+ if( nLeaf < (u32)pBt->usableSize/4 - 8 ){
+ /* In this case there is room on the trunk page to insert the page
+ ** being freed as a new leaf.
+ **
+ ** Note that the trunk page is not really full until it contains
+ ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have
+ ** coded. But due to a coding error in versions of SQLite prior to
+ ** 3.6.0, databases with freelist trunk pages holding more than
+ ** usableSize/4 - 8 entries will be reported as corrupt. In order
+ ** to maintain backwards compatibility with older versions of SQLite,
+ ** we will continue to restrict the number of entries to usableSize/4 - 8
+ ** for now. At some point in the future (once everyone has upgraded
+ ** to 3.6.0 or later) we should consider fixing the conditional above
+ ** to read "usableSize/4-2" instead of "usableSize/4-8".
+ */
rc = sqlite3PagerWrite(pTrunk->pDbPage);
if( rc==SQLITE_OK ){
- put4byte(&pTrunk->aData[4], k+1);
- put4byte(&pTrunk->aData[8+k*4], pPage->pgno);
+ put4byte(&pTrunk->aData[4], nLeaf+1);
+ put4byte(&pTrunk->aData[8+nLeaf*4], iPage);
#ifndef SQLITE_SECURE_DELETE
- sqlite3PagerDontWrite(pPage->pDbPage);
+ if( pPage ){
+ sqlite3PagerDontWrite(pPage->pDbPage);
+ }
#endif
+ rc = btreeSetHasContent(pBt, iPage);
}
TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno));
+ goto freepage_out;
}
- releasePage(pTrunk);
}
+
+ /* If control flows to this point, then it was not possible to add the
+ ** the page being freed as a leaf page of the first trunk in the free-list.
+ ** Possibly because the free-list is empty, or possibly because the
+ ** first trunk in the free-list is full. Either way, the page being freed
+ ** will become the new first trunk page in the free-list.
+ */
+ if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){
+ goto freepage_out;
+ }
+ rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( rc!=SQLITE_OK ){
+ goto freepage_out;
+ }
+ put4byte(pPage->aData, iTrunk);
+ put4byte(&pPage->aData[4], 0);
+ put4byte(&pPage1->aData[32], iPage);
+ TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk));
+
+freepage_out:
+ if( pPage ){
+ pPage->isInit = 0;
+ }
+ releasePage(pPage);
+ releasePage(pTrunk);
return rc;
}
+static void freePage(MemPage *pPage, int *pRC){
+ if( (*pRC)==SQLITE_OK ){
+ *pRC = freePage2(pPage->pBt, pPage, pPage->pgno);
+ }
+}
/*
** Free any overflow pages associated with the given Cell.
@@ -34254,28 +42631,37 @@ static int clearCell(MemPage *pPage, unsigned char *pCell){
Pgno ovflPgno;
int rc;
int nOvfl;
- int ovflPageSize;
+ u16 ovflPageSize;
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
+ btreeParseCellPtr(pPage, pCell, &info);
if( info.iOverflow==0 ){
return SQLITE_OK; /* No overflow pages. Return without doing anything */
}
ovflPgno = get4byte(&pCell[info.iOverflow]);
+ assert( pBt->usableSize > 4 );
ovflPageSize = pBt->usableSize - 4;
nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize;
assert( ovflPgno==0 || nOvfl>0 );
while( nOvfl-- ){
- MemPage *pOvfl;
- if( ovflPgno==0 || ovflPgno>sqlite3PagerPagecount(pBt->pPager) ){
+ Pgno iNext = 0;
+ MemPage *pOvfl = 0;
+ if( ovflPgno<2 || ovflPgno>pagerPagecount(pBt) ){
+ /* 0 is not a legal page number and page 1 cannot be an
+ ** overflow page. Therefore if ovflPgno<2 or past the end of the
+ ** file the database must be corrupt. */
return SQLITE_CORRUPT_BKPT;
}
-
- rc = getOverflowPage(pBt, ovflPgno, &pOvfl, (nOvfl==0)?0:&ovflPgno);
- if( rc ) return rc;
- rc = freePage(pOvfl);
- sqlite3PagerUnref(pOvfl->pDbPage);
+ if( nOvfl ){
+ rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext);
+ if( rc ) return rc;
+ }
+ rc = freePage2(pBt, pOvfl, ovflPgno);
+ if( pOvfl ){
+ sqlite3PagerUnref(pOvfl->pDbPage);
+ }
if( rc ) return rc;
+ ovflPgno = iNext;
}
return SQLITE_OK;
}
@@ -34315,6 +42701,11 @@ static int fillInCell(
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+ /* pPage is not necessarily writeable since pCell might be auxiliary
+ ** buffer space that is separate from the pPage buffer area */
+ assert( pCell<pPage->aData || pCell>=&pPage->aData[pBt->pageSize]
+ || sqlite3PagerIswriteable(pPage->pDbPage) );
+
/* Fill in the header. */
nHeader = 0;
if( !pPage->leaf ){
@@ -34326,10 +42717,10 @@ static int fillInCell(
nData = nZero = 0;
}
nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey);
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
+ btreeParseCellPtr(pPage, pCell, &info);
assert( info.nHeader==nHeader );
assert( info.nKey==nKey );
- assert( info.nData==nData+nZero );
+ assert( info.nData==(u32)(nData+nZero) );
/* Fill in the payload */
nPayload = nData + nZero;
@@ -34337,10 +42728,13 @@ static int fillInCell(
pSrc = pData;
nSrc = nData;
nData = 0;
- }else{
- nPayload += nKey;
+ }else{
+ if( NEVER(nKey>0x7fffffff || pKey==0) ){
+ return SQLITE_CORRUPT_BKPT;
+ }
+ nPayload += (int)nKey;
pSrc = pKey;
- nSrc = nKey;
+ nSrc = (int)nKey;
}
*pnSize = info.nSize;
spaceLeft = info.nLocal;
@@ -34349,7 +42743,6 @@ static int fillInCell(
while( nPayload>0 ){
if( spaceLeft==0 ){
- int isExact = 0;
#ifndef SQLITE_OMIT_AUTOVACUUM
Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */
if( pBt->autoVacuum ){
@@ -34358,12 +42751,9 @@ static int fillInCell(
} while(
PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt)
);
- if( pgnoOvfl>1 ){
- /* isExact = 1; */
- }
}
#endif
- rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, isExact);
+ rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0);
#ifndef SQLITE_OMIT_AUTOVACUUM
/* If the database supports auto-vacuum, and the second or subsequent
** overflow page is being allocated, add an entry to the pointer-map
@@ -34377,7 +42767,7 @@ static int fillInCell(
*/
if( pBt->autoVacuum && rc==SQLITE_OK ){
u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1);
- rc = ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap);
+ ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc);
if( rc ){
releasePage(pOvfl);
}
@@ -34387,6 +42777,16 @@ static int fillInCell(
releasePage(pToRelease);
return rc;
}
+
+ /* If pToRelease is not zero than pPrior points into the data area
+ ** of pToRelease. Make sure pToRelease is still writeable. */
+ assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
+
+ /* If pPrior is part of the data area of pPage, then make sure pPage
+ ** is still writeable */
+ assert( pPrior<pPage->aData || pPrior>=&pPage->aData[pBt->pageSize]
+ || sqlite3PagerIswriteable(pPage->pDbPage) );
+
put4byte(pPrior, pgnoOvfl);
releasePage(pToRelease);
pToRelease = pOvfl;
@@ -34397,6 +42797,16 @@ static int fillInCell(
}
n = nPayload;
if( n>spaceLeft ) n = spaceLeft;
+
+ /* If pToRelease is not zero than pPayload points into the data area
+ ** of pToRelease. Make sure pToRelease is still writeable. */
+ assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
+
+ /* If pPayload is part of the data area of pPage, then make sure pPage
+ ** is still writeable */
+ assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize]
+ || sqlite3PagerIswriteable(pPage->pDbPage) );
+
if( nSrc>0 ){
if( n>nSrc ) n = nSrc;
assert( pSrc );
@@ -34419,73 +42829,6 @@ static int fillInCell(
}
/*
-** Change the MemPage.pParent pointer on the page whose number is
-** given in the second argument so that MemPage.pParent holds the
-** pointer in the third argument.
-*/
-static int reparentPage(BtShared *pBt, Pgno pgno, MemPage *pNewParent, int idx){
- MemPage *pThis;
- DbPage *pDbPage;
-
- assert( sqlite3_mutex_held(pBt->mutex) );
- assert( pNewParent!=0 );
- if( pgno==0 ) return SQLITE_OK;
- assert( pBt->pPager!=0 );
- pDbPage = sqlite3PagerLookup(pBt->pPager, pgno);
- if( pDbPage ){
- pThis = (MemPage *)sqlite3PagerGetExtra(pDbPage);
- if( pThis->isInit ){
- assert( pThis->aData==sqlite3PagerGetData(pDbPage) );
- if( pThis->pParent!=pNewParent ){
- if( pThis->pParent ) sqlite3PagerUnref(pThis->pParent->pDbPage);
- pThis->pParent = pNewParent;
- sqlite3PagerRef(pNewParent->pDbPage);
- }
- pThis->idxParent = idx;
- }
- sqlite3PagerUnref(pDbPage);
- }
-
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- return ptrmapPut(pBt, pgno, PTRMAP_BTREE, pNewParent->pgno);
- }
-#endif
- return SQLITE_OK;
-}
-
-
-
-/*
-** Change the pParent pointer of all children of pPage to point back
-** to pPage.
-**
-** In other words, for every child of pPage, invoke reparentPage()
-** to make sure that each child knows that pPage is its parent.
-**
-** This routine gets called after you memcpy() one page into
-** another.
-*/
-static int reparentChildPages(MemPage *pPage){
- int i;
- BtShared *pBt = pPage->pBt;
- int rc = SQLITE_OK;
-
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- if( pPage->leaf ) return SQLITE_OK;
-
- for(i=0; i<pPage->nCell; i++){
- u8 *pCell = findCell(pPage, i);
- rc = reparentPage(pBt, get4byte(pCell), pPage, i);
- if( rc!=SQLITE_OK ) return rc;
- }
- rc = reparentPage(pBt, get4byte(&pPage->aData[pPage->hdrOffset+8]),
- pPage, i);
- pPage->idxShift = 0;
- return rc;
-}
-
-/*
** Remove the i-th cell from pPage. This routine effects pPage only.
** The cell content is not freed or deallocated. It is assumed that
** the cell content has been copied someplace else. This routine just
@@ -34493,11 +42836,15 @@ static int reparentChildPages(MemPage *pPage){
**
** "sz" must be the number of bytes in the cell.
*/
-static void dropCell(MemPage *pPage, int idx, int sz){
+static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
int i; /* Loop counter */
int pc; /* Offset to cell content of cell being deleted */
u8 *data; /* pPage->aData */
u8 *ptr; /* Used to move bytes around within data[] */
+ int rc; /* The return code */
+ int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */
+
+ if( *pRC ) return;
assert( idx>=0 && idx<pPage->nCell );
assert( sz==cellSize(pPage, idx) );
@@ -34506,16 +42853,25 @@ static void dropCell(MemPage *pPage, int idx, int sz){
data = pPage->aData;
ptr = &data[pPage->cellOffset + 2*idx];
pc = get2byte(ptr);
- assert( pc>10 && pc+sz<=pPage->pBt->usableSize );
- freeSpace(pPage, pc, sz);
+ hdr = pPage->hdrOffset;
+ testcase( pc==get2byte(&data[hdr+5]) );
+ testcase( pc+sz==pPage->pBt->usableSize );
+ if( pc < get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){
+ *pRC = SQLITE_CORRUPT_BKPT;
+ return;
+ }
+ rc = freeSpace(pPage, pc, sz);
+ if( rc ){
+ *pRC = rc;
+ return;
+ }
for(i=idx+1; i<pPage->nCell; i++, ptr+=2){
ptr[0] = ptr[2];
ptr[1] = ptr[3];
}
pPage->nCell--;
- put2byte(&data[pPage->hdrOffset+3], pPage->nCell);
+ put2byte(&data[hdr+3], pPage->nCell);
pPage->nFree += 2;
- pPage->idxShift = 1;
}
/*
@@ -34535,25 +42891,30 @@ static void dropCell(MemPage *pPage, int idx, int sz){
** nSkip is non-zero, then pCell may not point to an invalid memory location
** (but pCell+nSkip is always valid).
*/
-static int insertCell(
+static void insertCell(
MemPage *pPage, /* Page into which we are copying */
int i, /* New cell becomes the i-th cell of the page */
u8 *pCell, /* Content of the new cell */
int sz, /* Bytes of content in pCell */
u8 *pTemp, /* Temp storage space for pCell, if needed */
- u8 nSkip /* Do not write the first nSkip bytes of the cell */
+ Pgno iChild, /* If non-zero, replace first 4 bytes with this value */
+ int *pRC /* Read and write return code from here */
){
int idx; /* Where to write new cell content in data[] */
int j; /* Loop counter */
- int top; /* First byte of content for any cell in data[] */
int end; /* First byte past the last cell pointer in data[] */
int ins; /* Index in data[] where new cell pointer is inserted */
- int hdr; /* Offset into data[] of the page header */
int cellOffset; /* Address of first cell pointer in data[] */
u8 *data; /* The content of the whole page */
u8 *ptr; /* Used for moving information around in data[] */
+ int nSkip = (iChild ? 4 : 0);
+
+ if( *pRC ) return;
+
assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
+ assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 );
+ assert( pPage->nOverflow<=ArraySize(pPage->aOvfl) );
assert( sz==cellSizePtr(pPage, pCell) );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
if( pPage->nOverflow || sz+2>pPage->nFree ){
@@ -34561,60 +42922,51 @@ static int insertCell(
memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip);
pCell = pTemp;
}
+ if( iChild ){
+ put4byte(pCell, iChild);
+ }
j = pPage->nOverflow++;
- assert( j<sizeof(pPage->aOvfl)/sizeof(pPage->aOvfl[0]) );
+ assert( j<(int)(sizeof(pPage->aOvfl)/sizeof(pPage->aOvfl[0])) );
pPage->aOvfl[j].pCell = pCell;
- pPage->aOvfl[j].idx = i;
- pPage->nFree = 0;
+ pPage->aOvfl[j].idx = (u16)i;
}else{
int rc = sqlite3PagerWrite(pPage->pDbPage);
if( rc!=SQLITE_OK ){
- return rc;
+ *pRC = rc;
+ return;
}
assert( sqlite3PagerIswriteable(pPage->pDbPage) );
data = pPage->aData;
- hdr = pPage->hdrOffset;
- top = get2byte(&data[hdr+5]);
cellOffset = pPage->cellOffset;
- end = cellOffset + 2*pPage->nCell + 2;
+ end = cellOffset + 2*pPage->nCell;
ins = cellOffset + 2*i;
- if( end > top - sz ){
- rc = defragmentPage(pPage);
- if( rc!=SQLITE_OK ) return rc;
- top = get2byte(&data[hdr+5]);
- assert( end + sz <= top );
- }
- idx = allocateSpace(pPage, sz);
- assert( idx>0 );
- assert( end <= get2byte(&data[hdr+5]) );
+ rc = allocateSpace(pPage, sz, &idx);
+ if( rc ){ *pRC = rc; return; }
+ /* The allocateSpace() routine guarantees the following two properties
+ ** if it returns success */
+ assert( idx >= end+2 );
+ assert( idx+sz <= pPage->pBt->usableSize );
pPage->nCell++;
- pPage->nFree -= 2;
+ pPage->nFree -= (u16)(2 + sz);
memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip);
- for(j=end-2, ptr=&data[j]; j>ins; j-=2, ptr-=2){
+ if( iChild ){
+ put4byte(&data[idx], iChild);
+ }
+ for(j=end, ptr=&data[j]; j>ins; j-=2, ptr-=2){
ptr[0] = ptr[-2];
ptr[1] = ptr[-1];
}
put2byte(&data[ins], idx);
- put2byte(&data[hdr+3], pPage->nCell);
- pPage->idxShift = 1;
+ put2byte(&data[pPage->hdrOffset+3], pPage->nCell);
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pPage->pBt->autoVacuum ){
/* The cell may contain a pointer to an overflow page. If so, write
** the entry for the overflow page into the pointer map.
*/
- CellInfo info;
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
- assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload );
- if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){
- Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]);
- rc = ptrmapPut(pPage->pBt, pgnoOvfl, PTRMAP_OVERFLOW1, pPage->pgno);
- if( rc!=SQLITE_OK ) return rc;
- }
+ ptrmapPutOvflPtr(pPage, pCell, pRC);
}
#endif
}
-
- return SQLITE_OK;
}
/*
@@ -34628,38 +42980,33 @@ static void assemblePage(
u16 *aSize /* Sizes of the cells */
){
int i; /* Loop counter */
- int totalSize; /* Total size of all cells */
- int hdr; /* Index of page header */
- int cellptr; /* Address of next cell pointer */
+ u8 *pCellptr; /* Address of next cell pointer */
int cellbody; /* Address of next cell body */
- u8 *data; /* Data for the page */
+ u8 * const data = pPage->aData; /* Pointer to data for pPage */
+ const int hdr = pPage->hdrOffset; /* Offset of header on pPage */
+ const int nUsable = pPage->pBt->usableSize; /* Usable size of page */
assert( pPage->nOverflow==0 );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- totalSize = 0;
- for(i=0; i<nCell; i++){
- totalSize += aSize[i];
- }
- assert( totalSize+2*nCell<=pPage->nFree );
+ assert( nCell>=0 && nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 );
+ assert( sqlite3PagerIswriteable(pPage->pDbPage) );
+
+ /* Check that the page has just been zeroed by zeroPage() */
assert( pPage->nCell==0 );
- cellptr = pPage->cellOffset;
- data = pPage->aData;
- hdr = pPage->hdrOffset;
- put2byte(&data[hdr+3], nCell);
- if( nCell ){
- cellbody = allocateSpace(pPage, totalSize);
- assert( cellbody>0 );
- assert( pPage->nFree >= 2*nCell );
- pPage->nFree -= 2*nCell;
- for(i=0; i<nCell; i++){
- put2byte(&data[cellptr], cellbody);
- memcpy(&data[cellbody], apCell[i], aSize[i]);
- cellptr += 2;
- cellbody += aSize[i];
- }
- assert( cellbody==pPage->pBt->usableSize );
+ assert( get2byte(&data[hdr+5])==nUsable );
+
+ pCellptr = &data[pPage->cellOffset + nCell*2];
+ cellbody = nUsable;
+ for(i=nCell-1; i>=0; i--){
+ pCellptr -= 2;
+ cellbody -= aSize[i];
+ put2byte(pCellptr, cellbody);
+ memcpy(&data[cellbody], apCell[i], aSize[i]);
}
- pPage->nCell = nCell;
+ put2byte(&data[hdr+3], nCell);
+ put2byte(&data[hdr+5], cellbody);
+ pPage->nFree -= (nCell*2 + nUsable - cellbody);
+ pPage->nCell = (u16)nCell;
}
/*
@@ -34677,8 +43024,6 @@ static void assemblePage(
#define NN 1 /* Number of neighbors on either side of pPage */
#define NB (NN*2+1) /* Total pages involved in the balance */
-/* Forward reference */
-static int balance(MemPage*, int);
#ifndef SQLITE_OMIT_QUICKBALANCE
/*
@@ -34687,7 +43032,7 @@ static int balance(MemPage*, int);
** tree, in other words, when the new entry will become the largest
** entry in the tree.
**
-** Instead of trying balance the 3 right-most leaf pages, just add
+** Instead of trying to balance the 3 right-most leaf pages, just add
** a new page to the right-hand side and put the one new entry in
** that page. This leaves the right side of the tree somewhat
** unbalanced. But odds are that we will be inserting new entries
@@ -34697,249 +43042,351 @@ static int balance(MemPage*, int);
** pPage is the leaf page which is the right-most page in the tree.
** pParent is its parent. pPage must have a single overflow entry
** which is also the right-most entry on the page.
+**
+** The pSpace buffer is used to store a temporary copy of the divider
+** cell that will be inserted into pParent. Such a cell consists of a 4
+** byte page number followed by a variable length integer. In other
+** words, at most 13 bytes. Hence the pSpace buffer must be at
+** least 13 bytes in size.
*/
-static int balance_quick(MemPage *pPage, MemPage *pParent){
- int rc;
- MemPage *pNew;
- Pgno pgnoNew;
- u8 *pCell;
- u16 szCell;
- CellInfo info;
- BtShared *pBt = pPage->pBt;
- int parentIdx = pParent->nCell; /* pParent new divider cell index */
- int parentSize; /* Size of new divider cell */
- u8 parentCell[64]; /* Space for the new divider cell */
+static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
+ BtShared *const pBt = pPage->pBt; /* B-Tree Database */
+ MemPage *pNew; /* Newly allocated page */
+ int rc; /* Return Code */
+ Pgno pgnoNew; /* Page number of pNew */
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+ assert( sqlite3PagerIswriteable(pParent->pDbPage) );
+ assert( pPage->nOverflow==1 );
- /* Allocate a new page. Insert the overflow cell from pPage
- ** into it. Then remove the overflow cell from pPage.
+ if( pPage->nCell<=0 ) return SQLITE_CORRUPT_BKPT;
+
+ /* Allocate a new page. This page will become the right-sibling of
+ ** pPage. Make the parent page writable, so that the new divider cell
+ ** may be inserted. If both these operations are successful, proceed.
*/
rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- pCell = pPage->aOvfl[0].pCell;
- szCell = cellSizePtr(pPage, pCell);
- zeroPage(pNew, pPage->aData[0]);
- assemblePage(pNew, 1, &pCell, &szCell);
- pPage->nOverflow = 0;
- /* Set the parent of the newly allocated page to pParent. */
- pNew->pParent = pParent;
- sqlite3PagerRef(pParent->pDbPage);
+ if( rc==SQLITE_OK ){
- /* pPage is currently the right-child of pParent. Change this
- ** so that the right-child is the new page allocated above and
- ** pPage is the next-to-right child.
- */
- assert( pPage->nCell>0 );
- pCell = findCell(pPage, pPage->nCell-1);
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
- rc = fillInCell(pParent, parentCell, 0, info.nKey, 0, 0, 0, &parentSize);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- assert( parentSize<64 );
- rc = insertCell(pParent, parentIdx, parentCell, parentSize, 0, 4);
- if( rc!=SQLITE_OK ){
- return rc;
+ u8 *pOut = &pSpace[4];
+ u8 *pCell = pPage->aOvfl[0].pCell;
+ u16 szCell = cellSizePtr(pPage, pCell);
+ u8 *pStop;
+
+ assert( sqlite3PagerIswriteable(pNew->pDbPage) );
+ assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) );
+ zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF);
+ assemblePage(pNew, 1, &pCell, &szCell);
+
+ /* If this is an auto-vacuum database, update the pointer map
+ ** with entries for the new page, and any pointer from the
+ ** cell on the page to an overflow page. If either of these
+ ** operations fails, the return code is set, but the contents
+ ** of the parent page are still manipulated by thh code below.
+ ** That is Ok, at this point the parent page is guaranteed to
+ ** be marked as dirty. Returning an error code will cause a
+ ** rollback, undoing any changes made to the parent page.
+ */
+ if( ISAUTOVACUUM ){
+ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc);
+ if( szCell>pNew->minLocal ){
+ ptrmapPutOvflPtr(pNew, pCell, &rc);
+ }
+ }
+
+ /* Create a divider cell to insert into pParent. The divider cell
+ ** consists of a 4-byte page number (the page number of pPage) and
+ ** a variable length key value (which must be the same value as the
+ ** largest key on pPage).
+ **
+ ** To find the largest key value on pPage, first find the right-most
+ ** cell on pPage. The first two fields of this cell are the
+ ** record-length (a variable length integer at most 32-bits in size)
+ ** and the key value (a variable length integer, may have any value).
+ ** The first of the while(...) loops below skips over the record-length
+ ** field. The second while(...) loop copies the key value from the
+ ** cell on pPage into the pSpace buffer.
+ */
+ pCell = findCell(pPage, pPage->nCell-1);
+ pStop = &pCell[9];
+ while( (*(pCell++)&0x80) && pCell<pStop );
+ pStop = &pCell[9];
+ while( ((*(pOut++) = *(pCell++))&0x80) && pCell<pStop );
+
+ /* Insert the new divider cell into pParent. */
+ insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace),
+ 0, pPage->pgno, &rc);
+
+ /* Set the right-child pointer of pParent to point to the new page. */
+ put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew);
+
+ /* Release the reference to the new page. */
+ releasePage(pNew);
}
- put4byte(findOverflowCell(pParent,parentIdx), pPage->pgno);
- put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew);
-#ifndef SQLITE_OMIT_AUTOVACUUM
- /* If this is an auto-vacuum database, update the pointer map
- ** with entries for the new page, and any pointer from the
- ** cell on the page to an overflow page.
- */
- if( pBt->autoVacuum ){
- rc = ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno);
- if( rc==SQLITE_OK ){
- rc = ptrmapPutOvfl(pNew, 0);
+ return rc;
+}
+#endif /* SQLITE_OMIT_QUICKBALANCE */
+
+#if 0
+/*
+** This function does not contribute anything to the operation of SQLite.
+** it is sometimes activated temporarily while debugging code responsible
+** for setting pointer-map entries.
+*/
+static int ptrmapCheckPages(MemPage **apPage, int nPage){
+ int i, j;
+ for(i=0; i<nPage; i++){
+ Pgno n;
+ u8 e;
+ MemPage *pPage = apPage[i];
+ BtShared *pBt = pPage->pBt;
+ assert( pPage->isInit );
+
+ for(j=0; j<pPage->nCell; j++){
+ CellInfo info;
+ u8 *z;
+
+ z = findCell(pPage, j);
+ btreeParseCellPtr(pPage, z, &info);
+ if( info.iOverflow ){
+ Pgno ovfl = get4byte(&z[info.iOverflow]);
+ ptrmapGet(pBt, ovfl, &e, &n);
+ assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 );
+ }
+ if( !pPage->leaf ){
+ Pgno child = get4byte(z);
+ ptrmapGet(pBt, child, &e, &n);
+ assert( n==pPage->pgno && e==PTRMAP_BTREE );
+ }
}
- if( rc!=SQLITE_OK ){
- releasePage(pNew);
- return rc;
+ if( !pPage->leaf ){
+ Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]);
+ ptrmapGet(pBt, child, &e, &n);
+ assert( n==pPage->pgno && e==PTRMAP_BTREE );
}
}
+ return 1;
+}
#endif
- /* Release the reference to the new page and balance the parent page,
- ** in case the divider cell inserted caused it to become overfull.
- */
- releasePage(pNew);
- return balance(pParent, 0);
+/*
+** This function is used to copy the contents of the b-tree node stored
+** on page pFrom to page pTo. If page pFrom was not a leaf page, then
+** the pointer-map entries for each child page are updated so that the
+** parent page stored in the pointer map is page pTo. If pFrom contained
+** any cells with overflow page pointers, then the corresponding pointer
+** map entries are also updated so that the parent page is page pTo.
+**
+** If pFrom is currently carrying any overflow cells (entries in the
+** MemPage.aOvfl[] array), they are not copied to pTo.
+**
+** Before returning, page pTo is reinitialized using btreeInitPage().
+**
+** The performance of this function is not critical. It is only used by
+** the balance_shallower() and balance_deeper() procedures, neither of
+** which are called often under normal circumstances.
+*/
+static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){
+ if( (*pRC)==SQLITE_OK ){
+ BtShared * const pBt = pFrom->pBt;
+ u8 * const aFrom = pFrom->aData;
+ u8 * const aTo = pTo->aData;
+ int const iFromHdr = pFrom->hdrOffset;
+ int const iToHdr = ((pTo->pgno==1) ? 100 : 0);
+ TESTONLY(int rc;)
+ int iData;
+
+
+ assert( pFrom->isInit );
+ assert( pFrom->nFree>=iToHdr );
+ assert( get2byte(&aFrom[iFromHdr+5])<=pBt->usableSize );
+
+ /* Copy the b-tree node content from page pFrom to page pTo. */
+ iData = get2byte(&aFrom[iFromHdr+5]);
+ memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData);
+ memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell);
+
+ /* Reinitialize page pTo so that the contents of the MemPage structure
+ ** match the new data. The initialization of pTo "cannot" fail, as the
+ ** data copied from pFrom is known to be valid. */
+ pTo->isInit = 0;
+ TESTONLY(rc = ) btreeInitPage(pTo);
+ assert( rc==SQLITE_OK );
+
+ /* If this is an auto-vacuum database, update the pointer-map entries
+ ** for any b-tree or overflow pages that pTo now contains the pointers to.
+ */
+ if( ISAUTOVACUUM ){
+ *pRC = setChildPtrmaps(pTo);
+ }
+ }
}
-#endif /* SQLITE_OMIT_QUICKBALANCE */
/*
-** This routine redistributes Cells on pPage and up to NN*2 siblings
-** of pPage so that all pages have about the same amount of free space.
-** Usually NN siblings on either side of pPage is used in the balancing,
-** though more siblings might come from one side if pPage is the first
-** or last child of its parent. If pPage has fewer than 2*NN siblings
-** (something which can only happen if pPage is the root page or a
-** child of root) then all available siblings participate in the balancing.
+** This routine redistributes cells on the iParentIdx'th child of pParent
+** (hereafter "the page") and up to 2 siblings so that all pages have about the
+** same amount of free space. Usually a single sibling on either side of the
+** page are used in the balancing, though both siblings might come from one
+** side if the page is the first or last child of its parent. If the page
+** has fewer than 2 siblings (something which can only happen if the page
+** is a root page or a child of a root page) then all available siblings
+** participate in the balancing.
**
-** The number of siblings of pPage might be increased or decreased by one or
-** two in an effort to keep pages nearly full but not over full. The root page
-** is special and is allowed to be nearly empty. If pPage is
-** the root page, then the depth of the tree might be increased
-** or decreased by one, as necessary, to keep the root page from being
-** overfull or completely empty.
+** The number of siblings of the page might be increased or decreased by
+** one or two in an effort to keep pages nearly full but not over full.
**
-** Note that when this routine is called, some of the Cells on pPage
-** might not actually be stored in pPage->aData[]. This can happen
-** if the page is overfull. Part of the job of this routine is to
-** make sure all Cells for pPage once again fit in pPage->aData[].
+** Note that when this routine is called, some of the cells on the page
+** might not actually be stored in MemPage.aData[]. This can happen
+** if the page is overfull. This routine ensures that all cells allocated
+** to the page and its siblings fit into MemPage.aData[] before returning.
**
-** In the course of balancing the siblings of pPage, the parent of pPage
-** might become overfull or underfull. If that happens, then this routine
-** is called recursively on the parent.
+** In the course of balancing the page and its siblings, cells may be
+** inserted into or removed from the parent page (pParent). Doing so
+** may cause the parent page to become overfull or underfull. If this
+** happens, it is the responsibility of the caller to invoke the correct
+** balancing routine to fix this problem (see the balance() routine).
**
** If this routine fails for any reason, it might leave the database
-** in a corrupted state. So if this routine fails, the database should
+** in a corrupted state. So if this routine fails, the database should
** be rolled back.
-*/
-static int balance_nonroot(MemPage *pPage){
- MemPage *pParent; /* The parent of pPage */
+**
+** The third argument to this function, aOvflSpace, is a pointer to a
+** buffer big enough to hold one page. If while inserting cells into the parent
+** page (pParent) the parent page becomes overfull, this buffer is
+** used to store the parent's overflow cells. Because this function inserts
+** a maximum of four divider cells into the parent page, and the maximum
+** size of a cell stored within an internal node is always less than 1/4
+** of the page-size, the aOvflSpace[] buffer is guaranteed to be large
+** enough for all overflow cells.
+**
+** If aOvflSpace is set to a null pointer, this function returns
+** SQLITE_NOMEM.
+*/
+static int balance_nonroot(
+ MemPage *pParent, /* Parent page of siblings being balanced */
+ int iParentIdx, /* Index of "the page" in pParent */
+ u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */
+ int isRoot /* True if pParent is a root-page */
+){
BtShared *pBt; /* The whole database */
int nCell = 0; /* Number of cells in apCell[] */
int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */
+ int nNew = 0; /* Number of pages in apNew[] */
int nOld; /* Number of pages in apOld[] */
- int nNew; /* Number of pages in apNew[] */
- int nDiv; /* Number of cells in apDiv[] */
int i, j, k; /* Loop counters */
- int idx; /* Index of pPage in pParent->aCell[] */
int nxDiv; /* Next divider slot in pParent->aCell[] */
- int rc; /* The return code */
- int leafCorrection; /* 4 if pPage is a leaf. 0 if not */
+ int rc = SQLITE_OK; /* The return code */
+ u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */
int leafData; /* True if pPage is a leaf of a LEAFDATA tree */
int usableSpace; /* Bytes in pPage beyond the header */
int pageFlags; /* Value of pPage->aData[0] */
int subtotal; /* Subtotal of bytes in cells on one page */
- int iSpace = 0; /* First unused byte of aSpace[] */
+ int iSpace1 = 0; /* First unused byte of aSpace1[] */
+ int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */
+ int szScratch; /* Size of scratch memory requested */
MemPage *apOld[NB]; /* pPage and up to two siblings */
- Pgno pgnoOld[NB]; /* Page numbers for each page in apOld[] */
MemPage *apCopy[NB]; /* Private copies of apOld[] pages */
MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */
- Pgno pgnoNew[NB+2]; /* Page numbers for each page in apNew[] */
- u8 *apDiv[NB]; /* Divider cells in pParent */
+ u8 *pRight; /* Location in parent of right-sibling pointer */
+ u8 *apDiv[NB-1]; /* Divider cells in pParent */
int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */
int szNew[NB+2]; /* Combined size of cells place on i-th page */
u8 **apCell = 0; /* All cells begin balanced */
u16 *szCell; /* Local size of all cells in apCell[] */
- u8 *aCopy[NB]; /* Space for holding data of apCopy[] */
- u8 *aSpace; /* Space to hold copies of dividers cells */
-#ifndef SQLITE_OMIT_AUTOVACUUM
- u8 *aFrom = 0;
-#endif
+ u8 *aSpace1; /* Space for copies of dividers cells */
+ Pgno pgno; /* Temp var to store a page number in */
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+ pBt = pParent->pBt;
+ assert( sqlite3_mutex_held(pBt->mutex) );
+ assert( sqlite3PagerIswriteable(pParent->pDbPage) );
- /*
- ** Find the parent page.
- */
- assert( pPage->isInit );
- assert( sqlite3PagerIswriteable(pPage->pDbPage) || pPage->nOverflow==1 );
- pBt = pPage->pBt;
- pParent = pPage->pParent;
- assert( pParent );
- if( SQLITE_OK!=(rc = sqlite3PagerWrite(pParent->pDbPage)) ){
- return rc;
- }
+#if 0
TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno));
-
-#ifndef SQLITE_OMIT_QUICKBALANCE
- /*
- ** A special case: If a new entry has just been inserted into a
- ** table (that is, a btree with integer keys and all data at the leaves)
- ** and the new entry is the right-most entry in the tree (it has the
- ** largest key) then use the special balance_quick() routine for
- ** balancing. balance_quick() is much faster and results in a tighter
- ** packing of data in the common case.
- */
- if( pPage->leaf &&
- pPage->intKey &&
- pPage->leafData &&
- pPage->nOverflow==1 &&
- pPage->aOvfl[0].idx==pPage->nCell &&
- pPage->pParent->pgno!=1 &&
- get4byte(&pParent->aData[pParent->hdrOffset+8])==pPage->pgno
- ){
- /*
- ** TODO: Check the siblings to the left of pPage. It may be that
- ** they are not full and no new page is required.
- */
- return balance_quick(pPage, pParent);
- }
#endif
- if( SQLITE_OK!=(rc = sqlite3PagerWrite(pPage->pDbPage)) ){
- return rc;
+ /* At this point pParent may have at most one overflow cell. And if
+ ** this overflow cell is present, it must be the cell with
+ ** index iParentIdx. This scenario comes about when this function
+ ** is called (indirectly) from sqlite3BtreeDelete().
+ */
+ assert( pParent->nOverflow==0 || pParent->nOverflow==1 );
+ assert( pParent->nOverflow==0 || pParent->aOvfl[0].idx==iParentIdx );
+
+ if( !aOvflSpace ){
+ return SQLITE_NOMEM;
}
- /*
- ** Find the cell in the parent page whose left child points back
- ** to pPage. The "idx" variable is the index of that cell. If pPage
- ** is the rightmost child of pParent then set idx to pParent->nCell
+ /* Find the sibling pages to balance. Also locate the cells in pParent
+ ** that divide the siblings. An attempt is made to find NN siblings on
+ ** either side of pPage. More siblings are taken from one side, however,
+ ** if there are fewer than NN siblings on the other side. If pParent
+ ** has NB or fewer children then all children of pParent are taken.
+ **
+ ** This loop also drops the divider cells from the parent page. This
+ ** way, the remainder of the function does not have to deal with any
+ ** overflow cells in the parent page, since if any existed they will
+ ** have already been removed.
*/
- if( pParent->idxShift ){
- Pgno pgno;
- pgno = pPage->pgno;
- assert( pgno==sqlite3PagerPagenumber(pPage->pDbPage) );
- for(idx=0; idx<pParent->nCell; idx++){
- if( get4byte(findCell(pParent, idx))==pgno ){
- break;
- }
+ i = pParent->nOverflow + pParent->nCell;
+ if( i<2 ){
+ nxDiv = 0;
+ nOld = i+1;
+ }else{
+ nOld = 3;
+ if( iParentIdx==0 ){
+ nxDiv = 0;
+ }else if( iParentIdx==i ){
+ nxDiv = i-2;
+ }else{
+ nxDiv = iParentIdx-1;
}
- assert( idx<pParent->nCell
- || get4byte(&pParent->aData[pParent->hdrOffset+8])==pgno );
+ i = 2;
+ }
+ if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){
+ pRight = &pParent->aData[pParent->hdrOffset+8];
}else{
- idx = pPage->idxParent;
+ pRight = findCell(pParent, i+nxDiv-pParent->nOverflow);
}
+ pgno = get4byte(pRight);
+ while( 1 ){
+ rc = getAndInitPage(pBt, pgno, &apOld[i]);
+ if( rc ){
+ memset(apOld, 0, (i+1)*sizeof(MemPage*));
+ goto balance_cleanup;
+ }
+ nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow;
+ if( (i--)==0 ) break;
- /*
- ** Initialize variables so that it will be safe to jump
- ** directly to balance_cleanup at any moment.
- */
- nOld = nNew = 0;
- sqlite3PagerRef(pParent->pDbPage);
-
- /*
- ** Find sibling pages to pPage and the cells in pParent that divide
- ** the siblings. An attempt is made to find NN siblings on either
- ** side of pPage. More siblings are taken from one side, however, if
- ** pPage there are fewer than NN siblings on the other side. If pParent
- ** has NB or fewer children then all children of pParent are taken.
- */
- nxDiv = idx - NN;
- if( nxDiv + NB > pParent->nCell ){
- nxDiv = pParent->nCell - NB + 1;
- }
- if( nxDiv<0 ){
- nxDiv = 0;
- }
- nDiv = 0;
- for(i=0, k=nxDiv; i<NB; i++, k++){
- if( k<pParent->nCell ){
- apDiv[i] = findCell(pParent, k);
- nDiv++;
- assert( !pParent->leaf );
- pgnoOld[i] = get4byte(apDiv[i]);
- }else if( k==pParent->nCell ){
- pgnoOld[i] = get4byte(&pParent->aData[pParent->hdrOffset+8]);
+ if( i+nxDiv==pParent->aOvfl[0].idx && pParent->nOverflow ){
+ apDiv[i] = pParent->aOvfl[0].pCell;
+ pgno = get4byte(apDiv[i]);
+ szNew[i] = cellSizePtr(pParent, apDiv[i]);
+ pParent->nOverflow = 0;
}else{
- break;
+ apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow);
+ pgno = get4byte(apDiv[i]);
+ szNew[i] = cellSizePtr(pParent, apDiv[i]);
+
+ /* Drop the cell from the parent page. apDiv[i] still points to
+ ** the cell within the parent, even though it has been dropped.
+ ** This is safe because dropping a cell only overwrites the first
+ ** four bytes of it, and this function does not need the first
+ ** four bytes of the divider cell. So the pointer is safe to use
+ ** later on.
+ **
+ ** Unless SQLite is compiled in secure-delete mode. In this case,
+ ** the dropCell() routine will overwrite the entire cell with zeroes.
+ ** In this case, temporarily copy the cell into the aOvflSpace[]
+ ** buffer. It will be copied out again as soon as the aSpace[] buffer
+ ** is allocated. */
+#ifdef SQLITE_SECURE_DELETE
+ memcpy(&aOvflSpace[apDiv[i]-pParent->aData], apDiv[i], szNew[i]);
+ apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData];
+#endif
+ dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc);
}
- rc = getAndInitPage(pBt, pgnoOld[i], &apOld[i], pParent);
- if( rc ) goto balance_cleanup;
- apOld[i]->idxParent = k;
- apCopy[i] = 0;
- assert( i==nOld );
- nOld++;
- nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow;
}
/* Make nMaxCells a multiple of 4 in order to preserve 8-byte
@@ -34949,54 +43396,30 @@ static int balance_nonroot(MemPage *pPage){
/*
** Allocate space for memory structures
*/
- apCell = sqlite3_malloc(
+ k = pBt->pageSize + ROUND8(sizeof(MemPage));
+ szScratch =
nMaxCells*sizeof(u8*) /* apCell */
+ nMaxCells*sizeof(u16) /* szCell */
- + (ROUND8(sizeof(MemPage))+pBt->pageSize)*NB /* aCopy */
- + pBt->pageSize*5 /* aSpace */
- + (ISAUTOVACUUM ? nMaxCells : 0) /* aFrom */
- );
+ + pBt->pageSize /* aSpace1 */
+ + k*nOld; /* Page copies (apCopy) */
+ apCell = sqlite3ScratchMalloc( szScratch );
if( apCell==0 ){
rc = SQLITE_NOMEM;
goto balance_cleanup;
}
szCell = (u16*)&apCell[nMaxCells];
- aCopy[0] = (u8*)&szCell[nMaxCells];
- assert( ((aCopy[0] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */
- for(i=1; i<NB; i++){
- aCopy[i] = &aCopy[i-1][pBt->pageSize+ROUND8(sizeof(MemPage))];
- assert( ((aCopy[i] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */
- }
- aSpace = &aCopy[NB-1][pBt->pageSize+ROUND8(sizeof(MemPage))];
- assert( ((aSpace - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- aFrom = &aSpace[5*pBt->pageSize];
- }
-#endif
-
- /*
- ** Make copies of the content of pPage and its siblings into aOld[].
- ** The rest of this function will use data from the copies rather
- ** that the original pages since the original pages will be in the
- ** process of being overwritten.
- */
- for(i=0; i<nOld; i++){
- MemPage *p = apCopy[i] = (MemPage*)aCopy[i];
- memcpy(p, apOld[i], sizeof(MemPage));
- p->aData = (void*)&p[1];
- memcpy(p->aData, apOld[i]->aData, pBt->pageSize);
- }
+ aSpace1 = (u8*)&szCell[nMaxCells];
+ assert( EIGHT_BYTE_ALIGNMENT(aSpace1) );
/*
** Load pointers to all cells on sibling pages and the divider cells
** into the local apCell[] array. Make copies of the divider cells
- ** into space obtained form aSpace[] and remove the the divider Cells
+ ** into space obtained from aSpace1[] and remove the the divider Cells
** from pParent.
**
** If the siblings are on leaf pages, then the child pointers of the
** divider cells are stripped from the cells before they are copied
- ** into aSpace[]. In this way, all cells in apCell[] are without
+ ** into aSpace1[]. In this way, all cells in apCell[] are without
** child pointers. If siblings are not leaves, then all cell in
** apCell[] include child pointers. Either way, all cells in apCell[]
** are alike.
@@ -35004,70 +43427,54 @@ static int balance_nonroot(MemPage *pPage){
** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf.
** leafData: 1 if pPage holds key+data and pParent holds only keys.
*/
- nCell = 0;
- leafCorrection = pPage->leaf*4;
- leafData = pPage->leafData && pPage->leaf;
+ leafCorrection = apOld[0]->leaf*4;
+ leafData = apOld[0]->hasData;
for(i=0; i<nOld; i++){
- MemPage *pOld = apCopy[i];
- int limit = pOld->nCell+pOld->nOverflow;
+ int limit;
+
+ /* Before doing anything else, take a copy of the i'th original sibling
+ ** The rest of this function will use data from the copies rather
+ ** that the original pages since the original pages will be in the
+ ** process of being overwritten. */
+ MemPage *pOld = apCopy[i] = (MemPage*)&aSpace1[pBt->pageSize + k*i];
+ memcpy(pOld, apOld[i], sizeof(MemPage));
+ pOld->aData = (void*)&pOld[1];
+ memcpy(pOld->aData, apOld[i]->aData, pBt->pageSize);
+
+ limit = pOld->nCell+pOld->nOverflow;
for(j=0; j<limit; j++){
assert( nCell<nMaxCells );
apCell[nCell] = findOverflowCell(pOld, j);
szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- int a;
- aFrom[nCell] = i;
- for(a=0; a<pOld->nOverflow; a++){
- if( pOld->aOvfl[a].pCell==apCell[nCell] ){
- aFrom[nCell] = 0xFF;
- break;
- }
- }
- }
-#endif
nCell++;
}
- if( i<nOld-1 ){
- u16 sz = cellSizePtr(pParent, apDiv[i]);
- if( leafData ){
- /* With the LEAFDATA flag, pParent cells hold only INTKEYs that
- ** are duplicates of keys on the child pages. We need to remove
- ** the divider cells from pParent, but the dividers cells are not
- ** added to apCell[] because they are duplicates of child cells.
- */
- dropCell(pParent, nxDiv, sz);
+ if( i<nOld-1 && !leafData){
+ u16 sz = (u16)szNew[i];
+ u8 *pTemp;
+ assert( nCell<nMaxCells );
+ szCell[nCell] = sz;
+ pTemp = &aSpace1[iSpace1];
+ iSpace1 += sz;
+ assert( sz<=pBt->pageSize/4 );
+ assert( iSpace1<=pBt->pageSize );
+ memcpy(pTemp, apDiv[i], sz);
+ apCell[nCell] = pTemp+leafCorrection;
+ assert( leafCorrection==0 || leafCorrection==4 );
+ szCell[nCell] = szCell[nCell] - leafCorrection;
+ if( !pOld->leaf ){
+ assert( leafCorrection==0 );
+ assert( pOld->hdrOffset==0 );
+ /* The right pointer of the child page pOld becomes the left
+ ** pointer of the divider cell */
+ memcpy(apCell[nCell], &pOld->aData[8], 4);
}else{
- u8 *pTemp;
- assert( nCell<nMaxCells );
- szCell[nCell] = sz;
- pTemp = &aSpace[iSpace];
- iSpace += sz;
- assert( iSpace<=pBt->pageSize*5 );
- memcpy(pTemp, apDiv[i], sz);
- apCell[nCell] = pTemp+leafCorrection;
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- aFrom[nCell] = 0xFF;
- }
-#endif
- dropCell(pParent, nxDiv, sz);
- szCell[nCell] -= leafCorrection;
- assert( get4byte(pTemp)==pgnoOld[i] );
- if( !pOld->leaf ){
- assert( leafCorrection==0 );
- /* The right pointer of the child page pOld becomes the left
- ** pointer of the divider cell */
- memcpy(apCell[nCell], &pOld->aData[pOld->hdrOffset+8], 4);
- }else{
- assert( leafCorrection==4 );
- if( szCell[nCell]<4 ){
- /* Do not allow any cells smaller than 4 bytes. */
- szCell[nCell] = 4;
- }
+ assert( leafCorrection==4 );
+ if( szCell[nCell]<4 ){
+ /* Do not allow any cells smaller than 4 bytes. */
+ szCell[nCell] = 4;
}
- nCell++;
}
+ nCell++;
}
}
@@ -35097,6 +43504,7 @@ static int balance_nonroot(MemPage *pPage){
if( leafData ){ i--; }
subtotal = 0;
k++;
+ if( k>NB+1 ){ rc = SQLITE_CORRUPT; goto balance_cleanup; }
}
}
szNew[k] = subtotal;
@@ -35134,40 +43542,55 @@ static int balance_nonroot(MemPage *pPage){
szNew[i-1] = szLeft;
}
- /* Either we found one or more cells (cntnew[0])>0) or we are the
+ /* Either we found one or more cells (cntnew[0])>0) or pPage is
** a virtual root page. A virtual root page is when the real root
** page is page 1 and we are the only child of that page.
*/
assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) );
+ TRACE(("BALANCE: old: %d %d %d ",
+ apOld[0]->pgno,
+ nOld>=2 ? apOld[1]->pgno : 0,
+ nOld>=3 ? apOld[2]->pgno : 0
+ ));
+
/*
** Allocate k new pages. Reuse old pages where possible.
*/
- assert( pPage->pgno>1 );
- pageFlags = pPage->aData[0];
+ if( apOld[0]->pgno<=1 ){
+ rc = SQLITE_CORRUPT;
+ goto balance_cleanup;
+ }
+ pageFlags = apOld[0]->aData[0];
for(i=0; i<k; i++){
MemPage *pNew;
if( i<nOld ){
pNew = apNew[i] = apOld[i];
- pgnoNew[i] = pgnoOld[i];
apOld[i] = 0;
rc = sqlite3PagerWrite(pNew->pDbPage);
nNew++;
if( rc ) goto balance_cleanup;
}else{
assert( i>0 );
- rc = allocateBtreePage(pBt, &pNew, &pgnoNew[i], pgnoNew[i-1], 0);
+ rc = allocateBtreePage(pBt, &pNew, &pgno, pgno, 0);
if( rc ) goto balance_cleanup;
apNew[i] = pNew;
nNew++;
+
+ /* Set the pointer-map entry for the new sibling page. */
+ if( ISAUTOVACUUM ){
+ ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc);
+ if( rc!=SQLITE_OK ){
+ goto balance_cleanup;
+ }
+ }
}
- zeroPage(pNew, pageFlags);
}
/* Free any old pages that were not reused as new pages.
*/
while( i<nOld ){
- rc = freePage(apOld[i]);
+ freePage(apOld[i], &rc);
if( rc ) goto balance_cleanup;
releasePage(apOld[i]);
apOld[i] = 0;
@@ -35189,34 +43612,32 @@ static int balance_nonroot(MemPage *pPage){
** about 25% faster for large insertions and deletions.
*/
for(i=0; i<k-1; i++){
- int minV = pgnoNew[i];
+ int minV = apNew[i]->pgno;
int minI = i;
for(j=i+1; j<k; j++){
- if( pgnoNew[j]<(unsigned)minV ){
+ if( apNew[j]->pgno<(unsigned)minV ){
minI = j;
- minV = pgnoNew[j];
+ minV = apNew[j]->pgno;
}
}
if( minI>i ){
int t;
MemPage *pT;
- t = pgnoNew[i];
+ t = apNew[i]->pgno;
pT = apNew[i];
- pgnoNew[i] = pgnoNew[minI];
apNew[i] = apNew[minI];
- pgnoNew[minI] = t;
apNew[minI] = pT;
}
}
- TRACE(("BALANCE: old: %d %d %d new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n",
- pgnoOld[0],
- nOld>=2 ? pgnoOld[1] : 0,
- nOld>=3 ? pgnoOld[2] : 0,
- pgnoNew[0], szNew[0],
- nNew>=2 ? pgnoNew[1] : 0, nNew>=2 ? szNew[1] : 0,
- nNew>=3 ? pgnoNew[2] : 0, nNew>=3 ? szNew[2] : 0,
- nNew>=4 ? pgnoNew[3] : 0, nNew>=4 ? szNew[3] : 0,
- nNew>=5 ? pgnoNew[4] : 0, nNew>=5 ? szNew[4] : 0));
+ TRACE(("new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n",
+ apNew[0]->pgno, szNew[0],
+ nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0,
+ nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0,
+ nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0,
+ nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0));
+
+ assert( sqlite3PagerIswriteable(pParent->pDbPage) );
+ put4byte(pRight, apNew[nNew-1]->pgno);
/*
** Evenly distribute the data in apCell[] across the new pages.
@@ -35227,36 +43648,18 @@ static int balance_nonroot(MemPage *pPage){
/* Assemble the new sibling page. */
MemPage *pNew = apNew[i];
assert( j<nMaxCells );
- assert( pNew->pgno==pgnoNew[i] );
+ zeroPage(pNew, pageFlags);
assemblePage(pNew, cntNew[i]-j, &apCell[j], &szCell[j]);
assert( pNew->nCell>0 || (nNew==1 && cntNew[0]==0) );
assert( pNew->nOverflow==0 );
-#ifndef SQLITE_OMIT_AUTOVACUUM
- /* If this is an auto-vacuum database, update the pointer map entries
- ** that point to the siblings that were rearranged. These can be: left
- ** children of cells, the right-child of the page, or overflow pages
- ** pointed to by cells.
- */
- if( pBt->autoVacuum ){
- for(k=j; k<cntNew[i]; k++){
- assert( k<nMaxCells );
- if( aFrom[k]==0xFF || apCopy[aFrom[k]]->pgno!=pNew->pgno ){
- rc = ptrmapPutOvfl(pNew, k-j);
- if( rc!=SQLITE_OK ){
- goto balance_cleanup;
- }
- }
- }
- }
-#endif
-
j = cntNew[i];
/* If the sibling page assembled above was not the right-most sibling,
** insert a divider cell into the parent page.
*/
- if( i<nNew-1 && j<nCell ){
+ assert( i<nNew-1 || j==nCell );
+ if( j<nCell ){
u8 *pCell;
u8 *pTemp;
int sz;
@@ -35264,9 +43667,9 @@ static int balance_nonroot(MemPage *pPage){
assert( j<nMaxCells );
pCell = apCell[j];
sz = szCell[j] + leafCorrection;
+ pTemp = &aOvflSpace[iOvflSpace];
if( !pNew->leaf ){
memcpy(&pNew->aData[8], pCell, 4);
- pTemp = 0;
}else if( leafData ){
/* If the tree is a leaf-data tree, and the siblings are leaves,
** then there is no divider cell in apCell[]. Instead, the divider
@@ -35275,21 +43678,16 @@ static int balance_nonroot(MemPage *pPage){
*/
CellInfo info;
j--;
- sqlite3BtreeParseCellPtr(pNew, apCell[j], &info);
- pCell = &aSpace[iSpace];
- fillInCell(pParent, pCell, 0, info.nKey, 0, 0, 0, &sz);
- iSpace += sz;
- assert( iSpace<=pBt->pageSize*5 );
+ btreeParseCellPtr(pNew, apCell[j], &info);
+ pCell = pTemp;
+ sz = 4 + putVarint(&pCell[4], info.nKey);
pTemp = 0;
}else{
pCell -= 4;
- pTemp = &aSpace[iSpace];
- iSpace += sz;
- assert( iSpace<=pBt->pageSize*5 );
/* Obscure case for non-leaf-data trees: If the cell at pCell was
** previously stored on a leaf node, and its reported size was 4
** bytes, then it may actually be smaller than this
- ** (see sqlite3BtreeParseCellPtr(), 4 bytes is the minimum size of
+ ** (see btreeParseCellPtr(), 4 bytes is the minimum size of
** any cell). But it is important to pass the correct size to
** insertCell(), so reparse the cell now.
**
@@ -35302,21 +43700,13 @@ static int balance_nonroot(MemPage *pPage){
sz = cellSizePtr(pParent, pCell);
}
}
- rc = insertCell(pParent, nxDiv, pCell, sz, pTemp, 4);
+ iOvflSpace += sz;
+ assert( sz<=pBt->pageSize/4 );
+ assert( iOvflSpace<=pBt->pageSize );
+ insertCell(pParent, nxDiv, pCell, sz, pTemp, pNew->pgno, &rc);
if( rc!=SQLITE_OK ) goto balance_cleanup;
- put4byte(findOverflowCell(pParent,nxDiv), pNew->pgno);
-#ifndef SQLITE_OMIT_AUTOVACUUM
- /* If this is an auto-vacuum database, and not a leaf-data tree,
- ** then update the pointer map with an entry for the overflow page
- ** that the cell just inserted points to (if any).
- */
- if( pBt->autoVacuum && !leafData ){
- rc = ptrmapPutOvfl(pParent, nxDiv);
- if( rc!=SQLITE_OK ){
- goto balance_cleanup;
- }
- }
-#endif
+ assert( sqlite3PagerIswriteable(pParent->pDbPage) );
+
j++;
nxDiv++;
}
@@ -35325,288 +43715,342 @@ static int balance_nonroot(MemPage *pPage){
assert( nOld>0 );
assert( nNew>0 );
if( (pageFlags & PTF_LEAF)==0 ){
- memcpy(&apNew[nNew-1]->aData[8], &apCopy[nOld-1]->aData[8], 4);
- }
- if( nxDiv==pParent->nCell+pParent->nOverflow ){
- /* Right-most sibling is the right-most child of pParent */
- put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew[nNew-1]);
- }else{
- /* Right-most sibling is the left child of the first entry in pParent
- ** past the right-most divider entry */
- put4byte(findOverflowCell(pParent, nxDiv), pgnoNew[nNew-1]);
+ u8 *zChild = &apCopy[nOld-1]->aData[8];
+ memcpy(&apNew[nNew-1]->aData[8], zChild, 4);
}
- /*
- ** Reparent children of all cells.
- */
- for(i=0; i<nNew; i++){
- rc = reparentChildPages(apNew[i]);
- if( rc!=SQLITE_OK ) goto balance_cleanup;
+ if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){
+ /* The root page of the b-tree now contains no cells. The only sibling
+ ** page is the right-child of the parent. Copy the contents of the
+ ** child page into the parent, decreasing the overall height of the
+ ** b-tree structure by one. This is described as the "balance-shallower"
+ ** sub-algorithm in some documentation.
+ **
+ ** If this is an auto-vacuum database, the call to copyNodeContent()
+ ** sets all pointer-map entries corresponding to database image pages
+ ** for which the pointer is stored within the content being copied.
+ **
+ ** The second assert below verifies that the child page is defragmented
+ ** (it must be, as it was just reconstructed using assemblePage()). This
+ ** is important if the parent page happens to be page 1 of the database
+ ** image. */
+ assert( nNew==1 );
+ assert( apNew[0]->nFree ==
+ (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2)
+ );
+ copyNodeContent(apNew[0], pParent, &rc);
+ freePage(apNew[0], &rc);
+ }else if( ISAUTOVACUUM ){
+ /* Fix the pointer-map entries for all the cells that were shifted around.
+ ** There are several different types of pointer-map entries that need to
+ ** be dealt with by this routine. Some of these have been set already, but
+ ** many have not. The following is a summary:
+ **
+ ** 1) The entries associated with new sibling pages that were not
+ ** siblings when this function was called. These have already
+ ** been set. We don't need to worry about old siblings that were
+ ** moved to the free-list - the freePage() code has taken care
+ ** of those.
+ **
+ ** 2) The pointer-map entries associated with the first overflow
+ ** page in any overflow chains used by new divider cells. These
+ ** have also already been taken care of by the insertCell() code.
+ **
+ ** 3) If the sibling pages are not leaves, then the child pages of
+ ** cells stored on the sibling pages may need to be updated.
+ **
+ ** 4) If the sibling pages are not internal intkey nodes, then any
+ ** overflow pages used by these cells may need to be updated
+ ** (internal intkey nodes never contain pointers to overflow pages).
+ **
+ ** 5) If the sibling pages are not leaves, then the pointer-map
+ ** entries for the right-child pages of each sibling may need
+ ** to be updated.
+ **
+ ** Cases 1 and 2 are dealt with above by other code. The next
+ ** block deals with cases 3 and 4 and the one after that, case 5. Since
+ ** setting a pointer map entry is a relatively expensive operation, this
+ ** code only sets pointer map entries for child or overflow pages that have
+ ** actually moved between pages. */
+ MemPage *pNew = apNew[0];
+ MemPage *pOld = apCopy[0];
+ int nOverflow = pOld->nOverflow;
+ int iNextOld = pOld->nCell + nOverflow;
+ int iOverflow = (nOverflow ? pOld->aOvfl[0].idx : -1);
+ j = 0; /* Current 'old' sibling page */
+ k = 0; /* Current 'new' sibling page */
+ for(i=0; i<nCell; i++){
+ int isDivider = 0;
+ while( i==iNextOld ){
+ /* Cell i is the cell immediately following the last cell on old
+ ** sibling page j. If the siblings are not leaf pages of an
+ ** intkey b-tree, then cell i was a divider cell. */
+ pOld = apCopy[++j];
+ iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
+ if( pOld->nOverflow ){
+ nOverflow = pOld->nOverflow;
+ iOverflow = i + !leafData + pOld->aOvfl[0].idx;
+ }
+ isDivider = !leafData;
+ }
+
+ assert(nOverflow>0 || iOverflow<i );
+ assert(nOverflow<2 || pOld->aOvfl[0].idx==pOld->aOvfl[1].idx-1);
+ assert(nOverflow<3 || pOld->aOvfl[1].idx==pOld->aOvfl[2].idx-1);
+ if( i==iOverflow ){
+ isDivider = 1;
+ if( (--nOverflow)>0 ){
+ iOverflow++;
+ }
+ }
+
+ if( i==cntNew[k] ){
+ /* Cell i is the cell immediately following the last cell on new
+ ** sibling page k. If the siblings are not leaf pages of an
+ ** intkey b-tree, then cell i is a divider cell. */
+ pNew = apNew[++k];
+ if( !leafData ) continue;
+ }
+ assert( j<nOld );
+ assert( k<nNew );
+
+ /* If the cell was originally divider cell (and is not now) or
+ ** an overflow cell, or if the cell was located on a different sibling
+ ** page before the balancing, then the pointer map entries associated
+ ** with any child or overflow pages need to be updated. */
+ if( isDivider || pOld->pgno!=pNew->pgno ){
+ if( !leafCorrection ){
+ ptrmapPut(pBt, get4byte(apCell[i]), PTRMAP_BTREE, pNew->pgno, &rc);
+ }
+ if( szCell[i]>pNew->minLocal ){
+ ptrmapPutOvflPtr(pNew, apCell[i], &rc);
+ }
+ }
+ }
+
+ if( !leafCorrection ){
+ for(i=0; i<nNew; i++){
+ u32 key = get4byte(&apNew[i]->aData[8]);
+ ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc);
+ }
+ }
+
+#if 0
+ /* The ptrmapCheckPages() contains assert() statements that verify that
+ ** all pointer map pages are set correctly. This is helpful while
+ ** debugging. This is usually disabled because a corrupt database may
+ ** cause an assert() statement to fail. */
+ ptrmapCheckPages(apNew, nNew);
+ ptrmapCheckPages(&pParent, 1);
+#endif
}
- rc = reparentChildPages(pParent);
- if( rc!=SQLITE_OK ) goto balance_cleanup;
- /*
- ** Balance the parent page. Note that the current page (pPage) might
- ** have been added to the freelist so it might no longer be initialized.
- ** But the parent page will always be initialized.
- */
assert( pParent->isInit );
- rc = balance(pParent, 0);
-
+ TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n",
+ nOld, nNew, nCell));
+
/*
** Cleanup before returning.
*/
balance_cleanup:
- sqlite3_free(apCell);
+ sqlite3ScratchFree(apCell);
for(i=0; i<nOld; i++){
releasePage(apOld[i]);
}
for(i=0; i<nNew; i++){
releasePage(apNew[i]);
}
- releasePage(pParent);
- TRACE(("BALANCE: finished with %d: old=%d new=%d cells=%d\n",
- pPage->pgno, nOld, nNew, nCell));
- return rc;
-}
-
-/*
-** This routine is called for the root page of a btree when the root
-** page contains no cells. This is an opportunity to make the tree
-** shallower by one level.
-*/
-static int balance_shallower(MemPage *pPage){
- MemPage *pChild; /* The only child page of pPage */
- Pgno pgnoChild; /* Page number for pChild */
- int rc = SQLITE_OK; /* Return code from subprocedures */
- BtShared *pBt; /* The main BTree structure */
- int mxCellPerPage; /* Maximum number of cells per page */
- u8 **apCell; /* All cells from pages being balanced */
- u16 *szCell; /* Local size of all cells */
- assert( pPage->pParent==0 );
- assert( pPage->nCell==0 );
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- pBt = pPage->pBt;
- mxCellPerPage = MX_CELL(pBt);
- apCell = sqlite3_malloc( mxCellPerPage*(sizeof(u8*)+sizeof(u16)) );
- if( apCell==0 ) return SQLITE_NOMEM;
- szCell = (u16*)&apCell[mxCellPerPage];
- if( pPage->leaf ){
- /* The table is completely empty */
- TRACE(("BALANCE: empty table %d\n", pPage->pgno));
- }else{
- /* The root page is empty but has one child. Transfer the
- ** information from that one child into the root page if it
- ** will fit. This reduces the depth of the tree by one.
- **
- ** If the root page is page 1, it has less space available than
- ** its child (due to the 100 byte header that occurs at the beginning
- ** of the database fle), so it might not be able to hold all of the
- ** information currently contained in the child. If this is the
- ** case, then do not do the transfer. Leave page 1 empty except
- ** for the right-pointer to the child page. The child page becomes
- ** the virtual root of the tree.
- */
- pgnoChild = get4byte(&pPage->aData[pPage->hdrOffset+8]);
- assert( pgnoChild>0 );
- assert( pgnoChild<=sqlite3PagerPagecount(pPage->pBt->pPager) );
- rc = sqlite3BtreeGetPage(pPage->pBt, pgnoChild, &pChild, 0);
- if( rc ) goto end_shallow_balance;
- if( pPage->pgno==1 ){
- rc = sqlite3BtreeInitPage(pChild, pPage);
- if( rc ) goto end_shallow_balance;
- assert( pChild->nOverflow==0 );
- if( pChild->nFree>=100 ){
- /* The child information will fit on the root page, so do the
- ** copy */
- int i;
- zeroPage(pPage, pChild->aData[0]);
- for(i=0; i<pChild->nCell; i++){
- apCell[i] = findCell(pChild,i);
- szCell[i] = cellSizePtr(pChild, apCell[i]);
- }
- assemblePage(pPage, pChild->nCell, apCell, szCell);
- /* Copy the right-pointer of the child to the parent. */
- put4byte(&pPage->aData[pPage->hdrOffset+8],
- get4byte(&pChild->aData[pChild->hdrOffset+8]));
- freePage(pChild);
- TRACE(("BALANCE: child %d transfer to page 1\n", pChild->pgno));
- }else{
- /* The child has more information that will fit on the root.
- ** The tree is already balanced. Do nothing. */
- TRACE(("BALANCE: child %d will not fit on page 1\n", pChild->pgno));
- }
- }else{
- memcpy(pPage->aData, pChild->aData, pPage->pBt->usableSize);
- pPage->isInit = 0;
- pPage->pParent = 0;
- rc = sqlite3BtreeInitPage(pPage, 0);
- assert( rc==SQLITE_OK );
- freePage(pChild);
- TRACE(("BALANCE: transfer child %d into root %d\n",
- pChild->pgno, pPage->pgno));
- }
- rc = reparentChildPages(pPage);
- assert( pPage->nOverflow==0 );
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- int i;
- for(i=0; i<pPage->nCell; i++){
- rc = ptrmapPutOvfl(pPage, i);
- if( rc!=SQLITE_OK ){
- goto end_shallow_balance;
- }
- }
- }
-#endif
- releasePage(pChild);
- }
-end_shallow_balance:
- sqlite3_free(apCell);
return rc;
}
/*
-** The root page is overfull
+** This function is called when the root page of a b-tree structure is
+** overfull (has one or more overflow pages).
**
-** When this happens, Create a new child page and copy the
-** contents of the root into the child. Then make the root
-** page an empty page with rightChild pointing to the new
-** child. Finally, call balance_internal() on the new child
-** to cause it to split.
+** A new child page is allocated and the contents of the current root
+** page, including overflow cells, are copied into the child. The root
+** page is then overwritten to make it an empty page with the right-child
+** pointer pointing to the new page.
+**
+** Before returning, all pointer-map entries corresponding to pages
+** that the new child-page now contains pointers to are updated. The
+** entry corresponding to the new right-child pointer of the root
+** page is also updated.
+**
+** If successful, *ppChild is set to contain a reference to the child
+** page and SQLITE_OK is returned. In this case the caller is required
+** to call releasePage() on *ppChild exactly once. If an error occurs,
+** an error code is returned and *ppChild is set to 0.
*/
-static int balance_deeper(MemPage *pPage){
- int rc; /* Return value from subprocedures */
- MemPage *pChild; /* Pointer to a new child page */
- Pgno pgnoChild; /* Page number of the new child page */
- BtShared *pBt; /* The BTree */
- int usableSize; /* Total usable size of a page */
- u8 *data; /* Content of the parent page */
- u8 *cdata; /* Content of the child page */
- int hdr; /* Offset to page header in parent */
- int brk; /* Offset to content of first cell in parent */
+static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
+ int rc; /* Return value from subprocedures */
+ MemPage *pChild = 0; /* Pointer to a new child page */
+ Pgno pgnoChild = 0; /* Page number of the new child page */
+ BtShared *pBt = pRoot->pBt; /* The BTree */
- assert( pPage->pParent==0 );
- assert( pPage->nOverflow>0 );
- pBt = pPage->pBt;
+ assert( pRoot->nOverflow>0 );
assert( sqlite3_mutex_held(pBt->mutex) );
- rc = allocateBtreePage(pBt, &pChild, &pgnoChild, pPage->pgno, 0);
- if( rc ) return rc;
- assert( sqlite3PagerIswriteable(pChild->pDbPage) );
- usableSize = pBt->usableSize;
- data = pPage->aData;
- hdr = pPage->hdrOffset;
- brk = get2byte(&data[hdr+5]);
- cdata = pChild->aData;
- memcpy(cdata, &data[hdr], pPage->cellOffset+2*pPage->nCell-hdr);
- memcpy(&cdata[brk], &data[brk], usableSize-brk);
- assert( pChild->isInit==0 );
- rc = sqlite3BtreeInitPage(pChild, pPage);
- if( rc ) goto balancedeeper_out;
- memcpy(pChild->aOvfl, pPage->aOvfl, pPage->nOverflow*sizeof(pPage->aOvfl[0]));
- pChild->nOverflow = pPage->nOverflow;
- if( pChild->nOverflow ){
- pChild->nFree = 0;
- }
- assert( pChild->nCell==pPage->nCell );
- zeroPage(pPage, pChild->aData[0] & ~PTF_LEAF);
- put4byte(&pPage->aData[pPage->hdrOffset+8], pgnoChild);
- TRACE(("BALANCE: copy root %d into %d\n", pPage->pgno, pChild->pgno));
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->autoVacuum ){
- int i;
- rc = ptrmapPut(pBt, pChild->pgno, PTRMAP_BTREE, pPage->pgno);
- if( rc ) goto balancedeeper_out;
- for(i=0; i<pChild->nCell; i++){
- rc = ptrmapPutOvfl(pChild, i);
- if( rc!=SQLITE_OK ){
- return rc;
- }
+
+ /* Make pRoot, the root page of the b-tree, writable. Allocate a new
+ ** page that will become the new right-child of pPage. Copy the contents
+ ** of the node stored on pRoot into the new child page.
+ */
+ rc = sqlite3PagerWrite(pRoot->pDbPage);
+ if( rc==SQLITE_OK ){
+ rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0);
+ copyNodeContent(pRoot, pChild, &rc);
+ if( ISAUTOVACUUM ){
+ ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc);
}
}
-#endif
- rc = balance_nonroot(pChild);
+ if( rc ){
+ *ppChild = 0;
+ releasePage(pChild);
+ return rc;
+ }
+ assert( sqlite3PagerIswriteable(pChild->pDbPage) );
+ assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
+ assert( pChild->nCell==pRoot->nCell );
-balancedeeper_out:
- releasePage(pChild);
- return rc;
-}
+ TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno));
-/*
-** Decide if the page pPage needs to be balanced. If balancing is
-** required, call the appropriate balancing routine.
-*/
-static int balance(MemPage *pPage, int insert){
- int rc = SQLITE_OK;
- assert( sqlite3_mutex_held(pPage->pBt->mutex) );
- if( pPage->pParent==0 ){
- rc = sqlite3PagerWrite(pPage->pDbPage);
- if( rc==SQLITE_OK && pPage->nOverflow>0 ){
- rc = balance_deeper(pPage);
- }
- if( rc==SQLITE_OK && pPage->nCell==0 ){
- rc = balance_shallower(pPage);
- }
- }else{
- if( pPage->nOverflow>0 ||
- (!insert && pPage->nFree>pPage->pBt->usableSize*2/3) ){
- rc = balance_nonroot(pPage);
- }
- }
- return rc;
+ /* Copy the overflow cells from pRoot to pChild */
+ memcpy(pChild->aOvfl, pRoot->aOvfl, pRoot->nOverflow*sizeof(pRoot->aOvfl[0]));
+ pChild->nOverflow = pRoot->nOverflow;
+
+ /* Zero the contents of pRoot. Then install pChild as the right-child. */
+ zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF);
+ put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild);
+
+ *ppChild = pChild;
+ return SQLITE_OK;
}
/*
-** This routine checks all cursors that point to table pgnoRoot.
-** If any of those cursors were opened with wrFlag==0 in a different
-** database connection (a database connection that shares the pager
-** cache with the current connection) and that other connection
-** is not in the ReadUncommmitted state, then this routine returns
-** SQLITE_LOCKED.
+** The page that pCur currently points to has just been modified in
+** some way. This function figures out if this modification means the
+** tree needs to be balanced, and if so calls the appropriate balancing
+** routine. Balancing routines are:
**
-** In addition to checking for read-locks (where a read-lock
-** means a cursor opened with wrFlag==0) this routine also moves
-** all write cursors so that they are pointing to the
-** first Cell on the root page. This is necessary because an insert
-** or delete might change the number of cells on a page or delete
-** a page entirely and we do not want to leave any cursors
-** pointing to non-existant pages or cells.
+** balance_quick()
+** balance_deeper()
+** balance_nonroot()
*/
-static int checkReadLocks(Btree *pBtree, Pgno pgnoRoot, BtCursor *pExclude){
- BtCursor *p;
- BtShared *pBt = pBtree->pBt;
- sqlite3 *db = pBtree->db;
- assert( sqlite3BtreeHoldsMutex(pBtree) );
- for(p=pBt->pCursor; p; p=p->pNext){
- if( p==pExclude ) continue;
- if( p->eState!=CURSOR_VALID ) continue;
- if( p->pgnoRoot!=pgnoRoot ) continue;
- if( p->wrFlag==0 ){
- sqlite3 *dbOther = p->pBtree->db;
- if( dbOther==0 ||
- (dbOther!=db && (dbOther->flags & SQLITE_ReadUncommitted)==0) ){
- return SQLITE_LOCKED;
+static int balance(BtCursor *pCur){
+ int rc = SQLITE_OK;
+ const int nMin = pCur->pBt->usableSize * 2 / 3;
+ u8 aBalanceQuickSpace[13];
+ u8 *pFree = 0;
+
+ TESTONLY( int balance_quick_called = 0 );
+ TESTONLY( int balance_deeper_called = 0 );
+
+ do {
+ int iPage = pCur->iPage;
+ MemPage *pPage = pCur->apPage[iPage];
+
+ if( iPage==0 ){
+ if( pPage->nOverflow ){
+ /* The root page of the b-tree is overfull. In this case call the
+ ** balance_deeper() function to create a new child for the root-page
+ ** and copy the current contents of the root-page to it. The
+ ** next iteration of the do-loop will balance the child page.
+ */
+ assert( (balance_deeper_called++)==0 );
+ rc = balance_deeper(pPage, &pCur->apPage[1]);
+ if( rc==SQLITE_OK ){
+ pCur->iPage = 1;
+ pCur->aiIdx[0] = 0;
+ pCur->aiIdx[1] = 0;
+ assert( pCur->apPage[1]->nOverflow );
+ }
+ }else{
+ break;
+ }
+ }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){
+ break;
+ }else{
+ MemPage * const pParent = pCur->apPage[iPage-1];
+ int const iIdx = pCur->aiIdx[iPage-1];
+
+ rc = sqlite3PagerWrite(pParent->pDbPage);
+ if( rc==SQLITE_OK ){
+#ifndef SQLITE_OMIT_QUICKBALANCE
+ if( pPage->hasData
+ && pPage->nOverflow==1
+ && pPage->aOvfl[0].idx==pPage->nCell
+ && pParent->pgno!=1
+ && pParent->nCell==iIdx
+ ){
+ /* Call balance_quick() to create a new sibling of pPage on which
+ ** to store the overflow cell. balance_quick() inserts a new cell
+ ** into pParent, which may cause pParent overflow. If this
+ ** happens, the next interation of the do-loop will balance pParent
+ ** use either balance_nonroot() or balance_deeper(). Until this
+ ** happens, the overflow cell is stored in the aBalanceQuickSpace[]
+ ** buffer.
+ **
+ ** The purpose of the following assert() is to check that only a
+ ** single call to balance_quick() is made for each call to this
+ ** function. If this were not verified, a subtle bug involving reuse
+ ** of the aBalanceQuickSpace[] might sneak in.
+ */
+ assert( (balance_quick_called++)==0 );
+ rc = balance_quick(pParent, pPage, aBalanceQuickSpace);
+ }else
+#endif
+ {
+ /* In this case, call balance_nonroot() to redistribute cells
+ ** between pPage and up to 2 of its sibling pages. This involves
+ ** modifying the contents of pParent, which may cause pParent to
+ ** become overfull or underfull. The next iteration of the do-loop
+ ** will balance the parent page to correct this.
+ **
+ ** If the parent page becomes overfull, the overflow cell or cells
+ ** are stored in the pSpace buffer allocated immediately below.
+ ** A subsequent iteration of the do-loop will deal with this by
+ ** calling balance_nonroot() (balance_deeper() may be called first,
+ ** but it doesn't deal with overflow cells - just moves them to a
+ ** different page). Once this subsequent call to balance_nonroot()
+ ** has completed, it is safe to release the pSpace buffer used by
+ ** the previous call, as the overflow cell data will have been
+ ** copied either into the body of a database page or into the new
+ ** pSpace buffer passed to the latter call to balance_nonroot().
+ */
+ u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize);
+ rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1);
+ if( pFree ){
+ /* If pFree is not NULL, it points to the pSpace buffer used
+ ** by a previous call to balance_nonroot(). Its contents are
+ ** now stored either on real database pages or within the
+ ** new pSpace buffer, so it may be safely freed here. */
+ sqlite3PageFree(pFree);
+ }
+
+ /* The pSpace buffer will be freed after the next call to
+ ** balance_nonroot(), or just before this function returns, whichever
+ ** comes first. */
+ pFree = pSpace;
+ }
}
- }else if( p->pPage->pgno!=p->pgnoRoot ){
- moveToRoot(p);
+
+ pPage->nOverflow = 0;
+
+ /* The next iteration of the do-loop balances the parent page. */
+ releasePage(pPage);
+ pCur->iPage--;
}
- }
- return SQLITE_OK;
-}
+ }while( rc==SQLITE_OK );
-/*
-** Make sure pBt->pTmpSpace points to an allocation of
-** MX_CELL_SIZE(pBt) bytes.
-*/
-static void allocateTempSpace(BtShared *pBt){
- if( !pBt->pTmpSpace ){
- pBt->pTmpSpace = sqlite3_malloc(MX_CELL_SIZE(pBt));
+ if( pFree ){
+ sqlite3PageFree(pFree);
}
+ return rc;
}
+
/*
** Insert a new record into the BTree. The key is given by (pKey,nKey)
** and the data is given by (pData,nData). The cursor is used only to
@@ -35615,52 +44059,84 @@ static void allocateTempSpace(BtShared *pBt){
**
** For an INTKEY table, only the nKey value of the key is used. pKey is
** ignored. For a ZERODATA table, the pData and nData are both ignored.
+**
+** If the seekResult parameter is non-zero, then a successful call to
+** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already
+** been performed. seekResult is the search result returned (a negative
+** number if pCur points at an entry that is smaller than (pKey, nKey), or
+** a positive value if pCur points at an etry that is larger than
+** (pKey, nKey)).
+**
+** If the seekResult parameter is non-zero, then the caller guarantees that
+** cursor pCur is pointing at the existing copy of a row that is to be
+** overwritten. If the seekResult parameter is 0, then cursor pCur may
+** point to any entry or to no entry at all and so this function has to seek
+** the cursor before the new key can be inserted.
*/
SQLITE_PRIVATE int sqlite3BtreeInsert(
BtCursor *pCur, /* Insert data into the table of this cursor */
const void *pKey, i64 nKey, /* The key of the new record */
const void *pData, int nData, /* The data of the new record */
int nZero, /* Number of extra 0 bytes to append to data */
- int appendBias /* True if this is likely an append */
+ int appendBias, /* True if this is likely an append */
+ int seekResult /* Result of prior MovetoUnpacked() call */
){
int rc;
- int loc;
+ int loc = seekResult; /* -1: before desired location +1: after */
int szNew;
+ int idx;
MemPage *pPage;
Btree *p = pCur->pBtree;
BtShared *pBt = p->pBt;
unsigned char *oldCell;
unsigned char *newCell = 0;
- assert( cursorHoldsMutex(pCur) );
- if( pBt->inTransaction!=TRANS_WRITE ){
- /* Must start a transaction before doing an insert */
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- return rc;
- }
- assert( !pBt->readOnly );
- if( !pCur->wrFlag ){
- return SQLITE_PERM; /* Cursor not open for writing */
- }
- if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){
- return SQLITE_LOCKED; /* The table pCur points to has a read lock */
- }
if( pCur->eState==CURSOR_FAULT ){
- return pCur->skip;
+ assert( pCur->skipNext!=SQLITE_OK );
+ return pCur->skipNext;
}
- /* Save the positions of any other cursors open on this table */
- clearCursorPosition(pCur);
- if(
- SQLITE_OK!=(rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur)) ||
- SQLITE_OK!=(rc = sqlite3BtreeMoveto(pCur, pKey, 0, nKey, appendBias, &loc))
- ){
- return rc;
+ assert( cursorHoldsMutex(pCur) );
+ assert( pCur->wrFlag && pBt->inTransaction==TRANS_WRITE && !pBt->readOnly );
+ assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
+
+ /* Assert that the caller has been consistent. If this cursor was opened
+ ** expecting an index b-tree, then the caller should be inserting blob
+ ** keys with no associated data. If the cursor was opened expecting an
+ ** intkey table, the caller should be inserting integer keys with a
+ ** blob of associated data. */
+ assert( (pKey==0)==(pCur->pKeyInfo==0) );
+
+ /* If this is an insert into a table b-tree, invalidate any incrblob
+ ** cursors open on the row being replaced (assuming this is a replace
+ ** operation - if it is not, the following is a no-op). */
+ if( pCur->pKeyInfo==0 ){
+ invalidateIncrblobCursors(p, nKey, 0);
+ }
+
+ /* Save the positions of any other cursors open on this table.
+ **
+ ** In some cases, the call to btreeMoveto() below is a no-op. For
+ ** example, when inserting data into a table with auto-generated integer
+ ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the
+ ** integer key to use. It then calls this function to actually insert the
+ ** data into the intkey B-Tree. In this case btreeMoveto() recognizes
+ ** that the cursor is already where it needs to be and returns without
+ ** doing any work. To avoid thwarting these optimizations, it is important
+ ** not to clear the cursor here.
+ */
+ rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
+ if( rc ) return rc;
+ if( !loc ){
+ rc = btreeMoveto(pCur, pKey, nKey, appendBias, &loc);
+ if( rc ) return rc;
}
+ assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) );
- pPage = pCur->pPage;
+ pPage = pCur->apPage[pCur->iPage];
assert( pPage->intKey || nKey>=0 );
- assert( pPage->leaf || !pPage->leafData );
+ assert( pPage->leaf || !pPage->intKey );
+
TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n",
pCur->pgnoRoot, nKey, nData, pPage->pgno,
loc==0 ? "overwrite" : "new entry"));
@@ -35672,150 +44148,179 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
if( rc ) goto end_insert;
assert( szNew==cellSizePtr(pPage, newCell) );
assert( szNew<=MX_CELL_SIZE(pBt) );
- if( loc==0 && CURSOR_VALID==pCur->eState ){
+ idx = pCur->aiIdx[pCur->iPage];
+ if( loc==0 ){
u16 szOld;
- assert( pCur->idx>=0 && pCur->idx<pPage->nCell );
+ assert( idx<pPage->nCell );
rc = sqlite3PagerWrite(pPage->pDbPage);
if( rc ){
goto end_insert;
}
- oldCell = findCell(pPage, pCur->idx);
+ oldCell = findCell(pPage, idx);
if( !pPage->leaf ){
memcpy(newCell, oldCell, 4);
}
szOld = cellSizePtr(pPage, oldCell);
rc = clearCell(pPage, oldCell);
+ dropCell(pPage, idx, szOld, &rc);
if( rc ) goto end_insert;
- dropCell(pPage, pCur->idx, szOld);
}else if( loc<0 && pPage->nCell>0 ){
assert( pPage->leaf );
- pCur->idx++;
- pCur->info.nSize = 0;
- pCur->validNKey = 0;
+ idx = ++pCur->aiIdx[pCur->iPage];
}else{
assert( pPage->leaf );
}
- rc = insertCell(pPage, pCur->idx, newCell, szNew, 0, 0);
- if( rc!=SQLITE_OK ) goto end_insert;
- rc = balance(pPage, 1);
- /* sqlite3BtreePageDump(pCur->pBt, pCur->pgnoRoot, 1); */
- /* fflush(stdout); */
- if( rc==SQLITE_OK ){
- moveToRoot(pCur);
+ insertCell(pPage, idx, newCell, szNew, 0, 0, &rc);
+ assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 );
+
+ /* If no error has occured and pPage has an overflow cell, call balance()
+ ** to redistribute the cells within the tree. Since balance() may move
+ ** the cursor, zero the BtCursor.info.nSize and BtCursor.validNKey
+ ** variables.
+ **
+ ** Previous versions of SQLite called moveToRoot() to move the cursor
+ ** back to the root page as balance() used to invalidate the contents
+ ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that,
+ ** set the cursor state to "invalid". This makes common insert operations
+ ** slightly faster.
+ **
+ ** There is a subtle but important optimization here too. When inserting
+ ** multiple records into an intkey b-tree using a single cursor (as can
+ ** happen while processing an "INSERT INTO ... SELECT" statement), it
+ ** is advantageous to leave the cursor pointing to the last entry in
+ ** the b-tree if possible. If the cursor is left pointing to the last
+ ** entry in the table, and the next row inserted has an integer key
+ ** larger than the largest existing key, it is possible to insert the
+ ** row without seeking the cursor. This can be a big performance boost.
+ */
+ pCur->info.nSize = 0;
+ pCur->validNKey = 0;
+ if( rc==SQLITE_OK && pPage->nOverflow ){
+ rc = balance(pCur);
+
+ /* Must make sure nOverflow is reset to zero even if the balance()
+ ** fails. Internal data structure corruption will result otherwise.
+ ** Also, set the cursor state to invalid. This stops saveCursorPosition()
+ ** from trying to save the current position of the cursor. */
+ pCur->apPage[pCur->iPage]->nOverflow = 0;
+ pCur->eState = CURSOR_INVALID;
}
+ assert( pCur->apPage[pCur->iPage]->nOverflow==0 );
+
end_insert:
return rc;
}
/*
** Delete the entry that the cursor is pointing to. The cursor
-** is left pointing at a random location.
+** is left pointing at a arbitrary location.
*/
SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){
- MemPage *pPage = pCur->pPage;
- unsigned char *pCell;
- int rc;
- Pgno pgnoChild = 0;
Btree *p = pCur->pBtree;
- BtShared *pBt = p->pBt;
+ BtShared *pBt = p->pBt;
+ int rc; /* Return code */
+ MemPage *pPage; /* Page to delete cell from */
+ unsigned char *pCell; /* Pointer to cell to delete */
+ int iCellIdx; /* Index of cell to delete */
+ int iCellDepth; /* Depth of node containing pCell */
assert( cursorHoldsMutex(pCur) );
- assert( pPage->isInit );
- if( pBt->inTransaction!=TRANS_WRITE ){
- /* Must start a transaction before doing a delete */
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- return rc;
- }
+ assert( pBt->inTransaction==TRANS_WRITE );
assert( !pBt->readOnly );
- if( pCur->eState==CURSOR_FAULT ){
- return pCur->skip;
- }
- if( pCur->idx >= pPage->nCell ){
- return SQLITE_ERROR; /* The cursor is not pointing to anything */
- }
- if( !pCur->wrFlag ){
- return SQLITE_PERM; /* Did not open this cursor for writing */
- }
- if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){
- return SQLITE_LOCKED; /* The table pCur points to has a read lock */
- }
+ assert( pCur->wrFlag );
+ assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
+ assert( !hasReadConflicts(p, pCur->pgnoRoot) );
- /* Restore the current cursor position (a no-op if the cursor is not in
- ** CURSOR_REQUIRESEEK state) and save the positions of any other cursors
- ** open on the same table. Then call sqlite3PagerWrite() on the page
- ** that the entry will be deleted from.
- */
- if(
- (rc = restoreOrClearCursorPosition(pCur))!=0 ||
- (rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur))!=0 ||
- (rc = sqlite3PagerWrite(pPage->pDbPage))!=0
+ if( NEVER(pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell)
+ || NEVER(pCur->eState!=CURSOR_VALID)
){
- return rc;
+ return SQLITE_ERROR; /* Something has gone awry. */
}
- /* Locate the cell within its page and leave pCell pointing to the
- ** data. The clearCell() call frees any overflow pages associated with the
- ** cell. The cell itself is still intact.
- */
- pCell = findCell(pPage, pCur->idx);
+ /* If this is a delete operation to remove a row from a table b-tree,
+ ** invalidate any incrblob cursors open on the row being deleted. */
+ if( pCur->pKeyInfo==0 ){
+ invalidateIncrblobCursors(p, pCur->info.nKey, 0);
+ }
+
+ iCellDepth = pCur->iPage;
+ iCellIdx = pCur->aiIdx[iCellDepth];
+ pPage = pCur->apPage[iCellDepth];
+ pCell = findCell(pPage, iCellIdx);
+
+ /* If the page containing the entry to delete is not a leaf page, move
+ ** the cursor to the largest entry in the tree that is smaller than
+ ** the entry being deleted. This cell will replace the cell being deleted
+ ** from the internal node. The 'previous' entry is used for this instead
+ ** of the 'next' entry, as the previous entry is always a part of the
+ ** sub-tree headed by the child page of the cell being deleted. This makes
+ ** balancing the tree following the delete operation easier. */
if( !pPage->leaf ){
- pgnoChild = get4byte(pCell);
+ int notUsed;
+ rc = sqlite3BtreePrevious(pCur, &notUsed);
+ if( rc ) return rc;
}
+
+ /* Save the positions of any other cursors open on this table before
+ ** making any modifications. Make the page containing the entry to be
+ ** deleted writable. Then free any overflow pages associated with the
+ ** entry and finally remove the cell itself from within the page.
+ */
+ rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
+ if( rc ) return rc;
+ rc = sqlite3PagerWrite(pPage->pDbPage);
+ if( rc ) return rc;
rc = clearCell(pPage, pCell);
- if( rc ){
- return rc;
- }
+ dropCell(pPage, iCellIdx, cellSizePtr(pPage, pCell), &rc);
+ if( rc ) return rc;
+ /* If the cell deleted was not located on a leaf page, then the cursor
+ ** is currently pointing to the largest entry in the sub-tree headed
+ ** by the child-page of the cell that was just deleted from an internal
+ ** node. The cell from the leaf node needs to be moved to the internal
+ ** node to replace the deleted cell. */
if( !pPage->leaf ){
- /*
- ** The entry we are about to delete is not a leaf so if we do not
- ** do something we will leave a hole on an internal page.
- ** We have to fill the hole by moving in a cell from a leaf. The
- ** next Cell after the one to be deleted is guaranteed to exist and
- ** to be a leaf so we can use it.
- */
- BtCursor leafCur;
- unsigned char *pNext;
- int notUsed;
- unsigned char *tempCell = 0;
- assert( !pPage->leafData );
- sqlite3BtreeGetTempCursor(pCur, &leafCur);
- rc = sqlite3BtreeNext(&leafCur, &notUsed);
- if( rc==SQLITE_OK ){
- rc = sqlite3PagerWrite(leafCur.pPage->pDbPage);
- }
- if( rc==SQLITE_OK ){
- u16 szNext;
- TRACE(("DELETE: table=%d delete internal from %d replace from leaf %d\n",
- pCur->pgnoRoot, pPage->pgno, leafCur.pPage->pgno));
- dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell));
- pNext = findCell(leafCur.pPage, leafCur.idx);
- szNext = cellSizePtr(leafCur.pPage, pNext);
- assert( MX_CELL_SIZE(pBt)>=szNext+4 );
- allocateTempSpace(pBt);
- tempCell = pBt->pTmpSpace;
- if( tempCell==0 ){
- rc = SQLITE_NOMEM;
- }
- if( rc==SQLITE_OK ){
- rc = insertCell(pPage, pCur->idx, pNext-4, szNext+4, tempCell, 0);
- }
- if( rc==SQLITE_OK ){
- put4byte(findOverflowCell(pPage, pCur->idx), pgnoChild);
- rc = balance(pPage, 0);
- }
- if( rc==SQLITE_OK ){
- dropCell(leafCur.pPage, leafCur.idx, szNext);
- rc = balance(leafCur.pPage, 0);
- }
- }
- sqlite3BtreeReleaseTempCursor(&leafCur);
- }else{
- TRACE(("DELETE: table=%d delete from leaf %d\n",
- pCur->pgnoRoot, pPage->pgno));
- dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell));
- rc = balance(pPage, 0);
+ MemPage *pLeaf = pCur->apPage[pCur->iPage];
+ int nCell;
+ Pgno n = pCur->apPage[iCellDepth+1]->pgno;
+ unsigned char *pTmp;
+
+ pCell = findCell(pLeaf, pLeaf->nCell-1);
+ nCell = cellSizePtr(pLeaf, pCell);
+ assert( MX_CELL_SIZE(pBt)>=nCell );
+
+ allocateTempSpace(pBt);
+ pTmp = pBt->pTmpSpace;
+
+ rc = sqlite3PagerWrite(pLeaf->pDbPage);
+ insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc);
+ dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc);
+ if( rc ) return rc;
+ }
+
+ /* Balance the tree. If the entry deleted was located on a leaf page,
+ ** then the cursor still points to that page. In this case the first
+ ** call to balance() repairs the tree, and the if(...) condition is
+ ** never true.
+ **
+ ** Otherwise, if the entry deleted was on an internal node page, then
+ ** pCur is pointing to the leaf page from which a cell was removed to
+ ** replace the cell deleted from the internal node. This is slightly
+ ** tricky as the leaf node may be underfull, and the internal node may
+ ** be either under or overfull. In this case run the balancing algorithm
+ ** on the leaf node first. If the balance proceeds far enough up the
+ ** tree that we can be sure that any problem in the internal node has
+ ** been corrected, so be it. Otherwise, after balancing the leaf node,
+ ** walk the cursor up the tree to the internal node and balance it as
+ ** well. */
+ rc = balance(pCur);
+ if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){
+ while( pCur->iPage>iCellDepth ){
+ releasePage(pCur->apPage[pCur->iPage--]);
+ }
+ rc = balance(pCur);
}
+
if( rc==SQLITE_OK ){
moveToRoot(pCur);
}
@@ -35840,11 +44345,7 @@ static int btreeCreateTable(Btree *p, int *piTable, int flags){
int rc;
assert( sqlite3BtreeHoldsMutex(p) );
- if( pBt->inTransaction!=TRANS_WRITE ){
- /* Must start a transaction first */
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- return rc;
- }
+ assert( pBt->inTransaction==TRANS_WRITE );
assert( !pBt->readOnly );
#ifdef SQLITE_OMIT_AUTOVACUUM
@@ -35868,10 +44369,7 @@ static int btreeCreateTable(Btree *p, int *piTable, int flags){
** root page of the new table should go. meta[3] is the largest root-page
** created so far, so the new root-page is (meta[3]+1).
*/
- rc = sqlite3BtreeGetMeta(p, 4, &pgnoRoot);
- if( rc!=SQLITE_OK ){
- return rc;
- }
+ sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot);
pgnoRoot++;
/* The new root-page may not be allocated on a pointer-map page, or the
@@ -35899,36 +44397,34 @@ static int btreeCreateTable(Btree *p, int *piTable, int flags){
** by extending the file), the current page at position pgnoMove
** is already journaled.
*/
- u8 eType;
- Pgno iPtrPage;
+ u8 eType = 0;
+ Pgno iPtrPage = 0;
releasePage(pPageMove);
/* Move the page currently at pgnoRoot to pgnoMove. */
- rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0);
+ rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
if( rc!=SQLITE_OK ){
return rc;
}
rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage);
- if( rc!=SQLITE_OK || eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){
- releasePage(pRoot);
- return rc;
+ if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){
+ rc = SQLITE_CORRUPT_BKPT;
}
- assert( eType!=PTRMAP_ROOTPAGE );
- assert( eType!=PTRMAP_FREEPAGE );
- rc = sqlite3PagerWrite(pRoot->pDbPage);
if( rc!=SQLITE_OK ){
releasePage(pRoot);
return rc;
}
- rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove);
+ assert( eType!=PTRMAP_ROOTPAGE );
+ assert( eType!=PTRMAP_FREEPAGE );
+ rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0);
releasePage(pRoot);
/* Obtain the page at pgnoRoot */
if( rc!=SQLITE_OK ){
return rc;
}
- rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0);
+ rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -35942,7 +44438,7 @@ static int btreeCreateTable(Btree *p, int *piTable, int flags){
}
/* Update the pointer-map and meta-data with the new root-page number. */
- rc = ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0);
+ ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc);
if( rc ){
releasePage(pRoot);
return rc;
@@ -35967,7 +44463,6 @@ static int btreeCreateTable(Btree *p, int *piTable, int flags){
SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){
int rc;
sqlite3BtreeEnter(p);
- p->pBt->db = p->db;
rc = btreeCreateTable(p, piTable, flags);
sqlite3BtreeLeave(p);
return rc;
@@ -35980,36 +44475,39 @@ SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){
static int clearDatabasePage(
BtShared *pBt, /* The BTree that contains the table */
Pgno pgno, /* Page number to clear */
- MemPage *pParent, /* Parent page. NULL for the root */
- int freePageFlag /* Deallocate page if true */
+ int freePageFlag, /* Deallocate page if true */
+ int *pnChange
){
- MemPage *pPage = 0;
+ MemPage *pPage;
int rc;
unsigned char *pCell;
int i;
assert( sqlite3_mutex_held(pBt->mutex) );
- if( pgno>sqlite3PagerPagecount(pBt->pPager) ){
+ if( pgno>pagerPagecount(pBt) ){
return SQLITE_CORRUPT_BKPT;
}
- rc = getAndInitPage(pBt, pgno, &pPage, pParent);
- if( rc ) goto cleardatabasepage_out;
+ rc = getAndInitPage(pBt, pgno, &pPage);
+ if( rc ) return rc;
for(i=0; i<pPage->nCell; i++){
pCell = findCell(pPage, i);
if( !pPage->leaf ){
- rc = clearDatabasePage(pBt, get4byte(pCell), pPage->pParent, 1);
+ rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
}
rc = clearCell(pPage, pCell);
if( rc ) goto cleardatabasepage_out;
}
if( !pPage->leaf ){
- rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), pPage->pParent, 1);
+ rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), 1, pnChange);
if( rc ) goto cleardatabasepage_out;
+ }else if( pnChange ){
+ assert( pPage->intKey );
+ *pnChange += pPage->nCell;
}
if( freePageFlag ){
- rc = freePage(pPage);
+ freePage(pPage, &rc);
}else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){
zeroPage(pPage, pPage->aData[0] | PTF_LEAF);
}
@@ -36027,20 +44525,25 @@ cleardatabasepage_out:
** This routine will fail with SQLITE_LOCKED if there are any open
** read cursors on the table. Open write cursors are moved to the
** root of the table.
+**
+** If pnChange is not NULL, then table iTable must be an intkey table. The
+** integer value pointed to by pnChange is incremented by the number of
+** entries in the table.
*/
-SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable){
+SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){
int rc;
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
- if( p->inTrans!=TRANS_WRITE ){
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- }else if( (rc = checkReadLocks(p, iTable, 0))!=SQLITE_OK ){
- /* nothing to do */
- }else if( SQLITE_OK!=(rc = saveAllCursors(pBt, iTable, 0)) ){
- /* nothing to do */
- }else{
- rc = clearDatabasePage(pBt, (Pgno)iTable, 0, 0);
+ assert( p->inTrans==TRANS_WRITE );
+
+ /* Invalidate all incrblob cursors open on table iTable (assuming iTable
+ ** is the root of a table b-tree - if it is not, the following call is
+ ** a no-op). */
+ invalidateIncrblobCursors(p, 0, 1);
+
+ rc = saveAllCursors(pBt, (Pgno)iTable, 0);
+ if( SQLITE_OK==rc ){
+ rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange);
}
sqlite3BtreeLeave(p);
return rc;
@@ -36066,29 +44569,30 @@ SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable){
** The last root page is recorded in meta[3] and the value of
** meta[3] is updated by this procedure.
*/
-static int btreeDropTable(Btree *p, int iTable, int *piMoved){
+static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){
int rc;
MemPage *pPage = 0;
BtShared *pBt = p->pBt;
assert( sqlite3BtreeHoldsMutex(p) );
- if( p->inTrans!=TRANS_WRITE ){
- return pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- }
+ assert( p->inTrans==TRANS_WRITE );
/* It is illegal to drop a table if any cursors are open on the
** database. This is because in auto-vacuum mode the backend may
** need to move another root-page to fill a gap left by the deleted
** root page. If an open cursor was using this page a problem would
** occur.
+ **
+ ** This error is caught long before control reaches this point.
*/
- if( pBt->pCursor ){
- return SQLITE_LOCKED;
+ if( NEVER(pBt->pCursor) ){
+ sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db);
+ return SQLITE_LOCKED_SHAREDCACHE;
}
- rc = sqlite3BtreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
+ rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
if( rc ) return rc;
- rc = sqlite3BtreeClearTable(p, iTable);
+ rc = sqlite3BtreeClearTable(p, iTable, 0);
if( rc ){
releasePage(pPage);
return rc;
@@ -36098,22 +44602,18 @@ static int btreeDropTable(Btree *p, int iTable, int *piMoved){
if( iTable>1 ){
#ifdef SQLITE_OMIT_AUTOVACUUM
- rc = freePage(pPage);
+ freePage(pPage, &rc);
releasePage(pPage);
#else
if( pBt->autoVacuum ){
Pgno maxRootPgno;
- rc = sqlite3BtreeGetMeta(p, 4, &maxRootPgno);
- if( rc!=SQLITE_OK ){
- releasePage(pPage);
- return rc;
- }
+ sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno);
if( iTable==maxRootPgno ){
/* If the table being dropped is the table with the largest root-page
** number in the database, put the root page on the free list.
*/
- rc = freePage(pPage);
+ freePage(pPage, &rc);
releasePage(pPage);
if( rc!=SQLITE_OK ){
return rc;
@@ -36125,20 +44625,18 @@ static int btreeDropTable(Btree *p, int iTable, int *piMoved){
*/
MemPage *pMove;
releasePage(pPage);
- rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0);
+ rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
if( rc!=SQLITE_OK ){
return rc;
}
- rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable);
+ rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0);
releasePage(pMove);
if( rc!=SQLITE_OK ){
return rc;
}
- rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0);
- if( rc!=SQLITE_OK ){
- return rc;
- }
- rc = freePage(pMove);
+ pMove = 0;
+ rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
+ freePage(pMove, &rc);
releasePage(pMove);
if( rc!=SQLITE_OK ){
return rc;
@@ -36152,22 +44650,23 @@ static int btreeDropTable(Btree *p, int iTable, int *piMoved){
** PENDING_BYTE_PAGE.
*/
maxRootPgno--;
- if( maxRootPgno==PENDING_BYTE_PAGE(pBt) ){
- maxRootPgno--;
- }
- if( maxRootPgno==PTRMAP_PAGENO(pBt, maxRootPgno) ){
+ while( maxRootPgno==PENDING_BYTE_PAGE(pBt)
+ || PTRMAP_ISPAGE(pBt, maxRootPgno) ){
maxRootPgno--;
}
assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) );
rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno);
}else{
- rc = freePage(pPage);
+ freePage(pPage, &rc);
releasePage(pPage);
}
#endif
}else{
- /* If sqlite3BtreeDropTable was called on page 1. */
+ /* If sqlite3BtreeDropTable was called on page 1.
+ ** This really never should happen except in a corrupt
+ ** database.
+ */
zeroPage(pPage, PTF_INTKEY|PTF_LEAF );
releasePage(pPage);
}
@@ -36176,7 +44675,6 @@ static int btreeDropTable(Btree *p, int iTable, int *piMoved){
SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){
int rc;
sqlite3BtreeEnter(p);
- p->pBt->db = p->db;
rc = btreeDropTable(p, iTable, piMoved);
sqlite3BtreeLeave(p);
return rc;
@@ -36184,6 +44682,9 @@ SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){
/*
+** This function may only be called if the b-tree connection already
+** has a read or write transaction open on the database.
+**
** Read the meta-information out of a database file. Meta[0]
** is the number of free pages currently in the database. Meta[1]
** through meta[15] are available for use by higher layers. Meta[0]
@@ -36193,47 +44694,24 @@ SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){
** layer (and the SetCookie and ReadCookie opcodes) the number of
** free pages is not visible. So Cookie[0] is the same as Meta[1].
*/
-SQLITE_PRIVATE int sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){
- DbPage *pDbPage;
- int rc;
- unsigned char *pP1;
+SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- pBt->db = p->db;
-
- /* Reading a meta-data value requires a read-lock on page 1 (and hence
- ** the sqlite_master table. We grab this lock regardless of whether or
- ** not the SQLITE_ReadUncommitted flag is set (the table rooted at page
- ** 1 is treated as a special case by queryTableLock() and lockTable()).
- */
- rc = queryTableLock(p, 1, READ_LOCK);
- if( rc!=SQLITE_OK ){
- sqlite3BtreeLeave(p);
- return rc;
- }
-
+ assert( p->inTrans>TRANS_NONE );
+ assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) );
+ assert( pBt->pPage1 );
assert( idx>=0 && idx<=15 );
- rc = sqlite3PagerGet(pBt->pPager, 1, &pDbPage);
- if( rc ){
- sqlite3BtreeLeave(p);
- return rc;
- }
- pP1 = (unsigned char *)sqlite3PagerGetData(pDbPage);
- *pMeta = get4byte(&pP1[36 + idx*4]);
- sqlite3PagerUnref(pDbPage);
- /* If autovacuumed is disabled in this build but we are trying to
- ** access an autovacuumed database, then make the database readonly.
- */
+ *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]);
+
+ /* If auto-vacuum is disabled in this build and this is an auto-vacuum
+ ** database, mark the database as read-only. */
#ifdef SQLITE_OMIT_AUTOVACUUM
- if( idx==4 && *pMeta>0 ) pBt->readOnly = 1;
+ if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ) pBt->readOnly = 1;
#endif
- /* Grab the read-lock on page 1. */
- rc = lockTable(p, 1, READ_LOCK);
sqlite3BtreeLeave(p);
- return rc;
}
/*
@@ -36246,44 +44724,93 @@ SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){
int rc;
assert( idx>=1 && idx<=15 );
sqlite3BtreeEnter(p);
- pBt->db = p->db;
- if( p->inTrans!=TRANS_WRITE ){
- rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR;
- }else{
- assert( pBt->pPage1!=0 );
- pP1 = pBt->pPage1->aData;
- rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
- if( rc==SQLITE_OK ){
- put4byte(&pP1[36 + idx*4], iMeta);
+ assert( p->inTrans==TRANS_WRITE );
+ assert( pBt->pPage1!=0 );
+ pP1 = pBt->pPage1->aData;
+ rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
+ if( rc==SQLITE_OK ){
+ put4byte(&pP1[36 + idx*4], iMeta);
#ifndef SQLITE_OMIT_AUTOVACUUM
- if( idx==7 ){
- assert( pBt->autoVacuum || iMeta==0 );
- assert( iMeta==0 || iMeta==1 );
- pBt->incrVacuum = iMeta;
- }
-#endif
+ if( idx==BTREE_INCR_VACUUM ){
+ assert( pBt->autoVacuum || iMeta==0 );
+ assert( iMeta==0 || iMeta==1 );
+ pBt->incrVacuum = (u8)iMeta;
}
+#endif
}
sqlite3BtreeLeave(p);
return rc;
}
+#ifndef SQLITE_OMIT_BTREECOUNT
/*
-** Return the flag byte at the beginning of the page that the cursor
-** is currently pointing to.
+** The first argument, pCur, is a cursor opened on some b-tree. Count the
+** number of entries in the b-tree and write the result to *pnEntry.
+**
+** SQLITE_OK is returned if the operation is successfully executed.
+** Otherwise, if an error is encountered (i.e. an IO error or database
+** corruption) an SQLite error code is returned.
*/
-SQLITE_PRIVATE int sqlite3BtreeFlags(BtCursor *pCur){
- /* TODO: What about CURSOR_REQUIRESEEK state? Probably need to call
- ** restoreOrClearCursorPosition() here.
+SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){
+ i64 nEntry = 0; /* Value to return in *pnEntry */
+ int rc; /* Return code */
+ rc = moveToRoot(pCur);
+
+ /* Unless an error occurs, the following loop runs one iteration for each
+ ** page in the B-Tree structure (not including overflow pages).
*/
- MemPage *pPage;
- restoreOrClearCursorPosition(pCur);
- pPage = pCur->pPage;
- assert( cursorHoldsMutex(pCur) );
- assert( pPage->pBt==pCur->pBt );
- return pPage ? pPage->aData[pPage->hdrOffset] : 0;
-}
+ while( rc==SQLITE_OK ){
+ int iIdx; /* Index of child node in parent */
+ MemPage *pPage; /* Current page of the b-tree */
+
+ /* If this is a leaf page or the tree is not an int-key tree, then
+ ** this page contains countable entries. Increment the entry counter
+ ** accordingly.
+ */
+ pPage = pCur->apPage[pCur->iPage];
+ if( pPage->leaf || !pPage->intKey ){
+ nEntry += pPage->nCell;
+ }
+
+ /* pPage is a leaf node. This loop navigates the cursor so that it
+ ** points to the first interior cell that it points to the parent of
+ ** the next page in the tree that has not yet been visited. The
+ ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell
+ ** of the page, or to the number of cells in the page if the next page
+ ** to visit is the right-child of its parent.
+ **
+ ** If all pages in the tree have been visited, return SQLITE_OK to the
+ ** caller.
+ */
+ if( pPage->leaf ){
+ do {
+ if( pCur->iPage==0 ){
+ /* All pages of the b-tree have been visited. Return successfully. */
+ *pnEntry = nEntry;
+ return SQLITE_OK;
+ }
+ moveToParent(pCur);
+ }while ( pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell );
+ pCur->aiIdx[pCur->iPage]++;
+ pPage = pCur->apPage[pCur->iPage];
+ }
+
+ /* Descend to the child node of the cell that the cursor currently
+ ** points at. This is the right-child if (iIdx==pPage->nCell).
+ */
+ iIdx = pCur->aiIdx[pCur->iPage];
+ if( iIdx==pPage->nCell ){
+ rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
+ }else{
+ rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx)));
+ }
+ }
+
+ /* An error has occurred. Return an error code. */
+ return rc;
+}
+#endif
/*
** Return the pager associated with a BTree. This routine is used for
@@ -36304,23 +44831,21 @@ static void checkAppendMsg(
...
){
va_list ap;
- char *zMsg2;
if( !pCheck->mxErr ) return;
pCheck->mxErr--;
pCheck->nErr++;
va_start(ap, zFormat);
- zMsg2 = sqlite3VMPrintf(0, zFormat, ap);
+ if( pCheck->errMsg.nChar ){
+ sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
+ }
+ if( zMsg1 ){
+ sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1);
+ }
+ sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap);
va_end(ap);
- if( zMsg1==0 ) zMsg1 = "";
- if( pCheck->zErrMsg ){
- char *zOld = pCheck->zErrMsg;
- pCheck->zErrMsg = 0;
- sqlite3SetString(&pCheck->zErrMsg, zOld, "\n", zMsg1, zMsg2, (char*)0);
- sqlite3_free(zOld);
- }else{
- sqlite3SetString(&pCheck->zErrMsg, zMsg1, zMsg2, (char*)0);
+ if( pCheck->errMsg.mallocFailed ){
+ pCheck->mallocFailed = 1;
}
- sqlite3_free(zMsg2);
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
@@ -36333,9 +44858,9 @@ static void checkAppendMsg(
**
** Also check that the page number is in bounds.
*/
-static int checkRef(IntegrityCk *pCheck, int iPage, char *zContext){
+static int checkRef(IntegrityCk *pCheck, Pgno iPage, char *zContext){
if( iPage==0 ) return 1;
- if( iPage>pCheck->nPage || iPage<0 ){
+ if( iPage>pCheck->nPage ){
checkAppendMsg(pCheck, zContext, "invalid page number %d", iPage);
return 1;
}
@@ -36365,6 +44890,7 @@ static void checkPtrmap(
rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->mallocFailed = 1;
checkAppendMsg(pCheck, zContext, "Failed to read ptrmap key=%d", iChild);
return;
}
@@ -36413,7 +44939,7 @@ static void checkList(
checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext);
}
#endif
- if( n>pCheck->pBt->usableSize/4-8 ){
+ if( n>pCheck->pBt->usableSize/4-2 ){
checkAppendMsg(pCheck, zContext,
"freelist leaf count too big on page %d", iPage);
N--;
@@ -36470,7 +44996,6 @@ static void checkList(
static int checkTreePage(
IntegrityCk *pCheck, /* Context for the sanity check */
int iPage, /* Page number of the page to check */
- MemPage *pParent, /* Parent page */
char *zParentContext /* Parent context */
){
MemPage *pPage;
@@ -36481,7 +45006,7 @@ static int checkTreePage(
BtShared *pBt;
int usableSize;
char zContext[100];
- char *hit;
+ char *hit = 0;
sqlite3_snprintf(sizeof(zContext), zContext, "Page %d: ", iPage);
@@ -36491,14 +45016,19 @@ static int checkTreePage(
usableSize = pBt->usableSize;
if( iPage==0 ) return 0;
if( checkRef(pCheck, iPage, zParentContext) ) return 0;
- if( (rc = sqlite3BtreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){
+ if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){
checkAppendMsg(pCheck, zContext,
"unable to get the page. error code=%d", rc);
return 0;
}
- if( (rc = sqlite3BtreeInitPage(pPage, pParent))!=0 ){
+
+ /* Clear MemPage.isInit to make sure the corruption detection code in
+ ** btreeInitPage() is executed. */
+ pPage->isInit = 0;
+ if( (rc = btreeInitPage(pPage))!=0 ){
+ assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */
checkAppendMsg(pCheck, zContext,
- "sqlite3BtreeInitPage() returns error code %d", rc);
+ "btreeInitPage() returns error code %d", rc);
releasePage(pPage);
return 0;
}
@@ -36508,7 +45038,7 @@ static int checkTreePage(
depth = 0;
for(i=0; i<pPage->nCell && pCheck->mxErr; i++){
u8 *pCell;
- int sz;
+ u32 sz;
CellInfo info;
/* Check payload overflow pages
@@ -36516,11 +45046,13 @@ static int checkTreePage(
sqlite3_snprintf(sizeof(zContext), zContext,
"On tree page %d cell %d: ", iPage, i);
pCell = findCell(pPage,i);
- sqlite3BtreeParseCellPtr(pPage, pCell, &info);
+ btreeParseCellPtr(pPage, pCell, &info);
sz = info.nData;
- if( !pPage->intKey ) sz += info.nKey;
+ if( !pPage->intKey ) sz += (int)info.nKey;
assert( sz==info.nPayload );
- if( sz>info.nLocal ){
+ if( (sz>info.nLocal)
+ && (&pCell[info.iOverflow]<=&pPage->aData[pBt->usableSize])
+ ){
int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4);
Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]);
#ifndef SQLITE_OMIT_AUTOVACUUM
@@ -36540,7 +45072,7 @@ static int checkTreePage(
checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext);
}
#endif
- d2 = checkTreePage(pCheck,pgno,pPage,zContext);
+ d2 = checkTreePage(pCheck, pgno, zContext);
if( i>0 && d2!=depth ){
checkAppendMsg(pCheck, zContext, "Child page depth differs");
}
@@ -36556,40 +45088,48 @@ static int checkTreePage(
checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, 0);
}
#endif
- checkTreePage(pCheck, pgno, pPage, zContext);
+ checkTreePage(pCheck, pgno, zContext);
}
/* Check for complete coverage of the page
*/
data = pPage->aData;
hdr = pPage->hdrOffset;
- hit = sqlite3MallocZero( usableSize );
- if( hit ){
- memset(hit, 1, get2byte(&data[hdr+5]));
+ hit = sqlite3PageMalloc( pBt->pageSize );
+ if( hit==0 ){
+ pCheck->mallocFailed = 1;
+ }else{
+ u16 contentOffset = get2byte(&data[hdr+5]);
+ assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */
+ memset(hit+contentOffset, 0, usableSize-contentOffset);
+ memset(hit, 1, contentOffset);
nCell = get2byte(&data[hdr+3]);
cellStart = hdr + 12 - 4*pPage->leaf;
for(i=0; i<nCell; i++){
int pc = get2byte(&data[cellStart+i*2]);
- u16 size = cellSizePtr(pPage, &data[pc]);
+ u16 size = 1024;
int j;
- if( (pc+size-1)>=usableSize || pc<0 ){
+ if( pc<=usableSize-4 ){
+ size = cellSizePtr(pPage, &data[pc]);
+ }
+ if( (pc+size-1)>=usableSize ){
checkAppendMsg(pCheck, 0,
"Corruption detected in cell %d on page %d",i,iPage,0);
}else{
for(j=pc+size-1; j>=pc; j--) hit[j]++;
}
}
- for(cnt=0, i=get2byte(&data[hdr+1]); i>0 && i<usableSize && cnt<10000;
- cnt++){
- int size = get2byte(&data[i+2]);
- int j;
- if( (i+size-1)>=usableSize || i<0 ){
- checkAppendMsg(pCheck, 0,
- "Corruption detected in cell %d on page %d",i,iPage,0);
- }else{
- for(j=i+size-1; j>=i; j--) hit[j]++;
- }
- i = get2byte(&data[i]);
+ i = get2byte(&data[hdr+1]);
+ while( i>0 ){
+ int size, j;
+ assert( i<=usableSize-4 ); /* Enforced by btreeInitPage() */
+ size = get2byte(&data[i+2]);
+ assert( i+size<=usableSize ); /* Enforced by btreeInitPage() */
+ for(j=i+size-1; j>=i; j--) hit[j]++;
+ j = get2byte(&data[i]);
+ assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */
+ assert( j<=usableSize-4 ); /* Enforced by btreeInitPage() */
+ i = j;
}
for(i=cnt=0; i<usableSize; i++){
if( hit[i]==0 ){
@@ -36602,12 +45142,11 @@ static int checkTreePage(
}
if( cnt!=data[hdr+7] ){
checkAppendMsg(pCheck, 0,
- "Fragmented space is %d byte reported as %d on page %d",
+ "Fragmentation of %d bytes reported as %d on page %d",
cnt, data[hdr+7], iPage);
}
}
- sqlite3_free(hit);
-
+ sqlite3PageFree(hit);
releasePage(pPage);
return depth+1;
}
@@ -36619,10 +45158,13 @@ static int checkTreePage(
** an array of pages numbers were each page number is the root page of
** a table. nRoot is the number of entries in aRoot.
**
-** If everything checks out, this routine returns NULL. If something is
-** amiss, an error message is written into memory obtained from malloc()
-** and a pointer to that error message is returned. The calling function
-** is responsible for freeing the error message when it is done.
+** A read-only or read-write transaction must be opened before calling
+** this function.
+**
+** Write the number of error seen in *pnErr. Except for some memory
+** allocation errors, an error message held in memory obtained from
+** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is
+** returned. If a memory allocation error occurs, NULL is returned.
*/
SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
Btree *p, /* The btree to be checked */
@@ -36631,48 +45173,38 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
int mxErr, /* Stop reporting errors after this many */
int *pnErr /* Write number of errors seen to this variable */
){
- int i;
+ Pgno i;
int nRef;
IntegrityCk sCheck;
BtShared *pBt = p->pBt;
+ char zErr[100];
sqlite3BtreeEnter(p);
- pBt->db = p->db;
+ assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
nRef = sqlite3PagerRefcount(pBt->pPager);
- if( lockBtreeWithRetry(p)!=SQLITE_OK ){
- sqlite3BtreeLeave(p);
- return sqlite3StrDup("Unable to acquire a read lock on the database");
- }
sCheck.pBt = pBt;
sCheck.pPager = pBt->pPager;
- sCheck.nPage = sqlite3PagerPagecount(sCheck.pPager);
+ sCheck.nPage = pagerPagecount(sCheck.pBt);
sCheck.mxErr = mxErr;
sCheck.nErr = 0;
+ sCheck.mallocFailed = 0;
*pnErr = 0;
-#ifndef SQLITE_OMIT_AUTOVACUUM
- if( pBt->nTrunc!=0 ){
- sCheck.nPage = pBt->nTrunc;
- }
-#endif
if( sCheck.nPage==0 ){
- unlockBtreeIfUnused(pBt);
sqlite3BtreeLeave(p);
return 0;
}
- sCheck.anRef = sqlite3_malloc( (sCheck.nPage+1)*sizeof(sCheck.anRef[0]) );
+ sCheck.anRef = sqlite3Malloc( (sCheck.nPage+1)*sizeof(sCheck.anRef[0]) );
if( !sCheck.anRef ){
- unlockBtreeIfUnused(pBt);
*pnErr = 1;
sqlite3BtreeLeave(p);
- return sqlite3MPrintf(p->db, "Unable to malloc %d bytes",
- (sCheck.nPage+1)*sizeof(sCheck.anRef[0]));
+ return 0;
}
for(i=0; i<=sCheck.nPage; i++){ sCheck.anRef[i] = 0; }
i = PENDING_BYTE_PAGE(pBt);
if( i<=sCheck.nPage ){
sCheck.anRef[i] = 1;
}
- sCheck.zErrMsg = 0;
+ sqlite3StrAccumInit(&sCheck.errMsg, zErr, sizeof(zErr), 20000);
/* Check the integrity of the freelist
*/
@@ -36681,14 +45213,14 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
/* Check all the tables.
*/
- for(i=0; i<nRoot && sCheck.mxErr; i++){
+ for(i=0; (int)i<nRoot && sCheck.mxErr; i++){
if( aRoot[i]==0 ) continue;
#ifndef SQLITE_OMIT_AUTOVACUUM
if( pBt->autoVacuum && aRoot[i]>1 ){
checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0, 0);
}
#endif
- checkTreePage(&sCheck, aRoot[i], 0, "List of tree roots: ");
+ checkTreePage(&sCheck, aRoot[i], "List of tree roots: ");
}
/* Make sure every page in the file is referenced
@@ -36713,10 +45245,11 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
#endif
}
- /* Make sure this analysis did not leave any unref() pages
+ /* Make sure this analysis did not leave any unref() pages.
+ ** This is an internal consistency check; an integrity check
+ ** of the integrity check.
*/
- unlockBtreeIfUnused(pBt);
- if( nRef != sqlite3PagerRefcount(pBt->pPager) ){
+ if( NEVER(nRef != sqlite3PagerRefcount(pBt->pPager)) ){
checkAppendMsg(&sCheck, 0,
"Outstanding page count goes from %d to %d during this analysis",
nRef, sqlite3PagerRefcount(pBt->pPager)
@@ -36727,8 +45260,14 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
*/
sqlite3BtreeLeave(p);
sqlite3_free(sCheck.anRef);
+ if( sCheck.mallocFailed ){
+ sqlite3StrAccumReset(&sCheck.errMsg);
+ *pnErr = sCheck.nErr+1;
+ return 0;
+ }
*pnErr = sCheck.nErr;
- return sCheck.zErrMsg;
+ if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg);
+ return sqlite3StrAccumFinish(&sCheck.errMsg);
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
@@ -36744,17 +45283,6 @@ SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){
}
/*
-** Return the pathname of the directory that contains the database file.
-**
-** The pager directory name is invariant as long as the pager is
-** open so it is safe to access without the BtShared mutex.
-*/
-SQLITE_PRIVATE const char *sqlite3BtreeGetDirname(Btree *p){
- assert( p->pBt->pPager!=0 );
- return sqlite3PagerDirname(p->pBt->pPager);
-}
-
-/*
** Return the pathname of the journal file for this database. The return
** value of this routine is the same regardless of whether the journal file
** has been created or not.
@@ -36767,224 +45295,6 @@ SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){
return sqlite3PagerJournalname(p->pBt->pPager);
}
-#ifndef SQLITE_OMIT_VACUUM
-/*
-** Copy the complete content of pBtFrom into pBtTo. A transaction
-** must be active for both files.
-**
-** The size of file pTo may be reduced by this operation.
-** If anything goes wrong, the transaction on pTo is rolled back.
-**
-** If successful, CommitPhaseOne() may be called on pTo before returning.
-** The caller should finish committing the transaction on pTo by calling
-** sqlite3BtreeCommit().
-*/
-static int btreeCopyFile(Btree *pTo, Btree *pFrom){
- int rc = SQLITE_OK;
- Pgno i;
-
- Pgno nFromPage; /* Number of pages in pFrom */
- Pgno nToPage; /* Number of pages in pTo */
- Pgno nNewPage; /* Number of pages in pTo after the copy */
-
- Pgno iSkip; /* Pending byte page in pTo */
- int nToPageSize; /* Page size of pTo in bytes */
- int nFromPageSize; /* Page size of pFrom in bytes */
-
- BtShared *pBtTo = pTo->pBt;
- BtShared *pBtFrom = pFrom->pBt;
- pBtTo->db = pTo->db;
- pBtFrom->db = pFrom->db;
-
- nToPageSize = pBtTo->pageSize;
- nFromPageSize = pBtFrom->pageSize;
-
- if( pTo->inTrans!=TRANS_WRITE || pFrom->inTrans!=TRANS_WRITE ){
- return SQLITE_ERROR;
- }
- if( pBtTo->pCursor ){
- return SQLITE_BUSY;
- }
-
- nToPage = sqlite3PagerPagecount(pBtTo->pPager);
- nFromPage = sqlite3PagerPagecount(pBtFrom->pPager);
- iSkip = PENDING_BYTE_PAGE(pBtTo);
-
- /* Variable nNewPage is the number of pages required to store the
- ** contents of pFrom using the current page-size of pTo.
- */
- nNewPage = ((i64)nFromPage * (i64)nFromPageSize + (i64)nToPageSize - 1) /
- (i64)nToPageSize;
-
- for(i=1; rc==SQLITE_OK && (i<=nToPage || i<=nNewPage); i++){
-
- /* Journal the original page.
- **
- ** iSkip is the page number of the locking page (PENDING_BYTE_PAGE)
- ** in database *pTo (before the copy). This page is never written
- ** into the journal file. Unless i==iSkip or the page was not
- ** present in pTo before the copy operation, journal page i from pTo.
- */
- if( i!=iSkip && i<=nToPage ){
- DbPage *pDbPage = 0;
- rc = sqlite3PagerGet(pBtTo->pPager, i, &pDbPage);
- if( rc==SQLITE_OK ){
- rc = sqlite3PagerWrite(pDbPage);
- if( rc==SQLITE_OK && i>nFromPage ){
- /* Yeah. It seems wierd to call DontWrite() right after Write(). But
- ** that is because the names of those procedures do not exactly
- ** represent what they do. Write() really means "put this page in the
- ** rollback journal and mark it as dirty so that it will be written
- ** to the database file later." DontWrite() undoes the second part of
- ** that and prevents the page from being written to the database. The
- ** page is still on the rollback journal, though. And that is the
- ** whole point of this block: to put pages on the rollback journal.
- */
- sqlite3PagerDontWrite(pDbPage);
- }
- sqlite3PagerUnref(pDbPage);
- }
- }
-
- /* Overwrite the data in page i of the target database */
- if( rc==SQLITE_OK && i!=iSkip && i<=nNewPage ){
-
- DbPage *pToPage = 0;
- sqlite3_int64 iOff;
-
- rc = sqlite3PagerGet(pBtTo->pPager, i, &pToPage);
- if( rc==SQLITE_OK ){
- rc = sqlite3PagerWrite(pToPage);
- }
-
- for(
- iOff=(i-1)*nToPageSize;
- rc==SQLITE_OK && iOff<i*nToPageSize;
- iOff += nFromPageSize
- ){
- DbPage *pFromPage = 0;
- Pgno iFrom = (iOff/nFromPageSize)+1;
-
- if( iFrom==PENDING_BYTE_PAGE(pBtFrom) ){
- continue;
- }
-
- rc = sqlite3PagerGet(pBtFrom->pPager, iFrom, &pFromPage);
- if( rc==SQLITE_OK ){
- char *zTo = sqlite3PagerGetData(pToPage);
- char *zFrom = sqlite3PagerGetData(pFromPage);
- int nCopy;
-
- if( nFromPageSize>=nToPageSize ){
- zFrom += ((i-1)*nToPageSize - ((iFrom-1)*nFromPageSize));
- nCopy = nToPageSize;
- }else{
- zTo += (((iFrom-1)*nFromPageSize) - (i-1)*nToPageSize);
- nCopy = nFromPageSize;
- }
-
- memcpy(zTo, zFrom, nCopy);
- sqlite3PagerUnref(pFromPage);
- }
- }
-
- if( pToPage ) sqlite3PagerUnref(pToPage);
- }
- }
-
- /* If things have worked so far, the database file may need to be
- ** truncated. The complex part is that it may need to be truncated to
- ** a size that is not an integer multiple of nToPageSize - the current
- ** page size used by the pager associated with B-Tree pTo.
- **
- ** For example, say the page-size of pTo is 2048 bytes and the original
- ** number of pages is 5 (10 KB file). If pFrom has a page size of 1024
- ** bytes and 9 pages, then the file needs to be truncated to 9KB.
- */
- if( rc==SQLITE_OK ){
- if( nFromPageSize!=nToPageSize ){
- sqlite3_file *pFile = sqlite3PagerFile(pBtTo->pPager);
- i64 iSize = (i64)nFromPageSize * (i64)nFromPage;
- i64 iNow = (i64)((nToPage>nNewPage)?nToPage:nNewPage) * (i64)nToPageSize;
- i64 iPending = ((i64)PENDING_BYTE_PAGE(pBtTo)-1) *(i64)nToPageSize;
-
- assert( iSize<=iNow );
-
- /* Commit phase one syncs the journal file associated with pTo
- ** containing the original data. It does not sync the database file
- ** itself. After doing this it is safe to use OsTruncate() and other
- ** file APIs on the database file directly.
- */
- pBtTo->db = pTo->db;
- rc = sqlite3PagerCommitPhaseOne(pBtTo->pPager, 0, 0, 1);
- if( iSize<iNow && rc==SQLITE_OK ){
- rc = sqlite3OsTruncate(pFile, iSize);
- }
-
- /* The loop that copied data from database pFrom to pTo did not
- ** populate the locking page of database pTo. If the page-size of
- ** pFrom is smaller than that of pTo, this means some data will
- ** not have been copied.
- **
- ** This block copies the missing data from database pFrom to pTo
- ** using file APIs. This is safe because at this point we know that
- ** all of the original data from pTo has been synced into the
- ** journal file. At this point it would be safe to do anything at
- ** all to the database file except truncate it to zero bytes.
- */
- if( rc==SQLITE_OK && nFromPageSize<nToPageSize && iSize>iPending){
- i64 iOff;
- for(
- iOff=iPending;
- rc==SQLITE_OK && iOff<(iPending+nToPageSize);
- iOff += nFromPageSize
- ){
- DbPage *pFromPage = 0;
- Pgno iFrom = (iOff/nFromPageSize)+1;
-
- if( iFrom==PENDING_BYTE_PAGE(pBtFrom) || iFrom>nFromPage ){
- continue;
- }
-
- rc = sqlite3PagerGet(pBtFrom->pPager, iFrom, &pFromPage);
- if( rc==SQLITE_OK ){
- char *zFrom = sqlite3PagerGetData(pFromPage);
- rc = sqlite3OsWrite(pFile, zFrom, nFromPageSize, iOff);
- sqlite3PagerUnref(pFromPage);
- }
- }
- }
-
- /* Sync the database file */
- if( rc==SQLITE_OK ){
- rc = sqlite3PagerSync(pBtTo->pPager);
- }
- }else{
- rc = sqlite3PagerTruncate(pBtTo->pPager, nNewPage);
- }
- if( rc==SQLITE_OK ){
- pBtTo->pageSizeFixed = 0;
- }
- }
-
- if( rc ){
- sqlite3BtreeRollback(pTo);
- }
-
- return rc;
-}
-SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){
- int rc;
- sqlite3BtreeEnter(pTo);
- sqlite3BtreeEnter(pFrom);
- rc = btreeCopyFile(pTo, pFrom);
- sqlite3BtreeLeave(pFrom);
- sqlite3BtreeLeave(pTo);
- return rc;
-}
-
-#endif /* SQLITE_OMIT_VACUUM */
-
/*
** Return non-zero if a transaction is active.
*/
@@ -36994,19 +45304,18 @@ SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){
}
/*
-** Return non-zero if a statement transaction is active.
-*/
-SQLITE_PRIVATE int sqlite3BtreeIsInStmt(Btree *p){
- assert( sqlite3BtreeHoldsMutex(p) );
- return (p->pBt && p->pBt->inStmt);
-}
-
-/*
** Return non-zero if a read (or write) transaction is active.
*/
SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){
+ assert( p );
+ assert( sqlite3_mutex_held(p->db->mutex) );
+ return p->inTrans!=TRANS_NONE;
+}
+
+SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){
+ assert( p );
assert( sqlite3_mutex_held(p->db->mutex) );
- return (p && (p->inTrans!=TRANS_NONE));
+ return p->nBackup!=0;
}
/*
@@ -37020,6 +45329,10 @@ SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){
** call the nBytes parameter is ignored and a pointer to the same blob
** of memory returned.
**
+** If the nBytes parameter is 0 and the blob of memory has not yet been
+** allocated, a null pointer is returned. If the blob has already been
+** allocated, it is returned as normal.
+**
** Just before the shared-btree is closed, the function passed as the
** xFree argument when the memory allocation was made is invoked on the
** blob of allocated memory. This function should not call sqlite3_free()
@@ -37028,7 +45341,7 @@ SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){
SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){
BtShared *pBt = p->pBt;
sqlite3BtreeEnter(p);
- if( !pBt->pSchema ){
+ if( !pBt->pSchema && nBytes ){
pBt->pSchema = sqlite3MallocZero(nBytes);
pBt->xFreeSchema = xFree;
}
@@ -37037,14 +45350,16 @@ SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void
}
/*
-** Return true if another user of the same shared btree as the argument
-** handle holds an exclusive lock on the sqlite_master table.
+** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared
+** btree as the argument handle holds an exclusive lock on the
+** sqlite_master table. Otherwise SQLITE_OK.
*/
SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){
int rc;
assert( sqlite3_mutex_held(p->db->mutex) );
sqlite3BtreeEnter(p);
- rc = (queryTableLock(p, MASTER_ROOT, READ_LOCK)!=SQLITE_OK);
+ rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
+ assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE );
sqlite3BtreeLeave(p);
return rc;
}
@@ -37058,14 +45373,16 @@ SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){
*/
SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){
int rc = SQLITE_OK;
+ assert( p->inTrans!=TRANS_NONE );
if( p->sharable ){
u8 lockType = READ_LOCK + isWriteLock;
assert( READ_LOCK+1==WRITE_LOCK );
assert( isWriteLock==0 || isWriteLock==1 );
+
sqlite3BtreeEnter(p);
- rc = queryTableLock(p, iTab, lockType);
+ rc = querySharedCacheTableLock(p, iTab, lockType);
if( rc==SQLITE_OK ){
- rc = lockTable(p, iTab, lockType);
+ rc = setSharedCacheTableLock(p, iTab, lockType);
}
sqlite3BtreeLeave(p);
}
@@ -37078,39 +45395,43 @@ SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){
** Argument pCsr must be a cursor opened for writing on an
** INTKEY table currently pointing at a valid table entry.
** This function modifies the data stored as part of that entry.
-** Only the data content may only be modified, it is not possible
-** to change the length of the data stored.
+**
+** Only the data content may only be modified, it is not possible to
+** change the length of the data stored. If this function is called with
+** parameters that attempt to write past the end of the existing data,
+** no modifications are made and SQLITE_CORRUPT is returned.
*/
SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){
+ int rc;
assert( cursorHoldsMutex(pCsr) );
assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) );
- assert(pCsr->isIncrblobHandle);
- if( pCsr->eState>=CURSOR_REQUIRESEEK ){
- if( pCsr->eState==CURSOR_FAULT ){
- return pCsr->skip;
- }else{
- return SQLITE_ABORT;
- }
+ assert( pCsr->isIncrblobHandle );
+
+ rc = restoreCursorPosition(pCsr);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ assert( pCsr->eState!=CURSOR_REQUIRESEEK );
+ if( pCsr->eState!=CURSOR_VALID ){
+ return SQLITE_ABORT;
}
- /* Check some preconditions:
+ /* Check some assumptions:
** (a) the cursor is open for writing,
- ** (b) there is no read-lock on the table being modified and
- ** (c) the cursor points at a valid row of an intKey table.
+ ** (b) there is a read/write transaction open,
+ ** (c) the connection holds a write-lock on the table (if required),
+ ** (d) there are no conflicting read-locks, and
+ ** (e) the cursor points at a valid row of an intKey table.
*/
if( !pCsr->wrFlag ){
return SQLITE_READONLY;
}
- assert( !pCsr->pBt->readOnly
- && pCsr->pBt->inTransaction==TRANS_WRITE );
- if( checkReadLocks(pCsr->pBtree, pCsr->pgnoRoot, pCsr) ){
- return SQLITE_LOCKED; /* The table pCur points to has a read lock */
- }
- if( pCsr->eState==CURSOR_INVALID || !pCsr->pPage->intKey ){
- return SQLITE_ERROR;
- }
+ assert( !pCsr->pBt->readOnly && pCsr->pBt->inTransaction==TRANS_WRITE );
+ assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) );
+ assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) );
+ assert( pCsr->apPage[pCsr->iPage]->intKey );
- return accessPayload(pCsr, offset, amt, (unsigned char *)z, 0, 1);
+ return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1);
}
/*
@@ -37133,9 +45454,9 @@ SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *pCur){
#endif
/************** End of btree.c ***********************************************/
-/************** Begin file vdbefifo.c ****************************************/
+/************** Begin file backup.c ******************************************/
/*
-** 2005 June 16
+** 2009 January 28
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
@@ -37145,121 +45466,625 @@ SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *pCur){
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file implements a FIFO queue of rowids used for processing
-** UPDATE and DELETE statements.
+** This file contains the implementation of the sqlite3_backup_XXX()
+** API functions and the related features.
+**
+** $Id: backup.c,v 1.19 2009/07/06 19:03:13 drh Exp $
*/
-/*
-** Constants FIFOSIZE_FIRST and FIFOSIZE_MAX are the initial
-** number of entries in a fifo page and the maximum number of
-** entries in a fifo page.
+/* Macro to find the minimum of two numeric values.
*/
-#define FIFOSIZE_FIRST (((128-sizeof(FifoPage))/8)+1)
-#ifdef SQLITE_MALLOC_SOFT_LIMIT
-# define FIFOSIZE_MAX (((SQLITE_MALLOC_SOFT_LIMIT-sizeof(FifoPage))/8)+1)
-#else
-# define FIFOSIZE_MAX (((262144-sizeof(FifoPage))/8)+1)
+#ifndef MIN
+# define MIN(x,y) ((x)<(y)?(x):(y))
#endif
/*
-** Allocate a new FifoPage and return a pointer to it. Return NULL if
-** we run out of memory. Leave space on the page for nEntry entries.
+** Structure allocated for each backup operation.
*/
-static FifoPage *allocateFifoPage(int nEntry){
- FifoPage *pPage;
- if( nEntry>FIFOSIZE_MAX ){
- nEntry = FIFOSIZE_MAX;
+struct sqlite3_backup {
+ sqlite3* pDestDb; /* Destination database handle */
+ Btree *pDest; /* Destination b-tree file */
+ u32 iDestSchema; /* Original schema cookie in destination */
+ int bDestLocked; /* True once a write-transaction is open on pDest */
+
+ Pgno iNext; /* Page number of the next source page to copy */
+ sqlite3* pSrcDb; /* Source database handle */
+ Btree *pSrc; /* Source b-tree file */
+
+ int rc; /* Backup process error code */
+
+ /* These two variables are set by every call to backup_step(). They are
+ ** read by calls to backup_remaining() and backup_pagecount().
+ */
+ Pgno nRemaining; /* Number of pages left to copy */
+ Pgno nPagecount; /* Total number of pages to copy */
+
+ int isAttached; /* True once backup has been registered with pager */
+ sqlite3_backup *pNext; /* Next backup associated with source pager */
+};
+
+/*
+** THREAD SAFETY NOTES:
+**
+** Once it has been created using backup_init(), a single sqlite3_backup
+** structure may be accessed via two groups of thread-safe entry points:
+**
+** * Via the sqlite3_backup_XXX() API function backup_step() and
+** backup_finish(). Both these functions obtain the source database
+** handle mutex and the mutex associated with the source BtShared
+** structure, in that order.
+**
+** * Via the BackupUpdate() and BackupRestart() functions, which are
+** invoked by the pager layer to report various state changes in
+** the page cache associated with the source database. The mutex
+** associated with the source database BtShared structure will always
+** be held when either of these functions are invoked.
+**
+** The other sqlite3_backup_XXX() API functions, backup_remaining() and
+** backup_pagecount() are not thread-safe functions. If they are called
+** while some other thread is calling backup_step() or backup_finish(),
+** the values returned may be invalid. There is no way for a call to
+** BackupUpdate() or BackupRestart() to interfere with backup_remaining()
+** or backup_pagecount().
+**
+** Depending on the SQLite configuration, the database handles and/or
+** the Btree objects may have their own mutexes that require locking.
+** Non-sharable Btrees (in-memory databases for example), do not have
+** associated mutexes.
+*/
+
+/*
+** Return a pointer corresponding to database zDb (i.e. "main", "temp")
+** in connection handle pDb. If such a database cannot be found, return
+** a NULL pointer and write an error message to pErrorDb.
+**
+** If the "temp" database is requested, it may need to be opened by this
+** function. If an error occurs while doing so, return 0 and write an
+** error message to pErrorDb.
+*/
+static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){
+ int i = sqlite3FindDbName(pDb, zDb);
+
+ if( i==1 ){
+ Parse *pParse;
+ int rc = 0;
+ pParse = sqlite3StackAllocZero(pErrorDb, sizeof(*pParse));
+ if( pParse==0 ){
+ sqlite3Error(pErrorDb, SQLITE_NOMEM, "out of memory");
+ rc = SQLITE_NOMEM;
+ }else{
+ pParse->db = pDb;
+ if( sqlite3OpenTempDatabase(pParse) ){
+ sqlite3ErrorClear(pParse);
+ sqlite3Error(pErrorDb, pParse->rc, "%s", pParse->zErrMsg);
+ rc = SQLITE_ERROR;
+ }
+ sqlite3StackFree(pErrorDb, pParse);
+ }
+ if( rc ){
+ return 0;
+ }
}
- pPage = sqlite3_malloc( sizeof(FifoPage) + sizeof(i64)*(nEntry-1) );
- if( pPage ){
- pPage->nSlot = nEntry;
- pPage->iWrite = 0;
- pPage->iRead = 0;
- pPage->pNext = 0;
+
+ if( i<0 ){
+ sqlite3Error(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb);
+ return 0;
+ }
+
+ return pDb->aDb[i].pBt;
+}
+
+/*
+** Create an sqlite3_backup process to copy the contents of zSrcDb from
+** connection handle pSrcDb to zDestDb in pDestDb. If successful, return
+** a pointer to the new sqlite3_backup object.
+**
+** If an error occurs, NULL is returned and an error code and error message
+** stored in database handle pDestDb.
+*/
+SQLITE_API sqlite3_backup *sqlite3_backup_init(
+ sqlite3* pDestDb, /* Database to write to */
+ const char *zDestDb, /* Name of database within pDestDb */
+ sqlite3* pSrcDb, /* Database connection to read from */
+ const char *zSrcDb /* Name of database within pSrcDb */
+){
+ sqlite3_backup *p; /* Value to return */
+
+ /* Lock the source database handle. The destination database
+ ** handle is not locked in this routine, but it is locked in
+ ** sqlite3_backup_step(). The user is required to ensure that no
+ ** other thread accesses the destination handle for the duration
+ ** of the backup operation. Any attempt to use the destination
+ ** database connection while a backup is in progress may cause
+ ** a malfunction or a deadlock.
+ */
+ sqlite3_mutex_enter(pSrcDb->mutex);
+ sqlite3_mutex_enter(pDestDb->mutex);
+
+ if( pSrcDb==pDestDb ){
+ sqlite3Error(
+ pDestDb, SQLITE_ERROR, "source and destination must be distinct"
+ );
+ p = 0;
+ }else {
+ /* Allocate space for a new sqlite3_backup object */
+ p = (sqlite3_backup *)sqlite3_malloc(sizeof(sqlite3_backup));
+ if( !p ){
+ sqlite3Error(pDestDb, SQLITE_NOMEM, 0);
+ }
+ }
+
+ /* If the allocation succeeded, populate the new object. */
+ if( p ){
+ memset(p, 0, sizeof(sqlite3_backup));
+ p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb);
+ p->pDest = findBtree(pDestDb, pDestDb, zDestDb);
+ p->pDestDb = pDestDb;
+ p->pSrcDb = pSrcDb;
+ p->iNext = 1;
+ p->isAttached = 0;
+
+ if( 0==p->pSrc || 0==p->pDest ){
+ /* One (or both) of the named databases did not exist. An error has
+ ** already been written into the pDestDb handle. All that is left
+ ** to do here is free the sqlite3_backup structure.
+ */
+ sqlite3_free(p);
+ p = 0;
+ }
+ }
+ if( p ){
+ p->pSrc->nBackup++;
}
- return pPage;
+
+ sqlite3_mutex_leave(pDestDb->mutex);
+ sqlite3_mutex_leave(pSrcDb->mutex);
+ return p;
}
/*
-** Initialize a Fifo structure.
+** Argument rc is an SQLite error code. Return true if this error is
+** considered fatal if encountered during a backup operation. All errors
+** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED.
*/
-SQLITE_PRIVATE void sqlite3VdbeFifoInit(Fifo *pFifo){
- memset(pFifo, 0, sizeof(*pFifo));
+static int isFatalError(int rc){
+ return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && ALWAYS(rc!=SQLITE_LOCKED));
}
/*
-** Push a single 64-bit integer value into the Fifo. Return SQLITE_OK
-** normally. SQLITE_NOMEM is returned if we are unable to allocate
-** memory.
+** Parameter zSrcData points to a buffer containing the data for
+** page iSrcPg from the source database. Copy this data into the
+** destination database.
*/
-SQLITE_PRIVATE int sqlite3VdbeFifoPush(Fifo *pFifo, i64 val){
- FifoPage *pPage;
- pPage = pFifo->pLast;
- if( pPage==0 ){
- pPage = pFifo->pLast = pFifo->pFirst = allocateFifoPage(FIFOSIZE_FIRST);
- if( pPage==0 ){
- return SQLITE_NOMEM;
- }
- }else if( pPage->iWrite>=pPage->nSlot ){
- pPage->pNext = allocateFifoPage(pFifo->nEntry);
- if( pPage->pNext==0 ){
- return SQLITE_NOMEM;
+static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
+ Pager * const pDestPager = sqlite3BtreePager(p->pDest);
+ const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc);
+ int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest);
+ const int nCopy = MIN(nSrcPgsz, nDestPgsz);
+ const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz;
+
+ int rc = SQLITE_OK;
+ i64 iOff;
+
+ assert( p->bDestLocked );
+ assert( !isFatalError(p->rc) );
+ assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) );
+ assert( zSrcData );
+
+ /* Catch the case where the destination is an in-memory database and the
+ ** page sizes of the source and destination differ.
+ */
+ if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(sqlite3BtreePager(p->pDest)) ){
+ rc = SQLITE_READONLY;
+ }
+
+ /* This loop runs once for each destination page spanned by the source
+ ** page. For each iteration, variable iOff is set to the byte offset
+ ** of the destination page.
+ */
+ for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOff<iEnd; iOff+=nDestPgsz){
+ DbPage *pDestPg = 0;
+ Pgno iDest = (Pgno)(iOff/nDestPgsz)+1;
+ if( iDest==PENDING_BYTE_PAGE(p->pDest->pBt) ) continue;
+ if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg))
+ && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg))
+ ){
+ const u8 *zIn = &zSrcData[iOff%nSrcPgsz];
+ u8 *zDestData = sqlite3PagerGetData(pDestPg);
+ u8 *zOut = &zDestData[iOff%nDestPgsz];
+
+ /* Copy the data from the source page into the destination page.
+ ** Then clear the Btree layer MemPage.isInit flag. Both this module
+ ** and the pager code use this trick (clearing the first byte
+ ** of the page 'extra' space to invalidate the Btree layers
+ ** cached parse of the page). MemPage.isInit is marked
+ ** "MUST BE FIRST" for this purpose.
+ */
+ memcpy(zOut, zIn, nCopy);
+ ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0;
}
- pPage = pFifo->pLast = pPage->pNext;
+ sqlite3PagerUnref(pDestPg);
}
- pPage->aSlot[pPage->iWrite++] = val;
- pFifo->nEntry++;
- return SQLITE_OK;
+
+ return rc;
}
/*
-** Extract a single 64-bit integer value from the Fifo. The integer
-** extracted is the one least recently inserted. If the Fifo is empty
-** return SQLITE_DONE.
+** If pFile is currently larger than iSize bytes, then truncate it to
+** exactly iSize bytes. If pFile is not larger than iSize bytes, then
+** this function is a no-op.
+**
+** Return SQLITE_OK if everything is successful, or an SQLite error
+** code if an error occurs.
*/
-SQLITE_PRIVATE int sqlite3VdbeFifoPop(Fifo *pFifo, i64 *pVal){
- FifoPage *pPage;
- if( pFifo->nEntry==0 ){
- return SQLITE_DONE;
+static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){
+ i64 iCurrent;
+ int rc = sqlite3OsFileSize(pFile, &iCurrent);
+ if( rc==SQLITE_OK && iCurrent>iSize ){
+ rc = sqlite3OsTruncate(pFile, iSize);
+ }
+ return rc;
+}
+
+/*
+** Register this backup object with the associated source pager for
+** callbacks when pages are changed or the cache invalidated.
+*/
+static void attachBackupObject(sqlite3_backup *p){
+ sqlite3_backup **pp;
+ assert( sqlite3BtreeHoldsMutex(p->pSrc) );
+ pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
+ p->pNext = *pp;
+ *pp = p;
+ p->isAttached = 1;
+}
+
+/*
+** Copy nPage pages from the source b-tree to the destination.
+*/
+SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
+ int rc;
+
+ sqlite3_mutex_enter(p->pSrcDb->mutex);
+ sqlite3BtreeEnter(p->pSrc);
+ if( p->pDestDb ){
+ sqlite3_mutex_enter(p->pDestDb->mutex);
}
- assert( pFifo->nEntry>0 );
- pPage = pFifo->pFirst;
- assert( pPage!=0 );
- assert( pPage->iWrite>pPage->iRead );
- assert( pPage->iWrite<=pPage->nSlot );
- assert( pPage->iRead<pPage->nSlot );
- assert( pPage->iRead>=0 );
- *pVal = pPage->aSlot[pPage->iRead++];
- pFifo->nEntry--;
- if( pPage->iRead>=pPage->iWrite ){
- pFifo->pFirst = pPage->pNext;
- sqlite3_free(pPage);
- if( pFifo->nEntry==0 ){
- assert( pFifo->pLast==pPage );
- pFifo->pLast = 0;
+
+ rc = p->rc;
+ if( !isFatalError(rc) ){
+ Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */
+ Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */
+ int ii; /* Iterator variable */
+ int nSrcPage = -1; /* Size of source db in pages */
+ int bCloseTrans = 0; /* True if src db requires unlocking */
+
+ /* If the source pager is currently in a write-transaction, return
+ ** SQLITE_BUSY immediately.
+ */
+ if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){
+ rc = SQLITE_BUSY;
}else{
- assert( pFifo->pFirst!=0 );
+ rc = SQLITE_OK;
}
- }else{
- assert( pFifo->nEntry>0 );
+
+ /* Lock the destination database, if it is not locked already. */
+ if( SQLITE_OK==rc && p->bDestLocked==0
+ && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2))
+ ){
+ p->bDestLocked = 1;
+ sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema);
+ }
+
+ /* If there is no open read-transaction on the source database, open
+ ** one now. If a transaction is opened here, then it will be closed
+ ** before this function exits.
+ */
+ if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
+ rc = sqlite3BtreeBeginTrans(p->pSrc, 0);
+ bCloseTrans = 1;
+ }
+
+ /* Now that there is a read-lock on the source database, query the
+ ** source pager for the number of pages in the database.
+ */
+ if( rc==SQLITE_OK ){
+ rc = sqlite3PagerPagecount(pSrcPager, &nSrcPage);
+ }
+ for(ii=0; (nPage<0 || ii<nPage) && p->iNext<=(Pgno)nSrcPage && !rc; ii++){
+ const Pgno iSrcPg = p->iNext; /* Source page number */
+ if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){
+ DbPage *pSrcPg; /* Source page object */
+ rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
+ if( rc==SQLITE_OK ){
+ rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg));
+ sqlite3PagerUnref(pSrcPg);
+ }
+ }
+ p->iNext++;
+ }
+ if( rc==SQLITE_OK ){
+ p->nPagecount = nSrcPage;
+ p->nRemaining = nSrcPage+1-p->iNext;
+ if( p->iNext>(Pgno)nSrcPage ){
+ rc = SQLITE_DONE;
+ }else if( !p->isAttached ){
+ attachBackupObject(p);
+ }
+ }
+
+ /* Update the schema version field in the destination database. This
+ ** is to make sure that the schema-version really does change in
+ ** the case where the source and destination databases have the
+ ** same schema version.
+ */
+ if( rc==SQLITE_DONE
+ && (rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1))==SQLITE_OK
+ ){
+ const int nSrcPagesize = sqlite3BtreeGetPageSize(p->pSrc);
+ const int nDestPagesize = sqlite3BtreeGetPageSize(p->pDest);
+ int nDestTruncate;
+
+ if( p->pDestDb ){
+ sqlite3ResetInternalSchema(p->pDestDb, 0);
+ }
+
+ /* Set nDestTruncate to the final number of pages in the destination
+ ** database. The complication here is that the destination page
+ ** size may be different to the source page size.
+ **
+ ** If the source page size is smaller than the destination page size,
+ ** round up. In this case the call to sqlite3OsTruncate() below will
+ ** fix the size of the file. However it is important to call
+ ** sqlite3PagerTruncateImage() here so that any pages in the
+ ** destination file that lie beyond the nDestTruncate page mark are
+ ** journalled by PagerCommitPhaseOne() before they are destroyed
+ ** by the file truncation.
+ */
+ if( nSrcPagesize<nDestPagesize ){
+ int ratio = nDestPagesize/nSrcPagesize;
+ nDestTruncate = (nSrcPage+ratio-1)/ratio;
+ if( nDestTruncate==(int)PENDING_BYTE_PAGE(p->pDest->pBt) ){
+ nDestTruncate--;
+ }
+ }else{
+ nDestTruncate = nSrcPage * (nSrcPagesize/nDestPagesize);
+ }
+ sqlite3PagerTruncateImage(pDestPager, nDestTruncate);
+
+ if( nSrcPagesize<nDestPagesize ){
+ /* If the source page-size is smaller than the destination page-size,
+ ** two extra things may need to happen:
+ **
+ ** * The destination may need to be truncated, and
+ **
+ ** * Data stored on the pages immediately following the
+ ** pending-byte page in the source database may need to be
+ ** copied into the destination database.
+ */
+ const i64 iSize = (i64)nSrcPagesize * (i64)nSrcPage;
+ sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
+
+ assert( pFile );
+ assert( (i64)nDestTruncate*(i64)nDestPagesize >= iSize || (
+ nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
+ && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+nDestPagesize
+ ));
+ if( SQLITE_OK==(rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1))
+ && SQLITE_OK==(rc = backupTruncateFile(pFile, iSize))
+ && SQLITE_OK==(rc = sqlite3PagerSync(pDestPager))
+ ){
+ i64 iOff;
+ i64 iEnd = MIN(PENDING_BYTE + nDestPagesize, iSize);
+ for(
+ iOff=PENDING_BYTE+nSrcPagesize;
+ rc==SQLITE_OK && iOff<iEnd;
+ iOff+=nSrcPagesize
+ ){
+ PgHdr *pSrcPg = 0;
+ const Pgno iSrcPg = (Pgno)((iOff/nSrcPagesize)+1);
+ rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
+ if( rc==SQLITE_OK ){
+ u8 *zData = sqlite3PagerGetData(pSrcPg);
+ rc = sqlite3OsWrite(pFile, zData, nSrcPagesize, iOff);
+ }
+ sqlite3PagerUnref(pSrcPg);
+ }
+ }
+ }else{
+ rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 0);
+ }
+
+ /* Finish committing the transaction to the destination database. */
+ if( SQLITE_OK==rc
+ && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest))
+ ){
+ rc = SQLITE_DONE;
+ }
+ }
+
+ /* If bCloseTrans is true, then this function opened a read transaction
+ ** on the source database. Close the read transaction here. There is
+ ** no need to check the return values of the btree methods here, as
+ ** "committing" a read-only transaction cannot fail.
+ */
+ if( bCloseTrans ){
+ TESTONLY( int rc2 );
+ TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0);
+ TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc);
+ assert( rc2==SQLITE_OK );
+ }
+
+ p->rc = rc;
}
- return SQLITE_OK;
+ if( p->pDestDb ){
+ sqlite3_mutex_leave(p->pDestDb->mutex);
+ }
+ sqlite3BtreeLeave(p->pSrc);
+ sqlite3_mutex_leave(p->pSrcDb->mutex);
+ return rc;
+}
+
+/*
+** Release all resources associated with an sqlite3_backup* handle.
+*/
+SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){
+ sqlite3_backup **pp; /* Ptr to head of pagers backup list */
+ sqlite3_mutex *mutex; /* Mutex to protect source database */
+ int rc; /* Value to return */
+
+ /* Enter the mutexes */
+ if( p==0 ) return SQLITE_OK;
+ sqlite3_mutex_enter(p->pSrcDb->mutex);
+ sqlite3BtreeEnter(p->pSrc);
+ mutex = p->pSrcDb->mutex;
+ if( p->pDestDb ){
+ sqlite3_mutex_enter(p->pDestDb->mutex);
+ }
+
+ /* Detach this backup from the source pager. */
+ if( p->pDestDb ){
+ p->pSrc->nBackup--;
+ }
+ if( p->isAttached ){
+ pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
+ while( *pp!=p ){
+ pp = &(*pp)->pNext;
+ }
+ *pp = p->pNext;
+ }
+
+ /* If a transaction is still open on the Btree, roll it back. */
+ sqlite3BtreeRollback(p->pDest);
+
+ /* Set the error code of the destination database handle. */
+ rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc;
+ sqlite3Error(p->pDestDb, rc, 0);
+
+ /* Exit the mutexes and free the backup context structure. */
+ if( p->pDestDb ){
+ sqlite3_mutex_leave(p->pDestDb->mutex);
+ }
+ sqlite3BtreeLeave(p->pSrc);
+ if( p->pDestDb ){
+ sqlite3_free(p);
+ }
+ sqlite3_mutex_leave(mutex);
+ return rc;
+}
+
+/*
+** Return the number of pages still to be backed up as of the most recent
+** call to sqlite3_backup_step().
+*/
+SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){
+ return p->nRemaining;
+}
+
+/*
+** Return the total number of pages in the source database as of the most
+** recent call to sqlite3_backup_step().
+*/
+SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){
+ return p->nPagecount;
}
/*
-** Delete all information from a Fifo object. Free all memory held
-** by the Fifo.
+** This function is called after the contents of page iPage of the
+** source database have been modified. If page iPage has already been
+** copied into the destination database, then the data written to the
+** destination is now invalidated. The destination copy of iPage needs
+** to be updated with the new data before the backup operation is
+** complete.
+**
+** It is assumed that the mutex associated with the BtShared object
+** corresponding to the source database is held when this function is
+** called.
+*/
+SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){
+ sqlite3_backup *p; /* Iterator variable */
+ for(p=pBackup; p; p=p->pNext){
+ assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
+ if( !isFatalError(p->rc) && iPage<p->iNext ){
+ /* The backup process p has already copied page iPage. But now it
+ ** has been modified by a transaction on the source pager. Copy
+ ** the new data into the backup.
+ */
+ int rc = backupOnePage(p, iPage, aData);
+ assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED );
+ if( rc!=SQLITE_OK ){
+ p->rc = rc;
+ }
+ }
+ }
+}
+
+/*
+** Restart the backup process. This is called when the pager layer
+** detects that the database has been modified by an external database
+** connection. In this case there is no way of knowing which of the
+** pages that have been copied into the destination database are still
+** valid and which are not, so the entire process needs to be restarted.
+**
+** It is assumed that the mutex associated with the BtShared object
+** corresponding to the source database is held when this function is
+** called.
+*/
+SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){
+ sqlite3_backup *p; /* Iterator variable */
+ for(p=pBackup; p; p=p->pNext){
+ assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
+ p->iNext = 1;
+ }
+}
+
+#ifndef SQLITE_OMIT_VACUUM
+/*
+** Copy the complete content of pBtFrom into pBtTo. A transaction
+** must be active for both files.
+**
+** The size of file pTo may be reduced by this operation. If anything
+** goes wrong, the transaction on pTo is rolled back. If successful, the
+** transaction is committed before returning.
*/
-SQLITE_PRIVATE void sqlite3VdbeFifoClear(Fifo *pFifo){
- FifoPage *pPage, *pNextPage;
- for(pPage=pFifo->pFirst; pPage; pPage=pNextPage){
- pNextPage = pPage->pNext;
- sqlite3_free(pPage);
+SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){
+ int rc;
+ sqlite3_backup b;
+ sqlite3BtreeEnter(pTo);
+ sqlite3BtreeEnter(pFrom);
+
+ /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set
+ ** to 0. This is used by the implementations of sqlite3_backup_step()
+ ** and sqlite3_backup_finish() to detect that they are being called
+ ** from this function, not directly by the user.
+ */
+ memset(&b, 0, sizeof(b));
+ b.pSrcDb = pFrom->db;
+ b.pSrc = pFrom;
+ b.pDest = pTo;
+ b.iNext = 1;
+
+ /* 0x7FFFFFFF is the hard limit for the number of pages in a database
+ ** file. By passing this as the number of pages to copy to
+ ** sqlite3_backup_step(), we can guarantee that the copy finishes
+ ** within a single call (unless an error occurs). The assert() statement
+ ** checks this assumption - (p->rc) should be set to either SQLITE_DONE
+ ** or an error code.
+ */
+ sqlite3_backup_step(&b, 0x7FFFFFFF);
+ assert( b.rc!=SQLITE_OK );
+ rc = sqlite3_backup_finish(&b);
+ if( rc==SQLITE_OK ){
+ pTo->pBt->pageSizeFixed = 0;
}
- sqlite3VdbeFifoInit(pFifo);
+
+ sqlite3BtreeLeave(pFrom);
+ sqlite3BtreeLeave(pTo);
+ return rc;
}
+#endif /* SQLITE_OMIT_VACUUM */
-/************** End of vdbefifo.c ********************************************/
+/************** End of backup.c **********************************************/
/************** Begin file vdbemem.c *****************************************/
/*
** 2004 May 26
@@ -37277,6 +46102,8 @@ SQLITE_PRIVATE void sqlite3VdbeFifoClear(Fifo *pFifo){
** stores a single value in the VDBE. Mem is an opaque structure visible
** only within the VDBE. Interface routines refer to a Mem using the
** name sqlite_value
+**
+** $Id: vdbemem.c,v 1.152 2009/07/22 18:07:41 drh Exp $
*/
/*
@@ -37300,6 +46127,9 @@ SQLITE_PRIVATE void sqlite3VdbeFifoClear(Fifo *pFifo){
*/
SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
int rc;
+ assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
+ || desiredEnc==SQLITE_UTF16BE );
if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
return SQLITE_OK;
}
@@ -37311,7 +46141,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
/* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
** then the encoding of the value may not have changed.
*/
- rc = sqlite3VdbeMemTranslate(pMem, desiredEnc);
+ rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc);
assert(rc==SQLITE_OK || rc==SQLITE_NOMEM);
assert(rc==SQLITE_OK || pMem->enc!=desiredEnc);
assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
@@ -37339,22 +46169,20 @@ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){
((pMem->flags&MEM_Ephem) ? 1 : 0) +
((pMem->flags&MEM_Static) ? 1 : 0)
);
+ assert( (pMem->flags&MEM_RowSet)==0 );
- if( !pMem->zMalloc || sqlite3MallocSize(pMem->zMalloc)<n ){
- n = (n>32?n:32);
+ if( n<32 ) n = 32;
+ if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)<n ){
if( preserve && pMem->z==pMem->zMalloc ){
pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n);
- if( !pMem->z ){
- pMem->flags = MEM_Null;
- }
preserve = 0;
}else{
- sqlite3_free(pMem->zMalloc);
+ sqlite3DbFree(pMem->db, pMem->zMalloc);
pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n);
}
}
- if( preserve && pMem->z && pMem->zMalloc && pMem->z!=pMem->zMalloc ){
+ if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){
memcpy(pMem->zMalloc, pMem->z, pMem->n);
}
if( pMem->flags&MEM_Dyn && pMem->xDel ){
@@ -37362,19 +46190,27 @@ SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){
}
pMem->z = pMem->zMalloc;
- pMem->flags &= ~(MEM_Ephem|MEM_Static);
+ if( pMem->z==0 ){
+ pMem->flags = MEM_Null;
+ }else{
+ pMem->flags &= ~(MEM_Ephem|MEM_Static);
+ }
pMem->xDel = 0;
return (pMem->z ? SQLITE_OK : SQLITE_NOMEM);
}
/*
-** Make the given Mem object MEM_Dyn.
+** Make the given Mem object MEM_Dyn. In other words, make it so
+** that any TEXT or BLOB content is stored in memory obtained from
+** malloc(). In this way, we know that the memory is safe to be
+** overwritten or altered.
**
** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
*/
-SQLITE_PRIVATE int sqlite3VdbeMemDynamicify(Mem *pMem){
+SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
int f;
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( (pMem->flags&MEM_RowSet)==0 );
expandBlob(pMem);
f = pMem->flags;
if( (f&(MEM_Str|MEM_Blob)) && pMem->z!=pMem->zMalloc ){
@@ -37398,10 +46234,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
if( pMem->flags & MEM_Zero ){
int nByte;
assert( pMem->flags&MEM_Blob );
+ assert( (pMem->flags&MEM_RowSet)==0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
/* Set nByte to the number of bytes required to store the expanded blob. */
- nByte = pMem->n + pMem->u.i;
+ nByte = pMem->n + pMem->u.nZero;
if( nByte<=0 ){
nByte = 1;
}
@@ -37409,8 +46246,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
return SQLITE_NOMEM;
}
- memset(&pMem->z[pMem->n], 0, pMem->u.i);
- pMem->n += pMem->u.i;
+ memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
+ pMem->n += pMem->u.nZero;
pMem->flags &= ~(MEM_Zero|MEM_Term);
}
return SQLITE_OK;
@@ -37419,16 +46256,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
/*
-** Make the given Mem object either MEM_Short or MEM_Dyn so that bytes
-** of the Mem.z[] array can be modified.
-**
-** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
-*/
-SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
- return sqlite3VdbeMemDynamicify(pMem);
-}
-
-/*
** Make sure the given Mem is \u0000 terminated.
*/
SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){
@@ -37467,6 +46294,9 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, int enc){
assert( !(fg&MEM_Zero) );
assert( !(fg&(MEM_Str|MEM_Blob)) );
assert( fg&(MEM_Int|MEM_Real) );
+ assert( (pMem->flags&MEM_RowSet)==0 );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
+
if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
return SQLITE_NOMEM;
@@ -37484,7 +46314,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, int enc){
assert( fg & MEM_Real );
sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
}
- pMem->n = strlen(pMem->z);
+ pMem->n = sqlite3Strlen30(pMem->z);
pMem->enc = SQLITE_UTF8;
pMem->flags |= MEM_Str|MEM_Term;
sqlite3VdbeChangeEncoding(pMem, enc);
@@ -37501,21 +46331,20 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, int enc){
*/
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
int rc = SQLITE_OK;
- if( pFunc && pFunc->xFinalize ){
+ if( ALWAYS(pFunc && pFunc->xFinalize) ){
sqlite3_context ctx;
assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ memset(&ctx, 0, sizeof(ctx));
ctx.s.flags = MEM_Null;
ctx.s.db = pMem->db;
- ctx.s.zMalloc = 0;
ctx.pMem = pMem;
ctx.pFunc = pFunc;
- ctx.isError = 0;
pFunc->xFinalize(&ctx);
assert( 0==(pMem->flags&MEM_Dyn) && !pMem->xDel );
- sqlite3_free(pMem->zMalloc);
- *pMem = ctx.s;
- rc = (ctx.isError?SQLITE_ERROR:SQLITE_OK);
+ sqlite3DbFree(pMem->db, pMem->zMalloc);
+ memcpy(pMem, &ctx.s, sizeof(ctx.s));
+ rc = ctx.isError;
}
return rc;
}
@@ -37527,13 +46356,24 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
*/
SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p){
assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) );
- if( p->flags&MEM_Agg ){
- sqlite3VdbeMemFinalize(p, p->u.pDef);
- assert( (p->flags & MEM_Agg)==0 );
- sqlite3VdbeMemRelease(p);
- }else if( p->flags&MEM_Dyn && p->xDel ){
- p->xDel((void *)p->z);
- p->xDel = 0;
+ testcase( p->flags & MEM_Agg );
+ testcase( p->flags & MEM_Dyn );
+ testcase( p->flags & MEM_RowSet );
+ testcase( p->flags & MEM_Frame );
+ if( p->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame) ){
+ if( p->flags&MEM_Agg ){
+ sqlite3VdbeMemFinalize(p, p->u.pDef);
+ assert( (p->flags & MEM_Agg)==0 );
+ sqlite3VdbeMemRelease(p);
+ }else if( p->flags&MEM_Dyn && p->xDel ){
+ assert( (p->flags&MEM_RowSet)==0 );
+ p->xDel((void *)p->z);
+ p->xDel = 0;
+ }else if( p->flags&MEM_RowSet ){
+ sqlite3RowSetClear(p->u.pRowSet);
+ }else if( p->flags&MEM_Frame ){
+ sqlite3VdbeMemSetNull(p);
+ }
}
}
@@ -37544,7 +46384,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p){
*/
SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){
sqlite3VdbeMemReleaseExternal(p);
- sqlite3_free(p->zMalloc);
+ sqlite3DbFree(p->db, p->zMalloc);
p->z = 0;
p->zMalloc = 0;
p->xDel = 0;
@@ -37576,6 +46416,10 @@ static i64 doubleToInt64(double r){
if( r<(double)minInt ){
return minInt;
}else if( r>(double)maxInt ){
+ /* minInt is correct here - not maxInt. It turns out that assigning
+ ** a very large positive number to an integer results in a very large
+ ** negative integer. This makes no sense, but it is what x86 hardware
+ ** does so for compatibility we will do the same in software. */
return minInt;
}else{
return (i64)r;
@@ -37588,13 +46432,15 @@ static i64 doubleToInt64(double r){
** If pMem is an integer, then the value is exact. If pMem is
** a floating-point then the value returned is the integer part.
** If pMem is a string or blob, then we make an attempt to convert
-** it into a integer and return that. If pMem is NULL, return 0.
+** it into a integer and return that. If pMem represents an
+** an SQL-NULL value, return 0.
**
-** If pMem is a string, its encoding might be changed.
+** If pMem represents a string value, its encoding might be changed.
*/
SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){
int flags;
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
flags = pMem->flags;
if( flags & MEM_Int ){
return pMem->u.i;
@@ -37623,22 +46469,26 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){
*/
SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
if( pMem->flags & MEM_Real ){
return pMem->r;
}else if( pMem->flags & MEM_Int ){
return (double)pMem->u.i;
}else if( pMem->flags & (MEM_Str|MEM_Blob) ){
- double val = 0.0;
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ double val = (double)0;
pMem->flags |= MEM_Str;
if( sqlite3VdbeChangeEncoding(pMem, SQLITE_UTF8)
|| sqlite3VdbeMemNulTerminate(pMem) ){
- return 0.0;
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ return (double)0;
}
assert( pMem->z );
sqlite3AtoF(pMem->z, &val);
return val;
}else{
- return 0.0;
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ return (double)0;
}
}
@@ -37648,25 +46498,40 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
*/
SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
assert( pMem->flags & MEM_Real );
+ assert( (pMem->flags & MEM_RowSet)==0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
pMem->u.i = doubleToInt64(pMem->r);
- if( pMem->r==(double)pMem->u.i ){
+
+ /* Only mark the value as an integer if
+ **
+ ** (1) the round-trip conversion real->int->real is a no-op, and
+ ** (2) The integer is neither the largest nor the smallest
+ ** possible integer (ticket #3922)
+ **
+ ** The second and third terms in the following conditional enforces
+ ** the second condition under the assumption that addition overflow causes
+ ** values to wrap around. On x86 hardware, the third term is always
+ ** true and could be omitted. But we leave it in because other
+ ** architectures might behave differently.
+ */
+ if( pMem->r==(double)pMem->u.i && pMem->u.i>SMALLEST_INT64
+ && ALWAYS(pMem->u.i<LARGEST_INT64) ){
pMem->flags |= MEM_Int;
}
}
-static void setTypeFlag(Mem *pMem, int f){
- MemSetTypeFlag(pMem, f);
-}
-
/*
** Convert pMem to type integer. Invalidate any prior representations.
*/
SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( (pMem->flags & MEM_RowSet)==0 );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
+
pMem->u.i = sqlite3VdbeIntValue(pMem);
- setTypeFlag(pMem, MEM_Int);
+ MemSetTypeFlag(pMem, MEM_Int);
return SQLITE_OK;
}
@@ -37676,8 +46541,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
*/
SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
+
pMem->r = sqlite3VdbeRealValue(pMem);
- setTypeFlag(pMem, MEM_Real);
+ MemSetTypeFlag(pMem, MEM_Real);
return SQLITE_OK;
}
@@ -37698,7 +46565,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
sqlite3VdbeMemIntegerify(pMem);
}else{
pMem->r = r1;
- setTypeFlag(pMem, MEM_Real);
+ MemSetTypeFlag(pMem, MEM_Real);
}
return SQLITE_OK;
}
@@ -37707,7 +46574,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
** Delete any previous value and set the value stored in *pMem to NULL.
*/
SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){
- setTypeFlag(pMem, MEM_Null);
+ if( pMem->flags & MEM_Frame ){
+ sqlite3VdbeFrameDelete(pMem->u.pFrame);
+ }
+ if( pMem->flags & MEM_RowSet ){
+ sqlite3RowSetClear(pMem->u.pRowSet);
+ }
+ MemSetTypeFlag(pMem, MEM_Null);
pMem->type = SQLITE_NULL;
}
@@ -37717,13 +46590,20 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){
*/
SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
sqlite3VdbeMemRelease(pMem);
- setTypeFlag(pMem, MEM_Blob);
pMem->flags = MEM_Blob|MEM_Zero;
pMem->type = SQLITE_BLOB;
pMem->n = 0;
if( n<0 ) n = 0;
- pMem->u.i = n;
+ pMem->u.nZero = n;
pMem->enc = SQLITE_UTF8;
+
+#ifdef SQLITE_OMIT_INCRBLOB
+ sqlite3VdbeMemGrow(pMem, n, 0);
+ if( pMem->z ){
+ pMem->n = n;
+ memset(pMem->z, 0, n);
+ }
+#endif
}
/*
@@ -37753,6 +46633,27 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
}
/*
+** Delete any previous value and set the value of pMem to be an
+** empty boolean index.
+*/
+SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem *pMem){
+ sqlite3 *db = pMem->db;
+ assert( db!=0 );
+ assert( (pMem->flags & MEM_RowSet)==0 );
+ sqlite3VdbeMemRelease(pMem);
+ pMem->zMalloc = sqlite3DbMallocRaw(db, 64);
+ if( db->mallocFailed ){
+ pMem->flags = MEM_Null;
+ }else{
+ assert( pMem->zMalloc );
+ pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc,
+ sqlite3DbMallocSize(db, pMem->zMalloc));
+ assert( pMem->u.pRowSet!=0 );
+ pMem->flags = MEM_RowSet;
+ }
+}
+
+/*
** Return true if the Mem object contains a TEXT or BLOB that is
** too large - whose size exceeds SQLITE_MAX_LENGTH.
*/
@@ -37761,7 +46662,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){
if( p->flags & (MEM_Str|MEM_Blob) ){
int n = p->n;
if( p->flags & MEM_Zero ){
- n += p->u.i;
+ n += p->u.nZero;
}
return n>p->db->aLimit[SQLITE_LIMIT_LENGTH];
}
@@ -37780,6 +46681,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){
** and flags gets srcType (either MEM_Ephem or MEM_Static).
*/
SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
+ assert( (pFrom->flags & MEM_RowSet)==0 );
sqlite3VdbeMemReleaseExternal(pTo);
memcpy(pTo, pFrom, MEMCELLSIZE);
pTo->xDel = 0;
@@ -37797,6 +46699,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int sr
SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
int rc = SQLITE_OK;
+ assert( (pFrom->flags & MEM_RowSet)==0 );
sqlite3VdbeMemReleaseExternal(pTo);
memcpy(pTo, pFrom, MEMCELLSIZE);
pTo->flags &= ~MEM_Dyn;
@@ -37837,6 +46740,12 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){
** string is copied into a (possibly existing) buffer managed by the
** Mem structure. Otherwise, any existing buffer is freed and the
** pointer copied.
+**
+** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH
+** size limit) then no memory allocation occurs. If the string can be
+** stored without allocating memory, then it is. If a memory allocation
+** is required to store the string, then value of pMem is unchanged. In
+** either case, SQLITE_TOOBIG is returned.
*/
SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
Mem *pMem, /* Memory cell to set to string value */
@@ -37846,9 +46755,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
void (*xDel)(void*) /* Destructor function */
){
int nByte = n; /* New value for pMem->n */
- int flags = 0; /* New value for pMem->flags */
+ int iLimit; /* Maximum allowed string or blob size */
+ u16 flags = 0; /* New value for pMem->flags */
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+ assert( (pMem->flags & MEM_RowSet)==0 );
/* If z is a NULL pointer, set pMem to contain an SQL NULL. */
if( !z ){
@@ -37856,13 +46767,18 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
return SQLITE_OK;
}
+ if( pMem->db ){
+ iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH];
+ }else{
+ iLimit = SQLITE_MAX_LENGTH;
+ }
flags = (enc==0?MEM_Blob:MEM_Str);
if( nByte<0 ){
assert( enc!=0 );
if( enc==SQLITE_UTF8 ){
- for(nByte=0; z[nByte]; nByte++){}
+ for(nByte=0; nByte<=iLimit && z[nByte]; nByte++){}
}else{
- for(nByte=0; z[nByte] | z[nByte+1]; nByte+=2){}
+ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){}
}
flags |= MEM_Term;
}
@@ -37876,10 +46792,17 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
if( flags&MEM_Term ){
nAlloc += (enc==SQLITE_UTF8?1:2);
}
+ if( nByte>iLimit ){
+ return SQLITE_TOOBIG;
+ }
if( sqlite3VdbeMemGrow(pMem, nAlloc, 0) ){
return SQLITE_NOMEM;
}
memcpy(pMem->z, z, nAlloc);
+ }else if( xDel==SQLITE_DYNAMIC ){
+ sqlite3VdbeMemRelease(pMem);
+ pMem->zMalloc = pMem->z = (char *)z;
+ pMem->xDel = 0;
}else{
sqlite3VdbeMemRelease(pMem);
pMem->z = (char *)z;
@@ -37898,6 +46821,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
}
#endif
+ if( nByte>iLimit ){
+ return SQLITE_TOOBIG;
+ }
+
return SQLITE_OK;
}
@@ -37921,6 +46848,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C
f1 = pMem1->flags;
f2 = pMem2->flags;
combined_flags = f1|f2;
+ assert( (combined_flags & MEM_RowSet)==0 );
/* If one value is NULL, it is less than the other. If both values
** are NULL, return 0.
@@ -37943,12 +46871,12 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C
if( (f1 & f2 & MEM_Int)==0 ){
double r1, r2;
if( (f1&MEM_Real)==0 ){
- r1 = pMem1->u.i;
+ r1 = (double)pMem1->u.i;
}else{
r1 = pMem1->r;
}
if( (f2&MEM_Real)==0 ){
- r2 = pMem2->u.i;
+ r2 = (double)pMem2->u.i;
}else{
r2 = pMem2->r;
}
@@ -37991,22 +46919,21 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C
** comparison function directly */
return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z);
}else{
- u8 origEnc = pMem1->enc;
const void *v1, *v2;
int n1, n2;
- /* Convert the strings into the encoding that the comparison
- ** function expects */
- v1 = sqlite3ValueText((sqlite3_value*)pMem1, pColl->enc);
- n1 = v1==0 ? 0 : pMem1->n;
- assert( n1==sqlite3ValueBytes((sqlite3_value*)pMem1, pColl->enc) );
- v2 = sqlite3ValueText((sqlite3_value*)pMem2, pColl->enc);
- n2 = v2==0 ? 0 : pMem2->n;
- assert( n2==sqlite3ValueBytes((sqlite3_value*)pMem2, pColl->enc) );
- /* Do the comparison */
+ Mem c1;
+ Mem c2;
+ memset(&c1, 0, sizeof(c1));
+ memset(&c2, 0, sizeof(c2));
+ sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem);
+ sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem);
+ v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc);
+ n1 = v1==0 ? 0 : c1.n;
+ v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc);
+ n2 = v2==0 ? 0 : c2.n;
rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2);
- /* Convert the strings back into the database encoding */
- sqlite3ValueText((sqlite3_value*)pMem1, origEnc);
- sqlite3ValueText((sqlite3_value*)pMem2, origEnc);
+ sqlite3VdbeMemRelease(&c1);
+ sqlite3VdbeMemRelease(&c2);
return rc;
}
}
@@ -38042,13 +46969,15 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(
int key, /* If true, retrieve from the btree key, not data. */
Mem *pMem /* OUT: Return data in this Mem structure. */
){
- char *zData; /* Data from the btree layer */
- int available = 0; /* Number of bytes available on the local btree page */
- sqlite3 *db; /* Database connection */
- int rc = SQLITE_OK;
+ char *zData; /* Data from the btree layer */
+ int available = 0; /* Number of bytes available on the local btree page */
+ int rc = SQLITE_OK; /* Return code */
- db = sqlite3BtreeCursorDb(pCur);
- assert( sqlite3_mutex_held(db->mutex) );
+ assert( sqlite3BtreeCursorIsValid(pCur) );
+
+ /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert()
+ ** that both the BtShared and database handle mutexes are held. */
+ assert( (pMem->flags & MEM_RowSet)==0 );
if( key ){
zData = (char *)sqlite3BtreeKeyFetch(pCur, &available);
}else{
@@ -38056,7 +46985,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(
}
assert( zData!=0 );
- if( offset+amt<=available && ((pMem->flags&MEM_Dyn)==0 || pMem->xDel) ){
+ if( offset+amt<=available && (pMem->flags&MEM_Dyn)==0 ){
sqlite3VdbeMemRelease(pMem);
pMem->z = &zData[offset];
pMem->flags = MEM_Blob|MEM_Ephem;
@@ -38080,55 +47009,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(
return rc;
}
-#if 0
-/*
-** Perform various checks on the memory cell pMem. An assert() will
-** fail if pMem is internally inconsistent.
-*/
-SQLITE_PRIVATE void sqlite3VdbeMemSanity(Mem *pMem){
- int flags = pMem->flags;
- assert( flags!=0 ); /* Must define some type */
- if( flags & (MEM_Str|MEM_Blob) ){
- int x = flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short);
- assert( x!=0 ); /* Strings must define a string subtype */
- assert( (x & (x-1))==0 ); /* Only one string subtype can be defined */
- assert( pMem->z!=0 ); /* Strings must have a value */
- /* Mem.z points to Mem.zShort iff the subtype is MEM_Short */
- assert( (x & MEM_Short)==0 || pMem->z==pMem->zShort );
- assert( (x & MEM_Short)!=0 || pMem->z!=pMem->zShort );
- /* No destructor unless there is MEM_Dyn */
- assert( pMem->xDel==0 || (pMem->flags & MEM_Dyn)!=0 );
-
- if( (flags & MEM_Str) ){
- assert( pMem->enc==SQLITE_UTF8 ||
- pMem->enc==SQLITE_UTF16BE ||
- pMem->enc==SQLITE_UTF16LE
- );
- /* If the string is UTF-8 encoded and nul terminated, then pMem->n
- ** must be the length of the string. (Later:) If the database file
- ** has been corrupted, '\000' characters might have been inserted
- ** into the middle of the string. In that case, the strlen() might
- ** be less.
- */
- if( pMem->enc==SQLITE_UTF8 && (flags & MEM_Term) ){
- assert( strlen(pMem->z)<=pMem->n );
- assert( pMem->z[pMem->n]==0 );
- }
- }
- }else{
- /* Cannot define a string subtype for non-string objects */
- assert( (pMem->flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short))==0 );
- assert( pMem->xDel==0 );
- }
- /* MEM_Null excludes all other types */
- assert( (pMem->flags&(MEM_Str|MEM_Int|MEM_Real|MEM_Blob))==0
- || (pMem->flags&MEM_Null)==0 );
- /* If the MEM is both real and integer, the values are equal */
- assert( (pMem->flags & (MEM_Int|MEM_Real))!=(MEM_Int|MEM_Real)
- || pMem->r==pMem->u.i );
-}
-#endif
-
/* This function is only available internally, it is not part of the
** external API. It works in a similar way to sqlite3_value_text(),
** except the data returned is in the encoding specified by the second
@@ -38144,6 +47024,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
+ assert( (pVal->flags & MEM_RowSet)==0 );
if( pVal->flags&MEM_Null ){
return 0;
@@ -38153,7 +47034,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
expandBlob(pVal);
if( pVal->flags&MEM_Str ){
sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
- if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&(int)pVal->z) ){
+ if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){
assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 );
if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){
return 0;
@@ -38163,7 +47044,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
}else{
assert( (pVal->flags&MEM_Blob)==0 );
sqlite3VdbeMemStringify(pVal, enc);
- assert( 0==(1&(int)pVal->z) );
+ assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) );
}
assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
|| pVal->db->mallocFailed );
@@ -38213,36 +47094,48 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr(
return SQLITE_OK;
}
op = pExpr->op;
+ if( op==TK_REGISTER ){
+ op = pExpr->op2;
+ }
if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){
- zVal = sqlite3StrNDup((char*)pExpr->token.z, pExpr->token.n);
pVal = sqlite3ValueNew(db);
- if( !zVal || !pVal ) goto no_mem;
- sqlite3Dequote(zVal);
- sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, sqlite3_free);
+ if( pVal==0 ) goto no_mem;
+ if( ExprHasProperty(pExpr, EP_IntValue) ){
+ sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue);
+ }else{
+ zVal = sqlite3DbStrDup(db, pExpr->u.zToken);
+ if( zVal==0 ) goto no_mem;
+ sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC);
+ if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT;
+ }
if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){
- sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, enc);
+ sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8);
}else{
- sqlite3ValueApplyAffinity(pVal, affinity, enc);
+ sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8);
+ }
+ if( enc!=SQLITE_UTF8 ){
+ sqlite3VdbeChangeEncoding(pVal, enc);
}
}else if( op==TK_UMINUS ) {
if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) ){
pVal->u.i = -1 * pVal->u.i;
- pVal->r = -1.0 * pVal->r;
+ /* (double)-1 In case of SQLITE_OMIT_FLOATING_POINT... */
+ pVal->r = (double)-1 * pVal->r;
}
}
#ifndef SQLITE_OMIT_BLOB_LITERAL
else if( op==TK_BLOB ){
int nVal;
- assert( pExpr->token.n>=3 );
- assert( pExpr->token.z[0]=='x' || pExpr->token.z[0]=='X' );
- assert( pExpr->token.z[1]=='\'' );
- assert( pExpr->token.z[pExpr->token.n-1]=='\'' );
+ assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
+ assert( pExpr->u.zToken[1]=='\'' );
pVal = sqlite3ValueNew(db);
- nVal = pExpr->token.n - 3;
- zVal = (char*)pExpr->token.z + 2;
+ if( !pVal ) goto no_mem;
+ zVal = &pExpr->u.zToken[2];
+ nVal = sqlite3Strlen30(zVal)-1;
+ assert( zVal[nVal]=='\'' );
sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2,
- 0, sqlite3_free);
+ 0, SQLITE_DYNAMIC);
}
#endif
@@ -38251,7 +47144,7 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr(
no_mem:
db->mallocFailed = 1;
- sqlite3_free(zVal);
+ sqlite3DbFree(db, zVal);
sqlite3ValueFree(pVal);
*ppVal = 0;
return SQLITE_NOMEM;
@@ -38276,7 +47169,7 @@ SQLITE_PRIVATE void sqlite3ValueSetStr(
SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){
if( !v ) return;
sqlite3VdbeMemRelease((Mem *)v);
- sqlite3_free(v);
+ sqlite3DbFree(((Mem*)v)->db, v);
}
/*
@@ -38287,7 +47180,7 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
Mem *p = (Mem*)pVal;
if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){
if( p->flags & MEM_Zero ){
- return p->n+p->u.i;
+ return p->n + p->u.nZero;
}else{
return p->n;
}
@@ -38313,7 +47206,7 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
** to version 2.8.7, all this code was combined into the vdbe.c source file.
** But that file was getting too big so this subroutines were split out.
**
-** $Id: vdbeaux.c,v 1.383 2008/05/13 13:27:34 drh Exp $
+** $Id: vdbeaux.c,v 1.480 2009/08/08 18:01:08 drh Exp $
*/
@@ -38349,17 +47242,22 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3 *db){
/*
** Remember the SQL string for a prepared statement.
*/
-SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n){
+SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){
if( p==0 ) return;
+#ifdef SQLITE_OMIT_TRACE
+ if( !isPrepareV2 ) return;
+#endif
assert( p->zSql==0 );
p->zSql = sqlite3DbStrNDup(p->db, z, n);
+ p->isPrepareV2 = isPrepareV2 ? 1 : 0;
}
/*
** Return the SQL associated with a prepared statement
*/
SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){
- return ((Vdbe *)pStmt)->zSql;
+ Vdbe *p = (Vdbe *)pStmt;
+ return (p->isPrepareV2 ? p->zSql : 0);
}
/*
@@ -38368,7 +47266,6 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){
SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
Vdbe tmp, *pTmp;
char *zTmp;
- int nTmp;
tmp = *pA;
*pA = *pB;
*pB = tmp;
@@ -38381,9 +47278,7 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
zTmp = pA->zSql;
pA->zSql = pB->zSql;
pB->zSql = zTmp;
- nTmp = pA->nSql;
- pA->nSql = pB->nSql;
- pB->nSql = nTmp;
+ pB->isPrepareV2 = pA->isPrepareV2;
}
#ifdef SQLITE_DEBUG
@@ -38396,21 +47291,23 @@ SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe *p, FILE *trace){
#endif
/*
-** Resize the Vdbe.aOp array so that it contains at least N
-** elements.
+** Resize the Vdbe.aOp array so that it is at least one op larger than
+** it was.
**
-** If an out-of-memory error occurs while resizing the array,
-** Vdbe.aOp and Vdbe.nOpAlloc remain unchanged (this is so that
-** any opcodes already allocated can be correctly deallocated
-** along with the rest of the Vdbe).
+** If an out-of-memory error occurs while resizing the array, return
+** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain
+** unchanged (this is so that any opcodes already allocated can be
+** correctly deallocated along with the rest of the Vdbe).
*/
-static void resizeOpArray(Vdbe *p, int N){
+static int growOpArray(Vdbe *p){
VdbeOp *pNew;
- pNew = sqlite3DbRealloc(p->db, p->aOp, N*sizeof(Op));
+ int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op)));
+ pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op));
if( pNew ){
- p->nOpAlloc = N;
+ p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op);
p->aOp = pNew;
}
+ return (pNew ? SQLITE_OK : SQLITE_NOMEM);
}
/*
@@ -38435,15 +47332,15 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
i = p->nOp;
assert( p->magic==VDBE_MAGIC_INIT );
+ assert( op>0 && op<0xff );
if( p->nOpAlloc<=i ){
- resizeOpArray(p, p->nOpAlloc ? p->nOpAlloc*2 : 1024/sizeof(Op));
- if( p->db->mallocFailed ){
- return 0;
+ if( growOpArray(p) ){
+ return 1;
}
}
p->nOp++;
pOp = &p->aOp[i];
- pOp->opcode = op;
+ pOp->opcode = (u8)op;
pOp->p5 = 0;
pOp->p1 = p1;
pOp->p2 = p2;
@@ -38508,9 +47405,10 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *p){
i = p->nLabel++;
assert( p->magic==VDBE_MAGIC_INIT );
if( i>=p->nLabelAlloc ){
- p->nLabelAlloc = p->nLabelAlloc*2 + 10;
+ int n = p->nLabelAlloc*2 + 5;
p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel,
- p->nLabelAlloc*sizeof(p->aLabel[0]));
+ n*sizeof(p->aLabel[0]));
+ p->nLabelAlloc = sqlite3DbMallocSize(p->db, p->aLabel)/sizeof(p->aLabel[0]);
}
if( p->aLabel ){
p->aLabel[i] = -1;
@@ -38532,6 +47430,127 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *p, int x){
}
}
+#ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */
+
+/*
+** The following type and function are used to iterate through all opcodes
+** in a Vdbe main program and each of the sub-programs (triggers) it may
+** invoke directly or indirectly. It should be used as follows:
+**
+** Op *pOp;
+** VdbeOpIter sIter;
+**
+** memset(&sIter, 0, sizeof(sIter));
+** sIter.v = v; // v is of type Vdbe*
+** while( (pOp = opIterNext(&sIter)) ){
+** // Do something with pOp
+** }
+** sqlite3DbFree(v->db, sIter.apSub);
+**
+*/
+typedef struct VdbeOpIter VdbeOpIter;
+struct VdbeOpIter {
+ Vdbe *v; /* Vdbe to iterate through the opcodes of */
+ SubProgram **apSub; /* Array of subprograms */
+ int nSub; /* Number of entries in apSub */
+ int iAddr; /* Address of next instruction to return */
+ int iSub; /* 0 = main program, 1 = first sub-program etc. */
+};
+static Op *opIterNext(VdbeOpIter *p){
+ Vdbe *v = p->v;
+ Op *pRet = 0;
+ Op *aOp;
+ int nOp;
+
+ if( p->iSub<=p->nSub ){
+
+ if( p->iSub==0 ){
+ aOp = v->aOp;
+ nOp = v->nOp;
+ }else{
+ aOp = p->apSub[p->iSub-1]->aOp;
+ nOp = p->apSub[p->iSub-1]->nOp;
+ }
+ assert( p->iAddr<nOp );
+
+ pRet = &aOp[p->iAddr];
+ p->iAddr++;
+ if( p->iAddr==nOp ){
+ p->iSub++;
+ p->iAddr = 0;
+ }
+
+ if( pRet->p4type==P4_SUBPROGRAM ){
+ int nByte = (p->nSub+1)*sizeof(SubProgram*);
+ int j;
+ for(j=0; j<p->nSub; j++){
+ if( p->apSub[j]==pRet->p4.pProgram ) break;
+ }
+ if( j==p->nSub ){
+ p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte);
+ if( !p->apSub ){
+ pRet = 0;
+ }else{
+ p->apSub[p->nSub++] = pRet->p4.pProgram;
+ }
+ }
+ }
+ }
+
+ return pRet;
+}
+
+/*
+** Check if the program stored in the VM associated with pParse may
+** throw an ABORT exception (causing the statement, but not entire transaction
+** to be rolled back). This condition is true if the main program or any
+** sub-programs contains any of the following:
+**
+** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort.
+** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort.
+** * OP_Destroy
+** * OP_VUpdate
+** * OP_VRename
+** * OP_FkCounter with P2==0 (immediate foreign key constraint)
+**
+** Then check that the value of Parse.mayAbort is true if an
+** ABORT may be thrown, or false otherwise. Return true if it does
+** match, or false otherwise. This function is intended to be used as
+** part of an assert statement in the compiler. Similar to:
+**
+** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) );
+*/
+SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
+ int hasAbort = 0;
+ Op *pOp;
+ VdbeOpIter sIter;
+ memset(&sIter, 0, sizeof(sIter));
+ sIter.v = v;
+
+ while( (pOp = opIterNext(&sIter))!=0 ){
+ int opcode = pOp->opcode;
+ if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+ || (opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1)
+#endif
+ || ((opcode==OP_Halt || opcode==OP_HaltIfNull)
+ && (pOp->p1==SQLITE_CONSTRAINT && pOp->p2==OE_Abort))
+ ){
+ hasAbort = 1;
+ break;
+ }
+ }
+ sqlite3DbFree(v->db, sIter.apSub);
+
+ /* Return true if hasAbort==mayAbort. Or if a malloc failure occured.
+ ** If malloc failed, then the while() loop above may not have iterated
+ ** through all opcodes and hasAbort may be set incorrectly. Return
+ ** true for this case to prevent the assert() in the callers frame
+ ** from failing. */
+ return ( v->db->mallocFailed || hasAbort==mayAbort );
+}
+#endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
+
/*
** Loop through the program looking for P2 values that are negative
** on jump instructions. Each such value is a label. Resolve the
@@ -38542,50 +47561,25 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *p, int x){
** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument
** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by
** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array.
-**
-** This routine also does the following optimization: It scans for
-** instructions that might cause a statement rollback. Such instructions
-** are:
-**
-** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort.
-** * OP_Destroy
-** * OP_VUpdate
-** * OP_VRename
-**
-** If no such instruction is found, then every Statement instruction
-** is changed to a Noop. In this way, we avoid creating the statement
-** journal file unnecessarily.
*/
static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
int i;
- int nMaxArgs = 0;
+ int nMaxArgs = *pMaxFuncArgs;
Op *pOp;
int *aLabel = p->aLabel;
- int doesStatementRollback = 0;
- int hasStatementBegin = 0;
+ p->readOnly = 1;
for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){
u8 opcode = pOp->opcode;
- if( opcode==OP_Function ){
+ if( opcode==OP_Function || opcode==OP_AggStep ){
if( pOp->p5>nMaxArgs ) nMaxArgs = pOp->p5;
- }else if( opcode==OP_AggStep
#ifndef SQLITE_OMIT_VIRTUALTABLE
- || opcode==OP_VUpdate
-#endif
- ){
+ }else if( opcode==OP_VUpdate ){
if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2;
- }
- if( opcode==OP_Halt ){
- if( pOp->p1==SQLITE_CONSTRAINT && pOp->p2==OE_Abort ){
- doesStatementRollback = 1;
- }
- }else if( opcode==OP_Statement ){
- hasStatementBegin = 1;
- }else if( opcode==OP_Destroy ){
- doesStatementRollback = 1;
+#endif
+ }else if( opcode==OP_Transaction && pOp->p2!=0 ){
+ p->readOnly = 0;
#ifndef SQLITE_OMIT_VIRTUALTABLE
- }else if( opcode==OP_VUpdate || opcode==OP_VRename ){
- doesStatementRollback = 1;
}else if( opcode==OP_VFilter ){
int n;
assert( p->nOp - i >= 3 );
@@ -38600,23 +47594,10 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
pOp->p2 = aLabel[-1-pOp->p2];
}
}
- sqlite3_free(p->aLabel);
+ sqlite3DbFree(p->db, p->aLabel);
p->aLabel = 0;
*pMaxFuncArgs = nMaxArgs;
-
- /* If we never rollback a statement transaction, then statement
- ** transactions are not needed. So change every OP_Statement
- ** opcode into an OP_Noop. This avoid a call to sqlite3OsOpenExclusive()
- ** which can be expensive on some platforms.
- */
- if( hasStatementBegin && !doesStatementRollback ){
- for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){
- if( pOp->opcode==OP_Statement ){
- pOp->opcode = OP_Noop;
- }
- }
- }
}
/*
@@ -38628,21 +47609,41 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){
}
/*
+** This function returns a pointer to the array of opcodes associated with
+** the Vdbe passed as the first argument. It is the callers responsibility
+** to arrange for the returned array to be eventually freed using the
+** vdbeFreeOpArray() function.
+**
+** Before returning, *pnOp is set to the number of entries in the returned
+** array. Also, *pnMaxArg is set to the larger of its current value and
+** the number of entries in the Vdbe.apArg[] array required to execute the
+** returned program.
+*/
+SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){
+ VdbeOp *aOp = p->aOp;
+ assert( aOp && !p->db->mallocFailed );
+
+ /* Check that sqlite3VdbeUsesBtree() was not called on this VM */
+ assert( p->aMutex.nMutex==0 );
+
+ resolveP2Values(p, pnMaxArg);
+ *pnOp = p->nOp;
+ p->aOp = 0;
+ return aOp;
+}
+
+/*
** Add a whole list of operations to the operation stack. Return the
** address of the first operation added.
*/
SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
int addr;
assert( p->magic==VDBE_MAGIC_INIT );
- if( p->nOp + nOp > p->nOpAlloc ){
- resizeOpArray(p, p->nOpAlloc ? p->nOpAlloc*2 : 1024/sizeof(Op));
- assert( p->nOp+nOp<=p->nOpAlloc || p->db->mallocFailed );
- }
- if( p->db->mallocFailed ){
+ if( p->nOp + nOp > p->nOpAlloc && growOpArray(p) ){
return 0;
}
addr = p->nOp;
- if( nOp>0 ){
+ if( ALWAYS(nOp>0) ){
int i;
VdbeOpList const *pIn = aOp;
for(i=0; i<nOp; i++, pIn++){
@@ -38678,8 +47679,9 @@ SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp)
** few minor changes to the program.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){
- assert( p==0 || p->magic==VDBE_MAGIC_INIT );
- if( p && addr>=0 && p->nOp>addr && p->aOp ){
+ assert( p!=0 );
+ assert( addr>=0 );
+ if( p->nOp>addr ){
p->aOp[addr].p1 = val;
}
}
@@ -38689,8 +47691,9 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){
** This routine is useful for setting a jump destination.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){
- assert( p==0 || p->magic==VDBE_MAGIC_INIT );
- if( p && addr>=0 && p->nOp>addr && p->aOp ){
+ assert( p!=0 );
+ assert( addr>=0 );
+ if( p->nOp>addr ){
p->aOp[addr].p2 = val;
}
}
@@ -38699,8 +47702,9 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){
** Change the value of the P3 operand for a specific instruction.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){
- assert( p==0 || p->magic==VDBE_MAGIC_INIT );
- if( p && addr>=0 && p->nOp>addr && p->aOp ){
+ assert( p!=0 );
+ assert( addr>=0 );
+ if( p->nOp>addr ){
p->aOp[addr].p3 = val;
}
}
@@ -38710,8 +47714,8 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){
** added operation.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u8 val){
- assert( p==0 || p->magic==VDBE_MAGIC_INIT );
- if( p && p->aOp ){
+ assert( p!=0 );
+ if( p->aOp ){
assert( p->nOp>0 );
p->aOp[p->nOp-1].p5 = val;
}
@@ -38730,55 +47734,112 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){
** If the input FuncDef structure is ephemeral, then free it. If
** the FuncDef is not ephermal, then do nothing.
*/
-static void freeEphemeralFunction(FuncDef *pDef){
- if( pDef && (pDef->flags & SQLITE_FUNC_EPHEM)!=0 ){
- sqlite3_free(pDef);
+static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
+ if( ALWAYS(pDef) && (pDef->flags & SQLITE_FUNC_EPHEM)!=0 ){
+ sqlite3DbFree(db, pDef);
}
}
/*
** Delete a P4 value if necessary.
*/
-static void freeP4(int p4type, void *p3){
- if( p3 ){
+static void freeP4(sqlite3 *db, int p4type, void *p4){
+ if( p4 ){
switch( p4type ){
case P4_REAL:
case P4_INT64:
case P4_MPRINTF:
case P4_DYNAMIC:
case P4_KEYINFO:
+ case P4_INTARRAY:
case P4_KEYINFO_HANDOFF: {
- sqlite3_free(p3);
+ sqlite3DbFree(db, p4);
break;
}
case P4_VDBEFUNC: {
- VdbeFunc *pVdbeFunc = (VdbeFunc *)p3;
- freeEphemeralFunction(pVdbeFunc->pFunc);
+ VdbeFunc *pVdbeFunc = (VdbeFunc *)p4;
+ freeEphemeralFunction(db, pVdbeFunc->pFunc);
sqlite3VdbeDeleteAuxData(pVdbeFunc, 0);
- sqlite3_free(pVdbeFunc);
+ sqlite3DbFree(db, pVdbeFunc);
break;
}
case P4_FUNCDEF: {
- freeEphemeralFunction((FuncDef*)p3);
+ freeEphemeralFunction(db, (FuncDef*)p4);
break;
}
case P4_MEM: {
- sqlite3ValueFree((sqlite3_value*)p3);
+ sqlite3ValueFree((sqlite3_value*)p4);
+ break;
+ }
+ case P4_VTAB : {
+ sqlite3VtabUnlock((VTable *)p4);
+ break;
+ }
+ case P4_SUBPROGRAM : {
+ sqlite3VdbeProgramDelete(db, (SubProgram *)p4, 1);
break;
}
}
}
}
+/*
+** Free the space allocated for aOp and any p4 values allocated for the
+** opcodes contained within. If aOp is not NULL it is assumed to contain
+** nOp entries.
+*/
+static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
+ if( aOp ){
+ Op *pOp;
+ for(pOp=aOp; pOp<&aOp[nOp]; pOp++){
+ freeP4(db, pOp->p4type, pOp->p4.p);
+#ifdef SQLITE_DEBUG
+ sqlite3DbFree(db, pOp->zComment);
+#endif
+ }
+ }
+ sqlite3DbFree(db, aOp);
+}
+
+/*
+** Decrement the ref-count on the SubProgram structure passed as the
+** second argument. If the ref-count reaches zero, free the structure.
+**
+** The array of VDBE opcodes stored as SubProgram.aOp is freed if
+** either the ref-count reaches zero or parameter freeop is non-zero.
+**
+** Since the array of opcodes pointed to by SubProgram.aOp may directly
+** or indirectly contain a reference to the SubProgram structure itself.
+** By passing a non-zero freeop parameter, the caller may ensure that all
+** SubProgram structures and their aOp arrays are freed, even when there
+** are such circular references.
+*/
+SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *db, SubProgram *p, int freeop){
+ if( p ){
+ assert( p->nRef>0 );
+ if( freeop || p->nRef==1 ){
+ Op *aOp = p->aOp;
+ p->aOp = 0;
+ vdbeFreeOpArray(db, aOp, p->nOp);
+ p->nOp = 0;
+ }
+ p->nRef--;
+ if( p->nRef==0 ){
+ sqlite3DbFree(db, p);
+ }
+ }
+}
+
/*
** Change N opcodes starting at addr to No-ops.
*/
SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe *p, int addr, int N){
- if( p && p->aOp ){
+ if( p->aOp ){
VdbeOp *pOp = &p->aOp[addr];
+ sqlite3 *db = p->db;
while( N-- ){
- freeP4(pOp->p4type, pOp->p4.p);
+ freeP4(db, pOp->p4type, pOp->p4.p);
memset(pOp, 0, sizeof(pOp[0]));
pOp->opcode = OP_Noop;
pOp++;
@@ -38813,27 +47874,29 @@ SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe *p, int addr, int N){
*/
SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){
Op *pOp;
+ sqlite3 *db;
assert( p!=0 );
+ db = p->db;
assert( p->magic==VDBE_MAGIC_INIT );
- if( p->aOp==0 || p->db->mallocFailed ){
- if (n != P4_KEYINFO) {
- freeP4(n, (void*)*(char**)&zP4);
+ if( p->aOp==0 || db->mallocFailed ){
+ if ( n!=P4_KEYINFO && n!=P4_VTAB ) {
+ freeP4(db, n, (void*)*(char**)&zP4);
}
return;
}
+ assert( p->nOp>0 );
assert( addr<p->nOp );
if( addr<0 ){
addr = p->nOp - 1;
- if( addr<0 ) return;
}
pOp = &p->aOp[addr];
- freeP4(pOp->p4type, pOp->p4.p);
+ freeP4(db, pOp->p4type, pOp->p4.p);
pOp->p4.p = 0;
if( n==P4_INT32 ){
/* Note: this cast is safe, because the origin data point was an int
** that was cast to a (const char *). */
- pOp->p4.i = (int)zP4;
- pOp->p4type = n;
+ pOp->p4.i = SQLITE_PTR_TO_INT(zP4);
+ pOp->p4type = P4_INT32;
}else if( zP4==0 ){
pOp->p4.p = 0;
pOp->p4type = P4_NOTUSED;
@@ -38843,22 +47906,16 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int
nField = ((KeyInfo*)zP4)->nField;
nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo->aColl[0]) + nField;
- pKeyInfo = sqlite3_malloc( nByte );
+ pKeyInfo = sqlite3Malloc( nByte );
pOp->p4.pKeyInfo = pKeyInfo;
if( pKeyInfo ){
+ u8 *aSortOrder;
memcpy(pKeyInfo, zP4, nByte);
- /* In the current implementation, P4_KEYINFO is only ever used on
- ** KeyInfo structures that have no aSortOrder component. Elements
- ** with an aSortOrder always use P4_KEYINFO_HANDOFF. So we do not
- ** need to bother with duplicating the aSortOrder. */
- assert( pKeyInfo->aSortOrder==0 );
-#if 0
aSortOrder = pKeyInfo->aSortOrder;
if( aSortOrder ){
pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo->aColl[nField];
memcpy(pKeyInfo->aSortOrder, aSortOrder, nField);
}
-#endif
pOp->p4type = P4_KEYINFO;
}else{
p->db->mallocFailed = 1;
@@ -38867,11 +47924,16 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int
}else if( n==P4_KEYINFO_HANDOFF ){
pOp->p4.p = (void*)zP4;
pOp->p4type = P4_KEYINFO;
+ }else if( n==P4_VTAB ){
+ pOp->p4.p = (void*)zP4;
+ pOp->p4type = P4_VTAB;
+ sqlite3VtabLock((VTable *)zP4);
+ assert( ((VTable *)zP4)->db==p->db );
}else if( n<0 ){
pOp->p4.p = (void*)zP4;
- pOp->p4type = n;
+ pOp->p4type = (signed char)n;
}else{
- if( n==0 ) n = strlen(zP4);
+ if( n==0 ) n = sqlite3Strlen30(zP4);
pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n);
pOp->p4type = P4_DYNAMIC;
}
@@ -38879,29 +47941,73 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int
#ifndef NDEBUG
/*
-** Change the comment on the the most recently coded instruction.
+** Change the comment on the the most recently coded instruction. Or
+** insert a No-op and add the comment to that new instruction. This
+** makes the code easier to read during debugging. None of this happens
+** in a production build.
*/
SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
va_list ap;
+ if( !p ) return;
assert( p->nOp>0 || p->aOp==0 );
assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
if( p->nOp ){
char **pz = &p->aOp[p->nOp-1].zComment;
va_start(ap, zFormat);
- sqlite3_free(*pz);
+ sqlite3DbFree(p->db, *pz);
*pz = sqlite3VMPrintf(p->db, zFormat, ap);
va_end(ap);
}
}
-#endif
+SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
+ va_list ap;
+ if( !p ) return;
+ sqlite3VdbeAddOp0(p, OP_Noop);
+ assert( p->nOp>0 || p->aOp==0 );
+ assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
+ if( p->nOp ){
+ char **pz = &p->aOp[p->nOp-1].zComment;
+ va_start(ap, zFormat);
+ sqlite3DbFree(p->db, *pz);
+ *pz = sqlite3VMPrintf(p->db, zFormat, ap);
+ va_end(ap);
+ }
+}
+#endif /* NDEBUG */
/*
-** Return the opcode for a given address.
+** Return the opcode for a given address. If the address is -1, then
+** return the most recently inserted opcode.
+**
+** If a memory allocation error has occurred prior to the calling of this
+** routine, then a pointer to a dummy VdbeOp will be returned. That opcode
+** is readable and writable, but it has no effect. The return of a dummy
+** opcode allows the call to continue functioning after a OOM fault without
+** having to check to see if the return from this routine is a valid pointer.
+**
+** About the #ifdef SQLITE_OMIT_TRACE: Normally, this routine is never called
+** unless p->nOp>0. This is because in the absense of SQLITE_OMIT_TRACE,
+** an OP_Trace instruction is always inserted by sqlite3VdbeGet() as soon as
+** a new VDBE is created. So we are free to set addr to p->nOp-1 without
+** having to double-check to make sure that the result is non-negative. But
+** if SQLITE_OMIT_TRACE is defined, the OP_Trace is omitted and we do need to
+** check the value of p->nOp-1 before continuing.
*/
SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){
+ static VdbeOp dummy;
assert( p->magic==VDBE_MAGIC_INIT );
+ if( addr<0 ){
+#ifdef SQLITE_OMIT_TRACE
+ if( p->nOp==0 ) return &dummy;
+#endif
+ addr = p->nOp - 1;
+ }
assert( (addr>=0 && addr<p->nOp) || p->db->mallocFailed );
- return ((addr>=0 && addr<p->nOp)?(&p->aOp[addr]):0);
+ if( p->db->mallocFailed ){
+ return &dummy;
+ }else{
+ return &p->aOp[addr];
+ }
}
#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \
@@ -38914,15 +48020,16 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
char *zP4 = zTemp;
assert( nTemp>=20 );
switch( pOp->p4type ){
+ case P4_KEYINFO_STATIC:
case P4_KEYINFO: {
int i, j;
KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
sqlite3_snprintf(nTemp, zTemp, "keyinfo(%d", pKeyInfo->nField);
- i = strlen(zTemp);
+ i = sqlite3Strlen30(zTemp);
for(j=0; j<pKeyInfo->nField; j++){
CollSeq *pColl = pKeyInfo->aColl[j];
if( pColl ){
- int n = strlen(pColl->zName);
+ int n = sqlite3Strlen30(pColl->zName);
if( i+n>nTemp-6 ){
memcpy(&zTemp[i],",...",4);
break;
@@ -38974,16 +48081,27 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
sqlite3_snprintf(nTemp, zTemp, "%lld", pMem->u.i);
}else if( pMem->flags & MEM_Real ){
sqlite3_snprintf(nTemp, zTemp, "%.16g", pMem->r);
+ }else{
+ assert( pMem->flags & MEM_Blob );
+ zP4 = "(blob)";
}
break;
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
case P4_VTAB: {
- sqlite3_vtab *pVtab = pOp->p4.pVtab;
+ sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab;
sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule);
break;
}
#endif
+ case P4_INTARRAY: {
+ sqlite3_snprintf(nTemp, zTemp, "intarray");
+ break;
+ }
+ case P4_SUBPROGRAM: {
+ sqlite3_snprintf(nTemp, zTemp, "program");
+ break;
+ }
default: {
zP4 = pOp->p4.z;
if( zP4==0 ){
@@ -38999,13 +48117,12 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
/*
** Declare to the Vdbe that the BTree object at db->aDb[i] is used.
-**
*/
SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){
int mask;
- assert( i>=0 && i<p->db->nDb );
- assert( i<sizeof(p->btreeMask)*8 );
- mask = 1<<i;
+ assert( i>=0 && i<p->db->nDb && i<sizeof(u32)*8 );
+ assert( i<(int)sizeof(p->btreeMask)*8 );
+ mask = ((u32)1)<<i;
if( (p->btreeMask & mask)==0 ){
p->btreeMask |= mask;
sqlite3BtreeMutexArrayInsert(&p->aMutex, p->db->aDb[i].pBt);
@@ -39038,24 +48155,55 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){
/*
** Release an array of N Mem elements
*/
-static void releaseMemArray(Mem *p, int N, int freebuffers){
+static void releaseMemArray(Mem *p, int N){
if( p && N ){
+ Mem *pEnd;
sqlite3 *db = p->db;
- int malloc_failed = db->mallocFailed;
- while( N-->0 ){
- assert( N<2 || p[0].db==p[1].db );
- if( freebuffers ){
+ u8 malloc_failed = db->mallocFailed;
+ for(pEnd=&p[N]; p<pEnd; p++){
+ assert( (&p[1])==pEnd || p[0].db==p[1].db );
+
+ /* This block is really an inlined version of sqlite3VdbeMemRelease()
+ ** that takes advantage of the fact that the memory cell value is
+ ** being set to NULL after releasing any dynamic resources.
+ **
+ ** The justification for duplicating code is that according to
+ ** callgrind, this causes a certain test case to hit the CPU 4.7
+ ** percent less (x86 linux, gcc version 4.1.2, -O6) than if
+ ** sqlite3MemRelease() were called from here. With -O2, this jumps
+ ** to 6.6 percent. The test case is inserting 1000 rows into a table
+ ** with no indexes using a single prepared INSERT statement, bind()
+ ** and reset(). Inserts are grouped into a transaction.
+ */
+ if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){
sqlite3VdbeMemRelease(p);
- }else{
- sqlite3VdbeMemReleaseExternal(p);
+ }else if( p->zMalloc ){
+ sqlite3DbFree(db, p->zMalloc);
+ p->zMalloc = 0;
}
+
p->flags = MEM_Null;
- p++;
}
db->mallocFailed = malloc_failed;
}
}
+/*
+** Delete a VdbeFrame object and its contents. VdbeFrame objects are
+** allocated by the OP_Program opcode in sqlite3VdbeExec().
+*/
+SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
+ int i;
+ Mem *aMem = VdbeFrameMem(p);
+ VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem];
+ for(i=0; i<p->nChildCsr; i++){
+ sqlite3VdbeFreeCursor(p->v, apCsr[i]);
+ }
+ releaseMemArray(aMem, p->nChildMem);
+ sqlite3DbFree(p->v->db, p);
+}
+
+
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p){
int ii;
@@ -39063,9 +48211,12 @@ SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p){
assert( sqlite3_mutex_held(p->db->mutex) );
for(ii=1; ii<=p->nMem; ii++){
Mem *pMem = &p->aMem[ii];
+ if( pMem->flags & MEM_RowSet ){
+ sqlite3RowSetClear(pMem->u.pRowSet);
+ }
if( pMem->z && pMem->flags&MEM_Dyn ){
assert( !pMem->xDel );
- nFree += sqlite3MallocSize(pMem->z);
+ nFree += sqlite3DbMallocSize(pMem->db, pMem->z);
sqlite3VdbeMemRelease(pMem);
}
}
@@ -39089,35 +48240,70 @@ SQLITE_PRIVATE int sqlite3VdbeReleaseBuffers(Vdbe *p){
SQLITE_PRIVATE int sqlite3VdbeList(
Vdbe *p /* The VDBE */
){
+ int nRow; /* Total number of rows to return */
+ int nSub = 0; /* Number of sub-vdbes seen so far */
+ SubProgram **apSub = 0; /* Array of sub-vdbes */
+ Mem *pSub = 0;
sqlite3 *db = p->db;
int i;
int rc = SQLITE_OK;
Mem *pMem = p->pResultSet = &p->aMem[1];
assert( p->explain );
- if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE;
+ assert( p->magic==VDBE_MAGIC_RUN );
assert( db->magic==SQLITE_MAGIC_BUSY );
- assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
+ assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM );
/* Even though this opcode does not use dynamic strings for
** the result, result columns may become dynamic if the user calls
** sqlite3_column_text16(), causing a translation to UTF-16 encoding.
*/
- releaseMemArray(pMem, p->nMem, 1);
+ releaseMemArray(pMem, 8);
+
+ if( p->rc==SQLITE_NOMEM ){
+ /* This happens if a malloc() inside a call to sqlite3_column_text() or
+ ** sqlite3_column_text16() failed. */
+ db->mallocFailed = 1;
+ return SQLITE_ERROR;
+ }
+
+ /* Figure out total number of rows that will be returned by this
+ ** EXPLAIN program. */
+ nRow = p->nOp;
+ if( p->explain==1 ){
+ pSub = &p->aMem[9];
+ if( pSub->flags&MEM_Blob ){
+ nSub = pSub->n/sizeof(Vdbe*);
+ apSub = (SubProgram **)pSub->z;
+ }
+ for(i=0; i<nSub; i++){
+ nRow += apSub[i]->nOp;
+ }
+ }
do{
i = p->pc++;
- }while( i<p->nOp && p->explain==2 && p->aOp[i].opcode!=OP_Explain );
- if( i>=p->nOp ){
+ }while( i<nRow && p->explain==2 && p->aOp[i].opcode!=OP_Explain );
+ if( i>=nRow ){
p->rc = SQLITE_OK;
rc = SQLITE_DONE;
}else if( db->u1.isInterrupted ){
p->rc = SQLITE_INTERRUPT;
rc = SQLITE_ERROR;
- sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(p->rc), (char*)0);
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(p->rc));
}else{
char *z;
- Op *pOp = &p->aOp[i];
+ Op *pOp;
+ if( i<p->nOp ){
+ pOp = &p->aOp[i];
+ }else{
+ int j;
+ i -= p->nOp;
+ for(j=0; i>=apSub[j]->nOp; j++){
+ i -= apSub[j]->nOp;
+ }
+ pOp = &apSub[j]->aOp[i];
+ }
if( p->explain==1 ){
pMem->flags = MEM_Int;
pMem->type = SQLITE_INTEGER;
@@ -39127,10 +48313,24 @@ SQLITE_PRIVATE int sqlite3VdbeList(
pMem->flags = MEM_Static|MEM_Str|MEM_Term;
pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
assert( pMem->z!=0 );
- pMem->n = strlen(pMem->z);
+ pMem->n = sqlite3Strlen30(pMem->z);
pMem->type = SQLITE_TEXT;
pMem->enc = SQLITE_UTF8;
pMem++;
+
+ if( pOp->p4type==P4_SUBPROGRAM ){
+ int nByte = (nSub+1)*sizeof(SubProgram*);
+ int j;
+ for(j=0; j<nSub; j++){
+ if( apSub[j]==pOp->p4.pProgram ) break;
+ }
+ if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, 1) ){
+ apSub = (SubProgram **)pSub->z;
+ apSub[nSub++] = pOp->p4.pProgram;
+ pSub->flags |= MEM_Blob;
+ pSub->n = nSub*sizeof(SubProgram*);
+ }
+ }
}
pMem->flags = MEM_Int;
@@ -39151,8 +48351,8 @@ SQLITE_PRIVATE int sqlite3VdbeList(
}
if( sqlite3VdbeMemGrow(pMem, 32, 0) ){ /* P4 */
- p->db->mallocFailed = 1;
- return SQLITE_NOMEM;
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
}
pMem->flags = MEM_Dyn|MEM_Str|MEM_Term;
z = displayP4(pOp, pMem->z, 32);
@@ -39160,7 +48360,7 @@ SQLITE_PRIVATE int sqlite3VdbeList(
sqlite3VdbeMemSetStr(pMem, z, -1, SQLITE_UTF8, 0);
}else{
assert( pMem->z!=0 );
- pMem->n = strlen(pMem->z);
+ pMem->n = sqlite3Strlen30(pMem->z);
pMem->enc = SQLITE_UTF8;
}
pMem->type = SQLITE_TEXT;
@@ -39168,8 +48368,8 @@ SQLITE_PRIVATE int sqlite3VdbeList(
if( p->explain==1 ){
if( sqlite3VdbeMemGrow(pMem, 4, 0) ){
- p->db->mallocFailed = 1;
- return SQLITE_NOMEM;
+ assert( p->db->mallocFailed );
+ return SQLITE_ERROR;
}
pMem->flags = MEM_Dyn|MEM_Str|MEM_Term;
pMem->n = 2;
@@ -39182,8 +48382,9 @@ SQLITE_PRIVATE int sqlite3VdbeList(
if( pOp->zComment ){
pMem->flags = MEM_Str|MEM_Term;
pMem->z = pOp->zComment;
- pMem->n = strlen(pMem->z);
+ pMem->n = sqlite3Strlen30(pMem->z);
pMem->enc = SQLITE_UTF8;
+ pMem->type = SQLITE_TEXT;
}else
#endif
{
@@ -39211,7 +48412,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){
pOp = &p->aOp[0];
if( pOp->opcode==OP_Trace && pOp->p4.z!=0 ){
const char *z = pOp->p4.z;
- while( isspace(*(u8*)z) ) z++;
+ while( sqlite3Isspace(*z) ) z++;
printf("SQL: [%s]\n", z);
}
}
@@ -39231,9 +48432,9 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){
int i, j;
char z[1000];
sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z);
- for(i=0; isspace((unsigned char)z[i]); i++){}
+ for(i=0; sqlite3Isspace(z[i]); i++){}
for(j=0; z[i]; i++){
- if( isspace((unsigned char)z[i]) ){
+ if( sqlite3Isspace(z[i]) ){
if( z[i-1]!=' ' ){
z[j++] = ' ';
}
@@ -39247,6 +48448,40 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){
}
#endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */
+/*
+** Allocate space from a fixed size buffer. Make *pp point to the
+** allocated space. (Note: pp is a char* rather than a void** to
+** work around the pointer aliasing rules of C.) *pp should initially
+** be zero. If *pp is not zero, that means that the space has already
+** been allocated and this routine is a noop.
+**
+** nByte is the number of bytes of space needed.
+**
+** *ppFrom point to available space and pEnd points to the end of the
+** available space.
+**
+** *pnByte is a counter of the number of bytes of space that have failed
+** to allocate. If there is insufficient space in *ppFrom to satisfy the
+** request, then increment *pnByte by the amount of the request.
+*/
+static void allocSpace(
+ char *pp, /* IN/OUT: Set *pp to point to allocated buffer */
+ int nByte, /* Number of bytes to allocate */
+ u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */
+ u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */
+ int *pnByte /* If allocation cannot be made, increment *pnByte */
+){
+ assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) );
+ if( (*(void**)pp)==0 ){
+ nByte = ROUND8(nByte);
+ if( &(*ppFrom)[nByte] <= pEnd ){
+ *(void**)pp = (void *)*ppFrom;
+ *ppFrom += nByte;
+ }else{
+ *pnByte += nByte;
+ }
+ }
+}
/*
** Prepare a virtual machine for execution. This involves things such
@@ -39256,13 +48491,23 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){
**
** This is the only way to move a VDBE from VDBE_MAGIC_INIT to
** VDBE_MAGIC_RUN.
+**
+** This function may be called more than once on a single virtual machine.
+** The first call is made while compiling the SQL statement. Subsequent
+** calls are made as part of the process of resetting a statement to be
+** re-executed (from a call to sqlite3_reset()). The nVar, nMem, nCursor
+** and isExplain parameters are only passed correct values the first time
+** the function is called. On subsequent calls, from sqlite3_reset(), nVar
+** is passed -1 and nMem, nCursor and isExplain are all passed zero.
*/
SQLITE_PRIVATE void sqlite3VdbeMakeReady(
Vdbe *p, /* The VDBE */
int nVar, /* Number of '?' see in the SQL statement */
int nMem, /* Number of memory cells to allocate */
int nCursor, /* Number of cursors to allocate */
- int isExplain /* True if the EXPLAIN keywords is present */
+ int nArg, /* Maximum number of args in SubPrograms */
+ int isExplain, /* True if the EXPLAIN keywords is present */
+ int usesStmtJournal /* True to set Vdbe.usesStmtJournal */
){
int n;
sqlite3 *db = p->db;
@@ -39274,17 +48519,13 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
*/
assert( p->nOp>0 );
- /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. This
- * is because the call to resizeOpArray() below may shrink the
- * p->aOp[] array to save memory if called when in VDBE_MAGIC_RUN
- * state.
- */
+ /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */
p->magic = VDBE_MAGIC_RUN;
/* For each cursor required, also allocate a memory cell. Memory
** cells (nMem+1-nCursor)..nMem, inclusive, will never be used by
** the vdbe program. Instead they are used to allocate space for
- ** Cursor/BtCursor structures. The blob of memory associated with
+ ** VdbeCursor/BtCursor structures. The blob of memory associated with
** cursor 0 is stored in memory cell nMem. Memory cell (nMem-1)
** stores the blob of memory associated with cursor 1, etc.
**
@@ -39292,38 +48533,51 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
*/
nMem += nCursor;
- /*
- ** Allocation space for registers.
+ /* Allocate space for memory registers, SQL variables, VDBE cursors and
+ ** an array to marshal SQL function arguments in. This is only done the
+ ** first time this function is called for a given VDBE, not when it is
+ ** being called from sqlite3_reset() to reset the virtual machine.
*/
- if( p->aMem==0 ){
- int nArg; /* Maximum number of args passed to a user function. */
+ if( nVar>=0 && ALWAYS(db->mallocFailed==0) ){
+ u8 *zCsr = (u8 *)&p->aOp[p->nOp];
+ u8 *zEnd = (u8 *)&p->aOp[p->nOpAlloc];
+ int nByte;
resolveP2Values(p, &nArg);
- /*resizeOpArray(p, p->nOp);*/
- assert( nVar>=0 );
+ p->usesStmtJournal = (u8)usesStmtJournal;
if( isExplain && nMem<10 ){
- p->nMem = nMem = 10;
- }
- p->aMem = sqlite3DbMallocZero(db,
- nMem*sizeof(Mem) /* aMem */
- + nVar*sizeof(Mem) /* aVar */
- + nArg*sizeof(Mem*) /* apArg */
- + nVar*sizeof(char*) /* azVar */
- + nCursor*sizeof(Cursor*) + 1 /* apCsr */
- );
- if( !db->mallocFailed ){
- p->aMem--; /* aMem[] goes from 1..nMem */
- p->nMem = nMem; /* not from 0..nMem-1 */
- p->aVar = &p->aMem[nMem+1];
- p->nVar = nVar;
- p->okVar = 0;
- p->apArg = (Mem**)&p->aVar[nVar];
- p->azVar = (char**)&p->apArg[nArg];
- p->apCsr = (Cursor**)&p->azVar[nVar];
- p->nCursor = nCursor;
+ nMem = 10;
+ }
+ memset(zCsr, 0, zEnd-zCsr);
+ zCsr += (zCsr - (u8*)0)&7;
+ assert( EIGHT_BYTE_ALIGNMENT(zCsr) );
+
+ do {
+ nByte = 0;
+ allocSpace((char*)&p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte);
+ allocSpace((char*)&p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte);
+ allocSpace((char*)&p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte);
+ allocSpace((char*)&p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte);
+ allocSpace((char*)&p->apCsr,
+ nCursor*sizeof(VdbeCursor*), &zCsr, zEnd, &nByte
+ );
+ if( nByte ){
+ p->pFree = sqlite3DbMallocZero(db, nByte);
+ }
+ zCsr = p->pFree;
+ zEnd = &zCsr[nByte];
+ }while( nByte && !db->mallocFailed );
+
+ p->nCursor = (u16)nCursor;
+ if( p->aVar ){
+ p->nVar = (u16)nVar;
for(n=0; n<nVar; n++){
p->aVar[n].flags = MEM_Null;
p->aVar[n].db = db;
}
+ }
+ if( p->aMem ){
+ p->aMem--; /* aMem[] goes from 1..nMem */
+ p->nMem = nMem; /* not from 0..nMem-1 */
for(n=1; n<=nMem; n++){
p->aMem[n].flags = MEM_Null;
p->aMem[n].db = db;
@@ -39338,15 +48592,13 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
p->pc = -1;
p->rc = SQLITE_OK;
- p->uniqueCnt = 0;
- p->returnDepth = 0;
p->errorAction = OE_Abort;
p->explain |= isExplain;
p->magic = VDBE_MAGIC_RUN;
p->nChange = 0;
p->cacheCtr = 1;
p->minWriteFileFormat = 255;
- p->openedStatement = 0;
+ p->iStatement = 0;
#ifdef VDBE_PROFILE
{
int i;
@@ -39362,15 +48614,16 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady(
** Close a VDBE cursor and release all the resources that cursor
** happens to hold.
*/
-SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, Cursor *pCx){
+SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){
if( pCx==0 ){
return;
}
- if( pCx->pCursor ){
- sqlite3BtreeCloseCursor(pCx->pCursor);
- }
if( pCx->pBt ){
sqlite3BtreeClose(pCx->pBt);
+ /* The pCx->pCursor will be close automatically, if it exists, by
+ ** the call above. */
+ }else if( pCx->pCursor ){
+ sqlite3BtreeCloseCursor(pCx->pCursor);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
if( pCx->pVtabCursor ){
@@ -39383,28 +48636,56 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, Cursor *pCx){
p->inVtabMethod = 0;
}
#endif
- if( !pCx->ephemPseudoTable ){
- sqlite3_free(pCx->pData);
- }
- /* memset(pCx, 0, sizeof(Cursor)); */
- /* sqlite3_free(pCx->aType); */
- /* sqlite3_free(pCx); */
}
/*
-** Close all cursors except for VTab cursors that are currently
-** in use.
+** Copy the values stored in the VdbeFrame structure to its Vdbe. This
+** is used, for example, when a trigger sub-program is halted to restore
+** control to the main program.
*/
-static void closeAllCursorsExceptActiveVtabs(Vdbe *p){
- int i;
- if( p->apCsr==0 ) return;
- for(i=0; i<p->nCursor; i++){
- Cursor *pC = p->apCsr[i];
- if( pC && (!p->inVtabMethod || !pC->pVtabCursor) ){
- sqlite3VdbeFreeCursor(p, pC);
- p->apCsr[i] = 0;
+SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){
+ Vdbe *v = pFrame->v;
+ v->aOp = pFrame->aOp;
+ v->nOp = pFrame->nOp;
+ v->aMem = pFrame->aMem;
+ v->nMem = pFrame->nMem;
+ v->apCsr = pFrame->apCsr;
+ v->nCursor = pFrame->nCursor;
+ v->db->lastRowid = pFrame->lastRowid;
+ v->nChange = pFrame->nChange;
+ return pFrame->pc;
+}
+
+/*
+** Close all cursors.
+**
+** Also release any dynamic memory held by the VM in the Vdbe.aMem memory
+** cell array. This is necessary as the memory cell array may contain
+** pointers to VdbeFrame objects, which may in turn contain pointers to
+** open cursors.
+*/
+static void closeAllCursors(Vdbe *p){
+ if( p->pFrame ){
+ VdbeFrame *pFrame = p->pFrame;
+ for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
+ sqlite3VdbeFrameRestore(pFrame);
+ }
+ p->pFrame = 0;
+ p->nFrame = 0;
+
+ if( p->apCsr ){
+ int i;
+ for(i=0; i<p->nCursor; i++){
+ VdbeCursor *pC = p->apCsr[i];
+ if( pC ){
+ sqlite3VdbeFreeCursor(p, pC);
+ p->apCsr[i] = 0;
+ }
}
}
+ if( p->aMem ){
+ releaseMemArray(&p->aMem[1], p->nMem);
+ }
}
/*
@@ -39414,24 +48695,18 @@ static void closeAllCursorsExceptActiveVtabs(Vdbe *p){
** sorters that were left open. It also deletes the values of
** variables in the aVar[] array.
*/
-static void Cleanup(Vdbe *p, int freebuffers){
+static void Cleanup(Vdbe *p){
+ sqlite3 *db = p->db;
+
+#ifdef SQLITE_DEBUG
+ /* Execute assert() statements to ensure that the Vdbe.apCsr[] and
+ ** Vdbe.aMem[] arrays have already been cleaned up. */
int i;
- closeAllCursorsExceptActiveVtabs(p);
- for(i=1; i<=p->nMem; i++){
- MemSetTypeFlag(&p->aMem[i], MEM_Null);
- }
- releaseMemArray(&p->aMem[1], p->nMem, freebuffers);
- sqlite3VdbeFifoClear(&p->sFifo);
- if( p->contextStack ){
- for(i=0; i<p->contextStackTop; i++){
- sqlite3VdbeFifoClear(&p->contextStack[i].sFifo);
- }
- sqlite3_free(p->contextStack);
- }
- p->contextStack = 0;
- p->contextStackDepth = 0;
- p->contextStackTop = 0;
- sqlite3_free(p->zErrMsg);
+ for(i=0; i<p->nCursor; i++) assert( p->apCsr==0 || p->apCsr[i]==0 );
+ for(i=1; i<=p->nMem; i++) assert( p->aMem==0 || p->aMem[i].flags==MEM_Null );
+#endif
+
+ sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
p->pResultSet = 0;
}
@@ -39445,12 +48720,13 @@ static void Cleanup(Vdbe *p, int freebuffers){
SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){
Mem *pColName;
int n;
+ sqlite3 *db = p->db;
- releaseMemArray(p->aColName, p->nResColumn*COLNAME_N, 1);
- sqlite3_free(p->aColName);
+ releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
+ sqlite3DbFree(db, p->aColName);
n = nResColumn*COLNAME_N;
- p->nResColumn = nResColumn;
- p->aColName = pColName = (Mem*)sqlite3DbMallocZero(p->db, sizeof(Mem)*n );
+ p->nResColumn = (u16)nResColumn;
+ p->aColName = pColName = (Mem*)sqlite3DbMallocZero(db, sizeof(Mem)*n );
if( p->aColName==0 ) return;
while( n-- > 0 ){
pColName->flags = MEM_Null;
@@ -39465,28 +48741,29 @@ SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){
**
** This call must be made after a call to sqlite3VdbeSetNumCols().
**
-** If N==P4_STATIC it means that zName is a pointer to a constant static
-** string and we can just copy the pointer. If it is P4_DYNAMIC, then
-** the string is freed using sqlite3_free() when the vdbe is finished with
-** it. Otherwise, N bytes of zName are copied.
+** The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC
+** or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed
+** to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed.
*/
-SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe *p, int idx, int var, const char *zName, int N){
+SQLITE_PRIVATE int sqlite3VdbeSetColName(
+ Vdbe *p, /* Vdbe being configured */
+ int idx, /* Index of column zName applies to */
+ int var, /* One of the COLNAME_* constants */
+ const char *zName, /* Pointer to buffer containing name */
+ void (*xDel)(void*) /* Memory management strategy for zName */
+){
int rc;
Mem *pColName;
assert( idx<p->nResColumn );
assert( var<COLNAME_N );
- if( p->db->mallocFailed ) return SQLITE_NOMEM;
+ if( p->db->mallocFailed ){
+ assert( !zName || xDel!=SQLITE_DYNAMIC );
+ return SQLITE_NOMEM;
+ }
assert( p->aColName!=0 );
pColName = &(p->aColName[idx+var*p->nResColumn]);
- if( N==P4_DYNAMIC || N==P4_STATIC ){
- rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, SQLITE_STATIC);
- }else{
- rc = sqlite3VdbeMemSetStr(pColName, zName, N, SQLITE_UTF8,SQLITE_TRANSIENT);
- }
- if( rc==SQLITE_OK && N==P4_DYNAMIC ){
- pColName->flags &= (~MEM_Static);
- pColName->zMalloc = pColName->z;
- }
+ rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel);
+ assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 );
return rc;
}
@@ -39496,19 +48773,26 @@ SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe *p, int idx, int var, const char *
** write-transaction spanning more than one database file, this routine
** takes care of the master journal trickery.
*/
-static int vdbeCommit(sqlite3 *db){
+static int vdbeCommit(sqlite3 *db, Vdbe *p){
int i;
int nTrans = 0; /* Number of databases with an active write-transaction */
int rc = SQLITE_OK;
int needXcommit = 0;
+#ifdef SQLITE_OMIT_VIRTUALTABLE
+ /* With this option, sqlite3VtabSync() is defined to be simply
+ ** SQLITE_OK so p is not used.
+ */
+ UNUSED_PARAMETER(p);
+#endif
+
/* Before doing anything else, call the xSync() callback for any
** virtual module tables written in this transaction. This has to
** be done before determining whether a master journal file is
** required, as an xSync() callback may add an attached database
** to the transaction.
*/
- rc = sqlite3VtabSync(db, rc);
+ rc = sqlite3VtabSync(db, &p->zErrMsg);
if( rc!=SQLITE_OK ){
return rc;
}
@@ -39542,12 +48826,14 @@ static int vdbeCommit(sqlite3 *db){
** master-journal.
**
** If the return value of sqlite3BtreeGetFilename() is a zero length
- ** string, it means the main database is :memory:. In that case we do
- ** not support atomic multi-file commits, so use the simple case then
- ** too.
+ ** string, it means the main database is :memory: or a temp file. In
+ ** that case we do not support atomic multi-file commits, so use the
+ ** simple case then too.
*/
- if( 0==strlen(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans<=1 ){
- for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
+ if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt))
+ || nTrans<=1
+ ){
+ for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
Btree *pBt = db->aDb[i].pBt;
if( pBt ){
rc = sqlite3BtreeCommitPhaseOne(pBt, 0);
@@ -39582,21 +48868,20 @@ static int vdbeCommit(sqlite3 *db){
char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt);
sqlite3_file *pMaster = 0;
i64 offset = 0;
+ int res;
/* Select a master journal file name */
do {
- u32 random;
- sqlite3_free(zMaster);
- sqlite3_randomness(sizeof(random), &random);
- zMaster = sqlite3MPrintf(db, "%s-mj%08X", zMainFile, random&0x7fffffff);
+ u32 iRandom;
+ sqlite3DbFree(db, zMaster);
+ sqlite3_randomness(sizeof(iRandom), &iRandom);
+ zMaster = sqlite3MPrintf(db, "%s-mj%08X", zMainFile, iRandom&0x7fffffff);
if( !zMaster ){
return SQLITE_NOMEM;
}
- rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS);
- }while( rc==1 );
- if( rc!=0 ){
- rc = SQLITE_IOERR_NOMEM;
- }else{
+ rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res);
+ }while( rc==SQLITE_OK && res );
+ if( rc==SQLITE_OK ){
/* Open the master journal. */
rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster,
SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
@@ -39604,7 +48889,7 @@ static int vdbeCommit(sqlite3 *db){
);
}
if( rc!=SQLITE_OK ){
- sqlite3_free(zMaster);
+ sqlite3DbFree(db, zMaster);
return rc;
}
@@ -39623,12 +48908,12 @@ static int vdbeCommit(sqlite3 *db){
if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){
needSync = 1;
}
- rc = sqlite3OsWrite(pMaster, zFile, strlen(zFile)+1, offset);
- offset += strlen(zFile)+1;
+ rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset);
+ offset += sqlite3Strlen30(zFile)+1;
if( rc!=SQLITE_OK ){
sqlite3OsCloseFree(pMaster);
sqlite3OsDelete(pVfs, zMaster, 0);
- sqlite3_free(zMaster);
+ sqlite3DbFree(db, zMaster);
return rc;
}
}
@@ -39637,13 +48922,13 @@ static int vdbeCommit(sqlite3 *db){
/* Sync the master journal file. If the IOCAP_SEQUENTIAL device
** flag is set this is not required.
*/
- zMainFile = sqlite3BtreeGetDirname(db->aDb[0].pBt);
- if( (needSync
- && (0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL))
- && (rc=sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL))!=SQLITE_OK) ){
+ if( needSync
+ && 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL)
+ && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL))
+ ){
sqlite3OsCloseFree(pMaster);
sqlite3OsDelete(pVfs, zMaster, 0);
- sqlite3_free(zMaster);
+ sqlite3DbFree(db, zMaster);
return rc;
}
@@ -39655,7 +48940,7 @@ static int vdbeCommit(sqlite3 *db){
** sqlite3BtreeCommitPhaseOne(), then there is a chance that the
** master journal file will be orphaned. But we cannot delete it,
** in case the master journal file name was written into the journal
- ** file before the failure occured.
+ ** file before the failure occurred.
*/
for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
Btree *pBt = db->aDb[i].pBt;
@@ -39665,7 +48950,7 @@ static int vdbeCommit(sqlite3 *db){
}
sqlite3OsCloseFree(pMaster);
if( rc!=SQLITE_OK ){
- sqlite3_free(zMaster);
+ sqlite3DbFree(db, zMaster);
return rc;
}
@@ -39674,7 +48959,7 @@ static int vdbeCommit(sqlite3 *db){
** transaction files are deleted.
*/
rc = sqlite3OsDelete(pVfs, zMaster, 1);
- sqlite3_free(zMaster);
+ sqlite3DbFree(db, zMaster);
zMaster = 0;
if( rc ){
return rc;
@@ -39688,14 +48973,14 @@ static int vdbeCommit(sqlite3 *db){
** may be lying around. Returning an error code won't help matters.
*/
disable_simulated_io_errors();
- sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC);
+ sqlite3BeginBenignMalloc();
for(i=0; i<db->nDb; i++){
Btree *pBt = db->aDb[i].pBt;
if( pBt ){
sqlite3BtreeCommitPhaseTwo(pBt);
}
}
- sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC);
+ sqlite3EndBenignMalloc();
enable_simulated_io_errors();
sqlite3VtabCommit(db);
@@ -39718,14 +49003,17 @@ static int vdbeCommit(sqlite3 *db){
static void checkActiveVdbeCnt(sqlite3 *db){
Vdbe *p;
int cnt = 0;
+ int nWrite = 0;
p = db->pVdbe;
while( p ){
if( p->magic==VDBE_MAGIC_RUN && p->pc>=0 ){
cnt++;
+ if( p->readOnly==0 ) nWrite++;
}
p = p->pNext;
}
assert( cnt==db->activeVdbeCnt );
+ assert( nWrite==db->writeVdbeCnt );
}
#else
#define checkActiveVdbeCnt(x)
@@ -39758,6 +49046,111 @@ static void invalidateCursorsOnModifiedBtrees(sqlite3 *db){
}
/*
+** If the Vdbe passed as the first argument opened a statement-transaction,
+** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or
+** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement
+** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the
+** statement transaction is commtted.
+**
+** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned.
+** Otherwise SQLITE_OK.
+*/
+SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){
+ sqlite3 *const db = p->db;
+ int rc = SQLITE_OK;
+
+ /* If p->iStatement is greater than zero, then this Vdbe opened a
+ ** statement transaction that should be closed here. The only exception
+ ** is that an IO error may have occured, causing an emergency rollback.
+ ** In this case (db->nStatement==0), and there is nothing to do.
+ */
+ if( db->nStatement && p->iStatement ){
+ int i;
+ const int iSavepoint = p->iStatement-1;
+
+ assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE);
+ assert( db->nStatement>0 );
+ assert( p->iStatement==(db->nStatement+db->nSavepoint) );
+
+ for(i=0; i<db->nDb; i++){
+ int rc2 = SQLITE_OK;
+ Btree *pBt = db->aDb[i].pBt;
+ if( pBt ){
+ if( eOp==SAVEPOINT_ROLLBACK ){
+ rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint);
+ }
+ if( rc2==SQLITE_OK ){
+ rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint);
+ }
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+ }
+ db->nStatement--;
+ p->iStatement = 0;
+
+ /* If the statement transaction is being rolled back, also restore the
+ ** database handles deferred constraint counter to the value it had when
+ ** the statement transaction was opened. */
+ if( eOp==SAVEPOINT_ROLLBACK ){
+ db->nDeferredCons = p->nStmtDefCons;
+ }
+ }
+ return rc;
+}
+
+/*
+** If SQLite is compiled to support shared-cache mode and to be threadsafe,
+** this routine obtains the mutex associated with each BtShared structure
+** that may be accessed by the VM passed as an argument. In doing so it
+** sets the BtShared.db member of each of the BtShared structures, ensuring
+** that the correct busy-handler callback is invoked if required.
+**
+** If SQLite is not threadsafe but does support shared-cache mode, then
+** sqlite3BtreeEnterAll() is invoked to set the BtShared.db variables
+** of all of BtShared structures accessible via the database handle
+** associated with the VM. Of course only a subset of these structures
+** will be accessed by the VM, and we could use Vdbe.btreeMask to figure
+** that subset out, but there is no advantage to doing so.
+**
+** If SQLite is not threadsafe and does not support shared-cache mode, this
+** function is a no-op.
+*/
+#ifndef SQLITE_OMIT_SHARED_CACHE
+SQLITE_PRIVATE void sqlite3VdbeMutexArrayEnter(Vdbe *p){
+#if SQLITE_THREADSAFE
+ sqlite3BtreeMutexArrayEnter(&p->aMutex);
+#else
+ sqlite3BtreeEnterAll(p->db);
+#endif
+}
+#endif
+
+/*
+** This function is called when a transaction opened by the database
+** handle associated with the VM passed as an argument is about to be
+** committed. If there are outstanding deferred foreign key constraint
+** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK.
+**
+** If there are outstanding FK violations and this function returns
+** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT and write
+** an error message to it. Then return SQLITE_ERROR.
+*/
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){
+ sqlite3 *db = p->db;
+ if( (deferred && db->nDeferredCons>0) || (!deferred && p->nFkConstraint>0) ){
+ p->rc = SQLITE_CONSTRAINT;
+ p->errorAction = OE_Abort;
+ sqlite3SetString(&p->zErrMsg, db, "foreign key constraint failed");
+ return SQLITE_ERROR;
+ }
+ return SQLITE_OK;
+}
+#endif
+
+/*
** This routine is called the when a VDBE tries to halt. If the VDBE
** has made changes and is in autocommit mode, then commit those
** changes. If a rollback is needed, then do the rollback.
@@ -39771,10 +49164,8 @@ static void invalidateCursorsOnModifiedBtrees(sqlite3 *db){
** means the close did not happen and needs to be repeated.
*/
SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
+ int rc; /* Used to store transient return codes */
sqlite3 *db = p->db;
- int i;
- int (*xFunc)(Btree *pBt) = 0; /* Function to call on each btree backend */
- int isSpecialError; /* Set to true if SQLITE_NOMEM or IOERR */
/* This function contains the logic that determines if a statement or
** transaction will be committed or rolled back as a result of the
@@ -39795,7 +49186,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
if( p->db->mallocFailed ){
p->rc = SQLITE_NOMEM;
}
- closeAllCursorsExceptActiveVtabs(p);
+ closeAllCursors(p);
if( p->magic!=VDBE_MAGIC_RUN ){
return SQLITE_OK;
}
@@ -39804,76 +49195,61 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
/* No commit or rollback needed if the program never started */
if( p->pc>=0 ){
int mrc; /* Primary error code from p->rc */
+ int eStatementOp = 0;
+ int isSpecialError; /* Set to true if a 'special' error */
/* Lock all btrees used by the statement */
- sqlite3BtreeMutexArrayEnter(&p->aMutex);
+ sqlite3VdbeMutexArrayEnter(p);
/* Check for one of the special errors */
mrc = p->rc & 0xff;
+ assert( p->rc!=SQLITE_IOERR_BLOCKED ); /* This error no longer exists */
isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR
|| mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL;
if( isSpecialError ){
- /* This loop does static analysis of the query to see which of the
- ** following three categories it falls into:
- **
- ** Read-only
- ** Query with statement journal
- ** Query without statement journal
- **
- ** We could do something more elegant than this static analysis (i.e.
- ** store the type of query as part of the compliation phase), but
- ** handling malloc() or IO failure is a fairly obscure edge case so
- ** this is probably easier. Todo: Might be an opportunity to reduce
- ** code size a very small amount though...
- */
- int notReadOnly = 0;
- int isStatement = 0;
- assert(p->aOp || p->nOp==0);
- for(i=0; i<p->nOp; i++){
- switch( p->aOp[i].opcode ){
- case OP_Transaction:
- notReadOnly |= p->aOp[i].p2;
- break;
- case OP_Statement:
- isStatement = 1;
- break;
- }
- }
-
-
/* If the query was read-only, we need do no rollback at all. Otherwise,
** proceed with the special handling.
*/
- if( notReadOnly || mrc!=SQLITE_INTERRUPT ){
- if( p->rc==SQLITE_IOERR_BLOCKED && isStatement ){
- xFunc = sqlite3BtreeRollbackStmt;
- p->rc = SQLITE_BUSY;
- } else if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && isStatement ){
- xFunc = sqlite3BtreeRollbackStmt;
+ if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){
+ if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){
+ eStatementOp = SAVEPOINT_ROLLBACK;
}else{
/* We are forced to roll back the active transaction. Before doing
** so, abort any other statements this handle currently has active.
*/
invalidateCursorsOnModifiedBtrees(db);
sqlite3RollbackAll(db);
+ sqlite3CloseSavepoints(db);
db->autoCommit = 1;
}
}
}
+
+ /* Check for immediate foreign key violations. */
+ if( p->rc==SQLITE_OK ){
+ sqlite3VdbeCheckFk(p, 0);
+ }
- /* If the auto-commit flag is set and this is the only active vdbe, then
- ** we do either a commit or rollback of the current transaction.
+ /* If the auto-commit flag is set and this is the only active writer
+ ** VM, then we do either a commit or rollback of the current transaction.
**
** Note: This block also runs if one of the special errors handled
- ** above has occured.
+ ** above has occurred.
*/
- if( db->autoCommit && db->activeVdbeCnt==1 ){
+ if( !sqlite3VtabInSync(db)
+ && db->autoCommit
+ && db->writeVdbeCnt==(p->readOnly==0)
+ ){
if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){
- /* The auto-commit flag is true, and the vdbe program was
- ** successful or hit an 'OR FAIL' constraint. This means a commit
- ** is required.
- */
- int rc = vdbeCommit(db);
+ if( sqlite3VdbeCheckFk(p, 1) ){
+ sqlite3BtreeMutexArrayLeave(&p->aMutex);
+ return SQLITE_ERROR;
+ }
+ /* The auto-commit flag is true, the vdbe program was successful
+ ** or hit an 'OR FAIL' constraint and there are no deferred foreign
+ ** key constraints to hold up the transaction. This means a commit
+ ** is required. */
+ rc = vdbeCommit(db, p);
if( rc==SQLITE_BUSY ){
sqlite3BtreeMutexArrayLeave(&p->aMutex);
return SQLITE_BUSY;
@@ -39881,51 +49257,46 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
p->rc = rc;
sqlite3RollbackAll(db);
}else{
+ db->nDeferredCons = 0;
sqlite3CommitInternalChanges(db);
}
}else{
sqlite3RollbackAll(db);
}
- }else if( !xFunc ){
+ db->nStatement = 0;
+ }else if( eStatementOp==0 ){
if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){
- if( p->openedStatement ){
- xFunc = sqlite3BtreeCommitStmt;
- }
+ eStatementOp = SAVEPOINT_RELEASE;
}else if( p->errorAction==OE_Abort ){
- xFunc = sqlite3BtreeRollbackStmt;
+ eStatementOp = SAVEPOINT_ROLLBACK;
}else{
invalidateCursorsOnModifiedBtrees(db);
sqlite3RollbackAll(db);
+ sqlite3CloseSavepoints(db);
db->autoCommit = 1;
}
}
- /* If xFunc is not NULL, then it is one of sqlite3BtreeRollbackStmt or
- ** sqlite3BtreeCommitStmt. Call it once on each backend. If an error occurs
- ** and the return code is still SQLITE_OK, set the return code to the new
- ** error value.
+ /* If eStatementOp is non-zero, then a statement transaction needs to
+ ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to
+ ** do so. If this operation returns an error, and the current statement
+ ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then set the error
+ ** code to the new value.
*/
- assert(!xFunc ||
- xFunc==sqlite3BtreeCommitStmt ||
- xFunc==sqlite3BtreeRollbackStmt
- );
- for(i=0; xFunc && i<db->nDb; i++){
- int rc;
- Btree *pBt = db->aDb[i].pBt;
- if( pBt ){
- rc = xFunc(pBt);
- if( rc && (p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT) ){
- p->rc = rc;
- sqlite3SetString(&p->zErrMsg, 0);
- }
+ if( eStatementOp ){
+ rc = sqlite3VdbeCloseStatement(p, eStatementOp);
+ if( rc && (p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT) ){
+ p->rc = rc;
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = 0;
}
}
- /* If this was an INSERT, UPDATE or DELETE and the statement was committed,
- ** set the change counter.
+ /* If this was an INSERT, UPDATE or DELETE and no statement transaction
+ ** has been rolled back, update the database connection change-counter.
*/
- if( p->changeCntOn && p->pc>=0 ){
- if( !xFunc || xFunc==sqlite3BtreeCommitStmt ){
+ if( p->changeCntOn ){
+ if( eStatementOp!=SAVEPOINT_ROLLBACK ){
sqlite3VdbeSetChanges(db, p->nChange);
}else{
sqlite3VdbeSetChanges(db, 0);
@@ -39946,6 +49317,10 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
/* We have successfully halted and closed the VM. Record this fact. */
if( p->pc>=0 ){
db->activeVdbeCnt--;
+ if( !p->readOnly ){
+ db->writeVdbeCnt--;
+ }
+ assert( db->activeVdbeCnt>=db->writeVdbeCnt );
}
p->magic = VDBE_MAGIC_HALT;
checkActiveVdbeCnt(db);
@@ -39953,6 +49328,15 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
p->rc = SQLITE_NOMEM;
}
+ /* If the auto-commit flag is set to true, then any locks that were held
+ ** by connection db have now been released. Call sqlite3ConnectionUnlocked()
+ ** to invoke any required unlock-notify callbacks.
+ */
+ if( db->autoCommit ){
+ sqlite3ConnectionUnlocked(db);
+ }
+
+ assert( db->activeVdbeCnt>0 || db->autoCommit==0 || db->nStatement==0 );
return SQLITE_OK;
}
@@ -39976,7 +49360,7 @@ SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){
** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to
** VDBE_MAGIC_INIT.
*/
-SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p, int freebuffers){
+SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
sqlite3 *db;
db = p->db;
@@ -39995,8 +49379,11 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p, int freebuffers){
*/
if( p->pc>=0 ){
if( p->zErrMsg ){
- sqlite3ValueSetStr(db->pErr,-1,p->zErrMsg,SQLITE_UTF8,sqlite3_free);
+ sqlite3BeginBenignMalloc();
+ sqlite3ValueSetStr(db->pErr,-1,p->zErrMsg,SQLITE_UTF8,SQLITE_TRANSIENT);
+ sqlite3EndBenignMalloc();
db->errCode = p->rc;
+ sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
}else if( p->rc ){
sqlite3Error(db, p->rc, 0);
@@ -40009,13 +49396,14 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p, int freebuffers){
** called), set the database error in this case as well.
*/
sqlite3Error(db, p->rc, 0);
- sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, sqlite3_free);
+ sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT);
+ sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0;
}
/* Reclaim all memory used by the VDBE
*/
- Cleanup(p, freebuffers);
+ Cleanup(p);
/* Save profiling information from this VDBE run.
*/
@@ -40042,7 +49430,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p, int freebuffers){
}
#endif
p->magic = VDBE_MAGIC_INIT;
- p->aborted = 0;
return p->rc & db->errMask;
}
@@ -40053,12 +49440,9 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p, int freebuffers){
SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){
int rc = SQLITE_OK;
if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){
- rc = sqlite3VdbeReset(p, 1);
+ rc = sqlite3VdbeReset(p);
assert( (rc & p->db->errMask)==rc );
- }else if( p->magic!=VDBE_MAGIC_INIT ){
- return SQLITE_MISUSE;
}
- releaseMemArray(&p->aMem[1], p->nMem, 1);
sqlite3VdbeDelete(p);
return rc;
}
@@ -40073,7 +49457,7 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){
int i;
for(i=0; i<pVdbeFunc->nAux; i++){
struct AuxData *pAux = &pVdbeFunc->apAux[i];
- if( (i>31 || !(mask&(1<<i))) && pAux->pAux ){
+ if( (i>31 || !(mask&(((u32)1)<<i))) && pAux->pAux ){
if( pAux->xDelete ){
pAux->xDelete(pAux->pAux);
}
@@ -40086,58 +49470,55 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){
** Delete an entire VDBE.
*/
SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
- int i;
- if( p==0 ) return;
- Cleanup(p, 1);
+ sqlite3 *db;
+
+ if( NEVER(p==0) ) return;
+ db = p->db;
if( p->pPrev ){
p->pPrev->pNext = p->pNext;
}else{
- assert( p->db->pVdbe==p );
- p->db->pVdbe = p->pNext;
+ assert( db->pVdbe==p );
+ db->pVdbe = p->pNext;
}
if( p->pNext ){
p->pNext->pPrev = p->pPrev;
}
- if( p->aOp ){
- Op *pOp = p->aOp;
- for(i=0; i<p->nOp; i++, pOp++){
- freeP4(pOp->p4type, pOp->p4.p);
-#ifdef SQLITE_DEBUG
- sqlite3_free(pOp->zComment);
-#endif
- }
- sqlite3_free(p->aOp);
- }
- releaseMemArray(p->aVar, p->nVar, 1);
- sqlite3_free(p->aLabel);
- if( p->aMem ){
- sqlite3_free(&p->aMem[1]);
- }
- releaseMemArray(p->aColName, p->nResColumn*COLNAME_N, 1);
- sqlite3_free(p->aColName);
- sqlite3_free(p->zSql);
+ releaseMemArray(p->aVar, p->nVar);
+ releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
+ vdbeFreeOpArray(db, p->aOp, p->nOp);
+ sqlite3DbFree(db, p->aLabel);
+ sqlite3DbFree(db, p->aColName);
+ sqlite3DbFree(db, p->zSql);
p->magic = VDBE_MAGIC_DEAD;
- sqlite3_free(p);
+ sqlite3DbFree(db, p->pFree);
+ sqlite3DbFree(db, p);
}
/*
+** Make sure the cursor p is ready to read or write the row to which it
+** was last positioned. Return an error code if an OOM fault or I/O error
+** prevents us from positioning the cursor to its correct position.
+**
** If a MoveTo operation is pending on the given cursor, then do that
-** MoveTo now. Return an error code. If no MoveTo is pending, this
-** routine does nothing and returns SQLITE_OK.
+** MoveTo now. If no move is pending, check to see if the row has been
+** deleted out from under the cursor and if it has, mark the row as
+** a NULL row.
+**
+** If the cursor is already pointing to the correct row and that row has
+** not been deleted out from under the cursor, then this routine is a no-op.
*/
-SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(Cursor *p){
+SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor *p){
if( p->deferredMoveto ){
int res, rc;
#ifdef SQLITE_TEST
extern int sqlite3_search_count;
#endif
assert( p->isTable );
- rc = sqlite3BtreeMoveto(p->pCursor, 0, 0, p->movetoTarget, 0, &res);
+ rc = sqlite3BtreeMovetoUnpacked(p->pCursor, 0, p->movetoTarget, 0, &res);
if( rc ) return rc;
- *p->pIncrKey = 0;
- p->lastRowid = keyToInt(p->movetoTarget);
- p->rowidIsValid = res==0;
- if( res<0 ){
+ p->lastRowid = p->movetoTarget;
+ p->rowidIsValid = ALWAYS(res==0) ?1:0;
+ if( NEVER(res<0) ){
rc = sqlite3BtreeNext(p->pCursor, &res);
if( rc ) return rc;
}
@@ -40146,6 +49527,14 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(Cursor *p){
#endif
p->deferredMoveto = 0;
p->cacheStatus = CACHE_STALE;
+ }else if( ALWAYS(p->pCursor) ){
+ int hasMoved;
+ int rc = sqlite3BtreeCursorHasMoved(p->pCursor, &hasMoved);
+ if( rc ) return rc;
+ if( hasMoved ){
+ p->cacheStatus = CACHE_STALE;
+ p->nullRow = 1;
+ }
}
return SQLITE_OK;
}
@@ -40155,9 +49544,9 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(Cursor *p){
**
** sqlite3VdbeSerialType()
** sqlite3VdbeSerialTypeLen()
-** sqlite3VdbeSerialRead()
** sqlite3VdbeSerialLen()
-** sqlite3VdbeSerialWrite()
+** sqlite3VdbeSerialPut()
+** sqlite3VdbeSerialGet()
**
** encapsulate the code that serializes values for storage in SQLite
** data and index records. Each serialized value consists of a
@@ -40208,7 +49597,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
i64 i = pMem->u.i;
u64 u;
if( file_format>=4 && (i&1)==i ){
- return 8+i;
+ return 8+(u32)i;
}
u = i<0 ? -i : i;
if( u<=127 ) return 1;
@@ -40221,10 +49610,10 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
if( flags&MEM_Real ){
return 7;
}
- assert( flags&(MEM_Str|MEM_Blob) );
+ assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) );
n = pMem->n;
if( flags & MEM_Zero ){
- n += pMem->u.i;
+ n += pMem->u.nZero;
}
assert( n>=0 );
return ((n*2) + 12 + ((flags&MEM_Str)!=0));
@@ -40233,7 +49622,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
/*
** Return the length of the data corresponding to the supplied serial-type.
*/
-SQLITE_PRIVATE int sqlite3VdbeSerialTypeLen(u32 serial_type){
+SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){
if( serial_type>=12 ){
return (serial_type-12)/2;
}else{
@@ -40313,14 +49702,14 @@ static u64 floatSwap(u64 in){
** of bytes in the zero-filled tail is included in the return value only
** if those bytes were zeroed in buf[].
*/
-SQLITE_PRIVATE int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){
+SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){
u32 serial_type = sqlite3VdbeSerialType(pMem, file_format);
- int len;
+ u32 len;
/* Integer and Real */
if( serial_type<=7 && serial_type>0 ){
u64 v;
- int i;
+ u32 i;
if( serial_type==7 ){
assert( sizeof(v)==sizeof(pMem->r) );
memcpy(&v, &pMem->r, sizeof(v));
@@ -40329,9 +49718,9 @@ SQLITE_PRIVATE int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_f
v = pMem->u.i;
}
len = i = sqlite3VdbeSerialTypeLen(serial_type);
- assert( len<=nBuf );
+ assert( len<=(u32)nBuf );
while( i-- ){
- buf[i] = (v&0xFF);
+ buf[i] = (u8)(v&0xFF);
v >>= 8;
}
return len;
@@ -40339,15 +49728,16 @@ SQLITE_PRIVATE int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_f
/* String or blob */
if( serial_type>=12 ){
- assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.i:0)
- == sqlite3VdbeSerialTypeLen(serial_type) );
+ assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0)
+ == (int)sqlite3VdbeSerialTypeLen(serial_type) );
assert( pMem->n<=nBuf );
len = pMem->n;
memcpy(buf, pMem->z, len);
if( pMem->flags & MEM_Zero ){
- len += pMem->u.i;
- if( len>nBuf ){
- len = nBuf;
+ len += pMem->u.nZero;
+ assert( nBuf>=0 );
+ if( len > (u32)nBuf ){
+ len = (u32)nBuf;
}
memset(&buf[pMem->n], 0, len-pMem->n);
}
@@ -40362,7 +49752,7 @@ SQLITE_PRIVATE int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_f
** Deserialize the data blob pointed to by buf as serial type serial_type
** and store the result in pMem. Return the number of bytes read.
*/
-SQLITE_PRIVATE int sqlite3VdbeSerialGet(
+SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */
@@ -40440,7 +49830,7 @@ SQLITE_PRIVATE int sqlite3VdbeSerialGet(
return 0;
}
default: {
- int len = (serial_type-12)/2;
+ u32 len = (serial_type-12)/2;
pMem->z = (char *)buf;
pMem->n = len;
pMem->xDel = 0;
@@ -40473,94 +49863,113 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(
KeyInfo *pKeyInfo, /* Information about the record format */
int nKey, /* Size of the binary record */
const void *pKey, /* The binary record */
- void *pSpace, /* Space available to hold resulting object */
+ char *pSpace, /* Unaligned space available to hold the object */
int szSpace /* Size of pSpace[] in bytes */
){
const unsigned char *aKey = (const unsigned char *)pKey;
- UnpackedRecord *p;
- int nByte;
- int i, idx, d;
+ UnpackedRecord *p; /* The unpacked record that we will return */
+ int nByte; /* Memory space needed to hold p, in bytes */
+ int d;
+ u32 idx;
+ u16 u; /* Unsigned loop counter */
u32 szHdr;
Mem *pMem;
+ int nOff; /* Increase pSpace by this much to 8-byte align it */
- assert( sizeof(Mem)>sizeof(*p) );
- nByte = sizeof(Mem)*(pKeyInfo->nField+2);
+ /*
+ ** We want to shift the pointer pSpace up such that it is 8-byte aligned.
+ ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift
+ ** it by. If pSpace is already 8-byte aligned, nOff should be zero.
+ */
+ nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7;
+ pSpace += nOff;
+ szSpace -= nOff;
+ nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1);
if( nByte>szSpace ){
p = sqlite3DbMallocRaw(pKeyInfo->db, nByte);
if( p==0 ) return 0;
- p->needFree = 1;
+ p->flags = UNPACKED_NEED_FREE | UNPACKED_NEED_DESTROY;
}else{
- p = pSpace;
- p->needFree = 0;
+ p = (UnpackedRecord*)pSpace;
+ p->flags = UNPACKED_NEED_DESTROY;
}
p->pKeyInfo = pKeyInfo;
p->nField = pKeyInfo->nField + 1;
- p->needDestroy = 1;
- p->aMem = pMem = &((Mem*)p)[1];
+ p->aMem = pMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
+ assert( EIGHT_BYTE_ALIGNMENT(pMem) );
idx = getVarint32(aKey, szHdr);
d = szHdr;
- i = 0;
- while( idx<szHdr && i<p->nField ){
+ u = 0;
+ while( idx<szHdr && u<p->nField && d<=nKey ){
u32 serial_type;
- idx += getVarint32( aKey+idx, serial_type);
- if( d>=nKey && sqlite3VdbeSerialTypeLen(serial_type)>0 ) break;
+ idx += getVarint32(&aKey[idx], serial_type);
pMem->enc = pKeyInfo->enc;
pMem->db = pKeyInfo->db;
pMem->flags = 0;
pMem->zMalloc = 0;
d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem);
pMem++;
- i++;
+ u++;
}
- p->nField = i;
+ assert( u<=pKeyInfo->nField + 1 );
+ p->nField = u;
return (void*)p;
}
/*
-** This routine destroys a UnpackedRecord object
+** This routine destroys a UnpackedRecord object.
*/
SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord *p){
- if( p ){
- if( p->needDestroy ){
- int i;
- Mem *pMem;
- for(i=0, pMem=p->aMem; i<p->nField; i++, pMem++){
- if( pMem->zMalloc ){
- sqlite3VdbeMemRelease(pMem);
- }
- }
- }
- if( p->needFree ){
- sqlite3_free(p);
- }
+ int i;
+ Mem *pMem;
+
+ assert( p!=0 );
+ assert( p->flags & UNPACKED_NEED_DESTROY );
+ for(i=0, pMem=p->aMem; i<p->nField; i++, pMem++){
+ /* The unpacked record is always constructed by the
+ ** sqlite3VdbeUnpackRecord() function above, which makes all
+ ** strings and blobs static. And none of the elements are
+ ** ever transformed, so there is never anything to delete.
+ */
+ if( NEVER(pMem->zMalloc) ) sqlite3VdbeMemRelease(pMem);
+ }
+ if( p->flags & UNPACKED_NEED_FREE ){
+ sqlite3DbFree(p->pKeyInfo->db, p);
}
}
/*
** This function compares the two table rows or index records
** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero
-** or positive integer if {nKey1, pKey1} is less than, equal to or
-** greater than pPKey2. The {nKey1, pKey1} key must be a blob
+** or positive integer if key1 is less than, equal to or
+** greater than key2. The {nKey1, pKey1} key must be a blob
** created by th OP_MakeRecord opcode of the VDBE. The pPKey2
** key must be a parsed key such as obtained from
** sqlite3VdbeParseRecord.
**
** Key1 and Key2 do not have to contain the same number of fields.
-** But if the lengths differ, Key2 must be the shorter of the two.
-**
-** Historical note: In earlier versions of this routine both Key1
-** and Key2 were blobs obtained from OP_MakeRecord. But we found
-** that in typical use the same Key2 would be submitted multiple times
-** in a row. So an optimization was added to parse the Key2 key
-** separately and submit the parsed version. In this way, we avoid
-** parsing the same Key2 multiple times in a row.
+** The key with fewer fields is usually compares less than the
+** longer key. However if the UNPACKED_INCRKEY flags in pPKey2 is set
+** and the common prefixes are equal, then key1 is less than key2.
+** Or if the UNPACKED_MATCH_PREFIX flag is set and the prefixes are
+** equal, then the keys are considered to be equal and
+** the parts beyond the common prefix are ignored.
+**
+** If the UNPACKED_IGNORE_ROWID flag is set, then the last byte of
+** the header of pKey1 is ignored. It is assumed that pKey1 is
+** an index key, and thus ends with a rowid value. The last byte
+** of the header will therefore be the serial type of the rowid:
+** one of 1, 2, 3, 4, 5, 6, 8, or 9 - the integer serial types.
+** The serial type of the final rowid will always be a single byte.
+** By ignoring this last byte of the header, we force the comparison
+** to ignore the rowid at the end of key1.
*/
SQLITE_PRIVATE int sqlite3VdbeRecordCompare(
- int nKey1, const void *pKey1,
- UnpackedRecord *pPKey2
+ int nKey1, const void *pKey1, /* Left key */
+ UnpackedRecord *pPKey2 /* Right key */
){
- u32 d1; /* Offset into aKey[] of next data element */
+ int d1; /* Offset into aKey[] of next data element */
u32 idx1; /* Offset into aKey[] of next header element */
u32 szHdr1; /* Number of bytes in header */
int i = 0;
@@ -40574,10 +49983,14 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare(
mem1.enc = pKeyInfo->enc;
mem1.db = pKeyInfo->db;
mem1.flags = 0;
+ mem1.u.i = 0; /* not needed, here to silence compiler warning */
mem1.zMalloc = 0;
idx1 = getVarint32(aKey1, szHdr1);
d1 = szHdr1;
+ if( pPKey2->flags & UNPACKED_IGNORE_ROWID ){
+ szHdr1--;
+ }
nField = pKeyInfo->nField;
while( idx1<szHdr1 && i<pPKey2->nField ){
u32 serial_type1;
@@ -40599,19 +50012,37 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare(
}
i++;
}
- if( mem1.zMalloc ) sqlite3VdbeMemRelease(&mem1);
- /* One of the keys ran out of fields, but all the fields up to that point
- ** were equal. If the incrKey flag is true, then the second key is
- ** treated as larger.
+ /* No memory allocation is ever used on mem1. */
+ if( NEVER(mem1.zMalloc) ) sqlite3VdbeMemRelease(&mem1);
+
+ /* If the PREFIX_SEARCH flag is set and all fields except the final
+ ** rowid field were equal, then clear the PREFIX_SEARCH flag and set
+ ** pPKey2->rowid to the value of the rowid field in (pKey1, nKey1).
+ ** This is used by the OP_IsUnique opcode.
*/
+ if( (pPKey2->flags & UNPACKED_PREFIX_SEARCH) && i==(pPKey2->nField-1) ){
+ assert( idx1==szHdr1 && rc );
+ assert( mem1.flags & MEM_Int );
+ pPKey2->flags &= ~UNPACKED_PREFIX_SEARCH;
+ pPKey2->rowid = mem1.u.i;
+ }
+
if( rc==0 ){
- if( pKeyInfo->incrKey ){
+ /* rc==0 here means that one of the keys ran out of fields and
+ ** all the fields up to that point were equal. If the UNPACKED_INCRKEY
+ ** flag is set, then break the tie by treating key2 as larger.
+ ** If the UPACKED_PREFIX_MATCH flag is set, then keys with common prefixes
+ ** are considered to be equal. Otherwise, the longer key is the
+ ** larger. As it happens, the pPKey2 will always be the longer
+ ** if there is a difference.
+ */
+ if( pPKey2->flags & UNPACKED_INCRKEY ){
rc = -1;
- }else if( !pKeyInfo->prefixIsEqual ){
- if( d1<nKey1 ){
- rc = 1;
- }
+ }else if( pPKey2->flags & UNPACKED_PREFIX_MATCH ){
+ /* Leave rc==0 */
+ }else if( idx1<szHdr1 ){
+ rc = 1;
}
}else if( pKeyInfo->aSortOrder && i<pKeyInfo->nField
&& pKeyInfo->aSortOrder[i] ){
@@ -40620,29 +50051,17 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare(
return rc;
}
-
-/*
-** The argument is an index entry composed using the OP_MakeRecord opcode.
-** The last entry in this record should be an integer (specifically
-** an integer rowid). This routine returns the number of bytes in
-** that integer.
-*/
-SQLITE_PRIVATE int sqlite3VdbeIdxRowidLen(const u8 *aKey){
- u32 szHdr; /* Size of the header */
- u32 typeRowid; /* Serial type of the rowid */
-
- (void)getVarint32(aKey, szHdr);
- (void)getVarint32(&aKey[szHdr-1], typeRowid);
- return sqlite3VdbeSerialTypeLen(typeRowid);
-}
-
+
/*
** pCur points at an index entry created using the OP_MakeRecord opcode.
** Read the rowid (the last field in the record) and store it in *rowid.
** Return SQLITE_OK if everything works, or an error code otherwise.
+**
+** pCur might be pointing to text obtained from a corrupt database file.
+** So the content cannot be trusted. Do appropriate checks on the content.
*/
-SQLITE_PRIVATE int sqlite3VdbeIdxRowid(BtCursor *pCur, i64 *rowid){
+SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){
i64 nCellKey = 0;
int rc;
u32 szHdr; /* Size of the header */
@@ -40650,76 +50069,104 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(BtCursor *pCur, i64 *rowid){
u32 lenRowid; /* Size of the rowid */
Mem m, v;
- sqlite3BtreeKeySize(pCur, &nCellKey);
- if( nCellKey<=0 ){
- return SQLITE_CORRUPT_BKPT;
- }
- m.flags = 0;
- m.db = 0;
- m.zMalloc = 0;
- rc = sqlite3VdbeMemFromBtree(pCur, 0, nCellKey, 1, &m);
+ UNUSED_PARAMETER(db);
+
+ /* Get the size of the index entry. Only indices entries of less
+ ** than 2GiB are support - anything large must be database corruption.
+ ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so
+ ** this code can safely assume that nCellKey is 32-bits
+ */
+ assert( sqlite3BtreeCursorIsValid(pCur) );
+ rc = sqlite3BtreeKeySize(pCur, &nCellKey);
+ assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
+ assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey );
+
+ /* Read in the complete content of the index entry */
+ memset(&m, 0, sizeof(m));
+ rc = sqlite3VdbeMemFromBtree(pCur, 0, (int)nCellKey, 1, &m);
if( rc ){
return rc;
}
+
+ /* The index entry must begin with a header size */
(void)getVarint32((u8*)m.z, szHdr);
+ testcase( szHdr==3 );
+ testcase( szHdr==m.n );
+ if( unlikely(szHdr<3 || (int)szHdr>m.n) ){
+ goto idx_rowid_corruption;
+ }
+
+ /* The last field of the index should be an integer - the ROWID.
+ ** Verify that the last entry really is an integer. */
(void)getVarint32((u8*)&m.z[szHdr-1], typeRowid);
+ testcase( typeRowid==1 );
+ testcase( typeRowid==2 );
+ testcase( typeRowid==3 );
+ testcase( typeRowid==4 );
+ testcase( typeRowid==5 );
+ testcase( typeRowid==6 );
+ testcase( typeRowid==8 );
+ testcase( typeRowid==9 );
+ if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){
+ goto idx_rowid_corruption;
+ }
lenRowid = sqlite3VdbeSerialTypeLen(typeRowid);
+ testcase( (u32)m.n==szHdr+lenRowid );
+ if( unlikely((u32)m.n<szHdr+lenRowid) ){
+ goto idx_rowid_corruption;
+ }
+
+ /* Fetch the integer off the end of the index record */
sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v);
*rowid = v.u.i;
sqlite3VdbeMemRelease(&m);
return SQLITE_OK;
+
+ /* Jump here if database corruption is detected after m has been
+ ** allocated. Free the m object and return SQLITE_CORRUPT. */
+idx_rowid_corruption:
+ testcase( m.zMalloc!=0 );
+ sqlite3VdbeMemRelease(&m);
+ return SQLITE_CORRUPT_BKPT;
}
/*
-** Compare the key of the index entry that cursor pC is point to against
-** the key string in pKey (of length nKey). Write into *pRes a number
+** Compare the key of the index entry that cursor pC is pointing to against
+** the key string in pUnpacked. Write into *pRes a number
** that is negative, zero, or positive if pC is less than, equal to,
-** or greater than pKey. Return SQLITE_OK on success.
+** or greater than pUnpacked. Return SQLITE_OK on success.
**
-** pKey is either created without a rowid or is truncated so that it
+** pUnpacked is either created without a rowid or is truncated so that it
** omits the rowid at the end. The rowid at the end of the index entry
-** is ignored as well.
+** is ignored as well. Hence, this routine only compares the prefixes
+** of the keys prior to the final rowid, not the entire key.
*/
SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(
- Cursor *pC, /* The cursor to compare against */
- UnpackedRecord *pUnpacked,
- int nKey, const u8 *pKey, /* The key to compare */
+ VdbeCursor *pC, /* The cursor to compare against */
+ UnpackedRecord *pUnpacked, /* Unpacked version of key to compare against */
int *res /* Write the comparison result here */
){
i64 nCellKey = 0;
int rc;
BtCursor *pCur = pC->pCursor;
- int lenRowid;
Mem m;
- UnpackedRecord *pRec;
- char zSpace[200];
- sqlite3BtreeKeySize(pCur, &nCellKey);
- if( nCellKey<=0 ){
+ assert( sqlite3BtreeCursorIsValid(pCur) );
+ rc = sqlite3BtreeKeySize(pCur, &nCellKey);
+ assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
+ /* nCellKey will always be between 0 and 0xffffffff because of the say
+ ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */
+ if( nCellKey<=0 || nCellKey>0x7fffffff ){
*res = 0;
- return SQLITE_OK;
+ return SQLITE_CORRUPT;
}
- m.db = 0;
- m.flags = 0;
- m.zMalloc = 0;
- rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, nCellKey, 1, &m);
+ memset(&m, 0, sizeof(m));
+ rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, (int)nCellKey, 1, &m);
if( rc ){
return rc;
}
- lenRowid = sqlite3VdbeIdxRowidLen((u8*)m.z);
- if( !pUnpacked ){
- pRec = sqlite3VdbeRecordUnpack(pC->pKeyInfo, nKey, pKey,
- zSpace, sizeof(zSpace));
- }else{
- pRec = pUnpacked;
- }
- if( pRec==0 ){
- return SQLITE_NOMEM;
- }
- *res = sqlite3VdbeRecordCompare(m.n-lenRowid, m.z, pRec);
- if( !pUnpacked ){
- sqlite3VdbeDeleteUnpackedRecord(pRec);
- }
+ assert( pUnpacked->flags & UNPACKED_IGNORE_ROWID );
+ *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked);
sqlite3VdbeMemRelease(&m);
return SQLITE_OK;
}
@@ -40782,164 +50229,11 @@ SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){
**
** This file contains code use to implement APIs that are part of the
** VDBE.
-*/
-
-#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
-/*
-** The following structure contains pointers to the end points of a
-** doubly-linked list of all compiled SQL statements that may be holding
-** buffers eligible for release when the sqlite3_release_memory() interface is
-** invoked. Access to this list is protected by the SQLITE_MUTEX_STATIC_LRU2
-** mutex.
-**
-** Statements are added to the end of this list when sqlite3_reset() is
-** called. They are removed either when sqlite3_step() or sqlite3_finalize()
-** is called. When statements are added to this list, the associated
-** register array (p->aMem[1..p->nMem]) may contain dynamic buffers that
-** can be freed using sqlite3VdbeReleaseMemory().
-**
-** When statements are added or removed from this list, the mutex
-** associated with the Vdbe being added or removed (Vdbe.db->mutex) is
-** already held. The LRU2 mutex is then obtained, blocking if necessary,
-** the linked-list pointers manipulated and the LRU2 mutex relinquished.
-*/
-struct StatementLruList {
- Vdbe *pFirst;
- Vdbe *pLast;
-};
-static struct StatementLruList sqlite3LruStatements;
-
-/*
-** Check that the list looks to be internally consistent. This is used
-** as part of an assert() statement as follows:
**
-** assert( stmtLruCheck() );
-*/
-#ifndef NDEBUG
-static int stmtLruCheck(){
- Vdbe *p;
- for(p=sqlite3LruStatements.pFirst; p; p=p->pLruNext){
- assert(p->pLruNext || p==sqlite3LruStatements.pLast);
- assert(!p->pLruNext || p->pLruNext->pLruPrev==p);
- assert(p->pLruPrev || p==sqlite3LruStatements.pFirst);
- assert(!p->pLruPrev || p->pLruPrev->pLruNext==p);
- }
- return 1;
-}
-#endif
-
-/*
-** Add vdbe p to the end of the statement lru list. It is assumed that
-** p is not already part of the list when this is called. The lru list
-** is protected by the SQLITE_MUTEX_STATIC_LRU mutex.
-*/
-static void stmtLruAdd(Vdbe *p){
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
-
- if( p->pLruPrev || p->pLruNext || sqlite3LruStatements.pFirst==p ){
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
- return;
- }
-
- assert( stmtLruCheck() );
-
- if( !sqlite3LruStatements.pFirst ){
- assert( !sqlite3LruStatements.pLast );
- sqlite3LruStatements.pFirst = p;
- sqlite3LruStatements.pLast = p;
- }else{
- assert( !sqlite3LruStatements.pLast->pLruNext );
- p->pLruPrev = sqlite3LruStatements.pLast;
- sqlite3LruStatements.pLast->pLruNext = p;
- sqlite3LruStatements.pLast = p;
- }
-
- assert( stmtLruCheck() );
-
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
-}
-
-/*
-** Assuming the SQLITE_MUTEX_STATIC_LRU2 mutext is already held, remove
-** statement p from the least-recently-used statement list. If the
-** statement is not currently part of the list, this call is a no-op.
-*/
-static void stmtLruRemoveNomutex(Vdbe *p){
- if( p->pLruPrev || p->pLruNext || p==sqlite3LruStatements.pFirst ){
- assert( stmtLruCheck() );
- if( p->pLruNext ){
- p->pLruNext->pLruPrev = p->pLruPrev;
- }else{
- sqlite3LruStatements.pLast = p->pLruPrev;
- }
- if( p->pLruPrev ){
- p->pLruPrev->pLruNext = p->pLruNext;
- }else{
- sqlite3LruStatements.pFirst = p->pLruNext;
- }
- p->pLruNext = 0;
- p->pLruPrev = 0;
- assert( stmtLruCheck() );
- }
-}
-
-/*
-** Assuming the SQLITE_MUTEX_STATIC_LRU2 mutext is not held, remove
-** statement p from the least-recently-used statement list. If the
-** statement is not currently part of the list, this call is a no-op.
-*/
-static void stmtLruRemove(Vdbe *p){
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
- stmtLruRemoveNomutex(p);
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
-}
-
-/*
-** Try to release n bytes of memory by freeing buffers associated
-** with the memory registers of currently unused vdbes.
-*/
-SQLITE_PRIVATE int sqlite3VdbeReleaseMemory(int n){
- Vdbe *p;
- Vdbe *pNext;
- int nFree = 0;
-
- sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
- for(p=sqlite3LruStatements.pFirst; p && nFree<n; p=pNext){
- pNext = p->pLruNext;
-
- /* For each statement handle in the lru list, attempt to obtain the
- ** associated database mutex. If it cannot be obtained, continue
- ** to the next statement handle. It is not possible to block on
- ** the database mutex - that could cause deadlock.
- */
- if( SQLITE_OK==sqlite3_mutex_try(p->db->mutex) ){
- nFree += sqlite3VdbeReleaseBuffers(p);
- stmtLruRemoveNomutex(p);
- sqlite3_mutex_leave(p->db->mutex);
- }
- }
- sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU2));
-
- return nFree;
-}
-
-/*
-** Call sqlite3Reprepare() on the statement. Remove it from the
-** lru list before doing so, as Reprepare() will free all the
-** memory register buffers anyway.
+** $Id: vdbeapi.c,v 1.167 2009/06/25 01:47:12 drh Exp $
*/
-int vdbeReprepare(Vdbe *p){
- stmtLruRemove(p);
- return sqlite3Reprepare(p);
-}
-
-#else /* !SQLITE_ENABLE_MEMORY_MANAGEMENT */
- #define stmtLruRemove(x)
- #define stmtLruAdd(x)
- #define vdbeReprepare(x) sqlite3Reprepare(x)
-#endif
-
+#ifndef SQLITE_OMIT_DEPRECATED
/*
** Return TRUE (non-zero) of the statement supplied as an argument needs
** to be recompiled. A statement needs to be recompiled whenever the
@@ -40952,6 +50246,7 @@ SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){
Vdbe *p = (Vdbe*)pStmt;
return p==0 || p->expired;
}
+#endif
/*
** The following routine destroys a virtual machine that is created by
@@ -40968,12 +50263,13 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){
rc = SQLITE_OK;
}else{
Vdbe *v = (Vdbe*)pStmt;
-#ifndef SQLITE_MUTEX_NOOP
+ sqlite3 *db = v->db;
+#if SQLITE_THREADSAFE
sqlite3_mutex *mutex = v->db->mutex;
#endif
sqlite3_mutex_enter(mutex);
- stmtLruRemove(v);
rc = sqlite3VdbeFinalize(v);
+ rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(mutex);
}
return rc;
@@ -40994,10 +50290,10 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){
}else{
Vdbe *v = (Vdbe*)pStmt;
sqlite3_mutex_enter(v->db->mutex);
- rc = sqlite3VdbeReset(v, 1);
- stmtLruAdd(v);
- sqlite3VdbeMakeReady(v, -1, 0, 0, 0);
+ rc = sqlite3VdbeReset(v);
+ sqlite3VdbeMakeReady(v, -1, 0, 0, 0, 0, 0);
assert( (rc & (v->db->errMask))==rc );
+ rc = sqlite3ApiExit(v->db, rc);
sqlite3_mutex_leave(v->db->mutex);
}
return rc;
@@ -41010,7 +50306,7 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
int i;
int rc = SQLITE_OK;
Vdbe *p = (Vdbe*)pStmt;
-#ifndef SQLITE_MUTEX_NOOP
+#if SQLITE_THREADSAFE
sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex;
#endif
sqlite3_mutex_enter(mutex);
@@ -41048,7 +50344,7 @@ SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){
return sqlite3VdbeRealValue((Mem*)pVal);
}
SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){
- return sqlite3VdbeIntValue((Mem*)pVal);
+ return (int)sqlite3VdbeIntValue((Mem*)pVal);
}
SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
return sqlite3VdbeIntValue((Mem*)pVal);
@@ -41074,7 +50370,22 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
/**************************** sqlite3_result_ *******************************
** The following routines are used by user-defined functions to specify
** the function result.
+**
+** The setStrOrError() funtion calls sqlite3VdbeMemSetStr() to store the
+** result as a string or blob but if the string or blob is too large, it
+** then sets the error code to SQLITE_TOOBIG
*/
+static void setResultStrOrError(
+ sqlite3_context *pCtx, /* Function context */
+ const char *z, /* String pointer */
+ int n, /* Bytes in string, or negative */
+ u8 enc, /* Encoding of z. 0 for BLOBs */
+ void (*xDel)(void*) /* Destructor function */
+){
+ if( sqlite3VdbeMemSetStr(&pCtx->s, z, n, enc, xDel)==SQLITE_TOOBIG ){
+ sqlite3_result_error_toobig(pCtx);
+ }
+}
SQLITE_API void sqlite3_result_blob(
sqlite3_context *pCtx,
const void *z,
@@ -41083,7 +50394,7 @@ SQLITE_API void sqlite3_result_blob(
){
assert( n>=0 );
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
- sqlite3VdbeMemSetStr(&pCtx->s, z, n, 0, xDel);
+ setResultStrOrError(pCtx, z, n, 0, xDel);
}
SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
@@ -41120,7 +50431,7 @@ SQLITE_API void sqlite3_result_text(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
- sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, xDel);
+ setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel);
}
#ifndef SQLITE_OMIT_UTF16
SQLITE_API void sqlite3_result_text16(
@@ -41130,7 +50441,7 @@ SQLITE_API void sqlite3_result_text16(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
- sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel);
+ setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel);
}
SQLITE_API void sqlite3_result_text16be(
sqlite3_context *pCtx,
@@ -41139,7 +50450,7 @@ SQLITE_API void sqlite3_result_text16be(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
- sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16BE, xDel);
+ setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel);
}
SQLITE_API void sqlite3_result_text16le(
sqlite3_context *pCtx,
@@ -41148,7 +50459,7 @@ SQLITE_API void sqlite3_result_text16le(
void (*xDel)(void *)
){
assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
- sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16LE, xDel);
+ setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel);
}
#endif /* SQLITE_OMIT_UTF16 */
SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
@@ -41161,6 +50472,10 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
}
SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
pCtx->isError = errCode;
+ if( pCtx->s.flags & MEM_Null ){
+ sqlite3VdbeMemSetStr(&pCtx->s, sqlite3ErrStr(errCode), -1,
+ SQLITE_UTF8, SQLITE_STATIC);
+ }
}
/* Force an SQLITE_TOOBIG error. */
@@ -41199,13 +50514,12 @@ static int sqlite3Step(Vdbe *p){
/* Assert that malloc() has not failed */
db = p->db;
- assert( !db->mallocFailed );
-
- if( p->aborted ){
- return SQLITE_ABORT;
+ if( db->mallocFailed ){
+ return SQLITE_NOMEM;
}
+
if( p->pc<=0 && p->expired ){
- if( p->rc==SQLITE_OK ){
+ if( ALWAYS(p->rc==SQLITE_OK) ){
p->rc = SQLITE_SCHEMA;
}
rc = SQLITE_ERROR;
@@ -41224,17 +50538,19 @@ static int sqlite3Step(Vdbe *p){
db->u1.isInterrupted = 0;
}
+ assert( db->writeVdbeCnt>0 || db->autoCommit==0 || db->nDeferredCons==0 );
+
#ifndef SQLITE_OMIT_TRACE
if( db->xProfile && !db->init.busy ){
double rNow;
sqlite3OsCurrentTime(db->pVfs, &rNow);
- p->startTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0;
+ p->startTime = (u64)((rNow - (int)rNow)*3600.0*24.0*1000000000.0);
}
#endif
db->activeVdbeCnt++;
+ if( p->readOnly==0 ) db->writeVdbeCnt++;
p->pc = 0;
- stmtLruRemove(p);
}
#ifndef SQLITE_OMIT_EXPLAIN
if( p->explain ){
@@ -41252,31 +50568,41 @@ static int sqlite3Step(Vdbe *p){
#ifndef SQLITE_OMIT_TRACE
/* Invoke the profile callback if there is one
*/
- if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->nOp>0
- && p->aOp[0].opcode==OP_Trace && p->aOp[0].p4.z!=0 ){
+ if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
double rNow;
u64 elapseTime;
sqlite3OsCurrentTime(db->pVfs, &rNow);
- elapseTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0 - p->startTime;
- db->xProfile(db->pProfileArg, p->aOp[0].p4.z, elapseTime);
+ elapseTime = (u64)((rNow - (int)rNow)*3600.0*24.0*1000000000.0);
+ elapseTime -= p->startTime;
+ db->xProfile(db->pProfileArg, p->zSql, elapseTime);
}
#endif
- sqlite3Error(p->db, rc, 0);
- p->rc = sqlite3ApiExit(p->db, p->rc);
+ db->errCode = rc;
+ if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){
+ p->rc = SQLITE_NOMEM;
+ }
end_of_step:
- assert( (rc&0xff)==rc );
- if( p->zSql && (rc&0xff)<SQLITE_ROW ){
- /* This behavior occurs if sqlite3_prepare_v2() was used to build
- ** the prepared statement. Return error codes directly */
- sqlite3Error(p->db, p->rc, 0);
- return p->rc;
- }else{
- /* This is for legacy sqlite3_prepare() builds and when the code
- ** is SQLITE_ROW or SQLITE_DONE */
- return rc;
+ /* At this point local variable rc holds the value that should be
+ ** returned if this statement was compiled using the legacy
+ ** sqlite3_prepare() interface. According to the docs, this can only
+ ** be one of the values in the first assert() below. Variable p->rc
+ ** contains the value that would be returned if sqlite3_finalize()
+ ** were called on statement p.
+ */
+ assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR
+ || rc==SQLITE_BUSY || rc==SQLITE_MISUSE
+ );
+ assert( p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE );
+ if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
+ /* If this statement was prepared using sqlite3_prepare_v2(), and an
+ ** error has occured, then return the error code in p->rc to the
+ ** caller. Set the error code in the database handle to the same value.
+ */
+ rc = db->errCode = p->rc;
}
+ return (rc&db->errMask);
}
/*
@@ -41284,19 +50610,6 @@ end_of_step:
** sqlite3Step() to do most of the work. If a schema error occurs,
** call sqlite3Reprepare() and try again.
*/
-#ifdef SQLITE_OMIT_PARSER
-SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
- int rc = SQLITE_MISUSE;
- if( pStmt ){
- Vdbe *v;
- v = (Vdbe*)pStmt;
- sqlite3_mutex_enter(v->db->mutex);
- rc = sqlite3Step(v);
- sqlite3_mutex_leave(v->db->mutex);
- }
- return rc;
-}
-#else
SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
int rc = SQLITE_MISUSE;
if( pStmt ){
@@ -41306,11 +50619,11 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
sqlite3_mutex_enter(db->mutex);
while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
&& cnt++ < 5
- && vdbeReprepare(v) ){
+ && (rc = sqlite3Reprepare(v))==SQLITE_OK ){
sqlite3_reset(pStmt);
v->expired = 0;
}
- if( rc==SQLITE_SCHEMA && v->zSql && db->pErr ){
+ if( rc==SQLITE_SCHEMA && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
/* This case occurs after failing to recompile an sql statement.
** The error message from the SQL compiler has already been loaded
** into the database handle. This block copies the error message
@@ -41320,7 +50633,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
** sqlite3_errmsg() and sqlite3_errcode().
*/
const char *zErr = (const char *)sqlite3_value_text(db->pErr);
- sqlite3_free(v->zErrMsg);
+ sqlite3DbFree(db, v->zErrMsg);
if( !db->mallocFailed ){
v->zErrMsg = sqlite3DbStrDup(db, zErr);
} else {
@@ -41333,7 +50646,6 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
}
return rc;
}
-#endif
/*
** Extract the user data from a sqlite3_context structure and return a
@@ -41363,12 +50675,13 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
*/
SQLITE_PRIVATE void sqlite3InvalidFunction(
sqlite3_context *context, /* The function calling context */
- int argc, /* Number of arguments to the function */
- sqlite3_value **argv /* Value of each argument */
+ int NotUsed, /* Number of arguments to the function */
+ sqlite3_value **NotUsed2 /* Value of each argument */
){
const char *zName = context->pFunc->zName;
char *zErr;
- zErr = sqlite3MPrintf(0,
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ zErr = sqlite3_mprintf(
"unable to use function %s in the requested context", zName);
sqlite3_result_error(context, zErr, -1);
sqlite3_free(zErr);
@@ -41460,6 +50773,7 @@ failed:
}
}
+#ifndef SQLITE_OMIT_DEPRECATED
/*
** Return the number of times the Step function of a aggregate has been
** called.
@@ -41470,9 +50784,10 @@ failed:
** context.
*/
SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){
- assert( p && p->pFunc && p->pFunc->xStep );
+ assert( p && p->pMem && p->pFunc && p->pFunc->xStep );
return p->pMem->n;
}
+#endif
/*
** Return the number of columns in the result set for the statement pStmt.
@@ -41510,8 +50825,24 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){
vals = sqlite3_data_count(pStmt);
pOut = &pVm->pResultSet[i];
}else{
- static const Mem nullMem = {{0}, 0.0, 0, "", 0, MEM_Null, SQLITE_NULL, 0, 0, 0 };
- if( pVm->db ){
+ /* If the value passed as the second argument is out of range, return
+ ** a pointer to the following static Mem object which contains the
+ ** value SQL NULL. Even though the Mem structure contains an element
+ ** of type i64, on certain architecture (x86) with certain compiler
+ ** switches (-Os), gcc may align this Mem object on a 4-byte boundary
+ ** instead of an 8-byte one. This all works fine, except that when
+ ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s
+ ** that a Mem structure is located on an 8-byte boundary. To prevent
+ ** this assert() from failing, when building with SQLITE_DEBUG defined
+ ** using gcc, force nullMem to be 8-byte aligned using the magical
+ ** __attribute__((aligned(8))) macro. */
+ static const Mem nullMem
+#if defined(SQLITE_DEBUG) && defined(__GNUC__)
+ __attribute__((aligned(8)))
+#endif
+ = {{0}, (double)0, 0, "", 0, MEM_Null, SQLITE_NULL, 0, 0, 0 };
+
+ if( pVm && ALWAYS(pVm->db) ){
sqlite3_mutex_enter(pVm->db->mutex);
sqlite3Error(pVm->db, SQLITE_RANGE, 0);
}
@@ -41598,9 +50929,13 @@ SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){
return val;
}
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){
- sqlite3_value *pOut = columnMem(pStmt, i);
+ Mem *pOut = columnMem(pStmt, i);
+ if( pOut->flags&MEM_Static ){
+ pOut->flags &= ~MEM_Static;
+ pOut->flags |= MEM_Ephem;
+ }
columnMallocFailure(pStmt);
- return pOut;
+ return (sqlite3_value *)pOut;
}
#ifndef SQLITE_OMIT_UTF16
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){
@@ -41647,24 +50982,23 @@ static const void *columnName(
const void *ret = 0;
Vdbe *p = (Vdbe *)pStmt;
int n;
+ sqlite3 *db = p->db;
-
- if( p!=0 ){
- n = sqlite3_column_count(pStmt);
- if( N<n && N>=0 ){
- N += useType*n;
- sqlite3_mutex_enter(p->db->mutex);
- ret = xFunc(&p->aColName[N]);
-
- /* A malloc may have failed inside of the xFunc() call. If this
- ** is the case, clear the mallocFailed flag and return NULL.
- */
- if( p->db && p->db->mallocFailed ){
- p->db->mallocFailed = 0;
- ret = 0;
- }
- sqlite3_mutex_leave(p->db->mutex);
+ assert( db!=0 );
+ n = sqlite3_column_count(pStmt);
+ if( N<n && N>=0 ){
+ N += useType*n;
+ sqlite3_mutex_enter(db->mutex);
+ assert( db->mallocFailed==0 );
+ ret = xFunc(&p->aColName[N]);
+ /* A malloc may have failed inside of the xFunc() call. If this
+ ** is the case, clear the mallocFailed flag and return NULL.
+ */
+ if( db->mallocFailed ){
+ db->mallocFailed = 0;
+ ret = 0;
}
+ sqlite3_mutex_leave(db->mutex);
}
return ret;
}
@@ -41770,17 +51104,24 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
** the same as binding a NULL value to the column. If the "i" parameter is
** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK.
**
+** A successful evaluation of this routine acquires the mutex on p.
+** the mutex is released if any kind of error occurs.
+**
** The error code stored in database p->db is overwritten with the return
** value in any case.
*/
static int vdbeUnbind(Vdbe *p, int i){
Mem *pVar;
- if( p==0 || p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
- if( p ) sqlite3Error(p->db, SQLITE_MISUSE, 0);
+ if( p==0 ) return SQLITE_MISUSE;
+ sqlite3_mutex_enter(p->db->mutex);
+ if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
+ sqlite3Error(p->db, SQLITE_MISUSE, 0);
+ sqlite3_mutex_leave(p->db->mutex);
return SQLITE_MISUSE;
}
if( i<1 || i>p->nVar ){
sqlite3Error(p->db, SQLITE_RANGE, 0);
+ sqlite3_mutex_leave(p->db->mutex);
return SQLITE_RANGE;
}
i--;
@@ -41800,27 +51141,25 @@ static int bindText(
const void *zData, /* Pointer to the data to be bound */
int nData, /* Number of bytes of data to be bound */
void (*xDel)(void*), /* Destructor for the data */
- int encoding /* Encoding for the data */
+ u8 encoding /* Encoding for the data */
){
Vdbe *p = (Vdbe *)pStmt;
Mem *pVar;
int rc;
- if( p==0 ){
- return SQLITE_MISUSE;
- }
- sqlite3_mutex_enter(p->db->mutex);
rc = vdbeUnbind(p, i);
- if( rc==SQLITE_OK && zData!=0 ){
- pVar = &p->aVar[i-1];
- rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
- if( rc==SQLITE_OK && encoding!=0 ){
- rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
+ if( rc==SQLITE_OK ){
+ if( zData!=0 ){
+ pVar = &p->aVar[i-1];
+ rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
+ if( rc==SQLITE_OK && encoding!=0 ){
+ rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
+ }
+ sqlite3Error(p->db, rc, 0);
+ rc = sqlite3ApiExit(p->db, rc);
}
- sqlite3Error(p->db, rc, 0);
- rc = sqlite3ApiExit(p->db, rc);
+ sqlite3_mutex_leave(p->db->mutex);
}
- sqlite3_mutex_leave(p->db->mutex);
return rc;
}
@@ -41840,12 +51179,11 @@ SQLITE_API int sqlite3_bind_blob(
SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- sqlite3_mutex_enter(p->db->mutex);
rc = vdbeUnbind(p, i);
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
+ sqlite3_mutex_leave(p->db->mutex);
}
- sqlite3_mutex_leave(p->db->mutex);
return rc;
}
SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
@@ -41854,20 +51192,20 @@ SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- sqlite3_mutex_enter(p->db->mutex);
rc = vdbeUnbind(p, i);
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
+ sqlite3_mutex_leave(p->db->mutex);
}
- sqlite3_mutex_leave(p->db->mutex);
return rc;
}
SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
int rc;
Vdbe *p = (Vdbe*)pStmt;
- sqlite3_mutex_enter(p->db->mutex);
rc = vdbeUnbind(p, i);
- sqlite3_mutex_leave(p->db->mutex);
+ if( rc==SQLITE_OK ){
+ sqlite3_mutex_leave(p->db->mutex);
+ }
return rc;
}
SQLITE_API int sqlite3_bind_text(
@@ -41892,25 +51230,43 @@ SQLITE_API int sqlite3_bind_text16(
#endif /* SQLITE_OMIT_UTF16 */
SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
int rc;
- Vdbe *p = (Vdbe *)pStmt;
- sqlite3_mutex_enter(p->db->mutex);
- rc = vdbeUnbind(p, i);
- if( rc==SQLITE_OK ){
- rc = sqlite3VdbeMemCopy(&p->aVar[i-1], pValue);
+ switch( pValue->type ){
+ case SQLITE_INTEGER: {
+ rc = sqlite3_bind_int64(pStmt, i, pValue->u.i);
+ break;
+ }
+ case SQLITE_FLOAT: {
+ rc = sqlite3_bind_double(pStmt, i, pValue->r);
+ break;
+ }
+ case SQLITE_BLOB: {
+ if( pValue->flags & MEM_Zero ){
+ rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero);
+ }else{
+ rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT);
+ }
+ break;
+ }
+ case SQLITE_TEXT: {
+ rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT,
+ pValue->enc);
+ break;
+ }
+ default: {
+ rc = sqlite3_bind_null(pStmt, i);
+ break;
+ }
}
- rc = sqlite3ApiExit(p->db, rc);
- sqlite3_mutex_leave(p->db->mutex);
return rc;
}
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
int rc;
Vdbe *p = (Vdbe *)pStmt;
- sqlite3_mutex_enter(p->db->mutex);
rc = vdbeUnbind(p, i);
if( rc==SQLITE_OK ){
sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
+ sqlite3_mutex_leave(p->db->mutex);
}
- sqlite3_mutex_leave(p->db->mutex);
return rc;
}
@@ -41930,18 +51286,21 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){
*/
static void createVarMap(Vdbe *p){
if( !p->okVar ){
+ int j;
+ Op *pOp;
sqlite3_mutex_enter(p->db->mutex);
- if( !p->okVar ){
- int j;
- Op *pOp;
- for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){
- if( pOp->opcode==OP_Variable ){
- assert( pOp->p1>0 && pOp->p1<=p->nVar );
- p->azVar[pOp->p1-1] = pOp->p4.z;
- }
+ /* The race condition here is harmless. If two threads call this
+ ** routine on the same Vdbe at the same time, they both might end
+ ** up initializing the Vdbe.azVar[] array. That is a little extra
+ ** work but it results in the same answer.
+ */
+ for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){
+ if( pOp->opcode==OP_Variable ){
+ assert( pOp->p1>0 && pOp->p1<=p->nVar );
+ p->azVar[pOp->p1-1] = pOp->p4.z;
}
- p->okVar = 1;
}
+ p->okVar = 1;
sqlite3_mutex_leave(p->db->mutex);
}
}
@@ -41986,29 +51345,43 @@ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zNa
/*
** Transfer all bindings from the first statement over to the second.
+*/
+SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
+ Vdbe *pFrom = (Vdbe*)pFromStmt;
+ Vdbe *pTo = (Vdbe*)pToStmt;
+ int i;
+ assert( pTo->db==pFrom->db );
+ assert( pTo->nVar==pFrom->nVar );
+ sqlite3_mutex_enter(pTo->db->mutex);
+ for(i=0; i<pFrom->nVar; i++){
+ sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
+ }
+ sqlite3_mutex_leave(pTo->db->mutex);
+ return SQLITE_OK;
+}
+
+#ifndef SQLITE_OMIT_DEPRECATED
+/*
+** Deprecated external interface. Internal/core SQLite code
+** should call sqlite3TransferBindings.
+**
+** Is is misuse to call this routine with statements from different
+** database connections. But as this is a deprecated interface, we
+** will not bother to check for that condition.
+**
** If the two statements contain a different number of bindings, then
-** an SQLITE_ERROR is returned.
+** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise
+** SQLITE_OK is returned.
*/
SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
Vdbe *pFrom = (Vdbe*)pFromStmt;
Vdbe *pTo = (Vdbe*)pToStmt;
- int i, rc = SQLITE_OK;
- if( (pFrom->magic!=VDBE_MAGIC_RUN && pFrom->magic!=VDBE_MAGIC_HALT)
- || (pTo->magic!=VDBE_MAGIC_RUN && pTo->magic!=VDBE_MAGIC_HALT)
- || pTo->db!=pFrom->db ){
- return SQLITE_MISUSE;
- }
if( pFrom->nVar!=pTo->nVar ){
return SQLITE_ERROR;
}
- sqlite3_mutex_enter(pTo->db->mutex);
- for(i=0; rc==SQLITE_OK && i<pFrom->nVar; i++){
- sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
- }
- sqlite3_mutex_leave(pTo->db->mutex);
- assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
- return rc;
+ return sqlite3TransferBindings(pFromStmt, pToStmt);
}
+#endif
/*
** Return the sqlite3* database handle to which the prepared statement given
@@ -42020,6 +51393,34 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
return pStmt ? ((Vdbe*)pStmt)->db : 0;
}
+/*
+** Return a pointer to the next prepared statement after pStmt associated
+** with database connection pDb. If pStmt is NULL, return the first
+** prepared statement for the database connection. Return NULL if there
+** are no more.
+*/
+SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){
+ sqlite3_stmt *pNext;
+ sqlite3_mutex_enter(pDb->mutex);
+ if( pStmt==0 ){
+ pNext = (sqlite3_stmt*)pDb->pVdbe;
+ }else{
+ pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext;
+ }
+ sqlite3_mutex_leave(pDb->mutex);
+ return pNext;
+}
+
+/*
+** Return the value of a status counter for a prepared statement
+*/
+SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
+ Vdbe *pVdbe = (Vdbe*)pStmt;
+ int v = pVdbe->aCounter[op-1];
+ if( resetFlag ) pVdbe->aCounter[op-1] = 0;
+ return v;
+}
+
/************** End of vdbeapi.c *********************************************/
/************** Begin file vdbe.c ********************************************/
/*
@@ -42053,7 +51454,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
** Computation results are stored on a set of registers numbered beginning
** with 1 and going up to Vdbe.nMem. Each register can store
** either an integer, a null-terminated string, a floating point
-** number, or the SQL "NULL" value. An inplicit conversion from one
+** number, or the SQL "NULL" value. An implicit conversion from one
** type to the other occurs as necessary.
**
** Most of the code in this file is taken up by the sqlite3VdbeExec()
@@ -42067,12 +51468,12 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
-** $Id: vdbe.c,v 1.740 2008/05/13 13:27:34 drh Exp $
+** $Id: vdbe.c,v 1.874 2009/07/24 17:58:53 danielk1977 Exp $
*/
/*
** The following global variable is incremented every time a cursor
-** moves, either by the OP_MoveXX, OP_Next, or OP_Prev opcodes. The test
+** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test
** procedures use this information to make sure that indices are
** working correctly. This variable has no function other than to
** help verify the correct operation of the library.
@@ -42096,7 +51497,7 @@ SQLITE_API int sqlite3_interrupt_count = 0;
/*
** The next global variable is incremented each type the OP_Sort opcode
** is executed. The test procedures use this information to make sure that
-** sorting is occurring or not occuring at appropriate times. This variable
+** sorting is occurring or not occurring at appropriate times. This variable
** has no function other than to help verify the correct operation of the
** library.
*/
@@ -42121,6 +51522,17 @@ static void updateMaxBlobsize(Mem *p){
#endif
/*
+** The next global variable is incremented each type the OP_Found opcode
+** is executed. This is used to test whether or not the foreign key
+** operation implemented using OP_FkIsZero is working. This variable
+** has no function other than to help verify the correct operation of the
+** library.
+*/
+#ifdef SQLITE_TEST
+SQLITE_API int sqlite3_found_count = 0;
+#endif
+
+/*
** Test a register to see if it exceeds the current maximum blob size.
** If it does, record the new maximum blob size.
*/
@@ -42131,12 +51543,6 @@ static void updateMaxBlobsize(Mem *p){
#endif
/*
-** Release the memory associated with a register. This
-** leaves the Mem.flags field in an inconsistent state.
-*/
-#define Release(P) if((P)->flags&MEM_Dyn){ sqlite3VdbeMemRelease(P); }
-
-/*
** Convert the given register into a string if it isn't one
** already. Return non-zero if a malloc() fails.
*/
@@ -42166,7 +51572,7 @@ static void updateMaxBlobsize(Mem *p){
#define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
/*
-** Argument pMem points at a regiser that will be passed to a
+** Argument pMem points at a register that will be passed to a
** user-defined function or returned to the user as the result of a query.
** The second argument, 'db_enc' is the text encoding used by the vdbe for
** register variables. This routine sets the pMem->enc and pMem->type
@@ -42197,32 +51603,32 @@ static void _storeTypeInfo(Mem *pMem){
** from the comments following the "case OP_xxxx:" statements in
** this file.
*/
-static unsigned char opcodeProperty[] = OPFLG_INITIALIZER;
+static const unsigned char opcodeProperty[] = OPFLG_INITIALIZER;
/*
** Return true if an opcode has any of the OPFLG_xxx properties
** specified by mask.
*/
SQLITE_PRIVATE int sqlite3VdbeOpcodeHasProperty(int opcode, int mask){
- assert( opcode>0 && opcode<sizeof(opcodeProperty) );
+ assert( opcode>0 && opcode<(int)sizeof(opcodeProperty) );
return (opcodeProperty[opcode]&mask)!=0;
}
/*
-** Allocate cursor number iCur. Return a pointer to it. Return NULL
+** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL
** if we run out of memory.
*/
-static Cursor *allocateCursor(
- Vdbe *p,
- int iCur,
- Op *pOp,
- int iDb,
- int isBtreeCursor
+static VdbeCursor *allocateCursor(
+ Vdbe *p, /* The virtual machine */
+ int iCur, /* Index of the new VdbeCursor */
+ int nField, /* Number of fields in the table or index */
+ int iDb, /* When database the cursor belongs to, or -1 */
+ int isBtreeCursor /* True for B-Tree. False for pseudo-table or vtab */
){
/* Find the memory cell that will be used to store the blob of memory
- ** required for this Cursor structure. It is convenient to use a
+ ** required for this VdbeCursor structure. It is convenient to use a
** vdbe memory cell to manage the memory allocation required for a
- ** Cursor structure for the following reasons:
+ ** VdbeCursor structure for the following reasons:
**
** * Sometimes cursor numbers are used for a couple of different
** purposes in a vdbe program. The different uses might require
@@ -42240,18 +51646,9 @@ static Cursor *allocateCursor(
Mem *pMem = &p->aMem[p->nMem-iCur];
int nByte;
- Cursor *pCx = 0;
- /* If the opcode of pOp is OP_SetNumColumns, then pOp->p2 contains
- ** the number of fields in the records contained in the table or
- ** index being opened. Use this to reserve space for the
- ** Cursor.aType[] array.
- */
- int nField = 0;
- if( pOp->opcode==OP_SetNumColumns || pOp->opcode==OP_OpenEphemeral ){
- nField = pOp->p2;
- }
+ VdbeCursor *pCx = 0;
nByte =
- sizeof(Cursor) +
+ sizeof(VdbeCursor) +
(isBtreeCursor?sqlite3BtreeCursorSize():0) +
2*nField*sizeof(u32);
@@ -42261,15 +51658,16 @@ static Cursor *allocateCursor(
p->apCsr[iCur] = 0;
}
if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){
- p->apCsr[iCur] = pCx = (Cursor *)pMem->z;
+ p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z;
memset(pMem->z, 0, nByte);
pCx->iDb = iDb;
pCx->nField = nField;
if( nField ){
- pCx->aType = (u32 *)&pMem->z[sizeof(Cursor)];
+ pCx->aType = (u32 *)&pMem->z[sizeof(VdbeCursor)];
}
if( isBtreeCursor ){
- pCx->pCursor = (BtCursor *)&pMem->z[sizeof(Cursor)+2*nField*sizeof(u32)];
+ pCx->pCursor = (BtCursor*)
+ &pMem->z[sizeof(VdbeCursor)+2*nField*sizeof(u32)];
}
}
return pCx;
@@ -42396,12 +51794,12 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
}
sqlite3_snprintf(100, zCsr, "%c", c);
- zCsr += strlen(zCsr);
+ zCsr += sqlite3Strlen30(zCsr);
sqlite3_snprintf(100, zCsr, "%d[", pMem->n);
- zCsr += strlen(zCsr);
+ zCsr += sqlite3Strlen30(zCsr);
for(i=0; i<16 && i<pMem->n; i++){
sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF));
- zCsr += strlen(zCsr);
+ zCsr += sqlite3Strlen30(zCsr);
}
for(i=0; i<16 && i<pMem->n; i++){
char z = pMem->z[i];
@@ -42410,10 +51808,10 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
}
sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]);
- zCsr += strlen(zCsr);
+ zCsr += sqlite3Strlen30(zCsr);
if( f & MEM_Zero ){
- sqlite3_snprintf(100, zCsr,"+%lldz",pMem->u.i);
- zCsr += strlen(zCsr);
+ sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero);
+ zCsr += sqlite3Strlen30(zCsr);
}
*zCsr = '\0';
}else if( f & MEM_Str ){
@@ -42433,7 +51831,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
}
k = 2;
sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n);
- k += strlen(&zBuf[k]);
+ k += sqlite3Strlen30(&zBuf[k]);
zBuf[k++] = '[';
for(j=0; j<15 && j<pMem->n; j++){
u8 c = pMem->z[j];
@@ -42445,7 +51843,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
}
zBuf[k++] = ']';
sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]);
- k += strlen(&zBuf[k]);
+ k += sqlite3Strlen30(&zBuf[k]);
zBuf[k++] = 0;
}
}
@@ -42462,8 +51860,12 @@ static void memTracePrint(FILE *out, Mem *p){
fprintf(out, " si:%lld", p->u.i);
}else if( p->flags & MEM_Int ){
fprintf(out, " i:%lld", p->u.i);
+#ifndef SQLITE_OMIT_FLOATING_POINT
}else if( p->flags & MEM_Real ){
fprintf(out, " r:%g", p->r);
+#endif
+ }else if( p->flags & MEM_RowSet ){
+ fprintf(out, " (rowset)");
}else{
char zBuf[200];
sqlite3VdbeMemPrettyPrint(p, zBuf);
@@ -42479,25 +51881,111 @@ static void registerTrace(FILE *out, int iReg, Mem *p){
#endif
#ifdef SQLITE_DEBUG
-# define REGISTER_TRACE(R,M) if(p->trace&&R>0)registerTrace(p->trace,R,M)
+# define REGISTER_TRACE(R,M) if(p->trace)registerTrace(p->trace,R,M)
#else
# define REGISTER_TRACE(R,M)
#endif
#ifdef VDBE_PROFILE
+
+/*
+** hwtime.h contains inline assembler code for implementing
+** high-performance timing routines.
+*/
+/************** Include hwtime.h in the middle of vdbe.c *********************/
+/************** Begin file hwtime.h ******************************************/
/*
-** The following routine only works on pentium-class processors.
+** 2008 May 27
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This file contains inline asm code for retrieving "high-performance"
+** counters for x86 class CPUs.
+**
+** $Id: hwtime.h,v 1.3 2008/08/01 14:33:15 shane Exp $
+*/
+#ifndef _HWTIME_H_
+#define _HWTIME_H_
+
+/*
+** The following routine only works on pentium-class (or newer) processors.
** It uses the RDTSC opcode to read the cycle count value out of the
** processor and returns that value. This can be used for high-res
** profiling.
*/
-__inline__ unsigned long long int hwtime(void){
- unsigned int lo, hi;
- /* We cannot use "=A", since this would use %rax on x86_64 */
- __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
- return (unsigned long long int)hi << 32 | lo;
-}
+#if (defined(__GNUC__) || defined(_MSC_VER)) && \
+ (defined(i386) || defined(__i386__) || defined(_M_IX86))
+
+ #if defined(__GNUC__)
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned int lo, hi;
+ __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+ return (sqlite_uint64)hi << 32 | lo;
+ }
+
+ #elif defined(_MSC_VER)
+
+ __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
+ __asm {
+ rdtsc
+ ret ; return value at EDX:EAX
+ }
+ }
+
+ #endif
+
+#elif (defined(__GNUC__) && defined(__x86_64__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long val;
+ __asm__ __volatile__ ("rdtsc" : "=A" (val));
+ return val;
+ }
+
+#elif (defined(__GNUC__) && defined(__ppc__))
+
+ __inline__ sqlite_uint64 sqlite3Hwtime(void){
+ unsigned long long retval;
+ unsigned long junk;
+ __asm__ __volatile__ ("\n\
+ 1: mftbu %1\n\
+ mftb %L0\n\
+ mftbu %0\n\
+ cmpw %0,%1\n\
+ bne 1b"
+ : "=r" (retval), "=r" (junk));
+ return retval;
+ }
+
+#else
+
+ #error Need implementation of sqlite3Hwtime() for your platform.
+
+ /*
+ ** To compile without implementing sqlite3Hwtime() for your platform,
+ ** you can remove the above #error and use the following
+ ** stub function. You will lose timing support for many
+ ** of the debugging and testing utilities, but it should at
+ ** least compile and run.
+ */
+SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
+
+#endif
+
+#endif /* !defined(_HWTIME_H_) */
+
+/************** End of hwtime.h **********************************************/
+/************** Continuing where we left off in vdbe.c ***********************/
+
#endif
/*
@@ -42513,6 +52001,42 @@ __inline__ unsigned long long int hwtime(void){
#define CHECK_FOR_INTERRUPT \
if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
+#ifdef SQLITE_DEBUG
+static int fileExists(sqlite3 *db, const char *zFile){
+ int res = 0;
+ int rc = SQLITE_OK;
+#ifdef SQLITE_TEST
+ /* If we are currently testing IO errors, then do not call OsAccess() to
+ ** test for the presence of zFile. This is because any IO error that
+ ** occurs here will not be reported, causing the test to fail.
+ */
+ extern int sqlite3_io_error_pending;
+ if( sqlite3_io_error_pending<=0 )
+#endif
+ rc = sqlite3OsAccess(db->pVfs, zFile, SQLITE_ACCESS_EXISTS, &res);
+ return (res && rc==SQLITE_OK);
+}
+#endif
+
+#ifndef NDEBUG
+/*
+** This function is only called from within an assert() expression. It
+** checks that the sqlite3.nTransaction variable is correctly set to
+** the number of non-transaction savepoints currently in the
+** linked list starting at sqlite3.pSavepoint.
+**
+** Usage:
+**
+** assert( checkSavepointCount(db) );
+*/
+static int checkSavepointCount(sqlite3 *db){
+ int n = 0;
+ Savepoint *p;
+ for(p=db->pSavepoint; p; p=p->pNext) n++;
+ assert( n==(db->nSavepoint + db->isTransactionSavepoint) );
+ return 1;
+}
+#endif
/*
** Execute as much of a VDBE program as we can then return.
@@ -42553,20 +52077,429 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
int rc = SQLITE_OK; /* Value to return */
sqlite3 *db = p->db; /* The database */
u8 encoding = ENC(db); /* The database encoding */
- Mem *pIn1, *pIn2, *pIn3; /* Input operands */
- Mem *pOut; /* Output operand */
+ Mem *pIn1 = 0; /* 1st input operand */
+ Mem *pIn2 = 0; /* 2nd input operand */
+ Mem *pIn3 = 0; /* 3rd input operand */
+ Mem *pOut = 0; /* Output operand */
u8 opProperty;
+ int iCompare = 0; /* Result of last OP_Compare operation */
+ int *aPermute = 0; /* Permutation of columns for OP_Compare */
#ifdef VDBE_PROFILE
- unsigned long long start; /* CPU clock count at start of opcode */
+ u64 start; /* CPU clock count at start of opcode */
int origPc; /* Program counter at start of opcode */
#endif
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
int nProgressOps = 0; /* Opcodes executed since progress callback. */
#endif
+ /********************************************************************
+ ** Automatically generated code
+ **
+ ** The following union is automatically generated by the
+ ** vdbe-compress.tcl script. The purpose of this union is to
+ ** reduce the amount of stack space required by this function.
+ ** See comments in the vdbe-compress.tcl script for details.
+ */
+ union vdbeExecUnion {
+ struct OP_Yield_stack_vars {
+ int pcDest;
+ } aa;
+ struct OP_Variable_stack_vars {
+ int p1; /* Variable to copy from */
+ int p2; /* Register to copy to */
+ int n; /* Number of values left to copy */
+ Mem *pVar; /* Value being transferred */
+ } ab;
+ struct OP_Move_stack_vars {
+ char *zMalloc; /* Holding variable for allocated memory */
+ int n; /* Number of registers left to copy */
+ int p1; /* Register to copy from */
+ int p2; /* Register to copy to */
+ } ac;
+ struct OP_ResultRow_stack_vars {
+ Mem *pMem;
+ int i;
+ } ad;
+ struct OP_Concat_stack_vars {
+ i64 nByte;
+ } ae;
+ struct OP_Remainder_stack_vars {
+ int flags; /* Combined MEM_* flags from both inputs */
+ i64 iA; /* Integer value of left operand */
+ i64 iB; /* Integer value of right operand */
+ double rA; /* Real value of left operand */
+ double rB; /* Real value of right operand */
+ } af;
+ struct OP_Function_stack_vars {
+ int i;
+ Mem *pArg;
+ sqlite3_context ctx;
+ sqlite3_value **apVal;
+ int n;
+ } ag;
+ struct OP_ShiftRight_stack_vars {
+ i64 a;
+ i64 b;
+ } ah;
+ struct OP_Ge_stack_vars {
+ int res; /* Result of the comparison of pIn1 against pIn3 */
+ char affinity; /* Affinity to use for comparison */
+ } ai;
+ struct OP_Compare_stack_vars {
+ int n;
+ int i;
+ int p1;
+ int p2;
+ const KeyInfo *pKeyInfo;
+ int idx;
+ CollSeq *pColl; /* Collating sequence to use on this term */
+ int bRev; /* True for DESCENDING sort order */
+ } aj;
+ struct OP_Or_stack_vars {
+ int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
+ int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
+ } ak;
+ struct OP_IfNot_stack_vars {
+ int c;
+ } al;
+ struct OP_Column_stack_vars {
+ u32 payloadSize; /* Number of bytes in the record */
+ i64 payloadSize64; /* Number of bytes in the record */
+ int p1; /* P1 value of the opcode */
+ int p2; /* column number to retrieve */
+ VdbeCursor *pC; /* The VDBE cursor */
+ char *zRec; /* Pointer to complete record-data */
+ BtCursor *pCrsr; /* The BTree cursor */
+ u32 *aType; /* aType[i] holds the numeric type of the i-th column */
+ u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
+ int nField; /* number of fields in the record */
+ int len; /* The length of the serialized data for the column */
+ int i; /* Loop counter */
+ char *zData; /* Part of the record being decoded */
+ Mem *pDest; /* Where to write the extracted value */
+ Mem sMem; /* For storing the record being decoded */
+ u8 *zIdx; /* Index into header */
+ u8 *zEndHdr; /* Pointer to first byte after the header */
+ u32 offset; /* Offset into the data */
+ u64 offset64; /* 64-bit offset. 64 bits needed to catch overflow */
+ int szHdr; /* Size of the header size field at start of record */
+ int avail; /* Number of bytes of available data */
+ Mem *pReg; /* PseudoTable input register */
+ } am;
+ struct OP_Affinity_stack_vars {
+ char *zAffinity; /* The affinity to be applied */
+ Mem *pData0; /* First register to which to apply affinity */
+ Mem *pLast; /* Last register to which to apply affinity */
+ Mem *pRec; /* Current register */
+ } an;
+ struct OP_MakeRecord_stack_vars {
+ u8 *zNewRecord; /* A buffer to hold the data for the new record */
+ Mem *pRec; /* The new record */
+ u64 nData; /* Number of bytes of data space */
+ int nHdr; /* Number of bytes of header space */
+ i64 nByte; /* Data space required for this record */
+ int nZero; /* Number of zero bytes at the end of the record */
+ int nVarint; /* Number of bytes in a varint */
+ u32 serial_type; /* Type field */
+ Mem *pData0; /* First field to be combined into the record */
+ Mem *pLast; /* Last field of the record */
+ int nField; /* Number of fields in the record */
+ char *zAffinity; /* The affinity string for the record */
+ int file_format; /* File format to use for encoding */
+ int i; /* Space used in zNewRecord[] */
+ int len; /* Length of a field */
+ } ao;
+ struct OP_Count_stack_vars {
+ i64 nEntry;
+ BtCursor *pCrsr;
+ } ap;
+ struct OP_Savepoint_stack_vars {
+ int p1; /* Value of P1 operand */
+ char *zName; /* Name of savepoint */
+ int nName;
+ Savepoint *pNew;
+ Savepoint *pSavepoint;
+ Savepoint *pTmp;
+ int iSavepoint;
+ int ii;
+ } aq;
+ struct OP_AutoCommit_stack_vars {
+ int desiredAutoCommit;
+ int iRollback;
+ int turnOnAC;
+ } ar;
+ struct OP_Transaction_stack_vars {
+ Btree *pBt;
+ } as;
+ struct OP_ReadCookie_stack_vars {
+ int iMeta;
+ int iDb;
+ int iCookie;
+ } at;
+ struct OP_SetCookie_stack_vars {
+ Db *pDb;
+ } au;
+ struct OP_VerifyCookie_stack_vars {
+ int iMeta;
+ Btree *pBt;
+ } av;
+ struct OP_OpenWrite_stack_vars {
+ int nField;
+ KeyInfo *pKeyInfo;
+ int p2;
+ int iDb;
+ int wrFlag;
+ Btree *pX;
+ VdbeCursor *pCur;
+ Db *pDb;
+ } aw;
+ struct OP_OpenEphemeral_stack_vars {
+ VdbeCursor *pCx;
+ } ax;
+ struct OP_OpenPseudo_stack_vars {
+ VdbeCursor *pCx;
+ } ay;
+ struct OP_SeekGt_stack_vars {
+ int res;
+ int oc;
+ VdbeCursor *pC;
+ UnpackedRecord r;
+ int nField;
+ i64 iKey; /* The rowid we are to seek to */
+ } az;
+ struct OP_Seek_stack_vars {
+ VdbeCursor *pC;
+ } ba;
+ struct OP_Found_stack_vars {
+ int alreadyExists;
+ VdbeCursor *pC;
+ int res;
+ UnpackedRecord *pIdxKey;
+ char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
+ } bb;
+ struct OP_IsUnique_stack_vars {
+ u16 ii;
+ VdbeCursor *pCx;
+ BtCursor *pCrsr;
+ u16 nField;
+ Mem *aMem;
+ UnpackedRecord r; /* B-Tree index search key */
+ i64 R; /* Rowid stored in register P3 */
+ } bc;
+ struct OP_NotExists_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int res;
+ u64 iKey;
+ } bd;
+ struct OP_NewRowid_stack_vars {
+ i64 v; /* The new rowid */
+ VdbeCursor *pC; /* Cursor of table to get the new rowid */
+ int res; /* Result of an sqlite3BtreeLast() */
+ int cnt; /* Counter to limit the number of searches */
+ Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */
+ VdbeFrame *pFrame; /* Root frame of VDBE */
+ } be;
+ struct OP_Insert_stack_vars {
+ Mem *pData; /* MEM cell holding data for the record to be inserted */
+ Mem *pKey; /* MEM cell holding key for the record */
+ i64 iKey; /* The integer ROWID or key for the record to be inserted */
+ VdbeCursor *pC; /* Cursor to table into which insert is written */
+ int nZero; /* Number of zero-bytes to append */
+ int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
+ const char *zDb; /* database name - used by the update hook */
+ const char *zTbl; /* Table name - used by the opdate hook */
+ int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
+ } bf;
+ struct OP_Delete_stack_vars {
+ i64 iKey;
+ VdbeCursor *pC;
+ } bg;
+ struct OP_RowData_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ u32 n;
+ i64 n64;
+ } bh;
+ struct OP_Rowid_stack_vars {
+ VdbeCursor *pC;
+ i64 v;
+ sqlite3_vtab *pVtab;
+ const sqlite3_module *pModule;
+ } bi;
+ struct OP_NullRow_stack_vars {
+ VdbeCursor *pC;
+ } bj;
+ struct OP_Last_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int res;
+ } bk;
+ struct OP_Rewind_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int res;
+ } bl;
+ struct OP_Next_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int res;
+ } bm;
+ struct OP_IdxInsert_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int nKey;
+ const char *zKey;
+ } bn;
+ struct OP_IdxDelete_stack_vars {
+ VdbeCursor *pC;
+ BtCursor *pCrsr;
+ int res;
+ UnpackedRecord r;
+ } bo;
+ struct OP_IdxRowid_stack_vars {
+ BtCursor *pCrsr;
+ VdbeCursor *pC;
+ i64 rowid;
+ } bp;
+ struct OP_IdxGE_stack_vars {
+ VdbeCursor *pC;
+ int res;
+ UnpackedRecord r;
+ } bq;
+ struct OP_Destroy_stack_vars {
+ int iMoved;
+ int iCnt;
+ Vdbe *pVdbe;
+ int iDb;
+ } br;
+ struct OP_Clear_stack_vars {
+ int nChange;
+ } bs;
+ struct OP_CreateTable_stack_vars {
+ int pgno;
+ int flags;
+ Db *pDb;
+ } bt;
+ struct OP_ParseSchema_stack_vars {
+ int iDb;
+ const char *zMaster;
+ char *zSql;
+ InitData initData;
+ } bu;
+ struct OP_IntegrityCk_stack_vars {
+ int nRoot; /* Number of tables to check. (Number of root pages.) */
+ int *aRoot; /* Array of rootpage numbers for tables to be checked */
+ int j; /* Loop counter */
+ int nErr; /* Number of errors reported */
+ char *z; /* Text of the error report */
+ Mem *pnErr; /* Register keeping track of errors remaining */
+ } bv;
+ struct OP_RowSetAdd_stack_vars {
+ Mem *pIdx;
+ Mem *pVal;
+ } bw;
+ struct OP_RowSetRead_stack_vars {
+ Mem *pIdx;
+ i64 val;
+ } bx;
+ struct OP_RowSetTest_stack_vars {
+ int iSet;
+ int exists;
+ } by;
+ struct OP_Program_stack_vars {
+ int nMem; /* Number of memory registers for sub-program */
+ int nByte; /* Bytes of runtime space required for sub-program */
+ Mem *pRt; /* Register to allocate runtime space */
+ Mem *pMem; /* Used to iterate through memory cells */
+ Mem *pEnd; /* Last memory cell in new array */
+ VdbeFrame *pFrame; /* New vdbe frame to execute in */
+ SubProgram *pProgram; /* Sub-program to execute */
+ void *t; /* Token identifying trigger */
+ } bz;
+ struct OP_Param_stack_vars {
+ VdbeFrame *pFrame;
+ Mem *pIn;
+ } ca;
+ struct OP_MemMax_stack_vars {
+ Mem *pIn1;
+ VdbeFrame *pFrame;
+ } cb;
+ struct OP_AggStep_stack_vars {
+ int n;
+ int i;
+ Mem *pMem;
+ Mem *pRec;
+ sqlite3_context ctx;
+ sqlite3_value **apVal;
+ } cc;
+ struct OP_AggFinal_stack_vars {
+ Mem *pMem;
+ } cd;
+ struct OP_IncrVacuum_stack_vars {
+ Btree *pBt;
+ } ce;
+ struct OP_VBegin_stack_vars {
+ VTable *pVTab;
+ } cf;
+ struct OP_VOpen_stack_vars {
+ VdbeCursor *pCur;
+ sqlite3_vtab_cursor *pVtabCursor;
+ sqlite3_vtab *pVtab;
+ sqlite3_module *pModule;
+ } cg;
+ struct OP_VFilter_stack_vars {
+ int nArg;
+ int iQuery;
+ const sqlite3_module *pModule;
+ Mem *pQuery;
+ Mem *pArgc;
+ sqlite3_vtab_cursor *pVtabCursor;
+ sqlite3_vtab *pVtab;
+ VdbeCursor *pCur;
+ int res;
+ int i;
+ Mem **apArg;
+ } ch;
+ struct OP_VColumn_stack_vars {
+ sqlite3_vtab *pVtab;
+ const sqlite3_module *pModule;
+ Mem *pDest;
+ sqlite3_context sContext;
+ } ci;
+ struct OP_VNext_stack_vars {
+ sqlite3_vtab *pVtab;
+ const sqlite3_module *pModule;
+ int res;
+ VdbeCursor *pCur;
+ } cj;
+ struct OP_VRename_stack_vars {
+ sqlite3_vtab *pVtab;
+ Mem *pName;
+ } ck;
+ struct OP_VUpdate_stack_vars {
+ sqlite3_vtab *pVtab;
+ sqlite3_module *pModule;
+ int nArg;
+ int i;
+ sqlite_int64 rowid;
+ Mem **apArg;
+ Mem *pX;
+ } cl;
+ struct OP_Pagecount_stack_vars {
+ int p1;
+ int nPage;
+ Pager *pPager;
+ } cm;
+ struct OP_Trace_stack_vars {
+ char *zTrace;
+ } cn;
+ } u;
+ /* End automatically generated code
+ ********************************************************************/
assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
assert( db->magic==SQLITE_MAGIC_BUSY );
- sqlite3BtreeMutexArrayEnter(&p->aMutex);
+ sqlite3VdbeMutexArrayEnter(p);
if( p->rc==SQLITE_NOMEM ){
/* This happens if a malloc() inside a call to sqlite3_column_text() or
** sqlite3_column_text16() failed. */
@@ -42580,9 +52513,9 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
CHECK_FOR_INTERRUPT;
sqlite3VdbeIOTraceSql(p);
#ifdef SQLITE_DEBUG
- sqlite3FaultBeginBenign(-1);
- if( p->pc==0 && ((p->db->flags & SQLITE_VdbeListing)!=0
- || sqlite3OsAccess(db->pVfs, "vdbe_explain", SQLITE_ACCESS_EXISTS)==1 )
+ sqlite3BeginBenignMalloc();
+ if( p->pc==0
+ && ((p->db->flags & SQLITE_VdbeListing) || fileExists(db, "vdbe_explain"))
){
int i;
printf("VDBE Program Listing:\n");
@@ -42591,17 +52524,17 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
sqlite3VdbePrintOp(stdout, i, &p->aOp[i]);
}
}
- if( sqlite3OsAccess(db->pVfs, "vdbe_trace", SQLITE_ACCESS_EXISTS)==1 ){
+ if( fileExists(db, "vdbe_trace") ){
p->trace = stdout;
}
- sqlite3FaultEndBenign(-1);
+ sqlite3EndBenignMalloc();
#endif
for(pc=p->pc; rc==SQLITE_OK; pc++){
assert( pc>=0 && pc<p->nOp );
if( db->mallocFailed ) goto no_mem;
#ifdef VDBE_PROFILE
origPc = pc;
- start = hwtime();
+ start = sqlite3Hwtime();
#endif
pOp = &p->aOp[pc];
@@ -42616,11 +52549,11 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
sqlite3VdbePrintOp(p->trace, pc, pOp);
}
if( p->trace==0 && pc==0 ){
- sqlite3FaultBeginBenign(-1);
- if( sqlite3OsAccess(db->pVfs, "vdbe_sqltrace", SQLITE_ACCESS_EXISTS)==1 ){
+ sqlite3BeginBenignMalloc();
+ if( fileExists(db, "vdbe_sqltrace") ){
sqlite3VdbePrintSql(p);
}
- sqlite3FaultEndBenign(-1);
+ sqlite3EndBenignMalloc();
}
#endif
@@ -42672,6 +52605,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
pOut = &p->aMem[pOp->p2];
sqlite3VdbeMemReleaseExternal(pOut);
pOut->flags = MEM_Null;
+ pOut->n = 0;
}else
/* Do common setup for opcodes marked with one of the following
@@ -42695,11 +52629,12 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
assert( pOp->p2<=p->nMem );
pIn2 = &p->aMem[pOp->p2];
REGISTER_TRACE(pOp->p2, pIn2);
- if( (opProperty & OPFLG_OUT3)!=0 ){
- assert( pOp->p3>0 );
- assert( pOp->p3<=p->nMem );
- pOut = &p->aMem[pOp->p3];
- }
+ /* As currently implemented, in2 implies out3. There is no reason
+ ** why this has to be, it just worked out that way. */
+ assert( (opProperty & OPFLG_OUT3)!=0 );
+ assert( pOp->p3>0 );
+ assert( pOp->p3<=p->nMem );
+ pOut = &p->aMem[pOp->p3];
}else if( (opProperty & OPFLG_IN3)!=0 ){
assert( pOp->p3>0 );
assert( pOp->p3<=p->nMem );
@@ -42768,39 +52703,64 @@ case OP_Goto: { /* jump */
break;
}
-/* Opcode: Gosub * P2 * * *
+/* Opcode: Gosub P1 P2 * * *
**
-** Push the current address plus 1 onto the return address stack
+** Write the current address onto register P1
** and then jump to address P2.
-**
-** The return address stack is of limited depth. If too many
-** OP_Gosub operations occur without intervening OP_Returns, then
-** the return address stack will fill up and processing will abort
-** with a fatal error.
*/
case OP_Gosub: { /* jump */
- assert( p->returnDepth<sizeof(p->returnStack)/sizeof(p->returnStack[0]) );
- p->returnStack[p->returnDepth++] = pc+1;
+ assert( pOp->p1>0 );
+ assert( pOp->p1<=p->nMem );
+ pIn1 = &p->aMem[pOp->p1];
+ assert( (pIn1->flags & MEM_Dyn)==0 );
+ pIn1->flags = MEM_Int;
+ pIn1->u.i = pc;
+ REGISTER_TRACE(pOp->p1, pIn1);
pc = pOp->p2 - 1;
break;
}
-/* Opcode: Return * * * * *
+/* Opcode: Return P1 * * * *
**
-** Jump immediately to the next instruction after the last unreturned
-** OP_Gosub. If an OP_Return has occurred for all OP_Gosubs, then
-** processing aborts with a fatal error.
+** Jump to the next instruction after the address in register P1.
*/
-case OP_Return: {
- assert( p->returnDepth>0 );
- p->returnDepth--;
- pc = p->returnStack[p->returnDepth] - 1;
+case OP_Return: { /* in1 */
+ assert( pIn1->flags & MEM_Int );
+ pc = (int)pIn1->u.i;
break;
}
+/* Opcode: Yield P1 * * * *
+**
+** Swap the program counter with the value in register P1.
+*/
+case OP_Yield: { /* in1 */
+#if 0 /* local variables moved into u.aa */
+ int pcDest;
+#endif /* local variables moved into u.aa */
+ assert( (pIn1->flags & MEM_Dyn)==0 );
+ pIn1->flags = MEM_Int;
+ u.aa.pcDest = (int)pIn1->u.i;
+ pIn1->u.i = pc;
+ REGISTER_TRACE(pOp->p1, pIn1);
+ pc = u.aa.pcDest;
+ break;
+}
+
+/* Opcode: HaltIfNull P1 P2 P3 P4 *
+**
+** Check the value in register P3. If is is NULL then Halt using
+** parameter P1, P2, and P4 as if this were a Halt instruction. If the
+** value in register P3 is not NULL, then this routine is a no-op.
+*/
+case OP_HaltIfNull: { /* in3 */
+ if( (pIn3->flags & MEM_Null)==0 ) break;
+ /* Fall through into OP_Halt */
+}
+
/* Opcode: Halt P1 P2 * P4 *
**
-** Exit immediately. All open cursors, Fifos, etc are closed
+** Exit immediately. All open cursors, etc are closed
** automatically.
**
** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(),
@@ -42818,17 +52778,37 @@ case OP_Return: {
** is the same as executing Halt.
*/
case OP_Halt: {
+ if( pOp->p1==SQLITE_OK && p->pFrame ){
+ /* Halt the sub-program. Return control to the parent frame. */
+ VdbeFrame *pFrame = p->pFrame;
+ p->pFrame = pFrame->pParent;
+ p->nFrame--;
+ sqlite3VdbeSetChanges(db, p->nChange);
+ pc = sqlite3VdbeFrameRestore(pFrame);
+ if( pOp->p2==OE_Ignore ){
+ /* Instruction pc is the OP_Program that invoked the sub-program
+ ** currently being halted. If the p2 instruction of this OP_Halt
+ ** instruction is set to OE_Ignore, then the sub-program is throwing
+ ** an IGNORE exception. In this case jump to the address specified
+ ** as the p2 of the calling OP_Program. */
+ pc = p->aOp[pc].p2-1;
+ }
+ break;
+ }
+
p->rc = pOp->p1;
+ p->errorAction = (u8)pOp->p2;
p->pc = pc;
- p->errorAction = pOp->p2;
if( pOp->p4.z ){
- sqlite3SetString(&p->zErrMsg, pOp->p4.z, (char*)0);
+ sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z);
}
rc = sqlite3VdbeHalt(p);
- assert( rc==SQLITE_BUSY || rc==SQLITE_OK );
+ assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR );
if( rc==SQLITE_BUSY ){
p->rc = rc = SQLITE_BUSY;
}else{
+ assert( rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT );
+ assert( rc==SQLITE_OK || db->nDeferredCons>0 );
rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
}
goto vdbe_return;
@@ -42876,27 +52856,24 @@ case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
case OP_String8: { /* same as TK_STRING, out2-prerelease */
assert( pOp->p4.z!=0 );
pOp->opcode = OP_String;
- pOp->p1 = strlen(pOp->p4.z);
+ pOp->p1 = sqlite3Strlen30(pOp->p4.z);
#ifndef SQLITE_OMIT_UTF16
if( encoding!=SQLITE_UTF8 ){
- sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
+ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
+ if( rc==SQLITE_TOOBIG ) goto too_big;
if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem;
- if( SQLITE_OK!=sqlite3VdbeMemDynamicify(pOut) ) goto no_mem;
+ assert( pOut->zMalloc==pOut->z );
+ assert( pOut->flags & MEM_Dyn );
pOut->zMalloc = 0;
pOut->flags |= MEM_Static;
pOut->flags &= ~MEM_Dyn;
if( pOp->p4type==P4_DYNAMIC ){
- sqlite3_free(pOp->p4.z);
+ sqlite3DbFree(db, pOp->p4.z);
}
pOp->p4type = P4_DYNAMIC;
pOp->p4.z = pOut->z;
pOp->p1 = pOut->n;
- if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
- goto too_big;
- }
- UPDATE_MAX_BLOBSIZE(pOut);
- break;
}
#endif
if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
@@ -42928,7 +52905,6 @@ case OP_Null: { /* out2-prerelease */
}
-#ifndef SQLITE_OMIT_BLOB_LITERAL
/* Opcode: Blob P1 P2 * P4
**
** P4 points to a blob of data P1 bytes long. Store this
@@ -42945,52 +52921,78 @@ case OP_Blob: { /* out2-prerelease */
UPDATE_MAX_BLOBSIZE(pOut);
break;
}
-#endif /* SQLITE_OMIT_BLOB_LITERAL */
-/* Opcode: Variable P1 P2 * * *
+/* Opcode: Variable P1 P2 P3 P4 *
**
-** The value of variable P1 is written into register P2. A variable is
-** an unknown in the original SQL string as handed to sqlite3_compile().
-** Any occurance of the '?' character in the original SQL is considered
-** a variable. Variables in the SQL string are number from left to
-** right beginning with 1. The values of variables are set using the
-** sqlite3_bind() API.
+** Transfer the values of bound parameters P1..P1+P3-1 into registers
+** P2..P2+P3-1.
+**
+** If the parameter is named, then its name appears in P4 and P3==1.
+** The P4 value is used by sqlite3_bind_parameter_name().
*/
-case OP_Variable: { /* out2-prerelease */
- int j = pOp->p1 - 1;
- Mem *pVar;
- assert( j>=0 && j<p->nVar );
+case OP_Variable: {
+#if 0 /* local variables moved into u.ab */
+ int p1; /* Variable to copy from */
+ int p2; /* Register to copy to */
+ int n; /* Number of values left to copy */
+ Mem *pVar; /* Value being transferred */
+#endif /* local variables moved into u.ab */
- pVar = &p->aVar[j];
- if( sqlite3VdbeMemTooBig(pVar) ){
- goto too_big;
+ u.ab.p1 = pOp->p1 - 1;
+ u.ab.p2 = pOp->p2;
+ u.ab.n = pOp->p3;
+ assert( u.ab.p1>=0 && u.ab.p1+u.ab.n<=p->nVar );
+ assert( u.ab.p2>=1 && u.ab.p2+u.ab.n-1<=p->nMem );
+ assert( pOp->p4.z==0 || pOp->p3==1 );
+
+ while( u.ab.n-- > 0 ){
+ u.ab.pVar = &p->aVar[u.ab.p1++];
+ if( sqlite3VdbeMemTooBig(u.ab.pVar) ){
+ goto too_big;
+ }
+ pOut = &p->aMem[u.ab.p2++];
+ sqlite3VdbeMemReleaseExternal(pOut);
+ pOut->flags = MEM_Null;
+ sqlite3VdbeMemShallowCopy(pOut, u.ab.pVar, MEM_Static);
+ UPDATE_MAX_BLOBSIZE(pOut);
}
- sqlite3VdbeMemShallowCopy(pOut, &p->aVar[j], MEM_Static);
- UPDATE_MAX_BLOBSIZE(pOut);
break;
}
-/* Opcode: Move P1 P2 * * *
+/* Opcode: Move P1 P2 P3 * *
**
-** Move the value in register P1 over into register P2. Register P1
-** is left holding a NULL. It is an error for P1 and P2 to be the
-** same register.
+** Move the values in register P1..P1+P3-1 over into
+** registers P2..P2+P3-1. Registers P1..P1+P1-1 are
+** left holding a NULL. It is an error for register ranges
+** P1..P1+P3-1 and P2..P2+P3-1 to overlap.
*/
case OP_Move: {
- char *zMalloc;
- assert( pOp->p1>0 );
- assert( pOp->p1<=p->nMem );
- pIn1 = &p->aMem[pOp->p1];
- REGISTER_TRACE(pOp->p1, pIn1);
- assert( pOp->p2>0 );
- assert( pOp->p2<=p->nMem );
- pOut = &p->aMem[pOp->p2];
- assert( pOut!=pIn1 );
- zMalloc = pOut->zMalloc;
- pOut->zMalloc = 0;
- sqlite3VdbeMemMove(pOut, pIn1);
- pIn1->zMalloc = zMalloc;
- REGISTER_TRACE(pOp->p2, pOut);
+#if 0 /* local variables moved into u.ac */
+ char *zMalloc; /* Holding variable for allocated memory */
+ int n; /* Number of registers left to copy */
+ int p1; /* Register to copy from */
+ int p2; /* Register to copy to */
+#endif /* local variables moved into u.ac */
+
+ u.ac.n = pOp->p3;
+ u.ac.p1 = pOp->p1;
+ u.ac.p2 = pOp->p2;
+ assert( u.ac.n>0 && u.ac.p1>0 && u.ac.p2>0 );
+ assert( u.ac.p1+u.ac.n<=u.ac.p2 || u.ac.p2+u.ac.n<=u.ac.p1 );
+
+ pIn1 = &p->aMem[u.ac.p1];
+ pOut = &p->aMem[u.ac.p2];
+ while( u.ac.n-- ){
+ assert( pOut<=&p->aMem[p->nMem] );
+ assert( pIn1<=&p->aMem[p->nMem] );
+ u.ac.zMalloc = pOut->zMalloc;
+ pOut->zMalloc = 0;
+ sqlite3VdbeMemMove(pOut, pIn1);
+ pIn1->zMalloc = u.ac.zMalloc;
+ REGISTER_TRACE(u.ac.p2++, pOut);
+ pIn1++;
+ pOut++;
+ }
break;
}
@@ -43001,11 +53003,7 @@ case OP_Move: {
** This instruction makes a deep copy of the value. A duplicate
** is made of any string or blob constant. See also OP_SCopy.
*/
-case OP_Copy: {
- assert( pOp->p1>0 );
- assert( pOp->p1<=p->nMem );
- pIn1 = &p->aMem[pOp->p1];
- REGISTER_TRACE(pOp->p1, pIn1);
+case OP_Copy: { /* in1 */
assert( pOp->p2>0 );
assert( pOp->p2<=p->nMem );
pOut = &p->aMem[pOp->p2];
@@ -43028,10 +53026,7 @@ case OP_Copy: {
** during the lifetime of the copy. Use OP_Copy to make a complete
** copy.
*/
-case OP_SCopy: {
- assert( pOp->p1>0 );
- assert( pOp->p1<=p->nMem );
- pIn1 = &p->aMem[pOp->p1];
+case OP_SCopy: { /* in1 */
REGISTER_TRACE(pOp->p1, pIn1);
assert( pOp->p2>0 );
assert( pOp->p2<=p->nMem );
@@ -43044,36 +53039,68 @@ case OP_SCopy: {
/* Opcode: ResultRow P1 P2 * * *
**
-** The registers P1 throught P1+P2-1 contain a single row of
+** The registers P1 through P1+P2-1 contain a single row of
** results. This opcode causes the sqlite3_step() call to terminate
** with an SQLITE_ROW return code and it sets up the sqlite3_stmt
** structure to provide access to the top P1 values as the result
** row.
*/
case OP_ResultRow: {
+#if 0 /* local variables moved into u.ad */
Mem *pMem;
int i;
+#endif /* local variables moved into u.ad */
assert( p->nResColumn==pOp->p2 );
assert( pOp->p1>0 );
- assert( pOp->p1+pOp->p2<=p->nMem );
+ assert( pOp->p1+pOp->p2<=p->nMem+1 );
+
+ /* If this statement has violated immediate foreign key constraints, do
+ ** not return the number of rows modified. And do not RELEASE the statement
+ ** transaction. It needs to be rolled back. */
+ if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){
+ assert( db->flags&SQLITE_CountRows );
+ assert( p->usesStmtJournal );
+ break;
+ }
+
+ /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then
+ ** DML statements invoke this opcode to return the number of rows
+ ** modified to the user. This is the only way that a VM that
+ ** opens a statement transaction may invoke this opcode.
+ **
+ ** In case this is such a statement, close any statement transaction
+ ** opened by this VM before returning control to the user. This is to
+ ** ensure that statement-transactions are always nested, not overlapping.
+ ** If the open statement-transaction is not closed here, then the user
+ ** may step another VM that opens its own statement transaction. This
+ ** may lead to overlapping statement transactions.
+ **
+ ** The statement transaction is never a top-level transaction. Hence
+ ** the RELEASE call below can never fail.
+ */
+ assert( p->iStatement==0 || db->flags&SQLITE_CountRows );
+ rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE);
+ if( NEVER(rc!=SQLITE_OK) ){
+ break;
+ }
/* Invalidate all ephemeral cursor row caches */
p->cacheCtr = (p->cacheCtr + 2)|1;
/* Make sure the results of the current row are \000 terminated
- ** and have an assigned type. The results are deephemeralized as
+ ** and have an assigned type. The results are de-ephemeralized as
** as side effect.
*/
- pMem = p->pResultSet = &p->aMem[pOp->p1];
- for(i=0; i<pOp->p2; i++){
- sqlite3VdbeMemNulTerminate(&pMem[i]);
- storeTypeInfo(&pMem[i], encoding);
+ u.ad.pMem = p->pResultSet = &p->aMem[pOp->p1];
+ for(u.ad.i=0; u.ad.i<pOp->p2; u.ad.i++){
+ sqlite3VdbeMemNulTerminate(&u.ad.pMem[u.ad.i]);
+ storeTypeInfo(&u.ad.pMem[u.ad.i], encoding);
+ REGISTER_TRACE(pOp->p1+u.ad.i, &u.ad.pMem[u.ad.i]);
}
if( db->mallocFailed ) goto no_mem;
/* Return SQLITE_ROW
*/
- p->nCallback++;
p->pc = pc + 1;
rc = SQLITE_ROW;
goto vdbe_return;
@@ -43092,33 +53119,34 @@ case OP_ResultRow: {
** to avoid a memcpy().
*/
case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
+#if 0 /* local variables moved into u.ae */
i64 nByte;
+#endif /* local variables moved into u.ae */
assert( pIn1!=pOut );
if( (pIn1->flags | pIn2->flags) & MEM_Null ){
sqlite3VdbeMemSetNull(pOut);
break;
}
- ExpandBlob(pIn1);
+ if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem;
Stringify(pIn1, encoding);
- ExpandBlob(pIn2);
Stringify(pIn2, encoding);
- nByte = pIn1->n + pIn2->n;
- if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ u.ae.nByte = pIn1->n + pIn2->n;
+ if( u.ae.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
MemSetTypeFlag(pOut, MEM_Str);
- if( sqlite3VdbeMemGrow(pOut, nByte+2, pOut==pIn2) ){
+ if( sqlite3VdbeMemGrow(pOut, (int)u.ae.nByte+2, pOut==pIn2) ){
goto no_mem;
}
if( pOut!=pIn2 ){
memcpy(pOut->z, pIn2->z, pIn2->n);
}
memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
- pOut->z[nByte] = 0;
- pOut->z[nByte+1] = 0;
+ pOut->z[u.ae.nByte] = 0;
+ pOut->z[u.ae.nByte+1] = 0;
pOut->flags |= MEM_Term;
- pOut->n = nByte;
+ pOut->n = (int)u.ae.nByte;
pOut->enc = encoding;
UPDATE_MAX_BLOBSIZE(pOut);
break;
@@ -43127,13 +53155,13 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
/* Opcode: Add P1 P2 P3 * *
**
** Add the value in register P1 to the value in register P2
-** and store the result in regiser P3.
+** and store the result in register P3.
** If either input is NULL, the result is NULL.
*/
/* Opcode: Multiply P1 P2 P3 * *
**
**
-** Multiply the value in regiser P1 by the value in regiser P2
+** Multiply the value in register P1 by the value in register P2
** and store the result in register P3.
** If either input is NULL, the result is NULL.
*/
@@ -43146,9 +53174,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
/* Opcode: Divide P1 P2 P3 * *
**
** Divide the value in register P1 by the value in register P2
-** and store the result in register P3. If the value in register P2
-** is zero, then the result is NULL.
-** If either input is NULL, the result is NULL.
+** and store the result in register P3 (P3=P2/P1). If the value in
+** register P1 is zero, then the result is NULL. If either input is
+** NULL, the result is NULL.
*/
/* Opcode: Remainder P1 P2 P3 * *
**
@@ -43162,67 +53190,75 @@ case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */
case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */
case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */
case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
- int flags;
- flags = pIn1->flags | pIn2->flags;
- if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
+#if 0 /* local variables moved into u.af */
+ int flags; /* Combined MEM_* flags from both inputs */
+ i64 iA; /* Integer value of left operand */
+ i64 iB; /* Integer value of right operand */
+ double rA; /* Real value of left operand */
+ double rB; /* Real value of right operand */
+#endif /* local variables moved into u.af */
+
+ applyNumericAffinity(pIn1);
+ applyNumericAffinity(pIn2);
+ u.af.flags = pIn1->flags | pIn2->flags;
+ if( (u.af.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){
- i64 a, b;
- a = pIn1->u.i;
- b = pIn2->u.i;
+ u.af.iA = pIn1->u.i;
+ u.af.iB = pIn2->u.i;
switch( pOp->opcode ){
- case OP_Add: b += a; break;
- case OP_Subtract: b -= a; break;
- case OP_Multiply: b *= a; break;
+ case OP_Add: u.af.iB += u.af.iA; break;
+ case OP_Subtract: u.af.iB -= u.af.iA; break;
+ case OP_Multiply: u.af.iB *= u.af.iA; break;
case OP_Divide: {
- if( a==0 ) goto arithmetic_result_is_null;
- /* Dividing the largest possible negative 64-bit integer (1<<63) by
+ if( u.af.iA==0 ) goto arithmetic_result_is_null;
+ /* Dividing the largest possible negative 64-bit integer (1<<63) by
** -1 returns an integer too large to store in a 64-bit data-type. On
** some architectures, the value overflows to (1<<63). On others,
** a SIGFPE is issued. The following statement normalizes this
- ** behaviour so that all architectures behave as if integer
- ** overflow occured.
+ ** behavior so that all architectures behave as if integer
+ ** overflow occurred.
*/
- if( a==-1 && b==SMALLEST_INT64 ) a = 1;
- b /= a;
+ if( u.af.iA==-1 && u.af.iB==SMALLEST_INT64 ) u.af.iA = 1;
+ u.af.iB /= u.af.iA;
break;
}
default: {
- if( a==0 ) goto arithmetic_result_is_null;
- if( a==-1 ) a = 1;
- b %= a;
+ if( u.af.iA==0 ) goto arithmetic_result_is_null;
+ if( u.af.iA==-1 ) u.af.iA = 1;
+ u.af.iB %= u.af.iA;
break;
}
}
- pOut->u.i = b;
+ pOut->u.i = u.af.iB;
MemSetTypeFlag(pOut, MEM_Int);
}else{
- double a, b;
- a = sqlite3VdbeRealValue(pIn1);
- b = sqlite3VdbeRealValue(pIn2);
+ u.af.rA = sqlite3VdbeRealValue(pIn1);
+ u.af.rB = sqlite3VdbeRealValue(pIn2);
switch( pOp->opcode ){
- case OP_Add: b += a; break;
- case OP_Subtract: b -= a; break;
- case OP_Multiply: b *= a; break;
+ case OP_Add: u.af.rB += u.af.rA; break;
+ case OP_Subtract: u.af.rB -= u.af.rA; break;
+ case OP_Multiply: u.af.rB *= u.af.rA; break;
case OP_Divide: {
- if( a==0.0 ) goto arithmetic_result_is_null;
- b /= a;
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ if( u.af.rA==(double)0 ) goto arithmetic_result_is_null;
+ u.af.rB /= u.af.rA;
break;
}
default: {
- i64 ia = (i64)a;
- i64 ib = (i64)b;
- if( ia==0 ) goto arithmetic_result_is_null;
- if( ia==-1 ) ia = 1;
- b = ib % ia;
+ u.af.iA = (i64)u.af.rA;
+ u.af.iB = (i64)u.af.rB;
+ if( u.af.iA==0 ) goto arithmetic_result_is_null;
+ if( u.af.iA==-1 ) u.af.iA = 1;
+ u.af.rB = (double)(u.af.iB % u.af.iA);
break;
}
}
- if( sqlite3IsNaN(b) ){
+ if( sqlite3IsNaN(u.af.rB) ){
goto arithmetic_result_is_null;
}
- pOut->r = b;
+ pOut->r = u.af.rB;
MemSetTypeFlag(pOut, MEM_Real);
- if( (flags & MEM_Real)==0 ){
+ if( (u.af.flags & MEM_Real)==0 ){
sqlite3VdbeIntegerAffinity(pOut);
}
}
@@ -43266,58 +53302,61 @@ case OP_CollSeq: {
** See also: AggStep and AggFinal
*/
case OP_Function: {
+#if 0 /* local variables moved into u.ag */
int i;
Mem *pArg;
sqlite3_context ctx;
sqlite3_value **apVal;
- int n = pOp->p5;
+ int n;
+#endif /* local variables moved into u.ag */
- apVal = p->apArg;
- assert( apVal || n==0 );
+ u.ag.n = pOp->p5;
+ u.ag.apVal = p->apArg;
+ assert( u.ag.apVal || u.ag.n==0 );
- assert( n==0 || (pOp->p2>0 && pOp->p2+n<=p->nMem) );
- assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
- pArg = &p->aMem[pOp->p2];
- for(i=0; i<n; i++, pArg++){
- apVal[i] = pArg;
- storeTypeInfo(pArg, encoding);
- REGISTER_TRACE(pOp->p2, pArg);
+ assert( u.ag.n==0 || (pOp->p2>0 && pOp->p2+u.ag.n<=p->nMem+1) );
+ assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+u.ag.n );
+ u.ag.pArg = &p->aMem[pOp->p2];
+ for(u.ag.i=0; u.ag.i<u.ag.n; u.ag.i++, u.ag.pArg++){
+ u.ag.apVal[u.ag.i] = u.ag.pArg;
+ storeTypeInfo(u.ag.pArg, encoding);
+ REGISTER_TRACE(pOp->p2, u.ag.pArg);
}
assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC );
if( pOp->p4type==P4_FUNCDEF ){
- ctx.pFunc = pOp->p4.pFunc;
- ctx.pVdbeFunc = 0;
+ u.ag.ctx.pFunc = pOp->p4.pFunc;
+ u.ag.ctx.pVdbeFunc = 0;
}else{
- ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
- ctx.pFunc = ctx.pVdbeFunc->pFunc;
+ u.ag.ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
+ u.ag.ctx.pFunc = u.ag.ctx.pVdbeFunc->pFunc;
}
assert( pOp->p3>0 && pOp->p3<=p->nMem );
pOut = &p->aMem[pOp->p3];
- ctx.s.flags = MEM_Null;
- ctx.s.db = db;
- ctx.s.xDel = 0;
- ctx.s.zMalloc = 0;
+ u.ag.ctx.s.flags = MEM_Null;
+ u.ag.ctx.s.db = db;
+ u.ag.ctx.s.xDel = 0;
+ u.ag.ctx.s.zMalloc = 0;
/* The output cell may already have a buffer allocated. Move
- ** the pointer to ctx.s so in case the user-function can use
+ ** the pointer to u.ag.ctx.s so in case the user-function can use
** the already allocated buffer instead of allocating a new one.
*/
- sqlite3VdbeMemMove(&ctx.s, pOut);
- MemSetTypeFlag(&ctx.s, MEM_Null);
+ sqlite3VdbeMemMove(&u.ag.ctx.s, pOut);
+ MemSetTypeFlag(&u.ag.ctx.s, MEM_Null);
- ctx.isError = 0;
- if( ctx.pFunc->needCollSeq ){
+ u.ag.ctx.isError = 0;
+ if( u.ag.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
assert( pOp>p->aOp );
assert( pOp[-1].p4type==P4_COLLSEQ );
assert( pOp[-1].opcode==OP_CollSeq );
- ctx.pColl = pOp[-1].p4.pColl;
+ u.ag.ctx.pColl = pOp[-1].p4.pColl;
}
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- (*ctx.pFunc->xFunc)(&ctx, n, apVal);
+ (*u.ag.ctx.pFunc->xFunc)(&u.ag.ctx, u.ag.n, u.ag.apVal);
if( sqlite3SafetyOn(db) ){
- sqlite3VdbeMemRelease(&ctx.s);
+ sqlite3VdbeMemRelease(&u.ag.ctx.s);
goto abort_due_to_misuse;
}
if( db->mallocFailed ){
@@ -43330,28 +53369,28 @@ case OP_Function: {
** fails also (the if(...) statement above). But if people are
** misusing sqlite, they have bigger problems than a leaked value.
*/
- sqlite3VdbeMemRelease(&ctx.s);
+ sqlite3VdbeMemRelease(&u.ag.ctx.s);
goto no_mem;
}
- /* If any auxilary data functions have been called by this user function,
+ /* If any auxiliary data functions have been called by this user function,
** immediately call the destructor for any non-static values.
*/
- if( ctx.pVdbeFunc ){
- sqlite3VdbeDeleteAuxData(ctx.pVdbeFunc, pOp->p1);
- pOp->p4.pVdbeFunc = ctx.pVdbeFunc;
+ if( u.ag.ctx.pVdbeFunc ){
+ sqlite3VdbeDeleteAuxData(u.ag.ctx.pVdbeFunc, pOp->p1);
+ pOp->p4.pVdbeFunc = u.ag.ctx.pVdbeFunc;
pOp->p4type = P4_VDBEFUNC;
}
/* If the function returned an error, throw an exception */
- if( ctx.isError ){
- sqlite3SetString(&p->zErrMsg, sqlite3_value_text(&ctx.s), (char*)0);
- rc = ctx.isError;
+ if( u.ag.ctx.isError ){
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ag.ctx.s));
+ rc = u.ag.ctx.isError;
}
/* Copy the result of the function into register P3 */
- sqlite3VdbeChangeEncoding(&ctx.s, encoding);
- sqlite3VdbeMemMove(pOut, &ctx.s);
+ sqlite3VdbeChangeEncoding(&u.ag.ctx.s, encoding);
+ sqlite3VdbeMemMove(pOut, &u.ag.ctx.s);
if( sqlite3VdbeMemTooBig(pOut) ){
goto too_big;
}
@@ -43390,29 +53429,32 @@ case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */
case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */
case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */
case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */
- i64 a, b;
+#if 0 /* local variables moved into u.ah */
+ i64 a;
+ i64 b;
+#endif /* local variables moved into u.ah */
if( (pIn1->flags | pIn2->flags) & MEM_Null ){
sqlite3VdbeMemSetNull(pOut);
break;
}
- a = sqlite3VdbeIntValue(pIn2);
- b = sqlite3VdbeIntValue(pIn1);
+ u.ah.a = sqlite3VdbeIntValue(pIn2);
+ u.ah.b = sqlite3VdbeIntValue(pIn1);
switch( pOp->opcode ){
- case OP_BitAnd: a &= b; break;
- case OP_BitOr: a |= b; break;
- case OP_ShiftLeft: a <<= b; break;
+ case OP_BitAnd: u.ah.a &= u.ah.b; break;
+ case OP_BitOr: u.ah.a |= u.ah.b; break;
+ case OP_ShiftLeft: u.ah.a <<= u.ah.b; break;
default: assert( pOp->opcode==OP_ShiftRight );
- a >>= b; break;
+ u.ah.a >>= u.ah.b; break;
}
- pOut->u.i = a;
+ pOut->u.i = u.ah.a;
MemSetTypeFlag(pOut, MEM_Int);
break;
}
/* Opcode: AddImm P1 P2 * * *
**
-** Add the constant P2 the value in register P1.
+** Add the constant P2 to the value in register P1.
** The result is always an integer.
**
** To force any register to be an integer, just add 0.
@@ -43423,36 +53465,6 @@ case OP_AddImm: { /* in1 */
break;
}
-/* Opcode: ForceInt P1 P2 P3 * *
-**
-** Convert value in register P1 into an integer. If the value
-** in P1 is not numeric (meaning that is is a NULL or a string that
-** does not look like an integer or floating point number) then
-** jump to P2. If the value in P1 is numeric then
-** convert it into the least integer that is greater than or equal to its
-** current value if P3==0, or to the least integer that is strictly
-** greater than its current value if P3==1.
-*/
-case OP_ForceInt: { /* jump, in1 */
- i64 v;
- applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
- if( (pIn1->flags & (MEM_Int|MEM_Real))==0 ){
- pc = pOp->p2 - 1;
- break;
- }
- if( pIn1->flags & MEM_Int ){
- v = pIn1->u.i + (pOp->p3!=0);
- }else{
- assert( pIn1->flags & MEM_Real );
- v = (sqlite3_int64)pIn1->r;
- if( pIn1->r>(double)v ) v++;
- if( pOp->p3 && pIn1->r==(double)v ) v++;
- }
- pIn1->u.i = v;
- MemSetTypeFlag(pIn1, MEM_Int);
- break;
-}
-
/* Opcode: MustBeInt P1 P2 * * *
**
** Force the value in register P1 to be an integer. If the value
@@ -43508,7 +53520,7 @@ case OP_ToText: { /* same as TK_TO_TEXT, in1 */
applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
rc = ExpandBlob(pIn1);
assert( pIn1->flags & MEM_Str || db->mallocFailed );
- pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob);
+ pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero);
UPDATE_MAX_BLOBSIZE(pIn1);
break;
}
@@ -43527,8 +53539,10 @@ case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */
if( (pIn1->flags & MEM_Blob)==0 ){
applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
assert( pIn1->flags & MEM_Str || db->mallocFailed );
+ MemSetTypeFlag(pIn1, MEM_Blob);
+ }else{
+ pIn1->flags &= ~(MEM_TypeMask&~MEM_Blob);
}
- MemSetTypeFlag(pIn1, MEM_Blob);
UPDATE_MAX_BLOBSIZE(pIn1);
break;
}
@@ -43594,10 +53608,6 @@ case OP_ToReal: { /* same as TK_TO_REAL, in1 */
** reg(P3) is NULL then take the jump. If the SQLITE_JUMPIFNULL
** bit is clear then fall thru if either operand is NULL.
**
-** If the SQLITE_NULLEQUAL bit of P5 is set then treat NULL operands
-** as being equal to one another. Normally NULLs are not equal to
-** anything including other NULLs.
-**
** The SQLITE_AFF_MASK portion of P5 must be an affinity character -
** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made
** to coerce both inputs according to this affinity before the
@@ -43624,12 +53634,24 @@ case OP_ToReal: { /* same as TK_TO_REAL, in1 */
** This works just like the Lt opcode except that the jump is taken if
** the operands in registers P1 and P3 are not equal. See the Lt opcode for
** additional information.
+**
+** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
+** true or false and is never NULL. If both operands are NULL then the result
+** of comparison is false. If either operand is NULL then the result is true.
+** If neither operand is NULL the the result is the same as it would be if
+** the SQLITE_NULLEQ flag were omitted from P5.
*/
/* Opcode: Eq P1 P2 P3 P4 P5
**
** This works just like the Lt opcode except that the jump is taken if
** the operands in registers P1 and P3 are equal.
** See the Lt opcode for additional information.
+**
+** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
+** true or false and is never NULL. If both operands are NULL then the result
+** of comparison is true. If either operand is NULL then the result is false.
+** If neither operand is NULL the the result is the same as it would be if
+** the SQLITE_NULLEQ flag were omitted from P5.
*/
/* Opcode: Le P1 P2 P3 P4 P5
**
@@ -43655,34 +53677,24 @@ case OP_Lt: /* same as TK_LT, jump, in1, in3 */
case OP_Le: /* same as TK_LE, jump, in1, in3 */
case OP_Gt: /* same as TK_GT, jump, in1, in3 */
case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
- int flags;
- int res;
- char affinity;
- Mem x1, x3;
-
- flags = pIn1->flags|pIn3->flags;
-
- if( flags&MEM_Null ){
- if( (pOp->p5 & SQLITE_NULLEQUAL)!=0 ){
- /*
- ** When SQLITE_NULLEQUAL set and either operand is NULL
- ** then both operands are converted to integers prior to being
- ** passed down into the normal comparison logic below.
- ** NULL operands are converted to zero and non-NULL operands
- ** are converted to 1. Thus, for example, with SQLITE_NULLEQUAL
- ** set, NULL==NULL is true whereas it would normally NULL.
- ** Similarly, NULL!=123 is true.
+#if 0 /* local variables moved into u.ai */
+ int res; /* Result of the comparison of pIn1 against pIn3 */
+ char affinity; /* Affinity to use for comparison */
+#endif /* local variables moved into u.ai */
+
+ if( (pIn1->flags | pIn3->flags)&MEM_Null ){
+ /* One or both operands are NULL */
+ if( pOp->p5 & SQLITE_NULLEQ ){
+ /* If SQLITE_NULLEQ is set (which will only happen if the operator is
+ ** OP_Eq or OP_Ne) then take the jump or not depending on whether
+ ** or not both operands are null.
*/
- x1.flags = MEM_Int;
- x1.u.i = (pIn1->flags & MEM_Null)==0;
- pIn1 = &x1;
- x3.flags = MEM_Int;
- x3.u.i = (pIn3->flags & MEM_Null)==0;
- pIn3 = &x3;
+ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne );
+ u.ai.res = (pIn1->flags & pIn3->flags & MEM_Null)==0;
}else{
- /* If the SQLITE_NULLEQUAL bit is clear and either operand is NULL then
- ** the result is always NULL. The jump is taken if the
- ** SQLITE_JUMPIFNULL bit is set.
+ /* SQLITE_NULLEQ is clear and at least one operand is NULL,
+ ** then the result is always NULL.
+ ** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
*/
if( pOp->p5 & SQLITE_STOREP2 ){
pOut = &p->aMem[pOp->p2];
@@ -43693,38 +53705,133 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
}
break;
}
- }
+ }else{
+ /* Neither operand is NULL. Do a comparison. */
+ u.ai.affinity = pOp->p5 & SQLITE_AFF_MASK;
+ if( u.ai.affinity ){
+ applyAffinity(pIn1, u.ai.affinity, encoding);
+ applyAffinity(pIn3, u.ai.affinity, encoding);
+ if( db->mallocFailed ) goto no_mem;
+ }
- affinity = pOp->p5 & SQLITE_AFF_MASK;
- if( affinity ){
- applyAffinity(pIn1, affinity, encoding);
- applyAffinity(pIn3, affinity, encoding);
+ assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
+ ExpandBlob(pIn1);
+ ExpandBlob(pIn3);
+ u.ai.res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
}
-
- assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
- ExpandBlob(pIn1);
- ExpandBlob(pIn3);
- res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
switch( pOp->opcode ){
- case OP_Eq: res = res==0; break;
- case OP_Ne: res = res!=0; break;
- case OP_Lt: res = res<0; break;
- case OP_Le: res = res<=0; break;
- case OP_Gt: res = res>0; break;
- default: res = res>=0; break;
+ case OP_Eq: u.ai.res = u.ai.res==0; break;
+ case OP_Ne: u.ai.res = u.ai.res!=0; break;
+ case OP_Lt: u.ai.res = u.ai.res<0; break;
+ case OP_Le: u.ai.res = u.ai.res<=0; break;
+ case OP_Gt: u.ai.res = u.ai.res>0; break;
+ default: u.ai.res = u.ai.res>=0; break;
}
if( pOp->p5 & SQLITE_STOREP2 ){
pOut = &p->aMem[pOp->p2];
MemSetTypeFlag(pOut, MEM_Int);
- pOut->u.i = res;
+ pOut->u.i = u.ai.res;
REGISTER_TRACE(pOp->p2, pOut);
- }else if( res ){
+ }else if( u.ai.res ){
pc = pOp->p2-1;
}
break;
}
+/* Opcode: Permutation * * * P4 *
+**
+** Set the permutation used by the OP_Compare operator to be the array
+** of integers in P4.
+**
+** The permutation is only valid until the next OP_Permutation, OP_Compare,
+** OP_Halt, or OP_ResultRow. Typically the OP_Permutation should occur
+** immediately prior to the OP_Compare.
+*/
+case OP_Permutation: {
+ assert( pOp->p4type==P4_INTARRAY );
+ assert( pOp->p4.ai );
+ aPermute = pOp->p4.ai;
+ break;
+}
+
+/* Opcode: Compare P1 P2 P3 P4 *
+**
+** Compare to vectors of registers in reg(P1)..reg(P1+P3-1) (all this
+** one "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of
+** the comparison for use by the next OP_Jump instruct.
+**
+** P4 is a KeyInfo structure that defines collating sequences and sort
+** orders for the comparison. The permutation applies to registers
+** only. The KeyInfo elements are used sequentially.
+**
+** The comparison is a sort comparison, so NULLs compare equal,
+** NULLs are less than numbers, numbers are less than strings,
+** and strings are less than blobs.
+*/
+case OP_Compare: {
+#if 0 /* local variables moved into u.aj */
+ int n;
+ int i;
+ int p1;
+ int p2;
+ const KeyInfo *pKeyInfo;
+ int idx;
+ CollSeq *pColl; /* Collating sequence to use on this term */
+ int bRev; /* True for DESCENDING sort order */
+#endif /* local variables moved into u.aj */
+
+ u.aj.n = pOp->p3;
+ u.aj.pKeyInfo = pOp->p4.pKeyInfo;
+ assert( u.aj.n>0 );
+ assert( u.aj.pKeyInfo!=0 );
+ u.aj.p1 = pOp->p1;
+ u.aj.p2 = pOp->p2;
+#if SQLITE_DEBUG
+ if( aPermute ){
+ int k, mx = 0;
+ for(k=0; k<u.aj.n; k++) if( aPermute[k]>mx ) mx = aPermute[k];
+ assert( u.aj.p1>0 && u.aj.p1+mx<=p->nMem+1 );
+ assert( u.aj.p2>0 && u.aj.p2+mx<=p->nMem+1 );
+ }else{
+ assert( u.aj.p1>0 && u.aj.p1+u.aj.n<=p->nMem+1 );
+ assert( u.aj.p2>0 && u.aj.p2+u.aj.n<=p->nMem+1 );
+ }
+#endif /* SQLITE_DEBUG */
+ for(u.aj.i=0; u.aj.i<u.aj.n; u.aj.i++){
+ u.aj.idx = aPermute ? aPermute[u.aj.i] : u.aj.i;
+ REGISTER_TRACE(u.aj.p1+u.aj.idx, &p->aMem[u.aj.p1+u.aj.idx]);
+ REGISTER_TRACE(u.aj.p2+u.aj.idx, &p->aMem[u.aj.p2+u.aj.idx]);
+ assert( u.aj.i<u.aj.pKeyInfo->nField );
+ u.aj.pColl = u.aj.pKeyInfo->aColl[u.aj.i];
+ u.aj.bRev = u.aj.pKeyInfo->aSortOrder[u.aj.i];
+ iCompare = sqlite3MemCompare(&p->aMem[u.aj.p1+u.aj.idx], &p->aMem[u.aj.p2+u.aj.idx], u.aj.pColl);
+ if( iCompare ){
+ if( u.aj.bRev ) iCompare = -iCompare;
+ break;
+ }
+ }
+ aPermute = 0;
+ break;
+}
+
+/* Opcode: Jump P1 P2 P3 * *
+**
+** Jump to the instruction at address P1, P2, or P3 depending on whether
+** in the most recent OP_Compare instruction the P1 vector was less than
+** equal to, or greater than the P2 vector, respectively.
+*/
+case OP_Jump: { /* jump */
+ if( iCompare<0 ){
+ pc = pOp->p1 - 1;
+ }else if( iCompare==0 ){
+ pc = pOp->p2 - 1;
+ }else{
+ pc = pOp->p3 - 1;
+ }
+ break;
+}
+
/* Opcode: And P1 P2 P3 * *
**
** Take the logical AND of the values in registers P1 and P2 and
@@ -43745,59 +53852,66 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
*/
case OP_And: /* same as TK_AND, in1, in2, out3 */
case OP_Or: { /* same as TK_OR, in1, in2, out3 */
- int v1, v2; /* 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
+#if 0 /* local variables moved into u.ak */
+ int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
+ int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
+#endif /* local variables moved into u.ak */
if( pIn1->flags & MEM_Null ){
- v1 = 2;
+ u.ak.v1 = 2;
}else{
- v1 = sqlite3VdbeIntValue(pIn1)!=0;
+ u.ak.v1 = sqlite3VdbeIntValue(pIn1)!=0;
}
if( pIn2->flags & MEM_Null ){
- v2 = 2;
+ u.ak.v2 = 2;
}else{
- v2 = sqlite3VdbeIntValue(pIn2)!=0;
+ u.ak.v2 = sqlite3VdbeIntValue(pIn2)!=0;
}
if( pOp->opcode==OP_And ){
static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
- v1 = and_logic[v1*3+v2];
+ u.ak.v1 = and_logic[u.ak.v1*3+u.ak.v2];
}else{
static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
- v1 = or_logic[v1*3+v2];
+ u.ak.v1 = or_logic[u.ak.v1*3+u.ak.v2];
}
- if( v1==2 ){
+ if( u.ak.v1==2 ){
MemSetTypeFlag(pOut, MEM_Null);
}else{
- pOut->u.i = v1;
+ pOut->u.i = u.ak.v1;
MemSetTypeFlag(pOut, MEM_Int);
}
break;
}
-/* Opcode: Not P1 * * * *
+/* Opcode: Not P1 P2 * * *
**
-** Interpret the value in register P1 as a boolean value. Replace it
-** with its complement. If the value in register P1 is NULL its value
-** is unchanged.
+** Interpret the value in register P1 as a boolean value. Store the
+** boolean complement in register P2. If the value in register P1 is
+** NULL, then a NULL is stored in P2.
*/
case OP_Not: { /* same as TK_NOT, in1 */
- if( pIn1->flags & MEM_Null ) break; /* Do nothing to NULLs */
- sqlite3VdbeMemIntegerify(pIn1);
- pIn1->u.i = !pIn1->u.i;
- assert( pIn1->flags&MEM_Int );
+ pOut = &p->aMem[pOp->p2];
+ if( pIn1->flags & MEM_Null ){
+ sqlite3VdbeMemSetNull(pOut);
+ }else{
+ sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeIntValue(pIn1));
+ }
break;
}
-/* Opcode: BitNot P1 * * * *
+/* Opcode: BitNot P1 P2 * * *
**
-** Interpret the content of register P1 as an integer. Replace it
-** with its ones-complement. If the value is originally NULL, leave
-** it unchanged.
+** Interpret the content of register P1 as an integer. Store the
+** ones-complement of the P1 value into register P2. If P1 holds
+** a NULL then store a NULL in P2.
*/
case OP_BitNot: { /* same as TK_BITNOT, in1 */
- if( pIn1->flags & MEM_Null ) break; /* Do nothing to NULLs */
- sqlite3VdbeMemIntegerify(pIn1);
- pIn1->u.i = ~pIn1->u.i;
- assert( pIn1->flags&MEM_Int );
+ pOut = &p->aMem[pOp->p2];
+ if( pIn1->flags & MEM_Null ){
+ sqlite3VdbeMemSetNull(pOut);
+ }else{
+ sqlite3VdbeMemSetInt64(pOut, ~sqlite3VdbeIntValue(pIn1));
+ }
break;
}
@@ -43815,39 +53929,33 @@ case OP_BitNot: { /* same as TK_BITNOT, in1 */
*/
case OP_If: /* jump, in1 */
case OP_IfNot: { /* jump, in1 */
+#if 0 /* local variables moved into u.al */
int c;
+#endif /* local variables moved into u.al */
if( pIn1->flags & MEM_Null ){
- c = pOp->p3;
+ u.al.c = pOp->p3;
}else{
#ifdef SQLITE_OMIT_FLOATING_POINT
- c = sqlite3VdbeIntValue(pIn1);
+ u.al.c = sqlite3VdbeIntValue(pIn1)!=0;
#else
- c = sqlite3VdbeRealValue(pIn1)!=0.0;
+ u.al.c = sqlite3VdbeRealValue(pIn1)!=0.0;
#endif
- if( pOp->opcode==OP_IfNot ) c = !c;
+ if( pOp->opcode==OP_IfNot ) u.al.c = !u.al.c;
}
- if( c ){
+ if( u.al.c ){
pc = pOp->p2-1;
}
break;
}
-/* Opcode: IsNull P1 P2 P3 * *
+/* Opcode: IsNull P1 P2 * * *
**
-** Jump to P2 if the value in register P1 is NULL. If P3 is greater
-** than zero, then check all values reg(P1), reg(P1+1),
-** reg(P1+2), ..., reg(P1+P3-1).
+** Jump to P2 if the value in register P1 is NULL.
*/
case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
- int n = pOp->p3;
- assert( pOp->p3==0 || pOp->p1>0 );
- do{
- if( (pIn1->flags & MEM_Null)!=0 ){
- pc = pOp->p2 - 1;
- break;
- }
- pIn1++;
- }while( --n > 0 );
+ if( (pIn1->flags & MEM_Null)!=0 ){
+ pc = pOp->p2 - 1;
+ }
break;
}
@@ -43862,27 +53970,7 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
break;
}
-/* Opcode: SetNumColumns * P2 * * *
-**
-** This opcode sets the number of columns for the cursor opened by the
-** following instruction to P2.
-**
-** An OP_SetNumColumns is only useful if it occurs immediately before
-** one of the following opcodes:
-**
-** OpenRead
-** OpenWrite
-** OpenPseudo
-**
-** If the OP_Column opcode is to be executed on a cursor, then
-** this opcode must be present immediately before the opcode that
-** opens the cursor.
-*/
-case OP_SetNumColumns: {
- break;
-}
-
-/* Opcode: Column P1 P2 P3 P4 *
+/* Opcode: Column P1 P2 P3 P4 P5
**
** Interpret the data that cursor P1 points to as a structure built using
** the MakeRecord instruction. (See the MakeRecord opcode for additional
@@ -43892,138 +53980,187 @@ case OP_SetNumColumns: {
**
** The value extracted is stored in register P3.
**
-** If the KeyAsData opcode has previously executed on this cursor, then the
-** field might be extracted from the key rather than the data.
-**
** If the column contains fewer than P2 fields, then extract a NULL. Or,
** if the P4 argument is a P4_MEM use the value of the P4 argument as
** the result.
+**
+** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor,
+** then the cache of the cursor is reset prior to extracting the column.
+** The first OP_Column against a pseudo-table after the value of the content
+** register has changed should have this bit set.
*/
case OP_Column: {
+#if 0 /* local variables moved into u.am */
u32 payloadSize; /* Number of bytes in the record */
- int p1 = pOp->p1; /* P1 value of the opcode */
- int p2 = pOp->p2; /* column number to retrieve */
- Cursor *pC = 0; /* The VDBE cursor */
+ i64 payloadSize64; /* Number of bytes in the record */
+ int p1; /* P1 value of the opcode */
+ int p2; /* column number to retrieve */
+ VdbeCursor *pC; /* The VDBE cursor */
char *zRec; /* Pointer to complete record-data */
BtCursor *pCrsr; /* The BTree cursor */
u32 *aType; /* aType[i] holds the numeric type of the i-th column */
u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
- u32 nField; /* number of fields in the record */
+ int nField; /* number of fields in the record */
int len; /* The length of the serialized data for the column */
int i; /* Loop counter */
char *zData; /* Part of the record being decoded */
Mem *pDest; /* Where to write the extracted value */
Mem sMem; /* For storing the record being decoded */
-
- sMem.flags = 0;
- sMem.db = 0;
- sMem.zMalloc = 0;
- assert( p1<p->nCursor );
+ u8 *zIdx; /* Index into header */
+ u8 *zEndHdr; /* Pointer to first byte after the header */
+ u32 offset; /* Offset into the data */
+ u64 offset64; /* 64-bit offset. 64 bits needed to catch overflow */
+ int szHdr; /* Size of the header size field at start of record */
+ int avail; /* Number of bytes of available data */
+ Mem *pReg; /* PseudoTable input register */
+#endif /* local variables moved into u.am */
+
+
+ u.am.p1 = pOp->p1;
+ u.am.p2 = pOp->p2;
+ u.am.pC = 0;
+ memset(&u.am.sMem, 0, sizeof(u.am.sMem));
+ assert( u.am.p1<p->nCursor );
assert( pOp->p3>0 && pOp->p3<=p->nMem );
- pDest = &p->aMem[pOp->p3];
- MemSetTypeFlag(pDest, MEM_Null);
+ u.am.pDest = &p->aMem[pOp->p3];
+ MemSetTypeFlag(u.am.pDest, MEM_Null);
+ u.am.zRec = 0;
- /* This block sets the variable payloadSize to be the total number of
+ /* This block sets the variable u.am.payloadSize to be the total number of
** bytes in the record.
**
- ** zRec is set to be the complete text of the record if it is available.
+ ** u.am.zRec is set to be the complete text of the record if it is available.
** The complete record text is always available for pseudo-tables
** If the record is stored in a cursor, the complete record text
- ** might be available in the pC->aRow cache. Or it might not be.
- ** If the data is unavailable, zRec is set to NULL.
+ ** might be available in the u.am.pC->aRow cache. Or it might not be.
+ ** If the data is unavailable, u.am.zRec is set to NULL.
**
** We also compute the number of columns in the record. For cursors,
- ** the number of columns is stored in the Cursor.nField element.
+ ** the number of columns is stored in the VdbeCursor.nField element.
*/
- pC = p->apCsr[p1];
- assert( pC!=0 );
+ u.am.pC = p->apCsr[u.am.p1];
+ assert( u.am.pC!=0 );
#ifndef SQLITE_OMIT_VIRTUALTABLE
- assert( pC->pVtabCursor==0 );
+ assert( u.am.pC->pVtabCursor==0 );
#endif
- if( pC->pCursor!=0 ){
+ u.am.pCrsr = u.am.pC->pCursor;
+ if( u.am.pCrsr!=0 ){
/* The record is stored in a B-Tree */
- rc = sqlite3VdbeCursorMoveto(pC);
+ rc = sqlite3VdbeCursorMoveto(u.am.pC);
if( rc ) goto abort_due_to_error;
- zRec = 0;
- pCrsr = pC->pCursor;
- if( pC->nullRow ){
- payloadSize = 0;
- }else if( pC->cacheStatus==p->cacheCtr ){
- payloadSize = pC->payloadSize;
- zRec = (char*)pC->aRow;
- }else if( pC->isIndex ){
- i64 payloadSize64;
- sqlite3BtreeKeySize(pCrsr, &payloadSize64);
- payloadSize = payloadSize64;
+ if( u.am.pC->nullRow ){
+ u.am.payloadSize = 0;
+ }else if( u.am.pC->cacheStatus==p->cacheCtr ){
+ u.am.payloadSize = u.am.pC->payloadSize;
+ u.am.zRec = (char*)u.am.pC->aRow;
+ }else if( u.am.pC->isIndex ){
+ assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
+ rc = sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64);
+ assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
+ /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
+ ** payload size, so it is impossible for u.am.payloadSize64 to be
+ ** larger than 32 bits. */
+ assert( (u.am.payloadSize64 & SQLITE_MAX_U32)==(u64)u.am.payloadSize64 );
+ u.am.payloadSize = (u32)u.am.payloadSize64;
}else{
- sqlite3BtreeDataSize(pCrsr, &payloadSize);
- }
- nField = pC->nField;
+ assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) );
+ rc = sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize);
+ assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
+ }
+ }else if( u.am.pC->pseudoTableReg>0 ){
+ u.am.pReg = &p->aMem[u.am.pC->pseudoTableReg];
+ assert( u.am.pReg->flags & MEM_Blob );
+ u.am.payloadSize = u.am.pReg->n;
+ u.am.zRec = u.am.pReg->z;
+ u.am.pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr;
+ assert( u.am.payloadSize==0 || u.am.zRec!=0 );
}else{
- assert( pC->pseudoTable );
- /* The record is the sole entry of a pseudo-table */
- payloadSize = pC->nData;
- zRec = pC->pData;
- pC->cacheStatus = CACHE_STALE;
- assert( payloadSize==0 || zRec!=0 );
- nField = pC->nField;
- pCrsr = 0;
- }
-
- /* If payloadSize is 0, then just store a NULL */
- if( payloadSize==0 ){
- assert( pDest->flags&MEM_Null );
+ /* Consider the row to be NULL */
+ u.am.payloadSize = 0;
+ }
+
+ /* If u.am.payloadSize is 0, then just store a NULL */
+ if( u.am.payloadSize==0 ){
+ assert( u.am.pDest->flags&MEM_Null );
goto op_column_out;
}
- if( payloadSize>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ assert( db->aLimit[SQLITE_LIMIT_LENGTH]>=0 );
+ if( u.am.payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
- assert( p2<nField );
+ u.am.nField = u.am.pC->nField;
+ assert( u.am.p2<u.am.nField );
/* Read and parse the table header. Store the results of the parse
** into the record header cache fields of the cursor.
*/
- aType = pC->aType;
- if( pC->cacheStatus==p->cacheCtr ){
- aOffset = pC->aOffset;
+ u.am.aType = u.am.pC->aType;
+ if( u.am.pC->cacheStatus==p->cacheCtr ){
+ u.am.aOffset = u.am.pC->aOffset;
}else{
- u8 *zIdx; /* Index into header */
- u8 *zEndHdr; /* Pointer to first byte after the header */
- u32 offset; /* Offset into the data */
- int szHdrSz; /* Size of the header size field at start of record */
- int avail; /* Number of bytes of available data */
-
- assert(aType);
- pC->aOffset = aOffset = &aType[nField];
- pC->payloadSize = payloadSize;
- pC->cacheStatus = p->cacheCtr;
+ assert(u.am.aType);
+ u.am.avail = 0;
+ u.am.pC->aOffset = u.am.aOffset = &u.am.aType[u.am.nField];
+ u.am.pC->payloadSize = u.am.payloadSize;
+ u.am.pC->cacheStatus = p->cacheCtr;
/* Figure out how many bytes are in the header */
- if( zRec ){
- zData = zRec;
+ if( u.am.zRec ){
+ u.am.zData = u.am.zRec;
}else{
- if( pC->isIndex ){
- zData = (char*)sqlite3BtreeKeyFetch(pCrsr, &avail);
+ if( u.am.pC->isIndex ){
+ u.am.zData = (char*)sqlite3BtreeKeyFetch(u.am.pCrsr, &u.am.avail);
}else{
- zData = (char*)sqlite3BtreeDataFetch(pCrsr, &avail);
+ u.am.zData = (char*)sqlite3BtreeDataFetch(u.am.pCrsr, &u.am.avail);
}
/* If KeyFetch()/DataFetch() managed to get the entire payload,
- ** save the payload in the pC->aRow cache. That will save us from
+ ** save the payload in the u.am.pC->aRow cache. That will save us from
** having to make additional calls to fetch the content portion of
** the record.
*/
- if( avail>=payloadSize ){
- zRec = zData;
- pC->aRow = (u8*)zData;
+ assert( u.am.avail>=0 );
+ if( u.am.payloadSize <= (u32)u.am.avail ){
+ u.am.zRec = u.am.zData;
+ u.am.pC->aRow = (u8*)u.am.zData;
}else{
- pC->aRow = 0;
+ u.am.pC->aRow = 0;
}
}
/* The following assert is true in all cases accept when
** the database file has been corrupted externally.
- ** assert( zRec!=0 || avail>=payloadSize || avail>=9 ); */
- szHdrSz = getVarint32((u8*)zData, offset);
+ ** assert( u.am.zRec!=0 || u.am.avail>=u.am.payloadSize || u.am.avail>=9 ); */
+ u.am.szHdr = getVarint32((u8*)u.am.zData, u.am.offset);
+
+ /* Make sure a corrupt database has not given us an oversize header.
+ ** Do this now to avoid an oversize memory allocation.
+ **
+ ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte
+ ** types use so much data space that there can only be 4096 and 32 of
+ ** them, respectively. So the maximum header length results from a
+ ** 3-byte type for each of the maximum of 32768 columns plus three
+ ** extra bytes for the header length itself. 32768*3 + 3 = 98307.
+ */
+ if( u.am.offset > 98307 ){
+ rc = SQLITE_CORRUPT_BKPT;
+ goto op_column_out;
+ }
+
+ /* Compute in u.am.len the number of bytes of data we need to read in order
+ ** to get u.am.nField type values. u.am.offset is an upper bound on this. But
+ ** u.am.nField might be significantly less than the true number of columns
+ ** in the table, and in that case, 5*u.am.nField+3 might be smaller than u.am.offset.
+ ** We want to minimize u.am.len in order to limit the size of the memory
+ ** allocation, especially if a corrupt database file has caused u.am.offset
+ ** to be oversized. Offset is limited to 98307 above. But 98307 might
+ ** still exceed Robson memory allocation limits on some configurations.
+ ** On systems that cannot tolerate large memory allocations, u.am.nField*5+3
+ ** will likely be much smaller since u.am.nField will likely be less than
+ ** 20 or so. This insures that Robson memory allocation limits are
+ ** not exceeded even for corrupt database files.
+ */
+ u.am.len = u.am.nField*5 + 3;
+ if( u.am.len > (int)u.am.offset ) u.am.len = (int)u.am.offset;
/* The KeyFetch() or DataFetch() above are fast and will get the entire
** record header in most cases. But they will fail to get the complete
@@ -44031,112 +54168,105 @@ case OP_Column: {
** in the B-Tree. When that happens, use sqlite3VdbeMemFromBtree() to
** acquire the complete header text.
*/
- if( !zRec && avail<offset ){
- sMem.flags = 0;
- sMem.db = 0;
- rc = sqlite3VdbeMemFromBtree(pCrsr, 0, offset, pC->isIndex, &sMem);
+ if( !u.am.zRec && u.am.avail<u.am.len ){
+ u.am.sMem.flags = 0;
+ u.am.sMem.db = 0;
+ rc = sqlite3VdbeMemFromBtree(u.am.pCrsr, 0, u.am.len, u.am.pC->isIndex, &u.am.sMem);
if( rc!=SQLITE_OK ){
goto op_column_out;
}
- zData = sMem.z;
+ u.am.zData = u.am.sMem.z;
}
- zEndHdr = (u8 *)&zData[offset];
- zIdx = (u8 *)&zData[szHdrSz];
+ u.am.zEndHdr = (u8 *)&u.am.zData[u.am.len];
+ u.am.zIdx = (u8 *)&u.am.zData[u.am.szHdr];
- /* Scan the header and use it to fill in the aType[] and aOffset[]
- ** arrays. aType[i] will contain the type integer for the i-th
- ** column and aOffset[i] will contain the offset from the beginning
- ** of the record to the start of the data for the i-th column
+ /* Scan the header and use it to fill in the u.am.aType[] and u.am.aOffset[]
+ ** arrays. u.am.aType[u.am.i] will contain the type integer for the u.am.i-th
+ ** column and u.am.aOffset[u.am.i] will contain the u.am.offset from the beginning
+ ** of the record to the start of the data for the u.am.i-th column
*/
- for(i=0; i<nField; i++){
- if( zIdx<zEndHdr ){
- aOffset[i] = offset;
- zIdx += getVarint32(zIdx, aType[i]);
- offset += sqlite3VdbeSerialTypeLen(aType[i]);
+ u.am.offset64 = u.am.offset;
+ for(u.am.i=0; u.am.i<u.am.nField; u.am.i++){
+ if( u.am.zIdx<u.am.zEndHdr ){
+ u.am.aOffset[u.am.i] = (u32)u.am.offset64;
+ u.am.zIdx += getVarint32(u.am.zIdx, u.am.aType[u.am.i]);
+ u.am.offset64 += sqlite3VdbeSerialTypeLen(u.am.aType[u.am.i]);
}else{
- /* If i is less that nField, then there are less fields in this
+ /* If u.am.i is less that u.am.nField, then there are less fields in this
** record than SetNumColumns indicated there are columns in the
- ** table. Set the offset for any extra columns not present in
+ ** table. Set the u.am.offset for any extra columns not present in
** the record to 0. This tells code below to store a NULL
** instead of deserializing a value from the record.
*/
- aOffset[i] = 0;
+ u.am.aOffset[u.am.i] = 0;
}
}
- sqlite3VdbeMemRelease(&sMem);
- sMem.flags = MEM_Null;
+ sqlite3VdbeMemRelease(&u.am.sMem);
+ u.am.sMem.flags = MEM_Null;
/* If we have read more header data than was contained in the header,
** or if the end of the last field appears to be past the end of the
** record, or if the end of the last field appears to be before the end
- ** of the record (when all fields present), then we must be dealing
+ ** of the record (when all fields present), then we must be dealing
** with a corrupt database.
*/
- if( zIdx>zEndHdr || offset>payloadSize || (zIdx==zEndHdr && offset!=payloadSize) ){
+ if( (u.am.zIdx > u.am.zEndHdr)|| (u.am.offset64 > u.am.payloadSize)
+ || (u.am.zIdx==u.am.zEndHdr && u.am.offset64!=(u64)u.am.payloadSize) ){
rc = SQLITE_CORRUPT_BKPT;
goto op_column_out;
}
}
- /* Get the column information. If aOffset[p2] is non-zero, then
- ** deserialize the value from the record. If aOffset[p2] is zero,
+ /* Get the column information. If u.am.aOffset[u.am.p2] is non-zero, then
+ ** deserialize the value from the record. If u.am.aOffset[u.am.p2] is zero,
** then there are not enough fields in the record to satisfy the
** request. In this case, set the value NULL or to P4 if P4 is
** a pointer to a Mem object.
*/
- if( aOffset[p2] ){
+ if( u.am.aOffset[u.am.p2] ){
assert( rc==SQLITE_OK );
- if( zRec ){
- if( pDest->flags&MEM_Dyn ){
- sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], &sMem);
- sMem.db = db;
- rc = sqlite3VdbeMemCopy(pDest, &sMem);
- assert( !(sMem.flags&MEM_Dyn) );
- if( rc!=SQLITE_OK ){
- goto op_column_out;
- }
- }else{
- sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], pDest);
- }
+ if( u.am.zRec ){
+ sqlite3VdbeMemReleaseExternal(u.am.pDest);
+ sqlite3VdbeSerialGet((u8 *)&u.am.zRec[u.am.aOffset[u.am.p2]], u.am.aType[u.am.p2], u.am.pDest);
}else{
- len = sqlite3VdbeSerialTypeLen(aType[p2]);
- sqlite3VdbeMemMove(&sMem, pDest);
- rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, pC->isIndex, &sMem);
+ u.am.len = sqlite3VdbeSerialTypeLen(u.am.aType[u.am.p2]);
+ sqlite3VdbeMemMove(&u.am.sMem, u.am.pDest);
+ rc = sqlite3VdbeMemFromBtree(u.am.pCrsr, u.am.aOffset[u.am.p2], u.am.len, u.am.pC->isIndex, &u.am.sMem);
if( rc!=SQLITE_OK ){
goto op_column_out;
}
- zData = sMem.z;
- sqlite3VdbeSerialGet((u8*)zData, aType[p2], pDest);
+ u.am.zData = u.am.sMem.z;
+ sqlite3VdbeSerialGet((u8*)u.am.zData, u.am.aType[u.am.p2], u.am.pDest);
}
- pDest->enc = encoding;
+ u.am.pDest->enc = encoding;
}else{
if( pOp->p4type==P4_MEM ){
- sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static);
+ sqlite3VdbeMemShallowCopy(u.am.pDest, pOp->p4.pMem, MEM_Static);
}else{
- assert( pDest->flags&MEM_Null );
+ assert( u.am.pDest->flags&MEM_Null );
}
}
/* If we dynamically allocated space to hold the data (in the
** sqlite3VdbeMemFromBtree() call above) then transfer control of that
- ** dynamically allocated space over to the pDest structure.
+ ** dynamically allocated space over to the u.am.pDest structure.
** This prevents a memory copy.
*/
- if( sMem.zMalloc ){
- assert( sMem.z==sMem.zMalloc );
- assert( !(pDest->flags & MEM_Dyn) );
- assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z );
- pDest->flags &= ~(MEM_Ephem|MEM_Static);
- pDest->flags |= MEM_Term;
- pDest->z = sMem.z;
- pDest->zMalloc = sMem.zMalloc;
+ if( u.am.sMem.zMalloc ){
+ assert( u.am.sMem.z==u.am.sMem.zMalloc );
+ assert( !(u.am.pDest->flags & MEM_Dyn) );
+ assert( !(u.am.pDest->flags & (MEM_Blob|MEM_Str)) || u.am.pDest->z==u.am.sMem.z );
+ u.am.pDest->flags &= ~(MEM_Ephem|MEM_Static);
+ u.am.pDest->flags |= MEM_Term;
+ u.am.pDest->z = u.am.sMem.z;
+ u.am.pDest->zMalloc = u.am.sMem.zMalloc;
}
- rc = sqlite3VdbeMemMakeWriteable(pDest);
+ rc = sqlite3VdbeMemMakeWriteable(u.am.pDest);
op_column_out:
- UPDATE_MAX_BLOBSIZE(pDest);
- REGISTER_TRACE(pOp->p3, pDest);
+ UPDATE_MAX_BLOBSIZE(u.am.pDest);
+ REGISTER_TRACE(pOp->p3, u.am.pDest);
break;
}
@@ -44149,14 +54279,19 @@ op_column_out:
** memory cell in the range.
*/
case OP_Affinity: {
- char *zAffinity = pOp->p4.z;
- Mem *pData0 = &p->aMem[pOp->p1];
- Mem *pLast = &pData0[pOp->p2-1];
- Mem *pRec;
-
- for(pRec=pData0; pRec<=pLast; pRec++){
- ExpandBlob(pRec);
- applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
+#if 0 /* local variables moved into u.an */
+ char *zAffinity; /* The affinity to be applied */
+ Mem *pData0; /* First register to which to apply affinity */
+ Mem *pLast; /* Last register to which to apply affinity */
+ Mem *pRec; /* Current register */
+#endif /* local variables moved into u.an */
+
+ u.an.zAffinity = pOp->p4.z;
+ u.an.pData0 = &p->aMem[pOp->p1];
+ u.an.pLast = &u.an.pData0[pOp->p2-1];
+ for(u.an.pRec=u.an.pData0; u.an.pRec<=u.an.pLast; u.an.pRec++){
+ ExpandBlob(u.an.pRec);
+ applyAffinity(u.an.pRec, u.an.zAffinity[u.an.pRec-u.an.pData0], encoding);
}
break;
}
@@ -44165,7 +54300,7 @@ case OP_Affinity: {
**
** Convert P2 registers beginning with P1 into a single entry
** suitable for use as a data record in a database table or as a key
-** in an index. The details of the format are irrelavant as long as
+** in an index. The details of the format are irrelevant as long as
** the OP_Column opcode can decode the record later.
** Refer to source code comments for the details of the record
** format.
@@ -44180,107 +54315,113 @@ case OP_Affinity: {
** If P4 is NULL then all index fields have the affinity NONE.
*/
case OP_MakeRecord: {
+#if 0 /* local variables moved into u.ao */
+ u8 *zNewRecord; /* A buffer to hold the data for the new record */
+ Mem *pRec; /* The new record */
+ u64 nData; /* Number of bytes of data space */
+ int nHdr; /* Number of bytes of header space */
+ i64 nByte; /* Data space required for this record */
+ int nZero; /* Number of zero bytes at the end of the record */
+ int nVarint; /* Number of bytes in a varint */
+ u32 serial_type; /* Type field */
+ Mem *pData0; /* First field to be combined into the record */
+ Mem *pLast; /* Last field of the record */
+ int nField; /* Number of fields in the record */
+ char *zAffinity; /* The affinity string for the record */
+ int file_format; /* File format to use for encoding */
+ int i; /* Space used in zNewRecord[] */
+ int len; /* Length of a field */
+#endif /* local variables moved into u.ao */
+
/* Assuming the record contains N fields, the record format looks
** like this:
**
** ------------------------------------------------------------------------
- ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
+ ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
** ------------------------------------------------------------------------
**
** Data(0) is taken from register P1. Data(1) comes from register P1+1
** and so froth.
**
- ** Each type field is a varint representing the serial type of the
+ ** Each type field is a varint representing the serial type of the
** corresponding data element (see sqlite3VdbeSerialType()). The
** hdr-size field is also a varint which is the offset from the beginning
** of the record to data0.
*/
- u8 *zNewRecord; /* A buffer to hold the data for the new record */
- Mem *pRec; /* The new record */
- u64 nData = 0; /* Number of bytes of data space */
- int nHdr = 0; /* Number of bytes of header space */
- u64 nByte = 0; /* Data space required for this record */
- int nZero = 0; /* Number of zero bytes at the end of the record */
- int nVarint; /* Number of bytes in a varint */
- u32 serial_type; /* Type field */
- Mem *pData0; /* First field to be combined into the record */
- Mem *pLast; /* Last field of the record */
- int nField; /* Number of fields in the record */
- char *zAffinity; /* The affinity string for the record */
- int file_format; /* File format to use for encoding */
- int i; /* Space used in zNewRecord[] */
-
- nField = pOp->p1;
- zAffinity = pOp->p4.z;
- assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=p->nMem );
- pData0 = &p->aMem[nField];
- nField = pOp->p2;
- pLast = &pData0[nField-1];
- file_format = p->minWriteFileFormat;
+ u.ao.nData = 0; /* Number of bytes of data space */
+ u.ao.nHdr = 0; /* Number of bytes of header space */
+ u.ao.nByte = 0; /* Data space required for this record */
+ u.ao.nZero = 0; /* Number of zero bytes at the end of the record */
+ u.ao.nField = pOp->p1;
+ u.ao.zAffinity = pOp->p4.z;
+ assert( u.ao.nField>0 && pOp->p2>0 && pOp->p2+u.ao.nField<=p->nMem+1 );
+ u.ao.pData0 = &p->aMem[u.ao.nField];
+ u.ao.nField = pOp->p2;
+ u.ao.pLast = &u.ao.pData0[u.ao.nField-1];
+ u.ao.file_format = p->minWriteFileFormat;
/* Loop through the elements that will make up the record to figure
** out how much space is required for the new record.
*/
- for(pRec=pData0; pRec<=pLast; pRec++){
- int len;
- if( zAffinity ){
- applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
+ for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){
+ if( u.ao.zAffinity ){
+ applyAffinity(u.ao.pRec, u.ao.zAffinity[u.ao.pRec-u.ao.pData0], encoding);
}
- if( pRec->flags&MEM_Zero && pRec->n>0 ){
- sqlite3VdbeMemExpandBlob(pRec);
+ if( u.ao.pRec->flags&MEM_Zero && u.ao.pRec->n>0 ){
+ sqlite3VdbeMemExpandBlob(u.ao.pRec);
}
- serial_type = sqlite3VdbeSerialType(pRec, file_format);
- len = sqlite3VdbeSerialTypeLen(serial_type);
- nData += len;
- nHdr += sqlite3VarintLen(serial_type);
- if( pRec->flags & MEM_Zero ){
+ u.ao.serial_type = sqlite3VdbeSerialType(u.ao.pRec, u.ao.file_format);
+ u.ao.len = sqlite3VdbeSerialTypeLen(u.ao.serial_type);
+ u.ao.nData += u.ao.len;
+ u.ao.nHdr += sqlite3VarintLen(u.ao.serial_type);
+ if( u.ao.pRec->flags & MEM_Zero ){
/* Only pure zero-filled BLOBs can be input to this Opcode.
** We do not allow blobs with a prefix and a zero-filled tail. */
- nZero += pRec->u.i;
- }else if( len ){
- nZero = 0;
+ u.ao.nZero += u.ao.pRec->u.nZero;
+ }else if( u.ao.len ){
+ u.ao.nZero = 0;
}
}
/* Add the initial header varint and total the size */
- nHdr += nVarint = sqlite3VarintLen(nHdr);
- if( nVarint<sqlite3VarintLen(nHdr) ){
- nHdr++;
+ u.ao.nHdr += u.ao.nVarint = sqlite3VarintLen(u.ao.nHdr);
+ if( u.ao.nVarint<sqlite3VarintLen(u.ao.nHdr) ){
+ u.ao.nHdr++;
}
- nByte = nHdr+nData-nZero;
- if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ u.ao.nByte = u.ao.nHdr+u.ao.nData-u.ao.nZero;
+ if( u.ao.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
- /* Make sure the output register has a buffer large enough to store
+ /* Make sure the output register has a buffer large enough to store
** the new record. The output register (pOp->p3) is not allowed to
** be one of the input registers (because the following call to
** sqlite3VdbeMemGrow() could clobber the value before it is used).
*/
assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
pOut = &p->aMem[pOp->p3];
- if( sqlite3VdbeMemGrow(pOut, nByte, 0) ){
+ if( sqlite3VdbeMemGrow(pOut, (int)u.ao.nByte, 0) ){
goto no_mem;
}
- zNewRecord = (u8 *)pOut->z;
+ u.ao.zNewRecord = (u8 *)pOut->z;
/* Write the record */
- i = putVarint32(zNewRecord, nHdr);
- for(pRec=pData0; pRec<=pLast; pRec++){
- serial_type = sqlite3VdbeSerialType(pRec, file_format);
- i += putVarint32(&zNewRecord[i], serial_type); /* serial type */
+ u.ao.i = putVarint32(u.ao.zNewRecord, u.ao.nHdr);
+ for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){
+ u.ao.serial_type = sqlite3VdbeSerialType(u.ao.pRec, u.ao.file_format);
+ u.ao.i += putVarint32(&u.ao.zNewRecord[u.ao.i], u.ao.serial_type); /* serial type */
}
- for(pRec=pData0; pRec<=pLast; pRec++){ /* serial data */
- i += sqlite3VdbeSerialPut(&zNewRecord[i], nByte-i, pRec, file_format);
+ for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){ /* serial data */
+ u.ao.i += sqlite3VdbeSerialPut(&u.ao.zNewRecord[u.ao.i], (int)(u.ao.nByte-u.ao.i), u.ao.pRec,u.ao.file_format);
}
- assert( i==nByte );
+ assert( u.ao.i==u.ao.nByte );
assert( pOp->p3>0 && pOp->p3<=p->nMem );
- pOut->n = nByte;
+ pOut->n = (int)u.ao.nByte;
pOut->flags = MEM_Blob | MEM_Dyn;
pOut->xDel = 0;
- if( nZero ){
- pOut->u.i = nZero;
+ if( u.ao.nZero ){
+ pOut->u.nZero = u.ao.nZero;
pOut->flags |= MEM_Zero;
}
pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */
@@ -44289,42 +54430,178 @@ case OP_MakeRecord: {
break;
}
-/* Opcode: Statement P1 * * * *
-**
-** Begin an individual statement transaction which is part of a larger
-** transaction. This is needed so that the statement
-** can be rolled back after an error without having to roll back the
-** entire transaction. The statement transaction will automatically
-** commit when the VDBE halts.
-**
-** If the database connection is currently in autocommit mode (that
-** is to say, if it is in between BEGIN and COMMIT)
-** and if there are no other active statements on the same database
-** connection, then this operation is a no-op. No statement transaction
-** is needed since any error can use the normal ROLLBACK process to
-** undo changes.
+/* Opcode: Count P1 P2 * * *
**
-** If a statement transaction is started, then a statement journal file
-** will be allocated and initialized.
+** Store the number of entries (an integer value) in the table or index
+** opened by cursor P1 in register P2
+*/
+#ifndef SQLITE_OMIT_BTREECOUNT
+case OP_Count: { /* out2-prerelease */
+#if 0 /* local variables moved into u.ap */
+ i64 nEntry;
+ BtCursor *pCrsr;
+#endif /* local variables moved into u.ap */
+
+ u.ap.pCrsr = p->apCsr[pOp->p1]->pCursor;
+ if( u.ap.pCrsr ){
+ rc = sqlite3BtreeCount(u.ap.pCrsr, &u.ap.nEntry);
+ }else{
+ u.ap.nEntry = 0;
+ }
+ pOut->flags = MEM_Int;
+ pOut->u.i = u.ap.nEntry;
+ break;
+}
+#endif
+
+/* Opcode: Savepoint P1 * * P4 *
**
-** The statement is begun on the database file with index P1. The main
-** database file has an index of 0 and the file used for temporary tables
-** has an index of 1.
+** Open, release or rollback the savepoint named by parameter P4, depending
+** on the value of P1. To open a new savepoint, P1==0. To release (commit) an
+** existing savepoint, P1==1, or to rollback an existing savepoint P1==2.
*/
-case OP_Statement: {
- if( db->autoCommit==0 || db->activeVdbeCnt>1 ){
- int i = pOp->p1;
- Btree *pBt;
- assert( i>=0 && i<db->nDb );
- assert( db->aDb[i].pBt!=0 );
- pBt = db->aDb[i].pBt;
- assert( sqlite3BtreeIsInTrans(pBt) );
- assert( (p->btreeMask & (1<<i))!=0 );
- if( !sqlite3BtreeIsInStmt(pBt) ){
- rc = sqlite3BtreeBeginStmt(pBt);
- p->openedStatement = 1;
+case OP_Savepoint: {
+#if 0 /* local variables moved into u.aq */
+ int p1; /* Value of P1 operand */
+ char *zName; /* Name of savepoint */
+ int nName;
+ Savepoint *pNew;
+ Savepoint *pSavepoint;
+ Savepoint *pTmp;
+ int iSavepoint;
+ int ii;
+#endif /* local variables moved into u.aq */
+
+ u.aq.p1 = pOp->p1;
+ u.aq.zName = pOp->p4.z;
+
+ /* Assert that the u.aq.p1 parameter is valid. Also that if there is no open
+ ** transaction, then there cannot be any savepoints.
+ */
+ assert( db->pSavepoint==0 || db->autoCommit==0 );
+ assert( u.aq.p1==SAVEPOINT_BEGIN||u.aq.p1==SAVEPOINT_RELEASE||u.aq.p1==SAVEPOINT_ROLLBACK );
+ assert( db->pSavepoint || db->isTransactionSavepoint==0 );
+ assert( checkSavepointCount(db) );
+
+ if( u.aq.p1==SAVEPOINT_BEGIN ){
+ if( db->writeVdbeCnt>0 ){
+ /* A new savepoint cannot be created if there are active write
+ ** statements (i.e. open read/write incremental blob handles).
+ */
+ sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - "
+ "SQL statements in progress");
+ rc = SQLITE_BUSY;
+ }else{
+ u.aq.nName = sqlite3Strlen30(u.aq.zName);
+
+ /* Create a new savepoint structure. */
+ u.aq.pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+u.aq.nName+1);
+ if( u.aq.pNew ){
+ u.aq.pNew->zName = (char *)&u.aq.pNew[1];
+ memcpy(u.aq.pNew->zName, u.aq.zName, u.aq.nName+1);
+
+ /* If there is no open transaction, then mark this as a special
+ ** "transaction savepoint". */
+ if( db->autoCommit ){
+ db->autoCommit = 0;
+ db->isTransactionSavepoint = 1;
+ }else{
+ db->nSavepoint++;
+ }
+
+ /* Link the new savepoint into the database handle's list. */
+ u.aq.pNew->pNext = db->pSavepoint;
+ db->pSavepoint = u.aq.pNew;
+ u.aq.pNew->nDeferredCons = db->nDeferredCons;
+ }
+ }
+ }else{
+ u.aq.iSavepoint = 0;
+
+ /* Find the named savepoint. If there is no such savepoint, then an
+ ** an error is returned to the user. */
+ for(
+ u.aq.pSavepoint = db->pSavepoint;
+ u.aq.pSavepoint && sqlite3StrICmp(u.aq.pSavepoint->zName, u.aq.zName);
+ u.aq.pSavepoint = u.aq.pSavepoint->pNext
+ ){
+ u.aq.iSavepoint++;
+ }
+ if( !u.aq.pSavepoint ){
+ sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", u.aq.zName);
+ rc = SQLITE_ERROR;
+ }else if(
+ db->writeVdbeCnt>0 || (u.aq.p1==SAVEPOINT_ROLLBACK && db->activeVdbeCnt>1)
+ ){
+ /* It is not possible to release (commit) a savepoint if there are
+ ** active write statements. It is not possible to rollback a savepoint
+ ** if there are any active statements at all.
+ */
+ sqlite3SetString(&p->zErrMsg, db,
+ "cannot %s savepoint - SQL statements in progress",
+ (u.aq.p1==SAVEPOINT_ROLLBACK ? "rollback": "release")
+ );
+ rc = SQLITE_BUSY;
+ }else{
+
+ /* Determine whether or not this is a transaction savepoint. If so,
+ ** and this is a RELEASE command, then the current transaction
+ ** is committed.
+ */
+ int isTransaction = u.aq.pSavepoint->pNext==0 && db->isTransactionSavepoint;
+ if( isTransaction && u.aq.p1==SAVEPOINT_RELEASE ){
+ if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
+ goto vdbe_return;
+ }
+ db->autoCommit = 1;
+ if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
+ p->pc = pc;
+ db->autoCommit = 0;
+ p->rc = rc = SQLITE_BUSY;
+ goto vdbe_return;
+ }
+ db->isTransactionSavepoint = 0;
+ rc = p->rc;
+ }else{
+ u.aq.iSavepoint = db->nSavepoint - u.aq.iSavepoint - 1;
+ for(u.aq.ii=0; u.aq.ii<db->nDb; u.aq.ii++){
+ rc = sqlite3BtreeSavepoint(db->aDb[u.aq.ii].pBt, u.aq.p1, u.aq.iSavepoint);
+ if( rc!=SQLITE_OK ){
+ goto abort_due_to_error;
+ }
+ }
+ if( u.aq.p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){
+ sqlite3ExpirePreparedStatements(db);
+ sqlite3ResetInternalSchema(db, 0);
+ }
+ }
+
+ /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all
+ ** savepoints nested inside of the savepoint being operated on. */
+ while( db->pSavepoint!=u.aq.pSavepoint ){
+ u.aq.pTmp = db->pSavepoint;
+ db->pSavepoint = u.aq.pTmp->pNext;
+ sqlite3DbFree(db, u.aq.pTmp);
+ db->nSavepoint--;
+ }
+
+ /* If it is a RELEASE, then destroy the savepoint being operated on
+ ** too. If it is a ROLLBACK TO, then set the number of deferred
+ ** constraint violations present in the database to the value stored
+ ** when the savepoint was created. */
+ if( u.aq.p1==SAVEPOINT_RELEASE ){
+ assert( u.aq.pSavepoint==db->pSavepoint );
+ db->pSavepoint = u.aq.pSavepoint->pNext;
+ sqlite3DbFree(db, u.aq.pSavepoint);
+ if( !isTransaction ){
+ db->nSavepoint--;
+ }
+ }else{
+ db->nDeferredCons = u.aq.pSavepoint->nDeferredCons;
+ }
}
}
+
break;
}
@@ -44332,41 +54609,58 @@ case OP_Statement: {
**
** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
** back any currently active btree transactions. If there are any active
-** VMs (apart from this one), then the COMMIT or ROLLBACK statement fails.
+** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if
+** there are active writing VMs or active VMs that use shared cache.
**
** This instruction causes the VM to halt.
*/
case OP_AutoCommit: {
- u8 i = pOp->p1;
- u8 rollback = pOp->p2;
-
- assert( i==1 || i==0 );
- assert( i==1 || rollback==0 );
-
+#if 0 /* local variables moved into u.ar */
+ int desiredAutoCommit;
+ int iRollback;
+ int turnOnAC;
+#endif /* local variables moved into u.ar */
+
+ u.ar.desiredAutoCommit = pOp->p1;
+ u.ar.iRollback = pOp->p2;
+ u.ar.turnOnAC = u.ar.desiredAutoCommit && !db->autoCommit;
+ assert( u.ar.desiredAutoCommit==1 || u.ar.desiredAutoCommit==0 );
+ assert( u.ar.desiredAutoCommit==1 || u.ar.iRollback==0 );
assert( db->activeVdbeCnt>0 ); /* At least this one VM is active */
- if( db->activeVdbeCnt>1 && i && !db->autoCommit ){
- /* If this instruction implements a COMMIT or ROLLBACK, other VMs are
+ if( u.ar.turnOnAC && u.ar.iRollback && db->activeVdbeCnt>1 ){
+ /* If this instruction implements a ROLLBACK and other VMs are
** still running, and a transaction is active, return an error indicating
- ** that the other VMs must complete first.
+ ** that the other VMs must complete first.
*/
- sqlite3SetString(&p->zErrMsg, "cannot ", rollback?"rollback":"commit",
- " transaction - SQL statements in progress", (char*)0);
- rc = SQLITE_ERROR;
- }else if( i!=db->autoCommit ){
- if( pOp->p2 ){
- assert( i==1 );
+ sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - "
+ "SQL statements in progress");
+ rc = SQLITE_BUSY;
+ }else if( u.ar.turnOnAC && !u.ar.iRollback && db->writeVdbeCnt>0 ){
+ /* If this instruction implements a COMMIT and other VMs are writing
+ ** return an error indicating that the other VMs must complete first.
+ */
+ sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - "
+ "SQL statements in progress");
+ rc = SQLITE_BUSY;
+ }else if( u.ar.desiredAutoCommit!=db->autoCommit ){
+ if( u.ar.iRollback ){
+ assert( u.ar.desiredAutoCommit==1 );
sqlite3RollbackAll(db);
db->autoCommit = 1;
+ }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
+ goto vdbe_return;
}else{
- db->autoCommit = i;
+ db->autoCommit = (u8)u.ar.desiredAutoCommit;
if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
p->pc = pc;
- db->autoCommit = 1-i;
+ db->autoCommit = (u8)(1-u.ar.desiredAutoCommit);
p->rc = rc = SQLITE_BUSY;
goto vdbe_return;
}
}
+ assert( db->nStatement==0 );
+ sqlite3CloseSavepoints(db);
if( p->rc==SQLITE_OK ){
rc = SQLITE_DONE;
}else{
@@ -44374,11 +54668,11 @@ case OP_AutoCommit: {
}
goto vdbe_return;
}else{
- sqlite3SetString(&p->zErrMsg,
- (!i)?"cannot start a transaction within a transaction":(
- (rollback)?"cannot rollback - no transaction is active":
- "cannot commit - no transaction is active"), (char*)0);
-
+ sqlite3SetString(&p->zErrMsg, db,
+ (!u.ar.desiredAutoCommit)?"cannot start a transaction within a transaction":(
+ (u.ar.iRollback)?"cannot rollback - no transaction is active":
+ "cannot commit - no transaction is active"));
+
rc = SQLITE_ERROR;
}
break;
@@ -44403,26 +54697,54 @@ case OP_AutoCommit: {
** database. If P2 is 2 or greater then an EXCLUSIVE lock is also obtained
** on the file.
**
+** If a write-transaction is started and the Vdbe.usesStmtJournal flag is
+** true (this flag is set if the Vdbe may modify more than one row and may
+** throw an ABORT exception), a statement transaction may also be opened.
+** More specifically, a statement transaction is opened iff the database
+** connection is currently not in autocommit mode, or if there are other
+** active statements. A statement transaction allows the affects of this
+** VDBE to be rolled back after an error without having to roll back the
+** entire transaction. If no error is encountered, the statement transaction
+** will automatically commit when the VDBE halts.
+**
** If P2 is zero, then a read-lock is obtained on the database file.
*/
case OP_Transaction: {
- int i = pOp->p1;
+#if 0 /* local variables moved into u.as */
Btree *pBt;
+#endif /* local variables moved into u.as */
- assert( i>=0 && i<db->nDb );
- assert( (p->btreeMask & (1<<i))!=0 );
- pBt = db->aDb[i].pBt;
+ assert( pOp->p1>=0 && pOp->p1<db->nDb );
+ assert( (p->btreeMask & (1<<pOp->p1))!=0 );
+ u.as.pBt = db->aDb[pOp->p1].pBt;
- if( pBt ){
- rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
+ if( u.as.pBt ){
+ rc = sqlite3BtreeBeginTrans(u.as.pBt, pOp->p2);
if( rc==SQLITE_BUSY ){
p->pc = pc;
p->rc = rc = SQLITE_BUSY;
goto vdbe_return;
}
- if( rc!=SQLITE_OK && rc!=SQLITE_READONLY /* && rc!=SQLITE_BUSY */ ){
+ if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
+
+ if( pOp->p2 && p->usesStmtJournal
+ && (db->autoCommit==0 || db->activeVdbeCnt>1)
+ ){
+ assert( sqlite3BtreeIsInTrans(u.as.pBt) );
+ if( p->iStatement==0 ){
+ assert( db->nStatement>=0 && db->nSavepoint>=0 );
+ db->nStatement++;
+ p->iStatement = db->nSavepoint + db->nStatement;
+ }
+ rc = sqlite3BtreeBeginStmt(u.as.pBt, p->iStatement);
+
+ /* Store the current value of the database handles deferred constraint
+ ** counter. If the statement transaction needs to be rolled back,
+ ** the value of this counter needs to be restored too. */
+ p->nStmtDefCons = db->nDeferredCons;
+ }
}
break;
}
@@ -44430,42 +54752,31 @@ case OP_Transaction: {
/* Opcode: ReadCookie P1 P2 P3 * *
**
** Read cookie number P3 from database P1 and write it into register P2.
-** P3==0 is the schema version. P3==1 is the database format.
-** P3==2 is the recommended pager cache size, and so forth. P1==0 is
+** P3==1 is the schema version. P3==2 is the database format.
+** P3==3 is the recommended pager cache size, and so forth. P1==0 is
** the main database file and P1==1 is the database file used to store
** temporary tables.
**
-** If P1 is negative, then this is a request to read the size of a
-** databases free-list. P3 must be set to 1 in this case. The actual
-** database accessed is ((P1+1)*-1). For example, a P1 parameter of -1
-** corresponds to database 0 ("main"), a P1 of -2 is database 1 ("temp").
-**
** There must be a read-lock on the database (either a transaction
** must be started or there must be an open cursor) before
** executing this instruction.
*/
case OP_ReadCookie: { /* out2-prerelease */
+#if 0 /* local variables moved into u.at */
int iMeta;
- int iDb = pOp->p1;
- int iCookie = pOp->p3;
+ int iDb;
+ int iCookie;
+#endif /* local variables moved into u.at */
+ u.at.iDb = pOp->p1;
+ u.at.iCookie = pOp->p3;
assert( pOp->p3<SQLITE_N_BTREE_META );
- if( iDb<0 ){
- iDb = (-1*(iDb+1));
- iCookie *= -1;
- }
- assert( iDb>=0 && iDb<db->nDb );
- assert( db->aDb[iDb].pBt!=0 );
- assert( (p->btreeMask & (1<<iDb))!=0 );
- /* The indexing of meta values at the schema layer is off by one from
- ** the indexing in the btree layer. The btree considers meta[0] to
- ** be the number of free pages in the database (a read-only value)
- ** and meta[1] to be the schema cookie. The schema layer considers
- ** meta[1] to be the schema cookie. So we have to shift the index
- ** by one in the following statement.
- */
- rc = sqlite3BtreeGetMeta(db->aDb[iDb].pBt, 1 + iCookie, (u32 *)&iMeta);
- pOut->u.i = iMeta;
+ assert( u.at.iDb>=0 && u.at.iDb<db->nDb );
+ assert( db->aDb[u.at.iDb].pBt!=0 );
+ assert( (p->btreeMask & (1<<u.at.iDb))!=0 );
+
+ sqlite3BtreeGetMeta(db->aDb[u.at.iDb].pBt, u.at.iCookie, (u32 *)&u.at.iMeta);
+ pOut->u.i = u.at.iMeta;
MemSetTypeFlag(pOut, MEM_Int);
break;
}
@@ -44473,31 +54784,32 @@ case OP_ReadCookie: { /* out2-prerelease */
/* Opcode: SetCookie P1 P2 P3 * *
**
** Write the content of register P3 (interpreted as an integer)
-** into cookie number P2 of database P1.
-** P2==0 is the schema version. P2==1 is the database format.
-** P2==2 is the recommended pager cache size, and so forth. P1==0 is
-** the main database file and P1==1 is the database file used to store
-** temporary tables.
+** into cookie number P2 of database P1. P2==1 is the schema version.
+** P2==2 is the database format. P2==3 is the recommended pager cache
+** size, and so forth. P1==0 is the main database file and P1==1 is the
+** database file used to store temporary tables.
**
** A transaction must be started before executing this opcode.
*/
case OP_SetCookie: { /* in3 */
+#if 0 /* local variables moved into u.au */
Db *pDb;
+#endif /* local variables moved into u.au */
assert( pOp->p2<SQLITE_N_BTREE_META );
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
- pDb = &db->aDb[pOp->p1];
- assert( pDb->pBt!=0 );
+ u.au.pDb = &db->aDb[pOp->p1];
+ assert( u.au.pDb->pBt!=0 );
sqlite3VdbeMemIntegerify(pIn3);
/* See note about index shifting on OP_ReadCookie */
- rc = sqlite3BtreeUpdateMeta(pDb->pBt, 1+pOp->p2, (int)pIn3->u.i);
- if( pOp->p2==0 ){
+ rc = sqlite3BtreeUpdateMeta(u.au.pDb->pBt, pOp->p2, (int)pIn3->u.i);
+ if( pOp->p2==BTREE_SCHEMA_VERSION ){
/* When the schema cookie changes, record the new cookie internally */
- pDb->pSchema->schema_cookie = pIn3->u.i;
+ u.au.pDb->pSchema->schema_cookie = (int)pIn3->u.i;
db->flags |= SQLITE_InternChanges;
- }else if( pOp->p2==1 ){
+ }else if( pOp->p2==BTREE_FILE_FORMAT ){
/* Record changes in the file format */
- pDb->pSchema->file_format = pIn3->u.i;
+ u.au.pDb->pSchema->file_format = (u8)pIn3->u.i;
}
if( pOp->p1==1 ){
/* Invalidate all prepared statements whenever the TEMP database
@@ -44524,34 +54836,35 @@ case OP_SetCookie: { /* in3 */
** invoked.
*/
case OP_VerifyCookie: {
+#if 0 /* local variables moved into u.av */
int iMeta;
Btree *pBt;
+#endif /* local variables moved into u.av */
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
- pBt = db->aDb[pOp->p1].pBt;
- if( pBt ){
- rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&iMeta);
+ u.av.pBt = db->aDb[pOp->p1].pBt;
+ if( u.av.pBt ){
+ sqlite3BtreeGetMeta(u.av.pBt, BTREE_SCHEMA_VERSION, (u32 *)&u.av.iMeta);
}else{
- rc = SQLITE_OK;
- iMeta = 0;
+ u.av.iMeta = 0;
}
- if( rc==SQLITE_OK && iMeta!=pOp->p2 ){
- sqlite3_free(p->zErrMsg);
+ if( u.av.iMeta!=pOp->p2 ){
+ sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
- /* If the schema-cookie from the database file matches the cookie
+ /* If the schema-cookie from the database file matches the cookie
** stored with the in-memory representation of the schema, do
** not reload the schema from the database file.
**
- ** If virtual-tables are in use, this is not just an optimisation.
+ ** If virtual-tables are in use, this is not just an optimization.
** Often, v-tables store their data in other SQLite tables, which
** are queried from within xNext() and other v-table methods using
** prepared queries. If such a query is out-of-date, we do not want to
** discard the database schema, as the user code implementing the
** v-table would have to be ready for the sqlite3_vtab structure itself
- ** to be invalidated whenever sqlite3_step() is called from within
+ ** to be invalidated whenever sqlite3_step() is called from within
** a v-table method.
*/
- if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){
+ if( db->aDb[pOp->p1].pSchema->schema_cookie!=u.av.iMeta ){
sqlite3ResetInternalSchema(db, pOp->p1);
}
@@ -44583,9 +54896,11 @@ case OP_VerifyCookie: {
** to get a read lock but fails, the script terminates with an
** SQLITE_BUSY error code.
**
-** The P4 value is a pointer to a KeyInfo structure that defines the
-** content and collating sequence of indices. P4 is NULL for cursors
-** that are not pointing to indices.
+** The P4 value may be either an integer (P4_INT32) or a pointer to
+** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
+** structure, then said structure defines the content and collating
+** sequence of the index being opened. Otherwise, if P4 is an integer
+** value, it is set to the number of columns in the table.
**
** See also OpenWrite.
*/
@@ -44595,9 +54910,12 @@ case OP_VerifyCookie: {
** page is P2. Or if P5!=0 use the content of register P2 to find the
** root page.
**
-** The P4 value is a pointer to a KeyInfo structure that defines the
-** content and collating sequence of indices. P4 is NULL for cursors
-** that are not pointing to indices.
+** The P4 value may be either an integer (P4_INT32) or a pointer to
+** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
+** structure, then said structure defines the content and collating
+** sequence of the index being opened. Otherwise, if P4 is an integer
+** value, it is set to the number of columns in the table, or to the
+** largest index of any column of the table that is actually used.
**
** This instruction works just like OpenRead except that it opens the cursor
** in read/write mode. For a given table, there can be one or more read-only
@@ -44607,90 +54925,79 @@ case OP_VerifyCookie: {
*/
case OP_OpenRead:
case OP_OpenWrite: {
- int i = pOp->p1;
- int p2 = pOp->p2;
- int iDb = pOp->p3;
+#if 0 /* local variables moved into u.aw */
+ int nField;
+ KeyInfo *pKeyInfo;
+ int p2;
+ int iDb;
int wrFlag;
Btree *pX;
- Cursor *pCur;
+ VdbeCursor *pCur;
Db *pDb;
-
- assert( iDb>=0 && iDb<db->nDb );
- assert( (p->btreeMask & (1<<iDb))!=0 );
- pDb = &db->aDb[iDb];
- pX = pDb->pBt;
- assert( pX!=0 );
+#endif /* local variables moved into u.aw */
+
+ u.aw.nField = 0;
+ u.aw.pKeyInfo = 0;
+ u.aw.p2 = pOp->p2;
+ u.aw.iDb = pOp->p3;
+ assert( u.aw.iDb>=0 && u.aw.iDb<db->nDb );
+ assert( (p->btreeMask & (1<<u.aw.iDb))!=0 );
+ u.aw.pDb = &db->aDb[u.aw.iDb];
+ u.aw.pX = u.aw.pDb->pBt;
+ assert( u.aw.pX!=0 );
if( pOp->opcode==OP_OpenWrite ){
- wrFlag = 1;
- if( pDb->pSchema->file_format < p->minWriteFileFormat ){
- p->minWriteFileFormat = pDb->pSchema->file_format;
+ u.aw.wrFlag = 1;
+ if( u.aw.pDb->pSchema->file_format < p->minWriteFileFormat ){
+ p->minWriteFileFormat = u.aw.pDb->pSchema->file_format;
}
}else{
- wrFlag = 0;
+ u.aw.wrFlag = 0;
}
if( pOp->p5 ){
- assert( p2>0 );
- assert( p2<=p->nMem );
- pIn2 = &p->aMem[p2];
+ assert( u.aw.p2>0 );
+ assert( u.aw.p2<=p->nMem );
+ pIn2 = &p->aMem[u.aw.p2];
sqlite3VdbeMemIntegerify(pIn2);
- p2 = pIn2->u.i;
- assert( p2>=2 );
- }
- assert( i>=0 );
- pCur = allocateCursor(p, i, &pOp[-1], iDb, 1);
- if( pCur==0 ) goto no_mem;
- pCur->nullRow = 1;
- rc = sqlite3BtreeCursor(pX, p2, wrFlag, pOp->p4.p, pCur->pCursor);
- if( pOp->p4type==P4_KEYINFO ){
- pCur->pKeyInfo = pOp->p4.pKeyInfo;
- pCur->pIncrKey = &pCur->pKeyInfo->incrKey;
- pCur->pKeyInfo->enc = ENC(p->db);
- }else{
- pCur->pKeyInfo = 0;
- pCur->pIncrKey = &pCur->bogusIncrKey;
- }
- switch( rc ){
- case SQLITE_BUSY: {
- p->pc = pc;
- p->rc = rc = SQLITE_BUSY;
- goto vdbe_return;
- }
- case SQLITE_OK: {
- int flags = sqlite3BtreeFlags(pCur->pCursor);
- /* Sanity checking. Only the lower four bits of the flags byte should
- ** be used. Bit 3 (mask 0x08) is unpreditable. The lower 3 bits
- ** (mask 0x07) should be either 5 (intkey+leafdata for tables) or
- ** 2 (zerodata for indices). If these conditions are not met it can
- ** only mean that we are dealing with a corrupt database file
- */
- if( (flags & 0xf0)!=0 || ((flags & 0x07)!=5 && (flags & 0x07)!=2) ){
- rc = SQLITE_CORRUPT_BKPT;
- goto abort_due_to_error;
- }
- pCur->isTable = (flags & BTREE_INTKEY)!=0;
- pCur->isIndex = (flags & BTREE_ZERODATA)!=0;
- /* If P4==0 it means we are expected to open a table. If P4!=0 then
- ** we expect to be opening an index. If this is not what happened,
- ** then the database is corrupt
- */
- if( (pCur->isTable && pOp->p4type==P4_KEYINFO)
- || (pCur->isIndex && pOp->p4type!=P4_KEYINFO) ){
- rc = SQLITE_CORRUPT_BKPT;
- goto abort_due_to_error;
- }
- break;
- }
- case SQLITE_EMPTY: {
- pCur->isTable = pOp->p4type!=P4_KEYINFO;
- pCur->isIndex = !pCur->isTable;
- pCur->pCursor = 0;
- rc = SQLITE_OK;
- break;
- }
- default: {
+ u.aw.p2 = (int)pIn2->u.i;
+ /* The u.aw.p2 value always comes from a prior OP_CreateTable opcode and
+ ** that opcode will always set the u.aw.p2 value to 2 or more or else fail.
+ ** If there were a failure, the prepared statement would have halted
+ ** before reaching this instruction. */
+ if( NEVER(u.aw.p2<2) ) {
+ rc = SQLITE_CORRUPT_BKPT;
goto abort_due_to_error;
}
}
+ if( pOp->p4type==P4_KEYINFO ){
+ u.aw.pKeyInfo = pOp->p4.pKeyInfo;
+ u.aw.pKeyInfo->enc = ENC(p->db);
+ u.aw.nField = u.aw.pKeyInfo->nField+1;
+ }else if( pOp->p4type==P4_INT32 ){
+ u.aw.nField = pOp->p4.i;
+ }
+ assert( pOp->p1>=0 );
+ u.aw.pCur = allocateCursor(p, pOp->p1, u.aw.nField, u.aw.iDb, 1);
+ if( u.aw.pCur==0 ) goto no_mem;
+ u.aw.pCur->nullRow = 1;
+ rc = sqlite3BtreeCursor(u.aw.pX, u.aw.p2, u.aw.wrFlag, u.aw.pKeyInfo, u.aw.pCur->pCursor);
+ u.aw.pCur->pKeyInfo = u.aw.pKeyInfo;
+
+ /* Since it performs no memory allocation or IO, the only values that
+ ** sqlite3BtreeCursor() may return are SQLITE_EMPTY and SQLITE_OK.
+ ** SQLITE_EMPTY is only returned when attempting to open the table
+ ** rooted at page 1 of a zero-byte database. */
+ assert( rc==SQLITE_EMPTY || rc==SQLITE_OK );
+ if( rc==SQLITE_EMPTY ){
+ u.aw.pCur->pCursor = 0;
+ rc = SQLITE_OK;
+ }
+
+ /* Set the VdbeCursor.isTable and isIndex variables. Previous versions of
+ ** SQLite used to check if the root-page flags were sane at this point
+ ** and report database corruption if they were not, but this check has
+ ** since moved into the btree layer. */
+ u.aw.pCur->isTable = pOp->p4type!=P4_KEYINFO;
+ u.aw.pCur->isIndex = !u.aw.pCur->isTable;
break;
}
@@ -44713,23 +55020,24 @@ case OP_OpenWrite: {
** that created confusion with the whole virtual-table idea.
*/
case OP_OpenEphemeral: {
- int i = pOp->p1;
- Cursor *pCx;
- static const int openFlags =
+#if 0 /* local variables moved into u.ax */
+ VdbeCursor *pCx;
+#endif /* local variables moved into u.ax */
+ static const int openFlags =
SQLITE_OPEN_READWRITE |
SQLITE_OPEN_CREATE |
SQLITE_OPEN_EXCLUSIVE |
SQLITE_OPEN_DELETEONCLOSE |
SQLITE_OPEN_TRANSIENT_DB;
- assert( i>=0 );
- pCx = allocateCursor(p, i, pOp, -1, 1);
- if( pCx==0 ) goto no_mem;
- pCx->nullRow = 1;
+ assert( pOp->p1>=0 );
+ u.ax.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
+ if( u.ax.pCx==0 ) goto no_mem;
+ u.ax.pCx->nullRow = 1;
rc = sqlite3BtreeFactory(db, 0, 1, SQLITE_DEFAULT_TEMP_CACHE_SIZE, openFlags,
- &pCx->pBt);
+ &u.ax.pCx->pBt);
if( rc==SQLITE_OK ){
- rc = sqlite3BtreeBeginTrans(pCx->pBt, 1);
+ rc = sqlite3BtreeBeginTrans(u.ax.pCx->pBt, 1);
}
if( rc==SQLITE_OK ){
/* If a transient index is required, create it by calling
@@ -44740,58 +55048,51 @@ case OP_OpenEphemeral: {
if( pOp->p4.pKeyInfo ){
int pgno;
assert( pOp->p4type==P4_KEYINFO );
- rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_ZERODATA);
+ rc = sqlite3BtreeCreateTable(u.ax.pCx->pBt, &pgno, BTREE_ZERODATA);
if( rc==SQLITE_OK ){
assert( pgno==MASTER_ROOT+1 );
- rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1,
- (KeyInfo*)pOp->p4.z, pCx->pCursor);
- pCx->pKeyInfo = pOp->p4.pKeyInfo;
- pCx->pKeyInfo->enc = ENC(p->db);
- pCx->pIncrKey = &pCx->pKeyInfo->incrKey;
+ rc = sqlite3BtreeCursor(u.ax.pCx->pBt, pgno, 1,
+ (KeyInfo*)pOp->p4.z, u.ax.pCx->pCursor);
+ u.ax.pCx->pKeyInfo = pOp->p4.pKeyInfo;
+ u.ax.pCx->pKeyInfo->enc = ENC(p->db);
}
- pCx->isTable = 0;
+ u.ax.pCx->isTable = 0;
}else{
- rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor);
- pCx->isTable = 1;
- pCx->pIncrKey = &pCx->bogusIncrKey;
+ rc = sqlite3BtreeCursor(u.ax.pCx->pBt, MASTER_ROOT, 1, 0, u.ax.pCx->pCursor);
+ u.ax.pCx->isTable = 1;
}
}
- pCx->isIndex = !pCx->isTable;
+ u.ax.pCx->isIndex = !u.ax.pCx->isTable;
break;
}
-/* Opcode: OpenPseudo P1 P2 * * *
+/* Opcode: OpenPseudo P1 P2 P3 * *
**
** Open a new cursor that points to a fake table that contains a single
-** row of data. Any attempt to write a second row of data causes the
-** first row to be deleted. All data is deleted when the cursor is
-** closed.
+** row of data. The content of that one row in the content of memory
+** register P2. In other words, cursor P1 becomes an alias for the
+** MEM_Blob content contained in register P2.
**
-** A pseudo-table created by this opcode is useful for holding the
-** NEW or OLD tables in a trigger. Also used to hold the a single
+** A pseudo-table created by this opcode is used to hold the a single
** row output from the sorter so that the row can be decomposed into
-** individual columns using the OP_Column opcode.
+** individual columns using the OP_Column opcode. The OP_Column opcode
+** is the only cursor opcode that works with a pseudo-table.
**
-** When OP_Insert is executed to insert a row in to the pseudo table,
-** the pseudo-table cursor may or may not make it's own copy of the
-** original row data. If P2 is 0, then the pseudo-table will copy the
-** original row data. Otherwise, a pointer to the original memory cell
-** is stored. In this case, the vdbe program must ensure that the
-** memory cell containing the row data is not overwritten until the
-** pseudo table is closed (or a new row is inserted into it).
+** P3 is the number of fields in the records that will be stored by
+** the pseudo-table.
*/
case OP_OpenPseudo: {
- int i = pOp->p1;
- Cursor *pCx;
- assert( i>=0 );
- pCx = allocateCursor(p, i, &pOp[-1], -1, 0);
- if( pCx==0 ) goto no_mem;
- pCx->nullRow = 1;
- pCx->pseudoTable = 1;
- pCx->ephemPseudoTable = pOp->p2;
- pCx->pIncrKey = &pCx->bogusIncrKey;
- pCx->isTable = 1;
- pCx->isIndex = 0;
+#if 0 /* local variables moved into u.ay */
+ VdbeCursor *pCx;
+#endif /* local variables moved into u.ay */
+
+ assert( pOp->p1>=0 );
+ u.ay.pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0);
+ if( u.ay.pCx==0 ) goto no_mem;
+ u.ay.pCx->nullRow = 1;
+ u.ay.pCx->pseudoTableReg = pOp->p2;
+ u.ay.pCx->isTable = 1;
+ u.ay.pCx->isIndex = 0;
break;
}
@@ -44801,17 +55102,16 @@ case OP_OpenPseudo: {
** currently open, this instruction is a no-op.
*/
case OP_Close: {
- int i = pOp->p1;
- assert( i>=0 && i<p->nCursor );
- sqlite3VdbeFreeCursor(p, p->apCsr[i]);
- p->apCsr[i] = 0;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
+ p->apCsr[pOp->p1] = 0;
break;
}
-/* Opcode: MoveGe P1 P2 P3 P4 *
+/* Opcode: SeekGe P1 P2 P3 P4 *
**
** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
-** use the integer value in register P3 as a key. If cursor P1 refers
+** use the value in register P3 as the key. If cursor P1 refers
** to an SQL index, then P3 is the first in an array of P4 registers
** that are used as an unpacked index key.
**
@@ -44819,19 +55119,12 @@ case OP_Close: {
** is greater than or equal to the key value. If there are no records
** greater than or equal to the key and P2 is not zero, then jump to P2.
**
-** A special feature of this opcode (and different from the
-** related OP_MoveGt, OP_MoveLt, and OP_MoveLe) is that if P2 is
-** zero and P1 is an SQL table (a b-tree with integer keys) then
-** the seek is deferred until it is actually needed. It might be
-** the case that the cursor is never accessed. By deferring the
-** seek, we avoid unnecessary seeks.
-**
-** See also: Found, NotFound, Distinct, MoveLt, MoveGt, MoveLe
+** See also: Found, NotFound, Distinct, SeekLt, SeekGt, SeekLe
*/
-/* Opcode: MoveGt P1 P2 P3 P4 *
+/* Opcode: SeekGt P1 P2 P3 P4 *
**
** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
-** use the integer value in register P3 as a key. If cursor P1 refers
+** use the value in register P3 as a key. If cursor P1 refers
** to an SQL index, then P3 is the first in an array of P4 registers
** that are used as an unpacked index key.
**
@@ -44839,12 +55132,12 @@ case OP_Close: {
** is greater than the key value. If there are no records greater than
** the key and P2 is not zero, then jump to P2.
**
-** See also: Found, NotFound, Distinct, MoveLt, MoveGe, MoveLe
+** See also: Found, NotFound, Distinct, SeekLt, SeekGe, SeekLe
*/
-/* Opcode: MoveLt P1 P2 P3 P4 *
+/* Opcode: SeekLt P1 P2 P3 P4 *
**
** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
-** use the integer value in register P3 as a key. If cursor P1 refers
+** use the value in register P3 as a key. If cursor P1 refers
** to an SQL index, then P3 is the first in an array of P4 registers
** that are used as an unpacked index key.
**
@@ -44852,12 +55145,12 @@ case OP_Close: {
** is less than the key value. If there are no records less than
** the key and P2 is not zero, then jump to P2.
**
-** See also: Found, NotFound, Distinct, MoveGt, MoveGe, MoveLe
+** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLe
*/
-/* Opcode: MoveLe P1 P2 P3 P4 *
+/* Opcode: SeekLe P1 P2 P3 P4 *
**
** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
-** use the integer value in register P3 as a key. If cursor P1 refers
+** use the value in register P3 as a key. If cursor P1 refers
** to an SQL index, then P3 is the first in an array of P4 registers
** that are used as an unpacked index key.
**
@@ -44865,89 +55158,172 @@ case OP_Close: {
** is less than or equal to the key value. If there are no records
** less than or equal to the key and P2 is not zero, then jump to P2.
**
-** See also: Found, NotFound, Distinct, MoveGt, MoveGe, MoveLt
-*/
-case OP_MoveLt: /* jump, in3 */
-case OP_MoveLe: /* jump, in3 */
-case OP_MoveGe: /* jump, in3 */
-case OP_MoveGt: { /* jump, in3 */
- int i = pOp->p1;
- Cursor *pC;
-
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- if( pC->pCursor!=0 ){
- int res, oc;
- oc = pOp->opcode;
- pC->nullRow = 0;
- *pC->pIncrKey = oc==OP_MoveGt || oc==OP_MoveLe;
- if( pC->isTable ){
- i64 iKey = sqlite3VdbeIntValue(pIn3);
- if( pOp->p2==0 ){
- assert( pOp->opcode==OP_MoveGe );
- pC->movetoTarget = iKey;
- pC->rowidIsValid = 0;
- pC->deferredMoveto = 1;
- break;
+** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLt
+*/
+case OP_SeekLt: /* jump, in3 */
+case OP_SeekLe: /* jump, in3 */
+case OP_SeekGe: /* jump, in3 */
+case OP_SeekGt: { /* jump, in3 */
+#if 0 /* local variables moved into u.az */
+ int res;
+ int oc;
+ VdbeCursor *pC;
+ UnpackedRecord r;
+ int nField;
+ i64 iKey; /* The rowid we are to seek to */
+#endif /* local variables moved into u.az */
+
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ assert( pOp->p2!=0 );
+ u.az.pC = p->apCsr[pOp->p1];
+ assert( u.az.pC!=0 );
+ assert( u.az.pC->pseudoTableReg==0 );
+ if( u.az.pC->pCursor!=0 ){
+ u.az.oc = pOp->opcode;
+ u.az.pC->nullRow = 0;
+ if( u.az.pC->isTable ){
+ /* The input value in P3 might be of any type: integer, real, string,
+ ** blob, or NULL. But it needs to be an integer before we can do
+ ** the seek, so covert it. */
+ applyNumericAffinity(pIn3);
+ u.az.iKey = sqlite3VdbeIntValue(pIn3);
+ u.az.pC->rowidIsValid = 0;
+
+ /* If the P3 value could not be converted into an integer without
+ ** loss of information, then special processing is required... */
+ if( (pIn3->flags & MEM_Int)==0 ){
+ if( (pIn3->flags & MEM_Real)==0 ){
+ /* If the P3 value cannot be converted into any kind of a number,
+ ** then the seek is not possible, so jump to P2 */
+ pc = pOp->p2 - 1;
+ break;
+ }
+ /* If we reach this point, then the P3 value must be a floating
+ ** point number. */
+ assert( (pIn3->flags & MEM_Real)!=0 );
+
+ if( u.az.iKey==SMALLEST_INT64 && (pIn3->r<(double)u.az.iKey || pIn3->r>0) ){
+ /* The P3 value is too large in magnitude to be expressed as an
+ ** integer. */
+ u.az.res = 1;
+ if( pIn3->r<0 ){
+ if( u.az.oc==OP_SeekGt || u.az.oc==OP_SeekGe ){
+ rc = sqlite3BtreeFirst(u.az.pC->pCursor, &u.az.res);
+ if( rc!=SQLITE_OK ) goto abort_due_to_error;
+ }
+ }else{
+ if( u.az.oc==OP_SeekLt || u.az.oc==OP_SeekLe ){
+ rc = sqlite3BtreeLast(u.az.pC->pCursor, &u.az.res);
+ if( rc!=SQLITE_OK ) goto abort_due_to_error;
+ }
+ }
+ if( u.az.res ){
+ pc = pOp->p2 - 1;
+ }
+ break;
+ }else if( u.az.oc==OP_SeekLt || u.az.oc==OP_SeekGe ){
+ /* Use the ceiling() function to convert real->int */
+ if( pIn3->r > (double)u.az.iKey ) u.az.iKey++;
+ }else{
+ /* Use the floor() function to convert real->int */
+ assert( u.az.oc==OP_SeekLe || u.az.oc==OP_SeekGt );
+ if( pIn3->r < (double)u.az.iKey ) u.az.iKey--;
+ }
}
- rc = sqlite3BtreeMoveto(pC->pCursor, 0, 0, (u64)iKey, 0, &res);
+ rc = sqlite3BtreeMovetoUnpacked(u.az.pC->pCursor, 0, (u64)u.az.iKey, 0, &u.az.res);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
- pC->lastRowid = iKey;
- pC->rowidIsValid = res==0;
+ if( u.az.res==0 ){
+ u.az.pC->rowidIsValid = 1;
+ u.az.pC->lastRowid = u.az.iKey;
+ }
}else{
- UnpackedRecord r;
- int nField = pOp->p4.i;
+ u.az.nField = pOp->p4.i;
assert( pOp->p4type==P4_INT32 );
- assert( nField>0 );
- r.pKeyInfo = pC->pKeyInfo;
- r.nField = nField;
- r.needFree = 0;
- r.needDestroy = 0;
- r.aMem = &p->aMem[pOp->p3];
- rc = sqlite3BtreeMoveto(pC->pCursor, 0, &r, 0, 0, &res);
+ assert( u.az.nField>0 );
+ u.az.r.pKeyInfo = u.az.pC->pKeyInfo;
+ u.az.r.nField = (u16)u.az.nField;
+ if( u.az.oc==OP_SeekGt || u.az.oc==OP_SeekLe ){
+ u.az.r.flags = UNPACKED_INCRKEY;
+ }else{
+ u.az.r.flags = 0;
+ }
+ u.az.r.aMem = &p->aMem[pOp->p3];
+ rc = sqlite3BtreeMovetoUnpacked(u.az.pC->pCursor, &u.az.r, 0, 0, &u.az.res);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
- pC->rowidIsValid = 0;
+ u.az.pC->rowidIsValid = 0;
}
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
- *pC->pIncrKey = 0;
+ u.az.pC->deferredMoveto = 0;
+ u.az.pC->cacheStatus = CACHE_STALE;
#ifdef SQLITE_TEST
sqlite3_search_count++;
#endif
- if( oc==OP_MoveGe || oc==OP_MoveGt ){
- if( res<0 ){
- rc = sqlite3BtreeNext(pC->pCursor, &res);
+ if( u.az.oc==OP_SeekGe || u.az.oc==OP_SeekGt ){
+ if( u.az.res<0 || (u.az.res==0 && u.az.oc==OP_SeekGt) ){
+ rc = sqlite3BtreeNext(u.az.pC->pCursor, &u.az.res);
if( rc!=SQLITE_OK ) goto abort_due_to_error;
- pC->rowidIsValid = 0;
+ u.az.pC->rowidIsValid = 0;
}else{
- res = 0;
+ u.az.res = 0;
}
}else{
- assert( oc==OP_MoveLt || oc==OP_MoveLe );
- if( res>=0 ){
- rc = sqlite3BtreePrevious(pC->pCursor, &res);
+ assert( u.az.oc==OP_SeekLt || u.az.oc==OP_SeekLe );
+ if( u.az.res>0 || (u.az.res==0 && u.az.oc==OP_SeekLt) ){
+ rc = sqlite3BtreePrevious(u.az.pC->pCursor, &u.az.res);
if( rc!=SQLITE_OK ) goto abort_due_to_error;
- pC->rowidIsValid = 0;
+ u.az.pC->rowidIsValid = 0;
}else{
- /* res might be negative because the table is empty. Check to
+ /* u.az.res might be negative because the table is empty. Check to
** see if this is the case.
*/
- res = sqlite3BtreeEof(pC->pCursor);
+ u.az.res = sqlite3BtreeEof(u.az.pC->pCursor);
}
}
assert( pOp->p2>0 );
- if( res ){
+ if( u.az.res ){
pc = pOp->p2 - 1;
}
+ }else{
+ /* This happens when attempting to open the sqlite3_master table
+ ** for read access returns SQLITE_EMPTY. In this case always
+ ** take the jump (since there are no records in the table).
+ */
+ pc = pOp->p2 - 1;
}
break;
}
+/* Opcode: Seek P1 P2 * * *
+**
+** P1 is an open table cursor and P2 is a rowid integer. Arrange
+** for P1 to move so that it points to the rowid given by P2.
+**
+** This is actually a deferred seek. Nothing actually happens until
+** the cursor is used to read a record. That way, if no reads
+** occur, no unnecessary I/O happens.
+*/
+case OP_Seek: { /* in2 */
+#if 0 /* local variables moved into u.ba */
+ VdbeCursor *pC;
+#endif /* local variables moved into u.ba */
+
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.ba.pC = p->apCsr[pOp->p1];
+ assert( u.ba.pC!=0 );
+ if( ALWAYS(u.ba.pC->pCursor!=0) ){
+ assert( u.ba.pC->isTable );
+ u.ba.pC->nullRow = 0;
+ u.ba.pC->movetoTarget = sqlite3VdbeIntValue(pIn2);
+ u.ba.pC->rowidIsValid = 0;
+ u.ba.pC->deferredMoveto = 1;
+ }
+ break;
+}
+
+
/* Opcode: Found P1 P2 P3 * *
**
** Register P3 holds a blob constructed by MakeRecord. P1 is an index.
@@ -44963,11 +55339,11 @@ case OP_MoveGt: { /* jump, in3 */
** DISTINCT keyword in SELECT statements.
**
** This instruction checks if index P1 contains a record for which
-** the first N serialised values exactly match the N serialised values
+** the first N serialized values exactly match the N serialized values
** in the record in register P3, where N is the total number of values in
** the P3 record (the P3 record is a prefix of the P1 record).
**
-** See also: NotFound, MoveTo, IsUnique, NotExists
+** See also: NotFound, IsUnique, NotExists
*/
/* Opcode: NotFound P1 P2 P3 * *
**
@@ -44976,137 +55352,136 @@ case OP_MoveGt: { /* jump, in3 */
** to P2. If an entry does existing, fall through. The cursor is left
** pointing to the entry that matches.
**
-** See also: Found, MoveTo, NotExists, IsUnique
+** See also: Found, NotExists, IsUnique
*/
case OP_NotFound: /* jump, in3 */
case OP_Found: { /* jump, in3 */
- int i = pOp->p1;
- int alreadyExists = 0;
- Cursor *pC;
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pC = p->apCsr[i])->pCursor!=0 ){
- int res;
- assert( pC->isTable==0 );
+#if 0 /* local variables moved into u.bb */
+ int alreadyExists;
+ VdbeCursor *pC;
+ int res;
+ UnpackedRecord *pIdxKey;
+ char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
+#endif /* local variables moved into u.bb */
+
+#ifdef SQLITE_TEST
+ sqlite3_found_count++;
+#endif
+
+ u.bb.alreadyExists = 0;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bb.pC = p->apCsr[pOp->p1];
+ assert( u.bb.pC!=0 );
+ if( ALWAYS(u.bb.pC->pCursor!=0) ){
+
+ assert( u.bb.pC->isTable==0 );
assert( pIn3->flags & MEM_Blob );
+ ExpandBlob(pIn3);
+ u.bb.pIdxKey = sqlite3VdbeRecordUnpack(u.bb.pC->pKeyInfo, pIn3->n, pIn3->z,
+ u.bb.aTempRec, sizeof(u.bb.aTempRec));
+ if( u.bb.pIdxKey==0 ){
+ goto no_mem;
+ }
if( pOp->opcode==OP_Found ){
- pC->pKeyInfo->prefixIsEqual = 1;
+ u.bb.pIdxKey->flags |= UNPACKED_PREFIX_MATCH;
}
- rc = sqlite3BtreeMoveto(pC->pCursor, pIn3->z, 0, pIn3->n, 0, &res);
- pC->pKeyInfo->prefixIsEqual = 0;
+ rc = sqlite3BtreeMovetoUnpacked(u.bb.pC->pCursor, u.bb.pIdxKey, 0, 0, &u.bb.res);
+ sqlite3VdbeDeleteUnpackedRecord(u.bb.pIdxKey);
if( rc!=SQLITE_OK ){
break;
}
- alreadyExists = (res==0);
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
+ u.bb.alreadyExists = (u.bb.res==0);
+ u.bb.pC->deferredMoveto = 0;
+ u.bb.pC->cacheStatus = CACHE_STALE;
}
if( pOp->opcode==OP_Found ){
- if( alreadyExists ) pc = pOp->p2 - 1;
+ if( u.bb.alreadyExists ) pc = pOp->p2 - 1;
}else{
- if( !alreadyExists ) pc = pOp->p2 - 1;
+ if( !u.bb.alreadyExists ) pc = pOp->p2 - 1;
}
break;
}
/* Opcode: IsUnique P1 P2 P3 P4 *
**
-** The P3 register contains an integer record number. Call this
-** record number R. The P4 register contains an index key created
-** using MakeIdxRec. Call it K.
-**
-** P1 is an index. So it has no data and its key consists of a
-** record generated by OP_MakeRecord where the last field is the
+** Cursor P1 is open on an index. So it has no data and its key consists
+** of a record generated by OP_MakeRecord where the last field is the
** rowid of the entry that the index refers to.
-**
-** This instruction asks if there is an entry in P1 where the
-** fields matches K but the rowid is different from R.
-** If there is no such entry, then there is an immediate
-** jump to P2. If any entry does exist where the index string
-** matches K but the record number is not R, then the record
-** number for that entry is written into P3 and control
-** falls through to the next instruction.
+**
+** The P3 register contains an integer record number. Call this record
+** number R. Register P4 is the first in a set of N contiguous registers
+** that make up an unpacked index key that can be used with cursor P1.
+** The value of N can be inferred from the cursor. N includes the rowid
+** value appended to the end of the index record. This rowid value may
+** or may not be the same as R.
+**
+** If any of the N registers beginning with register P4 contains a NULL
+** value, jump immediately to P2.
+**
+** Otherwise, this instruction checks if cursor P1 contains an entry
+** where the first (N-1) fields match but the rowid value at the end
+** of the index entry is not R. If there is no such entry, control jumps
+** to instruction P2. Otherwise, the rowid of the conflicting index
+** entry is copied to register P3 and control falls through to the next
+** instruction.
**
** See also: NotFound, NotExists, Found
*/
case OP_IsUnique: { /* jump, in3 */
- int i = pOp->p1;
- Cursor *pCx;
+#if 0 /* local variables moved into u.bc */
+ u16 ii;
+ VdbeCursor *pCx;
BtCursor *pCrsr;
- Mem *pK;
- i64 R;
-
- /* Pop the value R off the top of the stack
- */
+ u16 nField;
+ Mem *aMem;
+ UnpackedRecord r; /* B-Tree index search key */
+ i64 R; /* Rowid stored in register P3 */
+#endif /* local variables moved into u.bc */
+
+ u.bc.aMem = &p->aMem[pOp->p4.i];
+ /* Assert that the values of parameters P1 and P4 are in range. */
assert( pOp->p4type==P4_INT32 );
assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem );
- pK = &p->aMem[pOp->p4.i];
- sqlite3VdbeMemIntegerify(pIn3);
- R = pIn3->u.i;
- assert( i>=0 && i<p->nCursor );
- pCx = p->apCsr[i];
- assert( pCx!=0 );
- pCrsr = pCx->pCursor;
- if( pCrsr!=0 ){
- int res;
- i64 v; /* The record number on the P1 entry that matches K */
- char *zKey; /* The value of K */
- int nKey; /* Number of bytes in K */
- int len; /* Number of bytes in K without the rowid at the end */
- int szRowid; /* Size of the rowid column at the end of zKey */
-
- /* Make sure K is a string and make zKey point to K
- */
- assert( pK->flags & MEM_Blob );
- zKey = pK->z;
- nKey = pK->n;
-
- szRowid = sqlite3VdbeIdxRowidLen((u8*)zKey);
- len = nKey-szRowid;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- /* Search for an entry in P1 where all but the last four bytes match K.
- ** If there is no such entry, jump immediately to P2.
- */
- assert( pCx->deferredMoveto==0 );
- pCx->cacheStatus = CACHE_STALE;
- rc = sqlite3BtreeMoveto(pCrsr, zKey, 0, len, 0, &res);
- if( rc!=SQLITE_OK ){
- goto abort_due_to_error;
- }
- if( res<0 ){
- rc = sqlite3BtreeNext(pCrsr, &res);
- if( res ){
- pc = pOp->p2 - 1;
- break;
- }
- }
- rc = sqlite3VdbeIdxKeyCompare(pCx, 0, len, (u8*)zKey, &res);
- if( rc!=SQLITE_OK ) goto abort_due_to_error;
- if( res>0 ){
+ /* Find the index cursor. */
+ u.bc.pCx = p->apCsr[pOp->p1];
+ assert( u.bc.pCx->deferredMoveto==0 );
+ u.bc.pCx->seekResult = 0;
+ u.bc.pCx->cacheStatus = CACHE_STALE;
+ u.bc.pCrsr = u.bc.pCx->pCursor;
+
+ /* If any of the values are NULL, take the jump. */
+ u.bc.nField = u.bc.pCx->pKeyInfo->nField;
+ for(u.bc.ii=0; u.bc.ii<u.bc.nField; u.bc.ii++){
+ if( u.bc.aMem[u.bc.ii].flags & MEM_Null ){
pc = pOp->p2 - 1;
+ u.bc.pCrsr = 0;
break;
}
+ }
+ assert( (u.bc.aMem[u.bc.nField].flags & MEM_Null)==0 );
- /* At this point, pCrsr is pointing to an entry in P1 where all but
- ** the final entry (the rowid) matches K. Check to see if the
- ** final rowid column is different from R. If it equals R then jump
- ** immediately to P2.
- */
- rc = sqlite3VdbeIdxRowid(pCrsr, &v);
- if( rc!=SQLITE_OK ){
- goto abort_due_to_error;
- }
- if( v==R ){
+ if( u.bc.pCrsr!=0 ){
+ /* Populate the index search key. */
+ u.bc.r.pKeyInfo = u.bc.pCx->pKeyInfo;
+ u.bc.r.nField = u.bc.nField + 1;
+ u.bc.r.flags = UNPACKED_PREFIX_SEARCH;
+ u.bc.r.aMem = u.bc.aMem;
+
+ /* Extract the value of u.bc.R from register P3. */
+ sqlite3VdbeMemIntegerify(pIn3);
+ u.bc.R = pIn3->u.i;
+
+ /* Search the B-Tree index. If no conflicting record is found, jump
+ ** to P2. Otherwise, copy the rowid of the conflicting record to
+ ** register P3 and fall through to the next instruction. */
+ rc = sqlite3BtreeMovetoUnpacked(u.bc.pCrsr, &u.bc.r, 0, 0, &u.bc.pCx->seekResult);
+ if( (u.bc.r.flags & UNPACKED_PREFIX_SEARCH) || u.bc.r.rowid==u.bc.R ){
pc = pOp->p2 - 1;
- break;
+ }else{
+ pIn3->u.i = u.bc.r.rowid;
}
-
- /* The final varint of the key is different from R. Store it back
- ** into register R3. (The record number of an entry that violates
- ** a UNIQUE constraint.)
- */
- pIn3->u.i = v;
- assert( pIn3->flags&MEM_Int );
}
break;
}
@@ -45123,34 +55498,44 @@ case OP_IsUnique: { /* jump, in3 */
** NotFound assumes key is a blob constructed from MakeRecord and
** P1 is an index.
**
-** See also: Found, MoveTo, NotFound, IsUnique
+** See also: Found, NotFound, IsUnique
*/
case OP_NotExists: { /* jump, in3 */
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bd */
+ VdbeCursor *pC;
BtCursor *pCrsr;
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
- int res;
- u64 iKey;
- assert( pIn3->flags & MEM_Int );
- assert( p->apCsr[i]->isTable );
- iKey = intToKey(pIn3->u.i);
- rc = sqlite3BtreeMoveto(pCrsr, 0, 0, iKey, 0,&res);
- pC->lastRowid = pIn3->u.i;
- pC->rowidIsValid = res==0;
- pC->nullRow = 0;
- pC->cacheStatus = CACHE_STALE;
- /* res might be uninitialized if rc!=SQLITE_OK. But if rc!=SQLITE_OK
- ** processing is about to abort so we really do not care whether or not
- ** the following jump is taken. (In other words, do not stress over
- ** the error that valgrind sometimes shows on the next statement when
- ** running ioerr.test and similar failure-recovery test scripts.) */
- if( res!=0 ){
+ int res;
+ u64 iKey;
+#endif /* local variables moved into u.bd */
+
+ assert( pIn3->flags & MEM_Int );
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bd.pC = p->apCsr[pOp->p1];
+ assert( u.bd.pC!=0 );
+ assert( u.bd.pC->isTable );
+ assert( u.bd.pC->pseudoTableReg==0 );
+ u.bd.pCrsr = u.bd.pC->pCursor;
+ if( u.bd.pCrsr!=0 ){
+ u.bd.res = 0;
+ u.bd.iKey = pIn3->u.i;
+ rc = sqlite3BtreeMovetoUnpacked(u.bd.pCrsr, 0, u.bd.iKey, 0, &u.bd.res);
+ u.bd.pC->lastRowid = pIn3->u.i;
+ u.bd.pC->rowidIsValid = u.bd.res==0 ?1:0;
+ u.bd.pC->nullRow = 0;
+ u.bd.pC->cacheStatus = CACHE_STALE;
+ u.bd.pC->deferredMoveto = 0;
+ if( u.bd.res!=0 ){
pc = pOp->p2 - 1;
- assert( pC->rowidIsValid==0 );
+ assert( u.bd.pC->rowidIsValid==0 );
}
+ u.bd.pC->seekResult = u.bd.res;
+ }else{
+ /* This happens when an attempt to open a read cursor on the
+ ** sqlite_master table returns SQLITE_EMPTY.
+ */
+ pc = pOp->p2 - 1;
+ assert( u.bd.pC->rowidIsValid==0 );
+ u.bd.pC->seekResult = 0;
}
break;
}
@@ -45163,10 +55548,9 @@ case OP_NotExists: { /* jump, in3 */
** instruction.
*/
case OP_Sequence: { /* out2-prerelease */
- int i = pOp->p1;
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- pOut->u.i = p->apCsr[i]->seqCount++;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ assert( p->apCsr[pOp->p1]!=0 );
+ pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
MemSetTypeFlag(pOut, MEM_Int);
break;
}
@@ -45179,20 +55563,29 @@ case OP_Sequence: { /* out2-prerelease */
** table that cursor P1 points to. The new record number is written
** written to register P2.
**
-** If P3>0 then P3 is a register that holds the largest previously
-** generated record number. No new record numbers are allowed to be less
-** than this value. When this value reaches its maximum, a SQLITE_FULL
-** error is generated. The P3 register is updated with the generated
-** record number. This P3 mechanism is used to help implement the
+** If P3>0 then P3 is a register in the root frame of this VDBE that holds
+** the largest previously generated record number. No new record numbers are
+** allowed to be less than this value. When this value reaches its maximum,
+** a SQLITE_FULL error is generated. The P3 register is updated with the '
+** generated record number. This P3 mechanism is used to help implement the
** AUTOINCREMENT feature.
*/
case OP_NewRowid: { /* out2-prerelease */
- int i = pOp->p1;
- i64 v = 0;
- Cursor *pC;
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pC = p->apCsr[i])->pCursor==0 ){
+#if 0 /* local variables moved into u.be */
+ i64 v; /* The new rowid */
+ VdbeCursor *pC; /* Cursor of table to get the new rowid */
+ int res; /* Result of an sqlite3BtreeLast() */
+ int cnt; /* Counter to limit the number of searches */
+ Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */
+ VdbeFrame *pFrame; /* Root frame of VDBE */
+#endif /* local variables moved into u.be */
+
+ u.be.v = 0;
+ u.be.res = 0;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.be.pC = p->apCsr[pOp->p1];
+ assert( u.be.pC!=0 );
+ if( NEVER(u.be.pC->pCursor==0) ){
/* The zero initialization above is all that is needed */
}else{
/* The next rowid or record number (different terms for the same
@@ -45206,36 +55599,10 @@ case OP_NewRowid: { /* out2-prerelease */
** The second algorithm is to select a rowid at random and see if
** it already exists in the table. If it does not exist, we have
** succeeded. If the random rowid does exist, we select a new one
- ** and try again, up to 1000 times.
- **
- ** For a table with less than 2 billion entries, the probability
- ** of not finding a unused rowid is about 1.0e-300. This is a
- ** non-zero probability, but it is still vanishingly small and should
- ** never cause a problem. You are much, much more likely to have a
- ** hardware failure than for this algorithm to fail.
- **
- ** The analysis in the previous paragraph assumes that you have a good
- ** source of random numbers. Is a library function like lrand48()
- ** good enough? Maybe. Maybe not. It's hard to know whether there
- ** might be subtle bugs is some implementations of lrand48() that
- ** could cause problems. To avoid uncertainty, SQLite uses its own
- ** random number generator based on the RC4 algorithm.
- **
- ** To promote locality of reference for repetitive inserts, the
- ** first few attempts at chosing a random rowid pick values just a little
- ** larger than the previous rowid. This has been shown experimentally
- ** to double the speed of the COPY operation.
+ ** and try again, up to 100 times.
*/
- int res, rx=SQLITE_OK, cnt;
- i64 x;
- cnt = 0;
- if( (sqlite3BtreeFlags(pC->pCursor)&(BTREE_INTKEY|BTREE_ZERODATA)) !=
- BTREE_INTKEY ){
- rc = SQLITE_CORRUPT_BKPT;
- goto abort_due_to_error;
- }
- assert( (sqlite3BtreeFlags(pC->pCursor) & BTREE_INTKEY)!=0 );
- assert( (sqlite3BtreeFlags(pC->pCursor) & BTREE_ZERODATA)==0 );
+ assert( u.be.pC->isTable );
+ u.be.cnt = 0;
#ifdef SQLITE_32BIT_ROWID
# define MAX_ROWID 0x7fffffff
@@ -45244,84 +55611,87 @@ case OP_NewRowid: { /* out2-prerelease */
** Others complain about 0x7ffffffffffffffffLL. The following macro seems
** to provide the constant while making all compilers happy.
*/
-# define MAX_ROWID ( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
+# define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
#endif
- if( !pC->useRandomRowid ){
- if( pC->nextRowidValid ){
- v = pC->nextRowid;
- }else{
- rc = sqlite3BtreeLast(pC->pCursor, &res);
+ if( !u.be.pC->useRandomRowid ){
+ u.be.v = sqlite3BtreeGetCachedRowid(u.be.pC->pCursor);
+ if( u.be.v==0 ){
+ rc = sqlite3BtreeLast(u.be.pC->pCursor, &u.be.res);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
- if( res ){
- v = 1;
+ if( u.be.res ){
+ u.be.v = 1;
}else{
- sqlite3BtreeKeySize(pC->pCursor, &v);
- v = keyToInt(v);
- if( v==MAX_ROWID ){
- pC->useRandomRowid = 1;
+ assert( sqlite3BtreeCursorIsValid(u.be.pC->pCursor) );
+ rc = sqlite3BtreeKeySize(u.be.pC->pCursor, &u.be.v);
+ assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */
+ if( u.be.v==MAX_ROWID ){
+ u.be.pC->useRandomRowid = 1;
}else{
- v++;
+ u.be.v++;
}
}
}
#ifndef SQLITE_OMIT_AUTOINCREMENT
if( pOp->p3 ){
- Mem *pMem;
- assert( pOp->p3>0 && pOp->p3<=p->nMem ); /* P3 is a valid memory cell */
- pMem = &p->aMem[pOp->p3];
- REGISTER_TRACE(pOp->p3, pMem);
- sqlite3VdbeMemIntegerify(pMem);
- assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */
- if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){
+ /* Assert that P3 is a valid memory cell. */
+ assert( pOp->p3>0 );
+ if( p->pFrame ){
+ for(u.be.pFrame=p->pFrame; u.be.pFrame->pParent; u.be.pFrame=u.be.pFrame->pParent);
+ /* Assert that P3 is a valid memory cell. */
+ assert( pOp->p3<=u.be.pFrame->nMem );
+ u.be.pMem = &u.be.pFrame->aMem[pOp->p3];
+ }else{
+ /* Assert that P3 is a valid memory cell. */
+ assert( pOp->p3<=p->nMem );
+ u.be.pMem = &p->aMem[pOp->p3];
+ }
+
+ REGISTER_TRACE(pOp->p3, u.be.pMem);
+ sqlite3VdbeMemIntegerify(u.be.pMem);
+ assert( (u.be.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */
+ if( u.be.pMem->u.i==MAX_ROWID || u.be.pC->useRandomRowid ){
rc = SQLITE_FULL;
goto abort_due_to_error;
}
- if( v<pMem->u.i+1 ){
- v = pMem->u.i + 1;
+ if( u.be.v<u.be.pMem->u.i+1 ){
+ u.be.v = u.be.pMem->u.i + 1;
}
- pMem->u.i = v;
+ u.be.pMem->u.i = u.be.v;
}
#endif
- if( v<MAX_ROWID ){
- pC->nextRowidValid = 1;
- pC->nextRowid = v+1;
- }else{
- pC->nextRowidValid = 0;
- }
+ sqlite3BtreeSetCachedRowid(u.be.pC->pCursor, u.be.v<MAX_ROWID ? u.be.v+1 : 0);
}
- if( pC->useRandomRowid ){
- assert( pOp->p3==0 ); /* SQLITE_FULL must have occurred prior to this */
- v = db->priorNewRowid;
- cnt = 0;
+ if( u.be.pC->useRandomRowid ){
+ assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is
+ ** an AUTOINCREMENT table. */
+ u.be.v = db->lastRowid;
+ u.be.cnt = 0;
do{
- if( cnt==0 && (v&0xffffff)==v ){
- v++;
+ if( u.be.cnt==0 && (u.be.v&0xffffff)==u.be.v ){
+ u.be.v++;
}else{
- sqlite3_randomness(sizeof(v), &v);
- if( cnt<5 ) v &= 0xffffff;
+ sqlite3_randomness(sizeof(u.be.v), &u.be.v);
+ if( u.be.cnt<5 ) u.be.v &= 0xffffff;
}
- if( v==0 ) continue;
- x = intToKey(v);
- rx = sqlite3BtreeMoveto(pC->pCursor, 0, 0, (u64)x, 0, &res);
- cnt++;
- }while( cnt<100 && rx==SQLITE_OK && res==0 );
- db->priorNewRowid = v;
- if( rx==SQLITE_OK && res==0 ){
+ rc = sqlite3BtreeMovetoUnpacked(u.be.pC->pCursor, 0, (u64)u.be.v, 0, &u.be.res);
+ u.be.cnt++;
+ }while( u.be.cnt<100 && rc==SQLITE_OK && u.be.res==0 );
+ if( rc==SQLITE_OK && u.be.res==0 ){
rc = SQLITE_FULL;
goto abort_due_to_error;
}
}
- pC->rowidIsValid = 0;
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
+ u.be.pC->rowidIsValid = 0;
+ u.be.pC->deferredMoveto = 0;
+ u.be.pC->cacheStatus = CACHE_STALE;
}
MemSetTypeFlag(pOut, MEM_Int);
- pOut->u.i = v;
+ pOut->u.i = u.be.v;
break;
}
@@ -45329,15 +55699,28 @@ case OP_NewRowid: { /* out2-prerelease */
**
** Write an entry into the table of cursor P1. A new entry is
** created if it doesn't already exist or the data for an existing
-** entry is overwritten. The data is the value stored register
+** entry is overwritten. The data is the value MEM_Blob stored in register
** number P2. The key is stored in register P3. The key must
-** be an integer.
+** be a MEM_Int.
**
** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is
** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set,
** then rowid is stored for subsequent return by the
** sqlite3_last_insert_rowid() function (otherwise it is unmodified).
**
+** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of
+** the last seek operation (OP_NotExists) was a success, then this
+** operation will not attempt to find the appropriate row before doing
+** the insert but will instead overwrite the row that the cursor is
+** currently pointing to. Presumably, the prior OP_NotExists opcode
+** has already positioned the cursor correctly. This is an optimization
+** that boosts performance by avoiding redundant seeks.
+**
+** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an
+** UPDATE operation. Otherwise (if the flag is clear) then this opcode
+** is part of an INSERT operation. The difference is only important to
+** the update hook.
+**
** Parameter P4 may point to a string containing the table-name, or
** may be NULL. If it is not NULL, then the update-hook
** (sqlite3.xUpdateCallback) is invoked following a successful insert.
@@ -45352,78 +55735,62 @@ case OP_NewRowid: { /* out2-prerelease */
** for indices is OP_IdxInsert.
*/
case OP_Insert: {
- Mem *pData = &p->aMem[pOp->p2];
- Mem *pKey = &p->aMem[pOp->p3];
-
- i64 iKey; /* The integer ROWID or key for the record to be inserted */
- int i = pOp->p1;
- Cursor *pC;
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- assert( pC->pCursor!=0 || pC->pseudoTable );
- assert( pKey->flags & MEM_Int );
- assert( pC->isTable );
- REGISTER_TRACE(pOp->p2, pData);
- REGISTER_TRACE(pOp->p3, pKey);
-
- iKey = intToKey(pKey->u.i);
+#if 0 /* local variables moved into u.bf */
+ Mem *pData; /* MEM cell holding data for the record to be inserted */
+ Mem *pKey; /* MEM cell holding key for the record */
+ i64 iKey; /* The integer ROWID or key for the record to be inserted */
+ VdbeCursor *pC; /* Cursor to table into which insert is written */
+ int nZero; /* Number of zero-bytes to append */
+ int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
+ const char *zDb; /* database name - used by the update hook */
+ const char *zTbl; /* Table name - used by the opdate hook */
+ int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
+#endif /* local variables moved into u.bf */
+
+ u.bf.pData = &p->aMem[pOp->p2];
+ u.bf.pKey = &p->aMem[pOp->p3];
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bf.pC = p->apCsr[pOp->p1];
+ assert( u.bf.pC!=0 );
+ assert( u.bf.pC->pCursor!=0 );
+ assert( u.bf.pC->pseudoTableReg==0 );
+ assert( u.bf.pKey->flags & MEM_Int );
+ assert( u.bf.pC->isTable );
+ REGISTER_TRACE(pOp->p2, u.bf.pData);
+ REGISTER_TRACE(pOp->p3, u.bf.pKey);
+
+ u.bf.iKey = u.bf.pKey->u.i;
if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
- if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = pKey->u.i;
- if( pC->nextRowidValid && pKey->u.i>=pC->nextRowid ){
- pC->nextRowidValid = 0;
- }
- if( pData->flags & MEM_Null ){
- pData->z = 0;
- pData->n = 0;
+ if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = u.bf.pKey->u.i;
+ if( u.bf.pData->flags & MEM_Null ){
+ u.bf.pData->z = 0;
+ u.bf.pData->n = 0;
}else{
- assert( pData->flags & (MEM_Blob|MEM_Str) );
+ assert( u.bf.pData->flags & (MEM_Blob|MEM_Str) );
}
- if( pC->pseudoTable ){
- if( !pC->ephemPseudoTable ){
- sqlite3_free(pC->pData);
- }
- pC->iKey = iKey;
- pC->nData = pData->n;
- if( pData->z==pData->zMalloc || pC->ephemPseudoTable ){
- pC->pData = pData->z;
- if( !pC->ephemPseudoTable ){
- pData->flags &= ~MEM_Dyn;
- pData->flags |= MEM_Ephem;
- pData->zMalloc = 0;
- }
- }else{
- pC->pData = sqlite3_malloc( pC->nData+2 );
- if( !pC->pData ) goto no_mem;
- memcpy(pC->pData, pData->z, pC->nData);
- pC->pData[pC->nData] = 0;
- pC->pData[pC->nData+1] = 0;
- }
- pC->nullRow = 0;
+ u.bf.seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bf.pC->seekResult : 0);
+ if( u.bf.pData->flags & MEM_Zero ){
+ u.bf.nZero = u.bf.pData->u.nZero;
}else{
- int nZero;
- if( pData->flags & MEM_Zero ){
- nZero = pData->u.i;
- }else{
- nZero = 0;
- }
- rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey,
- pData->z, pData->n, nZero,
- pOp->p5 & OPFLAG_APPEND);
+ u.bf.nZero = 0;
}
-
- pC->rowidIsValid = 0;
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
+ sqlite3BtreeSetCachedRowid(u.bf.pC->pCursor, 0);
+ rc = sqlite3BtreeInsert(u.bf.pC->pCursor, 0, u.bf.iKey,
+ u.bf.pData->z, u.bf.pData->n, u.bf.nZero,
+ pOp->p5 & OPFLAG_APPEND, u.bf.seekResult
+ );
+ u.bf.pC->rowidIsValid = 0;
+ u.bf.pC->deferredMoveto = 0;
+ u.bf.pC->cacheStatus = CACHE_STALE;
/* Invoke the update-hook if required. */
if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
- const char *zDb = db->aDb[pC->iDb].zName;
- const char *zTbl = pOp->p4.z;
- int op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
- assert( pC->isTable );
- db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
- assert( pC->iDb>=0 );
+ u.bf.zDb = db->aDb[u.bf.pC->iDb].zName;
+ u.bf.zTbl = pOp->p4.z;
+ u.bf.op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
+ assert( u.bf.pC->isTable );
+ db->xUpdateCallback(db->pUpdateArg, u.bf.op, u.bf.zDb, u.bf.zTbl, u.bf.iKey);
+ assert( u.bf.pC->iDb>=0 );
}
break;
}
@@ -45449,52 +55816,60 @@ case OP_Insert: {
** using OP_NotFound prior to invoking this opcode.
*/
case OP_Delete: {
- int i = pOp->p1;
+#if 0 /* local variables moved into u.bg */
i64 iKey;
- Cursor *pC;
+ VdbeCursor *pC;
+#endif /* local variables moved into u.bg */
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
+ u.bg.iKey = 0;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bg.pC = p->apCsr[pOp->p1];
+ assert( u.bg.pC!=0 );
+ assert( u.bg.pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
- /* If the update-hook will be invoked, set iKey to the rowid of the
+ /* If the update-hook will be invoked, set u.bg.iKey to the rowid of the
** row being deleted.
*/
if( db->xUpdateCallback && pOp->p4.z ){
- assert( pC->isTable );
- assert( pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */
- iKey = pC->lastRowid;
- }
-
- rc = sqlite3VdbeCursorMoveto(pC);
- if( rc ) goto abort_due_to_error;
- rc = sqlite3BtreeDelete(pC->pCursor);
- pC->nextRowidValid = 0;
- pC->cacheStatus = CACHE_STALE;
+ assert( u.bg.pC->isTable );
+ assert( u.bg.pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */
+ u.bg.iKey = u.bg.pC->lastRowid;
+ }
+
+ /* The OP_Delete opcode always follows an OP_NotExists or OP_Last or
+ ** OP_Column on the same table without any intervening operations that
+ ** might move or invalidate the cursor. Hence cursor u.bg.pC is always pointing
+ ** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation
+ ** below is always a no-op and cannot fail. We will run it anyhow, though,
+ ** to guard against future changes to the code generator.
+ **/
+ assert( u.bg.pC->deferredMoveto==0 );
+ rc = sqlite3VdbeCursorMoveto(u.bg.pC);
+ if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
+
+ sqlite3BtreeSetCachedRowid(u.bg.pC->pCursor, 0);
+ rc = sqlite3BtreeDelete(u.bg.pC->pCursor);
+ u.bg.pC->cacheStatus = CACHE_STALE;
/* Invoke the update-hook if required. */
if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
- const char *zDb = db->aDb[pC->iDb].zName;
+ const char *zDb = db->aDb[u.bg.pC->iDb].zName;
const char *zTbl = pOp->p4.z;
- db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, iKey);
- assert( pC->iDb>=0 );
+ db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, u.bg.iKey);
+ assert( u.bg.pC->iDb>=0 );
}
if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
break;
}
-
-/* Opcode: ResetCount P1 * *
+/* Opcode: ResetCount * * * * *
**
-** This opcode resets the VMs internal change counter to 0. If P1 is true,
-** then the value of the change counter is copied to the database handle
-** change counter (returned by subsequent calls to sqlite3_changes())
-** before it is reset. This is used by trigger programs.
+** The value of the change counter is copied to the database handle
+** change counter (returned by subsequent calls to sqlite3_changes()).
+** Then the VMs internal change counter resets to 0.
+** This is used by trigger programs.
*/
case OP_ResetCount: {
- if( pOp->p1 ){
- sqlite3VdbeSetChanges(db, p->nChange);
- }
+ sqlite3VdbeSetChanges(db, p->nChange);
p->nChange = 0;
break;
}
@@ -45521,48 +55896,60 @@ case OP_ResetCount: {
*/
case OP_RowKey:
case OP_RowData: {
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bh */
+ VdbeCursor *pC;
BtCursor *pCrsr;
u32 n;
+ i64 n64;
+#endif /* local variables moved into u.bh */
pOut = &p->aMem[pOp->p2];
/* Note that RowKey and RowData are really exactly the same instruction */
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC->isTable || pOp->opcode==OP_RowKey );
- assert( pC->isIndex || pOp->opcode==OP_RowData );
- assert( pC!=0 );
- assert( pC->nullRow==0 );
- assert( pC->pseudoTable==0 );
- assert( pC->pCursor!=0 );
- pCrsr = pC->pCursor;
- rc = sqlite3VdbeCursorMoveto(pC);
- if( rc ) goto abort_due_to_error;
- if( pC->isIndex ){
- i64 n64;
- assert( !pC->isTable );
- sqlite3BtreeKeySize(pCrsr, &n64);
- if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bh.pC = p->apCsr[pOp->p1];
+ assert( u.bh.pC->isTable || pOp->opcode==OP_RowKey );
+ assert( u.bh.pC->isIndex || pOp->opcode==OP_RowData );
+ assert( u.bh.pC!=0 );
+ assert( u.bh.pC->nullRow==0 );
+ assert( u.bh.pC->pseudoTableReg==0 );
+ assert( u.bh.pC->pCursor!=0 );
+ u.bh.pCrsr = u.bh.pC->pCursor;
+ assert( sqlite3BtreeCursorIsValid(u.bh.pCrsr) );
+
+ /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or
+ ** OP_Rewind/Op_Next with no intervening instructions that might invalidate
+ ** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always
+ ** a no-op and can never fail. But we leave it in place as a safety.
+ */
+ assert( u.bh.pC->deferredMoveto==0 );
+ rc = sqlite3VdbeCursorMoveto(u.bh.pC);
+ if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
+
+ if( u.bh.pC->isIndex ){
+ assert( !u.bh.pC->isTable );
+ rc = sqlite3BtreeKeySize(u.bh.pCrsr, &u.bh.n64);
+ assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
+ if( u.bh.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
- n = n64;
+ u.bh.n = (u32)u.bh.n64;
}else{
- sqlite3BtreeDataSize(pCrsr, &n);
- if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ rc = sqlite3BtreeDataSize(u.bh.pCrsr, &u.bh.n);
+ assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
+ if( u.bh.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
goto too_big;
}
}
- if( sqlite3VdbeMemGrow(pOut, n, 0) ){
+ if( sqlite3VdbeMemGrow(pOut, u.bh.n, 0) ){
goto no_mem;
}
- pOut->n = n;
+ pOut->n = u.bh.n;
MemSetTypeFlag(pOut, MEM_Blob);
- if( pC->isIndex ){
- rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z);
+ if( u.bh.pC->isIndex ){
+ rc = sqlite3BtreeKey(u.bh.pCrsr, 0, u.bh.n, pOut->z);
}else{
- rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z);
+ rc = sqlite3BtreeData(u.bh.pCrsr, 0, u.bh.n, pOut->z);
}
pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */
UPDATE_MAX_BLOBSIZE(pOut);
@@ -45572,31 +55959,53 @@ case OP_RowData: {
/* Opcode: Rowid P1 P2 * * *
**
** Store in register P2 an integer which is the key of the table entry that
-** P1 is currently point to. If p2==0 then push the integer.
+** P1 is currently point to.
+**
+** P1 can be either an ordinary table or a virtual table. There used to
+** be a separate OP_VRowid opcode for use with virtual tables, but this
+** one opcode now works for both table types.
*/
case OP_Rowid: { /* out2-prerelease */
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bi */
+ VdbeCursor *pC;
i64 v;
+ sqlite3_vtab *pVtab;
+ const sqlite3_module *pModule;
+#endif /* local variables moved into u.bi */
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- rc = sqlite3VdbeCursorMoveto(pC);
- if( rc ) goto abort_due_to_error;
- if( pC->rowidIsValid ){
- v = pC->lastRowid;
- }else if( pC->pseudoTable ){
- v = keyToInt(pC->iKey);
- }else if( pC->nullRow ){
- /* Leave the rowid set to a NULL */
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bi.pC = p->apCsr[pOp->p1];
+ assert( u.bi.pC!=0 );
+ assert( u.bi.pC->pseudoTableReg==0 );
+ if( u.bi.pC->nullRow ){
+ /* Do nothing so that reg[P2] remains NULL */
break;
+ }else if( u.bi.pC->deferredMoveto ){
+ u.bi.v = u.bi.pC->movetoTarget;
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ }else if( u.bi.pC->pVtabCursor ){
+ u.bi.pVtab = u.bi.pC->pVtabCursor->pVtab;
+ u.bi.pModule = u.bi.pVtab->pModule;
+ assert( u.bi.pModule->xRowid );
+ if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
+ rc = u.bi.pModule->xRowid(u.bi.pC->pVtabCursor, &u.bi.v);
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.bi.pVtab->zErrMsg;
+ u.bi.pVtab->zErrMsg = 0;
+ if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
+#endif /* SQLITE_OMIT_VIRTUALTABLE */
}else{
- assert( pC->pCursor!=0 );
- sqlite3BtreeKeySize(pC->pCursor, &v);
- v = keyToInt(v);
+ assert( u.bi.pC->pCursor!=0 );
+ rc = sqlite3VdbeCursorMoveto(u.bi.pC);
+ if( rc ) goto abort_due_to_error;
+ if( u.bi.pC->rowidIsValid ){
+ u.bi.v = u.bi.pC->lastRowid;
+ }else{
+ rc = sqlite3BtreeKeySize(u.bi.pC->pCursor, &u.bi.v);
+ assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */
+ }
}
- pOut->u.i = v;
+ pOut->u.i = u.bi.v;
MemSetTypeFlag(pOut, MEM_Int);
break;
}
@@ -45608,14 +56017,18 @@ case OP_Rowid: { /* out2-prerelease */
** write a NULL.
*/
case OP_NullRow: {
- int i = pOp->p1;
- Cursor *pC;
-
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- pC->nullRow = 1;
- pC->rowidIsValid = 0;
+#if 0 /* local variables moved into u.bj */
+ VdbeCursor *pC;
+#endif /* local variables moved into u.bj */
+
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bj.pC = p->apCsr[pOp->p1];
+ assert( u.bj.pC!=0 );
+ u.bj.pC->nullRow = 1;
+ u.bj.pC->rowidIsValid = 0;
+ if( u.bj.pC->pCursor ){
+ sqlite3BtreeClearCursor(u.bj.pC->pCursor);
+ }
break;
}
@@ -45628,21 +56041,26 @@ case OP_NullRow: {
** to the following instruction.
*/
case OP_Last: { /* jump */
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bk */
+ VdbeCursor *pC;
BtCursor *pCrsr;
int res;
+#endif /* local variables moved into u.bk */
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- pCrsr = pC->pCursor;
- assert( pCrsr!=0 );
- rc = sqlite3BtreeLast(pCrsr, &res);
- pC->nullRow = res;
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
- if( res && pOp->p2>0 ){
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bk.pC = p->apCsr[pOp->p1];
+ assert( u.bk.pC!=0 );
+ u.bk.pCrsr = u.bk.pC->pCursor;
+ if( u.bk.pCrsr==0 ){
+ u.bk.res = 1;
+ }else{
+ rc = sqlite3BtreeLast(u.bk.pCrsr, &u.bk.res);
+ }
+ u.bk.pC->nullRow = (u8)u.bk.res;
+ u.bk.pC->deferredMoveto = 0;
+ u.bk.pC->rowidIsValid = 0;
+ u.bk.pC->cacheStatus = CACHE_STALE;
+ if( pOp->p2>0 && u.bk.res ){
pc = pOp->p2 - 1;
}
break;
@@ -45666,6 +56084,7 @@ case OP_Sort: { /* jump */
sqlite3_sort_count++;
sqlite3_search_count--;
#endif
+ p->aCounter[SQLITE_STMTSTATUS_SORT-1]++;
/* Fall through into OP_Rewind */
}
/* Opcode: Rewind P1 P2 * * *
@@ -45677,25 +56096,27 @@ case OP_Sort: { /* jump */
** to the following instruction.
*/
case OP_Rewind: { /* jump */
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bl */
+ VdbeCursor *pC;
BtCursor *pCrsr;
int res;
+#endif /* local variables moved into u.bl */
- assert( i>=0 && i<p->nCursor );
- pC = p->apCsr[i];
- assert( pC!=0 );
- if( (pCrsr = pC->pCursor)!=0 ){
- rc = sqlite3BtreeFirst(pCrsr, &res);
- pC->atFirst = res==0;
- pC->deferredMoveto = 0;
- pC->cacheStatus = CACHE_STALE;
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bl.pC = p->apCsr[pOp->p1];
+ assert( u.bl.pC!=0 );
+ if( (u.bl.pCrsr = u.bl.pC->pCursor)!=0 ){
+ rc = sqlite3BtreeFirst(u.bl.pCrsr, &u.bl.res);
+ u.bl.pC->atFirst = u.bl.res==0 ?1:0;
+ u.bl.pC->deferredMoveto = 0;
+ u.bl.pC->cacheStatus = CACHE_STALE;
+ u.bl.pC->rowidIsValid = 0;
}else{
- res = 1;
+ u.bl.res = 1;
}
- pC->nullRow = res;
+ u.bl.pC->nullRow = (u8)u.bl.res;
assert( pOp->p2>0 && pOp->p2<p->nOp );
- if( res ){
+ if( u.bl.res ){
pc = pOp->p2 - 1;
}
break;
@@ -45723,39 +56144,44 @@ case OP_Rewind: { /* jump */
*/
case OP_Prev: /* jump */
case OP_Next: { /* jump */
- Cursor *pC;
+#if 0 /* local variables moved into u.bm */
+ VdbeCursor *pC;
BtCursor *pCrsr;
+ int res;
+#endif /* local variables moved into u.bm */
CHECK_FOR_INTERRUPT;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- pC = p->apCsr[pOp->p1];
- if( pC==0 ){
+ u.bm.pC = p->apCsr[pOp->p1];
+ if( u.bm.pC==0 ){
break; /* See ticket #2273 */
}
- pCrsr = pC->pCursor;
- assert( pCrsr );
- if( pC->nullRow==0 ){
- int res = 1;
- assert( pC->deferredMoveto==0 );
- rc = pOp->opcode==OP_Next ? sqlite3BtreeNext(pCrsr, &res) :
- sqlite3BtreePrevious(pCrsr, &res);
- pC->nullRow = res;
- pC->cacheStatus = CACHE_STALE;
- if( res==0 ){
- pc = pOp->p2 - 1;
+ u.bm.pCrsr = u.bm.pC->pCursor;
+ if( u.bm.pCrsr==0 ){
+ u.bm.pC->nullRow = 1;
+ break;
+ }
+ u.bm.res = 1;
+ assert( u.bm.pC->deferredMoveto==0 );
+ rc = pOp->opcode==OP_Next ? sqlite3BtreeNext(u.bm.pCrsr, &u.bm.res) :
+ sqlite3BtreePrevious(u.bm.pCrsr, &u.bm.res);
+ u.bm.pC->nullRow = (u8)u.bm.res;
+ u.bm.pC->cacheStatus = CACHE_STALE;
+ if( u.bm.res==0 ){
+ pc = pOp->p2 - 1;
+ if( pOp->p5 ) p->aCounter[pOp->p5-1]++;
#ifdef SQLITE_TEST
- sqlite3_search_count++;
+ sqlite3_search_count++;
#endif
- }
}
- pC->rowidIsValid = 0;
+ u.bm.pC->rowidIsValid = 0;
break;
}
-/* Opcode: IdxInsert P1 P2 P3 * *
+/* Opcode: IdxInsert P1 P2 P3 * P5
**
** Register P2 holds a SQL index key made using the
-** MakeIdxRec instructions. This opcode writes that key
+** MakeRecord instructions. This opcode writes that key
** into the index P1. Data for the entry is nil.
**
** P3 is a flag that provides a hint to the b-tree layer that this
@@ -45765,54 +56191,65 @@ case OP_Next: { /* jump */
** for tables is OP_Insert.
*/
case OP_IdxInsert: { /* in2 */
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bn */
+ VdbeCursor *pC;
BtCursor *pCrsr;
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
+ int nKey;
+ const char *zKey;
+#endif /* local variables moved into u.bn */
+
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bn.pC = p->apCsr[pOp->p1];
+ assert( u.bn.pC!=0 );
assert( pIn2->flags & MEM_Blob );
- if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
- assert( pC->isTable==0 );
+ u.bn.pCrsr = u.bn.pC->pCursor;
+ if( ALWAYS(u.bn.pCrsr!=0) ){
+ assert( u.bn.pC->isTable==0 );
rc = ExpandBlob(pIn2);
if( rc==SQLITE_OK ){
- int nKey = pIn2->n;
- const char *zKey = pIn2->z;
- rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3);
- assert( pC->deferredMoveto==0 );
- pC->cacheStatus = CACHE_STALE;
+ u.bn.nKey = pIn2->n;
+ u.bn.zKey = pIn2->z;
+ rc = sqlite3BtreeInsert(u.bn.pCrsr, u.bn.zKey, u.bn.nKey, "", 0, 0, pOp->p3,
+ ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bn.pC->seekResult : 0)
+ );
+ assert( u.bn.pC->deferredMoveto==0 );
+ u.bn.pC->cacheStatus = CACHE_STALE;
}
}
break;
}
-/* Opcode: IdxDeleteM P1 P2 P3 * *
+/* Opcode: IdxDelete P1 P2 P3 * *
**
** The content of P3 registers starting at register P2 form
** an unpacked index key. This opcode removes that entry from the
** index opened by cursor P1.
*/
case OP_IdxDelete: {
- int i = pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bo */
+ VdbeCursor *pC;
BtCursor *pCrsr;
+ int res;
+ UnpackedRecord r;
+#endif /* local variables moved into u.bo */
+
assert( pOp->p3>0 );
- assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem );
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
- int res;
- UnpackedRecord r;
- r.pKeyInfo = pC->pKeyInfo;
- r.nField = pOp->p3;
- r.needFree = 0;
- r.needDestroy = 0;
- r.aMem = &p->aMem[pOp->p2];
- rc = sqlite3BtreeMoveto(pCrsr, 0, &r, 0, 0, &res);
- if( rc==SQLITE_OK && res==0 ){
- rc = sqlite3BtreeDelete(pCrsr);
- }
- assert( pC->deferredMoveto==0 );
- pC->cacheStatus = CACHE_STALE;
+ assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 );
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bo.pC = p->apCsr[pOp->p1];
+ assert( u.bo.pC!=0 );
+ u.bo.pCrsr = u.bo.pC->pCursor;
+ if( ALWAYS(u.bo.pCrsr!=0) ){
+ u.bo.r.pKeyInfo = u.bo.pC->pKeyInfo;
+ u.bo.r.nField = (u16)pOp->p3;
+ u.bo.r.flags = 0;
+ u.bo.r.aMem = &p->aMem[pOp->p2];
+ rc = sqlite3BtreeMovetoUnpacked(u.bo.pCrsr, &u.bo.r, 0, 0, &u.bo.res);
+ if( rc==SQLITE_OK && u.bo.res==0 ){
+ rc = sqlite3BtreeDelete(u.bo.pCrsr);
+ }
+ assert( u.bo.pC->deferredMoveto==0 );
+ u.bo.pC->cacheStatus = CACHE_STALE;
}
break;
}
@@ -45823,27 +56260,31 @@ case OP_IdxDelete: {
** the end of the index key pointed to by cursor P1. This integer should be
** the rowid of the table entry to which this index entry points.
**
-** See also: Rowid, MakeIdxRec.
+** See also: Rowid, MakeRecord.
*/
case OP_IdxRowid: { /* out2-prerelease */
- int i = pOp->p1;
+#if 0 /* local variables moved into u.bp */
BtCursor *pCrsr;
- Cursor *pC;
+ VdbeCursor *pC;
+ i64 rowid;
+#endif /* local variables moved into u.bp */
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
- i64 rowid;
-
- assert( pC->deferredMoveto==0 );
- assert( pC->isTable==0 );
- if( !pC->nullRow ){
- rc = sqlite3VdbeIdxRowid(pCrsr, &rowid);
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bp.pC = p->apCsr[pOp->p1];
+ assert( u.bp.pC!=0 );
+ u.bp.pCrsr = u.bp.pC->pCursor;
+ if( ALWAYS(u.bp.pCrsr!=0) ){
+ rc = sqlite3VdbeCursorMoveto(u.bp.pC);
+ if( NEVER(rc) ) goto abort_due_to_error;
+ assert( u.bp.pC->deferredMoveto==0 );
+ assert( u.bp.pC->isTable==0 );
+ if( !u.bp.pC->nullRow ){
+ rc = sqlite3VdbeIdxRowid(db, u.bp.pCrsr, &u.bp.rowid);
if( rc!=SQLITE_OK ){
goto abort_due_to_error;
}
MemSetTypeFlag(pOut, MEM_Int);
- pOut->u.i = rowid;
+ pOut->u.i = u.bp.rowid;
}
}
break;
@@ -45877,32 +56318,35 @@ case OP_IdxRowid: { /* out2-prerelease */
*/
case OP_IdxLT: /* jump, in3 */
case OP_IdxGE: { /* jump, in3 */
- int i= pOp->p1;
- Cursor *pC;
+#if 0 /* local variables moved into u.bq */
+ VdbeCursor *pC;
+ int res;
+ UnpackedRecord r;
+#endif /* local variables moved into u.bq */
- assert( i>=0 && i<p->nCursor );
- assert( p->apCsr[i]!=0 );
- if( (pC = p->apCsr[i])->pCursor!=0 ){
- int res;
- UnpackedRecord r;
- assert( pC->deferredMoveto==0 );
+ assert( pOp->p1>=0 && pOp->p1<p->nCursor );
+ u.bq.pC = p->apCsr[pOp->p1];
+ assert( u.bq.pC!=0 );
+ if( ALWAYS(u.bq.pC->pCursor!=0) ){
+ assert( u.bq.pC->deferredMoveto==0 );
assert( pOp->p5==0 || pOp->p5==1 );
assert( pOp->p4type==P4_INT32 );
- r.pKeyInfo = pC->pKeyInfo;
- r.nField = pOp->p4.i;
- r.needFree = 0;
- r.needDestroy = 0;
- r.aMem = &p->aMem[pOp->p3];
- *pC->pIncrKey = pOp->p5;
- rc = sqlite3VdbeIdxKeyCompare(pC, &r, 0, 0, &res);
- *pC->pIncrKey = 0;
+ u.bq.r.pKeyInfo = u.bq.pC->pKeyInfo;
+ u.bq.r.nField = (u16)pOp->p4.i;
+ if( pOp->p5 ){
+ u.bq.r.flags = UNPACKED_INCRKEY | UNPACKED_IGNORE_ROWID;
+ }else{
+ u.bq.r.flags = UNPACKED_IGNORE_ROWID;
+ }
+ u.bq.r.aMem = &p->aMem[pOp->p3];
+ rc = sqlite3VdbeIdxKeyCompare(u.bq.pC, &u.bq.r, &u.bq.res);
if( pOp->opcode==OP_IdxLT ){
- res = -res;
+ u.bq.res = -u.bq.res;
}else{
assert( pOp->opcode==OP_IdxGE );
- res++;
+ u.bq.res++;
}
- if( res>0 ){
+ if( u.bq.res>0 ){
pc = pOp->p2 - 1 ;
}
}
@@ -45930,39 +56374,42 @@ case OP_IdxGE: { /* jump, in3 */
** See also: Clear
*/
case OP_Destroy: { /* out2-prerelease */
+#if 0 /* local variables moved into u.br */
int iMoved;
int iCnt;
-#ifndef SQLITE_OMIT_VIRTUALTABLE
Vdbe *pVdbe;
- iCnt = 0;
- for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){
- if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 ){
- iCnt++;
+ int iDb;
+#endif /* local variables moved into u.br */
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ u.br.iCnt = 0;
+ for(u.br.pVdbe=db->pVdbe; u.br.pVdbe; u.br.pVdbe = u.br.pVdbe->pNext){
+ if( u.br.pVdbe->magic==VDBE_MAGIC_RUN && u.br.pVdbe->inVtabMethod<2 && u.br.pVdbe->pc>=0 ){
+ u.br.iCnt++;
}
}
#else
- iCnt = db->activeVdbeCnt;
+ u.br.iCnt = db->activeVdbeCnt;
#endif
- if( iCnt>1 ){
+ if( u.br.iCnt>1 ){
rc = SQLITE_LOCKED;
p->errorAction = OE_Abort;
}else{
- int iDb = pOp->p3;
- assert( iCnt==1 );
- assert( (p->btreeMask & (1<<iDb))!=0 );
- rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved);
+ u.br.iDb = pOp->p3;
+ assert( u.br.iCnt==1 );
+ assert( (p->btreeMask & (1<<u.br.iDb))!=0 );
+ rc = sqlite3BtreeDropTable(db->aDb[u.br.iDb].pBt, pOp->p1, &u.br.iMoved);
MemSetTypeFlag(pOut, MEM_Int);
- pOut->u.i = iMoved;
+ pOut->u.i = u.br.iMoved;
#ifndef SQLITE_OMIT_AUTOVACUUM
- if( rc==SQLITE_OK && iMoved!=0 ){
- sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1);
+ if( rc==SQLITE_OK && u.br.iMoved!=0 ){
+ sqlite3RootPageMoved(&db->aDb[u.br.iDb], u.br.iMoved, pOp->p1);
}
#endif
}
break;
}
-/* Opcode: Clear P1 P2 *
+/* Opcode: Clear P1 P2 P3
**
** Delete all contents of the database table or index whose root page
** in the database file is given by P1. But, unlike Destroy, do not
@@ -45972,11 +56419,30 @@ case OP_Destroy: { /* out2-prerelease */
** P2==1 then the table to be clear is in the auxiliary database file
** that is used to store tables create using CREATE TEMPORARY TABLE.
**
+** If the P3 value is non-zero, then the table referred to must be an
+** intkey table (an SQL table, not an index). In this case the row change
+** count is incremented by the number of rows in the table being cleared.
+** If P3 is greater than zero, then the value stored in register P3 is
+** also incremented by the number of rows in the table being cleared.
+**
** See also: Destroy
*/
case OP_Clear: {
+#if 0 /* local variables moved into u.bs */
+ int nChange;
+#endif /* local variables moved into u.bs */
+
+ u.bs.nChange = 0;
assert( (p->btreeMask & (1<<pOp->p2))!=0 );
- rc = sqlite3BtreeClearTable(db->aDb[pOp->p2].pBt, pOp->p1);
+ rc = sqlite3BtreeClearTable(
+ db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &u.bs.nChange : 0)
+ );
+ if( pOp->p3 ){
+ p->nChange += u.bs.nChange;
+ if( pOp->p3>0 ){
+ p->aMem[pOp->p3].u.i += u.bs.nChange;
+ }
+ }
break;
}
@@ -46004,24 +56470,26 @@ case OP_Clear: {
*/
case OP_CreateIndex: /* out2-prerelease */
case OP_CreateTable: { /* out2-prerelease */
+#if 0 /* local variables moved into u.bt */
int pgno;
int flags;
Db *pDb;
+#endif /* local variables moved into u.bt */
+
+ u.bt.pgno = 0;
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
- pDb = &db->aDb[pOp->p1];
- assert( pDb->pBt!=0 );
+ u.bt.pDb = &db->aDb[pOp->p1];
+ assert( u.bt.pDb->pBt!=0 );
if( pOp->opcode==OP_CreateTable ){
- /* flags = BTREE_INTKEY; */
- flags = BTREE_LEAFDATA|BTREE_INTKEY;
+ /* u.bt.flags = BTREE_INTKEY; */
+ u.bt.flags = BTREE_LEAFDATA|BTREE_INTKEY;
}else{
- flags = BTREE_ZERODATA;
- }
- rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags);
- if( rc==SQLITE_OK ){
- pOut->u.i = pgno;
- MemSetTypeFlag(pOut, MEM_Int);
+ u.bt.flags = BTREE_ZERODATA;
}
+ rc = sqlite3BtreeCreateTable(u.bt.pDb->pBt, &u.bt.pgno, u.bt.flags);
+ pOut->u.i = u.bt.pgno;
+ MemSetTypeFlag(pOut, MEM_Int);
break;
}
@@ -46035,42 +56503,73 @@ case OP_CreateTable: { /* out2-prerelease */
** schema is already loaded into the symbol table.
**
** This opcode invokes the parser to create a new virtual machine,
-** then runs the new virtual machine. It is thus a reentrant opcode.
+** then runs the new virtual machine. It is thus a re-entrant opcode.
*/
case OP_ParseSchema: {
- char *zSql;
- int iDb = pOp->p1;
+#if 0 /* local variables moved into u.bu */
+ int iDb;
const char *zMaster;
+ char *zSql;
InitData initData;
+#endif /* local variables moved into u.bu */
- assert( iDb>=0 && iDb<db->nDb );
- if( !pOp->p2 && !DbHasProperty(db, iDb, DB_SchemaLoaded) ){
- break;
+ u.bu.iDb = pOp->p1;
+ assert( u.bu.iDb>=0 && u.bu.iDb<db->nDb );
+
+ /* If pOp->p2 is 0, then this opcode is being executed to read a
+ ** single row, for example the row corresponding to a new index
+ ** created by this VDBE, from the sqlite_master table. It only
+ ** does this if the corresponding in-memory schema is currently
+ ** loaded. Otherwise, the new index definition can be loaded along
+ ** with the rest of the schema when it is required.
+ **
+ ** Although the mutex on the BtShared object that corresponds to
+ ** database u.bu.iDb (the database containing the sqlite_master table
+ ** read by this instruction) is currently held, it is necessary to
+ ** obtain the mutexes on all attached databases before checking if
+ ** the schema of u.bu.iDb is loaded. This is because, at the start of
+ ** the sqlite3_exec() call below, SQLite will invoke
+ ** sqlite3BtreeEnterAll(). If all mutexes are not already held, the
+ ** u.bu.iDb mutex may be temporarily released to avoid deadlock. If
+ ** this happens, then some other thread may delete the in-memory
+ ** schema of database u.bu.iDb before the SQL statement runs. The schema
+ ** will not be reloaded becuase the db->init.busy flag is set. This
+ ** can result in a "no such table: sqlite_master" or "malformed
+ ** database schema" error being returned to the user.
+ */
+ assert( sqlite3BtreeHoldsMutex(db->aDb[u.bu.iDb].pBt) );
+ sqlite3BtreeEnterAll(db);
+ if( pOp->p2 || DbHasProperty(db, u.bu.iDb, DB_SchemaLoaded) ){
+ u.bu.zMaster = SCHEMA_TABLE(u.bu.iDb);
+ u.bu.initData.db = db;
+ u.bu.initData.iDb = pOp->p1;
+ u.bu.initData.pzErrMsg = &p->zErrMsg;
+ u.bu.zSql = sqlite3MPrintf(db,
+ "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s",
+ db->aDb[u.bu.iDb].zName, u.bu.zMaster, pOp->p4.z);
+ if( u.bu.zSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ (void)sqlite3SafetyOff(db);
+ assert( db->init.busy==0 );
+ db->init.busy = 1;
+ u.bu.initData.rc = SQLITE_OK;
+ assert( !db->mallocFailed );
+ rc = sqlite3_exec(db, u.bu.zSql, sqlite3InitCallback, &u.bu.initData, 0);
+ if( rc==SQLITE_OK ) rc = u.bu.initData.rc;
+ sqlite3DbFree(db, u.bu.zSql);
+ db->init.busy = 0;
+ (void)sqlite3SafetyOn(db);
+ }
}
- zMaster = SCHEMA_TABLE(iDb);
- initData.db = db;
- initData.iDb = pOp->p1;
- initData.pzErrMsg = &p->zErrMsg;
- zSql = sqlite3MPrintf(db,
- "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s",
- db->aDb[iDb].zName, zMaster, pOp->p4.z);
- if( zSql==0 ) goto no_mem;
- (void)sqlite3SafetyOff(db);
- assert( db->init.busy==0 );
- db->init.busy = 1;
- assert( !db->mallocFailed );
- rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
- if( rc==SQLITE_ABORT ) rc = initData.rc;
- sqlite3_free(zSql);
- db->init.busy = 0;
- (void)sqlite3SafetyOn(db);
+ sqlite3BtreeLeaveAll(db);
if( rc==SQLITE_NOMEM ){
goto no_mem;
}
- break;
+ break;
}
-#if !defined(SQLITE_OMIT_ANALYZE) && !defined(SQLITE_OMIT_PARSER)
+#if !defined(SQLITE_OMIT_ANALYZE)
/* Opcode: LoadAnalysis P1 * * * *
**
** Read the sqlite_stat1 table for database P1 and load the content
@@ -46078,12 +56577,11 @@ case OP_ParseSchema: {
** the analysis to be used when preparing all subsequent queries.
*/
case OP_LoadAnalysis: {
- int iDb = pOp->p1;
- assert( iDb>=0 && iDb<db->nDb );
- rc = sqlite3AnalysisLoad(db, iDb);
+ assert( pOp->p1>=0 && pOp->p1<db->nDb );
+ rc = sqlite3AnalysisLoad(db, pOp->p1);
break;
}
-#endif /* !defined(SQLITE_OMIT_ANALYZE) && !defined(SQLITE_OMIT_PARSER) */
+#endif /* !defined(SQLITE_OMIT_ANALYZE) */
/* Opcode: DropTable P1 * * P4 *
**
@@ -46144,131 +56642,366 @@ case OP_DropTrigger: {
** This opcode is used to implement the integrity_check pragma.
*/
case OP_IntegrityCk: {
+#if 0 /* local variables moved into u.bv */
int nRoot; /* Number of tables to check. (Number of root pages.) */
int *aRoot; /* Array of rootpage numbers for tables to be checked */
int j; /* Loop counter */
int nErr; /* Number of errors reported */
char *z; /* Text of the error report */
Mem *pnErr; /* Register keeping track of errors remaining */
-
- nRoot = pOp->p2;
- assert( nRoot>0 );
- aRoot = sqlite3_malloc( sizeof(int)*(nRoot+1) );
- if( aRoot==0 ) goto no_mem;
+#endif /* local variables moved into u.bv */
+
+ u.bv.nRoot = pOp->p2;
+ assert( u.bv.nRoot>0 );
+ u.bv.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.bv.nRoot+1) );
+ if( u.bv.aRoot==0 ) goto no_mem;
assert( pOp->p3>0 && pOp->p3<=p->nMem );
- pnErr = &p->aMem[pOp->p3];
- assert( (pnErr->flags & MEM_Int)!=0 );
- assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 );
+ u.bv.pnErr = &p->aMem[pOp->p3];
+ assert( (u.bv.pnErr->flags & MEM_Int)!=0 );
+ assert( (u.bv.pnErr->flags & (MEM_Str|MEM_Blob))==0 );
pIn1 = &p->aMem[pOp->p1];
- for(j=0; j<nRoot; j++){
- aRoot[j] = sqlite3VdbeIntValue(&pIn1[j]);
+ for(u.bv.j=0; u.bv.j<u.bv.nRoot; u.bv.j++){
+ u.bv.aRoot[u.bv.j] = (int)sqlite3VdbeIntValue(&pIn1[u.bv.j]);
}
- aRoot[j] = 0;
+ u.bv.aRoot[u.bv.j] = 0;
assert( pOp->p5<db->nDb );
assert( (p->btreeMask & (1<<pOp->p5))!=0 );
- z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot,
- pnErr->u.i, &nErr);
- pnErr->u.i -= nErr;
+ u.bv.z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, u.bv.aRoot, u.bv.nRoot,
+ (int)u.bv.pnErr->u.i, &u.bv.nErr);
+ sqlite3DbFree(db, u.bv.aRoot);
+ u.bv.pnErr->u.i -= u.bv.nErr;
sqlite3VdbeMemSetNull(pIn1);
- if( nErr==0 ){
- assert( z==0 );
+ if( u.bv.nErr==0 ){
+ assert( u.bv.z==0 );
+ }else if( u.bv.z==0 ){
+ goto no_mem;
}else{
- sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
+ sqlite3VdbeMemSetStr(pIn1, u.bv.z, -1, SQLITE_UTF8, sqlite3_free);
}
UPDATE_MAX_BLOBSIZE(pIn1);
sqlite3VdbeChangeEncoding(pIn1, encoding);
- sqlite3_free(aRoot);
break;
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
-/* Opcode: FifoWrite P1 * * * *
+/* Opcode: RowSetAdd P1 P2 * * *
**
-** Write the integer from register P1 into the Fifo.
+** Insert the integer value held by register P2 into a boolean index
+** held in register P1.
+**
+** An assertion fails if P2 is not an integer.
*/
-case OP_FifoWrite: { /* in1 */
- if( sqlite3VdbeFifoPush(&p->sFifo, sqlite3VdbeIntValue(pIn1))==SQLITE_NOMEM ){
- goto no_mem;
- }
+case OP_RowSetAdd: { /* in2 */
+#if 0 /* local variables moved into u.bw */
+ Mem *pIdx;
+ Mem *pVal;
+#endif /* local variables moved into u.bw */
+ assert( pOp->p1>0 && pOp->p1<=p->nMem );
+ u.bw.pIdx = &p->aMem[pOp->p1];
+ assert( pOp->p2>0 && pOp->p2<=p->nMem );
+ u.bw.pVal = &p->aMem[pOp->p2];
+ assert( (u.bw.pVal->flags & MEM_Int)!=0 );
+ if( (u.bw.pIdx->flags & MEM_RowSet)==0 ){
+ sqlite3VdbeMemSetRowSet(u.bw.pIdx);
+ if( (u.bw.pIdx->flags & MEM_RowSet)==0 ) goto no_mem;
+ }
+ sqlite3RowSetInsert(u.bw.pIdx->u.pRowSet, u.bw.pVal->u.i);
break;
}
-/* Opcode: FifoRead P1 P2 * * *
+/* Opcode: RowSetRead P1 P2 P3 * *
**
-** Attempt to read a single integer from the Fifo. Store that
-** integer in register P1.
-**
-** If the Fifo is empty jump to P2.
+** Extract the smallest value from boolean index P1 and put that value into
+** register P3. Or, if boolean index P1 is initially empty, leave P3
+** unchanged and jump to instruction P2.
*/
-case OP_FifoRead: { /* jump */
- CHECK_FOR_INTERRUPT;
+case OP_RowSetRead: { /* jump, out3 */
+#if 0 /* local variables moved into u.bx */
+ Mem *pIdx;
+ i64 val;
+#endif /* local variables moved into u.bx */
assert( pOp->p1>0 && pOp->p1<=p->nMem );
- pOut = &p->aMem[pOp->p1];
- MemSetTypeFlag(pOut, MEM_Int);
- if( sqlite3VdbeFifoPop(&p->sFifo, &pOut->u.i)==SQLITE_DONE ){
+ CHECK_FOR_INTERRUPT;
+ u.bx.pIdx = &p->aMem[pOp->p1];
+ pOut = &p->aMem[pOp->p3];
+ if( (u.bx.pIdx->flags & MEM_RowSet)==0
+ || sqlite3RowSetNext(u.bx.pIdx->u.pRowSet, &u.bx.val)==0
+ ){
+ /* The boolean index is empty */
+ sqlite3VdbeMemSetNull(u.bx.pIdx);
pc = pOp->p2 - 1;
+ }else{
+ /* A value was pulled from the index */
+ assert( pOp->p3>0 && pOp->p3<=p->nMem );
+ sqlite3VdbeMemSetInt64(pOut, u.bx.val);
+ }
+ break;
+}
+
+/* Opcode: RowSetTest P1 P2 P3 P4
+**
+** Register P3 is assumed to hold a 64-bit integer value. If register P1
+** contains a RowSet object and that RowSet object contains
+** the value held in P3, jump to register P2. Otherwise, insert the
+** integer in P3 into the RowSet and continue on to the
+** next opcode.
+**
+** The RowSet object is optimized for the case where successive sets
+** of integers, where each set contains no duplicates. Each set
+** of values is identified by a unique P4 value. The first set
+** must have P4==0, the final set P4=-1. P4 must be either -1 or
+** non-negative. For non-negative values of P4 only the lower 4
+** bits are significant.
+**
+** This allows optimizations: (a) when P4==0 there is no need to test
+** the rowset object for P3, as it is guaranteed not to contain it,
+** (b) when P4==-1 there is no need to insert the value, as it will
+** never be tested for, and (c) when a value that is part of set X is
+** inserted, there is no need to search to see if the same value was
+** previously inserted as part of set X (only if it was previously
+** inserted as part of some other set).
+*/
+case OP_RowSetTest: { /* jump, in1, in3 */
+#if 0 /* local variables moved into u.by */
+ int iSet;
+ int exists;
+#endif /* local variables moved into u.by */
+
+ u.by.iSet = pOp->p4.i;
+ assert( pIn3->flags&MEM_Int );
+
+ /* If there is anything other than a rowset object in memory cell P1,
+ ** delete it now and initialize P1 with an empty rowset
+ */
+ if( (pIn1->flags & MEM_RowSet)==0 ){
+ sqlite3VdbeMemSetRowSet(pIn1);
+ if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
+ }
+
+ assert( pOp->p4type==P4_INT32 );
+ assert( u.by.iSet==-1 || u.by.iSet>=0 );
+ if( u.by.iSet ){
+ u.by.exists = sqlite3RowSetTest(pIn1->u.pRowSet,
+ (u8)(u.by.iSet>=0 ? u.by.iSet & 0xf : 0xff),
+ pIn3->u.i);
+ if( u.by.exists ){
+ pc = pOp->p2 - 1;
+ break;
+ }
+ }
+ if( u.by.iSet>=0 ){
+ sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
}
break;
}
+
#ifndef SQLITE_OMIT_TRIGGER
-/* Opcode: ContextPush * * *
-**
-** Save the current Vdbe context such that it can be restored by a ContextPop
-** opcode. The context stores the last insert row id, the last statement change
-** count, and the current statement change count.
-*/
-case OP_ContextPush: {
- int i = p->contextStackTop++;
- Context *pContext;
-
- assert( i>=0 );
- /* FIX ME: This should be allocated as part of the vdbe at compile-time */
- if( i>=p->contextStackDepth ){
- p->contextStackDepth = i+1;
- p->contextStack = sqlite3DbReallocOrFree(db, p->contextStack,
- sizeof(Context)*(i+1));
- if( p->contextStack==0 ) goto no_mem;
- }
- pContext = &p->contextStack[i];
- pContext->lastRowid = db->lastRowid;
- pContext->nChange = p->nChange;
- pContext->sFifo = p->sFifo;
- sqlite3VdbeFifoInit(&p->sFifo);
+
+/* Opcode: Program P1 P2 P3 P4 *
+**
+** Execute the trigger program passed as P4 (type P4_SUBPROGRAM).
+**
+** P1 contains the address of the memory cell that contains the first memory
+** cell in an array of values used as arguments to the sub-program. P2
+** contains the address to jump to if the sub-program throws an IGNORE
+** exception using the RAISE() function. Register P3 contains the address
+** of a memory cell in this (the parent) VM that is used to allocate the
+** memory required by the sub-vdbe at runtime.
+**
+** P4 is a pointer to the VM containing the trigger program.
+*/
+case OP_Program: { /* jump */
+#if 0 /* local variables moved into u.bz */
+ int nMem; /* Number of memory registers for sub-program */
+ int nByte; /* Bytes of runtime space required for sub-program */
+ Mem *pRt; /* Register to allocate runtime space */
+ Mem *pMem; /* Used to iterate through memory cells */
+ Mem *pEnd; /* Last memory cell in new array */
+ VdbeFrame *pFrame; /* New vdbe frame to execute in */
+ SubProgram *pProgram; /* Sub-program to execute */
+ void *t; /* Token identifying trigger */
+#endif /* local variables moved into u.bz */
+
+ u.bz.pProgram = pOp->p4.pProgram;
+ u.bz.pRt = &p->aMem[pOp->p3];
+ assert( u.bz.pProgram->nOp>0 );
+
+ /* If the p5 flag is clear, then recursive invocation of triggers is
+ ** disabled for backwards compatibility (p5 is set if this sub-program
+ ** is really a trigger, not a foreign key action, and the flag set
+ ** and cleared by the "PRAGMA recursive_triggers" command is clear).
+ **
+ ** It is recursive invocation of triggers, at the SQL level, that is
+ ** disabled. In some cases a single trigger may generate more than one
+ ** SubProgram (if the trigger may be executed with more than one different
+ ** ON CONFLICT algorithm). SubProgram structures associated with a
+ ** single trigger all have the same value for the SubProgram.token
+ ** variable. */
+ if( pOp->p5 ){
+ u.bz.t = u.bz.pProgram->token;
+ for(u.bz.pFrame=p->pFrame; u.bz.pFrame && u.bz.pFrame->token!=u.bz.t; u.bz.pFrame=u.bz.pFrame->pParent);
+ if( u.bz.pFrame ) break;
+ }
+
+ if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
+ rc = SQLITE_ERROR;
+ sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion");
+ break;
+ }
+
+ /* Register u.bz.pRt is used to store the memory required to save the state
+ ** of the current program, and the memory required at runtime to execute
+ ** the trigger program. If this trigger has been fired before, then u.bz.pRt
+ ** is already allocated. Otherwise, it must be initialized. */
+ if( (u.bz.pRt->flags&MEM_Frame)==0 ){
+ /* SubProgram.nMem is set to the number of memory cells used by the
+ ** program stored in SubProgram.aOp. As well as these, one memory
+ ** cell is required for each cursor used by the program. Set local
+ ** variable u.bz.nMem (and later, VdbeFrame.nChildMem) to this value.
+ */
+ u.bz.nMem = u.bz.pProgram->nMem + u.bz.pProgram->nCsr;
+ u.bz.nByte = ROUND8(sizeof(VdbeFrame))
+ + u.bz.nMem * sizeof(Mem)
+ + u.bz.pProgram->nCsr * sizeof(VdbeCursor *);
+ u.bz.pFrame = sqlite3DbMallocZero(db, u.bz.nByte);
+ if( !u.bz.pFrame ){
+ goto no_mem;
+ }
+ sqlite3VdbeMemRelease(u.bz.pRt);
+ u.bz.pRt->flags = MEM_Frame;
+ u.bz.pRt->u.pFrame = u.bz.pFrame;
+
+ u.bz.pFrame->v = p;
+ u.bz.pFrame->nChildMem = u.bz.nMem;
+ u.bz.pFrame->nChildCsr = u.bz.pProgram->nCsr;
+ u.bz.pFrame->pc = pc;
+ u.bz.pFrame->aMem = p->aMem;
+ u.bz.pFrame->nMem = p->nMem;
+ u.bz.pFrame->apCsr = p->apCsr;
+ u.bz.pFrame->nCursor = p->nCursor;
+ u.bz.pFrame->aOp = p->aOp;
+ u.bz.pFrame->nOp = p->nOp;
+ u.bz.pFrame->token = u.bz.pProgram->token;
+
+ u.bz.pEnd = &VdbeFrameMem(u.bz.pFrame)[u.bz.pFrame->nChildMem];
+ for(u.bz.pMem=VdbeFrameMem(u.bz.pFrame); u.bz.pMem!=u.bz.pEnd; u.bz.pMem++){
+ u.bz.pMem->flags = MEM_Null;
+ u.bz.pMem->db = db;
+ }
+ }else{
+ u.bz.pFrame = u.bz.pRt->u.pFrame;
+ assert( u.bz.pProgram->nMem+u.bz.pProgram->nCsr==u.bz.pFrame->nChildMem );
+ assert( u.bz.pProgram->nCsr==u.bz.pFrame->nChildCsr );
+ assert( pc==u.bz.pFrame->pc );
+ }
+
+ p->nFrame++;
+ u.bz.pFrame->pParent = p->pFrame;
+ u.bz.pFrame->lastRowid = db->lastRowid;
+ u.bz.pFrame->nChange = p->nChange;
+ p->nChange = 0;
+ p->pFrame = u.bz.pFrame;
+ p->aMem = &VdbeFrameMem(u.bz.pFrame)[-1];
+ p->nMem = u.bz.pFrame->nChildMem;
+ p->nCursor = (u16)u.bz.pFrame->nChildCsr;
+ p->apCsr = (VdbeCursor **)&p->aMem[p->nMem+1];
+ p->aOp = u.bz.pProgram->aOp;
+ p->nOp = u.bz.pProgram->nOp;
+ pc = -1;
+
break;
}
-/* Opcode: ContextPop * * *
+/* Opcode: Param P1 P2 * * *
**
-** Restore the Vdbe context to the state it was in when contextPush was last
-** executed. The context stores the last insert row id, the last statement
-** change count, and the current statement change count.
+** This opcode is only ever present in sub-programs called via the
+** OP_Program instruction. Copy a value currently stored in a memory
+** cell of the calling (parent) frame to cell P2 in the current frames
+** address space. This is used by trigger programs to access the new.*
+** and old.* values.
+**
+** The address of the cell in the parent frame is determined by adding
+** the value of the P1 argument to the value of the P1 argument to the
+** calling OP_Program instruction.
*/
-case OP_ContextPop: {
- Context *pContext = &p->contextStack[--p->contextStackTop];
- assert( p->contextStackTop>=0 );
- db->lastRowid = pContext->lastRowid;
- p->nChange = pContext->nChange;
- sqlite3VdbeFifoClear(&p->sFifo);
- p->sFifo = pContext->sFifo;
+case OP_Param: { /* out2-prerelease */
+#if 0 /* local variables moved into u.ca */
+ VdbeFrame *pFrame;
+ Mem *pIn;
+#endif /* local variables moved into u.ca */
+ u.ca.pFrame = p->pFrame;
+ u.ca.pIn = &u.ca.pFrame->aMem[pOp->p1 + u.ca.pFrame->aOp[u.ca.pFrame->pc].p1];
+ sqlite3VdbeMemShallowCopy(pOut, u.ca.pIn, MEM_Ephem);
break;
}
+
#endif /* #ifndef SQLITE_OMIT_TRIGGER */
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+/* Opcode: FkCounter P1 P2 * * *
+**
+** Increment a "constraint counter" by P2 (P2 may be negative or positive).
+** If P1 is non-zero, the database constraint counter is incremented
+** (deferred foreign key constraints). Otherwise, if P1 is zero, the
+** statement counter is incremented (immediate foreign key constraints).
+*/
+case OP_FkCounter: {
+ if( pOp->p1 ){
+ db->nDeferredCons += pOp->p2;
+ }else{
+ p->nFkConstraint += pOp->p2;
+ }
+ break;
+}
+
+/* Opcode: FkIfZero P1 P2 * * *
+**
+** This opcode tests if a foreign key constraint-counter is currently zero.
+** If so, jump to instruction P2. Otherwise, fall through to the next
+** instruction.
+**
+** If P1 is non-zero, then the jump is taken if the database constraint-counter
+** is zero (the one that counts deferred constraint violations). If P1 is
+** zero, the jump is taken if the statement constraint-counter is zero
+** (immediate foreign key constraint violations).
+*/
+case OP_FkIfZero: { /* jump */
+ if( pOp->p1 ){
+ if( db->nDeferredCons==0 ) pc = pOp->p2-1;
+ }else{
+ if( p->nFkConstraint==0 ) pc = pOp->p2-1;
+ }
+ break;
+}
+#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */
+
#ifndef SQLITE_OMIT_AUTOINCREMENT
/* Opcode: MemMax P1 P2 * * *
**
-** Set the value of register P1 to the maximum of its current value
-** and the value in register P2.
+** P1 is a register in the root frame of this VM (the root frame is
+** different from the current frame if this instruction is being executed
+** within a sub-program). Set the value of register P1 to the maximum of
+** its current value and the value in register P2.
**
** This instruction throws an error if the memory cell is not initially
** an integer.
*/
-case OP_MemMax: { /* in1, in2 */
- sqlite3VdbeMemIntegerify(pIn1);
+case OP_MemMax: { /* in2 */
+#if 0 /* local variables moved into u.cb */
+ Mem *pIn1;
+ VdbeFrame *pFrame;
+#endif /* local variables moved into u.cb */
+ if( p->pFrame ){
+ for(u.cb.pFrame=p->pFrame; u.cb.pFrame->pParent; u.cb.pFrame=u.cb.pFrame->pParent);
+ u.cb.pIn1 = &u.cb.pFrame->aMem[pOp->p1];
+ }else{
+ u.cb.pIn1 = &p->aMem[pOp->p1];
+ }
+ sqlite3VdbeMemIntegerify(u.cb.pIn1);
sqlite3VdbeMemIntegerify(pIn2);
- if( pIn1->u.i<pIn2->u.i){
- pIn1->u.i = pIn2->u.i;
+ if( u.cb.pIn1->u.i<pIn2->u.i){
+ u.cb.pIn1->u.i = pIn2->u.i;
}
break;
}
@@ -46330,43 +57063,47 @@ case OP_IfZero: { /* jump, in1 */
** successors.
*/
case OP_AggStep: {
- int n = pOp->p5;
+#if 0 /* local variables moved into u.cc */
+ int n;
int i;
- Mem *pMem, *pRec;
+ Mem *pMem;
+ Mem *pRec;
sqlite3_context ctx;
sqlite3_value **apVal;
-
- assert( n>=0 );
- pRec = &p->aMem[pOp->p2];
- apVal = p->apArg;
- assert( apVal || n==0 );
- for(i=0; i<n; i++, pRec++){
- apVal[i] = pRec;
- storeTypeInfo(pRec, encoding);
- }
- ctx.pFunc = pOp->p4.pFunc;
+#endif /* local variables moved into u.cc */
+
+ u.cc.n = pOp->p5;
+ assert( u.cc.n>=0 );
+ u.cc.pRec = &p->aMem[pOp->p2];
+ u.cc.apVal = p->apArg;
+ assert( u.cc.apVal || u.cc.n==0 );
+ for(u.cc.i=0; u.cc.i<u.cc.n; u.cc.i++, u.cc.pRec++){
+ u.cc.apVal[u.cc.i] = u.cc.pRec;
+ storeTypeInfo(u.cc.pRec, encoding);
+ }
+ u.cc.ctx.pFunc = pOp->p4.pFunc;
assert( pOp->p3>0 && pOp->p3<=p->nMem );
- ctx.pMem = pMem = &p->aMem[pOp->p3];
- pMem->n++;
- ctx.s.flags = MEM_Null;
- ctx.s.z = 0;
- ctx.s.zMalloc = 0;
- ctx.s.xDel = 0;
- ctx.s.db = db;
- ctx.isError = 0;
- ctx.pColl = 0;
- if( ctx.pFunc->needCollSeq ){
+ u.cc.ctx.pMem = u.cc.pMem = &p->aMem[pOp->p3];
+ u.cc.pMem->n++;
+ u.cc.ctx.s.flags = MEM_Null;
+ u.cc.ctx.s.z = 0;
+ u.cc.ctx.s.zMalloc = 0;
+ u.cc.ctx.s.xDel = 0;
+ u.cc.ctx.s.db = db;
+ u.cc.ctx.isError = 0;
+ u.cc.ctx.pColl = 0;
+ if( u.cc.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
assert( pOp>p->aOp );
assert( pOp[-1].p4type==P4_COLLSEQ );
assert( pOp[-1].opcode==OP_CollSeq );
- ctx.pColl = pOp[-1].p4.pColl;
+ u.cc.ctx.pColl = pOp[-1].p4.pColl;
}
- (ctx.pFunc->xStep)(&ctx, n, apVal);
- if( ctx.isError ){
- sqlite3SetString(&p->zErrMsg, sqlite3_value_text(&ctx.s), (char*)0);
- rc = ctx.isError;
+ (u.cc.ctx.pFunc->xStep)(&u.cc.ctx, u.cc.n, u.cc.apVal);
+ if( u.cc.ctx.isError ){
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cc.ctx.s));
+ rc = u.cc.ctx.isError;
}
- sqlite3VdbeMemRelease(&ctx.s);
+ sqlite3VdbeMemRelease(&u.cc.ctx.s);
break;
}
@@ -46383,17 +57120,19 @@ case OP_AggStep: {
** the step function was not previously called.
*/
case OP_AggFinal: {
+#if 0 /* local variables moved into u.cd */
Mem *pMem;
+#endif /* local variables moved into u.cd */
assert( pOp->p1>0 && pOp->p1<=p->nMem );
- pMem = &p->aMem[pOp->p1];
- assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
- rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
- if( rc==SQLITE_ERROR ){
- sqlite3SetString(&p->zErrMsg, sqlite3_value_text(pMem), (char*)0);
- }
- sqlite3VdbeChangeEncoding(pMem, encoding);
- UPDATE_MAX_BLOBSIZE(pMem);
- if( sqlite3VdbeMemTooBig(pMem) ){
+ u.cd.pMem = &p->aMem[pOp->p1];
+ assert( (u.cd.pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
+ rc = sqlite3VdbeMemFinalize(u.cd.pMem, pOp->p4.pFunc);
+ if( rc ){
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.cd.pMem));
+ }
+ sqlite3VdbeChangeEncoding(u.cd.pMem, encoding);
+ UPDATE_MAX_BLOBSIZE(u.cd.pMem);
+ if( sqlite3VdbeMemTooBig(u.cd.pMem) ){
goto too_big;
}
break;
@@ -46423,12 +57162,14 @@ case OP_Vacuum: {
** P2. Otherwise, fall through to the next instruction.
*/
case OP_IncrVacuum: { /* jump */
+#if 0 /* local variables moved into u.ce */
Btree *pBt;
+#endif /* local variables moved into u.ce */
assert( pOp->p1>=0 && pOp->p1<db->nDb );
assert( (p->btreeMask & (1<<pOp->p1))!=0 );
- pBt = db->aDb[pOp->p1].pBt;
- rc = sqlite3BtreeIncrVacuum(pBt);
+ u.ce.pBt = db->aDb[pOp->p1].pBt;
+ rc = sqlite3BtreeIncrVacuum(u.ce.pBt);
if( rc==SQLITE_DONE ){
pc = pOp->p2 - 1;
rc = SQLITE_OK;
@@ -46461,7 +57202,7 @@ case OP_Expire: {
** Obtain a lock on a particular table. This instruction is only used when
** the shared-cache feature is enabled.
**
-** If P1 is the index of the database in sqlite3.aDb[] of the database
+** P1 is the index of the database in sqlite3.aDb[] of the database
** on which the lock is acquired. A readlock is obtained if P3==0 or
** a write lock if P3==1.
**
@@ -46471,15 +57212,17 @@ case OP_Expire: {
** used to generate an error message if the lock cannot be obtained.
*/
case OP_TableLock: {
- int p1 = pOp->p1;
- u8 isWriteLock = pOp->p3;
- assert( p1>=0 && p1<db->nDb );
- assert( (p->btreeMask & (1<<p1))!=0 );
- assert( isWriteLock==0 || isWriteLock==1 );
- rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
- if( rc==SQLITE_LOCKED ){
- const char *z = pOp->p4.z;
- sqlite3SetString(&p->zErrMsg, "database table is locked: ", z, (char*)0);
+ u8 isWriteLock = (u8)pOp->p3;
+ if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){
+ int p1 = pOp->p1;
+ assert( p1>=0 && p1<db->nDb );
+ assert( (p->btreeMask & (1<<p1))!=0 );
+ assert( isWriteLock==0 || isWriteLock==1 );
+ rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
+ if( (rc&0xFF)==SQLITE_LOCKED ){
+ const char *z = pOp->p4.z;
+ sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z);
+ }
}
break;
}
@@ -46488,11 +57231,24 @@ case OP_TableLock: {
#ifndef SQLITE_OMIT_VIRTUALTABLE
/* Opcode: VBegin * * * P4 *
**
-** P4 a pointer to an sqlite3_vtab structure. Call the xBegin method
-** for that table.
+** P4 may be a pointer to an sqlite3_vtab structure. If so, call the
+** xBegin method for that table.
+**
+** Also, whether or not P4 is set, check that this is not being called from
+** within a callback to a virtual table xSync() method. If it is, the error
+** code will be set to SQLITE_LOCKED.
*/
case OP_VBegin: {
- rc = sqlite3VtabBegin(db, pOp->p4.pVtab);
+#if 0 /* local variables moved into u.cf */
+ VTable *pVTab;
+#endif /* local variables moved into u.cf */
+ u.cf.pVTab = pOp->p4.pVtab;
+ rc = sqlite3VtabBegin(db, u.cf.pVTab);
+ if( u.cf.pVTab ){
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.cf.pVTab->pVtab->zErrMsg;
+ u.cf.pVTab->pVtab->zErrMsg = 0;
+ }
break;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -46531,28 +57287,36 @@ case OP_VDestroy: {
** table and stores that cursor in P1.
*/
case OP_VOpen: {
- Cursor *pCur = 0;
- sqlite3_vtab_cursor *pVtabCursor = 0;
-
- sqlite3_vtab *pVtab = pOp->p4.pVtab;
- sqlite3_module *pModule = (sqlite3_module *)pVtab->pModule;
-
- assert(pVtab && pModule);
+#if 0 /* local variables moved into u.cg */
+ VdbeCursor *pCur;
+ sqlite3_vtab_cursor *pVtabCursor;
+ sqlite3_vtab *pVtab;
+ sqlite3_module *pModule;
+#endif /* local variables moved into u.cg */
+
+ u.cg.pCur = 0;
+ u.cg.pVtabCursor = 0;
+ u.cg.pVtab = pOp->p4.pVtab->pVtab;
+ u.cg.pModule = (sqlite3_module *)u.cg.pVtab->pModule;
+ assert(u.cg.pVtab && u.cg.pModule);
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- rc = pModule->xOpen(pVtab, &pVtabCursor);
+ rc = u.cg.pModule->xOpen(u.cg.pVtab, &u.cg.pVtabCursor);
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.cg.pVtab->zErrMsg;
+ u.cg.pVtab->zErrMsg = 0;
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
if( SQLITE_OK==rc ){
- /* Initialise sqlite3_vtab_cursor base class */
- pVtabCursor->pVtab = pVtab;
+ /* Initialize sqlite3_vtab_cursor base class */
+ u.cg.pVtabCursor->pVtab = u.cg.pVtab;
/* Initialise vdbe cursor object */
- pCur = allocateCursor(p, pOp->p1, &pOp[-1], -1, 0);
- if( pCur ){
- pCur->pVtabCursor = pVtabCursor;
- pCur->pModule = pVtabCursor->pVtab->pModule;
+ u.cg.pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
+ if( u.cg.pCur ){
+ u.cg.pCur->pVtabCursor = u.cg.pVtabCursor;
+ u.cg.pCur->pModule = u.cg.pVtabCursor->pVtab->pModule;
}else{
db->mallocFailed = 1;
- pModule->xClose(pVtabCursor);
+ u.cg.pModule->xClose(u.cg.pVtabCursor);
}
}
break;
@@ -46572,86 +57336,73 @@ case OP_VOpen: {
** This opcode invokes the xFilter method on the virtual table specified
** by P1. The integer query plan parameter to xFilter is stored in register
** P3. Register P3+1 stores the argc parameter to be passed to the
-** xFilter method. Registers P3+2..P3+1+argc are the argc additional
-** parametersneath additional parameters which are passed to
+** xFilter method. Registers P3+2..P3+1+argc are the argc
+** additional parameters which are passed to
** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
**
** A jump is made to P2 if the result set after filtering would be empty.
*/
case OP_VFilter: { /* jump */
+#if 0 /* local variables moved into u.ch */
int nArg;
int iQuery;
const sqlite3_module *pModule;
- Mem *pQuery = &p->aMem[pOp->p3];
- Mem *pArgc = &pQuery[1];
-
- Cursor *pCur = p->apCsr[pOp->p1];
-
- REGISTER_TRACE(pOp->p3, pQuery);
- assert( pCur->pVtabCursor );
- pModule = pCur->pVtabCursor->pVtab->pModule;
+ Mem *pQuery;
+ Mem *pArgc;
+ sqlite3_vtab_cursor *pVtabCursor;
+ sqlite3_vtab *pVtab;
+ VdbeCursor *pCur;
+ int res;
+ int i;
+ Mem **apArg;
+#endif /* local variables moved into u.ch */
+
+ u.ch.pQuery = &p->aMem[pOp->p3];
+ u.ch.pArgc = &u.ch.pQuery[1];
+ u.ch.pCur = p->apCsr[pOp->p1];
+ REGISTER_TRACE(pOp->p3, u.ch.pQuery);
+ assert( u.ch.pCur->pVtabCursor );
+ u.ch.pVtabCursor = u.ch.pCur->pVtabCursor;
+ u.ch.pVtab = u.ch.pVtabCursor->pVtab;
+ u.ch.pModule = u.ch.pVtab->pModule;
/* Grab the index number and argc parameters */
- assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int );
- nArg = pArgc->u.i;
- iQuery = pQuery->u.i;
+ assert( (u.ch.pQuery->flags&MEM_Int)!=0 && u.ch.pArgc->flags==MEM_Int );
+ u.ch.nArg = (int)u.ch.pArgc->u.i;
+ u.ch.iQuery = (int)u.ch.pQuery->u.i;
/* Invoke the xFilter method */
{
- int res = 0;
- int i;
- Mem **apArg = p->apArg;
- for(i = 0; i<nArg; i++){
- apArg[i] = &pArgc[i+1];
- storeTypeInfo(apArg[i], 0);
+ u.ch.res = 0;
+ u.ch.apArg = p->apArg;
+ for(u.ch.i = 0; u.ch.i<u.ch.nArg; u.ch.i++){
+ u.ch.apArg[u.ch.i] = &u.ch.pArgc[u.ch.i+1];
+ storeTypeInfo(u.ch.apArg[u.ch.i], 0);
}
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
p->inVtabMethod = 1;
- rc = pModule->xFilter(pCur->pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
+ rc = u.ch.pModule->xFilter(u.ch.pVtabCursor, u.ch.iQuery, pOp->p4.z, u.ch.nArg, u.ch.apArg);
p->inVtabMethod = 0;
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.ch.pVtab->zErrMsg;
+ u.ch.pVtab->zErrMsg = 0;
if( rc==SQLITE_OK ){
- res = pModule->xEof(pCur->pVtabCursor);
+ u.ch.res = u.ch.pModule->xEof(u.ch.pVtabCursor);
}
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
- if( res ){
+ if( u.ch.res ){
pc = pOp->p2 - 1;
}
}
- pCur->nullRow = 0;
+ u.ch.pCur->nullRow = 0;
break;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
#ifndef SQLITE_OMIT_VIRTUALTABLE
-/* Opcode: VRowid P1 P2 * * *
-**
-** Store into register P2 the rowid of
-** the virtual-table that the P1 cursor is pointing to.
-*/
-case OP_VRowid: { /* out2-prerelease */
- const sqlite3_module *pModule;
- sqlite_int64 iRow;
- Cursor *pCur = p->apCsr[pOp->p1];
-
- assert( pCur->pVtabCursor );
- if( pCur->nullRow ){
- break;
- }
- pModule = pCur->pVtabCursor->pVtab->pModule;
- assert( pModule->xRowid );
- if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- rc = pModule->xRowid(pCur->pVtabCursor, &iRow);
- if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
- MemSetTypeFlag(pOut, MEM_Int);
- pOut->u.i = iRow;
- break;
-}
-#endif /* SQLITE_OMIT_VIRTUALTABLE */
-
-#ifndef SQLITE_OMIT_VIRTUALTABLE
/* Opcode: VColumn P1 P2 P3 * *
**
** Store the value of the P2-th column of
@@ -46659,46 +57410,56 @@ case OP_VRowid: { /* out2-prerelease */
** P1 cursor is pointing to into register P3.
*/
case OP_VColumn: {
+#if 0 /* local variables moved into u.ci */
+ sqlite3_vtab *pVtab;
const sqlite3_module *pModule;
Mem *pDest;
sqlite3_context sContext;
+#endif /* local variables moved into u.ci */
- Cursor *pCur = p->apCsr[pOp->p1];
+ VdbeCursor *pCur = p->apCsr[pOp->p1];
assert( pCur->pVtabCursor );
assert( pOp->p3>0 && pOp->p3<=p->nMem );
- pDest = &p->aMem[pOp->p3];
+ u.ci.pDest = &p->aMem[pOp->p3];
if( pCur->nullRow ){
- sqlite3VdbeMemSetNull(pDest);
+ sqlite3VdbeMemSetNull(u.ci.pDest);
break;
}
- pModule = pCur->pVtabCursor->pVtab->pModule;
- assert( pModule->xColumn );
- memset(&sContext, 0, sizeof(sContext));
+ u.ci.pVtab = pCur->pVtabCursor->pVtab;
+ u.ci.pModule = u.ci.pVtab->pModule;
+ assert( u.ci.pModule->xColumn );
+ memset(&u.ci.sContext, 0, sizeof(u.ci.sContext));
/* The output cell may already have a buffer allocated. Move
- ** the current contents to sContext.s so in case the user-function
- ** can use the already allocated buffer instead of allocating a
+ ** the current contents to u.ci.sContext.s so in case the user-function
+ ** can use the already allocated buffer instead of allocating a
** new one.
*/
- sqlite3VdbeMemMove(&sContext.s, pDest);
- MemSetTypeFlag(&sContext.s, MEM_Null);
+ sqlite3VdbeMemMove(&u.ci.sContext.s, u.ci.pDest);
+ MemSetTypeFlag(&u.ci.sContext.s, MEM_Null);
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2);
+ rc = u.ci.pModule->xColumn(pCur->pVtabCursor, &u.ci.sContext, pOp->p2);
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.ci.pVtab->zErrMsg;
+ u.ci.pVtab->zErrMsg = 0;
+ if( u.ci.sContext.isError ){
+ rc = u.ci.sContext.isError;
+ }
/* Copy the result of the function to the P3 register. We
- ** do this regardless of whether or not an error occured to ensure any
- ** dynamic allocation in sContext.s (a Mem struct) is released.
+ ** do this regardless of whether or not an error occurred to ensure any
+ ** dynamic allocation in u.ci.sContext.s (a Mem struct) is released.
*/
- sqlite3VdbeChangeEncoding(&sContext.s, encoding);
- REGISTER_TRACE(pOp->p3, pDest);
- sqlite3VdbeMemMove(pDest, &sContext.s);
- UPDATE_MAX_BLOBSIZE(pDest);
+ sqlite3VdbeChangeEncoding(&u.ci.sContext.s, encoding);
+ REGISTER_TRACE(pOp->p3, u.ci.pDest);
+ sqlite3VdbeMemMove(u.ci.pDest, &u.ci.sContext.s);
+ UPDATE_MAX_BLOBSIZE(u.ci.pDest);
if( sqlite3SafetyOn(db) ){
goto abort_due_to_misuse;
}
- if( sqlite3VdbeMemTooBig(pDest) ){
+ if( sqlite3VdbeMemTooBig(u.ci.pDest) ){
goto too_big;
}
break;
@@ -46713,33 +57474,42 @@ case OP_VColumn: {
** the end of its result set, then fall through to the next instruction.
*/
case OP_VNext: { /* jump */
+#if 0 /* local variables moved into u.cj */
+ sqlite3_vtab *pVtab;
const sqlite3_module *pModule;
- int res = 0;
+ int res;
+ VdbeCursor *pCur;
+#endif /* local variables moved into u.cj */
- Cursor *pCur = p->apCsr[pOp->p1];
- assert( pCur->pVtabCursor );
- if( pCur->nullRow ){
+ u.cj.res = 0;
+ u.cj.pCur = p->apCsr[pOp->p1];
+ assert( u.cj.pCur->pVtabCursor );
+ if( u.cj.pCur->nullRow ){
break;
}
- pModule = pCur->pVtabCursor->pVtab->pModule;
- assert( pModule->xNext );
+ u.cj.pVtab = u.cj.pCur->pVtabCursor->pVtab;
+ u.cj.pModule = u.cj.pVtab->pModule;
+ assert( u.cj.pModule->xNext );
/* Invoke the xNext() method of the module. There is no way for the
** underlying implementation to return an error if one occurs during
- ** xNext(). Instead, if an error occurs, true is returned (indicating that
+ ** xNext(). Instead, if an error occurs, true is returned (indicating that
** data is available) and the error code returned when xColumn or
** some other method is next invoked on the save virtual table cursor.
*/
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
p->inVtabMethod = 1;
- rc = pModule->xNext(pCur->pVtabCursor);
+ rc = u.cj.pModule->xNext(u.cj.pCur->pVtabCursor);
p->inVtabMethod = 0;
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.cj.pVtab->zErrMsg;
+ u.cj.pVtab->zErrMsg = 0;
if( rc==SQLITE_OK ){
- res = pModule->xEof(pCur->pVtabCursor);
+ u.cj.res = u.cj.pModule->xEof(u.cj.pCur->pVtabCursor);
}
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
- if( !res ){
+ if( !u.cj.res ){
/* If there is data, jump to P2 */
pc = pOp->p2 - 1;
}
@@ -46755,17 +57525,21 @@ case OP_VNext: { /* jump */
** in register P1 is passed as the zName argument to the xRename method.
*/
case OP_VRename: {
- sqlite3_vtab *pVtab = pOp->p4.pVtab;
- Mem *pName = &p->aMem[pOp->p1];
- assert( pVtab->pModule->xRename );
- REGISTER_TRACE(pOp->p1, pName);
-
- Stringify(pName, encoding);
-
+#if 0 /* local variables moved into u.ck */
+ sqlite3_vtab *pVtab;
+ Mem *pName;
+#endif /* local variables moved into u.ck */
+
+ u.ck.pVtab = pOp->p4.pVtab->pVtab;
+ u.ck.pName = &p->aMem[pOp->p1];
+ assert( u.ck.pVtab->pModule->xRename );
+ REGISTER_TRACE(pOp->p1, u.ck.pName);
+ assert( u.ck.pName->flags & MEM_Str );
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- sqlite3VtabLock(pVtab);
- rc = pVtab->pModule->xRename(pVtab, pName->z);
- sqlite3VtabUnlock(db, pVtab);
+ rc = u.ck.pVtab->pModule->xRename(u.ck.pVtab, u.ck.pName->z);
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.ck.pVtab->zErrMsg;
+ u.ck.pVtab->zErrMsg = 0;
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
break;
@@ -46797,31 +57571,37 @@ case OP_VRename: {
** is set to the value of the rowid for the row just inserted.
*/
case OP_VUpdate: {
- sqlite3_vtab *pVtab = pOp->p4.pVtab;
- sqlite3_module *pModule = (sqlite3_module *)pVtab->pModule;
- int nArg = pOp->p2;
+#if 0 /* local variables moved into u.cl */
+ sqlite3_vtab *pVtab;
+ sqlite3_module *pModule;
+ int nArg;
+ int i;
+ sqlite_int64 rowid;
+ Mem **apArg;
+ Mem *pX;
+#endif /* local variables moved into u.cl */
+
+ u.cl.pVtab = pOp->p4.pVtab->pVtab;
+ u.cl.pModule = (sqlite3_module *)u.cl.pVtab->pModule;
+ u.cl.nArg = pOp->p2;
assert( pOp->p4type==P4_VTAB );
- if( pModule->xUpdate==0 ){
- sqlite3SetString(&p->zErrMsg, "read-only table", 0);
- rc = SQLITE_ERROR;
- }else{
- int i;
- sqlite_int64 rowid;
- Mem **apArg = p->apArg;
- Mem *pX = &p->aMem[pOp->p3];
- for(i=0; i<nArg; i++){
- storeTypeInfo(pX, 0);
- apArg[i] = pX;
- pX++;
+ if( ALWAYS(u.cl.pModule->xUpdate) ){
+ u.cl.apArg = p->apArg;
+ u.cl.pX = &p->aMem[pOp->p3];
+ for(u.cl.i=0; u.cl.i<u.cl.nArg; u.cl.i++){
+ storeTypeInfo(u.cl.pX, 0);
+ u.cl.apArg[u.cl.i] = u.cl.pX;
+ u.cl.pX++;
}
if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
- sqlite3VtabLock(pVtab);
- rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid);
- sqlite3VtabUnlock(db, pVtab);
+ rc = u.cl.pModule->xUpdate(u.cl.pVtab, u.cl.nArg, u.cl.apArg, &u.cl.rowid);
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = u.cl.pVtab->zErrMsg;
+ u.cl.pVtab->zErrMsg = 0;
if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
- if( pOp->p1 && rc==SQLITE_OK ){
- assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
- db->lastRowid = rowid;
+ if( rc==SQLITE_OK && pOp->p1 ){
+ assert( u.cl.nArg>1 && u.cl.apArg[0] && (u.cl.apArg[0]->flags&MEM_Null) );
+ db->lastRowid = u.cl.rowid;
}
p->nChange++;
}
@@ -46829,6 +57609,32 @@ case OP_VUpdate: {
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
+#ifndef SQLITE_OMIT_PAGER_PRAGMAS
+/* Opcode: Pagecount P1 P2 * * *
+**
+** Write the current number of pages in database P1 to memory cell P2.
+*/
+case OP_Pagecount: { /* out2-prerelease */
+#if 0 /* local variables moved into u.cm */
+ int p1;
+ int nPage;
+ Pager *pPager;
+#endif /* local variables moved into u.cm */
+
+ u.cm.p1 = pOp->p1;
+ u.cm.pPager = sqlite3BtreePager(db->aDb[u.cm.p1].pBt);
+ rc = sqlite3PagerPagecount(u.cm.pPager, &u.cm.nPage);
+ /* OP_Pagecount is always called from within a read transaction. The
+ ** page count has already been successfully read and cached. So the
+ ** sqlite3PagerPagecount() call above cannot fail. */
+ if( ALWAYS(rc==SQLITE_OK) ){
+ pOut->flags = MEM_Int;
+ pOut->u.i = u.cm.nPage;
+ }
+ break;
+}
+#endif
+
#ifndef SQLITE_OMIT_TRACE
/* Opcode: Trace * * * P4 *
**
@@ -46836,13 +57642,18 @@ case OP_VUpdate: {
** the UTF-8 string contained in P4 is emitted on the trace callback.
*/
case OP_Trace: {
- if( pOp->p4.z ){
+#if 0 /* local variables moved into u.cn */
+ char *zTrace;
+#endif /* local variables moved into u.cn */
+
+ u.cn.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql);
+ if( u.cn.zTrace ){
if( db->xTrace ){
- db->xTrace(db->pTraceArg, pOp->p4.z);
+ db->xTrace(db->pTraceArg, u.cn.zTrace);
}
#ifdef SQLITE_DEBUG
if( (db->flags & SQLITE_SqlTrace)!=0 ){
- sqlite3DebugPrintf("SQL-trace: %s\n", pOp->p4.z);
+ sqlite3DebugPrintf("SQL-trace: %s\n", u.cn.zTrace);
}
#endif /* SQLITE_DEBUG */
}
@@ -46876,11 +57687,11 @@ default: { /* This is really OP_Noop and OP_Explain */
#ifdef VDBE_PROFILE
{
- long long elapse = hwtime() - start;
- pOp->cycles += elapse;
+ u64 elapsed = sqlite3Hwtime() - start;
+ pOp->cycles += elapsed;
pOp->cnt++;
#if 0
- fprintf(stdout, "%10lld ", elapse);
+ fprintf(stdout, "%10llu ", elapsed);
sqlite3VdbePrintOp(stdout, origPc, &p->aOp[origPc]);
#endif
}
@@ -46914,8 +57725,9 @@ default: { /* This is really OP_Noop and OP_Explain */
vdbe_error_halt:
assert( rc );
p->rc = rc;
- rc = SQLITE_ERROR;
sqlite3VdbeHalt(p);
+ if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
+ rc = SQLITE_ERROR;
/* This is the only way out of this procedure. We have to
** release the mutexes on btrees that were acquired at the
@@ -46928,7 +57740,7 @@ vdbe_return:
** is encountered.
*/
too_big:
- sqlite3SetString(&p->zErrMsg, "string or blob too big", (char*)0);
+ sqlite3SetString(&p->zErrMsg, db, "string or blob too big");
rc = SQLITE_TOOBIG;
goto vdbe_error_halt;
@@ -46936,7 +57748,7 @@ too_big:
*/
no_mem:
db->mallocFailed = 1;
- sqlite3SetString(&p->zErrMsg, "out of memory", (char*)0);
+ sqlite3SetString(&p->zErrMsg, db, "out of memory");
rc = SQLITE_NOMEM;
goto vdbe_error_halt;
@@ -46952,7 +57764,9 @@ abort_due_to_misuse:
abort_due_to_error:
assert( p->zErrMsg==0 );
if( db->mallocFailed ) rc = SQLITE_NOMEM;
- sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(rc), (char*)0);
+ if( rc!=SQLITE_IOERR_NOMEM ){
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
+ }
goto vdbe_error_halt;
/* Jump to here if the sqlite3_interrupt() API sets the interrupt
@@ -46962,7 +57776,7 @@ abort_due_to_interrupt:
assert( db->u1.isInterrupted );
rc = SQLITE_INTERRUPT;
p->rc = rc;
- sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(rc), (char*)0);
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
goto vdbe_error_halt;
}
@@ -46982,7 +57796,7 @@ abort_due_to_interrupt:
**
** This file contains code used to implement incremental BLOB I/O.
**
-** $Id: vdbeblob.c,v 1.22 2008/04/24 09:49:55 danielk1977 Exp $
+** $Id: vdbeblob.c,v 1.35 2009/07/02 07:47:33 danielk1977 Exp $
*/
@@ -47034,59 +57848,62 @@ SQLITE_API int sqlite3_blob_open(
static const VdbeOpList openBlob[] = {
{OP_Transaction, 0, 0, 0}, /* 0: Start a transaction */
{OP_VerifyCookie, 0, 0, 0}, /* 1: Check the schema cookie */
+ {OP_TableLock, 0, 0, 0}, /* 2: Acquire a read or write lock */
- /* One of the following two instructions is replaced by an
- ** OP_Noop before exection.
- */
- {OP_SetNumColumns, 0, 0, 0}, /* 2: Num cols for cursor */
+ /* One of the following two instructions is replaced by an OP_Noop. */
{OP_OpenRead, 0, 0, 0}, /* 3: Open cursor 0 for reading */
- {OP_SetNumColumns, 0, 0, 0}, /* 4: Num cols for cursor */
- {OP_OpenWrite, 0, 0, 0}, /* 5: Open cursor 0 for read/write */
-
- {OP_Variable, 1, 1, 0}, /* 6: Push the rowid to the stack */
- {OP_NotExists, 0, 10, 1}, /* 7: Seek the cursor */
- {OP_Column, 0, 0, 1}, /* 8 */
- {OP_ResultRow, 1, 0, 0}, /* 9 */
- {OP_Close, 0, 0, 0}, /* 10 */
- {OP_Halt, 0, 0, 0}, /* 11 */
+ {OP_OpenWrite, 0, 0, 0}, /* 4: Open cursor 0 for read/write */
+
+ {OP_Variable, 1, 1, 1}, /* 5: Push the rowid to the stack */
+ {OP_NotExists, 0, 9, 1}, /* 6: Seek the cursor */
+ {OP_Column, 0, 0, 1}, /* 7 */
+ {OP_ResultRow, 1, 0, 0}, /* 8 */
+ {OP_Close, 0, 0, 0}, /* 9 */
+ {OP_Halt, 0, 0, 0}, /* 10 */
};
Vdbe *v = 0;
int rc = SQLITE_OK;
- char zErr[128];
+ char *zErr = 0;
+ Table *pTab;
+ Parse *pParse;
- zErr[0] = 0;
+ *ppBlob = 0;
sqlite3_mutex_enter(db->mutex);
+ pParse = sqlite3StackAllocRaw(db, sizeof(*pParse));
+ if( pParse==0 ){
+ rc = SQLITE_NOMEM;
+ goto blob_open_out;
+ }
do {
- Parse sParse;
- Table *pTab;
-
- memset(&sParse, 0, sizeof(Parse));
- sParse.db = db;
+ memset(pParse, 0, sizeof(Parse));
+ pParse->db = db;
- rc = sqlite3SafetyOn(db);
- if( rc!=SQLITE_OK ){
+ if( sqlite3SafetyOn(db) ){
+ sqlite3DbFree(db, zErr);
+ sqlite3StackFree(db, pParse);
sqlite3_mutex_leave(db->mutex);
- return rc;
+ return SQLITE_MISUSE;
}
sqlite3BtreeEnterAll(db);
- pTab = sqlite3LocateTable(&sParse, 0, zTable, zDb);
+ pTab = sqlite3LocateTable(pParse, 0, zTable, zDb);
if( pTab && IsVirtual(pTab) ){
pTab = 0;
- sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable);
+ sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable);
}
#ifndef SQLITE_OMIT_VIEW
if( pTab && pTab->pSelect ){
pTab = 0;
- sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable);
+ sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable);
}
#endif
if( !pTab ){
- if( sParse.zErrMsg ){
- sqlite3_snprintf(sizeof(zErr), zErr, "%s", sParse.zErrMsg);
+ if( pParse->zErrMsg ){
+ sqlite3DbFree(db, zErr);
+ zErr = pParse->zErrMsg;
+ pParse->zErrMsg = 0;
}
- sqlite3_free(sParse.zErrMsg);
rc = SQLITE_ERROR;
(void)sqlite3SafetyOff(db);
sqlite3BtreeLeaveAll(db);
@@ -47100,7 +57917,8 @@ SQLITE_API int sqlite3_blob_open(
}
}
if( iCol==pTab->nCol ){
- sqlite3_snprintf(sizeof(zErr), zErr, "no such column: \"%s\"", zColumn);
+ sqlite3DbFree(db, zErr);
+ zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn);
rc = SQLITE_ERROR;
(void)sqlite3SafetyOff(db);
sqlite3BtreeLeaveAll(db);
@@ -47108,34 +57926,56 @@ SQLITE_API int sqlite3_blob_open(
}
/* If the value is being opened for writing, check that the
- ** column is not indexed. It is against the rules to open an
- ** indexed column for writing.
- */
+ ** column is not indexed, and that it is not part of a foreign key.
+ ** It is against the rules to open a column to which either of these
+ ** descriptions applies for writing. */
if( flags ){
+ const char *zFault = 0;
Index *pIdx;
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+ if( db->flags&SQLITE_ForeignKeys ){
+ /* Check that the column is not part of an FK child key definition. It
+ ** is not necessary to check if it is part of a parent key, as parent
+ ** key columns must be indexed. The check below will pick up this
+ ** case. */
+ FKey *pFKey;
+ for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ int j;
+ for(j=0; j<pFKey->nCol; j++){
+ if( pFKey->aCol[j].iFrom==iCol ){
+ zFault = "foreign key";
+ }
+ }
+ }
+ }
+#endif
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
int j;
for(j=0; j<pIdx->nColumn; j++){
if( pIdx->aiColumn[j]==iCol ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "cannot open indexed column for writing");
- rc = SQLITE_ERROR;
- (void)sqlite3SafetyOff(db);
- sqlite3BtreeLeaveAll(db);
- goto blob_open_out;
+ zFault = "indexed";
}
}
}
+ if( zFault ){
+ sqlite3DbFree(db, zErr);
+ zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault);
+ rc = SQLITE_ERROR;
+ (void)sqlite3SafetyOff(db);
+ sqlite3BtreeLeaveAll(db);
+ goto blob_open_out;
+ }
}
v = sqlite3VdbeCreate(db);
if( v ){
int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
sqlite3VdbeAddOpList(v, sizeof(openBlob)/sizeof(VdbeOpList), openBlob);
+ flags = !!flags; /* flags = (flags ? 1 : 0); */
/* Configure the OP_Transaction */
sqlite3VdbeChangeP1(v, 0, iDb);
- sqlite3VdbeChangeP2(v, 0, (flags ? 1 : 0));
+ sqlite3VdbeChangeP2(v, 0, flags);
/* Configure the OP_VerifyCookie */
sqlite3VdbeChangeP1(v, 1, iDb);
@@ -47144,29 +57984,35 @@ SQLITE_API int sqlite3_blob_open(
/* Make sure a mutex is held on the table to be accessed */
sqlite3VdbeUsesBtree(v, iDb);
+ /* Configure the OP_TableLock instruction */
+ sqlite3VdbeChangeP1(v, 2, iDb);
+ sqlite3VdbeChangeP2(v, 2, pTab->tnum);
+ sqlite3VdbeChangeP3(v, 2, flags);
+ sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT);
+
/* Remove either the OP_OpenWrite or OpenRead. Set the P2
- ** parameter of the other to pTab->tnum.
- */
- sqlite3VdbeChangeToNoop(v, (flags ? 3 : 5), 1);
- sqlite3VdbeChangeP2(v, (flags ? 5 : 3), pTab->tnum);
- sqlite3VdbeChangeP3(v, (flags ? 5 : 3), iDb);
+ ** parameter of the other to pTab->tnum. */
+ sqlite3VdbeChangeToNoop(v, 4 - flags, 1);
+ sqlite3VdbeChangeP2(v, 3 + flags, pTab->tnum);
+ sqlite3VdbeChangeP3(v, 3 + flags, iDb);
- /* Configure the OP_SetNumColumns. Configure the cursor to
+ /* Configure the number of columns. Configure the cursor to
** think that the table has one more column than it really
** does. An OP_Column to retrieve this imaginary column will
** always return an SQL NULL. This is useful because it means
** we can invoke OP_Column to fill in the vdbe cursors type
** and offset cache without causing any IO.
*/
- sqlite3VdbeChangeP2(v, flags ? 4 : 2, pTab->nCol+1);
+ sqlite3VdbeChangeP4(v, 3+flags, SQLITE_INT_TO_PTR(pTab->nCol+1),P4_INT32);
+ sqlite3VdbeChangeP2(v, 7, pTab->nCol);
if( !db->mallocFailed ){
- sqlite3VdbeMakeReady(v, 1, 1, 1, 0);
+ sqlite3VdbeMakeReady(v, 1, 1, 1, 0, 0, 0);
}
}
sqlite3BtreeLeaveAll(db);
rc = sqlite3SafetyOff(db);
- if( rc!=SQLITE_OK || db->mallocFailed ){
+ if( NEVER(rc!=SQLITE_OK) || db->mallocFailed ){
goto blob_open_out;
}
@@ -47175,7 +58021,8 @@ SQLITE_API int sqlite3_blob_open(
if( rc!=SQLITE_ROW ){
nAttempt++;
rc = sqlite3_finalize((sqlite3_stmt *)v);
- sqlite3_snprintf(sizeof(zErr), zErr, sqlite3_errmsg(db));
+ sqlite3DbFree(db, zErr);
+ zErr = sqlite3MPrintf(db, sqlite3_errmsg(db));
v = 0;
}
} while( nAttempt<5 && rc==SQLITE_SCHEMA );
@@ -47189,7 +58036,8 @@ SQLITE_API int sqlite3_blob_open(
u32 type = v->apCsr[0]->aType[iCol];
if( type<12 ){
- sqlite3_snprintf(sizeof(zErr), zErr, "cannot open value of type %s",
+ sqlite3DbFree(db, zErr);
+ zErr = sqlite3MPrintf(db, "cannot open value of type %s",
type==0?"null": type==7?"real": "integer"
);
rc = SQLITE_ERROR;
@@ -47197,7 +58045,7 @@ SQLITE_API int sqlite3_blob_open(
}
pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob));
if( db->mallocFailed ){
- sqlite3_free(pBlob);
+ sqlite3DbFree(db, pBlob);
goto blob_open_out;
}
pBlob->flags = flags;
@@ -47212,16 +58060,18 @@ SQLITE_API int sqlite3_blob_open(
*ppBlob = (sqlite3_blob *)pBlob;
rc = SQLITE_OK;
}else if( rc==SQLITE_OK ){
- sqlite3_snprintf(sizeof(zErr), zErr, "no such rowid: %lld", iRow);
+ sqlite3DbFree(db, zErr);
+ zErr = sqlite3MPrintf(db, "no such rowid: %lld", iRow);
rc = SQLITE_ERROR;
}
blob_open_out:
- zErr[sizeof(zErr)-1] = '\0';
- if( rc!=SQLITE_OK || db->mallocFailed ){
- sqlite3_finalize((sqlite3_stmt *)v);
+ if( v && (rc!=SQLITE_OK || db->mallocFailed) ){
+ sqlite3VdbeFinalize(v);
}
- sqlite3Error(db, rc, (rc==SQLITE_OK?0:zErr));
+ sqlite3Error(db, rc, zErr);
+ sqlite3DbFree(db, zErr);
+ sqlite3StackFree(db, pParse);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -47234,9 +58084,17 @@ blob_open_out:
SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){
Incrblob *p = (Incrblob *)pBlob;
int rc;
+ sqlite3 *db;
- rc = sqlite3_finalize(p->pStmt);
- sqlite3_free(p);
+ if( p ){
+ db = p->db;
+ sqlite3_mutex_enter(db->mutex);
+ rc = sqlite3_finalize(p->pStmt);
+ sqlite3DbFree(db, p);
+ sqlite3_mutex_leave(db->mutex);
+ }else{
+ rc = SQLITE_OK;
+ }
return rc;
}
@@ -47253,19 +58111,21 @@ static int blobReadWrite(
int rc;
Incrblob *p = (Incrblob *)pBlob;
Vdbe *v;
- sqlite3 *db = p->db;
+ sqlite3 *db;
- /* Request is out of range. Return a transient error. */
- if( (iOffset+n)>p->nByte ){
- return SQLITE_ERROR;
- }
+ if( p==0 ) return SQLITE_MISUSE;
+ db = p->db;
sqlite3_mutex_enter(db->mutex);
-
- /* If there is no statement handle, then the blob-handle has
- ** already been invalidated. Return SQLITE_ABORT in this case.
- */
v = (Vdbe*)p->pStmt;
- if( v==0 ){
+
+ if( n<0 || iOffset<0 || (iOffset+n)>p->nByte ){
+ /* Request is out of range. Return a transient error. */
+ rc = SQLITE_ERROR;
+ sqlite3Error(db, SQLITE_ERROR, 0);
+ } else if( v==0 ){
+ /* If there is no statement handle, then the blob-handle has
+ ** already been invalidated. Return SQLITE_ABORT in this case.
+ */
rc = SQLITE_ABORT;
}else{
/* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is
@@ -47310,7 +58170,7 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int
*/
SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){
Incrblob *p = (Incrblob *)pBlob;
- return p->nByte;
+ return p ? p->nByte : 0;
}
#endif /* #ifndef SQLITE_OMIT_INCRBLOB */
@@ -47329,7 +58189,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){
**
*************************************************************************
**
-** @(#) $Id: journal.c,v 1.8 2008/05/01 18:01:47 drh Exp $
+** @(#) $Id: journal.c,v 1.9 2009/01/20 17:06:27 danielk1977 Exp $
*/
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
@@ -47347,7 +58207,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){
**
** 1) The in-memory representation grows too large for the allocated
** buffer, or
-** 2) The xSync() method is called.
+** 2) The sqlite3JournalCreate() function is called.
*/
@@ -47413,8 +58273,9 @@ static int jrnlRead(
JournalFile *p = (JournalFile *)pJfd;
if( p->pReal ){
rc = sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst);
+ }else if( (iAmt+iOfst)>p->iSize ){
+ rc = SQLITE_IOERR_SHORT_READ;
}else{
- assert( iAmt+iOfst<=p->iSize );
memcpy(zBuf, &p->zBuf[iOfst], iAmt);
}
return rc;
@@ -47557,6 +58418,1573 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){
#endif
/************** End of journal.c *********************************************/
+/************** Begin file memjournal.c **************************************/
+/*
+** 2008 October 7
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file contains code use to implement an in-memory rollback journal.
+** The in-memory rollback journal is used to journal transactions for
+** ":memory:" databases and when the journal_mode=MEMORY pragma is used.
+**
+** @(#) $Id: memjournal.c,v 1.12 2009/05/04 11:42:30 danielk1977 Exp $
+*/
+
+/* Forward references to internal structures */
+typedef struct MemJournal MemJournal;
+typedef struct FilePoint FilePoint;
+typedef struct FileChunk FileChunk;
+
+/* Space to hold the rollback journal is allocated in increments of
+** this many bytes.
+**
+** The size chosen is a little less than a power of two. That way,
+** the FileChunk object will have a size that almost exactly fills
+** a power-of-two allocation. This mimimizes wasted space in power-of-two
+** memory allocators.
+*/
+#define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*)))
+
+/* Macro to find the minimum of two numeric values.
+*/
+#ifndef MIN
+# define MIN(x,y) ((x)<(y)?(x):(y))
+#endif
+
+/*
+** The rollback journal is composed of a linked list of these structures.
+*/
+struct FileChunk {
+ FileChunk *pNext; /* Next chunk in the journal */
+ u8 zChunk[JOURNAL_CHUNKSIZE]; /* Content of this chunk */
+};
+
+/*
+** An instance of this object serves as a cursor into the rollback journal.
+** The cursor can be either for reading or writing.
+*/
+struct FilePoint {
+ sqlite3_int64 iOffset; /* Offset from the beginning of the file */
+ FileChunk *pChunk; /* Specific chunk into which cursor points */
+};
+
+/*
+** This subclass is a subclass of sqlite3_file. Each open memory-journal
+** is an instance of this class.
+*/
+struct MemJournal {
+ sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */
+ FileChunk *pFirst; /* Head of in-memory chunk-list */
+ FilePoint endpoint; /* Pointer to the end of the file */
+ FilePoint readpoint; /* Pointer to the end of the last xRead() */
+};
+
+/*
+** Read data from the in-memory journal file. This is the implementation
+** of the sqlite3_vfs.xRead method.
+*/
+static int memjrnlRead(
+ sqlite3_file *pJfd, /* The journal file from which to read */
+ void *zBuf, /* Put the results here */
+ int iAmt, /* Number of bytes to read */
+ sqlite_int64 iOfst /* Begin reading at this offset */
+){
+ MemJournal *p = (MemJournal *)pJfd;
+ u8 *zOut = zBuf;
+ int nRead = iAmt;
+ int iChunkOffset;
+ FileChunk *pChunk;
+
+ /* SQLite never tries to read past the end of a rollback journal file */
+ assert( iOfst+iAmt<=p->endpoint.iOffset );
+
+ if( p->readpoint.iOffset!=iOfst || iOfst==0 ){
+ sqlite3_int64 iOff = 0;
+ for(pChunk=p->pFirst;
+ ALWAYS(pChunk) && (iOff+JOURNAL_CHUNKSIZE)<=iOfst;
+ pChunk=pChunk->pNext
+ ){
+ iOff += JOURNAL_CHUNKSIZE;
+ }
+ }else{
+ pChunk = p->readpoint.pChunk;
+ }
+
+ iChunkOffset = (int)(iOfst%JOURNAL_CHUNKSIZE);
+ do {
+ int iSpace = JOURNAL_CHUNKSIZE - iChunkOffset;
+ int nCopy = MIN(nRead, (JOURNAL_CHUNKSIZE - iChunkOffset));
+ memcpy(zOut, &pChunk->zChunk[iChunkOffset], nCopy);
+ zOut += nCopy;
+ nRead -= iSpace;
+ iChunkOffset = 0;
+ } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 );
+ p->readpoint.iOffset = iOfst+iAmt;
+ p->readpoint.pChunk = pChunk;
+
+ return SQLITE_OK;
+}
+
+/*
+** Write data to the file.
+*/
+static int memjrnlWrite(
+ sqlite3_file *pJfd, /* The journal file into which to write */
+ const void *zBuf, /* Take data to be written from here */
+ int iAmt, /* Number of bytes to write */
+ sqlite_int64 iOfst /* Begin writing at this offset into the file */
+){
+ MemJournal *p = (MemJournal *)pJfd;
+ int nWrite = iAmt;
+ u8 *zWrite = (u8 *)zBuf;
+
+ /* An in-memory journal file should only ever be appended to. Random
+ ** access writes are not required by sqlite.
+ */
+ assert( iOfst==p->endpoint.iOffset );
+ UNUSED_PARAMETER(iOfst);
+
+ while( nWrite>0 ){
+ FileChunk *pChunk = p->endpoint.pChunk;
+ int iChunkOffset = (int)(p->endpoint.iOffset%JOURNAL_CHUNKSIZE);
+ int iSpace = MIN(nWrite, JOURNAL_CHUNKSIZE - iChunkOffset);
+
+ if( iChunkOffset==0 ){
+ /* New chunk is required to extend the file. */
+ FileChunk *pNew = sqlite3_malloc(sizeof(FileChunk));
+ if( !pNew ){
+ return SQLITE_IOERR_NOMEM;
+ }
+ pNew->pNext = 0;
+ if( pChunk ){
+ assert( p->pFirst );
+ pChunk->pNext = pNew;
+ }else{
+ assert( !p->pFirst );
+ p->pFirst = pNew;
+ }
+ p->endpoint.pChunk = pNew;
+ }
+
+ memcpy(&p->endpoint.pChunk->zChunk[iChunkOffset], zWrite, iSpace);
+ zWrite += iSpace;
+ nWrite -= iSpace;
+ p->endpoint.iOffset += iSpace;
+ }
+
+ return SQLITE_OK;
+}
+
+/*
+** Truncate the file.
+*/
+static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){
+ MemJournal *p = (MemJournal *)pJfd;
+ FileChunk *pChunk;
+ assert(size==0);
+ UNUSED_PARAMETER(size);
+ pChunk = p->pFirst;
+ while( pChunk ){
+ FileChunk *pTmp = pChunk;
+ pChunk = pChunk->pNext;
+ sqlite3_free(pTmp);
+ }
+ sqlite3MemJournalOpen(pJfd);
+ return SQLITE_OK;
+}
+
+/*
+** Close the file.
+*/
+static int memjrnlClose(sqlite3_file *pJfd){
+ memjrnlTruncate(pJfd, 0);
+ return SQLITE_OK;
+}
+
+
+/*
+** Sync the file.
+**
+** Syncing an in-memory journal is a no-op. And, in fact, this routine
+** is never called in a working implementation. This implementation
+** exists purely as a contingency, in case some malfunction in some other
+** part of SQLite causes Sync to be called by mistake.
+*/
+static int memjrnlSync(sqlite3_file *NotUsed, int NotUsed2){ /*NO_TEST*/
+ UNUSED_PARAMETER2(NotUsed, NotUsed2); /*NO_TEST*/
+ assert( 0 ); /*NO_TEST*/
+ return SQLITE_OK; /*NO_TEST*/
+} /*NO_TEST*/
+
+/*
+** Query the size of the file in bytes.
+*/
+static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){
+ MemJournal *p = (MemJournal *)pJfd;
+ *pSize = (sqlite_int64) p->endpoint.iOffset;
+ return SQLITE_OK;
+}
+
+/*
+** Table of methods for MemJournal sqlite3_file object.
+*/
+static struct sqlite3_io_methods MemJournalMethods = {
+ 1, /* iVersion */
+ memjrnlClose, /* xClose */
+ memjrnlRead, /* xRead */
+ memjrnlWrite, /* xWrite */
+ memjrnlTruncate, /* xTruncate */
+ memjrnlSync, /* xSync */
+ memjrnlFileSize, /* xFileSize */
+ 0, /* xLock */
+ 0, /* xUnlock */
+ 0, /* xCheckReservedLock */
+ 0, /* xFileControl */
+ 0, /* xSectorSize */
+ 0 /* xDeviceCharacteristics */
+};
+
+/*
+** Open a journal file.
+*/
+SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){
+ MemJournal *p = (MemJournal *)pJfd;
+ assert( EIGHT_BYTE_ALIGNMENT(p) );
+ memset(p, 0, sqlite3MemJournalSize());
+ p->pMethod = &MemJournalMethods;
+}
+
+/*
+** Return true if the file-handle passed as an argument is
+** an in-memory journal
+*/
+SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *pJfd){
+ return pJfd->pMethods==&MemJournalMethods;
+}
+
+/*
+** Return the number of bytes required to store a MemJournal that uses vfs
+** pVfs to create the underlying on-disk files.
+*/
+SQLITE_PRIVATE int sqlite3MemJournalSize(void){
+ return sizeof(MemJournal);
+}
+
+/************** End of memjournal.c ******************************************/
+/************** Begin file walker.c ******************************************/
+/*
+** 2008 August 16
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains routines used for walking the parser tree for
+** an SQL statement.
+**
+** $Id: walker.c,v 1.7 2009/06/15 23:15:59 drh Exp $
+*/
+
+
+/*
+** Walk an expression tree. Invoke the callback once for each node
+** of the expression, while decending. (In other words, the callback
+** is invoked before visiting children.)
+**
+** The return value from the callback should be one of the WRC_*
+** constants to specify how to proceed with the walk.
+**
+** WRC_Continue Continue descending down the tree.
+**
+** WRC_Prune Do not descend into child nodes. But allow
+** the walk to continue with sibling nodes.
+**
+** WRC_Abort Do no more callbacks. Unwind the stack and
+** return the top-level walk call.
+**
+** The return value from this routine is WRC_Abort to abandon the tree walk
+** and WRC_Continue to continue.
+*/
+SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){
+ int rc;
+ if( pExpr==0 ) return WRC_Continue;
+ testcase( ExprHasProperty(pExpr, EP_TokenOnly) );
+ testcase( ExprHasProperty(pExpr, EP_Reduced) );
+ rc = pWalker->xExprCallback(pWalker, pExpr);
+ if( rc==WRC_Continue
+ && !ExprHasAnyProperty(pExpr,EP_TokenOnly) ){
+ if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort;
+ if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort;
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort;
+ }else{
+ if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
+ }
+ }
+ return rc & WRC_Abort;
+}
+
+/*
+** Call sqlite3WalkExpr() for every expression in list p or until
+** an abort request is seen.
+*/
+SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){
+ int i;
+ struct ExprList_item *pItem;
+ if( p ){
+ for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){
+ if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort;
+ }
+ }
+ return WRC_Continue;
+}
+
+/*
+** Walk all expressions associated with SELECT statement p. Do
+** not invoke the SELECT callback on p, but do (of course) invoke
+** any expr callbacks and SELECT callbacks that come from subqueries.
+** Return WRC_Abort or WRC_Continue.
+*/
+SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
+ if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort;
+ if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort;
+ if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort;
+ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort;
+ if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort;
+ if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort;
+ if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort;
+ return WRC_Continue;
+}
+
+/*
+** Walk the parse trees associated with all subqueries in the
+** FROM clause of SELECT statement p. Do not invoke the select
+** callback on p, but do invoke it on each FROM clause subquery
+** and on any subqueries further down in the tree. Return
+** WRC_Abort or WRC_Continue;
+*/
+SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
+ SrcList *pSrc;
+ int i;
+ struct SrcList_item *pItem;
+
+ pSrc = p->pSrc;
+ if( ALWAYS(pSrc) ){
+ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
+ if( sqlite3WalkSelect(pWalker, pItem->pSelect) ){
+ return WRC_Abort;
+ }
+ }
+ }
+ return WRC_Continue;
+}
+
+/*
+** Call sqlite3WalkExpr() for every expression in Select statement p.
+** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and
+** on the compound select chain, p->pPrior.
+**
+** Return WRC_Continue under normal conditions. Return WRC_Abort if
+** there is an abort request.
+**
+** If the Walker does not have an xSelectCallback() then this routine
+** is a no-op returning WRC_Continue.
+*/
+SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){
+ int rc;
+ if( p==0 || pWalker->xSelectCallback==0 ) return WRC_Continue;
+ rc = WRC_Continue;
+ while( p ){
+ rc = pWalker->xSelectCallback(pWalker, p);
+ if( rc ) break;
+ if( sqlite3WalkSelectExpr(pWalker, p) ) return WRC_Abort;
+ if( sqlite3WalkSelectFrom(pWalker, p) ) return WRC_Abort;
+ p = p->pPrior;
+ }
+ return rc & WRC_Abort;
+}
+
+/************** End of walker.c **********************************************/
+/************** Begin file resolve.c *****************************************/
+/*
+** 2008 August 18
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file contains routines used for walking the parser tree and
+** resolve all identifiers by associating them with a particular
+** table and column.
+**
+** $Id: resolve.c,v 1.30 2009/06/15 23:15:59 drh Exp $
+*/
+
+/*
+** Turn the pExpr expression into an alias for the iCol-th column of the
+** result set in pEList.
+**
+** If the result set column is a simple column reference, then this routine
+** makes an exact copy. But for any other kind of expression, this
+** routine make a copy of the result set column as the argument to the
+** TK_AS operator. The TK_AS operator causes the expression to be
+** evaluated just once and then reused for each alias.
+**
+** The reason for suppressing the TK_AS term when the expression is a simple
+** column reference is so that the column reference will be recognized as
+** usable by indices within the WHERE clause processing logic.
+**
+** Hack: The TK_AS operator is inhibited if zType[0]=='G'. This means
+** that in a GROUP BY clause, the expression is evaluated twice. Hence:
+**
+** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x
+**
+** Is equivalent to:
+**
+** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5
+**
+** The result of random()%5 in the GROUP BY clause is probably different
+** from the result in the result-set. We might fix this someday. Or
+** then again, we might not...
+*/
+static void resolveAlias(
+ Parse *pParse, /* Parsing context */
+ ExprList *pEList, /* A result set */
+ int iCol, /* A column in the result set. 0..pEList->nExpr-1 */
+ Expr *pExpr, /* Transform this into an alias to the result set */
+ const char *zType /* "GROUP" or "ORDER" or "" */
+){
+ Expr *pOrig; /* The iCol-th column of the result set */
+ Expr *pDup; /* Copy of pOrig */
+ sqlite3 *db; /* The database connection */
+
+ assert( iCol>=0 && iCol<pEList->nExpr );
+ pOrig = pEList->a[iCol].pExpr;
+ assert( pOrig!=0 );
+ assert( pOrig->flags & EP_Resolved );
+ db = pParse->db;
+ if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){
+ pDup = sqlite3ExprDup(db, pOrig, 0);
+ pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0);
+ if( pDup==0 ) return;
+ if( pEList->a[iCol].iAlias==0 ){
+ pEList->a[iCol].iAlias = (u16)(++pParse->nAlias);
+ }
+ pDup->iTable = pEList->a[iCol].iAlias;
+ }else if( ExprHasProperty(pOrig, EP_IntValue) || pOrig->u.zToken==0 ){
+ pDup = sqlite3ExprDup(db, pOrig, 0);
+ if( pDup==0 ) return;
+ }else{
+ char *zToken = pOrig->u.zToken;
+ assert( zToken!=0 );
+ pOrig->u.zToken = 0;
+ pDup = sqlite3ExprDup(db, pOrig, 0);
+ pOrig->u.zToken = zToken;
+ if( pDup==0 ) return;
+ assert( (pDup->flags & (EP_Reduced|EP_TokenOnly))==0 );
+ pDup->flags2 |= EP2_MallocedToken;
+ pDup->u.zToken = sqlite3DbStrDup(db, zToken);
+ }
+ if( pExpr->flags & EP_ExpCollate ){
+ pDup->pColl = pExpr->pColl;
+ pDup->flags |= EP_ExpCollate;
+ }
+ sqlite3ExprClear(db, pExpr);
+ memcpy(pExpr, pDup, sizeof(*pExpr));
+ sqlite3DbFree(db, pDup);
+}
+
+/*
+** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
+** that name in the set of source tables in pSrcList and make the pExpr
+** expression node refer back to that source column. The following changes
+** are made to pExpr:
+**
+** pExpr->iDb Set the index in db->aDb[] of the database X
+** (even if X is implied).
+** pExpr->iTable Set to the cursor number for the table obtained
+** from pSrcList.
+** pExpr->pTab Points to the Table structure of X.Y (even if
+** X and/or Y are implied.)
+** pExpr->iColumn Set to the column number within the table.
+** pExpr->op Set to TK_COLUMN.
+** pExpr->pLeft Any expression this points to is deleted
+** pExpr->pRight Any expression this points to is deleted.
+**
+** The zDb variable is the name of the database (the "X"). This value may be
+** NULL meaning that name is of the form Y.Z or Z. Any available database
+** can be used. The zTable variable is the name of the table (the "Y"). This
+** value can be NULL if zDb is also NULL. If zTable is NULL it
+** means that the form of the name is Z and that columns from any table
+** can be used.
+**
+** If the name cannot be resolved unambiguously, leave an error message
+** in pParse and return WRC_Abort. Return WRC_Prune on success.
+*/
+static int lookupName(
+ Parse *pParse, /* The parsing context */
+ const char *zDb, /* Name of the database containing table, or NULL */
+ const char *zTab, /* Name of table containing column, or NULL */
+ const char *zCol, /* Name of the column. */
+ NameContext *pNC, /* The name context used to resolve the name */
+ Expr *pExpr /* Make this EXPR node point to the selected column */
+){
+ int i, j; /* Loop counters */
+ int cnt = 0; /* Number of matching column names */
+ int cntTab = 0; /* Number of matching table names */
+ sqlite3 *db = pParse->db; /* The database connection */
+ struct SrcList_item *pItem; /* Use for looping over pSrcList items */
+ struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
+ NameContext *pTopNC = pNC; /* First namecontext in the list */
+ Schema *pSchema = 0; /* Schema of the expression */
+ int isTrigger = 0;
+
+ assert( pNC ); /* the name context cannot be NULL. */
+ assert( zCol ); /* The Z in X.Y.Z cannot be NULL */
+ assert( ~ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
+
+ /* Initialize the node to no-match */
+ pExpr->iTable = -1;
+ pExpr->pTab = 0;
+ ExprSetIrreducible(pExpr);
+
+ /* Start at the inner-most context and move outward until a match is found */
+ while( pNC && cnt==0 ){
+ ExprList *pEList;
+ SrcList *pSrcList = pNC->pSrcList;
+
+ if( pSrcList ){
+ for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){
+ Table *pTab;
+ int iDb;
+ Column *pCol;
+
+ pTab = pItem->pTab;
+ assert( pTab!=0 && pTab->zName!=0 );
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ assert( pTab->nCol>0 );
+ if( zTab ){
+ if( pItem->zAlias ){
+ char *zTabName = pItem->zAlias;
+ if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
+ }else{
+ char *zTabName = pTab->zName;
+ if( NEVER(zTabName==0) || sqlite3StrICmp(zTabName, zTab)!=0 ){
+ continue;
+ }
+ if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){
+ continue;
+ }
+ }
+ }
+ if( 0==(cntTab++) ){
+ pExpr->iTable = pItem->iCursor;
+ pExpr->pTab = pTab;
+ pSchema = pTab->pSchema;
+ pMatch = pItem;
+ }
+ for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
+ if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
+ IdList *pUsing;
+ cnt++;
+ pExpr->iTable = pItem->iCursor;
+ pExpr->pTab = pTab;
+ pMatch = pItem;
+ pSchema = pTab->pSchema;
+ /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
+ pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j;
+ if( i<pSrcList->nSrc-1 ){
+ if( pItem[1].jointype & JT_NATURAL ){
+ /* If this match occurred in the left table of a natural join,
+ ** then skip the right table to avoid a duplicate match */
+ pItem++;
+ i++;
+ }else if( (pUsing = pItem[1].pUsing)!=0 ){
+ /* If this match occurs on a column that is in the USING clause
+ ** of a join, skip the search of the right table of the join
+ ** to avoid a duplicate match there. */
+ int k;
+ for(k=0; k<pUsing->nId; k++){
+ if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){
+ pItem++;
+ i++;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+#ifndef SQLITE_OMIT_TRIGGER
+ /* If we have not already resolved the name, then maybe
+ ** it is a new.* or old.* trigger argument reference
+ */
+ if( zDb==0 && zTab!=0 && cnt==0 && pParse->pTriggerTab!=0 ){
+ int op = pParse->eTriggerOp;
+ Table *pTab = 0;
+ assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
+ if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
+ pExpr->iTable = 1;
+ pTab = pParse->pTriggerTab;
+ }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
+ pExpr->iTable = 0;
+ pTab = pParse->pTriggerTab;
+ }
+
+ if( pTab ){
+ int iCol;
+ pSchema = pTab->pSchema;
+ cntTab++;
+ if( sqlite3IsRowid(zCol) ){
+ iCol = -1;
+ }else{
+ for(iCol=0; iCol<pTab->nCol; iCol++){
+ Column *pCol = &pTab->aCol[iCol];
+ if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
+ if( iCol==pTab->iPKey ){
+ iCol = -1;
+ }
+ break;
+ }
+ }
+ }
+ if( iCol<pTab->nCol ){
+ cnt++;
+ if( iCol<0 ){
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ }else if( pExpr->iTable==0 ){
+ testcase( iCol==31 );
+ testcase( iCol==32 );
+ pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
+ }
+ pExpr->iColumn = (i16)iCol;
+ pExpr->pTab = pTab;
+ isTrigger = 1;
+ }
+ }
+ }
+#endif /* !defined(SQLITE_OMIT_TRIGGER) */
+
+ /*
+ ** Perhaps the name is a reference to the ROWID
+ */
+ if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){
+ cnt = 1;
+ pExpr->iColumn = -1;
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ }
+
+ /*
+ ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
+ ** might refer to an result-set alias. This happens, for example, when
+ ** we are resolving names in the WHERE clause of the following command:
+ **
+ ** SELECT a+b AS x FROM table WHERE x<10;
+ **
+ ** In cases like this, replace pExpr with a copy of the expression that
+ ** forms the result set entry ("a+b" in the example) and return immediately.
+ ** Note that the expression in the result set should have already been
+ ** resolved by the time the WHERE clause is resolved.
+ */
+ if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){
+ for(j=0; j<pEList->nExpr; j++){
+ char *zAs = pEList->a[j].zName;
+ if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
+ Expr *pOrig;
+ assert( pExpr->pLeft==0 && pExpr->pRight==0 );
+ assert( pExpr->x.pList==0 );
+ assert( pExpr->x.pSelect==0 );
+ pOrig = pEList->a[j].pExpr;
+ if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){
+ sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
+ return WRC_Abort;
+ }
+ resolveAlias(pParse, pEList, j, pExpr, "");
+ cnt = 1;
+ pMatch = 0;
+ assert( zTab==0 && zDb==0 );
+ goto lookupname_end;
+ }
+ }
+ }
+
+ /* Advance to the next name context. The loop will exit when either
+ ** we have a match (cnt>0) or when we run out of name contexts.
+ */
+ if( cnt==0 ){
+ pNC = pNC->pNext;
+ }
+ }
+
+ /*
+ ** If X and Y are NULL (in other words if only the column name Z is
+ ** supplied) and the value of Z is enclosed in double-quotes, then
+ ** Z is a string literal if it doesn't match any column names. In that
+ ** case, we need to return right away and not make any changes to
+ ** pExpr.
+ **
+ ** Because no reference was made to outer contexts, the pNC->nRef
+ ** fields are not changed in any context.
+ */
+ if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){
+ pExpr->op = TK_STRING;
+ pExpr->pTab = 0;
+ return WRC_Prune;
+ }
+
+ /*
+ ** cnt==0 means there was not match. cnt>1 means there were two or
+ ** more matches. Either way, we have an error.
+ */
+ if( cnt!=1 ){
+ const char *zErr;
+ zErr = cnt==0 ? "no such column" : "ambiguous column name";
+ if( zDb ){
+ sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol);
+ }else if( zTab ){
+ sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol);
+ }else{
+ sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol);
+ }
+ pTopNC->nErr++;
+ }
+
+ /* If a column from a table in pSrcList is referenced, then record
+ ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes
+ ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the
+ ** column number is greater than the number of bits in the bitmask
+ ** then set the high-order bit of the bitmask.
+ */
+ if( pExpr->iColumn>=0 && pMatch!=0 ){
+ int n = pExpr->iColumn;
+ testcase( n==BMS-1 );
+ if( n>=BMS ){
+ n = BMS-1;
+ }
+ assert( pMatch->iCursor==pExpr->iTable );
+ pMatch->colUsed |= ((Bitmask)1)<<n;
+ }
+
+ /* Clean up and return
+ */
+ sqlite3ExprDelete(db, pExpr->pLeft);
+ pExpr->pLeft = 0;
+ sqlite3ExprDelete(db, pExpr->pRight);
+ pExpr->pRight = 0;
+ pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN);
+lookupname_end:
+ if( cnt==1 ){
+ assert( pNC!=0 );
+ sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
+ /* Increment the nRef value on all name contexts from TopNC up to
+ ** the point where the name matched. */
+ for(;;){
+ assert( pTopNC!=0 );
+ pTopNC->nRef++;
+ if( pTopNC==pNC ) break;
+ pTopNC = pTopNC->pNext;
+ }
+ return WRC_Prune;
+ } else {
+ return WRC_Abort;
+ }
+}
+
+/*
+** This routine is callback for sqlite3WalkExpr().
+**
+** Resolve symbolic names into TK_COLUMN operators for the current
+** node in the expression tree. Return 0 to continue the search down
+** the tree or 2 to abort the tree walk.
+**
+** This routine also does error checking and name resolution for
+** function names. The operator for aggregate functions is changed
+** to TK_AGG_FUNCTION.
+*/
+static int resolveExprStep(Walker *pWalker, Expr *pExpr){
+ NameContext *pNC;
+ Parse *pParse;
+
+ pNC = pWalker->u.pNC;
+ assert( pNC!=0 );
+ pParse = pNC->pParse;
+ assert( pParse==pWalker->pParse );
+
+ if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return WRC_Prune;
+ ExprSetProperty(pExpr, EP_Resolved);
+#ifndef NDEBUG
+ if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){
+ SrcList *pSrcList = pNC->pSrcList;
+ int i;
+ for(i=0; i<pNC->pSrcList->nSrc; i++){
+ assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab);
+ }
+ }
+#endif
+ switch( pExpr->op ){
+
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
+ /* The special operator TK_ROW means use the rowid for the first
+ ** column in the FROM clause. This is used by the LIMIT and ORDER BY
+ ** clause processing on UPDATE and DELETE statements.
+ */
+ case TK_ROW: {
+ SrcList *pSrcList = pNC->pSrcList;
+ struct SrcList_item *pItem;
+ assert( pSrcList && pSrcList->nSrc==1 );
+ pItem = pSrcList->a;
+ pExpr->op = TK_COLUMN;
+ pExpr->pTab = pItem->pTab;
+ pExpr->iTable = pItem->iCursor;
+ pExpr->iColumn = -1;
+ pExpr->affinity = SQLITE_AFF_INTEGER;
+ break;
+ }
+#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */
+
+ /* A lone identifier is the name of a column.
+ */
+ case TK_ID: {
+ return lookupName(pParse, 0, 0, pExpr->u.zToken, pNC, pExpr);
+ }
+
+ /* A table name and column name: ID.ID
+ ** Or a database, table and column: ID.ID.ID
+ */
+ case TK_DOT: {
+ const char *zColumn;
+ const char *zTable;
+ const char *zDb;
+ Expr *pRight;
+
+ /* if( pSrcList==0 ) break; */
+ pRight = pExpr->pRight;
+ if( pRight->op==TK_ID ){
+ zDb = 0;
+ zTable = pExpr->pLeft->u.zToken;
+ zColumn = pRight->u.zToken;
+ }else{
+ assert( pRight->op==TK_DOT );
+ zDb = pExpr->pLeft->u.zToken;
+ zTable = pRight->pLeft->u.zToken;
+ zColumn = pRight->pRight->u.zToken;
+ }
+ return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr);
+ }
+
+ /* Resolve function names
+ */
+ case TK_CONST_FUNC:
+ case TK_FUNCTION: {
+ ExprList *pList = pExpr->x.pList; /* The argument list */
+ int n = pList ? pList->nExpr : 0; /* Number of arguments */
+ int no_such_func = 0; /* True if no such function exists */
+ int wrong_num_args = 0; /* True if wrong number of arguments */
+ int is_agg = 0; /* True if is an aggregate function */
+ int auth; /* Authorization to use the function */
+ int nId; /* Number of characters in function name */
+ const char *zId; /* The function name. */
+ FuncDef *pDef; /* Information about the function */
+ u8 enc = ENC(pParse->db); /* The database encoding */
+
+ testcase( pExpr->op==TK_CONST_FUNC );
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ zId = pExpr->u.zToken;
+ nId = sqlite3Strlen30(zId);
+ pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0);
+ if( pDef==0 ){
+ pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0);
+ if( pDef==0 ){
+ no_such_func = 1;
+ }else{
+ wrong_num_args = 1;
+ }
+ }else{
+ is_agg = pDef->xFunc==0;
+ }
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ if( pDef ){
+ auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0);
+ if( auth!=SQLITE_OK ){
+ if( auth==SQLITE_DENY ){
+ sqlite3ErrorMsg(pParse, "not authorized to use function: %s",
+ pDef->zName);
+ pNC->nErr++;
+ }
+ pExpr->op = TK_NULL;
+ return WRC_Prune;
+ }
+ }
+#endif
+ if( is_agg && !pNC->allowAgg ){
+ sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
+ pNC->nErr++;
+ is_agg = 0;
+ }else if( no_such_func ){
+ sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
+ pNC->nErr++;
+ }else if( wrong_num_args ){
+ sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
+ nId, zId);
+ pNC->nErr++;
+ }
+ if( is_agg ){
+ pExpr->op = TK_AGG_FUNCTION;
+ pNC->hasAgg = 1;
+ }
+ if( is_agg ) pNC->allowAgg = 0;
+ sqlite3WalkExprList(pWalker, pList);
+ if( is_agg ) pNC->allowAgg = 1;
+ /* FIX ME: Compute pExpr->affinity based on the expected return
+ ** type of the function
+ */
+ return WRC_Prune;
+ }
+#ifndef SQLITE_OMIT_SUBQUERY
+ case TK_SELECT:
+ case TK_EXISTS: testcase( pExpr->op==TK_EXISTS );
+#endif
+ case TK_IN: {
+ testcase( pExpr->op==TK_IN );
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ int nRef = pNC->nRef;
+#ifndef SQLITE_OMIT_CHECK
+ if( pNC->isCheck ){
+ sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints");
+ }
+#endif
+ sqlite3WalkSelect(pWalker, pExpr->x.pSelect);
+ assert( pNC->nRef>=nRef );
+ if( nRef!=pNC->nRef ){
+ ExprSetProperty(pExpr, EP_VarSelect);
+ }
+ }
+ break;
+ }
+#ifndef SQLITE_OMIT_CHECK
+ case TK_VARIABLE: {
+ if( pNC->isCheck ){
+ sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints");
+ }
+ break;
+ }
+#endif
+ }
+ return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue;
+}
+
+/*
+** pEList is a list of expressions which are really the result set of the
+** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause.
+** This routine checks to see if pE is a simple identifier which corresponds
+** to the AS-name of one of the terms of the expression list. If it is,
+** this routine return an integer between 1 and N where N is the number of
+** elements in pEList, corresponding to the matching entry. If there is
+** no match, or if pE is not a simple identifier, then this routine
+** return 0.
+**
+** pEList has been resolved. pE has not.
+*/
+static int resolveAsName(
+ Parse *pParse, /* Parsing context for error messages */
+ ExprList *pEList, /* List of expressions to scan */
+ Expr *pE /* Expression we are trying to match */
+){
+ int i; /* Loop counter */
+
+ UNUSED_PARAMETER(pParse);
+
+ if( pE->op==TK_ID ){
+ char *zCol = pE->u.zToken;
+ for(i=0; i<pEList->nExpr; i++){
+ char *zAs = pEList->a[i].zName;
+ if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
+ return i+1;
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+** pE is a pointer to an expression which is a single term in the
+** ORDER BY of a compound SELECT. The expression has not been
+** name resolved.
+**
+** At the point this routine is called, we already know that the
+** ORDER BY term is not an integer index into the result set. That
+** case is handled by the calling routine.
+**
+** Attempt to match pE against result set columns in the left-most
+** SELECT statement. Return the index i of the matching column,
+** as an indication to the caller that it should sort by the i-th column.
+** The left-most column is 1. In other words, the value returned is the
+** same integer value that would be used in the SQL statement to indicate
+** the column.
+**
+** If there is no match, return 0. Return -1 if an error occurs.
+*/
+static int resolveOrderByTermToExprList(
+ Parse *pParse, /* Parsing context for error messages */
+ Select *pSelect, /* The SELECT statement with the ORDER BY clause */
+ Expr *pE /* The specific ORDER BY term */
+){
+ int i; /* Loop counter */
+ ExprList *pEList; /* The columns of the result set */
+ NameContext nc; /* Name context for resolving pE */
+
+ assert( sqlite3ExprIsInteger(pE, &i)==0 );
+ pEList = pSelect->pEList;
+
+ /* Resolve all names in the ORDER BY term expression
+ */
+ memset(&nc, 0, sizeof(nc));
+ nc.pParse = pParse;
+ nc.pSrcList = pSelect->pSrc;
+ nc.pEList = pEList;
+ nc.allowAgg = 1;
+ nc.nErr = 0;
+ if( sqlite3ResolveExprNames(&nc, pE) ){
+ sqlite3ErrorClear(pParse);
+ return 0;
+ }
+
+ /* Try to match the ORDER BY expression against an expression
+ ** in the result set. Return an 1-based index of the matching
+ ** result-set entry.
+ */
+ for(i=0; i<pEList->nExpr; i++){
+ if( sqlite3ExprCompare(pEList->a[i].pExpr, pE) ){
+ return i+1;
+ }
+ }
+
+ /* If no match, return 0. */
+ return 0;
+}
+
+/*
+** Generate an ORDER BY or GROUP BY term out-of-range error.
+*/
+static void resolveOutOfRangeError(
+ Parse *pParse, /* The error context into which to write the error */
+ const char *zType, /* "ORDER" or "GROUP" */
+ int i, /* The index (1-based) of the term out of range */
+ int mx /* Largest permissible value of i */
+){
+ sqlite3ErrorMsg(pParse,
+ "%r %s BY term out of range - should be "
+ "between 1 and %d", i, zType, mx);
+}
+
+/*
+** Analyze the ORDER BY clause in a compound SELECT statement. Modify
+** each term of the ORDER BY clause is a constant integer between 1
+** and N where N is the number of columns in the compound SELECT.
+**
+** ORDER BY terms that are already an integer between 1 and N are
+** unmodified. ORDER BY terms that are integers outside the range of
+** 1 through N generate an error. ORDER BY terms that are expressions
+** are matched against result set expressions of compound SELECT
+** beginning with the left-most SELECT and working toward the right.
+** At the first match, the ORDER BY expression is transformed into
+** the integer column number.
+**
+** Return the number of errors seen.
+*/
+static int resolveCompoundOrderBy(
+ Parse *pParse, /* Parsing context. Leave error messages here */
+ Select *pSelect /* The SELECT statement containing the ORDER BY */
+){
+ int i;
+ ExprList *pOrderBy;
+ ExprList *pEList;
+ sqlite3 *db;
+ int moreToDo = 1;
+
+ pOrderBy = pSelect->pOrderBy;
+ if( pOrderBy==0 ) return 0;
+ db = pParse->db;
+#if SQLITE_MAX_COLUMN
+ if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
+ sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause");
+ return 1;
+ }
+#endif
+ for(i=0; i<pOrderBy->nExpr; i++){
+ pOrderBy->a[i].done = 0;
+ }
+ pSelect->pNext = 0;
+ while( pSelect->pPrior ){
+ pSelect->pPrior->pNext = pSelect;
+ pSelect = pSelect->pPrior;
+ }
+ while( pSelect && moreToDo ){
+ struct ExprList_item *pItem;
+ moreToDo = 0;
+ pEList = pSelect->pEList;
+ assert( pEList!=0 );
+ for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
+ int iCol = -1;
+ Expr *pE, *pDup;
+ if( pItem->done ) continue;
+ pE = pItem->pExpr;
+ if( sqlite3ExprIsInteger(pE, &iCol) ){
+ if( iCol<=0 || iCol>pEList->nExpr ){
+ resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
+ return 1;
+ }
+ }else{
+ iCol = resolveAsName(pParse, pEList, pE);
+ if( iCol==0 ){
+ pDup = sqlite3ExprDup(db, pE, 0);
+ if( !db->mallocFailed ){
+ assert(pDup);
+ iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup);
+ }
+ sqlite3ExprDelete(db, pDup);
+ }
+ }
+ if( iCol>0 ){
+ CollSeq *pColl = pE->pColl;
+ int flags = pE->flags & EP_ExpCollate;
+ sqlite3ExprDelete(db, pE);
+ pItem->pExpr = pE = sqlite3Expr(db, TK_INTEGER, 0);
+ if( pE==0 ) return 1;
+ pE->pColl = pColl;
+ pE->flags |= EP_IntValue | flags;
+ pE->u.iValue = iCol;
+ pItem->iCol = (u16)iCol;
+ pItem->done = 1;
+ }else{
+ moreToDo = 1;
+ }
+ }
+ pSelect = pSelect->pNext;
+ }
+ for(i=0; i<pOrderBy->nExpr; i++){
+ if( pOrderBy->a[i].done==0 ){
+ sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
+ "column in the result set", i+1);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/*
+** Check every term in the ORDER BY or GROUP BY clause pOrderBy of
+** the SELECT statement pSelect. If any term is reference to a
+** result set expression (as determined by the ExprList.a.iCol field)
+** then convert that term into a copy of the corresponding result set
+** column.
+**
+** If any errors are detected, add an error message to pParse and
+** return non-zero. Return zero if no errors are seen.
+*/
+SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(
+ Parse *pParse, /* Parsing context. Leave error messages here */
+ Select *pSelect, /* The SELECT statement containing the clause */
+ ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */
+ const char *zType /* "ORDER" or "GROUP" */
+){
+ int i;
+ sqlite3 *db = pParse->db;
+ ExprList *pEList;
+ struct ExprList_item *pItem;
+
+ if( pOrderBy==0 || pParse->db->mallocFailed ) return 0;
+#if SQLITE_MAX_COLUMN
+ if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
+ sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType);
+ return 1;
+ }
+#endif
+ pEList = pSelect->pEList;
+ assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */
+ for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
+ if( pItem->iCol ){
+ if( pItem->iCol>pEList->nExpr ){
+ resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr);
+ return 1;
+ }
+ resolveAlias(pParse, pEList, pItem->iCol-1, pItem->pExpr, zType);
+ }
+ }
+ return 0;
+}
+
+/*
+** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect.
+** The Name context of the SELECT statement is pNC. zType is either
+** "ORDER" or "GROUP" depending on which type of clause pOrderBy is.
+**
+** This routine resolves each term of the clause into an expression.
+** If the order-by term is an integer I between 1 and N (where N is the
+** number of columns in the result set of the SELECT) then the expression
+** in the resolution is a copy of the I-th result-set expression. If
+** the order-by term is an identify that corresponds to the AS-name of
+** a result-set expression, then the term resolves to a copy of the
+** result-set expression. Otherwise, the expression is resolved in
+** the usual way - using sqlite3ResolveExprNames().
+**
+** This routine returns the number of errors. If errors occur, then
+** an appropriate error message might be left in pParse. (OOM errors
+** excepted.)
+*/
+static int resolveOrderGroupBy(
+ NameContext *pNC, /* The name context of the SELECT statement */
+ Select *pSelect, /* The SELECT statement holding pOrderBy */
+ ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */
+ const char *zType /* Either "ORDER" or "GROUP", as appropriate */
+){
+ int i; /* Loop counter */
+ int iCol; /* Column number */
+ struct ExprList_item *pItem; /* A term of the ORDER BY clause */
+ Parse *pParse; /* Parsing context */
+ int nResult; /* Number of terms in the result set */
+
+ if( pOrderBy==0 ) return 0;
+ nResult = pSelect->pEList->nExpr;
+ pParse = pNC->pParse;
+ for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
+ Expr *pE = pItem->pExpr;
+ iCol = resolveAsName(pParse, pSelect->pEList, pE);
+ if( iCol>0 ){
+ /* If an AS-name match is found, mark this ORDER BY column as being
+ ** a copy of the iCol-th result-set column. The subsequent call to
+ ** sqlite3ResolveOrderGroupBy() will convert the expression to a
+ ** copy of the iCol-th result-set expression. */
+ pItem->iCol = (u16)iCol;
+ continue;
+ }
+ if( sqlite3ExprIsInteger(pE, &iCol) ){
+ /* The ORDER BY term is an integer constant. Again, set the column
+ ** number so that sqlite3ResolveOrderGroupBy() will convert the
+ ** order-by term to a copy of the result-set expression */
+ if( iCol<1 ){
+ resolveOutOfRangeError(pParse, zType, i+1, nResult);
+ return 1;
+ }
+ pItem->iCol = (u16)iCol;
+ continue;
+ }
+
+ /* Otherwise, treat the ORDER BY term as an ordinary expression */
+ pItem->iCol = 0;
+ if( sqlite3ResolveExprNames(pNC, pE) ){
+ return 1;
+ }
+ }
+ return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType);
+}
+
+/*
+** Resolve names in the SELECT statement p and all of its descendents.
+*/
+static int resolveSelectStep(Walker *pWalker, Select *p){
+ NameContext *pOuterNC; /* Context that contains this SELECT */
+ NameContext sNC; /* Name context of this SELECT */
+ int isCompound; /* True if p is a compound select */
+ int nCompound; /* Number of compound terms processed so far */
+ Parse *pParse; /* Parsing context */
+ ExprList *pEList; /* Result set expression list */
+ int i; /* Loop counter */
+ ExprList *pGroupBy; /* The GROUP BY clause */
+ Select *pLeftmost; /* Left-most of SELECT of a compound */
+ sqlite3 *db; /* Database connection */
+
+
+ assert( p!=0 );
+ if( p->selFlags & SF_Resolved ){
+ return WRC_Prune;
+ }
+ pOuterNC = pWalker->u.pNC;
+ pParse = pWalker->pParse;
+ db = pParse->db;
+
+ /* Normally sqlite3SelectExpand() will be called first and will have
+ ** already expanded this SELECT. However, if this is a subquery within
+ ** an expression, sqlite3ResolveExprNames() will be called without a
+ ** prior call to sqlite3SelectExpand(). When that happens, let
+ ** sqlite3SelectPrep() do all of the processing for this SELECT.
+ ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and
+ ** this routine in the correct order.
+ */
+ if( (p->selFlags & SF_Expanded)==0 ){
+ sqlite3SelectPrep(pParse, p, pOuterNC);
+ return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune;
+ }
+
+ isCompound = p->pPrior!=0;
+ nCompound = 0;
+ pLeftmost = p;
+ while( p ){
+ assert( (p->selFlags & SF_Expanded)!=0 );
+ assert( (p->selFlags & SF_Resolved)==0 );
+ p->selFlags |= SF_Resolved;
+
+ /* Resolve the expressions in the LIMIT and OFFSET clauses. These
+ ** are not allowed to refer to any names, so pass an empty NameContext.
+ */
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = pParse;
+ if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
+ sqlite3ResolveExprNames(&sNC, p->pOffset) ){
+ return WRC_Abort;
+ }
+
+ /* Set up the local name-context to pass to sqlite3ResolveExprNames() to
+ ** resolve the result-set expression list.
+ */
+ sNC.allowAgg = 1;
+ sNC.pSrcList = p->pSrc;
+ sNC.pNext = pOuterNC;
+
+ /* Resolve names in the result set. */
+ pEList = p->pEList;
+ assert( pEList!=0 );
+ for(i=0; i<pEList->nExpr; i++){
+ Expr *pX = pEList->a[i].pExpr;
+ if( sqlite3ResolveExprNames(&sNC, pX) ){
+ return WRC_Abort;
+ }
+ }
+
+ /* Recursively resolve names in all subqueries
+ */
+ for(i=0; i<p->pSrc->nSrc; i++){
+ struct SrcList_item *pItem = &p->pSrc->a[i];
+ if( pItem->pSelect ){
+ const char *zSavedContext = pParse->zAuthContext;
+ if( pItem->zName ) pParse->zAuthContext = pItem->zName;
+ sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC);
+ pParse->zAuthContext = zSavedContext;
+ if( pParse->nErr || db->mallocFailed ) return WRC_Abort;
+ }
+ }
+
+ /* If there are no aggregate functions in the result-set, and no GROUP BY
+ ** expression, do not allow aggregates in any of the other expressions.
+ */
+ assert( (p->selFlags & SF_Aggregate)==0 );
+ pGroupBy = p->pGroupBy;
+ if( pGroupBy || sNC.hasAgg ){
+ p->selFlags |= SF_Aggregate;
+ }else{
+ sNC.allowAgg = 0;
+ }
+
+ /* If a HAVING clause is present, then there must be a GROUP BY clause.
+ */
+ if( p->pHaving && !pGroupBy ){
+ sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING");
+ return WRC_Abort;
+ }
+
+ /* Add the expression list to the name-context before parsing the
+ ** other expressions in the SELECT statement. This is so that
+ ** expressions in the WHERE clause (etc.) can refer to expressions by
+ ** aliases in the result set.
+ **
+ ** Minor point: If this is the case, then the expression will be
+ ** re-evaluated for each reference to it.
+ */
+ sNC.pEList = p->pEList;
+ if( sqlite3ResolveExprNames(&sNC, p->pWhere) ||
+ sqlite3ResolveExprNames(&sNC, p->pHaving)
+ ){
+ return WRC_Abort;
+ }
+
+ /* The ORDER BY and GROUP BY clauses may not refer to terms in
+ ** outer queries
+ */
+ sNC.pNext = 0;
+ sNC.allowAgg = 1;
+
+ /* Process the ORDER BY clause for singleton SELECT statements.
+ ** The ORDER BY clause for compounds SELECT statements is handled
+ ** below, after all of the result-sets for all of the elements of
+ ** the compound have been resolved.
+ */
+ if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){
+ return WRC_Abort;
+ }
+ if( db->mallocFailed ){
+ return WRC_Abort;
+ }
+
+ /* Resolve the GROUP BY clause. At the same time, make sure
+ ** the GROUP BY clause does not contain aggregate functions.
+ */
+ if( pGroupBy ){
+ struct ExprList_item *pItem;
+
+ if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){
+ return WRC_Abort;
+ }
+ for(i=0, pItem=pGroupBy->a; i<pGroupBy->nExpr; i++, pItem++){
+ if( ExprHasProperty(pItem->pExpr, EP_Agg) ){
+ sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in "
+ "the GROUP BY clause");
+ return WRC_Abort;
+ }
+ }
+ }
+
+ /* Advance to the next term of the compound
+ */
+ p = p->pPrior;
+ nCompound++;
+ }
+
+ /* Resolve the ORDER BY on a compound SELECT after all terms of
+ ** the compound have been resolved.
+ */
+ if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){
+ return WRC_Abort;
+ }
+
+ return WRC_Prune;
+}
+
+/*
+** This routine walks an expression tree and resolves references to
+** table columns and result-set columns. At the same time, do error
+** checking on function usage and set a flag if any aggregate functions
+** are seen.
+**
+** To resolve table columns references we look for nodes (or subtrees) of the
+** form X.Y.Z or Y.Z or just Z where
+**
+** X: The name of a database. Ex: "main" or "temp" or
+** the symbolic name assigned to an ATTACH-ed database.
+**
+** Y: The name of a table in a FROM clause. Or in a trigger
+** one of the special names "old" or "new".
+**
+** Z: The name of a column in table Y.
+**
+** The node at the root of the subtree is modified as follows:
+**
+** Expr.op Changed to TK_COLUMN
+** Expr.pTab Points to the Table object for X.Y
+** Expr.iColumn The column index in X.Y. -1 for the rowid.
+** Expr.iTable The VDBE cursor number for X.Y
+**
+**
+** To resolve result-set references, look for expression nodes of the
+** form Z (with no X and Y prefix) where the Z matches the right-hand
+** size of an AS clause in the result-set of a SELECT. The Z expression
+** is replaced by a copy of the left-hand side of the result-set expression.
+** Table-name and function resolution occurs on the substituted expression
+** tree. For example, in:
+**
+** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x;
+**
+** The "x" term of the order by is replaced by "a+b" to render:
+**
+** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b;
+**
+** Function calls are checked to make sure that the function is
+** defined and that the correct number of arguments are specified.
+** If the function is an aggregate function, then the pNC->hasAgg is
+** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION.
+** If an expression contains aggregate functions then the EP_Agg
+** property on the expression is set.
+**
+** An error message is left in pParse if anything is amiss. The number
+** if errors is returned.
+*/
+SQLITE_PRIVATE int sqlite3ResolveExprNames(
+ NameContext *pNC, /* Namespace to resolve expressions in. */
+ Expr *pExpr /* The expression to be analyzed. */
+){
+ int savedHasAgg;
+ Walker w;
+
+ if( pExpr==0 ) return 0;
+#if SQLITE_MAX_EXPR_DEPTH>0
+ {
+ Parse *pParse = pNC->pParse;
+ if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){
+ return 1;
+ }
+ pParse->nHeight += pExpr->nHeight;
+ }
+#endif
+ savedHasAgg = pNC->hasAgg;
+ pNC->hasAgg = 0;
+ w.xExprCallback = resolveExprStep;
+ w.xSelectCallback = resolveSelectStep;
+ w.pParse = pNC->pParse;
+ w.u.pNC = pNC;
+ sqlite3WalkExpr(&w, pExpr);
+#if SQLITE_MAX_EXPR_DEPTH>0
+ pNC->pParse->nHeight -= pExpr->nHeight;
+#endif
+ if( pNC->nErr>0 || w.pParse->nErr>0 ){
+ ExprSetProperty(pExpr, EP_Error);
+ }
+ if( pNC->hasAgg ){
+ ExprSetProperty(pExpr, EP_Agg);
+ }else if( savedHasAgg ){
+ pNC->hasAgg = 1;
+ }
+ return ExprHasProperty(pExpr, EP_Error);
+}
+
+
+/*
+** Resolve all names in all expressions of a SELECT and in all
+** decendents of the SELECT, including compounds off of p->pPrior,
+** subqueries in expressions, and subqueries used as FROM clause
+** terms.
+**
+** See sqlite3ResolveExprNames() for a description of the kinds of
+** transformations that occur.
+**
+** All SELECT statements should have been expanded using
+** sqlite3SelectExpand() prior to invoking this routine.
+*/
+SQLITE_PRIVATE void sqlite3ResolveSelectNames(
+ Parse *pParse, /* The parser context */
+ Select *p, /* The SELECT statement being coded. */
+ NameContext *pOuterNC /* Name context for parent SELECT statement */
+){
+ Walker w;
+
+ assert( p!=0 );
+ w.xExprCallback = resolveExprStep;
+ w.xSelectCallback = resolveSelectStep;
+ w.pParse = pParse;
+ w.u.pNC = pOuterNC;
+ sqlite3WalkSelect(&w, p);
+}
+
+/************** End of resolve.c *********************************************/
/************** Begin file expr.c ********************************************/
/*
** 2001 September 15
@@ -47571,8 +59999,6 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){
*************************************************************************
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
-**
-** $Id: expr.c,v 1.371 2008/05/01 17:16:53 drh Exp $
*/
/*
@@ -47594,13 +60020,25 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){
SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){
int op = pExpr->op;
if( op==TK_SELECT ){
- return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
+ assert( pExpr->flags&EP_xIsSelect );
+ return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr);
}
#ifndef SQLITE_OMIT_CAST
if( op==TK_CAST ){
- return sqlite3AffinityType(&pExpr->token);
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ return sqlite3AffinityType(pExpr->u.zToken);
}
#endif
+ if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER)
+ && pExpr->pTab!=0
+ ){
+ /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally
+ ** a TK_COLUMN but was previously evaluated and cached in a register */
+ int j = pExpr->iColumn;
+ if( j<0 ) return SQLITE_AFF_INTEGER;
+ assert( pExpr->pTab && j<pExpr->pTab->nCol );
+ return pExpr->pTab->aCol[j].affinity;
+ }
return pExpr->affinity;
}
@@ -47611,18 +60049,19 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){
** flag. An explicit collating sequence will override implicit
** collating sequences.
*/
-SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pName){
+SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pCollName){
char *zColl = 0; /* Dequoted name of collation sequence */
CollSeq *pColl;
- zColl = sqlite3NameFromToken(pParse->db, pName);
+ sqlite3 *db = pParse->db;
+ zColl = sqlite3NameFromToken(db, pCollName);
if( pExpr && zColl ){
- pColl = sqlite3LocateCollSeq(pParse, zColl, -1);
+ pColl = sqlite3LocateCollSeq(pParse, zColl);
if( pColl ){
pExpr->pColl = pColl;
pExpr->flags |= EP_ExpCollate;
}
}
- sqlite3_free(zColl);
+ sqlite3DbFree(db, zColl);
return pExpr;
}
@@ -47632,13 +60071,31 @@ SQLITE_PRIVATE Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pName
*/
SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
CollSeq *pColl = 0;
- if( pExpr ){
+ Expr *p = pExpr;
+ while( ALWAYS(p) ){
int op;
- pColl = pExpr->pColl;
- op = pExpr->op;
- if( (op==TK_CAST || op==TK_UPLUS) && !pColl ){
- return sqlite3ExprCollSeq(pParse, pExpr->pLeft);
+ pColl = p->pColl;
+ if( pColl ) break;
+ op = p->op;
+ if( p->pTab!=0 && (
+ op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER || op==TK_TRIGGER
+ )){
+ /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally
+ ** a TK_COLUMN but was previously evaluated and cached in a register */
+ const char *zColl;
+ int j = p->iColumn;
+ if( j>=0 ){
+ sqlite3 *db = pParse->db;
+ zColl = p->pTab->aCol[j].zColl;
+ pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
+ pExpr->pColl = pColl;
+ }
+ break;
}
+ if( op!=TK_CAST && op!=TK_UPLUS ){
+ break;
+ }
+ p = p->pLeft;
}
if( sqlite3CheckCollSeq(pParse, pColl) ){
pColl = 0;
@@ -47682,16 +60139,14 @@ static char comparisonAffinity(Expr *pExpr){
char aff;
assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT ||
pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
- pExpr->op==TK_NE );
+ pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT );
assert( pExpr->pLeft );
aff = sqlite3ExprAffinity(pExpr->pLeft);
if( pExpr->pRight ){
aff = sqlite3CompareAffinity(pExpr->pRight, aff);
- }
- else if( pExpr->pSelect ){
- aff = sqlite3CompareAffinity(pExpr->pSelect->pEList->a[0].pExpr, aff);
- }
- else if( !aff ){
+ }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff);
+ }else if( !aff ){
aff = SQLITE_AFF_NONE;
}
return aff;
@@ -47721,7 +60176,7 @@ SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
*/
static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
u8 aff = (char)sqlite3ExprAffinity(pExpr2);
- aff = sqlite3CompareAffinity(pExpr1, aff) | jumpIfNull;
+ aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull;
return aff;
}
@@ -47803,65 +60258,230 @@ static int codeCompare(
p5 = binaryCompareP5(pLeft, pRight, jumpIfNull);
addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1,
(void*)p4, P4_COLLSEQ);
- sqlite3VdbeChangeP5(pParse->pVdbe, p5);
- if( p5 & SQLITE_AFF_MASK ){
+ sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5);
+ if( (p5 & SQLITE_AFF_MASK)!=SQLITE_AFF_NONE ){
sqlite3ExprCacheAffinityChange(pParse, in1, 1);
sqlite3ExprCacheAffinityChange(pParse, in2, 1);
}
return addr;
}
+#if SQLITE_MAX_EXPR_DEPTH>0
/*
+** Check that argument nHeight is less than or equal to the maximum
+** expression depth allowed. If it is not, leave an error message in
+** pParse.
+*/
+SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){
+ int rc = SQLITE_OK;
+ int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH];
+ if( nHeight>mxHeight ){
+ sqlite3ErrorMsg(pParse,
+ "Expression tree is too large (maximum depth %d)", mxHeight
+ );
+ rc = SQLITE_ERROR;
+ }
+ return rc;
+}
+
+/* The following three functions, heightOfExpr(), heightOfExprList()
+** and heightOfSelect(), are used to determine the maximum height
+** of any expression tree referenced by the structure passed as the
+** first argument.
+**
+** If this maximum height is greater than the current value pointed
+** to by pnHeight, the second parameter, then set *pnHeight to that
+** value.
+*/
+static void heightOfExpr(Expr *p, int *pnHeight){
+ if( p ){
+ if( p->nHeight>*pnHeight ){
+ *pnHeight = p->nHeight;
+ }
+ }
+}
+static void heightOfExprList(ExprList *p, int *pnHeight){
+ if( p ){
+ int i;
+ for(i=0; i<p->nExpr; i++){
+ heightOfExpr(p->a[i].pExpr, pnHeight);
+ }
+ }
+}
+static void heightOfSelect(Select *p, int *pnHeight){
+ if( p ){
+ heightOfExpr(p->pWhere, pnHeight);
+ heightOfExpr(p->pHaving, pnHeight);
+ heightOfExpr(p->pLimit, pnHeight);
+ heightOfExpr(p->pOffset, pnHeight);
+ heightOfExprList(p->pEList, pnHeight);
+ heightOfExprList(p->pGroupBy, pnHeight);
+ heightOfExprList(p->pOrderBy, pnHeight);
+ heightOfSelect(p->pPrior, pnHeight);
+ }
+}
+
+/*
+** Set the Expr.nHeight variable in the structure passed as an
+** argument. An expression with no children, Expr.pList or
+** Expr.pSelect member has a height of 1. Any other expression
+** has a height equal to the maximum height of any other
+** referenced Expr plus one.
+*/
+static void exprSetHeight(Expr *p){
+ int nHeight = 0;
+ heightOfExpr(p->pLeft, &nHeight);
+ heightOfExpr(p->pRight, &nHeight);
+ if( ExprHasProperty(p, EP_xIsSelect) ){
+ heightOfSelect(p->x.pSelect, &nHeight);
+ }else{
+ heightOfExprList(p->x.pList, &nHeight);
+ }
+ p->nHeight = nHeight + 1;
+}
+
+/*
+** Set the Expr.nHeight variable using the exprSetHeight() function. If
+** the height is greater than the maximum allowed expression depth,
+** leave an error in pParse.
+*/
+SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p){
+ exprSetHeight(p);
+ sqlite3ExprCheckHeight(pParse, p->nHeight);
+}
+
+/*
+** Return the maximum height of any expression tree referenced
+** by the select statement passed as an argument.
+*/
+SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){
+ int nHeight = 0;
+ heightOfSelect(p, &nHeight);
+ return nHeight;
+}
+#else
+ #define exprSetHeight(y)
+#endif /* SQLITE_MAX_EXPR_DEPTH>0 */
+
+/*
+** This routine is the core allocator for Expr nodes.
+**
** Construct a new expression node and return a pointer to it. Memory
-** for this node is obtained from sqlite3_malloc(). The calling function
+** for this node and for the pToken argument is a single allocation
+** obtained from sqlite3DbMalloc(). The calling function
** is responsible for making sure the node eventually gets freed.
+**
+** If dequote is true, then the token (if it exists) is dequoted.
+** If dequote is false, no dequoting is performance. The deQuote
+** parameter is ignored if pToken is NULL or if the token does not
+** appear to be quoted. If the quotes were of the form "..." (double-quotes)
+** then the EP_DblQuoted flag is set on the expression node.
+**
+** Special case: If op==TK_INTEGER and pToken points to a string that
+** can be translated into a 32-bit integer, then the token is not
+** stored in u.zToken. Instead, the integer values is written
+** into u.iValue and the EP_IntValue flag is set. No extra storage
+** is allocated to hold the integer text and the dequote flag is ignored.
*/
-SQLITE_PRIVATE Expr *sqlite3Expr(
+SQLITE_PRIVATE Expr *sqlite3ExprAlloc(
sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */
int op, /* Expression opcode */
- Expr *pLeft, /* Left operand */
- Expr *pRight, /* Right operand */
- const Token *pToken /* Argument token */
+ const Token *pToken, /* Token argument. Might be NULL */
+ int dequote /* True to dequote */
){
Expr *pNew;
- pNew = sqlite3DbMallocZero(db, sizeof(Expr));
- if( pNew==0 ){
- /* When malloc fails, delete pLeft and pRight. Expressions passed to
- ** this function must always be allocated with sqlite3Expr() for this
- ** reason.
- */
- sqlite3ExprDelete(pLeft);
- sqlite3ExprDelete(pRight);
- return 0;
- }
- pNew->op = op;
- pNew->pLeft = pLeft;
- pNew->pRight = pRight;
- pNew->iAgg = -1;
+ int nExtra = 0;
+ int iValue = 0;
+
if( pToken ){
- assert( pToken->dyn==0 );
- pNew->span = pNew->token = *pToken;
- }else if( pLeft ){
+ if( op!=TK_INTEGER || pToken->z==0
+ || sqlite3GetInt32(pToken->z, &iValue)==0 ){
+ nExtra = pToken->n+1;
+ }
+ }
+ pNew = sqlite3DbMallocZero(db, sizeof(Expr)+nExtra);
+ if( pNew ){
+ pNew->op = (u8)op;
+ pNew->iAgg = -1;
+ if( pToken ){
+ if( nExtra==0 ){
+ pNew->flags |= EP_IntValue;
+ pNew->u.iValue = iValue;
+ }else{
+ int c;
+ pNew->u.zToken = (char*)&pNew[1];
+ memcpy(pNew->u.zToken, pToken->z, pToken->n);
+ pNew->u.zToken[pToken->n] = 0;
+ if( dequote && nExtra>=3
+ && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
+ sqlite3Dequote(pNew->u.zToken);
+ if( c=='"' ) pNew->flags |= EP_DblQuoted;
+ }
+ }
+ }
+#if SQLITE_MAX_EXPR_DEPTH>0
+ pNew->nHeight = 1;
+#endif
+ }
+ return pNew;
+}
+
+/*
+** Allocate a new expression node from a zero-terminated token that has
+** already been dequoted.
+*/
+SQLITE_PRIVATE Expr *sqlite3Expr(
+ sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */
+ int op, /* Expression opcode */
+ const char *zToken /* Token argument. Might be NULL */
+){
+ Token x;
+ x.z = zToken;
+ x.n = zToken ? sqlite3Strlen30(zToken) : 0;
+ return sqlite3ExprAlloc(db, op, &x, 0);
+}
+
+/*
+** Attach subtrees pLeft and pRight to the Expr node pRoot.
+**
+** If pRoot==NULL that means that a memory allocation error has occurred.
+** In that case, delete the subtrees pLeft and pRight.
+*/
+SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(
+ sqlite3 *db,
+ Expr *pRoot,
+ Expr *pLeft,
+ Expr *pRight
+){
+ if( pRoot==0 ){
+ assert( db->mallocFailed );
+ sqlite3ExprDelete(db, pLeft);
+ sqlite3ExprDelete(db, pRight);
+ }else{
if( pRight ){
- sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span);
+ pRoot->pRight = pRight;
if( pRight->flags & EP_ExpCollate ){
- pNew->flags |= EP_ExpCollate;
- pNew->pColl = pRight->pColl;
+ pRoot->flags |= EP_ExpCollate;
+ pRoot->pColl = pRight->pColl;
}
}
- if( pLeft->flags & EP_ExpCollate ){
- pNew->flags |= EP_ExpCollate;
- pNew->pColl = pLeft->pColl;
+ if( pLeft ){
+ pRoot->pLeft = pLeft;
+ if( pLeft->flags & EP_ExpCollate ){
+ pRoot->flags |= EP_ExpCollate;
+ pRoot->pColl = pLeft->pColl;
+ }
}
+ exprSetHeight(pRoot);
}
-
- sqlite3ExprSetHeight(pNew);
- return pNew;
}
/*
-** Works like sqlite3Expr() except that it takes an extra Parse*
-** argument and notifies the associated connection object if malloc fails.
+** Allocate a Expr node which joins as many as two subtrees.
+**
+** One or both of the subtrees can be NULL. Return a pointer to the new
+** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed,
+** free the subtrees and return NULL.
*/
SQLITE_PRIVATE Expr *sqlite3PExpr(
Parse *pParse, /* Parsing context */
@@ -47870,32 +60490,8 @@ SQLITE_PRIVATE Expr *sqlite3PExpr(
Expr *pRight, /* Right operand */
const Token *pToken /* Argument token */
){
- return sqlite3Expr(pParse->db, op, pLeft, pRight, pToken);
-}
-
-/*
-** When doing a nested parse, you can include terms in an expression
-** that look like this: #1 #2 ... These terms refer to registers
-** in the virtual machine. #N is the N-th register.
-**
-** This routine is called by the parser to deal with on of those terms.
-** It immediately generates code to store the value in a memory location.
-** The returns an expression that will code to extract the value from
-** that memory location as needed.
-*/
-SQLITE_PRIVATE Expr *sqlite3RegisterExpr(Parse *pParse, Token *pToken){
- Vdbe *v = pParse->pVdbe;
- Expr *p;
- if( pParse->nested==0 ){
- sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken);
- return sqlite3PExpr(pParse, TK_NULL, 0, 0, 0);
- }
- if( v==0 ) return 0;
- p = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, pToken);
- if( p==0 ){
- return 0; /* Malloc failed */
- }
- p->iTable = atoi((char*)&pToken->z[1]);
+ Expr *p = sqlite3ExprAlloc(pParse->db, op, pToken, 1);
+ sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight);
return p;
}
@@ -47909,25 +60505,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){
}else if( pRight==0 ){
return pLeft;
}else{
- return sqlite3Expr(db, TK_AND, pLeft, pRight, 0);
- }
-}
-
-/*
-** Set the Expr.span field of the given expression to span all
-** text between the two given tokens.
-*/
-SQLITE_PRIVATE void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
- assert( pRight!=0 );
- assert( pLeft!=0 );
- if( pExpr && pRight->z && pLeft->z ){
- assert( pLeft->dyn==0 || pLeft->z[pLeft->n]==0 );
- if( pLeft->dyn==0 && pRight->dyn==0 ){
- pExpr->span.z = pLeft->z;
- pExpr->span.n = pRight->n + (pRight->z - pLeft->z);
- }else{
- pExpr->span.z = 0;
- }
+ Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0);
+ sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight);
+ return pNew;
}
}
@@ -47937,19 +60517,16 @@ SQLITE_PRIVATE void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
*/
SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){
Expr *pNew;
+ sqlite3 *db = pParse->db;
assert( pToken );
- pNew = sqlite3DbMallocZero(pParse->db, sizeof(Expr) );
+ pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1);
if( pNew==0 ){
- sqlite3ExprListDelete(pList); /* Avoid leaking memory when malloc fails */
+ sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */
return 0;
}
- pNew->op = TK_FUNCTION;
- pNew->pList = pList;
- assert( pToken->dyn==0 );
- pNew->token = *pToken;
- pNew->span = pNew->token;
-
- sqlite3ExprSetHeight(pNew);
+ pNew->x.pList = pList;
+ assert( !ExprHasProperty(pNew, EP_xIsSelect) );
+ sqlite3ExprSetHeight(pParse, pNew);
return pNew;
}
@@ -47964,28 +60541,29 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *
** sure "nnn" is not too be to avoid a denial of service attack when
** the SQL statement comes from an external source.
**
-** Wildcards of the form ":aaa" or "$aaa" are assigned the same number
+** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number
** as the previous instance of the same wildcard. Or if this is the first
** instance of the wildcard, the next sequenial variable number is
** assigned.
*/
SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
- Token *pToken;
sqlite3 *db = pParse->db;
+ const char *z;
if( pExpr==0 ) return;
- pToken = &pExpr->token;
- assert( pToken->n>=1 );
- assert( pToken->z!=0 );
- assert( pToken->z[0]!=0 );
- if( pToken->n==1 ){
+ assert( !ExprHasAnyProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) );
+ z = pExpr->u.zToken;
+ assert( z!=0 );
+ assert( z[0]!=0 );
+ if( z[1]==0 ){
/* Wildcard of the form "?". Assign the next variable number */
+ assert( z[0]=='?' );
pExpr->iTable = ++pParse->nVar;
- }else if( pToken->z[0]=='?' ){
+ }else if( z[0]=='?' ){
/* Wildcard of the form "?nnn". Convert "nnn" to an integer and
** use it as the variable number */
int i;
- pExpr->iTable = i = atoi((char*)&pToken->z[1]);
+ pExpr->iTable = i = atoi((char*)&z[1]);
testcase( i==0 );
testcase( i==1 );
testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 );
@@ -47998,17 +60576,17 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
pParse->nVar = i;
}
}else{
- /* Wildcards of the form ":aaa" or "$aaa". Reuse the same variable
+ /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable
** number as the prior appearance of the same name, or if the name
** has never appeared before, reuse the same variable number
*/
- int i, n;
- n = pToken->n;
+ int i;
+ u32 n;
+ n = sqlite3Strlen30(z);
for(i=0; i<pParse->nVarExpr; i++){
- Expr *pE;
- if( (pE = pParse->apVarExpr[i])!=0
- && pE->token.n==n
- && memcmp(pE->token.z, pToken->z, n)==0 ){
+ Expr *pE = pParse->apVarExpr[i];
+ assert( pE!=0 );
+ if( memcmp(pE->u.zToken, z, n)==0 && pE->u.zToken[n]==0 ){
pExpr->iTable = pE->iTable;
break;
}
@@ -48036,34 +60614,228 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
}
/*
+** Clear an expression structure without deleting the structure itself.
+** Substructure is deleted.
+*/
+SQLITE_PRIVATE void sqlite3ExprClear(sqlite3 *db, Expr *p){
+ assert( p!=0 );
+ if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
+ sqlite3ExprDelete(db, p->pLeft);
+ sqlite3ExprDelete(db, p->pRight);
+ if( !ExprHasProperty(p, EP_Reduced) && (p->flags2 & EP2_MallocedToken)!=0 ){
+ sqlite3DbFree(db, p->u.zToken);
+ }
+ if( ExprHasProperty(p, EP_xIsSelect) ){
+ sqlite3SelectDelete(db, p->x.pSelect);
+ }else{
+ sqlite3ExprListDelete(db, p->x.pList);
+ }
+ }
+}
+
+/*
** Recursively delete an expression tree.
*/
-SQLITE_PRIVATE void sqlite3ExprDelete(Expr *p){
+SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){
if( p==0 ) return;
- if( p->span.dyn ) sqlite3_free((char*)p->span.z);
- if( p->token.dyn ) sqlite3_free((char*)p->token.z);
- sqlite3ExprDelete(p->pLeft);
- sqlite3ExprDelete(p->pRight);
- sqlite3ExprListDelete(p->pList);
- sqlite3SelectDelete(p->pSelect);
- sqlite3_free(p);
+ sqlite3ExprClear(db, p);
+ if( !ExprHasProperty(p, EP_Static) ){
+ sqlite3DbFree(db, p);
+ }
}
/*
-** The Expr.token field might be a string literal that is quoted.
-** If so, remove the quotation marks.
+** Return the number of bytes allocated for the expression structure
+** passed as the first argument. This is always one of EXPR_FULLSIZE,
+** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE.
*/
-SQLITE_PRIVATE void sqlite3DequoteExpr(sqlite3 *db, Expr *p){
- if( ExprHasAnyProperty(p, EP_Dequoted) ){
- return;
+static int exprStructSize(Expr *p){
+ if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE;
+ if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE;
+ return EXPR_FULLSIZE;
+}
+
+/*
+** The dupedExpr*Size() routines each return the number of bytes required
+** to store a copy of an expression or expression tree. They differ in
+** how much of the tree is measured.
+**
+** dupedExprStructSize() Size of only the Expr structure
+** dupedExprNodeSize() Size of Expr + space for token
+** dupedExprSize() Expr + token + subtree components
+**
+***************************************************************************
+**
+** The dupedExprStructSize() function returns two values OR-ed together:
+** (1) the space required for a copy of the Expr structure only and
+** (2) the EP_xxx flags that indicate what the structure size should be.
+** The return values is always one of:
+**
+** EXPR_FULLSIZE
+** EXPR_REDUCEDSIZE | EP_Reduced
+** EXPR_TOKENONLYSIZE | EP_TokenOnly
+**
+** The size of the structure can be found by masking the return value
+** of this routine with 0xfff. The flags can be found by masking the
+** return value with EP_Reduced|EP_TokenOnly.
+**
+** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size
+** (unreduced) Expr objects as they or originally constructed by the parser.
+** During expression analysis, extra information is computed and moved into
+** later parts of teh Expr object and that extra information might get chopped
+** off if the expression is reduced. Note also that it does not work to
+** make a EXPRDUP_REDUCE copy of a reduced expression. It is only legal
+** to reduce a pristine expression tree from the parser. The implementation
+** of dupedExprStructSize() contain multiple assert() statements that attempt
+** to enforce this constraint.
+*/
+static int dupedExprStructSize(Expr *p, int flags){
+ int nSize;
+ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
+ if( 0==(flags&EXPRDUP_REDUCE) ){
+ nSize = EXPR_FULLSIZE;
+ }else{
+ assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) );
+ assert( !ExprHasProperty(p, EP_FromJoin) );
+ assert( (p->flags2 & EP2_MallocedToken)==0 );
+ assert( (p->flags2 & EP2_Irreducible)==0 );
+ if( p->pLeft || p->pRight || p->pColl || p->x.pList ){
+ nSize = EXPR_REDUCEDSIZE | EP_Reduced;
+ }else{
+ nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly;
+ }
+ }
+ return nSize;
+}
+
+/*
+** This function returns the space in bytes required to store the copy
+** of the Expr structure and a copy of the Expr.u.zToken string (if that
+** string is defined.)
+*/
+static int dupedExprNodeSize(Expr *p, int flags){
+ int nByte = dupedExprStructSize(p, flags) & 0xfff;
+ if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
+ nByte += sqlite3Strlen30(p->u.zToken)+1;
}
- ExprSetProperty(p, EP_Dequoted);
- if( p->token.dyn==0 ){
- sqlite3TokenCopy(db, &p->token, &p->token);
+ return ROUND8(nByte);
+}
+
+/*
+** Return the number of bytes required to create a duplicate of the
+** expression passed as the first argument. The second argument is a
+** mask containing EXPRDUP_XXX flags.
+**
+** The value returned includes space to create a copy of the Expr struct
+** itself and the buffer referred to by Expr.u.zToken, if any.
+**
+** If the EXPRDUP_REDUCE flag is set, then the return value includes
+** space to duplicate all Expr nodes in the tree formed by Expr.pLeft
+** and Expr.pRight variables (but not for any structures pointed to or
+** descended from the Expr.x.pList or Expr.x.pSelect variables).
+*/
+static int dupedExprSize(Expr *p, int flags){
+ int nByte = 0;
+ if( p ){
+ nByte = dupedExprNodeSize(p, flags);
+ if( flags&EXPRDUP_REDUCE ){
+ nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags);
+ }
}
- sqlite3Dequote((char*)p->token.z);
+ return nByte;
}
+/*
+** This function is similar to sqlite3ExprDup(), except that if pzBuffer
+** is not NULL then *pzBuffer is assumed to point to a buffer large enough
+** to store the copy of expression p, the copies of p->u.zToken
+** (if applicable), and the copies of the p->pLeft and p->pRight expressions,
+** if any. Before returning, *pzBuffer is set to the first byte passed the
+** portion of the buffer copied into by this function.
+*/
+static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){
+ Expr *pNew = 0; /* Value to return */
+ if( p ){
+ const int isReduced = (flags&EXPRDUP_REDUCE);
+ u8 *zAlloc;
+ u32 staticFlag = 0;
+
+ assert( pzBuffer==0 || isReduced );
+
+ /* Figure out where to write the new Expr structure. */
+ if( pzBuffer ){
+ zAlloc = *pzBuffer;
+ staticFlag = EP_Static;
+ }else{
+ zAlloc = sqlite3DbMallocRaw(db, dupedExprSize(p, flags));
+ }
+ pNew = (Expr *)zAlloc;
+
+ if( pNew ){
+ /* Set nNewSize to the size allocated for the structure pointed to
+ ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or
+ ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed
+ ** by the copy of the p->u.zToken string (if any).
+ */
+ const unsigned nStructSize = dupedExprStructSize(p, flags);
+ const int nNewSize = nStructSize & 0xfff;
+ int nToken;
+ if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
+ nToken = sqlite3Strlen30(p->u.zToken) + 1;
+ }else{
+ nToken = 0;
+ }
+ if( isReduced ){
+ assert( ExprHasProperty(p, EP_Reduced)==0 );
+ memcpy(zAlloc, p, nNewSize);
+ }else{
+ int nSize = exprStructSize(p);
+ memcpy(zAlloc, p, nSize);
+ memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize);
+ }
+
+ /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */
+ pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static);
+ pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly);
+ pNew->flags |= staticFlag;
+
+ /* Copy the p->u.zToken string, if any. */
+ if( nToken ){
+ char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize];
+ memcpy(zToken, p->u.zToken, nToken);
+ }
+
+ if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){
+ /* Fill in the pNew->x.pSelect or pNew->x.pList member. */
+ if( ExprHasProperty(p, EP_xIsSelect) ){
+ pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced);
+ }else{
+ pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced);
+ }
+ }
+
+ /* Fill in pNew->pLeft and pNew->pRight. */
+ if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly) ){
+ zAlloc += dupedExprNodeSize(p, flags);
+ if( ExprHasProperty(pNew, EP_Reduced) ){
+ pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc);
+ pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc);
+ }
+ if( pzBuffer ){
+ *pzBuffer = zAlloc;
+ }
+ }else{
+ pNew->flags2 = 0;
+ if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
+ pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0);
+ pNew->pRight = sqlite3ExprDup(db, p->pRight, 0);
+ }
+ }
+
+ }
+ }
+ return pNew;
+}
/*
** The following group of routines make deep copies of expressions,
@@ -48076,37 +60848,16 @@ SQLITE_PRIVATE void sqlite3DequoteExpr(sqlite3 *db, Expr *p){
** by subsequent calls to sqlite*ListAppend() routines.
**
** Any tables that the SrcList might point to are not duplicated.
+**
+** The flags parameter contains a combination of the EXPRDUP_XXX flags.
+** If the EXPRDUP_REDUCE flag is set, then the structure returned is a
+** truncated version of the usual Expr structure that will be stored as
+** part of the in-memory representation of the database schema.
*/
-SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p){
- Expr *pNew;
- if( p==0 ) return 0;
- pNew = sqlite3DbMallocRaw(db, sizeof(*p) );
- if( pNew==0 ) return 0;
- memcpy(pNew, p, sizeof(*pNew));
- if( p->token.z!=0 ){
- pNew->token.z = (u8*)sqlite3DbStrNDup(db, (char*)p->token.z, p->token.n);
- pNew->token.dyn = 1;
- }else{
- assert( pNew->token.z==0 );
- }
- pNew->span.z = 0;
- pNew->pLeft = sqlite3ExprDup(db, p->pLeft);
- pNew->pRight = sqlite3ExprDup(db, p->pRight);
- pNew->pList = sqlite3ExprListDup(db, p->pList);
- pNew->pSelect = sqlite3SelectDup(db, p->pSelect);
- return pNew;
-}
-SQLITE_PRIVATE void sqlite3TokenCopy(sqlite3 *db, Token *pTo, Token *pFrom){
- if( pTo->dyn ) sqlite3_free((char*)pTo->z);
- if( pFrom->z ){
- pTo->n = pFrom->n;
- pTo->z = (u8*)sqlite3DbStrNDup(db, (char*)pFrom->z, pFrom->n);
- pTo->dyn = 1;
- }else{
- pTo->z = 0;
- }
+SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){
+ return exprDup(db, p, flags, 0);
}
-SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p){
+SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
ExprList *pNew;
struct ExprList_item *pItem, *pOldItem;
int i;
@@ -48117,26 +60868,19 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p){
pNew->nExpr = pNew->nAlloc = p->nExpr;
pNew->a = pItem = sqlite3DbMallocRaw(db, p->nExpr*sizeof(p->a[0]) );
if( pItem==0 ){
- sqlite3_free(pNew);
+ sqlite3DbFree(db, pNew);
return 0;
}
pOldItem = p->a;
for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
- Expr *pNewExpr, *pOldExpr;
- pItem->pExpr = pNewExpr = sqlite3ExprDup(db, pOldExpr = pOldItem->pExpr);
- if( pOldExpr->span.z!=0 && pNewExpr ){
- /* Always make a copy of the span for top-level expressions in the
- ** expression list. The logic in SELECT processing that determines
- ** the names of columns in the result set needs this information */
- sqlite3TokenCopy(db, &pNewExpr->span, &pOldExpr->span);
- }
- assert( pNewExpr==0 || pNewExpr->span.z!=0
- || pOldExpr->span.z==0
- || db->mallocFailed );
+ Expr *pOldExpr = pOldItem->pExpr;
+ pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
+ pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan);
pItem->sortOrder = pOldItem->sortOrder;
- pItem->isAgg = pOldItem->isAgg;
pItem->done = 0;
+ pItem->iCol = pOldItem->iCol;
+ pItem->iAlias = pOldItem->iAlias;
}
return pNew;
}
@@ -48149,7 +60893,7 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p){
*/
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \
|| !defined(SQLITE_OMIT_SUBQUERY)
-SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p){
+SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
SrcList *pNew;
int i;
int nByte;
@@ -48168,12 +60912,15 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p){
pNewItem->jointype = pOldItem->jointype;
pNewItem->iCursor = pOldItem->iCursor;
pNewItem->isPopulated = pOldItem->isPopulated;
+ pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex);
+ pNewItem->notIndexed = pOldItem->notIndexed;
+ pNewItem->pIndex = pOldItem->pIndex;
pTab = pNewItem->pTab = pOldItem->pTab;
if( pTab ){
pTab->nRef++;
}
- pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect);
- pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn);
+ pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags);
+ pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags);
pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing);
pNewItem->colUsed = pOldItem->colUsed;
}
@@ -48188,7 +60935,7 @@ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
pNew->nId = pNew->nAlloc = p->nId;
pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) );
if( pNew->a==0 ){
- sqlite3_free(pNew);
+ sqlite3DbFree(db, pNew);
return 0;
}
for(i=0; i<p->nId; i++){
@@ -48199,28 +60946,24 @@ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
}
return pNew;
}
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p){
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
Select *pNew;
if( p==0 ) return 0;
pNew = sqlite3DbMallocRaw(db, sizeof(*p) );
if( pNew==0 ) return 0;
- pNew->isDistinct = p->isDistinct;
- pNew->pEList = sqlite3ExprListDup(db, p->pEList);
- pNew->pSrc = sqlite3SrcListDup(db, p->pSrc);
- pNew->pWhere = sqlite3ExprDup(db, p->pWhere);
- pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy);
- pNew->pHaving = sqlite3ExprDup(db, p->pHaving);
- pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy);
+ pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags);
+ pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags);
+ pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags);
+ pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags);
+ pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags);
+ pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags);
pNew->op = p->op;
- pNew->pPrior = sqlite3SelectDup(db, p->pPrior);
- pNew->pLimit = sqlite3ExprDup(db, p->pLimit);
- pNew->pOffset = sqlite3ExprDup(db, p->pOffset);
- pNew->iLimit = -1;
- pNew->iOffset = -1;
- pNew->isResolved = p->isResolved;
- pNew->isAgg = p->isAgg;
- pNew->usesEphm = 0;
- pNew->disallowOrderBy = 0;
+ pNew->pPrior = sqlite3SelectDup(db, p->pPrior, flags);
+ pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
+ pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
+ pNew->iLimit = 0;
+ pNew->iOffset = 0;
+ pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
pNew->pRightmost = 0;
pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[1] = -1;
@@ -48228,7 +60971,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p){
return pNew;
}
#else
-SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p){
+SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
assert( p==0 );
return 0;
}
@@ -48238,12 +60981,15 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p){
/*
** Add a new element to the end of an expression list. If pList is
** initially NULL, then create a new expression list.
+**
+** If a memory allocation error occurs, the entire list is freed and
+** NULL is returned. If non-NULL is returned, then it is guaranteed
+** that the new entry was successfully appended.
*/
SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(
Parse *pParse, /* Parsing context */
ExprList *pList, /* List to which to append. Might be NULL */
- Expr *pExpr, /* Expression to be appended */
- Token *pName /* AS keyword for the expression */
+ Expr *pExpr /* Expression to be appended. Might be NULL */
){
sqlite3 *db = pParse->db;
if( pList==0 ){
@@ -48261,25 +61007,74 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(
goto no_mem;
}
pList->a = a;
- pList->nAlloc = n;
+ pList->nAlloc = sqlite3DbMallocSize(db, a)/sizeof(a[0]);
}
assert( pList->a!=0 );
- if( pExpr || pName ){
+ if( 1 ){
struct ExprList_item *pItem = &pList->a[pList->nExpr++];
memset(pItem, 0, sizeof(*pItem));
- pItem->zName = sqlite3NameFromToken(db, pName);
pItem->pExpr = pExpr;
}
return pList;
no_mem:
/* Avoid leaking memory if malloc has failed. */
- sqlite3ExprDelete(pExpr);
- sqlite3ExprListDelete(pList);
+ sqlite3ExprDelete(db, pExpr);
+ sqlite3ExprListDelete(db, pList);
return 0;
}
/*
+** Set the ExprList.a[].zName element of the most recently added item
+** on the expression list.
+**
+** pList might be NULL following an OOM error. But pName should never be
+** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag
+** is set.
+*/
+SQLITE_PRIVATE void sqlite3ExprListSetName(
+ Parse *pParse, /* Parsing context */
+ ExprList *pList, /* List to which to add the span. */
+ Token *pName, /* Name to be added */
+ int dequote /* True to cause the name to be dequoted */
+){
+ assert( pList!=0 || pParse->db->mallocFailed!=0 );
+ if( pList ){
+ struct ExprList_item *pItem;
+ assert( pList->nExpr>0 );
+ pItem = &pList->a[pList->nExpr-1];
+ assert( pItem->zName==0 );
+ pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
+ if( dequote && pItem->zName ) sqlite3Dequote(pItem->zName);
+ }
+}
+
+/*
+** Set the ExprList.a[].zSpan element of the most recently added item
+** on the expression list.
+**
+** pList might be NULL following an OOM error. But pSpan should never be
+** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag
+** is set.
+*/
+SQLITE_PRIVATE void sqlite3ExprListSetSpan(
+ Parse *pParse, /* Parsing context */
+ ExprList *pList, /* List to which to add the span. */
+ ExprSpan *pSpan /* The span to be added */
+){
+ sqlite3 *db = pParse->db;
+ assert( pList!=0 || db->mallocFailed!=0 );
+ if( pList ){
+ struct ExprList_item *pItem = &pList->a[pList->nExpr-1];
+ assert( pList->nExpr>0 );
+ assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr );
+ sqlite3DbFree(db, pItem->zSpan);
+ pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
+ (int)(pSpan->zEnd - pSpan->zStart));
+ }
+}
+
+/*
** If the expression list pEList contains more than iLimit elements,
** leave an error message in pParse.
*/
@@ -48296,202 +61091,82 @@ SQLITE_PRIVATE void sqlite3ExprListCheckLength(
}
}
-
-/* The following three functions, heightOfExpr(), heightOfExprList()
-** and heightOfSelect(), are used to determine the maximum height
-** of any expression tree referenced by the structure passed as the
-** first argument.
-**
-** If this maximum height is greater than the current value pointed
-** to by pnHeight, the second parameter, then set *pnHeight to that
-** value.
-*/
-static void heightOfExpr(Expr *p, int *pnHeight){
- if( p ){
- if( p->nHeight>*pnHeight ){
- *pnHeight = p->nHeight;
- }
- }
-}
-static void heightOfExprList(ExprList *p, int *pnHeight){
- if( p ){
- int i;
- for(i=0; i<p->nExpr; i++){
- heightOfExpr(p->a[i].pExpr, pnHeight);
- }
- }
-}
-static void heightOfSelect(Select *p, int *pnHeight){
- if( p ){
- heightOfExpr(p->pWhere, pnHeight);
- heightOfExpr(p->pHaving, pnHeight);
- heightOfExpr(p->pLimit, pnHeight);
- heightOfExpr(p->pOffset, pnHeight);
- heightOfExprList(p->pEList, pnHeight);
- heightOfExprList(p->pGroupBy, pnHeight);
- heightOfExprList(p->pOrderBy, pnHeight);
- heightOfSelect(p->pPrior, pnHeight);
- }
-}
-
-/*
-** Set the Expr.nHeight variable in the structure passed as an
-** argument. An expression with no children, Expr.pList or
-** Expr.pSelect member has a height of 1. Any other expression
-** has a height equal to the maximum height of any other
-** referenced Expr plus one.
-*/
-SQLITE_PRIVATE void sqlite3ExprSetHeight(Expr *p){
- int nHeight = 0;
- heightOfExpr(p->pLeft, &nHeight);
- heightOfExpr(p->pRight, &nHeight);
- heightOfExprList(p->pList, &nHeight);
- heightOfSelect(p->pSelect, &nHeight);
- p->nHeight = nHeight + 1;
-}
-
-/*
-** Return the maximum height of any expression tree referenced
-** by the select statement passed as an argument.
-*/
-SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){
- int nHeight = 0;
- heightOfSelect(p, &nHeight);
- return nHeight;
-}
-
/*
** Delete an entire expression list.
*/
-SQLITE_PRIVATE void sqlite3ExprListDelete(ExprList *pList){
+SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
int i;
struct ExprList_item *pItem;
if( pList==0 ) return;
assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );
assert( pList->nExpr<=pList->nAlloc );
for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
- sqlite3ExprDelete(pItem->pExpr);
- sqlite3_free(pItem->zName);
+ sqlite3ExprDelete(db, pItem->pExpr);
+ sqlite3DbFree(db, pItem->zName);
+ sqlite3DbFree(db, pItem->zSpan);
}
- sqlite3_free(pList->a);
- sqlite3_free(pList);
+ sqlite3DbFree(db, pList->a);
+ sqlite3DbFree(db, pList);
}
/*
-** Walk an expression tree. Call xFunc for each node visited. xFunc
-** is called on the node before xFunc is called on the nodes children.
+** These routines are Walker callbacks. Walker.u.pi is a pointer
+** to an integer. These routines are checking an expression to see
+** if it is a constant. Set *Walker.u.pi to 0 if the expression is
+** not constant.
**
-** The return value from xFunc determines whether the tree walk continues.
-** 0 means continue walking the tree. 1 means do not walk children
-** of the current node but continue with siblings. 2 means abandon
-** the tree walk completely.
-**
-** The return value from this routine is 1 to abandon the tree walk
-** and 0 to continue.
-**
-** NOTICE: This routine does *not* descend into subqueries.
-*/
-static int walkExprList(ExprList *, int (*)(void *, Expr*), void *);
-static int walkExprTree(Expr *pExpr, int (*xFunc)(void*,Expr*), void *pArg){
- int rc;
- if( pExpr==0 ) return 0;
- rc = (*xFunc)(pArg, pExpr);
- if( rc==0 ){
- if( walkExprTree(pExpr->pLeft, xFunc, pArg) ) return 1;
- if( walkExprTree(pExpr->pRight, xFunc, pArg) ) return 1;
- if( walkExprList(pExpr->pList, xFunc, pArg) ) return 1;
- }
- return rc>1;
-}
-
-/*
-** Call walkExprTree() for every expression in list p.
-*/
-static int walkExprList(ExprList *p, int (*xFunc)(void *, Expr*), void *pArg){
- int i;
- struct ExprList_item *pItem;
- if( !p ) return 0;
- for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){
- if( walkExprTree(pItem->pExpr, xFunc, pArg) ) return 1;
- }
- return 0;
-}
-
-/*
-** Call walkExprTree() for every expression in Select p, not including
-** expressions that are part of sub-selects in any FROM clause or the LIMIT
-** or OFFSET expressions..
-*/
-static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){
- walkExprList(p->pEList, xFunc, pArg);
- walkExprTree(p->pWhere, xFunc, pArg);
- walkExprList(p->pGroupBy, xFunc, pArg);
- walkExprTree(p->pHaving, xFunc, pArg);
- walkExprList(p->pOrderBy, xFunc, pArg);
- if( p->pPrior ){
- walkSelectExpr(p->pPrior, xFunc, pArg);
- }
- return 0;
-}
-
-
-/*
-** This routine is designed as an xFunc for walkExprTree().
+** These callback routines are used to implement the following:
**
-** pArg is really a pointer to an integer. If we can tell by looking
-** at pExpr that the expression that contains pExpr is not a constant
-** expression, then set *pArg to 0 and return 2 to abandon the tree walk.
-** If pExpr does does not disqualify the expression from being a constant
-** then do nothing.
+** sqlite3ExprIsConstant()
+** sqlite3ExprIsConstantNotJoin()
+** sqlite3ExprIsConstantOrFunction()
**
-** After walking the whole tree, if no nodes are found that disqualify
-** the expression as constant, then we assume the whole expression
-** is constant. See sqlite3ExprIsConstant() for additional information.
*/
-static int exprNodeIsConstant(void *pArg, Expr *pExpr){
- int *pN = (int*)pArg;
+static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
- /* If *pArg is 3 then any term of the expression that comes from
+ /* If pWalker->u.i is 3 then any term of the expression that comes from
** the ON or USING clauses of a join disqualifies the expression
** from being considered constant. */
- if( (*pN)==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){
- *pN = 0;
- return 2;
+ if( pWalker->u.i==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){
+ pWalker->u.i = 0;
+ return WRC_Abort;
}
switch( pExpr->op ){
/* Consider functions to be constant if all their arguments are constant
- ** and *pArg==2 */
+ ** and pWalker->u.i==2 */
case TK_FUNCTION:
- if( (*pN)==2 ) return 0;
+ if( pWalker->u.i==2 ) return 0;
/* Fall through */
case TK_ID:
case TK_COLUMN:
- case TK_DOT:
case TK_AGG_FUNCTION:
case TK_AGG_COLUMN:
-#ifndef SQLITE_OMIT_SUBQUERY
- case TK_SELECT:
- case TK_EXISTS:
- testcase( pExpr->op==TK_SELECT );
- testcase( pExpr->op==TK_EXISTS );
-#endif
testcase( pExpr->op==TK_ID );
testcase( pExpr->op==TK_COLUMN );
- testcase( pExpr->op==TK_DOT );
testcase( pExpr->op==TK_AGG_FUNCTION );
testcase( pExpr->op==TK_AGG_COLUMN );
- *pN = 0;
- return 2;
- case TK_IN:
- if( pExpr->pSelect ){
- *pN = 0;
- return 2;
- }
+ pWalker->u.i = 0;
+ return WRC_Abort;
default:
- return 0;
+ testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */
+ testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */
+ return WRC_Continue;
}
}
+static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){
+ UNUSED_PARAMETER(NotUsed);
+ pWalker->u.i = 0;
+ return WRC_Abort;
+}
+static int exprIsConst(Expr *p, int initFlag){
+ Walker w;
+ w.u.i = initFlag;
+ w.xExprCallback = exprNodeIsConstant;
+ w.xSelectCallback = selectNodeIsConstant;
+ sqlite3WalkExpr(&w, p);
+ return w.u.i;
+}
/*
** Walk an expression tree. Return 1 if the expression is constant
@@ -48502,9 +61177,7 @@ static int exprNodeIsConstant(void *pArg, Expr *pExpr){
** a constant.
*/
SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){
- int isConst = 1;
- walkExprTree(p, exprNodeIsConstant, &isConst);
- return isConst;
+ return exprIsConst(p, 1);
}
/*
@@ -48514,9 +61187,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){
** an ON or USING clause.
*/
SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){
- int isConst = 3;
- walkExprTree(p, exprNodeIsConstant, &isConst);
- return isConst!=0;
+ return exprIsConst(p, 3);
}
/*
@@ -48529,9 +61200,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){
** a constant.
*/
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p){
- int isConst = 2;
- walkExprTree(p, exprNodeIsConstant, &isConst);
- return isConst!=0;
+ return exprIsConst(p, 2);
}
/*
@@ -48541,27 +61210,39 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p){
** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
*/
SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){
+ int rc = 0;
+ if( p->flags & EP_IntValue ){
+ *pValue = p->u.iValue;
+ return 1;
+ }
switch( p->op ){
case TK_INTEGER: {
- if( sqlite3GetInt32((char*)p->token.z, pValue) ){
- return 1;
- }
+ rc = sqlite3GetInt32(p->u.zToken, pValue);
+ assert( rc==0 );
break;
}
case TK_UPLUS: {
- return sqlite3ExprIsInteger(p->pLeft, pValue);
+ rc = sqlite3ExprIsInteger(p->pLeft, pValue);
+ break;
}
case TK_UMINUS: {
int v;
if( sqlite3ExprIsInteger(p->pLeft, &v) ){
*pValue = -v;
- return 1;
+ rc = 1;
}
break;
}
default: break;
}
- return 0;
+ if( rc ){
+ assert( ExprHasAnyProperty(p, EP_Reduced|EP_TokenOnly)
+ || (p->flags2 & EP2_MallocedToken)==0 );
+ p->op = TK_INTEGER;
+ p->flags |= EP_IntValue;
+ p->u.iValue = *pValue;
+ }
+ return rc;
}
/*
@@ -48575,594 +61256,40 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){
}
/*
-** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
-** that name in the set of source tables in pSrcList and make the pExpr
-** expression node refer back to that source column. The following changes
-** are made to pExpr:
-**
-** pExpr->iDb Set the index in db->aDb[] of the database holding
-** the table.
-** pExpr->iTable Set to the cursor number for the table obtained
-** from pSrcList.
-** pExpr->iColumn Set to the column number within the table.
-** pExpr->op Set to TK_COLUMN.
-** pExpr->pLeft Any expression this points to is deleted
-** pExpr->pRight Any expression this points to is deleted.
+** Return true if we are able to the IN operator optimization on a
+** query of the form
**
-** The pDbToken is the name of the database (the "X"). This value may be
-** NULL meaning that name is of the form Y.Z or Z. Any available database
-** can be used. The pTableToken is the name of the table (the "Y"). This
-** value can be NULL if pDbToken is also NULL. If pTableToken is NULL it
-** means that the form of the name is Z and that columns from any table
-** can be used.
-**
-** If the name cannot be resolved unambiguously, leave an error message
-** in pParse and return non-zero. Return zero on success.
-*/
-static int lookupName(
- Parse *pParse, /* The parsing context */
- Token *pDbToken, /* Name of the database containing table, or NULL */
- Token *pTableToken, /* Name of table containing column, or NULL */
- Token *pColumnToken, /* Name of the column. */
- NameContext *pNC, /* The name context used to resolve the name */
- Expr *pExpr /* Make this EXPR node point to the selected column */
-){
- char *zDb = 0; /* Name of the database. The "X" in X.Y.Z */
- char *zTab = 0; /* Name of the table. The "Y" in X.Y.Z or Y.Z */
- char *zCol = 0; /* Name of the column. The "Z" */
- int i, j; /* Loop counters */
- int cnt = 0; /* Number of matching column names */
- int cntTab = 0; /* Number of matching table names */
- sqlite3 *db = pParse->db; /* The database */
- struct SrcList_item *pItem; /* Use for looping over pSrcList items */
- struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
- NameContext *pTopNC = pNC; /* First namecontext in the list */
- Schema *pSchema = 0; /* Schema of the expression */
-
- assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */
- zDb = sqlite3NameFromToken(db, pDbToken);
- zTab = sqlite3NameFromToken(db, pTableToken);
- zCol = sqlite3NameFromToken(db, pColumnToken);
- if( db->mallocFailed ){
- goto lookupname_end;
- }
-
- pExpr->iTable = -1;
- while( pNC && cnt==0 ){
- ExprList *pEList;
- SrcList *pSrcList = pNC->pSrcList;
-
- if( pSrcList ){
- for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){
- Table *pTab;
- int iDb;
- Column *pCol;
-
- pTab = pItem->pTab;
- assert( pTab!=0 );
- iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
- assert( pTab->nCol>0 );
- if( zTab ){
- if( pItem->zAlias ){
- char *zTabName = pItem->zAlias;
- if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
- }else{
- char *zTabName = pTab->zName;
- if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
- if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){
- continue;
- }
- }
- }
- if( 0==(cntTab++) ){
- pExpr->iTable = pItem->iCursor;
- pSchema = pTab->pSchema;
- pMatch = pItem;
- }
- for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
- if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
- const char *zColl = pTab->aCol[j].zColl;
- IdList *pUsing;
- cnt++;
- pExpr->iTable = pItem->iCursor;
- pMatch = pItem;
- pSchema = pTab->pSchema;
- /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
- pExpr->iColumn = j==pTab->iPKey ? -1 : j;
- pExpr->affinity = pTab->aCol[j].affinity;
- if( (pExpr->flags & EP_ExpCollate)==0 ){
- pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0);
- }
- if( i<pSrcList->nSrc-1 ){
- if( pItem[1].jointype & JT_NATURAL ){
- /* If this match occurred in the left table of a natural join,
- ** then skip the right table to avoid a duplicate match */
- pItem++;
- i++;
- }else if( (pUsing = pItem[1].pUsing)!=0 ){
- /* If this match occurs on a column that is in the USING clause
- ** of a join, skip the search of the right table of the join
- ** to avoid a duplicate match there. */
- int k;
- for(k=0; k<pUsing->nId; k++){
- if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){
- pItem++;
- i++;
- break;
- }
- }
- }
- }
- break;
- }
- }
- }
- }
-
-#ifndef SQLITE_OMIT_TRIGGER
- /* If we have not already resolved the name, then maybe
- ** it is a new.* or old.* trigger argument reference
- */
- if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){
- TriggerStack *pTriggerStack = pParse->trigStack;
- Table *pTab = 0;
- u32 *piColMask;
- if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){
- pExpr->iTable = pTriggerStack->newIdx;
- assert( pTriggerStack->pTab );
- pTab = pTriggerStack->pTab;
- piColMask = &(pTriggerStack->newColMask);
- }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab)==0 ){
- pExpr->iTable = pTriggerStack->oldIdx;
- assert( pTriggerStack->pTab );
- pTab = pTriggerStack->pTab;
- piColMask = &(pTriggerStack->oldColMask);
- }
-
- if( pTab ){
- int iCol;
- Column *pCol = pTab->aCol;
-
- pSchema = pTab->pSchema;
- cntTab++;
- for(iCol=0; iCol < pTab->nCol; iCol++, pCol++) {
- if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
- const char *zColl = pTab->aCol[iCol].zColl;
- cnt++;
- pExpr->iColumn = iCol==pTab->iPKey ? -1 : iCol;
- pExpr->affinity = pTab->aCol[iCol].affinity;
- if( (pExpr->flags & EP_ExpCollate)==0 ){
- pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0);
- }
- pExpr->pTab = pTab;
- if( iCol>=0 ){
- testcase( iCol==31 );
- testcase( iCol==32 );
- *piColMask |= ((u32)1<<iCol) | (iCol>=32?0xffffffff:0);
- }
- break;
- }
- }
- }
- }
-#endif /* !defined(SQLITE_OMIT_TRIGGER) */
-
- /*
- ** Perhaps the name is a reference to the ROWID
- */
- if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){
- cnt = 1;
- pExpr->iColumn = -1;
- pExpr->affinity = SQLITE_AFF_INTEGER;
- }
-
- /*
- ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
- ** might refer to an result-set alias. This happens, for example, when
- ** we are resolving names in the WHERE clause of the following command:
- **
- ** SELECT a+b AS x FROM table WHERE x<10;
- **
- ** In cases like this, replace pExpr with a copy of the expression that
- ** forms the result set entry ("a+b" in the example) and return immediately.
- ** Note that the expression in the result set should have already been
- ** resolved by the time the WHERE clause is resolved.
- */
- if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){
- for(j=0; j<pEList->nExpr; j++){
- char *zAs = pEList->a[j].zName;
- if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
- Expr *pDup, *pOrig;
- assert( pExpr->pLeft==0 && pExpr->pRight==0 );
- assert( pExpr->pList==0 );
- assert( pExpr->pSelect==0 );
- pOrig = pEList->a[j].pExpr;
- if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){
- sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
- sqlite3_free(zCol);
- return 2;
- }
- pDup = sqlite3ExprDup(db, pOrig);
- if( pExpr->flags & EP_ExpCollate ){
- pDup->pColl = pExpr->pColl;
- pDup->flags |= EP_ExpCollate;
- }
- if( pExpr->span.dyn ) sqlite3_free((char*)pExpr->span.z);
- if( pExpr->token.dyn ) sqlite3_free((char*)pExpr->token.z);
- memcpy(pExpr, pDup, sizeof(*pExpr));
- sqlite3_free(pDup);
- cnt = 1;
- pMatch = 0;
- assert( zTab==0 && zDb==0 );
- goto lookupname_end_2;
- }
- }
- }
-
- /* Advance to the next name context. The loop will exit when either
- ** we have a match (cnt>0) or when we run out of name contexts.
- */
- if( cnt==0 ){
- pNC = pNC->pNext;
- }
- }
-
- /*
- ** If X and Y are NULL (in other words if only the column name Z is
- ** supplied) and the value of Z is enclosed in double-quotes, then
- ** Z is a string literal if it doesn't match any column names. In that
- ** case, we need to return right away and not make any changes to
- ** pExpr.
- **
- ** Because no reference was made to outer contexts, the pNC->nRef
- ** fields are not changed in any context.
- */
- if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){
- sqlite3_free(zCol);
- return 0;
- }
-
- /*
- ** cnt==0 means there was not match. cnt>1 means there were two or
- ** more matches. Either way, we have an error.
- */
- if( cnt!=1 ){
- const char *zErr;
- zErr = cnt==0 ? "no such column" : "ambiguous column name";
- if( zDb ){
- sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol);
- }else if( zTab ){
- sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol);
- }else{
- sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol);
- }
- pTopNC->nErr++;
- }
-
- /* If a column from a table in pSrcList is referenced, then record
- ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes
- ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the
- ** column number is greater than the number of bits in the bitmask
- ** then set the high-order bit of the bitmask.
- */
- if( pExpr->iColumn>=0 && pMatch!=0 ){
- int n = pExpr->iColumn;
- testcase( n==sizeof(Bitmask)*8-1 );
- if( n>=sizeof(Bitmask)*8 ){
- n = sizeof(Bitmask)*8-1;
- }
- assert( pMatch->iCursor==pExpr->iTable );
- pMatch->colUsed |= ((Bitmask)1)<<n;
- }
-
-lookupname_end:
- /* Clean up and return
- */
- sqlite3_free(zDb);
- sqlite3_free(zTab);
- sqlite3ExprDelete(pExpr->pLeft);
- pExpr->pLeft = 0;
- sqlite3ExprDelete(pExpr->pRight);
- pExpr->pRight = 0;
- pExpr->op = TK_COLUMN;
-lookupname_end_2:
- sqlite3_free(zCol);
- if( cnt==1 ){
- assert( pNC!=0 );
- sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
- if( pMatch && !pMatch->pSelect ){
- pExpr->pTab = pMatch->pTab;
- }
- /* Increment the nRef value on all name contexts from TopNC up to
- ** the point where the name matched. */
- for(;;){
- assert( pTopNC!=0 );
- pTopNC->nRef++;
- if( pTopNC==pNC ) break;
- pTopNC = pTopNC->pNext;
- }
- return 0;
- } else {
- return 1;
- }
-}
-
-/*
-** This routine is designed as an xFunc for walkExprTree().
+** x IN (SELECT ...)
**
-** Resolve symbolic names into TK_COLUMN operators for the current
-** node in the expression tree. Return 0 to continue the search down
-** the tree or 2 to abort the tree walk.
+** Where the SELECT... clause is as specified by the parameter to this
+** routine.
**
-** This routine also does error checking and name resolution for
-** function names. The operator for aggregate functions is changed
-** to TK_AGG_FUNCTION.
-*/
-static int nameResolverStep(void *pArg, Expr *pExpr){
- NameContext *pNC = (NameContext*)pArg;
- Parse *pParse;
-
- if( pExpr==0 ) return 1;
- assert( pNC!=0 );
- pParse = pNC->pParse;
-
- if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return 1;
- ExprSetProperty(pExpr, EP_Resolved);
-#ifndef NDEBUG
- if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){
- SrcList *pSrcList = pNC->pSrcList;
- int i;
- for(i=0; i<pNC->pSrcList->nSrc; i++){
- assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab);
- }
- }
-#endif
- switch( pExpr->op ){
- /* Double-quoted strings (ex: "abc") are used as identifiers if
- ** possible. Otherwise they remain as strings. Single-quoted
- ** strings (ex: 'abc') are always string literals.
- */
- case TK_STRING: {
- if( pExpr->token.z[0]=='\'' ) break;
- /* Fall thru into the TK_ID case if this is a double-quoted string */
- }
- /* A lone identifier is the name of a column.
- */
- case TK_ID: {
- lookupName(pParse, 0, 0, &pExpr->token, pNC, pExpr);
- return 1;
- }
-
- /* A table name and column name: ID.ID
- ** Or a database, table and column: ID.ID.ID
- */
- case TK_DOT: {
- Token *pColumn;
- Token *pTable;
- Token *pDb;
- Expr *pRight;
-
- /* if( pSrcList==0 ) break; */
- pRight = pExpr->pRight;
- if( pRight->op==TK_ID ){
- pDb = 0;
- pTable = &pExpr->pLeft->token;
- pColumn = &pRight->token;
- }else{
- assert( pRight->op==TK_DOT );
- pDb = &pExpr->pLeft->token;
- pTable = &pRight->pLeft->token;
- pColumn = &pRight->pRight->token;
- }
- lookupName(pParse, pDb, pTable, pColumn, pNC, pExpr);
- return 1;
- }
-
- /* Resolve function names
- */
- case TK_CONST_FUNC:
- case TK_FUNCTION: {
- ExprList *pList = pExpr->pList; /* The argument list */
- int n = pList ? pList->nExpr : 0; /* Number of arguments */
- int no_such_func = 0; /* True if no such function exists */
- int wrong_num_args = 0; /* True if wrong number of arguments */
- int is_agg = 0; /* True if is an aggregate function */
- int i;
- int auth; /* Authorization to use the function */
- int nId; /* Number of characters in function name */
- const char *zId; /* The function name. */
- FuncDef *pDef; /* Information about the function */
- int enc = ENC(pParse->db); /* The database encoding */
-
- zId = (char*)pExpr->token.z;
- nId = pExpr->token.n;
- pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0);
- if( pDef==0 ){
- pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0);
- if( pDef==0 ){
- no_such_func = 1;
- }else{
- wrong_num_args = 1;
- }
- }else{
- is_agg = pDef->xFunc==0;
- }
-#ifndef SQLITE_OMIT_AUTHORIZATION
- if( pDef ){
- auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0);
- if( auth!=SQLITE_OK ){
- if( auth==SQLITE_DENY ){
- sqlite3ErrorMsg(pParse, "not authorized to use function: %s",
- pDef->zName);
- pNC->nErr++;
- }
- pExpr->op = TK_NULL;
- return 1;
- }
- }
-#endif
- if( is_agg && !pNC->allowAgg ){
- sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
- pNC->nErr++;
- is_agg = 0;
- }else if( no_such_func ){
- sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
- pNC->nErr++;
- }else if( wrong_num_args ){
- sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
- nId, zId);
- pNC->nErr++;
- }
- if( is_agg ){
- pExpr->op = TK_AGG_FUNCTION;
- pNC->hasAgg = 1;
- }
- if( is_agg ) pNC->allowAgg = 0;
- for(i=0; pNC->nErr==0 && i<n; i++){
- walkExprTree(pList->a[i].pExpr, nameResolverStep, pNC);
- }
- if( is_agg ) pNC->allowAgg = 1;
- /* FIX ME: Compute pExpr->affinity based on the expected return
- ** type of the function
- */
- return is_agg;
- }
-#ifndef SQLITE_OMIT_SUBQUERY
- case TK_SELECT:
- case TK_EXISTS:
-#endif
- case TK_IN: {
- if( pExpr->pSelect ){
- int nRef = pNC->nRef;
-#ifndef SQLITE_OMIT_CHECK
- if( pNC->isCheck ){
- sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints");
- }
-#endif
- sqlite3SelectResolve(pParse, pExpr->pSelect, pNC);
- assert( pNC->nRef>=nRef );
- if( nRef!=pNC->nRef ){
- ExprSetProperty(pExpr, EP_VarSelect);
- }
- }
- break;
- }
-#ifndef SQLITE_OMIT_CHECK
- case TK_VARIABLE: {
- if( pNC->isCheck ){
- sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints");
- }
- break;
- }
-#endif
- }
- return 0;
-}
-
-/*
-** This routine walks an expression tree and resolves references to
-** table columns. Nodes of the form ID.ID or ID resolve into an
-** index to the table in the table list and a column offset. The
-** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable
-** value is changed to the index of the referenced table in pTabList
-** plus the "base" value. The base value will ultimately become the
-** VDBE cursor number for a cursor that is pointing into the referenced
-** table. The Expr.iColumn value is changed to the index of the column
-** of the referenced table. The Expr.iColumn value for the special
-** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an
-** alias for ROWID.
-**
-** Also resolve function names and check the functions for proper
-** usage. Make sure all function names are recognized and all functions
-** have the correct number of arguments. Leave an error message
-** in pParse->zErrMsg if anything is amiss. Return the number of errors.
-**
-** If the expression contains aggregate functions then set the EP_Agg
-** property on the expression.
-*/
-SQLITE_PRIVATE int sqlite3ExprResolveNames(
- NameContext *pNC, /* Namespace to resolve expressions in. */
- Expr *pExpr /* The expression to be analyzed. */
-){
- int savedHasAgg;
-
- if( pExpr==0 ) return 0;
-#if SQLITE_MAX_EXPR_DEPTH>0
- {
- int mxDepth = pNC->pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH];
- if( (pExpr->nHeight+pNC->pParse->nHeight)>mxDepth ){
- sqlite3ErrorMsg(pNC->pParse,
- "Expression tree is too large (maximum depth %d)", mxDepth
- );
- return 1;
- }
- pNC->pParse->nHeight += pExpr->nHeight;
- }
-#endif
- savedHasAgg = pNC->hasAgg;
- pNC->hasAgg = 0;
- walkExprTree(pExpr, nameResolverStep, pNC);
-#if SQLITE_MAX_EXPR_DEPTH>0
- pNC->pParse->nHeight -= pExpr->nHeight;
-#endif
- if( pNC->nErr>0 ){
- ExprSetProperty(pExpr, EP_Error);
- }
- if( pNC->hasAgg ){
- ExprSetProperty(pExpr, EP_Agg);
- }else if( savedHasAgg ){
- pNC->hasAgg = 1;
- }
- return ExprHasProperty(pExpr, EP_Error);
-}
-
-/*
-** A pointer instance of this structure is used to pass information
-** through walkExprTree into codeSubqueryStep().
-*/
-typedef struct QueryCoder QueryCoder;
-struct QueryCoder {
- Parse *pParse; /* The parsing context */
- NameContext *pNC; /* Namespace of first enclosing query */
-};
-
-#ifdef SQLITE_TEST
- int sqlite3_enable_in_opt = 1;
-#else
- #define sqlite3_enable_in_opt 1
-#endif
-
-/*
-** Return true if the IN operator optimization is enabled and
-** the SELECT statement p exists and is of the
-** simple form:
-**
-** SELECT <column> FROM <table>
-**
-** If this is the case, it may be possible to use an existing table
-** or index instead of generating an epheremal table.
+** The Select object passed in has already been preprocessed and no
+** errors have been found.
*/
#ifndef SQLITE_OMIT_SUBQUERY
static int isCandidateForInOpt(Select *p){
SrcList *pSrc;
ExprList *pEList;
Table *pTab;
- if( !sqlite3_enable_in_opt ) return 0; /* IN optimization must be enabled */
if( p==0 ) return 0; /* right-hand side of IN is SELECT */
if( p->pPrior ) return 0; /* Not a compound SELECT */
- if( p->isDistinct ) return 0; /* No DISTINCT keyword */
- if( p->isAgg ) return 0; /* Contains no aggregate functions */
- if( p->pGroupBy ) return 0; /* Has no GROUP BY clause */
+ if( p->selFlags & (SF_Distinct|SF_Aggregate) ){
+ testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
+ testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
+ return 0; /* No DISTINCT keyword and no aggregate functions */
+ }
+ assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */
if( p->pLimit ) return 0; /* Has no LIMIT clause */
- if( p->pOffset ) return 0;
+ assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */
if( p->pWhere ) return 0; /* Has no WHERE clause */
pSrc = p->pSrc;
- if( pSrc==0 ) return 0; /* A single table in the FROM clause */
- if( pSrc->nSrc!=1 ) return 0;
- if( pSrc->a[0].pSelect ) return 0; /* FROM clause is not a subquery */
+ assert( pSrc!=0 );
+ if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */
+ if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */
pTab = pSrc->a[0].pTab;
- if( pTab==0 ) return 0;
- if( pTab->pSelect ) return 0; /* FROM clause is not a view */
+ if( NEVER(pTab==0) ) return 0;
+ assert( pTab->pSelect==0 ); /* FROM clause is not a view */
if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */
pEList = p->pEList;
if( pEList->nExpr!=1 ) return 0; /* One column in the result set */
@@ -49177,52 +61304,78 @@ static int isCandidateForInOpt(Select *p){
** either to test for membership of the (...) set or to iterate through
** its members, skipping duplicates.
**
-** The cursor opened on the structure (database table, database index
+** The index of the cursor opened on the b-tree (database table, database index
** or ephermal table) is stored in pX->iTable before this function returns.
-** The returned value indicates the structure type, as follows:
+** The returned value of this function indicates the b-tree type, as follows:
**
** IN_INDEX_ROWID - The cursor was opened on a database table.
** IN_INDEX_INDEX - The cursor was opened on a database index.
** IN_INDEX_EPH - The cursor was opened on a specially created and
** populated epheremal table.
**
-** An existing structure may only be used if the SELECT is of the simple
+** An existing b-tree may only be used if the SELECT is of the simple
** form:
**
** SELECT <column> FROM <table>
**
-** If the mustBeUnique parameter is false, the structure will be used
+** If the prNotFound parameter is 0, then the b-tree will be used to iterate
+** through the set members, skipping any duplicates. In this case an
+** epheremal table must be used unless the selected <column> is guaranteed
+** to be unique - either because it is an INTEGER PRIMARY KEY or it
+** has a UNIQUE constraint or UNIQUE index.
+**
+** If the prNotFound parameter is not 0, then the b-tree will be used
** for fast set membership tests. In this case an epheremal table must
** be used unless <column> is an INTEGER PRIMARY KEY or an index can
** be found with <column> as its left-most column.
**
-** If mustBeUnique is true, then the structure will be used to iterate
-** through the set members, skipping any duplicates. In this case an
-** epheremal table must be used unless the selected <column> is guaranteed
-** to be unique - either because it is an INTEGER PRIMARY KEY or it
-** is unique by virtue of a constraint or implicit index.
+** When the b-tree is being used for membership tests, the calling function
+** needs to know whether or not the structure contains an SQL NULL
+** value in order to correctly evaluate expressions like "X IN (Y, Z)".
+** If there is a chance that the b-tree might contain a NULL value at
+** runtime, then a register is allocated and the register number written
+** to *prNotFound. If there is no chance that the b-tree contains a
+** NULL value, then *prNotFound is left unchanged.
+**
+** If a register is allocated and its location stored in *prNotFound, then
+** its initial value is NULL. If the b-tree does not remain constant
+** for the duration of the query (i.e. the SELECT that generates the b-tree
+** is a correlated subquery) then the value of the allocated register is
+** reset to NULL each time the b-tree is repopulated. This allows the
+** caller to use vdbe code equivalent to the following:
+**
+** if( register==NULL ){
+** has_null = <test if data structure contains null>
+** register = 1
+** }
+**
+** in order to avoid running the <test if data structure contains null>
+** test more often than is necessary.
*/
#ifndef SQLITE_OMIT_SUBQUERY
-SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int mustBeUnique){
- Select *p;
- int eType = 0;
- int iTab = pParse->nTab++;
-
- /* The follwing if(...) expression is true if the SELECT is of the
- ** simple form:
- **
- ** SELECT <column> FROM <table>
- **
- ** If this is the case, it may be possible to use an existing table
- ** or index instead of generating an epheremal table.
- */
- p = pX->pSelect;
- if( isCandidateForInOpt(p) ){
- sqlite3 *db = pParse->db;
- Index *pIdx;
- Expr *pExpr = p->pEList->a[0].pExpr;
- int iCol = pExpr->iColumn;
- Vdbe *v = sqlite3GetVdbe(pParse);
+SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
+ Select *p; /* SELECT to the right of IN operator */
+ int eType = 0; /* Type of RHS table. IN_INDEX_* */
+ int iTab = pParse->nTab++; /* Cursor of the RHS table */
+ int mustBeUnique = (prNotFound==0); /* True if RHS must be unique */
+
+ /* Check to see if an existing table or index can be used to
+ ** satisfy the query. This is preferable to generating a new
+ ** ephemeral table.
+ */
+ p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
+ if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
+ sqlite3 *db = pParse->db; /* Database connection */
+ Expr *pExpr = p->pEList->a[0].pExpr; /* Expression <column> */
+ int iCol = pExpr->iColumn; /* Index of column <column> */
+ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
+ Table *pTab = p->pSrc->a[0].pTab; /* Table <table>. */
+ int iDb; /* Database idx for pTab */
+
+ /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
/* This function is only called from two places. In both cases the vdbe
** has already been allocated. So assume sqlite3GetVdbe() is always
@@ -49232,9 +61385,6 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int mustBeUnique)
if( iCol<0 ){
int iMem = ++pParse->nMem;
int iAddr;
- Table *pTab = p->pSrc->a[0].pTab;
- int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
- sqlite3VdbeUsesBtree(v, iDb);
iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem);
sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem);
@@ -49244,52 +61394,59 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int mustBeUnique)
sqlite3VdbeJumpHere(v, iAddr);
}else{
- /* The collation sequence used by the comparison. If an index is to
+ Index *pIdx; /* Iterator variable */
+
+ /* The collation sequence used by the comparison. If an index is to
** be used in place of a temp-table, it must be ordered according
- ** to this collation sequence.
- */
+ ** to this collation sequence. */
CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr);
/* Check that the affinity that will be used to perform the
** comparison is the same as the affinity of the column. If
** it is not, it is not possible to use any index.
*/
- Table *pTab = p->pSrc->a[0].pTab;
char aff = comparisonAffinity(pX);
int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE);
for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){
if( (pIdx->aiColumn[0]==iCol)
- && (pReq==sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], -1, 0))
+ && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq
&& (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None))
){
- int iDb;
int iMem = ++pParse->nMem;
int iAddr;
char *pKey;
pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx);
- iDb = sqlite3SchemaToIndex(db, pIdx->pSchema);
- sqlite3VdbeUsesBtree(v, iDb);
-
iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem);
sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem);
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pIdx->nColumn);
sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pIdx->tnum, iDb,
pKey,P4_KEYINFO_HANDOFF);
VdbeComment((v, "%s", pIdx->zName));
eType = IN_INDEX_INDEX;
sqlite3VdbeJumpHere(v, iAddr);
+ if( prNotFound && !pTab->aCol[iCol].notNull ){
+ *prNotFound = ++pParse->nMem;
+ }
}
}
}
}
if( eType==0 ){
- sqlite3CodeSubselect(pParse, pX);
+ /* Could not found an existing able or index to use as the RHS b-tree.
+ ** We will have to generate an ephemeral table to do the job.
+ */
+ int rMayHaveNull = 0;
eType = IN_INDEX_EPH;
+ if( prNotFound ){
+ *prNotFound = rMayHaveNull = ++pParse->nMem;
+ }else if( pX->pLeft->iColumn<0 && !ExprHasAnyProperty(pX, EP_xIsSelect) ){
+ eType = IN_INDEX_ROWID;
+ }
+ sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID);
}else{
pX->iTable = iTab;
}
@@ -49308,13 +61465,36 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int mustBeUnique)
**
** The pExpr parameter describes the expression that contains the IN
** operator or subquery.
+**
+** If parameter isRowid is non-zero, then expression pExpr is guaranteed
+** to be of the form "<rowid> IN (?, ?, ?)", where <rowid> is a reference
+** to some integer key column of a table B-Tree. In this case, use an
+** intkey B-Tree to store the set of IN(...) values instead of the usual
+** (slower) variable length keys B-Tree.
+**
+** If rMayHaveNull is non-zero, that means that the operation is an IN
+** (not a SELECT or EXISTS) and that the RHS might contains NULLs.
+** Furthermore, the IN is in a WHERE clause and that we really want
+** to iterate over the RHS of the IN operator in order to quickly locate
+** all corresponding LHS elements. All this routine does is initialize
+** the register given by rMayHaveNull to NULL. Calling routines will take
+** care of changing this register value to non-NULL if the RHS is NULL-free.
+**
+** If rMayHaveNull is zero, that means that the subquery is being used
+** for membership testing only. There is no need to initialize any
+** registers to indicate the presense or absence of NULLs on the RHS.
*/
#ifndef SQLITE_OMIT_SUBQUERY
-SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
+SQLITE_PRIVATE void sqlite3CodeSubselect(
+ Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* The IN, SELECT, or EXISTS operator */
+ int rMayHaveNull, /* Register that records whether NULLs exist in RHS */
+ int isRowid /* If true, LHS of IN operator is a rowid */
+){
int testAddr = 0; /* One-time test address */
Vdbe *v = sqlite3GetVdbe(pParse);
- if( v==0 ) return;
-
+ if( NEVER(v==0) ) return;
+ sqlite3ExprCachePush(pParse);
/* This code must be run in its entirety every time it is encountered
** if any of the following is true:
@@ -49326,7 +61506,7 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
** If all of the above are false, then we can run this code just once
** save the results, and reuse the same result on subsequent invocations.
*/
- if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->trigStack ){
+ if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->pTriggerTab ){
int mem = ++pParse->nMem;
sqlite3VdbeAddOp1(v, OP_If, mem);
testAddr = sqlite3VdbeAddOp2(v, OP_Integer, 1, mem);
@@ -49338,8 +61518,13 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
char affinity;
KeyInfo keyInfo;
int addr; /* Address of OP_OpenEphemeral instruction */
+ Expr *pLeft = pExpr->pLeft;
- affinity = sqlite3ExprAffinity(pExpr->pLeft);
+ if( rMayHaveNull ){
+ sqlite3VdbeAddOp2(v, OP_Null, 0, rMayHaveNull);
+ }
+
+ affinity = sqlite3ExprAffinity(pLeft);
/* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
** expression it is handled the same way. A virtual table is
@@ -49355,11 +61540,11 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
** is used.
*/
pExpr->iTable = pParse->nTab++;
- addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, 1);
+ addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid);
memset(&keyInfo, 0, sizeof(keyInfo));
keyInfo.nField = 1;
- if( pExpr->pSelect ){
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
/* Case 1: expr IN (SELECT ...)
**
** Generate code to write the results of the select into the temporary
@@ -49368,18 +61553,19 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
SelectDest dest;
ExprList *pEList;
+ assert( !isRowid );
sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable);
- dest.affinity = (int)affinity;
+ dest.affinity = (u8)affinity;
assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );
- if( sqlite3Select(pParse, pExpr->pSelect, &dest, 0, 0, 0, 0) ){
+ if( sqlite3Select(pParse, pExpr->x.pSelect, &dest) ){
return;
}
- pEList = pExpr->pSelect->pEList;
- if( pEList && pEList->nExpr>0 ){
+ pEList = pExpr->x.pSelect->pEList;
+ if( ALWAYS(pEList!=0 && pEList->nExpr>0) ){
keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft,
pEList->a[0].pExpr);
}
- }else if( pExpr->pList ){
+ }else if( pExpr->x.pList!=0 ){
/* Case 2: expr IN (exprlist)
**
** For each expression, build an index key from the evaluation and
@@ -49388,18 +61574,19 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
** a column, use numeric affinity.
*/
int i;
- ExprList *pList = pExpr->pList;
+ ExprList *pList = pExpr->x.pList;
struct ExprList_item *pItem;
- int r1, r2;
+ int r1, r2, r3;
if( !affinity ){
affinity = SQLITE_AFF_NONE;
}
- keyInfo.aColl[0] = pExpr->pLeft->pColl;
+ keyInfo.aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
/* Loop through each expression in <exprlist>. */
r1 = sqlite3GetTempReg(pParse);
r2 = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_Null, 0, r2);
for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){
Expr *pE2 = pItem->pExpr;
@@ -49414,32 +61601,44 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
}
/* Evaluate the expression and insert it into the temp table */
- pParse->disableColCache++;
- sqlite3ExprCode(pParse, pE2, r1);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
- sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1);
- sqlite3ExprCacheAffinityChange(pParse, r1, 1);
- sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2);
+ r3 = sqlite3ExprCodeTarget(pParse, pE2, r1);
+ if( isRowid ){
+ sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, sqlite3VdbeCurrentAddr(v)+2);
+ sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3);
+ }else{
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1);
+ sqlite3ExprCacheAffinityChange(pParse, r3, 1);
+ sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2);
+ }
}
sqlite3ReleaseTempReg(pParse, r1);
sqlite3ReleaseTempReg(pParse, r2);
}
- sqlite3VdbeChangeP4(v, addr, (void *)&keyInfo, P4_KEYINFO);
+ if( !isRowid ){
+ sqlite3VdbeChangeP4(v, addr, (void *)&keyInfo, P4_KEYINFO);
+ }
break;
}
case TK_EXISTS:
- case TK_SELECT: {
- /* This has to be a scalar SELECT. Generate code to put the
+ case TK_SELECT:
+ default: {
+ /* If this has to be a scalar SELECT. Generate code to put the
** value of this select in a memory cell and record the number
- ** of the memory cell in iColumn.
+ ** of the memory cell in iColumn. If this is an EXISTS, write
+ ** an integer 0 (not exists) or 1 (exists) into a memory cell
+ ** and record that memory cell in iColumn.
*/
- static const Token one = { (u8*)"1", 0, 1 };
- Select *pSel;
- SelectDest dest;
+ static const Token one = { "1", 1 }; /* Token for literal value 1 */
+ Select *pSel; /* SELECT statement to encode */
+ SelectDest dest; /* How to deal with SELECt result */
+
+ testcase( pExpr->op==TK_EXISTS );
+ testcase( pExpr->op==TK_SELECT );
+ assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
- pSel = pExpr->pSelect;
+ assert( ExprHasProperty(pExpr, EP_xIsSelect) );
+ pSel = pExpr->x.pSelect;
sqlite3SelectDestInit(&dest, 0, ++pParse->nMem);
if( pExpr->op==TK_SELECT ){
dest.eDest = SRT_Mem;
@@ -49450,12 +61649,13 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iParm);
VdbeComment((v, "Init EXISTS result"));
}
- sqlite3ExprDelete(pSel->pLimit);
+ sqlite3ExprDelete(pParse->db, pSel->pLimit);
pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &one);
- if( sqlite3Select(pParse, pSel, &dest, 0, 0, 0, 0) ){
+ if( sqlite3Select(pParse, pSel, &dest) ){
return;
}
- pExpr->iColumn = dest.iParm;
+ pExpr->iColumn = (i16)dest.iParm;
+ ExprSetIrreducible(pExpr);
break;
}
}
@@ -49463,6 +61663,7 @@ SQLITE_PRIVATE void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
if( testAddr ){
sqlite3VdbeJumpHere(v, testAddr-1);
}
+ sqlite3ExprCachePop(pParse, 1);
return;
}
@@ -49487,20 +61688,15 @@ static char *dup8bytes(Vdbe *v, const char *in){
** z[n] character is guaranteed to be something that does not look
** like the continuation of the number.
*/
-static void codeReal(Vdbe *v, const char *z, int n, int negateFlag, int iMem){
- assert( z || v==0 || sqlite3VdbeDb(v)->mallocFailed );
- if( z ){
+static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
+ if( ALWAYS(z!=0) ){
double value;
char *zV;
- assert( !isdigit(z[n]) );
sqlite3AtoF(z, &value);
- if( sqlite3IsNaN(value) ){
- sqlite3VdbeAddOp2(v, OP_Null, 0, iMem);
- }else{
- if( negateFlag ) value = -value;
- zV = dup8bytes(v, (char*)&value);
- sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
- }
+ assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
+ if( negateFlag ) value = -value;
+ zV = dup8bytes(v, (char*)&value);
+ sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
}
}
@@ -49513,15 +61709,15 @@ static void codeReal(Vdbe *v, const char *z, int n, int negateFlag, int iMem){
** z[n] character is guaranteed to be something that does not look
** like the continuation of the number.
*/
-static void codeInteger(Vdbe *v, const char *z, int n, int negFlag, int iMem){
- assert( z || v==0 || sqlite3VdbeDb(v)->mallocFailed );
- if( z ){
- int i;
- assert( !isdigit(z[n]) );
- if( sqlite3GetInt32(z, &i) ){
- if( negFlag ) i = -i;
- sqlite3VdbeAddOp2(v, OP_Integer, i, iMem);
- }else if( sqlite3FitsIn64Bits(z, negFlag) ){
+static void codeInteger(Vdbe *v, Expr *pExpr, int negFlag, int iMem){
+ if( pExpr->flags & EP_IntValue ){
+ int i = pExpr->u.iValue;
+ if( negFlag ) i = -i;
+ sqlite3VdbeAddOp2(v, OP_Integer, i, iMem);
+ }else{
+ const char *z = pExpr->u.zToken;
+ assert( z!=0 );
+ if( sqlite3FitsIn64Bits(z, negFlag) ){
i64 value;
char *zV;
sqlite3Atoi64(z, &value);
@@ -49529,11 +61725,143 @@ static void codeInteger(Vdbe *v, const char *z, int n, int negFlag, int iMem){
zV = dup8bytes(v, (char*)&value);
sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64);
}else{
- codeReal(v, z, n, negFlag, iMem);
+ codeReal(v, z, negFlag, iMem);
+ }
+ }
+}
+
+/*
+** Clear a cache entry.
+*/
+static void cacheEntryClear(Parse *pParse, struct yColCache *p){
+ if( p->tempReg ){
+ if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){
+ pParse->aTempReg[pParse->nTempReg++] = p->iReg;
+ }
+ p->tempReg = 0;
+ }
+}
+
+
+/*
+** Record in the column cache that a particular column from a
+** particular table is stored in a particular register.
+*/
+SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){
+ int i;
+ int minLru;
+ int idxLru;
+ struct yColCache *p;
+
+ assert( iReg>0 ); /* Register numbers are always positive */
+ assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */
+
+ /* First replace any existing entry */
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg && p->iTable==iTab && p->iColumn==iCol ){
+ cacheEntryClear(pParse, p);
+ p->iLevel = pParse->iCacheLevel;
+ p->iReg = iReg;
+ p->affChange = 0;
+ p->lru = pParse->iCacheCnt++;
+ return;
}
}
+
+ /* Find an empty slot and replace it */
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg==0 ){
+ p->iLevel = pParse->iCacheLevel;
+ p->iTable = iTab;
+ p->iColumn = iCol;
+ p->iReg = iReg;
+ p->affChange = 0;
+ p->tempReg = 0;
+ p->lru = pParse->iCacheCnt++;
+ return;
+ }
+ }
+
+ /* Replace the last recently used */
+ minLru = 0x7fffffff;
+ idxLru = -1;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->lru<minLru ){
+ idxLru = i;
+ minLru = p->lru;
+ }
+ }
+ if( ALWAYS(idxLru>=0) ){
+ p = &pParse->aColCache[idxLru];
+ p->iLevel = pParse->iCacheLevel;
+ p->iTable = iTab;
+ p->iColumn = iCol;
+ p->iReg = iReg;
+ p->affChange = 0;
+ p->tempReg = 0;
+ p->lru = pParse->iCacheCnt++;
+ return;
+ }
+}
+
+/*
+** Indicate that a register is being overwritten. Purge the register
+** from the column cache.
+*/
+SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg){
+ int i;
+ struct yColCache *p;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg==iReg ){
+ cacheEntryClear(pParse, p);
+ p->iReg = 0;
+ }
+ }
+}
+
+/*
+** Remember the current column cache context. Any new entries added
+** added to the column cache after this call are removed when the
+** corresponding pop occurs.
+*/
+SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){
+ pParse->iCacheLevel++;
}
+/*
+** Remove from the column cache any entries that were added since the
+** the previous N Push operations. In other words, restore the cache
+** to the state it was in N Pushes ago.
+*/
+SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse, int N){
+ int i;
+ struct yColCache *p;
+ assert( N>0 );
+ assert( pParse->iCacheLevel>=N );
+ pParse->iCacheLevel -= N;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg && p->iLevel>pParse->iCacheLevel ){
+ cacheEntryClear(pParse, p);
+ p->iReg = 0;
+ }
+ }
+}
+
+/*
+** When a cached column is reused, make sure that its register is
+** no longer available as a temp register. ticket #3879: that same
+** register might be in the cache in multiple places, so be sure to
+** get them all.
+*/
+static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){
+ int i;
+ struct yColCache *p;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg==iReg ){
+ p->tempReg = 0;
+ }
+ }
+}
/*
** Generate code that will extract the iColumn-th column from
@@ -49562,63 +61890,37 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(
int i;
struct yColCache *p;
- for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){
- if( p->iTable==iTable && p->iColumn==iColumn
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn
&& (!p->affChange || allowAffChng) ){
-#if 0
- sqlite3VdbeAddOp0(v, OP_Noop);
- VdbeComment((v, "OPT: tab%d.col%d -> r%d", iTable, iColumn, p->iReg));
-#endif
+ p->lru = pParse->iCacheCnt++;
+ sqlite3ExprCachePinRegister(pParse, p->iReg);
return p->iReg;
}
}
assert( v!=0 );
if( iColumn<0 ){
- int op = (pTab && IsVirtual(pTab)) ? OP_VRowid : OP_Rowid;
- sqlite3VdbeAddOp2(v, op, iTable, iReg);
- }else if( pTab==0 ){
- sqlite3VdbeAddOp3(v, OP_Column, iTable, iColumn, iReg);
- }else{
+ sqlite3VdbeAddOp2(v, OP_Rowid, iTable, iReg);
+ }else if( ALWAYS(pTab!=0) ){
int op = IsVirtual(pTab) ? OP_VColumn : OP_Column;
sqlite3VdbeAddOp3(v, op, iTable, iColumn, iReg);
- sqlite3ColumnDefault(v, pTab, iColumn);
-#ifndef SQLITE_OMIT_FLOATING_POINT
- if( pTab->aCol[iColumn].affinity==SQLITE_AFF_REAL ){
- sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
- }
-#endif
- }
- if( pParse->disableColCache==0 ){
- i = pParse->iColCache;
- p = &pParse->aColCache[i];
- p->iTable = iTable;
- p->iColumn = iColumn;
- p->iReg = iReg;
- p->affChange = 0;
- i++;
- if( i>=ArraySize(pParse->aColCache) ) i = 0;
- if( i>pParse->nColCache ) pParse->nColCache = i;
- pParse->iColCache = i;
+ sqlite3ColumnDefault(v, pTab, iColumn, iReg);
}
+ sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg);
return iReg;
}
/*
-** Clear all column cache entries associated with the vdbe
-** cursor with cursor number iTable.
+** Clear all column cache entries.
*/
-SQLITE_PRIVATE void sqlite3ExprClearColumnCache(Parse *pParse, int iTable){
- if( iTable<0 ){
- pParse->nColCache = 0;
- pParse->iColCache = 0;
- }else{
- int i;
- for(i=0; i<pParse->nColCache; i++){
- if( pParse->aColCache[i].iTable==iTable ){
- testcase( i==pParse->nColCache-1 );
- pParse->aColCache[i] = pParse->aColCache[--pParse->nColCache];
- pParse->iColCache = pParse->nColCache;
- }
+SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){
+ int i;
+ struct yColCache *p;
+
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg ){
+ cacheEntryClear(pParse, p);
+ p->iReg = 0;
}
}
}
@@ -49630,70 +61932,56 @@ SQLITE_PRIVATE void sqlite3ExprClearColumnCache(Parse *pParse, int iTable){
SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){
int iEnd = iStart + iCount - 1;
int i;
- for(i=0; i<pParse->nColCache; i++){
- int r = pParse->aColCache[i].iReg;
+ struct yColCache *p;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ int r = p->iReg;
if( r>=iStart && r<=iEnd ){
- pParse->aColCache[i].affChange = 1;
+ p->affChange = 1;
}
}
}
/*
-** Generate code to moves content from one register to another.
-** Keep the column cache up-to-date.
+** Generate code to move content from registers iFrom...iFrom+nReg-1
+** over to iTo..iTo+nReg-1. Keep the column cache up-to-date.
*/
-SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo){
+SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){
int i;
- if( iFrom==iTo ) return;
- sqlite3VdbeAddOp2(pParse->pVdbe, OP_Move, iFrom, iTo);
- for(i=0; i<pParse->nColCache; i++){
- if( pParse->aColCache[i].iReg==iFrom ){
- pParse->aColCache[i].iReg = iTo;
+ struct yColCache *p;
+ if( NEVER(iFrom==iTo) ) return;
+ sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg);
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ int x = p->iReg;
+ if( x>=iFrom && x<iFrom+nReg ){
+ p->iReg += iTo-iFrom;
}
}
}
/*
-** Return true if any register in the range iFrom..iTo (inclusive)
-** is used as part of the column cache.
+** Generate code to copy content from registers iFrom...iFrom+nReg-1
+** over to iTo..iTo+nReg-1.
*/
-static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){
+SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, int iFrom, int iTo, int nReg){
int i;
- for(i=0; i<pParse->nColCache; i++){
- int r = pParse->aColCache[i].iReg;
- if( r>=iFrom && r<=iTo ) return 1;
+ if( NEVER(iFrom==iTo) ) return;
+ for(i=0; i<nReg; i++){
+ sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, iFrom+i, iTo+i);
}
- return 0;
}
/*
-** Theres is a value in register iCurrent. We ultimately want
-** the value to be in register iTarget. It might be that
-** iCurrent and iTarget are the same register.
-**
-** We are going to modify the value, so we need to make sure it
-** is not a cached register. If iCurrent is a cached register,
-** then try to move the value over to iTarget. If iTarget is a
-** cached register, then clear the corresponding cache line.
-**
-** Return the register that the value ends up in.
+** Return true if any register in the range iFrom..iTo (inclusive)
+** is used as part of the column cache.
*/
-SQLITE_PRIVATE int sqlite3ExprWritableRegister(Parse *pParse, int iCurrent, int iTarget){
+static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){
int i;
- assert( pParse->pVdbe!=0 );
- if( !usedAsColumnCache(pParse, iCurrent, iCurrent) ){
- return iCurrent;
- }
- if( iCurrent!=iTarget ){
- sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, iCurrent, iTarget);
- }
- for(i=0; i<pParse->nColCache; i++){
- if( pParse->aColCache[i].iReg==iTarget ){
- pParse->aColCache[i] = pParse->aColCache[--pParse->nColCache];
- pParse->iColCache = pParse->nColCache;
- }
+ struct yColCache *p;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ int r = p->iReg;
+ if( r>=iFrom && r<=iTo ) return 1;
}
- return iTarget;
+ return 0;
}
/*
@@ -49702,25 +61990,73 @@ SQLITE_PRIVATE int sqlite3ExprWritableRegister(Parse *pParse, int iCurrent, int
** convert the last instruction from OP_SCopy to OP_Copy.
*/
SQLITE_PRIVATE void sqlite3ExprHardCopy(Parse *pParse, int iReg, int nReg){
- int addr;
VdbeOp *pOp;
Vdbe *v;
+ assert( pParse->db->mallocFailed==0 );
v = pParse->pVdbe;
- addr = sqlite3VdbeCurrentAddr(v);
- pOp = sqlite3VdbeGetOp(v, addr-1);
- assert( pOp || pParse->db->mallocFailed );
- if( pOp && pOp->opcode==OP_SCopy && pOp->p1>=iReg && pOp->p1<iReg+nReg ){
+ assert( v!=0 );
+ pOp = sqlite3VdbeGetOp(v, -1);
+ assert( pOp!=0 );
+ if( pOp->opcode==OP_SCopy && pOp->p1>=iReg && pOp->p1<iReg+nReg ){
pOp->opcode = OP_Copy;
}
}
/*
+** Generate code to store the value of the iAlias-th alias in register
+** target. The first time this is called, pExpr is evaluated to compute
+** the value of the alias. The value is stored in an auxiliary register
+** and the number of that register is returned. On subsequent calls,
+** the register number is returned without generating any code.
+**
+** Note that in order for this to work, code must be generated in the
+** same order that it is executed.
+**
+** Aliases are numbered starting with 1. So iAlias is in the range
+** of 1 to pParse->nAlias inclusive.
+**
+** pParse->aAlias[iAlias-1] records the register number where the value
+** of the iAlias-th alias is stored. If zero, that means that the
+** alias has not yet been computed.
+*/
+static int codeAlias(Parse *pParse, int iAlias, Expr *pExpr, int target){
+#if 0
+ sqlite3 *db = pParse->db;
+ int iReg;
+ if( pParse->nAliasAlloc<pParse->nAlias ){
+ pParse->aAlias = sqlite3DbReallocOrFree(db, pParse->aAlias,
+ sizeof(pParse->aAlias[0])*pParse->nAlias );
+ testcase( db->mallocFailed && pParse->nAliasAlloc>0 );
+ if( db->mallocFailed ) return 0;
+ memset(&pParse->aAlias[pParse->nAliasAlloc], 0,
+ (pParse->nAlias-pParse->nAliasAlloc)*sizeof(pParse->aAlias[0]));
+ pParse->nAliasAlloc = pParse->nAlias;
+ }
+ assert( iAlias>0 && iAlias<=pParse->nAlias );
+ iReg = pParse->aAlias[iAlias-1];
+ if( iReg==0 ){
+ if( pParse->iCacheLevel>0 ){
+ iReg = sqlite3ExprCodeTarget(pParse, pExpr, target);
+ }else{
+ iReg = ++pParse->nMem;
+ sqlite3ExprCode(pParse, pExpr, iReg);
+ pParse->aAlias[iAlias-1] = iReg;
+ }
+ }
+ return iReg;
+#else
+ UNUSED_PARAMETER(iAlias);
+ return sqlite3ExprCodeTarget(pParse, pExpr, target);
+#endif
+}
+
+/*
** Generate code into the current Vdbe to evaluate the given
** expression. Attempt to store the results in register "target".
** Return the register where results are stored.
**
-** With this routine, there is no guaranteed that results will
+** With this routine, there is no guarantee that results will
** be stored in target. The result might be stored in some other
** register if it is convenient to do so. The calling function
** must check the return code and move the results to the desired
@@ -49733,10 +62069,13 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
int regFree1 = 0; /* If non-zero free this temporary register */
int regFree2 = 0; /* If non-zero free this temporary register */
int r1, r2, r3, r4; /* Various register numbers */
+ sqlite3 *db = pParse->db; /* The database connection */
- assert( v!=0 || pParse->db->mallocFailed );
assert( target>0 && target<=pParse->nMem );
- if( v==0 ) return 0;
+ if( v==0 ){
+ assert( pParse->db->mallocFailed );
+ return 0;
+ }
if( pExpr==0 ){
op = TK_NULL;
@@ -49772,17 +62111,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
break;
}
case TK_INTEGER: {
- codeInteger(v, (char*)pExpr->token.z, pExpr->token.n, 0, target);
+ codeInteger(v, pExpr, 0, target);
break;
}
case TK_FLOAT: {
- codeReal(v, (char*)pExpr->token.z, pExpr->token.n, 0, target);
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ codeReal(v, pExpr->u.zToken, 0, target);
break;
}
case TK_STRING: {
- sqlite3DequoteExpr(pParse->db, pExpr);
- sqlite3VdbeAddOp4(v,OP_String8, 0, target, 0,
- (char*)pExpr->token.z, pExpr->token.n);
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0);
break;
}
case TK_NULL: {
@@ -49794,21 +62133,39 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
int n;
const char *z;
char *zBlob;
- assert( pExpr->token.n>=3 );
- assert( pExpr->token.z[0]=='x' || pExpr->token.z[0]=='X' );
- assert( pExpr->token.z[1]=='\'' );
- assert( pExpr->token.z[pExpr->token.n-1]=='\'' );
- n = pExpr->token.n - 3;
- z = (char*)pExpr->token.z + 2;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
+ assert( pExpr->u.zToken[1]=='\'' );
+ z = &pExpr->u.zToken[2];
+ n = sqlite3Strlen30(z) - 1;
+ assert( z[n]=='\'' );
zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n);
sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC);
break;
}
#endif
case TK_VARIABLE: {
- sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iTable, target);
- if( pExpr->token.n>1 ){
- sqlite3VdbeChangeP4(v, -1, (char*)pExpr->token.z, pExpr->token.n);
+ VdbeOp *pOp;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ assert( pExpr->u.zToken!=0 );
+ assert( pExpr->u.zToken[0]!=0 );
+ if( pExpr->u.zToken[1]==0
+ && (pOp = sqlite3VdbeGetOp(v, -1))->opcode==OP_Variable
+ && pOp->p1+pOp->p3==pExpr->iTable
+ && pOp->p2+pOp->p3==target
+ && pOp->p4.z==0
+ ){
+ /* If the previous instruction was a copy of the previous unnamed
+ ** parameter into the previous register, then simply increment the
+ ** repeat count on the prior instruction rather than making a new
+ ** instruction.
+ */
+ pOp->p3++;
+ }else{
+ sqlite3VdbeAddOp3(v, OP_Variable, pExpr->iTable, target, 1);
+ if( pExpr->u.zToken[1]!=0 ){
+ sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, 0);
+ }
}
break;
}
@@ -49816,12 +62173,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
inReg = pExpr->iTable;
break;
}
+ case TK_AS: {
+ inReg = codeAlias(pParse, pExpr->iTable, pExpr->pLeft, target);
+ break;
+ }
#ifndef SQLITE_OMIT_CAST
case TK_CAST: {
/* Expressions of the form: CAST(pLeft AS token) */
int aff, to_op;
inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
- aff = sqlite3AffinityType(&pExpr->token);
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ aff = sqlite3AffinityType(pExpr->u.zToken);
to_op = aff - SQLITE_AFF_TEXT + OP_ToText;
assert( to_op==OP_ToText || aff!=SQLITE_AFF_TEXT );
assert( to_op==OP_ToBlob || aff!=SQLITE_AFF_NONE );
@@ -49833,6 +62195,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
testcase( to_op==OP_ToNumeric );
testcase( to_op==OP_ToInt );
testcase( to_op==OP_ToReal );
+ if( inReg!=target ){
+ sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
+ inReg = target;
+ }
sqlite3VdbeAddOp1(v, to_op, inReg);
testcase( usedAsColumnCache(pParse, inReg, inReg) );
sqlite3ExprCacheAffinityChange(pParse, inReg, 1);
@@ -49865,6 +62231,19 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
testcase( regFree2==0 );
break;
}
+ case TK_IS:
+ case TK_ISNOT: {
+ testcase( op==TK_IS );
+ testcase( op==TK_ISNOT );
+ codeCompareOperands(pParse, pExpr->pLeft, &r1, &regFree1,
+ pExpr->pRight, &r2, &regFree2);
+ op = (op==TK_IS) ? TK_EQ : TK_NE;
+ codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
+ r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ);
+ testcase( regFree1==0 );
+ testcase( regFree2==0 );
+ break;
+ }
case TK_AND:
case TK_OR:
case TK_PLUS:
@@ -49909,13 +62288,11 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_UMINUS: {
Expr *pLeft = pExpr->pLeft;
assert( pLeft );
- if( pLeft->op==TK_FLOAT || pLeft->op==TK_INTEGER ){
- Token *p = &pLeft->token;
- if( pLeft->op==TK_FLOAT ){
- codeReal(v, (char*)p->z, p->n, 1, target);
- }else{
- codeInteger(v, (char*)p->z, p->n, 1, target);
- }
+ if( pLeft->op==TK_FLOAT ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ codeReal(v, pLeft->u.zToken, 1, target);
+ }else if( pLeft->op==TK_INTEGER ){
+ codeInteger(v, pLeft, 1, target);
}else{
regFree1 = r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp2(v, OP_Integer, 0, r1);
@@ -49932,11 +62309,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
assert( TK_NOT==OP_Not );
testcase( op==TK_BITNOT );
testcase( op==TK_NOT );
- inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
- testcase( inReg==target );
- testcase( usedAsColumnCache(pParse, inReg, inReg) );
- inReg = sqlite3ExprWritableRegister(pParse, inReg, target);
- sqlite3VdbeAddOp1(v, op, inReg);
+ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
+ testcase( regFree1==0 );
+ inReg = target;
+ sqlite3VdbeAddOp2(v, op, r1, inReg);
break;
}
case TK_ISNULL:
@@ -49957,8 +62333,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_AGG_FUNCTION: {
AggInfo *pInfo = pExpr->pAggInfo;
if( pInfo==0 ){
- sqlite3ErrorMsg(pParse, "misuse of aggregate: %T",
- &pExpr->span);
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
}else{
inReg = pInfo->aFunc[pExpr->iAgg].iMem;
}
@@ -49966,29 +62342,40 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
}
case TK_CONST_FUNC:
case TK_FUNCTION: {
- ExprList *pList = pExpr->pList;
- int nExpr = pList ? pList->nExpr : 0;
- FuncDef *pDef;
- int nId;
- const char *zId;
- int constMask = 0;
- int i;
- sqlite3 *db = pParse->db;
- u8 enc = ENC(db);
- CollSeq *pColl = 0;
-
+ ExprList *pFarg; /* List of function arguments */
+ int nFarg; /* Number of function arguments */
+ FuncDef *pDef; /* The function definition object */
+ int nId; /* Length of the function name in bytes */
+ const char *zId; /* The function name */
+ int constMask = 0; /* Mask of function arguments that are constant */
+ int i; /* Loop counter */
+ u8 enc = ENC(db); /* The text encoding used by this database */
+ CollSeq *pColl = 0; /* A collating sequence */
+
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
testcase( op==TK_CONST_FUNC );
testcase( op==TK_FUNCTION );
- zId = (char*)pExpr->token.z;
- nId = pExpr->token.n;
- pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, enc, 0);
- assert( pDef!=0 );
- if( pList ){
- nExpr = pList->nExpr;
- r1 = sqlite3GetTempRange(pParse, nExpr);
- sqlite3ExprCodeExprList(pParse, pList, r1, 1);
+ if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){
+ pFarg = 0;
+ }else{
+ pFarg = pExpr->x.pList;
+ }
+ nFarg = pFarg ? pFarg->nExpr : 0;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ zId = pExpr->u.zToken;
+ nId = sqlite3Strlen30(zId);
+ pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0);
+ if( pDef==0 ){
+ sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId);
+ break;
+ }
+ if( pFarg ){
+ r1 = sqlite3GetTempRange(pParse, nFarg);
+ sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */
+ sqlite3ExprCodeExprList(pParse, pFarg, r1, 1);
+ sqlite3ExprCachePop(pParse, 1); /* Ticket 2ea2425d34be */
}else{
- nExpr = r1 = 0;
+ r1 = 0;
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
/* Possibly overload the function if the first argument is
@@ -50003,31 +62390,31 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
** "glob(B,A). We want to use the A in "A glob B" to test
** for function overloading. But we use the B term in "glob(B,A)".
*/
- if( nExpr>=2 && (pExpr->flags & EP_InfixFunc) ){
- pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[1].pExpr);
- }else if( nExpr>0 ){
- pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[0].pExpr);
+ if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){
+ pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr);
+ }else if( nFarg>0 ){
+ pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr);
}
#endif
- for(i=0; i<nExpr && i<32; i++){
- if( sqlite3ExprIsConstant(pList->a[i].pExpr) ){
+ for(i=0; i<nFarg; i++){
+ if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){
constMask |= (1<<i);
}
- if( pDef->needCollSeq && !pColl ){
- pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr);
+ if( (pDef->flags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){
+ pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr);
}
}
- if( pDef->needCollSeq ){
- if( !pColl ) pColl = pParse->db->pDfltColl;
+ if( pDef->flags & SQLITE_FUNC_NEEDCOLL ){
+ if( !pColl ) pColl = db->pDfltColl;
sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
}
sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target,
(char*)pDef, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, nExpr);
- if( nExpr ){
- sqlite3ReleaseTempRange(pParse, r1, nExpr);
+ sqlite3VdbeChangeP5(v, (u8)nFarg);
+ if( nFarg ){
+ sqlite3ReleaseTempRange(pParse, r1, nFarg);
}
- sqlite3ExprCacheAffinityChange(pParse, r1, nExpr);
+ sqlite3ExprCacheAffinityChange(pParse, r1, nFarg);
break;
}
#ifndef SQLITE_OMIT_SUBQUERY
@@ -50035,18 +62422,22 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
case TK_SELECT: {
testcase( op==TK_EXISTS );
testcase( op==TK_SELECT );
- if( pExpr->iColumn==0 ){
- sqlite3CodeSubselect(pParse, pExpr);
- }
+ sqlite3CodeSubselect(pParse, pExpr, 0, 0);
inReg = pExpr->iColumn;
break;
}
case TK_IN: {
- int j1, j2, j3, j4, j5;
+ int rNotFound = 0;
+ int rMayHaveNull = 0;
+ int j2, j3, j4, j5;
char affinity;
int eType;
- eType = sqlite3FindInIndex(pParse, pExpr, 0);
+ VdbeNoopComment((v, "begin IN expr r%d", target));
+ eType = sqlite3FindInIndex(pParse, pExpr, &rMayHaveNull);
+ if( rMayHaveNull ){
+ rNotFound = ++pParse->nMem;
+ }
/* Figure out the affinity to use to create a key from the results
** of the expression. affinityStr stores a static string suitable for
@@ -50054,32 +62445,74 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
*/
affinity = comparisonAffinity(pExpr);
- sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
/* Code the <expr> from "<expr> IN (...)". The temporary table
** pExpr->iTable contains the values that make up the (...) set.
*/
- r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
- testcase( regFree1==0 );
- j1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1);
- sqlite3VdbeAddOp2(v, OP_Null, 0, target);
- j2 = sqlite3VdbeAddOp0(v, OP_Goto);
- sqlite3VdbeJumpHere(v, j1);
+ sqlite3ExprCachePush(pParse);
+ sqlite3ExprCode(pParse, pExpr->pLeft, target);
+ j2 = sqlite3VdbeAddOp1(v, OP_IsNull, target);
if( eType==IN_INDEX_ROWID ){
- j3 = sqlite3VdbeAddOp1(v, OP_MustBeInt, r1);
- j4 = sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, 0, r1);
+ j3 = sqlite3VdbeAddOp1(v, OP_MustBeInt, target);
+ j4 = sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, 0, target);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
j5 = sqlite3VdbeAddOp0(v, OP_Goto);
sqlite3VdbeJumpHere(v, j3);
sqlite3VdbeJumpHere(v, j4);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, target);
}else{
r2 = regFree2 = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1);
- sqlite3ExprCacheAffinityChange(pParse, r1, 1);
+
+ /* Create a record and test for set membership. If the set contains
+ ** the value, then jump to the end of the test code. The target
+ ** register still contains the true (1) value written to it earlier.
+ */
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, target, 1, r2, &affinity, 1);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
j5 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, r2);
+
+ /* If the set membership test fails, then the result of the
+ ** "x IN (...)" expression must be either 0 or NULL. If the set
+ ** contains no NULL values, then the result is 0. If the set
+ ** contains one or more NULL values, then the result of the
+ ** expression is also NULL.
+ */
+ if( rNotFound==0 ){
+ /* This branch runs if it is known at compile time (now) that
+ ** the set contains no NULL values. This happens as the result
+ ** of a "NOT NULL" constraint in the database schema. No need
+ ** to test the data structure at runtime in this case.
+ */
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, target);
+ }else{
+ /* This block populates the rNotFound register with either NULL
+ ** or 0 (an integer value). If the data structure contains one
+ ** or more NULLs, then set rNotFound to NULL. Otherwise, set it
+ ** to 0. If register rMayHaveNull is already set to some value
+ ** other than NULL, then the test has already been run and
+ ** rNotFound is already populated.
+ */
+ static const char nullRecord[] = { 0x02, 0x00 };
+ j3 = sqlite3VdbeAddOp1(v, OP_NotNull, rMayHaveNull);
+ sqlite3VdbeAddOp2(v, OP_Null, 0, rNotFound);
+ sqlite3VdbeAddOp4(v, OP_Blob, 2, rMayHaveNull, 0,
+ nullRecord, P4_STATIC);
+ j4 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, rMayHaveNull);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, rNotFound);
+ sqlite3VdbeJumpHere(v, j4);
+ sqlite3VdbeJumpHere(v, j3);
+
+ /* Copy the value of register rNotFound (which is either NULL or 0)
+ ** into the target register. This will be the result of the
+ ** expression.
+ */
+ sqlite3VdbeAddOp2(v, OP_Copy, rNotFound, target);
+ }
}
- sqlite3VdbeAddOp2(v, OP_AddImm, target, -1);
sqlite3VdbeJumpHere(v, j2);
sqlite3VdbeJumpHere(v, j5);
+ sqlite3ExprCachePop(pParse, 1);
+ VdbeComment((v, "end IN expr r%d", target));
break;
}
#endif
@@ -50096,7 +62529,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
*/
case TK_BETWEEN: {
Expr *pLeft = pExpr->pLeft;
- struct ExprList_item *pLItem = pExpr->pList->a;
+ struct ExprList_item *pLItem = pExpr->x.pList->a;
Expr *pRight = pLItem->pExpr;
codeCompareOperands(pParse, pLeft, &r1, &regFree1,
@@ -50123,6 +62556,58 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
break;
}
+ case TK_TRIGGER: {
+ /* If the opcode is TK_TRIGGER, then the expression is a reference
+ ** to a column in the new.* or old.* pseudo-tables available to
+ ** trigger programs. In this case Expr.iTable is set to 1 for the
+ ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn
+ ** is set to the column of the pseudo-table to read, or to -1 to
+ ** read the rowid field.
+ **
+ ** The expression is implemented using an OP_Param opcode. The p1
+ ** parameter is set to 0 for an old.rowid reference, or to (i+1)
+ ** to reference another column of the old.* pseudo-table, where
+ ** i is the index of the column. For a new.rowid reference, p1 is
+ ** set to (n+1), where n is the number of columns in each pseudo-table.
+ ** For a reference to any other column in the new.* pseudo-table, p1
+ ** is set to (n+2+i), where n and i are as defined previously. For
+ ** example, if the table on which triggers are being fired is
+ ** declared as:
+ **
+ ** CREATE TABLE t1(a, b);
+ **
+ ** Then p1 is interpreted as follows:
+ **
+ ** p1==0 -> old.rowid p1==3 -> new.rowid
+ ** p1==1 -> old.a p1==4 -> new.a
+ ** p1==2 -> old.b p1==5 -> new.b
+ */
+ Table *pTab = pExpr->pTab;
+ int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
+
+ assert( pExpr->iTable==0 || pExpr->iTable==1 );
+ assert( pExpr->iColumn>=-1 && pExpr->iColumn<pTab->nCol );
+ assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey );
+ assert( p1>=0 && p1<(pTab->nCol*2+2) );
+
+ sqlite3VdbeAddOp2(v, OP_Param, p1, target);
+ VdbeComment((v, "%s.%s -> $%d",
+ (pExpr->iTable ? "new" : "old"),
+ (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName),
+ target
+ ));
+
+ /* If the column has REAL affinity, it may currently be stored as an
+ ** integer. Use OP_RealAffinity to make sure it is really real. */
+ if( pExpr->iColumn>=0
+ && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL
+ ){
+ sqlite3VdbeAddOp1(v, OP_RealAffinity, target);
+ }
+ break;
+ }
+
+
/*
** Form A:
** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END
@@ -50144,7 +62629,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
** or if there is no matching Ei, the ELSE term Y, or if there is
** no ELSE term, NULL.
*/
- case TK_CASE: {
+ default: assert( op==TK_CASE ); {
int endLabel; /* GOTO label for end of CASE stmt */
int nextCase; /* GOTO label for next WHEN clause */
int nExpr; /* 2x number of WHEN terms */
@@ -50154,72 +62639,80 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target)
Expr opCompare; /* The X==Ei expression */
Expr cacheX; /* Cached expression X */
Expr *pX; /* The X expression */
- Expr *pTest; /* X==Ei (form A) or just Ei (form B) */
+ Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */
+ VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; )
- assert(pExpr->pList);
- assert((pExpr->pList->nExpr % 2) == 0);
- assert(pExpr->pList->nExpr > 0);
- pEList = pExpr->pList;
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList );
+ assert((pExpr->x.pList->nExpr % 2) == 0);
+ assert(pExpr->x.pList->nExpr > 0);
+ pEList = pExpr->x.pList;
aListelem = pEList->a;
nExpr = pEList->nExpr;
endLabel = sqlite3VdbeMakeLabel(v);
if( (pX = pExpr->pLeft)!=0 ){
cacheX = *pX;
- testcase( pX->op==TK_COLUMN || pX->op==TK_REGISTER );
+ testcase( pX->op==TK_COLUMN );
+ testcase( pX->op==TK_REGISTER );
cacheX.iTable = sqlite3ExprCodeTemp(pParse, pX, &regFree1);
testcase( regFree1==0 );
cacheX.op = TK_REGISTER;
- cacheX.iColumn = 0;
opCompare.op = TK_EQ;
opCompare.pLeft = &cacheX;
pTest = &opCompare;
}
- pParse->disableColCache++;
for(i=0; i<nExpr; i=i+2){
+ sqlite3ExprCachePush(pParse);
if( pX ){
+ assert( pTest!=0 );
opCompare.pRight = aListelem[i].pExpr;
}else{
pTest = aListelem[i].pExpr;
}
nextCase = sqlite3VdbeMakeLabel(v);
- testcase( pTest->op==TK_COLUMN || pTest->op==TK_REGISTER );
+ testcase( pTest->op==TK_COLUMN );
sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL);
testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
testcase( aListelem[i+1].pExpr->op==TK_REGISTER );
sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target);
sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel);
+ sqlite3ExprCachePop(pParse, 1);
sqlite3VdbeResolveLabel(v, nextCase);
}
if( pExpr->pRight ){
+ sqlite3ExprCachePush(pParse);
sqlite3ExprCode(pParse, pExpr->pRight, target);
+ sqlite3ExprCachePop(pParse, 1);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
}
+ assert( db->mallocFailed || pParse->nErr>0
+ || pParse->iCacheLevel==iCacheLevel );
sqlite3VdbeResolveLabel(v, endLabel);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
break;
}
#ifndef SQLITE_OMIT_TRIGGER
case TK_RAISE: {
- if( !pParse->trigStack ){
+ assert( pExpr->affinity==OE_Rollback
+ || pExpr->affinity==OE_Abort
+ || pExpr->affinity==OE_Fail
+ || pExpr->affinity==OE_Ignore
+ );
+ if( !pParse->pTriggerTab ){
sqlite3ErrorMsg(pParse,
"RAISE() may only be used within a trigger-program");
return 0;
}
- if( pExpr->iColumn!=OE_Ignore ){
- assert( pExpr->iColumn==OE_Rollback ||
- pExpr->iColumn == OE_Abort ||
- pExpr->iColumn == OE_Fail );
- sqlite3DequoteExpr(pParse->db, pExpr);
- sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn, 0,
- (char*)pExpr->token.z, pExpr->token.n);
- } else {
- assert( pExpr->iColumn == OE_Ignore );
- sqlite3VdbeAddOp2(v, OP_ContextPop, 0, 0);
- sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->trigStack->ignoreJump);
- VdbeComment((v, "raise(IGNORE)"));
+ if( pExpr->affinity==OE_Abort ){
+ sqlite3MayAbort(pParse);
+ }
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ if( pExpr->affinity==OE_Ignore ){
+ sqlite3VdbeAddOp4(
+ v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0);
+ }else{
+ sqlite3HaltConstraint(pParse, pExpr->affinity, pExpr->u.zToken, 0);
}
+
break;
}
#endif
@@ -50284,12 +62777,17 @@ SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int targe
int inReg;
inReg = sqlite3ExprCode(pParse, pExpr, target);
assert( target>0 );
- if( pExpr->op!=TK_REGISTER ){
+ /* This routine is called for terms to INSERT or UPDATE. And the only
+ ** other place where expressions can be converted into TK_REGISTER is
+ ** in WHERE clause processing. So as currently implemented, there is
+ ** no way for a TK_REGISTER to exist here. But it seems prudent to
+ ** keep the ALWAYS() in case the conditions above change with future
+ ** modifications or enhancements. */
+ if( ALWAYS(pExpr->op!=TK_REGISTER) ){
int iMem;
iMem = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem);
pExpr->iTable = iMem;
- pExpr->iColumn = pExpr->op;
pExpr->op = TK_REGISTER;
}
return inReg;
@@ -50342,10 +62840,10 @@ static int isAppropriateForFactoring(Expr *p){
return 0;
}
case TK_UMINUS: {
- if( p->pLeft->op==TK_FLOAT || p->pLeft->op==TK_INTEGER ){
- return 0;
- }
- break;
+ if( p->pLeft->op==TK_FLOAT || p->pLeft->op==TK_INTEGER ){
+ return 0;
+ }
+ break;
}
default: {
break;
@@ -50360,11 +62858,11 @@ static int isAppropriateForFactoring(Expr *p){
** into a register and convert the expression into a TK_REGISTER
** expression.
*/
-static int evalConstExpr(void *pArg, Expr *pExpr){
- Parse *pParse = (Parse*)pArg;
+static int evalConstExpr(Walker *pWalker, Expr *pExpr){
+ Parse *pParse = pWalker->pParse;
switch( pExpr->op ){
case TK_REGISTER: {
- return 1;
+ return WRC_Prune;
}
case TK_FUNCTION:
case TK_AGG_FUNCTION:
@@ -50373,12 +62871,13 @@ static int evalConstExpr(void *pArg, Expr *pExpr){
** Mark them this way to avoid generated unneeded OP_SCopy
** instructions.
*/
- ExprList *pList = pExpr->pList;
+ ExprList *pList = pExpr->x.pList;
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
if( pList ){
int i = pList->nExpr;
struct ExprList_item *pItem = pList->a;
for(; i>0; i--, pItem++){
- if( pItem->pExpr ) pItem->pExpr->flags |= EP_FixedDest;
+ if( ALWAYS(pItem->pExpr) ) pItem->pExpr->flags |= EP_FixedDest;
}
}
break;
@@ -50388,13 +62887,13 @@ static int evalConstExpr(void *pArg, Expr *pExpr){
int r1 = ++pParse->nMem;
int r2;
r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
- if( r1!=r2 ) sqlite3ReleaseTempReg(pParse, r1);
- pExpr->iColumn = pExpr->op;
+ if( NEVER(r1!=r2) ) sqlite3ReleaseTempReg(pParse, r1);
+ pExpr->op2 = pExpr->op;
pExpr->op = TK_REGISTER;
pExpr->iTable = r2;
- return 1;
+ return WRC_Prune;
}
- return 0;
+ return WRC_Continue;
}
/*
@@ -50403,7 +62902,11 @@ static int evalConstExpr(void *pArg, Expr *pExpr){
** are TK_REGISTER opcodes that refer to the precomputed values.
*/
SQLITE_PRIVATE void sqlite3ExprCodeConstants(Parse *pParse, Expr *pExpr){
- walkExprTree(pExpr, evalConstExpr, pParse);
+ Walker w;
+ w.xExprCallback = evalConstExpr;
+ w.xSelectCallback = 0;
+ w.pParse = pParse;
+ sqlite3WalkExpr(&w, pExpr);
}
@@ -50417,19 +62920,26 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList(
Parse *pParse, /* Parsing context */
ExprList *pList, /* The expression list to be coded */
int target, /* Where to write results */
- int doHardCopy /* Call sqlite3ExprHardCopy on each element if true */
+ int doHardCopy /* Make a hard copy of every element */
){
struct ExprList_item *pItem;
int i, n;
- assert( pList!=0 || pParse->db->mallocFailed );
- if( pList==0 ){
- return 0;
- }
+ assert( pList!=0 );
assert( target>0 );
n = pList->nExpr;
for(pItem=pList->a, i=0; i<n; i++, pItem++){
- sqlite3ExprCode(pParse, pItem->pExpr, target+i);
- if( doHardCopy ) sqlite3ExprHardCopy(pParse, target, n);
+ if( pItem->iAlias ){
+ int iReg = codeAlias(pParse, pItem->iAlias, pItem->pExpr, target+i);
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ if( iReg!=target+i ){
+ sqlite3VdbeAddOp2(v, OP_SCopy, iReg, target+i);
+ }
+ }else{
+ sqlite3ExprCode(pParse, pItem->pExpr, target+i);
+ }
+ if( doHardCopy && !pParse->db->mallocFailed ){
+ sqlite3ExprHardCopy(pParse, target, n);
+ }
}
return n;
}
@@ -50456,29 +62966,24 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
int r1, r2;
assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
- if( v==0 || pExpr==0 ) return;
+ if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */
+ if( NEVER(pExpr==0) ) return; /* No way this can happen */
op = pExpr->op;
switch( op ){
case TK_AND: {
int d2 = sqlite3VdbeMakeLabel(v);
testcase( jumpIfNull==0 );
- testcase( pParse->disableColCache==0 );
+ sqlite3ExprCachePush(pParse);
sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
- pParse->disableColCache++;
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
sqlite3VdbeResolveLabel(v, d2);
+ sqlite3ExprCachePop(pParse, 1);
break;
}
case TK_OR: {
testcase( jumpIfNull==0 );
- testcase( pParse->disableColCache==0 );
sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
- pParse->disableColCache++;
sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
break;
}
case TK_NOT: {
@@ -50513,6 +63018,19 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
testcase( regFree2==0 );
break;
}
+ case TK_IS:
+ case TK_ISNOT: {
+ testcase( op==TK_IS );
+ testcase( op==TK_ISNOT );
+ codeCompareOperands(pParse, pExpr->pLeft, &r1, &regFree1,
+ pExpr->pRight, &r2, &regFree2);
+ op = (op==TK_IS) ? TK_EQ : TK_NE;
+ codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
+ r1, r2, dest, SQLITE_NULLEQ);
+ testcase( regFree1==0 );
+ testcase( regFree2==0 );
+ break;
+ }
case TK_ISNULL:
case TK_NOTNULL: {
assert( TK_ISNULL==OP_IsNull );
@@ -50539,16 +63057,17 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int
Expr compRight;
Expr exprX;
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
exprX = *pExpr->pLeft;
exprAnd.op = TK_AND;
exprAnd.pLeft = &compLeft;
exprAnd.pRight = &compRight;
compLeft.op = TK_GE;
compLeft.pLeft = &exprX;
- compLeft.pRight = pExpr->pList->a[0].pExpr;
+ compLeft.pRight = pExpr->x.pList->a[0].pExpr;
compRight.op = TK_LE;
compRight.pLeft = &exprX;
- compRight.pRight = pExpr->pList->a[1].pExpr;
+ compRight.pRight = pExpr->x.pList->a[1].pExpr;
exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, &regFree1);
testcase( regFree1==0 );
exprX.op = TK_REGISTER;
@@ -50585,7 +63104,8 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
int r1, r2;
assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
- if( v==0 || pExpr==0 ) return;
+ if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */
+ if( pExpr==0 ) return;
/* The value of pExpr->op and op are related as follows:
**
@@ -50621,24 +63141,18 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
switch( pExpr->op ){
case TK_AND: {
testcase( jumpIfNull==0 );
- testcase( pParse->disableColCache==0 );
sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
- pParse->disableColCache++;
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
break;
}
case TK_OR: {
int d2 = sqlite3VdbeMakeLabel(v);
testcase( jumpIfNull==0 );
- testcase( pParse->disableColCache==0 );
+ sqlite3ExprCachePush(pParse);
sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
- pParse->disableColCache++;
sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
- assert( pParse->disableColCache>0 );
- pParse->disableColCache--;
sqlite3VdbeResolveLabel(v, d2);
+ sqlite3ExprCachePop(pParse, 1);
break;
}
case TK_NOT: {
@@ -50666,6 +63180,19 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
testcase( regFree2==0 );
break;
}
+ case TK_IS:
+ case TK_ISNOT: {
+ testcase( pExpr->op==TK_IS );
+ testcase( pExpr->op==TK_ISNOT );
+ codeCompareOperands(pParse, pExpr->pLeft, &r1, &regFree1,
+ pExpr->pRight, &r2, &regFree2);
+ op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ;
+ codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
+ r1, r2, dest, SQLITE_NULLEQ);
+ testcase( regFree1==0 );
+ testcase( regFree2==0 );
+ break;
+ }
case TK_ISNULL:
case TK_NOTNULL: {
testcase( op==TK_ISNULL );
@@ -50690,16 +63217,17 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int
Expr compRight;
Expr exprX;
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
exprX = *pExpr->pLeft;
exprAnd.op = TK_AND;
exprAnd.pLeft = &compLeft;
exprAnd.pRight = &compRight;
compLeft.op = TK_GE;
compLeft.pLeft = &exprX;
- compLeft.pRight = pExpr->pList->a[0].pExpr;
+ compLeft.pRight = pExpr->x.pList->a[0].pExpr;
compRight.op = TK_LE;
compRight.pLeft = &exprX;
- compRight.pRight = pExpr->pList->a[1].pExpr;
+ compRight.pRight = pExpr->x.pList->a[1].pExpr;
exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, &regFree1);
testcase( regFree1==0 );
exprX.op = TK_REGISTER;
@@ -50738,27 +63266,35 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB){
if( pA==0||pB==0 ){
return pB==pA;
}
- if( pA->op!=pB->op ) return 0;
+ assert( !ExprHasAnyProperty(pA, EP_TokenOnly|EP_Reduced) );
+ assert( !ExprHasAnyProperty(pB, EP_TokenOnly|EP_Reduced) );
+ if( ExprHasProperty(pA, EP_xIsSelect) || ExprHasProperty(pB, EP_xIsSelect) ){
+ return 0;
+ }
if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 0;
+ if( pA->op!=pB->op ) return 0;
if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0;
if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0;
- if( pA->pList ){
- if( pB->pList==0 ) return 0;
- if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
- for(i=0; i<pA->pList->nExpr; i++){
- if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
- return 0;
- }
+
+ if( pA->x.pList && pB->x.pList ){
+ if( pA->x.pList->nExpr!=pB->x.pList->nExpr ) return 0;
+ for(i=0; i<pA->x.pList->nExpr; i++){
+ Expr *pExprA = pA->x.pList->a[i].pExpr;
+ Expr *pExprB = pB->x.pList->a[i].pExpr;
+ if( !sqlite3ExprCompare(pExprA, pExprB) ) return 0;
}
- }else if( pB->pList ){
+ }else if( pA->x.pList || pB->x.pList ){
return 0;
}
- if( pA->pSelect || pB->pSelect ) return 0;
+
if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
- if( pA->op!=TK_COLUMN && pA->token.z ){
- if( pB->token.z==0 ) return 0;
- if( pB->token.n!=pA->token.n ) return 0;
- if( sqlite3StrNICmp((char*)pA->token.z,(char*)pB->token.z,pB->token.n)!=0 ){
+ if( ExprHasProperty(pA, EP_IntValue) ){
+ if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
+ return 0;
+ }
+ }else if( pA->op!=TK_COLUMN && pA->u.zToken ){
+ if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 0;
+ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ){
return 0;
}
}
@@ -50803,15 +63339,13 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){
}
/*
-** This is an xFunc for walkExprTree() used to implement
-** sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates
+** This is the xExprCallback for a tree walker. It is used to
+** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates
** for additional information.
-**
-** This routine analyzes the aggregate function at pExpr.
*/
-static int analyzeAggregate(void *pArg, Expr *pExpr){
+static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
int i;
- NameContext *pNC = (NameContext *)pArg;
+ NameContext *pNC = pWalker->u.pNC;
Parse *pParse = pNC->pParse;
SrcList *pSrcList = pNC->pSrcList;
AggInfo *pAggInfo = pNC->pAggInfo;
@@ -50819,12 +63353,15 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
switch( pExpr->op ){
case TK_AGG_COLUMN:
case TK_COLUMN: {
+ testcase( pExpr->op==TK_AGG_COLUMN );
+ testcase( pExpr->op==TK_COLUMN );
/* Check to see if the column is in one of the tables in the FROM
** clause of the aggregate query */
- if( pSrcList ){
+ if( ALWAYS(pSrcList!=0) ){
struct SrcList_item *pItem = pSrcList->a;
for(i=0; i<pSrcList->nSrc; i++, pItem++){
struct AggInfo_col *pCol;
+ assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
if( pExpr->iTable==pItem->iCursor ){
/* If we reach this point, it means that pExpr refers to a table
** that is in the FROM clause of the aggregate query.
@@ -50873,14 +63410,15 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
** Convert the pExpr to be a TK_AGG_COLUMN referring to that
** pAggInfo->aCol[] entry.
*/
+ ExprSetIrreducible(pExpr);
pExpr->pAggInfo = pAggInfo;
pExpr->op = TK_AGG_COLUMN;
- pExpr->iAgg = k;
+ pExpr->iAgg = (i16)k;
break;
} /* endif pExpr->iTable==pItem->iCursor */
} /* end loop over pSrcList */
}
- return 1;
+ return WRC_Prune;
}
case TK_AGG_FUNCTION: {
/* The pNC->nDepth==0 test causes aggregate functions in subqueries
@@ -50901,12 +63439,14 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
u8 enc = ENC(pParse->db);
i = addAggInfoFunc(pParse->db, pAggInfo);
if( i>=0 ){
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
pItem = &pAggInfo->aFunc[i];
pItem->pExpr = pExpr;
pItem->iMem = ++pParse->nMem;
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
pItem->pFunc = sqlite3FindFunction(pParse->db,
- (char*)pExpr->token.z, pExpr->token.n,
- pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0);
+ pExpr->u.zToken, sqlite3Strlen30(pExpr->u.zToken),
+ pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0);
if( pExpr->flags & EP_Distinct ){
pItem->iDistinct = pParse->nTab++;
}else{
@@ -50916,23 +63456,26 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
}
/* Make pExpr point to the appropriate pAggInfo->aFunc[] entry
*/
- pExpr->iAgg = i;
+ assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
+ ExprSetIrreducible(pExpr);
+ pExpr->iAgg = (i16)i;
pExpr->pAggInfo = pAggInfo;
- return 1;
+ return WRC_Prune;
}
}
}
-
- /* Recursively walk subqueries looking for TK_COLUMN nodes that need
- ** to be changed to TK_AGG_COLUMN. But increment nDepth so that
- ** TK_AGG_FUNCTION nodes in subqueries will be unchanged.
- */
- if( pExpr->pSelect ){
+ return WRC_Continue;
+}
+static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){
+ NameContext *pNC = pWalker->u.pNC;
+ if( pNC->nDepth==0 ){
pNC->nDepth++;
- walkSelectExpr(pExpr->pSelect, analyzeAggregate, pNC);
+ sqlite3WalkSelect(pWalker, pSelect);
pNC->nDepth--;
+ return WRC_Prune;
+ }else{
+ return WRC_Continue;
}
- return 0;
}
/*
@@ -50941,10 +63484,15 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
** Make additional entries to the pParse->aAgg[] array as necessary.
**
** This routine should only be called after the expression has been
-** analyzed by sqlite3ExprResolveNames().
+** analyzed by sqlite3ResolveExprNames().
*/
SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
- walkExprTree(pExpr, analyzeAggregate, pNC);
+ Walker w;
+ w.xExprCallback = analyzeAggregate;
+ w.xSelectCallback = analyzeAggregatesInSelect;
+ w.u.pNC = pNC;
+ assert( pNC->pSrcList!=0 );
+ sqlite3WalkExpr(&w, pExpr);
}
/*
@@ -50964,28 +63512,33 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList)
}
/*
-** Allocate or deallocate temporary use registers during code generation.
+** Allocate a single new register for use to hold some intermediate result.
*/
SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){
- int i, r;
if( pParse->nTempReg==0 ){
return ++pParse->nMem;
}
- for(i=0; i<pParse->nTempReg; i++){
- r = pParse->aTempReg[i];
- if( usedAsColumnCache(pParse, r, r) ) continue;
- }
- if( i>=pParse->nTempReg ){
- return ++pParse->nMem;
- }
- while( i<pParse->nTempReg-1 ){
- pParse->aTempReg[i] = pParse->aTempReg[i+1];
- }
- pParse->nTempReg--;
- return r;
+ return pParse->aTempReg[--pParse->nTempReg];
}
+
+/*
+** Deallocate a register, making available for reuse for some other
+** purpose.
+**
+** If a register is currently being used by the column cache, then
+** the dallocation is deferred until the column cache line that uses
+** the register becomes stale.
+*/
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){
if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){
+ int i;
+ struct yColCache *p;
+ for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
+ if( p->iReg==iReg ){
+ p->tempReg = 1;
+ return;
+ }
+ }
pParse->aTempReg[pParse->nTempReg++] = iReg;
}
}
@@ -51029,7 +63582,7 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
** This file contains C code routines that used to generate VDBE code
** that implements the ALTER TABLE command.
**
-** $Id: alter.c,v 1.44 2008/05/09 14:17:52 drh Exp $
+** $Id: alter.c,v 1.62 2009/07/24 17:58:53 danielk1977 Exp $
*/
/*
@@ -51054,7 +63607,7 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
*/
static void renameTableFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
unsigned char const *zSql = sqlite3_value_text(argv[0]);
@@ -51068,9 +63621,11 @@ static void renameTableFunc(
sqlite3 *db = sqlite3_context_db_handle(context);
+ UNUSED_PARAMETER(NotUsed);
+
/* The principle used to locate the table name in the CREATE TABLE
** statement is that the table name is the first non-space token that
- ** is immediately followed by a left parenthesis - TK_LP - or "USING" TK_USING.
+ ** is immediately followed by a TK_LP or TK_USING token.
*/
if( zSql ){
do {
@@ -51080,7 +63635,7 @@ static void renameTableFunc(
}
/* Store the token that zCsr points to in tname. */
- tname.z = zCsr;
+ tname.z = (char*)zCsr;
tname.n = len;
/* Advance zCsr to the next token. Store that token type in 'token',
@@ -51089,16 +63644,79 @@ static void renameTableFunc(
do {
zCsr += len;
len = sqlite3GetToken(zCsr, &token);
- } while( token==TK_SPACE || token==TK_COMMENT );
+ } while( token==TK_SPACE );
assert( len>0 );
} while( token!=TK_LP && token!=TK_USING );
- zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", tname.z - zSql, zSql,
+ zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql,
zTableName, tname.z+tname.n);
- sqlite3_result_text(context, zRet, -1, sqlite3_free);
+ sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
}
}
+/*
+** This C function implements an SQL user function that is used by SQL code
+** generated by the ALTER TABLE ... RENAME command to modify the definition
+** of any foreign key constraints that use the table being renamed as the
+** parent table. It is passed three arguments:
+**
+** 1) The complete text of the CREATE TABLE statement being modified,
+** 2) The old name of the table being renamed, and
+** 3) The new name of the table being renamed.
+**
+** It returns the new CREATE TABLE statement. For example:
+**
+** sqlite_rename_parent('CREATE TABLE t1(a REFERENCES t2)', 't2', 't3')
+** -> 'CREATE TABLE t1(a REFERENCES t3)'
+*/
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+static void renameParentFunc(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **argv
+){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ char *zOutput = 0;
+ char *zResult;
+ unsigned char const *zInput = sqlite3_value_text(argv[0]);
+ unsigned char const *zOld = sqlite3_value_text(argv[1]);
+ unsigned char const *zNew = sqlite3_value_text(argv[2]);
+
+ unsigned const char *z; /* Pointer to token */
+ int n; /* Length of token z */
+ int token; /* Type of token */
+
+ UNUSED_PARAMETER(NotUsed);
+ for(z=zInput; *z; z=z+n){
+ n = sqlite3GetToken(z, &token);
+ if( token==TK_REFERENCES ){
+ char *zParent;
+ do {
+ z += n;
+ n = sqlite3GetToken(z, &token);
+ }while( token==TK_SPACE );
+
+ zParent = sqlite3DbStrNDup(db, (const char *)z, n);
+ if( zParent==0 ) break;
+ sqlite3Dequote(zParent);
+ if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){
+ char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"",
+ (zOutput?zOutput:""), z-zInput, zInput, (const char *)zNew
+ );
+ sqlite3DbFree(db, zOutput);
+ zOutput = zOut;
+ zInput = &z[n];
+ }
+ sqlite3DbFree(db, zParent);
+ }
+ }
+
+ zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput),
+ sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC);
+ sqlite3DbFree(db, zOutput);
+}
+#endif
+
#ifndef SQLITE_OMIT_TRIGGER
/* This function is used by SQL generated to implement the
** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER
@@ -51109,7 +63727,7 @@ static void renameTableFunc(
*/
static void renameTriggerFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
unsigned char const *zSql = sqlite3_value_text(argv[0]);
@@ -51121,9 +63739,10 @@ static void renameTriggerFunc(
unsigned char const *zCsr = zSql;
int len = 0;
char *zRet;
-
sqlite3 *db = sqlite3_context_db_handle(context);
+ UNUSED_PARAMETER(NotUsed);
+
/* The principle used to locate the table name in the CREATE TRIGGER
** statement is that the table name is the first token that is immediatedly
** preceded by either TK_ON or TK_DOT and immediatedly followed by one
@@ -51138,7 +63757,7 @@ static void renameTriggerFunc(
}
/* Store the token that zCsr points to in tname. */
- tname.z = zCsr;
+ tname.z = (char*)zCsr;
tname.n = len;
/* Advance zCsr to the next token. Store that token type in 'token',
@@ -51168,9 +63787,9 @@ static void renameTriggerFunc(
/* Variable tname now contains the token that is the old table-name
** in the CREATE TRIGGER statement.
*/
- zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", tname.z - zSql, zSql,
+ zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql,
zTableName, tname.z+tname.n);
- sqlite3_result_text(context, zRet, -1, sqlite3_free);
+ sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
}
}
#endif /* !SQLITE_OMIT_TRIGGER */
@@ -51179,23 +63798,61 @@ static void renameTriggerFunc(
** Register built-in functions used to help implement ALTER TABLE
*/
SQLITE_PRIVATE void sqlite3AlterFunctions(sqlite3 *db){
- static const struct {
- char *zName;
- signed char nArg;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
- } aFuncs[] = {
- { "sqlite_rename_table", 2, renameTableFunc},
+ sqlite3CreateFunc(db, "sqlite_rename_table", 2, SQLITE_UTF8, 0,
+ renameTableFunc, 0, 0);
#ifndef SQLITE_OMIT_TRIGGER
- { "sqlite_rename_trigger", 2, renameTriggerFunc},
+ sqlite3CreateFunc(db, "sqlite_rename_trigger", 2, SQLITE_UTF8, 0,
+ renameTriggerFunc, 0, 0);
#endif
- };
- int i;
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+ sqlite3CreateFunc(db, "sqlite_rename_parent", 3, SQLITE_UTF8, 0,
+ renameParentFunc, 0, 0);
+#endif
+}
- for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
- SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
+/*
+** This function is used to create the text of expressions of the form:
+**
+** name=<constant1> OR name=<constant2> OR ...
+**
+** If argument zWhere is NULL, then a pointer string containing the text
+** "name=<constant>" is returned, where <constant> is the quoted version
+** of the string passed as argument zConstant. The returned buffer is
+** allocated using sqlite3DbMalloc(). It is the responsibility of the
+** caller to ensure that it is eventually freed.
+**
+** If argument zWhere is not NULL, then the string returned is
+** "<where> OR name=<constant>", where <where> is the contents of zWhere.
+** In this case zWhere is passed to sqlite3DbFree() before returning.
+**
+*/
+static char *whereOrName(sqlite3 *db, char *zWhere, char *zConstant){
+ char *zNew;
+ if( !zWhere ){
+ zNew = sqlite3MPrintf(db, "name=%Q", zConstant);
+ }else{
+ zNew = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, zConstant);
+ sqlite3DbFree(db, zWhere);
}
+ return zNew;
+}
+
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
+/*
+** Generate the text of a WHERE expression which can be used to select all
+** tables that have foreign key constraints that refer to table pTab (i.e.
+** constraints for which pTab is the parent table) from the sqlite_master
+** table.
+*/
+static char *whereForeignKeys(Parse *pParse, Table *pTab){
+ FKey *p;
+ char *zWhere = 0;
+ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
+ zWhere = whereOrName(pParse->db, zWhere, p->pFrom->zName);
+ }
+ return zWhere;
}
+#endif
/*
** Generate the text of a WHERE expression which can be used to select all
@@ -51206,7 +63863,6 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(sqlite3 *db){
static char *whereTempTriggers(Parse *pParse, Table *pTab){
Trigger *pTrig;
char *zWhere = 0;
- char *tmp = 0;
const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */
/* If the table is not located in the temp-db (in which case NULL is
@@ -51216,15 +63872,9 @@ static char *whereTempTriggers(Parse *pParse, Table *pTab){
*/
if( pTab->pSchema!=pTempSchema ){
sqlite3 *db = pParse->db;
- for( pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext ){
+ for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
if( pTrig->pSchema==pTempSchema ){
- if( !zWhere ){
- zWhere = sqlite3MPrintf(db, "name=%Q", pTrig->name);
- }else{
- tmp = zWhere;
- zWhere = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, pTrig->name);
- sqlite3_free(tmp);
- }
+ zWhere = whereOrName(db, zWhere, pTrig->zName);
}
}
}
@@ -51248,21 +63898,21 @@ static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){
#endif
v = sqlite3GetVdbe(pParse);
- if( !v ) return;
+ if( NEVER(v==0) ) return;
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
assert( iDb>=0 );
#ifndef SQLITE_OMIT_TRIGGER
/* Drop any table triggers from the internal schema. */
- for(pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext){
+ for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
assert( iTrigDb==iDb || iTrigDb==1 );
- sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->name, 0);
+ sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->zName, 0);
}
#endif
- /* Drop the table and index from the internal schema */
+ /* Drop the table and index from the internal schema. */
sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
/* Reload the table, index and permanent trigger schemas. */
@@ -51300,9 +63950,9 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
#ifndef SQLITE_OMIT_TRIGGER
char *zWhere = 0; /* Where clause to locate temp triggers */
#endif
- int isVirtualRename = 0; /* True if this is a v-table with an xRename() */
+ VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */
- if( db->mallocFailed ) goto exit_rename_table;
+ if( NEVER(db->mallocFailed) ) goto exit_rename_table;
assert( pSrc->nSrc==1 );
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
@@ -51327,7 +63977,9 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
/* Make sure it is not a system table being altered, or a reserved name
** that the table is being renamed to.
*/
- if( strlen(pTab->zName)>6 && 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) ){
+ if( sqlite3Strlen30(pTab->zName)>6
+ && 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7)
+ ){
sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName);
goto exit_rename_table;
}
@@ -51353,8 +64005,11 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto exit_rename_table;
}
- if( IsVirtual(pTab) && pTab->pMod->pModule->xRename ){
- isVirtualRename = 1;
+ if( IsVirtual(pTab) ){
+ pVTab = sqlite3GetVTable(db, pTab);
+ if( pVTab->pVtab->pModule->xRename==0 ){
+ pVTab = 0;
+ }
}
#endif
@@ -51367,7 +64022,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
if( v==0 ){
goto exit_rename_table;
}
- sqlite3BeginWriteOperation(pParse, isVirtualRename, iDb);
+ sqlite3BeginWriteOperation(pParse, pVTab!=0, iDb);
sqlite3ChangeCookie(pParse, iDb);
/* If this is a virtual table, invoke the xRename() function if
@@ -51376,10 +64031,11 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
** SQLite tables) that are identified by the name of the virtual table.
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( isVirtualRename ){
+ if( pVTab ){
int i = ++pParse->nMem;
sqlite3VdbeAddOp4(v, OP_String8, 0, i, 0, zName, 0);
- sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pTab->pVtab, P4_VTAB);
+ sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
+ sqlite3MayAbort(pParse);
}
#endif
@@ -51387,6 +64043,21 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
zTabName = pTab->zName;
nTabName = sqlite3Utf8CharLen(zTabName, -1);
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
+ if( db->flags&SQLITE_ForeignKeys ){
+ /* If foreign-key support is enabled, rewrite the CREATE TABLE
+ ** statements corresponding to all child tables of foreign key constraints
+ ** for which the renamed table is the parent table. */
+ if( (zWhere=whereForeignKeys(pParse, pTab))!=0 ){
+ sqlite3NestedParse(pParse,
+ "UPDATE sqlite_master SET "
+ "sql = sqlite_rename_parent(sql, %Q, %Q) "
+ "WHERE %s;", zTabName, zName, zWhere);
+ sqlite3DbFree(db, zWhere);
+ }
+ }
+#endif
+
/* Modify the sqlite_master table to use the new table name. */
sqlite3NestedParse(pParse,
"UPDATE %Q.%s SET "
@@ -51434,7 +64105,19 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
"sql = sqlite_rename_trigger(sql, %Q), "
"tbl_name = %Q "
"WHERE %s;", zName, zName, zWhere);
- sqlite3_free(zWhere);
+ sqlite3DbFree(db, zWhere);
+ }
+#endif
+
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
+ if( db->flags&SQLITE_ForeignKeys ){
+ FKey *p;
+ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
+ Table *pFrom = p->pFrom;
+ if( pFrom!=pTab ){
+ reloadTableSchema(pParse, p->pFrom, pFrom->zName);
+ }
+ }
}
#endif
@@ -51442,12 +64125,37 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(
reloadTableSchema(pParse, pTab, zName);
exit_rename_table:
- sqlite3SrcListDelete(pSrc);
- sqlite3_free(zName);
+ sqlite3SrcListDelete(db, pSrc);
+ sqlite3DbFree(db, zName);
}
/*
+** Generate code to make sure the file format number is at least minFormat.
+** The generated code will increase the file format number if necessary.
+*/
+SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){
+ Vdbe *v;
+ v = sqlite3GetVdbe(pParse);
+ /* The VDBE should have been allocated before this routine is called.
+ ** If that allocation failed, we would have quit before reaching this
+ ** point */
+ if( ALWAYS(v) ){
+ int r1 = sqlite3GetTempReg(pParse);
+ int r2 = sqlite3GetTempReg(pParse);
+ int j1;
+ sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
+ sqlite3VdbeUsesBtree(v, iDb);
+ sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2);
+ j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2);
+ sqlite3VdbeJumpHere(v, j1);
+ sqlite3ReleaseTempReg(pParse, r1);
+ sqlite3ReleaseTempReg(pParse, r2);
+ }
+}
+
+/*
** This function is called after an "ALTER TABLE ... ADD" statement
** has been parsed. Argument pColDef contains the text of the new
** column definition.
@@ -51466,15 +64174,15 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
Expr *pDflt; /* Default value for the new column */
sqlite3 *db; /* The database connection; */
- if( pParse->nErr ) return;
+ db = pParse->db;
+ if( pParse->nErr || db->mallocFailed ) return;
pNew = pParse->pNewTable;
assert( pNew );
- db = pParse->db;
assert( sqlite3BtreeHoldsAllMutexes(db) );
iDb = sqlite3SchemaToIndex(db, pNew->pSchema);
zDb = db->aDb[iDb].zName;
- zTab = pNew->zName;
+ zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */
pCol = &pNew->aCol[pNew->nCol-1];
pDflt = pCol->pDflt;
pTab = sqlite3FindTable(db, zTab, zDb);
@@ -51507,6 +64215,11 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column");
return;
}
+ if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){
+ sqlite3ErrorMsg(pParse,
+ "Cannot add a REFERENCES column with non-NULL default value");
+ return;
+ }
if( pCol->notNull && !pDflt ){
sqlite3ErrorMsg(pParse,
"Cannot add a NOT NULL column with default value NULL");
@@ -51533,7 +64246,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
if( zCol ){
char *zEnd = &zCol[pColDef->n-1];
- while( (zEnd>zCol && *zEnd==';') || isspace(*(unsigned char *)zEnd) ){
+ while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){
*zEnd-- = '\0';
}
sqlite3NestedParse(pParse,
@@ -51543,7 +64256,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1,
zTab
);
- sqlite3_free(zCol);
+ sqlite3DbFree(db, zCol);
}
/* If the default value of the new column is NULL, then set the file
@@ -51604,18 +64317,23 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
/* Put a copy of the Table struct in Parse.pNewTable for the
- ** sqlite3AddColumn() function and friends to modify.
+ ** sqlite3AddColumn() function and friends to modify. But modify
+ ** the name by adding an "sqlite_altertab_" prefix. By adding this
+ ** prefix, we insure that the name will not collide with an existing
+ ** table because user table are not allowed to have the "sqlite_"
+ ** prefix on their name.
*/
pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table));
if( !pNew ) goto exit_begin_add_column;
pParse->pNewTable = pNew;
pNew->nRef = 1;
+ pNew->dbMem = pTab->dbMem;
pNew->nCol = pTab->nCol;
assert( pNew->nCol>0 );
nAlloc = (((pNew->nCol-1)/8)*8)+8;
assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 );
pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc);
- pNew->zName = sqlite3DbStrDup(db, pTab->zName);
+ pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName);
if( !pNew->aCol || !pNew->zName ){
db->mallocFailed = 1;
goto exit_begin_add_column;
@@ -51627,6 +64345,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
pCol->zColl = 0;
pCol->zType = 0;
pCol->pDflt = 0;
+ pCol->zDflt = 0;
}
pNew->pSchema = db->aDb[iDb].pSchema;
pNew->addColOffset = pTab->addColOffset;
@@ -51639,7 +64358,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
sqlite3ChangeCookie(pParse, iDb);
exit_begin_add_column:
- sqlite3SrcListDelete(pSrc);
+ sqlite3SrcListDelete(db, pSrc);
return;
}
#endif /* SQLITE_ALTER_TABLE */
@@ -51659,17 +64378,25 @@ exit_begin_add_column:
*************************************************************************
** This file contains code associated with the ANALYZE command.
**
-** @(#) $Id: analyze.c,v 1.42 2008/03/25 09:47:35 danielk1977 Exp $
+** @(#) $Id: analyze.c,v 1.52 2009/04/16 17:45:48 drh Exp $
*/
#ifndef SQLITE_OMIT_ANALYZE
/*
-** This routine generates code that opens the sqlite_stat1 table on cursor
-** iStatCur.
+** This routine generates code that opens the sqlite_stat1 table for
+** writing with cursor iStatCur. If the library was built with the
+** SQLITE_ENABLE_STAT2 macro defined, then the sqlite_stat2 table is
+** opened for writing using cursor (iStatCur+1)
**
** If the sqlite_stat1 tables does not previously exist, it is created.
-** If it does previously exist, all entires associated with table zWhere
-** are removed. If zWhere==0 then all entries are removed.
+** Similarly, if the sqlite_stat2 table does not exist and the library
+** is compiled with SQLITE_ENABLE_STAT2 defined, it is created.
+**
+** Argument zWhere may be a pointer to a buffer containing a table name,
+** or it may be a NULL pointer. If it is not NULL, then all entries in
+** the sqlite_stat1 and (if applicable) sqlite_stat2 tables associated
+** with the named table are deleted. If zWhere==0, then code is generated
+** to delete all stat table entries.
*/
static void openStatTable(
Parse *pParse, /* Parsing context */
@@ -51677,53 +64404,64 @@ static void openStatTable(
int iStatCur, /* Open the sqlite_stat1 table on this cursor */
const char *zWhere /* Delete entries associated with this table */
){
+ static struct {
+ const char *zName;
+ const char *zCols;
+ } aTable[] = {
+ { "sqlite_stat1", "tbl,idx,stat" },
+#ifdef SQLITE_ENABLE_STAT2
+ { "sqlite_stat2", "tbl,idx,sampleno,sample" },
+#endif
+ };
+
+ int aRoot[] = {0, 0};
+ u8 aCreateTbl[] = {0, 0};
+
+ int i;
sqlite3 *db = pParse->db;
Db *pDb;
- int iRootPage;
- int createStat1 = 0;
- Table *pStat;
Vdbe *v = sqlite3GetVdbe(pParse);
-
if( v==0 ) return;
assert( sqlite3BtreeHoldsAllMutexes(db) );
assert( sqlite3VdbeDb(v)==db );
pDb = &db->aDb[iDb];
- if( (pStat = sqlite3FindTable(db, "sqlite_stat1", pDb->zName))==0 ){
- /* The sqlite_stat1 tables does not exist. Create it.
- ** Note that a side-effect of the CREATE TABLE statement is to leave
- ** the rootpage of the new table in register pParse->regRoot. This is
- ** important because the OpenWrite opcode below will be needing it. */
- sqlite3NestedParse(pParse,
- "CREATE TABLE %Q.sqlite_stat1(tbl,idx,stat)",
- pDb->zName
- );
- iRootPage = pParse->regRoot;
- createStat1 = 1; /* Cause rootpage to be taken from top of stack */
- }else if( zWhere ){
- /* The sqlite_stat1 table exists. Delete all entries associated with
- ** the table zWhere. */
- sqlite3NestedParse(pParse,
- "DELETE FROM %Q.sqlite_stat1 WHERE tbl=%Q",
- pDb->zName, zWhere
- );
- iRootPage = pStat->tnum;
- }else{
- /* The sqlite_stat1 table already exists. Delete all rows. */
- iRootPage = pStat->tnum;
- sqlite3VdbeAddOp2(v, OP_Clear, pStat->tnum, iDb);
+
+ for(i=0; i<ArraySize(aTable); i++){
+ const char *zTab = aTable[i].zName;
+ Table *pStat;
+ if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){
+ /* The sqlite_stat[12] table does not exist. Create it. Note that a
+ ** side-effect of the CREATE TABLE statement is to leave the rootpage
+ ** of the new table in register pParse->regRoot. This is important
+ ** because the OpenWrite opcode below will be needing it. */
+ sqlite3NestedParse(pParse,
+ "CREATE TABLE %Q.%s(%s)", pDb->zName, zTab, aTable[i].zCols
+ );
+ aRoot[i] = pParse->regRoot;
+ aCreateTbl[i] = 1;
+ }else{
+ /* The table already exists. If zWhere is not NULL, delete all entries
+ ** associated with the table zWhere. If zWhere is NULL, delete the
+ ** entire contents of the table. */
+ aRoot[i] = pStat->tnum;
+ sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab);
+ if( zWhere ){
+ sqlite3NestedParse(pParse,
+ "DELETE FROM %Q.%s WHERE tbl=%Q", pDb->zName, zTab, zWhere
+ );
+ }else{
+ /* The sqlite_stat[12] table already exists. Delete all rows. */
+ sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb);
+ }
+ }
}
- /* Open the sqlite_stat1 table for writing. Unless it was created
- ** by this vdbe program, lock it for writing at the shared-cache level.
- ** If this vdbe did create the sqlite_stat1 table, then it must have
- ** already obtained a schema-lock, making the write-lock redundant.
- */
- if( !createStat1 ){
- sqlite3TableLock(pParse, iDb, iRootPage, 1, "sqlite_stat1");
+ /* Open the sqlite_stat[12] tables for writing. */
+ for(i=0; i<ArraySize(aTable); i++){
+ sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur+i, aRoot[i], iDb);
+ sqlite3VdbeChangeP4(v, -1, (char *)3, P4_INT32);
+ sqlite3VdbeChangeP5(v, aCreateTbl[i]);
}
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, 3);
- sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur, iRootPage, iDb);
- sqlite3VdbeChangeP5(v, createStat1);
}
/*
@@ -51733,30 +64471,45 @@ static void openStatTable(
static void analyzeOneTable(
Parse *pParse, /* Parser context */
Table *pTab, /* Table whose indices are to be analyzed */
- int iStatCur, /* Cursor that writes to the sqlite_stat1 table */
+ int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */
int iMem /* Available memory locations begin here */
){
- Index *pIdx; /* An index to being analyzed */
- int iIdxCur; /* Cursor number for index being analyzed */
- int nCol; /* Number of columns in the index */
- Vdbe *v; /* The virtual machine being built up */
- int i; /* Loop counter */
- int topOfLoop; /* The top of the loop */
- int endOfLoop; /* The end of the loop */
- int addr; /* The address of an instruction */
- int iDb; /* Index of database containing pTab */
+ sqlite3 *db = pParse->db; /* Database handle */
+ Index *pIdx; /* An index to being analyzed */
+ int iIdxCur; /* Cursor open on index being analyzed */
+ Vdbe *v; /* The virtual machine being built up */
+ int i; /* Loop counter */
+ int topOfLoop; /* The top of the loop */
+ int endOfLoop; /* The end of the loop */
+ int addr; /* The address of an instruction */
+ int iDb; /* Index of database containing pTab */
+ int regTabname = iMem++; /* Register containing table name */
+ int regIdxname = iMem++; /* Register containing index name */
+ int regSampleno = iMem++; /* Register containing next sample number */
+ int regCol = iMem++; /* Content of a column analyzed table */
+ int regRec = iMem++; /* Register holding completed record */
+ int regTemp = iMem++; /* Temporary use register */
+ int regRowid = iMem++; /* Rowid for the inserted record */
+
+#ifdef SQLITE_ENABLE_STAT2
+ int regTemp2 = iMem++; /* Temporary use register */
+ int regSamplerecno = iMem++; /* Index of next sample to record */
+ int regRecno = iMem++; /* Current sample index */
+ int regLast = iMem++; /* Index of last sample to record */
+ int regFirst = iMem++; /* Index of first sample to record */
+#endif
v = sqlite3GetVdbe(pParse);
- if( v==0 || pTab==0 || pTab->pIndex==0 ){
+ if( v==0 || NEVER(pTab==0) || pTab->pIndex==0 ){
/* Do no analysis for tables that have no indices */
return;
}
- assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
- iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+ assert( sqlite3BtreeHoldsAllMutexes(db) );
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
assert( iDb>=0 );
#ifndef SQLITE_OMIT_AUTHORIZATION
if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0,
- pParse->db->aDb[iDb].zName ) ){
+ db->aDb[iDb].zName ) ){
return;
}
#endif
@@ -51764,43 +64517,68 @@ static void analyzeOneTable(
/* Establish a read-lock on the table at the shared-cache level. */
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
- iIdxCur = pParse->nTab;
+ iIdxCur = pParse->nTab++;
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ int nCol = pIdx->nColumn;
KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
- int regFields; /* Register block for building records */
- int regRec; /* Register holding completed record */
- int regTemp; /* Temporary use register */
- int regCol; /* Content of a column from the table being analyzed */
- int regRowid; /* Rowid for the inserted record */
- int regF2;
-
- /* Open a cursor to the index to be analyzed
- */
- assert( iDb==sqlite3SchemaToIndex(pParse->db, pIdx->pSchema) );
- nCol = pIdx->nColumn;
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, nCol+1);
+
+ if( iMem+1+(nCol*2)>pParse->nMem ){
+ pParse->nMem = iMem+1+(nCol*2);
+ }
+
+ /* Open a cursor to the index to be analyzed. */
+ assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) );
sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb,
(char *)pKey, P4_KEYINFO_HANDOFF);
VdbeComment((v, "%s", pIdx->zName));
- regFields = iMem+nCol*2;
- regTemp = regRowid = regCol = regFields+3;
- regRec = regCol+1;
- if( regRec>pParse->nMem ){
- pParse->nMem = regRec;
+
+ /* Populate the registers containing the table and index names. */
+ if( pTab->pIndex==pIdx ){
+ sqlite3VdbeAddOp4(v, OP_String8, 0, regTabname, 0, pTab->zName, 0);
+ }
+ sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, pIdx->zName, 0);
+
+#ifdef SQLITE_ENABLE_STAT2
+
+ /* If this iteration of the loop is generating code to analyze the
+ ** first index in the pTab->pIndex list, then register regLast has
+ ** not been populated. In this case populate it now. */
+ if( pTab->pIndex==pIdx ){
+ sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regSamplerecno);
+ sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2-1, regTemp);
+ sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2, regTemp2);
+
+ sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regLast);
+ sqlite3VdbeAddOp2(v, OP_Null, 0, regFirst);
+ addr = sqlite3VdbeAddOp3(v, OP_Lt, regSamplerecno, 0, regLast);
+ sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regFirst);
+ sqlite3VdbeAddOp3(v, OP_Multiply, regLast, regTemp, regLast);
+ sqlite3VdbeAddOp2(v, OP_AddImm, regLast, SQLITE_INDEX_SAMPLES*2-2);
+ sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regLast);
+ sqlite3VdbeJumpHere(v, addr);
}
- /* Memory cells are used as follows:
+ /* Zero the regSampleno and regRecno registers. */
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regSampleno);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regRecno);
+ sqlite3VdbeAddOp2(v, OP_Copy, regFirst, regSamplerecno);
+#endif
+
+ /* The block of memory cells initialized here is used as follows.
+ **
+ ** iMem:
+ ** The total number of rows in the table.
+ **
+ ** iMem+1 .. iMem+nCol:
+ ** Number of distinct entries in index considering the
+ ** left-most N columns only, where N is between 1 and nCol,
+ ** inclusive.
**
- ** mem[iMem]: The total number of rows in the table.
- ** mem[iMem+1]: Number of distinct values in column 1
- ** ...
- ** mem[iMem+nCol]: Number of distinct values in column N
- ** mem[iMem+nCol+1] Last observed value of column 1
- ** ...
- ** mem[iMem+nCol+nCol]: Last observed value of column N
+ ** iMem+nCol+1 .. Mem+2*nCol:
+ ** Previous value of indexed columns, from left to right.
**
- ** Cells iMem through iMem+nCol are initialized to 0. The others
- ** are initialized to NULL.
+ ** Cells iMem through iMem+nCol are initialized to 0. The others are
+ ** initialized to contain an SQL NULL.
*/
for(i=0; i<=nCol; i++){
sqlite3VdbeAddOp2(v, OP_Integer, 0, iMem+i);
@@ -51809,34 +64587,77 @@ static void analyzeOneTable(
sqlite3VdbeAddOp2(v, OP_Null, 0, iMem+nCol+i+1);
}
- /* Do the analysis.
- */
+ /* Start the analysis loop. This loop runs through all the entries in
+ ** the index b-tree. */
endOfLoop = sqlite3VdbeMakeLabel(v);
sqlite3VdbeAddOp2(v, OP_Rewind, iIdxCur, endOfLoop);
topOfLoop = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp2(v, OP_AddImm, iMem, 1);
+
for(i=0; i<nCol; i++){
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regCol);
+#ifdef SQLITE_ENABLE_STAT2
+ if( i==0 ){
+ /* Check if the record that cursor iIdxCur points to contains a
+ ** value that should be stored in the sqlite_stat2 table. If so,
+ ** store it. */
+ int ne = sqlite3VdbeAddOp3(v, OP_Ne, regRecno, 0, regSamplerecno);
+ assert( regTabname+1==regIdxname
+ && regTabname+2==regSampleno
+ && regTabname+3==regCol
+ );
+ sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 4, regRec, "aaab", 0);
+ sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regRowid);
+ sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regRowid);
+
+ /* Calculate new values for regSamplerecno and regSampleno.
+ **
+ ** sampleno = sampleno + 1
+ ** samplerecno = samplerecno+(remaining records)/(remaining samples)
+ */
+ sqlite3VdbeAddOp2(v, OP_AddImm, regSampleno, 1);
+ sqlite3VdbeAddOp3(v, OP_Subtract, regRecno, regLast, regTemp);
+ sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1);
+ sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regTemp2);
+ sqlite3VdbeAddOp3(v, OP_Subtract, regSampleno, regTemp2, regTemp2);
+ sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regTemp, regTemp);
+ sqlite3VdbeAddOp3(v, OP_Add, regSamplerecno, regTemp, regSamplerecno);
+
+ sqlite3VdbeJumpHere(v, ne);
+ sqlite3VdbeAddOp2(v, OP_AddImm, regRecno, 1);
+ }
+#endif
+
sqlite3VdbeAddOp3(v, OP_Ne, regCol, 0, iMem+nCol+i+1);
/**** TODO: add collating sequence *****/
sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
}
+ if( db->mallocFailed ){
+ /* If a malloc failure has occurred, then the result of the expression
+ ** passed as the second argument to the call to sqlite3VdbeJumpHere()
+ ** below may be negative. Which causes an assert() to fail (or an
+ ** out-of-bounds write if SQLITE_DEBUG is not defined). */
+ return;
+ }
sqlite3VdbeAddOp2(v, OP_Goto, 0, endOfLoop);
for(i=0; i<nCol; i++){
- sqlite3VdbeJumpHere(v, topOfLoop + 2*(i + 1));
+ sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-(nCol*2));
sqlite3VdbeAddOp2(v, OP_AddImm, iMem+i+1, 1);
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, iMem+nCol+i+1);
}
+
+ /* End of the analysis loop. */
sqlite3VdbeResolveLabel(v, endOfLoop);
sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, topOfLoop);
sqlite3VdbeAddOp1(v, OP_Close, iIdxCur);
- /* Store the results.
+ /* Store the results in sqlite_stat1.
**
** The result is a single row of the sqlite_stat1 table. The first
** two columns are the names of the table and index. The third column
** is a string composed of a list of integer statistics about the
- ** index. The first integer in the list is the total number of entires
+ ** index. The first integer in the list is the total number of entries
** in the index. There is one additional integer in the list for each
** column of the table. This additional integer is a guess of how many
** rows of the table the index will select. If D is the count of distinct
@@ -51850,20 +64671,17 @@ static void analyzeOneTable(
** is never possible.
*/
addr = sqlite3VdbeAddOp1(v, OP_IfNot, iMem);
- sqlite3VdbeAddOp4(v, OP_String8, 0, regFields, 0, pTab->zName, 0);
- sqlite3VdbeAddOp4(v, OP_String8, 0, regFields+1, 0, pIdx->zName, 0);
- regF2 = regFields+2;
- sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regF2);
+ sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regSampleno);
for(i=0; i<nCol; i++){
sqlite3VdbeAddOp4(v, OP_String8, 0, regTemp, 0, " ", 0);
- sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regF2, regF2);
+ sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno);
sqlite3VdbeAddOp3(v, OP_Add, iMem, iMem+i+1, regTemp);
sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1);
sqlite3VdbeAddOp3(v, OP_Divide, iMem+i+1, regTemp, regTemp);
sqlite3VdbeAddOp1(v, OP_ToInt, regTemp);
- sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regF2, regF2);
+ sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno);
}
- sqlite3VdbeAddOp4(v, OP_MakeRecord, regFields, 3, regRec, "aaa", 0);
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0);
sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regRowid);
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
@@ -51893,7 +64711,8 @@ static void analyzeDatabase(Parse *pParse, int iDb){
int iMem;
sqlite3BeginWriteOperation(pParse, 0, iDb);
- iStatCur = pParse->nTab++;
+ iStatCur = pParse->nTab;
+ pParse->nTab += 2;
openStatTable(pParse, iDb, iStatCur, 0);
iMem = pParse->nMem+1;
for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){
@@ -51915,7 +64734,8 @@ static void analyzeTable(Parse *pParse, Table *pTab){
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
sqlite3BeginWriteOperation(pParse, 0, iDb);
- iStatCur = pParse->nTab++;
+ iStatCur = pParse->nTab;
+ pParse->nTab += 2;
openStatTable(pParse, iDb, iStatCur, pTab->zName);
analyzeOneTable(pParse, pTab, iStatCur, pParse->nMem+1);
loadAnalysis(pParse, iDb);
@@ -51948,13 +64768,14 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){
return;
}
+ assert( pName2!=0 || pName1==0 );
if( pName1==0 ){
/* Form 1: Analyze everything */
for(i=0; i<db->nDb; i++){
if( i==1 ) continue; /* Do not analyze the TEMP database */
analyzeDatabase(pParse, i);
}
- }else if( pName2==0 || pName2->n==0 ){
+ }else if( pName2->n==0 ){
/* Form 2: Analyze the database or table named */
iDb = sqlite3FindDb(db, pName1);
if( iDb>=0 ){
@@ -51963,7 +64784,7 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){
z = sqlite3NameFromToken(db, pName1);
if( z ){
pTab = sqlite3LocateTable(pParse, 0, z, 0);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
if( pTab ){
analyzeTable(pParse, pTab);
}
@@ -51977,7 +64798,7 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){
z = sqlite3NameFromToken(db, pTableName);
if( z ){
pTab = sqlite3LocateTable(pParse, 0, z, zDb);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
if( pTab ){
analyzeTable(pParse, pTab);
}
@@ -52003,7 +64824,7 @@ struct analysisInfo {
** argv[0] = name of the index
** argv[1] = results of analysis - on integer for each column
*/
-static int analysisLoader(void *pData, int argc, char **argv, char **azNotUsed){
+static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
analysisInfo *pInfo = (analysisInfo*)pData;
Index *pIndex;
int i, c;
@@ -52011,6 +64832,8 @@ static int analysisLoader(void *pData, int argc, char **argv, char **azNotUsed){
const char *z;
assert( argc==2 );
+ UNUSED_PARAMETER2(NotUsed, argc);
+
if( argv==0 || argv[0]==0 || argv[1]==0 ){
return 0;
}
@@ -52032,7 +64855,47 @@ static int analysisLoader(void *pData, int argc, char **argv, char **azNotUsed){
}
/*
-** Load the content of the sqlite_stat1 table into the index hash tables.
+** If the Index.aSample variable is not NULL, delete the aSample[] array
+** and its contents.
+*/
+SQLITE_PRIVATE void sqlite3DeleteIndexSamples(Index *pIdx){
+#ifdef SQLITE_ENABLE_STAT2
+ if( pIdx->aSample ){
+ int j;
+ sqlite3 *dbMem = pIdx->pTable->dbMem;
+ for(j=0; j<SQLITE_INDEX_SAMPLES; j++){
+ IndexSample *p = &pIdx->aSample[j];
+ if( p->eType==SQLITE_TEXT || p->eType==SQLITE_BLOB ){
+ sqlite3DbFree(pIdx->pTable->dbMem, p->u.z);
+ }
+ }
+ sqlite3DbFree(dbMem, pIdx->aSample);
+ pIdx->aSample = 0;
+ }
+#else
+ UNUSED_PARAMETER(pIdx);
+#endif
+}
+
+/*
+** Load the content of the sqlite_stat1 and sqlite_stat2 tables. The
+** contents of sqlite_stat1 are used to populate the Index.aiRowEst[]
+** arrays. The contents of sqlite_stat2 are used to populate the
+** Index.aSample[] arrays.
+**
+** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR
+** is returned. In this case, even if SQLITE_ENABLE_STAT2 was defined
+** during compilation and the sqlite_stat2 table is present, no data is
+** read from it.
+**
+** If SQLITE_ENABLE_STAT2 was defined during compilation and the
+** sqlite_stat2 table is not present in the database, SQLITE_ERROR is
+** returned. However, in this case, data is read from the sqlite_stat1
+** table (if it is present) before returning.
+**
+** If an OOM error occurs, this function always sets db->mallocFailed.
+** This means if the caller does not care about other errors, the return
+** code may be ignored.
*/
SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
analysisInfo sInfo;
@@ -52048,23 +64911,107 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){
Index *pIdx = sqliteHashData(i);
sqlite3DefaultRowEst(pIdx);
+ sqlite3DeleteIndexSamples(pIdx);
}
- /* Check to make sure the sqlite_stat1 table existss */
+ /* Check to make sure the sqlite_stat1 table exists */
sInfo.db = db;
sInfo.zDatabase = db->aDb[iDb].zName;
if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){
- return SQLITE_ERROR;
+ return SQLITE_ERROR;
}
-
/* Load new statistics out of the sqlite_stat1 table */
- zSql = sqlite3MPrintf(db, "SELECT idx, stat FROM %Q.sqlite_stat1",
- sInfo.zDatabase);
- (void)sqlite3SafetyOff(db);
- rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
- (void)sqlite3SafetyOn(db);
- sqlite3_free(zSql);
+ zSql = sqlite3MPrintf(db,
+ "SELECT idx, stat FROM %Q.sqlite_stat1", sInfo.zDatabase);
+ if( zSql==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ (void)sqlite3SafetyOff(db);
+ rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
+ (void)sqlite3SafetyOn(db);
+ sqlite3DbFree(db, zSql);
+ }
+
+
+ /* Load the statistics from the sqlite_stat2 table. */
+#ifdef SQLITE_ENABLE_STAT2
+ if( rc==SQLITE_OK && !sqlite3FindTable(db, "sqlite_stat2", sInfo.zDatabase) ){
+ rc = SQLITE_ERROR;
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3_stmt *pStmt = 0;
+
+ zSql = sqlite3MPrintf(db,
+ "SELECT idx,sampleno,sample FROM %Q.sqlite_stat2", sInfo.zDatabase);
+ if( !zSql ){
+ rc = SQLITE_NOMEM;
+ }else{
+ (void)sqlite3SafetyOff(db);
+ rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
+ (void)sqlite3SafetyOn(db);
+ sqlite3DbFree(db, zSql);
+ }
+
+ if( rc==SQLITE_OK ){
+ (void)sqlite3SafetyOff(db);
+ while( sqlite3_step(pStmt)==SQLITE_ROW ){
+ char *zIndex = (char *)sqlite3_column_text(pStmt, 0);
+ Index *pIdx = sqlite3FindIndex(db, zIndex, sInfo.zDatabase);
+ if( pIdx ){
+ int iSample = sqlite3_column_int(pStmt, 1);
+ sqlite3 *dbMem = pIdx->pTable->dbMem;
+ assert( dbMem==db || dbMem==0 );
+ if( iSample<SQLITE_INDEX_SAMPLES && iSample>=0 ){
+ int eType = sqlite3_column_type(pStmt, 2);
+
+ if( pIdx->aSample==0 ){
+ static const int sz = sizeof(IndexSample)*SQLITE_INDEX_SAMPLES;
+ pIdx->aSample = (IndexSample *)sqlite3DbMallocZero(dbMem, sz);
+ if( pIdx->aSample==0 ){
+ db->mallocFailed = 1;
+ break;
+ }
+ }
+
+ assert( pIdx->aSample );
+ {
+ IndexSample *pSample = &pIdx->aSample[iSample];
+ pSample->eType = (u8)eType;
+ if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
+ pSample->u.r = sqlite3_column_double(pStmt, 2);
+ }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){
+ const char *z = (const char *)(
+ (eType==SQLITE_BLOB) ?
+ sqlite3_column_blob(pStmt, 2):
+ sqlite3_column_text(pStmt, 2)
+ );
+ int n = sqlite3_column_bytes(pStmt, 2);
+ if( n>24 ){
+ n = 24;
+ }
+ pSample->nByte = (u8)n;
+ pSample->u.z = sqlite3DbMallocRaw(dbMem, n);
+ if( pSample->u.z ){
+ memcpy(pSample->u.z, z, n);
+ }else{
+ db->mallocFailed = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ rc = sqlite3_finalize(pStmt);
+ (void)sqlite3SafetyOn(db);
+ }
+ }
+#endif
+
+ if( rc==SQLITE_NOMEM ){
+ db->mallocFailed = 1;
+ }
return rc;
}
@@ -52086,7 +65033,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
*************************************************************************
** This file contains code used to implement the ATTACH and DETACH commands.
**
-** $Id: attach.c,v 1.75 2008/04/17 17:02:01 drh Exp $
+** $Id: attach.c,v 1.93 2009/05/31 21:21:41 drh Exp $
*/
#ifndef SQLITE_OMIT_ATTACH
@@ -52113,9 +65060,9 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
int rc = SQLITE_OK;
if( pExpr ){
if( pExpr->op!=TK_ID ){
- rc = sqlite3ExprResolveNames(pName, pExpr);
+ rc = sqlite3ResolveExprNames(pName, pExpr);
if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){
- sqlite3ErrorMsg(pName->pParse, "invalid name: \"%T\"", &pExpr->span);
+ sqlite3ErrorMsg(pName->pParse, "invalid name: \"%s\"", pExpr->u.zToken);
return SQLITE_ERROR;
}
}else{
@@ -52138,7 +65085,7 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
*/
static void attachFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
int i;
@@ -52148,7 +65095,8 @@ static void attachFunc(
const char *zFile;
Db *aNew;
char *zErrDyn = 0;
- char zErr[128];
+
+ UNUSED_PARAMETER(NotUsed);
zFile = (const char *)sqlite3_value_text(argv[0]);
zName = (const char *)sqlite3_value_text(argv[1]);
@@ -52162,22 +65110,20 @@ static void attachFunc(
** * Specified database name already being used.
*/
if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
- sqlite3_snprintf(
- sizeof(zErr), zErr, "too many attached databases - max %d",
+ zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
db->aLimit[SQLITE_LIMIT_ATTACHED]
);
goto attach_error;
}
if( !db->autoCommit ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "cannot ATTACH database within transaction");
+ zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction");
goto attach_error;
}
for(i=0; i<db->nDb; i++){
char *z = db->aDb[i].zName;
- if( z && zName && sqlite3StrICmp(z, zName)==0 ){
- sqlite3_snprintf(sizeof(zErr), zErr,
- "database %s is already in use", zName);
+ assert( z && zName );
+ if( sqlite3StrICmp(z, zName)==0 ){
+ zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
goto attach_error;
}
}
@@ -52186,21 +65132,15 @@ static void attachFunc(
** hash tables.
*/
if( db->aDb==db->aDbStatic ){
- aNew = sqlite3_malloc( sizeof(db->aDb[0])*3 );
- if( aNew==0 ){
- db->mallocFailed = 1;
- return;
- }
+ aNew = sqlite3DbMallocRaw(db, sizeof(db->aDb[0])*3 );
+ if( aNew==0 ) return;
memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
}else{
- aNew = sqlite3_realloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
- if( aNew==0 ){
- db->mallocFailed = 1;
- return;
- }
+ aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
+ if( aNew==0 ) return;
}
db->aDb = aNew;
- aNew = &db->aDb[db->nDb++];
+ aNew = &db->aDb[db->nDb];
memset(aNew, 0, sizeof(*aNew));
/* Open the database file. If the btree is successfully opened, use
@@ -52210,15 +65150,19 @@ static void attachFunc(
rc = sqlite3BtreeFactory(db, zFile, 0, SQLITE_DEFAULT_CACHE_SIZE,
db->openFlags | SQLITE_OPEN_MAIN_DB,
&aNew->pBt);
- if( rc==SQLITE_OK ){
+ db->nDb++;
+ if( rc==SQLITE_CONSTRAINT ){
+ rc = SQLITE_ERROR;
+ zErrDyn = sqlite3MPrintf(db, "database is already attached");
+ }else if( rc==SQLITE_OK ){
Pager *pPager;
aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt);
if( !aNew->pSchema ){
rc = SQLITE_NOMEM;
}else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){
- sqlite3_snprintf(sizeof(zErr), zErr,
+ zErrDyn = sqlite3MPrintf(db,
"attached databases must use the same text encoding as main database");
- goto attach_error;
+ rc = SQLITE_ERROR;
}
pPager = sqlite3BtreePager(aNew->pBt);
sqlite3PagerLockingMode(pPager, db->dfltLockMode);
@@ -52281,9 +65225,10 @@ static void attachFunc(
db->nDb = iDb;
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
db->mallocFailed = 1;
- sqlite3_snprintf(sizeof(zErr),zErr, "out of memory");
- }else{
- sqlite3_snprintf(sizeof(zErr),zErr, "unable to open database: %s", zFile);
+ sqlite3DbFree(db, zErrDyn);
+ zErrDyn = sqlite3MPrintf(db, "out of memory");
+ }else if( zErrDyn==0 ){
+ zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
}
goto attach_error;
}
@@ -52294,10 +65239,7 @@ attach_error:
/* Return an error if we get here */
if( zErrDyn ){
sqlite3_result_error(context, zErrDyn, -1);
- sqlite3_free(zErrDyn);
- }else{
- zErr[sizeof(zErr)-1] = 0;
- sqlite3_result_error(context, zErr, -1);
+ sqlite3DbFree(db, zErrDyn);
}
if( rc ) sqlite3_result_error_code(context, rc);
}
@@ -52312,7 +65254,7 @@ attach_error:
*/
static void detachFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
const char *zName = (const char *)sqlite3_value_text(argv[0]);
@@ -52321,6 +65263,8 @@ static void detachFunc(
Db *pDb = 0;
char zErr[128];
+ UNUSED_PARAMETER(NotUsed);
+
if( zName==0 ) zName = "";
for(i=0; i<db->nDb; i++){
pDb = &db->aDb[i];
@@ -52341,7 +65285,7 @@ static void detachFunc(
"cannot DETACH database within transaction");
goto detach_error;
}
- if( sqlite3BtreeIsInReadTrans(pDb->pBt) ){
+ if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){
sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName);
goto detach_error;
}
@@ -52363,8 +65307,7 @@ detach_error:
static void codeAttach(
Parse *pParse, /* The parser context */
int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */
- const char *zFunc, /* Either "sqlite_attach" or "sqlite_detach */
- int nFunc, /* Number of args to pass to zFunc */
+ FuncDef *pFunc, /* FuncDef wrapper for detachFunc() or attachFunc() */
Expr *pAuthArg, /* Expression to pass to authorization callback */
Expr *pFilename, /* Name of database file */
Expr *pDbname, /* Name of the database to use internally */
@@ -52373,25 +65316,9 @@ static void codeAttach(
int rc;
NameContext sName;
Vdbe *v;
- FuncDef *pFunc;
sqlite3* db = pParse->db;
int regArgs;
-#ifndef SQLITE_OMIT_AUTHORIZATION
- assert( db->mallocFailed || pAuthArg );
- if( pAuthArg ){
- char *zAuthArg = sqlite3NameFromToken(db, &pAuthArg->span);
- if( !zAuthArg ){
- goto attach_end;
- }
- rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0);
- sqlite3_free(zAuthArg);
- if(rc!=SQLITE_OK ){
- goto attach_end;
- }
- }
-#endif /* SQLITE_OMIT_AUTHORIZATION */
-
memset(&sName, 0, sizeof(NameContext));
sName.pParse = pParse;
@@ -52404,6 +65331,20 @@ static void codeAttach(
goto attach_end;
}
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ if( pAuthArg ){
+ char *zAuthArg = pAuthArg->u.zToken;
+ if( NEVER(zAuthArg==0) ){
+ goto attach_end;
+ }
+ rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0);
+ if(rc!=SQLITE_OK ){
+ goto attach_end;
+ }
+ }
+#endif /* SQLITE_OMIT_AUTHORIZATION */
+
+
v = sqlite3GetVdbe(pParse);
regArgs = sqlite3GetTempRange(pParse, 4);
sqlite3ExprCode(pParse, pFilename, regArgs);
@@ -52412,9 +65353,9 @@ static void codeAttach(
assert( v || db->mallocFailed );
if( v ){
- sqlite3VdbeAddOp3(v, OP_Function, 0, regArgs+3-nFunc, regArgs+3);
- sqlite3VdbeChangeP5(v, nFunc);
- pFunc = sqlite3FindFunction(db, zFunc, strlen(zFunc), nFunc, SQLITE_UTF8,0);
+ sqlite3VdbeAddOp3(v, OP_Function, 0, regArgs+3-pFunc->nArg, regArgs+3);
+ assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg );
+ sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg));
sqlite3VdbeChangeP4(v, -1, (char *)pFunc, P4_FUNCDEF);
/* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this
@@ -52425,9 +65366,9 @@ static void codeAttach(
}
attach_end:
- sqlite3ExprDelete(pFilename);
- sqlite3ExprDelete(pDbname);
- sqlite3ExprDelete(pKey);
+ sqlite3ExprDelete(db, pFilename);
+ sqlite3ExprDelete(db, pDbname);
+ sqlite3ExprDelete(db, pKey);
}
/*
@@ -52436,7 +65377,19 @@ attach_end:
** DETACH pDbname
*/
SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){
- codeAttach(pParse, SQLITE_DETACH, "sqlite_detach", 1, pDbname, 0, 0, pDbname);
+ static FuncDef detach_func = {
+ 1, /* nArg */
+ SQLITE_UTF8, /* iPrefEnc */
+ 0, /* flags */
+ 0, /* pUserData */
+ 0, /* pNext */
+ detachFunc, /* xFunc */
+ 0, /* xStep */
+ 0, /* xFinalize */
+ "sqlite_detach", /* zName */
+ 0 /* pHash */
+ };
+ codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname);
}
/*
@@ -52445,22 +65398,23 @@ SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){
** ATTACH p AS pDbname KEY pKey
*/
SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){
- codeAttach(pParse, SQLITE_ATTACH, "sqlite_attach", 3, p, p, pDbname, pKey);
+ static FuncDef attach_func = {
+ 3, /* nArg */
+ SQLITE_UTF8, /* iPrefEnc */
+ 0, /* flags */
+ 0, /* pUserData */
+ 0, /* pNext */
+ attachFunc, /* xFunc */
+ 0, /* xStep */
+ 0, /* xFinalize */
+ "sqlite_attach", /* zName */
+ 0 /* pHash */
+ };
+ codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey);
}
#endif /* SQLITE_OMIT_ATTACH */
/*
-** Register the functions sqlite_attach and sqlite_detach.
-*/
-SQLITE_PRIVATE void sqlite3AttachFunctions(sqlite3 *db){
-#ifndef SQLITE_OMIT_ATTACH
- static const int enc = SQLITE_UTF8;
- sqlite3CreateFunc(db, "sqlite_attach", 3, enc, 0, attachFunc, 0, 0);
- sqlite3CreateFunc(db, "sqlite_detach", 1, enc, 0, detachFunc, 0, 0);
-#endif
-}
-
-/*
** Initialize a DbFixer structure. This routine must be called prior
** to passing the structure to one of the sqliteFixAAAA() routines below.
**
@@ -52476,7 +65430,7 @@ SQLITE_PRIVATE int sqlite3FixInit(
){
sqlite3 *db;
- if( iDb<0 || iDb==1 ) return 0;
+ if( NEVER(iDb<0) || iDb==1 ) return 0;
db = pParse->db;
assert( db->nDb>iDb );
pFix->pParse = pParse;
@@ -52508,7 +65462,7 @@ SQLITE_PRIVATE int sqlite3FixSrcList(
const char *zDb;
struct SrcList_item *pItem;
- if( pList==0 ) return 0;
+ if( NEVER(pList==0) ) return 0;
zDb = pFix->zDb;
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
if( pItem->zDatabase==0 ){
@@ -52553,11 +65507,11 @@ SQLITE_PRIVATE int sqlite3FixExpr(
Expr *pExpr /* The expression to be fixed to one database */
){
while( pExpr ){
- if( sqlite3FixSelect(pFix, pExpr->pSelect) ){
- return 1;
- }
- if( sqlite3FixExprList(pFix, pExpr->pList) ){
- return 1;
+ if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ) break;
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1;
+ }else{
+ if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1;
}
if( sqlite3FixExpr(pFix, pExpr->pRight) ){
return 1;
@@ -52621,7 +65575,7 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep(
** systems that do not need this facility may omit it by recompiling
** the library with -DSQLITE_OMIT_AUTHORIZATION=1
**
-** $Id: auth.c,v 1.29 2007/09/18 15:55:07 drh Exp $
+** $Id: auth.c,v 1.32 2009/07/02 18:40:35 danielk1977 Exp $
*/
/*
@@ -52692,14 +65646,45 @@ SQLITE_API int sqlite3_set_authorizer(
** Write an error message into pParse->zErrMsg that explains that the
** user-supplied authorization function returned an illegal value.
*/
-static void sqliteAuthBadReturnCode(Parse *pParse, int rc){
- sqlite3ErrorMsg(pParse, "illegal return value (%d) from the "
- "authorization function - should be SQLITE_OK, SQLITE_IGNORE, "
- "or SQLITE_DENY", rc);
+static void sqliteAuthBadReturnCode(Parse *pParse){
+ sqlite3ErrorMsg(pParse, "authorizer malfunction");
pParse->rc = SQLITE_ERROR;
}
/*
+** Invoke the authorization callback for permission to read column zCol from
+** table zTab in database zDb. This function assumes that an authorization
+** callback has been registered (i.e. that sqlite3.xAuth is not NULL).
+**
+** If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed
+** to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE
+** is treated as SQLITE_DENY. In this case an error is left in pParse.
+*/
+SQLITE_PRIVATE int sqlite3AuthReadCol(
+ Parse *pParse, /* The parser context */
+ const char *zTab, /* Table name */
+ const char *zCol, /* Column name */
+ int iDb /* Index of containing database. */
+){
+ sqlite3 *db = pParse->db; /* Database handle */
+ char *zDb = db->aDb[iDb].zName; /* Name of attached database */
+ int rc; /* Auth callback return code */
+
+ rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext);
+ if( rc==SQLITE_DENY ){
+ if( db->nDb>2 || iDb!=0 ){
+ sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited",zDb,zTab,zCol);
+ }else{
+ sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited", zTab, zCol);
+ }
+ pParse->rc = SQLITE_AUTH;
+ }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){
+ sqliteAuthBadReturnCode(pParse);
+ }
+ return rc;
+}
+
+/*
** The pExpr should be a TK_COLUMN expression. The table referred to
** is in pTabList or else it is the NEW or OLD table of a trigger.
** Check to see if it is OK to read this particular column.
@@ -52715,38 +65700,38 @@ SQLITE_PRIVATE void sqlite3AuthRead(
SrcList *pTabList /* All table that pExpr might refer to */
){
sqlite3 *db = pParse->db;
- int rc;
Table *pTab = 0; /* The table being read */
const char *zCol; /* Name of the column of the table */
int iSrc; /* Index in pTabList->a[] of table being read */
- const char *zDBase; /* Name of database being accessed */
- TriggerStack *pStack; /* The stack of current triggers */
int iDb; /* The index of the database the expression refers to */
+ int iCol; /* Index of column in table */
if( db->xAuth==0 ) return;
- if( pExpr->op!=TK_COLUMN ) return;
iDb = sqlite3SchemaToIndex(pParse->db, pSchema);
if( iDb<0 ){
/* An attempt to read a column out of a subquery or other
** temporary table. */
return;
}
- for(iSrc=0; pTabList && iSrc<pTabList->nSrc; iSrc++){
- if( pExpr->iTable==pTabList->a[iSrc].iCursor ) break;
- }
- if( iSrc>=0 && pTabList && iSrc<pTabList->nSrc ){
- pTab = pTabList->a[iSrc].pTab;
- }else if( (pStack = pParse->trigStack)!=0 ){
- /* This must be an attempt to read the NEW or OLD pseudo-tables
- ** of a trigger.
- */
- assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx );
- pTab = pStack->pTab;
+
+ assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
+ if( pExpr->op==TK_TRIGGER ){
+ pTab = pParse->pTriggerTab;
+ }else{
+ assert( pTabList );
+ for(iSrc=0; ALWAYS(iSrc<pTabList->nSrc); iSrc++){
+ if( pExpr->iTable==pTabList->a[iSrc].iCursor ){
+ pTab = pTabList->a[iSrc].pTab;
+ break;
+ }
+ }
}
- if( pTab==0 ) return;
- if( pExpr->iColumn>=0 ){
- assert( pExpr->iColumn<pTab->nCol );
- zCol = pTab->aCol[pExpr->iColumn].zName;
+ iCol = pExpr->iColumn;
+ if( NEVER(pTab==0) ) return;
+
+ if( iCol>=0 ){
+ assert( iCol<pTab->nCol );
+ zCol = pTab->aCol[iCol].zName;
}else if( pTab->iPKey>=0 ){
assert( pTab->iPKey<pTab->nCol );
zCol = pTab->aCol[pTab->iPKey].zName;
@@ -52754,21 +65739,8 @@ SQLITE_PRIVATE void sqlite3AuthRead(
zCol = "ROWID";
}
assert( iDb>=0 && iDb<db->nDb );
- zDBase = db->aDb[iDb].zName;
- rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol, zDBase,
- pParse->zAuthContext);
- if( rc==SQLITE_IGNORE ){
+ if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){
pExpr->op = TK_NULL;
- }else if( rc==SQLITE_DENY ){
- if( db->nDb>2 || iDb!=0 ){
- sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited",
- zDBase, pTab->zName, zCol);
- }else{
- sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited",pTab->zName,zCol);
- }
- pParse->rc = SQLITE_AUTH;
- }else if( rc!=SQLITE_OK ){
- sqliteAuthBadReturnCode(pParse, rc);
}
}
@@ -52804,7 +65776,7 @@ SQLITE_PRIVATE int sqlite3AuthCheck(
pParse->rc = SQLITE_AUTH;
}else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){
rc = SQLITE_DENY;
- sqliteAuthBadReturnCode(pParse, rc);
+ sqliteAuthBadReturnCode(pParse);
}
return rc;
}
@@ -52819,11 +65791,10 @@ SQLITE_PRIVATE void sqlite3AuthContextPush(
AuthContext *pContext,
const char *zContext
){
+ assert( pParse );
pContext->pParse = pParse;
- if( pParse ){
- pContext->zAuthContext = pParse->zAuthContext;
- pParse->zAuthContext = zContext;
- }
+ pContext->zAuthContext = pParse->zAuthContext;
+ pParse->zAuthContext = zContext;
}
/*
@@ -52865,7 +65836,7 @@ SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){
** COMMIT
** ROLLBACK
**
-** $Id: build.c,v 1.484 2008/05/01 17:16:53 drh Exp $
+** $Id: build.c,v 1.557 2009/07/24 17:58:53 danielk1977 Exp $
*/
/*
@@ -52873,7 +65844,7 @@ SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){
** be parsed. Initialize the pParse structure as needed.
*/
SQLITE_PRIVATE void sqlite3BeginParse(Parse *pParse, int explainFlag){
- pParse->explain = explainFlag;
+ pParse->explain = (u8)explainFlag;
pParse->nVar = 0;
}
@@ -52906,34 +65877,32 @@ SQLITE_PRIVATE void sqlite3TableLock(
u8 isWriteLock, /* True for a write lock */
const char *zName /* Name of the table to be locked */
){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
int i;
int nBytes;
TableLock *p;
+ assert( iDb>=0 );
- if( iDb<0 ){
- return;
- }
-
- for(i=0; i<pParse->nTableLock; i++){
- p = &pParse->aTableLock[i];
+ for(i=0; i<pToplevel->nTableLock; i++){
+ p = &pToplevel->aTableLock[i];
if( p->iDb==iDb && p->iTab==iTab ){
p->isWriteLock = (p->isWriteLock || isWriteLock);
return;
}
}
- nBytes = sizeof(TableLock) * (pParse->nTableLock+1);
- pParse->aTableLock =
- sqlite3DbReallocOrFree(pParse->db, pParse->aTableLock, nBytes);
- if( pParse->aTableLock ){
- p = &pParse->aTableLock[pParse->nTableLock++];
+ nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
+ pToplevel->aTableLock =
+ sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
+ if( pToplevel->aTableLock ){
+ p = &pToplevel->aTableLock[pToplevel->nTableLock++];
p->iDb = iDb;
p->iTab = iTab;
p->isWriteLock = isWriteLock;
p->zName = zName;
}else{
- pParse->nTableLock = 0;
- pParse->db->mallocFailed = 1;
+ pToplevel->nTableLock = 0;
+ pToplevel->db->mallocFailed = 1;
}
}
@@ -52945,9 +65914,8 @@ static void codeTableLocks(Parse *pParse){
int i;
Vdbe *pVdbe;
- if( 0==(pVdbe = sqlite3GetVdbe(pParse)) ){
- return;
- }
+ pVdbe = sqlite3GetVdbe(pParse);
+ assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */
for(i=0; i<pParse->nTableLock; i++){
TableLock *p = &pParse->aTableLock[i];
@@ -52978,17 +65946,13 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
if( db->mallocFailed ) return;
if( pParse->nested ) return;
if( pParse->nErr ) return;
- if( !pParse->pVdbe ){
- if( pParse->rc==SQLITE_OK && pParse->nErr ){
- pParse->rc = SQLITE_ERROR;
- return;
- }
- }
/* Begin by generating some termination code at the end of the
** vdbe program
*/
v = sqlite3GetVdbe(pParse);
+ assert( !pParse->isMultiWrite
+ || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort));
if( v ){
sqlite3VdbeAddOp0(v, OP_Halt);
@@ -53006,13 +65970,15 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
if( (mask & pParse->cookieMask)==0 ) continue;
sqlite3VdbeUsesBtree(v, iDb);
sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
- sqlite3VdbeAddOp2(v,OP_VerifyCookie, iDb, pParse->cookieValue[iDb]);
+ if( db->init.busy==0 ){
+ sqlite3VdbeAddOp2(v,OP_VerifyCookie, iDb, pParse->cookieValue[iDb]);
+ }
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
{
int i;
for(i=0; i<pParse->nVtabLock; i++){
- char *vtab = (char *)pParse->apVtabLock[i]->pVtab;
+ char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
}
pParse->nVtabLock = 0;
@@ -53024,33 +65990,31 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
** shared-cache feature is enabled.
*/
codeTableLocks(pParse);
- sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->cookieGoto);
- }
-#ifndef SQLITE_OMIT_TRACE
- if( !db->init.busy ){
- /* Change the P4 argument of the first opcode (which will always be
- ** an OP_Trace) to be the complete text of the current SQL statement.
+ /* Initialize any AUTOINCREMENT data structures required.
*/
- VdbeOp *pOp = sqlite3VdbeGetOp(v, 0);
- if( pOp && pOp->opcode==OP_Trace ){
- sqlite3VdbeChangeP4(v, 0, pParse->zSql, pParse->zTail-pParse->zSql);
- }
+ sqlite3AutoincrementBegin(pParse);
+
+ /* Finally, jump back to the beginning of the executable code. */
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->cookieGoto);
}
-#endif /* SQLITE_OMIT_TRACE */
}
/* Get the VDBE program ready for execution
*/
- if( v && pParse->nErr==0 && !db->mallocFailed ){
+ if( v && ALWAYS(pParse->nErr==0) && !db->mallocFailed ){
#ifdef SQLITE_DEBUG
FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
sqlite3VdbeTrace(v, trace);
#endif
- assert( pParse->disableColCache==0 ); /* Disables and re-enables match */
- sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem+3,
- pParse->nTab+3, pParse->explain);
+ assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */
+ /* A minimum of one cursor is required if autoincrement is used
+ * See ticket [a696379c1f08866] */
+ if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1;
+ sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem,
+ pParse->nTab, pParse->nMaxArg, pParse->explain,
+ pParse->isMultiWrite && pParse->mayAbort);
pParse->rc = SQLITE_DONE;
pParse->colNamesSet = 0;
}else if( pParse->rc==SQLITE_OK ){
@@ -53079,23 +66043,25 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
va_list ap;
char *zSql;
+ char *zErrMsg = 0;
+ sqlite3 *db = pParse->db;
# define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar))
char saveBuf[SAVE_SZ];
if( pParse->nErr ) return;
assert( pParse->nested<10 ); /* Nesting should only be of limited depth */
va_start(ap, zFormat);
- zSql = sqlite3VMPrintf(pParse->db, zFormat, ap);
+ zSql = sqlite3VMPrintf(db, zFormat, ap);
va_end(ap);
if( zSql==0 ){
- pParse->db->mallocFailed = 1;
return; /* A malloc must have failed */
}
pParse->nested++;
memcpy(saveBuf, &pParse->nVar, SAVE_SZ);
memset(&pParse->nVar, 0, SAVE_SZ);
- sqlite3RunParser(pParse, zSql, 0);
- sqlite3_free(zSql);
+ sqlite3RunParser(pParse, zSql, &zErrMsg);
+ sqlite3DbFree(db, zErrMsg);
+ sqlite3DbFree(db, zSql);
memcpy(&pParse->nVar, saveBuf, SAVE_SZ);
pParse->nested--;
}
@@ -53115,11 +66081,13 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){
Table *p = 0;
int i;
+ int nName;
assert( zName!=0 );
+ nName = sqlite3Strlen30(zName);
for(i=OMIT_TEMPDB; i<db->nDb; i++){
int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue;
- p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, strlen(zName)+1);
+ p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName);
if( p ) break;
}
return p;
@@ -53177,14 +66145,13 @@ SQLITE_PRIVATE Table *sqlite3LocateTable(
SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){
Index *p = 0;
int i;
+ int nName = sqlite3Strlen30(zName);
for(i=OMIT_TEMPDB; i<db->nDb; i++){
int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
Schema *pSchema = db->aDb[j].pSchema;
+ assert( pSchema );
if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue;
- assert( pSchema || (j==1 && !db->aDb[1].pBt) );
- if( pSchema ){
- p = sqlite3HashFind(&pSchema->idxHash, zName, strlen(zName)+1);
- }
+ p = sqlite3HashFind(&pSchema->idxHash, zName, nName);
if( p ) break;
}
return p;
@@ -53194,8 +66161,12 @@ SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const cha
** Reclaim the memory used by an index
*/
static void freeIndex(Index *p){
- sqlite3_free(p->zColAff);
- sqlite3_free(p);
+ sqlite3 *db = p->pTable->dbMem;
+#ifndef SQLITE_OMIT_ANALYZE
+ sqlite3DeleteIndexSamples(p);
+#endif
+ sqlite3DbFree(db, p->zColAff);
+ sqlite3DbFree(db, p);
}
/*
@@ -53206,11 +66177,12 @@ static void freeIndex(Index *p){
** it is not unlinked from the Table that it indexes.
** Unlinking from the Table must be done by the calling function.
*/
-static void sqliteDeleteIndex(Index *p){
+static void sqlite3DeleteIndex(Index *p){
Index *pOld;
const char *zName = p->zName;
- pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen( zName)+1, 0);
+ pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName,
+ sqlite3Strlen30(zName), 0);
assert( pOld==0 || pOld==p );
freeIndex(p);
}
@@ -53226,15 +66198,18 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char
int len;
Hash *pHash = &db->aDb[iDb].pSchema->idxHash;
- len = strlen(zIdxName);
- pIndex = sqlite3HashInsert(pHash, zIdxName, len+1, 0);
+ len = sqlite3Strlen30(zIdxName);
+ pIndex = sqlite3HashInsert(pHash, zIdxName, len, 0);
if( pIndex ){
if( pIndex->pTable->pIndex==pIndex ){
pIndex->pTable->pIndex = pIndex->pNext;
}else{
Index *p;
- for(p=pIndex->pTable->pIndex; p && p->pNext!=pIndex; p=p->pNext){}
- if( p && p->pNext==pIndex ){
+ /* Justification of ALWAYS(); The index must be on the list of
+ ** indices. */
+ p = pIndex->pTable->pIndex;
+ while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; }
+ if( ALWAYS(p && p->pNext==pIndex) ){
p->pNext = pIndex->pNext;
}
}
@@ -53250,8 +66225,8 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char
** if there were schema changes during the transaction or if a
** schema-cookie mismatch occurs.
**
-** If iDb<=0 then reset the internal schema tables for all database
-** files. If iDb>=2 then reset the internal schema for only the
+** If iDb==0 then reset the internal schema tables for all database
+** files. If iDb>=1 then reset the internal schema for only the
** single file indicated.
*/
SQLITE_PRIVATE void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
@@ -53271,6 +66246,7 @@ SQLITE_PRIVATE void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
}
assert( iDb==0 );
db->flags &= ~SQLITE_InternChanges;
+ sqlite3VtabUnlockList(db);
sqlite3BtreeLeaveAll(db);
/* If one or more of the auxiliary database files has been closed,
@@ -53279,17 +66255,10 @@ SQLITE_PRIVATE void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
** schema hash tables and therefore do not have to make any changes
** to any of those tables.
*/
- for(i=0; i<db->nDb; i++){
- struct Db *pDb = &db->aDb[i];
- if( pDb->pBt==0 ){
- if( pDb->pAux && pDb->xFreeAux ) pDb->xFreeAux(pDb->pAux);
- pDb->pAux = 0;
- }
- }
for(i=j=2; i<db->nDb; i++){
struct Db *pDb = &db->aDb[i];
if( pDb->pBt==0 ){
- sqlite3_free(pDb->zName);
+ sqlite3DbFree(db, pDb->zName);
pDb->zName = 0;
continue;
}
@@ -53302,7 +66271,7 @@ SQLITE_PRIVATE void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
db->nDb = j;
if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
- sqlite3_free(db->aDb);
+ sqlite3DbFree(db, db->aDb);
db->aDb = db->aDbStatic;
}
}
@@ -53320,15 +66289,18 @@ SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){
static void sqliteResetColumnNames(Table *pTable){
int i;
Column *pCol;
+ sqlite3 *db = pTable->dbMem;
+ testcase( db==0 );
assert( pTable!=0 );
if( (pCol = pTable->aCol)!=0 ){
for(i=0; i<pTable->nCol; i++, pCol++){
- sqlite3_free(pCol->zName);
- sqlite3ExprDelete(pCol->pDflt);
- sqlite3_free(pCol->zType);
- sqlite3_free(pCol->zColl);
+ sqlite3DbFree(db, pCol->zName);
+ sqlite3ExprDelete(db, pCol->pDflt);
+ sqlite3DbFree(db, pCol->zDflt);
+ sqlite3DbFree(db, pCol->zType);
+ sqlite3DbFree(db, pCol->zColl);
}
- sqlite3_free(pTable->aCol);
+ sqlite3DbFree(db, pTable->aCol);
}
pTable->aCol = 0;
pTable->nCol = 0;
@@ -53339,16 +66311,17 @@ static void sqliteResetColumnNames(Table *pTable){
** Table. No changes are made to disk by this routine.
**
** This routine just deletes the data structure. It does not unlink
-** the table data structure from the hash table. Nor does it remove
-** foreign keys from the sqlite.aFKey hash table. But it does destroy
+** the table data structure from the hash table. But it does destroy
** memory structures of the indices and foreign keys associated with
** the table.
*/
SQLITE_PRIVATE void sqlite3DeleteTable(Table *pTable){
Index *pIndex, *pNext;
- FKey *pFKey, *pNextFKey;
+ sqlite3 *db;
if( pTable==0 ) return;
+ db = pTable->dbMem;
+ testcase( db==0 );
/* Do not delete the table until the reference count reaches zero. */
pTable->nRef--;
@@ -53362,32 +66335,23 @@ SQLITE_PRIVATE void sqlite3DeleteTable(Table *pTable){
for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
pNext = pIndex->pNext;
assert( pIndex->pSchema==pTable->pSchema );
- sqliteDeleteIndex(pIndex);
+ sqlite3DeleteIndex(pIndex);
}
-#ifndef SQLITE_OMIT_FOREIGN_KEY
- /* Delete all foreign keys associated with this table. The keys
- ** should have already been unlinked from the pSchema->aFKey hash table
- */
- for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){
- pNextFKey = pFKey->pNextFrom;
- assert( sqlite3HashFind(&pTable->pSchema->aFKey,
- pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey );
- sqlite3_free(pFKey);
- }
-#endif
+ /* Delete any foreign keys attached to this table. */
+ sqlite3FkDelete(pTable);
/* Delete the Table structure itself.
*/
sqliteResetColumnNames(pTable);
- sqlite3_free(pTable->zName);
- sqlite3_free(pTable->zColAff);
- sqlite3SelectDelete(pTable->pSelect);
+ sqlite3DbFree(db, pTable->zName);
+ sqlite3DbFree(db, pTable->zColAff);
+ sqlite3SelectDelete(db, pTable->pSelect);
#ifndef SQLITE_OMIT_CHECK
- sqlite3ExprDelete(pTable->pCheck);
+ sqlite3ExprDelete(db, pTable->pCheck);
#endif
sqlite3VtabClear(pTable);
- sqlite3_free(pTable);
+ sqlite3DbFree(db, pTable);
}
/*
@@ -53396,40 +66360,27 @@ SQLITE_PRIVATE void sqlite3DeleteTable(Table *pTable){
*/
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){
Table *p;
- FKey *pF1, *pF2;
Db *pDb;
assert( db!=0 );
assert( iDb>=0 && iDb<db->nDb );
assert( zTabName && zTabName[0] );
pDb = &db->aDb[iDb];
- p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, strlen(zTabName)+1,0);
- if( p ){
-#ifndef SQLITE_OMIT_FOREIGN_KEY
- for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){
- int nTo = strlen(pF1->zTo) + 1;
- pF2 = sqlite3HashFind(&pDb->pSchema->aFKey, pF1->zTo, nTo);
- if( pF2==pF1 ){
- sqlite3HashInsert(&pDb->pSchema->aFKey, pF1->zTo, nTo, pF1->pNextTo);
- }else{
- while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; }
- if( pF2 ){
- pF2->pNextTo = pF1->pNextTo;
- }
- }
- }
-#endif
- sqlite3DeleteTable(p);
- }
+ p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName,
+ sqlite3Strlen30(zTabName),0);
+ sqlite3DeleteTable(p);
db->flags |= SQLITE_InternChanges;
}
/*
** Given a token, return a string that consists of the text of that
-** token with any quotations removed. Space to hold the returned string
+** token. Space to hold the returned string
** is obtained from sqliteMalloc() and must be freed by the calling
** function.
**
+** Any quotation marks (ex: "name", 'name', [name], or `name`) that
+** surround the body of the token are removed.
+**
** Tokens are often just pointers into the original SQL text and so
** are not \000 terminated and are not persistent. The returned string
** is \000 terminated and is persistent.
@@ -53452,36 +66403,49 @@ SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *p, int iDb){
Vdbe *v = sqlite3GetVdbe(p);
sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb));
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, 5);/* sqlite_master has 5 columns */
sqlite3VdbeAddOp3(v, OP_OpenWrite, 0, MASTER_ROOT, iDb);
+ sqlite3VdbeChangeP4(v, -1, (char *)5, P4_INT32); /* 5 column table */
+ if( p->nTab==0 ){
+ p->nTab = 1;
+ }
}
/*
-** The token *pName contains the name of a database (either "main" or
-** "temp" or the name of an attached db). This routine returns the
-** index of the named database in db->aDb[], or -1 if the named db
-** does not exist.
+** Parameter zName points to a nul-terminated buffer containing the name
+** of a database ("main", "temp" or the name of an attached db). This
+** function returns the index of the named database in db->aDb[], or
+** -1 if the named db cannot be found.
*/
-SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){
- int i = -1; /* Database number */
- int n; /* Number of characters in the name */
- Db *pDb; /* A database whose name space is being searched */
- char *zName; /* Name we are searching for */
-
- zName = sqlite3NameFromToken(db, pName);
+SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){
+ int i = -1; /* Database number */
if( zName ){
- n = strlen(zName);
+ Db *pDb;
+ int n = sqlite3Strlen30(zName);
for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){
- if( (!OMIT_TEMPDB || i!=1 ) && n==strlen(pDb->zName) &&
+ if( (!OMIT_TEMPDB || i!=1 ) && n==sqlite3Strlen30(pDb->zName) &&
0==sqlite3StrICmp(pDb->zName, zName) ){
break;
}
}
- sqlite3_free(zName);
}
return i;
}
+/*
+** The token *pName contains the name of a database (either "main" or
+** "temp" or the name of an attached db). This routine returns the
+** index of the named database in db->aDb[], or -1 if the named db
+** does not exist.
+*/
+SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){
+ int i; /* Database number */
+ char *zName; /* Name we are searching for */
+ zName = sqlite3NameFromToken(db, pName);
+ i = sqlite3FindDbName(db, zName);
+ sqlite3DbFree(db, zName);
+ return i;
+}
+
/* The table or view or trigger name is passed to this routine via tokens
** pName1 and pName2. If the table name was fully qualified, for example:
**
@@ -53507,8 +66471,12 @@ SQLITE_PRIVATE int sqlite3TwoPartName(
int iDb; /* Database holding the object */
sqlite3 *db = pParse->db;
- if( pName2 && pName2->n>0 ){
- assert( !db->init.busy );
+ if( ALWAYS(pName2!=0) && pName2->n>0 ){
+ if( db->init.busy ) {
+ sqlite3ErrorMsg(pParse, "corrupt database");
+ pParse->nErr++;
+ return -1;
+ }
*pUnqual = pName2;
iDb = sqlite3FindDb(db, pName1);
if( iDb<0 ){
@@ -53668,7 +66636,8 @@ SQLITE_PRIVATE void sqlite3StartTable(
pTable->iPKey = -1;
pTable->pSchema = db->aDb[iDb].pSchema;
pTable->nRef = 1;
- if( pParse->pNewTable ) sqlite3DeleteTable(pParse->pNewTable);
+ pTable->dbMem = 0;
+ assert( pParse->pNewTable==0 );
pParse->pNewTable = pTable;
/* If this is the magic sqlite_sequence table used by autoincrement,
@@ -53707,24 +66676,25 @@ SQLITE_PRIVATE void sqlite3StartTable(
reg1 = pParse->regRowid = ++pParse->nMem;
reg2 = pParse->regRoot = ++pParse->nMem;
reg3 = ++pParse->nMem;
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, 1); /* file_format */
+ sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT);
sqlite3VdbeUsesBtree(v, iDb);
j1 = sqlite3VdbeAddOp1(v, OP_If, reg3);
fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ?
1 : SQLITE_MAX_FILE_FORMAT;
sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, 1, reg3);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3);
sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, 4, reg3);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3);
sqlite3VdbeJumpHere(v, j1);
/* This just creates a place-holder record in the sqlite_master table.
** The record created does not contain anything yet. It will be replaced
** by the real entry in code generated at sqlite3EndTable().
**
- ** The rowid for the new entry is left on the top of the stack.
- ** The rowid value is needed by the code that sqlite3EndTable will
- ** generate.
+ ** The rowid for the new entry is left in register pParse->regRowid.
+ ** The root page number of the new table is left in reg pParse->regRoot.
+ ** The rowid and root page number values are needed by the code that
+ ** sqlite3EndTable will generate.
*/
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
if( isView || isVirtual ){
@@ -53747,7 +66717,7 @@ SQLITE_PRIVATE void sqlite3StartTable(
/* If an error occurs, we jump here */
begin_table_error:
- sqlite3_free(zName);
+ sqlite3DbFree(db, zName);
return;
}
@@ -53785,20 +66755,20 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){
return;
}
#endif
- z = sqlite3NameFromToken(pParse->db, pName);
+ z = sqlite3NameFromToken(db, pName);
if( z==0 ) return;
for(i=0; i<p->nCol; i++){
if( STRICMP(z, p->aCol[i].zName) ){
sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
return;
}
}
if( (p->nCol & 0x7)==0 ){
Column *aNew;
- aNew = sqlite3DbRealloc(pParse->db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
+ aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
if( aNew==0 ){
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
return;
}
p->aCol = aNew;
@@ -53823,10 +66793,9 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){
*/
SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
Table *p;
- int i;
- if( (p = pParse->pNewTable)==0 ) return;
- i = p->nCol-1;
- if( i>=0 ) p->aCol[i].notNull = onError;
+ p = pParse->pNewTable;
+ if( p==0 || NEVER(p->nCol<1) ) return;
+ p->aCol[p->nCol-1].notNull = (u8)onError;
}
/*
@@ -53854,14 +66823,12 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
** If none of the substrings in the above table are found,
** SQLITE_AFF_NUMERIC is returned.
*/
-SQLITE_PRIVATE char sqlite3AffinityType(const Token *pType){
+SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn){
u32 h = 0;
char aff = SQLITE_AFF_NUMERIC;
- const unsigned char *zIn = pType->z;
- const unsigned char *zEnd = &pType->z[pType->n];
- while( zIn!=zEnd ){
- h = (h<<8) + sqlite3UpperToLower[*zIn];
+ if( zIn ) while( zIn[0] ){
+ h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff];
zIn++;
if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */
aff = SQLITE_AFF_TEXT;
@@ -53903,16 +66870,14 @@ SQLITE_PRIVATE char sqlite3AffinityType(const Token *pType){
*/
SQLITE_PRIVATE void sqlite3AddColumnType(Parse *pParse, Token *pType){
Table *p;
- int i;
Column *pCol;
- if( (p = pParse->pNewTable)==0 ) return;
- i = p->nCol-1;
- if( i<0 ) return;
- pCol = &p->aCol[i];
- sqlite3_free(pCol->zType);
+ p = pParse->pNewTable;
+ if( p==0 || NEVER(p->nCol<1) ) return;
+ pCol = &p->aCol[p->nCol-1];
+ assert( pCol->zType==0 );
pCol->zType = sqlite3NameFromToken(pParse->db, pType);
- pCol->affinity = sqlite3AffinityType(pType);
+ pCol->affinity = sqlite3AffinityType(pCol->zType);
}
/*
@@ -53925,25 +66890,29 @@ SQLITE_PRIVATE void sqlite3AddColumnType(Parse *pParse, Token *pType){
** This routine is called by the parser while in the middle of
** parsing a CREATE TABLE statement.
*/
-SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, Expr *pExpr){
+SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
Table *p;
Column *pCol;
- if( (p = pParse->pNewTable)!=0 ){
+ sqlite3 *db = pParse->db;
+ p = pParse->pNewTable;
+ if( p!=0 ){
pCol = &(p->aCol[p->nCol-1]);
- if( !sqlite3ExprIsConstantOrFunction(pExpr) ){
+ if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr) ){
sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
pCol->zName);
}else{
- Expr *pCopy;
- sqlite3 *db = pParse->db;
- sqlite3ExprDelete(pCol->pDflt);
- pCol->pDflt = pCopy = sqlite3ExprDup(db, pExpr);
- if( pCopy ){
- sqlite3TokenCopy(db, &pCopy->span, &pExpr->span);
- }
+ /* A copy of pExpr is used instead of the original, as pExpr contains
+ ** tokens that point to volatile memory. The 'span' of the expression
+ ** is required by pragma table_info.
+ */
+ sqlite3ExprDelete(db, pCol->pDflt);
+ pCol->pDflt = sqlite3ExprDup(db, pSpan->pExpr, EXPRDUP_REDUCE);
+ sqlite3DbFree(db, pCol->zDflt);
+ pCol->zDflt = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
+ (int)(pSpan->zEnd - pSpan->zStart));
}
}
- sqlite3ExprDelete(pExpr);
+ sqlite3ExprDelete(db, pSpan->pExpr);
}
/*
@@ -53975,12 +66944,12 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
char *zType = 0;
int iCol = -1, i;
if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit;
- if( pTab->hasPrimKey ){
+ if( pTab->tabFlags & TF_HasPrimaryKey ){
sqlite3ErrorMsg(pParse,
"table \"%s\" has more than one primary key", pTab->zName);
goto primary_key_exit;
}
- pTab->hasPrimKey = 1;
+ pTab->tabFlags |= TF_HasPrimaryKey;
if( pList==0 ){
iCol = pTab->nCol - 1;
pTab->aCol[iCol].isPrimKey = 1;
@@ -54003,20 +66972,25 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey(
if( zType && sqlite3StrICmp(zType, "INTEGER")==0
&& sortOrder==SQLITE_SO_ASC ){
pTab->iPKey = iCol;
- pTab->keyConf = onError;
- pTab->autoInc = autoInc;
+ pTab->keyConf = (u8)onError;
+ assert( autoInc==0 || autoInc==1 );
+ pTab->tabFlags |= autoInc*TF_Autoincrement;
}else if( autoInc ){
#ifndef SQLITE_OMIT_AUTOINCREMENT
sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an "
"INTEGER PRIMARY KEY");
#endif
}else{
- sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
+ Index *p;
+ p = sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
+ if( p ){
+ p->autoIndex = 2;
+ }
pList = 0;
}
primary_key_exit:
- sqlite3ExprListDelete(pList);
+ sqlite3ExprListDelete(pParse->db, pList);
return;
}
@@ -54027,18 +67001,16 @@ SQLITE_PRIVATE void sqlite3AddCheckConstraint(
Parse *pParse, /* Parsing context */
Expr *pCheckExpr /* The check expression */
){
+ sqlite3 *db = pParse->db;
#ifndef SQLITE_OMIT_CHECK
Table *pTab = pParse->pNewTable;
- sqlite3 *db = pParse->db;
if( pTab && !IN_DECLARE_VTAB ){
- /* The CHECK expression must be duplicated so that tokens refer
- ** to malloced space and not the (ephemeral) text of the CREATE TABLE
- ** statement */
- pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck,
- sqlite3ExprDup(db, pCheckExpr));
- }
+ pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, pCheckExpr);
+ }else
#endif
- sqlite3ExprDelete(pCheckExpr);
+ {
+ sqlite3ExprDelete(db, pCheckExpr);
+ }
}
/*
@@ -54049,14 +67021,15 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
Table *p;
int i;
char *zColl; /* Dequoted name of collation sequence */
+ sqlite3 *db;
if( (p = pParse->pNewTable)==0 ) return;
i = p->nCol-1;
-
- zColl = sqlite3NameFromToken(pParse->db, pToken);
+ db = pParse->db;
+ zColl = sqlite3NameFromToken(db, pToken);
if( !zColl ) return;
- if( sqlite3LocateCollSeq(pParse, zColl, -1) ){
+ if( sqlite3LocateCollSeq(pParse, zColl) ){
Index *pIdx;
p->aCol[i].zColl = zColl;
@@ -54071,7 +67044,7 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
}
}
}else{
- sqlite3_free(zColl);
+ sqlite3DbFree(db, zColl);
}
}
@@ -54092,22 +67065,20 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
** This routine is a wrapper around sqlite3FindCollSeq(). This routine
** invokes the collation factory if the named collation cannot be found
** and generates an error message.
+**
+** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq()
*/
-SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName){
+SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){
sqlite3 *db = pParse->db;
u8 enc = ENC(db);
u8 initbusy = db->init.busy;
CollSeq *pColl;
- pColl = sqlite3FindCollSeq(db, enc, zName, nName, initbusy);
+ pColl = sqlite3FindCollSeq(db, enc, zName, initbusy);
if( !initbusy && (!pColl || !pColl->xCmp) ){
- pColl = sqlite3GetCollSeq(db, pColl, zName, nName);
+ pColl = sqlite3GetCollSeq(db, enc, pColl, zName);
if( !pColl ){
- if( nName<0 ){
- nName = strlen(zName);
- }
- sqlite3ErrorMsg(pParse, "no such collation sequence: %.*s", nName, zName);
- pColl = 0;
+ sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
}
}
@@ -54136,7 +67107,7 @@ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){
sqlite3 *db = pParse->db;
Vdbe *v = pParse->pVdbe;
sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, 0, r1);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1);
sqlite3ReleaseTempReg(pParse, r1);
}
@@ -54157,18 +67128,31 @@ static int identLength(const char *z){
}
/*
-** Write an identifier onto the end of the given string. Add
-** quote characters as needed.
+** The first parameter is a pointer to an output buffer. The second
+** parameter is a pointer to an integer that contains the offset at
+** which to write into the output buffer. This function copies the
+** nul-terminated string pointed to by the third parameter, zSignedIdent,
+** to the specified offset in the buffer and updates *pIdx to refer
+** to the first byte after the last byte written before returning.
+**
+** If the string zSignedIdent consists entirely of alpha-numeric
+** characters, does not begin with a digit and is not an SQL keyword,
+** then it is copied to the output buffer exactly as it is. Otherwise,
+** it is quoted using double-quotes.
*/
static void identPut(char *z, int *pIdx, char *zSignedIdent){
unsigned char *zIdent = (unsigned char*)zSignedIdent;
int i, j, needQuote;
i = *pIdx;
+
for(j=0; zIdent[j]; j++){
- if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
+ if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
+ }
+ needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j)!=TK_ID;
+ if( !needQuote ){
+ needQuote = zIdent[j];
}
- needQuote = zIdent[j]!=0 || isdigit(zIdent[0])
- || sqlite3KeywordCode(zIdent, j)!=TK_ID;
+
if( needQuote ) z[i++] = '"';
for(j=0; zIdent[j]; j++){
z[i++] = zIdent[j];
@@ -54184,21 +67168,17 @@ static void identPut(char *z, int *pIdx, char *zSignedIdent){
** table. Memory to hold the text of the statement is obtained
** from sqliteMalloc() and must be freed by the calling function.
*/
-static char *createTableStmt(sqlite3 *db, Table *p, int isTemp){
+static char *createTableStmt(sqlite3 *db, Table *p){
int i, k, n;
char *zStmt;
- char *zSep, *zSep2, *zEnd, *z;
+ char *zSep, *zSep2, *zEnd;
Column *pCol;
n = 0;
for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
- n += identLength(pCol->zName);
- z = pCol->zType;
- if( z ){
- n += (strlen(z) + 1);
- }
+ n += identLength(pCol->zName) + 5;
}
n += identLength(p->zName);
- if( n<50 ){
+ if( n<50 ){
zSep = "";
zSep2 = ",";
zEnd = ")";
@@ -54208,27 +67188,45 @@ static char *createTableStmt(sqlite3 *db, Table *p, int isTemp){
zEnd = "\n)";
}
n += 35 + 6*p->nCol;
- zStmt = sqlite3_malloc( n );
+ zStmt = sqlite3Malloc( n );
if( zStmt==0 ){
db->mallocFailed = 1;
return 0;
}
- sqlite3_snprintf(n, zStmt,
- !OMIT_TEMPDB&&isTemp ? "CREATE TEMP TABLE ":"CREATE TABLE ");
- k = strlen(zStmt);
+ sqlite3_snprintf(n, zStmt, "CREATE TABLE ");
+ k = sqlite3Strlen30(zStmt);
identPut(zStmt, &k, p->zName);
zStmt[k++] = '(';
for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
+ static const char * const azType[] = {
+ /* SQLITE_AFF_TEXT */ " TEXT",
+ /* SQLITE_AFF_NONE */ "",
+ /* SQLITE_AFF_NUMERIC */ " NUM",
+ /* SQLITE_AFF_INTEGER */ " INT",
+ /* SQLITE_AFF_REAL */ " REAL"
+ };
+ int len;
+ const char *zType;
+
sqlite3_snprintf(n-k, &zStmt[k], zSep);
- k += strlen(&zStmt[k]);
+ k += sqlite3Strlen30(&zStmt[k]);
zSep = zSep2;
identPut(zStmt, &k, pCol->zName);
- if( (z = pCol->zType)!=0 ){
- zStmt[k++] = ' ';
- assert( strlen(z)+k+1<=n );
- sqlite3_snprintf(n-k, &zStmt[k], "%s", z);
- k += strlen(z);
- }
+ assert( pCol->affinity-SQLITE_AFF_TEXT >= 0 );
+ assert( pCol->affinity-SQLITE_AFF_TEXT < sizeof(azType)/sizeof(azType[0]) );
+ testcase( pCol->affinity==SQLITE_AFF_TEXT );
+ testcase( pCol->affinity==SQLITE_AFF_NONE );
+ testcase( pCol->affinity==SQLITE_AFF_NUMERIC );
+ testcase( pCol->affinity==SQLITE_AFF_INTEGER );
+ testcase( pCol->affinity==SQLITE_AFF_REAL );
+
+ zType = azType[pCol->affinity - SQLITE_AFF_TEXT];
+ len = sqlite3Strlen30(zType);
+ assert( pCol->affinity==SQLITE_AFF_NONE
+ || pCol->affinity==sqlite3AffinityType(zType) );
+ memcpy(&zStmt[k], zType, len);
+ k += len;
+ assert( k<=n );
}
sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd);
return zStmt;
@@ -54264,7 +67262,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
sqlite3 *db = pParse->db;
int iDb;
- if( (pEnd==0 && pSelect==0) || pParse->nErr || db->mallocFailed ) {
+ if( (pEnd==0 && pSelect==0) || db->mallocFailed ){
return;
}
p = pParse->pNewTable;
@@ -54290,7 +67288,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
sNC.pParse = pParse;
sNC.pSrcList = &sSrc;
sNC.isCheck = 1;
- if( sqlite3ExprResolveNames(&sNC, p->pCheck) ){
+ if( sqlite3ResolveExprNames(&sNC, p->pCheck) ){
return;
}
}
@@ -54307,8 +67305,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
}
/* If not initializing, then create a record for the new table
- ** in the SQLITE_MASTER table of the database. The record number
- ** for the new table entry should already be on the stack.
+ ** in the SQLITE_MASTER table of the database.
**
** If this is a TEMPORARY table, write the entry into the auxiliary
** file instead of into the main database file.
@@ -54321,13 +67318,12 @@ SQLITE_PRIVATE void sqlite3EndTable(
char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */
v = sqlite3GetVdbe(pParse);
- if( v==0 ) return;
+ if( NEVER(v==0) ) return;
sqlite3VdbeAddOp1(v, OP_Close, 0);
- /* Create the rootpage for the new table and push it onto the stack.
- ** A view has no rootpage, so just push a zero onto the stack for
- ** views. Initialize zType at the same time.
+ /*
+ ** Initialize zType for the new view or table.
*/
if( p->pSelect==0 ){
/* A regular table */
@@ -54343,7 +67339,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
/* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
** statement to populate the new table. The root-page number for the
- ** new table is on the top of the vdbe stack.
+ ** new table is in register pParse->regRoot.
**
** Once the SELECT has been coded by sqlite3Select(), it is in a
** suitable state to query for the column names and types to be used
@@ -54358,14 +67354,15 @@ SQLITE_PRIVATE void sqlite3EndTable(
SelectDest dest;
Table *pSelTab;
+ assert(pParse->nTab==1);
sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
sqlite3VdbeChangeP5(v, 1);
pParse->nTab = 2;
sqlite3SelectDestInit(&dest, SRT_Table, 1);
- sqlite3Select(pParse, pSelect, &dest, 0, 0, 0, 0);
+ sqlite3Select(pParse, pSelect, &dest);
sqlite3VdbeAddOp1(v, OP_Close, 1);
if( pParse->nErr==0 ){
- pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSelect);
+ pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
if( pSelTab==0 ) return;
assert( p->aCol==0 );
p->nCol = pSelTab->nCol;
@@ -54378,9 +67375,9 @@ SQLITE_PRIVATE void sqlite3EndTable(
/* Compute the complete text of the CREATE statement */
if( pSelect ){
- zStmt = createTableStmt(db, p, p->pSchema==db->aDb[1].pSchema);
+ zStmt = createTableStmt(db, p);
}else{
- n = pEnd->z - pParse->sNameToken.z + 1;
+ n = (int)(pEnd->z - pParse->sNameToken.z) + 1;
zStmt = sqlite3MPrintf(db,
"CREATE %s %.*s", zType2, n, pParse->sNameToken.z
);
@@ -54388,9 +67385,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
/* A slot for the record has already been allocated in the
** SQLITE_MASTER table. We just need to update that slot with all
- ** the information we've collected. The rowid for the preallocated
- ** slot is the 2nd item on the stack. The top of the stack is the
- ** root page for the new table (or a 0 if this is a view).
+ ** the information we've collected.
*/
sqlite3NestedParse(pParse,
"UPDATE %Q.%s "
@@ -54404,14 +67399,14 @@ SQLITE_PRIVATE void sqlite3EndTable(
zStmt,
pParse->regRowid
);
- sqlite3_free(zStmt);
+ sqlite3DbFree(db, zStmt);
sqlite3ChangeCookie(pParse, iDb);
#ifndef SQLITE_OMIT_AUTOINCREMENT
/* Check to see if we need to create an sqlite_sequence table for
** keeping track of autoincrement keys.
*/
- if( p->autoInc ){
+ if( p->tabFlags & TF_Autoincrement ){
Db *pDb = &db->aDb[iDb];
if( pDb->pSchema->pSeqTab==0 ){
sqlite3NestedParse(pParse,
@@ -54430,27 +67425,16 @@ SQLITE_PRIVATE void sqlite3EndTable(
/* Add the table to the in-memory representation of the database.
*/
- if( db->init.busy && pParse->nErr==0 ){
+ if( db->init.busy ){
Table *pOld;
- FKey *pFKey;
Schema *pSchema = p->pSchema;
- pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, strlen(p->zName)+1,p);
+ pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName,
+ sqlite3Strlen30(p->zName),p);
if( pOld ){
assert( p==pOld ); /* Malloc must have failed inside HashInsert() */
db->mallocFailed = 1;
return;
}
-#ifndef SQLITE_OMIT_FOREIGN_KEY
- for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){
- void *data;
- int nTo = strlen(pFKey->zTo) + 1;
- pFKey->pNextTo = sqlite3HashFind(&pSchema->aFKey, pFKey->zTo, nTo);
- data = sqlite3HashInsert(&pSchema->aFKey, pFKey->zTo, nTo, pFKey);
- if( data==(void *)pFKey ){
- db->mallocFailed = 1;
- }
- }
-#endif
pParse->pNewTable = 0;
db->nTable++;
db->flags |= SQLITE_InternChanges;
@@ -54463,7 +67447,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
if( pCons->z==0 ){
pCons = pEnd;
}
- nName = (const char *)pCons->z - zName;
+ nName = (int)((const char *)pCons->z - zName);
p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName);
}
#endif
@@ -54485,7 +67469,7 @@ SQLITE_PRIVATE void sqlite3CreateView(
){
Table *p;
int n;
- const unsigned char *z;
+ const char *z;
Token sEnd;
DbFixer sFix;
Token *pName;
@@ -54494,21 +67478,23 @@ SQLITE_PRIVATE void sqlite3CreateView(
if( pParse->nVar>0 ){
sqlite3ErrorMsg(pParse, "parameters are not allowed in views");
- sqlite3SelectDelete(pSelect);
+ sqlite3SelectDelete(db, pSelect);
return;
}
sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr);
p = pParse->pNewTable;
- if( p==0 || pParse->nErr ){
- sqlite3SelectDelete(pSelect);
+ if( p==0 ){
+ sqlite3SelectDelete(db, pSelect);
return;
}
+ assert( pParse->nErr==0 ); /* If sqlite3StartTable return non-NULL then
+ ** there could not have been an error */
sqlite3TwoPartName(pParse, pName1, pName2, &pName);
iDb = sqlite3SchemaToIndex(db, p->pSchema);
if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName)
&& sqlite3FixSelect(&sFix, pSelect)
){
- sqlite3SelectDelete(pSelect);
+ sqlite3SelectDelete(db, pSelect);
return;
}
@@ -54517,8 +67503,8 @@ SQLITE_PRIVATE void sqlite3CreateView(
** allocated rather than point to the input string - which means that
** they will persist after the current sqlite3_exec() call returns.
*/
- p->pSelect = sqlite3SelectDup(db, pSelect);
- sqlite3SelectDelete(pSelect);
+ p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ sqlite3SelectDelete(db, pSelect);
if( db->mallocFailed ){
return;
}
@@ -54530,13 +67516,13 @@ SQLITE_PRIVATE void sqlite3CreateView(
** the end.
*/
sEnd = pParse->sLastToken;
- if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){
+ if( ALWAYS(sEnd.z[0]!=0) && sEnd.z[0]!=';' ){
sEnd.z += sEnd.n;
}
sEnd.n = 0;
- n = sEnd.z - pBegin->z;
- z = (const unsigned char*)pBegin->z;
- while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; }
+ n = (int)(sEnd.z - pBegin->z);
+ z = pBegin->z;
+ while( ALWAYS(n>0) && sqlite3Isspace(z[n-1]) ){ n--; }
sEnd.z = &z[n-1];
sEnd.n = 1;
@@ -54582,8 +67568,13 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
** CREATE VIEW one AS SELECT * FROM two;
** CREATE VIEW two AS SELECT * FROM one;
**
- ** Actually, this error is caught previously and so the following test
- ** should always fail. But we will leave it in place just to be safe.
+ ** Actually, the error above is now caught prior to reaching this point.
+ ** But the following test is still important as it does come up
+ ** in the following:
+ **
+ ** CREATE TABLE main.ex1(a);
+ ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1;
+ ** SELECT * FROM temp.ex1;
*/
if( pTable->nCol<0 ){
sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
@@ -54599,19 +67590,22 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
** statement that defines the view.
*/
assert( pTable->pSelect );
- pSel = sqlite3SelectDup(db, pTable->pSelect);
+ pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
if( pSel ){
+ u8 enableLookaside = db->lookaside.bEnabled;
n = pParse->nTab;
sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
pTable->nCol = -1;
+ db->lookaside.bEnabled = 0;
#ifndef SQLITE_OMIT_AUTHORIZATION
xAuth = db->xAuth;
db->xAuth = 0;
- pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSel);
+ pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
db->xAuth = xAuth;
#else
- pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSel);
+ pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
#endif
+ db->lookaside.bEnabled = enableLookaside;
pParse->nTab = n;
if( pSelTab ){
assert( pTable->aCol==0 );
@@ -54625,7 +67619,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
pTable->nCol = 0;
nErr++;
}
- sqlite3SelectDelete(pSel);
+ sqlite3SelectDelete(db, pSel);
} else {
nErr++;
}
@@ -54702,14 +67696,16 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){
Vdbe *v = sqlite3GetVdbe(pParse);
int r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb);
+ sqlite3MayAbort(pParse);
#ifndef SQLITE_OMIT_AUTOVACUUM
/* OP_Destroy stores an in integer r1. If this integer
** is non-zero, then it is the root page number of a table moved to
** location iTable. The following code modifies the sqlite_master table to
** reflect this.
**
- ** The "#%d" in the SQL is a special constant that means whatever value
- ** is on the top of the stack. See sqlite3RegisterExpr().
+ ** The "#NNN" in the SQL is a special constant that means whatever value
+ ** is in register NNN. See grammar rules associated with the TK_REGISTER
+ ** token for additional information.
*/
sqlite3NestedParse(pParse,
"UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d",
@@ -54787,9 +67783,10 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
sqlite3 *db = pParse->db;
int iDb;
- if( pParse->nErr || db->mallocFailed ){
+ if( db->mallocFailed ){
goto exit_drop_table;
}
+ assert( pParse->nErr==0 );
assert( pName->nSrc==1 );
pTab = sqlite3LocateTable(pParse, isView,
pName->a[0].zName, pName->a[0].zDatabase);
@@ -54827,7 +67824,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
#ifndef SQLITE_OMIT_VIRTUALTABLE
}else if( IsVirtual(pTab) ){
code = SQLITE_DROP_VTABLE;
- zArg2 = pTab->pMod->zName;
+ zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName;
#endif
}else{
if( !OMIT_TEMPDB && iDb==1 ){
@@ -54844,7 +67841,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
}
}
#endif
- if( pTab->readOnly || pTab==db->aDb[iDb].pSchema->pSeqTab ){
+ if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
goto exit_drop_table;
}
@@ -54874,18 +67871,16 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
#ifndef SQLITE_OMIT_VIRTUALTABLE
if( IsVirtual(pTab) ){
- Vdbe *v = sqlite3GetVdbe(pParse);
- if( v ){
- sqlite3VdbeAddOp0(v, OP_VBegin);
- }
+ sqlite3VdbeAddOp0(v, OP_VBegin);
}
#endif
+ sqlite3FkDropTable(pParse, pName, pTab);
/* Drop all triggers associated with the table being dropped. Code
** is generated to remove entries from sqlite_master and/or
** sqlite_temp_master if required.
*/
- pTrigger = pTab->pTrigger;
+ pTrigger = sqlite3TriggerList(pParse, pTab);
while( pTrigger ){
assert( pTrigger->pSchema==pTab->pSchema ||
pTrigger->pSchema==db->aDb[1].pSchema );
@@ -54899,7 +67894,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
** at the btree level, in case the sqlite_sequence table needs to
** move as a result of the drop (can happen in auto-vacuum mode).
*/
- if( pTab->autoInc ){
+ if( pTab->tabFlags & TF_Autoincrement ){
sqlite3NestedParse(pParse,
"DELETE FROM %s.sqlite_sequence WHERE name=%Q",
pDb->zName, pTab->zName
@@ -54941,7 +67936,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView,
sqliteViewResetAll(db, iDb);
exit_drop_table:
- sqlite3SrcListDelete(pName);
+ sqlite3SrcListDelete(db, pName);
}
/*
@@ -54955,9 +67950,7 @@ exit_drop_table:
** in the ON DELETE, ON UPDATE and ON INSERT clauses.
**
** An FKey structure is created and added to the table currently
-** under construction in the pParse->pNewTable field. The new FKey
-** is not linked into db->aFKey at this point - that does not happen
-** until sqlite3EndTable().
+** under construction in the pParse->pNewTable field.
**
** The foreign key is set for IMMEDIATE processing. A subsequent call
** to sqlite3DeferForeignKey() might change this to DEFERRED.
@@ -54969,8 +67962,10 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
ExprList *pToCol, /* Columns in the other table */
int flags /* Conflict resolution algorithms. */
){
+ sqlite3 *db = pParse->db;
#ifndef SQLITE_OMIT_FOREIGN_KEY
FKey *pFKey = 0;
+ FKey *pNextTo;
Table *p = pParse->pNewTable;
int nByte;
int i;
@@ -54978,10 +67973,10 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
char *z;
assert( pTo!=0 );
- if( p==0 || pParse->nErr || IN_DECLARE_VTAB ) goto fk_end;
+ if( p==0 || IN_DECLARE_VTAB ) goto fk_end;
if( pFromCol==0 ){
int iCol = p->nCol-1;
- if( iCol<0 ) goto fk_end;
+ if( NEVER(iCol<0) ) goto fk_end;
if( pToCol && pToCol->nExpr!=1 ){
sqlite3ErrorMsg(pParse, "foreign key on %s"
" should reference only one column of table %T",
@@ -54997,26 +67992,24 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
}else{
nCol = pFromCol->nExpr;
}
- nByte = sizeof(*pFKey) + nCol*sizeof(pFKey->aCol[0]) + pTo->n + 1;
+ nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1;
if( pToCol ){
for(i=0; i<pToCol->nExpr; i++){
- nByte += strlen(pToCol->a[i].zName) + 1;
+ nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1;
}
}
- pFKey = sqlite3DbMallocZero(pParse->db, nByte );
+ pFKey = sqlite3DbMallocZero(db, nByte );
if( pFKey==0 ){
goto fk_end;
}
pFKey->pFrom = p;
pFKey->pNextFrom = p->pFKey;
- z = (char*)&pFKey[1];
- pFKey->aCol = (struct sColMap*)z;
- z += sizeof(struct sColMap)*nCol;
+ z = (char*)&pFKey->aCol[nCol];
pFKey->zTo = z;
memcpy(z, pTo->z, pTo->n);
z[pTo->n] = 0;
+ sqlite3Dequote(z);
z += pTo->n+1;
- pFKey->pNextTo = 0;
pFKey->nCol = nCol;
if( pFromCol==0 ){
pFKey->aCol[0].iFrom = p->nCol-1;
@@ -55039,7 +68032,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
}
if( pToCol ){
for(i=0; i<nCol; i++){
- int n = strlen(pToCol->a[i].zName);
+ int n = sqlite3Strlen30(pToCol->a[i].zName);
pFKey->aCol[i].zCol = z;
memcpy(z, pToCol->a[i].zName, n);
z[n] = 0;
@@ -55047,9 +68040,21 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
}
}
pFKey->isDeferred = 0;
- pFKey->deleteConf = flags & 0xff;
- pFKey->updateConf = (flags >> 8 ) & 0xff;
- pFKey->insertConf = (flags >> 16 ) & 0xff;
+ pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */
+ pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */
+
+ pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash,
+ pFKey->zTo, sqlite3Strlen30(pFKey->zTo), (void *)pFKey
+ );
+ if( pNextTo==pFKey ){
+ db->mallocFailed = 1;
+ goto fk_end;
+ }
+ if( pNextTo ){
+ assert( pNextTo->pPrevTo==0 );
+ pFKey->pNextTo = pNextTo;
+ pNextTo->pPrevTo = pFKey;
+ }
/* Link the foreign key to the table as the last step.
*/
@@ -55057,10 +68062,10 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey(
pFKey = 0;
fk_end:
- sqlite3_free(pFKey);
+ sqlite3DbFree(db, pFKey);
#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
- sqlite3ExprListDelete(pFromCol);
- sqlite3ExprListDelete(pToCol);
+ sqlite3ExprListDelete(db, pFromCol);
+ sqlite3ExprListDelete(db, pToCol);
}
/*
@@ -55075,7 +68080,8 @@ SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
Table *pTab;
FKey *pFKey;
if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
- pFKey->isDeferred = isDeferred;
+ assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
+ pFKey->isDeferred = (u8)isDeferred;
#endif
}
@@ -55092,8 +68098,8 @@ SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
*/
static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
Table *pTab = pIndex->pTable; /* The table that is indexed */
- int iTab = pParse->nTab; /* Btree cursor used for pTab */
- int iIdx = pParse->nTab+1; /* Btree cursor used for pIndex */
+ int iTab = pParse->nTab++; /* Btree cursor used for pTab */
+ int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
int addr1; /* Address of top of loop */
int tnum; /* Root page of index */
Vdbe *v; /* Generate code into this virtual machine */
@@ -55132,19 +68138,25 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
regRecord = sqlite3GetTempReg(pParse);
regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
if( pIndex->onError!=OE_None ){
- int j1, j2;
- int regRowid;
-
- regRowid = regIdxKey + pIndex->nColumn;
- j1 = sqlite3VdbeAddOp3(v, OP_IsNull, regIdxKey, 0, pIndex->nColumn);
- j2 = sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx,
- 0, regRowid, (char*)regRecord, P4_INT32);
- sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, OE_Abort, 0,
- "indexed columns are not unique", P4_STATIC);
- sqlite3VdbeJumpHere(v, j1);
- sqlite3VdbeJumpHere(v, j2);
+ const int regRowid = regIdxKey + pIndex->nColumn;
+ const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
+ void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
+
+ /* The registers accessed by the OP_IsUnique opcode were allocated
+ ** using sqlite3GetTempRange() inside of the sqlite3GenerateIndexKey()
+ ** call above. Just before that function was freed they were released
+ ** (made available to the compiler for reuse) using
+ ** sqlite3ReleaseTempRange(). So in some ways having the OP_IsUnique
+ ** opcode use the values stored within seems dangerous. However, since
+ ** we can be sure that no other temp registers have been allocated
+ ** since sqlite3ReleaseTempRange() was called, it is safe to do so.
+ */
+ sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx, j2, regRowid, pRegKey, P4_INT32);
+ sqlite3HaltConstraint(
+ pParse, OE_Abort, "indexed columns are not unique", P4_STATIC);
}
sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord);
+ sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
sqlite3ReleaseTempReg(pParse, regRecord);
sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
sqlite3VdbeJumpHere(v, addr1);
@@ -55163,8 +68175,12 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
** pList is a list of columns to be indexed. pList will be NULL if this
** is a primary key or unique-constraint on the most recent column added
** to the table currently under construction.
+**
+** If the index is created successfully, return a pointer to the new Index
+** structure. This is used by sqlite3AddPrimaryKey() to mark the index
+** as the tables primary key (Index.autoIndex==2).
*/
-SQLITE_PRIVATE void sqlite3CreateIndex(
+SQLITE_PRIVATE Index *sqlite3CreateIndex(
Parse *pParse, /* All information about this parse */
Token *pName1, /* First part of index name. May be NULL */
Token *pName2, /* Second part of index name. May be NULL */
@@ -55176,6 +68192,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
int sortOrder, /* Sort order of primary key when pList==NULL */
int ifNotExist /* Omit error if index already exists */
){
+ Index *pRet = 0; /* Pointer to return */
Table *pTab = 0; /* Table to be indexed */
Index *pIndex = 0; /* The index to be created */
char *zName = 0; /* Name of the index */
@@ -55193,7 +68210,12 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
int nExtra = 0;
char *zExtra;
- if( pParse->nErr || db->mallocFailed || IN_DECLARE_VTAB ){
+ assert( pStart==0 || pEnd!=0 ); /* pEnd must be non-NULL if pStart is */
+ assert( pParse->nErr==0 ); /* Never called with prior errors */
+ if( db->mallocFailed || IN_DECLARE_VTAB ){
+ goto exit_create_index;
+ }
+ if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
goto exit_create_index;
}
@@ -55217,7 +68239,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
*/
if( !db->init.busy ){
pTab = sqlite3SrcListLookup(pParse, pTblName);
- if( pName2 && pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
+ if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
iDb = 1;
}
}
@@ -55232,7 +68254,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
pTab = sqlite3LocateTable(pParse, 0, pTblName->a[0].zName,
pTblName->a[0].zDatabase);
- if( !pTab ) goto exit_create_index;
+ if( !pTab || db->mallocFailed ) goto exit_create_index;
assert( db->aDb[iDb].pSchema==pTab->pSchema );
}else{
assert( pName==0 );
@@ -55242,8 +68264,10 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
}
pDb = &db->aDb[iDb];
- if( pTab==0 || pParse->nErr ) goto exit_create_index;
- if( pTab->readOnly ){
+ assert( pTab!=0 );
+ assert( pParse->nErr==0 );
+ if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
+ && memcmp(&pTab->zName[7],"altertab_",9)!=0 ){
sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
goto exit_create_index;
}
@@ -55275,13 +68299,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
*/
if( pName ){
zName = sqlite3NameFromToken(db, pName);
- if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index;
if( zName==0 ) goto exit_create_index;
if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
goto exit_create_index;
}
if( !db->init.busy ){
- if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index;
if( sqlite3FindTable(db, zName, 0)!=0 ){
sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
goto exit_create_index;
@@ -55294,15 +68316,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
goto exit_create_index;
}
}else{
- char zBuf[30];
int n;
Index *pLoop;
for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
- sqlite3_snprintf(sizeof(zBuf),zBuf,"_%d",n);
- zName = 0;
- sqlite3SetString(&zName, "sqlite_autoindex_", pTab->zName, zBuf, (char*)0);
+ zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n);
if( zName==0 ){
- db->mallocFailed = 1;
goto exit_create_index;
}
}
@@ -55328,11 +68346,12 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** So create a fake list to simulate this.
*/
if( pList==0 ){
- nullId.z = (u8*)pTab->aCol[pTab->nCol-1].zName;
- nullId.n = strlen((char*)nullId.z);
- pList = sqlite3ExprListAppend(pParse, 0, 0, &nullId);
+ nullId.z = pTab->aCol[pTab->nCol-1].zName;
+ nullId.n = sqlite3Strlen30((char*)nullId.z);
+ pList = sqlite3ExprListAppend(pParse, 0, 0);
if( pList==0 ) goto exit_create_index;
- pList->a[0].sortOrder = sortOrder;
+ sqlite3ExprListSetName(pParse, pList, &nullId, 0);
+ pList->a[0].sortOrder = (u8)sortOrder;
}
/* Figure out how many bytes of space are required to store explicitly
@@ -55341,14 +68360,19 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
for(i=0; i<pList->nExpr; i++){
Expr *pExpr = pList->a[i].pExpr;
if( pExpr ){
- nExtra += (1 + strlen(pExpr->pColl->zName));
+ CollSeq *pColl = pExpr->pColl;
+ /* Either pColl!=0 or there was an OOM failure. But if an OOM
+ ** failure we have quit before reaching this point. */
+ if( ALWAYS(pColl) ){
+ nExtra += (1 + sqlite3Strlen30(pColl->zName));
+ }
}
}
/*
** Allocate the index structure.
*/
- nName = strlen(zName);
+ nName = sqlite3Strlen30(zName);
nCol = pList->nExpr;
pIndex = sqlite3DbMallocZero(db,
sizeof(Index) + /* Index structure */
@@ -55371,8 +68395,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
memcpy(pIndex->zName, zName, nName+1);
pIndex->pTable = pTab;
pIndex->nColumn = pList->nExpr;
- pIndex->onError = onError;
- pIndex->autoIndex = pName==0;
+ pIndex->onError = (u8)onError;
+ pIndex->autoIndex = (u8)(pName==0);
pIndex->pSchema = db->aDb[iDb].pSchema;
/* Check to see if we should honor DESC requests on index columns
@@ -55386,6 +68410,12 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
/* Scan the names of the columns of the table to be indexed and
** load the column indices into the Index structure. Report an error
** if any column is not found.
+ **
+ ** TODO: Add a test to make sure that the same column is not named
+ ** more than once within the same index. Only the first instance of
+ ** the column will ever be used by the optimizer. Note that using the
+ ** same column more than once cannot be an error because that would
+ ** break backwards compatibility - it needs to be a warning.
*/
for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
const char *zColName = pListItem->zName;
@@ -55401,30 +68431,33 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
pTab->zName, zColName);
goto exit_create_index;
}
- /* TODO: Add a test to make sure that the same column is not named
- ** more than once within the same index. Only the first instance of
- ** the column will ever be used by the optimizer. Note that using the
- ** same column more than once cannot be an error because that would
- ** break backwards compatibility - it needs to be a warning.
- */
pIndex->aiColumn[i] = j;
- if( pListItem->pExpr ){
- assert( pListItem->pExpr->pColl );
+ /* Justification of the ALWAYS(pListItem->pExpr->pColl): Because of
+ ** the way the "idxlist" non-terminal is constructed by the parser,
+ ** if pListItem->pExpr is not null then either pListItem->pExpr->pColl
+ ** must exist or else there must have been an OOM error. But if there
+ ** was an OOM error, we would never reach this point. */
+ if( pListItem->pExpr && ALWAYS(pListItem->pExpr->pColl) ){
+ int nColl;
+ zColl = pListItem->pExpr->pColl->zName;
+ nColl = sqlite3Strlen30(zColl) + 1;
+ assert( nExtra>=nColl );
+ memcpy(zExtra, zColl, nColl);
zColl = zExtra;
- sqlite3_snprintf(nExtra, zExtra, "%s", pListItem->pExpr->pColl->zName);
- zExtra += (strlen(zColl) + 1);
+ zExtra += nColl;
+ nExtra -= nColl;
}else{
zColl = pTab->aCol[j].zColl;
if( !zColl ){
zColl = db->pDfltColl->zName;
}
}
- if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl, -1) ){
+ if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){
goto exit_create_index;
}
pIndex->azColl[i] = zColl;
requestedSortOrder = pListItem->sortOrder & sortOrderMask;
- pIndex->aSortOrder[i] = requestedSortOrder;
+ pIndex->aSortOrder[i] = (u8)requestedSortOrder;
}
sqlite3DefaultRowEst(pIndex);
@@ -55441,6 +68474,14 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** so, don't bother creating this one. This only applies to
** automatically created indices. Users can do as they wish with
** explicit indices.
+ **
+ ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent
+ ** (and thus suppressing the second one) even if they have different
+ ** sort orders.
+ **
+ ** If there are different collating sequences or if the columns of
+ ** the constraint occur in different orders, then the constraints are
+ ** considered distinct and both result in separate indices.
*/
Index *pIdx;
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
@@ -55451,10 +68492,11 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
if( pIdx->nColumn!=pIndex->nColumn ) continue;
for(k=0; k<pIdx->nColumn; k++){
- const char *z1 = pIdx->azColl[k];
- const char *z2 = pIndex->azColl[k];
+ const char *z1;
+ const char *z2;
if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break;
- if( pIdx->aSortOrder[k]!=pIndex->aSortOrder[k] ) break;
+ z1 = pIdx->azColl[k];
+ z2 = pIndex->azColl[k];
if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break;
}
if( k==pIdx->nColumn ){
@@ -55485,7 +68527,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
if( db->init.busy ){
Index *p;
p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
- pIndex->zName, strlen(pIndex->zName)+1, pIndex);
+ pIndex->zName, sqlite3Strlen30(pIndex->zName),
+ pIndex);
if( p ){
assert( p==pIndex ); /* Malloc must have failed */
db->mallocFailed = 1;
@@ -55512,7 +68555,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
** has just been created, it contains no data and the index initialization
** step can be skipped.
*/
- else if( db->init.busy==0 ){
+ else{ /* if( db->init.busy==0 ) */
Vdbe *v;
char *zStmt;
int iMem = ++pParse->nMem;
@@ -55529,7 +68572,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
/* Gather the complete text of the CREATE INDEX statement into
** the zStmt variable
*/
- if( pStart && pEnd ){
+ if( pStart ){
+ assert( pEnd!=0 );
/* A named index with an explicit CREATE INDEX statement */
zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
onError==OE_None ? "" : " UNIQUE",
@@ -55551,7 +68595,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
iMem,
zStmt
);
- sqlite3_free(zStmt);
+ sqlite3DbFree(db, zStmt);
/* Fill the index with data and reparse the schema. Code an OP_Expire
** to invalidate all pre-compiled statements.
@@ -55567,8 +68611,9 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
/* When adding an index to the list of indices for a table, make
** sure all indices labeled OE_Replace come after all those labeled
- ** OE_Ignore. This is necessary for the correct operation of UPDATE
- ** and INSERT.
+ ** OE_Ignore. This is necessary for the correct constraint check
+ ** processing (in sqlite3GenerateConstraintChecks()) as part of
+ ** UPDATE and INSERT statements.
*/
if( db->init.busy || pTblName==0 ){
if( onError!=OE_Replace || pTab->pIndex==0
@@ -55583,40 +68628,20 @@ SQLITE_PRIVATE void sqlite3CreateIndex(
pIndex->pNext = pOther->pNext;
pOther->pNext = pIndex;
}
+ pRet = pIndex;
pIndex = 0;
}
/* Clean up before exiting */
exit_create_index:
if( pIndex ){
- freeIndex(pIndex);
- }
- sqlite3ExprListDelete(pList);
- sqlite3SrcListDelete(pTblName);
- sqlite3_free(zName);
- return;
-}
-
-/*
-** Generate code to make sure the file format number is at least minFormat.
-** The generated code will increase the file format number if necessary.
-*/
-SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){
- Vdbe *v;
- v = sqlite3GetVdbe(pParse);
- if( v ){
- int r1 = sqlite3GetTempReg(pParse);
- int r2 = sqlite3GetTempReg(pParse);
- int j1;
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, 1);
- sqlite3VdbeUsesBtree(v, iDb);
- sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2);
- j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, 1, r2);
- sqlite3VdbeJumpHere(v, j1);
- sqlite3ReleaseTempReg(pParse, r1);
- sqlite3ReleaseTempReg(pParse, r2);
+ sqlite3_free(pIndex->zColAff);
+ sqlite3DbFree(db, pIndex);
}
+ sqlite3ExprListDelete(db, pList);
+ sqlite3SrcListDelete(db, pTblName);
+ sqlite3DbFree(db, zName);
+ return pRet;
}
/*
@@ -55664,7 +68689,8 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists
sqlite3 *db = pParse->db;
int iDb;
- if( pParse->nErr || db->mallocFailed ){
+ assert( pParse->nErr==0 ); /* Never called with prior errors */
+ if( db->mallocFailed ){
goto exit_drop_index;
}
assert( pName->nSrc==1 );
@@ -55722,7 +68748,7 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists
}
exit_drop_index:
- sqlite3SrcListDelete(pName);
+ sqlite3SrcListDelete(db, pName);
}
/*
@@ -55759,7 +68785,7 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate(
*pIdx = -1;
return pArray;
}
- *pnAlloc = newSize;
+ *pnAlloc = sqlite3DbMallocSize(db, pNew)/szEntry;
pArray = pNew;
}
z = (char*)pArray;
@@ -55792,7 +68818,7 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pT
&i
);
if( i<0 ){
- sqlite3IdListDelete(pList);
+ sqlite3IdListDelete(db, pList);
return 0;
}
pList->a[i].zName = sqlite3NameFromToken(db, pToken);
@@ -55802,14 +68828,14 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pT
/*
** Delete an IdList.
*/
-SQLITE_PRIVATE void sqlite3IdListDelete(IdList *pList){
+SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
int i;
if( pList==0 ) return;
for(i=0; i<pList->nId; i++){
- sqlite3_free(pList->a[i].zName);
+ sqlite3DbFree(db, pList->a[i].zName);
}
- sqlite3_free(pList->a);
- sqlite3_free(pList);
+ sqlite3DbFree(db, pList->a);
+ sqlite3DbFree(db, pList);
}
/*
@@ -55826,10 +68852,80 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){
}
/*
+** Expand the space allocated for the given SrcList object by
+** creating nExtra new slots beginning at iStart. iStart is zero based.
+** New slots are zeroed.
+**
+** For example, suppose a SrcList initially contains two entries: A,B.
+** To append 3 new entries onto the end, do this:
+**
+** sqlite3SrcListEnlarge(db, pSrclist, 3, 2);
+**
+** After the call above it would contain: A, B, nil, nil, nil.
+** If the iStart argument had been 1 instead of 2, then the result
+** would have been: A, nil, nil, nil, B. To prepend the new slots,
+** the iStart value would be 0. The result then would
+** be: nil, nil, nil, A, B.
+**
+** If a memory allocation fails the SrcList is unchanged. The
+** db->mallocFailed flag will be set to true.
+*/
+SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(
+ sqlite3 *db, /* Database connection to notify of OOM errors */
+ SrcList *pSrc, /* The SrcList to be enlarged */
+ int nExtra, /* Number of new slots to add to pSrc->a[] */
+ int iStart /* Index in pSrc->a[] of first new slot */
+){
+ int i;
+
+ /* Sanity checking on calling parameters */
+ assert( iStart>=0 );
+ assert( nExtra>=1 );
+ assert( pSrc!=0 );
+ assert( iStart<=pSrc->nSrc );
+
+ /* Allocate additional space if needed */
+ if( pSrc->nSrc+nExtra>pSrc->nAlloc ){
+ SrcList *pNew;
+ int nAlloc = pSrc->nSrc+nExtra;
+ int nGot;
+ pNew = sqlite3DbRealloc(db, pSrc,
+ sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) );
+ if( pNew==0 ){
+ assert( db->mallocFailed );
+ return pSrc;
+ }
+ pSrc = pNew;
+ nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1;
+ pSrc->nAlloc = (u16)nGot;
+ }
+
+ /* Move existing slots that come after the newly inserted slots
+ ** out of the way */
+ for(i=pSrc->nSrc-1; i>=iStart; i--){
+ pSrc->a[i+nExtra] = pSrc->a[i];
+ }
+ pSrc->nSrc += (i16)nExtra;
+
+ /* Zero the newly allocated slots */
+ memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra);
+ for(i=iStart; i<iStart+nExtra; i++){
+ pSrc->a[i].iCursor = -1;
+ }
+
+ /* Return a pointer to the enlarged SrcList */
+ return pSrc;
+}
+
+
+/*
** Append a new table name to the given SrcList. Create a new SrcList if
-** need be. A new entry is created in the SrcList even if pToken is NULL.
+** need be. A new entry is created in the SrcList even if pTable is NULL.
**
-** A new SrcList is returned, or NULL if malloc() fails.
+** A SrcList is returned, or NULL if there is an OOM error. The returned
+** SrcList might be the same as the SrcList that was input or it might be
+** a new one. If an OOM error does occurs, then the prior value of pList
+** that is input to this routine is automatically freed.
**
** If pDatabase is not null, it means that the table has an optional
** database name prefix. Like this: "database.table". The pDatabase
@@ -55848,7 +68944,13 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){
**
** sqlite3SrcListAppend(D,A,B,C);
**
-** Then C is the table name and B is the database name.
+** Then C is the table name and B is the database name. If C is defined
+** then so is B. In other words, we never have a case where:
+**
+** sqlite3SrcListAppend(D,A,0,C);
+**
+** Both pTable and pDatabase are assumed to be quoted. They are dequoted
+** before being added to the SrcList.
*/
SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(
sqlite3 *db, /* Connection to notify of malloc failures */
@@ -55857,42 +68959,33 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(
Token *pDatabase /* Database of the table */
){
struct SrcList_item *pItem;
+ assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */
if( pList==0 ){
pList = sqlite3DbMallocZero(db, sizeof(SrcList) );
if( pList==0 ) return 0;
pList->nAlloc = 1;
}
- if( pList->nSrc>=pList->nAlloc ){
- SrcList *pNew;
- pList->nAlloc *= 2;
- pNew = sqlite3DbRealloc(db, pList,
- sizeof(*pList) + (pList->nAlloc-1)*sizeof(pList->a[0]) );
- if( pNew==0 ){
- sqlite3SrcListDelete(pList);
- return 0;
- }
- pList = pNew;
+ pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc);
+ if( db->mallocFailed ){
+ sqlite3SrcListDelete(db, pList);
+ return 0;
}
- pItem = &pList->a[pList->nSrc];
- memset(pItem, 0, sizeof(pList->a[0]));
+ pItem = &pList->a[pList->nSrc-1];
if( pDatabase && pDatabase->z==0 ){
pDatabase = 0;
}
- if( pDatabase && pTable ){
+ if( pDatabase ){
Token *pTemp = pDatabase;
pDatabase = pTable;
pTable = pTemp;
}
pItem->zName = sqlite3NameFromToken(db, pTable);
pItem->zDatabase = sqlite3NameFromToken(db, pDatabase);
- pItem->iCursor = -1;
- pItem->isPopulated = 0;
- pList->nSrc++;
return pList;
}
/*
-** Assign cursors to all tables in a SrcList
+** Assign VdbeCursor index numbers to all tables in a SrcList
*/
SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
int i;
@@ -55912,20 +69005,21 @@ SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
/*
** Delete an entire SrcList including all its substructure.
*/
-SQLITE_PRIVATE void sqlite3SrcListDelete(SrcList *pList){
+SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
int i;
struct SrcList_item *pItem;
if( pList==0 ) return;
for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
- sqlite3_free(pItem->zDatabase);
- sqlite3_free(pItem->zName);
- sqlite3_free(pItem->zAlias);
+ sqlite3DbFree(db, pItem->zDatabase);
+ sqlite3DbFree(db, pItem->zName);
+ sqlite3DbFree(db, pItem->zAlias);
+ sqlite3DbFree(db, pItem->zIndex);
sqlite3DeleteTable(pItem->pTab);
- sqlite3SelectDelete(pItem->pSelect);
- sqlite3ExprDelete(pItem->pOn);
- sqlite3IdListDelete(pItem->pUsing);
+ sqlite3SelectDelete(db, pItem->pSelect);
+ sqlite3ExprDelete(db, pItem->pOn);
+ sqlite3IdListDelete(db, pItem->pUsing);
}
- sqlite3_free(pList);
+ sqlite3DbFree(db, pList);
}
/*
@@ -55956,21 +69050,51 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
){
struct SrcList_item *pItem;
sqlite3 *db = pParse->db;
+ if( !p && (pOn || pUsing) ){
+ sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s",
+ (pOn ? "ON" : "USING")
+ );
+ goto append_from_error;
+ }
p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
- if( p==0 || p->nSrc==0 ){
- sqlite3ExprDelete(pOn);
- sqlite3IdListDelete(pUsing);
- sqlite3SelectDelete(pSubquery);
- return p;
+ if( p==0 || NEVER(p->nSrc==0) ){
+ goto append_from_error;
}
pItem = &p->a[p->nSrc-1];
- if( pAlias && pAlias->n ){
+ assert( pAlias!=0 );
+ if( pAlias->n ){
pItem->zAlias = sqlite3NameFromToken(db, pAlias);
}
pItem->pSelect = pSubquery;
pItem->pOn = pOn;
pItem->pUsing = pUsing;
return p;
+
+ append_from_error:
+ assert( p==0 );
+ sqlite3ExprDelete(db, pOn);
+ sqlite3IdListDelete(db, pUsing);
+ sqlite3SelectDelete(db, pSubquery);
+ return 0;
+}
+
+/*
+** Add an INDEXED BY or NOT INDEXED clause to the most recently added
+** element of the source-list passed as the second argument.
+*/
+SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
+ assert( pIndexedBy!=0 );
+ if( p && ALWAYS(p->nSrc>0) ){
+ struct SrcList_item *pItem = &p->a[p->nSrc-1];
+ assert( pItem->notIndexed==0 && pItem->zIndex==0 );
+ if( pIndexedBy->n==1 && !pIndexedBy->z ){
+ /* A "NOT INDEXED" clause was supplied. See parse.y
+ ** construct "indexed_opt" for details. */
+ pItem->notIndexed = 1;
+ }else{
+ pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy);
+ }
+ }
}
/*
@@ -56006,10 +69130,13 @@ SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){
Vdbe *v;
int i;
- if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || db->mallocFailed ) return;
- if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return;
-
+ assert( pParse!=0 );
+ db = pParse->db;
+ assert( db!=0 );
+/* if( db->aDb[0].pBt==0 ) return; */
+ if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){
+ return;
+ }
v = sqlite3GetVdbe(pParse);
if( !v ) return;
if( type!=TK_DEFERRED ){
@@ -56028,10 +69155,13 @@ SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){
sqlite3 *db;
Vdbe *v;
- if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || db->mallocFailed ) return;
- if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return;
-
+ assert( pParse!=0 );
+ db = pParse->db;
+ assert( db!=0 );
+/* if( db->aDb[0].pBt==0 ) return; */
+ if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
+ return;
+ }
v = sqlite3GetVdbe(pParse);
if( v ){
sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 0);
@@ -56045,10 +69175,13 @@ SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
sqlite3 *db;
Vdbe *v;
- if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
- if( pParse->nErr || db->mallocFailed ) return;
- if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return;
-
+ assert( pParse!=0 );
+ db = pParse->db;
+ assert( db!=0 );
+/* if( db->aDb[0].pBt==0 ) return; */
+ if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
+ return;
+ }
v = sqlite3GetVdbe(pParse);
if( v ){
sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1);
@@ -56056,6 +69189,26 @@ SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
}
/*
+** This function is called by the parser when it parses a command to create,
+** release or rollback an SQL savepoint.
+*/
+SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
+ char *zName = sqlite3NameFromToken(pParse->db, pName);
+ if( zName ){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ static const char *az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
+ assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
+#endif
+ if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
+ sqlite3DbFree(pParse->db, zName);
+ return;
+ }
+ sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC);
+ }
+}
+
+/*
** Make sure the TEMP database is open and available for use. Return
** the number of errors. Leave any error messages in the pParse structure.
*/
@@ -56109,26 +69262,26 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){
** early in the code, before we know if any database tables will be used.
*/
SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
- sqlite3 *db;
- Vdbe *v;
- int mask;
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
- v = sqlite3GetVdbe(pParse);
- if( v==0 ) return; /* This only happens if there was a prior error */
- db = pParse->db;
- if( pParse->cookieGoto==0 ){
- pParse->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
+ if( pToplevel->cookieGoto==0 ){
+ Vdbe *v = sqlite3GetVdbe(pToplevel);
+ if( v==0 ) return; /* This only happens if there was a prior error */
+ pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
}
if( iDb>=0 ){
+ sqlite3 *db = pToplevel->db;
+ int mask;
+
assert( iDb<db->nDb );
assert( db->aDb[iDb].pBt!=0 || iDb==1 );
assert( iDb<SQLITE_MAX_ATTACHED+2 );
mask = 1<<iDb;
- if( (pParse->cookieMask & mask)==0 ){
- pParse->cookieMask |= mask;
- pParse->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
+ if( (pToplevel->cookieMask & mask)==0 ){
+ pToplevel->cookieMask |= mask;
+ pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
if( !OMIT_TEMPDB && iDb==1 ){
- sqlite3OpenTempDatabase(pParse);
+ sqlite3OpenTempDatabase(pToplevel);
}
}
}
@@ -56146,23 +69299,58 @@ SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
** rollback the whole transaction. For operations where all constraints
** can be checked before any changes are made to the database, it is never
** necessary to undo a write and the checkpoint should not be set.
-**
-** Only database iDb and the temp database are made writable by this call.
-** If iDb==0, then the main and temp databases are made writable. If
-** iDb==1 then only the temp database is made writable. If iDb>1 then the
-** specified auxiliary database and the temp database are made writable.
*/
SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
- Vdbe *v = sqlite3GetVdbe(pParse);
- if( v==0 ) return;
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
sqlite3CodeVerifySchema(pParse, iDb);
- pParse->writeMask |= 1<<iDb;
- if( setStatement && pParse->nested==0 ){
- sqlite3VdbeAddOp1(v, OP_Statement, iDb);
- }
- if( (OMIT_TEMPDB || iDb!=1) && pParse->db->aDb[1].pBt!=0 ){
- sqlite3BeginWriteOperation(pParse, setStatement, 1);
+ pToplevel->writeMask |= 1<<iDb;
+ pToplevel->isMultiWrite |= setStatement;
+}
+
+/*
+** Indicate that the statement currently under construction might write
+** more than one entry (example: deleting one row then inserting another,
+** inserting multiple rows in a table, or inserting a row and index entries.)
+** If an abort occurs after some of these writes have completed, then it will
+** be necessary to undo the completed writes.
+*/
+SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
+ pToplevel->isMultiWrite = 1;
+}
+
+/*
+** The code generator calls this routine if is discovers that it is
+** possible to abort a statement prior to completion. In order to
+** perform this abort without corrupting the database, we need to make
+** sure that the statement is protected by a statement transaction.
+**
+** Technically, we only need to set the mayAbort flag if the
+** isMultiWrite flag was previously set. There is a time dependency
+** such that the abort must occur after the multiwrite. This makes
+** some statements involving the REPLACE conflict resolution algorithm
+** go a little faster. But taking advantage of this time dependency
+** makes it more difficult to prove that the code is correct (in
+** particular, it prevents us from writing an effective
+** implementation of sqlite3AssertMayAbort()) and so we have chosen
+** to take the safe route and skip the optimization.
+*/
+SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
+ pToplevel->mayAbort = 1;
+}
+
+/*
+** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT
+** error. The onError parameter determines which (if any) of the statement
+** and/or current transaction is rolled back.
+*/
+SQLITE_PRIVATE void sqlite3HaltConstraint(Parse *pParse, int onError, char *p4, int p4type){
+ Vdbe *v = sqlite3GetVdbe(pParse);
+ if( onError==OE_Abort ){
+ sqlite3MayAbort(pParse);
}
+ sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0, p4, p4type);
}
/*
@@ -56172,9 +69360,11 @@ SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement,
#ifndef SQLITE_OMIT_REINDEX
static int collationMatch(const char *zColl, Index *pIndex){
int i;
+ assert( zColl!=0 );
for(i=0; i<pIndex->nColumn; i++){
const char *z = pIndex->azColl[i];
- if( z==zColl || (z && zColl && 0==sqlite3StrICmp(z, zColl)) ){
+ assert( z!=0 );
+ if( 0==sqlite3StrICmp(z, zColl) ){
return 1;
}
}
@@ -56253,23 +69443,21 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
return;
}
- if( pName1==0 || pName1->z==0 ){
+ if( pName1==0 ){
reindexDatabases(pParse, 0);
return;
- }else if( pName2==0 || pName2->z==0 ){
+ }else if( NEVER(pName2==0) || pName2->z==0 ){
char *zColl;
assert( pName1->z );
zColl = sqlite3NameFromToken(pParse->db, pName1);
if( !zColl ) return;
- pColl = sqlite3FindCollSeq(db, ENC(db), zColl, -1, 0);
+ pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
if( pColl ){
- if( zColl ){
- reindexDatabases(pParse, zColl);
- sqlite3_free(zColl);
- }
+ reindexDatabases(pParse, zColl);
+ sqlite3DbFree(db, zColl);
return;
}
- sqlite3_free(zColl);
+ sqlite3DbFree(db, zColl);
}
iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
if( iDb<0 ) return;
@@ -56279,11 +69467,11 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
pTab = sqlite3FindTable(db, z, zDb);
if( pTab ){
reindexTable(pParse, pTab, 0);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
return;
}
pIndex = sqlite3FindIndex(db, z, zDb);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
if( pIndex ){
sqlite3BeginWriteOperation(pParse, 0, iDb);
sqlite3RefillIndex(pParse, pIndex, -1);
@@ -56298,7 +69486,7 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
** with OP_OpenRead or OP_OpenWrite to access database index pIdx.
**
** If successful, a pointer to the new structure is returned. In this case
-** the caller is responsible for calling sqlite3_free() on the returned
+** the caller is responsible for calling sqlite3DbFree(db, ) on the returned
** pointer. If an error occurs (out of memory or missing collation
** sequence), NULL is returned and the state of pParse updated to reflect
** the error.
@@ -56307,7 +69495,8 @@ SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
int i;
int nCol = pIdx->nColumn;
int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol;
- KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(pParse->db, nBytes);
+ sqlite3 *db = pParse->db;
+ KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(db, nBytes);
if( pKey ){
pKey->db = pParse->db;
@@ -56316,14 +69505,14 @@ SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
for(i=0; i<nCol; i++){
char *zColl = pIdx->azColl[i];
assert( zColl );
- pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl, -1);
+ pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl);
pKey->aSortOrder[i] = pIdx->aSortOrder[i];
}
- pKey->nField = nCol;
+ pKey->nField = (u16)nCol;
}
if( pParse->nErr ){
- sqlite3_free(pKey);
+ sqlite3DbFree(db, pKey);
pKey = 0;
}
return pKey;
@@ -56346,29 +69535,27 @@ SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
** This file contains functions used to access the internal hash tables
** of user defined functions and collation sequences.
**
-** $Id: callback.c,v 1.23 2007/08/29 12:31:26 danielk1977 Exp $
+** $Id: callback.c,v 1.42 2009/06/17 00:35:31 drh Exp $
*/
/*
** Invoke the 'collation needed' callback to request a collation sequence
-** in the database text encoding of name zName, length nName.
-** If the collation sequence
+** in the encoding enc of name zName, length nName.
*/
-static void callCollNeeded(sqlite3 *db, const char *zName, int nName){
+static void callCollNeeded(sqlite3 *db, int enc, const char *zName){
assert( !db->xCollNeeded || !db->xCollNeeded16 );
- if( nName<0 ) nName = strlen(zName);
if( db->xCollNeeded ){
- char *zExternal = sqlite3DbStrNDup(db, zName, nName);
+ char *zExternal = sqlite3DbStrDup(db, zName);
if( !zExternal ) return;
- db->xCollNeeded(db->pCollNeededArg, db, (int)ENC(db), zExternal);
- sqlite3_free(zExternal);
+ db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal);
+ sqlite3DbFree(db, zExternal);
}
#ifndef SQLITE_OMIT_UTF16
if( db->xCollNeeded16 ){
char const *zExternal;
sqlite3_value *pTmp = sqlite3ValueNew(db);
- sqlite3ValueSetStr(pTmp, nName, zName, SQLITE_UTF8, SQLITE_STATIC);
+ sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC);
zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE);
if( zExternal ){
db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal);
@@ -56388,11 +69575,10 @@ static void callCollNeeded(sqlite3 *db, const char *zName, int nName){
static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
CollSeq *pColl2;
char *z = pColl->zName;
- int n = strlen(z);
int i;
static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 };
for(i=0; i<3; i++){
- pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, n, 0);
+ pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0);
if( pColl2->xCmp!=0 ){
memcpy(pColl, pColl2, sizeof(CollSeq));
pColl->xDel = 0; /* Do not copy the destructor */
@@ -56405,8 +69591,7 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
/*
** This function is responsible for invoking the collation factory callback
** or substituting a collation sequence of a different encoding when the
-** requested collation sequence is not available in the database native
-** encoding.
+** requested collation sequence is not available in the desired encoding.
**
** If it is not NULL, then pColl must point to the database native encoding
** collation sequence with name zName, length nName.
@@ -56414,25 +69599,27 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
** The return value is either the collation sequence to be used in database
** db for collation type name zName, length nName, or NULL, if no collation
** sequence can be found.
+**
+** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq()
*/
SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(
- sqlite3* db,
- CollSeq *pColl,
- const char *zName,
- int nName
+ sqlite3* db, /* The database connection */
+ u8 enc, /* The desired encoding for the collating sequence */
+ CollSeq *pColl, /* Collating sequence with native encoding, or NULL */
+ const char *zName /* Collating sequence name */
){
CollSeq *p;
p = pColl;
if( !p ){
- p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0);
+ p = sqlite3FindCollSeq(db, enc, zName, 0);
}
if( !p || !p->xCmp ){
/* No collation sequence of this type for this encoding is registered.
** Call the collation factory to see if it can supply us with one.
*/
- callCollNeeded(db, zName, nName);
- p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0);
+ callCollNeeded(db, enc, zName);
+ p = sqlite3FindCollSeq(db, enc, zName, 0);
}
if( p && !p->xCmp && synthCollSeq(db, p) ){
p = 0;
@@ -56455,11 +69642,10 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(
SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){
if( pColl ){
const char *zName = pColl->zName;
- CollSeq *p = sqlite3GetCollSeq(pParse->db, pColl, zName, -1);
+ sqlite3 *db = pParse->db;
+ CollSeq *p = sqlite3GetCollSeq(db, ENC(db), pColl, zName);
if( !p ){
- if( pParse->nErr==0 ){
- sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
- }
+ sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
pParse->nErr++;
return SQLITE_ERROR;
}
@@ -56484,13 +69670,12 @@ SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){
** each collation sequence structure.
*/
static CollSeq *findCollSeqEntry(
- sqlite3 *db,
- const char *zName,
- int nName,
- int create
+ sqlite3 *db, /* Database connection */
+ const char *zName, /* Name of the collating sequence */
+ int create /* Create a new entry if true */
){
CollSeq *pColl;
- if( nName<0 ) nName = strlen(zName);
+ int nName = sqlite3Strlen30(zName);
pColl = sqlite3HashFind(&db->aCollSeq, zName, nName);
if( 0==pColl && create ){
@@ -56507,14 +69692,14 @@ static CollSeq *findCollSeqEntry(
pColl[0].zName[nName] = 0;
pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, nName, pColl);
- /* If a malloc() failure occured in sqlite3HashInsert(), it will
+ /* If a malloc() failure occurred in sqlite3HashInsert(), it will
** return the pColl pointer to be deleted (because it wasn't added
** to the hash table).
*/
assert( pDel==0 || pDel==pColl );
if( pDel!=0 ){
db->mallocFailed = 1;
- sqlite3_free(pDel);
+ sqlite3DbFree(db, pDel);
pColl = 0;
}
}
@@ -56534,17 +69719,18 @@ static CollSeq *findCollSeqEntry(
** this routine. sqlite3LocateCollSeq() invokes the collation factory
** if necessary and generates an error message if the collating sequence
** cannot be found.
+**
+** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq()
*/
SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(
sqlite3 *db,
u8 enc,
const char *zName,
- int nName,
int create
){
CollSeq *pColl;
if( zName ){
- pColl = findCollSeqEntry(db, zName, nName, create);
+ pColl = findCollSeqEntry(db, zName, create);
}else{
pColl = db->pDfltColl;
}
@@ -56554,6 +69740,91 @@ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(
return pColl;
}
+/* During the search for the best function definition, this procedure
+** is called to test how well the function passed as the first argument
+** matches the request for a function with nArg arguments in a system
+** that uses encoding enc. The value returned indicates how well the
+** request is matched. A higher value indicates a better match.
+**
+** The returned value is always between 0 and 6, as follows:
+**
+** 0: Not a match, or if nArg<0 and the function is has no implementation.
+** 1: A variable arguments function that prefers UTF-8 when a UTF-16
+** encoding is requested, or vice versa.
+** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is
+** requested, or vice versa.
+** 3: A variable arguments function using the same text encoding.
+** 4: A function with the exact number of arguments requested that
+** prefers UTF-8 when a UTF-16 encoding is requested, or vice versa.
+** 5: A function with the exact number of arguments requested that
+** prefers UTF-16LE when UTF-16BE is requested, or vice versa.
+** 6: An exact match.
+**
+*/
+static int matchQuality(FuncDef *p, int nArg, u8 enc){
+ int match = 0;
+ if( p->nArg==-1 || p->nArg==nArg
+ || (nArg==-1 && (p->xFunc!=0 || p->xStep!=0))
+ ){
+ match = 1;
+ if( p->nArg==nArg || nArg==-1 ){
+ match = 4;
+ }
+ if( enc==p->iPrefEnc ){
+ match += 2;
+ }
+ else if( (enc==SQLITE_UTF16LE && p->iPrefEnc==SQLITE_UTF16BE) ||
+ (enc==SQLITE_UTF16BE && p->iPrefEnc==SQLITE_UTF16LE) ){
+ match += 1;
+ }
+ }
+ return match;
+}
+
+/*
+** Search a FuncDefHash for a function with the given name. Return
+** a pointer to the matching FuncDef if found, or 0 if there is no match.
+*/
+static FuncDef *functionSearch(
+ FuncDefHash *pHash, /* Hash table to search */
+ int h, /* Hash of the name */
+ const char *zFunc, /* Name of function */
+ int nFunc /* Number of bytes in zFunc */
+){
+ FuncDef *p;
+ for(p=pHash->a[h]; p; p=p->pHash){
+ if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 && p->zName[nFunc]==0 ){
+ return p;
+ }
+ }
+ return 0;
+}
+
+/*
+** Insert a new FuncDef into a FuncDefHash hash table.
+*/
+SQLITE_PRIVATE void sqlite3FuncDefInsert(
+ FuncDefHash *pHash, /* The hash table into which to insert */
+ FuncDef *pDef /* The function definition to insert */
+){
+ FuncDef *pOther;
+ int nName = sqlite3Strlen30(pDef->zName);
+ u8 c1 = (u8)pDef->zName[0];
+ int h = (sqlite3UpperToLower[c1] + nName) % ArraySize(pHash->a);
+ pOther = functionSearch(pHash, h, pDef->zName, nName);
+ if( pOther ){
+ assert( pOther!=pDef && pOther->pNext!=pDef );
+ pDef->pNext = pOther->pNext;
+ pOther->pNext = pDef;
+ }else{
+ pDef->pNext = 0;
+ pDef->pHash = pHash->a[h];
+ pHash->a[h] = pDef;
+ }
+}
+
+
+
/*
** Locate a user function given a name, a number of arguments and a flag
** indicating whether the function prefers UTF-16 over UTF-8. Return a
@@ -56583,70 +69854,59 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
int createFlag /* Create new entry if true and does not otherwise exist */
){
FuncDef *p; /* Iterator variable */
- FuncDef *pFirst; /* First function with this name */
FuncDef *pBest = 0; /* Best match found so far */
- int bestmatch = 0;
+ int bestScore = 0; /* Score of best match */
+ int h; /* Hash value */
assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE );
- if( nArg<-1 ) nArg = -1;
+ h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a);
- pFirst = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName);
- for(p=pFirst; p; p=p->pNext){
- /* During the search for the best function definition, bestmatch is set
- ** as follows to indicate the quality of the match with the definition
- ** pointed to by pBest:
- **
- ** 0: pBest is NULL. No match has been found.
- ** 1: A variable arguments function that prefers UTF-8 when a UTF-16
- ** encoding is requested, or vice versa.
- ** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is
- ** requested, or vice versa.
- ** 3: A variable arguments function using the same text encoding.
- ** 4: A function with the exact number of arguments requested that
- ** prefers UTF-8 when a UTF-16 encoding is requested, or vice versa.
- ** 5: A function with the exact number of arguments requested that
- ** prefers UTF-16LE when UTF-16BE is requested, or vice versa.
- ** 6: An exact match.
- **
- ** A larger value of 'matchqual' indicates a more desirable match.
- */
- if( p->nArg==-1 || p->nArg==nArg || nArg==-1 ){
- int match = 1; /* Quality of this match */
- if( p->nArg==nArg || nArg==-1 ){
- match = 4;
- }
- if( enc==p->iPrefEnc ){
- match += 2;
- }
- else if( (enc==SQLITE_UTF16LE && p->iPrefEnc==SQLITE_UTF16BE) ||
- (enc==SQLITE_UTF16BE && p->iPrefEnc==SQLITE_UTF16LE) ){
- match += 1;
- }
+ /* First search for a match amongst the application-defined functions.
+ */
+ p = functionSearch(&db->aFunc, h, zName, nName);
+ while( p ){
+ int score = matchQuality(p, nArg, enc);
+ if( score>bestScore ){
+ pBest = p;
+ bestScore = score;
+ }
+ p = p->pNext;
+ }
- if( match>bestmatch ){
+ /* If no match is found, search the built-in functions.
+ **
+ ** Except, if createFlag is true, that means that we are trying to
+ ** install a new function. Whatever FuncDef structure is returned will
+ ** have fields overwritten with new information appropriate for the
+ ** new function. But the FuncDefs for built-in functions are read-only.
+ ** So we must not search for built-ins when creating a new function.
+ */
+ if( !createFlag && !pBest ){
+ FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
+ p = functionSearch(pHash, h, zName, nName);
+ while( p ){
+ int score = matchQuality(p, nArg, enc);
+ if( score>bestScore ){
pBest = p;
- bestmatch = match;
+ bestScore = score;
}
+ p = p->pNext;
}
}
- /* If the createFlag parameter is true, and the seach did not reveal an
+ /* If the createFlag parameter is true and the search did not reveal an
** exact match for the name, number of arguments and encoding, then add a
** new entry to the hash table and return it.
*/
- if( createFlag && bestmatch<6 &&
- (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName))!=0 ){
- pBest->nArg = nArg;
- pBest->pNext = pFirst;
+ if( createFlag && (bestScore<6 || pBest->nArg!=nArg) &&
+ (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
+ pBest->zName = (char *)&pBest[1];
+ pBest->nArg = (u16)nArg;
pBest->iPrefEnc = enc;
memcpy(pBest->zName, zName, nName);
pBest->zName[nName] = 0;
- if( pBest==sqlite3HashInsert(&db->aFunc,pBest->zName,nName,(void*)pBest) ){
- db->mallocFailed = 1;
- sqlite3_free(pBest);
- return 0;
- }
+ sqlite3FuncDefInsert(&db->aFunc, pBest);
}
if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){
@@ -56657,9 +69917,11 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
/*
** Free all resources held by the schema structure. The void* argument points
-** at a Schema struct. This function does not call sqlite3_free() on the
+** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the
** pointer itself, it just cleans up subsiduary resources (i.e. the contents
** of the schema hash tables).
+**
+** The Schema.cache_size variable is not cleared.
*/
SQLITE_PRIVATE void sqlite3SchemaFree(void *p){
Hash temp1;
@@ -56669,19 +69931,20 @@ SQLITE_PRIVATE void sqlite3SchemaFree(void *p){
temp1 = pSchema->tblHash;
temp2 = pSchema->trigHash;
- sqlite3HashInit(&pSchema->trigHash, SQLITE_HASH_STRING, 0);
- sqlite3HashClear(&pSchema->aFKey);
+ sqlite3HashInit(&pSchema->trigHash);
sqlite3HashClear(&pSchema->idxHash);
for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
- sqlite3DeleteTrigger((Trigger*)sqliteHashData(pElem));
+ sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem));
}
sqlite3HashClear(&temp2);
- sqlite3HashInit(&pSchema->tblHash, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&pSchema->tblHash);
for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
Table *pTab = sqliteHashData(pElem);
+ assert( pTab->dbMem==0 );
sqlite3DeleteTable(pTab);
}
sqlite3HashClear(&temp1);
+ sqlite3HashClear(&pSchema->fkeyHash);
pSchema->pSeqTab = 0;
pSchema->flags &= ~DB_SchemaLoaded;
}
@@ -56700,10 +69963,10 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
if( !p ){
db->mallocFailed = 1;
}else if ( 0==p->file_format ){
- sqlite3HashInit(&p->tblHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&p->idxHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&p->trigHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&p->aFKey, SQLITE_HASH_STRING, 1);
+ sqlite3HashInit(&p->tblHash);
+ sqlite3HashInit(&p->idxHash);
+ sqlite3HashInit(&p->trigHash);
+ sqlite3HashInit(&p->fkeyHash);
p->enc = SQLITE_UTF8;
}
return p;
@@ -56725,7 +69988,7 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
** This file contains C code routines that are called by the parser
** in order to generate code for DELETE FROM statements.
**
-** $Id: delete.c,v 1.169 2008/04/28 18:46:43 drh Exp $
+** $Id: delete.c,v 1.207 2009/08/08 18:01:08 drh Exp $
*/
/*
@@ -56734,16 +69997,17 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
** are found, return a pointer to the last table.
*/
SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
- Table *pTab = 0;
- int i;
- struct SrcList_item *pItem;
- for(i=0, pItem=pSrc->a; i<pSrc->nSrc; i++, pItem++){
- pTab = sqlite3LocateTable(pParse, 0, pItem->zName, pItem->zDatabase);
- sqlite3DeleteTable(pItem->pTab);
- pItem->pTab = pTab;
- if( pTab ){
- pTab->nRef++;
- }
+ struct SrcList_item *pItem = pSrc->a;
+ Table *pTab;
+ assert( pItem && pSrc->nSrc==1 );
+ pTab = sqlite3LocateTable(pParse, 0, pItem->zName, pItem->zDatabase);
+ sqlite3DeleteTable(pItem->pTab);
+ pItem->pTab = pTab;
+ if( pTab ){
+ pTab->nRef++;
+ }
+ if( sqlite3IndexedByLookup(pParse, pItem) ){
+ pTab = 0;
}
return pTab;
}
@@ -56754,15 +70018,26 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
** writable return 0;
*/
SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
- if( (pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0
- && pParse->nested==0)
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- || (pTab->pMod && pTab->pMod->pModule->xUpdate==0)
-#endif
+ /* A table is not writable under the following circumstances:
+ **
+ ** 1) It is a virtual table and no implementation of the xUpdate method
+ ** has been provided, or
+ ** 2) It is a system table (i.e. sqlite_master), this call is not
+ ** part of a nested parse and writable_schema pragma has not
+ ** been specified.
+ **
+ ** In either case leave an error message in pParse and return non-zero.
+ */
+ if( ( IsVirtual(pTab)
+ && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 )
+ || ( (pTab->tabFlags & TF_Readonly)!=0
+ && (pParse->db->flags & SQLITE_WriteSchema)==0
+ && pParse->nested==0 )
){
sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName);
return 1;
}
+
#ifndef SQLITE_OMIT_VIEW
if( !viewOk && pTab->pSelect ){
sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName);
@@ -56772,26 +70047,6 @@ SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
return 0;
}
-/*
-** Generate code that will open a table for reading.
-*/
-SQLITE_PRIVATE void sqlite3OpenTable(
- Parse *p, /* Generate code into this VDBE */
- int iCur, /* The cursor number of the table */
- int iDb, /* The database index in sqlite3.aDb[] */
- Table *pTab, /* The table to be opened */
- int opcode /* OP_OpenRead or OP_OpenWrite */
-){
- Vdbe *v;
- if( IsVirtual(pTab) ) return;
- v = sqlite3GetVdbe(p);
- assert( opcode==OP_OpenWrite || opcode==OP_OpenRead );
- sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite), pTab->zName);
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol);
- sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb);
- VdbeComment((v, "%s", pTab->zName));
-}
-
#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
/*
@@ -56801,7 +70056,7 @@ SQLITE_PRIVATE void sqlite3OpenTable(
*/
SQLITE_PRIVATE void sqlite3MaterializeView(
Parse *pParse, /* Parsing context */
- Select *pView, /* View definition */
+ Table *pView, /* View definition */
Expr *pWhere, /* Optional WHERE clause to be added */
int iCur /* Cursor number for ephemerial table */
){
@@ -56809,20 +70064,122 @@ SQLITE_PRIVATE void sqlite3MaterializeView(
Select *pDup;
sqlite3 *db = pParse->db;
- pDup = sqlite3SelectDup(db, pView);
+ pDup = sqlite3SelectDup(db, pView->pSelect, 0);
if( pWhere ){
SrcList *pFrom;
- pWhere = sqlite3ExprDup(db, pWhere);
- pFrom = sqlite3SrcListAppendFromTerm(pParse, 0, 0, 0, 0, pDup, 0, 0);
+ pWhere = sqlite3ExprDup(db, pWhere, 0);
+ pFrom = sqlite3SrcListAppend(db, 0, 0, 0);
+ if( pFrom ){
+ assert( pFrom->nSrc==1 );
+ pFrom->a[0].zAlias = sqlite3DbStrDup(db, pView->zName);
+ pFrom->a[0].pSelect = pDup;
+ assert( pFrom->a[0].pOn==0 );
+ assert( pFrom->a[0].pUsing==0 );
+ }else{
+ sqlite3SelectDelete(db, pDup);
+ }
pDup = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0);
}
sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur);
- sqlite3Select(pParse, pDup, &dest, 0, 0, 0, 0);
- sqlite3SelectDelete(pDup);
+ sqlite3Select(pParse, pDup, &dest);
+ sqlite3SelectDelete(db, pDup);
}
#endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */
+#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
+/*
+** Generate an expression tree to implement the WHERE, ORDER BY,
+** and LIMIT/OFFSET portion of DELETE and UPDATE statements.
+**
+** DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1;
+** \__________________________/
+** pLimitWhere (pInClause)
+*/
+SQLITE_PRIVATE Expr *sqlite3LimitWhere(
+ Parse *pParse, /* The parser context */
+ SrcList *pSrc, /* the FROM clause -- which tables to scan */
+ Expr *pWhere, /* The WHERE clause. May be null */
+ ExprList *pOrderBy, /* The ORDER BY clause. May be null */
+ Expr *pLimit, /* The LIMIT clause. May be null */
+ Expr *pOffset, /* The OFFSET clause. May be null */
+ char *zStmtType /* Either DELETE or UPDATE. For error messages. */
+){
+ Expr *pWhereRowid = NULL; /* WHERE rowid .. */
+ Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */
+ Expr *pSelectRowid = NULL; /* SELECT rowid ... */
+ ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */
+ SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */
+ Select *pSelect = NULL; /* Complete SELECT tree */
+
+ /* Check that there isn't an ORDER BY without a LIMIT clause.
+ */
+ if( pOrderBy && (pLimit == 0) ) {
+ sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType);
+ pParse->parseError = 1;
+ goto limit_where_cleanup_2;
+ }
+
+ /* We only need to generate a select expression if there
+ ** is a limit/offset term to enforce.
+ */
+ if( pLimit == 0 ) {
+ /* if pLimit is null, pOffset will always be null as well. */
+ assert( pOffset == 0 );
+ return pWhere;
+ }
+
+ /* Generate a select expression tree to enforce the limit/offset
+ ** term for the DELETE or UPDATE statement. For example:
+ ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
+ ** becomes:
+ ** DELETE FROM table_a WHERE rowid IN (
+ ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
+ ** );
+ */
+
+ pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
+ if( pSelectRowid == 0 ) goto limit_where_cleanup_2;
+ pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid);
+ if( pEList == 0 ) goto limit_where_cleanup_2;
+
+ /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree
+ ** and the SELECT subtree. */
+ pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
+ if( pSelectSrc == 0 ) {
+ sqlite3ExprListDelete(pParse->db, pEList);
+ goto limit_where_cleanup_2;
+ }
+
+ /* generate the SELECT expression tree. */
+ pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0,
+ pOrderBy,0,pLimit,pOffset);
+ if( pSelect == 0 ) return 0;
+
+ /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */
+ pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
+ if( pWhereRowid == 0 ) goto limit_where_cleanup_1;
+ pInClause = sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0);
+ if( pInClause == 0 ) goto limit_where_cleanup_1;
+
+ pInClause->x.pSelect = pSelect;
+ pInClause->flags |= EP_xIsSelect;
+ sqlite3ExprSetHeight(pParse, pInClause);
+ return pInClause;
+
+ /* something went wrong. clean up anything allocated. */
+limit_where_cleanup_1:
+ sqlite3SelectDelete(pParse->db, pSelect);
+ return 0;
+
+limit_where_cleanup_2:
+ sqlite3ExprDelete(pParse->db, pWhere);
+ sqlite3ExprListDelete(pParse->db, pOrderBy);
+ sqlite3ExprDelete(pParse->db, pLimit);
+ sqlite3ExprDelete(pParse->db, pOffset);
+ return 0;
+}
+#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */
/*
** Generate code for a DELETE FROM statement.
@@ -56846,22 +70203,17 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
int iCur; /* VDBE Cursor number for pTab */
sqlite3 *db; /* Main database structure */
AuthContext sContext; /* Authorization context */
- int oldIdx = -1; /* Cursor for the OLD table of AFTER triggers */
NameContext sNC; /* Name context to resolve expressions in */
int iDb; /* Database number */
- int memCnt = 0; /* Memory cell used for change counting */
+ int memCnt = -1; /* Memory cell used for change counting */
+ int rcauth; /* Value returned by authorization callback */
#ifndef SQLITE_OMIT_TRIGGER
int isView; /* True if attempting to delete from a view */
- int triggers_exist = 0; /* True if any triggers exist */
+ Trigger *pTrigger; /* List of table triggers, if required */
#endif
- int iBeginAfterTrigger; /* Address of after trigger program */
- int iEndAfterTrigger; /* Exit of after trigger program */
- int iBeginBeforeTrigger; /* Address of before trigger program */
- int iEndBeforeTrigger; /* Exit of before trigger program */
- u32 old_col_mask = 0; /* Mask of OLD.* columns in use */
- sContext.pParse = 0;
+ memset(&sContext, 0, sizeof(sContext));
db = pParse->db;
if( pParse->nErr || db->mallocFailed ){
goto delete_from_cleanup;
@@ -56880,10 +70232,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
** deleted from is a view
*/
#ifndef SQLITE_OMIT_TRIGGER
- triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0);
+ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
isView = pTab->pSelect!=0;
#else
-# define triggers_exist 0
+# define pTrigger 0
# define isView 0
#endif
#ifdef SQLITE_OMIT_VIEW
@@ -56891,27 +70243,24 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
# define isView 0
#endif
- if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){
- goto delete_from_cleanup;
- }
- iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
- assert( iDb<db->nDb );
- zDb = db->aDb[iDb].zName;
- if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
- goto delete_from_cleanup;
- }
-
/* If pTab is really a view, make sure it has been initialized.
*/
if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto delete_from_cleanup;
}
- /* Allocate a cursor used to store the old.* data for a trigger.
- */
- if( triggers_exist ){
- oldIdx = pParse->nTab++;
+ if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){
+ goto delete_from_cleanup;
+ }
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ assert( iDb<db->nDb );
+ zDb = db->aDb[iDb].zName;
+ rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb);
+ assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE );
+ if( rcauth==SQLITE_DENY ){
+ goto delete_from_cleanup;
}
+ assert(!isView || pTrigger);
/* Assign cursor number to the table and all its indices.
*/
@@ -56934,39 +70283,23 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
goto delete_from_cleanup;
}
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, triggers_exist, iDb);
-
- if( triggers_exist ){
- int orconf = ((pParse->trigStack)?pParse->trigStack->orconf:OE_Default);
- int iGoto = sqlite3VdbeAddOp0(v, OP_Goto);
- addr = sqlite3VdbeMakeLabel(v);
-
- iBeginBeforeTrigger = sqlite3VdbeCurrentAddr(v);
- (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_BEFORE, pTab,
- -1, oldIdx, orconf, addr, &old_col_mask, 0);
- iEndBeforeTrigger = sqlite3VdbeAddOp0(v, OP_Goto);
-
- iBeginAfterTrigger = sqlite3VdbeCurrentAddr(v);
- (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_AFTER, pTab, -1,
- oldIdx, orconf, addr, &old_col_mask, 0);
- iEndAfterTrigger = sqlite3VdbeAddOp0(v, OP_Goto);
-
- sqlite3VdbeJumpHere(v, iGoto);
- }
+ sqlite3BeginWriteOperation(pParse, 1, iDb);
/* If we are trying to delete from a view, realize that view into
** a ephemeral table.
*/
+#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab->pSelect, pWhere, iCur);
+ sqlite3MaterializeView(pParse, pTab, pWhere, iCur);
}
+#endif
/* Resolve the column names in the WHERE clause.
*/
memset(&sNC, 0, sizeof(sNC));
sNC.pParse = pParse;
sNC.pSrcList = pTabList;
- if( sqlite3ExprResolveNames(&sNC, pWhere) ){
+ if( sqlite3ResolveExprNames(&sNC, pWhere) ){
goto delete_from_cleanup;
}
@@ -56978,135 +70311,78 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt);
}
+#ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
/* Special case: A DELETE without a WHERE clause deletes everything.
- ** It is easier just to erase the whole table. Note, however, that
- ** this means that the row change count will be incorrect.
- */
- if( pWhere==0 && !triggers_exist && !IsVirtual(pTab) ){
- if( db->flags & SQLITE_CountRows ){
- /* If counting rows deleted, just count the total number of
- ** entries in the table. */
- int addr2;
- if( !isView ){
- sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead);
- }
- sqlite3VdbeAddOp2(v, OP_Rewind, iCur, sqlite3VdbeCurrentAddr(v)+2);
- addr2 = sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
- sqlite3VdbeAddOp2(v, OP_Next, iCur, addr2);
- sqlite3VdbeAddOp1(v, OP_Close, iCur);
- }
- if( !isView ){
- sqlite3VdbeAddOp2(v, OP_Clear, pTab->tnum, iDb);
- if( !pParse->nested ){
- sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC);
- }
- for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
- assert( pIdx->pSchema==pTab->pSchema );
- sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
- }
+ ** It is easier just to erase the whole table. Prior to version 3.6.5,
+ ** this optimization caused the row change count (the value returned by
+ ** API function sqlite3_count_changes) to be set incorrectly. */
+ if( rcauth==SQLITE_OK && pWhere==0 && !pTrigger && !IsVirtual(pTab)
+ && 0==sqlite3FkRequired(pParse, pTab, 0, 0)
+ ){
+ assert( !isView );
+ sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt,
+ pTab->zName, P4_STATIC);
+ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ assert( pIdx->pSchema==pTab->pSchema );
+ sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
}
- }
+ }else
+#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
/* The usual case: There is a WHERE clause so we have to scan through
** the table and pick which records to delete.
*/
- else{
+ {
+ int iRowSet = ++pParse->nMem; /* Register for rowset of rows to delete */
int iRowid = ++pParse->nMem; /* Used for storing rowid values. */
+ int regRowid; /* Actual register containing rowids */
- /* Begin the database scan
+ /* Collect rowids of every row to be deleted.
*/
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0);
+ sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet);
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,WHERE_DUPLICATES_OK);
if( pWInfo==0 ) goto delete_from_cleanup;
-
- /* Remember the rowid of every item to be deleted.
- */
- sqlite3VdbeAddOp2(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, iRowid);
- sqlite3VdbeAddOp1(v, OP_FifoWrite, iRowid);
+ regRowid = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, iRowid, 0);
+ sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, regRowid);
if( db->flags & SQLITE_CountRows ){
sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
}
-
- /* End the database scan loop.
- */
sqlite3WhereEnd(pWInfo);
- /* Open the pseudo-table used to store OLD if there are triggers.
- */
- if( triggers_exist ){
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol);
- sqlite3VdbeAddOp1(v, OP_OpenPseudo, oldIdx);
- }
-
/* Delete every item whose key was written to the list during the
** database scan. We have to delete items after the scan is complete
- ** because deleting an item can change the scan order.
- */
+ ** because deleting an item can change the scan order. */
end = sqlite3VdbeMakeLabel(v);
+ /* Unless this is a view, open cursors for the table we are
+ ** deleting from and all its indices. If this is a view, then the
+ ** only effect this statement has is to fire the INSTEAD OF
+ ** triggers. */
if( !isView ){
- /* Open cursors for the table we are deleting from and
- ** all its indices.
- */
sqlite3OpenTableAndIndices(pParse, pTab, iCur, OP_OpenWrite);
}
- /* This is the beginning of the delete loop. If a trigger encounters
- ** an IGNORE constraint, it jumps back to here.
- */
- if( triggers_exist ){
- sqlite3VdbeResolveLabel(v, addr);
- }
- addr = sqlite3VdbeAddOp2(v, OP_FifoRead, iRowid, end);
-
- if( triggers_exist ){
- int iData = ++pParse->nMem; /* For storing row data of OLD table */
+ addr = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, end, iRowid);
- /* If the record is no longer present in the table, jump to the
- ** next iteration of the loop through the contents of the fifo.
- */
- sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, iRowid);
-
- /* Populate the OLD.* pseudo-table */
- if( old_col_mask ){
- sqlite3VdbeAddOp2(v, OP_RowData, iCur, iData);
- }else{
- sqlite3VdbeAddOp2(v, OP_Null, 0, iData);
- }
- sqlite3VdbeAddOp3(v, OP_Insert, oldIdx, iData, iRowid);
-
- /* Jump back and run the BEFORE triggers */
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginBeforeTrigger);
- sqlite3VdbeJumpHere(v, iEndBeforeTrigger);
- }
-
- if( !isView ){
- /* Delete the row */
+ /* Delete the row */
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( IsVirtual(pTab) ){
- const char *pVtab = (const char *)pTab->pVtab;
- sqlite3VtabMakeWritable(pParse, pTab);
- sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iRowid, pVtab, P4_VTAB);
- }else
+ if( IsVirtual(pTab) ){
+ const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
+ sqlite3VtabMakeWritable(pParse, pTab);
+ sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iRowid, pVTab, P4_VTAB);
+ sqlite3MayAbort(pParse);
+ }else
#endif
- {
- sqlite3GenerateRowDelete(pParse, pTab, iCur, iRowid, pParse->nested==0);
- }
- }
-
- /* If there are row triggers, close all cursors then invoke
- ** the AFTER triggers
- */
- if( triggers_exist ){
- /* Jump back and run the AFTER triggers */
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginAfterTrigger);
- sqlite3VdbeJumpHere(v, iEndAfterTrigger);
+ {
+ int count = (pParse->nested==0); /* True to count changes */
+ sqlite3GenerateRowDelete(pParse, pTab, iCur, iRowid, count, pTrigger, OE_Default);
}
/* End of the delete loop */
sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
sqlite3VdbeResolveLabel(v, end);
- /* Close the cursors after the loop if there are no row triggers */
- if( !isView && !IsVirtual(pTab) ){
+ /* Close the cursors open on the table and its indexes. */
+ if( !isView && !IsVirtual(pTab) ){
for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
sqlite3VdbeAddOp2(v, OP_Close, iCur + i, pIdx->tnum);
}
@@ -57114,23 +70390,39 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
}
}
- /*
- ** Return the number of rows that were deleted. If this routine is
+ /* Update the sqlite_sequence table by storing the content of the
+ ** maximum rowid counter values recorded while inserting into
+ ** autoincrement tables.
+ */
+ if( pParse->nested==0 && pParse->pTriggerTab==0 ){
+ sqlite3AutoincrementEnd(pParse);
+ }
+
+ /* Return the number of rows that were deleted. If this routine is
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){
+ if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1);
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
}
delete_from_cleanup:
sqlite3AuthContextPop(&sContext);
- sqlite3SrcListDelete(pTabList);
- sqlite3ExprDelete(pWhere);
+ sqlite3SrcListDelete(db, pTabList);
+ sqlite3ExprDelete(db, pWhere);
return;
}
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation). */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
/*
** This routine generates VDBE code that causes a single row of a
@@ -57140,7 +70432,7 @@ delete_from_cleanup:
** These are the requirements:
**
** 1. A read/write cursor pointing to pTab, the table containing the row
-** to be deleted, must be opened as cursor number "base".
+** to be deleted, must be opened as cursor number $iCur.
**
** 2. Read/write cursors for all indices of pTab must be open as
** cursor number base+i for the i-th index.
@@ -57148,28 +70440,97 @@ delete_from_cleanup:
** 3. The record number of the row to be deleted must be stored in
** memory cell iRowid.
**
-** This routine pops the top of the stack to remove the record number
-** and then generates code to remove both the table record and all index
-** entries that point to that record.
+** This routine generates code to remove both the table record and all
+** index entries that point to that record.
*/
SQLITE_PRIVATE void sqlite3GenerateRowDelete(
Parse *pParse, /* Parsing context */
Table *pTab, /* Table containing the row to be deleted */
int iCur, /* Cursor number for the table */
int iRowid, /* Memory cell that contains the rowid to delete */
- int count /* Increment the row change counter */
+ int count, /* If non-zero, increment the row change counter */
+ Trigger *pTrigger, /* List of triggers to (potentially) fire */
+ int onconf /* Default ON CONFLICT policy for triggers */
){
- int addr;
- Vdbe *v;
+ Vdbe *v = pParse->pVdbe; /* Vdbe */
+ int iOld = 0; /* First register in OLD.* array */
+ int iLabel; /* Label resolved to end of generated code */
- v = pParse->pVdbe;
- addr = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowid);
- sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0);
- sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0));
- if( count ){
- sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC);
+ /* Vdbe is guaranteed to have been allocated by this stage. */
+ assert( v );
+
+ /* Seek cursor iCur to the row to delete. If this row no longer exists
+ ** (this can happen if a trigger program has already deleted it), do
+ ** not attempt to delete it or fire any DELETE triggers. */
+ iLabel = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, iLabel, iRowid);
+
+ /* If there are any triggers to fire, allocate a range of registers to
+ ** use for the old.* references in the triggers. */
+ if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){
+ u32 mask; /* Mask of OLD.* columns in use */
+ int iCol; /* Iterator used while populating OLD.* */
+
+ /* TODO: Could use temporary registers here. Also could attempt to
+ ** avoid copying the contents of the rowid register. */
+ mask = sqlite3TriggerOldmask(pParse, pTrigger, 0, pTab, onconf);
+ mask |= sqlite3FkOldmask(pParse, pTab);
+ iOld = pParse->nMem+1;
+ pParse->nMem += (1 + pTab->nCol);
+
+ /* Populate the OLD.* pseudo-table register array. These values will be
+ ** used by any BEFORE and AFTER triggers that exist. */
+ sqlite3VdbeAddOp2(v, OP_Copy, iRowid, iOld);
+ for(iCol=0; iCol<pTab->nCol; iCol++){
+ if( mask==0xffffffff || mask&(1<<iCol) ){
+ int iTarget = iOld + iCol + 1;
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, iCol, iTarget);
+ sqlite3ColumnDefault(v, pTab, iCol, iTarget);
+ }
+ }
+
+ /* Invoke BEFORE DELETE trigger programs. */
+ sqlite3CodeRowTrigger(pParse, pTrigger,
+ TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel
+ );
+
+ /* Seek the cursor to the row to be deleted again. It may be that
+ ** the BEFORE triggers coded above have already removed the row
+ ** being deleted. Do not attempt to delete the row a second time, and
+ ** do not fire AFTER triggers. */
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, iLabel, iRowid);
+
+ /* Do FK processing. This call checks that any FK constraints that
+ ** refer to this table (i.e. constraints attached to other tables)
+ ** are not violated by deleting this row. */
+ sqlite3FkCheck(pParse, pTab, iOld, 0);
}
- sqlite3VdbeJumpHere(v, addr);
+
+ /* Delete the index and table entries. Skip this step if pTab is really
+ ** a view (in which case the only effect of the DELETE statement is to
+ ** fire the INSTEAD OF triggers). */
+ if( pTab->pSelect==0 ){
+ sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0);
+ sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0));
+ if( count ){
+ sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC);
+ }
+ }
+
+ /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
+ ** handle rows (possibly in other tables) that refer via a foreign key
+ ** to the row just deleted. */
+ sqlite3FkActions(pParse, pTab, 0, iOld);
+
+ /* Invoke AFTER DELETE trigger programs. */
+ sqlite3CodeRowTrigger(pParse, pTrigger,
+ TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel
+ );
+
+ /* Jump here if the row had already been deleted before any BEFORE
+ ** trigger programs were invoked. Or if a trigger program throws a
+ ** RAISE(IGNORE) exception. */
+ sqlite3VdbeResolveLabel(v, iLabel);
}
/*
@@ -57238,22 +70599,18 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey(
sqlite3VdbeAddOp2(v, OP_SCopy, regBase+nCol, regBase+j);
}else{
sqlite3VdbeAddOp3(v, OP_Column, iCur, idx, regBase+j);
- sqlite3ColumnDefault(v, pTab, idx);
+ sqlite3ColumnDefault(v, pTab, idx, -1);
}
}
if( doMakeRec ){
sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut);
- sqlite3IndexAffinityStr(v, pIdx);
+ sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0);
sqlite3ExprCacheAffinityChange(pParse, regBase, nCol+1);
}
sqlite3ReleaseTempRange(pParse, regBase, nCol+1);
return regBase;
}
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
/************** End of delete.c **********************************************/
/************** Begin file func.c ********************************************/
@@ -57274,11 +70631,8 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey(
** There is only one exported symbol in this file - the function
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
-**
-** $Id: func.c,v 1.192 2008/04/27 18:40:12 drh Exp $
*/
-
/*
** Return the collating function associated with a function.
*/
@@ -57299,7 +70653,7 @@ static void minmaxFunc(
int iBest;
CollSeq *pColl;
- if( argc==0 ) return;
+ assert( argc>1 );
mask = sqlite3_user_data(context)==0 ? 0 : -1;
pColl = sqlite3GetFuncCollSeq(context);
assert( pColl );
@@ -57309,6 +70663,7 @@ static void minmaxFunc(
for(i=1; i<argc; i++){
if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
+ testcase( mask==0 );
iBest = i;
}
}
@@ -57320,16 +70675,17 @@ static void minmaxFunc(
*/
static void typeofFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
const char *z = 0;
+ UNUSED_PARAMETER(NotUsed);
switch( sqlite3_value_type(argv[0]) ){
- case SQLITE_NULL: z = "null"; break;
case SQLITE_INTEGER: z = "integer"; break;
case SQLITE_TEXT: z = "text"; break;
case SQLITE_FLOAT: z = "real"; break;
case SQLITE_BLOB: z = "blob"; break;
+ default: z = "null"; break;
}
sqlite3_result_text(context, z, -1, SQLITE_STATIC);
}
@@ -57346,6 +70702,7 @@ static void lengthFunc(
int len;
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_BLOB:
case SQLITE_INTEGER:
@@ -57376,6 +70733,7 @@ static void lengthFunc(
*/
static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_INTEGER: {
i64 iVal = sqlite3_value_int64(argv[0]);
@@ -57422,8 +70780,14 @@ static void substrFunc(
int len;
int p0type;
i64 p1, p2;
+ int negP2 = 0;
assert( argc==3 || argc==2 );
+ if( sqlite3_value_type(argv[1])==SQLITE_NULL
+ || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
+ ){
+ return;
+ }
p0type = sqlite3_value_type(argv[0]);
if( p0type==SQLITE_BLOB ){
len = sqlite3_value_bytes(argv[0]);
@@ -57441,6 +70805,10 @@ static void substrFunc(
p1 = sqlite3_value_int(argv[1]);
if( argc==3 ){
p2 = sqlite3_value_int(argv[2]);
+ if( p2<0 ){
+ p2 = -p2;
+ negP2 = 1;
+ }
}else{
p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
}
@@ -57448,13 +70816,25 @@ static void substrFunc(
p1 += len;
if( p1<0 ){
p2 += p1;
+ if( p2<0 ) p2 = 0;
p1 = 0;
}
}else if( p1>0 ){
p1--;
+ }else if( p2>0 ){
+ p2--;
+ }
+ if( negP2 ){
+ p1 -= p2;
+ if( p1<0 ){
+ p2 += p1;
+ p1 = 0;
+ }
}
+ assert( p1>=0 && p2>=0 );
if( p1+p2>len ){
p2 = len-p1;
+ if( p2<0 ) p2 = 0;
}
if( p0type!=SQLITE_BLOB ){
while( *z && p1 ){
@@ -57464,20 +70844,20 @@ static void substrFunc(
for(z2=z; *z2 && p2; p2--){
SQLITE_SKIP_UTF8(z2);
}
- sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
+ sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
}else{
- if( p2<0 ) p2 = 0;
- sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
+ sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
}
}
/*
** Implementation of the round() function
*/
+#ifndef SQLITE_OMIT_FLOATING_POINT
static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
int n = 0;
double r;
- char zBuf[500]; /* larger than the %f representation of the largest double */
+ char *zBuf;
assert( argc==1 || argc==2 );
if( argc==2 ){
if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
@@ -57487,24 +70867,36 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
}
if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
r = sqlite3_value_double(argv[0]);
- sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
- sqlite3AtoF(zBuf, &r);
- sqlite3_result_double(context, r);
+ zBuf = sqlite3_mprintf("%.*f",n,r);
+ if( zBuf==0 ){
+ sqlite3_result_error_nomem(context);
+ }else{
+ sqlite3AtoF(zBuf, &r);
+ sqlite3_free(zBuf);
+ sqlite3_result_double(context, r);
+ }
}
+#endif
/*
** Allocate nByte bytes of space using sqlite3_malloc(). If the
** allocation fails, call sqlite3_result_error_nomem() to notify
-** the database handle that malloc() has failed.
+** the database handle that malloc() has failed and return NULL.
+** If nByte is larger than the maximum string or blob length, then
+** raise an SQLITE_TOOBIG exception and return NULL.
*/
static void *contextMalloc(sqlite3_context *context, i64 nByte){
char *z;
- if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
+ sqlite3 *db = sqlite3_context_db_handle(context);
+ assert( nByte>0 );
+ testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
+ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
z = 0;
}else{
- z = sqlite3_malloc(nByte);
- if( !z && nByte>0 ){
+ z = sqlite3Malloc((int)nByte);
+ if( !z ){
sqlite3_result_error_nomem(context);
}
}
@@ -57518,7 +70910,7 @@ static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
char *z1;
const char *z2;
int i, n;
- if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
+ UNUSED_PARAMETER(argc);
z2 = (char*)sqlite3_value_text(argv[0]);
n = sqlite3_value_bytes(argv[0]);
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
@@ -57528,17 +70920,17 @@ static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
if( z1 ){
memcpy(z1, z2, n+1);
for(i=0; z1[i]; i++){
- z1[i] = toupper(z1[i]);
+ z1[i] = (char)sqlite3Toupper(z1[i]);
}
sqlite3_result_text(context, z1, -1, sqlite3_free);
}
}
}
static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
- char *z1;
+ u8 *z1;
const char *z2;
int i, n;
- if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
+ UNUSED_PARAMETER(argc);
z2 = (char*)sqlite3_value_text(argv[0]);
n = sqlite3_value_bytes(argv[0]);
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
@@ -57548,9 +70940,9 @@ static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
if( z1 ){
memcpy(z1, z2, n+1);
for(i=0; z1[i]; i++){
- z1[i] = tolower(z1[i]);
+ z1[i] = sqlite3Tolower(z1[i]);
}
- sqlite3_result_text(context, z1, -1, sqlite3_free);
+ sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
}
}
}
@@ -57579,13 +70971,23 @@ static void ifnullFunc(
*/
static void randomFunc(
sqlite3_context *context,
- int argc,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
sqlite_int64 r;
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_randomness(sizeof(r), &r);
- if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
- /* can always do abs() of the result */
+ if( r<0 ){
+ /* We need to prevent a random number of 0x8000000000000000
+ ** (or -9223372036854775808) since when you do abs() of that
+ ** number of you get the same value back again. To do this
+ ** in a way that is testable, mask the sign bit off of negative
+ ** values, resulting in a positive value. Then take the
+ ** 2s complement of that positive value. The end result can
+ ** therefore be no less than -9223372036854775807.
+ */
+ r = -(r ^ (((sqlite3_int64)1)<<63));
+ }
sqlite3_result_int64(context, r);
}
@@ -57601,6 +71003,7 @@ static void randomBlob(
int n;
unsigned char *p;
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
n = sqlite3_value_int(argv[0]);
if( n<1 ){
n = 1;
@@ -57618,10 +71021,11 @@ static void randomBlob(
*/
static void last_insert_rowid(
sqlite3_context *context,
- int arg,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
sqlite3 *db = sqlite3_context_db_handle(context);
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
}
@@ -57631,10 +71035,11 @@ static void last_insert_rowid(
*/
static void changes(
sqlite3_context *context,
- int arg,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
sqlite3 *db = sqlite3_context_db_handle(context);
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_result_int(context, sqlite3_changes(db));
}
@@ -57644,10 +71049,11 @@ static void changes(
*/
static void total_changes(
sqlite3_context *context,
- int arg,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
sqlite3 *db = sqlite3_context_db_handle(context);
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_result_int(context, sqlite3_total_changes(db));
}
@@ -57668,7 +71074,7 @@ struct compareInfo {
** whereas only characters less than 0x80 do in ASCII.
*/
#if defined(SQLITE_EBCDIC)
-# define sqlite3Utf8Read(A,B,C) (*(A++))
+# define sqlite3Utf8Read(A,C) (*(A++))
# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
#else
# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
@@ -57725,18 +71131,18 @@ static int patternCompare(
u8 noCase = pInfo->noCase;
int prevEscape = 0; /* True if the previous character was 'escape' */
- while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
+ while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
if( !prevEscape && c==matchAll ){
- while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
+ while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
|| c == matchOne ){
- if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
+ if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
return 0;
}
}
if( c==0 ){
return 1;
}else if( c==esc ){
- c = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c = sqlite3Utf8Read(zPattern, &zPattern);
if( c==0 ){
return 0;
}
@@ -57748,17 +71154,17 @@ static int patternCompare(
}
return *zString!=0;
}
- while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
+ while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
if( noCase ){
GlogUpperToLower(c2);
GlogUpperToLower(c);
while( c2 != 0 && c2 != c ){
- c2 = sqlite3Utf8Read(zString, 0, &zString);
+ c2 = sqlite3Utf8Read(zString, &zString);
GlogUpperToLower(c2);
}
}else{
while( c2 != 0 && c2 != c ){
- c2 = sqlite3Utf8Read(zString, 0, &zString);
+ c2 = sqlite3Utf8Read(zString, &zString);
}
}
if( c2==0 ) return 0;
@@ -57766,7 +71172,7 @@ static int patternCompare(
}
return 0;
}else if( !prevEscape && c==matchOne ){
- if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
+ if( sqlite3Utf8Read(zString, &zString)==0 ){
return 0;
}
}else if( c==matchSet ){
@@ -57774,20 +71180,20 @@ static int patternCompare(
assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
seen = 0;
invert = 0;
- c = sqlite3Utf8Read(zString, 0, &zString);
+ c = sqlite3Utf8Read(zString, &zString);
if( c==0 ) return 0;
- c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c2 = sqlite3Utf8Read(zPattern, &zPattern);
if( c2=='^' ){
invert = 1;
- c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c2 = sqlite3Utf8Read(zPattern, &zPattern);
}
if( c2==']' ){
if( c==']' ) seen = 1;
- c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c2 = sqlite3Utf8Read(zPattern, &zPattern);
}
while( c2 && c2!=']' ){
if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
- c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c2 = sqlite3Utf8Read(zPattern, &zPattern);
if( c>=prior_c && c<=c2 ) seen = 1;
prior_c = 0;
}else{
@@ -57796,7 +71202,7 @@ static int patternCompare(
}
prior_c = c2;
}
- c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
+ c2 = sqlite3Utf8Read(zPattern, &zPattern);
}
if( c2==0 || (seen ^ invert)==0 ){
return 0;
@@ -57804,7 +71210,7 @@ static int patternCompare(
}else if( esc==c && !prevEscape ){
prevEscape = 1;
}else{
- c2 = sqlite3Utf8Read(zString, 0, &zString);
+ c2 = sqlite3Utf8Read(zString, &zString);
if( noCase ){
GlogUpperToLower(c);
GlogUpperToLower(c2);
@@ -57847,6 +71253,7 @@ static void likeFunc(
){
const unsigned char *zA, *zB;
int escape = 0;
+ int nPat;
sqlite3 *db = sqlite3_context_db_handle(context);
zB = sqlite3_value_text(argv[0]);
@@ -57855,8 +71262,10 @@ static void likeFunc(
/* Limit the length of the LIKE or GLOB pattern to avoid problems
** of deep recursion and N*N behavior in patternCompare().
*/
- if( sqlite3_value_bytes(argv[0]) >
- db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
+ nPat = sqlite3_value_bytes(argv[0]);
+ testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
+ testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
+ if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
return;
}
@@ -57873,7 +71282,7 @@ static void likeFunc(
"ESCAPE expression must be a single character", -1);
return;
}
- escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
+ escape = sqlite3Utf8Read(zEsc, &zEsc);
}
if( zA && zB ){
struct compareInfo *pInfo = sqlite3_user_data(context);
@@ -57892,27 +71301,43 @@ static void likeFunc(
*/
static void nullifFunc(
sqlite3_context *context,
- int argc,
+ int NotUsed,
sqlite3_value **argv
){
CollSeq *pColl = sqlite3GetFuncCollSeq(context);
+ UNUSED_PARAMETER(NotUsed);
if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
sqlite3_result_value(context, argv[0]);
}
}
/*
-** Implementation of the VERSION(*) function. The result is the version
+** Implementation of the sqlite_version() function. The result is the version
** of the SQLite library that is running.
*/
static void versionFunc(
sqlite3_context *context,
- int argc,
- sqlite3_value **argv
+ int NotUsed,
+ sqlite3_value **NotUsed2
){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
}
+/*
+** Implementation of the sqlite_source_id() function. The result is a string
+** that identifies the particular version of the source code used to build
+** SQLite.
+*/
+static void sourceidFunc(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **NotUsed2
+){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ sqlite3_result_text(context, SQLITE_SOURCE_ID, -1, SQLITE_STATIC);
+}
+
/* Array for converting from half-bytes (nybbles) into ASCII hex
** digits. */
static const char hexdigits[] = {
@@ -57932,12 +71357,9 @@ static const char hexdigits[] = {
** single-quote escapes.
*/
static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
- if( argc<1 ) return;
+ assert( argc==1 );
+ UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
- case SQLITE_NULL: {
- sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
- break;
- }
case SQLITE_INTEGER:
case SQLITE_FLOAT: {
sqlite3_result_value(context, argv[0]);
@@ -57985,6 +71407,12 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
z[j] = 0;
sqlite3_result_text(context, z, j, sqlite3_free);
}
+ break;
+ }
+ default: {
+ assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
+ sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
+ break;
}
}
}
@@ -58002,6 +71430,7 @@ static void hexFunc(
const unsigned char *pBlob;
char *zHex, *z;
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
pBlob = sqlite3_value_blob(argv[0]);
n = sqlite3_value_bytes(argv[0]);
assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
@@ -58026,12 +71455,16 @@ static void zeroblobFunc(
sqlite3_value **argv
){
i64 n;
+ sqlite3 *db = sqlite3_context_db_handle(context);
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
n = sqlite3_value_int64(argv[0]);
- if( n>SQLITE_MAX_LENGTH ){
+ testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
+ if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
}else{
- sqlite3_result_zeroblob(context, n);
+ sqlite3_result_zeroblob(context, (int)n);
}
}
@@ -58058,12 +71491,22 @@ static void replaceFunc(
int i, j; /* Loop counters */
assert( argc==3 );
+ UNUSED_PARAMETER(argc);
zStr = sqlite3_value_text(argv[0]);
if( zStr==0 ) return;
nStr = sqlite3_value_bytes(argv[0]);
assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
zPattern = sqlite3_value_text(argv[1]);
- if( zPattern==0 || zPattern[0]==0 ) return;
+ if( zPattern==0 ){
+ assert( sqlite3_value_type(argv[1])==SQLITE_NULL
+ || sqlite3_context_db_handle(context)->mallocFailed );
+ return;
+ }
+ if( zPattern[0]==0 ){
+ assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
+ sqlite3_result_value(context, argv[0]);
+ return;
+ }
nPattern = sqlite3_value_bytes(argv[1]);
assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
zRep = sqlite3_value_text(argv[2]);
@@ -58084,16 +71527,18 @@ static void replaceFunc(
u8 *zOld;
sqlite3 *db = sqlite3_context_db_handle(context);
nOut += nRep - nPattern;
- if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
+ testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
+ if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
- sqlite3_free(zOut);
+ sqlite3DbFree(db, zOut);
return;
}
zOld = zOut;
zOut = sqlite3_realloc(zOut, (int)nOut);
if( zOut==0 ){
sqlite3_result_error_nomem(context);
- sqlite3_free(zOld);
+ sqlite3DbFree(db, zOld);
return;
}
memcpy(&zOut[j], zRep, nRep);
@@ -58123,8 +71568,8 @@ static void trimFunc(
int nIn; /* Number of bytes in input */
int flags; /* 1: trimleft 2: trimright 3: trim */
int i; /* Loop counter */
- unsigned char *aLen; /* Length of each character in zCharSet */
- unsigned char **azChar; /* Individual characters in zCharSet */
+ unsigned char *aLen = 0; /* Length of each character in zCharSet */
+ unsigned char **azChar = 0; /* Individual characters in zCharSet */
int nChar; /* Number of characters in zCharSet */
if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
@@ -58136,7 +71581,7 @@ static void trimFunc(
assert( zIn==sqlite3_value_text(argv[0]) );
if( argc==1 ){
static const unsigned char lenOne[] = { 1 };
- static const unsigned char *azOne[] = { (u8*)" " };
+ static unsigned char * const azOne[] = { (u8*)" " };
nChar = 1;
aLen = (u8*)lenOne;
azChar = (unsigned char **)azOne;
@@ -58157,18 +71602,18 @@ static void trimFunc(
for(z=zCharSet, nChar=0; *z; nChar++){
azChar[nChar] = (unsigned char *)z;
SQLITE_SKIP_UTF8(z);
- aLen[nChar] = z - azChar[nChar];
+ aLen[nChar] = (u8)(z - azChar[nChar]);
}
}
}
if( nChar>0 ){
- flags = (int)sqlite3_user_data(context);
+ flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
if( flags & 1 ){
while( nIn>0 ){
- int len;
+ int len = 0;
for(i=0; i<nChar; i++){
len = aLen[i];
- if( memcmp(zIn, azChar[i], len)==0 ) break;
+ if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
}
if( i>=nChar ) break;
zIn += len;
@@ -58177,7 +71622,7 @@ static void trimFunc(
}
if( flags & 2 ){
while( nIn>0 ){
- int len;
+ int len = 0;
for(i=0; i<nChar; i++){
len = aLen[i];
if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
@@ -58193,6 +71638,7 @@ static void trimFunc(
sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
}
+
#ifdef SQLITE_SOUNDEX
/*
** Compute the soundex encoding of a word.
@@ -58218,10 +71664,10 @@ static void soundexFunc(
assert( argc==1 );
zIn = (u8*)sqlite3_value_text(argv[0]);
if( zIn==0 ) zIn = (u8*)"";
- for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
+ for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
if( zIn[i] ){
u8 prevcode = iCode[zIn[i]&0x7f];
- zResult[0] = toupper(zIn[i]);
+ zResult[0] = sqlite3Toupper(zIn[i]);
for(j=1; j<4 && zIn[i]; i++){
int code = iCode[zIn[i]&0x7f];
if( code>0 ){
@@ -58294,6 +71740,7 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
SumCtx *p;
int type;
assert( argc==1 );
+ UNUSED_PARAMETER(argc);
p = sqlite3_aggregate_context(context, sizeof(*p));
type = sqlite3_value_numeric_type(argv[0]);
if( p && type!=SQLITE_NULL ){
@@ -58303,10 +71750,10 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
p->rSum += v;
if( (p->approx|p->overflow)==0 ){
i64 iNewSum = p->iSum + v;
- int s1 = p->iSum >> (sizeof(i64)*8-1);
- int s2 = v >> (sizeof(i64)*8-1);
- int s3 = iNewSum >> (sizeof(i64)*8-1);
- p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
+ int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
+ int s2 = (int)(v >> (sizeof(i64)*8-1));
+ int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
+ p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
p->iSum = iNewSum;
}
}else{
@@ -58338,7 +71785,8 @@ static void avgFinalize(sqlite3_context *context){
static void totalFinalize(sqlite3_context *context){
SumCtx *p;
p = sqlite3_aggregate_context(context, 0);
- sqlite3_result_double(context, p ? p->rSum : 0.0);
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ sqlite3_result_double(context, p ? p->rSum : (double)0);
}
/*
@@ -58359,6 +71807,15 @@ static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
p->n++;
}
+
+#ifndef SQLITE_OMIT_DEPRECATED
+ /* The sqlite3_aggregate_count() function is deprecated. But just to make
+ ** sure it still operates correctly, verify that its count agrees with our
+ ** internal count when using count(*) and when the total count can be
+ ** expressed as a 32-bit integer. */
+ assert( argc==1 || p==0 || p->n>0x7fffffff
+ || p->n==sqlite3_aggregate_count(context) );
+#endif
}
static void countFinalize(sqlite3_context *context){
CountCtx *p;
@@ -58369,9 +71826,14 @@ static void countFinalize(sqlite3_context *context){
/*
** Routines to implement min() and max() aggregate functions.
*/
-static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
+static void minmaxStep(
+ sqlite3_context *context,
+ int NotUsed,
+ sqlite3_value **argv
+){
Mem *pArg = (Mem *)argv[0];
Mem *pBest;
+ UNUSED_PARAMETER(NotUsed);
if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
@@ -58402,7 +71864,7 @@ static void minMaxFinalize(sqlite3_context *context){
sqlite3_value *pRes;
pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
if( pRes ){
- if( pRes->flags ){
+ if( ALWAYS(pRes->flags) ){
sqlite3_result_value(context, pRes);
}
sqlite3VdbeMemRelease(pRes);
@@ -58421,14 +71883,16 @@ static void groupConcatStep(
StrAccum *pAccum;
const char *zSep;
int nVal, nSep;
+ assert( argc==1 || argc==2 );
if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
if( pAccum ){
sqlite3 *db = sqlite3_context_db_handle(context);
+ int firstTerm = pAccum->useMalloc==0;
pAccum->useMalloc = 1;
pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
- if( pAccum->nChar ){
+ if( !firstTerm ){
if( argc==2 ){
zSep = (char*)sqlite3_value_text(argv[1]);
nSep = sqlite3_value_bytes(argv[1]);
@@ -58464,109 +71928,9 @@ static void groupConcatFinalize(sqlite3_context *context){
** external linkage.
*/
SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
- static const struct {
- char *zName;
- signed char nArg;
- u8 argType; /* 1: 0, 2: 1, 3: 2,... N: N-1. */
- u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
- u8 needCollSeq;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
- } aFuncs[] = {
- { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
- { "min", 0, 0, SQLITE_UTF8, 1, 0 },
- { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
- { "max", 0, 1, SQLITE_UTF8, 1, 0 },
- { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
- { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
- { "substr", 2, 0, SQLITE_UTF8, 0, substrFunc },
- { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
- { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
- { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
- { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
- { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
- { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
- { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
- { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
- { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
- { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
- { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
- { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
- { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
- { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
- { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
- { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
- { "last_insert_rowid", 0, 0, SQLITE_UTF8, 0, last_insert_rowid },
- { "changes", 0, 0, SQLITE_UTF8, 0, changes },
- { "total_changes", 0, 0, SQLITE_UTF8, 0, total_changes },
- { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
- { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
- { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
- { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
- { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
- { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
- { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
- { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
-#ifdef SQLITE_SOUNDEX
- { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
-#endif
-#ifndef SQLITE_OMIT_LOAD_EXTENSION
- { "load_extension", 1, 0, SQLITE_UTF8, 0, loadExt },
- { "load_extension", 2, 0, SQLITE_UTF8, 0, loadExt },
-#endif
- };
- static const struct {
- char *zName;
- signed char nArg;
- u8 argType;
- u8 needCollSeq;
- void (*xStep)(sqlite3_context*,int,sqlite3_value**);
- void (*xFinalize)(sqlite3_context*);
- } aAggs[] = {
- { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
- { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
- { "sum", 1, 0, 0, sumStep, sumFinalize },
- { "total", 1, 0, 0, sumStep, totalFinalize },
- { "avg", 1, 0, 0, sumStep, avgFinalize },
- { "count", 0, 0, 0, countStep, countFinalize },
- { "count", 1, 0, 0, countStep, countFinalize },
- { "group_concat", 1, 0, 0, groupConcatStep, groupConcatFinalize },
- { "group_concat", 2, 0, 0, groupConcatStep, groupConcatFinalize },
- };
- int i;
-
- for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- void *pArg;
- u8 argType = aFuncs[i].argType;
- pArg = (void*)(int)argType;
- sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
- aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
- if( aFuncs[i].needCollSeq ){
- FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
- strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
- if( pFunc && aFuncs[i].needCollSeq ){
- pFunc->needCollSeq = 1;
- }
- }
- }
#ifndef SQLITE_OMIT_ALTERTABLE
sqlite3AlterFunctions(db);
#endif
-#ifndef SQLITE_OMIT_PARSER
- sqlite3AttachFunctions(db);
-#endif
- for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
- void *pArg = (void*)(int)aAggs[i].argType;
- sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
- pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
- if( aAggs[i].needCollSeq ){
- FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
- strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
- if( pFunc && aAggs[i].needCollSeq ){
- pFunc->needCollSeq = 1;
- }
- }
- }
- sqlite3RegisterDateTimeFunctions(db);
if( !db->mallocFailed ){
int rc = sqlite3_overload_function(db, "MATCH", 2);
assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
@@ -58574,23 +71938,16 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
db->mallocFailed = 1;
}
}
-#ifdef SQLITE_SSE
- (void)sqlite3SseFunctions(db);
-#endif
-#ifdef SQLITE_CASE_SENSITIVE_LIKE
- sqlite3RegisterLikeFunctions(db, 1);
-#else
- sqlite3RegisterLikeFunctions(db, 0);
-#endif
}
/*
** Set the LIKEOPT flag on the 2-argument function with the given name.
*/
-static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
+static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
FuncDef *pDef;
- pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
- if( pDef ){
+ pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
+ 2, SQLITE_UTF8, 0);
+ if( ALWAYS(pDef) ){
pDef->flags = flagVal;
}
}
@@ -58607,9 +71964,9 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive)
}else{
pInfo = (struct compareInfo*)&likeInfoNorm;
}
- sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
- sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
- sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
+ sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
+ sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
+ sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
(struct compareInfo*)&globInfo, likeFunc, 0,0);
setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
setLikeOptFlag(db, "like",
@@ -58625,15 +71982,17 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive)
*/
SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
FuncDef *pDef;
- if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
- return 0;
- }
- if( pExpr->pList->nExpr!=2 ){
+ if( pExpr->op!=TK_FUNCTION
+ || !pExpr->x.pList
+ || pExpr->x.pList->nExpr!=2
+ ){
return 0;
}
- pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
- SQLITE_UTF8, 0);
- if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
+ assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
+ pDef = sqlite3FindFunction(db, pExpr->u.zToken,
+ sqlite3Strlen30(pExpr->u.zToken),
+ 2, SQLITE_UTF8, 0);
+ if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
return 0;
}
@@ -58649,7 +72008,1292 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas
return 1;
}
+/*
+** All all of the FuncDef structures in the aBuiltinFunc[] array above
+** to the global function hash table. This occurs at start-time (as
+** a consequence of calling sqlite3_initialize()).
+**
+** After this routine runs
+*/
+SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){
+ /*
+ ** The following array holds FuncDef structures for all of the functions
+ ** defined in this file.
+ **
+ ** The array cannot be constant since changes are made to the
+ ** FuncDef.pHash elements at start-time. The elements of this array
+ ** are read-only after initialization is complete.
+ */
+ static SQLITE_WSD FuncDef aBuiltinFunc[] = {
+ FUNCTION(ltrim, 1, 1, 0, trimFunc ),
+ FUNCTION(ltrim, 2, 1, 0, trimFunc ),
+ FUNCTION(rtrim, 1, 2, 0, trimFunc ),
+ FUNCTION(rtrim, 2, 2, 0, trimFunc ),
+ FUNCTION(trim, 1, 3, 0, trimFunc ),
+ FUNCTION(trim, 2, 3, 0, trimFunc ),
+ FUNCTION(min, -1, 0, 1, minmaxFunc ),
+ FUNCTION(min, 0, 0, 1, 0 ),
+ AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
+ FUNCTION(max, -1, 1, 1, minmaxFunc ),
+ FUNCTION(max, 0, 1, 1, 0 ),
+ AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
+ FUNCTION(typeof, 1, 0, 0, typeofFunc ),
+ FUNCTION(length, 1, 0, 0, lengthFunc ),
+ FUNCTION(substr, 2, 0, 0, substrFunc ),
+ FUNCTION(substr, 3, 0, 0, substrFunc ),
+ FUNCTION(abs, 1, 0, 0, absFunc ),
+#ifndef SQLITE_OMIT_FLOATING_POINT
+ FUNCTION(round, 1, 0, 0, roundFunc ),
+ FUNCTION(round, 2, 0, 0, roundFunc ),
+#endif
+ FUNCTION(upper, 1, 0, 0, upperFunc ),
+ FUNCTION(lower, 1, 0, 0, lowerFunc ),
+ FUNCTION(coalesce, 1, 0, 0, 0 ),
+ FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
+ FUNCTION(coalesce, 0, 0, 0, 0 ),
+ FUNCTION(hex, 1, 0, 0, hexFunc ),
+ FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
+ FUNCTION(random, 0, 0, 0, randomFunc ),
+ FUNCTION(randomblob, 1, 0, 0, randomBlob ),
+ FUNCTION(nullif, 2, 0, 1, nullifFunc ),
+ FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
+ FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
+ FUNCTION(quote, 1, 0, 0, quoteFunc ),
+ FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
+ FUNCTION(changes, 0, 0, 0, changes ),
+ FUNCTION(total_changes, 0, 0, 0, total_changes ),
+ FUNCTION(replace, 3, 0, 0, replaceFunc ),
+ FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
+ #ifdef SQLITE_SOUNDEX
+ FUNCTION(soundex, 1, 0, 0, soundexFunc ),
+ #endif
+ #ifndef SQLITE_OMIT_LOAD_EXTENSION
+ FUNCTION(load_extension, 1, 0, 0, loadExt ),
+ FUNCTION(load_extension, 2, 0, 0, loadExt ),
+ #endif
+ AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
+ AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
+ AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
+ /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
+ {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
+ AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
+ AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
+ AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
+
+ LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
+ #ifdef SQLITE_CASE_SENSITIVE_LIKE
+ LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
+ LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
+ #else
+ LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
+ LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
+ #endif
+ };
+
+ int i;
+ FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
+ FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
+
+ for(i=0; i<ArraySize(aBuiltinFunc); i++){
+ sqlite3FuncDefInsert(pHash, &aFunc[i]);
+ }
+ sqlite3RegisterDateTimeFunctions();
+}
+
/************** End of func.c ************************************************/
+/************** Begin file fkey.c ********************************************/
+/*
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains code used by the compiler to add foreign key
+** support to compiled SQL statements.
+*/
+
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+#ifndef SQLITE_OMIT_TRIGGER
+
+/*
+** Deferred and Immediate FKs
+** --------------------------
+**
+** Foreign keys in SQLite come in two flavours: deferred and immediate.
+** If an immediate foreign key constraint is violated, SQLITE_CONSTRAINT
+** is returned and the current statement transaction rolled back. If a
+** deferred foreign key constraint is violated, no action is taken
+** immediately. However if the application attempts to commit the
+** transaction before fixing the constraint violation, the attempt fails.
+**
+** Deferred constraints are implemented using a simple counter associated
+** with the database handle. The counter is set to zero each time a
+** database transaction is opened. Each time a statement is executed
+** that causes a foreign key violation, the counter is incremented. Each
+** time a statement is executed that removes an existing violation from
+** the database, the counter is decremented. When the transaction is
+** committed, the commit fails if the current value of the counter is
+** greater than zero. This scheme has two big drawbacks:
+**
+** * When a commit fails due to a deferred foreign key constraint,
+** there is no way to tell which foreign constraint is not satisfied,
+** or which row it is not satisfied for.
+**
+** * If the database contains foreign key violations when the
+** transaction is opened, this may cause the mechanism to malfunction.
+**
+** Despite these problems, this approach is adopted as it seems simpler
+** than the alternatives.
+**
+** INSERT operations:
+**
+** I.1) For each FK for which the table is the child table, search
+** the parent table for a match. If none is found increment the
+** constraint counter.
+**
+** I.2) For each FK for which the table is the parent table,
+** search the child table for rows that correspond to the new
+** row in the parent table. Decrement the counter for each row
+** found (as the constraint is now satisfied).
+**
+** DELETE operations:
+**
+** D.1) For each FK for which the table is the child table,
+** search the parent table for a row that corresponds to the
+** deleted row in the child table. If such a row is not found,
+** decrement the counter.
+**
+** D.2) For each FK for which the table is the parent table, search
+** the child table for rows that correspond to the deleted row
+** in the parent table. For each found increment the counter.
+**
+** UPDATE operations:
+**
+** An UPDATE command requires that all 4 steps above are taken, but only
+** for FK constraints for which the affected columns are actually
+** modified (values must be compared at runtime).
+**
+** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2.
+** This simplifies the implementation a bit.
+**
+** For the purposes of immediate FK constraints, the OR REPLACE conflict
+** resolution is considered to delete rows before the new row is inserted.
+** If a delete caused by OR REPLACE violates an FK constraint, an exception
+** is thrown, even if the FK constraint would be satisfied after the new
+** row is inserted.
+**
+** Immediate constraints are usually handled similarly. The only difference
+** is that the counter used is stored as part of each individual statement
+** object (struct Vdbe). If, after the statement has run, its immediate
+** constraint counter is greater than zero, it returns SQLITE_CONSTRAINT
+** and the statement transaction is rolled back. An exception is an INSERT
+** statement that inserts a single row only (no triggers). In this case,
+** instead of using a counter, an exception is thrown immediately if the
+** INSERT violates a foreign key constraint. This is necessary as such
+** an INSERT does not open a statement transaction.
+**
+** TODO: How should dropping a table be handled? How should renaming a
+** table be handled?
+**
+**
+** Query API Notes
+** ---------------
+**
+** Before coding an UPDATE or DELETE row operation, the code-generator
+** for those two operations needs to know whether or not the operation
+** requires any FK processing and, if so, which columns of the original
+** row are required by the FK processing VDBE code (i.e. if FKs were
+** implemented using triggers, which of the old.* columns would be
+** accessed). No information is required by the code-generator before
+** coding an INSERT operation. The functions used by the UPDATE/DELETE
+** generation code to query for this information are:
+**
+** sqlite3FkRequired() - Test to see if FK processing is required.
+** sqlite3FkOldmask() - Query for the set of required old.* columns.
+**
+**
+** Externally accessible module functions
+** --------------------------------------
+**
+** sqlite3FkCheck() - Check for foreign key violations.
+** sqlite3FkActions() - Code triggers for ON UPDATE/ON DELETE actions.
+** sqlite3FkDelete() - Delete an FKey structure.
+*/
+
+/*
+** VDBE Calling Convention
+** -----------------------
+**
+** Example:
+**
+** For the following INSERT statement:
+**
+** CREATE TABLE t1(a, b INTEGER PRIMARY KEY, c);
+** INSERT INTO t1 VALUES(1, 2, 3.1);
+**
+** Register (x): 2 (type integer)
+** Register (x+1): 1 (type integer)
+** Register (x+2): NULL (type NULL)
+** Register (x+3): 3.1 (type real)
+*/
+
+/*
+** A foreign key constraint requires that the key columns in the parent
+** table are collectively subject to a UNIQUE or PRIMARY KEY constraint.
+** Given that pParent is the parent table for foreign key constraint pFKey,
+** search the schema a unique index on the parent key columns.
+**
+** If successful, zero is returned. If the parent key is an INTEGER PRIMARY
+** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx
+** is set to point to the unique index.
+**
+** If the parent key consists of a single column (the foreign key constraint
+** is not a composite foreign key), output variable *paiCol is set to NULL.
+** Otherwise, it is set to point to an allocated array of size N, where
+** N is the number of columns in the parent key. The first element of the
+** array is the index of the child table column that is mapped by the FK
+** constraint to the parent table column stored in the left-most column
+** of index *ppIdx. The second element of the array is the index of the
+** child table column that corresponds to the second left-most column of
+** *ppIdx, and so on.
+**
+** If the required index cannot be found, either because:
+**
+** 1) The named parent key columns do not exist, or
+**
+** 2) The named parent key columns do exist, but are not subject to a
+** UNIQUE or PRIMARY KEY constraint, or
+**
+** 3) No parent key columns were provided explicitly as part of the
+** foreign key definition, and the parent table does not have a
+** PRIMARY KEY, or
+**
+** 4) No parent key columns were provided explicitly as part of the
+** foreign key definition, and the PRIMARY KEY of the parent table
+** consists of a a different number of columns to the child key in
+** the child table.
+**
+** then non-zero is returned, and a "foreign key mismatch" error loaded
+** into pParse. If an OOM error occurs, non-zero is returned and the
+** pParse->db->mallocFailed flag is set.
+*/
+static int locateFkeyIndex(
+ Parse *pParse, /* Parse context to store any error in */
+ Table *pParent, /* Parent table of FK constraint pFKey */
+ FKey *pFKey, /* Foreign key to find index for */
+ Index **ppIdx, /* OUT: Unique index on parent table */
+ int **paiCol /* OUT: Map of index columns in pFKey */
+){
+ Index *pIdx = 0; /* Value to return via *ppIdx */
+ int *aiCol = 0; /* Value to return via *paiCol */
+ int nCol = pFKey->nCol; /* Number of columns in parent key */
+ char *zKey = pFKey->aCol[0].zCol; /* Name of left-most parent key column */
+
+ /* The caller is responsible for zeroing output parameters. */
+ assert( ppIdx && *ppIdx==0 );
+ assert( !paiCol || *paiCol==0 );
+ assert( pParse );
+
+ /* If this is a non-composite (single column) foreign key, check if it
+ ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx
+ ** and *paiCol set to zero and return early.
+ **
+ ** Otherwise, for a composite foreign key (more than one column), allocate
+ ** space for the aiCol array (returned via output parameter *paiCol).
+ ** Non-composite foreign keys do not require the aiCol array.
+ */
+ if( nCol==1 ){
+ /* The FK maps to the IPK if any of the following are true:
+ **
+ ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly
+ ** mapped to the primary key of table pParent, or
+ ** 2) The FK is explicitly mapped to a column declared as INTEGER
+ ** PRIMARY KEY.
+ */
+ if( pParent->iPKey>=0 ){
+ if( !zKey ) return 0;
+ if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0;
+ }
+ }else if( paiCol ){
+ assert( nCol>1 );
+ aiCol = (int *)sqlite3DbMallocRaw(pParse->db, nCol*sizeof(int));
+ if( !aiCol ) return 1;
+ *paiCol = aiCol;
+ }
+
+ for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){
+ if( pIdx->nColumn==nCol && pIdx->onError!=OE_None ){
+ /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number
+ ** of columns. If each indexed column corresponds to a foreign key
+ ** column of pFKey, then this index is a winner. */
+
+ if( zKey==0 ){
+ /* If zKey is NULL, then this foreign key is implicitly mapped to
+ ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be
+ ** identified by the test (Index.autoIndex==2). */
+ if( pIdx->autoIndex==2 ){
+ if( aiCol ){
+ int i;
+ for(i=0; i<nCol; i++) aiCol[i] = pFKey->aCol[i].iFrom;
+ }
+ break;
+ }
+ }else{
+ /* If zKey is non-NULL, then this foreign key was declared to
+ ** map to an explicit list of columns in table pParent. Check if this
+ ** index matches those columns. Also, check that the index uses
+ ** the default collation sequences for each column. */
+ int i, j;
+ for(i=0; i<nCol; i++){
+ int iCol = pIdx->aiColumn[i]; /* Index of column in parent tbl */
+ char *zDfltColl; /* Def. collation for column */
+ char *zIdxCol; /* Name of indexed column */
+
+ /* If the index uses a collation sequence that is different from
+ ** the default collation sequence for the column, this index is
+ ** unusable. Bail out early in this case. */
+ zDfltColl = pParent->aCol[iCol].zColl;
+ if( !zDfltColl ){
+ zDfltColl = "BINARY";
+ }
+ if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break;
+
+ zIdxCol = pParent->aCol[iCol].zName;
+ for(j=0; j<nCol; j++){
+ if( sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol)==0 ){
+ if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom;
+ break;
+ }
+ }
+ if( j==nCol ) break;
+ }
+ if( i==nCol ) break; /* pIdx is usable */
+ }
+ }
+ }
+
+ if( !pIdx ){
+ if( !pParse->disableTriggers ){
+ sqlite3ErrorMsg(pParse, "foreign key mismatch");
+ }
+ sqlite3DbFree(pParse->db, aiCol);
+ return 1;
+ }
+
+ *ppIdx = pIdx;
+ return 0;
+}
+
+/*
+** This function is called when a row is inserted into or deleted from the
+** child table of foreign key constraint pFKey. If an SQL UPDATE is executed
+** on the child table of pFKey, this function is invoked twice for each row
+** affected - once to "delete" the old row, and then again to "insert" the
+** new row.
+**
+** Each time it is called, this function generates VDBE code to locate the
+** row in the parent table that corresponds to the row being inserted into
+** or deleted from the child table. If the parent row can be found, no
+** special action is taken. Otherwise, if the parent row can *not* be
+** found in the parent table:
+**
+** Operation | FK type | Action taken
+** --------------------------------------------------------------------------
+** INSERT immediate Increment the "immediate constraint counter".
+**
+** DELETE immediate Decrement the "immediate constraint counter".
+**
+** INSERT deferred Increment the "deferred constraint counter".
+**
+** DELETE deferred Decrement the "deferred constraint counter".
+**
+** These operations are identified in the comment at the top of this file
+** (fkey.c) as "I.1" and "D.1".
+*/
+static void fkLookupParent(
+ Parse *pParse, /* Parse context */
+ int iDb, /* Index of database housing pTab */
+ Table *pTab, /* Parent table of FK pFKey */
+ Index *pIdx, /* Unique index on parent key columns in pTab */
+ FKey *pFKey, /* Foreign key constraint */
+ int *aiCol, /* Map from parent key columns to child table columns */
+ int regData, /* Address of array containing child table row */
+ int nIncr, /* Increment constraint counter by this */
+ int isIgnore /* If true, pretend pTab contains all NULL values */
+){
+ int i; /* Iterator variable */
+ Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */
+ int iCur = pParse->nTab - 1; /* Cursor number to use */
+ int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */
+
+ /* If nIncr is less than zero, then check at runtime if there are any
+ ** outstanding constraints to resolve. If there are not, there is no need
+ ** to check if deleting this row resolves any outstanding violations.
+ **
+ ** Check if any of the key columns in the child table row are NULL. If
+ ** any are, then the constraint is considered satisfied. No need to
+ ** search for a matching row in the parent table. */
+ if( nIncr<0 ){
+ sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk);
+ }
+ for(i=0; i<pFKey->nCol; i++){
+ int iReg = aiCol[i] + regData + 1;
+ sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk);
+ }
+
+ if( isIgnore==0 ){
+ if( pIdx==0 ){
+ /* If pIdx is NULL, then the parent key is the INTEGER PRIMARY KEY
+ ** column of the parent table (table pTab). */
+ int iMustBeInt; /* Address of MustBeInt instruction */
+ int regTemp = sqlite3GetTempReg(pParse);
+
+ /* Invoke MustBeInt to coerce the child key value to an integer (i.e.
+ ** apply the affinity of the parent key). If this fails, then there
+ ** is no matching parent key. Before using MustBeInt, make a copy of
+ ** the value. Otherwise, the value inserted into the child key column
+ ** will have INTEGER affinity applied to it, which may not be correct. */
+ sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp);
+ iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0);
+
+ /* If the parent table is the same as the child table, and we are about
+ ** to increment the constraint-counter (i.e. this is an INSERT operation),
+ ** then check if the row being inserted matches itself. If so, do not
+ ** increment the constraint-counter. */
+ if( pTab==pFKey->pFrom && nIncr==1 ){
+ sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp);
+ }
+
+ sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk);
+ sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2);
+ sqlite3VdbeJumpHere(v, iMustBeInt);
+ sqlite3ReleaseTempReg(pParse, regTemp);
+ }else{
+ int nCol = pFKey->nCol;
+ int regTemp = sqlite3GetTempRange(pParse, nCol);
+ int regRec = sqlite3GetTempReg(pParse);
+ KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
+
+ sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb);
+ sqlite3VdbeChangeP4(v, -1, (char*)pKey, P4_KEYINFO_HANDOFF);
+ for(i=0; i<nCol; i++){
+ sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[i]+1+regData, regTemp+i);
+ }
+
+ /* If the parent table is the same as the child table, and we are about
+ ** to increment the constraint-counter (i.e. this is an INSERT operation),
+ ** then check if the row being inserted matches itself. If so, do not
+ ** increment the constraint-counter. */
+ if( pTab==pFKey->pFrom && nIncr==1 ){
+ int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1;
+ for(i=0; i<nCol; i++){
+ int iChild = aiCol[i]+1+regData;
+ int iParent = pIdx->aiColumn[i]+1+regData;
+ sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent);
+ }
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk);
+ }
+
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec);
+ sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0);
+ sqlite3VdbeAddOp3(v, OP_Found, iCur, iOk, regRec);
+
+ sqlite3ReleaseTempReg(pParse, regRec);
+ sqlite3ReleaseTempRange(pParse, regTemp, nCol);
+ }
+ }
+
+ if( !pFKey->isDeferred && !pParse->pToplevel && !pParse->isMultiWrite ){
+ /* Special case: If this is an INSERT statement that will insert exactly
+ ** one row into the table, raise a constraint immediately instead of
+ ** incrementing a counter. This is necessary as the VM code is being
+ ** generated for will not open a statement transaction. */
+ assert( nIncr==1 );
+ sqlite3HaltConstraint(
+ pParse, OE_Abort, "foreign key constraint failed", P4_STATIC
+ );
+ }else{
+ if( nIncr>0 && pFKey->isDeferred==0 ){
+ sqlite3ParseToplevel(pParse)->mayAbort = 1;
+ }
+ sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
+ }
+
+ sqlite3VdbeResolveLabel(v, iOk);
+ sqlite3VdbeAddOp1(v, OP_Close, iCur);
+}
+
+/*
+** This function is called to generate code executed when a row is deleted
+** from the parent table of foreign key constraint pFKey and, if pFKey is
+** deferred, when a row is inserted into the same table. When generating
+** code for an SQL UPDATE operation, this function may be called twice -
+** once to "delete" the old row and once to "insert" the new row.
+**
+** The code generated by this function scans through the rows in the child
+** table that correspond to the parent table row being deleted or inserted.
+** For each child row found, one of the following actions is taken:
+**
+** Operation | FK type | Action taken
+** --------------------------------------------------------------------------
+** DELETE immediate Increment the "immediate constraint counter".
+** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
+** throw a "foreign key constraint failed" exception.
+**
+** INSERT immediate Decrement the "immediate constraint counter".
+**
+** DELETE deferred Increment the "deferred constraint counter".
+** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
+** throw a "foreign key constraint failed" exception.
+**
+** INSERT deferred Decrement the "deferred constraint counter".
+**
+** These operations are identified in the comment at the top of this file
+** (fkey.c) as "I.2" and "D.2".
+*/
+static void fkScanChildren(
+ Parse *pParse, /* Parse context */
+ SrcList *pSrc, /* SrcList containing the table to scan */
+ Table *pTab,
+ Index *pIdx, /* Foreign key index */
+ FKey *pFKey, /* Foreign key relationship */
+ int *aiCol, /* Map from pIdx cols to child table cols */
+ int regData, /* Referenced table data starts here */
+ int nIncr /* Amount to increment deferred counter by */
+){
+ sqlite3 *db = pParse->db; /* Database handle */
+ int i; /* Iterator variable */
+ Expr *pWhere = 0; /* WHERE clause to scan with */
+ NameContext sNameContext; /* Context used to resolve WHERE clause */
+ WhereInfo *pWInfo; /* Context used by sqlite3WhereXXX() */
+ int iFkIfZero = 0; /* Address of OP_FkIfZero */
+ Vdbe *v = sqlite3GetVdbe(pParse);
+
+ assert( !pIdx || pIdx->pTable==pTab );
+
+ if( nIncr<0 ){
+ iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0);
+ }
+
+ /* Create an Expr object representing an SQL expression like:
+ **
+ ** <parent-key1> = <child-key1> AND <parent-key2> = <child-key2> ...
+ **
+ ** The collation sequence used for the comparison should be that of
+ ** the parent key columns. The affinity of the parent key column should
+ ** be applied to each child key value before the comparison takes place.
+ */
+ for(i=0; i<pFKey->nCol; i++){
+ Expr *pLeft; /* Value from parent table row */
+ Expr *pRight; /* Column ref to child table */
+ Expr *pEq; /* Expression (pLeft = pRight) */
+ int iCol; /* Index of column in child table */
+ const char *zCol; /* Name of column in child table */
+
+ pLeft = sqlite3Expr(db, TK_REGISTER, 0);
+ if( pLeft ){
+ /* Set the collation sequence and affinity of the LHS of each TK_EQ
+ ** expression to the parent key column defaults. */
+ if( pIdx ){
+ Column *pCol;
+ iCol = pIdx->aiColumn[i];
+ pCol = &pIdx->pTable->aCol[iCol];
+ pLeft->iTable = regData+iCol+1;
+ pLeft->affinity = pCol->affinity;
+ pLeft->pColl = sqlite3LocateCollSeq(pParse, pCol->zColl);
+ }else{
+ pLeft->iTable = regData;
+ pLeft->affinity = SQLITE_AFF_INTEGER;
+ }
+ }
+ iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom;
+ assert( iCol>=0 );
+ zCol = pFKey->pFrom->aCol[iCol].zName;
+ pRight = sqlite3Expr(db, TK_ID, zCol);
+ pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0);
+ pWhere = sqlite3ExprAnd(db, pWhere, pEq);
+ }
+
+ /* If the child table is the same as the parent table, and this scan
+ ** is taking place as part of a DELETE operation (operation D.2), omit the
+ ** row being deleted from the scan by adding ($rowid != rowid) to the WHERE
+ ** clause, where $rowid is the rowid of the row being deleted. */
+ if( pTab==pFKey->pFrom && nIncr>0 ){
+ Expr *pEq; /* Expression (pLeft = pRight) */
+ Expr *pLeft; /* Value from parent table row */
+ Expr *pRight; /* Column ref to child table */
+ pLeft = sqlite3Expr(db, TK_REGISTER, 0);
+ pRight = sqlite3Expr(db, TK_COLUMN, 0);
+ if( pLeft && pRight ){
+ pLeft->iTable = regData;
+ pLeft->affinity = SQLITE_AFF_INTEGER;
+ pRight->iTable = pSrc->a[0].iCursor;
+ pRight->iColumn = -1;
+ }
+ pEq = sqlite3PExpr(pParse, TK_NE, pLeft, pRight, 0);
+ pWhere = sqlite3ExprAnd(db, pWhere, pEq);
+ }
+
+ /* Resolve the references in the WHERE clause. */
+ memset(&sNameContext, 0, sizeof(NameContext));
+ sNameContext.pSrcList = pSrc;
+ sNameContext.pParse = pParse;
+ sqlite3ResolveExprNames(&sNameContext, pWhere);
+
+ /* Create VDBE to loop through the entries in pSrc that match the WHERE
+ ** clause. If the constraint is not deferred, throw an exception for
+ ** each row found. Otherwise, for deferred constraints, increment the
+ ** deferred constraint counter by nIncr for each row selected. */
+ pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0);
+ if( nIncr>0 && pFKey->isDeferred==0 ){
+ sqlite3ParseToplevel(pParse)->mayAbort = 1;
+ }
+ sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
+ if( pWInfo ){
+ sqlite3WhereEnd(pWInfo);
+ }
+
+ /* Clean up the WHERE clause constructed above. */
+ sqlite3ExprDelete(db, pWhere);
+ if( iFkIfZero ){
+ sqlite3VdbeJumpHere(v, iFkIfZero);
+ }
+}
+
+/*
+** This function returns a pointer to the head of a linked list of FK
+** constraints for which table pTab is the parent table. For example,
+** given the following schema:
+**
+** CREATE TABLE t1(a PRIMARY KEY);
+** CREATE TABLE t2(b REFERENCES t1(a);
+**
+** Calling this function with table "t1" as an argument returns a pointer
+** to the FKey structure representing the foreign key constraint on table
+** "t2". Calling this function with "t2" as the argument would return a
+** NULL pointer (as there are no FK constraints for which t2 is the parent
+** table).
+*/
+SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){
+ int nName = sqlite3Strlen30(pTab->zName);
+ return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName, nName);
+}
+
+/*
+** The second argument is a Trigger structure allocated by the
+** fkActionTrigger() routine. This function deletes the Trigger structure
+** and all of its sub-components.
+**
+** The Trigger structure or any of its sub-components may be allocated from
+** the lookaside buffer belonging to database handle dbMem.
+*/
+static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
+ if( p ){
+ TriggerStep *pStep = p->step_list;
+ sqlite3ExprDelete(dbMem, pStep->pWhere);
+ sqlite3ExprListDelete(dbMem, pStep->pExprList);
+ sqlite3SelectDelete(dbMem, pStep->pSelect);
+ sqlite3ExprDelete(dbMem, p->pWhen);
+ sqlite3DbFree(dbMem, p);
+ }
+}
+
+/*
+** This function is called to generate code that runs when table pTab is
+** being dropped from the database. The SrcList passed as the second argument
+** to this function contains a single entry guaranteed to resolve to
+** table pTab.
+**
+** Normally, no code is required. However, if either
+**
+** (a) The table is the parent table of a FK constraint, or
+** (b) The table is the child table of a deferred FK constraint and it is
+** determined at runtime that there are outstanding deferred FK
+** constraint violations in the database,
+**
+** then the equivalent of "DELETE FROM <tbl>" is executed before dropping
+** the table from the database. Triggers are disabled while running this
+** DELETE, but foreign key actions are not.
+*/
+SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){
+ sqlite3 *db = pParse->db;
+ if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) && !pTab->pSelect ){
+ int iSkip = 0;
+ Vdbe *v = sqlite3GetVdbe(pParse);
+
+ assert( v ); /* VDBE has already been allocated */
+ if( sqlite3FkReferences(pTab)==0 ){
+ /* Search for a deferred foreign key constraint for which this table
+ ** is the child table. If one cannot be found, return without
+ ** generating any VDBE code. If one can be found, then jump over
+ ** the entire DELETE if there are no outstanding deferred constraints
+ ** when this statement is run. */
+ FKey *p;
+ for(p=pTab->pFKey; p; p=p->pNextFrom){
+ if( p->isDeferred ) break;
+ }
+ if( !p ) return;
+ iSkip = sqlite3VdbeMakeLabel(v);
+ sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip);
+ }
+
+ pParse->disableTriggers = 1;
+ sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0);
+ pParse->disableTriggers = 0;
+
+ /* If the DELETE has generated immediate foreign key constraint
+ ** violations, halt the VDBE and return an error at this point, before
+ ** any modifications to the schema are made. This is because statement
+ ** transactions are not able to rollback schema changes. */
+ sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2);
+ sqlite3HaltConstraint(
+ pParse, OE_Abort, "foreign key constraint failed", P4_STATIC
+ );
+
+ if( iSkip ){
+ sqlite3VdbeResolveLabel(v, iSkip);
+ }
+ }
+}
+
+/*
+** This function is called when inserting, deleting or updating a row of
+** table pTab to generate VDBE code to perform foreign key constraint
+** processing for the operation.
+**
+** For a DELETE operation, parameter regOld is passed the index of the
+** first register in an array of (pTab->nCol+1) registers containing the
+** rowid of the row being deleted, followed by each of the column values
+** of the row being deleted, from left to right. Parameter regNew is passed
+** zero in this case.
+**
+** For an INSERT operation, regOld is passed zero and regNew is passed the
+** first register of an array of (pTab->nCol+1) registers containing the new
+** row data.
+**
+** For an UPDATE operation, this function is called twice. Once before
+** the original record is deleted from the table using the calling convention
+** described for DELETE. Then again after the original record is deleted
+** but before the new record is inserted using the INSERT convention.
+*/
+SQLITE_PRIVATE void sqlite3FkCheck(
+ Parse *pParse, /* Parse context */
+ Table *pTab, /* Row is being deleted from this table */
+ int regOld, /* Previous row data is stored here */
+ int regNew /* New row data is stored here */
+){
+ sqlite3 *db = pParse->db; /* Database handle */
+ Vdbe *v; /* VM to write code to */
+ FKey *pFKey; /* Used to iterate through FKs */
+ int iDb; /* Index of database containing pTab */
+ const char *zDb; /* Name of database containing pTab */
+ int isIgnoreErrors = pParse->disableTriggers;
+
+ /* Exactly one of regOld and regNew should be non-zero. */
+ assert( (regOld==0)!=(regNew==0) );
+
+ /* If foreign-keys are disabled, this function is a no-op. */
+ if( (db->flags&SQLITE_ForeignKeys)==0 ) return;
+
+ v = sqlite3GetVdbe(pParse);
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ zDb = db->aDb[iDb].zName;
+
+ /* Loop through all the foreign key constraints for which pTab is the
+ ** child table (the table that the foreign key definition is part of). */
+ for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
+ Table *pTo; /* Parent table of foreign key pFKey */
+ Index *pIdx = 0; /* Index on key columns in pTo */
+ int *aiFree = 0;
+ int *aiCol;
+ int iCol;
+ int i;
+ int isIgnore = 0;
+
+ /* Find the parent table of this foreign key. Also find a unique index
+ ** on the parent key columns in the parent table. If either of these
+ ** schema items cannot be located, set an error in pParse and return
+ ** early. */
+ if( pParse->disableTriggers ){
+ pTo = sqlite3FindTable(db, pFKey->zTo, zDb);
+ }else{
+ pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo, zDb);
+ }
+ if( !pTo || locateFkeyIndex(pParse, pTo, pFKey, &pIdx, &aiFree) ){
+ if( !isIgnoreErrors || db->mallocFailed ) return;
+ continue;
+ }
+ assert( pFKey->nCol==1 || (aiFree && pIdx) );
+
+ if( aiFree ){
+ aiCol = aiFree;
+ }else{
+ iCol = pFKey->aCol[0].iFrom;
+ aiCol = &iCol;
+ }
+ for(i=0; i<pFKey->nCol; i++){
+ if( aiCol[i]==pTab->iPKey ){
+ aiCol[i] = -1;
+ }
+#ifndef SQLITE_OMIT_AUTHORIZATION
+ /* Request permission to read the parent key columns. If the
+ ** authorization callback returns SQLITE_IGNORE, behave as if any
+ ** values read from the parent table are NULL. */
+ if( db->xAuth ){
+ int rcauth;
+ char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName;
+ rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb);
+ isIgnore = (rcauth==SQLITE_IGNORE);
+ }
+#endif
+ }
+
+ /* Take a shared-cache advisory read-lock on the parent table. Allocate
+ ** a cursor to use to search the unique index on the parent key columns
+ ** in the parent table. */
+ sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName);
+ pParse->nTab++;
+
+ if( regOld!=0 ){
+ /* A row is being removed from the child table. Search for the parent.
+ ** If the parent does not exist, removing the child row resolves an
+ ** outstanding foreign key constraint violation. */
+ fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1,isIgnore);
+ }
+ if( regNew!=0 ){
+ /* A row is being added to the child table. If a parent row cannot
+ ** be found, adding the child row has violated the FK constraint. */
+ fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regNew, +1,isIgnore);
+ }
+
+ sqlite3DbFree(db, aiFree);
+ }
+
+ /* Loop through all the foreign key constraints that refer to this table */
+ for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){
+ Index *pIdx = 0; /* Foreign key index for pFKey */
+ SrcList *pSrc;
+ int *aiCol = 0;
+
+ if( !pFKey->isDeferred && !pParse->pToplevel && !pParse->isMultiWrite ){
+ assert( regOld==0 && regNew!=0 );
+ /* Inserting a single row into a parent table cannot cause an immediate
+ ** foreign key violation. So do nothing in this case. */
+ continue;
+ }
+
+ if( locateFkeyIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ){
+ if( !isIgnoreErrors || db->mallocFailed ) return;
+ continue;
+ }
+ assert( aiCol || pFKey->nCol==1 );
+
+ /* Create a SrcList structure containing a single table (the table
+ ** the foreign key that refers to this table is attached to). This
+ ** is required for the sqlite3WhereXXX() interface. */
+ pSrc = sqlite3SrcListAppend(db, 0, 0, 0);
+ if( pSrc ){
+ struct SrcList_item *pItem = pSrc->a;
+ pItem->pTab = pFKey->pFrom;
+ pItem->zName = pFKey->pFrom->zName;
+ pItem->pTab->nRef++;
+ pItem->iCursor = pParse->nTab++;
+
+ if( regNew!=0 ){
+ fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1);
+ }
+ if( regOld!=0 ){
+ /* If there is a RESTRICT action configured for the current operation
+ ** on the parent table of this FK, then throw an exception
+ ** immediately if the FK constraint is violated, even if this is a
+ ** deferred trigger. That's what RESTRICT means. To defer checking
+ ** the constraint, the FK should specify NO ACTION (represented
+ ** using OE_None). NO ACTION is the default. */
+ fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1);
+ }
+ pItem->zName = 0;
+ sqlite3SrcListDelete(db, pSrc);
+ }
+ sqlite3DbFree(db, aiCol);
+ }
+}
+
+#define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x)))
+
+/*
+** This function is called before generating code to update or delete a
+** row contained in table pTab.
+*/
+SQLITE_PRIVATE u32 sqlite3FkOldmask(
+ Parse *pParse, /* Parse context */
+ Table *pTab /* Table being modified */
+){
+ u32 mask = 0;
+ if( pParse->db->flags&SQLITE_ForeignKeys ){
+ FKey *p;
+ int i;
+ for(p=pTab->pFKey; p; p=p->pNextFrom){
+ for(i=0; i<p->nCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom);
+ }
+ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
+ Index *pIdx = 0;
+ locateFkeyIndex(pParse, pTab, p, &pIdx, 0);
+ if( pIdx ){
+ for(i=0; i<pIdx->nColumn; i++) mask |= COLUMN_MASK(pIdx->aiColumn[i]);
+ }
+ }
+ }
+ return mask;
+}
+
+/*
+** This function is called before generating code to update or delete a
+** row contained in table pTab. If the operation is a DELETE, then
+** parameter aChange is passed a NULL value. For an UPDATE, aChange points
+** to an array of size N, where N is the number of columns in table pTab.
+** If the i'th column is not modified by the UPDATE, then the corresponding
+** entry in the aChange[] array is set to -1. If the column is modified,
+** the value is 0 or greater. Parameter chngRowid is set to true if the
+** UPDATE statement modifies the rowid fields of the table.
+**
+** If any foreign key processing will be required, this function returns
+** true. If there is no foreign key related processing, this function
+** returns false.
+*/
+SQLITE_PRIVATE int sqlite3FkRequired(
+ Parse *pParse, /* Parse context */
+ Table *pTab, /* Table being modified */
+ int *aChange, /* Non-NULL for UPDATE operations */
+ int chngRowid /* True for UPDATE that affects rowid */
+){
+ if( pParse->db->flags&SQLITE_ForeignKeys ){
+ if( !aChange ){
+ /* A DELETE operation. Foreign key processing is required if the
+ ** table in question is either the child or parent table for any
+ ** foreign key constraint. */
+ return (sqlite3FkReferences(pTab) || pTab->pFKey);
+ }else{
+ /* This is an UPDATE. Foreign key processing is only required if the
+ ** operation modifies one or more child or parent key columns. */
+ int i;
+ FKey *p;
+
+ /* Check if any child key columns are being modified. */
+ for(p=pTab->pFKey; p; p=p->pNextFrom){
+ for(i=0; i<p->nCol; i++){
+ int iChildKey = p->aCol[i].iFrom;
+ if( aChange[iChildKey]>=0 ) return 1;
+ if( iChildKey==pTab->iPKey && chngRowid ) return 1;
+ }
+ }
+
+ /* Check if any parent key columns are being modified. */
+ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
+ for(i=0; i<p->nCol; i++){
+ char *zKey = p->aCol[i].zCol;
+ int iKey;
+ for(iKey=0; iKey<pTab->nCol; iKey++){
+ Column *pCol = &pTab->aCol[iKey];
+ if( (zKey ? !sqlite3StrICmp(pCol->zName, zKey) : pCol->isPrimKey) ){
+ if( aChange[iKey]>=0 ) return 1;
+ if( iKey==pTab->iPKey && chngRowid ) return 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*
+** This function is called when an UPDATE or DELETE operation is being
+** compiled on table pTab, which is the parent table of foreign-key pFKey.
+** If the current operation is an UPDATE, then the pChanges parameter is
+** passed a pointer to the list of columns being modified. If it is a
+** DELETE, pChanges is passed a NULL pointer.
+**
+** It returns a pointer to a Trigger structure containing a trigger
+** equivalent to the ON UPDATE or ON DELETE action specified by pFKey.
+** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is
+** returned (these actions require no special handling by the triggers
+** sub-system, code for them is created by fkScanChildren()).
+**
+** For example, if pFKey is the foreign key and pTab is table "p" in
+** the following schema:
+**
+** CREATE TABLE p(pk PRIMARY KEY);
+** CREATE TABLE c(ck REFERENCES p ON DELETE CASCADE);
+**
+** then the returned trigger structure is equivalent to:
+**
+** CREATE TRIGGER ... DELETE ON p BEGIN
+** DELETE FROM c WHERE ck = old.pk;
+** END;
+**
+** The returned pointer is cached as part of the foreign key object. It
+** is eventually freed along with the rest of the foreign key object by
+** sqlite3FkDelete().
+*/
+static Trigger *fkActionTrigger(
+ Parse *pParse, /* Parse context */
+ Table *pTab, /* Table being updated or deleted from */
+ FKey *pFKey, /* Foreign key to get action for */
+ ExprList *pChanges /* Change-list for UPDATE, NULL for DELETE */
+){
+ sqlite3 *db = pParse->db; /* Database handle */
+ int action; /* One of OE_None, OE_Cascade etc. */
+ Trigger *pTrigger; /* Trigger definition to return */
+ int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */
+
+ action = pFKey->aAction[iAction];
+ pTrigger = pFKey->apTrigger[iAction];
+
+ if( action!=OE_None && !pTrigger ){
+ u8 enableLookaside; /* Copy of db->lookaside.bEnabled */
+ char const *zFrom; /* Name of child table */
+ int nFrom; /* Length in bytes of zFrom */
+ Index *pIdx = 0; /* Parent key index for this FK */
+ int *aiCol = 0; /* child table cols -> parent key cols */
+ TriggerStep *pStep = 0; /* First (only) step of trigger program */
+ Expr *pWhere = 0; /* WHERE clause of trigger step */
+ ExprList *pList = 0; /* Changes list if ON UPDATE CASCADE */
+ Select *pSelect = 0; /* If RESTRICT, "SELECT RAISE(...)" */
+ int i; /* Iterator variable */
+ Expr *pWhen = 0; /* WHEN clause for the trigger */
+
+ if( locateFkeyIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ) return 0;
+ assert( aiCol || pFKey->nCol==1 );
+
+ for(i=0; i<pFKey->nCol; i++){
+ Token tOld = { "old", 3 }; /* Literal "old" token */
+ Token tNew = { "new", 3 }; /* Literal "new" token */
+ Token tFromCol; /* Name of column in child table */
+ Token tToCol; /* Name of column in parent table */
+ int iFromCol; /* Idx of column in child table */
+ Expr *pEq; /* tFromCol = OLD.tToCol */
+
+ iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom;
+ assert( iFromCol>=0 );
+ tToCol.z = pIdx ? pTab->aCol[pIdx->aiColumn[i]].zName : "oid";
+ tFromCol.z = pFKey->pFrom->aCol[iFromCol].zName;
+
+ tToCol.n = sqlite3Strlen30(tToCol.z);
+ tFromCol.n = sqlite3Strlen30(tFromCol.z);
+
+ /* Create the expression "OLD.zToCol = zFromCol". It is important
+ ** that the "OLD.zToCol" term is on the LHS of the = operator, so
+ ** that the affinity and collation sequence associated with the
+ ** parent table are used for the comparison. */
+ pEq = sqlite3PExpr(pParse, TK_EQ,
+ sqlite3PExpr(pParse, TK_DOT,
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld),
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol)
+ , 0),
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tFromCol)
+ , 0);
+ pWhere = sqlite3ExprAnd(db, pWhere, pEq);
+
+ /* For ON UPDATE, construct the next term of the WHEN clause.
+ ** The final WHEN clause will be like this:
+ **
+ ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN)
+ */
+ if( pChanges ){
+ pEq = sqlite3PExpr(pParse, TK_IS,
+ sqlite3PExpr(pParse, TK_DOT,
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld),
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol),
+ 0),
+ sqlite3PExpr(pParse, TK_DOT,
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew),
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol),
+ 0),
+ 0);
+ pWhen = sqlite3ExprAnd(db, pWhen, pEq);
+ }
+
+ if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){
+ Expr *pNew;
+ if( action==OE_Cascade ){
+ pNew = sqlite3PExpr(pParse, TK_DOT,
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew),
+ sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol)
+ , 0);
+ }else if( action==OE_SetDflt ){
+ Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt;
+ if( pDflt ){
+ pNew = sqlite3ExprDup(db, pDflt, 0);
+ }else{
+ pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0);
+ }
+ }else{
+ pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0);
+ }
+ pList = sqlite3ExprListAppend(pParse, pList, pNew);
+ sqlite3ExprListSetName(pParse, pList, &tFromCol, 0);
+ }
+ }
+ sqlite3DbFree(db, aiCol);
+
+ zFrom = pFKey->pFrom->zName;
+ nFrom = sqlite3Strlen30(zFrom);
+
+ if( action==OE_Restrict ){
+ Token tFrom;
+ Expr *pRaise;
+
+ tFrom.z = zFrom;
+ tFrom.n = nFrom;
+ pRaise = sqlite3Expr(db, TK_RAISE, "foreign key constraint failed");
+ if( pRaise ){
+ pRaise->affinity = OE_Abort;
+ }
+ pSelect = sqlite3SelectNew(pParse,
+ sqlite3ExprListAppend(pParse, 0, pRaise),
+ sqlite3SrcListAppend(db, 0, &tFrom, 0),
+ pWhere,
+ 0, 0, 0, 0, 0, 0
+ );
+ pWhere = 0;
+ }
+
+ /* In the current implementation, pTab->dbMem==0 for all tables except
+ ** for temporary tables used to describe subqueries. And temporary
+ ** tables do not have foreign key constraints. Hence, pTab->dbMem
+ ** should always be 0 there.
+ */
+ enableLookaside = db->lookaside.bEnabled;
+ db->lookaside.bEnabled = 0;
+
+ pTrigger = (Trigger *)sqlite3DbMallocZero(db,
+ sizeof(Trigger) + /* struct Trigger */
+ sizeof(TriggerStep) + /* Single step in trigger program */
+ nFrom + 1 /* Space for pStep->target.z */
+ );
+ if( pTrigger ){
+ pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1];
+ pStep->target.z = (char *)&pStep[1];
+ pStep->target.n = nFrom;
+ memcpy((char *)pStep->target.z, zFrom, nFrom);
+
+ pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE);
+ pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
+ if( pWhen ){
+ pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0, 0);
+ pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
+ }
+ }
+
+ /* Re-enable the lookaside buffer, if it was disabled earlier. */
+ db->lookaside.bEnabled = enableLookaside;
+
+ sqlite3ExprDelete(db, pWhere);
+ sqlite3ExprDelete(db, pWhen);
+ sqlite3ExprListDelete(db, pList);
+ sqlite3SelectDelete(db, pSelect);
+ if( db->mallocFailed==1 ){
+ fkTriggerDelete(db, pTrigger);
+ return 0;
+ }
+
+ switch( action ){
+ case OE_Restrict:
+ pStep->op = TK_SELECT;
+ break;
+ case OE_Cascade:
+ if( !pChanges ){
+ pStep->op = TK_DELETE;
+ break;
+ }
+ default:
+ pStep->op = TK_UPDATE;
+ }
+ pStep->pTrig = pTrigger;
+ pTrigger->pSchema = pTab->pSchema;
+ pTrigger->pTabSchema = pTab->pSchema;
+ pFKey->apTrigger[iAction] = pTrigger;
+ pTrigger->op = (pChanges ? TK_UPDATE : TK_DELETE);
+ }
+
+ return pTrigger;
+}
+
+/*
+** This function is called when deleting or updating a row to implement
+** any required CASCADE, SET NULL or SET DEFAULT actions.
+*/
+SQLITE_PRIVATE void sqlite3FkActions(
+ Parse *pParse, /* Parse context */
+ Table *pTab, /* Table being updated or deleted from */
+ ExprList *pChanges, /* Change-list for UPDATE, NULL for DELETE */
+ int regOld /* Address of array containing old row */
+){
+ /* If foreign-key support is enabled, iterate through all FKs that
+ ** refer to table pTab. If there is an action associated with the FK
+ ** for this operation (either update or delete), invoke the associated
+ ** trigger sub-program. */
+ if( pParse->db->flags&SQLITE_ForeignKeys ){
+ FKey *pFKey; /* Iterator variable */
+ for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){
+ Trigger *pAction = fkActionTrigger(pParse, pTab, pFKey, pChanges);
+ if( pAction ){
+ sqlite3CodeRowTriggerDirect(pParse, pAction, pTab, regOld, OE_Abort, 0);
+ }
+ }
+ }
+}
+
+#endif /* ifndef SQLITE_OMIT_TRIGGER */
+
+/*
+** Free all memory associated with foreign key definitions attached to
+** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash
+** hash table.
+*/
+SQLITE_PRIVATE void sqlite3FkDelete(Table *pTab){
+ FKey *pFKey; /* Iterator variable */
+ FKey *pNext; /* Copy of pFKey->pNextFrom */
+
+ for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){
+
+ /* Remove the FK from the fkeyHash hash table. */
+ if( pFKey->pPrevTo ){
+ pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
+ }else{
+ void *data = (void *)pFKey->pNextTo;
+ const char *z = (data ? pFKey->pNextTo->zTo : pFKey->zTo);
+ sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, sqlite3Strlen30(z), data);
+ }
+ if( pFKey->pNextTo ){
+ pFKey->pNextTo->pPrevTo = pFKey->pPrevTo;
+ }
+
+ /* Delete any triggers created to implement actions for this FK. */
+#ifndef SQLITE_OMIT_TRIGGER
+ fkTriggerDelete(pTab->dbMem, pFKey->apTrigger[0]);
+ fkTriggerDelete(pTab->dbMem, pFKey->apTrigger[1]);
+#endif
+
+ /* EV: R-30323-21917 Each foreign key constraint in SQLite is
+ ** classified as either immediate or deferred.
+ */
+ assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 );
+
+ pNext = pFKey->pNextFrom;
+ sqlite3DbFree(pTab->dbMem, pFKey);
+ }
+}
+#endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */
+
+/************** End of fkey.c ************************************************/
/************** Begin file insert.c ******************************************/
/*
** 2001 September 15
@@ -58665,13 +73309,33 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas
** This file contains C code routines that are called by the parser
** to handle INSERT statements in SQLite.
**
-** $Id: insert.c,v 1.238 2008/04/28 18:46:43 drh Exp $
+** $Id: insert.c,v 1.270 2009/07/24 17:58:53 danielk1977 Exp $
*/
/*
-** Set P4 of the most recently inserted opcode to a column affinity
-** string for index pIdx. A column affinity string has one character
-** for each column in the table, according to the affinity of the column:
+** Generate code that will open a table for reading.
+*/
+SQLITE_PRIVATE void sqlite3OpenTable(
+ Parse *p, /* Generate code into this VDBE */
+ int iCur, /* The cursor number of the table */
+ int iDb, /* The database index in sqlite3.aDb[] */
+ Table *pTab, /* The table to be opened */
+ int opcode /* OP_OpenRead or OP_OpenWrite */
+){
+ Vdbe *v;
+ if( IsVirtual(pTab) ) return;
+ v = sqlite3GetVdbe(p);
+ assert( opcode==OP_OpenWrite || opcode==OP_OpenRead );
+ sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName);
+ sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb);
+ sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(pTab->nCol), P4_INT32);
+ VdbeComment((v, "%s", pTab->zName));
+}
+
+/*
+** Return a pointer to the column affinity string associated with index
+** pIdx. A column affinity string has one character for each column in
+** the table, according to the affinity of the column:
**
** Character Column affinity
** ------------------------------
@@ -58683,8 +73347,12 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas
**
** An extra 'b' is appended to the end of the string to cover the
** rowid that appears as the last column in every index.
+**
+** Memory for the buffer containing the column index affinity string
+** is managed along with the rest of the Index structure. It will be
+** released when sqlite3DeleteIndex() is called.
*/
-SQLITE_PRIVATE void sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
+SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
if( !pIdx->zColAff ){
/* The first time a column affinity string for a particular index is
** required, it is allocated and populated here. It is then stored as
@@ -58697,9 +73365,10 @@ SQLITE_PRIVATE void sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
int n;
Table *pTab = pIdx->pTable;
sqlite3 *db = sqlite3VdbeDb(v);
- pIdx->zColAff = (char *)sqlite3DbMallocRaw(db, pIdx->nColumn+2);
+ pIdx->zColAff = (char *)sqlite3Malloc(pIdx->nColumn+2);
if( !pIdx->zColAff ){
- return;
+ db->mallocFailed = 1;
+ return 0;
}
for(n=0; n<pIdx->nColumn; n++){
pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity;
@@ -58708,7 +73377,7 @@ SQLITE_PRIVATE void sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
pIdx->zColAff[n] = 0;
}
- sqlite3VdbeChangeP4(v, -1, pIdx->zColAff, 0);
+ return pIdx->zColAff;
}
/*
@@ -58738,8 +73407,9 @@ SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){
int i;
sqlite3 *db = sqlite3VdbeDb(v);
- zColAff = (char *)sqlite3DbMallocRaw(db, pTab->nCol+1);
+ zColAff = (char *)sqlite3Malloc(pTab->nCol+1);
if( !zColAff ){
+ db->mallocFailed = 1;
return;
}
@@ -58761,9 +73431,14 @@ SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){
** a statement of the form "INSERT INTO <iDb, pTab> SELECT ..." can
** run without using temporary table for the results of the SELECT.
*/
-static int readsTable(Vdbe *v, int iStartAddr, int iDb, Table *pTab){
+static int readsTable(Parse *p, int iStartAddr, int iDb, Table *pTab){
+ Vdbe *v = sqlite3GetVdbe(p);
int i;
int iEnd = sqlite3VdbeCurrentAddr(v);
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0;
+#endif
+
for(i=iStartAddr; i<iEnd; i++){
VdbeOp *pOp = sqlite3VdbeGetOp(v, i);
assert( pOp!=0 );
@@ -58780,7 +73455,7 @@ static int readsTable(Vdbe *v, int iStartAddr, int iDb, Table *pTab){
}
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pTab->pVtab ){
+ if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){
assert( pOp->p4.pVtab!=0 );
assert( pOp->p4type==P4_VTAB );
return 1;
@@ -58792,22 +73467,24 @@ static int readsTable(Vdbe *v, int iStartAddr, int iDb, Table *pTab){
#ifndef SQLITE_OMIT_AUTOINCREMENT
/*
-** Write out code to initialize the autoincrement logic. This code
-** looks up the current autoincrement value in the sqlite_sequence
-** table and stores that value in a register. Code generated by
-** autoIncStep() will keep that register holding the largest
-** rowid value. Code generated by autoIncEnd() will write the new
-** largest value of the counter back into the sqlite_sequence table.
+** Locate or create an AutoincInfo structure associated with table pTab
+** which is in database iDb. Return the register number for the register
+** that holds the maximum rowid.
+**
+** There is at most one AutoincInfo structure per table even if the
+** same table is autoincremented multiple times due to inserts within
+** triggers. A new AutoincInfo structure is created if this is the
+** first use of table pTab. On 2nd and subsequent uses, the original
+** AutoincInfo structure is used.
**
-** This routine returns the index of the mem[] cell that contains
-** the maximum rowid counter.
+** Three memory locations are allocated:
**
-** Three consecutive registers are allocated by this routine. The
-** first two hold the name of the target table and the maximum rowid
-** inserted into the target table, respectively.
-** The third holds the rowid in sqlite_sequence where we will
-** write back the revised maximum rowid. This routine returns the
-** index of the second of these three registers.
+** (1) Register to hold the name of the pTab table.
+** (2) Register to hold the maximum ROWID of pTab.
+** (3) Register to hold the rowid in sqlite_sequence of pTab
+**
+** The 2nd register is the one that is returned. That is all the
+** insert routine needs to know about.
*/
static int autoIncBegin(
Parse *pParse, /* Parsing context */
@@ -58815,29 +73492,63 @@ static int autoIncBegin(
Table *pTab /* The table we are writing to */
){
int memId = 0; /* Register holding maximum rowid */
- if( pTab->autoInc ){
- Vdbe *v = pParse->pVdbe;
- Db *pDb = &pParse->db->aDb[iDb];
- int iCur = pParse->nTab;
- int addr; /* Address of the top of the loop */
- assert( v );
- pParse->nMem++; /* Holds name of table */
- memId = ++pParse->nMem;
- pParse->nMem++;
- sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenRead);
+ if( pTab->tabFlags & TF_Autoincrement ){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
+ AutoincInfo *pInfo;
+
+ pInfo = pToplevel->pAinc;
+ while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; }
+ if( pInfo==0 ){
+ pInfo = sqlite3DbMallocRaw(pParse->db, sizeof(*pInfo));
+ if( pInfo==0 ) return 0;
+ pInfo->pNext = pToplevel->pAinc;
+ pToplevel->pAinc = pInfo;
+ pInfo->pTab = pTab;
+ pInfo->iDb = iDb;
+ pToplevel->nMem++; /* Register to hold name of table */
+ pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */
+ pToplevel->nMem++; /* Rowid in sqlite_sequence */
+ }
+ memId = pInfo->regCtr;
+ }
+ return memId;
+}
+
+/*
+** This routine generates code that will initialize all of the
+** register used by the autoincrement tracker.
+*/
+SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
+ AutoincInfo *p; /* Information about an AUTOINCREMENT */
+ sqlite3 *db = pParse->db; /* The database connection */
+ Db *pDb; /* Database only autoinc table */
+ int memId; /* Register holding max rowid */
+ int addr; /* A VDBE address */
+ Vdbe *v = pParse->pVdbe; /* VDBE under construction */
+
+ /* This routine is never called during trigger-generation. It is
+ ** only called from the top-level */
+ assert( pParse->pTriggerTab==0 );
+ assert( pParse==sqlite3ParseToplevel(pParse) );
+
+ assert( v ); /* We failed long ago if this is not so */
+ for(p = pParse->pAinc; p; p = p->pNext){
+ pDb = &db->aDb[p->iDb];
+ memId = p->regCtr;
+ sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead);
addr = sqlite3VdbeCurrentAddr(v);
- sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, pTab->zName, 0);
- sqlite3VdbeAddOp2(v, OP_Rewind, iCur, addr+8);
- sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, memId);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0);
+ sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9);
+ sqlite3VdbeAddOp3(v, OP_Column, 0, 0, memId);
sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId);
sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
- sqlite3VdbeAddOp2(v, OP_Rowid, iCur, memId+1);
- sqlite3VdbeAddOp3(v, OP_Column, iCur, 1, memId);
- sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+8);
- sqlite3VdbeAddOp2(v, OP_Next, iCur, addr+2);
- sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
+ sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1);
+ sqlite3VdbeAddOp3(v, OP_Column, 0, 1, memId);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+9);
+ sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, memId);
+ sqlite3VdbeAddOp0(v, OP_Close);
}
- return memId;
}
/*
@@ -58855,32 +73566,43 @@ static void autoIncStep(Parse *pParse, int memId, int regRowid){
}
/*
-** After doing one or more inserts, the maximum rowid is stored
-** in reg[memId]. Generate code to write this value back into the
-** the sqlite_sequence table.
+** This routine generates the code needed to write autoincrement
+** maximum rowid values back into the sqlite_sequence register.
+** Every statement that might do an INSERT into an autoincrement
+** table (either directly or through triggers) needs to call this
+** routine just before the "exit" code.
*/
-static void autoIncEnd(
- Parse *pParse, /* The parsing context */
- int iDb, /* Index of the database holding pTab */
- Table *pTab, /* Table we are inserting into */
- int memId /* Memory cell holding the maximum rowid */
-){
- if( pTab->autoInc ){
- int iCur = pParse->nTab;
- Vdbe *v = pParse->pVdbe;
- Db *pDb = &pParse->db->aDb[iDb];
- int j1;
- int iRec = ++pParse->nMem; /* Memory cell used for record */
+SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){
+ AutoincInfo *p;
+ Vdbe *v = pParse->pVdbe;
+ sqlite3 *db = pParse->db;
- assert( v );
- sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenWrite);
+ assert( v );
+ for(p = pParse->pAinc; p; p = p->pNext){
+ Db *pDb = &db->aDb[p->iDb];
+ int j1, j2, j3, j4, j5;
+ int iRec;
+ int memId = p->regCtr;
+
+ iRec = sqlite3GetTempReg(pParse);
+ sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite);
j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1);
- sqlite3VdbeAddOp2(v, OP_NewRowid, iCur, memId+1);
+ j2 = sqlite3VdbeAddOp0(v, OP_Rewind);
+ j3 = sqlite3VdbeAddOp3(v, OP_Column, 0, 0, iRec);
+ j4 = sqlite3VdbeAddOp3(v, OP_Eq, memId-1, 0, iRec);
+ sqlite3VdbeAddOp2(v, OP_Next, 0, j3);
+ sqlite3VdbeJumpHere(v, j2);
+ sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1);
+ j5 = sqlite3VdbeAddOp0(v, OP_Goto);
+ sqlite3VdbeJumpHere(v, j4);
+ sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1);
sqlite3VdbeJumpHere(v, j1);
+ sqlite3VdbeJumpHere(v, j5);
sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec);
- sqlite3VdbeAddOp3(v, OP_Insert, iCur, iRec, memId+1);
+ sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1);
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
- sqlite3VdbeAddOp1(v, OP_Close, iCur);
+ sqlite3VdbeAddOp0(v, OP_Close);
+ sqlite3ReleaseTempReg(pParse, iRec);
}
}
#else
@@ -58890,7 +73612,6 @@ static void autoIncEnd(
*/
# define autoIncBegin(A,B,C) (0)
# define autoIncStep(A,B,C)
-# define autoIncEnd(A,B,C,D)
#endif /* SQLITE_OMIT_AUTOINCREMENT */
@@ -58920,7 +73641,8 @@ static int xferOptimization(
**
** The code generated follows one of four templates. For a simple
** select with data coming from a VALUES clause, the code executes
-** once straight down through. The template looks like this:
+** once straight down through. Pseudo-code follows (we call this
+** the "1st template"):
**
** open write cursor to <table> and its indices
** puts VALUES clause expressions onto the stack
@@ -58938,7 +73660,7 @@ static int xferOptimization(
** schemas, including all the same indices, then a special optimization
** is invoked that copies raw records from <table2> over to <table1>.
** See the xferOptimization() function for the implementation of this
-** template. This is the second template.
+** template. This is the 2nd template.
**
** open a write cursor to <table>
** open read cursor on <table2>
@@ -58951,45 +73673,58 @@ static int xferOptimization(
** close cursors
** end foreach
**
-** The third template is for when the second template does not apply
+** The 3rd template is for when the second template does not apply
** and the SELECT clause does not read from <table> at any time.
** The generated code follows this template:
**
+** EOF <- 0
+** X <- A
** goto B
** A: setup for the SELECT
** loop over the rows in the SELECT
-** gosub C
+** load values into registers R..R+n
+** yield X
** end loop
** cleanup after the SELECT
-** goto D
-** B: open write cursor to <table> and its indices
+** EOF <- 1
+** yield X
** goto A
-** C: insert the select result into <table>
-** return
+** B: open write cursor to <table> and its indices
+** C: yield X
+** if EOF goto D
+** insert the select result into <table> from R..R+n
+** goto C
** D: cleanup
**
-** The fourth template is used if the insert statement takes its
+** The 4th template is used if the insert statement takes its
** values from a SELECT but the data is being inserted into a table
** that is also read as part of the SELECT. In the third form,
** we have to use a intermediate table to store the results of
** the select. The template is like this:
**
+** EOF <- 0
+** X <- A
** goto B
** A: setup for the SELECT
** loop over the tables in the SELECT
-** gosub C
+** load value into register R..R+n
+** yield X
** end loop
** cleanup after the SELECT
-** goto D
-** C: insert the select result into the intermediate table
-** return
-** B: open a cursor to an intermediate table
-** goto A
-** D: open write cursor to <table> and its indices
-** loop over the intermediate table
+** EOF <- 1
+** yield X
+** halt-error
+** B: open temp table
+** L: yield X
+** if EOF goto M
+** insert row from R..R+n into temp table
+** goto L
+** M: open write cursor to <table> and its indices
+** rewind temp table
+** C: loop over rows of intermediate table
** transfer values form intermediate table into <table>
-** end the loop
-** cleanup
+** end loop
+** D: cleanup
*/
SQLITE_PRIVATE void sqlite3Insert(
Parse *pParse, /* Parser context */
@@ -59013,32 +73748,33 @@ SQLITE_PRIVATE void sqlite3Insert(
int endOfLoop; /* Label for the end of the insertion loop */
int useTempTable = 0; /* Store SELECT results in intermediate table */
int srcTab = 0; /* Data comes from this temporary cursor if >=0 */
- int iCont=0,iBreak=0; /* Beginning and end of the loop over srcTab */
- int iSelectLoop = 0; /* Address of code that implements the SELECT */
- int iCleanup = 0; /* Address of the cleanup code */
- int iInsertBlock = 0; /* Address of the subroutine used to insert data */
- int newIdx = -1; /* Cursor for the NEW pseudo-table */
+ int addrInsTop = 0; /* Jump to label "D" */
+ int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */
+ int addrSelect = 0; /* Address of coroutine that implements the SELECT */
+ SelectDest dest; /* Destination for SELECT on rhs of INSERT */
int iDb; /* Index of database holding TABLE */
Db *pDb; /* The database containing table being inserted into */
int appendFlag = 0; /* True if the insert is likely to be an append */
/* Register allocations */
- int regFromSelect; /* Base register for data coming from SELECT */
+ int regFromSelect = 0;/* Base register for data coming from SELECT */
int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */
int regRowCount = 0; /* Memory cell used for the row counter */
int regIns; /* Block of regs holding rowid+data being inserted */
int regRowid; /* registers holding insert rowid */
int regData; /* register holding first column to insert */
int regRecord; /* Holds the assemblied row record */
+ int regEof = 0; /* Register recording end of SELECT data */
int *aRegIdx = 0; /* One register allocated to each index */
-
#ifndef SQLITE_OMIT_TRIGGER
int isView; /* True if attempting to insert into a view */
- int triggers_exist = 0; /* True if there are FOR EACH ROW triggers */
+ Trigger *pTrigger; /* List of triggers on pTab, if required */
+ int tmask; /* Mask of trigger times */
#endif
db = pParse->db;
+ memset(&dest, 0, sizeof(dest));
if( pParse->nErr || db->mallocFailed ){
goto insert_cleanup;
}
@@ -59047,7 +73783,7 @@ SQLITE_PRIVATE void sqlite3Insert(
*/
assert( pTabList->nSrc==1 );
zTab = pTabList->a[0].zName;
- if( zTab==0 ) goto insert_cleanup;
+ if( NEVER(zTab==0) ) goto insert_cleanup;
pTab = sqlite3SrcListLookup(pParse, pTabList);
if( pTab==0 ){
goto insert_cleanup;
@@ -59064,25 +73800,18 @@ SQLITE_PRIVATE void sqlite3Insert(
** inserted into is a view
*/
#ifndef SQLITE_OMIT_TRIGGER
- triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0);
+ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask);
isView = pTab->pSelect!=0;
#else
-# define triggers_exist 0
+# define pTrigger 0
+# define tmask 0
# define isView 0
#endif
#ifdef SQLITE_OMIT_VIEW
# undef isView
# define isView 0
#endif
-
- /* Ensure that:
- * (a) the table is not read-only,
- * (b) that if it is a view then ON INSERT triggers exist
- */
- if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){
- goto insert_cleanup;
- }
- assert( pTab!=0 );
+ assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) );
/* If pTab is really a view, make sure it has been initialized.
** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual
@@ -59092,17 +73821,20 @@ SQLITE_PRIVATE void sqlite3Insert(
goto insert_cleanup;
}
+ /* Ensure that:
+ * (a) the table is not read-only,
+ * (b) that if it is a view then ON INSERT triggers exist
+ */
+ if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
+ goto insert_cleanup;
+ }
+
/* Allocate a VDBE
*/
v = sqlite3GetVdbe(pParse);
if( v==0 ) goto insert_cleanup;
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
- sqlite3BeginWriteOperation(pParse, pSelect || triggers_exist, iDb);
-
- /* if there are row triggers, allocate a temp table for new.* references. */
- if( triggers_exist ){
- newIdx = pParse->nTab++;
- }
+ sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb);
#ifndef SQLITE_OMIT_XFER_OPT
/* If the statement is of the form
@@ -59111,11 +73843,13 @@ SQLITE_PRIVATE void sqlite3Insert(
**
** Then special optimizations can be applied that make the transfer
** very fast and which reduce fragmentation of indices.
+ **
+ ** This is the 2nd template.
*/
if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
- assert( !triggers_exist );
+ assert( !pTrigger );
assert( pList==0 );
- goto insert_cleanup;
+ goto insert_end;
}
#endif /* SQLITE_OMIT_XFER_OPT */
@@ -59125,75 +73859,104 @@ SQLITE_PRIVATE void sqlite3Insert(
regAutoinc = autoIncBegin(pParse, iDb, pTab);
/* Figure out how many columns of data are supplied. If the data
- ** is coming from a SELECT statement, then this step also generates
- ** all the code to implement the SELECT statement and invoke a subroutine
- ** to process each row of the result. (Template 2.) If the SELECT
- ** statement uses the the table that is being inserted into, then the
- ** subroutine is also coded here. That subroutine stores the SELECT
- ** results in a temporary table. (Template 3.)
+ ** is coming from a SELECT statement, then generate a co-routine that
+ ** produces a single row of the SELECT on each invocation. The
+ ** co-routine is the common header to the 3rd and 4th templates.
*/
if( pSelect ){
/* Data is coming from a SELECT. Generate code to implement that SELECT
+ ** as a co-routine. The code is common to both the 3rd and 4th
+ ** templates:
+ **
+ ** EOF <- 0
+ ** X <- A
+ ** goto B
+ ** A: setup for the SELECT
+ ** loop over the tables in the SELECT
+ ** load value into register R..R+n
+ ** yield X
+ ** end loop
+ ** cleanup after the SELECT
+ ** EOF <- 1
+ ** yield X
+ ** halt-error
+ **
+ ** On each invocation of the co-routine, it puts a single row of the
+ ** SELECT result into registers dest.iMem...dest.iMem+dest.nMem-1.
+ ** (These output registers are allocated by sqlite3Select().) When
+ ** the SELECT completes, it sets the EOF flag stored in regEof.
*/
- SelectDest dest;
- int rc, iInitCode;
+ int rc, j1;
- iInitCode = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
- iSelectLoop = sqlite3VdbeCurrentAddr(v);
- iInsertBlock = sqlite3VdbeMakeLabel(v);
- sqlite3SelectDestInit(&dest, SRT_Subroutine, iInsertBlock);
+ regEof = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regEof); /* EOF <- 0 */
+ VdbeComment((v, "SELECT eof flag"));
+ sqlite3SelectDestInit(&dest, SRT_Coroutine, ++pParse->nMem);
+ addrSelect = sqlite3VdbeCurrentAddr(v)+2;
+ sqlite3VdbeAddOp2(v, OP_Integer, addrSelect-1, dest.iParm);
+ j1 = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
+ VdbeComment((v, "Jump over SELECT coroutine"));
/* Resolve the expressions in the SELECT statement and execute it. */
- rc = sqlite3Select(pParse, pSelect, &dest, 0, 0, 0, 0);
- if( rc || pParse->nErr || db->mallocFailed ){
+ rc = sqlite3Select(pParse, pSelect, &dest);
+ assert( pParse->nErr==0 || rc );
+ if( rc || NEVER(pParse->nErr) || db->mallocFailed ){
goto insert_cleanup;
}
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, regEof); /* EOF <- 1 */
+ sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm); /* yield X */
+ sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_INTERNAL, OE_Abort);
+ VdbeComment((v, "End of SELECT coroutine"));
+ sqlite3VdbeJumpHere(v, j1); /* label B: */
regFromSelect = dest.iMem;
- iCleanup = sqlite3VdbeMakeLabel(v);
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iCleanup);
assert( pSelect->pEList );
nColumn = pSelect->pEList->nExpr;
+ assert( dest.nMem==nColumn );
/* Set useTempTable to TRUE if the result of the SELECT statement
- ** should be written into a temporary table. Set to FALSE if each
- ** row of the SELECT can be written directly into the result table.
+ ** should be written into a temporary table (template 4). Set to
+ ** FALSE if each* row of the SELECT can be written directly into
+ ** the destination table (template 3).
**
** A temp table must be used if the table being updated is also one
** of the tables being read by the SELECT statement. Also use a
** temp table in the case of row triggers.
*/
- if( triggers_exist || readsTable(v, iSelectLoop, iDb, pTab) ){
+ if( pTrigger || readsTable(pParse, addrSelect, iDb, pTab) ){
useTempTable = 1;
}
if( useTempTable ){
- /* Generate the subroutine that SELECT calls to process each row of
- ** the result. Store the result in a temporary table
+ /* Invoke the coroutine to extract information from the SELECT
+ ** and add it to a transient table srcTab. The code generated
+ ** here is from the 4th template:
+ **
+ ** B: open temp table
+ ** L: yield X
+ ** if EOF goto M
+ ** insert row from R..R+n into temp table
+ ** goto L
+ ** M: ...
*/
- int regRec, regRowid;
+ int regRec; /* Register to hold packed record */
+ int regTempRowid; /* Register to hold temp table ROWID */
+ int addrTop; /* Label "L" */
+ int addrIf; /* Address of jump to M */
srcTab = pParse->nTab++;
regRec = sqlite3GetTempReg(pParse);
- regRowid = sqlite3GetTempReg(pParse);
- sqlite3VdbeResolveLabel(v, iInsertBlock);
+ regTempRowid = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn);
+ addrTop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm);
+ addrIf = sqlite3VdbeAddOp1(v, OP_If, regEof);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec);
- sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regRowid);
- sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regRowid);
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
+ sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid);
+ sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop);
+ sqlite3VdbeJumpHere(v, addrIf);
sqlite3ReleaseTempReg(pParse, regRec);
- sqlite3ReleaseTempReg(pParse, regRowid);
-
- /* The following code runs first because the GOTO at the very top
- ** of the program jumps to it. Create the temporary table, then jump
- ** back up and execute the SELECT code above.
- */
- sqlite3VdbeJumpHere(v, iInitCode);
- sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn);
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iSelectLoop);
- sqlite3VdbeResolveLabel(v, iCleanup);
- }else{
- sqlite3VdbeJumpHere(v, iInitCode);
+ sqlite3ReleaseTempReg(pParse, regTempRowid);
}
}else{
/* This is the case if the data for the INSERT is coming from a VALUES
@@ -59206,7 +73969,7 @@ SQLITE_PRIVATE void sqlite3Insert(
assert( useTempTable==0 );
nColumn = pList ? pList->nExpr : 0;
for(i=0; i<nColumn; i++){
- if( sqlite3ExprResolveNames(&sNC, pList->a[i].pExpr) ){
+ if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){
goto insert_cleanup;
}
}
@@ -59223,7 +73986,7 @@ SQLITE_PRIVATE void sqlite3Insert(
if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){
sqlite3ErrorMsg(pParse,
"table %S has %d columns but %d values were supplied",
- pTabList, 0, pTab->nCol, nColumn);
+ pTabList, 0, pTab->nCol-nHidden, nColumn);
goto insert_cleanup;
}
if( pColumn!=0 && nColumn!=pColumn->nId ){
@@ -59276,13 +74039,6 @@ SQLITE_PRIVATE void sqlite3Insert(
if( pColumn==0 && nColumn>0 ){
keyColumn = pTab->iPKey;
}
-
- /* Open the temp table for FOR EACH ROW triggers
- */
- if( triggers_exist ){
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol);
- sqlite3VdbeAddOp2(v, OP_OpenPseudo, newIdx, 0);
- }
/* Initialize the count of rows to be inserted
*/
@@ -59294,7 +74050,6 @@ SQLITE_PRIVATE void sqlite3Insert(
/* If this is not a view, open the table and and all indices */
if( !isView ){
int nIdx;
- int i;
baseCur = pParse->nTab;
nIdx = sqlite3OpenTableAndIndices(pParse, pTab, baseCur, OP_OpenWrite);
@@ -59307,18 +74062,31 @@ SQLITE_PRIVATE void sqlite3Insert(
}
}
- /* If the data source is a temporary table, then we have to create
- ** a loop because there might be multiple rows of data. If the data
- ** source is a subroutine call from the SELECT statement, then we need
- ** to launch the SELECT statement processing.
- */
+ /* This is the top of the main insertion loop */
if( useTempTable ){
- iBreak = sqlite3VdbeMakeLabel(v);
- sqlite3VdbeAddOp2(v, OP_Rewind, srcTab, iBreak);
- iCont = sqlite3VdbeCurrentAddr(v);
+ /* This block codes the top of loop only. The complete loop is the
+ ** following pseudocode (template 4):
+ **
+ ** rewind temp table
+ ** C: loop over rows of intermediate table
+ ** transfer values form intermediate table into <table>
+ ** end loop
+ ** D: ...
+ */
+ addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab);
+ addrCont = sqlite3VdbeCurrentAddr(v);
}else if( pSelect ){
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iSelectLoop);
- sqlite3VdbeResolveLabel(v, iInsertBlock);
+ /* This block codes the top of loop only. The complete loop is the
+ ** following pseudocode (template 3):
+ **
+ ** C: yield X
+ ** if EOF goto D
+ ** insert the select result into <table> from R..R+n
+ ** goto C
+ ** D: ...
+ */
+ addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm);
+ addrInsTop = sqlite3VdbeAddOp1(v, OP_If, regEof);
}
/* Allocate registers for holding the rowid of the new row,
@@ -59336,10 +74104,8 @@ SQLITE_PRIVATE void sqlite3Insert(
/* Run the BEFORE and INSTEAD OF triggers, if there are any
*/
endOfLoop = sqlite3VdbeMakeLabel(v);
- if( triggers_exist & TRIGGER_BEFORE ){
- int regRowid;
- int regCols;
- int regRec;
+ if( tmask & TRIGGER_BEFORE ){
+ int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1);
/* build the NEW.* reference row. Note that if there is an INTEGER
** PRIMARY KEY into which a NULL is being inserted, that NULL will be
@@ -59347,29 +74113,29 @@ SQLITE_PRIVATE void sqlite3Insert(
** we do not know what the unique ID will be (because the insert has
** not happened yet) so we substitute a rowid of -1
*/
- regRowid = sqlite3GetTempReg(pParse);
if( keyColumn<0 ){
- sqlite3VdbeAddOp2(v, OP_Integer, -1, regRowid);
- }else if( useTempTable ){
- sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regRowid);
+ sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols);
}else{
int j1;
- assert( pSelect==0 ); /* Otherwise useTempTable is true */
- sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regRowid);
- j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid);
- sqlite3VdbeAddOp2(v, OP_Integer, -1, regRowid);
+ if( useTempTable ){
+ sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regCols);
+ }else{
+ assert( pSelect==0 ); /* Otherwise useTempTable is true */
+ sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regCols);
+ }
+ j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols);
+ sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols);
sqlite3VdbeJumpHere(v, j1);
- sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid);
+ sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols);
}
/* Cannot have triggers on a virtual table. If it were possible,
** this block would have to account for hidden column.
*/
- assert(!IsVirtual(pTab));
+ assert( !IsVirtual(pTab) );
/* Create the new column data
*/
- regCols = sqlite3GetTempRange(pParse, pTab->nCol);
for(i=0; i<pTab->nCol; i++){
if( pColumn==0 ){
j = i;
@@ -59379,16 +74145,14 @@ SQLITE_PRIVATE void sqlite3Insert(
}
}
if( pColumn && j>=pColumn->nId ){
- sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i);
+ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1);
}else if( useTempTable ){
- sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i);
+ sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1);
}else{
assert( pSelect==0 ); /* Otherwise useTempTable is true */
- sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i);
+ sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1);
}
}
- regRec = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp3(v, OP_MakeRecord, regCols, pTab->nCol, regRec);
/* If this is an INSERT on a view with an INSTEAD OF INSERT trigger,
** do not attempt any conversions before assembling the record.
@@ -59396,18 +74160,15 @@ SQLITE_PRIVATE void sqlite3Insert(
** table column affinities.
*/
if( !isView ){
+ sqlite3VdbeAddOp2(v, OP_Affinity, regCols+1, pTab->nCol);
sqlite3TableAffinityStr(v, pTab);
}
- sqlite3VdbeAddOp3(v, OP_Insert, newIdx, regRec, regRowid);
- sqlite3ReleaseTempReg(pParse, regRec);
- sqlite3ReleaseTempReg(pParse, regRowid);
- sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol);
/* Fire BEFORE or INSTEAD OF triggers */
- if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_BEFORE, pTab,
- newIdx, -1, onError, endOfLoop, 0, 0) ){
- goto insert_cleanup;
- }
+ sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE,
+ pTab, regCols-pTab->nCol-1, onError, endOfLoop);
+
+ sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1);
}
/* Push the record number for the new entry onto the stack. The
@@ -59428,8 +74189,8 @@ SQLITE_PRIVATE void sqlite3Insert(
}else{
VdbeOp *pOp;
sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regRowid);
- pOp = sqlite3VdbeGetOp(v, sqlite3VdbeCurrentAddr(v) - 1);
- if( pOp && pOp->opcode==OP_Null ){
+ pOp = sqlite3VdbeGetOp(v, -1);
+ if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){
appendFlag = 1;
pOp->opcode = OP_NewRowid;
pOp->p1 = baseCur;
@@ -59442,9 +74203,14 @@ SQLITE_PRIVATE void sqlite3Insert(
*/
if( !appendFlag ){
int j1;
- j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid);
- sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc);
- sqlite3VdbeJumpHere(v, j1);
+ if( !IsVirtual(pTab) ){
+ j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid);
+ sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc);
+ sqlite3VdbeJumpHere(v, j1);
+ }else{
+ j1 = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2);
+ }
sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid);
}
}else if( IsVirtual(pTab) ){
@@ -59498,34 +74264,21 @@ SQLITE_PRIVATE void sqlite3Insert(
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
if( IsVirtual(pTab) ){
+ const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
sqlite3VtabMakeWritable(pParse, pTab);
- sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns,
- (const char*)pTab->pVtab, P4_VTAB);
+ sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB);
+ sqlite3MayAbort(pParse);
}else
#endif
{
- sqlite3GenerateConstraintChecks(
- pParse,
- pTab,
- baseCur,
- regIns,
- aRegIdx,
- keyColumn>=0,
- 0,
- onError,
- endOfLoop
+ int isReplace; /* Set to true if constraints may cause a replace */
+ sqlite3GenerateConstraintChecks(pParse, pTab, baseCur, regIns, aRegIdx,
+ keyColumn>=0, 0, onError, endOfLoop, &isReplace
);
+ sqlite3FkCheck(pParse, pTab, 0, regIns);
sqlite3CompleteInsertion(
- pParse,
- pTab,
- baseCur,
- regIns,
- aRegIdx,
- 0,
- 0,
- (triggers_exist & TRIGGER_AFTER)!=0 ? newIdx : -1,
- appendFlag
- );
+ pParse, pTab, baseCur, regIns, aRegIdx, 0, appendFlag, isReplace==0
+ );
}
}
@@ -59535,84 +74288,98 @@ SQLITE_PRIVATE void sqlite3Insert(
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
- if( triggers_exist ){
+ if( pTrigger ){
/* Code AFTER triggers */
- if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_AFTER, pTab,
- newIdx, -1, onError, endOfLoop, 0, 0) ){
- goto insert_cleanup;
- }
+ sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER,
+ pTab, regData-2-pTab->nCol, onError, endOfLoop);
}
- /* The bottom of the loop, if the data source is a SELECT statement
+ /* The bottom of the main insertion loop, if the data source
+ ** is a SELECT statement.
*/
sqlite3VdbeResolveLabel(v, endOfLoop);
if( useTempTable ){
- sqlite3VdbeAddOp2(v, OP_Next, srcTab, iCont);
- sqlite3VdbeResolveLabel(v, iBreak);
- sqlite3VdbeAddOp2(v, OP_Close, srcTab, 0);
+ sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont);
+ sqlite3VdbeJumpHere(v, addrInsTop);
+ sqlite3VdbeAddOp1(v, OP_Close, srcTab);
}else if( pSelect ){
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
- sqlite3VdbeResolveLabel(v, iCleanup);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrCont);
+ sqlite3VdbeJumpHere(v, addrInsTop);
}
if( !IsVirtual(pTab) && !isView ){
/* Close all tables opened */
- sqlite3VdbeAddOp2(v, OP_Close, baseCur, 0);
+ sqlite3VdbeAddOp1(v, OP_Close, baseCur);
for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
- sqlite3VdbeAddOp2(v, OP_Close, idx+baseCur, 0);
+ sqlite3VdbeAddOp1(v, OP_Close, idx+baseCur);
}
}
+insert_end:
/* Update the sqlite_sequence table by storing the content of the
- ** counter value in memory regAutoinc back into the sqlite_sequence
- ** table.
+ ** maximum rowid counter values recorded while inserting into
+ ** autoincrement tables.
*/
- autoIncEnd(pParse, iDb, pTab, regAutoinc);
+ if( pParse->nested==0 && pParse->pTriggerTab==0 ){
+ sqlite3AutoincrementEnd(pParse);
+ }
/*
** Return the number of rows inserted. If this routine is
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){
+ if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC);
}
insert_cleanup:
- sqlite3SrcListDelete(pTabList);
- sqlite3ExprListDelete(pList);
- sqlite3SelectDelete(pSelect);
- sqlite3IdListDelete(pColumn);
- sqlite3_free(aRegIdx);
+ sqlite3SrcListDelete(db, pTabList);
+ sqlite3ExprListDelete(db, pList);
+ sqlite3SelectDelete(db, pSelect);
+ sqlite3IdListDelete(db, pColumn);
+ sqlite3DbFree(db, aRegIdx);
}
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation). */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
+#ifdef tmask
+ #undef tmask
+#endif
+
+
/*
** Generate code to do constraint checks prior to an INSERT or an UPDATE.
**
** The input is a range of consecutive registers as follows:
**
-** 1. The rowid of the row to be updated before the update. This
-** value is omitted unless we are doing an UPDATE that involves a
-** change to the record number or writing to a virtual table.
-**
-** 2. The rowid of the row after the update.
+** 1. The rowid of the row after the update.
**
-** 3. The data in the first column of the entry after the update.
+** 2. The data in the first column of the entry after the update.
**
** i. Data from middle columns...
**
** N. The data in the last column of the entry after the update.
**
-** The regRowid parameter is the index of the register containing (2).
+** The regRowid parameter is the index of the register containing (1).
**
-** The old rowid shown as entry (1) above is omitted unless both isUpdate
-** and rowidChng are 1. isUpdate is true for UPDATEs and false for
-** INSERTs. RowidChng means that the new rowid is explicitly specified by
-** the update or insert statement. If rowidChng is false, it means that
-** the rowid is computed automatically in an insert or that the rowid value
-** is not modified by the update.
+** If isUpdate is true and rowidChng is non-zero, then rowidChng contains
+** the address of a register containing the rowid before the update takes
+** place. isUpdate is true for UPDATEs and false for INSERTs. If isUpdate
+** is false, indicating an INSERT statement, then a non-zero rowidChng
+** indicates that the rowid was explicitly specified as part of the
+** INSERT statement. If rowidChng is false, it means that the rowid is
+** computed automatically in an insert or that the rowid value is not
+** modified by an update.
**
** The code generated by this routine store new index entries into
** registers identified by aRegIdx[]. No index entry is created for
@@ -59674,18 +74441,20 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
int rowidChng, /* True if the rowid might collide with existing entry */
int isUpdate, /* True for UPDATE, False for INSERT */
int overrideError, /* Override onError to this if not OE_Default */
- int ignoreDest /* Jump to this label on an OE_Ignore resolution */
+ int ignoreDest, /* Jump to this label on an OE_Ignore resolution */
+ int *pbMayReplace /* OUT: Set to true if constraint may cause a replace */
){
- int i;
- Vdbe *v;
- int nCol;
- int onError;
- int j1, j2, j3; /* Addresses of jump instructions */
+ int i; /* loop counter */
+ Vdbe *v; /* VDBE under constrution */
+ int nCol; /* Number of columns */
+ int onError; /* Conflict resolution strategy */
+ int j1; /* Addresss of jump instruction */
+ int j2 = 0, j3; /* Addresses of jump instructions */
int regData; /* Register containing first data column */
- int iCur;
- Index *pIdx;
- int seenReplace = 0;
- int hasTwoRowids = (isUpdate && rowidChng);
+ int iCur; /* Table cursor number */
+ Index *pIdx; /* Pointer to one of the indices */
+ int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */
+ int regOldRowid = (rowidChng && isUpdate) ? rowidChng : regRowid;
v = sqlite3GetVdbe(pParse);
assert( v!=0 );
@@ -59693,7 +74462,6 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
nCol = pTab->nCol;
regData = regRowid + 1;
-
/* Test all NOT NULL constraints.
*/
for(i=0; i<nCol; i++){
@@ -59710,30 +74478,33 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){
onError = OE_Abort;
}
- j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regData+i);
assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
|| onError==OE_Ignore || onError==OE_Replace );
switch( onError ){
- case OE_Rollback:
case OE_Abort:
+ sqlite3MayAbort(pParse);
+ case OE_Rollback:
case OE_Fail: {
- char *zMsg = 0;
- sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_CONSTRAINT, onError);
- sqlite3SetString(&zMsg, pTab->zName, ".", pTab->aCol[i].zName,
- " may not be NULL", (char*)0);
+ char *zMsg;
+ j1 = sqlite3VdbeAddOp3(v, OP_HaltIfNull,
+ SQLITE_CONSTRAINT, onError, regData+i);
+ zMsg = sqlite3MPrintf(pParse->db, "%s.%s may not be NULL",
+ pTab->zName, pTab->aCol[i].zName);
sqlite3VdbeChangeP4(v, -1, zMsg, P4_DYNAMIC);
break;
}
case OE_Ignore: {
- sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
+ sqlite3VdbeAddOp2(v, OP_IsNull, regData+i, ignoreDest);
break;
}
- case OE_Replace: {
+ default: {
+ assert( onError==OE_Replace );
+ j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regData+i);
sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regData+i);
+ sqlite3VdbeJumpHere(v, j1);
break;
}
}
- sqlite3VdbeJumpHere(v, j1);
}
/* Test all CHECK constraints
@@ -59747,7 +74518,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
if( onError==OE_Ignore ){
sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
}else{
- sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_CONSTRAINT, onError);
+ sqlite3HaltConstraint(pParse, onError, 0, 0);
}
sqlite3VdbeResolveLabel(v, allOk);
}
@@ -59765,39 +74536,57 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
onError = OE_Abort;
}
- if( onError!=OE_Replace || pTab->pIndex ){
- if( isUpdate ){
- j2 = sqlite3VdbeAddOp3(v, OP_Eq, regRowid, 0, regRowid-1);
- }
- j3 = sqlite3VdbeAddOp3(v, OP_NotExists, baseCur, 0, regRowid);
- switch( onError ){
- default: {
- onError = OE_Abort;
- /* Fall thru into the next case */
- }
- case OE_Rollback:
- case OE_Abort:
- case OE_Fail: {
- sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0,
- "PRIMARY KEY must be unique", P4_STATIC);
- break;
+ if( isUpdate ){
+ j2 = sqlite3VdbeAddOp3(v, OP_Eq, regRowid, 0, rowidChng);
+ }
+ j3 = sqlite3VdbeAddOp3(v, OP_NotExists, baseCur, 0, regRowid);
+ switch( onError ){
+ default: {
+ onError = OE_Abort;
+ /* Fall thru into the next case */
+ }
+ case OE_Rollback:
+ case OE_Abort:
+ case OE_Fail: {
+ sqlite3HaltConstraint(
+ pParse, onError, "PRIMARY KEY must be unique", P4_STATIC);
+ break;
+ }
+ case OE_Replace: {
+ /* If there are DELETE triggers on this table and the
+ ** recursive-triggers flag is set, call GenerateRowDelete() to
+ ** remove the conflicting row from the the table. This will fire
+ ** the triggers and remove both the table and index b-tree entries.
+ **
+ ** Otherwise, if there are no triggers or the recursive-triggers
+ ** flag is not set, call GenerateRowIndexDelete(). This removes
+ ** the index b-tree entries only. The table b-tree entry will be
+ ** replaced by the new entry when it is inserted. */
+ Trigger *pTrigger = 0;
+ if( pParse->db->flags&SQLITE_RecTriggers ){
+ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
}
- case OE_Replace: {
+ sqlite3MultiWrite(pParse);
+ if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
+ sqlite3GenerateRowDelete(
+ pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
+ );
+ }else{
sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
- seenReplace = 1;
- break;
- }
- case OE_Ignore: {
- assert( seenReplace==0 );
- sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
- break;
}
+ seenReplace = 1;
+ break;
}
- sqlite3VdbeJumpHere(v, j3);
- if( isUpdate ){
- sqlite3VdbeJumpHere(v, j2);
+ case OE_Ignore: {
+ assert( seenReplace==0 );
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
+ break;
}
}
+ sqlite3VdbeJumpHere(v, j3);
+ if( isUpdate ){
+ sqlite3VdbeJumpHere(v, j2);
+ }
}
/* Test all UNIQUE constraints by creating entries for each UNIQUE
@@ -59822,13 +74611,15 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
}
sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn+1, aRegIdx[iCur]);
- sqlite3IndexAffinityStr(v, pIdx);
+ sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0);
sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn+1);
- sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1);
/* Find out what action to take in case there is an indexing conflict */
onError = pIdx->onError;
- if( onError==OE_None ) continue; /* pIdx is not a UNIQUE index */
+ if( onError==OE_None ){
+ sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1);
+ continue; /* pIdx is not a UNIQUE index */
+ }
if( overrideError!=OE_Default ){
onError = overrideError;
}else if( onError==OE_Default ){
@@ -59839,14 +74630,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
else if( onError==OE_Fail ) onError = OE_Abort;
}
-
/* Check to see if the new index entry will be unique */
- j2 = sqlite3VdbeAddOp3(v, OP_IsNull, regIdx, 0, pIdx->nColumn);
regR = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp2(v, OP_SCopy, regRowid-hasTwoRowids, regR);
+ sqlite3VdbeAddOp2(v, OP_SCopy, regOldRowid, regR);
j3 = sqlite3VdbeAddOp4(v, OP_IsUnique, baseCur+iCur+1, 0,
- regR, (char*)aRegIdx[iCur],
+ regR, SQLITE_INT_TO_PTR(regIdx),
P4_INT32);
+ sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1);
/* Generate code that executes if the new index entry is not unique */
assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
@@ -59855,30 +74645,25 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
case OE_Rollback:
case OE_Abort:
case OE_Fail: {
- int j, n1, n2;
- char zErrMsg[200];
- sqlite3_snprintf(sizeof(zErrMsg), zErrMsg,
- pIdx->nColumn>1 ? "columns " : "column ");
- n1 = strlen(zErrMsg);
- for(j=0; j<pIdx->nColumn && n1<sizeof(zErrMsg)-30; j++){
+ int j;
+ StrAccum errMsg;
+ const char *zSep;
+ char *zErr;
+
+ sqlite3StrAccumInit(&errMsg, 0, 0, 200);
+ errMsg.db = pParse->db;
+ zSep = pIdx->nColumn>1 ? "columns " : "column ";
+ for(j=0; j<pIdx->nColumn; j++){
char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
- n2 = strlen(zCol);
- if( j>0 ){
- sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], ", ");
- n1 += 2;
- }
- if( n1+n2>sizeof(zErrMsg)-30 ){
- sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "...");
- n1 += 3;
- break;
- }else{
- sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "%s", zCol);
- n1 += n2;
- }
+ sqlite3StrAccumAppend(&errMsg, zSep, -1);
+ zSep = ", ";
+ sqlite3StrAccumAppend(&errMsg, zCol, -1);
}
- sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1],
- pIdx->nColumn>1 ? " are not unique" : " is not unique");
- sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0, zErrMsg,0);
+ sqlite3StrAccumAppend(&errMsg,
+ pIdx->nColumn>1 ? " are not unique" : " is not unique", -1);
+ zErr = sqlite3StrAccumFinish(&errMsg);
+ sqlite3HaltConstraint(pParse, onError, zErr, 0);
+ sqlite3DbFree(errMsg.db, zErr);
break;
}
case OE_Ignore: {
@@ -59886,16 +74671,27 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
break;
}
- case OE_Replace: {
- sqlite3GenerateRowDelete(pParse, pTab, baseCur, regR, 0);
+ default: {
+ Trigger *pTrigger = 0;
+ assert( onError==OE_Replace );
+ sqlite3MultiWrite(pParse);
+ if( pParse->db->flags&SQLITE_RecTriggers ){
+ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
+ }
+ sqlite3GenerateRowDelete(
+ pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace
+ );
seenReplace = 1;
break;
}
}
- sqlite3VdbeJumpHere(v, j2);
sqlite3VdbeJumpHere(v, j3);
sqlite3ReleaseTempReg(pParse, regR);
}
+
+ if( pbMayReplace ){
+ *pbMayReplace = seenReplace;
+ }
}
/*
@@ -59913,16 +74709,15 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
int baseCur, /* Index of a read/write cursor pointing at pTab */
int regRowid, /* Range of content */
int *aRegIdx, /* Register used by each index. 0 for unused indices */
- int rowidChng, /* True if the record number will change */
int isUpdate, /* True for UPDATE, False for INSERT */
- int newIdx, /* Index of NEW table for triggers. -1 if none */
- int appendBias /* True if this is likely to be an append */
+ int appendBias, /* True if this is likely to be an append */
+ int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */
){
int i;
Vdbe *v;
int nIdx;
Index *pIdx;
- int pik_flags;
+ u8 pik_flags;
int regData;
int regRec;
@@ -59933,17 +74728,15 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
for(i=nIdx-1; i>=0; i--){
if( aRegIdx[i]==0 ) continue;
sqlite3VdbeAddOp2(v, OP_IdxInsert, baseCur+i+1, aRegIdx[i]);
+ if( useSeekResult ){
+ sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
+ }
}
regData = regRowid + 1;
regRec = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec);
sqlite3TableAffinityStr(v, pTab);
sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol);
-#ifndef SQLITE_OMIT_TRIGGER
- if( newIdx>=0 ){
- sqlite3VdbeAddOp3(v, OP_Insert, newIdx, regRec, regRowid);
- }
-#endif
if( pParse->nested ){
pik_flags = 0;
}else{
@@ -59953,6 +74746,9 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
if( appendBias ){
pik_flags |= OPFLAG_APPEND;
}
+ if( useSeekResult ){
+ pik_flags |= OPFLAG_USESEEKRESULT;
+ }
sqlite3VdbeAddOp3(v, OP_Insert, baseCur, regRec, regRowid);
if( !pParse->nested ){
sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC);
@@ -59970,7 +74766,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion(
SQLITE_PRIVATE int sqlite3OpenTableAndIndices(
Parse *pParse, /* Parsing context */
Table *pTab, /* Table to be opened */
- int baseCur, /* Cursor number assigned to the table */
+ int baseCur, /* Cursor number assigned to the table */
int op /* OP_OpenRead or OP_OpenWrite */
){
int i;
@@ -59990,7 +74786,7 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices(
(char*)pKey, P4_KEYINFO_HANDOFF);
VdbeComment((v, "%s", pIdx->zName));
}
- if( pParse->nTab<=baseCur+i ){
+ if( pParse->nTab<baseCur+i ){
pParse->nTab = baseCur+i;
}
return i-1;
@@ -60050,7 +74846,7 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){
if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){
return 0; /* Different sort orders */
}
- if( pSrc->azColl[i]!=pDest->azColl[i] ){
+ if( !xferCompatibleCollation(pSrc->azColl[i],pDest->azColl[i]) ){
return 0; /* Different collating sequences */
}
}
@@ -60116,11 +74912,11 @@ static int xferOptimization(
if( pSelect==0 ){
return 0; /* Must be of the form INSERT INTO ... SELECT ... */
}
- if( pDest->pTrigger ){
+ if( sqlite3TriggerList(pParse, pDest) ){
return 0; /* tab1 must not have triggers */
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pDest->isVirtual ){
+ if( pDest->tabFlags & TF_Virtual ){
return 0; /* tab1 must not be a virtual table */
}
#endif
@@ -60155,7 +74951,7 @@ static int xferOptimization(
if( pSelect->pPrior ){
return 0; /* SELECT may not be a compound query */
}
- if( pSelect->isDistinct ){
+ if( pSelect->selFlags & SF_Distinct ){
return 0; /* SELECT may not be DISTINCT */
}
pEList = pSelect->pEList;
@@ -60181,7 +74977,7 @@ static int xferOptimization(
return 0; /* tab1 and tab2 may not be the same table */
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pSrc->isVirtual ){
+ if( pSrc->tabFlags & TF_Virtual ){
return 0; /* tab2 must not be a virtual table */
}
#endif
@@ -60264,24 +75060,23 @@ static int xferOptimization(
if( pDest->iPKey>=0 ){
addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
- sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0,
- "PRIMARY KEY must be unique", P4_STATIC);
+ sqlite3HaltConstraint(
+ pParse, onError, "PRIMARY KEY must be unique", P4_STATIC);
sqlite3VdbeJumpHere(v, addr2);
autoIncStep(pParse, regAutoinc, regRowid);
}else if( pDest->pIndex==0 ){
addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid);
}else{
addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
- assert( pDest->autoInc==0 );
+ assert( (pDest->tabFlags & TF_Autoincrement)==0 );
}
sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData);
sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid);
sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND);
sqlite3VdbeChangeP4(v, -1, pDest->zName, 0);
sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1);
- autoIncEnd(pParse, iDbDest, pDest, regAutoinc);
for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){
- for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){
+ for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){
if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break;
}
assert( pSrcIdx );
@@ -60317,11 +75112,6 @@ static int xferOptimization(
}
#endif /* SQLITE_OMIT_XFER_OPT */
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
-
/************** End of insert.c **********************************************/
/************** Begin file legacy.c ******************************************/
/*
@@ -60340,7 +75130,7 @@ static int xferOptimization(
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: legacy.c,v 1.24 2008/03/21 18:01:14 drh Exp $
+** $Id: legacy.c,v 1.35 2009/08/07 16:56:00 danielk1977 Exp $
*/
@@ -60361,17 +75151,17 @@ SQLITE_API int sqlite3_exec(
void *pArg, /* First argument to xCallback() */
char **pzErrMsg /* Write error messages here */
){
- int rc = SQLITE_OK;
- const char *zLeftover;
- sqlite3_stmt *pStmt = 0;
- char **azCols = 0;
-
- int nRetry = 0;
- int nCallback;
+ int rc = SQLITE_OK; /* Return code */
+ const char *zLeftover; /* Tail of unprocessed SQL */
+ sqlite3_stmt *pStmt = 0; /* The current SQL statement */
+ char **azCols = 0; /* Names of result columns */
+ int nRetry = 0; /* Number of retry attempts */
+ int callbackIsInit; /* True if callback data is initialized */
- if( zSql==0 ) return SQLITE_OK;
+ if( zSql==0 ) zSql = "";
sqlite3_mutex_enter(db->mutex);
+ sqlite3Error(db, SQLITE_OK, 0);
while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
int nCol;
char **azVals = 0;
@@ -60388,7 +75178,7 @@ SQLITE_API int sqlite3_exec(
continue;
}
- nCallback = 0;
+ callbackIsInit = 0;
nCol = sqlite3_column_count(pStmt);
while( 1 ){
@@ -60397,22 +75187,20 @@ SQLITE_API int sqlite3_exec(
/* Invoke the callback function if required */
if( xCallback && (SQLITE_ROW==rc ||
- (SQLITE_DONE==rc && !nCallback && db->flags&SQLITE_NullCallback)) ){
- if( 0==nCallback ){
+ (SQLITE_DONE==rc && !callbackIsInit
+ && db->flags&SQLITE_NullCallback)) ){
+ if( !callbackIsInit ){
+ azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
if( azCols==0 ){
- azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
- if( azCols==0 ){
- goto exec_out;
- }
+ goto exec_out;
}
for(i=0; i<nCol; i++){
azCols[i] = (char *)sqlite3_column_name(pStmt, i);
- if( !azCols[i] ){
- db->mallocFailed = 1;
- goto exec_out;
- }
+ /* sqlite3VdbeSetColName() installs column names as UTF8
+ ** strings so there is no way for sqlite3_column_name() to fail. */
+ assert( azCols[i]!=0 );
}
- nCallback++;
+ callbackIsInit = 1;
}
if( rc==SQLITE_ROW ){
azVals = &azCols[nCol];
@@ -60426,36 +75214,42 @@ SQLITE_API int sqlite3_exec(
}
if( xCallback(pArg, nCol, azVals, azCols) ){
rc = SQLITE_ABORT;
+ sqlite3VdbeFinalize((Vdbe *)pStmt);
+ pStmt = 0;
+ sqlite3Error(db, SQLITE_ABORT, 0);
goto exec_out;
}
}
if( rc!=SQLITE_ROW ){
- rc = sqlite3_finalize(pStmt);
+ rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
pStmt = 0;
if( rc!=SQLITE_SCHEMA ){
nRetry = 0;
zSql = zLeftover;
- while( isspace((unsigned char)zSql[0]) ) zSql++;
+ while( sqlite3Isspace(zSql[0]) ) zSql++;
}
break;
}
}
- sqlite3_free(azCols);
+ sqlite3DbFree(db, azCols);
azCols = 0;
}
exec_out:
- if( pStmt ) sqlite3_finalize(pStmt);
- if( azCols ) sqlite3_free(azCols);
+ if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
+ sqlite3DbFree(db, azCols);
rc = sqlite3ApiExit(db, rc);
- if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg ){
- int nErrMsg = 1 + strlen(sqlite3_errmsg(db));
- *pzErrMsg = sqlite3_malloc(nErrMsg);
+ if( rc!=SQLITE_OK && ALWAYS(rc==sqlite3_errcode(db)) && pzErrMsg ){
+ int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db));
+ *pzErrMsg = sqlite3Malloc(nErrMsg);
if( *pzErrMsg ){
memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
+ }else{
+ rc = SQLITE_NOMEM;
+ sqlite3Error(db, SQLITE_NOMEM, 0);
}
}else if( pzErrMsg ){
*pzErrMsg = 0;
@@ -60481,6 +75275,8 @@ exec_out:
*************************************************************************
** This file contains code used to dynamically load extensions into
** the SQLite library.
+**
+** $Id: loadext.c,v 1.60 2009/06/03 01:24:54 drh Exp $
*/
#ifndef SQLITE_CORE
@@ -60505,7 +75301,7 @@ exec_out:
** as extensions by SQLite should #include this file instead of
** sqlite3.h.
**
-** @(#) $Id: sqlite3ext.h,v 1.21 2008/03/19 21:45:51 drh Exp $
+** @(#) $Id: sqlite3ext.h,v 1.25 2008/10/12 00:27:54 shane Exp $
*/
#ifndef _SQLITE3EXT_H_
#define _SQLITE3EXT_H_
@@ -60567,7 +75363,7 @@ struct sqlite3_api_routines {
int (*complete)(const char*sql);
int (*complete16)(const void*sql);
int (*create_collation)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*));
- int (*create_collation16)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*));
+ int (*create_collation16)(sqlite3*,const void*,int,void*,int(*)(void*,int,const void*,int,const void*));
int (*create_function)(sqlite3*,const char*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*));
int (*create_function16)(sqlite3*,const void*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*));
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
@@ -60677,6 +75473,11 @@ struct sqlite3_api_routines {
int (*test_control)(int, ...);
void (*randomness)(int,void*);
sqlite3 *(*context_db_handle)(sqlite3_context*);
+ int (*extended_result_codes)(sqlite3*,int);
+ int (*limit)(sqlite3*,int,int);
+ sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
+ const char *(*sql)(sqlite3_stmt*);
+ int (*status)(int,int*,int*,int);
};
/*
@@ -60692,7 +75493,9 @@ struct sqlite3_api_routines {
*/
#ifndef SQLITE_CORE
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
+#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
+#endif
#define sqlite3_bind_blob sqlite3_api->bind_blob
#define sqlite3_bind_double sqlite3_api->bind_double
#define sqlite3_bind_int sqlite3_api->bind_int
@@ -60748,14 +75551,18 @@ struct sqlite3_api_routines {
#define sqlite3_errmsg sqlite3_api->errmsg
#define sqlite3_errmsg16 sqlite3_api->errmsg16
#define sqlite3_exec sqlite3_api->exec
+#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_expired sqlite3_api->expired
+#endif
#define sqlite3_finalize sqlite3_api->finalize
#define sqlite3_free sqlite3_api->free
#define sqlite3_free_table sqlite3_api->free_table
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
#define sqlite3_get_table sqlite3_api->get_table
+#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_global_recover sqlite3_api->global_recover
+#endif
#define sqlite3_interrupt sqlite3_api->interruptx
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
#define sqlite3_libversion sqlite3_api->libversion
@@ -60793,7 +75600,9 @@ struct sqlite3_api_routines {
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
#define sqlite3_total_changes sqlite3_api->total_changes
#define sqlite3_trace sqlite3_api->trace
+#ifndef SQLITE_OMIT_DEPRECATED
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
+#endif
#define sqlite3_update_hook sqlite3_api->update_hook
#define sqlite3_user_data sqlite3_api->user_data
#define sqlite3_value_blob sqlite3_api->value_blob
@@ -60843,9 +75652,14 @@ struct sqlite3_api_routines {
#define sqlite3_test_control sqlite3_api->test_control
#define sqlite3_randomness sqlite3_api->randomness
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
+#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
+#define sqlite3_limit sqlite3_api->limit
+#define sqlite3_next_stmt sqlite3_api->next_stmt
+#define sqlite3_sql sqlite3_api->sql
+#define sqlite3_status sqlite3_api->status
#endif /* SQLITE_CORE */
-#define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api;
+#define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api = 0;
#define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v;
#endif /* _SQLITE3EXT_H_ */
@@ -60954,7 +75768,11 @@ struct sqlite3_api_routines {
*/
static const sqlite3_api_routines sqlite3Apis = {
sqlite3_aggregate_context,
+#ifndef SQLITE_OMIT_DEPRECATED
sqlite3_aggregate_count,
+#else
+ 0,
+#endif
sqlite3_bind_blob,
sqlite3_bind_double,
sqlite3_bind_int,
@@ -61009,7 +75827,11 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_errmsg,
sqlite3_errmsg16,
sqlite3_exec,
+#ifndef SQLITE_OMIT_DEPRECATED
sqlite3_expired,
+#else
+ 0,
+#endif
sqlite3_finalize,
sqlite3_free,
sqlite3_free_table,
@@ -61049,10 +75871,18 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_snprintf,
sqlite3_step,
sqlite3_table_column_metadata,
+#ifndef SQLITE_OMIT_DEPRECATED
sqlite3_thread_cleanup,
+#else
+ 0,
+#endif
sqlite3_total_changes,
sqlite3_trace,
+#ifndef SQLITE_OMIT_DEPRECATED
sqlite3_transfer_bindings,
+#else
+ 0,
+#endif
sqlite3_update_hook,
sqlite3_user_data,
sqlite3_value_blob,
@@ -61103,7 +75933,7 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_file_control,
sqlite3_memory_highwater,
sqlite3_memory_used,
-#ifdef SQLITE_MUTEX_NOOP
+#ifdef SQLITE_MUTEX_OMIT
0,
0,
0,
@@ -61135,6 +75965,15 @@ static const sqlite3_api_routines sqlite3Apis = {
sqlite3_test_control,
sqlite3_randomness,
sqlite3_context_db_handle,
+
+ /*
+ ** Added for 3.6.0
+ */
+ sqlite3_extended_result_codes,
+ sqlite3_limit,
+ sqlite3_next_stmt,
+ sqlite3_sql,
+ sqlite3_status,
};
/*
@@ -61147,7 +75986,7 @@ static const sqlite3_api_routines sqlite3Apis = {
**
** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with
** error message text. The calling function should free this memory
-** by calling sqlite3_free().
+** by calling sqlite3DbFree(db, ).
*/
static int sqlite3LoadExtension(
sqlite3 *db, /* Load the extension into this database connection */
@@ -61160,6 +75999,9 @@ static int sqlite3LoadExtension(
int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
char *zErrmsg = 0;
void **aHandle;
+ const int nMsg = 300;
+
+ if( pzErrMsg ) *pzErrMsg = 0;
/* Ticket #1863. To avoid a creating security problems for older
** applications that relink against newer versions of SQLite, the
@@ -61181,12 +76023,14 @@ static int sqlite3LoadExtension(
handle = sqlite3OsDlOpen(pVfs, zFile);
if( handle==0 ){
if( pzErrMsg ){
- char zErr[256];
- zErr[sizeof(zErr)-1] = '\0';
- sqlite3_snprintf(sizeof(zErr)-1, zErr,
- "unable to open shared library [%s]", zFile);
- sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr);
- *pzErrMsg = sqlite3DbStrDup(db, zErr);
+ zErrmsg = sqlite3StackAllocZero(db, nMsg);
+ if( zErrmsg ){
+ sqlite3_snprintf(nMsg, zErrmsg,
+ "unable to open shared library [%s]", zFile);
+ sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
+ *pzErrMsg = sqlite3DbStrDup(0, zErrmsg);
+ sqlite3StackFree(db, zErrmsg);
+ }
}
return SQLITE_ERROR;
}
@@ -61194,12 +76038,14 @@ static int sqlite3LoadExtension(
sqlite3OsDlSym(pVfs, handle, zProc);
if( xInit==0 ){
if( pzErrMsg ){
- char zErr[256];
- zErr[sizeof(zErr)-1] = '\0';
- sqlite3_snprintf(sizeof(zErr)-1, zErr,
- "no entry point [%s] in shared library [%s]", zProc,zFile);
- sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr);
- *pzErrMsg = sqlite3DbStrDup(db, zErr);
+ zErrmsg = sqlite3StackAllocZero(db, nMsg);
+ if( zErrmsg ){
+ sqlite3_snprintf(nMsg, zErrmsg,
+ "no entry point [%s] in shared library [%s]", zProc,zFile);
+ sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
+ *pzErrMsg = sqlite3DbStrDup(0, zErrmsg);
+ sqlite3StackFree(db, zErrmsg);
+ }
sqlite3OsDlClose(pVfs, handle);
}
return SQLITE_ERROR;
@@ -61213,18 +76059,17 @@ static int sqlite3LoadExtension(
}
/* Append the new shared library handle to the db->aExtension array. */
- db->nExtension++;
- aHandle = sqlite3DbMallocZero(db, sizeof(handle)*db->nExtension);
+ aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
if( aHandle==0 ){
return SQLITE_NOMEM;
}
if( db->nExtension>0 ){
- memcpy(aHandle, db->aExtension, sizeof(handle)*(db->nExtension-1));
+ memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
}
- sqlite3_free(db->aExtension);
+ sqlite3DbFree(db, db->aExtension);
db->aExtension = aHandle;
- db->aExtension[db->nExtension-1] = handle;
+ db->aExtension[db->nExtension++] = handle;
return SQLITE_OK;
}
SQLITE_API int sqlite3_load_extension(
@@ -61236,6 +76081,7 @@ SQLITE_API int sqlite3_load_extension(
int rc;
sqlite3_mutex_enter(db->mutex);
rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
+ rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
}
@@ -61250,7 +76096,7 @@ SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){
for(i=0; i<db->nExtension; i++){
sqlite3OsDlClose(db->pVfs, db->aExtension[i]);
}
- sqlite3_free(db->aExtension);
+ sqlite3DbFree(db, db->aExtension);
}
/*
@@ -61288,93 +76134,125 @@ static const sqlite3_api_routines sqlite3Apis = { 0 };
** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER
** mutex must be held while accessing this list.
*/
-static struct {
- int nExt; /* Number of entries in aExt[] */
- void **aExt; /* Pointers to the extension init functions */
-} autoext = { 0, 0 };
+typedef struct sqlite3AutoExtList sqlite3AutoExtList;
+static SQLITE_WSD struct sqlite3AutoExtList {
+ int nExt; /* Number of entries in aExt[] */
+ void (**aExt)(void); /* Pointers to the extension init functions */
+} sqlite3Autoext = { 0, 0 };
+
+/* The "wsdAutoext" macro will resolve to the autoextension
+** state vector. If writable static data is unsupported on the target,
+** we have to locate the state vector at run-time. In the more common
+** case where writable static data is supported, wsdStat can refer directly
+** to the "sqlite3Autoext" state vector declared above.
+*/
+#ifdef SQLITE_OMIT_WSD
+# define wsdAutoextInit \
+ sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext)
+# define wsdAutoext x[0]
+#else
+# define wsdAutoextInit
+# define wsdAutoext sqlite3Autoext
+#endif
/*
** Register a statically linked extension that is automatically
** loaded by every new database connection.
*/
-SQLITE_API int sqlite3_auto_extension(void *xInit){
- int i;
+SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){
int rc = SQLITE_OK;
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+#ifndef SQLITE_OMIT_AUTOINIT
+ rc = sqlite3_initialize();
+ if( rc ){
+ return rc;
+ }else
#endif
- sqlite3_mutex_enter(mutex);
- for(i=0; i<autoext.nExt; i++){
- if( autoext.aExt[i]==xInit ) break;
- }
- if( i==autoext.nExt ){
- int nByte = (autoext.nExt+1)*sizeof(autoext.aExt[0]);
- void **aNew;
- aNew = sqlite3_realloc(autoext.aExt, nByte);
- if( aNew==0 ){
- rc = SQLITE_NOMEM;
- }else{
- autoext.aExt = aNew;
- autoext.aExt[autoext.nExt] = xInit;
- autoext.nExt++;
+ {
+ int i;
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+#endif
+ wsdAutoextInit;
+ sqlite3_mutex_enter(mutex);
+ for(i=0; i<wsdAutoext.nExt; i++){
+ if( wsdAutoext.aExt[i]==xInit ) break;
+ }
+ if( i==wsdAutoext.nExt ){
+ int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]);
+ void (**aNew)(void);
+ aNew = sqlite3_realloc(wsdAutoext.aExt, nByte);
+ if( aNew==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ wsdAutoext.aExt = aNew;
+ wsdAutoext.aExt[wsdAutoext.nExt] = xInit;
+ wsdAutoext.nExt++;
+ }
}
+ sqlite3_mutex_leave(mutex);
+ assert( (rc&0xff)==rc );
+ return rc;
}
- sqlite3_mutex_leave(mutex);
- assert( (rc&0xff)==rc );
- return rc;
}
/*
** Reset the automatic extension loading mechanism.
*/
SQLITE_API void sqlite3_reset_auto_extension(void){
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+#ifndef SQLITE_OMIT_AUTOINIT
+ if( sqlite3_initialize()==SQLITE_OK )
#endif
- sqlite3_mutex_enter(mutex);
- sqlite3_free(autoext.aExt);
- autoext.aExt = 0;
- autoext.nExt = 0;
- sqlite3_mutex_leave(mutex);
+ {
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+#endif
+ wsdAutoextInit;
+ sqlite3_mutex_enter(mutex);
+ sqlite3_free(wsdAutoext.aExt);
+ wsdAutoext.aExt = 0;
+ wsdAutoext.nExt = 0;
+ sqlite3_mutex_leave(mutex);
+ }
}
/*
** Load all automatic extensions.
+**
+** If anything goes wrong, set an error in the database connection.
*/
-SQLITE_PRIVATE int sqlite3AutoLoadExtensions(sqlite3 *db){
+SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
int i;
int go = 1;
- int rc = SQLITE_OK;
int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
- if( autoext.nExt==0 ){
+ wsdAutoextInit;
+ if( wsdAutoext.nExt==0 ){
/* Common case: early out without every having to acquire a mutex */
- return SQLITE_OK;
+ return;
}
for(i=0; go; i++){
- char *zErrmsg = 0;
-#ifndef SQLITE_MUTEX_NOOP
- sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+ char *zErrmsg;
+#if SQLITE_THREADSAFE
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
#endif
sqlite3_mutex_enter(mutex);
- if( i>=autoext.nExt ){
+ if( i>=wsdAutoext.nExt ){
xInit = 0;
go = 0;
}else{
xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
- autoext.aExt[i];
+ wsdAutoext.aExt[i];
}
sqlite3_mutex_leave(mutex);
+ zErrmsg = 0;
if( xInit && xInit(db, &zErrmsg, &sqlite3Apis) ){
sqlite3Error(db, SQLITE_ERROR,
"automatic extension loading failed: %s", zErrmsg);
go = 0;
- rc = SQLITE_ERROR;
- sqlite3_free(zErrmsg);
}
+ sqlite3_free(zErrmsg);
}
- return rc;
}
/************** End of loadext.c *********************************************/
@@ -61392,12 +76270,12 @@ SQLITE_PRIVATE int sqlite3AutoLoadExtensions(sqlite3 *db){
*************************************************************************
** This file contains code used to implement the PRAGMA command.
**
-** $Id: pragma.c,v 1.176 2008/04/17 20:59:38 drh Exp $
+** $Id: pragma.c,v 1.214 2009/07/02 07:47:33 danielk1977 Exp $
*/
/* Ignore this whole file if pragmas are disabled
*/
-#if !defined(SQLITE_OMIT_PRAGMA) && !defined(SQLITE_OMIT_PARSER)
+#if !defined(SQLITE_OMIT_PRAGMA)
/*
** Interpret the given string as a safety level. Return 0 for OFF,
@@ -61409,18 +76287,18 @@ SQLITE_PRIVATE int sqlite3AutoLoadExtensions(sqlite3 *db){
** to support legacy SQL code. The safety level used to be boolean
** and older scripts may have used numbers 0 for OFF and 1 for ON.
*/
-static int getSafetyLevel(const char *z){
+static u8 getSafetyLevel(const char *z){
/* 123456789 123456789 */
static const char zText[] = "onoffalseyestruefull";
static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16};
static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4};
static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2};
int i, n;
- if( isdigit(*z) ){
- return atoi(z);
+ if( sqlite3Isdigit(*z) ){
+ return (u8)atoi(z);
}
- n = strlen(z);
- for(i=0; i<sizeof(iLength); i++){
+ n = sqlite3Strlen30(z);
+ for(i=0; i<ArraySize(iLength); i++){
if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){
return iValue[i];
}
@@ -61431,7 +76309,7 @@ static int getSafetyLevel(const char *z){
/*
** Interpret the given string as a boolean value.
*/
-static int getBoolean(const char *z){
+static u8 getBoolean(const char *z){
return getSafetyLevel(z)&1;
}
@@ -61459,7 +76337,7 @@ static int getAutoVacuum(const char *z){
if( 0==sqlite3StrICmp(z, "full") ) return BTREE_AUTOVACUUM_FULL;
if( 0==sqlite3StrICmp(z, "incremental") ) return BTREE_AUTOVACUUM_INCR;
i = atoi(z);
- return ((i>=0&&i<=2)?i:0);
+ return (u8)((i>=0&&i<=2)?i:0);
}
#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */
@@ -61490,7 +76368,7 @@ static int getTempStore(const char *z){
static int invalidateTempStorage(Parse *pParse){
sqlite3 *db = pParse->db;
if( db->aDb[1].pBt!=0 ){
- if( !db->autoCommit ){
+ if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){
sqlite3ErrorMsg(pParse, "temporary storage cannot be changed "
"from within a transaction");
return SQLITE_ERROR;
@@ -61506,7 +76384,7 @@ static int invalidateTempStorage(Parse *pParse){
#ifndef SQLITE_OMIT_PAGER_PRAGMAS
/*
** If the TEMP database is open, close it and mark the database schema
-** as needing reloading. This must be done when using the TEMP_STORE
+** as needing reloading. This must be done when using the SQLITE_TEMP_STORE
** or DEFAULT_TEMP_STORE pragmas.
*/
static int changeTempStorage(Parse *pParse, const char *zStorageType){
@@ -61516,7 +76394,7 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){
if( invalidateTempStorage( pParse ) != SQLITE_OK ){
return SQLITE_ERROR;
}
- db->temp_store = ts;
+ db->temp_store = (u8)ts;
return SQLITE_OK;
}
#endif /* SQLITE_PAGER_PRAGMAS */
@@ -61524,14 +76402,16 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){
/*
** Generate code to return a single integer value.
*/
-static void returnSingleInt(Parse *pParse, const char *zLabel, int value){
+static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){
Vdbe *v = sqlite3GetVdbe(pParse);
int mem = ++pParse->nMem;
- sqlite3VdbeAddOp2(v, OP_Integer, value, mem);
- if( pParse->explain==0 ){
- sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, P4_STATIC);
+ i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value));
+ if( pI64 ){
+ memcpy(pI64, &value, sizeof(value));
}
+ sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64);
+ sqlite3VdbeSetNumCols(v, 1);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC);
sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1);
}
@@ -61552,6 +76432,7 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
{ "empty_result_callbacks", SQLITE_NullCallback },
{ "legacy_file_format", SQLITE_LegacyFileFmt },
{ "fullfsync", SQLITE_FullFSync },
+ { "reverse_unordered_selects", SQLITE_ReverseOrder },
#ifdef SQLITE_DEBUG
{ "sql_trace", SQLITE_SqlTrace },
{ "vdbe_listing", SQLITE_VdbeListing },
@@ -61567,22 +76448,37 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
/* TODO: Maybe it shouldn't be possible to change the ReadUncommitted
** flag if there are any active statements. */
{ "read_uncommitted", SQLITE_ReadUncommitted },
+ { "recursive_triggers", SQLITE_RecTriggers },
+
+ /* This flag may only be set if both foreign-key and trigger support
+ ** are present in the build. */
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
+ { "foreign_keys", SQLITE_ForeignKeys },
+#endif
};
int i;
const struct sPragmaType *p;
- for(i=0, p=aPragma; i<sizeof(aPragma)/sizeof(aPragma[0]); i++, p++){
+ for(i=0, p=aPragma; i<ArraySize(aPragma); i++, p++){
if( sqlite3StrICmp(zLeft, p->zName)==0 ){
sqlite3 *db = pParse->db;
Vdbe *v;
v = sqlite3GetVdbe(pParse);
- if( v ){
+ assert( v!=0 ); /* Already allocated by sqlite3Pragma() */
+ if( ALWAYS(v) ){
if( zRight==0 ){
returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 );
}else{
+ int mask = p->mask; /* Mask of bits to set or clear. */
+ if( db->autoCommit==0 ){
+ /* Foreign key support may not be enabled or disabled while not
+ ** in auto-commit mode. */
+ mask &= ~(SQLITE_ForeignKeys);
+ }
+
if( getBoolean(zRight) ){
- db->flags |= p->mask;
+ db->flags |= mask;
}else{
- db->flags &= ~p->mask;
+ db->flags &= ~mask;
}
/* Many of the flag-pragmas modify the code generated by the SQL
@@ -61601,6 +76497,24 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
#endif /* SQLITE_OMIT_FLAG_PRAGMAS */
/*
+** Return a human-readable name for a constraint resolution action.
+*/
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+static const char *actionName(u8 action){
+ const char *zName;
+ switch( action ){
+ case OE_SetNull: zName = "SET NULL"; break;
+ case OE_SetDflt: zName = "SET DEFAULT"; break;
+ case OE_Cascade: zName = "CASCADE"; break;
+ case OE_Restrict: zName = "RESTRICT"; break;
+ default: zName = "NO ACTION";
+ assert( action==OE_None ); break;
+ }
+ return zName;
+}
+#endif
+
+/*
** Process a pragma statement.
**
** Pragmas are of this form:
@@ -61654,7 +76568,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
zRight = sqlite3NameFromToken(db, pValue);
}
- zDb = ((iDb>0)?pDb->zName:0);
+ assert( pId2 );
+ zDb = pId2->n>0 ? pDb->zName : 0;
if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){
goto pragma_out;
}
@@ -61678,12 +76593,13 @@ SQLITE_PRIVATE void sqlite3Pragma(
*/
if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){
static const VdbeOpList getCacheSize[] = {
- { OP_ReadCookie, 0, 1, 2}, /* 0 */
- { OP_IfPos, 1, 6, 0},
+ { OP_Transaction, 0, 0, 0}, /* 0 */
+ { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */
+ { OP_IfPos, 1, 7, 0},
{ OP_Integer, 0, 2, 0},
{ OP_Subtract, 1, 2, 1},
- { OP_IfPos, 1, 6, 0},
- { OP_Integer, 0, 1, 0}, /* 5 */
+ { OP_IfPos, 1, 7, 0},
+ { OP_Integer, 0, 1, 0}, /* 6 */
{ OP_ResultRow, 1, 1, 0},
};
int addr;
@@ -61691,21 +76607,22 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3VdbeUsesBtree(v, iDb);
if( !zRight ){
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC);
pParse->nMem += 2;
addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize);
sqlite3VdbeChangeP1(v, addr, iDb);
- sqlite3VdbeChangeP1(v, addr+5, SQLITE_DEFAULT_CACHE_SIZE);
+ sqlite3VdbeChangeP1(v, addr+1, iDb);
+ sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE);
}else{
int size = atoi(zRight);
if( size<0 ) size = -size;
sqlite3BeginWriteOperation(pParse, 0, iDb);
sqlite3VdbeAddOp2(v, OP_Integer, size, 1);
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, 2, 2);
+ sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, 2, BTREE_DEFAULT_CACHE_SIZE);
addr = sqlite3VdbeAddOp2(v, OP_IfPos, 2, 0);
sqlite3VdbeAddOp2(v, OP_Integer, -size, 1);
sqlite3VdbeJumpHere(v, addr);
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, 2, 1);
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1);
pDb->pSchema->cache_size = size;
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
}
@@ -61722,15 +76639,16 @@ SQLITE_PRIVATE void sqlite3Pragma(
*/
if( sqlite3StrICmp(zLeft,"page_size")==0 ){
Btree *pBt = pDb->pBt;
+ assert( pBt!=0 );
if( !zRight ){
- int size = pBt ? sqlite3BtreeGetPageSize(pBt) : 0;
+ int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0;
returnSingleInt(pParse, "page_size", size);
}else{
/* Malloc may fail when setting the page-size, as there is an internal
** buffer that the pager module resizes using sqlite3_realloc().
*/
db->nextPagesize = atoi(zRight);
- if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1) ){
+ if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){
db->mallocFailed = 1;
}
}
@@ -61748,16 +76666,33 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( sqlite3StrICmp(zLeft,"max_page_count")==0 ){
Btree *pBt = pDb->pBt;
int newMax = 0;
+ assert( pBt!=0 );
if( zRight ){
newMax = atoi(zRight);
}
- if( pBt ){
+ if( ALWAYS(pBt) ){
newMax = sqlite3BtreeMaxPageCount(pBt, newMax);
}
returnSingleInt(pParse, "max_page_count", newMax);
}else
/*
+ ** PRAGMA [database.]page_count
+ **
+ ** Return the number of pages in the specified database.
+ */
+ if( sqlite3StrICmp(zLeft,"page_count")==0 ){
+ int iReg;
+ if( sqlite3ReadSchema(pParse) ) goto pragma_out;
+ sqlite3CodeVerifySchema(pParse, iDb);
+ iReg = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg);
+ sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1);
+ sqlite3VdbeSetNumCols(v, 1);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "page_count", SQLITE_STATIC);
+ }else
+
+ /*
** PRAGMA [database.]locking_mode
** PRAGMA [database.]locking_mode = (normal|exclusive)
*/
@@ -61788,7 +76723,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
pPager = sqlite3BtreePager(db->aDb[ii].pBt);
sqlite3PagerLockingMode(pPager, eMode);
}
- db->dfltLockMode = eMode;
+ db->dfltLockMode = (u8)eMode;
}
pPager = sqlite3BtreePager(pDb->pBt);
eMode = sqlite3PagerLockingMode(pPager, eMode);
@@ -61799,30 +76734,32 @@ SQLITE_PRIVATE void sqlite3Pragma(
zRet = "exclusive";
}
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC);
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
}else
/*
** PRAGMA [database.]journal_mode
- ** PRAGMA [database.]journal_mode = (delete|persist|off)
+ ** PRAGMA [database.]journal_mode = (delete|persist|off|truncate|memory)
*/
if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){
int eMode;
- static const char *azModeName[] = {"delete", "persist", "off"};
+ static char * const azModeName[] = {
+ "delete", "persist", "off", "truncate", "memory"
+ };
if( zRight==0 ){
eMode = PAGER_JOURNALMODE_QUERY;
}else{
- int n = strlen(zRight);
- eMode = 2;
+ int n = sqlite3Strlen30(zRight);
+ eMode = sizeof(azModeName)/sizeof(azModeName[0]) - 1;
while( eMode>=0 && sqlite3StrNICmp(zRight, azModeName[eMode], n)!=0 ){
eMode--;
}
}
if( pId2->n==0 && eMode==PAGER_JOURNALMODE_QUERY ){
- /* Simple "PRAGMA persistent_journal;" statement. This is a query for
+ /* Simple "PRAGMA journal_mode;" statement. This is a query for
** the current default journal mode (which may be different to
** the journal-mode of the main database).
*/
@@ -61846,42 +76783,69 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3PagerJournalMode(pPager, eMode);
}
}
- db->dfltJournalMode = eMode;
+ db->dfltJournalMode = (u8)eMode;
}
pPager = sqlite3BtreePager(pDb->pBt);
eMode = sqlite3PagerJournalMode(pPager, eMode);
}
assert( eMode==PAGER_JOURNALMODE_DELETE
+ || eMode==PAGER_JOURNALMODE_TRUNCATE
|| eMode==PAGER_JOURNALMODE_PERSIST
- || eMode==PAGER_JOURNALMODE_OFF );
+ || eMode==PAGER_JOURNALMODE_OFF
+ || eMode==PAGER_JOURNALMODE_MEMORY );
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC);
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0,
azModeName[eMode], P4_STATIC);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
}else
+
+ /*
+ ** PRAGMA [database.]journal_size_limit
+ ** PRAGMA [database.]journal_size_limit=N
+ **
+ ** Get or set the size limit on rollback journal files.
+ */
+ if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){
+ Pager *pPager = sqlite3BtreePager(pDb->pBt);
+ i64 iLimit = -2;
+ if( zRight ){
+ sqlite3Atoi64(zRight, &iLimit);
+ if( iLimit<-1 ) iLimit = -1;
+ }
+ iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit);
+ returnSingleInt(pParse, "journal_size_limit", iLimit);
+ }else
+
#endif /* SQLITE_OMIT_PAGER_PRAGMAS */
/*
** PRAGMA [database.]auto_vacuum
** PRAGMA [database.]auto_vacuum=N
**
- ** Get or set the (boolean) value of the database 'auto-vacuum' parameter.
+ ** Get or set the value of the database 'auto-vacuum' parameter.
+ ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL
*/
#ifndef SQLITE_OMIT_AUTOVACUUM
if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){
Btree *pBt = pDb->pBt;
+ assert( pBt!=0 );
if( sqlite3ReadSchema(pParse) ){
goto pragma_out;
}
if( !zRight ){
- int auto_vacuum =
- pBt ? sqlite3BtreeGetAutoVacuum(pBt) : SQLITE_DEFAULT_AUTOVACUUM;
+ int auto_vacuum;
+ if( ALWAYS(pBt) ){
+ auto_vacuum = sqlite3BtreeGetAutoVacuum(pBt);
+ }else{
+ auto_vacuum = SQLITE_DEFAULT_AUTOVACUUM;
+ }
returnSingleInt(pParse, "auto_vacuum", auto_vacuum);
}else{
int eAuto = getAutoVacuum(zRight);
- db->nextAutovac = eAuto;
- if( eAuto>=0 ){
+ assert( eAuto>=0 && eAuto<=2 );
+ db->nextAutovac = (u8)eAuto;
+ if( ALWAYS(eAuto>=0) ){
/* Call SetAutoVacuum() to set initialize the internal auto and
** incr-vacuum flags. This is required in case this connection
** creates the database file. It is important that it is created
@@ -61895,12 +76859,12 @@ SQLITE_PRIVATE void sqlite3Pragma(
** that this really is an auto-vacuum capable database.
*/
static const VdbeOpList setMeta6[] = {
- { OP_Transaction, 0, 1, 0}, /* 0 */
- { OP_ReadCookie, 0, 1, 3}, /* 1 */
- { OP_If, 1, 0, 0}, /* 2 */
- { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */
- { OP_Integer, 0, 1, 0}, /* 4 */
- { OP_SetCookie, 0, 6, 1}, /* 5 */
+ { OP_Transaction, 0, 1, 0}, /* 0 */
+ { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE},
+ { OP_If, 1, 0, 0}, /* 2 */
+ { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */
+ { OP_Integer, 0, 1, 0}, /* 4 */
+ { OP_SetCookie, 0, BTREE_INCR_VACUUM, 1}, /* 5 */
};
int iAddr;
iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6);
@@ -62001,33 +76965,87 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( sqlite3_temp_directory ){
sqlite3VdbeSetNumCols(v, 1);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME,
- "temp_store_directory", P4_STATIC);
+ "temp_store_directory", SQLITE_STATIC);
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
}
}else{
- if( zRight[0]
- && sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE)==0
- ){
- sqlite3ErrorMsg(pParse, "not a writable directory");
- goto pragma_out;
+#ifndef SQLITE_OMIT_WSD
+ if( zRight[0] ){
+ int rc;
+ int res;
+ rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
+ if( rc!=SQLITE_OK || res==0 ){
+ sqlite3ErrorMsg(pParse, "not a writable directory");
+ goto pragma_out;
+ }
}
- if( TEMP_STORE==0
- || (TEMP_STORE==1 && db->temp_store<=1)
- || (TEMP_STORE==2 && db->temp_store==1)
+ if( SQLITE_TEMP_STORE==0
+ || (SQLITE_TEMP_STORE==1 && db->temp_store<=1)
+ || (SQLITE_TEMP_STORE==2 && db->temp_store==1)
){
invalidateTempStorage(pParse);
}
sqlite3_free(sqlite3_temp_directory);
if( zRight[0] ){
- sqlite3_temp_directory = zRight;
- zRight = 0;
+ sqlite3_temp_directory = sqlite3DbStrDup(0, zRight);
}else{
sqlite3_temp_directory = 0;
}
+#endif /* SQLITE_OMIT_WSD */
}
}else
+#if !defined(SQLITE_ENABLE_LOCKING_STYLE)
+# if defined(__APPLE__)
+# define SQLITE_ENABLE_LOCKING_STYLE 1
+# else
+# define SQLITE_ENABLE_LOCKING_STYLE 0
+# endif
+#endif
+#if SQLITE_ENABLE_LOCKING_STYLE
+ /*
+ ** PRAGMA [database.]lock_proxy_file
+ ** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path"
+ **
+ ** Return or set the value of the lock_proxy_file flag. Changing
+ ** the value sets a specific file to be used for database access locks.
+ **
+ */
+ if( sqlite3StrICmp(zLeft, "lock_proxy_file")==0 ){
+ if( !zRight ){
+ Pager *pPager = sqlite3BtreePager(pDb->pBt);
+ char *proxy_file_path = NULL;
+ sqlite3_file *pFile = sqlite3PagerFile(pPager);
+ sqlite3OsFileControl(pFile, SQLITE_GET_LOCKPROXYFILE,
+ &proxy_file_path);
+
+ if( proxy_file_path ){
+ sqlite3VdbeSetNumCols(v, 1);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME,
+ "lock_proxy_file", SQLITE_STATIC);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0);
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
+ }
+ }else{
+ Pager *pPager = sqlite3BtreePager(pDb->pBt);
+ sqlite3_file *pFile = sqlite3PagerFile(pPager);
+ int res;
+ if( zRight[0] ){
+ res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,
+ zRight);
+ } else {
+ res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,
+ NULL);
+ }
+ if( res!=SQLITE_OK ){
+ sqlite3ErrorMsg(pParse, "failed to set lock proxy file");
+ goto pragma_out;
+ }
+ }
+ }else
+#endif /* SQLITE_ENABLE_LOCKING_STYLE */
+
/*
** PRAGMA [database.]synchronous
** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL
@@ -62082,15 +77100,14 @@ SQLITE_PRIVATE void sqlite3Pragma(
Column *pCol;
sqlite3VdbeSetNumCols(v, 6);
pParse->nMem = 6;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", P4_STATIC);
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", P4_STATIC);
- sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", P4_STATIC);
- sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC);
sqlite3ViewGetColumnNames(pParse, pTab);
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
- const Token *pDflt;
if( IsHiddenColumn(pCol) ){
nHidden++;
continue;
@@ -62099,9 +77116,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0);
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
pCol->zType ? pCol->zType : "", 0);
- sqlite3VdbeAddOp2(v, OP_Integer, pCol->notNull, 4);
- if( pCol->pDflt && (pDflt = &pCol->pDflt->span)->z ){
- sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pDflt->z, pDflt->n);
+ sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4);
+ if( pCol->zDflt ){
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pCol->zDflt, 0);
}else{
sqlite3VdbeAddOp2(v, OP_Null, 0, 5);
}
@@ -62121,9 +77138,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
pTab = pIdx->pTable;
sqlite3VdbeSetNumCols(v, 3);
pParse->nMem = 3;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", P4_STATIC);
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC);
for(i=0; i<pIdx->nColumn; i++){
int cnum = pIdx->aiColumn[i];
sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
@@ -62147,9 +77164,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
int i = 0;
sqlite3VdbeSetNumCols(v, 3);
pParse->nMem = 3;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC);
while(pIdx){
sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0);
@@ -62167,9 +77184,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
sqlite3VdbeSetNumCols(v, 3);
pParse->nMem = 3;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC);
for(i=0; i<db->nDb; i++){
if( db->aDb[i].pBt==0 ) continue;
assert( db->aDb[i].zName!=0 );
@@ -62186,8 +77203,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
HashElem *p;
sqlite3VdbeSetNumCols(v, 2);
pParse->nMem = 2;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){
CollSeq *pColl = (CollSeq *)sqliteHashData(p);
sqlite3VdbeAddOp2(v, OP_Integer, i++, 1);
@@ -62208,24 +77225,32 @@ SQLITE_PRIVATE void sqlite3Pragma(
pFK = pTab->pFKey;
if( pFK ){
int i = 0;
- sqlite3VdbeSetNumCols(v, 5);
- pParse->nMem = 5;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", P4_STATIC);
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", P4_STATIC);
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", P4_STATIC);
- sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", P4_STATIC);
+ sqlite3VdbeSetNumCols(v, 8);
+ pParse->nMem = 8;
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC);
while(pFK){
int j;
for(j=0; j<pFK->nCol; j++){
char *zCol = pFK->aCol[j].zCol;
+ char *zOnDelete = (char *)actionName(pFK->aAction[0]);
+ char *zOnUpdate = (char *)actionName(pFK->aAction[1]);
sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
sqlite3VdbeAddOp2(v, OP_Integer, j, 2);
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0);
sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0,
pTab->aCol[pFK->aCol[j].iFrom].zName, 0);
sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0);
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0);
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0);
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8);
}
++i;
pFK = pFK->pNextFrom;
@@ -62287,7 +77312,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
pParse->nMem = 6;
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC);
/* Set the maximum error count */
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
@@ -62328,7 +77353,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
cnt++;
}
}
- if( cnt==0 ) continue;
/* Make sure sufficient number of registers have been allocated */
if( pParse->nMem < cnt+4 ){
@@ -62337,12 +77361,12 @@ SQLITE_PRIVATE void sqlite3Pragma(
/* Do the b-tree integrity checks */
sqlite3VdbeAddOp3(v, OP_IntegrityCk, 2, cnt, 1);
- sqlite3VdbeChangeP5(v, i);
+ sqlite3VdbeChangeP5(v, (u8)i);
addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2);
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName),
P4_DYNAMIC);
- sqlite3VdbeAddOp2(v, OP_Move, 2, 4);
+ sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1);
sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2);
sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1);
sqlite3VdbeJumpHere(v, addr);
@@ -62401,7 +77425,6 @@ SQLITE_PRIVATE void sqlite3Pragma(
{ OP_Concat, 3, 2, 2},
{ OP_ResultRow, 2, 1, 0},
};
- if( pIdx->tnum==0 ) continue;
addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1);
sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);
sqlite3VdbeJumpHere(v, addr);
@@ -62452,11 +77475,11 @@ SQLITE_PRIVATE void sqlite3Pragma(
char *zName;
u8 enc;
} encnames[] = {
- { "UTF-8", SQLITE_UTF8 },
{ "UTF8", SQLITE_UTF8 },
- { "UTF-16le", SQLITE_UTF16LE },
+ { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */
+ { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */
+ { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */
{ "UTF16le", SQLITE_UTF16LE },
- { "UTF-16be", SQLITE_UTF16BE },
{ "UTF16be", SQLITE_UTF16BE },
{ "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */
{ "UTF16", 0 }, /* SQLITE_UTF16NATIVE */
@@ -62466,14 +77489,12 @@ SQLITE_PRIVATE void sqlite3Pragma(
if( !zRight ){ /* "PRAGMA encoding" */
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", SQLITE_STATIC);
sqlite3VdbeAddOp2(v, OP_String8, 0, 1);
- for(pEnc=&encnames[0]; pEnc->zName; pEnc++){
- if( pEnc->enc==ENC(pParse->db) ){
- sqlite3VdbeChangeP4(v, -1, pEnc->zName, P4_STATIC);
- break;
- }
- }
+ assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 );
+ assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE );
+ assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE );
+ sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
}else{ /* "PRAGMA encoding = XXX" */
/* Only change the value of sqlite.enc if the database handle is not
@@ -62529,24 +77550,21 @@ SQLITE_PRIVATE void sqlite3Pragma(
|| sqlite3StrICmp(zLeft, "user_version")==0
|| sqlite3StrICmp(zLeft, "freelist_count")==0
){
-
- int iCookie; /* Cookie index. 0 for schema-cookie, 6 for user-cookie. */
+ int iCookie; /* Cookie index. 1 for schema-cookie, 6 for user-cookie. */
sqlite3VdbeUsesBtree(v, iDb);
switch( zLeft[0] ){
- case 's': case 'S':
- iCookie = 0;
- break;
case 'f': case 'F':
- iCookie = 1;
- iDb = (-1*(iDb+1));
- assert(iDb<=0);
+ iCookie = BTREE_FREE_PAGE_COUNT;
+ break;
+ case 's': case 'S':
+ iCookie = BTREE_SCHEMA_VERSION;
break;
default:
- iCookie = 5;
+ iCookie = BTREE_USER_VERSION;
break;
}
- if( zRight && iDb>=0 ){
+ if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){
/* Write the specified cookie value */
static const VdbeOpList setCookie[] = {
{ OP_Transaction, 0, 1, 0}, /* 0 */
@@ -62561,14 +77579,16 @@ SQLITE_PRIVATE void sqlite3Pragma(
}else{
/* Read the specified cookie value */
static const VdbeOpList readCookie[] = {
- { OP_ReadCookie, 0, 1, 0}, /* 0 */
+ { OP_Transaction, 0, 0, 0}, /* 0 */
+ { OP_ReadCookie, 0, 1, 0}, /* 1 */
{ OP_ResultRow, 1, 1, 0}
};
int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie);
sqlite3VdbeChangeP1(v, addr, iDb);
- sqlite3VdbeChangeP3(v, addr, iCookie);
+ sqlite3VdbeChangeP1(v, addr+1, iDb);
+ sqlite3VdbeChangeP3(v, addr+1, iCookie);
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, P4_TRANSIENT);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT);
}
}else
#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */
@@ -62582,11 +77602,10 @@ SQLITE_PRIVATE void sqlite3Pragma(
"unlocked", "shared", "reserved", "pending", "exclusive"
};
int i;
- Vdbe *v = sqlite3GetVdbe(pParse);
sqlite3VdbeSetNumCols(v, 2);
pParse->nMem = 2;
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", P4_STATIC);
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", SQLITE_STATIC);
+ sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", SQLITE_STATIC);
for(i=0; i<db->nDb; i++){
Btree *pBt;
Pager *pPager;
@@ -62604,23 +77623,31 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);
}
- }else
-#endif
-#ifdef SQLITE_SSE
- /*
- ** Check to see if the sqlite_statements table exists. Create it
- ** if it does not.
- */
- if( sqlite3StrICmp(zLeft, "create_sqlite_statement_table")==0 ){
- extern int sqlite3CreateStatementsTable(Parse*);
- sqlite3CreateStatementsTable(pParse);
}else
#endif
#if SQLITE_HAS_CODEC
- if( sqlite3StrICmp(zLeft, "key")==0 ){
- sqlite3_key(db, zRight, strlen(zRight));
+ if( sqlite3StrICmp(zLeft, "key")==0 && zRight ){
+ sqlite3_key(db, zRight, sqlite3Strlen30(zRight));
+ }else
+ if( sqlite3StrICmp(zLeft, "rekey")==0 && zRight ){
+ sqlite3_rekey(db, zRight, sqlite3Strlen30(zRight));
+ }else
+ if( zRight && (sqlite3StrICmp(zLeft, "hexkey")==0 ||
+ sqlite3StrICmp(zLeft, "hexrekey")==0) ){
+ int i, h1, h2;
+ char zKey[40];
+ for(i=0; (h1 = zRight[i])!=0 && (h2 = zRight[i+1])!=0; i+=2){
+ h1 += 9*(1&(h1>>6));
+ h2 += 9*(1&(h2>>6));
+ zKey[i/2] = (h2 & 0x0f) | ((h1 & 0xf)<<4);
+ }
+ if( (zLeft[3] & 0xf)==0xb ){
+ sqlite3_key(db, zKey, i/2);
+ }else{
+ sqlite3_rekey(db, zKey, i/2);
+ }
}else
#endif
#if SQLITE_HAS_CODEC || defined(SQLITE_ENABLE_CEROD)
@@ -62637,35 +77664,34 @@ SQLITE_PRIVATE void sqlite3Pragma(
sqlite3_activate_cerod(&zRight[6]);
}
#endif
- }
+ }else
#endif
- {}
+
+ {/* Empty ELSE clause */}
- if( v ){
- /* Code an OP_Expire at the end of each PRAGMA program to cause
- ** the VDBE implementing the pragma to expire. Most (all?) pragmas
- ** are only valid for a single execution.
- */
- sqlite3VdbeAddOp2(v, OP_Expire, 1, 0);
+ /* Code an OP_Expire at the end of each PRAGMA program to cause
+ ** the VDBE implementing the pragma to expire. Most (all?) pragmas
+ ** are only valid for a single execution.
+ */
+ sqlite3VdbeAddOp2(v, OP_Expire, 1, 0);
- /*
- ** Reset the safety level, in case the fullfsync flag or synchronous
- ** setting changed.
- */
+ /*
+ ** Reset the safety level, in case the fullfsync flag or synchronous
+ ** setting changed.
+ */
#ifndef SQLITE_OMIT_PAGER_PRAGMAS
- if( db->autoCommit ){
- sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level,
- (db->flags&SQLITE_FullFSync)!=0);
- }
-#endif
+ if( db->autoCommit ){
+ sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level,
+ (db->flags&SQLITE_FullFSync)!=0);
}
+#endif
pragma_out:
- sqlite3_free(zLeft);
- sqlite3_free(zRight);
+ sqlite3DbFree(db, zLeft);
+ sqlite3DbFree(db, zRight);
}
-#endif /* SQLITE_OMIT_PRAGMA || SQLITE_OMIT_PARSER */
+#endif /* SQLITE_OMIT_PRAGMA */
/************** End of pragma.c **********************************************/
/************** Begin file prepare.c *****************************************/
@@ -62684,7 +77710,7 @@ pragma_out:
** interface, and routines that contribute to loading the database schema
** from disk.
**
-** $Id: prepare.c,v 1.83 2008/04/03 14:36:26 danielk1977 Exp $
+** $Id: prepare.c,v 1.131 2009/08/06 17:43:31 drh Exp $
*/
/*
@@ -62696,12 +77722,17 @@ static void corruptSchema(
const char *zObj, /* Object being parsed at the point of error */
const char *zExtra /* Error information */
){
- if( !pData->db->mallocFailed ){
+ sqlite3 *db = pData->db;
+ if( !db->mallocFailed && (db->flags & SQLITE_RecoveryMode)==0 ){
if( zObj==0 ) zObj = "?";
- sqlite3SetString(pData->pzErrMsg, "malformed database schema (", zObj, ")",
- zExtra!=0 && zExtra[0]!=0 ? " - " : (char*)0, zExtra, (char*)0);
+ sqlite3SetString(pData->pzErrMsg, db,
+ "malformed database schema (%s)", zObj);
+ if( zExtra ){
+ *pData->pzErrMsg = sqlite3MAppendf(db, *pData->pzErrMsg,
+ "%s - %s", *pData->pzErrMsg, zExtra);
+ }
}
- pData->rc = SQLITE_CORRUPT;
+ pData->rc = db->mallocFailed ? SQLITE_NOMEM : SQLITE_CORRUPT;
}
/*
@@ -62716,27 +77747,25 @@ static void corruptSchema(
** argv[2] = SQL text for the CREATE statement.
**
*/
-SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){
+SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){
InitData *pData = (InitData*)pInit;
sqlite3 *db = pData->db;
int iDb = pData->iDb;
+ assert( argc==3 );
+ UNUSED_PARAMETER2(NotUsed, argc);
assert( sqlite3_mutex_held(db->mutex) );
- pData->rc = SQLITE_OK;
DbClearProperty(db, iDb, DB_Empty);
if( db->mallocFailed ){
corruptSchema(pData, argv[0], 0);
- return SQLITE_NOMEM;
+ return 1;
}
- assert( argc==3 );
+ assert( iDb>=0 && iDb<db->nDb );
if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */
if( argv[1]==0 ){
corruptSchema(pData, argv[0], 0);
- return 1;
- }
- assert( iDb>=0 && iDb<db->nDb );
- if( argv[2] && argv[2][0] ){
+ }else if( argv[2] && argv[2][0] ){
/* Call the parser to process a CREATE TABLE, INDEX or VIEW.
** But because db->init.busy is set to 1, no VDBE code is generated
** or executed. All the parser does is build the internal data
@@ -62747,18 +77776,22 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
assert( db->init.busy );
db->init.iDb = iDb;
db->init.newTnum = atoi(argv[1]);
+ db->init.orphanTrigger = 0;
rc = sqlite3_exec(db, argv[2], 0, 0, &zErr);
db->init.iDb = 0;
assert( rc!=SQLITE_OK || zErr==0 );
if( SQLITE_OK!=rc ){
- pData->rc = rc;
- if( rc==SQLITE_NOMEM ){
- db->mallocFailed = 1;
- }else if( rc!=SQLITE_INTERRUPT ){
- corruptSchema(pData, argv[0], zErr);
+ if( db->init.orphanTrigger ){
+ assert( iDb==1 );
+ }else{
+ pData->rc = rc;
+ if( rc==SQLITE_NOMEM ){
+ db->mallocFailed = 1;
+ }else if( rc!=SQLITE_INTERRUPT && rc!=SQLITE_LOCKED ){
+ corruptSchema(pData, argv[0], zErr);
+ }
}
- sqlite3_free(zErr);
- return 1;
+ sqlite3DbFree(db, zErr);
}
}else if( argv[0]==0 ){
corruptSchema(pData, 0, 0);
@@ -62771,15 +77804,15 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
*/
Index *pIndex;
pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName);
- if( pIndex==0 || pIndex->tnum!=0 ){
+ if( pIndex==0 ){
/* This can occur if there exists an index on a TEMP table which
** has the same name as another index on a permanent index. Since
** the permanent table is hidden by the TEMP table, we can also
** safely ignore the index on the permanent table.
*/
/* Do Nothing */;
- }else{
- pIndex->tnum = atoi(argv[1]);
+ }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){
+ corruptSchema(pData, argv[0], "invalid rootpage");
}
}
return 0;
@@ -62795,15 +77828,16 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char
*/
static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
int rc;
- BtCursor *curMain;
+ int i;
int size;
Table *pTab;
Db *pDb;
char const *azArg[4];
- int meta[10];
+ int meta[5];
InitData initData;
char const *zMasterSchema;
char const *zMasterName = SCHEMA_TABLE(iDb);
+ int openedTransaction = 0;
/*
** The master database table has a structure like this
@@ -62854,38 +77888,41 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
azArg[3] = 0;
initData.db = db;
initData.iDb = iDb;
+ initData.rc = SQLITE_OK;
initData.pzErrMsg = pzErrMsg;
(void)sqlite3SafetyOff(db);
- rc = sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
+ sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
(void)sqlite3SafetyOn(db);
- if( rc ){
+ if( initData.rc ){
rc = initData.rc;
goto error_out;
}
pTab = sqlite3FindTable(db, zMasterName, db->aDb[iDb].zName);
- if( pTab ){
- pTab->readOnly = 1;
+ if( ALWAYS(pTab) ){
+ pTab->tabFlags |= TF_Readonly;
}
/* Create a cursor to hold the database open
*/
pDb = &db->aDb[iDb];
if( pDb->pBt==0 ){
- if( !OMIT_TEMPDB && iDb==1 ){
+ if( !OMIT_TEMPDB && ALWAYS(iDb==1) ){
DbSetProperty(db, 1, DB_SchemaLoaded);
}
return SQLITE_OK;
}
- curMain = sqlite3MallocZero(sqlite3BtreeCursorSize());
- if( !curMain ){
- rc = SQLITE_NOMEM;
- goto error_out;
- }
+
+ /* If there is not already a read-only (or read-write) transaction opened
+ ** on the b-tree database, open one now. If a transaction is opened, it
+ ** will be closed before this function returns. */
sqlite3BtreeEnter(pDb->pBt);
- rc = sqlite3BtreeCursor(pDb->pBt, MASTER_ROOT, 0, 0, curMain);
- if( rc!=SQLITE_OK && rc!=SQLITE_EMPTY ){
- sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0);
- goto leave_error_out;
+ if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){
+ rc = sqlite3BtreeBeginTrans(pDb->pBt, 0);
+ if( rc!=SQLITE_OK ){
+ sqlite3SetString(pzErrMsg, db, "%s", sqlite3ErrStr(rc));
+ goto initone_error_out;
+ }
+ openedTransaction = 1;
}
/* Get the database meta information.
@@ -62894,48 +77931,42 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** meta[0] Schema cookie. Changes with each schema change.
** meta[1] File format of schema layer.
** meta[2] Size of the page cache.
- ** meta[3] Use freelist if 0. Autovacuum if greater than zero.
+ ** meta[3] Largest rootpage (auto/incr_vacuum mode)
** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE
- ** meta[5] The user cookie. Used by the application.
- ** meta[6] Incremental-vacuum flag.
- ** meta[7]
- ** meta[8]
- ** meta[9]
+ ** meta[5] User version
+ ** meta[6] Incremental vacuum mode
+ ** meta[7] unused
+ ** meta[8] unused
+ ** meta[9] unused
**
** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to
** the possible values of meta[4].
*/
- if( rc==SQLITE_OK ){
- int i;
- for(i=0; rc==SQLITE_OK && i<sizeof(meta)/sizeof(meta[0]); i++){
- rc = sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
- }
- if( rc ){
- sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0);
- goto leave_error_out;
- }
- }else{
- memset(meta, 0, sizeof(meta));
+ for(i=0; i<ArraySize(meta); i++){
+ sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
}
- pDb->pSchema->schema_cookie = meta[0];
+ pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1];
/* If opening a non-empty database, check the text encoding. For the
** main database, set sqlite3.enc to the encoding of the main database.
** For an attached db, it is an error if the encoding is not the same
** as sqlite3.enc.
*/
- if( meta[4] ){ /* text encoding */
+ if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */
if( iDb==0 ){
+ u8 encoding;
/* If opening the main database, set ENC(db). */
- ENC(db) = (u8)meta[4];
- db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0);
+ encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3;
+ if( encoding==0 ) encoding = SQLITE_UTF8;
+ ENC(db) = encoding;
+ db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0);
}else{
/* If opening an attached database, the encoding much match ENC(db) */
- if( meta[4]!=ENC(db) ){
- sqlite3SetString(pzErrMsg, "attached databases must use the same"
- " text encoding as main database", (char*)0);
+ if( meta[BTREE_TEXT_ENCODING-1]!=ENC(db) ){
+ sqlite3SetString(pzErrMsg, db, "attached databases must use the same"
+ " text encoding as main database");
rc = SQLITE_ERROR;
- goto leave_error_out;
+ goto initone_error_out;
}
}
}else{
@@ -62943,11 +77974,13 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
}
pDb->pSchema->enc = ENC(db);
- size = meta[2];
- if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; }
- if( size<0 ) size = -size;
- pDb->pSchema->cache_size = size;
- sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
+ if( pDb->pSchema->cache_size==0 ){
+ size = meta[BTREE_DEFAULT_CACHE_SIZE-1];
+ if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; }
+ if( size<0 ) size = -size;
+ pDb->pSchema->cache_size = size;
+ sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
+ }
/*
** file_format==1 Version 3.0.0.
@@ -62955,14 +77988,14 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults
** file_format==4 Version 3.3.0. // DESC indices. Boolean constants
*/
- pDb->pSchema->file_format = meta[1];
+ pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1];
if( pDb->pSchema->file_format==0 ){
pDb->pSchema->file_format = 1;
}
if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){
- sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0);
+ sqlite3SetString(pzErrMsg, db, "unsupported file format");
rc = SQLITE_ERROR;
- goto leave_error_out;
+ goto initone_error_out;
}
/* Ticket #2804: When we open a database in the newer file format,
@@ -62970,17 +78003,14 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** not downgrade the database and thus invalidate any descending
** indices that the user might have created.
*/
- if( iDb==0 && meta[1]>=4 ){
+ if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){
db->flags &= ~SQLITE_LegacyFileFmt;
}
/* Read the schema information out of the schema tables
*/
assert( db->init.busy );
- if( rc==SQLITE_EMPTY ){
- /* For an empty database, there is nothing to read */
- rc = SQLITE_OK;
- }else{
+ {
char *zSql;
zSql = sqlite3MPrintf(db,
"SELECT name, rootpage, sql FROM '%q'.%s",
@@ -62997,9 +78027,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
db->xAuth = xAuth;
}
#endif
- if( rc==SQLITE_ABORT ) rc = initData.rc;
+ if( rc==SQLITE_OK ) rc = initData.rc;
(void)sqlite3SafetyOn(db);
- sqlite3_free(zSql);
+ sqlite3DbFree(db, zSql);
#ifndef SQLITE_OMIT_ANALYZE
if( rc==SQLITE_OK ){
sqlite3AnalysisLoad(db, iDb);
@@ -63007,16 +78037,15 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
#endif
}
if( db->mallocFailed ){
- /* sqlite3SetString(pzErrMsg, "out of memory", (char*)0); */
rc = SQLITE_NOMEM;
sqlite3ResetInternalSchema(db, 0);
}
if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){
/* Black magic: If the SQLITE_RecoveryMode flag is set, then consider
- ** the schema loaded, even if errors occured. In this situation the
+ ** the schema loaded, even if errors occurred. In this situation the
** current sqlite3_prepare() operation will fail, but the following one
** will attempt to compile the supplied statement against whatever subset
- ** of the schema was loaded before the error occured. The primary
+ ** of the schema was loaded before the error occurred. The primary
** purpose of this is to allow access to the sqlite_master table
** even when its contents have been corrupted.
*/
@@ -63028,9 +78057,10 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
** curMain and calling sqlite3BtreeEnter(). For an error that occurs
** before that point, jump to error_out.
*/
-leave_error_out:
- sqlite3BtreeCloseCursor(curMain);
- sqlite3_free(curMain);
+initone_error_out:
+ if( openedTransaction ){
+ sqlite3BtreeCommit(pDb->pBt);
+ }
sqlite3BtreeLeave(pDb->pBt);
error_out:
@@ -63055,7 +78085,6 @@ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){
int commit_internal = !(db->flags&SQLITE_InternChanges);
assert( sqlite3_mutex_held(db->mutex) );
- if( db->init.busy ) return SQLITE_OK;
rc = SQLITE_OK;
db->init.busy = 1;
for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
@@ -63071,7 +78100,8 @@ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){
** schema may contain references to objects in other databases.
*/
#ifndef SQLITE_OMIT_TEMPDB
- if( rc==SQLITE_OK && db->nDb>1 && !DbHasProperty(db, 1, DB_SchemaLoaded) ){
+ if( rc==SQLITE_OK && ALWAYS(db->nDb>1)
+ && !DbHasProperty(db, 1, DB_SchemaLoaded) ){
rc = sqlite3InitOne(db, 1, pzErrMsg);
if( rc ){
sqlite3ResetInternalSchema(db, 1);
@@ -63108,42 +78138,47 @@ SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){
/*
** Check schema cookies in all databases. If any cookie is out
-** of date, return 0. If all schema cookies are current, return 1.
+** of date set pParse->rc to SQLITE_SCHEMA. If all schema cookies
+** make no changes to pParse->rc.
*/
-static int schemaIsValid(sqlite3 *db){
+static void schemaIsValid(Parse *pParse){
+ sqlite3 *db = pParse->db;
int iDb;
int rc;
- BtCursor *curTemp;
int cookie;
- int allOk = 1;
- curTemp = (BtCursor *)sqlite3_malloc(sqlite3BtreeCursorSize());
- if( curTemp ){
- assert( sqlite3_mutex_held(db->mutex) );
- for(iDb=0; allOk && iDb<db->nDb; iDb++){
- Btree *pBt;
- pBt = db->aDb[iDb].pBt;
- if( pBt==0 ) continue;
- memset(curTemp, 0, sqlite3BtreeCursorSize());
- rc = sqlite3BtreeCursor(pBt, MASTER_ROOT, 0, 0, curTemp);
- if( rc==SQLITE_OK ){
- rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&cookie);
- if( rc==SQLITE_OK && cookie!=db->aDb[iDb].pSchema->schema_cookie ){
- allOk = 0;
- }
- sqlite3BtreeCloseCursor(curTemp);
- }
+ assert( pParse->checkSchema );
+ assert( sqlite3_mutex_held(db->mutex) );
+ for(iDb=0; iDb<db->nDb; iDb++){
+ int openedTransaction = 0; /* True if a transaction is opened */
+ Btree *pBt = db->aDb[iDb].pBt; /* Btree database to read cookie from */
+ if( pBt==0 ) continue;
+
+ /* If there is not already a read-only (or read-write) transaction opened
+ ** on the b-tree database, open one now. If a transaction is opened, it
+ ** will be closed immediately after reading the meta-value. */
+ if( !sqlite3BtreeIsInReadTrans(pBt) ){
+ rc = sqlite3BtreeBeginTrans(pBt, 0);
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
db->mallocFailed = 1;
}
+ if( rc!=SQLITE_OK ) return;
+ openedTransaction = 1;
}
- sqlite3_free(curTemp);
- }else{
- allOk = 0;
- db->mallocFailed = 1;
- }
- return allOk;
+ /* Read the schema cookie from the database. If it does not match the
+ ** value stored as part of the in the in-memory schema representation,
+ ** set Parse.rc to SQLITE_SCHEMA. */
+ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie);
+ if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){
+ pParse->rc = SQLITE_SCHEMA;
+ }
+
+ /* Close the transaction, if one was opened. */
+ if( openedTransaction ){
+ sqlite3BtreeCommit(pBt);
+ }
+ }
}
/*
@@ -63162,18 +78197,18 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
** function should never be used.
**
** We return -1000000 instead of the more usual -1 simply because using
- ** -1000000 as incorrectly using -1000000 index into db->aDb[] is much
+ ** -1000000 as the incorrect index into db->aDb[] is much
** more likely to cause a segfault than -1 (of course there are assert()
** statements too, but it never hurts to play the odds).
*/
assert( sqlite3_mutex_held(db->mutex) );
if( pSchema ){
- for(i=0; i<db->nDb; i++){
+ for(i=0; ALWAYS(i<db->nDb); i++){
if( db->aDb[i].pSchema==pSchema ){
break;
}
}
- assert( i>=0 &&i>=0 && i<db->nDb );
+ assert( i>=0 && i<db->nDb );
}
return i;
}
@@ -63189,93 +78224,127 @@ static int sqlite3Prepare(
sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
const char **pzTail /* OUT: End of parsed string */
){
- Parse sParse;
- char *zErrMsg = 0;
- int rc = SQLITE_OK;
- int i;
+ Parse *pParse; /* Parsing context */
+ char *zErrMsg = 0; /* Error message */
+ int rc = SQLITE_OK; /* Result code */
+ int i; /* Loop counter */
+
+ /* Allocate the parsing context */
+ pParse = sqlite3StackAllocZero(db, sizeof(*pParse));
+ if( pParse==0 ){
+ rc = SQLITE_NOMEM;
+ goto end_prepare;
+ }
- assert( ppStmt );
- *ppStmt = 0;
if( sqlite3SafetyOn(db) ){
- return SQLITE_MISUSE;
+ rc = SQLITE_MISUSE;
+ goto end_prepare;
}
+ assert( ppStmt && *ppStmt==0 );
assert( !db->mallocFailed );
assert( sqlite3_mutex_held(db->mutex) );
- /* If any attached database schemas are locked, do not proceed with
- ** compilation. Instead return SQLITE_LOCKED immediately.
+ /* Check to verify that it is possible to get a read lock on all
+ ** database schemas. The inability to get a read lock indicates that
+ ** some other database connection is holding a write-lock, which in
+ ** turn means that the other connection has made uncommitted changes
+ ** to the schema.
+ **
+ ** Were we to proceed and prepare the statement against the uncommitted
+ ** schema changes and if those schema changes are subsequently rolled
+ ** back and different changes are made in their place, then when this
+ ** prepared statement goes to run the schema cookie would fail to detect
+ ** the schema change. Disaster would follow.
+ **
+ ** This thread is currently holding mutexes on all Btrees (because
+ ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it
+ ** is not possible for another thread to start a new schema change
+ ** while this routine is running. Hence, we do not need to hold
+ ** locks on the schema, we just need to make sure nobody else is
+ ** holding them.
+ **
+ ** Note that setting READ_UNCOMMITTED overrides most lock detection,
+ ** but it does *not* override schema lock detection, so this all still
+ ** works even if READ_UNCOMMITTED is set.
*/
for(i=0; i<db->nDb; i++) {
Btree *pBt = db->aDb[i].pBt;
if( pBt ){
- int rc;
+ assert( sqlite3BtreeHoldsMutex(pBt) );
rc = sqlite3BtreeSchemaLocked(pBt);
if( rc ){
const char *zDb = db->aDb[i].zName;
- sqlite3Error(db, SQLITE_LOCKED, "database schema is locked: %s", zDb);
+ sqlite3Error(db, rc, "database schema is locked: %s", zDb);
(void)sqlite3SafetyOff(db);
- return SQLITE_LOCKED;
+ testcase( db->flags & SQLITE_ReadUncommitted );
+ goto end_prepare;
}
}
}
-
- memset(&sParse, 0, sizeof(sParse));
- sParse.db = db;
- if( nBytes>=0 && zSql[nBytes-1]!=0 ){
+
+ sqlite3VtabUnlockList(db);
+
+ pParse->db = db;
+ if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){
char *zSqlCopy;
int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
+ testcase( nBytes==mxLen );
+ testcase( nBytes==mxLen+1 );
if( nBytes>mxLen ){
sqlite3Error(db, SQLITE_TOOBIG, "statement too long");
(void)sqlite3SafetyOff(db);
- return SQLITE_TOOBIG;
+ rc = sqlite3ApiExit(db, SQLITE_TOOBIG);
+ goto end_prepare;
}
zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes);
if( zSqlCopy ){
- sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg);
- sqlite3_free(zSqlCopy);
- sParse.zTail = &zSql[sParse.zTail-zSqlCopy];
+ sqlite3RunParser(pParse, zSqlCopy, &zErrMsg);
+ sqlite3DbFree(db, zSqlCopy);
+ pParse->zTail = &zSql[pParse->zTail-zSqlCopy];
}else{
- sParse.zTail = &zSql[nBytes];
+ pParse->zTail = &zSql[nBytes];
}
}else{
- sqlite3RunParser(&sParse, zSql, &zErrMsg);
+ sqlite3RunParser(pParse, zSql, &zErrMsg);
}
if( db->mallocFailed ){
- sParse.rc = SQLITE_NOMEM;
+ pParse->rc = SQLITE_NOMEM;
}
- if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK;
- if( sParse.checkSchema && !schemaIsValid(db) ){
- sParse.rc = SQLITE_SCHEMA;
+ if( pParse->rc==SQLITE_DONE ) pParse->rc = SQLITE_OK;
+ if( pParse->checkSchema ){
+ schemaIsValid(pParse);
}
- if( sParse.rc==SQLITE_SCHEMA ){
+ if( pParse->rc==SQLITE_SCHEMA ){
sqlite3ResetInternalSchema(db, 0);
}
if( db->mallocFailed ){
- sParse.rc = SQLITE_NOMEM;
+ pParse->rc = SQLITE_NOMEM;
}
if( pzTail ){
- *pzTail = sParse.zTail;
+ *pzTail = pParse->zTail;
}
- rc = sParse.rc;
+ rc = pParse->rc;
#ifndef SQLITE_OMIT_EXPLAIN
- if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){
- if( sParse.explain==2 ){
- sqlite3VdbeSetNumCols(sParse.pVdbe, 3);
- sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "order", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "from", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "detail", P4_STATIC);
+ if( rc==SQLITE_OK && pParse->pVdbe && pParse->explain ){
+ static const char * const azColName[] = {
+ "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment",
+ "order", "from", "detail"
+ };
+ int iFirst, mx;
+ if( pParse->explain==2 ){
+ sqlite3VdbeSetNumCols(pParse->pVdbe, 3);
+ iFirst = 8;
+ mx = 11;
}else{
- sqlite3VdbeSetNumCols(sParse.pVdbe, 8);
- sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "addr", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "opcode", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "p1", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 3, COLNAME_NAME, "p2", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 4, COLNAME_NAME, "p3", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 5, COLNAME_NAME, "p4", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 6, COLNAME_NAME, "p5", P4_STATIC);
- sqlite3VdbeSetColName(sParse.pVdbe, 7, COLNAME_NAME, "comment",P4_STATIC);
+ sqlite3VdbeSetNumCols(pParse->pVdbe, 8);
+ iFirst = 0;
+ mx = 8;
+ }
+ for(i=iFirst; i<mx; i++){
+ sqlite3VdbeSetColName(pParse->pVdbe, i-iFirst, COLNAME_NAME,
+ azColName[i], SQLITE_STATIC);
}
}
#endif
@@ -63284,23 +78353,36 @@ static int sqlite3Prepare(
rc = SQLITE_MISUSE;
}
- if( saveSqlFlag ){
- sqlite3VdbeSetSql(sParse.pVdbe, zSql, sParse.zTail - zSql);
+ assert( db->init.busy==0 || saveSqlFlag==0 );
+ if( db->init.busy==0 ){
+ Vdbe *pVdbe = pParse->pVdbe;
+ sqlite3VdbeSetSql(pVdbe, zSql, (int)(pParse->zTail-zSql), saveSqlFlag);
}
- if( rc!=SQLITE_OK || db->mallocFailed ){
- sqlite3_finalize((sqlite3_stmt*)sParse.pVdbe);
+ if( pParse->pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){
+ sqlite3VdbeFinalize(pParse->pVdbe);
assert(!(*ppStmt));
}else{
- *ppStmt = (sqlite3_stmt*)sParse.pVdbe;
+ *ppStmt = (sqlite3_stmt*)pParse->pVdbe;
}
if( zErrMsg ){
sqlite3Error(db, rc, "%s", zErrMsg);
- sqlite3_free(zErrMsg);
+ sqlite3DbFree(db, zErrMsg);
}else{
sqlite3Error(db, rc, 0);
}
+ /* Delete any TriggerPrg structures allocated while parsing this statement. */
+ while( pParse->pTriggerPrg ){
+ TriggerPrg *pT = pParse->pTriggerPrg;
+ pParse->pTriggerPrg = pT->pNext;
+ sqlite3VdbeProgramDelete(db, pT->pProgram, 0);
+ sqlite3DbFree(db, pT);
+ }
+
+end_prepare:
+
+ sqlite3StackFree(db, pParse);
rc = sqlite3ApiExit(db, rc);
assert( (rc&db->errMask)==rc );
return rc;
@@ -63314,12 +78396,18 @@ static int sqlite3LockAndPrepare(
const char **pzTail /* OUT: End of parsed string */
){
int rc;
+ assert( ppStmt!=0 );
+ *ppStmt = 0;
if( !sqlite3SafetyCheckOk(db) ){
return SQLITE_MISUSE;
}
sqlite3_mutex_enter(db->mutex);
sqlite3BtreeEnterAll(db);
rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail);
+ if( rc==SQLITE_SCHEMA ){
+ sqlite3_finalize(*ppStmt);
+ rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail);
+ }
sqlite3BtreeLeaveAll(db);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -63327,8 +78415,11 @@ static int sqlite3LockAndPrepare(
/*
** Rerun the compilation of a statement after a schema change.
-** Return true if the statement was recompiled successfully.
-** Return false if there is an error of some kind.
+**
+** If the statement is successfully recompiled, return SQLITE_OK. Otherwise,
+** if the statement cannot be recompiled because another connection has
+** locked the sqlite3_master table, return SQLITE_LOCKED. If any other error
+** occurs, return SQLITE_SCHEMA.
*/
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){
int rc;
@@ -63347,15 +78438,15 @@ SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){
db->mallocFailed = 1;
}
assert( pNew==0 );
- return 0;
+ return (rc==SQLITE_LOCKED) ? SQLITE_LOCKED : SQLITE_SCHEMA;
}else{
assert( pNew!=0 );
}
sqlite3VdbeSwap((Vdbe*)pNew, p);
- sqlite3_transfer_bindings(pNew, (sqlite3_stmt*)p);
+ sqlite3TransferBindings(pNew, (sqlite3_stmt*)p);
sqlite3VdbeResetStepResult((Vdbe*)pNew);
sqlite3VdbeFinalize((Vdbe*)pNew);
- return 1;
+ return SQLITE_OK;
}
@@ -63413,6 +78504,8 @@ static int sqlite3Prepare16(
const char *zTail8 = 0;
int rc = SQLITE_OK;
+ assert( ppStmt );
+ *ppStmt = 0;
if( !sqlite3SafetyCheckOk(db) ){
return SQLITE_MISUSE;
}
@@ -63428,10 +78521,10 @@ static int sqlite3Prepare16(
** characters between zSql8 and zTail8, and then returning a pointer
** the same number of characters into the UTF-16 string.
*/
- int chars_parsed = sqlite3Utf8CharLen(zSql8, zTail8-zSql8);
+ int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8));
*pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed);
}
- sqlite3_free(zSql8);
+ sqlite3DbFree(db, zSql8);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -63488,7 +78581,7 @@ SQLITE_API int sqlite3_prepare16_v2(
** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite.
**
-** $Id: select.c,v 1.429 2008/05/01 17:03:49 drh Exp $
+** $Id: select.c,v 1.526 2009/08/01 15:09:58 drh Exp $
*/
@@ -63496,23 +78589,23 @@ SQLITE_API int sqlite3_prepare16_v2(
** Delete all the content of a Select structure but do not deallocate
** the select structure itself.
*/
-static void clearSelect(Select *p){
- sqlite3ExprListDelete(p->pEList);
- sqlite3SrcListDelete(p->pSrc);
- sqlite3ExprDelete(p->pWhere);
- sqlite3ExprListDelete(p->pGroupBy);
- sqlite3ExprDelete(p->pHaving);
- sqlite3ExprListDelete(p->pOrderBy);
- sqlite3SelectDelete(p->pPrior);
- sqlite3ExprDelete(p->pLimit);
- sqlite3ExprDelete(p->pOffset);
+static void clearSelect(sqlite3 *db, Select *p){
+ sqlite3ExprListDelete(db, p->pEList);
+ sqlite3SrcListDelete(db, p->pSrc);
+ sqlite3ExprDelete(db, p->pWhere);
+ sqlite3ExprListDelete(db, p->pGroupBy);
+ sqlite3ExprDelete(db, p->pHaving);
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ sqlite3SelectDelete(db, p->pPrior);
+ sqlite3ExprDelete(db, p->pLimit);
+ sqlite3ExprDelete(db, p->pOffset);
}
/*
** Initialize a SelectDest structure.
*/
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){
- pDest->eDest = eDest;
+ pDest->eDest = (u8)eDest;
pDest->iParm = iParm;
pDest->affinity = 0;
pDest->iMem = 0;
@@ -63540,13 +78633,13 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
Select standin;
sqlite3 *db = pParse->db;
pNew = sqlite3DbMallocZero(db, sizeof(*pNew) );
- assert( !pOffset || pLimit ); /* Can't have OFFSET without LIMIT. */
+ assert( db->mallocFailed || !pOffset || pLimit ); /* OFFSET implies LIMIT */
if( pNew==0 ){
pNew = &standin;
memset(pNew, 0, sizeof(*pNew));
}
if( pEList==0 ){
- pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0,0,0), 0);
+ pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0));
}
pNew->pEList = pEList;
pNew->pSrc = pSrc;
@@ -63554,18 +78647,17 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
pNew->pGroupBy = pGroupBy;
pNew->pHaving = pHaving;
pNew->pOrderBy = pOrderBy;
- pNew->isDistinct = isDistinct;
+ pNew->selFlags = isDistinct ? SF_Distinct : 0;
pNew->op = TK_SELECT;
- assert( pOffset==0 || pLimit!=0 );
pNew->pLimit = pLimit;
pNew->pOffset = pOffset;
- pNew->iLimit = -1;
- pNew->iOffset = -1;
+ assert( pOffset==0 || pLimit!=0 );
pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[1] = -1;
pNew->addrOpenEphm[2] = -1;
- if( pNew==&standin) {
- clearSelect(pNew);
+ if( db->mallocFailed ) {
+ clearSelect(db, pNew);
+ if( pNew!=&standin ) sqlite3DbFree(db, pNew);
pNew = 0;
}
return pNew;
@@ -63574,10 +78666,10 @@ SQLITE_PRIVATE Select *sqlite3SelectNew(
/*
** Delete the given Select structure and all of its substructures.
*/
-SQLITE_PRIVATE void sqlite3SelectDelete(Select *p){
+SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){
if( p ){
- clearSelect(p);
- sqlite3_free(p);
+ clearSelect(db, p);
+ sqlite3DbFree(db, p);
}
}
@@ -63602,18 +78694,20 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p
int jointype = 0;
Token *apAll[3];
Token *p;
+ /* 0123456789 123456789 123456789 123 */
+ static const char zKeyText[] = "naturaleftouterightfullinnercross";
static const struct {
- const char zKeyword[8];
- u8 nChar;
- u8 code;
- } keywords[] = {
- { "natural", 7, JT_NATURAL },
- { "left", 4, JT_LEFT|JT_OUTER },
- { "right", 5, JT_RIGHT|JT_OUTER },
- { "full", 4, JT_LEFT|JT_RIGHT|JT_OUTER },
- { "outer", 5, JT_OUTER },
- { "inner", 5, JT_INNER },
- { "cross", 5, JT_INNER|JT_CROSS },
+ u8 i; /* Beginning of keyword text in zKeyText[] */
+ u8 nChar; /* Length of the keyword in characters */
+ u8 code; /* Join type mask */
+ } aKeyword[] = {
+ /* natural */ { 0, 7, JT_NATURAL },
+ /* left */ { 6, 4, JT_LEFT|JT_OUTER },
+ /* outer */ { 10, 5, JT_OUTER },
+ /* right */ { 14, 5, JT_RIGHT|JT_OUTER },
+ /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER },
+ /* inner */ { 23, 5, JT_INNER },
+ /* cross */ { 28, 5, JT_INNER|JT_CROSS },
};
int i, j;
apAll[0] = pA;
@@ -63621,14 +78715,15 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p
apAll[2] = pC;
for(i=0; i<3 && apAll[i]; i++){
p = apAll[i];
- for(j=0; j<sizeof(keywords)/sizeof(keywords[0]); j++){
- if( p->n==keywords[j].nChar
- && sqlite3StrNICmp((char*)p->z, keywords[j].zKeyword, p->n)==0 ){
- jointype |= keywords[j].code;
+ for(j=0; j<ArraySize(aKeyword); j++){
+ if( p->n==aKeyword[j].nChar
+ && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){
+ jointype |= aKeyword[j].code;
break;
}
}
- if( j>=sizeof(keywords)/sizeof(keywords[0]) ){
+ testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 );
+ if( j>=ArraySize(aKeyword) ){
jointype |= JT_ERROR;
break;
}
@@ -63637,14 +78732,14 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p
(jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||
(jointype & JT_ERROR)!=0
){
- const char *zSp1 = " ";
- const char *zSp2 = " ";
- if( pB==0 ){ zSp1++; }
- if( pC==0 ){ zSp2++; }
+ const char *zSp = " ";
+ assert( pB!=0 );
+ if( pC==0 ){ zSp++; }
sqlite3ErrorMsg(pParse, "unknown or unsupported join type: "
- "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC);
+ "%T %T%s%T", pA, pB, zSp, pC);
jointype = JT_INNER;
- }else if( jointype & JT_RIGHT ){
+ }else if( (jointype & JT_OUTER)!=0
+ && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){
sqlite3ErrorMsg(pParse,
"RIGHT and FULL OUTER JOINs are not currently supported");
jointype = JT_INNER;
@@ -63665,55 +78760,10 @@ static int columnIndex(Table *pTab, const char *zCol){
}
/*
-** Set the value of a token to a '\000'-terminated string.
-*/
-static void setToken(Token *p, const char *z){
- p->z = (u8*)z;
- p->n = z ? strlen(z) : 0;
- p->dyn = 0;
-}
-
-/*
-** Set the token to the double-quoted and escaped version of the string pointed
-** to by z. For example;
-**
-** {a"bc} -> {"a""bc"}
-*/
-static void setQuotedToken(Parse *pParse, Token *p, const char *z){
-
- /* Check if the string contains any " characters. If it does, then
- ** this function will malloc space to create a quoted version of
- ** the string in. Otherwise, save a call to sqlite3MPrintf() by
- ** just copying the pointer to the string.
- */
- const char *z2 = z;
- while( *z2 ){
- if( *z2=='"' ) break;
- z2++;
- }
-
- if( *z2 ){
- /* String contains " characters - copy and quote the string. */
- p->z = (u8 *)sqlite3MPrintf(pParse->db, "\"%w\"", z);
- if( p->z ){
- p->n = strlen((char *)p->z);
- p->dyn = 1;
- }
- }else{
- /* String contains no " characters - copy the pointer. */
- p->z = (u8*)z;
- p->n = (z2 - z);
- p->dyn = 0;
- }
-}
-
-/*
** Create an expression node for an identifier with the name of zName
*/
SQLITE_PRIVATE Expr *sqlite3CreateIdExpr(Parse *pParse, const char *zName){
- Token dummy;
- setToken(&dummy, zName);
- return sqlite3PExpr(pParse, TK_ID, 0, 0, &dummy);
+ return sqlite3Expr(pParse->db, TK_ID, zName);
}
/*
@@ -63750,7 +78800,9 @@ static void addWhereTerm(
pE = sqlite3PExpr(pParse, TK_EQ, pE1c, pE2c, 0);
if( pE && isOuterJoin ){
ExprSetProperty(pE, EP_FromJoin);
- pE->iRightJoinTable = iRightJoinTable;
+ assert( !ExprHasAnyProperty(pE, EP_TokenOnly|EP_Reduced) );
+ ExprSetIrreducible(pE);
+ pE->iRightJoinTable = (i16)iRightJoinTable;
}
*ppExpr = sqlite3ExprAnd(pParse->db,*ppExpr, pE);
}
@@ -63784,7 +78836,9 @@ static void addWhereTerm(
static void setJoinExpr(Expr *p, int iTable){
while( p ){
ExprSetProperty(p, EP_FromJoin);
- p->iRightJoinTable = iTable;
+ assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) );
+ ExprSetIrreducible(p);
+ p->iRightJoinTable = (i16)iTable;
setJoinExpr(p->pLeft, iTable);
p = p->pRight;
}
@@ -63818,7 +78872,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
Table *pRightTab = pRight->pTab;
int isOuter;
- if( pLeftTab==0 || pRightTab==0 ) continue;
+ if( NEVER(pLeftTab==0 || pRightTab==0) ) continue;
isOuter = (pRight->jointype & JT_OUTER)!=0;
/* When the NATURAL keyword is present, add WHERE clause terms for
@@ -63897,17 +78951,18 @@ static void pushOntoSorter(
int nExpr = pOrderBy->nExpr;
int regBase = sqlite3GetTempRange(pParse, nExpr+2);
int regRecord = sqlite3GetTempReg(pParse);
+ sqlite3ExprCacheClear(pParse);
sqlite3ExprCodeExprList(pParse, pOrderBy, regBase, 0);
sqlite3VdbeAddOp2(v, OP_Sequence, pOrderBy->iECursor, regBase+nExpr);
- sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+1);
+ sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+1, 1);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nExpr + 2, regRecord);
sqlite3VdbeAddOp2(v, OP_IdxInsert, pOrderBy->iECursor, regRecord);
sqlite3ReleaseTempReg(pParse, regRecord);
sqlite3ReleaseTempRange(pParse, regBase, nExpr+2);
- if( pSelect->iLimit>=0 ){
+ if( pSelect->iLimit ){
int addr1, addr2;
int iLimit;
- if( pSelect->pOffset ){
+ if( pSelect->iOffset ){
iLimit = pSelect->iOffset+1;
}else{
iLimit = pSelect->iLimit;
@@ -63919,7 +78974,7 @@ static void pushOntoSorter(
sqlite3VdbeAddOp1(v, OP_Last, pOrderBy->iECursor);
sqlite3VdbeAddOp1(v, OP_Delete, pOrderBy->iECursor);
sqlite3VdbeJumpHere(v, addr2);
- pSelect->iLimit = -1;
+ pSelect->iLimit = 0;
}
}
@@ -63931,7 +78986,7 @@ static void codeOffset(
Select *p, /* The SELECT statement being coded */
int iContinue /* Jump here to skip the current record */
){
- if( p->iOffset>=0 && iContinue!=0 ){
+ if( p->iOffset && iContinue!=0 ){
int addr;
sqlite3VdbeAddOp2(v, OP_AddImm, p->iOffset, -1);
addr = sqlite3VdbeAddOp1(v, OP_IfNeg, p->iOffset);
@@ -64008,8 +79063,7 @@ static void selectInnerLoop(
int distinct, /* If >=0, make sure results are distinct */
SelectDest *pDest, /* How to dispose of the results */
int iContinue, /* Jump here to continue with next row */
- int iBreak, /* Jump here to break out of the inner loop */
- char *aff /* affinity string if eDest is SRT_Union */
+ int iBreak /* Jump here to break out of the inner loop */
){
Vdbe *v = pParse->pVdbe;
int i;
@@ -64019,13 +79073,10 @@ static void selectInnerLoop(
int iParm = pDest->iParm; /* First argument to disposal method */
int nResultCol; /* Number of result columns */
- if( v==0 ) return;
+ assert( v );
+ if( NEVER(v==0) ) return;
assert( pEList!=0 );
-
- /* If there was a LIMIT clause on the SELECT statement, then do the check
- ** to see if this row should be output.
- */
- hasDistinct = distinct>=0 && pEList->nExpr>0;
+ hasDistinct = distinct>=0;
if( pOrderBy==0 && !hasDistinct ){
codeOffset(v, p, iContinue);
}
@@ -64038,13 +79089,11 @@ static void selectInnerLoop(
nResultCol = pEList->nExpr;
}
if( pDest->iMem==0 ){
- pDest->iMem = sqlite3GetTempRange(pParse, nResultCol);
+ pDest->iMem = pParse->nMem+1;
pDest->nMem = nResultCol;
- }else if( pDest->nMem!=nResultCol ){
- /* This happens when two SELECTs of a compound SELECT have differing
- ** numbers of result columns. The error message will be generated by
- ** a higher-level routine. */
- return;
+ pParse->nMem += nResultCol;
+ }else{
+ assert( pDest->nMem==nResultCol );
}
regResult = pDest->iMem;
if( nColumn>0 ){
@@ -64055,7 +79104,8 @@ static void selectInnerLoop(
/* If the destination is an EXISTS(...) expression, the actual
** values returned by the SELECT are not required.
*/
- sqlite3ExprCodeExprList(pParse, pEList, regResult, eDest==SRT_Callback);
+ sqlite3ExprCacheClear(pParse);
+ sqlite3ExprCodeExprList(pParse, pEList, regResult, eDest==SRT_Output);
}
nColumn = nResultCol;
@@ -64085,9 +79135,6 @@ static void selectInnerLoop(
int r1;
r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
- if( aff ){
- sqlite3VdbeChangeP4(v, -1, aff, P4_STATIC);
- }
sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1);
sqlite3ReleaseTempReg(pParse, r1);
break;
@@ -64108,6 +79155,8 @@ static void selectInnerLoop(
case SRT_Table:
case SRT_EphemTab: {
int r1 = sqlite3GetTempReg(pParse);
+ testcase( eDest==SRT_Table );
+ testcase( eDest==SRT_EphemTab );
sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
if( pOrderBy ){
pushOntoSorter(pParse, pOrderBy, p, r1);
@@ -64128,10 +79177,7 @@ static void selectInnerLoop(
** item into the set table with bogus data.
*/
case SRT_Set: {
- int addr2;
-
assert( nColumn==1 );
- addr2 = sqlite3VdbeAddOp1(v, OP_IsNull, regResult);
p->affinity = sqlite3CompareAffinity(pEList->a[0].pExpr, pDest->affinity);
if( pOrderBy ){
/* At first glance you would think we could optimize out the
@@ -64146,7 +79192,6 @@ static void selectInnerLoop(
sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1);
sqlite3ReleaseTempReg(pParse, r1);
}
- sqlite3VdbeJumpHere(v, addr2);
break;
}
@@ -64167,7 +79212,7 @@ static void selectInnerLoop(
if( pOrderBy ){
pushOntoSorter(pParse, pOrderBy, p, regResult);
}else{
- sqlite3ExprCodeMove(pParse, regResult, iParm);
+ sqlite3ExprCodeMove(pParse, regResult, iParm, 1);
/* The LIMIT clause will jump out of the loop for us */
}
break;
@@ -64178,15 +79223,17 @@ static void selectInnerLoop(
** case of a subroutine, the subroutine itself is responsible for
** popping the data from the stack.
*/
- case SRT_Subroutine:
- case SRT_Callback: {
+ case SRT_Coroutine:
+ case SRT_Output: {
+ testcase( eDest==SRT_Coroutine );
+ testcase( eDest==SRT_Output );
if( pOrderBy ){
int r1 = sqlite3GetTempReg(pParse);
sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
pushOntoSorter(pParse, pOrderBy, p, r1);
sqlite3ReleaseTempReg(pParse, r1);
- }else if( eDest==SRT_Subroutine ){
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, iParm);
+ }else if( eDest==SRT_Coroutine ){
+ sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm);
}else{
sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nColumn);
sqlite3ExprCacheAffinityChange(pParse, regResult, nColumn);
@@ -64209,7 +79256,9 @@ static void selectInnerLoop(
/* Jump to the end of the loop if the LIMIT is reached.
*/
- if( p->iLimit>=0 && pOrderBy==0 ){
+ if( p->iLimit ){
+ assert( pOrderBy==0 ); /* If there is an ORDER BY, the call to
+ ** pushOntoSorter() would have cleared p->iLimit */
sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, iBreak);
}
@@ -64241,8 +79290,9 @@ static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){
pInfo = sqlite3DbMallocZero(db, sizeof(*pInfo) + nExpr*(sizeof(CollSeq*)+1) );
if( pInfo ){
pInfo->aSortOrder = (u8*)&pInfo->aColl[nExpr];
- pInfo->nField = nExpr;
+ pInfo->nField = (u16)nExpr;
pInfo->enc = ENC(db);
+ pInfo->db = db;
for(i=0, pItem=pList->a; i<nExpr; i++, pItem++){
CollSeq *pColl;
pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr);
@@ -64270,8 +79320,8 @@ static void generateSortTail(
int nColumn, /* Number of columns of data */
SelectDest *pDest /* Write the sorted results here */
){
- int brk = sqlite3VdbeMakeLabel(v);
- int cont = sqlite3VdbeMakeLabel(v);
+ int addrBreak = sqlite3VdbeMakeLabel(v); /* Jump here to exit loop */
+ int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */
int addr;
int iTab;
int pseudoTab = 0;
@@ -64284,19 +79334,22 @@ static void generateSortTail(
int regRowid;
iTab = pOrderBy->iECursor;
- if( eDest==SRT_Callback || eDest==SRT_Subroutine ){
+ regRow = sqlite3GetTempReg(pParse);
+ if( eDest==SRT_Output || eDest==SRT_Coroutine ){
pseudoTab = pParse->nTab++;
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, nColumn);
- sqlite3VdbeAddOp2(v, OP_OpenPseudo, pseudoTab, eDest==SRT_Callback);
+ sqlite3VdbeAddOp3(v, OP_OpenPseudo, pseudoTab, regRow, nColumn);
+ regRowid = 0;
+ }else{
+ regRowid = sqlite3GetTempReg(pParse);
}
- addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, brk);
- codeOffset(v, p, cont);
- regRow = sqlite3GetTempReg(pParse);
- regRowid = sqlite3GetTempReg(pParse);
+ addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak);
+ codeOffset(v, p, addrContinue);
sqlite3VdbeAddOp3(v, OP_Column, iTab, pOrderBy->nExpr + 1, regRow);
switch( eDest ){
case SRT_Table:
case SRT_EphemTab: {
+ testcase( eDest==SRT_Table );
+ testcase( eDest==SRT_EphemTab );
sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid);
sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid);
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
@@ -64304,63 +79357,55 @@ static void generateSortTail(
}
#ifndef SQLITE_OMIT_SUBQUERY
case SRT_Set: {
- int j1;
assert( nColumn==1 );
- j1 = sqlite3VdbeAddOp1(v, OP_IsNull, regRow);
sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, 1, regRowid, &p->affinity, 1);
sqlite3ExprCacheAffinityChange(pParse, regRow, 1);
sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid);
- sqlite3VdbeJumpHere(v, j1);
break;
}
case SRT_Mem: {
assert( nColumn==1 );
- sqlite3ExprCodeMove(pParse, regRow, iParm);
+ sqlite3ExprCodeMove(pParse, regRow, iParm, 1);
/* The LIMIT clause will terminate the loop for us */
break;
}
#endif
- case SRT_Callback:
- case SRT_Subroutine: {
+ default: {
int i;
- sqlite3VdbeAddOp2(v, OP_Integer, 1, regRowid);
- sqlite3VdbeAddOp3(v, OP_Insert, pseudoTab, regRow, regRowid);
+ assert( eDest==SRT_Output || eDest==SRT_Coroutine );
+ testcase( eDest==SRT_Output );
+ testcase( eDest==SRT_Coroutine );
for(i=0; i<nColumn; i++){
assert( regRow!=pDest->iMem+i );
sqlite3VdbeAddOp3(v, OP_Column, pseudoTab, i, pDest->iMem+i);
+ if( i==0 ){
+ sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE);
+ }
}
- if( eDest==SRT_Callback ){
+ if( eDest==SRT_Output ){
sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iMem, nColumn);
sqlite3ExprCacheAffinityChange(pParse, pDest->iMem, nColumn);
}else{
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, iParm);
+ sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm);
}
break;
}
- default: {
- /* Do nothing */
- break;
- }
}
sqlite3ReleaseTempReg(pParse, regRow);
sqlite3ReleaseTempReg(pParse, regRowid);
- /* Jump to the end of the loop when the LIMIT is reached
+ /* LIMIT has been implemented by the pushOntoSorter() routine.
*/
- if( p->iLimit>=0 ){
- sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
- sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, brk);
- }
+ assert( p->iLimit==0 );
/* The bottom of the loop
*/
- sqlite3VdbeResolveLabel(v, cont);
+ sqlite3VdbeResolveLabel(v, addrContinue);
sqlite3VdbeAddOp2(v, OP_Next, iTab, addr);
- sqlite3VdbeResolveLabel(v, brk);
- if( eDest==SRT_Callback || eDest==SRT_Subroutine ){
+ sqlite3VdbeResolveLabel(v, addrBreak);
+ if( eDest==SRT_Output || eDest==SRT_Coroutine ){
sqlite3VdbeAddOp2(v, OP_Close, pseudoTab, 0);
}
-
}
/*
@@ -64393,7 +79438,7 @@ static const char *columnType(
char const *zOriginTab = 0;
char const *zOriginCol = 0;
int j;
- if( pExpr==0 || pNC->pSrcList==0 ) return 0;
+ if( NEVER(pExpr==0) || pNC->pSrcList==0 ) return 0;
switch( pExpr->op ){
case TK_AGG_COLUMN:
@@ -64405,6 +79450,8 @@ static const char *columnType(
Table *pTab = 0; /* Table structure column is extracted from */
Select *pS = 0; /* Select the column is extracted from */
int iCol = pExpr->iColumn; /* Index of column in pTab */
+ testcase( pExpr->op==TK_AGG_COLUMN );
+ testcase( pExpr->op==TK_COLUMN );
while( pNC && !pTab ){
SrcList *pTabList = pNC->pSrcList;
for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
@@ -64417,27 +79464,33 @@ static const char *columnType(
}
if( pTab==0 ){
- /* FIX ME:
- ** This can occurs if you have something like "SELECT new.x;" inside
- ** a trigger. In other words, if you reference the special "new"
- ** table in the result set of a select. We do not have a good way
- ** to find the actual table type, so call it "TEXT". This is really
- ** something of a bug, but I do not know how to fix it.
+ /* At one time, code such as "SELECT new.x" within a trigger would
+ ** cause this condition to run. Since then, we have restructured how
+ ** trigger code is generated and so this condition is no longer
+ ** possible. However, it can still be true for statements like
+ ** the following:
**
- ** This code does not produce the correct answer - it just prevents
- ** a segfault. See ticket #1229.
- */
- zType = "TEXT";
+ ** CREATE TABLE t1(col INTEGER);
+ ** SELECT (SELECT t1.col) FROM FROM t1;
+ **
+ ** when columnType() is called on the expression "t1.col" in the
+ ** sub-select. In this case, set the column type to NULL, even
+ ** though it should really be "INTEGER".
+ **
+ ** This is not a problem, as the column type of "t1.col" is never
+ ** used. When columnType() is called on the expression
+ ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT
+ ** branch below. */
break;
}
- assert( pTab );
+ assert( pTab && pExpr->pTab==pTab );
if( pS ){
/* The "table" is actually a sub-select or a view in the FROM clause
** of the SELECT statement. Return the declaration type and origin
** data for the result-set column of the sub-select.
*/
- if( iCol>=0 && iCol<pS->pEList->nExpr ){
+ if( ALWAYS(iCol>=0 && iCol<pS->pEList->nExpr) ){
/* If iCol is less than zero, then the expression requests the
** rowid of the sub-select or view. This expression is legal (see
** test case misc2.2.2) - it always evaluates to NULL.
@@ -64445,11 +79498,11 @@ static const char *columnType(
NameContext sNC;
Expr *p = pS->pEList->a[iCol].pExpr;
sNC.pSrcList = pS->pSrc;
- sNC.pNext = 0;
+ sNC.pNext = pNC;
sNC.pParse = pNC->pParse;
zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol);
}
- }else if( pTab->pSchema ){
+ }else if( ALWAYS(pTab->pSchema) ){
/* A real table */
assert( !pS );
if( iCol<0 ) iCol = pTab->iPKey;
@@ -64476,8 +79529,9 @@ static const char *columnType(
** statement.
*/
NameContext sNC;
- Select *pS = pExpr->pSelect;
+ Select *pS = pExpr->x.pSelect;
Expr *p = pS->pEList->a[0].pExpr;
+ assert( ExprHasProperty(pExpr, EP_xIsSelect) );
sNC.pSrcList = pS->pSrc;
sNC.pNext = pNC;
sNC.pParse = pNC->pParse;
@@ -64524,13 +79578,13 @@ static void generateColumnTypes(
** column specific strings, in case the schema is reset before this
** virtual machine is deleted.
*/
- sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, P4_TRANSIENT);
- sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, P4_TRANSIENT);
- sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, P4_TRANSIENT);
+ sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT);
+ sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT);
+ sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT);
#else
zType = columnType(&sNC, p, 0, 0, 0);
#endif
- sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, P4_TRANSIENT);
+ sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT);
}
#endif /* SQLITE_OMIT_DECLTYPE */
}
@@ -64557,8 +79611,7 @@ static void generateColumnNames(
}
#endif
- assert( v!=0 );
- if( pParse->colNamesSet || v==0 || db->mallocFailed ) return;
+ if( pParse->colNamesSet || NEVER(v==0) || db->mallocFailed ) return;
pParse->colNamesSet = 1;
fullNames = (db->flags & SQLITE_FullColNames)!=0;
shortNames = (db->flags & SQLITE_ShortColNames)!=0;
@@ -64566,17 +79619,17 @@ static void generateColumnNames(
for(i=0; i<pEList->nExpr; i++){
Expr *p;
p = pEList->a[i].pExpr;
- if( p==0 ) continue;
+ if( NEVER(p==0) ) continue;
if( pEList->a[i].zName ){
char *zName = pEList->a[i].zName;
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, strlen(zName));
- continue;
- }
- if( p->op==TK_COLUMN && pTabList ){
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
+ }else if( (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) && pTabList ){
Table *pTab;
char *zCol;
int iCol = p->iColumn;
- for(j=0; j<pTabList->nSrc && pTabList->a[j].iCursor!=p->iTable; j++){}
+ for(j=0; ALWAYS(j<pTabList->nSrc); j++){
+ if( pTabList->a[j].iCursor==p->iTable ) break;
+ }
assert( j<pTabList->nSrc );
pTab = pTabList->a[j].pTab;
if( iCol<0 ) iCol = pTab->iPKey;
@@ -64586,27 +79639,19 @@ static void generateColumnNames(
}else{
zCol = pTab->aCol[iCol].zName;
}
- if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n);
- }else if( fullNames || (!shortNames && pTabList->nSrc>1) ){
+ if( !shortNames && !fullNames ){
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME,
+ sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC);
+ }else if( fullNames ){
char *zName = 0;
- char *zTab;
-
- zTab = pTabList->a[j].zAlias;
- if( fullNames || zTab==0 ) zTab = pTab->zName;
- sqlite3SetString(&zName, zTab, ".", zCol, (char*)0);
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, P4_DYNAMIC);
+ zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol);
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC);
}else{
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, strlen(zCol));
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT);
}
- }else if( p->span.z && p->span.z[0] ){
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n);
- /* sqlite3VdbeCompressSpace(v, addr); */
}else{
- char zName[30];
- assert( p->op!=TK_COLUMN || pTabList==0 );
- sqlite3_snprintf(sizeof(zName), zName, "column%d", i+1);
- sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, 0);
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME,
+ sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC);
}
}
generateColumnTypes(pParse, pTabList, pEList);
@@ -64629,604 +79674,176 @@ static const char *selectOpName(int id){
#endif /* SQLITE_OMIT_COMPOUND_SELECT */
/*
-** Forward declaration
-*/
-static int prepSelectStmt(Parse*, Select*);
-
-/*
-** Given a SELECT statement, generate a Table structure that describes
-** the result set of that SELECT.
+** Given a an expression list (which is really the list of expressions
+** that form the result set of a SELECT statement) compute appropriate
+** column names for a table that would hold the expression list.
+**
+** All column names will be unique.
+**
+** Only the column names are computed. Column.zType, Column.zColl,
+** and other fields of Column are zeroed.
+**
+** Return SQLITE_OK on success. If a memory allocation error occurs,
+** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM.
*/
-SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){
- Table *pTab;
- int i, j;
- ExprList *pEList;
- Column *aCol, *pCol;
- sqlite3 *db = pParse->db;
-
- while( pSelect->pPrior ) pSelect = pSelect->pPrior;
- if( prepSelectStmt(pParse, pSelect) ){
- return 0;
- }
- if( sqlite3SelectResolve(pParse, pSelect, 0) ){
- return 0;
- }
- pTab = sqlite3DbMallocZero(db, sizeof(Table) );
- if( pTab==0 ){
- return 0;
- }
- pTab->nRef = 1;
- pTab->zName = zTabName ? sqlite3DbStrDup(db, zTabName) : 0;
- pEList = pSelect->pEList;
- pTab->nCol = pEList->nExpr;
- assert( pTab->nCol>0 );
- pTab->aCol = aCol = sqlite3DbMallocZero(db, sizeof(pTab->aCol[0])*pTab->nCol);
- for(i=0, pCol=aCol; i<pTab->nCol; i++, pCol++){
- Expr *p, *pR;
- char *zType;
- char *zName;
- int nName;
- CollSeq *pColl;
- int cnt;
- NameContext sNC;
-
+static int selectColumnsFromExprList(
+ Parse *pParse, /* Parsing context */
+ ExprList *pEList, /* Expr list from which to derive column names */
+ int *pnCol, /* Write the number of columns here */
+ Column **paCol /* Write the new column list here */
+){
+ sqlite3 *db = pParse->db; /* Database connection */
+ int i, j; /* Loop counters */
+ int cnt; /* Index added to make the name unique */
+ Column *aCol, *pCol; /* For looping over result columns */
+ int nCol; /* Number of columns in the result set */
+ Expr *p; /* Expression for a single result column */
+ char *zName; /* Column name */
+ int nName; /* Size of name in zName[] */
+
+ *pnCol = nCol = pEList->nExpr;
+ aCol = *paCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol);
+ if( aCol==0 ) return SQLITE_NOMEM;
+ for(i=0, pCol=aCol; i<nCol; i++, pCol++){
/* Get an appropriate name for the column
*/
p = pEList->a[i].pExpr;
- assert( p->pRight==0 || p->pRight->token.z==0 || p->pRight->token.z[0]!=0 );
+ assert( p->pRight==0 || ExprHasProperty(p->pRight, EP_IntValue)
+ || p->pRight->u.zToken==0 || p->pRight->u.zToken[0]!=0 );
if( (zName = pEList->a[i].zName)!=0 ){
/* If the column contains an "AS <name>" phrase, use <name> as the name */
zName = sqlite3DbStrDup(db, zName);
- }else if( p->op==TK_DOT
- && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){
- /* For columns of the from A.B use B as the name */
- zName = sqlite3MPrintf(db, "%T", &pR->token);
- }else if( p->span.z && p->span.z[0] ){
- /* Use the original text of the column expression as its name */
- zName = sqlite3MPrintf(db, "%T", &p->span);
}else{
- /* If all else fails, make up a name */
- zName = sqlite3MPrintf(db, "column%d", i+1);
+ Expr *pColExpr = p; /* The expression that is the result column name */
+ Table *pTab; /* Table associated with this expression */
+ while( pColExpr->op==TK_DOT ) pColExpr = pColExpr->pRight;
+ if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){
+ /* For columns use the column name name */
+ int iCol = pColExpr->iColumn;
+ pTab = pColExpr->pTab;
+ if( iCol<0 ) iCol = pTab->iPKey;
+ zName = sqlite3MPrintf(db, "%s",
+ iCol>=0 ? pTab->aCol[iCol].zName : "rowid");
+ }else if( pColExpr->op==TK_ID ){
+ assert( !ExprHasProperty(pColExpr, EP_IntValue) );
+ zName = sqlite3MPrintf(db, "%s", pColExpr->u.zToken);
+ }else{
+ /* Use the original text of the column expression as its name */
+ zName = sqlite3MPrintf(db, "%s", pEList->a[i].zSpan);
+ }
}
- if( !zName || db->mallocFailed ){
- db->mallocFailed = 1;
- sqlite3_free(zName);
- sqlite3DeleteTable(pTab);
- return 0;
+ if( db->mallocFailed ){
+ sqlite3DbFree(db, zName);
+ break;
}
- sqlite3Dequote(zName);
/* Make sure the column name is unique. If the name is not unique,
** append a integer to the name so that it becomes unique.
*/
- nName = strlen(zName);
+ nName = sqlite3Strlen30(zName);
for(j=cnt=0; j<i; j++){
if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){
+ char *zNewName;
zName[nName] = 0;
- zName = sqlite3MPrintf(db, "%z:%d", zName, ++cnt);
+ zNewName = sqlite3MPrintf(db, "%s:%d", zName, ++cnt);
+ sqlite3DbFree(db, zName);
+ zName = zNewName;
j = -1;
if( zName==0 ) break;
}
}
pCol->zName = zName;
-
- /* Get the typename, type affinity, and collating sequence for the
- ** column.
- */
- memset(&sNC, 0, sizeof(sNC));
- sNC.pSrcList = pSelect->pSrc;
- zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0));
- pCol->zType = zType;
- pCol->affinity = sqlite3ExprAffinity(p);
- pColl = sqlite3ExprCollSeq(pParse, p);
- if( pColl ){
- pCol->zColl = sqlite3DbStrDup(db, pColl->zName);
- }
- }
- pTab->iPKey = -1;
- return pTab;
-}
-
-/*
-** Prepare a SELECT statement for processing by doing the following
-** things:
-**
-** (1) Make sure VDBE cursor numbers have been assigned to every
-** element of the FROM clause.
-**
-** (2) Fill in the pTabList->a[].pTab fields in the SrcList that
-** defines FROM clause. When views appear in the FROM clause,
-** fill pTabList->a[].pSelect with a copy of the SELECT statement
-** that implements the view. A copy is made of the view's SELECT
-** statement so that we can freely modify or delete that statement
-** without worrying about messing up the presistent representation
-** of the view.
-**
-** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword
-** on joins and the ON and USING clause of joins.
-**
-** (4) Scan the list of columns in the result set (pEList) looking
-** for instances of the "*" operator or the TABLE.* operator.
-** If found, expand each "*" to be every column in every table
-** and TABLE.* to be every column in TABLE.
-**
-** Return 0 on success. If there are problems, leave an error message
-** in pParse and return non-zero.
-*/
-static int prepSelectStmt(Parse *pParse, Select *p){
- int i, j, k, rc;
- SrcList *pTabList;
- ExprList *pEList;
- struct SrcList_item *pFrom;
- sqlite3 *db = pParse->db;
-
- if( p==0 || p->pSrc==0 || db->mallocFailed ){
- return 1;
- }
- pTabList = p->pSrc;
- pEList = p->pEList;
-
- /* Make sure cursor numbers have been assigned to all entries in
- ** the FROM clause of the SELECT statement.
- */
- sqlite3SrcListAssignCursors(pParse, p->pSrc);
-
- /* Look up every table named in the FROM clause of the select. If
- ** an entry of the FROM clause is a subquery instead of a table or view,
- ** then create a transient table structure to describe the subquery.
- */
- for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
- Table *pTab;
- if( pFrom->pTab!=0 ){
- /* This statement has already been prepared. There is no need
- ** to go further. */
- assert( i==0 );
- return 0;
- }
- if( pFrom->zName==0 ){
-#ifndef SQLITE_OMIT_SUBQUERY
- /* A sub-query in the FROM clause of a SELECT */
- assert( pFrom->pSelect!=0 );
- if( pFrom->zAlias==0 ){
- pFrom->zAlias =
- sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pFrom->pSelect);
- }
- assert( pFrom->pTab==0 );
- pFrom->pTab = pTab =
- sqlite3ResultSetOfSelect(pParse, pFrom->zAlias, pFrom->pSelect);
- if( pTab==0 ){
- return 1;
- }
- /* The isEphem flag indicates that the Table structure has been
- ** dynamically allocated and may be freed at any time. In other words,
- ** pTab is not pointing to a persistent table structure that defines
- ** part of the schema. */
- pTab->isEphem = 1;
-#endif
- }else{
- /* An ordinary table or view name in the FROM clause */
- assert( pFrom->pTab==0 );
- pFrom->pTab = pTab =
- sqlite3LocateTable(pParse,0,pFrom->zName,pFrom->zDatabase);
- if( pTab==0 ){
- return 1;
- }
- pTab->nRef++;
-#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE)
- if( pTab->pSelect || IsVirtual(pTab) ){
- /* We reach here if the named table is a really a view */
- if( sqlite3ViewGetColumnNames(pParse, pTab) ){
- return 1;
- }
- /* If pFrom->pSelect!=0 it means we are dealing with a
- ** view within a view. The SELECT structure has already been
- ** copied by the outer view so we can skip the copy step here
- ** in the inner view.
- */
- if( pFrom->pSelect==0 ){
- pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect);
- }
- }
-#endif
- }
- }
-
- /* Process NATURAL keywords, and ON and USING clauses of joins.
- */
- if( sqliteProcessJoin(pParse, p) ) return 1;
-
- /* For every "*" that occurs in the column list, insert the names of
- ** all columns in all tables. And for every TABLE.* insert the names
- ** of all columns in TABLE. The parser inserted a special expression
- ** with the TK_ALL operator for each "*" that it found in the column list.
- ** The following code just has to locate the TK_ALL expressions and expand
- ** each one to the list of all columns in all tables.
- **
- ** The first loop just checks to see if there are any "*" operators
- ** that need expanding.
- */
- for(k=0; k<pEList->nExpr; k++){
- Expr *pE = pEList->a[k].pExpr;
- if( pE->op==TK_ALL ) break;
- if( pE->op==TK_DOT && pE->pRight && pE->pRight->op==TK_ALL
- && pE->pLeft && pE->pLeft->op==TK_ID ) break;
}
- rc = 0;
- if( k<pEList->nExpr ){
- /*
- ** If we get here it means the result set contains one or more "*"
- ** operators that need to be expanded. Loop through each expression
- ** in the result set and expand them one by one.
- */
- struct ExprList_item *a = pEList->a;
- ExprList *pNew = 0;
- int flags = pParse->db->flags;
- int longNames = (flags & SQLITE_FullColNames)!=0 &&
- (flags & SQLITE_ShortColNames)==0;
-
- for(k=0; k<pEList->nExpr; k++){
- Expr *pE = a[k].pExpr;
- if( pE->op!=TK_ALL &&
- (pE->op!=TK_DOT || pE->pRight==0 || pE->pRight->op!=TK_ALL) ){
- /* This particular expression does not need to be expanded.
- */
- pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr, 0);
- if( pNew ){
- pNew->a[pNew->nExpr-1].zName = a[k].zName;
- }else{
- rc = 1;
- }
- a[k].pExpr = 0;
- a[k].zName = 0;
- }else{
- /* This expression is a "*" or a "TABLE.*" and needs to be
- ** expanded. */
- int tableSeen = 0; /* Set to 1 when TABLE matches */
- char *zTName; /* text of name of TABLE */
- if( pE->op==TK_DOT && pE->pLeft ){
- zTName = sqlite3NameFromToken(db, &pE->pLeft->token);
- }else{
- zTName = 0;
- }
- for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
- Table *pTab = pFrom->pTab;
- char *zTabName = pFrom->zAlias;
- if( zTabName==0 || zTabName[0]==0 ){
- zTabName = pTab->zName;
- }
- if( zTName && (zTabName==0 || zTabName[0]==0 ||
- sqlite3StrICmp(zTName, zTabName)!=0) ){
- continue;
- }
- tableSeen = 1;
- for(j=0; j<pTab->nCol; j++){
- Expr *pExpr, *pRight;
- char *zName = pTab->aCol[j].zName;
-
- /* If a column is marked as 'hidden' (currently only possible
- ** for virtual tables), do not include it in the expanded
- ** result-set list.
- */
- if( IsHiddenColumn(&pTab->aCol[j]) ){
- assert(IsVirtual(pTab));
- continue;
- }
-
- if( i>0 ){
- struct SrcList_item *pLeft = &pTabList->a[i-1];
- if( (pLeft[1].jointype & JT_NATURAL)!=0 &&
- columnIndex(pLeft->pTab, zName)>=0 ){
- /* In a NATURAL join, omit the join columns from the
- ** table on the right */
- continue;
- }
- if( sqlite3IdListIndex(pLeft[1].pUsing, zName)>=0 ){
- /* In a join with a USING clause, omit columns in the
- ** using clause from the table on the right. */
- continue;
- }
- }
- pRight = sqlite3PExpr(pParse, TK_ID, 0, 0, 0);
- if( pRight==0 ) break;
- setQuotedToken(pParse, &pRight->token, zName);
- if( zTabName && (longNames || pTabList->nSrc>1) ){
- Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, 0);
- pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
- if( pExpr==0 ) break;
- setQuotedToken(pParse, &pLeft->token, zTabName);
- setToken(&pExpr->span,
- sqlite3MPrintf(db, "%s.%s", zTabName, zName));
- pExpr->span.dyn = 1;
- pExpr->token.z = 0;
- pExpr->token.n = 0;
- pExpr->token.dyn = 0;
- }else{
- pExpr = pRight;
- pExpr->span = pExpr->token;
- pExpr->span.dyn = 0;
- }
- if( longNames ){
- pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pExpr->span);
- }else{
- pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pRight->token);
- }
- }
- }
- if( !tableSeen ){
- if( zTName ){
- sqlite3ErrorMsg(pParse, "no such table: %s", zTName);
- }else{
- sqlite3ErrorMsg(pParse, "no tables specified");
- }
- rc = 1;
- }
- sqlite3_free(zTName);
- }
- }
- sqlite3ExprListDelete(pEList);
- p->pEList = pNew;
- }
-#if SQLITE_MAX_COLUMN
- if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
- sqlite3ErrorMsg(pParse, "too many columns in result set");
- rc = SQLITE_ERROR;
- }
-#endif
if( db->mallocFailed ){
- rc = SQLITE_NOMEM;
- }
- return rc;
-}
-
-/*
-** pE is a pointer to an expression which is a single term in
-** ORDER BY or GROUP BY clause.
-**
-** If pE evaluates to an integer constant i, then return i.
-** This is an indication to the caller that it should sort
-** by the i-th column of the result set.
-**
-** If pE is a well-formed expression and the SELECT statement
-** is not compound, then return 0. This indicates to the
-** caller that it should sort by the value of the ORDER BY
-** expression.
-**
-** If the SELECT is compound, then attempt to match pE against
-** result set columns in the left-most SELECT statement. Return
-** the index i of the matching column, as an indication to the
-** caller that it should sort by the i-th column. If there is
-** no match, return -1 and leave an error message in pParse.
-*/
-static int matchOrderByTermToExprList(
- Parse *pParse, /* Parsing context for error messages */
- Select *pSelect, /* The SELECT statement with the ORDER BY clause */
- Expr *pE, /* The specific ORDER BY term */
- int idx, /* When ORDER BY term is this */
- int isCompound, /* True if this is a compound SELECT */
- u8 *pHasAgg /* True if expression contains aggregate functions */
-){
- int i; /* Loop counter */
- ExprList *pEList; /* The columns of the result set */
- NameContext nc; /* Name context for resolving pE */
-
-
- /* If the term is an integer constant, return the value of that
- ** constant */
- pEList = pSelect->pEList;
- if( sqlite3ExprIsInteger(pE, &i) ){
- if( i<=0 ){
- /* If i is too small, make it too big. That way the calling
- ** function still sees a value that is out of range, but does
- ** not confuse the column number with 0 or -1 result code.
- */
- i = pEList->nExpr+1;
- }
- return i;
- }
-
- /* If the term is a simple identifier that try to match that identifier
- ** against a column name in the result set.
- */
- if( pE->op==TK_ID || (pE->op==TK_STRING && pE->token.z[0]!='\'') ){
- sqlite3 *db = pParse->db;
- char *zCol = sqlite3NameFromToken(db, &pE->token);
- if( zCol==0 ){
- return -1;
- }
- for(i=0; i<pEList->nExpr; i++){
- char *zAs = pEList->a[i].zName;
- if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
- sqlite3_free(zCol);
- return i+1;
- }
- }
- sqlite3_free(zCol);
- }
-
- /* Resolve all names in the ORDER BY term expression
- */
- memset(&nc, 0, sizeof(nc));
- nc.pParse = pParse;
- nc.pSrcList = pSelect->pSrc;
- nc.pEList = pEList;
- nc.allowAgg = 1;
- nc.nErr = 0;
- if( sqlite3ExprResolveNames(&nc, pE) ){
- if( isCompound ){
- sqlite3ErrorClear(pParse);
- return 0;
- }else{
- return -1;
- }
- }
- if( nc.hasAgg && pHasAgg ){
- *pHasAgg = 1;
- }
-
- /* For a compound SELECT, we need to try to match the ORDER BY
- ** expression against an expression in the result set
- */
- if( isCompound ){
- for(i=0; i<pEList->nExpr; i++){
- if( sqlite3ExprCompare(pEList->a[i].pExpr, pE) ){
- return i+1;
- }
+ for(j=0; j<i; j++){
+ sqlite3DbFree(db, aCol[j].zName);
}
+ sqlite3DbFree(db, aCol);
+ *paCol = 0;
+ *pnCol = 0;
+ return SQLITE_NOMEM;
}
- return 0;
+ return SQLITE_OK;
}
-
/*
-** Analyze and ORDER BY or GROUP BY clause in a simple SELECT statement.
-** Return the number of errors seen.
-**
-** Every term of the ORDER BY or GROUP BY clause needs to be an
-** expression. If any expression is an integer constant, then
-** that expression is replaced by the corresponding
-** expression from the result set.
-*/
-static int processOrderGroupBy(
- Parse *pParse, /* Parsing context. Leave error messages here */
- Select *pSelect, /* The SELECT statement containing the clause */
- ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */
- int isOrder, /* 1 for ORDER BY. 0 for GROUP BY */
- u8 *pHasAgg /* Set to TRUE if any term contains an aggregate */
+** Add type and collation information to a column list based on
+** a SELECT statement.
+**
+** The column list presumably came from selectColumnNamesFromExprList().
+** The column list has only names, not types or collations. This
+** routine goes through and adds the types and collations.
+**
+** This routine requires that all identifiers in the SELECT
+** statement be resolved.
+*/
+static void selectAddColumnTypeAndCollation(
+ Parse *pParse, /* Parsing contexts */
+ int nCol, /* Number of columns */
+ Column *aCol, /* List of columns */
+ Select *pSelect /* SELECT used to determine types and collations */
){
- int i;
sqlite3 *db = pParse->db;
- ExprList *pEList;
+ NameContext sNC;
+ Column *pCol;
+ CollSeq *pColl;
+ int i;
+ Expr *p;
+ struct ExprList_item *a;
- if( pOrderBy==0 || pParse->db->mallocFailed ) return 0;
-#if SQLITE_MAX_COLUMN
- if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
- const char *zType = isOrder ? "ORDER" : "GROUP";
- sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType);
- return 1;
- }
-#endif
- pEList = pSelect->pEList;
- if( pEList==0 ){
- return 0;
- }
- for(i=0; i<pOrderBy->nExpr; i++){
- int iCol;
- Expr *pE = pOrderBy->a[i].pExpr;
- iCol = matchOrderByTermToExprList(pParse, pSelect, pE, i+1, 0, pHasAgg);
- if( iCol<0 ){
- return 1;
- }
- if( iCol>pEList->nExpr ){
- const char *zType = isOrder ? "ORDER" : "GROUP";
- sqlite3ErrorMsg(pParse,
- "%r %s BY term out of range - should be "
- "between 1 and %d", i+1, zType, pEList->nExpr);
- return 1;
- }
- if( iCol>0 ){
- CollSeq *pColl = pE->pColl;
- int flags = pE->flags & EP_ExpCollate;
- sqlite3ExprDelete(pE);
- pE = sqlite3ExprDup(db, pEList->a[iCol-1].pExpr);
- pOrderBy->a[i].pExpr = pE;
- if( pE && pColl && flags ){
- pE->pColl = pColl;
- pE->flags |= flags;
- }
+ assert( pSelect!=0 );
+ assert( (pSelect->selFlags & SF_Resolved)!=0 );
+ assert( nCol==pSelect->pEList->nExpr || db->mallocFailed );
+ if( db->mallocFailed ) return;
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pSrcList = pSelect->pSrc;
+ a = pSelect->pEList->a;
+ for(i=0, pCol=aCol; i<nCol; i++, pCol++){
+ p = a[i].pExpr;
+ pCol->zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0));
+ pCol->affinity = sqlite3ExprAffinity(p);
+ if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_NONE;
+ pColl = sqlite3ExprCollSeq(pParse, p);
+ if( pColl ){
+ pCol->zColl = sqlite3DbStrDup(db, pColl->zName);
}
}
- return 0;
}
/*
-** Analyze and ORDER BY or GROUP BY clause in a SELECT statement. Return
-** the number of errors seen.
-**
-** The processing depends on whether the SELECT is simple or compound.
-** For a simple SELECT statement, evry term of the ORDER BY or GROUP BY
-** clause needs to be an expression. If any expression is an integer
-** constant, then that expression is replaced by the corresponding
-** expression from the result set.
-**
-** For compound SELECT statements, every expression needs to be of
-** type TK_COLUMN with a iTable value as given in the 4th parameter.
-** If any expression is an integer, that becomes the column number.
-** Otherwise, match the expression against result set columns from
-** the left-most SELECT.
+** Given a SELECT statement, generate a Table structure that describes
+** the result set of that SELECT.
*/
-static int processCompoundOrderBy(
- Parse *pParse, /* Parsing context. Leave error messages here */
- Select *pSelect, /* The SELECT statement containing the ORDER BY */
- int iTable /* Output table for compound SELECT statements */
-){
- int i;
- ExprList *pOrderBy;
- ExprList *pEList;
- sqlite3 *db;
- int moreToDo = 1;
+SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){
+ Table *pTab;
+ sqlite3 *db = pParse->db;
+ int savedFlags;
- pOrderBy = pSelect->pOrderBy;
- if( pOrderBy==0 ) return 0;
- db = pParse->db;
-#if SQLITE_MAX_COLUMN
- if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
- sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause");
- return 1;
- }
-#endif
- for(i=0; i<pOrderBy->nExpr; i++){
- pOrderBy->a[i].done = 0;
- }
- while( pSelect->pPrior ){
- pSelect = pSelect->pPrior;
- }
- while( pSelect && moreToDo ){
- moreToDo = 0;
- for(i=0; i<pOrderBy->nExpr; i++){
- int iCol = -1;
- Expr *pE, *pDup;
- if( pOrderBy->a[i].done ) continue;
- pE = pOrderBy->a[i].pExpr;
- pDup = sqlite3ExprDup(db, pE);
- if( !db->mallocFailed ){
- assert(pDup);
- iCol = matchOrderByTermToExprList(pParse, pSelect, pDup, i+1, 1, 0);
- }
- sqlite3ExprDelete(pDup);
- if( iCol<0 ){
- return 1;
- }
- pEList = pSelect->pEList;
- if( pEList==0 ){
- return 1;
- }
- if( iCol>pEList->nExpr ){
- sqlite3ErrorMsg(pParse,
- "%r ORDER BY term out of range - should be "
- "between 1 and %d", i+1, pEList->nExpr);
- return 1;
- }
- if( iCol>0 ){
- pE->op = TK_COLUMN;
- pE->iTable = iTable;
- pE->iAgg = -1;
- pE->iColumn = iCol-1;
- pE->pTab = 0;
- pOrderBy->a[i].done = 1;
- }else{
- moreToDo = 1;
- }
- }
- pSelect = pSelect->pNext;
+ savedFlags = db->flags;
+ db->flags &= ~SQLITE_FullColNames;
+ db->flags |= SQLITE_ShortColNames;
+ sqlite3SelectPrep(pParse, pSelect, 0);
+ if( pParse->nErr ) return 0;
+ while( pSelect->pPrior ) pSelect = pSelect->pPrior;
+ db->flags = savedFlags;
+ pTab = sqlite3DbMallocZero(db, sizeof(Table) );
+ if( pTab==0 ){
+ return 0;
}
- for(i=0; i<pOrderBy->nExpr; i++){
- if( pOrderBy->a[i].done==0 ){
- sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
- "column in the result set", i+1);
- return 1;
- }
+ /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside
+ ** is disabled, so we might as well hard-code pTab->dbMem to NULL. */
+ assert( db->lookaside.bEnabled==0 );
+ pTab->dbMem = 0;
+ pTab->nRef = 1;
+ pTab->zName = 0;
+ selectColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol);
+ selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSelect);
+ pTab->iPKey = -1;
+ if( db->mallocFailed ){
+ sqlite3DeleteTable(pTab);
+ return 0;
}
- return 0;
+ return pTab;
}
/*
@@ -65270,6 +79887,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
int iLimit = 0;
int iOffset;
int addr1;
+ if( p->iLimit ) return;
/*
** "LIMIT -1" always shows all rows. There is some
@@ -65277,29 +79895,25 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
** The current implementation interprets "LIMIT 0" to mean
** no rows.
*/
+ sqlite3ExprCacheClear(pParse);
+ assert( p->pOffset==0 || p->pLimit!=0 );
if( p->pLimit ){
p->iLimit = iLimit = ++pParse->nMem;
v = sqlite3GetVdbe(pParse);
- if( v==0 ) return;
+ if( NEVER(v==0) ) return; /* VDBE should have already been allocated */
sqlite3ExprCode(pParse, p->pLimit, iLimit);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit);
VdbeComment((v, "LIMIT counter"));
sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak);
- }
- if( p->pOffset ){
- p->iOffset = iOffset = ++pParse->nMem;
- if( p->pLimit ){
+ if( p->pOffset ){
+ p->iOffset = iOffset = ++pParse->nMem;
pParse->nMem++; /* Allocate an extra register for limit+offset */
- }
- v = sqlite3GetVdbe(pParse);
- if( v==0 ) return;
- sqlite3ExprCode(pParse, p->pOffset, iOffset);
- sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset);
- VdbeComment((v, "OFFSET counter"));
- addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset);
- sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset);
- sqlite3VdbeJumpHere(v, addr1);
- if( p->pLimit ){
+ sqlite3ExprCode(pParse, p->pOffset, iOffset);
+ sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset);
+ VdbeComment((v, "OFFSET counter"));
+ addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset);
+ sqlite3VdbeJumpHere(v, addr1);
sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1);
VdbeComment((v, "LIMIT+OFFSET"));
addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit);
@@ -65309,21 +79923,6 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
}
}
-/*
-** Allocate a virtual index to use for sorting.
-*/
-static void createSortingIndex(Parse *pParse, Select *p, ExprList *pOrderBy){
- if( pOrderBy ){
- int addr;
- assert( pOrderBy->iECursor==0 );
- pOrderBy->iECursor = pParse->nTab++;
- addr = sqlite3VdbeAddOp2(pParse->pVdbe, OP_OpenEphemeral,
- pOrderBy->iECursor, pOrderBy->nExpr+1);
- assert( p->addrOpenEphm[2] == -1 );
- p->addrOpenEphm[2] = addr;
- }
-}
-
#ifndef SQLITE_OMIT_COMPOUND_SELECT
/*
** Return the appropriate collating sequence for the iCol-th column of
@@ -65340,17 +79939,27 @@ static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){
}else{
pRet = 0;
}
- if( pRet==0 ){
+ assert( iCol>=0 );
+ if( pRet==0 && iCol<p->pEList->nExpr ){
pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr);
}
return pRet;
}
#endif /* SQLITE_OMIT_COMPOUND_SELECT */
+/* Forward reference */
+static int multiSelectOrderBy(
+ Parse *pParse, /* Parsing context */
+ Select *p, /* The right-most of SELECTs to be coded */
+ SelectDest *pDest /* What to do with query results */
+);
+
+
#ifndef SQLITE_OMIT_COMPOUND_SELECT
/*
-** This routine is called to process a query that is really the union
-** or intersection of two or more separate queries.
+** This routine is called to process a compound query form from
+** two or more separate queries using UNION, UNION ALL, EXCEPT, or
+** INTERSECT
**
** "p" points to the right-most of the two queries. the query on the
** left is p->pPrior. The left query could also be a compound query
@@ -65381,30 +79990,24 @@ static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){
static int multiSelect(
Parse *pParse, /* Parsing context */
Select *p, /* The right-most of SELECTs to be coded */
- SelectDest *pDest, /* What to do with query results */
- char *aff /* If eDest is SRT_Union, the affinity string */
+ SelectDest *pDest /* What to do with query results */
){
int rc = SQLITE_OK; /* Success code from a subroutine */
Select *pPrior; /* Another SELECT immediately to our left */
Vdbe *v; /* Generate code to this VDBE */
- int nCol; /* Number of columns in the result set */
- ExprList *pOrderBy; /* The ORDER BY clause on p */
- int aSetP2[2]; /* Set P2 value of these op to number of columns */
- int nSetP2 = 0; /* Number of slots in aSetP2[] used */
SelectDest dest; /* Alternative data destination */
-
- dest = *pDest;
+ Select *pDelete = 0; /* Chain of simple selects to delete */
+ sqlite3 *db; /* Database connection */
/* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.
*/
- if( p==0 || p->pPrior==0 ){
- rc = 1;
- goto multi_select_end;
- }
+ assert( p && p->pPrior ); /* Calling function guarantees this much */
+ db = pParse->db;
pPrior = p->pPrior;
assert( pPrior->pRightmost!=pPrior );
assert( pPrior->pRightmost==p->pRightmost );
+ dest = *pDest;
if( pPrior->pOrderBy ){
sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before",
selectOpName(p->op));
@@ -65418,92 +80021,95 @@ static int multiSelect(
goto multi_select_end;
}
- /* Make sure we have a valid query engine. If not, create a new one.
- */
v = sqlite3GetVdbe(pParse);
- if( v==0 ){
- rc = 1;
- goto multi_select_end;
- }
+ assert( v!=0 ); /* The VDBE already created by calling function */
/* Create the destination temporary table if necessary
*/
if( dest.eDest==SRT_EphemTab ){
assert( p->pEList );
- assert( nSetP2<sizeof(aSetP2)/sizeof(aSetP2[0]) );
- aSetP2[nSetP2++] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iParm, 0);
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iParm, p->pEList->nExpr);
dest.eDest = SRT_Table;
}
+ /* Make sure all SELECTs in the statement have the same number of elements
+ ** in their result sets.
+ */
+ assert( p->pEList && pPrior->pEList );
+ if( p->pEList->nExpr!=pPrior->pEList->nExpr ){
+ sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s"
+ " do not have the same number of result columns", selectOpName(p->op));
+ rc = 1;
+ goto multi_select_end;
+ }
+
+ /* Compound SELECTs that have an ORDER BY clause are handled separately.
+ */
+ if( p->pOrderBy ){
+ return multiSelectOrderBy(pParse, p, pDest);
+ }
+
/* Generate code for the left and right SELECT statements.
*/
- pOrderBy = p->pOrderBy;
switch( p->op ){
case TK_ALL: {
- if( pOrderBy==0 ){
- int addr = 0;
- assert( !pPrior->pLimit );
- pPrior->pLimit = p->pLimit;
- pPrior->pOffset = p->pOffset;
- rc = sqlite3Select(pParse, pPrior, &dest, 0, 0, 0, aff);
- p->pLimit = 0;
- p->pOffset = 0;
- if( rc ){
- goto multi_select_end;
- }
- p->pPrior = 0;
- p->iLimit = pPrior->iLimit;
- p->iOffset = pPrior->iOffset;
- if( p->iLimit>=0 ){
- addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit);
- VdbeComment((v, "Jump ahead if LIMIT reached"));
- }
- rc = sqlite3Select(pParse, p, &dest, 0, 0, 0, aff);
- p->pPrior = pPrior;
- if( rc ){
- goto multi_select_end;
- }
- if( addr ){
- sqlite3VdbeJumpHere(v, addr);
- }
- break;
+ int addr = 0;
+ assert( !pPrior->pLimit );
+ pPrior->pLimit = p->pLimit;
+ pPrior->pOffset = p->pOffset;
+ rc = sqlite3Select(pParse, pPrior, &dest);
+ p->pLimit = 0;
+ p->pOffset = 0;
+ if( rc ){
+ goto multi_select_end;
}
- /* For UNION ALL ... ORDER BY fall through to the next case */
+ p->pPrior = 0;
+ p->iLimit = pPrior->iLimit;
+ p->iOffset = pPrior->iOffset;
+ if( p->iLimit ){
+ addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit);
+ VdbeComment((v, "Jump ahead if LIMIT reached"));
+ }
+ rc = sqlite3Select(pParse, p, &dest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ if( addr ){
+ sqlite3VdbeJumpHere(v, addr);
+ }
+ break;
}
case TK_EXCEPT:
case TK_UNION: {
int unionTab; /* Cursor number of the temporary table holding result */
- int op = 0; /* One of the SRT_ operations to apply to self */
+ u8 op = 0; /* One of the SRT_ operations to apply to self */
int priorOp; /* The SRT_ operation to apply to prior selects */
Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */
int addr;
SelectDest uniondest;
- priorOp = p->op==TK_ALL ? SRT_Table : SRT_Union;
- if( dest.eDest==priorOp && pOrderBy==0 && !p->pLimit && !p->pOffset ){
+ testcase( p->op==TK_EXCEPT );
+ testcase( p->op==TK_UNION );
+ priorOp = SRT_Union;
+ if( dest.eDest==priorOp && ALWAYS(!p->pLimit &&!p->pOffset) ){
/* We can reuse a temporary table generated by a SELECT to our
** right.
*/
+ assert( p->pRightmost!=p ); /* Can only happen for leftward elements
+ ** of a 3-way or more compound */
+ assert( p->pLimit==0 ); /* Not allowed on leftward elements */
+ assert( p->pOffset==0 ); /* Not allowed on leftward elements */
unionTab = dest.iParm;
}else{
/* We will need to create our own temporary table to hold the
** intermediate results.
*/
unionTab = pParse->nTab++;
- if( processCompoundOrderBy(pParse, p, unionTab) ){
- rc = 1;
- goto multi_select_end;
- }
+ assert( p->pOrderBy==0 );
addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
- if( priorOp==SRT_Table ){
- assert( nSetP2<sizeof(aSetP2)/sizeof(aSetP2[0]) );
- aSetP2[nSetP2++] = addr;
- }else{
- assert( p->addrOpenEphm[0] == -1 );
- p->addrOpenEphm[0] = addr;
- p->pRightmost->usesEphm = 1;
- }
- createSortingIndex(pParse, p, pOrderBy);
+ assert( p->addrOpenEphm[0] == -1 );
+ p->addrOpenEphm[0] = addr;
+ p->pRightmost->selFlags |= SF_UsesEphemeral;
assert( p->pEList );
}
@@ -65511,49 +80117,47 @@ static int multiSelect(
*/
assert( !pPrior->pOrderBy );
sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
- rc = sqlite3Select(pParse, pPrior, &uniondest, 0, 0, 0, aff);
+ rc = sqlite3Select(pParse, pPrior, &uniondest);
if( rc ){
goto multi_select_end;
}
/* Code the current SELECT statement
*/
- switch( p->op ){
- case TK_EXCEPT: op = SRT_Except; break;
- case TK_UNION: op = SRT_Union; break;
- case TK_ALL: op = SRT_Table; break;
+ if( p->op==TK_EXCEPT ){
+ op = SRT_Except;
+ }else{
+ assert( p->op==TK_UNION );
+ op = SRT_Union;
}
p->pPrior = 0;
- p->pOrderBy = 0;
- p->disallowOrderBy = pOrderBy!=0;
pLimit = p->pLimit;
p->pLimit = 0;
pOffset = p->pOffset;
p->pOffset = 0;
uniondest.eDest = op;
- rc = sqlite3Select(pParse, p, &uniondest, 0, 0, 0, aff);
+ rc = sqlite3Select(pParse, p, &uniondest);
+ testcase( rc!=SQLITE_OK );
/* Query flattening in sqlite3Select() might refill p->pOrderBy.
** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
- sqlite3ExprListDelete(p->pOrderBy);
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ pDelete = p->pPrior;
p->pPrior = pPrior;
- p->pOrderBy = pOrderBy;
- sqlite3ExprDelete(p->pLimit);
+ p->pOrderBy = 0;
+ sqlite3ExprDelete(db, p->pLimit);
p->pLimit = pLimit;
p->pOffset = pOffset;
- p->iLimit = -1;
- p->iOffset = -1;
- if( rc ){
- goto multi_select_end;
- }
-
+ p->iLimit = 0;
+ p->iOffset = 0;
/* Convert the data in the temporary table into whatever form
** it is that we currently need.
- */
- if( dest.eDest!=priorOp || unionTab!=dest.iParm ){
+ */
+ assert( unionTab==dest.iParm || dest.eDest!=priorOp );
+ if( dest.eDest!=priorOp ){
int iCont, iBreak, iStart;
assert( p->pEList );
- if( dest.eDest==SRT_Callback ){
+ if( dest.eDest==SRT_Output ){
Select *pFirst = p;
while( pFirst->pPrior ) pFirst = pFirst->pPrior;
generateColumnNames(pParse, 0, pFirst->pEList);
@@ -65564,7 +80168,7 @@ static int multiSelect(
sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak);
iStart = sqlite3VdbeCurrentAddr(v);
selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr,
- pOrderBy, -1, &dest, iCont, iBreak, 0);
+ 0, -1, &dest, iCont, iBreak);
sqlite3VdbeResolveLabel(v, iCont);
sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart);
sqlite3VdbeResolveLabel(v, iBreak);
@@ -65572,7 +80176,7 @@ static int multiSelect(
}
break;
}
- case TK_INTERSECT: {
+ default: assert( p->op==TK_INTERSECT ); {
int tab1, tab2;
int iCont, iBreak, iStart;
Expr *pLimit, *pOffset;
@@ -65586,22 +80190,18 @@ static int multiSelect(
*/
tab1 = pParse->nTab++;
tab2 = pParse->nTab++;
- if( processCompoundOrderBy(pParse, p, tab1) ){
- rc = 1;
- goto multi_select_end;
- }
- createSortingIndex(pParse, p, pOrderBy);
+ assert( p->pOrderBy==0 );
addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
assert( p->addrOpenEphm[0] == -1 );
p->addrOpenEphm[0] = addr;
- p->pRightmost->usesEphm = 1;
+ p->pRightmost->selFlags |= SF_UsesEphemeral;
assert( p->pEList );
/* Code the SELECTs to our left into temporary table "tab1".
*/
sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
- rc = sqlite3Select(pParse, pPrior, &intersectdest, 0, 0, 0, aff);
+ rc = sqlite3Select(pParse, pPrior, &intersectdest);
if( rc ){
goto multi_select_end;
}
@@ -65617,20 +80217,19 @@ static int multiSelect(
pOffset = p->pOffset;
p->pOffset = 0;
intersectdest.iParm = tab2;
- rc = sqlite3Select(pParse, p, &intersectdest, 0, 0, 0, aff);
+ rc = sqlite3Select(pParse, p, &intersectdest);
+ testcase( rc!=SQLITE_OK );
+ pDelete = p->pPrior;
p->pPrior = pPrior;
- sqlite3ExprDelete(p->pLimit);
+ sqlite3ExprDelete(db, p->pLimit);
p->pLimit = pLimit;
p->pOffset = pOffset;
- if( rc ){
- goto multi_select_end;
- }
/* Generate code to take the intersection of the two temporary
** tables.
*/
assert( p->pEList );
- if( dest.eDest==SRT_Callback ){
+ if( dest.eDest==SRT_Output ){
Select *pFirst = p;
while( pFirst->pPrior ) pFirst = pFirst->pPrior;
generateColumnNames(pParse, 0, pFirst->pEList);
@@ -65644,7 +80243,7 @@ static int multiSelect(
sqlite3VdbeAddOp3(v, OP_NotFound, tab2, iCont, r1);
sqlite3ReleaseTempReg(pParse, r1);
selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr,
- pOrderBy, -1, &dest, iCont, iBreak, 0);
+ 0, -1, &dest, iCont, iBreak);
sqlite3VdbeResolveLabel(v, iCont);
sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart);
sqlite3VdbeResolveLabel(v, iBreak);
@@ -65654,58 +80253,38 @@ static int multiSelect(
}
}
- /* Make sure all SELECTs in the statement have the same number of elements
- ** in their result sets.
- */
- assert( p->pEList && pPrior->pEList );
- if( p->pEList->nExpr!=pPrior->pEList->nExpr ){
- sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s"
- " do not have the same number of result columns", selectOpName(p->op));
- rc = 1;
- goto multi_select_end;
- }
-
- /* Set the number of columns in temporary tables
- */
- nCol = p->pEList->nExpr;
- while( nSetP2 ){
- sqlite3VdbeChangeP2(v, aSetP2[--nSetP2], nCol);
- }
-
- /* Compute collating sequences used by either the ORDER BY clause or
- ** by any temporary tables needed to implement the compound select.
- ** Attach the KeyInfo structure to all temporary tables. Invoke the
- ** ORDER BY processing if there is an ORDER BY clause.
+ /* Compute collating sequences used by
+ ** temporary tables needed to implement the compound select.
+ ** Attach the KeyInfo structure to all temporary tables.
**
** This section is run by the right-most SELECT statement only.
** SELECT statements to the left always skip this part. The right-most
** SELECT might also skip this part if it has no ORDER BY clause and
** no temp tables are required.
*/
- if( pOrderBy || p->usesEphm ){
+ if( p->selFlags & SF_UsesEphemeral ){
int i; /* Loop counter */
KeyInfo *pKeyInfo; /* Collating sequence for the result set */
Select *pLoop; /* For looping through SELECT statements */
- int nKeyCol; /* Number of entries in pKeyInfo->aCol[] */
CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */
- CollSeq **aCopy; /* A copy of pKeyInfo->aColl[] */
+ int nCol; /* Number of columns in result set */
assert( p->pRightmost==p );
- nKeyCol = nCol + (pOrderBy ? pOrderBy->nExpr : 0);
- pKeyInfo = sqlite3DbMallocZero(pParse->db,
- sizeof(*pKeyInfo)+nKeyCol*(sizeof(CollSeq*) + 1));
+ nCol = p->pEList->nExpr;
+ pKeyInfo = sqlite3DbMallocZero(db,
+ sizeof(*pKeyInfo)+nCol*(sizeof(CollSeq*) + 1));
if( !pKeyInfo ){
rc = SQLITE_NOMEM;
goto multi_select_end;
}
- pKeyInfo->enc = ENC(pParse->db);
- pKeyInfo->nField = nCol;
+ pKeyInfo->enc = ENC(db);
+ pKeyInfo->nField = (u16)nCol;
for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){
*apColl = multiSelectCollSeq(pParse, p, i);
if( 0==*apColl ){
- *apColl = pParse->db->pDfltColl;
+ *apColl = db->pDfltColl;
}
}
@@ -65723,62 +80302,604 @@ static int multiSelect(
pLoop->addrOpenEphm[i] = -1;
}
}
+ sqlite3DbFree(db, pKeyInfo);
+ }
- if( pOrderBy ){
- struct ExprList_item *pOTerm = pOrderBy->a;
- int nOrderByExpr = pOrderBy->nExpr;
- int addr;
- u8 *pSortOrder;
-
- /* Reuse the same pKeyInfo for the ORDER BY as was used above for
- ** the compound select statements. Except we have to change out the
- ** pKeyInfo->aColl[] values. Some of the aColl[] values will be
- ** reused when constructing the pKeyInfo for the ORDER BY, so make
- ** a copy. Sufficient space to hold both the nCol entries for
- ** the compound select and the nOrderbyExpr entries for the ORDER BY
- ** was allocated above. But we need to move the compound select
- ** entries out of the way before constructing the ORDER BY entries.
- ** Move the compound select entries into aCopy[] where they can be
- ** accessed and reused when constructing the ORDER BY entries.
- ** Because nCol might be greater than or less than nOrderByExpr
- ** we have to use memmove() when doing the copy.
- */
- aCopy = &pKeyInfo->aColl[nOrderByExpr];
- pSortOrder = pKeyInfo->aSortOrder = (u8*)&aCopy[nCol];
- memmove(aCopy, pKeyInfo->aColl, nCol*sizeof(CollSeq*));
-
- apColl = pKeyInfo->aColl;
- for(i=0; i<nOrderByExpr; i++, pOTerm++, apColl++, pSortOrder++){
- Expr *pExpr = pOTerm->pExpr;
- if( (pExpr->flags & EP_ExpCollate) ){
- assert( pExpr->pColl!=0 );
- *apColl = pExpr->pColl;
+multi_select_end:
+ pDest->iMem = dest.iMem;
+ pDest->nMem = dest.nMem;
+ sqlite3SelectDelete(db, pDelete);
+ return rc;
+}
+#endif /* SQLITE_OMIT_COMPOUND_SELECT */
+
+/*
+** Code an output subroutine for a coroutine implementation of a
+** SELECT statment.
+**
+** The data to be output is contained in pIn->iMem. There are
+** pIn->nMem columns to be output. pDest is where the output should
+** be sent.
+**
+** regReturn is the number of the register holding the subroutine
+** return address.
+**
+** If regPrev>0 then it is a the first register in a vector that
+** records the previous output. mem[regPrev] is a flag that is false
+** if there has been no previous output. If regPrev>0 then code is
+** generated to suppress duplicates. pKeyInfo is used for comparing
+** keys.
+**
+** If the LIMIT found in p->iLimit is reached, jump immediately to
+** iBreak.
+*/
+static int generateOutputSubroutine(
+ Parse *pParse, /* Parsing context */
+ Select *p, /* The SELECT statement */
+ SelectDest *pIn, /* Coroutine supplying data */
+ SelectDest *pDest, /* Where to send the data */
+ int regReturn, /* The return address register */
+ int regPrev, /* Previous result register. No uniqueness if 0 */
+ KeyInfo *pKeyInfo, /* For comparing with previous entry */
+ int p4type, /* The p4 type for pKeyInfo */
+ int iBreak /* Jump here if we hit the LIMIT */
+){
+ Vdbe *v = pParse->pVdbe;
+ int iContinue;
+ int addr;
+
+ addr = sqlite3VdbeCurrentAddr(v);
+ iContinue = sqlite3VdbeMakeLabel(v);
+
+ /* Suppress duplicates for UNION, EXCEPT, and INTERSECT
+ */
+ if( regPrev ){
+ int j1, j2;
+ j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev);
+ j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iMem, regPrev+1, pIn->nMem,
+ (char*)pKeyInfo, p4type);
+ sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2);
+ sqlite3VdbeJumpHere(v, j1);
+ sqlite3ExprCodeCopy(pParse, pIn->iMem, regPrev+1, pIn->nMem);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev);
+ }
+ if( pParse->db->mallocFailed ) return 0;
+
+ /* Suppress the the first OFFSET entries if there is an OFFSET clause
+ */
+ codeOffset(v, p, iContinue);
+
+ switch( pDest->eDest ){
+ /* Store the result as data using a unique key.
+ */
+ case SRT_Table:
+ case SRT_EphemTab: {
+ int r1 = sqlite3GetTempReg(pParse);
+ int r2 = sqlite3GetTempReg(pParse);
+ testcase( pDest->eDest==SRT_Table );
+ testcase( pDest->eDest==SRT_EphemTab );
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iMem, pIn->nMem, r1);
+ sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iParm, r2);
+ sqlite3VdbeAddOp3(v, OP_Insert, pDest->iParm, r1, r2);
+ sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
+ sqlite3ReleaseTempReg(pParse, r2);
+ sqlite3ReleaseTempReg(pParse, r1);
+ break;
+ }
+
+#ifndef SQLITE_OMIT_SUBQUERY
+ /* If we are creating a set for an "expr IN (SELECT ...)" construct,
+ ** then there should be a single item on the stack. Write this
+ ** item into the set table with bogus data.
+ */
+ case SRT_Set: {
+ int r1;
+ assert( pIn->nMem==1 );
+ p->affinity =
+ sqlite3CompareAffinity(p->pEList->a[0].pExpr, pDest->affinity);
+ r1 = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iMem, 1, r1, &p->affinity, 1);
+ sqlite3ExprCacheAffinityChange(pParse, pIn->iMem, 1);
+ sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iParm, r1);
+ sqlite3ReleaseTempReg(pParse, r1);
+ break;
+ }
+
+#if 0 /* Never occurs on an ORDER BY query */
+ /* If any row exist in the result set, record that fact and abort.
+ */
+ case SRT_Exists: {
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, pDest->iParm);
+ /* The LIMIT clause will terminate the loop for us */
+ break;
+ }
+#endif
+
+ /* If this is a scalar select that is part of an expression, then
+ ** store the results in the appropriate memory cell and break out
+ ** of the scan loop.
+ */
+ case SRT_Mem: {
+ assert( pIn->nMem==1 );
+ sqlite3ExprCodeMove(pParse, pIn->iMem, pDest->iParm, 1);
+ /* The LIMIT clause will jump out of the loop for us */
+ break;
+ }
+#endif /* #ifndef SQLITE_OMIT_SUBQUERY */
+
+ /* The results are stored in a sequence of registers
+ ** starting at pDest->iMem. Then the co-routine yields.
+ */
+ case SRT_Coroutine: {
+ if( pDest->iMem==0 ){
+ pDest->iMem = sqlite3GetTempRange(pParse, pIn->nMem);
+ pDest->nMem = pIn->nMem;
+ }
+ sqlite3ExprCodeMove(pParse, pIn->iMem, pDest->iMem, pDest->nMem);
+ sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm);
+ break;
+ }
+
+ /* If none of the above, then the result destination must be
+ ** SRT_Output. This routine is never called with any other
+ ** destination other than the ones handled above or SRT_Output.
+ **
+ ** For SRT_Output, results are stored in a sequence of registers.
+ ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to
+ ** return the next row of result.
+ */
+ default: {
+ assert( pDest->eDest==SRT_Output );
+ sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iMem, pIn->nMem);
+ sqlite3ExprCacheAffinityChange(pParse, pIn->iMem, pIn->nMem);
+ break;
+ }
+ }
+
+ /* Jump to the end of the loop if the LIMIT is reached.
+ */
+ if( p->iLimit ){
+ sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
+ sqlite3VdbeAddOp2(v, OP_IfZero, p->iLimit, iBreak);
+ }
+
+ /* Generate the subroutine return
+ */
+ sqlite3VdbeResolveLabel(v, iContinue);
+ sqlite3VdbeAddOp1(v, OP_Return, regReturn);
+
+ return addr;
+}
+
+/*
+** Alternative compound select code generator for cases when there
+** is an ORDER BY clause.
+**
+** We assume a query of the following form:
+**
+** <selectA> <operator> <selectB> ORDER BY <orderbylist>
+**
+** <operator> is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea
+** is to code both <selectA> and <selectB> with the ORDER BY clause as
+** co-routines. Then run the co-routines in parallel and merge the results
+** into the output. In addition to the two coroutines (called selectA and
+** selectB) there are 7 subroutines:
+**
+** outA: Move the output of the selectA coroutine into the output
+** of the compound query.
+**
+** outB: Move the output of the selectB coroutine into the output
+** of the compound query. (Only generated for UNION and
+** UNION ALL. EXCEPT and INSERTSECT never output a row that
+** appears only in B.)
+**
+** AltB: Called when there is data from both coroutines and A<B.
+**
+** AeqB: Called when there is data from both coroutines and A==B.
+**
+** AgtB: Called when there is data from both coroutines and A>B.
+**
+** EofA: Called when data is exhausted from selectA.
+**
+** EofB: Called when data is exhausted from selectB.
+**
+** The implementation of the latter five subroutines depend on which
+** <operator> is used:
+**
+**
+** UNION ALL UNION EXCEPT INTERSECT
+** ------------- ----------------- -------------- -----------------
+** AltB: outA, nextA outA, nextA outA, nextA nextA
+**
+** AeqB: outA, nextA nextA nextA outA, nextA
+**
+** AgtB: outB, nextB outB, nextB nextB nextB
+**
+** EofA: outB, nextB outB, nextB halt halt
+**
+** EofB: outA, nextA outA, nextA outA, nextA halt
+**
+** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA
+** causes an immediate jump to EofA and an EOF on B following nextB causes
+** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or
+** following nextX causes a jump to the end of the select processing.
+**
+** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled
+** within the output subroutine. The regPrev register set holds the previously
+** output value. A comparison is made against this value and the output
+** is skipped if the next results would be the same as the previous.
+**
+** The implementation plan is to implement the two coroutines and seven
+** subroutines first, then put the control logic at the bottom. Like this:
+**
+** goto Init
+** coA: coroutine for left query (A)
+** coB: coroutine for right query (B)
+** outA: output one row of A
+** outB: output one row of B (UNION and UNION ALL only)
+** EofA: ...
+** EofB: ...
+** AltB: ...
+** AeqB: ...
+** AgtB: ...
+** Init: initialize coroutine registers
+** yield coA
+** if eof(A) goto EofA
+** yield coB
+** if eof(B) goto EofB
+** Cmpr: Compare A, B
+** Jump AltB, AeqB, AgtB
+** End: ...
+**
+** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not
+** actually called using Gosub and they do not Return. EofA and EofB loop
+** until all data is exhausted then jump to the "end" labe. AltB, AeqB,
+** and AgtB jump to either L2 or to one of EofA or EofB.
+*/
+#ifndef SQLITE_OMIT_COMPOUND_SELECT
+static int multiSelectOrderBy(
+ Parse *pParse, /* Parsing context */
+ Select *p, /* The right-most of SELECTs to be coded */
+ SelectDest *pDest /* What to do with query results */
+){
+ int i, j; /* Loop counters */
+ Select *pPrior; /* Another SELECT immediately to our left */
+ Vdbe *v; /* Generate code to this VDBE */
+ SelectDest destA; /* Destination for coroutine A */
+ SelectDest destB; /* Destination for coroutine B */
+ int regAddrA; /* Address register for select-A coroutine */
+ int regEofA; /* Flag to indicate when select-A is complete */
+ int regAddrB; /* Address register for select-B coroutine */
+ int regEofB; /* Flag to indicate when select-B is complete */
+ int addrSelectA; /* Address of the select-A coroutine */
+ int addrSelectB; /* Address of the select-B coroutine */
+ int regOutA; /* Address register for the output-A subroutine */
+ int regOutB; /* Address register for the output-B subroutine */
+ int addrOutA; /* Address of the output-A subroutine */
+ int addrOutB = 0; /* Address of the output-B subroutine */
+ int addrEofA; /* Address of the select-A-exhausted subroutine */
+ int addrEofB; /* Address of the select-B-exhausted subroutine */
+ int addrAltB; /* Address of the A<B subroutine */
+ int addrAeqB; /* Address of the A==B subroutine */
+ int addrAgtB; /* Address of the A>B subroutine */
+ int regLimitA; /* Limit register for select-A */
+ int regLimitB; /* Limit register for select-A */
+ int regPrev; /* A range of registers to hold previous output */
+ int savedLimit; /* Saved value of p->iLimit */
+ int savedOffset; /* Saved value of p->iOffset */
+ int labelCmpr; /* Label for the start of the merge algorithm */
+ int labelEnd; /* Label for the end of the overall SELECT stmt */
+ int j1; /* Jump instructions that get retargetted */
+ int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */
+ KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */
+ KeyInfo *pKeyMerge; /* Comparison information for merging rows */
+ sqlite3 *db; /* Database connection */
+ ExprList *pOrderBy; /* The ORDER BY clause */
+ int nOrderBy; /* Number of terms in the ORDER BY clause */
+ int *aPermute; /* Mapping from ORDER BY terms to result set columns */
+
+ assert( p->pOrderBy!=0 );
+ assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */
+ db = pParse->db;
+ v = pParse->pVdbe;
+ assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */
+ labelEnd = sqlite3VdbeMakeLabel(v);
+ labelCmpr = sqlite3VdbeMakeLabel(v);
+
+
+ /* Patch up the ORDER BY clause
+ */
+ op = p->op;
+ pPrior = p->pPrior;
+ assert( pPrior->pOrderBy==0 );
+ pOrderBy = p->pOrderBy;
+ assert( pOrderBy );
+ nOrderBy = pOrderBy->nExpr;
+
+ /* For operators other than UNION ALL we have to make sure that
+ ** the ORDER BY clause covers every term of the result set. Add
+ ** terms to the ORDER BY clause as necessary.
+ */
+ if( op!=TK_ALL ){
+ for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){
+ struct ExprList_item *pItem;
+ for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){
+ assert( pItem->iCol>0 );
+ if( pItem->iCol==i ) break;
+ }
+ if( j==nOrderBy ){
+ Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0);
+ if( pNew==0 ) return SQLITE_NOMEM;
+ pNew->flags |= EP_IntValue;
+ pNew->u.iValue = i;
+ pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew);
+ pOrderBy->a[nOrderBy++].iCol = (u16)i;
+ }
+ }
+ }
+
+ /* Compute the comparison permutation and keyinfo that is used with
+ ** the permutation used to determine if the next
+ ** row of results comes from selectA or selectB. Also add explicit
+ ** collations to the ORDER BY clause terms so that when the subqueries
+ ** to the right and the left are evaluated, they use the correct
+ ** collation.
+ */
+ aPermute = sqlite3DbMallocRaw(db, sizeof(int)*nOrderBy);
+ if( aPermute ){
+ struct ExprList_item *pItem;
+ for(i=0, pItem=pOrderBy->a; i<nOrderBy; i++, pItem++){
+ assert( pItem->iCol>0 && pItem->iCol<=p->pEList->nExpr );
+ aPermute[i] = pItem->iCol - 1;
+ }
+ pKeyMerge =
+ sqlite3DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1));
+ if( pKeyMerge ){
+ pKeyMerge->aSortOrder = (u8*)&pKeyMerge->aColl[nOrderBy];
+ pKeyMerge->nField = (u16)nOrderBy;
+ pKeyMerge->enc = ENC(db);
+ for(i=0; i<nOrderBy; i++){
+ CollSeq *pColl;
+ Expr *pTerm = pOrderBy->a[i].pExpr;
+ if( pTerm->flags & EP_ExpCollate ){
+ pColl = pTerm->pColl;
}else{
- *apColl = aCopy[pExpr->iColumn];
+ pColl = multiSelectCollSeq(pParse, p, aPermute[i]);
+ pTerm->flags |= EP_ExpCollate;
+ pTerm->pColl = pColl;
}
- *pSortOrder = pOTerm->sortOrder;
+ pKeyMerge->aColl[i] = pColl;
+ pKeyMerge->aSortOrder[i] = pOrderBy->a[i].sortOrder;
}
- assert( p->pRightmost==p );
- assert( p->addrOpenEphm[2]>=0 );
- addr = p->addrOpenEphm[2];
- sqlite3VdbeChangeP2(v, addr, p->pOrderBy->nExpr+2);
- pKeyInfo->nField = nOrderByExpr;
- sqlite3VdbeChangeP4(v, addr, (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
- pKeyInfo = 0;
- generateSortTail(pParse, p, v, p->pEList->nExpr, &dest);
}
+ }else{
+ pKeyMerge = 0;
+ }
- sqlite3_free(pKeyInfo);
+ /* Reattach the ORDER BY clause to the query.
+ */
+ p->pOrderBy = pOrderBy;
+ pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0);
+
+ /* Allocate a range of temporary registers and the KeyInfo needed
+ ** for the logic that removes duplicate result rows when the
+ ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL).
+ */
+ if( op==TK_ALL ){
+ regPrev = 0;
+ }else{
+ int nExpr = p->pEList->nExpr;
+ assert( nOrderBy>=nExpr || db->mallocFailed );
+ regPrev = sqlite3GetTempRange(pParse, nExpr+1);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev);
+ pKeyDup = sqlite3DbMallocZero(db,
+ sizeof(*pKeyDup) + nExpr*(sizeof(CollSeq*)+1) );
+ if( pKeyDup ){
+ pKeyDup->aSortOrder = (u8*)&pKeyDup->aColl[nExpr];
+ pKeyDup->nField = (u16)nExpr;
+ pKeyDup->enc = ENC(db);
+ for(i=0; i<nExpr; i++){
+ pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i);
+ pKeyDup->aSortOrder[i] = 0;
+ }
+ }
+ }
+
+ /* Separate the left and the right query from one another
+ */
+ p->pPrior = 0;
+ pPrior->pRightmost = 0;
+ sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER");
+ if( pPrior->pPrior==0 ){
+ sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER");
+ }
+
+ /* Compute the limit registers */
+ computeLimitRegisters(pParse, p, labelEnd);
+ if( p->iLimit && op==TK_ALL ){
+ regLimitA = ++pParse->nMem;
+ regLimitB = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit,
+ regLimitA);
+ sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB);
+ }else{
+ regLimitA = regLimitB = 0;
+ }
+ sqlite3ExprDelete(db, p->pLimit);
+ p->pLimit = 0;
+ sqlite3ExprDelete(db, p->pOffset);
+ p->pOffset = 0;
+
+ regAddrA = ++pParse->nMem;
+ regEofA = ++pParse->nMem;
+ regAddrB = ++pParse->nMem;
+ regEofB = ++pParse->nMem;
+ regOutA = ++pParse->nMem;
+ regOutB = ++pParse->nMem;
+ sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA);
+ sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB);
+
+ /* Jump past the various subroutines and coroutines to the main
+ ** merge loop
+ */
+ j1 = sqlite3VdbeAddOp0(v, OP_Goto);
+ addrSelectA = sqlite3VdbeCurrentAddr(v);
+
+
+ /* Generate a coroutine to evaluate the SELECT statement to the
+ ** left of the compound operator - the "A" select.
+ */
+ VdbeNoopComment((v, "Begin coroutine for left SELECT"));
+ pPrior->iLimit = regLimitA;
+ sqlite3Select(pParse, pPrior, &destA);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofA);
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
+ VdbeNoopComment((v, "End coroutine for left SELECT"));
+
+ /* Generate a coroutine to evaluate the SELECT statement on
+ ** the right - the "B" select
+ */
+ addrSelectB = sqlite3VdbeCurrentAddr(v);
+ VdbeNoopComment((v, "Begin coroutine for right SELECT"));
+ savedLimit = p->iLimit;
+ savedOffset = p->iOffset;
+ p->iLimit = regLimitB;
+ p->iOffset = 0;
+ sqlite3Select(pParse, p, &destB);
+ p->iLimit = savedLimit;
+ p->iOffset = savedOffset;
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofB);
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
+ VdbeNoopComment((v, "End coroutine for right SELECT"));
+
+ /* Generate a subroutine that outputs the current row of the A
+ ** select as the next output row of the compound select.
+ */
+ VdbeNoopComment((v, "Output routine for A"));
+ addrOutA = generateOutputSubroutine(pParse,
+ p, &destA, pDest, regOutA,
+ regPrev, pKeyDup, P4_KEYINFO_HANDOFF, labelEnd);
+
+ /* Generate a subroutine that outputs the current row of the B
+ ** select as the next output row of the compound select.
+ */
+ if( op==TK_ALL || op==TK_UNION ){
+ VdbeNoopComment((v, "Output routine for B"));
+ addrOutB = generateOutputSubroutine(pParse,
+ p, &destB, pDest, regOutB,
+ regPrev, pKeyDup, P4_KEYINFO_STATIC, labelEnd);
}
-multi_select_end:
- pDest->iMem = dest.iMem;
- pDest->nMem = dest.nMem;
- return rc;
+ /* Generate a subroutine to run when the results from select A
+ ** are exhausted and only data in select B remains.
+ */
+ VdbeNoopComment((v, "eof-A subroutine"));
+ if( op==TK_EXCEPT || op==TK_INTERSECT ){
+ addrEofA = sqlite3VdbeAddOp2(v, OP_Goto, 0, labelEnd);
+ }else{
+ addrEofA = sqlite3VdbeAddOp2(v, OP_If, regEofB, labelEnd);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofA);
+ }
+
+ /* Generate a subroutine to run when the results from select B
+ ** are exhausted and only data in select A remains.
+ */
+ if( op==TK_INTERSECT ){
+ addrEofB = addrEofA;
+ }else{
+ VdbeNoopComment((v, "eof-B subroutine"));
+ addrEofB = sqlite3VdbeAddOp2(v, OP_If, regEofA, labelEnd);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofB);
+ }
+
+ /* Generate code to handle the case of A<B
+ */
+ VdbeNoopComment((v, "A-lt-B subroutine"));
+ addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
+ sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
+
+ /* Generate code to handle the case of A==B
+ */
+ if( op==TK_ALL ){
+ addrAeqB = addrAltB;
+ }else if( op==TK_INTERSECT ){
+ addrAeqB = addrAltB;
+ addrAltB++;
+ }else{
+ VdbeNoopComment((v, "A-eq-B subroutine"));
+ addrAeqB =
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
+ sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
+ }
+
+ /* Generate code to handle the case of A>B
+ */
+ VdbeNoopComment((v, "A-gt-B subroutine"));
+ addrAgtB = sqlite3VdbeCurrentAddr(v);
+ if( op==TK_ALL || op==TK_UNION ){
+ sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);
+ }
+ sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
+ sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB);
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
+
+ /* This code runs once to initialize everything.
+ */
+ sqlite3VdbeJumpHere(v, j1);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofA);
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofB);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regAddrA, addrSelectA);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regAddrB, addrSelectB);
+ sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
+ sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB);
+
+ /* Implement the main merge loop
+ */
+ sqlite3VdbeResolveLabel(v, labelCmpr);
+ sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY);
+ sqlite3VdbeAddOp4(v, OP_Compare, destA.iMem, destB.iMem, nOrderBy,
+ (char*)pKeyMerge, P4_KEYINFO_HANDOFF);
+ sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB);
+
+ /* Release temporary registers
+ */
+ if( regPrev ){
+ sqlite3ReleaseTempRange(pParse, regPrev, nOrderBy+1);
+ }
+
+ /* Jump to the this point in order to terminate the query.
+ */
+ sqlite3VdbeResolveLabel(v, labelEnd);
+
+ /* Set the number of output columns
+ */
+ if( pDest->eDest==SRT_Output ){
+ Select *pFirst = pPrior;
+ while( pFirst->pPrior ) pFirst = pFirst->pPrior;
+ generateColumnNames(pParse, 0, pFirst->pEList);
+ }
+
+ /* Reassembly the compound query so that it will be freed correctly
+ ** by the calling function */
+ if( p->pPrior ){
+ sqlite3SelectDelete(db, p->pPrior);
+ }
+ p->pPrior = pPrior;
+
+ /*** TBD: Insert subroutine calls to close cursors on incomplete
+ **** subqueries ****/
+ return SQLITE_OK;
}
-#endif /* SQLITE_OMIT_COMPOUND_SELECT */
+#endif
-#ifndef SQLITE_OMIT_VIEW
+#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
/* Forward Declarations */
static void substExprList(sqlite3*, ExprList*, int, ExprList*);
static void substSelect(sqlite3*, Select *, int, ExprList *);
@@ -65796,44 +80917,37 @@ static void substSelect(sqlite3*, Select *, int, ExprList *);
** changes to pExpr so that it refers directly to the source table
** of the subquery rather the result set of the subquery.
*/
-static void substExpr(
+static Expr *substExpr(
sqlite3 *db, /* Report malloc errors to this connection */
Expr *pExpr, /* Expr in which substitution occurs */
int iTable, /* Table to be substituted */
ExprList *pEList /* Substitute expressions */
){
- if( pExpr==0 ) return;
+ if( pExpr==0 ) return 0;
if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){
if( pExpr->iColumn<0 ){
pExpr->op = TK_NULL;
}else{
Expr *pNew;
assert( pEList!=0 && pExpr->iColumn<pEList->nExpr );
- assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 );
- pNew = pEList->a[pExpr->iColumn].pExpr;
- assert( pNew!=0 );
- pExpr->op = pNew->op;
- assert( pExpr->pLeft==0 );
- pExpr->pLeft = sqlite3ExprDup(db, pNew->pLeft);
- assert( pExpr->pRight==0 );
- pExpr->pRight = sqlite3ExprDup(db, pNew->pRight);
- assert( pExpr->pList==0 );
- pExpr->pList = sqlite3ExprListDup(db, pNew->pList);
- pExpr->iTable = pNew->iTable;
- pExpr->pTab = pNew->pTab;
- pExpr->iColumn = pNew->iColumn;
- pExpr->iAgg = pNew->iAgg;
- sqlite3TokenCopy(db, &pExpr->token, &pNew->token);
- sqlite3TokenCopy(db, &pExpr->span, &pNew->span);
- pExpr->pSelect = sqlite3SelectDup(db, pNew->pSelect);
- pExpr->flags = pNew->flags;
+ assert( pExpr->pLeft==0 && pExpr->pRight==0 );
+ pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0);
+ if( pNew && pExpr->pColl ){
+ pNew->pColl = pExpr->pColl;
+ }
+ sqlite3ExprDelete(db, pExpr);
+ pExpr = pNew;
}
}else{
- substExpr(db, pExpr->pLeft, iTable, pEList);
- substExpr(db, pExpr->pRight, iTable, pEList);
- substSelect(db, pExpr->pSelect, iTable, pEList);
- substExprList(db, pExpr->pList, iTable, pEList);
+ pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList);
+ pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList);
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ substSelect(db, pExpr->x.pSelect, iTable, pEList);
+ }else{
+ substExprList(db, pExpr->x.pList, iTable, pEList);
+ }
}
+ return pExpr;
}
static void substExprList(
sqlite3 *db, /* Report malloc errors here */
@@ -65844,7 +80958,7 @@ static void substExprList(
int i;
if( pList==0 ) return;
for(i=0; i<pList->nExpr; i++){
- substExpr(db, pList->a[i].pExpr, iTable, pEList);
+ pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList);
}
}
static void substSelect(
@@ -65853,17 +80967,27 @@ static void substSelect(
int iTable, /* Table to be replaced */
ExprList *pEList /* Substitute values */
){
+ SrcList *pSrc;
+ struct SrcList_item *pItem;
+ int i;
if( !p ) return;
substExprList(db, p->pEList, iTable, pEList);
substExprList(db, p->pGroupBy, iTable, pEList);
substExprList(db, p->pOrderBy, iTable, pEList);
- substExpr(db, p->pHaving, iTable, pEList);
- substExpr(db, p->pWhere, iTable, pEList);
+ p->pHaving = substExpr(db, p->pHaving, iTable, pEList);
+ p->pWhere = substExpr(db, p->pWhere, iTable, pEList);
substSelect(db, p->pPrior, iTable, pEList);
+ pSrc = p->pSrc;
+ assert( pSrc ); /* Even for (SELECT 1) we have: pSrc!=0 but pSrc->nSrc==0 */
+ if( ALWAYS(pSrc) ){
+ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
+ substSelect(db, pItem->pSelect, iTable, pEList);
+ }
+ }
}
-#endif /* !defined(SQLITE_OMIT_VIEW) */
+#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
-#ifndef SQLITE_OMIT_VIEW
+#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
/*
** This routine attempts to flatten subqueries in order to speed
** execution. It returns 1 if it makes changes and 0 if no flattening
@@ -65897,8 +81021,8 @@ static void substSelect(
**
** (2) The subquery is not an aggregate or the outer query is not a join.
**
-** (3) The subquery is not the right operand of a left outer join, or
-** the subquery is not itself a join. (Ticket #306)
+** (3) The subquery is not the right operand of a left outer join
+** (Originally ticket #306. Strenghtened by ticket #3300)
**
** (4) The subquery is not DISTINCT or the outer query is not a join.
**
@@ -65920,8 +81044,8 @@ static void substSelect(
**
** (11) The subquery and the outer query do not both have ORDER BY clauses.
**
-** (12) The subquery is not the right term of a LEFT OUTER JOIN or the
-** subquery has no WHERE clause. (added by ticket #350)
+** (12) Not implemented. Subsumed into restriction (3). Was previously
+** a separate restriction deriving from ticket #350.
**
** (13) The subquery and outer query do not both use LIMIT
**
@@ -65935,6 +81059,31 @@ static void substSelect(
** not contain ORDER BY. (Ticket #2942) This used to not matter
** until we introduced the group_concat() function.
**
+** (17) The sub-query is not a compound select, or it is a UNION ALL
+** compound clause made up entirely of non-aggregate queries, and
+** the parent query:
+**
+** * is not itself part of a compound select,
+** * is not an aggregate or DISTINCT query, and
+** * has no other tables or sub-selects in the FROM clause.
+**
+** The parent and sub-query may contain WHERE clauses. Subject to
+** rules (11), (13) and (14), they may also contain ORDER BY,
+** LIMIT and OFFSET clauses.
+**
+** (18) If the sub-query is a compound select, then all terms of the
+** ORDER by clause of the parent must be simple references to
+** columns of the sub-query.
+**
+** (19) The subquery does not use LIMIT or the outer query does not
+** have a WHERE clause.
+**
+** (20) If the sub-query is a compound select, then it must not use
+** an ORDER BY clause. Ticket #3773. We could relax this constraint
+** somewhat by saying that the terms of the ORDER BY clause must
+** appear as unmodified result columns in the outer query. But
+** have other optimizations in mind to deal with that case.
+**
** In this routine, the "p" parameter is a pointer to the outer query.
** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query
** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates.
@@ -65946,13 +81095,16 @@ static void substSelect(
** the subquery before this routine runs.
*/
static int flattenSubquery(
- sqlite3 *db, /* Database connection */
+ Parse *pParse, /* Parsing context */
Select *p, /* The parent or outer SELECT statement */
int iFrom, /* Index in p->pSrc->a[] of the inner subquery */
int isAgg, /* True if outer SELECT uses aggregate functions */
int subqueryIsAgg /* True if the subquery uses aggregate functions */
){
+ const char *zSavedAuthContext = pParse->zAuthContext;
+ Select *pParent;
Select *pSub; /* The inner query or "subquery" */
+ Select *pSub1; /* Pointer to the rightmost select in sub-query */
SrcList *pSrc; /* The FROM clause of the outer query */
SrcList *pSubSrc; /* The FROM clause of the subquery */
ExprList *pList; /* The result set of the outer query */
@@ -65960,13 +81112,16 @@ static int flattenSubquery(
int i; /* Loop counter */
Expr *pWhere; /* The WHERE clause */
struct SrcList_item *pSubitem; /* The subquery */
+ sqlite3 *db = pParse->db;
/* Check to see if flattening is permitted. Return 0 if not.
*/
- if( p==0 ) return 0;
+ assert( p!=0 );
+ assert( p->pPrior==0 ); /* Unable to flatten compound queries */
pSrc = p->pSrc;
assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc );
pSubitem = &pSrc->a[iFrom];
+ iParent = pSubitem->iCursor;
pSub = pSubitem->pSelect;
assert( pSub!=0 );
if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */
@@ -65984,17 +81139,21 @@ static int flattenSubquery(
return 0; /* Restriction (15) */
}
if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */
- if( (pSub->isDistinct || pSub->pLimit)
+ if( ((pSub->selFlags & SF_Distinct)!=0 || pSub->pLimit)
&& (pSrc->nSrc>1 || isAgg) ){ /* Restrictions (4)(5)(8)(9) */
return 0;
}
- if( p->isDistinct && subqueryIsAgg ) return 0; /* Restriction (6) */
- if( (p->disallowOrderBy || p->pOrderBy) && pSub->pOrderBy ){
+ if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){
+ return 0; /* Restriction (6) */
+ }
+ if( p->pOrderBy && pSub->pOrderBy ){
return 0; /* Restriction (11) */
}
if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */
+ if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */
- /* Restriction 3: If the subquery is a join, make sure the subquery is
+ /* OBSOLETE COMMENT 1:
+ ** Restriction 3: If the subquery is a join, make sure the subquery is
** not used as the right operand of an outer join. Examples of why this
** is not allowed:
**
@@ -66005,12 +81164,9 @@ static int flattenSubquery(
** (t1 LEFT OUTER JOIN t2) JOIN t3
**
** which is not at all the same thing.
- */
- if( pSubSrc->nSrc>1 && (pSubitem->jointype & JT_OUTER)!=0 ){
- return 0;
- }
-
- /* Restriction 12: If the subquery is the right operand of a left outer
+ **
+ ** OBSOLETE COMMENT 2:
+ ** Restriction 12: If the subquery is the right operand of a left outer
** join, make sure the subquery has no WHERE clause.
** An examples of why this is not allowed:
**
@@ -66022,16 +81178,154 @@ static int flattenSubquery(
**
** But the t2.x>0 test will always fail on a NULL row of t2, which
** effectively converts the OUTER JOIN into an INNER JOIN.
+ **
+ ** THIS OVERRIDES OBSOLETE COMMENTS 1 AND 2 ABOVE:
+ ** Ticket #3300 shows that flattening the right term of a LEFT JOIN
+ ** is fraught with danger. Best to avoid the whole thing. If the
+ ** subquery is the right term of a LEFT JOIN, then do not flatten.
*/
- if( (pSubitem->jointype & JT_OUTER)!=0 && pSub->pWhere!=0 ){
+ if( (pSubitem->jointype & JT_OUTER)!=0 ){
return 0;
}
- /* If we reach this point, it means flattening is permitted for the
- ** iFrom-th entry of the FROM clause in the outer query.
+ /* Restriction 17: If the sub-query is a compound SELECT, then it must
+ ** use only the UNION ALL operator. And none of the simple select queries
+ ** that make up the compound SELECT are allowed to be aggregate or distinct
+ ** queries.
+ */
+ if( pSub->pPrior ){
+ if( pSub->pOrderBy ){
+ return 0; /* Restriction 20 */
+ }
+ if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){
+ return 0;
+ }
+ for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){
+ testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
+ testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
+ if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0
+ || (pSub1->pPrior && pSub1->op!=TK_ALL)
+ || NEVER(pSub1->pSrc==0) || pSub1->pSrc->nSrc!=1
+ ){
+ return 0;
+ }
+ }
+
+ /* Restriction 18. */
+ if( p->pOrderBy ){
+ int ii;
+ for(ii=0; ii<p->pOrderBy->nExpr; ii++){
+ if( p->pOrderBy->a[ii].iCol==0 ) return 0;
+ }
+ }
+ }
+
+ /***** If we reach this point, flattening is permitted. *****/
+
+ /* Authorize the subquery */
+ pParse->zAuthContext = pSubitem->zName;
+ sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0);
+ pParse->zAuthContext = zSavedAuthContext;
+
+ /* If the sub-query is a compound SELECT statement, then (by restrictions
+ ** 17 and 18 above) it must be a UNION ALL and the parent query must
+ ** be of the form:
+ **
+ ** SELECT <expr-list> FROM (<sub-query>) <where-clause>
+ **
+ ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block
+ ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or
+ ** OFFSET clauses and joins them to the left-hand-side of the original
+ ** using UNION ALL operators. In this case N is the number of simple
+ ** select statements in the compound sub-query.
+ **
+ ** Example:
+ **
+ ** SELECT a+1 FROM (
+ ** SELECT x FROM tab
+ ** UNION ALL
+ ** SELECT y FROM tab
+ ** UNION ALL
+ ** SELECT abs(z*2) FROM tab2
+ ** ) WHERE a!=5 ORDER BY 1
+ **
+ ** Transformed into:
+ **
+ ** SELECT x+1 FROM tab WHERE x+1!=5
+ ** UNION ALL
+ ** SELECT y+1 FROM tab WHERE y+1!=5
+ ** UNION ALL
+ ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5
+ ** ORDER BY 1
+ **
+ ** We call this the "compound-subquery flattening".
+ */
+ for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){
+ Select *pNew;
+ ExprList *pOrderBy = p->pOrderBy;
+ Expr *pLimit = p->pLimit;
+ Select *pPrior = p->pPrior;
+ p->pOrderBy = 0;
+ p->pSrc = 0;
+ p->pPrior = 0;
+ p->pLimit = 0;
+ pNew = sqlite3SelectDup(db, p, 0);
+ p->pLimit = pLimit;
+ p->pOrderBy = pOrderBy;
+ p->pSrc = pSrc;
+ p->op = TK_ALL;
+ p->pRightmost = 0;
+ if( pNew==0 ){
+ pNew = pPrior;
+ }else{
+ pNew->pPrior = pPrior;
+ pNew->pRightmost = 0;
+ }
+ p->pPrior = pNew;
+ if( db->mallocFailed ) return 1;
+ }
+
+ /* Begin flattening the iFrom-th entry of the FROM clause
+ ** in the outer query.
+ */
+ pSub = pSub1 = pSubitem->pSelect;
+
+ /* Delete the transient table structure associated with the
+ ** subquery
*/
+ sqlite3DbFree(db, pSubitem->zDatabase);
+ sqlite3DbFree(db, pSubitem->zName);
+ sqlite3DbFree(db, pSubitem->zAlias);
+ pSubitem->zDatabase = 0;
+ pSubitem->zName = 0;
+ pSubitem->zAlias = 0;
+ pSubitem->pSelect = 0;
- /* Move all of the FROM elements of the subquery into the
+ /* Defer deleting the Table object associated with the
+ ** subquery until code generation is
+ ** complete, since there may still exist Expr.pTab entries that
+ ** refer to the subquery even after flattening. Ticket #3346.
+ **
+ ** pSubitem->pTab is always non-NULL by test restrictions and tests above.
+ */
+ if( ALWAYS(pSubitem->pTab!=0) ){
+ Table *pTabToDel = pSubitem->pTab;
+ if( pTabToDel->nRef==1 ){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
+ pTabToDel->pNextZombie = pToplevel->pZombieTab;
+ pToplevel->pZombieTab = pTabToDel;
+ }else{
+ pTabToDel->nRef--;
+ }
+ pSubitem->pTab = 0;
+ }
+
+ /* The following loop runs once for each term in a compound-subquery
+ ** flattening (as described above). If we are doing a different kind
+ ** of flattening - a flattening other than a compound-subquery flattening -
+ ** then this loop only runs once.
+ **
+ ** This loop moves all of the FROM elements of the subquery into the
** the FROM clause of the outer query. Before doing this, remember
** the cursor number for the original outer query FROM element in
** iParent. The iParent cursor will never be used. Subsequent code
@@ -66039,114 +81333,134 @@ static int flattenSubquery(
** those references with expressions that resolve to the subquery FROM
** elements we are now copying in.
*/
- iParent = pSubitem->iCursor;
- {
- int nSubSrc = pSubSrc->nSrc;
- int jointype = pSubitem->jointype;
+ for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
+ int nSubSrc;
+ u8 jointype = 0;
+ pSubSrc = pSub->pSrc; /* FROM clause of subquery */
+ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */
+ pSrc = pParent->pSrc; /* FROM clause of the outer query */
- sqlite3DeleteTable(pSubitem->pTab);
- sqlite3_free(pSubitem->zDatabase);
- sqlite3_free(pSubitem->zName);
- sqlite3_free(pSubitem->zAlias);
- pSubitem->pTab = 0;
- pSubitem->zDatabase = 0;
- pSubitem->zName = 0;
- pSubitem->zAlias = 0;
- if( nSubSrc>1 ){
- int extra = nSubSrc - 1;
- for(i=1; i<nSubSrc; i++){
- pSrc = sqlite3SrcListAppend(db, pSrc, 0, 0);
- if( pSrc==0 ){
- p->pSrc = 0;
- return 1;
- }
+ if( pSrc ){
+ assert( pParent==p ); /* First time through the loop */
+ jointype = pSubitem->jointype;
+ }else{
+ assert( pParent!=p ); /* 2nd and subsequent times through the loop */
+ pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0);
+ if( pSrc==0 ){
+ assert( db->mallocFailed );
+ break;
}
- p->pSrc = pSrc;
- for(i=pSrc->nSrc-1; i-extra>=iFrom; i--){
- pSrc->a[i] = pSrc->a[i-extra];
+ }
+
+ /* The subquery uses a single slot of the FROM clause of the outer
+ ** query. If the subquery has more than one element in its FROM clause,
+ ** then expand the outer query to make space for it to hold all elements
+ ** of the subquery.
+ **
+ ** Example:
+ **
+ ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB;
+ **
+ ** The outer query has 3 slots in its FROM clause. One slot of the
+ ** outer query (the middle slot) is used by the subquery. The next
+ ** block of code will expand the out query to 4 slots. The middle
+ ** slot is expanded to two slots in order to make space for the
+ ** two elements in the FROM clause of the subquery.
+ */
+ if( nSubSrc>1 ){
+ pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1);
+ if( db->mallocFailed ){
+ break;
}
}
+
+ /* Transfer the FROM clause terms from the subquery into the
+ ** outer query.
+ */
for(i=0; i<nSubSrc; i++){
+ sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing);
pSrc->a[i+iFrom] = pSubSrc->a[i];
memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
}
pSrc->a[iFrom].jointype = jointype;
- }
-
- /* Now begin substituting subquery result set expressions for
- ** references to the iParent in the outer query.
- **
- ** Example:
- **
- ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b;
- ** \ \_____________ subquery __________/ /
- ** \_____________________ outer query ______________________________/
- **
- ** We look at every expression in the outer query and every place we see
- ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10".
- */
- pList = p->pEList;
- for(i=0; i<pList->nExpr; i++){
- Expr *pExpr;
- if( pList->a[i].zName==0 && (pExpr = pList->a[i].pExpr)->span.z!=0 ){
- pList->a[i].zName =
- sqlite3DbStrNDup(db, (char*)pExpr->span.z, pExpr->span.n);
- }
- }
- substExprList(db, p->pEList, iParent, pSub->pEList);
- if( isAgg ){
- substExprList(db, p->pGroupBy, iParent, pSub->pEList);
- substExpr(db, p->pHaving, iParent, pSub->pEList);
- }
- if( pSub->pOrderBy ){
- assert( p->pOrderBy==0 );
- p->pOrderBy = pSub->pOrderBy;
- pSub->pOrderBy = 0;
- }else if( p->pOrderBy ){
- substExprList(db, p->pOrderBy, iParent, pSub->pEList);
- }
- if( pSub->pWhere ){
- pWhere = sqlite3ExprDup(db, pSub->pWhere);
- }else{
- pWhere = 0;
- }
- if( subqueryIsAgg ){
- assert( p->pHaving==0 );
- p->pHaving = p->pWhere;
- p->pWhere = pWhere;
- substExpr(db, p->pHaving, iParent, pSub->pEList);
- p->pHaving = sqlite3ExprAnd(db, p->pHaving,
- sqlite3ExprDup(db, pSub->pHaving));
- assert( p->pGroupBy==0 );
- p->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy);
- }else{
- substExpr(db, p->pWhere, iParent, pSub->pEList);
- p->pWhere = sqlite3ExprAnd(db, p->pWhere, pWhere);
- }
-
- /* The flattened query is distinct if either the inner or the
- ** outer query is distinct.
- */
- p->isDistinct = p->isDistinct || pSub->isDistinct;
-
- /*
- ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y;
- **
- ** One is tempted to try to add a and b to combine the limits. But this
- ** does not work if either limit is negative.
- */
- if( pSub->pLimit ){
- p->pLimit = pSub->pLimit;
- pSub->pLimit = 0;
+
+ /* Now begin substituting subquery result set expressions for
+ ** references to the iParent in the outer query.
+ **
+ ** Example:
+ **
+ ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b;
+ ** \ \_____________ subquery __________/ /
+ ** \_____________________ outer query ______________________________/
+ **
+ ** We look at every expression in the outer query and every place we see
+ ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10".
+ */
+ pList = pParent->pEList;
+ for(i=0; i<pList->nExpr; i++){
+ if( pList->a[i].zName==0 ){
+ const char *zSpan = pList->a[i].zSpan;
+ if( ALWAYS(zSpan) ){
+ pList->a[i].zName = sqlite3DbStrDup(db, zSpan);
+ }
+ }
+ }
+ substExprList(db, pParent->pEList, iParent, pSub->pEList);
+ if( isAgg ){
+ substExprList(db, pParent->pGroupBy, iParent, pSub->pEList);
+ pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList);
+ }
+ if( pSub->pOrderBy ){
+ assert( pParent->pOrderBy==0 );
+ pParent->pOrderBy = pSub->pOrderBy;
+ pSub->pOrderBy = 0;
+ }else if( pParent->pOrderBy ){
+ substExprList(db, pParent->pOrderBy, iParent, pSub->pEList);
+ }
+ if( pSub->pWhere ){
+ pWhere = sqlite3ExprDup(db, pSub->pWhere, 0);
+ }else{
+ pWhere = 0;
+ }
+ if( subqueryIsAgg ){
+ assert( pParent->pHaving==0 );
+ pParent->pHaving = pParent->pWhere;
+ pParent->pWhere = pWhere;
+ pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList);
+ pParent->pHaving = sqlite3ExprAnd(db, pParent->pHaving,
+ sqlite3ExprDup(db, pSub->pHaving, 0));
+ assert( pParent->pGroupBy==0 );
+ pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0);
+ }else{
+ pParent->pWhere = substExpr(db, pParent->pWhere, iParent, pSub->pEList);
+ pParent->pWhere = sqlite3ExprAnd(db, pParent->pWhere, pWhere);
+ }
+
+ /* The flattened query is distinct if either the inner or the
+ ** outer query is distinct.
+ */
+ pParent->selFlags |= pSub->selFlags & SF_Distinct;
+
+ /*
+ ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y;
+ **
+ ** One is tempted to try to add a and b to combine the limits. But this
+ ** does not work if either limit is negative.
+ */
+ if( pSub->pLimit ){
+ pParent->pLimit = pSub->pLimit;
+ pSub->pLimit = 0;
+ }
}
/* Finially, delete what is left of the subquery and return
** success.
*/
- sqlite3SelectDelete(pSub);
+ sqlite3SelectDelete(db, pSub1);
+
return 1;
}
-#endif /* SQLITE_OMIT_VIEW */
+#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
/*
** Analyze the SELECT statement passed as an argument to see if it
@@ -66159,152 +81473,448 @@ static int flattenSubquery(
** 2. There is a single expression in the result set, and it is
** either min(x) or max(x), where x is a column reference.
*/
-static int minMaxQuery(Parse *pParse, Select *p){
+static u8 minMaxQuery(Select *p){
Expr *pExpr;
ExprList *pEList = p->pEList;
if( pEList->nExpr!=1 ) return WHERE_ORDERBY_NORMAL;
pExpr = pEList->a[0].pExpr;
- pEList = pExpr->pList;
- if( pExpr->op!=TK_AGG_FUNCTION || pEList==0 || pEList->nExpr!=1 ) return 0;
+ if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
+ if( NEVER(ExprHasProperty(pExpr, EP_xIsSelect)) ) return 0;
+ pEList = pExpr->x.pList;
+ if( pEList==0 || pEList->nExpr!=1 ) return 0;
if( pEList->a[0].pExpr->op!=TK_AGG_COLUMN ) return WHERE_ORDERBY_NORMAL;
- if( pExpr->token.n!=3 ) return WHERE_ORDERBY_NORMAL;
- if( sqlite3StrNICmp((char*)pExpr->token.z,"min",3)==0 ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ if( sqlite3StrICmp(pExpr->u.zToken,"min")==0 ){
return WHERE_ORDERBY_MIN;
- }else if( sqlite3StrNICmp((char*)pExpr->token.z,"max",3)==0 ){
+ }else if( sqlite3StrICmp(pExpr->u.zToken,"max")==0 ){
return WHERE_ORDERBY_MAX;
}
return WHERE_ORDERBY_NORMAL;
}
/*
-** This routine resolves any names used in the result set of the
-** supplied SELECT statement. If the SELECT statement being resolved
-** is a sub-select, then pOuterNC is a pointer to the NameContext
-** of the parent SELECT.
+** The select statement passed as the first argument is an aggregate query.
+** The second argment is the associated aggregate-info object. This
+** function tests if the SELECT is of the form:
+**
+** SELECT count(*) FROM <tbl>
+**
+** where table is a database table, not a sub-select or view. If the query
+** does match this pattern, then a pointer to the Table object representing
+** <tbl> is returned. Otherwise, 0 is returned.
*/
-SQLITE_PRIVATE int sqlite3SelectResolve(
- Parse *pParse, /* The parser context */
- Select *p, /* The SELECT statement being coded. */
- NameContext *pOuterNC /* The outer name context. May be NULL. */
-){
- ExprList *pEList; /* Result set. */
- int i; /* For-loop variable used in multiple places */
- NameContext sNC; /* Local name-context */
- ExprList *pGroupBy; /* The group by clause */
-
- /* If this routine has run before, return immediately. */
- if( p->isResolved ){
- assert( !pOuterNC );
- return SQLITE_OK;
- }
- p->isResolved = 1;
+static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
+ Table *pTab;
+ Expr *pExpr;
- /* If there have already been errors, do nothing. */
- if( pParse->nErr>0 ){
- return SQLITE_ERROR;
- }
+ assert( !p->pGroupBy );
- /* Prepare the select statement. This call will allocate all cursors
- ** required to handle the tables and subqueries in the FROM clause.
- */
- if( prepSelectStmt(pParse, p) ){
- return SQLITE_ERROR;
+ if( p->pWhere || p->pEList->nExpr!=1
+ || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect
+ ){
+ return 0;
}
+ pTab = p->pSrc->a[0].pTab;
+ pExpr = p->pEList->a[0].pExpr;
+ assert( pTab && !pTab->pSelect && pExpr );
- /* Resolve the expressions in the LIMIT and OFFSET clauses. These
- ** are not allowed to refer to any names, so pass an empty NameContext.
- */
- memset(&sNC, 0, sizeof(sNC));
- sNC.pParse = pParse;
- if( sqlite3ExprResolveNames(&sNC, p->pLimit) ||
- sqlite3ExprResolveNames(&sNC, p->pOffset) ){
- return SQLITE_ERROR;
- }
+ if( IsVirtual(pTab) ) return 0;
+ if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
+ if( (pAggInfo->aFunc[0].pFunc->flags&SQLITE_FUNC_COUNT)==0 ) return 0;
+ if( pExpr->flags&EP_Distinct ) return 0;
- /* Set up the local name-context to pass to ExprResolveNames() to
- ** resolve the expression-list.
- */
- sNC.allowAgg = 1;
- sNC.pSrcList = p->pSrc;
- sNC.pNext = pOuterNC;
+ return pTab;
+}
- /* Resolve names in the result set. */
- pEList = p->pEList;
- if( !pEList ) return SQLITE_ERROR;
- for(i=0; i<pEList->nExpr; i++){
- Expr *pX = pEList->a[i].pExpr;
- if( sqlite3ExprResolveNames(&sNC, pX) ){
+/*
+** If the source-list item passed as an argument was augmented with an
+** INDEXED BY clause, then try to locate the specified index. If there
+** was such a clause and the named index cannot be found, return
+** SQLITE_ERROR and leave an error in pParse. Otherwise, populate
+** pFrom->pIndex and return SQLITE_OK.
+*/
+SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){
+ if( pFrom->pTab && pFrom->zIndex ){
+ Table *pTab = pFrom->pTab;
+ char *zIndex = pFrom->zIndex;
+ Index *pIdx;
+ for(pIdx=pTab->pIndex;
+ pIdx && sqlite3StrICmp(pIdx->zName, zIndex);
+ pIdx=pIdx->pNext
+ );
+ if( !pIdx ){
+ sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0);
return SQLITE_ERROR;
}
+ pFrom->pIndex = pIdx;
}
+ return SQLITE_OK;
+}
- /* If there are no aggregate functions in the result-set, and no GROUP BY
- ** expression, do not allow aggregates in any of the other expressions.
+/*
+** This routine is a Walker callback for "expanding" a SELECT statement.
+** "Expanding" means to do the following:
+**
+** (1) Make sure VDBE cursor numbers have been assigned to every
+** element of the FROM clause.
+**
+** (2) Fill in the pTabList->a[].pTab fields in the SrcList that
+** defines FROM clause. When views appear in the FROM clause,
+** fill pTabList->a[].pSelect with a copy of the SELECT statement
+** that implements the view. A copy is made of the view's SELECT
+** statement so that we can freely modify or delete that statement
+** without worrying about messing up the presistent representation
+** of the view.
+**
+** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword
+** on joins and the ON and USING clause of joins.
+**
+** (4) Scan the list of columns in the result set (pEList) looking
+** for instances of the "*" operator or the TABLE.* operator.
+** If found, expand each "*" to be every column in every table
+** and TABLE.* to be every column in TABLE.
+**
+*/
+static int selectExpander(Walker *pWalker, Select *p){
+ Parse *pParse = pWalker->pParse;
+ int i, j, k;
+ SrcList *pTabList;
+ ExprList *pEList;
+ struct SrcList_item *pFrom;
+ sqlite3 *db = pParse->db;
+
+ if( db->mallocFailed ){
+ return WRC_Abort;
+ }
+ if( NEVER(p->pSrc==0) || (p->selFlags & SF_Expanded)!=0 ){
+ return WRC_Prune;
+ }
+ p->selFlags |= SF_Expanded;
+ pTabList = p->pSrc;
+ pEList = p->pEList;
+
+ /* Make sure cursor numbers have been assigned to all entries in
+ ** the FROM clause of the SELECT statement.
*/
- assert( !p->isAgg );
- pGroupBy = p->pGroupBy;
- if( pGroupBy || sNC.hasAgg ){
- p->isAgg = 1;
- }else{
- sNC.allowAgg = 0;
+ sqlite3SrcListAssignCursors(pParse, pTabList);
+
+ /* Look up every table named in the FROM clause of the select. If
+ ** an entry of the FROM clause is a subquery instead of a table or view,
+ ** then create a transient table structure to describe the subquery.
+ */
+ for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
+ Table *pTab;
+ if( pFrom->pTab!=0 ){
+ /* This statement has already been prepared. There is no need
+ ** to go further. */
+ assert( i==0 );
+ return WRC_Prune;
+ }
+ if( pFrom->zName==0 ){
+#ifndef SQLITE_OMIT_SUBQUERY
+ Select *pSel = pFrom->pSelect;
+ /* A sub-query in the FROM clause of a SELECT */
+ assert( pSel!=0 );
+ assert( pFrom->pTab==0 );
+ sqlite3WalkSelect(pWalker, pSel);
+ pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table));
+ if( pTab==0 ) return WRC_Abort;
+ pTab->dbMem = db->lookaside.bEnabled ? db : 0;
+ pTab->nRef = 1;
+ pTab->zName = sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pTab);
+ while( pSel->pPrior ){ pSel = pSel->pPrior; }
+ selectColumnsFromExprList(pParse, pSel->pEList, &pTab->nCol, &pTab->aCol);
+ pTab->iPKey = -1;
+ pTab->tabFlags |= TF_Ephemeral;
+#endif
+ }else{
+ /* An ordinary table or view name in the FROM clause */
+ assert( pFrom->pTab==0 );
+ pFrom->pTab = pTab =
+ sqlite3LocateTable(pParse,0,pFrom->zName,pFrom->zDatabase);
+ if( pTab==0 ) return WRC_Abort;
+ pTab->nRef++;
+#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE)
+ if( pTab->pSelect || IsVirtual(pTab) ){
+ /* We reach here if the named table is a really a view */
+ if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
+ assert( pFrom->pSelect==0 );
+ pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);
+ sqlite3WalkSelect(pWalker, pFrom->pSelect);
+ }
+#endif
+ }
+
+ /* Locate the index named by the INDEXED BY clause, if any. */
+ if( sqlite3IndexedByLookup(pParse, pFrom) ){
+ return WRC_Abort;
+ }
}
- /* If a HAVING clause is present, then there must be a GROUP BY clause.
+ /* Process NATURAL keywords, and ON and USING clauses of joins.
*/
- if( p->pHaving && !pGroupBy ){
- sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING");
- return SQLITE_ERROR;
+ if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){
+ return WRC_Abort;
}
- /* Add the expression list to the name-context before parsing the
- ** other expressions in the SELECT statement. This is so that
- ** expressions in the WHERE clause (etc.) can refer to expressions by
- ** aliases in the result set.
+ /* For every "*" that occurs in the column list, insert the names of
+ ** all columns in all tables. And for every TABLE.* insert the names
+ ** of all columns in TABLE. The parser inserted a special expression
+ ** with the TK_ALL operator for each "*" that it found in the column list.
+ ** The following code just has to locate the TK_ALL expressions and expand
+ ** each one to the list of all columns in all tables.
**
- ** Minor point: If this is the case, then the expression will be
- ** re-evaluated for each reference to it.
+ ** The first loop just checks to see if there are any "*" operators
+ ** that need expanding.
*/
- sNC.pEList = p->pEList;
- if( sqlite3ExprResolveNames(&sNC, p->pWhere) ||
- sqlite3ExprResolveNames(&sNC, p->pHaving) ){
- return SQLITE_ERROR;
+ for(k=0; k<pEList->nExpr; k++){
+ Expr *pE = pEList->a[k].pExpr;
+ if( pE->op==TK_ALL ) break;
+ assert( pE->op!=TK_DOT || pE->pRight!=0 );
+ assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );
+ if( pE->op==TK_DOT && pE->pRight->op==TK_ALL ) break;
}
- if( p->pPrior==0 ){
- if( processOrderGroupBy(pParse, p, p->pOrderBy, 1, &sNC.hasAgg) ){
- return SQLITE_ERROR;
+ if( k<pEList->nExpr ){
+ /*
+ ** If we get here it means the result set contains one or more "*"
+ ** operators that need to be expanded. Loop through each expression
+ ** in the result set and expand them one by one.
+ */
+ struct ExprList_item *a = pEList->a;
+ ExprList *pNew = 0;
+ int flags = pParse->db->flags;
+ int longNames = (flags & SQLITE_FullColNames)!=0
+ && (flags & SQLITE_ShortColNames)==0;
+
+ for(k=0; k<pEList->nExpr; k++){
+ Expr *pE = a[k].pExpr;
+ assert( pE->op!=TK_DOT || pE->pRight!=0 );
+ if( pE->op!=TK_ALL && (pE->op!=TK_DOT || pE->pRight->op!=TK_ALL) ){
+ /* This particular expression does not need to be expanded.
+ */
+ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
+ if( pNew ){
+ pNew->a[pNew->nExpr-1].zName = a[k].zName;
+ pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan;
+ a[k].zName = 0;
+ a[k].zSpan = 0;
+ }
+ a[k].pExpr = 0;
+ }else{
+ /* This expression is a "*" or a "TABLE.*" and needs to be
+ ** expanded. */
+ int tableSeen = 0; /* Set to 1 when TABLE matches */
+ char *zTName; /* text of name of TABLE */
+ if( pE->op==TK_DOT ){
+ assert( pE->pLeft!=0 );
+ assert( !ExprHasProperty(pE->pLeft, EP_IntValue) );
+ zTName = pE->pLeft->u.zToken;
+ }else{
+ zTName = 0;
+ }
+ for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
+ Table *pTab = pFrom->pTab;
+ char *zTabName = pFrom->zAlias;
+ if( zTabName==0 ){
+ zTabName = pTab->zName;
+ }
+ if( db->mallocFailed ) break;
+ if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
+ continue;
+ }
+ tableSeen = 1;
+ for(j=0; j<pTab->nCol; j++){
+ Expr *pExpr, *pRight;
+ char *zName = pTab->aCol[j].zName;
+ char *zColname; /* The computed column name */
+ char *zToFree; /* Malloced string that needs to be freed */
+ Token sColname; /* Computed column name as a token */
+
+ /* If a column is marked as 'hidden' (currently only possible
+ ** for virtual tables), do not include it in the expanded
+ ** result-set list.
+ */
+ if( IsHiddenColumn(&pTab->aCol[j]) ){
+ assert(IsVirtual(pTab));
+ continue;
+ }
+
+ if( i>0 && zTName==0 ){
+ struct SrcList_item *pLeft = &pTabList->a[i-1];
+ if( (pLeft[1].jointype & JT_NATURAL)!=0 &&
+ columnIndex(pLeft->pTab, zName)>=0 ){
+ /* In a NATURAL join, omit the join columns from the
+ ** table on the right */
+ continue;
+ }
+ if( sqlite3IdListIndex(pLeft[1].pUsing, zName)>=0 ){
+ /* In a join with a USING clause, omit columns in the
+ ** using clause from the table on the right. */
+ continue;
+ }
+ }
+ pRight = sqlite3Expr(db, TK_ID, zName);
+ zColname = zName;
+ zToFree = 0;
+ if( longNames || pTabList->nSrc>1 ){
+ Expr *pLeft;
+ pLeft = sqlite3Expr(db, TK_ID, zTabName);
+ pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
+ if( longNames ){
+ zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
+ zToFree = zColname;
+ }
+ }else{
+ pExpr = pRight;
+ }
+ pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);
+ sColname.z = zColname;
+ sColname.n = sqlite3Strlen30(zColname);
+ sqlite3ExprListSetName(pParse, pNew, &sColname, 0);
+ sqlite3DbFree(db, zToFree);
+ }
+ }
+ if( !tableSeen ){
+ if( zTName ){
+ sqlite3ErrorMsg(pParse, "no such table: %s", zTName);
+ }else{
+ sqlite3ErrorMsg(pParse, "no tables specified");
+ }
+ }
+ }
}
+ sqlite3ExprListDelete(db, pEList);
+ p->pEList = pNew;
}
- if( processOrderGroupBy(pParse, p, pGroupBy, 0, &sNC.hasAgg) ){
- return SQLITE_ERROR;
+#if SQLITE_MAX_COLUMN
+ if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
+ sqlite3ErrorMsg(pParse, "too many columns in result set");
}
+#endif
+ return WRC_Continue;
+}
- if( pParse->db->mallocFailed ){
- return SQLITE_NOMEM;
- }
+/*
+** No-op routine for the parse-tree walker.
+**
+** When this routine is the Walker.xExprCallback then expression trees
+** are walked without any actions being taken at each node. Presumably,
+** when this routine is used for Walker.xExprCallback then
+** Walker.xSelectCallback is set to do something useful for every
+** subquery in the parser tree.
+*/
+static int exprWalkNoop(Walker *NotUsed, Expr *NotUsed2){
+ UNUSED_PARAMETER2(NotUsed, NotUsed2);
+ return WRC_Continue;
+}
- /* Make sure the GROUP BY clause does not contain aggregate functions.
- */
- if( pGroupBy ){
- struct ExprList_item *pItem;
-
- for(i=0, pItem=pGroupBy->a; i<pGroupBy->nExpr; i++, pItem++){
- if( ExprHasProperty(pItem->pExpr, EP_Agg) ){
- sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in "
- "the GROUP BY clause");
- return SQLITE_ERROR;
- }
+/*
+** This routine "expands" a SELECT statement and all of its subqueries.
+** For additional information on what it means to "expand" a SELECT
+** statement, see the comment on the selectExpand worker callback above.
+**
+** Expanding a SELECT statement is the first step in processing a
+** SELECT statement. The SELECT statement must be expanded before
+** name resolution is performed.
+**
+** If anything goes wrong, an error message is written into pParse.
+** The calling function can detect the problem by looking at pParse->nErr
+** and/or pParse->db->mallocFailed.
+*/
+static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){
+ Walker w;
+ w.xSelectCallback = selectExpander;
+ w.xExprCallback = exprWalkNoop;
+ w.pParse = pParse;
+ sqlite3WalkSelect(&w, pSelect);
+}
+
+
+#ifndef SQLITE_OMIT_SUBQUERY
+/*
+** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo()
+** interface.
+**
+** For each FROM-clause subquery, add Column.zType and Column.zColl
+** information to the Table structure that represents the result set
+** of that subquery.
+**
+** The Table structure that represents the result set was constructed
+** by selectExpander() but the type and collation information was omitted
+** at that point because identifiers had not yet been resolved. This
+** routine is called after identifier resolution.
+*/
+static int selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
+ Parse *pParse;
+ int i;
+ SrcList *pTabList;
+ struct SrcList_item *pFrom;
+
+ assert( p->selFlags & SF_Resolved );
+ assert( (p->selFlags & SF_HasTypeInfo)==0 );
+ p->selFlags |= SF_HasTypeInfo;
+ pParse = pWalker->pParse;
+ pTabList = p->pSrc;
+ for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
+ Table *pTab = pFrom->pTab;
+ if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){
+ /* A sub-query in the FROM clause of a SELECT */
+ Select *pSel = pFrom->pSelect;
+ assert( pSel );
+ while( pSel->pPrior ) pSel = pSel->pPrior;
+ selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSel);
}
}
+ return WRC_Continue;
+}
+#endif
- /* If this is one SELECT of a compound, be sure to resolve names
- ** in the other SELECTs.
- */
- if( p->pPrior ){
- return sqlite3SelectResolve(pParse, p->pPrior, pOuterNC);
- }else{
- return SQLITE_OK;
- }
+
+/*
+** This routine adds datatype and collating sequence information to
+** the Table structures of all FROM-clause subqueries in a
+** SELECT statement.
+**
+** Use this routine after name resolution.
+*/
+static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){
+#ifndef SQLITE_OMIT_SUBQUERY
+ Walker w;
+ w.xSelectCallback = selectAddSubqueryTypeInfo;
+ w.xExprCallback = exprWalkNoop;
+ w.pParse = pParse;
+ sqlite3WalkSelect(&w, pSelect);
+#endif
+}
+
+
+/*
+** This routine sets of a SELECT statement for processing. The
+** following is accomplished:
+**
+** * VDBE Cursor numbers are assigned to all FROM-clause terms.
+** * Ephemeral Table objects are created for all FROM-clause subqueries.
+** * ON and USING clauses are shifted into WHERE statements
+** * Wildcards "*" and "TABLE.*" in result sets are expanded.
+** * Identifiers in expression are matched to tables.
+**
+** This routine acts recursively on all subqueries within the SELECT.
+*/
+SQLITE_PRIVATE void sqlite3SelectPrep(
+ Parse *pParse, /* The parser context */
+ Select *p, /* The SELECT statement being coded. */
+ NameContext *pOuterNC /* Name context for container */
+){
+ sqlite3 *db;
+ if( NEVER(p==0) ) return;
+ db = pParse->db;
+ if( p->selFlags & SF_HasTypeInfo ) return;
+ sqlite3SelectExpand(pParse, p);
+ if( pParse->nErr || db->mallocFailed ) return;
+ sqlite3ResolveSelectNames(pParse, p, pOuterNC);
+ if( pParse->nErr || db->mallocFailed ) return;
+ sqlite3SelectAddTypeInfo(pParse, p);
}
/*
@@ -66328,12 +81938,13 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem);
if( pFunc->iDistinct>=0 ){
Expr *pE = pFunc->pExpr;
- if( pE->pList==0 || pE->pList->nExpr!=1 ){
- sqlite3ErrorMsg(pParse, "DISTINCT in aggregate must be followed "
- "by an expression");
+ assert( !ExprHasProperty(pE, EP_xIsSelect) );
+ if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
+ sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "
+ "argument");
pFunc->iDistinct = -1;
}else{
- KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->pList);
+ KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->x.pList);
sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0,
(char*)pKeyInfo, P4_KEYINFO_HANDOFF);
}
@@ -66350,7 +81961,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
int i;
struct AggInfo_func *pF;
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
- ExprList *pList = pF->pExpr->pList;
+ ExprList *pList = pF->pExpr->x.pList;
+ assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0,
(void*)pF->pFunc, P4_FUNCDEF);
}
@@ -66367,11 +81979,13 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
struct AggInfo_col *pC;
pAggInfo->directMode = 1;
+ sqlite3ExprCacheClear(pParse);
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
int nArg;
int addrNext = 0;
int regAgg;
- ExprList *pList = pF->pExpr->pList;
+ ExprList *pList = pF->pExpr->x.pList;
+ assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
if( pList ){
nArg = pList->nExpr;
regAgg = sqlite3GetTempRange(pParse, nArg);
@@ -66385,11 +81999,11 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
assert( nArg==1 );
codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg);
}
- if( pF->pFunc->needCollSeq ){
+ if( pF->pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
CollSeq *pColl = 0;
struct ExprList_item *pItem;
int j;
- assert( pList!=0 ); /* pList!=0 if pF->pFunc->needCollSeq is true */
+ assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */
for(j=0, pItem=pList->a; !pColl && j<nArg; j++, pItem++){
pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr);
}
@@ -66400,48 +82014,23 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
}
sqlite3VdbeAddOp4(v, OP_AggStep, 0, regAgg, pF->iMem,
(void*)pF->pFunc, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, nArg);
+ sqlite3VdbeChangeP5(v, (u8)nArg);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg);
if( addrNext ){
sqlite3VdbeResolveLabel(v, addrNext);
+ sqlite3ExprCacheClear(pParse);
}
}
for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
sqlite3ExprCode(pParse, pC->pExpr, pC->iMem);
}
pAggInfo->directMode = 0;
+ sqlite3ExprCacheClear(pParse);
}
-#if 0
-/*
-** This function is used when a SELECT statement is used to create a
-** temporary table for iterating through when running an INSTEAD OF
-** UPDATE or INSTEAD OF DELETE trigger.
-**
-** If possible, the SELECT statement is modified so that NULL values
-** are stored in the temporary table for all columns for which the
-** corresponding bit in argument mask is not set. If mask takes the
-** special value 0xffffffff, then all columns are populated.
-*/
-SQLITE_PRIVATE void sqlite3SelectMask(Parse *pParse, Select *p, u32 mask){
- if( p && !p->pPrior && !p->isDistinct && mask!=0xffffffff ){
- ExprList *pEList;
- int i;
- sqlite3SelectResolve(pParse, p, 0);
- pEList = p->pEList;
- for(i=0; pEList && i<pEList->nExpr && i<32; i++){
- if( !(mask&((u32)1<<i)) ){
- sqlite3ExprDelete(pEList->a[i].pExpr);
- pEList->a[i].pExpr = sqlite3Expr(pParse->db, TK_NULL, 0, 0, 0);
- }
- }
- }
-}
-#endif
-
/*
-** Generate code for the given SELECT statement.
+** Generate code for the SELECT statement given in the p argument.
**
** The results are distributed in various ways depending on the
** contents of the SelectDest structure pointed to by argument pDest
@@ -66449,34 +82038,43 @@ SQLITE_PRIVATE void sqlite3SelectMask(Parse *pParse, Select *p, u32 mask){
**
** pDest->eDest Result
** ------------ -------------------------------------------
-** SRT_Callback Invoke the callback for each row of the result.
+** SRT_Output Generate a row of output (using the OP_ResultRow
+** opcode) for each row in the result set.
**
-** SRT_Mem Store first result in memory cell pDest->iParm
+** SRT_Mem Only valid if the result is a single column.
+** Store the first column of the first result row
+** in register pDest->iParm then abandon the rest
+** of the query. This destination implies "LIMIT 1".
**
-** SRT_Set Store non-null results as keys of table pDest->iParm.
-** Apply the affinity pDest->affinity before storing them.
+** SRT_Set The result must be a single column. Store each
+** row of result as the key in table pDest->iParm.
+** Apply the affinity pDest->affinity before storing
+** results. Used to implement "IN (SELECT ...)".
**
** SRT_Union Store results as a key in a temporary table pDest->iParm.
**
** SRT_Except Remove results from the temporary table pDest->iParm.
**
-** SRT_Table Store results in temporary table pDest->iParm
+** SRT_Table Store results in temporary table pDest->iParm.
+** This is like SRT_EphemTab except that the table
+** is assumed to already be open.
**
** SRT_EphemTab Create an temporary table pDest->iParm and store
** the result there. The cursor is left open after
-** returning.
+** returning. This is like SRT_Table except that
+** this destination uses OP_OpenEphemeral to create
+** the table first.
**
-** SRT_Subroutine For each row returned, push the results onto the
-** vdbe stack and call the subroutine (via OP_Gosub)
-** at address pDest->iParm.
+** SRT_Coroutine Generate a co-routine that returns a new row of
+** results each time it is invoked. The entry point
+** of the co-routine is stored in register pDest->iParm.
**
** SRT_Exists Store a 1 in memory cell pDest->iParm if the result
** set is not empty.
**
-** SRT_Discard Throw the results away.
-**
-** See the selectInnerLoop() function for a canonical listing of the
-** allowed values of eDest and their meanings.
+** SRT_Discard Throw the results away. This is used by SELECT
+** statements within triggers whose only purpose is
+** the side-effects of functions.
**
** This routine returns the number of errors. If any errors are
** encountered, then an appropriate error message is left in
@@ -66484,36 +82082,11 @@ SQLITE_PRIVATE void sqlite3SelectMask(Parse *pParse, Select *p, u32 mask){
**
** This routine does NOT free the Select structure passed in. The
** calling function needs to do that.
-**
-** The pParent, parentTab, and *pParentAgg fields are filled in if this
-** SELECT is a subquery. This routine may try to combine this SELECT
-** with its parent to form a single flat query. In so doing, it might
-** change the parent query from a non-aggregate to an aggregate query.
-** For that reason, the pParentAgg flag is passed as a pointer, so it
-** can be changed.
-**
-** Example 1: The meaning of the pParent parameter.
-**
-** SELECT * FROM t1 JOIN (SELECT x, count(*) FROM t2) JOIN t3;
-** \ \_______ subquery _______/ /
-** \ /
-** \____________________ outer query ___________________/
-**
-** This routine is called for the outer query first. For that call,
-** pParent will be NULL. During the processing of the outer query, this
-** routine is called recursively to handle the subquery. For the recursive
-** call, pParent will point to the outer query. Because the subquery is
-** the second element in a three-way join, the parentTab parameter will
-** be 1 (the 2nd value of a 0-indexed array.)
*/
SQLITE_PRIVATE int sqlite3Select(
Parse *pParse, /* The parser context */
Select *p, /* The SELECT statement being coded. */
- SelectDest *pDest, /* What to do with the query results */
- Select *pParent, /* Another SELECT for which this is a sub-query */
- int parentTab, /* Index in pParent->pSrc of this query */
- int *pParentAgg, /* True if pParent uses aggregate functions */
- char *aff /* If eDest is SRT_Union, the affinity string */
+ SelectDest *pDest /* What to do with the query results */
){
int i, j; /* Loop counters */
WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */
@@ -66540,76 +82113,24 @@ SQLITE_PRIVATE int sqlite3Select(
if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
memset(&sAggInfo, 0, sizeof(sAggInfo));
- pOrderBy = p->pOrderBy;
if( IgnorableOrderby(pDest) ){
- p->pOrderBy = 0;
-
- /* In these cases the DISTINCT operator makes no difference to the
- ** results, so remove it if it were specified.
- */
assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard);
- p->isDistinct = 0;
- }
- if( sqlite3SelectResolve(pParse, p, 0) ){
- goto select_end;
- }
- p->pOrderBy = pOrderBy;
-
-#ifndef SQLITE_OMIT_COMPOUND_SELECT
- /* If there is are a sequence of queries, do the earlier ones first.
- */
- if( p->pPrior ){
- if( p->pRightmost==0 ){
- Select *pLoop, *pRight = 0;
- int cnt = 0;
- int mxSelect;
- for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){
- pLoop->pRightmost = p;
- pLoop->pNext = pRight;
- pRight = pLoop;
- }
- mxSelect = db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT];
- if( mxSelect && cnt>mxSelect ){
- sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
- return 1;
- }
- }
- return multiSelect(pParse, p, pDest, aff);
+ /* If ORDER BY makes no difference in the output then neither does
+ ** DISTINCT so it can be removed too. */
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ p->pOrderBy = 0;
+ p->selFlags &= ~SF_Distinct;
}
-#endif
-
- /* Make local copies of the parameters for this query.
- */
+ sqlite3SelectPrep(pParse, p, 0);
+ pOrderBy = p->pOrderBy;
pTabList = p->pSrc;
- pWhere = p->pWhere;
- pGroupBy = p->pGroupBy;
- pHaving = p->pHaving;
- isAgg = p->isAgg;
- isDistinct = p->isDistinct;
pEList = p->pEList;
- if( pEList==0 ) goto select_end;
-
- /*
- ** Do not even attempt to generate any code if we have already seen
- ** errors before this routine starts.
- */
- if( pParse->nErr>0 ) goto select_end;
-
- /* If writing to memory or generating a set
- ** only a single column may be output.
- */
-#ifndef SQLITE_OMIT_SUBQUERY
- if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){
+ if( pParse->nErr || db->mallocFailed ){
goto select_end;
}
-#endif
-
- /* ORDER BY is ignored for some destinations.
- */
- if( IgnorableOrderby(pDest) ){
- pOrderBy = 0;
- }
+ isAgg = (p->selFlags & SF_Aggregate)!=0;
+ assert( pEList!=0 );
/* Begin generating code.
*/
@@ -66619,20 +82140,14 @@ SQLITE_PRIVATE int sqlite3Select(
/* Generate code for all sub-queries in the FROM clause
*/
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
- for(i=0; i<pTabList->nSrc; i++){
- const char *zSavedAuthContext = 0;
- int needRestoreContext;
+ for(i=0; !p->pPrior && i<pTabList->nSrc; i++){
struct SrcList_item *pItem = &pTabList->a[i];
SelectDest dest;
+ Select *pSub = pItem->pSelect;
+ int isAggSub;
+
+ if( pSub==0 || pItem->isPopulated ) continue;
- if( pItem->pSelect==0 || pItem->isPopulated ) continue;
- if( pItem->zName!=0 ){
- zSavedAuthContext = pParse->zAuthContext;
- pParse->zAuthContext = pItem->zName;
- needRestoreContext = 1;
- }else{
- needRestoreContext = 0;
- }
/* Increment Parse.nHeight by the height of the largest expression
** tree refered to by this, the parent select. The child select
** may contain expression trees of at most
@@ -66641,44 +82156,77 @@ SQLITE_PRIVATE int sqlite3Select(
** an exact limit.
*/
pParse->nHeight += sqlite3SelectExprHeight(p);
- sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
- sqlite3Select(pParse, pItem->pSelect, &dest, p, i, &isAgg, 0);
- if( db->mallocFailed ){
+
+ /* Check to see if the subquery can be absorbed into the parent. */
+ isAggSub = (pSub->selFlags & SF_Aggregate)!=0;
+ if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){
+ if( isAggSub ){
+ isAgg = 1;
+ p->selFlags |= SF_Aggregate;
+ }
+ i = -1;
+ }else{
+ sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
+ assert( pItem->isPopulated==0 );
+ sqlite3Select(pParse, pSub, &dest);
+ pItem->isPopulated = 1;
+ }
+ if( /*pParse->nErr ||*/ db->mallocFailed ){
goto select_end;
}
pParse->nHeight -= sqlite3SelectExprHeight(p);
- if( needRestoreContext ){
- pParse->zAuthContext = zSavedAuthContext;
- }
pTabList = p->pSrc;
- pWhere = p->pWhere;
if( !IgnorableOrderby(pDest) ){
pOrderBy = p->pOrderBy;
}
- pGroupBy = p->pGroupBy;
- pHaving = p->pHaving;
- isDistinct = p->isDistinct;
}
+ pEList = p->pEList;
#endif
+ pWhere = p->pWhere;
+ pGroupBy = p->pGroupBy;
+ pHaving = p->pHaving;
+ isDistinct = (p->selFlags & SF_Distinct)!=0;
- /* Check to see if this is a subquery that can be "flattened" into its parent.
- ** If flattening is a possiblity, do so and return immediately.
+#ifndef SQLITE_OMIT_COMPOUND_SELECT
+ /* If there is are a sequence of queries, do the earlier ones first.
*/
-#ifndef SQLITE_OMIT_VIEW
- if( pParent && pParentAgg &&
- flattenSubquery(db, pParent, parentTab, *pParentAgg, isAgg) ){
- if( isAgg ) *pParentAgg = 1;
+ if( p->pPrior ){
+ if( p->pRightmost==0 ){
+ Select *pLoop, *pRight = 0;
+ int cnt = 0;
+ int mxSelect;
+ for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){
+ pLoop->pRightmost = p;
+ pLoop->pNext = pRight;
+ pRight = pLoop;
+ }
+ mxSelect = db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT];
+ if( mxSelect && cnt>mxSelect ){
+ sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
+ return 1;
+ }
+ }
+ return multiSelect(pParse, p, pDest);
+ }
+#endif
+
+ /* If writing to memory or generating a set
+ ** only a single column may be output.
+ */
+#ifndef SQLITE_OMIT_SUBQUERY
+ if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){
goto select_end;
}
#endif
/* If possible, rewrite the query to use GROUP BY instead of DISTINCT.
- ** GROUP BY may use an index, DISTINCT never does.
+ ** GROUP BY might use an index, DISTINCT never does.
*/
- if( p->isDistinct && !p->isAgg && !p->pGroupBy ){
- p->pGroupBy = sqlite3ExprListDup(db, p->pEList);
+ assert( p->pGroupBy==0 || (p->selFlags & SF_Aggregate)!=0 );
+ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ){
+ p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0);
pGroupBy = p->pGroupBy;
- p->isDistinct = 0;
+ p->selFlags &= ~SF_Distinct;
isDistinct = 0;
}
@@ -66746,7 +82294,7 @@ SQLITE_PRIVATE int sqlite3Select(
*/
assert(!isDistinct);
selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, -1, pDest,
- pWInfo->iContinue, pWInfo->iBreak, aff);
+ pWInfo->iContinue, pWInfo->iBreak);
/* End the database scan loop.
*/
@@ -66761,20 +82309,25 @@ SQLITE_PRIVATE int sqlite3Select(
** processed */
int iAbortFlag; /* Mem address which causes query abort if positive */
int groupBySort; /* Rows come from source in GROUP BY order */
+ int addrEnd; /* End of processing for this SELECT */
+ /* Remove any and all aliases between the result set and the
+ ** GROUP BY clause.
+ */
+ if( pGroupBy ){
+ int k; /* Loop counter */
+ struct ExprList_item *pItem; /* For looping over expression in a list */
- /* The following variables hold addresses or labels for parts of the
- ** virtual machine program we are putting together */
- int addrOutputRow; /* Start of subroutine that outputs a result row */
- int addrSetAbort; /* Set the abort flag and return */
- int addrInitializeLoop; /* Start of code that initializes the input loop */
- int addrTopOfLoop; /* Top of the input loop */
- int addrGroupByChange; /* Code that runs when any GROUP BY term changes */
- int addrProcessRow; /* Code to process a single input row */
- int addrEnd; /* End of all processing */
- int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */
- int addrReset; /* Subroutine for resetting the accumulator */
+ for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){
+ pItem->iAlias = 0;
+ }
+ for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){
+ pItem->iAlias = 0;
+ }
+ }
+
+ /* Create a label to jump to when we want to abort the query */
addrEnd = sqlite3VdbeMakeLabel(v);
/* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in
@@ -66794,7 +82347,8 @@ SQLITE_PRIVATE int sqlite3Select(
}
sAggInfo.nAccumulator = sAggInfo.nColumn;
for(i=0; i<sAggInfo.nFunc; i++){
- sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->pList);
+ assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
+ sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
}
if( db->mallocFailed ) goto select_end;
@@ -66803,13 +82357,14 @@ SQLITE_PRIVATE int sqlite3Select(
*/
if( pGroupBy ){
KeyInfo *pKeyInfo; /* Keying information for the group by clause */
-
- /* Create labels that we will be needing
- */
-
- addrInitializeLoop = sqlite3VdbeMakeLabel(v);
- addrGroupByChange = sqlite3VdbeMakeLabel(v);
- addrProcessRow = sqlite3VdbeMakeLabel(v);
+ int j1; /* A-vs-B comparision jump */
+ int addrOutputRow; /* Start of subroutine that outputs a result row */
+ int regOutputRow; /* Return address register for output subroutine */
+ int addrSetAbort; /* Set the abort flag and return */
+ int addrTopOfLoop; /* Top of the input loop */
+ int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */
+ int addrReset; /* Subroutine for resetting the accumulator */
+ int regReset; /* Return address register for reset subroutine */
/* If there is a GROUP BY clause we might need a sorting index to
** implement it. Allocate that sorting index now. If it turns out
@@ -66826,6 +82381,10 @@ SQLITE_PRIVATE int sqlite3Select(
*/
iUseFlag = ++pParse->nMem;
iAbortFlag = ++pParse->nMem;
+ regOutputRow = ++pParse->nMem;
+ addrOutputRow = sqlite3VdbeMakeLabel(v);
+ regReset = ++pParse->nMem;
+ addrReset = sqlite3VdbeMakeLabel(v);
iAMem = pParse->nMem + 1;
pParse->nMem += pGroupBy->nExpr;
iBMem = pParse->nMem + 1;
@@ -66834,46 +82393,13 @@ SQLITE_PRIVATE int sqlite3Select(
VdbeComment((v, "clear abort flag"));
sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
VdbeComment((v, "indicate accumulator empty"));
- sqlite3VdbeAddOp2(v, OP_Goto, 0, addrInitializeLoop);
-
- /* Generate a subroutine that outputs a single row of the result
- ** set. This subroutine first looks at the iUseFlag. If iUseFlag
- ** is less than or equal to zero, the subroutine is a no-op. If
- ** the processing calls for the query to abort, this subroutine
- ** increments the iAbortFlag memory location before returning in
- ** order to signal the caller to abort.
- */
- addrSetAbort = sqlite3VdbeCurrentAddr(v);
- sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag);
- VdbeComment((v, "set abort flag"));
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
- addrOutputRow = sqlite3VdbeCurrentAddr(v);
- sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2);
- VdbeComment((v, "Groupby result generator entry point"));
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
- finalizeAggFunctions(pParse, &sAggInfo);
- if( pHaving ){
- sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL);
- }
- selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy,
- distinct, pDest,
- addrOutputRow+1, addrSetAbort, aff);
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
- VdbeComment((v, "end groupby result generator"));
-
- /* Generate a subroutine that will reset the group-by accumulator
- */
- addrReset = sqlite3VdbeCurrentAddr(v);
- resetAccumulator(pParse, &sAggInfo);
- sqlite3VdbeAddOp2(v, OP_Return, 0, 0);
/* Begin a loop that will extract all source rows in GROUP BY order.
** This might involve two separate loops with an OP_Sort in between, or
** it might be a single loop that uses an index to extract information
** in the right order to begin with.
*/
- sqlite3VdbeResolveLabel(v, addrInitializeLoop);
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, addrReset);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy, 0);
if( pWInfo==0 ) goto select_end;
if( pGroupBy==0 ){
@@ -66905,6 +82431,7 @@ SQLITE_PRIVATE int sqlite3Select(
}
}
regBase = sqlite3GetTempRange(pParse, nCol);
+ sqlite3ExprCacheClear(pParse);
sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0);
sqlite3VdbeAddOp2(v, OP_Sequence, sAggInfo.sortingIdx,regBase+nGroupBy);
j = nGroupBy+1;
@@ -66912,7 +82439,9 @@ SQLITE_PRIVATE int sqlite3Select(
struct AggInfo_col *pCol = &sAggInfo.aCol[i];
if( pCol->iSorterColumn>=j ){
int r1 = j + regBase;
- int r2 = sqlite3ExprCodeGetColumn(pParse,
+ int r2;
+
+ r2 = sqlite3ExprCodeGetColumn(pParse,
pCol->pTab, pCol->iColumn, pCol->iTable, r1, 0);
if( r1!=r2 ){
sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1);
@@ -66929,6 +82458,7 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3VdbeAddOp2(v, OP_Sort, sAggInfo.sortingIdx, addrEnd);
VdbeComment((v, "GROUP BY sort"));
sAggInfo.useSortingIdx = 1;
+ sqlite3ExprCacheClear(pParse);
}
/* Evaluate the current GROUP BY terms and store in b0, b1, b2...
@@ -66937,6 +82467,7 @@ SQLITE_PRIVATE int sqlite3Select(
** from the previous row currently stored in a0, a1, a2...
*/
addrTopOfLoop = sqlite3VdbeCurrentAddr(v);
+ sqlite3ExprCacheClear(pParse);
for(j=0; j<pGroupBy->nExpr; j++){
if( groupBySort ){
sqlite3VdbeAddOp3(v, OP_Column, sAggInfo.sortingIdx, j, iBMem+j);
@@ -66945,18 +82476,13 @@ SQLITE_PRIVATE int sqlite3Select(
sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j);
}
}
- for(j=pGroupBy->nExpr-1; j>=0; j--){
- if( j==0 ){
- sqlite3VdbeAddOp3(v, OP_Eq, iAMem+j, addrProcessRow, iBMem+j);
- }else{
- sqlite3VdbeAddOp3(v, OP_Ne, iAMem+j, addrGroupByChange, iBMem+j);
- }
- sqlite3VdbeChangeP4(v, -1, (void*)pKeyInfo->aColl[j], P4_COLLSEQ);
- sqlite3VdbeChangeP5(v, SQLITE_NULLEQUAL);
- }
+ sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr,
+ (char*)pKeyInfo, P4_KEYINFO);
+ j1 = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1);
/* Generate code that runs whenever the GROUP BY changes.
- ** Change in the GROUP BY are detected by the previous code
+ ** Changes in the GROUP BY are detected by the previous code
** block. If there were no changes, this block is skipped.
**
** This code copies current group by terms in b0,b1,b2,...
@@ -66964,21 +82490,18 @@ SQLITE_PRIVATE int sqlite3Select(
** and resets the aggregate accumulator registers in preparation
** for the next GROUP BY batch.
*/
- sqlite3VdbeResolveLabel(v, addrGroupByChange);
- for(j=0; j<pGroupBy->nExpr; j++){
- sqlite3ExprCodeMove(pParse, iBMem+j, iAMem+j);
- }
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, addrOutputRow);
+ sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);
VdbeComment((v, "output one row"));
sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd);
VdbeComment((v, "check abort flag"));
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, addrReset);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
VdbeComment((v, "reset accumulator"));
/* Update the aggregate accumulators based on the content of
** the current row
*/
- sqlite3VdbeResolveLabel(v, addrProcessRow);
+ sqlite3VdbeJumpHere(v, j1);
updateAccumulator(pParse, &sAggInfo);
sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag);
VdbeComment((v, "indicate data in accumulator"));
@@ -66994,74 +82517,165 @@ SQLITE_PRIVATE int sqlite3Select(
/* Output the final row of result
*/
- sqlite3VdbeAddOp2(v, OP_Gosub, 0, addrOutputRow);
+ sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);
VdbeComment((v, "output final row"));
-
- } /* endif pGroupBy */
- else {
- ExprList *pMinMax = 0;
- ExprList *pDel = 0;
- u8 flag;
- /* Check if the query is of one of the following forms:
- **
- ** SELECT min(x) FROM ...
- ** SELECT max(x) FROM ...
- **
- ** If it is, then ask the code in where.c to attempt to sort results
- ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause.
- ** If where.c is able to produce results sorted in this order, then
- ** add vdbe code to break out of the processing loop after the
- ** first iteration (since the first iteration of the loop is
- ** guaranteed to operate on the row with the minimum or maximum
- ** value of x, the only row required).
- **
- ** A special flag must be passed to sqlite3WhereBegin() to slightly
- ** modify behaviour as follows:
- **
- ** + If the query is a "SELECT min(x)", then the loop coded by
- ** where.c should not iterate over any values with a NULL value
- ** for x.
- **
- ** + The optimizer code in where.c (the thing that decides which
- ** index or indices to use) should place a different priority on
- ** satisfying the 'ORDER BY' clause than it does in other cases.
- ** Refer to code and comments in where.c for details.
+ /* Jump over the subroutines
*/
- flag = minMaxQuery(pParse, p);
- if( flag ){
- pDel = pMinMax = sqlite3ExprListDup(db, p->pEList->a[0].pExpr->pList);
- if( pMinMax && !db->mallocFailed ){
- pMinMax->a[0].sortOrder = ((flag==WHERE_ORDERBY_MIN)?0:1);
- pMinMax->a[0].pExpr->op = TK_COLUMN;
- }
- }
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEnd);
- /* This case runs if the aggregate has no GROUP BY clause. The
- ** processing is much simpler since there is only a single row
- ** of output.
+ /* Generate a subroutine that outputs a single row of the result
+ ** set. This subroutine first looks at the iUseFlag. If iUseFlag
+ ** is less than or equal to zero, the subroutine is a no-op. If
+ ** the processing calls for the query to abort, this subroutine
+ ** increments the iAbortFlag memory location before returning in
+ ** order to signal the caller to abort.
*/
+ addrSetAbort = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag);
+ VdbeComment((v, "set abort flag"));
+ sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
+ sqlite3VdbeResolveLabel(v, addrOutputRow);
+ addrOutputRow = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2);
+ VdbeComment((v, "Groupby result generator entry point"));
+ sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
+ finalizeAggFunctions(pParse, &sAggInfo);
+ sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL);
+ selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy,
+ distinct, pDest,
+ addrOutputRow+1, addrSetAbort);
+ sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
+ VdbeComment((v, "end groupby result generator"));
+
+ /* Generate a subroutine that will reset the group-by accumulator
+ */
+ sqlite3VdbeResolveLabel(v, addrReset);
resetAccumulator(pParse, &sAggInfo);
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pMinMax, flag);
- if( pWInfo==0 ){
- sqlite3ExprListDelete(pDel);
- goto select_end;
- }
- updateAccumulator(pParse, &sAggInfo);
- if( !pMinMax && flag ){
- sqlite3VdbeAddOp2(v, OP_Goto, 0, pWInfo->iBreak);
- VdbeComment((v, "%s() by index", (flag==WHERE_ORDERBY_MIN?"min":"max")));
+ sqlite3VdbeAddOp1(v, OP_Return, regReset);
+
+ } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
+ else {
+ ExprList *pDel = 0;
+#ifndef SQLITE_OMIT_BTREECOUNT
+ Table *pTab;
+ if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){
+ /* If isSimpleCount() returns a pointer to a Table structure, then
+ ** the SQL statement is of the form:
+ **
+ ** SELECT count(*) FROM <tbl>
+ **
+ ** where the Table structure returned represents table <tbl>.
+ **
+ ** This statement is so common that it is optimized specially. The
+ ** OP_Count instruction is executed either on the intkey table that
+ ** contains the data for table <tbl> or on one of its indexes. It
+ ** is better to execute the op on an index, as indexes are almost
+ ** always spread across less pages than their corresponding tables.
+ */
+ const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
+ const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */
+ Index *pIdx; /* Iterator variable */
+ KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */
+ Index *pBest = 0; /* Best index found so far */
+ int iRoot = pTab->tnum; /* Root page of scanned b-tree */
+
+ sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
+
+ /* Search for the index that has the least amount of columns. If
+ ** there is such an index, and it has less columns than the table
+ ** does, then we can assume that it consumes less space on disk and
+ ** will therefore be cheaper to scan to determine the query result.
+ ** In this case set iRoot to the root page number of the index b-tree
+ ** and pKeyInfo to the KeyInfo structure required to navigate the
+ ** index.
+ **
+ ** In practice the KeyInfo structure will not be used. It is only
+ ** passed to keep OP_OpenRead happy.
+ */
+ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
+ if( !pBest || pIdx->nColumn<pBest->nColumn ){
+ pBest = pIdx;
+ }
+ }
+ if( pBest && pBest->nColumn<pTab->nCol ){
+ iRoot = pBest->tnum;
+ pKeyInfo = sqlite3IndexKeyinfo(pParse, pBest);
+ }
+
+ /* Open a read-only cursor, execute the OP_Count, close the cursor. */
+ sqlite3VdbeAddOp3(v, OP_OpenRead, iCsr, iRoot, iDb);
+ if( pKeyInfo ){
+ sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO_HANDOFF);
+ }
+ sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem);
+ sqlite3VdbeAddOp1(v, OP_Close, iCsr);
+ }else
+#endif /* SQLITE_OMIT_BTREECOUNT */
+ {
+ /* Check if the query is of one of the following forms:
+ **
+ ** SELECT min(x) FROM ...
+ ** SELECT max(x) FROM ...
+ **
+ ** If it is, then ask the code in where.c to attempt to sort results
+ ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause.
+ ** If where.c is able to produce results sorted in this order, then
+ ** add vdbe code to break out of the processing loop after the
+ ** first iteration (since the first iteration of the loop is
+ ** guaranteed to operate on the row with the minimum or maximum
+ ** value of x, the only row required).
+ **
+ ** A special flag must be passed to sqlite3WhereBegin() to slightly
+ ** modify behaviour as follows:
+ **
+ ** + If the query is a "SELECT min(x)", then the loop coded by
+ ** where.c should not iterate over any values with a NULL value
+ ** for x.
+ **
+ ** + The optimizer code in where.c (the thing that decides which
+ ** index or indices to use) should place a different priority on
+ ** satisfying the 'ORDER BY' clause than it does in other cases.
+ ** Refer to code and comments in where.c for details.
+ */
+ ExprList *pMinMax = 0;
+ u8 flag = minMaxQuery(p);
+ if( flag ){
+ assert( !ExprHasProperty(p->pEList->a[0].pExpr, EP_xIsSelect) );
+ pMinMax = sqlite3ExprListDup(db, p->pEList->a[0].pExpr->x.pList,0);
+ pDel = pMinMax;
+ if( pMinMax && !db->mallocFailed ){
+ pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0;
+ pMinMax->a[0].pExpr->op = TK_COLUMN;
+ }
+ }
+
+ /* This case runs if the aggregate has no GROUP BY clause. The
+ ** processing is much simpler since there is only a single row
+ ** of output.
+ */
+ resetAccumulator(pParse, &sAggInfo);
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pMinMax, flag);
+ if( pWInfo==0 ){
+ sqlite3ExprListDelete(db, pDel);
+ goto select_end;
+ }
+ updateAccumulator(pParse, &sAggInfo);
+ if( !pMinMax && flag ){
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pWInfo->iBreak);
+ VdbeComment((v, "%s() by index",
+ (flag==WHERE_ORDERBY_MIN?"min":"max")));
+ }
+ sqlite3WhereEnd(pWInfo);
+ finalizeAggFunctions(pParse, &sAggInfo);
}
- sqlite3WhereEnd(pWInfo);
- finalizeAggFunctions(pParse, &sAggInfo);
+
pOrderBy = 0;
- if( pHaving ){
- sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);
- }
+ sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);
selectInnerLoop(pParse, p, p->pEList, 0, 0, 0, -1,
- pDest, addrEnd, addrEnd, aff);
-
- sqlite3ExprListDelete(pDel);
+ pDest, addrEnd, addrEnd);
+ sqlite3ExprListDelete(db, pDel);
}
sqlite3VdbeResolveLabel(v, addrEnd);
@@ -67074,19 +82688,6 @@ SQLITE_PRIVATE int sqlite3Select(
generateSortTail(pParse, p, v, pEList->nExpr, pDest);
}
-#ifndef SQLITE_OMIT_SUBQUERY
- /* If this was a subquery, we have now converted the subquery into a
- ** temporary table. So set the SrcList_item.isPopulated flag to prevent
- ** this subquery from being evaluated again and to force the use of
- ** the temporary table.
- */
- if( pParent ){
- assert( pParent->pSrc->nSrc>parentTab );
- assert( pParent->pSrc->a[parentTab].pSelect==p );
- pParent->pSrc->a[parentTab].isPopulated = 1;
- }
-#endif
-
/* Jump here to skip this query
*/
sqlite3VdbeResolveLabel(v, iEnd);
@@ -67101,15 +82702,14 @@ SQLITE_PRIVATE int sqlite3Select(
*/
select_end:
- /* Identify column names if we will be using them in a callback. This
- ** step is skipped if the output is going to some other destination.
+ /* Identify column names if results of the SELECT are to be output.
*/
- if( rc==SQLITE_OK && pDest->eDest==SRT_Callback ){
+ if( rc==SQLITE_OK && pDest->eDest==SRT_Output ){
generateColumnNames(pParse, pTabList, pEList);
}
- sqlite3_free(sAggInfo.aCol);
- sqlite3_free(sAggInfo.aFunc);
+ sqlite3DbFree(db, sAggInfo.aCol);
+ sqlite3DbFree(db, sAggInfo.aFunc);
return rc;
}
@@ -67129,8 +82729,8 @@ select_end:
** or from temporary "printf" statements inserted for debugging.
*/
SQLITE_PRIVATE void sqlite3PrintExpr(Expr *p){
- if( p->token.z && p->token.n>0 ){
- sqlite3DebugPrintf("(%.*s", p->token.n, p->token.z);
+ if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
+ sqlite3DebugPrintf("(%s", p->u.zToken);
}else{
sqlite3DebugPrintf("(%d", p->op);
}
@@ -67228,6 +82828,8 @@ SQLITE_PRIVATE void sqlite3PrintSelect(Select *p, int indent){
**
** These routines are in a separate files so that they will not be linked
** if they are not used.
+**
+** $Id: table.c,v 1.40 2009/04/10 14:28:00 drh Exp $
*/
#ifndef SQLITE_OMIT_GET_TABLE
@@ -67237,14 +82839,13 @@ SQLITE_PRIVATE void sqlite3PrintSelect(Select *p, int indent){
** to the callback function is uses to build the result.
*/
typedef struct TabResult {
- char **azResult;
- char *zErrMsg;
- int nResult;
- int nAlloc;
- int nRow;
- int nColumn;
- int nData;
- int rc;
+ char **azResult; /* Accumulated output */
+ char *zErrMsg; /* Error message text, if an error occurs */
+ int nAlloc; /* Slots allocated for azResult[] */
+ int nRow; /* Number of rows in the result */
+ int nColumn; /* Number of columns in the result */
+ int nData; /* Slots used in azResult[]. (nRow+1)*nColumn */
+ int rc; /* Return code from sqlite3_exec() */
} TabResult;
/*
@@ -67253,10 +82854,10 @@ typedef struct TabResult {
** memory as necessary.
*/
static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){
- TabResult *p = (TabResult*)pArg;
- int need;
- int i;
- char *z;
+ TabResult *p = (TabResult*)pArg; /* Result accumulator */
+ int need; /* Slots needed in p->azResult[] */
+ int i; /* Loop counter */
+ char *z; /* A single column of result */
/* Make sure there is enough space in p->azResult to hold everything
** we need to remember from this invocation of the callback.
@@ -67266,9 +82867,9 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){
}else{
need = nCol;
}
- if( p->nData + need >= p->nAlloc ){
+ if( p->nData + need > p->nAlloc ){
char **azNew;
- p->nAlloc = p->nAlloc*2 + need + 1;
+ p->nAlloc = p->nAlloc*2 + need;
azNew = sqlite3_realloc( p->azResult, sizeof(char*)*p->nAlloc );
if( azNew==0 ) goto malloc_failed;
p->azResult = azNew;
@@ -67300,7 +82901,7 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){
if( argv[i]==0 ){
z = 0;
}else{
- int n = strlen(argv[i])+1;
+ int n = sqlite3Strlen30(argv[i])+1;
z = sqlite3_malloc( n );
if( z==0 ) goto malloc_failed;
memcpy(z, argv[i], n);
@@ -67340,8 +82941,8 @@ SQLITE_API int sqlite3_get_table(
*pazResult = 0;
if( pnColumn ) *pnColumn = 0;
if( pnRow ) *pnRow = 0;
+ if( pzErrMsg ) *pzErrMsg = 0;
res.zErrMsg = 0;
- res.nResult = 0;
res.nRow = 0;
res.nColumn = 0;
res.nData = 1;
@@ -67355,7 +82956,7 @@ SQLITE_API int sqlite3_get_table(
res.azResult[0] = 0;
rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg);
assert( sizeof(res.azResult[0])>= sizeof(res.nData) );
- res.azResult[0] = (char*)res.nData;
+ res.azResult[0] = SQLITE_INT_TO_PTR(res.nData);
if( (rc&0xff)==SQLITE_ABORT ){
sqlite3_free_table(&res.azResult[1]);
if( res.zErrMsg ){
@@ -67375,13 +82976,12 @@ SQLITE_API int sqlite3_get_table(
}
if( res.nAlloc>res.nData ){
char **azNew;
- azNew = sqlite3_realloc( res.azResult, sizeof(char*)*(res.nData+1) );
+ azNew = sqlite3_realloc( res.azResult, sizeof(char*)*res.nData );
if( azNew==0 ){
sqlite3_free_table(&res.azResult[1]);
db->errCode = SQLITE_NOMEM;
return SQLITE_NOMEM;
}
- res.nAlloc = res.nData+1;
res.azResult = azNew;
}
*pazResult = &res.azResult[1];
@@ -67400,7 +83000,7 @@ SQLITE_API void sqlite3_free_table(
int i, n;
azResult--;
assert( azResult!=0 );
- n = (int)azResult[0];
+ n = SQLITE_PTR_TO_INT(azResult[0]);
for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); }
sqlite3_free(azResult);
}
@@ -67420,29 +83020,68 @@ SQLITE_API void sqlite3_free_table(
** May you share freely, never taking more than you give.
**
*************************************************************************
-*
+**
+**
+** $Id: trigger.c,v 1.143 2009/08/10 03:57:58 shane Exp $
*/
#ifndef SQLITE_OMIT_TRIGGER
/*
** Delete a linked list of TriggerStep structures.
*/
-SQLITE_PRIVATE void sqlite3DeleteTriggerStep(TriggerStep *pTriggerStep){
+SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerStep){
while( pTriggerStep ){
TriggerStep * pTmp = pTriggerStep;
pTriggerStep = pTriggerStep->pNext;
- if( pTmp->target.dyn ) sqlite3_free((char*)pTmp->target.z);
- sqlite3ExprDelete(pTmp->pWhere);
- sqlite3ExprListDelete(pTmp->pExprList);
- sqlite3SelectDelete(pTmp->pSelect);
- sqlite3IdListDelete(pTmp->pIdList);
+ sqlite3ExprDelete(db, pTmp->pWhere);
+ sqlite3ExprListDelete(db, pTmp->pExprList);
+ sqlite3SelectDelete(db, pTmp->pSelect);
+ sqlite3IdListDelete(db, pTmp->pIdList);
- sqlite3_free(pTmp);
+ sqlite3DbFree(db, pTmp);
}
}
/*
+** Given table pTab, return a list of all the triggers attached to
+** the table. The list is connected by Trigger.pNext pointers.
+**
+** All of the triggers on pTab that are in the same database as pTab
+** are already attached to pTab->pTrigger. But there might be additional
+** triggers on pTab in the TEMP schema. This routine prepends all
+** TEMP triggers on pTab to the beginning of the pTab->pTrigger list
+** and returns the combined list.
+**
+** To state it another way: This routine returns a list of all triggers
+** that fire off of pTab. The list will include any TEMP triggers on
+** pTab as well as the triggers lised in pTab->pTrigger.
+*/
+SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
+ Schema * const pTmpSchema = pParse->db->aDb[1].pSchema;
+ Trigger *pList = 0; /* List of triggers to return */
+
+ if( pParse->disableTriggers ){
+ return 0;
+ }
+
+ if( pTmpSchema!=pTab->pSchema ){
+ HashElem *p;
+ for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){
+ Trigger *pTrig = (Trigger *)sqliteHashData(p);
+ if( pTrig->pTabSchema==pTab->pSchema
+ && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
+ ){
+ pTrig->pNext = (pList ? pList : pTab->pTrigger);
+ pList = pTrig;
+ }
+ }
+ }
+
+ return (pList ? pList : pTab->pTrigger);
+}
+
+/*
** This is called by the parser when it sees a CREATE TRIGGER statement
** up to the point of the BEGIN before the trigger actions. A Trigger
** structure is generated based on the information available and stored
@@ -67462,17 +83101,19 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
int isTemp, /* True if the TEMPORARY keyword is present */
int noErr /* Suppress errors if the trigger already exists */
){
- Trigger *pTrigger = 0;
- Table *pTab;
+ Trigger *pTrigger = 0; /* The new trigger */
+ Table *pTab; /* Table that the trigger fires off of */
char *zName = 0; /* Name of the trigger */
- sqlite3 *db = pParse->db;
+ sqlite3 *db = pParse->db; /* The database connection */
int iDb; /* The database to store the trigger in */
Token *pName; /* The unqualified db name */
- DbFixer sFix;
- int iTabDb;
+ DbFixer sFix; /* State vector for the DB fixer */
+ int iTabDb; /* Index of the database holding pTab */
assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */
assert( pName2!=0 );
+ assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE );
+ assert( op>0 && op<0xff );
if( isTemp ){
/* If TEMP was specified, then the trigger name may not be qualified. */
if( pName2->n>0 ){
@@ -67512,6 +83153,17 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
pTab = sqlite3SrcListLookup(pParse, pTableName);
if( !pTab ){
/* The table does not exist. */
+ if( db->init.iDb==1 ){
+ /* Ticket #3810.
+ ** Normally, whenever a table is dropped, all associated triggers are
+ ** dropped too. But if a TEMP trigger is created on a non-TEMP table
+ ** and the table is dropped by a different database connection, the
+ ** trigger is not visible to the database connection that does the
+ ** drop so the trigger cannot be dropped. This results in an
+ ** "orphaned trigger" - a trigger whose associated table is missing.
+ */
+ db->init.orphanTrigger = 1;
+ }
goto trigger_cleanup;
}
if( IsVirtual(pTab) ){
@@ -67525,7 +83177,8 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
goto trigger_cleanup;
}
- if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash), zName,strlen(zName)) ){
+ if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),
+ zName, sqlite3Strlen30(zName)) ){
if( !noErr ){
sqlite3ErrorMsg(pParse, "trigger %T already exists", pName);
}
@@ -67581,26 +83234,25 @@ SQLITE_PRIVATE void sqlite3BeginTrigger(
/* Build the Trigger object */
pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger));
if( pTrigger==0 ) goto trigger_cleanup;
- pTrigger->name = zName;
+ pTrigger->zName = zName;
zName = 0;
pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName);
pTrigger->pSchema = db->aDb[iDb].pSchema;
pTrigger->pTabSchema = pTab->pSchema;
- pTrigger->op = op;
+ pTrigger->op = (u8)op;
pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
- pTrigger->pWhen = sqlite3ExprDup(db, pWhen);
+ pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
pTrigger->pColumns = sqlite3IdListDup(db, pColumns);
- sqlite3TokenCopy(db, &pTrigger->nameToken,pName);
assert( pParse->pNewTrigger==0 );
pParse->pNewTrigger = pTrigger;
trigger_cleanup:
- sqlite3_free(zName);
- sqlite3SrcListDelete(pTableName);
- sqlite3IdListDelete(pColumns);
- sqlite3ExprDelete(pWhen);
+ sqlite3DbFree(db, zName);
+ sqlite3SrcListDelete(db, pTableName);
+ sqlite3IdListDelete(db, pColumns);
+ sqlite3ExprDelete(db, pWhen);
if( !pParse->pNewTrigger ){
- sqlite3DeleteTrigger(pTrigger);
+ sqlite3DeleteTrigger(db, pTrigger);
}else{
assert( pParse->pNewTrigger==pTrigger );
}
@@ -67615,21 +83267,26 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
TriggerStep *pStepList, /* The triggered program */
Token *pAll /* Token that describes the complete CREATE TRIGGER */
){
- Trigger *pTrig = 0; /* The trigger whose construction is finishing up */
- sqlite3 *db = pParse->db; /* The database */
+ Trigger *pTrig = pParse->pNewTrigger; /* Trigger being finished */
+ char *zName; /* Name of trigger */
+ sqlite3 *db = pParse->db; /* The database */
DbFixer sFix;
- int iDb; /* Database containing the trigger */
+ int iDb; /* Database containing the trigger */
+ Token nameToken; /* Trigger name for error reporting */
pTrig = pParse->pNewTrigger;
pParse->pNewTrigger = 0;
- if( pParse->nErr || !pTrig ) goto triggerfinish_cleanup;
+ if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup;
+ zName = pTrig->zName;
iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
pTrig->step_list = pStepList;
while( pStepList ){
pStepList->pTrig = pTrig;
pStepList = pStepList->pNext;
}
- if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", &pTrig->nameToken)
+ nameToken.z = pTrig->zName;
+ nameToken.n = sqlite3Strlen30(nameToken.z);
+ if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken)
&& sqlite3FixTriggerStep(&sFix, pTrig->step_list) ){
goto triggerfinish_cleanup;
}
@@ -67648,75 +83305,35 @@ SQLITE_PRIVATE void sqlite3FinishTrigger(
z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);
sqlite3NestedParse(pParse,
"INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
- db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pTrig->name,
+ db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName,
pTrig->table, z);
- sqlite3_free(z);
+ sqlite3DbFree(db, z);
sqlite3ChangeCookie(pParse, iDb);
sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0, sqlite3MPrintf(
- db, "type='trigger' AND name='%q'", pTrig->name), P4_DYNAMIC
+ db, "type='trigger' AND name='%q'", zName), P4_DYNAMIC
);
}
if( db->init.busy ){
- int n;
- Table *pTab;
- Trigger *pDel;
- pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash,
- pTrig->name, strlen(pTrig->name), pTrig);
- if( pDel ){
- assert( pDel==pTrig );
+ Trigger *pLink = pTrig;
+ Hash *pHash = &db->aDb[iDb].pSchema->trigHash;
+ pTrig = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), pTrig);
+ if( pTrig ){
db->mallocFailed = 1;
- goto triggerfinish_cleanup;
+ }else if( pLink->pSchema==pLink->pTabSchema ){
+ Table *pTab;
+ int n = sqlite3Strlen30(pLink->table);
+ pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table, n);
+ assert( pTab!=0 );
+ pLink->pNext = pTab->pTrigger;
+ pTab->pTrigger = pLink;
}
- n = strlen(pTrig->table) + 1;
- pTab = sqlite3HashFind(&pTrig->pTabSchema->tblHash, pTrig->table, n);
- assert( pTab!=0 );
- pTrig->pNext = pTab->pTrigger;
- pTab->pTrigger = pTrig;
- pTrig = 0;
}
triggerfinish_cleanup:
- sqlite3DeleteTrigger(pTrig);
+ sqlite3DeleteTrigger(db, pTrig);
assert( !pParse->pNewTrigger );
- sqlite3DeleteTriggerStep(pStepList);
-}
-
-/*
-** Make a copy of all components of the given trigger step. This has
-** the effect of copying all Expr.token.z values into memory obtained
-** from sqlite3_malloc(). As initially created, the Expr.token.z values
-** all point to the input string that was fed to the parser. But that
-** string is ephemeral - it will go away as soon as the sqlite3_exec()
-** call that started the parser exits. This routine makes a persistent
-** copy of all the Expr.token.z strings so that the TriggerStep structure
-** will be valid even after the sqlite3_exec() call returns.
-*/
-static void sqlitePersistTriggerStep(sqlite3 *db, TriggerStep *p){
- if( p->target.z ){
- p->target.z = (u8*)sqlite3DbStrNDup(db, (char*)p->target.z, p->target.n);
- p->target.dyn = 1;
- }
- if( p->pSelect ){
- Select *pNew = sqlite3SelectDup(db, p->pSelect);
- sqlite3SelectDelete(p->pSelect);
- p->pSelect = pNew;
- }
- if( p->pWhere ){
- Expr *pNew = sqlite3ExprDup(db, p->pWhere);
- sqlite3ExprDelete(p->pWhere);
- p->pWhere = pNew;
- }
- if( p->pExprList ){
- ExprList *pNew = sqlite3ExprListDup(db, p->pExprList);
- sqlite3ExprListDelete(p->pExprList);
- p->pExprList = pNew;
- }
- if( p->pIdList ){
- IdList *pNew = sqlite3IdListDup(db, p->pIdList);
- sqlite3IdListDelete(p->pIdList);
- p->pIdList = pNew;
- }
+ sqlite3DeleteTriggerStep(db, pStepList);
}
/*
@@ -67729,15 +83346,36 @@ static void sqlitePersistTriggerStep(sqlite3 *db, TriggerStep *p){
SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
if( pTriggerStep==0 ) {
- sqlite3SelectDelete(pSelect);
+ sqlite3SelectDelete(db, pSelect);
return 0;
}
-
pTriggerStep->op = TK_SELECT;
pTriggerStep->pSelect = pSelect;
pTriggerStep->orconf = OE_Default;
- sqlitePersistTriggerStep(db, pTriggerStep);
+ return pTriggerStep;
+}
+
+/*
+** Allocate space to hold a new trigger step. The allocated space
+** holds both the TriggerStep object and the TriggerStep.target.z string.
+**
+** If an OOM error occurs, NULL is returned and db->mallocFailed is set.
+*/
+static TriggerStep *triggerStepAllocate(
+ sqlite3 *db, /* Database connection */
+ u8 op, /* Trigger opcode */
+ Token *pName /* The target name */
+){
+ TriggerStep *pTriggerStep;
+ pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n);
+ if( pTriggerStep ){
+ char *z = (char*)&pTriggerStep[1];
+ memcpy(z, pName->z, pName->n);
+ pTriggerStep->target.z = z;
+ pTriggerStep->target.n = pName->n;
+ pTriggerStep->op = op;
+ }
return pTriggerStep;
}
@@ -67754,27 +83392,24 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
IdList *pColumn, /* List of columns in pTableName to insert into */
ExprList *pEList, /* The VALUE clause: a list of values to be inserted */
Select *pSelect, /* A SELECT statement that supplies values */
- int orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
+ u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
){
TriggerStep *pTriggerStep;
assert(pEList == 0 || pSelect == 0);
assert(pEList != 0 || pSelect != 0 || db->mallocFailed);
- pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
+ pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName);
if( pTriggerStep ){
- pTriggerStep->op = TK_INSERT;
- pTriggerStep->pSelect = pSelect;
- pTriggerStep->target = *pTableName;
+ pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
pTriggerStep->pIdList = pColumn;
- pTriggerStep->pExprList = pEList;
+ pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
pTriggerStep->orconf = orconf;
- sqlitePersistTriggerStep(db, pTriggerStep);
}else{
- sqlite3IdListDelete(pColumn);
- sqlite3ExprListDelete(pEList);
- sqlite3SelectDelete(pSelect);
+ sqlite3IdListDelete(db, pColumn);
}
+ sqlite3ExprListDelete(db, pEList);
+ sqlite3SelectDelete(db, pSelect);
return pTriggerStep;
}
@@ -67789,22 +83424,18 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
Token *pTableName, /* Name of the table to be updated */
ExprList *pEList, /* The SET clause: list of column and new values */
Expr *pWhere, /* The WHERE clause */
- int orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
+ u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
){
- TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
- if( pTriggerStep==0 ){
- sqlite3ExprListDelete(pEList);
- sqlite3ExprDelete(pWhere);
- return 0;
- }
-
- pTriggerStep->op = TK_UPDATE;
- pTriggerStep->target = *pTableName;
- pTriggerStep->pExprList = pEList;
- pTriggerStep->pWhere = pWhere;
- pTriggerStep->orconf = orconf;
- sqlitePersistTriggerStep(db, pTriggerStep);
+ TriggerStep *pTriggerStep;
+ pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName);
+ if( pTriggerStep ){
+ pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
+ pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ pTriggerStep->orconf = orconf;
+ }
+ sqlite3ExprListDelete(db, pEList);
+ sqlite3ExprDelete(db, pWhere);
return pTriggerStep;
}
@@ -67818,33 +83449,28 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(
Token *pTableName, /* The table from which rows are deleted */
Expr *pWhere /* The WHERE clause */
){
- TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
- if( pTriggerStep==0 ){
- sqlite3ExprDelete(pWhere);
- return 0;
- }
-
- pTriggerStep->op = TK_DELETE;
- pTriggerStep->target = *pTableName;
- pTriggerStep->pWhere = pWhere;
- pTriggerStep->orconf = OE_Default;
- sqlitePersistTriggerStep(db, pTriggerStep);
+ TriggerStep *pTriggerStep;
+ pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName);
+ if( pTriggerStep ){
+ pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
+ pTriggerStep->orconf = OE_Default;
+ }
+ sqlite3ExprDelete(db, pWhere);
return pTriggerStep;
}
/*
** Recursively delete a Trigger structure
*/
-SQLITE_PRIVATE void sqlite3DeleteTrigger(Trigger *pTrigger){
+SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){
if( pTrigger==0 ) return;
- sqlite3DeleteTriggerStep(pTrigger->step_list);
- sqlite3_free(pTrigger->name);
- sqlite3_free(pTrigger->table);
- sqlite3ExprDelete(pTrigger->pWhen);
- sqlite3IdListDelete(pTrigger->pColumns);
- if( pTrigger->nameToken.dyn ) sqlite3_free((char*)pTrigger->nameToken.z);
- sqlite3_free(pTrigger);
+ sqlite3DeleteTriggerStep(db, pTrigger->step_list);
+ sqlite3DbFree(db, pTrigger->zName);
+ sqlite3DbFree(db, pTrigger->table);
+ sqlite3ExprDelete(db, pTrigger->pWhen);
+ sqlite3IdListDelete(db, pTrigger->pColumns);
+ sqlite3DbFree(db, pTrigger);
}
/*
@@ -67871,7 +83497,7 @@ SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr)
assert( pName->nSrc==1 );
zDb = pName->a[0].zDatabase;
zName = pName->a[0].zName;
- nName = strlen(zName);
+ nName = sqlite3Strlen30(zName);
for(i=OMIT_TEMPDB; i<db->nDb; i++){
int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue;
@@ -67887,7 +83513,7 @@ SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr)
sqlite3DropTriggerPtr(pParse, pTrigger);
drop_trigger_cleanup:
- sqlite3SrcListDelete(pName);
+ sqlite3SrcListDelete(db, pName);
}
/*
@@ -67895,7 +83521,7 @@ drop_trigger_cleanup:
** is set on.
*/
static Table *tableOfTrigger(Trigger *pTrigger){
- int n = strlen(pTrigger->table) + 1;
+ int n = sqlite3Strlen30(pTrigger->table);
return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table, n);
}
@@ -67920,7 +83546,7 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
const char *zDb = db->aDb[iDb].zName;
const char *zTab = SCHEMA_TABLE(iDb);
if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER;
- if( sqlite3AuthCheck(pParse, code, pTrigger->name, pTable->zName, zDb) ||
+ if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) ||
sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
return;
}
@@ -67947,11 +83573,14 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
sqlite3BeginWriteOperation(pParse, 0, iDb);
sqlite3OpenMasterTable(pParse, iDb);
base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger);
- sqlite3VdbeChangeP4(v, base+1, pTrigger->name, 0);
+ sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, 0);
sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC);
sqlite3ChangeCookie(pParse, iDb);
sqlite3VdbeAddOp2(v, OP_Close, 0, 0);
- sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->name, 0);
+ sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0);
+ if( pParse->nMem<3 ){
+ pParse->nMem = 3;
+ }
}
}
@@ -67959,27 +83588,17 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
** Remove a trigger from the hash tables of the sqlite* pointer.
*/
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){
+ Hash *pHash = &(db->aDb[iDb].pSchema->trigHash);
Trigger *pTrigger;
- int nName = strlen(zName);
- pTrigger = sqlite3HashInsert(&(db->aDb[iDb].pSchema->trigHash),
- zName, nName, 0);
- if( pTrigger ){
- Table *pTable = tableOfTrigger(pTrigger);
- assert( pTable!=0 );
- if( pTable->pTrigger == pTrigger ){
- pTable->pTrigger = pTrigger->pNext;
- }else{
- Trigger *cc = pTable->pTrigger;
- while( cc ){
- if( cc->pNext == pTrigger ){
- cc->pNext = cc->pNext->pNext;
- break;
- }
- cc = cc->pNext;
- }
- assert(cc);
- }
- sqlite3DeleteTrigger(pTrigger);
+ pTrigger = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), 0);
+ if( ALWAYS(pTrigger) ){
+ if( pTrigger->pSchema==pTrigger->pTabSchema ){
+ Table *pTab = tableOfTrigger(pTrigger);
+ Trigger **pp;
+ for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext));
+ *pp = (*pp)->pNext;
+ }
+ sqlite3DeleteTrigger(db, pTrigger);
db->flags |= SQLITE_InternChanges;
}
}
@@ -67993,9 +83612,9 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const ch
** it matches anything so always return true. Return false only
** if there is no match.
*/
-static int checkColumnOverLap(IdList *pIdList, ExprList *pEList){
+static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){
int e;
- if( !pIdList || !pEList ) return 1;
+ if( pIdList==0 || NEVER(pEList==0) ) return 1;
for(e=0; e<pEList->nExpr; e++){
if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1;
}
@@ -68003,31 +83622,31 @@ static int checkColumnOverLap(IdList *pIdList, ExprList *pEList){
}
/*
-** Return a bit vector to indicate what kind of triggers exist for operation
-** "op" on table pTab. If pChanges is not NULL then it is a list of columns
-** that are being updated. Triggers only match if the ON clause of the
-** trigger definition overlaps the set of columns being updated.
-**
-** The returned bit vector is some combination of TRIGGER_BEFORE and
-** TRIGGER_AFTER.
+** Return a list of all triggers on table pTab if there exists at least
+** one trigger that must be fired when an operation of type 'op' is
+** performed on the table, and, if that operation is an UPDATE, if at
+** least one of the columns in pChanges is being modified.
*/
-SQLITE_PRIVATE int sqlite3TriggersExist(
- Parse *pParse, /* Used to check for recursive triggers */
+SQLITE_PRIVATE Trigger *sqlite3TriggersExist(
+ Parse *pParse, /* Parse context */
Table *pTab, /* The table the contains the triggers */
int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */
- ExprList *pChanges /* Columns that change in an UPDATE statement */
+ ExprList *pChanges, /* Columns that change in an UPDATE statement */
+ int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
){
- Trigger *pTrigger;
int mask = 0;
-
- pTrigger = IsVirtual(pTab) ? 0 : pTab->pTrigger;
- while( pTrigger ){
- if( pTrigger->op==op && checkColumnOverLap(pTrigger->pColumns, pChanges) ){
- mask |= pTrigger->tr_tm;
+ Trigger *pList = sqlite3TriggerList(pParse, pTab);
+ Trigger *p;
+ assert( pList==0 || IsVirtual(pTab)==0 );
+ for(p=pList; p; p=p->pNext){
+ if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
+ mask |= p->tr_tm;
}
- pTrigger = pTrigger->pNext;
}
- return mask;
+ if( pMask ){
+ *pMask = mask;
+ }
+ return (mask ? pList : 0);
}
/*
@@ -68044,221 +83663,430 @@ static SrcList *targetSrcList(
Parse *pParse, /* The parsing context */
TriggerStep *pStep /* The trigger containing the target token */
){
- Token sDb; /* Dummy database name token */
int iDb; /* Index of the database to use */
SrcList *pSrc; /* SrcList to be returned */
- iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema);
- if( iDb==0 || iDb>=2 ){
- assert( iDb<pParse->db->nDb );
- sDb.z = (u8*)pParse->db->aDb[iDb].zName;
- sDb.n = strlen((char*)sDb.z);
- pSrc = sqlite3SrcListAppend(pParse->db, 0, &sDb, &pStep->target);
- } else {
- pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0);
+ pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0);
+ if( pSrc ){
+ assert( pSrc->nSrc>0 );
+ assert( pSrc->a!=0 );
+ iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema);
+ if( iDb==0 || iDb>=2 ){
+ sqlite3 *db = pParse->db;
+ assert( iDb<pParse->db->nDb );
+ pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName);
+ }
}
return pSrc;
}
/*
-** Generate VDBE code for zero or more statements inside the body of a
-** trigger.
+** Generate VDBE code for the statements inside the body of a single
+** trigger.
*/
static int codeTriggerProgram(
Parse *pParse, /* The parser context */
TriggerStep *pStepList, /* List of statements inside the trigger body */
- int orconfin /* Conflict algorithm. (OE_Abort, etc) */
+ int orconf /* Conflict algorithm. (OE_Abort, etc) */
){
- TriggerStep * pTriggerStep = pStepList;
- int orconf;
+ TriggerStep *pStep;
Vdbe *v = pParse->pVdbe;
sqlite3 *db = pParse->db;
- assert( pTriggerStep!=0 );
+ assert( pParse->pTriggerTab && pParse->pToplevel );
+ assert( pStepList );
assert( v!=0 );
- sqlite3VdbeAddOp2(v, OP_ContextPush, 0, 0);
- VdbeComment((v, "begin trigger %s", pStepList->pTrig->name));
- while( pTriggerStep ){
- orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin;
- pParse->trigStack->orconf = orconf;
- switch( pTriggerStep->op ){
- case TK_SELECT: {
- Select *ss = sqlite3SelectDup(db, pTriggerStep->pSelect);
- if( ss ){
- SelectDest dest;
-
- sqlite3SelectDestInit(&dest, SRT_Discard, 0);
- sqlite3SelectResolve(pParse, ss, 0);
- sqlite3Select(pParse, ss, &dest, 0, 0, 0, 0);
- sqlite3SelectDelete(ss);
- }
- break;
- }
+ for(pStep=pStepList; pStep; pStep=pStep->pNext){
+ /* Figure out the ON CONFLICT policy that will be used for this step
+ ** of the trigger program. If the statement that caused this trigger
+ ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use
+ ** the ON CONFLICT policy that was specified as part of the trigger
+ ** step statement. Example:
+ **
+ ** CREATE TRIGGER AFTER INSERT ON t1 BEGIN;
+ ** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);
+ ** END;
+ **
+ ** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy
+ ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy
+ */
+ pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;
+
+ switch( pStep->op ){
case TK_UPDATE: {
- SrcList *pSrc;
- pSrc = targetSrcList(pParse, pTriggerStep);
- sqlite3VdbeAddOp2(v, OP_ResetCount, 0, 0);
- sqlite3Update(pParse, pSrc,
- sqlite3ExprListDup(db, pTriggerStep->pExprList),
- sqlite3ExprDup(db, pTriggerStep->pWhere), orconf);
- sqlite3VdbeAddOp2(v, OP_ResetCount, 1, 0);
+ sqlite3Update(pParse,
+ targetSrcList(pParse, pStep),
+ sqlite3ExprListDup(db, pStep->pExprList, 0),
+ sqlite3ExprDup(db, pStep->pWhere, 0),
+ pParse->eOrconf
+ );
break;
}
case TK_INSERT: {
- SrcList *pSrc;
- pSrc = targetSrcList(pParse, pTriggerStep);
- sqlite3VdbeAddOp2(v, OP_ResetCount, 0, 0);
- sqlite3Insert(pParse, pSrc,
- sqlite3ExprListDup(db, pTriggerStep->pExprList),
- sqlite3SelectDup(db, pTriggerStep->pSelect),
- sqlite3IdListDup(db, pTriggerStep->pIdList), orconf);
- sqlite3VdbeAddOp2(v, OP_ResetCount, 1, 0);
+ sqlite3Insert(pParse,
+ targetSrcList(pParse, pStep),
+ sqlite3ExprListDup(db, pStep->pExprList, 0),
+ sqlite3SelectDup(db, pStep->pSelect, 0),
+ sqlite3IdListDup(db, pStep->pIdList),
+ pParse->eOrconf
+ );
break;
}
case TK_DELETE: {
- SrcList *pSrc;
- sqlite3VdbeAddOp2(v, OP_ResetCount, 0, 0);
- pSrc = targetSrcList(pParse, pTriggerStep);
- sqlite3DeleteFrom(pParse, pSrc,
- sqlite3ExprDup(db, pTriggerStep->pWhere));
- sqlite3VdbeAddOp2(v, OP_ResetCount, 1, 0);
+ sqlite3DeleteFrom(pParse,
+ targetSrcList(pParse, pStep),
+ sqlite3ExprDup(db, pStep->pWhere, 0)
+ );
+ break;
+ }
+ default: assert( pStep->op==TK_SELECT ); {
+ SelectDest sDest;
+ Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0);
+ sqlite3SelectDestInit(&sDest, SRT_Discard, 0);
+ sqlite3Select(pParse, pSelect, &sDest);
+ sqlite3SelectDelete(db, pSelect);
break;
}
- default:
- assert(0);
}
- pTriggerStep = pTriggerStep->pNext;
+ if( pStep->op!=TK_SELECT ){
+ sqlite3VdbeAddOp0(v, OP_ResetCount);
+ }
}
- sqlite3VdbeAddOp2(v, OP_ContextPop, 0, 0);
- VdbeComment((v, "end trigger %s", pStepList->pTrig->name));
return 0;
}
+#ifdef SQLITE_DEBUG
/*
-** This is called to code FOR EACH ROW triggers.
-**
-** When the code that this function generates is executed, the following
-** must be true:
-**
-** 1. No cursors may be open in the main database. (But newIdx and oldIdx
-** can be indices of cursors in temporary tables. See below.)
-**
-** 2. If the triggers being coded are ON INSERT or ON UPDATE triggers, then
-** a temporary vdbe cursor (index newIdx) must be open and pointing at
-** a row containing values to be substituted for new.* expressions in the
-** trigger program(s).
-**
-** 3. If the triggers being coded are ON DELETE or ON UPDATE triggers, then
-** a temporary vdbe cursor (index oldIdx) must be open and pointing at
-** a row containing values to be substituted for old.* expressions in the
-** trigger program(s).
-**
-** If they are not NULL, the piOldColMask and piNewColMask output variables
-** are set to values that describe the columns used by the trigger program
-** in the OLD.* and NEW.* tables respectively. If column N of the
-** pseudo-table is read at least once, the corresponding bit of the output
-** mask is set. If a column with an index greater than 32 is read, the
-** output mask is set to the special value 0xffffffff.
-**
+** This function is used to add VdbeComment() annotations to a VDBE
+** program. It is not used in production code, only for debugging.
+*/
+static const char *onErrorText(int onError){
+ switch( onError ){
+ case OE_Abort: return "abort";
+ case OE_Rollback: return "rollback";
+ case OE_Fail: return "fail";
+ case OE_Replace: return "replace";
+ case OE_Ignore: return "ignore";
+ case OE_Default: return "default";
+ }
+ return "n/a";
+}
+#endif
+
+/*
+** Parse context structure pFrom has just been used to create a sub-vdbe
+** (trigger program). If an error has occurred, transfer error information
+** from pFrom to pTo.
+*/
+static void transferParseError(Parse *pTo, Parse *pFrom){
+ assert( pFrom->zErrMsg==0 || pFrom->nErr );
+ assert( pTo->zErrMsg==0 || pTo->nErr );
+ if( pTo->nErr==0 ){
+ pTo->zErrMsg = pFrom->zErrMsg;
+ pTo->nErr = pFrom->nErr;
+ }else{
+ sqlite3DbFree(pFrom->db, pFrom->zErrMsg);
+ }
+}
+
+/*
+** Create and populate a new TriggerPrg object with a sub-program
+** implementing trigger pTrigger with ON CONFLICT policy orconf.
+*/
+static TriggerPrg *codeRowTrigger(
+ Parse *pParse, /* Current parse context */
+ Trigger *pTrigger, /* Trigger to code */
+ Table *pTab, /* The table pTrigger is attached to */
+ int orconf /* ON CONFLICT policy to code trigger program with */
+){
+ Parse *pTop = sqlite3ParseToplevel(pParse);
+ sqlite3 *db = pParse->db; /* Database handle */
+ TriggerPrg *pPrg; /* Value to return */
+ Expr *pWhen = 0; /* Duplicate of trigger WHEN expression */
+ Vdbe *v; /* Temporary VM */
+ NameContext sNC; /* Name context for sub-vdbe */
+ SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */
+ Parse *pSubParse; /* Parse context for sub-vdbe */
+ int iEndTrigger = 0; /* Label to jump to if WHEN is false */
+
+ assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
+
+ /* Allocate the TriggerPrg and SubProgram objects. To ensure that they
+ ** are freed if an error occurs, link them into the Parse.pTriggerPrg
+ ** list of the top-level Parse object sooner rather than later. */
+ pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg));
+ if( !pPrg ) return 0;
+ pPrg->pNext = pTop->pTriggerPrg;
+ pTop->pTriggerPrg = pPrg;
+ pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram));
+ if( !pProgram ) return 0;
+ pProgram->nRef = 1;
+ pPrg->pTrigger = pTrigger;
+ pPrg->orconf = orconf;
+ pPrg->oldmask = 0xffffffff;
+
+ /* Allocate and populate a new Parse context to use for coding the
+ ** trigger sub-program. */
+ pSubParse = sqlite3StackAllocZero(db, sizeof(Parse));
+ if( !pSubParse ) return 0;
+ memset(&sNC, 0, sizeof(sNC));
+ sNC.pParse = pSubParse;
+ pSubParse->db = db;
+ pSubParse->pTriggerTab = pTab;
+ pSubParse->pToplevel = pTop;
+ pSubParse->zAuthContext = pTrigger->zName;
+ pSubParse->eTriggerOp = pTrigger->op;
+
+ v = sqlite3GetVdbe(pSubParse);
+ if( v ){
+ VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)",
+ pTrigger->zName, onErrorText(orconf),
+ (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"),
+ (pTrigger->op==TK_UPDATE ? "UPDATE" : ""),
+ (pTrigger->op==TK_INSERT ? "INSERT" : ""),
+ (pTrigger->op==TK_DELETE ? "DELETE" : ""),
+ pTab->zName
+ ));
+#ifndef SQLITE_OMIT_TRACE
+ sqlite3VdbeChangeP4(v, -1,
+ sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
+ );
+#endif
+
+ /* If one was specified, code the WHEN clause. If it evaluates to false
+ ** (or NULL) the sub-vdbe is immediately halted by jumping to the
+ ** OP_Halt inserted at the end of the program. */
+ if( pTrigger->pWhen ){
+ pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0);
+ if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
+ && db->mallocFailed==0
+ ){
+ iEndTrigger = sqlite3VdbeMakeLabel(v);
+ sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
+ }
+ sqlite3ExprDelete(db, pWhen);
+ }
+
+ /* Code the trigger program into the sub-vdbe. */
+ codeTriggerProgram(pSubParse, pTrigger->step_list, orconf);
+
+ /* Insert an OP_Halt at the end of the sub-program. */
+ if( iEndTrigger ){
+ sqlite3VdbeResolveLabel(v, iEndTrigger);
+ }
+ sqlite3VdbeAddOp0(v, OP_Halt);
+ VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
+
+ transferParseError(pParse, pSubParse);
+ if( db->mallocFailed==0 ){
+ pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
+ }
+ pProgram->nMem = pSubParse->nMem;
+ pProgram->nCsr = pSubParse->nTab;
+ pProgram->token = (void *)pTrigger;
+ pPrg->oldmask = pSubParse->oldmask;
+ sqlite3VdbeDelete(v);
+ }
+
+ assert( !pSubParse->pAinc && !pSubParse->pZombieTab );
+ assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg );
+ sqlite3StackFree(db, pSubParse);
+
+ return pPrg;
+}
+
+/*
+** Return a pointer to a TriggerPrg object containing the sub-program for
+** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such
+** TriggerPrg object exists, a new object is allocated and populated before
+** being returned.
*/
-SQLITE_PRIVATE int sqlite3CodeRowTrigger(
+static TriggerPrg *getRowTrigger(
+ Parse *pParse, /* Current parse context */
+ Trigger *pTrigger, /* Trigger to code */
+ Table *pTab, /* The table trigger pTrigger is attached to */
+ int orconf /* ON CONFLICT algorithm. */
+){
+ Parse *pRoot = sqlite3ParseToplevel(pParse);
+ TriggerPrg *pPrg;
+
+ assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
+
+ /* It may be that this trigger has already been coded (or is in the
+ ** process of being coded). If this is the case, then an entry with
+ ** a matching TriggerPrg.pTrigger field will be present somewhere
+ ** in the Parse.pTriggerPrg list. Search for such an entry. */
+ for(pPrg=pRoot->pTriggerPrg;
+ pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf);
+ pPrg=pPrg->pNext
+ );
+
+ /* If an existing TriggerPrg could not be located, create a new one. */
+ if( !pPrg ){
+ pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf);
+ }
+
+ return pPrg;
+}
+
+/*
+** Generate code for the trigger program associated with trigger p on
+** table pTab. The reg, orconf and ignoreJump parameters passed to this
+** function are the same as those described in the header function for
+** sqlite3CodeRowTrigger()
+*/
+SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(
+ Parse *pParse, /* Parse context */
+ Trigger *p, /* Trigger to code */
+ Table *pTab, /* The table to code triggers from */
+ int reg, /* Reg array containing OLD.* and NEW.* values */
+ int orconf, /* ON CONFLICT policy */
+ int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
+){
+ Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */
+ TriggerPrg *pPrg;
+ pPrg = getRowTrigger(pParse, p, pTab, orconf);
+ assert( pPrg || pParse->nErr || pParse->db->mallocFailed );
+
+ /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program
+ ** is a pointer to the sub-vdbe containing the trigger program. */
+ if( pPrg ){
+ sqlite3VdbeAddOp3(v, OP_Program, reg, ignoreJump, ++pParse->nMem);
+ pPrg->pProgram->nRef++;
+ sqlite3VdbeChangeP4(v, -1, (const char *)pPrg->pProgram, P4_SUBPROGRAM);
+ VdbeComment(
+ (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf)));
+
+ /* Set the P5 operand of the OP_Program instruction to non-zero if
+ ** recursive invocation of this trigger program is disallowed. Recursive
+ ** invocation is disallowed if (a) the sub-program is really a trigger,
+ ** not a foreign key action, and (b) the flag to enable recursive triggers
+ ** is clear. */
+ sqlite3VdbeChangeP5(v, (u8)(p->zName && !(pParse->db->flags&SQLITE_RecTriggers)));
+ }
+}
+
+/*
+** This is called to code the required FOR EACH ROW triggers for an operation
+** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE)
+** is given by the op paramater. The tr_tm parameter determines whether the
+** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then
+** parameter pChanges is passed the list of columns being modified.
+**
+** If there are no triggers that fire at the specified time for the specified
+** operation on pTab, this function is a no-op.
+**
+** The reg argument is the address of the first in an array of registers
+** that contain the values substituted for the new.* and old.* references
+** in the trigger program. If N is the number of columns in table pTab
+** (a copy of pTab->nCol), then registers are populated as follows:
+**
+** Register Contains
+** ------------------------------------------------------
+** reg+0 OLD.rowid
+** reg+1 OLD.* value of left-most column of pTab
+** ... ...
+** reg+N OLD.* value of right-most column of pTab
+** reg+N+1 NEW.rowid
+** reg+N+2 OLD.* value of left-most column of pTab
+** ... ...
+** reg+N+N+1 NEW.* value of right-most column of pTab
+**
+** For ON DELETE triggers, the registers containing the NEW.* values will
+** never be accessed by the trigger program, so they are not allocated or
+** populated by the caller (there is no data to populate them with anyway).
+** Similarly, for ON INSERT triggers the values stored in the OLD.* registers
+** are never accessed, and so are not allocated by the caller. So, for an
+** ON INSERT trigger, the value passed to this function as parameter reg
+** is not a readable register, although registers (reg+N) through
+** (reg+N+N+1) are.
+**
+** Parameter orconf is the default conflict resolution algorithm for the
+** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump
+** is the instruction that control should jump to if a trigger program
+** raises an IGNORE exception.
+*/
+SQLITE_PRIVATE void sqlite3CodeRowTrigger(
Parse *pParse, /* Parse context */
+ Trigger *pTrigger, /* List of triggers on table pTab */
int op, /* One of TK_UPDATE, TK_INSERT, TK_DELETE */
ExprList *pChanges, /* Changes list for any UPDATE OF triggers */
int tr_tm, /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
Table *pTab, /* The table to code triggers from */
- int newIdx, /* The indice of the "new" row to access */
- int oldIdx, /* The indice of the "old" row to access */
+ int reg, /* The first in an array of registers (see above) */
int orconf, /* ON CONFLICT policy */
- int ignoreJump, /* Instruction to jump to for RAISE(IGNORE) */
- u32 *piOldColMask, /* OUT: Mask of columns used from the OLD.* table */
- u32 *piNewColMask /* OUT: Mask of columns used from the NEW.* table */
+ int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
){
- Trigger *p;
- sqlite3 *db = pParse->db;
- TriggerStack trigStackEntry;
-
- trigStackEntry.oldColMask = 0;
- trigStackEntry.newColMask = 0;
+ Trigger *p; /* Used to iterate through pTrigger list */
- assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);
- assert(tr_tm == TRIGGER_BEFORE || tr_tm == TRIGGER_AFTER );
+ assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE );
+ assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER );
+ assert( (op==TK_UPDATE)==(pChanges!=0) );
- assert(newIdx != -1 || oldIdx != -1);
+ for(p=pTrigger; p; p=p->pNext){
- for(p=pTab->pTrigger; p; p=p->pNext){
- int fire_this = 0;
+ /* Sanity checking: The schema for the trigger and for the table are
+ ** always defined. The trigger must be in the same schema as the table
+ ** or else it must be a TEMP trigger. */
+ assert( p->pSchema!=0 );
+ assert( p->pTabSchema!=0 );
+ assert( p->pSchema==p->pTabSchema
+ || p->pSchema==pParse->db->aDb[1].pSchema );
/* Determine whether we should code this trigger */
- if(
- p->op==op &&
- p->tr_tm==tr_tm &&
- (p->pSchema==p->pTabSchema || p->pSchema==db->aDb[1].pSchema) &&
- (op!=TK_UPDATE||!p->pColumns||checkColumnOverLap(p->pColumns,pChanges))
+ if( p->op==op
+ && p->tr_tm==tr_tm
+ && checkColumnOverlap(p->pColumns, pChanges)
){
- TriggerStack *pS; /* Pointer to trigger-stack entry */
- for(pS=pParse->trigStack; pS && p!=pS->pTrigger; pS=pS->pNext){}
- if( !pS ){
- fire_this = 1;
- }
-#if 0 /* Give no warning for recursive triggers. Just do not do them */
- else{
- sqlite3ErrorMsg(pParse, "recursive triggers not supported (%s)",
- p->name);
- return SQLITE_ERROR;
- }
-#endif
+ sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump);
}
-
- if( fire_this ){
- int endTrigger;
- Expr * whenExpr;
- AuthContext sContext;
- NameContext sNC;
-
-#ifndef SQLITE_OMIT_TRACE
- sqlite3VdbeAddOp4(pParse->pVdbe, OP_Trace, 0, 0, 0,
- sqlite3MPrintf(db, "-- TRIGGER %s", p->name),
- P4_DYNAMIC);
-#endif
- memset(&sNC, 0, sizeof(sNC));
- sNC.pParse = pParse;
-
- /* Push an entry on to the trigger stack */
- trigStackEntry.pTrigger = p;
- trigStackEntry.newIdx = newIdx;
- trigStackEntry.oldIdx = oldIdx;
- trigStackEntry.pTab = pTab;
- trigStackEntry.pNext = pParse->trigStack;
- trigStackEntry.ignoreJump = ignoreJump;
- pParse->trigStack = &trigStackEntry;
- sqlite3AuthContextPush(pParse, &sContext, p->name);
-
- /* code the WHEN clause */
- endTrigger = sqlite3VdbeMakeLabel(pParse->pVdbe);
- whenExpr = sqlite3ExprDup(db, p->pWhen);
- if( db->mallocFailed || sqlite3ExprResolveNames(&sNC, whenExpr) ){
- pParse->trigStack = trigStackEntry.pNext;
- sqlite3ExprDelete(whenExpr);
- return 1;
- }
- sqlite3ExprIfFalse(pParse, whenExpr, endTrigger, SQLITE_JUMPIFNULL);
- sqlite3ExprDelete(whenExpr);
-
- codeTriggerProgram(pParse, p->step_list, orconf);
+ }
+}
- /* Pop the entry off the trigger stack */
- pParse->trigStack = trigStackEntry.pNext;
- sqlite3AuthContextPop(&sContext);
+/*
+** Triggers fired by UPDATE or DELETE statements may access values stored
+** in the old.* pseudo-table. This function returns a 32-bit bitmask
+** indicating which columns of the old.* table actually are used by
+** triggers. This information may be used by the caller to avoid having
+** to load the entire old.* record into memory when executing an UPDATE
+** or DELETE command.
+**
+** Bit 0 of the returned mask is set if the left-most column of the
+** table may be accessed using an old.<col> reference. Bit 1 is set if
+** the second leftmost column value is required, and so on. If there
+** are more than 32 columns in the table, and at least one of the columns
+** with an index greater than 32 may be accessed, 0xffffffff is returned.
+**
+** It is not possible to determine if the old.rowid column is accessed
+** by triggers. The caller must always assume that it is.
+**
+** There is no equivalent function for new.* references.
+*/
+SQLITE_PRIVATE u32 sqlite3TriggerOldmask(
+ Parse *pParse, /* Parse context */
+ Trigger *pTrigger, /* List of triggers on table pTab */
+ ExprList *pChanges, /* Changes list for any UPDATE OF triggers */
+ Table *pTab, /* The table to code triggers from */
+ int orconf /* Default ON CONFLICT policy for trigger steps */
+){
+ const int op = pChanges ? TK_UPDATE : TK_DELETE;
+ u32 mask = 0;
+ Trigger *p;
- sqlite3VdbeResolveLabel(pParse->pVdbe, endTrigger);
+ for(p=pTrigger; p; p=p->pNext){
+ if( p->op==op && checkColumnOverlap(p->pColumns,pChanges) ){
+ TriggerPrg *pPrg;
+ pPrg = getRowTrigger(pParse, p, pTab, orconf);
+ if( pPrg ){
+ mask |= pPrg->oldmask;
+ }
}
}
- if( piOldColMask ) *piOldColMask |= trigStackEntry.oldColMask;
- if( piNewColMask ) *piNewColMask |= trigStackEntry.newColMask;
- return 0;
+
+ return mask;
}
+
#endif /* !defined(SQLITE_OMIT_TRIGGER) */
/************** End of trigger.c *********************************************/
@@ -68277,7 +84105,7 @@ SQLITE_PRIVATE int sqlite3CodeRowTrigger(
** This file contains C code routines that are called by the parser
** to handle UPDATE statements.
**
-** $Id: update.c,v 1.178 2008/04/28 18:46:43 drh Exp $
+** $Id: update.c,v 1.207 2009/08/08 18:01:08 drh Exp $
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -68317,9 +84145,15 @@ static void updateVirtualTable(
** the column is a literal number, string or null. The sqlite3ValueFromExpr()
** function is capable of transforming these types of expressions into
** sqlite3_value objects.
+**
+** If parameter iReg is not negative, code an OP_RealAffinity instruction
+** on register iReg. This is used when an equivalent integer value is
+** stored in place of an 8-byte floating point value in order to save
+** space.
*/
-SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i){
- if( pTab && !pTab->pSelect ){
+SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
+ assert( pTab!=0 );
+ if( !pTab->pSelect ){
sqlite3_value *pValue;
u8 enc = ENC(sqlite3VdbeDb(v));
Column *pCol = &pTab->aCol[i];
@@ -68330,6 +84164,11 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i){
if( pValue ){
sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM);
}
+#ifndef SQLITE_OMIT_FLOATING_POINT
+ if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
+ sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
+ }
+#endif
}
}
@@ -68368,28 +84207,23 @@ SQLITE_PRIVATE void sqlite3Update(
int iDb; /* Database containing the table being updated */
int j1; /* Addresses of jump instructions */
int okOnePass; /* True for one-pass algorithm without the FIFO */
+ int hasFK; /* True if foreign key processing is required */
#ifndef SQLITE_OMIT_TRIGGER
int isView; /* Trying to update a view */
- int triggers_exist = 0; /* True if any row triggers exist */
+ Trigger *pTrigger; /* List of triggers on pTab, if required */
#endif
- int iBeginAfterTrigger; /* Address of after trigger program */
- int iEndAfterTrigger; /* Exit of after trigger program */
- int iBeginBeforeTrigger; /* Address of before trigger program */
- int iEndBeforeTrigger; /* Exit of before trigger program */
- u32 old_col_mask = 0; /* Mask of OLD.* columns in use */
- u32 new_col_mask = 0; /* Mask of NEW.* columns in use */
-
- int newIdx = -1; /* index of trigger "new" temp table */
- int oldIdx = -1; /* index of trigger "old" temp table */
/* Register Allocations */
int regRowCount = 0; /* A count of rows changed */
int regOldRowid; /* The old rowid */
int regNewRowid; /* The new rowid */
- int regData; /* New data for the row */
+ int regNew;
+ int regOld = 0;
+ int regRowSet = 0; /* Rowset of rows to be updated */
+ int regRec; /* Register used for new table record to insert */
- sContext.pParse = 0;
+ memset(&sContext, 0, sizeof(sContext));
db = pParse->db;
if( pParse->nErr || db->mallocFailed ){
goto update_cleanup;
@@ -68403,13 +84237,13 @@ SQLITE_PRIVATE void sqlite3Update(
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
/* Figure out if we have any triggers and if the table being
- ** updated is a view
+ ** updated is a view.
*/
#ifndef SQLITE_OMIT_TRIGGER
- triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges);
+ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, 0);
isView = pTab->pSelect!=0;
#else
-# define triggers_exist 0
+# define pTrigger 0
# define isView 0
#endif
#ifdef SQLITE_OMIT_VIEW
@@ -68417,24 +84251,16 @@ SQLITE_PRIVATE void sqlite3Update(
# define isView 0
#endif
- if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){
+ if( sqlite3ViewGetColumnNames(pParse, pTab) ){
goto update_cleanup;
}
- if( sqlite3ViewGetColumnNames(pParse, pTab) ){
+ if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){
goto update_cleanup;
}
aXRef = sqlite3DbMallocRaw(db, sizeof(int) * pTab->nCol );
if( aXRef==0 ) goto update_cleanup;
for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
- /* If there are FOR EACH ROW triggers, allocate cursors for the
- ** special OLD and NEW tables
- */
- if( triggers_exist ){
- newIdx = pParse->nTab++;
- oldIdx = pParse->nTab++;
- }
-
/* Allocate a cursors for the main database table and for all indices.
** The index cursors might not be used, but if they are used they
** need to occur right after the database cursor. So go ahead and
@@ -68458,7 +84284,7 @@ SQLITE_PRIVATE void sqlite3Update(
*/
chngRowid = 0;
for(i=0; i<pChanges->nExpr; i++){
- if( sqlite3ExprResolveNames(&sNC, pChanges->a[i].pExpr) ){
+ if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
goto update_cleanup;
}
for(j=0; j<pTab->nCol; j++){
@@ -68494,6 +84320,8 @@ SQLITE_PRIVATE void sqlite3Update(
#endif
}
+ hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngRowid);
+
/* Allocate memory for the array aRegIdx[]. There is one entry in the
** array for each index associated with table being updated. Fill in
** the value with a register number for indices that are to be used
@@ -68520,24 +84348,7 @@ SQLITE_PRIVATE void sqlite3Update(
aRegIdx[j] = reg;
}
- /* Allocate a block of register used to store the change record
- ** sent to sqlite3GenerateConstraintChecks(). There are either
- ** one or two registers for holding the rowid. One rowid register
- ** is used if chngRowid is false and two are used if chngRowid is
- ** true. Following these are pTab->nCol register holding column
- ** data.
- */
- regOldRowid = regNewRowid = pParse->nMem + 1;
- pParse->nMem += pTab->nCol + 1;
- if( chngRowid ){
- regNewRowid++;
- pParse->nMem++;
- }
- regData = regNewRowid+1;
-
-
- /* Begin generating code.
- */
+ /* Begin generating code. */
v = sqlite3GetVdbe(pParse);
if( v==0 ) goto update_cleanup;
if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
@@ -68554,67 +84365,54 @@ SQLITE_PRIVATE void sqlite3Update(
}
#endif
- /* Start the view context
- */
- if( isView ){
- sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
+ /* Allocate required registers. */
+ regOldRowid = regNewRowid = ++pParse->nMem;
+ if( pTrigger || hasFK ){
+ regOld = pParse->nMem + 1;
+ pParse->nMem += pTab->nCol;
}
+ if( chngRowid || pTrigger || hasFK ){
+ regNewRowid = ++pParse->nMem;
+ }
+ regNew = pParse->nMem + 1;
+ pParse->nMem += pTab->nCol;
+ regRec = ++pParse->nMem;
- /* Generate the code for triggers.
- */
- if( triggers_exist ){
- int iGoto;
-
- /* Create pseudo-tables for NEW and OLD
- */
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol);
- sqlite3VdbeAddOp2(v, OP_OpenPseudo, oldIdx, 0);
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol);
- sqlite3VdbeAddOp2(v, OP_OpenPseudo, newIdx, 0);
-
- iGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
- addr = sqlite3VdbeMakeLabel(v);
- iBeginBeforeTrigger = sqlite3VdbeCurrentAddr(v);
- if( sqlite3CodeRowTrigger(pParse, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab,
- newIdx, oldIdx, onError, addr, &old_col_mask, &new_col_mask) ){
- goto update_cleanup;
- }
- iEndBeforeTrigger = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
- iBeginAfterTrigger = sqlite3VdbeCurrentAddr(v);
- if( sqlite3CodeRowTrigger(pParse, TK_UPDATE, pChanges, TRIGGER_AFTER, pTab,
- newIdx, oldIdx, onError, addr, &old_col_mask, &new_col_mask) ){
- goto update_cleanup;
- }
- iEndAfterTrigger = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
- sqlite3VdbeJumpHere(v, iGoto);
+ /* Start the view context. */
+ if( isView ){
+ sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
}
/* If we are trying to update a view, realize that view into
** a ephemeral table.
*/
+#if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
if( isView ){
- sqlite3MaterializeView(pParse, pTab->pSelect, pWhere, iCur);
+ sqlite3MaterializeView(pParse, pTab, pWhere, iCur);
}
+#endif
/* Resolve the column names in all the expressions in the
** WHERE clause.
*/
- if( sqlite3ExprResolveNames(&sNC, pWhere) ){
+ if( sqlite3ResolveExprNames(&sNC, pWhere) ){
goto update_cleanup;
}
/* Begin the database scan
*/
sqlite3VdbeAddOp2(v, OP_Null, 0, regOldRowid);
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0,
- WHERE_ONEPASS_DESIRED);
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0, WHERE_ONEPASS_DESIRED);
if( pWInfo==0 ) goto update_cleanup;
okOnePass = pWInfo->okOnePass;
/* Remember the rowid of every item to be updated.
*/
- sqlite3VdbeAddOp2(v, IsVirtual(pTab)?OP_VRowid:OP_Rowid, iCur, regOldRowid);
- if( !okOnePass ) sqlite3VdbeAddOp2(v, OP_FifoWrite, regOldRowid, 0);
+ sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regOldRowid);
+ if( !okOnePass ){
+ regRowSet = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid);
+ }
/* End the database scan loop.
*/
@@ -68622,12 +84420,12 @@ SQLITE_PRIVATE void sqlite3Update(
/* Initialize the count of updated rows
*/
- if( db->flags & SQLITE_CountRows && !pParse->trigStack ){
+ if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
regRowCount = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
}
- if( !isView && !IsVirtual(pTab) ){
+ if( !isView ){
/*
** Open every index that needs updating. Note that if any
** index could potentially invoke a REPLACE conflict resolution
@@ -68655,11 +84453,6 @@ SQLITE_PRIVATE void sqlite3Update(
}
}
}
-
- /* Jump back to this point if a trigger encounters an IGNORE constraint. */
- if( triggers_exist ){
- sqlite3VdbeResolveLabel(v, addr);
- }
/* Top of the update loop */
if( okOnePass ){
@@ -68667,141 +84460,120 @@ SQLITE_PRIVATE void sqlite3Update(
addr = sqlite3VdbeAddOp0(v, OP_Goto);
sqlite3VdbeJumpHere(v, a1);
}else{
- addr = sqlite3VdbeAddOp2(v, OP_FifoRead, regOldRowid, 0);
+ addr = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, 0, regOldRowid);
}
- if( triggers_exist ){
- int regRowid;
- int regRow;
- int regCols;
+ /* Make cursor iCur point to the record that is being updated. If
+ ** this record does not exist for some reason (deleted by a trigger,
+ ** for example, then jump to the next iteration of the RowSet loop. */
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
- /* Make cursor iCur point to the record that is being updated.
- */
- sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
-
- /* Generate the OLD table
- */
- regRowid = sqlite3GetTempReg(pParse);
- regRow = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regRowid);
- if( !old_col_mask ){
- sqlite3VdbeAddOp2(v, OP_Null, 0, regRow);
- }else{
- sqlite3VdbeAddOp2(v, OP_RowData, iCur, regRow);
- }
- sqlite3VdbeAddOp3(v, OP_Insert, oldIdx, regRow, regRowid);
+ /* If the record number will change, set register regNewRowid to
+ ** contain the new value. If the record number is not being modified,
+ ** then regNewRowid is the same register as regOldRowid, which is
+ ** already populated. */
+ assert( chngRowid || pTrigger || hasFK || regOldRowid==regNewRowid );
+ if( chngRowid ){
+ sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
+ sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid);
+ }
- /* Generate the NEW table
- */
- if( chngRowid ){
- sqlite3ExprCodeAndCache(pParse, pRowidExpr, regRowid);
- }else{
- sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regRowid);
- }
- regCols = sqlite3GetTempRange(pParse, pTab->nCol);
+ /* If there are triggers on this table, populate an array of registers
+ ** with the required old.* column data. */
+ if( hasFK || pTrigger ){
+ u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0);
+ oldmask |= sqlite3TriggerOldmask(pParse, pTrigger, pChanges, pTab, onError);
for(i=0; i<pTab->nCol; i++){
- if( i==pTab->iPKey ){
- sqlite3VdbeAddOp2(v, OP_Null, 0, regCols+i);
- continue;
- }
- j = aXRef[i];
- if( new_col_mask&((u32)1<<i) || new_col_mask==0xffffffff ){
- if( j<0 ){
- sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regCols+i);
- sqlite3ColumnDefault(v, pTab, i);
- }else{
- sqlite3ExprCodeAndCache(pParse, pChanges->a[j].pExpr, regCols+i);
- }
+ if( aXRef[i]<0 || oldmask==0xffffffff || (oldmask & (1<<i)) ){
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regOld+i);
+ sqlite3ColumnDefault(v, pTab, i, regOld+i);
}else{
- sqlite3VdbeAddOp2(v, OP_Null, 0, regCols+i);
+ sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i);
}
}
- sqlite3VdbeAddOp3(v, OP_MakeRecord, regCols, pTab->nCol, regRow);
- if( !isView ){
- sqlite3TableAffinityStr(v, pTab);
- sqlite3ExprCacheAffinityChange(pParse, regCols, pTab->nCol);
+ if( chngRowid==0 ){
+ sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid);
}
- sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol);
- if( pParse->nErr ) goto update_cleanup;
- sqlite3VdbeAddOp3(v, OP_Insert, newIdx, regRow, regRowid);
- sqlite3ReleaseTempReg(pParse, regRowid);
- sqlite3ReleaseTempReg(pParse, regRow);
-
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginBeforeTrigger);
- sqlite3VdbeJumpHere(v, iEndBeforeTrigger);
}
- if( !isView && !IsVirtual(pTab) ){
- /* Loop over every record that needs updating. We have to load
- ** the old data for each record to be updated because some columns
- ** might not change and we will need to copy the old value.
- ** Also, the old data is needed to delete the old index entries.
- ** So make the cursor point at the old record.
- */
- sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
-
- /* If the record number will change, push the record number as it
- ** will be after the update. (The old record number is currently
- ** on top of the stack.)
- */
- if( chngRowid ){
- sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
- sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid);
- }
-
- /* Compute new data for this record.
- */
- for(i=0; i<pTab->nCol; i++){
- if( i==pTab->iPKey ){
- sqlite3VdbeAddOp2(v, OP_Null, 0, regData+i);
- continue;
- }
+ /* Populate the array of registers beginning at regNew with the new
+ ** row data. This array is used to check constaints, create the new
+ ** table and index records, and as the values for any new.* references
+ ** made by triggers. */
+ for(i=0; i<pTab->nCol; i++){
+ if( i==pTab->iPKey ){
+ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
+ }else{
j = aXRef[i];
if( j<0 ){
- sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regData+i);
- sqlite3ColumnDefault(v, pTab, i);
+ sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i);
+ sqlite3ColumnDefault(v, pTab, i, regNew+i);
}else{
- sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regData+i);
+ sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i);
}
}
+ }
- /* Do constraint checks
- */
+ /* Fire any BEFORE UPDATE triggers. This happens before constraints are
+ ** verified. One could argue that this is wrong. */
+ if( pTrigger ){
+ sqlite3VdbeAddOp2(v, OP_Affinity, regNew, pTab->nCol);
+ sqlite3TableAffinityStr(v, pTab);
+ sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
+ TRIGGER_BEFORE, pTab, regOldRowid, onError, addr);
+
+ /* The row-trigger may have deleted the row being updated. In this
+ ** case, jump to the next row. No updates or AFTER triggers are
+ ** required. This behaviour - what happens when the row being updated
+ ** is deleted or renamed by a BEFORE trigger - is left undefined in the
+ ** documentation. */
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
+ }
+
+ if( !isView ){
+
+ /* Do constraint checks. */
sqlite3GenerateConstraintChecks(pParse, pTab, iCur, regNewRowid,
- aRegIdx, chngRowid, 1,
- onError, addr);
+ aRegIdx, (chngRowid?regOldRowid:0), 1, onError, addr, 0);
- /* Delete the old indices for the current record.
- */
+ /* Do FK constraint checks. */
+ if( hasFK ){
+ sqlite3FkCheck(pParse, pTab, regOldRowid, 0);
+ }
+
+ /* Delete the index entries associated with the current record. */
j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regOldRowid);
sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, aRegIdx);
-
- /* If changing the record number, delete the old record.
- */
- if( chngRowid ){
+
+ /* If changing the record number, delete the old record. */
+ if( hasFK || chngRowid ){
sqlite3VdbeAddOp2(v, OP_Delete, iCur, 0);
}
sqlite3VdbeJumpHere(v, j1);
- /* Create the new index entries and the new record.
- */
- sqlite3CompleteInsertion(pParse, pTab, iCur, regNewRowid,
- aRegIdx, chngRowid, 1, -1, 0);
+ if( hasFK ){
+ sqlite3FkCheck(pParse, pTab, 0, regNewRowid);
+ }
+
+ /* Insert the new index entries and the new record. */
+ sqlite3CompleteInsertion(pParse, pTab, iCur, regNewRowid, aRegIdx, 1, 0, 0);
+
+ /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
+ ** handle rows (possibly in other tables) that refer via a foreign key
+ ** to the row just updated. */
+ if( hasFK ){
+ sqlite3FkActions(pParse, pTab, pChanges, regOldRowid);
+ }
}
/* Increment the row counter
*/
- if( db->flags & SQLITE_CountRows && !pParse->trigStack){
+ if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
}
- /* If there are triggers, close all the cursors after each iteration
- ** through the loop. The fire the after triggers.
- */
- if( triggers_exist ){
- sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginAfterTrigger);
- sqlite3VdbeJumpHere(v, iEndAfterTrigger);
- }
+ sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
+ TRIGGER_AFTER, pTab, regOldRowid, onError, addr);
/* Repeat the above with the next record to be updated, until
** all record selected by the WHERE clause have been updated.
@@ -68816,9 +84588,13 @@ SQLITE_PRIVATE void sqlite3Update(
}
}
sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
- if( triggers_exist ){
- sqlite3VdbeAddOp2(v, OP_Close, newIdx, 0);
- sqlite3VdbeAddOp2(v, OP_Close, oldIdx, 0);
+
+ /* Update the sqlite_sequence table by storing the content of the
+ ** maximum rowid counter values recorded while inserting into
+ ** autoincrement tables.
+ */
+ if( pParse->nested==0 && pParse->pTriggerTab==0 ){
+ sqlite3AutoincrementEnd(pParse);
}
/*
@@ -68826,21 +84602,30 @@ SQLITE_PRIVATE void sqlite3Update(
** generating code because of a call to sqlite3NestedParse(), do not
** invoke the callback function.
*/
- if( db->flags & SQLITE_CountRows && !pParse->trigStack && pParse->nested==0 ){
+ if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
sqlite3VdbeSetNumCols(v, 1);
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", P4_STATIC);
+ sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
}
update_cleanup:
sqlite3AuthContextPop(&sContext);
- sqlite3_free(aRegIdx);
- sqlite3_free(aXRef);
- sqlite3SrcListDelete(pTabList);
- sqlite3ExprListDelete(pChanges);
- sqlite3ExprDelete(pWhere);
+ sqlite3DbFree(db, aRegIdx);
+ sqlite3DbFree(db, aXRef);
+ sqlite3SrcListDelete(db, pTabList);
+ sqlite3ExprListDelete(db, pChanges);
+ sqlite3ExprDelete(db, pWhere);
return;
}
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation). */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
@@ -68880,26 +84665,26 @@ static void updateVirtualTable(
int addr; /* Address of top of loop */
int iReg; /* First register in set passed to OP_VUpdate */
sqlite3 *db = pParse->db; /* Database connection */
- const char *pVtab = (const char*)pTab->pVtab;
+ const char *pVTab = (const char*)sqlite3GetVTable(db, pTab);
SelectDest dest;
/* Construct the SELECT statement that will find the new values for
** all updated rows.
*/
pEList = sqlite3ExprListAppend(pParse, 0,
- sqlite3CreateIdExpr(pParse, "_rowid_"), 0);
+ sqlite3CreateIdExpr(pParse, "_rowid_"));
if( pRowid ){
pEList = sqlite3ExprListAppend(pParse, pEList,
- sqlite3ExprDup(db, pRowid), 0);
+ sqlite3ExprDup(db, pRowid, 0));
}
assert( pTab->iPKey<0 );
for(i=0; i<pTab->nCol; i++){
if( aXRef[i]>=0 ){
- pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr);
+ pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0);
}else{
pExpr = sqlite3CreateIdExpr(pParse, pTab->aCol[i].zName);
}
- pEList = sqlite3ExprListAppend(pParse, pEList, pExpr, 0);
+ pEList = sqlite3ExprListAppend(pParse, pEList, pExpr);
}
pSelect = sqlite3SelectNew(pParse, pEList, pSrc, pWhere, 0, 0, 0, 0, 0, 0);
@@ -68913,34 +84698,29 @@ static void updateVirtualTable(
/* fill the ephemeral table
*/
sqlite3SelectDestInit(&dest, SRT_Table, ephemTab);
- sqlite3Select(pParse, pSelect, &dest, 0, 0, 0, 0);
+ sqlite3Select(pParse, pSelect, &dest);
/* Generate code to scan the ephemeral table and call VUpdate. */
iReg = ++pParse->nMem;
pParse->nMem += pTab->nCol+1;
- sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0);
- addr = sqlite3VdbeCurrentAddr(v);
+ addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0);
sqlite3VdbeAddOp3(v, OP_Column, ephemTab, 0, iReg);
sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1);
for(i=0; i<pTab->nCol; i++){
sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i+1+(pRowid!=0), iReg+2+i);
}
sqlite3VtabMakeWritable(pParse, pTab);
- sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVtab, P4_VTAB);
- sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr);
- sqlite3VdbeJumpHere(v, addr-1);
+ sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVTab, P4_VTAB);
+ sqlite3MayAbort(pParse);
+ sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1);
+ sqlite3VdbeJumpHere(v, addr);
sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
/* Cleanup */
- sqlite3SelectDelete(pSelect);
+ sqlite3SelectDelete(db, pSelect);
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
-
/************** End of update.c **********************************************/
/************** Begin file vacuum.c ******************************************/
/*
@@ -68959,7 +84739,7 @@ static void updateVirtualTable(
** Most of the code in this file may be omitted by defining the
** SQLITE_OMIT_VACUUM macro.
**
-** $Id: vacuum.c,v 1.78 2008/04/30 16:38:23 drh Exp $
+** $Id: vacuum.c,v 1.91 2009/07/02 07:47:33 danielk1977 Exp $
*/
#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
@@ -68968,13 +84748,15 @@ static void updateVirtualTable(
*/
static int execSql(sqlite3 *db, const char *zSql){
sqlite3_stmt *pStmt;
+ VVA_ONLY( int rc; )
if( !zSql ){
return SQLITE_NOMEM;
}
if( SQLITE_OK!=sqlite3_prepare(db, zSql, -1, &pStmt, 0) ){
return sqlite3_errcode(db);
}
- while( SQLITE_ROW==sqlite3_step(pStmt) ){}
+ VVA_ONLY( rc = ) sqlite3_step(pStmt);
+ assert( rc!=SQLITE_ROW );
return sqlite3_finalize(pStmt);
}
@@ -69027,20 +84809,28 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
Btree *pTemp; /* The temporary database we vacuum into */
char *zSql = 0; /* SQL statements */
int saved_flags; /* Saved value of the db->flags */
+ int saved_nChange; /* Saved value of db->nChange */
+ int saved_nTotalChange; /* Saved value of db->nTotalChange */
Db *pDb = 0; /* Database to detach at end of vacuum */
+ int isMemDb; /* True if vacuuming a :memory: database */
int nRes;
- /* Save the current value of the write-schema flag before setting it. */
+ if( !db->autoCommit ){
+ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction");
+ return SQLITE_ERROR;
+ }
+
+ /* Save the current value of the database flags so that it can be
+ ** restored before returning. Then set the writable-schema flag, and
+ ** disable CHECK and foreign key constraints. */
saved_flags = db->flags;
+ saved_nChange = db->nChange;
+ saved_nTotalChange = db->nTotalChange;
db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks;
+ db->flags &= ~SQLITE_ForeignKeys;
- if( !db->autoCommit ){
- sqlite3SetString(pzErrMsg, "cannot VACUUM from within a transaction",
- (char*)0);
- rc = SQLITE_ERROR;
- goto end_of_vacuum;
- }
pMain = db->aDb[0].pBt;
+ isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain));
/* Attach the temporary database as 'vacuum_db'. The synchronous pragma
** can be set to 'off' for this file, as it is not recovered if a crash
@@ -69064,9 +84854,21 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
pTemp = db->aDb[db->nDb-1].pBt;
nRes = sqlite3BtreeGetReserve(pMain);
- if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes)
- || sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes)
- || db->mallocFailed
+
+ /* A VACUUM cannot change the pagesize of an encrypted database. */
+#ifdef SQLITE_HAS_CODEC
+ if( db->nextPagesize ){
+ extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*);
+ int nKey;
+ char *zKey;
+ sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);
+ if( nKey ) db->nextPagesize = 0;
+ }
+#endif
+
+ if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0)
+ || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0))
+ || NEVER(db->mallocFailed)
){
rc = SQLITE_NOMEM;
goto end_of_vacuum;
@@ -69154,7 +84956,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
** opened for writing. This way, the SQL transaction used to create the
** temporary database never needs to be committed.
*/
- if( rc==SQLITE_OK ){
+ {
u32 meta;
int i;
@@ -69165,37 +84967,41 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
** connections to the same database will know to reread the schema.
*/
static const unsigned char aCopy[] = {
- 1, 1, /* Add one to the old schema cookie */
- 3, 0, /* Preserve the default page cache size */
- 5, 0, /* Preserve the default text encoding */
- 6, 0, /* Preserve the user version */
+ BTREE_SCHEMA_VERSION, 1, /* Add one to the old schema cookie */
+ BTREE_DEFAULT_CACHE_SIZE, 0, /* Preserve the default page cache size */
+ BTREE_TEXT_ENCODING, 0, /* Preserve the text encoding */
+ BTREE_USER_VERSION, 0, /* Preserve the user version */
};
assert( 1==sqlite3BtreeIsInTrans(pTemp) );
assert( 1==sqlite3BtreeIsInTrans(pMain) );
/* Copy Btree meta values */
- for(i=0; i<sizeof(aCopy)/sizeof(aCopy[0]); i+=2){
- rc = sqlite3BtreeGetMeta(pMain, aCopy[i], &meta);
- if( rc!=SQLITE_OK ) goto end_of_vacuum;
+ for(i=0; i<ArraySize(aCopy); i+=2){
+ /* GetMeta() and UpdateMeta() cannot fail in this context because
+ ** we already have page 1 loaded into cache and marked dirty. */
+ sqlite3BtreeGetMeta(pMain, aCopy[i], &meta);
rc = sqlite3BtreeUpdateMeta(pTemp, aCopy[i], meta+aCopy[i+1]);
- if( rc!=SQLITE_OK ) goto end_of_vacuum;
+ if( NEVER(rc!=SQLITE_OK) ) goto end_of_vacuum;
}
rc = sqlite3BtreeCopyFile(pMain, pTemp);
if( rc!=SQLITE_OK ) goto end_of_vacuum;
rc = sqlite3BtreeCommit(pTemp);
if( rc!=SQLITE_OK ) goto end_of_vacuum;
- rc = sqlite3BtreeCommit(pMain);
+#ifndef SQLITE_OMIT_AUTOVACUUM
+ sqlite3BtreeSetAutoVacuum(pMain, sqlite3BtreeGetAutoVacuum(pTemp));
+#endif
}
- if( rc==SQLITE_OK ){
- rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes);
- }
+ assert( rc==SQLITE_OK );
+ rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1);
end_of_vacuum:
/* Restore the original value of db->flags */
db->flags = saved_flags;
+ db->nChange = saved_nChange;
+ db->nTotalChange = saved_nTotalChange;
/* Currently there is an SQL level transaction open on the vacuum
** database. No locks are held on any other files (since the main file
@@ -69233,36 +85039,47 @@ end_of_vacuum:
*************************************************************************
** This file contains code used to help implement virtual tables.
**
-** $Id: vtab.c,v 1.69 2008/05/05 13:23:04 drh Exp $
+** $Id: vtab.c,v 1.94 2009/08/08 18:01:08 drh Exp $
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
+/*
+** The actual function that does the work of creating a new module.
+** This function implements the sqlite3_create_module() and
+** sqlite3_create_module_v2() interfaces.
+*/
static int createModule(
sqlite3 *db, /* Database in which module is registered */
const char *zName, /* Name assigned to this module */
const sqlite3_module *pModule, /* The definition of the module */
void *pAux, /* Context pointer for xCreate/xConnect */
void (*xDestroy)(void *) /* Module destructor function */
-) {
+){
int rc, nName;
Module *pMod;
sqlite3_mutex_enter(db->mutex);
- nName = strlen(zName);
+ nName = sqlite3Strlen30(zName);
pMod = (Module *)sqlite3DbMallocRaw(db, sizeof(Module) + nName + 1);
if( pMod ){
+ Module *pDel;
char *zCopy = (char *)(&pMod[1]);
memcpy(zCopy, zName, nName+1);
pMod->zName = zCopy;
pMod->pModule = pModule;
pMod->pAux = pAux;
pMod->xDestroy = xDestroy;
- pMod = (Module *)sqlite3HashInsert(&db->aModule, zCopy, nName, (void*)pMod);
- if( pMod && pMod->xDestroy ){
- pMod->xDestroy(pMod->pAux);
+ pDel = (Module *)sqlite3HashInsert(&db->aModule, zCopy, nName, (void*)pMod);
+ if( pDel && pDel->xDestroy ){
+ pDel->xDestroy(pDel->pAux);
+ }
+ sqlite3DbFree(db, pDel);
+ if( pDel==pMod ){
+ db->mallocFailed = 1;
}
- sqlite3_free(pMod);
sqlite3ResetInternalSchema(db, 0);
+ }else if( xDestroy ){
+ xDestroy(pAux);
}
rc = sqlite3ApiExit(db, SQLITE_OK);
sqlite3_mutex_leave(db->mutex);
@@ -69303,26 +85120,128 @@ SQLITE_API int sqlite3_create_module_v2(
** If a disconnect is attempted while a virtual table is locked,
** the disconnect is deferred until all locks have been removed.
*/
-SQLITE_PRIVATE void sqlite3VtabLock(sqlite3_vtab *pVtab){
- pVtab->nRef++;
+SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){
+ pVTab->nRef++;
+}
+
+
+/*
+** pTab is a pointer to a Table structure representing a virtual-table.
+** Return a pointer to the VTable object used by connection db to access
+** this virtual-table, if one has been created, or NULL otherwise.
+*/
+SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){
+ VTable *pVtab;
+ assert( IsVirtual(pTab) );
+ for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext);
+ return pVtab;
}
/*
-** Unlock a virtual table. When the last lock is removed,
-** disconnect the virtual table.
+** Decrement the ref-count on a virtual table object. When the ref-count
+** reaches zero, call the xDisconnect() method to delete the object.
*/
-SQLITE_PRIVATE void sqlite3VtabUnlock(sqlite3 *db, sqlite3_vtab *pVtab){
- pVtab->nRef--;
- assert(db);
+SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){
+ sqlite3 *db = pVTab->db;
+
+ assert( db );
+ assert( pVTab->nRef>0 );
assert( sqlite3SafetyCheckOk(db) );
- if( pVtab->nRef==0 ){
- if( db->magic==SQLITE_MAGIC_BUSY ){
- (void)sqlite3SafetyOff(db);
- pVtab->pModule->xDisconnect(pVtab);
- (void)sqlite3SafetyOn(db);
- } else {
- pVtab->pModule->xDisconnect(pVtab);
+
+ pVTab->nRef--;
+ if( pVTab->nRef==0 ){
+ sqlite3_vtab *p = pVTab->pVtab;
+ if( p ){
+#ifdef SQLITE_DEBUG
+ if( pVTab->db->magic==SQLITE_MAGIC_BUSY ){
+ (void)sqlite3SafetyOff(db);
+ p->pModule->xDisconnect(p);
+ (void)sqlite3SafetyOn(db);
+ } else
+#endif
+ {
+ p->pModule->xDisconnect(p);
+ }
}
+ sqlite3DbFree(db, pVTab);
+ }
+}
+
+/*
+** Table p is a virtual table. This function moves all elements in the
+** p->pVTable list to the sqlite3.pDisconnect lists of their associated
+** database connections to be disconnected at the next opportunity.
+** Except, if argument db is not NULL, then the entry associated with
+** connection db is left in the p->pVTable list.
+*/
+static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){
+ VTable *pRet = 0;
+ VTable *pVTable = p->pVTable;
+ p->pVTable = 0;
+
+ /* Assert that the mutex (if any) associated with the BtShared database
+ ** that contains table p is held by the caller. See header comments
+ ** above function sqlite3VtabUnlockList() for an explanation of why
+ ** this makes it safe to access the sqlite3.pDisconnect list of any
+ ** database connection that may have an entry in the p->pVTable list. */
+ assert( db==0 ||
+ sqlite3BtreeHoldsMutex(db->aDb[sqlite3SchemaToIndex(db, p->pSchema)].pBt)
+ );
+
+ while( pVTable ){
+ sqlite3 *db2 = pVTable->db;
+ VTable *pNext = pVTable->pNext;
+ assert( db2 );
+ if( db2==db ){
+ pRet = pVTable;
+ p->pVTable = pRet;
+ pRet->pNext = 0;
+ }else{
+ pVTable->pNext = db2->pDisconnect;
+ db2->pDisconnect = pVTable;
+ }
+ pVTable = pNext;
+ }
+
+ assert( !db || pRet );
+ return pRet;
+}
+
+
+/*
+** Disconnect all the virtual table objects in the sqlite3.pDisconnect list.
+**
+** This function may only be called when the mutexes associated with all
+** shared b-tree databases opened using connection db are held by the
+** caller. This is done to protect the sqlite3.pDisconnect list. The
+** sqlite3.pDisconnect list is accessed only as follows:
+**
+** 1) By this function. In this case, all BtShared mutexes and the mutex
+** associated with the database handle itself must be held.
+**
+** 2) By function vtabDisconnectAll(), when it adds a VTable entry to
+** the sqlite3.pDisconnect list. In this case either the BtShared mutex
+** associated with the database the virtual table is stored in is held
+** or, if the virtual table is stored in a non-sharable database, then
+** the database handle mutex is held.
+**
+** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously
+** by multiple threads. It is thread-safe.
+*/
+SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){
+ VTable *p = db->pDisconnect;
+ db->pDisconnect = 0;
+
+ assert( sqlite3BtreeHoldsAllMutexes(db) );
+ assert( sqlite3_mutex_held(db->mutex) );
+
+ if( p ){
+ sqlite3ExpirePreparedStatements(db);
+ do {
+ VTable *pNext = p->pNext;
+ sqlite3VtabUnlock(p);
+ p = pNext;
+ }while( p );
}
}
@@ -69330,20 +85249,24 @@ SQLITE_PRIVATE void sqlite3VtabUnlock(sqlite3 *db, sqlite3_vtab *pVtab){
** Clear any and all virtual-table information from the Table record.
** This routine is called, for example, just before deleting the Table
** record.
+**
+** Since it is a virtual-table, the Table structure contains a pointer
+** to the head of a linked list of VTable structures. Each VTable
+** structure is associated with a single sqlite3* user of the schema.
+** The reference count of the VTable structure associated with database
+** connection db is decremented immediately (which may lead to the
+** structure being xDisconnected and free). Any other VTable structures
+** in the list are moved to the sqlite3.pDisconnect list of the associated
+** database connection.
*/
SQLITE_PRIVATE void sqlite3VtabClear(Table *p){
- sqlite3_vtab *pVtab = p->pVtab;
- if( pVtab ){
- assert( p->pMod && p->pMod->pModule );
- sqlite3VtabUnlock(p->pSchema->db, pVtab);
- p->pVtab = 0;
- }
+ vtabDisconnectAll(0, p);
if( p->azModuleArg ){
int i;
for(i=0; i<p->nModuleArg; i++){
- sqlite3_free(p->azModuleArg[i]);
+ sqlite3DbFree(p->dbMem, p->azModuleArg[i]);
}
- sqlite3_free(p->azModuleArg);
+ sqlite3DbFree(p->dbMem, p->azModuleArg);
}
}
@@ -69361,10 +85284,10 @@ static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){
if( azModuleArg==0 ){
int j;
for(j=0; j<i; j++){
- sqlite3_free(pTable->azModuleArg[j]);
+ sqlite3DbFree(db, pTable->azModuleArg[j]);
}
- sqlite3_free(zArg);
- sqlite3_free(pTable->azModuleArg);
+ sqlite3DbFree(db, zArg);
+ sqlite3DbFree(db, pTable->azModuleArg);
pTable->nModuleArg = 0;
}else{
azModuleArg[i] = zArg;
@@ -69388,26 +85311,21 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
Table *pTable; /* The new virtual table */
sqlite3 *db; /* Database connection */
- if( pParse->db->flags & SQLITE_SharedCache ){
- sqlite3ErrorMsg(pParse, "Cannot use virtual tables in shared-cache mode");
- return;
- }
-
sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, 0);
pTable = pParse->pNewTable;
- if( pTable==0 || pParse->nErr ) return;
+ if( pTable==0 ) return;
assert( 0==pTable->pIndex );
db = pParse->db;
iDb = sqlite3SchemaToIndex(db, pTable->pSchema);
assert( iDb>=0 );
- pTable->isVirtual = 1;
+ pTable->tabFlags |= TF_Virtual;
pTable->nModuleArg = 0;
addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName));
addModuleArgument(db, pTable, sqlite3DbStrDup(db, db->aDb[iDb].zName));
addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName));
- pParse->sNameToken.n = pModuleName->z + pModuleName->n - pName1->z;
+ pParse->sNameToken.n = (int)(&pModuleName->z[pModuleName->n] - pName1->z);
#ifndef SQLITE_OMIT_AUTHORIZATION
/* Creating a virtual table invokes the authorization callback twice.
@@ -69428,7 +85346,7 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse(
** virtual table currently under construction in pParse->pTable.
*/
static void addArgumentToVtab(Parse *pParse){
- if( pParse->sArg.z && pParse->pNewTable ){
+ if( pParse->sArg.z && ALWAYS(pParse->pNewTable) ){
const char *z = (const char*)pParse->sArg.z;
int n = pParse->sArg.n;
sqlite3 *db = pParse->db;
@@ -69441,22 +85359,13 @@ static void addArgumentToVtab(Parse *pParse){
** has been completely parsed.
*/
SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
- Table *pTab; /* The table being constructed */
- sqlite3 *db; /* The database connection */
- char *zModule; /* The module name of the table: USING modulename */
- Module *pMod = 0;
+ Table *pTab = pParse->pNewTable; /* The table being constructed */
+ sqlite3 *db = pParse->db; /* The database connection */
+ if( pTab==0 ) return;
addArgumentToVtab(pParse);
pParse->sArg.z = 0;
-
- /* Lookup the module name. */
- pTab = pParse->pNewTable;
- if( pTab==0 ) return;
- db = pParse->db;
if( pTab->nModuleArg<1 ) return;
- zModule = pTab->azModuleArg[0];
- pMod = (Module *)sqlite3HashFind(&db->aModule, zModule, strlen(zModule));
- pTab->pMod = pMod;
/* If the CREATE VIRTUAL TABLE statement is being entered for the
** first time (in other words if the virtual table is actually being
@@ -69472,7 +85381,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
/* Compute the complete text of the CREATE VIRTUAL TABLE statement */
if( pEnd ){
- pParse->sNameToken.n = pEnd->z - pParse->sNameToken.z + pEnd->n;
+ pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n;
}
zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken);
@@ -69495,7 +85404,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
zStmt,
pParse->regRowid
);
- sqlite3_free(zStmt);
+ sqlite3DbFree(db, zStmt);
v = sqlite3GetVdbe(pParse);
sqlite3ChangeCookie(pParse, iDb);
@@ -69503,18 +85412,19 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
zWhere = sqlite3MPrintf(db, "name='%q'", pTab->zName);
sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 1, 0, zWhere, P4_DYNAMIC);
sqlite3VdbeAddOp4(v, OP_VCreate, iDb, 0, 0,
- pTab->zName, strlen(pTab->zName) + 1);
+ pTab->zName, sqlite3Strlen30(pTab->zName) + 1);
}
/* If we are rereading the sqlite_master table create the in-memory
- ** record of the table. If the module has already been registered,
- ** also call the xConnect method here.
- */
+ ** record of the table. The xConnect() method is not called until
+ ** the first time the virtual table is used in an SQL statement. This
+ ** allows a schema that contains virtual tables to be loaded before
+ ** the required virtual table implementations are registered. */
else {
Table *pOld;
Schema *pSchema = pTab->pSchema;
const char *zName = pTab->zName;
- int nName = strlen(zName) + 1;
+ int nName = sqlite3Strlen30(zName);
pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab);
if( pOld ){
db->mallocFailed = 1;
@@ -69547,7 +85457,7 @@ SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){
pArg->n = p->n;
}else{
assert(pArg->z < p->z);
- pArg->n = (p->z + p->n - pArg->z);
+ pArg->n = (int)(&p->z[p->n] - pArg->z);
}
}
@@ -69563,9 +85473,8 @@ static int vtabCallConstructor(
int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),
char **pzErr
){
+ VTable *pVTable;
int rc;
- int rc2;
- sqlite3_vtab *pVtab = 0;
const char *const*azArg = (const char *const*)pTab->azModuleArg;
int nArg = pTab->nModuleArg;
char *zErr = 0;
@@ -69575,75 +85484,86 @@ static int vtabCallConstructor(
return SQLITE_NOMEM;
}
+ pVTable = sqlite3DbMallocZero(db, sizeof(VTable));
+ if( !pVTable ){
+ sqlite3DbFree(db, zModuleName);
+ return SQLITE_NOMEM;
+ }
+ pVTable->db = db;
+ pVTable->pMod = pMod;
+
assert( !db->pVTab );
assert( xConstruct );
-
db->pVTab = pTab;
- rc = sqlite3SafetyOff(db);
- assert( rc==SQLITE_OK );
- rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVtab, &zErr);
- rc2 = sqlite3SafetyOn(db);
- if( rc==SQLITE_OK && pVtab ){
- pVtab->pModule = pMod->pModule;
- pVtab->nRef = 1;
- pTab->pVtab = pVtab;
- }
+
+ /* Invoke the virtual table constructor */
+ (void)sqlite3SafetyOff(db);
+ rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);
+ (void)sqlite3SafetyOn(db);
+ if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
if( SQLITE_OK!=rc ){
if( zErr==0 ){
*pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);
}else {
*pzErr = sqlite3MPrintf(db, "%s", zErr);
- sqlite3_free(zErr);
- }
- }else if( db->pVTab ){
- const char *zFormat = "vtable constructor did not declare schema: %s";
- *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);
- rc = SQLITE_ERROR;
- }
- if( rc==SQLITE_OK ){
- rc = rc2;
- }
- db->pVTab = 0;
- sqlite3_free(zModuleName);
+ sqlite3DbFree(db, zErr);
+ }
+ sqlite3DbFree(db, pVTable);
+ }else if( ALWAYS(pVTable->pVtab) ){
+ /* Justification of ALWAYS(): A correct vtab constructor must allocate
+ ** the sqlite3_vtab object if successful. */
+ pVTable->pVtab->pModule = pMod->pModule;
+ pVTable->nRef = 1;
+ if( db->pVTab ){
+ const char *zFormat = "vtable constructor did not declare schema: %s";
+ *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);
+ sqlite3VtabUnlock(pVTable);
+ rc = SQLITE_ERROR;
+ }else{
+ int iCol;
+ /* If everything went according to plan, link the new VTable structure
+ ** into the linked list headed by pTab->pVTable. Then loop through the
+ ** columns of the table to see if any of them contain the token "hidden".
+ ** If so, set the Column.isHidden flag and remove the token from
+ ** the type string. */
+ pVTable->pNext = pTab->pVTable;
+ pTab->pVTable = pVTable;
- /* If everything went according to plan, loop through the columns
- ** of the table to see if any of them contain the token "hidden".
- ** If so, set the Column.isHidden flag and remove the token from
- ** the type string.
- */
- if( rc==SQLITE_OK ){
- int iCol;
- for(iCol=0; iCol<pTab->nCol; iCol++){
- char *zType = pTab->aCol[iCol].zType;
- int nType;
- int i = 0;
- if( !zType ) continue;
- nType = strlen(zType);
- if( sqlite3StrNICmp("hidden", zType, 6) || (zType[6] && zType[6]!=' ') ){
- for(i=0; i<nType; i++){
- if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7))
- && (zType[i+7]=='\0' || zType[i+7]==' ')
- ){
- i++;
- break;
+ for(iCol=0; iCol<pTab->nCol; iCol++){
+ char *zType = pTab->aCol[iCol].zType;
+ int nType;
+ int i = 0;
+ if( !zType ) continue;
+ nType = sqlite3Strlen30(zType);
+ if( sqlite3StrNICmp("hidden", zType, 6)||(zType[6] && zType[6]!=' ') ){
+ for(i=0; i<nType; i++){
+ if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7))
+ && (zType[i+7]=='\0' || zType[i+7]==' ')
+ ){
+ i++;
+ break;
+ }
}
}
- }
- if( i<nType ){
- int j;
- int nDel = 6 + (zType[i+6] ? 1 : 0);
- for(j=i; (j+nDel)<=nType; j++){
- zType[j] = zType[j+nDel];
- }
- if( zType[i]=='\0' && i>0 ){
- assert(zType[i-1]==' ');
- zType[i-1] = '\0';
+ if( i<nType ){
+ int j;
+ int nDel = 6 + (zType[i+6] ? 1 : 0);
+ for(j=i; (j+nDel)<=nType; j++){
+ zType[j] = zType[j+nDel];
+ }
+ if( zType[i]=='\0' && i>0 ){
+ assert(zType[i-1]==' ');
+ zType[i-1] = '\0';
+ }
+ pTab->aCol[iCol].isHidden = 1;
}
- pTab->aCol[iCol].isHidden = 1;
}
}
}
+
+ sqlite3DbFree(db, zModuleName);
+ db->pVTab = 0;
return rc;
}
@@ -69655,40 +85575,45 @@ static int vtabCallConstructor(
** This call is a no-op if table pTab is not a virtual table.
*/
SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){
+ sqlite3 *db = pParse->db;
+ const char *zMod;
Module *pMod;
- int rc = SQLITE_OK;
+ int rc;
- if( !pTab || !pTab->isVirtual || pTab->pVtab ){
+ assert( pTab );
+ if( (pTab->tabFlags & TF_Virtual)==0 || sqlite3GetVTable(db, pTab) ){
return SQLITE_OK;
}
- pMod = pTab->pMod;
+ /* Locate the required virtual table module */
+ zMod = pTab->azModuleArg[0];
+ pMod = (Module*)sqlite3HashFind(&db->aModule, zMod, sqlite3Strlen30(zMod));
+
if( !pMod ){
const char *zModule = pTab->azModuleArg[0];
sqlite3ErrorMsg(pParse, "no such module: %s", zModule);
rc = SQLITE_ERROR;
- } else {
+ }else{
char *zErr = 0;
- sqlite3 *db = pParse->db;
rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr);
if( rc!=SQLITE_OK ){
sqlite3ErrorMsg(pParse, "%s", zErr);
}
- sqlite3_free(zErr);
+ sqlite3DbFree(db, zErr);
}
return rc;
}
/*
-** Add the virtual table pVtab to the array sqlite3.aVTrans[].
+** Add the virtual table pVTab to the array sqlite3.aVTrans[].
*/
-static int addToVTrans(sqlite3 *db, sqlite3_vtab *pVtab){
+static int addToVTrans(sqlite3 *db, VTable *pVTab){
const int ARRAY_INCR = 5;
/* Grow the sqlite3.aVTrans array if required */
if( (db->nVTrans%ARRAY_INCR)==0 ){
- sqlite3_vtab **aVTrans;
+ VTable **aVTrans;
int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR);
aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes);
if( !aVTrans ){
@@ -69699,8 +85624,8 @@ static int addToVTrans(sqlite3 *db, sqlite3_vtab *pVtab){
}
/* Add pVtab to the end of sqlite3.aVTrans */
- db->aVTrans[db->nVTrans++] = pVtab;
- sqlite3VtabLock(pVtab);
+ db->aVTrans[db->nVTrans++] = pVTab;
+ sqlite3VtabLock(pVTab);
return SQLITE_OK;
}
@@ -69710,32 +85635,36 @@ static int addToVTrans(sqlite3 *db, sqlite3_vtab *pVtab){
**
** If an error occurs, *pzErr is set to point an an English language
** description of the error and an SQLITE_XXX error code is returned.
-** In this case the caller must call sqlite3_free() on *pzErr.
+** In this case the caller must call sqlite3DbFree(db, ) on *pzErr.
*/
SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){
int rc = SQLITE_OK;
Table *pTab;
Module *pMod;
- const char *zModule;
+ const char *zMod;
pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
- assert(pTab && pTab->isVirtual && !pTab->pVtab);
- pMod = pTab->pMod;
- zModule = pTab->azModuleArg[0];
+ assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable );
+
+ /* Locate the required virtual table module */
+ zMod = pTab->azModuleArg[0];
+ pMod = (Module*)sqlite3HashFind(&db->aModule, zMod, sqlite3Strlen30(zMod));
/* If the module has been registered and includes a Create method,
** invoke it now. If the module has not been registered, return an
** error. Otherwise, do nothing.
*/
if( !pMod ){
- *pzErr = sqlite3MPrintf(db, "no such module: %s", zModule);
+ *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod);
rc = SQLITE_ERROR;
}else{
rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr);
}
- if( rc==SQLITE_OK && pTab->pVtab ){
- rc = addToVTrans(db, pTab->pVtab);
+ /* Justification of ALWAYS(): The xConstructor method is required to
+ ** create a valid sqlite3_vtab if it returns SQLITE_OK. */
+ if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){
+ rc = addToVTrans(db, sqlite3GetVTable(db, pTab));
}
return rc;
@@ -69747,7 +85676,7 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab,
** virtual table module.
*/
SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
- Parse sParse;
+ Parse *pParse;
int rc = SQLITE_OK;
Table *pTab;
@@ -69760,33 +85689,41 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
sqlite3_mutex_leave(db->mutex);
return SQLITE_MISUSE;
}
- assert(pTab->isVirtual && pTab->nCol==0 && pTab->aCol==0);
-
- memset(&sParse, 0, sizeof(Parse));
- sParse.declareVtab = 1;
- sParse.db = db;
+ assert( (pTab->tabFlags & TF_Virtual)!=0 );
- if(
- SQLITE_OK == sqlite3RunParser(&sParse, zCreateTable, &zErr) &&
- sParse.pNewTable &&
- !sParse.pNewTable->pSelect &&
- !sParse.pNewTable->isVirtual
- ){
- pTab->aCol = sParse.pNewTable->aCol;
- pTab->nCol = sParse.pNewTable->nCol;
- sParse.pNewTable->nCol = 0;
- sParse.pNewTable->aCol = 0;
- db->pVTab = 0;
- } else {
- sqlite3Error(db, SQLITE_ERROR, zErr);
- sqlite3_free(zErr);
- rc = SQLITE_ERROR;
+ pParse = sqlite3StackAllocZero(db, sizeof(*pParse));
+ if( pParse==0 ){
+ rc = SQLITE_NOMEM;
+ }else{
+ pParse->declareVtab = 1;
+ pParse->db = db;
+
+ if(
+ SQLITE_OK == sqlite3RunParser(pParse, zCreateTable, &zErr) &&
+ pParse->pNewTable &&
+ !pParse->pNewTable->pSelect &&
+ (pParse->pNewTable->tabFlags & TF_Virtual)==0
+ ){
+ if( !pTab->aCol ){
+ pTab->aCol = pParse->pNewTable->aCol;
+ pTab->nCol = pParse->pNewTable->nCol;
+ pParse->pNewTable->nCol = 0;
+ pParse->pNewTable->aCol = 0;
+ }
+ db->pVTab = 0;
+ } else {
+ sqlite3Error(db, SQLITE_ERROR, zErr);
+ sqlite3DbFree(db, zErr);
+ rc = SQLITE_ERROR;
+ }
+ pParse->declareVtab = 0;
+
+ if( pParse->pVdbe ){
+ sqlite3VdbeFinalize(pParse->pVdbe);
+ }
+ sqlite3DeleteTable(pParse->pNewTable);
+ sqlite3StackFree(db, pParse);
}
- sParse.declareVtab = 0;
-
- sqlite3_finalize((sqlite3_stmt*)sParse.pVdbe);
- sqlite3DeleteTable(sParse.pNewTable);
- sParse.pNewTable = 0;
assert( (rc&0xff)==rc );
rc = sqlite3ApiExit(db, rc);
@@ -69801,30 +85738,25 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
**
** This call is a no-op if zTab is not a virtual table.
*/
-SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab)
-{
+SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){
int rc = SQLITE_OK;
Table *pTab;
pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
- assert(pTab);
- if( pTab->pVtab ){
- int (*xDestroy)(sqlite3_vtab *pVTab) = pTab->pMod->pModule->xDestroy;
+ if( ALWAYS(pTab!=0 && pTab->pVTable!=0) ){
+ VTable *p = vtabDisconnectAll(db, pTab);
+
rc = sqlite3SafetyOff(db);
assert( rc==SQLITE_OK );
- if( xDestroy ){
- rc = xDestroy(pTab->pVtab);
- }
+ rc = p->pMod->pModule->xDestroy(p->pVtab);
(void)sqlite3SafetyOn(db);
+
+ /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */
if( rc==SQLITE_OK ){
- int i;
- for(i=0; i<db->nVTrans; i++){
- if( db->aVTrans[i]==pTab->pVtab ){
- db->aVTrans[i] = db->aVTrans[--db->nVTrans];
- break;
- }
- }
- pTab->pVtab = 0;
+ assert( pTab->pVTable==p && p->pNext==0 );
+ p->pVtab = 0;
+ pTab->pVTable = 0;
+ sqlite3VtabUnlock(p);
}
}
@@ -69842,40 +85774,46 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab
static void callFinaliser(sqlite3 *db, int offset){
int i;
if( db->aVTrans ){
- for(i=0; i<db->nVTrans && db->aVTrans[i]; i++){
- sqlite3_vtab *pVtab = db->aVTrans[i];
- int (*x)(sqlite3_vtab *);
- x = *(int (**)(sqlite3_vtab *))((char *)pVtab->pModule + offset);
- if( x ) x(pVtab);
- sqlite3VtabUnlock(db, pVtab);
- }
- sqlite3_free(db->aVTrans);
+ for(i=0; i<db->nVTrans; i++){
+ VTable *pVTab = db->aVTrans[i];
+ sqlite3_vtab *p = pVTab->pVtab;
+ if( p ){
+ int (*x)(sqlite3_vtab *);
+ x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset);
+ if( x ) x(p);
+ }
+ sqlite3VtabUnlock(pVTab);
+ }
+ sqlite3DbFree(db, db->aVTrans);
db->nVTrans = 0;
db->aVTrans = 0;
}
}
/*
-** If argument rc2 is not SQLITE_OK, then return it and do nothing.
-** Otherwise, invoke the xSync method of all virtual tables in the
-** sqlite3.aVTrans array. Return the error code for the first error
-** that occurs, or SQLITE_OK if all xSync operations are successful.
+** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans
+** array. Return the error code for the first error that occurs, or
+** SQLITE_OK if all xSync operations are successful.
+**
+** Set *pzErrmsg to point to a buffer that should be released using
+** sqlite3DbFree() containing an error message, if one is available.
*/
-SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, int rc2){
+SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **pzErrmsg){
int i;
int rc = SQLITE_OK;
int rcsafety;
- sqlite3_vtab **aVTrans = db->aVTrans;
- if( rc2!=SQLITE_OK ) return rc2;
+ VTable **aVTrans = db->aVTrans;
rc = sqlite3SafetyOff(db);
db->aVTrans = 0;
- for(i=0; rc==SQLITE_OK && i<db->nVTrans && aVTrans[i]; i++){
- sqlite3_vtab *pVtab = aVTrans[i];
+ for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){
int (*x)(sqlite3_vtab *);
- x = pVtab->pModule->xSync;
- if( x ){
+ sqlite3_vtab *pVtab = aVTrans[i]->pVtab;
+ if( pVtab && (x = pVtab->pModule->xSync)!=0 ){
rc = x(pVtab);
+ sqlite3DbFree(db, *pzErrmsg);
+ *pzErrmsg = pVtab->zErrMsg;
+ pVtab->zErrMsg = 0;
}
}
db->aVTrans = aVTrans;
@@ -69913,7 +85851,7 @@ SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){
** If the xBegin call is successful, place the sqlite3_vtab pointer
** in the sqlite3.aVTrans array.
*/
-SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, sqlite3_vtab *pVtab){
+SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){
int rc = SQLITE_OK;
const sqlite3_module *pModule;
@@ -69922,32 +85860,30 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, sqlite3_vtab *pVtab){
** virtual module xSync() callback. It is illegal to write to
** virtual module tables in this case, so return SQLITE_LOCKED.
*/
- if( 0==db->aVTrans && db->nVTrans>0 ){
+ if( sqlite3VtabInSync(db) ){
return SQLITE_LOCKED;
}
- if( !pVtab ){
+ if( !pVTab ){
return SQLITE_OK;
}
- pModule = pVtab->pModule;
+ pModule = pVTab->pVtab->pModule;
if( pModule->xBegin ){
int i;
/* If pVtab is already in the aVTrans array, return early */
- for(i=0; (i<db->nVTrans) && 0!=db->aVTrans[i]; i++){
- if( db->aVTrans[i]==pVtab ){
+ for(i=0; i<db->nVTrans; i++){
+ if( db->aVTrans[i]==pVTab ){
return SQLITE_OK;
}
}
/* Invoke the xBegin method */
- rc = pModule->xBegin(pVtab);
- if( rc!=SQLITE_OK ){
- return rc;
+ rc = pModule->xBegin(pVTab->pVtab);
+ if( rc==SQLITE_OK ){
+ rc = addToVTrans(db, pVTab);
}
-
- rc = addToVTrans(db, pVtab);
}
return rc;
}
@@ -69974,8 +85910,8 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
Table *pTab;
sqlite3_vtab *pVtab;
sqlite3_module *pMod;
- void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
- void *pArg;
+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**) = 0;
+ void *pArg = 0;
FuncDef *pNew;
int rc = 0;
char *zLowerName;
@@ -69983,12 +85919,12 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
/* Check to see the left operand is a column in a virtual table */
- if( pExpr==0 ) return pDef;
+ if( NEVER(pExpr==0) ) return pDef;
if( pExpr->op!=TK_COLUMN ) return pDef;
pTab = pExpr->pTab;
- if( pTab==0 ) return pDef;
- if( !pTab->isVirtual ) return pDef;
- pVtab = pTab->pVtab;
+ if( NEVER(pTab==0) ) return pDef;
+ if( (pTab->tabFlags & TF_Virtual)==0 ) return pDef;
+ pVtab = sqlite3GetVTable(db, pTab)->pVtab;
assert( pVtab!=0 );
assert( pVtab->pModule!=0 );
pMod = (sqlite3_module *)pVtab->pModule;
@@ -70003,7 +85939,7 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
*z = sqlite3UpperToLower[*z];
}
rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xFunc, &pArg);
- sqlite3_free(zLowerName);
+ sqlite3DbFree(db, zLowerName);
}
if( rc==0 ){
return pDef;
@@ -70011,12 +85947,14 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
/* Create a new ephemeral function definition for the overloaded
** function */
- pNew = sqlite3DbMallocZero(db, sizeof(*pNew) + strlen(pDef->zName) );
+ pNew = sqlite3DbMallocZero(db, sizeof(*pNew)
+ + sqlite3Strlen30(pDef->zName) + 1);
if( pNew==0 ){
return pDef;
}
*pNew = *pDef;
- memcpy(pNew->zName, pDef->zName, strlen(pDef->zName)+1);
+ pNew->zName = (char *)&pNew[1];
+ memcpy(pNew->zName, pDef->zName, sqlite3Strlen30(pDef->zName)+1);
pNew->xFunc = xFunc;
pNew->pUserData = pArg;
pNew->flags |= SQLITE_FUNC_EPHEM;
@@ -70030,17 +85968,21 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
** is a no-op.
*/
SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){
+ Parse *pToplevel = sqlite3ParseToplevel(pParse);
int i, n;
+ Table **apVtabLock;
+
assert( IsVirtual(pTab) );
- for(i=0; i<pParse->nVtabLock; i++){
- if( pTab==pParse->apVtabLock[i] ) return;
- }
- n = (pParse->nVtabLock+1)*sizeof(pParse->apVtabLock[0]);
- pParse->apVtabLock = sqlite3_realloc(pParse->apVtabLock, n);
- if( pParse->apVtabLock ){
- pParse->apVtabLock[pParse->nVtabLock++] = pTab;
+ for(i=0; i<pToplevel->nVtabLock; i++){
+ if( pTab==pToplevel->apVtabLock[i] ) return;
+ }
+ n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]);
+ apVtabLock = sqlite3_realloc(pToplevel->apVtabLock, n);
+ if( apVtabLock ){
+ pToplevel->apVtabLock = apVtabLock;
+ pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab;
}else{
- pParse->db->mallocFailed = 1;
+ pToplevel->db->mallocFailed = 1;
}
}
@@ -70060,25 +86002,22 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){
**
*************************************************************************
** This module contains C code that generates VDBE code used to process
-** the WHERE clause of SQL statements. This module is reponsible for
+** the WHERE clause of SQL statements. This module is responsible for
** generating the code that loops through a table looking for applicable
** rows. Indices are selected and used to speed the search when doing
** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer".
**
-** $Id: where.c,v 1.302 2008/04/19 14:40:44 drh Exp $
-*/
-
-/*
-** The number of bits in a Bitmask. "BMS" means "BitMask Size".
+** $Id: where.c,v 1.411 2009/07/31 06:14:52 danielk1977 Exp $
*/
-#define BMS (sizeof(Bitmask)*8)
/*
** Trace output macros
*/
#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
SQLITE_PRIVATE int sqlite3WhereTrace = 0;
+#endif
+#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
# define WHERETRACE(X) if(sqlite3WhereTrace) sqlite3DebugPrintf X
#else
# define WHERETRACE(X)
@@ -70087,12 +86026,16 @@ SQLITE_PRIVATE int sqlite3WhereTrace = 0;
/* Forward reference
*/
typedef struct WhereClause WhereClause;
-typedef struct ExprMaskSet ExprMaskSet;
+typedef struct WhereMaskSet WhereMaskSet;
+typedef struct WhereOrInfo WhereOrInfo;
+typedef struct WhereAndInfo WhereAndInfo;
+typedef struct WhereCost WhereCost;
/*
** The query generator uses an array of instances of this structure to
** help it analyze the subexpressions of the WHERE clause. Each WHERE
-** clause subexpression is separated from the others by an AND operator.
+** clause subexpression is separated from the others by AND operators,
+** usually, or sometimes subexpressions separated by OR.
**
** All WhereTerms are collected into a single WhereClause structure.
** The following identity holds:
@@ -70104,46 +86047,69 @@ typedef struct ExprMaskSet ExprMaskSet;
** X <op> <expr>
**
** where X is a column name and <op> is one of certain operators,
-** then WhereTerm.leftCursor and WhereTerm.leftColumn record the
-** cursor number and column number for X. WhereTerm.operator records
+** then WhereTerm.leftCursor and WhereTerm.u.leftColumn record the
+** cursor number and column number for X. WhereTerm.eOperator records
** the <op> using a bitmask encoding defined by WO_xxx below. The
** use of a bitmask encoding for the operator allows us to search
** quickly for terms that match any of several different operators.
**
-** prereqRight and prereqAll record sets of cursor numbers,
-** but they do so indirectly. A single ExprMaskSet structure translates
+** A WhereTerm might also be two or more subterms connected by OR:
+**
+** (t1.X <op> <expr>) OR (t1.Y <op> <expr>) OR ....
+**
+** In this second case, wtFlag as the TERM_ORINFO set and eOperator==WO_OR
+** and the WhereTerm.u.pOrInfo field points to auxiliary information that
+** is collected about the
+**
+** If a term in the WHERE clause does not match either of the two previous
+** categories, then eOperator==0. The WhereTerm.pExpr field is still set
+** to the original subexpression content and wtFlags is set up appropriately
+** but no other fields in the WhereTerm object are meaningful.
+**
+** When eOperator!=0, prereqRight and prereqAll record sets of cursor numbers,
+** but they do so indirectly. A single WhereMaskSet structure translates
** cursor number into bits and the translated bit is stored in the prereq
** fields. The translation is used in order to maximize the number of
** bits that will fit in a Bitmask. The VDBE cursor numbers might be
** spread out over the non-negative integers. For example, the cursor
-** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The ExprMaskSet
+** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The WhereMaskSet
** translates these sparse cursor numbers into consecutive integers
** beginning with 0 in order to make the best possible use of the available
** bits in the Bitmask. So, in the example above, the cursor numbers
** would be mapped into integers 0 through 7.
+**
+** The number of terms in a join is limited by the number of bits
+** in prereqRight and prereqAll. The default is 64 bits, hence SQLite
+** is only able to process joins with 64 or fewer tables.
*/
typedef struct WhereTerm WhereTerm;
struct WhereTerm {
- Expr *pExpr; /* Pointer to the subexpression */
- i16 iParent; /* Disable pWC->a[iParent] when this term disabled */
- i16 leftCursor; /* Cursor number of X in "X <op> <expr>" */
- i16 leftColumn; /* Column number of X in "X <op> <expr>" */
+ Expr *pExpr; /* Pointer to the subexpression that is this term */
+ int iParent; /* Disable pWC->a[iParent] when this term disabled */
+ int leftCursor; /* Cursor number of X in "X <op> <expr>" */
+ union {
+ int leftColumn; /* Column number of X in "X <op> <expr>" */
+ WhereOrInfo *pOrInfo; /* Extra information if eOperator==WO_OR */
+ WhereAndInfo *pAndInfo; /* Extra information if eOperator==WO_AND */
+ } u;
u16 eOperator; /* A WO_xx value describing <op> */
- u8 flags; /* Bit flags. See below */
+ u8 wtFlags; /* TERM_xxx bit flags. See below */
u8 nChild; /* Number of children that must disable us */
WhereClause *pWC; /* The clause this term is part of */
- Bitmask prereqRight; /* Bitmask of tables used by pRight */
- Bitmask prereqAll; /* Bitmask of tables referenced by p */
+ Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */
+ Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */
};
/*
-** Allowed values of WhereTerm.flags
+** Allowed values of WhereTerm.wtFlags
*/
-#define TERM_DYNAMIC 0x01 /* Need to call sqlite3ExprDelete(pExpr) */
+#define TERM_DYNAMIC 0x01 /* Need to call sqlite3ExprDelete(db, pExpr) */
#define TERM_VIRTUAL 0x02 /* Added by the optimizer. Do not code */
#define TERM_CODED 0x04 /* This term is already coded */
#define TERM_COPIED 0x08 /* Has a child */
-#define TERM_OR_OK 0x10 /* Used during OR-clause processing */
+#define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */
+#define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */
+#define TERM_OR_OK 0x40 /* Used during OR-clause processing */
/*
** An instance of the following structure holds all information about a
@@ -70151,11 +86117,34 @@ struct WhereTerm {
*/
struct WhereClause {
Parse *pParse; /* The parser context */
- ExprMaskSet *pMaskSet; /* Mapping of table indices to bitmasks */
+ WhereMaskSet *pMaskSet; /* Mapping of table cursor numbers to bitmasks */
+ Bitmask vmask; /* Bitmask identifying virtual table cursors */
+ u8 op; /* Split operator. TK_AND or TK_OR */
int nTerm; /* Number of terms */
int nSlot; /* Number of entries in a[] */
WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */
- WhereTerm aStatic[10]; /* Initial static space for a[] */
+#if defined(SQLITE_SMALL_STACK)
+ WhereTerm aStatic[1]; /* Initial static space for a[] */
+#else
+ WhereTerm aStatic[8]; /* Initial static space for a[] */
+#endif
+};
+
+/*
+** A WhereTerm with eOperator==WO_OR has its u.pOrInfo pointer set to
+** a dynamically allocated instance of the following structure.
+*/
+struct WhereOrInfo {
+ WhereClause wc; /* Decomposition into subterms */
+ Bitmask indexable; /* Bitmask of all indexable tables in the clause */
+};
+
+/*
+** A WhereTerm with eOperator==WO_AND has its u.pAndInfo pointer set to
+** a dynamically allocated instance of the following structure.
+*/
+struct WhereAndInfo {
+ WhereClause wc; /* The subexpression broken out */
};
/*
@@ -70170,11 +86159,11 @@ struct WhereClause {
** from the sparse cursor numbers into consecutive integers beginning
** with 0.
**
-** If ExprMaskSet.ix[A]==B it means that The A-th bit of a Bitmask
+** If WhereMaskSet.ix[A]==B it means that The A-th bit of a Bitmask
** corresponds VDBE cursor number B. The A-th bit of a bitmask is 1<<A.
**
** For example, if the WHERE clause expression used these VDBE
-** cursors: 4, 5, 8, 29, 57, 73. Then the ExprMaskSet structure
+** cursors: 4, 5, 8, 29, 57, 73. Then the WhereMaskSet structure
** would map those cursor numbers into bits 0 through 5.
**
** Note that the mapping is not necessarily ordered. In the example
@@ -70184,49 +86173,70 @@ struct WhereClause {
** numbers all get mapped into bit numbers that begin with 0 and contain
** no gaps.
*/
-struct ExprMaskSet {
+struct WhereMaskSet {
int n; /* Number of assigned cursor values */
- int ix[sizeof(Bitmask)*8]; /* Cursor assigned to each bit */
+ int ix[BMS]; /* Cursor assigned to each bit */
};
+/*
+** A WhereCost object records a lookup strategy and the estimated
+** cost of pursuing that strategy.
+*/
+struct WhereCost {
+ WherePlan plan; /* The lookup strategy */
+ double rCost; /* Overall cost of pursuing this search strategy */
+ double nRow; /* Estimated number of output rows */
+ Bitmask used; /* Bitmask of cursors used by this plan */
+};
/*
** Bitmasks for the operators that indices are able to exploit. An
** OR-ed combination of these values can be used when searching for
** terms in the where clause.
*/
-#define WO_IN 1
-#define WO_EQ 2
+#define WO_IN 0x001
+#define WO_EQ 0x002
#define WO_LT (WO_EQ<<(TK_LT-TK_EQ))
#define WO_LE (WO_EQ<<(TK_LE-TK_EQ))
#define WO_GT (WO_EQ<<(TK_GT-TK_EQ))
#define WO_GE (WO_EQ<<(TK_GE-TK_EQ))
-#define WO_MATCH 64
-#define WO_ISNULL 128
+#define WO_MATCH 0x040
+#define WO_ISNULL 0x080
+#define WO_OR 0x100 /* Two or more OR-connected terms */
+#define WO_AND 0x200 /* Two or more AND-connected terms */
+
+#define WO_ALL 0xfff /* Mask of all possible WO_* values */
+#define WO_SINGLE 0x0ff /* Mask of all non-compound WO_* values */
/*
-** Value for flags returned by bestIndex().
+** Value for wsFlags returned by bestIndex() and stored in
+** WhereLevel.wsFlags. These flags determine which search
+** strategies are appropriate.
**
-** The least significant byte is reserved as a mask for WO_ values above.
-** The WhereLevel.flags field is usually set to WO_IN|WO_EQ|WO_ISNULL.
-** But if the table is the right table of a left join, WhereLevel.flags
-** is set to WO_IN|WO_EQ. The WhereLevel.flags field can then be used as
+** The least significant 12 bits is reserved as a mask for WO_ values above.
+** The WhereLevel.wsFlags field is usually set to WO_IN|WO_EQ|WO_ISNULL.
+** But if the table is the right table of a left join, WhereLevel.wsFlags
+** is set to WO_IN|WO_EQ. The WhereLevel.wsFlags field can then be used as
** the "op" parameter to findTerm when we are resolving equality constraints.
** ISNULL constraints will then not be used on the right table of a left
** join. Tickets #2177 and #2189.
*/
-#define WHERE_ROWID_EQ 0x000100 /* rowid=EXPR or rowid IN (...) */
-#define WHERE_ROWID_RANGE 0x000200 /* rowid<EXPR and/or rowid>EXPR */
-#define WHERE_COLUMN_EQ 0x001000 /* x=EXPR or x IN (...) */
-#define WHERE_COLUMN_RANGE 0x002000 /* x<EXPR and/or x>EXPR */
-#define WHERE_COLUMN_IN 0x004000 /* x IN (...) */
-#define WHERE_TOP_LIMIT 0x010000 /* x<EXPR or x<=EXPR constraint */
-#define WHERE_BTM_LIMIT 0x020000 /* x>EXPR or x>=EXPR constraint */
-#define WHERE_IDX_ONLY 0x080000 /* Use index only - omit table */
-#define WHERE_ORDERBY 0x100000 /* Output will appear in correct order */
-#define WHERE_REVERSE 0x200000 /* Scan in reverse order */
-#define WHERE_UNIQUE 0x400000 /* Selects no more than one row */
-#define WHERE_VIRTUALTABLE 0x800000 /* Use virtual-table processing */
+#define WHERE_ROWID_EQ 0x00001000 /* rowid=EXPR or rowid IN (...) */
+#define WHERE_ROWID_RANGE 0x00002000 /* rowid<EXPR and/or rowid>EXPR */
+#define WHERE_COLUMN_EQ 0x00010000 /* x=EXPR or x IN (...) or x IS NULL */
+#define WHERE_COLUMN_RANGE 0x00020000 /* x<EXPR and/or x>EXPR */
+#define WHERE_COLUMN_IN 0x00040000 /* x IN (...) */
+#define WHERE_COLUMN_NULL 0x00080000 /* x IS NULL */
+#define WHERE_INDEXED 0x000f0000 /* Anything that uses an index */
+#define WHERE_IN_ABLE 0x000f1000 /* Able to support an IN operator */
+#define WHERE_TOP_LIMIT 0x00100000 /* x<EXPR or x<=EXPR constraint */
+#define WHERE_BTM_LIMIT 0x00200000 /* x>EXPR or x>=EXPR constraint */
+#define WHERE_IDX_ONLY 0x00800000 /* Use index only - omit table */
+#define WHERE_ORDERBY 0x01000000 /* Output will appear in correct order */
+#define WHERE_REVERSE 0x02000000 /* Scan in reverse order */
+#define WHERE_UNIQUE 0x04000000 /* Selects no more than one row */
+#define WHERE_VIRTUALTABLE 0x08000000 /* Use virtual-table processing */
+#define WHERE_MULTI_OR 0x10000000 /* OR using multiple indices */
/*
** Initialize a preallocated WhereClause structure.
@@ -70234,13 +86244,33 @@ struct ExprMaskSet {
static void whereClauseInit(
WhereClause *pWC, /* The WhereClause to be initialized */
Parse *pParse, /* The parsing context */
- ExprMaskSet *pMaskSet /* Mapping from table indices to bitmasks */
+ WhereMaskSet *pMaskSet /* Mapping from table cursor numbers to bitmasks */
){
pWC->pParse = pParse;
pWC->pMaskSet = pMaskSet;
pWC->nTerm = 0;
pWC->nSlot = ArraySize(pWC->aStatic);
pWC->a = pWC->aStatic;
+ pWC->vmask = 0;
+}
+
+/* Forward reference */
+static void whereClauseClear(WhereClause*);
+
+/*
+** Deallocate all memory associated with a WhereOrInfo object.
+*/
+static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){
+ whereClauseClear(&p->wc);
+ sqlite3DbFree(db, p);
+}
+
+/*
+** Deallocate all memory associated with a WhereAndInfo object.
+*/
+static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){
+ whereClauseClear(&p->wc);
+ sqlite3DbFree(db, p);
}
/*
@@ -70250,52 +86280,64 @@ static void whereClauseInit(
static void whereClauseClear(WhereClause *pWC){
int i;
WhereTerm *a;
+ sqlite3 *db = pWC->pParse->db;
for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){
- if( a->flags & TERM_DYNAMIC ){
- sqlite3ExprDelete(a->pExpr);
+ if( a->wtFlags & TERM_DYNAMIC ){
+ sqlite3ExprDelete(db, a->pExpr);
+ }
+ if( a->wtFlags & TERM_ORINFO ){
+ whereOrInfoDelete(db, a->u.pOrInfo);
+ }else if( a->wtFlags & TERM_ANDINFO ){
+ whereAndInfoDelete(db, a->u.pAndInfo);
}
}
if( pWC->a!=pWC->aStatic ){
- sqlite3_free(pWC->a);
+ sqlite3DbFree(db, pWC->a);
}
}
/*
-** Add a new entries to the WhereClause structure. Increase the allocated
-** space as necessary.
+** Add a single new WhereTerm entry to the WhereClause object pWC.
+** The new WhereTerm object is constructed from Expr p and with wtFlags.
+** The index in pWC->a[] of the new WhereTerm is returned on success.
+** 0 is returned if the new WhereTerm could not be added due to a memory
+** allocation error. The memory allocation failure will be recorded in
+** the db->mallocFailed flag so that higher-level functions can detect it.
+**
+** This routine will increase the size of the pWC->a[] array as necessary.
**
-** If the flags argument includes TERM_DYNAMIC, then responsibility
-** for freeing the expression p is assumed by the WhereClause object.
+** If the wtFlags argument includes TERM_DYNAMIC, then responsibility
+** for freeing the expression p is assumed by the WhereClause object pWC.
+** This is true even if this routine fails to allocate a new WhereTerm.
**
** WARNING: This routine might reallocate the space used to store
-** WhereTerms. All pointers to WhereTerms should be invalided after
+** WhereTerms. All pointers to WhereTerms should be invalidated after
** calling this routine. Such pointers may be reinitialized by referencing
** the pWC->a[] array.
*/
-static int whereClauseInsert(WhereClause *pWC, Expr *p, int flags){
+static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){
WhereTerm *pTerm;
int idx;
if( pWC->nTerm>=pWC->nSlot ){
WhereTerm *pOld = pWC->a;
- pWC->a = sqlite3_malloc( sizeof(pWC->a[0])*pWC->nSlot*2 );
+ sqlite3 *db = pWC->pParse->db;
+ pWC->a = sqlite3DbMallocRaw(db, sizeof(pWC->a[0])*pWC->nSlot*2 );
if( pWC->a==0 ){
- pWC->pParse->db->mallocFailed = 1;
- if( flags & TERM_DYNAMIC ){
- sqlite3ExprDelete(p);
+ if( wtFlags & TERM_DYNAMIC ){
+ sqlite3ExprDelete(db, p);
}
pWC->a = pOld;
return 0;
}
memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
if( pOld!=pWC->aStatic ){
- sqlite3_free(pOld);
+ sqlite3DbFree(db, pOld);
}
- pWC->nSlot *= 2;
+ pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]);
}
- pTerm = &pWC->a[idx = pWC->nTerm];
- pWC->nTerm++;
+ pTerm = &pWC->a[idx = pWC->nTerm++];
pTerm->pExpr = p;
- pTerm->flags = flags;
+ pTerm->wtFlags = wtFlags;
pTerm->pWC = pWC;
pTerm->iParent = -1;
return idx;
@@ -70315,10 +86357,11 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, int flags){
** does is make slot[] entries point to substructure within pExpr.
**
** In the previous sentence and in the diagram, "slot[]" refers to
-** the WhereClause.a[] array. This array grows as needed to contain
+** the WhereClause.a[] array. The slot[] array grows as needed to contain
** all terms of the WHERE clause.
*/
static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
+ pWC->op = (u8)op;
if( pExpr==0 ) return;
if( pExpr->op!=op ){
whereClauseInsert(pWC, pExpr, 0);
@@ -70329,7 +86372,7 @@ static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
}
/*
-** Initialize an expression mask set
+** Initialize an expression mask set (a WhereMaskSet object)
*/
#define initMaskSet(P) memset(P, 0, sizeof(*P))
@@ -70337,8 +86380,9 @@ static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
** Return the bitmask for the given cursor number. Return 0 if
** iCursor is not in the set.
*/
-static Bitmask getMask(ExprMaskSet *pMaskSet, int iCursor){
+static Bitmask getMask(WhereMaskSet *pMaskSet, int iCursor){
int i;
+ assert( pMaskSet->n<=sizeof(Bitmask)*8 );
for(i=0; i<pMaskSet->n; i++){
if( pMaskSet->ix[i]==iCursor ){
return ((Bitmask)1)<<i;
@@ -70355,7 +86399,7 @@ static Bitmask getMask(ExprMaskSet *pMaskSet, int iCursor){
** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[]
** array will never overflow.
*/
-static void createMask(ExprMaskSet *pMaskSet, int iCursor){
+static void createMask(WhereMaskSet *pMaskSet, int iCursor){
assert( pMaskSet->n < ArraySize(pMaskSet->ix) );
pMaskSet->ix[pMaskSet->n++] = iCursor;
}
@@ -70366,17 +86410,17 @@ static void createMask(ExprMaskSet *pMaskSet, int iCursor){
** tree.
**
** In order for this routine to work, the calling function must have
-** previously invoked sqlite3ExprResolveNames() on the expression. See
+** previously invoked sqlite3ResolveExprNames() on the expression. See
** the header comment on that routine for additional information.
-** The sqlite3ExprResolveNames() routines looks for column names and
+** The sqlite3ResolveExprNames() routines looks for column names and
** sets their opcodes to TK_COLUMN and their Expr.iTable fields to
** the VDBE cursor number of the table. This routine just has to
** translate the cursor numbers into bitmask values and OR all
** the bitmasks together.
*/
-static Bitmask exprListTableUsage(ExprMaskSet*, ExprList*);
-static Bitmask exprSelectTableUsage(ExprMaskSet*, Select*);
-static Bitmask exprTableUsage(ExprMaskSet *pMaskSet, Expr *p){
+static Bitmask exprListTableUsage(WhereMaskSet*, ExprList*);
+static Bitmask exprSelectTableUsage(WhereMaskSet*, Select*);
+static Bitmask exprTableUsage(WhereMaskSet *pMaskSet, Expr *p){
Bitmask mask = 0;
if( p==0 ) return 0;
if( p->op==TK_COLUMN ){
@@ -70385,11 +86429,14 @@ static Bitmask exprTableUsage(ExprMaskSet *pMaskSet, Expr *p){
}
mask = exprTableUsage(pMaskSet, p->pRight);
mask |= exprTableUsage(pMaskSet, p->pLeft);
- mask |= exprListTableUsage(pMaskSet, p->pList);
- mask |= exprSelectTableUsage(pMaskSet, p->pSelect);
+ if( ExprHasProperty(p, EP_xIsSelect) ){
+ mask |= exprSelectTableUsage(pMaskSet, p->x.pSelect);
+ }else{
+ mask |= exprListTableUsage(pMaskSet, p->x.pList);
+ }
return mask;
}
-static Bitmask exprListTableUsage(ExprMaskSet *pMaskSet, ExprList *pList){
+static Bitmask exprListTableUsage(WhereMaskSet *pMaskSet, ExprList *pList){
int i;
Bitmask mask = 0;
if( pList ){
@@ -70399,7 +86446,7 @@ static Bitmask exprListTableUsage(ExprMaskSet *pMaskSet, ExprList *pList){
}
return mask;
}
-static Bitmask exprSelectTableUsage(ExprMaskSet *pMaskSet, Select *pS){
+static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){
Bitmask mask = 0;
while( pS ){
mask |= exprListTableUsage(pMaskSet, pS->pEList);
@@ -70426,12 +86473,12 @@ static int allowedOp(int op){
}
/*
-** Swap two objects of type T.
+** Swap two objects of type TYPE.
*/
#define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;}
/*
-** Commute a comparision operator. Expressions of the form "X op Y"
+** Commute a comparison operator. Expressions of the form "X op Y"
** are converted into "Y op X".
**
** If a collation sequence is associated with either the left or right
@@ -70442,10 +86489,12 @@ static int allowedOp(int op){
** attached to the right. For the same reason the EP_ExpCollate flag
** is not commuted.
*/
-static void exprCommute(Expr *pExpr){
+static void exprCommute(Parse *pParse, Expr *pExpr){
u16 expRight = (pExpr->pRight->flags & EP_ExpCollate);
u16 expLeft = (pExpr->pLeft->flags & EP_ExpCollate);
assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN );
+ pExpr->pRight->pColl = sqlite3ExprCollSeq(pParse, pExpr->pRight);
+ pExpr->pLeft->pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
SWAP(CollSeq*,pExpr->pRight->pColl,pExpr->pLeft->pColl);
pExpr->pRight->flags = (pExpr->pRight->flags & ~EP_ExpCollate) | expLeft;
pExpr->pLeft->flags = (pExpr->pLeft->flags & ~EP_ExpCollate) | expRight;
@@ -70463,15 +86512,16 @@ static void exprCommute(Expr *pExpr){
/*
** Translate from TK_xx operator to WO_xx bitmask.
*/
-static int operatorMask(int op){
- int c;
+static u16 operatorMask(int op){
+ u16 c;
assert( allowedOp(op) );
if( op==TK_IN ){
c = WO_IN;
}else if( op==TK_ISNULL ){
c = WO_ISNULL;
}else{
- c = WO_EQ<<(op-TK_EQ);
+ assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff );
+ c = (u16)(WO_EQ<<(op-TK_EQ));
}
assert( op!=TK_ISNULL || c==WO_ISNULL );
assert( op!=TK_IN || c==WO_IN );
@@ -70494,18 +86544,20 @@ static WhereTerm *findTerm(
int iCur, /* Cursor number of LHS */
int iColumn, /* Column number of LHS */
Bitmask notReady, /* RHS must not overlap with this mask */
- u16 op, /* Mask of WO_xx values describing operator */
+ u32 op, /* Mask of WO_xx values describing operator */
Index *pIdx /* Must be compatible with this index, if not NULL */
){
WhereTerm *pTerm;
int k;
+ assert( iCur>=0 );
+ op &= WO_ALL;
for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){
if( pTerm->leftCursor==iCur
&& (pTerm->prereqRight & notReady)==0
- && pTerm->leftColumn==iColumn
+ && pTerm->u.leftColumn==iColumn
&& (pTerm->eOperator & op)!=0
){
- if( iCur>=0 && pIdx && pTerm->eOperator!=WO_ISNULL ){
+ if( pIdx && pTerm->eOperator!=WO_ISNULL ){
Expr *pX = pTerm->pExpr;
CollSeq *pColl;
char idxaff;
@@ -70521,13 +86573,12 @@ static WhereTerm *findTerm(
*/
assert(pX->pLeft);
pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
- if( !pColl ){
- pColl = pParse->db->pDfltColl;
- }
+ assert(pColl || pParse->nErr);
- for(j=0; j<pIdx->nColumn && pIdx->aiColumn[j]!=iColumn; j++){}
- assert( j<pIdx->nColumn );
- if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;
+ for(j=0; pIdx->aiColumn[j]!=iColumn; j++){
+ if( NEVER(j>=pIdx->nColumn) ) return 0;
+ }
+ if( pColl && sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;
}
return pTerm;
}
@@ -70563,18 +86614,20 @@ static void exprAnalyzeAll(
** literal that does not begin with a wildcard.
*/
static int isLikeOrGlob(
- sqlite3 *db, /* The database */
+ Parse *pParse, /* Parsing and code generating context */
Expr *pExpr, /* Test this expression */
int *pnPattern, /* Number of non-wildcard prefix characters */
int *pisComplete, /* True if the only wildcard is % in the last character */
int *pnoCase /* True if uppercase is equivalent to lowercase */
){
- const char *z;
- Expr *pRight, *pLeft;
- ExprList *pList;
- int c, cnt;
- char wc[3];
- CollSeq *pColl;
+ const char *z; /* String on RHS of LIKE operator */
+ Expr *pRight, *pLeft; /* Right and left size of LIKE operator */
+ ExprList *pList; /* List of operands to the LIKE operator */
+ int c; /* One character in z[] */
+ int cnt; /* Number of non-wildcard prefix characters */
+ char wc[3]; /* Wildcard characters */
+ CollSeq *pColl; /* Collating sequence for LHS */
+ sqlite3 *db = pParse->db; /* Database connection */
if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){
return 0;
@@ -70582,38 +86635,36 @@ static int isLikeOrGlob(
#ifdef SQLITE_EBCDIC
if( *pnoCase ) return 0;
#endif
- pList = pExpr->pList;
+ pList = pExpr->x.pList;
pRight = pList->a[0].pExpr;
- if( pRight->op!=TK_STRING
- && (pRight->op!=TK_REGISTER || pRight->iColumn!=TK_STRING) ){
+ if( pRight->op!=TK_STRING ){
return 0;
}
pLeft = pList->a[1].pExpr;
if( pLeft->op!=TK_COLUMN ){
return 0;
}
- pColl = pLeft->pColl;
+ pColl = sqlite3ExprCollSeq(pParse, pLeft);
assert( pColl!=0 || pLeft->iColumn==-1 );
- if( pColl==0 ){
- /* No collation is defined for the ROWID. Use the default. */
- pColl = db->pDfltColl;
- }
+ if( pColl==0 ) return 0;
if( (pColl->type!=SQLITE_COLL_BINARY || *pnoCase) &&
(pColl->type!=SQLITE_COLL_NOCASE || !*pnoCase) ){
return 0;
}
- sqlite3DequoteExpr(db, pRight);
- z = (char *)pRight->token.z;
- cnt = 0;
- if( z ){
- while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ cnt++; }
- }
- if( cnt==0 || 255==(u8)z[cnt] ){
- return 0;
+ if( sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT ) return 0;
+ z = pRight->u.zToken;
+ if( ALWAYS(z) ){
+ cnt = 0;
+ while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
+ cnt++;
+ }
+ if( cnt!=0 && c!=0 && 255!=(u8)z[cnt-1] ){
+ *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
+ *pnPattern = cnt;
+ return 1;
+ }
}
- *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
- *pnPattern = cnt;
- return 1;
+ return 0;
}
#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
@@ -70634,11 +86685,10 @@ static int isMatchOfColumn(
if( pExpr->op!=TK_FUNCTION ){
return 0;
}
- if( pExpr->token.n!=5 ||
- sqlite3StrNICmp((const char*)pExpr->token.z,"match",5)!=0 ){
+ if( sqlite3StrICmp(pExpr->u.zToken,"match")!=0 ){
return 0;
}
- pList = pExpr->pList;
+ pList = pExpr->x.pList;
if( pList->nExpr!=2 ){
return 0;
}
@@ -70660,91 +86710,313 @@ static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
/*
-** Return TRUE if the given term of an OR clause can be converted
-** into an IN clause. The iCursor and iColumn define the left-hand
-** side of the IN clause.
+** Analyze a term that consists of two or more OR-connected
+** subterms. So in:
**
-** The context is that we have multiple OR-connected equality terms
-** like this:
+** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13)
+** ^^^^^^^^^^^^^^^^^^^^
**
-** a=<expr1> OR a=<expr2> OR b=<expr3> OR ...
+** This routine analyzes terms such as the middle term in the above example.
+** A WhereOrTerm object is computed and attached to the term under
+** analysis, regardless of the outcome of the analysis. Hence:
**
-** The pOrTerm input to this routine corresponds to a single term of
-** this OR clause. In order for the term to be a condidate for
-** conversion to an IN operator, the following must be true:
+** WhereTerm.wtFlags |= TERM_ORINFO
+** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object
**
-** * The left-hand side of the term must be the column which
-** is identified by iCursor and iColumn.
+** The term being analyzed must have two or more of OR-connected subterms.
+** A single subterm might be a set of AND-connected sub-subterms.
+** Examples of terms under analysis:
**
-** * If the right-hand side is also a column, then the affinities
-** of both right and left sides must be such that no type
-** conversions are required on the right. (Ticket #2249)
+** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5
+** (B) x=expr1 OR expr2=x OR x=expr3
+** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15)
+** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*')
+** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6)
**
-** If both of these conditions are true, then return true. Otherwise
-** return false.
-*/
-static int orTermIsOptCandidate(WhereTerm *pOrTerm, int iCursor, int iColumn){
- int affLeft, affRight;
- assert( pOrTerm->eOperator==WO_EQ );
- if( pOrTerm->leftCursor!=iCursor ){
- return 0;
- }
- if( pOrTerm->leftColumn!=iColumn ){
- return 0;
- }
- affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight);
- if( affRight==0 ){
- return 1;
- }
- affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft);
- if( affRight!=affLeft ){
- return 0;
- }
- return 1;
-}
-
-/*
-** Return true if the given term of an OR clause can be ignored during
-** a check to make sure all OR terms are candidates for optimization.
-** In other words, return true if a call to the orTermIsOptCandidate()
-** above returned false but it is not necessary to disqualify the
-** optimization.
+** CASE 1:
+**
+** If all subterms are of the form T.C=expr for some single column of C
+** a single table T (as shown in example B above) then create a new virtual
+** term that is an equivalent IN expression. In other words, if the term
+** being analyzed is:
+**
+** x = expr1 OR expr2 = x OR x = expr3
+**
+** then create a new virtual term like this:
+**
+** x IN (expr1,expr2,expr3)
+**
+** CASE 2:
+**
+** If all subterms are indexable by a single table T, then set
+**
+** WhereTerm.eOperator = WO_OR
+** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T
+**
+** A subterm is "indexable" if it is of the form
+** "T.C <op> <expr>" where C is any column of table T and
+** <op> is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN".
+** A subterm is also indexable if it is an AND of two or more
+** subsubterms at least one of which is indexable. Indexable AND
+** subterms have their eOperator set to WO_AND and they have
+** u.pAndInfo set to a dynamically allocated WhereAndTerm object.
+**
+** From another point of view, "indexable" means that the subterm could
+** potentially be used with an index if an appropriate index exists.
+** This analysis does not consider whether or not the index exists; that
+** is something the bestIndex() routine will determine. This analysis
+** only looks at whether subterms appropriate for indexing exist.
**
-** Suppose the original OR phrase was this:
+** All examples A through E above all satisfy case 2. But if a term
+** also statisfies case 1 (such as B) we know that the optimizer will
+** always prefer case 1, so in that case we pretend that case 2 is not
+** satisfied.
**
-** a=4 OR a=11 OR a=b
+** It might be the case that multiple tables are indexable. For example,
+** (E) above is indexable on tables P, Q, and R.
**
-** During analysis, the third term gets flipped around and duplicate
-** so that we are left with this:
+** Terms that satisfy case 2 are candidates for lookup by using
+** separate indices to find rowids for each subterm and composing
+** the union of all rowids using a RowSet object. This is similar
+** to "bitmap indices" in other database engines.
**
-** a=4 OR a=11 OR a=b OR b=a
+** OTHERWISE:
**
-** Since the last two terms are duplicates, only one of them
-** has to qualify in order for the whole phrase to qualify. When
-** this routine is called, we know that pOrTerm did not qualify.
-** This routine merely checks to see if pOrTerm has a duplicate that
-** might qualify. If there is a duplicate that has not yet been
-** disqualified, then return true. If there are no duplicates, or
-** the duplicate has also been disqualifed, return false.
+** If neither case 1 nor case 2 apply, then leave the eOperator set to
+** zero. This term is not useful for search.
*/
-static int orTermHasOkDuplicate(WhereClause *pOr, WhereTerm *pOrTerm){
- if( pOrTerm->flags & TERM_COPIED ){
- /* This is the original term. The duplicate is to the left had
- ** has not yet been analyzed and thus has not yet been disqualified. */
- return 1;
+static void exprAnalyzeOrTerm(
+ SrcList *pSrc, /* the FROM clause */
+ WhereClause *pWC, /* the complete WHERE clause */
+ int idxTerm /* Index of the OR-term to be analyzed */
+){
+ Parse *pParse = pWC->pParse; /* Parser context */
+ sqlite3 *db = pParse->db; /* Database connection */
+ WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */
+ Expr *pExpr = pTerm->pExpr; /* The expression of the term */
+ WhereMaskSet *pMaskSet = pWC->pMaskSet; /* Table use masks */
+ int i; /* Loop counters */
+ WhereClause *pOrWc; /* Breakup of pTerm into subterms */
+ WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */
+ WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */
+ Bitmask chngToIN; /* Tables that might satisfy case 1 */
+ Bitmask indexable; /* Tables that are indexable, satisfying case 2 */
+
+ /*
+ ** Break the OR clause into its separate subterms. The subterms are
+ ** stored in a WhereClause structure containing within the WhereOrInfo
+ ** object that is attached to the original OR clause term.
+ */
+ assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 );
+ assert( pExpr->op==TK_OR );
+ pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo));
+ if( pOrInfo==0 ) return;
+ pTerm->wtFlags |= TERM_ORINFO;
+ pOrWc = &pOrInfo->wc;
+ whereClauseInit(pOrWc, pWC->pParse, pMaskSet);
+ whereSplit(pOrWc, pExpr, TK_OR);
+ exprAnalyzeAll(pSrc, pOrWc);
+ if( db->mallocFailed ) return;
+ assert( pOrWc->nTerm>=2 );
+
+ /*
+ ** Compute the set of tables that might satisfy cases 1 or 2.
+ */
+ indexable = ~(Bitmask)0;
+ chngToIN = ~(pWC->vmask);
+ for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){
+ if( (pOrTerm->eOperator & WO_SINGLE)==0 ){
+ WhereAndInfo *pAndInfo;
+ assert( pOrTerm->eOperator==0 );
+ assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 );
+ chngToIN = 0;
+ pAndInfo = sqlite3DbMallocRaw(db, sizeof(*pAndInfo));
+ if( pAndInfo ){
+ WhereClause *pAndWC;
+ WhereTerm *pAndTerm;
+ int j;
+ Bitmask b = 0;
+ pOrTerm->u.pAndInfo = pAndInfo;
+ pOrTerm->wtFlags |= TERM_ANDINFO;
+ pOrTerm->eOperator = WO_AND;
+ pAndWC = &pAndInfo->wc;
+ whereClauseInit(pAndWC, pWC->pParse, pMaskSet);
+ whereSplit(pAndWC, pOrTerm->pExpr, TK_AND);
+ exprAnalyzeAll(pSrc, pAndWC);
+ testcase( db->mallocFailed );
+ if( !db->mallocFailed ){
+ for(j=0, pAndTerm=pAndWC->a; j<pAndWC->nTerm; j++, pAndTerm++){
+ assert( pAndTerm->pExpr );
+ if( allowedOp(pAndTerm->pExpr->op) ){
+ b |= getMask(pMaskSet, pAndTerm->leftCursor);
+ }
+ }
+ }
+ indexable &= b;
+ }
+ }else if( pOrTerm->wtFlags & TERM_COPIED ){
+ /* Skip this term for now. We revisit it when we process the
+ ** corresponding TERM_VIRTUAL term */
+ }else{
+ Bitmask b;
+ b = getMask(pMaskSet, pOrTerm->leftCursor);
+ if( pOrTerm->wtFlags & TERM_VIRTUAL ){
+ WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent];
+ b |= getMask(pMaskSet, pOther->leftCursor);
+ }
+ indexable &= b;
+ if( pOrTerm->eOperator!=WO_EQ ){
+ chngToIN = 0;
+ }else{
+ chngToIN &= b;
+ }
+ }
}
- if( (pOrTerm->flags & TERM_VIRTUAL)!=0
- && (pOr->a[pOrTerm->iParent].flags & TERM_OR_OK)!=0 ){
- /* This is a duplicate term. The original qualified so this one
- ** does not have to. */
- return 1;
+
+ /*
+ ** Record the set of tables that satisfy case 2. The set might be
+ ** empty.
+ */
+ pOrInfo->indexable = indexable;
+ pTerm->eOperator = indexable==0 ? 0 : WO_OR;
+
+ /*
+ ** chngToIN holds a set of tables that *might* satisfy case 1. But
+ ** we have to do some additional checking to see if case 1 really
+ ** is satisfied.
+ **
+ ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means
+ ** that there is no possibility of transforming the OR clause into an
+ ** IN operator because one or more terms in the OR clause contain
+ ** something other than == on a column in the single table. The 1-bit
+ ** case means that every term of the OR clause is of the form
+ ** "table.column=expr" for some single table. The one bit that is set
+ ** will correspond to the common table. We still need to check to make
+ ** sure the same column is used on all terms. The 2-bit case is when
+ ** the all terms are of the form "table1.column=table2.column". It
+ ** might be possible to form an IN operator with either table1.column
+ ** or table2.column as the LHS if either is common to every term of
+ ** the OR clause.
+ **
+ ** Note that terms of the form "table.column1=table.column2" (the
+ ** same table on both sizes of the ==) cannot be optimized.
+ */
+ if( chngToIN ){
+ int okToChngToIN = 0; /* True if the conversion to IN is valid */
+ int iColumn = -1; /* Column index on lhs of IN operator */
+ int iCursor = -1; /* Table cursor common to all terms */
+ int j = 0; /* Loop counter */
+
+ /* Search for a table and column that appears on one side or the
+ ** other of the == operator in every subterm. That table and column
+ ** will be recorded in iCursor and iColumn. There might not be any
+ ** such table and column. Set okToChngToIN if an appropriate table
+ ** and column is found but leave okToChngToIN false if not found.
+ */
+ for(j=0; j<2 && !okToChngToIN; j++){
+ pOrTerm = pOrWc->a;
+ for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){
+ assert( pOrTerm->eOperator==WO_EQ );
+ pOrTerm->wtFlags &= ~TERM_OR_OK;
+ if( pOrTerm->leftCursor==iCursor ){
+ /* This is the 2-bit case and we are on the second iteration and
+ ** current term is from the first iteration. So skip this term. */
+ assert( j==1 );
+ continue;
+ }
+ if( (chngToIN & getMask(pMaskSet, pOrTerm->leftCursor))==0 ){
+ /* This term must be of the form t1.a==t2.b where t2 is in the
+ ** chngToIN set but t1 is not. This term will be either preceeded
+ ** or follwed by an inverted copy (t2.b==t1.a). Skip this term
+ ** and use its inversion. */
+ testcase( pOrTerm->wtFlags & TERM_COPIED );
+ testcase( pOrTerm->wtFlags & TERM_VIRTUAL );
+ assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) );
+ continue;
+ }
+ iColumn = pOrTerm->u.leftColumn;
+ iCursor = pOrTerm->leftCursor;
+ break;
+ }
+ if( i<0 ){
+ /* No candidate table+column was found. This can only occur
+ ** on the second iteration */
+ assert( j==1 );
+ assert( (chngToIN&(chngToIN-1))==0 );
+ assert( chngToIN==getMask(pMaskSet, iCursor) );
+ break;
+ }
+ testcase( j==1 );
+
+ /* We have found a candidate table and column. Check to see if that
+ ** table and column is common to every term in the OR clause */
+ okToChngToIN = 1;
+ for(; i>=0 && okToChngToIN; i--, pOrTerm++){
+ assert( pOrTerm->eOperator==WO_EQ );
+ if( pOrTerm->leftCursor!=iCursor ){
+ pOrTerm->wtFlags &= ~TERM_OR_OK;
+ }else if( pOrTerm->u.leftColumn!=iColumn ){
+ okToChngToIN = 0;
+ }else{
+ int affLeft, affRight;
+ /* If the right-hand side is also a column, then the affinities
+ ** of both right and left sides must be such that no type
+ ** conversions are required on the right. (Ticket #2249)
+ */
+ affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight);
+ affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft);
+ if( affRight!=0 && affRight!=affLeft ){
+ okToChngToIN = 0;
+ }else{
+ pOrTerm->wtFlags |= TERM_OR_OK;
+ }
+ }
+ }
+ }
+
+ /* At this point, okToChngToIN is true if original pTerm satisfies
+ ** case 1. In that case, construct a new virtual term that is
+ ** pTerm converted into an IN operator.
+ */
+ if( okToChngToIN ){
+ Expr *pDup; /* A transient duplicate expression */
+ ExprList *pList = 0; /* The RHS of the IN operator */
+ Expr *pLeft = 0; /* The LHS of the IN operator */
+ Expr *pNew; /* The complete IN operator */
+
+ for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){
+ if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue;
+ assert( pOrTerm->eOperator==WO_EQ );
+ assert( pOrTerm->leftCursor==iCursor );
+ assert( pOrTerm->u.leftColumn==iColumn );
+ pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0);
+ pList = sqlite3ExprListAppend(pWC->pParse, pList, pDup);
+ pLeft = pOrTerm->pExpr->pLeft;
+ }
+ assert( pLeft!=0 );
+ pDup = sqlite3ExprDup(db, pLeft, 0);
+ pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0);
+ if( pNew ){
+ int idxNew;
+ transferJoinMarkings(pNew, pExpr);
+ assert( !ExprHasProperty(pNew, EP_xIsSelect) );
+ pNew->x.pList = pList;
+ idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
+ testcase( idxNew==0 );
+ exprAnalyze(pSrc, pWC, idxNew);
+ pTerm = &pWC->a[idxTerm];
+ pWC->a[idxNew].iParent = idxTerm;
+ pTerm->nChild = 1;
+ }else{
+ sqlite3ExprListDelete(db, pList);
+ }
+ pTerm->eOperator = 0; /* case 1 trumps case 2 */
+ }
}
- /* This is either a singleton term or else it is a duplicate for
- ** which the original did not qualify. Either way we are done for. */
- return 0;
}
#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */
+
/*
** The input to this routine is an WhereTerm structure with only the
** "pExpr" field filled in. The job of this routine is to analyze the
@@ -70752,28 +87024,34 @@ static int orTermHasOkDuplicate(WhereClause *pOr, WhereTerm *pOrTerm){
** structure.
**
** If the expression is of the form "<expr> <op> X" it gets commuted
-** to the standard form of "X <op> <expr>". If the expression is of
-** the form "X <op> Y" where both X and Y are columns, then the original
-** expression is unchanged and a new virtual expression of the form
-** "Y <op> X" is added to the WHERE clause and analyzed separately.
+** to the standard form of "X <op> <expr>".
+**
+** If the expression is of the form "X <op> Y" where both X and Y are
+** columns, then the original expression is unchanged and a new virtual
+** term of the form "Y <op> X" is added to the WHERE clause and
+** analyzed separately. The original term is marked with TERM_COPIED
+** and the new term is marked with TERM_DYNAMIC (because it's pExpr
+** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it
+** is a commuted copy of a prior term.) The original term has nChild=1
+** and the copy has idxParent set to the index of the original term.
*/
static void exprAnalyze(
SrcList *pSrc, /* the FROM clause */
WhereClause *pWC, /* the WHERE clause */
int idxTerm /* Index of the term to be analyzed */
){
- WhereTerm *pTerm;
- ExprMaskSet *pMaskSet;
- Expr *pExpr;
- Bitmask prereqLeft;
- Bitmask prereqAll;
+ WhereTerm *pTerm; /* The term to be analyzed */
+ WhereMaskSet *pMaskSet; /* Set of table index masks */
+ Expr *pExpr; /* The expression to be analyzed */
+ Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */
+ Bitmask prereqAll; /* Prerequesites of pExpr */
Bitmask extraRight = 0;
int nPattern;
int isComplete;
int noCase;
- int op;
- Parse *pParse = pWC->pParse;
- sqlite3 *db = pParse->db;
+ int op; /* Top-level operator. pExpr->op */
+ Parse *pParse = pWC->pParse; /* Parsing context */
+ sqlite3 *db = pParse->db; /* Database connection */
if( db->mallocFailed ){
return;
@@ -70785,8 +87063,11 @@ static void exprAnalyze(
op = pExpr->op;
if( op==TK_IN ){
assert( pExpr->pRight==0 );
- pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->pList)
- | exprSelectTableUsage(pMaskSet, pExpr->pSelect);
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ pTerm->prereqRight = exprSelectTableUsage(pMaskSet, pExpr->x.pSelect);
+ }else{
+ pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->x.pList);
+ }
}else if( op==TK_ISNULL ){
pTerm->prereqRight = 0;
}else{
@@ -70808,7 +87089,7 @@ static void exprAnalyze(
Expr *pRight = pExpr->pRight;
if( pLeft->op==TK_COLUMN ){
pTerm->leftCursor = pLeft->iTable;
- pTerm->leftColumn = pLeft->iColumn;
+ pTerm->u.leftColumn = pLeft->iColumn;
pTerm->eOperator = operatorMask(op);
}
if( pRight && pRight->op==TK_COLUMN ){
@@ -70816,9 +87097,9 @@ static void exprAnalyze(
Expr *pDup;
if( pTerm->leftCursor>=0 ){
int idxNew;
- pDup = sqlite3ExprDup(db, pExpr);
+ pDup = sqlite3ExprDup(db, pExpr, 0);
if( db->mallocFailed ){
- sqlite3ExprDelete(pDup);
+ sqlite3ExprDelete(db, pDup);
return;
}
idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);
@@ -70827,15 +87108,15 @@ static void exprAnalyze(
pNew->iParent = idxTerm;
pTerm = &pWC->a[idxTerm];
pTerm->nChild = 1;
- pTerm->flags |= TERM_COPIED;
+ pTerm->wtFlags |= TERM_COPIED;
}else{
pDup = pExpr;
pNew = pTerm;
}
- exprCommute(pDup);
+ exprCommute(pParse, pDup);
pLeft = pDup->pLeft;
pNew->leftCursor = pLeft->iTable;
- pNew->leftColumn = pLeft->iColumn;
+ pNew->u.leftColumn = pLeft->iColumn;
pNew->prereqRight = prereqLeft;
pNew->prereqAll = prereqAll;
pNew->eOperator = operatorMask(pDup->op);
@@ -70844,10 +87125,22 @@ static void exprAnalyze(
#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION
/* If a term is the BETWEEN operator, create two new virtual terms
- ** that define the range that the BETWEEN implements.
- */
- else if( pExpr->op==TK_BETWEEN ){
- ExprList *pList = pExpr->pList;
+ ** that define the range that the BETWEEN implements. For example:
+ **
+ ** a BETWEEN b AND c
+ **
+ ** is converted into:
+ **
+ ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c)
+ **
+ ** The two new terms are added onto the end of the WhereClause object.
+ ** The new terms are "dynamic" and are children of the original BETWEEN
+ ** term. That means that if the BETWEEN term is coded, the children are
+ ** skipped. Or, if the children are satisfied by an index, the original
+ ** BETWEEN term is skipped.
+ */
+ else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){
+ ExprList *pList = pExpr->x.pList;
int i;
static const u8 ops[] = {TK_GE, TK_LE};
assert( pList!=0 );
@@ -70855,9 +87148,11 @@ static void exprAnalyze(
for(i=0; i<2; i++){
Expr *pNewExpr;
int idxNew;
- pNewExpr = sqlite3Expr(db, ops[i], sqlite3ExprDup(db, pExpr->pLeft),
- sqlite3ExprDup(db, pList->a[i].pExpr), 0);
+ pNewExpr = sqlite3PExpr(pParse, ops[i],
+ sqlite3ExprDup(db, pExpr->pLeft, 0),
+ sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0);
idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
+ testcase( idxNew==0 );
exprAnalyze(pSrc, pWC, idxNew);
pTerm = &pWC->a[idxTerm];
pWC->a[idxNew].iParent = idxTerm;
@@ -70867,78 +87162,13 @@ static void exprAnalyze(
#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */
#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
- /* Attempt to convert OR-connected terms into an IN operator so that
- ** they can make use of indices. Example:
- **
- ** x = expr1 OR expr2 = x OR x = expr3
- **
- ** is converted into
- **
- ** x IN (expr1,expr2,expr3)
- **
- ** This optimization must be omitted if OMIT_SUBQUERY is defined because
- ** the compiler for the the IN operator is part of sub-queries.
+ /* Analyze a term that is composed of two or more subterms connected by
+ ** an OR operator.
*/
else if( pExpr->op==TK_OR ){
- int ok;
- int i, j;
- int iColumn, iCursor;
- WhereClause sOr;
- WhereTerm *pOrTerm;
-
- assert( (pTerm->flags & TERM_DYNAMIC)==0 );
- whereClauseInit(&sOr, pWC->pParse, pMaskSet);
- whereSplit(&sOr, pExpr, TK_OR);
- exprAnalyzeAll(pSrc, &sOr);
- assert( sOr.nTerm>=2 );
- j = 0;
- if( db->mallocFailed ) goto or_not_possible;
- do{
- assert( j<sOr.nTerm );
- iColumn = sOr.a[j].leftColumn;
- iCursor = sOr.a[j].leftCursor;
- ok = iCursor>=0;
- for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){
- if( pOrTerm->eOperator!=WO_EQ ){
- goto or_not_possible;
- }
- if( orTermIsOptCandidate(pOrTerm, iCursor, iColumn) ){
- pOrTerm->flags |= TERM_OR_OK;
- }else if( orTermHasOkDuplicate(&sOr, pOrTerm) ){
- pOrTerm->flags &= ~TERM_OR_OK;
- }else{
- ok = 0;
- }
- }
- }while( !ok && (sOr.a[j++].flags & TERM_COPIED)!=0 && j<2 );
- if( ok ){
- ExprList *pList = 0;
- Expr *pNew, *pDup;
- Expr *pLeft = 0;
- for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){
- if( (pOrTerm->flags & TERM_OR_OK)==0 ) continue;
- pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight);
- pList = sqlite3ExprListAppend(pWC->pParse, pList, pDup, 0);
- pLeft = pOrTerm->pExpr->pLeft;
- }
- assert( pLeft!=0 );
- pDup = sqlite3ExprDup(db, pLeft);
- pNew = sqlite3Expr(db, TK_IN, pDup, 0, 0);
- if( pNew ){
- int idxNew;
- transferJoinMarkings(pNew, pExpr);
- pNew->pList = pList;
- idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
- exprAnalyze(pSrc, pWC, idxNew);
- pTerm = &pWC->a[idxTerm];
- pWC->a[idxNew].iParent = idxTerm;
- pTerm->nChild = 1;
- }else{
- sqlite3ExprListDelete(pList);
- }
- }
-or_not_possible:
- whereClauseClear(&sOr);
+ assert( pWC->op==TK_AND );
+ exprAnalyzeOrTerm(pSrc, pWC, idxTerm);
+ pTerm = &pWC->a[idxTerm];
}
#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
@@ -70951,37 +87181,44 @@ or_not_possible:
** x>='abc' AND x<'abd' AND x LIKE 'abc%'
**
** The last character of the prefix "abc" is incremented to form the
- ** termination condidtion "abd". This trick of incrementing the last
- ** is not 255 and if the character set is not EBCDIC.
+ ** termination condition "abd".
*/
- if( isLikeOrGlob(db, pExpr, &nPattern, &isComplete, &noCase) ){
+ if( isLikeOrGlob(pParse, pExpr, &nPattern, &isComplete, &noCase)
+ && pWC->op==TK_AND ){
Expr *pLeft, *pRight;
Expr *pStr1, *pStr2;
Expr *pNewExpr1, *pNewExpr2;
int idxNew1, idxNew2;
- pLeft = pExpr->pList->a[1].pExpr;
- pRight = pExpr->pList->a[0].pExpr;
- pStr1 = sqlite3PExpr(pParse, TK_STRING, 0, 0, 0);
- if( pStr1 ){
- sqlite3TokenCopy(db, &pStr1->token, &pRight->token);
- pStr1->token.n = nPattern;
- pStr1->flags = EP_Dequoted;
- }
- pStr2 = sqlite3ExprDup(db, pStr1);
+ pLeft = pExpr->x.pList->a[1].pExpr;
+ pRight = pExpr->x.pList->a[0].pExpr;
+ pStr1 = sqlite3Expr(db, TK_STRING, pRight->u.zToken);
+ if( pStr1 ) pStr1->u.zToken[nPattern] = 0;
+ pStr2 = sqlite3ExprDup(db, pStr1, 0);
if( !db->mallocFailed ){
- u8 c, *pC;
- assert( pStr2->token.dyn );
- pC = (u8*)&pStr2->token.z[nPattern-1];
+ u8 c, *pC; /* Last character before the first wildcard */
+ pC = (u8*)&pStr2->u.zToken[nPattern-1];
c = *pC;
- if( noCase ) c = sqlite3UpperToLower[c];
+ if( noCase ){
+ /* The point is to increment the last character before the first
+ ** wildcard. But if we increment '@', that will push it into the
+ ** alphabetic range where case conversions will mess up the
+ ** inequality. To avoid this, make sure to also run the full
+ ** LIKE on all candidate expressions by clearing the isComplete flag
+ */
+ if( c=='A'-1 ) isComplete = 0;
+
+ c = sqlite3UpperToLower[c];
+ }
*pC = c + 1;
}
- pNewExpr1 = sqlite3PExpr(pParse, TK_GE, sqlite3ExprDup(db,pLeft), pStr1, 0);
+ pNewExpr1 = sqlite3PExpr(pParse, TK_GE, sqlite3ExprDup(db,pLeft,0),pStr1,0);
idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
+ testcase( idxNew1==0 );
exprAnalyze(pSrc, pWC, idxNew1);
- pNewExpr2 = sqlite3PExpr(pParse, TK_LT, sqlite3ExprDup(db,pLeft), pStr2, 0);
+ pNewExpr2 = sqlite3PExpr(pParse, TK_LT, sqlite3ExprDup(db,pLeft,0),pStr2,0);
idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
+ testcase( idxNew2==0 );
exprAnalyze(pSrc, pWC, idxNew2);
pTerm = &pWC->a[idxTerm];
if( isComplete ){
@@ -71005,23 +87242,25 @@ or_not_possible:
WhereTerm *pNewTerm;
Bitmask prereqColumn, prereqExpr;
- pRight = pExpr->pList->a[0].pExpr;
- pLeft = pExpr->pList->a[1].pExpr;
+ pRight = pExpr->x.pList->a[0].pExpr;
+ pLeft = pExpr->x.pList->a[1].pExpr;
prereqExpr = exprTableUsage(pMaskSet, pRight);
prereqColumn = exprTableUsage(pMaskSet, pLeft);
if( (prereqExpr & prereqColumn)==0 ){
Expr *pNewExpr;
- pNewExpr = sqlite3Expr(db, TK_MATCH, 0, sqlite3ExprDup(db, pRight), 0);
+ pNewExpr = sqlite3PExpr(pParse, TK_MATCH,
+ 0, sqlite3ExprDup(db, pRight, 0), 0);
idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
+ testcase( idxNew==0 );
pNewTerm = &pWC->a[idxNew];
pNewTerm->prereqRight = prereqExpr;
pNewTerm->leftCursor = pLeft->iTable;
- pNewTerm->leftColumn = pLeft->iColumn;
+ pNewTerm->u.leftColumn = pLeft->iColumn;
pNewTerm->eOperator = WO_MATCH;
pNewTerm->iParent = idxTerm;
pTerm = &pWC->a[idxTerm];
pTerm->nChild = 1;
- pTerm->flags |= TERM_COPIED;
+ pTerm->wtFlags |= TERM_COPIED;
pNewTerm->prereqAll = pTerm->prereqAll;
}
}
@@ -71039,7 +87278,7 @@ or_not_possible:
*/
static int referencesOtherTables(
ExprList *pList, /* Search expressions in ths list */
- ExprMaskSet *pMaskSet, /* Mapping from tables to bitmaps */
+ WhereMaskSet *pMaskSet, /* Mapping from tables to bitmaps */
int iFirst, /* Be searching with the iFirst-th expression */
int iBase /* Ignore references to this table */
){
@@ -71074,7 +87313,7 @@ static int referencesOtherTables(
*/
static int isSortingIndex(
Parse *pParse, /* Parsing context */
- ExprMaskSet *pMaskSet, /* Mapping from table indices to bitmaps */
+ WhereMaskSet *pMaskSet, /* Mapping from table cursor numbers to bitmaps */
Index *pIdx, /* The index we are testing */
int base, /* Cursor number for the table to be sorted */
ExprList *pOrderBy, /* The ORDER BY clause */
@@ -71091,6 +87330,11 @@ static int isSortingIndex(
nTerm = pOrderBy->nExpr;
assert( nTerm>0 );
+ /* Argument pIdx must either point to a 'real' named index structure,
+ ** or an index structure allocated on the stack by bestBtreeIndex() to
+ ** represent the rowid index that is part of every table. */
+ assert( pIdx->zName || (pIdx->nColumn==1 && pIdx->aiColumn[0]==-1) );
+
/* Match terms of the ORDER BY clause against columns of
** the index.
**
@@ -71117,7 +87361,7 @@ static int isSortingIndex(
if( !pColl ){
pColl = db->pDfltColl;
}
- if( i<pIdx->nColumn ){
+ if( pIdx->zName && i<pIdx->nColumn ){
iColumn = pIdx->aiColumn[i];
if( iColumn==pIdx->pTable->iPKey ){
iColumn = -1;
@@ -71136,6 +87380,9 @@ static int isSortingIndex(
** ORDER BY term, that is OK. Just ignore that column of the index
*/
continue;
+ }else if( i==pIdx->nColumn ){
+ /* Index column i is the rowid. All other terms match. */
+ break;
}else{
/* If an index column fails to match and is not constrained by ==
** then the index cannot satisfy the ORDER BY constraint.
@@ -71143,7 +87390,7 @@ static int isSortingIndex(
return 0;
}
}
- assert( pIdx->aSortOrder!=0 );
+ assert( pIdx->aSortOrder!=0 || iColumn==-1 );
assert( pTerm->sortOrder==0 || pTerm->sortOrder==1 );
assert( iSortOrder==0 || iSortOrder==1 );
termSortOrder = iSortOrder ^ pTerm->sortOrder;
@@ -71187,33 +87434,9 @@ static int isSortingIndex(
}
/*
-** Check table to see if the ORDER BY clause in pOrderBy can be satisfied
-** by sorting in order of ROWID. Return true if so and set *pbRev to be
-** true for reverse ROWID and false for forward ROWID order.
-*/
-static int sortableByRowid(
- int base, /* Cursor number for table to be sorted */
- ExprList *pOrderBy, /* The ORDER BY clause */
- ExprMaskSet *pMaskSet, /* Mapping from tables to bitmaps */
- int *pbRev /* Set to 1 if ORDER BY is DESC */
-){
- Expr *p;
-
- assert( pOrderBy!=0 );
- assert( pOrderBy->nExpr>0 );
- p = pOrderBy->a[0].pExpr;
- if( p->op==TK_COLUMN && p->iTable==base && p->iColumn==-1
- && !referencesOtherTables(pOrderBy, pMaskSet, 1, base) ){
- *pbRev = pOrderBy->a[0].sortOrder;
- return 1;
- }
- return 0;
-}
-
-/*
** Prepare a crude estimate of the logarithm of the input value.
** The results need not be exact. This is only used for estimating
-** the total cost of performing operatings with O(logN) or O(NlogN)
+** the total cost of performing operations with O(logN) or O(NlogN)
** complexity. Because N is just a guess, it is no great tragedy if
** logN is a little off.
*/
@@ -71271,8 +87494,250 @@ static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){
#define TRACE_IDX_OUTPUTS(A)
#endif
+/*
+** Required because bestIndex() is called by bestOrClauseIndex()
+*/
+static void bestIndex(
+ Parse*, WhereClause*, struct SrcList_item*, Bitmask, ExprList*, WhereCost*);
+
+/*
+** This routine attempts to find an scanning strategy that can be used
+** to optimize an 'OR' expression that is part of a WHERE clause.
+**
+** The table associated with FROM clause term pSrc may be either a
+** regular B-Tree table or a virtual table.
+*/
+static void bestOrClauseIndex(
+ Parse *pParse, /* The parsing context */
+ WhereClause *pWC, /* The WHERE clause */
+ struct SrcList_item *pSrc, /* The FROM clause term to search */
+ Bitmask notReady, /* Mask of cursors that are not available */
+ ExprList *pOrderBy, /* The ORDER BY clause */
+ WhereCost *pCost /* Lowest cost query plan */
+){
+#ifndef SQLITE_OMIT_OR_OPTIMIZATION
+ const int iCur = pSrc->iCursor; /* The cursor of the table to be accessed */
+ const Bitmask maskSrc = getMask(pWC->pMaskSet, iCur); /* Bitmask for pSrc */
+ WhereTerm * const pWCEnd = &pWC->a[pWC->nTerm]; /* End of pWC->a[] */
+ WhereTerm *pTerm; /* A single term of the WHERE clause */
+
+ /* Search the WHERE clause terms for a usable WO_OR term. */
+ for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
+ if( pTerm->eOperator==WO_OR
+ && ((pTerm->prereqAll & ~maskSrc) & notReady)==0
+ && (pTerm->u.pOrInfo->indexable & maskSrc)!=0
+ ){
+ WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc;
+ WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm];
+ WhereTerm *pOrTerm;
+ int flags = WHERE_MULTI_OR;
+ double rTotal = 0;
+ double nRow = 0;
+ Bitmask used = 0;
+
+ for(pOrTerm=pOrWC->a; pOrTerm<pOrWCEnd; pOrTerm++){
+ WhereCost sTermCost;
+ WHERETRACE(("... Multi-index OR testing for term %d of %d....\n",
+ (pOrTerm - pOrWC->a), (pTerm - pWC->a)
+ ));
+ if( pOrTerm->eOperator==WO_AND ){
+ WhereClause *pAndWC = &pOrTerm->u.pAndInfo->wc;
+ bestIndex(pParse, pAndWC, pSrc, notReady, 0, &sTermCost);
+ }else if( pOrTerm->leftCursor==iCur ){
+ WhereClause tempWC;
+ tempWC.pParse = pWC->pParse;
+ tempWC.pMaskSet = pWC->pMaskSet;
+ tempWC.op = TK_AND;
+ tempWC.a = pOrTerm;
+ tempWC.nTerm = 1;
+ bestIndex(pParse, &tempWC, pSrc, notReady, 0, &sTermCost);
+ }else{
+ continue;
+ }
+ rTotal += sTermCost.rCost;
+ nRow += sTermCost.nRow;
+ used |= sTermCost.used;
+ if( rTotal>=pCost->rCost ) break;
+ }
+
+ /* If there is an ORDER BY clause, increase the scan cost to account
+ ** for the cost of the sort. */
+ if( pOrderBy!=0 ){
+ rTotal += nRow*estLog(nRow);
+ WHERETRACE(("... sorting increases OR cost to %.9g\n", rTotal));
+ }
+
+ /* If the cost of scanning using this OR term for optimization is
+ ** less than the current cost stored in pCost, replace the contents
+ ** of pCost. */
+ WHERETRACE(("... multi-index OR cost=%.9g nrow=%.9g\n", rTotal, nRow));
+ if( rTotal<pCost->rCost ){
+ pCost->rCost = rTotal;
+ pCost->nRow = nRow;
+ pCost->used = used;
+ pCost->plan.wsFlags = flags;
+ pCost->plan.u.pTerm = pTerm;
+ }
+ }
+ }
+#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
+}
+
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
+** Allocate and populate an sqlite3_index_info structure. It is the
+** responsibility of the caller to eventually release the structure
+** by passing the pointer returned by this function to sqlite3_free().
+*/
+static sqlite3_index_info *allocateIndexInfo(
+ Parse *pParse,
+ WhereClause *pWC,
+ struct SrcList_item *pSrc,
+ ExprList *pOrderBy
+){
+ int i, j;
+ int nTerm;
+ struct sqlite3_index_constraint *pIdxCons;
+ struct sqlite3_index_orderby *pIdxOrderBy;
+ struct sqlite3_index_constraint_usage *pUsage;
+ WhereTerm *pTerm;
+ int nOrderBy;
+ sqlite3_index_info *pIdxInfo;
+
+ WHERETRACE(("Recomputing index info for %s...\n", pSrc->pTab->zName));
+
+ /* Count the number of possible WHERE clause constraints referring
+ ** to this virtual table */
+ for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
+ if( pTerm->leftCursor != pSrc->iCursor ) continue;
+ assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
+ testcase( pTerm->eOperator==WO_IN );
+ testcase( pTerm->eOperator==WO_ISNULL );
+ if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
+ nTerm++;
+ }
+
+ /* If the ORDER BY clause contains only columns in the current
+ ** virtual table then allocate space for the aOrderBy part of
+ ** the sqlite3_index_info structure.
+ */
+ nOrderBy = 0;
+ if( pOrderBy ){
+ for(i=0; i<pOrderBy->nExpr; i++){
+ Expr *pExpr = pOrderBy->a[i].pExpr;
+ if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break;
+ }
+ if( i==pOrderBy->nExpr ){
+ nOrderBy = pOrderBy->nExpr;
+ }
+ }
+
+ /* Allocate the sqlite3_index_info structure
+ */
+ pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
+ + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
+ + sizeof(*pIdxOrderBy)*nOrderBy );
+ if( pIdxInfo==0 ){
+ sqlite3ErrorMsg(pParse, "out of memory");
+ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
+ return 0;
+ }
+
+ /* Initialize the structure. The sqlite3_index_info structure contains
+ ** many fields that are declared "const" to prevent xBestIndex from
+ ** changing them. We have to do some funky casting in order to
+ ** initialize those fields.
+ */
+ pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
+ pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
+ pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
+ *(int*)&pIdxInfo->nConstraint = nTerm;
+ *(int*)&pIdxInfo->nOrderBy = nOrderBy;
+ *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons;
+ *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy;
+ *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
+ pUsage;
+
+ for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
+ if( pTerm->leftCursor != pSrc->iCursor ) continue;
+ assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
+ testcase( pTerm->eOperator==WO_IN );
+ testcase( pTerm->eOperator==WO_ISNULL );
+ if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
+ pIdxCons[j].iColumn = pTerm->u.leftColumn;
+ pIdxCons[j].iTermOffset = i;
+ pIdxCons[j].op = (u8)pTerm->eOperator;
+ /* The direct assignment in the previous line is possible only because
+ ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The
+ ** following asserts verify this fact. */
+ assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ );
+ assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT );
+ assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE );
+ assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT );
+ assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE );
+ assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH );
+ assert( pTerm->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) );
+ j++;
+ }
+ for(i=0; i<nOrderBy; i++){
+ Expr *pExpr = pOrderBy->a[i].pExpr;
+ pIdxOrderBy[i].iColumn = pExpr->iColumn;
+ pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder;
+ }
+
+ return pIdxInfo;
+}
+
+/*
+** The table object reference passed as the second argument to this function
+** must represent a virtual table. This function invokes the xBestIndex()
+** method of the virtual table with the sqlite3_index_info pointer passed
+** as the argument.
+**
+** If an error occurs, pParse is populated with an error message and a
+** non-zero value is returned. Otherwise, 0 is returned and the output
+** part of the sqlite3_index_info structure is left populated.
+**
+** Whether or not an error is returned, it is the responsibility of the
+** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates
+** that this is required.
+*/
+static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
+ sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab;
+ int i;
+ int rc;
+
+ (void)sqlite3SafetyOff(pParse->db);
+ WHERETRACE(("xBestIndex for %s\n", pTab->zName));
+ TRACE_IDX_INPUTS(p);
+ rc = pVtab->pModule->xBestIndex(pVtab, p);
+ TRACE_IDX_OUTPUTS(p);
+ (void)sqlite3SafetyOn(pParse->db);
+
+ if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_NOMEM ){
+ pParse->db->mallocFailed = 1;
+ }else if( !pVtab->zErrMsg ){
+ sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc));
+ }else{
+ sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg);
+ }
+ }
+ sqlite3DbFree(pParse->db, pVtab->zErrMsg);
+ pVtab->zErrMsg = 0;
+
+ for(i=0; i<p->nConstraint; i++){
+ if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){
+ sqlite3ErrorMsg(pParse,
+ "table %s: xBestIndex returned an invalid plan", pTab->zName);
+ }
+ }
+
+ return pParse->nErr;
+}
+
+
+/*
** Compute the best index for a virtual table.
**
** The best index is computed by the xBestIndex method of the virtual
@@ -71288,113 +87753,39 @@ static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){
** routine takes care of freeing the sqlite3_index_info structure after
** everybody has finished with it.
*/
-static double bestVirtualIndex(
- Parse *pParse, /* The parsing context */
- WhereClause *pWC, /* The WHERE clause */
- struct SrcList_item *pSrc, /* The FROM clause term to search */
- Bitmask notReady, /* Mask of cursors that are not available */
- ExprList *pOrderBy, /* The order by clause */
- int orderByUsable, /* True if we can potential sort */
- sqlite3_index_info **ppIdxInfo /* Index information passed to xBestIndex */
+static void bestVirtualIndex(
+ Parse *pParse, /* The parsing context */
+ WhereClause *pWC, /* The WHERE clause */
+ struct SrcList_item *pSrc, /* The FROM clause term to search */
+ Bitmask notReady, /* Mask of cursors that are not available */
+ ExprList *pOrderBy, /* The order by clause */
+ WhereCost *pCost, /* Lowest cost query plan */
+ sqlite3_index_info **ppIdxInfo /* Index information passed to xBestIndex */
){
Table *pTab = pSrc->pTab;
sqlite3_index_info *pIdxInfo;
struct sqlite3_index_constraint *pIdxCons;
- struct sqlite3_index_orderby *pIdxOrderBy;
struct sqlite3_index_constraint_usage *pUsage;
WhereTerm *pTerm;
int i, j;
int nOrderBy;
- int rc;
+
+ /* Make sure wsFlags is initialized to some sane value. Otherwise, if the
+ ** malloc in allocateIndexInfo() fails and this function returns leaving
+ ** wsFlags in an uninitialized state, the caller may behave unpredictably.
+ */
+ memset(pCost, 0, sizeof(*pCost));
+ pCost->plan.wsFlags = WHERE_VIRTUALTABLE;
/* If the sqlite3_index_info structure has not been previously
- ** allocated and initialized for this virtual table, then allocate
- ** and initialize it now
+ ** allocated and initialized, then allocate and initialize it now.
*/
pIdxInfo = *ppIdxInfo;
if( pIdxInfo==0 ){
- WhereTerm *pTerm;
- int nTerm;
- WHERETRACE(("Recomputing index info for %s...\n", pTab->zName));
-
- /* Count the number of possible WHERE clause constraints referring
- ** to this virtual table */
- for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
- if( pTerm->leftCursor != pSrc->iCursor ) continue;
- if( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
- testcase( pTerm->eOperator==WO_IN );
- testcase( pTerm->eOperator==WO_ISNULL );
- if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
- nTerm++;
- }
-
- /* If the ORDER BY clause contains only columns in the current
- ** virtual table then allocate space for the aOrderBy part of
- ** the sqlite3_index_info structure.
- */
- nOrderBy = 0;
- if( pOrderBy ){
- for(i=0; i<pOrderBy->nExpr; i++){
- Expr *pExpr = pOrderBy->a[i].pExpr;
- if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break;
- }
- if( i==pOrderBy->nExpr ){
- nOrderBy = pOrderBy->nExpr;
- }
- }
-
- /* Allocate the sqlite3_index_info structure
- */
- pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
- + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
- + sizeof(*pIdxOrderBy)*nOrderBy );
- if( pIdxInfo==0 ){
- sqlite3ErrorMsg(pParse, "out of memory");
- return 0.0;
- }
- *ppIdxInfo = pIdxInfo;
-
- /* Initialize the structure. The sqlite3_index_info structure contains
- ** many fields that are declared "const" to prevent xBestIndex from
- ** changing them. We have to do some funky casting in order to
- ** initialize those fields.
- */
- pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
- pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
- pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
- *(int*)&pIdxInfo->nConstraint = nTerm;
- *(int*)&pIdxInfo->nOrderBy = nOrderBy;
- *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons;
- *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy;
- *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
- pUsage;
-
- for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
- if( pTerm->leftCursor != pSrc->iCursor ) continue;
- if( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
- testcase( pTerm->eOperator==WO_IN );
- testcase( pTerm->eOperator==WO_ISNULL );
- if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
- pIdxCons[j].iColumn = pTerm->leftColumn;
- pIdxCons[j].iTermOffset = i;
- pIdxCons[j].op = pTerm->eOperator;
- /* The direct assignment in the previous line is possible only because
- ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The
- ** following asserts verify this fact. */
- assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ );
- assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT );
- assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE );
- assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT );
- assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE );
- assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH );
- assert( pTerm->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) );
- j++;
- }
- for(i=0; i<nOrderBy; i++){
- Expr *pExpr = pOrderBy->a[i].pExpr;
- pIdxOrderBy[i].iColumn = pExpr->iColumn;
- pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder;
- }
+ *ppIdxInfo = pIdxInfo = allocateIndexInfo(pParse, pWC, pSrc, pOrderBy);
+ }
+ if( pIdxInfo==0 ){
+ return;
}
/* At this point, the sqlite3_index_info structure that pIdxInfo points
@@ -71409,14 +87800,7 @@ static double bestVirtualIndex(
** sqlite3ViewGetColumnNames() would have picked up the error.
*/
assert( pTab->azModuleArg && pTab->azModuleArg[0] );
- assert( pTab->pVtab );
-#if 0
- if( pTab->pVtab==0 ){
- sqlite3ErrorMsg(pParse, "undefined module %s for table %s",
- pTab->azModuleArg[0], pTab->zName);
- return 0.0;
- }
-#endif
+ assert( sqlite3GetVTable(pParse->db, pTab) );
/* Set the aConstraint[].usable fields and initialize all
** output variables to zero.
@@ -71443,7 +87827,7 @@ static double bestVirtualIndex(
for(i=0; i<pIdxInfo->nConstraint; i++, pIdxCons++){
j = pIdxCons->iTermOffset;
pTerm = &pWC->a[j];
- pIdxCons->usable = (pTerm->prereqRight & notReady)==0;
+ pIdxCons->usable = (pTerm->prereqRight&notReady) ? 0 : 1;
}
memset(pUsage, 0, sizeof(pUsage[0])*pIdxInfo->nConstraint);
if( pIdxInfo->needToFreeIdxStr ){
@@ -71453,47 +87837,267 @@ static double bestVirtualIndex(
pIdxInfo->idxNum = 0;
pIdxInfo->needToFreeIdxStr = 0;
pIdxInfo->orderByConsumed = 0;
- pIdxInfo->estimatedCost = SQLITE_BIG_DBL / 2.0;
+ /* ((double)2) In case of SQLITE_OMIT_FLOATING_POINT... */
+ pIdxInfo->estimatedCost = SQLITE_BIG_DBL / ((double)2);
nOrderBy = pIdxInfo->nOrderBy;
- if( pIdxInfo->nOrderBy && !orderByUsable ){
- *(int*)&pIdxInfo->nOrderBy = 0;
+ if( !pOrderBy ){
+ pIdxInfo->nOrderBy = 0;
}
- (void)sqlite3SafetyOff(pParse->db);
- WHERETRACE(("xBestIndex for %s\n", pTab->zName));
- TRACE_IDX_INPUTS(pIdxInfo);
- rc = pTab->pVtab->pModule->xBestIndex(pTab->pVtab, pIdxInfo);
- TRACE_IDX_OUTPUTS(pIdxInfo);
- (void)sqlite3SafetyOn(pParse->db);
+ if( vtabBestIndex(pParse, pTab, pIdxInfo) ){
+ return;
+ }
+ pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
for(i=0; i<pIdxInfo->nConstraint; i++){
- if( !pIdxInfo->aConstraint[i].usable && pUsage[i].argvIndex>0 ){
- sqlite3ErrorMsg(pParse,
- "table %s: xBestIndex returned an invalid plan", pTab->zName);
- return 0.0;
+ if( pUsage[i].argvIndex>0 ){
+ pCost->used |= pWC->a[pIdxCons[i].iTermOffset].prereqRight;
}
}
- if( rc!=SQLITE_OK ){
- if( rc==SQLITE_NOMEM ){
- pParse->db->mallocFailed = 1;
- }else {
- sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc));
- }
+ /* The cost is not allowed to be larger than SQLITE_BIG_DBL (the
+ ** inital value of lowestCost in this loop. If it is, then the
+ ** (cost<lowestCost) test below will never be true.
+ **
+ ** Use "(double)2" instead of "2.0" in case OMIT_FLOATING_POINT
+ ** is defined.
+ */
+ if( (SQLITE_BIG_DBL/((double)2))<pIdxInfo->estimatedCost ){
+ pCost->rCost = (SQLITE_BIG_DBL/((double)2));
+ }else{
+ pCost->rCost = pIdxInfo->estimatedCost;
}
- *(int*)&pIdxInfo->nOrderBy = nOrderBy;
+ pCost->plan.u.pVtabIdx = pIdxInfo;
+ if( pIdxInfo->orderByConsumed ){
+ pCost->plan.wsFlags |= WHERE_ORDERBY;
+ }
+ pCost->plan.nEq = 0;
+ pIdxInfo->nOrderBy = nOrderBy;
- return pIdxInfo->estimatedCost;
+ /* Try to find a more efficient access pattern by using multiple indexes
+ ** to optimize an OR expression within the WHERE clause.
+ */
+ bestOrClauseIndex(pParse, pWC, pSrc, notReady, pOrderBy, pCost);
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */
/*
-** Find the best index for accessing a particular table. Return a pointer
-** to the index, flags that describe how the index should be used, the
-** number of equality constraints, and the "cost" for this index.
+** Argument pIdx is a pointer to an index structure that has an array of
+** SQLITE_INDEX_SAMPLES evenly spaced samples of the first indexed column
+** stored in Index.aSample. The domain of values stored in said column
+** may be thought of as divided into (SQLITE_INDEX_SAMPLES+1) regions.
+** Region 0 contains all values smaller than the first sample value. Region
+** 1 contains values larger than or equal to the value of the first sample,
+** but smaller than the value of the second. And so on.
+**
+** If successful, this function determines which of the regions value
+** pVal lies in, sets *piRegion to the region index (a value between 0
+** and SQLITE_INDEX_SAMPLES+1, inclusive) and returns SQLITE_OK.
+** Or, if an OOM occurs while converting text values between encodings,
+** SQLITE_NOMEM is returned and *piRegion is undefined.
+*/
+#ifdef SQLITE_ENABLE_STAT2
+static int whereRangeRegion(
+ Parse *pParse, /* Database connection */
+ Index *pIdx, /* Index to consider domain of */
+ sqlite3_value *pVal, /* Value to consider */
+ int *piRegion /* OUT: Region of domain in which value lies */
+){
+ if( ALWAYS(pVal) ){
+ IndexSample *aSample = pIdx->aSample;
+ int i = 0;
+ int eType = sqlite3_value_type(pVal);
+
+ if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
+ double r = sqlite3_value_double(pVal);
+ for(i=0; i<SQLITE_INDEX_SAMPLES; i++){
+ if( aSample[i].eType==SQLITE_NULL ) continue;
+ if( aSample[i].eType>=SQLITE_TEXT || aSample[i].u.r>r ) break;
+ }
+ }else{
+ sqlite3 *db = pParse->db;
+ CollSeq *pColl;
+ const u8 *z;
+ int n;
+
+ /* pVal comes from sqlite3ValueFromExpr() so the type cannot be NULL */
+ assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB );
+
+ if( eType==SQLITE_BLOB ){
+ z = (const u8 *)sqlite3_value_blob(pVal);
+ pColl = db->pDfltColl;
+ assert( pColl->enc==SQLITE_UTF8 );
+ }else{
+ pColl = sqlite3GetCollSeq(db, SQLITE_UTF8, 0, *pIdx->azColl);
+ if( pColl==0 ){
+ sqlite3ErrorMsg(pParse, "no such collation sequence: %s",
+ *pIdx->azColl);
+ return SQLITE_ERROR;
+ }
+ z = (const u8 *)sqlite3ValueText(pVal, pColl->enc);
+ if( !z ){
+ return SQLITE_NOMEM;
+ }
+ assert( z && pColl && pColl->xCmp );
+ }
+ n = sqlite3ValueBytes(pVal, pColl->enc);
+
+ for(i=0; i<SQLITE_INDEX_SAMPLES; i++){
+ int r;
+ int eSampletype = aSample[i].eType;
+ if( eSampletype==SQLITE_NULL || eSampletype<eType ) continue;
+ if( (eSampletype!=eType) ) break;
+#ifndef SQLITE_OMIT_UTF16
+ if( pColl->enc!=SQLITE_UTF8 ){
+ int nSample;
+ char *zSample = sqlite3Utf8to16(
+ db, pColl->enc, aSample[i].u.z, aSample[i].nByte, &nSample
+ );
+ if( !zSample ){
+ assert( db->mallocFailed );
+ return SQLITE_NOMEM;
+ }
+ r = pColl->xCmp(pColl->pUser, nSample, zSample, n, z);
+ sqlite3DbFree(db, zSample);
+ }else
+#endif
+ {
+ r = pColl->xCmp(pColl->pUser, aSample[i].nByte, aSample[i].u.z, n, z);
+ }
+ if( r>0 ) break;
+ }
+ }
+
+ assert( i>=0 && i<=SQLITE_INDEX_SAMPLES );
+ *piRegion = i;
+ }
+ return SQLITE_OK;
+}
+#endif /* #ifdef SQLITE_ENABLE_STAT2 */
+
+/*
+** This function is used to estimate the number of rows that will be visited
+** by scanning an index for a range of values. The range may have an upper
+** bound, a lower bound, or both. The WHERE clause terms that set the upper
+** and lower bounds are represented by pLower and pUpper respectively. For
+** example, assuming that index p is on t1(a):
+**
+** ... FROM t1 WHERE a > ? AND a < ? ...
+** |_____| |_____|
+** | |
+** pLower pUpper
+**
+** If either of the upper or lower bound is not present, then NULL is passed in
+** place of the corresponding WhereTerm.
+**
+** The nEq parameter is passed the index of the index column subject to the
+** range constraint. Or, equivalently, the number of equality constraints
+** optimized by the proposed index scan. For example, assuming index p is
+** on t1(a, b), and the SQL query is:
+**
+** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ...
+**
+** then nEq should be passed the value 1 (as the range restricted column,
+** b, is the second left-most column of the index). Or, if the query is:
+**
+** ... FROM t1 WHERE a > ? AND a < ? ...
+**
+** then nEq should be passed 0.
+**
+** The returned value is an integer between 1 and 100, inclusive. A return
+** value of 1 indicates that the proposed range scan is expected to visit
+** approximately 1/100th (1%) of the rows selected by the nEq equality
+** constraints (if any). A return value of 100 indicates that it is expected
+** that the range scan will visit every row (100%) selected by the equality
+** constraints.
+**
+** In the absence of sqlite_stat2 ANALYZE data, each range inequality
+** reduces the search space by 2/3rds. Hence a single constraint (x>?)
+** results in a return of 33 and a range constraint (x>? AND x<?) results
+** in a return of 11.
+*/
+static int whereRangeScanEst(
+ Parse *pParse, /* Parsing & code generating context */
+ Index *p, /* The index containing the range-compared column; "x" */
+ int nEq, /* index into p->aCol[] of the range-compared column */
+ WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */
+ WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */
+ int *piEst /* OUT: Return value */
+){
+ int rc = SQLITE_OK;
+
+#ifdef SQLITE_ENABLE_STAT2
+ sqlite3 *db = pParse->db;
+ sqlite3_value *pLowerVal = 0;
+ sqlite3_value *pUpperVal = 0;
+
+ if( nEq==0 && p->aSample ){
+ int iEst;
+ int iLower = 0;
+ int iUpper = SQLITE_INDEX_SAMPLES;
+ u8 aff = p->pTable->aCol[0].affinity;
+
+ if( pLower ){
+ Expr *pExpr = pLower->pExpr->pRight;
+ rc = sqlite3ValueFromExpr(db, pExpr, SQLITE_UTF8, aff, &pLowerVal);
+ }
+ if( rc==SQLITE_OK && pUpper ){
+ Expr *pExpr = pUpper->pExpr->pRight;
+ rc = sqlite3ValueFromExpr(db, pExpr, SQLITE_UTF8, aff, &pUpperVal);
+ }
+
+ if( rc!=SQLITE_OK || (pLowerVal==0 && pUpperVal==0) ){
+ sqlite3ValueFree(pLowerVal);
+ sqlite3ValueFree(pUpperVal);
+ goto range_est_fallback;
+ }else if( pLowerVal==0 ){
+ rc = whereRangeRegion(pParse, p, pUpperVal, &iUpper);
+ if( pLower ) iLower = iUpper/2;
+ }else if( pUpperVal==0 ){
+ rc = whereRangeRegion(pParse, p, pLowerVal, &iLower);
+ if( pUpper ) iUpper = (iLower + SQLITE_INDEX_SAMPLES + 1)/2;
+ }else{
+ rc = whereRangeRegion(pParse, p, pUpperVal, &iUpper);
+ if( rc==SQLITE_OK ){
+ rc = whereRangeRegion(pParse, p, pLowerVal, &iLower);
+ }
+ }
+
+ iEst = iUpper - iLower;
+ testcase( iEst==SQLITE_INDEX_SAMPLES );
+ assert( iEst<=SQLITE_INDEX_SAMPLES );
+ if( iEst<1 ){
+ iEst = 1;
+ }
+
+ sqlite3ValueFree(pLowerVal);
+ sqlite3ValueFree(pUpperVal);
+ *piEst = (iEst * 100)/SQLITE_INDEX_SAMPLES;
+ return rc;
+ }
+range_est_fallback:
+#else
+ UNUSED_PARAMETER(pParse);
+ UNUSED_PARAMETER(p);
+ UNUSED_PARAMETER(nEq);
+#endif
+ assert( pLower || pUpper );
+ if( pLower && pUpper ){
+ *piEst = 11;
+ }else{
+ *piEst = 33;
+ }
+ return rc;
+}
+
+
+/*
+** Find the query plan for accessing a particular table. Write the
+** best query plan and its cost into the WhereCost object supplied as the
+** last parameter.
**
-** The lowest cost index wins. The cost is an estimate of the amount of
-** CPU and disk I/O need to process the request using the selected index.
+** The lowest cost plan wins. The cost is an estimate of the amount of
+** CPU and disk I/O need to process the request using the selected plan.
** Factors that influence cost include:
**
** * The estimated number of rows that will be retrieved. (The
@@ -71504,242 +88108,363 @@ static double bestVirtualIndex(
** * Whether or not there must be separate lookups in the
** index and in the main table.
**
+** If there was an INDEXED BY clause (pSrc->pIndex) attached to the table in
+** the SQL statement, then this function only considers plans using the
+** named index. If no such plan is found, then the returned cost is
+** SQLITE_BIG_DBL. If a plan is found that uses the named index,
+** then the cost is calculated in the usual way.
+**
+** If a NOT INDEXED clause (pSrc->notIndexed!=0) was attached to the table
+** in the SELECT statement, then no indexes are considered. However, the
+** selected plan may still take advantage of the tables built-in rowid
+** index.
*/
-static double bestIndex(
+static void bestBtreeIndex(
Parse *pParse, /* The parsing context */
WhereClause *pWC, /* The WHERE clause */
struct SrcList_item *pSrc, /* The FROM clause term to search */
Bitmask notReady, /* Mask of cursors that are not available */
- ExprList *pOrderBy, /* The order by clause */
- Index **ppIndex, /* Make *ppIndex point to the best index */
- int *pFlags, /* Put flags describing this choice in *pFlags */
- int *pnEq /* Put the number of == or IN constraints here */
+ ExprList *pOrderBy, /* The ORDER BY clause */
+ WhereCost *pCost /* Lowest cost query plan */
){
- WhereTerm *pTerm;
- Index *bestIdx = 0; /* Index that gives the lowest cost */
- double lowestCost; /* The cost of using bestIdx */
- int bestFlags = 0; /* Flags associated with bestIdx */
- int bestNEq = 0; /* Best value for nEq */
int iCur = pSrc->iCursor; /* The cursor of the table to be accessed */
Index *pProbe; /* An index we are evaluating */
- int rev; /* True to scan in reverse order */
- int flags; /* Flags associated with pProbe */
- int nEq; /* Number of == or IN constraints */
- int eqTermMask; /* Mask of valid equality operators */
- double cost; /* Cost of using pProbe */
-
- WHERETRACE(("bestIndex: tbl=%s notReady=%x\n", pSrc->pTab->zName, notReady));
- lowestCost = SQLITE_BIG_DBL;
- pProbe = pSrc->pTab->pIndex;
-
- /* If the table has no indices and there are no terms in the where
- ** clause that refer to the ROWID, then we will never be able to do
- ** anything other than a full table scan on this table. We might as
- ** well put it first in the join order. That way, perhaps it can be
- ** referenced by other tables in the join.
- */
- if( pProbe==0 &&
- findTerm(pWC, iCur, -1, 0, WO_EQ|WO_IN|WO_LT|WO_LE|WO_GT|WO_GE,0)==0 &&
- (pOrderBy==0 || !sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev)) ){
- *pFlags = 0;
- *ppIndex = 0;
- *pnEq = 0;
- return 0.0;
- }
-
- /* Check for a rowid=EXPR or rowid IN (...) constraints
- */
- pTerm = findTerm(pWC, iCur, -1, notReady, WO_EQ|WO_IN, 0);
- if( pTerm ){
- Expr *pExpr;
- *ppIndex = 0;
- bestFlags = WHERE_ROWID_EQ;
- if( pTerm->eOperator & WO_EQ ){
- /* Rowid== is always the best pick. Look no further. Because only
- ** a single row is generated, output is always in sorted order */
- *pFlags = WHERE_ROWID_EQ | WHERE_UNIQUE;
- *pnEq = 1;
- WHERETRACE(("... best is rowid\n"));
- return 0.0;
- }else if( (pExpr = pTerm->pExpr)->pList!=0 ){
- /* Rowid IN (LIST): cost is NlogN where N is the number of list
- ** elements. */
- lowestCost = pExpr->pList->nExpr;
- lowestCost *= estLog(lowestCost);
- }else{
- /* Rowid IN (SELECT): cost is NlogN where N is the number of rows
- ** in the result of the inner select. We have no way to estimate
- ** that value so make a wild guess. */
- lowestCost = 200;
- }
- WHERETRACE(("... rowid IN cost: %.9g\n", lowestCost));
- }
+ Index *pIdx; /* Copy of pProbe, or zero for IPK index */
+ int eqTermMask; /* Current mask of valid equality operators */
+ int idxEqTermMask; /* Index mask of valid equality operators */
+ Index sPk; /* A fake index object for the primary key */
+ unsigned int aiRowEstPk[2]; /* The aiRowEst[] value for the sPk index */
+ int aiColumnPk = -1; /* The aColumn[] value for the sPk index */
+ int wsFlagMask; /* Allowed flags in pCost->plan.wsFlag */
+
+ /* Initialize the cost to a worst-case value */
+ memset(pCost, 0, sizeof(*pCost));
+ pCost->rCost = SQLITE_BIG_DBL;
- /* Estimate the cost of a table scan. If we do not know how many
- ** entries are in the table, use 1 million as a guess.
- */
- cost = pProbe ? pProbe->aiRowEst[0] : 1000000;
- WHERETRACE(("... table scan base cost: %.9g\n", cost));
- flags = WHERE_ROWID_RANGE;
-
- /* Check for constraints on a range of rowids in a table scan.
+ /* If the pSrc table is the right table of a LEFT JOIN then we may not
+ ** use an index to satisfy IS NULL constraints on that table. This is
+ ** because columns might end up being NULL if the table does not match -
+ ** a circumstance which the index cannot help us discover. Ticket #2177.
*/
- pTerm = findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE|WO_GT|WO_GE, 0);
- if( pTerm ){
- if( findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE, 0) ){
- flags |= WHERE_TOP_LIMIT;
- cost /= 3; /* Guess that rowid<EXPR eliminates two-thirds or rows */
- }
- if( findTerm(pWC, iCur, -1, notReady, WO_GT|WO_GE, 0) ){
- flags |= WHERE_BTM_LIMIT;
- cost /= 3; /* Guess that rowid>EXPR eliminates two-thirds of rows */
- }
- WHERETRACE(("... rowid range reduces cost to %.9g\n", cost));
+ if( pSrc->jointype & JT_LEFT ){
+ idxEqTermMask = WO_EQ|WO_IN;
}else{
- flags = 0;
+ idxEqTermMask = WO_EQ|WO_IN|WO_ISNULL;
}
- /* If the table scan does not satisfy the ORDER BY clause, increase
- ** the cost by NlogN to cover the expense of sorting. */
- if( pOrderBy ){
- if( sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev) ){
- flags |= WHERE_ORDERBY|WHERE_ROWID_RANGE;
- if( rev ){
- flags |= WHERE_REVERSE;
- }
+ if( pSrc->pIndex ){
+ /* An INDEXED BY clause specifies a particular index to use */
+ pIdx = pProbe = pSrc->pIndex;
+ wsFlagMask = ~(WHERE_ROWID_EQ|WHERE_ROWID_RANGE);
+ eqTermMask = idxEqTermMask;
+ }else{
+ /* There is no INDEXED BY clause. Create a fake Index object to
+ ** represent the primary key */
+ Index *pFirst; /* Any other index on the table */
+ memset(&sPk, 0, sizeof(Index));
+ sPk.nColumn = 1;
+ sPk.aiColumn = &aiColumnPk;
+ sPk.aiRowEst = aiRowEstPk;
+ aiRowEstPk[1] = 1;
+ sPk.onError = OE_Replace;
+ sPk.pTable = pSrc->pTab;
+ pFirst = pSrc->pTab->pIndex;
+ if( pSrc->notIndexed==0 ){
+ sPk.pNext = pFirst;
+ }
+ /* The aiRowEstPk[0] is an estimate of the total number of rows in the
+ ** table. Get this information from the ANALYZE information if it is
+ ** available. If not available, assume the table 1 million rows in size.
+ */
+ if( pFirst ){
+ assert( pFirst->aiRowEst!=0 ); /* Allocated together with pFirst */
+ aiRowEstPk[0] = pFirst->aiRowEst[0];
}else{
- cost += cost*estLog(cost);
- WHERETRACE(("... sorting increases cost to %.9g\n", cost));
+ aiRowEstPk[0] = 1000000;
}
- }
- if( cost<lowestCost ){
- lowestCost = cost;
- bestFlags = flags;
- }
-
- /* If the pSrc table is the right table of a LEFT JOIN then we may not
- ** use an index to satisfy IS NULL constraints on that table. This is
- ** because columns might end up being NULL if the table does not match -
- ** a circumstance which the index cannot help us discover. Ticket #2177.
- */
- if( (pSrc->jointype & JT_LEFT)!=0 ){
+ pProbe = &sPk;
+ wsFlagMask = ~(
+ WHERE_COLUMN_IN|WHERE_COLUMN_EQ|WHERE_COLUMN_NULL|WHERE_COLUMN_RANGE
+ );
eqTermMask = WO_EQ|WO_IN;
- }else{
- eqTermMask = WO_EQ|WO_IN|WO_ISNULL;
+ pIdx = 0;
}
- /* Look at each index.
+ /* Loop over all indices looking for the best one to use
*/
- for(; pProbe; pProbe=pProbe->pNext){
- int i; /* Loop counter */
- double inMultiplier = 1;
-
- WHERETRACE(("... index %s:\n", pProbe->zName));
+ for(; pProbe; pIdx=pProbe=pProbe->pNext){
+ const unsigned int * const aiRowEst = pProbe->aiRowEst;
+ double cost; /* Cost of using pProbe */
+ double nRow; /* Estimated number of rows in result set */
+ int rev; /* True to scan in reverse order */
+ int wsFlags = 0;
+ Bitmask used = 0;
- /* Count the number of columns in the index that are satisfied
- ** by x=EXPR constraints or x IN (...) constraints.
+ /* The following variables are populated based on the properties of
+ ** scan being evaluated. They are then used to determine the expected
+ ** cost and number of rows returned.
+ **
+ ** nEq:
+ ** Number of equality terms that can be implemented using the index.
+ **
+ ** nInMul:
+ ** The "in-multiplier". This is an estimate of how many seek operations
+ ** SQLite must perform on the index in question. For example, if the
+ ** WHERE clause is:
+ **
+ ** WHERE a IN (1, 2, 3) AND b IN (4, 5, 6)
+ **
+ ** SQLite must perform 9 lookups on an index on (a, b), so nInMul is
+ ** set to 9. Given the same schema and either of the following WHERE
+ ** clauses:
+ **
+ ** WHERE a = 1
+ ** WHERE a >= 2
+ **
+ ** nInMul is set to 1.
+ **
+ ** If there exists a WHERE term of the form "x IN (SELECT ...)", then
+ ** the sub-select is assumed to return 25 rows for the purposes of
+ ** determining nInMul.
+ **
+ ** bInEst:
+ ** Set to true if there was at least one "x IN (SELECT ...)" term used
+ ** in determining the value of nInMul.
+ **
+ ** nBound:
+ ** An estimate on the amount of the table that must be searched. A
+ ** value of 100 means the entire table is searched. Range constraints
+ ** might reduce this to a value less than 100 to indicate that only
+ ** a fraction of the table needs searching. In the absence of
+ ** sqlite_stat2 ANALYZE data, a single inequality reduces the search
+ ** space to 1/3rd its original size. So an x>? constraint reduces
+ ** nBound to 33. Two constraints (x>? AND x<?) reduce nBound to 11.
+ **
+ ** bSort:
+ ** Boolean. True if there is an ORDER BY clause that will require an
+ ** external sort (i.e. scanning the index being evaluated will not
+ ** correctly order records).
+ **
+ ** bLookup:
+ ** Boolean. True if for each index entry visited a lookup on the
+ ** corresponding table b-tree is required. This is always false
+ ** for the rowid index. For other indexes, it is true unless all the
+ ** columns of the table used by the SELECT statement are present in
+ ** the index (such an index is sometimes described as a covering index).
+ ** For example, given the index on (a, b), the second of the following
+ ** two queries requires table b-tree lookups, but the first does not.
+ **
+ ** SELECT a, b FROM tbl WHERE a = 1;
+ ** SELECT a, b, c FROM tbl WHERE a = 1;
*/
- flags = 0;
- for(i=0; i<pProbe->nColumn; i++){
- int j = pProbe->aiColumn[i];
- pTerm = findTerm(pWC, iCur, j, notReady, eqTermMask, pProbe);
+ int nEq;
+ int bInEst = 0;
+ int nInMul = 1;
+ int nBound = 100;
+ int bSort = 0;
+ int bLookup = 0;
+
+ /* Determine the values of nEq and nInMul */
+ for(nEq=0; nEq<pProbe->nColumn; nEq++){
+ WhereTerm *pTerm; /* A single term of the WHERE clause */
+ int j = pProbe->aiColumn[nEq];
+ pTerm = findTerm(pWC, iCur, j, notReady, eqTermMask, pIdx);
if( pTerm==0 ) break;
- flags |= WHERE_COLUMN_EQ;
+ wsFlags |= (WHERE_COLUMN_EQ|WHERE_ROWID_EQ);
if( pTerm->eOperator & WO_IN ){
Expr *pExpr = pTerm->pExpr;
- flags |= WHERE_COLUMN_IN;
- if( pExpr->pSelect!=0 ){
- inMultiplier *= 25;
- }else if( pExpr->pList!=0 ){
- inMultiplier *= pExpr->pList->nExpr + 1;
+ wsFlags |= WHERE_COLUMN_IN;
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+ nInMul *= 25;
+ bInEst = 1;
+ }else if( pExpr->x.pList ){
+ nInMul *= pExpr->x.pList->nExpr + 1;
}
+ }else if( pTerm->eOperator & WO_ISNULL ){
+ wsFlags |= WHERE_COLUMN_NULL;
}
+ used |= pTerm->prereqRight;
}
- cost = pProbe->aiRowEst[i] * inMultiplier * estLog(inMultiplier);
- nEq = i;
- if( pProbe->onError!=OE_None && (flags & WHERE_COLUMN_IN)==0
- && nEq==pProbe->nColumn ){
- flags |= WHERE_UNIQUE;
- }
- WHERETRACE(("...... nEq=%d inMult=%.9g cost=%.9g\n",nEq,inMultiplier,cost));
- /* Look for range constraints
- */
+ /* Determine the value of nBound. */
if( nEq<pProbe->nColumn ){
int j = pProbe->aiColumn[nEq];
- pTerm = findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE|WO_GT|WO_GE, pProbe);
- if( pTerm ){
- flags |= WHERE_COLUMN_RANGE;
- if( findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE, pProbe) ){
- flags |= WHERE_TOP_LIMIT;
- cost /= 3;
+ if( findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE|WO_GT|WO_GE, pIdx) ){
+ WhereTerm *pTop = findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE, pIdx);
+ WhereTerm *pBtm = findTerm(pWC, iCur, j, notReady, WO_GT|WO_GE, pIdx);
+ whereRangeScanEst(pParse, pProbe, nEq, pBtm, pTop, &nBound);
+ if( pTop ){
+ wsFlags |= WHERE_TOP_LIMIT;
+ used |= pTop->prereqRight;
}
- if( findTerm(pWC, iCur, j, notReady, WO_GT|WO_GE, pProbe) ){
- flags |= WHERE_BTM_LIMIT;
- cost /= 3;
+ if( pBtm ){
+ wsFlags |= WHERE_BTM_LIMIT;
+ used |= pBtm->prereqRight;
}
- WHERETRACE(("...... range reduces cost to %.9g\n", cost));
+ wsFlags |= (WHERE_COLUMN_RANGE|WHERE_ROWID_RANGE);
+ }
+ }else if( pProbe->onError!=OE_None ){
+ testcase( wsFlags & WHERE_COLUMN_IN );
+ testcase( wsFlags & WHERE_COLUMN_NULL );
+ if( (wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0 ){
+ wsFlags |= WHERE_UNIQUE;
}
}
- /* Add the additional cost of sorting if that is a factor.
- */
+ /* If there is an ORDER BY clause and the index being considered will
+ ** naturally scan rows in the required order, set the appropriate flags
+ ** in wsFlags. Otherwise, if there is an ORDER BY clause but the index
+ ** will scan rows in a different order, set the bSort variable. */
if( pOrderBy ){
- if( (flags & WHERE_COLUMN_IN)==0 &&
- isSortingIndex(pParse,pWC->pMaskSet,pProbe,iCur,pOrderBy,nEq,&rev) ){
- if( flags==0 ){
- flags = WHERE_COLUMN_RANGE;
- }
- flags |= WHERE_ORDERBY;
- if( rev ){
- flags |= WHERE_REVERSE;
- }
+ if( (wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0
+ && isSortingIndex(pParse,pWC->pMaskSet,pProbe,iCur,pOrderBy,nEq,&rev)
+ ){
+ wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_ORDERBY;
+ wsFlags |= (rev ? WHERE_REVERSE : 0);
}else{
- cost += cost*estLog(cost);
- WHERETRACE(("...... orderby increases cost to %.9g\n", cost));
+ bSort = 1;
}
}
- /* Check to see if we can get away with using just the index without
- ** ever reading the table. If that is the case, then halve the
- ** cost of this index.
- */
- if( flags && pSrc->colUsed < (((Bitmask)1)<<(BMS-1)) ){
+ /* If currently calculating the cost of using an index (not the IPK
+ ** index), determine if all required column data may be obtained without
+ ** seeking to entries in the main table (i.e. if the index is a covering
+ ** index for this query). If it is, set the WHERE_IDX_ONLY flag in
+ ** wsFlags. Otherwise, set the bLookup variable to true. */
+ if( pIdx && wsFlags ){
Bitmask m = pSrc->colUsed;
int j;
- for(j=0; j<pProbe->nColumn; j++){
- int x = pProbe->aiColumn[j];
+ for(j=0; j<pIdx->nColumn; j++){
+ int x = pIdx->aiColumn[j];
if( x<BMS-1 ){
m &= ~(((Bitmask)1)<<x);
}
}
if( m==0 ){
- flags |= WHERE_IDX_ONLY;
- cost /= 2;
- WHERETRACE(("...... idx-only reduces cost to %.9g\n", cost));
+ wsFlags |= WHERE_IDX_ONLY;
+ }else{
+ bLookup = 1;
}
}
- /* If this index has achieved the lowest cost so far, then use it.
+ /**** Begin adding up the cost of using this index (Needs improvements)
+ **
+ ** Estimate the number of rows of output. For an IN operator,
+ ** do not let the estimate exceed half the rows in the table.
*/
- if( flags && cost < lowestCost ){
- bestIdx = pProbe;
- lowestCost = cost;
- bestFlags = flags;
- bestNEq = nEq;
+ nRow = (double)(aiRowEst[nEq] * nInMul);
+ if( bInEst && nRow*2>aiRowEst[0] ){
+ nRow = aiRowEst[0]/2;
+ nInMul = (int)(nRow / aiRowEst[nEq]);
}
- }
- /* Report the best result
- */
- *ppIndex = bestIdx;
- WHERETRACE(("best index is %s, cost=%.9g, flags=%x, nEq=%d\n",
- bestIdx ? bestIdx->zName : "(none)", lowestCost, bestFlags, bestNEq));
- *pFlags = bestFlags | eqTermMask;
- *pnEq = bestNEq;
- return lowestCost;
+ /* Assume constant cost to access a row and logarithmic cost to
+ ** do a binary search. Hence, the initial cost is the number of output
+ ** rows plus log2(table-size) times the number of binary searches.
+ */
+ cost = nRow + nInMul*estLog(aiRowEst[0]);
+
+ /* Adjust the number of rows and the cost downward to reflect rows
+ ** that are excluded by range constraints.
+ */
+ nRow = (nRow * (double)nBound) / (double)100;
+ cost = (cost * (double)nBound) / (double)100;
+
+ /* Add in the estimated cost of sorting the result
+ */
+ if( bSort ){
+ cost += cost*estLog(cost);
+ }
+
+ /* If all information can be taken directly from the index, we avoid
+ ** doing table lookups. This reduces the cost by half. (Not really -
+ ** this needs to be fixed.)
+ */
+ if( pIdx && bLookup==0 ){
+ cost /= (double)2;
+ }
+ /**** Cost of using this index has now been computed ****/
+
+ WHERETRACE((
+ "tbl=%s idx=%s nEq=%d nInMul=%d nBound=%d bSort=%d bLookup=%d"
+ " wsFlags=%d (nRow=%.2f cost=%.2f)\n",
+ pSrc->pTab->zName, (pIdx ? pIdx->zName : "ipk"),
+ nEq, nInMul, nBound, bSort, bLookup, wsFlags, nRow, cost
+ ));
+
+ /* If this index is the best we have seen so far, then record this
+ ** index and its cost in the pCost structure.
+ */
+ if( (!pIdx || wsFlags) && cost<pCost->rCost ){
+ pCost->rCost = cost;
+ pCost->nRow = nRow;
+ pCost->used = used;
+ pCost->plan.wsFlags = (wsFlags&wsFlagMask);
+ pCost->plan.nEq = nEq;
+ pCost->plan.u.pIdx = pIdx;
+ }
+
+ /* If there was an INDEXED BY clause, then only that one index is
+ ** considered. */
+ if( pSrc->pIndex ) break;
+
+ /* Reset masks for the next index in the loop */
+ wsFlagMask = ~(WHERE_ROWID_EQ|WHERE_ROWID_RANGE);
+ eqTermMask = idxEqTermMask;
+ }
+
+ /* If there is no ORDER BY clause and the SQLITE_ReverseOrder flag
+ ** is set, then reverse the order that the index will be scanned
+ ** in. This is used for application testing, to help find cases
+ ** where application behaviour depends on the (undefined) order that
+ ** SQLite outputs rows in in the absence of an ORDER BY clause. */
+ if( !pOrderBy && pParse->db->flags & SQLITE_ReverseOrder ){
+ pCost->plan.wsFlags |= WHERE_REVERSE;
+ }
+
+ assert( pOrderBy || (pCost->plan.wsFlags&WHERE_ORDERBY)==0 );
+ assert( pCost->plan.u.pIdx==0 || (pCost->plan.wsFlags&WHERE_ROWID_EQ)==0 );
+ assert( pSrc->pIndex==0
+ || pCost->plan.u.pIdx==0
+ || pCost->plan.u.pIdx==pSrc->pIndex
+ );
+
+ WHERETRACE(("best index is: %s\n",
+ (pCost->plan.u.pIdx ? pCost->plan.u.pIdx->zName : "ipk")
+ ));
+
+ bestOrClauseIndex(pParse, pWC, pSrc, notReady, pOrderBy, pCost);
+ pCost->plan.wsFlags |= eqTermMask;
}
+/*
+** Find the query plan for accessing table pSrc->pTab. Write the
+** best query plan and its cost into the WhereCost object supplied
+** as the last parameter. This function may calculate the cost of
+** both real and virtual table scans.
+*/
+static void bestIndex(
+ Parse *pParse, /* The parsing context */
+ WhereClause *pWC, /* The WHERE clause */
+ struct SrcList_item *pSrc, /* The FROM clause term to search */
+ Bitmask notReady, /* Mask of cursors that are not available */
+ ExprList *pOrderBy, /* The ORDER BY clause */
+ WhereCost *pCost /* Lowest cost query plan */
+){
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( IsVirtual(pSrc->pTab) ){
+ sqlite3_index_info *p = 0;
+ bestVirtualIndex(pParse, pWC, pSrc, notReady, pOrderBy, pCost, &p);
+ if( p->needToFreeIdxStr ){
+ sqlite3_free(p->idxStr);
+ }
+ sqlite3DbFree(pParse->db, p);
+ }else
+#endif
+ {
+ bestBtreeIndex(pParse, pWC, pSrc, notReady, pOrderBy, pCost);
+ }
+}
/*
** Disable a term in the WHERE clause. Except, do not disable the term
@@ -71766,10 +88491,10 @@ static double bestIndex(
*/
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
if( pTerm
- && (pTerm->flags & TERM_CODED)==0
+ && ALWAYS((pTerm->wtFlags & TERM_CODED)==0)
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
){
- pTerm->flags |= TERM_CODED;
+ pTerm->wtFlags |= TERM_CODED;
if( pTerm->iParent>=0 ){
WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
if( (--pOther->nChild)==0 ){
@@ -71780,17 +88505,19 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
}
/*
-** Apply the affinities associated with the first n columns of index
-** pIdx to the values in the n registers starting at base.
+** Code an OP_Affinity opcode to apply the column affinity string zAff
+** to the n registers starting at base.
+**
+** Buffer zAff was allocated using sqlite3DbMalloc(). It is the
+** responsibility of this function to arrange for it to be eventually
+** freed using sqlite3DbFree().
*/
-static void codeApplyAffinity(Parse *pParse, int base, int n, Index *pIdx){
- if( n>0 ){
- Vdbe *v = pParse->pVdbe;
- assert( v!=0 );
- sqlite3VdbeAddOp2(v, OP_Affinity, base, n);
- sqlite3IndexAffinityStr(v, pIdx);
- sqlite3ExprCacheAffinityChange(pParse, base, n);
- }
+static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){
+ Vdbe *v = pParse->pVdbe;
+ assert( v!=0 );
+ sqlite3VdbeAddOp2(v, OP_Affinity, base, n);
+ sqlite3VdbeChangeP4(v, -1, zAff, P4_DYNAMIC);
+ sqlite3ExprCacheAffinityChange(pParse, base, n);
}
@@ -71815,9 +88542,7 @@ static int codeEqualityTerm(
Vdbe *v = pParse->pVdbe;
int iReg; /* Register holding results */
- if( iTarget<=0 ){
- iReg = iTarget = sqlite3GetTempReg(pParse);
- }
+ assert( iTarget>0 );
if( pX->op==TK_EQ ){
iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget);
}else if( pX->op==TK_ISNULL ){
@@ -71831,28 +88556,29 @@ static int codeEqualityTerm(
assert( pX->op==TK_IN );
iReg = iTarget;
- eType = sqlite3FindInIndex(pParse, pX, 1);
+ eType = sqlite3FindInIndex(pParse, pX, 0);
iTab = pX->iTable;
sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
- VdbeComment((v, "%.*s", pX->span.n, pX->span.z));
- if( pLevel->nIn==0 ){
- pLevel->nxt = sqlite3VdbeMakeLabel(v);
- }
- pLevel->nIn++;
- pLevel->aInLoop = sqlite3DbReallocOrFree(pParse->db, pLevel->aInLoop,
- sizeof(pLevel->aInLoop[0])*pLevel->nIn);
- pIn = pLevel->aInLoop;
+ assert( pLevel->plan.wsFlags & WHERE_IN_ABLE );
+ if( pLevel->u.in.nIn==0 ){
+ pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
+ }
+ pLevel->u.in.nIn++;
+ pLevel->u.in.aInLoop =
+ sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop,
+ sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn);
+ pIn = pLevel->u.in.aInLoop;
if( pIn ){
- pIn += pLevel->nIn - 1;
+ pIn += pLevel->u.in.nIn - 1;
pIn->iCur = iTab;
if( eType==IN_INDEX_ROWID ){
- pIn->topAddr = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg);
+ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg);
}else{
- pIn->topAddr = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg);
+ pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg);
}
sqlite3VdbeAddOp1(v, OP_IsNull, iReg);
}else{
- pLevel->nIn = 0;
+ pLevel->u.in.nIn = 0;
}
#endif
}
@@ -71869,43 +88595,67 @@ static int codeEqualityTerm(
** The index has as many as three equality constraints, but in this
** example, the third "c" value is an inequality. So only two
** constraints are coded. This routine will generate code to evaluate
-** a==5 and b IN (1,2,3). The current values for a and b will be left
-** on the stack - a is the deepest and b the shallowest.
+** a==5 and b IN (1,2,3). The current values for a and b will be stored
+** in consecutive registers and the index of the first register is returned.
**
** In the example above nEq==2. But this subroutine works for any value
** of nEq including 0. If nEq==0, this routine is nearly a no-op.
** The only thing it does is allocate the pLevel->iMem memory cell.
**
-** This routine always allocates at least one memory cell and puts
-** the address of that memory cell in pLevel->iMem. The code that
-** calls this routine will use pLevel->iMem to store the termination
+** This routine always allocates at least one memory cell and returns
+** the index of that memory cell. The code that
+** calls this routine will use that memory cell to store the termination
** key value of the loop. If one or more IN operators appear, then
** this routine allocates an additional nEq memory cells for internal
** use.
+**
+** Before returning, *pzAff is set to point to a buffer containing a
+** copy of the column affinity string of the index allocated using
+** sqlite3DbMalloc(). Except, entries in the copy of the string associated
+** with equality constraints that use NONE affinity are set to
+** SQLITE_AFF_NONE. This is to deal with SQL such as the following:
+**
+** CREATE TABLE t1(a TEXT PRIMARY KEY, b);
+** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b;
+**
+** In the example above, the index on t1(a) has TEXT affinity. But since
+** the right hand side of the equality constraint (t2.b) has NONE affinity,
+** no conversion should be attempted before using a t2.b value as part of
+** a key to search the index. Hence the first byte in the returned affinity
+** string in this example would be set to SQLITE_AFF_NONE.
*/
static int codeAllEqualityTerms(
Parse *pParse, /* Parsing context */
WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */
WhereClause *pWC, /* The WHERE clause */
Bitmask notReady, /* Which parts of FROM have not yet been coded */
- int nExtraReg /* Number of extra registers to allocate */
+ int nExtraReg, /* Number of extra registers to allocate */
+ char **pzAff /* OUT: Set to point to affinity string */
){
- int nEq = pLevel->nEq; /* The number of == or IN constraints to code */
- Vdbe *v = pParse->pVdbe; /* The virtual machine under construction */
- Index *pIdx = pLevel->pIdx; /* The index being used for this loop */
+ int nEq = pLevel->plan.nEq; /* The number of == or IN constraints to code */
+ Vdbe *v = pParse->pVdbe; /* The vm under construction */
+ Index *pIdx; /* The index being used for this loop */
int iCur = pLevel->iTabCur; /* The cursor of the table */
WhereTerm *pTerm; /* A single constraint term */
int j; /* Loop counter */
int regBase; /* Base register */
+ int nReg; /* Number of registers to allocate */
+ char *zAff; /* Affinity string to return */
+
+ /* This module is only called on query plans that use an index. */
+ assert( pLevel->plan.wsFlags & WHERE_INDEXED );
+ pIdx = pLevel->plan.u.pIdx;
/* Figure out how many memory cells we will need then allocate them.
- ** We always need at least one used to store the loop terminator
- ** value. If there are IN operators we'll need one for each == or
- ** IN constraint.
*/
- pLevel->iMem = pParse->nMem + 1;
- regBase = pParse->nMem + 2;
- pParse->nMem += pLevel->nEq + 2 + nExtraReg;
+ regBase = pParse->nMem + 1;
+ nReg = pLevel->plan.nEq + nExtraReg;
+ pParse->nMem += nReg;
+
+ zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(v, pIdx));
+ if( !zAff ){
+ pParse->db->mallocFailed = 1;
+ }
/* Evaluate the equality constraints
*/
@@ -71913,22 +88663,620 @@ static int codeAllEqualityTerms(
for(j=0; j<nEq; j++){
int r1;
int k = pIdx->aiColumn[j];
- pTerm = findTerm(pWC, iCur, k, notReady, pLevel->flags, pIdx);
- if( pTerm==0 ) break;
- assert( (pTerm->flags & TERM_CODED)==0 );
+ pTerm = findTerm(pWC, iCur, k, notReady, pLevel->plan.wsFlags, pIdx);
+ if( NEVER(pTerm==0) ) break;
+ assert( (pTerm->wtFlags & TERM_CODED)==0 );
r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j);
if( r1!=regBase+j ){
- sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j);
+ if( nReg==1 ){
+ sqlite3ReleaseTempReg(pParse, regBase);
+ regBase = r1;
+ }else{
+ sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j);
+ }
}
testcase( pTerm->eOperator & WO_ISNULL );
testcase( pTerm->eOperator & WO_IN );
if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){
- sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->brk);
+ sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk);
+ if( zAff
+ && sqlite3CompareAffinity(pTerm->pExpr->pRight, zAff[j])==SQLITE_AFF_NONE
+ ){
+ zAff[j] = SQLITE_AFF_NONE;
+ }
}
}
+ *pzAff = zAff;
return regBase;
}
+/*
+** Generate code for the start of the iLevel-th loop in the WHERE clause
+** implementation described by pWInfo.
+*/
+static Bitmask codeOneLoopStart(
+ WhereInfo *pWInfo, /* Complete information about the WHERE clause */
+ int iLevel, /* Which level of pWInfo->a[] should be coded */
+ u16 wctrlFlags, /* One of the WHERE_* flags defined in sqliteInt.h */
+ Bitmask notReady /* Which tables are currently available */
+){
+ int j, k; /* Loop counters */
+ int iCur; /* The VDBE cursor for the table */
+ int addrNxt; /* Where to jump to continue with the next IN case */
+ int omitTable; /* True if we use the index only */
+ int bRev; /* True if we need to scan in reverse order */
+ WhereLevel *pLevel; /* The where level to be coded */
+ WhereClause *pWC; /* Decomposition of the entire WHERE clause */
+ WhereTerm *pTerm; /* A WHERE clause term */
+ Parse *pParse; /* Parsing context */
+ Vdbe *v; /* The prepared stmt under constructions */
+ struct SrcList_item *pTabItem; /* FROM clause term being coded */
+ int addrBrk; /* Jump here to break out of the loop */
+ int addrCont; /* Jump here to continue with next cycle */
+ int iRowidReg = 0; /* Rowid is stored in this register, if not zero */
+ int iReleaseReg = 0; /* Temp register to free before returning */
+
+ pParse = pWInfo->pParse;
+ v = pParse->pVdbe;
+ pWC = pWInfo->pWC;
+ pLevel = &pWInfo->a[iLevel];
+ pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
+ iCur = pTabItem->iCursor;
+ bRev = (pLevel->plan.wsFlags & WHERE_REVERSE)!=0;
+ omitTable = (pLevel->plan.wsFlags & WHERE_IDX_ONLY)!=0
+ && (wctrlFlags & WHERE_FORCE_TABLE)==0;
+
+ /* Create labels for the "break" and "continue" instructions
+ ** for the current loop. Jump to addrBrk to break out of a loop.
+ ** Jump to cont to go immediately to the next iteration of the
+ ** loop.
+ **
+ ** When there is an IN operator, we also have a "addrNxt" label that
+ ** means to continue with the next IN value combination. When
+ ** there are no IN operators in the constraints, the "addrNxt" label
+ ** is the same as "addrBrk".
+ */
+ addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
+ addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v);
+
+ /* If this is the right table of a LEFT OUTER JOIN, allocate and
+ ** initialize a memory cell that records if this table matches any
+ ** row of the left table of the join.
+ */
+ if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){
+ pLevel->iLeftJoin = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin);
+ VdbeComment((v, "init LEFT JOIN no-match flag"));
+ }
+
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( (pLevel->plan.wsFlags & WHERE_VIRTUALTABLE)!=0 ){
+ /* Case 0: The table is a virtual-table. Use the VFilter and VNext
+ ** to access the data.
+ */
+ int iReg; /* P3 Value for OP_VFilter */
+ sqlite3_index_info *pVtabIdx = pLevel->plan.u.pVtabIdx;
+ int nConstraint = pVtabIdx->nConstraint;
+ struct sqlite3_index_constraint_usage *aUsage =
+ pVtabIdx->aConstraintUsage;
+ const struct sqlite3_index_constraint *aConstraint =
+ pVtabIdx->aConstraint;
+
+ iReg = sqlite3GetTempRange(pParse, nConstraint+2);
+ for(j=1; j<=nConstraint; j++){
+ for(k=0; k<nConstraint; k++){
+ if( aUsage[k].argvIndex==j ){
+ int iTerm = aConstraint[k].iTermOffset;
+ sqlite3ExprCode(pParse, pWC->a[iTerm].pExpr->pRight, iReg+j+1);
+ break;
+ }
+ }
+ if( k==nConstraint ) break;
+ }
+ sqlite3VdbeAddOp2(v, OP_Integer, pVtabIdx->idxNum, iReg);
+ sqlite3VdbeAddOp2(v, OP_Integer, j-1, iReg+1);
+ sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrBrk, iReg, pVtabIdx->idxStr,
+ pVtabIdx->needToFreeIdxStr ? P4_MPRINTF : P4_STATIC);
+ pVtabIdx->needToFreeIdxStr = 0;
+ for(j=0; j<nConstraint; j++){
+ if( aUsage[j].omit ){
+ int iTerm = aConstraint[j].iTermOffset;
+ disableTerm(pLevel, &pWC->a[iTerm]);
+ }
+ }
+ pLevel->op = OP_VNext;
+ pLevel->p1 = iCur;
+ pLevel->p2 = sqlite3VdbeCurrentAddr(v);
+ sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
+ }else
+#endif /* SQLITE_OMIT_VIRTUALTABLE */
+
+ if( pLevel->plan.wsFlags & WHERE_ROWID_EQ ){
+ /* Case 1: We can directly reference a single row using an
+ ** equality comparison against the ROWID field. Or
+ ** we reference multiple rows using a "rowid IN (...)"
+ ** construct.
+ */
+ iReleaseReg = sqlite3GetTempReg(pParse);
+ pTerm = findTerm(pWC, iCur, -1, notReady, WO_EQ|WO_IN, 0);
+ assert( pTerm!=0 );
+ assert( pTerm->pExpr!=0 );
+ assert( pTerm->leftCursor==iCur );
+ assert( omitTable==0 );
+ iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, iReleaseReg);
+ addrNxt = pLevel->addrNxt;
+ sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg);
+ sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
+ VdbeComment((v, "pk"));
+ pLevel->op = OP_Noop;
+ }else if( pLevel->plan.wsFlags & WHERE_ROWID_RANGE ){
+ /* Case 2: We have an inequality comparison against the ROWID field.
+ */
+ int testOp = OP_Noop;
+ int start;
+ int memEndValue = 0;
+ WhereTerm *pStart, *pEnd;
+
+ assert( omitTable==0 );
+ pStart = findTerm(pWC, iCur, -1, notReady, WO_GT|WO_GE, 0);
+ pEnd = findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE, 0);
+ if( bRev ){
+ pTerm = pStart;
+ pStart = pEnd;
+ pEnd = pTerm;
+ }
+ if( pStart ){
+ Expr *pX; /* The expression that defines the start bound */
+ int r1, rTemp; /* Registers for holding the start boundary */
+
+ /* The following constant maps TK_xx codes into corresponding
+ ** seek opcodes. It depends on a particular ordering of TK_xx
+ */
+ const u8 aMoveOp[] = {
+ /* TK_GT */ OP_SeekGt,
+ /* TK_LE */ OP_SeekLe,
+ /* TK_LT */ OP_SeekLt,
+ /* TK_GE */ OP_SeekGe
+ };
+ assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */
+ assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */
+ assert( TK_GE==TK_GT+3 ); /* ... is correcct. */
+
+ pX = pStart->pExpr;
+ assert( pX!=0 );
+ assert( pStart->leftCursor==iCur );
+ r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
+ sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1);
+ VdbeComment((v, "pk"));
+ sqlite3ExprCacheAffinityChange(pParse, r1, 1);
+ sqlite3ReleaseTempReg(pParse, rTemp);
+ disableTerm(pLevel, pStart);
+ }else{
+ sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk);
+ }
+ if( pEnd ){
+ Expr *pX;
+ pX = pEnd->pExpr;
+ assert( pX!=0 );
+ assert( pEnd->leftCursor==iCur );
+ memEndValue = ++pParse->nMem;
+ sqlite3ExprCode(pParse, pX->pRight, memEndValue);
+ if( pX->op==TK_LT || pX->op==TK_GT ){
+ testOp = bRev ? OP_Le : OP_Ge;
+ }else{
+ testOp = bRev ? OP_Lt : OP_Gt;
+ }
+ disableTerm(pLevel, pEnd);
+ }
+ start = sqlite3VdbeCurrentAddr(v);
+ pLevel->op = bRev ? OP_Prev : OP_Next;
+ pLevel->p1 = iCur;
+ pLevel->p2 = start;
+ pLevel->p5 = (pStart==0 && pEnd==0) ?1:0;
+ if( testOp!=OP_Noop ){
+ iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg);
+ sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
+ sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg);
+ sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL);
+ }
+ }else if( pLevel->plan.wsFlags & (WHERE_COLUMN_RANGE|WHERE_COLUMN_EQ) ){
+ /* Case 3: A scan using an index.
+ **
+ ** The WHERE clause may contain zero or more equality
+ ** terms ("==" or "IN" operators) that refer to the N
+ ** left-most columns of the index. It may also contain
+ ** inequality constraints (>, <, >= or <=) on the indexed
+ ** column that immediately follows the N equalities. Only
+ ** the right-most column can be an inequality - the rest must
+ ** use the "==" and "IN" operators. For example, if the
+ ** index is on (x,y,z), then the following clauses are all
+ ** optimized:
+ **
+ ** x=5
+ ** x=5 AND y=10
+ ** x=5 AND y<10
+ ** x=5 AND y>5 AND y<10
+ ** x=5 AND y=5 AND z<=10
+ **
+ ** The z<10 term of the following cannot be used, only
+ ** the x=5 term:
+ **
+ ** x=5 AND z<10
+ **
+ ** N may be zero if there are inequality constraints.
+ ** If there are no inequality constraints, then N is at
+ ** least one.
+ **
+ ** This case is also used when there are no WHERE clause
+ ** constraints but an index is selected anyway, in order
+ ** to force the output order to conform to an ORDER BY.
+ */
+ int aStartOp[] = {
+ 0,
+ 0,
+ OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */
+ OP_Last, /* 3: (!start_constraints && startEq && bRev) */
+ OP_SeekGt, /* 4: (start_constraints && !startEq && !bRev) */
+ OP_SeekLt, /* 5: (start_constraints && !startEq && bRev) */
+ OP_SeekGe, /* 6: (start_constraints && startEq && !bRev) */
+ OP_SeekLe /* 7: (start_constraints && startEq && bRev) */
+ };
+ int aEndOp[] = {
+ OP_Noop, /* 0: (!end_constraints) */
+ OP_IdxGE, /* 1: (end_constraints && !bRev) */
+ OP_IdxLT /* 2: (end_constraints && bRev) */
+ };
+ int nEq = pLevel->plan.nEq;
+ int isMinQuery = 0; /* If this is an optimized SELECT min(x).. */
+ int regBase; /* Base register holding constraint values */
+ int r1; /* Temp register */
+ WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */
+ WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */
+ int startEq; /* True if range start uses ==, >= or <= */
+ int endEq; /* True if range end uses ==, >= or <= */
+ int start_constraints; /* Start of range is constrained */
+ int nConstraint; /* Number of constraint terms */
+ Index *pIdx; /* The index we will be using */
+ int iIdxCur; /* The VDBE cursor for the index */
+ int nExtraReg = 0; /* Number of extra registers needed */
+ int op; /* Instruction opcode */
+ char *zAff;
+
+ pIdx = pLevel->plan.u.pIdx;
+ iIdxCur = pLevel->iIdxCur;
+ k = pIdx->aiColumn[nEq]; /* Column for inequality constraints */
+
+ /* If this loop satisfies a sort order (pOrderBy) request that
+ ** was passed to this function to implement a "SELECT min(x) ..."
+ ** query, then the caller will only allow the loop to run for
+ ** a single iteration. This means that the first row returned
+ ** should not have a NULL value stored in 'x'. If column 'x' is
+ ** the first one after the nEq equality constraints in the index,
+ ** this requires some special handling.
+ */
+ if( (wctrlFlags&WHERE_ORDERBY_MIN)!=0
+ && (pLevel->plan.wsFlags&WHERE_ORDERBY)
+ && (pIdx->nColumn>nEq)
+ ){
+ /* assert( pOrderBy->nExpr==1 ); */
+ /* assert( pOrderBy->a[0].pExpr->iColumn==pIdx->aiColumn[nEq] ); */
+ isMinQuery = 1;
+ nExtraReg = 1;
+ }
+
+ /* Find any inequality constraint terms for the start and end
+ ** of the range.
+ */
+ if( pLevel->plan.wsFlags & WHERE_TOP_LIMIT ){
+ pRangeEnd = findTerm(pWC, iCur, k, notReady, (WO_LT|WO_LE), pIdx);
+ nExtraReg = 1;
+ }
+ if( pLevel->plan.wsFlags & WHERE_BTM_LIMIT ){
+ pRangeStart = findTerm(pWC, iCur, k, notReady, (WO_GT|WO_GE), pIdx);
+ nExtraReg = 1;
+ }
+
+ /* Generate code to evaluate all constraint terms using == or IN
+ ** and store the values of those terms in an array of registers
+ ** starting at regBase.
+ */
+ regBase = codeAllEqualityTerms(
+ pParse, pLevel, pWC, notReady, nExtraReg, &zAff
+ );
+ addrNxt = pLevel->addrNxt;
+
+ /* If we are doing a reverse order scan on an ascending index, or
+ ** a forward order scan on a descending index, interchange the
+ ** start and end terms (pRangeStart and pRangeEnd).
+ */
+ if( bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC) ){
+ SWAP(WhereTerm *, pRangeEnd, pRangeStart);
+ }
+
+ testcase( pRangeStart && pRangeStart->eOperator & WO_LE );
+ testcase( pRangeStart && pRangeStart->eOperator & WO_GE );
+ testcase( pRangeEnd && pRangeEnd->eOperator & WO_LE );
+ testcase( pRangeEnd && pRangeEnd->eOperator & WO_GE );
+ startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE);
+ endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE);
+ start_constraints = pRangeStart || nEq>0;
+
+ /* Seek the index cursor to the start of the range. */
+ nConstraint = nEq;
+ if( pRangeStart ){
+ Expr *pRight = pRangeStart->pExpr->pRight;
+ sqlite3ExprCode(pParse, pRight, regBase+nEq);
+ sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
+ if( zAff
+ && sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE
+ ){
+ /* Since the comparison is to be performed with no conversions applied
+ ** to the operands, set the affinity to apply to pRight to
+ ** SQLITE_AFF_NONE. */
+ zAff[nConstraint] = SQLITE_AFF_NONE;
+ }
+ nConstraint++;
+ }else if( isMinQuery ){
+ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
+ nConstraint++;
+ startEq = 0;
+ start_constraints = 1;
+ }
+ codeApplyAffinity(pParse, regBase, nConstraint, zAff);
+ op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
+ assert( op!=0 );
+ testcase( op==OP_Rewind );
+ testcase( op==OP_Last );
+ testcase( op==OP_SeekGt );
+ testcase( op==OP_SeekGe );
+ testcase( op==OP_SeekLe );
+ testcase( op==OP_SeekLt );
+ sqlite3VdbeAddOp4(v, op, iIdxCur, addrNxt, regBase,
+ SQLITE_INT_TO_PTR(nConstraint), P4_INT32);
+
+ /* Load the value for the inequality constraint at the end of the
+ ** range (if any).
+ */
+ nConstraint = nEq;
+ if( pRangeEnd ){
+ Expr *pRight = pRangeEnd->pExpr->pRight;
+ sqlite3ExprCacheRemove(pParse, regBase+nEq);
+ sqlite3ExprCode(pParse, pRight, regBase+nEq);
+ sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt);
+ zAff = sqlite3DbStrDup(pParse->db, zAff);
+ if( zAff
+ && sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE
+ ){
+ /* Since the comparison is to be performed with no conversions applied
+ ** to the operands, set the affinity to apply to pRight to
+ ** SQLITE_AFF_NONE. */
+ zAff[nConstraint] = SQLITE_AFF_NONE;
+ }
+ codeApplyAffinity(pParse, regBase, nEq+1, zAff);
+ nConstraint++;
+ }
+
+ /* Top of the loop body */
+ pLevel->p2 = sqlite3VdbeCurrentAddr(v);
+
+ /* Check if the index cursor is past the end of the range. */
+ op = aEndOp[(pRangeEnd || nEq) * (1 + bRev)];
+ testcase( op==OP_Noop );
+ testcase( op==OP_IdxGE );
+ testcase( op==OP_IdxLT );
+ if( op!=OP_Noop ){
+ sqlite3VdbeAddOp4(v, op, iIdxCur, addrNxt, regBase,
+ SQLITE_INT_TO_PTR(nConstraint), P4_INT32);
+ sqlite3VdbeChangeP5(v, endEq!=bRev ?1:0);
+ }
+
+ /* If there are inequality constraints, check that the value
+ ** of the table column that the inequality contrains is not NULL.
+ ** If it is, jump to the next iteration of the loop.
+ */
+ r1 = sqlite3GetTempReg(pParse);
+ testcase( pLevel->plan.wsFlags & WHERE_BTM_LIMIT );
+ testcase( pLevel->plan.wsFlags & WHERE_TOP_LIMIT );
+ if( pLevel->plan.wsFlags & (WHERE_BTM_LIMIT|WHERE_TOP_LIMIT) ){
+ sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, nEq, r1);
+ sqlite3VdbeAddOp2(v, OP_IsNull, r1, addrCont);
+ }
+ sqlite3ReleaseTempReg(pParse, r1);
+
+ /* Seek the table cursor, if required */
+ disableTerm(pLevel, pRangeStart);
+ disableTerm(pLevel, pRangeEnd);
+ if( !omitTable ){
+ iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse);
+ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg);
+ sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
+ sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */
+ }
+
+ /* Record the instruction used to terminate the loop. Disable
+ ** WHERE clause terms made redundant by the index range scan.
+ */
+ pLevel->op = bRev ? OP_Prev : OP_Next;
+ pLevel->p1 = iIdxCur;
+ }else
+
+#ifndef SQLITE_OMIT_OR_OPTIMIZATION
+ if( pLevel->plan.wsFlags & WHERE_MULTI_OR ){
+ /* Case 4: Two or more separately indexed terms connected by OR
+ **
+ ** Example:
+ **
+ ** CREATE TABLE t1(a,b,c,d);
+ ** CREATE INDEX i1 ON t1(a);
+ ** CREATE INDEX i2 ON t1(b);
+ ** CREATE INDEX i3 ON t1(c);
+ **
+ ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13)
+ **
+ ** In the example, there are three indexed terms connected by OR.
+ ** The top of the loop looks like this:
+ **
+ ** Null 1 # Zero the rowset in reg 1
+ **
+ ** Then, for each indexed term, the following. The arguments to
+ ** RowSetTest are such that the rowid of the current row is inserted
+ ** into the RowSet. If it is already present, control skips the
+ ** Gosub opcode and jumps straight to the code generated by WhereEnd().
+ **
+ ** sqlite3WhereBegin(<term>)
+ ** RowSetTest # Insert rowid into rowset
+ ** Gosub 2 A
+ ** sqlite3WhereEnd()
+ **
+ ** Following the above, code to terminate the loop. Label A, the target
+ ** of the Gosub above, jumps to the instruction right after the Goto.
+ **
+ ** Null 1 # Zero the rowset in reg 1
+ ** Goto B # The loop is finished.
+ **
+ ** A: <loop body> # Return data, whatever.
+ **
+ ** Return 2 # Jump back to the Gosub
+ **
+ ** B: <after the loop>
+ **
+ */
+ WhereClause *pOrWc; /* The OR-clause broken out into subterms */
+ WhereTerm *pFinal; /* Final subterm within the OR-clause. */
+ SrcList oneTab; /* Shortened table list */
+
+ int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */
+ int regRowset = 0; /* Register for RowSet object */
+ int regRowid = 0; /* Register holding rowid */
+ int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */
+ int iRetInit; /* Address of regReturn init */
+ int ii;
+
+ pTerm = pLevel->plan.u.pTerm;
+ assert( pTerm!=0 );
+ assert( pTerm->eOperator==WO_OR );
+ assert( (pTerm->wtFlags & TERM_ORINFO)!=0 );
+ pOrWc = &pTerm->u.pOrInfo->wc;
+ pFinal = &pOrWc->a[pOrWc->nTerm-1];
+
+ /* Set up a SrcList containing just the table being scanned by this loop. */
+ oneTab.nSrc = 1;
+ oneTab.nAlloc = 1;
+ oneTab.a[0] = *pTabItem;
+
+ /* Initialize the rowset register to contain NULL. An SQL NULL is
+ ** equivalent to an empty rowset.
+ **
+ ** Also initialize regReturn to contain the address of the instruction
+ ** immediately following the OP_Return at the bottom of the loop. This
+ ** is required in a few obscure LEFT JOIN cases where control jumps
+ ** over the top of the loop into the body of it. In this case the
+ ** correct response for the end-of-loop code (the OP_Return) is to
+ ** fall through to the next instruction, just as an OP_Next does if
+ ** called on an uninitialized cursor.
+ */
+ if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
+ regRowset = ++pParse->nMem;
+ regRowid = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset);
+ }
+ iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn);
+
+ for(ii=0; ii<pOrWc->nTerm; ii++){
+ WhereTerm *pOrTerm = &pOrWc->a[ii];
+ if( pOrTerm->leftCursor==iCur || pOrTerm->eOperator==WO_AND ){
+ WhereInfo *pSubWInfo; /* Info for single OR-term scan */
+ /* Loop through table entries that match term pOrTerm. */
+ pSubWInfo = sqlite3WhereBegin(pParse, &oneTab, pOrTerm->pExpr, 0,
+ WHERE_OMIT_OPEN | WHERE_OMIT_CLOSE | WHERE_FORCE_TABLE);
+ if( pSubWInfo ){
+ if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
+ int iSet = ((ii==pOrWc->nTerm-1)?-1:ii);
+ int r;
+ r = sqlite3ExprCodeGetColumn(pParse, pTabItem->pTab, -1, iCur,
+ regRowid, 0);
+ sqlite3VdbeAddOp4(v, OP_RowSetTest, regRowset,
+ sqlite3VdbeCurrentAddr(v)+2,
+ r, SQLITE_INT_TO_PTR(iSet), P4_INT32);
+ }
+ sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody);
+
+ /* Finish the loop through table entries that match term pOrTerm. */
+ sqlite3WhereEnd(pSubWInfo);
+ }
+ }
+ }
+ sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v));
+ /* sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); */
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk);
+ sqlite3VdbeResolveLabel(v, iLoopBody);
+
+ pLevel->op = OP_Return;
+ pLevel->p1 = regReturn;
+ disableTerm(pLevel, pTerm);
+ }else
+#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
+
+ {
+ /* Case 5: There is no usable index. We must do a complete
+ ** scan of the entire table.
+ */
+ static const u8 aStep[] = { OP_Next, OP_Prev };
+ static const u8 aStart[] = { OP_Rewind, OP_Last };
+ assert( bRev==0 || bRev==1 );
+ assert( omitTable==0 );
+ pLevel->op = aStep[bRev];
+ pLevel->p1 = iCur;
+ pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk);
+ pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP;
+ }
+ notReady &= ~getMask(pWC->pMaskSet, iCur);
+
+ /* Insert code to test every subexpression that can be completely
+ ** computed using the current set of tables.
+ */
+ k = 0;
+ for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
+ Expr *pE;
+ testcase( pTerm->wtFlags & TERM_VIRTUAL );
+ testcase( pTerm->wtFlags & TERM_CODED );
+ if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
+ if( (pTerm->prereqAll & notReady)!=0 ) continue;
+ pE = pTerm->pExpr;
+ assert( pE!=0 );
+ if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
+ continue;
+ }
+ sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL);
+ k = 1;
+ pTerm->wtFlags |= TERM_CODED;
+ }
+
+ /* For a LEFT OUTER JOIN, generate code that will record the fact that
+ ** at least one row of the right table has matched the left table.
+ */
+ if( pLevel->iLeftJoin ){
+ pLevel->addrFirst = sqlite3VdbeCurrentAddr(v);
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin);
+ VdbeComment((v, "record LEFT JOIN hit"));
+ sqlite3ExprCacheClear(pParse);
+ for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
+ testcase( pTerm->wtFlags & TERM_VIRTUAL );
+ testcase( pTerm->wtFlags & TERM_CODED );
+ if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
+ if( (pTerm->prereqAll & notReady)!=0 ) continue;
+ assert( pTerm->pExpr );
+ sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
+ pTerm->wtFlags |= TERM_CODED;
+ }
+ }
+ sqlite3ReleaseTempReg(pParse, iReleaseReg);
+
+ return notReady;
+}
+
#if defined(SQLITE_TEST)
/*
** The following variable holds a text description of query plan generated
@@ -71945,17 +89293,21 @@ static int nQPlan = 0; /* Next free slow in _query_plan[] */
/*
** Free a WhereInfo structure
*/
-static void whereInfoFree(WhereInfo *pWInfo){
+static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
if( pWInfo ){
int i;
for(i=0; i<pWInfo->nLevel; i++){
sqlite3_index_info *pInfo = pWInfo->a[i].pIdxInfo;
if( pInfo ){
- assert( pInfo->needToFreeIdxStr==0 );
- sqlite3_free(pInfo);
+ /* assert( pInfo->needToFreeIdxStr==0 || db->mallocFailed ); */
+ if( pInfo->needToFreeIdxStr ){
+ sqlite3_free(pInfo->idxStr);
+ }
+ sqlite3DbFree(db, pInfo);
}
}
- sqlite3_free(pWInfo);
+ whereClauseClear(pWInfo->pWC);
+ sqlite3DbFree(db, pWInfo);
}
}
@@ -72053,22 +89405,20 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
SrcList *pTabList, /* A list of all tables to be scanned */
Expr *pWhere, /* The WHERE clause */
ExprList **ppOrderBy, /* An ORDER BY clause, or NULL */
- u8 wflags /* One of the WHERE_* flags defined in sqliteInt.h */
+ u16 wctrlFlags /* One of the WHERE_* flags defined in sqliteInt.h */
){
int i; /* Loop counter */
+ int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */
WhereInfo *pWInfo; /* Will become the return value of this function */
Vdbe *v = pParse->pVdbe; /* The virtual database engine */
- int brk, cont = 0; /* Addresses used during code generation */
Bitmask notReady; /* Cursors that are not yet positioned */
- WhereTerm *pTerm; /* A single term in the WHERE clause */
- ExprMaskSet maskSet; /* The expression mask set */
- WhereClause wc; /* The WHERE clause is divided into these terms */
+ WhereMaskSet *pMaskSet; /* The expression mask set */
+ WhereClause *pWC; /* Decomposition of the WHERE clause */
struct SrcList_item *pTabItem; /* A single entry from pTabList */
WhereLevel *pLevel; /* A single level in the pWInfo list */
int iFrom; /* First unused FROM clause element */
- int andFlags; /* AND-ed combination of all wc.a[].flags */
+ int andFlags; /* AND-ed combination of all pWC->a[].wtFlags */
sqlite3 *db; /* Database connection */
- ExprList *pOrderBy = 0;
/* The number of tables in the FROM clause is limited by the number of
** bits in a Bitmask
@@ -72078,32 +89428,39 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
return 0;
}
- if( ppOrderBy ){
- pOrderBy = *ppOrderBy;
- }
-
- /* Split the WHERE clause into separate subexpressions where each
- ** subexpression is separated by an AND operator.
- */
- initMaskSet(&maskSet);
- whereClauseInit(&wc, pParse, &maskSet);
- sqlite3ExprCodeConstants(pParse, pWhere);
- whereSplit(&wc, pWhere, TK_AND);
-
/* Allocate and initialize the WhereInfo structure that will become the
- ** return value.
+ ** return value. A single allocation is used to store the WhereInfo
+ ** struct, the contents of WhereInfo.a[], the WhereClause structure
+ ** and the WhereMaskSet structure. Since WhereClause contains an 8-byte
+ ** field (type Bitmask) it must be aligned on an 8-byte boundary on
+ ** some architectures. Hence the ROUND8() below.
*/
db = pParse->db;
- pWInfo = sqlite3DbMallocZero(db,
- sizeof(WhereInfo) + pTabList->nSrc*sizeof(WhereLevel));
+ nByteWInfo = ROUND8(sizeof(WhereInfo)+(pTabList->nSrc-1)*sizeof(WhereLevel));
+ pWInfo = sqlite3DbMallocZero(db,
+ nByteWInfo +
+ sizeof(WhereClause) +
+ sizeof(WhereMaskSet)
+ );
if( db->mallocFailed ){
- goto whereBeginNoMem;
+ goto whereBeginError;
}
pWInfo->nLevel = pTabList->nSrc;
pWInfo->pParse = pParse;
pWInfo->pTabList = pTabList;
pWInfo->iBreak = sqlite3VdbeMakeLabel(v);
+ pWInfo->pWC = pWC = (WhereClause *)&((u8 *)pWInfo)[nByteWInfo];
+ pWInfo->wctrlFlags = wctrlFlags;
+ pMaskSet = (WhereMaskSet*)&pWC[1];
+ /* Split the WHERE clause into separate subexpressions where each
+ ** subexpression is separated by an AND operator.
+ */
+ initMaskSet(pMaskSet);
+ whereClauseInit(pWC, pParse, pMaskSet);
+ sqlite3ExprCodeConstants(pParse, pWhere);
+ whereSplit(pWC, pWhere, TK_AND);
+
/* Special case: a WHERE clause that is constant. Evaluate the
** expression and either jump over all of the code or fall thru.
*/
@@ -72122,15 +89479,26 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** of the join. Subtracting one from the right table bitmask gives a
** bitmask for all tables to the left of the join. Knowing the bitmask
** for all tables to the left of a left join is important. Ticket #3015.
+ **
+ ** Configure the WhereClause.vmask variable so that bits that correspond
+ ** to virtual table cursors are set. This is used to selectively disable
+ ** the OR-to-IN transformation in exprAnalyzeOrTerm(). It is not helpful
+ ** with virtual tables.
*/
+ assert( pWC->vmask==0 && pMaskSet->n==0 );
for(i=0; i<pTabList->nSrc; i++){
- createMask(&maskSet, pTabList->a[i].iCursor);
+ createMask(pMaskSet, pTabList->a[i].iCursor);
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ if( ALWAYS(pTabList->a[i].pTab) && IsVirtual(pTabList->a[i].pTab) ){
+ pWC->vmask |= ((Bitmask)1 << i);
+ }
+#endif
}
#ifndef NDEBUG
{
Bitmask toTheLeft = 0;
for(i=0; i<pTabList->nSrc; i++){
- Bitmask m = getMask(&maskSet, pTabList->a[i].iCursor);
+ Bitmask m = getMask(pMaskSet, pTabList->a[i].iCursor);
assert( (m-1)==toTheLeft );
toTheLeft |= m;
}
@@ -72142,9 +89510,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** want to analyze these virtual terms, so start analyzing at the end
** and work forward so that the added virtual terms are never processed.
*/
- exprAnalyzeAll(pTabList, &wc);
+ exprAnalyzeAll(pTabList, pWC);
if( db->mallocFailed ){
- goto whereBeginNoMem;
+ goto whereBeginError;
}
/* Chose the best index to use for each table in the FROM clause.
@@ -72152,11 +89520,12 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** This loop fills in the following fields:
**
** pWInfo->a[].pIdx The index to use for this level of the loop.
- ** pWInfo->a[].flags WHERE_xxx flags associated with pIdx
+ ** pWInfo->a[].wsFlags WHERE_xxx flags associated with pIdx
** pWInfo->a[].nEq The number of == and IN constraints
- ** pWInfo->a[].iFrom When term of the FROM clause is being coded
+ ** pWInfo->a[].iFrom Which term of the FROM clause is being coded
** pWInfo->a[].iTabCur The VDBE cursor for the database table
** pWInfo->a[].iIdxCur The VDBE cursor for the index
+ ** pWInfo->a[].pTerm When wsFlags==WO_OR, the OR-clause term
**
** This loop also figures out the nesting order of tables in the FROM
** clause.
@@ -72167,92 +89536,125 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
andFlags = ~0;
WHERETRACE(("*** Optimizer Start ***\n"));
for(i=iFrom=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
+ WhereCost bestPlan; /* Most efficient plan seen so far */
Index *pIdx; /* Index for FROM table at pTabItem */
- int flags; /* Flags asssociated with pIdx */
- int nEq; /* Number of == or IN constraints */
- double cost; /* The cost for pIdx */
int j; /* For looping over FROM tables */
- Index *pBest = 0; /* The best index seen so far */
- int bestFlags = 0; /* Flags associated with pBest */
- int bestNEq = 0; /* nEq associated with pBest */
- double lowestCost; /* Cost of the pBest */
- int bestJ = 0; /* The value of j */
+ int bestJ = -1; /* The value of j */
Bitmask m; /* Bitmask value for j or bestJ */
- int once = 0; /* True when first table is seen */
- sqlite3_index_info *pIndex; /* Current virtual index */
-
- lowestCost = SQLITE_BIG_DBL;
- for(j=iFrom, pTabItem=&pTabList->a[j]; j<pTabList->nSrc; j++, pTabItem++){
- int doNotReorder; /* True if this table should not be reordered */
-
- doNotReorder = (pTabItem->jointype & (JT_LEFT|JT_CROSS))!=0;
- if( once && doNotReorder ) break;
- m = getMask(&maskSet, pTabItem->iCursor);
- if( (m & notReady)==0 ){
- if( j==iFrom ) iFrom++;
- continue;
- }
- assert( pTabItem->pTab );
+ int isOptimal; /* Iterator for optimal/non-optimal search */
+
+ memset(&bestPlan, 0, sizeof(bestPlan));
+ bestPlan.rCost = SQLITE_BIG_DBL;
+
+ /* Loop through the remaining entries in the FROM clause to find the
+ ** next nested loop. The FROM clause entries may be iterated through
+ ** either once or twice.
+ **
+ ** The first iteration, which is always performed, searches for the
+ ** FROM clause entry that permits the lowest-cost, "optimal" scan. In
+ ** this context an optimal scan is one that uses the same strategy
+ ** for the given FROM clause entry as would be selected if the entry
+ ** were used as the innermost nested loop. In other words, a table
+ ** is chosen such that the cost of running that table cannot be reduced
+ ** by waiting for other tables to run first.
+ **
+ ** The second iteration is only performed if no optimal scan strategies
+ ** were found by the first. This iteration is used to search for the
+ ** lowest cost scan overall.
+ **
+ ** Previous versions of SQLite performed only the second iteration -
+ ** the next outermost loop was always that with the lowest overall
+ ** cost. However, this meant that SQLite could select the wrong plan
+ ** for scripts such as the following:
+ **
+ ** CREATE TABLE t1(a, b);
+ ** CREATE TABLE t2(c, d);
+ ** SELECT * FROM t2, t1 WHERE t2.rowid = t1.a;
+ **
+ ** The best strategy is to iterate through table t1 first. However it
+ ** is not possible to determine this with a simple greedy algorithm.
+ ** However, since the cost of a linear scan through table t2 is the same
+ ** as the cost of a linear scan through table t1, a simple greedy
+ ** algorithm may choose to use t2 for the outer loop, which is a much
+ ** costlier approach.
+ */
+ for(isOptimal=1; isOptimal>=0 && bestJ<0; isOptimal--){
+ Bitmask mask = (isOptimal ? 0 : notReady);
+ assert( (pTabList->nSrc-iFrom)>1 || isOptimal );
+ for(j=iFrom, pTabItem=&pTabList->a[j]; j<pTabList->nSrc; j++, pTabItem++){
+ int doNotReorder; /* True if this table should not be reordered */
+ WhereCost sCost; /* Cost information from best[Virtual]Index() */
+ ExprList *pOrderBy; /* ORDER BY clause for index to optimize */
+
+ doNotReorder = (pTabItem->jointype & (JT_LEFT|JT_CROSS))!=0;
+ if( j!=iFrom && doNotReorder ) break;
+ m = getMask(pMaskSet, pTabItem->iCursor);
+ if( (m & notReady)==0 ){
+ if( j==iFrom ) iFrom++;
+ continue;
+ }
+ pOrderBy = ((i==0 && ppOrderBy )?*ppOrderBy:0);
+
+ assert( pTabItem->pTab );
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( IsVirtual(pTabItem->pTab) ){
- sqlite3_index_info **ppIdxInfo = &pWInfo->a[j].pIdxInfo;
- cost = bestVirtualIndex(pParse, &wc, pTabItem, notReady,
- ppOrderBy ? *ppOrderBy : 0, i==0,
- ppIdxInfo);
- flags = WHERE_VIRTUALTABLE;
- pIndex = *ppIdxInfo;
- if( pIndex && pIndex->orderByConsumed ){
- flags = WHERE_VIRTUALTABLE | WHERE_ORDERBY;
+ if( IsVirtual(pTabItem->pTab) ){
+ sqlite3_index_info **pp = &pWInfo->a[j].pIdxInfo;
+ bestVirtualIndex(pParse, pWC, pTabItem, mask, pOrderBy, &sCost, pp);
+ }else
+#endif
+ {
+ bestBtreeIndex(pParse, pWC, pTabItem, mask, pOrderBy, &sCost);
}
- pIdx = 0;
- nEq = 0;
- if( (SQLITE_BIG_DBL/2.0)<cost ){
- /* The cost is not allowed to be larger than SQLITE_BIG_DBL (the
- ** inital value of lowestCost in this loop. If it is, then
- ** the (cost<lowestCost) test below will never be true and
- ** pLevel->pBestIdx never set.
- */
- cost = (SQLITE_BIG_DBL/2.0);
+ assert( isOptimal || (sCost.used&notReady)==0 );
+
+ if( (sCost.used&notReady)==0
+ && (j==iFrom || sCost.rCost<bestPlan.rCost)
+ ){
+ bestPlan = sCost;
+ bestJ = j;
}
- }else
-#endif
- {
- cost = bestIndex(pParse, &wc, pTabItem, notReady,
- (i==0 && ppOrderBy) ? *ppOrderBy : 0,
- &pIdx, &flags, &nEq);
- pIndex = 0;
- }
- if( cost<lowestCost ){
- once = 1;
- lowestCost = cost;
- pBest = pIdx;
- bestFlags = flags;
- bestNEq = nEq;
- bestJ = j;
- pLevel->pBestIdx = pIndex;
- }
- if( doNotReorder ) break;
- }
- WHERETRACE(("*** Optimizer choose table %d for loop %d\n", bestJ,
+ if( doNotReorder ) break;
+ }
+ }
+ assert( bestJ>=0 );
+ assert( notReady & getMask(pMaskSet, pTabList->a[bestJ].iCursor) );
+ WHERETRACE(("*** Optimizer selects table %d for loop %d\n", bestJ,
pLevel-pWInfo->a));
- if( (bestFlags & WHERE_ORDERBY)!=0 ){
+ if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 ){
*ppOrderBy = 0;
}
- andFlags &= bestFlags;
- pLevel->flags = bestFlags;
- pLevel->pIdx = pBest;
- pLevel->nEq = bestNEq;
- pLevel->aInLoop = 0;
- pLevel->nIn = 0;
- if( pBest ){
+ andFlags &= bestPlan.plan.wsFlags;
+ pLevel->plan = bestPlan.plan;
+ if( bestPlan.plan.wsFlags & WHERE_INDEXED ){
pLevel->iIdxCur = pParse->nTab++;
}else{
pLevel->iIdxCur = -1;
}
- notReady &= ~getMask(&maskSet, pTabList->a[bestJ].iCursor);
- pLevel->iFrom = bestJ;
+ notReady &= ~getMask(pMaskSet, pTabList->a[bestJ].iCursor);
+ pLevel->iFrom = (u8)bestJ;
+
+ /* Check that if the table scanned by this loop iteration had an
+ ** INDEXED BY clause attached to it, that the named index is being
+ ** used for the scan. If not, then query compilation has failed.
+ ** Return an error.
+ */
+ pIdx = pTabList->a[bestJ].pIndex;
+ if( pIdx ){
+ if( (bestPlan.plan.wsFlags & WHERE_INDEXED)==0 ){
+ sqlite3ErrorMsg(pParse, "cannot use index: %s", pIdx->zName);
+ goto whereBeginError;
+ }else{
+ /* If an INDEXED BY clause is used, the bestIndex() function is
+ ** guaranteed to find the index specified in the INDEXED BY clause
+ ** if it find an index at all. */
+ assert( bestPlan.plan.u.pIdx==pIdx );
+ }
+ }
}
WHERETRACE(("*** Optimizer Finished ***\n"));
+ if( pParse->nErr || db->mallocFailed ){
+ goto whereBeginError;
+ }
/* If the total query only selects a single row, then the ORDER BY
** clause is irrelevant.
@@ -72266,10 +89668,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** The one-pass algorithm only works if the WHERE clause constraints
** the statement to update a single row.
*/
- assert( (wflags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
- if( (wflags & WHERE_ONEPASS_DESIRED)!=0 && (andFlags & WHERE_UNIQUE)!=0 ){
+ assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
+ if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 && (andFlags & WHERE_UNIQUE)!=0 ){
pWInfo->okOnePass = 1;
- pWInfo->a[0].flags &= ~WHERE_IDX_ONLY;
+ pWInfo->a[0].plan.wsFlags &= ~WHERE_IDX_ONLY;
}
/* Open all tables in the pTabList and any indices selected for
@@ -72278,9 +89680,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */
for(i=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
Table *pTab; /* Table to open */
- Index *pIx; /* Index used to access pTab (if any) */
int iDb; /* Index of database containing table/index */
- int iIdxCur = pLevel->iIdxCur;
#ifndef SQLITE_OMIT_EXPLAIN
if( pParse->explain==2 ){
@@ -72288,55 +89688,61 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
zMsg = sqlite3MPrintf(db, "TABLE %s", pItem->zName);
if( pItem->zAlias ){
- zMsg = sqlite3MPrintf(db, "%z AS %s", zMsg, pItem->zAlias);
+ zMsg = sqlite3MAppendf(db, zMsg, "%s AS %s", zMsg, pItem->zAlias);
}
- if( (pIx = pLevel->pIdx)!=0 ){
- zMsg = sqlite3MPrintf(db, "%z WITH INDEX %s", zMsg, pIx->zName);
- }else if( pLevel->flags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
- zMsg = sqlite3MPrintf(db, "%z USING PRIMARY KEY", zMsg);
+ if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
+ zMsg = sqlite3MAppendf(db, zMsg, "%s WITH INDEX %s",
+ zMsg, pLevel->plan.u.pIdx->zName);
+ }else if( pLevel->plan.wsFlags & WHERE_MULTI_OR ){
+ zMsg = sqlite3MAppendf(db, zMsg, "%s VIA MULTI-INDEX UNION", zMsg);
+ }else if( pLevel->plan.wsFlags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
+ zMsg = sqlite3MAppendf(db, zMsg, "%s USING PRIMARY KEY", zMsg);
}
#ifndef SQLITE_OMIT_VIRTUALTABLE
- else if( pLevel->pBestIdx ){
- sqlite3_index_info *pBestIdx = pLevel->pBestIdx;
- zMsg = sqlite3MPrintf(db, "%z VIRTUAL TABLE INDEX %d:%s", zMsg,
- pBestIdx->idxNum, pBestIdx->idxStr);
+ else if( (pLevel->plan.wsFlags & WHERE_VIRTUALTABLE)!=0 ){
+ sqlite3_index_info *pVtabIdx = pLevel->plan.u.pVtabIdx;
+ zMsg = sqlite3MAppendf(db, zMsg, "%s VIRTUAL TABLE INDEX %d:%s", zMsg,
+ pVtabIdx->idxNum, pVtabIdx->idxStr);
}
#endif
- if( pLevel->flags & WHERE_ORDERBY ){
- zMsg = sqlite3MPrintf(db, "%z ORDER BY", zMsg);
+ if( pLevel->plan.wsFlags & WHERE_ORDERBY ){
+ zMsg = sqlite3MAppendf(db, zMsg, "%s ORDER BY", zMsg);
}
sqlite3VdbeAddOp4(v, OP_Explain, i, pLevel->iFrom, 0, zMsg, P4_DYNAMIC);
}
#endif /* SQLITE_OMIT_EXPLAIN */
pTabItem = &pTabList->a[pLevel->iFrom];
pTab = pTabItem->pTab;
- iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
- if( pTab->isEphem || pTab->pSelect ) continue;
+ iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ) continue;
#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pLevel->pBestIdx ){
+ if( (pLevel->plan.wsFlags & WHERE_VIRTUALTABLE)!=0 ){
+ const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
int iCur = pTabItem->iCursor;
- sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0,
- (const char*)pTab->pVtab, P4_VTAB);
+ sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0, pVTab, P4_VTAB);
}else
#endif
- if( (pLevel->flags & WHERE_IDX_ONLY)==0 ){
+ if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0
+ && (wctrlFlags & WHERE_OMIT_OPEN)==0 ){
int op = pWInfo->okOnePass ? OP_OpenWrite : OP_OpenRead;
sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op);
- if( !pWInfo->okOnePass && pTab->nCol<(sizeof(Bitmask)*8) ){
+ if( !pWInfo->okOnePass && pTab->nCol<BMS ){
Bitmask b = pTabItem->colUsed;
int n = 0;
for(; b; b=b>>1, n++){}
- sqlite3VdbeChangeP2(v, sqlite3VdbeCurrentAddr(v)-2, n);
+ sqlite3VdbeChangeP4(v, sqlite3VdbeCurrentAddr(v)-1, SQLITE_INT_TO_PTR(n), P4_INT32);
assert( n<=pTab->nCol );
}
}else{
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
}
pLevel->iTabCur = pTabItem->iCursor;
- if( (pIx = pLevel->pIdx)!=0 ){
+ if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
+ Index *pIx = pLevel->plan.u.pIdx;
KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIx);
+ int iIdxCur = pLevel->iIdxCur;
assert( pIx->pSchema==pTab->pSchema );
- sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pIx->nColumn+1);
+ assert( iIdxCur>=0 );
sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIx->tnum, iDb,
(char*)pKey, P4_KEYINFO_HANDOFF);
VdbeComment((v, "%s", pIx->zName));
@@ -72350,400 +89756,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** program.
*/
notReady = ~(Bitmask)0;
- for(i=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
- int j;
- int iCur = pTabItem->iCursor; /* The VDBE cursor for the table */
- Index *pIdx; /* The index we will be using */
- int nxt; /* Where to jump to continue with the next IN case */
- int iIdxCur; /* The VDBE cursor for the index */
- int omitTable; /* True if we use the index only */
- int bRev; /* True if we need to scan in reverse order */
-
- pTabItem = &pTabList->a[pLevel->iFrom];
- iCur = pTabItem->iCursor;
- pIdx = pLevel->pIdx;
- iIdxCur = pLevel->iIdxCur;
- bRev = (pLevel->flags & WHERE_REVERSE)!=0;
- omitTable = (pLevel->flags & WHERE_IDX_ONLY)!=0;
-
- /* Create labels for the "break" and "continue" instructions
- ** for the current loop. Jump to brk to break out of a loop.
- ** Jump to cont to go immediately to the next iteration of the
- ** loop.
- **
- ** When there is an IN operator, we also have a "nxt" label that
- ** means to continue with the next IN value combination. When
- ** there are no IN operators in the constraints, the "nxt" label
- ** is the same as "brk".
- */
- brk = pLevel->brk = pLevel->nxt = sqlite3VdbeMakeLabel(v);
- cont = pLevel->cont = sqlite3VdbeMakeLabel(v);
-
- /* If this is the right table of a LEFT OUTER JOIN, allocate and
- ** initialize a memory cell that records if this table matches any
- ** row of the left table of the join.
- */
- if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){
- pLevel->iLeftJoin = ++pParse->nMem;
- sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin);
- VdbeComment((v, "init LEFT JOIN no-match flag"));
- }
-
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- if( pLevel->pBestIdx ){
- /* Case 0: The table is a virtual-table. Use the VFilter and VNext
- ** to access the data.
- */
- int j;
- int iReg; /* P3 Value for OP_VFilter */
- sqlite3_index_info *pBestIdx = pLevel->pBestIdx;
- int nConstraint = pBestIdx->nConstraint;
- struct sqlite3_index_constraint_usage *aUsage =
- pBestIdx->aConstraintUsage;
- const struct sqlite3_index_constraint *aConstraint =
- pBestIdx->aConstraint;
-
- iReg = sqlite3GetTempRange(pParse, nConstraint+2);
- for(j=1; j<=nConstraint; j++){
- int k;
- for(k=0; k<nConstraint; k++){
- if( aUsage[k].argvIndex==j ){
- int iTerm = aConstraint[k].iTermOffset;
- sqlite3ExprCode(pParse, wc.a[iTerm].pExpr->pRight, iReg+j+1);
- break;
- }
- }
- if( k==nConstraint ) break;
- }
- sqlite3VdbeAddOp2(v, OP_Integer, pBestIdx->idxNum, iReg);
- sqlite3VdbeAddOp2(v, OP_Integer, j-1, iReg+1);
- sqlite3VdbeAddOp4(v, OP_VFilter, iCur, brk, iReg, pBestIdx->idxStr,
- pBestIdx->needToFreeIdxStr ? P4_MPRINTF : P4_STATIC);
- sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
- pBestIdx->needToFreeIdxStr = 0;
- for(j=0; j<pBestIdx->nConstraint; j++){
- if( aUsage[j].omit ){
- int iTerm = aConstraint[j].iTermOffset;
- disableTerm(pLevel, &wc.a[iTerm]);
- }
- }
- pLevel->op = OP_VNext;
- pLevel->p1 = iCur;
- pLevel->p2 = sqlite3VdbeCurrentAddr(v);
- }else
-#endif /* SQLITE_OMIT_VIRTUALTABLE */
-
- if( pLevel->flags & WHERE_ROWID_EQ ){
- /* Case 1: We can directly reference a single row using an
- ** equality comparison against the ROWID field. Or
- ** we reference multiple rows using a "rowid IN (...)"
- ** construct.
- */
- int r1;
- pTerm = findTerm(&wc, iCur, -1, notReady, WO_EQ|WO_IN, 0);
- assert( pTerm!=0 );
- assert( pTerm->pExpr!=0 );
- assert( pTerm->leftCursor==iCur );
- assert( omitTable==0 );
- r1 = codeEqualityTerm(pParse, pTerm, pLevel, 0);
- nxt = pLevel->nxt;
- sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, nxt);
- sqlite3VdbeAddOp3(v, OP_NotExists, iCur, nxt, r1);
- VdbeComment((v, "pk"));
- pLevel->op = OP_Noop;
- }else if( pLevel->flags & WHERE_ROWID_RANGE ){
- /* Case 2: We have an inequality comparison against the ROWID field.
- */
- int testOp = OP_Noop;
- int start;
- WhereTerm *pStart, *pEnd;
-
- assert( omitTable==0 );
- pStart = findTerm(&wc, iCur, -1, notReady, WO_GT|WO_GE, 0);
- pEnd = findTerm(&wc, iCur, -1, notReady, WO_LT|WO_LE, 0);
- if( bRev ){
- pTerm = pStart;
- pStart = pEnd;
- pEnd = pTerm;
- }
- if( pStart ){
- Expr *pX;
- int r1, regFree1;
- pX = pStart->pExpr;
- assert( pX!=0 );
- assert( pStart->leftCursor==iCur );
- r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &regFree1);
- sqlite3VdbeAddOp3(v, OP_ForceInt, r1, brk,
- pX->op==TK_LE || pX->op==TK_GT);
- sqlite3VdbeAddOp3(v, bRev ? OP_MoveLt : OP_MoveGe, iCur, brk, r1);
- VdbeComment((v, "pk"));
- sqlite3ReleaseTempReg(pParse, regFree1);
- disableTerm(pLevel, pStart);
- }else{
- sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, brk);
- }
- if( pEnd ){
- Expr *pX;
- pX = pEnd->pExpr;
- assert( pX!=0 );
- assert( pEnd->leftCursor==iCur );
- pLevel->iMem = ++pParse->nMem;
- sqlite3ExprCode(pParse, pX->pRight, pLevel->iMem);
- if( pX->op==TK_LT || pX->op==TK_GT ){
- testOp = bRev ? OP_Le : OP_Ge;
- }else{
- testOp = bRev ? OP_Lt : OP_Gt;
- }
- disableTerm(pLevel, pEnd);
- }
- start = sqlite3VdbeCurrentAddr(v);
- pLevel->op = bRev ? OP_Prev : OP_Next;
- pLevel->p1 = iCur;
- pLevel->p2 = start;
- if( testOp!=OP_Noop ){
- int r1 = sqlite3GetTempReg(pParse);
- sqlite3VdbeAddOp2(v, OP_Rowid, iCur, r1);
- /* sqlite3VdbeAddOp2(v, OP_SCopy, pLevel->iMem, 0); */
- sqlite3VdbeAddOp3(v, testOp, pLevel->iMem, brk, r1);
- sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL);
- sqlite3ReleaseTempReg(pParse, r1);
- }
- }else if( pLevel->flags & (WHERE_COLUMN_RANGE|WHERE_COLUMN_EQ) ){
- /* Case 3: A scan using an index.
- **
- ** The WHERE clause may contain zero or more equality
- ** terms ("==" or "IN" operators) that refer to the N
- ** left-most columns of the index. It may also contain
- ** inequality constraints (>, <, >= or <=) on the indexed
- ** column that immediately follows the N equalities. Only
- ** the right-most column can be an inequality - the rest must
- ** use the "==" and "IN" operators. For example, if the
- ** index is on (x,y,z), then the following clauses are all
- ** optimized:
- **
- ** x=5
- ** x=5 AND y=10
- ** x=5 AND y<10
- ** x=5 AND y>5 AND y<10
- ** x=5 AND y=5 AND z<=10
- **
- ** The z<10 term of the following cannot be used, only
- ** the x=5 term:
- **
- ** x=5 AND z<10
- **
- ** N may be zero if there are inequality constraints.
- ** If there are no inequality constraints, then N is at
- ** least one.
- **
- ** This case is also used when there are no WHERE clause
- ** constraints but an index is selected anyway, in order
- ** to force the output order to conform to an ORDER BY.
- */
- int aStartOp[] = {
- 0,
- 0,
- OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */
- OP_Last, /* 3: (!start_constraints && startEq && bRev) */
- OP_MoveGt, /* 4: (start_constraints && !startEq && !bRev) */
- OP_MoveLt, /* 5: (start_constraints && !startEq && bRev) */
- OP_MoveGe, /* 6: (start_constraints && startEq && !bRev) */
- OP_MoveLe /* 7: (start_constraints && startEq && bRev) */
- };
- int aEndOp[] = {
- OP_Noop, /* 0: (!end_constraints) */
- OP_IdxGE, /* 1: (end_constraints && !bRev) */
- OP_IdxLT /* 2: (end_constraints && bRev) */
- };
- int nEq = pLevel->nEq;
- int isMinQuery = 0; /* If this is an optimized SELECT min(x).. */
- int regBase; /* Base register holding constraint values */
- int r1; /* Temp register */
- WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */
- WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */
- int startEq; /* True if range start uses ==, >= or <= */
- int endEq; /* True if range end uses ==, >= or <= */
- int start_constraints; /* Start of range is constrained */
- int k = pIdx->aiColumn[nEq]; /* Column for inequality constraints */
- int nConstraint; /* Number of constraint terms */
- int op;
-
- /* Generate code to evaluate all constraint terms using == or IN
- ** and store the values of those terms in an array of registers
- ** starting at regBase.
- */
- regBase = codeAllEqualityTerms(pParse, pLevel, &wc, notReady, 2);
- nxt = pLevel->nxt;
-
- /* If this loop satisfies a sort order (pOrderBy) request that
- ** was passed to this function to implement a "SELECT min(x) ..."
- ** query, then the caller will only allow the loop to run for
- ** a single iteration. This means that the first row returned
- ** should not have a NULL value stored in 'x'. If column 'x' is
- ** the first one after the nEq equality constraints in the index,
- ** this requires some special handling.
- */
- if( (wflags&WHERE_ORDERBY_MIN)!=0
- && (pLevel->flags&WHERE_ORDERBY)
- && (pIdx->nColumn>nEq)
- && (pOrderBy->a[0].pExpr->iColumn==pIdx->aiColumn[nEq])
- ){
- isMinQuery = 1;
- }
-
- /* Find any inequality constraint terms for the start and end
- ** of the range.
- */
- if( pLevel->flags & WHERE_TOP_LIMIT ){
- pRangeEnd = findTerm(&wc, iCur, k, notReady, (WO_LT|WO_LE), pIdx);
- }
- if( pLevel->flags & WHERE_BTM_LIMIT ){
- pRangeStart = findTerm(&wc, iCur, k, notReady, (WO_GT|WO_GE), pIdx);
- }
-
- /* If we are doing a reverse order scan on an ascending index, or
- ** a forward order scan on a descending index, interchange the
- ** start and end terms (pRangeStart and pRangeEnd).
- */
- if( bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC) ){
- SWAP(WhereTerm *, pRangeEnd, pRangeStart);
- }
-
- testcase( pRangeStart && pRangeStart->eOperator & WO_LE );
- testcase( pRangeStart && pRangeStart->eOperator & WO_GE );
- testcase( pRangeEnd && pRangeEnd->eOperator & WO_LE );
- testcase( pRangeEnd && pRangeEnd->eOperator & WO_GE );
- startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE);
- endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE);
- start_constraints = pRangeStart || nEq>0;
-
- /* Seek the index cursor to the start of the range. */
- nConstraint = nEq;
- if( pRangeStart ){
- int dcc = pParse->disableColCache;
- if( pRangeEnd ){
- pParse->disableColCache = 1;
- }
- sqlite3ExprCode(pParse, pRangeStart->pExpr->pRight, regBase+nEq);
- pParse->disableColCache = dcc;
- sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, nxt);
- nConstraint++;
- }else if( isMinQuery ){
- sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
- nConstraint++;
- startEq = 0;
- start_constraints = 1;
- }
- codeApplyAffinity(pParse, regBase, nConstraint, pIdx);
- op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
- assert( op!=0 );
- testcase( op==OP_Rewind );
- testcase( op==OP_Last );
- testcase( op==OP_MoveGt );
- testcase( op==OP_MoveGe );
- testcase( op==OP_MoveLe );
- testcase( op==OP_MoveLt );
- sqlite3VdbeAddOp4(v, op, iIdxCur, nxt, regBase,
- (char*)nConstraint, P4_INT32);
-
- /* Load the value for the inequality constraint at the end of the
- ** range (if any).
- */
- nConstraint = nEq;
- if( pRangeEnd ){
- sqlite3ExprCode(pParse, pRangeEnd->pExpr->pRight, regBase+nEq);
- sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, nxt);
- codeApplyAffinity(pParse, regBase, nEq+1, pIdx);
- nConstraint++;
- }
-
- /* Top of the loop body */
- pLevel->p2 = sqlite3VdbeCurrentAddr(v);
-
- /* Check if the index cursor is past the end of the range. */
- op = aEndOp[(pRangeEnd || nEq) * (1 + bRev)];
- testcase( op==OP_Noop );
- testcase( op==OP_IdxGE );
- testcase( op==OP_IdxLT );
- sqlite3VdbeAddOp4(v, op, iIdxCur, nxt, regBase,
- (char*)nConstraint, P4_INT32);
- sqlite3VdbeChangeP5(v, endEq!=bRev);
-
- /* If there are inequality constraints, check that the value
- ** of the table column that the inequality contrains is not NULL.
- ** If it is, jump to the next iteration of the loop.
- */
- r1 = sqlite3GetTempReg(pParse);
- testcase( pLevel->flags & WHERE_BTM_LIMIT );
- testcase( pLevel->flags & WHERE_TOP_LIMIT );
- if( pLevel->flags & (WHERE_BTM_LIMIT|WHERE_TOP_LIMIT) ){
- sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, nEq, r1);
- sqlite3VdbeAddOp2(v, OP_IsNull, r1, cont);
- }
-
- /* Seek the table cursor, if required */
- if( !omitTable ){
- sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, r1);
- sqlite3VdbeAddOp3(v, OP_MoveGe, iCur, 0, r1); /* Deferred seek */
- }
- sqlite3ReleaseTempReg(pParse, r1);
-
- /* Record the instruction used to terminate the loop. Disable
- ** WHERE clause terms made redundant by the index range scan.
- */
- pLevel->op = bRev ? OP_Prev : OP_Next;
- pLevel->p1 = iIdxCur;
- disableTerm(pLevel, pRangeStart);
- disableTerm(pLevel, pRangeEnd);
- }else{
- /* Case 4: There is no usable index. We must do a complete
- ** scan of the entire table.
- */
- assert( omitTable==0 );
- assert( bRev==0 );
- pLevel->op = OP_Next;
- pLevel->p1 = iCur;
- pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, OP_Rewind, iCur, brk);
- }
- notReady &= ~getMask(&maskSet, iCur);
-
- /* Insert code to test every subexpression that can be completely
- ** computed using the current set of tables.
- */
- for(pTerm=wc.a, j=wc.nTerm; j>0; j--, pTerm++){
- Expr *pE;
- testcase( pTerm->flags & TERM_VIRTUAL );
- testcase( pTerm->flags & TERM_CODED );
- if( pTerm->flags & (TERM_VIRTUAL|TERM_CODED) ) continue;
- if( (pTerm->prereqAll & notReady)!=0 ) continue;
- pE = pTerm->pExpr;
- assert( pE!=0 );
- if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
- continue;
- }
- sqlite3ExprIfFalse(pParse, pE, cont, SQLITE_JUMPIFNULL);
- pTerm->flags |= TERM_CODED;
- }
-
- /* For a LEFT OUTER JOIN, generate code that will record the fact that
- ** at least one row of the right table has matched the left table.
- */
- if( pLevel->iLeftJoin ){
- pLevel->top = sqlite3VdbeCurrentAddr(v);
- sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin);
- VdbeComment((v, "record LEFT JOIN hit"));
- sqlite3ExprClearColumnCache(pParse, pLevel->iTabCur);
- sqlite3ExprClearColumnCache(pParse, pLevel->iIdxCur);
- for(pTerm=wc.a, j=0; j<wc.nTerm; j++, pTerm++){
- testcase( pTerm->flags & TERM_VIRTUAL );
- testcase( pTerm->flags & TERM_CODED );
- if( pTerm->flags & (TERM_VIRTUAL|TERM_CODED) ) continue;
- if( (pTerm->prereqAll & notReady)!=0 ) continue;
- assert( pTerm->pExpr );
- sqlite3ExprIfFalse(pParse, pTerm->pExpr, cont, SQLITE_JUMPIFNULL);
- pTerm->flags |= TERM_CODED;
- }
- }
+ for(i=0; i<pTabList->nSrc; i++){
+ notReady = codeOneLoopStart(pWInfo, i, wctrlFlags, notReady);
+ pWInfo->iContinue = pWInfo->a[i].addrCont;
}
#ifdef SQLITE_TEST /* For testing and debugging use only */
@@ -72760,9 +89775,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
pTabItem = &pTabList->a[pLevel->iFrom];
z = pTabItem->zAlias;
if( z==0 ) z = pTabItem->pTab->zName;
- n = strlen(z);
+ n = sqlite3Strlen30(z);
if( n+nQPlan < sizeof(sqlite3_query_plan)-10 ){
- if( pLevel->flags & WHERE_IDX_ONLY ){
+ if( pLevel->plan.wsFlags & WHERE_IDX_ONLY ){
memcpy(&sqlite3_query_plan[nQPlan], "{}", 2);
nQPlan += 2;
}else{
@@ -72771,21 +89786,21 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
}
sqlite3_query_plan[nQPlan++] = ' ';
}
- testcase( pLevel->flags & WHERE_ROWID_EQ );
- testcase( pLevel->flags & WHERE_ROWID_RANGE );
- if( pLevel->flags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
+ testcase( pLevel->plan.wsFlags & WHERE_ROWID_EQ );
+ testcase( pLevel->plan.wsFlags & WHERE_ROWID_RANGE );
+ if( pLevel->plan.wsFlags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
memcpy(&sqlite3_query_plan[nQPlan], "* ", 2);
nQPlan += 2;
- }else if( pLevel->pIdx==0 ){
- memcpy(&sqlite3_query_plan[nQPlan], "{} ", 3);
- nQPlan += 3;
- }else{
- n = strlen(pLevel->pIdx->zName);
+ }else if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
+ n = sqlite3Strlen30(pLevel->plan.u.pIdx->zName);
if( n+nQPlan < sizeof(sqlite3_query_plan)-2 ){
- memcpy(&sqlite3_query_plan[nQPlan], pLevel->pIdx->zName, n);
+ memcpy(&sqlite3_query_plan[nQPlan], pLevel->plan.u.pIdx->zName, n);
nQPlan += n;
sqlite3_query_plan[nQPlan++] = ' ';
}
+ }else{
+ memcpy(&sqlite3_query_plan[nQPlan], "{} ", 3);
+ nQPlan += 3;
}
}
while( nQPlan>0 && sqlite3_query_plan[nQPlan-1]==' ' ){
@@ -72798,14 +89813,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
/* Record the continuation address in the WhereInfo structure. Then
** clean up and return.
*/
- pWInfo->iContinue = cont;
- whereClauseClear(&wc);
return pWInfo;
/* Jump here if malloc fails */
-whereBeginNoMem:
- whereClauseClear(&wc);
- whereInfoFree(pWInfo);
+whereBeginError:
+ whereInfoFree(db, pWInfo);
return 0;
}
@@ -72814,32 +89826,35 @@ whereBeginNoMem:
** sqlite3WhereBegin() for additional information.
*/
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
- Vdbe *v = pWInfo->pParse->pVdbe;
+ Parse *pParse = pWInfo->pParse;
+ Vdbe *v = pParse->pVdbe;
int i;
WhereLevel *pLevel;
SrcList *pTabList = pWInfo->pTabList;
+ sqlite3 *db = pParse->db;
/* Generate loop termination code.
*/
- sqlite3ExprClearColumnCache(pWInfo->pParse, -1);
+ sqlite3ExprCacheClear(pParse);
for(i=pTabList->nSrc-1; i>=0; i--){
pLevel = &pWInfo->a[i];
- sqlite3VdbeResolveLabel(v, pLevel->cont);
+ sqlite3VdbeResolveLabel(v, pLevel->addrCont);
if( pLevel->op!=OP_Noop ){
sqlite3VdbeAddOp2(v, pLevel->op, pLevel->p1, pLevel->p2);
+ sqlite3VdbeChangeP5(v, pLevel->p5);
}
- if( pLevel->nIn ){
+ if( pLevel->plan.wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){
struct InLoop *pIn;
int j;
- sqlite3VdbeResolveLabel(v, pLevel->nxt);
- for(j=pLevel->nIn, pIn=&pLevel->aInLoop[j-1]; j>0; j--, pIn--){
- sqlite3VdbeJumpHere(v, pIn->topAddr+1);
- sqlite3VdbeAddOp2(v, OP_Next, pIn->iCur, pIn->topAddr);
- sqlite3VdbeJumpHere(v, pIn->topAddr-1);
+ sqlite3VdbeResolveLabel(v, pLevel->addrNxt);
+ for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){
+ sqlite3VdbeJumpHere(v, pIn->addrInTop+1);
+ sqlite3VdbeAddOp2(v, OP_Next, pIn->iCur, pIn->addrInTop);
+ sqlite3VdbeJumpHere(v, pIn->addrInTop-1);
}
- sqlite3_free(pLevel->aInLoop);
+ sqlite3DbFree(db, pLevel->u.in.aInLoop);
}
- sqlite3VdbeResolveLabel(v, pLevel->brk);
+ sqlite3VdbeResolveLabel(v, pLevel->addrBrk);
if( pLevel->iLeftJoin ){
int addr;
addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin);
@@ -72847,7 +89862,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
if( pLevel->iIdxCur>=0 ){
sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur);
}
- sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->top);
+ if( pLevel->op==OP_Return ){
+ sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst);
+ }else{
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrFirst);
+ }
sqlite3VdbeJumpHere(v, addr);
}
}
@@ -72863,12 +89882,14 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom];
Table *pTab = pTabItem->pTab;
assert( pTab!=0 );
- if( pTab->isEphem || pTab->pSelect ) continue;
- if( !pWInfo->okOnePass && (pLevel->flags & WHERE_IDX_ONLY)==0 ){
- sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor);
- }
- if( pLevel->pIdx!=0 ){
- sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur);
+ if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ) continue;
+ if( (pWInfo->wctrlFlags & WHERE_OMIT_CLOSE)==0 ){
+ if( !pWInfo->okOnePass && (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 ){
+ sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor);
+ }
+ if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
+ sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur);
+ }
}
/* If this scan uses an index, make code substitutions to read data
@@ -72884,11 +89905,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
** that reference the table and converts them into opcodes that
** reference the index.
*/
- if( pLevel->pIdx ){
+ if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 && !db->mallocFailed){
int k, j, last;
VdbeOp *pOp;
- Index *pIdx = pLevel->pIdx;
- int useIndexOnly = pLevel->flags & WHERE_IDX_ONLY;
+ Index *pIdx = pLevel->plan.u.pIdx;
+ int useIndexOnly = pLevel->plan.wsFlags & WHERE_IDX_ONLY;
assert( pIdx!=0 );
pOp = sqlite3VdbeGetOp(v, pWInfo->iTop);
@@ -72916,7 +89937,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
/* Final cleanup
*/
- whereInfoFree(pWInfo);
+ whereInfoFree(db, pWInfo);
return;
}
@@ -72924,12 +89945,29 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
/************** Begin file parse.c *******************************************/
/* Driver template for the LEMON parser generator.
** The author disclaims copyright to this source code.
+**
+** This version of "lempar.c" is modified, slightly, for use by SQLite.
+** The only modifications are the addition of a couple of NEVER()
+** macros to disable tests that are needed in the case of a general
+** LALR(1) grammar but which are always false in the
+** specific grammar used by SQLite.
*/
-/* First off, code is include which follows the "include" declaration
-** in the input file. */
+/* First off, code is included that follows the "include" declaration
+** in the input grammar file. */
/*
+** Disable all error recovery processing in the parser push-down
+** automaton.
+*/
+#define YYNOERRORRECOVERY 1
+
+/*
+** Make yytestcase() the same as testcase()
+*/
+#define yytestcase(X) testcase(X)
+
+/*
** An instance of this structure holds information about the
** LIMIT clause of a SELECT statement.
*/
@@ -72963,6 +90001,68 @@ struct TrigEvent { int a; IdList * b; };
*/
struct AttachKey { int type; Token key; };
+
+ /* This is a utility routine used to set the ExprSpan.zStart and
+ ** ExprSpan.zEnd values of pOut so that the span covers the complete
+ ** range of text beginning with pStart and going to the end of pEnd.
+ */
+ static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
+ pOut->zStart = pStart->z;
+ pOut->zEnd = &pEnd->z[pEnd->n];
+ }
+
+ /* Construct a new Expr object from a single identifier. Use the
+ ** new Expr to populate pOut. Set the span of pOut to be the identifier
+ ** that created the expression.
+ */
+ static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
+ pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
+ pOut->zStart = pValue->z;
+ pOut->zEnd = &pValue->z[pValue->n];
+ }
+
+ /* This routine constructs a binary expression node out of two ExprSpan
+ ** objects and uses the result to populate a new ExprSpan object.
+ */
+ static void spanBinaryExpr(
+ ExprSpan *pOut, /* Write the result here */
+ Parse *pParse, /* The parsing context. Errors accumulate here */
+ int op, /* The binary operation */
+ ExprSpan *pLeft, /* The left operand */
+ ExprSpan *pRight /* The right operand */
+ ){
+ pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
+ pOut->zStart = pLeft->zStart;
+ pOut->zEnd = pRight->zEnd;
+ }
+
+ /* Construct an expression node for a unary postfix operator
+ */
+ static void spanUnaryPostfix(
+ ExprSpan *pOut, /* Write the new expression node here */
+ Parse *pParse, /* Parsing context to record errors */
+ int op, /* The operator */
+ ExprSpan *pOperand, /* The operand */
+ Token *pPostOp /* The operand token for setting the span */
+ ){
+ pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
+ pOut->zStart = pOperand->zStart;
+ pOut->zEnd = &pPostOp->z[pPostOp->n];
+ }
+
+ /* Construct an expression node for a unary prefix operator
+ */
+ static void spanUnaryPrefix(
+ ExprSpan *pOut, /* Write the new expression node here */
+ Parse *pParse, /* Parsing context to record errors */
+ int op, /* The operator */
+ ExprSpan *pOperand, /* The operand */
+ Token *pPreOp /* The operand token for setting the span */
+ ){
+ pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
+ pOut->zStart = pPreOp->z;
+ pOut->zEnd = pOperand->zEnd;
+ }
/* Next is all token values, in a form suitable for use by makeheaders.
** This section will be null unless lemon is run with the -m switch.
*/
@@ -73013,24 +90113,26 @@ struct AttachKey { int type; Token key; };
** defined, then do no error processing.
*/
#define YYCODETYPE unsigned char
-#define YYNOCODE 248
+#define YYNOCODE 254
#define YYACTIONTYPE unsigned short int
-#define YYWILDCARD 59
+#define YYWILDCARD 67
#define sqlite3ParserTOKENTYPE Token
typedef union {
+ int yyinit;
sqlite3ParserTOKENTYPE yy0;
- int yy46;
- struct LikeOp yy72;
- Expr* yy172;
- ExprList* yy174;
- Select* yy219;
- struct LimitVal yy234;
- TriggerStep* yy243;
- struct TrigEvent yy370;
- SrcList* yy373;
- struct {int value; int mask;} yy405;
- Token yy410;
- IdList* yy432;
+ Select* yy3;
+ ExprList* yy14;
+ SrcList* yy65;
+ struct LikeOp yy96;
+ Expr* yy132;
+ u8 yy186;
+ int yy328;
+ ExprSpan yy346;
+ struct TrigEvent yy378;
+ IdList* yy408;
+ struct {int value; int mask;} yy429;
+ TriggerStep* yy473;
+ struct LimitVal yy476;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -73039,8 +90141,8 @@ typedef union {
#define sqlite3ParserARG_PDECL ,Parse *pParse
#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
#define sqlite3ParserARG_STORE yypParser->pParse = pParse
-#define YYNSTATE 589
-#define YYNRULE 313
+#define YYNSTATE 629
+#define YYNRULE 329
#define YYFALLBACK 1
#define YY_NO_ACTION (YYNSTATE+YYNRULE+2)
#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)
@@ -73048,9 +90150,22 @@ typedef union {
/* The yyzerominor constant is used to initialize instances of
** YYMINORTYPE objects to zero. */
-static const YYMINORTYPE yyzerominor;
+static const YYMINORTYPE yyzerominor = { 0 };
-/* Next are that tables used to determine what action to take based on the
+/* Define the yytestcase() macro to be a no-op if is not already defined
+** otherwise.
+**
+** Applications can choose to define yytestcase() in the %include section
+** to a macro that can assist in verifying code coverage. For production
+** code the yytestcase() macro should be turned off. But it is useful
+** for testing.
+*/
+#ifndef yytestcase
+# define yytestcase(X)
+#endif
+
+
+/* Next are the tables used to determine what action to take based on the
** current state and lookahead token. These tables are used to implement
** functions that take a state number and lookahead value and return an
** action integer.
@@ -73098,416 +90213,465 @@ static const YYMINORTYPE yyzerominor;
** yy_default[] Default action for each state.
*/
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 292, 903, 124, 588, 409, 172, 2, 418, 61, 61,
- /* 10 */ 61, 61, 519, 63, 63, 63, 63, 64, 64, 65,
- /* 20 */ 65, 65, 66, 210, 447, 212, 425, 431, 68, 63,
- /* 30 */ 63, 63, 63, 64, 64, 65, 65, 65, 66, 210,
- /* 40 */ 391, 388, 396, 451, 60, 59, 297, 435, 436, 432,
- /* 50 */ 432, 62, 62, 61, 61, 61, 61, 263, 63, 63,
- /* 60 */ 63, 63, 64, 64, 65, 65, 65, 66, 210, 292,
- /* 70 */ 493, 494, 418, 489, 208, 82, 67, 420, 69, 154,
- /* 80 */ 63, 63, 63, 63, 64, 64, 65, 65, 65, 66,
- /* 90 */ 210, 67, 462, 69, 154, 425, 431, 574, 264, 58,
- /* 100 */ 64, 64, 65, 65, 65, 66, 210, 397, 398, 422,
- /* 110 */ 422, 422, 292, 60, 59, 297, 435, 436, 432, 432,
- /* 120 */ 62, 62, 61, 61, 61, 61, 317, 63, 63, 63,
- /* 130 */ 63, 64, 64, 65, 65, 65, 66, 210, 425, 431,
- /* 140 */ 94, 65, 65, 65, 66, 210, 396, 210, 414, 34,
- /* 150 */ 56, 298, 442, 443, 410, 418, 60, 59, 297, 435,
- /* 160 */ 436, 432, 432, 62, 62, 61, 61, 61, 61, 208,
- /* 170 */ 63, 63, 63, 63, 64, 64, 65, 65, 65, 66,
- /* 180 */ 210, 292, 372, 524, 295, 572, 113, 408, 522, 451,
- /* 190 */ 331, 317, 407, 20, 244, 340, 519, 396, 478, 531,
- /* 200 */ 505, 447, 212, 571, 570, 245, 530, 425, 431, 149,
- /* 210 */ 150, 397, 398, 414, 41, 211, 151, 533, 488, 489,
- /* 220 */ 418, 568, 569, 420, 292, 60, 59, 297, 435, 436,
- /* 230 */ 432, 432, 62, 62, 61, 61, 61, 61, 317, 63,
- /* 240 */ 63, 63, 63, 64, 64, 65, 65, 65, 66, 210,
- /* 250 */ 425, 431, 447, 333, 215, 422, 422, 422, 363, 299,
- /* 260 */ 414, 41, 397, 398, 366, 567, 211, 292, 60, 59,
- /* 270 */ 297, 435, 436, 432, 432, 62, 62, 61, 61, 61,
- /* 280 */ 61, 396, 63, 63, 63, 63, 64, 64, 65, 65,
- /* 290 */ 65, 66, 210, 425, 431, 491, 300, 524, 474, 66,
- /* 300 */ 210, 214, 474, 229, 411, 286, 534, 20, 449, 523,
- /* 310 */ 168, 60, 59, 297, 435, 436, 432, 432, 62, 62,
- /* 320 */ 61, 61, 61, 61, 474, 63, 63, 63, 63, 64,
- /* 330 */ 64, 65, 65, 65, 66, 210, 209, 480, 317, 77,
- /* 340 */ 292, 239, 300, 55, 484, 490, 397, 398, 181, 547,
- /* 350 */ 494, 345, 348, 349, 67, 152, 69, 154, 339, 524,
- /* 360 */ 414, 35, 350, 241, 221, 370, 425, 431, 579, 20,
- /* 370 */ 164, 118, 243, 343, 248, 344, 176, 322, 442, 443,
- /* 380 */ 414, 3, 80, 252, 60, 59, 297, 435, 436, 432,
- /* 390 */ 432, 62, 62, 61, 61, 61, 61, 174, 63, 63,
- /* 400 */ 63, 63, 64, 64, 65, 65, 65, 66, 210, 292,
- /* 410 */ 221, 550, 236, 487, 510, 353, 317, 118, 243, 343,
- /* 420 */ 248, 344, 176, 181, 317, 532, 345, 348, 349, 252,
- /* 430 */ 223, 415, 155, 464, 511, 425, 431, 350, 414, 34,
- /* 440 */ 465, 211, 177, 175, 160, 525, 414, 34, 338, 549,
- /* 450 */ 449, 323, 168, 60, 59, 297, 435, 436, 432, 432,
- /* 460 */ 62, 62, 61, 61, 61, 61, 415, 63, 63, 63,
- /* 470 */ 63, 64, 64, 65, 65, 65, 66, 210, 292, 542,
- /* 480 */ 335, 517, 504, 541, 456, 572, 302, 19, 331, 144,
- /* 490 */ 317, 390, 317, 330, 2, 362, 457, 294, 483, 373,
- /* 500 */ 269, 268, 252, 571, 425, 431, 589, 391, 388, 458,
- /* 510 */ 208, 495, 414, 49, 414, 49, 303, 586, 894, 230,
- /* 520 */ 894, 496, 60, 59, 297, 435, 436, 432, 432, 62,
- /* 530 */ 62, 61, 61, 61, 61, 201, 63, 63, 63, 63,
- /* 540 */ 64, 64, 65, 65, 65, 66, 210, 292, 317, 181,
- /* 550 */ 439, 255, 345, 348, 349, 370, 153, 583, 308, 251,
- /* 560 */ 309, 452, 76, 350, 78, 382, 211, 426, 427, 415,
- /* 570 */ 414, 27, 319, 425, 431, 440, 1, 22, 586, 893,
- /* 580 */ 396, 893, 544, 478, 320, 263, 438, 438, 429, 430,
- /* 590 */ 415, 60, 59, 297, 435, 436, 432, 432, 62, 62,
- /* 600 */ 61, 61, 61, 61, 237, 63, 63, 63, 63, 64,
- /* 610 */ 64, 65, 65, 65, 66, 210, 292, 428, 583, 374,
- /* 620 */ 224, 93, 517, 9, 159, 396, 557, 396, 456, 67,
- /* 630 */ 396, 69, 154, 399, 400, 401, 320, 328, 438, 438,
- /* 640 */ 457, 336, 425, 431, 361, 397, 398, 320, 433, 438,
- /* 650 */ 438, 582, 291, 458, 238, 327, 318, 222, 546, 292,
- /* 660 */ 60, 59, 297, 435, 436, 432, 432, 62, 62, 61,
- /* 670 */ 61, 61, 61, 225, 63, 63, 63, 63, 64, 64,
- /* 680 */ 65, 65, 65, 66, 210, 425, 431, 482, 313, 392,
- /* 690 */ 397, 398, 397, 398, 207, 397, 398, 825, 273, 517,
- /* 700 */ 251, 200, 292, 60, 59, 297, 435, 436, 432, 432,
- /* 710 */ 62, 62, 61, 61, 61, 61, 470, 63, 63, 63,
- /* 720 */ 63, 64, 64, 65, 65, 65, 66, 210, 425, 431,
- /* 730 */ 171, 160, 263, 263, 304, 415, 276, 395, 274, 263,
- /* 740 */ 517, 517, 263, 517, 192, 292, 60, 70, 297, 435,
- /* 750 */ 436, 432, 432, 62, 62, 61, 61, 61, 61, 379,
- /* 760 */ 63, 63, 63, 63, 64, 64, 65, 65, 65, 66,
- /* 770 */ 210, 425, 431, 384, 559, 305, 306, 251, 415, 320,
- /* 780 */ 560, 438, 438, 561, 540, 360, 540, 387, 292, 196,
- /* 790 */ 59, 297, 435, 436, 432, 432, 62, 62, 61, 61,
- /* 800 */ 61, 61, 371, 63, 63, 63, 63, 64, 64, 65,
- /* 810 */ 65, 65, 66, 210, 425, 431, 396, 275, 251, 251,
- /* 820 */ 172, 250, 418, 415, 386, 367, 178, 179, 180, 469,
- /* 830 */ 311, 123, 156, 5, 297, 435, 436, 432, 432, 62,
- /* 840 */ 62, 61, 61, 61, 61, 317, 63, 63, 63, 63,
- /* 850 */ 64, 64, 65, 65, 65, 66, 210, 72, 324, 194,
- /* 860 */ 4, 317, 263, 317, 296, 263, 415, 414, 28, 317,
- /* 870 */ 257, 317, 321, 72, 324, 317, 4, 119, 165, 177,
- /* 880 */ 296, 397, 398, 414, 23, 414, 32, 418, 321, 326,
- /* 890 */ 421, 414, 53, 414, 52, 317, 158, 414, 98, 451,
- /* 900 */ 317, 263, 317, 277, 317, 326, 378, 471, 261, 317,
- /* 910 */ 259, 18, 478, 445, 445, 451, 317, 414, 96, 75,
- /* 920 */ 74, 469, 414, 101, 414, 102, 414, 112, 73, 315,
- /* 930 */ 316, 414, 114, 420, 294, 75, 74, 481, 414, 16,
- /* 940 */ 381, 317, 279, 467, 73, 315, 316, 72, 324, 420,
- /* 950 */ 4, 208, 317, 183, 296, 317, 186, 128, 84, 208,
- /* 960 */ 8, 341, 321, 414, 99, 422, 422, 422, 423, 424,
- /* 970 */ 11, 623, 380, 307, 414, 33, 413, 414, 97, 326,
- /* 980 */ 412, 422, 422, 422, 423, 424, 11, 415, 413, 451,
- /* 990 */ 415, 162, 412, 317, 499, 500, 226, 227, 228, 104,
- /* 1000 */ 448, 476, 317, 173, 507, 317, 509, 508, 317, 75,
- /* 1010 */ 74, 329, 205, 21, 281, 414, 24, 418, 73, 315,
- /* 1020 */ 316, 282, 317, 420, 414, 54, 460, 414, 115, 317,
- /* 1030 */ 414, 116, 502, 203, 147, 549, 514, 468, 128, 202,
- /* 1040 */ 317, 473, 204, 317, 414, 117, 317, 477, 317, 584,
- /* 1050 */ 317, 414, 25, 317, 249, 422, 422, 422, 423, 424,
- /* 1060 */ 11, 506, 414, 36, 512, 414, 37, 317, 414, 26,
- /* 1070 */ 414, 38, 414, 39, 526, 414, 40, 317, 254, 317,
- /* 1080 */ 128, 317, 418, 317, 256, 377, 278, 268, 585, 414,
- /* 1090 */ 42, 293, 317, 352, 317, 128, 208, 513, 258, 414,
- /* 1100 */ 43, 414, 44, 414, 29, 414, 30, 545, 260, 128,
- /* 1110 */ 317, 553, 317, 173, 414, 45, 414, 46, 317, 262,
- /* 1120 */ 383, 554, 317, 91, 564, 317, 91, 317, 581, 189,
- /* 1130 */ 290, 357, 414, 47, 414, 48, 267, 365, 368, 369,
- /* 1140 */ 414, 31, 270, 271, 414, 10, 272, 414, 50, 414,
- /* 1150 */ 51, 556, 566, 280, 283, 284, 578, 146, 419, 405,
- /* 1160 */ 231, 505, 444, 325, 516, 463, 163, 446, 552, 394,
- /* 1170 */ 466, 563, 246, 515, 518, 520, 402, 403, 404, 7,
- /* 1180 */ 314, 84, 232, 334, 347, 83, 332, 57, 170, 79,
- /* 1190 */ 213, 461, 125, 85, 337, 342, 492, 502, 497, 301,
- /* 1200 */ 498, 416, 105, 219, 247, 218, 503, 501, 233, 220,
- /* 1210 */ 287, 234, 527, 528, 235, 529, 417, 521, 354, 288,
- /* 1220 */ 184, 121, 185, 240, 535, 475, 242, 356, 187, 479,
- /* 1230 */ 188, 358, 537, 88, 190, 548, 364, 193, 132, 376,
- /* 1240 */ 555, 375, 133, 134, 135, 310, 562, 138, 136, 575,
- /* 1250 */ 576, 577, 580, 100, 393, 406, 217, 142, 624, 625,
- /* 1260 */ 103, 141, 265, 166, 167, 434, 71, 453, 441, 437,
- /* 1270 */ 450, 143, 538, 157, 120, 454, 161, 472, 455, 169,
- /* 1280 */ 459, 81, 6, 12, 13, 92, 95, 126, 216, 127,
- /* 1290 */ 111, 485, 486, 17, 86, 346, 106, 122, 253, 107,
- /* 1300 */ 87, 108, 182, 245, 355, 145, 351, 536, 129, 359,
- /* 1310 */ 312, 130, 543, 173, 539, 266, 191, 109, 289, 551,
- /* 1320 */ 195, 14, 131, 198, 197, 558, 137, 199, 139, 140,
- /* 1330 */ 15, 565, 89, 90, 573, 110, 385, 206, 148, 389,
- /* 1340 */ 285, 587,
+ /* 0 */ 312, 959, 182, 628, 2, 157, 219, 450, 24, 24,
+ /* 10 */ 24, 24, 221, 26, 26, 26, 26, 27, 27, 28,
+ /* 20 */ 28, 28, 29, 221, 424, 425, 30, 492, 33, 141,
+ /* 30 */ 457, 463, 31, 26, 26, 26, 26, 27, 27, 28,
+ /* 40 */ 28, 28, 29, 221, 28, 28, 28, 29, 221, 23,
+ /* 50 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24,
+ /* 60 */ 24, 24, 293, 26, 26, 26, 26, 27, 27, 28,
+ /* 70 */ 28, 28, 29, 221, 312, 450, 319, 479, 344, 208,
+ /* 80 */ 47, 26, 26, 26, 26, 27, 27, 28, 28, 28,
+ /* 90 */ 29, 221, 427, 428, 163, 339, 543, 368, 371, 372,
+ /* 100 */ 521, 317, 472, 473, 457, 463, 296, 373, 294, 21,
+ /* 110 */ 336, 367, 419, 416, 424, 425, 523, 1, 544, 446,
+ /* 120 */ 80, 424, 425, 23, 22, 32, 465, 466, 464, 464,
+ /* 130 */ 25, 25, 24, 24, 24, 24, 564, 26, 26, 26,
+ /* 140 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 233,
+ /* 150 */ 319, 441, 554, 152, 139, 263, 365, 268, 366, 160,
+ /* 160 */ 551, 352, 332, 421, 222, 272, 362, 322, 218, 557,
+ /* 170 */ 116, 339, 248, 574, 477, 223, 216, 573, 457, 463,
+ /* 180 */ 450, 59, 427, 428, 295, 610, 336, 563, 538, 427,
+ /* 190 */ 428, 385, 608, 609, 562, 446, 87, 23, 22, 32,
+ /* 200 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24,
+ /* 210 */ 447, 26, 26, 26, 26, 27, 27, 28, 28, 28,
+ /* 220 */ 29, 221, 312, 233, 477, 223, 576, 134, 139, 263,
+ /* 230 */ 365, 268, 366, 160, 406, 354, 226, 498, 481, 272,
+ /* 240 */ 339, 27, 27, 28, 28, 28, 29, 221, 450, 442,
+ /* 250 */ 199, 540, 457, 463, 349, 336, 163, 551, 66, 368,
+ /* 260 */ 371, 372, 450, 415, 446, 80, 522, 581, 401, 373,
+ /* 270 */ 452, 23, 22, 32, 465, 466, 464, 464, 25, 25,
+ /* 280 */ 24, 24, 24, 24, 447, 26, 26, 26, 26, 27,
+ /* 290 */ 27, 28, 28, 28, 29, 221, 312, 339, 556, 607,
+ /* 300 */ 197, 454, 454, 454, 546, 578, 352, 198, 607, 440,
+ /* 310 */ 65, 351, 336, 426, 426, 399, 289, 424, 425, 606,
+ /* 320 */ 605, 446, 73, 426, 214, 219, 457, 463, 606, 410,
+ /* 330 */ 450, 241, 306, 196, 565, 479, 555, 208, 288, 29,
+ /* 340 */ 221, 447, 4, 874, 504, 23, 22, 32, 465, 466,
+ /* 350 */ 464, 464, 25, 25, 24, 24, 24, 24, 447, 26,
+ /* 360 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221,
+ /* 370 */ 312, 163, 582, 339, 368, 371, 372, 314, 424, 425,
+ /* 380 */ 604, 222, 397, 227, 373, 427, 428, 339, 336, 409,
+ /* 390 */ 222, 478, 339, 30, 396, 33, 141, 446, 81, 62,
+ /* 400 */ 457, 463, 336, 157, 400, 450, 504, 336, 438, 426,
+ /* 410 */ 500, 446, 87, 41, 380, 613, 446, 80, 581, 23,
+ /* 420 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24,
+ /* 430 */ 24, 24, 213, 26, 26, 26, 26, 27, 27, 28,
+ /* 440 */ 28, 28, 29, 221, 312, 513, 427, 428, 517, 254,
+ /* 450 */ 524, 386, 225, 339, 486, 363, 389, 339, 356, 443,
+ /* 460 */ 494, 236, 30, 497, 33, 141, 399, 289, 336, 495,
+ /* 470 */ 487, 501, 336, 450, 457, 463, 219, 446, 95, 445,
+ /* 480 */ 68, 446, 95, 444, 424, 425, 488, 44, 348, 288,
+ /* 490 */ 504, 424, 425, 23, 22, 32, 465, 466, 464, 464,
+ /* 500 */ 25, 25, 24, 24, 24, 24, 391, 26, 26, 26,
+ /* 510 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 361,
+ /* 520 */ 556, 426, 520, 328, 191, 271, 339, 329, 247, 259,
+ /* 530 */ 339, 566, 65, 249, 336, 426, 424, 425, 445, 516,
+ /* 540 */ 426, 336, 444, 446, 9, 336, 556, 451, 457, 463,
+ /* 550 */ 446, 74, 427, 428, 446, 69, 192, 618, 65, 427,
+ /* 560 */ 428, 426, 323, 277, 16, 202, 189, 23, 22, 32,
+ /* 570 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24,
+ /* 580 */ 255, 26, 26, 26, 26, 27, 27, 28, 28, 28,
+ /* 590 */ 29, 221, 312, 339, 486, 426, 537, 235, 515, 447,
+ /* 600 */ 339, 629, 419, 416, 427, 428, 217, 281, 336, 279,
+ /* 610 */ 487, 203, 144, 526, 527, 336, 391, 446, 78, 429,
+ /* 620 */ 430, 431, 457, 463, 446, 99, 488, 341, 528, 468,
+ /* 630 */ 468, 426, 343, 472, 473, 626, 949, 474, 949, 529,
+ /* 640 */ 447, 23, 22, 32, 465, 466, 464, 464, 25, 25,
+ /* 650 */ 24, 24, 24, 24, 339, 26, 26, 26, 26, 27,
+ /* 660 */ 27, 28, 28, 28, 29, 221, 312, 339, 162, 336,
+ /* 670 */ 275, 283, 476, 376, 339, 579, 527, 346, 446, 98,
+ /* 680 */ 622, 30, 336, 33, 141, 339, 426, 339, 508, 336,
+ /* 690 */ 469, 446, 105, 418, 2, 222, 457, 463, 446, 101,
+ /* 700 */ 336, 219, 336, 426, 161, 626, 948, 290, 948, 446,
+ /* 710 */ 108, 446, 109, 398, 284, 23, 22, 32, 465, 466,
+ /* 720 */ 464, 464, 25, 25, 24, 24, 24, 24, 339, 26,
+ /* 730 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221,
+ /* 740 */ 312, 339, 271, 336, 339, 58, 535, 482, 143, 339,
+ /* 750 */ 622, 318, 446, 133, 408, 257, 336, 426, 321, 336,
+ /* 760 */ 357, 339, 272, 426, 336, 446, 135, 184, 446, 61,
+ /* 770 */ 457, 463, 219, 446, 106, 426, 336, 493, 341, 234,
+ /* 780 */ 468, 468, 621, 310, 407, 446, 102, 209, 144, 23,
+ /* 790 */ 22, 32, 465, 466, 464, 464, 25, 25, 24, 24,
+ /* 800 */ 24, 24, 339, 26, 26, 26, 26, 27, 27, 28,
+ /* 810 */ 28, 28, 29, 221, 312, 339, 271, 336, 339, 341,
+ /* 820 */ 538, 468, 468, 572, 383, 496, 446, 79, 499, 549,
+ /* 830 */ 336, 426, 508, 336, 508, 341, 339, 468, 468, 446,
+ /* 840 */ 103, 391, 446, 70, 457, 463, 572, 426, 40, 426,
+ /* 850 */ 42, 336, 220, 324, 504, 341, 426, 468, 468, 18,
+ /* 860 */ 446, 100, 266, 23, 22, 32, 465, 466, 464, 464,
+ /* 870 */ 25, 25, 24, 24, 24, 24, 339, 26, 26, 26,
+ /* 880 */ 26, 27, 27, 28, 28, 28, 29, 221, 312, 339,
+ /* 890 */ 283, 336, 339, 261, 548, 384, 339, 327, 142, 550,
+ /* 900 */ 446, 136, 475, 475, 336, 426, 185, 336, 499, 396,
+ /* 910 */ 339, 336, 370, 446, 137, 256, 446, 138, 457, 463,
+ /* 920 */ 446, 71, 499, 360, 426, 336, 161, 311, 623, 215,
+ /* 930 */ 426, 359, 237, 412, 446, 82, 200, 23, 34, 32,
+ /* 940 */ 465, 466, 464, 464, 25, 25, 24, 24, 24, 24,
+ /* 950 */ 339, 26, 26, 26, 26, 27, 27, 28, 28, 28,
+ /* 960 */ 29, 221, 312, 447, 271, 336, 339, 271, 340, 210,
+ /* 970 */ 447, 172, 625, 211, 446, 83, 240, 552, 142, 426,
+ /* 980 */ 321, 336, 426, 426, 339, 414, 331, 181, 458, 459,
+ /* 990 */ 446, 72, 457, 463, 470, 506, 67, 158, 394, 336,
+ /* 1000 */ 587, 325, 499, 447, 326, 311, 624, 447, 446, 84,
+ /* 1010 */ 461, 462, 22, 32, 465, 466, 464, 464, 25, 25,
+ /* 1020 */ 24, 24, 24, 24, 339, 26, 26, 26, 26, 27,
+ /* 1030 */ 27, 28, 28, 28, 29, 221, 312, 460, 339, 336,
+ /* 1040 */ 339, 283, 423, 393, 532, 533, 204, 205, 446, 85,
+ /* 1050 */ 625, 392, 547, 336, 162, 336, 426, 426, 339, 435,
+ /* 1060 */ 436, 339, 446, 104, 446, 86, 457, 463, 264, 291,
+ /* 1070 */ 274, 49, 162, 336, 426, 426, 336, 297, 265, 542,
+ /* 1080 */ 541, 405, 446, 88, 594, 446, 89, 32, 465, 466,
+ /* 1090 */ 464, 464, 25, 25, 24, 24, 24, 24, 600, 26,
+ /* 1100 */ 26, 26, 26, 27, 27, 28, 28, 28, 29, 221,
+ /* 1110 */ 36, 345, 339, 3, 214, 8, 422, 335, 425, 437,
+ /* 1120 */ 375, 148, 162, 36, 345, 339, 3, 336, 342, 432,
+ /* 1130 */ 335, 425, 149, 577, 426, 162, 446, 90, 151, 339,
+ /* 1140 */ 336, 342, 434, 339, 283, 433, 333, 347, 447, 446,
+ /* 1150 */ 75, 588, 6, 158, 336, 448, 140, 481, 336, 426,
+ /* 1160 */ 347, 453, 334, 446, 76, 49, 350, 446, 91, 7,
+ /* 1170 */ 481, 426, 397, 283, 355, 250, 426, 39, 38, 251,
+ /* 1180 */ 339, 426, 48, 353, 37, 337, 338, 596, 426, 452,
+ /* 1190 */ 39, 38, 514, 252, 390, 336, 20, 37, 337, 338,
+ /* 1200 */ 253, 43, 452, 206, 446, 92, 219, 449, 242, 243,
+ /* 1210 */ 244, 150, 246, 283, 491, 593, 597, 490, 224, 258,
+ /* 1220 */ 454, 454, 454, 455, 456, 10, 503, 183, 426, 178,
+ /* 1230 */ 156, 301, 426, 454, 454, 454, 455, 456, 10, 339,
+ /* 1240 */ 302, 426, 36, 345, 50, 3, 339, 505, 260, 335,
+ /* 1250 */ 425, 262, 339, 176, 336, 581, 598, 358, 364, 175,
+ /* 1260 */ 342, 336, 177, 446, 93, 46, 345, 336, 3, 339,
+ /* 1270 */ 446, 94, 335, 425, 525, 339, 446, 77, 320, 347,
+ /* 1280 */ 511, 339, 507, 342, 336, 589, 601, 56, 56, 481,
+ /* 1290 */ 336, 512, 283, 446, 17, 531, 336, 426, 530, 446,
+ /* 1300 */ 96, 534, 347, 404, 298, 446, 97, 426, 313, 39,
+ /* 1310 */ 38, 267, 481, 219, 535, 536, 37, 337, 338, 283,
+ /* 1320 */ 620, 452, 309, 283, 111, 19, 288, 509, 269, 424,
+ /* 1330 */ 425, 539, 39, 38, 426, 238, 270, 411, 426, 37,
+ /* 1340 */ 337, 338, 426, 426, 452, 558, 426, 307, 231, 276,
+ /* 1350 */ 278, 426, 454, 454, 454, 455, 456, 10, 553, 280,
+ /* 1360 */ 426, 559, 239, 230, 426, 426, 299, 282, 287, 481,
+ /* 1370 */ 560, 388, 584, 232, 426, 454, 454, 454, 455, 456,
+ /* 1380 */ 10, 561, 426, 426, 585, 395, 426, 426, 292, 194,
+ /* 1390 */ 195, 592, 603, 300, 303, 308, 377, 522, 381, 426,
+ /* 1400 */ 426, 452, 567, 426, 304, 617, 426, 426, 426, 426,
+ /* 1410 */ 379, 53, 147, 165, 166, 167, 580, 212, 569, 426,
+ /* 1420 */ 426, 285, 168, 570, 387, 120, 123, 187, 590, 402,
+ /* 1430 */ 403, 125, 454, 454, 454, 330, 599, 614, 186, 126,
+ /* 1440 */ 127, 128, 615, 616, 57, 60, 619, 107, 229, 64,
+ /* 1450 */ 115, 420, 245, 130, 439, 180, 315, 207, 670, 316,
+ /* 1460 */ 671, 467, 672, 153, 154, 35, 483, 471, 480, 188,
+ /* 1470 */ 201, 155, 484, 5, 485, 489, 12, 502, 45, 11,
+ /* 1480 */ 110, 145, 518, 519, 510, 228, 51, 112, 369, 273,
+ /* 1490 */ 113, 159, 545, 52, 374, 114, 164, 265, 378, 190,
+ /* 1500 */ 146, 568, 117, 158, 286, 382, 169, 119, 15, 583,
+ /* 1510 */ 170, 171, 121, 586, 122, 54, 55, 13, 124, 591,
+ /* 1520 */ 173, 174, 118, 575, 129, 595, 571, 131, 14, 132,
+ /* 1530 */ 611, 63, 612, 193, 602, 179, 305, 413, 417, 960,
+ /* 1540 */ 627,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 16, 139, 140, 141, 168, 21, 144, 23, 69, 70,
- /* 10 */ 71, 72, 176, 74, 75, 76, 77, 78, 79, 80,
- /* 20 */ 81, 82, 83, 84, 78, 79, 42, 43, 73, 74,
- /* 30 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 40 */ 1, 2, 23, 58, 60, 61, 62, 63, 64, 65,
- /* 50 */ 66, 67, 68, 69, 70, 71, 72, 147, 74, 75,
- /* 60 */ 76, 77, 78, 79, 80, 81, 82, 83, 84, 16,
- /* 70 */ 185, 186, 88, 88, 110, 22, 217, 92, 219, 220,
- /* 80 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- /* 90 */ 84, 217, 218, 219, 220, 42, 43, 238, 188, 46,
- /* 100 */ 78, 79, 80, 81, 82, 83, 84, 88, 89, 124,
- /* 110 */ 125, 126, 16, 60, 61, 62, 63, 64, 65, 66,
- /* 120 */ 67, 68, 69, 70, 71, 72, 147, 74, 75, 76,
- /* 130 */ 77, 78, 79, 80, 81, 82, 83, 84, 42, 43,
- /* 140 */ 44, 80, 81, 82, 83, 84, 23, 84, 169, 170,
- /* 150 */ 19, 164, 165, 166, 23, 23, 60, 61, 62, 63,
- /* 160 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 110,
- /* 170 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- /* 180 */ 84, 16, 123, 147, 150, 147, 21, 167, 168, 58,
- /* 190 */ 211, 147, 156, 157, 92, 216, 176, 23, 147, 176,
- /* 200 */ 177, 78, 79, 165, 166, 103, 183, 42, 43, 78,
- /* 210 */ 79, 88, 89, 169, 170, 228, 180, 181, 169, 88,
- /* 220 */ 88, 98, 99, 92, 16, 60, 61, 62, 63, 64,
- /* 230 */ 65, 66, 67, 68, 69, 70, 71, 72, 147, 74,
- /* 240 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 250 */ 42, 43, 78, 209, 210, 124, 125, 126, 224, 208,
- /* 260 */ 169, 170, 88, 89, 230, 227, 228, 16, 60, 61,
- /* 270 */ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
- /* 280 */ 72, 23, 74, 75, 76, 77, 78, 79, 80, 81,
- /* 290 */ 82, 83, 84, 42, 43, 160, 16, 147, 161, 83,
- /* 300 */ 84, 210, 161, 153, 169, 158, 156, 157, 161, 162,
- /* 310 */ 163, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- /* 320 */ 69, 70, 71, 72, 161, 74, 75, 76, 77, 78,
- /* 330 */ 79, 80, 81, 82, 83, 84, 192, 200, 147, 131,
- /* 340 */ 16, 200, 16, 199, 20, 169, 88, 89, 90, 185,
- /* 350 */ 186, 93, 94, 95, 217, 22, 219, 220, 147, 147,
- /* 360 */ 169, 170, 104, 200, 84, 147, 42, 43, 156, 157,
- /* 370 */ 90, 91, 92, 93, 94, 95, 96, 164, 165, 166,
- /* 380 */ 169, 170, 131, 103, 60, 61, 62, 63, 64, 65,
- /* 390 */ 66, 67, 68, 69, 70, 71, 72, 155, 74, 75,
- /* 400 */ 76, 77, 78, 79, 80, 81, 82, 83, 84, 16,
- /* 410 */ 84, 11, 221, 20, 30, 16, 147, 91, 92, 93,
- /* 420 */ 94, 95, 96, 90, 147, 181, 93, 94, 95, 103,
- /* 430 */ 212, 189, 155, 27, 50, 42, 43, 104, 169, 170,
- /* 440 */ 34, 228, 43, 201, 202, 181, 169, 170, 206, 49,
- /* 450 */ 161, 162, 163, 60, 61, 62, 63, 64, 65, 66,
- /* 460 */ 67, 68, 69, 70, 71, 72, 189, 74, 75, 76,
- /* 470 */ 77, 78, 79, 80, 81, 82, 83, 84, 16, 25,
- /* 480 */ 211, 147, 20, 29, 12, 147, 102, 19, 211, 21,
- /* 490 */ 147, 141, 147, 216, 144, 41, 24, 98, 20, 99,
- /* 500 */ 100, 101, 103, 165, 42, 43, 0, 1, 2, 37,
- /* 510 */ 110, 39, 169, 170, 169, 170, 182, 19, 20, 190,
- /* 520 */ 22, 49, 60, 61, 62, 63, 64, 65, 66, 67,
- /* 530 */ 68, 69, 70, 71, 72, 155, 74, 75, 76, 77,
- /* 540 */ 78, 79, 80, 81, 82, 83, 84, 16, 147, 90,
- /* 550 */ 20, 20, 93, 94, 95, 147, 155, 59, 215, 225,
- /* 560 */ 215, 20, 130, 104, 132, 227, 228, 42, 43, 189,
- /* 570 */ 169, 170, 16, 42, 43, 20, 19, 22, 19, 20,
- /* 580 */ 23, 22, 18, 147, 106, 147, 108, 109, 63, 64,
- /* 590 */ 189, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- /* 600 */ 69, 70, 71, 72, 147, 74, 75, 76, 77, 78,
- /* 610 */ 79, 80, 81, 82, 83, 84, 16, 92, 59, 55,
- /* 620 */ 212, 21, 147, 19, 147, 23, 188, 23, 12, 217,
- /* 630 */ 23, 219, 220, 7, 8, 9, 106, 186, 108, 109,
- /* 640 */ 24, 147, 42, 43, 208, 88, 89, 106, 92, 108,
- /* 650 */ 109, 244, 245, 37, 147, 39, 147, 182, 94, 16,
- /* 660 */ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- /* 670 */ 70, 71, 72, 145, 74, 75, 76, 77, 78, 79,
- /* 680 */ 80, 81, 82, 83, 84, 42, 43, 80, 142, 143,
- /* 690 */ 88, 89, 88, 89, 148, 88, 89, 133, 14, 147,
- /* 700 */ 225, 155, 16, 60, 61, 62, 63, 64, 65, 66,
- /* 710 */ 67, 68, 69, 70, 71, 72, 114, 74, 75, 76,
- /* 720 */ 77, 78, 79, 80, 81, 82, 83, 84, 42, 43,
- /* 730 */ 201, 202, 147, 147, 182, 189, 52, 147, 54, 147,
- /* 740 */ 147, 147, 147, 147, 155, 16, 60, 61, 62, 63,
- /* 750 */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 213,
- /* 760 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- /* 770 */ 84, 42, 43, 188, 188, 182, 182, 225, 189, 106,
- /* 780 */ 188, 108, 109, 188, 99, 100, 101, 241, 16, 155,
- /* 790 */ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- /* 800 */ 71, 72, 213, 74, 75, 76, 77, 78, 79, 80,
- /* 810 */ 81, 82, 83, 84, 42, 43, 23, 133, 225, 225,
- /* 820 */ 21, 225, 23, 189, 239, 236, 99, 100, 101, 22,
- /* 830 */ 242, 243, 155, 191, 62, 63, 64, 65, 66, 67,
- /* 840 */ 68, 69, 70, 71, 72, 147, 74, 75, 76, 77,
- /* 850 */ 78, 79, 80, 81, 82, 83, 84, 16, 17, 22,
- /* 860 */ 19, 147, 147, 147, 23, 147, 189, 169, 170, 147,
- /* 870 */ 14, 147, 31, 16, 17, 147, 19, 147, 19, 43,
- /* 880 */ 23, 88, 89, 169, 170, 169, 170, 88, 31, 48,
- /* 890 */ 147, 169, 170, 169, 170, 147, 89, 169, 170, 58,
- /* 900 */ 147, 147, 147, 188, 147, 48, 188, 114, 52, 147,
- /* 910 */ 54, 19, 147, 124, 125, 58, 147, 169, 170, 78,
- /* 920 */ 79, 114, 169, 170, 169, 170, 169, 170, 87, 88,
- /* 930 */ 89, 169, 170, 92, 98, 78, 79, 80, 169, 170,
- /* 940 */ 91, 147, 188, 22, 87, 88, 89, 16, 17, 92,
- /* 950 */ 19, 110, 147, 155, 23, 147, 155, 22, 121, 110,
- /* 960 */ 68, 80, 31, 169, 170, 124, 125, 126, 127, 128,
- /* 970 */ 129, 112, 123, 208, 169, 170, 107, 169, 170, 48,
- /* 980 */ 111, 124, 125, 126, 127, 128, 129, 189, 107, 58,
- /* 990 */ 189, 5, 111, 147, 7, 8, 10, 11, 12, 13,
- /* 1000 */ 161, 20, 147, 22, 178, 147, 91, 92, 147, 78,
- /* 1010 */ 79, 147, 26, 19, 28, 169, 170, 23, 87, 88,
- /* 1020 */ 89, 35, 147, 92, 169, 170, 147, 169, 170, 147,
- /* 1030 */ 169, 170, 97, 47, 113, 49, 20, 203, 22, 53,
- /* 1040 */ 147, 147, 56, 147, 169, 170, 147, 147, 147, 20,
- /* 1050 */ 147, 169, 170, 147, 147, 124, 125, 126, 127, 128,
- /* 1060 */ 129, 147, 169, 170, 178, 169, 170, 147, 169, 170,
- /* 1070 */ 169, 170, 169, 170, 147, 169, 170, 147, 20, 147,
- /* 1080 */ 22, 147, 88, 147, 147, 99, 100, 101, 59, 169,
- /* 1090 */ 170, 105, 147, 20, 147, 22, 110, 178, 147, 169,
- /* 1100 */ 170, 169, 170, 169, 170, 169, 170, 20, 147, 22,
- /* 1110 */ 147, 20, 147, 22, 169, 170, 169, 170, 147, 147,
- /* 1120 */ 134, 20, 147, 22, 20, 147, 22, 147, 20, 232,
- /* 1130 */ 22, 233, 169, 170, 169, 170, 147, 147, 147, 147,
- /* 1140 */ 169, 170, 147, 147, 169, 170, 147, 169, 170, 169,
- /* 1150 */ 170, 147, 147, 147, 147, 147, 147, 191, 161, 149,
- /* 1160 */ 193, 177, 229, 223, 161, 172, 6, 229, 194, 146,
- /* 1170 */ 172, 194, 172, 172, 172, 161, 146, 146, 146, 22,
- /* 1180 */ 154, 121, 194, 118, 173, 119, 116, 120, 112, 130,
- /* 1190 */ 222, 152, 152, 98, 115, 98, 171, 97, 171, 40,
- /* 1200 */ 179, 189, 19, 84, 171, 226, 171, 173, 195, 226,
- /* 1210 */ 174, 196, 171, 171, 197, 171, 198, 179, 15, 174,
- /* 1220 */ 151, 60, 151, 204, 152, 205, 204, 152, 151, 205,
- /* 1230 */ 152, 38, 152, 130, 151, 184, 152, 184, 19, 15,
- /* 1240 */ 194, 152, 187, 187, 187, 152, 194, 184, 187, 33,
- /* 1250 */ 152, 152, 137, 159, 1, 20, 175, 214, 112, 112,
- /* 1260 */ 175, 214, 234, 112, 112, 92, 19, 11, 20, 107,
- /* 1270 */ 20, 19, 235, 19, 32, 20, 112, 114, 20, 22,
- /* 1280 */ 20, 22, 117, 22, 117, 237, 237, 19, 44, 20,
- /* 1290 */ 240, 20, 20, 231, 19, 44, 19, 243, 20, 19,
- /* 1300 */ 19, 19, 96, 103, 16, 21, 44, 17, 98, 36,
- /* 1310 */ 246, 45, 45, 22, 51, 133, 98, 19, 5, 1,
- /* 1320 */ 122, 19, 102, 14, 113, 17, 113, 115, 102, 122,
- /* 1330 */ 19, 123, 68, 68, 20, 14, 57, 135, 19, 3,
- /* 1340 */ 136, 4,
+ /* 0 */ 19, 142, 143, 144, 145, 24, 115, 26, 77, 78,
+ /* 10 */ 79, 80, 92, 82, 83, 84, 85, 86, 87, 88,
+ /* 20 */ 89, 90, 91, 92, 26, 27, 222, 223, 224, 225,
+ /* 30 */ 49, 50, 81, 82, 83, 84, 85, 86, 87, 88,
+ /* 40 */ 89, 90, 91, 92, 88, 89, 90, 91, 92, 68,
+ /* 50 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ /* 60 */ 79, 80, 16, 82, 83, 84, 85, 86, 87, 88,
+ /* 70 */ 89, 90, 91, 92, 19, 94, 19, 166, 167, 168,
+ /* 80 */ 25, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ /* 90 */ 91, 92, 94, 95, 96, 150, 36, 99, 100, 101,
+ /* 100 */ 174, 169, 170, 171, 49, 50, 60, 109, 62, 54,
+ /* 110 */ 165, 51, 1, 2, 26, 27, 174, 22, 58, 174,
+ /* 120 */ 175, 26, 27, 68, 69, 70, 71, 72, 73, 74,
+ /* 130 */ 75, 76, 77, 78, 79, 80, 186, 82, 83, 84,
+ /* 140 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 92,
+ /* 150 */ 19, 172, 173, 96, 97, 98, 99, 100, 101, 102,
+ /* 160 */ 181, 216, 146, 147, 232, 108, 221, 107, 152, 186,
+ /* 170 */ 154, 150, 195, 30, 86, 87, 160, 34, 49, 50,
+ /* 180 */ 26, 52, 94, 95, 138, 97, 165, 181, 182, 94,
+ /* 190 */ 95, 48, 104, 105, 188, 174, 175, 68, 69, 70,
+ /* 200 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ /* 210 */ 194, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ /* 220 */ 91, 92, 19, 92, 86, 87, 21, 24, 97, 98,
+ /* 230 */ 99, 100, 101, 102, 218, 214, 215, 208, 66, 108,
+ /* 240 */ 150, 86, 87, 88, 89, 90, 91, 92, 94, 173,
+ /* 250 */ 160, 183, 49, 50, 191, 165, 96, 181, 22, 99,
+ /* 260 */ 100, 101, 26, 247, 174, 175, 94, 57, 63, 109,
+ /* 270 */ 98, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ /* 280 */ 77, 78, 79, 80, 194, 82, 83, 84, 85, 86,
+ /* 290 */ 87, 88, 89, 90, 91, 92, 19, 150, 150, 150,
+ /* 300 */ 25, 129, 130, 131, 183, 100, 216, 160, 150, 161,
+ /* 310 */ 162, 221, 165, 165, 165, 105, 106, 26, 27, 170,
+ /* 320 */ 171, 174, 175, 165, 160, 115, 49, 50, 170, 171,
+ /* 330 */ 94, 148, 163, 185, 186, 166, 167, 168, 128, 91,
+ /* 340 */ 92, 194, 196, 138, 166, 68, 69, 70, 71, 72,
+ /* 350 */ 73, 74, 75, 76, 77, 78, 79, 80, 194, 82,
+ /* 360 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ /* 370 */ 19, 96, 11, 150, 99, 100, 101, 155, 26, 27,
+ /* 380 */ 231, 232, 218, 205, 109, 94, 95, 150, 165, 231,
+ /* 390 */ 232, 166, 150, 222, 150, 224, 225, 174, 175, 235,
+ /* 400 */ 49, 50, 165, 24, 240, 26, 166, 165, 153, 165,
+ /* 410 */ 119, 174, 175, 136, 237, 244, 174, 175, 57, 68,
+ /* 420 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ /* 430 */ 79, 80, 236, 82, 83, 84, 85, 86, 87, 88,
+ /* 440 */ 89, 90, 91, 92, 19, 205, 94, 95, 23, 226,
+ /* 450 */ 165, 229, 215, 150, 12, 88, 234, 150, 216, 174,
+ /* 460 */ 32, 217, 222, 25, 224, 225, 105, 106, 165, 41,
+ /* 470 */ 28, 119, 165, 94, 49, 50, 115, 174, 175, 112,
+ /* 480 */ 22, 174, 175, 116, 26, 27, 44, 136, 46, 128,
+ /* 490 */ 166, 26, 27, 68, 69, 70, 71, 72, 73, 74,
+ /* 500 */ 75, 76, 77, 78, 79, 80, 150, 82, 83, 84,
+ /* 510 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 150,
+ /* 520 */ 150, 165, 23, 220, 196, 150, 150, 220, 158, 205,
+ /* 530 */ 150, 161, 162, 198, 165, 165, 26, 27, 112, 23,
+ /* 540 */ 165, 165, 116, 174, 175, 165, 150, 166, 49, 50,
+ /* 550 */ 174, 175, 94, 95, 174, 175, 118, 161, 162, 94,
+ /* 560 */ 95, 165, 187, 16, 22, 160, 24, 68, 69, 70,
+ /* 570 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ /* 580 */ 150, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ /* 590 */ 91, 92, 19, 150, 12, 165, 23, 241, 88, 194,
+ /* 600 */ 150, 0, 1, 2, 94, 95, 160, 60, 165, 62,
+ /* 610 */ 28, 206, 207, 190, 191, 165, 150, 174, 175, 7,
+ /* 620 */ 8, 9, 49, 50, 174, 175, 44, 111, 46, 113,
+ /* 630 */ 114, 165, 169, 170, 171, 22, 23, 233, 25, 57,
+ /* 640 */ 194, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ /* 650 */ 77, 78, 79, 80, 150, 82, 83, 84, 85, 86,
+ /* 660 */ 87, 88, 89, 90, 91, 92, 19, 150, 25, 165,
+ /* 670 */ 23, 150, 233, 19, 150, 190, 191, 228, 174, 175,
+ /* 680 */ 67, 222, 165, 224, 225, 150, 165, 150, 150, 165,
+ /* 690 */ 23, 174, 175, 144, 145, 232, 49, 50, 174, 175,
+ /* 700 */ 165, 115, 165, 165, 50, 22, 23, 241, 25, 174,
+ /* 710 */ 175, 174, 175, 127, 193, 68, 69, 70, 71, 72,
+ /* 720 */ 73, 74, 75, 76, 77, 78, 79, 80, 150, 82,
+ /* 730 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ /* 740 */ 19, 150, 150, 165, 150, 24, 103, 23, 150, 150,
+ /* 750 */ 67, 213, 174, 175, 97, 209, 165, 165, 104, 165,
+ /* 760 */ 150, 150, 108, 165, 165, 174, 175, 23, 174, 175,
+ /* 770 */ 49, 50, 115, 174, 175, 165, 165, 177, 111, 187,
+ /* 780 */ 113, 114, 250, 251, 127, 174, 175, 206, 207, 68,
+ /* 790 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ /* 800 */ 79, 80, 150, 82, 83, 84, 85, 86, 87, 88,
+ /* 810 */ 89, 90, 91, 92, 19, 150, 150, 165, 150, 111,
+ /* 820 */ 182, 113, 114, 105, 106, 177, 174, 175, 25, 166,
+ /* 830 */ 165, 165, 150, 165, 150, 111, 150, 113, 114, 174,
+ /* 840 */ 175, 150, 174, 175, 49, 50, 128, 165, 135, 165,
+ /* 850 */ 137, 165, 197, 187, 166, 111, 165, 113, 114, 204,
+ /* 860 */ 174, 175, 177, 68, 69, 70, 71, 72, 73, 74,
+ /* 870 */ 75, 76, 77, 78, 79, 80, 150, 82, 83, 84,
+ /* 880 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 150,
+ /* 890 */ 150, 165, 150, 205, 177, 213, 150, 213, 95, 177,
+ /* 900 */ 174, 175, 129, 130, 165, 165, 23, 165, 25, 150,
+ /* 910 */ 150, 165, 178, 174, 175, 150, 174, 175, 49, 50,
+ /* 920 */ 174, 175, 119, 19, 165, 165, 50, 22, 23, 160,
+ /* 930 */ 165, 27, 241, 193, 174, 175, 160, 68, 69, 70,
+ /* 940 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ /* 950 */ 150, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ /* 960 */ 91, 92, 19, 194, 150, 165, 150, 150, 150, 160,
+ /* 970 */ 194, 25, 67, 160, 174, 175, 217, 166, 95, 165,
+ /* 980 */ 104, 165, 165, 165, 150, 245, 248, 249, 49, 50,
+ /* 990 */ 174, 175, 49, 50, 23, 23, 25, 25, 242, 165,
+ /* 1000 */ 199, 187, 119, 194, 187, 22, 23, 194, 174, 175,
+ /* 1010 */ 71, 72, 69, 70, 71, 72, 73, 74, 75, 76,
+ /* 1020 */ 77, 78, 79, 80, 150, 82, 83, 84, 85, 86,
+ /* 1030 */ 87, 88, 89, 90, 91, 92, 19, 98, 150, 165,
+ /* 1040 */ 150, 150, 150, 19, 7, 8, 105, 106, 174, 175,
+ /* 1050 */ 67, 27, 23, 165, 25, 165, 165, 165, 150, 150,
+ /* 1060 */ 150, 150, 174, 175, 174, 175, 49, 50, 98, 242,
+ /* 1070 */ 23, 125, 25, 165, 165, 165, 165, 209, 108, 97,
+ /* 1080 */ 98, 209, 174, 175, 193, 174, 175, 70, 71, 72,
+ /* 1090 */ 73, 74, 75, 76, 77, 78, 79, 80, 199, 82,
+ /* 1100 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ /* 1110 */ 19, 20, 150, 22, 160, 22, 149, 26, 27, 150,
+ /* 1120 */ 23, 6, 25, 19, 20, 150, 22, 165, 37, 149,
+ /* 1130 */ 26, 27, 151, 23, 165, 25, 174, 175, 151, 150,
+ /* 1140 */ 165, 37, 13, 150, 150, 149, 149, 56, 194, 174,
+ /* 1150 */ 175, 23, 25, 25, 165, 194, 150, 66, 165, 165,
+ /* 1160 */ 56, 150, 159, 174, 175, 125, 150, 174, 175, 76,
+ /* 1170 */ 66, 165, 218, 150, 122, 199, 165, 86, 87, 200,
+ /* 1180 */ 150, 165, 123, 121, 93, 94, 95, 193, 165, 98,
+ /* 1190 */ 86, 87, 88, 201, 240, 165, 124, 93, 94, 95,
+ /* 1200 */ 202, 135, 98, 5, 174, 175, 115, 203, 10, 11,
+ /* 1210 */ 12, 13, 14, 150, 157, 17, 193, 150, 227, 210,
+ /* 1220 */ 129, 130, 131, 132, 133, 134, 150, 157, 165, 31,
+ /* 1230 */ 117, 33, 165, 129, 130, 131, 132, 133, 134, 150,
+ /* 1240 */ 42, 165, 19, 20, 104, 22, 150, 211, 210, 26,
+ /* 1250 */ 27, 210, 150, 55, 165, 57, 193, 120, 104, 61,
+ /* 1260 */ 37, 165, 64, 174, 175, 19, 20, 165, 22, 150,
+ /* 1270 */ 174, 175, 26, 27, 176, 150, 174, 175, 47, 56,
+ /* 1280 */ 211, 150, 150, 37, 165, 23, 23, 25, 25, 66,
+ /* 1290 */ 165, 211, 150, 174, 175, 184, 165, 165, 176, 174,
+ /* 1300 */ 175, 178, 56, 105, 106, 174, 175, 165, 110, 86,
+ /* 1310 */ 87, 176, 66, 115, 103, 176, 93, 94, 95, 150,
+ /* 1320 */ 23, 98, 25, 150, 22, 22, 128, 150, 150, 26,
+ /* 1330 */ 27, 150, 86, 87, 165, 193, 150, 139, 165, 93,
+ /* 1340 */ 94, 95, 165, 165, 98, 150, 165, 179, 92, 150,
+ /* 1350 */ 150, 165, 129, 130, 131, 132, 133, 134, 184, 150,
+ /* 1360 */ 165, 176, 193, 230, 165, 165, 193, 150, 150, 66,
+ /* 1370 */ 176, 150, 150, 230, 165, 129, 130, 131, 132, 133,
+ /* 1380 */ 134, 176, 165, 165, 150, 150, 165, 165, 150, 86,
+ /* 1390 */ 87, 150, 150, 150, 150, 179, 18, 94, 45, 165,
+ /* 1400 */ 165, 98, 157, 165, 150, 150, 165, 165, 165, 165,
+ /* 1410 */ 157, 135, 68, 156, 156, 156, 189, 157, 157, 165,
+ /* 1420 */ 165, 238, 156, 239, 157, 189, 22, 219, 199, 157,
+ /* 1430 */ 18, 192, 129, 130, 131, 157, 199, 40, 219, 192,
+ /* 1440 */ 192, 192, 157, 157, 243, 243, 38, 164, 180, 246,
+ /* 1450 */ 180, 1, 15, 189, 23, 249, 252, 22, 117, 252,
+ /* 1460 */ 117, 112, 117, 117, 117, 22, 11, 23, 23, 22,
+ /* 1470 */ 22, 25, 23, 35, 23, 23, 35, 119, 25, 25,
+ /* 1480 */ 22, 117, 23, 23, 27, 52, 22, 22, 52, 23,
+ /* 1490 */ 22, 35, 29, 22, 52, 22, 102, 108, 19, 24,
+ /* 1500 */ 39, 20, 104, 25, 138, 43, 104, 22, 5, 1,
+ /* 1510 */ 117, 35, 107, 27, 126, 76, 76, 22, 118, 1,
+ /* 1520 */ 16, 120, 53, 53, 118, 20, 59, 107, 22, 126,
+ /* 1530 */ 23, 16, 23, 22, 127, 15, 140, 65, 3, 253,
+ /* 1540 */ 4,
};
-#define YY_SHIFT_USE_DFLT (-62)
-#define YY_SHIFT_MAX 389
+#define YY_SHIFT_USE_DFLT (-110)
+#define YY_SHIFT_MAX 417
static const short yy_shift_ofst[] = {
- /* 0 */ 39, 841, 986, -16, 841, 931, 931, 258, 123, -36,
- /* 10 */ 96, 931, 931, 931, 931, 931, -45, 400, 174, 19,
- /* 20 */ 132, -54, -54, 53, 165, 208, 251, 324, 393, 462,
- /* 30 */ 531, 600, 643, 686, 643, 643, 643, 643, 643, 643,
- /* 40 */ 643, 643, 643, 643, 643, 643, 643, 643, 643, 643,
- /* 50 */ 643, 643, 729, 772, 772, 857, 931, 931, 931, 931,
- /* 60 */ 931, 931, 931, 931, 931, 931, 931, 931, 931, 931,
- /* 70 */ 931, 931, 931, 931, 931, 931, 931, 931, 931, 931,
- /* 80 */ 931, 931, 931, 931, 931, 931, 931, 931, 931, 931,
- /* 90 */ 931, 931, 931, 931, 931, 931, -61, -61, 6, 6,
- /* 100 */ 280, 22, 61, 399, 564, 19, 19, 19, 19, 19,
- /* 110 */ 19, 19, 216, 132, 63, -62, -62, -62, 131, 326,
- /* 120 */ 472, 472, 498, 559, 506, 799, 19, 799, 19, 19,
- /* 130 */ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- /* 140 */ 19, 849, 59, -36, -36, -36, -62, -62, -62, -15,
- /* 150 */ -15, 333, 459, 478, 557, 530, 541, 616, 602, 793,
- /* 160 */ 604, 607, 626, 19, 19, 881, 19, 19, 994, 19,
- /* 170 */ 19, 807, 19, 19, 673, 807, 19, 19, 384, 384,
- /* 180 */ 384, 19, 19, 673, 19, 19, 673, 19, 454, 685,
- /* 190 */ 19, 19, 673, 19, 19, 19, 673, 19, 19, 19,
- /* 200 */ 673, 673, 19, 19, 19, 19, 19, 468, 869, 921,
- /* 210 */ 132, 789, 789, 432, 406, 406, 406, 836, 406, 132,
- /* 220 */ 406, 132, 935, 837, 837, 1160, 1160, 1160, 1160, 1157,
- /* 230 */ -36, 1060, 1065, 1066, 1070, 1067, 1059, 1076, 1076, 1095,
- /* 240 */ 1079, 1095, 1079, 1097, 1097, 1159, 1097, 1100, 1097, 1183,
- /* 250 */ 1119, 1119, 1159, 1097, 1097, 1097, 1183, 1203, 1076, 1203,
- /* 260 */ 1076, 1203, 1076, 1076, 1193, 1103, 1203, 1076, 1161, 1161,
- /* 270 */ 1219, 1060, 1076, 1224, 1224, 1224, 1224, 1060, 1161, 1219,
- /* 280 */ 1076, 1216, 1216, 1076, 1076, 1115, -62, -62, -62, -62,
- /* 290 */ -62, -62, 525, 684, 727, 856, 859, 556, 555, 981,
- /* 300 */ 102, 987, 915, 1016, 1058, 1073, 1087, 1091, 1101, 1104,
- /* 310 */ 892, 1108, 1029, 1253, 1235, 1146, 1147, 1151, 1152, 1173,
- /* 320 */ 1162, 1247, 1248, 1250, 1252, 1256, 1254, 1255, 1257, 1258,
- /* 330 */ 1260, 1259, 1165, 1261, 1167, 1259, 1163, 1268, 1269, 1164,
- /* 340 */ 1271, 1272, 1242, 1244, 1275, 1251, 1277, 1278, 1280, 1281,
- /* 350 */ 1262, 1282, 1206, 1200, 1288, 1290, 1284, 1210, 1273, 1263,
- /* 360 */ 1266, 1291, 1267, 1182, 1218, 1298, 1313, 1318, 1220, 1264,
- /* 370 */ 1265, 1198, 1302, 1211, 1309, 1212, 1308, 1213, 1226, 1207,
- /* 380 */ 1311, 1208, 1314, 1321, 1279, 1202, 1204, 1319, 1336, 1337,
+ /* 0 */ 111, 1091, 1198, 1091, 1223, 1223, -2, 88, 88, -19,
+ /* 10 */ 1223, 1223, 1223, 1223, 1223, 210, 465, 129, 1104, 1223,
+ /* 20 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ /* 30 */ 1223, 1223, 1246, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ /* 40 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ /* 50 */ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ /* 60 */ 1223, -49, 361, 465, 465, 154, 138, 138, -109, 55,
+ /* 70 */ 203, 277, 351, 425, 499, 573, 647, 721, 795, 869,
+ /* 80 */ 795, 795, 795, 795, 795, 795, 795, 795, 795, 795,
+ /* 90 */ 795, 795, 795, 795, 795, 795, 795, 795, 943, 1017,
+ /* 100 */ 1017, -69, -69, -69, -69, -1, -1, 57, 155, -44,
+ /* 110 */ 465, 465, 465, 465, 465, 654, 205, 465, 465, 465,
+ /* 120 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
+ /* 130 */ 465, 465, 465, 248, 154, -80, -110, -110, -110, 1303,
+ /* 140 */ 131, 95, 291, 352, 458, 510, 582, 582, 465, 465,
+ /* 150 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
+ /* 160 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
+ /* 170 */ 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
+ /* 180 */ 613, 683, 601, 379, 379, 379, 657, 586, -109, -109,
+ /* 190 */ -109, -110, -110, -110, 172, 172, 275, 160, 516, 667,
+ /* 200 */ 724, 442, 744, 883, 60, 60, 612, 367, 236, 803,
+ /* 210 */ 708, 708, 143, 718, 708, 708, 708, 708, 542, 426,
+ /* 220 */ 438, 154, 773, 773, 713, 428, 428, 904, 428, 876,
+ /* 230 */ 428, 154, 428, 154, 643, 1024, 946, 1024, 904, 904,
+ /* 240 */ 946, 1115, 1115, 1115, 1115, 1129, 1129, 1127, -109, 1040,
+ /* 250 */ 1052, 1059, 1062, 1072, 1066, 1113, 1113, 1140, 1137, 1140,
+ /* 260 */ 1137, 1140, 1137, 1154, 1154, 1231, 1154, 1211, 1154, 1302,
+ /* 270 */ 1256, 1256, 1231, 1154, 1154, 1154, 1302, 1378, 1113, 1378,
+ /* 280 */ 1113, 1378, 1113, 1113, 1353, 1276, 1378, 1113, 1344, 1344,
+ /* 290 */ 1404, 1040, 1113, 1412, 1412, 1412, 1412, 1040, 1344, 1404,
+ /* 300 */ 1113, 1397, 1397, 1113, 1113, 1408, -110, -110, -110, -110,
+ /* 310 */ -110, -110, 939, 46, 547, 905, 983, 971, 972, 970,
+ /* 320 */ 1037, 941, 982, 1029, 1047, 1097, 1110, 1128, 1262, 1263,
+ /* 330 */ 1093, 1297, 1450, 1437, 1431, 1435, 1341, 1343, 1345, 1346,
+ /* 340 */ 1347, 1349, 1443, 1444, 1445, 1447, 1455, 1448, 1449, 1446,
+ /* 350 */ 1451, 1452, 1453, 1438, 1454, 1441, 1453, 1358, 1458, 1456,
+ /* 360 */ 1457, 1364, 1459, 1460, 1461, 1433, 1464, 1463, 1436, 1465,
+ /* 370 */ 1466, 1468, 1471, 1442, 1473, 1394, 1389, 1479, 1481, 1475,
+ /* 380 */ 1398, 1462, 1467, 1469, 1478, 1470, 1366, 1402, 1485, 1503,
+ /* 390 */ 1508, 1393, 1476, 1486, 1405, 1439, 1440, 1388, 1495, 1400,
+ /* 400 */ 1518, 1504, 1401, 1505, 1406, 1420, 1403, 1506, 1407, 1507,
+ /* 410 */ 1509, 1515, 1472, 1520, 1396, 1511, 1535, 1536,
};
-#define YY_REDUCE_USE_DFLT (-165)
-#define YY_REDUCE_MAX 291
+#define YY_REDUCE_USE_DFLT (-197)
+#define YY_REDUCE_MAX 311
static const short yy_reduce_ofst[] = {
- /* 0 */ -138, 277, 546, 137, 401, -21, 44, 36, 38, 242,
- /* 10 */ -141, 191, 91, 269, 343, 345, -126, 589, 338, 150,
- /* 20 */ 147, -13, 213, 412, 412, 412, 412, 412, 412, 412,
- /* 30 */ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
- /* 40 */ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
- /* 50 */ 412, 412, 412, 412, 412, 211, 698, 714, 716, 722,
- /* 60 */ 724, 728, 748, 753, 755, 757, 762, 769, 794, 805,
- /* 70 */ 808, 846, 855, 858, 861, 875, 882, 893, 896, 899,
- /* 80 */ 901, 903, 906, 920, 930, 932, 934, 936, 945, 947,
- /* 90 */ 963, 965, 971, 975, 978, 980, 412, 412, 412, 412,
- /* 100 */ 20, 412, 412, 23, 34, 334, 475, 552, 593, 594,
- /* 110 */ 585, 212, 412, 289, 412, 412, 412, 412, 135, -164,
- /* 120 */ -115, 164, 407, 407, 350, 141, 51, 163, 596, -90,
- /* 130 */ 436, 218, 765, 438, 586, 592, 595, 715, 718, 408,
- /* 140 */ 754, 380, 634, 677, 798, 801, 144, 529, 588, 49,
- /* 150 */ 176, 244, 264, 329, 457, 329, 329, 451, 477, 494,
- /* 160 */ 507, 509, 528, 590, 730, 642, 509, 743, 839, 864,
- /* 170 */ 879, 834, 894, 900, 329, 834, 907, 914, 826, 886,
- /* 180 */ 919, 927, 937, 329, 951, 961, 329, 972, 897, 898,
- /* 190 */ 989, 990, 329, 991, 992, 995, 329, 996, 999, 1004,
- /* 200 */ 329, 329, 1005, 1006, 1007, 1008, 1009, 1010, 966, 967,
- /* 210 */ 997, 933, 938, 940, 993, 998, 1000, 984, 1001, 1003,
- /* 220 */ 1002, 1014, 1011, 974, 977, 1023, 1030, 1031, 1032, 1026,
- /* 230 */ 1012, 988, 1013, 1015, 1017, 1018, 968, 1039, 1040, 1019,
- /* 240 */ 1020, 1022, 1024, 1025, 1027, 1021, 1033, 1034, 1035, 1036,
- /* 250 */ 979, 983, 1038, 1041, 1042, 1044, 1045, 1069, 1072, 1071,
- /* 260 */ 1075, 1077, 1078, 1080, 1028, 1037, 1083, 1084, 1051, 1053,
- /* 270 */ 1043, 1046, 1089, 1055, 1056, 1057, 1061, 1052, 1063, 1047,
- /* 280 */ 1093, 1048, 1049, 1098, 1099, 1050, 1094, 1081, 1085, 1062,
- /* 290 */ 1054, 1064,
+ /* 0 */ -141, 90, 16, 147, -55, 21, 148, 149, 158, 240,
+ /* 10 */ 223, 237, 242, 303, 307, 164, 370, 171, 369, 376,
+ /* 20 */ 380, 443, 450, 504, 517, 524, 535, 537, 578, 591,
+ /* 30 */ 594, 599, 611, 652, 665, 668, 686, 726, 739, 742,
+ /* 40 */ 746, 760, 800, 816, 834, 874, 888, 890, 908, 911,
+ /* 50 */ 962, 975, 989, 993, 1030, 1089, 1096, 1102, 1119, 1125,
+ /* 60 */ 1131, -196, 954, 740, 396, 169, -68, 463, 405, 459,
+ /* 70 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459,
+ /* 80 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459,
+ /* 90 */ 459, 459, 459, 459, 459, 459, 459, 459, 459, 459,
+ /* 100 */ 459, 459, 459, 459, 459, 459, 459, -21, 459, 459,
+ /* 110 */ 538, 375, 592, 666, 814, 6, 222, 521, 682, 817,
+ /* 120 */ 356, 244, 466, 684, 691, 891, 994, 1023, 1063, 1142,
+ /* 130 */ 1169, 759, 1173, 459, -89, 459, 459, 459, 459, 285,
+ /* 140 */ 76, 430, 598, 610, 765, 818, 423, 485, 892, 909,
+ /* 150 */ 910, 969, 1006, 818, 1011, 1016, 1067, 1076, 1132, 1177,
+ /* 160 */ 1178, 1181, 1186, 1195, 1199, 1200, 1209, 1217, 1218, 1221,
+ /* 170 */ 1222, 1234, 1235, 1238, 1241, 1242, 1243, 1244, 1254, 1255,
+ /* 180 */ 532, 532, 549, 178, 324, 688, 446, 769, 776, 809,
+ /* 190 */ 813, 655, 581, 738, -74, -58, -50, -17, -23, -23,
+ /* 200 */ -23, 63, -23, 29, 68, 121, 183, 146, 225, 29,
+ /* 210 */ -23, -23, 196, 177, -23, -23, -23, -23, 255, 328,
+ /* 220 */ 335, 381, 404, 439, 449, 600, 648, 546, 685, 638,
+ /* 230 */ 717, 663, 722, 811, 734, 756, 801, 827, 868, 872,
+ /* 240 */ 899, 967, 980, 996, 997, 981, 987, 1003, 961, 976,
+ /* 250 */ 979, 992, 998, 1004, 991, 1057, 1070, 1009, 1036, 1038,
+ /* 260 */ 1069, 1041, 1080, 1098, 1122, 1111, 1135, 1123, 1139, 1168,
+ /* 270 */ 1133, 1143, 1174, 1185, 1194, 1205, 1216, 1257, 1245, 1258,
+ /* 280 */ 1253, 1259, 1260, 1261, 1183, 1184, 1266, 1267, 1227, 1236,
+ /* 290 */ 1208, 1229, 1272, 1239, 1247, 1248, 1249, 1237, 1264, 1219,
+ /* 300 */ 1278, 1201, 1202, 1285, 1286, 1203, 1283, 1268, 1270, 1206,
+ /* 310 */ 1204, 1207,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 595, 820, 902, 710, 902, 820, 902, 902, 848, 714,
- /* 10 */ 877, 818, 902, 902, 902, 902, 792, 902, 848, 902,
- /* 20 */ 626, 848, 848, 743, 902, 902, 902, 902, 902, 902,
- /* 30 */ 902, 902, 744, 902, 822, 817, 813, 815, 814, 821,
- /* 40 */ 745, 734, 741, 748, 726, 861, 750, 751, 757, 758,
- /* 50 */ 878, 876, 780, 779, 798, 902, 902, 902, 902, 902,
- /* 60 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 70 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 80 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 90 */ 902, 902, 902, 902, 902, 902, 782, 804, 781, 791,
- /* 100 */ 619, 783, 784, 679, 614, 902, 902, 902, 902, 902,
- /* 110 */ 902, 902, 785, 902, 786, 799, 800, 801, 902, 902,
- /* 120 */ 902, 902, 902, 902, 595, 710, 902, 710, 902, 902,
- /* 130 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 140 */ 902, 902, 902, 902, 902, 902, 704, 714, 895, 902,
- /* 150 */ 902, 670, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 160 */ 902, 902, 602, 600, 902, 702, 902, 902, 628, 902,
- /* 170 */ 902, 712, 902, 902, 717, 718, 902, 902, 902, 902,
- /* 180 */ 902, 902, 902, 616, 902, 902, 691, 902, 854, 902,
- /* 190 */ 902, 902, 868, 902, 902, 902, 866, 902, 902, 902,
- /* 200 */ 693, 753, 834, 902, 881, 883, 902, 902, 702, 711,
- /* 210 */ 902, 902, 902, 816, 737, 737, 737, 649, 737, 902,
- /* 220 */ 737, 902, 652, 747, 747, 599, 599, 599, 599, 669,
- /* 230 */ 902, 747, 738, 740, 730, 742, 902, 719, 719, 727,
- /* 240 */ 729, 727, 729, 681, 681, 666, 681, 652, 681, 826,
- /* 250 */ 831, 831, 666, 681, 681, 681, 826, 611, 719, 611,
- /* 260 */ 719, 611, 719, 719, 858, 860, 611, 719, 683, 683,
- /* 270 */ 759, 747, 719, 690, 690, 690, 690, 747, 683, 759,
- /* 280 */ 719, 880, 880, 719, 719, 888, 636, 654, 654, 863,
- /* 290 */ 895, 900, 902, 902, 902, 902, 766, 902, 902, 902,
- /* 300 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 310 */ 841, 902, 902, 902, 902, 771, 767, 902, 768, 902,
- /* 320 */ 696, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 330 */ 902, 819, 902, 731, 902, 739, 902, 902, 902, 902,
- /* 340 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 350 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 360 */ 856, 857, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 370 */ 902, 902, 902, 902, 902, 902, 902, 902, 902, 902,
- /* 380 */ 902, 902, 902, 902, 887, 902, 902, 890, 596, 902,
- /* 390 */ 590, 593, 592, 594, 598, 601, 623, 624, 625, 603,
- /* 400 */ 604, 605, 606, 607, 608, 609, 615, 617, 635, 637,
- /* 410 */ 621, 639, 700, 701, 763, 694, 695, 699, 622, 774,
- /* 420 */ 765, 769, 770, 772, 773, 787, 788, 790, 796, 803,
- /* 430 */ 806, 789, 794, 795, 797, 802, 805, 697, 698, 809,
- /* 440 */ 629, 630, 633, 634, 844, 846, 845, 847, 632, 631,
- /* 450 */ 775, 778, 811, 812, 869, 870, 871, 872, 873, 807,
- /* 460 */ 720, 810, 793, 732, 735, 736, 733, 703, 713, 722,
- /* 470 */ 723, 724, 725, 708, 709, 715, 728, 761, 762, 716,
- /* 480 */ 705, 706, 707, 808, 764, 776, 777, 640, 641, 771,
- /* 490 */ 642, 643, 644, 682, 685, 686, 687, 645, 664, 667,
- /* 500 */ 668, 646, 653, 647, 648, 655, 656, 657, 660, 661,
- /* 510 */ 662, 663, 658, 659, 827, 828, 832, 830, 829, 650,
- /* 520 */ 651, 665, 638, 627, 620, 671, 674, 675, 676, 677,
- /* 530 */ 678, 680, 672, 673, 618, 610, 612, 721, 850, 859,
- /* 540 */ 855, 851, 852, 853, 613, 823, 824, 684, 755, 756,
- /* 550 */ 849, 862, 864, 760, 865, 867, 892, 688, 689, 692,
- /* 560 */ 833, 874, 746, 749, 752, 754, 835, 836, 837, 838,
- /* 570 */ 839, 842, 843, 840, 875, 879, 882, 884, 885, 886,
- /* 580 */ 889, 891, 896, 897, 898, 901, 899, 597, 591,
+ /* 0 */ 634, 869, 958, 958, 869, 958, 958, 898, 898, 757,
+ /* 10 */ 867, 958, 958, 958, 958, 958, 958, 932, 958, 958,
+ /* 20 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 30 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 40 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 50 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 60 */ 958, 841, 958, 958, 958, 673, 898, 898, 761, 792,
+ /* 70 */ 958, 958, 958, 958, 958, 958, 958, 958, 793, 958,
+ /* 80 */ 871, 866, 862, 864, 863, 870, 794, 783, 790, 797,
+ /* 90 */ 772, 911, 799, 800, 806, 807, 933, 931, 829, 828,
+ /* 100 */ 847, 831, 845, 853, 846, 830, 840, 665, 832, 833,
+ /* 110 */ 958, 958, 958, 958, 958, 726, 660, 958, 958, 958,
+ /* 120 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 130 */ 958, 958, 958, 834, 958, 835, 848, 849, 850, 958,
+ /* 140 */ 958, 958, 958, 958, 958, 958, 958, 958, 640, 958,
+ /* 150 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 160 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 170 */ 958, 958, 958, 958, 958, 882, 958, 936, 938, 958,
+ /* 180 */ 958, 958, 634, 757, 757, 757, 958, 958, 958, 958,
+ /* 190 */ 958, 751, 761, 950, 958, 958, 717, 958, 958, 958,
+ /* 200 */ 958, 958, 958, 958, 958, 958, 642, 749, 675, 759,
+ /* 210 */ 662, 738, 904, 958, 923, 921, 740, 802, 958, 749,
+ /* 220 */ 758, 958, 958, 958, 865, 786, 786, 774, 786, 696,
+ /* 230 */ 786, 958, 786, 958, 699, 916, 796, 916, 774, 774,
+ /* 240 */ 796, 639, 639, 639, 639, 650, 650, 716, 958, 796,
+ /* 250 */ 787, 789, 779, 791, 958, 765, 765, 773, 778, 773,
+ /* 260 */ 778, 773, 778, 728, 728, 713, 728, 699, 728, 875,
+ /* 270 */ 879, 879, 713, 728, 728, 728, 875, 657, 765, 657,
+ /* 280 */ 765, 657, 765, 765, 908, 910, 657, 765, 730, 730,
+ /* 290 */ 808, 796, 765, 737, 737, 737, 737, 796, 730, 808,
+ /* 300 */ 765, 935, 935, 765, 765, 943, 683, 701, 701, 950,
+ /* 310 */ 955, 955, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 320 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 330 */ 884, 958, 958, 648, 958, 667, 815, 820, 816, 958,
+ /* 340 */ 817, 743, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 350 */ 958, 958, 868, 958, 780, 958, 788, 958, 958, 958,
+ /* 360 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 370 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 380 */ 958, 958, 958, 906, 907, 958, 958, 958, 958, 958,
+ /* 390 */ 958, 914, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 400 */ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958,
+ /* 410 */ 958, 958, 942, 958, 958, 945, 635, 958, 630, 632,
+ /* 420 */ 633, 637, 638, 641, 667, 668, 670, 671, 672, 643,
+ /* 430 */ 644, 645, 646, 647, 649, 653, 651, 652, 654, 661,
+ /* 440 */ 663, 682, 684, 686, 747, 748, 812, 741, 742, 746,
+ /* 450 */ 669, 823, 814, 818, 819, 821, 822, 836, 837, 839,
+ /* 460 */ 844, 852, 855, 838, 843, 851, 854, 744, 745, 858,
+ /* 470 */ 676, 677, 680, 681, 894, 896, 895, 897, 679, 678,
+ /* 480 */ 824, 827, 860, 861, 924, 925, 926, 927, 928, 856,
+ /* 490 */ 766, 859, 842, 781, 784, 785, 782, 750, 760, 768,
+ /* 500 */ 769, 770, 771, 755, 756, 762, 777, 810, 811, 775,
+ /* 510 */ 776, 763, 764, 752, 753, 754, 857, 813, 825, 826,
+ /* 520 */ 687, 688, 820, 689, 690, 691, 729, 732, 733, 734,
+ /* 530 */ 692, 711, 714, 715, 693, 700, 694, 695, 702, 703,
+ /* 540 */ 704, 706, 707, 708, 709, 710, 705, 876, 877, 880,
+ /* 550 */ 878, 697, 698, 712, 685, 674, 666, 718, 721, 722,
+ /* 560 */ 723, 724, 725, 727, 719, 720, 664, 655, 658, 767,
+ /* 570 */ 900, 909, 905, 901, 902, 903, 659, 872, 873, 731,
+ /* 580 */ 804, 805, 899, 912, 915, 917, 918, 919, 809, 920,
+ /* 590 */ 922, 913, 947, 656, 735, 736, 739, 881, 929, 795,
+ /* 600 */ 798, 801, 803, 883, 885, 887, 889, 890, 891, 892,
+ /* 610 */ 893, 886, 888, 930, 934, 937, 939, 940, 941, 944,
+ /* 620 */ 946, 951, 952, 953, 956, 957, 954, 636, 631,
};
#define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
@@ -73516,7 +90680,7 @@ static const YYACTIONTYPE yy_default[] = {
**
** %fallback ID X Y Z.
**
-** appears in the grammer, then ID becomes a fallback token for X, Y,
+** appears in the grammar, then ID becomes a fallback token for X, Y,
** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
** but it does not parse, the type of the token is changed to ID and
** the parse is retried before an error is thrown.
@@ -73525,142 +90689,71 @@ static const YYACTIONTYPE yy_default[] = {
static const YYCODETYPE yyFallback[] = {
0, /* $ => nothing */
0, /* SEMI => nothing */
- 23, /* EXPLAIN => ID */
- 23, /* QUERY => ID */
- 23, /* PLAN => ID */
- 23, /* BEGIN => ID */
+ 26, /* EXPLAIN => ID */
+ 26, /* QUERY => ID */
+ 26, /* PLAN => ID */
+ 26, /* BEGIN => ID */
0, /* TRANSACTION => nothing */
- 23, /* DEFERRED => ID */
- 23, /* IMMEDIATE => ID */
- 23, /* EXCLUSIVE => ID */
+ 26, /* DEFERRED => ID */
+ 26, /* IMMEDIATE => ID */
+ 26, /* EXCLUSIVE => ID */
0, /* COMMIT => nothing */
- 23, /* END => ID */
- 0, /* ROLLBACK => nothing */
- 0, /* CREATE => nothing */
+ 26, /* END => ID */
+ 26, /* ROLLBACK => ID */
+ 26, /* SAVEPOINT => ID */
+ 26, /* RELEASE => ID */
+ 0, /* TO => nothing */
0, /* TABLE => nothing */
- 23, /* IF => ID */
+ 0, /* CREATE => nothing */
+ 26, /* IF => ID */
0, /* NOT => nothing */
0, /* EXISTS => nothing */
- 23, /* TEMP => ID */
+ 26, /* TEMP => ID */
0, /* LP => nothing */
0, /* RP => nothing */
0, /* AS => nothing */
0, /* COMMA => nothing */
0, /* ID => nothing */
- 23, /* ABORT => ID */
- 23, /* AFTER => ID */
- 23, /* ANALYZE => ID */
- 23, /* ASC => ID */
- 23, /* ATTACH => ID */
- 23, /* BEFORE => ID */
- 23, /* CASCADE => ID */
- 23, /* CAST => ID */
- 23, /* CONFLICT => ID */
- 23, /* DATABASE => ID */
- 23, /* DESC => ID */
- 23, /* DETACH => ID */
- 23, /* EACH => ID */
- 23, /* FAIL => ID */
- 23, /* FOR => ID */
- 23, /* IGNORE => ID */
- 23, /* INITIALLY => ID */
- 23, /* INSTEAD => ID */
- 23, /* LIKE_KW => ID */
- 23, /* MATCH => ID */
- 23, /* KEY => ID */
- 23, /* OF => ID */
- 23, /* OFFSET => ID */
- 23, /* PRAGMA => ID */
- 23, /* RAISE => ID */
- 23, /* REPLACE => ID */
- 23, /* RESTRICT => ID */
- 23, /* ROW => ID */
- 23, /* TRIGGER => ID */
- 23, /* VACUUM => ID */
- 23, /* VIEW => ID */
- 23, /* VIRTUAL => ID */
- 23, /* REINDEX => ID */
- 23, /* RENAME => ID */
- 23, /* CTIME_KW => ID */
- 0, /* ANY => nothing */
- 0, /* OR => nothing */
- 0, /* AND => nothing */
- 0, /* IS => nothing */
- 0, /* BETWEEN => nothing */
- 0, /* IN => nothing */
- 0, /* ISNULL => nothing */
- 0, /* NOTNULL => nothing */
- 0, /* NE => nothing */
- 0, /* EQ => nothing */
- 0, /* GT => nothing */
- 0, /* LE => nothing */
- 0, /* LT => nothing */
- 0, /* GE => nothing */
- 0, /* ESCAPE => nothing */
- 0, /* BITAND => nothing */
- 0, /* BITOR => nothing */
- 0, /* LSHIFT => nothing */
- 0, /* RSHIFT => nothing */
- 0, /* PLUS => nothing */
- 0, /* MINUS => nothing */
- 0, /* STAR => nothing */
- 0, /* SLASH => nothing */
- 0, /* REM => nothing */
- 0, /* CONCAT => nothing */
- 0, /* COLLATE => nothing */
- 0, /* UMINUS => nothing */
- 0, /* UPLUS => nothing */
- 0, /* BITNOT => nothing */
- 0, /* STRING => nothing */
- 0, /* JOIN_KW => nothing */
- 0, /* CONSTRAINT => nothing */
- 0, /* DEFAULT => nothing */
- 0, /* NULL => nothing */
- 0, /* PRIMARY => nothing */
- 0, /* UNIQUE => nothing */
- 0, /* CHECK => nothing */
- 0, /* REFERENCES => nothing */
- 0, /* AUTOINCR => nothing */
- 0, /* ON => nothing */
- 0, /* DELETE => nothing */
- 0, /* UPDATE => nothing */
- 0, /* INSERT => nothing */
- 0, /* SET => nothing */
- 0, /* DEFERRABLE => nothing */
- 0, /* FOREIGN => nothing */
- 0, /* DROP => nothing */
- 0, /* UNION => nothing */
- 0, /* ALL => nothing */
- 0, /* EXCEPT => nothing */
- 0, /* INTERSECT => nothing */
- 0, /* SELECT => nothing */
- 0, /* DISTINCT => nothing */
- 0, /* DOT => nothing */
- 0, /* FROM => nothing */
- 0, /* JOIN => nothing */
- 0, /* USING => nothing */
- 0, /* ORDER => nothing */
- 0, /* BY => nothing */
- 0, /* GROUP => nothing */
- 0, /* HAVING => nothing */
- 0, /* LIMIT => nothing */
- 0, /* WHERE => nothing */
- 0, /* INTO => nothing */
- 0, /* VALUES => nothing */
- 0, /* INTEGER => nothing */
- 0, /* FLOAT => nothing */
- 0, /* BLOB => nothing */
- 0, /* REGISTER => nothing */
- 0, /* VARIABLE => nothing */
- 0, /* CASE => nothing */
- 0, /* WHEN => nothing */
- 0, /* THEN => nothing */
- 0, /* ELSE => nothing */
- 0, /* INDEX => nothing */
- 0, /* ALTER => nothing */
- 0, /* TO => nothing */
- 0, /* ADD => nothing */
- 0, /* COLUMNKW => nothing */
+ 0, /* INDEXED => nothing */
+ 26, /* ABORT => ID */
+ 26, /* ACTION => ID */
+ 26, /* AFTER => ID */
+ 26, /* ANALYZE => ID */
+ 26, /* ASC => ID */
+ 26, /* ATTACH => ID */
+ 26, /* BEFORE => ID */
+ 26, /* BY => ID */
+ 26, /* CASCADE => ID */
+ 26, /* CAST => ID */
+ 26, /* COLUMNKW => ID */
+ 26, /* CONFLICT => ID */
+ 26, /* DATABASE => ID */
+ 26, /* DESC => ID */
+ 26, /* DETACH => ID */
+ 26, /* EACH => ID */
+ 26, /* FAIL => ID */
+ 26, /* FOR => ID */
+ 26, /* IGNORE => ID */
+ 26, /* INITIALLY => ID */
+ 26, /* INSTEAD => ID */
+ 26, /* LIKE_KW => ID */
+ 26, /* MATCH => ID */
+ 26, /* NO => ID */
+ 26, /* KEY => ID */
+ 26, /* OF => ID */
+ 26, /* OFFSET => ID */
+ 26, /* PRAGMA => ID */
+ 26, /* RAISE => ID */
+ 26, /* REPLACE => ID */
+ 26, /* RESTRICT => ID */
+ 26, /* ROW => ID */
+ 26, /* TRIGGER => ID */
+ 26, /* VACUUM => ID */
+ 26, /* VIEW => ID */
+ 26, /* VIRTUAL => ID */
+ 26, /* REINDEX => ID */
+ 26, /* RENAME => ID */
+ 26, /* CTIME_KW => ID */
};
#endif /* YYFALLBACK */
@@ -73677,11 +90770,11 @@ static const YYCODETYPE yyFallback[] = {
** It is sometimes called the "minor" token.
*/
struct yyStackEntry {
- int stateno; /* The state-number */
- int major; /* The major token value. This is the code
- ** number for the token at this stack level */
- YYMINORTYPE minor; /* The user-supplied minor token value. This
- ** is the value of the token */
+ YYACTIONTYPE stateno; /* The state-number */
+ YYCODETYPE major; /* The major token value. This is the code
+ ** number for the token at this stack level */
+ YYMINORTYPE minor; /* The user-supplied minor token value. This
+ ** is the value of the token */
};
typedef struct yyStackEntry yyStackEntry;
@@ -73689,6 +90782,9 @@ typedef struct yyStackEntry yyStackEntry;
** the following structure */
struct yyParser {
int yyidx; /* Index of top element in stack */
+#ifdef YYTRACKMAXSTACKDEPTH
+ int yyidxMax; /* Maximum value of yyidx */
+#endif
int yyerrcnt; /* Shifts left before out of the error */
sqlite3ParserARG_SDECL /* A place to hold %extra_argument */
#if YYSTACKDEPTH<=0
@@ -73738,14 +90834,16 @@ static const char *const yyTokenName[] = {
"$", "SEMI", "EXPLAIN", "QUERY",
"PLAN", "BEGIN", "TRANSACTION", "DEFERRED",
"IMMEDIATE", "EXCLUSIVE", "COMMIT", "END",
- "ROLLBACK", "CREATE", "TABLE", "IF",
- "NOT", "EXISTS", "TEMP", "LP",
- "RP", "AS", "COMMA", "ID",
- "ABORT", "AFTER", "ANALYZE", "ASC",
- "ATTACH", "BEFORE", "CASCADE", "CAST",
- "CONFLICT", "DATABASE", "DESC", "DETACH",
- "EACH", "FAIL", "FOR", "IGNORE",
- "INITIALLY", "INSTEAD", "LIKE_KW", "MATCH",
+ "ROLLBACK", "SAVEPOINT", "RELEASE", "TO",
+ "TABLE", "CREATE", "IF", "NOT",
+ "EXISTS", "TEMP", "LP", "RP",
+ "AS", "COMMA", "ID", "INDEXED",
+ "ABORT", "ACTION", "AFTER", "ANALYZE",
+ "ASC", "ATTACH", "BEFORE", "BY",
+ "CASCADE", "CAST", "COLUMNKW", "CONFLICT",
+ "DATABASE", "DESC", "DETACH", "EACH",
+ "FAIL", "FOR", "IGNORE", "INITIALLY",
+ "INSTEAD", "LIKE_KW", "MATCH", "NO",
"KEY", "OF", "OFFSET", "PRAGMA",
"RAISE", "REPLACE", "RESTRICT", "ROW",
"TRIGGER", "VACUUM", "VIEW", "VIRTUAL",
@@ -73756,47 +90854,47 @@ static const char *const yyTokenName[] = {
"GE", "ESCAPE", "BITAND", "BITOR",
"LSHIFT", "RSHIFT", "PLUS", "MINUS",
"STAR", "SLASH", "REM", "CONCAT",
- "COLLATE", "UMINUS", "UPLUS", "BITNOT",
- "STRING", "JOIN_KW", "CONSTRAINT", "DEFAULT",
- "NULL", "PRIMARY", "UNIQUE", "CHECK",
- "REFERENCES", "AUTOINCR", "ON", "DELETE",
- "UPDATE", "INSERT", "SET", "DEFERRABLE",
- "FOREIGN", "DROP", "UNION", "ALL",
- "EXCEPT", "INTERSECT", "SELECT", "DISTINCT",
- "DOT", "FROM", "JOIN", "USING",
- "ORDER", "BY", "GROUP", "HAVING",
+ "COLLATE", "BITNOT", "STRING", "JOIN_KW",
+ "CONSTRAINT", "DEFAULT", "NULL", "PRIMARY",
+ "UNIQUE", "CHECK", "REFERENCES", "AUTOINCR",
+ "ON", "DELETE", "UPDATE", "SET",
+ "DEFERRABLE", "FOREIGN", "DROP", "UNION",
+ "ALL", "EXCEPT", "INTERSECT", "SELECT",
+ "DISTINCT", "DOT", "FROM", "JOIN",
+ "USING", "ORDER", "GROUP", "HAVING",
"LIMIT", "WHERE", "INTO", "VALUES",
- "INTEGER", "FLOAT", "BLOB", "REGISTER",
- "VARIABLE", "CASE", "WHEN", "THEN",
- "ELSE", "INDEX", "ALTER", "TO",
- "ADD", "COLUMNKW", "error", "input",
- "cmdlist", "ecmd", "cmdx", "cmd",
- "explain", "transtype", "trans_opt", "nm",
- "create_table", "create_table_args", "temp", "ifnotexists",
- "dbnm", "columnlist", "conslist_opt", "select",
- "column", "columnid", "type", "carglist",
- "id", "ids", "typetoken", "typename",
- "signed", "plus_num", "minus_num", "carg",
- "ccons", "term", "expr", "onconf",
- "sortorder", "autoinc", "idxlist_opt", "refargs",
- "defer_subclause", "refarg", "refact", "init_deferred_pred_opt",
- "conslist", "tcons", "idxlist", "defer_subclause_opt",
- "orconf", "resolvetype", "raisetype", "ifexists",
- "fullname", "oneselect", "multiselect_op", "distinct",
- "selcollist", "from", "where_opt", "groupby_opt",
- "having_opt", "orderby_opt", "limit_opt", "sclp",
- "as", "seltablist", "stl_prefix", "joinop",
- "on_opt", "using_opt", "seltablist_paren", "joinop2",
- "inscollist", "sortlist", "sortitem", "nexprlist",
- "setlist", "insert_cmd", "inscollist_opt", "itemlist",
- "exprlist", "likeop", "escape", "between_op",
- "in_op", "case_operand", "case_exprlist", "case_else",
- "uniqueflag", "idxitem", "collate", "nmnum",
+ "INSERT", "INTEGER", "FLOAT", "BLOB",
+ "REGISTER", "VARIABLE", "CASE", "WHEN",
+ "THEN", "ELSE", "INDEX", "ALTER",
+ "ADD", "error", "input", "cmdlist",
+ "ecmd", "explain", "cmdx", "cmd",
+ "transtype", "trans_opt", "nm", "savepoint_opt",
+ "create_table", "create_table_args", "createkw", "temp",
+ "ifnotexists", "dbnm", "columnlist", "conslist_opt",
+ "select", "column", "columnid", "type",
+ "carglist", "id", "ids", "typetoken",
+ "typename", "signed", "plus_num", "minus_num",
+ "carg", "ccons", "term", "expr",
+ "onconf", "sortorder", "autoinc", "idxlist_opt",
+ "refargs", "defer_subclause", "refarg", "refact",
+ "init_deferred_pred_opt", "conslist", "tcons", "idxlist",
+ "defer_subclause_opt", "orconf", "resolvetype", "raisetype",
+ "ifexists", "fullname", "oneselect", "multiselect_op",
+ "distinct", "selcollist", "from", "where_opt",
+ "groupby_opt", "having_opt", "orderby_opt", "limit_opt",
+ "sclp", "as", "seltablist", "stl_prefix",
+ "joinop", "indexed_opt", "on_opt", "using_opt",
+ "joinop2", "inscollist", "sortlist", "sortitem",
+ "nexprlist", "setlist", "insert_cmd", "inscollist_opt",
+ "itemlist", "exprlist", "likeop", "escape",
+ "between_op", "in_op", "case_operand", "case_exprlist",
+ "case_else", "uniqueflag", "collate", "nmnum",
"plus_opt", "number", "trigger_decl", "trigger_cmd_list",
"trigger_time", "trigger_event", "foreach_clause", "when_clause",
- "trigger_cmd", "database_kw_opt", "key_opt", "add_column_fullname",
- "kwcolumn_opt", "create_vtab", "vtabarglist", "vtabarg",
- "vtabargtoken", "lp", "anylist",
+ "trigger_cmd", "trnm", "tridxby", "database_kw_opt",
+ "key_opt", "add_column_fullname", "kwcolumn_opt", "create_vtab",
+ "vtabarglist", "vtabarg", "vtabargtoken", "lp",
+ "anylist",
};
#endif /* NDEBUG */
@@ -73807,12 +90905,12 @@ static const char *const yyRuleName[] = {
/* 0 */ "input ::= cmdlist",
/* 1 */ "cmdlist ::= cmdlist ecmd",
/* 2 */ "cmdlist ::= ecmd",
- /* 3 */ "cmdx ::= cmd",
- /* 4 */ "ecmd ::= SEMI",
- /* 5 */ "ecmd ::= explain cmdx SEMI",
- /* 6 */ "explain ::=",
- /* 7 */ "explain ::= EXPLAIN",
- /* 8 */ "explain ::= EXPLAIN QUERY PLAN",
+ /* 3 */ "ecmd ::= SEMI",
+ /* 4 */ "ecmd ::= explain cmdx SEMI",
+ /* 5 */ "explain ::=",
+ /* 6 */ "explain ::= EXPLAIN",
+ /* 7 */ "explain ::= EXPLAIN QUERY PLAN",
+ /* 8 */ "cmdx ::= cmd",
/* 9 */ "cmd ::= BEGIN transtype trans_opt",
/* 10 */ "trans_opt ::=",
/* 11 */ "trans_opt ::= TRANSACTION",
@@ -73824,299 +90922,315 @@ static const char *const yyRuleName[] = {
/* 17 */ "cmd ::= COMMIT trans_opt",
/* 18 */ "cmd ::= END trans_opt",
/* 19 */ "cmd ::= ROLLBACK trans_opt",
- /* 20 */ "cmd ::= create_table create_table_args",
- /* 21 */ "create_table ::= CREATE temp TABLE ifnotexists nm dbnm",
- /* 22 */ "ifnotexists ::=",
- /* 23 */ "ifnotexists ::= IF NOT EXISTS",
- /* 24 */ "temp ::= TEMP",
- /* 25 */ "temp ::=",
- /* 26 */ "create_table_args ::= LP columnlist conslist_opt RP",
- /* 27 */ "create_table_args ::= AS select",
- /* 28 */ "columnlist ::= columnlist COMMA column",
- /* 29 */ "columnlist ::= column",
- /* 30 */ "column ::= columnid type carglist",
- /* 31 */ "columnid ::= nm",
- /* 32 */ "id ::= ID",
- /* 33 */ "ids ::= ID|STRING",
- /* 34 */ "nm ::= ID",
- /* 35 */ "nm ::= STRING",
- /* 36 */ "nm ::= JOIN_KW",
- /* 37 */ "type ::=",
- /* 38 */ "type ::= typetoken",
- /* 39 */ "typetoken ::= typename",
- /* 40 */ "typetoken ::= typename LP signed RP",
- /* 41 */ "typetoken ::= typename LP signed COMMA signed RP",
- /* 42 */ "typename ::= ids",
- /* 43 */ "typename ::= typename ids",
- /* 44 */ "signed ::= plus_num",
- /* 45 */ "signed ::= minus_num",
- /* 46 */ "carglist ::= carglist carg",
- /* 47 */ "carglist ::=",
- /* 48 */ "carg ::= CONSTRAINT nm ccons",
- /* 49 */ "carg ::= ccons",
- /* 50 */ "ccons ::= DEFAULT term",
- /* 51 */ "ccons ::= DEFAULT LP expr RP",
- /* 52 */ "ccons ::= DEFAULT PLUS term",
- /* 53 */ "ccons ::= DEFAULT MINUS term",
- /* 54 */ "ccons ::= DEFAULT id",
- /* 55 */ "ccons ::= NULL onconf",
- /* 56 */ "ccons ::= NOT NULL onconf",
- /* 57 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
- /* 58 */ "ccons ::= UNIQUE onconf",
- /* 59 */ "ccons ::= CHECK LP expr RP",
- /* 60 */ "ccons ::= REFERENCES nm idxlist_opt refargs",
- /* 61 */ "ccons ::= defer_subclause",
- /* 62 */ "ccons ::= COLLATE ids",
- /* 63 */ "autoinc ::=",
- /* 64 */ "autoinc ::= AUTOINCR",
- /* 65 */ "refargs ::=",
- /* 66 */ "refargs ::= refargs refarg",
- /* 67 */ "refarg ::= MATCH nm",
- /* 68 */ "refarg ::= ON DELETE refact",
- /* 69 */ "refarg ::= ON UPDATE refact",
- /* 70 */ "refarg ::= ON INSERT refact",
- /* 71 */ "refact ::= SET NULL",
- /* 72 */ "refact ::= SET DEFAULT",
- /* 73 */ "refact ::= CASCADE",
- /* 74 */ "refact ::= RESTRICT",
- /* 75 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
- /* 76 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
- /* 77 */ "init_deferred_pred_opt ::=",
- /* 78 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
- /* 79 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
- /* 80 */ "conslist_opt ::=",
- /* 81 */ "conslist_opt ::= COMMA conslist",
- /* 82 */ "conslist ::= conslist COMMA tcons",
- /* 83 */ "conslist ::= conslist tcons",
- /* 84 */ "conslist ::= tcons",
- /* 85 */ "tcons ::= CONSTRAINT nm",
- /* 86 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf",
- /* 87 */ "tcons ::= UNIQUE LP idxlist RP onconf",
- /* 88 */ "tcons ::= CHECK LP expr RP onconf",
- /* 89 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt",
- /* 90 */ "defer_subclause_opt ::=",
- /* 91 */ "defer_subclause_opt ::= defer_subclause",
- /* 92 */ "onconf ::=",
- /* 93 */ "onconf ::= ON CONFLICT resolvetype",
- /* 94 */ "orconf ::=",
- /* 95 */ "orconf ::= OR resolvetype",
- /* 96 */ "resolvetype ::= raisetype",
- /* 97 */ "resolvetype ::= IGNORE",
- /* 98 */ "resolvetype ::= REPLACE",
- /* 99 */ "cmd ::= DROP TABLE ifexists fullname",
- /* 100 */ "ifexists ::= IF EXISTS",
- /* 101 */ "ifexists ::=",
- /* 102 */ "cmd ::= CREATE temp VIEW ifnotexists nm dbnm AS select",
- /* 103 */ "cmd ::= DROP VIEW ifexists fullname",
- /* 104 */ "cmd ::= select",
- /* 105 */ "select ::= oneselect",
- /* 106 */ "select ::= select multiselect_op oneselect",
- /* 107 */ "multiselect_op ::= UNION",
- /* 108 */ "multiselect_op ::= UNION ALL",
- /* 109 */ "multiselect_op ::= EXCEPT|INTERSECT",
- /* 110 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
- /* 111 */ "distinct ::= DISTINCT",
- /* 112 */ "distinct ::= ALL",
- /* 113 */ "distinct ::=",
- /* 114 */ "sclp ::= selcollist COMMA",
- /* 115 */ "sclp ::=",
- /* 116 */ "selcollist ::= sclp expr as",
- /* 117 */ "selcollist ::= sclp STAR",
- /* 118 */ "selcollist ::= sclp nm DOT STAR",
- /* 119 */ "as ::= AS nm",
- /* 120 */ "as ::= ids",
- /* 121 */ "as ::=",
- /* 122 */ "from ::=",
- /* 123 */ "from ::= FROM seltablist",
- /* 124 */ "stl_prefix ::= seltablist joinop",
- /* 125 */ "stl_prefix ::=",
- /* 126 */ "seltablist ::= stl_prefix nm dbnm as on_opt using_opt",
- /* 127 */ "seltablist ::= stl_prefix LP seltablist_paren RP as on_opt using_opt",
- /* 128 */ "seltablist_paren ::= select",
- /* 129 */ "seltablist_paren ::= seltablist",
- /* 130 */ "dbnm ::=",
- /* 131 */ "dbnm ::= DOT nm",
- /* 132 */ "fullname ::= nm dbnm",
- /* 133 */ "joinop ::= COMMA|JOIN",
- /* 134 */ "joinop ::= JOIN_KW JOIN",
- /* 135 */ "joinop ::= JOIN_KW nm JOIN",
- /* 136 */ "joinop ::= JOIN_KW nm nm JOIN",
- /* 137 */ "on_opt ::= ON expr",
- /* 138 */ "on_opt ::=",
- /* 139 */ "using_opt ::= USING LP inscollist RP",
- /* 140 */ "using_opt ::=",
- /* 141 */ "orderby_opt ::=",
- /* 142 */ "orderby_opt ::= ORDER BY sortlist",
- /* 143 */ "sortlist ::= sortlist COMMA sortitem sortorder",
- /* 144 */ "sortlist ::= sortitem sortorder",
- /* 145 */ "sortitem ::= expr",
- /* 146 */ "sortorder ::= ASC",
- /* 147 */ "sortorder ::= DESC",
- /* 148 */ "sortorder ::=",
- /* 149 */ "groupby_opt ::=",
- /* 150 */ "groupby_opt ::= GROUP BY nexprlist",
- /* 151 */ "having_opt ::=",
- /* 152 */ "having_opt ::= HAVING expr",
- /* 153 */ "limit_opt ::=",
- /* 154 */ "limit_opt ::= LIMIT expr",
- /* 155 */ "limit_opt ::= LIMIT expr OFFSET expr",
- /* 156 */ "limit_opt ::= LIMIT expr COMMA expr",
- /* 157 */ "cmd ::= DELETE FROM fullname where_opt",
- /* 158 */ "where_opt ::=",
- /* 159 */ "where_opt ::= WHERE expr",
- /* 160 */ "cmd ::= UPDATE orconf fullname SET setlist where_opt",
- /* 161 */ "setlist ::= setlist COMMA nm EQ expr",
- /* 162 */ "setlist ::= nm EQ expr",
- /* 163 */ "cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP",
- /* 164 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select",
- /* 165 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES",
- /* 166 */ "insert_cmd ::= INSERT orconf",
- /* 167 */ "insert_cmd ::= REPLACE",
- /* 168 */ "itemlist ::= itemlist COMMA expr",
- /* 169 */ "itemlist ::= expr",
- /* 170 */ "inscollist_opt ::=",
- /* 171 */ "inscollist_opt ::= LP inscollist RP",
- /* 172 */ "inscollist ::= inscollist COMMA nm",
- /* 173 */ "inscollist ::= nm",
- /* 174 */ "expr ::= term",
- /* 175 */ "expr ::= LP expr RP",
- /* 176 */ "term ::= NULL",
- /* 177 */ "expr ::= ID",
- /* 178 */ "expr ::= JOIN_KW",
- /* 179 */ "expr ::= nm DOT nm",
- /* 180 */ "expr ::= nm DOT nm DOT nm",
- /* 181 */ "term ::= INTEGER|FLOAT|BLOB",
- /* 182 */ "term ::= STRING",
- /* 183 */ "expr ::= REGISTER",
- /* 184 */ "expr ::= VARIABLE",
- /* 185 */ "expr ::= expr COLLATE ids",
- /* 186 */ "expr ::= CAST LP expr AS typetoken RP",
- /* 187 */ "expr ::= ID LP distinct exprlist RP",
- /* 188 */ "expr ::= ID LP STAR RP",
- /* 189 */ "term ::= CTIME_KW",
- /* 190 */ "expr ::= expr AND expr",
- /* 191 */ "expr ::= expr OR expr",
- /* 192 */ "expr ::= expr LT|GT|GE|LE expr",
- /* 193 */ "expr ::= expr EQ|NE expr",
- /* 194 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
- /* 195 */ "expr ::= expr PLUS|MINUS expr",
- /* 196 */ "expr ::= expr STAR|SLASH|REM expr",
- /* 197 */ "expr ::= expr CONCAT expr",
- /* 198 */ "likeop ::= LIKE_KW",
- /* 199 */ "likeop ::= NOT LIKE_KW",
- /* 200 */ "likeop ::= MATCH",
- /* 201 */ "likeop ::= NOT MATCH",
- /* 202 */ "escape ::= ESCAPE expr",
- /* 203 */ "escape ::=",
- /* 204 */ "expr ::= expr likeop expr escape",
- /* 205 */ "expr ::= expr ISNULL|NOTNULL",
- /* 206 */ "expr ::= expr IS NULL",
- /* 207 */ "expr ::= expr NOT NULL",
- /* 208 */ "expr ::= expr IS NOT NULL",
- /* 209 */ "expr ::= NOT expr",
- /* 210 */ "expr ::= BITNOT expr",
- /* 211 */ "expr ::= MINUS expr",
- /* 212 */ "expr ::= PLUS expr",
- /* 213 */ "between_op ::= BETWEEN",
- /* 214 */ "between_op ::= NOT BETWEEN",
- /* 215 */ "expr ::= expr between_op expr AND expr",
- /* 216 */ "in_op ::= IN",
- /* 217 */ "in_op ::= NOT IN",
- /* 218 */ "expr ::= expr in_op LP exprlist RP",
- /* 219 */ "expr ::= LP select RP",
- /* 220 */ "expr ::= expr in_op LP select RP",
- /* 221 */ "expr ::= expr in_op nm dbnm",
- /* 222 */ "expr ::= EXISTS LP select RP",
- /* 223 */ "expr ::= CASE case_operand case_exprlist case_else END",
- /* 224 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
- /* 225 */ "case_exprlist ::= WHEN expr THEN expr",
- /* 226 */ "case_else ::= ELSE expr",
- /* 227 */ "case_else ::=",
- /* 228 */ "case_operand ::= expr",
- /* 229 */ "case_operand ::=",
- /* 230 */ "exprlist ::= nexprlist",
- /* 231 */ "exprlist ::=",
- /* 232 */ "nexprlist ::= nexprlist COMMA expr",
- /* 233 */ "nexprlist ::= expr",
- /* 234 */ "cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP",
- /* 235 */ "uniqueflag ::= UNIQUE",
- /* 236 */ "uniqueflag ::=",
- /* 237 */ "idxlist_opt ::=",
- /* 238 */ "idxlist_opt ::= LP idxlist RP",
- /* 239 */ "idxlist ::= idxlist COMMA idxitem collate sortorder",
- /* 240 */ "idxlist ::= idxitem collate sortorder",
- /* 241 */ "idxitem ::= nm",
- /* 242 */ "collate ::=",
- /* 243 */ "collate ::= COLLATE ids",
- /* 244 */ "cmd ::= DROP INDEX ifexists fullname",
- /* 245 */ "cmd ::= VACUUM",
- /* 246 */ "cmd ::= VACUUM nm",
- /* 247 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
- /* 248 */ "cmd ::= PRAGMA nm dbnm EQ ON",
- /* 249 */ "cmd ::= PRAGMA nm dbnm EQ DELETE",
- /* 250 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
- /* 251 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
- /* 252 */ "cmd ::= PRAGMA nm dbnm",
- /* 253 */ "nmnum ::= plus_num",
- /* 254 */ "nmnum ::= nm",
- /* 255 */ "plus_num ::= plus_opt number",
- /* 256 */ "minus_num ::= MINUS number",
- /* 257 */ "number ::= INTEGER|FLOAT",
- /* 258 */ "plus_opt ::= PLUS",
- /* 259 */ "plus_opt ::=",
- /* 260 */ "cmd ::= CREATE trigger_decl BEGIN trigger_cmd_list END",
- /* 261 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
- /* 262 */ "trigger_time ::= BEFORE",
- /* 263 */ "trigger_time ::= AFTER",
- /* 264 */ "trigger_time ::= INSTEAD OF",
- /* 265 */ "trigger_time ::=",
- /* 266 */ "trigger_event ::= DELETE|INSERT",
- /* 267 */ "trigger_event ::= UPDATE",
- /* 268 */ "trigger_event ::= UPDATE OF inscollist",
- /* 269 */ "foreach_clause ::=",
- /* 270 */ "foreach_clause ::= FOR EACH ROW",
- /* 271 */ "when_clause ::=",
- /* 272 */ "when_clause ::= WHEN expr",
- /* 273 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
- /* 274 */ "trigger_cmd_list ::=",
- /* 275 */ "trigger_cmd ::= UPDATE orconf nm SET setlist where_opt",
- /* 276 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP",
- /* 277 */ "trigger_cmd ::= insert_cmd INTO nm inscollist_opt select",
- /* 278 */ "trigger_cmd ::= DELETE FROM nm where_opt",
- /* 279 */ "trigger_cmd ::= select",
- /* 280 */ "expr ::= RAISE LP IGNORE RP",
- /* 281 */ "expr ::= RAISE LP raisetype COMMA nm RP",
- /* 282 */ "raisetype ::= ROLLBACK",
- /* 283 */ "raisetype ::= ABORT",
- /* 284 */ "raisetype ::= FAIL",
- /* 285 */ "cmd ::= DROP TRIGGER ifexists fullname",
- /* 286 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
- /* 287 */ "cmd ::= DETACH database_kw_opt expr",
- /* 288 */ "key_opt ::=",
- /* 289 */ "key_opt ::= KEY expr",
- /* 290 */ "database_kw_opt ::= DATABASE",
- /* 291 */ "database_kw_opt ::=",
- /* 292 */ "cmd ::= REINDEX",
- /* 293 */ "cmd ::= REINDEX nm dbnm",
- /* 294 */ "cmd ::= ANALYZE",
- /* 295 */ "cmd ::= ANALYZE nm dbnm",
- /* 296 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
- /* 297 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column",
- /* 298 */ "add_column_fullname ::= fullname",
- /* 299 */ "kwcolumn_opt ::=",
- /* 300 */ "kwcolumn_opt ::= COLUMNKW",
- /* 301 */ "cmd ::= create_vtab",
- /* 302 */ "cmd ::= create_vtab LP vtabarglist RP",
- /* 303 */ "create_vtab ::= CREATE VIRTUAL TABLE nm dbnm USING nm",
- /* 304 */ "vtabarglist ::= vtabarg",
- /* 305 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
- /* 306 */ "vtabarg ::=",
- /* 307 */ "vtabarg ::= vtabarg vtabargtoken",
- /* 308 */ "vtabargtoken ::= ANY",
- /* 309 */ "vtabargtoken ::= lp anylist RP",
- /* 310 */ "lp ::= LP",
- /* 311 */ "anylist ::=",
- /* 312 */ "anylist ::= anylist ANY",
+ /* 20 */ "savepoint_opt ::= SAVEPOINT",
+ /* 21 */ "savepoint_opt ::=",
+ /* 22 */ "cmd ::= SAVEPOINT nm",
+ /* 23 */ "cmd ::= RELEASE savepoint_opt nm",
+ /* 24 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm",
+ /* 25 */ "cmd ::= create_table create_table_args",
+ /* 26 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm",
+ /* 27 */ "createkw ::= CREATE",
+ /* 28 */ "ifnotexists ::=",
+ /* 29 */ "ifnotexists ::= IF NOT EXISTS",
+ /* 30 */ "temp ::= TEMP",
+ /* 31 */ "temp ::=",
+ /* 32 */ "create_table_args ::= LP columnlist conslist_opt RP",
+ /* 33 */ "create_table_args ::= AS select",
+ /* 34 */ "columnlist ::= columnlist COMMA column",
+ /* 35 */ "columnlist ::= column",
+ /* 36 */ "column ::= columnid type carglist",
+ /* 37 */ "columnid ::= nm",
+ /* 38 */ "id ::= ID",
+ /* 39 */ "id ::= INDEXED",
+ /* 40 */ "ids ::= ID|STRING",
+ /* 41 */ "nm ::= id",
+ /* 42 */ "nm ::= STRING",
+ /* 43 */ "nm ::= JOIN_KW",
+ /* 44 */ "type ::=",
+ /* 45 */ "type ::= typetoken",
+ /* 46 */ "typetoken ::= typename",
+ /* 47 */ "typetoken ::= typename LP signed RP",
+ /* 48 */ "typetoken ::= typename LP signed COMMA signed RP",
+ /* 49 */ "typename ::= ids",
+ /* 50 */ "typename ::= typename ids",
+ /* 51 */ "signed ::= plus_num",
+ /* 52 */ "signed ::= minus_num",
+ /* 53 */ "carglist ::= carglist carg",
+ /* 54 */ "carglist ::=",
+ /* 55 */ "carg ::= CONSTRAINT nm ccons",
+ /* 56 */ "carg ::= ccons",
+ /* 57 */ "ccons ::= DEFAULT term",
+ /* 58 */ "ccons ::= DEFAULT LP expr RP",
+ /* 59 */ "ccons ::= DEFAULT PLUS term",
+ /* 60 */ "ccons ::= DEFAULT MINUS term",
+ /* 61 */ "ccons ::= DEFAULT id",
+ /* 62 */ "ccons ::= NULL onconf",
+ /* 63 */ "ccons ::= NOT NULL onconf",
+ /* 64 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
+ /* 65 */ "ccons ::= UNIQUE onconf",
+ /* 66 */ "ccons ::= CHECK LP expr RP",
+ /* 67 */ "ccons ::= REFERENCES nm idxlist_opt refargs",
+ /* 68 */ "ccons ::= defer_subclause",
+ /* 69 */ "ccons ::= COLLATE ids",
+ /* 70 */ "autoinc ::=",
+ /* 71 */ "autoinc ::= AUTOINCR",
+ /* 72 */ "refargs ::=",
+ /* 73 */ "refargs ::= refargs refarg",
+ /* 74 */ "refarg ::= MATCH nm",
+ /* 75 */ "refarg ::= ON DELETE refact",
+ /* 76 */ "refarg ::= ON UPDATE refact",
+ /* 77 */ "refact ::= SET NULL",
+ /* 78 */ "refact ::= SET DEFAULT",
+ /* 79 */ "refact ::= CASCADE",
+ /* 80 */ "refact ::= RESTRICT",
+ /* 81 */ "refact ::= NO ACTION",
+ /* 82 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
+ /* 83 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
+ /* 84 */ "init_deferred_pred_opt ::=",
+ /* 85 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
+ /* 86 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
+ /* 87 */ "conslist_opt ::=",
+ /* 88 */ "conslist_opt ::= COMMA conslist",
+ /* 89 */ "conslist ::= conslist COMMA tcons",
+ /* 90 */ "conslist ::= conslist tcons",
+ /* 91 */ "conslist ::= tcons",
+ /* 92 */ "tcons ::= CONSTRAINT nm",
+ /* 93 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf",
+ /* 94 */ "tcons ::= UNIQUE LP idxlist RP onconf",
+ /* 95 */ "tcons ::= CHECK LP expr RP onconf",
+ /* 96 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt",
+ /* 97 */ "defer_subclause_opt ::=",
+ /* 98 */ "defer_subclause_opt ::= defer_subclause",
+ /* 99 */ "onconf ::=",
+ /* 100 */ "onconf ::= ON CONFLICT resolvetype",
+ /* 101 */ "orconf ::=",
+ /* 102 */ "orconf ::= OR resolvetype",
+ /* 103 */ "resolvetype ::= raisetype",
+ /* 104 */ "resolvetype ::= IGNORE",
+ /* 105 */ "resolvetype ::= REPLACE",
+ /* 106 */ "cmd ::= DROP TABLE ifexists fullname",
+ /* 107 */ "ifexists ::= IF EXISTS",
+ /* 108 */ "ifexists ::=",
+ /* 109 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select",
+ /* 110 */ "cmd ::= DROP VIEW ifexists fullname",
+ /* 111 */ "cmd ::= select",
+ /* 112 */ "select ::= oneselect",
+ /* 113 */ "select ::= select multiselect_op oneselect",
+ /* 114 */ "multiselect_op ::= UNION",
+ /* 115 */ "multiselect_op ::= UNION ALL",
+ /* 116 */ "multiselect_op ::= EXCEPT|INTERSECT",
+ /* 117 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
+ /* 118 */ "distinct ::= DISTINCT",
+ /* 119 */ "distinct ::= ALL",
+ /* 120 */ "distinct ::=",
+ /* 121 */ "sclp ::= selcollist COMMA",
+ /* 122 */ "sclp ::=",
+ /* 123 */ "selcollist ::= sclp expr as",
+ /* 124 */ "selcollist ::= sclp STAR",
+ /* 125 */ "selcollist ::= sclp nm DOT STAR",
+ /* 126 */ "as ::= AS nm",
+ /* 127 */ "as ::= ids",
+ /* 128 */ "as ::=",
+ /* 129 */ "from ::=",
+ /* 130 */ "from ::= FROM seltablist",
+ /* 131 */ "stl_prefix ::= seltablist joinop",
+ /* 132 */ "stl_prefix ::=",
+ /* 133 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
+ /* 134 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
+ /* 135 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
+ /* 136 */ "dbnm ::=",
+ /* 137 */ "dbnm ::= DOT nm",
+ /* 138 */ "fullname ::= nm dbnm",
+ /* 139 */ "joinop ::= COMMA|JOIN",
+ /* 140 */ "joinop ::= JOIN_KW JOIN",
+ /* 141 */ "joinop ::= JOIN_KW nm JOIN",
+ /* 142 */ "joinop ::= JOIN_KW nm nm JOIN",
+ /* 143 */ "on_opt ::= ON expr",
+ /* 144 */ "on_opt ::=",
+ /* 145 */ "indexed_opt ::=",
+ /* 146 */ "indexed_opt ::= INDEXED BY nm",
+ /* 147 */ "indexed_opt ::= NOT INDEXED",
+ /* 148 */ "using_opt ::= USING LP inscollist RP",
+ /* 149 */ "using_opt ::=",
+ /* 150 */ "orderby_opt ::=",
+ /* 151 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 152 */ "sortlist ::= sortlist COMMA sortitem sortorder",
+ /* 153 */ "sortlist ::= sortitem sortorder",
+ /* 154 */ "sortitem ::= expr",
+ /* 155 */ "sortorder ::= ASC",
+ /* 156 */ "sortorder ::= DESC",
+ /* 157 */ "sortorder ::=",
+ /* 158 */ "groupby_opt ::=",
+ /* 159 */ "groupby_opt ::= GROUP BY nexprlist",
+ /* 160 */ "having_opt ::=",
+ /* 161 */ "having_opt ::= HAVING expr",
+ /* 162 */ "limit_opt ::=",
+ /* 163 */ "limit_opt ::= LIMIT expr",
+ /* 164 */ "limit_opt ::= LIMIT expr OFFSET expr",
+ /* 165 */ "limit_opt ::= LIMIT expr COMMA expr",
+ /* 166 */ "cmd ::= DELETE FROM fullname indexed_opt where_opt",
+ /* 167 */ "where_opt ::=",
+ /* 168 */ "where_opt ::= WHERE expr",
+ /* 169 */ "cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt",
+ /* 170 */ "setlist ::= setlist COMMA nm EQ expr",
+ /* 171 */ "setlist ::= nm EQ expr",
+ /* 172 */ "cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP",
+ /* 173 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select",
+ /* 174 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES",
+ /* 175 */ "insert_cmd ::= INSERT orconf",
+ /* 176 */ "insert_cmd ::= REPLACE",
+ /* 177 */ "itemlist ::= itemlist COMMA expr",
+ /* 178 */ "itemlist ::= expr",
+ /* 179 */ "inscollist_opt ::=",
+ /* 180 */ "inscollist_opt ::= LP inscollist RP",
+ /* 181 */ "inscollist ::= inscollist COMMA nm",
+ /* 182 */ "inscollist ::= nm",
+ /* 183 */ "expr ::= term",
+ /* 184 */ "expr ::= LP expr RP",
+ /* 185 */ "term ::= NULL",
+ /* 186 */ "expr ::= id",
+ /* 187 */ "expr ::= JOIN_KW",
+ /* 188 */ "expr ::= nm DOT nm",
+ /* 189 */ "expr ::= nm DOT nm DOT nm",
+ /* 190 */ "term ::= INTEGER|FLOAT|BLOB",
+ /* 191 */ "term ::= STRING",
+ /* 192 */ "expr ::= REGISTER",
+ /* 193 */ "expr ::= VARIABLE",
+ /* 194 */ "expr ::= expr COLLATE ids",
+ /* 195 */ "expr ::= CAST LP expr AS typetoken RP",
+ /* 196 */ "expr ::= ID LP distinct exprlist RP",
+ /* 197 */ "expr ::= ID LP STAR RP",
+ /* 198 */ "term ::= CTIME_KW",
+ /* 199 */ "expr ::= expr AND expr",
+ /* 200 */ "expr ::= expr OR expr",
+ /* 201 */ "expr ::= expr LT|GT|GE|LE expr",
+ /* 202 */ "expr ::= expr EQ|NE expr",
+ /* 203 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
+ /* 204 */ "expr ::= expr PLUS|MINUS expr",
+ /* 205 */ "expr ::= expr STAR|SLASH|REM expr",
+ /* 206 */ "expr ::= expr CONCAT expr",
+ /* 207 */ "likeop ::= LIKE_KW",
+ /* 208 */ "likeop ::= NOT LIKE_KW",
+ /* 209 */ "likeop ::= MATCH",
+ /* 210 */ "likeop ::= NOT MATCH",
+ /* 211 */ "escape ::= ESCAPE expr",
+ /* 212 */ "escape ::=",
+ /* 213 */ "expr ::= expr likeop expr escape",
+ /* 214 */ "expr ::= expr ISNULL|NOTNULL",
+ /* 215 */ "expr ::= expr NOT NULL",
+ /* 216 */ "expr ::= expr IS expr",
+ /* 217 */ "expr ::= expr IS NOT expr",
+ /* 218 */ "expr ::= NOT expr",
+ /* 219 */ "expr ::= BITNOT expr",
+ /* 220 */ "expr ::= MINUS expr",
+ /* 221 */ "expr ::= PLUS expr",
+ /* 222 */ "between_op ::= BETWEEN",
+ /* 223 */ "between_op ::= NOT BETWEEN",
+ /* 224 */ "expr ::= expr between_op expr AND expr",
+ /* 225 */ "in_op ::= IN",
+ /* 226 */ "in_op ::= NOT IN",
+ /* 227 */ "expr ::= expr in_op LP exprlist RP",
+ /* 228 */ "expr ::= LP select RP",
+ /* 229 */ "expr ::= expr in_op LP select RP",
+ /* 230 */ "expr ::= expr in_op nm dbnm",
+ /* 231 */ "expr ::= EXISTS LP select RP",
+ /* 232 */ "expr ::= CASE case_operand case_exprlist case_else END",
+ /* 233 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
+ /* 234 */ "case_exprlist ::= WHEN expr THEN expr",
+ /* 235 */ "case_else ::= ELSE expr",
+ /* 236 */ "case_else ::=",
+ /* 237 */ "case_operand ::= expr",
+ /* 238 */ "case_operand ::=",
+ /* 239 */ "exprlist ::= nexprlist",
+ /* 240 */ "exprlist ::=",
+ /* 241 */ "nexprlist ::= nexprlist COMMA expr",
+ /* 242 */ "nexprlist ::= expr",
+ /* 243 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP",
+ /* 244 */ "uniqueflag ::= UNIQUE",
+ /* 245 */ "uniqueflag ::=",
+ /* 246 */ "idxlist_opt ::=",
+ /* 247 */ "idxlist_opt ::= LP idxlist RP",
+ /* 248 */ "idxlist ::= idxlist COMMA nm collate sortorder",
+ /* 249 */ "idxlist ::= nm collate sortorder",
+ /* 250 */ "collate ::=",
+ /* 251 */ "collate ::= COLLATE ids",
+ /* 252 */ "cmd ::= DROP INDEX ifexists fullname",
+ /* 253 */ "cmd ::= VACUUM",
+ /* 254 */ "cmd ::= VACUUM nm",
+ /* 255 */ "cmd ::= PRAGMA nm dbnm",
+ /* 256 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
+ /* 257 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
+ /* 258 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
+ /* 259 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
+ /* 260 */ "nmnum ::= plus_num",
+ /* 261 */ "nmnum ::= nm",
+ /* 262 */ "nmnum ::= ON",
+ /* 263 */ "nmnum ::= DELETE",
+ /* 264 */ "nmnum ::= DEFAULT",
+ /* 265 */ "plus_num ::= plus_opt number",
+ /* 266 */ "minus_num ::= MINUS number",
+ /* 267 */ "number ::= INTEGER|FLOAT",
+ /* 268 */ "plus_opt ::= PLUS",
+ /* 269 */ "plus_opt ::=",
+ /* 270 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
+ /* 271 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
+ /* 272 */ "trigger_time ::= BEFORE",
+ /* 273 */ "trigger_time ::= AFTER",
+ /* 274 */ "trigger_time ::= INSTEAD OF",
+ /* 275 */ "trigger_time ::=",
+ /* 276 */ "trigger_event ::= DELETE|INSERT",
+ /* 277 */ "trigger_event ::= UPDATE",
+ /* 278 */ "trigger_event ::= UPDATE OF inscollist",
+ /* 279 */ "foreach_clause ::=",
+ /* 280 */ "foreach_clause ::= FOR EACH ROW",
+ /* 281 */ "when_clause ::=",
+ /* 282 */ "when_clause ::= WHEN expr",
+ /* 283 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
+ /* 284 */ "trigger_cmd_list ::= trigger_cmd SEMI",
+ /* 285 */ "trnm ::= nm",
+ /* 286 */ "trnm ::= nm DOT nm",
+ /* 287 */ "tridxby ::=",
+ /* 288 */ "tridxby ::= INDEXED BY nm",
+ /* 289 */ "tridxby ::= NOT INDEXED",
+ /* 290 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
+ /* 291 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP",
+ /* 292 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select",
+ /* 293 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
+ /* 294 */ "trigger_cmd ::= select",
+ /* 295 */ "expr ::= RAISE LP IGNORE RP",
+ /* 296 */ "expr ::= RAISE LP raisetype COMMA nm RP",
+ /* 297 */ "raisetype ::= ROLLBACK",
+ /* 298 */ "raisetype ::= ABORT",
+ /* 299 */ "raisetype ::= FAIL",
+ /* 300 */ "cmd ::= DROP TRIGGER ifexists fullname",
+ /* 301 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
+ /* 302 */ "cmd ::= DETACH database_kw_opt expr",
+ /* 303 */ "key_opt ::=",
+ /* 304 */ "key_opt ::= KEY expr",
+ /* 305 */ "database_kw_opt ::= DATABASE",
+ /* 306 */ "database_kw_opt ::=",
+ /* 307 */ "cmd ::= REINDEX",
+ /* 308 */ "cmd ::= REINDEX nm dbnm",
+ /* 309 */ "cmd ::= ANALYZE",
+ /* 310 */ "cmd ::= ANALYZE nm dbnm",
+ /* 311 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
+ /* 312 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column",
+ /* 313 */ "add_column_fullname ::= fullname",
+ /* 314 */ "kwcolumn_opt ::=",
+ /* 315 */ "kwcolumn_opt ::= COLUMNKW",
+ /* 316 */ "cmd ::= create_vtab",
+ /* 317 */ "cmd ::= create_vtab LP vtabarglist RP",
+ /* 318 */ "create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm",
+ /* 319 */ "vtabarglist ::= vtabarg",
+ /* 320 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
+ /* 321 */ "vtabarg ::=",
+ /* 322 */ "vtabarg ::= vtabarg vtabargtoken",
+ /* 323 */ "vtabargtoken ::= ANY",
+ /* 324 */ "vtabargtoken ::= lp anylist RP",
+ /* 325 */ "lp ::= LP",
+ /* 326 */ "anylist ::=",
+ /* 327 */ "anylist ::= anylist LP anylist RP",
+ /* 328 */ "anylist ::= anylist ANY",
};
#endif /* NDEBUG */
@@ -74161,7 +91275,12 @@ SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(size_t)){
pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
if( pParser ){
pParser->yyidx = -1;
+#ifdef YYTRACKMAXSTACKDEPTH
+ pParser->yyidxMax = 0;
+#endif
#if YYSTACKDEPTH<=0
+ pParser->yystack = NULL;
+ pParser->yystksz = 0;
yyGrowStack(pParser);
#endif
}
@@ -74173,7 +91292,12 @@ SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(size_t)){
** "yymajor" is the symbol code, and "yypminor" is a pointer to
** the value.
*/
-static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){
+static void yy_destructor(
+ yyParser *yypParser, /* The parser */
+ YYCODETYPE yymajor, /* Type code for object to destroy */
+ YYMINORTYPE *yypminor /* The object to be destroyed */
+){
+ sqlite3ParserARG_FETCH;
switch( yymajor ){
/* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen
@@ -74185,184 +91309,71 @@ static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){
** which appear on the RHS of the rule, but which are not used
** inside the C code.
*/
- case 155: /* select */
-{
-sqlite3SelectDelete((yypminor->yy219));
-}
- break;
- case 169: /* term */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 170: /* expr */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 174: /* idxlist_opt */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 182: /* idxlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 188: /* fullname */
-{
-sqlite3SrcListDelete((yypminor->yy373));
-}
- break;
- case 189: /* oneselect */
-{
-sqlite3SelectDelete((yypminor->yy219));
-}
- break;
- case 192: /* selcollist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 193: /* from */
-{
-sqlite3SrcListDelete((yypminor->yy373));
-}
- break;
- case 194: /* where_opt */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 195: /* groupby_opt */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 196: /* having_opt */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 197: /* orderby_opt */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 199: /* sclp */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 201: /* seltablist */
+ case 160: /* select */
+ case 194: /* oneselect */
{
-sqlite3SrcListDelete((yypminor->yy373));
+sqlite3SelectDelete(pParse->db, (yypminor->yy3));
}
break;
- case 202: /* stl_prefix */
+ case 174: /* term */
+ case 175: /* expr */
+ case 223: /* escape */
{
-sqlite3SrcListDelete((yypminor->yy373));
+sqlite3ExprDelete(pParse->db, (yypminor->yy346).pExpr);
}
break;
- case 204: /* on_opt */
+ case 179: /* idxlist_opt */
+ case 187: /* idxlist */
+ case 197: /* selcollist */
+ case 200: /* groupby_opt */
+ case 202: /* orderby_opt */
+ case 204: /* sclp */
+ case 214: /* sortlist */
+ case 216: /* nexprlist */
+ case 217: /* setlist */
+ case 220: /* itemlist */
+ case 221: /* exprlist */
+ case 227: /* case_exprlist */
{
-sqlite3ExprDelete((yypminor->yy172));
+sqlite3ExprListDelete(pParse->db, (yypminor->yy14));
}
break;
- case 205: /* using_opt */
+ case 193: /* fullname */
+ case 198: /* from */
+ case 206: /* seltablist */
+ case 207: /* stl_prefix */
{
-sqlite3IdListDelete((yypminor->yy432));
+sqlite3SrcListDelete(pParse->db, (yypminor->yy65));
}
break;
- case 206: /* seltablist_paren */
+ case 199: /* where_opt */
+ case 201: /* having_opt */
+ case 210: /* on_opt */
+ case 215: /* sortitem */
+ case 226: /* case_operand */
+ case 228: /* case_else */
+ case 239: /* when_clause */
+ case 244: /* key_opt */
{
-sqlite3SelectDelete((yypminor->yy219));
+sqlite3ExprDelete(pParse->db, (yypminor->yy132));
}
break;
- case 208: /* inscollist */
+ case 211: /* using_opt */
+ case 213: /* inscollist */
+ case 219: /* inscollist_opt */
{
-sqlite3IdListDelete((yypminor->yy432));
+sqlite3IdListDelete(pParse->db, (yypminor->yy408));
}
break;
- case 209: /* sortlist */
+ case 235: /* trigger_cmd_list */
+ case 240: /* trigger_cmd */
{
-sqlite3ExprListDelete((yypminor->yy174));
+sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy473));
}
break;
- case 210: /* sortitem */
+ case 237: /* trigger_event */
{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 211: /* nexprlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 212: /* setlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 214: /* inscollist_opt */
-{
-sqlite3IdListDelete((yypminor->yy432));
-}
- break;
- case 215: /* itemlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 216: /* exprlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 218: /* escape */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 221: /* case_operand */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 222: /* case_exprlist */
-{
-sqlite3ExprListDelete((yypminor->yy174));
-}
- break;
- case 223: /* case_else */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 231: /* trigger_cmd_list */
-{
-sqlite3DeleteTriggerStep((yypminor->yy243));
-}
- break;
- case 233: /* trigger_event */
-{
-sqlite3IdListDelete((yypminor->yy370).b);
-}
- break;
- case 235: /* when_clause */
-{
-sqlite3ExprDelete((yypminor->yy172));
-}
- break;
- case 236: /* trigger_cmd */
-{
-sqlite3DeleteTriggerStep((yypminor->yy243));
-}
- break;
- case 238: /* key_opt */
-{
-sqlite3ExprDelete((yypminor->yy172));
+sqlite3IdListDelete(pParse->db, (yypminor->yy378).b);
}
break;
default: break; /* If no destructor action specified: do nothing */
@@ -74381,7 +91392,9 @@ static int yy_pop_parser_stack(yyParser *pParser){
YYCODETYPE yymajor;
yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];
- if( pParser->yyidx<0 ) return 0;
+ /* There is no mechanism by which the parser stack can be popped below
+ ** empty in SQLite. */
+ if( NEVER(pParser->yyidx<0) ) return 0;
#ifndef NDEBUG
if( yyTraceFILE && pParser->yyidx>=0 ){
fprintf(yyTraceFILE,"%sPopping %s\n",
@@ -74390,7 +91403,7 @@ static int yy_pop_parser_stack(yyParser *pParser){
}
#endif
yymajor = yytos->major;
- yy_destructor( yymajor, &yytos->minor);
+ yy_destructor(pParser, yymajor, &yytos->minor);
pParser->yyidx--;
return yymajor;
}
@@ -74412,7 +91425,9 @@ SQLITE_PRIVATE void sqlite3ParserFree(
void (*freeProc)(void*) /* Function used to reclaim memory */
){
yyParser *pParser = (yyParser*)p;
- if( pParser==0 ) return;
+ /* In SQLite, we never try to destroy a parser that was not successfully
+ ** created in the first place. */
+ if( NEVER(pParser==0) ) return;
while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
#if YYSTACKDEPTH<=0
free(pParser->yystack);
@@ -74421,6 +91436,16 @@ SQLITE_PRIVATE void sqlite3ParserFree(
}
/*
+** Return the peak depth of the stack for a parser.
+*/
+#ifdef YYTRACKMAXSTACKDEPTH
+SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){
+ yyParser *pParser = (yyParser*)p;
+ return pParser->yyidxMax;
+}
+#endif
+
+/*
** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead.
**
@@ -74441,9 +91466,11 @@ static int yy_find_shift_action(
assert( iLookAhead!=YYNOCODE );
i += iLookAhead;
if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
+ /* The user of ";" instead of "\000" as a statement terminator in SQLite
+ ** means that we always have a look-ahead token. */
if( iLookAhead>0 ){
#ifdef YYFALLBACK
- int iFallback; /* Fallback token */
+ YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
&& (iFallback = yyFallback[iLookAhead])!=0 ){
#ifndef NDEBUG
@@ -74526,6 +91553,7 @@ static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
/* Here code is inserted which will execute if the parser
** stack every overflows */
+ UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
sqlite3ErrorMsg(pParse, "parser stack overflow");
pParse->parseError = 1;
sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
@@ -74538,10 +91566,15 @@ static void yy_shift(
yyParser *yypParser, /* The parser to be shifted */
int yyNewState, /* The new state to shift in */
int yyMajor, /* The major token to shift in */
- YYMINORTYPE *yypMinor /* Pointer ot the minor token to shift in */
+ YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */
){
yyStackEntry *yytos;
yypParser->yyidx++;
+#ifdef YYTRACKMAXSTACKDEPTH
+ if( yypParser->yyidx>yypParser->yyidxMax ){
+ yypParser->yyidxMax = yypParser->yyidx;
+ }
+#endif
#if YYSTACKDEPTH>0
if( yypParser->yyidx>=YYSTACKDEPTH ){
yyStackOverflow(yypParser, yypMinor);
@@ -74557,8 +91590,8 @@ static void yy_shift(
}
#endif
yytos = &yypParser->yystack[yypParser->yyidx];
- yytos->stateno = yyNewState;
- yytos->major = yyMajor;
+ yytos->stateno = (YYACTIONTYPE)yyNewState;
+ yytos->major = (YYCODETYPE)yyMajor;
yytos->minor = *yypMinor;
#ifndef NDEBUG
if( yyTraceFILE && yypParser->yyidx>0 ){
@@ -74579,319 +91612,335 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
unsigned char nrhs; /* Number of right-hand side symbols in the rule */
} yyRuleInfo[] = {
- { 139, 1 },
- { 140, 2 },
- { 140, 1 },
{ 142, 1 },
- { 141, 1 },
- { 141, 3 },
- { 144, 0 },
+ { 143, 2 },
+ { 143, 1 },
{ 144, 1 },
{ 144, 3 },
- { 143, 3 },
- { 146, 0 },
- { 146, 1 },
- { 146, 2 },
{ 145, 0 },
{ 145, 1 },
- { 145, 1 },
- { 145, 1 },
- { 143, 2 },
- { 143, 2 },
- { 143, 2 },
- { 143, 2 },
- { 148, 6 },
- { 151, 0 },
- { 151, 3 },
- { 150, 1 },
- { 150, 0 },
- { 149, 4 },
+ { 145, 3 },
+ { 146, 1 },
+ { 147, 3 },
+ { 149, 0 },
+ { 149, 1 },
{ 149, 2 },
- { 153, 3 },
- { 153, 1 },
+ { 148, 0 },
+ { 148, 1 },
+ { 148, 1 },
+ { 148, 1 },
+ { 147, 2 },
+ { 147, 2 },
+ { 147, 2 },
+ { 151, 1 },
+ { 151, 0 },
+ { 147, 2 },
+ { 147, 3 },
+ { 147, 5 },
+ { 147, 2 },
+ { 152, 6 },
+ { 154, 1 },
+ { 156, 0 },
{ 156, 3 },
- { 157, 1 },
- { 160, 1 },
- { 161, 1 },
- { 147, 1 },
- { 147, 1 },
- { 147, 1 },
- { 158, 0 },
+ { 155, 1 },
+ { 155, 0 },
+ { 153, 4 },
+ { 153, 2 },
+ { 158, 3 },
{ 158, 1 },
+ { 161, 3 },
{ 162, 1 },
- { 162, 4 },
- { 162, 6 },
+ { 165, 1 },
+ { 165, 1 },
+ { 166, 1 },
+ { 150, 1 },
+ { 150, 1 },
+ { 150, 1 },
+ { 163, 0 },
{ 163, 1 },
- { 163, 2 },
- { 164, 1 },
- { 164, 1 },
- { 159, 2 },
- { 159, 0 },
- { 167, 3 },
{ 167, 1 },
- { 168, 2 },
- { 168, 4 },
- { 168, 3 },
- { 168, 3 },
- { 168, 2 },
- { 168, 2 },
- { 168, 3 },
- { 168, 5 },
- { 168, 2 },
- { 168, 4 },
- { 168, 4 },
+ { 167, 4 },
+ { 167, 6 },
{ 168, 1 },
{ 168, 2 },
- { 173, 0 },
+ { 169, 1 },
+ { 169, 1 },
+ { 164, 2 },
+ { 164, 0 },
+ { 172, 3 },
+ { 172, 1 },
+ { 173, 2 },
+ { 173, 4 },
+ { 173, 3 },
+ { 173, 3 },
+ { 173, 2 },
+ { 173, 2 },
+ { 173, 3 },
+ { 173, 5 },
+ { 173, 2 },
+ { 173, 4 },
+ { 173, 4 },
{ 173, 1 },
- { 175, 0 },
- { 175, 2 },
- { 177, 2 },
- { 177, 3 },
- { 177, 3 },
- { 177, 3 },
- { 178, 2 },
- { 178, 2 },
- { 178, 1 },
+ { 173, 2 },
+ { 178, 0 },
{ 178, 1 },
- { 176, 3 },
- { 176, 2 },
- { 179, 0 },
- { 179, 2 },
- { 179, 2 },
- { 154, 0 },
- { 154, 2 },
- { 180, 3 },
+ { 180, 0 },
{ 180, 2 },
- { 180, 1 },
- { 181, 2 },
- { 181, 7 },
- { 181, 5 },
- { 181, 5 },
- { 181, 10 },
- { 183, 0 },
+ { 182, 2 },
+ { 182, 3 },
+ { 182, 3 },
+ { 183, 2 },
+ { 183, 2 },
+ { 183, 1 },
{ 183, 1 },
- { 171, 0 },
- { 171, 3 },
+ { 183, 2 },
+ { 181, 3 },
+ { 181, 2 },
{ 184, 0 },
{ 184, 2 },
+ { 184, 2 },
+ { 159, 0 },
+ { 159, 2 },
+ { 185, 3 },
+ { 185, 2 },
{ 185, 1 },
- { 185, 1 },
- { 185, 1 },
- { 143, 4 },
- { 187, 2 },
- { 187, 0 },
- { 143, 8 },
- { 143, 4 },
- { 143, 1 },
- { 155, 1 },
- { 155, 3 },
+ { 186, 2 },
+ { 186, 7 },
+ { 186, 5 },
+ { 186, 5 },
+ { 186, 10 },
+ { 188, 0 },
+ { 188, 1 },
+ { 176, 0 },
+ { 176, 3 },
+ { 189, 0 },
+ { 189, 2 },
{ 190, 1 },
- { 190, 2 },
{ 190, 1 },
- { 189, 9 },
- { 191, 1 },
- { 191, 1 },
- { 191, 0 },
- { 199, 2 },
- { 199, 0 },
- { 192, 3 },
+ { 190, 1 },
+ { 147, 4 },
{ 192, 2 },
- { 192, 4 },
- { 200, 2 },
- { 200, 1 },
- { 200, 0 },
- { 193, 0 },
- { 193, 2 },
- { 202, 2 },
- { 202, 0 },
- { 201, 6 },
- { 201, 7 },
- { 206, 1 },
- { 206, 1 },
- { 152, 0 },
- { 152, 2 },
- { 188, 2 },
- { 203, 1 },
- { 203, 2 },
- { 203, 3 },
- { 203, 4 },
+ { 192, 0 },
+ { 147, 8 },
+ { 147, 4 },
+ { 147, 1 },
+ { 160, 1 },
+ { 160, 3 },
+ { 195, 1 },
+ { 195, 2 },
+ { 195, 1 },
+ { 194, 9 },
+ { 196, 1 },
+ { 196, 1 },
+ { 196, 0 },
{ 204, 2 },
{ 204, 0 },
- { 205, 4 },
- { 205, 0 },
- { 197, 0 },
{ 197, 3 },
- { 209, 4 },
- { 209, 2 },
- { 210, 1 },
- { 172, 1 },
- { 172, 1 },
- { 172, 0 },
- { 195, 0 },
- { 195, 3 },
- { 196, 0 },
- { 196, 2 },
+ { 197, 2 },
+ { 197, 4 },
+ { 205, 2 },
+ { 205, 1 },
+ { 205, 0 },
{ 198, 0 },
{ 198, 2 },
- { 198, 4 },
- { 198, 4 },
- { 143, 4 },
- { 194, 0 },
- { 194, 2 },
- { 143, 6 },
- { 212, 5 },
- { 212, 3 },
- { 143, 8 },
- { 143, 5 },
- { 143, 6 },
- { 213, 2 },
- { 213, 1 },
- { 215, 3 },
- { 215, 1 },
- { 214, 0 },
- { 214, 3 },
- { 208, 3 },
+ { 207, 2 },
+ { 207, 0 },
+ { 206, 7 },
+ { 206, 7 },
+ { 206, 7 },
+ { 157, 0 },
+ { 157, 2 },
+ { 193, 2 },
{ 208, 1 },
- { 170, 1 },
- { 170, 3 },
- { 169, 1 },
- { 170, 1 },
- { 170, 1 },
- { 170, 3 },
- { 170, 5 },
- { 169, 1 },
- { 169, 1 },
- { 170, 1 },
- { 170, 1 },
- { 170, 3 },
- { 170, 6 },
- { 170, 5 },
- { 170, 4 },
- { 169, 1 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 170, 3 },
- { 217, 1 },
- { 217, 2 },
- { 217, 1 },
- { 217, 2 },
+ { 208, 2 },
+ { 208, 3 },
+ { 208, 4 },
+ { 210, 2 },
+ { 210, 0 },
+ { 209, 0 },
+ { 209, 3 },
+ { 209, 2 },
+ { 211, 4 },
+ { 211, 0 },
+ { 202, 0 },
+ { 202, 3 },
+ { 214, 4 },
+ { 214, 2 },
+ { 215, 1 },
+ { 177, 1 },
+ { 177, 1 },
+ { 177, 0 },
+ { 200, 0 },
+ { 200, 3 },
+ { 201, 0 },
+ { 201, 2 },
+ { 203, 0 },
+ { 203, 2 },
+ { 203, 4 },
+ { 203, 4 },
+ { 147, 5 },
+ { 199, 0 },
+ { 199, 2 },
+ { 147, 7 },
+ { 217, 5 },
+ { 217, 3 },
+ { 147, 8 },
+ { 147, 5 },
+ { 147, 6 },
{ 218, 2 },
- { 218, 0 },
- { 170, 4 },
- { 170, 2 },
- { 170, 3 },
- { 170, 3 },
- { 170, 4 },
- { 170, 2 },
- { 170, 2 },
- { 170, 2 },
- { 170, 2 },
- { 219, 1 },
- { 219, 2 },
- { 170, 5 },
+ { 218, 1 },
+ { 220, 3 },
{ 220, 1 },
- { 220, 2 },
- { 170, 5 },
- { 170, 3 },
- { 170, 5 },
- { 170, 4 },
- { 170, 4 },
- { 170, 5 },
- { 222, 5 },
- { 222, 4 },
+ { 219, 0 },
+ { 219, 3 },
+ { 213, 3 },
+ { 213, 1 },
+ { 175, 1 },
+ { 175, 3 },
+ { 174, 1 },
+ { 175, 1 },
+ { 175, 1 },
+ { 175, 3 },
+ { 175, 5 },
+ { 174, 1 },
+ { 174, 1 },
+ { 175, 1 },
+ { 175, 1 },
+ { 175, 3 },
+ { 175, 6 },
+ { 175, 5 },
+ { 175, 4 },
+ { 174, 1 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 3 },
+ { 222, 1 },
+ { 222, 2 },
+ { 222, 1 },
+ { 222, 2 },
{ 223, 2 },
{ 223, 0 },
- { 221, 1 },
- { 221, 0 },
- { 216, 1 },
- { 216, 0 },
- { 211, 3 },
- { 211, 1 },
- { 143, 11 },
+ { 175, 4 },
+ { 175, 2 },
+ { 175, 3 },
+ { 175, 3 },
+ { 175, 4 },
+ { 175, 2 },
+ { 175, 2 },
+ { 175, 2 },
+ { 175, 2 },
{ 224, 1 },
- { 224, 0 },
- { 174, 0 },
- { 174, 3 },
- { 182, 5 },
- { 182, 3 },
+ { 224, 2 },
+ { 175, 5 },
{ 225, 1 },
+ { 225, 2 },
+ { 175, 5 },
+ { 175, 3 },
+ { 175, 5 },
+ { 175, 4 },
+ { 175, 4 },
+ { 175, 5 },
+ { 227, 5 },
+ { 227, 4 },
+ { 228, 2 },
+ { 228, 0 },
+ { 226, 1 },
{ 226, 0 },
- { 226, 2 },
- { 143, 4 },
- { 143, 1 },
- { 143, 2 },
- { 143, 5 },
- { 143, 5 },
- { 143, 5 },
- { 143, 5 },
- { 143, 6 },
- { 143, 3 },
- { 227, 1 },
- { 227, 1 },
- { 165, 2 },
- { 166, 2 },
+ { 221, 1 },
+ { 221, 0 },
+ { 216, 3 },
+ { 216, 1 },
+ { 147, 11 },
{ 229, 1 },
- { 228, 1 },
- { 228, 0 },
- { 143, 5 },
- { 230, 11 },
- { 232, 1 },
+ { 229, 0 },
+ { 179, 0 },
+ { 179, 3 },
+ { 187, 5 },
+ { 187, 3 },
+ { 230, 0 },
+ { 230, 2 },
+ { 147, 4 },
+ { 147, 1 },
+ { 147, 2 },
+ { 147, 3 },
+ { 147, 5 },
+ { 147, 6 },
+ { 147, 5 },
+ { 147, 6 },
+ { 231, 1 },
+ { 231, 1 },
+ { 231, 1 },
+ { 231, 1 },
+ { 231, 1 },
+ { 170, 2 },
+ { 171, 2 },
+ { 233, 1 },
{ 232, 1 },
- { 232, 2 },
{ 232, 0 },
- { 233, 1 },
- { 233, 1 },
- { 233, 3 },
- { 234, 0 },
- { 234, 3 },
- { 235, 0 },
- { 235, 2 },
- { 231, 3 },
- { 231, 0 },
- { 236, 6 },
- { 236, 8 },
- { 236, 5 },
- { 236, 4 },
+ { 147, 5 },
+ { 234, 11 },
{ 236, 1 },
- { 170, 4 },
- { 170, 6 },
- { 186, 1 },
- { 186, 1 },
- { 186, 1 },
- { 143, 4 },
- { 143, 6 },
- { 143, 3 },
- { 238, 0 },
- { 238, 2 },
+ { 236, 1 },
+ { 236, 2 },
+ { 236, 0 },
{ 237, 1 },
- { 237, 0 },
- { 143, 1 },
- { 143, 3 },
- { 143, 1 },
- { 143, 3 },
- { 143, 6 },
- { 143, 6 },
- { 239, 1 },
- { 240, 0 },
- { 240, 1 },
- { 143, 1 },
- { 143, 4 },
- { 241, 7 },
- { 242, 1 },
+ { 237, 1 },
+ { 237, 3 },
+ { 238, 0 },
+ { 238, 3 },
+ { 239, 0 },
+ { 239, 2 },
+ { 235, 3 },
+ { 235, 2 },
+ { 241, 1 },
+ { 241, 3 },
+ { 242, 0 },
{ 242, 3 },
+ { 242, 2 },
+ { 240, 7 },
+ { 240, 8 },
+ { 240, 5 },
+ { 240, 5 },
+ { 240, 1 },
+ { 175, 4 },
+ { 175, 6 },
+ { 191, 1 },
+ { 191, 1 },
+ { 191, 1 },
+ { 147, 4 },
+ { 147, 6 },
+ { 147, 3 },
+ { 244, 0 },
+ { 244, 2 },
+ { 243, 1 },
{ 243, 0 },
- { 243, 2 },
- { 244, 1 },
- { 244, 3 },
+ { 147, 1 },
+ { 147, 3 },
+ { 147, 1 },
+ { 147, 3 },
+ { 147, 6 },
+ { 147, 6 },
{ 245, 1 },
{ 246, 0 },
- { 246, 2 },
+ { 246, 1 },
+ { 147, 1 },
+ { 147, 4 },
+ { 247, 7 },
+ { 248, 1 },
+ { 248, 3 },
+ { 249, 0 },
+ { 249, 2 },
+ { 250, 1 },
+ { 250, 3 },
+ { 251, 1 },
+ { 252, 0 },
+ { 252, 4 },
+ { 252, 2 },
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -74946,987 +91995,1094 @@ static void yy_reduce(
** #line <lineno> <thisfile>
** break;
*/
- case 0: /* input ::= cmdlist */
- case 1: /* cmdlist ::= cmdlist ecmd */
- case 2: /* cmdlist ::= ecmd */
- case 4: /* ecmd ::= SEMI */
- case 5: /* ecmd ::= explain cmdx SEMI */
- case 10: /* trans_opt ::= */
- case 11: /* trans_opt ::= TRANSACTION */
- case 12: /* trans_opt ::= TRANSACTION nm */
- case 20: /* cmd ::= create_table create_table_args */
- case 28: /* columnlist ::= columnlist COMMA column */
- case 29: /* columnlist ::= column */
- case 37: /* type ::= */
- case 44: /* signed ::= plus_num */
- case 45: /* signed ::= minus_num */
- case 46: /* carglist ::= carglist carg */
- case 47: /* carglist ::= */
- case 48: /* carg ::= CONSTRAINT nm ccons */
- case 49: /* carg ::= ccons */
- case 55: /* ccons ::= NULL onconf */
- case 82: /* conslist ::= conslist COMMA tcons */
- case 83: /* conslist ::= conslist tcons */
- case 84: /* conslist ::= tcons */
- case 85: /* tcons ::= CONSTRAINT nm */
- case 258: /* plus_opt ::= PLUS */
- case 259: /* plus_opt ::= */
- case 269: /* foreach_clause ::= */
- case 270: /* foreach_clause ::= FOR EACH ROW */
- case 290: /* database_kw_opt ::= DATABASE */
- case 291: /* database_kw_opt ::= */
- case 299: /* kwcolumn_opt ::= */
- case 300: /* kwcolumn_opt ::= COLUMNKW */
- case 304: /* vtabarglist ::= vtabarg */
- case 305: /* vtabarglist ::= vtabarglist COMMA vtabarg */
- case 307: /* vtabarg ::= vtabarg vtabargtoken */
- case 311: /* anylist ::= */
-{
-}
- break;
- case 3: /* cmdx ::= cmd */
-{ sqlite3FinishCoding(pParse); }
- break;
- case 6: /* explain ::= */
+ case 5: /* explain ::= */
{ sqlite3BeginParse(pParse, 0); }
break;
- case 7: /* explain ::= EXPLAIN */
+ case 6: /* explain ::= EXPLAIN */
{ sqlite3BeginParse(pParse, 1); }
break;
- case 8: /* explain ::= EXPLAIN QUERY PLAN */
+ case 7: /* explain ::= EXPLAIN QUERY PLAN */
{ sqlite3BeginParse(pParse, 2); }
break;
+ case 8: /* cmdx ::= cmd */
+{ sqlite3FinishCoding(pParse); }
+ break;
case 9: /* cmd ::= BEGIN transtype trans_opt */
-{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy46);}
+{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy328);}
break;
case 13: /* transtype ::= */
-{yygotominor.yy46 = TK_DEFERRED;}
+{yygotominor.yy328 = TK_DEFERRED;}
break;
case 14: /* transtype ::= DEFERRED */
- case 15: /* transtype ::= IMMEDIATE */
- case 16: /* transtype ::= EXCLUSIVE */
- case 107: /* multiselect_op ::= UNION */
- case 109: /* multiselect_op ::= EXCEPT|INTERSECT */
-{yygotominor.yy46 = yymsp[0].major;}
+ case 15: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==15);
+ case 16: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==16);
+ case 114: /* multiselect_op ::= UNION */ yytestcase(yyruleno==114);
+ case 116: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==116);
+{yygotominor.yy328 = yymsp[0].major;}
break;
case 17: /* cmd ::= COMMIT trans_opt */
- case 18: /* cmd ::= END trans_opt */
+ case 18: /* cmd ::= END trans_opt */ yytestcase(yyruleno==18);
{sqlite3CommitTransaction(pParse);}
break;
case 19: /* cmd ::= ROLLBACK trans_opt */
{sqlite3RollbackTransaction(pParse);}
break;
- case 21: /* create_table ::= CREATE temp TABLE ifnotexists nm dbnm */
+ case 22: /* cmd ::= SAVEPOINT nm */
{
- sqlite3StartTable(pParse,&yymsp[-1].minor.yy410,&yymsp[0].minor.yy410,yymsp[-4].minor.yy46,0,0,yymsp[-2].minor.yy46);
+ sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0);
}
break;
- case 22: /* ifnotexists ::= */
- case 25: /* temp ::= */
- case 63: /* autoinc ::= */
- case 77: /* init_deferred_pred_opt ::= */
- case 79: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */
- case 90: /* defer_subclause_opt ::= */
- case 101: /* ifexists ::= */
- case 112: /* distinct ::= ALL */
- case 113: /* distinct ::= */
- case 213: /* between_op ::= BETWEEN */
- case 216: /* in_op ::= IN */
-{yygotominor.yy46 = 0;}
+ case 23: /* cmd ::= RELEASE savepoint_opt nm */
+{
+ sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0);
+}
break;
- case 23: /* ifnotexists ::= IF NOT EXISTS */
- case 24: /* temp ::= TEMP */
- case 64: /* autoinc ::= AUTOINCR */
- case 78: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */
- case 100: /* ifexists ::= IF EXISTS */
- case 111: /* distinct ::= DISTINCT */
- case 214: /* between_op ::= NOT BETWEEN */
- case 217: /* in_op ::= NOT IN */
-{yygotominor.yy46 = 1;}
+ case 24: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
+{
+ sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0);
+}
break;
- case 26: /* create_table_args ::= LP columnlist conslist_opt RP */
+ case 26: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
{
- sqlite3EndTable(pParse,&yymsp[-1].minor.yy410,&yymsp[0].minor.yy0,0);
+ sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy328,0,0,yymsp[-2].minor.yy328);
}
break;
- case 27: /* create_table_args ::= AS select */
+ case 27: /* createkw ::= CREATE */
{
- sqlite3EndTable(pParse,0,0,yymsp[0].minor.yy219);
- sqlite3SelectDelete(yymsp[0].minor.yy219);
+ pParse->db->lookaside.bEnabled = 0;
+ yygotominor.yy0 = yymsp[0].minor.yy0;
}
break;
- case 30: /* column ::= columnid type carglist */
+ case 28: /* ifnotexists ::= */
+ case 31: /* temp ::= */ yytestcase(yyruleno==31);
+ case 70: /* autoinc ::= */ yytestcase(yyruleno==70);
+ case 82: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ yytestcase(yyruleno==82);
+ case 84: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==84);
+ case 86: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ yytestcase(yyruleno==86);
+ case 97: /* defer_subclause_opt ::= */ yytestcase(yyruleno==97);
+ case 108: /* ifexists ::= */ yytestcase(yyruleno==108);
+ case 119: /* distinct ::= ALL */ yytestcase(yyruleno==119);
+ case 120: /* distinct ::= */ yytestcase(yyruleno==120);
+ case 222: /* between_op ::= BETWEEN */ yytestcase(yyruleno==222);
+ case 225: /* in_op ::= IN */ yytestcase(yyruleno==225);
+{yygotominor.yy328 = 0;}
+ break;
+ case 29: /* ifnotexists ::= IF NOT EXISTS */
+ case 30: /* temp ::= TEMP */ yytestcase(yyruleno==30);
+ case 71: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==71);
+ case 85: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ yytestcase(yyruleno==85);
+ case 107: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==107);
+ case 118: /* distinct ::= DISTINCT */ yytestcase(yyruleno==118);
+ case 223: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==223);
+ case 226: /* in_op ::= NOT IN */ yytestcase(yyruleno==226);
+{yygotominor.yy328 = 1;}
+ break;
+ case 32: /* create_table_args ::= LP columnlist conslist_opt RP */
{
- yygotominor.yy410.z = yymsp[-2].minor.yy410.z;
- yygotominor.yy410.n = (pParse->sLastToken.z-yymsp[-2].minor.yy410.z) + pParse->sLastToken.n;
+ sqlite3EndTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0);
}
break;
- case 31: /* columnid ::= nm */
+ case 33: /* create_table_args ::= AS select */
{
- sqlite3AddColumn(pParse,&yymsp[0].minor.yy410);
- yygotominor.yy410 = yymsp[0].minor.yy410;
+ sqlite3EndTable(pParse,0,0,yymsp[0].minor.yy3);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3);
}
break;
- case 32: /* id ::= ID */
- case 33: /* ids ::= ID|STRING */
- case 34: /* nm ::= ID */
- case 35: /* nm ::= STRING */
- case 36: /* nm ::= JOIN_KW */
- case 257: /* number ::= INTEGER|FLOAT */
-{yygotominor.yy410 = yymsp[0].minor.yy0;}
+ case 36: /* column ::= columnid type carglist */
+{
+ yygotominor.yy0.z = yymsp[-2].minor.yy0.z;
+ yygotominor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-2].minor.yy0.z) + pParse->sLastToken.n;
+}
break;
- case 38: /* type ::= typetoken */
-{sqlite3AddColumnType(pParse,&yymsp[0].minor.yy410);}
+ case 37: /* columnid ::= nm */
+{
+ sqlite3AddColumn(pParse,&yymsp[0].minor.yy0);
+ yygotominor.yy0 = yymsp[0].minor.yy0;
+}
+ break;
+ case 38: /* id ::= ID */
+ case 39: /* id ::= INDEXED */ yytestcase(yyruleno==39);
+ case 40: /* ids ::= ID|STRING */ yytestcase(yyruleno==40);
+ case 41: /* nm ::= id */ yytestcase(yyruleno==41);
+ case 42: /* nm ::= STRING */ yytestcase(yyruleno==42);
+ case 43: /* nm ::= JOIN_KW */ yytestcase(yyruleno==43);
+ case 46: /* typetoken ::= typename */ yytestcase(yyruleno==46);
+ case 49: /* typename ::= ids */ yytestcase(yyruleno==49);
+ case 126: /* as ::= AS nm */ yytestcase(yyruleno==126);
+ case 127: /* as ::= ids */ yytestcase(yyruleno==127);
+ case 137: /* dbnm ::= DOT nm */ yytestcase(yyruleno==137);
+ case 146: /* indexed_opt ::= INDEXED BY nm */ yytestcase(yyruleno==146);
+ case 251: /* collate ::= COLLATE ids */ yytestcase(yyruleno==251);
+ case 260: /* nmnum ::= plus_num */ yytestcase(yyruleno==260);
+ case 261: /* nmnum ::= nm */ yytestcase(yyruleno==261);
+ case 262: /* nmnum ::= ON */ yytestcase(yyruleno==262);
+ case 263: /* nmnum ::= DELETE */ yytestcase(yyruleno==263);
+ case 264: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==264);
+ case 265: /* plus_num ::= plus_opt number */ yytestcase(yyruleno==265);
+ case 266: /* minus_num ::= MINUS number */ yytestcase(yyruleno==266);
+ case 267: /* number ::= INTEGER|FLOAT */ yytestcase(yyruleno==267);
+ case 285: /* trnm ::= nm */ yytestcase(yyruleno==285);
+{yygotominor.yy0 = yymsp[0].minor.yy0;}
break;
- case 39: /* typetoken ::= typename */
- case 42: /* typename ::= ids */
- case 119: /* as ::= AS nm */
- case 120: /* as ::= ids */
- case 131: /* dbnm ::= DOT nm */
- case 241: /* idxitem ::= nm */
- case 243: /* collate ::= COLLATE ids */
- case 253: /* nmnum ::= plus_num */
- case 254: /* nmnum ::= nm */
- case 255: /* plus_num ::= plus_opt number */
- case 256: /* minus_num ::= MINUS number */
-{yygotominor.yy410 = yymsp[0].minor.yy410;}
+ case 45: /* type ::= typetoken */
+{sqlite3AddColumnType(pParse,&yymsp[0].minor.yy0);}
break;
- case 40: /* typetoken ::= typename LP signed RP */
+ case 47: /* typetoken ::= typename LP signed RP */
{
- yygotominor.yy410.z = yymsp[-3].minor.yy410.z;
- yygotominor.yy410.n = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy410.z;
+ yygotominor.yy0.z = yymsp[-3].minor.yy0.z;
+ yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
}
break;
- case 41: /* typetoken ::= typename LP signed COMMA signed RP */
+ case 48: /* typetoken ::= typename LP signed COMMA signed RP */
{
- yygotominor.yy410.z = yymsp[-5].minor.yy410.z;
- yygotominor.yy410.n = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy410.z;
+ yygotominor.yy0.z = yymsp[-5].minor.yy0.z;
+ yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z);
}
break;
- case 43: /* typename ::= typename ids */
-{yygotominor.yy410.z=yymsp[-1].minor.yy410.z; yygotominor.yy410.n=yymsp[0].minor.yy410.n+(yymsp[0].minor.yy410.z-yymsp[-1].minor.yy410.z);}
+ case 50: /* typename ::= typename ids */
+{yygotominor.yy0.z=yymsp[-1].minor.yy0.z; yygotominor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
break;
- case 50: /* ccons ::= DEFAULT term */
- case 52: /* ccons ::= DEFAULT PLUS term */
-{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy172);}
+ case 57: /* ccons ::= DEFAULT term */
+ case 59: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==59);
+{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy346);}
break;
- case 51: /* ccons ::= DEFAULT LP expr RP */
-{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy172);}
+ case 58: /* ccons ::= DEFAULT LP expr RP */
+{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy346);}
break;
- case 53: /* ccons ::= DEFAULT MINUS term */
+ case 60: /* ccons ::= DEFAULT MINUS term */
{
- Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy172, 0, 0);
- sqlite3AddDefaultValue(pParse,p);
+ ExprSpan v;
+ v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy346.pExpr, 0, 0);
+ v.zStart = yymsp[-1].minor.yy0.z;
+ v.zEnd = yymsp[0].minor.yy346.zEnd;
+ sqlite3AddDefaultValue(pParse,&v);
}
break;
- case 54: /* ccons ::= DEFAULT id */
+ case 61: /* ccons ::= DEFAULT id */
{
- Expr *p = sqlite3PExpr(pParse, TK_STRING, 0, 0, &yymsp[0].minor.yy410);
- sqlite3AddDefaultValue(pParse,p);
+ ExprSpan v;
+ spanExpr(&v, pParse, TK_STRING, &yymsp[0].minor.yy0);
+ sqlite3AddDefaultValue(pParse,&v);
}
break;
- case 56: /* ccons ::= NOT NULL onconf */
-{sqlite3AddNotNull(pParse, yymsp[0].minor.yy46);}
+ case 63: /* ccons ::= NOT NULL onconf */
+{sqlite3AddNotNull(pParse, yymsp[0].minor.yy328);}
break;
- case 57: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
-{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy46,yymsp[0].minor.yy46,yymsp[-2].minor.yy46);}
+ case 64: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
+{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy328,yymsp[0].minor.yy328,yymsp[-2].minor.yy328);}
break;
- case 58: /* ccons ::= UNIQUE onconf */
-{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy46,0,0,0,0);}
+ case 65: /* ccons ::= UNIQUE onconf */
+{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy328,0,0,0,0);}
break;
- case 59: /* ccons ::= CHECK LP expr RP */
-{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy172);}
+ case 66: /* ccons ::= CHECK LP expr RP */
+{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy346.pExpr);}
break;
- case 60: /* ccons ::= REFERENCES nm idxlist_opt refargs */
-{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy410,yymsp[-1].minor.yy174,yymsp[0].minor.yy46);}
+ case 67: /* ccons ::= REFERENCES nm idxlist_opt refargs */
+{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy14,yymsp[0].minor.yy328);}
break;
- case 61: /* ccons ::= defer_subclause */
-{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy46);}
+ case 68: /* ccons ::= defer_subclause */
+{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy328);}
break;
- case 62: /* ccons ::= COLLATE ids */
-{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy410);}
+ case 69: /* ccons ::= COLLATE ids */
+{sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
break;
- case 65: /* refargs ::= */
-{ yygotominor.yy46 = OE_Restrict * 0x010101; }
+ case 72: /* refargs ::= */
+{ yygotominor.yy328 = OE_None * 0x000101; }
break;
- case 66: /* refargs ::= refargs refarg */
-{ yygotominor.yy46 = (yymsp[-1].minor.yy46 & yymsp[0].minor.yy405.mask) | yymsp[0].minor.yy405.value; }
+ case 73: /* refargs ::= refargs refarg */
+{ yygotominor.yy328 = (yymsp[-1].minor.yy328 & ~yymsp[0].minor.yy429.mask) | yymsp[0].minor.yy429.value; }
break;
- case 67: /* refarg ::= MATCH nm */
-{ yygotominor.yy405.value = 0; yygotominor.yy405.mask = 0x000000; }
+ case 74: /* refarg ::= MATCH nm */
+{ yygotominor.yy429.value = 0; yygotominor.yy429.mask = 0x000000; }
break;
- case 68: /* refarg ::= ON DELETE refact */
-{ yygotominor.yy405.value = yymsp[0].minor.yy46; yygotominor.yy405.mask = 0x0000ff; }
+ case 75: /* refarg ::= ON DELETE refact */
+{ yygotominor.yy429.value = yymsp[0].minor.yy328; yygotominor.yy429.mask = 0x0000ff; }
break;
- case 69: /* refarg ::= ON UPDATE refact */
-{ yygotominor.yy405.value = yymsp[0].minor.yy46<<8; yygotominor.yy405.mask = 0x00ff00; }
+ case 76: /* refarg ::= ON UPDATE refact */
+{ yygotominor.yy429.value = yymsp[0].minor.yy328<<8; yygotominor.yy429.mask = 0x00ff00; }
break;
- case 70: /* refarg ::= ON INSERT refact */
-{ yygotominor.yy405.value = yymsp[0].minor.yy46<<16; yygotominor.yy405.mask = 0xff0000; }
+ case 77: /* refact ::= SET NULL */
+{ yygotominor.yy328 = OE_SetNull; }
break;
- case 71: /* refact ::= SET NULL */
-{ yygotominor.yy46 = OE_SetNull; }
+ case 78: /* refact ::= SET DEFAULT */
+{ yygotominor.yy328 = OE_SetDflt; }
break;
- case 72: /* refact ::= SET DEFAULT */
-{ yygotominor.yy46 = OE_SetDflt; }
+ case 79: /* refact ::= CASCADE */
+{ yygotominor.yy328 = OE_Cascade; }
break;
- case 73: /* refact ::= CASCADE */
-{ yygotominor.yy46 = OE_Cascade; }
+ case 80: /* refact ::= RESTRICT */
+{ yygotominor.yy328 = OE_Restrict; }
break;
- case 74: /* refact ::= RESTRICT */
-{ yygotominor.yy46 = OE_Restrict; }
+ case 81: /* refact ::= NO ACTION */
+{ yygotominor.yy328 = OE_None; }
break;
- case 75: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */
- case 76: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
- case 91: /* defer_subclause_opt ::= defer_subclause */
- case 93: /* onconf ::= ON CONFLICT resolvetype */
- case 95: /* orconf ::= OR resolvetype */
- case 96: /* resolvetype ::= raisetype */
- case 166: /* insert_cmd ::= INSERT orconf */
-{yygotominor.yy46 = yymsp[0].minor.yy46;}
+ case 83: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
+ case 98: /* defer_subclause_opt ::= defer_subclause */ yytestcase(yyruleno==98);
+ case 100: /* onconf ::= ON CONFLICT resolvetype */ yytestcase(yyruleno==100);
+ case 103: /* resolvetype ::= raisetype */ yytestcase(yyruleno==103);
+{yygotominor.yy328 = yymsp[0].minor.yy328;}
break;
- case 80: /* conslist_opt ::= */
-{yygotominor.yy410.n = 0; yygotominor.yy410.z = 0;}
+ case 87: /* conslist_opt ::= */
+{yygotominor.yy0.n = 0; yygotominor.yy0.z = 0;}
break;
- case 81: /* conslist_opt ::= COMMA conslist */
-{yygotominor.yy410 = yymsp[-1].minor.yy0;}
+ case 88: /* conslist_opt ::= COMMA conslist */
+{yygotominor.yy0 = yymsp[-1].minor.yy0;}
break;
- case 86: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */
-{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy174,yymsp[0].minor.yy46,yymsp[-2].minor.yy46,0);}
+ case 93: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */
+{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy14,yymsp[0].minor.yy328,yymsp[-2].minor.yy328,0);}
break;
- case 87: /* tcons ::= UNIQUE LP idxlist RP onconf */
-{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy174,yymsp[0].minor.yy46,0,0,0,0);}
+ case 94: /* tcons ::= UNIQUE LP idxlist RP onconf */
+{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy14,yymsp[0].minor.yy328,0,0,0,0);}
break;
- case 88: /* tcons ::= CHECK LP expr RP onconf */
-{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy172);}
+ case 95: /* tcons ::= CHECK LP expr RP onconf */
+{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy346.pExpr);}
break;
- case 89: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */
+ case 96: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */
{
- sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy174, &yymsp[-3].minor.yy410, yymsp[-2].minor.yy174, yymsp[-1].minor.yy46);
- sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy46);
+ sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy14, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy14, yymsp[-1].minor.yy328);
+ sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy328);
}
break;
- case 92: /* onconf ::= */
- case 94: /* orconf ::= */
-{yygotominor.yy46 = OE_Default;}
+ case 99: /* onconf ::= */
+{yygotominor.yy328 = OE_Default;}
+ break;
+ case 101: /* orconf ::= */
+{yygotominor.yy186 = OE_Default;}
+ break;
+ case 102: /* orconf ::= OR resolvetype */
+{yygotominor.yy186 = (u8)yymsp[0].minor.yy328;}
break;
- case 97: /* resolvetype ::= IGNORE */
-{yygotominor.yy46 = OE_Ignore;}
+ case 104: /* resolvetype ::= IGNORE */
+{yygotominor.yy328 = OE_Ignore;}
break;
- case 98: /* resolvetype ::= REPLACE */
- case 167: /* insert_cmd ::= REPLACE */
-{yygotominor.yy46 = OE_Replace;}
+ case 105: /* resolvetype ::= REPLACE */
+{yygotominor.yy328 = OE_Replace;}
break;
- case 99: /* cmd ::= DROP TABLE ifexists fullname */
+ case 106: /* cmd ::= DROP TABLE ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy373, 0, yymsp[-1].minor.yy46);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy65, 0, yymsp[-1].minor.yy328);
}
break;
- case 102: /* cmd ::= CREATE temp VIEW ifnotexists nm dbnm AS select */
+ case 109: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select */
{
- sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy410, &yymsp[-2].minor.yy410, yymsp[0].minor.yy219, yymsp[-6].minor.yy46, yymsp[-4].minor.yy46);
+ sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, yymsp[0].minor.yy3, yymsp[-6].minor.yy328, yymsp[-4].minor.yy328);
}
break;
- case 103: /* cmd ::= DROP VIEW ifexists fullname */
+ case 110: /* cmd ::= DROP VIEW ifexists fullname */
{
- sqlite3DropTable(pParse, yymsp[0].minor.yy373, 1, yymsp[-1].minor.yy46);
+ sqlite3DropTable(pParse, yymsp[0].minor.yy65, 1, yymsp[-1].minor.yy328);
}
break;
- case 104: /* cmd ::= select */
+ case 111: /* cmd ::= select */
{
- SelectDest dest = {SRT_Callback, 0, 0, 0, 0};
- sqlite3Select(pParse, yymsp[0].minor.yy219, &dest, 0, 0, 0, 0);
- sqlite3SelectDelete(yymsp[0].minor.yy219);
+ SelectDest dest = {SRT_Output, 0, 0, 0, 0};
+ sqlite3Select(pParse, yymsp[0].minor.yy3, &dest);
+ sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3);
}
break;
- case 105: /* select ::= oneselect */
- case 128: /* seltablist_paren ::= select */
-{yygotominor.yy219 = yymsp[0].minor.yy219;}
+ case 112: /* select ::= oneselect */
+{yygotominor.yy3 = yymsp[0].minor.yy3;}
break;
- case 106: /* select ::= select multiselect_op oneselect */
+ case 113: /* select ::= select multiselect_op oneselect */
{
- if( yymsp[0].minor.yy219 ){
- yymsp[0].minor.yy219->op = yymsp[-1].minor.yy46;
- yymsp[0].minor.yy219->pPrior = yymsp[-2].minor.yy219;
+ if( yymsp[0].minor.yy3 ){
+ yymsp[0].minor.yy3->op = (u8)yymsp[-1].minor.yy328;
+ yymsp[0].minor.yy3->pPrior = yymsp[-2].minor.yy3;
}else{
- sqlite3SelectDelete(yymsp[-2].minor.yy219);
+ sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy3);
}
- yygotominor.yy219 = yymsp[0].minor.yy219;
+ yygotominor.yy3 = yymsp[0].minor.yy3;
}
break;
- case 108: /* multiselect_op ::= UNION ALL */
-{yygotominor.yy46 = TK_ALL;}
+ case 115: /* multiselect_op ::= UNION ALL */
+{yygotominor.yy328 = TK_ALL;}
break;
- case 110: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
+ case 117: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
{
- yygotominor.yy219 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy174,yymsp[-5].minor.yy373,yymsp[-4].minor.yy172,yymsp[-3].minor.yy174,yymsp[-2].minor.yy172,yymsp[-1].minor.yy174,yymsp[-7].minor.yy46,yymsp[0].minor.yy234.pLimit,yymsp[0].minor.yy234.pOffset);
+ yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy14,yymsp[-5].minor.yy65,yymsp[-4].minor.yy132,yymsp[-3].minor.yy14,yymsp[-2].minor.yy132,yymsp[-1].minor.yy14,yymsp[-7].minor.yy328,yymsp[0].minor.yy476.pLimit,yymsp[0].minor.yy476.pOffset);
}
break;
- case 114: /* sclp ::= selcollist COMMA */
- case 238: /* idxlist_opt ::= LP idxlist RP */
-{yygotominor.yy174 = yymsp[-1].minor.yy174;}
+ case 121: /* sclp ::= selcollist COMMA */
+ case 247: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==247);
+{yygotominor.yy14 = yymsp[-1].minor.yy14;}
break;
- case 115: /* sclp ::= */
- case 141: /* orderby_opt ::= */
- case 149: /* groupby_opt ::= */
- case 231: /* exprlist ::= */
- case 237: /* idxlist_opt ::= */
-{yygotominor.yy174 = 0;}
+ case 122: /* sclp ::= */
+ case 150: /* orderby_opt ::= */ yytestcase(yyruleno==150);
+ case 158: /* groupby_opt ::= */ yytestcase(yyruleno==158);
+ case 240: /* exprlist ::= */ yytestcase(yyruleno==240);
+ case 246: /* idxlist_opt ::= */ yytestcase(yyruleno==246);
+{yygotominor.yy14 = 0;}
break;
- case 116: /* selcollist ::= sclp expr as */
+ case 123: /* selcollist ::= sclp expr as */
{
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy174,yymsp[-1].minor.yy172,yymsp[0].minor.yy410.n?&yymsp[0].minor.yy410:0);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy14, yymsp[-1].minor.yy346.pExpr);
+ if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[0].minor.yy0, 1);
+ sqlite3ExprListSetSpan(pParse,yygotominor.yy14,&yymsp[-1].minor.yy346);
}
break;
- case 117: /* selcollist ::= sclp STAR */
+ case 124: /* selcollist ::= sclp STAR */
{
- Expr *p = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0);
- yygotominor.yy174 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy174, p, 0);
+ Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy14, p);
}
break;
- case 118: /* selcollist ::= sclp nm DOT STAR */
+ case 125: /* selcollist ::= sclp nm DOT STAR */
{
- Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0);
- Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy410);
+ Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &yymsp[0].minor.yy0);
+ Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy174, pDot, 0);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14, pDot);
}
break;
- case 121: /* as ::= */
-{yygotominor.yy410.n = 0;}
+ case 128: /* as ::= */
+{yygotominor.yy0.n = 0;}
break;
- case 122: /* from ::= */
-{yygotominor.yy373 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy373));}
+ case 129: /* from ::= */
+{yygotominor.yy65 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy65));}
break;
- case 123: /* from ::= FROM seltablist */
+ case 130: /* from ::= FROM seltablist */
{
- yygotominor.yy373 = yymsp[0].minor.yy373;
- sqlite3SrcListShiftJoinType(yygotominor.yy373);
+ yygotominor.yy65 = yymsp[0].minor.yy65;
+ sqlite3SrcListShiftJoinType(yygotominor.yy65);
}
break;
- case 124: /* stl_prefix ::= seltablist joinop */
+ case 131: /* stl_prefix ::= seltablist joinop */
{
- yygotominor.yy373 = yymsp[-1].minor.yy373;
- if( yygotominor.yy373 && yygotominor.yy373->nSrc>0 ) yygotominor.yy373->a[yygotominor.yy373->nSrc-1].jointype = yymsp[0].minor.yy46;
+ yygotominor.yy65 = yymsp[-1].minor.yy65;
+ if( ALWAYS(yygotominor.yy65 && yygotominor.yy65->nSrc>0) ) yygotominor.yy65->a[yygotominor.yy65->nSrc-1].jointype = (u8)yymsp[0].minor.yy328;
}
break;
- case 125: /* stl_prefix ::= */
-{yygotominor.yy373 = 0;}
+ case 132: /* stl_prefix ::= */
+{yygotominor.yy65 = 0;}
break;
- case 126: /* seltablist ::= stl_prefix nm dbnm as on_opt using_opt */
+ case 133: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
{
- yygotominor.yy373 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy373,&yymsp[-4].minor.yy410,&yymsp[-3].minor.yy410,&yymsp[-2].minor.yy410,0,yymsp[-1].minor.yy172,yymsp[0].minor.yy432);
+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408);
+ sqlite3SrcListIndexedBy(pParse, yygotominor.yy65, &yymsp[-2].minor.yy0);
}
break;
- case 127: /* seltablist ::= stl_prefix LP seltablist_paren RP as on_opt using_opt */
+ case 134: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
{
- yygotominor.yy373 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy373,0,0,&yymsp[-2].minor.yy410,yymsp[-4].minor.yy219,yymsp[-1].minor.yy172,yymsp[0].minor.yy432);
+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy3,yymsp[-1].minor.yy132,yymsp[0].minor.yy408);
}
break;
- case 129: /* seltablist_paren ::= seltablist */
+ case 135: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
{
- sqlite3SrcListShiftJoinType(yymsp[0].minor.yy373);
- yygotominor.yy219 = sqlite3SelectNew(pParse,0,yymsp[0].minor.yy373,0,0,0,0,0,0,0);
+ if( yymsp[-6].minor.yy65==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy132==0 && yymsp[0].minor.yy408==0 ){
+ yygotominor.yy65 = yymsp[-4].minor.yy65;
+ }else{
+ Select *pSubquery;
+ sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy65);
+ pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy65,0,0,0,0,0,0,0);
+ yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy132,yymsp[0].minor.yy408);
+ }
}
break;
- case 130: /* dbnm ::= */
-{yygotominor.yy410.z=0; yygotominor.yy410.n=0;}
+ case 136: /* dbnm ::= */
+ case 145: /* indexed_opt ::= */ yytestcase(yyruleno==145);
+{yygotominor.yy0.z=0; yygotominor.yy0.n=0;}
+ break;
+ case 138: /* fullname ::= nm dbnm */
+{yygotominor.yy65 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
break;
- case 132: /* fullname ::= nm dbnm */
-{yygotominor.yy373 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy410,&yymsp[0].minor.yy410);}
+ case 139: /* joinop ::= COMMA|JOIN */
+{ yygotominor.yy328 = JT_INNER; }
break;
- case 133: /* joinop ::= COMMA|JOIN */
-{ yygotominor.yy46 = JT_INNER; }
+ case 140: /* joinop ::= JOIN_KW JOIN */
+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); }
break;
- case 134: /* joinop ::= JOIN_KW JOIN */
-{ yygotominor.yy46 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); }
+ case 141: /* joinop ::= JOIN_KW nm JOIN */
+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); }
break;
- case 135: /* joinop ::= JOIN_KW nm JOIN */
-{ yygotominor.yy46 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy410,0); }
+ case 142: /* joinop ::= JOIN_KW nm nm JOIN */
+{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); }
break;
- case 136: /* joinop ::= JOIN_KW nm nm JOIN */
-{ yygotominor.yy46 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy410,&yymsp[-1].minor.yy410); }
+ case 143: /* on_opt ::= ON expr */
+ case 154: /* sortitem ::= expr */ yytestcase(yyruleno==154);
+ case 161: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==161);
+ case 168: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==168);
+ case 235: /* case_else ::= ELSE expr */ yytestcase(yyruleno==235);
+ case 237: /* case_operand ::= expr */ yytestcase(yyruleno==237);
+{yygotominor.yy132 = yymsp[0].minor.yy346.pExpr;}
break;
- case 137: /* on_opt ::= ON expr */
- case 145: /* sortitem ::= expr */
- case 152: /* having_opt ::= HAVING expr */
- case 159: /* where_opt ::= WHERE expr */
- case 174: /* expr ::= term */
- case 202: /* escape ::= ESCAPE expr */
- case 226: /* case_else ::= ELSE expr */
- case 228: /* case_operand ::= expr */
-{yygotominor.yy172 = yymsp[0].minor.yy172;}
+ case 144: /* on_opt ::= */
+ case 160: /* having_opt ::= */ yytestcase(yyruleno==160);
+ case 167: /* where_opt ::= */ yytestcase(yyruleno==167);
+ case 236: /* case_else ::= */ yytestcase(yyruleno==236);
+ case 238: /* case_operand ::= */ yytestcase(yyruleno==238);
+{yygotominor.yy132 = 0;}
break;
- case 138: /* on_opt ::= */
- case 151: /* having_opt ::= */
- case 158: /* where_opt ::= */
- case 203: /* escape ::= */
- case 227: /* case_else ::= */
- case 229: /* case_operand ::= */
-{yygotominor.yy172 = 0;}
+ case 147: /* indexed_opt ::= NOT INDEXED */
+{yygotominor.yy0.z=0; yygotominor.yy0.n=1;}
break;
- case 139: /* using_opt ::= USING LP inscollist RP */
- case 171: /* inscollist_opt ::= LP inscollist RP */
-{yygotominor.yy432 = yymsp[-1].minor.yy432;}
+ case 148: /* using_opt ::= USING LP inscollist RP */
+ case 180: /* inscollist_opt ::= LP inscollist RP */ yytestcase(yyruleno==180);
+{yygotominor.yy408 = yymsp[-1].minor.yy408;}
break;
- case 140: /* using_opt ::= */
- case 170: /* inscollist_opt ::= */
-{yygotominor.yy432 = 0;}
+ case 149: /* using_opt ::= */
+ case 179: /* inscollist_opt ::= */ yytestcase(yyruleno==179);
+{yygotominor.yy408 = 0;}
break;
- case 142: /* orderby_opt ::= ORDER BY sortlist */
- case 150: /* groupby_opt ::= GROUP BY nexprlist */
- case 230: /* exprlist ::= nexprlist */
-{yygotominor.yy174 = yymsp[0].minor.yy174;}
+ case 151: /* orderby_opt ::= ORDER BY sortlist */
+ case 159: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==159);
+ case 239: /* exprlist ::= nexprlist */ yytestcase(yyruleno==239);
+{yygotominor.yy14 = yymsp[0].minor.yy14;}
break;
- case 143: /* sortlist ::= sortlist COMMA sortitem sortorder */
+ case 152: /* sortlist ::= sortlist COMMA sortitem sortorder */
{
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy174,yymsp[-1].minor.yy172,0);
- if( yygotominor.yy174 ) yygotominor.yy174->a[yygotominor.yy174->nExpr-1].sortOrder = yymsp[0].minor.yy46;
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14,yymsp[-1].minor.yy132);
+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328;
}
break;
- case 144: /* sortlist ::= sortitem sortorder */
+ case 153: /* sortlist ::= sortitem sortorder */
{
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy172,0);
- if( yygotominor.yy174 && yygotominor.yy174->a ) yygotominor.yy174->a[0].sortOrder = yymsp[0].minor.yy46;
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy132);
+ if( yygotominor.yy14 && ALWAYS(yygotominor.yy14->a) ) yygotominor.yy14->a[0].sortOrder = (u8)yymsp[0].minor.yy328;
}
break;
- case 146: /* sortorder ::= ASC */
- case 148: /* sortorder ::= */
-{yygotominor.yy46 = SQLITE_SO_ASC;}
+ case 155: /* sortorder ::= ASC */
+ case 157: /* sortorder ::= */ yytestcase(yyruleno==157);
+{yygotominor.yy328 = SQLITE_SO_ASC;}
+ break;
+ case 156: /* sortorder ::= DESC */
+{yygotominor.yy328 = SQLITE_SO_DESC;}
+ break;
+ case 162: /* limit_opt ::= */
+{yygotominor.yy476.pLimit = 0; yygotominor.yy476.pOffset = 0;}
break;
- case 147: /* sortorder ::= DESC */
-{yygotominor.yy46 = SQLITE_SO_DESC;}
+ case 163: /* limit_opt ::= LIMIT expr */
+{yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr; yygotominor.yy476.pOffset = 0;}
break;
- case 153: /* limit_opt ::= */
-{yygotominor.yy234.pLimit = 0; yygotominor.yy234.pOffset = 0;}
+ case 164: /* limit_opt ::= LIMIT expr OFFSET expr */
+{yygotominor.yy476.pLimit = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pOffset = yymsp[0].minor.yy346.pExpr;}
break;
- case 154: /* limit_opt ::= LIMIT expr */
-{yygotominor.yy234.pLimit = yymsp[0].minor.yy172; yygotominor.yy234.pOffset = 0;}
+ case 165: /* limit_opt ::= LIMIT expr COMMA expr */
+{yygotominor.yy476.pOffset = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr;}
break;
- case 155: /* limit_opt ::= LIMIT expr OFFSET expr */
-{yygotominor.yy234.pLimit = yymsp[-2].minor.yy172; yygotominor.yy234.pOffset = yymsp[0].minor.yy172;}
+ case 166: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */
+{
+ sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy65, &yymsp[-1].minor.yy0);
+ sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy65,yymsp[0].minor.yy132);
+}
break;
- case 156: /* limit_opt ::= LIMIT expr COMMA expr */
-{yygotominor.yy234.pOffset = yymsp[-2].minor.yy172; yygotominor.yy234.pLimit = yymsp[0].minor.yy172;}
+ case 169: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */
+{
+ sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy65, &yymsp[-3].minor.yy0);
+ sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy14,"set list");
+ sqlite3Update(pParse,yymsp[-4].minor.yy65,yymsp[-1].minor.yy14,yymsp[0].minor.yy132,yymsp[-5].minor.yy186);
+}
break;
- case 157: /* cmd ::= DELETE FROM fullname where_opt */
-{sqlite3DeleteFrom(pParse,yymsp[-1].minor.yy373,yymsp[0].minor.yy172);}
+ case 170: /* setlist ::= setlist COMMA nm EQ expr */
+{
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[0].minor.yy346.pExpr);
+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1);
+}
break;
- case 160: /* cmd ::= UPDATE orconf fullname SET setlist where_opt */
+ case 171: /* setlist ::= nm EQ expr */
{
- sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy174,"set list");
- sqlite3Update(pParse,yymsp[-3].minor.yy373,yymsp[-1].minor.yy174,yymsp[0].minor.yy172,yymsp[-4].minor.yy46);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy346.pExpr);
+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1);
}
break;
- case 161: /* setlist ::= setlist COMMA nm EQ expr */
-{yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy174,yymsp[0].minor.yy172,&yymsp[-2].minor.yy410);}
+ case 172: /* cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP */
+{sqlite3Insert(pParse, yymsp[-5].minor.yy65, yymsp[-1].minor.yy14, 0, yymsp[-4].minor.yy408, yymsp[-7].minor.yy186);}
break;
- case 162: /* setlist ::= nm EQ expr */
-{yygotominor.yy174 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy172,&yymsp[-2].minor.yy410);}
+ case 173: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */
+{sqlite3Insert(pParse, yymsp[-2].minor.yy65, 0, yymsp[0].minor.yy3, yymsp[-1].minor.yy408, yymsp[-4].minor.yy186);}
break;
- case 163: /* cmd ::= insert_cmd INTO fullname inscollist_opt VALUES LP itemlist RP */
-{sqlite3Insert(pParse, yymsp[-5].minor.yy373, yymsp[-1].minor.yy174, 0, yymsp[-4].minor.yy432, yymsp[-7].minor.yy46);}
+ case 174: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */
+{sqlite3Insert(pParse, yymsp[-3].minor.yy65, 0, 0, yymsp[-2].minor.yy408, yymsp[-5].minor.yy186);}
break;
- case 164: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */
-{sqlite3Insert(pParse, yymsp[-2].minor.yy373, 0, yymsp[0].minor.yy219, yymsp[-1].minor.yy432, yymsp[-4].minor.yy46);}
+ case 175: /* insert_cmd ::= INSERT orconf */
+{yygotominor.yy186 = yymsp[0].minor.yy186;}
break;
- case 165: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */
-{sqlite3Insert(pParse, yymsp[-3].minor.yy373, 0, 0, yymsp[-2].minor.yy432, yymsp[-5].minor.yy46);}
+ case 176: /* insert_cmd ::= REPLACE */
+{yygotominor.yy186 = OE_Replace;}
break;
- case 168: /* itemlist ::= itemlist COMMA expr */
- case 232: /* nexprlist ::= nexprlist COMMA expr */
-{yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy174,yymsp[0].minor.yy172,0);}
+ case 177: /* itemlist ::= itemlist COMMA expr */
+ case 241: /* nexprlist ::= nexprlist COMMA expr */ yytestcase(yyruleno==241);
+{yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[0].minor.yy346.pExpr);}
break;
- case 169: /* itemlist ::= expr */
- case 233: /* nexprlist ::= expr */
-{yygotominor.yy174 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy172,0);}
+ case 178: /* itemlist ::= expr */
+ case 242: /* nexprlist ::= expr */ yytestcase(yyruleno==242);
+{yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy346.pExpr);}
break;
- case 172: /* inscollist ::= inscollist COMMA nm */
-{yygotominor.yy432 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy432,&yymsp[0].minor.yy410);}
+ case 181: /* inscollist ::= inscollist COMMA nm */
+{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy408,&yymsp[0].minor.yy0);}
break;
- case 173: /* inscollist ::= nm */
-{yygotominor.yy432 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy410);}
+ case 182: /* inscollist ::= nm */
+{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);}
break;
- case 175: /* expr ::= LP expr RP */
-{yygotominor.yy172 = yymsp[-1].minor.yy172; sqlite3ExprSpan(yygotominor.yy172,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); }
+ case 183: /* expr ::= term */
+ case 211: /* escape ::= ESCAPE expr */ yytestcase(yyruleno==211);
+{yygotominor.yy346 = yymsp[0].minor.yy346;}
break;
- case 176: /* term ::= NULL */
- case 181: /* term ::= INTEGER|FLOAT|BLOB */
- case 182: /* term ::= STRING */
-{yygotominor.yy172 = sqlite3PExpr(pParse, yymsp[0].major, 0, 0, &yymsp[0].minor.yy0);}
+ case 184: /* expr ::= LP expr RP */
+{yygotominor.yy346.pExpr = yymsp[-1].minor.yy346.pExpr; spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);}
break;
- case 177: /* expr ::= ID */
- case 178: /* expr ::= JOIN_KW */
-{yygotominor.yy172 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0);}
+ case 185: /* term ::= NULL */
+ case 190: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==190);
+ case 191: /* term ::= STRING */ yytestcase(yyruleno==191);
+{spanExpr(&yygotominor.yy346, pParse, yymsp[0].major, &yymsp[0].minor.yy0);}
break;
- case 179: /* expr ::= nm DOT nm */
+ case 186: /* expr ::= id */
+ case 187: /* expr ::= JOIN_KW */ yytestcase(yyruleno==187);
+{spanExpr(&yygotominor.yy346, pParse, TK_ID, &yymsp[0].minor.yy0);}
+ break;
+ case 188: /* expr ::= nm DOT nm */
{
- Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy410);
- Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy410);
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
+ Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
+ Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
+ spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);
}
break;
- case 180: /* expr ::= nm DOT nm DOT nm */
+ case 189: /* expr ::= nm DOT nm DOT nm */
{
- Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy410);
- Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy410);
- Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy410);
+ Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy0);
+ Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
+ Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0);
Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
+ spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
}
break;
- case 183: /* expr ::= REGISTER */
-{yygotominor.yy172 = sqlite3RegisterExpr(pParse, &yymsp[0].minor.yy0);}
+ case 192: /* expr ::= REGISTER */
+{
+ /* When doing a nested parse, one can include terms in an expression
+ ** that look like this: #1 #2 ... These terms refer to registers
+ ** in the virtual machine. #N is the N-th register. */
+ if( pParse->nested==0 ){
+ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = 0;
+ }else{
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &yymsp[0].minor.yy0);
+ if( yygotominor.yy346.pExpr ) sqlite3GetInt32(&yymsp[0].minor.yy0.z[1], &yygotominor.yy346.pExpr->iTable);
+ }
+ spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
+}
break;
- case 184: /* expr ::= VARIABLE */
+ case 193: /* expr ::= VARIABLE */
{
- Token *pToken = &yymsp[0].minor.yy0;
- Expr *pExpr = yygotominor.yy172 = sqlite3PExpr(pParse, TK_VARIABLE, 0, 0, pToken);
- sqlite3ExprAssignVarNumber(pParse, pExpr);
+ spanExpr(&yygotominor.yy346, pParse, TK_VARIABLE, &yymsp[0].minor.yy0);
+ sqlite3ExprAssignVarNumber(pParse, yygotominor.yy346.pExpr);
+ spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
}
break;
- case 185: /* expr ::= expr COLLATE ids */
+ case 194: /* expr ::= expr COLLATE ids */
{
- yygotominor.yy172 = sqlite3ExprSetColl(pParse, yymsp[-2].minor.yy172, &yymsp[0].minor.yy410);
+ yygotominor.yy346.pExpr = sqlite3ExprSetColl(pParse, yymsp[-2].minor.yy346.pExpr, &yymsp[0].minor.yy0);
+ yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 186: /* expr ::= CAST LP expr AS typetoken RP */
+ case 195: /* expr ::= CAST LP expr AS typetoken RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy172, 0, &yymsp[-1].minor.yy410);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy346.pExpr, 0, &yymsp[-1].minor.yy0);
+ spanSet(&yygotominor.yy346,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0);
}
break;
- case 187: /* expr ::= ID LP distinct exprlist RP */
+ case 196: /* expr ::= ID LP distinct exprlist RP */
{
- if( yymsp[-1].minor.yy174 && yymsp[-1].minor.yy174->nExpr>SQLITE_MAX_FUNCTION_ARG ){
+ if( yymsp[-1].minor.yy14 && yymsp[-1].minor.yy14->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
}
- yygotominor.yy172 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy174, &yymsp[-4].minor.yy0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
- if( yymsp[-2].minor.yy46 && yygotominor.yy172 ){
- yygotominor.yy172->flags |= EP_Distinct;
+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy14, &yymsp[-4].minor.yy0);
+ spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
+ if( yymsp[-2].minor.yy328 && yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->flags |= EP_Distinct;
}
}
break;
- case 188: /* expr ::= ID LP STAR RP */
+ case 197: /* expr ::= ID LP STAR RP */
{
- yygotominor.yy172 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
+ spanSet(&yygotominor.yy346,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
}
break;
- case 189: /* term ::= CTIME_KW */
+ case 198: /* term ::= CTIME_KW */
{
/* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
** treated as functions that return constants */
- yygotominor.yy172 = sqlite3ExprFunction(pParse, 0,&yymsp[0].minor.yy0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->op = TK_CONST_FUNC;
- yygotominor.yy172->span = yymsp[0].minor.yy0;
+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0,&yymsp[0].minor.yy0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->op = TK_CONST_FUNC;
}
+ spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
}
break;
- case 190: /* expr ::= expr AND expr */
- case 191: /* expr ::= expr OR expr */
- case 192: /* expr ::= expr LT|GT|GE|LE expr */
- case 193: /* expr ::= expr EQ|NE expr */
- case 194: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */
- case 195: /* expr ::= expr PLUS|MINUS expr */
- case 196: /* expr ::= expr STAR|SLASH|REM expr */
- case 197: /* expr ::= expr CONCAT expr */
-{yygotominor.yy172 = sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy172,yymsp[0].minor.yy172,0);}
+ case 199: /* expr ::= expr AND expr */
+ case 200: /* expr ::= expr OR expr */ yytestcase(yyruleno==200);
+ case 201: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==201);
+ case 202: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==202);
+ case 203: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==203);
+ case 204: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==204);
+ case 205: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==205);
+ case 206: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==206);
+{spanBinaryExpr(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346);}
+ break;
+ case 207: /* likeop ::= LIKE_KW */
+ case 209: /* likeop ::= MATCH */ yytestcase(yyruleno==209);
+{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.not = 0;}
break;
- case 198: /* likeop ::= LIKE_KW */
- case 200: /* likeop ::= MATCH */
-{yygotominor.yy72.eOperator = yymsp[0].minor.yy0; yygotominor.yy72.not = 0;}
+ case 208: /* likeop ::= NOT LIKE_KW */
+ case 210: /* likeop ::= NOT MATCH */ yytestcase(yyruleno==210);
+{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.not = 1;}
break;
- case 199: /* likeop ::= NOT LIKE_KW */
- case 201: /* likeop ::= NOT MATCH */
-{yygotominor.yy72.eOperator = yymsp[0].minor.yy0; yygotominor.yy72.not = 1;}
+ case 212: /* escape ::= */
+{memset(&yygotominor.yy346,0,sizeof(yygotominor.yy346));}
break;
- case 204: /* expr ::= expr likeop expr escape */
+ case 213: /* expr ::= expr likeop expr escape */
{
ExprList *pList;
- pList = sqlite3ExprListAppend(pParse,0, yymsp[-1].minor.yy172, 0);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[-3].minor.yy172, 0);
- if( yymsp[0].minor.yy172 ){
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy172, 0);
+ pList = sqlite3ExprListAppend(pParse,0, yymsp[-1].minor.yy346.pExpr);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[-3].minor.yy346.pExpr);
+ if( yymsp[0].minor.yy346.pExpr ){
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr);
}
- yygotominor.yy172 = sqlite3ExprFunction(pParse, pList, &yymsp[-2].minor.yy72.eOperator);
- if( yymsp[-2].minor.yy72.not ) yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172, &yymsp[-3].minor.yy172->span, &yymsp[-1].minor.yy172->span);
- if( yygotominor.yy172 ) yygotominor.yy172->flags |= EP_InfixFunc;
+ yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-2].minor.yy96.eOperator);
+ if( yymsp[-2].minor.yy96.not ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0);
+ yygotominor.yy346.zStart = yymsp[-3].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = yymsp[-1].minor.yy346.zEnd;
+ if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc;
}
break;
- case 205: /* expr ::= expr ISNULL|NOTNULL */
-{
- yygotominor.yy172 = sqlite3PExpr(pParse, yymsp[0].major, yymsp[-1].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-1].minor.yy172->span,&yymsp[0].minor.yy0);
-}
+ case 214: /* expr ::= expr ISNULL|NOTNULL */
+{spanUnaryPostfix(&yygotominor.yy346,pParse,yymsp[0].major,&yymsp[-1].minor.yy346,&yymsp[0].minor.yy0);}
break;
- case 206: /* expr ::= expr IS NULL */
-{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_ISNULL, yymsp[-2].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-2].minor.yy172->span,&yymsp[0].minor.yy0);
-}
+ case 215: /* expr ::= expr NOT NULL */
+{spanUnaryPostfix(&yygotominor.yy346,pParse,TK_NOTNULL,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy0);}
break;
- case 207: /* expr ::= expr NOT NULL */
+ case 216: /* expr ::= expr IS expr */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOTNULL, yymsp[-2].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-2].minor.yy172->span,&yymsp[0].minor.yy0);
+ spanBinaryExpr(&yygotominor.yy346,pParse,TK_IS,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346);
+ if( pParse->db->mallocFailed==0 && yymsp[0].minor.yy346.pExpr->op==TK_NULL ){
+ yygotominor.yy346.pExpr->op = TK_ISNULL;
+ }
}
break;
- case 208: /* expr ::= expr IS NOT NULL */
+ case 217: /* expr ::= expr IS NOT expr */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOTNULL, yymsp[-3].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-3].minor.yy172->span,&yymsp[0].minor.yy0);
+ spanBinaryExpr(&yygotominor.yy346,pParse,TK_ISNOT,&yymsp[-3].minor.yy346,&yymsp[0].minor.yy346);
+ if( pParse->db->mallocFailed==0 && yymsp[0].minor.yy346.pExpr->op==TK_NULL ){
+ yygotominor.yy346.pExpr->op = TK_NOTNULL;
+ }
}
break;
- case 209: /* expr ::= NOT expr */
- case 210: /* expr ::= BITNOT expr */
-{
- yygotominor.yy172 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy172->span);
-}
+ case 218: /* expr ::= NOT expr */
+ case 219: /* expr ::= BITNOT expr */ yytestcase(yyruleno==219);
+{spanUnaryPrefix(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);}
break;
- case 211: /* expr ::= MINUS expr */
-{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy172->span);
-}
+ case 220: /* expr ::= MINUS expr */
+{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UMINUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);}
break;
- case 212: /* expr ::= PLUS expr */
-{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_UPLUS, yymsp[0].minor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy172->span);
-}
+ case 221: /* expr ::= PLUS expr */
+{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UPLUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);}
break;
- case 215: /* expr ::= expr between_op expr AND expr */
+ case 224: /* expr ::= expr between_op expr AND expr */
{
- ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy172, 0);
- pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy172, 0);
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy172, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pList = pList;
+ ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr);
+ pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy346.pExpr, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pList = pList;
}else{
- sqlite3ExprListDelete(pList);
+ sqlite3ExprListDelete(pParse->db, pList);
}
- if( yymsp[-3].minor.yy46 ) yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-4].minor.yy172->span,&yymsp[0].minor.yy172->span);
+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0);
+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd;
}
break;
- case 218: /* expr ::= expr in_op LP exprlist RP */
+ case 227: /* expr ::= expr in_op LP exprlist RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy172, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pList = yymsp[-1].minor.yy174;
- sqlite3ExprSetHeight(yygotominor.yy172);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pList = yymsp[-1].minor.yy14;
+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr);
}else{
- sqlite3ExprListDelete(yymsp[-1].minor.yy174);
+ sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14);
}
- if( yymsp[-3].minor.yy46 ) yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-4].minor.yy172->span,&yymsp[0].minor.yy0);
+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0);
+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 219: /* expr ::= LP select RP */
+ case 228: /* expr ::= LP select RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pSelect = yymsp[-1].minor.yy219;
- sqlite3ExprSetHeight(yygotominor.yy172);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3;
+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect);
+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr);
}else{
- sqlite3SelectDelete(yymsp[-1].minor.yy219);
+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3);
}
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);
+ yygotominor.yy346.zStart = yymsp[-2].minor.yy0.z;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 220: /* expr ::= expr in_op LP select RP */
+ case 229: /* expr ::= expr in_op LP select RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy172, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pSelect = yymsp[-1].minor.yy219;
- sqlite3ExprSetHeight(yygotominor.yy172);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3;
+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect);
+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr);
}else{
- sqlite3SelectDelete(yymsp[-1].minor.yy219);
+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3);
}
- if( yymsp[-3].minor.yy46 ) yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-4].minor.yy172->span,&yymsp[0].minor.yy0);
+ if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0);
+ yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 221: /* expr ::= expr in_op nm dbnm */
+ case 230: /* expr ::= expr in_op nm dbnm */
{
- SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy410,&yymsp[0].minor.yy410);
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy172, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
- sqlite3ExprSetHeight(yygotominor.yy172);
+ SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy346.pExpr, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
+ ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect);
+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr);
}else{
- sqlite3SrcListDelete(pSrc);
+ sqlite3SrcListDelete(pParse->db, pSrc);
}
- if( yymsp[-2].minor.yy46 ) yygotominor.yy172 = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy172, 0, 0);
- sqlite3ExprSpan(yygotominor.yy172,&yymsp[-3].minor.yy172->span,yymsp[0].minor.yy410.z?&yymsp[0].minor.yy410:&yymsp[-1].minor.yy410);
+ if( yymsp[-2].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0);
+ yygotominor.yy346.zStart = yymsp[-3].minor.yy346.zStart;
+ yygotominor.yy346.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n];
}
break;
- case 222: /* expr ::= EXISTS LP select RP */
+ case 231: /* expr ::= EXISTS LP select RP */
{
- Expr *p = yygotominor.yy172 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
+ Expr *p = yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
if( p ){
- p->pSelect = yymsp[-1].minor.yy219;
- sqlite3ExprSpan(p,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
- sqlite3ExprSetHeight(yygotominor.yy172);
+ p->x.pSelect = yymsp[-1].minor.yy3;
+ ExprSetProperty(p, EP_xIsSelect);
+ sqlite3ExprSetHeight(pParse, p);
}else{
- sqlite3SelectDelete(yymsp[-1].minor.yy219);
+ sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3);
}
+ yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 223: /* expr ::= CASE case_operand case_exprlist case_else END */
+ case 232: /* expr ::= CASE case_operand case_exprlist case_else END */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy172, yymsp[-1].minor.yy172, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->pList = yymsp[-2].minor.yy174;
- sqlite3ExprSetHeight(yygotominor.yy172);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy132, yymsp[-1].minor.yy132, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->x.pList = yymsp[-2].minor.yy14;
+ sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr);
}else{
- sqlite3ExprListDelete(yymsp[-2].minor.yy174);
+ sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy14);
}
- sqlite3ExprSpan(yygotominor.yy172, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0);
+ yygotominor.yy346.zStart = yymsp[-4].minor.yy0.z;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 224: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
+ case 233: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
{
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy174, yymsp[-2].minor.yy172, 0);
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yygotominor.yy174, yymsp[0].minor.yy172, 0);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[-2].minor.yy346.pExpr);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr);
}
break;
- case 225: /* case_exprlist ::= WHEN expr THEN expr */
+ case 234: /* case_exprlist ::= WHEN expr THEN expr */
{
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy172, 0);
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yygotominor.yy174, yymsp[0].minor.yy172, 0);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr);
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr);
}
break;
- case 234: /* cmd ::= CREATE uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP */
+ case 243: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP */
{
- sqlite3CreateIndex(pParse, &yymsp[-6].minor.yy410, &yymsp[-5].minor.yy410,
- sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy410,0), yymsp[-1].minor.yy174, yymsp[-9].minor.yy46,
- &yymsp[-10].minor.yy0, &yymsp[0].minor.yy0, SQLITE_SO_ASC, yymsp[-7].minor.yy46);
+ sqlite3CreateIndex(pParse, &yymsp[-6].minor.yy0, &yymsp[-5].minor.yy0,
+ sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy0,0), yymsp[-1].minor.yy14, yymsp[-9].minor.yy328,
+ &yymsp[-10].minor.yy0, &yymsp[0].minor.yy0, SQLITE_SO_ASC, yymsp[-7].minor.yy328);
}
break;
- case 235: /* uniqueflag ::= UNIQUE */
- case 283: /* raisetype ::= ABORT */
-{yygotominor.yy46 = OE_Abort;}
+ case 244: /* uniqueflag ::= UNIQUE */
+ case 298: /* raisetype ::= ABORT */ yytestcase(yyruleno==298);
+{yygotominor.yy328 = OE_Abort;}
break;
- case 236: /* uniqueflag ::= */
-{yygotominor.yy46 = OE_None;}
+ case 245: /* uniqueflag ::= */
+{yygotominor.yy328 = OE_None;}
break;
- case 239: /* idxlist ::= idxlist COMMA idxitem collate sortorder */
+ case 248: /* idxlist ::= idxlist COMMA nm collate sortorder */
{
Expr *p = 0;
- if( yymsp[-1].minor.yy410.n>0 ){
- p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
- sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy410);
+ if( yymsp[-1].minor.yy0.n>0 ){
+ p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
+ sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy0);
}
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy174, p, &yymsp[-2].minor.yy410);
- sqlite3ExprListCheckLength(pParse, yygotominor.yy174, "index");
- if( yygotominor.yy174 ) yygotominor.yy174->a[yygotominor.yy174->nExpr-1].sortOrder = yymsp[0].minor.yy46;
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, p);
+ sqlite3ExprListSetName(pParse,yygotominor.yy14,&yymsp[-2].minor.yy0,1);
+ sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index");
+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328;
}
break;
- case 240: /* idxlist ::= idxitem collate sortorder */
+ case 249: /* idxlist ::= nm collate sortorder */
{
Expr *p = 0;
- if( yymsp[-1].minor.yy410.n>0 ){
+ if( yymsp[-1].minor.yy0.n>0 ){
p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
- sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy410);
+ sqlite3ExprSetColl(pParse, p, &yymsp[-1].minor.yy0);
}
- yygotominor.yy174 = sqlite3ExprListAppend(pParse,0, p, &yymsp[-2].minor.yy410);
- sqlite3ExprListCheckLength(pParse, yygotominor.yy174, "index");
- if( yygotominor.yy174 ) yygotominor.yy174->a[yygotominor.yy174->nExpr-1].sortOrder = yymsp[0].minor.yy46;
+ yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, p);
+ sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1);
+ sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index");
+ if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328;
}
break;
- case 242: /* collate ::= */
-{yygotominor.yy410.z = 0; yygotominor.yy410.n = 0;}
+ case 250: /* collate ::= */
+{yygotominor.yy0.z = 0; yygotominor.yy0.n = 0;}
break;
- case 244: /* cmd ::= DROP INDEX ifexists fullname */
-{sqlite3DropIndex(pParse, yymsp[0].minor.yy373, yymsp[-1].minor.yy46);}
+ case 252: /* cmd ::= DROP INDEX ifexists fullname */
+{sqlite3DropIndex(pParse, yymsp[0].minor.yy65, yymsp[-1].minor.yy328);}
break;
- case 245: /* cmd ::= VACUUM */
- case 246: /* cmd ::= VACUUM nm */
+ case 253: /* cmd ::= VACUUM */
+ case 254: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==254);
{sqlite3Vacuum(pParse);}
break;
- case 247: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
-{sqlite3Pragma(pParse,&yymsp[-3].minor.yy410,&yymsp[-2].minor.yy410,&yymsp[0].minor.yy410,0);}
+ case 255: /* cmd ::= PRAGMA nm dbnm */
+{sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
break;
- case 248: /* cmd ::= PRAGMA nm dbnm EQ ON */
- case 249: /* cmd ::= PRAGMA nm dbnm EQ DELETE */
-{sqlite3Pragma(pParse,&yymsp[-3].minor.yy410,&yymsp[-2].minor.yy410,&yymsp[0].minor.yy0,0);}
+ case 256: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
+{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
break;
- case 250: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
-{
- sqlite3Pragma(pParse,&yymsp[-3].minor.yy410,&yymsp[-2].minor.yy410,&yymsp[0].minor.yy410,1);
-}
+ case 257: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
+{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
break;
- case 251: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
-{sqlite3Pragma(pParse,&yymsp[-4].minor.yy410,&yymsp[-3].minor.yy410,&yymsp[-1].minor.yy410,0);}
+ case 258: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
+{sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
break;
- case 252: /* cmd ::= PRAGMA nm dbnm */
-{sqlite3Pragma(pParse,&yymsp[-1].minor.yy410,&yymsp[0].minor.yy410,0,0);}
+ case 259: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
+{sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
break;
- case 260: /* cmd ::= CREATE trigger_decl BEGIN trigger_cmd_list END */
+ case 270: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
{
Token all;
- all.z = yymsp[-3].minor.yy410.z;
- all.n = (yymsp[0].minor.yy0.z - yymsp[-3].minor.yy410.z) + yymsp[0].minor.yy0.n;
- sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy243, &all);
+ all.z = yymsp[-3].minor.yy0.z;
+ all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
+ sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy473, &all);
}
break;
- case 261: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
+ case 271: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
{
- sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy410, &yymsp[-6].minor.yy410, yymsp[-5].minor.yy46, yymsp[-4].minor.yy370.a, yymsp[-4].minor.yy370.b, yymsp[-2].minor.yy373, yymsp[0].minor.yy172, yymsp[-10].minor.yy46, yymsp[-8].minor.yy46);
- yygotominor.yy410 = (yymsp[-6].minor.yy410.n==0?yymsp[-7].minor.yy410:yymsp[-6].minor.yy410);
+ sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy328, yymsp[-4].minor.yy378.a, yymsp[-4].minor.yy378.b, yymsp[-2].minor.yy65, yymsp[0].minor.yy132, yymsp[-10].minor.yy328, yymsp[-8].minor.yy328);
+ yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0);
}
break;
- case 262: /* trigger_time ::= BEFORE */
- case 265: /* trigger_time ::= */
-{ yygotominor.yy46 = TK_BEFORE; }
+ case 272: /* trigger_time ::= BEFORE */
+ case 275: /* trigger_time ::= */ yytestcase(yyruleno==275);
+{ yygotominor.yy328 = TK_BEFORE; }
break;
- case 263: /* trigger_time ::= AFTER */
-{ yygotominor.yy46 = TK_AFTER; }
+ case 273: /* trigger_time ::= AFTER */
+{ yygotominor.yy328 = TK_AFTER; }
break;
- case 264: /* trigger_time ::= INSTEAD OF */
-{ yygotominor.yy46 = TK_INSTEAD;}
+ case 274: /* trigger_time ::= INSTEAD OF */
+{ yygotominor.yy328 = TK_INSTEAD;}
break;
- case 266: /* trigger_event ::= DELETE|INSERT */
- case 267: /* trigger_event ::= UPDATE */
-{yygotominor.yy370.a = yymsp[0].major; yygotominor.yy370.b = 0;}
+ case 276: /* trigger_event ::= DELETE|INSERT */
+ case 277: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==277);
+{yygotominor.yy378.a = yymsp[0].major; yygotominor.yy378.b = 0;}
break;
- case 268: /* trigger_event ::= UPDATE OF inscollist */
-{yygotominor.yy370.a = TK_UPDATE; yygotominor.yy370.b = yymsp[0].minor.yy432;}
+ case 278: /* trigger_event ::= UPDATE OF inscollist */
+{yygotominor.yy378.a = TK_UPDATE; yygotominor.yy378.b = yymsp[0].minor.yy408;}
break;
- case 271: /* when_clause ::= */
- case 288: /* key_opt ::= */
-{ yygotominor.yy172 = 0; }
+ case 281: /* when_clause ::= */
+ case 303: /* key_opt ::= */ yytestcase(yyruleno==303);
+{ yygotominor.yy132 = 0; }
break;
- case 272: /* when_clause ::= WHEN expr */
- case 289: /* key_opt ::= KEY expr */
-{ yygotominor.yy172 = yymsp[0].minor.yy172; }
+ case 282: /* when_clause ::= WHEN expr */
+ case 304: /* key_opt ::= KEY expr */ yytestcase(yyruleno==304);
+{ yygotominor.yy132 = yymsp[0].minor.yy346.pExpr; }
break;
- case 273: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
+ case 283: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
{
- if( yymsp[-2].minor.yy243 ){
- yymsp[-2].minor.yy243->pLast->pNext = yymsp[-1].minor.yy243;
- }else{
- yymsp[-2].minor.yy243 = yymsp[-1].minor.yy243;
- }
- yymsp[-2].minor.yy243->pLast = yymsp[-1].minor.yy243;
- yygotominor.yy243 = yymsp[-2].minor.yy243;
+ assert( yymsp[-2].minor.yy473!=0 );
+ yymsp[-2].minor.yy473->pLast->pNext = yymsp[-1].minor.yy473;
+ yymsp[-2].minor.yy473->pLast = yymsp[-1].minor.yy473;
+ yygotominor.yy473 = yymsp[-2].minor.yy473;
}
break;
- case 274: /* trigger_cmd_list ::= */
-{ yygotominor.yy243 = 0; }
+ case 284: /* trigger_cmd_list ::= trigger_cmd SEMI */
+{
+ assert( yymsp[-1].minor.yy473!=0 );
+ yymsp[-1].minor.yy473->pLast = yymsp[-1].minor.yy473;
+ yygotominor.yy473 = yymsp[-1].minor.yy473;
+}
break;
- case 275: /* trigger_cmd ::= UPDATE orconf nm SET setlist where_opt */
-{ yygotominor.yy243 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-3].minor.yy410, yymsp[-1].minor.yy174, yymsp[0].minor.yy172, yymsp[-4].minor.yy46); }
+ case 286: /* trnm ::= nm DOT nm */
+{
+ yygotominor.yy0 = yymsp[0].minor.yy0;
+ sqlite3ErrorMsg(pParse,
+ "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
+ "statements within triggers");
+}
+ break;
+ case 288: /* tridxby ::= INDEXED BY nm */
+{
+ sqlite3ErrorMsg(pParse,
+ "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
+ "within triggers");
+}
+ break;
+ case 289: /* tridxby ::= NOT INDEXED */
+{
+ sqlite3ErrorMsg(pParse,
+ "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
+ "within triggers");
+}
+ break;
+ case 290: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
+{ yygotominor.yy473 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy14, yymsp[0].minor.yy132, yymsp[-5].minor.yy186); }
break;
- case 276: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt VALUES LP itemlist RP */
-{yygotominor.yy243 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-5].minor.yy410, yymsp[-4].minor.yy432, yymsp[-1].minor.yy174, 0, yymsp[-7].minor.yy46);}
+ case 291: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt VALUES LP itemlist RP */
+{yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy408, yymsp[-1].minor.yy14, 0, yymsp[-7].minor.yy186);}
break;
- case 277: /* trigger_cmd ::= insert_cmd INTO nm inscollist_opt select */
-{yygotominor.yy243 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy410, yymsp[-1].minor.yy432, 0, yymsp[0].minor.yy219, yymsp[-4].minor.yy46);}
+ case 292: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */
+{yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy408, 0, yymsp[0].minor.yy3, yymsp[-4].minor.yy186);}
break;
- case 278: /* trigger_cmd ::= DELETE FROM nm where_opt */
-{yygotominor.yy243 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-1].minor.yy410, yymsp[0].minor.yy172);}
+ case 293: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
+{yygotominor.yy473 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy132);}
break;
- case 279: /* trigger_cmd ::= select */
-{yygotominor.yy243 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy219); }
+ case 294: /* trigger_cmd ::= select */
+{yygotominor.yy473 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy3); }
break;
- case 280: /* expr ::= RAISE LP IGNORE RP */
+ case 295: /* expr ::= RAISE LP IGNORE RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
- if( yygotominor.yy172 ){
- yygotominor.yy172->iColumn = OE_Ignore;
- sqlite3ExprSpan(yygotominor.yy172, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
+ if( yygotominor.yy346.pExpr ){
+ yygotominor.yy346.pExpr->affinity = OE_Ignore;
}
+ yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 281: /* expr ::= RAISE LP raisetype COMMA nm RP */
+ case 296: /* expr ::= RAISE LP raisetype COMMA nm RP */
{
- yygotominor.yy172 = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy410);
- if( yygotominor.yy172 ) {
- yygotominor.yy172->iColumn = yymsp[-3].minor.yy46;
- sqlite3ExprSpan(yygotominor.yy172, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0);
+ yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0);
+ if( yygotominor.yy346.pExpr ) {
+ yygotominor.yy346.pExpr->affinity = (char)yymsp[-3].minor.yy328;
}
+ yygotominor.yy346.zStart = yymsp[-5].minor.yy0.z;
+ yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
}
break;
- case 282: /* raisetype ::= ROLLBACK */
-{yygotominor.yy46 = OE_Rollback;}
+ case 297: /* raisetype ::= ROLLBACK */
+{yygotominor.yy328 = OE_Rollback;}
break;
- case 284: /* raisetype ::= FAIL */
-{yygotominor.yy46 = OE_Fail;}
+ case 299: /* raisetype ::= FAIL */
+{yygotominor.yy328 = OE_Fail;}
break;
- case 285: /* cmd ::= DROP TRIGGER ifexists fullname */
+ case 300: /* cmd ::= DROP TRIGGER ifexists fullname */
{
- sqlite3DropTrigger(pParse,yymsp[0].minor.yy373,yymsp[-1].minor.yy46);
+ sqlite3DropTrigger(pParse,yymsp[0].minor.yy65,yymsp[-1].minor.yy328);
}
break;
- case 286: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
+ case 301: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
{
- sqlite3Attach(pParse, yymsp[-3].minor.yy172, yymsp[-1].minor.yy172, yymsp[0].minor.yy172);
+ sqlite3Attach(pParse, yymsp[-3].minor.yy346.pExpr, yymsp[-1].minor.yy346.pExpr, yymsp[0].minor.yy132);
}
break;
- case 287: /* cmd ::= DETACH database_kw_opt expr */
+ case 302: /* cmd ::= DETACH database_kw_opt expr */
{
- sqlite3Detach(pParse, yymsp[0].minor.yy172);
+ sqlite3Detach(pParse, yymsp[0].minor.yy346.pExpr);
}
break;
- case 292: /* cmd ::= REINDEX */
+ case 307: /* cmd ::= REINDEX */
{sqlite3Reindex(pParse, 0, 0);}
break;
- case 293: /* cmd ::= REINDEX nm dbnm */
-{sqlite3Reindex(pParse, &yymsp[-1].minor.yy410, &yymsp[0].minor.yy410);}
+ case 308: /* cmd ::= REINDEX nm dbnm */
+{sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 294: /* cmd ::= ANALYZE */
+ case 309: /* cmd ::= ANALYZE */
{sqlite3Analyze(pParse, 0, 0);}
break;
- case 295: /* cmd ::= ANALYZE nm dbnm */
-{sqlite3Analyze(pParse, &yymsp[-1].minor.yy410, &yymsp[0].minor.yy410);}
+ case 310: /* cmd ::= ANALYZE nm dbnm */
+{sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
break;
- case 296: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
+ case 311: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
{
- sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy373,&yymsp[0].minor.yy410);
+ sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy65,&yymsp[0].minor.yy0);
}
break;
- case 297: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */
+ case 312: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */
{
- sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy410);
+ sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0);
}
break;
- case 298: /* add_column_fullname ::= fullname */
+ case 313: /* add_column_fullname ::= fullname */
{
- sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy373);
+ pParse->db->lookaside.bEnabled = 0;
+ sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy65);
}
break;
- case 301: /* cmd ::= create_vtab */
+ case 316: /* cmd ::= create_vtab */
{sqlite3VtabFinishParse(pParse,0);}
break;
- case 302: /* cmd ::= create_vtab LP vtabarglist RP */
+ case 317: /* cmd ::= create_vtab LP vtabarglist RP */
{sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
break;
- case 303: /* create_vtab ::= CREATE VIRTUAL TABLE nm dbnm USING nm */
+ case 318: /* create_vtab ::= createkw VIRTUAL TABLE nm dbnm USING nm */
{
- sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy410, &yymsp[-2].minor.yy410, &yymsp[0].minor.yy410);
+ sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
}
break;
- case 306: /* vtabarg ::= */
+ case 321: /* vtabarg ::= */
{sqlite3VtabArgInit(pParse);}
break;
- case 308: /* vtabargtoken ::= ANY */
- case 309: /* vtabargtoken ::= lp anylist RP */
- case 310: /* lp ::= LP */
- case 312: /* anylist ::= anylist ANY */
+ case 323: /* vtabargtoken ::= ANY */
+ case 324: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==324);
+ case 325: /* lp ::= LP */ yytestcase(yyruleno==325);
{sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
break;
+ default:
+ /* (0) input ::= cmdlist */ yytestcase(yyruleno==0);
+ /* (1) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==1);
+ /* (2) cmdlist ::= ecmd */ yytestcase(yyruleno==2);
+ /* (3) ecmd ::= SEMI */ yytestcase(yyruleno==3);
+ /* (4) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==4);
+ /* (10) trans_opt ::= */ yytestcase(yyruleno==10);
+ /* (11) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==11);
+ /* (12) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==12);
+ /* (20) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==20);
+ /* (21) savepoint_opt ::= */ yytestcase(yyruleno==21);
+ /* (25) cmd ::= create_table create_table_args */ yytestcase(yyruleno==25);
+ /* (34) columnlist ::= columnlist COMMA column */ yytestcase(yyruleno==34);
+ /* (35) columnlist ::= column */ yytestcase(yyruleno==35);
+ /* (44) type ::= */ yytestcase(yyruleno==44);
+ /* (51) signed ::= plus_num */ yytestcase(yyruleno==51);
+ /* (52) signed ::= minus_num */ yytestcase(yyruleno==52);
+ /* (53) carglist ::= carglist carg */ yytestcase(yyruleno==53);
+ /* (54) carglist ::= */ yytestcase(yyruleno==54);
+ /* (55) carg ::= CONSTRAINT nm ccons */ yytestcase(yyruleno==55);
+ /* (56) carg ::= ccons */ yytestcase(yyruleno==56);
+ /* (62) ccons ::= NULL onconf */ yytestcase(yyruleno==62);
+ /* (89) conslist ::= conslist COMMA tcons */ yytestcase(yyruleno==89);
+ /* (90) conslist ::= conslist tcons */ yytestcase(yyruleno==90);
+ /* (91) conslist ::= tcons */ yytestcase(yyruleno==91);
+ /* (92) tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==92);
+ /* (268) plus_opt ::= PLUS */ yytestcase(yyruleno==268);
+ /* (269) plus_opt ::= */ yytestcase(yyruleno==269);
+ /* (279) foreach_clause ::= */ yytestcase(yyruleno==279);
+ /* (280) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==280);
+ /* (287) tridxby ::= */ yytestcase(yyruleno==287);
+ /* (305) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==305);
+ /* (306) database_kw_opt ::= */ yytestcase(yyruleno==306);
+ /* (314) kwcolumn_opt ::= */ yytestcase(yyruleno==314);
+ /* (315) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==315);
+ /* (319) vtabarglist ::= vtabarg */ yytestcase(yyruleno==319);
+ /* (320) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==320);
+ /* (322) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==322);
+ /* (326) anylist ::= */ yytestcase(yyruleno==326);
+ /* (327) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==327);
+ /* (328) anylist ::= anylist ANY */ yytestcase(yyruleno==328);
+ break;
};
yygoto = yyRuleInfo[yyruleno].lhs;
yysize = yyRuleInfo[yyruleno].nrhs;
yypParser->yyidx -= yysize;
- yyact = yy_find_reduce_action(yymsp[-yysize].stateno,yygoto);
+ yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
if( yyact < YYNSTATE ){
#ifdef NDEBUG
/* If we are not debugging and the reduce action popped at least
@@ -75936,8 +93092,8 @@ static void yy_reduce(
if( yysize ){
yypParser->yyidx++;
yymsp -= yysize-1;
- yymsp->stateno = yyact;
- yymsp->major = yygoto;
+ yymsp->stateno = (YYACTIONTYPE)yyact;
+ yymsp->major = (YYCODETYPE)yygoto;
yymsp->minor = yygotominor;
}else
#endif
@@ -75953,6 +93109,7 @@ static void yy_reduce(
/*
** The following code executes when the parse fails
*/
+#ifndef YYNOERRORRECOVERY
static void yy_parse_failed(
yyParser *yypParser /* The parser */
){
@@ -75967,6 +93124,7 @@ static void yy_parse_failed(
** parser fails */
sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
}
+#endif /* YYNOERRORRECOVERY */
/*
** The following code executes when a syntax error first occurs.
@@ -75979,6 +93137,7 @@ static void yy_syntax_error(
sqlite3ParserARG_FETCH;
#define TOKEN (yyminor.yy0)
+ UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
pParse->parseError = 1;
@@ -76063,7 +93222,7 @@ SQLITE_PRIVATE void sqlite3Parser(
#endif
do{
- yyact = yy_find_shift_action(yypParser,yymajor);
+ yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
if( yyact<YYNSTATE ){
assert( !yyendofinput ); /* Impossible to shift the $ token */
yy_shift(yypParser,yyact,yymajor,&yyminorunion);
@@ -76112,7 +93271,7 @@ SQLITE_PRIVATE void sqlite3Parser(
yyTracePrompt,yyTokenName[yymajor]);
}
#endif
- yy_destructor(yymajor,&yyminorunion);
+ yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
yymajor = YYNOCODE;
}else{
while(
@@ -76125,7 +93284,7 @@ SQLITE_PRIVATE void sqlite3Parser(
yy_pop_parser_stack(yypParser);
}
if( yypParser->yyidx < 0 || yymajor==0 ){
- yy_destructor(yymajor,&yyminorunion);
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
yy_parse_failed(yypParser);
yymajor = YYNOCODE;
}else if( yymx!=YYERRORSYMBOL ){
@@ -76136,6 +93295,18 @@ SQLITE_PRIVATE void sqlite3Parser(
}
yypParser->yyerrcnt = 3;
yyerrorhit = 1;
+#elif defined(YYNOERRORRECOVERY)
+ /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
+ ** do any kind of error recovery. Instead, simply invoke the syntax
+ ** error routine and continue going as if nothing had happened.
+ **
+ ** Applications can set this macro (for example inside %include) if
+ ** they intend to abandon the parse upon the first syntax error seen.
+ */
+ yy_syntax_error(yypParser,yymajor,yyminorunion);
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
+ yymajor = YYNOCODE;
+
#else /* YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR:
**
@@ -76150,7 +93321,7 @@ SQLITE_PRIVATE void sqlite3Parser(
yy_syntax_error(yypParser,yymajor,yyminorunion);
}
yypParser->yyerrcnt = 3;
- yy_destructor(yymajor,&yyminorunion);
+ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
if( yyendofinput ){
yy_parse_failed(yypParser);
}
@@ -76180,7 +93351,7 @@ SQLITE_PRIVATE void sqlite3Parser(
** individual tokens and sends those tokens one-by-one over to the
** parser for analysis.
**
-** $Id: tokenize.c,v 1.142 2008/04/28 18:46:43 drh Exp $
+** $Id: tokenize.c,v 1.163 2009/07/03 22:54:37 drh Exp $
*/
/*
@@ -76233,7 +93404,7 @@ const unsigned char ebcdicToAscii[] = {
**
** The code in this file has been automatically generated by
**
-** $Header: /sqlite/sqlite/tool/mkkeywordhash.c,v 1.31 2007/07/30 18:26:20 rse Exp $
+** $Header: /home/drh/sqlite/trans/cvs/sqlite/sqlite/tool/mkkeywordhash.c,v 1.38 2009/06/09 14:27:41 drh Exp $
**
** The code in this file implements a function that determines whether
** or not a given identifier is really an SQL keyword. The same thing
@@ -76242,86 +93413,122 @@ const unsigned char ebcdicToAscii[] = {
** is substantially reduced. This is important for embedded applications
** on platforms with limited memory.
*/
-/* Hash score: 165 */
+/* Hash score: 175 */
static int keywordCode(const char *z, int n){
- /* zText[] encodes 775 bytes of keywords in 526 bytes */
- static const char zText[526] =
- "BEFOREIGNOREGEXPLAINSTEADDESCAPEACHECKEYCONSTRAINTERSECTABLEFT"
- "HENDATABASELECTRANSACTIONATURALTERAISELSEXCEPTRIGGEREFERENCES"
- "UNIQUERYATTACHAVINGROUPDATEMPORARYBEGINNEREINDEXCLUSIVEXISTSBETWEEN"
- "OTNULLIKECASCADEFERRABLECASECOLLATECREATECURRENT_DATEDELETEDETACH"
- "IMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHEN"
- "WHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICT"
- "CROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAILFROMFULLGLOB"
- "YIFINTOFFSETISNULLORDERESTRICTOUTERIGHTROLLBACKROWUNIONUSINGVACUUM"
- "VIEWINITIALLY";
+ /* zText[] encodes 811 bytes of keywords in 541 bytes */
+ /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */
+ /* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */
+ /* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */
+ /* UNIQUERYATTACHAVINGROUPDATEBEGINNERELEASEBETWEENOTNULLIKE */
+ /* CASCADELETECASECOLLATECREATECURRENT_DATEDETACHIMMEDIATEJOIN */
+ /* SERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHENWHERENAME */
+ /* AFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSS */
+ /* CURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAILFROMFULLGLOBYIF */
+ /* ISNULLORDERESTRICTOUTERIGHTROLLBACKROWUNIONUSINGVACUUMVIEW */
+ /* INITIALLY */
+ static const char zText[540] = {
+ 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H',
+ 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G',
+ 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A',
+ 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F',
+ 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N',
+ 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I',
+ 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E',
+ 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E',
+ 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T',
+ 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q',
+ 'U','E','R','Y','A','T','T','A','C','H','A','V','I','N','G','R','O','U',
+ 'P','D','A','T','E','B','E','G','I','N','N','E','R','E','L','E','A','S',
+ 'E','B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C',
+ 'A','S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L',
+ 'A','T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D',
+ 'A','T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E',
+ 'J','O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A',
+ 'L','Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U',
+ 'E','S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W',
+ 'H','E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C',
+ 'E','A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R',
+ 'E','M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M',
+ 'M','I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U',
+ 'R','R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M',
+ 'A','R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T',
+ 'D','R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L',
+ 'O','B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S',
+ 'T','R','I','C','T','O','U','T','E','R','I','G','H','T','R','O','L','L',
+ 'B','A','C','K','R','O','W','U','N','I','O','N','U','S','I','N','G','V',
+ 'A','C','U','U','M','V','I','E','W','I','N','I','T','I','A','L','L','Y',
+ };
static const unsigned char aHash[127] = {
- 63, 92, 109, 61, 0, 38, 0, 0, 69, 0, 64, 0, 0,
- 102, 4, 65, 7, 0, 108, 72, 103, 99, 0, 22, 0, 0,
- 113, 0, 111, 106, 0, 18, 80, 0, 1, 0, 0, 56, 57,
- 0, 55, 11, 0, 33, 77, 89, 0, 110, 88, 0, 0, 45,
- 0, 90, 54, 0, 20, 0, 114, 34, 19, 0, 10, 97, 28,
- 83, 0, 0, 116, 93, 47, 115, 41, 12, 44, 0, 78, 0,
- 87, 29, 0, 86, 0, 0, 0, 82, 79, 84, 75, 96, 6,
- 14, 95, 0, 68, 0, 21, 76, 98, 27, 0, 112, 67, 104,
- 49, 40, 71, 0, 0, 81, 100, 0, 107, 0, 15, 0, 0,
- 24, 0, 73, 42, 50, 0, 16, 48, 0, 37,
+ 72, 101, 114, 70, 0, 44, 0, 0, 78, 0, 73, 0, 0,
+ 42, 12, 74, 15, 0, 113, 81, 50, 108, 0, 19, 0, 0,
+ 118, 0, 116, 111, 0, 22, 89, 0, 9, 0, 0, 66, 67,
+ 0, 65, 6, 0, 48, 86, 98, 0, 115, 97, 0, 0, 45,
+ 0, 99, 24, 0, 17, 0, 119, 49, 23, 0, 5, 106, 25,
+ 92, 0, 0, 121, 102, 56, 120, 53, 28, 51, 0, 87, 0,
+ 96, 26, 0, 95, 0, 0, 0, 91, 88, 93, 84, 105, 14,
+ 39, 104, 0, 77, 0, 18, 85, 107, 32, 0, 117, 76, 109,
+ 59, 46, 80, 0, 0, 90, 40, 0, 112, 0, 36, 0, 0,
+ 29, 0, 82, 58, 60, 0, 20, 57, 0, 52,
};
- static const unsigned char aNext[116] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
- 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
- 17, 0, 0, 0, 36, 39, 0, 0, 25, 0, 0, 31, 0,
- 0, 0, 43, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 51, 0, 0, 0, 0, 26, 0, 8, 46,
- 2, 0, 0, 0, 0, 0, 0, 0, 3, 58, 66, 0, 13,
- 0, 91, 85, 0, 94, 0, 74, 0, 0, 62, 0, 35, 101,
- 0, 0, 105, 23, 30, 60, 70, 0, 0, 59, 0, 0,
+ static const unsigned char aNext[121] = {
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
+ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 33, 21, 0, 0, 0, 43, 3, 47,
+ 0, 0, 0, 0, 30, 54, 0, 0, 38, 0, 0, 0, 1,
+ 62, 0, 0, 63, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 0, 0, 0, 31, 55, 16, 34, 10, 0, 0, 0,
+ 0, 0, 0, 0, 11, 68, 75, 0, 8, 0, 100, 94, 0,
+ 103, 0, 83, 0, 71, 0, 0, 110, 27, 37, 69, 79, 0,
+ 35, 64, 0, 0,
};
- static const unsigned char aLen[116] = {
- 6, 7, 3, 6, 6, 7, 7, 3, 4, 6, 4, 5, 3,
- 10, 9, 5, 4, 4, 3, 8, 2, 6, 11, 2, 7, 5,
- 5, 4, 6, 7, 10, 6, 5, 6, 6, 5, 6, 4, 9,
- 2, 5, 5, 7, 5, 9, 6, 7, 7, 3, 4, 4, 7,
- 3, 10, 4, 7, 6, 12, 6, 6, 9, 4, 6, 5, 4,
- 7, 6, 5, 6, 7, 5, 4, 5, 6, 5, 7, 3, 7,
- 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 8, 8,
- 2, 4, 4, 4, 4, 4, 2, 2, 4, 6, 2, 3, 6,
- 5, 8, 5, 5, 8, 3, 5, 5, 6, 4, 9, 3,
+ static const unsigned char aLen[121] = {
+ 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6,
+ 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6,
+ 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10,
+ 4, 6, 2, 3, 4, 9, 2, 6, 5, 6, 6, 5, 6,
+ 5, 5, 7, 7, 7, 2, 3, 4, 4, 7, 3, 6, 4,
+ 7, 6, 12, 6, 9, 4, 6, 5, 4, 7, 6, 5, 6,
+ 7, 5, 4, 5, 6, 5, 7, 3, 7, 13, 2, 2, 4,
+ 6, 6, 8, 5, 17, 12, 7, 8, 8, 2, 4, 4, 4,
+ 4, 4, 2, 2, 6, 5, 8, 5, 5, 8, 3, 5, 5,
+ 6, 4, 9, 3,
};
- static const unsigned short int aOffset[116] = {
- 0, 2, 2, 6, 10, 13, 18, 23, 25, 26, 31, 33, 37,
- 40, 47, 55, 58, 61, 63, 65, 70, 71, 76, 85, 86, 91,
- 95, 99, 102, 107, 113, 123, 126, 131, 136, 141, 144, 148, 148,
- 152, 157, 160, 164, 166, 169, 177, 183, 189, 189, 192, 195, 199,
- 200, 204, 214, 218, 225, 231, 243, 249, 255, 264, 266, 272, 277,
- 279, 286, 291, 296, 302, 308, 313, 317, 320, 326, 330, 337, 339,
- 346, 348, 350, 359, 363, 369, 375, 383, 388, 388, 404, 411, 418,
- 419, 426, 430, 434, 438, 442, 445, 447, 449, 452, 452, 455, 458,
- 464, 468, 476, 480, 485, 493, 496, 501, 506, 512, 516, 521,
+ static const unsigned short int aOffset[121] = {
+ 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33,
+ 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81,
+ 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152,
+ 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 189, 194, 197,
+ 203, 206, 210, 217, 223, 223, 223, 226, 229, 233, 234, 238, 244,
+ 248, 255, 261, 273, 279, 288, 290, 296, 301, 303, 310, 315, 320,
+ 326, 332, 337, 341, 344, 350, 354, 361, 363, 370, 372, 374, 383,
+ 387, 393, 399, 407, 412, 412, 428, 435, 442, 443, 450, 454, 458,
+ 462, 466, 469, 471, 473, 479, 483, 491, 495, 500, 508, 511, 516,
+ 521, 527, 531, 536,
};
- static const unsigned char aCode[116] = {
- TK_BEFORE, TK_FOREIGN, TK_FOR, TK_IGNORE, TK_LIKE_KW,
- TK_EXPLAIN, TK_INSTEAD, TK_ADD, TK_DESC, TK_ESCAPE,
- TK_EACH, TK_CHECK, TK_KEY, TK_CONSTRAINT, TK_INTERSECT,
- TK_TABLE, TK_JOIN_KW, TK_THEN, TK_END, TK_DATABASE,
- TK_AS, TK_SELECT, TK_TRANSACTION,TK_ON, TK_JOIN_KW,
- TK_ALTER, TK_RAISE, TK_ELSE, TK_EXCEPT, TK_TRIGGER,
- TK_REFERENCES, TK_UNIQUE, TK_QUERY, TK_ATTACH, TK_HAVING,
- TK_GROUP, TK_UPDATE, TK_TEMP, TK_TEMP, TK_OR,
- TK_BEGIN, TK_JOIN_KW, TK_REINDEX, TK_INDEX, TK_EXCLUSIVE,
- TK_EXISTS, TK_BETWEEN, TK_NOTNULL, TK_NOT, TK_NULL,
- TK_LIKE_KW, TK_CASCADE, TK_ASC, TK_DEFERRABLE, TK_CASE,
- TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_DELETE, TK_DETACH,
- TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN,
- TK_ANALYZE, TK_PRAGMA, TK_ABORT, TK_VALUES, TK_VIRTUAL,
- TK_LIMIT, TK_WHEN, TK_WHERE, TK_RENAME, TK_AFTER,
- TK_REPLACE, TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO,
- TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT,
- TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED,
- TK_DISTINCT, TK_IS, TK_DROP, TK_FAIL, TK_FROM,
- TK_JOIN_KW, TK_LIKE_KW, TK_BY, TK_IF, TK_INTO,
- TK_OFFSET, TK_OF, TK_SET, TK_ISNULL, TK_ORDER,
+ static const unsigned char aCode[121] = {
+ TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE,
+ TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN,
+ TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD,
+ TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE,
+ TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE,
+ TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW,
+ TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT,
+ TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO,
+ TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP,
+ TK_OR, TK_UNIQUE, TK_QUERY, TK_ATTACH, TK_HAVING,
+ TK_GROUP, TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RELEASE,
+ TK_BETWEEN, TK_NOTNULL, TK_NO, TK_NOT, TK_NULL,
+ TK_LIKE_KW, TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE,
+ TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE,
+ TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE,
+ TK_PRAGMA, TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT,
+ TK_WHEN, TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE,
+ TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN,
+ TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW,
+ TK_CTIME_KW, TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT,
+ TK_IS, TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW,
+ TK_LIKE_KW, TK_BY, TK_IF, TK_ISNULL, TK_ORDER,
TK_RESTRICT, TK_JOIN_KW, TK_JOIN_KW, TK_ROLLBACK, TK_ROW,
TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_INITIALLY,
TK_ALL,
@@ -76333,6 +93540,127 @@ static int keywordCode(const char *z, int n){
n) % 127;
for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){
if( aLen[i]==n && sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){
+ testcase( i==0 ); /* REINDEX */
+ testcase( i==1 ); /* INDEXED */
+ testcase( i==2 ); /* INDEX */
+ testcase( i==3 ); /* DESC */
+ testcase( i==4 ); /* ESCAPE */
+ testcase( i==5 ); /* EACH */
+ testcase( i==6 ); /* CHECK */
+ testcase( i==7 ); /* KEY */
+ testcase( i==8 ); /* BEFORE */
+ testcase( i==9 ); /* FOREIGN */
+ testcase( i==10 ); /* FOR */
+ testcase( i==11 ); /* IGNORE */
+ testcase( i==12 ); /* REGEXP */
+ testcase( i==13 ); /* EXPLAIN */
+ testcase( i==14 ); /* INSTEAD */
+ testcase( i==15 ); /* ADD */
+ testcase( i==16 ); /* DATABASE */
+ testcase( i==17 ); /* AS */
+ testcase( i==18 ); /* SELECT */
+ testcase( i==19 ); /* TABLE */
+ testcase( i==20 ); /* LEFT */
+ testcase( i==21 ); /* THEN */
+ testcase( i==22 ); /* END */
+ testcase( i==23 ); /* DEFERRABLE */
+ testcase( i==24 ); /* ELSE */
+ testcase( i==25 ); /* EXCEPT */
+ testcase( i==26 ); /* TRANSACTION */
+ testcase( i==27 ); /* ACTION */
+ testcase( i==28 ); /* ON */
+ testcase( i==29 ); /* NATURAL */
+ testcase( i==30 ); /* ALTER */
+ testcase( i==31 ); /* RAISE */
+ testcase( i==32 ); /* EXCLUSIVE */
+ testcase( i==33 ); /* EXISTS */
+ testcase( i==34 ); /* SAVEPOINT */
+ testcase( i==35 ); /* INTERSECT */
+ testcase( i==36 ); /* TRIGGER */
+ testcase( i==37 ); /* REFERENCES */
+ testcase( i==38 ); /* CONSTRAINT */
+ testcase( i==39 ); /* INTO */
+ testcase( i==40 ); /* OFFSET */
+ testcase( i==41 ); /* OF */
+ testcase( i==42 ); /* SET */
+ testcase( i==43 ); /* TEMP */
+ testcase( i==44 ); /* TEMPORARY */
+ testcase( i==45 ); /* OR */
+ testcase( i==46 ); /* UNIQUE */
+ testcase( i==47 ); /* QUERY */
+ testcase( i==48 ); /* ATTACH */
+ testcase( i==49 ); /* HAVING */
+ testcase( i==50 ); /* GROUP */
+ testcase( i==51 ); /* UPDATE */
+ testcase( i==52 ); /* BEGIN */
+ testcase( i==53 ); /* INNER */
+ testcase( i==54 ); /* RELEASE */
+ testcase( i==55 ); /* BETWEEN */
+ testcase( i==56 ); /* NOTNULL */
+ testcase( i==57 ); /* NO */
+ testcase( i==58 ); /* NOT */
+ testcase( i==59 ); /* NULL */
+ testcase( i==60 ); /* LIKE */
+ testcase( i==61 ); /* CASCADE */
+ testcase( i==62 ); /* ASC */
+ testcase( i==63 ); /* DELETE */
+ testcase( i==64 ); /* CASE */
+ testcase( i==65 ); /* COLLATE */
+ testcase( i==66 ); /* CREATE */
+ testcase( i==67 ); /* CURRENT_DATE */
+ testcase( i==68 ); /* DETACH */
+ testcase( i==69 ); /* IMMEDIATE */
+ testcase( i==70 ); /* JOIN */
+ testcase( i==71 ); /* INSERT */
+ testcase( i==72 ); /* MATCH */
+ testcase( i==73 ); /* PLAN */
+ testcase( i==74 ); /* ANALYZE */
+ testcase( i==75 ); /* PRAGMA */
+ testcase( i==76 ); /* ABORT */
+ testcase( i==77 ); /* VALUES */
+ testcase( i==78 ); /* VIRTUAL */
+ testcase( i==79 ); /* LIMIT */
+ testcase( i==80 ); /* WHEN */
+ testcase( i==81 ); /* WHERE */
+ testcase( i==82 ); /* RENAME */
+ testcase( i==83 ); /* AFTER */
+ testcase( i==84 ); /* REPLACE */
+ testcase( i==85 ); /* AND */
+ testcase( i==86 ); /* DEFAULT */
+ testcase( i==87 ); /* AUTOINCREMENT */
+ testcase( i==88 ); /* TO */
+ testcase( i==89 ); /* IN */
+ testcase( i==90 ); /* CAST */
+ testcase( i==91 ); /* COLUMN */
+ testcase( i==92 ); /* COMMIT */
+ testcase( i==93 ); /* CONFLICT */
+ testcase( i==94 ); /* CROSS */
+ testcase( i==95 ); /* CURRENT_TIMESTAMP */
+ testcase( i==96 ); /* CURRENT_TIME */
+ testcase( i==97 ); /* PRIMARY */
+ testcase( i==98 ); /* DEFERRED */
+ testcase( i==99 ); /* DISTINCT */
+ testcase( i==100 ); /* IS */
+ testcase( i==101 ); /* DROP */
+ testcase( i==102 ); /* FAIL */
+ testcase( i==103 ); /* FROM */
+ testcase( i==104 ); /* FULL */
+ testcase( i==105 ); /* GLOB */
+ testcase( i==106 ); /* BY */
+ testcase( i==107 ); /* IF */
+ testcase( i==108 ); /* ISNULL */
+ testcase( i==109 ); /* ORDER */
+ testcase( i==110 ); /* RESTRICT */
+ testcase( i==111 ); /* OUTER */
+ testcase( i==112 ); /* RIGHT */
+ testcase( i==113 ); /* ROLLBACK */
+ testcase( i==114 ); /* ROW */
+ testcase( i==115 ); /* UNION */
+ testcase( i==116 ); /* USING */
+ testcase( i==117 ); /* VACUUM */
+ testcase( i==118 ); /* VIEW */
+ testcase( i==119 ); /* INITIALLY */
+ testcase( i==120 ); /* ALL */
return aCode[i];
}
}
@@ -76402,14 +93730,19 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
int i, c;
switch( *z ){
case ' ': case '\t': case '\n': case '\f': case '\r': {
- for(i=1; isspace(z[i]); i++){}
+ testcase( z[0]==' ' );
+ testcase( z[0]=='\t' );
+ testcase( z[0]=='\n' );
+ testcase( z[0]=='\f' );
+ testcase( z[0]=='\r' );
+ for(i=1; sqlite3Isspace(z[i]); i++){}
*tokenType = TK_SPACE;
return i;
}
case '-': {
if( z[1]=='-' ){
for(i=2; (c=z[i])!=0 && c!='\n'; i++){}
- *tokenType = TK_COMMENT;
+ *tokenType = TK_SPACE;
return i;
}
*tokenType = TK_MINUS;
@@ -76442,7 +93775,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){}
if( c ) i++;
- *tokenType = TK_COMMENT;
+ *tokenType = TK_SPACE;
return i;
}
case '%': {
@@ -76514,6 +93847,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
case '\'':
case '"': {
int delim = z[0];
+ testcase( delim=='`' );
+ testcase( delim=='\'' );
+ testcase( delim=='"' );
for(i=1; (c=z[i])!=0; i++){
if( c==delim ){
if( z[i+1]==delim ){
@@ -76523,9 +93859,12 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
}
}
- if( c ){
+ if( c=='\'' ){
*tokenType = TK_STRING;
return i+1;
+ }else if( c!=0 ){
+ *tokenType = TK_ID;
+ return i+1;
}else{
*tokenType = TK_ILLEGAL;
return i;
@@ -76533,7 +93872,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
case '.': {
#ifndef SQLITE_OMIT_FLOATING_POINT
- if( !isdigit(z[1]) )
+ if( !sqlite3Isdigit(z[1]) )
#endif
{
*tokenType = TK_DOT;
@@ -76544,21 +93883,25 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': {
+ testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' );
+ testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' );
+ testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' );
+ testcase( z[0]=='9' );
*tokenType = TK_INTEGER;
- for(i=0; isdigit(z[i]); i++){}
+ for(i=0; sqlite3Isdigit(z[i]); i++){}
#ifndef SQLITE_OMIT_FLOATING_POINT
if( z[i]=='.' ){
i++;
- while( isdigit(z[i]) ){ i++; }
+ while( sqlite3Isdigit(z[i]) ){ i++; }
*tokenType = TK_FLOAT;
}
if( (z[i]=='e' || z[i]=='E') &&
- ( isdigit(z[i+1])
- || ((z[i+1]=='+' || z[i+1]=='-') && isdigit(z[i+2]))
+ ( sqlite3Isdigit(z[i+1])
+ || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2]))
)
){
i += 2;
- while( isdigit(z[i]) ){ i++; }
+ while( sqlite3Isdigit(z[i]) ){ i++; }
*tokenType = TK_FLOAT;
}
#endif
@@ -76575,11 +93918,11 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
case '?': {
*tokenType = TK_VARIABLE;
- for(i=1; isdigit(z[i]); i++){}
+ for(i=1; sqlite3Isdigit(z[i]); i++){}
return i;
}
case '#': {
- for(i=1; isdigit(z[i]); i++){}
+ for(i=1; sqlite3Isdigit(z[i]); i++){}
if( i>1 ){
/* Parameters of the form #NNN (where NNN is a number) are used
** internally by sqlite3NestedParse. */
@@ -76595,6 +93938,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
case '@': /* For compatibility with MS SQL Server */
case ':': {
int n = 0;
+ testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' );
*tokenType = TK_VARIABLE;
for(i=1; (c=z[i])!=0; i++){
if( IdChar(c) ){
@@ -76603,7 +93947,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}else if( c=='(' && n>0 ){
do{
i++;
- }while( (c=z[i])!=0 && !isspace(c) && c!=')' );
+ }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' );
if( c==')' ){
i++;
}else{
@@ -76622,10 +93966,11 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
}
#ifndef SQLITE_OMIT_BLOB_LITERAL
case 'x': case 'X': {
+ testcase( z[0]=='x' ); testcase( z[0]=='X' );
if( z[1]=='\'' ){
*tokenType = TK_BLOB;
for(i=2; (c=z[i])!=0 && c!='\''; i++){
- if( !isxdigit(c) ){
+ if( !sqlite3Isxdigit(c) ){
*tokenType = TK_ILLEGAL;
}
}
@@ -76652,41 +93997,45 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
/*
** Run the parser on the given SQL string. The parser structure is
** passed in. An SQLITE_ status code is returned. If an error occurs
-** and pzErrMsg!=NULL then an error message might be written into
-** memory obtained from sqlite3_malloc() and *pzErrMsg made to point to that
-** error message. Or maybe not.
+** then an and attempt is made to write an error message into
+** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that
+** error message.
*/
SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
- int nErr = 0;
- int i;
- void *pEngine;
- int tokenType;
- int lastTokenParsed = -1;
- sqlite3 *db = pParse->db;
- int mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
+ int nErr = 0; /* Number of errors encountered */
+ int i; /* Loop counter */
+ void *pEngine; /* The LEMON-generated LALR(1) parser */
+ int tokenType; /* type of the next token */
+ int lastTokenParsed = -1; /* type of the previous token */
+ u8 enableLookaside; /* Saved value of db->lookaside.bEnabled */
+ sqlite3 *db = pParse->db; /* The database connection */
+ int mxSqlLen; /* Max length of an SQL string */
+
+ mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
if( db->activeVdbeCnt==0 ){
db->u1.isInterrupted = 0;
}
pParse->rc = SQLITE_OK;
- pParse->zTail = pParse->zSql = zSql;
+ pParse->zTail = zSql;
i = 0;
- pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3_malloc);
+ assert( pzErrMsg!=0 );
+ pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3Malloc);
if( pEngine==0 ){
db->mallocFailed = 1;
return SQLITE_NOMEM;
}
- assert( pParse->sLastToken.dyn==0 );
assert( pParse->pNewTable==0 );
assert( pParse->pNewTrigger==0 );
assert( pParse->nVar==0 );
assert( pParse->nVarExpr==0 );
assert( pParse->nVarExprAlloc==0 );
assert( pParse->apVarExpr==0 );
+ enableLookaside = db->lookaside.bEnabled;
+ if( db->lookaside.pStart ) db->lookaside.bEnabled = 1;
while( !db->mallocFailed && zSql[i]!=0 ){
assert( i>=0 );
- pParse->sLastToken.z = (u8*)&zSql[i];
- assert( pParse->sLastToken.dyn==0 );
+ pParse->sLastToken.z = &zSql[i];
pParse->sLastToken.n = sqlite3GetToken((unsigned char*)&zSql[i],&tokenType);
i += pParse->sLastToken.n;
if( i>mxSqlLen ){
@@ -76694,21 +94043,18 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzEr
break;
}
switch( tokenType ){
- case TK_SPACE:
- case TK_COMMENT: {
+ case TK_SPACE: {
if( db->u1.isInterrupted ){
+ sqlite3ErrorMsg(pParse, "interrupt");
pParse->rc = SQLITE_INTERRUPT;
- sqlite3SetString(pzErrMsg, "interrupt", (char*)0);
goto abort_parse;
}
break;
}
case TK_ILLEGAL: {
- if( pzErrMsg ){
- sqlite3_free(*pzErrMsg);
- *pzErrMsg = sqlite3MPrintf(db, "unrecognized token: \"%T\"",
- &pParse->sLastToken);
- }
+ sqlite3DbFree(db, *pzErrMsg);
+ *pzErrMsg = sqlite3MPrintf(db, "unrecognized token: \"%T\"",
+ &pParse->sLastToken);
nErr++;
goto abort_parse;
}
@@ -76734,19 +94080,22 @@ abort_parse:
}
sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);
}
+#ifdef YYTRACKMAXSTACKDEPTH
+ sqlite3StatusSet(SQLITE_STATUS_PARSER_STACK,
+ sqlite3ParserStackPeak(pEngine)
+ );
+#endif /* YYDEBUG */
sqlite3ParserFree(pEngine, sqlite3_free);
+ db->lookaside.bEnabled = enableLookaside;
if( db->mallocFailed ){
pParse->rc = SQLITE_NOMEM;
}
if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){
- sqlite3SetString(&pParse->zErrMsg, sqlite3ErrStr(pParse->rc), (char*)0);
+ sqlite3SetString(&pParse->zErrMsg, db, "%s", sqlite3ErrStr(pParse->rc));
}
+ assert( pzErrMsg!=0 );
if( pParse->zErrMsg ){
- if( pzErrMsg && *pzErrMsg==0 ){
- *pzErrMsg = pParse->zErrMsg;
- }else{
- sqlite3_free(pParse->zErrMsg);
- }
+ *pzErrMsg = pParse->zErrMsg;
pParse->zErrMsg = 0;
nErr++;
}
@@ -76756,13 +94105,13 @@ abort_parse:
}
#ifndef SQLITE_OMIT_SHARED_CACHE
if( pParse->nested==0 ){
- sqlite3_free(pParse->aTableLock);
+ sqlite3DbFree(db, pParse->aTableLock);
pParse->aTableLock = 0;
pParse->nTableLock = 0;
}
#endif
#ifndef SQLITE_OMIT_VIRTUALTABLE
- sqlite3_free(pParse->apVtabLock);
+ sqlite3DbFree(db, pParse->apVtabLock);
#endif
if( !IN_DECLARE_VTAB ){
@@ -76773,9 +94122,20 @@ abort_parse:
sqlite3DeleteTable(pParse->pNewTable);
}
- sqlite3DeleteTrigger(pParse->pNewTrigger);
- sqlite3_free(pParse->apVarExpr);
- if( nErr>0 && (pParse->rc==SQLITE_OK || pParse->rc==SQLITE_DONE) ){
+ sqlite3DeleteTrigger(db, pParse->pNewTrigger);
+ sqlite3DbFree(db, pParse->apVarExpr);
+ sqlite3DbFree(db, pParse->aAlias);
+ while( pParse->pAinc ){
+ AutoincInfo *p = pParse->pAinc;
+ pParse->pAinc = p->pNext;
+ sqlite3DbFree(db, p);
+ }
+ while( pParse->pZombieTab ){
+ Table *p = pParse->pZombieTab;
+ pParse->pZombieTab = p->pNextZombie;
+ sqlite3DeleteTable(p);
+ }
+ if( nErr>0 && pParse->rc==SQLITE_OK ){
pParse->rc = SQLITE_ERROR;
}
return nErr;
@@ -76801,7 +94161,7 @@ abort_parse:
** separating it out, the code will be automatically omitted from
** static links that do not use it.
**
-** $Id: complete.c,v 1.6 2007/08/27 23:26:59 drh Exp $
+** $Id: complete.c,v 1.8 2009/04/28 04:46:42 drh Exp $
*/
#ifndef SQLITE_OMIT_COMPLETE
@@ -76896,7 +94256,7 @@ SQLITE_API int sqlite3_complete(const char *zSql){
/* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */
/* 0 START: */ { 0, 0, 1, 2, 3, 1, 1, 1, },
/* 1 NORMAL: */ { 0, 1, 1, 1, 1, 1, 1, 1, },
- /* 2 EXPLAIN: */ { 0, 2, 1, 1, 3, 1, 1, 1, },
+ /* 2 EXPLAIN: */ { 0, 2, 2, 1, 3, 1, 1, 1, },
/* 3 CREATE: */ { 0, 3, 1, 1, 1, 3, 4, 1, },
/* 4 TRIGGER: */ { 5, 4, 4, 4, 4, 4, 4, 4, },
/* 5 SEMI: */ { 5, 5, 4, 4, 4, 4, 4, 6, },
@@ -77042,11 +94402,17 @@ SQLITE_API int sqlite3_complete16(const void *zSql){
char const *zSql8;
int rc = SQLITE_NOMEM;
+#ifndef SQLITE_OMIT_AUTOINIT
+ rc = sqlite3_initialize();
+ if( rc ) return rc;
+#endif
pVal = sqlite3ValueNew(0);
sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC);
zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8);
if( zSql8 ){
rc = sqlite3_complete(zSql8);
+ }else{
+ rc = SQLITE_NOMEM;
}
sqlite3ValueFree(pVal);
return sqlite3ApiExit(0, rc);
@@ -77071,9 +94437,8 @@ SQLITE_API int sqlite3_complete16(const void *zSql){
** implement the programmer interface to the library. Routines in
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
-**
-** $Id: main.c,v 1.439 2008/05/13 13:27:34 drh Exp $
*/
+
#ifdef SQLITE_ENABLE_FTS3
/************** Include fts3.h in the middle of main.c ***********************/
/************** Begin file fts3.h ********************************************/
@@ -77106,12 +94471,80 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db);
/************** End of fts3.h ************************************************/
/************** Continuing where we left off in main.c ***********************/
#endif
+#ifdef SQLITE_ENABLE_RTREE
+/************** Include rtree.h in the middle of main.c **********************/
+/************** Begin file rtree.h *******************************************/
+/*
+** 2008 May 26
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This header file is used by programs that want to link against the
+** RTREE library. All it does is declare the sqlite3RtreeInit() interface.
+*/
+
+#if 0
+extern "C" {
+#endif /* __cplusplus */
+
+SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db);
+
+#if 0
+} /* extern "C" */
+#endif /* __cplusplus */
+
+/************** End of rtree.h ***********************************************/
+/************** Continuing where we left off in main.c ***********************/
+#endif
+#ifdef SQLITE_ENABLE_ICU
+/************** Include sqliteicu.h in the middle of main.c ******************/
+/************** Begin file sqliteicu.h ***************************************/
+/*
+** 2008 May 26
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This header file is used by programs that want to link against the
+** ICU extension. All it does is declare the sqlite3IcuInit() interface.
+*/
+
+#if 0
+extern "C" {
+#endif /* __cplusplus */
+
+SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db);
+
+#if 0
+} /* extern "C" */
+#endif /* __cplusplus */
+
+
+/************** End of sqliteicu.h *******************************************/
+/************** Continuing where we left off in main.c ***********************/
+#endif
/*
** The version of the library
*/
+#ifndef SQLITE_AMALGAMATION
SQLITE_API const char sqlite3_version[] = SQLITE_VERSION;
+#endif
SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; }
+SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; }
SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }
@@ -77135,14 +94568,431 @@ SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*, ...) = 0;
SQLITE_API char *sqlite3_temp_directory = 0;
/*
-** Routine needed to support the testcase() macro.
+** Initialize SQLite.
+**
+** This routine must be called to initialize the memory allocation,
+** VFS, and mutex subsystems prior to doing any serious work with
+** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT
+** this routine will be called automatically by key routines such as
+** sqlite3_open().
+**
+** This routine is a no-op except on its very first call for the process,
+** or for the first call after a call to sqlite3_shutdown.
+**
+** The first thread to call this routine runs the initialization to
+** completion. If subsequent threads call this routine before the first
+** thread has finished the initialization process, then the subsequent
+** threads must block until the first thread finishes with the initialization.
+**
+** The first thread might call this routine recursively. Recursive
+** calls to this routine should not block, of course. Otherwise the
+** initialization process would never complete.
+**
+** Let X be the first thread to enter this routine. Let Y be some other
+** thread. Then while the initial invocation of this routine by X is
+** incomplete, it is required that:
+**
+** * Calls to this routine from Y must block until the outer-most
+** call by X completes.
+**
+** * Recursive calls to this routine from thread X return immediately
+** without blocking.
*/
-#ifdef SQLITE_COVERAGE_TEST
-SQLITE_PRIVATE void sqlite3Coverage(int x){
- static int dummy = 0;
- dummy += x;
+SQLITE_API int sqlite3_initialize(void){
+ sqlite3_mutex *pMaster; /* The main static mutex */
+ int rc; /* Result code */
+
+#ifdef SQLITE_OMIT_WSD
+ rc = sqlite3_wsd_init(4096, 24);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+#endif
+
+ /* If SQLite is already completely initialized, then this call
+ ** to sqlite3_initialize() should be a no-op. But the initialization
+ ** must be complete. So isInit must not be set until the very end
+ ** of this routine.
+ */
+ if( sqlite3GlobalConfig.isInit ) return SQLITE_OK;
+
+ /* Make sure the mutex subsystem is initialized. If unable to
+ ** initialize the mutex subsystem, return early with the error.
+ ** If the system is so sick that we are unable to allocate a mutex,
+ ** there is not much SQLite is going to be able to do.
+ **
+ ** The mutex subsystem must take care of serializing its own
+ ** initialization.
+ */
+ rc = sqlite3MutexInit();
+ if( rc ) return rc;
+
+ /* Initialize the malloc() system and the recursive pInitMutex mutex.
+ ** This operation is protected by the STATIC_MASTER mutex. Note that
+ ** MutexAlloc() is called for a static mutex prior to initializing the
+ ** malloc subsystem - this implies that the allocation of a static
+ ** mutex must not require support from the malloc subsystem.
+ */
+ pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
+ sqlite3_mutex_enter(pMaster);
+ sqlite3GlobalConfig.isMutexInit = 1;
+ if( !sqlite3GlobalConfig.isMallocInit ){
+ rc = sqlite3MallocInit();
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3GlobalConfig.isMallocInit = 1;
+ if( !sqlite3GlobalConfig.pInitMutex ){
+ sqlite3GlobalConfig.pInitMutex =
+ sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
+ if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){
+ rc = SQLITE_NOMEM;
+ }
+ }
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3GlobalConfig.nRefInitMutex++;
+ }
+ sqlite3_mutex_leave(pMaster);
+
+ /* If rc is not SQLITE_OK at this point, then either the malloc
+ ** subsystem could not be initialized or the system failed to allocate
+ ** the pInitMutex mutex. Return an error in either case. */
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ /* Do the rest of the initialization under the recursive mutex so
+ ** that we will be able to handle recursive calls into
+ ** sqlite3_initialize(). The recursive calls normally come through
+ ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other
+ ** recursive calls might also be possible.
+ */
+ sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex);
+ if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){
+ FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
+ sqlite3GlobalConfig.inProgress = 1;
+ memset(pHash, 0, sizeof(sqlite3GlobalFunctions));
+ sqlite3RegisterGlobalFunctions();
+ if( sqlite3GlobalConfig.isPCacheInit==0 ){
+ rc = sqlite3PcacheInitialize();
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3GlobalConfig.isPCacheInit = 1;
+ rc = sqlite3OsInit();
+ }
+ if( rc==SQLITE_OK ){
+ sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
+ sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
+ sqlite3GlobalConfig.isInit = 1;
+ }
+ sqlite3GlobalConfig.inProgress = 0;
+ }
+ sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex);
+
+ /* Go back under the static mutex and clean up the recursive
+ ** mutex to prevent a resource leak.
+ */
+ sqlite3_mutex_enter(pMaster);
+ sqlite3GlobalConfig.nRefInitMutex--;
+ if( sqlite3GlobalConfig.nRefInitMutex<=0 ){
+ assert( sqlite3GlobalConfig.nRefInitMutex==0 );
+ sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex);
+ sqlite3GlobalConfig.pInitMutex = 0;
+ }
+ sqlite3_mutex_leave(pMaster);
+
+ /* The following is just a sanity check to make sure SQLite has
+ ** been compiled correctly. It is important to run this code, but
+ ** we don't want to run it too often and soak up CPU cycles for no
+ ** reason. So we run it once during initialization.
+ */
+#ifndef NDEBUG
+#ifndef SQLITE_OMIT_FLOATING_POINT
+ /* This section of code's only "output" is via assert() statements. */
+ if ( rc==SQLITE_OK ){
+ u64 x = (((u64)1)<<63)-1;
+ double y;
+ assert(sizeof(x)==8);
+ assert(sizeof(x)==sizeof(y));
+ memcpy(&y, &x, 8);
+ assert( sqlite3IsNaN(y) );
+ }
+#endif
+#endif
+
+ return rc;
}
+
+/*
+** Undo the effects of sqlite3_initialize(). Must not be called while
+** there are outstanding database connections or memory allocations or
+** while any part of SQLite is otherwise in use in any thread. This
+** routine is not threadsafe. But it is safe to invoke this routine
+** on when SQLite is already shut down. If SQLite is already shut down
+** when this routine is invoked, then this routine is a harmless no-op.
+*/
+SQLITE_API int sqlite3_shutdown(void){
+ if( sqlite3GlobalConfig.isInit ){
+ sqlite3_os_end();
+ sqlite3_reset_auto_extension();
+ sqlite3GlobalConfig.isInit = 0;
+ }
+ if( sqlite3GlobalConfig.isPCacheInit ){
+ sqlite3PcacheShutdown();
+ sqlite3GlobalConfig.isPCacheInit = 0;
+ }
+ if( sqlite3GlobalConfig.isMallocInit ){
+ sqlite3MallocEnd();
+ sqlite3GlobalConfig.isMallocInit = 0;
+ }
+ if( sqlite3GlobalConfig.isMutexInit ){
+ sqlite3MutexEnd();
+ sqlite3GlobalConfig.isMutexInit = 0;
+ }
+
+ return SQLITE_OK;
+}
+
+/*
+** This API allows applications to modify the global configuration of
+** the SQLite library at run-time.
+**
+** This routine should only be called when there are no outstanding
+** database connections or memory allocations. This routine is not
+** threadsafe. Failure to heed these warnings can lead to unpredictable
+** behavior.
+*/
+SQLITE_API int sqlite3_config(int op, ...){
+ va_list ap;
+ int rc = SQLITE_OK;
+
+ /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while
+ ** the SQLite library is in use. */
+ if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE;
+
+ va_start(ap, op);
+ switch( op ){
+
+ /* Mutex configuration options are only available in a threadsafe
+ ** compile.
+ */
+#if SQLITE_THREADSAFE
+ case SQLITE_CONFIG_SINGLETHREAD: {
+ /* Disable all mutexing */
+ sqlite3GlobalConfig.bCoreMutex = 0;
+ sqlite3GlobalConfig.bFullMutex = 0;
+ break;
+ }
+ case SQLITE_CONFIG_MULTITHREAD: {
+ /* Disable mutexing of database connections */
+ /* Enable mutexing of core data structures */
+ sqlite3GlobalConfig.bCoreMutex = 1;
+ sqlite3GlobalConfig.bFullMutex = 0;
+ break;
+ }
+ case SQLITE_CONFIG_SERIALIZED: {
+ /* Enable all mutexing */
+ sqlite3GlobalConfig.bCoreMutex = 1;
+ sqlite3GlobalConfig.bFullMutex = 1;
+ break;
+ }
+ case SQLITE_CONFIG_MUTEX: {
+ /* Specify an alternative mutex implementation */
+ sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*);
+ break;
+ }
+ case SQLITE_CONFIG_GETMUTEX: {
+ /* Retrieve the current mutex implementation */
+ *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex;
+ break;
+ }
+#endif
+
+
+ case SQLITE_CONFIG_MALLOC: {
+ /* Specify an alternative malloc implementation */
+ sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*);
+ break;
+ }
+ case SQLITE_CONFIG_GETMALLOC: {
+ /* Retrieve the current malloc() implementation */
+ if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault();
+ *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m;
+ break;
+ }
+ case SQLITE_CONFIG_MEMSTATUS: {
+ /* Enable or disable the malloc status collection */
+ sqlite3GlobalConfig.bMemstat = va_arg(ap, int);
+ break;
+ }
+ case SQLITE_CONFIG_SCRATCH: {
+ /* Designate a buffer for scratch memory space */
+ sqlite3GlobalConfig.pScratch = va_arg(ap, void*);
+ sqlite3GlobalConfig.szScratch = va_arg(ap, int);
+ sqlite3GlobalConfig.nScratch = va_arg(ap, int);
+ break;
+ }
+ case SQLITE_CONFIG_PAGECACHE: {
+ /* Designate a buffer for page cache memory space */
+ sqlite3GlobalConfig.pPage = va_arg(ap, void*);
+ sqlite3GlobalConfig.szPage = va_arg(ap, int);
+ sqlite3GlobalConfig.nPage = va_arg(ap, int);
+ break;
+ }
+
+ case SQLITE_CONFIG_PCACHE: {
+ /* Specify an alternative page cache implementation */
+ sqlite3GlobalConfig.pcache = *va_arg(ap, sqlite3_pcache_methods*);
+ break;
+ }
+
+ case SQLITE_CONFIG_GETPCACHE: {
+ if( sqlite3GlobalConfig.pcache.xInit==0 ){
+ sqlite3PCacheSetDefault();
+ }
+ *va_arg(ap, sqlite3_pcache_methods*) = sqlite3GlobalConfig.pcache;
+ break;
+ }
+
+#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
+ case SQLITE_CONFIG_HEAP: {
+ /* Designate a buffer for heap memory space */
+ sqlite3GlobalConfig.pHeap = va_arg(ap, void*);
+ sqlite3GlobalConfig.nHeap = va_arg(ap, int);
+ sqlite3GlobalConfig.mnReq = va_arg(ap, int);
+
+ if( sqlite3GlobalConfig.pHeap==0 ){
+ /* If the heap pointer is NULL, then restore the malloc implementation
+ ** back to NULL pointers too. This will cause the malloc to go
+ ** back to its default implementation when sqlite3_initialize() is
+ ** run.
+ */
+ memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m));
+ }else{
+ /* The heap pointer is not NULL, then install one of the
+ ** mem5.c/mem3.c methods. If neither ENABLE_MEMSYS3 nor
+ ** ENABLE_MEMSYS5 is defined, return an error.
+ */
+#ifdef SQLITE_ENABLE_MEMSYS3
+ sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3();
#endif
+#ifdef SQLITE_ENABLE_MEMSYS5
+ sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5();
+#endif
+ }
+ break;
+ }
+#endif
+
+ case SQLITE_CONFIG_LOOKASIDE: {
+ sqlite3GlobalConfig.szLookaside = va_arg(ap, int);
+ sqlite3GlobalConfig.nLookaside = va_arg(ap, int);
+ break;
+ }
+
+ default: {
+ rc = SQLITE_ERROR;
+ break;
+ }
+ }
+ va_end(ap);
+ return rc;
+}
+
+/*
+** Set up the lookaside buffers for a database connection.
+** Return SQLITE_OK on success.
+** If lookaside is already active, return SQLITE_BUSY.
+**
+** The sz parameter is the number of bytes in each lookaside slot.
+** The cnt parameter is the number of slots. If pStart is NULL the
+** space for the lookaside memory is obtained from sqlite3_malloc().
+** If pStart is not NULL then it is sz*cnt bytes of memory to use for
+** the lookaside memory.
+*/
+static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){
+ void *pStart;
+ if( db->lookaside.nOut ){
+ return SQLITE_BUSY;
+ }
+ /* Free any existing lookaside buffer for this handle before
+ ** allocating a new one so we don't have to have space for
+ ** both at the same time.
+ */
+ if( db->lookaside.bMalloced ){
+ sqlite3_free(db->lookaside.pStart);
+ }
+ /* The size of a lookaside slot needs to be larger than a pointer
+ ** to be useful.
+ */
+ if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0;
+ if( cnt<0 ) cnt = 0;
+ if( sz==0 || cnt==0 ){
+ sz = 0;
+ pStart = 0;
+ }else if( pBuf==0 ){
+ sz = ROUND8(sz);
+ sqlite3BeginBenignMalloc();
+ pStart = sqlite3Malloc( sz*cnt );
+ sqlite3EndBenignMalloc();
+ }else{
+ sz = ROUNDDOWN8(sz);
+ pStart = pBuf;
+ }
+ db->lookaside.pStart = pStart;
+ db->lookaside.pFree = 0;
+ db->lookaside.sz = (u16)sz;
+ if( pStart ){
+ int i;
+ LookasideSlot *p;
+ assert( sz > (int)sizeof(LookasideSlot*) );
+ p = (LookasideSlot*)pStart;
+ for(i=cnt-1; i>=0; i--){
+ p->pNext = db->lookaside.pFree;
+ db->lookaside.pFree = p;
+ p = (LookasideSlot*)&((u8*)p)[sz];
+ }
+ db->lookaside.pEnd = p;
+ db->lookaside.bEnabled = 1;
+ db->lookaside.bMalloced = pBuf==0 ?1:0;
+ }else{
+ db->lookaside.pEnd = 0;
+ db->lookaside.bEnabled = 0;
+ db->lookaside.bMalloced = 0;
+ }
+ return SQLITE_OK;
+}
+
+/*
+** Return the mutex associated with a database connection.
+*/
+SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){
+ return db->mutex;
+}
+
+/*
+** Configuration settings for an individual database connection
+*/
+SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
+ va_list ap;
+ int rc;
+ va_start(ap, op);
+ switch( op ){
+ case SQLITE_DBCONFIG_LOOKASIDE: {
+ void *pBuf = va_arg(ap, void*);
+ int sz = va_arg(ap, int);
+ int cnt = va_arg(ap, int);
+ rc = setupLookaside(db, pBuf, sz, cnt);
+ break;
+ }
+ default: {
+ rc = SQLITE_ERROR;
+ break;
+ }
+ }
+ va_end(ap);
+ return rc;
+}
/*
@@ -77197,6 +95047,7 @@ static int nocaseCollatingFunc(
){
int r = sqlite3StrNICmp(
(const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2);
+ UNUSED_PARAMETER(NotUsed);
if( 0==r ){
r = nKey1-nKey2;
}
@@ -77225,6 +95076,22 @@ SQLITE_API int sqlite3_total_changes(sqlite3 *db){
}
/*
+** Close all open savepoints. This function only manipulates fields of the
+** database handle object, it does not close any savepoints that may be open
+** at the b-tree/pager level.
+*/
+SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){
+ while( db->pSavepoint ){
+ Savepoint *pTmp = db->pSavepoint;
+ db->pSavepoint = pTmp->pNext;
+ sqlite3DbFree(db, pTmp);
+ }
+ db->nSavepoint = 0;
+ db->nStatement = 0;
+ db->isTransactionSavepoint = 0;
+}
+
+/*
** Close an existing SQLite database
*/
SQLITE_API int sqlite3_close(sqlite3 *db){
@@ -77239,13 +95106,6 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
}
sqlite3_mutex_enter(db->mutex);
-#ifdef SQLITE_SSE
- {
- extern void sqlite3SseCleanup(sqlite3*);
- sqlite3SseCleanup(db);
- }
-#endif
-
sqlite3ResetInternalSchema(db, 0);
/* If a transaction is open, the ResetInternalSchema() call above
@@ -77260,13 +95120,26 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
/* If there are any outstanding VMs, return SQLITE_BUSY. */
if( db->pVdbe ){
sqlite3Error(db, SQLITE_BUSY,
- "Unable to close due to unfinalised statements");
+ "unable to close due to unfinalised statements");
sqlite3_mutex_leave(db->mutex);
return SQLITE_BUSY;
}
assert( sqlite3SafetyCheckSickOrOk(db) );
for(j=0; j<db->nDb; j++){
+ Btree *pBt = db->aDb[j].pBt;
+ if( pBt && sqlite3BtreeIsInBackup(pBt) ){
+ sqlite3Error(db, SQLITE_BUSY,
+ "unable to close due to unfinished backup operation");
+ sqlite3_mutex_leave(db->mutex);
+ return SQLITE_BUSY;
+ }
+ }
+
+ /* Free any outstanding Savepoint structures. */
+ sqlite3CloseSavepoints(db);
+
+ for(j=0; j<db->nDb; j++){
struct Db *pDb = &db->aDb[j];
if( pDb->pBt ){
sqlite3BtreeClose(pDb->pBt);
@@ -77277,16 +95150,25 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
}
}
sqlite3ResetInternalSchema(db, 0);
+
+ /* Tell the code in notify.c that the connection no longer holds any
+ ** locks and does not require any further unlock-notify callbacks.
+ */
+ sqlite3ConnectionClosed(db);
+
assert( db->nDb<=2 );
assert( db->aDb==db->aDbStatic );
- for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){
- FuncDef *pFunc, *pNext;
- for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){
- pNext = pFunc->pNext;
- sqlite3_free(pFunc);
+ for(j=0; j<ArraySize(db->aFunc.a); j++){
+ FuncDef *pNext, *pHash, *p;
+ for(p=db->aFunc.a[j]; p; p=pHash){
+ pHash = p->pHash;
+ while( p ){
+ pNext = p->pNext;
+ sqlite3DbFree(db, p);
+ p = pNext;
+ }
}
}
-
for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
CollSeq *pColl = (CollSeq *)sqliteHashData(i);
/* Invoke any destructors registered for collation sequence user data. */
@@ -77295,7 +95177,7 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
pColl[j].xDel(pColl[j].pUser);
}
}
- sqlite3_free(pColl);
+ sqlite3DbFree(db, pColl);
}
sqlite3HashClear(&db->aCollSeq);
#ifndef SQLITE_OMIT_VIRTUALTABLE
@@ -77304,12 +95186,11 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
if( pMod->xDestroy ){
pMod->xDestroy(pMod->pAux);
}
- sqlite3_free(pMod);
+ sqlite3DbFree(db, pMod);
}
sqlite3HashClear(&db->aModule);
#endif
- sqlite3HashClear(&db->aFunc);
sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
if( db->pErr ){
sqlite3ValueFree(db->pErr);
@@ -77324,10 +95205,14 @@ SQLITE_API int sqlite3_close(sqlite3 *db){
** the same sqliteMalloc() as the one that allocates the database
** structure?
*/
- sqlite3_free(db->aDb[1].pSchema);
+ sqlite3DbFree(db, db->aDb[1].pSchema);
sqlite3_mutex_leave(db->mutex);
db->magic = SQLITE_MAGIC_CLOSED;
sqlite3_mutex_free(db->mutex);
+ assert( db->lookaside.nOut==0 ); /* Fails on a lookaside memory leak */
+ if( db->lookaside.bMalloced ){
+ sqlite3_free(db->lookaside.pStart);
+ }
sqlite3_free(db);
return SQLITE_OK;
}
@@ -77339,7 +95224,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db){
int i;
int inTrans = 0;
assert( sqlite3_mutex_held(db->mutex) );
- sqlite3FaultBeginBenign(SQLITE_FAULTINJECTOR_MALLOC);
+ sqlite3BeginBenignMalloc();
for(i=0; i<db->nDb; i++){
if( db->aDb[i].pBt ){
if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){
@@ -77350,13 +95235,16 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db){
}
}
sqlite3VtabRollback(db);
- sqlite3FaultEndBenign(SQLITE_FAULTINJECTOR_MALLOC);
+ sqlite3EndBenignMalloc();
if( db->flags&SQLITE_InternChanges ){
sqlite3ExpirePreparedStatements(db);
sqlite3ResetInternalSchema(db, 0);
}
+ /* Any deferred constraint violations have now been resolved. */
+ db->nDeferredCons = 0;
+
/* If one has been configured, invoke the rollback-hook callback */
if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
db->xRollbackCallback(db->pRollbackArg);
@@ -77368,37 +95256,41 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db){
** argument.
*/
SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
- const char *z;
- switch( rc & 0xff ){
- case SQLITE_ROW:
- case SQLITE_DONE:
- case SQLITE_OK: z = "not an error"; break;
- case SQLITE_ERROR: z = "SQL logic error or missing database"; break;
- case SQLITE_PERM: z = "access permission denied"; break;
- case SQLITE_ABORT: z = "callback requested query abort"; break;
- case SQLITE_BUSY: z = "database is locked"; break;
- case SQLITE_LOCKED: z = "database table is locked"; break;
- case SQLITE_NOMEM: z = "out of memory"; break;
- case SQLITE_READONLY: z = "attempt to write a readonly database"; break;
- case SQLITE_INTERRUPT: z = "interrupted"; break;
- case SQLITE_IOERR: z = "disk I/O error"; break;
- case SQLITE_CORRUPT: z = "database disk image is malformed"; break;
- case SQLITE_FULL: z = "database or disk is full"; break;
- case SQLITE_CANTOPEN: z = "unable to open database file"; break;
- case SQLITE_EMPTY: z = "table contains no data"; break;
- case SQLITE_SCHEMA: z = "database schema has changed"; break;
- case SQLITE_TOOBIG: z = "String or BLOB exceeded size limit"; break;
- case SQLITE_CONSTRAINT: z = "constraint failed"; break;
- case SQLITE_MISMATCH: z = "datatype mismatch"; break;
- case SQLITE_MISUSE: z = "library routine called out of sequence";break;
- case SQLITE_NOLFS: z = "large file support is disabled"; break;
- case SQLITE_AUTH: z = "authorization denied"; break;
- case SQLITE_FORMAT: z = "auxiliary database format error"; break;
- case SQLITE_RANGE: z = "bind or column index out of range"; break;
- case SQLITE_NOTADB: z = "file is encrypted or is not a database";break;
- default: z = "unknown error"; break;
+ static const char* const aMsg[] = {
+ /* SQLITE_OK */ "not an error",
+ /* SQLITE_ERROR */ "SQL logic error or missing database",
+ /* SQLITE_INTERNAL */ 0,
+ /* SQLITE_PERM */ "access permission denied",
+ /* SQLITE_ABORT */ "callback requested query abort",
+ /* SQLITE_BUSY */ "database is locked",
+ /* SQLITE_LOCKED */ "database table is locked",
+ /* SQLITE_NOMEM */ "out of memory",
+ /* SQLITE_READONLY */ "attempt to write a readonly database",
+ /* SQLITE_INTERRUPT */ "interrupted",
+ /* SQLITE_IOERR */ "disk I/O error",
+ /* SQLITE_CORRUPT */ "database disk image is malformed",
+ /* SQLITE_NOTFOUND */ 0,
+ /* SQLITE_FULL */ "database or disk is full",
+ /* SQLITE_CANTOPEN */ "unable to open database file",
+ /* SQLITE_PROTOCOL */ 0,
+ /* SQLITE_EMPTY */ "table contains no data",
+ /* SQLITE_SCHEMA */ "database schema has changed",
+ /* SQLITE_TOOBIG */ "string or blob too big",
+ /* SQLITE_CONSTRAINT */ "constraint failed",
+ /* SQLITE_MISMATCH */ "datatype mismatch",
+ /* SQLITE_MISUSE */ "library routine called out of sequence",
+ /* SQLITE_NOLFS */ "large file support is disabled",
+ /* SQLITE_AUTH */ "authorization denied",
+ /* SQLITE_FORMAT */ "auxiliary database format error",
+ /* SQLITE_RANGE */ "bind or column index out of range",
+ /* SQLITE_NOTADB */ "file is encrypted or is not a database",
+ };
+ rc &= 0xff;
+ if( ALWAYS(rc>=0) && rc<(int)(sizeof(aMsg)/sizeof(aMsg[0])) && aMsg[rc]!=0 ){
+ return aMsg[rc];
+ }else{
+ return "unknown error";
}
- return z;
}
/*
@@ -77411,7 +95303,7 @@ static int sqliteDefaultBusyCallback(
void *ptr, /* Database connection */
int count /* Number of times table has been busy */
){
-#if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
+#if SQLITE_OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
static const u8 delays[] =
{ 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
static const u8 totals[] =
@@ -77455,7 +95347,7 @@ static int sqliteDefaultBusyCallback(
*/
SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){
int rc;
- if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0;
+ if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0;
rc = p->xFunc(p->pArg, p->nBusy);
if( rc==0 ){
p->nBusy = -1;
@@ -77494,19 +95386,17 @@ SQLITE_API void sqlite3_progress_handler(
int (*xProgress)(void*),
void *pArg
){
- if( sqlite3SafetyCheckOk(db) ){
- sqlite3_mutex_enter(db->mutex);
- if( nOps>0 ){
- db->xProgress = xProgress;
- db->nProgressOps = nOps;
- db->pProgressArg = pArg;
- }else{
- db->xProgress = 0;
- db->nProgressOps = 0;
- db->pProgressArg = 0;
- }
- sqlite3_mutex_leave(db->mutex);
+ sqlite3_mutex_enter(db->mutex);
+ if( nOps>0 ){
+ db->xProgress = xProgress;
+ db->nProgressOps = nOps;
+ db->pProgressArg = pArg;
+ }else{
+ db->xProgress = 0;
+ db->nProgressOps = 0;
+ db->pProgressArg = 0;
}
+ sqlite3_mutex_leave(db->mutex);
}
#endif
@@ -77529,9 +95419,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){
** Cause any pending operation to stop at its earliest opportunity.
*/
SQLITE_API void sqlite3_interrupt(sqlite3 *db){
- if( sqlite3SafetyCheckOk(db) ){
- db->u1.isInterrupted = 1;
- }
+ db->u1.isInterrupted = 1;
}
@@ -77559,10 +95447,9 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
(xFunc && (xFinal || xStep)) ||
(!xFunc && (xFinal && !xStep)) ||
(!xFunc && (!xFinal && xStep)) ||
- (nArg<-1 || nArg>127) ||
- (255<(nName = strlen(zFunctionName))) ){
- sqlite3Error(db, SQLITE_ERROR, "bad parameters");
- return SQLITE_ERROR;
+ (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
+ (255<(nName = sqlite3Strlen30( zFunctionName))) ){
+ return SQLITE_MISUSE;
}
#ifndef SQLITE_OMIT_UTF16
@@ -77597,11 +95484,11 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
** is being overridden/deleted but there are no active VMs, allow the
** operation to continue but invalidate all precompiled statements.
*/
- p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0);
+ p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 0);
if( p && p->iPrefEnc==enc && p->nArg==nArg ){
if( db->activeVdbeCnt ){
sqlite3Error(db, SQLITE_BUSY,
- "Unable to delete/modify user-function due to active statements");
+ "unable to delete/modify user-function due to active statements");
assert( !db->mallocFailed );
return SQLITE_BUSY;
}else{
@@ -77609,7 +95496,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
}
}
- p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1);
+ p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 1);
assert(p || db->mallocFailed);
if( !p ){
return SQLITE_NOMEM;
@@ -77619,7 +95506,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
p->xStep = xStep;
p->xFinalize = xFinal;
p->pUserData = pUserData;
- p->nArg = nArg;
+ p->nArg = (u16)nArg;
return SQLITE_OK;
}
@@ -77661,7 +95548,7 @@ SQLITE_API int sqlite3_create_function16(
assert( !db->mallocFailed );
zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1);
rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal);
- sqlite3_free(zFunc8);
+ sqlite3DbFree(db, zFunc8);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -77686,7 +95573,7 @@ SQLITE_API int sqlite3_overload_function(
const char *zName,
int nArg
){
- int nName = strlen(zName);
+ int nName = sqlite3Strlen30(zName);
int rc;
sqlite3_mutex_enter(db->mutex);
if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
@@ -77796,6 +95683,40 @@ SQLITE_API void *sqlite3_rollback_hook(
}
/*
+** This function returns true if main-memory should be used instead of
+** a temporary file for transient pager files and statement journals.
+** The value returned depends on the value of db->temp_store (runtime
+** parameter) and the compile time value of SQLITE_TEMP_STORE. The
+** following table describes the relationship between these two values
+** and this functions return value.
+**
+** SQLITE_TEMP_STORE db->temp_store Location of temporary database
+** ----------------- -------------- ------------------------------
+** 0 any file (return 0)
+** 1 1 file (return 0)
+** 1 2 memory (return 1)
+** 1 0 file (return 0)
+** 2 1 file (return 0)
+** 2 2 memory (return 1)
+** 2 0 memory (return 1)
+** 3 any memory (return 1)
+*/
+SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){
+#if SQLITE_TEMP_STORE==1
+ return ( db->temp_store==2 );
+#endif
+#if SQLITE_TEMP_STORE==2
+ return ( db->temp_store!=1 );
+#endif
+#if SQLITE_TEMP_STORE==3
+ return 1;
+#endif
+#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3
+ return 0;
+#endif
+}
+
+/*
** This routine is called to create a connection to a database BTree
** driver. If zFilename is the name of a file, then that file is
** opened and used. If zFilename is the magic name ":memory:" then
@@ -77805,20 +95726,8 @@ SQLITE_API void *sqlite3_rollback_hook(
** soon as the connection is closed.
**
** A virtual database can be either a disk file (that is automatically
-** deleted when the file is closed) or it an be held entirely in memory,
-** depending on the values of the TEMP_STORE compile-time macro and the
-** db->temp_store variable, according to the following chart:
-**
-** TEMP_STORE db->temp_store Location of temporary database
-** ---------- -------------- ------------------------------
-** 0 any file
-** 1 1 file
-** 1 2 memory
-** 1 0 file
-** 2 1 file
-** 2 2 memory
-** 2 0 memory
-** 3 any memory
+** deleted when the file is closed) or it an be held entirely in memory.
+** The sqlite3TempInMemory() function is used to determine which.
*/
SQLITE_PRIVATE int sqlite3BtreeFactory(
const sqlite3 *db, /* Main database when opening aux otherwise 0 */
@@ -77839,28 +95748,23 @@ SQLITE_PRIVATE int sqlite3BtreeFactory(
if( db->flags & SQLITE_NoReadlock ){
btFlags |= BTREE_NO_READLOCK;
}
- if( zFilename==0 ){
-#if TEMP_STORE==0
- /* Do nothing */
-#endif
#ifndef SQLITE_OMIT_MEMORYDB
-#if TEMP_STORE==1
- if( db->temp_store==2 ) zFilename = ":memory:";
-#endif
-#if TEMP_STORE==2
- if( db->temp_store!=1 ) zFilename = ":memory:";
-#endif
-#if TEMP_STORE==3
+ if( zFilename==0 && sqlite3TempInMemory(db) ){
zFilename = ":memory:";
-#endif
-#endif /* SQLITE_OMIT_MEMORYDB */
}
+#endif
if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){
vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;
}
rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags);
- if( rc==SQLITE_OK ){
+
+ /* If the B-Tree was successfully opened, set the pager-cache size to the
+ ** default value. Except, if the call to BtreeOpen() returned a handle
+ ** open on an existing shared pager-cache, do not change the pager-cache
+ ** size.
+ */
+ if( rc==SQLITE_OK && 0==sqlite3BtreeSchema(*ppBtree, 0, 0) ){
sqlite3BtreeSetCacheSize(*ppBtree, nCache);
}
return rc;
@@ -77875,14 +95779,18 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){
if( !db ){
return sqlite3ErrStr(SQLITE_NOMEM);
}
- if( !sqlite3SafetyCheckSickOrOk(db) || db->errCode==SQLITE_MISUSE ){
+ if( !sqlite3SafetyCheckSickOrOk(db) ){
return sqlite3ErrStr(SQLITE_MISUSE);
}
sqlite3_mutex_enter(db->mutex);
- assert( !db->mallocFailed );
- z = (char*)sqlite3_value_text(db->pErr);
- if( z==0 ){
- z = sqlite3ErrStr(db->errCode);
+ if( db->mallocFailed ){
+ z = sqlite3ErrStr(SQLITE_NOMEM);
+ }else{
+ z = (char*)sqlite3_value_text(db->pErr);
+ assert( !db->mallocFailed );
+ if( z==0 ){
+ z = sqlite3ErrStr(db->errCode);
+ }
}
sqlite3_mutex_leave(db->mutex);
return z;
@@ -77894,41 +95802,42 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){
** error.
*/
SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){
- /* Because all the characters in the string are in the unicode
- ** range 0x00-0xFF, if we pad the big-endian string with a
- ** zero byte, we can obtain the little-endian string with
- ** &big_endian[1].
- */
- static const char outOfMemBe[] = {
- 0, 'o', 0, 'u', 0, 't', 0, ' ',
- 0, 'o', 0, 'f', 0, ' ',
- 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0
+ static const u16 outOfMem[] = {
+ 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0
};
- static const char misuseBe [] = {
- 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ',
- 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ',
- 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ',
- 0, 'o', 0, 'u', 0, 't', 0, ' ',
- 0, 'o', 0, 'f', 0, ' ',
- 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0
+ static const u16 misuse[] = {
+ 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ',
+ 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ',
+ 'c', 'a', 'l', 'l', 'e', 'd', ' ',
+ 'o', 'u', 't', ' ',
+ 'o', 'f', ' ',
+ 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0
};
const void *z;
if( !db ){
- return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
+ return (void *)outOfMem;
}
- if( !sqlite3SafetyCheckSickOrOk(db) || db->errCode==SQLITE_MISUSE ){
- return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
+ if( !sqlite3SafetyCheckSickOrOk(db) ){
+ return (void *)misuse;
}
sqlite3_mutex_enter(db->mutex);
- assert( !db->mallocFailed );
- z = sqlite3_value_text16(db->pErr);
- if( z==0 ){
- sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
- SQLITE_UTF8, SQLITE_STATIC);
+ if( db->mallocFailed ){
+ z = (void *)outOfMem;
+ }else{
z = sqlite3_value_text16(db->pErr);
+ if( z==0 ){
+ sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
+ SQLITE_UTF8, SQLITE_STATIC);
+ z = sqlite3_value_text16(db->pErr);
+ }
+ /* A malloc() may have failed within the call to sqlite3_value_text16()
+ ** above. If this is the case, then the db->mallocFailed flag needs to
+ ** be cleared before returning. Do this directly, instead of via
+ ** sqlite3ApiExit(), to avoid setting the database handle error message.
+ */
+ db->mallocFailed = 0;
}
- sqlite3ApiExit(0, 0);
sqlite3_mutex_leave(db->mutex);
return z;
}
@@ -77947,21 +95856,32 @@ SQLITE_API int sqlite3_errcode(sqlite3 *db){
}
return db->errCode & db->errMask;
}
+SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){
+ if( db && !sqlite3SafetyCheckSickOrOk(db) ){
+ return SQLITE_MISUSE;
+ }
+ if( !db || db->mallocFailed ){
+ return SQLITE_NOMEM;
+ }
+ return db->errCode;
+}
/*
** Create a new collating function for database "db". The name is zName
** and the encoding is enc.
*/
static int createCollation(
- sqlite3* db,
+ sqlite3* db,
const char *zName,
- int enc,
+ u8 enc,
+ u8 collType,
void* pCtx,
int(*xCompare)(void*,int,const void*,int,const void*),
void(*xDel)(void*)
){
CollSeq *pColl;
int enc2;
+ int nName = sqlite3Strlen30(zName);
assert( sqlite3_mutex_held(db->mutex) );
@@ -77969,25 +95889,25 @@ static int createCollation(
** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
*/
- enc2 = enc & ~SQLITE_UTF16_ALIGNED;
- if( enc2==SQLITE_UTF16 ){
+ enc2 = enc;
+ testcase( enc2==SQLITE_UTF16 );
+ testcase( enc2==SQLITE_UTF16_ALIGNED );
+ if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){
enc2 = SQLITE_UTF16NATIVE;
}
-
- if( (enc2&~3)!=0 ){
- sqlite3Error(db, SQLITE_ERROR, "unknown encoding");
- return SQLITE_ERROR;
+ if( enc2<SQLITE_UTF8 || enc2>SQLITE_UTF16BE ){
+ return SQLITE_MISUSE;
}
/* Check if this call is removing or replacing an existing collation
** sequence. If so, and there are active VMs, return busy. If there
** are no active VMs, invalidate any pre-compiled statements.
*/
- pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0);
+ pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0);
if( pColl && pColl->xCmp ){
if( db->activeVdbeCnt ){
sqlite3Error(db, SQLITE_BUSY,
- "Unable to delete/modify collation sequence due to active statements");
+ "unable to delete/modify collation sequence due to active statements");
return SQLITE_BUSY;
}
sqlite3ExpirePreparedStatements(db);
@@ -77999,7 +95919,7 @@ static int createCollation(
** to be called.
*/
if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){
- CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName));
+ CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, nName);
int j;
for(j=0; j<3; j++){
CollSeq *p = &aColl[j];
@@ -78013,12 +95933,13 @@ static int createCollation(
}
}
- pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1);
+ pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1);
if( pColl ){
pColl->xCmp = xCompare;
pColl->pUser = pCtx;
pColl->xDel = xDel;
- pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED);
+ pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED));
+ pColl->type = collType;
}
sqlite3Error(db, SQLITE_OK, 0);
return SQLITE_OK;
@@ -78041,6 +95962,7 @@ static const int aHardLimit[] = {
SQLITE_MAX_ATTACHED,
SQLITE_MAX_LIKE_PATTERN_LENGTH,
SQLITE_MAX_VARIABLE_NUMBER,
+ SQLITE_MAX_TRIGGER_DEPTH,
};
/*
@@ -78061,11 +95983,11 @@ static const int aHardLimit[] = {
#if SQLITE_MAX_VDBE_OP<40
# error SQLITE_MAX_VDBE_OP must be at least 40
#endif
-#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>255
-# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 255
+#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000
+# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000
#endif
-#if SQLITE_MAX_ATTACH<0 || SQLITE_MAX_ATTACH>30
-# error SQLITE_MAX_ATTACH must be between 0 and 30
+#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>30
+# error SQLITE_MAX_ATTACHED must be between 0 and 30
#endif
#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1
@@ -78073,6 +95995,12 @@ static const int aHardLimit[] = {
#if SQLITE_MAX_VARIABLE_NUMBER<1
# error SQLITE_MAX_VARIABLE_NUMBER must be at least 1
#endif
+#if SQLITE_MAX_COLUMN>32767
+# error SQLITE_MAX_COLUMN must not exceed 32767
+#endif
+#if SQLITE_MAX_TRIGGER_DEPTH<1
+# error SQLITE_MAX_TRIGGER_DEPTH must be at least 1
+#endif
/*
@@ -78113,34 +96041,67 @@ static int openDatabase(
){
sqlite3 *db;
int rc;
- CollSeq *pColl;
+ int isThreadsafe;
+
+ *ppDb = 0;
+#ifndef SQLITE_OMIT_AUTOINIT
+ rc = sqlite3_initialize();
+ if( rc ) return rc;
+#endif
+
+ if( sqlite3GlobalConfig.bCoreMutex==0 ){
+ isThreadsafe = 0;
+ }else if( flags & SQLITE_OPEN_NOMUTEX ){
+ isThreadsafe = 0;
+ }else if( flags & SQLITE_OPEN_FULLMUTEX ){
+ isThreadsafe = 1;
+ }else{
+ isThreadsafe = sqlite3GlobalConfig.bFullMutex;
+ }
+ if( flags & SQLITE_OPEN_PRIVATECACHE ){
+ flags &= ~SQLITE_OPEN_SHAREDCACHE;
+ }else if( sqlite3GlobalConfig.sharedCacheEnabled ){
+ flags |= SQLITE_OPEN_SHAREDCACHE;
+ }
- /* Remove harmful bits from the flags parameter */
+ /* Remove harmful bits from the flags parameter
+ **
+ ** The SQLITE_OPEN_NOMUTEX and SQLITE_OPEN_FULLMUTEX flags were
+ ** dealt with in the previous code block. Besides these, the only
+ ** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY,
+ ** SQLITE_OPEN_READWRITE, and SQLITE_OPEN_CREATE. Silently mask
+ ** off all other flags.
+ */
flags &= ~( SQLITE_OPEN_DELETEONCLOSE |
+ SQLITE_OPEN_EXCLUSIVE |
SQLITE_OPEN_MAIN_DB |
SQLITE_OPEN_TEMP_DB |
SQLITE_OPEN_TRANSIENT_DB |
SQLITE_OPEN_MAIN_JOURNAL |
SQLITE_OPEN_TEMP_JOURNAL |
SQLITE_OPEN_SUBJOURNAL |
- SQLITE_OPEN_MASTER_JOURNAL
+ SQLITE_OPEN_MASTER_JOURNAL |
+ SQLITE_OPEN_NOMUTEX |
+ SQLITE_OPEN_FULLMUTEX
);
/* Allocate the sqlite data structure */
db = sqlite3MallocZero( sizeof(sqlite3) );
if( db==0 ) goto opendb_out;
- db->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE);
- if( db->mutex==0 ){
- sqlite3_free(db);
- db = 0;
- goto opendb_out;
+ if( isThreadsafe ){
+ db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
+ if( db->mutex==0 ){
+ sqlite3_free(db);
+ db = 0;
+ goto opendb_out;
+ }
}
sqlite3_mutex_enter(db->mutex);
db->errMask = 0xff;
- db->priorNewRowid = 0;
db->nDb = 2;
db->magic = SQLITE_MAGIC_BUSY;
db->aDb = db->aDbStatic;
+
assert( sizeof(db->aLimit)==sizeof(aHardLimit) );
memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
db->autoCommit = 1;
@@ -78153,17 +96114,18 @@ static int openDatabase(
#ifdef SQLITE_ENABLE_LOAD_EXTENSION
| SQLITE_LoadExtension
#endif
+#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS
+ | SQLITE_RecTriggers
+#endif
;
- sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&db->aCollSeq);
#ifndef SQLITE_OMIT_VIRTUALTABLE
- sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&db->aModule);
#endif
db->pVfs = sqlite3_vfs_find(zVfs);
if( !db->pVfs ){
rc = SQLITE_ERROR;
- db->magic = SQLITE_MAGIC_SICK;
sqlite3Error(db, rc, "no such vfs: %s", zVfs);
goto opendb_out;
}
@@ -78172,26 +96134,23 @@ static int openDatabase(
** and UTF-16, so add a version for each to avoid any unnecessary
** conversions. The only error that can occur here is a malloc() failure.
*/
- createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0);
- createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0);
- createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0);
- createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0);
+ createCollation(db, "BINARY", SQLITE_UTF8, SQLITE_COLL_BINARY, 0,
+ binCollFunc, 0);
+ createCollation(db, "BINARY", SQLITE_UTF16BE, SQLITE_COLL_BINARY, 0,
+ binCollFunc, 0);
+ createCollation(db, "BINARY", SQLITE_UTF16LE, SQLITE_COLL_BINARY, 0,
+ binCollFunc, 0);
+ createCollation(db, "RTRIM", SQLITE_UTF8, SQLITE_COLL_USER, (void*)1,
+ binCollFunc, 0);
if( db->mallocFailed ){
- db->magic = SQLITE_MAGIC_SICK;
goto opendb_out;
}
- db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0);
+ db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0);
assert( db->pDfltColl!=0 );
/* Also add a UTF-8 case-insensitive collation sequence. */
- createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0);
-
- /* Set flags on the built-in collating sequences */
- db->pDfltColl->type = SQLITE_COLL_BINARY;
- pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0);
- if( pColl ){
- pColl->type = SQLITE_COLL_NOCASE;
- }
+ createCollation(db, "NOCASE", SQLITE_UTF8, SQLITE_COLL_NOCASE, 0,
+ nocaseCollatingFunc, 0);
/* Open the backend database driver */
db->openFlags = flags;
@@ -78199,8 +96158,10 @@ static int openDatabase(
flags | SQLITE_OPEN_MAIN_DB,
&db->aDb[0].pBt);
if( rc!=SQLITE_OK ){
+ if( rc==SQLITE_IOERR_NOMEM ){
+ rc = SQLITE_NOMEM;
+ }
sqlite3Error(db, rc, 0);
- db->magic = SQLITE_MAGIC_SICK;
goto opendb_out;
}
db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
@@ -78212,10 +96173,8 @@ static int openDatabase(
*/
db->aDb[0].zName = "main";
db->aDb[0].safety_level = 3;
-#ifndef SQLITE_OMIT_TEMPDB
db->aDb[1].zName = "temp";
db->aDb[1].safety_level = 1;
-#endif
db->magic = SQLITE_MAGIC_OPEN;
if( db->mallocFailed ){
@@ -78232,8 +96191,9 @@ static int openDatabase(
/* Load automatic extensions - extensions that have been registered
** using the sqlite3_automatic_extension() API.
*/
- (void)sqlite3AutoLoadExtensions(db);
- if( sqlite3_errcode(db)!=SQLITE_OK ){
+ sqlite3AutoLoadExtensions(db);
+ rc = sqlite3_errcode(db);
+ if( rc!=SQLITE_OK ){
goto opendb_out;
}
@@ -78259,10 +96219,16 @@ static int openDatabase(
#ifdef SQLITE_ENABLE_ICU
if( !db->mallocFailed && rc==SQLITE_OK ){
- extern int sqlite3IcuInit(sqlite3*);
rc = sqlite3IcuInit(db);
}
#endif
+
+#ifdef SQLITE_ENABLE_RTREE
+ if( !db->mallocFailed && rc==SQLITE_OK){
+ rc = sqlite3RtreeInit(db);
+ }
+#endif
+
sqlite3Error(db, rc, 0);
/* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking
@@ -78275,14 +96241,21 @@ static int openDatabase(
SQLITE_DEFAULT_LOCKING_MODE);
#endif
+ /* Enable the lookaside-malloc subsystem */
+ setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
+ sqlite3GlobalConfig.nLookaside);
+
opendb_out:
if( db ){
- assert( db->mutex!=0 );
+ assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
sqlite3_mutex_leave(db->mutex);
}
- if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){
+ rc = sqlite3_errcode(db);
+ if( rc==SQLITE_NOMEM ){
sqlite3_close(db);
db = 0;
+ }else if( rc!=SQLITE_OK ){
+ db->magic = SQLITE_MAGIC_SICK;
}
*ppDb = db;
return sqlite3ApiExit(0, rc);
@@ -78317,11 +96290,15 @@ SQLITE_API int sqlite3_open16(
){
char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */
sqlite3_value *pVal;
- int rc = SQLITE_NOMEM;
+ int rc;
assert( zFilename );
assert( ppDb );
*ppDb = 0;
+#ifndef SQLITE_OMIT_AUTOINIT
+ rc = sqlite3_initialize();
+ if( rc ) return rc;
+#endif
pVal = sqlite3ValueNew(0);
sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
@@ -78332,6 +96309,8 @@ SQLITE_API int sqlite3_open16(
if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
ENC(*ppDb) = SQLITE_UTF16NATIVE;
}
+ }else{
+ rc = SQLITE_NOMEM;
}
sqlite3ValueFree(pVal);
@@ -78352,7 +96331,7 @@ SQLITE_API int sqlite3_create_collation(
int rc;
sqlite3_mutex_enter(db->mutex);
assert( !db->mallocFailed );
- rc = createCollation(db, zName, enc, pCtx, xCompare, 0);
+ rc = createCollation(db, zName, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, 0);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -78372,7 +96351,7 @@ SQLITE_API int sqlite3_create_collation_v2(
int rc;
sqlite3_mutex_enter(db->mutex);
assert( !db->mallocFailed );
- rc = createCollation(db, zName, enc, pCtx, xCompare, xDel);
+ rc = createCollation(db, zName, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, xDel);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -78384,7 +96363,7 @@ SQLITE_API int sqlite3_create_collation_v2(
*/
SQLITE_API int sqlite3_create_collation16(
sqlite3* db,
- const char *zName,
+ const void *zName,
int enc,
void* pCtx,
int(*xCompare)(void*,int,const void*,int,const void*)
@@ -78395,8 +96374,8 @@ SQLITE_API int sqlite3_create_collation16(
assert( !db->mallocFailed );
zName8 = sqlite3Utf16to8(db, zName, -1);
if( zName8 ){
- rc = createCollation(db, zName8, enc, pCtx, xCompare, 0);
- sqlite3_free(zName8);
+ rc = createCollation(db, zName8, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, 0);
+ sqlite3DbFree(db, zName8);
}
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
@@ -78441,6 +96420,7 @@ SQLITE_API int sqlite3_collation_needed16(
#endif /* SQLITE_OMIT_UTF16 */
#ifndef SQLITE_OMIT_GLOBALRECOVER
+#ifndef SQLITE_OMIT_DEPRECATED
/*
** This function is now an anachronism. It used to be used to recover from a
** malloc() failure, but SQLite now does this automatically.
@@ -78449,6 +96429,7 @@ SQLITE_API int sqlite3_global_recover(void){
return SQLITE_OK;
}
#endif
+#endif
/*
** Test to see whether or not the database connection is in autocommit
@@ -78473,6 +96454,7 @@ SQLITE_PRIVATE int sqlite3Corrupt(void){
}
#endif
+#ifndef SQLITE_OMIT_DEPRECATED
/*
** This is a convenience routine that makes sure that all thread-specific
** data for this thread has been deallocated.
@@ -78482,6 +96464,7 @@ SQLITE_PRIVATE int sqlite3Corrupt(void){
*/
SQLITE_API void sqlite3_thread_cleanup(void){
}
+#endif
/*
** Return meta information about a specific column of a database table.
@@ -78497,7 +96480,7 @@ SQLITE_API int sqlite3_table_column_metadata(
char const **pzCollSeq, /* OUTPUT: Collation sequence name */
int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
int *pPrimaryKey, /* OUTPUT: True if column part of PK */
- int *pAutoinc /* OUTPUT: True if colums is auto-increment */
+ int *pAutoinc /* OUTPUT: True if column is auto-increment */
){
int rc;
char *zErrMsg = 0;
@@ -78516,7 +96499,6 @@ SQLITE_API int sqlite3_table_column_metadata(
(void)sqlite3SafetyOn(db);
sqlite3BtreeEnterAll(db);
rc = sqlite3Init(db, &zErrMsg);
- sqlite3BtreeLeaveAll(db);
if( SQLITE_OK!=rc ){
goto error_out;
}
@@ -78560,9 +96542,9 @@ SQLITE_API int sqlite3_table_column_metadata(
if( pCol ){
zDataType = pCol->zType;
zCollSeq = pCol->zColl;
- notnull = (pCol->notNull?1:0);
- primarykey = (pCol->isPrimKey?1:0);
- autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0);
+ notnull = pCol->notNull!=0;
+ primarykey = pCol->isPrimKey!=0;
+ autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;
}else{
zDataType = "INTEGER";
primarykey = 1;
@@ -78572,6 +96554,7 @@ SQLITE_API int sqlite3_table_column_metadata(
}
error_out:
+ sqlite3BtreeLeaveAll(db);
(void)sqlite3SafetyOff(db);
/* Whether the function call succeeded or failed, set the output parameters
@@ -78585,12 +96568,13 @@ error_out:
if( pAutoinc ) *pAutoinc = autoinc;
if( SQLITE_OK==rc && !pTab ){
- sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".",
- zColumnName, 0);
+ sqlite3DbFree(db, zErrMsg);
+ zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName,
+ zColumnName);
rc = SQLITE_ERROR;
}
sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);
- sqlite3_free(zErrMsg);
+ sqlite3DbFree(db, zErrMsg);
rc = sqlite3ApiExit(db, rc);
sqlite3_mutex_leave(db->mutex);
return rc;
@@ -78604,6 +96588,7 @@ SQLITE_API int sqlite3_sleep(int ms){
sqlite3_vfs *pVfs;
int rc;
pVfs = sqlite3_vfs_find(0);
+ if( pVfs==0 ) return 0;
/* This function works in milliseconds, but the underlying OsSleep()
** API uses microseconds. Hence the 1000's.
@@ -78665,58 +96650,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){
va_list ap;
va_start(ap, op);
switch( op ){
- /*
- ** sqlite3_test_control(FAULT_CONFIG, fault_id, nDelay, nRepeat)
- **
- ** Configure a fault injector. The specific fault injector is
- ** identified by the fault_id argument. (ex: SQLITE_FAULTINJECTOR_MALLOC)
- ** The fault will occur after a delay of nDelay calls. The fault
- ** will repeat nRepeat times.
- */
- case SQLITE_TESTCTRL_FAULT_CONFIG: {
- int id = va_arg(ap, int);
- int nDelay = va_arg(ap, int);
- int nRepeat = va_arg(ap, int);
- sqlite3FaultConfig(id, nDelay, nRepeat);
- break;
- }
-
- /*
- ** sqlite3_test_control(FAULT_FAILURES, fault_id)
- **
- ** Return the number of faults (both hard and benign faults) that have
- ** occurred since the injector identified by fault_id) was last configured.
- */
- case SQLITE_TESTCTRL_FAULT_FAILURES: {
- int id = va_arg(ap, int);
- rc = sqlite3FaultFailures(id);
- break;
- }
-
- /*
- ** sqlite3_test_control(FAULT_BENIGN_FAILURES, fault_id)
- **
- ** Return the number of benign faults that have occurred since the
- ** injector identified by fault_id was last configured.
- */
- case SQLITE_TESTCTRL_FAULT_BENIGN_FAILURES: {
- int id = va_arg(ap, int);
- rc = sqlite3FaultBenignFailures(id);
- break;
- }
-
- /*
- ** sqlite3_test_control(FAULT_PENDING, fault_id)
- **
- ** Return the number of successes that will occur before the next
- ** scheduled failure on fault injector fault_id.
- ** If no failures are scheduled, return -1.
- */
- case SQLITE_TESTCTRL_FAULT_PENDING: {
- int id = va_arg(ap, int);
- rc = sqlite3FaultPending(id);
- break;
- }
/*
** Save the current state of the PRNG.
@@ -78760,6 +96693,108 @@ SQLITE_API int sqlite3_test_control(int op, ...){
rc = sqlite3BitvecBuiltinTest(sz, aProg);
break;
}
+
+ /*
+ ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd)
+ **
+ ** Register hooks to call to indicate which malloc() failures
+ ** are benign.
+ */
+ case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: {
+ typedef void (*void_function)(void);
+ void_function xBenignBegin;
+ void_function xBenignEnd;
+ xBenignBegin = va_arg(ap, void_function);
+ xBenignEnd = va_arg(ap, void_function);
+ sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd);
+ break;
+ }
+
+ /*
+ ** sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X)
+ **
+ ** Set the PENDING byte to the value in the argument, if X>0.
+ ** Make no changes if X==0. Return the value of the pending byte
+ ** as it existing before this routine was called.
+ **
+ ** IMPORTANT: Changing the PENDING byte from 0x40000000 results in
+ ** an incompatible database file format. Changing the PENDING byte
+ ** while any database connection is open results in undefined and
+ ** dileterious behavior.
+ */
+ case SQLITE_TESTCTRL_PENDING_BYTE: {
+ unsigned int newVal = va_arg(ap, unsigned int);
+ rc = sqlite3PendingByte;
+ if( newVal ) sqlite3PendingByte = newVal;
+ break;
+ }
+
+ /*
+ ** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X)
+ **
+ ** This action provides a run-time test to see whether or not
+ ** assert() was enabled at compile-time. If X is true and assert()
+ ** is enabled, then the return value is true. If X is true and
+ ** assert() is disabled, then the return value is zero. If X is
+ ** false and assert() is enabled, then the assertion fires and the
+ ** process aborts. If X is false and assert() is disabled, then the
+ ** return value is zero.
+ */
+ case SQLITE_TESTCTRL_ASSERT: {
+ volatile int x = 0;
+ assert( (x = va_arg(ap,int))!=0 );
+ rc = x;
+ break;
+ }
+
+
+ /*
+ ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X)
+ **
+ ** This action provides a run-time test to see how the ALWAYS and
+ ** NEVER macros were defined at compile-time.
+ **
+ ** The return value is ALWAYS(X).
+ **
+ ** The recommended test is X==2. If the return value is 2, that means
+ ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the
+ ** default setting. If the return value is 1, then ALWAYS() is either
+ ** hard-coded to true or else it asserts if its argument is false.
+ ** The first behavior (hard-coded to true) is the case if
+ ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second
+ ** behavior (assert if the argument to ALWAYS() is false) is the case if
+ ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled.
+ **
+ ** The run-time test procedure might look something like this:
+ **
+ ** if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){
+ ** // ALWAYS() and NEVER() are no-op pass-through macros
+ ** }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){
+ ** // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false.
+ ** }else{
+ ** // ALWAYS(x) is a constant 1. NEVER(x) is a constant 0.
+ ** }
+ */
+ case SQLITE_TESTCTRL_ALWAYS: {
+ int x = va_arg(ap,int);
+ rc = ALWAYS(x);
+ break;
+ }
+
+ /* sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N)
+ **
+ ** Set the nReserve size to N for the main database on the database
+ ** connection db.
+ */
+ case SQLITE_TESTCTRL_RESERVE: {
+ sqlite3 *db = va_arg(ap, sqlite3*);
+ int x = va_arg(ap,int);
+ sqlite3_mutex_enter(db->mutex);
+ sqlite3BtreeSetPageSize(db->aDb[0].pBt, 0, x, 0);
+ sqlite3_mutex_leave(db->mutex);
+ break;
+ }
+
}
va_end(ap);
#endif /* SQLITE_OMIT_BUILTIN_TEST */
@@ -78767,6 +96802,340 @@ SQLITE_API int sqlite3_test_control(int op, ...){
}
/************** End of main.c ************************************************/
+/************** Begin file notify.c ******************************************/
+/*
+** 2009 March 3
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+**
+** This file contains the implementation of the sqlite3_unlock_notify()
+** API method and its associated functionality.
+**
+** $Id: notify.c,v 1.4 2009/04/07 22:06:57 drh Exp $
+*/
+
+/* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */
+#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
+
+/*
+** Public interfaces:
+**
+** sqlite3ConnectionBlocked()
+** sqlite3ConnectionUnlocked()
+** sqlite3ConnectionClosed()
+** sqlite3_unlock_notify()
+*/
+
+#define assertMutexHeld() \
+ assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) )
+
+/*
+** Head of a linked list of all sqlite3 objects created by this process
+** for which either sqlite3.pBlockingConnection or sqlite3.pUnlockConnection
+** is not NULL. This variable may only accessed while the STATIC_MASTER
+** mutex is held.
+*/
+static sqlite3 *SQLITE_WSD sqlite3BlockedList = 0;
+
+#ifndef NDEBUG
+/*
+** This function is a complex assert() that verifies the following
+** properties of the blocked connections list:
+**
+** 1) Each entry in the list has a non-NULL value for either
+** pUnlockConnection or pBlockingConnection, or both.
+**
+** 2) All entries in the list that share a common value for
+** xUnlockNotify are grouped together.
+**
+** 3) If the argument db is not NULL, then none of the entries in the
+** blocked connections list have pUnlockConnection or pBlockingConnection
+** set to db. This is used when closing connection db.
+*/
+static void checkListProperties(sqlite3 *db){
+ sqlite3 *p;
+ for(p=sqlite3BlockedList; p; p=p->pNextBlocked){
+ int seen = 0;
+ sqlite3 *p2;
+
+ /* Verify property (1) */
+ assert( p->pUnlockConnection || p->pBlockingConnection );
+
+ /* Verify property (2) */
+ for(p2=sqlite3BlockedList; p2!=p; p2=p2->pNextBlocked){
+ if( p2->xUnlockNotify==p->xUnlockNotify ) seen = 1;
+ assert( p2->xUnlockNotify==p->xUnlockNotify || !seen );
+ assert( db==0 || p->pUnlockConnection!=db );
+ assert( db==0 || p->pBlockingConnection!=db );
+ }
+ }
+}
+#else
+# define checkListProperties(x)
+#endif
+
+/*
+** Remove connection db from the blocked connections list. If connection
+** db is not currently a part of the list, this function is a no-op.
+*/
+static void removeFromBlockedList(sqlite3 *db){
+ sqlite3 **pp;
+ assertMutexHeld();
+ for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){
+ if( *pp==db ){
+ *pp = (*pp)->pNextBlocked;
+ break;
+ }
+ }
+}
+
+/*
+** Add connection db to the blocked connections list. It is assumed
+** that it is not already a part of the list.
+*/
+static void addToBlockedList(sqlite3 *db){
+ sqlite3 **pp;
+ assertMutexHeld();
+ for(
+ pp=&sqlite3BlockedList;
+ *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify;
+ pp=&(*pp)->pNextBlocked
+ );
+ db->pNextBlocked = *pp;
+ *pp = db;
+}
+
+/*
+** Obtain the STATIC_MASTER mutex.
+*/
+static void enterMutex(void){
+ sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
+ checkListProperties(0);
+}
+
+/*
+** Release the STATIC_MASTER mutex.
+*/
+static void leaveMutex(void){
+ assertMutexHeld();
+ checkListProperties(0);
+ sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
+}
+
+/*
+** Register an unlock-notify callback.
+**
+** This is called after connection "db" has attempted some operation
+** but has received an SQLITE_LOCKED error because another connection
+** (call it pOther) in the same process was busy using the same shared
+** cache. pOther is found by looking at db->pBlockingConnection.
+**
+** If there is no blocking connection, the callback is invoked immediately,
+** before this routine returns.
+**
+** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate
+** a deadlock.
+**
+** Otherwise, make arrangements to invoke xNotify when pOther drops
+** its locks.
+**
+** Each call to this routine overrides any prior callbacks registered
+** on the same "db". If xNotify==0 then any prior callbacks are immediately
+** cancelled.
+*/
+SQLITE_API int sqlite3_unlock_notify(
+ sqlite3 *db,
+ void (*xNotify)(void **, int),
+ void *pArg
+){
+ int rc = SQLITE_OK;
+
+ sqlite3_mutex_enter(db->mutex);
+ enterMutex();
+
+ if( xNotify==0 ){
+ removeFromBlockedList(db);
+ db->pUnlockConnection = 0;
+ db->xUnlockNotify = 0;
+ db->pUnlockArg = 0;
+ }else if( 0==db->pBlockingConnection ){
+ /* The blocking transaction has been concluded. Or there never was a
+ ** blocking transaction. In either case, invoke the notify callback
+ ** immediately.
+ */
+ xNotify(&pArg, 1);
+ }else{
+ sqlite3 *p;
+
+ for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){}
+ if( p ){
+ rc = SQLITE_LOCKED; /* Deadlock detected. */
+ }else{
+ db->pUnlockConnection = db->pBlockingConnection;
+ db->xUnlockNotify = xNotify;
+ db->pUnlockArg = pArg;
+ removeFromBlockedList(db);
+ addToBlockedList(db);
+ }
+ }
+
+ leaveMutex();
+ assert( !db->mallocFailed );
+ sqlite3Error(db, rc, (rc?"database is deadlocked":0));
+ sqlite3_mutex_leave(db->mutex);
+ return rc;
+}
+
+/*
+** This function is called while stepping or preparing a statement
+** associated with connection db. The operation will return SQLITE_LOCKED
+** to the user because it requires a lock that will not be available
+** until connection pBlocker concludes its current transaction.
+*/
+SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){
+ enterMutex();
+ if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){
+ addToBlockedList(db);
+ }
+ db->pBlockingConnection = pBlocker;
+ leaveMutex();
+}
+
+/*
+** This function is called when
+** the transaction opened by database db has just finished. Locks held
+** by database connection db have been released.
+**
+** This function loops through each entry in the blocked connections
+** list and does the following:
+**
+** 1) If the sqlite3.pBlockingConnection member of a list entry is
+** set to db, then set pBlockingConnection=0.
+**
+** 2) If the sqlite3.pUnlockConnection member of a list entry is
+** set to db, then invoke the configured unlock-notify callback and
+** set pUnlockConnection=0.
+**
+** 3) If the two steps above mean that pBlockingConnection==0 and
+** pUnlockConnection==0, remove the entry from the blocked connections
+** list.
+*/
+SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){
+ void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */
+ int nArg = 0; /* Number of entries in aArg[] */
+ sqlite3 **pp; /* Iterator variable */
+ void **aArg; /* Arguments to the unlock callback */
+ void **aDyn = 0; /* Dynamically allocated space for aArg[] */
+ void *aStatic[16]; /* Starter space for aArg[]. No malloc required */
+
+ aArg = aStatic;
+ enterMutex(); /* Enter STATIC_MASTER mutex */
+
+ /* This loop runs once for each entry in the blocked-connections list. */
+ for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){
+ sqlite3 *p = *pp;
+
+ /* Step 1. */
+ if( p->pBlockingConnection==db ){
+ p->pBlockingConnection = 0;
+ }
+
+ /* Step 2. */
+ if( p->pUnlockConnection==db ){
+ assert( p->xUnlockNotify );
+ if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){
+ xUnlockNotify(aArg, nArg);
+ nArg = 0;
+ }
+
+ sqlite3BeginBenignMalloc();
+ assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) );
+ assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn );
+ if( (!aDyn && nArg==(int)ArraySize(aStatic))
+ || (aDyn && nArg==(int)(sqlite3DbMallocSize(db, aDyn)/sizeof(void*)))
+ ){
+ /* The aArg[] array needs to grow. */
+ void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2);
+ if( pNew ){
+ memcpy(pNew, aArg, nArg*sizeof(void *));
+ sqlite3_free(aDyn);
+ aDyn = aArg = pNew;
+ }else{
+ /* This occurs when the array of context pointers that need to
+ ** be passed to the unlock-notify callback is larger than the
+ ** aStatic[] array allocated on the stack and the attempt to
+ ** allocate a larger array from the heap has failed.
+ **
+ ** This is a difficult situation to handle. Returning an error
+ ** code to the caller is insufficient, as even if an error code
+ ** is returned the transaction on connection db will still be
+ ** closed and the unlock-notify callbacks on blocked connections
+ ** will go unissued. This might cause the application to wait
+ ** indefinitely for an unlock-notify callback that will never
+ ** arrive.
+ **
+ ** Instead, invoke the unlock-notify callback with the context
+ ** array already accumulated. We can then clear the array and
+ ** begin accumulating any further context pointers without
+ ** requiring any dynamic allocation. This is sub-optimal because
+ ** it means that instead of one callback with a large array of
+ ** context pointers the application will receive two or more
+ ** callbacks with smaller arrays of context pointers, which will
+ ** reduce the applications ability to prioritize multiple
+ ** connections. But it is the best that can be done under the
+ ** circumstances.
+ */
+ xUnlockNotify(aArg, nArg);
+ nArg = 0;
+ }
+ }
+ sqlite3EndBenignMalloc();
+
+ aArg[nArg++] = p->pUnlockArg;
+ xUnlockNotify = p->xUnlockNotify;
+ p->pUnlockConnection = 0;
+ p->xUnlockNotify = 0;
+ p->pUnlockArg = 0;
+ }
+
+ /* Step 3. */
+ if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){
+ /* Remove connection p from the blocked connections list. */
+ *pp = p->pNextBlocked;
+ p->pNextBlocked = 0;
+ }else{
+ pp = &p->pNextBlocked;
+ }
+ }
+
+ if( nArg!=0 ){
+ xUnlockNotify(aArg, nArg);
+ }
+ sqlite3_free(aDyn);
+ leaveMutex(); /* Leave STATIC_MASTER mutex */
+}
+
+/*
+** This is called when the database connection passed as an argument is
+** being closed. The connection is removed from the blocked list.
+*/
+SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){
+ sqlite3ConnectionUnlocked(db);
+ enterMutex();
+ removeFromBlockedList(db);
+ checkListProperties(db);
+ leaveMutex();
+}
+#endif
+
+/************** End of notify.c **********************************************/
/************** Begin file fts3.c ********************************************/
/*
** 2006 Oct 10
@@ -78978,8 +97347,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){
**
**
**** Segment merging ****
-** To amortize update costs, segments are groups into levels and
-** merged in matches. Each increase in level represents exponentially
+** To amortize update costs, segments are grouped into levels and
+** merged in batches. Each increase in level represents exponentially
** more documents.
**
** New documents (actually, document updates) are tokenized and
@@ -79049,10 +97418,10 @@ SQLITE_API int sqlite3_test_control(int op, ...){
#endif
-/************** Include fts3_hash.h in the middle of fts3.c ******************/
-/************** Begin file fts3_hash.h ***************************************/
+/************** Include fts3_expr.h in the middle of fts3.c ******************/
+/************** Begin file fts3_expr.h ***************************************/
/*
-** 2001 September 22
+** 2008 Nov 28
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
@@ -79061,110 +97430,11 @@ SQLITE_API int sqlite3_test_control(int op, ...){
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
**
-*************************************************************************
-** This is the header file for the generic hash-table implemenation
-** used in SQLite. We've modified it slightly to serve as a standalone
-** hash table implementation for the full-text indexing module.
-**
-*/
-#ifndef _FTS3_HASH_H_
-#define _FTS3_HASH_H_
-
-/* Forward declarations of structures. */
-typedef struct fts3Hash fts3Hash;
-typedef struct fts3HashElem fts3HashElem;
-
-/* A complete hash table is an instance of the following structure.
-** The internals of this structure are intended to be opaque -- client
-** code should not attempt to access or modify the fields of this structure
-** directly. Change this structure only by using the routines below.
-** However, many of the "procedures" and "functions" for modifying and
-** accessing this structure are really macros, so we can't really make
-** this structure opaque.
-*/
-struct fts3Hash {
- char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */
- char copyKey; /* True if copy of key made on insert */
- int count; /* Number of entries in this table */
- fts3HashElem *first; /* The first element of the array */
- int htsize; /* Number of buckets in the hash table */
- struct _fts3ht { /* the hash table */
- int count; /* Number of entries with this hash */
- fts3HashElem *chain; /* Pointer to first entry with this hash */
- } *ht;
-};
-
-/* Each element in the hash table is an instance of the following
-** structure. All elements are stored on a single doubly-linked list.
-**
-** Again, this structure is intended to be opaque, but it can't really
-** be opaque because it is used by macros.
-*/
-struct fts3HashElem {
- fts3HashElem *next, *prev; /* Next and previous elements in the table */
- void *data; /* Data associated with this element */
- void *pKey; int nKey; /* Key associated with this element */
-};
-
-/*
-** There are 2 different modes of operation for a hash table:
-**
-** FTS3_HASH_STRING pKey points to a string that is nKey bytes long
-** (including the null-terminator, if any). Case
-** is respected in comparisons.
-**
-** FTS3_HASH_BINARY pKey points to binary data nKey bytes long.
-** memcmp() is used to compare keys.
-**
-** A copy of the key is made if the copyKey parameter to fts3HashInit is 1.
-*/
-#define FTS3_HASH_STRING 1
-#define FTS3_HASH_BINARY 2
-
-/*
-** Access routines. To delete, insert a NULL pointer.
-*/
-SQLITE_PRIVATE void sqlite3Fts3HashInit(fts3Hash*, int keytype, int copyKey);
-SQLITE_PRIVATE void *sqlite3Fts3HashInsert(fts3Hash*, const void *pKey, int nKey, void *pData);
-SQLITE_PRIVATE void *sqlite3Fts3HashFind(const fts3Hash*, const void *pKey, int nKey);
-SQLITE_PRIVATE void sqlite3Fts3HashClear(fts3Hash*);
-
-/*
-** Shorthand for the functions above
-*/
-#define fts3HashInit sqlite3Fts3HashInit
-#define fts3HashInsert sqlite3Fts3HashInsert
-#define fts3HashFind sqlite3Fts3HashFind
-#define fts3HashClear sqlite3Fts3HashClear
-
-/*
-** Macros for looping over all elements of a hash table. The idiom is
-** like this:
+******************************************************************************
**
-** fts3Hash h;
-** fts3HashElem *p;
-** ...
-** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){
-** SomeStructure *pData = fts3HashData(p);
-** // do something with pData
-** }
-*/
-#define fts3HashFirst(H) ((H)->first)
-#define fts3HashNext(E) ((E)->next)
-#define fts3HashData(E) ((E)->data)
-#define fts3HashKey(E) ((E)->pKey)
-#define fts3HashKeysize(E) ((E)->nKey)
-
-/*
-** Number of entries in a hash table
*/
-#define fts3HashCount(H) ((H)->count)
-#endif /* _FTS3_HASH_H_ */
-
-/************** End of fts3_hash.h *******************************************/
-/************** Continuing where we left off in fts3.c ***********************/
-/************** Include fts3_tokenizer.h in the middle of fts3.c *************/
+/************** Include fts3_tokenizer.h in the middle of fts3_expr.h ********/
/************** Begin file fts3_tokenizer.h **********************************/
/*
** 2006 July 10
@@ -79280,7 +97550,10 @@ struct sqlite3_tokenizer_module {
** stemming has been performed). *pnBytes should be set to the length
** of this buffer in bytes. The input text that generated the token is
** identified by the byte offsets returned in *piStartOffset and
- ** *piEndOffset.
+ ** *piEndOffset. *piStartOffset should be set to the index of the first
+ ** byte of the token in the input buffer. *piEndOffset should be set
+ ** to the index of the first byte just past the end of the token in
+ ** the input buffer.
**
** The buffer *ppToken is set to point at is managed by the tokenizer
** implementation. It is only required to be valid until the next call
@@ -79312,6 +97585,204 @@ struct sqlite3_tokenizer_cursor {
#endif /* _FTS3_TOKENIZER_H_ */
/************** End of fts3_tokenizer.h **************************************/
+/************** Continuing where we left off in fts3_expr.h ******************/
+
+/*
+** The following describes the syntax supported by the fts3 MATCH
+** operator in a similar format to that used by the lemon parser
+** generator. This module does not use actually lemon, it uses a
+** custom parser.
+**
+** query ::= andexpr (OR andexpr)*.
+**
+** andexpr ::= notexpr (AND? notexpr)*.
+**
+** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*.
+** notexpr ::= LP query RP.
+**
+** nearexpr ::= phrase (NEAR distance_opt nearexpr)*.
+**
+** distance_opt ::= .
+** distance_opt ::= / INTEGER.
+**
+** phrase ::= TOKEN.
+** phrase ::= COLUMN:TOKEN.
+** phrase ::= "TOKEN TOKEN TOKEN...".
+*/
+
+typedef struct Fts3Expr Fts3Expr;
+typedef struct Fts3Phrase Fts3Phrase;
+
+/*
+** A "phrase" is a sequence of one or more tokens that must match in
+** sequence. A single token is the base case and the most common case.
+** For a sequence of tokens contained in "...", nToken will be the number
+** of tokens in the string.
+*/
+struct Fts3Phrase {
+ int nToken; /* Number of tokens in the phrase */
+ int iColumn; /* Index of column this phrase must match */
+ int isNot; /* Phrase prefixed by unary not (-) operator */
+ struct PhraseToken {
+ char *z; /* Text of the token */
+ int n; /* Number of bytes in buffer pointed to by z */
+ int isPrefix; /* True if token ends in with a "*" character */
+ } aToken[1]; /* One entry for each token in the phrase */
+};
+
+/*
+** A tree of these objects forms the RHS of a MATCH operator.
+*/
+struct Fts3Expr {
+ int eType; /* One of the FTSQUERY_XXX values defined below */
+ int nNear; /* Valid if eType==FTSQUERY_NEAR */
+ Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */
+ Fts3Expr *pLeft; /* Left operand */
+ Fts3Expr *pRight; /* Right operand */
+ Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */
+};
+
+SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, char **, int, int,
+ const char *, int, Fts3Expr **);
+SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
+
+/*
+** Candidate values for Fts3Query.eType. Note that the order of the first
+** four values is in order of precedence when parsing expressions. For
+** example, the following:
+**
+** "a OR b AND c NOT d NEAR e"
+**
+** is equivalent to:
+**
+** "a OR (b AND (c NOT (d NEAR e)))"
+*/
+#define FTSQUERY_NEAR 1
+#define FTSQUERY_NOT 2
+#define FTSQUERY_AND 3
+#define FTSQUERY_OR 4
+#define FTSQUERY_PHRASE 5
+
+#ifdef SQLITE_TEST
+SQLITE_PRIVATE void sqlite3Fts3ExprInitTestInterface(sqlite3 *db);
+#endif
+
+/************** End of fts3_expr.h *******************************************/
+/************** Continuing where we left off in fts3.c ***********************/
+/************** Include fts3_hash.h in the middle of fts3.c ******************/
+/************** Begin file fts3_hash.h ***************************************/
+/*
+** 2001 September 22
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This is the header file for the generic hash-table implemenation
+** used in SQLite. We've modified it slightly to serve as a standalone
+** hash table implementation for the full-text indexing module.
+**
+*/
+#ifndef _FTS3_HASH_H_
+#define _FTS3_HASH_H_
+
+/* Forward declarations of structures. */
+typedef struct fts3Hash fts3Hash;
+typedef struct fts3HashElem fts3HashElem;
+
+/* A complete hash table is an instance of the following structure.
+** The internals of this structure are intended to be opaque -- client
+** code should not attempt to access or modify the fields of this structure
+** directly. Change this structure only by using the routines below.
+** However, many of the "procedures" and "functions" for modifying and
+** accessing this structure are really macros, so we can't really make
+** this structure opaque.
+*/
+struct fts3Hash {
+ char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */
+ char copyKey; /* True if copy of key made on insert */
+ int count; /* Number of entries in this table */
+ fts3HashElem *first; /* The first element of the array */
+ int htsize; /* Number of buckets in the hash table */
+ struct _fts3ht { /* the hash table */
+ int count; /* Number of entries with this hash */
+ fts3HashElem *chain; /* Pointer to first entry with this hash */
+ } *ht;
+};
+
+/* Each element in the hash table is an instance of the following
+** structure. All elements are stored on a single doubly-linked list.
+**
+** Again, this structure is intended to be opaque, but it can't really
+** be opaque because it is used by macros.
+*/
+struct fts3HashElem {
+ fts3HashElem *next, *prev; /* Next and previous elements in the table */
+ void *data; /* Data associated with this element */
+ void *pKey; int nKey; /* Key associated with this element */
+};
+
+/*
+** There are 2 different modes of operation for a hash table:
+**
+** FTS3_HASH_STRING pKey points to a string that is nKey bytes long
+** (including the null-terminator, if any). Case
+** is respected in comparisons.
+**
+** FTS3_HASH_BINARY pKey points to binary data nKey bytes long.
+** memcmp() is used to compare keys.
+**
+** A copy of the key is made if the copyKey parameter to fts3HashInit is 1.
+*/
+#define FTS3_HASH_STRING 1
+#define FTS3_HASH_BINARY 2
+
+/*
+** Access routines. To delete, insert a NULL pointer.
+*/
+SQLITE_PRIVATE void sqlite3Fts3HashInit(fts3Hash*, int keytype, int copyKey);
+SQLITE_PRIVATE void *sqlite3Fts3HashInsert(fts3Hash*, const void *pKey, int nKey, void *pData);
+SQLITE_PRIVATE void *sqlite3Fts3HashFind(const fts3Hash*, const void *pKey, int nKey);
+SQLITE_PRIVATE void sqlite3Fts3HashClear(fts3Hash*);
+
+/*
+** Shorthand for the functions above
+*/
+#define fts3HashInit sqlite3Fts3HashInit
+#define fts3HashInsert sqlite3Fts3HashInsert
+#define fts3HashFind sqlite3Fts3HashFind
+#define fts3HashClear sqlite3Fts3HashClear
+
+/*
+** Macros for looping over all elements of a hash table. The idiom is
+** like this:
+**
+** fts3Hash h;
+** fts3HashElem *p;
+** ...
+** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){
+** SomeStructure *pData = fts3HashData(p);
+** // do something with pData
+** }
+*/
+#define fts3HashFirst(H) ((H)->first)
+#define fts3HashNext(E) ((E)->next)
+#define fts3HashData(E) ((E)->data)
+#define fts3HashKey(E) ((E)->pKey)
+#define fts3HashKeysize(E) ((E)->nKey)
+
+/*
+** Number of entries in a hash table
+*/
+#define fts3HashCount(H) ((H)->count)
+
+#endif /* _FTS3_HASH_H_ */
+
+/************** End of fts3_hash.h *******************************************/
/************** Continuing where we left off in fts3.c ***********************/
#ifndef SQLITE_CORE
SQLITE_EXTENSION_INIT1
@@ -79337,11 +97808,6 @@ struct sqlite3_tokenizer_cursor {
# define FTSTRACE(A)
#endif
-/*
-** Default span for NEAR operators.
-*/
-#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10
-
/* It is not safe to call isspace(), tolower(), or isalnum() on
** hi-bit-set characters. This is the same solution used in the
** tokenizer.
@@ -80813,90 +99279,6 @@ static int sql_prepare(sqlite3 *db, const char *zDb, const char *zName,
/* Forward reference */
typedef struct fulltext_vtab fulltext_vtab;
-/* A single term in a query is represented by an instances of
-** the following structure. Each word which may match against
-** document content is a term. Operators, like NEAR or OR, are
-** not terms. Query terms are organized as a flat list stored
-** in the Query.pTerms array.
-**
-** If the QueryTerm.nPhrase variable is non-zero, then the QueryTerm
-** is the first in a contiguous string of terms that are either part
-** of the same phrase, or connected by the NEAR operator.
-**
-** If the QueryTerm.nNear variable is non-zero, then the token is followed
-** by a NEAR operator with span set to (nNear-1). For example, the
-** following query:
-**
-** The QueryTerm.iPhrase variable stores the index of the token within
-** its phrase, indexed starting at 1, or 1 if the token is not part
-** of any phrase.
-**
-** For example, the data structure used to represent the following query:
-**
-** ... MATCH 'sqlite NEAR/5 google NEAR/2 "search engine"'
-**
-** is:
-**
-** {nPhrase=4, iPhrase=1, nNear=6, pTerm="sqlite"},
-** {nPhrase=0, iPhrase=1, nNear=3, pTerm="google"},
-** {nPhrase=0, iPhrase=1, nNear=0, pTerm="search"},
-** {nPhrase=0, iPhrase=2, nNear=0, pTerm="engine"},
-**
-** compiling the FTS3 syntax to Query structures is done by the parseQuery()
-** function.
-*/
-typedef struct QueryTerm {
- short int nPhrase; /* How many following terms are part of the same phrase */
- short int iPhrase; /* This is the i-th term of a phrase. */
- short int iColumn; /* Column of the index that must match this term */
- signed char nNear; /* term followed by a NEAR operator with span=(nNear-1) */
- signed char isOr; /* this term is preceded by "OR" */
- signed char isNot; /* this term is preceded by "-" */
- signed char isPrefix; /* this term is followed by "*" */
- char *pTerm; /* text of the term. '\000' terminated. malloced */
- int nTerm; /* Number of bytes in pTerm[] */
-} QueryTerm;
-
-
-/* A query string is parsed into a Query structure.
- *
- * We could, in theory, allow query strings to be complicated
- * nested expressions with precedence determined by parentheses.
- * But none of the major search engines do this. (Perhaps the
- * feeling is that an parenthesized expression is two complex of
- * an idea for the average user to grasp.) Taking our lead from
- * the major search engines, we will allow queries to be a list
- * of terms (with an implied AND operator) or phrases in double-quotes,
- * with a single optional "-" before each non-phrase term to designate
- * negation and an optional OR connector.
- *
- * OR binds more tightly than the implied AND, which is what the
- * major search engines seem to do. So, for example:
- *
- * [one two OR three] ==> one AND (two OR three)
- * [one OR two three] ==> (one OR two) AND three
- *
- * A "-" before a term matches all entries that lack that term.
- * The "-" must occur immediately before the term with in intervening
- * space. This is how the search engines do it.
- *
- * A NOT term cannot be the right-hand operand of an OR. If this
- * occurs in the query string, the NOT is ignored:
- *
- * [one OR -two] ==> one OR two
- *
- */
-typedef struct Query {
- fulltext_vtab *pFts; /* The full text index */
- int nTerms; /* Number of terms in the query */
- QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */
- int nextIsOr; /* Set the isOr flag on the next inserted term */
- int nextIsNear; /* Set the isOr flag on the next inserted term */
- int nextColumn; /* Next word parsed must be in this column */
- int dfltColumn; /* The default column */
-} Query;
-
-
/*
** An instance of the following structure keeps track of generated
** matching-word offset information and snippets.
@@ -80930,17 +99312,22 @@ typedef enum fulltext_statement {
CONTENT_SELECT_STMT,
CONTENT_UPDATE_STMT,
CONTENT_DELETE_STMT,
+ CONTENT_EXISTS_STMT,
BLOCK_INSERT_STMT,
BLOCK_SELECT_STMT,
BLOCK_DELETE_STMT,
+ BLOCK_DELETE_ALL_STMT,
SEGDIR_MAX_INDEX_STMT,
SEGDIR_SET_STMT,
- SEGDIR_SELECT_STMT,
+ SEGDIR_SELECT_LEVEL_STMT,
SEGDIR_SPAN_STMT,
SEGDIR_DELETE_STMT,
+ SEGDIR_SELECT_SEGMENT_STMT,
SEGDIR_SELECT_ALL_STMT,
+ SEGDIR_DELETE_ALL_STMT,
+ SEGDIR_COUNT_STMT,
MAX_STMT /* Always at end! */
} fulltext_statement;
@@ -80955,23 +99342,35 @@ static const char *const fulltext_zStatement[MAX_STMT] = {
/* CONTENT_SELECT */ NULL, /* generated in contentSelectStatement() */
/* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */
/* CONTENT_DELETE */ "delete from %_content where docid = ?",
+ /* CONTENT_EXISTS */ "select docid from %_content limit 1",
/* BLOCK_INSERT */
"insert into %_segments (blockid, block) values (null, ?)",
/* BLOCK_SELECT */ "select block from %_segments where blockid = ?",
/* BLOCK_DELETE */ "delete from %_segments where blockid between ? and ?",
+ /* BLOCK_DELETE_ALL */ "delete from %_segments",
/* SEGDIR_MAX_INDEX */ "select max(idx) from %_segdir where level = ?",
/* SEGDIR_SET */ "insert into %_segdir values (?, ?, ?, ?, ?, ?)",
- /* SEGDIR_SELECT */
+ /* SEGDIR_SELECT_LEVEL */
"select start_block, leaves_end_block, root from %_segdir "
" where level = ? order by idx",
/* SEGDIR_SPAN */
"select min(start_block), max(end_block) from %_segdir "
" where level = ? and start_block <> 0",
/* SEGDIR_DELETE */ "delete from %_segdir where level = ?",
+
+ /* NOTE(shess): The first three results of the following two
+ ** statements must match.
+ */
+ /* SEGDIR_SELECT_SEGMENT */
+ "select start_block, leaves_end_block, root from %_segdir "
+ " where level = ? and idx = ?",
/* SEGDIR_SELECT_ALL */
- "select root, leaves_end_block from %_segdir order by level desc, idx",
+ "select start_block, leaves_end_block, root from %_segdir "
+ " order by level desc, idx asc",
+ /* SEGDIR_DELETE_ALL */ "delete from %_segdir",
+ /* SEGDIR_COUNT */ "select count(*), ifnull(max(level),0) from %_segdir",
};
/*
@@ -81030,14 +99429,14 @@ typedef struct fulltext_cursor {
QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */
sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */
int eof; /* True if at End Of Results */
- Query q; /* Parsed query string */
+ Fts3Expr *pExpr; /* Parsed MATCH query string */
Snippet snippet; /* Cached snippet for the current row */
int iColumn; /* Column being searched */
DataBuffer result; /* Doclist results from fulltextQuery */
DLReader reader; /* Result reader if result not empty */
} fulltext_cursor;
-static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){
+static fulltext_vtab *cursor_vtab(fulltext_cursor *c){
return (fulltext_vtab *) c->base.pVtab;
}
@@ -81136,15 +99535,18 @@ static int sql_single_step(sqlite3_stmt *s){
}
/* Like sql_get_statement(), but for special replicated LEAF_SELECT
-** statements.
+** statements. idx -1 is a special case for an uncached version of
+** the statement (used in the optimize implementation).
*/
/* TODO(shess) Write version for generic statements and then share
** that between the cached-statement functions.
*/
static int sql_get_leaf_statement(fulltext_vtab *v, int idx,
sqlite3_stmt **ppStmt){
- assert( idx>=0 && idx<MERGE_COUNT );
- if( v->pLeafSelectStmts[idx]==NULL ){
+ assert( idx>=-1 && idx<MERGE_COUNT );
+ if( idx==-1 ){
+ return sql_prepare(v->db, v->zDb, v->zName, ppStmt, LEAF_SELECT);
+ }else if( v->pLeafSelectStmts[idx]==NULL ){
int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx],
LEAF_SELECT);
if( rc!=SQLITE_OK ) return rc;
@@ -81265,6 +99667,25 @@ static int content_delete(fulltext_vtab *v, sqlite_int64 iDocid){
return sql_single_step(s);
}
+/* Returns SQLITE_ROW if any rows exist in %_content, SQLITE_DONE if
+** no rows exist, and any error in case of failure.
+*/
+static int content_exists(fulltext_vtab *v){
+ sqlite3_stmt *s;
+ int rc = sql_get_statement(v, CONTENT_EXISTS_STMT, &s);
+ if( rc!=SQLITE_OK ) return rc;
+
+ rc = sqlite3_step(s);
+ if( rc!=SQLITE_ROW ) return rc;
+
+ /* We expect only one row. We must execute another sqlite3_step()
+ * to complete the iteration; otherwise the table will remain locked. */
+ rc = sqlite3_step(s);
+ if( rc==SQLITE_DONE ) return SQLITE_ROW;
+ if( rc==SQLITE_ROW ) return SQLITE_ERROR;
+ return rc;
+}
+
/* insert into %_segments values ([pData])
** returns assigned blockid in *piBlockid
*/
@@ -81439,6 +99860,54 @@ static int segdir_delete(fulltext_vtab *v, int iLevel){
return sql_single_step(s);
}
+/* Delete entire fts index, SQLITE_OK on success, relevant error on
+** failure.
+*/
+static int segdir_delete_all(fulltext_vtab *v){
+ sqlite3_stmt *s;
+ int rc = sql_get_statement(v, SEGDIR_DELETE_ALL_STMT, &s);
+ if( rc!=SQLITE_OK ) return rc;
+
+ rc = sql_single_step(s);
+ if( rc!=SQLITE_OK ) return rc;
+
+ rc = sql_get_statement(v, BLOCK_DELETE_ALL_STMT, &s);
+ if( rc!=SQLITE_OK ) return rc;
+
+ return sql_single_step(s);
+}
+
+/* Returns SQLITE_OK with *pnSegments set to the number of entries in
+** %_segdir and *piMaxLevel set to the highest level which has a
+** segment. Otherwise returns the SQLite error which caused failure.
+*/
+static int segdir_count(fulltext_vtab *v, int *pnSegments, int *piMaxLevel){
+ sqlite3_stmt *s;
+ int rc = sql_get_statement(v, SEGDIR_COUNT_STMT, &s);
+ if( rc!=SQLITE_OK ) return rc;
+
+ rc = sqlite3_step(s);
+ /* TODO(shess): This case should not be possible? Should stronger
+ ** measures be taken if it happens?
+ */
+ if( rc==SQLITE_DONE ){
+ *pnSegments = 0;
+ *piMaxLevel = 0;
+ return SQLITE_OK;
+ }
+ if( rc!=SQLITE_ROW ) return rc;
+
+ *pnSegments = sqlite3_column_int(s, 0);
+ *piMaxLevel = sqlite3_column_int(s, 1);
+
+ /* We expect only one row. We must execute another sqlite3_step()
+ * to complete the iteration; otherwise the table will remain locked. */
+ rc = sqlite3_step(s);
+ if( rc==SQLITE_DONE ) return SQLITE_OK;
+ if( rc==SQLITE_ROW ) return SQLITE_ERROR;
+ return rc;
+}
+
/* TODO(shess) clearPendingTerms() is far down the file because
** writeZeroSegment() is far down the file because LeafWriter is far
** down the file. Consider refactoring the code to move the non-vtab
@@ -82115,18 +100584,6 @@ static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
}
}
-
-/* Free all of the dynamically allocated memory held by *q
-*/
-static void queryClear(Query *q){
- int i;
- for(i = 0; i < q->nTerms; ++i){
- sqlite3_free(q->pTerms[i].pTerm);
- }
- sqlite3_free(q->pTerms);
- CLEAR(q);
-}
-
/* Free all of the dynamically allocated memory held by the
** Snippet
*/
@@ -82136,6 +100593,7 @@ static void snippetClear(Snippet *p){
sqlite3_free(p->zSnippet);
CLEAR(p);
}
+
/*
** Append a single entry to the p->aMatch[] log.
*/
@@ -82172,23 +100630,82 @@ static void snippetAppendMatch(
#define FTS3_ROTOR_MASK (FTS3_ROTOR_SZ-1)
/*
+** Function to iterate through the tokens of a compiled expression.
+**
+** Except, skip all tokens on the right-hand side of a NOT operator.
+** This function is used to find tokens as part of snippet and offset
+** generation and we do nt want snippets and offsets to report matches
+** for tokens on the RHS of a NOT.
+*/
+static int fts3NextExprToken(Fts3Expr **ppExpr, int *piToken){
+ Fts3Expr *p = *ppExpr;
+ int iToken = *piToken;
+ if( iToken<0 ){
+ /* In this case the expression p is the root of an expression tree.
+ ** Move to the first token in the expression tree.
+ */
+ while( p->pLeft ){
+ p = p->pLeft;
+ }
+ iToken = 0;
+ }else{
+ assert(p && p->eType==FTSQUERY_PHRASE );
+ if( iToken<(p->pPhrase->nToken-1) ){
+ iToken++;
+ }else{
+ iToken = 0;
+ while( p->pParent && p->pParent->pLeft!=p ){
+ assert( p->pParent->pRight==p );
+ p = p->pParent;
+ }
+ p = p->pParent;
+ if( p ){
+ assert( p->pRight!=0 );
+ p = p->pRight;
+ while( p->pLeft ){
+ p = p->pLeft;
+ }
+ }
+ }
+ }
+
+ *ppExpr = p;
+ *piToken = iToken;
+ return p?1:0;
+}
+
+/*
+** Return TRUE if the expression node pExpr is located beneath the
+** RHS of a NOT operator.
+*/
+static int fts3ExprBeneathNot(Fts3Expr *p){
+ Fts3Expr *pParent;
+ while( p ){
+ pParent = p->pParent;
+ if( pParent && pParent->eType==FTSQUERY_NOT && pParent->pRight==p ){
+ return 1;
+ }
+ p = pParent;
+ }
+ return 0;
+}
+
+/*
** Add entries to pSnippet->aMatch[] for every match that occurs against
** document zDoc[0..nDoc-1] which is stored in column iColumn.
*/
static void snippetOffsetsOfColumn(
- Query *pQuery,
- Snippet *pSnippet,
- int iColumn,
- const char *zDoc,
- int nDoc
+ fulltext_cursor *pCur, /* The fulltest search cursor */
+ Snippet *pSnippet, /* The Snippet object to be filled in */
+ int iColumn, /* Index of fulltext table column */
+ const char *zDoc, /* Text of the fulltext table column */
+ int nDoc /* Length of zDoc in bytes */
){
const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */
sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */
sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */
fulltext_vtab *pVtab; /* The full text index */
int nColumn; /* Number of columns in the index */
- const QueryTerm *aTerm; /* Query string terms */
- int nTerm; /* Number of query string terms */
int i, j; /* Loop counters */
int rc; /* Return code */
unsigned int match, prevMatch; /* Phrase search bitmasks */
@@ -82202,37 +100719,39 @@ static void snippetOffsetsOfColumn(
int iRotorBegin[FTS3_ROTOR_SZ]; /* Beginning offset of token */
int iRotorLen[FTS3_ROTOR_SZ]; /* Length of token */
- pVtab = pQuery->pFts;
+ pVtab = cursor_vtab(pCur);
nColumn = pVtab->nColumn;
pTokenizer = pVtab->pTokenizer;
pTModule = pTokenizer->pModule;
rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor);
if( rc ) return;
pTCursor->pTokenizer = pTokenizer;
- aTerm = pQuery->pTerms;
- nTerm = pQuery->nTerms;
- if( nTerm>=FTS3_ROTOR_SZ ){
- nTerm = FTS3_ROTOR_SZ - 1;
- }
+
prevMatch = 0;
- while(1){
- rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos);
- if( rc ) break;
+ while( !pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos) ){
+ Fts3Expr *pIter = pCur->pExpr;
+ int iIter = -1;
iRotorBegin[iRotor&FTS3_ROTOR_MASK] = iBegin;
iRotorLen[iRotor&FTS3_ROTOR_MASK] = iEnd-iBegin;
match = 0;
- for(i=0; i<nTerm; i++){
- int iCol;
- iCol = aTerm[i].iColumn;
+ for(i=0; i<(FTS3_ROTOR_SZ-1) && fts3NextExprToken(&pIter, &iIter); i++){
+ int nPhrase; /* Number of tokens in current phrase */
+ struct PhraseToken *pToken; /* Current token */
+ int iCol; /* Column index */
+
+ if( fts3ExprBeneathNot(pIter) ) continue;
+ nPhrase = pIter->pPhrase->nToken;
+ pToken = &pIter->pPhrase->aToken[iIter];
+ iCol = pIter->pPhrase->iColumn;
if( iCol>=0 && iCol<nColumn && iCol!=iColumn ) continue;
- if( aTerm[i].nTerm>nToken ) continue;
- if( !aTerm[i].isPrefix && aTerm[i].nTerm<nToken ) continue;
- assert( aTerm[i].nTerm<=nToken );
- if( memcmp(aTerm[i].pTerm, zToken, aTerm[i].nTerm) ) continue;
- if( aTerm[i].iPhrase>1 && (prevMatch & (1<<i))==0 ) continue;
+ if( pToken->n>nToken ) continue;
+ if( !pToken->isPrefix && pToken->n<nToken ) continue;
+ assert( pToken->n<=nToken );
+ if( memcmp(pToken->z, zToken, pToken->n) ) continue;
+ if( iIter>0 && (prevMatch & (1<<i))==0 ) continue;
match |= 1<<i;
- if( i==nTerm-1 || aTerm[i+1].iPhrase==1 ){
- for(j=aTerm[i].iPhrase-1; j>=0; j--){
+ if( i==(FTS3_ROTOR_SZ-2) || nPhrase==iIter+1 ){
+ for(j=nPhrase-1; j>=0; j--){
int k = (iRotor-j) & FTS3_ROTOR_MASK;
snippetAppendMatch(pSnippet, iColumn, i-j, iPos-j,
iRotorBegin[k], iRotorLen[k]);
@@ -82262,86 +100781,115 @@ static void snippetOffsetsOfColumn(
** then when this function is called the Snippet contains token offsets
** 0, 4 and 5. This function removes the "0" entry (because the first A
** is not near enough to an E).
+**
+** When this function is called, the value pointed to by parameter piLeft is
+** the integer id of the left-most token in the expression tree headed by
+** pExpr. This function increments *piLeft by the total number of tokens
+** in the expression tree headed by pExpr.
+**
+** Return 1 if any trimming occurs. Return 0 if no trimming is required.
*/
-static void trimSnippetOffsetsForNear(Query *pQuery, Snippet *pSnippet){
- int ii;
- int iDir = 1;
-
- while(iDir>-2) {
- assert( iDir==1 || iDir==-1 );
- for(ii=0; ii<pSnippet->nMatch; ii++){
- int jj;
- int nNear;
- struct snippetMatch *pMatch = &pSnippet->aMatch[ii];
- QueryTerm *pQueryTerm = &pQuery->pTerms[pMatch->iTerm];
-
- if( (pMatch->iTerm+iDir)<0
- || (pMatch->iTerm+iDir)>=pQuery->nTerms
- ){
- continue;
- }
-
- nNear = pQueryTerm->nNear;
- if( iDir<0 ){
- nNear = pQueryTerm[-1].nNear;
- }
-
- if( pMatch->iTerm>=0 && nNear ){
- int isOk = 0;
- int iNextTerm = pMatch->iTerm+iDir;
- int iPrevTerm = iNextTerm;
-
- int iEndToken;
- int iStartToken;
-
- if( iDir<0 ){
- int nPhrase = 1;
- iStartToken = pMatch->iToken;
- while( (pMatch->iTerm+nPhrase)<pQuery->nTerms
- && pQuery->pTerms[pMatch->iTerm+nPhrase].iPhrase>1
- ){
- nPhrase++;
- }
- iEndToken = iStartToken + nPhrase - 1;
- }else{
- iEndToken = pMatch->iToken;
- iStartToken = pMatch->iToken+1-pQueryTerm->iPhrase;
- }
+static int trimSnippetOffsets(
+ Fts3Expr *pExpr, /* The search expression */
+ Snippet *pSnippet, /* The set of snippet offsets to be trimmed */
+ int *piLeft /* Index of left-most token in pExpr */
+){
+ if( pExpr ){
+ if( trimSnippetOffsets(pExpr->pLeft, pSnippet, piLeft) ){
+ return 1;
+ }
- while( pQuery->pTerms[iNextTerm].iPhrase>1 ){
- iNextTerm--;
- }
- while( (iPrevTerm+1)<pQuery->nTerms &&
- pQuery->pTerms[iPrevTerm+1].iPhrase>1
- ){
- iPrevTerm++;
+ switch( pExpr->eType ){
+ case FTSQUERY_PHRASE:
+ *piLeft += pExpr->pPhrase->nToken;
+ break;
+ case FTSQUERY_NEAR: {
+ /* The right-hand-side of a NEAR operator is always a phrase. The
+ ** left-hand-side is either a phrase or an expression tree that is
+ ** itself headed by a NEAR operator. The following initializations
+ ** set local variable iLeft to the token number of the left-most
+ ** token in the right-hand phrase, and iRight to the right most
+ ** token in the same phrase. For example, if we had:
+ **
+ ** <col> MATCH '"abc def" NEAR/2 "ghi jkl"'
+ **
+ ** then iLeft will be set to 2 (token number of ghi) and nToken will
+ ** be set to 4.
+ */
+ Fts3Expr *pLeft = pExpr->pLeft;
+ Fts3Expr *pRight = pExpr->pRight;
+ int iLeft = *piLeft;
+ int nNear = pExpr->nNear;
+ int nToken = pRight->pPhrase->nToken;
+ int jj, ii;
+ if( pLeft->eType==FTSQUERY_NEAR ){
+ pLeft = pLeft->pRight;
}
-
- for(jj=0; isOk==0 && jj<pSnippet->nMatch; jj++){
- struct snippetMatch *p = &pSnippet->aMatch[jj];
- if( p->iCol==pMatch->iCol && ((
- p->iTerm==iNextTerm &&
- p->iToken>iEndToken &&
- p->iToken<=iEndToken+nNear
- ) || (
- p->iTerm==iPrevTerm &&
- p->iToken<iStartToken &&
- p->iToken>=iStartToken-nNear
- ))){
- isOk = 1;
+ assert( pRight->eType==FTSQUERY_PHRASE );
+ assert( pLeft->eType==FTSQUERY_PHRASE );
+ nToken += pLeft->pPhrase->nToken;
+
+ for(ii=0; ii<pSnippet->nMatch; ii++){
+ struct snippetMatch *p = &pSnippet->aMatch[ii];
+ if( p->iTerm==iLeft ){
+ int isOk = 0;
+ /* Snippet ii is an occurence of query term iLeft in the document.
+ ** It occurs at position (p->iToken) of the document. We now
+ ** search for an instance of token (iLeft-1) somewhere in the
+ ** range (p->iToken - nNear)...(p->iToken + nNear + nToken) within
+ ** the set of snippetMatch structures. If one is found, proceed.
+ ** If one cannot be found, then remove snippets ii..(ii+N-1)
+ ** from the matching snippets, where N is the number of tokens
+ ** in phrase pRight->pPhrase.
+ */
+ for(jj=0; isOk==0 && jj<pSnippet->nMatch; jj++){
+ struct snippetMatch *p2 = &pSnippet->aMatch[jj];
+ if( p2->iTerm==(iLeft-1) ){
+ if( p2->iToken>=(p->iToken-nNear-1)
+ && p2->iToken<(p->iToken+nNear+nToken)
+ ){
+ isOk = 1;
+ }
+ }
+ }
+ if( !isOk ){
+ int kk;
+ for(kk=0; kk<pRight->pPhrase->nToken; kk++){
+ pSnippet->aMatch[kk+ii].iTerm = -2;
+ }
+ return 1;
+ }
}
- }
- if( !isOk ){
- for(jj=1-pQueryTerm->iPhrase; jj<=0; jj++){
- pMatch[jj].iTerm = -1;
+ if( p->iTerm==(iLeft-1) ){
+ int isOk = 0;
+ for(jj=0; isOk==0 && jj<pSnippet->nMatch; jj++){
+ struct snippetMatch *p2 = &pSnippet->aMatch[jj];
+ if( p2->iTerm==iLeft ){
+ if( p2->iToken<=(p->iToken+nNear+1)
+ && p2->iToken>(p->iToken-nNear-nToken)
+ ){
+ isOk = 1;
+ }
+ }
+ }
+ if( !isOk ){
+ int kk;
+ for(kk=0; kk<pLeft->pPhrase->nToken; kk++){
+ pSnippet->aMatch[ii-kk].iTerm = -2;
+ }
+ return 1;
+ }
}
- ii = -1;
- iDir = 1;
}
+ break;
}
}
- iDir -= 2;
+
+ if( trimSnippetOffsets(pExpr->pRight, pSnippet, piLeft) ){
+ return 1;
+ }
}
+ return 0;
}
/*
@@ -82352,17 +100900,20 @@ static void snippetAllOffsets(fulltext_cursor *p){
int nColumn;
int iColumn, i;
int iFirst, iLast;
- fulltext_vtab *pFts;
+ int iTerm = 0;
+ fulltext_vtab *pFts = cursor_vtab(p);
- if( p->snippet.nMatch ) return;
- if( p->q.nTerms==0 ) return;
- pFts = p->q.pFts;
+ if( p->snippet.nMatch || p->pExpr==0 ){
+ return;
+ }
nColumn = pFts->nColumn;
iColumn = (p->iCursorType - QUERY_FULLTEXT);
if( iColumn<0 || iColumn>=nColumn ){
+ /* Look for matches over all columns of the full-text index */
iFirst = 0;
iLast = nColumn-1;
}else{
+ /* Look for matches in the iColumn-th column of the index only */
iFirst = iColumn;
iLast = iColumn;
}
@@ -82371,15 +100922,18 @@ static void snippetAllOffsets(fulltext_cursor *p){
int nDoc;
zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1);
nDoc = sqlite3_column_bytes(p->pStmt, i+1);
- snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc);
+ snippetOffsetsOfColumn(p, &p->snippet, i, zDoc, nDoc);
}
- trimSnippetOffsetsForNear(&p->q, &p->snippet);
+ while( trimSnippetOffsets(p->pExpr, &p->snippet, &iTerm) ){
+ iTerm = 0;
+ }
}
/*
** Convert the information in the aMatch[] array of the snippet
-** into the string zOffset[0..nOffset-1].
+** into the string zOffset[0..nOffset-1]. This string is used as
+** the return of the SQL offsets() function.
*/
static void snippetOffsetText(Snippet *p){
int i;
@@ -82494,7 +101048,7 @@ static void snippetText(
aMatch[i].snStatus = SNIPPET_IGNORE;
}
nDesired = 0;
- for(i=0; i<pCursor->q.nTerms; i++){
+ for(i=0; i<FTS3_ROTOR_SZ; i++){
for(j=0; j<nMatch; j++){
if( aMatch[j].iTerm==i ){
aMatch[j].snStatus = SNIPPET_DESIRED;
@@ -82582,9 +101136,11 @@ static int fulltextClose(sqlite3_vtab_cursor *pCursor){
fulltext_cursor *c = (fulltext_cursor *) pCursor;
FTSTRACE(("FTS3 Close %p\n", c));
sqlite3_finalize(c->pStmt);
- queryClear(&c->q);
+ sqlite3Fts3ExprFree(c->pExpr);
snippetClear(&c->snippet);
- if( c->result.nData!=0 ) dlrDestroy(&c->reader);
+ if( c->result.nData!=0 ){
+ dlrDestroy(&c->reader);
+ }
dataBufferDestroy(&c->result);
sqlite3_free(c);
return SQLITE_OK;
@@ -82641,259 +101197,127 @@ static int termSelect(fulltext_vtab *v, int iColumn,
const char *pTerm, int nTerm, int isPrefix,
DocListType iType, DataBuffer *out);
-/* Return a DocList corresponding to the query term *pTerm. If *pTerm
-** is the first term of a phrase query, go ahead and evaluate the phrase
-** query and return the doclist for the entire phrase query.
+/*
+** Return a DocList corresponding to the phrase *pPhrase.
**
** The resulting DL_DOCIDS doclist is stored in pResult, which is
** overwritten.
*/
-static int docListOfTerm(
- fulltext_vtab *v, /* The full text index */
- int iColumn, /* column to restrict to. No restriction if >=nColumn */
- QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */
- DataBuffer *pResult /* Write the result here */
+static int docListOfPhrase(
+ fulltext_vtab *pTab, /* The full text index */
+ Fts3Phrase *pPhrase, /* Phrase to return a doclist corresponding to */
+ DocListType eListType, /* Either DL_DOCIDS or DL_POSITIONS */
+ DataBuffer *pResult /* Write the result here */
){
- DataBuffer left, right, new;
- int i, rc;
-
- /* No phrase search if no position info. */
- assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS );
+ int ii;
+ int rc = SQLITE_OK;
+ int iCol = pPhrase->iColumn;
+ DocListType eType = eListType;
+ assert( eType==DL_POSITIONS || eType==DL_DOCIDS );
+ if( pPhrase->nToken>1 ){
+ eType = DL_POSITIONS;
+ }
/* This code should never be called with buffered updates. */
- assert( v->nPendingData<0 );
-
- dataBufferInit(&left, 0);
- rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix,
- (0<pQTerm->nPhrase ? DL_POSITIONS : DL_DOCIDS), &left);
- if( rc ) return rc;
- for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){
- /* If this token is connected to the next by a NEAR operator, and
- ** the next token is the start of a phrase, then set nPhraseRight
- ** to the number of tokens in the phrase. Otherwise leave it at 1.
- */
- int nPhraseRight = 1;
- while( (i+nPhraseRight)<=pQTerm->nPhrase
- && pQTerm[i+nPhraseRight].nNear==0
- ){
- nPhraseRight++;
- }
+ assert( pTab->nPendingData<0 );
- dataBufferInit(&right, 0);
- rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm,
- pQTerm[i].isPrefix, DL_POSITIONS, &right);
- if( rc ){
- dataBufferDestroy(&left);
- return rc;
+ for(ii=0; rc==SQLITE_OK && ii<pPhrase->nToken; ii++){
+ DataBuffer tmp;
+ struct PhraseToken *p = &pPhrase->aToken[ii];
+ rc = termSelect(pTab, iCol, p->z, p->n, p->isPrefix, eType, &tmp);
+ if( rc==SQLITE_OK ){
+ if( ii==0 ){
+ *pResult = tmp;
+ }else{
+ DataBuffer res = *pResult;
+ dataBufferInit(pResult, 0);
+ if( ii==(pPhrase->nToken-1) ){
+ eType = eListType;
+ }
+ docListPhraseMerge(
+ res.pData, res.nData, tmp.pData, tmp.nData, 0, 0, eType, pResult
+ );
+ dataBufferDestroy(&res);
+ dataBufferDestroy(&tmp);
+ }
}
- dataBufferInit(&new, 0);
- docListPhraseMerge(left.pData, left.nData, right.pData, right.nData,
- pQTerm[i-1].nNear, pQTerm[i-1].iPhrase + nPhraseRight,
- ((i<pQTerm->nPhrase) ? DL_POSITIONS : DL_DOCIDS),
- &new);
- dataBufferDestroy(&left);
- dataBufferDestroy(&right);
- left = new;
}
- *pResult = left;
- return SQLITE_OK;
-}
-/* Add a new term pTerm[0..nTerm-1] to the query *q.
-*/
-static void queryAdd(Query *q, const char *pTerm, int nTerm){
- QueryTerm *t;
- ++q->nTerms;
- q->pTerms = sqlite3_realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0]));
- if( q->pTerms==0 ){
- q->nTerms = 0;
- return;
- }
- t = &q->pTerms[q->nTerms - 1];
- CLEAR(t);
- t->pTerm = sqlite3_malloc(nTerm+1);
- memcpy(t->pTerm, pTerm, nTerm);
- t->pTerm[nTerm] = 0;
- t->nTerm = nTerm;
- t->isOr = q->nextIsOr;
- t->isPrefix = 0;
- q->nextIsOr = 0;
- t->iColumn = q->nextColumn;
- q->nextColumn = q->dfltColumn;
+ return rc;
}
/*
-** Check to see if the string zToken[0...nToken-1] matches any
-** column name in the virtual table. If it does,
-** return the zero-indexed column number. If not, return -1.
+** Evaluate the full-text expression pExpr against fts3 table pTab. Write
+** the results into pRes.
*/
-static int checkColumnSpecifier(
- fulltext_vtab *pVtab, /* The virtual table */
- const char *zToken, /* Text of the token */
- int nToken /* Number of characters in the token */
+static int evalFts3Expr(
+ fulltext_vtab *pTab, /* Fts3 Virtual table object */
+ Fts3Expr *pExpr, /* Parsed fts3 expression */
+ DataBuffer *pRes /* OUT: Write results of the expression here */
){
- int i;
- for(i=0; i<pVtab->nColumn; i++){
- if( memcmp(pVtab->azColumn[i], zToken, nToken)==0
- && pVtab->azColumn[i][nToken]==0 ){
- return i;
- }
- }
- return -1;
-}
+ int rc = SQLITE_OK;
-/*
-** Parse the text at pSegment[0..nSegment-1]. Add additional terms
-** to the query being assemblied in pQuery.
-**
-** inPhrase is true if pSegment[0..nSegement-1] is contained within
-** double-quotes. If inPhrase is true, then the first term
-** is marked with the number of terms in the phrase less one and
-** OR and "-" syntax is ignored. If inPhrase is false, then every
-** term found is marked with nPhrase=0 and OR and "-" syntax is significant.
-*/
-static int tokenizeSegment(
- sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */
- const char *pSegment, int nSegment, /* Query expression being parsed */
- int inPhrase, /* True if within "..." */
- Query *pQuery /* Append results here */
-){
- const sqlite3_tokenizer_module *pModule = pTokenizer->pModule;
- sqlite3_tokenizer_cursor *pCursor;
- int firstIndex = pQuery->nTerms;
- int iCol;
- int nTerm = 1;
-
- int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor);
- if( rc!=SQLITE_OK ) return rc;
- pCursor->pTokenizer = pTokenizer;
+ /* Initialize the output buffer. If this is an empty query (pExpr==0),
+ ** this is all that needs to be done. Empty queries produce empty
+ ** result sets.
+ */
+ dataBufferInit(pRes, 0);
- while( 1 ){
- const char *pToken;
- int nToken, iBegin, iEnd, iPos;
+ if( pExpr ){
+ if( pExpr->eType==FTSQUERY_PHRASE ){
+ DocListType eType = DL_DOCIDS;
+ if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){
+ eType = DL_POSITIONS;
+ }
+ rc = docListOfPhrase(pTab, pExpr->pPhrase, eType, pRes);
+ }else{
+ DataBuffer lhs;
+ DataBuffer rhs;
- rc = pModule->xNext(pCursor,
- &pToken, &nToken,
- &iBegin, &iEnd, &iPos);
- if( rc!=SQLITE_OK ) break;
- if( !inPhrase &&
- pSegment[iEnd]==':' &&
- (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){
- pQuery->nextColumn = iCol;
- continue;
- }
- if( !inPhrase && pQuery->nTerms>0 && nToken==2
- && pSegment[iBegin+0]=='O'
- && pSegment[iBegin+1]=='R'
- ){
- pQuery->nextIsOr = 1;
- continue;
- }
- if( !inPhrase && pQuery->nTerms>0 && !pQuery->nextIsOr && nToken==4
- && pSegment[iBegin+0]=='N'
- && pSegment[iBegin+1]=='E'
- && pSegment[iBegin+2]=='A'
- && pSegment[iBegin+3]=='R'
- ){
- QueryTerm *pTerm = &pQuery->pTerms[pQuery->nTerms-1];
- if( (iBegin+6)<nSegment
- && pSegment[iBegin+4] == '/'
- && pSegment[iBegin+5]>='0' && pSegment[iBegin+5]<='9'
+ dataBufferInit(&rhs, 0);
+ if( SQLITE_OK==(rc = evalFts3Expr(pTab, pExpr->pLeft, &lhs))
+ && SQLITE_OK==(rc = evalFts3Expr(pTab, pExpr->pRight, &rhs))
){
- pTerm->nNear = (pSegment[iBegin+5] - '0');
- nToken += 2;
- if( pSegment[iBegin+6]>='0' && pSegment[iBegin+6]<=9 ){
- pTerm->nNear = pTerm->nNear * 10 + (pSegment[iBegin+6] - '0');
- iEnd++;
+ switch( pExpr->eType ){
+ case FTSQUERY_NEAR: {
+ int nToken;
+ Fts3Expr *pLeft;
+ DocListType eType = DL_DOCIDS;
+ if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){
+ eType = DL_POSITIONS;
+ }
+ pLeft = pExpr->pLeft;
+ while( pLeft->eType==FTSQUERY_NEAR ){
+ pLeft=pLeft->pRight;
+ }
+ assert( pExpr->pRight->eType==FTSQUERY_PHRASE );
+ assert( pLeft->eType==FTSQUERY_PHRASE );
+ nToken = pLeft->pPhrase->nToken + pExpr->pRight->pPhrase->nToken;
+ docListPhraseMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData,
+ pExpr->nNear+1, nToken, eType, pRes
+ );
+ break;
+ }
+ case FTSQUERY_NOT: {
+ docListExceptMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData,pRes);
+ break;
+ }
+ case FTSQUERY_AND: {
+ docListAndMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData, pRes);
+ break;
+ }
+ case FTSQUERY_OR: {
+ docListOrMerge(lhs.pData, lhs.nData, rhs.pData, rhs.nData, pRes);
+ break;
+ }
}
- pModule->xNext(pCursor, &pToken, &nToken, &iBegin, &iEnd, &iPos);
- } else {
- pTerm->nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM;
- }
- pTerm->nNear++;
- continue;
- }
-
- queryAdd(pQuery, pToken, nToken);
- if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){
- pQuery->pTerms[pQuery->nTerms-1].isNot = 1;
- }
- if( iEnd<nSegment && pSegment[iEnd]=='*' ){
- pQuery->pTerms[pQuery->nTerms-1].isPrefix = 1;
- }
- pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm;
- if( inPhrase ){
- nTerm++;
- }
- }
-
- if( inPhrase && pQuery->nTerms>firstIndex ){
- pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1;
- }
-
- return pModule->xClose(pCursor);
-}
-
-/* Parse a query string, yielding a Query object pQuery.
-**
-** The calling function will need to queryClear() to clean up
-** the dynamically allocated memory held by pQuery.
-*/
-static int parseQuery(
- fulltext_vtab *v, /* The fulltext index */
- const char *zInput, /* Input text of the query string */
- int nInput, /* Size of the input text */
- int dfltColumn, /* Default column of the index to match against */
- Query *pQuery /* Write the parse results here. */
-){
- int iInput, inPhrase = 0;
- int ii;
- QueryTerm *aTerm;
-
- if( zInput==0 ) nInput = 0;
- if( nInput<0 ) nInput = strlen(zInput);
- pQuery->nTerms = 0;
- pQuery->pTerms = NULL;
- pQuery->nextIsOr = 0;
- pQuery->nextColumn = dfltColumn;
- pQuery->dfltColumn = dfltColumn;
- pQuery->pFts = v;
-
- for(iInput=0; iInput<nInput; ++iInput){
- int i;
- for(i=iInput; i<nInput && zInput[i]!='"'; ++i){}
- if( i>iInput ){
- tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase,
- pQuery);
- }
- iInput = i;
- if( i<nInput ){
- assert( zInput[i]=='"' );
- inPhrase = !inPhrase;
- }
- }
-
- if( inPhrase ){
- /* unmatched quote */
- queryClear(pQuery);
- return SQLITE_ERROR;
- }
-
- /* Modify the values of the QueryTerm.nPhrase variables to account for
- ** the NEAR operator. For the purposes of QueryTerm.nPhrase, phrases
- ** and tokens connected by the NEAR operator are handled as a single
- ** phrase. See comments above the QueryTerm structure for details.
- */
- aTerm = pQuery->pTerms;
- for(ii=0; ii<pQuery->nTerms; ii++){
- if( aTerm[ii].nNear || aTerm[ii].nPhrase ){
- while (aTerm[ii+aTerm[ii].nPhrase].nNear) {
- aTerm[ii].nPhrase += (1 + aTerm[ii+aTerm[ii].nPhrase+1].nPhrase);
}
+ dataBufferDestroy(&lhs);
+ dataBufferDestroy(&rhs);
}
}
- return SQLITE_OK;
+ return rc;
}
/* TODO(shess) Refactor the code to remove this forward decl. */
@@ -82912,12 +101336,9 @@ static int fulltextQuery(
const char *zInput, /* The query string */
int nInput, /* Number of bytes in zInput[] */
DataBuffer *pResult, /* Write the result doclist here */
- Query *pQuery /* Put parsed query string here */
+ Fts3Expr **ppExpr /* Put parsed query string here */
){
- int i, iNext, rc;
- DataBuffer left, right, or, new;
- int nNot = 0;
- QueryTerm *aTerm;
+ int rc;
/* TODO(shess) Instead of flushing pendingTerms, we could query for
** the relevant term and merge the doclist into what we receive from
@@ -82929,86 +101350,20 @@ static int fulltextQuery(
/* Flush any buffered updates before executing the query. */
rc = flushPendingTerms(v);
- if( rc!=SQLITE_OK ) return rc;
-
- /* TODO(shess) I think that the queryClear() calls below are not
- ** necessary, because fulltextClose() already clears the query.
- */
- rc = parseQuery(v, zInput, nInput, iColumn, pQuery);
- if( rc!=SQLITE_OK ) return rc;
-
- /* Empty or NULL queries return no results. */
- if( pQuery->nTerms==0 ){
- dataBufferInit(pResult, 0);
- return SQLITE_OK;
- }
-
- /* Merge AND terms. */
- /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */
- aTerm = pQuery->pTerms;
- for(i = 0; i<pQuery->nTerms; i=iNext){
- if( aTerm[i].isNot ){
- /* Handle all NOT terms in a separate pass */
- nNot++;
- iNext = i + aTerm[i].nPhrase+1;
- continue;
- }
- iNext = i + aTerm[i].nPhrase + 1;
- rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right);
- if( rc ){
- if( i!=nNot ) dataBufferDestroy(&left);
- queryClear(pQuery);
- return rc;
- }
- while( iNext<pQuery->nTerms && aTerm[iNext].isOr ){
- rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or);
- iNext += aTerm[iNext].nPhrase + 1;
- if( rc ){
- if( i!=nNot ) dataBufferDestroy(&left);
- dataBufferDestroy(&right);
- queryClear(pQuery);
- return rc;
- }
- dataBufferInit(&new, 0);
- docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new);
- dataBufferDestroy(&right);
- dataBufferDestroy(&or);
- right = new;
- }
- if( i==nNot ){ /* first term processed. */
- left = right;
- }else{
- dataBufferInit(&new, 0);
- docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new);
- dataBufferDestroy(&right);
- dataBufferDestroy(&left);
- left = new;
- }
- }
-
- if( nNot==pQuery->nTerms ){
- /* We do not yet know how to handle a query of only NOT terms */
- return SQLITE_ERROR;
+ if( rc!=SQLITE_OK ){
+ return rc;
}
- /* Do the EXCEPT terms */
- for(i=0; i<pQuery->nTerms; i += aTerm[i].nPhrase + 1){
- if( !aTerm[i].isNot ) continue;
- rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right);
- if( rc ){
- queryClear(pQuery);
- dataBufferDestroy(&left);
- return rc;
- }
- dataBufferInit(&new, 0);
- docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new);
- dataBufferDestroy(&right);
- dataBufferDestroy(&left);
- left = new;
+ /* Parse the query passed to the MATCH operator. */
+ rc = sqlite3Fts3ExprParse(v->pTokenizer,
+ v->azColumn, v->nColumn, iColumn, zInput, nInput, ppExpr
+ );
+ if( rc!=SQLITE_OK ){
+ assert( 0==(*ppExpr) );
+ return rc;
}
- *pResult = left;
- return rc;
+ return evalFts3Expr(v, *ppExpr, pResult);
}
/*
@@ -83040,21 +101395,43 @@ static int fulltextFilter(
fulltext_cursor *c = (fulltext_cursor *) pCursor;
fulltext_vtab *v = cursor_vtab(c);
int rc;
- StringBuffer sb;
FTSTRACE(("FTS3 Filter %p\n",pCursor));
- initStringBuffer(&sb);
- append(&sb, "SELECT docid, ");
- appendList(&sb, v->nColumn, v->azContentColumn);
- append(&sb, " FROM %_content");
- if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?");
- sqlite3_finalize(c->pStmt);
- rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, stringBufferData(&sb));
- stringBufferDestroy(&sb);
- if( rc!=SQLITE_OK ) return rc;
+ /* If the cursor has a statement that was not prepared according to
+ ** idxNum, clear it. I believe all calls to fulltextFilter with a
+ ** given cursor will have the same idxNum , but in this case it's
+ ** easy to be safe.
+ */
+ if( c->pStmt && c->iCursorType!=idxNum ){
+ sqlite3_finalize(c->pStmt);
+ c->pStmt = NULL;
+ }
+
+ /* Get a fresh statement appropriate to idxNum. */
+ /* TODO(shess): Add a prepared-statement cache in the vt structure.
+ ** The cache must handle multiple open cursors. Easier to cache the
+ ** statement variants at the vt to reduce malloc/realloc/free here.
+ ** Or we could have a StringBuffer variant which allowed stack
+ ** construction for small values.
+ */
+ if( !c->pStmt ){
+ StringBuffer sb;
+ initStringBuffer(&sb);
+ append(&sb, "SELECT docid, ");
+ appendList(&sb, v->nColumn, v->azContentColumn);
+ append(&sb, " FROM %_content");
+ if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?");
+ rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt,
+ stringBufferData(&sb));
+ stringBufferDestroy(&sb);
+ if( rc!=SQLITE_OK ) return rc;
+ c->iCursorType = idxNum;
+ }else{
+ sqlite3_reset(c->pStmt);
+ assert( c->iCursorType==idxNum );
+ }
- c->iCursorType = idxNum;
switch( idxNum ){
case QUERY_GENERIC:
break;
@@ -83066,10 +101443,10 @@ static int fulltextFilter(
default: /* full-text search */
{
+ int iCol = idxNum-QUERY_FULLTEXT;
const char *zQuery = (const char *)sqlite3_value_text(argv[0]);
assert( idxNum<=QUERY_FULLTEXT+v->nColumn);
assert( argc==1 );
- queryClear(&c->q);
if( c->result.nData!=0 ){
/* This case happens if the same cursor is used repeatedly. */
dlrDestroy(&c->reader);
@@ -83077,7 +101454,7 @@ static int fulltextFilter(
}else{
dataBufferInit(&c->result, 0);
}
- rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q);
+ rc = fulltextQuery(v, iCol, zQuery, -1, &c->result, &c->pExpr);
if( rc!=SQLITE_OK ) return rc;
if( c->result.nData!=0 ){
dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData);
@@ -84314,6 +102691,12 @@ static int leavesReaderReset(LeavesReader *pReader){
}
static void leavesReaderDestroy(LeavesReader *pReader){
+ /* If idx is -1, that means we're using a non-cached statement
+ ** handle in the optimize() case, so we need to release it.
+ */
+ if( pReader->pStmt!=NULL && pReader->idx==-1 ){
+ sqlite3_finalize(pReader->pStmt);
+ }
leafReaderDestroy(&pReader->leafReader);
dataBufferDestroy(&pReader->rootData);
SCRAMBLE(pReader);
@@ -84434,7 +102817,7 @@ static void leavesReaderReorder(LeavesReader *pLr, int nLr){
static int leavesReadersInit(fulltext_vtab *v, int iLevel,
LeavesReader *pReaders, int *piReaders){
sqlite3_stmt *s;
- int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s);
+ int i, rc = sql_get_statement(v, SEGDIR_SELECT_LEVEL_STMT, &s);
if( rc!=SQLITE_OK ) return rc;
rc = sqlite3_bind_int(s, 1, iLevel);
@@ -84955,9 +103338,14 @@ static int loadSegment(fulltext_vtab *v, const char *pData, int nData,
/* Scan the database and merge together the posting lists for the term
** into *out.
*/
-static int termSelect(fulltext_vtab *v, int iColumn,
- const char *pTerm, int nTerm, int isPrefix,
- DocListType iType, DataBuffer *out){
+static int termSelect(
+ fulltext_vtab *v,
+ int iColumn,
+ const char *pTerm, int nTerm, /* Term to query for */
+ int isPrefix, /* True for a prefix search */
+ DocListType iType,
+ DataBuffer *out /* Write results here */
+){
DataBuffer doclist;
sqlite3_stmt *s;
int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s);
@@ -84967,13 +103355,14 @@ static int termSelect(fulltext_vtab *v, int iColumn,
assert( v->nPendingData<0 );
dataBufferInit(&doclist, 0);
+ dataBufferInit(out, 0);
/* Traverse the segments from oldest to newest so that newer doclist
** elements for given docids overwrite older elements.
*/
while( (rc = sqlite3_step(s))==SQLITE_ROW ){
- const char *pData = sqlite3_column_blob(s, 0);
- const int nData = sqlite3_column_bytes(s, 0);
+ const char *pData = sqlite3_column_blob(s, 2);
+ const int nData = sqlite3_column_bytes(s, 2);
const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1);
rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix,
&doclist);
@@ -85127,6 +103516,23 @@ static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg,
if( nArg<2 ){
rc = index_delete(v, sqlite3_value_int64(ppArg[0]));
+ if( rc==SQLITE_OK ){
+ /* If we just deleted the last row in the table, clear out the
+ ** index data.
+ */
+ rc = content_exists(v);
+ if( rc==SQLITE_ROW ){
+ rc = SQLITE_OK;
+ }else if( rc==SQLITE_DONE ){
+ /* Clear the pending terms so we don't flush a useless level-0
+ ** segment when the transaction closes.
+ */
+ rc = clearPendingTerms(v);
+ if( rc==SQLITE_OK ){
+ rc = segdir_delete_all(v);
+ }
+ }
+ }
} else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){
/* An update:
* ppArg[0] = old rowid
@@ -85263,6 +103669,665 @@ static void snippetOffsetsFunc(
}
}
+/* OptLeavesReader is nearly identical to LeavesReader, except that
+** where LeavesReader is geared towards the merging of complete
+** segment levels (with exactly MERGE_COUNT segments), OptLeavesReader
+** is geared towards implementation of the optimize() function, and
+** can merge all segments simultaneously. This version may be
+** somewhat less efficient than LeavesReader because it merges into an
+** accumulator rather than doing an N-way merge, but since segment
+** size grows exponentially (so segment count logrithmically) this is
+** probably not an immediate problem.
+*/
+/* TODO(shess): Prove that assertion, or extend the merge code to
+** merge tree fashion (like the prefix-searching code does).
+*/
+/* TODO(shess): OptLeavesReader and LeavesReader could probably be
+** merged with little or no loss of performance for LeavesReader. The
+** merged code would need to handle >MERGE_COUNT segments, and would
+** also need to be able to optionally optimize away deletes.
+*/
+typedef struct OptLeavesReader {
+ /* Segment number, to order readers by age. */
+ int segment;
+ LeavesReader reader;
+} OptLeavesReader;
+
+static int optLeavesReaderAtEnd(OptLeavesReader *pReader){
+ return leavesReaderAtEnd(&pReader->reader);
+}
+static int optLeavesReaderTermBytes(OptLeavesReader *pReader){
+ return leavesReaderTermBytes(&pReader->reader);
+}
+static const char *optLeavesReaderData(OptLeavesReader *pReader){
+ return leavesReaderData(&pReader->reader);
+}
+static int optLeavesReaderDataBytes(OptLeavesReader *pReader){
+ return leavesReaderDataBytes(&pReader->reader);
+}
+static const char *optLeavesReaderTerm(OptLeavesReader *pReader){
+ return leavesReaderTerm(&pReader->reader);
+}
+static int optLeavesReaderStep(fulltext_vtab *v, OptLeavesReader *pReader){
+ return leavesReaderStep(v, &pReader->reader);
+}
+static int optLeavesReaderTermCmp(OptLeavesReader *lr1, OptLeavesReader *lr2){
+ return leavesReaderTermCmp(&lr1->reader, &lr2->reader);
+}
+/* Order by term ascending, segment ascending (oldest to newest), with
+** exhausted readers to the end.
+*/
+static int optLeavesReaderCmp(OptLeavesReader *lr1, OptLeavesReader *lr2){
+ int c = optLeavesReaderTermCmp(lr1, lr2);
+ if( c!=0 ) return c;
+ return lr1->segment-lr2->segment;
+}
+/* Bubble pLr[0] to appropriate place in pLr[1..nLr-1]. Assumes that
+** pLr[1..nLr-1] is already sorted.
+*/
+static void optLeavesReaderReorder(OptLeavesReader *pLr, int nLr){
+ while( nLr>1 && optLeavesReaderCmp(pLr, pLr+1)>0 ){
+ OptLeavesReader tmp = pLr[0];
+ pLr[0] = pLr[1];
+ pLr[1] = tmp;
+ nLr--;
+ pLr++;
+ }
+}
+
+/* optimize() helper function. Put the readers in order and iterate
+** through them, merging doclists for matching terms into pWriter.
+** Returns SQLITE_OK on success, or the SQLite error code which
+** prevented success.
+*/
+static int optimizeInternal(fulltext_vtab *v,
+ OptLeavesReader *readers, int nReaders,
+ LeafWriter *pWriter){
+ int i, rc = SQLITE_OK;
+ DataBuffer doclist, merged, tmp;
+
+ /* Order the readers. */
+ i = nReaders;
+ while( i-- > 0 ){
+ optLeavesReaderReorder(&readers[i], nReaders-i);
+ }
+
+ dataBufferInit(&doclist, LEAF_MAX);
+ dataBufferInit(&merged, LEAF_MAX);
+
+ /* Exhausted readers bubble to the end, so when the first reader is
+ ** at eof, all are at eof.
+ */
+ while( !optLeavesReaderAtEnd(&readers[0]) ){
+
+ /* Figure out how many readers share the next term. */
+ for(i=1; i<nReaders && !optLeavesReaderAtEnd(&readers[i]); i++){
+ if( 0!=optLeavesReaderTermCmp(&readers[0], &readers[i]) ) break;
+ }
+
+ /* Special-case for no merge. */
+ if( i==1 ){
+ /* Trim deletions from the doclist. */
+ dataBufferReset(&merged);
+ docListTrim(DL_DEFAULT,
+ optLeavesReaderData(&readers[0]),
+ optLeavesReaderDataBytes(&readers[0]),
+ -1, DL_DEFAULT, &merged);
+ }else{
+ DLReader dlReaders[MERGE_COUNT];
+ int iReader, nReaders;
+
+ /* Prime the pipeline with the first reader's doclist. After
+ ** one pass index 0 will reference the accumulated doclist.
+ */
+ dlrInit(&dlReaders[0], DL_DEFAULT,
+ optLeavesReaderData(&readers[0]),
+ optLeavesReaderDataBytes(&readers[0]));
+ iReader = 1;
+
+ assert( iReader<i ); /* Must execute the loop at least once. */
+ while( iReader<i ){
+ /* Merge 16 inputs per pass. */
+ for( nReaders=1; iReader<i && nReaders<MERGE_COUNT;
+ iReader++, nReaders++ ){
+ dlrInit(&dlReaders[nReaders], DL_DEFAULT,
+ optLeavesReaderData(&readers[iReader]),
+ optLeavesReaderDataBytes(&readers[iReader]));
+ }
+
+ /* Merge doclists and swap result into accumulator. */
+ dataBufferReset(&merged);
+ docListMerge(&merged, dlReaders, nReaders);
+ tmp = merged;
+ merged = doclist;
+ doclist = tmp;
+
+ while( nReaders-- > 0 ){
+ dlrDestroy(&dlReaders[nReaders]);
+ }
+
+ /* Accumulated doclist to reader 0 for next pass. */
+ dlrInit(&dlReaders[0], DL_DEFAULT, doclist.pData, doclist.nData);
+ }
+
+ /* Destroy reader that was left in the pipeline. */
+ dlrDestroy(&dlReaders[0]);
+
+ /* Trim deletions from the doclist. */
+ dataBufferReset(&merged);
+ docListTrim(DL_DEFAULT, doclist.pData, doclist.nData,
+ -1, DL_DEFAULT, &merged);
+ }
+
+ /* Only pass doclists with hits (skip if all hits deleted). */
+ if( merged.nData>0 ){
+ rc = leafWriterStep(v, pWriter,
+ optLeavesReaderTerm(&readers[0]),
+ optLeavesReaderTermBytes(&readers[0]),
+ merged.pData, merged.nData);
+ if( rc!=SQLITE_OK ) goto err;
+ }
+
+ /* Step merged readers to next term and reorder. */
+ while( i-- > 0 ){
+ rc = optLeavesReaderStep(v, &readers[i]);
+ if( rc!=SQLITE_OK ) goto err;
+
+ optLeavesReaderReorder(&readers[i], nReaders-i);
+ }
+ }
+
+ err:
+ dataBufferDestroy(&doclist);
+ dataBufferDestroy(&merged);
+ return rc;
+}
+
+/* Implement optimize() function for FTS3. optimize(t) merges all
+** segments in the fts index into a single segment. 't' is the magic
+** table-named column.
+*/
+static void optimizeFunc(sqlite3_context *pContext,
+ int argc, sqlite3_value **argv){
+ fulltext_cursor *pCursor;
+ if( argc>1 ){
+ sqlite3_result_error(pContext, "excess arguments to optimize()",-1);
+ }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
+ sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
+ sqlite3_result_error(pContext, "illegal first argument to optimize",-1);
+ }else{
+ fulltext_vtab *v;
+ int i, rc, iMaxLevel;
+ OptLeavesReader *readers;
+ int nReaders;
+ LeafWriter writer;
+ sqlite3_stmt *s;
+
+ memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
+ v = cursor_vtab(pCursor);
+
+ /* Flush any buffered updates before optimizing. */
+ rc = flushPendingTerms(v);
+ if( rc!=SQLITE_OK ) goto err;
+
+ rc = segdir_count(v, &nReaders, &iMaxLevel);
+ if( rc!=SQLITE_OK ) goto err;
+ if( nReaders==0 || nReaders==1 ){
+ sqlite3_result_text(pContext, "Index already optimal", -1,
+ SQLITE_STATIC);
+ return;
+ }
+
+ rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s);
+ if( rc!=SQLITE_OK ) goto err;
+
+ readers = sqlite3_malloc(nReaders*sizeof(readers[0]));
+ if( readers==NULL ) goto err;
+
+ /* Note that there will already be a segment at this position
+ ** until we call segdir_delete() on iMaxLevel.
+ */
+ leafWriterInit(iMaxLevel, 0, &writer);
+
+ i = 0;
+ while( (rc = sqlite3_step(s))==SQLITE_ROW ){
+ sqlite_int64 iStart = sqlite3_column_int64(s, 0);
+ sqlite_int64 iEnd = sqlite3_column_int64(s, 1);
+ const char *pRootData = sqlite3_column_blob(s, 2);
+ int nRootData = sqlite3_column_bytes(s, 2);
+
+ assert( i<nReaders );
+ rc = leavesReaderInit(v, -1, iStart, iEnd, pRootData, nRootData,
+ &readers[i].reader);
+ if( rc!=SQLITE_OK ) break;
+
+ readers[i].segment = i;
+ i++;
+ }
+
+ /* If we managed to successfully read them all, optimize them. */
+ if( rc==SQLITE_DONE ){
+ assert( i==nReaders );
+ rc = optimizeInternal(v, readers, nReaders, &writer);
+ }
+
+ while( i-- > 0 ){
+ leavesReaderDestroy(&readers[i].reader);
+ }
+ sqlite3_free(readers);
+
+ /* If we've successfully gotten to here, delete the old segments
+ ** and flush the interior structure of the new segment.
+ */
+ if( rc==SQLITE_OK ){
+ for( i=0; i<=iMaxLevel; i++ ){
+ rc = segdir_delete(v, i);
+ if( rc!=SQLITE_OK ) break;
+ }
+
+ if( rc==SQLITE_OK ) rc = leafWriterFinalize(v, &writer);
+ }
+
+ leafWriterDestroy(&writer);
+
+ if( rc!=SQLITE_OK ) goto err;
+
+ sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC);
+ return;
+
+ /* TODO(shess): Error-handling needs to be improved along the
+ ** lines of the dump_ functions.
+ */
+ err:
+ {
+ char buf[512];
+ sqlite3_snprintf(sizeof(buf), buf, "Error in optimize: %s",
+ sqlite3_errmsg(sqlite3_context_db_handle(pContext)));
+ sqlite3_result_error(pContext, buf, -1);
+ }
+ }
+}
+
+#ifdef SQLITE_TEST
+/* Generate an error of the form "<prefix>: <msg>". If msg is NULL,
+** pull the error from the context's db handle.
+*/
+static void generateError(sqlite3_context *pContext,
+ const char *prefix, const char *msg){
+ char buf[512];
+ if( msg==NULL ) msg = sqlite3_errmsg(sqlite3_context_db_handle(pContext));
+ sqlite3_snprintf(sizeof(buf), buf, "%s: %s", prefix, msg);
+ sqlite3_result_error(pContext, buf, -1);
+}
+
+/* Helper function to collect the set of terms in the segment into
+** pTerms. The segment is defined by the leaf nodes between
+** iStartBlockid and iEndBlockid, inclusive, or by the contents of
+** pRootData if iStartBlockid is 0 (in which case the entire segment
+** fit in a leaf).
+*/
+static int collectSegmentTerms(fulltext_vtab *v, sqlite3_stmt *s,
+ fts3Hash *pTerms){
+ const sqlite_int64 iStartBlockid = sqlite3_column_int64(s, 0);
+ const sqlite_int64 iEndBlockid = sqlite3_column_int64(s, 1);
+ const char *pRootData = sqlite3_column_blob(s, 2);
+ const int nRootData = sqlite3_column_bytes(s, 2);
+ LeavesReader reader;
+ int rc = leavesReaderInit(v, 0, iStartBlockid, iEndBlockid,
+ pRootData, nRootData, &reader);
+ if( rc!=SQLITE_OK ) return rc;
+
+ while( rc==SQLITE_OK && !leavesReaderAtEnd(&reader) ){
+ const char *pTerm = leavesReaderTerm(&reader);
+ const int nTerm = leavesReaderTermBytes(&reader);
+ void *oldValue = sqlite3Fts3HashFind(pTerms, pTerm, nTerm);
+ void *newValue = (void *)((char *)oldValue+1);
+
+ /* From the comment before sqlite3Fts3HashInsert in fts3_hash.c,
+ ** the data value passed is returned in case of malloc failure.
+ */
+ if( newValue==sqlite3Fts3HashInsert(pTerms, pTerm, nTerm, newValue) ){
+ rc = SQLITE_NOMEM;
+ }else{
+ rc = leavesReaderStep(v, &reader);
+ }
+ }
+
+ leavesReaderDestroy(&reader);
+ return rc;
+}
+
+/* Helper function to build the result string for dump_terms(). */
+static int generateTermsResult(sqlite3_context *pContext, fts3Hash *pTerms){
+ int iTerm, nTerms, nResultBytes, iByte;
+ char *result;
+ TermData *pData;
+ fts3HashElem *e;
+
+ /* Iterate pTerms to generate an array of terms in pData for
+ ** sorting.
+ */
+ nTerms = fts3HashCount(pTerms);
+ assert( nTerms>0 );
+ pData = sqlite3_malloc(nTerms*sizeof(TermData));
+ if( pData==NULL ) return SQLITE_NOMEM;
+
+ nResultBytes = 0;
+ for(iTerm = 0, e = fts3HashFirst(pTerms); e; iTerm++, e = fts3HashNext(e)){
+ nResultBytes += fts3HashKeysize(e)+1; /* Term plus trailing space */
+ assert( iTerm<nTerms );
+ pData[iTerm].pTerm = fts3HashKey(e);
+ pData[iTerm].nTerm = fts3HashKeysize(e);
+ pData[iTerm].pCollector = fts3HashData(e); /* unused */
+ }
+ assert( iTerm==nTerms );
+
+ assert( nResultBytes>0 ); /* nTerms>0, nResultsBytes must be, too. */
+ result = sqlite3_malloc(nResultBytes);
+ if( result==NULL ){
+ sqlite3_free(pData);
+ return SQLITE_NOMEM;
+ }
+
+ if( nTerms>1 ) qsort(pData, nTerms, sizeof(*pData), termDataCmp);
+
+ /* Read the terms in order to build the result. */
+ iByte = 0;
+ for(iTerm=0; iTerm<nTerms; ++iTerm){
+ memcpy(result+iByte, pData[iTerm].pTerm, pData[iTerm].nTerm);
+ iByte += pData[iTerm].nTerm;
+ result[iByte++] = ' ';
+ }
+ assert( iByte==nResultBytes );
+ assert( result[nResultBytes-1]==' ' );
+ result[nResultBytes-1] = '\0';
+
+ /* Passes away ownership of result. */
+ sqlite3_result_text(pContext, result, nResultBytes-1, sqlite3_free);
+ sqlite3_free(pData);
+ return SQLITE_OK;
+}
+
+/* Implements dump_terms() for use in inspecting the fts3 index from
+** tests. TEXT result containing the ordered list of terms joined by
+** spaces. dump_terms(t, level, idx) dumps the terms for the segment
+** specified by level, idx (in %_segdir), while dump_terms(t) dumps
+** all terms in the index. In both cases t is the fts table's magic
+** table-named column.
+*/
+static void dumpTermsFunc(
+ sqlite3_context *pContext,
+ int argc, sqlite3_value **argv
+){
+ fulltext_cursor *pCursor;
+ if( argc!=3 && argc!=1 ){
+ generateError(pContext, "dump_terms", "incorrect arguments");
+ }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
+ sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
+ generateError(pContext, "dump_terms", "illegal first argument");
+ }else{
+ fulltext_vtab *v;
+ fts3Hash terms;
+ sqlite3_stmt *s = NULL;
+ int rc;
+
+ memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
+ v = cursor_vtab(pCursor);
+
+ /* If passed only the cursor column, get all segments. Otherwise
+ ** get the segment described by the following two arguments.
+ */
+ if( argc==1 ){
+ rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s);
+ }else{
+ rc = sql_get_statement(v, SEGDIR_SELECT_SEGMENT_STMT, &s);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_bind_int(s, 1, sqlite3_value_int(argv[1]));
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_bind_int(s, 2, sqlite3_value_int(argv[2]));
+ }
+ }
+ }
+
+ if( rc!=SQLITE_OK ){
+ generateError(pContext, "dump_terms", NULL);
+ return;
+ }
+
+ /* Collect the terms for each segment. */
+ sqlite3Fts3HashInit(&terms, FTS3_HASH_STRING, 1);
+ while( (rc = sqlite3_step(s))==SQLITE_ROW ){
+ rc = collectSegmentTerms(v, s, &terms);
+ if( rc!=SQLITE_OK ) break;
+ }
+
+ if( rc!=SQLITE_DONE ){
+ sqlite3_reset(s);
+ generateError(pContext, "dump_terms", NULL);
+ }else{
+ const int nTerms = fts3HashCount(&terms);
+ if( nTerms>0 ){
+ rc = generateTermsResult(pContext, &terms);
+ if( rc==SQLITE_NOMEM ){
+ generateError(pContext, "dump_terms", "out of memory");
+ }else{
+ assert( rc==SQLITE_OK );
+ }
+ }else if( argc==3 ){
+ /* The specific segment asked for could not be found. */
+ generateError(pContext, "dump_terms", "segment not found");
+ }else{
+ /* No segments found. */
+ /* TODO(shess): It should be impossible to reach this. This
+ ** case can only happen for an empty table, in which case
+ ** SQLite has no rows to call this function on.
+ */
+ sqlite3_result_null(pContext);
+ }
+ }
+ sqlite3Fts3HashClear(&terms);
+ }
+}
+
+/* Expand the DL_DEFAULT doclist in pData into a text result in
+** pContext.
+*/
+static void createDoclistResult(sqlite3_context *pContext,
+ const char *pData, int nData){
+ DataBuffer dump;
+ DLReader dlReader;
+
+ assert( pData!=NULL && nData>0 );
+
+ dataBufferInit(&dump, 0);
+ dlrInit(&dlReader, DL_DEFAULT, pData, nData);
+ for( ; !dlrAtEnd(&dlReader); dlrStep(&dlReader) ){
+ char buf[256];
+ PLReader plReader;
+
+ plrInit(&plReader, &dlReader);
+ if( DL_DEFAULT==DL_DOCIDS || plrAtEnd(&plReader) ){
+ sqlite3_snprintf(sizeof(buf), buf, "[%lld] ", dlrDocid(&dlReader));
+ dataBufferAppend(&dump, buf, strlen(buf));
+ }else{
+ int iColumn = plrColumn(&plReader);
+
+ sqlite3_snprintf(sizeof(buf), buf, "[%lld %d[",
+ dlrDocid(&dlReader), iColumn);
+ dataBufferAppend(&dump, buf, strlen(buf));
+
+ for( ; !plrAtEnd(&plReader); plrStep(&plReader) ){
+ if( plrColumn(&plReader)!=iColumn ){
+ iColumn = plrColumn(&plReader);
+ sqlite3_snprintf(sizeof(buf), buf, "] %d[", iColumn);
+ assert( dump.nData>0 );
+ dump.nData--; /* Overwrite trailing space. */
+ assert( dump.pData[dump.nData]==' ');
+ dataBufferAppend(&dump, buf, strlen(buf));
+ }
+ if( DL_DEFAULT==DL_POSITIONS_OFFSETS ){
+ sqlite3_snprintf(sizeof(buf), buf, "%d,%d,%d ",
+ plrPosition(&plReader),
+ plrStartOffset(&plReader), plrEndOffset(&plReader));
+ }else if( DL_DEFAULT==DL_POSITIONS ){
+ sqlite3_snprintf(sizeof(buf), buf, "%d ", plrPosition(&plReader));
+ }else{
+ assert( NULL=="Unhandled DL_DEFAULT value");
+ }
+ dataBufferAppend(&dump, buf, strlen(buf));
+ }
+ plrDestroy(&plReader);
+
+ assert( dump.nData>0 );
+ dump.nData--; /* Overwrite trailing space. */
+ assert( dump.pData[dump.nData]==' ');
+ dataBufferAppend(&dump, "]] ", 3);
+ }
+ }
+ dlrDestroy(&dlReader);
+
+ assert( dump.nData>0 );
+ dump.nData--; /* Overwrite trailing space. */
+ assert( dump.pData[dump.nData]==' ');
+ dump.pData[dump.nData] = '\0';
+ assert( dump.nData>0 );
+
+ /* Passes ownership of dump's buffer to pContext. */
+ sqlite3_result_text(pContext, dump.pData, dump.nData, sqlite3_free);
+ dump.pData = NULL;
+ dump.nData = dump.nCapacity = 0;
+}
+
+/* Implements dump_doclist() for use in inspecting the fts3 index from
+** tests. TEXT result containing a string representation of the
+** doclist for the indicated term. dump_doclist(t, term, level, idx)
+** dumps the doclist for term from the segment specified by level, idx
+** (in %_segdir), while dump_doclist(t, term) dumps the logical
+** doclist for the term across all segments. The per-segment doclist
+** can contain deletions, while the full-index doclist will not
+** (deletions are omitted).
+**
+** Result formats differ with the setting of DL_DEFAULTS. Examples:
+**
+** DL_DOCIDS: [1] [3] [7]
+** DL_POSITIONS: [1 0[0 4] 1[17]] [3 1[5]]
+** DL_POSITIONS_OFFSETS: [1 0[0,0,3 4,23,26] 1[17,102,105]] [3 1[5,20,23]]
+**
+** In each case the number after the outer '[' is the docid. In the
+** latter two cases, the number before the inner '[' is the column
+** associated with the values within. For DL_POSITIONS the numbers
+** within are the positions, for DL_POSITIONS_OFFSETS they are the
+** position, the start offset, and the end offset.
+*/
+static void dumpDoclistFunc(
+ sqlite3_context *pContext,
+ int argc, sqlite3_value **argv
+){
+ fulltext_cursor *pCursor;
+ if( argc!=2 && argc!=4 ){
+ generateError(pContext, "dump_doclist", "incorrect arguments");
+ }else if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
+ sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
+ generateError(pContext, "dump_doclist", "illegal first argument");
+ }else if( sqlite3_value_text(argv[1])==NULL ||
+ sqlite3_value_text(argv[1])[0]=='\0' ){
+ generateError(pContext, "dump_doclist", "empty second argument");
+ }else{
+ const char *pTerm = (const char *)sqlite3_value_text(argv[1]);
+ const int nTerm = strlen(pTerm);
+ fulltext_vtab *v;
+ int rc;
+ DataBuffer doclist;
+
+ memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
+ v = cursor_vtab(pCursor);
+
+ dataBufferInit(&doclist, 0);
+
+ /* termSelect() yields the same logical doclist that queries are
+ ** run against.
+ */
+ if( argc==2 ){
+ rc = termSelect(v, v->nColumn, pTerm, nTerm, 0, DL_DEFAULT, &doclist);
+ }else{
+ sqlite3_stmt *s = NULL;
+
+ /* Get our specific segment's information. */
+ rc = sql_get_statement(v, SEGDIR_SELECT_SEGMENT_STMT, &s);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_bind_int(s, 1, sqlite3_value_int(argv[2]));
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_bind_int(s, 2, sqlite3_value_int(argv[3]));
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_step(s);
+
+ if( rc==SQLITE_DONE ){
+ dataBufferDestroy(&doclist);
+ generateError(pContext, "dump_doclist", "segment not found");
+ return;
+ }
+
+ /* Found a segment, load it into doclist. */
+ if( rc==SQLITE_ROW ){
+ const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1);
+ const char *pData = sqlite3_column_blob(s, 2);
+ const int nData = sqlite3_column_bytes(s, 2);
+
+ /* loadSegment() is used by termSelect() to load each
+ ** segment's data.
+ */
+ rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, 0,
+ &doclist);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_step(s);
+
+ /* Should not have more than one matching segment. */
+ if( rc!=SQLITE_DONE ){
+ sqlite3_reset(s);
+ dataBufferDestroy(&doclist);
+ generateError(pContext, "dump_doclist", "invalid segdir");
+ return;
+ }
+ rc = SQLITE_OK;
+ }
+ }
+ }
+
+ sqlite3_reset(s);
+ }
+
+ if( rc==SQLITE_OK ){
+ if( doclist.nData>0 ){
+ createDoclistResult(pContext, doclist.pData, doclist.nData);
+ }else{
+ /* TODO(shess): This can happen if the term is not present, or
+ ** if all instances of the term have been deleted and this is
+ ** an all-index dump. It may be interesting to distinguish
+ ** these cases.
+ */
+ sqlite3_result_text(pContext, "", 0, SQLITE_STATIC);
+ }
+ }else if( rc==SQLITE_NOMEM ){
+ /* Handle out-of-memory cases specially because if they are
+ ** generated in fts3 code they may not be reflected in the db
+ ** handle.
+ */
+ /* TODO(shess): Handle this more comprehensively.
+ ** sqlite3ErrStr() has what I need, but is internal.
+ */
+ generateError(pContext, "dump_doclist", "out of memory");
+ }else{
+ generateError(pContext, "dump_doclist", NULL);
+ }
+
+ dataBufferDestroy(&doclist);
+ }
+}
+#endif
+
/*
** This routine implements the xFindFunction method for the FTS3
** virtual table.
@@ -85280,6 +104345,23 @@ static int fulltextFindFunction(
}else if( strcmp(zName,"offsets")==0 ){
*pxFunc = snippetOffsetsFunc;
return 1;
+ }else if( strcmp(zName,"optimize")==0 ){
+ *pxFunc = optimizeFunc;
+ return 1;
+#ifdef SQLITE_TEST
+ /* NOTE(shess): These functions are present only for testing
+ ** purposes. No particular effort is made to optimize their
+ ** execution or how they build their results.
+ */
+ }else if( strcmp(zName,"dump_terms")==0 ){
+ /* fprintf(stderr, "Found dump_terms\n"); */
+ *pxFunc = dumpTermsFunc;
+ return 1;
+ }else if( strcmp(zName,"dump_doclist")==0 ){
+ /* fprintf(stderr, "Found dump_doclist\n"); */
+ *pxFunc = dumpDoclistFunc;
+ return 1;
+#endif
}
return 0;
}
@@ -85391,6 +104473,10 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
}
}
+#ifdef SQLITE_TEST
+ sqlite3Fts3ExprInitTestInterface(db);
+#endif
+
/* Create the virtual table wrapper around the hash-table and overload
** the two scalar functions. If this is successful, register the
** module with sqlite.
@@ -85399,13 +104485,18 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
&& SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer"))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1))
+ && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", -1))
+#ifdef SQLITE_TEST
+ && SQLITE_OK==(rc = sqlite3_overload_function(db, "dump_terms", -1))
+ && SQLITE_OK==(rc = sqlite3_overload_function(db, "dump_doclist", -1))
+#endif
){
return sqlite3_create_module_v2(
db, "fts3", &fts3Module, (void *)pHash, hashDestroy
);
}
- /* An error has occured. Delete the hash table and return the error code. */
+ /* An error has occurred. Delete the hash table and return the error code. */
assert( rc!=SQLITE_OK );
if( pHash ){
sqlite3Fts3HashClear(pHash);
@@ -85428,6 +104519,903 @@ SQLITE_API int sqlite3_extension_init(
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
/************** End of fts3.c ************************************************/
+/************** Begin file fts3_expr.c ***************************************/
+/*
+** 2008 Nov 28
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+******************************************************************************
+**
+** This module contains code that implements a parser for fts3 query strings
+** (the right-hand argument to the MATCH operator). Because the supported
+** syntax is relatively simple, the whole tokenizer/parser system is
+** hand-coded. The public interface to this module is declared in source
+** code file "fts3_expr.h".
+*/
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
+
+/*
+** By default, this module parses the legacy syntax that has been
+** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS
+** is defined, then it uses the new syntax. The differences between
+** the new and the old syntaxes are:
+**
+** a) The new syntax supports parenthesis. The old does not.
+**
+** b) The new syntax supports the AND and NOT operators. The old does not.
+**
+** c) The old syntax supports the "-" token qualifier. This is not
+** supported by the new syntax (it is replaced by the NOT operator).
+**
+** d) When using the old syntax, the OR operator has a greater precedence
+** than an implicit AND. When using the new, both implicity and explicit
+** AND operators have a higher precedence than OR.
+**
+** If compiled with SQLITE_TEST defined, then this module exports the
+** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable
+** to zero causes the module to use the old syntax. If it is set to
+** non-zero the new syntax is activated. This is so both syntaxes can
+** be tested using a single build of testfixture.
+*/
+#ifdef SQLITE_TEST
+SQLITE_API int sqlite3_fts3_enable_parentheses = 0;
+#else
+# ifdef SQLITE_ENABLE_FTS3_PARENTHESIS
+# define sqlite3_fts3_enable_parentheses 1
+# else
+# define sqlite3_fts3_enable_parentheses 0
+# endif
+#endif
+
+/*
+** Default span for NEAR operators.
+*/
+#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10
+
+
+typedef struct ParseContext ParseContext;
+struct ParseContext {
+ sqlite3_tokenizer *pTokenizer; /* Tokenizer module */
+ const char **azCol; /* Array of column names for fts3 table */
+ int nCol; /* Number of entries in azCol[] */
+ int iDefaultCol; /* Default column to query */
+ sqlite3_context *pCtx; /* Write error message here */
+ int nNest; /* Number of nested brackets */
+};
+
+/*
+** This function is equivalent to the standard isspace() function.
+**
+** The standard isspace() can be awkward to use safely, because although it
+** is defined to accept an argument of type int, its behaviour when passed
+** an integer that falls outside of the range of the unsigned char type
+** is undefined (and sometimes, "undefined" means segfault). This wrapper
+** is defined to accept an argument of type char, and always returns 0 for
+** any values that fall outside of the range of the unsigned char type (i.e.
+** negative values).
+*/
+static int fts3isspace(char c){
+ return (c&0x80)==0 ? isspace(c) : 0;
+}
+
+/*
+** Extract the next token from buffer z (length n) using the tokenizer
+** and other information (column names etc.) in pParse. Create an Fts3Expr
+** structure of type FTSQUERY_PHRASE containing a phrase consisting of this
+** single token and set *ppExpr to point to it. If the end of the buffer is
+** reached before a token is found, set *ppExpr to zero. It is the
+** responsibility of the caller to eventually deallocate the allocated
+** Fts3Expr structure (if any) by passing it to sqlite3_free().
+**
+** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation
+** fails.
+*/
+static int getNextToken(
+ ParseContext *pParse, /* fts3 query parse context */
+ int iCol, /* Value for Fts3Phrase.iColumn */
+ const char *z, int n, /* Input string */
+ Fts3Expr **ppExpr, /* OUT: expression */
+ int *pnConsumed /* OUT: Number of bytes consumed */
+){
+ sqlite3_tokenizer *pTokenizer = pParse->pTokenizer;
+ sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
+ int rc;
+ sqlite3_tokenizer_cursor *pCursor;
+ Fts3Expr *pRet = 0;
+ int nConsumed = 0;
+
+ rc = pModule->xOpen(pTokenizer, z, n, &pCursor);
+ if( rc==SQLITE_OK ){
+ const char *zToken;
+ int nToken, iStart, iEnd, iPosition;
+ int nByte; /* total space to allocate */
+
+ pCursor->pTokenizer = pTokenizer;
+ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition);
+
+ if( rc==SQLITE_OK ){
+ nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken;
+ pRet = (Fts3Expr *)sqlite3_malloc(nByte);
+ if( !pRet ){
+ rc = SQLITE_NOMEM;
+ }else{
+ memset(pRet, 0, nByte);
+ pRet->eType = FTSQUERY_PHRASE;
+ pRet->pPhrase = (Fts3Phrase *)&pRet[1];
+ pRet->pPhrase->nToken = 1;
+ pRet->pPhrase->iColumn = iCol;
+ pRet->pPhrase->aToken[0].n = nToken;
+ pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1];
+ memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken);
+
+ if( iEnd<n && z[iEnd]=='*' ){
+ pRet->pPhrase->aToken[0].isPrefix = 1;
+ iEnd++;
+ }
+ if( !sqlite3_fts3_enable_parentheses && iStart>0 && z[iStart-1]=='-' ){
+ pRet->pPhrase->isNot = 1;
+ }
+ }
+ nConsumed = iEnd;
+ }
+
+ pModule->xClose(pCursor);
+ }
+
+ *pnConsumed = nConsumed;
+ *ppExpr = pRet;
+ return rc;
+}
+
+
+/*
+** Enlarge a memory allocation. If an out-of-memory allocation occurs,
+** then free the old allocation.
+*/
+void *fts3ReallocOrFree(void *pOrig, int nNew){
+ void *pRet = sqlite3_realloc(pOrig, nNew);
+ if( !pRet ){
+ sqlite3_free(pOrig);
+ }
+ return pRet;
+}
+
+/*
+** Buffer zInput, length nInput, contains the contents of a quoted string
+** that appeared as part of an fts3 query expression. Neither quote character
+** is included in the buffer. This function attempts to tokenize the entire
+** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE
+** containing the results.
+**
+** If successful, SQLITE_OK is returned and *ppExpr set to point at the
+** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory
+** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set
+** to 0.
+*/
+static int getNextString(
+ ParseContext *pParse, /* fts3 query parse context */
+ const char *zInput, int nInput, /* Input string */
+ Fts3Expr **ppExpr /* OUT: expression */
+){
+ sqlite3_tokenizer *pTokenizer = pParse->pTokenizer;
+ sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
+ int rc;
+ Fts3Expr *p = 0;
+ sqlite3_tokenizer_cursor *pCursor = 0;
+ char *zTemp = 0;
+ int nTemp = 0;
+
+ rc = pModule->xOpen(pTokenizer, zInput, nInput, &pCursor);
+ if( rc==SQLITE_OK ){
+ int ii;
+ pCursor->pTokenizer = pTokenizer;
+ for(ii=0; rc==SQLITE_OK; ii++){
+ const char *zToken;
+ int nToken, iBegin, iEnd, iPos;
+ rc = pModule->xNext(pCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos);
+ if( rc==SQLITE_OK ){
+ int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
+ p = fts3ReallocOrFree(p, nByte+ii*sizeof(struct PhraseToken));
+ zTemp = fts3ReallocOrFree(zTemp, nTemp + nToken);
+ if( !p || !zTemp ){
+ goto no_mem;
+ }
+ if( ii==0 ){
+ memset(p, 0, nByte);
+ p->pPhrase = (Fts3Phrase *)&p[1];
+ }
+ p->pPhrase = (Fts3Phrase *)&p[1];
+ p->pPhrase->nToken = ii+1;
+ p->pPhrase->aToken[ii].n = nToken;
+ memcpy(&zTemp[nTemp], zToken, nToken);
+ nTemp += nToken;
+ if( iEnd<nInput && zInput[iEnd]=='*' ){
+ p->pPhrase->aToken[ii].isPrefix = 1;
+ }else{
+ p->pPhrase->aToken[ii].isPrefix = 0;
+ }
+ }
+ }
+
+ pModule->xClose(pCursor);
+ pCursor = 0;
+ }
+
+ if( rc==SQLITE_DONE ){
+ int jj;
+ char *zNew;
+ int nNew = 0;
+ int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
+ nByte += (p?(p->pPhrase->nToken-1):0) * sizeof(struct PhraseToken);
+ p = fts3ReallocOrFree(p, nByte + nTemp);
+ if( !p ){
+ goto no_mem;
+ }
+ if( zTemp ){
+ zNew = &(((char *)p)[nByte]);
+ memcpy(zNew, zTemp, nTemp);
+ }else{
+ memset(p, 0, nByte+nTemp);
+ }
+ p->pPhrase = (Fts3Phrase *)&p[1];
+ for(jj=0; jj<p->pPhrase->nToken; jj++){
+ p->pPhrase->aToken[jj].z = &zNew[nNew];
+ nNew += p->pPhrase->aToken[jj].n;
+ }
+ sqlite3_free(zTemp);
+ p->eType = FTSQUERY_PHRASE;
+ p->pPhrase->iColumn = pParse->iDefaultCol;
+ rc = SQLITE_OK;
+ }
+
+ *ppExpr = p;
+ return rc;
+no_mem:
+
+ if( pCursor ){
+ pModule->xClose(pCursor);
+ }
+ sqlite3_free(zTemp);
+ sqlite3_free(p);
+ *ppExpr = 0;
+ return SQLITE_NOMEM;
+}
+
+/*
+** Function getNextNode(), which is called by fts3ExprParse(), may itself
+** call fts3ExprParse(). So this forward declaration is required.
+*/
+static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *);
+
+/*
+** The output variable *ppExpr is populated with an allocated Fts3Expr
+** structure, or set to 0 if the end of the input buffer is reached.
+**
+** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM
+** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered.
+** If SQLITE_ERROR is returned, pContext is populated with an error message.
+*/
+static int getNextNode(
+ ParseContext *pParse, /* fts3 query parse context */
+ const char *z, int n, /* Input string */
+ Fts3Expr **ppExpr, /* OUT: expression */
+ int *pnConsumed /* OUT: Number of bytes consumed */
+){
+ static const struct Fts3Keyword {
+ char z[4]; /* Keyword text */
+ unsigned char n; /* Length of the keyword */
+ unsigned char parenOnly; /* Only valid in paren mode */
+ unsigned char eType; /* Keyword code */
+ } aKeyword[] = {
+ { "OR" , 2, 0, FTSQUERY_OR },
+ { "AND", 3, 1, FTSQUERY_AND },
+ { "NOT", 3, 1, FTSQUERY_NOT },
+ { "NEAR", 4, 0, FTSQUERY_NEAR }
+ };
+ int ii;
+ int iCol;
+ int iColLen;
+ int rc;
+ Fts3Expr *pRet = 0;
+
+ const char *zInput = z;
+ int nInput = n;
+
+ /* Skip over any whitespace before checking for a keyword, an open or
+ ** close bracket, or a quoted string.
+ */
+ while( nInput>0 && fts3isspace(*zInput) ){
+ nInput--;
+ zInput++;
+ }
+ if( nInput==0 ){
+ return SQLITE_DONE;
+ }
+
+ /* See if we are dealing with a keyword. */
+ for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){
+ const struct Fts3Keyword *pKey = &aKeyword[ii];
+
+ if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){
+ continue;
+ }
+
+ if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){
+ int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM;
+ int nKey = pKey->n;
+ char cNext;
+
+ /* If this is a "NEAR" keyword, check for an explicit nearness. */
+ if( pKey->eType==FTSQUERY_NEAR ){
+ assert( nKey==4 );
+ if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){
+ nNear = 0;
+ for(nKey=5; zInput[nKey]>='0' && zInput[nKey]<='9'; nKey++){
+ nNear = nNear * 10 + (zInput[nKey] - '0');
+ }
+ }
+ }
+
+ /* At this point this is probably a keyword. But for that to be true,
+ ** the next byte must contain either whitespace, an open or close
+ ** parenthesis, a quote character, or EOF.
+ */
+ cNext = zInput[nKey];
+ if( fts3isspace(cNext)
+ || cNext=='"' || cNext=='(' || cNext==')' || cNext==0
+ ){
+ pRet = (Fts3Expr *)sqlite3_malloc(sizeof(Fts3Expr));
+ memset(pRet, 0, sizeof(Fts3Expr));
+ pRet->eType = pKey->eType;
+ pRet->nNear = nNear;
+ *ppExpr = pRet;
+ *pnConsumed = (zInput - z) + nKey;
+ return SQLITE_OK;
+ }
+
+ /* Turns out that wasn't a keyword after all. This happens if the
+ ** user has supplied a token such as "ORacle". Continue.
+ */
+ }
+ }
+
+ /* Check for an open bracket. */
+ if( sqlite3_fts3_enable_parentheses ){
+ if( *zInput=='(' ){
+ int nConsumed;
+ int rc;
+ pParse->nNest++;
+ rc = fts3ExprParse(pParse, &zInput[1], nInput-1, ppExpr, &nConsumed);
+ if( rc==SQLITE_OK && !*ppExpr ){
+ rc = SQLITE_DONE;
+ }
+ *pnConsumed = (zInput - z) + 1 + nConsumed;
+ return rc;
+ }
+
+ /* Check for a close bracket. */
+ if( *zInput==')' ){
+ pParse->nNest--;
+ *pnConsumed = (zInput - z) + 1;
+ return SQLITE_DONE;
+ }
+ }
+
+ /* See if we are dealing with a quoted phrase. If this is the case, then
+ ** search for the closing quote and pass the whole string to getNextString()
+ ** for processing. This is easy to do, as fts3 has no syntax for escaping
+ ** a quote character embedded in a string.
+ */
+ if( *zInput=='"' ){
+ for(ii=1; ii<nInput && zInput[ii]!='"'; ii++);
+ *pnConsumed = (zInput - z) + ii + 1;
+ if( ii==nInput ){
+ return SQLITE_ERROR;
+ }
+ return getNextString(pParse, &zInput[1], ii-1, ppExpr);
+ }
+
+
+ /* If control flows to this point, this must be a regular token, or
+ ** the end of the input. Read a regular token using the sqlite3_tokenizer
+ ** interface. Before doing so, figure out if there is an explicit
+ ** column specifier for the token.
+ **
+ ** TODO: Strangely, it is not possible to associate a column specifier
+ ** with a quoted phrase, only with a single token. Not sure if this was
+ ** an implementation artifact or an intentional decision when fts3 was
+ ** first implemented. Whichever it was, this module duplicates the
+ ** limitation.
+ */
+ iCol = pParse->iDefaultCol;
+ iColLen = 0;
+ for(ii=0; ii<pParse->nCol; ii++){
+ const char *zStr = pParse->azCol[ii];
+ int nStr = strlen(zStr);
+ if( nInput>nStr && zInput[nStr]==':'
+ && sqlite3_strnicmp(zStr, zInput, nStr)==0
+ ){
+ iCol = ii;
+ iColLen = ((zInput - z) + nStr + 1);
+ break;
+ }
+ }
+ rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed);
+ *pnConsumed += iColLen;
+ return rc;
+}
+
+/*
+** The argument is an Fts3Expr structure for a binary operator (any type
+** except an FTSQUERY_PHRASE). Return an integer value representing the
+** precedence of the operator. Lower values have a higher precedence (i.e.
+** group more tightly). For example, in the C language, the == operator
+** groups more tightly than ||, and would therefore have a higher precedence.
+**
+** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS
+** is defined), the order of the operators in precedence from highest to
+** lowest is:
+**
+** NEAR
+** NOT
+** AND (including implicit ANDs)
+** OR
+**
+** Note that when using the old query syntax, the OR operator has a higher
+** precedence than the AND operator.
+*/
+static int opPrecedence(Fts3Expr *p){
+ assert( p->eType!=FTSQUERY_PHRASE );
+ if( sqlite3_fts3_enable_parentheses ){
+ return p->eType;
+ }else if( p->eType==FTSQUERY_NEAR ){
+ return 1;
+ }else if( p->eType==FTSQUERY_OR ){
+ return 2;
+ }
+ assert( p->eType==FTSQUERY_AND );
+ return 3;
+}
+
+/*
+** Argument ppHead contains a pointer to the current head of a query
+** expression tree being parsed. pPrev is the expression node most recently
+** inserted into the tree. This function adds pNew, which is always a binary
+** operator node, into the expression tree based on the relative precedence
+** of pNew and the existing nodes of the tree. This may result in the head
+** of the tree changing, in which case *ppHead is set to the new root node.
+*/
+static void insertBinaryOperator(
+ Fts3Expr **ppHead, /* Pointer to the root node of a tree */
+ Fts3Expr *pPrev, /* Node most recently inserted into the tree */
+ Fts3Expr *pNew /* New binary node to insert into expression tree */
+){
+ Fts3Expr *pSplit = pPrev;
+ while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){
+ pSplit = pSplit->pParent;
+ }
+
+ if( pSplit->pParent ){
+ assert( pSplit->pParent->pRight==pSplit );
+ pSplit->pParent->pRight = pNew;
+ pNew->pParent = pSplit->pParent;
+ }else{
+ *ppHead = pNew;
+ }
+ pNew->pLeft = pSplit;
+ pSplit->pParent = pNew;
+}
+
+/*
+** Parse the fts3 query expression found in buffer z, length n. This function
+** returns either when the end of the buffer is reached or an unmatched
+** closing bracket - ')' - is encountered.
+**
+** If successful, SQLITE_OK is returned, *ppExpr is set to point to the
+** parsed form of the expression and *pnConsumed is set to the number of
+** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM
+** (out of memory error) or SQLITE_ERROR (parse error) is returned.
+*/
+static int fts3ExprParse(
+ ParseContext *pParse, /* fts3 query parse context */
+ const char *z, int n, /* Text of MATCH query */
+ Fts3Expr **ppExpr, /* OUT: Parsed query structure */
+ int *pnConsumed /* OUT: Number of bytes consumed */
+){
+ Fts3Expr *pRet = 0;
+ Fts3Expr *pPrev = 0;
+ Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */
+ int nIn = n;
+ const char *zIn = z;
+ int rc = SQLITE_OK;
+ int isRequirePhrase = 1;
+
+ while( rc==SQLITE_OK ){
+ Fts3Expr *p = 0;
+ int nByte = 0;
+ rc = getNextNode(pParse, zIn, nIn, &p, &nByte);
+ if( rc==SQLITE_OK ){
+ int isPhrase;
+
+ if( !sqlite3_fts3_enable_parentheses
+ && p->eType==FTSQUERY_PHRASE && p->pPhrase->isNot
+ ){
+ /* Create an implicit NOT operator. */
+ Fts3Expr *pNot = sqlite3_malloc(sizeof(Fts3Expr));
+ if( !pNot ){
+ sqlite3Fts3ExprFree(p);
+ rc = SQLITE_NOMEM;
+ goto exprparse_out;
+ }
+ memset(pNot, 0, sizeof(Fts3Expr));
+ pNot->eType = FTSQUERY_NOT;
+ pNot->pRight = p;
+ if( pNotBranch ){
+ pNot->pLeft = pNotBranch;
+ }
+ pNotBranch = pNot;
+ p = pPrev;
+ }else{
+ int eType = p->eType;
+ assert( eType!=FTSQUERY_PHRASE || !p->pPhrase->isNot );
+ isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft);
+
+ /* The isRequirePhrase variable is set to true if a phrase or
+ ** an expression contained in parenthesis is required. If a
+ ** binary operator (AND, OR, NOT or NEAR) is encounted when
+ ** isRequirePhrase is set, this is a syntax error.
+ */
+ if( !isPhrase && isRequirePhrase ){
+ sqlite3Fts3ExprFree(p);
+ rc = SQLITE_ERROR;
+ goto exprparse_out;
+ }
+
+ if( isPhrase && !isRequirePhrase ){
+ /* Insert an implicit AND operator. */
+ Fts3Expr *pAnd;
+ assert( pRet && pPrev );
+ pAnd = sqlite3_malloc(sizeof(Fts3Expr));
+ if( !pAnd ){
+ sqlite3Fts3ExprFree(p);
+ rc = SQLITE_NOMEM;
+ goto exprparse_out;
+ }
+ memset(pAnd, 0, sizeof(Fts3Expr));
+ pAnd->eType = FTSQUERY_AND;
+ insertBinaryOperator(&pRet, pPrev, pAnd);
+ pPrev = pAnd;
+ }
+
+ /* This test catches attempts to make either operand of a NEAR
+ ** operator something other than a phrase. For example, either of
+ ** the following:
+ **
+ ** (bracketed expression) NEAR phrase
+ ** phrase NEAR (bracketed expression)
+ **
+ ** Return an error in either case.
+ */
+ if( pPrev && (
+ (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE)
+ || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR)
+ )){
+ sqlite3Fts3ExprFree(p);
+ rc = SQLITE_ERROR;
+ goto exprparse_out;
+ }
+
+ if( isPhrase ){
+ if( pRet ){
+ assert( pPrev && pPrev->pLeft && pPrev->pRight==0 );
+ pPrev->pRight = p;
+ p->pParent = pPrev;
+ }else{
+ pRet = p;
+ }
+ }else{
+ insertBinaryOperator(&pRet, pPrev, p);
+ }
+ isRequirePhrase = !isPhrase;
+ }
+ assert( nByte>0 );
+ }
+ assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) );
+ nIn -= nByte;
+ zIn += nByte;
+ pPrev = p;
+ }
+
+ if( rc==SQLITE_DONE && pRet && isRequirePhrase ){
+ rc = SQLITE_ERROR;
+ }
+
+ if( rc==SQLITE_DONE ){
+ rc = SQLITE_OK;
+ if( !sqlite3_fts3_enable_parentheses && pNotBranch ){
+ if( !pRet ){
+ rc = SQLITE_ERROR;
+ }else{
+ Fts3Expr *pIter = pNotBranch;
+ while( pIter->pLeft ){
+ pIter = pIter->pLeft;
+ }
+ pIter->pLeft = pRet;
+ pRet = pNotBranch;
+ }
+ }
+ }
+ *pnConsumed = n - nIn;
+
+exprparse_out:
+ if( rc!=SQLITE_OK ){
+ sqlite3Fts3ExprFree(pRet);
+ sqlite3Fts3ExprFree(pNotBranch);
+ pRet = 0;
+ }
+ *ppExpr = pRet;
+ return rc;
+}
+
+/*
+** Parameters z and n contain a pointer to and length of a buffer containing
+** an fts3 query expression, respectively. This function attempts to parse the
+** query expression and create a tree of Fts3Expr structures representing the
+** parsed expression. If successful, *ppExpr is set to point to the head
+** of the parsed expression tree and SQLITE_OK is returned. If an error
+** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse
+** error) is returned and *ppExpr is set to 0.
+**
+** If parameter n is a negative number, then z is assumed to point to a
+** nul-terminated string and the length is determined using strlen().
+**
+** The first parameter, pTokenizer, is passed the fts3 tokenizer module to
+** use to normalize query tokens while parsing the expression. The azCol[]
+** array, which is assumed to contain nCol entries, should contain the names
+** of each column in the target fts3 table, in order from left to right.
+** Column names must be nul-terminated strings.
+**
+** The iDefaultCol parameter should be passed the index of the table column
+** that appears on the left-hand-side of the MATCH operator (the default
+** column to match against for tokens for which a column name is not explicitly
+** specified as part of the query string), or -1 if tokens may by default
+** match any table column.
+*/
+SQLITE_PRIVATE int sqlite3Fts3ExprParse(
+ sqlite3_tokenizer *pTokenizer, /* Tokenizer module */
+ char **azCol, /* Array of column names for fts3 table */
+ int nCol, /* Number of entries in azCol[] */
+ int iDefaultCol, /* Default column to query */
+ const char *z, int n, /* Text of MATCH query */
+ Fts3Expr **ppExpr /* OUT: Parsed query structure */
+){
+ int nParsed;
+ int rc;
+ ParseContext sParse;
+ sParse.pTokenizer = pTokenizer;
+ sParse.azCol = (const char **)azCol;
+ sParse.nCol = nCol;
+ sParse.iDefaultCol = iDefaultCol;
+ sParse.nNest = 0;
+ if( z==0 ){
+ *ppExpr = 0;
+ return SQLITE_OK;
+ }
+ if( n<0 ){
+ n = strlen(z);
+ }
+ rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed);
+
+ /* Check for mismatched parenthesis */
+ if( rc==SQLITE_OK && sParse.nNest ){
+ rc = SQLITE_ERROR;
+ sqlite3Fts3ExprFree(*ppExpr);
+ *ppExpr = 0;
+ }
+
+ return rc;
+}
+
+/*
+** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse().
+*/
+SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *p){
+ if( p ){
+ sqlite3Fts3ExprFree(p->pLeft);
+ sqlite3Fts3ExprFree(p->pRight);
+ sqlite3_free(p);
+ }
+}
+
+/****************************************************************************
+*****************************************************************************
+** Everything after this point is just test code.
+*/
+
+#ifdef SQLITE_TEST
+
+
+/*
+** Function to query the hash-table of tokenizers (see README.tokenizers).
+*/
+static int queryTestTokenizer(
+ sqlite3 *db,
+ const char *zName,
+ const sqlite3_tokenizer_module **pp
+){
+ int rc;
+ sqlite3_stmt *pStmt;
+ const char zSql[] = "SELECT fts3_tokenizer(?)";
+
+ *pp = 0;
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
+ if( SQLITE_ROW==sqlite3_step(pStmt) ){
+ if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
+ memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
+ }
+ }
+
+ return sqlite3_finalize(pStmt);
+}
+
+/*
+** This function is part of the test interface for the query parser. It
+** writes a text representation of the query expression pExpr into the
+** buffer pointed to by argument zBuf. It is assumed that zBuf is large
+** enough to store the required text representation.
+*/
+static void exprToString(Fts3Expr *pExpr, char *zBuf){
+ switch( pExpr->eType ){
+ case FTSQUERY_PHRASE: {
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
+ int i;
+ zBuf += sprintf(zBuf, "PHRASE %d %d", pPhrase->iColumn, pPhrase->isNot);
+ for(i=0; i<pPhrase->nToken; i++){
+ zBuf += sprintf(zBuf," %.*s",pPhrase->aToken[i].n,pPhrase->aToken[i].z);
+ zBuf += sprintf(zBuf,"%s", (pPhrase->aToken[i].isPrefix?"+":""));
+ }
+ return;
+ }
+
+ case FTSQUERY_NEAR:
+ zBuf += sprintf(zBuf, "NEAR/%d ", pExpr->nNear);
+ break;
+ case FTSQUERY_NOT:
+ zBuf += sprintf(zBuf, "NOT ");
+ break;
+ case FTSQUERY_AND:
+ zBuf += sprintf(zBuf, "AND ");
+ break;
+ case FTSQUERY_OR:
+ zBuf += sprintf(zBuf, "OR ");
+ break;
+ }
+
+ zBuf += sprintf(zBuf, "{");
+ exprToString(pExpr->pLeft, zBuf);
+ zBuf += strlen(zBuf);
+ zBuf += sprintf(zBuf, "} ");
+
+ zBuf += sprintf(zBuf, "{");
+ exprToString(pExpr->pRight, zBuf);
+ zBuf += strlen(zBuf);
+ zBuf += sprintf(zBuf, "}");
+}
+
+/*
+** This is the implementation of a scalar SQL function used to test the
+** expression parser. It should be called as follows:
+**
+** fts3_exprtest(<tokenizer>, <expr>, <column 1>, ...);
+**
+** The first argument, <tokenizer>, is the name of the fts3 tokenizer used
+** to parse the query expression (see README.tokenizers). The second argument
+** is the query expression to parse. Each subsequent argument is the name
+** of a column of the fts3 table that the query expression may refer to.
+** For example:
+**
+** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2');
+*/
+static void fts3ExprTest(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ sqlite3_tokenizer_module const *pModule = 0;
+ sqlite3_tokenizer *pTokenizer = 0;
+ int rc;
+ char **azCol = 0;
+ const char *zExpr;
+ int nExpr;
+ int nCol;
+ int ii;
+ Fts3Expr *pExpr;
+ sqlite3 *db = sqlite3_context_db_handle(context);
+
+ if( argc<3 ){
+ sqlite3_result_error(context,
+ "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1
+ );
+ return;
+ }
+
+ rc = queryTestTokenizer(db,
+ (const char *)sqlite3_value_text(argv[0]), &pModule);
+ if( rc==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ goto exprtest_out;
+ }else if( !pModule ){
+ sqlite3_result_error(context, "No such tokenizer module", -1);
+ goto exprtest_out;
+ }
+
+ rc = pModule->xCreate(0, 0, &pTokenizer);
+ assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
+ if( rc==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ goto exprtest_out;
+ }
+ pTokenizer->pModule = pModule;
+
+ zExpr = (const char *)sqlite3_value_text(argv[1]);
+ nExpr = sqlite3_value_bytes(argv[1]);
+ nCol = argc-2;
+ azCol = (char **)sqlite3_malloc(nCol*sizeof(char *));
+ if( !azCol ){
+ sqlite3_result_error_nomem(context);
+ goto exprtest_out;
+ }
+ for(ii=0; ii<nCol; ii++){
+ azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]);
+ }
+
+ rc = sqlite3Fts3ExprParse(
+ pTokenizer, azCol, nCol, nCol, zExpr, nExpr, &pExpr
+ );
+ if( rc==SQLITE_NOMEM ){
+ sqlite3_result_error_nomem(context);
+ goto exprtest_out;
+ }else if( rc==SQLITE_OK ){
+ char zBuf[4096];
+ exprToString(pExpr, zBuf);
+ sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
+ sqlite3Fts3ExprFree(pExpr);
+ }else{
+ sqlite3_result_error(context, "Error parsing expression", -1);
+ }
+
+exprtest_out:
+ if( pModule && pTokenizer ){
+ rc = pModule->xDestroy(pTokenizer);
+ }
+ sqlite3_free(azCol);
+}
+
+/*
+** Register the query expression parser test function fts3_exprtest()
+** with database connection db.
+*/
+SQLITE_PRIVATE void sqlite3Fts3ExprInitTestInterface(sqlite3* db){
+ sqlite3_create_function(
+ db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0
+ );
+}
+
+#endif
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
+
+/************** End of fts3_expr.c *******************************************/
/************** Begin file fts3_hash.c ***************************************/
/*
** 2001 September 22
@@ -85764,6 +105752,13 @@ SQLITE_PRIVATE void *sqlite3Fts3HashInsert(
return old_data;
}
if( data==0 ) return 0;
+ if( pH->htsize==0 ){
+ fts3Rehash(pH,8);
+ if( pH->htsize==0 ){
+ pH->count = 0;
+ return data;
+ }
+ }
new_elem = (fts3HashElem*)fts3HashMalloc( sizeof(fts3HashElem) );
if( new_elem==0 ) return data;
if( pH->copyKey && pKey!=0 ){
@@ -85778,14 +105773,6 @@ SQLITE_PRIVATE void *sqlite3Fts3HashInsert(
}
new_elem->nKey = nKey;
pH->count++;
- if( pH->htsize==0 ){
- fts3Rehash(pH,8);
- if( pH->htsize==0 ){
- pH->count = 0;
- fts3HashFree(new_elem);
- return data;
- }
- }
if( pH->count > pH->htsize ){
fts3Rehash(pH,pH->htsize*2);
}
@@ -87034,3 +107021,3623 @@ SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
/************** End of fts3_tokenizer1.c *************************************/
+/************** Begin file rtree.c *******************************************/
+/*
+** 2001 September 15
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains code for implementations of the r-tree and r*-tree
+** algorithms packaged as an SQLite virtual table module.
+**
+** $Id: rtree.c,v 1.14 2009/08/06 18:36:47 danielk1977 Exp $
+*/
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
+
+/*
+** This file contains an implementation of a couple of different variants
+** of the r-tree algorithm. See the README file for further details. The
+** same data-structure is used for all, but the algorithms for insert and
+** delete operations vary. The variants used are selected at compile time
+** by defining the following symbols:
+*/
+
+/* Either, both or none of the following may be set to activate
+** r*tree variant algorithms.
+*/
+#define VARIANT_RSTARTREE_CHOOSESUBTREE 0
+#define VARIANT_RSTARTREE_REINSERT 1
+
+/*
+** Exactly one of the following must be set to 1.
+*/
+#define VARIANT_GUTTMAN_QUADRATIC_SPLIT 0
+#define VARIANT_GUTTMAN_LINEAR_SPLIT 0
+#define VARIANT_RSTARTREE_SPLIT 1
+
+#define VARIANT_GUTTMAN_SPLIT \
+ (VARIANT_GUTTMAN_LINEAR_SPLIT||VARIANT_GUTTMAN_QUADRATIC_SPLIT)
+
+#if VARIANT_GUTTMAN_QUADRATIC_SPLIT
+ #define PickNext QuadraticPickNext
+ #define PickSeeds QuadraticPickSeeds
+ #define AssignCells splitNodeGuttman
+#endif
+#if VARIANT_GUTTMAN_LINEAR_SPLIT
+ #define PickNext LinearPickNext
+ #define PickSeeds LinearPickSeeds
+ #define AssignCells splitNodeGuttman
+#endif
+#if VARIANT_RSTARTREE_SPLIT
+ #define AssignCells splitNodeStartree
+#endif
+
+
+#ifndef SQLITE_CORE
+ SQLITE_EXTENSION_INIT1
+#else
+#endif
+
+
+#ifndef SQLITE_AMALGAMATION
+typedef sqlite3_int64 i64;
+typedef unsigned char u8;
+typedef unsigned int u32;
+#endif
+
+typedef struct Rtree Rtree;
+typedef struct RtreeCursor RtreeCursor;
+typedef struct RtreeNode RtreeNode;
+typedef struct RtreeCell RtreeCell;
+typedef struct RtreeConstraint RtreeConstraint;
+typedef union RtreeCoord RtreeCoord;
+
+/* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
+#define RTREE_MAX_DIMENSIONS 5
+
+/* Size of hash table Rtree.aHash. This hash table is not expected to
+** ever contain very many entries, so a fixed number of buckets is
+** used.
+*/
+#define HASHSIZE 128
+
+/*
+** An rtree virtual-table object.
+*/
+struct Rtree {
+ sqlite3_vtab base;
+ sqlite3 *db; /* Host database connection */
+ int iNodeSize; /* Size in bytes of each node in the node table */
+ int nDim; /* Number of dimensions */
+ int nBytesPerCell; /* Bytes consumed per cell */
+ int iDepth; /* Current depth of the r-tree structure */
+ char *zDb; /* Name of database containing r-tree table */
+ char *zName; /* Name of r-tree table */
+ RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
+ int nBusy; /* Current number of users of this structure */
+
+ /* List of nodes removed during a CondenseTree operation. List is
+ ** linked together via the pointer normally used for hash chains -
+ ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree
+ ** headed by the node (leaf nodes have RtreeNode.iNode==0).
+ */
+ RtreeNode *pDeleted;
+ int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */
+
+ /* Statements to read/write/delete a record from xxx_node */
+ sqlite3_stmt *pReadNode;
+ sqlite3_stmt *pWriteNode;
+ sqlite3_stmt *pDeleteNode;
+
+ /* Statements to read/write/delete a record from xxx_rowid */
+ sqlite3_stmt *pReadRowid;
+ sqlite3_stmt *pWriteRowid;
+ sqlite3_stmt *pDeleteRowid;
+
+ /* Statements to read/write/delete a record from xxx_parent */
+ sqlite3_stmt *pReadParent;
+ sqlite3_stmt *pWriteParent;
+ sqlite3_stmt *pDeleteParent;
+
+ int eCoordType;
+};
+
+/* Possible values for eCoordType: */
+#define RTREE_COORD_REAL32 0
+#define RTREE_COORD_INT32 1
+
+/*
+** The minimum number of cells allowed for a node is a third of the
+** maximum. In Gutman's notation:
+**
+** m = M/3
+**
+** If an R*-tree "Reinsert" operation is required, the same number of
+** cells are removed from the overfull node and reinserted into the tree.
+*/
+#define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3)
+#define RTREE_REINSERT(p) RTREE_MINCELLS(p)
+#define RTREE_MAXCELLS 51
+
+/*
+** An rtree cursor object.
+*/
+struct RtreeCursor {
+ sqlite3_vtab_cursor base;
+ RtreeNode *pNode; /* Node cursor is currently pointing at */
+ int iCell; /* Index of current cell in pNode */
+ int iStrategy; /* Copy of idxNum search parameter */
+ int nConstraint; /* Number of entries in aConstraint */
+ RtreeConstraint *aConstraint; /* Search constraints. */
+};
+
+union RtreeCoord {
+ float f;
+ int i;
+};
+
+/*
+** The argument is an RtreeCoord. Return the value stored within the RtreeCoord
+** formatted as a double. This macro assumes that local variable pRtree points
+** to the Rtree structure associated with the RtreeCoord.
+*/
+#define DCOORD(coord) ( \
+ (pRtree->eCoordType==RTREE_COORD_REAL32) ? \
+ ((double)coord.f) : \
+ ((double)coord.i) \
+)
+
+/*
+** A search constraint.
+*/
+struct RtreeConstraint {
+ int iCoord; /* Index of constrained coordinate */
+ int op; /* Constraining operation */
+ double rValue; /* Constraint value. */
+};
+
+/* Possible values for RtreeConstraint.op */
+#define RTREE_EQ 0x41
+#define RTREE_LE 0x42
+#define RTREE_LT 0x43
+#define RTREE_GE 0x44
+#define RTREE_GT 0x45
+
+/*
+** An rtree structure node.
+**
+** Data format (RtreeNode.zData):
+**
+** 1. If the node is the root node (node 1), then the first 2 bytes
+** of the node contain the tree depth as a big-endian integer.
+** For non-root nodes, the first 2 bytes are left unused.
+**
+** 2. The next 2 bytes contain the number of entries currently
+** stored in the node.
+**
+** 3. The remainder of the node contains the node entries. Each entry
+** consists of a single 8-byte integer followed by an even number
+** of 4-byte coordinates. For leaf nodes the integer is the rowid
+** of a record. For internal nodes it is the node number of a
+** child page.
+*/
+struct RtreeNode {
+ RtreeNode *pParent; /* Parent node */
+ i64 iNode;
+ int nRef;
+ int isDirty;
+ u8 *zData;
+ RtreeNode *pNext; /* Next node in this hash chain */
+};
+#define NCELL(pNode) readInt16(&(pNode)->zData[2])
+
+/*
+** Structure to store a deserialized rtree record.
+*/
+struct RtreeCell {
+ i64 iRowid;
+ RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2];
+};
+
+#ifndef MAX
+# define MAX(x,y) ((x) < (y) ? (y) : (x))
+#endif
+#ifndef MIN
+# define MIN(x,y) ((x) > (y) ? (y) : (x))
+#endif
+
+/*
+** Functions to deserialize a 16 bit integer, 32 bit real number and
+** 64 bit integer. The deserialized value is returned.
+*/
+static int readInt16(u8 *p){
+ return (p[0]<<8) + p[1];
+}
+static void readCoord(u8 *p, RtreeCoord *pCoord){
+ u32 i = (
+ (((u32)p[0]) << 24) +
+ (((u32)p[1]) << 16) +
+ (((u32)p[2]) << 8) +
+ (((u32)p[3]) << 0)
+ );
+ *(u32 *)pCoord = i;
+}
+static i64 readInt64(u8 *p){
+ return (
+ (((i64)p[0]) << 56) +
+ (((i64)p[1]) << 48) +
+ (((i64)p[2]) << 40) +
+ (((i64)p[3]) << 32) +
+ (((i64)p[4]) << 24) +
+ (((i64)p[5]) << 16) +
+ (((i64)p[6]) << 8) +
+ (((i64)p[7]) << 0)
+ );
+}
+
+/*
+** Functions to serialize a 16 bit integer, 32 bit real number and
+** 64 bit integer. The value returned is the number of bytes written
+** to the argument buffer (always 2, 4 and 8 respectively).
+*/
+static int writeInt16(u8 *p, int i){
+ p[0] = (i>> 8)&0xFF;
+ p[1] = (i>> 0)&0xFF;
+ return 2;
+}
+static int writeCoord(u8 *p, RtreeCoord *pCoord){
+ u32 i;
+ assert( sizeof(RtreeCoord)==4 );
+ assert( sizeof(u32)==4 );
+ i = *(u32 *)pCoord;
+ p[0] = (i>>24)&0xFF;
+ p[1] = (i>>16)&0xFF;
+ p[2] = (i>> 8)&0xFF;
+ p[3] = (i>> 0)&0xFF;
+ return 4;
+}
+static int writeInt64(u8 *p, i64 i){
+ p[0] = (i>>56)&0xFF;
+ p[1] = (i>>48)&0xFF;
+ p[2] = (i>>40)&0xFF;
+ p[3] = (i>>32)&0xFF;
+ p[4] = (i>>24)&0xFF;
+ p[5] = (i>>16)&0xFF;
+ p[6] = (i>> 8)&0xFF;
+ p[7] = (i>> 0)&0xFF;
+ return 8;
+}
+
+/*
+** Increment the reference count of node p.
+*/
+static void nodeReference(RtreeNode *p){
+ if( p ){
+ p->nRef++;
+ }
+}
+
+/*
+** Clear the content of node p (set all bytes to 0x00).
+*/
+static void nodeZero(Rtree *pRtree, RtreeNode *p){
+ if( p ){
+ memset(&p->zData[2], 0, pRtree->iNodeSize-2);
+ p->isDirty = 1;
+ }
+}
+
+/*
+** Given a node number iNode, return the corresponding key to use
+** in the Rtree.aHash table.
+*/
+static int nodeHash(i64 iNode){
+ return (
+ (iNode>>56) ^ (iNode>>48) ^ (iNode>>40) ^ (iNode>>32) ^
+ (iNode>>24) ^ (iNode>>16) ^ (iNode>> 8) ^ (iNode>> 0)
+ ) % HASHSIZE;
+}
+
+/*
+** Search the node hash table for node iNode. If found, return a pointer
+** to it. Otherwise, return 0.
+*/
+static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){
+ RtreeNode *p;
+ assert( iNode!=0 );
+ for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext);
+ return p;
+}
+
+/*
+** Add node pNode to the node hash table.
+*/
+static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){
+ if( pNode ){
+ int iHash;
+ assert( pNode->pNext==0 );
+ iHash = nodeHash(pNode->iNode);
+ pNode->pNext = pRtree->aHash[iHash];
+ pRtree->aHash[iHash] = pNode;
+ }
+}
+
+/*
+** Remove node pNode from the node hash table.
+*/
+static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){
+ RtreeNode **pp;
+ if( pNode->iNode!=0 ){
+ pp = &pRtree->aHash[nodeHash(pNode->iNode)];
+ for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); }
+ *pp = pNode->pNext;
+ pNode->pNext = 0;
+ }
+}
+
+/*
+** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0),
+** indicating that node has not yet been assigned a node number. It is
+** assigned a node number when nodeWrite() is called to write the
+** node contents out to the database.
+*/
+static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent, int zero){
+ RtreeNode *pNode;
+ pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize);
+ if( pNode ){
+ memset(pNode, 0, sizeof(RtreeNode) + (zero?pRtree->iNodeSize:0));
+ pNode->zData = (u8 *)&pNode[1];
+ pNode->nRef = 1;
+ pNode->pParent = pParent;
+ pNode->isDirty = 1;
+ nodeReference(pParent);
+ }
+ return pNode;
+}
+
+/*
+** Obtain a reference to an r-tree node.
+*/
+static int
+nodeAcquire(
+ Rtree *pRtree, /* R-tree structure */
+ i64 iNode, /* Node number to load */
+ RtreeNode *pParent, /* Either the parent node or NULL */
+ RtreeNode **ppNode /* OUT: Acquired node */
+){
+ int rc;
+ RtreeNode *pNode;
+
+ /* Check if the requested node is already in the hash table. If so,
+ ** increase its reference count and return it.
+ */
+ if( (pNode = nodeHashLookup(pRtree, iNode)) ){
+ assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
+ if( pParent && !pNode->pParent ){
+ nodeReference(pParent);
+ pNode->pParent = pParent;
+ }
+ pNode->nRef++;
+ *ppNode = pNode;
+ return SQLITE_OK;
+ }
+
+ pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize);
+ if( !pNode ){
+ *ppNode = 0;
+ return SQLITE_NOMEM;
+ }
+ pNode->pParent = pParent;
+ pNode->zData = (u8 *)&pNode[1];
+ pNode->nRef = 1;
+ pNode->iNode = iNode;
+ pNode->isDirty = 0;
+ pNode->pNext = 0;
+
+ sqlite3_bind_int64(pRtree->pReadNode, 1, iNode);
+ rc = sqlite3_step(pRtree->pReadNode);
+ if( rc==SQLITE_ROW ){
+ const u8 *zBlob = sqlite3_column_blob(pRtree->pReadNode, 0);
+ memcpy(pNode->zData, zBlob, pRtree->iNodeSize);
+ nodeReference(pParent);
+ }else{
+ sqlite3_free(pNode);
+ pNode = 0;
+ }
+
+ *ppNode = pNode;
+ rc = sqlite3_reset(pRtree->pReadNode);
+
+ if( rc==SQLITE_OK && iNode==1 ){
+ pRtree->iDepth = readInt16(pNode->zData);
+ }
+
+ assert( (rc==SQLITE_OK && pNode) || (pNode==0 && rc!=SQLITE_OK) );
+ nodeHashInsert(pRtree, pNode);
+
+ return rc;
+}
+
+/*
+** Overwrite cell iCell of node pNode with the contents of pCell.
+*/
+static void nodeOverwriteCell(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ RtreeCell *pCell,
+ int iCell
+){
+ int ii;
+ u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
+ p += writeInt64(p, pCell->iRowid);
+ for(ii=0; ii<(pRtree->nDim*2); ii++){
+ p += writeCoord(p, &pCell->aCoord[ii]);
+ }
+ pNode->isDirty = 1;
+}
+
+/*
+** Remove cell the cell with index iCell from node pNode.
+*/
+static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){
+ u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
+ u8 *pSrc = &pDst[pRtree->nBytesPerCell];
+ int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell;
+ memmove(pDst, pSrc, nByte);
+ writeInt16(&pNode->zData[2], NCELL(pNode)-1);
+ pNode->isDirty = 1;
+}
+
+/*
+** Insert the contents of cell pCell into node pNode. If the insert
+** is successful, return SQLITE_OK.
+**
+** If there is not enough free space in pNode, return SQLITE_FULL.
+*/
+static int
+nodeInsertCell(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ RtreeCell *pCell
+){
+ int nCell; /* Current number of cells in pNode */
+ int nMaxCell; /* Maximum number of cells for pNode */
+
+ nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell;
+ nCell = NCELL(pNode);
+
+ assert(nCell<=nMaxCell);
+
+ if( nCell<nMaxCell ){
+ nodeOverwriteCell(pRtree, pNode, pCell, nCell);
+ writeInt16(&pNode->zData[2], nCell+1);
+ pNode->isDirty = 1;
+ }
+
+ return (nCell==nMaxCell);
+}
+
+/*
+** If the node is dirty, write it out to the database.
+*/
+static int
+nodeWrite(Rtree *pRtree, RtreeNode *pNode){
+ int rc = SQLITE_OK;
+ if( pNode->isDirty ){
+ sqlite3_stmt *p = pRtree->pWriteNode;
+ if( pNode->iNode ){
+ sqlite3_bind_int64(p, 1, pNode->iNode);
+ }else{
+ sqlite3_bind_null(p, 1);
+ }
+ sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC);
+ sqlite3_step(p);
+ pNode->isDirty = 0;
+ rc = sqlite3_reset(p);
+ if( pNode->iNode==0 && rc==SQLITE_OK ){
+ pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
+ nodeHashInsert(pRtree, pNode);
+ }
+ }
+ return rc;
+}
+
+/*
+** Release a reference to a node. If the node is dirty and the reference
+** count drops to zero, the node data is written to the database.
+*/
+static int
+nodeRelease(Rtree *pRtree, RtreeNode *pNode){
+ int rc = SQLITE_OK;
+ if( pNode ){
+ assert( pNode->nRef>0 );
+ pNode->nRef--;
+ if( pNode->nRef==0 ){
+ if( pNode->iNode==1 ){
+ pRtree->iDepth = -1;
+ }
+ if( pNode->pParent ){
+ rc = nodeRelease(pRtree, pNode->pParent);
+ }
+ if( rc==SQLITE_OK ){
+ rc = nodeWrite(pRtree, pNode);
+ }
+ nodeHashDelete(pRtree, pNode);
+ sqlite3_free(pNode);
+ }
+ }
+ return rc;
+}
+
+/*
+** Return the 64-bit integer value associated with cell iCell of
+** node pNode. If pNode is a leaf node, this is a rowid. If it is
+** an internal node, then the 64-bit integer is a child page number.
+*/
+static i64 nodeGetRowid(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ int iCell
+){
+ assert( iCell<NCELL(pNode) );
+ return readInt64(&pNode->zData[4 + pRtree->nBytesPerCell*iCell]);
+}
+
+/*
+** Return coordinate iCoord from cell iCell in node pNode.
+*/
+static void nodeGetCoord(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ int iCell,
+ int iCoord,
+ RtreeCoord *pCoord /* Space to write result to */
+){
+ readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord);
+}
+
+/*
+** Deserialize cell iCell of node pNode. Populate the structure pointed
+** to by pCell with the results.
+*/
+static void nodeGetCell(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ int iCell,
+ RtreeCell *pCell
+){
+ int ii;
+ pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell);
+ for(ii=0; ii<pRtree->nDim*2; ii++){
+ nodeGetCoord(pRtree, pNode, iCell, ii, &pCell->aCoord[ii]);
+ }
+}
+
+
+/* Forward declaration for the function that does the work of
+** the virtual table module xCreate() and xConnect() methods.
+*/
+static int rtreeInit(
+ sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int
+);
+
+/*
+** Rtree virtual table module xCreate method.
+*/
+static int rtreeCreate(
+ sqlite3 *db,
+ void *pAux,
+ int argc, const char *const*argv,
+ sqlite3_vtab **ppVtab,
+ char **pzErr
+){
+ return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1);
+}
+
+/*
+** Rtree virtual table module xConnect method.
+*/
+static int rtreeConnect(
+ sqlite3 *db,
+ void *pAux,
+ int argc, const char *const*argv,
+ sqlite3_vtab **ppVtab,
+ char **pzErr
+){
+ return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0);
+}
+
+/*
+** Increment the r-tree reference count.
+*/
+static void rtreeReference(Rtree *pRtree){
+ pRtree->nBusy++;
+}
+
+/*
+** Decrement the r-tree reference count. When the reference count reaches
+** zero the structure is deleted.
+*/
+static void rtreeRelease(Rtree *pRtree){
+ pRtree->nBusy--;
+ if( pRtree->nBusy==0 ){
+ sqlite3_finalize(pRtree->pReadNode);
+ sqlite3_finalize(pRtree->pWriteNode);
+ sqlite3_finalize(pRtree->pDeleteNode);
+ sqlite3_finalize(pRtree->pReadRowid);
+ sqlite3_finalize(pRtree->pWriteRowid);
+ sqlite3_finalize(pRtree->pDeleteRowid);
+ sqlite3_finalize(pRtree->pReadParent);
+ sqlite3_finalize(pRtree->pWriteParent);
+ sqlite3_finalize(pRtree->pDeleteParent);
+ sqlite3_free(pRtree);
+ }
+}
+
+/*
+** Rtree virtual table module xDisconnect method.
+*/
+static int rtreeDisconnect(sqlite3_vtab *pVtab){
+ rtreeRelease((Rtree *)pVtab);
+ return SQLITE_OK;
+}
+
+/*
+** Rtree virtual table module xDestroy method.
+*/
+static int rtreeDestroy(sqlite3_vtab *pVtab){
+ Rtree *pRtree = (Rtree *)pVtab;
+ int rc;
+ char *zCreate = sqlite3_mprintf(
+ "DROP TABLE '%q'.'%q_node';"
+ "DROP TABLE '%q'.'%q_rowid';"
+ "DROP TABLE '%q'.'%q_parent';",
+ pRtree->zDb, pRtree->zName,
+ pRtree->zDb, pRtree->zName,
+ pRtree->zDb, pRtree->zName
+ );
+ if( !zCreate ){
+ rc = SQLITE_NOMEM;
+ }else{
+ rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0);
+ sqlite3_free(zCreate);
+ }
+ if( rc==SQLITE_OK ){
+ rtreeRelease(pRtree);
+ }
+
+ return rc;
+}
+
+/*
+** Rtree virtual table module xOpen method.
+*/
+static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
+ int rc = SQLITE_NOMEM;
+ RtreeCursor *pCsr;
+
+ pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor));
+ if( pCsr ){
+ memset(pCsr, 0, sizeof(RtreeCursor));
+ pCsr->base.pVtab = pVTab;
+ rc = SQLITE_OK;
+ }
+ *ppCursor = (sqlite3_vtab_cursor *)pCsr;
+
+ return rc;
+}
+
+/*
+** Rtree virtual table module xClose method.
+*/
+static int rtreeClose(sqlite3_vtab_cursor *cur){
+ Rtree *pRtree = (Rtree *)(cur->pVtab);
+ int rc;
+ RtreeCursor *pCsr = (RtreeCursor *)cur;
+ sqlite3_free(pCsr->aConstraint);
+ rc = nodeRelease(pRtree, pCsr->pNode);
+ sqlite3_free(pCsr);
+ return rc;
+}
+
+/*
+** Rtree virtual table module xEof method.
+**
+** Return non-zero if the cursor does not currently point to a valid
+** record (i.e if the scan has finished), or zero otherwise.
+*/
+static int rtreeEof(sqlite3_vtab_cursor *cur){
+ RtreeCursor *pCsr = (RtreeCursor *)cur;
+ return (pCsr->pNode==0);
+}
+
+/*
+** Cursor pCursor currently points to a cell in a non-leaf page.
+** Return true if the sub-tree headed by the cell is filtered
+** (excluded) by the constraints in the pCursor->aConstraint[]
+** array, or false otherwise.
+*/
+static int testRtreeCell(Rtree *pRtree, RtreeCursor *pCursor){
+ RtreeCell cell;
+ int ii;
+ int bRes = 0;
+
+ nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
+ for(ii=0; bRes==0 && ii<pCursor->nConstraint; ii++){
+ RtreeConstraint *p = &pCursor->aConstraint[ii];
+ double cell_min = DCOORD(cell.aCoord[(p->iCoord>>1)*2]);
+ double cell_max = DCOORD(cell.aCoord[(p->iCoord>>1)*2+1]);
+
+ assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
+ || p->op==RTREE_GT || p->op==RTREE_EQ
+ );
+
+ switch( p->op ){
+ case RTREE_LE: case RTREE_LT: bRes = p->rValue<cell_min; break;
+ case RTREE_GE: case RTREE_GT: bRes = p->rValue>cell_max; break;
+ case RTREE_EQ:
+ bRes = (p->rValue>cell_max || p->rValue<cell_min);
+ break;
+ }
+ }
+
+ return bRes;
+}
+
+/*
+** Return true if the cell that cursor pCursor currently points to
+** would be filtered (excluded) by the constraints in the
+** pCursor->aConstraint[] array, or false otherwise.
+**
+** This function assumes that the cell is part of a leaf node.
+*/
+static int testRtreeEntry(Rtree *pRtree, RtreeCursor *pCursor){
+ RtreeCell cell;
+ int ii;
+
+ nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
+ for(ii=0; ii<pCursor->nConstraint; ii++){
+ RtreeConstraint *p = &pCursor->aConstraint[ii];
+ double coord = DCOORD(cell.aCoord[p->iCoord]);
+ int res;
+ assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
+ || p->op==RTREE_GT || p->op==RTREE_EQ
+ );
+ switch( p->op ){
+ case RTREE_LE: res = (coord<=p->rValue); break;
+ case RTREE_LT: res = (coord<p->rValue); break;
+ case RTREE_GE: res = (coord>=p->rValue); break;
+ case RTREE_GT: res = (coord>p->rValue); break;
+ case RTREE_EQ: res = (coord==p->rValue); break;
+ }
+
+ if( !res ) return 1;
+ }
+
+ return 0;
+}
+
+/*
+** Cursor pCursor currently points at a node that heads a sub-tree of
+** height iHeight (if iHeight==0, then the node is a leaf). Descend
+** to point to the left-most cell of the sub-tree that matches the
+** configured constraints.
+*/
+static int descendToCell(
+ Rtree *pRtree,
+ RtreeCursor *pCursor,
+ int iHeight,
+ int *pEof /* OUT: Set to true if cannot descend */
+){
+ int isEof;
+ int rc;
+ int ii;
+ RtreeNode *pChild;
+ sqlite3_int64 iRowid;
+
+ RtreeNode *pSavedNode = pCursor->pNode;
+ int iSavedCell = pCursor->iCell;
+
+ assert( iHeight>=0 );
+
+ if( iHeight==0 ){
+ isEof = testRtreeEntry(pRtree, pCursor);
+ }else{
+ isEof = testRtreeCell(pRtree, pCursor);
+ }
+ if( isEof || iHeight==0 ){
+ *pEof = isEof;
+ return SQLITE_OK;
+ }
+
+ iRowid = nodeGetRowid(pRtree, pCursor->pNode, pCursor->iCell);
+ rc = nodeAcquire(pRtree, iRowid, pCursor->pNode, &pChild);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ nodeRelease(pRtree, pCursor->pNode);
+ pCursor->pNode = pChild;
+ isEof = 1;
+ for(ii=0; isEof && ii<NCELL(pChild); ii++){
+ pCursor->iCell = ii;
+ rc = descendToCell(pRtree, pCursor, iHeight-1, &isEof);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ }
+
+ if( isEof ){
+ assert( pCursor->pNode==pChild );
+ nodeReference(pSavedNode);
+ nodeRelease(pRtree, pChild);
+ pCursor->pNode = pSavedNode;
+ pCursor->iCell = iSavedCell;
+ }
+
+ *pEof = isEof;
+ return SQLITE_OK;
+}
+
+/*
+** One of the cells in node pNode is guaranteed to have a 64-bit
+** integer value equal to iRowid. Return the index of this cell.
+*/
+static int nodeRowidIndex(Rtree *pRtree, RtreeNode *pNode, i64 iRowid){
+ int ii;
+ for(ii=0; nodeGetRowid(pRtree, pNode, ii)!=iRowid; ii++){
+ assert( ii<(NCELL(pNode)-1) );
+ }
+ return ii;
+}
+
+/*
+** Return the index of the cell containing a pointer to node pNode
+** in its parent. If pNode is the root node, return -1.
+*/
+static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode){
+ RtreeNode *pParent = pNode->pParent;
+ if( pParent ){
+ return nodeRowidIndex(pRtree, pParent, pNode->iNode);
+ }
+ return -1;
+}
+
+/*
+** Rtree virtual table module xNext method.
+*/
+static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
+ Rtree *pRtree = (Rtree *)(pVtabCursor->pVtab);
+ RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
+ int rc = SQLITE_OK;
+
+ if( pCsr->iStrategy==1 ){
+ /* This "scan" is a direct lookup by rowid. There is no next entry. */
+ nodeRelease(pRtree, pCsr->pNode);
+ pCsr->pNode = 0;
+ }
+
+ else if( pCsr->pNode ){
+ /* Move to the next entry that matches the configured constraints. */
+ int iHeight = 0;
+ while( pCsr->pNode ){
+ RtreeNode *pNode = pCsr->pNode;
+ int nCell = NCELL(pNode);
+ for(pCsr->iCell++; pCsr->iCell<nCell; pCsr->iCell++){
+ int isEof;
+ rc = descendToCell(pRtree, pCsr, iHeight, &isEof);
+ if( rc!=SQLITE_OK || !isEof ){
+ return rc;
+ }
+ }
+ pCsr->pNode = pNode->pParent;
+ pCsr->iCell = nodeParentIndex(pRtree, pNode);
+ nodeReference(pCsr->pNode);
+ nodeRelease(pRtree, pNode);
+ iHeight++;
+ }
+ }
+
+ return rc;
+}
+
+/*
+** Rtree virtual table module xRowid method.
+*/
+static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){
+ Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
+ RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
+
+ assert(pCsr->pNode);
+ *pRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
+
+ return SQLITE_OK;
+}
+
+/*
+** Rtree virtual table module xColumn method.
+*/
+static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
+ Rtree *pRtree = (Rtree *)cur->pVtab;
+ RtreeCursor *pCsr = (RtreeCursor *)cur;
+
+ if( i==0 ){
+ i64 iRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
+ sqlite3_result_int64(ctx, iRowid);
+ }else{
+ RtreeCoord c;
+ nodeGetCoord(pRtree, pCsr->pNode, pCsr->iCell, i-1, &c);
+ if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
+ sqlite3_result_double(ctx, c.f);
+ }else{
+ assert( pRtree->eCoordType==RTREE_COORD_INT32 );
+ sqlite3_result_int(ctx, c.i);
+ }
+ }
+
+ return SQLITE_OK;
+}
+
+/*
+** Use nodeAcquire() to obtain the leaf node containing the record with
+** rowid iRowid. If successful, set *ppLeaf to point to the node and
+** return SQLITE_OK. If there is no such record in the table, set
+** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf
+** to zero and return an SQLite error code.
+*/
+static int findLeafNode(Rtree *pRtree, i64 iRowid, RtreeNode **ppLeaf){
+ int rc;
+ *ppLeaf = 0;
+ sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid);
+ if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){
+ i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0);
+ rc = nodeAcquire(pRtree, iNode, 0, ppLeaf);
+ sqlite3_reset(pRtree->pReadRowid);
+ }else{
+ rc = sqlite3_reset(pRtree->pReadRowid);
+ }
+ return rc;
+}
+
+
+/*
+** Rtree virtual table module xFilter method.
+*/
+static int rtreeFilter(
+ sqlite3_vtab_cursor *pVtabCursor,
+ int idxNum, const char *idxStr,
+ int argc, sqlite3_value **argv
+){
+ Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
+ RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
+
+ RtreeNode *pRoot = 0;
+ int ii;
+ int rc = SQLITE_OK;
+
+ rtreeReference(pRtree);
+
+ sqlite3_free(pCsr->aConstraint);
+ pCsr->aConstraint = 0;
+ pCsr->iStrategy = idxNum;
+
+ if( idxNum==1 ){
+ /* Special case - lookup by rowid. */
+ RtreeNode *pLeaf; /* Leaf on which the required cell resides */
+ i64 iRowid = sqlite3_value_int64(argv[0]);
+ rc = findLeafNode(pRtree, iRowid, &pLeaf);
+ pCsr->pNode = pLeaf;
+ if( pLeaf && rc==SQLITE_OK ){
+ pCsr->iCell = nodeRowidIndex(pRtree, pLeaf, iRowid);
+ }
+ }else{
+ /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array
+ ** with the configured constraints.
+ */
+ if( argc>0 ){
+ pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc);
+ pCsr->nConstraint = argc;
+ if( !pCsr->aConstraint ){
+ rc = SQLITE_NOMEM;
+ }else{
+ assert( (idxStr==0 && argc==0) || strlen(idxStr)==argc*2 );
+ for(ii=0; ii<argc; ii++){
+ RtreeConstraint *p = &pCsr->aConstraint[ii];
+ p->op = idxStr[ii*2];
+ p->iCoord = idxStr[ii*2+1]-'a';
+ p->rValue = sqlite3_value_double(argv[ii]);
+ }
+ }
+ }
+
+ if( rc==SQLITE_OK ){
+ pCsr->pNode = 0;
+ rc = nodeAcquire(pRtree, 1, 0, &pRoot);
+ }
+ if( rc==SQLITE_OK ){
+ int isEof = 1;
+ int nCell = NCELL(pRoot);
+ pCsr->pNode = pRoot;
+ for(pCsr->iCell=0; rc==SQLITE_OK && pCsr->iCell<nCell; pCsr->iCell++){
+ assert( pCsr->pNode==pRoot );
+ rc = descendToCell(pRtree, pCsr, pRtree->iDepth, &isEof);
+ if( !isEof ){
+ break;
+ }
+ }
+ if( rc==SQLITE_OK && isEof ){
+ assert( pCsr->pNode==pRoot );
+ nodeRelease(pRtree, pRoot);
+ pCsr->pNode = 0;
+ }
+ assert( rc!=SQLITE_OK || !pCsr->pNode || pCsr->iCell<NCELL(pCsr->pNode) );
+ }
+ }
+
+ rtreeRelease(pRtree);
+ return rc;
+}
+
+/*
+** Rtree virtual table module xBestIndex method. There are three
+** table scan strategies to choose from (in order from most to
+** least desirable):
+**
+** idxNum idxStr Strategy
+** ------------------------------------------------
+** 1 Unused Direct lookup by rowid.
+** 2 See below R-tree query.
+** 3 Unused Full table scan.
+** ------------------------------------------------
+**
+** If strategy 1 or 3 is used, then idxStr is not meaningful. If strategy
+** 2 is used, idxStr is formatted to contain 2 bytes for each
+** constraint used. The first two bytes of idxStr correspond to
+** the constraint in sqlite3_index_info.aConstraintUsage[] with
+** (argvIndex==1) etc.
+**
+** The first of each pair of bytes in idxStr identifies the constraint
+** operator as follows:
+**
+** Operator Byte Value
+** ----------------------
+** = 0x41 ('A')
+** <= 0x42 ('B')
+** < 0x43 ('C')
+** >= 0x44 ('D')
+** > 0x45 ('E')
+** ----------------------
+**
+** The second of each pair of bytes identifies the coordinate column
+** to which the constraint applies. The leftmost coordinate column
+** is 'a', the second from the left 'b' etc.
+*/
+static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
+ int rc = SQLITE_OK;
+ int ii, cCol;
+
+ int iIdx = 0;
+ char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
+ memset(zIdxStr, 0, sizeof(zIdxStr));
+
+ assert( pIdxInfo->idxStr==0 );
+ for(ii=0; ii<pIdxInfo->nConstraint; ii++){
+ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
+
+ if( p->usable && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
+ /* We have an equality constraint on the rowid. Use strategy 1. */
+ int jj;
+ for(jj=0; jj<ii; jj++){
+ pIdxInfo->aConstraintUsage[jj].argvIndex = 0;
+ pIdxInfo->aConstraintUsage[jj].omit = 0;
+ }
+ pIdxInfo->idxNum = 1;
+ pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
+ pIdxInfo->aConstraintUsage[jj].omit = 1;
+
+ /* This strategy involves a two rowid lookups on an B-Tree structures
+ ** and then a linear search of an R-Tree node. This should be
+ ** considered almost as quick as a direct rowid lookup (for which
+ ** sqlite uses an internal cost of 0.0).
+ */
+ pIdxInfo->estimatedCost = 10.0;
+ return SQLITE_OK;
+ }
+
+ if( p->usable && p->iColumn>0 ){
+ u8 op = 0;
+ switch( p->op ){
+ case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
+ case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break;
+ case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break;
+ case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break;
+ case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break;
+ }
+ if( op ){
+ /* Make sure this particular constraint has not been used before.
+ ** If it has been used before, ignore it.
+ **
+ ** A <= or < can be used if there is a prior >= or >.
+ ** A >= or > can be used if there is a prior < or <=.
+ ** A <= or < is disqualified if there is a prior <=, <, or ==.
+ ** A >= or > is disqualified if there is a prior >=, >, or ==.
+ ** A == is disqualifed if there is any prior constraint.
+ */
+ int j, opmsk;
+ static const unsigned char compatible[] = { 0, 0, 1, 1, 2, 2 };
+ assert( compatible[RTREE_EQ & 7]==0 );
+ assert( compatible[RTREE_LT & 7]==1 );
+ assert( compatible[RTREE_LE & 7]==1 );
+ assert( compatible[RTREE_GT & 7]==2 );
+ assert( compatible[RTREE_GE & 7]==2 );
+ cCol = p->iColumn - 1 + 'a';
+ opmsk = compatible[op & 7];
+ for(j=0; j<iIdx; j+=2){
+ if( zIdxStr[j+1]==cCol && (compatible[zIdxStr[j] & 7] & opmsk)!=0 ){
+ op = 0;
+ break;
+ }
+ }
+ }
+ if( op ){
+ assert( iIdx<sizeof(zIdxStr)-1 );
+ zIdxStr[iIdx++] = op;
+ zIdxStr[iIdx++] = cCol;
+ pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2);
+ pIdxInfo->aConstraintUsage[ii].omit = 1;
+ }
+ }
+ }
+
+ pIdxInfo->idxNum = 2;
+ pIdxInfo->needToFreeIdxStr = 1;
+ if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
+ return SQLITE_NOMEM;
+ }
+ assert( iIdx>=0 );
+ pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
+ return rc;
+}
+
+/*
+** Return the N-dimensional volumn of the cell stored in *p.
+*/
+static float cellArea(Rtree *pRtree, RtreeCell *p){
+ float area = 1.0;
+ int ii;
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ area = area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
+ }
+ return area;
+}
+
+/*
+** Return the margin length of cell p. The margin length is the sum
+** of the objects size in each dimension.
+*/
+static float cellMargin(Rtree *pRtree, RtreeCell *p){
+ float margin = 0.0;
+ int ii;
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
+ }
+ return margin;
+}
+
+/*
+** Store the union of cells p1 and p2 in p1.
+*/
+static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
+ int ii;
+ if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f);
+ p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f);
+ }
+ }else{
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i);
+ p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i);
+ }
+ }
+}
+
+/*
+** Return true if the area covered by p2 is a subset of the area covered
+** by p1. False otherwise.
+*/
+static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
+ int ii;
+ int isInt = (pRtree->eCoordType==RTREE_COORD_INT32);
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ RtreeCoord *a1 = &p1->aCoord[ii];
+ RtreeCoord *a2 = &p2->aCoord[ii];
+ if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f))
+ || ( isInt && (a2[0].i<a1[0].i || a2[1].i>a1[1].i))
+ ){
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/*
+** Return the amount cell p would grow by if it were unioned with pCell.
+*/
+static float cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){
+ float area;
+ RtreeCell cell;
+ memcpy(&cell, p, sizeof(RtreeCell));
+ area = cellArea(pRtree, &cell);
+ cellUnion(pRtree, &cell, pCell);
+ return (cellArea(pRtree, &cell)-area);
+}
+
+#if VARIANT_RSTARTREE_CHOOSESUBTREE || VARIANT_RSTARTREE_SPLIT
+static float cellOverlap(
+ Rtree *pRtree,
+ RtreeCell *p,
+ RtreeCell *aCell,
+ int nCell,
+ int iExclude
+){
+ int ii;
+ float overlap = 0.0;
+ for(ii=0; ii<nCell; ii++){
+ if( ii!=iExclude ){
+ int jj;
+ float o = 1.0;
+ for(jj=0; jj<(pRtree->nDim*2); jj+=2){
+ double x1;
+ double x2;
+
+ x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj]));
+ x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1]));
+
+ if( x2<x1 ){
+ o = 0.0;
+ break;
+ }else{
+ o = o * (x2-x1);
+ }
+ }
+ overlap += o;
+ }
+ }
+ return overlap;
+}
+#endif
+
+#if VARIANT_RSTARTREE_CHOOSESUBTREE
+static float cellOverlapEnlargement(
+ Rtree *pRtree,
+ RtreeCell *p,
+ RtreeCell *pInsert,
+ RtreeCell *aCell,
+ int nCell,
+ int iExclude
+){
+ float before;
+ float after;
+ before = cellOverlap(pRtree, p, aCell, nCell, iExclude);
+ cellUnion(pRtree, p, pInsert);
+ after = cellOverlap(pRtree, p, aCell, nCell, iExclude);
+ return after-before;
+}
+#endif
+
+
+/*
+** This function implements the ChooseLeaf algorithm from Gutman[84].
+** ChooseSubTree in r*tree terminology.
+*/
+static int ChooseLeaf(
+ Rtree *pRtree, /* Rtree table */
+ RtreeCell *pCell, /* Cell to insert into rtree */
+ int iHeight, /* Height of sub-tree rooted at pCell */
+ RtreeNode **ppLeaf /* OUT: Selected leaf page */
+){
+ int rc;
+ int ii;
+ RtreeNode *pNode;
+ rc = nodeAcquire(pRtree, 1, 0, &pNode);
+
+ for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
+ int iCell;
+ sqlite3_int64 iBest;
+
+ float fMinGrowth;
+ float fMinArea;
+ float fMinOverlap;
+
+ int nCell = NCELL(pNode);
+ RtreeCell cell;
+ RtreeNode *pChild;
+
+ RtreeCell *aCell = 0;
+
+#if VARIANT_RSTARTREE_CHOOSESUBTREE
+ if( ii==(pRtree->iDepth-1) ){
+ int jj;
+ aCell = sqlite3_malloc(sizeof(RtreeCell)*nCell);
+ if( !aCell ){
+ rc = SQLITE_NOMEM;
+ nodeRelease(pRtree, pNode);
+ pNode = 0;
+ continue;
+ }
+ for(jj=0; jj<nCell; jj++){
+ nodeGetCell(pRtree, pNode, jj, &aCell[jj]);
+ }
+ }
+#endif
+
+ /* Select the child node which will be enlarged the least if pCell
+ ** is inserted into it. Resolve ties by choosing the entry with
+ ** the smallest area.
+ */
+ for(iCell=0; iCell<nCell; iCell++){
+ float growth;
+ float area;
+ float overlap = 0.0;
+ nodeGetCell(pRtree, pNode, iCell, &cell);
+ growth = cellGrowth(pRtree, &cell, pCell);
+ area = cellArea(pRtree, &cell);
+#if VARIANT_RSTARTREE_CHOOSESUBTREE
+ if( ii==(pRtree->iDepth-1) ){
+ overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
+ }
+#endif
+ if( (iCell==0)
+ || (overlap<fMinOverlap)
+ || (overlap==fMinOverlap && growth<fMinGrowth)
+ || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
+ ){
+ fMinOverlap = overlap;
+ fMinGrowth = growth;
+ fMinArea = area;
+ iBest = cell.iRowid;
+ }
+ }
+
+ sqlite3_free(aCell);
+ rc = nodeAcquire(pRtree, iBest, pNode, &pChild);
+ nodeRelease(pRtree, pNode);
+ pNode = pChild;
+ }
+
+ *ppLeaf = pNode;
+ return rc;
+}
+
+/*
+** A cell with the same content as pCell has just been inserted into
+** the node pNode. This function updates the bounding box cells in
+** all ancestor elements.
+*/
+static void AdjustTree(
+ Rtree *pRtree, /* Rtree table */
+ RtreeNode *pNode, /* Adjust ancestry of this node. */
+ RtreeCell *pCell /* This cell was just inserted */
+){
+ RtreeNode *p = pNode;
+ while( p->pParent ){
+ RtreeCell cell;
+ RtreeNode *pParent = p->pParent;
+ int iCell = nodeParentIndex(pRtree, p);
+
+ nodeGetCell(pRtree, pParent, iCell, &cell);
+ if( !cellContains(pRtree, &cell, pCell) ){
+ cellUnion(pRtree, &cell, pCell);
+ nodeOverwriteCell(pRtree, pParent, &cell, iCell);
+ }
+
+ p = pParent;
+ }
+}
+
+/*
+** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
+*/
+static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){
+ sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid);
+ sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode);
+ sqlite3_step(pRtree->pWriteRowid);
+ return sqlite3_reset(pRtree->pWriteRowid);
+}
+
+/*
+** Write mapping (iNode->iPar) to the <rtree>_parent table.
+*/
+static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){
+ sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode);
+ sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar);
+ sqlite3_step(pRtree->pWriteParent);
+ return sqlite3_reset(pRtree->pWriteParent);
+}
+
+static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int);
+
+#if VARIANT_GUTTMAN_LINEAR_SPLIT
+/*
+** Implementation of the linear variant of the PickNext() function from
+** Guttman[84].
+*/
+static RtreeCell *LinearPickNext(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ RtreeCell *pLeftBox,
+ RtreeCell *pRightBox,
+ int *aiUsed
+){
+ int ii;
+ for(ii=0; aiUsed[ii]; ii++);
+ aiUsed[ii] = 1;
+ return &aCell[ii];
+}
+
+/*
+** Implementation of the linear variant of the PickSeeds() function from
+** Guttman[84].
+*/
+static void LinearPickSeeds(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ int *piLeftSeed,
+ int *piRightSeed
+){
+ int i;
+ int iLeftSeed = 0;
+ int iRightSeed = 1;
+ float maxNormalInnerWidth = 0.0;
+
+ /* Pick two "seed" cells from the array of cells. The algorithm used
+ ** here is the LinearPickSeeds algorithm from Gutman[1984]. The
+ ** indices of the two seed cells in the array are stored in local
+ ** variables iLeftSeek and iRightSeed.
+ */
+ for(i=0; i<pRtree->nDim; i++){
+ float x1 = DCOORD(aCell[0].aCoord[i*2]);
+ float x2 = DCOORD(aCell[0].aCoord[i*2+1]);
+ float x3 = x1;
+ float x4 = x2;
+ int jj;
+
+ int iCellLeft = 0;
+ int iCellRight = 0;
+
+ for(jj=1; jj<nCell; jj++){
+ float left = DCOORD(aCell[jj].aCoord[i*2]);
+ float right = DCOORD(aCell[jj].aCoord[i*2+1]);
+
+ if( left<x1 ) x1 = left;
+ if( right>x4 ) x4 = right;
+ if( left>x3 ){
+ x3 = left;
+ iCellRight = jj;
+ }
+ if( right<x2 ){
+ x2 = right;
+ iCellLeft = jj;
+ }
+ }
+
+ if( x4!=x1 ){
+ float normalwidth = (x3 - x2) / (x4 - x1);
+ if( normalwidth>maxNormalInnerWidth ){
+ iLeftSeed = iCellLeft;
+ iRightSeed = iCellRight;
+ }
+ }
+ }
+
+ *piLeftSeed = iLeftSeed;
+ *piRightSeed = iRightSeed;
+}
+#endif /* VARIANT_GUTTMAN_LINEAR_SPLIT */
+
+#if VARIANT_GUTTMAN_QUADRATIC_SPLIT
+/*
+** Implementation of the quadratic variant of the PickNext() function from
+** Guttman[84].
+*/
+static RtreeCell *QuadraticPickNext(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ RtreeCell *pLeftBox,
+ RtreeCell *pRightBox,
+ int *aiUsed
+){
+ #define FABS(a) ((a)<0.0?-1.0*(a):(a))
+
+ int iSelect = -1;
+ float fDiff;
+ int ii;
+ for(ii=0; ii<nCell; ii++){
+ if( aiUsed[ii]==0 ){
+ float left = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
+ float right = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
+ float diff = FABS(right-left);
+ if( iSelect<0 || diff>fDiff ){
+ fDiff = diff;
+ iSelect = ii;
+ }
+ }
+ }
+ aiUsed[iSelect] = 1;
+ return &aCell[iSelect];
+}
+
+/*
+** Implementation of the quadratic variant of the PickSeeds() function from
+** Guttman[84].
+*/
+static void QuadraticPickSeeds(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ int *piLeftSeed,
+ int *piRightSeed
+){
+ int ii;
+ int jj;
+
+ int iLeftSeed = 0;
+ int iRightSeed = 1;
+ float fWaste = 0.0;
+
+ for(ii=0; ii<nCell; ii++){
+ for(jj=ii+1; jj<nCell; jj++){
+ float right = cellArea(pRtree, &aCell[jj]);
+ float growth = cellGrowth(pRtree, &aCell[ii], &aCell[jj]);
+ float waste = growth - right;
+
+ if( waste>fWaste ){
+ iLeftSeed = ii;
+ iRightSeed = jj;
+ fWaste = waste;
+ }
+ }
+ }
+
+ *piLeftSeed = iLeftSeed;
+ *piRightSeed = iRightSeed;
+}
+#endif /* VARIANT_GUTTMAN_QUADRATIC_SPLIT */
+
+/*
+** Arguments aIdx, aDistance and aSpare all point to arrays of size
+** nIdx. The aIdx array contains the set of integers from 0 to
+** (nIdx-1) in no particular order. This function sorts the values
+** in aIdx according to the indexed values in aDistance. For
+** example, assuming the inputs:
+**
+** aIdx = { 0, 1, 2, 3 }
+** aDistance = { 5.0, 2.0, 7.0, 6.0 }
+**
+** this function sets the aIdx array to contain:
+**
+** aIdx = { 0, 1, 2, 3 }
+**
+** The aSpare array is used as temporary working space by the
+** sorting algorithm.
+*/
+static void SortByDistance(
+ int *aIdx,
+ int nIdx,
+ float *aDistance,
+ int *aSpare
+){
+ if( nIdx>1 ){
+ int iLeft = 0;
+ int iRight = 0;
+
+ int nLeft = nIdx/2;
+ int nRight = nIdx-nLeft;
+ int *aLeft = aIdx;
+ int *aRight = &aIdx[nLeft];
+
+ SortByDistance(aLeft, nLeft, aDistance, aSpare);
+ SortByDistance(aRight, nRight, aDistance, aSpare);
+
+ memcpy(aSpare, aLeft, sizeof(int)*nLeft);
+ aLeft = aSpare;
+
+ while( iLeft<nLeft || iRight<nRight ){
+ if( iLeft==nLeft ){
+ aIdx[iLeft+iRight] = aRight[iRight];
+ iRight++;
+ }else if( iRight==nRight ){
+ aIdx[iLeft+iRight] = aLeft[iLeft];
+ iLeft++;
+ }else{
+ float fLeft = aDistance[aLeft[iLeft]];
+ float fRight = aDistance[aRight[iRight]];
+ if( fLeft<fRight ){
+ aIdx[iLeft+iRight] = aLeft[iLeft];
+ iLeft++;
+ }else{
+ aIdx[iLeft+iRight] = aRight[iRight];
+ iRight++;
+ }
+ }
+ }
+
+#if 0
+ /* Check that the sort worked */
+ {
+ int jj;
+ for(jj=1; jj<nIdx; jj++){
+ float left = aDistance[aIdx[jj-1]];
+ float right = aDistance[aIdx[jj]];
+ assert( left<=right );
+ }
+ }
+#endif
+ }
+}
+
+/*
+** Arguments aIdx, aCell and aSpare all point to arrays of size
+** nIdx. The aIdx array contains the set of integers from 0 to
+** (nIdx-1) in no particular order. This function sorts the values
+** in aIdx according to dimension iDim of the cells in aCell. The
+** minimum value of dimension iDim is considered first, the
+** maximum used to break ties.
+**
+** The aSpare array is used as temporary working space by the
+** sorting algorithm.
+*/
+static void SortByDimension(
+ Rtree *pRtree,
+ int *aIdx,
+ int nIdx,
+ int iDim,
+ RtreeCell *aCell,
+ int *aSpare
+){
+ if( nIdx>1 ){
+
+ int iLeft = 0;
+ int iRight = 0;
+
+ int nLeft = nIdx/2;
+ int nRight = nIdx-nLeft;
+ int *aLeft = aIdx;
+ int *aRight = &aIdx[nLeft];
+
+ SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare);
+ SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare);
+
+ memcpy(aSpare, aLeft, sizeof(int)*nLeft);
+ aLeft = aSpare;
+ while( iLeft<nLeft || iRight<nRight ){
+ double xleft1 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2]);
+ double xleft2 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2+1]);
+ double xright1 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2]);
+ double xright2 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2+1]);
+ if( (iLeft!=nLeft) && ((iRight==nRight)
+ || (xleft1<xright1)
+ || (xleft1==xright1 && xleft2<xright2)
+ )){
+ aIdx[iLeft+iRight] = aLeft[iLeft];
+ iLeft++;
+ }else{
+ aIdx[iLeft+iRight] = aRight[iRight];
+ iRight++;
+ }
+ }
+
+#if 0
+ /* Check that the sort worked */
+ {
+ int jj;
+ for(jj=1; jj<nIdx; jj++){
+ float xleft1 = aCell[aIdx[jj-1]].aCoord[iDim*2];
+ float xleft2 = aCell[aIdx[jj-1]].aCoord[iDim*2+1];
+ float xright1 = aCell[aIdx[jj]].aCoord[iDim*2];
+ float xright2 = aCell[aIdx[jj]].aCoord[iDim*2+1];
+ assert( xleft1<=xright1 && (xleft1<xright1 || xleft2<=xright2) );
+ }
+ }
+#endif
+ }
+}
+
+#if VARIANT_RSTARTREE_SPLIT
+/*
+** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
+*/
+static int splitNodeStartree(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ RtreeNode *pLeft,
+ RtreeNode *pRight,
+ RtreeCell *pBboxLeft,
+ RtreeCell *pBboxRight
+){
+ int **aaSorted;
+ int *aSpare;
+ int ii;
+
+ int iBestDim;
+ int iBestSplit;
+ float fBestMargin;
+
+ int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
+
+ aaSorted = (int **)sqlite3_malloc(nByte);
+ if( !aaSorted ){
+ return SQLITE_NOMEM;
+ }
+
+ aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell];
+ memset(aaSorted, 0, nByte);
+ for(ii=0; ii<pRtree->nDim; ii++){
+ int jj;
+ aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell];
+ for(jj=0; jj<nCell; jj++){
+ aaSorted[ii][jj] = jj;
+ }
+ SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
+ }
+
+ for(ii=0; ii<pRtree->nDim; ii++){
+ float margin = 0.0;
+ float fBestOverlap;
+ float fBestArea;
+ int iBestLeft;
+ int nLeft;
+
+ for(
+ nLeft=RTREE_MINCELLS(pRtree);
+ nLeft<=(nCell-RTREE_MINCELLS(pRtree));
+ nLeft++
+ ){
+ RtreeCell left;
+ RtreeCell right;
+ int kk;
+ float overlap;
+ float area;
+
+ memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell));
+ memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell));
+ for(kk=1; kk<(nCell-1); kk++){
+ if( kk<nLeft ){
+ cellUnion(pRtree, &left, &aCell[aaSorted[ii][kk]]);
+ }else{
+ cellUnion(pRtree, &right, &aCell[aaSorted[ii][kk]]);
+ }
+ }
+ margin += cellMargin(pRtree, &left);
+ margin += cellMargin(pRtree, &right);
+ overlap = cellOverlap(pRtree, &left, &right, 1, -1);
+ area = cellArea(pRtree, &left) + cellArea(pRtree, &right);
+ if( (nLeft==RTREE_MINCELLS(pRtree))
+ || (overlap<fBestOverlap)
+ || (overlap==fBestOverlap && area<fBestArea)
+ ){
+ iBestLeft = nLeft;
+ fBestOverlap = overlap;
+ fBestArea = area;
+ }
+ }
+
+ if( ii==0 || margin<fBestMargin ){
+ iBestDim = ii;
+ fBestMargin = margin;
+ iBestSplit = iBestLeft;
+ }
+ }
+
+ memcpy(pBboxLeft, &aCell[aaSorted[iBestDim][0]], sizeof(RtreeCell));
+ memcpy(pBboxRight, &aCell[aaSorted[iBestDim][iBestSplit]], sizeof(RtreeCell));
+ for(ii=0; ii<nCell; ii++){
+ RtreeNode *pTarget = (ii<iBestSplit)?pLeft:pRight;
+ RtreeCell *pBbox = (ii<iBestSplit)?pBboxLeft:pBboxRight;
+ RtreeCell *pCell = &aCell[aaSorted[iBestDim][ii]];
+ nodeInsertCell(pRtree, pTarget, pCell);
+ cellUnion(pRtree, pBbox, pCell);
+ }
+
+ sqlite3_free(aaSorted);
+ return SQLITE_OK;
+}
+#endif
+
+#if VARIANT_GUTTMAN_SPLIT
+/*
+** Implementation of the regular R-tree SplitNode from Guttman[1984].
+*/
+static int splitNodeGuttman(
+ Rtree *pRtree,
+ RtreeCell *aCell,
+ int nCell,
+ RtreeNode *pLeft,
+ RtreeNode *pRight,
+ RtreeCell *pBboxLeft,
+ RtreeCell *pBboxRight
+){
+ int iLeftSeed = 0;
+ int iRightSeed = 1;
+ int *aiUsed;
+ int i;
+
+ aiUsed = sqlite3_malloc(sizeof(int)*nCell);
+ if( !aiUsed ){
+ return SQLITE_NOMEM;
+ }
+ memset(aiUsed, 0, sizeof(int)*nCell);
+
+ PickSeeds(pRtree, aCell, nCell, &iLeftSeed, &iRightSeed);
+
+ memcpy(pBboxLeft, &aCell[iLeftSeed], sizeof(RtreeCell));
+ memcpy(pBboxRight, &aCell[iRightSeed], sizeof(RtreeCell));
+ nodeInsertCell(pRtree, pLeft, &aCell[iLeftSeed]);
+ nodeInsertCell(pRtree, pRight, &aCell[iRightSeed]);
+ aiUsed[iLeftSeed] = 1;
+ aiUsed[iRightSeed] = 1;
+
+ for(i=nCell-2; i>0; i--){
+ RtreeCell *pNext;
+ pNext = PickNext(pRtree, aCell, nCell, pBboxLeft, pBboxRight, aiUsed);
+ float diff =
+ cellGrowth(pRtree, pBboxLeft, pNext) -
+ cellGrowth(pRtree, pBboxRight, pNext)
+ ;
+ if( (RTREE_MINCELLS(pRtree)-NCELL(pRight)==i)
+ || (diff>0.0 && (RTREE_MINCELLS(pRtree)-NCELL(pLeft)!=i))
+ ){
+ nodeInsertCell(pRtree, pRight, pNext);
+ cellUnion(pRtree, pBboxRight, pNext);
+ }else{
+ nodeInsertCell(pRtree, pLeft, pNext);
+ cellUnion(pRtree, pBboxLeft, pNext);
+ }
+ }
+
+ sqlite3_free(aiUsed);
+ return SQLITE_OK;
+}
+#endif
+
+static int updateMapping(
+ Rtree *pRtree,
+ i64 iRowid,
+ RtreeNode *pNode,
+ int iHeight
+){
+ int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64);
+ xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
+ if( iHeight>0 ){
+ RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
+ if( pChild ){
+ nodeRelease(pRtree, pChild->pParent);
+ nodeReference(pNode);
+ pChild->pParent = pNode;
+ }
+ }
+ return xSetMapping(pRtree, iRowid, pNode->iNode);
+}
+
+static int SplitNode(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ RtreeCell *pCell,
+ int iHeight
+){
+ int i;
+ int newCellIsRight = 0;
+
+ int rc = SQLITE_OK;
+ int nCell = NCELL(pNode);
+ RtreeCell *aCell;
+ int *aiUsed;
+
+ RtreeNode *pLeft = 0;
+ RtreeNode *pRight = 0;
+
+ RtreeCell leftbbox;
+ RtreeCell rightbbox;
+
+ /* Allocate an array and populate it with a copy of pCell and
+ ** all cells from node pLeft. Then zero the original node.
+ */
+ aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1));
+ if( !aCell ){
+ rc = SQLITE_NOMEM;
+ goto splitnode_out;
+ }
+ aiUsed = (int *)&aCell[nCell+1];
+ memset(aiUsed, 0, sizeof(int)*(nCell+1));
+ for(i=0; i<nCell; i++){
+ nodeGetCell(pRtree, pNode, i, &aCell[i]);
+ }
+ nodeZero(pRtree, pNode);
+ memcpy(&aCell[nCell], pCell, sizeof(RtreeCell));
+ nCell++;
+
+ if( pNode->iNode==1 ){
+ pRight = nodeNew(pRtree, pNode, 1);
+ pLeft = nodeNew(pRtree, pNode, 1);
+ pRtree->iDepth++;
+ pNode->isDirty = 1;
+ writeInt16(pNode->zData, pRtree->iDepth);
+ }else{
+ pLeft = pNode;
+ pRight = nodeNew(pRtree, pLeft->pParent, 1);
+ nodeReference(pLeft);
+ }
+
+ if( !pLeft || !pRight ){
+ rc = SQLITE_NOMEM;
+ goto splitnode_out;
+ }
+
+ memset(pLeft->zData, 0, pRtree->iNodeSize);
+ memset(pRight->zData, 0, pRtree->iNodeSize);
+
+ rc = AssignCells(pRtree, aCell, nCell, pLeft, pRight, &leftbbox, &rightbbox);
+ if( rc!=SQLITE_OK ){
+ goto splitnode_out;
+ }
+
+ /* Ensure both child nodes have node numbers assigned to them. */
+ if( (0==pRight->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pRight)))
+ || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft)))
+ ){
+ goto splitnode_out;
+ }
+
+ rightbbox.iRowid = pRight->iNode;
+ leftbbox.iRowid = pLeft->iNode;
+
+ if( pNode->iNode==1 ){
+ rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1);
+ if( rc!=SQLITE_OK ){
+ goto splitnode_out;
+ }
+ }else{
+ RtreeNode *pParent = pLeft->pParent;
+ int iCell = nodeParentIndex(pRtree, pLeft);
+ nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
+ AdjustTree(pRtree, pParent, &leftbbox);
+ }
+ if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){
+ goto splitnode_out;
+ }
+
+ for(i=0; i<NCELL(pRight); i++){
+ i64 iRowid = nodeGetRowid(pRtree, pRight, i);
+ rc = updateMapping(pRtree, iRowid, pRight, iHeight);
+ if( iRowid==pCell->iRowid ){
+ newCellIsRight = 1;
+ }
+ if( rc!=SQLITE_OK ){
+ goto splitnode_out;
+ }
+ }
+ if( pNode->iNode==1 ){
+ for(i=0; i<NCELL(pLeft); i++){
+ i64 iRowid = nodeGetRowid(pRtree, pLeft, i);
+ rc = updateMapping(pRtree, iRowid, pLeft, iHeight);
+ if( rc!=SQLITE_OK ){
+ goto splitnode_out;
+ }
+ }
+ }else if( newCellIsRight==0 ){
+ rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight);
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = nodeRelease(pRtree, pRight);
+ pRight = 0;
+ }
+ if( rc==SQLITE_OK ){
+ rc = nodeRelease(pRtree, pLeft);
+ pLeft = 0;
+ }
+
+splitnode_out:
+ nodeRelease(pRtree, pRight);
+ nodeRelease(pRtree, pLeft);
+ sqlite3_free(aCell);
+ return rc;
+}
+
+static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
+ int rc = SQLITE_OK;
+ if( pLeaf->iNode!=1 && pLeaf->pParent==0 ){
+ sqlite3_bind_int64(pRtree->pReadParent, 1, pLeaf->iNode);
+ if( sqlite3_step(pRtree->pReadParent)==SQLITE_ROW ){
+ i64 iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
+ rc = nodeAcquire(pRtree, iNode, 0, &pLeaf->pParent);
+ }else{
+ rc = SQLITE_ERROR;
+ }
+ sqlite3_reset(pRtree->pReadParent);
+ if( rc==SQLITE_OK ){
+ rc = fixLeafParent(pRtree, pLeaf->pParent);
+ }
+ }
+ return rc;
+}
+
+static int deleteCell(Rtree *, RtreeNode *, int, int);
+
+static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
+ int rc;
+ RtreeNode *pParent;
+ int iCell;
+
+ assert( pNode->nRef==1 );
+
+ /* Remove the entry in the parent cell. */
+ iCell = nodeParentIndex(pRtree, pNode);
+ pParent = pNode->pParent;
+ pNode->pParent = 0;
+ if( SQLITE_OK!=(rc = deleteCell(pRtree, pParent, iCell, iHeight+1))
+ || SQLITE_OK!=(rc = nodeRelease(pRtree, pParent))
+ ){
+ return rc;
+ }
+
+ /* Remove the xxx_node entry. */
+ sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode);
+ sqlite3_step(pRtree->pDeleteNode);
+ if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){
+ return rc;
+ }
+
+ /* Remove the xxx_parent entry. */
+ sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode);
+ sqlite3_step(pRtree->pDeleteParent);
+ if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){
+ return rc;
+ }
+
+ /* Remove the node from the in-memory hash table and link it into
+ ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
+ */
+ nodeHashDelete(pRtree, pNode);
+ pNode->iNode = iHeight;
+ pNode->pNext = pRtree->pDeleted;
+ pNode->nRef++;
+ pRtree->pDeleted = pNode;
+
+ return SQLITE_OK;
+}
+
+static void fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){
+ RtreeNode *pParent = pNode->pParent;
+ if( pParent ){
+ int ii;
+ int nCell = NCELL(pNode);
+ RtreeCell box; /* Bounding box for pNode */
+ nodeGetCell(pRtree, pNode, 0, &box);
+ for(ii=1; ii<nCell; ii++){
+ RtreeCell cell;
+ nodeGetCell(pRtree, pNode, ii, &cell);
+ cellUnion(pRtree, &box, &cell);
+ }
+ box.iRowid = pNode->iNode;
+ ii = nodeParentIndex(pRtree, pNode);
+ nodeOverwriteCell(pRtree, pParent, &box, ii);
+ fixBoundingBox(pRtree, pParent);
+ }
+}
+
+/*
+** Delete the cell at index iCell of node pNode. After removing the
+** cell, adjust the r-tree data structure if required.
+*/
+static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){
+ int rc;
+
+ if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){
+ return rc;
+ }
+
+ /* Remove the cell from the node. This call just moves bytes around
+ ** the in-memory node image, so it cannot fail.
+ */
+ nodeDeleteCell(pRtree, pNode, iCell);
+
+ /* If the node is not the tree root and now has less than the minimum
+ ** number of cells, remove it from the tree. Otherwise, update the
+ ** cell in the parent node so that it tightly contains the updated
+ ** node.
+ */
+ if( pNode->iNode!=1 ){
+ RtreeNode *pParent = pNode->pParent;
+ if( (pParent->iNode!=1 || NCELL(pParent)!=1)
+ && (NCELL(pNode)<RTREE_MINCELLS(pRtree))
+ ){
+ rc = removeNode(pRtree, pNode, iHeight);
+ }else{
+ fixBoundingBox(pRtree, pNode);
+ }
+ }
+
+ return rc;
+}
+
+static int Reinsert(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ RtreeCell *pCell,
+ int iHeight
+){
+ int *aOrder;
+ int *aSpare;
+ RtreeCell *aCell;
+ float *aDistance;
+ int nCell;
+ float aCenterCoord[RTREE_MAX_DIMENSIONS];
+ int iDim;
+ int ii;
+ int rc = SQLITE_OK;
+
+ memset(aCenterCoord, 0, sizeof(float)*RTREE_MAX_DIMENSIONS);
+
+ nCell = NCELL(pNode)+1;
+
+ /* Allocate the buffers used by this operation. The allocation is
+ ** relinquished before this function returns.
+ */
+ aCell = (RtreeCell *)sqlite3_malloc(nCell * (
+ sizeof(RtreeCell) + /* aCell array */
+ sizeof(int) + /* aOrder array */
+ sizeof(int) + /* aSpare array */
+ sizeof(float) /* aDistance array */
+ ));
+ if( !aCell ){
+ return SQLITE_NOMEM;
+ }
+ aOrder = (int *)&aCell[nCell];
+ aSpare = (int *)&aOrder[nCell];
+ aDistance = (float *)&aSpare[nCell];
+
+ for(ii=0; ii<nCell; ii++){
+ if( ii==(nCell-1) ){
+ memcpy(&aCell[ii], pCell, sizeof(RtreeCell));
+ }else{
+ nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
+ }
+ aOrder[ii] = ii;
+ for(iDim=0; iDim<pRtree->nDim; iDim++){
+ aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]);
+ aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]);
+ }
+ }
+ for(iDim=0; iDim<pRtree->nDim; iDim++){
+ aCenterCoord[iDim] = aCenterCoord[iDim]/((float)nCell*2.0);
+ }
+
+ for(ii=0; ii<nCell; ii++){
+ aDistance[ii] = 0.0;
+ for(iDim=0; iDim<pRtree->nDim; iDim++){
+ float coord = DCOORD(aCell[ii].aCoord[iDim*2+1]) -
+ DCOORD(aCell[ii].aCoord[iDim*2]);
+ aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
+ }
+ }
+
+ SortByDistance(aOrder, nCell, aDistance, aSpare);
+ nodeZero(pRtree, pNode);
+
+ for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){
+ RtreeCell *p = &aCell[aOrder[ii]];
+ nodeInsertCell(pRtree, pNode, p);
+ if( p->iRowid==pCell->iRowid ){
+ if( iHeight==0 ){
+ rc = rowidWrite(pRtree, p->iRowid, pNode->iNode);
+ }else{
+ rc = parentWrite(pRtree, p->iRowid, pNode->iNode);
+ }
+ }
+ }
+ if( rc==SQLITE_OK ){
+ fixBoundingBox(pRtree, pNode);
+ }
+ for(; rc==SQLITE_OK && ii<nCell; ii++){
+ /* Find a node to store this cell in. pNode->iNode currently contains
+ ** the height of the sub-tree headed by the cell.
+ */
+ RtreeNode *pInsert;
+ RtreeCell *p = &aCell[aOrder[ii]];
+ rc = ChooseLeaf(pRtree, p, iHeight, &pInsert);
+ if( rc==SQLITE_OK ){
+ int rc2;
+ rc = rtreeInsertCell(pRtree, pInsert, p, iHeight);
+ rc2 = nodeRelease(pRtree, pInsert);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+ }
+
+ sqlite3_free(aCell);
+ return rc;
+}
+
+/*
+** Insert cell pCell into node pNode. Node pNode is the head of a
+** subtree iHeight high (leaf nodes have iHeight==0).
+*/
+static int rtreeInsertCell(
+ Rtree *pRtree,
+ RtreeNode *pNode,
+ RtreeCell *pCell,
+ int iHeight
+){
+ int rc = SQLITE_OK;
+ if( iHeight>0 ){
+ RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid);
+ if( pChild ){
+ nodeRelease(pRtree, pChild->pParent);
+ nodeReference(pNode);
+ pChild->pParent = pNode;
+ }
+ }
+ if( nodeInsertCell(pRtree, pNode, pCell) ){
+#if VARIANT_RSTARTREE_REINSERT
+ if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){
+ rc = SplitNode(pRtree, pNode, pCell, iHeight);
+ }else{
+ pRtree->iReinsertHeight = iHeight;
+ rc = Reinsert(pRtree, pNode, pCell, iHeight);
+ }
+#else
+ rc = SplitNode(pRtree, pNode, pCell, iHeight);
+#endif
+ }else{
+ AdjustTree(pRtree, pNode, pCell);
+ if( iHeight==0 ){
+ rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
+ }else{
+ rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode);
+ }
+ }
+ return rc;
+}
+
+static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
+ int ii;
+ int rc = SQLITE_OK;
+ int nCell = NCELL(pNode);
+
+ for(ii=0; rc==SQLITE_OK && ii<nCell; ii++){
+ RtreeNode *pInsert;
+ RtreeCell cell;
+ nodeGetCell(pRtree, pNode, ii, &cell);
+
+ /* Find a node to store this cell in. pNode->iNode currently contains
+ ** the height of the sub-tree headed by the cell.
+ */
+ rc = ChooseLeaf(pRtree, &cell, pNode->iNode, &pInsert);
+ if( rc==SQLITE_OK ){
+ int rc2;
+ rc = rtreeInsertCell(pRtree, pInsert, &cell, pNode->iNode);
+ rc2 = nodeRelease(pRtree, pInsert);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+ }
+ return rc;
+}
+
+/*
+** Select a currently unused rowid for a new r-tree record.
+*/
+static int newRowid(Rtree *pRtree, i64 *piRowid){
+ int rc;
+ sqlite3_bind_null(pRtree->pWriteRowid, 1);
+ sqlite3_bind_null(pRtree->pWriteRowid, 2);
+ sqlite3_step(pRtree->pWriteRowid);
+ rc = sqlite3_reset(pRtree->pWriteRowid);
+ *piRowid = sqlite3_last_insert_rowid(pRtree->db);
+ return rc;
+}
+
+#ifndef NDEBUG
+static int hashIsEmpty(Rtree *pRtree){
+ int ii;
+ for(ii=0; ii<HASHSIZE; ii++){
+ assert( !pRtree->aHash[ii] );
+ }
+ return 1;
+}
+#endif
+
+/*
+** The xUpdate method for rtree module virtual tables.
+*/
+static int rtreeUpdate(
+ sqlite3_vtab *pVtab,
+ int nData,
+ sqlite3_value **azData,
+ sqlite_int64 *pRowid
+){
+ Rtree *pRtree = (Rtree *)pVtab;
+ int rc = SQLITE_OK;
+
+ rtreeReference(pRtree);
+
+ assert(nData>=1);
+ assert(hashIsEmpty(pRtree));
+
+ /* If azData[0] is not an SQL NULL value, it is the rowid of a
+ ** record to delete from the r-tree table. The following block does
+ ** just that.
+ */
+ if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
+ i64 iDelete; /* The rowid to delete */
+ RtreeNode *pLeaf; /* Leaf node containing record iDelete */
+ int iCell; /* Index of iDelete cell in pLeaf */
+ RtreeNode *pRoot;
+
+ /* Obtain a reference to the root node to initialise Rtree.iDepth */
+ rc = nodeAcquire(pRtree, 1, 0, &pRoot);
+
+ /* Obtain a reference to the leaf node that contains the entry
+ ** about to be deleted.
+ */
+ if( rc==SQLITE_OK ){
+ iDelete = sqlite3_value_int64(azData[0]);
+ rc = findLeafNode(pRtree, iDelete, &pLeaf);
+ }
+
+ /* Delete the cell in question from the leaf node. */
+ if( rc==SQLITE_OK ){
+ int rc2;
+ iCell = nodeRowidIndex(pRtree, pLeaf, iDelete);
+ rc = deleteCell(pRtree, pLeaf, iCell, 0);
+ rc2 = nodeRelease(pRtree, pLeaf);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+
+ /* Delete the corresponding entry in the <rtree>_rowid table. */
+ if( rc==SQLITE_OK ){
+ sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete);
+ sqlite3_step(pRtree->pDeleteRowid);
+ rc = sqlite3_reset(pRtree->pDeleteRowid);
+ }
+
+ /* Check if the root node now has exactly one child. If so, remove
+ ** it, schedule the contents of the child for reinsertion and
+ ** reduce the tree height by one.
+ **
+ ** This is equivalent to copying the contents of the child into
+ ** the root node (the operation that Gutman's paper says to perform
+ ** in this scenario).
+ */
+ if( rc==SQLITE_OK && pRtree->iDepth>0 ){
+ if( rc==SQLITE_OK && NCELL(pRoot)==1 ){
+ RtreeNode *pChild;
+ i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
+ rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
+ if( rc==SQLITE_OK ){
+ rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
+ }
+ if( rc==SQLITE_OK ){
+ pRtree->iDepth--;
+ writeInt16(pRoot->zData, pRtree->iDepth);
+ pRoot->isDirty = 1;
+ }
+ }
+ }
+
+ /* Re-insert the contents of any underfull nodes removed from the tree. */
+ for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){
+ if( rc==SQLITE_OK ){
+ rc = reinsertNodeContent(pRtree, pLeaf);
+ }
+ pRtree->pDeleted = pLeaf->pNext;
+ sqlite3_free(pLeaf);
+ }
+
+ /* Release the reference to the root node. */
+ if( rc==SQLITE_OK ){
+ rc = nodeRelease(pRtree, pRoot);
+ }else{
+ nodeRelease(pRtree, pRoot);
+ }
+ }
+
+ /* If the azData[] array contains more than one element, elements
+ ** (azData[2]..azData[argc-1]) contain a new record to insert into
+ ** the r-tree structure.
+ */
+ if( rc==SQLITE_OK && nData>1 ){
+ /* Insert a new record into the r-tree */
+ RtreeCell cell;
+ int ii;
+ RtreeNode *pLeaf;
+
+ /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */
+ assert( nData==(pRtree->nDim*2 + 3) );
+ if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ cell.aCoord[ii].f = (float)sqlite3_value_double(azData[ii+3]);
+ cell.aCoord[ii+1].f = (float)sqlite3_value_double(azData[ii+4]);
+ if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
+ rc = SQLITE_CONSTRAINT;
+ goto constraint;
+ }
+ }
+ }else{
+ for(ii=0; ii<(pRtree->nDim*2); ii+=2){
+ cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
+ cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
+ if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
+ rc = SQLITE_CONSTRAINT;
+ goto constraint;
+ }
+ }
+ }
+
+ /* Figure out the rowid of the new row. */
+ if( sqlite3_value_type(azData[2])==SQLITE_NULL ){
+ rc = newRowid(pRtree, &cell.iRowid);
+ }else{
+ cell.iRowid = sqlite3_value_int64(azData[2]);
+ sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
+ if( SQLITE_ROW==sqlite3_step(pRtree->pReadRowid) ){
+ sqlite3_reset(pRtree->pReadRowid);
+ rc = SQLITE_CONSTRAINT;
+ goto constraint;
+ }
+ rc = sqlite3_reset(pRtree->pReadRowid);
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
+ }
+ if( rc==SQLITE_OK ){
+ int rc2;
+ pRtree->iReinsertHeight = -1;
+ rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
+ rc2 = nodeRelease(pRtree, pLeaf);
+ if( rc==SQLITE_OK ){
+ rc = rc2;
+ }
+ }
+ }
+
+constraint:
+ rtreeRelease(pRtree);
+ return rc;
+}
+
+/*
+** The xRename method for rtree module virtual tables.
+*/
+static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
+ Rtree *pRtree = (Rtree *)pVtab;
+ int rc = SQLITE_NOMEM;
+ char *zSql = sqlite3_mprintf(
+ "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";"
+ "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
+ "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";"
+ , pRtree->zDb, pRtree->zName, zNewName
+ , pRtree->zDb, pRtree->zName, zNewName
+ , pRtree->zDb, pRtree->zName, zNewName
+ );
+ if( zSql ){
+ rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
+ sqlite3_free(zSql);
+ }
+ return rc;
+}
+
+static sqlite3_module rtreeModule = {
+ 0, /* iVersion */
+ rtreeCreate, /* xCreate - create a table */
+ rtreeConnect, /* xConnect - connect to an existing table */
+ rtreeBestIndex, /* xBestIndex - Determine search strategy */
+ rtreeDisconnect, /* xDisconnect - Disconnect from a table */
+ rtreeDestroy, /* xDestroy - Drop a table */
+ rtreeOpen, /* xOpen - open a cursor */
+ rtreeClose, /* xClose - close a cursor */
+ rtreeFilter, /* xFilter - configure scan constraints */
+ rtreeNext, /* xNext - advance a cursor */
+ rtreeEof, /* xEof */
+ rtreeColumn, /* xColumn - read data */
+ rtreeRowid, /* xRowid - read data */
+ rtreeUpdate, /* xUpdate - write data */
+ 0, /* xBegin - begin transaction */
+ 0, /* xSync - sync transaction */
+ 0, /* xCommit - commit transaction */
+ 0, /* xRollback - rollback transaction */
+ 0, /* xFindFunction - function overloading */
+ rtreeRename /* xRename - rename the table */
+};
+
+static int rtreeSqlInit(
+ Rtree *pRtree,
+ sqlite3 *db,
+ const char *zDb,
+ const char *zPrefix,
+ int isCreate
+){
+ int rc = SQLITE_OK;
+
+ #define N_STATEMENT 9
+ static const char *azSql[N_STATEMENT] = {
+ /* Read and write the xxx_node table */
+ "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1",
+ "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
+ "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
+
+ /* Read and write the xxx_rowid table */
+ "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
+ "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
+ "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
+
+ /* Read and write the xxx_parent table */
+ "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
+ "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
+ "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
+ };
+ sqlite3_stmt **appStmt[N_STATEMENT];
+ int i;
+
+ pRtree->db = db;
+
+ if( isCreate ){
+ char *zCreate = sqlite3_mprintf(
+"CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
+"CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
+"CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER);"
+"INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
+ zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
+ );
+ if( !zCreate ){
+ return SQLITE_NOMEM;
+ }
+ rc = sqlite3_exec(db, zCreate, 0, 0, 0);
+ sqlite3_free(zCreate);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+ }
+
+ appStmt[0] = &pRtree->pReadNode;
+ appStmt[1] = &pRtree->pWriteNode;
+ appStmt[2] = &pRtree->pDeleteNode;
+ appStmt[3] = &pRtree->pReadRowid;
+ appStmt[4] = &pRtree->pWriteRowid;
+ appStmt[5] = &pRtree->pDeleteRowid;
+ appStmt[6] = &pRtree->pReadParent;
+ appStmt[7] = &pRtree->pWriteParent;
+ appStmt[8] = &pRtree->pDeleteParent;
+
+ for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
+ char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
+ if( zSql ){
+ rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0);
+ }else{
+ rc = SQLITE_NOMEM;
+ }
+ sqlite3_free(zSql);
+ }
+
+ return rc;
+}
+
+/*
+** This routine queries database handle db for the page-size used by
+** database zDb. If successful, the page-size in bytes is written to
+** *piPageSize and SQLITE_OK returned. Otherwise, and an SQLite error
+** code is returned.
+*/
+static int getPageSize(sqlite3 *db, const char *zDb, int *piPageSize){
+ int rc = SQLITE_NOMEM;
+ char *zSql;
+ sqlite3_stmt *pStmt = 0;
+
+ zSql = sqlite3_mprintf("PRAGMA %Q.page_size", zDb);
+ if( !zSql ){
+ return SQLITE_NOMEM;
+ }
+
+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
+ sqlite3_free(zSql);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ if( SQLITE_ROW==sqlite3_step(pStmt) ){
+ *piPageSize = sqlite3_column_int(pStmt, 0);
+ }
+ return sqlite3_finalize(pStmt);
+}
+
+/*
+** This function is the implementation of both the xConnect and xCreate
+** methods of the r-tree virtual table.
+**
+** argv[0] -> module name
+** argv[1] -> database name
+** argv[2] -> table name
+** argv[...] -> column names...
+*/
+static int rtreeInit(
+ sqlite3 *db, /* Database connection */
+ void *pAux, /* One of the RTREE_COORD_* constants */
+ int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */
+ sqlite3_vtab **ppVtab, /* OUT: New virtual table */
+ char **pzErr, /* OUT: Error message, if any */
+ int isCreate /* True for xCreate, false for xConnect */
+){
+ int rc = SQLITE_OK;
+ int iPageSize = 0;
+ Rtree *pRtree;
+ int nDb; /* Length of string argv[1] */
+ int nName; /* Length of string argv[2] */
+ int eCoordType = (int)pAux;
+
+ const char *aErrMsg[] = {
+ 0, /* 0 */
+ "Wrong number of columns for an rtree table", /* 1 */
+ "Too few columns for an rtree table", /* 2 */
+ "Too many columns for an rtree table" /* 3 */
+ };
+
+ int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
+ if( aErrMsg[iErr] ){
+ *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
+ return SQLITE_ERROR;
+ }
+
+ rc = getPageSize(db, argv[1], &iPageSize);
+ if( rc!=SQLITE_OK ){
+ return rc;
+ }
+
+ /* Allocate the sqlite3_vtab structure */
+ nDb = strlen(argv[1]);
+ nName = strlen(argv[2]);
+ pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2);
+ if( !pRtree ){
+ return SQLITE_NOMEM;
+ }
+ memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
+ pRtree->nBusy = 1;
+ pRtree->base.pModule = &rtreeModule;
+ pRtree->zDb = (char *)&pRtree[1];
+ pRtree->zName = &pRtree->zDb[nDb+1];
+ pRtree->nDim = (argc-4)/2;
+ pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2;
+ pRtree->eCoordType = eCoordType;
+ memcpy(pRtree->zDb, argv[1], nDb);
+ memcpy(pRtree->zName, argv[2], nName);
+
+ /* Figure out the node size to use. By default, use 64 bytes less than
+ ** the database page-size. This ensures that each node is stored on
+ ** a single database page.
+ **
+ ** If the databasd page-size is so large that more than RTREE_MAXCELLS
+ ** entries would fit in a single node, use a smaller node-size.
+ */
+ pRtree->iNodeSize = iPageSize-64;
+ if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
+ pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS;
+ }
+
+ /* Create/Connect to the underlying relational database schema. If
+ ** that is successful, call sqlite3_declare_vtab() to configure
+ ** the r-tree table schema.
+ */
+ if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ }else{
+ char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
+ char *zTmp;
+ int ii;
+ for(ii=4; zSql && ii<argc; ii++){
+ zTmp = zSql;
+ zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
+ sqlite3_free(zTmp);
+ }
+ if( zSql ){
+ zTmp = zSql;
+ zSql = sqlite3_mprintf("%s);", zTmp);
+ sqlite3_free(zTmp);
+ }
+ if( !zSql ){
+ rc = SQLITE_NOMEM;
+ }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
+ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
+ }
+ sqlite3_free(zSql);
+ }
+
+ if( rc==SQLITE_OK ){
+ *ppVtab = (sqlite3_vtab *)pRtree;
+ }else{
+ rtreeRelease(pRtree);
+ }
+ return rc;
+}
+
+
+/*
+** Implementation of a scalar function that decodes r-tree nodes to
+** human readable strings. This can be used for debugging and analysis.
+**
+** The scalar function takes two arguments, a blob of data containing
+** an r-tree node, and the number of dimensions the r-tree indexes.
+** For a two-dimensional r-tree structure called "rt", to deserialize
+** all nodes, a statement like:
+**
+** SELECT rtreenode(2, data) FROM rt_node;
+**
+** The human readable string takes the form of a Tcl list with one
+** entry for each cell in the r-tree node. Each entry is itself a
+** list, containing the 8-byte rowid/pageno followed by the
+** <num-dimension>*2 coordinates.
+*/
+static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
+ char *zText = 0;
+ RtreeNode node;
+ Rtree tree;
+ int ii;
+
+ memset(&node, 0, sizeof(RtreeNode));
+ memset(&tree, 0, sizeof(Rtree));
+ tree.nDim = sqlite3_value_int(apArg[0]);
+ tree.nBytesPerCell = 8 + 8 * tree.nDim;
+ node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
+
+ for(ii=0; ii<NCELL(&node); ii++){
+ char zCell[512];
+ int nCell = 0;
+ RtreeCell cell;
+ int jj;
+
+ nodeGetCell(&tree, &node, ii, &cell);
+ sqlite3_snprintf(512-nCell,&zCell[nCell],"%d", cell.iRowid);
+ nCell = strlen(zCell);
+ for(jj=0; jj<tree.nDim*2; jj++){
+ sqlite3_snprintf(512-nCell,&zCell[nCell]," %f",(double)cell.aCoord[jj].f);
+ nCell = strlen(zCell);
+ }
+
+ if( zText ){
+ char *zTextNew = sqlite3_mprintf("%s {%s}", zText, zCell);
+ sqlite3_free(zText);
+ zText = zTextNew;
+ }else{
+ zText = sqlite3_mprintf("{%s}", zCell);
+ }
+ }
+
+ sqlite3_result_text(ctx, zText, -1, sqlite3_free);
+}
+
+static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
+ if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB
+ || sqlite3_value_bytes(apArg[0])<2
+ ){
+ sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1);
+ }else{
+ u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]);
+ sqlite3_result_int(ctx, readInt16(zBlob));
+ }
+}
+
+/*
+** Register the r-tree module with database handle db. This creates the
+** virtual table module "rtree" and the debugging/analysis scalar
+** function "rtreenode".
+*/
+SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+
+ if( rc==SQLITE_OK ){
+ int utf8 = SQLITE_UTF8;
+ rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0);
+ }
+ if( rc==SQLITE_OK ){
+ int utf8 = SQLITE_UTF8;
+ rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
+ }
+ if( rc==SQLITE_OK ){
+ void *c = (void *)RTREE_COORD_REAL32;
+ rc = sqlite3_create_module_v2(db, "rtree", &rtreeModule, c, 0);
+ }
+ if( rc==SQLITE_OK ){
+ void *c = (void *)RTREE_COORD_INT32;
+ rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
+ }
+
+ return rc;
+}
+
+#if !SQLITE_CORE
+SQLITE_API int sqlite3_extension_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi)
+ return sqlite3RtreeInit(db);
+}
+#endif
+
+#endif
+
+/************** End of rtree.c ***********************************************/
+/************** Begin file icu.c *********************************************/
+/*
+** 2007 May 6
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $
+**
+** This file implements an integration between the ICU library
+** ("International Components for Unicode", an open-source library
+** for handling unicode data) and SQLite. The integration uses
+** ICU to provide the following to SQLite:
+**
+** * An implementation of the SQL regexp() function (and hence REGEXP
+** operator) using the ICU uregex_XX() APIs.
+**
+** * Implementations of the SQL scalar upper() and lower() functions
+** for case mapping.
+**
+** * Integration of ICU and SQLite collation seqences.
+**
+** * An implementation of the LIKE operator that uses ICU to
+** provide case-independent matching.
+*/
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
+
+/* Include ICU headers */
+#include <unicode/utypes.h>
+#include <unicode/uregex.h>
+#include <unicode/ustring.h>
+#include <unicode/ucol.h>
+
+
+#ifndef SQLITE_CORE
+ SQLITE_EXTENSION_INIT1
+#else
+#endif
+
+/*
+** Maximum length (in bytes) of the pattern in a LIKE or GLOB
+** operator.
+*/
+#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
+# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
+#endif
+
+/*
+** Version of sqlite3_free() that is always a function, never a macro.
+*/
+static void xFree(void *p){
+ sqlite3_free(p);
+}
+
+/*
+** Compare two UTF-8 strings for equality where the first string is
+** a "LIKE" expression. Return true (1) if they are the same and
+** false (0) if they are different.
+*/
+static int icuLikeCompare(
+ const uint8_t *zPattern, /* LIKE pattern */
+ const uint8_t *zString, /* The UTF-8 string to compare against */
+ const UChar32 uEsc /* The escape character */
+){
+ static const int MATCH_ONE = (UChar32)'_';
+ static const int MATCH_ALL = (UChar32)'%';
+
+ int iPattern = 0; /* Current byte index in zPattern */
+ int iString = 0; /* Current byte index in zString */
+
+ int prevEscape = 0; /* True if the previous character was uEsc */
+
+ while( zPattern[iPattern]!=0 ){
+
+ /* Read (and consume) the next character from the input pattern. */
+ UChar32 uPattern;
+ U8_NEXT_UNSAFE(zPattern, iPattern, uPattern);
+ assert(uPattern!=0);
+
+ /* There are now 4 possibilities:
+ **
+ ** 1. uPattern is an unescaped match-all character "%",
+ ** 2. uPattern is an unescaped match-one character "_",
+ ** 3. uPattern is an unescaped escape character, or
+ ** 4. uPattern is to be handled as an ordinary character
+ */
+ if( !prevEscape && uPattern==MATCH_ALL ){
+ /* Case 1. */
+ uint8_t c;
+
+ /* Skip any MATCH_ALL or MATCH_ONE characters that follow a
+ ** MATCH_ALL. For each MATCH_ONE, skip one character in the
+ ** test string.
+ */
+ while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){
+ if( c==MATCH_ONE ){
+ if( zString[iString]==0 ) return 0;
+ U8_FWD_1_UNSAFE(zString, iString);
+ }
+ iPattern++;
+ }
+
+ if( zPattern[iPattern]==0 ) return 1;
+
+ while( zString[iString] ){
+ if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){
+ return 1;
+ }
+ U8_FWD_1_UNSAFE(zString, iString);
+ }
+ return 0;
+
+ }else if( !prevEscape && uPattern==MATCH_ONE ){
+ /* Case 2. */
+ if( zString[iString]==0 ) return 0;
+ U8_FWD_1_UNSAFE(zString, iString);
+
+ }else if( !prevEscape && uPattern==uEsc){
+ /* Case 3. */
+ prevEscape = 1;
+
+ }else{
+ /* Case 4. */
+ UChar32 uString;
+ U8_NEXT_UNSAFE(zString, iString, uString);
+ uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT);
+ uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT);
+ if( uString!=uPattern ){
+ return 0;
+ }
+ prevEscape = 0;
+ }
+ }
+
+ return zString[iString]==0;
+}
+
+/*
+** Implementation of the like() SQL function. This function implements
+** the build-in LIKE operator. The first argument to the function is the
+** pattern and the second argument is the string. So, the SQL statements:
+**
+** A LIKE B
+**
+** is implemented as like(B, A). If there is an escape character E,
+**
+** A LIKE B ESCAPE E
+**
+** is mapped to like(B, A, E).
+*/
+static void icuLikeFunc(
+ sqlite3_context *context,
+ int argc,
+ sqlite3_value **argv
+){
+ const unsigned char *zA = sqlite3_value_text(argv[0]);
+ const unsigned char *zB = sqlite3_value_text(argv[1]);
+ UChar32 uEsc = 0;
+
+ /* Limit the length of the LIKE or GLOB pattern to avoid problems
+ ** of deep recursion and N*N behavior in patternCompare().
+ */
+ if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
+ sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
+ return;
+ }
+
+
+ if( argc==3 ){
+ /* The escape character string must consist of a single UTF-8 character.
+ ** Otherwise, return an error.
+ */
+ int nE= sqlite3_value_bytes(argv[2]);
+ const unsigned char *zE = sqlite3_value_text(argv[2]);
+ int i = 0;
+ if( zE==0 ) return;
+ U8_NEXT(zE, i, nE, uEsc);
+ if( i!=nE){
+ sqlite3_result_error(context,
+ "ESCAPE expression must be a single character", -1);
+ return;
+ }
+ }
+
+ if( zA && zB ){
+ sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc));
+ }
+}
+
+/*
+** This function is called when an ICU function called from within
+** the implementation of an SQL scalar function returns an error.
+**
+** The scalar function context passed as the first argument is
+** loaded with an error message based on the following two args.
+*/
+static void icuFunctionError(
+ sqlite3_context *pCtx, /* SQLite scalar function context */
+ const char *zName, /* Name of ICU function that failed */
+ UErrorCode e /* Error code returned by ICU function */
+){
+ char zBuf[128];
+ sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
+ zBuf[127] = '\0';
+ sqlite3_result_error(pCtx, zBuf, -1);
+}
+
+/*
+** Function to delete compiled regexp objects. Registered as
+** a destructor function with sqlite3_set_auxdata().
+*/
+static void icuRegexpDelete(void *p){
+ URegularExpression *pExpr = (URegularExpression *)p;
+ uregex_close(pExpr);
+}
+
+/*
+** Implementation of SQLite REGEXP operator. This scalar function takes
+** two arguments. The first is a regular expression pattern to compile
+** the second is a string to match against that pattern. If either
+** argument is an SQL NULL, then NULL Is returned. Otherwise, the result
+** is 1 if the string matches the pattern, or 0 otherwise.
+**
+** SQLite maps the regexp() function to the regexp() operator such
+** that the following two are equivalent:
+**
+** zString REGEXP zPattern
+** regexp(zPattern, zString)
+**
+** Uses the following ICU regexp APIs:
+**
+** uregex_open()
+** uregex_matches()
+** uregex_close()
+*/
+static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){
+ UErrorCode status = U_ZERO_ERROR;
+ URegularExpression *pExpr;
+ UBool res;
+ const UChar *zString = sqlite3_value_text16(apArg[1]);
+
+ /* If the left hand side of the regexp operator is NULL,
+ ** then the result is also NULL.
+ */
+ if( !zString ){
+ return;
+ }
+
+ pExpr = sqlite3_get_auxdata(p, 0);
+ if( !pExpr ){
+ const UChar *zPattern = sqlite3_value_text16(apArg[0]);
+ if( !zPattern ){
+ return;
+ }
+ pExpr = uregex_open(zPattern, -1, 0, 0, &status);
+
+ if( U_SUCCESS(status) ){
+ sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete);
+ }else{
+ assert(!pExpr);
+ icuFunctionError(p, "uregex_open", status);
+ return;
+ }
+ }
+
+ /* Configure the text that the regular expression operates on. */
+ uregex_setText(pExpr, zString, -1, &status);
+ if( !U_SUCCESS(status) ){
+ icuFunctionError(p, "uregex_setText", status);
+ return;
+ }
+
+ /* Attempt the match */
+ res = uregex_matches(pExpr, 0, &status);
+ if( !U_SUCCESS(status) ){
+ icuFunctionError(p, "uregex_matches", status);
+ return;
+ }
+
+ /* Set the text that the regular expression operates on to a NULL
+ ** pointer. This is not really necessary, but it is tidier than
+ ** leaving the regular expression object configured with an invalid
+ ** pointer after this function returns.
+ */
+ uregex_setText(pExpr, 0, 0, &status);
+
+ /* Return 1 or 0. */
+ sqlite3_result_int(p, res ? 1 : 0);
+}
+
+/*
+** Implementations of scalar functions for case mapping - upper() and
+** lower(). Function upper() converts its input to upper-case (ABC).
+** Function lower() converts to lower-case (abc).
+**
+** ICU provides two types of case mapping, "general" case mapping and
+** "language specific". Refer to ICU documentation for the differences
+** between the two.
+**
+** To utilise "general" case mapping, the upper() or lower() scalar
+** functions are invoked with one argument:
+**
+** upper('ABC') -> 'abc'
+** lower('abc') -> 'ABC'
+**
+** To access ICU "language specific" case mapping, upper() or lower()
+** should be invoked with two arguments. The second argument is the name
+** of the locale to use. Passing an empty string ("") or SQL NULL value
+** as the second argument is the same as invoking the 1 argument version
+** of upper() or lower().
+**
+** lower('I', 'en_us') -> 'i'
+** lower('I', 'tr_tr') -> 'ı' (small dotless i)
+**
+** http://www.icu-project.org/userguide/posix.html#case_mappings
+*/
+static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
+ const UChar *zInput;
+ UChar *zOutput;
+ int nInput;
+ int nOutput;
+
+ UErrorCode status = U_ZERO_ERROR;
+ const char *zLocale = 0;
+
+ assert(nArg==1 || nArg==2);
+ if( nArg==2 ){
+ zLocale = (const char *)sqlite3_value_text(apArg[1]);
+ }
+
+ zInput = sqlite3_value_text16(apArg[0]);
+ if( !zInput ){
+ return;
+ }
+ nInput = sqlite3_value_bytes16(apArg[0]);
+
+ nOutput = nInput * 2 + 2;
+ zOutput = sqlite3_malloc(nOutput);
+ if( !zOutput ){
+ return;
+ }
+
+ if( sqlite3_user_data(p) ){
+ u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status);
+ }else{
+ u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status);
+ }
+
+ if( !U_SUCCESS(status) ){
+ icuFunctionError(p, "u_strToLower()/u_strToUpper", status);
+ return;
+ }
+
+ sqlite3_result_text16(p, zOutput, -1, xFree);
+}
+
+/*
+** Collation sequence destructor function. The pCtx argument points to
+** a UCollator structure previously allocated using ucol_open().
+*/
+static void icuCollationDel(void *pCtx){
+ UCollator *p = (UCollator *)pCtx;
+ ucol_close(p);
+}
+
+/*
+** Collation sequence comparison function. The pCtx argument points to
+** a UCollator structure previously allocated using ucol_open().
+*/
+static int icuCollationColl(
+ void *pCtx,
+ int nLeft,
+ const void *zLeft,
+ int nRight,
+ const void *zRight
+){
+ UCollationResult res;
+ UCollator *p = (UCollator *)pCtx;
+ res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2);
+ switch( res ){
+ case UCOL_LESS: return -1;
+ case UCOL_GREATER: return +1;
+ case UCOL_EQUAL: return 0;
+ }
+ assert(!"Unexpected return value from ucol_strcoll()");
+ return 0;
+}
+
+/*
+** Implementation of the scalar function icu_load_collation().
+**
+** This scalar function is used to add ICU collation based collation
+** types to an SQLite database connection. It is intended to be called
+** as follows:
+**
+** SELECT icu_load_collation(<locale>, <collation-name>);
+**
+** Where <locale> is a string containing an ICU locale identifier (i.e.
+** "en_AU", "tr_TR" etc.) and <collation-name> is the name of the
+** collation sequence to create.
+*/
+static void icuLoadCollation(
+ sqlite3_context *p,
+ int nArg,
+ sqlite3_value **apArg
+){
+ sqlite3 *db = (sqlite3 *)sqlite3_user_data(p);
+ UErrorCode status = U_ZERO_ERROR;
+ const char *zLocale; /* Locale identifier - (eg. "jp_JP") */
+ const char *zName; /* SQL Collation sequence name (eg. "japanese") */
+ UCollator *pUCollator; /* ICU library collation object */
+ int rc; /* Return code from sqlite3_create_collation_x() */
+
+ assert(nArg==2);
+ zLocale = (const char *)sqlite3_value_text(apArg[0]);
+ zName = (const char *)sqlite3_value_text(apArg[1]);
+
+ if( !zLocale || !zName ){
+ return;
+ }
+
+ pUCollator = ucol_open(zLocale, &status);
+ if( !U_SUCCESS(status) ){
+ icuFunctionError(p, "ucol_open", status);
+ return;
+ }
+ assert(p);
+
+ rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator,
+ icuCollationColl, icuCollationDel
+ );
+ if( rc!=SQLITE_OK ){
+ ucol_close(pUCollator);
+ sqlite3_result_error(p, "Error registering collation function", -1);
+ }
+}
+
+/*
+** Register the ICU extension functions with database db.
+*/
+SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
+ struct IcuScalar {
+ const char *zName; /* Function name */
+ int nArg; /* Number of arguments */
+ int enc; /* Optimal text encoding */
+ void *pContext; /* sqlite3_user_data() context */
+ void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
+ } scalars[] = {
+ {"regexp",-1, SQLITE_ANY, 0, icuRegexpFunc},
+
+ {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16},
+ {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16},
+ {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16},
+ {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16},
+
+ {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16},
+ {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16},
+ {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16},
+ {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16},
+
+ {"like", 2, SQLITE_UTF8, 0, icuLikeFunc},
+ {"like", 3, SQLITE_UTF8, 0, icuLikeFunc},
+
+ {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation},
+ };
+
+ int rc = SQLITE_OK;
+ int i;
+
+ for(i=0; rc==SQLITE_OK && i<(sizeof(scalars)/sizeof(struct IcuScalar)); i++){
+ struct IcuScalar *p = &scalars[i];
+ rc = sqlite3_create_function(
+ db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0
+ );
+ }
+
+ return rc;
+}
+
+#if !SQLITE_CORE
+SQLITE_API int sqlite3_extension_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi)
+ return sqlite3IcuInit(db);
+}
+#endif
+
+#endif
+
+/************** End of icu.c *************************************************/
+/************** Begin file fts3_icu.c ****************************************/
+/*
+** 2007 June 22
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file implements a tokenizer for fts3 based on the ICU library.
+**
+** $Id: fts3_icu.c,v 1.3 2008/09/01 18:34:20 danielk1977 Exp $
+*/
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
+#ifdef SQLITE_ENABLE_ICU
+
+
+#include <unicode/ubrk.h>
+#include <unicode/utf16.h>
+
+typedef struct IcuTokenizer IcuTokenizer;
+typedef struct IcuCursor IcuCursor;
+
+struct IcuTokenizer {
+ sqlite3_tokenizer base;
+ char *zLocale;
+};
+
+struct IcuCursor {
+ sqlite3_tokenizer_cursor base;
+
+ UBreakIterator *pIter; /* ICU break-iterator object */
+ int nChar; /* Number of UChar elements in pInput */
+ UChar *aChar; /* Copy of input using utf-16 encoding */
+ int *aOffset; /* Offsets of each character in utf-8 input */
+
+ int nBuffer;
+ char *zBuffer;
+
+ int iToken;
+};
+
+/*
+** Create a new tokenizer instance.
+*/
+static int icuCreate(
+ int argc, /* Number of entries in argv[] */
+ const char * const *argv, /* Tokenizer creation arguments */
+ sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */
+){
+ IcuTokenizer *p;
+ int n = 0;
+
+ if( argc>0 ){
+ n = strlen(argv[0])+1;
+ }
+ p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n);
+ if( !p ){
+ return SQLITE_NOMEM;
+ }
+ memset(p, 0, sizeof(IcuTokenizer));
+
+ if( n ){
+ p->zLocale = (char *)&p[1];
+ memcpy(p->zLocale, argv[0], n);
+ }
+
+ *ppTokenizer = (sqlite3_tokenizer *)p;
+
+ return SQLITE_OK;
+}
+
+/*
+** Destroy a tokenizer
+*/
+static int icuDestroy(sqlite3_tokenizer *pTokenizer){
+ IcuTokenizer *p = (IcuTokenizer *)pTokenizer;
+ sqlite3_free(p);
+ return SQLITE_OK;
+}
+
+/*
+** Prepare to begin tokenizing a particular string. The input
+** string to be tokenized is pInput[0..nBytes-1]. A cursor
+** used to incrementally tokenize this string is returned in
+** *ppCursor.
+*/
+static int icuOpen(
+ sqlite3_tokenizer *pTokenizer, /* The tokenizer */
+ const char *zInput, /* Input string */
+ int nInput, /* Length of zInput in bytes */
+ sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */
+){
+ IcuTokenizer *p = (IcuTokenizer *)pTokenizer;
+ IcuCursor *pCsr;
+
+ const int32_t opt = U_FOLD_CASE_DEFAULT;
+ UErrorCode status = U_ZERO_ERROR;
+ int nChar;
+
+ UChar32 c;
+ int iInput = 0;
+ int iOut = 0;
+
+ *ppCursor = 0;
+
+ if( nInput<0 ){
+ nInput = strlen(zInput);
+ }
+ nChar = nInput+1;
+ pCsr = (IcuCursor *)sqlite3_malloc(
+ sizeof(IcuCursor) + /* IcuCursor */
+ nChar * sizeof(UChar) + /* IcuCursor.aChar[] */
+ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */
+ );
+ if( !pCsr ){
+ return SQLITE_NOMEM;
+ }
+ memset(pCsr, 0, sizeof(IcuCursor));
+ pCsr->aChar = (UChar *)&pCsr[1];
+ pCsr->aOffset = (int *)&pCsr->aChar[nChar];
+
+ pCsr->aOffset[iOut] = iInput;
+ U8_NEXT(zInput, iInput, nInput, c);
+ while( c>0 ){
+ int isError = 0;
+ c = u_foldCase(c, opt);
+ U16_APPEND(pCsr->aChar, iOut, nChar, c, isError);
+ if( isError ){
+ sqlite3_free(pCsr);
+ return SQLITE_ERROR;
+ }
+ pCsr->aOffset[iOut] = iInput;
+
+ if( iInput<nInput ){
+ U8_NEXT(zInput, iInput, nInput, c);
+ }else{
+ c = 0;
+ }
+ }
+
+ pCsr->pIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status);
+ if( !U_SUCCESS(status) ){
+ sqlite3_free(pCsr);
+ return SQLITE_ERROR;
+ }
+ pCsr->nChar = iOut;
+
+ ubrk_first(pCsr->pIter);
+ *ppCursor = (sqlite3_tokenizer_cursor *)pCsr;
+ return SQLITE_OK;
+}
+
+/*
+** Close a tokenization cursor previously opened by a call to icuOpen().
+*/
+static int icuClose(sqlite3_tokenizer_cursor *pCursor){
+ IcuCursor *pCsr = (IcuCursor *)pCursor;
+ ubrk_close(pCsr->pIter);
+ sqlite3_free(pCsr->zBuffer);
+ sqlite3_free(pCsr);
+ return SQLITE_OK;
+}
+
+/*
+** Extract the next token from a tokenization cursor.
+*/
+static int icuNext(
+ sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */
+ const char **ppToken, /* OUT: *ppToken is the token text */
+ int *pnBytes, /* OUT: Number of bytes in token */
+ int *piStartOffset, /* OUT: Starting offset of token */
+ int *piEndOffset, /* OUT: Ending offset of token */
+ int *piPosition /* OUT: Position integer of token */
+){
+ IcuCursor *pCsr = (IcuCursor *)pCursor;
+
+ int iStart = 0;
+ int iEnd = 0;
+ int nByte = 0;
+
+ while( iStart==iEnd ){
+ UChar32 c;
+
+ iStart = ubrk_current(pCsr->pIter);
+ iEnd = ubrk_next(pCsr->pIter);
+ if( iEnd==UBRK_DONE ){
+ return SQLITE_DONE;
+ }
+
+ while( iStart<iEnd ){
+ int iWhite = iStart;
+ U8_NEXT(pCsr->aChar, iWhite, pCsr->nChar, c);
+ if( u_isspace(c) ){
+ iStart = iWhite;
+ }else{
+ break;
+ }
+ }
+ assert(iStart<=iEnd);
+ }
+
+ do {
+ UErrorCode status = U_ZERO_ERROR;
+ if( nByte ){
+ char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte);
+ if( !zNew ){
+ return SQLITE_NOMEM;
+ }
+ pCsr->zBuffer = zNew;
+ pCsr->nBuffer = nByte;
+ }
+
+ u_strToUTF8(
+ pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */
+ &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */
+ &status /* Output success/failure */
+ );
+ } while( nByte>pCsr->nBuffer );
+
+ *ppToken = pCsr->zBuffer;
+ *pnBytes = nByte;
+ *piStartOffset = pCsr->aOffset[iStart];
+ *piEndOffset = pCsr->aOffset[iEnd];
+ *piPosition = pCsr->iToken++;
+
+ return SQLITE_OK;
+}
+
+/*
+** The set of routines that implement the simple tokenizer
+*/
+static const sqlite3_tokenizer_module icuTokenizerModule = {
+ 0, /* iVersion */
+ icuCreate, /* xCreate */
+ icuDestroy, /* xCreate */
+ icuOpen, /* xOpen */
+ icuClose, /* xClose */
+ icuNext, /* xNext */
+};
+
+/*
+** Set *ppModule to point at the implementation of the ICU tokenizer.
+*/
+SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(
+ sqlite3_tokenizer_module const**ppModule
+){
+ *ppModule = &icuTokenizerModule;
+}
+
+#endif /* defined(SQLITE_ENABLE_ICU) */
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
+
+/************** End of fts3_icu.c ********************************************/
diff --git a/src/3rdparty/sqlite/sqlite3.h b/src/3rdparty/sqlite/sqlite3.h
index a492b6d..5216154 100644
--- a/src/3rdparty/sqlite/sqlite3.h
+++ b/src/3rdparty/sqlite/sqlite3.h
@@ -17,9 +17,9 @@
**
** Some of the definitions that are in this file are marked as
** "experimental". Experimental interfaces are normally new
-** features recently added to SQLite. We do not anticipate changes
-** to experimental interfaces but reserve to make minor changes if
-** experience from use "in the wild" suggest such changes are prudent.
+** features recently added to SQLite. We do not anticipate changes
+** to experimental interfaces but reserve the right to make minor changes
+** if experience from use "in the wild" suggest such changes are prudent.
**
** The official C-language API documentation for SQLite is derived
** from comments in this file. This file is the authoritative source
@@ -29,8 +29,6 @@
** The makefile makes some minor changes to this file (such as inserting
** the version number) and changes its name to "sqlite3.h" as
** part of the build process.
-**
-** @(#) $Id: sqlite.h.in,v 1.312 2008/05/12 12:39:56 drh Exp $
*/
#ifndef _SQLITE3_H_
#define _SQLITE3_H_
@@ -51,9 +49,29 @@ extern "C" {
# define SQLITE_EXTERN extern
#endif
+#ifndef SQLITE_API
+# define SQLITE_API
+#endif
+
+
/*
-** Make sure these symbols where not defined by some previous header
-** file.
+** These no-op macros are used in front of interfaces to mark those
+** interfaces as either deprecated or experimental. New applications
+** should not use deprecated interfaces - they are support for backwards
+** compatibility only. Application writers should be aware that
+** experimental interfaces are subject to change in point releases.
+**
+** These macros used to resolve to various kinds of compiler magic that
+** would generate warning messages when they were used. But that
+** compiler magic ended up generating such a flurry of bug reports
+** that we have taken it all out and gone back to using simple
+** noop macros.
+*/
+#define SQLITE_DEPRECATED
+#define SQLITE_EXPERIMENTAL
+
+/*
+** Ensure these symbols were not defined by some previous header file.
*/
#ifdef SQLITE_VERSION
# undef SQLITE_VERSION
@@ -63,130 +81,143 @@ extern "C" {
#endif
/*
-** CAPI3REF: Compile-Time Library Version Numbers {F10010}
+** CAPI3REF: Compile-Time Library Version Numbers {H10010} <S60100>
**
** The SQLITE_VERSION and SQLITE_VERSION_NUMBER #defines in
** the sqlite3.h file specify the version of SQLite with which
** that header file is associated.
**
-** The "version" of SQLite is a string of the form "X.Y.Z".
-** The phrase "alpha" or "beta" might be appended after the Z.
-** The X value is major version number always 3 in SQLite3.
-** The X value only changes when backwards compatibility is
-** broken and we intend to never break
-** backwards compatibility. The Y value is the minor version
-** number and only changes when
+** The "version" of SQLite is a string of the form "W.X.Y" or "W.X.Y.Z".
+** The W value is major version number and is always 3 in SQLite3.
+** The W value only changes when backwards compatibility is
+** broken and we intend to never break backwards compatibility.
+** The X value is the minor version number and only changes when
** there are major feature enhancements that are forwards compatible
-** but not backwards compatible. The Z value is release number
-** and is incremented with
-** each release but resets back to 0 when Y is incremented.
+** but not backwards compatible.
+** The Y value is the release number and is incremented with
+** each release but resets back to 0 whenever X is incremented.
+** The Z value only appears on branch releases.
**
-** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()].
+** The SQLITE_VERSION_NUMBER is an integer that is computed as
+** follows:
**
-** INVARIANTS:
+** <blockquote><pre>
+** SQLITE_VERSION_NUMBER = W*1000000 + X*1000 + Y
+** </pre></blockquote>
+**
+** Since version 3.6.18, SQLite source code has been stored in the
+** <a href="http://www.fossil-scm.org/">fossil configuration management
+** system</a>. The SQLITE_SOURCE_ID
+** macro is a string which identifies a particular check-in of SQLite
+** within its configuration management system. The string contains the
+** date and time of the check-in (UTC) and an SHA1 hash of the entire
+** source tree.
**
-** {F10011} The SQLITE_VERSION #define in the sqlite3.h header file
-** evaluates to a string literal that is the SQLite version
-** with which the header file is associated.
+** See also: [sqlite3_libversion()],
+** [sqlite3_libversion_number()], [sqlite3_sourceid()],
+** [sqlite_version()] and [sqlite_source_id()].
**
-** {F10014} The SQLITE_VERSION_NUMBER #define resolves to an integer
-** with the value (X*1000000 + Y*1000 + Z) where X, Y, and
-** Z are the major version, minor version, and release number.
+** Requirements: [H10011] [H10014]
*/
-#define SQLITE_VERSION "3.5.9"
-#define SQLITE_VERSION_NUMBER 3005009
+#define SQLITE_VERSION "3.6.19"
+#define SQLITE_VERSION_NUMBER 3006019
+#define SQLITE_SOURCE_ID "2009-10-14 11:33:55 c1d499afc50d54b376945b4efb65c56c787a073d"
/*
-** CAPI3REF: Run-Time Library Version Numbers {F10020}
+** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
** KEYWORDS: sqlite3_version
**
-** These features provide the same information as the [SQLITE_VERSION]
-** and [SQLITE_VERSION_NUMBER] #defines in the header, but are associated
-** with the library instead of the header file. Cautious programmers might
-** include a check in their application to verify that
-** sqlite3_libversion_number() always returns the value
-** [SQLITE_VERSION_NUMBER].
+** These interfaces provide the same information as the [SQLITE_VERSION],
+** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] #defines in the header,
+** but are associated with the library instead of the header file. Cautious
+** programmers might include assert() statements in their application to
+** verify that values returned by these interfaces match the macros in
+** the header, and thus insure that the application is
+** compiled with matching library and header files.
+**
+** <blockquote><pre>
+** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
+** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
+** assert( strcmp(sqlite3_libversion,SQLITE_VERSION)==0 );
+** </pre></blockquote>
**
** The sqlite3_libversion() function returns the same information as is
** in the sqlite3_version[] string constant. The function is provided
** for use in DLLs since DLL users usually do not have direct access to string
-** constants within the DLL.
-**
-** INVARIANTS:
+** constants within the DLL. Similarly, the sqlite3_sourceid() function
+** returns the same information as is in the [SQLITE_SOURCE_ID] #define of
+** the header file.
**
-** {F10021} The [sqlite3_libversion_number()] interface returns an integer
-** equal to [SQLITE_VERSION_NUMBER].
+** See also: [sqlite_version()] and [sqlite_source_id()].
**
-** {F10022} The [sqlite3_version] string constant contains the text of the
-** [SQLITE_VERSION] string.
-**
-** {F10023} The [sqlite3_libversion()] function returns
-** a pointer to the [sqlite3_version] string constant.
+** Requirements: [H10021] [H10022] [H10023]
*/
-SQLITE_EXTERN const char sqlite3_version[];
-const char *sqlite3_libversion(void);
-int sqlite3_libversion_number(void);
+SQLITE_API SQLITE_EXTERN const char sqlite3_version[];
+SQLITE_API const char *sqlite3_libversion(void);
+SQLITE_API const char *sqlite3_sourceid(void);
+SQLITE_API int sqlite3_libversion_number(void);
/*
-** CAPI3REF: Test To See If The Library Is Threadsafe {F10100}
+** CAPI3REF: Test To See If The Library Is Threadsafe {H10100} <S60100>
**
** SQLite can be compiled with or without mutexes. When
-** the SQLITE_THREADSAFE C preprocessor macro is true, mutexes
-** are enabled and SQLite is threadsafe. When that macro is false,
+** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes
+** are enabled and SQLite is threadsafe. When the
+** [SQLITE_THREADSAFE] macro is 0,
** the mutexes are omitted. Without the mutexes, it is not safe
-** to use SQLite from more than one thread.
+** to use SQLite concurrently from more than one thread.
**
-** There is a measurable performance penalty for enabling mutexes.
+** Enabling mutexes incurs a measurable performance penalty.
** So if speed is of utmost importance, it makes sense to disable
** the mutexes. But for maximum safety, mutexes should be enabled.
** The default behavior is for mutexes to be enabled.
**
-** This interface can be used by a program to make sure that the
+** This interface can be used by an application to make sure that the
** version of SQLite that it is linking against was compiled with
-** the desired setting of the SQLITE_THREADSAFE macro.
+** the desired setting of the [SQLITE_THREADSAFE] macro.
+**
+** This interface only reports on the compile-time mutex setting
+** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with
+** SQLITE_THREADSAFE=1 then mutexes are enabled by default but
+** can be fully or partially disabled using a call to [sqlite3_config()]
+** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD],
+** or [SQLITE_CONFIG_MUTEX]. The return value of this function shows
+** only the default compile-time setting, not any run-time changes
+** to that setting.
**
-** INVARIANTS:
+** See the [threading mode] documentation for additional information.
**
-** {F10101} The [sqlite3_threadsafe()] function returns nonzero if
-** SQLite was compiled with its mutexes enabled or zero
-** if SQLite was compiled with mutexes disabled.
+** Requirements: [H10101] [H10102]
*/
-int sqlite3_threadsafe(void);
+SQLITE_API int sqlite3_threadsafe(void);
/*
-** CAPI3REF: Database Connection Handle {F12000}
+** CAPI3REF: Database Connection Handle {H12000} <S40200>
** KEYWORDS: {database connection} {database connections}
**
-** Each open SQLite database is represented by pointer to an instance of the
-** opaque structure named "sqlite3". It is useful to think of an sqlite3
+** Each open SQLite database is represented by a pointer to an instance of
+** the opaque structure named "sqlite3". It is useful to think of an sqlite3
** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces are its constructors
-** and [sqlite3_close()] is its destructor. There are many other interfaces
-** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and
-** [sqlite3_busy_timeout()] to name but three) that are methods on this
-** object.
+** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()]
+** is its destructor. There are many other interfaces (such as
+** [sqlite3_prepare_v2()], [sqlite3_create_function()], and
+** [sqlite3_busy_timeout()] to name but three) that are methods on an
+** sqlite3 object.
*/
typedef struct sqlite3 sqlite3;
-
/*
-** CAPI3REF: 64-Bit Integer Types {F10200}
+** CAPI3REF: 64-Bit Integer Types {H10200} <S10110>
** KEYWORDS: sqlite_int64 sqlite_uint64
**
** Because there is no cross-platform way to specify 64-bit integer types
** SQLite includes typedefs for 64-bit signed and unsigned integers.
**
-** The sqlite3_int64 and sqlite3_uint64 are the preferred type
-** definitions. The sqlite_int64 and sqlite_uint64 types are
-** supported for backwards compatibility only.
-**
-** INVARIANTS:
+** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions.
+** The sqlite_int64 and sqlite_uint64 types are supported for backwards
+** compatibility only.
**
-** {F10201} The [sqlite_int64] and [sqlite3_int64] types specify a
-** 64-bit signed integer.
-**
-** {F10202} The [sqlite_uint64] and [sqlite3_uint64] types specify
-** a 64-bit unsigned integer.
+** Requirements: [H10201] [H10202]
*/
#ifdef SQLITE_INT64_TYPE
typedef SQLITE_INT64_TYPE sqlite_int64;
@@ -203,52 +234,43 @@ typedef sqlite_uint64 sqlite3_uint64;
/*
** If compiling for a processor that lacks floating point support,
-** substitute integer for floating-point
+** substitute integer for floating-point.
*/
#ifdef SQLITE_OMIT_FLOATING_POINT
# define double sqlite3_int64
#endif
/*
-** CAPI3REF: Closing A Database Connection {F12010}
-**
-** This routine is the destructor for the [sqlite3] object.
-**
-** Applications should [sqlite3_finalize | finalize] all
-** [prepared statements] and
-** [sqlite3_blob_close | close] all [sqlite3_blob | BLOBs]
-** associated with the [sqlite3] object prior
-** to attempting to close the [sqlite3] object.
-**
-** <todo>What happens to pending transactions? Are they
-** rolled back, or abandoned?</todo>
-**
-** INVARIANTS:
-**
-** {F12011} The [sqlite3_close()] interface destroys an [sqlite3] object
-** allocated by a prior call to [sqlite3_open()],
-** [sqlite3_open16()], or [sqlite3_open_v2()].
+** CAPI3REF: Closing A Database Connection {H12010} <S30100><S40200>
**
-** {F12012} The [sqlite3_close()] function releases all memory used by the
-** connection and closes all open files.
+** This routine is the destructor for the [sqlite3] object.
**
-** {F12013} If the database connection contains
-** [prepared statements] that have not been
-** finalized by [sqlite3_finalize()], then [sqlite3_close()]
-** returns [SQLITE_BUSY] and leaves the connection open.
+** Applications should [sqlite3_finalize | finalize] all [prepared statements]
+** and [sqlite3_blob_close | close] all [BLOB handles] associated with
+** the [sqlite3] object prior to attempting to close the object.
+** The [sqlite3_next_stmt()] interface can be used to locate all
+** [prepared statements] associated with a [database connection] if desired.
+** Typical code might look like this:
**
-** {F12014} Giving sqlite3_close() a NULL pointer is a harmless no-op.
+** <blockquote><pre>
+** sqlite3_stmt *pStmt;
+** while( (pStmt = sqlite3_next_stmt(db, 0))!=0 ){
+** &nbsp; sqlite3_finalize(pStmt);
+** }
+** </pre></blockquote>
**
-** LIMITATIONS:
+** If [sqlite3_close()] is invoked while a transaction is open,
+** the transaction is automatically rolled back.
**
-** {U12015} The parameter to [sqlite3_close()] must be an [sqlite3] object
-** pointer previously obtained from [sqlite3_open()] or the
-** equivalent, or NULL.
+** The C parameter to [sqlite3_close(C)] must be either a NULL
+** pointer or an [sqlite3] object pointer obtained
+** from [sqlite3_open()], [sqlite3_open16()], or
+** [sqlite3_open_v2()], and not previously closed.
**
-** {U12016} The parameter to [sqlite3_close()] must not have been previously
-** closed.
+** Requirements:
+** [H12011] [H12012] [H12013] [H12014] [H12015] [H12019]
*/
-int sqlite3_close(sqlite3 *);
+SQLITE_API int sqlite3_close(sqlite3 *);
/*
** The type for a callback function.
@@ -258,115 +280,67 @@ int sqlite3_close(sqlite3 *);
typedef int (*sqlite3_callback)(void*,int,char**, char**);
/*
-** CAPI3REF: One-Step Query Execution Interface {F12100}
-**
-** The sqlite3_exec() interface is a convenient way of running
-** one or more SQL statements without a lot of C code. The
-** SQL statements are passed in as the second parameter to
-** sqlite3_exec(). The statements are evaluated one by one
-** until either an error or an interrupt is encountered or
-** until they are all done. The 3rd parameter is an optional
-** callback that is invoked once for each row of any query results
-** produced by the SQL statements. The 5th parameter tells where
+** CAPI3REF: One-Step Query Execution Interface {H12100} <S10000>
+**
+** The sqlite3_exec() interface is a convenient way of running one or more
+** SQL statements without having to write a lot of C code. The UTF-8 encoded
+** SQL statements are passed in as the second parameter to sqlite3_exec().
+** The statements are evaluated one by one until either an error or
+** an interrupt is encountered, or until they are all done. The 3rd parameter
+** is an optional callback that is invoked once for each row of any query
+** results produced by the SQL statements. The 5th parameter tells where
** to write any error messages.
**
+** The error message passed back through the 5th parameter is held
+** in memory obtained from [sqlite3_malloc()]. To avoid a memory leak,
+** the calling application should call [sqlite3_free()] on any error
+** message returned through the 5th parameter when it has finished using
+** the error message.
+**
+** If the SQL statement in the 2nd parameter is NULL or an empty string
+** or a string containing only whitespace and comments, then no SQL
+** statements are evaluated and the database is not changed.
+**
** The sqlite3_exec() interface is implemented in terms of
** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()].
-** The sqlite3_exec() routine does nothing that cannot be done
+** The sqlite3_exec() routine does nothing to the database that cannot be done
** by [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()].
-** The sqlite3_exec() is just a convenient wrapper.
-**
-** INVARIANTS:
-**
-** {F12101} The [sqlite3_exec()] interface evaluates zero or more UTF-8
-** encoded, semicolon-separated, SQL statements in the
-** zero-terminated string of its 2nd parameter within the
-** context of the [sqlite3] object given in the 1st parameter.
-**
-** {F12104} The return value of [sqlite3_exec()] is SQLITE_OK if all
-** SQL statements run successfully.
**
-** {F12105} The return value of [sqlite3_exec()] is an appropriate
-** non-zero error code if any SQL statement fails.
+** The first parameter to [sqlite3_exec()] must be an valid and open
+** [database connection].
**
-** {F12107} If one or more of the SQL statements handed to [sqlite3_exec()]
-** return results and the 3rd parameter is not NULL, then
-** the callback function specified by the 3rd parameter is
-** invoked once for each row of result.
+** The database connection must not be closed while
+** [sqlite3_exec()] is running.
**
-** {F12110} If the callback returns a non-zero value then [sqlite3_exec()]
-** will aborted the SQL statement it is currently evaluating,
-** skip all subsequent SQL statements, and return [SQLITE_ABORT].
-** <todo>What happens to *errmsg here? Does the result code for
-** sqlite3_errcode() get set?</todo>
+** The calling function should use [sqlite3_free()] to free
+** the memory that *errmsg is left pointing at once the error
+** message is no longer needed.
**
-** {F12113} The [sqlite3_exec()] routine will pass its 4th parameter through
-** as the 1st parameter of the callback.
+** The SQL statement text in the 2nd parameter to [sqlite3_exec()]
+** must remain unchanged while [sqlite3_exec()] is running.
**
-** {F12116} The [sqlite3_exec()] routine sets the 2nd parameter of its
-** callback to be the number of columns in the current row of
-** result.
-**
-** {F12119} The [sqlite3_exec()] routine sets the 3rd parameter of its
-** callback to be an array of pointers to strings holding the
-** values for each column in the current result set row as
-** obtained from [sqlite3_column_text()].
-**
-** {F12122} The [sqlite3_exec()] routine sets the 4th parameter of its
-** callback to be an array of pointers to strings holding the
-** names of result columns as obtained from [sqlite3_column_name()].
-**
-** {F12125} If the 3rd parameter to [sqlite3_exec()] is NULL then
-** [sqlite3_exec()] never invokes a callback. All query
-** results are silently discarded.
-**
-** {F12128} If an error occurs while parsing or evaluating any of the SQL
-** statements handed to [sqlite3_exec()] then [sqlite3_exec()] will
-** return an [error code] other than [SQLITE_OK].
-**
-** {F12131} If an error occurs while parsing or evaluating any of the SQL
-** handed to [sqlite3_exec()] and if the 5th parameter (errmsg)
-** to [sqlite3_exec()] is not NULL, then an error message is
-** allocated using the equivalent of [sqlite3_mprintf()] and
-** *errmsg is made to point to that message.
-**
-** {F12134} The [sqlite3_exec()] routine does not change the value of
-** *errmsg if errmsg is NULL or if there are no errors.
-**
-** {F12137} The [sqlite3_exec()] function sets the error code and message
-** accessible via [sqlite3_errcode()], [sqlite3_errmsg()], and
-** [sqlite3_errmsg16()].
-**
-** LIMITATIONS:
-**
-** {U12141} The first parameter to [sqlite3_exec()] must be an valid and open
-** [database connection].
-**
-** {U12142} The database connection must not be closed while
-** [sqlite3_exec()] is running.
-**
-** {U12143} The calling function is should use [sqlite3_free()] to free
-** the memory that *errmsg is left pointing at once the error
-** message is no longer needed.
-**
-** {U12145} The SQL statement text in the 2nd parameter to [sqlite3_exec()]
-** must remain unchanged while [sqlite3_exec()] is running.
+** Requirements:
+** [H12101] [H12102] [H12104] [H12105] [H12107] [H12110] [H12113] [H12116]
+** [H12119] [H12122] [H12125] [H12131] [H12134] [H12137] [H12138]
*/
-int sqlite3_exec(
+SQLITE_API int sqlite3_exec(
sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluted */
+ const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
/*
-** CAPI3REF: Result Codes {F10210}
+** CAPI3REF: Result Codes {H10210} <S10700>
** KEYWORDS: SQLITE_OK {error code} {error codes}
+** KEYWORDS: {result code} {result codes}
**
** Many SQLite functions return an integer result code from the set shown
** here in order to indicates success or failure.
**
+** New error codes may be added in future versions of SQLite.
+**
** See also: [SQLITE_IOERR_READ | extended result codes]
*/
#define SQLITE_OK 0 /* Successful result */
@@ -402,20 +376,20 @@ int sqlite3_exec(
/* end-of-error-codes */
/*
-** CAPI3REF: Extended Result Codes {F10220}
+** CAPI3REF: Extended Result Codes {H10220} <S10700>
** KEYWORDS: {extended error code} {extended error codes}
-** KEYWORDS: {extended result codes}
+** KEYWORDS: {extended result code} {extended result codes}
**
** In its default configuration, SQLite API routines return one of 26 integer
-** [SQLITE_OK | result codes]. However, experience has shown that
-** many of these result codes are too course-grained. They do not provide as
+** [SQLITE_OK | result codes]. However, experience has shown that many of
+** these result codes are too coarse-grained. They do not provide as
** much information about problems as programmers might like. In an effort to
** address this, newer versions of SQLite (version 3.3.8 and later) include
** support for additional result codes that provide more detailed information
** about errors. The extended result codes are enabled or disabled
-** for each database connection using the [sqlite3_extended_result_codes()]
-** API.
-**
+** on a per database connection basis using the
+** [sqlite3_extended_result_codes()] API.
+**
** Some of the available extended result codes are listed here.
** One may expect the number of extended result codes will be expand
** over time. Software that uses extended result codes should expect
@@ -423,56 +397,53 @@ int sqlite3_exec(
**
** The SQLITE_OK result code will never be extended. It will always
** be exactly zero.
-**
-** INVARIANTS:
-**
-** {F10223} The symbolic name for an extended result code always contains
-** a related primary result code as a prefix.
-**
-** {F10224} Primary result code names contain a single "_" character.
-**
-** {F10225} Extended result code names contain two or more "_" characters.
-**
-** {F10226} The numeric value of an extended result code contains the
-** numeric value of its corresponding primary result code in
-** its least significant 8 bits.
*/
-#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
-#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
-#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
-#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
-#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
-#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
-#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
-#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
-#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
-#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
-#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
-#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
+#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
+#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
+#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
+#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
+#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
+#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
+#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
+#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
+#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
+#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
+#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
+#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
+#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
+#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
+#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
+#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
+#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
+#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) )
/*
-** CAPI3REF: Flags For File Open Operations {F10230}
+** CAPI3REF: Flags For File Open Operations {H10230} <H11120> <H12700>
**
** These bit values are intended for use in the
** 3rd parameter to the [sqlite3_open_v2()] interface and
** in the 4th parameter to the xOpen method of the
** [sqlite3_vfs] object.
*/
-#define SQLITE_OPEN_READONLY 0x00000001
-#define SQLITE_OPEN_READWRITE 0x00000002
-#define SQLITE_OPEN_CREATE 0x00000004
-#define SQLITE_OPEN_DELETEONCLOSE 0x00000008
-#define SQLITE_OPEN_EXCLUSIVE 0x00000010
-#define SQLITE_OPEN_MAIN_DB 0x00000100
-#define SQLITE_OPEN_TEMP_DB 0x00000200
-#define SQLITE_OPEN_TRANSIENT_DB 0x00000400
-#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800
-#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000
-#define SQLITE_OPEN_SUBJOURNAL 0x00002000
-#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000
+#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */
+#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */
+#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */
+#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */
+#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */
+#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */
+#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */
+#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */
+#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
+#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
+#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
/*
-** CAPI3REF: Device Characteristics {F10240}
+** CAPI3REF: Device Characteristics {H10240} <H11120>
**
** The xDeviceCapabilities method of the [sqlite3_io_methods]
** object returns an integer which is a vector of the these
@@ -504,7 +475,7 @@ int sqlite3_exec(
#define SQLITE_IOCAP_SEQUENTIAL 0x00000400
/*
-** CAPI3REF: File Locking Levels {F10250}
+** CAPI3REF: File Locking Levels {H10250} <H11120> <H11310>
**
** SQLite uses one of these integer values as the second
** argument to calls it makes to the xLock() and xUnlock() methods
@@ -517,7 +488,7 @@ int sqlite3_exec(
#define SQLITE_LOCK_EXCLUSIVE 4
/*
-** CAPI3REF: Synchronization Type Flags {F10260}
+** CAPI3REF: Synchronization Type Flags {H10260} <H11120>
**
** When SQLite invokes the xSync() method of an
** [sqlite3_io_methods] object it uses a combination of
@@ -525,20 +496,21 @@ int sqlite3_exec(
**
** When the SQLITE_SYNC_DATAONLY flag is used, it means that the
** sync operation only needs to flush data to mass storage. Inode
-** information need not be flushed. The SQLITE_SYNC_NORMAL flag means
-** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means
-** to use Mac OS-X style fullsync instead of fsync().
+** information need not be flushed. If the lower four bits of the flag
+** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics.
+** If the lower four bits equal SQLITE_SYNC_FULL, that means
+** to use Mac OS X style fullsync instead of fsync().
*/
#define SQLITE_SYNC_NORMAL 0x00002
#define SQLITE_SYNC_FULL 0x00003
#define SQLITE_SYNC_DATAONLY 0x00010
-
/*
-** CAPI3REF: OS Interface Open File Handle {F11110}
+** CAPI3REF: OS Interface Open File Handle {H11110} <S20110>
**
-** An [sqlite3_file] object represents an open file in the OS
-** interface layer. Individual OS interface implementations will
+** An [sqlite3_file] object represents an open file in the
+** [sqlite3_vfs | OS interface layer]. Individual OS interface
+** implementations will
** want to subclass this object by appending additional fields
** for their own use. The pMethods entry is a pointer to an
** [sqlite3_io_methods] object that defines methods for performing
@@ -550,19 +522,26 @@ struct sqlite3_file {
};
/*
-** CAPI3REF: OS Interface File Virtual Methods Object {F11120}
+** CAPI3REF: OS Interface File Virtual Methods Object {H11120} <S20110>
**
-** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to
-** an instance of this object. This object defines the
-** methods used to perform various operations against the open file.
+** Every file opened by the [sqlite3_vfs] xOpen method populates an
+** [sqlite3_file] object (or, more commonly, a subclass of the
+** [sqlite3_file] object) with a pointer to an instance of this object.
+** This object defines the methods used to perform various operations
+** against the open file represented by the [sqlite3_file] object.
+**
+** If the xOpen method sets the sqlite3_file.pMethods element
+** to a non-NULL pointer, then the sqlite3_io_methods.xClose method
+** may be invoked even if the xOpen reported that it failed. The
+** only way to prevent a call to xClose following a failed xOpen
+** is for the xOpen to set the sqlite3_file.pMethods element to NULL.
**
** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or
** [SQLITE_SYNC_FULL]. The first choice is the normal fsync().
-* The second choice is an
-** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to
-** indicate that only the data of the file and not its inode needs to be
-** synced.
-**
+** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY]
+** flag may be ORed in to indicate that only the data of the file
+** and not its inode needs to be synced.
+**
** The integer values to xLock() and xUnlock() are one of
** <ul>
** <li> [SQLITE_LOCK_NONE],
@@ -571,26 +550,24 @@ struct sqlite3_file {
** <li> [SQLITE_LOCK_PENDING], or
** <li> [SQLITE_LOCK_EXCLUSIVE].
** </ul>
-** xLock() increases the lock. xUnlock() decreases the lock.
-** The xCheckReservedLock() method looks
-** to see if any database connection, either in this
-** process or in some other process, is holding an RESERVED,
+** xLock() increases the lock. xUnlock() decreases the lock.
+** The xCheckReservedLock() method checks whether any database connection,
+** either in this process or in some other process, is holding a RESERVED,
** PENDING, or EXCLUSIVE lock on the file. It returns true
-** if such a lock exists and false if not.
-**
+** if such a lock exists and false otherwise.
+**
** The xFileControl() method is a generic interface that allows custom
** VFS implementations to directly control an open file using the
-** [sqlite3_file_control()] interface. The second "op" argument
-** is an integer opcode. The third
-** argument is a generic pointer which is intended to be a pointer
-** to a structure that may contain arguments or space in which to
+** [sqlite3_file_control()] interface. The second "op" argument is an
+** integer opcode. The third argument is a generic pointer intended to
+** point to a structure that may contain arguments or space in which to
** write return values. Potential uses for xFileControl() might be
** functions to enable blocking locks with timeouts, to change the
** locking strategy (for example to use dot-file locks), to inquire
** about the status of a lock, or to break stale locks. The SQLite
-** core reserves opcodes less than 100 for its own use.
+** core reserves all opcodes less than 100 for its own use.
** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available.
-** Applications that define a custom xFileControl method should use opcodes
+** Applications that define a custom xFileControl method should use opcodes
** greater than 100 to avoid conflicts.
**
** The xSectorSize() method returns the sector size of the
@@ -624,6 +601,12 @@ struct sqlite3_file {
** way around. The SQLITE_IOCAP_SEQUENTIAL property means that
** information is written to disk in the same order as calls
** to xWrite().
+**
+** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill
+** in the unread portions of the buffer with zeros. A VFS that
+** fails to zero-fill short reads might seem to work. However,
+** failure to zero-fill short reads will eventually lead to
+** database corruption.
*/
typedef struct sqlite3_io_methods sqlite3_io_methods;
struct sqlite3_io_methods {
@@ -636,7 +619,7 @@ struct sqlite3_io_methods {
int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize);
int (*xLock)(sqlite3_file*, int);
int (*xUnlock)(sqlite3_file*, int);
- int (*xCheckReservedLock)(sqlite3_file*);
+ int (*xCheckReservedLock)(sqlite3_file*, int *pResOut);
int (*xFileControl)(sqlite3_file*, int op, void *pArg);
int (*xSectorSize)(sqlite3_file*);
int (*xDeviceCharacteristics)(sqlite3_file*);
@@ -644,10 +627,10 @@ struct sqlite3_io_methods {
};
/*
-** CAPI3REF: Standard File Control Opcodes {F11310}
+** CAPI3REF: Standard File Control Opcodes {H11310} <S30800>
**
** These integer constants are opcodes for the xFileControl method
-** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()]
+** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()]
** interface.
**
** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This
@@ -659,9 +642,12 @@ struct sqlite3_io_methods {
** is defined.
*/
#define SQLITE_FCNTL_LOCKSTATE 1
+#define SQLITE_GET_LOCKPROXYFILE 2
+#define SQLITE_SET_LOCKPROXYFILE 3
+#define SQLITE_LAST_ERRNO 4
/*
-** CAPI3REF: Mutex Handle {F17110}
+** CAPI3REF: Mutex Handle {H17110} <S20130>
**
** The mutex module within SQLite defines [sqlite3_mutex] to be an
** abstract type for a mutex object. The SQLite core never looks
@@ -673,15 +659,18 @@ struct sqlite3_io_methods {
typedef struct sqlite3_mutex sqlite3_mutex;
/*
-** CAPI3REF: OS Interface Object {F11140}
+** CAPI3REF: OS Interface Object {H11140} <S20100>
**
-** An instance of this object defines the interface between the
-** SQLite core and the underlying operating system. The "vfs"
+** An instance of the sqlite3_vfs object defines the interface between
+** the SQLite core and the underlying operating system. The "vfs"
** in the name of the object stands for "virtual file system".
**
-** The iVersion field is initially 1 but may be larger for future
-** versions of SQLite. Additional fields may be appended to this
-** object when the iVersion value is increased.
+** The value of the iVersion field is initially 1 but may be larger in
+** future versions of SQLite. Additional fields may be appended to this
+** object when the iVersion value is increased. Note that the structure
+** of the sqlite3_vfs object changes in the transaction between
+** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
+** modified.
**
** The szOsFile field is the size of the subclassed [sqlite3_file]
** structure used by this VFS. mxPathname is the maximum length of
@@ -691,9 +680,10 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** the pNext pointer. The [sqlite3_vfs_register()]
** and [sqlite3_vfs_unregister()] interfaces manage this list
** in a thread-safe way. The [sqlite3_vfs_find()] interface
-** searches the list.
+** searches the list. Neither the application code nor the VFS
+** implementation should use the pNext pointer.
**
-** The pNext field is the only field in the sqlite3_vfs
+** The pNext field is the only field in the sqlite3_vfs
** structure that SQLite will ever modify. SQLite will only access
** or modify this field while holding a particular static mutex.
** The application should never modify anything within the sqlite3_vfs
@@ -702,23 +692,28 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** The zName field holds the name of the VFS module. The name must
** be unique across all VFS modules.
**
-** {F11141} SQLite will guarantee that the zFilename string passed to
-** xOpen() is a full pathname as generated by xFullPathname() and
-** that the string will be valid and unchanged until xClose() is
-** called. {END} So the [sqlite3_file] can store a pointer to the
+** SQLite will guarantee that the zFilename parameter to xOpen
+** is either a NULL pointer or string obtained
+** from xFullPathname(). SQLite further guarantees that
+** the string will be valid and unchanged until xClose() is
+** called. Because of the previous sentence,
+** the [sqlite3_file] can safely store a pointer to the
** filename if it needs to remember the filename for some reason.
+** If the zFilename parameter is xOpen is a NULL pointer then xOpen
+** must invent its own temporary name for the file. Whenever the
+** xFilename parameter is NULL it will also be the case that the
+** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE].
**
-** {F11142} The flags argument to xOpen() includes all bits set in
+** The flags argument to xOpen() includes all bits set in
** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()]
** or [sqlite3_open16()] is used, then flags includes at least
-** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. {END}
+** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE].
** If xOpen() opens a file read-only then it sets *pOutFlags to
-** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be
-** set.
-**
-** {F11143} SQLite will also add one of the following flags to the xOpen()
+** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set.
+**
+** SQLite will also add one of the following flags to the xOpen()
** call, depending on the object being opened:
-**
+**
** <ul>
** <li> [SQLITE_OPEN_MAIN_DB]
** <li> [SQLITE_OPEN_MAIN_JOURNAL]
@@ -727,62 +722,70 @@ typedef struct sqlite3_mutex sqlite3_mutex;
** <li> [SQLITE_OPEN_TRANSIENT_DB]
** <li> [SQLITE_OPEN_SUBJOURNAL]
** <li> [SQLITE_OPEN_MASTER_JOURNAL]
-** </ul> {END}
+** </ul>
**
** The file I/O implementation can use the object type flags to
-** changes the way it deals with files. For example, an application
+** change the way it deals with files. For example, an application
** that does not care about crash recovery or rollback might make
** the open of a journal file a no-op. Writes to this journal would
-** also be no-ops, and any attempt to read the journal would return
-** SQLITE_IOERR. Or the implementation might recognize that a database
-** file will be doing page-aligned sector reads and writes in a random
+** also be no-ops, and any attempt to read the journal would return
+** SQLITE_IOERR. Or the implementation might recognize that a database
+** file will be doing page-aligned sector reads and writes in a random
** order and set up its I/O subsystem accordingly.
-**
-** SQLite might also add one of the following flags to the xOpen
-** method:
-**
+**
+** SQLite might also add one of the following flags to the xOpen method:
+**
** <ul>
** <li> [SQLITE_OPEN_DELETEONCLOSE]
** <li> [SQLITE_OPEN_EXCLUSIVE]
** </ul>
-**
-** {F11145} The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
-** deleted when it is closed. {F11146} The [SQLITE_OPEN_DELETEONCLOSE]
-** will be set for TEMP databases, journals and for subjournals.
-** {F11147} The [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened
-** for exclusive access. This flag is set for all files except
-** for the main database file. {END}
-**
-** {F11148} At least szOsFile bytes of memory are allocated by SQLite
-** to hold the [sqlite3_file] structure passed as the third
-** argument to xOpen. {END} The xOpen method does not have to
-** allocate the structure; it should just fill it in.
-**
-** {F11149} The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
-** to test for the existance of a file,
-** or [SQLITE_ACCESS_READWRITE] to test to see
-** if a file is readable and writable, or [SQLITE_ACCESS_READ]
-** to test to see if a file is at least readable. {END} The file can be a
+**
+** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
+** deleted when it is closed. The [SQLITE_OPEN_DELETEONCLOSE]
+** will be set for TEMP databases, journals and for subjournals.
+**
+** The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction
+** with the [SQLITE_OPEN_CREATE] flag, which are both directly
+** analogous to the O_EXCL and O_CREAT flags of the POSIX open()
+** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the
+** SQLITE_OPEN_CREATE, is used to indicate that file should always
+** be created, and that it is an error if it already exists.
+** It is <i>not</i> used to indicate the file should be opened
+** for exclusive access.
+**
+** At least szOsFile bytes of memory are allocated by SQLite
+** to hold the [sqlite3_file] structure passed as the third
+** argument to xOpen. The xOpen method does not have to
+** allocate the structure; it should just fill it in. Note that
+** the xOpen method must set the sqlite3_file.pMethods to either
+** a valid [sqlite3_io_methods] object or to NULL. xOpen must do
+** this even if the open fails. SQLite expects that the sqlite3_file.pMethods
+** element will be valid after xOpen returns regardless of the success
+** or failure of the xOpen call.
+**
+** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
+** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to
+** test whether a file is readable and writable, or [SQLITE_ACCESS_READ]
+** to test whether a file is at least readable. The file can be a
** directory.
-**
-** {F11150} SQLite will always allocate at least mxPathname+1 bytes for
-** the output buffers for xGetTempname and xFullPathname. {F11151} The exact
-** size of the output buffer is also passed as a parameter to both
-** methods. {END} If the output buffer is not large enough, SQLITE_CANTOPEN
-** should be returned. As this is handled as a fatal error by SQLite,
-** vfs implementations should endeavor to prevent this by setting
-** mxPathname to a sufficiently large value.
-**
+**
+** SQLite will always allocate at least mxPathname+1 bytes for the
+** output buffer xFullPathname. The exact size of the output buffer
+** is also passed as a parameter to both methods. If the output buffer
+** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is
+** handled as a fatal error by SQLite, vfs implementations should endeavor
+** to prevent this by setting mxPathname to a sufficiently large value.
+**
** The xRandomness(), xSleep(), and xCurrentTime() interfaces
** are not strictly a part of the filesystem, but they are
** included in the VFS structure for completeness.
** The xRandomness() function attempts to return nBytes bytes
** of good-quality randomness into zOut. The return value is
-** the actual number of bytes of randomness obtained. The
-** xSleep() method causes the calling thread to sleep for at
+** the actual number of bytes of randomness obtained.
+** The xSleep() method causes the calling thread to sleep for at
** least the number of microseconds given. The xCurrentTime()
-** method returns a Julian Day Number for the current date and
-** time.
+** method returns a Julian Day Number for the current date and time.
+**
*/
typedef struct sqlite3_vfs sqlite3_vfs;
struct sqlite3_vfs {
@@ -795,134 +798,540 @@ struct sqlite3_vfs {
int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
int flags, int *pOutFlags);
int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
- int (*xAccess)(sqlite3_vfs*, const char *zName, int flags);
- int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut);
+ int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);
void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
- void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol);
+ void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
void (*xDlClose)(sqlite3_vfs*, void*);
int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
int (*xSleep)(sqlite3_vfs*, int microseconds);
int (*xCurrentTime)(sqlite3_vfs*, double*);
+ int (*xGetLastError)(sqlite3_vfs*, int, char *);
/* New fields may be appended in figure versions. The iVersion
** value will increment whenever this happens. */
};
/*
-** CAPI3REF: Flags for the xAccess VFS method {F11190}
+** CAPI3REF: Flags for the xAccess VFS method {H11190} <H11140>
**
-** {F11191} These integer constants can be used as the third parameter to
+** These integer constants can be used as the third parameter to
** the xAccess method of an [sqlite3_vfs] object. {END} They determine
-** what kind of permissions the xAccess method is
-** looking for. {F11192} With SQLITE_ACCESS_EXISTS, the xAccess method
-** simply checks to see if the file exists. {F11193} With
-** SQLITE_ACCESS_READWRITE, the xAccess method checks to see
-** if the file is both readable and writable. {F11194} With
-** SQLITE_ACCESS_READ the xAccess method
-** checks to see if the file is readable.
+** what kind of permissions the xAccess method is looking for.
+** With SQLITE_ACCESS_EXISTS, the xAccess method
+** simply checks whether the file exists.
+** With SQLITE_ACCESS_READWRITE, the xAccess method
+** checks whether the file is both readable and writable.
+** With SQLITE_ACCESS_READ, the xAccess method
+** checks whether the file is readable.
*/
#define SQLITE_ACCESS_EXISTS 0
#define SQLITE_ACCESS_READWRITE 1
#define SQLITE_ACCESS_READ 2
/*
-** CAPI3REF: Enable Or Disable Extended Result Codes {F12200}
+** CAPI3REF: Initialize The SQLite Library {H10130} <S20000><S30100>
+**
+** The sqlite3_initialize() routine initializes the
+** SQLite library. The sqlite3_shutdown() routine
+** deallocates any resources that were allocated by sqlite3_initialize().
+**
+** A call to sqlite3_initialize() is an "effective" call if it is
+** the first time sqlite3_initialize() is invoked during the lifetime of
+** the process, or if it is the first time sqlite3_initialize() is invoked
+** following a call to sqlite3_shutdown(). Only an effective call
+** of sqlite3_initialize() does any initialization. All other calls
+** are harmless no-ops.
+**
+** A call to sqlite3_shutdown() is an "effective" call if it is the first
+** call to sqlite3_shutdown() since the last sqlite3_initialize(). Only
+** an effective call to sqlite3_shutdown() does any deinitialization.
+** All other calls to sqlite3_shutdown() are harmless no-ops.
+**
+** Among other things, sqlite3_initialize() shall invoke
+** sqlite3_os_init(). Similarly, sqlite3_shutdown()
+** shall invoke sqlite3_os_end().
+**
+** The sqlite3_initialize() routine returns [SQLITE_OK] on success.
+** If for some reason, sqlite3_initialize() is unable to initialize
+** the library (perhaps it is unable to allocate a needed resource such
+** as a mutex) it returns an [error code] other than [SQLITE_OK].
+**
+** The sqlite3_initialize() routine is called internally by many other
+** SQLite interfaces so that an application usually does not need to
+** invoke sqlite3_initialize() directly. For example, [sqlite3_open()]
+** calls sqlite3_initialize() so the SQLite library will be automatically
+** initialized when [sqlite3_open()] is called if it has not be initialized
+** already. However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT]
+** compile-time option, then the automatic calls to sqlite3_initialize()
+** are omitted and the application must call sqlite3_initialize() directly
+** prior to using any other SQLite interface. For maximum portability,
+** it is recommended that applications always invoke sqlite3_initialize()
+** directly prior to using any other SQLite interface. Future releases
+** of SQLite may require this. In other words, the behavior exhibited
+** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the
+** default behavior in some future release of SQLite.
+**
+** The sqlite3_os_init() routine does operating-system specific
+** initialization of the SQLite library. The sqlite3_os_end()
+** routine undoes the effect of sqlite3_os_init(). Typical tasks
+** performed by these routines include allocation or deallocation
+** of static resources, initialization of global variables,
+** setting up a default [sqlite3_vfs] module, or setting up
+** a default configuration using [sqlite3_config()].
+**
+** The application should never invoke either sqlite3_os_init()
+** or sqlite3_os_end() directly. The application should only invoke
+** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init()
+** interface is called automatically by sqlite3_initialize() and
+** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate
+** implementations for sqlite3_os_init() and sqlite3_os_end()
+** are built into SQLite when it is compiled for Unix, Windows, or OS/2.
+** When [custom builds | built for other platforms]
+** (using the [SQLITE_OS_OTHER=1] compile-time
+** option) the application must supply a suitable implementation for
+** sqlite3_os_init() and sqlite3_os_end(). An application-supplied
+** implementation of sqlite3_os_init() or sqlite3_os_end()
+** must return [SQLITE_OK] on success and some other [error code] upon
+** failure.
+*/
+SQLITE_API int sqlite3_initialize(void);
+SQLITE_API int sqlite3_shutdown(void);
+SQLITE_API int sqlite3_os_init(void);
+SQLITE_API int sqlite3_os_end(void);
+
+/*
+** CAPI3REF: Configuring The SQLite Library {H14100} <S20000><S30200>
+** EXPERIMENTAL
+**
+** The sqlite3_config() interface is used to make global configuration
+** changes to SQLite in order to tune SQLite to the specific needs of
+** the application. The default configuration is recommended for most
+** applications and so this routine is usually not necessary. It is
+** provided to support rare applications with unusual needs.
+**
+** The sqlite3_config() interface is not threadsafe. The application
+** must insure that no other SQLite interfaces are invoked by other
+** threads while sqlite3_config() is running. Furthermore, sqlite3_config()
+** may only be invoked prior to library initialization using
+** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
+** Note, however, that sqlite3_config() can be called as part of the
+** implementation of an application-defined [sqlite3_os_init()].
+**
+** The first argument to sqlite3_config() is an integer
+** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines
+** what property of SQLite is to be configured. Subsequent arguments
+** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option]
+** in the first argument.
+**
+** When a configuration option is set, sqlite3_config() returns [SQLITE_OK].
+** If the option is unknown or SQLite is unable to set the option
+** then this routine returns a non-zero [error code].
+**
+** Requirements:
+** [H14103] [H14106] [H14120] [H14123] [H14126] [H14129] [H14132] [H14135]
+** [H14138] [H14141] [H14144] [H14147] [H14150] [H14153] [H14156] [H14159]
+** [H14162] [H14165] [H14168]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...);
+
+/*
+** CAPI3REF: Configure database connections {H14200} <S20000>
+** EXPERIMENTAL
+**
+** The sqlite3_db_config() interface is used to make configuration
+** changes to a [database connection]. The interface is similar to
+** [sqlite3_config()] except that the changes apply to a single
+** [database connection] (specified in the first argument). The
+** sqlite3_db_config() interface can only be used immediately after
+** the database connection is created using [sqlite3_open()],
+** [sqlite3_open16()], or [sqlite3_open_v2()].
+**
+** The second argument to sqlite3_db_config(D,V,...) is the
+** configuration verb - an integer code that indicates what
+** aspect of the [database connection] is being configured.
+** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE].
+** New verbs are likely to be added in future releases of SQLite.
+** Additional arguments depend on the verb.
+**
+** Requirements:
+** [H14203] [H14206] [H14209] [H14212] [H14215]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...);
+
+/*
+** CAPI3REF: Memory Allocation Routines {H10155} <S20120>
+** EXPERIMENTAL
+**
+** An instance of this object defines the interface between SQLite
+** and low-level memory allocation routines.
+**
+** This object is used in only one place in the SQLite interface.
+** A pointer to an instance of this object is the argument to
+** [sqlite3_config()] when the configuration option is
+** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC].
+** By creating an instance of this object
+** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC])
+** during configuration, an application can specify an alternative
+** memory allocation subsystem for SQLite to use for all of its
+** dynamic memory needs.
+**
+** Note that SQLite comes with several [built-in memory allocators]
+** that are perfectly adequate for the overwhelming majority of applications
+** and that this object is only useful to a tiny minority of applications
+** with specialized memory allocation requirements. This object is
+** also used during testing of SQLite in order to specify an alternative
+** memory allocator that simulates memory out-of-memory conditions in
+** order to verify that SQLite recovers gracefully from such
+** conditions.
+**
+** The xMalloc and xFree methods must work like the
+** malloc() and free() functions from the standard C library.
+** The xRealloc method must work like realloc() from the standard C library
+** with the exception that if the second argument to xRealloc is zero,
+** xRealloc must be a no-op - it must not perform any allocation or
+** deallocation. SQLite guaranteeds that the second argument to
+** xRealloc is always a value returned by a prior call to xRoundup.
+** And so in cases where xRoundup always returns a positive number,
+** xRealloc can perform exactly as the standard library realloc() and
+** still be in compliance with this specification.
+**
+** xSize should return the allocated size of a memory allocation
+** previously obtained from xMalloc or xRealloc. The allocated size
+** is always at least as big as the requested size but may be larger.
+**
+** The xRoundup method returns what would be the allocated size of
+** a memory allocation given a particular requested size. Most memory
+** allocators round up memory allocations at least to the next multiple
+** of 8. Some allocators round up to a larger multiple or to a power of 2.
+** Every memory allocation request coming in through [sqlite3_malloc()]
+** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0,
+** that causes the corresponding memory allocation to fail.
+**
+** The xInit method initializes the memory allocator. (For example,
+** it might allocate any require mutexes or initialize internal data
+** structures. The xShutdown method is invoked (indirectly) by
+** [sqlite3_shutdown()] and should deallocate any resources acquired
+** by xInit. The pAppData pointer is used as the only parameter to
+** xInit and xShutdown.
+**
+** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes
+** the xInit method, so the xInit method need not be threadsafe. The
+** xShutdown method is only called from [sqlite3_shutdown()] so it does
+** not need to be threadsafe either. For all other methods, SQLite
+** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the
+** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which
+** it is by default) and so the methods are automatically serialized.
+** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other
+** methods must be threadsafe or else make their own arrangements for
+** serialization.
+**
+** SQLite will never invoke xInit() more than once without an intervening
+** call to xShutdown().
+*/
+typedef struct sqlite3_mem_methods sqlite3_mem_methods;
+struct sqlite3_mem_methods {
+ void *(*xMalloc)(int); /* Memory allocation function */
+ void (*xFree)(void*); /* Free a prior allocation */
+ void *(*xRealloc)(void*,int); /* Resize an allocation */
+ int (*xSize)(void*); /* Return the size of an allocation */
+ int (*xRoundup)(int); /* Round up request size to allocation size */
+ int (*xInit)(void*); /* Initialize the memory allocator */
+ void (*xShutdown)(void*); /* Deinitialize the memory allocator */
+ void *pAppData; /* Argument to xInit() and xShutdown() */
+};
+
+/*
+** CAPI3REF: Configuration Options {H10160} <S20000>
+** EXPERIMENTAL
**
-** The sqlite3_extended_result_codes() routine enables or disables the
-** [SQLITE_IOERR_READ | extended result codes] feature of SQLite.
-** The extended result codes are disabled by default for historical
-** compatibility.
+** These constants are the available integer configuration options that
+** can be passed as the first argument to the [sqlite3_config()] interface.
+**
+** New configuration options may be added in future releases of SQLite.
+** Existing configuration options might be discontinued. Applications
+** should check the return code from [sqlite3_config()] to make sure that
+** the call worked. The [sqlite3_config()] interface will return a
+** non-zero [error code] if a discontinued or unsupported configuration option
+** is invoked.
+**
+** <dl>
+** <dt>SQLITE_CONFIG_SINGLETHREAD</dt>
+** <dd>There are no arguments to this option. This option disables
+** all mutexing and puts SQLite into a mode where it can only be used
+** by a single thread.</dd>
+**
+** <dt>SQLITE_CONFIG_MULTITHREAD</dt>
+** <dd>There are no arguments to this option. This option disables
+** mutexing on [database connection] and [prepared statement] objects.
+** The application is responsible for serializing access to
+** [database connections] and [prepared statements]. But other mutexes
+** are enabled so that SQLite will be safe to use in a multi-threaded
+** environment as long as no two threads attempt to use the same
+** [database connection] at the same time. See the [threading mode]
+** documentation for additional information.</dd>
+**
+** <dt>SQLITE_CONFIG_SERIALIZED</dt>
+** <dd>There are no arguments to this option. This option enables
+** all mutexes including the recursive
+** mutexes on [database connection] and [prepared statement] objects.
+** In this mode (which is the default when SQLite is compiled with
+** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access
+** to [database connections] and [prepared statements] so that the
+** application is free to use the same [database connection] or the
+** same [prepared statement] in different threads at the same time.
+** See the [threading mode] documentation for additional information.</dd>
+**
+** <dt>SQLITE_CONFIG_MALLOC</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mem_methods] structure. The argument specifies
+** alternative low-level memory allocation routines to be used in place of
+** the memory allocation routines built into SQLite.</dd>
+**
+** <dt>SQLITE_CONFIG_GETMALLOC</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods]
+** structure is filled with the currently defined memory allocation routines.
+** This option can be used to overload the default memory allocation
+** routines with a wrapper that simulations memory allocation failure or
+** tracks memory usage, for example.</dd>
+**
+** <dt>SQLITE_CONFIG_MEMSTATUS</dt>
+** <dd>This option takes single argument of type int, interpreted as a
+** boolean, which enables or disables the collection of memory allocation
+** statistics. When disabled, the following SQLite interfaces become
+** non-operational:
+** <ul>
+** <li> [sqlite3_memory_used()]
+** <li> [sqlite3_memory_highwater()]
+** <li> [sqlite3_soft_heap_limit()]
+** <li> [sqlite3_status()]
+** </ul>
+** </dd>
+**
+** <dt>SQLITE_CONFIG_SCRATCH</dt>
+** <dd>This option specifies a static memory buffer that SQLite can use for
+** scratch memory. There are three arguments: A pointer an 8-byte
+** aligned memory buffer from which the scrach allocations will be
+** drawn, the size of each scratch allocation (sz),
+** and the maximum number of scratch allocations (N). The sz
+** argument must be a multiple of 16. The sz parameter should be a few bytes
+** larger than the actual scratch space required due to internal overhead.
+** The first argument should pointer to an 8-byte aligned buffer
+** of at least sz*N bytes of memory.
+** SQLite will use no more than one scratch buffer at once per thread, so
+** N should be set to the expected maximum number of threads. The sz
+** parameter should be 6 times the size of the largest database page size.
+** Scratch buffers are used as part of the btree balance operation. If
+** The btree balancer needs additional memory beyond what is provided by
+** scratch buffers or if no scratch buffer space is specified, then SQLite
+** goes to [sqlite3_malloc()] to obtain the memory it needs.</dd>
+**
+** <dt>SQLITE_CONFIG_PAGECACHE</dt>
+** <dd>This option specifies a static memory buffer that SQLite can use for
+** the database page cache with the default page cache implemenation.
+** This configuration should not be used if an application-define page
+** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option.
+** There are three arguments to this option: A pointer to 8-byte aligned
+** memory, the size of each page buffer (sz), and the number of pages (N).
+** The sz argument should be the size of the largest database page
+** (a power of two between 512 and 32768) plus a little extra for each
+** page header. The page header size is 20 to 40 bytes depending on
+** the host architecture. It is harmless, apart from the wasted memory,
+** to make sz a little too large. The first
+** argument should point to an allocation of at least sz*N bytes of memory.
+** SQLite will use the memory provided by the first argument to satisfy its
+** memory needs for the first N pages that it adds to cache. If additional
+** page cache memory is needed beyond what is provided by this option, then
+** SQLite goes to [sqlite3_malloc()] for the additional storage space.
+** The implementation might use one or more of the N buffers to hold
+** memory accounting information. The pointer in the first argument must
+** be aligned to an 8-byte boundary or subsequent behavior of SQLite
+** will be undefined.</dd>
+**
+** <dt>SQLITE_CONFIG_HEAP</dt>
+** <dd>This option specifies a static memory buffer that SQLite will use
+** for all of its dynamic memory allocation needs beyond those provided
+** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE].
+** There are three arguments: An 8-byte aligned pointer to the memory,
+** the number of bytes in the memory buffer, and the minimum allocation size.
+** If the first pointer (the memory pointer) is NULL, then SQLite reverts
+** to using its default memory allocator (the system malloc() implementation),
+** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the
+** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or
+** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory
+** allocator is engaged to handle all of SQLites memory allocation needs.
+** The first pointer (the memory pointer) must be aligned to an 8-byte
+** boundary or subsequent behavior of SQLite will be undefined.</dd>
+**
+** <dt>SQLITE_CONFIG_MUTEX</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mutex_methods] structure. The argument specifies
+** alternative low-level mutex routines to be used in place
+** the mutex routines built into SQLite.</dd>
+**
+** <dt>SQLITE_CONFIG_GETMUTEX</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** instance of the [sqlite3_mutex_methods] structure. The
+** [sqlite3_mutex_methods]
+** structure is filled with the currently defined mutex routines.
+** This option can be used to overload the default mutex allocation
+** routines with a wrapper used to track mutex usage for performance
+** profiling or testing, for example.</dd>
+**
+** <dt>SQLITE_CONFIG_LOOKASIDE</dt>
+** <dd>This option takes two arguments that determine the default
+** memory allocation lookaside optimization. The first argument is the
+** size of each lookaside buffer slot and the second is the number of
+** slots allocated to each database connection. This option sets the
+** <i>default</i> lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE]
+** verb to [sqlite3_db_config()] can be used to change the lookaside
+** configuration on individual connections.</dd>
+**
+** <dt>SQLITE_CONFIG_PCACHE</dt>
+** <dd>This option takes a single argument which is a pointer to
+** an [sqlite3_pcache_methods] object. This object specifies the interface
+** to a custom page cache implementation. SQLite makes a copy of the
+** object and uses it for page cache memory allocations.</dd>
+**
+** <dt>SQLITE_CONFIG_GETPCACHE</dt>
+** <dd>This option takes a single argument which is a pointer to an
+** [sqlite3_pcache_methods] object. SQLite copies of the current
+** page cache implementation into that object.</dd>
+**
+** </dl>
+*/
+#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
+#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
+#define SQLITE_CONFIG_SERIALIZED 3 /* nil */
+#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
+#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */
+#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
+#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
+#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
+#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
+#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
+/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
+#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
+#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */
+#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */
+
+/*
+** CAPI3REF: Configuration Options {H10170} <S20000>
+** EXPERIMENTAL
**
-** INVARIANTS:
+** These constants are the available integer configuration options that
+** can be passed as the second argument to the [sqlite3_db_config()] interface.
**
-** {F12201} Each new [database connection] has the
-** [extended result codes] feature
-** disabled by default.
+** New configuration options may be added in future releases of SQLite.
+** Existing configuration options might be discontinued. Applications
+** should check the return code from [sqlite3_db_config()] to make sure that
+** the call worked. The [sqlite3_db_config()] interface will return a
+** non-zero [error code] if a discontinued or unsupported configuration option
+** is invoked.
**
-** {F12202} The [sqlite3_extended_result_codes(D,F)] interface will enable
-** [extended result codes] for the
-** [database connection] D if the F parameter
-** is true, or disable them if F is false.
+** <dl>
+** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt>
+** <dd>This option takes three additional arguments that determine the
+** [lookaside memory allocator] configuration for the [database connection].
+** The first argument (the third parameter to [sqlite3_db_config()] is a
+** pointer to an memory buffer to use for lookaside memory.
+** The first argument may be NULL in which case SQLite will allocate the
+** lookaside buffer itself using [sqlite3_malloc()]. The second argument is the
+** size of each lookaside buffer slot and the third argument is the number of
+** slots. The size of the buffer in the first argument must be greater than
+** or equal to the product of the second and third arguments. The buffer
+** must be aligned to an 8-byte boundary. If the second argument is not
+** a multiple of 8, it is internally rounded down to the next smaller
+** multiple of 8. See also: [SQLITE_CONFIG_LOOKASIDE]</dd>
+**
+** </dl>
*/
-int sqlite3_extended_result_codes(sqlite3*, int onoff);
+#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */
+
/*
-** CAPI3REF: Last Insert Rowid {F12220}
+** CAPI3REF: Enable Or Disable Extended Result Codes {H12200} <S10700>
+**
+** The sqlite3_extended_result_codes() routine enables or disables the
+** [extended result codes] feature of SQLite. The extended result
+** codes are disabled by default for historical compatibility considerations.
+**
+** Requirements:
+** [H12201] [H12202]
+*/
+SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff);
+
+/*
+** CAPI3REF: Last Insert Rowid {H12220} <S10700>
**
** Each entry in an SQLite table has a unique 64-bit signed
-** integer key called the "rowid". The rowid is always available
+** integer key called the [ROWID | "rowid"]. The rowid is always available
** as an undeclared column named ROWID, OID, or _ROWID_ as long as those
** names are not also used by explicitly declared columns. If
-** the table has a column of type INTEGER PRIMARY KEY then that column
+** the table has a column of type [INTEGER PRIMARY KEY] then that column
** is another alias for the rowid.
**
-** This routine returns the rowid of the most recent
-** successful INSERT into the database from the database connection
-** shown in the first argument. If no successful inserts
-** have ever occurred on this database connection, zero is returned.
+** This routine returns the [rowid] of the most recent
+** successful [INSERT] into the database from the [database connection]
+** in the first argument. If no successful [INSERT]s
+** have ever occurred on that database connection, zero is returned.
**
-** If an INSERT occurs within a trigger, then the rowid of the
-** inserted row is returned by this routine as long as the trigger
-** is running. But once the trigger terminates, the value returned
-** by this routine reverts to the last value inserted before the
-** trigger fired.
+** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted
+** row is returned by this routine as long as the trigger is running.
+** But once the trigger terminates, the value returned by this routine
+** reverts to the last value inserted before the trigger fired.
**
-** An INSERT that fails due to a constraint violation is not a
-** successful insert and does not change the value returned by this
+** An [INSERT] that fails due to a constraint violation is not a
+** successful [INSERT] and does not change the value returned by this
** routine. Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK,
** and INSERT OR ABORT make no changes to the return value of this
-** routine when their insertion fails. When INSERT OR REPLACE
+** routine when their insertion fails. When INSERT OR REPLACE
** encounters a constraint violation, it does not fail. The
** INSERT continues to completion after deleting rows that caused
** the constraint problem so INSERT OR REPLACE will always change
-** the return value of this interface.
+** the return value of this interface.
**
-** For the purposes of this routine, an insert is considered to
+** For the purposes of this routine, an [INSERT] is considered to
** be successful even if it is subsequently rolled back.
**
-** INVARIANTS:
-**
-** {F12221} The [sqlite3_last_insert_rowid()] function returns the
-** rowid of the most recent successful insert done
-** on the same database connection and within the same
-** trigger context, or zero if there have
-** been no qualifying inserts on that connection.
+** Requirements:
+** [H12221] [H12223]
**
-** {F12223} The [sqlite3_last_insert_rowid()] function returns
-** same value when called from the same trigger context
-** immediately before and after a ROLLBACK.
-**
-** LIMITATIONS:
-**
-** {U12232} If a separate thread does a new insert on the same
-** database connection while the [sqlite3_last_insert_rowid()]
-** function is running and thus changes the last insert rowid,
-** then the value returned by [sqlite3_last_insert_rowid()] is
-** unpredictable and might not equal either the old or the new
-** last insert rowid.
+** If a separate thread performs a new [INSERT] on the same
+** database connection while the [sqlite3_last_insert_rowid()]
+** function is running and thus changes the last insert [rowid],
+** then the value returned by [sqlite3_last_insert_rowid()] is
+** unpredictable and might not equal either the old or the new
+** last insert [rowid].
*/
-sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
+SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
/*
-** CAPI3REF: Count The Number Of Rows Modified {F12240}
+** CAPI3REF: Count The Number Of Rows Modified {H12240} <S10600>
**
** This function returns the number of database rows that were changed
** or inserted or deleted by the most recently completed SQL statement
-** on the connection specified by the first parameter. Only
-** changes that are directly specified by the INSERT, UPDATE, or
-** DELETE statement are counted. Auxiliary changes caused by
-** triggers are not counted. Use the [sqlite3_total_changes()] function
-** to find the total number of changes including changes caused by triggers.
+** on the [database connection] specified by the first parameter.
+** Only changes that are directly specified by the [INSERT], [UPDATE],
+** or [DELETE] statement are counted. Auxiliary changes caused by
+** triggers or [foreign key actions] are not counted. Use the
+** [sqlite3_total_changes()] function to find the total number of changes
+** including changes caused by triggers and foreign key actions.
+**
+** Changes to a view that are simulated by an [INSTEAD OF trigger]
+** are not counted. Only real table changes are counted.
**
** A "row change" is a change to a single row of a single table
** caused by an INSERT, DELETE, or UPDATE statement. Rows that
-** are changed as side effects of REPLACE constraint resolution,
-** rollback, ABORT processing, DROP TABLE, or by any other
+** are changed as side effects of [REPLACE] constraint resolution,
+** rollback, ABORT processing, [DROP TABLE], or by any other
** mechanisms do not count as direct row changes.
**
** A "trigger context" is a scope of execution that begins and
-** ends with the script of a trigger. Most SQL statements are
+** ends with the script of a [CREATE TRIGGER | trigger].
+** Most SQL statements are
** evaluated outside of any trigger. This is the "top level"
** trigger context. If a trigger fires from the top level, a
** new trigger context is entered for the duration of that one
@@ -935,84 +1344,57 @@ sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
** most recent INSERT, UPDATE, or DELETE statement within the same
** trigger context.
**
-** So when called from the top level, this function returns the
+** Thus, when called from the top level, this function returns the
** number of changes in the most recent INSERT, UPDATE, or DELETE
-** that also occurred at the top level.
-** Within the body of a trigger, the sqlite3_changes() interface
-** can be called to find the number of
+** that also occurred at the top level. Within the body of a trigger,
+** the sqlite3_changes() interface can be called to find the number of
** changes in the most recently completed INSERT, UPDATE, or DELETE
** statement within the body of the same trigger.
-** However, the number returned does not include in changes
-** caused by subtriggers since they have their own context.
-**
-** SQLite implements the command "DELETE FROM table" without
-** a WHERE clause by dropping and recreating the table. (This is much
-** faster than going through and deleting individual elements from the
-** table.) Because of this optimization, the deletions in
-** "DELETE FROM table" are not row changes and will not be counted
-** by the sqlite3_changes() or [sqlite3_total_changes()] functions.
-** To get an accurate count of the number of rows deleted, use
-** "DELETE FROM table WHERE 1" instead.
-**
-** INVARIANTS:
-**
-** {F12241} The [sqlite3_changes()] function returns the number of
-** row changes caused by the most recent INSERT, UPDATE,
-** or DELETE statement on the same database connection and
-** within the same trigger context, or zero if there have
-** not been any qualifying row changes.
-**
-** LIMITATIONS:
-**
-** {U12252} If a separate thread makes changes on the same database connection
-** while [sqlite3_changes()] is running then the value returned
-** is unpredictable and unmeaningful.
-*/
-int sqlite3_changes(sqlite3*);
-
-/*
-** CAPI3REF: Total Number Of Rows Modified {F12260}
-***
-** This function returns the number of row changes caused
-** by INSERT, UPDATE or DELETE statements since the database handle
-** was opened. The count includes all changes from all trigger
-** contexts. But the count does not include changes used to
-** implement REPLACE constraints, do rollbacks or ABORT processing,
-** or DROP table processing.
-** The changes
-** are counted as soon as the statement that makes them is completed
-** (when the statement handle is passed to [sqlite3_reset()] or
-** [sqlite3_finalize()]).
+** However, the number returned does not include changes
+** caused by subtriggers since those have their own context.
**
-** SQLite implements the command "DELETE FROM table" without
-** a WHERE clause by dropping and recreating the table. (This is much
-** faster than going
-** through and deleting individual elements from the table.) Because of
-** this optimization, the change count for "DELETE FROM table" will be
-** zero regardless of the number of elements that were originally in the
-** table. To get an accurate count of the number of rows deleted, use
-** "DELETE FROM table WHERE 1" instead.
+** See also the [sqlite3_total_changes()] interface and the
+** [count_changes pragma].
**
-** See also the [sqlite3_changes()] interface.
+** Requirements:
+** [H12241] [H12243]
**
-** INVARIANTS:
-**
-** {F12261} The [sqlite3_total_changes()] returns the total number
-** of row changes caused by INSERT, UPDATE, and/or DELETE
-** statements on the same [database connection], in any
-** trigger context, since the database connection was
-** created.
+** If a separate thread makes changes on the same database connection
+** while [sqlite3_changes()] is running then the value returned
+** is unpredictable and not meaningful.
+*/
+SQLITE_API int sqlite3_changes(sqlite3*);
+
+/*
+** CAPI3REF: Total Number Of Rows Modified {H12260} <S10600>
+**
+** This function returns the number of row changes caused by [INSERT],
+** [UPDATE] or [DELETE] statements since the [database connection] was opened.
+** The count includes all changes from all [CREATE TRIGGER | trigger]
+** contexts and changes made by [foreign key actions]. However,
+** the count does not include changes used to implement [REPLACE] constraints,
+** do rollbacks or ABORT processing, or [DROP TABLE] processing. The
+** count does not include rows of views that fire an [INSTEAD OF trigger],
+** though if the INSTEAD OF trigger makes changes of its own, those changes
+** are counted.
+** The changes are counted as soon as the statement that makes them is
+** completed (when the statement handle is passed to [sqlite3_reset()] or
+** [sqlite3_finalize()]).
+**
+** See also the [sqlite3_changes()] interface and the
+** [count_changes pragma].
**
-** LIMITATIONS:
+** Requirements:
+** [H12261] [H12263]
**
-** {U12264} If a separate thread makes changes on the same database connection
-** while [sqlite3_total_changes()] is running then the value
-** returned is unpredictable and unmeaningful.
+** If a separate thread makes changes on the same database connection
+** while [sqlite3_total_changes()] is running then the value
+** returned is unpredictable and not meaningful.
*/
-int sqlite3_total_changes(sqlite3*);
+SQLITE_API int sqlite3_total_changes(sqlite3*);
/*
-** CAPI3REF: Interrupt A Long-Running Query {F12270}
+** CAPI3REF: Interrupt A Long-Running Query {H12270} <S30500>
**
** This function causes any pending database operation to abort and
** return at its earliest opportunity. This routine is typically
@@ -1022,98 +1404,99 @@ int sqlite3_total_changes(sqlite3*);
**
** It is safe to call this routine from a thread different from the
** thread that is currently running the database operation. But it
-** is not safe to call this routine with a database connection that
+** is not safe to call this routine with a [database connection] that
** is closed or might close before sqlite3_interrupt() returns.
**
-** If an SQL is very nearly finished at the time when sqlite3_interrupt()
-** is called, then it might not have an opportunity to be interrupted.
-** It might continue to completion.
-** An SQL operation that is interrupted will return
-** [SQLITE_INTERRUPT]. If the interrupted SQL operation is an
-** INSERT, UPDATE, or DELETE that is inside an explicit transaction,
-** then the entire transaction will be rolled back automatically.
-** A call to sqlite3_interrupt() has no effect on SQL statements
-** that are started after sqlite3_interrupt() returns.
-**
-** INVARIANTS:
-**
-** {F12271} The [sqlite3_interrupt()] interface will force all running
-** SQL statements associated with the same database connection
-** to halt after processing at most one additional row of
-** data.
-**
-** {F12272} Any SQL statement that is interrupted by [sqlite3_interrupt()]
-** will return [SQLITE_INTERRUPT].
-**
-** LIMITATIONS:
-**
-** {U12279} If the database connection closes while [sqlite3_interrupt()]
-** is running then bad things will likely happen.
+** If an SQL operation is very nearly finished at the time when
+** sqlite3_interrupt() is called, then it might not have an opportunity
+** to be interrupted and might continue to completion.
+**
+** An SQL operation that is interrupted will return [SQLITE_INTERRUPT].
+** If the interrupted SQL operation is an INSERT, UPDATE, or DELETE
+** that is inside an explicit transaction, then the entire transaction
+** will be rolled back automatically.
+**
+** The sqlite3_interrupt(D) call is in effect until all currently running
+** SQL statements on [database connection] D complete. Any new SQL statements
+** that are started after the sqlite3_interrupt() call and before the
+** running statements reaches zero are interrupted as if they had been
+** running prior to the sqlite3_interrupt() call. New SQL statements
+** that are started after the running statement count reaches zero are
+** not effected by the sqlite3_interrupt().
+** A call to sqlite3_interrupt(D) that occurs when there are no running
+** SQL statements is a no-op and has no effect on SQL statements
+** that are started after the sqlite3_interrupt() call returns.
+**
+** Requirements:
+** [H12271] [H12272]
+**
+** If the database connection closes while [sqlite3_interrupt()]
+** is running then bad things will likely happen.
*/
-void sqlite3_interrupt(sqlite3*);
+SQLITE_API void sqlite3_interrupt(sqlite3*);
/*
-** CAPI3REF: Determine If An SQL Statement Is Complete {F10510}
+** CAPI3REF: Determine If An SQL Statement Is Complete {H10510} <S70200>
**
-** These routines are useful for command-line input to determine if the
-** currently entered text seems to form complete a SQL statement or
+** These routines are useful during command-line input to determine if the
+** currently entered text seems to form a complete SQL statement or
** if additional input is needed before sending the text into
-** SQLite for parsing. These routines return true if the input string
+** SQLite for parsing. These routines return 1 if the input string
** appears to be a complete SQL statement. A statement is judged to be
-** complete if it ends with a semicolon token and is not a fragment of a
-** CREATE TRIGGER statement. Semicolons that are embedded within
+** complete if it ends with a semicolon token and is not a prefix of a
+** well-formed CREATE TRIGGER statement. Semicolons that are embedded within
** string literals or quoted identifier names or comments are not
** independent tokens (they are part of the token in which they are
-** embedded) and thus do not count as a statement terminator.
+** embedded) and thus do not count as a statement terminator. Whitespace
+** and comments that follow the final semicolon are ignored.
**
-** These routines do not parse the SQL and
-** so will not detect syntactically incorrect SQL.
+** These routines return 0 if the statement is incomplete. If a
+** memory allocation fails, then SQLITE_NOMEM is returned.
**
-** INVARIANTS:
+** These routines do not parse the SQL statements thus
+** will not detect syntactically incorrect SQL.
**
-** {F10511} The sqlite3_complete() and sqlite3_complete16() functions
-** return true (non-zero) if and only if the last
-** non-whitespace token in their input is a semicolon that
-** is not in between the BEGIN and END of a CREATE TRIGGER
-** statement.
+** If SQLite has not been initialized using [sqlite3_initialize()] prior
+** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked
+** automatically by sqlite3_complete16(). If that initialization fails,
+** then the return value from sqlite3_complete16() will be non-zero
+** regardless of whether or not the input SQL is complete.
**
-** LIMITATIONS:
+** Requirements: [H10511] [H10512]
**
-** {U10512} The input to sqlite3_complete() must be a zero-terminated
-** UTF-8 string.
+** The input to [sqlite3_complete()] must be a zero-terminated
+** UTF-8 string.
**
-** {U10513} The input to sqlite3_complete16() must be a zero-terminated
-** UTF-16 string in native byte order.
+** The input to [sqlite3_complete16()] must be a zero-terminated
+** UTF-16 string in native byte order.
*/
-int sqlite3_complete(const char *sql);
-int sqlite3_complete16(const void *sql);
+SQLITE_API int sqlite3_complete(const char *sql);
+SQLITE_API int sqlite3_complete16(const void *sql);
/*
-** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {F12310}
+** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {H12310} <S40400>
+**
+** This routine sets a callback function that might be invoked whenever
+** an attempt is made to open a database table that another thread
+** or process has locked.
**
-** This routine identifies a callback function that might be
-** invoked whenever an attempt is made to open a database table
-** that another thread or process has locked.
-** If the busy callback is NULL, then [SQLITE_BUSY]
-** or [SQLITE_IOERR_BLOCKED]
-** is returned immediately upon encountering the lock.
-** If the busy callback is not NULL, then the
-** callback will be invoked with two arguments. The
-** first argument to the handler is a copy of the void* pointer which
-** is the third argument to this routine. The second argument to
-** the handler is the number of times that the busy handler has
-** been invoked for this locking event. If the
+** If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]
+** is returned immediately upon encountering the lock. If the busy callback
+** is not NULL, then the callback will be invoked with two arguments.
+**
+** The first argument to the handler is a copy of the void* pointer which
+** is the third argument to sqlite3_busy_handler(). The second argument to
+** the handler callback is the number of times that the busy handler has
+** been invoked for this locking event. If the
** busy callback returns 0, then no additional attempts are made to
** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned.
** If the callback returns non-zero, then another attempt
** is made to open the database for reading and the cycle repeats.
**
-** The presence of a busy handler does not guarantee that
-** it will be invoked when there is lock contention.
-** If SQLite determines that invoking the busy handler could result in
-** a deadlock, it will go ahead and return [SQLITE_BUSY] or
-** [SQLITE_IOERR_BLOCKED] instead of invoking the
-** busy handler.
+** The presence of a busy handler does not guarantee that it will be invoked
+** when there is lock contention. If SQLite determines that invoking the busy
+** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY]
+** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler.
** Consider a scenario where one process is holding a read lock that
** it is trying to promote to a reserved lock and
** a second process is holding a reserved lock that it is trying
@@ -1138,82 +1521,52 @@ int sqlite3_complete16(const void *sql);
** code is promoted from the relatively benign [SQLITE_BUSY] to
** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion
** forces an automatic rollback of the changes. See the
-** <a href="http://www.sqlite.org/cvstrac/wiki?p=CorruptionFollowingBusyError">
+** <a href="/cvstrac/wiki?p=CorruptionFollowingBusyError">
** CorruptionFollowingBusyError</a> wiki page for a discussion of why
** this is important.
-**
-** There can only be a single busy handler defined for each database
-** connection. Setting a new busy handler clears any previous one.
-** Note that calling [sqlite3_busy_timeout()] will also set or clear
-** the busy handler.
-**
-** INVARIANTS:
-**
-** {F12311} The [sqlite3_busy_handler()] function replaces the busy handler
-** callback in the database connection identified by the 1st
-** parameter with a new busy handler identified by the 2nd and 3rd
-** parameters.
-**
-** {F12312} The default busy handler for new database connections is NULL.
**
-** {F12314} When two or more database connection share a common cache,
-** the busy handler for the database connection currently using
-** the cache is invoked when the cache encounters a lock.
+** There can only be a single busy handler defined for each
+** [database connection]. Setting a new busy handler clears any
+** previously set handler. Note that calling [sqlite3_busy_timeout()]
+** will also set or clear the busy handler.
**
-** {F12316} If a busy handler callback returns zero, then the SQLite
-** interface that provoked the locking event will return
-** [SQLITE_BUSY].
-**
-** {F12318} SQLite will invokes the busy handler with two argument which
-** are a copy of the pointer supplied by the 3rd parameter to
-** [sqlite3_busy_handler()] and a count of the number of prior
-** invocations of the busy handler for the same locking event.
-**
-** LIMITATIONS:
+** The busy callback should not take any actions which modify the
+** database connection that invoked the busy handler. Any such actions
+** result in undefined behavior.
+**
+** Requirements:
+** [H12311] [H12312] [H12314] [H12316] [H12318]
**
-** {U12319} A busy handler should not call close the database connection
-** or prepared statement that invoked the busy handler.
+** A busy handler must not close the database connection
+** or [prepared statement] that invoked the busy handler.
*/
-int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
+SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
/*
-** CAPI3REF: Set A Busy Timeout {F12340}
+** CAPI3REF: Set A Busy Timeout {H12340} <S40410>
**
-** This routine sets a [sqlite3_busy_handler | busy handler]
-** that sleeps for a while when a
-** table is locked. The handler will sleep multiple times until
-** at least "ms" milliseconds of sleeping have been done. {F12343} After
-** "ms" milliseconds of sleeping, the handler returns 0 which
-** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED].
+** This routine sets a [sqlite3_busy_handler | busy handler] that sleeps
+** for a specified amount of time when a table is locked. The handler
+** will sleep multiple times until at least "ms" milliseconds of sleeping
+** have accumulated. {H12343} After "ms" milliseconds of sleeping,
+** the handler returns 0 which causes [sqlite3_step()] to return
+** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED].
**
** Calling this routine with an argument less than or equal to zero
** turns off all busy handlers.
**
-** There can only be a single busy handler for a particular database
-** connection. If another busy handler was defined
-** (using [sqlite3_busy_handler()]) prior to calling
+** There can only be a single busy handler for a particular
+** [database connection] any any given moment. If another busy handler
+** was defined (using [sqlite3_busy_handler()]) prior to calling
** this routine, that other busy handler is cleared.
**
-** INVARIANTS:
-**
-** {F12341} The [sqlite3_busy_timeout()] function overrides any prior
-** [sqlite3_busy_timeout()] or [sqlite3_busy_handler()] setting
-** on the same database connection.
-**
-** {F12343} If the 2nd parameter to [sqlite3_busy_timeout()] is less than
-** or equal to zero, then the busy handler is cleared so that
-** all subsequent locking events immediately return [SQLITE_BUSY].
-**
-** {F12344} If the 2nd parameter to [sqlite3_busy_timeout()] is a positive
-** number N, then a busy handler is set that repeatedly calls
-** the xSleep() method in the VFS interface until either the
-** lock clears or until the cumulative sleep time reported back
-** by xSleep() exceeds N milliseconds.
+** Requirements:
+** [H12341] [H12343] [H12344]
*/
-int sqlite3_busy_timeout(sqlite3*, int ms);
+SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
/*
-** CAPI3REF: Convenience Routines For Running Queries {F12370}
+** CAPI3REF: Convenience Routines For Running Queries {H12370} <S10000>
**
** Definition: A <b>result table</b> is memory data structure created by the
** [sqlite3_get_table()] interface. A result table records the
@@ -1224,16 +1577,14 @@ int sqlite3_busy_timeout(sqlite3*, int ms);
** numbers are obtained separately. Let N be the number of rows
** and M be the number of columns.
**
-** A result table is an array of pointers to zero-terminated
-** UTF-8 strings. There are (N+1)*M elements in the array.
-** The first M pointers point to zero-terminated strings that
-** contain the names of the columns.
-** The remaining entries all point to query results. NULL
-** values are give a NULL pointer. All other values are in
-** their UTF-8 zero-terminated string representation as returned by
-** [sqlite3_column_text()].
+** A result table is an array of pointers to zero-terminated UTF-8 strings.
+** There are (N+1)*M elements in the array. The first M pointers point
+** to zero-terminated strings that contain the names of the columns.
+** The remaining entries all point to query results. NULL values result
+** in NULL pointers. All other values are in their UTF-8 zero-terminated
+** string representation as returned by [sqlite3_column_text()].
**
-** A result table might consists of one or more memory allocations.
+** A result table might consist of one or more memory allocations.
** It is not safe to pass a result table directly to [sqlite3_free()].
** A result table should be deallocated using [sqlite3_free_table()].
**
@@ -1268,11 +1619,11 @@ int sqlite3_busy_timeout(sqlite3*, int ms);
** string of its 2nd parameter. It returns a result table to the
** pointer given in its 3rd parameter.
**
-** After the calling function has finished using the result, it should
-** pass the pointer to the result table to sqlite3_free_table() in order to
-** release the memory that was malloc-ed. Because of the way the
+** After the calling function has finished using the result, it should
+** pass the pointer to the result table to sqlite3_free_table() in order to
+** release the memory that was malloced. Because of the way the
** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling
-** function must not try to call [sqlite3_free()] directly. Only
+** function must not try to call [sqlite3_free()] directly. Only
** [sqlite3_free_table()] is able to release the memory properly and safely.
**
** The sqlite3_get_table() interface is implemented as a wrapper around
@@ -1280,51 +1631,31 @@ int sqlite3_busy_timeout(sqlite3*, int ms);
** to any internal data structures of SQLite. It uses only the public
** interface defined here. As a consequence, errors that occur in the
** wrapper layer outside of the internal [sqlite3_exec()] call are not
-** reflected in subsequent calls to [sqlite3_errcode()] or
-** [sqlite3_errmsg()].
-**
-** INVARIANTS:
-**
-** {F12371} If a [sqlite3_get_table()] fails a memory allocation, then
-** it frees the result table under construction, aborts the
-** query in process, skips any subsequent queries, sets the
-** *resultp output pointer to NULL and returns [SQLITE_NOMEM].
-**
-** {F12373} If the ncolumn parameter to [sqlite3_get_table()] is not NULL
-** then [sqlite3_get_table()] write the number of columns in the
-** result set of the query into *ncolumn if the query is
-** successful (if the function returns SQLITE_OK).
-**
-** {F12374} If the nrow parameter to [sqlite3_get_table()] is not NULL
-** then [sqlite3_get_table()] write the number of rows in the
-** result set of the query into *nrow if the query is
-** successful (if the function returns SQLITE_OK).
-**
-** {F12376} The [sqlite3_get_table()] function sets its *ncolumn value
-** to the number of columns in the result set of the query in the
-** sql parameter, or to zero if the query in sql has an empty
-** result set.
-*/
-int sqlite3_get_table(
- sqlite3*, /* An open database */
- const char *sql, /* SQL to be evaluated */
- char ***pResult, /* Results of the query */
- int *nrow, /* Number of result rows written here */
- int *ncolumn, /* Number of result columns written here */
- char **errmsg /* Error msg written here */
+** reflected in subsequent calls to [sqlite3_errcode()] or [sqlite3_errmsg()].
+**
+** Requirements:
+** [H12371] [H12373] [H12374] [H12376] [H12379] [H12382]
+*/
+SQLITE_API int sqlite3_get_table(
+ sqlite3 *db, /* An open database */
+ const char *zSql, /* SQL to be evaluated */
+ char ***pazResult, /* Results of the query */
+ int *pnRow, /* Number of result rows written here */
+ int *pnColumn, /* Number of result columns written here */
+ char **pzErrmsg /* Error msg written here */
);
-void sqlite3_free_table(char **result);
+SQLITE_API void sqlite3_free_table(char **result);
/*
-** CAPI3REF: Formatted String Printing Functions {F17400}
+** CAPI3REF: Formatted String Printing Functions {H17400} <S70000><S20000>
**
-** These routines are workalikes of the "printf()" family of functions
+** These routines are work-alikes of the "printf()" family of functions
** from the standard C library.
**
** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
** results into memory obtained from [sqlite3_malloc()].
** The strings returned by these two routines should be
-** released by [sqlite3_free()]. Both routines return a
+** released by [sqlite3_free()]. Both routines return a
** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
** memory to hold the resulting string.
**
@@ -1349,7 +1680,7 @@ void sqlite3_free_table(char **result);
**
** These routines all implement some additional formatting
** options that are useful for constructing SQL statements.
-** All of the usual printf formatting options apply. In addition, there
+** All of the usual printf() formatting options apply. In addition, there
** is are "%q", "%Q", and "%z" options.
**
** The %q option works like %s in that it substitutes a null-terminated
@@ -1358,7 +1689,7 @@ void sqlite3_free_table(char **result);
** character it escapes that character and allows it to be inserted into
** the string.
**
-** For example, so some string variable contains text as follows:
+** For example, assume the string variable zText contains text as follows:
**
** <blockquote><pre>
** char *zText = "It's a happy day!";
@@ -1386,14 +1717,13 @@ void sqlite3_free_table(char **result);
** INSERT INTO table1 VALUES('It's a happy day!');
** </pre></blockquote>
**
-** This second example is an SQL syntax error. As a general rule you
-** should always use %q instead of %s when inserting text into a string
-** literal.
+** This second example is an SQL syntax error. As a general rule you should
+** always use %q instead of %s when inserting text into a string literal.
**
** The %Q option works like %q except it also adds single quotes around
-** the outside of the total string. Or if the parameter in the argument
-** list is a NULL pointer, %Q substitutes the text "NULL" (without single
-** quotes) in place of the %Q option. {END} So, for example, one could say:
+** the outside of the total string. Additionally, if the parameter in the
+** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
+** single quotes) in place of the %Q option. So, for example, one could say:
**
** <blockquote><pre>
** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
@@ -1408,35 +1738,20 @@ void sqlite3_free_table(char **result);
** addition that after the string has been read and copied into
** the result, [sqlite3_free()] is called on the input string. {END}
**
-** INVARIANTS:
-**
-** {F17403} The [sqlite3_mprintf()] and [sqlite3_vmprintf()] interfaces
-** return either pointers to zero-terminated UTF-8 strings held in
-** memory obtained from [sqlite3_malloc()] or NULL pointers if
-** a call to [sqlite3_malloc()] fails.
-**
-** {F17406} The [sqlite3_snprintf()] interface writes a zero-terminated
-** UTF-8 string into the buffer pointed to by the second parameter
-** provided that the first parameter is greater than zero.
-**
-** {F17407} The [sqlite3_snprintf()] interface does not writes slots of
-** its output buffer (the second parameter) outside the range
-** of 0 through N-1 (where N is the first parameter)
-** regardless of the length of the string
-** requested by the format specification.
-**
+** Requirements:
+** [H17403] [H17406] [H17407]
*/
-char *sqlite3_mprintf(const char*,...);
-char *sqlite3_vmprintf(const char*, va_list);
-char *sqlite3_snprintf(int,char*,const char*, ...);
+SQLITE_API char *sqlite3_mprintf(const char*,...);
+SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
+SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
/*
-** CAPI3REF: Memory Allocation Subsystem {F17300}
+** CAPI3REF: Memory Allocation Subsystem {H17300} <S20000>
**
** The SQLite core uses these three routines for all of its own
** internal memory allocation needs. "Core" in the previous sentence
** does not include operating-system specific VFS implementation. The
-** windows VFS uses native malloc and free for some operations.
+** Windows VFS uses native malloc() and free() for some operations.
**
** The sqlite3_malloc() routine returns a pointer to a block
** of memory at least N bytes in length, where N is the parameter.
@@ -1454,7 +1769,7 @@ char *sqlite3_snprintf(int,char*,const char*, ...);
** memory might result in a segmentation fault or other severe error.
** Memory corruption, a segmentation fault, or other severe error
** might result if sqlite3_free() is called with a non-NULL pointer that
-** was not obtained from sqlite3_malloc() or sqlite3_free().
+** was not obtained from sqlite3_malloc() or sqlite3_realloc().
**
** The sqlite3_realloc() interface attempts to resize a
** prior memory allocation to be at least N bytes, where N is the
@@ -1465,7 +1780,7 @@ char *sqlite3_snprintf(int,char*,const char*, ...);
** If the second parameter to sqlite3_realloc() is zero or
** negative then the behavior is exactly the same as calling
** sqlite3_free(P) where P is the first parameter to sqlite3_realloc().
-** Sqlite3_realloc() returns a pointer to a memory allocation
+** sqlite3_realloc() returns a pointer to a memory allocation
** of at least N bytes in size or NULL if sufficient memory is unavailable.
** If M is the size of the prior allocation, then min(N,M) bytes
** of the prior allocation are copied into the beginning of buffer returned
@@ -1476,128 +1791,66 @@ char *sqlite3_snprintf(int,char*,const char*, ...);
** The memory returned by sqlite3_malloc() and sqlite3_realloc()
** is always aligned to at least an 8 byte boundary. {END}
**
-** The default implementation
-** of the memory allocation subsystem uses the malloc(), realloc()
-** and free() provided by the standard C library. {F17382} However, if
-** SQLite is compiled with the following C preprocessor macro
-**
-** <blockquote> SQLITE_MEMORY_SIZE=<i>NNN</i> </blockquote>
-**
-** where <i>NNN</i> is an integer, then SQLite create a static
-** array of at least <i>NNN</i> bytes in size and use that array
-** for all of its dynamic memory allocation needs. {END} Additional
-** memory allocator options may be added in future releases.
+** The default implementation of the memory allocation subsystem uses
+** the malloc(), realloc() and free() provided by the standard C library.
+** {H17382} However, if SQLite is compiled with the
+** SQLITE_MEMORY_SIZE=<i>NNN</i> C preprocessor macro (where <i>NNN</i>
+** is an integer), then SQLite create a static array of at least
+** <i>NNN</i> bytes in size and uses that array for all of its dynamic
+** memory allocation needs. {END} Additional memory allocator options
+** may be added in future releases.
**
** In SQLite version 3.5.0 and 3.5.1, it was possible to define
** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
** implementation of these routines to be omitted. That capability
-** is no longer provided. Only built-in memory allocators can be
-** used.
+** is no longer provided. Only built-in memory allocators can be used.
**
-** The windows OS interface layer calls
+** The Windows OS interface layer calls
** the system malloc() and free() directly when converting
** filenames between the UTF-8 encoding used by SQLite
-** and whatever filename encoding is used by the particular windows
+** and whatever filename encoding is used by the particular Windows
** installation. Memory allocation errors are detected, but
** they are reported back as [SQLITE_CANTOPEN] or
** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
**
-** INVARIANTS:
-**
-** {F17303} The [sqlite3_malloc(N)] interface returns either a pointer to
-** newly checked-out block of at least N bytes of memory
-** that is 8-byte aligned,
-** or it returns NULL if it is unable to fulfill the request.
-**
-** {F17304} The [sqlite3_malloc(N)] interface returns a NULL pointer if
-** N is less than or equal to zero.
-**
-** {F17305} The [sqlite3_free(P)] interface releases memory previously
-** returned from [sqlite3_malloc()] or [sqlite3_realloc()],
-** making it available for reuse.
-**
-** {F17306} A call to [sqlite3_free(NULL)] is a harmless no-op.
+** Requirements:
+** [H17303] [H17304] [H17305] [H17306] [H17310] [H17312] [H17315] [H17318]
+** [H17321] [H17322] [H17323]
**
-** {F17310} A call to [sqlite3_realloc(0,N)] is equivalent to a call
-** to [sqlite3_malloc(N)].
-**
-** {F17312} A call to [sqlite3_realloc(P,0)] is equivalent to a call
-** to [sqlite3_free(P)].
-**
-** {F17315} The SQLite core uses [sqlite3_malloc()], [sqlite3_realloc()],
-** and [sqlite3_free()] for all of its memory allocation and
-** deallocation needs.
-**
-** {F17318} The [sqlite3_realloc(P,N)] interface returns either a pointer
-** to a block of checked-out memory of at least N bytes in size
-** that is 8-byte aligned, or a NULL pointer.
-**
-** {F17321} When [sqlite3_realloc(P,N)] returns a non-NULL pointer, it first
-** copies the first K bytes of content from P into the newly allocated
-** where K is the lessor of N and the size of the buffer P.
-**
-** {F17322} When [sqlite3_realloc(P,N)] returns a non-NULL pointer, it first
-** releases the buffer P.
-**
-** {F17323} When [sqlite3_realloc(P,N)] returns NULL, the buffer P is
-** not modified or released.
-**
-** LIMITATIONS:
-**
-** {U17350} The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
-** must be either NULL or else a pointer obtained from a prior
-** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that has
-** not been released.
-**
-** {U17351} The application must not read or write any part of
-** a block of memory after it has been released using
-** [sqlite3_free()] or [sqlite3_realloc()].
+** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
+** must be either NULL or else pointers obtained from a prior
+** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
+** not yet been released.
**
+** The application must not read or write any part of
+** a block of memory after it has been released using
+** [sqlite3_free()] or [sqlite3_realloc()].
*/
-void *sqlite3_malloc(int);
-void *sqlite3_realloc(void*, int);
-void sqlite3_free(void*);
+SQLITE_API void *sqlite3_malloc(int);
+SQLITE_API void *sqlite3_realloc(void*, int);
+SQLITE_API void sqlite3_free(void*);
/*
-** CAPI3REF: Memory Allocator Statistics {F17370}
+** CAPI3REF: Memory Allocator Statistics {H17370} <S30210>
**
** SQLite provides these two interfaces for reporting on the status
** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()]
-** the memory allocation subsystem included within the SQLite.
-**
-** INVARIANTS:
-**
-** {F17371} The [sqlite3_memory_used()] routine returns the
-** number of bytes of memory currently outstanding
-** (malloced but not freed).
-**
-** {F17373} The [sqlite3_memory_highwater()] routine returns the maximum
-** value of [sqlite3_memory_used()]
-** since the highwater mark was last reset.
+** routines, which form the built-in memory allocation subsystem.
**
-** {F17374} The values returned by [sqlite3_memory_used()] and
-** [sqlite3_memory_highwater()] include any overhead
-** added by SQLite in its implementation of [sqlite3_malloc()],
-** but not overhead added by the any underlying system library
-** routines that [sqlite3_malloc()] may call.
-**
-** {F17375} The memory highwater mark is reset to the current value of
-** [sqlite3_memory_used()] if and only if the parameter to
-** [sqlite3_memory_highwater()] is true. The value returned
-** by [sqlite3_memory_highwater(1)] is the highwater mark
-** prior to the reset.
+** Requirements:
+** [H17371] [H17373] [H17374] [H17375]
*/
-sqlite3_int64 sqlite3_memory_used(void);
-sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
+SQLITE_API sqlite3_int64 sqlite3_memory_used(void);
+SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
/*
-** CAPI3REF: Pseudo-Random Number Generator {F17390}
+** CAPI3REF: Pseudo-Random Number Generator {H17390} <S20000>
**
** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
-** select random ROWIDs when inserting new records into a table that
-** already uses the largest possible ROWID. The PRNG is also used for
+** select random [ROWID | ROWIDs] when inserting new records into a table that
+** already uses the largest possible [ROWID]. The PRNG is also used for
** the build-in random() and randomblob() SQL functions. This interface allows
-** appliations to access the same PRNG for other purposes.
+** applications to access the same PRNG for other purposes.
**
** A call to this routine stores N bytes of randomness into buffer P.
**
@@ -1608,15 +1861,13 @@ sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
** internally and without recourse to the [sqlite3_vfs] xRandomness
** method.
**
-** INVARIANTS:
-**
-** {F17392} The [sqlite3_randomness(N,P)] interface writes N bytes of
-** high-quality pseudo-randomness into buffer P.
+** Requirements:
+** [H17392]
*/
-void sqlite3_randomness(int N, void *P);
+SQLITE_API void sqlite3_randomness(int N, void *P);
/*
-** CAPI3REF: Compile-Time Authorization Callbacks {F12500}
+** CAPI3REF: Compile-Time Authorization Callbacks {H12500} <S70100>
**
** This routine registers a authorizer callback with a particular
** [database connection], supplied in the first argument.
@@ -1629,36 +1880,39 @@ void sqlite3_randomness(int N, void *P);
** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the
** specific action but allow the SQL statement to continue to be
** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be
-** rejected with an error. If the authorizer callback returns
+** rejected with an error. If the authorizer callback returns
** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY]
-** then [sqlite3_prepare_v2()] or equivalent call that triggered
+** then the [sqlite3_prepare_v2()] or equivalent call that triggered
** the authorizer will fail with an error message.
**
** When the callback returns [SQLITE_OK], that means the operation
** requested is ok. When the callback returns [SQLITE_DENY], the
** [sqlite3_prepare_v2()] or equivalent call that triggered the
** authorizer will fail with an error message explaining that
-** access is denied. If the authorizer code is [SQLITE_READ]
+** access is denied.
+**
+** The first parameter to the authorizer callback is a copy of the third
+** parameter to the sqlite3_set_authorizer() interface. The second parameter
+** to the callback is an integer [SQLITE_COPY | action code] that specifies
+** the particular action to be authorized. The third through sixth parameters
+** to the callback are zero-terminated strings that contain additional
+** details about the action to be authorized.
+**
+** If the action code is [SQLITE_READ]
** and the callback returns [SQLITE_IGNORE] then the
** [prepared statement] statement is constructed to substitute
** a NULL value in place of the table column that would have
** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE]
** return can be used to deny an untrusted user access to individual
** columns of a table.
-**
-** The first parameter to the authorizer callback is a copy of
-** the third parameter to the sqlite3_set_authorizer() interface.
-** The second parameter to the callback is an integer
-** [SQLITE_COPY | action code] that specifies the particular action
-** to be authorized. The third through sixth
-** parameters to the callback are zero-terminated strings that contain
-** additional details about the action to be authorized.
+** If the action code is [SQLITE_DELETE] and the callback returns
+** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the
+** [truncate optimization] is disabled and all rows are deleted individually.
**
** An authorizer is used when [sqlite3_prepare | preparing]
-** SQL statements from an untrusted
-** source, to ensure that the SQL statements do not try to access data
-** that they are not allowed to see, or that they do not try to
-** execute malicious statements that damage the database. For
+** SQL statements from an untrusted source, to ensure that the SQL statements
+** do not try to access data they are not allowed to see, or that they do not
+** try to execute malicious statements that damage the database. For
** example, an application may allow a user to enter arbitrary
** SQL queries for evaluation by a database. But the application does
** not want the user to be able to make arbitrary changes to the
@@ -1676,70 +1930,34 @@ void sqlite3_randomness(int N, void *P);
** previous call. Disable the authorizer by installing a NULL callback.
** The authorizer is disabled by default.
**
-** Note that the authorizer callback is invoked only during
-** [sqlite3_prepare()] or its variants. Authorization is not
-** performed during statement evaluation in [sqlite3_step()].
-**
-** INVARIANTS:
-**
-** {F12501} The [sqlite3_set_authorizer(D,...)] interface registers a
-** authorizer callback with database connection D.
-**
-** {F12502} The authorizer callback is invoked as SQL statements are
-** being compiled
-**
-** {F12503} If the authorizer callback returns any value other than
-** [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] then
-** the [sqlite3_prepare_v2()] or equivalent call that caused
-** the authorizer callback to run shall fail with an
-** [SQLITE_ERROR] error code and an appropriate error message.
-**
-** {F12504} When the authorizer callback returns [SQLITE_OK], the operation
-** described is coded normally.
-**
-** {F12505} When the authorizer callback returns [SQLITE_DENY], the
-** [sqlite3_prepare_v2()] or equivalent call that caused the
-** authorizer callback to run shall fail
-** with an [SQLITE_ERROR] error code and an error message
-** explaining that access is denied.
-**
-** {F12506} If the authorizer code (the 2nd parameter to the authorizer
-** callback) is [SQLITE_READ] and the authorizer callback returns
-** [SQLITE_IGNORE] then the prepared statement is constructed to
-** insert a NULL value in place of the table column that would have
-** been read if [SQLITE_OK] had been returned.
+** The authorizer callback must not do anything that will modify
+** the database connection that invoked the authorizer callback.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12507} If the authorizer code (the 2nd parameter to the authorizer
-** callback) is anything other than [SQLITE_READ], then
-** a return of [SQLITE_IGNORE] has the same effect as [SQLITE_DENY].
+** When [sqlite3_prepare_v2()] is used to prepare a statement, the
+** statement might be re-prepared during [sqlite3_step()] due to a
+** schema change. Hence, the application should ensure that the
+** correct authorizer callback remains in place during the [sqlite3_step()].
**
-** {F12510} The first parameter to the authorizer callback is a copy of
-** the third parameter to the [sqlite3_set_authorizer()] interface.
-**
-** {F12511} The second parameter to the callback is an integer
-** [SQLITE_COPY | action code] that specifies the particular action
-** to be authorized.
-**
-** {F12512} The third through sixth parameters to the callback are
-** zero-terminated strings that contain
-** additional details about the action to be authorized.
-**
-** {F12520} Each call to [sqlite3_set_authorizer()] overrides the
-** any previously installed authorizer.
-**
-** {F12521} A NULL authorizer means that no authorization
-** callback is invoked.
+** Note that the authorizer callback is invoked only during
+** [sqlite3_prepare()] or its variants. Authorization is not
+** performed during statement evaluation in [sqlite3_step()], unless
+** as stated in the previous paragraph, sqlite3_step() invokes
+** sqlite3_prepare_v2() to reprepare a statement after a schema change.
**
-** {F12522} The default authorizer is NULL.
+** Requirements:
+** [H12501] [H12502] [H12503] [H12504] [H12505] [H12506] [H12507] [H12510]
+** [H12511] [H12512] [H12520] [H12521] [H12522]
*/
-int sqlite3_set_authorizer(
+SQLITE_API int sqlite3_set_authorizer(
sqlite3*,
int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
void *pUserData
);
/*
-** CAPI3REF: Authorizer Return Codes {F12590}
+** CAPI3REF: Authorizer Return Codes {H12590} <H12500>
**
** The [sqlite3_set_authorizer | authorizer callback function] must
** return either [SQLITE_OK] or one of these two constants in order
@@ -1751,45 +1969,26 @@ int sqlite3_set_authorizer(
#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */
/*
-** CAPI3REF: Authorizer Action Codes {F12550}
+** CAPI3REF: Authorizer Action Codes {H12550} <H12500>
**
** The [sqlite3_set_authorizer()] interface registers a callback function
-** that is invoked to authorizer certain SQL statement actions. The
+** that is invoked to authorize certain SQL statement actions. The
** second parameter to the callback is an integer code that specifies
** what action is being authorized. These are the integer action codes that
** the authorizer callback may be passed.
**
-** These action code values signify what kind of operation is to be
+** These action code values signify what kind of operation is to be
** authorized. The 3rd and 4th parameters to the authorization
** callback function will be parameters or NULL depending on which of these
** codes is used as the second parameter. The 5th parameter to the
-** authorizer callback is the name of the database ("main", "temp",
+** authorizer callback is the name of the database ("main", "temp",
** etc.) if applicable. The 6th parameter to the authorizer callback
** is the name of the inner-most trigger or view that is responsible for
-** the access attempt or NULL if this access attempt is directly from
+** the access attempt or NULL if this access attempt is directly from
** top-level SQL code.
**
-** INVARIANTS:
-**
-** {F12551} The second parameter to an
-** [sqlite3_set_authorizer | authorizer callback is always an integer
-** [SQLITE_COPY | authorizer code] that specifies what action
-** is being authorized.
-**
-** {F12552} The 3rd and 4th parameters to the
-** [sqlite3_set_authorizer | authorization callback function]
-** will be parameters or NULL depending on which
-** [SQLITE_COPY | authorizer code] is used as the second parameter.
-**
-** {F12553} The 5th parameter to the
-** [sqlite3_set_authorizer | authorizer callback] is the name
-** of the database (example: "main", "temp", etc.) if applicable.
-**
-** {F12554} The 6th parameter to the
-** [sqlite3_set_authorizer | authorizer callback] is the name
-** of the inner-most trigger or view that is responsible for
-** the access attempt or NULL if this access attempt is directly from
-** top-level SQL code.
+** Requirements:
+** [H12551] [H12552] [H12553] [H12554]
*/
/******************************************* 3rd ************ 4th ***********/
#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */
@@ -1813,7 +2012,7 @@ int sqlite3_set_authorizer(
#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */
#define SQLITE_READ 20 /* Table Name Column Name */
#define SQLITE_SELECT 21 /* NULL NULL */
-#define SQLITE_TRANSACTION 22 /* NULL NULL */
+#define SQLITE_TRANSACTION 22 /* Operation NULL */
#define SQLITE_UPDATE 23 /* Table Name Column Name */
#define SQLITE_ATTACH 24 /* Filename NULL */
#define SQLITE_DETACH 25 /* Database Name NULL */
@@ -1822,11 +2021,13 @@ int sqlite3_set_authorizer(
#define SQLITE_ANALYZE 28 /* Table Name NULL */
#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */
#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */
-#define SQLITE_FUNCTION 31 /* Function Name NULL */
+#define SQLITE_FUNCTION 31 /* NULL Function Name */
+#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */
#define SQLITE_COPY 0 /* No longer used */
/*
-** CAPI3REF: Tracing And Profiling Functions {F12280}
+** CAPI3REF: Tracing And Profiling Functions {H12280} <S60400>
+** EXPERIMENTAL
**
** These routines register callback functions that can be used for
** tracing and profiling the execution of SQL statements.
@@ -1835,255 +2036,146 @@ int sqlite3_set_authorizer(
** various times when an SQL statement is being run by [sqlite3_step()].
** The callback returns a UTF-8 rendering of the SQL statement text
** as the statement first begins executing. Additional callbacks occur
-** as each triggersubprogram is entered. The callbacks for triggers
+** as each triggered subprogram is entered. The callbacks for triggers
** contain a UTF-8 SQL comment that identifies the trigger.
-**
+**
** The callback function registered by sqlite3_profile() is invoked
** as each SQL statement finishes. The profile callback contains
** the original statement text and an estimate of wall-clock time
** of how long that statement took to run.
**
-** The sqlite3_profile() API is currently considered experimental and
-** is subject to change or removal in a future release.
-**
-** The trigger reporting feature of the trace callback is considered
-** experimental and is subject to change or removal in future releases.
-** Future versions of SQLite might also add new trace callback
-** invocations.
-**
-** INVARIANTS:
-**
-** {F12281} The callback function registered by [sqlite3_trace()] is
-** whenever an SQL statement first begins to execute and
-** whenever a trigger subprogram first begins to run.
-**
-** {F12282} Each call to [sqlite3_trace()] overrides the previously
-** registered trace callback.
-**
-** {F12283} A NULL trace callback disables tracing.
-**
-** {F12284} The first argument to the trace callback is a copy of
-** the pointer which was the 3rd argument to [sqlite3_trace()].
-**
-** {F12285} The second argument to the trace callback is a
-** zero-terminated UTF8 string containing the original text
-** of the SQL statement as it was passed into [sqlite3_prepare_v2()]
-** or the equivalent, or an SQL comment indicating the beginning
-** of a trigger subprogram.
-**
-** {F12287} The callback function registered by [sqlite3_profile()] is invoked
-** as each SQL statement finishes.
-**
-** {F12288} The first parameter to the profile callback is a copy of
-** the 3rd parameter to [sqlite3_profile()].
-**
-** {F12289} The second parameter to the profile callback is a
-** zero-terminated UTF-8 string that contains the complete text of
-** the SQL statement as it was processed by [sqlite3_prepare_v2()]
-** or the equivalent.
-**
-** {F12290} The third parameter to the profile callback is an estimate
-** of the number of nanoseconds of wall-clock time required to
-** run the SQL statement from start to finish.
+** Requirements:
+** [H12281] [H12282] [H12283] [H12284] [H12285] [H12287] [H12288] [H12289]
+** [H12290]
*/
-void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
-void *sqlite3_profile(sqlite3*,
+SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
+SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
void(*xProfile)(void*,const char*,sqlite3_uint64), void*);
/*
-** CAPI3REF: Query Progress Callbacks {F12910}
+** CAPI3REF: Query Progress Callbacks {H12910} <S60400>
**
** This routine configures a callback function - the
** progress callback - that is invoked periodically during long
** running calls to [sqlite3_exec()], [sqlite3_step()] and
-** [sqlite3_get_table()]. An example use for this
+** [sqlite3_get_table()]. An example use for this
** interface is to keep a GUI updated during a large query.
**
-** If the progress callback returns non-zero, the opertion is
+** If the progress callback returns non-zero, the operation is
** interrupted. This feature can be used to implement a
-** "Cancel" button on a GUI dialog box.
-**
-** INVARIANTS:
-**
-** {F12911} The callback function registered by [sqlite3_progress_handler()]
-** is invoked periodically during long running calls to
-** [sqlite3_step()].
+** "Cancel" button on a GUI progress dialog box.
**
-** {F12912} The progress callback is invoked once for every N virtual
-** machine opcodes, where N is the second argument to
-** the [sqlite3_progress_handler()] call that registered
-** the callback. <todo>What if N is less than 1?</todo>
+** The progress handler must not do anything that will modify
+** the database connection that invoked the progress handler.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12913} The progress callback itself is identified by the third
-** argument to [sqlite3_progress_handler()].
+** Requirements:
+** [H12911] [H12912] [H12913] [H12914] [H12915] [H12916] [H12917] [H12918]
**
-** {F12914} The fourth argument [sqlite3_progress_handler()] is a
-*** void pointer passed to the progress callback
-** function each time it is invoked.
-**
-** {F12915} If a call to [sqlite3_step()] results in fewer than
-** N opcodes being executed,
-** then the progress callback is never invoked. {END}
-**
-** {F12916} Every call to [sqlite3_progress_handler()]
-** overwrites any previously registere progress handler.
-**
-** {F12917} If the progress handler callback is NULL then no progress
-** handler is invoked.
-**
-** {F12918} If the progress callback returns a result other than 0, then
-** the behavior is a if [sqlite3_interrupt()] had been called.
*/
-void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
+SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
/*
-** CAPI3REF: Opening A New Database Connection {F12700}
-**
-** These routines open an SQLite database file whose name
-** is given by the filename argument.
-** The filename argument is interpreted as UTF-8
-** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16
-** in the native byte order for [sqlite3_open16()].
-** An [sqlite3*] handle is usually returned in *ppDb, even
-** if an error occurs. The only exception is if SQLite is unable
-** to allocate memory to hold the [sqlite3] object, a NULL will
-** be written into *ppDb instead of a pointer to the [sqlite3] object.
-** If the database is opened (and/or created)
-** successfully, then [SQLITE_OK] is returned. Otherwise an
-** error code is returned. The
-** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
+** CAPI3REF: Opening A New Database Connection {H12700} <S40200>
+**
+** These routines open an SQLite database file whose name is given by the
+** filename argument. The filename argument is interpreted as UTF-8 for
+** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte
+** order for sqlite3_open16(). A [database connection] handle is usually
+** returned in *ppDb, even if an error occurs. The only exception is that
+** if SQLite is unable to allocate memory to hold the [sqlite3] object,
+** a NULL will be written into *ppDb instead of a pointer to the [sqlite3]
+** object. If the database is opened (and/or created) successfully, then
+** [SQLITE_OK] is returned. Otherwise an [error code] is returned. The
+** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
** an English language description of the error.
**
** The default encoding for the database will be UTF-8 if
-** [sqlite3_open()] or [sqlite3_open_v2()] is called and
-** UTF-16 in the native byte order if [sqlite3_open16()] is used.
+** sqlite3_open() or sqlite3_open_v2() is called and
+** UTF-16 in the native byte order if sqlite3_open16() is used.
**
** Whether or not an error occurs when it is opened, resources
-** associated with the [sqlite3*] handle should be released by passing it
-** to [sqlite3_close()] when it is no longer required.
+** associated with the [database connection] handle should be released by
+** passing it to [sqlite3_close()] when it is no longer required.
**
-** The [sqlite3_open_v2()] interface works like [sqlite3_open()]
-** except that it acccepts two additional parameters for additional control
-** over the new database connection. The flags parameter can be
-** one of:
+** The sqlite3_open_v2() interface works like sqlite3_open()
+** except that it accepts two additional parameters for additional control
+** over the new database connection. The flags parameter can take one of
+** the following three values, optionally combined with the
+** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
+** and/or [SQLITE_OPEN_PRIVATECACHE] flags:
**
-** <ol>
-** <li> [SQLITE_OPEN_READONLY]
-** <li> [SQLITE_OPEN_READWRITE]
-** <li> [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
-** </ol>
+** <dl>
+** <dt>[SQLITE_OPEN_READONLY]</dt>
+** <dd>The database is opened in read-only mode. If the database does not
+** already exist, an error is returned.</dd>
+**
+** <dt>[SQLITE_OPEN_READWRITE]</dt>
+** <dd>The database is opened for reading and writing if possible, or reading
+** only if the file is write protected by the operating system. In either
+** case the database must already exist, otherwise an error is returned.</dd>
+**
+** <dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
+** <dd>The database is opened for reading and writing, and is creates it if
+** it does not already exist. This is the behavior that is always used for
+** sqlite3_open() and sqlite3_open16().</dd>
+** </dl>
**
-** The first value opens the database read-only.
-** If the database does not previously exist, an error is returned.
-** The second option opens
-** the database for reading and writing if possible, or reading only if
-** if the file is write protected. In either case the database
-** must already exist or an error is returned. The third option
-** opens the database for reading and writing and creates it if it does
-** not already exist.
-** The third options is behavior that is always used for [sqlite3_open()]
-** and [sqlite3_open16()].
-**
-** If the 3rd parameter to [sqlite3_open_v2()] is not one of the
-** combinations shown above then the behavior is undefined.
-**
-** If the filename is ":memory:", then an private
-** in-memory database is created for the connection. This in-memory
-** database will vanish when the database connection is closed. Future
-** version of SQLite might make use of additional special filenames
-** that begin with the ":" character. It is recommended that
-** when a database filename really does begin with
-** ":" that you prefix the filename with a pathname like "./" to
-** avoid ambiguity.
-**
-** If the filename is an empty string, then a private temporary
+** If the 3rd parameter to sqlite3_open_v2() is not one of the
+** combinations shown above or one of the combinations shown above combined
+** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX],
+** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_SHAREDCACHE] flags,
+** then the behavior is undefined.
+**
+** If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection
+** opens in the multi-thread [threading mode] as long as the single-thread
+** mode has not been set at compile-time or start-time. If the
+** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens
+** in the serialized [threading mode] unless single-thread was
+** previously selected at compile-time or start-time.
+** The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be
+** eligible to use [shared cache mode], regardless of whether or not shared
+** cache is enabled using [sqlite3_enable_shared_cache()]. The
+** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not
+** participate in [shared cache mode] even if it is enabled.
+**
+** If the filename is ":memory:", then a private, temporary in-memory database
+** is created for the connection. This in-memory database will vanish when
+** the database connection is closed. Future versions of SQLite might
+** make use of additional special filenames that begin with the ":" character.
+** It is recommended that when a database filename actually does begin with
+** a ":" character you should prefix the filename with a pathname such as
+** "./" to avoid ambiguity.
+**
+** If the filename is an empty string, then a private, temporary
** on-disk database will be created. This private database will be
** automatically deleted as soon as the database connection is closed.
**
** The fourth parameter to sqlite3_open_v2() is the name of the
-** [sqlite3_vfs] object that defines the operating system
-** interface that the new database connection should use. If the
-** fourth parameter is a NULL pointer then the default [sqlite3_vfs]
-** object is used.
+** [sqlite3_vfs] object that defines the operating system interface that
+** the new database connection should use. If the fourth parameter is
+** a NULL pointer then the default [sqlite3_vfs] object is used.
**
-** <b>Note to windows users:</b> The encoding used for the filename argument
-** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever
+** <b>Note to Windows users:</b> The encoding used for the filename argument
+** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever
** codepage is currently defined. Filenames containing international
** characters must be converted to UTF-8 prior to passing them into
-** [sqlite3_open()] or [sqlite3_open_v2()].
-**
-** INVARIANTS:
-**
-** {F12701} The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces create a new
-** [database connection] associated with
-** the database file given in their first parameter.
-**
-** {F12702} The filename argument is interpreted as UTF-8
-** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16
-** in the native byte order for [sqlite3_open16()].
-**
-** {F12703} A successful invocation of [sqlite3_open()], [sqlite3_open16()],
-** or [sqlite3_open_v2()] writes a pointer to a new
-** [database connection] into *ppDb.
-**
-** {F12704} The [sqlite3_open()], [sqlite3_open16()], and
-** [sqlite3_open_v2()] interfaces return [SQLITE_OK] upon success,
-** or an appropriate [error code] on failure.
-**
-** {F12706} The default text encoding for a new database created using
-** [sqlite3_open()] or [sqlite3_open_v2()] will be UTF-8.
+** sqlite3_open() or sqlite3_open_v2().
**
-** {F12707} The default text encoding for a new database created using
-** [sqlite3_open16()] will be UTF-16.
-**
-** {F12709} The [sqlite3_open(F,D)] interface is equivalent to
-** [sqlite3_open_v2(F,D,G,0)] where the G parameter is
-** [SQLITE_OPEN_READWRITE]|[SQLITE_OPEN_CREATE].
-**
-** {F12711} If the G parameter to [sqlite3_open_v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_READONLY] then the database is opened
-** for reading only.
-**
-** {F12712} If the G parameter to [sqlite3_open_v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_READWRITE] then the database is opened
-** reading and writing if possible, or for reading only if the
-** file is write protected by the operating system.
-**
-** {F12713} If the G parameter to [sqlite3_open(v2(F,D,G,V)] omits the
-** bit value [SQLITE_OPEN_CREATE] and the database does not
-** previously exist, an error is returned.
-**
-** {F12714} If the G parameter to [sqlite3_open(v2(F,D,G,V)] contains the
-** bit value [SQLITE_OPEN_CREATE] and the database does not
-** previously exist, then an attempt is made to create and
-** initialize the database.
-**
-** {F12717} If the filename argument to [sqlite3_open()], [sqlite3_open16()],
-** or [sqlite3_open_v2()] is ":memory:", then an private,
-** ephemeral, in-memory database is created for the connection.
-** <todo>Is SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE required
-** in sqlite3_open_v2()?</todo>
-**
-** {F12719} If the filename is NULL or an empty string, then a private,
-** ephermeral on-disk database will be created.
-** <todo>Is SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE required
-** in sqlite3_open_v2()?</todo>
-**
-** {F12721} The [database connection] created by
-** [sqlite3_open_v2(F,D,G,V)] will use the
-** [sqlite3_vfs] object identified by the V parameter, or
-** the default [sqlite3_vfs] object is V is a NULL pointer.
+** Requirements:
+** [H12701] [H12702] [H12703] [H12704] [H12706] [H12707] [H12709] [H12711]
+** [H12712] [H12713] [H12714] [H12717] [H12719] [H12721] [H12723]
*/
-int sqlite3_open(
+SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
-int sqlite3_open16(
+SQLITE_API int sqlite3_open16(
const void *filename, /* Database filename (UTF-16) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
-int sqlite3_open_v2(
+SQLITE_API int sqlite3_open_v2(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb, /* OUT: SQLite db handle */
int flags, /* Flags */
@@ -2091,68 +2183,61 @@ int sqlite3_open_v2(
);
/*
-** CAPI3REF: Error Codes And Messages {F12800}
+** CAPI3REF: Error Codes And Messages {H12800} <S60200>
**
-** The sqlite3_errcode() interface returns the numeric
-** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code]
-** for the most recent failed sqlite3_* API call associated
-** with [sqlite3] handle 'db'. If a prior API call failed but the
-** most recent API call succeeded, the return value from sqlite3_errcode()
-** is undefined.
+** The sqlite3_errcode() interface returns the numeric [result code] or
+** [extended result code] for the most recent failed sqlite3_* API call
+** associated with a [database connection]. If a prior API call failed
+** but the most recent API call succeeded, the return value from
+** sqlite3_errcode() is undefined. The sqlite3_extended_errcode()
+** interface is the same except that it always returns the
+** [extended result code] even when extended result codes are
+** disabled.
**
** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
-** text that describes the error, as either UTF8 or UTF16 respectively.
+** text that describes the error, as either UTF-8 or UTF-16 respectively.
** Memory to hold the error message string is managed internally.
-** The application does not need to worry with freeing the result.
+** The application does not need to worry about freeing the result.
** However, the error string might be overwritten or deallocated by
** subsequent calls to other SQLite interface functions.
**
-** INVARIANTS:
-**
-** {F12801} The [sqlite3_errcode(D)] interface returns the numeric
-** [SQLITE_OK | result code] or
-** [SQLITE_IOERR_READ | extended result code]
-** for the most recently failed interface call associated
-** with [database connection] D.
-**
-** {F12803} The [sqlite3_errmsg(D)] and [sqlite3_errmsg16(D)]
-** interfaces return English-language text that describes
-** the error in the mostly recently failed interface call,
-** encoded as either UTF8 or UTF16 respectively.
-**
-** {F12807} The strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]
-** are valid until the next SQLite interface call.
-**
-** {F12808} Calls to API routines that do not return an error code
-** (example: [sqlite3_data_count()]) do not
-** change the error code or message returned by
-** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()].
-**
-** {F12809} Interfaces that are not associated with a specific
-** [database connection] (examples:
-** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()]
-** do not change the values returned by
-** [sqlite3_errcode()], [sqlite3_errmsg()], or [sqlite3_errmsg16()].
+** When the serialized [threading mode] is in use, it might be the
+** case that a second error occurs on a separate thread in between
+** the time of the first error and the call to these interfaces.
+** When that happens, the second error will be reported since these
+** interfaces always report the most recent result. To avoid
+** this, each thread can obtain exclusive use of the [database connection] D
+** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning
+** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after
+** all calls to the interfaces listed here are completed.
+**
+** If an interface fails with SQLITE_MISUSE, that means the interface
+** was invoked incorrectly by the application. In that case, the
+** error code and message may or may not be set.
+**
+** Requirements:
+** [H12801] [H12802] [H12803] [H12807] [H12808] [H12809]
*/
-int sqlite3_errcode(sqlite3 *db);
-const char *sqlite3_errmsg(sqlite3*);
-const void *sqlite3_errmsg16(sqlite3*);
+SQLITE_API int sqlite3_errcode(sqlite3 *db);
+SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
+SQLITE_API const char *sqlite3_errmsg(sqlite3*);
+SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
/*
-** CAPI3REF: SQL Statement Object {F13000}
+** CAPI3REF: SQL Statement Object {H13000} <H13010>
** KEYWORDS: {prepared statement} {prepared statements}
**
-** An instance of this object represent single SQL statements. This
-** object is variously known as a "prepared statement" or a
+** An instance of this object represents a single SQL statement.
+** This object is variously known as a "prepared statement" or a
** "compiled SQL statement" or simply as a "statement".
-**
+**
** The life of a statement object goes something like this:
**
** <ol>
** <li> Create the object using [sqlite3_prepare_v2()] or a related
** function.
-** <li> Bind values to host parameters using
-** [sqlite3_bind_blob | sqlite3_bind_* interfaces].
+** <li> Bind values to [host parameters] using the sqlite3_bind_*()
+** interfaces.
** <li> Run the SQL by calling [sqlite3_step()] one or more times.
** <li> Reset the statement using [sqlite3_reset()] then go back
** to step 2. Do this zero or more times.
@@ -2165,7 +2250,7 @@ const void *sqlite3_errmsg16(sqlite3*);
typedef struct sqlite3_stmt sqlite3_stmt;
/*
-** CAPI3REF: Run-time Limits {F12760}
+** CAPI3REF: Run-time Limits {H12760} <S20600>
**
** This interface allows the size of various constructs to be limited
** on a connection by connection basis. The first parameter is the
@@ -2175,8 +2260,10 @@ typedef struct sqlite3_stmt sqlite3_stmt;
** new limit for that construct. The function returns the old limit.
**
** If the new limit is a negative number, the limit is unchanged.
-** For the limit category of SQLITE_LIMIT_XYZ there is a hard upper
-** bound set by a compile-time C-preprocess macro named SQLITE_MAX_XYZ.
+** For the limit category of SQLITE_LIMIT_XYZ there is a
+** [limits | hard upper bound]
+** set by a compile-time C preprocessor macro named
+** [limits | SQLITE_MAX_XYZ].
** (The "_LIMIT_" in the name is changed to "_MAX_".)
** Attempts to increase a limit above its hard upper bound are
** silently truncated to the hard upper limit.
@@ -2184,55 +2271,42 @@ typedef struct sqlite3_stmt sqlite3_stmt;
** Run time limits are intended for use in applications that manage
** both their own internal database and also databases that are controlled
** by untrusted external sources. An example application might be a
-** webbrowser that has its own databases for storing history and
-** separate databases controlled by javascript applications downloaded
-** off the internet. The internal databases can be given the
+** web browser that has its own databases for storing history and
+** separate databases controlled by JavaScript applications downloaded
+** off the Internet. The internal databases can be given the
** large, default limits. Databases managed by external sources can
** be given much smaller limits designed to prevent a denial of service
-** attach. Developers might also want to use the [sqlite3_set_authorizer()]
+** attack. Developers might also want to use the [sqlite3_set_authorizer()]
** interface to further control untrusted SQL. The size of the database
** created by an untrusted script can be contained using the
** [max_page_count] [PRAGMA].
**
-** This interface is currently considered experimental and is subject
-** to change or removal without prior notice.
+** New run-time limit categories may be added in future releases.
**
-** INVARIANTS:
-**
-** {F12762} A successful call to [sqlite3_limit(D,C,V)] where V is
-** positive changes the
-** limit on the size of construct C in [database connection] D
-** to the lessor of V and the hard upper bound on the size
-** of C that is set at compile-time.
-**
-** {F12766} A successful call to [sqlite3_limit(D,C,V)] where V is negative
-** leaves the state of [database connection] D unchanged.
-**
-** {F12769} A successful call to [sqlite3_limit(D,C,V)] returns the
-** value of the limit on the size of construct C in
-** in [database connection] D as it was prior to the call.
+** Requirements:
+** [H12762] [H12766] [H12769]
*/
-int sqlite3_limit(sqlite3*, int id, int newVal);
+SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
/*
-** CAPI3REF: Run-Time Limit Categories {F12790}
+** CAPI3REF: Run-Time Limit Categories {H12790} <H12760>
** KEYWORDS: {limit category} {limit categories}
-**
-** These constants define various aspects of a [database connection]
-** that can be limited in size by calls to [sqlite3_limit()].
-** The meanings of the various limits are as follows:
+**
+** These constants define various performance limits
+** that can be lowered at run-time using [sqlite3_limit()].
+** The synopsis of the meanings of the various limits is shown below.
+** Additional information is available at [limits | Limits in SQLite].
**
** <dl>
** <dt>SQLITE_LIMIT_LENGTH</dt>
-** <dd>The maximum size of any
-** string or blob or table row.<dd>
+** <dd>The maximum size of any string or BLOB or table row.<dd>
**
** <dt>SQLITE_LIMIT_SQL_LENGTH</dt>
** <dd>The maximum length of an SQL statement.</dd>
**
** <dt>SQLITE_LIMIT_COLUMN</dt>
** <dd>The maximum number of columns in a table definition or in the
-** result set of a SELECT or the maximum number of columns in an index
+** result set of a [SELECT] or the maximum number of columns in an index
** or in an ORDER BY or GROUP BY clause.</dd>
**
** <dt>SQLITE_LIMIT_EXPR_DEPTH</dt>
@@ -2249,15 +2323,18 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
** <dd>The maximum number of arguments on a function.</dd>
**
** <dt>SQLITE_LIMIT_ATTACHED</dt>
-** <dd>The maximum number of attached databases.</dd>
+** <dd>The maximum number of [ATTACH | attached databases].</dd>
**
** <dt>SQLITE_LIMIT_LIKE_PATTERN_LENGTH</dt>
-** <dd>The maximum length of the pattern argument to the LIKE or
-** GLOB operators.</dd>
+** <dd>The maximum length of the pattern argument to the [LIKE] or
+** [GLOB] operators.</dd>
**
** <dt>SQLITE_LIMIT_VARIABLE_NUMBER</dt>
** <dd>The maximum number of variables in an SQL statement that can
** be bound.</dd>
+**
+** <dt>SQLITE_LIMIT_TRIGGER_DEPTH</dt>
+** <dd>The maximum depth of recursion for triggers.</dd>
** </dl>
*/
#define SQLITE_LIMIT_LENGTH 0
@@ -2270,54 +2347,55 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
#define SQLITE_LIMIT_ATTACHED 7
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8
#define SQLITE_LIMIT_VARIABLE_NUMBER 9
+#define SQLITE_LIMIT_TRIGGER_DEPTH 10
/*
-** CAPI3REF: Compiling An SQL Statement {F13010}
+** CAPI3REF: Compiling An SQL Statement {H13010} <S10000>
+** KEYWORDS: {SQL statement compiler}
**
** To execute an SQL query, it must first be compiled into a byte-code
-** program using one of these routines.
+** program using one of these routines.
**
-** The first argument "db" is an [database connection]
-** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()]
-** or [sqlite3_open16()].
-** The second argument "zSql" is the statement to be compiled, encoded
+** The first argument, "db", is a [database connection] obtained from a
+** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or
+** [sqlite3_open16()]. The database connection must not have been closed.
+**
+** The second argument, "zSql", is the statement to be compiled, encoded
** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2()
-** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2()
-** use UTF-16. {END}
-**
-** If the nByte argument is less
-** than zero, then zSql is read up to the first zero terminator.
-** If nByte is non-negative, then it is the maximum number of
-** bytes read from zSql. When nByte is non-negative, the
-** zSql string ends at either the first '\000' or '\u0000' character or
+** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2()
+** use UTF-16.
+**
+** If the nByte argument is less than zero, then zSql is read up to the
+** first zero terminator. If nByte is non-negative, then it is the maximum
+** number of bytes read from zSql. When nByte is non-negative, the
+** zSql string ends at either the first '\000' or '\u0000' character or
** the nByte-th byte, whichever comes first. If the caller knows
** that the supplied string is nul-terminated, then there is a small
-** performance advantage to be had by passing an nByte parameter that
-** is equal to the number of bytes in the input string <i>including</i>
-** the nul-terminator bytes.{END}
+** performance advantage to be gained by passing an nByte parameter that
+** is equal to the number of bytes in the input string <i>including</i>
+** the nul-terminator bytes.
**
-** *pzTail is made to point to the first byte past the end of the
-** first SQL statement in zSql. These routines only compiles the first
-** statement in zSql, so *pzTail is left pointing to what remains
-** uncompiled.
+** If pzTail is not NULL then *pzTail is made to point to the first byte
+** past the end of the first SQL statement in zSql. These routines only
+** compile the first statement in zSql, so *pzTail is left pointing to
+** what remains uncompiled.
**
** *ppStmt is left pointing to a compiled [prepared statement] that can be
-** executed using [sqlite3_step()]. Or if there is an error, *ppStmt is
-** set to NULL. If the input text contains no SQL (if the input
-** is and empty string or a comment) then *ppStmt is set to NULL.
-** {U13018} The calling procedure is responsible for deleting the
-** compiled SQL statement
-** using [sqlite3_finalize()] after it has finished with it.
+** executed using [sqlite3_step()]. If there is an error, *ppStmt is set
+** to NULL. If the input text contains no SQL (if the input is an empty
+** string or a comment) then *ppStmt is set to NULL.
+** The calling procedure is responsible for deleting the compiled
+** SQL statement using [sqlite3_finalize()] after it has finished with it.
+** ppStmt may not be NULL.
**
-** On success, [SQLITE_OK] is returned. Otherwise an
-** [error code] is returned.
+** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned.
**
** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are
** recommended for all new programs. The two older interfaces are retained
** for backwards compatibility, but their use is discouraged.
** In the "v2" interfaces, the prepared statement
-** that is returned (the [sqlite3_stmt] object) contains a copy of the
-** original SQL text. {END} This causes the [sqlite3_step()] interface to
+** that is returned (the [sqlite3_stmt] object) contains a copy of the
+** original SQL text. This causes the [sqlite3_step()] interface to
** behave a differently in two ways:
**
** <ol>
@@ -2326,83 +2404,48 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
** always used to do, [sqlite3_step()] will automatically recompile the SQL
** statement and try to run it again. If the schema has changed in
** a way that makes the statement no longer valid, [sqlite3_step()] will still
-** return [SQLITE_SCHEMA]. But unlike the legacy behavior,
-** [SQLITE_SCHEMA] is now a fatal error. Calling
-** [sqlite3_prepare_v2()] again will not make the
+** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is
+** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the
** error go away. Note: use [sqlite3_errmsg()] to find the text
-** of the parsing error that results in an [SQLITE_SCHEMA] return. {END}
+** of the parsing error that results in an [SQLITE_SCHEMA] return.
** </li>
**
** <li>
-** When an error occurs,
-** [sqlite3_step()] will return one of the detailed
-** [error codes] or [extended error codes].
-** The legacy behavior was that [sqlite3_step()] would only return a generic
-** [SQLITE_ERROR] result code and you would have to make a second call to
-** [sqlite3_reset()] in order to find the underlying cause of the problem.
-** With the "v2" prepare interfaces, the underlying reason for the error is
-** returned immediately.
+** When an error occurs, [sqlite3_step()] will return one of the detailed
+** [error codes] or [extended error codes]. The legacy behavior was that
+** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code
+** and you would have to make a second call to [sqlite3_reset()] in order
+** to find the underlying cause of the problem. With the "v2" prepare
+** interfaces, the underlying reason for the error is returned immediately.
** </li>
** </ol>
**
-** INVARIANTS:
+** Requirements:
+** [H13011] [H13012] [H13013] [H13014] [H13015] [H13016] [H13019] [H13021]
**
-** {F13011} The [sqlite3_prepare(db,zSql,...)] and
-** [sqlite3_prepare_v2(db,zSql,...)] interfaces interpret the
-** text in their zSql parameter as UTF-8.
-**
-** {F13012} The [sqlite3_prepare16(db,zSql,...)] and
-** [sqlite3_prepare16_v2(db,zSql,...)] interfaces interpret the
-** text in their zSql parameter as UTF-16 in the native byte order.
-**
-** {F13013} If the nByte argument to [sqlite3_prepare_v2(db,zSql,nByte,...)]
-** and its variants is less than zero, then SQL text is
-** read from zSql is read up to the first zero terminator.
-**
-** {F13014} If the nByte argument to [sqlite3_prepare_v2(db,zSql,nByte,...)]
-** and its variants is non-negative, then at most nBytes bytes
-** SQL text is read from zSql.
-**
-** {F13015} In [sqlite3_prepare_v2(db,zSql,N,P,pzTail)] and its variants
-** if the zSql input text contains more than one SQL statement
-** and pzTail is not NULL, then *pzTail is made to point to the
-** first byte past the end of the first SQL statement in zSql.
-** <todo>What does *pzTail point to if there is one statement?</todo>
-**
-** {F13016} A successful call to [sqlite3_prepare_v2(db,zSql,N,ppStmt,...)]
-** or one of its variants writes into *ppStmt a pointer to a new
-** [prepared statement] or a pointer to NULL
-** if zSql contains nothing other than whitespace or comments.
-**
-** {F13019} The [sqlite3_prepare_v2()] interface and its variants return
-** [SQLITE_OK] or an appropriate [error code] upon failure.
-**
-** {F13021} Before [sqlite3_prepare(db,zSql,nByte,ppStmt,pzTail)] or its
-** variants returns an error (any value other than [SQLITE_OK])
-** it first sets *ppStmt to NULL.
*/
-int sqlite3_prepare(
+SQLITE_API int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
-int sqlite3_prepare_v2(
+SQLITE_API int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
-int sqlite3_prepare16(
+SQLITE_API int sqlite3_prepare16(
sqlite3 *db, /* Database handle */
const void *zSql, /* SQL statement, UTF-16 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const void **pzTail /* OUT: Pointer to unused portion of zSql */
);
-int sqlite3_prepare16_v2(
+SQLITE_API int sqlite3_prepare16_v2(
sqlite3 *db, /* Database handle */
const void *zSql, /* SQL statement, UTF-16 encoded */
int nByte, /* Maximum length of zSql in bytes. */
@@ -2411,85 +2454,78 @@ int sqlite3_prepare16_v2(
);
/*
-** CAPIREF: Retrieving Statement SQL {F13100}
-**
-** This intereface can be used to retrieve a saved copy of the original
-** SQL text used to create a [prepared statement].
+** CAPI3REF: Retrieving Statement SQL {H13100} <H13000>
**
-** INVARIANTS:
+** This interface can be used to retrieve a saved copy of the original
+** SQL text used to create a [prepared statement] if that statement was
+** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()].
**
-** {F13101} If the [prepared statement] passed as
-** the an argument to [sqlite3_sql()] was compiled
-** compiled using either [sqlite3_prepare_v2()] or
-** [sqlite3_prepare16_v2()],
-** then [sqlite3_sql()] function returns a pointer to a
-** zero-terminated string containing a UTF-8 rendering
-** of the original SQL statement.
-**
-** {F13102} If the [prepared statement] passed as
-** the an argument to [sqlite3_sql()] was compiled
-** compiled using either [sqlite3_prepare()] or
-** [sqlite3_prepare16()],
-** then [sqlite3_sql()] function returns a NULL pointer.
-**
-** {F13103} The string returned by [sqlite3_sql(S)] is valid until the
-** [prepared statement] S is deleted using [sqlite3_finalize(S)].
+** Requirements:
+** [H13101] [H13102] [H13103]
*/
-const char *sqlite3_sql(sqlite3_stmt *pStmt);
+SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Dynamically Typed Value Object {F15000}
+** CAPI3REF: Dynamically Typed Value Object {H15000} <S20200>
** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value}
**
** SQLite uses the sqlite3_value object to represent all values
-** that can be stored in a database table.
-** SQLite uses dynamic typing for the values it stores.
-** Values stored in sqlite3_value objects can be
-** be integers, floating point values, strings, BLOBs, or NULL.
+** that can be stored in a database table. SQLite uses dynamic typing
+** for the values it stores. Values stored in sqlite3_value objects
+** can be integers, floating point values, strings, BLOBs, or NULL.
**
** An sqlite3_value object may be either "protected" or "unprotected".
** Some interfaces require a protected sqlite3_value. Other interfaces
** will accept either a protected or an unprotected sqlite3_value.
-** Every interface that accepts sqlite3_value arguments specifies
+** Every interface that accepts sqlite3_value arguments specifies
** whether or not it requires a protected sqlite3_value.
**
** The terms "protected" and "unprotected" refer to whether or not
** a mutex is held. A internal mutex is held for a protected
** sqlite3_value object but no mutex is held for an unprotected
** sqlite3_value object. If SQLite is compiled to be single-threaded
-** (with SQLITE_THREADSAFE=0 and with [sqlite3_threadsafe()] returning 0)
-** then there is no distinction between
-** protected and unprotected sqlite3_value objects and they can be
-** used interchangable. However, for maximum code portability it
-** is recommended that applications make the distinction between
-** between protected and unprotected sqlite3_value objects even if
-** they are single threaded.
+** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0)
+** or if SQLite is run in one of reduced mutex modes
+** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD]
+** then there is no distinction between protected and unprotected
+** sqlite3_value objects and they can be used interchangeably. However,
+** for maximum code portability it is recommended that applications
+** still make the distinction between between protected and unprotected
+** sqlite3_value objects even when not strictly required.
**
** The sqlite3_value objects that are passed as parameters into the
-** implementation of application-defined SQL functions are protected.
+** implementation of [application-defined SQL functions] are protected.
** The sqlite3_value object returned by
** [sqlite3_column_value()] is unprotected.
** Unprotected sqlite3_value objects may only be used with
-** [sqlite3_result_value()] and [sqlite3_bind_value()]. All other
-** interfaces that use sqlite3_value require protected sqlite3_value objects.
+** [sqlite3_result_value()] and [sqlite3_bind_value()].
+** The [sqlite3_value_blob | sqlite3_value_type()] family of
+** interfaces require protected sqlite3_value objects.
*/
typedef struct Mem sqlite3_value;
/*
-** CAPI3REF: SQL Function Context Object {F16001}
+** CAPI3REF: SQL Function Context Object {H16001} <S20200>
**
** The context in which an SQL function executes is stored in an
-** sqlite3_context object. A pointer to an sqlite3_context
-** object is always first parameter to application-defined SQL functions.
+** sqlite3_context object. A pointer to an sqlite3_context object
+** is always first parameter to [application-defined SQL functions].
+** The application-defined SQL function implementation will pass this
+** pointer through into calls to [sqlite3_result_int | sqlite3_result()],
+** [sqlite3_aggregate_context()], [sqlite3_user_data()],
+** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()],
+** and/or [sqlite3_set_auxdata()].
*/
typedef struct sqlite3_context sqlite3_context;
/*
-** CAPI3REF: Binding Values To Prepared Statements {F13500}
+** CAPI3REF: Binding Values To Prepared Statements {H13500} <S70300>
+** KEYWORDS: {host parameter} {host parameters} {host parameter name}
+** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding}
**
-** In the SQL strings input to [sqlite3_prepare_v2()] and its
-** variants, literals may be replace by a parameter in one
-** of these forms:
+** In the SQL strings input to [sqlite3_prepare_v2()] and its variants,
+** literals may be replaced by a [parameter] that matches one of following
+** templates:
**
** <ul>
** <li> ?
@@ -2499,33 +2535,32 @@ typedef struct sqlite3_context sqlite3_context;
** <li> $VVV
** </ul>
**
-** In the parameter forms shown above NNN is an integer literal,
-** VVV alpha-numeric parameter name.
-** The values of these parameters (also called "host parameter names"
-** or "SQL parameters")
+** In the templates above, NNN represents an integer literal,
+** and VVV represents an alphanumeric identifer. The values of these
+** parameters (also called "host parameter names" or "SQL parameters")
** can be set using the sqlite3_bind_*() routines defined here.
**
-** The first argument to the sqlite3_bind_*() routines always
-** is a pointer to the [sqlite3_stmt] object returned from
-** [sqlite3_prepare_v2()] or its variants. The second
-** argument is the index of the parameter to be set. The
-** first parameter has an index of 1. When the same named
-** parameter is used more than once, second and subsequent
-** occurrences have the same index as the first occurrence.
+** The first argument to the sqlite3_bind_*() routines is always
+** a pointer to the [sqlite3_stmt] object returned from
+** [sqlite3_prepare_v2()] or its variants.
+**
+** The second argument is the index of the SQL parameter to be set.
+** The leftmost SQL parameter has an index of 1. When the same named
+** SQL parameter is used more than once, second and subsequent
+** occurrences have the same index as the first occurrence.
** The index for named parameters can be looked up using the
-** [sqlite3_bind_parameter_name()] API if desired. The index
+** [sqlite3_bind_parameter_index()] API if desired. The index
** for "?NNN" parameters is the value of NNN.
-** The NNN value must be between 1 and the compile-time
-** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999).
+** The NNN value must be between 1 and the [sqlite3_limit()]
+** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999).
**
** The third argument is the value to bind to the parameter.
**
-** In those
-** routines that have a fourth argument, its value is the number of bytes
-** in the parameter. To be clear: the value is the number of <u>bytes</u>
-** in the value, not the number of characters.
+** In those routines that have a fourth argument, its value is the
+** number of bytes in the parameter. To be clear: the value is the
+** number of <u>bytes</u> in the value, not the number of characters.
** If the fourth parameter is negative, the length of the string is
-** number of bytes up to the first zero terminator.
+** the number of bytes up to the first zero terminator.
**
** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
@@ -2537,12 +2572,12 @@ typedef struct sqlite3_context sqlite3_context;
** the sqlite3_bind_*() routine returns.
**
** The sqlite3_bind_zeroblob() routine binds a BLOB of length N that
-** is filled with zeros. A zeroblob uses a fixed amount of memory
-** (just an integer to hold it size) while it is being processed.
-** Zeroblobs are intended to serve as place-holders for BLOBs whose
-** content is later written using
-** [sqlite3_blob_open | increment BLOB I/O] routines. A negative
-** value for the zeroblob results in a zero-length BLOB.
+** is filled with zeroes. A zeroblob uses a fixed amount of memory
+** (just an integer to hold its size) while it is being processed.
+** Zeroblobs are intended to serve as placeholders for BLOBs whose
+** content is later written using
+** [sqlite3_blob_open | incremental BLOB I/O] routines.
+** A negative value for the zeroblob results in a zero-length BLOB.
**
** The sqlite3_bind_*() routines must be called after
** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and
@@ -2552,7 +2587,7 @@ typedef struct sqlite3_context sqlite3_context;
**
** These routines return [SQLITE_OK] on success or an error code if
** anything goes wrong. [SQLITE_RANGE] is returned if the parameter
-** index is out of range. [SQLITE_NOMEM] is returned if malloc fails.
+** index is out of range. [SQLITE_NOMEM] is returned if malloc() fails.
** [SQLITE_MISUSE] might be returned if these routines are called on a
** virtual machine that is the wrong state or which has already been finalized.
** Detection of misuse is unreliable. Applications should not depend
@@ -2561,136 +2596,64 @@ typedef struct sqlite3_context sqlite3_context;
** panic rather than return SQLITE_MISUSE.
**
** See also: [sqlite3_bind_parameter_count()],
-** [sqlite3_bind_parameter_name()], and
-** [sqlite3_bind_parameter_index()].
+** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()].
+**
+** Requirements:
+** [H13506] [H13509] [H13512] [H13515] [H13518] [H13521] [H13524] [H13527]
+** [H13530] [H13533] [H13536] [H13539] [H13542] [H13545] [H13548] [H13551]
+**
+*/
+SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
+SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
+SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
+SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
+SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
+SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
+SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
+SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
+SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
+
+/*
+** CAPI3REF: Number Of SQL Parameters {H13600} <S70300>
**
-** INVARIANTS:
-**
-** {F13506} The [sqlite3_prepare | SQL statement compiler] recognizes
-** tokens of the forms "?", "?NNN", "$VVV", ":VVV", and "@VVV"
-** as SQL parameters, where NNN is any sequence of one or more
-** digits and where VVV is any sequence of one or more
-** alphanumeric characters or "::" optionally followed by
-** a string containing no spaces and contained within parentheses.
-**
-** {F13509} The initial value of an SQL parameter is NULL.
-**
-** {F13512} The index of an "?" SQL parameter is one larger than the
-** largest index of SQL parameter to the left, or 1 if
-** the "?" is the leftmost SQL parameter.
-**
-** {F13515} The index of an "?NNN" SQL parameter is the integer NNN.
-**
-** {F13518} The index of an ":VVV", "$VVV", or "@VVV" SQL parameter is
-** the same as the index of leftmost occurances of the same
-** parameter, or one more than the largest index over all
-** parameters to the left if this is the first occurrance
-** of this parameter, or 1 if this is the leftmost parameter.
-**
-** {F13521} The [sqlite3_prepare | SQL statement compiler] fail with
-** an [SQLITE_RANGE] error if the index of an SQL parameter
-** is less than 1 or greater than SQLITE_MAX_VARIABLE_NUMBER.
-**
-** {F13524} Calls to [sqlite3_bind_text | sqlite3_bind(S,N,V,...)]
-** associate the value V with all SQL parameters having an
-** index of N in the [prepared statement] S.
-**
-** {F13527} Calls to [sqlite3_bind_text | sqlite3_bind(S,N,...)]
-** override prior calls with the same values of S and N.
-**
-** {F13530} Bindings established by [sqlite3_bind_text | sqlite3_bind(S,...)]
-** persist across calls to [sqlite3_reset(S)].
-**
-** {F13533} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] SQLite binds the first L
-** bytes of the blob or string pointed to by V, when L
-** is non-negative.
-**
-** {F13536} In calls to [sqlite3_bind_text(S,N,V,L,D)] or
-** [sqlite3_bind_text16(S,N,V,L,D)] SQLite binds characters
-** from V through the first zero character when L is negative.
-**
-** {F13539} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is the special
-** constant [SQLITE_STATIC], SQLite assumes that the value V
-** is held in static unmanaged space that will not change
-** during the lifetime of the binding.
-**
-** {F13542} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is the special
-** constant [SQLITE_TRANSIENT], the routine makes a
-** private copy of V value before it returns.
-**
-** {F13545} In calls to [sqlite3_bind_blob(S,N,V,L,D)],
-** [sqlite3_bind_text(S,N,V,L,D)], or
-** [sqlite3_bind_text16(S,N,V,L,D)] when D is a pointer to
-** a function, SQLite invokes that function to destroy the
-** V value after it has finished using the V value.
-**
-** {F13548} In calls to [sqlite3_bind_zeroblob(S,N,V,L)] the value bound
-** is a blob of L bytes, or a zero-length blob if L is negative.
-**
-** {F13551} In calls to [sqlite3_bind_value(S,N,V)] the V argument may
-** be either a [protected sqlite3_value] object or an
-** [unprotected sqlite3_value] object.
-*/
-int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
-int sqlite3_bind_double(sqlite3_stmt*, int, double);
-int sqlite3_bind_int(sqlite3_stmt*, int, int);
-int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
-int sqlite3_bind_null(sqlite3_stmt*, int);
-int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
-int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
-int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
-int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
-
-/*
-** CAPI3REF: Number Of SQL Parameters {F13600}
-**
-** This routine can be used to find the number of SQL parameters
-** in a prepared statement. SQL parameters are tokens of the
+** This routine can be used to find the number of [SQL parameters]
+** in a [prepared statement]. SQL parameters are tokens of the
** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as
-** place-holders for values that are [sqlite3_bind_blob | bound]
+** placeholders for values that are [sqlite3_bind_blob | bound]
** to the parameters at a later time.
**
-** This routine actually returns the index of the largest parameter.
-** For all forms except ?NNN, this will correspond to the number of
-** unique parameters. If parameters of the ?NNN are used, there may
-** be gaps in the list.
+** This routine actually returns the index of the largest (rightmost)
+** parameter. For all forms except ?NNN, this will correspond to the
+** number of unique parameters. If parameters of the ?NNN are used,
+** there may be gaps in the list.
**
** See also: [sqlite3_bind_blob|sqlite3_bind()],
** [sqlite3_bind_parameter_name()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13601} The [sqlite3_bind_parameter_count(S)] interface returns
-** the largest index of all SQL parameters in the
-** [prepared statement] S, or 0 if S
-** contains no SQL parameters.
+** Requirements:
+** [H13601]
*/
-int sqlite3_bind_parameter_count(sqlite3_stmt*);
+SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*);
/*
-** CAPI3REF: Name Of A Host Parameter {F13620}
+** CAPI3REF: Name Of A Host Parameter {H13620} <S70300>
**
** This routine returns a pointer to the name of the n-th
-** SQL parameter in a [prepared statement].
+** [SQL parameter] in a [prepared statement].
** SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA"
** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA"
** respectively.
** In other words, the initial ":" or "$" or "@" or "?"
** is included as part of the name.
-** Parameters of the form "?" without a following integer have no name.
+** Parameters of the form "?" without a following integer have no name
+** and are also referred to as "anonymous parameters".
**
** The first host parameter has an index of 1, not 0.
**
** If the value n is out of range or if the n-th parameter is
** nameless, then NULL is returned. The returned string is
-** always in the UTF-8 encoding even if the named parameter was
+** always in UTF-8 encoding even if the named parameter was
** originally specified as UTF-16 in [sqlite3_prepare16()] or
** [sqlite3_prepare16_v2()].
**
@@ -2698,18 +2661,13 @@ int sqlite3_bind_parameter_count(sqlite3_stmt*);
** [sqlite3_bind_parameter_count()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13621} The [sqlite3_bind_parameter_name(S,N)] interface returns
-** a UTF-8 rendering of the name of the SQL parameter in
-** [prepared statement] S having index N, or
-** NULL if there is no SQL parameter with index N or if the
-** parameter with index N is an anonymous parameter "?".
+** Requirements:
+** [H13621]
*/
-const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
+SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
/*
-** CAPI3REF: Index Of A Parameter With A Given Name {F13640}
+** CAPI3REF: Index Of A Parameter With A Given Name {H13640} <S70300>
**
** Return the index of an SQL parameter given its name. The
** index value returned is suitable for use as the second
@@ -2722,64 +2680,49 @@ const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
** [sqlite3_bind_parameter_count()], and
** [sqlite3_bind_parameter_index()].
**
-** INVARIANTS:
-**
-** {F13641} The [sqlite3_bind_parameter_index(S,N)] interface returns
-** the index of SQL parameter in [prepared statement]
-** S whose name matches the UTF-8 string N, or 0 if there is
-** no match.
+** Requirements:
+** [H13641]
*/
-int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
+SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
/*
-** CAPI3REF: Reset All Bindings On A Prepared Statement {F13660}
-**
-** Contrary to the intuition of many, [sqlite3_reset()] does not
-** reset the [sqlite3_bind_blob | bindings] on a
-** [prepared statement]. Use this routine to
-** reset all host parameters to NULL.
+** CAPI3REF: Reset All Bindings On A Prepared Statement {H13660} <S70300>
**
-** INVARIANTS:
+** Contrary to the intuition of many, [sqlite3_reset()] does not reset
+** the [sqlite3_bind_blob | bindings] on a [prepared statement].
+** Use this routine to reset all host parameters to NULL.
**
-** {F13661} The [sqlite3_clear_bindings(S)] interface resets all
-** SQL parameter bindings in [prepared statement] S
-** back to NULL.
+** Requirements:
+** [H13661]
*/
-int sqlite3_clear_bindings(sqlite3_stmt*);
+SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*);
/*
-** CAPI3REF: Number Of Columns In A Result Set {F13710}
+** CAPI3REF: Number Of Columns In A Result Set {H13710} <S10700>
**
-** Return the number of columns in the result set returned by the
-** [prepared statement]. This routine returns 0
-** if pStmt is an SQL statement that does not return data (for
-** example an UPDATE).
+** Return the number of columns in the result set returned by the
+** [prepared statement]. This routine returns 0 if pStmt is an SQL
+** statement that does not return data (for example an [UPDATE]).
**
-** INVARIANTS:
-**
-** {F13711} The [sqlite3_column_count(S)] interface returns the number of
-** columns in the result set generated by the
-** [prepared statement] S, or 0 if S does not generate
-** a result set.
+** Requirements:
+** [H13711]
*/
-int sqlite3_column_count(sqlite3_stmt *pStmt);
+SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Column Names In A Result Set {F13720}
+** CAPI3REF: Column Names In A Result Set {H13720} <S10700>
**
** These routines return the name assigned to a particular column
-** in the result set of a SELECT statement. The sqlite3_column_name()
-** interface returns a pointer to a zero-terminated UTF8 string
+** in the result set of a [SELECT] statement. The sqlite3_column_name()
+** interface returns a pointer to a zero-terminated UTF-8 string
** and sqlite3_column_name16() returns a pointer to a zero-terminated
-** UTF16 string. The first parameter is the
-** [prepared statement] that implements the SELECT statement.
-** The second parameter is the column number. The left-most column is
-** number 0.
+** UTF-16 string. The first parameter is the [prepared statement]
+** that implements the [SELECT] statement. The second parameter is the
+** column number. The leftmost column is number 0.
**
-** The returned string pointer is valid until either the
-** [prepared statement] is destroyed by [sqlite3_finalize()]
-** or until the next call sqlite3_column_name() or sqlite3_column_name16()
-** on the same column.
+** The returned string pointer is valid until either the [prepared statement]
+** is destroyed by [sqlite3_finalize()] or until the next call to
+** sqlite3_column_name() or sqlite3_column_name16() on the same column.
**
** If sqlite3_malloc() fails during the processing of either routine
** (for example during a conversion from UTF-8 to UTF-16) then a
@@ -2790,168 +2733,85 @@ int sqlite3_column_count(sqlite3_stmt *pStmt);
** then the name of the column is unspecified and may change from
** one release of SQLite to the next.
**
-** INVARIANTS:
-**
-** {F13721} A successful invocation of the [sqlite3_column_name(S,N)]
-** interface returns the name
-** of the Nth column (where 0 is the left-most column) for the
-** result set of [prepared statement] S as a
-** zero-terminated UTF-8 string.
-**
-** {F13723} A successful invocation of the [sqlite3_column_name16(S,N)]
-** interface returns the name
-** of the Nth column (where 0 is the left-most column) for the
-** result set of [prepared statement] S as a
-** zero-terminated UTF-16 string in the native byte order.
-**
-** {F13724} The [sqlite3_column_name()] and [sqlite3_column_name16()]
-** interfaces return a NULL pointer if they are unable to
-** allocate memory memory to hold there normal return strings.
-**
-** {F13725} If the N parameter to [sqlite3_column_name(S,N)] or
-** [sqlite3_column_name16(S,N)] is out of range, then the
-** interfaces returns a NULL pointer.
-**
-** {F13726} The strings returned by [sqlite3_column_name(S,N)] and
-** [sqlite3_column_name16(S,N)] are valid until the next
-** call to either routine with the same S and N parameters
-** or until [sqlite3_finalize(S)] is called.
-**
-** {F13727} When a result column of a [SELECT] statement contains
-** an AS clause, the name of that column is the indentifier
-** to the right of the AS keyword.
+** Requirements:
+** [H13721] [H13723] [H13724] [H13725] [H13726] [H13727]
*/
-const char *sqlite3_column_name(sqlite3_stmt*, int N);
-const void *sqlite3_column_name16(sqlite3_stmt*, int N);
+SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N);
+SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N);
/*
-** CAPI3REF: Source Of Data In A Query Result {F13740}
+** CAPI3REF: Source Of Data In A Query Result {H13740} <S10700>
**
** These routines provide a means to determine what column of what
-** table in which database a result of a SELECT statement comes from.
+** table in which database a result of a [SELECT] statement comes from.
** The name of the database or table or column can be returned as
-** either a UTF8 or UTF16 string. The _database_ routines return
+** either a UTF-8 or UTF-16 string. The _database_ routines return
** the database name, the _table_ routines return the table name, and
** the origin_ routines return the column name.
-** The returned string is valid until
-** the [prepared statement] is destroyed using
-** [sqlite3_finalize()] or until the same information is requested
+** The returned string is valid until the [prepared statement] is destroyed
+** using [sqlite3_finalize()] or until the same information is requested
** again in a different encoding.
**
** The names returned are the original un-aliased names of the
** database, table, and column.
**
** The first argument to the following calls is a [prepared statement].
-** These functions return information about the Nth column returned by
+** These functions return information about the Nth column returned by
** the statement, where N is the second function argument.
**
-** If the Nth column returned by the statement is an expression
-** or subquery and is not a column value, then all of these functions
-** return NULL. These routine might also return NULL if a memory
-** allocation error occurs. Otherwise, they return the
-** name of the attached database, table and column that query result
-** column was extracted from.
+** If the Nth column returned by the statement is an expression or
+** subquery and is not a column value, then all of these functions return
+** NULL. These routine might also return NULL if a memory allocation error
+** occurs. Otherwise, they return the name of the attached database, table
+** and column that query result column was extracted from.
**
** As with all other SQLite APIs, those postfixed with "16" return
** UTF-16 encoded strings, the other functions return UTF-8. {END}
**
-** These APIs are only available if the library was compiled with the
-** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined.
+** These APIs are only available if the library was compiled with the
+** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined.
**
-** {U13751}
+** {A13751}
** If two or more threads call one or more of these routines against the same
** prepared statement and column at the same time then the results are
** undefined.
**
-** INVARIANTS:
-**
-** {F13741} The [sqlite3_column_database_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the database from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13742} The [sqlite3_column_database_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the database from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13743} The [sqlite3_column_table_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the table from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13744} The [sqlite3_column_table_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the table from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13745} The [sqlite3_column_origin_name(S,N)] interface returns either
-** the UTF-8 zero-terminated name of the table column from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13746} The [sqlite3_column_origin_name16(S,N)] interface returns either
-** the UTF-16 native byte order
-** zero-terminated name of the table column from which the
-** Nth result column of [prepared statement] S
-** is extracted, or NULL if the the Nth column of S is a
-** general expression or if unable to allocate memory
-** to store the name.
-**
-** {F13748} The return values from
-** [sqlite3_column_database_name|column metadata interfaces]
-** are valid
-** for the lifetime of the [prepared statement]
-** or until the encoding is changed by another metadata
-** interface call for the same prepared statement and column.
-**
-** LIMITATIONS:
-**
-** {U13751} If two or more threads call one or more
-** [sqlite3_column_database_name|column metadata interfaces]
-** the same [prepared statement] and result column
-** at the same time then the results are undefined.
-*/
-const char *sqlite3_column_database_name(sqlite3_stmt*,int);
-const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
-const char *sqlite3_column_table_name(sqlite3_stmt*,int);
-const void *sqlite3_column_table_name16(sqlite3_stmt*,int);
-const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
-const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
-
-/*
-** CAPI3REF: Declared Datatype Of A Query Result {F13760}
-**
-** The first parameter is a [prepared statement].
-** If this statement is a SELECT statement and the Nth column of the
-** returned result set of that SELECT is a table column (not an
+** Requirements:
+** [H13741] [H13742] [H13743] [H13744] [H13745] [H13746] [H13748]
+**
+** If two or more threads call one or more
+** [sqlite3_column_database_name | column metadata interfaces]
+** for the same [prepared statement] and result column
+** at the same time then the results are undefined.
+*/
+SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int);
+SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
+SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int);
+SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int);
+SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
+SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
+
+/*
+** CAPI3REF: Declared Datatype Of A Query Result {H13760} <S10700>
+**
+** The first parameter is a [prepared statement].
+** If this statement is a [SELECT] statement and the Nth column of the
+** returned result set of that [SELECT] is a table column (not an
** expression or subquery) then the declared type of the table
** column is returned. If the Nth column of the result set is an
** expression or subquery, then a NULL pointer is returned.
-** The returned string is always UTF-8 encoded. {END}
-** For example, in the database schema:
+** The returned string is always UTF-8 encoded. {END}
+**
+** For example, given the database schema:
**
** CREATE TABLE t1(c1 VARIANT);
**
-** And the following statement compiled:
+** and the following statement to be compiled:
**
** SELECT c1 + 1, c1 FROM t1;
**
-** Then this routine would return the string "VARIANT" for the second
-** result column (i==1), and a NULL pointer for the first result column
-** (i==0).
+** this routine would return the string "VARIANT" for the second result
+** column (i==1), and a NULL pointer for the first result column (i==0).
**
** SQLite uses dynamic run-time typing. So just because a column
** is declared to contain a particular type does not mean that the
@@ -2960,57 +2820,36 @@ const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
** is associated with individual values, not with the containers
** used to hold those values.
**
-** INVARIANTS:
-**
-** {F13761} A successful call to [sqlite3_column_decltype(S,N)]
-** returns a zero-terminated UTF-8 string containing the
-** the declared datatype of the table column that appears
-** as the Nth column (numbered from 0) of the result set to the
-** [prepared statement] S.
-**
-** {F13762} A successful call to [sqlite3_column_decltype16(S,N)]
-** returns a zero-terminated UTF-16 native byte order string
-** containing the declared datatype of the table column that appears
-** as the Nth column (numbered from 0) of the result set to the
-** [prepared statement] S.
-**
-** {F13763} If N is less than 0 or N is greater than or equal to
-** the number of columns in [prepared statement] S
-** or if the Nth column of S is an expression or subquery rather
-** than a table column or if a memory allocation failure
-** occurs during encoding conversions, then
-** calls to [sqlite3_column_decltype(S,N)] or
-** [sqlite3_column_decltype16(S,N)] return NULL.
-*/
-const char *sqlite3_column_decltype(sqlite3_stmt*,int);
-const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
-
-/*
-** CAPI3REF: Evaluate An SQL Statement {F13200}
-**
-** After an [prepared statement] has been prepared with a call
-** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of
-** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()],
-** then this function must be called one or more times to evaluate the
-** statement.
-**
-** The details of the behavior of this sqlite3_step() interface depend
+** Requirements:
+** [H13761] [H13762] [H13763]
+*/
+SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int);
+SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
+
+/*
+** CAPI3REF: Evaluate An SQL Statement {H13200} <S10000>
+**
+** After a [prepared statement] has been prepared using either
+** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy
+** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function
+** must be called one or more times to evaluate the statement.
+**
+** The details of the behavior of the sqlite3_step() interface depend
** on whether the statement was prepared using the newer "v2" interface
** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy
** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the
** new "v2" interface is recommended for new applications but the legacy
** interface will continue to be supported.
**
-** In the legacy interface, the return value will be either [SQLITE_BUSY],
+** In the legacy interface, the return value will be either [SQLITE_BUSY],
** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE].
-** With the "v2" interface, any of the other [SQLITE_OK | result code]
-** or [SQLITE_IOERR_READ | extended result code] might be returned as
-** well.
+** With the "v2" interface, any of the other [result codes] or
+** [extended result codes] might be returned as well.
**
** [SQLITE_BUSY] means that the database engine was unable to acquire the
-** database locks it needs to do its job. If the statement is a COMMIT
+** database locks it needs to do its job. If the statement is a [COMMIT]
** or occurs outside of an explicit transaction, then you can retry the
-** statement. If the statement is not a COMMIT and occurs within a
+** statement. If the statement is not a [COMMIT] and occurs within a
** explicit transaction then you should rollback the transaction before
** continuing.
**
@@ -3019,16 +2858,15 @@ const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
** machine without first calling [sqlite3_reset()] to reset the virtual
** machine back to its initial state.
**
-** If the SQL statement being executed returns any data, then
-** [SQLITE_ROW] is returned each time a new row of data is ready
-** for processing by the caller. The values may be accessed using
-** the [sqlite3_column_int | column access functions].
+** If the SQL statement being executed returns any data, then [SQLITE_ROW]
+** is returned each time a new row of data is ready for processing by the
+** caller. The values may be accessed using the [column access functions].
** sqlite3_step() is called again to retrieve the next row of data.
-**
+**
** [SQLITE_ERROR] means that a run-time error (such as a constraint
** violation) has occurred. sqlite3_step() should not be called again on
** the VM. More information may be found by calling [sqlite3_errmsg()].
-** With the legacy interface, a more specific error code (example:
+** With the legacy interface, a more specific error code (for example,
** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth)
** can be obtained by calling [sqlite3_reset()] on the
** [prepared statement]. In the "v2" interface,
@@ -3036,80 +2874,43 @@ const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
**
** [SQLITE_MISUSE] means that the this routine was called inappropriately.
** Perhaps it was called on a [prepared statement] that has
-** already been [sqlite3_finalize | finalized] or on one that had
+** already been [sqlite3_finalize | finalized] or on one that had
** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could
** be the case that the same database connection is being used by two or
** more threads at the same moment in time.
**
-** <b>Goofy Interface Alert:</b>
-** In the legacy interface,
-** the sqlite3_step() API always returns a generic error code,
-** [SQLITE_ERROR], following any error other than [SQLITE_BUSY]
-** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or
-** [sqlite3_finalize()] in order to find one of the specific
-** [error codes] that better describes the error.
+** <b>Goofy Interface Alert:</b> In the legacy interface, the sqlite3_step()
+** API always returns a generic error code, [SQLITE_ERROR], following any
+** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call
+** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the
+** specific [error codes] that better describes the error.
** We admit that this is a goofy design. The problem has been fixed
** with the "v2" interface. If you prepare all of your SQL statements
** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead
-** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the
-** more specific [error codes] are returned directly
+** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces,
+** then the more specific [error codes] are returned directly
** by sqlite3_step(). The use of the "v2" interface is recommended.
**
-** INVARIANTS:
-**
-** {F13202} If [prepared statement] S is ready to be
-** run, then [sqlite3_step(S)] advances that prepared statement
-** until to completion or until it is ready to return another
-** row of the result set or an interrupt or run-time error occurs.
-**
-** {F15304} When a call to [sqlite3_step(S)] causes the
-** [prepared statement] S to run to completion,
-** the function returns [SQLITE_DONE].
-**
-** {F15306} When a call to [sqlite3_step(S)] stops because it is ready
-** to return another row of the result set, it returns
-** [SQLITE_ROW].
-**
-** {F15308} If a call to [sqlite3_step(S)] encounters an
-** [sqlite3_interrupt|interrupt] or a run-time error,
-** it returns an appropraite error code that is not one of
-** [SQLITE_OK], [SQLITE_ROW], or [SQLITE_DONE].
-**
-** {F15310} If an [sqlite3_interrupt|interrupt] or run-time error
-** occurs during a call to [sqlite3_step(S)]
-** for a [prepared statement] S created using
-** legacy interfaces [sqlite3_prepare()] or
-** [sqlite3_prepare16()] then the function returns either
-** [SQLITE_ERROR], [SQLITE_BUSY], or [SQLITE_MISUSE].
+** Requirements:
+** [H13202] [H15304] [H15306] [H15308] [H15310]
*/
-int sqlite3_step(sqlite3_stmt*);
+SQLITE_API int sqlite3_step(sqlite3_stmt*);
/*
-** CAPI3REF: Number of columns in a result set {F13770}
-**
-** Return the number of values in the current row of the result set.
-**
-** INVARIANTS:
+** CAPI3REF: Number of columns in a result set {H13770} <S10700>
**
-** {F13771} After a call to [sqlite3_step(S)] that returns
-** [SQLITE_ROW], the [sqlite3_data_count(S)] routine
-** will return the same value as the
-** [sqlite3_column_count(S)] function.
+** Returns the number of values in the current row of the result set.
**
-** {F13772} After [sqlite3_step(S)] has returned any value other than
-** [SQLITE_ROW] or before [sqlite3_step(S)] has been
-** called on the [prepared statement] for
-** the first time since it was [sqlite3_prepare|prepared]
-** or [sqlite3_reset|reset], the [sqlite3_data_count(S)]
-** routine returns zero.
+** Requirements:
+** [H13771] [H13772]
*/
-int sqlite3_data_count(sqlite3_stmt *pStmt);
+SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Fundamental Datatypes {F10265}
+** CAPI3REF: Fundamental Datatypes {H10265} <S10110><S10120>
** KEYWORDS: SQLITE_TEXT
**
-** {F10266}Every value in SQLite has one of five fundamental datatypes:
+** {H10266} Every value in SQLite has one of five fundamental datatypes:
**
** <ul>
** <li> 64-bit signed integer
@@ -3123,7 +2924,7 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** Note that the SQLITE_TEXT constant was also used in SQLite version 2
** for a completely different meaning. Software that links against both
-** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not
+** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not
** SQLITE_TEXT.
*/
#define SQLITE_INTEGER 1
@@ -3138,33 +2939,31 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
#define SQLITE3_TEXT 3
/*
-** CAPI3REF: Results Values From A Query {F13800}
+** CAPI3REF: Result Values From A Query {H13800} <S10700>
+** KEYWORDS: {column access functions}
**
** These routines form the "result set query" interface.
**
-** These routines return information about
-** a single column of the current result row of a query. In every
-** case the first argument is a pointer to the
-** [prepared statement] that is being
-** evaluated (the [sqlite3_stmt*] that was returned from
-** [sqlite3_prepare_v2()] or one of its variants) and
-** the second argument is the index of the column for which information
-** should be returned. The left-most column of the result set
-** has an index of 0.
-**
-** If the SQL statement is not currently point to a valid row, or if the
-** the column index is out of range, the result is undefined.
+** These routines return information about a single column of the current
+** result row of a query. In every case the first argument is a pointer
+** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*]
+** that was returned from [sqlite3_prepare_v2()] or one of its variants)
+** and the second argument is the index of the column for which information
+** should be returned. The leftmost column of the result set has the index 0.
+**
+** If the SQL statement does not currently point to a valid row, or if the
+** column index is out of range, the result is undefined.
** These routines may only be called when the most recent call to
** [sqlite3_step()] has returned [SQLITE_ROW] and neither
-** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently.
+** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently.
** If any of these routines are called after [sqlite3_reset()] or
** [sqlite3_finalize()] or after [sqlite3_step()] has returned
** something other than [SQLITE_ROW], the results are undefined.
** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()]
** are called from a different thread while any of these routines
-** are pending, then the results are undefined.
+** are pending, then the results are undefined.
**
-** The sqlite3_column_type() routine returns
+** The sqlite3_column_type() routine returns the
** [SQLITE_INTEGER | datatype code] for the initial data type
** of the result column. The returned value is one of [SQLITE_INTEGER],
** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value
@@ -3174,7 +2973,7 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
** versions of SQLite may change the behavior of sqlite3_column_type()
** following a type conversion.
**
-** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes()
+** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes()
** routine returns the number of bytes in that BLOB or string.
** If the result is a UTF-16 string, then sqlite3_column_bytes() converts
** the string to UTF-8 and then returns the number of bytes.
@@ -3187,11 +2986,11 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** Strings returned by sqlite3_column_text() and sqlite3_column_text16(),
** even empty strings, are always zero terminated. The return
-** value from sqlite3_column_blob() for a zero-length blob is an arbitrary
+** value from sqlite3_column_blob() for a zero-length BLOB is an arbitrary
** pointer, possibly even a NULL pointer.
**
** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes()
-** but leaves the result in UTF-16 in native byte order instead of UTF-8.
+** but leaves the result in UTF-16 in native byte order instead of UTF-8.
** The zero terminator is not included in this count.
**
** The object returned by [sqlite3_column_value()] is an
@@ -3199,15 +2998,14 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()].
** If the [unprotected sqlite3_value] object returned by
** [sqlite3_column_value()] is used in any other way, including calls
-** to routines like
-** [sqlite3_value_int()], [sqlite3_value_text()], or [sqlite3_value_bytes()],
-** then the behavior is undefined.
+** to routines like [sqlite3_value_int()], [sqlite3_value_text()],
+** or [sqlite3_value_bytes()], then the behavior is undefined.
**
** These routines attempt to convert the value where appropriate. For
** example, if the internal representation is FLOAT and a text result
-** is requested, [sqlite3_snprintf()] is used internally to do the conversion
-** automatically. The following table details the conversions that
-** are applied:
+** is requested, [sqlite3_snprintf()] is used internally to perform the
+** conversion automatically. The following table details the conversions
+** that are applied:
**
** <blockquote>
** <table border="1">
@@ -3219,7 +3017,7 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> NULL <td> BLOB <td> Result is NULL pointer
** <tr><td> INTEGER <td> FLOAT <td> Convert from integer to float
** <tr><td> INTEGER <td> TEXT <td> ASCII rendering of the integer
-** <tr><td> INTEGER <td> BLOB <td> Same as for INTEGER->TEXT
+** <tr><td> INTEGER <td> BLOB <td> Same as INTEGER->TEXT
** <tr><td> FLOAT <td> INTEGER <td> Convert from float to integer
** <tr><td> FLOAT <td> TEXT <td> ASCII rendering of the float
** <tr><td> FLOAT <td> BLOB <td> Same as FLOAT->TEXT
@@ -3234,57 +3032,56 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
**
** The table above makes reference to standard C library functions atoi()
** and atof(). SQLite does not really use these functions. It has its
-** on equavalent internal routines. The atoi() and atof() names are
+** own equivalent internal routines. The atoi() and atof() names are
** used in the table for brevity and because they are familiar to most
** C programmers.
**
** Note that when type conversions occur, pointers returned by prior
** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or
-** sqlite3_column_text16() may be invalidated.
+** sqlite3_column_text16() may be invalidated.
** Type conversions and pointer invalidations might occur
** in the following cases:
**
** <ul>
-** <li><p> The initial content is a BLOB and sqlite3_column_text()
-** or sqlite3_column_text16() is called. A zero-terminator might
-** need to be added to the string.</p></li>
-**
-** <li><p> The initial content is UTF-8 text and sqlite3_column_bytes16() or
-** sqlite3_column_text16() is called. The content must be converted
-** to UTF-16.</p></li>
-**
-** <li><p> The initial content is UTF-16 text and sqlite3_column_bytes() or
-** sqlite3_column_text() is called. The content must be converted
-** to UTF-8.</p></li>
+** <li> The initial content is a BLOB and sqlite3_column_text() or
+** sqlite3_column_text16() is called. A zero-terminator might
+** need to be added to the string.</li>
+** <li> The initial content is UTF-8 text and sqlite3_column_bytes16() or
+** sqlite3_column_text16() is called. The content must be converted
+** to UTF-16.</li>
+** <li> The initial content is UTF-16 text and sqlite3_column_bytes() or
+** sqlite3_column_text() is called. The content must be converted
+** to UTF-8.</li>
** </ul>
**
** Conversions between UTF-16be and UTF-16le are always done in place and do
** not invalidate a prior pointer, though of course the content of the buffer
** that the prior pointer points to will have been modified. Other kinds
-** of conversion are done in place when it is possible, but sometime it is
-** not possible and in those cases prior pointers are invalidated.
+** of conversion are done in place when it is possible, but sometimes they
+** are not possible and in those cases prior pointers are invalidated.
**
** The safest and easiest to remember policy is to invoke these routines
** in one of the following ways:
**
-** <ul>
+** <ul>
** <li>sqlite3_column_text() followed by sqlite3_column_bytes()</li>
** <li>sqlite3_column_blob() followed by sqlite3_column_bytes()</li>
** <li>sqlite3_column_text16() followed by sqlite3_column_bytes16()</li>
-** </ul>
+** </ul>
**
-** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(),
-** or sqlite3_column_text16() first to force the result into the desired
-** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to
-** find the size of the result. Do not mix call to sqlite3_column_text() or
-** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not
-** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes().
+** In other words, you should call sqlite3_column_text(),
+** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result
+** into the desired format, then invoke sqlite3_column_bytes() or
+** sqlite3_column_bytes16() to find the size of the result. Do not mix calls
+** to sqlite3_column_text() or sqlite3_column_blob() with calls to
+** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16()
+** with calls to sqlite3_column_bytes().
**
** The pointers returned are valid until a type conversion occurs as
** described above, or until [sqlite3_step()] or [sqlite3_reset()] or
** [sqlite3_finalize()] is called. The memory space used to hold strings
-** and blobs is freed automatically. Do <b>not</b> pass the pointers returned
-** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
+** and BLOBs is freed automatically. Do <b>not</b> pass the pointers returned
+** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
** [sqlite3_free()].
**
** If a memory allocation error occurs during the evaluation of any
@@ -3293,255 +3090,153 @@ int sqlite3_data_count(sqlite3_stmt *pStmt);
** pointer. Subsequent calls to [sqlite3_errcode()] will return
** [SQLITE_NOMEM].
**
-** INVARIANTS:
-**
-** {F13803} The [sqlite3_column_blob(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a blob and then returns a
-** pointer to the converted value.
-**
-** {F13806} The [sqlite3_column_bytes(S,N)] interface returns the
-** number of bytes in the blob or string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_column_blob(S,N)] or
-** [sqlite3_column_text(S,N)].
-**
-** {F13809} The [sqlite3_column_bytes16(S,N)] interface returns the
-** number of bytes in the string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_column_text16(S,N)].
-**
-** {F13812} The [sqlite3_column_double(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a floating point value and
-** returns a copy of that value.
-**
-** {F13815} The [sqlite3_column_int(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a 64-bit signed integer and
-** returns the lower 32 bits of that integer.
-**
-** {F13818} The [sqlite3_column_int64(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a 64-bit signed integer and
-** returns a copy of that integer.
-**
-** {F13821} The [sqlite3_column_text(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a zero-terminated UTF-8
-** string and returns a pointer to that string.
-**
-** {F13824} The [sqlite3_column_text16(S,N)] interface converts the
-** Nth column in the current row of the result set for
-** [prepared statement] S into a zero-terminated 2-byte
-** aligned UTF-16 native byte order
-** string and returns a pointer to that string.
-**
-** {F13827} The [sqlite3_column_type(S,N)] interface returns
-** one of [SQLITE_NULL], [SQLITE_INTEGER], [SQLITE_FLOAT],
-** [SQLITE_TEXT], or [SQLITE_BLOB] as appropriate for
-** the Nth column in the current row of the result set for
-** [prepared statement] S.
-**
-** {F13830} The [sqlite3_column_value(S,N)] interface returns a
-** pointer to an [unprotected sqlite3_value] object for the
-** Nth column in the current row of the result set for
-** [prepared statement] S.
-*/
-const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
-int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
-int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
-double sqlite3_column_double(sqlite3_stmt*, int iCol);
-int sqlite3_column_int(sqlite3_stmt*, int iCol);
-sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
-const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
-const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
-int sqlite3_column_type(sqlite3_stmt*, int iCol);
-sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
-
-/*
-** CAPI3REF: Destroy A Prepared Statement Object {F13300}
-**
-** The sqlite3_finalize() function is called to delete a
-** [prepared statement]. If the statement was
-** executed successfully, or not executed at all, then SQLITE_OK is returned.
-** If execution of the statement failed then an
-** [error code] or [extended error code]
-** is returned.
+** Requirements:
+** [H13803] [H13806] [H13809] [H13812] [H13815] [H13818] [H13821] [H13824]
+** [H13827] [H13830]
+*/
+SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
+SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
+SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
+SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
+SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
+SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
+SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
+SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
+SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
+SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
+
+/*
+** CAPI3REF: Destroy A Prepared Statement Object {H13300} <S70300><S30100>
+**
+** The sqlite3_finalize() function is called to delete a [prepared statement].
+** If the statement was executed successfully or not executed at all, then
+** SQLITE_OK is returned. If execution of the statement failed then an
+** [error code] or [extended error code] is returned.
**
** This routine can be called at any point during the execution of the
-** [prepared statement]. If the virtual machine has not
+** [prepared statement]. If the virtual machine has not
** completed execution when this routine is called, that is like
-** encountering an error or an interrupt. (See [sqlite3_interrupt()].)
-** Incomplete updates may be rolled back and transactions cancelled,
-** depending on the circumstances, and the
+** encountering an error or an [sqlite3_interrupt | interrupt].
+** Incomplete updates may be rolled back and transactions canceled,
+** depending on the circumstances, and the
** [error code] returned will be [SQLITE_ABORT].
**
-** INVARIANTS:
-**
-** {F11302} The [sqlite3_finalize(S)] interface destroys the
-** [prepared statement] S and releases all
-** memory and file resources held by that object.
-**
-** {F11304} If the most recent call to [sqlite3_step(S)] for the
-** [prepared statement] S returned an error,
-** then [sqlite3_finalize(S)] returns that same error.
+** Requirements:
+** [H11302] [H11304]
*/
-int sqlite3_finalize(sqlite3_stmt *pStmt);
+SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Reset A Prepared Statement Object {F13330}
+** CAPI3REF: Reset A Prepared Statement Object {H13330} <S70300>
**
-** The sqlite3_reset() function is called to reset a
-** [prepared statement] object.
-** back to its initial state, ready to be re-executed.
+** The sqlite3_reset() function is called to reset a [prepared statement]
+** object back to its initial state, ready to be re-executed.
** Any SQL statement variables that had values bound to them using
** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values.
** Use [sqlite3_clear_bindings()] to reset the bindings.
**
-** {F11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S
+** {H11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S
** back to the beginning of its program.
**
-** {F11334} If the most recent call to [sqlite3_step(S)] for
+** {H11334} If the most recent call to [sqlite3_step(S)] for the
** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE],
** or if [sqlite3_step(S)] has never before been called on S,
** then [sqlite3_reset(S)] returns [SQLITE_OK].
**
-** {F11336} If the most recent call to [sqlite3_step(S)] for
+** {H11336} If the most recent call to [sqlite3_step(S)] for the
** [prepared statement] S indicated an error, then
** [sqlite3_reset(S)] returns an appropriate [error code].
**
-** {F11338} The [sqlite3_reset(S)] interface does not change the values
-** of any [sqlite3_bind_blob|bindings] on [prepared statement] S.
+** {H11338} The [sqlite3_reset(S)] interface does not change the values
+** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S.
*/
-int sqlite3_reset(sqlite3_stmt *pStmt);
+SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Create Or Redefine SQL Functions {F16100}
-** KEYWORDS: {function creation routines}
-**
-** These two functions (collectively known as
-** "function creation routines") are used to add SQL functions or aggregates
-** or to redefine the behavior of existing SQL functions or aggregates. The
-** difference only between the two is that the second parameter, the
-** name of the (scalar) function or aggregate, is encoded in UTF-8 for
-** sqlite3_create_function() and UTF-16 for sqlite3_create_function16().
+** CAPI3REF: Create Or Redefine SQL Functions {H16100} <S20200>
+** KEYWORDS: {function creation routines}
+** KEYWORDS: {application-defined SQL function}
+** KEYWORDS: {application-defined SQL functions}
+**
+** These two functions (collectively known as "function creation routines")
+** are used to add SQL functions or aggregates or to redefine the behavior
+** of existing SQL functions or aggregates. The only difference between the
+** two is that the second parameter, the name of the (scalar) function or
+** aggregate, is encoded in UTF-8 for sqlite3_create_function() and UTF-16
+** for sqlite3_create_function16().
**
** The first parameter is the [database connection] to which the SQL
-** function is to be added. If a single
-** program uses more than one [database connection] internally, then SQL
-** functions must be added individually to each [database connection].
-**
-** The second parameter is the name of the SQL function to be created
-** or redefined.
-** The length of the name is limited to 255 bytes, exclusive of the
-** zero-terminator. Note that the name length limit is in bytes, not
-** characters. Any attempt to create a function with a longer name
-** will result in an SQLITE_ERROR error.
+** function is to be added. If a single program uses more than one database
+** connection internally, then SQL functions must be added individually to
+** each database connection.
**
-** The third parameter is the number of arguments that the SQL function or
-** aggregate takes. If this parameter is negative, then the SQL function or
-** aggregate may take any number of arguments.
+** The second parameter is the name of the SQL function to be created or
+** redefined. The length of the name is limited to 255 bytes, exclusive of
+** the zero-terminator. Note that the name length limit is in bytes, not
+** characters. Any attempt to create a function with a longer name
+** will result in [SQLITE_ERROR] being returned.
+**
+** The third parameter (nArg)
+** is the number of arguments that the SQL function or
+** aggregate takes. If this parameter is -1, then the SQL function or
+** aggregate may take any number of arguments between 0 and the limit
+** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third
+** parameter is less than -1 or greater than 127 then the behavior is
+** undefined.
**
-** The fourth parameter, eTextRep, specifies what
+** The fourth parameter, eTextRep, specifies what
** [SQLITE_UTF8 | text encoding] this SQL function prefers for
** its parameters. Any SQL function implementation should be able to work
** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be
-** more efficient with one encoding than another. It is allowed to
+** more efficient with one encoding than another. An application may
** invoke sqlite3_create_function() or sqlite3_create_function16() multiple
** times with the same function but with different values of eTextRep.
** When multiple implementations of the same function are available, SQLite
** will pick the one that involves the least amount of data conversion.
-** If there is only a single implementation which does not care what
-** text encoding is used, then the fourth argument should be
-** [SQLITE_ANY].
+** If there is only a single implementation which does not care what text
+** encoding is used, then the fourth argument should be [SQLITE_ANY].
**
-** The fifth parameter is an arbitrary pointer. The implementation
-** of the function can gain access to this pointer using
-** [sqlite3_user_data()].
+** The fifth parameter is an arbitrary pointer. The implementation of the
+** function can gain access to this pointer using [sqlite3_user_data()].
**
** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are
-** pointers to C-language functions that implement the SQL
-** function or aggregate. A scalar SQL function requires an implementation of
-** the xFunc callback only, NULL pointers should be passed as the xStep
-** and xFinal parameters. An aggregate SQL function requires an implementation
-** of xStep and xFinal and NULL should be passed for xFunc. To delete an
-** existing SQL function or aggregate, pass NULL for all three function
-** callback.
+** pointers to C-language functions that implement the SQL function or
+** aggregate. A scalar SQL function requires an implementation of the xFunc
+** callback only, NULL pointers should be passed as the xStep and xFinal
+** parameters. An aggregate SQL function requires an implementation of xStep
+** and xFinal and NULL should be passed for xFunc. To delete an existing
+** SQL function or aggregate, pass NULL for all three function callbacks.
**
** It is permitted to register multiple implementations of the same
** functions with the same name but with either differing numbers of
-** arguments or differing perferred text encodings. SQLite will use
-** the implementation most closely matches the way in which the
-** SQL function is used.
-**
-** INVARIANTS:
-**
-** {F16103} The [sqlite3_create_function16()] interface behaves exactly
-** like [sqlite3_create_function()] in every way except that it
-** interprets the zFunctionName argument as
-** zero-terminated UTF-16 native byte order instead of as a
-** zero-terminated UTF-8.
-**
-** {F16106} A successful invocation of
-** the [sqlite3_create_function(D,X,N,E,...)] interface registers
-** or replaces callback functions in [database connection] D
-** used to implement the SQL function named X with N parameters
-** and having a perferred text encoding of E.
-**
-** {F16109} A successful call to [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** replaces the P, F, S, and L values from any prior calls with
-** the same D, X, N, and E values.
-**
-** {F16112} The [sqlite3_create_function(D,X,...)] interface fails with
-** a return code of [SQLITE_ERROR] if the SQL function name X is
-** longer than 255 bytes exclusive of the zero terminator.
-**
-** {F16118} Either F must be NULL and S and L are non-NULL or else F
-** is non-NULL and S and L are NULL, otherwise
-** [sqlite3_create_function(D,X,N,E,P,F,S,L)] returns [SQLITE_ERROR].
-**
-** {F16121} The [sqlite3_create_function(D,...)] interface fails with an
-** error code of [SQLITE_BUSY] if there exist [prepared statements]
-** associated with the [database connection] D.
-**
-** {F16124} The [sqlite3_create_function(D,X,N,...)] interface fails with an
-** error code of [SQLITE_ERROR] if parameter N (specifying the number
-** of arguments to the SQL function being registered) is less
-** than -1 or greater than 127.
-**
-** {F16127} When N is non-negative, the [sqlite3_create_function(D,X,N,...)]
-** interface causes callbacks to be invoked for the SQL function
-** named X when the number of arguments to the SQL function is
-** exactly N.
-**
-** {F16130} When N is -1, the [sqlite3_create_function(D,X,N,...)]
-** interface causes callbacks to be invoked for the SQL function
-** named X with any number of arguments.
-**
-** {F16133} When calls to [sqlite3_create_function(D,X,N,...)]
-** specify multiple implementations of the same function X
-** and when one implementation has N>=0 and the other has N=(-1)
-** the implementation with a non-zero N is preferred.
-**
-** {F16136} When calls to [sqlite3_create_function(D,X,N,E,...)]
-** specify multiple implementations of the same function X with
-** the same number of arguments N but with different
-** encodings E, then the implementation where E matches the
-** database encoding is preferred.
-**
-** {F16139} For an aggregate SQL function created using
-** [sqlite3_create_function(D,X,N,E,P,0,S,L)] the finializer
-** function L will always be invoked exactly once if the
-** step function S is called one or more times.
-**
-** {F16142} When SQLite invokes either the xFunc or xStep function of
-** an application-defined SQL function or aggregate created
-** by [sqlite3_create_function()] or [sqlite3_create_function16()],
-** then the array of [sqlite3_value] objects passed as the
-** third parameter are always [protected sqlite3_value] objects.
-*/
-int sqlite3_create_function(
+** arguments or differing preferred text encodings. SQLite will use
+** the implementation that most closely matches the way in which the
+** SQL function is used. A function implementation with a non-negative
+** nArg parameter is a better match than a function implementation with
+** a negative nArg. A function where the preferred text encoding
+** matches the database encoding is a better
+** match than a function where the encoding is different.
+** A function where the encoding difference is between UTF16le and UTF16be
+** is a closer match than a function where the encoding difference is
+** between UTF8 and UTF16.
+**
+** Built-in functions may be overloaded by new application-defined functions.
+** The first application-defined function with a given name overrides all
+** built-in functions in the same [database connection] with the same name.
+** Subsequent application-defined functions of the same name only override
+** prior application-defined functions that are an exact match for the
+** number of parameters and preferred encoding.
+**
+** An application-defined function is permitted to call other
+** SQLite interfaces. However, such calls must not
+** close the database connection nor finalize or reset the prepared
+** statement in which the function is running.
+**
+** Requirements:
+** [H16103] [H16106] [H16109] [H16112] [H16118] [H16121] [H16127]
+** [H16130] [H16133] [H16136] [H16139] [H16142]
+*/
+SQLITE_API int sqlite3_create_function(
sqlite3 *db,
const char *zFunctionName,
int nArg,
@@ -3551,7 +3246,7 @@ int sqlite3_create_function(
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*)
);
-int sqlite3_create_function16(
+SQLITE_API int sqlite3_create_function16(
sqlite3 *db,
const void *zFunctionName,
int nArg,
@@ -3563,7 +3258,7 @@ int sqlite3_create_function16(
);
/*
-** CAPI3REF: Text Encodings {F10267}
+** CAPI3REF: Text Encodings {H10267} <S50200> <H16100>
**
** These constant define integer codes that represent the various
** text encodings supported by SQLite.
@@ -3576,23 +3271,26 @@ int sqlite3_create_function16(
#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */
/*
-** CAPI3REF: Obsolete Functions
+** CAPI3REF: Deprecated Functions
+** DEPRECATED
**
-** These functions are all now obsolete. In order to maintain
-** backwards compatibility with older code, we continue to support
-** these functions. However, new development projects should avoid
+** These functions are [deprecated]. In order to maintain
+** backwards compatibility with older code, these functions continue
+** to be supported. However, new applications should avoid
** the use of these functions. To help encourage people to avoid
-** using these functions, we are not going to tell you want they do.
+** using these functions, we are not going to tell you what they do.
*/
-int sqlite3_aggregate_count(sqlite3_context*);
-int sqlite3_expired(sqlite3_stmt*);
-int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*);
-int sqlite3_global_recover(void);
-void sqlite3_thread_cleanup(void);
-int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
+#ifndef SQLITE_OMIT_DEPRECATED
+SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void);
+SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void);
+SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
+#endif
/*
-** CAPI3REF: Obtaining SQL Function Parameter Values {F15100}
+** CAPI3REF: Obtaining SQL Function Parameter Values {H15100} <S20200>
**
** The C-language implementation of SQL functions and aggregates uses
** this set of interface routines to access the parameter values on
@@ -3610,279 +3308,164 @@ int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
** Any attempt to use these routines on an [unprotected sqlite3_value]
** object results in undefined behavior.
**
-** These routines work just like the corresponding
-** [sqlite3_column_blob | sqlite3_column_* routines] except that
-** these routines take a single [protected sqlite3_value] object pointer
-** instead of an [sqlite3_stmt*] pointer and an integer column number.
+** These routines work just like the corresponding [column access functions]
+** except that these routines take a single [protected sqlite3_value] object
+** pointer instead of a [sqlite3_stmt*] pointer and an integer column number.
**
-** The sqlite3_value_text16() interface extracts a UTF16 string
+** The sqlite3_value_text16() interface extracts a UTF-16 string
** in the native byte-order of the host machine. The
** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces
-** extract UTF16 strings as big-endian and little-endian respectively.
+** extract UTF-16 strings as big-endian and little-endian respectively.
**
** The sqlite3_value_numeric_type() interface attempts to apply
** numeric affinity to the value. This means that an attempt is
** made to convert the value to an integer or floating point. If
** such a conversion is possible without loss of information (in other
-** words if the value is a string that looks like a number)
-** then the conversion is done. Otherwise no conversion occurs. The
-** [SQLITE_INTEGER | datatype] after conversion is returned.
+** words, if the value is a string that looks like a number)
+** then the conversion is performed. Otherwise no conversion occurs.
+** The [SQLITE_INTEGER | datatype] after conversion is returned.
**
-** Please pay particular attention to the fact that the pointer that
-** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or
+** Please pay particular attention to the fact that the pointer returned
+** from [sqlite3_value_blob()], [sqlite3_value_text()], or
** [sqlite3_value_text16()] can be invalidated by a subsequent call to
** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()],
-** or [sqlite3_value_text16()].
+** or [sqlite3_value_text16()].
**
** These routines must be called from the same thread as
** the SQL function that supplied the [sqlite3_value*] parameters.
**
-**
-** INVARIANTS:
-**
-** {F15103} The [sqlite3_value_blob(V)] interface converts the
-** [protected sqlite3_value] object V into a blob and then returns a
-** pointer to the converted value.
-**
-** {F15106} The [sqlite3_value_bytes(V)] interface returns the
-** number of bytes in the blob or string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_value_blob(V)] or
-** [sqlite3_value_text(V)].
-**
-** {F15109} The [sqlite3_value_bytes16(V)] interface returns the
-** number of bytes in the string (exclusive of the
-** zero terminator on the string) that was returned by the
-** most recent call to [sqlite3_value_text16(V)],
-** [sqlite3_value_text16be(V)], or [sqlite3_value_text16le(V)].
-**
-** {F15112} The [sqlite3_value_double(V)] interface converts the
-** [protected sqlite3_value] object V into a floating point value and
-** returns a copy of that value.
-**
-** {F15115} The [sqlite3_value_int(V)] interface converts the
-** [protected sqlite3_value] object V into a 64-bit signed integer and
-** returns the lower 32 bits of that integer.
-**
-** {F15118} The [sqlite3_value_int64(V)] interface converts the
-** [protected sqlite3_value] object V into a 64-bit signed integer and
-** returns a copy of that integer.
-**
-** {F15121} The [sqlite3_value_text(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated UTF-8
-** string and returns a pointer to that string.
-**
-** {F15124} The [sqlite3_value_text16(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 native byte order
-** string and returns a pointer to that string.
-**
-** {F15127} The [sqlite3_value_text16be(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 big-endian
-** string and returns a pointer to that string.
-**
-** {F15130} The [sqlite3_value_text16le(V)] interface converts the
-** [protected sqlite3_value] object V into a zero-terminated 2-byte
-** aligned UTF-16 little-endian
-** string and returns a pointer to that string.
-**
-** {F15133} The [sqlite3_value_type(V)] interface returns
-** one of [SQLITE_NULL], [SQLITE_INTEGER], [SQLITE_FLOAT],
-** [SQLITE_TEXT], or [SQLITE_BLOB] as appropriate for
-** the [sqlite3_value] object V.
-**
-** {F15136} The [sqlite3_value_numeric_type(V)] interface converts
-** the [protected sqlite3_value] object V into either an integer or
-** a floating point value if it can do so without loss of
-** information, and returns one of [SQLITE_NULL],
-** [SQLITE_INTEGER], [SQLITE_FLOAT], [SQLITE_TEXT], or
-** [SQLITE_BLOB] as appropriate for
-** the [protected sqlite3_value] object V after the conversion attempt.
-*/
-const void *sqlite3_value_blob(sqlite3_value*);
-int sqlite3_value_bytes(sqlite3_value*);
-int sqlite3_value_bytes16(sqlite3_value*);
-double sqlite3_value_double(sqlite3_value*);
-int sqlite3_value_int(sqlite3_value*);
-sqlite3_int64 sqlite3_value_int64(sqlite3_value*);
-const unsigned char *sqlite3_value_text(sqlite3_value*);
-const void *sqlite3_value_text16(sqlite3_value*);
-const void *sqlite3_value_text16le(sqlite3_value*);
-const void *sqlite3_value_text16be(sqlite3_value*);
-int sqlite3_value_type(sqlite3_value*);
-int sqlite3_value_numeric_type(sqlite3_value*);
-
-/*
-** CAPI3REF: Obtain Aggregate Function Context {F16210}
+** Requirements:
+** [H15103] [H15106] [H15109] [H15112] [H15115] [H15118] [H15121] [H15124]
+** [H15127] [H15130] [H15133] [H15136]
+*/
+SQLITE_API const void *sqlite3_value_blob(sqlite3_value*);
+SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
+SQLITE_API int sqlite3_value_bytes16(sqlite3_value*);
+SQLITE_API double sqlite3_value_double(sqlite3_value*);
+SQLITE_API int sqlite3_value_int(sqlite3_value*);
+SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*);
+SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*);
+SQLITE_API const void *sqlite3_value_text16(sqlite3_value*);
+SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*);
+SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*);
+SQLITE_API int sqlite3_value_type(sqlite3_value*);
+SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
+
+/*
+** CAPI3REF: Obtain Aggregate Function Context {H16210} <S20200>
**
** The implementation of aggregate SQL functions use this routine to allocate
-** a structure for storing their state.
-** The first time the sqlite3_aggregate_context() routine is
-** is called for a particular aggregate, SQLite allocates nBytes of memory
-** zeros that memory, and returns a pointer to it.
-** On second and subsequent calls to sqlite3_aggregate_context()
-** for the same aggregate function index, the same buffer is returned.
-** The implementation
-** of the aggregate can use the returned buffer to accumulate data.
+** a structure for storing their state.
+**
+** The first time the sqlite3_aggregate_context() routine is called for a
+** particular aggregate, SQLite allocates nBytes of memory, zeroes out that
+** memory, and returns a pointer to it. On second and subsequent calls to
+** sqlite3_aggregate_context() for the same aggregate function index,
+** the same buffer is returned. The implementation of the aggregate can use
+** the returned buffer to accumulate data.
**
** SQLite automatically frees the allocated buffer when the aggregate
** query concludes.
**
-** The first parameter should be a copy of the
-** [sqlite3_context | SQL function context] that is the first
-** parameter to the callback routine that implements the aggregate
-** function.
+** The first parameter should be a copy of the
+** [sqlite3_context | SQL function context] that is the first parameter
+** to the callback routine that implements the aggregate function.
**
** This routine must be called from the same thread in which
** the aggregate SQL function is running.
**
-** INVARIANTS:
-**
-** {F16211} The first invocation of [sqlite3_aggregate_context(C,N)] for
-** a particular instance of an aggregate function (for a particular
-** context C) causes SQLite to allocation N bytes of memory,
-** zero that memory, and return a pointer to the allocationed
-** memory.
-**
-** {F16213} If a memory allocation error occurs during
-** [sqlite3_aggregate_context(C,N)] then the function returns 0.
-**
-** {F16215} Second and subsequent invocations of
-** [sqlite3_aggregate_context(C,N)] for the same context pointer C
-** ignore the N parameter and return a pointer to the same
-** block of memory returned by the first invocation.
-**
-** {F16217} The memory allocated by [sqlite3_aggregate_context(C,N)] is
-** automatically freed on the next call to [sqlite3_reset()]
-** or [sqlite3_finalize()] for the [prepared statement] containing
-** the aggregate function associated with context C.
+** Requirements:
+** [H16211] [H16213] [H16215] [H16217]
*/
-void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);
+SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);
/*
-** CAPI3REF: User Data For Functions {F16240}
+** CAPI3REF: User Data For Functions {H16240} <S20200>
**
** The sqlite3_user_data() interface returns a copy of
** the pointer that was the pUserData parameter (the 5th parameter)
-** of the the [sqlite3_create_function()]
+** of the [sqlite3_create_function()]
** and [sqlite3_create_function16()] routines that originally
** registered the application defined function. {END}
**
** This routine must be called from the same thread in which
** the application-defined function is running.
**
-** INVARIANTS:
-**
-** {F16243} The [sqlite3_user_data(C)] interface returns a copy of the
-** P pointer from the [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** or [sqlite3_create_function16(D,X,N,E,P,F,S,L)] call that
-** registered the SQL function associated with
-** [sqlite3_context] C.
+** Requirements:
+** [H16243]
*/
-void *sqlite3_user_data(sqlite3_context*);
+SQLITE_API void *sqlite3_user_data(sqlite3_context*);
/*
-** CAPI3REF: Database Connection For Functions {F16250}
+** CAPI3REF: Database Connection For Functions {H16250} <S60600><S20200>
**
** The sqlite3_context_db_handle() interface returns a copy of
** the pointer to the [database connection] (the 1st parameter)
-** of the the [sqlite3_create_function()]
+** of the [sqlite3_create_function()]
** and [sqlite3_create_function16()] routines that originally
** registered the application defined function.
**
-** INVARIANTS:
-**
-** {F16253} The [sqlite3_context_db_handle(C)] interface returns a copy of the
-** D pointer from the [sqlite3_create_function(D,X,N,E,P,F,S,L)]
-** or [sqlite3_create_function16(D,X,N,E,P,F,S,L)] call that
-** registered the SQL function associated with
-** [sqlite3_context] C.
+** Requirements:
+** [H16253]
*/
-sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
+SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
/*
-** CAPI3REF: Function Auxiliary Data {F16270}
+** CAPI3REF: Function Auxiliary Data {H16270} <S20200>
**
** The following two functions may be used by scalar SQL functions to
-** associate meta-data with argument values. If the same value is passed to
+** associate metadata with argument values. If the same value is passed to
** multiple invocations of the same SQL function during query execution, under
-** some circumstances the associated meta-data may be preserved. This may
+** some circumstances the associated metadata may be preserved. This may
** be used, for example, to add a regular-expression matching scalar
** function. The compiled version of the regular expression is stored as
-** meta-data associated with the SQL value passed as the regular expression
+** metadata associated with the SQL value passed as the regular expression
** pattern. The compiled regular expression can be reused on multiple
** invocations of the same function so that the original pattern string
** does not need to be recompiled on each invocation.
**
-** The sqlite3_get_auxdata() interface returns a pointer to the meta-data
+** The sqlite3_get_auxdata() interface returns a pointer to the metadata
** associated by the sqlite3_set_auxdata() function with the Nth argument
-** value to the application-defined function.
-** If no meta-data has been ever been set for the Nth
-** argument of the function, or if the cooresponding function parameter
-** has changed since the meta-data was set, then sqlite3_get_auxdata()
-** returns a NULL pointer.
-**
-** The sqlite3_set_auxdata() interface saves the meta-data
-** pointed to by its 3rd parameter as the meta-data for the N-th
+** value to the application-defined function. If no metadata has been ever
+** been set for the Nth argument of the function, or if the corresponding
+** function parameter has changed since the meta-data was set,
+** then sqlite3_get_auxdata() returns a NULL pointer.
+**
+** The sqlite3_set_auxdata() interface saves the metadata
+** pointed to by its 3rd parameter as the metadata for the N-th
** argument of the application-defined function. Subsequent
** calls to sqlite3_get_auxdata() might return this data, if it has
-** not been destroyed.
-** If it is not NULL, SQLite will invoke the destructor
+** not been destroyed.
+** If it is not NULL, SQLite will invoke the destructor
** function given by the 4th parameter to sqlite3_set_auxdata() on
-** the meta-data when the corresponding function parameter changes
+** the metadata when the corresponding function parameter changes
** or when the SQL statement completes, whichever comes first.
**
-** SQLite is free to call the destructor and drop meta-data on
-** any parameter of any function at any time. The only guarantee
-** is that the destructor will be called before the metadata is
-** dropped.
+** SQLite is free to call the destructor and drop metadata on any
+** parameter of any function at any time. The only guarantee is that
+** the destructor will be called before the metadata is dropped.
**
-** In practice, meta-data is preserved between function calls for
+** In practice, metadata is preserved between function calls for
** expressions that are constant at compile time. This includes literal
** values and SQL variables.
**
** These routines must be called from the same thread in which
** the SQL function is running.
**
-** INVARIANTS:
-**
-** {F16272} The [sqlite3_get_auxdata(C,N)] interface returns a pointer
-** to metadata associated with the Nth parameter of the SQL function
-** whose context is C, or NULL if there is no metadata associated
-** with that parameter.
-**
-** {F16274} The [sqlite3_set_auxdata(C,N,P,D)] interface assigns a metadata
-** pointer P to the Nth parameter of the SQL function with context
-** C.
-**
-** {F16276} SQLite will invoke the destructor D with a single argument
-** which is the metadata pointer P following a call to
-** [sqlite3_set_auxdata(C,N,P,D)] when SQLite ceases to hold
-** the metadata.
-**
-** {F16277} SQLite ceases to hold metadata for an SQL function parameter
-** when the value of that parameter changes.
-**
-** {F16278} When [sqlite3_set_auxdata(C,N,P,D)] is invoked, the destructor
-** is called for any prior metadata associated with the same function
-** context C and parameter N.
-**
-** {F16279} SQLite will call destructors for any metadata it is holding
-** in a particular [prepared statement] S when either
-** [sqlite3_reset(S)] or [sqlite3_finalize(S)] is called.
+** Requirements:
+** [H16272] [H16274] [H16276] [H16277] [H16278] [H16279]
*/
-void *sqlite3_get_auxdata(sqlite3_context*, int N);
-void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
+SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N);
+SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
/*
-** CAPI3REF: Constants Defining Special Destructor Behavior {F10280}
+** CAPI3REF: Constants Defining Special Destructor Behavior {H10280} <S30100>
**
-** These are special value for the destructor that is passed in as the
+** These are special values for the destructor that is passed in as the
** final argument to routines like [sqlite3_result_blob()]. If the destructor
** argument is SQLITE_STATIC, it means that the content pointer is constant
-** and will never change. It does not need to be destroyed. The
+** and will never change. It does not need to be destroyed. The
** SQLITE_TRANSIENT value means that the content will likely change in
** the near future and that SQLite should make its own private copy of
** the content before returning.
@@ -3895,30 +3478,28 @@ typedef void (*sqlite3_destructor_type)(void*);
#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1)
/*
-** CAPI3REF: Setting The Result Of An SQL Function {F16400}
+** CAPI3REF: Setting The Result Of An SQL Function {H16400} <S20200>
**
** These routines are used by the xFunc or xFinal callbacks that
** implement SQL functions and aggregates. See
** [sqlite3_create_function()] and [sqlite3_create_function16()]
** for additional information.
**
-** These functions work very much like the
-** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used
-** to bind values to host parameters in prepared statements.
-** Refer to the
-** [sqlite3_bind_blob | sqlite3_bind_* documentation] for
-** additional information.
+** These functions work very much like the [parameter binding] family of
+** functions used to bind values to host parameters in prepared statements.
+** Refer to the [SQL parameter] documentation for additional information.
**
** The sqlite3_result_blob() interface sets the result from
-** an application defined function to be the BLOB whose content is pointed
+** an application-defined function to be the BLOB whose content is pointed
** to by the second parameter and which is N bytes long where N is the
-** third parameter.
-** The sqlite3_result_zeroblob() inerfaces set the result of
-** the application defined function to be a BLOB containing all zero
+** third parameter.
+**
+** The sqlite3_result_zeroblob() interfaces set the result of
+** the application-defined function to be a BLOB containing all zero
** bytes and N bytes in size, where N is the value of the 2nd parameter.
**
** The sqlite3_result_double() interface sets the result from
-** an application defined function to be a floating point value specified
+** an application-defined function to be a floating point value specified
** by its 2nd argument.
**
** The sqlite3_result_error() and sqlite3_result_error16() functions
@@ -3926,8 +3507,8 @@ typedef void (*sqlite3_destructor_type)(void*);
** SQLite uses the string pointed to by the
** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16()
** as the text of an error message. SQLite interprets the error
-** message string from sqlite3_result_error() as UTF8. SQLite
-** interprets the string from sqlite3_result_error16() as UTF16 in native
+** message string from sqlite3_result_error() as UTF-8. SQLite
+** interprets the string from sqlite3_result_error16() as UTF-16 in native
** byte order. If the third parameter to sqlite3_result_error()
** or sqlite3_result_error16() is negative then SQLite takes as the error
** message all text up through the first zero character.
@@ -3935,7 +3516,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** sqlite3_result_error16() is non-negative then SQLite takes that many
** bytes (not characters) from the 2nd parameter as the error message.
** The sqlite3_result_error() and sqlite3_result_error16()
-** routines make a copy private copy of the error message text before
+** routines make a private copy of the error message text before
** they return. Hence, the calling function can deallocate or
** modify the text after they return without harm.
** The sqlite3_result_error_code() function changes the error code
@@ -3943,11 +3524,11 @@ typedef void (*sqlite3_destructor_type)(void*);
** the error code is SQLITE_ERROR. A subsequent call to sqlite3_result_error()
** or sqlite3_result_error16() resets the error code to SQLITE_ERROR.
**
-** The sqlite3_result_toobig() interface causes SQLite
-** to throw an error indicating that a string or BLOB is to long
-** to represent. The sqlite3_result_nomem() interface
-** causes SQLite to throw an exception indicating that the a
-** memory allocation failed.
+** The sqlite3_result_toobig() interface causes SQLite to throw an error
+** indicating that a string or BLOB is to long to represent.
+**
+** The sqlite3_result_nomem() interface causes SQLite to throw an error
+** indicating that a memory allocation failed.
**
** The sqlite3_result_int() interface sets the return value
** of the application-defined function to be the 32-bit signed integer
@@ -3959,7 +3540,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** The sqlite3_result_null() interface sets the return value
** of the application-defined function to be NULL.
**
-** The sqlite3_result_text(), sqlite3_result_text16(),
+** The sqlite3_result_text(), sqlite3_result_text16(),
** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces
** set the return value of the application-defined function to be
** a text string which is represented as UTF-8, UTF-16 native byte order,
@@ -3967,7 +3548,7 @@ typedef void (*sqlite3_destructor_type)(void*);
** SQLite takes the text result from the application from
** the 2nd parameter of the sqlite3_result_text* interfaces.
** If the 3rd parameter to the sqlite3_result_text* interfaces
-** is negative, then SQLite takes result text from the 2nd parameter
+** is negative, then SQLite takes result text from the 2nd parameter
** through the first zero character.
** If the 3rd parameter to the sqlite3_result_text* interfaces
** is non-negative, then as many bytes (not characters) of the text
@@ -3975,13 +3556,13 @@ typedef void (*sqlite3_destructor_type)(void*);
** function result.
** If the 4th parameter to the sqlite3_result_text* interfaces
** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
-** function as the destructor on the text or blob result when it has
-** finished using that result.
-** If the 4th parameter to the sqlite3_result_text* interfaces
-** or sqlite3_result_blob is the special constant SQLITE_STATIC, then
-** SQLite assumes that the text or blob result is constant space and
-** does not copy the space or call a destructor when it has
+** function as the destructor on the text or BLOB result when it has
** finished using that result.
+** If the 4th parameter to the sqlite3_result_text* interfaces or to
+** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite
+** assumes that the text or BLOB result is in constant space and does not
+** copy the content of the parameter nor call a destructor on the content
+** when it has finished using that result.
** If the 4th parameter to the sqlite3_result_text* interfaces
** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT
** then SQLite makes a copy of the result into space obtained from
@@ -3991,134 +3572,43 @@ typedef void (*sqlite3_destructor_type)(void*);
** the application-defined function to be a copy the
** [unprotected sqlite3_value] object specified by the 2nd parameter. The
** sqlite3_result_value() interface makes a copy of the [sqlite3_value]
-** so that [sqlite3_value] specified in the parameter may change or
+** so that the [sqlite3_value] specified in the parameter may change or
** be deallocated after sqlite3_result_value() returns without harm.
** A [protected sqlite3_value] object may always be used where an
** [unprotected sqlite3_value] object is required, so either
** kind of [sqlite3_value] object can be used with this interface.
**
-** If these routines are called from within the different thread
-** than the one containing the application-defined function that recieved
+** If these routines are called from within the different thread
+** than the one containing the application-defined function that received
** the [sqlite3_context] pointer, the results are undefined.
**
-** INVARIANTS:
-**
-** {F16403} The default return value from any SQL function is NULL.
-**
-** {F16406} The [sqlite3_result_blob(C,V,N,D)] interface changes the
-** return value of function C to be a blob that is N bytes
-** in length and with content pointed to by V.
-**
-** {F16409} The [sqlite3_result_double(C,V)] interface changes the
-** return value of function C to be the floating point value V.
-**
-** {F16412} The [sqlite3_result_error(C,V,N)] interface changes the return
-** value of function C to be an exception with error code
-** [SQLITE_ERROR] and a UTF8 error message copied from V up to the
-** first zero byte or until N bytes are read if N is positive.
-**
-** {F16415} The [sqlite3_result_error16(C,V,N)] interface changes the return
-** value of function C to be an exception with error code
-** [SQLITE_ERROR] and a UTF16 native byte order error message
-** copied from V up to the first zero terminator or until N bytes
-** are read if N is positive.
-**
-** {F16418} The [sqlite3_result_error_toobig(C)] interface changes the return
-** value of the function C to be an exception with error code
-** [SQLITE_TOOBIG] and an appropriate error message.
-**
-** {F16421} The [sqlite3_result_error_nomem(C)] interface changes the return
-** value of the function C to be an exception with error code
-** [SQLITE_NOMEM] and an appropriate error message.
-**
-** {F16424} The [sqlite3_result_error_code(C,E)] interface changes the return
-** value of the function C to be an exception with error code E.
-** The error message text is unchanged.
-**
-** {F16427} The [sqlite3_result_int(C,V)] interface changes the
-** return value of function C to be the 32-bit integer value V.
-**
-** {F16430} The [sqlite3_result_int64(C,V)] interface changes the
-** return value of function C to be the 64-bit integer value V.
-**
-** {F16433} The [sqlite3_result_null(C)] interface changes the
-** return value of function C to be NULL.
-**
-** {F16436} The [sqlite3_result_text(C,V,N,D)] interface changes the
-** return value of function C to be the UTF8 string
-** V up to the first zero if N is negative
-** or the first N bytes of V if N is non-negative.
-**
-** {F16439} The [sqlite3_result_text16(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 native byte order
-** string V up to the first zero if N is
-** negative or the first N bytes of V if N is non-negative.
-**
-** {F16442} The [sqlite3_result_text16be(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 big-endian
-** string V up to the first zero if N is
-** is negative or the first N bytes or V if N is non-negative.
-**
-** {F16445} The [sqlite3_result_text16le(C,V,N,D)] interface changes the
-** return value of function C to be the UTF16 little-endian
-** string V up to the first zero if N is
-** negative or the first N bytes of V if N is non-negative.
-**
-** {F16448} The [sqlite3_result_value(C,V)] interface changes the
-** return value of function C to be [unprotected sqlite3_value]
-** object V.
-**
-** {F16451} The [sqlite3_result_zeroblob(C,N)] interface changes the
-** return value of function C to be an N-byte blob of all zeros.
-**
-** {F16454} The [sqlite3_result_error()] and [sqlite3_result_error16()]
-** interfaces make a copy of their error message strings before
-** returning.
-**
-** {F16457} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is the constant [SQLITE_STATIC]
-** then no destructor is ever called on the pointer V and SQLite
-** assumes that V is immutable.
-**
-** {F16460} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is the constant
-** [SQLITE_TRANSIENT] then the interfaces makes a copy of the
-** content of V and retains the copy.
-**
-** {F16463} If the D destructor parameter to [sqlite3_result_blob(C,V,N,D)],
-** [sqlite3_result_text(C,V,N,D)], [sqlite3_result_text16(C,V,N,D)],
-** [sqlite3_result_text16be(C,V,N,D)], or
-** [sqlite3_result_text16le(C,V,N,D)] is some value other than
-** the constants [SQLITE_STATIC] and [SQLITE_TRANSIENT] then
-** SQLite will invoke the destructor D with V as its only argument
-** when it has finished with the V value.
-*/
-void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
-void sqlite3_result_double(sqlite3_context*, double);
-void sqlite3_result_error(sqlite3_context*, const char*, int);
-void sqlite3_result_error16(sqlite3_context*, const void*, int);
-void sqlite3_result_error_toobig(sqlite3_context*);
-void sqlite3_result_error_nomem(sqlite3_context*);
-void sqlite3_result_error_code(sqlite3_context*, int);
-void sqlite3_result_int(sqlite3_context*, int);
-void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);
-void sqlite3_result_null(sqlite3_context*);
-void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
-void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
-void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
-void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));
-void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
-void sqlite3_result_zeroblob(sqlite3_context*, int n);
-
-/*
-** CAPI3REF: Define New Collating Sequences {F16600}
+** Requirements:
+** [H16403] [H16406] [H16409] [H16412] [H16415] [H16418] [H16421] [H16424]
+** [H16427] [H16430] [H16433] [H16436] [H16439] [H16442] [H16445] [H16448]
+** [H16451] [H16454] [H16457] [H16460] [H16463]
+*/
+SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
+SQLITE_API void sqlite3_result_double(sqlite3_context*, double);
+SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int);
+SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int);
+SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*);
+SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*);
+SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int);
+SQLITE_API void sqlite3_result_int(sqlite3_context*, int);
+SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);
+SQLITE_API void sqlite3_result_null(sqlite3_context*);
+SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
+SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
+SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
+SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));
+SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
+SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
+
+/*
+** CAPI3REF: Define New Collating Sequences {H16600} <S20300>
**
** These functions are used to add new collation sequences to the
-** [sqlite3*] handle specified as the first argument.
+** [database connection] specified as the first argument.
**
** The name of the new collation sequence is specified as a UTF-8 string
** for sqlite3_create_collation() and sqlite3_create_collation_v2()
@@ -4126,95 +3616,52 @@ void sqlite3_result_zeroblob(sqlite3_context*, int n);
** the name is passed as the second function argument.
**
** The third argument may be one of the constants [SQLITE_UTF8],
-** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied
+** [SQLITE_UTF16LE], or [SQLITE_UTF16BE], indicating that the user-supplied
** routine expects to be passed pointers to strings encoded using UTF-8,
-** UTF-16 little-endian or UTF-16 big-endian respectively. The
-** third argument might also be [SQLITE_UTF16_ALIGNED] to indicate that
+** UTF-16 little-endian, or UTF-16 big-endian, respectively. The
+** third argument might also be [SQLITE_UTF16] to indicate that the routine
+** expects pointers to be UTF-16 strings in the native byte order, or the
+** argument can be [SQLITE_UTF16_ALIGNED] if the
** the routine expects pointers to 16-bit word aligned strings
-** of UTF16 in the native byte order of the host computer.
+** of UTF-16 in the native byte order.
**
** A pointer to the user supplied routine must be passed as the fifth
** argument. If it is NULL, this is the same as deleting the collation
** sequence (so that SQLite cannot call it anymore).
-** Each time the application
-** supplied function is invoked, it is passed a copy of the void* passed as
-** the fourth argument to sqlite3_create_collation() or
-** sqlite3_create_collation16() as its first parameter.
+** Each time the application supplied function is invoked, it is passed
+** as its first parameter a copy of the void* passed as the fourth argument
+** to sqlite3_create_collation() or sqlite3_create_collation16().
**
** The remaining arguments to the application-supplied routine are two strings,
** each represented by a (length, data) pair and encoded in the encoding
** that was passed as the third argument when the collation sequence was
-** registered. {END} The application defined collation routine should
-** return negative, zero or positive if
-** the first string is less than, equal to, or greater than the second
-** string. i.e. (STRING1 - STRING2).
+** registered. {END} The application defined collation routine should
+** return negative, zero or positive if the first string is less than,
+** equal to, or greater than the second string. i.e. (STRING1 - STRING2).
**
** The sqlite3_create_collation_v2() works like sqlite3_create_collation()
-** excapt that it takes an extra argument which is a destructor for
+** except that it takes an extra argument which is a destructor for
** the collation. The destructor is called when the collation is
** destroyed and is passed a copy of the fourth parameter void* pointer
** of the sqlite3_create_collation_v2().
-** Collations are destroyed when
-** they are overridden by later calls to the collation creation functions
-** or when the [sqlite3*] database handle is closed using [sqlite3_close()].
-**
-** INVARIANTS:
-**
-** {F16603} A successful call to the
-** [sqlite3_create_collation_v2(B,X,E,P,F,D)] interface
-** registers function F as the comparison function used to
-** implement collation X on [database connection] B for
-** databases having encoding E.
-**
-** {F16604} SQLite understands the X parameter to
-** [sqlite3_create_collation_v2(B,X,E,P,F,D)] as a zero-terminated
-** UTF-8 string in which case is ignored for ASCII characters and
-** is significant for non-ASCII characters.
-**
-** {F16606} Successive calls to [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** with the same values for B, X, and E, override prior values
-** of P, F, and D.
-**
-** {F16609} The destructor D in [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** is not NULL then it is called with argument P when the
-** collating function is dropped by SQLite.
-**
-** {F16612} A collating function is dropped when it is overloaded.
-**
-** {F16615} A collating function is dropped when the database connection
-** is closed using [sqlite3_close()].
+** Collations are destroyed when they are overridden by later calls to the
+** collation creation functions or when the [database connection] is closed
+** using [sqlite3_close()].
**
-** {F16618} The pointer P in [sqlite3_create_collation_v2(B,X,E,P,F,D)]
-** is passed through as the first parameter to the comparison
-** function F for all subsequent invocations of F.
+** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()].
**
-** {F16621} A call to [sqlite3_create_collation(B,X,E,P,F)] is exactly
-** the same as a call to [sqlite3_create_collation_v2()] with
-** the same parameters and a NULL destructor.
-**
-** {F16624} Following a [sqlite3_create_collation_v2(B,X,E,P,F,D)],
-** SQLite uses the comparison function F for all text comparison
-** operations on [database connection] B on text values that
-** use the collating sequence name X.
-**
-** {F16627} The [sqlite3_create_collation16(B,X,E,P,F)] works the same
-** as [sqlite3_create_collation(B,X,E,P,F)] except that the
-** collation name X is understood as UTF-16 in native byte order
-** instead of UTF-8.
-**
-** {F16630} When multiple comparison functions are available for the same
-** collating sequence, SQLite chooses the one whose text encoding
-** requires the least amount of conversion from the default
-** text encoding of the database.
+** Requirements:
+** [H16603] [H16604] [H16606] [H16609] [H16612] [H16615] [H16618] [H16621]
+** [H16624] [H16627] [H16630]
*/
-int sqlite3_create_collation(
+SQLITE_API int sqlite3_create_collation(
sqlite3*,
const char *zName,
int eTextRep,
void*,
int(*xCompare)(void*,int,const void*,int,const void*)
);
-int sqlite3_create_collation_v2(
+SQLITE_API int sqlite3_create_collation_v2(
sqlite3*,
const char *zName,
int eTextRep,
@@ -4222,68 +3669,49 @@ int sqlite3_create_collation_v2(
int(*xCompare)(void*,int,const void*,int,const void*),
void(*xDestroy)(void*)
);
-int sqlite3_create_collation16(
+SQLITE_API int sqlite3_create_collation16(
sqlite3*,
- const char *zName,
+ const void *zName,
int eTextRep,
void*,
int(*xCompare)(void*,int,const void*,int,const void*)
);
/*
-** CAPI3REF: Collation Needed Callbacks {F16700}
+** CAPI3REF: Collation Needed Callbacks {H16700} <S20300>
**
** To avoid having to register all collation sequences before a database
** can be used, a single callback function may be registered with the
-** database handle to be called whenever an undefined collation sequence is
-** required.
+** [database connection] to be called whenever an undefined collation
+** sequence is required.
**
** If the function is registered using the sqlite3_collation_needed() API,
** then it is passed the names of undefined collation sequences as strings
-** encoded in UTF-8. {F16703} If sqlite3_collation_needed16() is used, the names
-** are passed as UTF-16 in machine native byte order. A call to either
-** function replaces any existing callback.
+** encoded in UTF-8. {H16703} If sqlite3_collation_needed16() is used,
+** the names are passed as UTF-16 in machine native byte order.
+** A call to either function replaces any existing callback.
**
** When the callback is invoked, the first argument passed is a copy
** of the second argument to sqlite3_collation_needed() or
** sqlite3_collation_needed16(). The second argument is the database
-** handle. The third argument is one of [SQLITE_UTF8],
-** [SQLITE_UTF16BE], or [SQLITE_UTF16LE], indicating the most
-** desirable form of the collation sequence function required.
-** The fourth parameter is the name of the
+** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE],
+** or [SQLITE_UTF16LE], indicating the most desirable form of the collation
+** sequence function required. The fourth parameter is the name of the
** required collation sequence.
**
** The callback function should register the desired collation using
** [sqlite3_create_collation()], [sqlite3_create_collation16()], or
** [sqlite3_create_collation_v2()].
**
-** INVARIANTS:
-**
-** {F16702} A successful call to [sqlite3_collation_needed(D,P,F)]
-** or [sqlite3_collation_needed16(D,P,F)] causes
-** the [database connection] D to invoke callback F with first
-** parameter P whenever it needs a comparison function for a
-** collating sequence that it does not know about.
-**
-** {F16704} Each successful call to [sqlite3_collation_needed()] or
-** [sqlite3_collation_needed16()] overrides the callback registered
-** on the same [database connection] by prior calls to either
-** interface.
-**
-** {F16706} The name of the requested collating function passed in the
-** 4th parameter to the callback is in UTF-8 if the callback
-** was registered using [sqlite3_collation_needed()] and
-** is in UTF-16 native byte order if the callback was
-** registered using [sqlite3_collation_needed16()].
-**
-**
+** Requirements:
+** [H16702] [H16704] [H16706]
*/
-int sqlite3_collation_needed(
+SQLITE_API int sqlite3_collation_needed(
sqlite3*,
void*,
void(*)(void*,sqlite3*,int eTextRep,const char*)
);
-int sqlite3_collation_needed16(
+SQLITE_API int sqlite3_collation_needed16(
sqlite3*,
void*,
void(*)(void*,sqlite3*,int eTextRep,const void*)
@@ -4296,7 +3724,7 @@ int sqlite3_collation_needed16(
** The code to implement this API is not available in the public release
** of SQLite.
*/
-int sqlite3_key(
+SQLITE_API int sqlite3_key(
sqlite3 *db, /* Database to be rekeyed */
const void *pKey, int nKey /* The key */
);
@@ -4309,134 +3737,149 @@ int sqlite3_key(
** The code to implement this API is not available in the public release
** of SQLite.
*/
-int sqlite3_rekey(
+SQLITE_API int sqlite3_rekey(
sqlite3 *db, /* Database to be rekeyed */
const void *pKey, int nKey /* The new key */
);
/*
-** CAPI3REF: Suspend Execution For A Short Time {F10530}
+** CAPI3REF: Suspend Execution For A Short Time {H10530} <S40410>
**
-** The sqlite3_sleep() function
-** causes the current thread to suspend execution
+** The sqlite3_sleep() function causes the current thread to suspend execution
** for at least a number of milliseconds specified in its parameter.
**
-** If the operating system does not support sleep requests with
-** millisecond time resolution, then the time will be rounded up to
-** the nearest second. The number of milliseconds of sleep actually
+** If the operating system does not support sleep requests with
+** millisecond time resolution, then the time will be rounded up to
+** the nearest second. The number of milliseconds of sleep actually
** requested from the operating system is returned.
**
** SQLite implements this interface by calling the xSleep()
** method of the default [sqlite3_vfs] object.
**
-** INVARIANTS:
-**
-** {F10533} The [sqlite3_sleep(M)] interface invokes the xSleep
-** method of the default [sqlite3_vfs|VFS] in order to
-** suspend execution of the current thread for at least
-** M milliseconds.
-**
-** {F10536} The [sqlite3_sleep(M)] interface returns the number of
-** milliseconds of sleep actually requested of the operating
-** system, which might be larger than the parameter M.
+** Requirements: [H10533] [H10536]
*/
-int sqlite3_sleep(int);
+SQLITE_API int sqlite3_sleep(int);
/*
-** CAPI3REF: Name Of The Folder Holding Temporary Files {F10310}
+** CAPI3REF: Name Of The Folder Holding Temporary Files {H10310} <S20000>
**
** If this global variable is made to point to a string which is
-** the name of a folder (a.ka. directory), then all temporary files
+** the name of a folder (a.k.a. directory), then all temporary files
** created by SQLite will be placed in that directory. If this variable
-** is NULL pointer, then SQLite does a search for an appropriate temporary
-** file directory.
-**
-** It is not safe to modify this variable once a database connection
-** has been opened. It is intended that this variable be set once
+** is a NULL pointer, then SQLite performs a search for an appropriate
+** temporary file directory.
+**
+** It is not safe to read or modify this variable in more than one
+** thread at a time. It is not safe to read or modify this variable
+** if a [database connection] is being used at the same time in a separate
+** thread.
+** It is intended that this variable be set once
** as part of process initialization and before any SQLite interface
-** routines have been call and remain unchanged thereafter.
+** routines have been called and that this variable remain unchanged
+** thereafter.
+**
+** The [temp_store_directory pragma] may modify this variable and cause
+** it to point to memory obtained from [sqlite3_malloc]. Furthermore,
+** the [temp_store_directory pragma] always assumes that any string
+** that this variable points to is held in memory obtained from
+** [sqlite3_malloc] and the pragma may attempt to free that memory
+** using [sqlite3_free].
+** Hence, if this variable is modified directly, either it should be
+** made NULL or made to point to memory obtained from [sqlite3_malloc]
+** or else the use of the [temp_store_directory pragma] should be avoided.
*/
-SQLITE_EXTERN char *sqlite3_temp_directory;
+SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
/*
-** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode {F12930}
+** CAPI3REF: Test For Auto-Commit Mode {H12930} <S60200>
+** KEYWORDS: {autocommit mode}
**
-** The sqlite3_get_autocommit() interfaces returns non-zero or
+** The sqlite3_get_autocommit() interface returns non-zero or
** zero if the given database connection is or is not in autocommit mode,
-** respectively. Autocommit mode is on
-** by default. Autocommit mode is disabled by a [BEGIN] statement.
-** Autocommit mode is reenabled by a [COMMIT] or [ROLLBACK].
+** respectively. Autocommit mode is on by default.
+** Autocommit mode is disabled by a [BEGIN] statement.
+** Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK].
**
** If certain kinds of errors occur on a statement within a multi-statement
-** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR],
+** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR],
** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the
** transaction might be rolled back automatically. The only way to
-** find out if SQLite automatically rolled back the transaction after
+** find out whether SQLite automatically rolled back the transaction after
** an error is to use this function.
**
-** INVARIANTS:
-**
-** {F12931} The [sqlite3_get_autocommit(D)] interface returns non-zero or
-** zero if the [database connection] D is or is not in autocommit
-** mode, respectively.
-**
-** {F12932} Autocommit mode is on by default.
+** If another thread changes the autocommit status of the database
+** connection while this routine is running, then the return value
+** is undefined.
**
-** {F12933} Autocommit mode is disabled by a successful [BEGIN] statement.
+** Requirements: [H12931] [H12932] [H12933] [H12934]
+*/
+SQLITE_API int sqlite3_get_autocommit(sqlite3*);
+
+/*
+** CAPI3REF: Find The Database Handle Of A Prepared Statement {H13120} <S60600>
**
-** {F12934} Autocommit mode is enabled by a successful [COMMIT] or [ROLLBACK]
-** statement.
-**
+** The sqlite3_db_handle interface returns the [database connection] handle
+** to which a [prepared statement] belongs. The [database connection]
+** returned by sqlite3_db_handle is the same [database connection] that was the first argument
+** to the [sqlite3_prepare_v2()] call (or its variants) that was used to
+** create the statement in the first place.
**
-** LIMITATIONS:
-***
-** {U12936} If another thread changes the autocommit status of the database
-** connection while this routine is running, then the return value
-** is undefined.
+** Requirements: [H13123]
*/
-int sqlite3_get_autocommit(sqlite3*);
+SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
/*
-** CAPI3REF: Find The Database Handle Of A Prepared Statement {F13120}
+** CAPI3REF: Find the next prepared statement {H13140} <S60600>
**
-** The sqlite3_db_handle interface
-** returns the [sqlite3*] database handle to which a
-** [prepared statement] belongs.
-** The database handle returned by sqlite3_db_handle
-** is the same database handle that was
-** the first argument to the [sqlite3_prepare_v2()] or its variants
-** that was used to create the statement in the first place.
+** This interface returns a pointer to the next [prepared statement] after
+** pStmt associated with the [database connection] pDb. If pStmt is NULL
+** then this interface returns a pointer to the first prepared statement
+** associated with the database connection pDb. If no prepared statement
+** satisfies the conditions of this routine, it returns NULL.
**
-** INVARIANTS:
+** The [database connection] pointer D in a call to
+** [sqlite3_next_stmt(D,S)] must refer to an open database
+** connection and in particular must not be a NULL pointer.
**
-** {F13123} The [sqlite3_db_handle(S)] interface returns a pointer
-** to the [database connection] associated with
-** [prepared statement] S.
+** Requirements: [H13143] [H13146] [H13149] [H13152]
*/
-sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
-
+SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt);
/*
-** CAPI3REF: Commit And Rollback Notification Callbacks {F12950}
+** CAPI3REF: Commit And Rollback Notification Callbacks {H12950} <S60400>
**
** The sqlite3_commit_hook() interface registers a callback
-** function to be invoked whenever a transaction is committed.
+** function to be invoked whenever a transaction is [COMMIT | committed].
** Any callback set by a previous call to sqlite3_commit_hook()
** for the same database connection is overridden.
** The sqlite3_rollback_hook() interface registers a callback
-** function to be invoked whenever a transaction is committed.
+** function to be invoked whenever a transaction is [ROLLBACK | rolled back].
** Any callback set by a previous call to sqlite3_commit_hook()
** for the same database connection is overridden.
-** The pArg argument is passed through
-** to the callback. If the callback on a commit hook function
-** returns non-zero, then the commit is converted into a rollback.
+** The pArg argument is passed through to the callback.
+** If the callback on a commit hook function returns non-zero,
+** then the commit is converted into a rollback.
**
** If another function was previously registered, its
** pArg value is returned. Otherwise NULL is returned.
**
+** The callback implementation must not do anything that will modify
+** the database connection that invoked the callback. Any actions
+** to modify the database connection must be deferred until after the
+** completion of the [sqlite3_step()] call that triggered the commit
+** or rollback hook in the first place.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
+**
** Registering a NULL function disables the callback.
**
-** For the purposes of this API, a transaction is said to have been
+** When the commit hook callback routine returns zero, the [COMMIT]
+** operation is allowed to continue normally. If the commit hook
+** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK].
+** The rollback hook is invoked on a rollback that results from a commit
+** hook returning non-zero, just as it would be with any other rollback.
+**
+** For the purposes of this API, a transaction is said to have been
** rolled back if an explicit "ROLLBACK" statement is executed, or
** an error or constraint causes an implicit rollback to occur.
** The rollback callback is not invoked if a transaction is
@@ -4445,206 +3888,137 @@ sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
** rolled back because a commit callback returned non-zero.
** <todo> Check on this </todo>
**
-** These are experimental interfaces and are subject to change.
-**
-** INVARIANTS:
-**
-** {F12951} The [sqlite3_commit_hook(D,F,P)] interface registers the
-** callback function F to be invoked with argument P whenever
-** a transaction commits on [database connection] D.
+** See also the [sqlite3_update_hook()] interface.
**
-** {F12952} The [sqlite3_commit_hook(D,F,P)] interface returns the P
-** argument from the previous call with the same
-** [database connection ] D , or NULL on the first call
-** for a particular [database connection] D.
-**
-** {F12953} Each call to [sqlite3_commit_hook()] overwrites the callback
-** registered by prior calls.
-**
-** {F12954} If the F argument to [sqlite3_commit_hook(D,F,P)] is NULL
-** then the commit hook callback is cancelled and no callback
-** is invoked when a transaction commits.
-**
-** {F12955} If the commit callback returns non-zero then the commit is
-** converted into a rollback.
-**
-** {F12961} The [sqlite3_rollback_hook(D,F,P)] interface registers the
-** callback function F to be invoked with argument P whenever
-** a transaction rolls back on [database connection] D.
-**
-** {F12962} The [sqlite3_rollback_hook(D,F,P)] interface returns the P
-** argument from the previous call with the same
-** [database connection ] D , or NULL on the first call
-** for a particular [database connection] D.
-**
-** {F12963} Each call to [sqlite3_rollback_hook()] overwrites the callback
-** registered by prior calls.
-**
-** {F12964} If the F argument to [sqlite3_rollback_hook(D,F,P)] is NULL
-** then the rollback hook callback is cancelled and no callback
-** is invoked when a transaction rolls back.
+** Requirements:
+** [H12951] [H12952] [H12953] [H12954] [H12955]
+** [H12961] [H12962] [H12963] [H12964]
*/
-void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
-void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
+SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
+SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
/*
-** CAPI3REF: Data Change Notification Callbacks {F12970}
+** CAPI3REF: Data Change Notification Callbacks {H12970} <S60400>
**
-** The sqlite3_update_hook() interface
-** registers a callback function with the database connection identified by the
-** first argument to be invoked whenever a row is updated, inserted or deleted.
-** Any callback set by a previous call to this function for the same
-** database connection is overridden.
+** The sqlite3_update_hook() interface registers a callback function
+** with the [database connection] identified by the first argument
+** to be invoked whenever a row is updated, inserted or deleted.
+** Any callback set by a previous call to this function
+** for the same database connection is overridden.
**
-** The second argument is a pointer to the function to invoke when a
-** row is updated, inserted or deleted.
-** The first argument to the callback is
-** a copy of the third argument to sqlite3_update_hook().
-** The second callback
-** argument is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE],
-** depending on the operation that caused the callback to be invoked.
-** The third and
-** fourth arguments to the callback contain pointers to the database and
-** table name containing the affected row.
-** The final callback parameter is
-** the rowid of the row.
-** In the case of an update, this is the rowid after
-** the update takes place.
+** The second argument is a pointer to the function to invoke when a
+** row is updated, inserted or deleted.
+** The first argument to the callback is a copy of the third argument
+** to sqlite3_update_hook().
+** The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE],
+** or [SQLITE_UPDATE], depending on the operation that caused the callback
+** to be invoked.
+** The third and fourth arguments to the callback contain pointers to the
+** database and table name containing the affected row.
+** The final callback parameter is the [rowid] of the row.
+** In the case of an update, this is the [rowid] after the update takes place.
**
** The update hook is not invoked when internal system tables are
** modified (i.e. sqlite_master and sqlite_sequence).
**
-** If another function was previously registered, its pArg value
-** is returned. Otherwise NULL is returned.
-**
-** INVARIANTS:
-**
-** {F12971} The [sqlite3_update_hook(D,F,P)] interface causes callback
-** function F to be invoked with first parameter P whenever
-** a table row is modified, inserted, or deleted on
-** [database connection] D.
-**
-** {F12973} The [sqlite3_update_hook(D,F,P)] interface returns the value
-** of P for the previous call on the same [database connection] D,
-** or NULL for the first call.
+** In the current implementation, the update hook
+** is not invoked when duplication rows are deleted because of an
+** [ON CONFLICT | ON CONFLICT REPLACE] clause. Nor is the update hook
+** invoked when rows are deleted using the [truncate optimization].
+** The exceptions defined in this paragraph might change in a future
+** release of SQLite.
**
-** {F12975} If the update hook callback F in [sqlite3_update_hook(D,F,P)]
-** is NULL then the no update callbacks are made.
+** The update hook implementation must not do anything that will modify
+** the database connection that invoked the update hook. Any actions
+** to modify the database connection must be deferred until after the
+** completion of the [sqlite3_step()] call that triggered the update hook.
+** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
+** database connections for the meaning of "modify" in this paragraph.
**
-** {F12977} Each call to [sqlite3_update_hook(D,F,P)] overrides prior calls
-** to the same interface on the same [database connection] D.
-**
-** {F12979} The update hook callback is not invoked when internal system
-** tables such as sqlite_master and sqlite_sequence are modified.
+** If another function was previously registered, its pArg value
+** is returned. Otherwise NULL is returned.
**
-** {F12981} The second parameter to the update callback
-** is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE],
-** depending on the operation that caused the callback to be invoked.
+** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()]
+** interfaces.
**
-** {F12983} The third and fourth arguments to the callback contain pointers
-** to zero-terminated UTF-8 strings which are the names of the
-** database and table that is being updated.
-
-** {F12985} The final callback parameter is the rowid of the row after
-** the change occurs.
+** Requirements:
+** [H12971] [H12973] [H12975] [H12977] [H12979] [H12981] [H12983] [H12986]
*/
-void *sqlite3_update_hook(
+SQLITE_API void *sqlite3_update_hook(
sqlite3*,
void(*)(void *,int ,char const *,char const *,sqlite3_int64),
void*
);
/*
-** CAPI3REF: Enable Or Disable Shared Pager Cache {F10330}
+** CAPI3REF: Enable Or Disable Shared Pager Cache {H10330} <S30900>
+** KEYWORDS: {shared cache}
**
** This routine enables or disables the sharing of the database cache
-** and schema data structures between connections to the same database.
-** Sharing is enabled if the argument is true and disabled if the argument
-** is false.
+** and schema data structures between [database connection | connections]
+** to the same database. Sharing is enabled if the argument is true
+** and disabled if the argument is false.
**
-** Cache sharing is enabled and disabled
-** for an entire process. {END} This is a change as of SQLite version 3.5.0.
-** In prior versions of SQLite, sharing was
-** enabled or disabled for each thread separately.
+** Cache sharing is enabled and disabled for an entire process.
+** This is a change as of SQLite version 3.5.0. In prior versions of SQLite,
+** sharing was enabled or disabled for each thread separately.
**
** The cache sharing mode set by this interface effects all subsequent
** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()].
** Existing database connections continue use the sharing mode
** that was in effect at the time they were opened.
**
-** Virtual tables cannot be used with a shared cache. When shared
+** Virtual tables cannot be used with a shared cache. When shared
** cache is enabled, the [sqlite3_create_module()] API used to register
** virtual tables will always return an error.
**
-** This routine returns [SQLITE_OK] if shared cache was
-** enabled or disabled successfully. An [error code]
-** is returned otherwise.
+** This routine returns [SQLITE_OK] if shared cache was enabled or disabled
+** successfully. An [error code] is returned otherwise.
**
** Shared cache is disabled by default. But this might change in
** future releases of SQLite. Applications that care about shared
** cache setting should set it explicitly.
**
-** INVARIANTS:
-**
-** {F10331} A successful invocation of [sqlite3_enable_shared_cache(B)]
-** will enable or disable shared cache mode for any subsequently
-** created [database connection] in the same process.
-**
-** {F10336} When shared cache is enabled, the [sqlite3_create_module()]
-** interface will always return an error.
+** See Also: [SQLite Shared-Cache Mode]
**
-** {F10337} The [sqlite3_enable_shared_cache(B)] interface returns
-** [SQLITE_OK] if shared cache was enabled or disabled successfully.
-**
-** {F10339} Shared cache is disabled by default.
+** Requirements: [H10331] [H10336] [H10337] [H10339]
*/
-int sqlite3_enable_shared_cache(int);
+SQLITE_API int sqlite3_enable_shared_cache(int);
/*
-** CAPI3REF: Attempt To Free Heap Memory {F17340}
-**
-** The sqlite3_release_memory() interface attempts to
-** free N bytes of heap memory by deallocating non-essential memory
-** allocations held by the database labrary. {END} Memory used
-** to cache database pages to improve performance is an example of
-** non-essential memory. Sqlite3_release_memory() returns
-** the number of bytes actually freed, which might be more or less
-** than the amount requested.
+** CAPI3REF: Attempt To Free Heap Memory {H17340} <S30220>
**
-** INVARIANTS:
+** The sqlite3_release_memory() interface attempts to free N bytes
+** of heap memory by deallocating non-essential memory allocations
+** held by the database library. {END} Memory used to cache database
+** pages to improve performance is an example of non-essential memory.
+** sqlite3_release_memory() returns the number of bytes actually freed,
+** which might be more or less than the amount requested.
**
-** {F17341} The [sqlite3_release_memory(N)] interface attempts to
-** free N bytes of heap memory by deallocating non-essential
-** memory allocations held by the database labrary.
-**
-** {F16342} The [sqlite3_release_memory(N)] returns the number
-** of bytes actually freed, which might be more or less
-** than the amount requested.
+** Requirements: [H17341] [H17342]
*/
-int sqlite3_release_memory(int);
+SQLITE_API int sqlite3_release_memory(int);
/*
-** CAPI3REF: Impose A Limit On Heap Size {F17350}
+** CAPI3REF: Impose A Limit On Heap Size {H17350} <S30220>
**
-** The sqlite3_soft_heap_limit() interface
-** places a "soft" limit on the amount of heap memory that may be allocated
-** by SQLite. If an internal allocation is requested
-** that would exceed the soft heap limit, [sqlite3_release_memory()] is
-** invoked one or more times to free up some space before the allocation
-** is made.
+** The sqlite3_soft_heap_limit() interface places a "soft" limit
+** on the amount of heap memory that may be allocated by SQLite.
+** If an internal allocation is requested that would exceed the
+** soft heap limit, [sqlite3_release_memory()] is invoked one or
+** more times to free up some space before the allocation is performed.
**
-** The limit is called "soft", because if
-** [sqlite3_release_memory()] cannot
-** free sufficient memory to prevent the limit from being exceeded,
+** The limit is called "soft", because if [sqlite3_release_memory()]
+** cannot free sufficient memory to prevent the limit from being exceeded,
** the memory is allocated anyway and the current operation proceeds.
**
** A negative or zero value for N means that there is no soft heap limit and
** [sqlite3_release_memory()] will only be called when memory is exhausted.
** The default value for the soft heap limit is zero.
**
-** SQLite makes a best effort to honor the soft heap limit.
-** But if the soft heap limit cannot honored, execution will
-** continue without error or notification. This is why the limit is
+** SQLite makes a best effort to honor the soft heap limit.
+** But if the soft heap limit cannot be honored, execution will
+** continue without error or notification. This is why the limit is
** called a "soft" limit. It is advisory only.
**
** Prior to SQLite version 3.5.0, this routine only constrained the memory
@@ -4655,83 +4029,56 @@ int sqlite3_release_memory(int);
** version 3.5.0 there is no mechanism for limiting the heap usage for
** individual threads.
**
-** INVARIANTS:
-**
-** {F16351} The [sqlite3_soft_heap_limit(N)] interface places a soft limit
-** of N bytes on the amount of heap memory that may be allocated
-** using [sqlite3_malloc()] or [sqlite3_realloc()] at any point
-** in time.
-**
-** {F16352} If a call to [sqlite3_malloc()] or [sqlite3_realloc()] would
-** cause the total amount of allocated memory to exceed the
-** soft heap limit, then [sqlite3_release_memory()] is invoked
-** in an attempt to reduce the memory usage prior to proceeding
-** with the memory allocation attempt.
-**
-** {F16353} Calls to [sqlite3_malloc()] or [sqlite3_realloc()] that trigger
-** attempts to reduce memory usage through the soft heap limit
-** mechanism continue even if the attempt to reduce memory
-** usage is unsuccessful.
-**
-** {F16354} A negative or zero value for N in a call to
-** [sqlite3_soft_heap_limit(N)] means that there is no soft
-** heap limit and [sqlite3_release_memory()] will only be
-** called when memory is completely exhausted.
-**
-** {F16355} The default value for the soft heap limit is zero.
-**
-** {F16358} Each call to [sqlite3_soft_heap_limit(N)] overrides the
-** values set by all prior calls.
+** Requirements:
+** [H16351] [H16352] [H16353] [H16354] [H16355] [H16358]
*/
-void sqlite3_soft_heap_limit(int);
+SQLITE_API void sqlite3_soft_heap_limit(int);
/*
-** CAPI3REF: Extract Metadata About A Column Of A Table {F12850}
+** CAPI3REF: Extract Metadata About A Column Of A Table {H12850} <S60300>
**
-** This routine
-** returns meta-data about a specific column of a specific database
-** table accessible using the connection handle passed as the first function
-** argument.
+** This routine returns metadata about a specific column of a specific
+** database table accessible using the [database connection] handle
+** passed as the first function argument.
**
-** The column is identified by the second, third and fourth parameters to
+** The column is identified by the second, third and fourth parameters to
** this function. The second parameter is either the name of the database
** (i.e. "main", "temp" or an attached database) containing the specified
** table or NULL. If it is NULL, then all attached databases are searched
-** for the table using the same algorithm as the database engine uses to
+** for the table using the same algorithm used by the database engine to
** resolve unqualified table references.
**
-** The third and fourth parameters to this function are the table and column
-** name of the desired column, respectively. Neither of these parameters
+** The third and fourth parameters to this function are the table and column
+** name of the desired column, respectively. Neither of these parameters
** may be NULL.
**
-** Meta information is returned by writing to the memory locations passed as
-** the 5th and subsequent parameters to this function. Any of these
-** arguments may be NULL, in which case the corresponding element of meta
-** information is ommitted.
+** Metadata is returned by writing to the memory locations passed as the 5th
+** and subsequent parameters to this function. Any of these arguments may be
+** NULL, in which case the corresponding element of metadata is omitted.
**
-** <pre>
-** Parameter Output Type Description
-** -----------------------------------
-**
-** 5th const char* Data type
-** 6th const char* Name of the default collation sequence
-** 7th int True if the column has a NOT NULL constraint
-** 8th int True if the column is part of the PRIMARY KEY
-** 9th int True if the column is AUTOINCREMENT
-** </pre>
+** <blockquote>
+** <table border="1">
+** <tr><th> Parameter <th> Output<br>Type <th> Description
**
+** <tr><td> 5th <td> const char* <td> Data type
+** <tr><td> 6th <td> const char* <td> Name of default collation sequence
+** <tr><td> 7th <td> int <td> True if column has a NOT NULL constraint
+** <tr><td> 8th <td> int <td> True if column is part of the PRIMARY KEY
+** <tr><td> 9th <td> int <td> True if column is [AUTOINCREMENT]
+** </table>
+** </blockquote>
**
-** The memory pointed to by the character pointers returned for the
-** declaration type and collation sequence is valid only until the next
-** call to any sqlite API function.
+** The memory pointed to by the character pointers returned for the
+** declaration type and collation sequence is valid only until the next
+** call to any SQLite API function.
**
-** If the specified table is actually a view, then an error is returned.
+** If the specified table is actually a view, an [error code] is returned.
**
-** If the specified column is "rowid", "oid" or "_rowid_" and an
-** INTEGER PRIMARY KEY column has been explicitly declared, then the output
+** If the specified column is "rowid", "oid" or "_rowid_" and an
+** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output
** parameters are set for the explicitly declared column. If there is no
-** explicitly declared IPK column, then the output parameters are set as
-** follows:
+** explicitly declared [INTEGER PRIMARY KEY] column, then the output
+** parameters are set as follows:
**
** <pre>
** data type: "INTEGER"
@@ -4743,13 +4090,13 @@ void sqlite3_soft_heap_limit(int);
**
** This function may load one or more schemas from database files. If an
** error occurs during this process, or if the requested table or column
-** cannot be found, an SQLITE error code is returned and an error message
-** left in the database handle (to be retrieved using sqlite3_errmsg()).
+** cannot be found, an [error code] is returned and an error message left
+** in the [database connection] (to be retrieved using sqlite3_errmsg()).
**
** This API is only available if the library was compiled with the
-** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined.
+** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined.
*/
-int sqlite3_table_column_metadata(
+SQLITE_API int sqlite3_table_column_metadata(
sqlite3 *db, /* Connection handle */
const char *zDbName, /* Database name or NULL */
const char *zTableName, /* Table name */
@@ -4762,29 +4109,32 @@ int sqlite3_table_column_metadata(
);
/*
-** CAPI3REF: Load An Extension {F12600}
+** CAPI3REF: Load An Extension {H12600} <S20500>
+**
+** This interface loads an SQLite extension library from the named file.
+**
+** {H12601} The sqlite3_load_extension() interface attempts to load an
+** SQLite extension library contained in the file zFile.
+**
+** {H12602} The entry point is zProc.
**
-** {F12601} The sqlite3_load_extension() interface
-** attempts to load an SQLite extension library contained in the file
-** zFile. {F12602} The entry point is zProc. {F12603} zProc may be 0
-** in which case the name of the entry point defaults
-** to "sqlite3_extension_init".
+** {H12603} zProc may be 0, in which case the name of the entry point
+** defaults to "sqlite3_extension_init".
**
-** {F12604} The sqlite3_load_extension() interface shall
-** return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong.
+** {H12604} The sqlite3_load_extension() interface shall return
+** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong.
**
-** {F12605}
-** If an error occurs and pzErrMsg is not 0, then the
-** sqlite3_load_extension() interface shall attempt to fill *pzErrMsg with
-** error message text stored in memory obtained from [sqlite3_malloc()].
-** {END} The calling function should free this memory
-** by calling [sqlite3_free()].
+** {H12605} If an error occurs and pzErrMsg is not 0, then the
+** [sqlite3_load_extension()] interface shall attempt to
+** fill *pzErrMsg with error message text stored in memory
+** obtained from [sqlite3_malloc()]. {END} The calling function
+** should free this memory by calling [sqlite3_free()].
**
-** {F12606}
-** Extension loading must be enabled using [sqlite3_enable_load_extension()]
-** prior to calling this API or an error will be returned.
+** {H12606} Extension loading must be enabled using
+** [sqlite3_enable_load_extension()] prior to calling this API,
+** otherwise an error will be returned.
*/
-int sqlite3_load_extension(
+SQLITE_API int sqlite3_load_extension(
sqlite3 *db, /* Load the extension into this database connection */
const char *zFile, /* Name of the shared library containing extension */
const char *zProc, /* Entry point. Derived from zFile if 0 */
@@ -4792,64 +4142,63 @@ int sqlite3_load_extension(
);
/*
-** CAPI3REF: Enable Or Disable Extension Loading {F12620}
+** CAPI3REF: Enable Or Disable Extension Loading {H12620} <S20500>
**
** So as not to open security holes in older applications that are
** unprepared to deal with extension loading, and as a means of disabling
-** extension loading while evaluating user-entered SQL, the following
-** API is provided to turn the [sqlite3_load_extension()] mechanism on and
-** off. {F12622} It is off by default. {END} See ticket #1863.
+** extension loading while evaluating user-entered SQL, the following API
+** is provided to turn the [sqlite3_load_extension()] mechanism on and off.
**
-** {F12621} Call the sqlite3_enable_load_extension() routine
-** with onoff==1 to turn extension loading on
-** and call it with onoff==0 to turn it back off again. {END}
+** Extension loading is off by default. See ticket #1863.
+**
+** {H12621} Call the sqlite3_enable_load_extension() routine with onoff==1
+** to turn extension loading on and call it with onoff==0 to turn
+** it back off again.
+**
+** {H12622} Extension loading is off by default.
*/
-int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
+SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
/*
-** CAPI3REF: Make Arrangements To Automatically Load An Extension {F12640}
-**
-** {F12641} This function
-** registers an extension entry point that is automatically invoked
-** whenever a new database connection is opened using
-** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. {END}
+** CAPI3REF: Automatically Load An Extensions {H12640} <S20500>
**
** This API can be invoked at program startup in order to register
** one or more statically linked extensions that will be available
-** to all new database connections.
+** to all new [database connections]. {END}
+**
+** This routine stores a pointer to the extension in an array that is
+** obtained from [sqlite3_malloc()]. If you run a memory leak checker
+** on your program and it reports a leak because of this array, invoke
+** [sqlite3_reset_auto_extension()] prior to shutdown to free the memory.
**
-** {F12642} Duplicate extensions are detected so calling this routine multiple
-** times with the same extension is harmless.
+** {H12641} This function registers an extension entry point that is
+** automatically invoked whenever a new [database connection]
+** is opened using [sqlite3_open()], [sqlite3_open16()],
+** or [sqlite3_open_v2()].
**
-** {F12643} This routine stores a pointer to the extension in an array
-** that is obtained from sqlite_malloc(). {END} If you run a memory leak
-** checker on your program and it reports a leak because of this
-** array, then invoke [sqlite3_reset_auto_extension()] prior
-** to shutdown to free the memory.
+** {H12642} Duplicate extensions are detected so calling this routine
+** multiple times with the same extension is harmless.
**
-** {F12644} Automatic extensions apply across all threads. {END}
+** {H12643} This routine stores a pointer to the extension in an array
+** that is obtained from [sqlite3_malloc()].
**
-** This interface is experimental and is subject to change or
-** removal in future releases of SQLite.
+** {H12644} Automatic extensions apply across all threads.
*/
-int sqlite3_auto_extension(void *xEntryPoint);
-
+SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void));
/*
-** CAPI3REF: Reset Automatic Extension Loading {F12660}
+** CAPI3REF: Reset Automatic Extension Loading {H12660} <S20500>
**
-** {F12661} This function disables all previously registered
-** automatic extensions. {END} This
-** routine undoes the effect of all prior [sqlite3_auto_extension()]
-** calls.
+** This function disables all previously registered automatic
+** extensions. {END} It undoes the effect of all prior
+** [sqlite3_auto_extension()] calls.
**
-** {F12662} This call disabled automatic extensions in all threads. {END}
+** {H12661} This function disables all previously registered
+** automatic extensions.
**
-** This interface is experimental and is subject to change or
-** removal in future releases of SQLite.
+** {H12662} This function disables automatic extensions in all threads.
*/
-void sqlite3_reset_auto_extension(void);
-
+SQLITE_API void sqlite3_reset_auto_extension(void);
/*
****** EXPERIMENTAL - subject to change without notice **************
@@ -4858,7 +4207,7 @@ void sqlite3_reset_auto_extension(void);
** to be experimental. The interface might change in incompatible ways.
** If this is a problem for you, do not use the interface at this time.
**
-** When the virtual-table mechanism stablizes, we will declare the
+** When the virtual-table mechanism stabilizes, we will declare the
** interface fixed, support it indefinitely, and remove this comment.
*/
@@ -4871,12 +4220,21 @@ typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor;
typedef struct sqlite3_module sqlite3_module;
/*
-** CAPI3REF: Virtual Table Object {F18000}
-** KEYWORDS: sqlite3_module
-**
-** A module is a class of virtual tables. Each module is defined
-** by an instance of the following structure. This structure consists
-** mostly of methods for the module.
+** CAPI3REF: Virtual Table Object {H18000} <S20400>
+** KEYWORDS: sqlite3_module {virtual table module}
+** EXPERIMENTAL
+**
+** This structure, sometimes called a a "virtual table module",
+** defines the implementation of a [virtual tables].
+** This structure consists mostly of methods for the module.
+**
+** A virtual table module is created by filling in a persistent
+** instance of this structure and passing a pointer to that instance
+** to [sqlite3_create_module()] or [sqlite3_create_module_v2()].
+** The registration remains valid until it is replaced by a different
+** module or until the [database connection] closes. The content
+** of this structure must not change while it is registered with
+** any database connection.
*/
struct sqlite3_module {
int iVersion;
@@ -4905,28 +4263,26 @@ struct sqlite3_module {
int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName,
void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
void **ppArg);
-
int (*xRename)(sqlite3_vtab *pVtab, const char *zNew);
};
/*
-** CAPI3REF: Virtual Table Indexing Information {F18100}
+** CAPI3REF: Virtual Table Indexing Information {H18100} <S20400>
** KEYWORDS: sqlite3_index_info
+** EXPERIMENTAL
**
** The sqlite3_index_info structure and its substructures is used to
-** pass information into and receive the reply from the xBestIndex
-** method of an sqlite3_module. The fields under **Inputs** are the
+** pass information into and receive the reply from the [xBestIndex]
+** method of a [virtual table module]. The fields under **Inputs** are the
** inputs to xBestIndex and are read-only. xBestIndex inserts its
** results into the **Outputs** fields.
**
-** The aConstraint[] array records WHERE clause constraints of the
-** form:
+** The aConstraint[] array records WHERE clause constraints of the form:
**
-** column OP expr
+** <pre>column OP expr</pre>
**
-** Where OP is =, &lt;, &lt;=, &gt;, or &gt;=.
-** The particular operator is stored
-** in aConstraint[].op. The index of the column is stored in
+** where OP is =, &lt;, &lt;=, &gt;, or &gt;=. The particular operator is
+** stored in aConstraint[].op. The index of the column is stored in
** aConstraint[].iColumn. aConstraint[].usable is TRUE if the
** expr on the right-hand side can be evaluated (and thus the constraint
** is usable) and false if it cannot.
@@ -4940,17 +4296,19 @@ struct sqlite3_module {
** Information about the ORDER BY clause is stored in aOrderBy[].
** Each term of aOrderBy records a column of the ORDER BY clause.
**
-** The xBestIndex method must fill aConstraintUsage[] with information
+** The [xBestIndex] method must fill aConstraintUsage[] with information
** about what parameters to pass to xFilter. If argvIndex>0 then
** the right-hand side of the corresponding aConstraint[] is evaluated
** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit
** is true, then the constraint is assumed to be fully handled by the
** virtual table and is not checked again by SQLite.
**
-** The idxNum and idxPtr values are recorded and passed into xFilter.
-** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true.
+** The idxNum and idxPtr values are recorded and passed into the
+** [xFilter] method.
+** [sqlite3_free()] is used to free idxPtr if and only iff
+** needToFreeIdxPtr is true.
**
-** The orderByConsumed means that output from xFilter will occur in
+** The orderByConsumed means that output from [xFilter]/[xNext] will occur in
** the correct order to satisfy the ORDER BY clause so that no separate
** sorting step is required.
**
@@ -4973,7 +4331,6 @@ struct sqlite3_index_info {
int iColumn; /* Column number */
unsigned char desc; /* True for DESC. False for ASC. */
} *aOrderBy; /* The ORDER BY clause */
-
/* Outputs */
struct sqlite3_index_constraint_usage {
int argvIndex; /* if >0, constraint is part of argv to xFilter */
@@ -4993,70 +4350,89 @@ struct sqlite3_index_info {
#define SQLITE_INDEX_CONSTRAINT_MATCH 64
/*
-** CAPI3REF: Register A Virtual Table Implementation {F18200}
-**
-** This routine is used to register a new module name with an SQLite
-** connection. Module names must be registered before creating new
-** virtual tables on the module, or before using preexisting virtual
-** tables of the module.
+** CAPI3REF: Register A Virtual Table Implementation {H18200} <S20400>
+** EXPERIMENTAL
+**
+** This routine is used to register a new [virtual table module] name.
+** Module names must be registered before
+** creating a new [virtual table] using the module, or before using a
+** preexisting [virtual table] for the module.
+**
+** The module name is registered on the [database connection] specified
+** by the first parameter. The name of the module is given by the
+** second parameter. The third parameter is a pointer to
+** the implementation of the [virtual table module]. The fourth
+** parameter is an arbitrary client data pointer that is passed through
+** into the [xCreate] and [xConnect] methods of the virtual table module
+** when a new virtual table is be being created or reinitialized.
+**
+** This interface has exactly the same effect as calling
+** [sqlite3_create_module_v2()] with a NULL client data destructor.
*/
-int sqlite3_create_module(
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module(
sqlite3 *db, /* SQLite connection to register module with */
const char *zName, /* Name of the module */
- const sqlite3_module *, /* Methods for the module */
- void * /* Client data for xCreate/xConnect */
+ const sqlite3_module *p, /* Methods for the module */
+ void *pClientData /* Client data for xCreate/xConnect */
);
/*
-** CAPI3REF: Register A Virtual Table Implementation {F18210}
-**
-** This routine is identical to the sqlite3_create_module() method above,
-** except that it allows a destructor function to be specified. It is
-** even more experimental than the rest of the virtual tables API.
+** CAPI3REF: Register A Virtual Table Implementation {H18210} <S20400>
+** EXPERIMENTAL
+**
+** This routine is identical to the [sqlite3_create_module()] method,
+** except that it has an extra parameter to specify
+** a destructor function for the client data pointer. SQLite will
+** invoke the destructor function (if it is not NULL) when SQLite
+** no longer needs the pClientData pointer.
*/
-int sqlite3_create_module_v2(
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2(
sqlite3 *db, /* SQLite connection to register module with */
const char *zName, /* Name of the module */
- const sqlite3_module *, /* Methods for the module */
- void *, /* Client data for xCreate/xConnect */
+ const sqlite3_module *p, /* Methods for the module */
+ void *pClientData, /* Client data for xCreate/xConnect */
void(*xDestroy)(void*) /* Module destructor function */
);
/*
-** CAPI3REF: Virtual Table Instance Object {F18010}
+** CAPI3REF: Virtual Table Instance Object {H18010} <S20400>
** KEYWORDS: sqlite3_vtab
+** EXPERIMENTAL
**
-** Every module implementation uses a subclass of the following structure
-** to describe a particular instance of the module. Each subclass will
-** be tailored to the specific needs of the module implementation. The
-** purpose of this superclass is to define certain fields that are common
-** to all module implementations.
+** Every [virtual table module] implementation uses a subclass
+** of the following structure to describe a particular instance
+** of the [virtual table]. Each subclass will
+** be tailored to the specific needs of the module implementation.
+** The purpose of this superclass is to define certain fields that are
+** common to all module implementations.
**
** Virtual tables methods can set an error message by assigning a
-** string obtained from sqlite3_mprintf() to zErrMsg. The method should
-** take care that any prior string is freed by a call to sqlite3_free()
+** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should
+** take care that any prior string is freed by a call to [sqlite3_free()]
** prior to assigning a new string to zErrMsg. After the error message
** is delivered up to the client application, the string will be automatically
-** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note
-** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field
-** since virtual tables are commonly implemented in loadable extensions which
-** do not have access to sqlite3MPrintf() or sqlite3Free().
+** freed by sqlite3_free() and the zErrMsg field will be zeroed.
*/
struct sqlite3_vtab {
const sqlite3_module *pModule; /* The module for this virtual table */
- int nRef; /* Used internally */
+ int nRef; /* NO LONGER USED */
char *zErrMsg; /* Error message from sqlite3_mprintf() */
/* Virtual table implementations will typically add additional fields */
};
/*
-** CAPI3REF: Virtual Table Cursor Object {F18020}
-** KEYWORDS: sqlite3_vtab_cursor
+** CAPI3REF: Virtual Table Cursor Object {H18020} <S20400>
+** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor}
+** EXPERIMENTAL
**
-** Every module implementation uses a subclass of the following structure
-** to describe cursors that point into the virtual table and are used
+** Every [virtual table module] implementation uses a subclass of the
+** following structure to describe cursors that point into the
+** [virtual table] and are used
** to loop through the virtual table. Cursors are created using the
-** xOpen method of the module. Each module implementation will define
+** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed
+** by the [sqlite3_module.xClose | xClose] method. Cussors are used
+** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods
+** of the module. Each module implementation will define
** the content of a cursor structure to suit its own needs.
**
** This superclass exists in order to define fields of the cursor that
@@ -5068,19 +4444,23 @@ struct sqlite3_vtab_cursor {
};
/*
-** CAPI3REF: Declare The Schema Of A Virtual Table {F18280}
+** CAPI3REF: Declare The Schema Of A Virtual Table {H18280} <S20400>
+** EXPERIMENTAL
**
-** The xCreate and xConnect methods of a module use the following API
+** The [xCreate] and [xConnect] methods of a
+** [virtual table module] call this interface
** to declare the format (the names and datatypes of the columns) of
** the virtual tables they implement.
*/
-int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable);
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_declare_vtab(sqlite3*, const char *zSQL);
/*
-** CAPI3REF: Overload A Function For A Virtual Table {F18300}
+** CAPI3REF: Overload A Function For A Virtual Table {H18300} <S20400>
+** EXPERIMENTAL
**
** Virtual tables can provide alternative implementations of functions
-** using the xFindFunction method. But global versions of those functions
+** using the [xFindFunction] method of the [virtual table module].
+** But global versions of those functions
** must exist in order to be overloaded.
**
** This API makes sure a global version of a function with a particular
@@ -5088,13 +4468,10 @@ int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable);
** before this API is called, a new function is created. The implementation
** of the new function always causes an exception to be thrown. So
** the new function is not good for anything by itself. Its only
-** purpose is to be a place-holder function that can be overloaded
-** by virtual tables.
-**
-** This API should be considered part of the virtual table interface,
-** which is experimental and subject to change.
+** purpose is to be a placeholder function that can be overloaded
+** by a [virtual table].
*/
-int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
/*
** The interface to the virtual-table mechanism defined above (back up
@@ -5109,70 +4486,79 @@ int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
*/
/*
-** CAPI3REF: A Handle To An Open BLOB {F17800}
+** CAPI3REF: A Handle To An Open BLOB {H17800} <S30230>
+** KEYWORDS: {BLOB handle} {BLOB handles}
**
** An instance of this object represents an open BLOB on which
-** incremental I/O can be preformed.
-** Objects of this type are created by
-** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()].
+** [sqlite3_blob_open | incremental BLOB I/O] can be performed.
+** Objects of this type are created by [sqlite3_blob_open()]
+** and destroyed by [sqlite3_blob_close()].
** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces
-** can be used to read or write small subsections of the blob.
-** The [sqlite3_blob_bytes()] interface returns the size of the
-** blob in bytes.
+** can be used to read or write small subsections of the BLOB.
+** The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes.
*/
typedef struct sqlite3_blob sqlite3_blob;
/*
-** CAPI3REF: Open A BLOB For Incremental I/O {F17810}
+** CAPI3REF: Open A BLOB For Incremental I/O {H17810} <S30230>
**
-** This interfaces opens a handle to the blob located
+** This interfaces opens a [BLOB handle | handle] to the BLOB located
** in row iRow, column zColumn, table zTable in database zDb;
-** in other words, the same blob that would be selected by:
+** in other words, the same BLOB that would be selected by:
**
** <pre>
-** SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
+** SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
** </pre> {END}
**
-** If the flags parameter is non-zero, the blob is opened for
-** read and write access. If it is zero, the blob is opened for read
-** access.
+** If the flags parameter is non-zero, then the BLOB is opened for read
+** and write access. If it is zero, the BLOB is opened for read access.
+** It is not possible to open a column that is part of an index or primary
+** key for writing. ^If [foreign key constraints] are enabled, it is
+** not possible to open a column that is part of a [child key] for writing.
**
** Note that the database name is not the filename that contains
** the database but rather the symbolic name of the database that
** is assigned when the database is connected using [ATTACH].
-** For the main database file, the database name is "main". For
-** TEMP tables, the database name is "temp".
-**
-** On success, [SQLITE_OK] is returned and the new
-** [sqlite3_blob | blob handle] is written to *ppBlob.
-** Otherwise an error code is returned and
-** any value written to *ppBlob should not be used by the caller.
-** This function sets the database-handle error code and message
-** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()].
-**
-** INVARIANTS:
-**
-** {F17813} A successful invocation of the [sqlite3_blob_open(D,B,T,C,R,F,P)]
-** interface opens an [sqlite3_blob] object P on the blob
-** in column C of table T in database B on [database connection] D.
-**
-** {F17814} A successful invocation of [sqlite3_blob_open(D,...)] starts
-** a new transaction on [database connection] D if that connection
-** is not already in a transaction.
-**
-** {F17816} The [sqlite3_blob_open(D,B,T,C,R,F,P)] interface opens the blob
-** for read and write access if and only if the F parameter
-** is non-zero.
-**
-** {F17819} The [sqlite3_blob_open()] interface returns [SQLITE_OK] on
-** success and an appropriate [error code] on failure.
-**
-** {F17821} If an error occurs during evaluation of [sqlite3_blob_open(D,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error.
+** For the main database file, the database name is "main".
+** For TEMP tables, the database name is "temp".
+**
+** On success, [SQLITE_OK] is returned and the new [BLOB handle] is written
+** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set
+** to be a null pointer.
+** This function sets the [database connection] error code and message
+** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related
+** functions. Note that the *ppBlob variable is always initialized in a
+** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob
+** regardless of the success or failure of this routine.
+**
+** If the row that a BLOB handle points to is modified by an
+** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects
+** then the BLOB handle is marked as "expired".
+** This is true if any column of the row is changed, even a column
+** other than the one the BLOB handle is open on.
+** Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for
+** a expired BLOB handle fail with an return code of [SQLITE_ABORT].
+** Changes written into a BLOB prior to the BLOB expiring are not
+** rollback by the expiration of the BLOB. Such changes will eventually
+** commit if the transaction continues to completion.
+**
+** Use the [sqlite3_blob_bytes()] interface to determine the size of
+** the opened blob. The size of a blob may not be changed by this
+** interface. Use the [UPDATE] SQL command to change the size of a
+** blob.
+**
+** The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces
+** and the built-in [zeroblob] SQL function can be used, if desired,
+** to create an empty, zero-filled blob in which to read or write using
+** this interface.
+**
+** To avoid a resource leak, every open [BLOB handle] should eventually
+** be released by a call to [sqlite3_blob_close()].
+**
+** Requirements:
+** [H17813] [H17814] [H17816] [H17819] [H17821] [H17824]
*/
-int sqlite3_blob_open(
+SQLITE_API int sqlite3_blob_open(
sqlite3*,
const char *zDb,
const char *zTable,
@@ -5183,158 +4569,125 @@ int sqlite3_blob_open(
);
/*
-** CAPI3REF: Close A BLOB Handle {F17830}
+** CAPI3REF: Close A BLOB Handle {H17830} <S30230>
**
-** Close an open [sqlite3_blob | blob handle].
+** Closes an open [BLOB handle].
**
** Closing a BLOB shall cause the current transaction to commit
** if there are no other BLOBs, no pending prepared statements, and the
-** database connection is in autocommit mode.
+** database connection is in [autocommit mode].
** If any writes were made to the BLOB, they might be held in cache
-** until the close operation if they will fit. {END}
+** until the close operation if they will fit.
+**
** Closing the BLOB often forces the changes
** out to disk and so if any I/O errors occur, they will likely occur
-** at the time when the BLOB is closed. {F17833} Any errors that occur during
+** at the time when the BLOB is closed. Any errors that occur during
** closing are reported as a non-zero return value.
**
** The BLOB is closed unconditionally. Even if this routine returns
** an error code, the BLOB is still closed.
**
-** INVARIANTS:
+** Calling this routine with a null pointer (which as would be returned
+** by failed call to [sqlite3_blob_open()]) is a harmless no-op.
**
-** {F17833} The [sqlite3_blob_close(P)] interface closes an
-** [sqlite3_blob] object P previously opened using
-** [sqlite3_blob_open()].
-**
-** {F17836} Closing an [sqlite3_blob] object using
-** [sqlite3_blob_close()] shall cause the current transaction to
-** commit if there are no other open [sqlite3_blob] objects
-** or [prepared statements] on the same [database connection] and
-** the [database connection] is in
-** [sqlite3_get_autocommit | autocommit mode].
-**
-** {F17839} The [sqlite3_blob_close(P)] interfaces closes the
-** [sqlite3_blob] object P unconditionally, even if
-** [sqlite3_blob_close(P)] returns something other than [SQLITE_OK].
-**
+** Requirements:
+** [H17833] [H17836] [H17839]
*/
-int sqlite3_blob_close(sqlite3_blob *);
+SQLITE_API int sqlite3_blob_close(sqlite3_blob *);
/*
-** CAPI3REF: Return The Size Of An Open BLOB {F17840}
+** CAPI3REF: Return The Size Of An Open BLOB {H17840} <S30230>
**
-** Return the size in bytes of the blob accessible via the open
-** [sqlite3_blob] object in its only argument.
+** Returns the size in bytes of the BLOB accessible via the
+** successfully opened [BLOB handle] in its only argument. The
+** incremental blob I/O routines can only read or overwriting existing
+** blob content; they cannot change the size of a blob.
**
-** INVARIANTS:
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17843} The [sqlite3_blob_bytes(P)] interface returns the size
-** in bytes of the BLOB that the [sqlite3_blob] object P
-** refers to.
+** Requirements:
+** [H17843]
*/
-int sqlite3_blob_bytes(sqlite3_blob *);
+SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *);
/*
-** CAPI3REF: Read Data From A BLOB Incrementally {F17850}
+** CAPI3REF: Read Data From A BLOB Incrementally {H17850} <S30230>
**
-** This function is used to read data from an open
-** [sqlite3_blob | blob-handle] into a caller supplied buffer.
-** N bytes of data are copied into buffer
-** Z from the open blob, starting at offset iOffset.
+** This function is used to read data from an open [BLOB handle] into a
+** caller-supplied buffer. N bytes of data are copied into buffer Z
+** from the open BLOB, starting at offset iOffset.
**
-** If offset iOffset is less than N bytes from the end of the blob,
+** If offset iOffset is less than N bytes from the end of the BLOB,
** [SQLITE_ERROR] is returned and no data is read. If N or iOffset is
-** less than zero [SQLITE_ERROR] is returned and no data is read.
-**
-** On success, SQLITE_OK is returned. Otherwise, an
-** [error code] or an [extended error code] is returned.
-**
-** INVARIANTS:
+** less than zero, [SQLITE_ERROR] is returned and no data is read.
+** The size of the blob (and hence the maximum value of N+iOffset)
+** can be determined using the [sqlite3_blob_bytes()] interface.
**
-** {F17853} The [sqlite3_blob_read(P,Z,N,X)] interface reads N bytes
-** beginning at offset X from
-** the blob that [sqlite3_blob] object P refers to
-** and writes those N bytes into buffer Z.
+** An attempt to read from an expired [BLOB handle] fails with an
+** error code of [SQLITE_ABORT].
**
-** {F17856} In [sqlite3_blob_read(P,Z,N,X)] if the size of the blob
-** is less than N+X bytes, then the function returns [SQLITE_ERROR]
-** and nothing is read from the blob.
+** On success, SQLITE_OK is returned.
+** Otherwise, an [error code] or an [extended error code] is returned.
**
-** {F17859} In [sqlite3_blob_read(P,Z,N,X)] if X or N is less than zero
-** then the function returns [SQLITE_ERROR]
-** and nothing is read from the blob.
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17862} The [sqlite3_blob_read(P,Z,N,X)] interface returns [SQLITE_OK]
-** if N bytes where successfully read into buffer Z.
+** See also: [sqlite3_blob_write()].
**
-** {F17865} If the requested read could not be completed,
-** the [sqlite3_blob_read(P,Z,N,X)] interface returns an
-** appropriate [error code] or [extended error code].
-**
-** {F17868} If an error occurs during evaluation of [sqlite3_blob_read(P,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error, where D is the
-** database handle that was used to open blob handle P.
+** Requirements:
+** [H17853] [H17856] [H17859] [H17862] [H17863] [H17865] [H17868]
*/
-int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset);
+SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset);
/*
-** CAPI3REF: Write Data Into A BLOB Incrementally {F17870}
+** CAPI3REF: Write Data Into A BLOB Incrementally {H17870} <S30230>
**
-** This function is used to write data into an open
-** [sqlite3_blob | blob-handle] from a user supplied buffer.
-** n bytes of data are copied from the buffer
-** pointed to by z into the open blob, starting at offset iOffset.
+** This function is used to write data into an open [BLOB handle] from a
+** caller-supplied buffer. N bytes of data are copied from the buffer Z
+** into the open BLOB, starting at offset iOffset.
**
-** If the [sqlite3_blob | blob-handle] passed as the first argument
-** was not opened for writing (the flags parameter to [sqlite3_blob_open()]
-*** was zero), this function returns [SQLITE_READONLY].
+** If the [BLOB handle] passed as the first argument was not opened for
+** writing (the flags parameter to [sqlite3_blob_open()] was zero),
+** this function returns [SQLITE_READONLY].
**
-** This function may only modify the contents of the blob; it is
-** not possible to increase the size of a blob using this API.
-** If offset iOffset is less than n bytes from the end of the blob,
-** [SQLITE_ERROR] is returned and no data is written. If n is
+** This function may only modify the contents of the BLOB; it is
+** not possible to increase the size of a BLOB using this API.
+** If offset iOffset is less than N bytes from the end of the BLOB,
+** [SQLITE_ERROR] is returned and no data is written. If N is
** less than zero [SQLITE_ERROR] is returned and no data is written.
+** The size of the BLOB (and hence the maximum value of N+iOffset)
+** can be determined using the [sqlite3_blob_bytes()] interface.
**
-** On success, SQLITE_OK is returned. Otherwise, an
-** [error code] or an [extended error code] is returned.
-**
-** INVARIANTS:
-**
-** {F17873} The [sqlite3_blob_write(P,Z,N,X)] interface writes N bytes
-** from buffer Z into
-** the blob that [sqlite3_blob] object P refers to
-** beginning at an offset of X into the blob.
-**
-** {F17875} The [sqlite3_blob_write(P,Z,N,X)] interface returns
-** [SQLITE_READONLY] if the [sqlite3_blob] object P was
-** [sqlite3_blob_open | opened] for reading only.
+** An attempt to write to an expired [BLOB handle] fails with an
+** error code of [SQLITE_ABORT]. Writes to the BLOB that occurred
+** before the [BLOB handle] expired are not rolled back by the
+** expiration of the handle, though of course those changes might
+** have been overwritten by the statement that expired the BLOB handle
+** or by other independent statements.
**
-** {F17876} In [sqlite3_blob_write(P,Z,N,X)] if the size of the blob
-** is less than N+X bytes, then the function returns [SQLITE_ERROR]
-** and nothing is written into the blob.
+** On success, SQLITE_OK is returned.
+** Otherwise, an [error code] or an [extended error code] is returned.
**
-** {F17879} In [sqlite3_blob_write(P,Z,N,X)] if X or N is less than zero
-** then the function returns [SQLITE_ERROR]
-** and nothing is written into the blob.
+** This routine only works on a [BLOB handle] which has been created
+** by a prior successful call to [sqlite3_blob_open()] and which has not
+** been closed by [sqlite3_blob_close()]. Passing any other pointer in
+** to this routine results in undefined and probably undesirable behavior.
**
-** {F17882} The [sqlite3_blob_write(P,Z,N,X)] interface returns [SQLITE_OK]
-** if N bytes where successfully written into blob.
+** See also: [sqlite3_blob_read()].
**
-** {F17885} If the requested write could not be completed,
-** the [sqlite3_blob_write(P,Z,N,X)] interface returns an
-** appropriate [error code] or [extended error code].
-**
-** {F17888} If an error occurs during evaluation of [sqlite3_blob_write(D,...)]
-** then subsequent calls to [sqlite3_errcode(D)],
-** [sqlite3_errmsg(D)], and [sqlite3_errmsg16(D)] will return
-** information approprate for that error.
+** Requirements:
+** [H17873] [H17874] [H17875] [H17876] [H17877] [H17879] [H17882] [H17885]
+** [H17888]
*/
-int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
+SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
/*
-** CAPI3REF: Virtual File System Objects {F11200}
+** CAPI3REF: Virtual File System Objects {H11200} <S20100>
**
** A virtual filesystem (VFS) is an [sqlite3_vfs] object
** that SQLite uses to interact
@@ -5343,12 +4696,11 @@ int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
** New VFSes can be registered and existing VFSes can be unregistered.
** The following interfaces are provided.
**
-** The sqlite3_vfs_find() interface returns a pointer to
-** a VFS given its name. Names are case sensitive.
+** The sqlite3_vfs_find() interface returns a pointer to a VFS given its name.
+** Names are case sensitive.
** Names are zero-terminated UTF-8 strings.
-** If there is no match, a NULL
-** pointer is returned. If zVfsName is NULL then the default
-** VFS is returned.
+** If there is no match, a NULL pointer is returned.
+** If zVfsName is NULL then the default VFS is returned.
**
** New VFSes are registered with sqlite3_vfs_register().
** Each new VFS becomes the default VFS if the makeDflt flag is set.
@@ -5358,51 +4710,27 @@ int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
** same name are registered, the behavior is undefined. If a
** VFS is registered with a name that is NULL or an empty string,
** then the behavior is undefined.
-**
+**
** Unregister a VFS with the sqlite3_vfs_unregister() interface.
** If the default VFS is unregistered, another VFS is chosen as
** the default. The choice for the new VFS is arbitrary.
**
-** INVARIANTS:
-**
-** {F11203} The [sqlite3_vfs_find(N)] interface returns a pointer to the
-** registered [sqlite3_vfs] object whose name exactly matches
-** the zero-terminated UTF-8 string N, or it returns NULL if
-** there is no match.
-**
-** {F11206} If the N parameter to [sqlite3_vfs_find(N)] is NULL then
-** the function returns a pointer to the default [sqlite3_vfs]
-** object if there is one, or NULL if there is no default
-** [sqlite3_vfs] object.
-**
-** {F11209} The [sqlite3_vfs_register(P,F)] interface registers the
-** well-formed [sqlite3_vfs] object P using the name given
-** by the zName field of the object.
-**
-** {F11212} Using the [sqlite3_vfs_register(P,F)] interface to register
-** the same [sqlite3_vfs] object multiple times is a harmless no-op.
-**
-** {F11215} The [sqlite3_vfs_register(P,F)] interface makes the
-** the [sqlite3_vfs] object P the default [sqlite3_vfs] object
-** if F is non-zero.
-**
-** {F11218} The [sqlite3_vfs_unregister(P)] interface unregisters the
-** [sqlite3_vfs] object P so that it is no longer returned by
-** subsequent calls to [sqlite3_vfs_find()].
+** Requirements:
+** [H11203] [H11206] [H11209] [H11212] [H11215] [H11218]
*/
-sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName);
-int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt);
-int sqlite3_vfs_unregister(sqlite3_vfs*);
+SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName);
+SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt);
+SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
/*
-** CAPI3REF: Mutexes {F17000}
+** CAPI3REF: Mutexes {H17000} <S20000>
**
** The SQLite core uses these routines for thread
-** synchronization. Though they are intended for internal
+** synchronization. Though they are intended for internal
** use by SQLite, code that links against SQLite is
** permitted to use any of these routines.
**
-** The SQLite source code contains multiple implementations
+** The SQLite source code contains multiple implementations
** of these mutex routines. An appropriate implementation
** is selected automatically at compile-time. The following
** implementations are available in the SQLite core:
@@ -5414,25 +4742,24 @@ int sqlite3_vfs_unregister(sqlite3_vfs*);
** <li> SQLITE_MUTEX_NOOP
** </ul>
**
-** The SQLITE_MUTEX_NOOP implementation is a set of routines
-** that does no real locking and is appropriate for use in
+** The SQLITE_MUTEX_NOOP implementation is a set of routines
+** that does no real locking and is appropriate for use in
** a single-threaded application. The SQLITE_MUTEX_OS2,
** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations
-** are appropriate for use on os/2, unix, and windows.
-**
+** are appropriate for use on OS/2, Unix, and Windows.
+**
** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor
** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex
-** implementation is included with the library. The
-** mutex interface routines defined here become external
-** references in the SQLite library for which implementations
-** must be provided by the application. This facility allows an
-** application that links against SQLite to provide its own mutex
-** implementation without having to modify the SQLite core.
-**
-** {F17011} The sqlite3_mutex_alloc() routine allocates a new
-** mutex and returns a pointer to it. {F17012} If it returns NULL
-** that means that a mutex could not be allocated. {F17013} SQLite
-** will unwind its stack and return an error. {F17014} The argument
+** implementation is included with the library. In this case the
+** application must supply a custom mutex implementation using the
+** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function
+** before calling sqlite3_initialize() or any other public sqlite3_
+** function that calls sqlite3_initialize().
+**
+** {H17011} The sqlite3_mutex_alloc() routine allocates a new
+** mutex and returns a pointer to it. {H17012} If it returns NULL
+** that means that a mutex could not be allocated. {H17013} SQLite
+** will unwind its stack and return an error. {H17014} The argument
** to sqlite3_mutex_alloc() is one of these integer constants:
**
** <ul>
@@ -5444,152 +4771,249 @@ int sqlite3_vfs_unregister(sqlite3_vfs*);
** <li> SQLITE_MUTEX_STATIC_PRNG
** <li> SQLITE_MUTEX_STATIC_LRU
** <li> SQLITE_MUTEX_STATIC_LRU2
-** </ul> {END}
+** </ul>
**
-** {F17015} The first two constants cause sqlite3_mutex_alloc() to create
+** {H17015} The first two constants cause sqlite3_mutex_alloc() to create
** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END}
** The mutex implementation does not need to make a distinction
** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
-** not want to. {F17016} But SQLite will only request a recursive mutex in
+** not want to. {H17016} But SQLite will only request a recursive mutex in
** cases where it really needs one. {END} If a faster non-recursive mutex
** implementation is available on the host platform, the mutex subsystem
** might return such a mutex in response to SQLITE_MUTEX_FAST.
**
-** {F17017} The other allowed parameters to sqlite3_mutex_alloc() each return
-** a pointer to a static preexisting mutex. {END} Four static mutexes are
+** {H17017} The other allowed parameters to sqlite3_mutex_alloc() each return
+** a pointer to a static preexisting mutex. {END} Six static mutexes are
** used by the current version of SQLite. Future versions of SQLite
** may add additional static mutexes. Static mutexes are for internal
** use by SQLite only. Applications that use SQLite mutexes should
** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
** SQLITE_MUTEX_RECURSIVE.
**
-** {F17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
+** {H17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
-** returns a different mutex on every call. {F17034} But for the static
+** returns a different mutex on every call. {H17034} But for the static
** mutex types, the same mutex is returned on every call that has
-** the same type number. {END}
+** the same type number.
**
-** {F17019} The sqlite3_mutex_free() routine deallocates a previously
-** allocated dynamic mutex. {F17020} SQLite is careful to deallocate every
-** dynamic mutex that it allocates. {U17021} The dynamic mutexes must not be in
-** use when they are deallocated. {U17022} Attempting to deallocate a static
-** mutex results in undefined behavior. {F17023} SQLite never deallocates
+** {H17019} The sqlite3_mutex_free() routine deallocates a previously
+** allocated dynamic mutex. {H17020} SQLite is careful to deallocate every
+** dynamic mutex that it allocates. {A17021} The dynamic mutexes must not be in
+** use when they are deallocated. {A17022} Attempting to deallocate a static
+** mutex results in undefined behavior. {H17023} SQLite never deallocates
** a static mutex. {END}
**
** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
-** to enter a mutex. {F17024} If another thread is already within the mutex,
+** to enter a mutex. {H17024} If another thread is already within the mutex,
** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
-** SQLITE_BUSY. {F17025} The sqlite3_mutex_try() interface returns SQLITE_OK
-** upon successful entry. {F17026} Mutexes created using
+** SQLITE_BUSY. {H17025} The sqlite3_mutex_try() interface returns [SQLITE_OK]
+** upon successful entry. {H17026} Mutexes created using
** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread.
-** {F17027} In such cases the,
+** {H17027} In such cases the,
** mutex must be exited an equal number of times before another thread
-** can enter. {U17028} If the same thread tries to enter any other
+** can enter. {A17028} If the same thread tries to enter any other
** kind of mutex more than once, the behavior is undefined.
-** {F17029} SQLite will never exhibit
-** such behavior in its own use of mutexes. {END}
+** {H17029} SQLite will never exhibit
+** such behavior in its own use of mutexes.
**
-** Some systems (ex: windows95) do not the operation implemented by
-** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will
-** always return SQLITE_BUSY. {F17030} The SQLite core only ever uses
-** sqlite3_mutex_try() as an optimization so this is acceptable behavior. {END}
+** Some systems (for example, Windows 95) do not support the operation
+** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try()
+** will always return SQLITE_BUSY. {H17030} The SQLite core only ever uses
+** sqlite3_mutex_try() as an optimization so this is acceptable behavior.
**
-** {F17031} The sqlite3_mutex_leave() routine exits a mutex that was
-** previously entered by the same thread. {U17032} The behavior
+** {H17031} The sqlite3_mutex_leave() routine exits a mutex that was
+** previously entered by the same thread. {A17032} The behavior
** is undefined if the mutex is not currently entered by the
-** calling thread or is not currently allocated. {F17033} SQLite will
+** calling thread or is not currently allocated. {H17033} SQLite will
** never do either. {END}
**
+** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
+** sqlite3_mutex_leave() is a NULL pointer, then all three routines
+** behave as no-ops.
+**
** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
*/
-sqlite3_mutex *sqlite3_mutex_alloc(int);
-void sqlite3_mutex_free(sqlite3_mutex*);
-void sqlite3_mutex_enter(sqlite3_mutex*);
-int sqlite3_mutex_try(sqlite3_mutex*);
-void sqlite3_mutex_leave(sqlite3_mutex*);
+SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int);
+SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*);
+SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*);
+SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*);
+SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*);
/*
-** CAPI3REF: Mutex Verifcation Routines {F17080}
+** CAPI3REF: Mutex Methods Object {H17120} <S20130>
+** EXPERIMENTAL
+**
+** An instance of this structure defines the low-level routines
+** used to allocate and use mutexes.
+**
+** Usually, the default mutex implementations provided by SQLite are
+** sufficient, however the user has the option of substituting a custom
+** implementation for specialized deployments or systems for which SQLite
+** does not provide a suitable implementation. In this case, the user
+** creates and populates an instance of this structure to pass
+** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option.
+** Additionally, an instance of this structure can be used as an
+** output variable when querying the system for the current mutex
+** implementation, using the [SQLITE_CONFIG_GETMUTEX] option.
+**
+** The xMutexInit method defined by this structure is invoked as
+** part of system initialization by the sqlite3_initialize() function.
+** {H17001} The xMutexInit routine shall be called by SQLite once for each
+** effective call to [sqlite3_initialize()].
+**
+** The xMutexEnd method defined by this structure is invoked as
+** part of system shutdown by the sqlite3_shutdown() function. The
+** implementation of this method is expected to release all outstanding
+** resources obtained by the mutex methods implementation, especially
+** those obtained by the xMutexInit method. {H17003} The xMutexEnd()
+** interface shall be invoked once for each call to [sqlite3_shutdown()].
+**
+** The remaining seven methods defined by this structure (xMutexAlloc,
+** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and
+** xMutexNotheld) implement the following interfaces (respectively):
+**
+** <ul>
+** <li> [sqlite3_mutex_alloc()] </li>
+** <li> [sqlite3_mutex_free()] </li>
+** <li> [sqlite3_mutex_enter()] </li>
+** <li> [sqlite3_mutex_try()] </li>
+** <li> [sqlite3_mutex_leave()] </li>
+** <li> [sqlite3_mutex_held()] </li>
+** <li> [sqlite3_mutex_notheld()] </li>
+** </ul>
+**
+** The only difference is that the public sqlite3_XXX functions enumerated
+** above silently ignore any invocations that pass a NULL pointer instead
+** of a valid mutex handle. The implementations of the methods defined
+** by this structure are not required to handle this case, the results
+** of passing a NULL pointer instead of a valid mutex handle are undefined
+** (i.e. it is acceptable to provide an implementation that segfaults if
+** it is passed a NULL pointer).
+**
+** The xMutexInit() method must be threadsafe. It must be harmless to
+** invoke xMutexInit() mutiple times within the same process and without
+** intervening calls to xMutexEnd(). Second and subsequent calls to
+** xMutexInit() must be no-ops.
+**
+** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()]
+** and its associates). Similarly, xMutexAlloc() must not use SQLite memory
+** allocation for a static mutex. However xMutexAlloc() may use SQLite
+** memory allocation for a fast or recursive mutex.
+**
+** SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is
+** called, but only if the prior call to xMutexInit returned SQLITE_OK.
+** If xMutexInit fails in any way, it is expected to clean up after itself
+** prior to returning.
+*/
+typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
+struct sqlite3_mutex_methods {
+ int (*xMutexInit)(void);
+ int (*xMutexEnd)(void);
+ sqlite3_mutex *(*xMutexAlloc)(int);
+ void (*xMutexFree)(sqlite3_mutex *);
+ void (*xMutexEnter)(sqlite3_mutex *);
+ int (*xMutexTry)(sqlite3_mutex *);
+ void (*xMutexLeave)(sqlite3_mutex *);
+ int (*xMutexHeld)(sqlite3_mutex *);
+ int (*xMutexNotheld)(sqlite3_mutex *);
+};
+
+/*
+** CAPI3REF: Mutex Verification Routines {H17080} <S20130> <S30800>
**
** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines
-** are intended for use inside assert() statements. {F17081} The SQLite core
+** are intended for use inside assert() statements. {H17081} The SQLite core
** never uses these routines except inside an assert() and applications
-** are advised to follow the lead of the core. {F17082} The core only
+** are advised to follow the lead of the core. {H17082} The core only
** provides implementations for these routines when it is compiled
-** with the SQLITE_DEBUG flag. {U17087} External mutex implementations
+** with the SQLITE_DEBUG flag. {A17087} External mutex implementations
** are only required to provide these routines if SQLITE_DEBUG is
** defined and if NDEBUG is not defined.
**
-** {F17083} These routines should return true if the mutex in their argument
-** is held or not held, respectively, by the calling thread. {END}
+** {H17083} These routines should return true if the mutex in their argument
+** is held or not held, respectively, by the calling thread.
**
** {X17084} The implementation is not required to provided versions of these
-** routines that actually work.
-** If the implementation does not provide working
-** versions of these routines, it should at least provide stubs
-** that always return true so that one does not get spurious
-** assertion failures. {END}
+** routines that actually work. If the implementation does not provide working
+** versions of these routines, it should at least provide stubs that always
+** return true so that one does not get spurious assertion failures.
**
-** {F17085} If the argument to sqlite3_mutex_held() is a NULL pointer then
+** {H17085} If the argument to sqlite3_mutex_held() is a NULL pointer then
** the routine should return 1. {END} This seems counter-intuitive since
** clearly the mutex cannot be held if it does not exist. But the
** the reason the mutex does not exist is because the build is not
** using mutexes. And we do not want the assert() containing the
** call to sqlite3_mutex_held() to fail, so a non-zero return is
-** the appropriate thing to do. {F17086} The sqlite3_mutex_notheld()
+** the appropriate thing to do. {H17086} The sqlite3_mutex_notheld()
** interface should also return 1 when given a NULL pointer.
*/
-int sqlite3_mutex_held(sqlite3_mutex*);
-int sqlite3_mutex_notheld(sqlite3_mutex*);
+SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*);
+SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
/*
-** CAPI3REF: Mutex Types {F17001}
+** CAPI3REF: Mutex Types {H17001} <H17000>
+**
+** The [sqlite3_mutex_alloc()] interface takes a single argument
+** which is one of these integer constants.
**
-** {F17002} The [sqlite3_mutex_alloc()] interface takes a single argument
-** which is one of these integer constants. {END}
+** The set of static mutexes may change from one SQLite release to the
+** next. Applications that override the built-in mutex logic must be
+** prepared to accommodate additional static mutexes.
*/
#define SQLITE_MUTEX_FAST 0
#define SQLITE_MUTEX_RECURSIVE 1
#define SQLITE_MUTEX_STATIC_MASTER 2
#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */
-#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */
+#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */
+#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */
#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */
#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */
#define SQLITE_MUTEX_STATIC_LRU2 7 /* lru page list */
/*
-** CAPI3REF: Low-Level Control Of Database Files {F11300}
+** CAPI3REF: Retrieve the mutex for a database connection {H17002} <H17000>
+**
+** This interface returns a pointer the [sqlite3_mutex] object that
+** serializes access to the [database connection] given in the argument
+** when the [threading mode] is Serialized.
+** If the [threading mode] is Single-thread or Multi-thread then this
+** routine returns a NULL pointer.
+*/
+SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
+
+/*
+** CAPI3REF: Low-Level Control Of Database Files {H11300} <S30800>
**
-** {F11301} The [sqlite3_file_control()] interface makes a direct call to the
+** {H11301} The [sqlite3_file_control()] interface makes a direct call to the
** xFileControl method for the [sqlite3_io_methods] object associated
-** with a particular database identified by the second argument. {F11302} The
+** with a particular database identified by the second argument. {H11302} The
** name of the database is the name assigned to the database by the
** <a href="lang_attach.html">ATTACH</a> SQL command that opened the
-** database. {F11303} To control the main database file, use the name "main"
-** or a NULL pointer. {F11304} The third and fourth parameters to this routine
+** database. {H11303} To control the main database file, use the name "main"
+** or a NULL pointer. {H11304} The third and fourth parameters to this routine
** are passed directly through to the second and third parameters of
-** the xFileControl method. {F11305} The return value of the xFileControl
+** the xFileControl method. {H11305} The return value of the xFileControl
** method becomes the return value of this routine.
**
-** {F11306} If the second parameter (zDbName) does not match the name of any
-** open database file, then SQLITE_ERROR is returned. {F11307} This error
+** {H11306} If the second parameter (zDbName) does not match the name of any
+** open database file, then SQLITE_ERROR is returned. {H11307} This error
** code is not remembered and will not be recalled by [sqlite3_errcode()]
-** or [sqlite3_errmsg()]. {U11308} The underlying xFileControl method might
-** also return SQLITE_ERROR. {U11309} There is no way to distinguish between
+** or [sqlite3_errmsg()]. {A11308} The underlying xFileControl method might
+** also return SQLITE_ERROR. {A11309} There is no way to distinguish between
** an incorrect zDbName and an SQLITE_ERROR return from the underlying
** xFileControl method. {END}
**
** See also: [SQLITE_FCNTL_LOCKSTATE]
*/
-int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
+SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
/*
-** CAPI3REF: Testing Interface {F11400}
+** CAPI3REF: Testing Interface {H11400} <S30800>
**
** The sqlite3_test_control() interface is used to read out internal
** state of SQLite and to inject faults into SQLite for testing
-** purposes. The first parameter a operation code that determines
+** purposes. The first parameter is an operation code that determines
** the number, meaning, and operation of all subsequent parameters.
**
** This interface is not for use by applications. It exists solely
@@ -5601,30 +5025,730 @@ int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
** Unlike most of the SQLite API, this function is not guaranteed to
** operate consistently from one release to the next.
*/
-int sqlite3_test_control(int op, ...);
+SQLITE_API int sqlite3_test_control(int op, ...);
/*
-** CAPI3REF: Testing Interface Operation Codes {F11410}
+** CAPI3REF: Testing Interface Operation Codes {H11410} <H11400>
**
** These constants are the valid operation code parameters used
** as the first argument to [sqlite3_test_control()].
**
-** These parameters and their meansing are subject to change
+** These parameters and their meanings are subject to change
** without notice. These values are for testing purposes only.
** Applications should not use any of these parameters or the
** [sqlite3_test_control()] interface.
*/
-#define SQLITE_TESTCTRL_FAULT_CONFIG 1
-#define SQLITE_TESTCTRL_FAULT_FAILURES 2
-#define SQLITE_TESTCTRL_FAULT_BENIGN_FAILURES 3
-#define SQLITE_TESTCTRL_FAULT_PENDING 4
#define SQLITE_TESTCTRL_PRNG_SAVE 5
#define SQLITE_TESTCTRL_PRNG_RESTORE 6
#define SQLITE_TESTCTRL_PRNG_RESET 7
#define SQLITE_TESTCTRL_BITVEC_TEST 8
+#define SQLITE_TESTCTRL_FAULT_INSTALL 9
+#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10
+#define SQLITE_TESTCTRL_PENDING_BYTE 11
+#define SQLITE_TESTCTRL_ASSERT 12
+#define SQLITE_TESTCTRL_ALWAYS 13
+#define SQLITE_TESTCTRL_RESERVE 14
+
+/*
+** CAPI3REF: SQLite Runtime Status {H17200} <S60200>
+** EXPERIMENTAL
+**
+** This interface is used to retrieve runtime status information
+** about the preformance of SQLite, and optionally to reset various
+** highwater marks. The first argument is an integer code for
+** the specific parameter to measure. Recognized integer codes
+** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].
+** The current value of the parameter is returned into *pCurrent.
+** The highest recorded value is returned in *pHighwater. If the
+** resetFlag is true, then the highest record value is reset after
+** *pHighwater is written. Some parameters do not record the highest
+** value. For those parameters
+** nothing is written into *pHighwater and the resetFlag is ignored.
+** Other parameters record only the highwater mark and not the current
+** value. For these latter parameters nothing is written into *pCurrent.
+**
+** This routine returns SQLITE_OK on success and a non-zero
+** [error code] on failure.
+**
+** This routine is threadsafe but is not atomic. This routine can be
+** called while other threads are running the same or different SQLite
+** interfaces. However the values returned in *pCurrent and
+** *pHighwater reflect the status of SQLite at different points in time
+** and it is possible that another thread might change the parameter
+** in between the times when *pCurrent and *pHighwater are written.
+**
+** See also: [sqlite3_db_status()]
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag);
/*
+** CAPI3REF: Status Parameters {H17250} <H17200>
+** EXPERIMENTAL
+**
+** These integer constants designate various run-time status parameters
+** that can be returned by [sqlite3_status()].
+**
+** <dl>
+** <dt>SQLITE_STATUS_MEMORY_USED</dt>
+** <dd>This parameter is the current amount of memory checked out
+** using [sqlite3_malloc()], either directly or indirectly. The
+** figure includes calls made to [sqlite3_malloc()] by the application
+** and internal memory usage by the SQLite library. Scratch memory
+** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache
+** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in
+** this parameter. The amount returned is the sum of the allocation
+** sizes as reported by the xSize method in [sqlite3_mem_methods].</dd>
+**
+** <dt>SQLITE_STATUS_MALLOC_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their
+** internal equivalents). Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_USED</dt>
+** <dd>This parameter returns the number of pages used out of the
+** [pagecache memory allocator] that was configured using
+** [SQLITE_CONFIG_PAGECACHE]. The
+** value returned is in pages, not in bytes.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_OVERFLOW</dt>
+** <dd>This parameter returns the number of bytes of page cache
+** allocation which could not be statisfied by the [SQLITE_CONFIG_PAGECACHE]
+** buffer and where forced to overflow to [sqlite3_malloc()]. The
+** returned value includes allocations that overflowed because they
+** where too large (they were larger than the "sz" parameter to
+** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because
+** no space was left in the page cache.</dd>
+**
+** <dt>SQLITE_STATUS_PAGECACHE_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [pagecache memory allocator]. Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_USED</dt>
+** <dd>This parameter returns the number of allocations used out of the
+** [scratch memory allocator] configured using
+** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not
+** in bytes. Since a single thread may only have one scratch allocation
+** outstanding at time, this parameter also reports the number of threads
+** using scratch memory at the same time.</dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_OVERFLOW</dt>
+** <dd>This parameter returns the number of bytes of scratch memory
+** allocation which could not be statisfied by the [SQLITE_CONFIG_SCRATCH]
+** buffer and where forced to overflow to [sqlite3_malloc()]. The values
+** returned include overflows because the requested allocation was too
+** larger (that is, because the requested allocation was larger than the
+** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer
+** slots were available.
+** </dd>
+**
+** <dt>SQLITE_STATUS_SCRATCH_SIZE</dt>
+** <dd>This parameter records the largest memory allocation request
+** handed to [scratch memory allocator]. Only the value returned in the
+** *pHighwater parameter to [sqlite3_status()] is of interest.
+** The value written into the *pCurrent parameter is undefined.</dd>
+**
+** <dt>SQLITE_STATUS_PARSER_STACK</dt>
+** <dd>This parameter records the deepest parser stack. It is only
+** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>
+** </dl>
+**
+** New status parameters may be added from time to time.
+*/
+#define SQLITE_STATUS_MEMORY_USED 0
+#define SQLITE_STATUS_PAGECACHE_USED 1
+#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2
+#define SQLITE_STATUS_SCRATCH_USED 3
+#define SQLITE_STATUS_SCRATCH_OVERFLOW 4
+#define SQLITE_STATUS_MALLOC_SIZE 5
+#define SQLITE_STATUS_PARSER_STACK 6
+#define SQLITE_STATUS_PAGECACHE_SIZE 7
+#define SQLITE_STATUS_SCRATCH_SIZE 8
+
+/*
+** CAPI3REF: Database Connection Status {H17500} <S60200>
+** EXPERIMENTAL
+**
+** This interface is used to retrieve runtime status information
+** about a single [database connection]. The first argument is the
+** database connection object to be interrogated. The second argument
+** is the parameter to interrogate. Currently, the only allowed value
+** for the second parameter is [SQLITE_DBSTATUS_LOOKASIDE_USED].
+** Additional options will likely appear in future releases of SQLite.
+**
+** The current value of the requested parameter is written into *pCur
+** and the highest instantaneous value is written into *pHiwtr. If
+** the resetFlg is true, then the highest instantaneous value is
+** reset back down to the current value.
+**
+** See also: [sqlite3_status()] and [sqlite3_stmt_status()].
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg);
+
+/*
+** CAPI3REF: Status Parameters for database connections {H17520} <H17500>
+** EXPERIMENTAL
+**
+** These constants are the available integer "verbs" that can be passed as
+** the second argument to the [sqlite3_db_status()] interface.
+**
+** New verbs may be added in future releases of SQLite. Existing verbs
+** might be discontinued. Applications should check the return code from
+** [sqlite3_db_status()] to make sure that the call worked.
+** The [sqlite3_db_status()] interface will return a non-zero error code
+** if a discontinued or unsupported verb is invoked.
+**
+** <dl>
+** <dt>SQLITE_DBSTATUS_LOOKASIDE_USED</dt>
+** <dd>This parameter returns the number of lookaside memory slots currently
+** checked out.</dd>
+** </dl>
+*/
+#define SQLITE_DBSTATUS_LOOKASIDE_USED 0
+
+
+/*
+** CAPI3REF: Prepared Statement Status {H17550} <S60200>
+** EXPERIMENTAL
+**
+** Each prepared statement maintains various
+** [SQLITE_STMTSTATUS_SORT | counters] that measure the number
+** of times it has performed specific operations. These counters can
+** be used to monitor the performance characteristics of the prepared
+** statements. For example, if the number of table steps greatly exceeds
+** the number of table searches or result rows, that would tend to indicate
+** that the prepared statement is using a full table scan rather than
+** an index.
+**
+** This interface is used to retrieve and reset counter values from
+** a [prepared statement]. The first argument is the prepared statement
+** object to be interrogated. The second argument
+** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter]
+** to be interrogated.
+** The current value of the requested counter is returned.
+** If the resetFlg is true, then the counter is reset to zero after this
+** interface call returns.
+**
+** See also: [sqlite3_status()] and [sqlite3_db_status()].
+*/
+SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
+
+/*
+** CAPI3REF: Status Parameters for prepared statements {H17570} <H17550>
+** EXPERIMENTAL
+**
+** These preprocessor macros define integer codes that name counter
+** values associated with the [sqlite3_stmt_status()] interface.
+** The meanings of the various counters are as follows:
+**
+** <dl>
+** <dt>SQLITE_STMTSTATUS_FULLSCAN_STEP</dt>
+** <dd>This is the number of times that SQLite has stepped forward in
+** a table as part of a full table scan. Large numbers for this counter
+** may indicate opportunities for performance improvement through
+** careful use of indices.</dd>
+**
+** <dt>SQLITE_STMTSTATUS_SORT</dt>
+** <dd>This is the number of sort operations that have occurred.
+** A non-zero value in this counter may indicate an opportunity to
+** improvement performance through careful use of indices.</dd>
+**
+** </dl>
+*/
+#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1
+#define SQLITE_STMTSTATUS_SORT 2
+
+/*
+** CAPI3REF: Custom Page Cache Object
+** EXPERIMENTAL
+**
+** The sqlite3_pcache type is opaque. It is implemented by
+** the pluggable module. The SQLite core has no knowledge of
+** its size or internal structure and never deals with the
+** sqlite3_pcache object except by holding and passing pointers
+** to the object.
+**
+** See [sqlite3_pcache_methods] for additional information.
+*/
+typedef struct sqlite3_pcache sqlite3_pcache;
+
+/*
+** CAPI3REF: Application Defined Page Cache.
+** KEYWORDS: {page cache}
+** EXPERIMENTAL
+**
+** The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can
+** register an alternative page cache implementation by passing in an
+** instance of the sqlite3_pcache_methods structure. The majority of the
+** heap memory used by SQLite is used by the page cache to cache data read
+** from, or ready to be written to, the database file. By implementing a
+** custom page cache using this API, an application can control more
+** precisely the amount of memory consumed by SQLite, the way in which
+** that memory is allocated and released, and the policies used to
+** determine exactly which parts of a database file are cached and for
+** how long.
+**
+** The contents of the sqlite3_pcache_methods structure are copied to an
+** internal buffer by SQLite within the call to [sqlite3_config]. Hence
+** the application may discard the parameter after the call to
+** [sqlite3_config()] returns.
+**
+** The xInit() method is called once for each call to [sqlite3_initialize()]
+** (usually only once during the lifetime of the process). It is passed
+** a copy of the sqlite3_pcache_methods.pArg value. It can be used to set
+** up global structures and mutexes required by the custom page cache
+** implementation.
+**
+** The xShutdown() method is called from within [sqlite3_shutdown()],
+** if the application invokes this API. It can be used to clean up
+** any outstanding resources before process shutdown, if required.
+**
+** SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes
+** the xInit method, so the xInit method need not be threadsafe. The
+** xShutdown method is only called from [sqlite3_shutdown()] so it does
+** not need to be threadsafe either. All other methods must be threadsafe
+** in multithreaded applications.
+**
+** SQLite will never invoke xInit() more than once without an intervening
+** call to xShutdown().
+**
+** The xCreate() method is used to construct a new cache instance. SQLite
+** will typically create one cache instance for each open database file,
+** though this is not guaranteed. The
+** first parameter, szPage, is the size in bytes of the pages that must
+** be allocated by the cache. szPage will not be a power of two. szPage
+** will the page size of the database file that is to be cached plus an
+** increment (here called "R") of about 100 or 200. SQLite will use the
+** extra R bytes on each page to store metadata about the underlying
+** database page on disk. The value of R depends
+** on the SQLite version, the target platform, and how SQLite was compiled.
+** R is constant for a particular build of SQLite. The second argument to
+** xCreate(), bPurgeable, is true if the cache being created will
+** be used to cache database pages of a file stored on disk, or
+** false if it is used for an in-memory database. The cache implementation
+** does not have to do anything special based with the value of bPurgeable;
+** it is purely advisory. On a cache where bPurgeable is false, SQLite will
+** never invoke xUnpin() except to deliberately delete a page.
+** In other words, a cache created with bPurgeable set to false will
+** never contain any unpinned pages.
+**
+** The xCachesize() method may be called at any time by SQLite to set the
+** suggested maximum cache-size (number of pages stored by) the cache
+** instance passed as the first argument. This is the value configured using
+** the SQLite "[PRAGMA cache_size]" command. As with the bPurgeable parameter,
+** the implementation is not required to do anything with this
+** value; it is advisory only.
+**
+** The xPagecount() method should return the number of pages currently
+** stored in the cache.
+**
+** The xFetch() method is used to fetch a page and return a pointer to it.
+** A 'page', in this context, is a buffer of szPage bytes aligned at an
+** 8-byte boundary. The page to be fetched is determined by the key. The
+** mimimum key value is 1. After it has been retrieved using xFetch, the page
+** is considered to be "pinned".
+**
+** If the requested page is already in the page cache, then the page cache
+** implementation must return a pointer to the page buffer with its content
+** intact. If the requested page is not already in the cache, then the
+** behavior of the cache implementation is determined by the value of the
+** createFlag parameter passed to xFetch, according to the following table:
+**
+** <table border=1 width=85% align=center>
+** <tr><th> createFlag <th> Behaviour when page is not already in cache
+** <tr><td> 0 <td> Do not allocate a new page. Return NULL.
+** <tr><td> 1 <td> Allocate a new page if it easy and convenient to do so.
+** Otherwise return NULL.
+** <tr><td> 2 <td> Make every effort to allocate a new page. Only return
+** NULL if allocating a new page is effectively impossible.
+** </table>
+**
+** SQLite will normally invoke xFetch() with a createFlag of 0 or 1. If
+** a call to xFetch() with createFlag==1 returns NULL, then SQLite will
+** attempt to unpin one or more cache pages by spilling the content of
+** pinned pages to disk and synching the operating system disk cache. After
+** attempting to unpin pages, the xFetch() method will be invoked again with
+** a createFlag of 2.
+**
+** xUnpin() is called by SQLite with a pointer to a currently pinned page
+** as its second argument. If the third parameter, discard, is non-zero,
+** then the page should be evicted from the cache. In this case SQLite
+** assumes that the next time the page is retrieved from the cache using
+** the xFetch() method, it will be zeroed. If the discard parameter is
+** zero, then the page is considered to be unpinned. The cache implementation
+** may choose to evict unpinned pages at any time.
+**
+** The cache is not required to perform any reference counting. A single
+** call to xUnpin() unpins the page regardless of the number of prior calls
+** to xFetch().
+**
+** The xRekey() method is used to change the key value associated with the
+** page passed as the second argument from oldKey to newKey. If the cache
+** previously contains an entry associated with newKey, it should be
+** discarded. Any prior cache entry associated with newKey is guaranteed not
+** to be pinned.
+**
+** When SQLite calls the xTruncate() method, the cache must discard all
+** existing cache entries with page numbers (keys) greater than or equal
+** to the value of the iLimit parameter passed to xTruncate(). If any
+** of these pages are pinned, they are implicitly unpinned, meaning that
+** they can be safely discarded.
+**
+** The xDestroy() method is used to delete a cache allocated by xCreate().
+** All resources associated with the specified cache should be freed. After
+** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*]
+** handle invalid, and will not use it with any other sqlite3_pcache_methods
+** functions.
+*/
+typedef struct sqlite3_pcache_methods sqlite3_pcache_methods;
+struct sqlite3_pcache_methods {
+ void *pArg;
+ int (*xInit)(void*);
+ void (*xShutdown)(void*);
+ sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable);
+ void (*xCachesize)(sqlite3_pcache*, int nCachesize);
+ int (*xPagecount)(sqlite3_pcache*);
+ void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag);
+ void (*xUnpin)(sqlite3_pcache*, void*, int discard);
+ void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey);
+ void (*xTruncate)(sqlite3_pcache*, unsigned iLimit);
+ void (*xDestroy)(sqlite3_pcache*);
+};
+
+/*
+** CAPI3REF: Online Backup Object
+** EXPERIMENTAL
+**
+** The sqlite3_backup object records state information about an ongoing
+** online backup operation. The sqlite3_backup object is created by
+** a call to [sqlite3_backup_init()] and is destroyed by a call to
+** [sqlite3_backup_finish()].
+**
+** See Also: [Using the SQLite Online Backup API]
+*/
+typedef struct sqlite3_backup sqlite3_backup;
+
+/*
+** CAPI3REF: Online Backup API.
+** EXPERIMENTAL
+**
+** This API is used to overwrite the contents of one database with that
+** of another. It is useful either for creating backups of databases or
+** for copying in-memory databases to or from persistent files.
+**
+** See Also: [Using the SQLite Online Backup API]
+**
+** Exclusive access is required to the destination database for the
+** duration of the operation. However the source database is only
+** read-locked while it is actually being read, it is not locked
+** continuously for the entire operation. Thus, the backup may be
+** performed on a live database without preventing other users from
+** writing to the database for an extended period of time.
+**
+** To perform a backup operation:
+** <ol>
+** <li><b>sqlite3_backup_init()</b> is called once to initialize the
+** backup,
+** <li><b>sqlite3_backup_step()</b> is called one or more times to transfer
+** the data between the two databases, and finally
+** <li><b>sqlite3_backup_finish()</b> is called to release all resources
+** associated with the backup operation.
+** </ol>
+** There should be exactly one call to sqlite3_backup_finish() for each
+** successful call to sqlite3_backup_init().
+**
+** <b>sqlite3_backup_init()</b>
+**
+** The first two arguments passed to [sqlite3_backup_init()] are the database
+** handle associated with the destination database and the database name
+** used to attach the destination database to the handle. The database name
+** is "main" for the main database, "temp" for the temporary database, or
+** the name specified as part of the [ATTACH] statement if the destination is
+** an attached database. The third and fourth arguments passed to
+** sqlite3_backup_init() identify the [database connection]
+** and database name used
+** to access the source database. The values passed for the source and
+** destination [database connection] parameters must not be the same.
+**
+** If an error occurs within sqlite3_backup_init(), then NULL is returned
+** and an error code and error message written into the [database connection]
+** passed as the first argument. They may be retrieved using the
+** [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] functions.
+** Otherwise, if successful, a pointer to an [sqlite3_backup] object is
+** returned. This pointer may be used with the sqlite3_backup_step() and
+** sqlite3_backup_finish() functions to perform the specified backup
+** operation.
+**
+** <b>sqlite3_backup_step()</b>
+**
+** Function [sqlite3_backup_step()] is used to copy up to nPage pages between
+** the source and destination databases, where nPage is the value of the
+** second parameter passed to sqlite3_backup_step(). If nPage is a negative
+** value, all remaining source pages are copied. If the required pages are
+** succesfully copied, but there are still more pages to copy before the
+** backup is complete, it returns [SQLITE_OK]. If no error occured and there
+** are no more pages to copy, then [SQLITE_DONE] is returned. If an error
+** occurs, then an SQLite error code is returned. As well as [SQLITE_OK] and
+** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY],
+** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code.
+**
+** As well as the case where the destination database file was opened for
+** read-only access, sqlite3_backup_step() may return [SQLITE_READONLY] if
+** the destination is an in-memory database with a different page size
+** from the source database.
+**
+** If sqlite3_backup_step() cannot obtain a required file-system lock, then
+** the [sqlite3_busy_handler | busy-handler function]
+** is invoked (if one is specified). If the
+** busy-handler returns non-zero before the lock is available, then
+** [SQLITE_BUSY] is returned to the caller. In this case the call to
+** sqlite3_backup_step() can be retried later. If the source
+** [database connection]
+** is being used to write to the source database when sqlite3_backup_step()
+** is called, then [SQLITE_LOCKED] is returned immediately. Again, in this
+** case the call to sqlite3_backup_step() can be retried later on. If
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or
+** [SQLITE_READONLY] is returned, then
+** there is no point in retrying the call to sqlite3_backup_step(). These
+** errors are considered fatal. At this point the application must accept
+** that the backup operation has failed and pass the backup operation handle
+** to the sqlite3_backup_finish() to release associated resources.
+**
+** Following the first call to sqlite3_backup_step(), an exclusive lock is
+** obtained on the destination file. It is not released until either
+** sqlite3_backup_finish() is called or the backup operation is complete
+** and sqlite3_backup_step() returns [SQLITE_DONE]. Additionally, each time
+** a call to sqlite3_backup_step() is made a [shared lock] is obtained on
+** the source database file. This lock is released before the
+** sqlite3_backup_step() call returns. Because the source database is not
+** locked between calls to sqlite3_backup_step(), it may be modified mid-way
+** through the backup procedure. If the source database is modified by an
+** external process or via a database connection other than the one being
+** used by the backup operation, then the backup will be transparently
+** restarted by the next call to sqlite3_backup_step(). If the source
+** database is modified by the using the same database connection as is used
+** by the backup operation, then the backup database is transparently
+** updated at the same time.
+**
+** <b>sqlite3_backup_finish()</b>
+**
+** Once sqlite3_backup_step() has returned [SQLITE_DONE], or when the
+** application wishes to abandon the backup operation, the [sqlite3_backup]
+** object should be passed to sqlite3_backup_finish(). This releases all
+** resources associated with the backup operation. If sqlite3_backup_step()
+** has not yet returned [SQLITE_DONE], then any active write-transaction on the
+** destination database is rolled back. The [sqlite3_backup] object is invalid
+** and may not be used following a call to sqlite3_backup_finish().
+**
+** The value returned by sqlite3_backup_finish is [SQLITE_OK] if no error
+** occurred, regardless or whether or not sqlite3_backup_step() was called
+** a sufficient number of times to complete the backup operation. Or, if
+** an out-of-memory condition or IO error occured during a call to
+** sqlite3_backup_step() then [SQLITE_NOMEM] or an
+** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] error code
+** is returned. In this case the error code and an error message are
+** written to the destination [database connection].
+**
+** A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() is
+** not a permanent error and does not affect the return value of
+** sqlite3_backup_finish().
+**
+** <b>sqlite3_backup_remaining(), sqlite3_backup_pagecount()</b>
+**
+** Each call to sqlite3_backup_step() sets two values stored internally
+** by an [sqlite3_backup] object. The number of pages still to be backed
+** up, which may be queried by sqlite3_backup_remaining(), and the total
+** number of pages in the source database file, which may be queried by
+** sqlite3_backup_pagecount().
+**
+** The values returned by these functions are only updated by
+** sqlite3_backup_step(). If the source database is modified during a backup
+** operation, then the values are not updated to account for any extra
+** pages that need to be updated or the size of the source database file
+** changing.
+**
+** <b>Concurrent Usage of Database Handles</b>
+**
+** The source [database connection] may be used by the application for other
+** purposes while a backup operation is underway or being initialized.
+** If SQLite is compiled and configured to support threadsafe database
+** connections, then the source database connection may be used concurrently
+** from within other threads.
+**
+** However, the application must guarantee that the destination database
+** connection handle is not passed to any other API (by any thread) after
+** sqlite3_backup_init() is called and before the corresponding call to
+** sqlite3_backup_finish(). Unfortunately SQLite does not currently check
+** for this, if the application does use the destination [database connection]
+** for some other purpose during a backup operation, things may appear to
+** work correctly but in fact be subtly malfunctioning. Use of the
+** destination database connection while a backup is in progress might
+** also cause a mutex deadlock.
+**
+** Furthermore, if running in [shared cache mode], the application must
+** guarantee that the shared cache used by the destination database
+** is not accessed while the backup is running. In practice this means
+** that the application must guarantee that the file-system file being
+** backed up to is not accessed by any connection within the process,
+** not just the specific connection that was passed to sqlite3_backup_init().
+**
+** The [sqlite3_backup] object itself is partially threadsafe. Multiple
+** threads may safely make multiple concurrent calls to sqlite3_backup_step().
+** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount()
+** APIs are not strictly speaking threadsafe. If they are invoked at the
+** same time as another thread is invoking sqlite3_backup_step() it is
+** possible that they return invalid values.
+*/
+SQLITE_API sqlite3_backup *sqlite3_backup_init(
+ sqlite3 *pDest, /* Destination database handle */
+ const char *zDestName, /* Destination database name */
+ sqlite3 *pSource, /* Source database handle */
+ const char *zSourceName /* Source database name */
+);
+SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage);
+SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p);
+SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p);
+SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p);
+
+/*
+** CAPI3REF: Unlock Notification
+** EXPERIMENTAL
+**
+** When running in shared-cache mode, a database operation may fail with
+** an [SQLITE_LOCKED] error if the required locks on the shared-cache or
+** individual tables within the shared-cache cannot be obtained. See
+** [SQLite Shared-Cache Mode] for a description of shared-cache locking.
+** This API may be used to register a callback that SQLite will invoke
+** when the connection currently holding the required lock relinquishes it.
+** This API is only available if the library was compiled with the
+** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined.
+**
+** See Also: [Using the SQLite Unlock Notification Feature].
+**
+** Shared-cache locks are released when a database connection concludes
+** its current transaction, either by committing it or rolling it back.
+**
+** When a connection (known as the blocked connection) fails to obtain a
+** shared-cache lock and SQLITE_LOCKED is returned to the caller, the
+** identity of the database connection (the blocking connection) that
+** has locked the required resource is stored internally. After an
+** application receives an SQLITE_LOCKED error, it may call the
+** sqlite3_unlock_notify() method with the blocked connection handle as
+** the first argument to register for a callback that will be invoked
+** when the blocking connections current transaction is concluded. The
+** callback is invoked from within the [sqlite3_step] or [sqlite3_close]
+** call that concludes the blocking connections transaction.
+**
+** If sqlite3_unlock_notify() is called in a multi-threaded application,
+** there is a chance that the blocking connection will have already
+** concluded its transaction by the time sqlite3_unlock_notify() is invoked.
+** If this happens, then the specified callback is invoked immediately,
+** from within the call to sqlite3_unlock_notify().
+**
+** If the blocked connection is attempting to obtain a write-lock on a
+** shared-cache table, and more than one other connection currently holds
+** a read-lock on the same table, then SQLite arbitrarily selects one of
+** the other connections to use as the blocking connection.
+**
+** There may be at most one unlock-notify callback registered by a
+** blocked connection. If sqlite3_unlock_notify() is called when the
+** blocked connection already has a registered unlock-notify callback,
+** then the new callback replaces the old. If sqlite3_unlock_notify() is
+** called with a NULL pointer as its second argument, then any existing
+** unlock-notify callback is cancelled. The blocked connections
+** unlock-notify callback may also be canceled by closing the blocked
+** connection using [sqlite3_close()].
+**
+** The unlock-notify callback is not reentrant. If an application invokes
+** any sqlite3_xxx API functions from within an unlock-notify callback, a
+** crash or deadlock may be the result.
+**
+** Unless deadlock is detected (see below), sqlite3_unlock_notify() always
+** returns SQLITE_OK.
+**
+** <b>Callback Invocation Details</b>
+**
+** When an unlock-notify callback is registered, the application provides a
+** single void* pointer that is passed to the callback when it is invoked.
+** However, the signature of the callback function allows SQLite to pass
+** it an array of void* context pointers. The first argument passed to
+** an unlock-notify callback is a pointer to an array of void* pointers,
+** and the second is the number of entries in the array.
+**
+** When a blocking connections transaction is concluded, there may be
+** more than one blocked connection that has registered for an unlock-notify
+** callback. If two or more such blocked connections have specified the
+** same callback function, then instead of invoking the callback function
+** multiple times, it is invoked once with the set of void* context pointers
+** specified by the blocked connections bundled together into an array.
+** This gives the application an opportunity to prioritize any actions
+** related to the set of unblocked database connections.
+**
+** <b>Deadlock Detection</b>
+**
+** Assuming that after registering for an unlock-notify callback a
+** database waits for the callback to be issued before taking any further
+** action (a reasonable assumption), then using this API may cause the
+** application to deadlock. For example, if connection X is waiting for
+** connection Y's transaction to be concluded, and similarly connection
+** Y is waiting on connection X's transaction, then neither connection
+** will proceed and the system may remain deadlocked indefinitely.
+**
+** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock
+** detection. If a given call to sqlite3_unlock_notify() would put the
+** system in a deadlocked state, then SQLITE_LOCKED is returned and no
+** unlock-notify callback is registered. The system is said to be in
+** a deadlocked state if connection A has registered for an unlock-notify
+** callback on the conclusion of connection B's transaction, and connection
+** B has itself registered for an unlock-notify callback when connection
+** A's transaction is concluded. Indirect deadlock is also detected, so
+** the system is also considered to be deadlocked if connection B has
+** registered for an unlock-notify callback on the conclusion of connection
+** C's transaction, where connection C is waiting on connection A. Any
+** number of levels of indirection are allowed.
+**
+** <b>The "DROP TABLE" Exception</b>
+**
+** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost
+** always appropriate to call sqlite3_unlock_notify(). There is however,
+** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement,
+** SQLite checks if there are any currently executing SELECT statements
+** that belong to the same connection. If there are, SQLITE_LOCKED is
+** returned. In this case there is no "blocking connection", so invoking
+** sqlite3_unlock_notify() results in the unlock-notify callback being
+** invoked immediately. If the application then re-attempts the "DROP TABLE"
+** or "DROP INDEX" query, an infinite loop might be the result.
+**
+** One way around this problem is to check the extended error code returned
+** by an sqlite3_step() call. If there is a blocking connection, then the
+** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in
+** the special "DROP TABLE/INDEX" case, the extended error code is just
+** SQLITE_LOCKED.
+*/
+SQLITE_API int sqlite3_unlock_notify(
+ sqlite3 *pBlocked, /* Waiting connection */
+ void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */
+ void *pNotifyArg /* Argument to pass to xNotify */
+);
+
+
+/*
+** CAPI3REF: String Comparison
+** EXPERIMENTAL
+**
+** The [sqlite3_strnicmp()] API allows applications and extensions to
+** compare the contents of two buffers containing UTF-8 strings in a
+** case-indendent fashion, using the same definition of case independence
+** that SQLite uses internally when comparing identifiers.
+*/
+SQLITE_API int sqlite3_strnicmp(const char *, const char *, int);
+
+/*
** Undo the hack that converts floating point types to integer for
** builds on processors without floating point support.
*/
@@ -5636,3 +5760,4 @@ int sqlite3_test_control(int op, ...);
} /* End of the 'extern "C"' block */
#endif
#endif
+
diff --git a/src/3rdparty/webkit/ChangeLog b/src/3rdparty/webkit/ChangeLog
index e2c1ef5..fb7dddf 100644
--- a/src/3rdparty/webkit/ChangeLog
+++ b/src/3rdparty/webkit/ChangeLog
@@ -1,3 +1,114 @@
+2009-10-18 Jan Michael Alonzo <jmalonzo@webkit.org>
+
+ Reviewed by Holger Freyther.
+
+ [GTK] Add MathML to the build system
+ https://bugs.webkit.org/show_bug.cgi?id=30487
+
+ Add --enable-mathml to configure.
+
+ * configure.ac:
+
+2009-10-15 Jan Michael Alonzo <jmalonzo@webkit.org>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] marshal stamp files are not cleaned after a distclean
+ https://bugs.webkit.org/show_bug.cgi?id=30156
+
+ Add the stamp files directly to cleanfiles. Also rearrange the
+ variable declarations so we don't miss any files that need to be
+ cleaned up during the clean targets.
+
+ * GNUmakefile.am:
+
+2009-10-15 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
+
+ Unreviewed. Help text fix - Web Sockets default is no, not yes.
+
+ * configure.ac:
+
+2009-10-12 Jan Michael Alonzo <jmalonzo@webkit.org>
+
+ Rubberstamped by Eric Seidel.
+
+ [Gtk] Fix icu CFLAG for Darwin
+ https://bugs.webkit.org/show_bug.cgi?id=29517
+
+ Don't escape the srcdir variable. Also use $host instead of the
+ os_foo variables.
+
+ * autotools/webkit.m4:
+
+2009-10-12 Jan Michael Alonzo <jmalonzo@webkit.org>
+
+ Reviewed by Gustavo Noronha.
+
+ [Gtk] Use the SQLite3 headers from WebKitLibraries if sqlite3 is undetected
+ https://bugs.webkit.org/show_bug.cgi?id=29518
+
+ * configure.ac:
+
+2009-10-05 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Disable TCmalloc for Windows port at the present, because MinGW
+ hasn't got built-in pthread library.
+
+ * WebKit.pri:
+
+2009-10-02 Prasanth Ullattil <prasanth.ullattil@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Disable a few more harmless MSVC warnings.
+
+ * WebKit.pri:
+
+2009-10-01 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Unreviewed, build fix.
+
+ [Qt] Symbian build break after r48976.
+ unix is set for Symbian in the Qt build system.
+
+ * WebKit.pri:
+
+2009-10-01 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Enable TCmalloc for the Linux, Mac and Windows Qt-port
+ https://bugs.webkit.org/show_bug.cgi?id=27029
+
+ Remove USE_SYSTEM_MALLOC for Linux, Mac and Windows Qt-port from WebKit.pri,
+ so these Qt-ports will use TCmalloc as other ports.
+
+ * WebKit.pri:
+
+2009-10-01 Martin Robinson <martin.james.robinson@gmail.com>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] GtkIMContext filtering interferes with DOM key events
+ https://bugs.webkit.org/show_bug.cgi?id=28733
+
+ Add new key event test ensuring that IME keypresses are handled.
+
+ * GNUmakefile.am:
+
+2009-10-01 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] data: uri support in media player
+ https://bugs.webkit.org/show_bug.cgi?id=29842
+
+ Check presence of gstreamer-pbutils-0.10.
+
+ * configure.ac:
+
2009-09-26 David Kilzer <ddkilzer@apple.com>
GTK BUILD FIX: add ENABLE_ORIENTATION_EVENTS support to configure.ac
diff --git a/src/3rdparty/webkit/JavaScriptCore/API/APICast.h b/src/3rdparty/webkit/JavaScriptCore/API/APICast.h
index b6d1532..b9167a8 100644
--- a/src/3rdparty/webkit/JavaScriptCore/API/APICast.h
+++ b/src/3rdparty/webkit/JavaScriptCore/API/APICast.h
@@ -27,6 +27,7 @@
#define APICast_h
#include "JSAPIValueWrapper.h"
+#include "JSGlobalObject.h"
#include "JSValue.h"
#include <wtf/Platform.h>
#include <wtf/UnusedParam.h>
@@ -118,6 +119,7 @@ inline JSContextRef toRef(JSC::ExecState* e)
inline JSGlobalContextRef toGlobalRef(JSC::ExecState* e)
{
+ ASSERT(e == e->lexicalGlobalObject()->globalExec());
return reinterpret_cast<JSGlobalContextRef>(e);
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h
index 202b119..c4bd7ad 100644
--- a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h
+++ b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackConstructor.h
@@ -41,9 +41,12 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | HasStandardGetOwnPropertySlot | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = ImplementsHasInstance | JSObject::StructureFlags;
+
private:
virtual ConstructType getConstructData(ConstructData&);
virtual const ClassInfo* classInfo() const { return &info; }
diff --git a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h
index 3a17fa2..0cf25c4 100644
--- a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h
+++ b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackFunction.h
@@ -41,7 +41,7 @@ public:
// refactor the code so this override isn't necessary
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
private:
diff --git a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h
index 86f2f32..d19890a 100644
--- a/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/API/JSCallbackObject.h
@@ -50,9 +50,12 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | OverridesHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | Base::StructureFlags;
+
private:
virtual UString className() const;
diff --git a/src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp b/src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp
index c358a84..e6626b7 100644
--- a/src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/API/JSContextRef.cpp
@@ -25,6 +25,7 @@
#include "config.h"
#include "JSContextRef.h"
+#include "JSContextRefPrivate.h"
#include "APICast.h"
#include "InitializeThreading.h"
@@ -152,3 +153,12 @@ JSContextGroupRef JSContextGetGroup(JSContextRef ctx)
ExecState* exec = toJS(ctx);
return toRef(&exec->globalData());
}
+
+JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx)
+{
+ ExecState* exec = toJS(ctx);
+ exec->globalData().heap.registerThread();
+ JSLock lock(exec);
+
+ return toGlobalRef(exec->lexicalGlobalObject()->globalExec());
+}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp b/src/3rdparty/webkit/JavaScriptCore/API/JSContextRefPrivate.h
index dc5c03b..ff014ec 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/API/JSContextRefPrivate.h
@@ -1,8 +1,5 @@
/*
- * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * All rights reserved.
+ * Copyright (C) 2009 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,45 +20,34 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "config.h"
-#include "ImageSource.h"
-#include "ImageDecoderQt.h"
-
-namespace WebCore {
+#ifndef JSContextRefPrivate_h
+#define JSContextRefPrivate_h
-NativeImagePtr ImageSource::createFrameAtIndex(size_t index)
-{
- return m_decoder ? m_decoder->imageAtIndex(index) : 0;
-}
+#include <JavaScriptCore/JSObjectRef.h>
+#include <JavaScriptCore/JSValueRef.h>
+#include <JavaScriptCore/WebKitAvailability.h>
-float ImageSource::frameDurationAtIndex(size_t index)
-{
- if (!m_decoder)
- return 0;
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
- // Many annoying ads specify a 0 duration to make an image flash as quickly
- // as possible. We follow WinIE's behavior and use a duration of 100 ms
- // for any frames that specify a duration of <= 50 ms. See
- // <http://bugs.webkit.org/show_bug.cgi?id=14413> or Radar 4051389 for
- // more.
- const float duration = m_decoder->duration(index) / 1000.0f;
- return (duration < 0.051f) ? 0.100f : duration;
-}
+#ifdef __cplusplus
+extern "C" {
+#endif
-bool ImageSource::frameHasAlphaAtIndex(size_t index)
-{
- return frameIsCompleteAtIndex(index) && m_decoder->supportsAlpha() &&
- m_decoder->imageAtIndex(index)->hasAlphaChannel();
-}
-
-bool ImageSource::frameIsCompleteAtIndex(size_t index)
-{
- return m_decoder && m_decoder->imageAtIndex(index);
-}
+/*!
+@function
+@abstract Gets the global context of a JavaScript execution context.
+@param ctx The JSContext whose global context you want to get.
+@result ctx's global context.
+*/
+JS_EXPORT JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx);
+#ifdef __cplusplus
}
+#endif
-// vim: ts=4 sw=4 et
+#endif /* JSContextRefPrivate_h */
diff --git a/src/3rdparty/webkit/JavaScriptCore/ChangeLog b/src/3rdparty/webkit/JavaScriptCore/ChangeLog
index 05f90b9..8d6c2df 100644
--- a/src/3rdparty/webkit/JavaScriptCore/ChangeLog
+++ b/src/3rdparty/webkit/JavaScriptCore/ChangeLog
@@ -1,17 +1,1180 @@
+2009-10-19 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Tightened up some put_by_id_transition code generation.
+ https://bugs.webkit.org/show_bug.cgi?id=30539
+
+ * jit/JIT.h:
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::testPrototype):
+ (JSC::JIT::privateCompilePutByIdTransition): No need to do object type
+ checks or read Structures and prototypes from objects: they're all known
+ constants at compile time.
+
+2009-10-19 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Added a private API for getting a global context from a context, for
+ clients who want to preserve a context for a later callback.
+
+ * API/APICast.h:
+ (toGlobalRef): Added an ASSERT, since this function is used more often
+ than before.
+
+ * API/JSContextRef.cpp:
+ * API/JSContextRefPrivate.h: Added. The new API.
+
+ * API/tests/testapi.c:
+ (print_callAsFunction):
+ (main): Test the new API.
+
+ * JavaScriptCore.exp:
+ * JavaScriptCore.xcodeproj/project.pbxproj: Build and export the new API.
+
+2009-10-17 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Tightened up some instanceof code generation.
+ https://bugs.webkit.org/show_bug.cgi?id=30488
+
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emit_op_instanceof):
+ (JSC::JIT::emitSlow_op_instanceof): No need to do object type checks -
+ cell type checks and ImplementsDefaultHasIntance checks implicitly
+ supersede object type checks.
+
+2009-10-18 Kwang Yul Seo <skyul@company100.net>
+
+ Reviewed by Darin Adler.
+
+ Use _stricmp and _strnicmp instead of deprecated stricmp and strnicmp.
+ https://bugs.webkit.org/show_bug.cgi?id=30474
+
+ stricmp and strnicmp are deprecated beginning in Visual
+ C++ 2005. Use _stricmp and _strnicmp instead in StringExtras.h.
+
+ * wtf/StringExtras.h:
+ (strncasecmp):
+ (strcasecmp):
+
+2009-10-16 Geoffrey Garen <ggaren@apple.com>
+
+ Build fix: apparently we shouldn't export those symbols?
+
+ * JavaScriptCore.exp:
+
+2009-10-16 Geoffrey Garen <ggaren@apple.com>
+
+ Build fix: export some symbols.
+
+ * JavaScriptCore.exp:
+
+2009-10-16 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ structure typeinfo flags should be inherited.
+ https://bugs.webkit.org/show_bug.cgi?id=30468
+
+ Add StructureFlag constant to the various JSC classes and use
+ it for the TypeInfo construction. This allows us to simply
+ accumulate flags by basing each classes StructureInfo on its parents.
+
+ * API/JSCallbackConstructor.h:
+ (JSC::JSCallbackConstructor::createStructure):
+ * API/JSCallbackFunction.h:
+ (JSC::JSCallbackFunction::createStructure):
+ * API/JSCallbackObject.h:
+ (JSC::JSCallbackObject::createStructure):
+ * debugger/DebuggerActivation.h:
+ (JSC::DebuggerActivation::createStructure):
+ * runtime/Arguments.h:
+ (JSC::Arguments::createStructure):
+ * runtime/BooleanObject.h:
+ (JSC::BooleanObject::createStructure):
+ * runtime/DatePrototype.h:
+ (JSC::DatePrototype::createStructure):
+ * runtime/FunctionPrototype.h:
+ (JSC::FunctionPrototype::createStructure):
+ * runtime/GlobalEvalFunction.h:
+ (JSC::GlobalEvalFunction::createStructure):
+ * runtime/InternalFunction.h:
+ (JSC::InternalFunction::createStructure):
+ * runtime/JSActivation.h:
+ (JSC::JSActivation::createStructure):
+ * runtime/JSArray.h:
+ (JSC::JSArray::createStructure):
+ * runtime/JSByteArray.cpp:
+ (JSC::JSByteArray::createStructure):
+ * runtime/JSByteArray.h:
+ * runtime/JSFunction.h:
+ (JSC::JSFunction::createStructure):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::createStructure):
+ * runtime/JSNotAnObject.h:
+ (JSC::JSNotAnObject::createStructure):
+ * runtime/JSONObject.h:
+ (JSC::JSONObject::createStructure):
+ * runtime/JSObject.h:
+ (JSC::JSObject::createStructure):
+ * runtime/JSStaticScopeObject.h:
+ (JSC::JSStaticScopeObject::createStructure):
+ * runtime/JSVariableObject.h:
+ (JSC::JSVariableObject::createStructure):
+ * runtime/JSWrapperObject.h:
+ (JSC::JSWrapperObject::createStructure):
+ * runtime/MathObject.h:
+ (JSC::MathObject::createStructure):
+ * runtime/NumberConstructor.h:
+ (JSC::NumberConstructor::createStructure):
+ * runtime/NumberObject.h:
+ (JSC::NumberObject::createStructure):
+ * runtime/RegExpConstructor.h:
+ (JSC::RegExpConstructor::createStructure):
+ * runtime/RegExpObject.h:
+ (JSC::RegExpObject::createStructure):
+ * runtime/StringObject.h:
+ (JSC::StringObject::createStructure):
+ * runtime/StringObjectThatMasqueradesAsUndefined.h:
+ (JSC::StringObjectThatMasqueradesAsUndefined::createStructure):
+
+2009-10-16 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Fast for-in enumeration: Cache JSPropertyNameIterator; cache JSStrings
+ in JSPropertyNameIterator; inline more code.
+
+ 1.024x as fast on SunSpider (fasta: 1.43x as fast).
+
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::dump):
+ * bytecode/Opcode.h:
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::emitGetPropertyNames):
+ (JSC::BytecodeGenerator::emitNextPropertyName):
+ * bytecompiler/BytecodeGenerator.h: Added a few extra operands to
+ op_get_pnames and op_next_pname so that we can track iteration state
+ in the register file instead of in the JSPropertyNameIterator. (To be
+ cacheable, the JSPropertyNameIterator must be stateless.)
+
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::tryCachePutByID):
+ (JSC::Interpreter::tryCacheGetByID): Updated for rename to
+ "normalizePrototypeChain" and removal of "isCacheable".
+
+ (JSC::Interpreter::privateExecute): Updated for in-RegisterFile
+ iteration state tracking.
+
+ * jit/JIT.cpp:
+ (JSC::JIT::privateCompileMainPass):
+ * jit/JIT.h:
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emit_op_get_pnames): Updated for in-RegisterFile
+ iteration state tracking.
+
+ (JSC::JIT::emit_op_next_pname): Inlined code generation for op_next_pname.
+
+ * jit/JITStubs.cpp:
+ (JSC::JITThunks::tryCachePutByID):
+ (JSC::JITThunks::tryCacheGetByID): Updated for rename to
+ "normalizePrototypeChain" and removal of "isCacheable".
+
+ (JSC::DEFINE_STUB_FUNCTION):
+ * jit/JITStubs.h:
+ (JSC::): Added has_property and to_object stubs. Removed op_next_pname
+ stub, since has_property is all we need anymore.
+
+ * parser/Nodes.cpp:
+ (JSC::ForInNode::emitBytecode): Updated for in-RegisterFile
+ iteration state tracking.
+
+ * runtime/JSCell.h:
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::getPropertyNames): Don't do caching at this layer
+ anymore, since we don't create a JSPropertyNameIterator at this layer.
+
+ * runtime/JSPropertyNameIterator.cpp:
+ (JSC::JSPropertyNameIterator::create): Do do caching at this layer.
+ (JSC::JSPropertyNameIterator::get): Updated for in-RegisterFile
+ iteration state tracking.
+ (JSC::JSPropertyNameIterator::markChildren): Mark our JSStrings.
+
+ * runtime/JSPropertyNameIterator.h:
+ (JSC::JSPropertyNameIterator::size):
+ (JSC::JSPropertyNameIterator::setCachedStructure):
+ (JSC::JSPropertyNameIterator::cachedStructure):
+ (JSC::JSPropertyNameIterator::setCachedPrototypeChain):
+ (JSC::JSPropertyNameIterator::cachedPrototypeChain):
+ (JSC::JSPropertyNameIterator::JSPropertyNameIterator):
+ (JSC::Structure::setEnumerationCache): Don't store iteration state in
+ a JSPropertyNameIterator. Do cache a JSPropertyNameIterator in a
+ Structure.
+
+ * runtime/JSValue.h:
+ (JSC::asCell):
+ * runtime/MarkStack.h: Make those mischievous #include gods happy.
+
+ * runtime/ObjectConstructor.cpp:
+
+ * runtime/Operations.h:
+ (JSC::normalizePrototypeChain): Renamed countPrototypeChainEntriesAndCheckForProxies
+ to normalizePrototypeChain, since it changes dictionary prototypes to
+ non-dictionary objects.
+
+ * runtime/PropertyNameArray.cpp:
+ (JSC::PropertyNameArray::add):
+ * runtime/PropertyNameArray.h:
+ (JSC::PropertyNameArrayData::PropertyNameArrayData):
+ (JSC::PropertyNameArray::data):
+ (JSC::PropertyNameArray::size):
+ (JSC::PropertyNameArray::begin):
+ (JSC::PropertyNameArray::end): Simplified some code here to help with
+ current and future refactoring.
+
+ * runtime/Protect.h:
+ * runtime/Structure.cpp:
+ (JSC::Structure::~Structure):
+ (JSC::Structure::addPropertyWithoutTransition):
+ (JSC::Structure::removePropertyWithoutTransition): No need to clear
+ the enumeration cache with adding / removing properties without
+ transition. It is an error to add / remove properties without transition
+ once an object has been observed, and we can ASSERT to catch that.
+
+ * runtime/Structure.h:
+ (JSC::Structure::enumerationCache): Changed the enumeration cache to
+ hold a JSPropertyNameIterator.
+
+ * runtime/StructureChain.cpp:
+ * runtime/StructureChain.h:
+ (JSC::StructureChain::head): Removed StructureChain::isCacheable because
+ it was wrong-headed in two ways: (1) It gave up when a prototype was a
+ dictionary, but instead we want un-dictionary heavily accessed
+ prototypes; (2) It folded a test for hasDefaultGetPropertyNames() into
+ a generic test for "cacheable-ness", but hasDefaultGetPropertyNames()
+ is only releavant to for-in caching.
+
+2009-10-16 Steve Falkenburg <sfalken@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Add a Debug_All configuration to build entire stack as debug.
+ Change Debug_Internal to:
+ - stop using _debug suffix for all WebKit/Safari binaries
+ - not use _debug as a DLL naming suffix
+ - use non-debug C runtime lib.
+
+ * JavaScriptCore.vcproj/JavaScriptCore.make: Debug build in makefile should build Debug_All.
+ * JavaScriptCore.vcproj/JavaScriptCore.sln: Add Debug_All configuration.
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add Debug_All configuration.
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: Renamed single configuration from "Release" to "all".
+ * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Add Debug_All configuration.
+ * JavaScriptCore.vcproj/WTF/WTF.vcproj: Add Debug_All configuration.
+ * JavaScriptCore.vcproj/jsc/jsc.vcproj: Add Debug_All configuration.
+ * JavaScriptCore.vcproj/testapi/testapi.vcproj: Add Debug_All configuration.
+
+2009-10-16 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Last part -- replace HasDefaultGetPropertyNames with OverridesGetPropertyNames
+ flag.
+
+ * API/JSCallbackConstructor.h:
+ (JSC::JSCallbackConstructor::createStructure):
+ * API/JSCallbackObject.h:
+ (JSC::JSCallbackObject::createStructure):
+ * debugger/DebuggerActivation.h:
+ (JSC::DebuggerActivation::createStructure):
+ * runtime/Arguments.h:
+ (JSC::Arguments::createStructure):
+ * runtime/BooleanObject.h:
+ (JSC::BooleanObject::createStructure):
+ * runtime/DatePrototype.h:
+ (JSC::DatePrototype::createStructure):
+ * runtime/FunctionPrototype.h:
+ (JSC::FunctionPrototype::createStructure):
+ * runtime/GlobalEvalFunction.h:
+ (JSC::GlobalEvalFunction::createStructure):
+ * runtime/JSAPIValueWrapper.h:
+ (JSC::JSAPIValueWrapper::createStructure):
+ * runtime/JSActivation.h:
+ (JSC::JSActivation::createStructure):
+ * runtime/JSArray.h:
+ (JSC::JSArray::createStructure):
+ * runtime/JSByteArray.cpp:
+ (JSC::JSByteArray::createStructure):
+ * runtime/JSFunction.h:
+ (JSC::JSFunction::createStructure):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::createStructure):
+ * runtime/JSNotAnObject.h:
+ (JSC::JSNotAnObject::createStructure):
+ * runtime/JSONObject.h:
+ (JSC::JSONObject::createStructure):
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::getPropertyNames):
+ * runtime/JSObject.h:
+ (JSC::JSObject::createStructure):
+ * runtime/JSStaticScopeObject.h:
+ (JSC::JSStaticScopeObject::createStructure):
+ * runtime/JSTypeInfo.h:
+ (JSC::TypeInfo::overridesGetPropertyNames):
+ * runtime/JSVariableObject.h:
+ (JSC::JSVariableObject::createStructure):
+ * runtime/JSWrapperObject.h:
+ (JSC::JSWrapperObject::createStructure):
+ * runtime/MathObject.h:
+ (JSC::MathObject::createStructure):
+ * runtime/NumberConstructor.h:
+ (JSC::NumberConstructor::createStructure):
+ * runtime/NumberObject.h:
+ (JSC::NumberObject::createStructure):
+ * runtime/RegExpConstructor.h:
+ (JSC::RegExpConstructor::createStructure):
+ * runtime/RegExpObject.h:
+ (JSC::RegExpObject::createStructure):
+ * runtime/StringObject.h:
+ (JSC::StringObject::createStructure):
+ * runtime/StringObjectThatMasqueradesAsUndefined.h:
+ (JSC::StringObjectThatMasqueradesAsUndefined::createStructure):
+ * runtime/StructureChain.cpp:
+ (JSC::StructureChain::isCacheable):
+
+2009-10-16 Kevin Ollivier <kevino@theolliviers.com>
+
+ wxMSW build fix, we can't use the simple hash there because the PlatformModuleVersion
+ structure differs.
+
+ * wtf/Platform.h:
+
+2009-10-16 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Implement ExecutableAllocator for Symbian
+ https://bugs.webkit.org/show_bug.cgi?id=29946
+
+ Tested with YARR JIT enabled for Symbian;
+ This patch does not (yet) enable YARR JIT by default.
+
+ * JavaScriptCore.pri:
+ * jit/ExecutableAllocator.h:
+ * jit/ExecutableAllocatorSymbian.cpp: Added.
+ (JSC::ExecutableAllocator::intializePageSize):
+ (JSC::ExecutablePool::systemAlloc):
+ (JSC::ExecutablePool::systemRelease):
+
+2009-10-15 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Part 2 -- Reverse the TypeInfo HasDefaultMark flag to OverridesMarkChildren, etc
+
+ * API/JSCallbackConstructor.h:
+ (JSC::JSCallbackConstructor::createStructure):
+ * API/JSCallbackFunction.h:
+ (JSC::JSCallbackFunction::createStructure):
+ * API/JSCallbackObject.h:
+ (JSC::JSCallbackObject::createStructure):
+ * debugger/DebuggerActivation.h:
+ (JSC::DebuggerActivation::createStructure):
+ * runtime/Arguments.h:
+ (JSC::Arguments::createStructure):
+ * runtime/BooleanObject.h:
+ (JSC::BooleanObject::createStructure):
+ * runtime/DatePrototype.h:
+ (JSC::DatePrototype::createStructure):
+ * runtime/FunctionPrototype.h:
+ (JSC::FunctionPrototype::createStructure):
+ * runtime/GetterSetter.h:
+ (JSC::GetterSetter::createStructure):
+ * runtime/GlobalEvalFunction.h:
+ (JSC::GlobalEvalFunction::createStructure):
+ * runtime/InternalFunction.h:
+ (JSC::InternalFunction::createStructure):
+ * runtime/JSAPIValueWrapper.h:
+ (JSC::JSAPIValueWrapper::createStructure):
+ * runtime/JSActivation.h:
+ (JSC::JSActivation::createStructure):
+ * runtime/JSArray.h:
+ (JSC::JSArray::createStructure):
+ (JSC::MarkStack::markChildren):
+ * runtime/JSByteArray.cpp:
+ (JSC::JSByteArray::createStructure):
+ * runtime/JSFunction.h:
+ (JSC::JSFunction::createStructure):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::createStructure):
+ * runtime/JSNotAnObject.h:
+ (JSC::JSNotAnObject::createStructure):
+ * runtime/JSNumberCell.h:
+ (JSC::JSNumberCell::createStructure):
+ * runtime/JSONObject.h:
+ (JSC::JSONObject::createStructure):
+ * runtime/JSObject.h:
+ (JSC::JSObject::createStructure):
+ * runtime/JSPropertyNameIterator.h:
+ (JSC::JSPropertyNameIterator::createStructure):
+ * runtime/JSStaticScopeObject.h:
+ (JSC::JSStaticScopeObject::createStructure):
+ * runtime/JSString.h:
+ (JSC::JSString::createStructure):
+ * runtime/JSTypeInfo.h:
+ (JSC::TypeInfo::overridesMarkChildren):
+ * runtime/JSVariableObject.h:
+ (JSC::JSVariableObject::createStructure):
+ * runtime/JSWrapperObject.h:
+ (JSC::JSWrapperObject::createStructure):
+ * runtime/MathObject.h:
+ (JSC::MathObject::createStructure):
+ * runtime/NumberConstructor.h:
+ (JSC::NumberConstructor::createStructure):
+ * runtime/NumberObject.h:
+ (JSC::NumberObject::createStructure):
+ * runtime/RegExpConstructor.h:
+ (JSC::RegExpConstructor::createStructure):
+ * runtime/RegExpObject.h:
+ (JSC::RegExpObject::createStructure):
+ * runtime/StringObject.h:
+ (JSC::StringObject::createStructure):
+ * runtime/StringObjectThatMasqueradesAsUndefined.h:
+ (JSC::StringObjectThatMasqueradesAsUndefined::createStructure):
+
+2009-10-14 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Geoff Garen.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Part 1. Reverse the HasStandardGetOwnPropertySlot flag.
+
+ * API/JSCallbackConstructor.h:
+ (JSC::JSCallbackConstructor::createStructure):
+ * API/JSCallbackFunction.h:
+ (JSC::JSCallbackFunction::createStructure):
+ * API/JSCallbackObject.h:
+ (JSC::JSCallbackObject::createStructure):
+ * debugger/DebuggerActivation.h:
+ (JSC::DebuggerActivation::createStructure):
+ * jit/JITStubs.cpp:
+ (JSC::DEFINE_STUB_FUNCTION):
+ * runtime/Arguments.h:
+ (JSC::Arguments::createStructure):
+ * runtime/BooleanObject.h:
+ (JSC::BooleanObject::createStructure):
+ * runtime/DatePrototype.h:
+ (JSC::DatePrototype::createStructure):
+ * runtime/FunctionPrototype.h:
+ (JSC::FunctionPrototype::createStructure):
+ * runtime/GlobalEvalFunction.h:
+ (JSC::GlobalEvalFunction::createStructure):
+ * runtime/InternalFunction.h:
+ (JSC::InternalFunction::createStructure):
+ * runtime/JSActivation.h:
+ (JSC::JSActivation::createStructure):
+ * runtime/JSArray.h:
+ (JSC::JSArray::createStructure):
+ * runtime/JSByteArray.cpp:
+ (JSC::JSByteArray::createStructure):
+ * runtime/JSFunction.h:
+ (JSC::JSFunction::createStructure):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::createStructure):
+ * runtime/JSNumberCell.h:
+ (JSC::JSNumberCell::createStructure):
+ * runtime/JSONObject.h:
+ (JSC::JSONObject::createStructure):
+ * runtime/JSObject.h:
+ (JSC::JSObject::createStructure):
+ (JSC::JSCell::fastGetOwnPropertySlot):
+ * runtime/JSStaticScopeObject.h:
+ (JSC::JSStaticScopeObject::createStructure):
+ * runtime/JSString.h:
+ (JSC::JSString::createStructure):
+ * runtime/JSTypeInfo.h:
+ (JSC::TypeInfo::overridesGetOwnPropertySlot):
+ * runtime/JSVariableObject.h:
+ (JSC::JSVariableObject::createStructure):
+ * runtime/JSWrapperObject.h:
+ (JSC::JSWrapperObject::createStructure):
+ * runtime/MathObject.h:
+ (JSC::MathObject::createStructure):
+ * runtime/NumberConstructor.h:
+ (JSC::NumberConstructor::createStructure):
+ * runtime/NumberObject.h:
+ (JSC::NumberObject::createStructure):
+ * runtime/RegExpConstructor.h:
+ (JSC::RegExpConstructor::createStructure):
+ * runtime/RegExpObject.h:
+ (JSC::RegExpObject::createStructure):
+ * runtime/StringObject.h:
+ (JSC::StringObject::createStructure):
+ * runtime/StringObjectThatMasqueradesAsUndefined.h:
+ (JSC::StringObjectThatMasqueradesAsUndefined::createStructure):
+
+2009-10-14 Kevin Ollivier <kevino@theolliviers.com>
+2009-10-14 Darin Adler <darin@apple.com>
+
+ Additions so fix for https://bugs.webkit.org/show_bug.cgi?id=18994
+ can build on Windows.
+
+ * wtf/MathExtras.h: Added llround and llroundf for Windows.
+
+2009-10-14 Kevin Ollivier <kevino@theolliviers.com>
+
+ wx build fix. Set ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH for plugins while we're still building stubs.
+
+ * wtf/Platform.h:
+
+2009-10-13 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Refactor ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH
+ https://bugs.webkit.org/show_bug.cgi?id=30278
+
+ Move the definition of ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH
+ from the make system into common code.
+
+ * wtf/Platform.h:
+
+2009-10-13 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Darin Adler.
+
+ ARM compiler does not understand reinterpret_cast<void*>
+ https://bugs.webkit.org/show_bug.cgi?id=29034
+
+ Change reinterpret_cast<void*> to regular C style (void*) cast
+ for the ARM RVCT compiler.
+
+ * assembler/MacroAssemblerCodeRef.h:
+ (JSC::FunctionPtr::FunctionPtr):
+ * jit/JITOpcodes.cpp: Cast to FunctionPtr first
+ instead of directly casting to reinterpret_cast
+ * jit/JITStubCall.h: Ditto + change the type of m_stub
+ from void* to FunctionPtr.
+ (JSC::JITStubCall::JITStubCall):
+ (JSC::JITStubCall::call):
+ * jit/JITStubs.cpp: Ditto.
+ (JSC::DEFINE_STUB_FUNCTION(EncodedJSValue, op_throw)):
+
+2009-10-11 Oliver Hunt <oliver@apple.com>
+
+ Re-enable the JIT.
+
+ * wtf/Platform.h:
+
+2009-10-10 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ Support for String.trim(), String.trimLeft() and String.trimRight() methods
+ https://bugs.webkit.org/show_bug.cgi?id=26590
+
+ Implement trim, trimLeft, and trimRight
+
+ * runtime/StringPrototype.cpp:
+ (JSC::isTrimWhitespace):
+ Our normal string whitespace function does not include U+200B which
+ is needed for compatibility with mozilla's implementation of trim.
+ U+200B does not appear to be expected according to spec, however I am
+ choosing to be lax, and match mozilla behavior so have added this
+ exception.
+ (JSC::trimString):
+
+2009-10-09 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Eliminated some legacy bytecode weirdness.
+
+ Use vPC[x] subscripting instead of ++vPC to access instruction operands.
+ This is simpler, and often more efficient.
+
+ To support this, and to remove use of hard-coded offsets in bytecode and
+ JIT code generation and dumping, calculate jump offsets from the beginning
+ of an instruction, rather than the middle or end.
+
+ Also, use OPCODE_LENGTH instead of hard-coded constants for the sizes of
+ opcodes.
+
+ SunSpider reports no change in JIT mode, and a 1.01x speedup in Interpreter
+ mode.
+
+ * bytecode/CodeBlock.cpp:
+ (JSC::printConditionalJump):
+ (JSC::CodeBlock::dump):
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::emitJump):
+ (JSC::BytecodeGenerator::emitJumpIfTrue):
+ (JSC::BytecodeGenerator::emitJumpIfFalse):
+ (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall):
+ (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply):
+ (JSC::BytecodeGenerator::emitComplexJumpScopes):
+ (JSC::BytecodeGenerator::emitJumpScopes):
+ (JSC::BytecodeGenerator::emitNextPropertyName):
+ (JSC::BytecodeGenerator::emitCatch):
+ (JSC::BytecodeGenerator::emitJumpSubroutine):
+ (JSC::prepareJumpTableForImmediateSwitch):
+ (JSC::prepareJumpTableForCharacterSwitch):
+ (JSC::prepareJumpTableForStringSwitch):
+ (JSC::BytecodeGenerator::endSwitch):
+ * bytecompiler/Label.h:
+ (JSC::Label::setLocation):
+ (JSC::Label::bind):
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::resolve):
+ (JSC::Interpreter::resolveSkip):
+ (JSC::Interpreter::resolveGlobal):
+ (JSC::Interpreter::resolveBase):
+ (JSC::Interpreter::resolveBaseAndProperty):
+ (JSC::Interpreter::createExceptionScope):
+ (JSC::Interpreter::privateExecute):
+ * interpreter/Interpreter.h:
+ * jit/JIT.cpp:
+ (JSC::JIT::privateCompile):
+ * jit/JITArithmetic.cpp:
+ (JSC::JIT::emit_op_jnless):
+ (JSC::JIT::emitSlow_op_jnless):
+ (JSC::JIT::emit_op_jnlesseq):
+ (JSC::JIT::emitSlow_op_jnlesseq):
+ (JSC::JIT::emitBinaryDoubleOp):
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emit_op_jmp):
+ (JSC::JIT::emit_op_loop):
+ (JSC::JIT::emit_op_loop_if_less):
+ (JSC::JIT::emitSlow_op_loop_if_less):
+ (JSC::JIT::emit_op_loop_if_lesseq):
+ (JSC::JIT::emitSlow_op_loop_if_lesseq):
+ (JSC::JIT::emit_op_loop_if_true):
+ (JSC::JIT::emitSlow_op_loop_if_true):
+ (JSC::JIT::emit_op_jfalse):
+ (JSC::JIT::emitSlow_op_jfalse):
+ (JSC::JIT::emit_op_jtrue):
+ (JSC::JIT::emitSlow_op_jtrue):
+ (JSC::JIT::emit_op_jeq_null):
+ (JSC::JIT::emit_op_jneq_null):
+ (JSC::JIT::emit_op_jneq_ptr):
+ (JSC::JIT::emit_op_jsr):
+ (JSC::JIT::emit_op_next_pname):
+ (JSC::JIT::emit_op_jmp_scopes):
+
+2009-10-09 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Migrated some code that didn't belong out of Structure.
+
+ SunSpider says maybe 1.03x faster.
+
+ * runtime/JSCell.h: Nixed Structure::markAggregate, and made marking of
+ a Structure's prototype the direct responsility of the object using it.
+ (Giving Structure a mark function was misleading because it implied that
+ all live structures get marked during GC, when they don't.)
+
+ * runtime/JSGlobalObject.cpp:
+ (JSC::markIfNeeded):
+ (JSC::JSGlobalObject::markChildren): Added code to mark prototypes stored
+ on the global object. Maybe this wasn't necessary, but now we don't have
+ to wonder.
+
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::getPropertyNames):
+ (JSC::JSObject::getOwnPropertyNames):
+ (JSC::JSObject::getEnumerableNamesFromClassInfoTable):
+ * runtime/JSObject.h:
+ (JSC::JSObject::markChildrenDirect):
+ * runtime/PropertyNameArray.h:
+ * runtime/Structure.cpp:
+ * runtime/Structure.h:
+ (JSC::Structure::setEnumerationCache):
+ (JSC::Structure::enumerationCache): Moved property name gathering code
+ from Structure to JSObject because having a Structure iterate its JSObject
+ was a layering violation. A JSObject is implemented using a Structure; not
+ the other way around.
+
+2009-10-09 Mark Rowe <mrowe@apple.com>
+
+ Attempt to fix the GTK release build.
+
+ * GNUmakefile.am: Include Grammar.cpp in release builds now that
+ AllInOneFile.cpp is gone.
+
+2009-10-09 Gabor Loki <loki@inf.u-szeged.hu>
+
+ Rubber-stamped by Eric Seidel.
+
+ Add ARM JIT support for Gtk port (disabled by default)
+ https://bugs.webkit.org/show_bug.cgi?id=30228
+
+ * GNUmakefile.am:
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Tiger build fix: added a few more variable initializations.
+
+ * runtime/StringPrototype.cpp:
+ (JSC::stringProtoFuncReplace):
+ (JSC::stringProtoFuncSearch):
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Qt build fix: added missing #include.
+
+ * jsc.cpp:
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Tiger build fix: initialize variable whose initialization the compiler
+ can't otherwise figure out.
+
+ * runtime/RegExpObject.cpp:
+ (JSC::RegExpObject::match):
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Windows build fix: updated exports.
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def:
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Tiger build fix: fixed file name case.
+
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ At long last, I pronounce the death of AllInOneFile.cpp.
+
+ SunSpider reports a 1.01x speedup.
+
+ * AllInOneFile.cpp: Removed.
+ * GNUmakefile.am:
+ * JavaScriptCore.exp:
+ * JavaScriptCore.gypi:
+ * JavaScriptCore.xcodeproj/project.pbxproj: Added missing project files
+ to compilation stages.
+
+ * parser/Grammar.y:
+ * parser/Lexer.cpp:
+ * parser/Lexer.h:
+ (JSC::jscyylex):
+ * runtime/ArrayConstructor.cpp:
+ (JSC::constructArrayWithSizeQuirk):
+ * runtime/Collector.h:
+ * runtime/JSCell.cpp:
+ (JSC::JSCell::operator new):
+ * runtime/JSCell.h:
+ (JSC::JSCell::operator new):
+ * runtime/JSGlobalObject.cpp:
+ (JSC::JSGlobalObject::operator new):
+ * runtime/JSNumberCell.h:
+ (JSC::JSNumberCell::operator new):
+ * runtime/JSString.cpp:
+ * runtime/JSString.h:
+ (JSC::jsString):
+ (JSC::jsSubstring):
+ (JSC::jsOwnedString):
+ * runtime/RegExpConstructor.cpp:
+ * runtime/RegExpConstructor.h:
+ (JSC::RegExpConstructorPrivate::RegExpConstructorPrivate):
+ (JSC::RegExpConstructorPrivate::lastOvector):
+ (JSC::RegExpConstructorPrivate::tempOvector):
+ (JSC::RegExpConstructorPrivate::changeLastOvector):
+ (JSC::RegExpConstructor::performMatch):
+ * runtime/StringPrototype.cpp:
+ (JSC::stringProtoFuncMatch):
+ * yarr/RegexJIT.cpp:
+ * yarr/RegexJIT.h:
+ (JSC::Yarr::executeRegex): Inlined a few things that Shark said
+ were hot, on the presumption that AllInOneFile.cpp used to inline them
+ automatically.
+
+2009-10-08 Zoltan Herczeg <zherczeg@inf.u-szeged.hu>
+
+ Reviewed by Gavin Barraclough.
+
+ Fix for JIT'ed op_call instructions (evals, constructs, etc.)
+ when !ENABLE(JIT_OPTIMIZE_CALL) && USE(JSVALUE32_64)
+
+ https://bugs.webkit.org/show_bug.cgi?id=30201
+
+ * jit/JITCall.cpp:
+ (JSC::JIT::compileOpCall):
+
+2009-10-07 Geoffrey Garen <ggaren@apple.com>
+
+ Windows build fix: removed no longer exported symbol.
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def:
+
+2009-10-07 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Fixed <rdar://problem/5751979> Database code takes JSLock on secondary
+ thread, permanently slowing down JavaScript
+
+ Removed the optional lock from Heap::protect, Heap::unprotect, and friends,
+ since WebCore no longer uses it.
+
+ * JavaScriptCore.exp:
+ * runtime/Collector.cpp:
+ (JSC::Heap::protect):
+ (JSC::Heap::unprotect):
+ (JSC::Heap::markProtectedObjects):
+ (JSC::Heap::protectedGlobalObjectCount):
+ (JSC::Heap::protectedObjectCount):
+ (JSC::Heap::protectedObjectTypeCounts):
+ * runtime/Collector.h:
+
+2009-10-07 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Allow custom memory allocation control for JavaScriptCore's IdentifierArena
+ https://bugs.webkit.org/show_bug.cgi?id=30158
+
+ Inherits IdentifierArena class from FastAllocBase because it has been
+ instantiated by 'new' in JavaScriptCore/parser/ParserArena.cpp:36.
+
+ * parser/ParserArena.h:
+
+2009-10-07 Adam Roben <aroben@apple.com>
+
+ Export DateInstance::info in a way that works on Windows
+
+ Fixes <http://webkit.org/b/30171>
+ fast/dom/Window/window-postmessage-clone.html fails on Windows
+
+ Reviewed by Anders Carlsson.
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def:
+ Removed the export of DateInstance::info from here.
+
+ * runtime/DateInstance.h: Use JS_EXPORTDATA to export
+ DateInstance::info, which is the required way of exporting data on
+ Windows.
+
+2009-10-07 Jørgen Lind <jorgen.lind@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ When enabling or disabling the JIT through .qmake.cache, make sure
+ to also toggle ENABLE_YARR_JIT.
+
+ * JavaScriptCore.pri:
+
+2009-10-06 Priit Laes <plaes@plaes.org>
+
+ Reviewed by Gavin Barraclough.
+
+ Linking fails with "relocation R_X86_64_PC32 against symbol
+ `cti_vm_throw'"
+ https://bugs.webkit.org/show_bug.cgi?id=28422
+
+ * jit/JITStubs.cpp:
+ Mark cti_vm_throw symbol as PLT-indirect symbol, so it doesn't end up
+ in text segment causing relocation errors on amd64 architecture.
+ Introduced new define SYMBOL_STRING_RELOCATION for such symbols.
+
+2009-10-06 Oliver Hunt <oliver@apple.com>
+
+ Windows linking fix
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def:
+
+2009-10-06 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by NOBODY (build fix).
+
+ Windows build fix.
+
+ * runtime/DateInstance.cpp:
+
+2009-10-05 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ It should be possible to post (clone) built-in JS objects to Workers
+ https://bugs.webkit.org/show_bug.cgi?id=22878
+
+ Expose helpers to throw correct exceptions during object graph walk
+ used for cloning and add a helper function to create Date instances
+ without going through the JS Date constructor function.
+
+ * JavaScriptCore.exp:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * runtime/DateInstance.cpp:
+ (JSC::DateInstance::DateInstance):
+ * runtime/DateInstance.h:
+ * runtime/ExceptionHelpers.cpp:
+ (JSC::createTypeError):
+ * runtime/ExceptionHelpers.h:
+
+2009-10-06 David Levin <levin@chromium.org>
+
+ Reviewed by Oliver Hunt.
+
+ StringImpl needs a method to get an instance for another thread which doesn't copy the underlying buffer.
+ https://bugs.webkit.org/show_bug.cgi?id=30095
+
+ * wtf/CrossThreadRefCounted.h:
+ Removed an unused function and assert improvement.
+ (WTF::CrossThreadRefCounted::isOwnedByCurrentThread): Moved out common code from asserts.
+ (WTF::CrossThreadRefCounted::ref): Changed assert to use the common method.
+ (WTF::CrossThreadRefCounted::deref): Changed assert to use the common method.
+ (WTF::CrossThreadRefCounted::crossThreadCopy): Since this includes a potentially
+ non-threadsafe operation, add an assert that the class is owned by the current thread.
+
+2009-10-05 Kevin Ollivier <kevino@theolliviers.com>
+
+ wx build fix. Add Symbian files to the list of excludes.
+
+ * wscript:
+
+2009-10-05 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Remove precompiled header from JavaScriptCore compilation to
+ prevent qmake warning during autonomous compilation.
+ https://bugs.webkit.org/show_bug.cgi?id=30069
+
+ * JavaScriptCore.pro:
+
+2009-10-02 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Removed the concept of a "fast access cutoff" in arrays, because it
+ punished some patterns of array access too much, and made things too
+ complex for inlining in some cases.
+
+ 1.3% speedup on SunSpider.
+
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emitSlow_op_get_by_val):
+ (JSC::JIT::emitSlow_op_put_by_val):
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emit_op_get_by_val):
+ (JSC::JIT::emitSlow_op_get_by_val):
+ (JSC::JIT::emit_op_put_by_val):
+ (JSC::JIT::emitSlow_op_put_by_val):
+ * jit/JITStubs.cpp:
+ * jit/JITStubs.h:
+ (JSC::): Check m_vectorLength instead of m_fastAccessCutoff when
+ getting / putting from / to an array. Inline putting past the end of
+ the array.
+
+ * runtime/JSArray.cpp:
+ (JSC::JSArray::JSArray):
+ (JSC::JSArray::getOwnPropertySlot):
+ (JSC::JSArray::getOwnPropertyDescriptor):
+ (JSC::JSArray::put):
+ (JSC::JSArray::putSlowCase):
+ (JSC::JSArray::deleteProperty):
+ (JSC::JSArray::getOwnPropertyNames):
+ (JSC::JSArray::increaseVectorLength):
+ (JSC::JSArray::setLength):
+ (JSC::JSArray::pop):
+ (JSC::JSArray::push):
+ (JSC::JSArray::sort):
+ (JSC::JSArray::fillArgList):
+ (JSC::JSArray::copyToRegisters):
+ (JSC::JSArray::compactForSorting):
+ (JSC::JSArray::checkConsistency):
+ * runtime/JSArray.h:
+ (JSC::JSArray::canGetIndex):
+ (JSC::JSArray::canSetIndex):
+ (JSC::JSArray::setIndex):
+ (JSC::JSArray::markChildrenDirect): Removed m_fastAccessCutoff, and
+ replaced with checks for JSValue() to detect reads and writes from / to
+ uninitialized parts of the array.
+
+2009-10-02 Jonni Rainisto <jonni.rainisto@nokia.com>
+
+ Reviewed by Darin Adler.
+
+ Math.random() gives too low values on Win32 when _CRT_RAND_S is not defined
+ https://bugs.webkit.org/show_bug.cgi?id=29956
+
+ * wtf/RandomNumber.cpp:
+ (WTF::randomNumber): Added PLATFORM(WIN_OS) to handle 15bit rand()
+
+2009-10-02 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Take one branch instead of two to test for JSValue().
+
+ 1.1% SunSpider speedup.
+
+ * jit/JITCall.cpp:
+ (JSC::JIT::compileOpCall):
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emit_op_to_jsnumber):
+ (JSC::JIT::emit_op_create_arguments):
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emitSlow_op_get_by_val):
+ (JSC::JIT::emit_op_put_by_val): Test for the empty value tag, instead
+ of testing for the cell tag with a 0 payload.
+
+ * runtime/JSValue.cpp:
+ (JSC::JSValue::description): Added support for dumping the new empty value,
+ and deleted values, in debug builds.
+
+ * runtime/JSValue.h:
+ (JSC::JSValue::JSValue()): Construct JSValue() with the empty value tag.
+
+ (JSC::JSValue::JSValue(JSCell*)): Convert null pointer to the empty value
+ tag, to avoid having two different c++ versions of null / empty.
+
+ (JSC::JSValue::operator bool): Test for the empty value tag, instead
+ of testing for the cell tag with a 0 payload.
+
+2009-10-02 Steve Falkenburg <sfalken@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ <https://bugs.webkit.org/show_bug.cgi?id=29989>
+ Safari version number shouldn't be exposed in WebKit code
+
+ For a WebKit version of 532.3.4:
+ Product version is: 5.32.3.4 (was 4.0.3.0)
+ File version is: 5.32.3.4 (was 4.532.3.4)
+
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.rc:
+
+2009-10-02 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Rubber-stamped by Simon Hausmann.
+
+ Fix the Qt on Mac OS X build.
+
+ * wtf/FastMalloc.cpp:
+
+2009-10-02 Jørgen Lind <jorgen.lind@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Allow enabling and disabling of the JIT through a qmake variable.
+
+ Qt's configure may set this variable through .qmake.cache if a
+ commandline option is given and/or the compile test for hwcap.h
+ failed/succeeded.
+
+ * JavaScriptCore.pri:
+
+2009-10-01 Mark Rowe <mrowe@apple.com>
+
+ Fix the Tiger build. Don't unconditionally enable 3D canvas as it is not supported on Tiger.
+
+ * Configurations/FeatureDefines.xcconfig:
+
+2009-10-01 Yongjun Zhang <yongjun.zhang@nokia.com>
+
+ Reviewed by Darin Adler.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29187
+
+ Don't inline ~ListRefPtr() to work around winscw compiler forward declaration
+ bug regarding templated classes.
+
+ The compiler bug is reported at:
+ https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812
+
+ The change will be reverted when the above bug is fixed in winscw compiler.
+
+ * wtf/ListRefPtr.h:
+ (WTF::::~ListRefPtr):
+
+2009-10-01 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Allow custom memory allocation control for the whole JavaScriptCore
+ https://bugs.webkit.org/show_bug.cgi?id=27029
+
+ Since in JavaScriptCore almost every class which has been instantiated by operator new is
+ inherited from FastAllocBase (bug #20422), we disable customizing global operator new for the Qt-port
+ when USE_SYSTEM_MALLOC=0.
+
+ Add #include <unistd.h> to FastMalloc.cpp because it's used by TCMalloc_PageHeap::scavengerThread().
+ (It's needed for the functionality of TCmalloc.)
+
+ Add TCSystemAlloc.cpp to JavaScriptCore.pri if USE_SYSTEM_MALLOC is disabled.
+
+ * JavaScriptCore.pri:
+ * wtf/FastMalloc.cpp:
+ (WTF::sleep):
+ * wtf/FastMalloc.h:
+
+2009-09-30 Gabor Loki <loki@inf.u-szeged.hu>
+
+ Reviewed by George Staikos.
+
+ Defines two pseudo-platforms for ARM and Thumb-2 instruction set.
+ https://bugs.webkit.org/show_bug.cgi?id=29122
+
+ Introduces WTF_PLATFORM_ARM_TRADITIONAL and WTF_PLATFORM_ARM_THUMB2
+ macros on ARM platforms. The PLATFORM(ARM_THUMB2) should be used
+ when Thumb-2 instruction set is the required target. The
+ PLATFORM(ARM_TRADITIONAL) is for generic ARM instruction set. In
+ case where the code is common the PLATFORM(ARM) have to be used.
+
+ Modified by George Wright <gwright@rim.com> to correctly work
+ with the RVCT-defined __TARGET_ARCH_ARM and __TARGET_ARCH_THUMB
+ compiler macros, as well as adding readability changes.
+
+ * wtf/Platform.h:
+
+2009-09-30 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Geoff Garen.
+
+ Devirtualise array toString conversion
+
+ Tweak the implementation of Array.prototype.toString to have a fast path
+ when acting on a true JSArray.
+
+ * runtime/ArrayPrototype.cpp:
+ (JSC::arrayProtoFuncToString):
+
2009-09-30 Csaba Osztrogonac <oszi@inf.u-szeged.hu>
- Reviewed by NOBODY (OOPS!).
+ Reviewed by Geoffrey Garen.
Buildfix for platforms using JSVALUE32.
https://bugs.webkit.org/show_bug.cgi?id=29915
After http://trac.webkit.org/changeset/48905 the build broke in JSVALUE32 case.
+ Also removed unreachable code.
* jit/JITArithmetic.cpp:
(JSC::JIT::emit_op_add):
- Declaration of "OperandTypes types" moved before first use.
- Typos fixed: dst modified to result, regT2 added.
- - Unnecessary code removed.
+ - Unreachable code removed.
(JSC::JIT::emitSlow_op_add):
- Missing declaration of "OperandTypes types" added.
diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi
index 15a0c0f..4b316c8 100644
--- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi
+++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.gypi
@@ -1,7 +1,6 @@
{
'variables': {
'javascriptcore_files': [
- 'AllInOneFile.cpp',
'API/APICast.h',
'API/JavaScript.h',
'API/JavaScriptCore.h',
@@ -19,6 +18,7 @@
'API/JSClassRef.h',
'API/JSContextRef.cpp',
'API/JSContextRef.h',
+ 'API/JSContextRefPrivate.h',
'API/JSObjectRef.cpp',
'API/JSObjectRef.h',
'API/JSProfilerPrivate.cpp',
diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri
index 2b08980..89c483e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri
+++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri
@@ -137,7 +137,8 @@ SOURCES += \
interpreter/RegisterFile.cpp
symbian {
- SOURCES += runtime/MarkStackSymbian.cpp
+ SOURCES += jit/ExecutableAllocatorSymbian.cpp \
+ runtime/MarkStackSymbian.cpp
} else {
win32-*|wince* {
SOURCES += jit/ExecutableAllocatorWin.cpp \
@@ -148,6 +149,10 @@ symbian {
}
}
+!contains(DEFINES, USE_SYSTEM_MALLOC) {
+ SOURCES += wtf/TCSystemAlloc.cpp
+}
+
# AllInOneFile.cpp helps gcc analize and optimize code
# Other compilers may be able to do this at link time
SOURCES += \
diff --git a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
index 0cd2e1a..a1affd4 100644
--- a/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
+++ b/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro
@@ -16,7 +16,6 @@ CONFIG(QTDIR_build) {
include($$QT_SOURCE_TREE/src/qbase.pri)
INSTALLS =
DESTDIR = $$OLDDESTDIR
- PRECOMPILED_HEADER = $$PWD/../WebKit/qt/WebKit_pch.h
DEFINES *= NDEBUG
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h b/src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
index 568260a..3681af8 100644
--- a/src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
+++ b/src/3rdparty/webkit/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
@@ -69,7 +69,13 @@ public:
template<typename FunctionType>
explicit FunctionPtr(FunctionType* value)
+#if COMPILER(RVCT)
+ // RVTC compiler needs C-style cast as it fails with the following error
+ // Error: #694: reinterpret_cast cannot cast away const or other type qualifiers
+ : m_value((void*)(value))
+#else
: m_value(reinterpret_cast<void*>(value))
+#endif
{
ASSERT_VALID_CODE_POINTER(m_value);
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp b/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp
index 6bac9b9..18ca2ae 100644
--- a/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -135,11 +135,6 @@ NEVER_INLINE static const char* debugHookName(int debugHookID)
return "";
}
-static int locationForOffset(const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator& it, int offset)
-{
- return it - begin + offset;
-}
-
static void printUnaryOp(int location, Vector<Instruction>::const_iterator& it, const char* op)
{
int r0 = (++it)->u.operand;
@@ -156,11 +151,11 @@ static void printBinaryOp(int location, Vector<Instruction>::const_iterator& it,
printf("[%4d] %s\t\t %s, %s, %s\n", location, op, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str());
}
-static void printConditionalJump(const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator& it, int location, const char* op)
+static void printConditionalJump(const Vector<Instruction>::const_iterator&, Vector<Instruction>::const_iterator& it, int location, const char* op)
{
int r0 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] %s\t\t %s, %d(->%d)\n", location, op, registerName(r0).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] %s\t\t %s, %d(->%d)\n", location, op, registerName(r0).c_str(), offset, location + offset);
}
static void printGetByIdOp(int location, Vector<Instruction>::const_iterator& it, const Vector<Identifier>& m_identifiers, const char* op)
@@ -852,12 +847,12 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
}
case op_jmp: {
int offset = (++it)->u.operand;
- printf("[%4d] jmp\t\t %d(->%d)\n", location, offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jmp\t\t %d(->%d)\n", location, offset, location + offset);
break;
}
case op_loop: {
int offset = (++it)->u.operand;
- printf("[%4d] loop\t\t %d(->%d)\n", location, offset, locationForOffset(begin, it, offset));
+ printf("[%4d] loop\t\t %d(->%d)\n", location, offset, location + offset);
break;
}
case op_jtrue: {
@@ -884,56 +879,56 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] jneq_ptr\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jneq_ptr\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, location + offset);
break;
}
case op_jnless: {
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] jnless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jnless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, location + offset);
break;
}
case op_jnlesseq: {
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] jnlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jnlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, location + offset);
break;
}
case op_loop_if_less: {
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] loop_if_less\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] loop_if_less\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, location + offset);
break;
}
case op_loop_if_lesseq: {
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] loop_if_lesseq\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] loop_if_lesseq\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, location + offset);
break;
}
case op_switch_imm: {
int tableIndex = (++it)->u.operand;
int defaultTarget = (++it)->u.operand;
int scrutineeRegister = (++it)->u.operand;
- printf("[%4d] switch_imm\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, locationForOffset(begin, it, defaultTarget), registerName(scrutineeRegister).c_str());
+ printf("[%4d] switch_imm\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).c_str());
break;
}
case op_switch_char: {
int tableIndex = (++it)->u.operand;
int defaultTarget = (++it)->u.operand;
int scrutineeRegister = (++it)->u.operand;
- printf("[%4d] switch_char\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, locationForOffset(begin, it, defaultTarget), registerName(scrutineeRegister).c_str());
+ printf("[%4d] switch_char\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).c_str());
break;
}
case op_switch_string: {
int tableIndex = (++it)->u.operand;
int defaultTarget = (++it)->u.operand;
int scrutineeRegister = (++it)->u.operand;
- printf("[%4d] switch_string\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, locationForOffset(begin, it, defaultTarget), registerName(scrutineeRegister).c_str());
+ printf("[%4d] switch_string\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).c_str());
break;
}
case op_new_func: {
@@ -1020,16 +1015,18 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
break;
}
case op_get_pnames: {
- int r0 = (++it)->u.operand;
- int r1 = (++it)->u.operand;
+ int r0 = it[0].u.operand;
+ int r1 = it[1].u.operand;
printf("[%4d] get_pnames\t %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str());
+ it += OPCODE_LENGTH(op_get_pnames) - 1;
break;
}
case op_next_pname: {
- int dest = (++it)->u.operand;
- int iter = (++it)->u.operand;
- int offset = (++it)->u.operand;
- printf("[%4d] next_pname\t %s, %s, %d(->%d)\n", location, registerName(dest).c_str(), registerName(iter).c_str(), offset, locationForOffset(begin, it, offset));
+ int dest = it[0].u.operand;
+ int iter = it[4].u.operand;
+ int offset = it[5].u.operand;
+ printf("[%4d] next_pname\t %s, %s, %d(->%d)\n", location, registerName(dest).c_str(), registerName(iter).c_str(), offset, location + offset);
+ it += OPCODE_LENGTH(op_next_pname) - 1;
break;
}
case op_push_scope: {
@@ -1051,7 +1048,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
case op_jmp_scopes: {
int scopeDelta = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] jmp_scopes\t^%d, %d(->%d)\n", location, scopeDelta, offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jmp_scopes\t^%d, %d(->%d)\n", location, scopeDelta, offset, location + offset);
break;
}
case op_catch: {
@@ -1074,7 +1071,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
case op_jsr: {
int retAddrDst = (++it)->u.operand;
int offset = (++it)->u.operand;
- printf("[%4d] jsr\t\t %s, %d(->%d)\n", location, registerName(retAddrDst).c_str(), offset, locationForOffset(begin, it, offset));
+ printf("[%4d] jsr\t\t %s, %d(->%d)\n", location, registerName(retAddrDst).c_str(), offset, location + offset);
break;
}
case op_sret: {
diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h b/src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h
index c9196ce..8968252 100644
--- a/src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h
+++ b/src/3rdparty/webkit/JavaScriptCore/bytecode/Opcode.h
@@ -152,8 +152,8 @@ namespace JSC {
macro(op_strcat, 4) \
macro(op_to_primitive, 3) \
\
- macro(op_get_pnames, 3) \
- macro(op_next_pname, 4) \
+ macro(op_get_pnames, 6) \
+ macro(op_next_pname, 7) \
\
macro(op_push_scope, 2) \
macro(op_pop_scope, 1) \
diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
index 8951ce3..41b5c39 100644
--- a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
@@ -608,8 +608,9 @@ void ALWAYS_INLINE BytecodeGenerator::rewindUnaryOp()
PassRefPtr<Label> BytecodeGenerator::emitJump(Label* target)
{
+ size_t begin = instructions().size();
emitOpcode(target->isForward() ? op_jmp : op_loop);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
@@ -624,10 +625,12 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfTrue(RegisterID* cond, Label* tar
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindBinaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_loop_if_less);
instructions().append(src1Index);
instructions().append(src2Index);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_lesseq && !target->isForward()) {
@@ -639,10 +642,12 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfTrue(RegisterID* cond, Label* tar
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindBinaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_loop_if_lesseq);
instructions().append(src1Index);
instructions().append(src2Index);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_eq_null && target->isForward()) {
@@ -653,9 +658,11 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfTrue(RegisterID* cond, Label* tar
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindUnaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jeq_null);
instructions().append(srcIndex);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_neq_null && target->isForward()) {
@@ -666,16 +673,20 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfTrue(RegisterID* cond, Label* tar
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindUnaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jneq_null);
instructions().append(srcIndex);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
}
+ size_t begin = instructions().size();
+
emitOpcode(target->isForward() ? op_jtrue : op_loop_if_true);
instructions().append(cond->index());
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
@@ -692,10 +703,12 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfFalse(RegisterID* cond, Label* ta
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindBinaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jnless);
instructions().append(src1Index);
instructions().append(src2Index);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_lesseq) {
@@ -707,10 +720,12 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfFalse(RegisterID* cond, Label* ta
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindBinaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jnlesseq);
instructions().append(src1Index);
instructions().append(src2Index);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_not) {
@@ -721,9 +736,11 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfFalse(RegisterID* cond, Label* ta
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindUnaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jtrue);
instructions().append(srcIndex);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_eq_null) {
@@ -734,9 +751,11 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfFalse(RegisterID* cond, Label* ta
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindUnaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jneq_null);
instructions().append(srcIndex);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
} else if (m_lastOpcodeID == op_neq_null) {
@@ -747,34 +766,41 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpIfFalse(RegisterID* cond, Label* ta
if (cond->index() == dstIndex && cond->isTemporary() && !cond->refCount()) {
rewindUnaryOp();
+
+ size_t begin = instructions().size();
emitOpcode(op_jeq_null);
instructions().append(srcIndex);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
}
+ size_t begin = instructions().size();
emitOpcode(op_jfalse);
instructions().append(cond->index());
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
PassRefPtr<Label> BytecodeGenerator::emitJumpIfNotFunctionCall(RegisterID* cond, Label* target)
{
+ size_t begin = instructions().size();
+
emitOpcode(op_jneq_ptr);
instructions().append(cond->index());
instructions().append(m_scopeChain->globalObject()->d()->callFunction);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
PassRefPtr<Label> BytecodeGenerator::emitJumpIfNotFunctionApply(RegisterID* cond, Label* target)
{
+ size_t begin = instructions().size();
+
emitOpcode(op_jneq_ptr);
instructions().append(cond->index());
instructions().append(m_scopeChain->globalObject()->d()->applyFunction);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
@@ -1718,6 +1744,8 @@ PassRefPtr<Label> BytecodeGenerator::emitComplexJumpScopes(Label* target, Contro
}
if (nNormalScopes) {
+ size_t begin = instructions().size();
+
// We need to remove a number of dynamic scopes to get to the next
// finally block
emitOpcode(op_jmp_scopes);
@@ -1726,14 +1754,14 @@ PassRefPtr<Label> BytecodeGenerator::emitComplexJumpScopes(Label* target, Contro
// If topScope == bottomScope then there isn't actually a finally block
// left to emit, so make the jmp_scopes jump directly to the target label
if (topScope == bottomScope) {
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
// Otherwise we just use jmp_scopes to pop a group of scopes and go
// to the next instruction
RefPtr<Label> nextInsn = newLabel();
- instructions().append(nextInsn->offsetFrom(instructions().size()));
+ instructions().append(nextInsn->bind(begin, instructions().size()));
emitLabel(nextInsn.get());
}
@@ -1758,27 +1786,47 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpScopes(Label* target, int targetSco
if (m_finallyDepth)
return emitComplexJumpScopes(target, &m_scopeContextStack.last(), &m_scopeContextStack.last() - scopeDelta);
+ size_t begin = instructions().size();
+
emitOpcode(op_jmp_scopes);
instructions().append(scopeDelta);
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return target;
}
-RegisterID* BytecodeGenerator::emitNextPropertyName(RegisterID* dst, RegisterID* iter, Label* target)
+RegisterID* BytecodeGenerator::emitGetPropertyNames(RegisterID* dst, RegisterID* base, RegisterID* i, RegisterID* size, Label* breakTarget)
+{
+ size_t begin = instructions().size();
+
+ emitOpcode(op_get_pnames);
+ instructions().append(dst->index());
+ instructions().append(base->index());
+ instructions().append(i->index());
+ instructions().append(size->index());
+ instructions().append(breakTarget->bind(begin, instructions().size()));
+ return dst;
+}
+
+RegisterID* BytecodeGenerator::emitNextPropertyName(RegisterID* dst, RegisterID* base, RegisterID* i, RegisterID* size, RegisterID* iter, Label* target)
{
+ size_t begin = instructions().size();
+
emitOpcode(op_next_pname);
instructions().append(dst->index());
+ instructions().append(base->index());
+ instructions().append(i->index());
+ instructions().append(size->index());
instructions().append(iter->index());
- instructions().append(target->offsetFrom(instructions().size()));
+ instructions().append(target->bind(begin, instructions().size()));
return dst;
}
RegisterID* BytecodeGenerator::emitCatch(RegisterID* targetRegister, Label* start, Label* end)
{
#if ENABLE(JIT)
- HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth, CodeLocationLabel() };
+ HandlerInfo info = { start->bind(0, 0), end->bind(0, 0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth, CodeLocationLabel() };
#else
- HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth };
+ HandlerInfo info = { start->bind(0, 0), end->bind(0, 0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth };
#endif
m_codeBlock->addExceptionHandler(info);
@@ -1798,9 +1846,11 @@ RegisterID* BytecodeGenerator::emitNewError(RegisterID* dst, ErrorType type, JSV
PassRefPtr<Label> BytecodeGenerator::emitJumpSubroutine(RegisterID* retAddrDst, Label* finally)
{
+ size_t begin = instructions().size();
+
emitOpcode(op_jsr);
instructions().append(retAddrDst->index());
- instructions().append(finally->offsetFrom(instructions().size()));
+ instructions().append(finally->bind(begin, instructions().size()));
emitLabel(newLabel().get()); // Record the fact that the next instruction is implicitly labeled, because op_sret will return to it.
return finally;
}
@@ -1870,7 +1920,7 @@ static void prepareJumpTableForImmediateSwitch(SimpleJumpTable& jumpTable, int32
// We're emitting this after the clause labels should have been fixed, so
// the labels should not be "forward" references
ASSERT(!labels[i]->isForward());
- jumpTable.add(keyForImmediateSwitch(nodes[i], min, max), labels[i]->offsetFrom(switchAddress));
+ jumpTable.add(keyForImmediateSwitch(nodes[i], min, max), labels[i]->bind(switchAddress, switchAddress + 3));
}
}
@@ -1896,7 +1946,7 @@ static void prepareJumpTableForCharacterSwitch(SimpleJumpTable& jumpTable, int32
// We're emitting this after the clause labels should have been fixed, so
// the labels should not be "forward" references
ASSERT(!labels[i]->isForward());
- jumpTable.add(keyForCharacterSwitch(nodes[i], min, max), labels[i]->offsetFrom(switchAddress));
+ jumpTable.add(keyForCharacterSwitch(nodes[i], min, max), labels[i]->bind(switchAddress, switchAddress + 3));
}
}
@@ -1910,7 +1960,7 @@ static void prepareJumpTableForStringSwitch(StringJumpTable& jumpTable, int32_t
ASSERT(nodes[i]->isString());
UString::Rep* clause = static_cast<StringNode*>(nodes[i])->value().ustring().rep();
OffsetLocation location;
- location.branchOffset = labels[i]->offsetFrom(switchAddress);
+ location.branchOffset = labels[i]->bind(switchAddress, switchAddress + 3);
jumpTable.offsetTable.add(clause, location);
}
}
@@ -1921,23 +1971,23 @@ void BytecodeGenerator::endSwitch(uint32_t clauseCount, RefPtr<Label>* labels, E
m_switchContextStack.removeLast();
if (switchInfo.switchType == SwitchInfo::SwitchImmediate) {
instructions()[switchInfo.bytecodeOffset + 1] = m_codeBlock->numberOfImmediateSwitchJumpTables();
- instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->offsetFrom(switchInfo.bytecodeOffset + 3);
+ instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->bind(switchInfo.bytecodeOffset, switchInfo.bytecodeOffset + 3);
SimpleJumpTable& jumpTable = m_codeBlock->addImmediateSwitchJumpTable();
- prepareJumpTableForImmediateSwitch(jumpTable, switchInfo.bytecodeOffset + 3, clauseCount, labels, nodes, min, max);
+ prepareJumpTableForImmediateSwitch(jumpTable, switchInfo.bytecodeOffset, clauseCount, labels, nodes, min, max);
} else if (switchInfo.switchType == SwitchInfo::SwitchCharacter) {
instructions()[switchInfo.bytecodeOffset + 1] = m_codeBlock->numberOfCharacterSwitchJumpTables();
- instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->offsetFrom(switchInfo.bytecodeOffset + 3);
+ instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->bind(switchInfo.bytecodeOffset, switchInfo.bytecodeOffset + 3);
SimpleJumpTable& jumpTable = m_codeBlock->addCharacterSwitchJumpTable();
- prepareJumpTableForCharacterSwitch(jumpTable, switchInfo.bytecodeOffset + 3, clauseCount, labels, nodes, min, max);
+ prepareJumpTableForCharacterSwitch(jumpTable, switchInfo.bytecodeOffset, clauseCount, labels, nodes, min, max);
} else {
ASSERT(switchInfo.switchType == SwitchInfo::SwitchString);
instructions()[switchInfo.bytecodeOffset + 1] = m_codeBlock->numberOfStringSwitchJumpTables();
- instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->offsetFrom(switchInfo.bytecodeOffset + 3);
+ instructions()[switchInfo.bytecodeOffset + 2] = defaultLabel->bind(switchInfo.bytecodeOffset, switchInfo.bytecodeOffset + 3);
StringJumpTable& jumpTable = m_codeBlock->addStringSwitchJumpTable();
- prepareJumpTableForStringSwitch(jumpTable, switchInfo.bytecodeOffset + 3, clauseCount, labels, nodes);
+ prepareJumpTableForStringSwitch(jumpTable, switchInfo.bytecodeOffset, clauseCount, labels, nodes);
}
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h
index 1a83ce9..61de173 100644
--- a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h
+++ b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/BytecodeGenerator.h
@@ -312,8 +312,8 @@ namespace JSC {
PassRefPtr<Label> emitJumpSubroutine(RegisterID* retAddrDst, Label*);
void emitSubroutineReturn(RegisterID* retAddrSrc);
- RegisterID* emitGetPropertyNames(RegisterID* dst, RegisterID* base) { return emitUnaryOp(op_get_pnames, dst, base); }
- RegisterID* emitNextPropertyName(RegisterID* dst, RegisterID* iter, Label* target);
+ RegisterID* emitGetPropertyNames(RegisterID* dst, RegisterID* base, RegisterID* i, RegisterID* size, Label* breakTarget);
+ RegisterID* emitNextPropertyName(RegisterID* dst, RegisterID* base, RegisterID* i, RegisterID* size, RegisterID* iter, Label* target);
RegisterID* emitCatch(RegisterID*, Label* start, Label* end);
void emitThrow(RegisterID* exc) { emitUnaryNoDstOp(op_throw, exc); }
diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/Label.h b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/Label.h
index 0b3d038..8cab1db 100644
--- a/src/3rdparty/webkit/JavaScriptCore/bytecompiler/Label.h
+++ b/src/3rdparty/webkit/JavaScriptCore/bytecompiler/Label.h
@@ -51,19 +51,17 @@ namespace JSC {
m_location = location;
unsigned size = m_unresolvedJumps.size();
- for (unsigned i = 0; i < size; ++i) {
- unsigned j = m_unresolvedJumps[i];
- m_codeBlock->instructions()[j].u.operand = m_location - j;
- }
+ for (unsigned i = 0; i < size; ++i)
+ m_codeBlock->instructions()[m_unresolvedJumps[i].second].u.operand = m_location - m_unresolvedJumps[i].first;
}
- int offsetFrom(int location) const
+ int bind(int opcode, int offset) const
{
if (m_location == invalidLocation) {
- m_unresolvedJumps.append(location);
+ m_unresolvedJumps.append(std::make_pair(opcode, offset));
return 0;
}
- return m_location - location;
+ return m_location - opcode;
}
void ref() { ++m_refCount; }
@@ -77,7 +75,7 @@ namespace JSC {
bool isForward() const { return m_location == invalidLocation; }
private:
- typedef Vector<int, 8> JumpVector;
+ typedef Vector<std::pair<int, int>, 8> JumpVector;
static const unsigned invalidLocation = UINT_MAX;
diff --git a/src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h b/src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h
index dd34265..63cf635 100644
--- a/src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h
+++ b/src/3rdparty/webkit/JavaScriptCore/debugger/DebuggerActivation.h
@@ -51,9 +51,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | JSObject::StructureFlags;
+
private:
JSActivation* m_activation;
};
diff --git a/src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp b/src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp
index 71451d6..5b1be71 100644
--- a/src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp
@@ -236,6 +236,7 @@
#include "JSObject.h"
#include "JSString.h"
+#include "Lexer.h"
#include "NodeConstructors.h"
#include "NodeInfo.h"
#include <stdlib.h>
@@ -257,7 +258,6 @@
#define YYERROR_VERBOSE
#endif
-int jscyylex(void* lvalp, void* llocp, void* globalPtr);
int jscyyerror(const char*);
static inline bool allowAutomaticSemicolon(JSC::Lexer&, int);
diff --git a/src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h b/src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h
index f912298..c8ff849 100644
--- a/src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h
+++ b/src/3rdparty/webkit/JavaScriptCore/generated/StringPrototype.lut.h
@@ -4,7 +4,7 @@
namespace JSC {
-static const struct HashTableValue stringTableValues[33] = {
+static const struct HashTableValue stringTableValues[36] = {
{ "toString", DontEnum|Function, (intptr_t)stringProtoFuncToString, (intptr_t)0 },
{ "valueOf", DontEnum|Function, (intptr_t)stringProtoFuncToString, (intptr_t)0 },
{ "charAt", DontEnum|Function, (intptr_t)stringProtoFuncCharAt, (intptr_t)1 },
@@ -37,9 +37,12 @@ static const struct HashTableValue stringTableValues[33] = {
{ "fontsize", DontEnum|Function, (intptr_t)stringProtoFuncFontsize, (intptr_t)1 },
{ "anchor", DontEnum|Function, (intptr_t)stringProtoFuncAnchor, (intptr_t)1 },
{ "link", DontEnum|Function, (intptr_t)stringProtoFuncLink, (intptr_t)1 },
+ { "trim", DontEnum|Function, (intptr_t)stringProtoFuncTrim, (intptr_t)0 },
+ { "trimLeft", DontEnum|Function, (intptr_t)stringProtoFuncTrimLeft, (intptr_t)0 },
+ { "trimRight", DontEnum|Function, (intptr_t)stringProtoFuncTrimRight, (intptr_t)0 },
{ 0, 0, 0, 0 }
};
extern JSC_CONST_HASHTABLE HashTable stringTable =
- { 71, 63, stringTableValues, 0 };
+ { 133, 127, stringTableValues, 0 };
} // namespace
diff --git a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
index 847b1fa..53964ad 100644
--- a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
@@ -91,8 +91,8 @@ static int depth(CodeBlock* codeBlock, ScopeChain& sc)
#if USE(INTERPRETER)
NEVER_INLINE bool Interpreter::resolve(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
{
- int dst = (vPC + 1)->u.operand;
- int property = (vPC + 2)->u.operand;
+ int dst = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
ScopeChainNode* scopeChain = callFrame->scopeChain();
ScopeChainIterator iter = scopeChain->begin();
@@ -121,9 +121,9 @@ NEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vP
{
CodeBlock* codeBlock = callFrame->codeBlock();
- int dst = (vPC + 1)->u.operand;
- int property = (vPC + 2)->u.operand;
- int skip = (vPC + 3)->u.operand + codeBlock->needsFullScopeChain();
+ int dst = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
+ int skip = vPC[3].u.operand + codeBlock->needsFullScopeChain();
ScopeChainNode* scopeChain = callFrame->scopeChain();
ScopeChainIterator iter = scopeChain->begin();
@@ -152,12 +152,12 @@ NEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vP
NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
{
- int dst = (vPC + 1)->u.operand;
- JSGlobalObject* globalObject = static_cast<JSGlobalObject*>((vPC + 2)->u.jsCell);
+ int dst = vPC[1].u.operand;
+ JSGlobalObject* globalObject = static_cast<JSGlobalObject*>(vPC[2].u.jsCell);
ASSERT(globalObject->isGlobalObject());
- int property = (vPC + 3)->u.operand;
- Structure* structure = (vPC + 4)->u.structure;
- int offset = (vPC + 5)->u.operand;
+ int property = vPC[3].u.operand;
+ Structure* structure = vPC[4].u.structure;
+ int offset = vPC[5].u.operand;
if (structure == globalObject->structure()) {
callFrame->r(dst) = JSValue(globalObject->getDirectOffset(offset));
@@ -192,16 +192,16 @@ NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction*
NEVER_INLINE void Interpreter::resolveBase(CallFrame* callFrame, Instruction* vPC)
{
- int dst = (vPC + 1)->u.operand;
- int property = (vPC + 2)->u.operand;
+ int dst = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
callFrame->r(dst) = JSValue(JSC::resolveBase(callFrame, callFrame->codeBlock()->identifier(property), callFrame->scopeChain()));
}
NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
{
- int baseDst = (vPC + 1)->u.operand;
- int propDst = (vPC + 2)->u.operand;
- int property = (vPC + 3)->u.operand;
+ int baseDst = vPC[1].u.operand;
+ int propDst = vPC[2].u.operand;
+ int property = vPC[3].u.operand;
ScopeChainNode* scopeChain = callFrame->scopeChain();
ScopeChainIterator iter = scopeChain->begin();
@@ -233,51 +233,6 @@ NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Inst
return false;
}
-NEVER_INLINE bool Interpreter::resolveBaseAndFunc(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
-{
- int baseDst = (vPC + 1)->u.operand;
- int funcDst = (vPC + 2)->u.operand;
- int property = (vPC + 3)->u.operand;
-
- ScopeChainNode* scopeChain = callFrame->scopeChain();
- ScopeChainIterator iter = scopeChain->begin();
- ScopeChainIterator end = scopeChain->end();
-
- // FIXME: add scopeDepthIsZero optimization
-
- ASSERT(iter != end);
-
- CodeBlock* codeBlock = callFrame->codeBlock();
- Identifier& ident = codeBlock->identifier(property);
- JSObject* base;
- do {
- base = *iter;
- PropertySlot slot(base);
- if (base->getPropertySlot(callFrame, ident, slot)) {
- // ECMA 11.2.3 says that if we hit an activation the this value should be null.
- // However, section 10.2.3 says that in the case where the value provided
- // by the caller is null, the global object should be used. It also says
- // that the section does not apply to internal functions, but for simplicity
- // of implementation we use the global object anyway here. This guarantees
- // that in host objects you always get a valid object for this.
- // We also handle wrapper substitution for the global object at the same time.
- JSObject* thisObj = base->toThisObject(callFrame);
- JSValue result = slot.getValue(callFrame, ident);
- exceptionValue = callFrame->globalData().exception;
- if (exceptionValue)
- return false;
-
- callFrame->r(baseDst) = JSValue(thisObj);
- callFrame->r(funcDst) = JSValue(result);
- return true;
- }
- ++iter;
- } while (iter != end);
-
- exceptionValue = createUndefinedVariableError(callFrame, ident, vPC - codeBlock->instructions().begin(), codeBlock);
- return false;
-}
-
#endif // USE(INTERPRETER)
ALWAYS_INLINE CallFrame* Interpreter::slideRegisterWindowForCall(CodeBlock* newCodeBlock, RegisterFile* registerFile, CallFrame* callFrame, size_t registerOffset, int argc)
@@ -928,10 +883,10 @@ NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHook
#if USE(INTERPRETER)
NEVER_INLINE ScopeChainNode* Interpreter::createExceptionScope(CallFrame* callFrame, const Instruction* vPC)
{
- int dst = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
CodeBlock* codeBlock = callFrame->codeBlock();
- Identifier& property = codeBlock->identifier((++vPC)->u.operand);
- JSValue value = callFrame->r((++vPC)->u.operand).jsValue();
+ Identifier& property = codeBlock->identifier(vPC[2].u.operand);
+ JSValue value = callFrame->r(vPC[3].u.operand).jsValue();
JSObject* scope = new (callFrame) JSStaticScopeObject(callFrame, property, value, DontDelete);
callFrame->r(dst) = JSValue(scope);
@@ -983,22 +938,20 @@ NEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock*
return;
}
- StructureChain* protoChain = structure->prototypeChain(callFrame);
- if (!protoChain->isCacheable()) {
- vPC[0] = getOpcode(op_put_by_id_generic);
- return;
- }
-
// Structure transition, cache transition info
if (slot.type() == PutPropertySlot::NewProperty) {
if (structure->isDictionary()) {
vPC[0] = getOpcode(op_put_by_id_generic);
return;
}
+
+ // put_by_id_transition checks the prototype chain for setters.
+ normalizePrototypeChain(callFrame, baseCell);
+
vPC[0] = getOpcode(op_put_by_id_transition);
vPC[4] = structure->previousID();
vPC[5] = structure;
- vPC[6] = protoChain;
+ vPC[6] = structure->prototypeChain(callFrame);
vPC[7] = slot.cachedOffset();
codeBlock->refStructures(vPC);
return;
@@ -1094,21 +1047,15 @@ NEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock*
return;
}
- size_t count = countPrototypeChainEntriesAndCheckForProxies(callFrame, baseValue, slot);
+ size_t count = normalizePrototypeChain(callFrame, baseValue, slot.slotBase());
if (!count) {
vPC[0] = getOpcode(op_get_by_id_generic);
return;
}
- StructureChain* protoChain = structure->prototypeChain(callFrame);
- if (!protoChain->isCacheable()) {
- vPC[0] = getOpcode(op_get_by_id_generic);
- return;
- }
-
vPC[0] = getOpcode(op_get_by_id_chain);
vPC[4] = structure;
- vPC[5] = protoChain;
+ vPC[5] = structure->prototypeChain(callFrame);
vPC[6] = count;
vPC[7] = slot.cachedOffset();
codeBlock->refStructures(vPC);
@@ -1213,10 +1160,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Constructs a new empty Object instance using the original
constructor, and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
callFrame->r(dst) = JSValue(constructEmptyObject(callFrame));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_object);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_new_array) {
@@ -1227,13 +1174,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
The array will contain argCount elements with values
taken from registers starting at register firstArg.
*/
- int dst = (++vPC)->u.operand;
- int firstArg = (++vPC)->u.operand;
- int argCount = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int firstArg = vPC[2].u.operand;
+ int argCount = vPC[3].u.operand;
ArgList args(callFrame->registers() + firstArg, argCount);
callFrame->r(dst) = JSValue(constructArray(callFrame, args));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_array);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_new_regexp) {
@@ -1243,11 +1190,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
constructor from regexp regExp, and puts the result in
register dst.
*/
- int dst = (++vPC)->u.operand;
- int regExp = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int regExp = vPC[2].u.operand;
callFrame->r(dst) = JSValue(new (globalData) RegExpObject(callFrame->scopeChain()->globalObject->regExpStructure(), callFrame->codeBlock()->regexp(regExp)));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_regexp);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_mov) {
@@ -1255,11 +1202,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Copies register src to register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = callFrame->r(src);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_mov);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_eq) {
@@ -1269,9 +1216,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
as with the ECMAScript '==' operator, and puts the result
as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32())
callFrame->r(dst) = jsBoolean(src1.asInt32() == src2.asInt32());
else {
@@ -1280,7 +1227,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_eq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_eq_null) {
@@ -1289,17 +1236,17 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Checks whether register src is null, as with the ECMAScript '!='
operator, and puts the result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
if (src.isUndefinedOrNull()) {
callFrame->r(dst) = jsBoolean(true);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_eq_null);
NEXT_INSTRUCTION();
}
callFrame->r(dst) = jsBoolean(src.isCell() && src.asCell()->structure()->typeInfo().masqueradesAsUndefined());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_eq_null);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_neq) {
@@ -1309,9 +1256,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
equal, as with the ECMAScript '!=' operator, and puts the
result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32())
callFrame->r(dst) = jsBoolean(src1.asInt32() != src2.asInt32());
else {
@@ -1320,7 +1267,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_neq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_neq_null) {
@@ -1329,17 +1276,17 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Checks whether register src is not null, as with the ECMAScript '!='
operator, and puts the result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
if (src.isUndefinedOrNull()) {
callFrame->r(dst) = jsBoolean(false);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_neq_null);
NEXT_INSTRUCTION();
}
callFrame->r(dst) = jsBoolean(!src.isCell() || !asCell(src)->structure()->typeInfo().masqueradesAsUndefined());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_neq_null);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_stricteq) {
@@ -1349,12 +1296,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
equal, as with the ECMAScript '===' operator, and puts the
result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
callFrame->r(dst) = jsBoolean(JSValue::strictEqual(src1, src2));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_stricteq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_nstricteq) {
@@ -1364,12 +1311,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
strictly equal, as with the ECMAScript '!==' operator, and
puts the result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
callFrame->r(dst) = jsBoolean(!JSValue::strictEqual(src1, src2));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_nstricteq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_less) {
@@ -1379,14 +1326,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
with the ECMAScript '<' operator, and puts the result as
a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
JSValue result = jsBoolean(jsLess(callFrame, src1, src2));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_less);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_lesseq) {
@@ -1396,14 +1343,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
register src2, as with the ECMAScript '<=' operator, and
puts the result as a boolean in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
JSValue result = jsBoolean(jsLessEq(callFrame, src1, src2));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_lesseq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_pre_inc) {
@@ -1412,7 +1359,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Converts register srcDst to number, adds one, and puts the result
back in register srcDst.
*/
- int srcDst = (++vPC)->u.operand;
+ int srcDst = vPC[1].u.operand;
JSValue v = callFrame->r(srcDst).jsValue();
if (v.isInt32() && v.asInt32() < INT_MAX)
callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() + 1);
@@ -1422,7 +1369,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(srcDst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_pre_inc);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_pre_dec) {
@@ -1431,7 +1378,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Converts register srcDst to number, subtracts one, and puts the result
back in register srcDst.
*/
- int srcDst = (++vPC)->u.operand;
+ int srcDst = vPC[1].u.operand;
JSValue v = callFrame->r(srcDst).jsValue();
if (v.isInt32() && v.asInt32() > INT_MIN)
callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() - 1);
@@ -1441,7 +1388,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(srcDst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_pre_dec);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_post_inc) {
@@ -1451,8 +1398,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
written to register dst, and the number plus one is written
back to register srcDst.
*/
- int dst = (++vPC)->u.operand;
- int srcDst = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int srcDst = vPC[2].u.operand;
JSValue v = callFrame->r(srcDst).jsValue();
if (v.isInt32() && v.asInt32() < INT_MAX) {
callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() + 1);
@@ -1464,7 +1411,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = number;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_post_inc);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_post_dec) {
@@ -1474,8 +1421,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
written to register dst, and the number minus one is written
back to register srcDst.
*/
- int dst = (++vPC)->u.operand;
- int srcDst = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int srcDst = vPC[2].u.operand;
JSValue v = callFrame->r(srcDst).jsValue();
if (v.isInt32() && v.asInt32() > INT_MIN) {
callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() - 1);
@@ -1487,7 +1434,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = number;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_post_dec);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_to_jsnumber) {
@@ -1496,8 +1443,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Converts register src to number, and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
JSValue srcVal = callFrame->r(src).jsValue();
@@ -1509,7 +1456,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_to_jsnumber);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_negate) {
@@ -1518,8 +1465,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Converts register src to number, negates it, and puts the
result in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
if (src.isInt32() && src.asInt32())
callFrame->r(dst) = jsNumber(callFrame, -src.asInt32());
else {
@@ -1528,7 +1475,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_negate);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_add) {
@@ -1538,9 +1485,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
in register dst. (JS add may be string concatenation or
numeric add, depending on the types of the operands.)
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() & 0xc0000000)) // no overflow
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() + src2.asInt32());
else {
@@ -1548,7 +1495,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_add);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_mul) {
@@ -1557,9 +1504,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Multiplies register src1 and register src2 (converted to
numbers), and puts the product in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() >> 15)) // no overflow
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() * src2.asInt32());
else {
@@ -1568,7 +1515,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_mul);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_div) {
@@ -1578,15 +1525,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
register divisor (converted to number), and puts the
quotient in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue dividend = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue divisor = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
JSValue result = jsNumber(callFrame, dividend.toNumber(callFrame) / divisor.toNumber(callFrame));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_div);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_mod) {
@@ -1596,15 +1543,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
register divisor (converted to number), and puts the
remainder in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue dividend = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue divisor = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
if (dividend.isInt32() && divisor.isInt32() && divisor.asInt32() != 0) {
JSValue result = jsNumber(callFrame, dividend.asInt32() % divisor.asInt32());
ASSERT(result);
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_mod);
NEXT_INSTRUCTION();
}
@@ -1615,7 +1562,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
JSValue result = jsNumber(callFrame, fmod(d1, d2));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_mod);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_sub) {
@@ -1625,9 +1572,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
src1 (converted to number), and puts the difference in
register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() & 0xc0000000)) // no overflow
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() - src2.asInt32());
else {
@@ -1635,7 +1582,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_sub);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_lshift) {
@@ -1645,9 +1592,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
register shift (converted to uint32), and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue val = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue shift = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
if (val.isInt32() && shift.isInt32())
callFrame->r(dst) = jsNumber(callFrame, val.asInt32() << (shift.asInt32() & 0x1f));
@@ -1657,7 +1604,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_lshift);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_rshift) {
@@ -1667,9 +1614,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
to int32) by register shift (converted to
uint32), and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue val = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue shift = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
if (val.isInt32() && shift.isInt32())
callFrame->r(dst) = jsNumber(callFrame, val.asInt32() >> (shift.asInt32() & 0x1f));
@@ -1679,7 +1626,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_rshift);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_urshift) {
@@ -1689,9 +1636,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
to uint32) by register shift (converted to
uint32), and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue val = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue shift = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
if (val.isUInt32() && shift.isInt32())
callFrame->r(dst) = jsNumber(callFrame, val.asInt32() >> (shift.asInt32() & 0x1f));
else {
@@ -1700,7 +1647,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_urshift);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_bitand) {
@@ -1710,9 +1657,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
and register src2 (converted to int32), and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32())
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() & src2.asInt32());
else {
@@ -1721,7 +1668,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_bitand);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_bitxor) {
@@ -1731,9 +1678,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
and register src2 (converted to int32), and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32())
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() ^ src2.asInt32());
else {
@@ -1742,7 +1689,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_bitxor);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_bitor) {
@@ -1752,9 +1699,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
and register src2 (converted to int32), and puts the
result in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
if (src1.isInt32() && src2.isInt32())
callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() | src2.asInt32());
else {
@@ -1763,7 +1710,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = result;
}
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_bitor);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_bitnot) {
@@ -1772,8 +1719,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Computes bitwise NOT of register src1 (converted to int32),
and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSValue src = callFrame->r((++vPC)->u.operand).jsValue();
+ int dst = vPC[1].u.operand;
+ JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
if (src.isInt32())
callFrame->r(dst) = jsNumber(callFrame, ~src.asInt32());
else {
@@ -1781,7 +1728,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_bitnot);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_not) {
@@ -1790,13 +1737,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Computes logical NOT of register src (converted to
boolean), and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
JSValue result = jsBoolean(!callFrame->r(src).jsValue().toBoolean(callFrame));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_not);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_instanceof) {
@@ -1826,7 +1773,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = jsBoolean(result);
- vPC += 5;
+ vPC += OPCODE_LENGTH(op_instanceof);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_typeof) {
@@ -1835,11 +1782,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Determines the type string for src according to ECMAScript
rules, and puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = JSValue(jsTypeStringForValue(callFrame, callFrame->r(src).jsValue()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_typeof);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_undefined) {
@@ -1849,12 +1796,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "undefined", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
JSValue v = callFrame->r(src).jsValue();
callFrame->r(dst) = jsBoolean(v.isCell() ? v.asCell()->structure()->typeInfo().masqueradesAsUndefined() : v.isUndefined());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_undefined);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_boolean) {
@@ -1864,11 +1811,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "boolean", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isBoolean());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_boolean);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_number) {
@@ -1878,11 +1825,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "number", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isNumber());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_number);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_string) {
@@ -1892,11 +1839,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "string", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isString());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_string);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_object) {
@@ -1906,11 +1853,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "object", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = jsBoolean(jsIsObjectType(callFrame->r(src).jsValue()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_object);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_is_function) {
@@ -1920,11 +1867,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
the ECMAScript rules is "function", and puts the result
in register dst.
*/
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = jsBoolean(jsIsFunctionType(callFrame->r(src).jsValue()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_is_function);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_in) {
@@ -1936,9 +1883,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Raises an exception if register constructor is not an
object.
*/
- int dst = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
- int base = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
+ int base = vPC[3].u.operand;
JSValue baseVal = callFrame->r(base).jsValue();
if (isInvalidParamForIn(callFrame, callFrame->codeBlock(), vPC, baseVal, exceptionValue))
@@ -1957,7 +1904,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = jsBoolean(baseObj->hasProperty(callFrame, property));
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_in);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_resolve) {
@@ -1970,7 +1917,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (UNLIKELY(!resolve(callFrame, vPC, exceptionValue)))
goto vm_throw;
- vPC += 3;
+ vPC += OPCODE_LENGTH(op_resolve);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_resolve_skip) {
@@ -1983,7 +1930,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (UNLIKELY(!resolveSkip(callFrame, vPC, exceptionValue)))
goto vm_throw;
- vPC += 4;
+ vPC += OPCODE_LENGTH(op_resolve_skip);
NEXT_INSTRUCTION();
}
@@ -1998,7 +1945,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (UNLIKELY(!resolveGlobal(callFrame, vPC, exceptionValue)))
goto vm_throw;
- vPC += 6;
+ vPC += OPCODE_LENGTH(op_resolve_global);
NEXT_INSTRUCTION();
}
@@ -2007,13 +1954,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Gets the global var at global slot index and places it in register dst.
*/
- int dst = (++vPC)->u.operand;
- JSGlobalObject* scope = static_cast<JSGlobalObject*>((++vPC)->u.jsCell);
+ int dst = vPC[1].u.operand;
+ JSGlobalObject* scope = static_cast<JSGlobalObject*>(vPC[2].u.jsCell);
ASSERT(scope->isGlobalObject());
- int index = (++vPC)->u.operand;
+ int index = vPC[3].u.operand;
callFrame->r(dst) = scope->registerAt(index);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_get_global_var);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_global_var) {
@@ -2021,13 +1968,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Puts value into global slot index.
*/
- JSGlobalObject* scope = static_cast<JSGlobalObject*>((++vPC)->u.jsCell);
+ JSGlobalObject* scope = static_cast<JSGlobalObject*>(vPC[1].u.jsCell);
ASSERT(scope->isGlobalObject());
- int index = (++vPC)->u.operand;
- int value = (++vPC)->u.operand;
+ int index = vPC[2].u.operand;
+ int value = vPC[3].u.operand;
scope->registerAt(index) = JSValue(callFrame->r(value).jsValue());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_global_var);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_scoped_var) {
@@ -2036,9 +1983,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Loads the contents of the index-th local from the scope skip nodes from
the top of the scope chain, and places it in register dst
*/
- int dst = (++vPC)->u.operand;
- int index = (++vPC)->u.operand;
- int skip = (++vPC)->u.operand + callFrame->codeBlock()->needsFullScopeChain();
+ int dst = vPC[1].u.operand;
+ int index = vPC[2].u.operand;
+ int skip = vPC[3].u.operand + callFrame->codeBlock()->needsFullScopeChain();
ScopeChainNode* scopeChain = callFrame->scopeChain();
ScopeChainIterator iter = scopeChain->begin();
@@ -2052,16 +1999,16 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT((*iter)->isVariableObject());
JSVariableObject* scope = static_cast<JSVariableObject*>(*iter);
callFrame->r(dst) = scope->registerAt(index);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_get_scoped_var);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_scoped_var) {
/* put_scoped_var index(n) skip(n) value(r)
*/
- int index = (++vPC)->u.operand;
- int skip = (++vPC)->u.operand + callFrame->codeBlock()->needsFullScopeChain();
- int value = (++vPC)->u.operand;
+ int index = vPC[1].u.operand;
+ int skip = vPC[2].u.operand + callFrame->codeBlock()->needsFullScopeChain();
+ int value = vPC[3].u.operand;
ScopeChainNode* scopeChain = callFrame->scopeChain();
ScopeChainIterator iter = scopeChain->begin();
@@ -2075,7 +2022,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT((*iter)->isVariableObject());
JSVariableObject* scope = static_cast<JSVariableObject*>(*iter);
scope->registerAt(index) = JSValue(callFrame->r(value).jsValue());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_scoped_var);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_resolve_base) {
@@ -2088,7 +2035,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
*/
resolveBase(callFrame, vPC);
- vPC += 3;
+ vPC += OPCODE_LENGTH(op_resolve_base);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_resolve_with_base) {
@@ -2106,7 +2053,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (UNLIKELY(!resolveBaseAndProperty(callFrame, vPC, exceptionValue)))
goto vm_throw;
- vPC += 4;
+ vPC += OPCODE_LENGTH(op_resolve_with_base);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_by_id) {
@@ -2129,7 +2076,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
tryCacheGetByID(callFrame, codeBlock, vPC, baseValue, ident, slot);
callFrame->r(dst) = result;
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_by_id_self) {
@@ -2155,7 +2102,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
callFrame->r(dst) = JSValue(baseObject->getDirectOffset(offset));
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_self);
NEXT_INSTRUCTION();
}
}
@@ -2189,7 +2136,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(protoObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset));
callFrame->r(dst) = JSValue(protoObject->getDirectOffset(offset));
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_proto);
NEXT_INSTRUCTION();
}
}
@@ -2202,14 +2149,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
// Polymorphic self access caching currently only supported when JITting.
ASSERT_NOT_REACHED();
// This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_self_list);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_by_id_proto_list) {
// Polymorphic prototype access caching currently only supported when JITting.
ASSERT_NOT_REACHED();
// This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_by_id_chain) {
@@ -2244,7 +2191,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
callFrame->r(dst) = JSValue(baseObject->getDirectOffset(offset));
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_chain);
NEXT_INSTRUCTION();
}
@@ -2274,7 +2221,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_by_id_generic);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_array_length) {
@@ -2290,7 +2237,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (LIKELY(isJSArray(globalData, baseValue))) {
int dst = vPC[1].u.operand;
callFrame->r(dst) = jsNumber(callFrame, asArray(baseValue)->length());
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_array_length);
NEXT_INSTRUCTION();
}
@@ -2310,7 +2257,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (LIKELY(isJSString(globalData, baseValue))) {
int dst = vPC[1].u.operand;
callFrame->r(dst) = jsNumber(callFrame, asString(baseValue)->value().size());
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_get_string_length);
NEXT_INSTRUCTION();
}
@@ -2340,7 +2287,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
tryCachePutByID(callFrame, codeBlock, vPC, baseValue, slot);
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_put_by_id);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_by_id_transition) {
@@ -2385,7 +2332,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(callFrame->codeBlock()->identifier(vPC[2].u.operand))) == offset);
baseObject->putDirectOffset(offset, callFrame->r(value).jsValue());
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_put_by_id_transition);
NEXT_INSTRUCTION();
}
}
@@ -2420,7 +2367,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(callFrame->codeBlock()->identifier(vPC[2].u.operand))) == offset);
baseObject->putDirectOffset(offset, callFrame->r(value).jsValue());
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_put_by_id_replace);
NEXT_INSTRUCTION();
}
}
@@ -2447,7 +2394,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot);
CHECK_FOR_EXCEPTION();
- vPC += 8;
+ vPC += OPCODE_LENGTH(op_put_by_id_generic);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_del_by_id) {
@@ -2458,16 +2405,16 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
boolean indicating success (if true) or failure (if false)
to register dst.
*/
- int dst = (++vPC)->u.operand;
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int base = vPC[2].u.operand;
+ int property = vPC[3].u.operand;
JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame);
Identifier& ident = callFrame->codeBlock()->identifier(property);
JSValue result = jsBoolean(baseObj->deleteProperty(callFrame, ident));
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_del_by_id);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_by_val) {
@@ -2478,9 +2425,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
in register dst. property is nominally converted to string
but numbers are treated more efficiently.
*/
- int dst = (++vPC)->u.operand;
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int base = vPC[2].u.operand;
+ int property = vPC[3].u.operand;
JSValue baseValue = callFrame->r(base).jsValue();
JSValue subscript = callFrame->r(property).jsValue();
@@ -2508,7 +2455,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_get_by_val);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_by_val) {
@@ -2522,9 +2469,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Unlike many opcodes, this one does not write any output to
the register file.
*/
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
- int value = (++vPC)->u.operand;
+ int base = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
+ int value = vPC[3].u.operand;
JSValue baseValue = callFrame->r(base).jsValue();
JSValue subscript = callFrame->r(property).jsValue();
@@ -2558,7 +2505,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
}
CHECK_FOR_EXCEPTION();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_by_val);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_del_by_val) {
@@ -2569,9 +2516,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
boolean indicating success (if true) or failure (if false)
to register dst.
*/
- int dst = (++vPC)->u.operand;
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int base = vPC[2].u.operand;
+ int property = vPC[3].u.operand;
JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame); // may throw
@@ -2589,7 +2536,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = result;
- ++vPC;
+ vPC += OPCODE_LENGTH(op_del_by_val);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_by_index) {
@@ -2604,13 +2551,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
This opcode is mainly used to initialize array literals.
*/
- int base = (++vPC)->u.operand;
- unsigned property = (++vPC)->u.operand;
- int value = (++vPC)->u.operand;
+ int base = vPC[1].u.operand;
+ unsigned property = vPC[2].u.operand;
+ int value = vPC[3].u.operand;
callFrame->r(base).jsValue().put(callFrame, property, callFrame->r(value).jsValue());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_by_index);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_loop) {
@@ -2625,7 +2572,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
#if ENABLE(OPCODE_STATS)
OpcodeStats::resetLastInstruction();
#endif
- int target = (++vPC)->u.operand;
+ int target = vPC[1].u.operand;
CHECK_FOR_TIMEOUT();
vPC += target;
NEXT_INSTRUCTION();
@@ -2639,7 +2586,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
#if ENABLE(OPCODE_STATS)
OpcodeStats::resetLastInstruction();
#endif
- int target = (++vPC)->u.operand;
+ int target = vPC[1].u.operand;
vPC += target;
NEXT_INSTRUCTION();
@@ -2653,15 +2600,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Additionally this loop instruction may terminate JS execution is
the JS timeout is reached.
*/
- int cond = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int cond = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
vPC += target;
CHECK_FOR_TIMEOUT();
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_loop_if_true);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jtrue) {
@@ -2670,14 +2617,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Jumps to offset target from the current instruction, if and
only if register cond converts to boolean as true.
*/
- int cond = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int cond = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
vPC += target;
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jtrue);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jfalse) {
@@ -2686,14 +2633,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Jumps to offset target from the current instruction, if and
only if register cond converts to boolean as false.
*/
- int cond = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int cond = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) {
vPC += target;
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jfalse);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jeq_null) {
@@ -2702,8 +2649,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Jumps to offset target from the current instruction, if and
only if register src is null.
*/
- int src = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int src = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
JSValue srcValue = callFrame->r(src).jsValue();
if (srcValue.isUndefinedOrNull() || (srcValue.isCell() && srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
@@ -2711,7 +2658,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jeq_null);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jneq_null) {
@@ -2720,8 +2667,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Jumps to offset target from the current instruction, if and
only if register src is not null.
*/
- int src = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int src = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
JSValue srcValue = callFrame->r(src).jsValue();
if (!srcValue.isUndefinedOrNull() || (srcValue.isCell() && !srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
@@ -2729,7 +2676,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jneq_null);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jneq_ptr) {
@@ -2738,16 +2685,16 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Jumps to offset target from the current instruction, if the value r is equal
to ptr, using pointer equality.
*/
- int src = (++vPC)->u.operand;
- JSValue ptr = JSValue((++vPC)->u.jsCell);
- int target = (++vPC)->u.operand;
+ int src = vPC[1].u.operand;
+ JSValue ptr = JSValue(vPC[2].u.jsCell);
+ int target = vPC[3].u.operand;
JSValue srcValue = callFrame->r(src).jsValue();
if (srcValue != ptr) {
vPC += target;
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jneq_ptr);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_loop_if_less) {
@@ -2761,9 +2708,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Additionally this loop instruction may terminate JS execution is
the JS timeout is reached.
*/
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
- int target = (++vPC)->u.operand;
+ JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
+ int target = vPC[3].u.operand;
bool result = jsLess(callFrame, src1, src2);
CHECK_FOR_EXCEPTION();
@@ -2774,7 +2721,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_loop_if_less);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_loop_if_lesseq) {
@@ -2788,9 +2735,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Additionally this loop instruction may terminate JS execution is
the JS timeout is reached.
*/
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
- int target = (++vPC)->u.operand;
+ JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
+ int target = vPC[3].u.operand;
bool result = jsLessEq(callFrame, src1, src2);
CHECK_FOR_EXCEPTION();
@@ -2801,7 +2748,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_loop_if_lesseq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jnless) {
@@ -2812,9 +2759,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
target from the current instruction, if and only if the
result of the comparison is false.
*/
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
- int target = (++vPC)->u.operand;
+ JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
+ int target = vPC[3].u.operand;
bool result = jsLess(callFrame, src1, src2);
CHECK_FOR_EXCEPTION();
@@ -2824,7 +2771,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jnless);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jnlesseq) {
@@ -2835,9 +2782,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
and then jumps to offset target from the current instruction,
if and only if theresult of the comparison is false.
*/
- JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue();
- JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue();
- int target = (++vPC)->u.operand;
+ JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
+ JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
+ int target = vPC[3].u.operand;
bool result = jsLessEq(callFrame, src1, src2);
CHECK_FOR_EXCEPTION();
@@ -2847,7 +2794,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
NEXT_INSTRUCTION();
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_jnlesseq);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_switch_imm) {
@@ -2859,9 +2806,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
table, and the value at jumpTable[scrutinee value] is non-zero, then
that value is used as the jump offset, otherwise defaultOffset is used.
*/
- int tableIndex = (++vPC)->u.operand;
- int defaultOffset = (++vPC)->u.operand;
- JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue();
+ int tableIndex = vPC[1].u.operand;
+ int defaultOffset = vPC[2].u.operand;
+ JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
if (scrutinee.isInt32())
vPC += callFrame->codeBlock()->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee.asInt32(), defaultOffset);
else {
@@ -2883,9 +2830,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
table, and the value at jumpTable[scrutinee value] is non-zero, then
that value is used as the jump offset, otherwise defaultOffset is used.
*/
- int tableIndex = (++vPC)->u.operand;
- int defaultOffset = (++vPC)->u.operand;
- JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue();
+ int tableIndex = vPC[1].u.operand;
+ int defaultOffset = vPC[2].u.operand;
+ JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
if (!scrutinee.isString())
vPC += defaultOffset;
else {
@@ -2906,9 +2853,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
jump table, then the value associated with the string is used as the
jump offset, otherwise defaultOffset is used.
*/
- int tableIndex = (++vPC)->u.operand;
- int defaultOffset = (++vPC)->u.operand;
- JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue();
+ int tableIndex = vPC[1].u.operand;
+ int defaultOffset = vPC[2].u.operand;
+ JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
if (!scrutinee.isString())
vPC += defaultOffset;
else
@@ -2923,12 +2870,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
constructor, using the rules for function declarations, and
puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- int func = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int func = vPC[2].u.operand;
callFrame->r(dst) = JSValue(callFrame->codeBlock()->functionDecl(func)->make(callFrame, callFrame->scopeChain()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_func);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_new_func_exp) {
@@ -2939,8 +2886,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
constructor, using the rules for function expressions, and
puts the result in register dst.
*/
- int dst = (++vPC)->u.operand;
- int funcIndex = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int funcIndex = vPC[2].u.operand;
FunctionExecutable* function = callFrame->codeBlock()->functionExpr(funcIndex);
JSFunction* func = function->make(callFrame, callFrame->scopeChain());
@@ -2959,7 +2906,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = JSValue(func);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_func_exp);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_call_eval) {
@@ -2992,7 +2939,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
goto vm_throw;
callFrame->r(dst) = result;
- vPC += 5;
+ vPC += OPCODE_LENGTH(op_call_eval);
NEXT_INSTRUCTION();
}
@@ -3066,7 +3013,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = returnValue;
- vPC += 5;
+ vPC += OPCODE_LENGTH(op_call);
NEXT_INSTRUCTION();
}
@@ -3076,8 +3023,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
goto vm_throw;
}
DEFINE_OPCODE(op_load_varargs) {
- int argCountDst = (++vPC)->u.operand;
- int argsOffset = (++vPC)->u.operand;
+ int argCountDst = vPC[1].u.operand;
+ int argsOffset = vPC[2].u.operand;
JSValue arguments = callFrame->r(argsOffset).jsValue();
int32_t argCount = 0;
@@ -3149,7 +3096,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
}
CHECK_FOR_EXCEPTION();
callFrame->r(argCountDst) = Register::withInt(argCount + 1);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_load_varargs);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_call_varargs) {
@@ -3220,7 +3167,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(dst) = returnValue;
- vPC += 5;
+ vPC += OPCODE_LENGTH(op_call_varargs);
NEXT_INSTRUCTION();
}
@@ -3242,12 +3189,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
This opcode should only be used immediately before op_ret.
*/
- int src = (++vPC)->u.operand;
+ int src = vPC[1].u.operand;
ASSERT(callFrame->codeBlock()->needsFullScopeChain());
asActivation(callFrame->r(src).jsValue())->copyRegisters(callFrame->optionalCalleeArguments());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_tear_off_activation);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_tear_off_arguments) {
@@ -3268,7 +3215,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (callFrame->optionalCalleeArguments())
callFrame->optionalCalleeArguments()->copyRegisters();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_tear_off_arguments);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_ret) {
@@ -3281,7 +3228,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
register base to those of the calling function.
*/
- int result = (++vPC)->u.operand;
+ int result = vPC[1].u.operand;
if (callFrame->codeBlock()->needsFullScopeChain())
callFrame->scopeChain()->deref();
@@ -3316,7 +3263,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
for (size_t count = codeBlock->m_numVars; i < count; ++i)
callFrame->r(i) = jsUndefined();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_enter);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_enter_with_activation) {
@@ -3338,12 +3285,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
for (size_t count = codeBlock->m_numVars; i < count; ++i)
callFrame->r(i) = jsUndefined();
- int dst = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
JSActivation* activation = new (globalData) JSActivation(callFrame, static_cast<FunctionExecutable*>(codeBlock->ownerExecutable()));
callFrame->r(dst) = JSValue(activation);
callFrame->setScopeChain(callFrame->scopeChain()->copy()->push(activation));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_enter_with_activation);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_convert_this) {
@@ -3358,12 +3305,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
block.
*/
- int thisRegister = (++vPC)->u.operand;
+ int thisRegister = vPC[1].u.operand;
JSValue thisVal = callFrame->r(thisRegister).jsValue();
if (thisVal.needsThisConversion())
callFrame->r(thisRegister) = JSValue(thisVal.toThisObject(callFrame));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_convert_this);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_init_arguments) {
@@ -3377,7 +3324,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
block.
*/
callFrame->r(RegisterFile::ArgumentsRegister) = JSValue();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_init_arguments);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_create_arguments) {
@@ -3393,7 +3340,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->setCalleeArguments(arguments);
callFrame->r(RegisterFile::ArgumentsRegister) = JSValue(arguments);
}
- ++vPC;
+ vPC += OPCODE_LENGTH(op_create_arguments);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_construct) {
@@ -3471,7 +3418,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
CHECK_FOR_EXCEPTION();
callFrame->r(dst) = JSValue(returnValue);
- vPC += 7;
+ vPC += OPCODE_LENGTH(op_construct);
NEXT_INSTRUCTION();
}
@@ -3489,32 +3436,32 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
int dst = vPC[1].u.operand;
if (LIKELY(callFrame->r(dst).jsValue().isObject())) {
- vPC += 3;
+ vPC += OPCODE_LENGTH(op_construct_verify);
NEXT_INSTRUCTION();
}
int override = vPC[2].u.operand;
callFrame->r(dst) = callFrame->r(override);
- vPC += 3;
+ vPC += OPCODE_LENGTH(op_construct_verify);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_strcat) {
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
- int count = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
+ int count = vPC[3].u.operand;
callFrame->r(dst) = concatenateStrings(callFrame, &callFrame->registers()[src], count);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_strcat);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_to_primitive) {
- int dst = (++vPC)->u.operand;
- int src = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int src = vPC[2].u.operand;
callFrame->r(dst) = callFrame->r(src).jsValue().toPrimitive(callFrame);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_to_primitive);
NEXT_INSTRUCTION();
}
@@ -3525,7 +3472,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
of the current scope chain. The contents of the register scope
are replaced by the result of toObject conversion of the scope.
*/
- int scope = (++vPC)->u.operand;
+ int scope = vPC[1].u.operand;
JSValue v = callFrame->r(scope).jsValue();
JSObject* o = v.toObject(callFrame);
CHECK_FOR_EXCEPTION();
@@ -3533,7 +3480,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
callFrame->r(scope) = JSValue(o);
callFrame->setScopeChain(callFrame->scopeChain()->push(o));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_push_scope);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_pop_scope) {
@@ -3543,47 +3490,69 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
*/
callFrame->setScopeChain(callFrame->scopeChain()->pop());
- ++vPC;
+ vPC += OPCODE_LENGTH(op_pop_scope);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_get_pnames) {
- /* get_pnames dst(r) base(r)
+ /* get_pnames dst(r) base(r) i(n) size(n) breakTarget(offset)
Creates a property name list for register base and puts it
- in register dst. This is not a true JavaScript value, just
- a synthetic value used to keep the iteration state in a
- register.
+ in register dst, initializing i and size for iteration. If
+ base is undefined or null, jumps to breakTarget.
*/
- int dst = (++vPC)->u.operand;
- int base = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int base = vPC[2].u.operand;
+ int i = vPC[3].u.operand;
+ int size = vPC[4].u.operand;
+ int breakTarget = vPC[5].u.operand;
+
+ JSValue v = callFrame->r(base).jsValue();
+ if (v.isUndefinedOrNull()) {
+ vPC += breakTarget;
+ NEXT_INSTRUCTION();
+ }
+
+ JSObject* o = v.toObject(callFrame);
+ Structure* structure = o->structure();
+ JSPropertyNameIterator* jsPropertyNameIterator = structure->enumerationCache();
+ if (!jsPropertyNameIterator || jsPropertyNameIterator->cachedPrototypeChain() != structure->prototypeChain(callFrame))
+ jsPropertyNameIterator = JSPropertyNameIterator::create(callFrame, o);
- callFrame->r(dst) = JSPropertyNameIterator::create(callFrame, callFrame->r(base).jsValue());
- ++vPC;
+ callFrame->r(dst) = jsPropertyNameIterator;
+ callFrame->r(base) = JSValue(o);
+ callFrame->r(i) = Register::withInt(0);
+ callFrame->r(size) = Register::withInt(jsPropertyNameIterator->size());
+ vPC += OPCODE_LENGTH(op_get_pnames);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_next_pname) {
- /* next_pname dst(r) iter(r) target(offset)
+ /* next_pname dst(r) base(r) i(n) size(n) iter(r) target(offset)
- Tries to copies the next name from property name list in
- register iter. If there are names left, then copies one to
- register dst, and jumps to offset target. If there are none
- left, invalidates the iterator and continues to the next
+ Copies the next name from the property name list in
+ register iter to dst, then jumps to offset target. If there are no
+ names left, invalidates the iterator and continues to the next
instruction.
*/
- int dst = (++vPC)->u.operand;
- int iter = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int base = vPC[2].u.operand;
+ int i = vPC[3].u.operand;
+ int size = vPC[4].u.operand;
+ int iter = vPC[5].u.operand;
+ int target = vPC[6].u.operand;
JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator();
- if (JSValue temp = it->next(callFrame)) {
- CHECK_FOR_TIMEOUT();
- callFrame->r(dst) = JSValue(temp);
- vPC += target;
- NEXT_INSTRUCTION();
+ while (callFrame->r(i).i() != callFrame->r(size).i()) {
+ JSValue key = it->get(callFrame, asObject(callFrame->r(base).jsValue()), callFrame->r(i).i());
+ callFrame->r(i) = Register::withInt(callFrame->r(i).i() + 1);
+ if (key) {
+ CHECK_FOR_TIMEOUT();
+ callFrame->r(dst) = key;
+ vPC += target;
+ NEXT_INSTRUCTION();
+ }
}
- it->invalidate();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_next_pname);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_jmp_scopes) {
@@ -3593,8 +3562,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
specified by immediate number count, then jumps to offset
target.
*/
- int count = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
+ int count = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
ScopeChainNode* tmp = callFrame->scopeChain();
while (count--)
@@ -3617,7 +3586,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
*/
callFrame->setScopeChain(createExceptionScope(callFrame, vPC));
- vPC += 4;
+ vPC += OPCODE_LENGTH(op_push_new_scope);
NEXT_INSTRUCTION();
}
#if HAVE(COMPUTED_GOTO)
@@ -3632,11 +3601,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
*/
ASSERT(exceptionValue);
ASSERT(!globalData->exception);
- int ex = (++vPC)->u.operand;
+ int ex = vPC[1].u.operand;
callFrame->r(ex) = exceptionValue;
exceptionValue = JSValue();
- ++vPC;
+ vPC += OPCODE_LENGTH(op_catch);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_throw) {
@@ -3650,7 +3619,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
else the script returns control to the nearest native caller.
*/
- int ex = (++vPC)->u.operand;
+ int ex = vPC[1].u.operand;
exceptionValue = callFrame->r(ex).jsValue();
handler = throwException(callFrame, exceptionValue, vPC - callFrame->codeBlock()->instructions().begin(), true);
@@ -3670,14 +3639,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
constant message as the message string. The result is
written to register dst.
*/
- int dst = (++vPC)->u.operand;
- int type = (++vPC)->u.operand;
- int message = (++vPC)->u.operand;
+ int dst = vPC[1].u.operand;
+ int type = vPC[2].u.operand;
+ int message = vPC[3].u.operand;
CodeBlock* codeBlock = callFrame->codeBlock();
callFrame->r(dst) = JSValue(Error::create(callFrame, (ErrorType)type, callFrame->r(message).jsValue().toString(callFrame), codeBlock->lineNumberForBytecodeOffset(callFrame, vPC - codeBlock->instructions().begin()), codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->sourceURL()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_new_error);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_end) {
@@ -3692,7 +3661,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(scopeChain->refCount > 1);
scopeChain->deref();
}
- int result = (++vPC)->u.operand;
+ int result = vPC[1].u.operand;
return callFrame->r(result).jsValue();
}
DEFINE_OPCODE(op_put_getter) {
@@ -3706,9 +3675,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Unlike many opcodes, this one does not write any output to
the register file.
*/
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
- int function = (++vPC)->u.operand;
+ int base = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
+ int function = vPC[3].u.operand;
ASSERT(callFrame->r(base).jsValue().isObject());
JSObject* baseObj = asObject(callFrame->r(base).jsValue());
@@ -3716,7 +3685,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(callFrame->r(function).jsValue().isObject());
baseObj->defineGetter(callFrame, ident, asObject(callFrame->r(function).jsValue()));
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_getter);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_put_setter) {
@@ -3730,9 +3699,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Unlike many opcodes, this one does not write any output to
the register file.
*/
- int base = (++vPC)->u.operand;
- int property = (++vPC)->u.operand;
- int function = (++vPC)->u.operand;
+ int base = vPC[1].u.operand;
+ int property = vPC[2].u.operand;
+ int function = vPC[3].u.operand;
ASSERT(callFrame->r(base).jsValue().isObject());
JSObject* baseObj = asObject(callFrame->r(base).jsValue());
@@ -3740,7 +3709,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
ASSERT(callFrame->r(function).jsValue().isObject());
baseObj->defineSetter(callFrame, ident, asObject(callFrame->r(function).jsValue()), 0);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_put_setter);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_method_check) {
@@ -3753,9 +3722,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Places the address of the next instruction into the retAddrDst
register and jumps to offset target from the current instruction.
*/
- int retAddrDst = (++vPC)->u.operand;
- int target = (++vPC)->u.operand;
- callFrame->r(retAddrDst) = vPC + 1;
+ int retAddrDst = vPC[1].u.operand;
+ int target = vPC[2].u.operand;
+ callFrame->r(retAddrDst) = vPC + OPCODE_LENGTH(op_jsr);
vPC += target;
NEXT_INSTRUCTION();
@@ -3767,7 +3736,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
differs from op_jmp because the target address is stored in a
register, not as an immediate.
*/
- int retAddrSrc = (++vPC)->u.operand;
+ int retAddrSrc = vPC[1].u.operand;
vPC = callFrame->r(retAddrSrc).vPC();
NEXT_INSTRUCTION();
}
@@ -3777,13 +3746,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
Notifies the debugger of the current state of execution. This opcode
is only generated while the debugger is attached.
*/
- int debugHookID = (++vPC)->u.operand;
- int firstLine = (++vPC)->u.operand;
- int lastLine = (++vPC)->u.operand;
+ int debugHookID = vPC[1].u.operand;
+ int firstLine = vPC[2].u.operand;
+ int lastLine = vPC[3].u.operand;
debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
- ++vPC;
+ vPC += OPCODE_LENGTH(op_debug);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_profile_will_call) {
@@ -3797,7 +3766,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (*enabledProfilerReference)
(*enabledProfilerReference)->willExecute(callFrame, callFrame->r(function).jsValue());
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_profile_will_call);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_profile_did_call) {
@@ -3811,7 +3780,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
if (*enabledProfilerReference)
(*enabledProfilerReference)->didExecute(callFrame, callFrame->r(function).jsValue());
- vPC += 2;
+ vPC += OPCODE_LENGTH(op_profile_did_call);
NEXT_INSTRUCTION();
}
vm_throw: {
diff --git a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h
index 3046b28..e17b055 100644
--- a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h
+++ b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.h
@@ -129,7 +129,6 @@ namespace JSC {
NEVER_INLINE bool resolveGlobal(CallFrame*, Instruction*, JSValue& exceptionValue);
NEVER_INLINE void resolveBase(CallFrame*, Instruction* vPC);
NEVER_INLINE bool resolveBaseAndProperty(CallFrame*, Instruction*, JSValue& exceptionValue);
- NEVER_INLINE bool resolveBaseAndFunc(CallFrame*, Instruction*, JSValue& exceptionValue);
NEVER_INLINE ScopeChainNode* createExceptionScope(CallFrame*, const Instruction* vPC);
void tryCacheGetByID(CallFrame*, CodeBlock*, Instruction*, JSValue baseValue, const Identifier& propertyName, const PropertySlot&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h b/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h
index 3274fcc..1d15ef0 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocator.h
@@ -78,6 +78,9 @@ private:
struct Allocation {
char* pages;
size_t size;
+#if PLATFORM(SYMBIAN)
+ RChunk* chunk;
+#endif
};
typedef Vector<Allocation, 2> AllocationList;
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp
new file mode 100644
index 0000000..c96ecae
--- /dev/null
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/ExecutableAllocatorSymbian.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ */
+
+#include "config.h"
+
+#include "ExecutableAllocator.h"
+
+#if ENABLE(ASSEMBLER) && PLATFORM(SYMBIAN)
+
+#include <e32hal.h>
+#include <e32std.h>
+
+// Set the page size to 256 Kb to compensate for moving memory model limitation
+const size_t MOVING_MEM_PAGE_SIZE = 256 * 1024;
+
+namespace JSC {
+
+void ExecutableAllocator::intializePageSize()
+{
+#if PLATFORM_ARM_ARCH(5)
+ // The moving memory model (as used in ARMv5 and earlier platforms)
+ // on Symbian OS limits the number of chunks for each process to 16.
+ // To mitigate this limitation increase the pagesize to
+ // allocate less of larger chunks.
+ ExecutableAllocator::pageSize = MOVING_MEM_PAGE_SIZE;
+#else
+ TInt page_size;
+ UserHal::PageSizeInBytes(page_size);
+ ExecutableAllocator::pageSize = page_size;
+#endif
+}
+
+ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t n)
+{
+ RChunk* codeChunk = new RChunk();
+
+ TInt errorCode = codeChunk->CreateLocalCode(n, n);
+
+ char* allocation = reinterpret_cast<char*>(codeChunk->Base());
+ if (!allocation)
+ CRASH();
+ ExecutablePool::Allocation alloc = { allocation, n, codeChunk };
+ return alloc;
+}
+
+void ExecutablePool::systemRelease(const ExecutablePool::Allocation& alloc)
+{
+ alloc.chunk->Close();
+ delete alloc.chunk;
+}
+
+#if ENABLE(ASSEMBLER_WX_EXCLUSIVE)
+#error "ASSEMBLER_WX_EXCLUSIVE not yet suported on this platform."
+#endif
+
+}
+
+#endif // HAVE(ASSEMBLER)
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp
index ea8434e..fa0ac2e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JIT.cpp
@@ -202,7 +202,6 @@ void JIT::privateCompileMainPass()
DEFINE_BINARY_OP(op_less)
DEFINE_BINARY_OP(op_lesseq)
DEFINE_BINARY_OP(op_urshift)
- DEFINE_UNARY_OP(op_get_pnames)
DEFINE_UNARY_OP(op_is_boolean)
DEFINE_UNARY_OP(op_is_function)
DEFINE_UNARY_OP(op_is_number)
@@ -241,6 +240,7 @@ void JIT::privateCompileMainPass()
DEFINE_OP(op_get_by_id)
DEFINE_OP(op_get_by_val)
DEFINE_OP(op_get_global_var)
+ DEFINE_OP(op_get_pnames)
DEFINE_OP(op_get_scoped_var)
DEFINE_OP(op_instanceof)
DEFINE_OP(op_jeq_null)
@@ -489,21 +489,21 @@ JITCode JIT::privateCompile()
ASSERT(record.type == SwitchRecord::Immediate || record.type == SwitchRecord::Character);
ASSERT(record.jumpTable.simpleJumpTable->branchOffsets.size() == record.jumpTable.simpleJumpTable->ctiOffsets.size());
- record.jumpTable.simpleJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeIndex + 3 + record.defaultOffset]);
+ record.jumpTable.simpleJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeIndex + record.defaultOffset]);
for (unsigned j = 0; j < record.jumpTable.simpleJumpTable->branchOffsets.size(); ++j) {
unsigned offset = record.jumpTable.simpleJumpTable->branchOffsets[j];
- record.jumpTable.simpleJumpTable->ctiOffsets[j] = offset ? patchBuffer.locationOf(m_labels[bytecodeIndex + 3 + offset]) : record.jumpTable.simpleJumpTable->ctiDefault;
+ record.jumpTable.simpleJumpTable->ctiOffsets[j] = offset ? patchBuffer.locationOf(m_labels[bytecodeIndex + offset]) : record.jumpTable.simpleJumpTable->ctiDefault;
}
} else {
ASSERT(record.type == SwitchRecord::String);
- record.jumpTable.stringJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeIndex + 3 + record.defaultOffset]);
+ record.jumpTable.stringJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeIndex + record.defaultOffset]);
StringJumpTable::StringOffsetTable::iterator end = record.jumpTable.stringJumpTable->offsetTable.end();
for (StringJumpTable::StringOffsetTable::iterator it = record.jumpTable.stringJumpTable->offsetTable.begin(); it != end; ++it) {
unsigned offset = it->second.branchOffset;
- it->second.ctiOffset = offset ? patchBuffer.locationOf(m_labels[bytecodeIndex + 3 + offset]) : record.jumpTable.stringJumpTable->ctiDefault;
+ it->second.ctiOffset = offset ? patchBuffer.locationOf(m_labels[bytecodeIndex + offset]) : record.jumpTable.stringJumpTable->ctiDefault;
}
}
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JIT.h b/src/3rdparty/webkit/JavaScriptCore/jit/JIT.h
index 0712743..9406d1f 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JIT.h
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JIT.h
@@ -386,6 +386,8 @@ namespace JSC {
Address addressFor(unsigned index, RegisterID base = callFrameRegister);
+ void testPrototype(Structure*, JumpList& failureCases);
+
#if USE(JSVALUE32_64)
Address tagFor(unsigned index, RegisterID base = callFrameRegister);
Address payloadFor(unsigned index, RegisterID base = callFrameRegister);
@@ -713,6 +715,7 @@ namespace JSC {
void emit_op_new_func_exp(Instruction*);
void emit_op_new_object(Instruction*);
void emit_op_new_regexp(Instruction*);
+ void emit_op_get_pnames(Instruction*);
void emit_op_next_pname(Instruction*);
void emit_op_not(Instruction*);
void emit_op_nstricteq(Instruction*);
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp
index 7afc1f2..8cda482 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITArithmetic.cpp
@@ -98,16 +98,16 @@ void JIT::emit_op_jnless(Instruction* currentInstruction)
if (isOperandConstantImmediateInt(op1)) {
emitLoad(op2, regT3, regT2);
notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThanOrEqual, regT2, Imm32(getConstantOperand(op1).asInt32())), target + 3);
+ addJump(branch32(LessThanOrEqual, regT2, Imm32(getConstantOperand(op1).asInt32())), target);
} else if (isOperandConstantImmediateInt(op2)) {
emitLoad(op1, regT1, regT0);
notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3);
+ addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target);
} else {
emitLoad2(op1, regT1, regT0, op2, regT3, regT2);
notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThanOrEqual, regT0, regT2), target + 3);
+ addJump(branch32(GreaterThanOrEqual, regT0, regT2), target);
}
if (!supportsFloatingPoint()) {
@@ -145,7 +145,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
stubCall.addArgument(op1);
stubCall.addArgument(op2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
}
void JIT::emit_op_jnlesseq(Instruction* currentInstruction)
@@ -161,16 +161,16 @@ void JIT::emit_op_jnlesseq(Instruction* currentInstruction)
if (isOperandConstantImmediateInt(op1)) {
emitLoad(op2, regT3, regT2);
notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThan, regT2, Imm32(getConstantOperand(op1).asInt32())), target + 3);
+ addJump(branch32(LessThan, regT2, Imm32(getConstantOperand(op1).asInt32())), target);
} else if (isOperandConstantImmediateInt(op2)) {
emitLoad(op1, regT1, regT0);
notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3);
+ addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target);
} else {
emitLoad2(op1, regT1, regT0, op2, regT3, regT2);
notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThan, regT0, regT2), target + 3);
+ addJump(branch32(GreaterThan, regT0, regT2), target);
}
if (!supportsFloatingPoint()) {
@@ -208,7 +208,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
stubCall.addArgument(op1);
stubCall.addArgument(op2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
}
// LeftShift (<<)
@@ -829,11 +829,11 @@ void JIT::emitBinaryDoubleOp(OpcodeID opcodeID, unsigned dst, unsigned op1, unsi
break;
case op_jnless:
emitLoadDouble(op1, fpRegT2);
- addJump(branchDouble(DoubleLessThanOrEqual, fpRegT0, fpRegT2), dst + 3);
+ addJump(branchDouble(DoubleLessThanOrEqual, fpRegT0, fpRegT2), dst);
break;
case op_jnlesseq:
emitLoadDouble(op1, fpRegT2);
- addJump(branchDouble(DoubleLessThan, fpRegT0, fpRegT2), dst + 3);
+ addJump(branchDouble(DoubleLessThan, fpRegT0, fpRegT2), dst);
break;
default:
ASSERT_NOT_REACHED();
@@ -882,11 +882,11 @@ void JIT::emitBinaryDoubleOp(OpcodeID opcodeID, unsigned dst, unsigned op1, unsi
break;
case op_jnless:
emitLoadDouble(op2, fpRegT1);
- addJump(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), dst + 3);
+ addJump(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), dst);
break;
case op_jnlesseq:
emitLoadDouble(op2, fpRegT1);
- addJump(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), dst + 3);
+ addJump(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), dst);
break;
default:
ASSERT_NOT_REACHED();
@@ -1313,7 +1313,7 @@ void JIT::emit_op_jnless(Instruction* currentInstruction)
#else
int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2)));
#endif
- addJump(branch32(GreaterThanOrEqual, regT0, Imm32(op2imm)), target + 3);
+ addJump(branch32(GreaterThanOrEqual, regT0, Imm32(op2imm)), target);
} else if (isOperandConstantImmediateInt(op1)) {
emitGetVirtualRegister(op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
@@ -1322,13 +1322,13 @@ void JIT::emit_op_jnless(Instruction* currentInstruction)
#else
int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1)));
#endif
- addJump(branch32(LessThanOrEqual, regT1, Imm32(op1imm)), target + 3);
+ addJump(branch32(LessThanOrEqual, regT1, Imm32(op1imm)), target);
} else {
emitGetVirtualRegisters(op1, regT0, op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT0);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
- addJump(branch32(GreaterThanOrEqual, regT0, regT1), target + 3);
+ addJump(branch32(GreaterThanOrEqual, regT0, regT1), target);
}
}
@@ -1365,7 +1365,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
move(Imm32(op2imm), regT1);
convertInt32ToDouble(regT1, fpRegT1);
- emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless));
@@ -1382,7 +1382,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
stubCall.addArgument(regT0);
stubCall.addArgument(op2, regT2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
} else if (isOperandConstantImmediateInt(op1)) {
linkSlowCase(iter);
@@ -1406,7 +1406,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
move(Imm32(op1imm), regT0);
convertInt32ToDouble(regT0, fpRegT0);
- emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless));
@@ -1423,7 +1423,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
stubCall.addArgument(op1, regT2);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
} else {
linkSlowCase(iter);
@@ -1452,7 +1452,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1);
#endif
- emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless));
@@ -1475,7 +1475,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt
stubCall.addArgument(regT0);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
}
}
@@ -1498,7 +1498,7 @@ void JIT::emit_op_jnlesseq(Instruction* currentInstruction)
#else
int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2)));
#endif
- addJump(branch32(GreaterThan, regT0, Imm32(op2imm)), target + 3);
+ addJump(branch32(GreaterThan, regT0, Imm32(op2imm)), target);
} else if (isOperandConstantImmediateInt(op1)) {
emitGetVirtualRegister(op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
@@ -1507,13 +1507,13 @@ void JIT::emit_op_jnlesseq(Instruction* currentInstruction)
#else
int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1)));
#endif
- addJump(branch32(LessThan, regT1, Imm32(op1imm)), target + 3);
+ addJump(branch32(LessThan, regT1, Imm32(op1imm)), target);
} else {
emitGetVirtualRegisters(op1, regT0, op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT0);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
- addJump(branch32(GreaterThan, regT0, regT1), target + 3);
+ addJump(branch32(GreaterThan, regT0, regT1), target);
}
}
@@ -1550,7 +1550,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
move(Imm32(op2imm), regT1);
convertInt32ToDouble(regT1, fpRegT1);
- emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq));
@@ -1567,7 +1567,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
stubCall.addArgument(regT0);
stubCall.addArgument(op2, regT2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
} else if (isOperandConstantImmediateInt(op1)) {
linkSlowCase(iter);
@@ -1591,7 +1591,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
move(Imm32(op1imm), regT0);
convertInt32ToDouble(regT0, fpRegT0);
- emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq));
@@ -1608,7 +1608,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
stubCall.addArgument(op1, regT2);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
} else {
linkSlowCase(iter);
@@ -1637,7 +1637,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1);
#endif
- emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target + 3);
+ emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target);
emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq));
@@ -1660,7 +1660,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE
stubCall.addArgument(regT0);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target);
}
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp
index 4fd24d2..cfaa69f 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITCall.cpp
@@ -236,19 +236,17 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned)
int argCount = instruction[3].u.operand;
int registerOffset = instruction[4].u.operand;
- Jump wasEval1;
- Jump wasEval2;
+ Jump wasEval;
if (opcodeID == op_call_eval) {
JITStubCall stubCall(this, cti_op_call_eval);
stubCall.addArgument(callee);
stubCall.addArgument(JIT::Imm32(registerOffset));
stubCall.addArgument(JIT::Imm32(argCount));
stubCall.call();
- wasEval1 = branchTest32(NonZero, regT0);
- wasEval2 = branch32(NotEqual, regT1, Imm32(JSValue::CellTag));
+ wasEval = branch32(NotEqual, regT1, Imm32(JSValue::EmptyValueTag));
}
- emitLoad(callee, regT1, regT2);
+ emitLoad(callee, regT1, regT0);
if (opcodeID == op_call)
compileOpCallSetupArgs(instruction);
@@ -256,12 +254,12 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned)
compileOpConstructSetupArgs(instruction);
emitJumpSlowCaseIfNotJSCell(callee, regT1);
- addSlowCase(branchPtr(NotEqual, Address(regT2), ImmPtr(m_globalData->jsFunctionVPtr)));
+ addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsFunctionVPtr)));
// First, in the case of a construct, allocate the new object.
if (opcodeID == op_construct) {
JITStubCall(this, cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount);
- emitLoad(callee, regT1, regT2);
+ emitLoad(callee, regT1, regT0);
}
// Speculatively roll the callframe, assuming argCount will match the arity.
@@ -271,12 +269,10 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned)
emitNakedCall(m_globalData->jitStubs.ctiVirtualCall());
- if (opcodeID == op_call_eval) {
- wasEval1.link(this);
- wasEval2.link(this);
- }
+ if (opcodeID == op_call_eval)
+ wasEval.link(this);
- emitStore(dst, regT1, regT0);;
+ emitStore(dst, regT1, regT0);
sampleCodeBlock(m_codeBlock);
}
@@ -306,16 +302,14 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned ca
int argCount = instruction[3].u.operand;
int registerOffset = instruction[4].u.operand;
- Jump wasEval1;
- Jump wasEval2;
+ Jump wasEval;
if (opcodeID == op_call_eval) {
JITStubCall stubCall(this, cti_op_call_eval);
stubCall.addArgument(callee);
stubCall.addArgument(JIT::Imm32(registerOffset));
stubCall.addArgument(JIT::Imm32(argCount));
stubCall.call();
- wasEval1 = branchTest32(NonZero, regT0);
- wasEval2 = branch32(NotEqual, regT1, Imm32(JSValue::CellTag));
+ wasEval = branch32(NotEqual, regT1, Imm32(JSValue::EmptyValueTag));
}
emitLoad(callee, regT1, regT0);
@@ -359,10 +353,8 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned ca
// Call to the callee
m_callStructureStubCompilationInfo[callLinkInfoIndex].hotPathOther = emitNakedCall();
- if (opcodeID == op_call_eval) {
- wasEval1.link(this);
- wasEval2.link(this);
- }
+ if (opcodeID == op_call_eval)
+ wasEval.link(this);
// Put the return value in dst. In the interpreter, op_ret does this.
emitStore(dst, regT1, regT0);
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp
index 7059cc8..e10d105 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITOpcodes.cpp
@@ -33,6 +33,7 @@
#include "JSArray.h"
#include "JSCell.h"
#include "JSFunction.h"
+#include "JSPropertyNameIterator.h"
#include "LinkBuffer.h"
namespace JSC {
@@ -248,10 +249,8 @@ void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executable
addPtr(Imm32(NativeCallFrameSize - sizeof(NativeFunctionCalleeSignature)), stackPointerRegister);
// Check for an exception
- // FIXME: Maybe we can optimize this comparison to JSValue().
move(ImmPtr(&globalData->exception), regT2);
- Jump sawException1 = branch32(NotEqual, tagFor(0, regT2), Imm32(JSValue::CellTag));
- Jump sawException2 = branch32(NonZero, payloadFor(0, regT2), Imm32(0));
+ Jump sawException = branch32(NotEqual, tagFor(0, regT2), Imm32(JSValue::EmptyValueTag));
// Grab the return address.
emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT3);
@@ -264,13 +263,12 @@ void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executable
ret();
// Handle an exception
- sawException1.link(this);
- sawException2.link(this);
+ sawException.link(this);
// Grab the return address.
emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1);
move(ImmPtr(&globalData->exceptionLocation), regT2);
storePtr(regT1, regT2);
- move(ImmPtr(reinterpret_cast<void*>(ctiVMThrowTrampoline)), regT2);
+ move(ImmPtr(FunctionPtr(ctiVMThrowTrampoline).value()), regT2);
emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister);
poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*));
restoreReturnAddressBeforeReturn(regT2);
@@ -348,14 +346,14 @@ void JIT::emit_op_end(Instruction* currentInstruction)
void JIT::emit_op_jmp(Instruction* currentInstruction)
{
unsigned target = currentInstruction[1].u.operand;
- addJump(jump(), target + 1);
+ addJump(jump(), target);
}
void JIT::emit_op_loop(Instruction* currentInstruction)
{
unsigned target = currentInstruction[1].u.operand;
emitTimeoutCheck();
- addJump(jump(), target + 1);
+ addJump(jump(), target);
}
void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
@@ -369,21 +367,21 @@ void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
if (isOperandConstantImmediateInt(op1)) {
emitLoad(op2, regT1, regT0);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op1).asInt32())), target + 3);
+ addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op1).asInt32())), target);
return;
}
if (isOperandConstantImmediateInt(op2)) {
emitLoad(op1, regT1, regT0);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3);
+ addJump(branch32(LessThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target);
return;
}
emitLoad2(op1, regT1, regT0, op2, regT3, regT2);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThan, regT0, regT2), target + 3);
+ addJump(branch32(LessThan, regT0, regT2), target);
}
void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -400,7 +398,7 @@ void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowC
stubCall.addArgument(op1);
stubCall.addArgument(op2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction)
@@ -414,21 +412,21 @@ void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction)
if (isOperandConstantImmediateInt(op1)) {
emitLoad(op2, regT1, regT0);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op1).asInt32())), target + 3);
+ addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op1).asInt32())), target);
return;
}
if (isOperandConstantImmediateInt(op2)) {
emitLoad(op1, regT1, regT0);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3);
+ addJump(branch32(LessThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target);
return;
}
emitLoad2(op1, regT1, regT0, op2, regT3, regT2);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)));
addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
- addJump(branch32(LessThanOrEqual, regT0, regT2), target + 3);
+ addJump(branch32(LessThanOrEqual, regT0, regT2), target);
}
void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -445,7 +443,7 @@ void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<Slo
stubCall.addArgument(op1);
stubCall.addArgument(op2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
void JIT::emit_op_new_object(Instruction* currentInstruction)
@@ -460,30 +458,20 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction)
unsigned baseVal = currentInstruction[3].u.operand;
unsigned proto = currentInstruction[4].u.operand;
- // Load the operands (baseVal, proto, and value respectively) into registers.
+ // Load the operands into registers.
// We use regT0 for baseVal since we will be done with this first, and we can then use it for the result.
- emitLoadPayload(proto, regT1);
- emitLoadPayload(baseVal, regT0);
emitLoadPayload(value, regT2);
+ emitLoadPayload(baseVal, regT0);
+ emitLoadPayload(proto, regT1);
- // Check that baseVal & proto are cells.
- emitJumpSlowCaseIfNotJSCell(proto);
+ // Check that value, baseVal, and proto are cells.
+ emitJumpSlowCaseIfNotJSCell(value);
emitJumpSlowCaseIfNotJSCell(baseVal);
+ emitJumpSlowCaseIfNotJSCell(proto);
- // Check that baseVal is an object, that it 'ImplementsHasInstance' but that it does not 'OverridesHasInstance'.
+ // Check that baseVal 'ImplementsDefaultHasInstance'.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); // FIXME: Maybe remove this test.
- addSlowCase(branchTest32(Zero, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(ImplementsHasInstance))); // FIXME: TOT checks ImplementsDefaultHasInstance.
-
- // If value is not an Object, return false.
- emitLoadTag(value, regT0);
- Jump valueIsImmediate = branch32(NotEqual, regT0, Imm32(JSValue::CellTag));
- loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- Jump valueIsNotObject = branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)); // FIXME: Maybe remove this test.
-
- // Check proto is object.
- loadPtr(Address(regT1, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)));
+ addSlowCase(branchTest32(Zero, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(ImplementsDefaultHasInstance)));
// Optimistically load the result true, and start looping.
// Initially, regT1 still contains proto and regT2 still contains value.
@@ -491,16 +479,14 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction)
move(Imm32(JSValue::TrueTag), regT0);
Label loop(this);
- // Load the prototype of the object in regT2. If this is equal to regT1 - WIN!
+ // Load the prototype of the cell in regT2. If this is equal to regT1 - WIN!
// Otherwise, check if we've hit null - if we have then drop out of the loop, if not go again.
loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
load32(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), regT2);
Jump isInstance = branchPtr(Equal, regT2, regT1);
- branch32(NotEqual, regT2, Imm32(0), loop);
+ branchTest32(NonZero, regT2).linkTo(loop, this);
// We get here either by dropping out of the loop, or if value was not an Object. Result is false.
- valueIsImmediate.link(this);
- valueIsNotObject.link(this);
move(Imm32(JSValue::FalseTag), regT0);
// isInstance jumps right down to here, to skip setting the result to false (it has already set true).
@@ -515,11 +501,10 @@ void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCas
unsigned baseVal = currentInstruction[3].u.operand;
unsigned proto = currentInstruction[4].u.operand;
+ linkSlowCaseIfNotJSCell(iter, value);
linkSlowCaseIfNotJSCell(iter, baseVal);
linkSlowCaseIfNotJSCell(iter, proto);
linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
JITStubCall stubCall(this, cti_op_instanceof);
stubCall.addArgument(value);
@@ -674,12 +659,12 @@ void JIT::emit_op_loop_if_true(Instruction* currentInstruction)
emitLoad(cond, regT1, regT0);
Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag));
- addJump(branch32(NotEqual, regT0, Imm32(0)), target + 2);
+ addJump(branch32(NotEqual, regT0, Imm32(0)), target);
Jump isNotZero = jump();
isNotInteger.link(this);
- addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target + 2);
+ addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target);
addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::FalseTag)));
isNotZero.link(this);
@@ -695,7 +680,7 @@ void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowC
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(cond);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 2);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
void JIT::emit_op_resolve_base(Instruction* currentInstruction)
@@ -788,11 +773,11 @@ void JIT::emit_op_jfalse(Instruction* currentInstruction)
emitLoad(cond, regT1, regT0);
Jump isTrue = branch32(Equal, regT1, Imm32(JSValue::TrueTag));
- addJump(branch32(Equal, regT1, Imm32(JSValue::FalseTag)), target + 2);
+ addJump(branch32(Equal, regT1, Imm32(JSValue::FalseTag)), target);
Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag));
Jump isTrue2 = branch32(NotEqual, regT0, Imm32(0));
- addJump(jump(), target + 2);
+ addJump(jump(), target);
if (supportsFloatingPoint()) {
isNotInteger.link(this);
@@ -801,7 +786,7 @@ void JIT::emit_op_jfalse(Instruction* currentInstruction)
zeroDouble(fpRegT0);
emitLoadDouble(cond, fpRegT1);
- addJump(branchDouble(DoubleEqual, fpRegT0, fpRegT1), target + 2);
+ addJump(branchDouble(DoubleEqual, fpRegT0, fpRegT1), target);
} else
addSlowCase(isNotInteger);
@@ -818,7 +803,7 @@ void JIT::emitSlow_op_jfalse(Instruction* currentInstruction, Vector<SlowCaseEnt
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(cond);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), target + 2); // Inverted.
+ emitJumpSlowToHot(branchTest32(Zero, regT0), target); // Inverted.
}
void JIT::emit_op_jtrue(Instruction* currentInstruction)
@@ -829,11 +814,11 @@ void JIT::emit_op_jtrue(Instruction* currentInstruction)
emitLoad(cond, regT1, regT0);
Jump isFalse = branch32(Equal, regT1, Imm32(JSValue::FalseTag));
- addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target + 2);
+ addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target);
Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag));
Jump isFalse2 = branch32(Equal, regT0, Imm32(0));
- addJump(jump(), target + 2);
+ addJump(jump(), target);
if (supportsFloatingPoint()) {
isNotInteger.link(this);
@@ -842,7 +827,7 @@ void JIT::emit_op_jtrue(Instruction* currentInstruction)
zeroDouble(fpRegT0);
emitLoadDouble(cond, fpRegT1);
- addJump(branchDouble(DoubleNotEqual, fpRegT0, fpRegT1), target + 2);
+ addJump(branchDouble(DoubleNotEqual, fpRegT0, fpRegT1), target);
} else
addSlowCase(isNotInteger);
@@ -859,7 +844,7 @@ void JIT::emitSlow_op_jtrue(Instruction* currentInstruction, Vector<SlowCaseEntr
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(cond);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 2);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
void JIT::emit_op_jeq_null(Instruction* currentInstruction)
@@ -873,7 +858,7 @@ void JIT::emit_op_jeq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);
+ addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target);
Jump wasNotImmediate = jump();
@@ -884,7 +869,7 @@ void JIT::emit_op_jeq_null(Instruction* currentInstruction)
set32(Equal, regT1, Imm32(JSValue::UndefinedTag), regT1);
or32(regT2, regT1);
- addJump(branchTest32(NonZero, regT1), target + 2);
+ addJump(branchTest32(NonZero, regT1), target);
wasNotImmediate.link(this);
}
@@ -900,7 +885,7 @@ void JIT::emit_op_jneq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);
+ addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target);
Jump wasNotImmediate = jump();
@@ -911,7 +896,7 @@ void JIT::emit_op_jneq_null(Instruction* currentInstruction)
set32(Equal, regT1, Imm32(JSValue::UndefinedTag), regT1);
or32(regT2, regT1);
- addJump(branchTest32(Zero, regT1), target + 2);
+ addJump(branchTest32(Zero, regT1), target);
wasNotImmediate.link(this);
}
@@ -923,8 +908,8 @@ void JIT::emit_op_jneq_ptr(Instruction* currentInstruction)
unsigned target = currentInstruction[3].u.operand;
emitLoad(src, regT1, regT0);
- addJump(branch32(NotEqual, regT1, Imm32(JSValue::CellTag)), target + 3);
- addJump(branchPtr(NotEqual, regT0, ImmPtr(ptr)), target + 3);
+ addJump(branch32(NotEqual, regT1, Imm32(JSValue::CellTag)), target);
+ addJump(branchPtr(NotEqual, regT0, ImmPtr(ptr)), target);
}
void JIT::emit_op_jsr(Instruction* currentInstruction)
@@ -932,7 +917,7 @@ void JIT::emit_op_jsr(Instruction* currentInstruction)
int retAddrDst = currentInstruction[1].u.operand;
int target = currentInstruction[2].u.operand;
DataLabelPtr storeLocation = storePtrWithPatch(ImmPtr(0), Address(callFrameRegister, sizeof(Register) * retAddrDst));
- addJump(jump(), target + 2);
+ addJump(jump(), target);
m_jsrSites.append(JSRInfo(storeLocation, label()));
}
@@ -1198,23 +1183,109 @@ void JIT::emit_op_throw(Instruction* currentInstruction)
#endif
}
+void JIT::emit_op_get_pnames(Instruction* currentInstruction)
+{
+ int dst = currentInstruction[1].u.operand;
+ int base = currentInstruction[2].u.operand;
+ int i = currentInstruction[3].u.operand;
+ int size = currentInstruction[4].u.operand;
+ int breakTarget = currentInstruction[5].u.operand;
+
+ JumpList isNotObject;
+
+ emitLoad(base, regT1, regT0);
+ if (!m_codeBlock->isKnownNotImmediate(base))
+ isNotObject.append(branch32(NotEqual, regT1, Imm32(JSValue::CellTag)));
+ if (base != m_codeBlock->thisRegister()) {
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ isNotObject.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)));
+ }
+
+ // We could inline the case where you have a valid cache, but
+ // this call doesn't seem to be hot.
+ Label isObject(this);
+ JITStubCall getPnamesStubCall(this, cti_op_get_pnames);
+ getPnamesStubCall.addArgument(regT0);
+ getPnamesStubCall.call(dst);
+ load32(Address(regT0, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStringsSize)), regT3);
+ store32(Imm32(0), addressFor(i));
+ store32(regT3, addressFor(size));
+ Jump end = jump();
+
+ isNotObject.link(this);
+ addJump(branch32(Equal, regT1, Imm32(JSValue::NullTag)), breakTarget);
+ addJump(branch32(Equal, regT1, Imm32(JSValue::UndefinedTag)), breakTarget);
+ JITStubCall toObjectStubCall(this, cti_to_object);
+ toObjectStubCall.addArgument(regT1, regT0);
+ toObjectStubCall.call(base);
+ jump().linkTo(isObject, this);
+
+ end.link(this);
+}
+
void JIT::emit_op_next_pname(Instruction* currentInstruction)
{
int dst = currentInstruction[1].u.operand;
- int iter = currentInstruction[2].u.operand;
- int target = currentInstruction[3].u.operand;
+ int base = currentInstruction[2].u.operand;
+ int i = currentInstruction[3].u.operand;
+ int size = currentInstruction[4].u.operand;
+ int it = currentInstruction[5].u.operand;
+ int target = currentInstruction[6].u.operand;
+
+ JumpList callHasProperty;
+
+ Label begin(this);
+ load32(addressFor(i), regT0);
+ Jump end = branch32(Equal, regT0, addressFor(size));
+
+ // Grab key @ i
+ loadPtr(addressFor(it), regT1);
+ loadPtr(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStrings)), regT2);
+ load32(BaseIndex(regT2, regT0, TimesEight), regT2);
+ store32(Imm32(JSValue::CellTag), tagFor(dst));
+ store32(regT2, payloadFor(dst));
- load32(Address(callFrameRegister, (iter * sizeof(Register))), regT0);
+ // Increment i
+ add32(Imm32(1), regT0);
+ store32(regT0, addressFor(i));
+
+ // Verify that i is valid:
+ loadPtr(addressFor(base), regT0);
+
+ // Test base's structure
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ callHasProperty.append(branchPtr(NotEqual, regT2, Address(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_cachedStructure)))));
- JITStubCall stubCall(this, cti_op_next_pname);
+ // Test base's prototype chain
+ loadPtr(Address(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_cachedPrototypeChain))), regT3);
+ loadPtr(Address(regT3, OBJECT_OFFSETOF(StructureChain, m_vector)), regT3);
+ addJump(branchTestPtr(Zero, Address(regT3)), target);
+
+ Label checkPrototype(this);
+ callHasProperty.append(branch32(Equal, Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype) + OBJECT_OFFSETOF(JSValue, u.asBits.tag)), Imm32(JSValue::NullTag)));
+ loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), regT2);
+ loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ callHasProperty.append(branchPtr(NotEqual, regT2, Address(regT3)));
+ addPtr(Imm32(sizeof(Structure*)), regT3);
+ branchTestPtr(NonZero, Address(regT3)).linkTo(checkPrototype, this);
+
+ // Continue loop.
+ addJump(jump(), target);
+
+ // Slow case: Ask the object if i is valid.
+ callHasProperty.link(this);
+ loadPtr(addressFor(dst), regT1);
+ JITStubCall stubCall(this, cti_has_property);
stubCall.addArgument(regT0);
+ stubCall.addArgument(regT1);
stubCall.call();
- Jump endOfIter = branchTestPtr(Zero, regT0);
- emitStore(dst, regT1, regT0);
- map(m_bytecodeIndex + OPCODE_LENGTH(op_next_pname), dst, regT1, regT0);
- addJump(jump(), target + 3);
- endOfIter.link(this);
+ // Test for valid key.
+ addJump(branchTest32(NonZero, regT0), target);
+ jump().linkTo(begin, this);
+
+ // End of loop.
+ end.link(this);
}
void JIT::emit_op_push_scope(Instruction* currentInstruction)
@@ -1237,7 +1308,7 @@ void JIT::emit_op_to_jsnumber(Instruction* currentInstruction)
emitLoad(src, regT1, regT0);
Jump isInt32 = branch32(Equal, regT1, Imm32(JSValue::Int32Tag));
- addSlowCase(branch32(AboveOrEqual, regT1, Imm32(JSValue::DeletedValueTag)));
+ addSlowCase(branch32(AboveOrEqual, regT1, Imm32(JSValue::EmptyValueTag)));
isInt32.link(this);
if (src != dst)
@@ -1284,7 +1355,7 @@ void JIT::emit_op_jmp_scopes(Instruction* currentInstruction)
JITStubCall stubCall(this, cti_op_jmp_scopes);
stubCall.addArgument(Imm32(currentInstruction[1].u.operand));
stubCall.call();
- addJump(jump(), currentInstruction[2].u.operand + 2);
+ addJump(jump(), currentInstruction[2].u.operand);
}
void JIT::emit_op_switch_imm(Instruction* currentInstruction)
@@ -1381,8 +1452,7 @@ void JIT::emit_op_enter_with_activation(Instruction* currentInstruction)
void JIT::emit_op_create_arguments(Instruction*)
{
- Jump argsNotCell = branch32(NotEqual, tagFor(RegisterFile::ArgumentsRegister, callFrameRegister), Imm32(JSValue::CellTag));
- Jump argsNotNull = branchTestPtr(NonZero, payloadFor(RegisterFile::ArgumentsRegister, callFrameRegister));
+ Jump argsCreated = branch32(NotEqual, tagFor(RegisterFile::ArgumentsRegister, callFrameRegister), Imm32(JSValue::EmptyValueTag));
// If we get here the arguments pointer is a null cell - i.e. arguments need lazy creation.
if (m_codeBlock->m_numParameters == 1)
@@ -1390,8 +1460,7 @@ void JIT::emit_op_create_arguments(Instruction*)
else
JITStubCall(this, cti_op_create_arguments).call();
- argsNotCell.link(this);
- argsNotNull.link(this);
+ argsCreated.link(this);
}
void JIT::emit_op_init_arguments(Instruction*)
@@ -1754,7 +1823,7 @@ void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executable
emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1);
move(ImmPtr(&globalData->exceptionLocation), regT2);
storePtr(regT1, regT2);
- move(ImmPtr(reinterpret_cast<void*>(ctiVMThrowTrampoline)), regT2);
+ move(ImmPtr(FunctionPtr(ctiVMThrowTrampoline).value()), regT2);
emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister);
poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*));
restoreReturnAddressBeforeReturn(regT2);
@@ -1830,8 +1899,8 @@ void JIT::emit_op_end(Instruction* currentInstruction)
void JIT::emit_op_jmp(Instruction* currentInstruction)
{
unsigned target = currentInstruction[1].u.operand;
- addJump(jump(), target + 1);
- RECORD_JUMP_TARGET(target + 1);
+ addJump(jump(), target);
+ RECORD_JUMP_TARGET(target);
}
void JIT::emit_op_loop(Instruction* currentInstruction)
@@ -1839,7 +1908,7 @@ void JIT::emit_op_loop(Instruction* currentInstruction)
emitTimeoutCheck();
unsigned target = currentInstruction[1].u.operand;
- addJump(jump(), target + 1);
+ addJump(jump(), target);
}
void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
@@ -1857,7 +1926,7 @@ void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
#else
int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2)));
#endif
- addJump(branch32(LessThan, regT0, Imm32(op2imm)), target + 3);
+ addJump(branch32(LessThan, regT0, Imm32(op2imm)), target);
} else if (isOperandConstantImmediateInt(op1)) {
emitGetVirtualRegister(op2, regT0);
emitJumpSlowCaseIfNotImmediateInteger(regT0);
@@ -1866,12 +1935,12 @@ void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
#else
int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1)));
#endif
- addJump(branch32(GreaterThan, regT0, Imm32(op1imm)), target + 3);
+ addJump(branch32(GreaterThan, regT0, Imm32(op1imm)), target);
} else {
emitGetVirtualRegisters(op1, regT0, op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT0);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
- addJump(branch32(LessThan, regT0, regT1), target + 3);
+ addJump(branch32(LessThan, regT0, regT1), target);
}
}
@@ -1890,12 +1959,12 @@ void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction)
#else
int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2)));
#endif
- addJump(branch32(LessThanOrEqual, regT0, Imm32(op2imm)), target + 3);
+ addJump(branch32(LessThanOrEqual, regT0, Imm32(op2imm)), target);
} else {
emitGetVirtualRegisters(op1, regT0, op2, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT0);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
- addJump(branch32(LessThanOrEqual, regT0, regT1), target + 3);
+ addJump(branch32(LessThanOrEqual, regT0, regT1), target);
}
}
@@ -1906,30 +1975,26 @@ void JIT::emit_op_new_object(Instruction* currentInstruction)
void JIT::emit_op_instanceof(Instruction* currentInstruction)
{
+ unsigned dst = currentInstruction[1].u.operand;
+ unsigned value = currentInstruction[2].u.operand;
+ unsigned baseVal = currentInstruction[3].u.operand;
+ unsigned proto = currentInstruction[4].u.operand;
+
// Load the operands (baseVal, proto, and value respectively) into registers.
// We use regT0 for baseVal since we will be done with this first, and we can then use it for the result.
- emitGetVirtualRegister(currentInstruction[3].u.operand, regT0);
- emitGetVirtualRegister(currentInstruction[4].u.operand, regT1);
- emitGetVirtualRegister(currentInstruction[2].u.operand, regT2);
+ emitGetVirtualRegister(value, regT2);
+ emitGetVirtualRegister(baseVal, regT0);
+ emitGetVirtualRegister(proto, regT1);
// Check that baseVal & proto are cells.
- emitJumpSlowCaseIfNotJSCell(regT0);
- emitJumpSlowCaseIfNotJSCell(regT1);
+ emitJumpSlowCaseIfNotJSCell(regT2, value);
+ emitJumpSlowCaseIfNotJSCell(regT0, baseVal);
+ emitJumpSlowCaseIfNotJSCell(regT1, proto);
- // Check that baseVal is an object, that it 'ImplementsHasInstance' but that it does not 'OverridesHasInstance'.
+ // Check that baseVal 'ImplementsDefaultHasInstance'.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)));
addSlowCase(branchTest32(Zero, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(ImplementsDefaultHasInstance)));
- // If value is not an Object, return false.
- Jump valueIsImmediate = emitJumpIfNotJSCell(regT2);
- loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- Jump valueIsNotObject = branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType));
-
- // Check proto is object.
- loadPtr(Address(regT1, OBJECT_OFFSETOF(JSCell, m_structure)), regT0);
- addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)));
-
// Optimistically load the result true, and start looping.
// Initially, regT1 still contains proto and regT2 still contains value.
// As we loop regT2 will be updated with its prototype, recursively walking the prototype chain.
@@ -1941,16 +2006,14 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction)
loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2);
Jump isInstance = branchPtr(Equal, regT2, regT1);
- branchPtr(NotEqual, regT2, ImmPtr(JSValue::encode(jsNull())), loop);
+ emitJumpIfJSCell(regT2).linkTo(loop, this);
// We get here either by dropping out of the loop, or if value was not an Object. Result is false.
- valueIsImmediate.link(this);
- valueIsNotObject.link(this);
move(ImmPtr(JSValue::encode(jsBoolean(false))), regT0);
// isInstance jumps right down to here, to skip setting the result to false (it has already set true).
isInstance.link(this);
- emitPutVirtualRegister(currentInstruction[1].u.operand);
+ emitPutVirtualRegister(dst);
}
void JIT::emit_op_new_func(Instruction* currentInstruction)
@@ -2127,9 +2190,9 @@ void JIT::emit_op_loop_if_true(Instruction* currentInstruction)
emitGetVirtualRegister(currentInstruction[1].u.operand, regT0);
Jump isZero = branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0))));
- addJump(emitJumpIfImmediateInteger(regT0), target + 2);
+ addJump(emitJumpIfImmediateInteger(regT0), target);
- addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(true)))), target + 2);
+ addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(true)))), target);
addSlowCase(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(jsBoolean(false)))));
isZero.link(this);
@@ -2196,14 +2259,14 @@ void JIT::emit_op_jfalse(Instruction* currentInstruction)
unsigned target = currentInstruction[2].u.operand;
emitGetVirtualRegister(currentInstruction[1].u.operand, regT0);
- addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0)))), target + 2);
+ addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0)))), target);
Jump isNonZero = emitJumpIfImmediateInteger(regT0);
- addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(false)))), target + 2);
+ addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(false)))), target);
addSlowCase(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(jsBoolean(true)))));
isNonZero.link(this);
- RECORD_JUMP_TARGET(target + 2);
+ RECORD_JUMP_TARGET(target);
};
void JIT::emit_op_jeq_null(Instruction* currentInstruction)
{
@@ -2215,16 +2278,16 @@ void JIT::emit_op_jeq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);
+ addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target);
Jump wasNotImmediate = jump();
// Now handle the immediate cases - undefined & null
isImmediate.link(this);
andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), regT0);
- addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNull()))), target + 2);
+ addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNull()))), target);
wasNotImmediate.link(this);
- RECORD_JUMP_TARGET(target + 2);
+ RECORD_JUMP_TARGET(target);
};
void JIT::emit_op_jneq_null(Instruction* currentInstruction)
{
@@ -2236,16 +2299,16 @@ void JIT::emit_op_jneq_null(Instruction* currentInstruction)
// First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure.
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);
+ addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target);
Jump wasNotImmediate = jump();
// Now handle the immediate cases - undefined & null
isImmediate.link(this);
andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), regT0);
- addJump(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(jsNull()))), target + 2);
+ addJump(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(jsNull()))), target);
wasNotImmediate.link(this);
- RECORD_JUMP_TARGET(target + 2);
+ RECORD_JUMP_TARGET(target);
}
void JIT::emit_op_jneq_ptr(Instruction* currentInstruction)
@@ -2255,9 +2318,9 @@ void JIT::emit_op_jneq_ptr(Instruction* currentInstruction)
unsigned target = currentInstruction[3].u.operand;
emitGetVirtualRegister(src, regT0);
- addJump(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(JSValue(ptr)))), target + 3);
+ addJump(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(JSValue(ptr)))), target);
- RECORD_JUMP_TARGET(target + 3);
+ RECORD_JUMP_TARGET(target);
}
void JIT::emit_op_jsr(Instruction* currentInstruction)
@@ -2265,10 +2328,10 @@ void JIT::emit_op_jsr(Instruction* currentInstruction)
int retAddrDst = currentInstruction[1].u.operand;
int target = currentInstruction[2].u.operand;
DataLabelPtr storeLocation = storePtrWithPatch(ImmPtr(0), Address(callFrameRegister, sizeof(Register) * retAddrDst));
- addJump(jump(), target + 2);
+ addJump(jump(), target);
m_jsrSites.append(JSRInfo(storeLocation, label()));
killLastResultRegister();
- RECORD_JUMP_TARGET(target + 2);
+ RECORD_JUMP_TARGET(target);
}
void JIT::emit_op_sret(Instruction* currentInstruction)
@@ -2320,13 +2383,13 @@ void JIT::emit_op_jtrue(Instruction* currentInstruction)
emitGetVirtualRegister(currentInstruction[1].u.operand, regT0);
Jump isZero = branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0))));
- addJump(emitJumpIfImmediateInteger(regT0), target + 2);
+ addJump(emitJumpIfImmediateInteger(regT0), target);
- addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(true)))), target + 2);
+ addJump(branchPtr(Equal, regT0, ImmPtr(JSValue::encode(jsBoolean(true)))), target);
addSlowCase(branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(jsBoolean(false)))));
isZero.link(this);
- RECORD_JUMP_TARGET(target + 2);
+ RECORD_JUMP_TARGET(target);
}
void JIT::emit_op_neq(Instruction* currentInstruction)
@@ -2377,15 +2440,110 @@ void JIT::emit_op_throw(Instruction* currentInstruction)
#endif
}
+void JIT::emit_op_get_pnames(Instruction* currentInstruction)
+{
+ int dst = currentInstruction[1].u.operand;
+ int base = currentInstruction[2].u.operand;
+ int i = currentInstruction[3].u.operand;
+ int size = currentInstruction[4].u.operand;
+ int breakTarget = currentInstruction[5].u.operand;
+
+ JumpList isNotObject;
+
+ emitGetVirtualRegister(base, regT0);
+ if (!m_codeBlock->isKnownNotImmediate(base))
+ isNotObject.append(emitJumpIfNotJSCell(regT0));
+ if (base != m_codeBlock->thisRegister()) {
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ isNotObject.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)));
+ }
+
+ // We could inline the case where you have a valid cache, but
+ // this call doesn't seem to be hot.
+ Label isObject(this);
+ JITStubCall getPnamesStubCall(this, cti_op_get_pnames);
+ getPnamesStubCall.addArgument(regT0);
+ getPnamesStubCall.call(dst);
+ load32(Address(regT0, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStringsSize)), regT3);
+ store32(Imm32(0), addressFor(i));
+ store32(regT3, addressFor(size));
+ Jump end = jump();
+
+ isNotObject.link(this);
+ move(regT0, regT1);
+ and32(Imm32(~JSImmediate::ExtendedTagBitUndefined), regT1);
+ addJump(branch32(Equal, regT1, Imm32(JSImmediate::FullTagTypeNull)), breakTarget);
+
+ JITStubCall toObjectStubCall(this, cti_to_object);
+ toObjectStubCall.addArgument(regT0);
+ toObjectStubCall.call(base);
+ jump().linkTo(isObject, this);
+
+ end.link(this);
+}
+
void JIT::emit_op_next_pname(Instruction* currentInstruction)
{
- JITStubCall stubCall(this, cti_op_next_pname);
- stubCall.addArgument(currentInstruction[2].u.operand, regT2);
+ int dst = currentInstruction[1].u.operand;
+ int base = currentInstruction[2].u.operand;
+ int i = currentInstruction[3].u.operand;
+ int size = currentInstruction[4].u.operand;
+ int it = currentInstruction[5].u.operand;
+ int target = currentInstruction[6].u.operand;
+
+ JumpList callHasProperty;
+
+ Label begin(this);
+ load32(addressFor(i), regT0);
+ Jump end = branch32(Equal, regT0, addressFor(size));
+
+ // Grab key @ i
+ loadPtr(addressFor(it), regT1);
+ loadPtr(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStrings)), regT2);
+ loadPtr(BaseIndex(regT2, regT0, TimesEight), regT2);
+ emitPutVirtualRegister(dst, regT2);
+
+ // Increment i
+ add32(Imm32(1), regT0);
+ store32(regT0, addressFor(i));
+
+ // Verify that i is valid:
+ emitGetVirtualRegister(base, regT0);
+
+ // Test base's structure
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ callHasProperty.append(branchPtr(NotEqual, regT2, Address(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_cachedStructure)))));
+
+ // Test base's prototype chain
+ loadPtr(Address(Address(regT1, OBJECT_OFFSETOF(JSPropertyNameIterator, m_cachedPrototypeChain))), regT3);
+ loadPtr(Address(regT3, OBJECT_OFFSETOF(StructureChain, m_vector)), regT3);
+ addJump(branchTestPtr(Zero, Address(regT3)), target);
+
+ Label checkPrototype(this);
+ loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2);
+ callHasProperty.append(emitJumpIfNotJSCell(regT2));
+ loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
+ callHasProperty.append(branchPtr(NotEqual, regT2, Address(regT3)));
+ addPtr(Imm32(sizeof(Structure*)), regT3);
+ branchTestPtr(NonZero, Address(regT3)).linkTo(checkPrototype, this);
+
+ // Continue loop.
+ addJump(jump(), target);
+
+ // Slow case: Ask the object if i is valid.
+ callHasProperty.link(this);
+ emitGetVirtualRegister(dst, regT1);
+ JITStubCall stubCall(this, cti_has_property);
+ stubCall.addArgument(regT0);
+ stubCall.addArgument(regT1);
stubCall.call();
- Jump endOfIter = branchTestPtr(Zero, regT0);
- emitPutVirtualRegister(currentInstruction[1].u.operand);
- addJump(jump(), currentInstruction[3].u.operand + 3);
- endOfIter.link(this);
+
+ // Test for valid key.
+ addJump(branchTest32(NonZero, regT0), target);
+ jump().linkTo(begin, this);
+
+ // End of loop.
+ end.link(this);
}
void JIT::emit_op_push_scope(Instruction* currentInstruction)
@@ -2469,8 +2627,8 @@ void JIT::emit_op_jmp_scopes(Instruction* currentInstruction)
JITStubCall stubCall(this, cti_op_jmp_scopes);
stubCall.addArgument(Imm32(currentInstruction[1].u.operand));
stubCall.call();
- addJump(jump(), currentInstruction[2].u.operand + 2);
- RECORD_JUMP_TARGET(currentInstruction[2].u.operand + 2);
+ addJump(jump(), currentInstruction[2].u.operand);
+ RECORD_JUMP_TARGET(currentInstruction[2].u.operand);
}
void JIT::emit_op_switch_imm(Instruction* currentInstruction)
@@ -2696,32 +2854,20 @@ void JIT::emitSlow_op_to_primitive(Instruction* currentInstruction, Vector<SlowC
void JIT::emitSlow_op_get_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- // The slow void JIT::emitSlow_that handles accesses to arrays (below) may jump back up to here.
- Label beginGetByValSlow(this);
+ unsigned dst = currentInstruction[1].u.operand;
+ unsigned base = currentInstruction[2].u.operand;
+ unsigned property = currentInstruction[3].u.operand;
- Jump notImm = getSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- emitFastArithIntToImmNoCheck(regT1, regT1);
+ linkSlowCase(iter); // property int32 check
+ linkSlowCaseIfNotJSCell(iter, base); // base cell check
+ linkSlowCase(iter); // base array check
+ linkSlowCase(iter); // vector length check
+ linkSlowCase(iter); // empty value
- notImm.link(this);
JITStubCall stubCall(this, cti_op_get_by_val);
- stubCall.addArgument(regT0);
- stubCall.addArgument(regT1);
- stubCall.call(currentInstruction[1].u.operand);
- emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val));
-
- // This is slow void JIT::emitSlow_that handles accesses to arrays above the fast cut-off.
- // First, check if this is an access to the vector
- linkSlowCase(iter);
- branch32(AboveOrEqual, regT1, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)), beginGetByValSlow);
-
- // okay, missed the fast region, but it is still in the vector. Get the value.
- loadPtr(BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT2);
- // Check whether the value loaded is zero; if so we need to return undefined.
- branchTestPtr(Zero, regT2, beginGetByValSlow);
- move(regT2, regT0);
- emitPutVirtualRegister(currentInstruction[1].u.operand, regT0);
+ stubCall.addArgument(base, regT2);
+ stubCall.addArgument(property, regT2);
+ stubCall.call(dst);
}
void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -2735,14 +2881,14 @@ void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowC
stubCall.addArgument(regT0);
stubCall.addArgument(op2, regT2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
} else if (isOperandConstantImmediateInt(op1)) {
linkSlowCase(iter);
JITStubCall stubCall(this, cti_op_loop_if_less);
stubCall.addArgument(op1, regT2);
stubCall.addArgument(regT0);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
} else {
linkSlowCase(iter);
linkSlowCase(iter);
@@ -2750,7 +2896,7 @@ void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowC
stubCall.addArgument(regT0);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
}
@@ -2764,7 +2910,7 @@ void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<Slo
stubCall.addArgument(regT0);
stubCall.addArgument(currentInstruction[2].u.operand, regT2);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
} else {
linkSlowCase(iter);
linkSlowCase(iter);
@@ -2772,36 +2918,26 @@ void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<Slo
stubCall.addArgument(regT0);
stubCall.addArgument(regT1);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), target);
}
}
void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- // Normal slow cases - either is not an immediate imm, or is an array.
- Jump notImm = getSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- emitFastArithIntToImmNoCheck(regT1, regT1);
+ unsigned base = currentInstruction[1].u.operand;
+ unsigned property = currentInstruction[2].u.operand;
+ unsigned value = currentInstruction[3].u.operand;
- notImm.link(this); {
- JITStubCall stubCall(this, cti_op_put_by_val);
- stubCall.addArgument(regT0);
- stubCall.addArgument(regT1);
- stubCall.addArgument(currentInstruction[3].u.operand, regT2);
- stubCall.call();
- emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_put_by_val));
- }
+ linkSlowCase(iter); // property int32 check
+ linkSlowCaseIfNotJSCell(iter, base); // base cell check
+ linkSlowCase(iter); // base not array check
+ linkSlowCase(iter); // in vector check
- // slow cases for immediate int accesses to arrays
- linkSlowCase(iter);
- linkSlowCase(iter); {
- JITStubCall stubCall(this, cti_op_put_by_val_array);
- stubCall.addArgument(regT0);
- stubCall.addArgument(regT1);
- stubCall.addArgument(currentInstruction[3].u.operand, regT2);
- stubCall.call();
- }
+ JITStubCall stubPutByValCall(this, cti_op_put_by_val);
+ stubPutByValCall.addArgument(regT0);
+ stubPutByValCall.addArgument(property, regT2);
+ stubPutByValCall.addArgument(value, regT2);
+ stubPutByValCall.call();
}
void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -2810,7 +2946,7 @@ void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowC
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(regT0);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand + 2);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand);
}
void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -2828,7 +2964,7 @@ void JIT::emitSlow_op_jfalse(Instruction* currentInstruction, Vector<SlowCaseEnt
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(regT0);
stubCall.call();
- emitJumpSlowToHot(branchTest32(Zero, regT0), currentInstruction[2].u.operand + 2); // inverted!
+ emitJumpSlowToHot(branchTest32(Zero, regT0), currentInstruction[2].u.operand); // inverted!
}
void JIT::emitSlow_op_bitnot(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -2845,7 +2981,7 @@ void JIT::emitSlow_op_jtrue(Instruction* currentInstruction, Vector<SlowCaseEntr
JITStubCall stubCall(this, cti_op_jtrue);
stubCall.addArgument(regT0);
stubCall.call();
- emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand + 2);
+ emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand);
}
void JIT::emitSlow_op_bitxor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -2911,16 +3047,20 @@ void JIT::emitSlow_op_nstricteq(Instruction* currentInstruction, Vector<SlowCase
void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
{
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
- linkSlowCase(iter);
+ unsigned dst = currentInstruction[1].u.operand;
+ unsigned value = currentInstruction[2].u.operand;
+ unsigned baseVal = currentInstruction[3].u.operand;
+ unsigned proto = currentInstruction[4].u.operand;
+
+ linkSlowCaseIfNotJSCell(iter, value);
+ linkSlowCaseIfNotJSCell(iter, baseVal);
+ linkSlowCaseIfNotJSCell(iter, proto);
linkSlowCase(iter);
JITStubCall stubCall(this, cti_op_instanceof);
- stubCall.addArgument(currentInstruction[2].u.operand, regT2);
- stubCall.addArgument(currentInstruction[3].u.operand, regT2);
- stubCall.addArgument(currentInstruction[4].u.operand, regT2);
- stubCall.call(currentInstruction[1].u.operand);
+ stubCall.addArgument(value, regT2);
+ stubCall.addArgument(baseVal, regT2);
+ stubCall.addArgument(proto, regT2);
+ stubCall.call(dst);
}
void JIT::emitSlow_op_call(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp
index 08b3096..4241111 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITPropertyAccess.cpp
@@ -273,11 +273,14 @@ void JIT::emit_op_get_by_val(Instruction* currentInstruction)
addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
emitJumpSlowCaseIfNotJSCell(base, regT1);
addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)));
- addSlowCase(branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff))));
- loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT0);
- load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), regT1); // tag
- load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); // payload
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT3);
+ addSlowCase(branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_vectorLength))));
+
+ load32(BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), regT1); // tag
+ load32(BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); // payload
+ addSlowCase(branch32(Equal, regT1, Imm32(JSValue::EmptyValueTag)));
+
emitStore(dst, regT1, regT0);
map(m_bytecodeIndex + OPCODE_LENGTH(op_get_by_val), dst, regT1, regT0);
}
@@ -288,35 +291,16 @@ void JIT::emitSlow_op_get_by_val(Instruction* currentInstruction, Vector<SlowCas
unsigned base = currentInstruction[2].u.operand;
unsigned property = currentInstruction[3].u.operand;
- // The slow void JIT::emitSlow_that handles accesses to arrays (below) may jump back up to here.
- Label callGetByValJITStub(this);
-
linkSlowCase(iter); // property int32 check
linkSlowCaseIfNotJSCell(iter, base); // base cell check
linkSlowCase(iter); // base array check
+ linkSlowCase(iter); // vector length check
+ linkSlowCase(iter); // empty value
JITStubCall stubCall(this, cti_op_get_by_val);
stubCall.addArgument(base);
stubCall.addArgument(property);
stubCall.call(dst);
-
- emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val));
-
- linkSlowCase(iter); // array fast cut-off check
-
- loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT0);
- branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)), callGetByValJITStub);
-
- // Missed the fast region, but it is still in the vector.
- load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), regT1); // tag
- load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); // payload
-
- // FIXME: Maybe we can optimize this comparison to JSValue().
- Jump skip = branch32(NotEqual, regT0, Imm32(0));
- branch32(Equal, regT1, Imm32(JSValue::CellTag), callGetByValJITStub);
-
- skip.link(this);
- emitStore(dst, regT1, regT0);
}
void JIT::emit_op_put_by_val(Instruction* currentInstruction)
@@ -330,24 +314,27 @@ void JIT::emit_op_put_by_val(Instruction* currentInstruction)
addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag)));
emitJumpSlowCaseIfNotJSCell(base, regT1);
addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)));
- loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT3);
-
- Jump inFastVector = branch32(Below, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff)));
-
- // Check if the access is within the vector.
- addSlowCase(branch32(AboveOrEqual, regT2, Address(regT3, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength))));
+ addSlowCase(branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_vectorLength))));
- // This is a write to the slow part of the vector; first, we have to check if this would be the first write to this location.
- // FIXME: should be able to handle initial write to array; increment the the number of items in the array, and potentially update fast access cutoff.
- Jump skip = branch32(NotEqual, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), Imm32(JSValue::CellTag));
- addSlowCase(branch32(Equal, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), Imm32(0)));
- skip.link(this);
+ loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT3);
- inFastVector.link(this);
+ Jump empty = branch32(Equal, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), Imm32(JSValue::EmptyValueTag));
+ Label storeResult(this);
emitLoad(value, regT1, regT0);
store32(regT0, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]))); // payload
store32(regT1, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4)); // tag
+ Jump end = jump();
+
+ empty.link(this);
+ add32(Imm32(1), Address(regT3, OBJECT_OFFSETOF(ArrayStorage, m_numValuesInVector)));
+ branch32(Below, regT2, Address(regT3, OBJECT_OFFSETOF(ArrayStorage, m_length))).linkTo(storeResult, this);
+
+ add32(Imm32(1), regT2, regT0);
+ store32(regT0, Address(regT3, OBJECT_OFFSETOF(ArrayStorage, m_length)));
+ jump().linkTo(storeResult, this);
+
+ end.link(this);
}
void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
@@ -359,24 +346,13 @@ void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCas
linkSlowCase(iter); // property int32 check
linkSlowCaseIfNotJSCell(iter, base); // base cell check
linkSlowCase(iter); // base not array check
+ linkSlowCase(iter); // in vector check
JITStubCall stubPutByValCall(this, cti_op_put_by_val);
stubPutByValCall.addArgument(base);
stubPutByValCall.addArgument(property);
stubPutByValCall.addArgument(value);
stubPutByValCall.call();
-
- emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val));
-
- // Slow cases for immediate int accesses to arrays.
- linkSlowCase(iter); // in vector check
- linkSlowCase(iter); // written to slot check
-
- JITStubCall stubCall(this, cti_op_put_by_val_array);
- stubCall.addArgument(regT1, regT0);
- stubCall.addArgument(regT2);
- stubCall.addArgument(value);
- stubCall.call();
}
void JIT::emit_op_get_by_id(Instruction* currentInstruction)
@@ -545,22 +521,26 @@ void JIT::compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID res
load32(Address(temp, offset + 4), resultTag);
}
+void JIT::testPrototype(Structure* structure, JumpList& failureCases)
+{
+ if (structure->m_prototype.isNull())
+ return;
+
+ failureCases.append(branchPtr(NotEqual, AbsoluteAddress(&asCell(structure->m_prototype)->m_structure), ImmPtr(asCell(structure->m_prototype)->m_structure)));
+}
+
void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress)
{
// It is assumed that regT0 contains the basePayload and regT1 contains the baseTag. The value can be found on the stack.
JumpList failureCases;
failureCases.append(branch32(NotEqual, regT1, Imm32(JSValue::CellTag)));
-
- loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- failureCases.append(branchPtr(NotEqual, regT2, ImmPtr(oldStructure)));
+ failureCases.append(branchPtr(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(oldStructure)));
+ testPrototype(oldStructure, failureCases);
// Verify that nothing in the prototype chain has a setter for this property.
- for (RefPtr<Structure>* it = chain->head(); *it; ++it) {
- loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2);
- loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- failureCases.append(branchPtr(NotEqual, regT2, ImmPtr(it->get())));
- }
+ for (RefPtr<Structure>* it = chain->head(); *it; ++it)
+ testPrototype(it->get(), failureCases);
// Reallocate property storage if needed.
Call callTarget;
@@ -958,12 +938,16 @@ void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* str
void JIT::emit_op_get_by_val(Instruction* currentInstruction)
{
- emitGetVirtualRegisters(currentInstruction[2].u.operand, regT0, currentInstruction[3].u.operand, regT1);
+ unsigned dst = currentInstruction[1].u.operand;
+ unsigned base = currentInstruction[2].u.operand;
+ unsigned property = currentInstruction[3].u.operand;
+
+ emitGetVirtualRegisters(base, regT0, property, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
#if USE(JSVALUE64)
// This is technically incorrect - we're zero-extending an int32. On the hot path this doesn't matter.
- // We check the value as if it was a uint32 against the m_fastAccessCutoff - which will always fail if
- // number was signed since m_fastAccessCutoff is always less than intmax (since the total allocation
+ // We check the value as if it was a uint32 against the m_vectorLength - which will always fail if
+ // number was signed since m_vectorLength is always less than intmax (since the total allocation
// size is always less than 4Gb). As such zero extending wil have been correct (and extending the value
// to 64-bits is necessary since it's used in the address calculation. We zero extend rather than sign
// extending since it makes it easier to re-tag the value in the slow case.
@@ -971,21 +955,25 @@ void JIT::emit_op_get_by_val(Instruction* currentInstruction)
#else
emitFastArithImmToInt(regT1);
#endif
- emitJumpSlowCaseIfNotJSCell(regT0);
+ emitJumpSlowCaseIfNotJSCell(regT0, base);
addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)));
- // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2);
- addSlowCase(branch32(AboveOrEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff))));
+ addSlowCase(branch32(AboveOrEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_vectorLength))));
- // Get the value from the vector
loadPtr(BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0);
- emitPutVirtualRegister(currentInstruction[1].u.operand);
+ addSlowCase(branchTestPtr(Zero, regT0));
+
+ emitPutVirtualRegister(dst);
}
void JIT::emit_op_put_by_val(Instruction* currentInstruction)
{
- emitGetVirtualRegisters(currentInstruction[1].u.operand, regT0, currentInstruction[2].u.operand, regT1);
+ unsigned base = currentInstruction[1].u.operand;
+ unsigned property = currentInstruction[2].u.operand;
+ unsigned value = currentInstruction[3].u.operand;
+
+ emitGetVirtualRegisters(base, regT0, property, regT1);
emitJumpSlowCaseIfNotImmediateInteger(regT1);
#if USE(JSVALUE64)
// See comment in op_get_by_val.
@@ -993,23 +981,29 @@ void JIT::emit_op_put_by_val(Instruction* currentInstruction)
#else
emitFastArithImmToInt(regT1);
#endif
- emitJumpSlowCaseIfNotJSCell(regT0);
+ emitJumpSlowCaseIfNotJSCell(regT0, base);
addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)));
+ addSlowCase(branch32(AboveOrEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_vectorLength))));
- // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2);
- Jump inFastVector = branch32(Below, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff)));
- // No; oh well, check if the access if within the vector - if so, we may still be okay.
- addSlowCase(branch32(AboveOrEqual, regT1, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength))));
- // This is a write to the slow part of the vector; first, we have to check if this would be the first write to this location.
- // FIXME: should be able to handle initial write to array; increment the the number of items in the array, and potentially update fast access cutoff.
- addSlowCase(branchTestPtr(Zero, BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]))));
+ Jump empty = branchTestPtr(Zero, BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])));
- // All good - put the value into the array.
- inFastVector.link(this);
- emitGetVirtualRegister(currentInstruction[3].u.operand, regT0);
+ Label storeResult(this);
+ emitGetVirtualRegister(value, regT0);
storePtr(regT0, BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])));
+ Jump end = jump();
+
+ empty.link(this);
+ add32(Imm32(1), Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_numValuesInVector)));
+ branch32(Below, regT1, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_length))).linkTo(storeResult, this);
+
+ move(regT1, regT0);
+ add32(Imm32(1), regT0);
+ store32(regT0, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_length)));
+ jump().linkTo(storeResult, this);
+
+ end.link(this);
}
void JIT::emit_op_put_by_index(Instruction* currentInstruction)
@@ -1357,35 +1351,27 @@ void JIT::compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID res
}
}
+void JIT::testPrototype(Structure* structure, JumpList& failureCases)
+{
+ if (structure->m_prototype.isNull())
+ return;
+
+ move(ImmPtr(&asCell(structure->m_prototype)->m_structure), regT2);
+ move(ImmPtr(asCell(structure->m_prototype)->m_structure), regT3);
+ failureCases.append(branchPtr(NotEqual, Address(regT2), regT3));
+}
+
void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress)
{
JumpList failureCases;
// Check eax is an object of the right Structure.
failureCases.append(emitJumpIfNotJSCell(regT0));
failureCases.append(branchPtr(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(oldStructure)));
- JumpList successCases;
-
- // ecx = baseObject
- loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- // proto(ecx) = baseObject->structure()->prototype()
- failureCases.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType)));
+ testPrototype(oldStructure, failureCases);
- loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2);
-
// ecx = baseObject->m_structure
- for (RefPtr<Structure>* it = chain->head(); *it; ++it) {
- // null check the prototype
- successCases.append(branchPtr(Equal, regT2, ImmPtr(JSValue::encode(jsNull()))));
-
- // Check the structure id
- failureCases.append(branchPtr(NotEqual, Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(it->get())));
-
- loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2);
- failureCases.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType)));
- loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2);
- }
-
- successCases.link(this);
+ for (RefPtr<Structure>* it = chain->head(); *it; ++it)
+ testPrototype(it->get(), failureCases);
Call callTarget;
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h
index cb5354b..c5ed9e3 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubCall.h
@@ -26,7 +26,7 @@
#ifndef JITStubCall_h
#define JITStubCall_h
-#include <wtf/Platform.h>
+#include "MacroAssemblerCodeRef.h"
#if ENABLE(JIT)
@@ -36,7 +36,7 @@ namespace JSC {
public:
JITStubCall(JIT* jit, JSObject* (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Cell)
, m_stackIndex(stackIndexStart)
{
@@ -44,7 +44,7 @@ namespace JSC {
JITStubCall(JIT* jit, JSPropertyNameIterator* (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Cell)
, m_stackIndex(stackIndexStart)
{
@@ -52,7 +52,7 @@ namespace JSC {
JITStubCall(JIT* jit, void* (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(VoidPtr)
, m_stackIndex(stackIndexStart)
{
@@ -60,7 +60,7 @@ namespace JSC {
JITStubCall(JIT* jit, int (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Int)
, m_stackIndex(stackIndexStart)
{
@@ -68,7 +68,7 @@ namespace JSC {
JITStubCall(JIT* jit, bool (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Int)
, m_stackIndex(stackIndexStart)
{
@@ -76,7 +76,7 @@ namespace JSC {
JITStubCall(JIT* jit, void (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Void)
, m_stackIndex(stackIndexStart)
{
@@ -85,7 +85,7 @@ namespace JSC {
#if USE(JSVALUE32_64)
JITStubCall(JIT* jit, EncodedJSValue (JIT_STUB *stub)(STUB_ARGS_DECLARATION))
: m_jit(jit)
- , m_stub(reinterpret_cast<void*>(stub))
+ , m_stub(stub)
, m_returnType(Value)
, m_stackIndex(stackIndexStart)
{
@@ -171,7 +171,7 @@ namespace JSC {
m_jit->restoreArgumentReference();
JIT::Call call = m_jit->call();
- m_jit->m_calls.append(CallRecord(call, m_jit->m_bytecodeIndex, m_stub));
+ m_jit->m_calls.append(CallRecord(call, m_jit->m_bytecodeIndex, m_stub.value()));
#if ENABLE(OPCODE_SAMPLING)
if (m_jit->m_bytecodeIndex != (unsigned)-1)
@@ -225,7 +225,7 @@ namespace JSC {
static const size_t stackIndexStart = 1; // Index 0 is reserved for restoreArgumentReference().
JIT* m_jit;
- void* m_stub;
+ FunctionPtr m_stub;
enum { Void, VoidPtr, Int, Value, Cell } m_returnType;
size_t m_stackIndex;
};
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp
index 065b7ea..90ea807 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.cpp
@@ -75,6 +75,12 @@ namespace JSC {
#define THUMB_FUNC_PARAM(name)
#endif
+#if PLATFORM(LINUX) && PLATFORM(X86_64)
+#define SYMBOL_STRING_RELOCATION(name) #name "@plt"
+#else
+#define SYMBOL_STRING_RELOCATION(name) SYMBOL_STRING(name)
+#endif
+
#if USE(JSVALUE32_64)
#if COMPILER(GCC) && PLATFORM(X86)
@@ -112,7 +118,7 @@ SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
#if !USE(JIT_STUB_ARGUMENT_VA_LIST)
"movl %esp, %ecx" "\n"
#endif
- "call " SYMBOL_STRING(cti_vm_throw) "\n"
+ "call " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"addl $0x3c, %esp" "\n"
"popl %ebx" "\n"
"popl %edi" "\n"
@@ -175,7 +181,7 @@ asm volatile (
".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
"movq %rsp, %rdi" "\n"
- "call " SYMBOL_STRING(cti_vm_throw) "\n"
+ "call " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"addq $0x48, %rsp" "\n"
"popq %rbx" "\n"
"popq %r15" "\n"
@@ -239,7 +245,7 @@ asm volatile (
".thumb_func " THUMB_FUNC_PARAM(ctiVMThrowTrampoline) "\n"
SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
"cpy r0, sp" "\n"
- "bl " SYMBOL_STRING(cti_vm_throw) "\n"
+ "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"ldr r6, [sp, #0x2c]" "\n"
"ldr r5, [sp, #0x28]" "\n"
"ldr r4, [sp, #0x24]" "\n"
@@ -365,7 +371,7 @@ SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
#if !USE(JIT_STUB_ARGUMENT_VA_LIST)
"movl %esp, %ecx" "\n"
#endif
- "call " SYMBOL_STRING(cti_vm_throw) "\n"
+ "call " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"addl $0x1c, %esp" "\n"
"popl %ebx" "\n"
"popl %edi" "\n"
@@ -434,7 +440,7 @@ asm volatile (
".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n"
SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
"movq %rsp, %rdi" "\n"
- "call " SYMBOL_STRING(cti_vm_throw) "\n"
+ "call " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"addq $0x78, %rsp" "\n"
"popq %rbx" "\n"
"popq %r15" "\n"
@@ -498,7 +504,7 @@ asm volatile (
".thumb_func " THUMB_FUNC_PARAM(ctiVMThrowTrampoline) "\n"
SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
"cpy r0, sp" "\n"
- "bl " SYMBOL_STRING(cti_vm_throw) "\n"
+ "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
"ldr r6, [sp, #0x2c]" "\n"
"ldr r5, [sp, #0x28]" "\n"
"ldr r4, [sp, #0x24]" "\n"
@@ -554,7 +560,7 @@ SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
"mov lr, r6" "\n"
"add r8, pc, #4" "\n"
"str r8, [sp, #-4]!" "\n"
- "b " SYMBOL_STRING(cti_vm_throw) "\n"
+ "b " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
// Both has the same return sequence
".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
@@ -694,11 +700,15 @@ NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* co
// Structure transition, cache transition info
if (slot.type() == PutPropertySlot::NewProperty) {
- StructureChain* prototypeChain = structure->prototypeChain(callFrame);
- if (!prototypeChain->isCacheable() || structure->isDictionary()) {
+ if (structure->isDictionary()) {
ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_put_by_id_generic));
return;
}
+
+ // put_by_id_transition checks the prototype chain for setters.
+ normalizePrototypeChain(callFrame, baseCell);
+
+ StructureChain* prototypeChain = structure->prototypeChain(callFrame);
stubInfo->initPutByIdTransition(structure->previousID(), structure, prototypeChain);
JIT::compilePutByIdTransition(callFrame->scopeChain()->globalData, codeBlock, stubInfo, structure->previousID(), structure, slot.cachedOffset(), prototypeChain, returnAddress);
return;
@@ -774,17 +784,13 @@ NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* co
return;
}
- size_t count = countPrototypeChainEntriesAndCheckForProxies(callFrame, baseValue, slot);
+ size_t count = normalizePrototypeChain(callFrame, baseValue, slot.slotBase());
if (!count) {
stubInfo->accessType = access_get_by_id_generic;
return;
}
StructureChain* prototypeChain = structure->prototypeChain(callFrame);
- if (!prototypeChain->isCacheable()) {
- ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_generic));
- return;
- }
stubInfo->initGetByIdChain(structure, prototypeChain);
JIT::compileGetByIdChain(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, structure, prototypeChain, count, slot.cachedOffset(), returnAddress);
}
@@ -1326,15 +1332,11 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_proto_list)
if (listIndex == (POLYMORPHIC_LIST_CACHE_SIZE - 1))
ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_list_full));
- } else if (size_t count = countPrototypeChainEntriesAndCheckForProxies(callFrame, baseValue, slot)) {
- StructureChain* protoChain = structure->prototypeChain(callFrame);
- if (!protoChain->isCacheable()) {
- ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail));
- return JSValue::encode(result);
- }
-
+ } else if (size_t count = normalizePrototypeChain(callFrame, baseValue, slot.slotBase())) {
int listIndex;
PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot(stubInfo, listIndex);
+
+ StructureChain* protoChain = structure->prototypeChain(callFrame);
JIT::compileGetByIdChainList(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, prototypeStructureList, listIndex, structure, protoChain, count, slot.cachedOffset());
if (listIndex == (POLYMORPHIC_LIST_CACHE_SIZE - 1))
@@ -1412,7 +1414,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_instanceof)
// ECMA-262 15.3.5.3:
// Throw an exception either if baseVal is not an object, or if it does not implement 'HasInstance' (i.e. is a function).
- TypeInfo typeInfo(UnspecifiedType, 0);
+ TypeInfo typeInfo(UnspecifiedType);
if (!baseVal.isObject() || !(typeInfo = asObject(baseVal)->structure()->typeInfo()).implementsHasInstance()) {
CallFrame* callFrame = stackFrame.callFrame;
CodeBlock* codeBlock = callFrame->codeBlock();
@@ -1942,28 +1944,6 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val)
CHECK_FOR_EXCEPTION_AT_END();
}
-DEFINE_STUB_FUNCTION(void, op_put_by_val_array)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
-
- CallFrame* callFrame = stackFrame.callFrame;
- JSValue baseValue = stackFrame.args[0].jsValue();
- int i = stackFrame.args[1].int32();
- JSValue value = stackFrame.args[2].jsValue();
-
- ASSERT(isJSArray(stackFrame.globalData, baseValue));
-
- if (LIKELY(i >= 0))
- asArray(baseValue)->JSArray::put(callFrame, i, value);
- else {
- Identifier property(callFrame, UString::from(i));
- PutPropertySlot slot;
- baseValue.put(callFrame, property, value, slot);
- }
-
- CHECK_FOR_EXCEPTION_AT_END();
-}
-
DEFINE_STUB_FUNCTION(void, op_put_by_val_byte_array)
{
STUB_INIT_STACK_FRAME(stackFrame);
@@ -2672,7 +2652,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_throw)
if (!handler) {
*stackFrame.exception = exceptionValue;
- STUB_SET_RETURN_ADDRESS(reinterpret_cast<void*>(ctiOpThrowNotCaught));
+ STUB_SET_RETURN_ADDRESS(FunctionPtr(ctiOpThrowNotCaught).value());
return JSValue::encode(jsNull());
}
@@ -2687,18 +2667,22 @@ DEFINE_STUB_FUNCTION(JSPropertyNameIterator*, op_get_pnames)
{
STUB_INIT_STACK_FRAME(stackFrame);
- return JSPropertyNameIterator::create(stackFrame.callFrame, stackFrame.args[0].jsValue());
+ CallFrame* callFrame = stackFrame.callFrame;
+ JSObject* o = stackFrame.args[0].jsObject();
+ Structure* structure = o->structure();
+ JSPropertyNameIterator* jsPropertyNameIterator = structure->enumerationCache();
+ if (!jsPropertyNameIterator || jsPropertyNameIterator->cachedPrototypeChain() != structure->prototypeChain(callFrame))
+ jsPropertyNameIterator = JSPropertyNameIterator::create(callFrame, o);
+ return jsPropertyNameIterator;
}
-DEFINE_STUB_FUNCTION(EncodedJSValue, op_next_pname)
+DEFINE_STUB_FUNCTION(int, has_property)
{
STUB_INIT_STACK_FRAME(stackFrame);
- JSPropertyNameIterator* it = stackFrame.args[0].propertyNameIterator();
- JSValue temp = it->next(stackFrame.callFrame);
- if (!temp)
- it->invalidate();
- return JSValue::encode(temp);
+ JSObject* base = stackFrame.args[0].jsObject();
+ JSString* property = stackFrame.args[1].jsString();
+ return base->hasProperty(stackFrame.callFrame, Identifier(stackFrame.callFrame, property->value()));
}
DEFINE_STUB_FUNCTION(JSObject*, op_push_scope)
@@ -3039,6 +3023,14 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, vm_throw)
return JSValue::encode(exceptionValue);
}
+DEFINE_STUB_FUNCTION(EncodedJSValue, to_object)
+{
+ STUB_INIT_STACK_FRAME(stackFrame);
+
+ CallFrame* callFrame = stackFrame.callFrame;
+ return JSValue::encode(stackFrame.args[0].jsValue().toObject(callFrame));
+}
+
} // namespace JSC
#endif // ENABLE(JIT)
diff --git a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h
index 46973ee..ccbcd2a 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h
+++ b/src/3rdparty/webkit/JavaScriptCore/jit/JITStubs.h
@@ -63,6 +63,7 @@ namespace JSC {
int32_t asInt32;
JSValue jsValue() { return JSValue::decode(asEncodedJSValue); }
+ JSObject* jsObject() { return static_cast<JSObject*>(asPointer); }
Identifier& identifier() { return *static_cast<Identifier*>(asPointer); }
int32_t int32() { return asInt32; }
CodeBlock* codeBlock() { return static_cast<CodeBlock*>(asPointer); }
@@ -285,7 +286,6 @@ extern "C" {
EncodedJSValue JIT_STUB cti_op_mod(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_mul(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_negate(STUB_ARGS_DECLARATION);
- EncodedJSValue JIT_STUB cti_op_next_pname(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_not(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_nstricteq(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_post_dec(STUB_ARGS_DECLARATION);
@@ -307,6 +307,7 @@ extern "C" {
EncodedJSValue JIT_STUB cti_op_typeof(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_op_urshift(STUB_ARGS_DECLARATION);
EncodedJSValue JIT_STUB cti_vm_throw(STUB_ARGS_DECLARATION);
+ EncodedJSValue JIT_STUB cti_to_object(STUB_ARGS_DECLARATION);
JSObject* JIT_STUB cti_op_construct_JSConstruct(STUB_ARGS_DECLARATION);
JSObject* JIT_STUB cti_op_new_array(STUB_ARGS_DECLARATION);
JSObject* JIT_STUB cti_op_new_error(STUB_ARGS_DECLARATION);
@@ -332,6 +333,7 @@ extern "C" {
int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS_DECLARATION);
int JIT_STUB cti_op_loop_if_true(STUB_ARGS_DECLARATION);
int JIT_STUB cti_timeout_check(STUB_ARGS_DECLARATION);
+ int JIT_STUB cti_has_property(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_create_arguments(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_debug(STUB_ARGS_DECLARATION);
@@ -345,7 +347,6 @@ extern "C" {
void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION);
- void JIT_STUB cti_op_put_by_val_array(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_put_getter(STUB_ARGS_DECLARATION);
void JIT_STUB cti_op_put_setter(STUB_ARGS_DECLARATION);
diff --git a/src/3rdparty/webkit/JavaScriptCore/jsc.cpp b/src/3rdparty/webkit/JavaScriptCore/jsc.cpp
index 9399b1a..b6bc0aa 100644
--- a/src/3rdparty/webkit/JavaScriptCore/jsc.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/jsc.cpp
@@ -29,6 +29,7 @@
#include "JSArray.h"
#include "JSFunction.h"
#include "JSLock.h"
+#include "JSString.h"
#include "PrototypeFunction.h"
#include "SamplingTool.h"
#include <math.h>
diff --git a/src/3rdparty/webkit/JavaScriptCore/jsc.pro b/src/3rdparty/webkit/JavaScriptCore/jsc.pro
deleted file mode 100644
index ba880ff..0000000
--- a/src/3rdparty/webkit/JavaScriptCore/jsc.pro
+++ /dev/null
@@ -1,31 +0,0 @@
-TEMPLATE = app
-TARGET = jsc
-DESTDIR = .
-SOURCES = jsc.cpp
-QT -= gui
-CONFIG -= app_bundle
-CONFIG += building-libs
-win32-*: CONFIG += console
-win32-msvc*: CONFIG += exceptions_off stl_off
-
-include($$PWD/../WebKit.pri)
-
-CONFIG += link_pkgconfig
-
-QMAKE_RPATHDIR += $$OUTPUT_DIR/lib
-
-isEmpty(OUTPUT_DIR):OUTPUT_DIR=$$PWD/..
-CONFIG(debug, debug|release) {
- OBJECTS_DIR = obj/debug
-} else { # Release
- OBJECTS_DIR = obj/release
-}
-OBJECTS_DIR_WTR = $$OBJECTS_DIR$${QMAKE_DIR_SEP}
-include($$PWD/JavaScriptCore.pri)
-
-lessThan(QT_MINOR_VERSION, 4) {
- DEFINES += QT_BEGIN_NAMESPACE="" QT_END_NAMESPACE=""
-}
-
-*-g++*:QMAKE_CXXFLAGS_RELEASE -= -O2
-*-g++*:QMAKE_CXXFLAGS_RELEASE += -O3
diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y b/src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y
index 85fd163..6d953df 100644
--- a/src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y
+++ b/src/3rdparty/webkit/JavaScriptCore/parser/Grammar.y
@@ -27,6 +27,7 @@
#include "JSObject.h"
#include "JSString.h"
+#include "Lexer.h"
#include "NodeConstructors.h"
#include "NodeInfo.h"
#include <stdlib.h>
@@ -48,7 +49,6 @@
#define YYERROR_VERBOSE
#endif
-int jscyylex(void* lvalp, void* llocp, void* globalPtr);
int jscyyerror(const char*);
static inline bool allowAutomaticSemicolon(JSC::Lexer&, int);
diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp
index 785b219..df30838 100644
--- a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.cpp
@@ -46,12 +46,6 @@ using namespace JSC;
#include "Lookup.h"
#include "Lexer.lut.h"
-// A bridge for yacc from the C world to the C++ world.
-int jscyylex(void* lvalp, void* llocp, void* globalData)
-{
- return static_cast<JSGlobalData*>(globalData)->lexer->lex(lvalp, llocp);
-}
-
namespace JSC {
static const UChar byteOrderMark = 0xFEFF;
diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h
index 174e05a..c76696c 100644
--- a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h
+++ b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h
@@ -136,6 +136,12 @@ namespace JSC {
return (convertHex(c1, c2) << 8) | convertHex(c3, c4);
}
+ // A bridge for yacc from the C world to the C++ world.
+ inline int jscyylex(void* lvalp, void* llocp, void* globalData)
+ {
+ return static_cast<JSGlobalData*>(globalData)->lexer->lex(lvalp, llocp);
+ }
+
} // namespace JSC
#endif // Lexer_h
diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp
index 3bd318a..b1e317e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp
@@ -1468,14 +1468,16 @@ RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds
if (!m_lexpr->isLocation())
return emitThrowError(generator, ReferenceError, "Left side of for-in statement is not a reference.");
- RefPtr<Label> continueTarget = generator.newLabel();
-
generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
if (m_init)
generator.emitNode(generator.ignoredResult(), m_init);
- RegisterID* forInBase = generator.emitNode(m_expr);
- RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), forInBase);
+
+ RefPtr<RegisterID> base = generator.newTemporary();
+ generator.emitNode(base.get(), m_expr);
+ RefPtr<RegisterID> i = generator.newTemporary();
+ RefPtr<RegisterID> size = generator.newTemporary();
+ RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), base.get(), i.get(), size.get(), scope->breakTarget());
generator.emitJump(scope->continueTarget());
RefPtr<Label> loopStart = generator.newLabel();
@@ -1517,7 +1519,7 @@ RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds
generator.emitNode(dst, m_statement);
generator.emitLabel(scope->continueTarget());
- generator.emitNextPropertyName(propertyName, iter.get(), loopStart.get());
+ generator.emitNextPropertyName(propertyName, base.get(), i.get(), size.get(), iter.get(), loopStart.get());
generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
generator.emitLabel(scope->breakTarget());
return dst;
diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h b/src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h
index 2fd4fc1..eef8e93 100644
--- a/src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h
+++ b/src/3rdparty/webkit/JavaScriptCore/parser/ParserArena.h
@@ -34,7 +34,7 @@ namespace JSC {
class ParserArenaDeletable;
class ParserArenaRefCounted;
- class IdentifierArena {
+ class IdentifierArena : public FastAllocBase {
public:
ALWAYS_INLINE const Identifier& makeIdentifier(JSGlobalData*, const UChar* characters, size_t length);
const Identifier& makeNumericIdentifier(JSGlobalData*, double number);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h b/src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h
index 5be84a2..9b674a2 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Arguments.h
@@ -85,9 +85,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
+
private:
void getArgumentsData(CallFrame*, JSFunction*&, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc);
virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp
index 0237fd4..fb44494 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayConstructor.cpp
@@ -50,7 +50,7 @@ ArrayConstructor::ArrayConstructor(ExecState* exec, NonNullPassRefPtr<Structure>
putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, prototypeFunctionStructure, 1, exec->propertyNames().isArray, arrayConstructorIsArray), DontEnum);
}
-static JSObject* constructArrayWithSizeQuirk(ExecState* exec, const ArgList& args)
+static inline JSObject* constructArrayWithSizeQuirk(ExecState* exec, const ArgList& args)
{
// a single numeric argument denotes the array size (!)
if (args.size() == 1 && args.at(0).isNumber()) {
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp
index 86e3f1b..7a89447 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/ArrayPrototype.cpp
@@ -149,10 +149,11 @@ static void putProperty(ExecState* exec, JSObject* obj, const Identifier& proper
JSValue JSC_HOST_CALL arrayProtoFuncToString(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&)
{
- if (!thisValue.inherits(&JSArray::info))
+ bool isRealArray = isJSArray(&exec->globalData(), thisValue);
+ if (!isRealArray && !thisValue.inherits(&JSArray::info))
return throwError(exec, TypeError);
- JSObject* thisObj = asArray(thisValue);
-
+ JSArray* thisObj = asArray(thisValue);
+
HashSet<JSObject*>& arrayVisitedElements = exec->globalData().arrayVisitedElements;
if (arrayVisitedElements.size() >= MaxSecondaryThreadReentryDepth) {
if (!isMainThread() || arrayVisitedElements.size() >= MaxMainThreadReentryDepth)
@@ -163,34 +164,48 @@ JSValue JSC_HOST_CALL arrayProtoFuncToString(ExecState* exec, JSObject*, JSValue
if (alreadyVisited)
return jsEmptyString(exec); // return an empty string, avoiding infinite recursion.
- Vector<UChar, 256> strBuffer;
unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
+ unsigned totalSize = length ? length - 1 : 0;
+ Vector<RefPtr<UString::Rep>, 256> strBuffer(length);
for (unsigned k = 0; k < length; k++) {
- if (k >= 1)
- strBuffer.append(',');
- if (!strBuffer.data()) {
- JSObject* error = Error::create(exec, GeneralError, "Out of memory");
- exec->setException(error);
- break;
- }
-
- JSValue element = thisObj->get(exec, k);
+ JSValue element;
+ if (isRealArray && thisObj->canGetIndex(k))
+ element = thisObj->getIndex(k);
+ else
+ element = thisObj->get(exec, k);
+
if (element.isUndefinedOrNull())
continue;
-
+
UString str = element.toString(exec);
- strBuffer.append(str.data(), str.size());
-
+ strBuffer[k] = str.rep();
+ totalSize += str.size();
+
if (!strBuffer.data()) {
JSObject* error = Error::create(exec, GeneralError, "Out of memory");
exec->setException(error);
}
-
+
if (exec->hadException())
break;
}
arrayVisitedElements.remove(thisObj);
- return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));
+ if (!totalSize)
+ return jsEmptyString(exec);
+ Vector<UChar> buffer;
+ buffer.reserveCapacity(totalSize);
+ if (!buffer.data())
+ return throwError(exec, GeneralError, "Out of memory");
+
+ for (unsigned i = 0; i < length; i++) {
+ if (i)
+ buffer.append(',');
+ if (RefPtr<UString::Rep> rep = strBuffer[i])
+ buffer.append(rep->data(), rep->size());
+ }
+ ASSERT(buffer.size() == totalSize);
+ unsigned finalSize = buffer.size();
+ return jsString(exec, UString(buffer.releaseBuffer(), finalSize, false));
}
JSValue JSC_HOST_CALL arrayProtoFuncToLocaleString(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h
index 28f796a..69c2e51 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/BooleanObject.h
@@ -34,7 +34,7 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
};
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp
index 474d7bf..a69115c 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.cpp
@@ -240,7 +240,9 @@ void Heap::destroy()
template <HeapType heapType>
NEVER_INLINE CollectorBlock* Heap::allocateBlock()
{
-#if PLATFORM(DARWIN)
+ // Disable the use of vm_map for the Qt build on Darwin, because when compiled on 10.4
+ // it crashes on 10.5
+#if PLATFORM(DARWIN) && !PLATFORM(QT)
vm_address_t address = 0;
// FIXME: tag the region as a JavaScriptCore heap when we get a registered VM tag: <rdar://problem/6054788>.
vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT);
@@ -332,7 +334,9 @@ NEVER_INLINE void Heap::freeBlock(size_t block)
NEVER_INLINE void Heap::freeBlock(CollectorBlock* block)
{
-#if PLATFORM(DARWIN)
+ // Disable the use of vm_deallocate for the Qt build on Darwin, because when compiled on 10.4
+ // it crashes on 10.5
+#if PLATFORM(DARWIN) && !PLATFORM(QT)
vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE);
#elif PLATFORM(SYMBIAN)
userChunk->Free(reinterpret_cast<TAny*>(block));
@@ -1039,16 +1043,6 @@ void Heap::markStackObjectsConservatively(MarkStack& markStack)
#endif
}
-void Heap::setGCProtectNeedsLocking()
-{
- // Most clients do not need to call this, with the notable exception of WebCore.
- // Clients that use shared heap have JSLock protection, while others are supposed
- // to do explicit locking. WebCore violates this contract in Database code,
- // which calls gcUnprotect from a secondary thread.
- if (!m_protectedValuesMutex)
- m_protectedValuesMutex.set(new Mutex);
-}
-
void Heap::protect(JSValue k)
{
ASSERT(k);
@@ -1057,13 +1051,7 @@ void Heap::protect(JSValue k)
if (!k.isCell())
return;
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
m_protectedValues.add(k.asCell());
-
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
}
void Heap::unprotect(JSValue k)
@@ -1074,28 +1062,16 @@ void Heap::unprotect(JSValue k)
if (!k.isCell())
return;
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
m_protectedValues.remove(k.asCell());
-
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
}
void Heap::markProtectedObjects(MarkStack& markStack)
{
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
ProtectCountSet::iterator end = m_protectedValues.end();
for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) {
markStack.append(it->first);
markStack.drain();
}
-
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
}
template <HeapType heapType> size_t Heap::sweep()
@@ -1287,9 +1263,6 @@ size_t Heap::globalObjectCount()
size_t Heap::protectedGlobalObjectCount()
{
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
size_t count = 0;
if (JSGlobalObject* head = m_globalData->head) {
JSGlobalObject* o = head;
@@ -1300,23 +1273,12 @@ size_t Heap::protectedGlobalObjectCount()
} while (o != head);
}
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
-
return count;
}
size_t Heap::protectedObjectCount()
{
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
- size_t result = m_protectedValues.size();
-
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
-
- return result;
+ return m_protectedValues.size();
}
static const char* typeName(JSCell* cell)
@@ -1338,16 +1300,10 @@ HashCountedSet<const char*>* Heap::protectedObjectTypeCounts()
{
HashCountedSet<const char*>* counts = new HashCountedSet<const char*>;
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->lock();
-
ProtectCountSet::iterator end = m_protectedValues.end();
for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it)
counts->add(typeName(it->first));
- if (m_protectedValuesMutex)
- m_protectedValuesMutex->unlock();
-
return counts;
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h b/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h
index 0ecff19..9ca9d18 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Collector.h
@@ -71,14 +71,6 @@ namespace JSC {
void destroy();
-#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- // We can inline these functions because everything is compiled as
- // one file, so the heapAllocate template definitions are available.
- // However, allocateNumber is used via jsNumberCell outside JavaScriptCore.
- // Thus allocateNumber needs to provide a non-inline version too.
- void* inlineAllocateNumber(size_t s) { return heapAllocate<NumberHeap>(s); }
- void* inlineAllocate(size_t s) { return heapAllocate<PrimaryHeap>(s); }
-#endif
void* allocateNumber(size_t);
void* allocate(size_t);
@@ -96,7 +88,6 @@ namespace JSC {
};
Statistics statistics() const;
- void setGCProtectNeedsLocking();
void protect(JSValue);
void unprotect(JSValue);
@@ -151,7 +142,6 @@ namespace JSC {
CollectorHeap primaryHeap;
CollectorHeap numberHeap;
- OwnPtr<Mutex> m_protectedValuesMutex; // Only non-null if the client explicitly requested it via setGCPrtotectNeedsLocking().
ProtectCountSet m_protectedValues;
HashSet<MarkedArgumentBuffer*>* m_markListSet;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp
index 6b479ae..4cd58f5 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.cpp
@@ -22,6 +22,8 @@
#include "config.h"
#include "DateInstance.h"
+#include "JSGlobalObject.h"
+
#include <math.h>
#include <wtf/DateMath.h>
#include <wtf/MathExtras.h>
@@ -45,6 +47,13 @@ DateInstance::DateInstance(NonNullPassRefPtr<Structure> structure)
{
}
+DateInstance::DateInstance(ExecState* exec, double time)
+ : JSWrapperObject(exec->lexicalGlobalObject()->dateStructure())
+ , m_cache(0)
+{
+ setInternalValue(jsNumber(exec, timeClip(time)));
+}
+
DateInstance::~DateInstance()
{
delete m_cache;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h b/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h
index c8edc2f..36d90b1 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/DateInstance.h
@@ -31,6 +31,7 @@ namespace JSC {
class DateInstance : public JSWrapperObject {
public:
+ DateInstance(ExecState*, double);
explicit DateInstance(NonNullPassRefPtr<Structure>);
virtual ~DateInstance();
@@ -41,7 +42,7 @@ namespace JSC {
bool getTime(double& milliseconds, int& offset) const;
bool getUTCTime(double& milliseconds) const;
- static const ClassInfo info;
+ static JS_EXPORTDATA const ClassInfo info;
void msToGregorianDateTime(double, bool outputIsUTC, WTF::GregorianDateTime&) const;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h b/src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h
index caed2d4..5fe4f47 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/DatePrototype.h
@@ -39,8 +39,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | DateInstance::StructureFlags;
+
};
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp
index cc18b95..5bead90 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.cpp
@@ -66,6 +66,11 @@ JSValue createStackOverflowError(ExecState* exec)
return createError(exec, RangeError, "Maximum call stack size exceeded.");
}
+JSValue createTypeError(ExecState* exec, const char* message)
+{
+ return createError(exec, TypeError, message);
+}
+
JSValue createUndefinedVariableError(ExecState* exec, const Identifier& ident, unsigned bytecodeOffset, CodeBlock* codeBlock)
{
int startOffset = 0;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h b/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h
index 4c5bec1..e739d09 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/ExceptionHelpers.h
@@ -44,6 +44,7 @@ namespace JSC {
JSValue createInterruptedExecutionException(JSGlobalData*);
JSValue createStackOverflowError(ExecState*);
+ JSValue createTypeError(ExecState*, const char* message);
JSValue createUndefinedVariableError(ExecState*, const Identifier&, unsigned bytecodeOffset, CodeBlock*);
JSNotAnObjectErrorStub* createNotAnObjectErrorStub(ExecState*, bool isNull);
JSObject* createInvalidParamError(ExecState*, const char* op, JSValue, unsigned bytecodeOffset, CodeBlock*);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h b/src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h
index 0e38549..d1d6a1d 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/FunctionPrototype.h
@@ -34,7 +34,7 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
private:
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h b/src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h
index 73dd854..68e9ea3 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/GetterSetter.h
@@ -50,7 +50,7 @@ namespace JSC {
void setSetter(JSObject* setter) { m_setter = setter; }
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(GetterSetterType));
+ return Structure::create(prototype, TypeInfo(GetterSetterType, OverridesMarkChildren));
}
private:
virtual bool isGetterSetter() const;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/GlobalEvalFunction.h b/src/3rdparty/webkit/JavaScriptCore/runtime/GlobalEvalFunction.h
index b62ad3e..389b1c3 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/GlobalEvalFunction.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/GlobalEvalFunction.h
@@ -37,9 +37,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance | HasStandardGetOwnPropertySlot));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+ protected:
+ static const unsigned StructureFlags = ImplementsHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | PrototypeFunction::StructureFlags;
+
private:
virtual void markChildren(MarkStack&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h b/src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h
index fdd5cc1..de9a1d6 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/InternalFunction.h
@@ -42,10 +42,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | HasStandardGetOwnPropertySlot | HasDefaultMark));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = ImplementsHasInstance | JSObject::StructureFlags;
+
InternalFunction(NonNullPassRefPtr<Structure> structure) : JSObject(structure) { }
InternalFunction(JSGlobalData*, NonNullPassRefPtr<Structure>, const Identifier&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSAPIValueWrapper.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSAPIValueWrapper.h
index 88a8493..aca550e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSAPIValueWrapper.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSAPIValueWrapper.h
@@ -39,7 +39,7 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(CompoundType));
+ return Structure::create(prototype, TypeInfo(CompoundType, OverridesMarkChildren | OverridesGetPropertyNames));
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h
index 583b988..ee98191 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSActivation.h
@@ -66,7 +66,10 @@ namespace JSC {
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
- static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, NeedsThisConversion)); }
+ static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, StructureFlags)); }
+
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | NeedsThisConversion | OverridesMarkChildren | OverridesGetPropertyNames | JSVariableObject::StructureFlags;
private:
struct JSActivationData : public JSVariableObjectData {
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp
index c471dac..fd9e7b2 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.cpp
@@ -136,9 +136,7 @@ JSArray::JSArray(NonNullPassRefPtr<Structure> structure)
unsigned initialCapacity = 0;
m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity)));
- m_storage->m_vectorLength = initialCapacity;
-
- m_fastAccessCutoff = 0;
+ m_vectorLength = initialCapacity;
checkConsistency();
}
@@ -150,7 +148,7 @@ JSArray::JSArray(NonNullPassRefPtr<Structure> structure, unsigned initialLength)
m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity)));
m_storage->m_length = initialLength;
- m_storage->m_vectorLength = initialCapacity;
+ m_vectorLength = initialCapacity;
m_storage->m_numValuesInVector = 0;
m_storage->m_sparseValueMap = 0;
m_storage->lazyCreationData = 0;
@@ -159,8 +157,6 @@ JSArray::JSArray(NonNullPassRefPtr<Structure> structure, unsigned initialLength)
for (size_t i = 0; i < initialCapacity; ++i)
vector[i] = JSValue();
- m_fastAccessCutoff = 0;
-
checkConsistency();
Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue));
@@ -173,7 +169,7 @@ JSArray::JSArray(NonNullPassRefPtr<Structure> structure, const ArgList& list)
m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity)));
m_storage->m_length = initialCapacity;
- m_storage->m_vectorLength = initialCapacity;
+ m_vectorLength = initialCapacity;
m_storage->m_numValuesInVector = initialCapacity;
m_storage->m_sparseValueMap = 0;
@@ -182,8 +178,6 @@ JSArray::JSArray(NonNullPassRefPtr<Structure> structure, const ArgList& list)
for (ArgList::const_iterator it = list.begin(); it != end; ++it, ++i)
m_storage->m_vector[i] = *it;
- m_fastAccessCutoff = initialCapacity;
-
checkConsistency();
Heap::heap(this)->reportExtraMemoryCost(storageSize(initialCapacity));
@@ -207,7 +201,7 @@ bool JSArray::getOwnPropertySlot(ExecState* exec, unsigned i, PropertySlot& slot
return false;
}
- if (i < storage->m_vectorLength) {
+ if (i < m_vectorLength) {
JSValue& valueSlot = storage->m_vector[i];
if (valueSlot) {
slot.setValueSlot(&valueSlot);
@@ -253,8 +247,8 @@ bool JSArray::getOwnPropertyDescriptor(ExecState* exec, const Identifier& proper
if (isArrayIndex) {
if (i >= m_storage->m_length)
return false;
- if (i < m_storage->m_vectorLength) {
- JSValue value = m_storage->m_vector[i];
+ if (i < m_vectorLength) {
+ JSValue& value = m_storage->m_vector[i];
if (value) {
descriptor.setDescriptor(value, 0);
return true;
@@ -305,7 +299,7 @@ void JSArray::put(ExecState* exec, unsigned i, JSValue value)
m_storage->m_length = length;
}
- if (i < m_storage->m_vectorLength) {
+ if (i < m_vectorLength) {
JSValue& valueSlot = m_storage->m_vector[i];
if (valueSlot) {
valueSlot = value;
@@ -313,8 +307,7 @@ void JSArray::put(ExecState* exec, unsigned i, JSValue value)
return;
}
valueSlot = value;
- if (++m_storage->m_numValuesInVector == m_storage->m_length)
- m_fastAccessCutoff = m_storage->m_length;
+ ++m_storage->m_numValuesInVector;
checkConsistency();
return;
}
@@ -352,8 +345,7 @@ NEVER_INLINE void JSArray::putSlowCase(ExecState* exec, unsigned i, JSValue valu
if (increaseVectorLength(i + 1)) {
storage = m_storage;
storage->m_vector[i] = value;
- if (++storage->m_numValuesInVector == storage->m_length)
- m_fastAccessCutoff = storage->m_length;
+ ++storage->m_numValuesInVector;
checkConsistency();
} else
throwOutOfMemoryError(exec);
@@ -363,7 +355,7 @@ NEVER_INLINE void JSArray::putSlowCase(ExecState* exec, unsigned i, JSValue valu
// Decide how many values it would be best to move from the map.
unsigned newNumValuesInVector = storage->m_numValuesInVector + 1;
unsigned newVectorLength = increasedVectorLength(i + 1);
- for (unsigned j = max(storage->m_vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j)
+ for (unsigned j = max(m_vectorLength, MIN_SPARSE_ARRAY_INDEX); j < newVectorLength; ++j)
newNumValuesInVector += map->contains(j);
if (i >= MIN_SPARSE_ARRAY_INDEX)
newNumValuesInVector -= map->contains(i);
@@ -386,7 +378,7 @@ NEVER_INLINE void JSArray::putSlowCase(ExecState* exec, unsigned i, JSValue valu
return;
}
- unsigned vectorLength = storage->m_vectorLength;
+ unsigned vectorLength = m_vectorLength;
Heap::heap(this)->reportExtraMemoryCost(storageSize(newVectorLength) - storageSize(vectorLength));
@@ -404,7 +396,7 @@ NEVER_INLINE void JSArray::putSlowCase(ExecState* exec, unsigned i, JSValue valu
storage->m_vector[i] = value;
- storage->m_vectorLength = newVectorLength;
+ m_vectorLength = newVectorLength;
storage->m_numValuesInVector = newNumValuesInVector;
m_storage = storage;
@@ -431,7 +423,7 @@ bool JSArray::deleteProperty(ExecState* exec, unsigned i)
ArrayStorage* storage = m_storage;
- if (i < storage->m_vectorLength) {
+ if (i < m_vectorLength) {
JSValue& valueSlot = storage->m_vector[i];
if (!valueSlot) {
checkConsistency();
@@ -439,8 +431,6 @@ bool JSArray::deleteProperty(ExecState* exec, unsigned i)
}
valueSlot = JSValue();
--storage->m_numValuesInVector;
- if (m_fastAccessCutoff > i)
- m_fastAccessCutoff = i;
checkConsistency();
return true;
}
@@ -472,7 +462,7 @@ void JSArray::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNa
ArrayStorage* storage = m_storage;
- unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength);
+ unsigned usedVectorLength = min(storage->m_length, m_vectorLength);
for (unsigned i = 0; i < usedVectorLength; ++i) {
if (storage->m_vector[i])
propertyNames.add(Identifier::from(exec, i));
@@ -494,7 +484,7 @@ bool JSArray::increaseVectorLength(unsigned newLength)
ArrayStorage* storage = m_storage;
- unsigned vectorLength = storage->m_vectorLength;
+ unsigned vectorLength = m_vectorLength;
ASSERT(newLength > vectorLength);
ASSERT(newLength <= MAX_STORAGE_VECTOR_INDEX);
unsigned newVectorLength = increasedVectorLength(newLength);
@@ -503,7 +493,7 @@ bool JSArray::increaseVectorLength(unsigned newLength)
return false;
Heap::heap(this)->reportExtraMemoryCost(storageSize(newVectorLength) - storageSize(vectorLength));
- storage->m_vectorLength = newVectorLength;
+ m_vectorLength = newVectorLength;
for (unsigned i = vectorLength; i < newVectorLength; ++i)
storage->m_vector[i] = JSValue();
@@ -521,10 +511,7 @@ void JSArray::setLength(unsigned newLength)
unsigned length = m_storage->m_length;
if (newLength < length) {
- if (m_fastAccessCutoff > newLength)
- m_fastAccessCutoff = newLength;
-
- unsigned usedVectorLength = min(length, storage->m_vectorLength);
+ unsigned usedVectorLength = min(length, m_vectorLength);
for (unsigned i = newLength; i < usedVectorLength; ++i) {
JSValue& valueSlot = storage->m_vector[i];
bool hadValue = valueSlot;
@@ -563,20 +550,13 @@ JSValue JSArray::pop()
JSValue result;
- if (m_fastAccessCutoff > length) {
- JSValue& valueSlot = m_storage->m_vector[length];
- result = valueSlot;
- ASSERT(result);
- valueSlot = JSValue();
- --m_storage->m_numValuesInVector;
- m_fastAccessCutoff = length;
- } else if (length < m_storage->m_vectorLength) {
+ if (length < m_vectorLength) {
JSValue& valueSlot = m_storage->m_vector[length];
- result = valueSlot;
- valueSlot = JSValue();
- if (result)
+ if (valueSlot) {
--m_storage->m_numValuesInVector;
- else
+ result = valueSlot;
+ valueSlot = JSValue();
+ } else
result = jsUndefined();
} else {
result = jsUndefined();
@@ -604,11 +584,10 @@ void JSArray::push(ExecState* exec, JSValue value)
{
checkConsistency();
- if (m_storage->m_length < m_storage->m_vectorLength) {
- ASSERT(!m_storage->m_vector[m_storage->m_length]);
+ if (m_storage->m_length < m_vectorLength) {
m_storage->m_vector[m_storage->m_length] = value;
- if (++m_storage->m_numValuesInVector == ++m_storage->m_length)
- m_fastAccessCutoff = m_storage->m_length;
+ ++m_storage->m_numValuesInVector;
+ ++m_storage->m_length;
checkConsistency();
return;
}
@@ -618,8 +597,8 @@ void JSArray::push(ExecState* exec, JSValue value)
if (!map || map->isEmpty()) {
if (increaseVectorLength(m_storage->m_length + 1)) {
m_storage->m_vector[m_storage->m_length] = value;
- if (++m_storage->m_numValuesInVector == ++m_storage->m_length)
- m_fastAccessCutoff = m_storage->m_length;
+ ++m_storage->m_numValuesInVector;
+ ++m_storage->m_length;
checkConsistency();
return;
}
@@ -837,7 +816,7 @@ void JSArray::sort(ExecState* exec, JSValue compareFunction, CallType callType,
if (!m_storage->m_length)
return;
- unsigned usedVectorLength = min(m_storage->m_length, m_storage->m_vectorLength);
+ unsigned usedVectorLength = min(m_storage->m_length, m_vectorLength);
AVLTree<AVLTreeAbstractorForArrayCompare, 44> tree; // Depth 44 is enough for 2^31 items
tree.abstractor().m_exec = exec;
@@ -886,7 +865,7 @@ void JSArray::sort(ExecState* exec, JSValue compareFunction, CallType callType,
if (SparseArrayValueMap* map = m_storage->m_sparseValueMap) {
newUsedVectorLength += map->size();
- if (newUsedVectorLength > m_storage->m_vectorLength) {
+ if (newUsedVectorLength > m_vectorLength) {
// Check that it is possible to allocate an array large enough to hold all the entries.
if ((newUsedVectorLength > MAX_STORAGE_VECTOR_LENGTH) || !increaseVectorLength(newUsedVectorLength)) {
throwOutOfMemoryError(exec);
@@ -926,7 +905,6 @@ void JSArray::sort(ExecState* exec, JSValue compareFunction, CallType callType,
for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i)
m_storage->m_vector[i] = JSValue();
- m_fastAccessCutoff = newUsedVectorLength;
m_storage->m_numValuesInVector = newUsedVectorLength;
checkConsistency(SortConsistencyCheck);
@@ -934,10 +912,16 @@ void JSArray::sort(ExecState* exec, JSValue compareFunction, CallType callType,
void JSArray::fillArgList(ExecState* exec, MarkedArgumentBuffer& args)
{
- unsigned fastAccessLength = min(m_storage->m_length, m_fastAccessCutoff);
+ JSValue* vector = m_storage->m_vector;
+ unsigned vectorEnd = min(m_storage->m_length, m_vectorLength);
unsigned i = 0;
- for (; i < fastAccessLength; ++i)
- args.append(getIndex(i));
+ for (; i < vectorEnd; ++i) {
+ JSValue& v = vector[i];
+ if (!v)
+ break;
+ args.append(v);
+ }
+
for (; i < m_storage->m_length; ++i)
args.append(get(exec, i));
}
@@ -946,12 +930,17 @@ void JSArray::copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSiz
{
ASSERT(m_storage->m_length == maxSize);
UNUSED_PARAM(maxSize);
- unsigned fastAccessLength = min(m_storage->m_length, m_fastAccessCutoff);
+ JSValue* vector = m_storage->m_vector;
+ unsigned vectorEnd = min(m_storage->m_length, m_vectorLength);
unsigned i = 0;
- for (; i < fastAccessLength; ++i)
- buffer[i] = getIndex(i);
- uint32_t size = m_storage->m_length;
- for (; i < size; ++i)
+ for (; i < vectorEnd; ++i) {
+ JSValue& v = vector[i];
+ if (!v)
+ break;
+ buffer[i] = v;
+ }
+
+ for (; i < m_storage->m_length; ++i)
buffer[i] = get(exec, i);
}
@@ -961,7 +950,7 @@ unsigned JSArray::compactForSorting()
ArrayStorage* storage = m_storage;
- unsigned usedVectorLength = min(m_storage->m_length, storage->m_vectorLength);
+ unsigned usedVectorLength = min(m_storage->m_length, m_vectorLength);
unsigned numDefined = 0;
unsigned numUndefined = 0;
@@ -985,7 +974,7 @@ unsigned JSArray::compactForSorting()
if (SparseArrayValueMap* map = storage->m_sparseValueMap) {
newUsedVectorLength += map->size();
- if (newUsedVectorLength > storage->m_vectorLength) {
+ if (newUsedVectorLength > m_vectorLength) {
// Check that it is possible to allocate an array large enough to hold all the entries - if not,
// exception is thrown by caller.
if ((newUsedVectorLength > MAX_STORAGE_VECTOR_LENGTH) || !increaseVectorLength(newUsedVectorLength))
@@ -1006,7 +995,6 @@ unsigned JSArray::compactForSorting()
for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i)
storage->m_vector[i] = JSValue();
- m_fastAccessCutoff = newUsedVectorLength;
storage->m_numValuesInVector = newUsedVectorLength;
checkConsistency(SortConsistencyCheck);
@@ -1032,30 +1020,27 @@ void JSArray::checkConsistency(ConsistencyCheckType type)
if (type == SortConsistencyCheck)
ASSERT(!m_storage->m_sparseValueMap);
- ASSERT(m_fastAccessCutoff <= m_storage->m_length);
- ASSERT(m_fastAccessCutoff <= m_storage->m_numValuesInVector);
-
unsigned numValuesInVector = 0;
- for (unsigned i = 0; i < m_storage->m_vectorLength; ++i) {
+ for (unsigned i = 0; i < m_vectorLength; ++i) {
if (JSValue value = m_storage->m_vector[i]) {
ASSERT(i < m_storage->m_length);
if (type != DestructorConsistencyCheck)
value->type(); // Likely to crash if the object was deallocated.
++numValuesInVector;
} else {
- ASSERT(i >= m_fastAccessCutoff);
if (type == SortConsistencyCheck)
ASSERT(i >= m_storage->m_numValuesInVector);
}
}
ASSERT(numValuesInVector == m_storage->m_numValuesInVector);
+ ASSERT(numValuesInVector <= m_storage->m_length);
if (m_storage->m_sparseValueMap) {
SparseArrayValueMap::iterator end = m_storage->m_sparseValueMap->end();
for (SparseArrayValueMap::iterator it = m_storage->m_sparseValueMap->begin(); it != end; ++it) {
unsigned index = it->first;
ASSERT(index < m_storage->m_length);
- ASSERT(index >= m_storage->m_vectorLength);
+ ASSERT(index >= m_vectorLength);
ASSERT(index <= MAX_ARRAY_INDEX);
ASSERT(it->second);
if (type != DestructorConsistencyCheck)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h
index 12768a4..8c22451 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h
@@ -29,7 +29,6 @@ namespace JSC {
struct ArrayStorage {
unsigned m_length;
- unsigned m_vectorLength;
unsigned m_numValuesInVector;
SparseArrayValueMap* m_sparseValueMap;
void* lazyCreationData; // A JSArray subclass can use this to fill the vector lazily.
@@ -63,18 +62,24 @@ namespace JSC {
void push(ExecState*, JSValue);
JSValue pop();
- bool canGetIndex(unsigned i) { return i < m_fastAccessCutoff; }
+ bool canGetIndex(unsigned i) { return i < m_vectorLength && m_storage->m_vector[i]; }
JSValue getIndex(unsigned i)
{
ASSERT(canGetIndex(i));
return m_storage->m_vector[i];
}
- bool canSetIndex(unsigned i) { return i < m_fastAccessCutoff; }
- JSValue setIndex(unsigned i, JSValue v)
+ bool canSetIndex(unsigned i) { return i < m_vectorLength; }
+ void setIndex(unsigned i, JSValue v)
{
ASSERT(canSetIndex(i));
- return m_storage->m_vector[i] = v;
+ JSValue& x = m_storage->m_vector[i];
+ if (!x) {
+ ++m_storage->m_numValuesInVector;
+ if (i >= m_storage->m_length)
+ m_storage->m_length = i + 1;
+ }
+ x = v;
}
void fillArgList(ExecState*, MarkedArgumentBuffer&);
@@ -82,12 +87,13 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
inline void markChildrenDirect(MarkStack& markStack);
protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
virtual bool deleteProperty(ExecState*, unsigned propertyName);
@@ -110,7 +116,7 @@ namespace JSC {
enum ConsistencyCheckType { NormalConsistencyCheck, DestructorConsistencyCheck, SortConsistencyCheck };
void checkConsistency(ConsistencyCheckType = NormalConsistencyCheck);
- unsigned m_fastAccessCutoff;
+ unsigned m_vectorLength;
ArrayStorage* m_storage;
};
@@ -139,7 +145,7 @@ namespace JSC {
ArrayStorage* storage = m_storage;
- unsigned usedVectorLength = std::min(storage->m_length, storage->m_vectorLength);
+ unsigned usedVectorLength = std::min(storage->m_length, m_vectorLength);
markStack.appendValues(storage->m_vector, usedVectorLength, MayContainNullValues);
if (SparseArrayValueMap* map = storage->m_sparseValueMap) {
@@ -152,7 +158,7 @@ namespace JSC {
inline void MarkStack::markChildren(JSCell* cell)
{
ASSERT(Heap::isCellMarked(cell));
- if (cell->structure()->typeInfo().hasDefaultMark()) {
+ if (!cell->structure()->typeInfo().overridesMarkChildren()) {
#ifdef NDEBUG
asObject(cell)->markChildrenDirect(*this);
#else
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp
index 90d39f0..5e5003b 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.cpp
@@ -45,7 +45,7 @@ JSByteArray::JSByteArray(ExecState* exec, NonNullPassRefPtr<Structure> structure
PassRefPtr<Structure> JSByteArray::createStructure(JSValue prototype)
{
- PassRefPtr<Structure> result = Structure::create(prototype, TypeInfo(ObjectType, HasDefaultMark));
+ PassRefPtr<Structure> result = Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
return result;
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h
index 006f4a2..fe6e124 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSByteArray.h
@@ -91,6 +91,9 @@ namespace JSC {
WTF::ByteArray* storage() const { return m_storage.get(); }
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
+
private:
enum VPtrStealingHackType { VPtrStealingHack };
JSByteArray(VPtrStealingHackType)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp
index aa93252..fae056e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.cpp
@@ -78,11 +78,7 @@ extern const double Inf = NaNInf.doubles.Inf_Double;
void* JSCell::operator new(size_t size, ExecState* exec)
{
-#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- return exec->heap()->inlineAllocate(size);
-#else
return exec->heap()->allocate(size);
-#endif
}
bool JSCell::getUInt32(uint32_t&) const
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h
index 503c6c4..16a5131 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSCell.h
@@ -112,14 +112,6 @@ namespace JSC {
Structure* m_structure;
};
- // FIXME: We should deprecate this and just use JSValue::asCell() instead.
- JSCell* asCell(JSValue);
-
- inline JSCell* asCell(JSValue value)
- {
- return value.asCell();
- }
-
inline JSCell::JSCell(Structure* structure)
: m_structure(structure)
{
@@ -162,11 +154,7 @@ namespace JSC {
inline void* JSCell::operator new(size_t size, JSGlobalData* globalData)
{
-#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- return globalData->heap.inlineAllocate(size);
-#else
return globalData->heap.allocate(size);
-#endif
}
// --- JSValue inlines ----------------------------
@@ -342,11 +330,6 @@ namespace JSC {
append(value.asCell());
}
- inline void Structure::markAggregate(MarkStack& markStack)
- {
- markStack.append(m_prototype);
- }
-
inline Heap* Heap::heap(JSValue v)
{
if (!v.isCell())
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h
index a9ac63e..b4356c4 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSFunction.h
@@ -61,7 +61,7 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
NativeFunction nativeFunction()
@@ -72,6 +72,9 @@ namespace JSC {
virtual ConstructType getConstructData(ConstructData&);
virtual CallType getCallData(CallData&);
+ protected:
+ const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | InternalFunction::StructureFlags;
+
private:
JSFunction(NonNullPassRefPtr<Structure>);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp
index 3bb281e..cf3f1d1 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.cpp
@@ -89,7 +89,7 @@ static inline void markIfNeeded(MarkStack& markStack, JSValue v)
static inline void markIfNeeded(MarkStack& markStack, const RefPtr<Structure>& s)
{
if (s)
- s->markAggregate(markStack);
+ markIfNeeded(markStack, s->storedPrototype());
}
JSGlobalObject::~JSGlobalObject()
@@ -394,6 +394,21 @@ void JSGlobalObject::markChildren(MarkStack& markStack)
markIfNeeded(markStack, d()->methodCallDummy);
markIfNeeded(markStack, d()->errorStructure);
+ markIfNeeded(markStack, d()->argumentsStructure);
+ markIfNeeded(markStack, d()->arrayStructure);
+ markIfNeeded(markStack, d()->booleanObjectStructure);
+ markIfNeeded(markStack, d()->callbackConstructorStructure);
+ markIfNeeded(markStack, d()->callbackFunctionStructure);
+ markIfNeeded(markStack, d()->callbackObjectStructure);
+ markIfNeeded(markStack, d()->dateStructure);
+ markIfNeeded(markStack, d()->emptyObjectStructure);
+ markIfNeeded(markStack, d()->errorStructure);
+ markIfNeeded(markStack, d()->functionStructure);
+ markIfNeeded(markStack, d()->numberObjectStructure);
+ markIfNeeded(markStack, d()->prototypeFunctionStructure);
+ markIfNeeded(markStack, d()->regExpMatchesArrayStructure);
+ markIfNeeded(markStack, d()->regExpStructure);
+ markIfNeeded(markStack, d()->stringObjectStructure);
// No need to mark the other structures, because their prototypes are all
// guaranteed to be referenced elsewhere.
@@ -448,11 +463,7 @@ void JSGlobalObject::copyGlobalsTo(RegisterFile& registerFile)
void* JSGlobalObject::operator new(size_t size, JSGlobalData* globalData)
{
-#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- return globalData->heap.inlineAllocate(size);
-#else
return globalData->heap.allocate(size);
-#endif
}
void JSGlobalObject::destroyJSGlobalObjectData(void* jsGlobalObjectData)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h
index 2106783..720d3a5 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObject.h
@@ -267,10 +267,13 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
protected:
+
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSVariableObject::StructureFlags;
+
struct GlobalPropertyInfo {
GlobalPropertyInfo(const Identifier& i, JSValue v, unsigned a)
: identifier(i)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h
index 0d9aca6..a271c4e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSNotAnObject.h
@@ -62,10 +62,13 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
private:
+
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
+
// JSValue methods
virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h
index 6a48081..309488f 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSNumberCell.h
@@ -68,23 +68,15 @@ namespace JSC {
void* operator new(size_t size, ExecState* exec)
{
- #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- return exec->heap()->inlineAllocateNumber(size);
- #else
return exec->heap()->allocateNumber(size);
- #endif
}
void* operator new(size_t size, JSGlobalData* globalData)
{
- #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE
- return globalData->heap.inlineAllocateNumber(size);
- #else
return globalData->heap.allocateNumber(size);
- #endif
}
- static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(NumberType, NeedsThisConversion | HasDefaultMark)); }
+ static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(NumberType, OverridesGetOwnPropertySlot | NeedsThisConversion)); }
private:
JSNumberCell(JSGlobalData* globalData, double value)
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h
index 65c9803..ec3fa40 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSONObject.h
@@ -41,11 +41,14 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
static void markStringifiers(MarkStack&, Stringifier*);
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
+
private:
virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp
index db2a9b2..6932ded 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.cpp
@@ -42,6 +42,25 @@ namespace JSC {
ASSERT_CLASS_FITS_IN_CELL(JSObject);
+static inline void getEnumerablePropertyNames(ExecState* exec, const ClassInfo* classInfo, PropertyNameArray& propertyNames)
+{
+ // Add properties from the static hashtables of properties
+ for (; classInfo; classInfo = classInfo->parentClass) {
+ const HashTable* table = classInfo->propHashTable(exec);
+ if (!table)
+ continue;
+ table->initializeIfNeeded(exec);
+ ASSERT(table->table);
+
+ int hashSizeMask = table->compactSize - 1;
+ const HashEntry* entry = table->table;
+ for (int i = 0; i <= hashSizeMask; ++i, ++entry) {
+ if (entry->key() && !(entry->attributes() & DontEnum))
+ propertyNames.add(entry->key());
+ }
+ }
+}
+
void JSObject::markChildren(MarkStack& markStack)
{
#ifndef NDEBUG
@@ -424,12 +443,29 @@ bool JSObject::getPropertySpecificValue(ExecState*, const Identifier& propertyNa
void JSObject::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames)
{
- m_structure->getEnumerablePropertyNames(exec, propertyNames, this);
+ getOwnPropertyNames(exec, propertyNames);
+
+ if (prototype().isNull())
+ return;
+
+ JSObject* prototype = asObject(this->prototype());
+ while(1) {
+ if (prototype->structure()->typeInfo().overridesGetPropertyNames()) {
+ prototype->getPropertyNames(exec, propertyNames);
+ break;
+ }
+ prototype->getOwnPropertyNames(exec, propertyNames);
+ JSValue nextProto = prototype->prototype();
+ if (nextProto.isNull())
+ break;
+ prototype = asObject(nextProto);
+ }
}
void JSObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames)
{
- m_structure->getOwnEnumerablePropertyNames(exec, propertyNames, this);
+ m_structure->getEnumerablePropertyNames(propertyNames);
+ getEnumerablePropertyNames(exec, classInfo(), propertyNames);
}
bool JSObject::toBoolean(ExecState*) const
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h
index 84b5f4b..1dbab94 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSObject.h
@@ -207,10 +207,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = 0;
+
void addAnonymousSlots(unsigned count);
void putAnonymousValue(unsigned index, JSValue value)
{
@@ -368,7 +370,7 @@ ALWAYS_INLINE bool JSObject::getOwnPropertySlot(ExecState* exec, const Identifie
ALWAYS_INLINE bool JSCell::fastGetOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
{
- if (structure()->typeInfo().hasStandardGetOwnPropertySlot())
+ if (!structure()->typeInfo().overridesGetOwnPropertySlot())
return asObject(this)->inlineGetOwnPropertySlot(exec, propertyName, slot);
return getOwnPropertySlot(exec, propertyName, slot);
}
@@ -682,7 +684,7 @@ ALWAYS_INLINE void JSObject::markChildrenDirect(MarkStack& markStack)
{
JSCell::markChildren(markStack);
- m_structure->markAggregate(markStack);
+ markStack.append(prototype());
PropertyStorage storage = propertyStorage();
size_t storageSize = m_structure->propertyStorageSize();
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
index e08a3d9..2cd9f75 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.cpp
@@ -29,26 +29,56 @@
#include "config.h"
#include "JSPropertyNameIterator.h"
+#include "JSGlobalObject.h"
+
namespace JSC {
ASSERT_CLASS_FITS_IN_CELL(JSPropertyNameIterator);
-JSPropertyNameIterator::~JSPropertyNameIterator()
+JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSObject* o)
{
+ ASSERT(!o->structure()->enumerationCache() ||
+ o->structure()->enumerationCache()->cachedStructure() != o->structure() ||
+ o->structure()->enumerationCache()->cachedPrototypeChain() != o->structure()->prototypeChain(exec));
+
+ PropertyNameArray propertyNames(exec);
+ o->getPropertyNames(exec, propertyNames);
+ JSPropertyNameIterator* jsPropertyNameIterator = new (exec) JSPropertyNameIterator(exec, propertyNames.data());
+
+ if (o->structure()->isDictionary())
+ return jsPropertyNameIterator;
+
+ if (o->structure()->typeInfo().overridesGetPropertyNames())
+ return jsPropertyNameIterator;
+
+ size_t count = normalizePrototypeChain(exec, o);
+ StructureChain* structureChain = o->structure()->prototypeChain(exec);
+ RefPtr<Structure>* structure = structureChain->head();
+ for (size_t i = 0; i < count; ++i) {
+ if (structure[i]->typeInfo().overridesGetPropertyNames())
+ return jsPropertyNameIterator;
+ }
+
+ jsPropertyNameIterator->setCachedPrototypeChain(structureChain);
+ jsPropertyNameIterator->setCachedStructure(o->structure());
+ o->structure()->setEnumerationCache(jsPropertyNameIterator);
+ return jsPropertyNameIterator;
}
-void JSPropertyNameIterator::markChildren(MarkStack& markStack)
+JSValue JSPropertyNameIterator::get(ExecState* exec, JSObject* base, size_t i)
{
- JSCell::markChildren(markStack);
- if (m_object)
- markStack.append(m_object);
+ JSValue& identifier = m_jsStrings[i];
+ if (m_cachedStructure == base->structure() && m_cachedPrototypeChain == base->structure()->prototypeChain(exec))
+ return identifier;
+
+ if (!base->hasProperty(exec, Identifier(exec, asString(identifier)->value())))
+ return JSValue();
+ return identifier;
}
-void JSPropertyNameIterator::invalidate()
+void JSPropertyNameIterator::markChildren(MarkStack& markStack)
{
- ASSERT(m_position == m_end);
- m_object = 0;
- m_data.clear();
+ markStack.appendValues(m_jsStrings.get(), m_jsStringsSize, MayContainNullValues);
}
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h
index d2849a8..0559e0b 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSPropertyNameIterator.h
@@ -31,6 +31,7 @@
#include "JSObject.h"
#include "JSString.h"
+#include "Operations.h"
#include "PropertyNameArray.h"
namespace JSC {
@@ -39,73 +40,51 @@ namespace JSC {
class JSObject;
class JSPropertyNameIterator : public JSCell {
- public:
- static JSPropertyNameIterator* create(ExecState*, JSValue);
-
- virtual ~JSPropertyNameIterator();
-
- virtual void markChildren(MarkStack&);
+ friend class JIT;
- JSValue next(ExecState*);
- void invalidate();
+ public:
+ static JSPropertyNameIterator* create(ExecState*, JSObject*);
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(CompoundType));
+ return Structure::create(prototype, TypeInfo(CompoundType, OverridesMarkChildren));
}
+
+ virtual void markChildren(MarkStack&);
+
+ JSValue get(ExecState*, JSObject*, size_t i);
+ size_t size() { return m_jsStringsSize; }
+
+ void setCachedStructure(Structure* structure) { m_cachedStructure = structure; }
+ Structure* cachedStructure() { return m_cachedStructure; }
+
+ void setCachedPrototypeChain(NonNullPassRefPtr<StructureChain> cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; }
+ StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); }
+
private:
- JSPropertyNameIterator(ExecState*);
- JSPropertyNameIterator(ExecState*, JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData);
+ JSPropertyNameIterator(ExecState*, PropertyNameArrayData* propertyNameArrayData);
- JSObject* m_object;
- RefPtr<PropertyNameArrayData> m_data;
- PropertyNameArrayData::const_iterator m_position;
- PropertyNameArrayData::const_iterator m_end;
+ Structure* m_cachedStructure;
+ RefPtr<StructureChain> m_cachedPrototypeChain;
+ size_t m_jsStringsSize;
+ OwnArrayPtr<JSValue> m_jsStrings;
};
-inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec)
+inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, PropertyNameArrayData* propertyNameArrayData)
: JSCell(exec->globalData().propertyNameIteratorStructure.get())
- , m_object(0)
- , m_position(0)
- , m_end(0)
+ , m_cachedStructure(0)
+ , m_jsStringsSize(propertyNameArrayData->propertyNameVector().size())
+ , m_jsStrings(new JSValue[m_jsStringsSize])
{
+ PropertyNameArrayData::PropertyNameVector& propertyNameVector = propertyNameArrayData->propertyNameVector();
+ for (size_t i = 0; i < m_jsStringsSize; ++i)
+ m_jsStrings[i] = jsOwnedString(exec, propertyNameVector[i].ustring());
}
-inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData)
- : JSCell(exec->globalData().propertyNameIteratorStructure.get())
- , m_object(object)
- , m_data(propertyNameArrayData)
- , m_position(m_data->begin())
- , m_end(m_data->end())
-{
-}
-
-inline JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSValue v)
+inline void Structure::setEnumerationCache(JSPropertyNameIterator* enumerationCache)
{
- if (v.isUndefinedOrNull())
- return new (exec) JSPropertyNameIterator(exec);
-
- JSObject* o = v.toObject(exec);
- PropertyNameArray propertyNames(exec);
- o->getPropertyNames(exec, propertyNames);
- return new (exec) JSPropertyNameIterator(exec, o, propertyNames.releaseData());
-}
-
-inline JSValue JSPropertyNameIterator::next(ExecState* exec)
-{
- if (m_position == m_end)
- return JSValue();
-
- if (m_data->cachedStructure() == m_object->structure() && m_data->cachedPrototypeChain() == m_object->structure()->prototypeChain(exec))
- return jsOwnedString(exec, (*m_position++).ustring());
-
- do {
- if (m_object->hasProperty(exec, *m_position))
- return jsOwnedString(exec, (*m_position++).ustring());
- m_position++;
- } while (m_position != m_end);
-
- return JSValue();
+ ASSERT(!isDictionary());
+ m_enumerationCache = enumerationCache;
}
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h
index 5eb0e4b..2542878 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSStaticScopeObject.h
@@ -57,7 +57,10 @@ namespace JSC{
virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&);
void putWithAttributes(ExecState*, const Identifier&, JSValue, unsigned attributes);
- static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, NeedsThisConversion)); }
+ static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(ObjectType, StructureFlags)); }
+
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | NeedsThisConversion | OverridesMarkChildren | OverridesGetPropertyNames | JSVariableObject::StructureFlags;
private:
JSStaticScopeObjectData* d() { return static_cast<JSStaticScopeObjectData*>(JSVariableObject::d); }
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp
index 91ddaeb..20ba868 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.cpp
@@ -139,45 +139,4 @@ bool JSString::getOwnPropertySlot(ExecState* exec, unsigned propertyName, Proper
return JSString::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
}
-JSString* jsString(JSGlobalData* globalData, const UString& s)
-{
- int size = s.size();
- if (!size)
- return globalData->smallStrings.emptyString(globalData);
- if (size == 1) {
- UChar c = s.data()[0];
- if (c <= 0xFF)
- return globalData->smallStrings.singleCharacterString(globalData, c);
- }
- return new (globalData) JSString(globalData, s);
-}
-
-JSString* jsSubstring(JSGlobalData* globalData, const UString& s, unsigned offset, unsigned length)
-{
- ASSERT(offset <= static_cast<unsigned>(s.size()));
- ASSERT(length <= static_cast<unsigned>(s.size()));
- ASSERT(offset + length <= static_cast<unsigned>(s.size()));
- if (!length)
- return globalData->smallStrings.emptyString(globalData);
- if (length == 1) {
- UChar c = s.data()[offset];
- if (c <= 0xFF)
- return globalData->smallStrings.singleCharacterString(globalData, c);
- }
- return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, length));
-}
-
-JSString* jsOwnedString(JSGlobalData* globalData, const UString& s)
-{
- int size = s.size();
- if (!size)
- return globalData->smallStrings.emptyString(globalData);
- if (size == 1) {
- UChar c = s.data()[0];
- if (c <= 0xFF)
- return globalData->smallStrings.singleCharacterString(globalData, c);
- }
- return new (globalData) JSString(globalData, s, JSString::HasOtherOwner);
-}
-
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h
index 1e46551..39dfe75 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSString.h
@@ -92,7 +92,7 @@ namespace JSC {
bool canGetIndex(unsigned i) { return i < static_cast<unsigned>(m_value.size()); }
JSString* getIndex(JSGlobalData*, unsigned);
- static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(StringType, NeedsThisConversion | HasDefaultMark)); }
+ static PassRefPtr<Structure> createStructure(JSValue proto) { return Structure::create(proto, TypeInfo(StringType, OverridesGetOwnPropertySlot | NeedsThisConversion)); }
private:
enum VPtrStealingHackType { VPtrStealingHack };
@@ -169,6 +169,47 @@ namespace JSC {
return jsSingleCharacterSubstring(globalData, m_value, i);
}
+ inline JSString* jsString(JSGlobalData* globalData, const UString& s)
+ {
+ int size = s.size();
+ if (!size)
+ return globalData->smallStrings.emptyString(globalData);
+ if (size == 1) {
+ UChar c = s.data()[0];
+ if (c <= 0xFF)
+ return globalData->smallStrings.singleCharacterString(globalData, c);
+ }
+ return new (globalData) JSString(globalData, s);
+ }
+
+ inline JSString* jsSubstring(JSGlobalData* globalData, const UString& s, unsigned offset, unsigned length)
+ {
+ ASSERT(offset <= static_cast<unsigned>(s.size()));
+ ASSERT(length <= static_cast<unsigned>(s.size()));
+ ASSERT(offset + length <= static_cast<unsigned>(s.size()));
+ if (!length)
+ return globalData->smallStrings.emptyString(globalData);
+ if (length == 1) {
+ UChar c = s.data()[offset];
+ if (c <= 0xFF)
+ return globalData->smallStrings.singleCharacterString(globalData, c);
+ }
+ return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, length));
+ }
+
+ inline JSString* jsOwnedString(JSGlobalData* globalData, const UString& s)
+ {
+ int size = s.size();
+ if (!size)
+ return globalData->smallStrings.emptyString(globalData);
+ if (size == 1) {
+ UChar c = s.data()[0];
+ if (c <= 0xFF)
+ return globalData->smallStrings.singleCharacterString(globalData, c);
+ }
+ return new (globalData) JSString(globalData, s, JSString::HasOtherOwner);
+ }
+
inline JSString* jsEmptyString(ExecState* exec) { return jsEmptyString(&exec->globalData()); }
inline JSString* jsString(ExecState* exec, const UString& s) { return jsString(&exec->globalData(), s); }
inline JSString* jsSingleCharacterString(ExecState* exec, UChar c) { return jsSingleCharacterString(&exec->globalData(), c); }
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSTypeInfo.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSTypeInfo.h
index 279510b..7c89600 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSTypeInfo.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSTypeInfo.h
@@ -40,9 +40,9 @@ namespace JSC {
static const unsigned OverridesHasInstance = 1 << 2;
static const unsigned ImplementsDefaultHasInstance = 1 << 3;
static const unsigned NeedsThisConversion = 1 << 4;
- static const unsigned HasStandardGetOwnPropertySlot = 1 << 5;
- static const unsigned HasDefaultMark = 1 << 6;
- static const unsigned HasDefaultGetPropertyNames = 1 << 7;
+ static const unsigned OverridesGetOwnPropertySlot = 1 << 5;
+ static const unsigned OverridesMarkChildren = 1 << 6;
+ static const unsigned OverridesGetPropertyNames = 1 << 7;
class TypeInfo {
friend class JIT;
@@ -63,9 +63,9 @@ namespace JSC {
bool implementsHasInstance() const { return m_flags & ImplementsHasInstance; }
bool overridesHasInstance() const { return m_flags & OverridesHasInstance; }
bool needsThisConversion() const { return m_flags & NeedsThisConversion; }
- bool hasStandardGetOwnPropertySlot() const { return m_flags & HasStandardGetOwnPropertySlot; }
- bool hasDefaultMark() const { return m_flags & HasDefaultMark; }
- bool hasDefaultGetPropertyNames() const { return m_flags & HasDefaultGetPropertyNames; }
+ bool overridesGetOwnPropertySlot() const { return m_flags & OverridesGetOwnPropertySlot; }
+ bool overridesMarkChildren() const { return m_flags & OverridesMarkChildren; }
+ bool overridesGetPropertyNames() const { return m_flags & OverridesGetPropertyNames; }
unsigned flags() const { return m_flags; }
private:
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp
index 39a4093..699c1cd 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.cpp
@@ -110,7 +110,10 @@ char* JSValue::description()
{
static const size_t size = 32;
static char description[size];
- if (isInt32())
+
+ if (!*this)
+ snprintf(description, size, "<JSValue()>");
+ else if (isInt32())
snprintf(description, size, "Int32: %d", asInt32());
else if (isDouble())
snprintf(description, size, "Double: %lf", asDouble());
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h
index 58e74b1..1063cdc 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h
@@ -213,7 +213,8 @@ namespace JSC {
enum { FalseTag = 0xfffffffc };
enum { NullTag = 0xfffffffb };
enum { UndefinedTag = 0xfffffffa };
- enum { DeletedValueTag = 0xfffffff9 };
+ enum { EmptyValueTag = 0xfffffff9 };
+ enum { DeletedValueTag = 0xfffffff8 };
enum { LowestTag = DeletedValueTag };
@@ -372,6 +373,14 @@ namespace JSC {
return static_cast<uint32_t>(val);
}
+ // FIXME: We should deprecate this and just use JSValue::asCell() instead.
+ JSCell* asCell(JSValue);
+
+ inline JSCell* asCell(JSValue value)
+ {
+ return value.asCell();
+ }
+
ALWAYS_INLINE int32_t JSValue::toInt32(ExecState* exec) const
{
if (isInt32())
@@ -427,7 +436,7 @@ namespace JSC {
inline JSValue::JSValue()
{
- u.asBits.tag = CellTag;
+ u.asBits.tag = EmptyValueTag;
u.asBits.payload = 0;
}
@@ -463,19 +472,26 @@ namespace JSC {
inline JSValue::JSValue(JSCell* ptr)
{
- u.asBits.tag = CellTag;
+ if (ptr)
+ u.asBits.tag = CellTag;
+ else
+ u.asBits.tag = EmptyValueTag;
u.asBits.payload = reinterpret_cast<int32_t>(ptr);
}
inline JSValue::JSValue(const JSCell* ptr)
{
- u.asBits.tag = CellTag;
+ if (ptr)
+ u.asBits.tag = CellTag;
+ else
+ u.asBits.tag = EmptyValueTag;
u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr));
}
inline JSValue::operator bool() const
{
- return u.asBits.payload || tag() != CellTag;
+ ASSERT(tag() != DeletedValueTag);
+ return tag() != EmptyValueTag;
}
inline bool JSValue::operator==(const JSValue& other) const
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h
index 66e78c3..d8b1479 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSVariableObject.h
@@ -60,10 +60,11 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = OverridesGetPropertyNames | JSObject::StructureFlags;
// Subclasses of JSVariableObject can subclass this struct to add data
// without increasing their own size (since there's a hard limit on the
// size of a JSCell).
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h
index 723b75d..191ff3b 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSWrapperObject.h
@@ -38,7 +38,7 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultGetPropertyNames | HasDefaultMark));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
private:
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/MarkStack.h b/src/3rdparty/webkit/JavaScriptCore/runtime/MarkStack.h
index ba00057e0..ea09f54 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/MarkStack.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/MarkStack.h
@@ -47,7 +47,7 @@ namespace JSC {
}
ALWAYS_INLINE void append(JSValue);
- ALWAYS_INLINE void append(JSCell*);
+ void append(JSCell*);
ALWAYS_INLINE void appendValues(Register* values, size_t count, MarkSetProperties properties = NoNullValues)
{
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h
index fee5ec5..7f474b8 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/MathObject.h
@@ -37,8 +37,11 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
};
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h b/src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h
index 908c55f..cf19b6f 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/NumberConstructor.h
@@ -39,11 +39,14 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
enum { NaNValue, NegInfinity, PosInfinity, MaxValue, MinValue };
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | InternalFunction::StructureFlags;
+
private:
virtual ConstructType getConstructData(ConstructData&);
virtual CallType getCallData(CallData&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h
index ca3923d..8223a90 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/NumberObject.h
@@ -30,17 +30,19 @@ namespace JSC {
explicit NumberObject(NonNullPassRefPtr<Structure>);
static const ClassInfo info;
-#if USE(JSVALUE32)
+
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+
+ protected:
+#if USE(JSVALUE32)
+ static const unsigned StructureFlags = OverridesMarkChildren | JSWrapperObject::StructureFlags;
#else
- static PassRefPtr<Structure> createStructure(JSValue prototype)
- {
- return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot | HasDefaultMark | HasDefaultGetPropertyNames));
- }
+ static const unsigned StructureFlags = JSWrapperObject::StructureFlags;
#endif
+
private:
virtual const ClassInfo* classInfo() const { return &info; }
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp
index a456423..837d5a6 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/ObjectConstructor.cpp
@@ -125,6 +125,7 @@ JSValue JSC_HOST_CALL objectConstructorGetOwnPropertyDescriptor(ExecState* exec,
return description;
}
+// FIXME: Use the enumeration cache.
JSValue JSC_HOST_CALL objectConstructorKeys(ExecState* exec, JSObject*, JSValue, const ArgList& args)
{
if (!args.at(0).isObject())
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h b/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h
index 5da9e38..1aa68b3 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.h
@@ -224,15 +224,15 @@ namespace JSC {
return jsAddSlowCase(callFrame, v1, v2);
}
- inline size_t countPrototypeChainEntriesAndCheckForProxies(CallFrame* callFrame, JSValue baseValue, const PropertySlot& slot)
+ inline size_t normalizePrototypeChain(CallFrame* callFrame, JSValue base, JSValue slotBase)
{
- JSCell* cell = asCell(baseValue);
+ JSCell* cell = asCell(base);
size_t count = 0;
- while (slot.slotBase() != cell) {
+ while (slotBase != cell) {
JSValue v = cell->structure()->prototypeForLookup(callFrame);
- // If we didn't find slotBase in baseValue's prototype chain, then baseValue
+ // If we didn't find slotBase in base's prototype chain, then base
// must be a proxy for another object.
if (v.isNull())
@@ -252,6 +252,25 @@ namespace JSC {
return count;
}
+ inline size_t normalizePrototypeChain(CallFrame* callFrame, JSCell* base)
+ {
+ size_t count = 0;
+ while (1) {
+ JSValue v = base->structure()->prototypeForLookup(callFrame);
+ if (v.isNull())
+ return count;
+
+ base = asCell(v);
+
+ // Since we're accessing a prototype in a loop, it's a good bet that it
+ // should not be treated as a dictionary.
+ if (base->structure()->isDictionary())
+ asObject(base)->setStructure(Structure::fromDictionaryTransition(base->structure()));
+
+ ++count;
+ }
+ }
+
ALWAYS_INLINE JSValue resolveBase(CallFrame* callFrame, Identifier& property, ScopeChainNode* scopeChain)
{
ScopeChainIterator iter = scopeChain->begin();
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp
index 0878e73..c28b6a4 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.cpp
@@ -21,6 +21,9 @@
#include "config.h"
#include "PropertyNameArray.h"
+#include "Structure.h"
+#include "StructureChain.h"
+
namespace JSC {
static const size_t setThreshold = 20;
@@ -44,7 +47,7 @@ void PropertyNameArray::add(UString::Rep* identifier)
return;
}
- m_data->propertyNameVector().append(Identifier(m_globalData, identifier));
+ addKnownUnique(identifier);
}
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h b/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h
index afcc83f..3dbcc9d 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/PropertyNameArray.h
@@ -23,45 +23,35 @@
#include "CallFrame.h"
#include "Identifier.h"
-#include "Structure.h"
#include <wtf/HashSet.h>
+#include <wtf/OwnArrayPtr.h>
#include <wtf/Vector.h>
namespace JSC {
+
+ class Structure;
+ class StructureChain;
+ // FIXME: Rename to PropertyNameArray.
class PropertyNameArrayData : public RefCounted<PropertyNameArrayData> {
public:
typedef Vector<Identifier, 20> PropertyNameVector;
- typedef PropertyNameVector::const_iterator const_iterator;
static PassRefPtr<PropertyNameArrayData> create() { return adoptRef(new PropertyNameArrayData); }
- const_iterator begin() const { return m_propertyNameVector.begin(); }
- const_iterator end() const { return m_propertyNameVector.end(); }
-
PropertyNameVector& propertyNameVector() { return m_propertyNameVector; }
- void setCachedStructure(Structure* structure) { m_cachedStructure = structure; }
- Structure* cachedStructure() const { return m_cachedStructure; }
-
- void setCachedPrototypeChain(NonNullPassRefPtr<StructureChain> cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; }
- StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); }
-
private:
PropertyNameArrayData()
- : m_cachedStructure(0)
{
}
PropertyNameVector m_propertyNameVector;
- Structure* m_cachedStructure;
- RefPtr<StructureChain> m_cachedPrototypeChain;
};
+ // FIXME: Rename to PropertyNameArrayBuilder.
class PropertyNameArray {
public:
- typedef PropertyNameArrayData::const_iterator const_iterator;
-
PropertyNameArray(JSGlobalData* globalData)
: m_data(PropertyNameArrayData::create())
, m_globalData(globalData)
@@ -82,21 +72,18 @@ namespace JSC {
void add(UString::Rep*);
void addKnownUnique(UString::Rep* identifier) { m_data->propertyNameVector().append(Identifier(m_globalData, identifier)); }
- size_t size() const { return m_data->propertyNameVector().size(); }
-
Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; }
const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; }
- const_iterator begin() const { return m_data->begin(); }
- const_iterator end() const { return m_data->end(); }
-
void setData(PassRefPtr<PropertyNameArrayData> data) { m_data = data; }
PropertyNameArrayData* data() { return m_data.get(); }
-
PassRefPtr<PropertyNameArrayData> releaseData() { return m_data.release(); }
- void setShouldCache(bool shouldCache) { m_shouldCache = shouldCache; }
- bool shouldCache() const { return m_shouldCache; }
+ // FIXME: Remove these functions.
+ typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator;
+ size_t size() const { return m_data->propertyNameVector().size(); }
+ const_iterator begin() const { return m_data->propertyNameVector().begin(); }
+ const_iterator end() const { return m_data->propertyNameVector().end(); }
private:
typedef HashSet<UString::Rep*, PtrHash<UString::Rep*> > IdentifierSet;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h b/src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h
index 224164d..a0d5443 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Protect.h
@@ -22,8 +22,8 @@
#ifndef Protect_h
#define Protect_h
-#include "JSCell.h"
#include "Collector.h"
+#include "JSValue.h"
namespace JSC {
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp
index dbf2d44..c609e08 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.cpp
@@ -90,28 +90,6 @@ const ClassInfo RegExpConstructor::info = { "Function", &InternalFunction::info,
@end
*/
-struct RegExpConstructorPrivate : FastAllocBase {
- // Global search cache / settings
- RegExpConstructorPrivate()
- : lastNumSubPatterns(0)
- , multiline(false)
- , lastOvectorIndex(0)
- {
- }
-
- const Vector<int, 32>& lastOvector() const { return ovector[lastOvectorIndex]; }
- Vector<int, 32>& lastOvector() { return ovector[lastOvectorIndex]; }
- Vector<int, 32>& tempOvector() { return ovector[lastOvectorIndex ? 0 : 1]; }
- void changeLastOvector() { lastOvectorIndex = lastOvectorIndex ? 0 : 1; }
-
- UString input;
- UString lastInput;
- Vector<int, 32> ovector[2];
- unsigned lastNumSubPatterns : 30;
- bool multiline : 1;
- unsigned lastOvectorIndex : 1;
-};
-
RegExpConstructor::RegExpConstructor(ExecState* exec, NonNullPassRefPtr<Structure> structure, RegExpPrototype* regExpPrototype)
: InternalFunction(&exec->globalData(), structure, Identifier(exec, "RegExp"))
, d(new RegExpConstructorPrivate)
@@ -123,30 +101,6 @@ RegExpConstructor::RegExpConstructor(ExecState* exec, NonNullPassRefPtr<Structur
putDirectWithoutTransition(exec->propertyNames().length, jsNumber(exec, 2), ReadOnly | DontDelete | DontEnum);
}
-/*
- To facilitate result caching, exec(), test(), match(), search(), and replace() dipatch regular
- expression matching through the performMatch function. We use cached results to calculate,
- e.g., RegExp.lastMatch and RegExp.leftParen.
-*/
-void RegExpConstructor::performMatch(RegExp* r, const UString& s, int startOffset, int& position, int& length, int** ovector)
-{
- position = r->match(s, startOffset, &d->tempOvector());
-
- if (ovector)
- *ovector = d->tempOvector().data();
-
- if (position != -1) {
- ASSERT(!d->tempOvector().isEmpty());
-
- length = d->tempOvector()[1] - d->tempOvector()[0];
-
- d->input = s;
- d->lastInput = s;
- d->changeLastOvector();
- d->lastNumSubPatterns = r->numSubpatterns();
- }
-}
-
RegExpMatchesArray::RegExpMatchesArray(ExecState* exec, RegExpConstructorPrivate* data)
: JSArray(exec->lexicalGlobalObject()->regExpMatchesArrayStructure(), data->lastNumSubPatterns + 1)
{
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h
index f8bccf4..f9ca9cf 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpConstructor.h
@@ -22,6 +22,7 @@
#define RegExpConstructor_h
#include "InternalFunction.h"
+#include "RegExp.h"
#include <wtf/OwnPtr.h>
namespace JSC {
@@ -30,13 +31,35 @@ namespace JSC {
class RegExpPrototype;
struct RegExpConstructorPrivate;
+ struct RegExpConstructorPrivate : FastAllocBase {
+ // Global search cache / settings
+ RegExpConstructorPrivate()
+ : lastNumSubPatterns(0)
+ , multiline(false)
+ , lastOvectorIndex(0)
+ {
+ }
+
+ const Vector<int, 32>& lastOvector() const { return ovector[lastOvectorIndex]; }
+ Vector<int, 32>& lastOvector() { return ovector[lastOvectorIndex]; }
+ Vector<int, 32>& tempOvector() { return ovector[lastOvectorIndex ? 0 : 1]; }
+ void changeLastOvector() { lastOvectorIndex = lastOvectorIndex ? 0 : 1; }
+
+ UString input;
+ UString lastInput;
+ Vector<int, 32> ovector[2];
+ unsigned lastNumSubPatterns : 30;
+ bool multiline : 1;
+ unsigned lastOvectorIndex : 1;
+ };
+
class RegExpConstructor : public InternalFunction {
public:
RegExpConstructor(ExecState*, NonNullPassRefPtr<Structure>, RegExpPrototype*);
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance | HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
@@ -59,6 +82,9 @@ namespace JSC {
JSValue getLeftContext(ExecState*) const;
JSValue getRightContext(ExecState*) const;
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | InternalFunction::StructureFlags;
+
private:
virtual ConstructType getConstructData(ConstructData&);
virtual CallType getCallData(CallData&);
@@ -78,6 +104,30 @@ namespace JSC {
return static_cast<RegExpConstructor*>(asObject(value));
}
+ /*
+ To facilitate result caching, exec(), test(), match(), search(), and replace() dipatch regular
+ expression matching through the performMatch function. We use cached results to calculate,
+ e.g., RegExp.lastMatch and RegExp.leftParen.
+ */
+ inline void RegExpConstructor::performMatch(RegExp* r, const UString& s, int startOffset, int& position, int& length, int** ovector)
+ {
+ position = r->match(s, startOffset, &d->tempOvector());
+
+ if (ovector)
+ *ovector = d->tempOvector().data();
+
+ if (position != -1) {
+ ASSERT(!d->tempOvector().isEmpty());
+
+ length = d->tempOvector()[1] - d->tempOvector()[0];
+
+ d->input = s;
+ d->lastInput = s;
+ d->changeLastOvector();
+ d->lastNumSubPatterns = r->numSubpatterns();
+ }
+ }
+
} // namespace JSC
#endif // RegExpConstructor_h
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp
index 877d7b6..679d072 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.cpp
@@ -159,7 +159,7 @@ bool RegExpObject::match(ExecState* exec, const ArgList& args)
}
int position;
- int length;
+ int length = 0;
regExpConstructor->performMatch(d->regExp.get(), input, static_cast<int>(d->lastIndex), position, length);
if (position < 0) {
d->lastIndex = 0;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h
index f5a9340..3117c86 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/RegExpObject.h
@@ -49,9 +49,12 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, HasDefaultMark | HasDefaultGetPropertyNames));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
+ protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
+
private:
bool match(ExecState*, const ArgList&);
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h b/src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h
index 944f6ba..84e1ad2 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/StringObject.h
@@ -48,10 +48,11 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSWrapperObject::StructureFlags;
StringObject(NonNullPassRefPtr<Structure>, JSString*);
};
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h b/src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h
index 0cba83d..69e1939 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h
@@ -44,9 +44,11 @@ namespace JSC {
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, MasqueradesAsUndefined | HasDefaultMark));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | MasqueradesAsUndefined | OverridesGetPropertyNames | StringObject::StructureFlags;
+
virtual bool toBoolean(ExecState*) const { return false; }
};
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp
index b57732a..a0713b8 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/StringPrototype.cpp
@@ -25,6 +25,7 @@
#include "CachedCall.h"
#include "Error.h"
#include "Executable.h"
+#include "JSGlobalObjectFunctions.h"
#include "JSArray.h"
#include "JSFunction.h"
#include "ObjectPrototype.h"
@@ -72,6 +73,10 @@ static JSValue JSC_HOST_CALL stringProtoFuncFontsize(ExecState*, JSObject*, JSVa
static JSValue JSC_HOST_CALL stringProtoFuncAnchor(ExecState*, JSObject*, JSValue, const ArgList&);
static JSValue JSC_HOST_CALL stringProtoFuncLink(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL stringProtoFuncTrim(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL stringProtoFuncTrimLeft(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL stringProtoFuncTrimRight(ExecState*, JSObject*, JSValue, const ArgList&);
+
}
#include "StringPrototype.lut.h"
@@ -117,6 +122,9 @@ const ClassInfo StringPrototype::info = { "String", &StringObject::info, 0, Exec
fontsize stringProtoFuncFontsize DontEnum|Function 1
anchor stringProtoFuncAnchor DontEnum|Function 1
link stringProtoFuncLink DontEnum|Function 1
+ trim stringProtoFuncTrim DontEnum|Function 0
+ trimLeft stringProtoFuncTrimLeft DontEnum|Function 0
+ trimRight stringProtoFuncTrimRight DontEnum|Function 0
@end
*/
@@ -249,7 +257,7 @@ JSValue JSC_HOST_CALL stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue
return jsNull();
while (true) {
int matchIndex;
- int matchLen;
+ int matchLen = 0;
int* ovector;
regExpConstructor->performMatch(reg, source, startPosition, matchIndex, matchLen, &ovector);
if (matchIndex < 0)
@@ -290,7 +298,7 @@ JSValue JSC_HOST_CALL stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue
} else {
do {
int matchIndex;
- int matchLen;
+ int matchLen = 0;
int* ovector;
regExpConstructor->performMatch(reg, source, startPosition, matchIndex, matchLen, &ovector);
if (matchIndex < 0)
@@ -485,7 +493,7 @@ JSValue JSC_HOST_CALL stringProtoFuncMatch(ExecState* exec, JSObject*, JSValue t
}
RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor();
int pos;
- int matchLength;
+ int matchLength = 0;
regExpConstructor->performMatch(reg.get(), u, 0, pos, matchLength);
if (!(reg->global())) {
// case without 'g' flag is handled like RegExp.prototype.exec
@@ -535,7 +543,7 @@ JSValue JSC_HOST_CALL stringProtoFuncSearch(ExecState* exec, JSObject*, JSValue
}
RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor();
int pos;
- int matchLength;
+ int matchLength = 0;
regExpConstructor->performMatch(reg.get(), u, 0, pos, matchLength);
return jsNumber(exec, pos);
}
@@ -899,4 +907,51 @@ JSValue JSC_HOST_CALL stringProtoFuncLink(ExecState* exec, JSObject*, JSValue th
return jsNontrivialString(exec, UString(buffer, bufferSize, false));
}
+enum {
+ TrimLeft = 1,
+ TrimRight = 2
+};
+
+static inline bool isTrimWhitespace(UChar c)
+{
+ return isStrWhiteSpace(c) || c == 0x200b;
+}
+
+static inline JSValue trimString(ExecState* exec, JSValue thisValue, int trimKind)
+{
+ UString str = thisValue.toThisString(exec);
+ int left = 0;
+ if (trimKind & TrimLeft) {
+ while (left < str.size() && isTrimWhitespace(str[left]))
+ left++;
+ }
+ int right = str.size();
+ if (trimKind & TrimRight) {
+ while (right > left && isTrimWhitespace(str[right - 1]))
+ right--;
+ }
+
+ // Don't gc allocate a new string if we don't have to.
+ if (left == 0 && right == str.size() && thisValue.isString())
+ return thisValue;
+
+ return jsString(exec, str.substr(left, right - left));
+}
+
+JSValue JSC_HOST_CALL stringProtoFuncTrim(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&)
+{
+ return trimString(exec, thisValue, TrimLeft | TrimRight);
+}
+
+JSValue JSC_HOST_CALL stringProtoFuncTrimLeft(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&)
+{
+ return trimString(exec, thisValue, TrimLeft);
+}
+
+JSValue JSC_HOST_CALL stringProtoFuncTrimRight(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&)
+{
+ return trimString(exec, thisValue, TrimRight);
+}
+
+
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp
index 7209b5f..a11050f 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.cpp
@@ -28,9 +28,10 @@
#include "Identifier.h"
#include "JSObject.h"
+#include "JSPropertyNameIterator.h"
+#include "Lookup.h"
#include "PropertyNameArray.h"
#include "StructureChain.h"
-#include "Lookup.h"
#include <wtf/RefCountedLeakCounter.h>
#include <wtf/RefPtr.h>
@@ -159,9 +160,9 @@ Structure::~Structure()
m_previous->table.removeAnonymousSlotTransition(m_anonymousSlotsInPrevious);
}
-
- if (m_cachedPropertyNameArrayData)
- m_cachedPropertyNameArrayData->setCachedStructure(0);
+
+ if (m_enumerationCache)
+ m_enumerationCache->setCachedStructure(0);
if (m_propertyTable) {
unsigned entryCount = m_propertyTable->keyCount + m_propertyTable->deletedSentinelCount;
@@ -282,59 +283,6 @@ void Structure::materializePropertyMap()
}
}
-void Structure::getOwnEnumerablePropertyNames(ExecState* exec, PropertyNameArray& propertyNames, JSObject* baseObject)
-{
- getEnumerableNamesFromPropertyTable(propertyNames);
- getEnumerableNamesFromClassInfoTable(exec, baseObject->classInfo(), propertyNames);
-}
-
-void Structure::getEnumerablePropertyNames(ExecState* exec, PropertyNameArray& propertyNames, JSObject* baseObject)
-{
- bool shouldCache = propertyNames.shouldCache() && !(propertyNames.size() || isDictionary());
-
- if (shouldCache && m_cachedPropertyNameArrayData) {
- if (m_cachedPropertyNameArrayData->cachedPrototypeChain() == prototypeChain(exec)) {
- propertyNames.setData(m_cachedPropertyNameArrayData);
- return;
- }
- clearEnumerationCache();
- }
-
- baseObject->getOwnPropertyNames(exec, propertyNames);
-
- if (m_prototype.isObject()) {
- propertyNames.setShouldCache(false); // No need for our prototypes to waste memory on caching, since they're not being enumerated directly.
- JSObject* prototype = asObject(m_prototype);
- while(1) {
- if (!prototype->structure()->typeInfo().hasDefaultGetPropertyNames()) {
- prototype->getPropertyNames(exec, propertyNames);
- break;
- }
- prototype->getOwnPropertyNames(exec, propertyNames);
- JSValue nextProto = prototype->prototype();
- if (!nextProto.isObject())
- break;
- prototype = asObject(nextProto);
- }
- }
-
- if (shouldCache) {
- StructureChain* protoChain = prototypeChain(exec);
- m_cachedPropertyNameArrayData = propertyNames.data();
- if (!protoChain->isCacheable())
- return;
- m_cachedPropertyNameArrayData->setCachedPrototypeChain(protoChain);
- m_cachedPropertyNameArrayData->setCachedStructure(this);
- }
-}
-
-void Structure::clearEnumerationCache()
-{
- if (m_cachedPropertyNameArrayData)
- m_cachedPropertyNameArrayData->setCachedStructure(0);
- m_cachedPropertyNameArrayData.clear();
-}
-
void Structure::growPropertyStorageCapacity()
{
if (m_propertyStorageCapacity == JSObject::inlineStorageCapacity)
@@ -598,25 +546,25 @@ PassRefPtr<Structure> Structure::fromDictionaryTransition(Structure* structure)
size_t Structure::addPropertyWithoutTransition(const Identifier& propertyName, unsigned attributes, JSCell* specificValue)
{
+ ASSERT(!m_enumerationCache);
materializePropertyMapIfNecessary();
m_isPinnedPropertyTable = true;
size_t offset = put(propertyName, attributes, specificValue);
if (propertyStorageSize() > propertyStorageCapacity())
growPropertyStorageCapacity();
- clearEnumerationCache();
return offset;
}
size_t Structure::removePropertyWithoutTransition(const Identifier& propertyName)
{
ASSERT(isUncacheableDictionary());
+ ASSERT(!m_enumerationCache);
materializePropertyMapIfNecessary();
m_isPinnedPropertyTable = true;
size_t offset = remove(propertyName);
- clearEnumerationCache();
return offset;
}
@@ -1057,7 +1005,7 @@ static int comparePropertyMapEntryIndices(const void* a, const void* b)
return 0;
}
-void Structure::getEnumerableNamesFromPropertyTable(PropertyNameArray& propertyNames)
+void Structure::getEnumerablePropertyNames(PropertyNameArray& propertyNames)
{
materializePropertyMapIfNecessary();
if (!m_propertyTable)
@@ -1114,25 +1062,6 @@ void Structure::getEnumerableNamesFromPropertyTable(PropertyNameArray& propertyN
}
}
-void Structure::getEnumerableNamesFromClassInfoTable(ExecState* exec, const ClassInfo* classInfo, PropertyNameArray& propertyNames)
-{
- // Add properties from the static hashtables of properties
- for (; classInfo; classInfo = classInfo->parentClass) {
- const HashTable* table = classInfo->propHashTable(exec);
- if (!table)
- continue;
- table->initializeIfNeeded(exec);
- ASSERT(table->table);
-
- int hashSizeMask = table->compactSize - 1;
- const HashEntry* entry = table->table;
- for (int i = 0; i <= hashSizeMask; ++i, ++entry) {
- if (entry->key() && !(entry->attributes() & DontEnum))
- propertyNames.add(entry->key());
- }
- }
-}
-
#if DO_PROPERTYMAP_CONSTENCY_CHECK
void Structure::checkConsistency()
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h b/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h
index ed9f6e5..2496c1b 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Structure.h
@@ -30,6 +30,8 @@
#include "JSType.h"
#include "JSValue.h"
#include "PropertyMapHashTable.h"
+#include "PropertyNameArray.h"
+#include "Protect.h"
#include "StructureChain.h"
#include "StructureTransitionTable.h"
#include "JSTypeInfo.h"
@@ -76,8 +78,6 @@ namespace JSC {
~Structure();
- void markAggregate(MarkStack&);
-
// These should be used with caution.
size_t addPropertyWithoutTransition(const Identifier& propertyName, unsigned attributes, JSCell* specificValue);
size_t removePropertyWithoutTransition(const Identifier& propertyName);
@@ -116,9 +116,6 @@ namespace JSC {
return hasTransition(propertyName._ustring.rep(), attributes);
}
- void getEnumerablePropertyNames(ExecState*, PropertyNameArray&, JSObject*);
- void getOwnEnumerablePropertyNames(ExecState*, PropertyNameArray&, JSObject*);
-
bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; }
void setHasGetterSetterProperties(bool hasGetterSetterProperties) { m_hasGetterSetterProperties = hasGetterSetterProperties; }
@@ -127,6 +124,10 @@ namespace JSC {
JSCell* specificValue() { return m_specificValueInPrevious; }
void despecifyDictionaryFunction(const Identifier& propertyName);
+ void setEnumerationCache(JSPropertyNameIterator* enumerationCache); // Defined in JSPropertyNameIterator.h.
+ JSPropertyNameIterator* enumerationCache() { return m_enumerationCache.get(); }
+ void getEnumerablePropertyNames(PropertyNameArray&);
+
private:
Structure(JSValue prototype, const TypeInfo&);
@@ -140,8 +141,6 @@ namespace JSC {
size_t put(const Identifier& propertyName, unsigned attributes, JSCell* specificValue);
size_t remove(const Identifier& propertyName);
void addAnonymousSlots(unsigned slotCount);
- void getEnumerableNamesFromPropertyTable(PropertyNameArray&);
- void getEnumerableNamesFromClassInfoTable(ExecState*, const ClassInfo*, PropertyNameArray&);
void expandPropertyMapHashTable();
void rehashPropertyMapHashTable();
@@ -162,8 +161,6 @@ namespace JSC {
materializePropertyMap();
}
- void clearEnumerationCache();
-
signed char transitionCount() const
{
// Since the number of transitions is always the same as m_offset, we keep the size of Structure down by not storing both.
@@ -189,7 +186,7 @@ namespace JSC {
StructureTransitionTable table;
- RefPtr<PropertyNameArrayData> m_cachedPropertyNameArrayData;
+ ProtectedPtr<JSPropertyNameIterator> m_enumerationCache;
PropertyMapHashTable* m_propertyTable;
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp
index 6e8a0ee..085876c 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.cpp
@@ -46,18 +46,4 @@ StructureChain::StructureChain(Structure* head)
m_vector[i] = 0;
}
-bool StructureChain::isCacheable() const
-{
- uint32_t i = 0;
-
- while (m_vector[i]) {
- // Both classes of dictionary structure may change arbitrarily so we can't cache them
- if (m_vector[i]->isDictionary())
- return false;
- if (!m_vector[i++]->typeInfo().hasDefaultGetPropertyNames())
- return false;
- }
- return true;
-}
-
} // namespace JSC
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h b/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h
index c48749d..816b66d 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/StructureChain.h
@@ -36,10 +36,11 @@ namespace JSC {
class Structure;
class StructureChain : public RefCounted<StructureChain> {
+ friend class JIT;
+
public:
static PassRefPtr<StructureChain> create(Structure* head) { return adoptRef(new StructureChain(head)); }
RefPtr<Structure>* head() { return m_vector.get(); }
- bool isCacheable() const;
private:
StructureChain(Structure* head);
diff --git a/src/3rdparty/webkit/JavaScriptCore/wscript b/src/3rdparty/webkit/JavaScriptCore/wscript
index 9dd37c9..7a5ba1b 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wscript
+++ b/src/3rdparty/webkit/JavaScriptCore/wscript
@@ -30,7 +30,7 @@ import commands
from settings import *
jscore_excludes = ['jsc.cpp', 'ucptable.cpp', 'GOwnPtr.cpp']
-jscore_excludes.extend(get_excludes(jscore_dir, ['*CF.cpp']))
+jscore_excludes.extend(get_excludes(jscore_dir, ['*CF.cpp', '*Symbian.cpp']))
sources = []
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h b/src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h
index 6a05211..f682f0d 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/CrossThreadRefCounted.h
@@ -70,10 +70,6 @@ namespace WTF {
return !m_refCounter.hasOneRef() || (m_threadSafeRefCounter && !m_threadSafeRefCounter->hasOneRef());
}
-#ifndef NDEBUG
- bool mayBePassedToAnotherThread() const { ASSERT(!m_threadId); return m_refCounter.hasOneRef(); }
-#endif
-
private:
CrossThreadRefCounted(T* data, ThreadSafeSharedBase* threadedCounter)
: m_threadSafeRefCounter(threadedCounter)
@@ -92,6 +88,10 @@ namespace WTF {
void threadSafeDeref();
+#ifndef NDEBUG
+ bool isOwnedByCurrentThread() const { return !m_threadId || m_threadId == currentThread(); }
+#endif
+
RefCountedBase m_refCounter;
ThreadSafeSharedBase* m_threadSafeRefCounter;
T* m_data;
@@ -103,7 +103,7 @@ namespace WTF {
template<class T>
void CrossThreadRefCounted<T>::ref()
{
- ASSERT(!m_threadId || m_threadId == currentThread());
+ ASSERT(isOwnedByCurrentThread());
m_refCounter.ref();
#ifndef NDEBUG
// Store the threadId as soon as the ref count gets to 2.
@@ -119,7 +119,7 @@ namespace WTF {
template<class T>
void CrossThreadRefCounted<T>::deref()
{
- ASSERT(!m_threadId || m_threadId == currentThread());
+ ASSERT(isOwnedByCurrentThread());
if (m_refCounter.derefBase()) {
threadSafeDeref();
delete this;
@@ -146,10 +146,12 @@ namespace WTF {
template<class T>
PassRefPtr<CrossThreadRefCounted<T> > CrossThreadRefCounted<T>::crossThreadCopy()
{
+ ASSERT(isOwnedByCurrentThread());
if (m_threadSafeRefCounter)
m_threadSafeRefCounter->ref();
else
m_threadSafeRefCounter = new ThreadSafeSharedBase(2);
+
return adoptRef(new CrossThreadRefCounted<T>(m_data, m_threadSafeRefCounter));
}
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp b/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp
index a9472c9..6cd8ef0 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.cpp
@@ -379,6 +379,9 @@ extern "C" const int jscore_fastmalloc_introspection = 0;
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
+#if PLATFORM(UNIX)
+#include <unistd.h>
+#endif
#if COMPILER(MSVC)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
@@ -391,6 +394,7 @@ extern "C" const int jscore_fastmalloc_introspection = 0;
#if PLATFORM(DARWIN)
#include "MallocZoneSupport.h"
#include <wtf/HashSet.h>
+#include <wtf/Vector.h>
#endif
#ifndef PRIuS
@@ -2274,7 +2278,7 @@ static inline TCMalloc_PageHeap* getPageHeap()
#define pageheap getPageHeap()
#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY
-#if PLATFORM(WIN)
+#if PLATFORM(WIN_OS)
static void sleep(unsigned seconds)
{
::Sleep(seconds * 1000);
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h b/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h
index b23e7b0..ca0961c 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/FastMalloc.h
@@ -213,6 +213,9 @@ using WTF::fastMallocAllow;
// debug-only code to make sure we don't use the system malloc via the default operator
// new by accident.
+// We musn't customize the global operator new and delete for the Qt port.
+#if !PLATFORM(QT)
+
WTF_PRIVATE_INLINE void* operator new(size_t size) { return fastMalloc(size); }
WTF_PRIVATE_INLINE void* operator new(size_t size, const std::nothrow_t&) throw() { return fastMalloc(size); }
WTF_PRIVATE_INLINE void operator delete(void* p) { fastFree(p); }
@@ -224,4 +227,6 @@ WTF_PRIVATE_INLINE void operator delete[](void* p, const std::nothrow_t&) throw(
#endif
+#endif
+
#endif /* WTF_FastMalloc_h */
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/ListRefPtr.h b/src/3rdparty/webkit/JavaScriptCore/wtf/ListRefPtr.h
index d863226..8bf6447 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/ListRefPtr.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/ListRefPtr.h
@@ -44,6 +44,9 @@ namespace WTF {
template <typename U> ListRefPtr& operator=(const PassRefPtr<U>& o) { RefPtr<T>::operator=(o); return *this; }
};
+ // Remove inline for winscw compiler to prevent the compiler agressively resolving
+ // T::ref() in RefPtr<T>'s copy constructor. The bug is reported at:
+ // https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812.
template <typename T>
#if !COMPILER(WINSCW)
inline
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h b/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h
index 324300d..556230e 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/MathExtras.h
@@ -102,6 +102,8 @@ inline bool signbit(double x) { struct ieee_double *p = (struct ieee_double *)&x
#if COMPILER(MSVC) || COMPILER(RVCT)
+inline long long llround(double num) { return static_cast<long long>(num > 0 ? num + 0.5 : ceil(num - 0.5)); }
+inline long long llroundf(float num) { return static_cast<long long>(num > 0 ? num + 0.5f : ceil(num - 0.5f)); }
inline long lround(double num) { return static_cast<long>(num > 0 ? num + 0.5 : ceil(num - 0.5)); }
inline long lroundf(float num) { return static_cast<long>(num > 0 ? num + 0.5f : ceilf(num - 0.5f)); }
inline double round(double num) { return num > 0 ? floor(num + 0.5) : ceil(num - 0.5); }
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h b/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h
index 9fbfa85..7151b514 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/Platform.h
@@ -231,40 +231,94 @@
#if defined(arm) \
|| defined(__arm__)
#define WTF_PLATFORM_ARM 1
+
#if defined(__ARMEB__)
#define WTF_PLATFORM_BIG_ENDIAN 1
-#elif !defined(__ARM_EABI__) && !defined(__EABI__) && !defined(__VFP_FP__)
+
+#elif !defined(__ARM_EABI__) \
+ && !defined(__EABI__) \
+ && !defined(__VFP_FP__)
#define WTF_PLATFORM_MIDDLE_ENDIAN 1
+
#endif
-#define ARM_ARCH_VERSION 3
-#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(__MARM_ARMV4__) \
- || defined(_ARMV4I_)
-#undef ARM_ARCH_VERSION
+
+/* Set ARM_ARCH_VERSION */
+#if defined(__ARM_ARCH_4__) \
+ || defined(__ARM_ARCH_4T__) \
+ || defined(__MARM_ARMV4__) \
+ || defined(_ARMV4I_)
#define ARM_ARCH_VERSION 4
-#endif
-#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
- || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
- || defined(__ARM_ARCH_5TEJ__) || defined(__MARM_ARMV5__)
-#undef ARM_ARCH_VERSION
+
+#elif defined(__ARM_ARCH_5__) \
+ || defined(__ARM_ARCH_5T__) \
+ || defined(__ARM_ARCH_5E__) \
+ || defined(__ARM_ARCH_5TE__) \
+ || defined(__ARM_ARCH_5TEJ__) \
+ || defined(__MARM_ARMV5__)
#define ARM_ARCH_VERSION 5
-#endif
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
- || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
- || defined(__ARM_ARCH_6ZK__) || defined(__ARMV6__)
-#undef ARM_ARCH_VERSION
+
+#elif defined(__ARM_ARCH_6__) \
+ || defined(__ARM_ARCH_6J__) \
+ || defined(__ARM_ARCH_6K__) \
+ || defined(__ARM_ARCH_6Z__) \
+ || defined(__ARM_ARCH_6ZK__) \
+ || defined(__ARM_ARCH_6T2__) \
+ || defined(__ARMV6__)
#define ARM_ARCH_VERSION 6
-#endif
-#if defined(__ARM_ARCH_7A__)
-#undef ARM_ARCH_VERSION
+
+#elif defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__)
#define ARM_ARCH_VERSION 7
+
+/* RVCT sets _TARGET_ARCH_ARM */
+#elif defined(__TARGET_ARCH_ARM)
+#define ARM_ARCH_VERSION __TARGET_ARCH_ARM
+
+#else
+#define ARM_ARCH_VERSION 0
+
#endif
+
+/* Set THUMB_ARM_VERSION */
+#if defined(__ARM_ARCH_4T__)
+#define THUMB_ARCH_VERSION 1
+
+#elif defined(__ARM_ARCH_5T__) \
+ || defined(__ARM_ARCH_5TE__) \
+ || defined(__ARM_ARCH_5TEJ__)
+#define THUMB_ARCH_VERSION 2
+
+#elif defined(__ARM_ARCH_6J__) \
+ || defined(__ARM_ARCH_6K__) \
+ || defined(__ARM_ARCH_6Z__) \
+ || defined(__ARM_ARCH_6ZK__) \
+ || defined(__ARM_ARCH_6M__)
+#define THUMB_ARCH_VERSION 3
+
+#elif defined(__ARM_ARCH_6T2__) \
+ || defined(__ARM_ARCH_7__) \
+ || defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__) \
+ || defined(__ARM_ARCH_7M__)
+#define THUMB_ARCH_VERSION 4
+
+/* RVCT sets __TARGET_ARCH_THUMB */
+#elif defined(__TARGET_ARCH_THUMB)
+#define THUMB_ARCH_VERSION __TARGET_ARCH_THUMB
+
+#else
+#define THUMB_ARCH_VERSION 0
+#endif
+
/* On ARMv5 and below the natural alignment is required. */
#if !defined(ARM_REQUIRE_NATURAL_ALIGNMENT) && ARM_ARCH_VERSION <= 5
#define ARM_REQUIRE_NATURAL_ALIGNMENT 1
#endif
+
/* Defines two pseudo-platforms for ARM and Thumb-2 instruction set. */
#if !defined(WTF_PLATFORM_ARM_TRADITIONAL) && !defined(WTF_PLATFORM_ARM_THUMB2)
-# if defined(thumb2) || defined(__thumb2__)
+# if defined(thumb2) || defined(__thumb2__) \
+ || ((defined(__thumb) || defined(__thumb__)) && THUMB_ARCH_VERSION == 4)
# define WTF_PLATFORM_ARM_TRADITIONAL 0
# define WTF_PLATFORM_ARM_THUMB2 1
# elif PLATFORM_ARM_ARCH(4)
@@ -805,6 +859,10 @@ on MinGW. See https://bugs.webkit.org/show_bug.cgi?id=29268 */
#define WARN_UNUSED_RETURN
#endif
+#if !ENABLE(NETSCAPE_PLUGIN_API) || (ENABLE(NETSCAPE_PLUGIN_API) && ((PLATFORM(UNIX) && (PLATFORM(QT) || PLATFORM(WX))) || PLATFORM(GTK)))
+#define ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH 1
+#endif
+
/* Set up a define for a common error that is intended to cause a build error -- thus the space after Error. */
#define WTF_PLATFORM_CFNETWORK Error USE_macro_should_be_used_with_CFNETWORK
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp b/src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp
index 0e6e208..52fb130 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/RandomNumber.cpp
@@ -82,6 +82,23 @@ double randomNumber()
return static_cast<double>(fullRandom)/static_cast<double>(1LL << 53);
#elif PLATFORM(WINCE)
return genrand_res53();
+#elif PLATFORM(WIN_OS)
+ uint32_t part1 = rand() & (RAND_MAX - 1);
+ uint32_t part2 = rand() & (RAND_MAX - 1);
+ uint32_t part3 = rand() & (RAND_MAX - 1);
+ uint32_t part4 = rand() & (RAND_MAX - 1);
+ // rand only provides 15 bits on Win32
+ uint64_t fullRandom = part1;
+ fullRandom <<= 15;
+ fullRandom |= part2;
+ fullRandom <<= 15;
+ fullRandom |= part3;
+ fullRandom <<= 15;
+ fullRandom |= part4;
+
+ // Mask off the low 53bits
+ fullRandom &= (1LL << 53) - 1;
+ return static_cast<double>(fullRandom)/static_cast<double>(1LL << 53);
#else
uint32_t part1 = rand() & (RAND_MAX - 1);
uint32_t part2 = rand() & (RAND_MAX - 1);
diff --git a/src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h b/src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h
index 559e3f2..1120d65 100644
--- a/src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h
+++ b/src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h
@@ -75,12 +75,12 @@ inline char* strdup(const char* strSource)
inline int strncasecmp(const char* s1, const char* s2, size_t len)
{
- return strnicmp(s1, s2, len);
+ return _strnicmp(s1, s2, len);
}
inline int strcasecmp(const char* s1, const char* s2)
{
- return stricmp(s1, s2);
+ return _stricmp(s1, s2);
}
#endif
diff --git a/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp b/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp
index d777424..b635a45 100644
--- a/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.cpp
@@ -1400,14 +1400,6 @@ void jitCompileRegex(JSGlobalData* globalData, RegexCodeBlock& jitObject, const
}
}
-int executeRegex(RegexCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output, int outputArraySize)
-{
- if (JSRegExp* fallback = jitObject.getFallback())
- return (jsRegExpExecute(fallback, input, length, start, output, outputArraySize) < 0) ? -1 : output[0];
-
- return jitObject.execute(input, start, length, output);
-}
-
}}
#endif
diff --git a/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h b/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h
index 5b0df9d..1872f21 100644
--- a/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h
+++ b/src/3rdparty/webkit/JavaScriptCore/yarr/RegexJIT.h
@@ -82,7 +82,14 @@ private:
};
void jitCompileRegex(JSGlobalData* globalData, RegexCodeBlock& jitObject, const UString& pattern, unsigned& numSubpatterns, const char*& error, bool ignoreCase = false, bool multiline = false);
-int executeRegex(RegexCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output, int outputArraySize);
+
+inline int executeRegex(RegexCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output, int outputArraySize)
+{
+ if (JSRegExp* fallback = jitObject.getFallback())
+ return (jsRegExpExecute(fallback, input, length, start, output, outputArraySize) < 0) ? -1 : output[0];
+
+ return jitObject.execute(input, start, length, output);
+}
} } // namespace JSC::Yarr
diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION
index 7f50b5c..488c6a0 100644
--- a/src/3rdparty/webkit/VERSION
+++ b/src/3rdparty/webkit/VERSION
@@ -4,8 +4,8 @@ This is a snapshot of the Qt port of WebKit from
The commit imported was from the
- qtwebkit-4.6-snapshot-30092009-2 branch/tag
+ qtwebkit-4.6-snapshot-22102009 branch/tag
and has the sha1 checksum
- 284ebfc0df42d408d99838507c1ed335fba9bcf0
+ 0639bb8e812c8923287cd5523248ca64fa5f7a50
diff --git a/src/3rdparty/webkit/WebCore/ChangeLog b/src/3rdparty/webkit/WebCore/ChangeLog
index 4f7dd4f..4e5dff8 100644
--- a/src/3rdparty/webkit/WebCore/ChangeLog
+++ b/src/3rdparty/webkit/WebCore/ChangeLog
@@ -1,3 +1,5284 @@
+2009-10-20 Fumitoshi Ukai <ukai@chromium.org>
+
+ Reviewed by David Levin.
+
+ Set EnabledAtRuntime for WebSocket in DOMWindow
+ https://bugs.webkit.org/show_bug.cgi?id=29896
+
+ Supported by chromium/v8 only.
+ Add WebSocket::isAvailable()/setIsAvailable(bool) to control v8
+ bindings.
+ Remove Settings::experimentalWebSocketsEnabled() and
+ setExperimentalWebSocketsEnabled(bool).
+
+ * WebCore.base.exp:
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::JSDOMWindow::webSocket):
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getConstructor):
+ * bindings/v8/custom/V8CustomBinding.h:
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::ACCESSOR_RUNTIME_ENABLER):
+ * page/DOMWindow.idl:
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ * page/Settings.h:
+ * websockets/WebSocket.cpp:
+ (WebCore::WebSocket::setIsAvailable):
+ (WebCore::WebSocket::isAvailable):
+ * websockets/WebSocket.h:
+
+2009-10-19 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ REGRESSION: Dromaeo DOM test is 14% slower
+ https://bugs.webkit.org/show_bug.cgi?id=30273
+
+ Whoops, make prototype bindings actually use the StructureFlags.
+
+ * bindings/scripts/CodeGeneratorJS.pm:
+
+2009-10-19 James Robinson <jamesr@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Better implementation of WebCore::ScriptString for the V8 bindings.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29909
+
+ WebCore::ScriptString is used for XMLHttpRequest's responseText attribute which is
+ shared with JavaScript. Thus, simply using a WebCore::String and copying the value
+ is pretty inefficient, especially since responseText is built up with a sequence of
+ operator+= calls. JSC builds use a JSC::UString to share the buffer when possible,
+ this patch adopts a similar approach for V8.
+
+ No new tests, behavior is unchanged and covered by LayoutTests/http/tests/xmlhttprequest
+
+ * WebCore.gypi:
+ * bindings/v8/ScriptString.h:
+ (WebCore::ScriptString::ScriptString):
+ (WebCore::ScriptString::operator String):
+ (WebCore::ScriptString::isNull):
+ (WebCore::ScriptString::size):
+ (WebCore::ScriptString::operator=):
+ (WebCore::ScriptString::operator+=):
+ (WebCore::ScriptString::v8StringOrNull):
+ * bindings/v8/ScriptStringImpl.cpp: Added.
+ (WebCore::ScriptStringImpl::ScriptStringImpl):
+ (WebCore::ScriptStringImpl::~ScriptStringImpl):
+ (WebCore::ScriptStringImpl::toString):
+ (WebCore::ScriptStringImpl::isNull):
+ (WebCore::ScriptStringImpl::size):
+ (WebCore::ScriptStringImpl::append):
+ * bindings/v8/ScriptStringImpl.h: Added.
+ (WebCore::ScriptStringImpl::ScriptStringImpl):
+ (WebCore::ScriptStringImpl::v8StringHandle):
+ * bindings/v8/custom/V8XMLHttpRequestCustom.cpp:
+ (WebCore::ACCESSOR_GETTER):
+
+2009-10-19 Adam Barth <abarth@webkit.org>
+
+ No review, rolling out r49837.
+ http://trac.webkit.org/changeset/49837
+
+ * page/Settings.cpp:
+ (WebCore::Settings::setStandardFontFamily):
+ (WebCore::Settings::setFixedFontFamily):
+ (WebCore::Settings::setSerifFontFamily):
+ (WebCore::Settings::setSansSerifFontFamily):
+ (WebCore::Settings::setCursiveFontFamily):
+ (WebCore::Settings::setFantasyFontFamily):
+ * page/Settings.h:
+ (WebCore::Settings::standardFontFamily):
+ (WebCore::Settings::fixedFontFamily):
+ (WebCore::Settings::serifFontFamily):
+ (WebCore::Settings::sansSerifFontFamily):
+ (WebCore::Settings::cursiveFontFamily):
+ (WebCore::Settings::fantasyFontFamily):
+ * platform/text/UScriptCode.h: Removed.
+
+2009-10-19 Kwang Yul Seo <skyul@company100.net>
+
+ Reviewed by Eric Seidel.
+
+ Check COMPILER(MSVC) instead of PLATFORM(WIN_OS) to avoid the use of vasprintf.
+ https://bugs.webkit.org/show_bug.cgi?id=30473
+
+ vasprintf is missing in MSVC. Use COMPILER(MSVC) guards instead of
+ PLALTFORM(WIN_OS) guards.
+
+ * dom/XMLTokenizerLibxml2.cpp:
+ (WebCore::XMLTokenizer::error):
+
+2009-10-19 Jungshik Shin <jshin@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ https://bugs.webkit.org/show_bug.cgi?id=20797
+
+ Make generic font family getters/setters accept an additional
+ argument (script code). It has a default value so that if an embedder
+ does not have/want a per-script font family setting, call-sites
+ don't have to be changed.
+ This is to prepare for fixing bug 10874 (font selection is not
+ language-dependent) and bug 18085.
+
+ There should be no change in layout and no new layout test
+ is added.
+
+ * WebCore.base.exp:
+ * page/Settings.cpp:
+ * page/Settings.h:
+ * platform/text/UScriptCode.h: Added. This is for ports that
+ do not use ICU. the part of ICU's common/unicode/uscript.h
+ that defines script code enum was copied. To keep enums compatible
+ with those in ICU, we don't generate the list out of Scripts.txt
+ of the Unicode Data base or CLDR's data.
+
+2009-10-19 Evan Stade <estade@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Clarify usage of SuddenTermination API. No code change.
+
+ * platform/SuddenTermination.h:
+
+2009-10-19 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ REGRESSION: Dromaeo DOM test is 14% slower
+ https://bugs.webkit.org/show_bug.cgi?id=30273
+
+ Make DOM bindings automatically inherit correct structure
+ flags rather than being needlessly conservative. This is
+ done by making the bindings generator use the same model
+ for TypeInfo flags that we now use in JSC.
+
+ This gains us about 1% of this regression back.
+
+ * bindings/js/JSDOMBinding.h:
+ (WebCore::DOMObjectWithGlobalPointer::createStructure):
+ (WebCore::DOMConstructorObject::createStructure):
+ * bindings/js/JSDOMWindowShell.h:
+ (WebCore::JSDOMWindowShell::createStructure):
+ * bindings/js/JSHTMLAllCollection.h:
+ (WebCore::JSHTMLAllCollection::createStructure):
+ * bindings/js/JSQuarantinedObjectWrapper.h:
+ (WebCore::JSQuarantinedObjectWrapper::createStructure):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bridge/objc/objc_runtime.h:
+ (JSC::Bindings::ObjcFallbackObjectImp::createStructure):
+ * bridge/runtime_array.h:
+ (JSC::RuntimeArray::createStructure):
+ * bridge/runtime_method.h:
+ (JSC::RuntimeMethod::createStructure):
+ * bridge/runtime_object.h:
+ (JSC::RuntimeObjectImp::createStructure):
+
+2009-10-19 Robin Qiu <robin.qiu@torchmobile.com.cn>
+
+ Reviewed by Nikolas Zimmermann.
+
+ Fixed a bug on nested SVG <use> elements.
+ https://bugs.webkit.org/show_bug.cgi?id=26117
+ When a <use> element refer to another <use> element which has
+ child/children, the instance tree built for this <use> element
+ is incorrect (more nodes than expected).
+
+ Test: svg/dom/use-on-use-with-child.svg
+
+ * svg/SVGUseElement.cpp:
+ (WebCore::SVGUseElement::buildInstanceTree):
+
+2009-10-19 Oliver Hunt <oliver@apple.com>
+
+ Small changes to fully invalidate and update the JavaScriptCallFrame.
+
+ <rdar://problem/7020755> JSDebugger crashes after reloading from a breakpoint
+ https://bugs.webkit.org/show_bug.cgi?id=27146
+
+ Reviewed by Timothy Hatcher.
+
+ * inspector/JavaScriptCallFrame.h:
+ (WebCore::JavaScriptCallFrame::invalidate):
+ (WebCore::JavaScriptCallFrame::update):
+
+2009-10-19 Jeremy Orlow <jorlow@chromium.org>
+
+ Reviewed by Dmitri Titov.
+
+ Remove "source" from storage events
+ https://bugs.webkit.org/show_bug.cgi?id=30536
+
+ Remove "source" from storage events per
+ http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-October/023703.html
+
+ This was removed because it makes it introduces synchronous access that can
+ cross the event loop boundry (since a storage event can fire from one process
+ and be handled in another).
+
+ * inspector/InspectorDOMStorageResource.cpp:
+ (WebCore::InspectorDOMStorageResource::handleEvent):
+ * storage/StorageEvent.cpp:
+ (WebCore::StorageEvent::create):
+ (WebCore::StorageEvent::StorageEvent):
+ (WebCore::StorageEvent::initStorageEvent):
+ * storage/StorageEvent.h:
+ (WebCore::StorageEvent::uri):
+ * storage/StorageEvent.idl:
+ * storage/StorageEventDispatcher.cpp:
+ (WebCore::StorageEventDispatcher::dispatch):
+
+2009-10-19 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Remove ResourceLoadNotifier::activeDocumentLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30533
+
+ Removing this method from ResourceLoadNotifier better decouples the
+ notifier from FrameLoader.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::continueLoadAfterWillSubmitForm):
+ (WebCore::FrameLoader::requestFromDelegate):
+ * loader/ResourceLoadNotifier.cpp:
+ (WebCore::ResourceLoadNotifier::didReceiveResponse):
+ * loader/ResourceLoadNotifier.h:
+ * loader/ResourceLoader.cpp:
+ (WebCore::ResourceLoader::willSendRequest):
+
+2009-10-19 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move sendRemainingDelegateMessages to ResourceLoadNotifier
+ https://bugs.webkit.org/show_bug.cgi?id=30531
+
+ This method is about notifying folks and doesn't interact with the rest
+ of FrameLoader.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::willLoadMediaElementURL):
+ (WebCore::FrameLoader::commitProvisionalLoad):
+ (WebCore::FrameLoader::loadResourceSynchronously):
+ (WebCore::FrameLoader::loadedResourceFromMemoryCache):
+ * loader/FrameLoader.h:
+ * loader/ResourceLoadNotifier.cpp:
+ (WebCore::ResourceLoadNotifier::sendRemainingDelegateMessages):
+ * loader/ResourceLoadNotifier.h:
+
+2009-10-19 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Bypass popup blocker using click event
+ https://bugs.webkit.org/show_bug.cgi?id=21501
+
+ Keep track of which events were generated by JavaScript and use that
+ inforation when figuring out if we're processing a user gesture.
+
+ Test: http/tests/security/popup-blocked-from-fake-event.html
+
+ * bindings/js/ScriptController.cpp:
+ (WebCore::ScriptController::processingUserGestureEvent):
+ * bindings/v8/ScriptController.cpp:
+ (WebCore::ScriptController::processingUserGesture):
+ * dom/Document.cpp:
+ (WebCore::Document::createEvent):
+ * dom/Event.cpp:
+ (WebCore::Event::Event):
+ * dom/Event.h:
+ (WebCore::Event::createdByDOM):
+ (WebCore::Event::setCreatedByDOM):
+
+2009-10-19 Dumitru Daniliuc <dumi@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Fixing a typo.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30543
+
+ * platform/sql/SQLiteDatabase.h:
+
+2009-10-19 Dmitry Titov <dimich@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Manual Test for crash caused by JS accessing DOMWindow which is disconnected from the Frame.
+ https://bugs.webkit.org/show_bug.cgi?id=30544
+
+ * manual-tests/crash-on-accessing-domwindow-without-frame.html: Added.
+
+2009-10-19 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Flash at end of opacity/transform transition sometimes
+ https://bugs.webkit.org/show_bug.cgi?id=30501
+
+ When a transition finishes, there window of time between when the animation is
+ removed, and the final style set on the GraphicsLayer. This caused the layer to revert
+ to its old appearance for one or two frames. To avoid this, we set the final
+ transform or opacity at the start of the transition; we know that the animation
+ will override the final value for as long as its running.
+
+ No test because this is a very transient effect that can't be captured
+ in a test.
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::createGraphicsLayer):
+ (WebCore::RenderLayerBacking::updateLayerOpacity):
+ (WebCore::RenderLayerBacking::updateLayerTransform):
+ (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
+ (WebCore::RenderLayerBacking::startTransition):
+ * rendering/RenderLayerBacking.h:
+
+2009-10-19 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Add more stop characters into console completions.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30477
+
+ * inspector/front-end/ConsoleView.js:
+ (WebInspector.ConsoleView.prototype.completions):
+ (WebInspector.ConsoleView.prototype._reportCompletions):
+
+2009-10-19 Marshall Culpepper <mculpepper@appcelerator.com>
+
+ Reviewed by Adam Roben.
+
+ implemented ClipboardWin::files()
+ https://bugs.webkit.org/show_bug.cgi?id=29666
+
+ * platform/win/ClipboardWin.cpp:
+ (WebCore::ClipboardWin::files):
+
+2009-10-19 Nate Chapin <japhet@chromium.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ Add support for link relations in HTMLAnchorElement and implement rel="noreferrer".
+
+ https://bugs.webkit.org/show_bug.cgi?id=28986
+
+ Tests: http/tests/navigation/no-referrer-reset.html
+ http/tests/navigation/no-referrer-same-window.html
+ http/tests/navigation/no-referrer-subframe.html
+ http/tests/navigation/no-referrer-target-blank.html
+
+ * WebCore.base.exp: Update FrameLoader::loadFrameRequest export symbol
+ * html/HTMLAnchorElement.cpp: Add support for link relations and implement noreferrer
+ (WebCore::HTMLAnchorElement::HTMLAnchorElement):
+ (WebCore::HTMLAnchorElement::defaultEventHandler):
+ (WebCore::HTMLAnchorElement::parseMappedAttribute):
+ (WebCore::HTMLAnchorElement::hasRel):
+ (WebCore::HTMLAnchorElement::setRel):
+ * html/HTMLAnchorElement.h: Add support for link relations and implement noreferrer
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::createWindow):
+ (WebCore::FrameLoader::changeLocation):
+ (WebCore::FrameLoader::urlSelected): Add parameter for referrer policy
+ (WebCore::FrameLoader::loadFrameRequest): Add parameter for referrer policy
+ (WebCore::FrameLoader::continueLoadAfterNewWindowPolicy): Suppress opener if requested by ReferrerPolicy
+ * loader/FrameLoader.h: Update urlSelected and loadFrameRequest prototypes
+ * loader/FrameLoaderTypes.h: Add enum for referrer policy
+ * loader/RedirectScheduler.cpp:
+ (WebCore::RedirectScheduler::timerFired):
+ * page/ContextMenuController.cpp:
+ (WebCore::ContextMenuController::contextMenuItemSelected): Update call to urlSelected()
+ * svg/SVGAElement.cpp:
+ (WebCore::SVGAElement::defaultEventHandler): Update call to urlSelected()
+
+
+2009-10-19 Alpha Lam <hclam@chromium.org>
+
+ Reviewed by Dimitri Glazkov (dglazkov@chromium.org).
+
+ [v8] typeof(HTMLMediaElement) should return undefined if media
+ engine is not available
+ https://bugs.webkit.org/show_bug.cgi?id=30343
+
+ Check for availability of the media engine to disable
+ HTMLMediaElement, HTMLAudioElement, HTMLVideoElement, MediaError
+ in runtime.
+
+ Try runs and review in Chromium:
+ http://codereview.chromium.org/276011
+
+ Test: manual-tests/chromium/media-player-not-available.html
+
+ The above test can work work in Chromium. Testing procedures:
+ 1. Remove all media support libraries in Chromium (e.g. ffmpeg libraries)
+ 2. Open Chromium with above test page
+ 3. Verify the test results according to the test page
+
+ * bindings/v8/custom/V8CustomBinding.h:
+ Declare enabler methods.
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ Report enabled only if media player is available.
+ * manual-tests/chromium/media-player-not-available.html: Added.
+ Manual test, following instruction in this test for procedures.
+ * page/DOMWindow.idl:
+ Mark HTMLMediaElement, HTMLAudioElement, HTMLVideElement, MediaError
+ as enabled at runtime.
+
+2009-10-19 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by David Hyatt.
+
+ Refactor out some of the code in paint() into paintPanScrollIcon()
+ and paintScrollbars() in preparation of some Qt API changes.
+
+ * platform/ScrollView.cpp:
+ (WebCore::ScrollView::paint):
+ * platform/ScrollView.h:
+
+2009-10-19 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Adam Roben.
+
+ Make the local static panScrollIcon into a Image* instead
+ of a RefPtr<Image>.
+
+ * platform/ScrollView.cpp:
+ (WebCore::ScrollView::wheelEvent):
+
+2009-10-19 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by David Levin.
+
+ Forcefully set antialiasing for Chromium media controls.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30521
+
+ Before it was nondeterministiacally being enabled based on the previous state of GraphicsContext.
+
+ Covered by existing layout tests.
+
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaSlider): Added setShouldAntialias(true).
+
+2009-10-19 Jens Alfke <jens@mooseyard.com>
+
+ Reviewed by Darin Adler.
+
+ Optimize string upper/lowercasing
+ https://bugs.webkit.org/show_bug.cgi?id=30261
+
+ - Added AtomicString::upper() and lower()
+ - Further optimized StringImpl::lower()
+ - Removed StringImpl::isLower()
+ - Added QualifiedName::localNameUpper(), which is cached, thereby saving
+ thousands of upper() calls and string allocations.
+
+ * dom/Element.cpp:
+ (WebCore::Element::setAttribute): Call AtomicString::lower()
+ * dom/QualifiedName.cpp:
+ (WebCore::QualifiedName::localNameUpper): New method
+ * dom/QualifiedName.h: Added localNameUpper() method
+ * dom/StyledElement.cpp:
+ (WebCore::StyledElement::parseMappedAttribute): Call AtomicString::lower()
+ * html/HTMLDocument.cpp:
+ (WebCore::HTMLDocument::createElement): Call AtomicString::lower()
+ * html/HTMLElement.cpp:
+ (WebCore::HTMLElement::nodeName): Call localNameUpper()
+ * platform/text/AtomicString.cpp:
+ (WebCore::AtomicString::lower): New method
+ (WebCore::AtomicString::upper): New method
+ * platform/text/AtomicString.h: Added lower() and upper()
+ * platform/text/StringImpl.cpp: Removed isLower()
+ (WebCore::StringImpl::lower): Further optimization of initial loop
+ * platform/text/StringImpl.h: Removed isLower()
+
+2009-10-19 Nate Chapin <japhet@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ If a call to a plugin's invokeMethod, invokeDefault or construct
+ returns false, throw an exception into JS.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30239
+
+ Test: plugins/netscape-invoke-failure.html
+
+ * bindings/v8/V8NPObject.cpp: Check return values of invokeMethod, invokeDefault and construct.
+ (npObjectInvokeImpl):
+ * bridge/c/c_instance.cpp:
+ (JSC::Bindings::CInstance::invokeMethod): Check return value
+ (JSC::Bindings::CInstance::invokeDefaultMethod): Check return value
+ (JSC::Bindings::CInstance::invokeConstruct): Check return value
+
+2009-10-16 Stephen White <senorblanco@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Fix for chromium/skia canvas arc start/end positions, when the arc is
+ >= 360 degrees.
+ https://bugs.webkit.org/show_bug.cgi?id=30449
+
+ Covered by new test:
+ LayoutTests/fast/canvas/arc360.html
+
+ * platform/graphics/skia/PathSkia.cpp:
+ (WebCore::Path::addArc):
+
+2009-10-19 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ Fix uninitialized variable reference in Element::removeAttribute().
+ https://bugs.webkit.org/show_bug.cgi?id=30502
+
+ * dom/Element.cpp:
+ (WebCore::Element::removeAttribute):
+
+2009-10-19 Eric Carlson <eric.carlson@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30463
+ Remove HTML5 media element 'loadend' event
+
+ * dom/EventNames.h:
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::parseMappedAttribute): Remove 'loadend'.
+ (WebCore::HTMLMediaElement::loadInternal): Ditto.
+ (WebCore::HTMLMediaElement::noneSupported): Ditto.
+ (WebCore::HTMLMediaElement::mediaEngineError): Ditto.
+ (WebCore::HTMLMediaElement::setNetworkState): Ditto.
+ (WebCore::HTMLMediaElement::userCancelledLoad): Ditto.
+
+2009-10-19 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Adam Barth.
+
+ [Qt] Remove deletion of outgoing FormData object when reply is finished.
+ The buffers will be destroyed a bit later, when the QNetworkReply is deleted.
+ Bug: https://bugs.webkit.org/show_bug.cgi?id=29551
+
+ * platform/network/qt/QNetworkReplyHandler.cpp:
+ * platform/network/qt/QNetworkReplyHandler.h:
+
+2009-10-19 Dimitri Glazkov <dglazkov@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Fix hard-to-reproduce crash in HTMLTokenizer by avoiding a rare
+ fastRealloc edge case.
+ https://bugs.webkit.org/show_bug.cgi?id=29313
+
+ No test, the crash shows up occasionally in crash dumps, we weren't able
+ to reproduce it locally.
+
+ * html/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::enlargeScriptBuffer): Added an early exit to
+ avoid calling fastRealloc with the size of 0.
+
+2009-10-19 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Use fillRect() instead of drawRect() to fix Chromium media controls rendering.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30371
+
+ Chromium Mac layout tests will need to be rebaselined. Existing layout tests for Linux/Win still pass.
+
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaSlider): Use fillRect() instead of drawRect().
+
+2009-10-19 Dmitry Titov <dimich@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Crash in DOMWindow::clearTimeout etc when DOMWindow is not connected to a frame.
+ https://bugs.webkit.org/show_bug.cgi?id=29832
+
+ Need to make sure the script caches are reset when frame gets disconnected from still-alive DOMWindow.
+ This will prevent JS from calling DOMWindow methods that can not be completed w/o the frame.
+
+ I am not sure it's possible to test this since the only file that repros the problem need ~10 seconds to cause crash.
+
+ * page/Frame.cpp:
+ (WebCore::Frame::~Frame): Right after frame disconnects from DOMWindow, clear WindowShell.
+
+2009-10-19 Csaba Osztrogonác <ossy@webkit.org>
+
+ Unreviewed build warning fix.
+ [Qt] Apply changes to WebCore.pro introduced in r49778
+
+ * WebCore.pro: Removed svg/graphics/filters/SVGFEGaussianBlur.h from HEADERS
+
+2009-10-19 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Move feGaussianBlur from WebCore/svg to WebCore/platform
+ [https://bugs.webkit.org/show_bug.cgi?id=30495]
+
+ This patch moves SVGFRGaussianBlur from svg/graphics/filters
+ to platform/graphics/filters/FEGaussianBlur. This is needed
+ for shadow support on Qt and Cairo.
+ No change in functionality, therfore no new test case needed.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/graphics/filters/FEGaussianBlur.cpp: Added.
+ * platform/graphics/filters/FEGaussianBlur.h: Added.
+ * svg/SVGFEGaussianBlurElement.h:
+ * svg/graphics/filters/SVGFEGaussianBlur.cpp: Removed.
+ * svg/graphics/filters/SVGFEGaussianBlur.h: Removed.
+
+2009-10-19 Yael Aharon <yael.aharon@nokia.com>
+
+ Unreviewed.
+
+ Added reviewer name to r49574.
+
+2009-10-19 Joanmarie Diggs <joanmarie.diggs@gmail.com>
+
+ Reviewed by Xan Lopez.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30489
+ [Gtk] The document frame/html container claims to be parentless
+
+ Work around for the parentless claim made by the accessible associated
+ with the embedded WebView. When we identify this condition, get the
+ widget's parent, and then get the AtkObject from that. Admittedly an ugly
+ hack, but we'll need it for Yelp and other Gtk+/GNOME applications which
+ plan to switch over to WebKit.
+
+ * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
+ (webkit_accessible_get_parent):
+
+2009-10-19 Benjamin Otte <otte@gnome.org>
+
+ Reviewed by Jan Alonzo.
+
+ Handle duration queries properly
+ https://bugs.webkit.org/show_bug.cgi?id=29999
+
+ Previously duration queries failed to handle unknown duration
+ and didn't treat the returned duration as an unsigned.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::duration):
+
+2009-10-19 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] Fix build on Windows.
+
+ * plugins/win/PluginViewWin.cpp:
+ (windowHandleForPageClient):
+
+2009-10-19 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Holger Freyther.
+
+ [Qt] Windowed Plugins: Don't crash when client is 0.
+
+ Client is 0 when we use QWebPage without a QWebView or QGraphicsWebView.
+ In addition, setFrameRect()/updatePluginWidget() is called even if the
+ plugin was not succesfully loaded. updatePluginWidget() updates the
+ window rect which is, in theory, useful to draw something that indicates
+ that we didn't load successfully.
+
+ So, a status check is added to setNPWindowIfNeeded.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30380
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::setNPWindowIfNeeded):
+ (WebCore::PluginView::platformStart):
+
+2009-10-19 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Holger Freyther.
+
+ [Qt] Windowed Plugins: Fix crash when QWebPage is deleted after QWebView.
+
+ Fixes various sources of crashes:
+ 1. The PluginContainer is a child of QWebView. When the view gets deleted,
+ the PluginView is not notified about the deletion of PluginContainer.
+ 2. QWebView destructor does not set client to 0.
+ 3. Sometimes pending paint events are sent after the plugin has died, so add
+ a check in PluginView::setNPWindowIfNeeded.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30354
+
+ * plugins/qt/PluginContainerQt.cpp:
+ (PluginContainerQt::~PluginContainerQt):
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::setNPWindowIfNeeded):
+
+2009-10-19 Jakob Truelsen <antialize@gmail.com>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29042
+ Allow one to customize the minimal and maximal shrink factors used when printing.
+
+ * page/PrintContext.cpp:
+ (WebCore::PrintContext::begin):
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ (WebCore::Settings::setPrintingMinimumShrinkFactor):
+ (WebCore::Settings::setPrintingMaximumShrinkFactor):
+ * page/Settings.h:
+ (WebCore::Settings::printingMinimumShrinkFactor):
+ (WebCore::Settings::printingMaximumShrinkFactor):
+
+2009-10-18 Erik Arvidsson <arv@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Fixes issue where doubleclicking a word could select following adjacent newlines.
+ https://bugs.webkit.org/show_bug.cgi?id=30234
+
+ Tests: platform/mac/editing/selection/doubleclick-should-not-expand-across-lines.html
+ platform/mac/editing/selection/script-tests/TEMPLATE.html
+ platform/win/editing/selection/doubleclick-should-not-expand-across-lines.html
+ platform/win/editing/selection/script-tests/TEMPLATE.html
+
+ * editing/VisibleSelection.cpp:
+ (WebCore::VisibleSelection::appendTrailingWhitespace):
+
+2009-10-18 Kevin Ollivier <kevino@theolliviers.com>
+
+ CURL build fix, use proper header name.
+
+ * platform/network/curl/ResourceHandleManager.h:
+
+2009-10-18 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Properties on Arrays and NodeLists are not logged correctly.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30485
+
+ * inspector/front-end/ConsoleView.js:
+ (WebInspector.ConsoleView.prototype._formatarray):
+ (WebInspector.ConsoleView.prototype._printArray):
+
+2009-10-18 Pavel Feldman <pfeldman@chromium.org>
+
+ Not reviewed: touching WebCore so that it
+ initiated inspector frontend deployment on Windows.
+
+ Web Inspector: frontend files are not deployed in Windows
+ incremental build.
+
+ * inspector/InspectorDOMAgent.cpp:
+ (WebCore::InspectorDOMAgent::unbind):
+
+2009-10-18 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Title of dir(["test", "test2"]) should be Array
+
+ https://bugs.webkit.org/show_bug.cgi?id=30486
+
+ Test: inspector/console-tests.html
+
+ * inspector/front-end/InjectedScript.js:
+
+2009-10-18 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ REGRESSION: SVG Mask doesn't work for maskContentUnits="objectBoundingBox"
+ [https://bugs.webkit.org/show_bug.cgi?id=30480]
+
+ Patch for SVGMaskElement landed in r49598 should correct the location of
+ the mask image graphics context. It only corrects the location for userSpaceOnUse
+ mode in maskContentUnits but breaks objectBoundingBoxMode.
+ The maskDestRect shouldn't be moved. It is not responsible for the correct context
+ postioin but for the correct position of the mask image.
+ This patch calculates the context postion independently from the maskDestRect.
+ It also uses lineareRGB color space for masking on CG now. This is the default
+ color space for masking operations.
+ We already have tests for both maskContentUnits modes.
+
+ *svg/W3C-SVG-1.1/masking-intro-01-f.svg
+ *svg/custom/mask-with-default-value.svg
+
+ Some tests needed new pixel tests because of the new color space.
+
+ * svg/SVGMaskElement.cpp:
+ (WebCore::SVGMaskElement::drawMaskerContent):
+
+2009-10-18 Anton Muhin <antonm@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Use v8::Integer::NewFromUnsigned when converting unsigneds into V8's numbers.
+ That is notably faster for small numbers (most common case).
+ https://bugs.webkit.org/show_bug.cgi?id=30493
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+
+2009-10-18 Jan Michael Alonzo <jmalonzo@webkit.org>
+
+ Reviewed by Holger Freyther.
+
+ [GTK] Add MathML to the build system
+ https://bugs.webkit.org/show_bug.cgi?id=30487
+
+ Add MathML sources if MathML support is enabled.
+
+ * GNUmakefile.am:
+
+2009-10-18 Kevin Ollivier <kevino@theolliviers.com>
+
+ Non-PCH build fix. Added missing header.
+
+ * bridge/runtime_root.h:
+
+2009-10-18 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Compositing layers not correctly updated after partial layout
+ https://bugs.webkit.org/show_bug.cgi?id=30425
+
+ When a partial layout happened, for example as the result of a postion-change-only
+ layout, then some compositing layer positions were not correctly updated. To fix
+ this, updateLayerPositions() now carries along a flag that is set at the rootmost
+ layer being updated, and used to determine when we hit the first compositing layer
+ in this update. RenderLayerBacking::updateAfterLayout() makes use of this information
+ to do a full geometry update on that layer, which is thus the rootmost compositing
+ layer that is being updated.
+
+ Test: compositing/geometry/partial-layout-update.html
+
+ * page/FrameView.cpp:
+ (WebCore::FrameView::layout):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::updateLayerPositions):
+ (WebCore::RenderLayer::scrollToOffset):
+ * rendering/RenderLayer.h:
+ (WebCore::RenderLayer::):
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::updateAfterLayout):
+ * rendering/RenderLayerBacking.h:
+
+2009-09-13 Kevin Watters <kevinwatters@gmail.com>
+
+ Reviewed by Kevin Ollivier.
+
+ Add support for proxies in CURL.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30446
+
+ * platform/network/curl/ResourceHandleManager.cpp:
+ (WebCore::ResourceHandleManager::setProxyInfo):
+ (WebCore::ResourceHandleManager::initializeHandle):
+ * platform/network/curl/ResourceHandleManager.h:
+ (WebCore::ResourceHandleManager::):
+
+2009-10-18 Joanmarie Diggs <joanmarie.diggs@gmail.com>
+
+ Reviewed by Xan Lopez
+
+ https://bugs.webkit.org/show_bug.cgi?id=25901
+ Use ATK_ROLE_SECTION for divTag and ATK_ROLE_LABEL for labelTag
+
+ Replaces the use of ATK_ROLE_PANEL with the expected accessible roles.
+
+ * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
+ (webkit_accessible_get_role):
+
+2009-10-17 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Reviewed by George Staikos.
+
+ Cleanup SVGElement code, preparing for animVal support
+ https://bugs.webkit.org/show_bug.cgi?id=30466
+
+ Add new SynchronizablePropertyController and move the code for SVG property <-> XML attribute synchronization
+ from SVGElement. This is a further preparation for animVal support, where SynchronizablePropertyController will
+ be used to control the start/end state of an animated property.
+
+ We're currently tracking animated properties that need synchronization, generalize this concept and use
+ it to track their creation (bound to certain SVG*Element classes) as well as a flag determing the need
+ of synchronization (no SVG DOM object wrappers, no synchronization needed).
+
+ No change in functionality, thus no tests.
+
+ * GNUmakefile.am: Add 'SynchronizablePropertyController.cpp/h' to build
+ * WebCore.gypi: Ditto.
+ * WebCore.pro: Ditto.
+ * WebCore.vcproj/WebCore.vcproj: Ditto.
+ * WebCore.xcodeproj/project.pbxproj: Ditto.
+ * svg/SVGAllInOne.cpp: Ditto.
+ * svg/SVGAnimatedProperty.h: Add registerProperty() function
+ (WebCore::::SVGAnimatedProperty): Call registerProperty() function
+ (WebCore::::registerProperty): Add new registerProperty() function, announcing new properties to SynchronizablePropertyController.
+ * svg/SVGAnimatedTemplate.h: Use propertyController() method, to access the new functions moved from SVGElement.
+ (WebCore::lookupOrCreateWrapper):
+ * svg/SVGElement.cpp: Adapt to code moving to SynchronizablePropertyController.
+ (WebCore::SVGElement::updateAnimatedSVGAttribute):
+ * svg/SVGElement.h: Move handling SVG property synchronization to SynchronizablePropertyController.
+ (WebCore::SVGElement::propertyController): Expose reference to SynchronizablePropertyController object.
+ * svg/SVGViewSpec.cpp: Reorder initialization order of contextElement, leading to possible crashes.
+ (WebCore::SVGViewSpec::SVGViewSpec):
+ (WebCore::SVGViewSpec::viewTarget):
+ * svg/SVGViewSpec.h: Ditto.
+ (WebCore::SVGViewSpec::contextElement):
+ * svg/SynchronizablePropertyController.cpp: Added.
+ (WebCore::SynchronizablePropertyController::SynchronizablePropertyController):
+ (WebCore::SynchronizablePropertyController::registerProperty):
+ (WebCore::SynchronizablePropertyController::setPropertyNeedsSynchronization):
+ (WebCore::SynchronizablePropertyController::synchronizeProperty):
+ (WebCore::SynchronizablePropertyController::synchronizeAllProperties):
+ (WebCore::SynchronizablePropertyController::startAnimation):
+ (WebCore::SynchronizablePropertyController::stopAnimation):
+ * svg/SynchronizablePropertyController.h: Added.
+ (WebCore::SynchronizableProperty::SynchronizableProperty):
+ (WebCore::SynchronizableProperty::isHashTableDeletedValue):
+ (WebCore::SynchronizableProperty::operator==):
+ (WebCore::SynchronizablePropertyHash::hash):
+ (WebCore::SynchronizablePropertyHash::equal):
+ (WebCore::SynchronizablePropertyHashTraits::constructDeletedValue):
+ (WebCore::SynchronizablePropertyHashTraits::isDeletedValue):
+
+2009-10-17 Joanmarie Diggs <joanmarie.diggs@gmail.com>
+
+ Reviewed by Xan Lopez.
+
+ https://bugs.webkit.org/show_bug.cgi?id=25413
+ [GTK] Please expose the level of headings
+
+ Exposes the heading level as an attribute of the AtkObject.
+
+ * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
+ (addAttributeToSet):
+ (webkit_accessible_get_attributes):
+ (webkit_accessible_class_init):
+
+2009-10-17 Kwang Yul Seo <skyul@company100.net>
+
+ Reviewed by Eric Seidel.
+
+ EventHandler::eventLoopHandleMouseDragged needs ENABLE(DRAG_SUPPORT) guards
+ https://bugs.webkit.org/show_bug.cgi?id=30472
+
+ Put ENABLE(DRAG_SUPPORT) guards around EventHandler::eventLoopHandleMouseDragged
+ in EventHandler.cpp. MSVC fails to compile when DRAG_SUPPORT not enabled.
+
+ * page/EventHandler.cpp:
+
+2009-10-17 Alpha Lam <hclam@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ [chromium] Video controls not zoomed / transformed correctly
+ https://bugs.webkit.org/show_bug.cgi?id=30461
+
+ Draw the images in the controls scaled.
+
+ No new tests. With this change Chromium will pass the following tests:
+ LayoutTests/media/video-controls-zoomed.html
+ LayoutTests/media/video-controls-transformed.html
+
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaButton):
+ Pass along the target rect directly.
+ (WebCore::RenderMediaControlsChromium::adjustMediaSliderThumbSize):
+ Adjust the thumb slide applied with the scale factor.
+
+2009-10-17 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Unreviewed.
+
+ [Gtk] Build fix for WebKitGtk after r49723.
+
+ Add bindings/js/JSExceptionBase.* to the build.
+
+ * GNUmakefile.am:
+
+2009-10-17 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Unreviewed.
+
+ [Qt] Build fix for QtWebKit after r49723.
+
+ Add bindings/js/JSExceptionBase.cpp to the build.
+
+ * WebCore.pro:
+
+2009-10-16 Steve Falkenburg <sfalken@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30456
+ Fixes for new Debug_All Windows build configuration.
+
+ * platform/network/cf/ResourceRequestCFNet.cpp:
+ (WebCore::findCFNetworkModule): Ask for the correct library instead of guessing.
+ * platform/win/ScrollbarThemeSafari.cpp: Use new DEBUG_ALL preprocessor define for library naming.
+ * rendering/RenderMediaControls.cpp: Use new DEBUG_ALL preprocessor define for library naming.
+ * rendering/RenderThemeSafari.cpp: Use new DEBUG_ALL preprocessor define for library naming.
+
+2009-10-16 Jon Honeycutt <jhoneycutt@apple.com>
+
+ Add SPI to determine whether a plug-in has ever been halted.
+
+ Part of <rdar://problem/7312158>.
+
+ Reviewed by Dan Bernstein.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::PluginView):
+ Initialize m_hasBeenHalted.
+
+ * plugins/PluginView.h:
+ (WebCore::PluginView::hasBeenHalted):
+ Return m_hasBeenHalted.
+
+ * plugins/win/PluginViewWin.cpp:
+ (WebCore::PluginView::halt):
+ Set m_hasBeenHalted.
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ @charset rule after the first byte causes the rest of css to be ignored
+ https://bugs.webkit.org/show_bug.cgi?id=18265
+
+ Apparently we're supposed to tolerate whitespace before the charset
+ rule so folks can write code like this:
+
+ <style>
+ @charset "utf-8"
+ ...
+ </style>
+
+ I'm told this is one of the top compatability problems in China.
+ Tests: fast/css/comment-before-charset-external.html
+ fast/css/comment-before-charset.html
+ fast/css/many-spaces-before-charset.html
+ fast/css/space-before-charset-external.html
+ fast/css/space-before-charset.html
+
+ * css/CSSGrammar.y:
+
+2009-10-16 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Fixes part of <http://webkit.org/b/30412>.
+ Web Inspector should get human readable DOM Exceptions.
+
+ Add a description field to ExceptionBase, and call it through
+ reportException which allows the user/developer to get a more detailed
+ and coherent error explanation through the Web Inspector.
+
+ This only applies to exceptions that come from a script on the page when
+ it is run. DOM Exceptions that come from the code run in the console, or DOM
+ exceptions that are caught and logged will come in a future patch.
+
+ Tests: inspector/uncaught-dom1-exception.html
+ inspector/uncaught-dom3-exception.html
+ inspector/uncaught-dom8-exception.html
+
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSDOMBinding.cpp:
+ (WebCore::reportException):
+ * bindings/js/JSExceptionBase.cpp: Added.
+ (WebCore::toExceptionBase):
+ * bindings/js/JSExceptionBase.h: Added.
+ * dom/ExceptionBase.cpp:
+ (WebCore::ExceptionBase::ExceptionBase):
+ * dom/ExceptionBase.h:
+ (WebCore::ExceptionBase::description):
+ * dom/ExceptionCode.cpp:
+ (WebCore::):
+ (WebCore::getExceptionCodeDescription):
+ * dom/ExceptionCode.h:
+
+2009-10-16 Geoffrey Garen <ggaren@apple.com>
+
+ Build fix: forgot to check in this #include.
+
+ * bridge/runtime_root.h:
+
+2009-10-16 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Transform layer gets stuck with the wrong transform after an animation ends
+ <rdar://problem/7311662>
+
+ Work around a CoreAnimation bug which causes an animated transform layer to
+ end up with a stale transform.
+
+ Test: compositing/animation/state-at-end-event-transform-layer.html
+
+ * platform/graphics/mac/GraphicsLayerCA.mm:
+ (WebCore::bug7311367Workaround):
+ (WebCore::GraphicsLayerCA::removeAnimationFromLayer):
+
+2009-10-16 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ After running a transition with an end event listener, can't change the transform
+ https://bugs.webkit.org/show_bug.cgi?id=30454
+
+ Fix an issue where, if a document had any listener for webkitTransitionEnd or webkitAnimationEnd,
+ the animations would not get cleaned up correctly, which broke subsequent changes of transform.
+
+ Now, we always clean up the animations right after queuing up the end events.
+
+ Tests: animations/state-at-end-event.html
+ transitions/move-after-transition.html
+
+ * page/animation/ImplicitAnimation.cpp:
+ (WebCore::ImplicitAnimation::onAnimationEnd):
+ * page/animation/KeyframeAnimation.cpp:
+ (WebCore::KeyframeAnimation::onAnimationEnd):
+
+2009-10-15 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Handle the Enter Key in the Elements Tree Hierarchy
+ https://bugs.webkit.org/show_bug.cgi?id=30428
+
+ TextNode => Edit Text Node
+ Has Attributes => Edit First Attribute
+ No Attributes => Start Editing New Attribute
+
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeOutline.prototype.handleKeyEvent): handle the "Enter" key
+ (WebInspector.ElementsTreeElement.prototype.set hovered): only add new attribute button on nodes with attributes
+ (WebInspector.ElementsTreeElement.prototype._addNewAttribute): prevent moving backwards where there are no attributes
+ (WebInspector.ElementsTreeElement.prototype._startEditingFromEvent): renamed to be clearer
+ (WebInspector.ElementsTreeElement.prototype._startEditing): transition to the appropriate edit state for a tree element
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Fix header indent style for FrameLoader and friends
+ https://bugs.webkit.org/show_bug.cgi?id=30430
+
+ * loader/FrameLoader.h:
+ (WebCore::FrameLoader::frame):
+ (WebCore::FrameLoader::policyChecker):
+ (WebCore::FrameLoader::history):
+ (WebCore::FrameLoader::notifier):
+ (WebCore::FrameLoader::isLoadingMainResource):
+ (WebCore::FrameLoader::documentLoader):
+ (WebCore::FrameLoader::policyDocumentLoader):
+ (WebCore::FrameLoader::provisionalDocumentLoader):
+ (WebCore::FrameLoader::state):
+ (WebCore::FrameLoader::client):
+ (WebCore::FrameLoader::url):
+ (WebCore::FrameLoader::isLoadingFromCachedPage):
+ (WebCore::FrameLoader::committingFirstRealLoad):
+ (WebCore::FrameLoader::committedFirstRealDocumentLoad):
+ (WebCore::FrameLoader::creatingInitialEmptyDocument):
+ * loader/HistoryController.h:
+ (WebCore::HistoryController::currentItem):
+ (WebCore::HistoryController::provisionalItem):
+ * loader/PolicyCallback.h:
+ (WebCore::PolicyCallback::request):
+ * loader/PolicyChecker.h:
+ (WebCore::PolicyChecker::loadType):
+ (WebCore::PolicyChecker::setLoadType):
+ (WebCore::PolicyChecker::delegateIsDecidingNavigationPolicy):
+ (WebCore::PolicyChecker::delegateIsHandlingUnimplementablePolicy):
+ * loader/RedirectScheduler.h:
+ * loader/ResourceLoadNotifier.h:
+
+2009-10-16 Steve Falkenburg <sfalken@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Add a Debug_All configuration to build entire stack as debug.
+ Change Debug_Internal to:
+ - stop using _debug suffix for all WebKit/Safari binaries
+ - not use _debug as a DLL naming suffix
+ - use non-debug C runtime lib.
+
+ * WebCore.vcproj/QTMovieWin.vcproj: Add Debug_All configuration.
+ * WebCore.vcproj/WebCore.make: Debug build in makefile should build Debug_All.
+ * WebCore.vcproj/WebCore.sln: Add Debug_All configuration.
+ * WebCore.vcproj/WebCore.submit.sln: Add Debug_All configuration.
+ * WebCore.vcproj/WebCore.vcproj: Add Debug_All configuration.
+ * WebCore.vcproj/WebCoreGenerated.vcproj: Renamed single configuration from "Release" to "all".
+
+2009-10-16 Dimitri Glazkov <dglazkov@chromium.org>
+
+ No review, rolling out r49693, because it broke Chromium build.
+ http://trac.webkit.org/changeset/49693
+
+ * WebCore.gyp/WebCore.gyp:
+ * WebCore.gypi:
+
+2009-10-16 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Carlson.
+
+ Updated media resource selection algorithm to reflect latest HTML 5 specification.
+
+ Noticable changes:
+ - Elements with no source should have their network state set to NETWORK_EMPTY as opposed to NETWORK_NO_SOURCE
+ - Empty string ("") is now considered a valid URL resolving to the current page and will be loaded
+
+ Tests: media/video-src-empty.html
+ media/video-src-none.html
+
+ https://bugs.webkit.org/show_bug.cgi?id=30407
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::selectMediaResource): Updated code and comments to match spec.
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Insecure plug-ins don't trigger mixed content
+ https://bugs.webkit.org/show_bug.cgi?id=30431
+
+ Added the missing check.
+
+ Test: http/tests/security/mixedContent/insecure-plugin-in-iframe.html
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::loadPlugin):
+
+2009-10-16 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Carlson.
+
+ Set autobuffer to true and schedule load in V8 audio element constructor.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30448
+
+ Covered by existing tests.
+
+ * bindings/v8/custom/V8HTMLAudioElementConstructor.cpp:
+ (WebCore::CALLBACK_FUNC_DECL): Set autobuffer to true and schedule load.
+
+2009-10-16 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Remove FIXME in RenderMediaControlsChromium as bug was fixed upstream.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30422
+
+ Covered by existing media layout tests.
+
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaSlider): Removed round() and FIXME.
+
+2009-10-16 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Fix Chromium media controls to render a disabled play button when the element is unintialized.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30410
+
+ Covered by existing layout tests.
+
+ * rendering/RenderMediaControlsChromium.cpp:
+ (WebCore::paintMediaPlayButton): Include check for NETWORK_EMPTY to render disabled play button.
+
+2009-10-16 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Last part -- replace HasDefaultGetPropertyNames with OverridesGetPropertyNames
+ flag.
+
+ * bindings/js/JSDOMWindowShell.h:
+ (WebCore::JSDOMWindowShell::createStructure):
+ * bindings/js/JSHTMLAllCollection.h:
+ (WebCore::JSHTMLAllCollection::createStructure):
+ * bindings/js/JSQuarantinedObjectWrapper.h:
+ (WebCore::JSQuarantinedObjectWrapper::createStructure):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bridge/runtime_array.h:
+ (JSC::RuntimeArray::createStructure):
+ * bridge/runtime_object.h:
+ (JSC::RuntimeObjectImp::createStructure):
+
+2009-10-16 Steven Knight <sgk@chromium.org>
+
+ Reviewed by David Levin.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30447
+ Handle long link lines by building .idl-generated bindings in a
+ separate webcore_bindings library target. Avoid Visual Studio
+ dependency issues by building additional generated .cpp and .h files
+ in a separate webcore_bindings_sources target.
+
+ Chrome should still build and test successfully.
+
+ * WebCore.gyp/WebCore.gyp:
+ * WebCore.gypi:
+
+2009-10-16 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Eric Carlson.
+
+ Transform transitions that used to be accelerated are no longer so
+ https://bugs.webkit.org/show_bug.cgi?id=30453
+
+ The change in r49633, to not run accelerated animations/transitions on layers that
+ are not attached, broke accelerated transitions/animations in many cases where they start
+ as soon as the page loads. This change reverts the code that tests for the GraphicsLayer being
+ attached.
+
+ No test, because it's not possible from a test to know whether a transition is accelerated or not.
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::startAnimation):
+ (WebCore::RenderLayerBacking::startTransition):
+
+2009-10-16 Kevin Ollivier <kevino@theolliviers.com>
+
+ wxMSW build fix, build the MSW source to get methods that use the MSW version of
+ PlatformModuleVersion.
+
+ * wscript:
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Unreviewed build fix. Add back MIMETypeRegistryChromium with the right
+ casing.
+
+ * platform/chromium/MIMETypeRegistryChromium.cpp: Added.
+ (WebCore::MIMETypeRegistry::getMIMETypeForExtension):
+ (WebCore::MIMETypeRegistry::getPreferredExtensionForMIMEType):
+ (WebCore::MIMETypeRegistry::getMIMETypeForPath):
+ (WebCore::MIMETypeRegistry::isSupportedImageMIMEType):
+ (WebCore::MIMETypeRegistry::isSupportedImageResourceMIMEType):
+ (WebCore::MIMETypeRegistry::isSupportedImageMIMETypeForEncoding):
+ (WebCore::MIMETypeRegistry::isSupportedJavaScriptMIMEType):
+ (WebCore::MIMETypeRegistry::isSupportedNonImageMIMEType):
+ (WebCore::MIMETypeRegistry::isSupportedMediaMIMEType):
+ (WebCore::MIMETypeRegistry::isJavaAppletMIMEType):
+ (WebCore::MIMETypeRegistry::getMediaMIMETypeForExtension):
+ (WebCore::dummyHashSet):
+ (WebCore::MIMETypeRegistry::getSupportedImageMIMETypes):
+ (WebCore::MIMETypeRegistry::getSupportedImageResourceMIMETypes):
+ (WebCore::MIMETypeRegistry::getSupportedImageMIMETypesForEncoding):
+ (WebCore::MIMETypeRegistry::getSupportedNonImageMIMETypes):
+ (WebCore::MIMETypeRegistry::getSupportedMediaMIMETypes):
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ MimeTypeRegistryChromium is mis-casen
+ https://bugs.webkit.org/show_bug.cgi?id=30441
+
+ Change the case of MimeTypeRegistryChromium to match other platforms.
+
+ * WebCore.gypi:
+ * platform/chromium/MIMETypeRegistryChromium.cpp: Copied from WebCore/platform/chromium/MimeTypeRegistryChromium.cpp.
+ * platform/chromium/MimeTypeRegistryChromium.cpp: Removed.
+
+2009-10-16 Dimitri Glazkov <dglazkov@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Change EmptyPluginHalterClient in SVGImage to be non-static, to
+ match changes made http://trac.webkit.org/changeset/49385.
+ https://bugs.webkit.org/show_bug.cgi?id=30403
+
+ Run the following layout test sequence:
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-01-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-03-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-04-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-05-b.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-06-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-07-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-08-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-09-t.svg
+ LayoutTests/svg/W3C-SVG-1.1/struct-image-10-t.svg
+ LayoutTests/svg/carto.net/scrollbar.svg
+ LayoutTests/svg/carto.net/selectionlist.svg
+
+ selectionlist.svg should not crash.
+
+ * svg/graphics/SVGImage.cpp:
+ (WebCore::SVGImage::dataChanged): Made EmptyPluginHalterClient non-static.
+
+2009-10-16 Victor Wang <victorw@chromium.org>
+
+ Reviewed by David Levin.
+
+ Add beforeload event support to V8DOMWrapper
+
+ https://bugs.webkit.org/show_bug.cgi?id=30413
+
+ LayoutTests/fast/dom/beforeload/frame-before-load.html
+
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::convertEventToV8Object):
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ MimeTypeRegistryChromium is mis-casen
+ https://bugs.webkit.org/show_bug.cgi?id=30441
+
+ Change the case of MimeTypeRegistryChromium to match other platforms.
+
+ * WebCore.gypi:
+ * platform/chromium/MIMETypeRegistryChromium.cpp: Copied from WebCore/platform/chromium/MimeTypeRegistryChromium.cpp.
+ * platform/chromium/MimeTypeRegistryChromium.cpp: Removed.
+
+2009-10-16 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Mark Rowe.
+
+ Chrome doesn't set Content-Type for file upload when the file extension
+ is not recognized
+ https://bugs.webkit.org/show_bug.cgi?id=30433
+
+ Apparently, getMIMETypeForPath is supposed to return
+ application/octet-stream when it doesn't have a better MIME type.
+
+ * platform/chromium/MimeTypeRegistryChromium.cpp:
+ (WebCore::MIMETypeRegistry::getMIMETypeForPath):
+
+2009-10-16 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Pull out r49676 as it caused build breakges on Symbian
+
+ * plugins/symbian/PluginViewSymbian.cpp:
+
+2009-10-16 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ Crash fix when loading NPAPI plugins on Qt/Mac
+
+ There's no guarantee that the plist will be valid even if we
+ ask the plugin to create it. Crash obverved with iGetter.
+
+ * plugins/mac/PluginPackageMac.cpp:
+
+2009-10-15 Stephen White <senorblanco@chromium.org>
+
+ Reviewed by David Levin.
+
+ Fix for Chromium/skia's implementation of canvas's isPointInPath().
+ https://bugs.webkit.org/show_bug.cgi?id=30402
+
+ Covered by LayoutTests/fast/canvas/pointInPath.html.
+
+ * platform/graphics/skia/SkiaUtils.cpp:
+ (WebCore::SkPathContainsPoint):
+
+2009-10-15 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Factor ResourceLoadNotifier out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30379
+
+ These methods have virtually no interaction with the rest of
+ FrameLoader.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCoreSources.bkl:
+ * dom/Document.cpp:
+ (WebCore::Document::resourceRetrievedByXMLHttpRequest):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::continueLoadAfterWillSubmitForm):
+ (WebCore::ResourceLoadNotifier::ResourceLoadNotifier):
+ (WebCore::ResourceLoadNotifier::activeDocumentLoader):
+ (WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::willSendRequest):
+ (WebCore::ResourceLoadNotifier::didReceiveResponse):
+ (WebCore::ResourceLoadNotifier::didReceiveData):
+ (WebCore::ResourceLoadNotifier::didFailToLoad):
+ (WebCore::ResourceLoadNotifier::didLoadResourceByXMLHttpRequest):
+ (WebCore::FrameLoader::sendRemainingDelegateMessages):
+ (WebCore::FrameLoader::requestFromDelegate):
+ (WebCore::ResourceLoadNotifier::didFinishLoad):
+ (WebCore::ResourceLoadNotifier::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::didCancelAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::dispatchAssignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::dispatchWillSendRequest):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveContentLength):
+ (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+ * loader/FrameLoader.h:
+ (WebCore::FrameLoader::notifier):
+ * loader/MainResourceLoader.cpp:
+ (WebCore::MainResourceLoader::receivedError):
+ * loader/ResourceLoadNotifier.cpp: Added.
+ (WebCore::ResourceLoadNotifier::ResourceLoadNotifier):
+ (WebCore::ResourceLoadNotifier::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::didCancelAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::willSendRequest):
+ (WebCore::ResourceLoadNotifier::didReceiveResponse):
+ (WebCore::ResourceLoadNotifier::didReceiveData):
+ (WebCore::ResourceLoadNotifier::didFinishLoad):
+ (WebCore::ResourceLoadNotifier::didFailToLoad):
+ (WebCore::ResourceLoadNotifier::didLoadResourceByXMLHttpRequest):
+ (WebCore::ResourceLoadNotifier::dispatchAssignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::dispatchWillSendRequest):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveContentLength):
+ (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+ (WebCore::ResourceLoadNotifier::activeDocumentLoader):
+ * loader/ResourceLoadNotifier.h: Added.
+ * loader/ResourceLoader.cpp:
+ (WebCore::ResourceLoader::willSendRequest):
+ (WebCore::ResourceLoader::didReceiveResponse):
+ (WebCore::ResourceLoader::didReceiveData):
+ (WebCore::ResourceLoader::didFinishLoadingOnePart):
+ (WebCore::ResourceLoader::didFail):
+ (WebCore::ResourceLoader::didCancel):
+ (WebCore::ResourceLoader::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoader::didCancelAuthenticationChallenge):
+
+2009-10-15 Roland Steiner <rolandsteiner@google.com>
+
+ Reviewed by Darin Fisher.
+
+ Bug 30427 - Remove unneeded methods in ChromiumDataObject
+ (https://bugs.webkit.org/show_bug.cgi?id=30427)
+
+ Remove no longer needed methods from ChromiumDataObject.
+
+ No new tests (no functional change)
+
+ * platform/chromium/ChromiumDataObject.h:
+
+2009-10-16 Yael Aharon <yael.aharon@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] Need a way to inform the application when a Netscape plugin is created or deleted
+ https://bugs.webkit.org/show_bug.cgi?id=30179
+
+ Inform the application when a plugin is created or destroyed, but only if the
+ application registered for these notifications.
+
+ * plugins/symbian/PluginViewSymbian.cpp:
+ (WebCore::PluginView::platformStart):
+ (WebCore::PluginView::platformDestroy):
+
+2009-10-16 Shu Chang <Chang.Shu@nokia.com>
+
+ Reviewed by Eric Seidel.
+
+ Default language translation should be determined by locale settings,
+ e.g., "en-US".
+ https://bugs.webkit.org/show_bug.cgi?id=29653
+
+ Test: fast/js/navigator-language.html
+
+ * platform/qt/Localizations.cpp:
+ (WebCore::defaultLanguage):
+
+2009-10-16 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ Crash fix when loading NPAPI plugins on Qt/Mac
+
+ There's no guarantee that the plist will be valid even if we
+ ask the plugin to create it. Crash obverved with iGetter.
+
+ * plugins/mac/PluginPackageMac.cpp:
+
+2009-10-15 Stephen White <senorblanco@chromium.org>
+
+ Reviewed by David Levin.
+
+ Fix for Chromium/skia's implementation of canvas's isPointInPath().
+ https://bugs.webkit.org/show_bug.cgi?id=30402
+
+ Covered by LayoutTests/fast/canvas/pointInPath.html.
+
+ * platform/graphics/skia/SkiaUtils.cpp:
+ (WebCore::SkPathContainsPoint):
+
+2009-10-15 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Factor ResourceLoadNotifier out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30379
+
+ These methods have virtually no interaction with the rest of
+ FrameLoader.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCoreSources.bkl:
+ * dom/Document.cpp:
+ (WebCore::Document::resourceRetrievedByXMLHttpRequest):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::continueLoadAfterWillSubmitForm):
+ (WebCore::ResourceLoadNotifier::ResourceLoadNotifier):
+ (WebCore::ResourceLoadNotifier::activeDocumentLoader):
+ (WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::willSendRequest):
+ (WebCore::ResourceLoadNotifier::didReceiveResponse):
+ (WebCore::ResourceLoadNotifier::didReceiveData):
+ (WebCore::ResourceLoadNotifier::didFailToLoad):
+ (WebCore::ResourceLoadNotifier::didLoadResourceByXMLHttpRequest):
+ (WebCore::FrameLoader::sendRemainingDelegateMessages):
+ (WebCore::FrameLoader::requestFromDelegate):
+ (WebCore::ResourceLoadNotifier::didFinishLoad):
+ (WebCore::ResourceLoadNotifier::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::didCancelAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::dispatchAssignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::dispatchWillSendRequest):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveContentLength):
+ (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+ * loader/FrameLoader.h:
+ (WebCore::FrameLoader::notifier):
+ * loader/MainResourceLoader.cpp:
+ (WebCore::MainResourceLoader::receivedError):
+ * loader/ResourceLoadNotifier.cpp: Added.
+ (WebCore::ResourceLoadNotifier::ResourceLoadNotifier):
+ (WebCore::ResourceLoadNotifier::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::didCancelAuthenticationChallenge):
+ (WebCore::ResourceLoadNotifier::assignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::willSendRequest):
+ (WebCore::ResourceLoadNotifier::didReceiveResponse):
+ (WebCore::ResourceLoadNotifier::didReceiveData):
+ (WebCore::ResourceLoadNotifier::didFinishLoad):
+ (WebCore::ResourceLoadNotifier::didFailToLoad):
+ (WebCore::ResourceLoadNotifier::didLoadResourceByXMLHttpRequest):
+ (WebCore::ResourceLoadNotifier::dispatchAssignIdentifierToInitialRequest):
+ (WebCore::ResourceLoadNotifier::dispatchWillSendRequest):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
+ (WebCore::ResourceLoadNotifier::dispatchDidReceiveContentLength):
+ (WebCore::ResourceLoadNotifier::dispatchDidFinishLoading):
+ (WebCore::ResourceLoadNotifier::activeDocumentLoader):
+ * loader/ResourceLoadNotifier.h: Added.
+ * loader/ResourceLoader.cpp:
+ (WebCore::ResourceLoader::willSendRequest):
+ (WebCore::ResourceLoader::didReceiveResponse):
+ (WebCore::ResourceLoader::didReceiveData):
+ (WebCore::ResourceLoader::didFinishLoadingOnePart):
+ (WebCore::ResourceLoader::didFail):
+ (WebCore::ResourceLoader::didCancel):
+ (WebCore::ResourceLoader::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceLoader::didCancelAuthenticationChallenge):
+
+2009-10-15 Roland Steiner <rolandsteiner@google.com>
+
+ Reviewed by Darin Fisher.
+
+ Bug 30427 - Remove unneeded methods in ChromiumDataObject
+ (https://bugs.webkit.org/show_bug.cgi?id=30427)
+
+ Remove no longer needed methods from ChromiumDataObject.
+
+ No new tests (no functional change)
+
+ * platform/chromium/ChromiumDataObject.h:
+
+2009-10-15 Daniel Bates <dbates@webkit.org>
+
+ No review, rolling out r49644.
+ http://trac.webkit.org/changeset/49644
+
+ We need to think about this change some more. See bug #30418
+ for more details.
+
+ * page/XSSAuditor.cpp:
+ (WebCore::XSSAuditor::canEvaluate):
+ (WebCore::XSSAuditor::canEvaluateJavaScriptURL):
+ (WebCore::XSSAuditor::canCreateInlineEventListener):
+ (WebCore::XSSAuditor::canLoadExternalScriptFromSrc):
+ (WebCore::XSSAuditor::canLoadObject):
+ (WebCore::XSSAuditor::canSetBaseElementURL):
+ (WebCore::XSSAuditor::findInRequest):
+ * page/XSSAuditor.h:
+
+2009-10-14 Jon Honeycutt <jhoneycutt@apple.com>
+
+ Add SPI to determine whether a node is a halted plug-in.
+
+ Part of <rdar://problem/7273354> Halted plug-ins should restart on
+ mouseover
+
+ https://bugs.webkit.org/show_bug.cgi?id=30151
+
+ Reviewed by Darin Adler.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::PluginView):
+ Initialize m_isHalted.
+
+ * plugins/PluginView.h:
+ (WebCore::PluginView::isHalted):
+ Return m_isHalted.
+
+ * plugins/win/PluginViewWin.cpp:
+ (WebCore::PluginView::halt):
+ Set m_isHalted to true.
+ (WebCore::PluginView::restart):
+ clear m_isHalted.
+
+2009-10-15 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Oliver Hunt.
+
+ [Qt] Build fix for QtWebKit after r49649.
+
+ Change JSC::HasNonDefaultMark to OverridesMarkChildren in createStructure function.
+
+ * bridge/qt/qt_runtime.h:
+ (JSC::Bindings::QtRuntimeMethod::createStructure):
+
+2009-10-15 Pavel Feldman <pfeldman@chromium.org>
+
+ Not reviewed - build fix.
+
+ Web Inspector: add file missing in r49648
+
+ * inspector/front-end/TestController.js: Added.
+ (WebInspector.TestController):
+ (WebInspector.TestController.prototype.waitUntilDone):
+ (WebInspector.TestController.prototype.notifyDone):
+ (WebInspector.evaluateForTestInFrontend):
+
+2009-10-15 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Part 2 -- Reverse the TypeInfo HasDefaultMark flag to OverridesMarkChildren, etc
+
+ * bindings/js/JSDOMBinding.h:
+ (WebCore::DOMObjectWithGlobalPointer::createStructure):
+ (WebCore::DOMConstructorObject::createStructure):
+ * bindings/js/JSDOMWindowShell.h:
+ (WebCore::JSDOMWindowShell::createStructure):
+ * bindings/js/JSHTMLAllCollection.h:
+ (WebCore::JSHTMLAllCollection::createStructure):
+ * bindings/js/JSQuarantinedObjectWrapper.h:
+ (WebCore::JSQuarantinedObjectWrapper::createStructure):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bridge/qt/qt_runtime.h:
+ (JSC::Bindings::QtRuntimeMethod::createStructure):
+ * bridge/runtime_method.h:
+ (JSC::RuntimeMethod::createStructure):
+
+2009-10-15 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: introduce test controller with waitUntilDone
+ on frontend side.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30400
+
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * inspector/front-end/TestController.js: Added.
+ (WebInspector.TestController):
+ (WebInspector.TestController.prototype.waitUntilDone):
+ (WebInspector.TestController.prototype.notifyDone):
+ (WebInspector.evaluateForTestInFrontend):
+ * inspector/front-end/WebKit.qrc:
+ * inspector/front-end/inspector.html:
+ * inspector/front-end/inspector.js:
+
+2009-10-15 Daniel Bates <dbates@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=27895
+
+ Fixes an issue in which injecting an inline event handler whose value ends in a single-line
+ JavaScript comment can bypass the XSSAuditor. Similarly fixes this issue with respect to
+ the HTML Base element, HTML Object element, inline and external script tags, and
+ JavaScript multi-line variants of all of these attacks.
+
+ Tests: http/tests/security/xssAuditor/base-href-comment.html
+ http/tests/security/xssAuditor/iframe-javascript-url-comment.html
+ http/tests/security/xssAuditor/img-onerror-HTML-comment.html
+ http/tests/security/xssAuditor/img-onerror-comment.html
+ http/tests/security/xssAuditor/object-tag-comment.html
+ http/tests/security/xssAuditor/script-tag-comment-HTML-entity.html
+ http/tests/security/xssAuditor/script-tag-comment.html
+ http/tests/security/xssAuditor/script-tag-with-source-comment.html
+
+ * page/XSSAuditor.cpp: Added constant minAttackLength.
+ (WebCore::XSSAuditor::canEvaluate):
+ (WebCore::XSSAuditor::canEvaluateJavaScriptURL):
+ (WebCore::XSSAuditor::canCreateInlineEventListener):
+ (WebCore::XSSAuditor::canLoadExternalScriptFromSrc):
+ (WebCore::XSSAuditor::canLoadObject):
+ (WebCore::XSSAuditor::canSetBaseElementURL):
+ (WebCore::XSSAuditor::findInRequest): Added parameter context. Only looks at up
+ to minAttackLength of script code plus context (if any).
+ * page/XSSAuditor.h:
+
+2009-10-08 Adam Langley <agl@google.com>
+
+ Reviewed by Eric Seidel.
+
+ Currently, Skia clip paths are 1-bit. This patch makes our path
+ clipping anti-aliased for non-canvas drawing.
+
+ http://code.google.com/p/chromium/issues/detail?id=5927
+ https://bugs.webkit.org/show_bug.cgi?id=28820
+ http://www.imperialviolet.org/2009/09/02/anti-aliased-clipping.html
+
+ Already covered by layout tests. New baselines will be needed in the
+ Chromium tree.
+
+ (Reland. First landed in r49329, reverted in r49330 due to Windows
+ build break)
+
+ * html/canvas/CanvasRenderingContext2D.cpp:
+ (WebCore::CanvasRenderingContext2D::clip):
+ * platform/graphics/GraphicsContext.h:
+ * platform/graphics/cairo/GraphicsContextCairo.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/cg/GraphicsContextCG.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/haiku/GraphicsContextHaiku.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/qt/GraphicsContextQt.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/skia/GraphicsContextSkia.cpp:
+ (WebCore::GraphicsContext::addInnerRoundedRectClip):
+ (WebCore::GraphicsContext::clip):
+ (WebCore::GraphicsContext::canvasClip):
+ (WebCore::GraphicsContext::clipPath):
+ * platform/graphics/skia/PlatformContextSkia.cpp:
+ (PlatformContextSkia::clipPathAntiAliased):
+ (PlatformContextSkia::restore):
+ (PlatformContextSkia::applyAntiAliasedClipPaths):
+ * platform/graphics/skia/PlatformContextSkia.h:
+ * platform/graphics/win/GraphicsContextWin.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/wince/GraphicsContextWince.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+ * platform/graphics/wx/GraphicsContextWx.cpp:
+ (WebCore::GraphicsContext::canvasClip):
+
+2009-10-15 Eric Carlson <eric.carlson@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ <rdar://problem/7295738> No way to mute/unmute a movie in full screen video mode
+
+ * WebCore.Video.exp: Export muted and setMute.
+
+2009-10-15 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Transitions fail to run sometimes
+ https://bugs.webkit.org/show_bug.cgi?id=26770
+
+ Fix an issue where we could attempt to start accelerated animations or transitions on
+ GraphicsLayer that were not rooted (because of visibility:hidden), which would leave
+ the AnimationController's m_waitingForResponse flag in a state that killed subsequent
+ software transitions.
+
+ * page/animation/AnimationController.cpp:
+ (WebCore::AnimationControllerPrivate::AnimationControllerPrivate):
+ (WebCore::AnimationControllerPrivate::endAnimationUpdate):
+ (WebCore::AnimationControllerPrivate::receivedStartTimeResponse):
+ (WebCore::AnimationControllerPrivate::addToStartTimeResponseWaitList):
+ (WebCore::AnimationControllerPrivate::startTimeResponse):
+ * page/animation/AnimationControllerPrivate.h:
+ Make some methods non-inline for ease of debugging (these are not hot methods).
+ Rename m_waitingForAResponse to m_waitingForResponse.
+
+ * platform/graphics/GraphicsLayer.h:
+ * platform/graphics/GraphicsLayer.cpp:
+ (WebCore::GraphicsLayer::hasAncestor):
+ New method to report whether the receiver has the given layer as an ancestor. Used for checking
+ whether a layer is rooted.
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::startAnimation):
+ (WebCore::RenderLayerBacking::startTransition):
+ Don't try to start accelerated animations or transitions on non-rooted GraphicsLayers.
+
+2009-10-15 Alexander Pavlov <apavlov@chromium.org>
+
+ Reviewed by Pavel Feldman.
+
+ Refactor ProfilesPanel to support multiple profile types
+
+ Data describing different profile types are now stored in distinct objects.
+ https://bugs.webkit.org/show_bug.cgi?id=30332
+
+ * WebCore.vcproj/WebCore.vcproj:
+ * inspector/front-end/ProfileView.js:
+ (WebInspector.CPUProfileView.profileCallback):
+ (WebInspector.CPUProfileView):
+ (WebInspector.CPUProfileView.prototype._sortData):
+ (WebInspector.CPUProfileType):
+ (WebInspector.CPUProfileType.prototype.get buttonTooltip):
+ (WebInspector.CPUProfileType.prototype.get buttonStyle):
+ (WebInspector.CPUProfileType.prototype.buttonClicked):
+ (WebInspector.CPUProfileType.prototype.setRecordingProfile):
+ (WebInspector.CPUProfile):
+ (WebInspector.CPUProfile.prototype.get title):
+ (WebInspector.CPUProfile.prototype.get uid):
+ (WebInspector.CPUProfile.prototype.get head):
+ (WebInspector.CPUProfile.prototype.createView):
+ (WebInspector.CPUProfile.prototype.viewForProfile):
+ * inspector/front-end/ProfilesPanel.js:
+ (WebInspector.ProfileType):
+ (WebInspector.ProfileType.prototype.get buttonTooltip):
+ (WebInspector.ProfileType.prototype.get buttonStyle):
+ (WebInspector.ProfileType.prototype.get buttonCaption):
+ (WebInspector.ProfileType.prototype.get id):
+ (WebInspector.ProfileType.prototype.get name):
+ (WebInspector.ProfileType.prototype.buttonClicked):
+ (WebInspector.ProfilesPanel):
+ (WebInspector.ProfilesPanel.prototype.get statusBarItems.clickHandler):
+ (WebInspector.ProfilesPanel.prototype.get statusBarItems):
+ (WebInspector.ProfilesPanel.prototype.reset):
+ (WebInspector.ProfilesPanel.prototype.registerProfileType):
+ (WebInspector.ProfilesPanel.prototype._makeKey):
+ (WebInspector.ProfilesPanel.prototype.addProfileHeader):
+ (WebInspector.ProfilesPanel.prototype.showProfile):
+ (WebInspector.ProfilesPanel.prototype.getProfileType):
+ (WebInspector.ProfilesPanel.prototype.showProfileForURL):
+ (WebInspector.ProfilesPanel.prototype.updateProfileTypeButtons):
+ (WebInspector.ProfilesPanel.prototype.displayTitleForProfileLink):
+ (WebInspector.ProfilesPanel.prototype.get searchableViews):
+ (WebInspector.ProfilesPanel.prototype._updateInterface):
+ * inspector/front-end/inspector.js:
+ (WebInspector._createPanels):
+ (WebInspector.documentClick.followLink):
+ (WebInspector.documentClick):
+ (WebInspector.addProfileHeader):
+ (WebInspector.setRecordingProfile):
+ (WebInspector.linkifyStringAsFragment):
+ (WebInspector.showProfileForURL):
+
+2009-10-15 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Enable inspector layout tests.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30014
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::evaluateForTestInFrontend):
+
+2009-10-15 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GStreamer] READY state doesn't mean "enough data"
+ https://bugs.webkit.org/show_bug.cgi?id=30003
+
+ STATE_READY means MediaPlayer::HaveNothing
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::updateStates):
+
+2009-10-15 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30002
+
+ implement cancelLoad
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::cancelLoad):
+
+2009-10-15 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30353
+
+ Fix race condition, leading to a deadlock
+
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_timeout_func):
+ (webkit_video_sink_render):
+ (unlock_buffer_mutex):
+ (webkit_video_sink_unlock):
+ (webkit_video_sink_unlock_stop):
+ (webkit_video_sink_stop):
+ (webkit_video_sink_start):
+ (webkit_video_sink_class_init):
+ Fix race condition in unlock/render that would lead to deadlocks.
+
+2009-10-15 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30374
+
+ Check if caps are valid before parsing them
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::duration):
+ Check if caps are valid before parsing them in ::naturalSize().
+ This prevents assertions if the natural size should be calculated
+ before the video caps are negotiated.
+
+2009-10-15 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30006
+ [GStreamer] Unnecessary checks for Messages types in callbacks
+
+ refactored gst message callbacks into a single one
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::mediaPlayerPrivateMessageCallback):
+ (WebCore::do_gst_init):
+ (WebCore::MediaPlayerPrivate::duration):
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
+
+2009-10-15 Shu Chang <Chang.Shu@nokia.com>
+
+ Reviewed by Adele Peterson.
+
+ Anchor elements should be mouse focusable regardless isLink flag.
+ https://bugs.webkit.org/show_bug.cgi?id=26856
+
+ * html/HTMLAnchorElement.cpp:
+ * html/HTMLAnchorElement.h:
+
+2009-10-15 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Not reviewed. Sort XCode project file.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-15 Yury Semikhatsky <yurys@chromium.org>
+
+ Reviewed by Dave Hyatt.
+
+ Return correct shorthand property name for
+ background-repeat-x, background-repeat-y, background-position-x,
+ background-position-y, -webkit-mask-position-x, -webkit-mask-position-y,
+ -webkit-mask-repeat-x, -webkit-mask-repeat-y.
+
+ https://bugs.webkit.org/show_bug.cgi?id=28972
+
+ Test: fast/backgrounds/repeat/background-repeat-shorthand.html
+
+ * css/CSSParser.cpp:
+ (WebCore::CSSParser::parseValue):
+
+2009-10-14 Mikhail Naganov <mnaganov@chromium.org>
+
+ Reviewed by Pavel Feldman.
+
+ Web Inspector: Migrate profiles to the injected script-based schema.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30328
+
+ * bindings/js/JSInspectorBackendCustom.cpp:
+ * bindings/v8/custom/V8CustomBinding.h:
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::getProfileHeaders):
+ (WebCore::InspectorBackend::getProfile):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::addProfile):
+ (WebCore::InspectorController::getProfileHeaders):
+ (WebCore::InspectorController::getProfile):
+ (WebCore::InspectorController::createProfileHeader):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addProfileHeader):
+ (WebCore::InspectorFrontend::didGetProfileHeaders):
+ (WebCore::InspectorFrontend::didGetProfile):
+ * inspector/InspectorFrontend.h:
+ * inspector/JavaScriptProfileNode.cpp:
+ (WebCore::ProfileNodeClass):
+ * inspector/front-end/ProfileView.js:
+ (WebInspector.ProfileView.profileCallback):
+ (WebInspector.ProfileView):
+ (WebInspector.ProfileView.prototype._mouseDownInDataGrid):
+ (WebInspector.ProfileView.prototype._assignParentsInProfile):
+ * inspector/front-end/ProfilesPanel.js:
+ (WebInspector.ProfilesPanel.prototype.addProfileHeader):
+ * inspector/front-end/inspector.js:
+ (WebInspector.addProfileHeader):
+
+2009-10-14 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Create and update frontend script objects only when
+ web inspector is visible.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30376
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::addConsoleMessage):
+ (WebCore::InspectorController::populateScriptObjects):
+ (WebCore::InspectorController::pruneResources):
+ (WebCore::InspectorController::didCommitLoad):
+ (WebCore::InspectorController::didLoadResourceFromMemoryCache):
+ (WebCore::InspectorController::identifierForInitialRequest):
+ (WebCore::InspectorController::mainResourceFiredDOMContentEvent):
+ (WebCore::InspectorController::mainResourceFiredLoadEvent):
+ (WebCore::InspectorController::willSendRequest):
+ (WebCore::InspectorController::didReceiveResponse):
+ (WebCore::InspectorController::didReceiveContentLength):
+ (WebCore::InspectorController::didFinishLoading):
+ (WebCore::InspectorController::didFailLoading):
+ (WebCore::InspectorController::resourceRetrievedByXMLHttpRequest):
+ (WebCore::InspectorController::scriptImported):
+ (WebCore::InspectorController::didOpenDatabase):
+ (WebCore::InspectorController::didUseDOMStorage):
+ (WebCore::InspectorController::evaluateForTestInFrontend):
+
+2009-10-15 Joseph Pecoraro <joepeck@webkit.org>
+
+ Fix Windows build.
+
+ * dom/Document.idl:
+
+2009-10-14 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ [HTML5] Add document.head
+ https://bugs.webkit.org/show_bug.cgi?id=30232
+
+ Test is fast/dom/document-head.html
+
+ * dom/Document.idl: added readonly attribute head
+
+2009-10-14 Matt Mueller <mattm@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Check FNonNeg after the unit switch to avoid valgrind uninitialised conditional reference in WebCore::CSSParser::validUnit. See http://crbug.com/20939.
+ https://bugs.webkit.org/show_bug.cgi?id=30347
+ https://bugs.webkit.org/show_bug.cgi?id=22772
+
+ Covered by running LayoutTests/fast/css/invalid-percentage-property.html under valgrind.
+
+ * css/CSSParser.cpp:
+ (WebCore::CSSParser::validUnit):
+
+2009-10-14 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Sam Weinig.
+
+ Move scrolling code from FrameLoader to FrameView
+ https://bugs.webkit.org/show_bug.cgi?id=30370
+
+ This code is about controlling the Frame's view, not about loading
+ stuff into the frame.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::finishedParsing):
+ (WebCore::FrameLoader::scrollToAnchor):
+ * page/FrameView.cpp:
+ (WebCore::FrameView::scrollToFragment):
+ (WebCore::FrameView::scrollToAnchor):
+ * page/FrameView.h:
+
+2009-10-14 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Geoff Garen.
+
+ Make typeinfo flags default to false
+ https://bugs.webkit.org/show_bug.cgi?id=30372
+
+ Part 1. Reverse the HasStandardGetOwnPropertySlot flag.
+
+ * bindings/js/JSDOMBinding.h:
+ (WebCore::DOMObjectWithGlobalPointer::createStructure):
+ (WebCore::DOMConstructorObject::createStructure):
+ * bindings/js/JSDOMWindowShell.h:
+ (WebCore::JSDOMWindowShell::createStructure):
+ * bindings/js/JSHTMLAllCollection.h:
+ (WebCore::JSHTMLAllCollection::createStructure):
+ * bindings/js/JSQuarantinedObjectWrapper.h:
+ (WebCore::JSQuarantinedObjectWrapper::createStructure):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bridge/objc/objc_runtime.h:
+ (JSC::Bindings::ObjcFallbackObjectImp::createStructure):
+ * bridge/runtime_array.h:
+ (JSC::RuntimeArray::createStructure):
+ * bridge/runtime_method.h:
+ (JSC::RuntimeMethod::createStructure):
+ * bridge/runtime_object.h:
+ (JSC::RuntimeObjectImp::createStructure):
+
+2009-10-14 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ [XSSAuditor] Add an exception for local files
+ https://bugs.webkit.org/show_bug.cgi?id=30352
+
+ Reduce XSS auditor false positives by always letting pages load scripts
+ from their own host. We don't actually know of any false positives
+ that this prevents, but it seems like a good idea.
+
+ One subtly is that we don't add this exception for scripts that have a
+ query string because (1) URLs with query strings are more apt to
+ confuse servers and (2) it is much less common to load scripts with a
+ query string.
+
+ Tests: http/tests/security/xssAuditor/script-tag-with-source-same-host-with-query.html
+ http/tests/security/xssAuditor/script-tag-with-source-same-host.html
+
+ * page/XSSAuditor.cpp:
+ (WebCore::XSSAuditor::canLoadExternalScriptFromSrc):
+
+2009-10-14 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Reviewed by George Staikos.
+
+ Kill virtual contextElement() method spread all over SVG code
+ https://bugs.webkit.org/show_bug.cgi?id=30183
+
+ Remove virtual contextElement() function from all SVG*Element classes, as all animated properties live in the
+ SVG*Element classes now instead of the SVGFitToViewBox / SVGURIReference / SVGExternalResourcesRequired
+ subclasses. This is a first step to working animVal support. More patches will follow that depend on this change.
+
+ Remove "This file is part of the KDE project" from several files, change my old mail adress wildfox -> zimmermann,
+ and remove vim modelines on all files I touched. No change in functionality, thus no new tests.
+
+ * svg/SVGAElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGAltGlyphElement.h: Remove virtual contextElement() method.
+ * svg/SVGAnimatedProperty.h:
+ (WebCore::::synchronize):
+ (WebCore::::startAnimation):
+ (WebCore::::stopAnimation):
+ * svg/SVGAnimationElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGCircleElement.h: Ditto.
+ * svg/SVGClipPathElement.h: Ditto.
+ * svg/SVGCursorElement.h: Ditto.
+ * svg/SVGDefsElement.h: Ditto.
+ * svg/SVGEllipseElement.h: Ditto.
+ * svg/SVGExternalResourcesRequired.h: Remove pure-virtual contextElement() method.
+ * svg/SVGFEImageElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGFELightElement.h: Remove virtual contextElement() method.
+ * svg/SVGFEMergeNodeElement.h: Ditto.
+ * svg/SVGFilterElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGFilterPrimitiveStandardAttributes.h: Remove virtual contextElement() method.
+ * svg/SVGFitToViewBox.cpp:
+ (WebCore::SVGFitToViewBox::parseViewBox): Add Document* parameter - we used to fetch the Document pointer from the context element.
+ (WebCore::SVGFitToViewBox::parseMappedAttribute): Ditto.
+ * svg/SVGFitToViewBox.h: Remove pure-virtual contextElement() method.
+ * svg/SVGFontElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGForeignObjectElement.h: Ditto.
+ * svg/SVGGElement.h: Ditto.
+ * svg/SVGGradientElement.h: Ditto.
+ * svg/SVGImageElement.h: Ditto.
+ * svg/SVGLineElement.h: Ditto.
+ * svg/SVGMPathElement.h: Ditto. Fix license indention.
+ * svg/SVGMarkerElement.cpp:
+ (WebCore::SVGMarkerElement::parseMappedAttribute): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ * svg/SVGMarkerElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGMaskElement.h: Ditto.
+ * svg/SVGPathElement.h: Ditto.
+ * svg/SVGPatternElement.cpp:
+ (WebCore::SVGPatternElement::parseMappedAttribute): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ * svg/SVGPatternElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGPolyElement.cpp:
+ (WebCore::SVGPolyElement::updateAnimatedSVGAttribute): synchronizeProperty<...>() has been renamed to PropertySynchronizer<...>::synchronize().
+ * svg/SVGPolyElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGRectElement.h: Ditto.
+ * svg/SVGSVGElement.cpp:
+ (WebCore::SVGSVGElement::parseMappedAttribute): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ * svg/SVGSVGElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGScriptElement.h: Ditto.
+ * svg/SVGSwitchElement.h: Ditto.
+ * svg/SVGSymbolElement.cpp:
+ (WebCore::SVGSymbolElement::parseMappedAttribute): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ * svg/SVGSymbolElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGTRefElement.h: Remove virtual contextElement() method.
+ * svg/SVGTextContentElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGTextPathElement.h: Remove virtual contextElement() method.
+ * svg/SVGUseElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGViewElement.cpp:
+ (WebCore::SVGViewElement::parseMappedAttribute): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ * svg/SVGViewElement.h: Remove virtual contextElement() method. Change OwnerType of ANIMATED_* macros to this class.
+ * svg/SVGViewSpec.cpp:
+ (WebCore::SVGViewSpec::setViewBoxString): Pass document() to SVGFitToViewBox::parseMappedAttribute().
+ (WebCore::SVGViewSpec::parseViewSpec): Ditto.
+ * svg/SVGViewSpec.h: Devirtualize contextElement() method, it's the only place where contextElement() remains needed.
+
+2009-10-14 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ SVG Masking with wrong offset
+ [https://bugs.webkit.org/show_bug.cgi?id=30325]
+
+ SVGMaskElement moves the mask image graphics context to the wrong location.
+ In objectBoundingBoxMode the maskDestRect gets translated. This transformation
+ is not used in the later calculation. Fix by consistenly calculating the translation
+ offsets from the final mask destination rect.
+
+ Test: svg/custom/mask-with-default-value.svg
+
+ * svg/SVGMaskElement.cpp:
+ (WebCore::SVGMaskElement::drawMaskerContent):
+
+2009-10-14 Kevin Decker <kdecker@apple.com>
+
+ Rubberstamped by Jon Honeycutt.
+
+ Export a few more showSubstituteImage() related methods.
+
+ * WebCore.base.exp:
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-14 Evan Martin <evan@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Stringify CSS units manually (without printf) to make the formatting
+ locale-insensitive and obey CSS spec with respect to large values.
+
+ https://bugs.webkit.org/show_bug.cgi?id=18994
+
+ * css/CSSPrimitiveValue.cpp:
+ (WebCore::appendCSSDouble):
+ (WebCore::formatWithUnits):
+ (WebCore::CSSPrimitiveValue::cssText):
+
+2009-10-14 Mark Seaborn <mseaborn@google.com>
+
+ Reviewed by Darin Adler.
+
+ Check error return value in Perl build script
+ https://bugs.webkit.org/show_bug.cgi?id=30316
+
+ * css/makevalues.pl: Die if gperf fails.
+
+2009-10-14 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ SVG wrong filterRegions for userSpaceOnUse and percentage values
+ [https://bugs.webkit.org/show_bug.cgi?id=30330]
+
+ Some clean-up of the SVG filter calculation code. This clean-up
+ also fixes the problem with percentage and userSpaceInUse mode.
+
+ Test: svg/filters/subRegion-in-userSpace.svg
+
+ * platform/graphics/filters/FilterEffect.cpp:
+ (WebCore::FilterEffect::FilterEffect):
+ * platform/graphics/filters/FilterEffect.h:
+ * rendering/SVGRenderSupport.cpp:
+ (WebCore::SVGRenderBase::filterBoundingBoxForRenderer):
+ * svg/SVGFilterElement.cpp:
+ (WebCore::SVGFilterElement::buildFilter):
+ (WebCore::SVGFilterElement::canvasResource):
+ * svg/SVGFilterElement.h:
+ * svg/SVGFilterPrimitiveStandardAttributes.cpp:
+ (WebCore::SVGFilterPrimitiveStandardAttributes::setStandardAttributes):
+ * svg/graphics/SVGResourceFilter.cpp:
+ (WebCore::SVGResourceFilter::SVGResourceFilter):
+ (WebCore::SVGResourceFilter::~SVGResourceFilter):
+ (WebCore::SVGResourceFilter::addFilterEffect):
+ (WebCore::SVGResourceFilter::prepareFilter):
+ * svg/graphics/SVGResourceFilter.h:
+ (WebCore::SVGResourceFilter::create):
+ * svg/graphics/filters/SVGFilter.cpp:
+ (WebCore::SVGFilter::SVGFilter):
+ (WebCore::SVGFilter::calculateEffectSubRegion):
+ (WebCore::SVGFilter::create):
+ * svg/graphics/filters/SVGFilter.h:
+
+2009-10-14 Chris Marrin <cmarrin@apple.com>
+
+ The last change fixed the problem, removing diagnostic printfs.
+
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::GraphicsContext3D):
+
+2009-10-14 Kevin Ollivier <kevino@theolliviers.com>
+
+ CURL build fix for versions < 7.18.
+
+ * platform/network/curl/ResourceHandleCurl.cpp:
+ (WebCore::ResourceHandle::setDefersLoading):
+ * platform/network/curl/ResourceHandleManager.cpp:
+ (WebCore::ResourceHandleManager::initializeHandle):
+
+2009-10-14 Chris Marrin <cmarrin@apple.com>
+
+ One more round of changes to figure out why the webgl
+ tests are crashing on the build bot. Here I am trying
+ to see if we can create a software renderer. I am also
+ printing the found pixel formats.
+
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::GraphicsContext3D):
+
+2009-10-14 Yael Aharon <yael.aharon@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Enabling NPAPI plugin support on Qt Webkit for S60 platform
+ https://bugs.webkit.org/show_bug.cgi?id=29302
+
+ Also implemented by Mahesh Kulkarni<mahesh.kulkarni@nokia.com>,
+ Rohini Ananth <rohini.ananth@nokia.com> and help from Norbert Lesr
+ <norbert.leser@nokia.com>
+
+ * WebCore.pro:
+ Enabling ENABLE_NETSCAPE_PLUGIN_API for S60 and added S60 specific
+ new plugin files to be compiled under symbian: macro
+
+ * bridge/npapi.h:
+ Added NPEvent and NPRegion definition for Symbian
+
+ * plugins/PluginPackage.h:
+ Added S60 specific plugin interface and plugin loader variables
+ * plugins/PluginPackage.cpp:
+ (WebCore::PluginPackage::unload): Added !PLATFORM(SYMBIAN) macro.
+ Default implementation to be used only for non-symbian platform
+ * plugins/PluginDatabase.cpp:
+ Macro !SYMBIAN checking
+ * plugins/PluginView.h:
+ Add Symbian to platforms that support setNPWindowIfNeeded
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::setFrameRect): Add Symbian to platforms that
+ call setNPWindowRect from setFrameRect
+
+ Added folder 'symbian' which contains implementation files for S60
+ platform-specific NPAPI plugin functionality, under /plugins folder
+ * plugins/symbian
+ * plugins/symbian/npinterface.h:
+ Plugin Interface to be implemented by S60 NPAPI plugins
+ * plugins/symbian/PluginContainerSymbian.h:
+ * plugins/symbian/PluginContainerSymbian.cpp:
+ * plugins/symbian/PluginDatabaseSymbian.cpp:
+ * plugins/symbian/PluginViewSymbian.cpp:
+ * plugins/symbian/PluginPackageSymbian.cpp:
+
+2009-10-14 Chris Marrin <cmarrin@apple.com>
+
+ More changes to figure out why the webgl tests are crashing on the build bot.
+
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::GraphicsContext3D):
+
+2009-10-14 Victor Wang <victorw@chromium.org>
+
+ Reviewed by David Hyatt.
+
+ Round non-integer line height values.
+
+ Change webkit to rounding non-integer line height values
+ instead of truncating them. This fixes a layout test
+ failure on Windows and matches the calculation in IE and Firefox.
+
+ https://bugs.webkit.org/show_bug.cgi?id=24434
+
+ Test: fast/css/line-height-rounding.html
+ fast/forms/textarea-scrollbar-height.htm
+
+ * css/CSSComputedStyleDeclaration.cpp:
+ (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
+ * rendering/InlineFlowBox.cpp:
+ (WebCore::InlineFlowBox::computeLogicalBoxHeights):
+ * rendering/RenderBR.cpp:
+ (WebCore::RenderBR::lineHeight):
+ * rendering/style/RenderStyle.h:
+ (WebCore::InheritedFlags::computedLineHeight):
+
+2009-10-13 Kelly Norton <knorton@google.com>
+
+ Reviewed by Pavel Feldman.
+
+ Removes the persistent setting for InspectorTimelineAgent and renames timeline related
+ interfaces to be more consistent with the JavaScript profiler.
+
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::startTimelineProfiler):
+ (WebCore::InspectorBackend::stopTimelineProfiler):
+ (WebCore::InspectorBackend::timelineProfilerEnabled):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::setFrontendProxyObject):
+ (WebCore::InspectorController::startTimelineProfiler):
+ (WebCore::InspectorController::stopTimelineProfiler):
+ (WebCore::InspectorController::timelineProfilerEnabled):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::timelineProfilerWasStarted):
+ (WebCore::InspectorFrontend::timelineProfilerWasStopped):
+ * inspector/InspectorFrontend.h:
+ * inspector/front-end/TimelineAgent.js:
+ (WebInspector.timelineProfilerWasStarted):
+ (WebInspector.timelineProfilerWasStopped):
+
+2009-10-01 Yong Li <yong.li@torchmobile.com>
+
+ Reviewed by Adele Peterson.
+
+ Fix crash when loading invalid image data
+ https://bugs.webkit.org/show_bug.cgi?id=29980
+
+ * rendering/RenderImage.cpp:
+ (WebCore::RenderImage::setImageSizeForAltText):
+
+2009-10-09 Stephen White <senorblanco@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Fix for NULL ptr deref in canvas's toDataURL().
+ https://bugs.webkit.org/show_bug.cgi?id=30254
+
+ Test: fast/canvas/canvas-toDataURL-crash.html
+
+ * html/HTMLCanvasElement.cpp:
+ (WebCore::HTMLCanvasElement::toDataURL):
+
+2009-10-14 Pavel Feldman <pfeldman@chromium.org>
+
+ Not reviewed, reverting r49558 since it broke profiler tests.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30328
+
+ * bindings/js/JSInspectorBackendCustom.cpp:
+ * bindings/v8/custom/V8CustomBinding.h:
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::getProfileHeaders):
+ (WebCore::InspectorBackend::getProfile):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::addProfile):
+ (WebCore::InspectorController::getProfileHeaders):
+ (WebCore::InspectorController::getProfile):
+ (WebCore::InspectorController::createProfileHeader):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addProfileHeader):
+ (WebCore::InspectorFrontend::didGetProfileHeaders):
+ (WebCore::InspectorFrontend::didGetProfile):
+ * inspector/InspectorFrontend.h:
+ * inspector/JavaScriptProfileNode.cpp:
+ (WebCore::ProfileNodeClass):
+ * inspector/front-end/ProfileView.js:
+ (WebInspector.ProfileView.profileCallback):
+ (WebInspector.ProfileView):
+ (WebInspector.ProfileView.prototype._mouseDownInDataGrid):
+ (WebInspector.ProfileView.prototype._assignParentsInProfile):
+ * inspector/front-end/ProfilesPanel.js:
+ (WebInspector.ProfilesPanel.prototype.addProfileHeader):
+ * inspector/front-end/inspector.js:
+ (WebInspector.addProfileHeader):
+
+2009-10-13 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ ImageDecoderQt: Minor tweaks to the decoder
+
+ - Only cache the data when we start to use it.
+ - Start with a repetition count of none for normal images.
+ - Do not use canRead as this will trigger parsing of the full image
+ - Cope with a GIF failing to decode the first frame, do not
+ set m_failed to true if decoding the first frame failed
+ - Inform the QImageReader about the format that was detected
+ - Always create a ImageDecoderQt when when we have more
+ than four byte.
+
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoder::create): Always create QImageReader for a significant speed up
+ (WebCore::ImageDecoderQt::ImageDecoderQt): Initialize m_repetitionCount to cAnimationNone
+ (WebCore::ImageDecoderQt::setData): Only call ImageDecoder::setData when everything has been received
+ (WebCore::ImageDecoderQt::isSizeAvailable): Do not check m_failed twice.
+ (WebCore::ImageDecoderQt::filenameExtension): Convert from QByteArray to String
+ (WebCore::ImageDecoderQt::frameBufferAtIndex): Check for m_failed before trying to decode
+ (WebCore::ImageDecoderQt::internalDecodeSize): Fail if the size is QSize()
+ (WebCore::ImageDecoderQt::forceLoadEverything): Handle the case were decoding the first frame fails
+ * platform/graphics/qt/ImageDecoderQt.h: Change the m_format type
+
+2009-10-14 Mikhail Naganov <mnaganov@chromium.org>
+
+ Reviewed by Pavel Feldman.
+
+ Web Inspector: Migrate profiles to the injected script-based schema.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30328
+
+ * bindings/js/JSInspectorBackendCustom.cpp:
+ * bindings/v8/custom/V8CustomBinding.h:
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::getProfileHeaders):
+ (WebCore::InspectorBackend::getProfile):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::addProfile):
+ (WebCore::InspectorController::getProfileHeaders):
+ (WebCore::InspectorController::getProfile):
+ (WebCore::InspectorController::createProfileHeader):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addProfileHeader):
+ (WebCore::InspectorFrontend::didGetProfileHeaders):
+ (WebCore::InspectorFrontend::didGetProfile):
+ * inspector/InspectorFrontend.h:
+ * inspector/JavaScriptProfileNode.cpp:
+ (WebCore::ProfileNodeClass):
+ * inspector/front-end/ProfileView.js:
+ (WebInspector.ProfileView.profileCallback):
+ (WebInspector.ProfileView):
+ (WebInspector.ProfileView.prototype._mouseDownInDataGrid):
+ (WebInspector.ProfileView.prototype._assignParentsInProfile):
+ * inspector/front-end/ProfilesPanel.js:
+ (WebInspector.ProfilesPanel.prototype.addProfileHeader):
+ * inspector/front-end/inspector.js:
+ (WebInspector.addProfileHeader):
+
+2009-10-13 Yury Semikhatsky <yurys@chromium.org>
+
+ Reviewed by Pavel Feldman.
+
+ Don't collect call frame properties until they're needed for completion.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30334
+
+ * inspector/front-end/ConsoleView.js:
+ (WebInspector.ConsoleView.prototype.completions):
+ * inspector/front-end/InjectedScript.js:
+ (InjectedScript.getCompletions): if call frame id is specified and the expression is empty collect frame properties.
+ (InjectedScript.CallFrameProxy.prototype._wrapScopeChain): don't send call frame properties until they're needed.
+ * inspector/front-end/ScriptsPanel.js:
+
+>>>>>>> .r49765
+2009-10-13 Yongjun Zhang <yongjun.zhang@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29106
+ [Qt] make CachedResourceHandle.h compile in winscw Symbian compiler.
+
+ Don't inline constructor CachedResourceHandle<T>(R*) to stop winscw
+ compiler aggressively resolve inheritance of class R.
+
+ The winscw compiler bug is reported at:
+ https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812.
+
+ The change should be reverted when the above bug is fixed in winscw compiler.
+
+ * loader/CachedResourceHandle.h:
+ (WebCore::::CachedResourceHandle):
+
+2009-10-13 Dimitri Glazkov <dglazkov@chromium.org>
+
+ No review, rolling out r49554, because it broke Win and Chromium builds.
+ http://trac.webkit.org/changeset/49554
+
+ * css/CSSPrimitiveValue.cpp:
+ (WebCore::CSSPrimitiveValue::cssText):
+
+2009-10-13 Evan Martin <evan@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Stringify CSS units manually (without printf) to make the formatting
+ locale-insensitive and obey CSS spec with respect to large values.
+
+ https://bugs.webkit.org/show_bug.cgi?id=18994
+
+ * css/CSSPrimitiveValue.cpp:
+ (WebCore::appendCSSDouble):
+ (WebCore::formatWithUnits):
+ (WebCore::CSSPrimitiveValue::cssText):
+
+2009-10-13 Evan Martin <evan@chromium.org>
+
+ Reviewed by David Levin.
+
+ Make grippy lines vertical on horizontal scrollbars in Linux Chrome.
+ While we're rebaselining scrollbars, fix an off by one in the vertical
+ scrollbar rendering too.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30319
+
+ Tests: this is covered by every pixel test involving scrollbars.
+
+ * platform/chromium/ScrollbarThemeChromiumLinux.cpp:
+ (WebCore::ScrollbarThemeChromiumLinux::paintThumb):
+
+2009-10-13 Sam Weinig <sam@webkit.org>
+
+ Reviewed by David Hyatt.
+
+ Fix issue where clientX and clientY on MouseEvents were wrong when
+ the page was zoomed and scrolled.
+
+ Test: fast/events/clientXY-in-zoom-and-scroll.html
+
+ * dom/MouseRelatedEvent.cpp:
+ (WebCore::contentsX): Take page zoom into account.
+ (WebCore::contentsY): Ditto.
+
+2009-10-13 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Change the order of arguments on some of the user stylesheet/script functions. Split the removal functions
+ out into separate ones for scripts and stylesheets.
+
+ * WebCore.base.exp:
+ * page/PageGroup.cpp:
+ (WebCore::PageGroup::addUserScriptToWorld):
+ (WebCore::PageGroup::addUserStyleSheetToWorld):
+ (WebCore::PageGroup::removeUserScriptFromWorld):
+ (WebCore::PageGroup::removeUserStyleSheetFromWorld):
+ (WebCore::PageGroup::removeUserScriptsFromWorld):
+ (WebCore::PageGroup::removeUserStyleSheetsFromWorld):
+ * page/PageGroup.h:
+ (WebCore::PageGroup::userScripts):
+ (WebCore::PageGroup::userStyleSheets):
+
+2009-10-13 Evan Martin <evan@chromium.org>
+
+ Reviewed by Dmitry Titov.
+
+ Chrome's "Skia" theme paints select controls backwards in RTL.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30320
+
+ Test: fast/text/international/bidi-menulist.html
+ (The test is about something else, but it includes RTL selects.)
+
+ * rendering/RenderThemeChromiumSkia.cpp:
+ (WebCore::RenderThemeChromiumSkia::paintMenuList): flip the arrow position in RTL case.
+
+2009-10-13 Dmitry Titov <dimich@chromium.org>
+
+ Reviewed by Alexey Proskuryakov.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30318
+ ScriptExecutionContext is not anymore needed to create an EventListener - remove old code.
+ It's a followup to r48884. It removed the need to pass the ScritpExecutionContext
+ into EventListener constructor but did not remove the code pulling ScriptExecutionContext.
+
+ Tests:
+ Test adds event listener to a DocumentType Node which is created without a document
+ and then dispatches the event after attaching a node to the tree. Event
+ should fire when node is attached to the tree.
+
+ * fast/events/add-event-without-document-expected.txt: Added.
+ * fast/events/add-event-without-document.html: Added.
+
+ All changes in files below are the same - remove the code that calls
+ EventTarget::scriptExecutionContext and checks it for NULL.
+
+ * bindings/js/JSAbstractWorkerCustom.cpp:
+ (WebCore::JSAbstractWorker::addEventListener):
+ (WebCore::JSAbstractWorker::removeEventListener):
+ * bindings/js/JSDOMApplicationCacheCustom.cpp:
+ (WebCore::JSDOMApplicationCache::addEventListener):
+ (WebCore::JSDOMApplicationCache::removeEventListener):
+ * bindings/js/JSDesktopNotificationsCustom.cpp:
+ (WebCore::JSNotification::addEventListener):
+ (WebCore::):
+ * bindings/js/JSEventSourceCustom.cpp:
+ (WebCore::JSEventSource::addEventListener):
+ (WebCore::JSEventSource::removeEventListener):
+ * bindings/js/JSMessagePortCustom.cpp:
+ (WebCore::JSMessagePort::addEventListener):
+ (WebCore::JSMessagePort::removeEventListener):
+ * bindings/js/JSNodeCustom.cpp:
+ (WebCore::JSNode::addEventListener):
+ (WebCore::JSNode::removeEventListener):
+ * bindings/js/JSSVGElementInstanceCustom.cpp:
+ (WebCore::JSSVGElementInstance::addEventListener):
+ (WebCore::JSSVGElementInstance::removeEventListener):
+ * bindings/js/JSXMLHttpRequestCustom.cpp:
+ (WebCore::JSXMLHttpRequest::addEventListener):
+ (WebCore::JSXMLHttpRequest::removeEventListener):
+ * bindings/js/JSXMLHttpRequestUploadCustom.cpp:
+ (WebCore::JSXMLHttpRequestUpload::addEventListener):
+ (WebCore::JSXMLHttpRequestUpload::removeEventListener):
+ * bindings/js/JSWebSocketCustom.cpp:
+ (WebCore::JSWebSocket::addEventListener):
+ (WebCore::JSWebSocket::removeEventListener):
+
+2009-10-13 Drew Wilson <atwilson@atwilson-macpro.local>
+
+ Reviewed by David Levin.
+
+ Enable SHARED_WORKERS for Chromium
+ https://bugs.webkit.org/show_bug.cgi?id=30289
+
+ Cleaned up bitrot in SharedWorker V8 bindings.
+
+ * WebCore.gypi:
+ Removed default implementation of SharedWorkerRepository so Chromium can provide its own.
+ * bindings/v8/DerivedSourcesAllInOne.cpp:
+ Added V8SharedWorkerContext.cpp.
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getTemplate):
+ Added case statements for SHAREDWORKER and SHAREDWORKERCONTEXT.
+ * bindings/v8/V8Index.cpp:
+ Now includes V8SharedWorkerContext.h to allow supporting SharedWorkers.
+ * bindings/v8/V8Index.h:
+ Added definition for SHAREDWORKERCONTEXT wrapper.
+ * bindings/v8/WorkerContextExecutionProxy.cpp:
+ Added includes for SharedWorker.h and SharedWorkerContext.h.
+ * bindings/v8/custom/V8CustomBinding.h:
+ Reorganized Worker field indexes to be clearer, and fixed mismatch in worker field index.
+ Also added field indexes for SharedWorkers.
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::ACCESSOR_RUNTIME_ENABLER):
+ Added runtime enabler for the SharedWorker constructor.
+ * bindings/v8/custom/V8SharedWorkerCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ Cleaned up bitrot (various APIs have changed since this file was written).
+ * page/DOMWindow.idl:
+ Added EnabledAtRuntime flag to window.SharedWorker.
+
+2009-10-13 Alexey Proskuryakov <ap@apple.com>
+
+ Reviewed by Brady Eidson.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30345
+ HTTP tests for credential handling fail on Tiger
+
+ We cannot prevent NSURLConnection from doing its credentil handling on Tiger anyway; so
+ let it do its work without intervention. Once again, we pass explicitly passed credentials
+ in URL, fixing regressions from Safari 3.
+
+ * platform/network/mac/ResourceHandleMac.mm:
+ (WebCore::ResourceHandle::start):
+ (WebCore::ResourceHandle::didReceiveAuthenticationChallenge):
+ (WebCore::ResourceHandle::receivedCredential):
+
+2009-10-13 Roland Steiner <rolandsteiner@google.com>
+
+ Reviewed by Adam Barth.
+
+ Bug 28964 - [Chromium] ChromiumDataObject should have getter/setter interface
+
+ Reworked and added to the getter/setter interface in ChromiumDataObject:
+ - added contains...() methods to just query the state
+ - added containsValid...URL() methods for URL data members
+ - removed takeFileNames() as this was too type-dependent
+ - changed return type of fileNames() to Vector<String>
+ - added interface methods to allow appending to and iteration over file names
+
+ No new tests (no functional behavior changed).
+
+ * platform/chromium/ChromiumDataObject.h:
+ (WebCore::ChromiumDataObject::containsMainURL):
+ (WebCore::ChromiumDataObject::containsValidMainURL):
+ (WebCore::ChromiumDataObject::containsMainURLTitle):
+ (WebCore::ChromiumDataObject::containsTextPlain):
+ (WebCore::ChromiumDataObject::containsTextHTML):
+ (WebCore::ChromiumDataObject::containsHTMLBaseURL):
+ (WebCore::ChromiumDataObject::containsValidHTMLBaseURL):
+ (WebCore::ChromiumDataObject::containsContent):
+ (WebCore::ChromiumDataObject::containsContentFileExtension):
+ (WebCore::ChromiumDataObject::containsContentFileName):
+ (WebCore::ChromiumDataObject::setContentFileName):
+ (WebCore::ChromiumDataObject::containsFileNames):
+ (WebCore::ChromiumDataObject::fileNames):
+ (WebCore::ChromiumDataObject::clearFileNames):
+ (WebCore::ChromiumDataObject::countFileNames):
+ (WebCore::ChromiumDataObject::fileNameAt):
+ (WebCore::ChromiumDataObject::setFileNames):
+ (WebCore::ChromiumDataObject::appendToFileNames):
+ (WebCore::ChromiumDataObject::popFileName):
+
+2009-10-13 Simon Fraser <simon.fraser@apple.com>
+
+ Temporary debugging changes to figure out why the webgl tests are crashing on the build bot.
+
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::GraphicsContext3D):
+
+2009-10-13 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Visibility:visible inside a compositing layer doesn't make the element visible
+ https://bugs.webkit.org/show_bug.cgi?id=30339
+
+ When deciding if a layer had any renderable content, RenderLayerBacking::paintIntoLayer()
+ only consulted hasVisibleContent(), which does not take into a account child layers which
+ may be visible. We also have to consult hasVisibleDescendant() as well.
+
+ Test: compositing/compositing-visible-descendant.html
+
+ * rendering/RenderLayer.h:
+ (WebCore::RenderLayer::hasVisibleDescendant):
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::paintIntoLayer):
+
+2009-10-13 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Refactor ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH
+ https://bugs.webkit.org/show_bug.cgi?id=30278
+
+ Move the definition of ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH
+ from the make system into common code.
+
+ Enable ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH if NETSCAPE_PLUGIN_API
+ support is not enabled.
+
+ Remove notImplemented() from PluginPackageNone.cpp and
+ PluginDataNone.cpp make them just empty functions.
+
+ * GNUmakefile.am:
+ * WebCore.pro:
+ * plugins/PluginDataNone.cpp:
+ (WebCore::PluginData::initPlugins):
+ (WebCore::PluginData::refresh):
+ * plugins/PluginPackageNone.cpp:
+ (WebCore::PluginPackage::determineQuirks):
+ (WebCore::PluginPackage::fetchInfo):
+ (WebCore::PluginPackage::load):
+
+2009-10-13 Alexey Proskuryakov <ap@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30150
+ <rdar://problem/7283540> REGRESSION: Crash when accessing clipboardData.types
+
+ Test: editing/pasteboard/crash-accessing-clipboardData-types.html
+
+ * platform/mac/ClipboardMac.mm: (WebCore::addHTMLClipboardTypesForCocoaType): The String
+ class doesn't have operator bool, it's operator NSString* that is invoked instead, and it
+ converts null strings to non-null @"".
+
+2009-10-13 Drew Wilson <atwilson@atwilson-macpro.local>
+
+ Reviewed by Dimitri Glazkov.
+
+ window attributes (like localStorage) that are disabled at runtime are still visible
+ https://bugs.webkit.org/show_bug.cgi?id=30240
+
+ Adding codegen/bindings to support runtime disabling of attributes.
+
+ No new tests (only supported by chrome currently)
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+ Refactored the guts of GenerateBatchedAttributeData into a separate GenerateSingleBatchedAttribute with a passed-in indentation level to allow generating a single BatchedAttribute struct.
+ Added support for the EnabledAtRuntime extended attribute, which generates a call to the appropriate XXXXEnabled() API before adding the attribute to the instance.
+ * bindings/v8/V8Proxy.cpp:
+ (WebCore::batchConfigureAttributes):
+ Refactored attribute setting code into a common inline routine.
+ * bindings/v8/V8Proxy.h:
+ (WebCore::configureAttribute):
+ Inline function which configures a single attribute given a BatchedAttribute struct.
+ * bindings/v8/custom/V8CustomBinding.h:
+ Added (DECLARE_)ACCESSOR_RUNTIME_ENABLER to allow enabling attributes at runtime.
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ Added code to enable window.Audio only if MediaPlayer.isAvailable() == true
+ * page/DOMWindow.idl:
+ Added [EnabledAtRuntime] extended attribute to the Audio attribute.
+
+2009-10-13 Michelangelo De Simone <micdesim@gmail.com>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=27457
+ Added support for static validation on type=email input elements as per
+ HTML5 specs:
+ http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state
+
+ Test: fast/forms/ValidityState-typeMismatch-email.html
+
+ * html/ValidityState.cpp:
+ (WebCore::ValidityState::typeMismatch): ValidityState.typeMismatch
+ performs validation on type=email input elements now.
+ (WebCore::ValidityState::isValidEmailAddress): simple validation method
+ * html/ValidityState.h:
+
+2009-10-13 Dmitry Titov <dimich@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Event listeners installed on a window object returned from window.open() don't work
+ https://bugs.webkit.org/show_bug.cgi?id=28716
+
+ Tests: http/tests/security/window-events-clear-domain.html
+ http/tests/security/window-events-clear-port.html
+ http/tests/security/window-events-pass.html
+
+ * dom/Document.cpp: Split code of Document::clear() in a way to avoid removing all
+ window event handlers when implicitOpen is called. It is called in 2 cases - on
+ committing loaded content (no need to clean handlers) and on document.open() (needs to remove handlers).
+
+ (WebCore::Document::open): in addition to calling implicitOpen it also removes window
+ event handlers, to preserve the behavior of document.open().
+
+ (WebCore::Document::implicitOpen): includes the part of removed Document::clear() that
+ does not remove window event handlers.
+
+ * dom/Document.h: Removed clear().
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::stopLoading): add check to avoid removing window event handlers
+ if we transition from temporary empty document to a loaded one.
+
+ (WebCore::FrameLoader::didOpenURL): Remove closeURL() which was called twice when loading.
+ (WebCore::FrameLoader::finishedLoadingDocument): add closeURL() to compensate for change above.
+
+2009-10-13 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Pavel Feldman.
+
+ Fix a leak in the inspector by calling didRemoveNode with
+ an error code when it fails, instead of returning from the
+ Backend.
+
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::removeNode):
+ * inspector/front-end/ElementsTreeOutline.js:
+
+2009-10-13 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30337>.
+ Web Inspector: Should be able to delete nodes from the Elements Tree.
+
+ When the delete key is pressed and a element is selected in the tree,
+ the element should be deleted from the Elements Tree and the DOM.
+
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::removeNode):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::didRemoveNode):
+ * inspector/InspectorFrontend.h:
+ * inspector/front-end/ElementsPanel.js:
+ (WebInspector.ElementsPanel.prototype._updateModifiedNodes):
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeOutline.prototype.handleKeyEvent):
+
+2009-10-13 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fix REGRESSION(49479): Mouseover on resources graph doesn't show timings.
+
+ Set pointer-events: none on the new overlay so mouseover events are passed
+ to the resources graph so we can show timings.
+
+ * inspector/front-end/inspector.css:
+
+2009-10-13 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Plugins : Remove all traces of winId. Use ownerWidget() instead.
+
+ This is a bug for two reasons:
+ 1. Everytime we use winId(), we end up creating a native widget. This causes an
+ unnecessary copy of contents from the backing store to the native widget.
+ 2. Neither windowed nor windowless plugins require the winId of the QWebView or
+ QGraphicsView.
+
+ Introduce ownerWidget() which returns a QWidget * without creating a native widget
+ (as opposed to QWidget::find(winId)).
+
+ https://bugs.webkit.org/show_bug.cgi?id=30170
+
+ * platform/qt/PlatformScreenQt.cpp:
+ (WebCore::screenDepthPerComponent):
+ * platform/qt/PopupMenuQt.cpp:
+ (WebCore::PopupMenu::show):
+ * platform/qt/QWebPageClient.h:
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::setSharedXEventFields):
+ (WebCore::PluginView::initXEvent):
+ (WebCore::PluginView::getValue):
+ (WebCore::PluginView::platformStart):
+
+2009-10-13 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
+
+ Unreviewed build system fix. Typo in a filename.
+
+ * GNUmakefile.am:
+
+2009-10-12 Alexander Pavlov <apavlov@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+ Alter profile link format to enable multiple profile types
+ https://bugs.webkit.org/show_bug.cgi?id=30253
+
+ The new profile URL includes the profile type along with the
+ profile title and uid.
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::addProfileFinishedMessageToConsole):
+ (WebCore::InspectorController::addStartProfilingMessageToConsole):
+ * inspector/front-end/inspector.js:
+ (WebInspector.documentClick.followLink):
+ (WebInspector.documentClick):
+ (WebInspector.linkifyStringAsFragment):
+
+2009-10-12 Alexander Pavlov <apavlov@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Fix same-named profiles grouping in the Profiles panel.
+
+ The tree node re-parenting while adding a new group node was broken.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30299
+
+ * inspector/front-end/ProfilesPanel.js:
+ (WebInspector.ProfilesPanel.prototype.addProfile):
+
+2009-10-12 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Enforce async interaction between inspector controller and frontend.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30300
+
+ * inspector/front-end/inspector.js:
+ (WebInspector.dispatch.delayDispatch):
+ (WebInspector.dispatch):
+
+2009-10-12 Xiaomei Ji <xji@chromium.org>
+
+ Reviewed by Sam Weinig.
+
+ Fix issue caretRangeFromPoint() returns wrong result for a zoomed and
+ scrolled page.
+ https://bugs.webkit.org/show_bug.cgi?id=30034
+
+ * dom/Document.cpp:
+ (WebCore::Document::elementFromPoint): calculate the correct point
+ relative to document when the page is zoomed and scrolled.
+ (WebCore::Document::caretRangeFromPoint): calculate the correct point
+ relative to document when the page is zoomed and scrolled.
+
+2009-10-12 Fumitoshi Ukai <ukai@chromium.org>
+
+ Reviewed by Sam Weinig.
+
+ JavaScript bindings of WebSocket addEventListener/removeEventListener
+ https://bugs.webkit.org/show_bug.cgi?id=29841
+
+ Test: fast/websockets/websocket-event-target.html
+
+ * bindings/js/JSWebSocketCustom.cpp:
+ (WebCore::JSWebSocket::addEventListener):
+ (WebCore::JSWebSocket::removeEventListener):
+ * bindings/v8/custom/V8CustomBinding.h:
+ * bindings/v8/custom/V8WebSocketCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * websockets/WebSocket.idl:
+
+2009-10-12 Sam Weinig <sam@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Fix for https://bugs.webkit.org/show_bug.cgi?id=29078
+ <rdar://problem/7288221>
+
+ Add a mechanism to blacklist certain codecs. Initially, just blacklist UTF-7 as HTML5 encourages.
+
+ * platform/text/TextEncodingRegistry.cpp:
+ (WebCore::pruneBlacklistedCodecs):
+ (WebCore::buildBaseTextCodecMaps):
+ (WebCore::extendTextCodecMaps):
+
+2009-10-09 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Add support for the beforeload event to frames. Complete support of the beforeload event by making sure
+ its wrapper gets properly constructed (so that the URL field of the event can be accessed). Add support
+ for the Objective-C wrapper class as well.
+
+ Added fast/dom/beforeload/frame-before-load.html
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSEventCustom.cpp:
+ (WebCore::toJS):
+ * bindings/objc/DOMEvents.mm:
+ (kitClass):
+ * dom/BeforeLoadEvent.h:
+ (WebCore::BeforeLoadEvent::isBeforeLoadEvent):
+ * dom/Event.cpp:
+ (WebCore::Event::isBeforeLoadEvent):
+ * dom/Event.h:
+ * html/HTMLFrameElementBase.cpp:
+ (WebCore::HTMLFrameElementBase::parseMappedAttribute):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::loadWithDocumentLoader):
+
+2009-10-12 Dan Bernstein <mitz@apple.com>
+
+ Reviewed by Simon Fraser.
+
+ Fix <rdar://problem/7094146> Reproducible crash at
+ RenderObject::localToAbsolute()
+
+ Test: fast/dynamic/position-absolute-to-fixed-crash.html
+
+ The crash was caused by stale positioned objects lists following an
+ object transitioning from being absolutely position to being fixed
+ positioned.
+
+ * rendering/RenderBox.cpp:
+ (WebCore::RenderBox::styleWillChange): In case of a transition between
+ absolute and fixed position, mark the parent as having a child needing
+ layout, so that this object will get inserted into its new container's
+ positioned objects list.
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::styleWillChange): Changed a condition to cover
+ this transition, so that this object gets removed from its current
+ container's positioned objects list.
+
+2009-10-12 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Add a palette() method that is needed by our RenderTheme.
+
+ * platform/qt/QWebPageClient.h:
+
+2009-10-12 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ SVG Gradients can't handle percentage values in userSpaceOnUse mode
+ [https://bugs.webkit.org/show_bug.cgi?id=30286]
+
+ Fixed *GradientAttributes to take SVGLength instead of double. This casues
+ the problem, that we can't calculate the correct size of a gradient on
+ userSpaceOnUse mode with percentage values.
+
+ Test: svg/custom/gradient-userSpaceOnUse-with-percentage.svg
+
+ * svg/LinearGradientAttributes.h:
+ (WebCore::LinearGradientAttributes::LinearGradientAttributes):
+ (WebCore::LinearGradientAttributes::x1):
+ (WebCore::LinearGradientAttributes::y1):
+ (WebCore::LinearGradientAttributes::x2):
+ (WebCore::LinearGradientAttributes::y2):
+ (WebCore::LinearGradientAttributes::setX1):
+ (WebCore::LinearGradientAttributes::setY1):
+ (WebCore::LinearGradientAttributes::setX2):
+ (WebCore::LinearGradientAttributes::setY2):
+ * svg/RadialGradientAttributes.h:
+ (WebCore::RadialGradientAttributes::RadialGradientAttributes):
+ (WebCore::RadialGradientAttributes::cx):
+ (WebCore::RadialGradientAttributes::cy):
+ (WebCore::RadialGradientAttributes::r):
+ (WebCore::RadialGradientAttributes::fx):
+ (WebCore::RadialGradientAttributes::fy):
+ (WebCore::RadialGradientAttributes::setCx):
+ (WebCore::RadialGradientAttributes::setCy):
+ (WebCore::RadialGradientAttributes::setR):
+ (WebCore::RadialGradientAttributes::setFx):
+ (WebCore::RadialGradientAttributes::setFy):
+ * svg/SVGLinearGradientElement.cpp:
+ (WebCore::SVGLinearGradientElement::buildGradient):
+ (WebCore::SVGLinearGradientElement::collectGradientProperties):
+ * svg/SVGRadialGradientElement.cpp:
+ (WebCore::SVGRadialGradientElement::buildGradient):
+ (WebCore::SVGRadialGradientElement::collectGradientProperties):
+
+2009-10-12 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <http://webkit.org/b/30315>.
+ Web Inspector: DOM Content and Load lines in Resources are unclear what they mean.
+
+ Add tooltip text to the Load event and DOM Content event lines through
+ a new layer that allows these lines to be on top of the view.
+
+ * inspector/front-end/ResourcesPanel.js:
+ (WebInspector.ResourcesPanel.prototype._updateGraphDividersIfNeeded):
+ (WebInspector.ResourcesPanel.prototype._updateDividersLabelBarPosition):
+ * inspector/front-end/inspector.css:
+
+2009-10-12 Dimitri Glazkov <dglazkov@chromium.org>
+
+ No review, rolling out r49429, because it broke layout tests.
+ http://trac.webkit.org/changeset/49429
+
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+
+2009-10-12 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ SVG - crash on feMerge when input not available
+ [https://bugs.webkit.org/show_bug.cgi?id=30297]
+
+ Make a early return in SVGFEMergeElement if the needed
+ filter effect doesn't exist.
+
+ Test: svg/filters/feMerge-wrong-input.svg
+
+ * svg/SVGFEMergeElement.cpp:
+ (WebCore::SVGFEMergeElement::build):
+
+2009-10-12 Chris Marrin <cmarrin@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Added automatic flush before compositing
+ https://bugs.webkit.org/show_bug.cgi?id=30236
+
+ This causes image to always render correctly. In writing a testcase
+ I needed to implement readPixels. This exposed a bug in reading back
+ values from a CanvasArray subclass, so I fixed that as well. Now when
+ you wrap a CanvasArray in a JSValue it actually wraps the specific
+ subclass. To do this I need to add virtual methods to each CanvasArray
+ subclass to determine the type and a custom toJS method for CanvasArray
+ to create the proper wrapper.
+
+ Test: fast/canvas/webgl/triangle.html
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSCanvasArrayCustom.cpp:
+ (WebCore::toJS):
+ * html/canvas/CanvasArray.h:
+ (WebCore::CanvasArray::isByteArray):
+ (WebCore::CanvasArray::isUnsignedByteArray):
+ (WebCore::CanvasArray::isShortArray):
+ (WebCore::CanvasArray::isUnsignedShortArray):
+ (WebCore::CanvasArray::isIntArray):
+ (WebCore::CanvasArray::isUnsignedIntArray):
+ (WebCore::CanvasArray::isFloatArray):
+ * html/canvas/CanvasArray.idl:
+ * html/canvas/CanvasByteArray.h:
+ (WebCore::CanvasByteArray::isByteArray):
+ * html/canvas/CanvasFloatArray.h:
+ (WebCore::CanvasFloatArray::isFloatArray):
+ * html/canvas/CanvasIntArray.h:
+ (WebCore::CanvasIntArray::isIntArray):
+ * html/canvas/CanvasRenderingContext3D.cpp:
+ (WebCore::CanvasRenderingContext3D::readPixels):
+ * html/canvas/CanvasRenderingContext3D.h:
+ * html/canvas/CanvasRenderingContext3D.idl:
+ * html/canvas/CanvasShortArray.h:
+ (WebCore::CanvasShortArray::isShortArray):
+ * html/canvas/CanvasUnsignedByteArray.h:
+ (WebCore::CanvasUnsignedByteArray::isUnsignedByteArray):
+ * html/canvas/CanvasUnsignedIntArray.h:
+ (WebCore::CanvasUnsignedIntArray::isUnsignedIntArray):
+ * html/canvas/CanvasUnsignedShortArray.h:
+ (WebCore::CanvasUnsignedShortArray::isUnsignedShortArray):
+ * platform/graphics/GraphicsContext3D.h:
+ * platform/graphics/mac/Canvas3DLayer.mm:
+ (-[Canvas3DLayer drawInCGLContext:pixelFormat:forLayerTime:displayTime:]):
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::readPixels):
+
+2009-10-12 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30307
+
+ Fix 0 sentinel for g_object_set() function call.
+
+ * platform/graphics/gtk/DataSourceGStreamer.cpp:
+ (webkit_data_src_uri_set_uri):
+ 0 is passed as 32 bit value on x86-64 in vararg functions, but
+ g_object_set() expects a 64 bit 0. This will cause crashes.
+
+2009-10-12 Cameron McCormack <cam@mcc.id.au>
+
+ Reviewed by Eric Seidel.
+
+ Drop in="" from <feFlood>
+ https://bugs.webkit.org/show_bug.cgi?id=29001
+
+ This makes <feFlood in="bogus"> have an effect, too.
+
+ http://www.w3.org/2003/01/REC-SVG11-20030114-errata#feflood-attribute
+
+ Test: svg/dom/feFlood-no-in1.html
+
+ * svg/SVGFEFloodElement.cpp:
+ (WebCore::SVGFEFloodElement::SVGFEFloodElement):
+ (WebCore::SVGFEFloodElement::build):
+ * svg/SVGFEFloodElement.h:
+ * svg/SVGFEFloodElement.idl:
+ * svg/graphics/filters/SVGFEFlood.cpp:
+ (WebCore::FEFlood::FEFlood):
+ (WebCore::FEFlood::create):
+ * svg/graphics/filters/SVGFEFlood.h:
+
+2009-10-12 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29998
+
+ Scale video to completely fill the target surface while
+ keeping the aspect ratio. This fixes displaying of the
+ YouTube HTML5 sample website.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ Scale video to completely fill the target surface, keep
+ the aspect ratio and center it.
+
+2009-10-12 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Reviewed by Gustavo Noronha.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29997
+
+ Fixes double memcpy of all rendered video frames.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::mediaPlayerPrivateRepaintCallback):
+ (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
+ (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
+ (WebCore::MediaPlayerPrivate::duration):
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_timeout_func):
+ (webkit_video_sink_dispose):
+ (unlock_buffer_mutex):
+ (webkit_video_sink_unlock):
+ (marshal_VOID__MINIOBJECT):
+ (webkit_video_sink_class_init):
+ (webkit_video_sink_new):
+ * platform/graphics/gtk/VideoSinkGStreamer.h:
+ Directly pass the buffers up to the MediaPlayerPrivate::paint()
+ method instead of rendering them first to an intermediate cairo
+ surface. This should increase performance and peak memory usage.
+
+2009-10-11 Daniel Bates <dbates@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30242
+
+ Fixes an issue where JavaScript URLs that are URL-encoded twice can
+ bypass the XSSAuditor.
+
+ JavaScript URLs that are completed by method Document::completeURL have added
+ URL-encoded characters such that a direct comparison with the URL-decoded
+ outgoing HTTP parameters is not sufficient. Instead, the URL-decoded outgoing
+ HTTP parameters must be URL-decoded before comparison.
+
+ Tests: http/tests/security/xssAuditor/iframe-javascript-url-twice-url-encode.html
+ http/tests/security/xssAuditor/iframe-javascript-url-twice-url-encode2.html
+ http/tests/security/xssAuditor/iframe-javascript-url-twice-url-encode3.html
+
+ * bindings/ScriptControllerBase.cpp:
+ (WebCore::ScriptController::executeIfJavaScriptURL): Modified to pass XSSAuditor
+ the URL-decoded source code for the JavaScript URL.
+ * page/XSSAuditor.cpp:
+ (WebCore::isIllegalURICharacter): Minor syntactical change to the comment.
+ (WebCore::XSSAuditor::CachingURLCanonicalizer::canonicalizeURL): Added
+ parameter decodeURLEscapeSequencesTwice.
+ (WebCore::XSSAuditor::canEvaluateJavaScriptURL):
+ (WebCore::XSSAuditor::decodeURL): Ditto.
+ (WebCore::XSSAuditor::findInRequest): Ditto.
+ * page/XSSAuditor.h:
+ (WebCore::XSSAuditor::CachingURLCanonicalizer::CachingURLCanonicalizer): Ditto.
+
+2009-10-11 Dominic Cooney <dominicc@google.com>
+
+ Reviewed by Adam Barth.
+
+ Fixes a build break in the V8 bindings caused by revision 49420.
+ https://bugs.webkit.org/show_bug.cgi?id=30294
+
+ Revision 49420 introduces an IDL-defined CanvasActiveInfo
+ type. This causes a build break in the V8 bindings where
+ CanvasGraphicsContext3D naively refers to CanvasActiveInfo as a
+ non-ref type.
+
+ * WebCore.gypi: Include CanvasActiveInfo.idl in build.
+ * bindings/scripts/CodeGeneratorV8.pm: CanvasActiveInfo is a ref
+ ptr type.
+ * bindings/v8/DOMObjectsInclude.h: Include generated
+ CanvasActiveInfo files.
+ * bindings/v8/DerivedSourcesAllInOne.cpp:
+ * bindings/v8/V8Index.cpp:
+ * bindings/v8/V8Index.h:
+
+2009-10-11 Collin Jackson <collinj@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ Log mixed content warnings to console
+
+ https://bugs.webkit.org/show_bug.cgi?id=30290
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::checkIfDisplayInsecureContent):
+ (WebCore::FrameLoader::checkIfRunInsecureContent):
+
+2009-10-11 Søren Gjesse <sgjesse@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ [V8] Add a context scope in JS listener destructor. The destructor code uses the cotext. See http://crbug.com/24200.
+ https://bugs.webkit.org/show_bug.cgi?id=30250
+
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+
+2009-10-11 Lyon Chen <lyon.chen@torchmobile.com>
+
+ Reviewed by Alexey Proskuryakov.
+
+ Correct the position of #endif sentence inside WebCore::Document::finishedParsing().
+
+ https://bugs.webkit.org/show_bug.cgi?id=30244
+
+ This change requires no test case as it fix a compiling error.
+
+ * dom/Document.cpp:
+ (WebCore::Document::finishedParsing):
+
+2009-10-11 Dominic Cooney <dominicc@google.com>
+
+ Reviewed by Adam Barth.
+
+ Sets a 500K stack limit for JavaScript workers in Chromium.
+ https://bugs.webkit.org/show_bug.cgi?id=29797
+
+ Runaway recursion in JavaScript workers crashes the Chromium
+ worker process on OS X. This is because V8's default stack limit
+ is 512K on ia32 or 1M on x64, but the worker process runs workers
+ on a thread with the OS X default stack size--512K. Because there
+ are already some C+frames on the stack when V8 establishes its
+ 512K default stack limit, and V8 doesn't precisely enforce the
+ stack limit, runaway recursion in V8 workers overflows the OS
+ stack and segfaults, killing the worker process. This is described
+ in Chromium bug 21653 <http://crbug.com/21653>.
+
+ This patch sets the V8 stack limit for worker JavaScript in
+ Chromium to a more conservative 500K on all platforms. This allows
+ some "headroom" for the C+stack in use when the limit is set up,
+ and some "legroom" for the V8 helper functions which in practice
+ briefly flout the V8 stack limit.
+
+ Test: LayoutTests/fast/workers/use-machine-stack.html
+
+ * bindings/v8/WorkerContextExecutionProxy.cpp:
+ (WebCore::WorkerContextExecutionProxy::initV8IfNeeded):
+ * bindings/v8/WorkerContextExecutionProxy.h:
+
+2009-10-11 Kevin Ollivier <kevino@theolliviers.com>
+
+ wx build fix for wxMac 2.9, use wxGC API for measuring text.
+
+ * platform/wx/wxcode/mac/carbon/fontprops.cpp:
+ (GetTextExtent):
+
+2009-10-10 Cameron McCormack <cam@mcc.id.au>
+
+ Reviewed by Sam Weinig.
+
+ Allow [Reflect] on SVG elements.
+ https://bugs.webkit.org/show_bug.cgi?id=28936
+
+ Update the JS binding generators to reference SVGNames instead of
+ HTMLNames, if [Reflect]ing an attribute on an SVG element. Make
+ SVGElement::id use [Reflect].
+
+ Also make [Reflect] on an attribute with a setter exception work in ObjC
+ bindings.
+
+ Test: svg/dom/id-reflect.html
+
+ * bindings/scripts/CodeGenerator.pm: Add a function to determine the
+ appropriate C+namespace for attribute name constants.
+ * bindings/scripts/CodeGeneratorObjC.pm: Generate ExceptionCode handling
+ code for [Reflect] on an attribute with a setter exception.
+ * bindings/scripts/CodeGeneratorCOM.pm: Generate "SVGNames" instead of
+ "HTMLNames" when appropriate.
+ * bindings/scripts/CodeGeneratorJS.pm: Ditto.
+ * bindings/scripts/CodeGeneratorV8.pm: Ditto.
+ * svg/SVGElement.cpp: Remove getter and setter methods for id.
+ * svg/SVGElement.h: Ditto.
+ * svg/SVGElement.idl: Add [Reflect] to id.
+
+2009-10-10 Oliver Hunt <oliver@apple.com>
+
+ Fix paths in xcode.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-10 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Eric Carlson.
+
+ Implement getActiveAttrib and getActiveUniform
+ https://bugs.webkit.org/show_bug.cgi?id=30276
+
+ Implements the getActiveAttrib and getActiveUniform APIs.
+ Rather simple patch, adds CanvasActiveInfo definition and implementation
+ and adds forwarding to the GraphicsContext3D.
+
+ Test: fast/canvas/webgl/getActiveTest.html
+
+ * DerivedSources.make:
+ * WebCore.xcodeproj/project.pbxproj:
+ * html/canvas/CanvasActiveInfo.h: Added.
+ (WebCore::CanvasActiveInfo::create):
+ (WebCore::CanvasActiveInfo::name):
+ (WebCore::CanvasActiveInfo::type):
+ (WebCore::CanvasActiveInfo::size):
+ (WebCore::CanvasActiveInfo::CanvasActiveInfo):
+ * html/canvas/CanvasActiveInfo.idl: Added.
+ * html/canvas/CanvasObject.h:
+ (WebCore::CanvasObject::context):
+ Need to make the context public as it is needed to ensure we don't
+ provide a program from one context as an argument to another.
+ * html/canvas/CanvasRenderingContext3D.cpp:
+ (WebCore::CanvasRenderingContext3D::getActiveAttrib):
+ (WebCore::CanvasRenderingContext3D::getActiveUniform):
+ * html/canvas/CanvasRenderingContext3D.h:
+ * html/canvas/CanvasRenderingContext3D.idl:
+ * platform/graphics/GraphicsContext3D.h:
+ * platform/graphics/mac/GraphicsContext3DMac.cpp:
+ (WebCore::GraphicsContext3D::getActiveAttrib):
+ (WebCore::GraphicsContext3D::getActiveUniform):
+
+2009-10-10 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Adding new attributes in Element Panel is
+ counterintuitive.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30057
+
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeOutline.prototype._onmousemove):
+ (WebInspector.ElementsTreeElement.prototype.set hovered):
+ (WebInspector.ElementsTreeElement.prototype.toggleNewAttributeButton):
+
+2009-10-10 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Holger Freyther.
+
+ Build fix if Netscape plugin support is turned off
+ https://bugs.webkit.org/show_bug.cgi?id=30275
+
+ In addition to fixing the build break with guards
+ remove notImplemented() from PluginViewNone.cpp and
+ make them just just be empty functions.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::handleEvent):
+ (WebCore::PluginView::PluginView):
+ * plugins/PluginView.h:
+ * plugins/PluginViewNone.cpp:
+ (WebCore::PluginView::setFocus):
+ (WebCore::PluginView::show):
+ (WebCore::PluginView::hide):
+ (WebCore::PluginView::paint):
+ (WebCore::PluginView::handleKeyboardEvent):
+ (WebCore::PluginView::handleMouseEvent):
+ (WebCore::PluginView::setParent):
+ (WebCore::PluginView::setNPWindowRect):
+ (WebCore::PluginView::handlePostReadFile):
+ (WebCore::PluginView::getValue):
+ (WebCore::PluginView::getValueStatic):
+ (WebCore::PluginView::invalidateRect):
+ (WebCore::PluginView::invalidateRegion):
+ (WebCore::PluginView::forceRedraw):
+ (WebCore::PluginView::platformStart):
+ (WebCore::PluginView::platformDestroy):
+ (WebCore::PluginView::setParentVisible):
+ (WebCore::PluginView::updatePluginWidget):
+
+2009-10-10 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Unreviewed.
+
+ [Qt] Build fix for QtWebKit after r49415.
+
+ Add HistoryController.cpp to the build.
+
+ * WebCore.pro:
+
+2009-10-09 Darin Fisher <darin@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ [Chromium] KURLGoogle's protocolIs barfs on input containing hyphens
+ https://bugs.webkit.org/show_bug.cgi?id=30262
+
+ This is not testable from WebKit since WebKit never uses the member
+ function form of protocolIs with input that can be controlled from a
+ web page. It always passes string literals lacking hyphens.
+
+ * platform/KURLGoogle.cpp:
+ (WebCore::lowerCaseEqualsASCII): Only assert if toASCIILower would
+ transform the input character.
+
+2009-10-10 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Oliver Hunt.
+
+ Move HistoryController to its own file
+ https://bugs.webkit.org/show_bug.cgi?id=30272
+
+ Purely mechanical.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCoreSources.bkl:
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/HistoryController.cpp: Added.
+ * loader/HistoryController.h: Added.
+
+2009-10-09 Ryosuke Niwa <rniwa@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ ApplyStyleCommand removes presentational tags even when not necessary
+ https://bugs.webkit.org/show_bug.cgi?id=28091
+
+ This patch updates implicitlyStyledElementShouldBeRemovedWhenApplyingStyle to return true
+ (triggering removal of tag) only if the style implicitly added by the element is not present in
+ the new style to apply. It also changes surroundNodeRangeWithElement so that it merges the
+ surrounding element when possible. applyTextDecorationStyle is modified so that it does not add
+ style span when the style attribute is empty.
+
+ Test: editing/execCommand/toggle-style-3.html
+
+ * editing/ApplyStyleCommand.cpp:
+ (WebCore::ApplyStyleCommand::shouldRemoveTextDecorationTag): Returns true if specified text
+ decoration is not present in the style to apply
+ (WebCore::ApplyStyleCommand::implicitlyStyledElementShouldBeRemovedWhenApplyingStyle): No longer
+ returns true if the tag is used in new style
+ (WebCore::ApplyStyleCommand::applyTextDecorationStyle): Does not add style-span when redundant
+ (WebCore::ApplyStyleCommand::surroundNodeRangeWithElement): Merges the newly created element
+ with the surrounding identical elements
+ * editing/ApplyStyleCommand.h:
+
+2009-10-09 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Factor HistoryController out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30246
+
+ HistoryController is in charge of managing the current / previous /
+ provisional HistoryItems. The split isn't perfect, but it's a place to
+ start. I'll move HistoryController into its own file in another patch.
+
+ * WebCore.base.exp:
+ * loader/FrameLoader.cpp:
+ (WebCore::HistoryController::HistoryController):
+ (WebCore::HistoryController::~HistoryController):
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::closeURL):
+ (WebCore::FrameLoader::begin):
+ (WebCore::HistoryController::restoreDocumentState):
+ (WebCore::HistoryController::setCurrentItem):
+ (WebCore::HistoryController::setProvisionalItem):
+ (WebCore::FrameLoader::loadURLIntoChildFrame):
+ (WebCore::FrameLoader::canCachePageContainingThisFrame):
+ (WebCore::FrameLoader::logCanCacheFrameDecision):
+ (WebCore::FrameLoader::scrollToAnchor):
+ (WebCore::FrameLoader::commitProvisionalLoad):
+ (WebCore::FrameLoader::transitionToCommitted):
+ (WebCore::FrameLoader::checkLoadCompleteForThisFrame):
+ (WebCore::FrameLoader::didFirstLayout):
+ (WebCore::HistoryController::updateForFrameLoadCompleted):
+ (WebCore::FrameLoader::frameLoadCompleted):
+ (WebCore::FrameLoader::detachFromParent):
+ (WebCore::FrameLoader::receivedMainResourceError):
+ (WebCore::FrameLoader::continueFragmentScrollAfterNavigationPolicy):
+ (WebCore::FrameLoader::continueLoadAfterNavigationPolicy):
+ (WebCore::HistoryController::addHistoryItemForFragmentScroll):
+ (WebCore::FrameLoader::loadProvisionalItemFromCachedPage):
+ (WebCore::FrameLoader::shouldTreatURLAsSameAsCurrent):
+ (WebCore::HistoryController::createHistoryItem):
+ (WebCore::FrameLoader::checkDidPerformFirstNavigation):
+ (WebCore::HistoryController::addBackForwardItemClippedAtTarget):
+ (WebCore::HistoryController::createHistoryItemTree):
+ (WebCore::HistoryController::saveScrollPositionAndViewStateToItem):
+ (WebCore::HistoryController::restoreScrollPositionAndViewState):
+ (WebCore::HistoryController::invalidateCurrentItemCachedPage):
+ (WebCore::HistoryController::saveDocumentState):
+ (WebCore::FrameLoader::loadItem):
+ (WebCore::HistoryController::urlsMatchItem):
+ (WebCore::HistoryController::goToItem):
+ (WebCore::HistoryController::recursiveGoToItem):
+ (WebCore::HistoryController::childFramesMatchItem):
+ (WebCore::HistoryController::updateForStandardLoad):
+ (WebCore::HistoryController::updateForClientRedirect):
+ (WebCore::HistoryController::updateForBackForwardNavigation):
+ (WebCore::HistoryController::updateForReload):
+ (WebCore::HistoryController::updateForRedirectWithLockedBackForwardList):
+ (WebCore::HistoryController::updateForCommit):
+ (WebCore::HistoryController::updateForAnchorScroll):
+ (WebCore::HistoryController::saveDocumentAndScrollState):
+ (WebCore::HistoryController::setCurrentItemTitle):
+ (WebCore::FrameLoader::didChangeTitle):
+ * loader/FrameLoader.h:
+ (WebCore::HistoryController::current):
+ (WebCore::HistoryController::provisional):
+ (WebCore::FrameLoader::policyChecker):
+ (WebCore::FrameLoader::history):
+ (WebCore::FrameLoader::creatingInitialEmptyDocument):
+ * page/Page.cpp:
+ (WebCore::Page::goToItem):
+
+2009-10-09 Alexey Proskuryakov <ap@apple.com>
+
+ Unreviewed - fixing an obvious typo in my previous check-in.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30260
+ <rdar://problem/6447115> REGRESSION: Logging out from SAP doesn't work
+
+ Fixes existing tests (which I thought I had run the previous time).
+
+ * platform/network/CredentialStorage.cpp: (WebCore::originsWithCredentials): Return the
+ set by reference.
+
+2009-10-09 David Levin <levin@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ [v8] Need change to V8WorkerContextEventListener::reportError signature to match the base class.
+ https://bugs.webkit.org/show_bug.cgi?id=30264
+
+ The base class method changed in r48884.
+
+ Test: fast/worker/worker-script-error.html
+
+ * bindings/v8/V8WorkerContextEventListener.cpp:
+ (WebCore::V8WorkerContextEventListener::reportError):
+ * bindings/v8/V8WorkerContextEventListener.h:
+
+2009-10-09 Alexey Proskuryakov <ap@apple.com>
+
+ Reviewed by Brady Eidson.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30260
+ <rdar://problem/6447115> REGRESSION: Logging out from SAP doesn't work
+
+ Tests: http/tests/xmlhttprequest/logout.html
+ http/tests/xmlhttprequest/re-login-async.html
+ http/tests/xmlhttprequest/re-login.html
+
+ Fix several issues with existing credential handling code.
+
+ * platform/network/CredentialStorage.cpp:
+ (WebCore::pathToDefaultProtectionSpaceMap): Changed the data structure to a simpler one.
+ (WebCore::originsWithCredentials): The reason for two-stage lookup above was that we didn't
+ want to iterate paths for origins that never had credentials associated with them. Changed
+ to use a separate HashSet for this.
+ (WebCore::pathToDefaultProtectionSpaceMap): The concept of default per-path credentials didn't
+ match the spec very well. UAs are supposed to deduce protection space from an URL, and then
+ use whichever credentials are known for this protection space. So, OriginToDefaultBasicCredentialMap
+ is now PathToDefaultProtectionSpaceMap.
+ (WebCore::protectionSpaceMapKeyFromURL): Factored out a helper that extracts a directory
+ URL from a given URL. These directory URLs are what we use as keys in PathToDefaultProtectionSpaceMap.
+ (WebCore::CredentialStorage::set): Updated for above changes.
+ (WebCore::findDefaultProtectionSpaceForURL): Factored out code iterating path length to find
+ a prefix in OriginToDefaultBasicCredentialMap.
+ (WebCore::CredentialStorage::set): Another version of set() can update credentials for a
+ URL default protection space. It does nothing if the given URL doesn't correspond to a known
+ protection space.
+ (WebCore::CredentialStorage::get): Renamed from getDefaultAuthenticationCredential.
+
+ * platform/network/CredentialStorage.h: Made the distinction between methods that use a known
+ protection space and those that deduce one from URL more clear.
+
+ * platform/network/mac/ResourceHandleMac.mm:
+ (WebCore::ResourceHandle::start): Update credentials before starting the request for real.
+ This makes the following pattern work:
+ var req = new XMLHttpRequest("GET", "logout.html", "logout", "logout"); // wrong credentials
+ req.send("");
+ req.abort();
+ Abort() is used here to avoid having UA present an auth dialog after getting a 401 response.
+ Note that one cannot log in using the same method, because there isn't a known protection
+ space for the URL yet in that case, so the added code has no effect.
+ (WebCore::ResourceHandle::didReceiveAuthenticationChallenge): Use a correct persistence for
+ calling receivedCredential(). This fixes logging in using an async XHR (withut abort(), of
+ course), and matches sync case.
+ (+[WebCoreSynchronousLoader loadRequest:allowStoredCredentials:returningResponse:error:]):
+ Renamed getDefaultAuthenticationCredential() to get().
+
+ * platform/network/cf/ResourceHandleCFNet.cpp:
+ (WebCore::ResourceHandle::start):
+ (WebCore::WebCoreSynchronousLoader::load):
+ Same changes as in Mac code.
+
+2009-10-09 Enrica Casucci <enrica@apple.com>
+
+ Reviewed by Adele Peterson.
+
+ Undoing a indent removes text instead of it's formatting.
+ <rdar://problem/7169206>
+ https://bugs.webkit.org/show_bug.cgi?id=28722
+ Restored the behavior prior to http://trac.webkit.org/changeset/46143. This change implemented the
+ indent command making simple DOM operation, without using moveParagraph which cause undo to be broken.
+
+ Added editing/undo/undo-indent.html test.
+
+ * editing/IndentOutdentCommand.cpp:
+ (WebCore::IndentOutdentCommand::prepareBlockquoteLevelForInsertion): Restored.
+ (WebCore::IndentOutdentCommand::tryIndentingAsListItem): Merged changes.
+ (WebCore::IndentOutdentCommand::indentIntoBlockquote): Restored.
+ (WebCore::IndentOutdentCommand::indentRegion): Restored and added call to updateLayout to
+ ensure TextIterator could correctly calculate the position starting from the index.
+ * editing/IndentOutdentCommand.h: Restored.
+
+2009-10-09 Jens Alfke <snej@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Optimization: Many StringImpl transformations are no-ops and should just return 'this'
+ https://bugs.webkit.org/show_bug.cgi?id=30186
+
+ Optimized StringImpl methods lower(), stripWhiteSpace() and simplifyWhiteSpace() to
+ detect no-ops and return this instead of creating a new instance.
+ Empirical testing shows that the majority of calls to these methods are no-ops, making
+ this worthwhile even if (in the case of lower()) the non-no-op case is slightly slowed.
+ Upper() is very rarely a no-op, so it wasn't worthwhile to optimize it.
+
+ * platform/text/StringImpl.cpp:
+ (WebCore::StringImpl::lower):
+ (WebCore::StringImpl::upper): Just add a comment explaining why this wasn't optimized
+ (WebCore::StringImpl::stripWhiteSpace):
+ (WebCore::StringImpl::simplifyWhiteSpace):
+
+2009-10-09 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Oliver Hunt.
+
+ SVG Filter feGaussianBlur implementation is missing
+ [https://bugs.webkit.org/show_bug.cgi?id=28141]
+
+ This is the implementation of GaussianBlur filter for SVG.
+
+ There is already a test for feGaussianBlur
+ Test: svg/W3C-SVG-1.1/filters-gauss-01-b-w3c.svg
+
+ Test: svg/filters/feGaussianBlur.svg
+
+ * platform/graphics/filters/FilterEffect.cpp:
+ (WebCore::FilterEffect::FilterEffect):
+ * platform/graphics/filters/FilterEffect.h:
+ (WebCore::FilterEffect::isAlphaImage):
+ (WebCore::FilterEffect::setIsAlphaImage):
+ * platform/graphics/filters/SourceAlpha.cpp:
+ (WebCore::SourceAlpha::apply):
+ * svg/graphics/filters/SVGFEGaussianBlur.cpp:
+ (WebCore::boxBlur):
+ (WebCore::FEGaussianBlur::apply):
+
+2009-10-09 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GTK] QoS support in the video sink
+ https://bugs.webkit.org/show_bug.cgi?id=29959
+
+ Removed the async buffer queue from the sink. Synchronize the
+ render method of the sink using a g_timeout_add() combined with a
+ gcond triggered when the buffer has been rendered.
+ Also fixed the video sink reference handling in the player, now
+ that the idle is not there anymore to mess up things.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
+ (WebCore::MediaPlayerPrivate::createGSTPlayBin):
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_init):
+ (webkit_video_sink_timeout_func):
+ (webkit_video_sink_render):
+ (webkit_video_sink_dispose):
+ (unlock_buffer_mutex):
+ (webkit_video_sink_unlock):
+ (webkit_video_sink_stop):
+ (webkit_video_sink_class_init):
+
+2009-10-09 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ feMorphology filter is not implemented
+ [https://bugs.webkit.org/show_bug.cgi?id=5863]
+
+ Adds SVGFEMorphologyElement, for the SVG filter. It also fixes a bug
+ with the attribute "operator". It was only accessible via "_operator"
+ on JavaScript.
+
+ Test: svg/dom/operatorAttribute.xhtml
+
+ * DerivedSources.cpp:
+ * DerivedSources.make:
+ * GNUmakefile.am:
+ * WebCore.SVG.Filters.exp:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/objc/DOM.mm:
+ (WebCore::createElementClassMap):
+ * bindings/objc/DOMSVG.h:
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bindings/scripts/CodeGeneratorObjC.pm:
+ * page/DOMWindow.idl:
+ * svg/SVGAllInOne.cpp:
+ * svg/SVGFECompositeElement.idl:
+ * svg/SVGFEMorphologyElement.cpp: Added.
+ (WebCore::SVGFEMorphologyElement::SVGFEMorphologyElement):
+ (WebCore::SVGFEMorphologyElement::~SVGFEMorphologyElement):
+ (WebCore::SVGFEMorphologyElement::setRadius):
+ (WebCore::SVGFEMorphologyElement::parseMappedAttribute):
+ (WebCore::SVGFEMorphologyElement::build):
+ * svg/SVGFEMorphologyElement.h: Added.
+ * svg/SVGFEMorphologyElement.idl: Added.
+ * svg/graphics/filters/SVGFEMorphology.cpp:
+ (WebCore::operator<<):
+ * svg/graphics/filters/SVGFEMorphology.h:
+ (WebCore::):
+ * svg/svgtags.in:
+
+2009-10-09 Yury Semikhatsky <yurys@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Fix Chromium breakage.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30104
+
+ * inspector/front-end/inspector.js:
+ (WebInspector.addCookieDomain): check that Storage panel is present before calling its methods.
+
+2009-10-09 Joe Ligman <joseph.ligman@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Added pure virtual methods setInputMethodEnabled and setInputMethodHint to QWebPageClient
+
+ https://bugs.webkit.org/show_bug.cgi?id=30023
+
+ * platform/qt/QWebPageClient.h:
+
+2009-10-08 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Darin Adler.
+
+ Implement beforeload for images. ImageLoadEventSender has been refactored into a more generic
+ ImageEventSender that can be used by both load and beforeload events. If the document has any
+ beforeload listeners, then the installation of images onto the renderer becomes asynchronous
+ and will be held up until the beforeload event can fire at a later date.
+
+ Both beforeload and load events now fire at the end of the tokenizer write() methods, so that
+ in the typical parsing case we don't have to put off the beforeload/load events until after
+ a layout or paint might already have happened. This lets beforeload/load not cause extra
+ layouts and repaints.
+
+ * dom/ContainerNode.cpp:
+ (WebCore::ContainerNode::dispatchBeforeLoadEvent):
+ * dom/Document.cpp:
+ (WebCore::Document::implicitClose):
+ (WebCore::Document::addListenerTypeIfNeeded):
+ * dom/Document.h:
+ (WebCore::Document::):
+ * dom/XMLTokenizer.cpp:
+ (WebCore::XMLTokenizer::write):
+ * html/HTMLImageElement.cpp:
+ (WebCore::HTMLImageElement::attach):
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::attach):
+ * html/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::write):
+ * loader/ImageLoader.cpp:
+ (WebCore::ImageBeforeLoadEventSender::ImageBeforeLoadEventSender):
+ (WebCore::ImageLoadEventSender::ImageLoadEventSender):
+ (WebCore::beforeLoadEventSender):
+ (WebCore::ImageLoader::ImageLoader):
+ (WebCore::ImageLoader::~ImageLoader):
+ (WebCore::ImageLoader::setImage):
+ (WebCore::ImageLoader::setLoadingImage):
+ (WebCore::ImageLoader::updateFromElement):
+ (WebCore::ImageLoader::notifyFinished):
+ (WebCore::ImageLoader::dispatchPendingBeforeLoadEvent):
+ (WebCore::ImageLoader::dispatchPendingEvents):
+ (WebCore::ImageEventSender::ImageEventSender):
+ (WebCore::ImageEventSender::dispatchEventSoon):
+ (WebCore::ImageEventSender::cancelEvent):
+ (WebCore::ImageEventSender::dispatchPendingEvents):
+ (WebCore::ImageEventSender::timerFired):
+ * loader/ImageLoader.h:
+ (WebCore::ImageLoader::haveFiredBeforeLoadEvent):
+ * wml/WMLImageElement.cpp:
+ (WebCore::WMLImageElement::attach):
+
+2009-10-09 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Web Inspector: Wrap Database into ScriptObject in v8 bindings.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30174
+
+ No tests due to no Script* test infrastructure.
+
+ * bindings/v8/ScriptObjectQuarantine.cpp:
+ (WebCore::getQuarantinedScriptObject):
+
+2009-10-09 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless Plugins : Fix crash when using QWebPage without QWebView.
+
+ 'client' is 0 when we have no view.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30251
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::paint):
+
+2009-10-09 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Plugins : Add missing setCurrentPlugin(0)
+
+ https://bugs.webkit.org/show_bug.cgi?id=30248
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::dispatchNPEvent):
+
+2009-10-09 Jakub Wieczorek <faw217@gmail.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] beforeload event does not fire on script elements in XML
+ https://bugs.webkit.org/show_bug.cgi?id=30235
+
+ r49194 was lacking a change to XMLTokenizerQt.cpp, equivalent to the one
+ made in XMLTokenizerLibxml2.cpp.
+
+ * dom/XMLTokenizerQt.cpp:
+ (WebCore::XMLTokenizer::parseEndElement):
+
+2009-10-09 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Allow custom memory allocation control for WebCore's CSSParserValueList
+ https://bugs.webkit.org/show_bug.cgi?id=30249
+
+ Inherits CSSParserValueList class from FastAllocBase because it has
+ been instantiated by 'new' in WebCore/css/CSSGrammar.y:1271.
+
+ * css/CSSParserValues.h:
+
+2009-10-09 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless Plugins : Create Pixmap only when size changes.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30214
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::updatePluginWidget):
+
+2009-10-08 Jon Honeycutt <jhoneycutt@apple.com>
+
+ Remove the WebKitPluginHalterEnabledPreferenceKey in favor of checking
+ for the existence of a PluginHalterDelegate.
+
+ This fixes a leak of WebPluginHalterClients:
+ https://bugs.webkit.org/show_bug.cgi?id=30119.
+
+ Reviewed by Dan Bernstein.
+
+ * WebCore.base.exp:
+ Removed the export of WebCore::Settings::setPluginHalterEnabled().
+
+ * loader/EmptyClients.h:
+ (WebCore::EmptyPluginHalterClient::enabled):
+
+ * page/Page.cpp:
+ (WebCore::Page::Page):
+ Remove initialization of m_pluginHalterClient, which was removed. If a
+ non-null PluginHalterClient was passed, create the PluginHalter, and
+ set its allowed run time.
+
+ * page/Page.h:
+ Removed pluginHalterEnabledStateChanged() and m_pluginHalterClient.
+
+ * page/PluginHalter.cpp:
+ (WebCore::PluginHalter::didStartPlugin):
+ Check whether the PluginHalterClient is enabled.
+ (WebCore::PluginHalter::didStopPlugin):
+ Ditto.
+
+ * page/PluginHalter.h:
+ Made m_client an OwnPtr.
+
+ * page/PluginHalterClient.h:
+ Added a function to return the enabled state.
+
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ Remove initialization of removed member.
+
+ * page/Settings.h:
+ Removed settings for the enabled state of the PluginHalter; we now use
+ the existence of a WebPluginHalterDelegate to determine whether the
+ PluginHalter is enabled.
+
+2009-10-08 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move executeScript from FrameLoader to ScriptController
+ https://bugs.webkit.org/show_bug.cgi?id=30200
+
+ These methods have virtually no interaction with FrameLoader. They
+ really seem like they ought to belong to ScriptController.
+
+ * WebCore.base.exp:
+ * bindings/js/ScheduledAction.cpp:
+ (WebCore::ScheduledAction::execute):
+ * bindings/js/ScriptController.cpp:
+ (WebCore::ScriptController::ScriptController):
+ (WebCore::ScriptController::executeScript):
+ (WebCore::ScriptController::executeIfJavaScriptURL):
+ (WebCore::ScriptController::evaluate):
+ * bindings/js/ScriptController.h:
+ * bindings/v8/ScriptController.cpp:
+ (WebCore::ScriptController::ScriptController):
+ (WebCore::ScriptController::executeScript):
+ (WebCore::ScriptController::executeIfJavaScriptURL):
+ * bindings/v8/ScriptController.h:
+ * dom/XMLTokenizer.cpp:
+ (WebCore::XMLTokenizer::notifyFinished):
+ * dom/XMLTokenizerLibxml2.cpp:
+ (WebCore::XMLTokenizer::endElementNs):
+ * dom/XMLTokenizerQt.cpp:
+ (WebCore::XMLTokenizer::parseEndElement):
+ * html/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::scriptExecution):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::changeLocation):
+ (WebCore::FrameLoader::urlSelected):
+ (WebCore::FrameLoader::requestFrame):
+ (WebCore::FrameLoader::submitForm):
+ (WebCore::FrameLoader::replaceDocument):
+ * loader/FrameLoader.h:
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::performRequest):
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Windows build fix: added missing #include.
+
+ * ForwardingHeaders/runtime/StructureChain.h: Copied from WebCore/ForwardingHeaders/runtime/PropertyNameArray.h.
+
+2009-10-08 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30237>.
+ DOM Content and Load lines aren't shown if a page is loaded when the inspector is up.
+
+ Make sure to call update script object if we have an InspectorFrontend to
+ call it on when we get one of the new events.
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::mainResourceFiredDOMContentEvent):
+ (WebCore::InspectorController::mainResourceFiredLoadEvent):
+
+2009-10-08 Geoffrey Garen <ggaren@apple.com>
+
+ Build fix: updated for removal of Structure::markAggregate().
+
+ * bindings/js/JSDOMGlobalObject.cpp:
+ (WebCore::JSDOMGlobalObject::markChildren):
+
+2009-10-08 Jens Alfke <snej@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Make AtomicString create its StringImpl via create(), not the constructor,
+ so it gets allocated in a single heap block, saving memory and CPU cycles.
+ This eliminates two StringImpl constructors, making the remaining ones
+ unambiguous, so the "AdoptBuffer" parameter is no longer needed.
+ Added const attribute to UChar* in StringImpl constructor, eliminating the
+ need for several const_casts in calls to it.
+ StringImpl also unfriends AtomicString (OMG drama!!!)
+ https://bugs.webkit.org/show_bug.cgi?id=30141
+
+ * platform/text/AtomicString.cpp:
+ (WebCore::CStringTranslator::translate): Call StringImpl::create().
+ (WebCore::UCharBufferTranslator::translate): Ditto.
+ (WebCore::HashAndCharactersTranslator::translate): Ditto.
+ * platform/text/StringImpl.cpp:
+ (WebCore::StringImpl::StringImpl): Remove unnecessary AdoptBuffer param.
+ (WebCore::StringImpl::adopt): Ditto.
+ (WebCore::StringImpl::createUninitialized): Ditto.
+ (WebCore::StringImpl::create): Ditto.
+ (WebCore::StringImpl::crossThreadString): Ditto.
+ * platform/text/StringImpl.h:
+ (WebCore::StringImpl::setHash): Used by AtomicString when creating StringImpls.
+
+2009-10-08 Anders Carlsson <andersca@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Remove the shouldLoadMediaElementURL frame loader client function.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::willLoadMediaElementURL):
+
+2009-10-08 John Gregg <johnnyg@google.com>
+
+ Reviewed by Dimitri Glazkov.
+
+ SVGURIReference Build problem for V8. An additional stale reference to SVGURIReference bindings
+ which wasn't exposed until a clean build.
+ https://bugs.webkit.org/show_bug.cgi?id=30217
+
+ No new tests, just a build fix.
+
+ * bindings/v8/V8Index.cpp:
+
+2009-10-08 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Not reviewed. Sort XCode project file.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-08 Patrick Mueller <Patrick_Mueller@us.ibm.com>
+
+ Reviewed by Timothy Hatcher.
+
+ unselectable resources in resource panel
+ https://bugs.webkit.org/show_bug.cgi?id=30079
+
+ manual test added
+
+ Also changed the way DnD for resources in the Resources panel is
+ handled.
+
+ * inspector/front-end/ResourcesPanel.js:
+ (WebInspector.ResourceSidebarTreeElement.prototype.onattach):
+ (WebInspector.ResourceSidebarTreeElement.prototype.ondragstart):
+ * manual-tests/inspector/duplicate-resource-urls.html: Added.
+
+2009-10-08 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <http://webkit.org/b/30233>
+ Local Storage and Cookies show Blank Titles on Local Files.
+
+ If a local storage or cookies sidebar item has no domain, set the
+ title to "Local Files", because that is what it represents.
+
+ * English.lproj/localizedStrings.js:
+ * inspector/front-end/StoragePanel.js:
+ (WebInspector.DOMStorageSidebarTreeElement.prototype.get mainTitle):
+ (WebInspector.CookieSidebarTreeElement.prototype.get mainTitle):
+ (WebInspector.CookieSidebarTreeElement.prototype.set mainTitle):
+
+2009-10-08 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Fix failing media layout tests. Don't make beforeload block loads of objects that aren't in the
+ document, since video/audio (and images eventually too) can load when not in the document yet.
+
+ * dom/ContainerNode.cpp:
+ (WebCore::ContainerNode::dispatchBeforeLoadEvent):
+
+2009-10-08 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Reviewed by Eric Seidel.
+
+ Move SVGFitToViewBox ANIMATED_* macros in classes that inherit from it
+ https://bugs.webkit.org/show_bug.cgi?id=30230
+
+ This patch also devirtualizes viewBoxToViewTransform(), is it's superflous.
+ viewBoxToViewTransform() is now a simple static heper function in SVGFitToViewBox.
+ As a result, the SVGSVGElement::viewBoxToViewTransform() function now resuses the same logic.
+
+ As side-effect this patch fixes svg/custom/linking-a-03-b-transform.svg, the return
+ statement in SVGSVGElement::viewBoxToViewTransform() was clearly wrong.
+
+ * svg/SVGFitToViewBox.cpp:
+ (WebCore::SVGFitToViewBox::SVGFitToViewBox):
+ (WebCore::SVGFitToViewBox::viewBoxToViewTransform):
+ * svg/SVGFitToViewBox.h:
+ * svg/SVGMarkerElement.cpp:
+ (WebCore::SVGMarkerElement::SVGMarkerElement):
+ (WebCore::SVGMarkerElement::viewBoxToViewTransform):
+ * svg/SVGMarkerElement.h:
+ * svg/SVGPatternElement.cpp:
+ (WebCore::SVGPatternElement::SVGPatternElement):
+ (WebCore::SVGPatternElement::buildPattern):
+ * svg/SVGPatternElement.h:
+ * svg/SVGSVGElement.cpp:
+ (WebCore::SVGSVGElement::SVGSVGElement):
+ (WebCore::SVGSVGElement::viewBoxToViewTransform):
+ * svg/SVGSVGElement.h:
+ * svg/SVGSymbolElement.cpp:
+ (WebCore::SVGSymbolElement::SVGSymbolElement):
+ * svg/SVGSymbolElement.h:
+ * svg/SVGViewElement.cpp:
+ (WebCore::SVGViewElement::SVGViewElement):
+ * svg/SVGViewElement.h:
+ * svg/SVGViewSpec.cpp:
+ (WebCore::SVGViewSpec::SVGViewSpec):
+ * svg/SVGViewSpec.h:
+
+2009-10-08 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Jon Honeycutt.
+
+ Correct a typo that fixes the resizing of columns in Cookie view when you
+ resize the Inspector window.
+
+ * inspector/front-end/CookieItemsView.js:
+ (WebInspector.CookieItemsView.prototype.resize):
+
+2009-10-08 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=29811>
+ Text in Inspector's Styles gear menu is invisible.
+
+ Adds a style rule for the option text and hr's in the gear menu,
+ to prevent them from being transparent.
+
+ * inspector/front-end/inspector.css:
+
+2009-10-08 John Gregg <johnnyg@google.com>
+
+ Reviewed by David Levin.
+
+ Fix build problem with SVGURIReference in V8.
+ https://bugs.webkit.org/show_bug.cgi?id=30217
+
+ No new tests, just a build fix.
+
+ * WebCore.gypi:
+ * bindings/v8/DerivedSourcesAllInOne.cpp:
+
+2009-10-07 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Eric Carlson.
+
+ Make beforeload work on <video>/<audio> elements.
+
+ Added fast/dom/beforeload/video-before-load.html
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::parseMappedAttribute):
+ (WebCore::HTMLMediaElement::selectMediaResource):
+ (WebCore::HTMLMediaElement::selectNextSourceChild):
+
+2009-10-08 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Reviewed by Eric Seidel.
+
+ Move SVGExternalResourcesRequired ANIMATED_* macros in classes that inherit from it
+ https://bugs.webkit.org/show_bug.cgi?id=30218
+
+ The long term goal is to kill the need for the virtual contextElement() function in SVG code.
+ No change in functionality, thus no new tests.
+
+ * svg/SVGAElement.cpp:
+ (WebCore::SVGAElement::SVGAElement):
+ * svg/SVGAElement.h:
+ * svg/SVGAnimationElement.cpp:
+ (WebCore::SVGAnimationElement::SVGAnimationElement):
+ * svg/SVGAnimationElement.h:
+ * svg/SVGCircleElement.cpp:
+ (WebCore::SVGCircleElement::SVGCircleElement):
+ * svg/SVGCircleElement.h:
+ * svg/SVGClipPathElement.cpp:
+ (WebCore::SVGClipPathElement::SVGClipPathElement):
+ * svg/SVGClipPathElement.h:
+ * svg/SVGCursorElement.cpp:
+ (WebCore::SVGCursorElement::SVGCursorElement):
+ * svg/SVGCursorElement.h:
+ * svg/SVGDefsElement.cpp:
+ (WebCore::SVGDefsElement::SVGDefsElement):
+ * svg/SVGDefsElement.h:
+ * svg/SVGEllipseElement.cpp:
+ (WebCore::SVGEllipseElement::SVGEllipseElement):
+ * svg/SVGEllipseElement.h:
+ * svg/SVGExternalResourcesRequired.cpp:
+ (WebCore::SVGExternalResourcesRequired::SVGExternalResourcesRequired):
+ * svg/SVGExternalResourcesRequired.h:
+ * svg/SVGFEImageElement.cpp:
+ (WebCore::SVGFEImageElement::SVGFEImageElement):
+ * svg/SVGFEImageElement.h:
+ * svg/SVGFilterElement.cpp:
+ (WebCore::SVGFilterElement::SVGFilterElement):
+ * svg/SVGFilterElement.h:
+ * svg/SVGFontElement.cpp:
+ (WebCore::SVGFontElement::SVGFontElement):
+ * svg/SVGFontElement.h:
+ * svg/SVGForeignObjectElement.cpp:
+ (WebCore::SVGForeignObjectElement::SVGForeignObjectElement):
+ * svg/SVGForeignObjectElement.h:
+ * svg/SVGGElement.cpp:
+ (WebCore::SVGGElement::SVGGElement):
+ * svg/SVGGElement.h:
+ * svg/SVGGradientElement.cpp:
+ (WebCore::SVGGradientElement::SVGGradientElement):
+ * svg/SVGGradientElement.h:
+ * svg/SVGImageElement.cpp:
+ (WebCore::SVGImageElement::SVGImageElement):
+ * svg/SVGImageElement.h:
+ * svg/SVGLineElement.cpp:
+ (WebCore::SVGLineElement::SVGLineElement):
+ * svg/SVGLineElement.h:
+ * svg/SVGMPathElement.cpp:
+ (WebCore::SVGMPathElement::SVGMPathElement):
+ * svg/SVGMPathElement.h:
+ * svg/SVGMarkerElement.cpp:
+ (WebCore::SVGMarkerElement::SVGMarkerElement):
+ * svg/SVGMarkerElement.h:
+ * svg/SVGMaskElement.cpp:
+ (WebCore::SVGMaskElement::SVGMaskElement):
+ * svg/SVGMaskElement.h:
+ * svg/SVGPathElement.cpp:
+ (WebCore::SVGPathElement::SVGPathElement):
+ * svg/SVGPathElement.h:
+ * svg/SVGPatternElement.cpp:
+ (WebCore::SVGPatternElement::SVGPatternElement):
+ * svg/SVGPatternElement.h:
+ * svg/SVGPolyElement.cpp:
+ (WebCore::SVGPolyElement::SVGPolyElement):
+ * svg/SVGPolyElement.h:
+ * svg/SVGRectElement.cpp:
+ (WebCore::SVGRectElement::SVGRectElement):
+ * svg/SVGRectElement.h:
+ * svg/SVGSVGElement.cpp:
+ (WebCore::SVGSVGElement::SVGSVGElement):
+ * svg/SVGSVGElement.h:
+ * svg/SVGScriptElement.cpp:
+ (WebCore::SVGScriptElement::SVGScriptElement):
+ * svg/SVGScriptElement.h:
+ * svg/SVGSwitchElement.cpp:
+ (WebCore::SVGSwitchElement::SVGSwitchElement):
+ * svg/SVGSwitchElement.h:
+ * svg/SVGSymbolElement.cpp:
+ (WebCore::SVGSymbolElement::SVGSymbolElement):
+ * svg/SVGSymbolElement.h:
+ * svg/SVGTextContentElement.cpp:
+ (WebCore::SVGTextContentElement::SVGTextContentElement):
+ * svg/SVGTextContentElement.h:
+ * svg/SVGUseElement.cpp:
+ (WebCore::SVGUseElement::SVGUseElement):
+ * svg/SVGUseElement.h:
+ * svg/SVGViewElement.cpp:
+ (WebCore::SVGViewElement::SVGViewElement):
+ * svg/SVGViewElement.h:
+
+2009-10-08 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ SVG feComposite: operator over mixes up inputs
+ [https://bugs.webkit.org/show_bug.cgi?id=30205]
+
+ SVG feComposite operator over mixed up the inputs.
+ The pixel-test svg/filters/feComposite.svg can already test this.
+ No new test result is needed as long as filters are disabled.
+
+ * platform/graphics/filters/FEComposite.cpp:
+ (WebCore::FEComposite::apply):
+
+2009-10-08 Nikolas Zimmermann <nzimmermann@rim.com>
+
+ Reviewed by George Staikos.
+
+ Move SVGURIReference ANIMATED_* macros in classes that inherit from it
+ https://bugs.webkit.org/show_bug.cgi?id=30184
+
+ The long term goal is to kill the need for the virtual contextElement() function in SVG code.
+ No change in functionality, thus no new tests.
+
+ * svg/SVGAElement.cpp:
+ (WebCore::SVGAElement::SVGAElement):
+ * svg/SVGAElement.h:
+ * svg/SVGAltGlyphElement.cpp:
+ (WebCore::SVGAltGlyphElement::SVGAltGlyphElement):
+ * svg/SVGAltGlyphElement.h:
+ * svg/SVGCursorElement.cpp:
+ (WebCore::SVGCursorElement::SVGCursorElement):
+ * svg/SVGCursorElement.h:
+ * svg/SVGFEImageElement.cpp:
+ (WebCore::SVGFEImageElement::SVGFEImageElement):
+ * svg/SVGFEImageElement.h:
+ * svg/SVGFilterElement.cpp:
+ (WebCore::SVGFilterElement::SVGFilterElement):
+ * svg/SVGFilterElement.h:
+ * svg/SVGForeignObjectElement.cpp:
+ (WebCore::SVGForeignObjectElement::SVGForeignObjectElement):
+ * svg/SVGForeignObjectElement.h:
+ * svg/SVGGradientElement.cpp:
+ (WebCore::SVGGradientElement::SVGGradientElement):
+ * svg/SVGGradientElement.h:
+ * svg/SVGImageElement.cpp:
+ (WebCore::SVGImageElement::SVGImageElement):
+ * svg/SVGImageElement.h:
+ * svg/SVGMPathElement.cpp:
+ (WebCore::SVGMPathElement::SVGMPathElement):
+ (WebCore::SVGMPathElement::pathElement):
+ * svg/SVGMPathElement.h:
+ * svg/SVGMaskElement.cpp:
+ (WebCore::SVGMaskElement::SVGMaskElement):
+ * svg/SVGMaskElement.h:
+ * svg/SVGPatternElement.cpp:
+ (WebCore::SVGPatternElement::SVGPatternElement):
+ * svg/SVGPatternElement.h:
+ * svg/SVGScriptElement.cpp:
+ (WebCore::SVGScriptElement::SVGScriptElement):
+ * svg/SVGScriptElement.h:
+ * svg/SVGTRefElement.cpp:
+ (WebCore::SVGTRefElement::SVGTRefElement):
+ * svg/SVGTRefElement.h:
+ * svg/SVGTextPathElement.cpp:
+ (WebCore::SVGTextPathElement::SVGTextPathElement):
+ * svg/SVGTextPathElement.h:
+ * svg/SVGURIReference.cpp:
+ (WebCore::SVGURIReference::SVGURIReference):
+ * svg/SVGURIReference.h:
+ * svg/SVGUseElement.cpp:
+ (WebCore::SVGUseElement::SVGUseElement):
+ * svg/SVGUseElement.h:
+
+2009-10-08 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Re-add the QApplication::syncX() line for plugin windows removed
+ by r49169. Also changed the location of the sync just after the
+ creation instead of just before sending it to the plugin.
+ https://bugs.webkit.org/show_bug.cgi?id=25053
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::platformStart):
+
+2009-10-08 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Inspector: NodeLists Don't Display Well in the Console
+ https://bugs.webkit.org/show_bug.cgi?id=28061
+
+ * inspector/front-end/InjectedScript.js:
+ (Object.type):
+
+2009-10-08 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless plugins: Remove unnecessary XSync for opaque mode.
+
+ The reason for the XSync was that the plugin would not know about the
+ Drawable. It turns out that the real reason behind this is that even
+ though XCreatePixmap returns a handle, this id is unknown to the server
+ until we flush the connection.
+
+ So, move the XSync to right after we create the Pixmap.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30207
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::updatePluginWidget):
+ (WebCore::PluginView::paint):
+
+2009-10-07 Daniel Bates <dbates@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30188
+
+ Fixes an issue where performing a non DHTML drag-and-drop operation
+ does not work as expected. For instance, dragging some selected text
+ to an external application, such as TextEdit.
+
+ This issue was a regression that arose from patching bug #30107.
+
+ This change is covered by the manual test:
+ drag-out-of-background-window.html
+
+ * page/DragController.cpp:
+ (WebCore::DragController::startDrag): When performing a non-DHTML drag
+ operation then default to drag operations DragOperationGeneric and
+ DragOperationCopy according to similar functionality removed when fixing
+ bug #30107, see:
+ http://trac.webkit.org/browser/trunk/WebKit/mac/WebView/WebHTMLView.mm?rev=48526#L3430
+
+2009-10-07 Xan Lopez <xlopez@igalia.com>
+
+ Fix more breakage in the GTKbuild.
+
+ * GNUmakefile.am:
+
+2009-10-07 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move PolicyChecker to it's own file
+ https://bugs.webkit.org/show_bug.cgi?id=30193
+
+ This is just moving code around and re-naming things.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/PolicyCallback.cpp: Added.
+ (WebCore::PolicyCallback::PolicyCallback):
+ (WebCore::PolicyCallback::~PolicyCallback):
+ (WebCore::PolicyCallback::clear):
+ (WebCore::PolicyCallback::set):
+ (WebCore::PolicyCallback::call):
+ (WebCore::PolicyCallback::clearRequest):
+ (WebCore::PolicyCallback::cancel):
+ * loader/PolicyCallback.h: Added.
+ (WebCore::PolicyCallback::request):
+ * loader/PolicyCheck.cpp: Removed.
+ * loader/PolicyCheck.h: Removed.
+
+2009-10-07 Joel Stanley <joel@jms.id.au>
+
+ Reviewed by Mark Rowe.
+
+ Include <limits> for std::numeric_limits. Required by gcc-4.4
+ https://bugs.webkit.org/show_bug.cgi?id=30197
+
+ * html/canvas/CanvasByteArray.h:
+ * html/canvas/CanvasIntArray.h:
+ * html/canvas/CanvasShortArray.h:
+ * html/canvas/CanvasUnsignedByteArray.h:
+ * html/canvas/CanvasUnsignedIntArray.h:
+ * html/canvas/CanvasUnsignedShortArray.h:
+
+2009-10-07 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Factor PolicyChecker out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30155
+
+ This patch separates PolicyChecker from FrameLoader. Loader policy is
+ in change of managing the FrameLoaderClient callbacks. Ideally, it
+ shouldn't know anything about FrameLoader, but I couldn't quite remove
+ all knowledge (although we might be able to do more later). In a
+ future patch, I'll move PolicyChecker into a separate file.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::loadURL):
+ (WebCore::FrameLoader::load):
+ (WebCore::FrameLoader::loadWithDocumentLoader):
+ (WebCore::PolicyChecker::handleUnimplementablePolicy):
+ (WebCore::PolicyChecker::cannotShowMIMEType):
+ (WebCore::PolicyChecker::PolicyChecker):
+ (WebCore::PolicyChecker::checkNavigationPolicy):
+ (WebCore::PolicyChecker::checkContentPolicy):
+ (WebCore::FrameLoader::shouldReloadToHandleUnreachableURL):
+ (WebCore::FrameLoader::stopAllLoaders):
+ (WebCore::PolicyChecker::cancelCheck):
+ (WebCore::PolicyChecker::stopCheck):
+ (WebCore::PolicyChecker::continueAfterContentPolicy):
+ (WebCore::PolicyChecker::continueLoadAfterWillSubmitForm):
+ (WebCore::FrameLoader::continueLoadAfterWillSubmitForm):
+ (WebCore::FrameLoader::loadPostRequest):
+ (WebCore::FrameLoader::continueFragmentScrollAfterNavigationPolicy):
+ (WebCore::PolicyChecker::checkNewWindowPolicy):
+ (WebCore::PolicyChecker::continueAfterNewWindowPolicy):
+ (WebCore::PolicyChecker::continueAfterNavigationPolicy):
+ (WebCore::FrameLoader::continueLoadAfterNavigationPolicy):
+ * loader/FrameLoader.h:
+ (WebCore::PolicyChecker::loadType):
+ (WebCore::PolicyChecker::setLoadType):
+ (WebCore::PolicyChecker::delegateIsDecidingNavigationPolicy):
+ (WebCore::PolicyChecker::delegateIsHandlingUnimplementablePolicy):
+ (WebCore::FrameLoader::policy):
+ * loader/FrameLoaderClient.h:
+ * loader/MainResourceLoader.cpp:
+ (WebCore::MainResourceLoader::didCancel):
+ (WebCore::MainResourceLoader::willSendRequest):
+ (WebCore::MainResourceLoader::continueAfterContentPolicy):
+ (WebCore::MainResourceLoader::didReceiveResponse):
+ * svg/graphics/SVGImage.cpp:
+ (WebCore::SVGImage::dataChanged):
+
+2009-10-07 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Fixed <rdar://problem/5751979> Database code takes JSLock on secondary
+ thread, permanently slowing down JavaScript
+
+ Changed callback objects to use a standard helper object. The helper
+ object ASSERTs that it is deleted on the main thread, so no lock is
+ required when unprotecting its members. It also centralizes some previously
+ duplicated code.
+
+ Callback objects that might be deleted on a secondary thread use
+ callOnMainThread to delete their helper objects on the main thread.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSCallbackData.cpp: Copied from bindings/js/JSCustomSQLTransactionCallback.cpp.
+ (WebCore::JSCallbackData::deleteData):
+ (WebCore::JSCallbackData::invokeCallback):
+ * bindings/js/JSCallbackData.h: Copied from bindings/js/JSCustomSQLTransactionCallback.cpp.
+ (WebCore::JSCallbackData::JSCallbackData):
+ (WebCore::JSCallbackData::~JSCallbackData):
+ (WebCore::JSCallbackData::callback):
+ * bindings/js/JSCustomPositionCallback.cpp:
+ (WebCore::JSCustomPositionCallback::JSCustomPositionCallback):
+ (WebCore::JSCustomPositionCallback::handleEvent):
+ * bindings/js/JSCustomPositionCallback.h:
+ * bindings/js/JSCustomPositionErrorCallback.cpp:
+ (WebCore::JSCustomPositionErrorCallback::JSCustomPositionErrorCallback):
+ (WebCore::JSCustomPositionErrorCallback::handleEvent):
+ * bindings/js/JSCustomPositionErrorCallback.h:
+ * bindings/js/JSCustomSQLStatementCallback.cpp:
+ (WebCore::JSCustomSQLStatementCallback::JSCustomSQLStatementCallback):
+ (WebCore::JSCustomSQLStatementCallback::~JSCustomSQLStatementCallback):
+ (WebCore::JSCustomSQLStatementCallback::handleEvent):
+ * bindings/js/JSCustomSQLStatementCallback.h:
+ * bindings/js/JSCustomSQLStatementErrorCallback.cpp:
+ (WebCore::JSCustomSQLStatementErrorCallback::JSCustomSQLStatementErrorCallback):
+ (WebCore::JSCustomSQLStatementErrorCallback::~JSCustomSQLStatementErrorCallback):
+ (WebCore::JSCustomSQLStatementErrorCallback::handleEvent):
+ * bindings/js/JSCustomSQLStatementErrorCallback.h:
+ * bindings/js/JSCustomSQLTransactionCallback.cpp:
+ (WebCore::JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback):
+ (WebCore::JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback):
+ (WebCore::JSCustomSQLTransactionCallback::handleEvent):
+ * bindings/js/JSCustomSQLTransactionCallback.h:
+ * bindings/js/JSCustomSQLTransactionErrorCallback.cpp:
+ (WebCore::JSCustomSQLTransactionErrorCallback::JSCustomSQLTransactionErrorCallback):
+ (WebCore::JSCustomSQLTransactionErrorCallback::~JSCustomSQLTransactionErrorCallback):
+ (WebCore::JSCustomSQLTransactionErrorCallback::handleEvent):
+ * bindings/js/JSCustomSQLTransactionErrorCallback.h:
+ * bindings/js/JSCustomVoidCallback.cpp:
+ (WebCore::JSCustomVoidCallback::JSCustomVoidCallback):
+ (WebCore::JSCustomVoidCallback::~JSCustomVoidCallback):
+ (WebCore::JSCustomVoidCallback::handleEvent):
+ * bindings/js/JSCustomVoidCallback.h:
+ * storage/Database.cpp:
+ (WebCore::Database::Database):
+
+2009-10-07 Jens Alfke <snej@chromium.org>
+
+ Reviewed by Dave Levin.
+
+ Fix StringImpl::m_buffer
+ https://bugs.webkit.org/show_bug.cgi?id=30189
+
+ Fix my previous StringImpl patch to avoid using an indefinite-length array member,
+ since MSVC doesn't like it. Instead, go back to offsetting by sizeof(StringImpl).
+
+ * platform/text/StringImpl.cpp:
+ (WebCore::StringImpl::StringImpl):
+ (WebCore::StringImpl::createUninitialized):
+ * platform/text/StringImpl.h:
+ (WebCore::StringImpl::bufferIsInternal):
+
+2009-10-07 Aaron Boodman <aa@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Update isolated worlds under v8 to support world reuse.
+ https://bugs.webkit.org/show_bug.cgi?id=30145
+
+ * bindings/v8/ScriptController.cpp:
+ Replace evaluateInNewIsolatedWorld() withe evaluateInIsolatedWorld(id).
+ (WebCore::ScriptController::evaluateInIsolatedWorld):
+ * bindings/v8/ScriptController.h: Ditto.
+ * bindings/v8/V8Proxy.cpp: Ditto.
+ (WebCore::V8Proxy::~V8Proxy): Dittio.
+ (WebCore::V8Proxy::evaluateInIsolatedWorld): Ditto.
+ * bindings/v8/V8Proxy.h: Ditto.
+ * bindings/v8/V8IsolatedWorld.cpp:
+ Add support for controlling lifetime of a world, rather than relying on GC.
+ (WebCore::V8IsolatedWorld::contextWeakReferenceCallback): Ditto.
+ (WebCore::V8IsolatedWorld::V8IsolatedWorld): Ditto.
+ (WebCore::V8IsolatedWorld::destroy): Ditto.
+ * bindings/v8/V8IsolatedWorld.h: Ditto.
+
+2009-10-07 Jeremy Orlow <jorlow@chromium.org>
+
+ Build fix for http://trac.webkit.org/changeset/49272 on Windows
+
+ * platform/text/StringImpl.h:
+
+2009-10-07 Jens Alfke <snej@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Optimization of StringImpl:
+ - Remove unnecessary m_bufferIsInternal member (saves 4 bytes). Instead, check whether
+ m_data points to just past the end of the object's members.
+ - copy() and createWithTerminatingNullCharacter() create the string in a single malloc
+ block instead of 2 (saves ~20 bytes and considerable CPU cycles, increases locality).
+ - Move m_length next to m_hash to save 4 bytes of padding in 64-bit builds.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29500
+
+ * platform/text/StringImpl.cpp:
+ (WebCore::StringImpl::StringImpl): Re-ordered members.
+ (WebCore::StringImpl::~StringImpl): Change to is-buffer-internal check.
+ (WebCore::StringImpl::createUninitialized): Use new m_buffer member instead of sizeof()
+ to ensure chars are copied to correct location.
+ (WebCore::StringImpl::createWithTerminatingNullCharacter): Make sure copy is created
+ in a single malloc block.
+ (WebCore::StringImpl::threadsafeCopy): Make sure copy is created in a single malloc block.
+ (WebCore::StringImpl::crossThreadString): Make sure copy is created in a single malloc block.
+ (WebCore::StringImpl::sharedBuffer): Change to is-buffer-internal check.
+ * platform/text/StringImpl.h:
+ (WebCore::StringImpl::startsWith): Just fixed a confusing param name.
+ (WebCore::StringImpl::bufferIsInternal): Changed member var into accessor method.
+ (WebCore::StringImpl::m_data): Repositioned for optimal member packing in 64-bit.
+ (WebCore::StringImpl::m_buffer): Added to provide an explicit location for where internal buffer goes.
+
+2009-10-07 Daniel Bates <dbates@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30102
+ And
+ <rdar://problem/5015957>
+
+ Manual test to confirm that the not-allowed cursor is shown for an
+ invalid drag-and-drop operation.
+
+ We cannot test this using DRT because of a discrepancy between the Windows
+ API-based drop effect and the WebKit drop effect. See bug #24731 for more
+ details.
+
+ * manual-tests/drag-cursor-notallowed.html: Added.
+
+2009-10-07 Mark Rowe <mrowe@apple.com>
+
+ Fix the build.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-07 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <http://webkit.org/b/30104>.
+ Inspector should show cookies of sub-resources on the page.
+
+ This function implements showing cookies for all sub-resources of a page.
+ When the page is loaded, it populates the Storage Panel with a list of all
+ domains that were loaded as part of the full page load (iframes, ads, etc).
+ When the user selects one of the domains, the inspector calls back into the
+ controller, and the controller combines all of the cookies from that domain
+ into a list, and sends that list is sent back to the controller to render.
+
+ A domain now needs to be passed into CookieItemsView, and CookieSidebarTreeElement.
+
+ As a result of a previous patch, we now have detailed cookie information for
+ both Windows on CFNetwork and Mac. Additionally, this patch provides deleteCookie
+ support on Windows.
+
+ * bindings/js/ScriptObject.cpp:
+ (WebCore::ScriptObject::set):
+ * bindings/js/ScriptObject.h:
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::getCookies):
+ (WebCore::InspectorBackend::deleteCookie):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::populateScriptObjects):
+ (WebCore::InspectorController::didFinishLoading):
+ (WebCore::InspectorController::getCookies):
+ (WebCore::InspectorController::buildArrayForCookies):
+ (WebCore::InspectorController::buildObjectForCookie):
+ (WebCore::InspectorController::deleteCookie):
+ * inspector/InspectorController.h:
+ * inspector/InspectorDOMAgent.cpp:
+ * inspector/InspectorDOMAgent.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addCookieDomainForDocument):
+ * inspector/InspectorFrontend.h:
+ * inspector/front-end/CookieItemsView.js:
+ (WebInspector.CookieItemsView):
+ (WebInspector.CookieItemsView.prototype.update):
+ (WebInspector.CookieItemsView.prototype._deleteButtonClicked):
+ * inspector/front-end/DOMAgent.js:
+ (WebInspector.Cookies.getCookiesAsync):
+ * inspector/front-end/StoragePanel.js:
+ (WebInspector.StoragePanel):
+ (WebInspector.StoragePanel.prototype.reset):
+ (WebInspector.StoragePanel.prototype.addCookieDomain):
+ (WebInspector.StoragePanel.prototype.showCookies):
+ (WebInspector.CookieSidebarTreeElement):
+ (WebInspector.CookieSidebarTreeElement.prototype.onselect):
+ * inspector/front-end/inspector.js:
+ (WebInspector.addCookieDomain):
+ * platform/Cookie.h:
+ (WebCore::CookieHash::hash):
+ (WebCore::CookieHash::equal):
+ (WTF::):
+ * platform/network/win/CookieJarCFNetWin.cpp:
+ (WebCore::deleteCookie):
+
+2009-10-07 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Add ScriptObject::set(const char*, unsigned).
+
+ https://bugs.webkit.org/show_bug.cgi?id=30104
+
+ * bindings/v8/ScriptObject.cpp:
+ (WebCore::ScriptObject::set):
+ * bindings/v8/ScriptObject.h:
+
+2009-10-07 Brent Fulgham <bfulgham@webkit.org>
+
+ Unreviewed build fix for Windows (Cairo).
+
+ Provide implementation of new BitmapImage::create that was
+ added in @r49060.
+
+ * platform/graphics/win/ImageCairoWin.cpp:
+
+2009-10-07 Andrew Scherkus <scherkus@chromium.org>
+
+ Reviewed by Eric Carlson.
+
+ Refactor RenderThemeChromiumMac and RenderThemeChromiumSkia to render media controls using GraphicsContext.
+
+ Design was based on existing RenderMediaControls.cpp used by RenderThemeSafari/Win.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29987
+
+ Covered by existing layout tests as no new functionality was introduced.
+
+ * WebCore.gypi: Added RenderMediaControlsChromium.cpp/h.
+ * css/mediaControlsChromium.css: Tweaked media slider position and border style.
+ * rendering/MediaControlElements.cpp:
+ (WebCore::toParentMediaElement): Taken from RenderMediaControls.
+ (WebCore::MediaControlElement::rendererIsNeeded): Don't call shouldRenderMediaControlPart() if element has no appearance.
+ (WebCore::MediaControlInputElement::rendererIsNeeded): Ditto.
+ * rendering/RenderMediaControls.cpp: Moved parentMediaElement() to MediaControlElements.
+ * rendering/RenderMediaControlsChromium.cpp: Added.
+ (WebCore::platformResource): Helper to load and cache media control image resources.
+ (WebCore::mediaSliderThumbImage): Implementation refactored from RenderThemeChromiumMac/Skia.
+ (WebCore::mediaVolumeSliderThumbImage): Ditto.
+ (WebCore::paintMediaButton): Ditto.
+ (WebCore::paintMediaMuteButton): Ditto.
+ (WebCore::paintMediaPlayButton): Ditto.
+ (WebCore::paintMediaSlider): Ditto.
+ (WebCore::paintMediaSliderThumb): Ditto.
+ (WebCore::paintMediaVolumeSlider): Ditto.
+ (WebCore::paintMediaVolumeSliderThumb): Ditto.
+ (WebCore::paintMediaTimelineContainer): Ditto.
+ (WebCore::RenderMediaControlsChromium::shouldRenderMediaControlPart): Ditto.
+ (WebCore::RenderMediaControlsChromium::paintMediaControlsPart): Same
+ (WebCore::RenderMediaControlsChromium::adjustMediaSliderThumbSize):
+ * rendering/RenderMediaControlsChromium.h: Added.
+ * rendering/RenderThemeChromiumMac.h:
+ * rendering/RenderThemeChromiumMac.mm:
+ (WebCore::RenderThemeChromiumMac::adjustSliderThumbSize): Implementation delegated to RenderMediaControlsChromium.
+ (WebCore::RenderThemeChromiumMac::shouldRenderMediaControlPart): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaPlayButton): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaMuteButton): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaSliderTrack): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaVolumeSliderTrack): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaSliderThumb): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaVolumeSliderThumb): Ditto.
+ (WebCore::RenderThemeChromiumMac::paintMediaControlsBackground): Ditto.
+ * rendering/RenderThemeChromiumSkia.cpp:
+ (WebCore::RenderThemeChromiumSkia::paintMediaControlsBackground): Implementation delegated to RenderMediaControlsChromium.
+ (WebCore::RenderThemeChromiumSkia::paintMediaSliderTrack): Ditto.
+ (WebCore::RenderThemeChromiumSkia::paintMediaVolumeSliderTrack): Ditto.
+ (WebCore::RenderThemeChromiumSkia::adjustSliderThumbSize): Ditto.
+ (WebCore::RenderThemeChromiumSkia::paintMediaSliderThumb): Ditto.
+ (WebCore::RenderThemeChromiumSkia::paintMediaVolumeSliderThumb): Ditto.
+ (WebCore::RenderThemeChromiumSkia::paintMediaPlayButton): Ditto.
+ (WebCore::RenderThemeChromiumSkia::paintMediaMuteButton): Ditto.
+ (WebCore::RenderThemeChromiumSkia::shouldRenderMediaControlPart): Ditto.
+
+2009-10-07 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Make plugins work with beforeload.
+
+ Added fast/dom/beforeload/flash-before-load.html
+
+ * html/HTMLObjectElement.cpp:
+ (WebCore::HTMLObjectElement::parseMappedAttribute):
+ * rendering/RenderPartObject.cpp:
+ (WebCore::RenderPartObject::updateWidget):
+
+2009-10-07 Vitaly Repeshko <vitalyr@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ [V8] Protect JS listener object from GC while clearing a property on it.
+ See http://crbug.com/23780.
+ https://bugs.webkit.org/show_bug.cgi?id=30137
+
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+
+2009-10-07 Zoltan Horvath <zoltan@webkit.org>
+
+ Rubber-stamped by Eric Seidel.
+
+ Allow custom memory allocation control for WebCore's CachedResourceClient class
+ https://bugs.webkit.org/show_bug.cgi?id=30165
+
+ Inherits CachedResourceClient class from FastAllocBase because (its
+ child class) CSSFontFaceSource has been instantiated by 'new' in WebCore/css/CSSFontFaceSource.h:46.
+
+ * loader/CachedResourceClient.h:
+
+2009-10-07 Zoltan Horvath <zoltan@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Allow custom memory allocation control for WebCore's IdentifierRep
+ https://bugs.webkit.org/show_bug.cgi?id=30159
+
+ Inherits IdentifierRep class from FastAllocBase because it has been
+ instantiated by 'new' in WebCore/bridge/IdentifierRep.cpp:61.
+
+ * bridge/IdentifierRep.h:
+
+2009-10-07 Anton Muhin <antonm@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Fetch pointers to C+DOM window immediately from holder
+ object (do not search prototype chain for proper JS wrapper).
+ https://bugs.webkit.org/show_bug.cgi?id=29031
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getTemplate):
+ * bindings/v8/V8Proxy.cpp:
+ (WebCore::V8Proxy::createNewContext):
+ (WebCore::V8Proxy::installDOMWindow):
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::ACCESSOR_GETTER):
+ (WebCore::ACCESSOR_SETTER):
+ (WebCore::INDEXED_PROPERTY_GETTER):
+ (WebCore::NAMED_PROPERTY_GETTER):
+ (WebCore::NAMED_ACCESS_CHECK):
+ (WebCore::INDEXED_ACCESS_CHECK):
+2009-10-07 Adam Roben <aroben@apple.com>
+
+ Fix typo in PluginView::load that was causing cross-origin loads to
+ be allowed
+
+ This typo was introduced in the build fix in r49213.
+
+ Fixes <http://webkit.org/b/30168> REGRESSION (r49213):
+ http/tests/plugins/local-geturl-from-remote.html is failing on Windows
+
+ Reviewed by Sam Weinig.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::load): Removed a comma operator that was making
+ a condition always evaluate to true.
+
+2009-10-07 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Do not create valid QColor's for invalid WebCore::Color's.
+
+ * platform/graphics/qt/ColorQt.cpp:
+ (WebCore::Color::operator QColor):
+
2009-10-07 Janne Koskinen <janne.p.koskinen@digia.com>
Reviewed by Simon Hausmann.
@@ -10,6 +5291,3817 @@
* WebCore.pro:
+2009-10-07 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Migrate database inspection to the injected script-based schema.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29788
+
+ * bindings/js/JSInspectorBackendCustom.cpp:
+ (WebCore::JSInspectorBackend::databaseForId):
+ * bindings/v8/custom/V8CustomBinding.h:
+ * bindings/v8/custom/V8InspectorBackendCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::dispatchOnInjectedScript):
+ (WebCore::InspectorBackend::databaseForId):
+ (WebCore::InspectorBackend::selectDatabase):
+ (WebCore::InspectorBackend::getDatabaseTableNames):
+ (WebCore::InspectorBackend::reportDidDispatchOnInjectedScript):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::populateScriptObjects):
+ (WebCore::InspectorController::resetScriptObjects):
+ (WebCore::InspectorController::selectDatabase):
+ (WebCore::InspectorController::databaseForId):
+ (WebCore::InspectorController::didOpenDatabase):
+ (WebCore::InspectorController::didUseDOMStorage):
+ (WebCore::InspectorController::selectDOMStorage):
+ (WebCore::InspectorController::getDOMStorageResourceForId):
+ * inspector/InspectorController.h:
+ * inspector/InspectorDatabaseResource.cpp:
+ (WebCore::InspectorDatabaseResource::InspectorDatabaseResource):
+ (WebCore::InspectorDatabaseResource::bind):
+ * inspector/InspectorDatabaseResource.h:
+ (WebCore::InspectorDatabaseResource::database):
+ (WebCore::InspectorDatabaseResource::id):
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addDatabase):
+ (WebCore::InspectorFrontend::selectDatabase):
+ (WebCore::InspectorFrontend::didGetDatabaseTableNames):
+ (WebCore::InspectorFrontend::addDOMStorage):
+ * inspector/InspectorFrontend.h:
+ * inspector/front-end/Database.js:
+ (WebInspector.Database):
+ (WebInspector.Database.prototype.get id):
+ (WebInspector.Database.prototype.set name):
+ (WebInspector.Database.prototype.set version):
+ (WebInspector.Database.prototype.set domain):
+ (WebInspector.Database.prototype.getTableNames):
+ (WebInspector.Database.prototype.executeSql):
+ * inspector/front-end/InjectedScript.js:
+ (InjectedScript.dispatch):
+ (InjectedScript.executeSql):
+ (InjectedScript.executeSql.errorCallback):
+ (InjectedScript.executeSql.queryTransaction):
+ * inspector/front-end/InjectedScriptAccess.js:
+ (InjectedScriptAccess._installHandler.InjectedScriptAccess.methodName):
+ (InjectedScriptAccess._installHandler):
+ * inspector/front-end/StoragePanel.js:
+ (WebInspector.StoragePanel.prototype.selectDatabase):
+ (WebInspector.StoragePanel.prototype.dataGridForResult):
+ * inspector/front-end/inspector.js:
+ (WebInspector.addDatabase):
+
+2009-10-07 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless Plugins: Disable content propagation for QGraphicsView items
+
+ We cannot support content propagation for items in QGraphicsView because
+ the contents of the backing store might be transformed. So turn it off
+ if we are not painting on QWidget.
+
+ Note that this check will not work for a QWebView in a
+ QGraphicsProxyWidget, but I guess it's fine. Alternative is to do an
+ even uglier cast: static_cast painter's paintDevice() to QWidget and
+ check if it is the viewport() of QGraphicsView.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30149
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::paint):
+
+2009-10-07 Simon Hausmann <simon.hausmann@nokia.com>
+
+ Fix the Qt build by adding the missing files to the build.
+
+ * WebCore.pro:
+
+2009-10-07 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
+
+ Reviewed by Xan Lopez.
+
+ Fix incorrect convertion of double into int while assigning it to
+ a float.
+
+ * platform/graphics/gtk/SimpleFontDataGtk.cpp:
+ (WebCore::SimpleFontData::platformInit):
+ * platform/graphics/gtk/SimpleFontDataPango.cpp:
+ (WebCore::SimpleFontData::platformInit):
+
+2009-10-07 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
+
+ Reviewed by Xan Lopez.
+
+ Fix rounding error issues in height calculation in 64 bits.
+
+ Already covered by existing tests.
+
+ * platform/graphics/gtk/SimpleFontDataGtk.cpp:
+ (WebCore::SimpleFontData::platformInit):
+ * platform/graphics/gtk/SimpleFontDataPango.cpp:
+ (WebCore::SimpleFontData::platformInit):
+
+2009-10-07 Shinichiro Hamaji <hamaji@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Dual lines in css2.1 layout tests do not match:
+ https://bugs.webkit.org/show_bug.cgi?id=23262
+
+ Now we can put a counter node as the next sibling of a reset node.
+ Re-layout the counter content when the count is updated.
+
+ Tests: fast/css/counters/t1204-increment-00-c-o.html
+ fast/css/counters/t1204-increment-01-c-o.html
+
+ * rendering/CounterNode.cpp:
+ (WebCore::CounterNode::recount):
+ * rendering/RenderCounter.cpp:
+ (WebCore::findPlaceForCounter):
+
+2009-10-06 Xan Lopez <xlopez@igalia.com>
+
+ Try to fix the GTKbuild.
+
+ * GNUmakefile.am:
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ Removed unused member variable from FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30146
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader):
+ * loader/FrameLoader.h:
+
+2009-10-06 David Levin <levin@chromium.org>
+
+ Reviewed by NOBODY (build fix).
+
+ A few small/trivial tweaks to the last build fix.
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+
+2009-10-06 David Levin <levin@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ [Chromium] Need to adjust MessagePort, etc. code for the post clone work done.
+ https://bugs.webkit.org/show_bug.cgi?id=30147
+
+ No change in functionality so no new tests.
+
+ * WebCore.gypi:
+ * bindings/scripts/CodeGeneratorV8.pm:
+ * bindings/v8/SerializedScriptValue.h: Added.
+ A very simple implementation of SerializedScriptValue
+ that only works for strings.
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8MessageEventCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8MessagePortCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8WorkerCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+
+2009-10-06 Sam Weinig <sam@webkit.org>
+
+ Reviewed by Brady Eidson.
+
+ Fix for <rdar://problem/7271202>
+ Dispatch resource load delegate functions for the media element.
+ Since we don't get the required callbacks from the media engine,
+ just fake the parameters to the delegate functions as best as possible.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::loadResource):
+ (WebCore::HTMLMediaElement::isSafeToLoadURL):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::willLoadMediaElementURL):
+ * loader/FrameLoader.h:
+
+2009-10-06 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by NOBODY (Build fix).
+
+ More build fixes.
+
+ * bindings/js/SerializedScriptValue.cpp:
+ (WebCore::DeserializingTreeWalker::getProperty):
+ (WebCore::TeardownTreeWalker::getProperty):
+ * bindings/js/SerializedScriptValue.h:
+ (WebCore::SerializedScriptValue::SerializedScriptValue):
+
+2009-10-06 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by NOBODY (Build fix).
+
+ Build and formatting fix.
+
+ * ForwardingHeaders/runtime/ExceptionHelpers.h: Added.
+ * bindings/js/SerializedScriptValue.cpp:
+ * bindings/js/SerializedScriptValue.h:
+ (WebCore::SerializedScriptValueData::operator bool):
+ (WebCore::SerializedScriptValueData::release):
+ (WebCore::SerializedScriptValue::release):
+ (WebCore::SerializedScriptValue::toString):
+ (WebCore::SerializedScriptValue::~SerializedScriptValue):
+ (WebCore::SerializedScriptValue::SerializedScriptValue):
+
+2009-10-05 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Gavin Barraclough.
+
+ It should be possible to post (clone) built-in JS objects to Workers
+ https://bugs.webkit.org/show_bug.cgi?id=22878
+
+ Implement object cloning semantics for postMessage. Currently only
+ a partial implementation of the spec -- cloning of File, FileList,
+ ImageData, and RegExp were left out as they would have significantly
+ increased patch size.
+
+ Cloning requires multiple tree walks so we use a templated tree
+ walk function, allowing us to share a single implementation for
+ serialization, deserialization, and eventual destruction of the
+ serialized object tree.
+
+ Test: fast/dom/Window/window-postmessage-clone.html
+
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::JSDOMWindow::postMessage):
+ * bindings/js/JSMessageEventCustom.cpp:
+ (WebCore::JSMessageEvent::initMessageEvent):
+ * bindings/js/JSMessagePortCustom.h:
+ (WebCore::handlePostMessage):
+ * bindings/js/SerializedScriptValue.cpp: Added.
+ (WebCore::SerializedObject::set):
+ (WebCore::SerializedObject::names):
+ (WebCore::SerializedObject::values):
+ (WebCore::SerializedObject::create):
+ (WebCore::SerializedObject::clear):
+ (WebCore::SerializedObject::SerializedObject):
+ (WebCore::SerializedArray::setIndex):
+ (WebCore::SerializedArray::canDoFastRead):
+ (WebCore::SerializedArray::getIndex):
+ (WebCore::SerializedArray::getSparseIndex):
+ (WebCore::SerializedArray::length):
+ (WebCore::SerializedArray::create):
+ (WebCore::SerializedArray::clear):
+ (WebCore::SerializedArray::SerializedArray):
+ (WebCore::SerializedScriptValueData::SerializedScriptValueData):
+ (WebCore::SharedSerializedData::asArray):
+ (WebCore::SharedSerializedData::asObject):
+ (WebCore::):
+ (WebCore::walk):
+ (WebCore::BaseWalker::BaseWalker):
+ (WebCore::BaseWalker::shouldTerminate):
+ (WebCore::BaseWalker::ticksUntilNextCheck):
+ (WebCore::BaseWalker::didTimeOut):
+ (WebCore::BaseWalker::throwStackOverflow):
+ (WebCore::BaseWalker::throwInterruptedException):
+ (WebCore::SerializingTreeWalker::SerializingTreeWalker):
+ (WebCore::SerializingTreeWalker::null):
+ (WebCore::SerializingTreeWalker::isArray):
+ (WebCore::SerializingTreeWalker::isObject):
+ (WebCore::SerializingTreeWalker::asInputArray):
+ (WebCore::SerializingTreeWalker::asInputObject):
+ (WebCore::SerializingTreeWalker::createOutputArray):
+ (WebCore::SerializingTreeWalker::createOutputObject):
+ (WebCore::SerializingTreeWalker::length):
+ (WebCore::SerializingTreeWalker::canDoFastRead):
+ (WebCore::SerializingTreeWalker::getIndex):
+ (WebCore::SerializingTreeWalker::getSparseIndex):
+ (WebCore::SerializingTreeWalker::getProperty):
+ (WebCore::SerializingTreeWalker::convertIfTerminal):
+ (WebCore::SerializingTreeWalker::getPropertyNames):
+ (WebCore::SerializingTreeWalker::putIndex):
+ (WebCore::SerializingTreeWalker::putProperty):
+ (WebCore::SerializingTreeWalker::startArray):
+ (WebCore::SerializingTreeWalker::endArray):
+ (WebCore::SerializingTreeWalker::startObject):
+ (WebCore::SerializingTreeWalker::endObject):
+ (WebCore::SerializedScriptValueData::serialize):
+ (WebCore::DeserializingTreeWalker::DeserializingTreeWalker):
+ (WebCore::DeserializingTreeWalker::null):
+ (WebCore::DeserializingTreeWalker::isArray):
+ (WebCore::DeserializingTreeWalker::isObject):
+ (WebCore::DeserializingTreeWalker::asInputArray):
+ (WebCore::DeserializingTreeWalker::asInputObject):
+ (WebCore::DeserializingTreeWalker::createOutputArray):
+ (WebCore::DeserializingTreeWalker::createOutputObject):
+ (WebCore::DeserializingTreeWalker::length):
+ (WebCore::DeserializingTreeWalker::canDoFastRead):
+ (WebCore::DeserializingTreeWalker::getIndex):
+ (WebCore::DeserializingTreeWalker::getSparseIndex):
+ (WebCore::DeserializingTreeWalker::getProperty):
+ (WebCore::DeserializingTreeWalker::convertIfTerminal):
+ (WebCore::DeserializingTreeWalker::getPropertyNames):
+ (WebCore::DeserializingTreeWalker::putIndex):
+ (WebCore::DeserializingTreeWalker::putProperty):
+ (WebCore::DeserializingTreeWalker::startArray):
+ (WebCore::DeserializingTreeWalker::endArray):
+ (WebCore::DeserializingTreeWalker::startObject):
+ (WebCore::DeserializingTreeWalker::endObject):
+ (WebCore::SerializedScriptValueData::deserialize):
+ (WebCore::TeardownTreeWalker::shouldTerminate):
+ (WebCore::TeardownTreeWalker::ticksUntilNextCheck):
+ (WebCore::TeardownTreeWalker::didTimeOut):
+ (WebCore::TeardownTreeWalker::throwStackOverflow):
+ (WebCore::TeardownTreeWalker::throwInterruptedException):
+ (WebCore::TeardownTreeWalker::null):
+ (WebCore::TeardownTreeWalker::isArray):
+ (WebCore::TeardownTreeWalker::isObject):
+ (WebCore::TeardownTreeWalker::asInputArray):
+ (WebCore::TeardownTreeWalker::asInputObject):
+ (WebCore::TeardownTreeWalker::createOutputArray):
+ (WebCore::TeardownTreeWalker::createOutputObject):
+ (WebCore::TeardownTreeWalker::length):
+ (WebCore::TeardownTreeWalker::canDoFastRead):
+ (WebCore::TeardownTreeWalker::getIndex):
+ (WebCore::TeardownTreeWalker::getSparseIndex):
+ (WebCore::TeardownTreeWalker::getProperty):
+ (WebCore::TeardownTreeWalker::convertIfTerminal):
+ (WebCore::TeardownTreeWalker::getPropertyNames):
+ (WebCore::TeardownTreeWalker::putIndex):
+ (WebCore::TeardownTreeWalker::putProperty):
+ (WebCore::TeardownTreeWalker::startArray):
+ (WebCore::TeardownTreeWalker::endArray):
+ (WebCore::TeardownTreeWalker::startObject):
+ (WebCore::TeardownTreeWalker::endObject):
+ (WebCore::SerializedScriptValueData::tearDownSerializedData):
+ * bindings/js/SerializedScriptValue.h: Added.
+ (WebCore::SharedSerializedData::~SharedSerializedData):
+ (WebCore::SerializedScriptValueData::):
+ (WebCore::SerializedScriptValueData::type):
+ (WebCore::SerializedScriptValueData::~SerializedScriptValueData):
+ (WebCore::SerializedScriptValueData::SerializedScriptValueData):
+ (WebCore::SerializedScriptValueData::asImmediate):
+ (WebCore::SerializedScriptValueData::asDouble):
+ (WebCore::SerializedScriptValueData::asString):
+ (WebCore::SerializedScriptValueData::asObject):
+ (WebCore::SerializedScriptValueData::asArray):
+ (WebCore::SerializedScriptValueData::operator bool ):
+ (WebCore::SerializedScriptValueData::release):
+ (WebCore::SerializedScriptValue::create):
+ (WebCore::SerializedScriptValue::release):
+ (WebCore::SerializedScriptValue::toString):
+ (WebCore::SerializedScriptValue::deserialize):
+ (WebCore::SerializedScriptValue::~SerializedScriptValue):
+ (WebCore::SerializedScriptValue::SerializedScriptValue):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ * bindings/scripts/CodeGeneratorObjC.pm:
+ * dom/MessageEvent.cpp:
+ (WebCore::MessageEvent::MessageEvent):
+ (WebCore::MessageEvent::initMessageEvent):
+ * dom/MessageEvent.h:
+ (WebCore::MessageEvent::create):
+ (WebCore::MessageEvent::data):
+ * dom/MessageEvent.idl:
+ * dom/MessagePort.cpp:
+ (WebCore::MessagePort::postMessage):
+ * dom/MessagePort.h:
+ * dom/MessagePortChannel.cpp:
+ (WebCore::MessagePortChannel::EventData::create):
+ (WebCore::MessagePortChannel::EventData::EventData):
+ * dom/MessagePortChannel.h:
+ (WebCore::MessagePortChannel::EventData::message):
+ * page/DOMWindow.cpp:
+ (WebCore::PostMessageTimer::PostMessageTimer):
+ (WebCore::DOMWindow::postMessage):
+ * page/DOMWindow.h:
+ * page/DOMWindow.idl:
+ * page/EventSource.cpp:
+ (WebCore::EventSource::createMessageEvent):
+ * websockets/WebSocket.cpp:
+ (WebCore::WebSocket::didReceiveMessage):
+ * workers/DedicatedWorkerContext.cpp:
+ (WebCore::DedicatedWorkerContext::postMessage):
+ * workers/DedicatedWorkerContext.h:
+ * workers/DedicatedWorkerContext.idl:
+ * workers/Worker.cpp:
+ (WebCore::Worker::postMessage):
+ * workers/Worker.h:
+ * workers/Worker.idl:
+ * workers/WorkerContextProxy.h:
+ * workers/WorkerMessagingProxy.cpp:
+ (WebCore::MessageWorkerContextTask::create):
+ (WebCore::MessageWorkerContextTask::MessageWorkerContextTask):
+ (WebCore::MessageWorkerTask::create):
+ (WebCore::MessageWorkerTask::MessageWorkerTask):
+ (WebCore::WorkerMessagingProxy::postMessageToWorkerObject):
+ (WebCore::WorkerMessagingProxy::postMessageToWorkerContext):
+ * workers/WorkerMessagingProxy.h:
+ * workers/WorkerObjectProxy.h:
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Unreviewed build fix for Windows.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::load):
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move FrameLoader::canLoad to SecurityOrigin
+ https://bugs.webkit.org/show_bug.cgi?id=30111
+
+ * WebCore.base.exp:
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::isSafeToLoadURL):
+ * loader/Cache.cpp:
+ (WebCore::Cache::requestResource):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::loadSubframe):
+ (WebCore::FrameLoader::loadPlugin):
+ (WebCore::FrameLoader::loadFrameRequest):
+ (WebCore::FrameLoader::loadResourceSynchronously):
+ (WebCore::FrameLoader::createJavaAppletWidget):
+ * loader/FrameLoader.h:
+ * loader/SubresourceLoader.cpp:
+ (WebCore::SubresourceLoader::create):
+ * page/SecurityOrigin.cpp:
+ (WebCore::SecurityOrigin::canLoad):
+ (WebCore::SecurityOrigin::shouldHideReferrer):
+ * page/SecurityOrigin.h:
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move setLocalLoadPolicy and friends to SecurityOrigin
+ https://bugs.webkit.org/show_bug.cgi?id=30110
+
+ These have more to do with security policies than with loading frames.
+
+ * WebCore.base.exp:
+ * dom/Document.cpp:
+ (WebCore::Document::initSecurityContext):
+ * loader/Cache.cpp:
+ (WebCore::Cache::requestResource):
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/SubresourceLoader.cpp:
+ (WebCore::SubresourceLoader::create):
+ * page/SecurityOrigin.cpp:
+ (WebCore::SecurityOrigin::setLocalLoadPolicy):
+ (WebCore::SecurityOrigin::restrictAccessToLocal):
+ (WebCore::SecurityOrigin::allowSubstituteDataAccessToLocal):
+ * page/SecurityOrigin.h:
+ (WebCore::SecurityOrigin::):
+
+2009-10-06 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Brady Eidson.
+
+ Preparation for <http://webkit.org/b/30104>.
+ Inspector should show cookies of sub-resources on the page.
+
+ Implement getRawCookies for CFNetwork for Windows, so we can see more
+ than just a key/value pair for Cookies when we are on Windows.
+
+ * platform/network/win/CookieJarCFNetWin.cpp:
+ (WebCore::getRawCookies):
+
+2009-10-06 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30132, make beforeload work with <link> elements and
+ XML processing instructions.
+
+ Fix up ProcessingInstruction's setData call so that it actually updates a stylesheet when the
+ data gets changed.
+
+ Move dispatchBeforeLoadedEvent to ContainerNode so all Elements (and ProcessingInstruction) can
+ access it.
+
+ Added fast/dom/beforeload/link-before-load.html
+
+ * dom/ContainerNode.cpp:
+ (WebCore::ContainerNode::dispatchBeforeLoadEvent):
+ * dom/ContainerNode.h:
+ * dom/ProcessingInstruction.cpp:
+ (WebCore::ProcessingInstruction::checkStyleSheet):
+ (WebCore::ProcessingInstruction::setData):
+ * dom/ScriptElement.cpp:
+ (WebCore::ScriptElementData::requestScript):
+ * dom/ScriptElement.h:
+ * dom/XMLTokenizerLibxml2.cpp:
+ (WebCore::XMLTokenizer::endElementNs):
+ * html/HTMLLinkElement.cpp:
+ (WebCore::HTMLLinkElement::parseMappedAttribute):
+ (WebCore::HTMLLinkElement::process):
+ * html/HTMLScriptElement.cpp:
+ (WebCore::HTMLScriptElement::forAttributeValue):
+ * html/HTMLScriptElement.h:
+ * svg/SVGScriptElement.cpp:
+ * svg/SVGScriptElement.h:
+
+2009-10-06 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ accessibility/media-element.html crashes (and has incorrect result)
+ https://bugs.webkit.org/show_bug.cgi?id=30108
+
+ Fix up the accessibilty label for the newly added fullscreen button,
+ and update the test result accordingly.
+
+ * accessibility/AccessibilityMediaControls.cpp:
+ (WebCore::AccessibilityMediaControl::controlTypeName):
+
+2009-10-06 Kelly Norton <knorton@google.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30028>
+ Multiple calls to SetFrontendProxyObject can leave an InspectorTimelineAgent with an invalid
+ InspectorFrontend.
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::setFrontendProxyObject): Adds a check for an existing timeline agent.
+
+2009-10-06 Antti Koivisto <antti@apple.com>
+
+ Reviewed by Dave Kilzer.
+
+ Move textRects to the right category in DOM.mm. Include DOMPrivate.h to ensure that the interfaces match.
+
+ * bindings/objc/DOM.mm:
+ (-[DOMNode textRects]):
+
+2009-10-06 Benjamin C Meyer <bmeyer@rim.com>
+
+ Reviewed by Ariya Hidayat.
+
+ Match the behavior of other WebKit browser and have the first url of the drag data be the url passed in declareAndWriteDragImage and set the text of the drag data to be the title argument.
+
+ Manual test: Drag the readability js link from http://lab.arc90.com/experiments/readability/
+
+ * platform/qt/ClipboardQt.cpp:
+ (WebCore::ClipboardQt::declareAndWriteDragImage):
+
+2009-10-06 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Implement min/max attributes, ValidityState.rangeUnderflow and
+ ValidityState.rangeOverflow for <input type=number> and <input type=range>
+ https://bugs.webkit.org/show_bug.cgi?id=29069
+
+ HTMLInputElement::max and min are not defined for COM because they
+ conflict with the standard min() and max() macros.
+
+ Tests: fast/forms/ValidityState-rangeOverflow-number.html
+ fast/forms/ValidityState-rangeOverflow-range.html
+ fast/forms/ValidityState-rangeUnderflow-number.html
+ fast/forms/ValidityState-rangeUnderflow-range.html
+ fast/forms/input-minmax.html
+
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::rangeUnderflow):
+ (WebCore::HTMLInputElement::rangeOverflow):
+ (WebCore::HTMLInputElement::rangeMinimum):
+ (WebCore::HTMLInputElement::rangeMaximum):
+ * html/HTMLInputElement.h:
+ * html/HTMLInputElement.idl:
+ * html/ValidityState.cpp:
+ (WebCore::ValidityState::rangeUnderflow):
+ (WebCore::ValidityState::rangeOverflow):
+ * html/ValidityState.h:
+ * rendering/RenderSlider.cpp:
+ (WebCore::SliderRange::SliderRange):
+ (WebCore::SliderRange::valueFromElement):
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move m_openedByDOM to Page
+ https://bugs.webkit.org/show_bug.cgi?id=30109
+
+ We only need one instance of m_openedByDOM per page, we should move it
+ to a page-scoped object. Notice that it's only ever touched for the
+ main frame.
+
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::createWindow):
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::createWindow):
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::close):
+ * page/Page.cpp:
+ (WebCore::Page::Page):
+ (WebCore::Page::openedByDOM):
+ (WebCore::Page::setOpenedByDOM):
+ * page/Page.h:
+
+2009-10-06 Carol Szabo <carol.szabo@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ [Qt] Some functions in GraphicsContext do not work
+ as expected if the associated painter has no clipping.
+ https://bugs.webkit.org/show_bug.cgi?id=29691
+
+ No new tests are associated with this because DumpRenderTree
+ always sets clipping on the painter, thus it would never hit
+ the test case, but fast/box-shadow/basic-shadows.html is a
+ good example of what happens if the clipping is not set by
+ the user of QtWebKit.
+
+ * platform/graphics/qt/GraphicsContextQt.cpp:
+ (WebCore::GraphicsContext::clipOut):
+ (WebCore::GraphicsContext::clipOutEllipseInRect):
+ Fixed to handle the case that there is no clipping
+ before the call.
+
+2009-10-06 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30131, make beforeload fire on script elements.
+
+ Added tests in fast/dom/beforeload/.
+
+ * dom/ScriptElement.cpp:
+ (WebCore::ScriptElementData::requestScript):
+ * dom/ScriptElement.h:
+ * dom/XMLTokenizerLibxml2.cpp:
+ (WebCore::XMLTokenizer::endElementNs):
+ * html/HTMLAttributeNames.in:
+ * html/HTMLScriptElement.cpp:
+ (WebCore::HTMLScriptElement::parseMappedAttribute):
+ (WebCore::HTMLScriptElement::dispatchBeforeLoadEvent):
+ * html/HTMLScriptElement.h:
+ * html/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::scriptHandler):
+ * svg/SVGScriptElement.cpp:
+ (WebCore::SVGScriptElement::dispatchBeforeLoadEvent):
+ * svg/SVGScriptElement.h:
+
+2009-10-06 Xan Lopez <xlopez@igalia.com>
+
+ Reviewed by Eric Seidel.
+
+ https://bugs.webkit.org/show_bug.cgi?id=25526
+ [Gtk] Additional support is needed for caret browsing
+
+ Enable caret movement commands also when caret browsing setting is
+ enabled.
+
+ * editing/EditorCommand.cpp:
+ (WebCore::caretBrowsingEnabled):
+ (WebCore::enabledVisibleSelectionOrCaretBrowsing):
+ (WebCore::enabledInEditableTextOrCaretBrowsing):
+ (WebCore::CommandEntry::):
+ * manual-tests/gtk/caret-browsing.html: Added.
+
+2009-10-06 Anton Muhin <antonm@chromium>
+
+ Reviewed by Dimitri Glazkov.
+
+ Non standard, but popular exetension allows automagically
+ turn a function into a namespace resolver. Support that in
+ Chromium as well.
+
+ Adjust CodeGeneratorV8 to treat XPathNSResolver in a special way.
+ https://bugs.webkit.org/show_bug.cgi?id=30128
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+ * bindings/v8/V8DOMWrapper.h:
+ (WebCore::V8DOMWrapper::getXPathNSResolver):
+ * bindings/v8/custom/V8DocumentCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+
+2009-10-06 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: close inspector client view on
+ InspectorController::close API call.
+
+ In order to run batch web inspector layout tests (and not affect
+ subsequent tests) we should close inspector client's view upon
+ InspectorController::close API call.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30009
+
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::inspectedPageDestroyed):
+ (WebCore::InspectorController::close):
+
+2009-10-06 Simon Hausmann <simon.hausmann@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ Fix the Qt/Windows build by stubbing out the still image
+ support for halted plugins for the Qt build.
+
+ Bugzilla entry https://bugs.webkit.org/show_bug.cgi?id=30130
+ tracks removing this by implementing Frame::nodeImage().
+
+ * plugins/win/PluginViewWin.cpp:
+ (WebCore::PluginView::halt):
+
+2009-10-05 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Change QImageReader usage in ImageDecoderQt
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Replace the ReadContext with another appoach to
+ reading the image. Attempt to only read meta information
+ like the image size and number of frames (for animations)
+ first and then when the page is getting drawn decode
+ the image with the QImageReader.
+
+ This is a huge benefit on pages with many images and saves
+ ~2GB of memory on the szeged image test page.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::ImageDecoderQt):
+ (WebCore::ImageDecoderQt::setData):
+ (WebCore::ImageDecoderQt::isSizeAvailable):
+ (WebCore::ImageDecoderQt::frameCount):
+ (WebCore::ImageDecoderQt::repetitionCount):
+ (WebCore::ImageDecoderQt::filenameExtension):
+ (WebCore::ImageDecoderQt::frameBufferAtIndex):
+ (WebCore::ImageDecoderQt::clearFrameBufferCache):
+ (WebCore::ImageDecoderQt::internalDecodeSize):
+ (WebCore::ImageDecoderQt::internalReadImage):
+ (WebCore::ImageDecoderQt::internalHandleCurrentImage):
+ (WebCore::ImageDecoderQt::forceLoadEverything):
+ (WebCore::ImageDecoderQt::failRead):
+ * platform/graphics/qt/ImageDecoderQt.h:
+
+2009-10-05 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Make use of RGBA32Buffer in ImageDecoderQt
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Use the RGBA32Buffer instead of the internal ImageData
+ to be able to use support of the base class, optionally
+ support WebCore decoders for Qt and most importantly
+ separate metadata and image data for better cache control.
+
+ Remove ImageSourceQt as everything is now shared with
+ the normal ImageSource.
+
+ Change the ownership of the NativeImagePtr/QPixmap in
+ ImageQt.cpp to delete the m_frame to be subject to cache
+ control.
+
+ * WebCore.pro:
+ * platform/graphics/ImageSource.cpp:
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::ReadContext::ReadContext):
+ (WebCore::ImageDecoderQt::ReadContext::read):
+ (WebCore::ImageDecoderQt::ReadContext::readImageLines):
+ (WebCore::ImageDecoderQt::ImageDecoderQt):
+ (WebCore::ImageDecoderQt::setData):
+ (WebCore::ImageDecoderQt::frameCount):
+ (WebCore::ImageDecoderQt::frameBufferAtIndex):
+ (WebCore::ImageDecoderQt::clearFrameBufferCache):
+ * platform/graphics/qt/ImageDecoderQt.h:
+ * platform/graphics/qt/ImageSourceQt.cpp: Removed.
+ * platform/image-decoders/ImageDecoder.h:
+ (WebCore::RGBA32Buffer::decodedImage):
+ (WebCore::RGBA32Buffer::getAddr):
+ * platform/image-decoders/qt/RGBA32BufferQt.cpp: Added.
+ (WebCore::RGBA32Buffer::RGBA32Buffer):
+ (WebCore::RGBA32Buffer::setDecodedImage):
+ (WebCore::RGBA32Buffer::clear):
+ (WebCore::RGBA32Buffer::zeroFill):
+ (WebCore::RGBA32Buffer::copyBitmapData):
+ (WebCore::RGBA32Buffer::setSize):
+ (WebCore::RGBA32Buffer::asNewNativeImage):
+ (WebCore::RGBA32Buffer::hasAlpha):
+ (WebCore::RGBA32Buffer::setHasAlpha):
+ (WebCore::RGBA32Buffer::setStatus):
+ (WebCore::RGBA32Buffer::operator=):
+ (WebCore::RGBA32Buffer::width):
+ (WebCore::RGBA32Buffer::height):
+
+2009-10-05 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] ImageDecoderQt avoid QString creation.
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Avoid going from CString to QString to String
+ and go directly from CString to String. Also
+ avoid going to lower case to avoid an extra
+ memory allocation.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoder::create):
+ (WebCore::ImageDecoderQt::ImageDecoderQt):
+ * platform/graphics/qt/ImageDecoderQt.h:
+
+2009-10-05 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Cleanup the ImageDecoder of Qt.
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Remove the various enums for partial load. The fact is
+ that this image decoder will decode everything that is
+ in the file at once. Make it look like it behaves to
+ ease fixing this core problem.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::ImageData::ImageData):
+ (WebCore::ImageDecoderQt::ReadContext::ReadContext):
+ (WebCore::ImageDecoderQt::ReadContext::read):
+ (WebCore::ImageDecoderQt::ReadContext::readImageLines):
+ (WebCore::ImageDecoderQt::hasFirstImageHeader):
+ (WebCore::ImageDecoderQt::setData):
+ * platform/graphics/qt/ImageDecoderQt.h:
+
+2009-10-04 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Reimplement instead of overload frameCount in ImageDecoderQt.cpp
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Reimplement frameCount instead of overloading it.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::frameCount):
+ * platform/graphics/qt/ImageDecoderQt.h:
+
+2009-10-04 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] QImageReader does not support progressive reading
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Change the ImageDecoderQt::setData to store the encoded
+ data in ImageDecoder.
+
+ Only call ReadContext when the whole Resource has been
+ loaded to avoid needless calls to reset and the
+ ReadContext as progressive loading is not supported.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::setData):
+ * platform/graphics/qt/ImageDecoderQt.h:
+
+2009-10-04 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Remove dead code from ImageDecoderQt
+ https://bugs.webkit.org/show_bug.cgi?id=27538
+
+ Remove unused variables and debugging code. The debug
+ code has never been used and does not provide anything
+ useful.
+
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::ReadContext::read):
+ (WebCore::ImageDecoderQt::ReadContext::readImageLines):
+ (WebCore::ImageDecoderQt::setData):
+ (WebCore::ImageDecoderQt::isSizeAvailable):
+ (WebCore::ImageDecoderQt::frameCount):
+ (WebCore::ImageDecoderQt::repetitionCount):
+ (WebCore::ImageDecoderQt::filenameExtension):
+ (WebCore::ImageDecoderQt::imageAtIndex):
+
+2009-10-06 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] segfault when calling gst_video_format_parse_caps in the video sink
+ https://bugs.webkit.org/show_bug.cgi?id=30120
+
+ Fix use of gst_video_format_parse_caps()
+
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_idle_func):
+
+2009-10-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Update mediaControls CSS
+
+ * css/mediaControlsQt.css:
+
+2009-10-06 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Get rid of Preferences.ignoreWhitespace.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30092
+
+ * inspector/front-end/DOMAgent.js:
+ (WebInspector.DOMAgent):
+ (WebInspector.DOMAgent.prototype._childNodeCountUpdated):
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeOutline.prototype.update):
+ (WebInspector.ElementsTreeElement):
+ (WebInspector.ElementsTreeElement.prototype.onpopulate):
+ (WebInspector.ElementsTreeElement.prototype._updateChildren.updateChildrenOfNode):
+ (WebInspector.ElementsTreeElement.prototype._updateChildren):
+ * inspector/front-end/TextPrompt.js:
+ (WebInspector.TextPrompt.prototype.isCaretAtEndOfPrompt):
+ * inspector/front-end/inspector.js:
+ * inspector/front-end/utilities.js:
+ (Node.prototype.rangeOfWord):
+ (traverseNextNode):
+ (traversePreviousNode):
+ (onlyTextChild):
+
+2009-10-06 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Do not call nodeTitleInfo twice +
+ followup fixes for r49101.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30087
+
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeElement):
+
+2009-10-06 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless plugins: Enable painting on printer.
+
+ The print preview dialog crashed because the depth of the drawable
+ changed owing to a bug in Qt - if you draw onto a 32-bit pixmap,
+ and set a 24-bit pixmap as source, it will convert the source to
+ 32-bit.
+
+ 1210fa5b2d65895ad2be1f9ca7cae586e3b29dc1 is the bug fix in Qt.
+
+ https://bugs.webkit.org/show_bug.cgi?id=20081
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::paint):
+
+2009-10-06 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless plugins: Make painting and events work when page is zoomed.
+
+ The element gets resized when zoomed. So, we have to make sure that we resize
+ the drawable and do a setwindow call. Multiple calls to setwindow do not
+ crash plugin in windowless mode (unlike in windowed mode).
+
+ For mouse events we have to convert the pos to post-zoom position.
+
+ https://bugs.webkit.org/show_bug.cgi?id=20081
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::setXButtonEventSpecificFields):
+ (WebCore::setXMotionEventSpecificFields):
+ (WebCore::setXCrossingEventSpecificFields):
+ (WebCore::PluginView::handleMouseEvent):
+ (WebCore::PluginView::setNPWindowIfNeeded):
+
+2009-10-06 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless plugins: Add PluginQuirkRequiresDefaultScreenDepth quirk for Flash.
+
+ Flash does not use the visual provided by us to draw into the drawable.
+ It instead uses the system default visual (as returned by XDefaultVisual).
+ This means that if the screen default visual is 24-bit, Flash won't be
+ able to draw on 32-bit drawable created by us. This is a bug in Flash
+ and for the moment, the above quirk is only set for Flash.
+
+ Our strategy to create the drawable:
+ 1. Create a 32-bit drawable if the default screen depth is 32 or the
+ quirk is not set (i.e not flash)
+ 2. If we didn't create a 32-bit drawable (maybe the Display has no such
+ visual), we create a drawable with default screen depth.
+
+ As a result of the above changes, content propagation behavior changes as:
+ 1. Content propagation is possible only if the drawable we create and
+ Qt's backing store are of the same depth.
+ 2. If we created a 32-bit drawable, there is no need for content
+ propagation (Qt will take care of it).
+
+ https://bugs.webkit.org/show_bug.cgi?id=20081
+
+ * plugins/PluginPackage.cpp:
+ (WebCore::PluginPackage::determineQuirks):
+ * plugins/PluginQuirkSet.h:
+ (WebCore::):
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::PluginView):
+ * plugins/PluginView.h:
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::updatePluginWidget):
+ (WebCore::PluginView::paint):
+ (WebCore::getVisualAndColormap):
+ (WebCore::PluginView::platformStart):
+ (WebCore::PluginView::platformDestroy):
+
+2009-10-06 Fumitoshi Ukai <ukai@chromium.org>
+
+ Reviewed by Ariya Hidayat.
+
+ Qt build fix.
+ https://bugs.webkit.org/show_bug.cgi?id=29362.
+
+ In Qt 4.5, a new function QPainter::fillRect(QRect, QColor) is
+ introduced to avoid the expensive construction of QBrush.
+ By casting WebCore::Color to QColor, we can compile on Qt 4.4
+ and use optimization for solid color fill in Qt 4.5.
+
+ * platform/graphics/qt/GraphicsContextQt.cpp:
+ (WebCore::GraphicsContext::drawRect):
+ (WebCore::GraphicsContext::drawLine):
+ (WebCore::drawBorderlessRectShadow):
+
+2009-10-05 Andrei Popescu <andreip@google.com>
+
+ Reviewed by Eric Carlson.
+
+ Allow the platform media player to know the <video> poster URL.
+ Add MediaPlayerPrivate::prepareToPlay() to support media engines
+ that do not buffer video data automatically. This method allows
+ such media engines to start the buffering just before starting
+ playback.
+ https://bugs.webkit.org/show_bug.cgi?id=29133
+
+ All platforms that currently implement <video> return false
+ in MediaPlayerPrivate::canLoadPoster() and do nothing in
+ MediaPlayerPrivate::prepareToPlay() their behavior is
+ unchanged. The current set of media test should then be
+ sufficient to guarantee that this patch does not break anything.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::loadResource):
+ After the MediaPlayer is created, inform it what the poster URL is.
+ (WebCore::HTMLMediaElement::updatePlayState):
+ Add another case where prepareToPlay is called for the platforms
+ that do not buffer video content automatically.
+ (WebCore::HTMLMediaElement::couldPlayIfEnoughData)
+ Same as potentiallyPlaying, except that we don't check for
+ the readyState being at least HAVE_FUTURE_DATA.
+ * platform/graphics/MediaPlayer.cpp:
+ (WebCore::NullMediaPlayerPrivate::canLoadPoster):
+ Empty implementation for the NullMediaPlayerPrivate.
+ (WebCore::NullMediaPlayerPrivate::setPoster):
+ Empty implementation for the NullMediaPlayerPrivate.
+ (WebCore::MediaPlayer::canLoadPoster):
+ Proxy to the m_private.
+ (WebCore::MediaPlayer::setPoster):
+ Proxy to m_private.
+ * platform/graphics/MediaPlayer.h:
+ * platform/graphics/MediaPlayerPrivate.h:
+ (WebCore::MediaPlayerPrivateInterface::canLoadPoster):
+ (WebCore::MediaPlayerPrivateInterface::setPoster):
+ Add new methods that allow the platform player to receive the poster URL.
+ (WebCore::MediaPlayerPrivateInterface::prepareToPlay):
+ Notifies the media engine that playback should start. The media engine
+ should start preparing (e.g. by initializing the player and starting to buffer)
+ and call back when the state is changed to HAVE_FUTURE_DATA.
+
+2009-10-06 David Levin <levin@chromium.org>
+
+ Reviewed by Oliver Hunt.
+
+ StringImpl needs a method to get an instance for another thread which doesn't copy the underlying buffer.
+ https://bugs.webkit.org/show_bug.cgi?id=30095
+
+ All String::copy methods were changed to call either threadsafeCopy or crossThreadString. The method
+ call was made threadsafeCopy unless I could show that threadsafety wasn't needed.
+
+ No visible change in functionality so no new tests.
+
+ * dom/MessagePortChannel.cpp:
+ (WebCore::MessagePortChannel::EventData::EventData):
+ * loader/WorkerThreadableLoader.cpp:
+ (WebCore::WorkerThreadableLoader::MainThreadBridge::MainThreadBridge):
+ * loader/icon/IconDatabase.cpp:
+ (WebCore::IconDatabase::open):
+ (WebCore::IconDatabase::iconForPageURL):
+ (WebCore::IconDatabase::iconURLForPageURL):
+ (WebCore::IconDatabase::retainIconForPageURL):
+ (WebCore::IconDatabase::releaseIconForPageURL):
+ (WebCore::IconDatabase::setIconDataForIconURL):
+ (WebCore::IconDatabase::setIconURLForPageURL):
+ (WebCore::IconDatabase::databasePath):
+ (WebCore::IconDatabase::defaultDatabaseFilename):
+ * page/SecurityOrigin.cpp:
+ (WebCore::SecurityOrigin::SecurityOrigin): Since this is used by SecurityOrigin::threadsafeCopy,
+ it makes threadsafe calls.
+ (WebCore::SecurityOrigin::threadsafeCopy): The only place that called this
+ needed a threadsafe method.
+ * page/SecurityOrigin.h:
+ * platform/CrossThreadCopier.cpp:
+ (WebCore::::copy):
+ * platform/KURL.cpp:
+ (WebCore::KURL::copy):
+ * platform/network/HTTPHeaderMap.cpp:
+ (WebCore::HTTPHeaderMap::copyData):
+ * platform/network/ResourceErrorBase.cpp:
+ (WebCore::ResourceErrorBase::copy):
+ * platform/network/ResourceRequestBase.cpp:
+ (WebCore::ResourceRequestBase::copyData):
+ * platform/network/ResourceResponseBase.cpp:
+ (WebCore::ResourceResponseBase::copyData):
+ * platform/sql/SQLValue.cpp:
+ (WebCore::SQLValue::SQLValue):
+ (WebCore::SQLValue::string):
+ * platform/sql/SQLValue.h:
+ (WebCore::SQLValue::SQLValue):
+ All constructors now initialize the m_number which is a double. Failure to
+ do so can result in unexpected crashes when it is copied in the copy constructor.
+ See http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx, I was that colleague.
+ * platform/text/PlatformString.h:
+ * platform/text/String.cpp:
+ (WebCore::String::threadsafeCopy):
+ (WebCore::String::crossThreadString):
+ * platform/text/StringImpl.cpp:
+ Removed StringImpl::substringCopy which was no longer being used anywhere.
+ (WebCore::StringImpl::threadsafeCopy): Changed the name to indicate that
+ it is threadsafe.
+ (WebCore::StringImpl::crossThreadString): The way to get strings for
+ another thread which is not threadsafe. This shares the underlying buffer
+ with both strings and gives them a way to do threadsafe refcounting for it.
+ * platform/text/StringImpl.h:
+ * storage/ChangeVersionWrapper.cpp:
+ (WebCore::ChangeVersionWrapper::ChangeVersionWrapper):
+ * storage/Database.cpp:
+ (WebCore::updateGuidVersionMap):
+ (WebCore::Database::Database):
+ (WebCore::Database::getVersionFromDatabase):
+ (WebCore::Database::setVersionInDatabase):
+ (WebCore::Database::version):
+ (WebCore::Database::setExpectedVersion):
+ (WebCore::Database::securityOriginCopy):
+ (WebCore::Database::stringIdentifier):
+ * storage/DatabaseTracker.cpp:
+ (WebCore::DatabaseTracker::scheduleNotifyDatabaseChanged):
+ * storage/OriginQuotaManager.cpp:
+ (WebCore::OriginQuotaManager::addDatabase):
+ * storage/SQLError.h:
+ (WebCore::SQLError::message):
+ (WebCore::SQLError::SQLError):
+ * storage/SQLStatement.cpp:
+ (WebCore::SQLStatement::SQLStatement):
+ * storage/StorageAreaSync.cpp:
+ (WebCore::StorageAreaSync::syncTimerFired):
+ * storage/StorageMap.cpp:
+ (WebCore::StorageMap::importItem):
+ * storage/StorageNamespaceImpl.cpp:
+ (WebCore::StorageNamespaceImpl::StorageNamespaceImpl):
+ * storage/StorageSyncManager.cpp:
+ (WebCore::StorageSyncManager::StorageSyncManager):
+ * workers/DefaultSharedWorkerRepository.cpp:
+ (WebCore::SharedWorkerProxy::url): Do the copy of the url in a way that is threadsafe.
+ (WebCore::SharedWorkerProxy::name):
+ (WebCore::SharedWorkerProxy::SharedWorkerProxy):
+ (WebCore::DefaultSharedWorkerRepository::getProxy): Do the copy of the url in a way that is threadsafe.
+ * workers/SharedWorkerThread.cpp:
+ (WebCore::SharedWorkerThread::SharedWorkerThread):
+ * workers/WorkerMessagingProxy.cpp:
+ (WebCore::MessageWorkerContextTask::MessageWorkerContextTask):
+ (WebCore::MessageWorkerTask::MessageWorkerTask):
+ (WebCore::WorkerExceptionTask::WorkerExceptionTask):
+ * workers/WorkerRunLoop.cpp:
+ (WebCore::WorkerRunLoop::Task::Task):
+ (WebCore::WorkerRunLoop::postTaskForMode):
+ * workers/WorkerThread.cpp:
+ (WebCore::WorkerThreadStartupData::WorkerThreadStartupData):
+
+2009-10-06 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Windowless plugins: Use X Pixmap instead of QPixmap.
+
+ This has the following advantages:
+ 1. Allows more sharing of code between gtk and Qt ports in the future
+ 2. QPixmap creates 24-bit by default. We have to later 'upgrade' it to 32-bit.
+ 3. QPixmap may sometime change depth behind our back! This will require us to
+ update the plugin about the new visual and colormap.
+ 4. We cannot ensure that QPixmap is backed by a X Drawable. For example, with
+ -graphicssystem raster, QPixmap uses the raster (image) backend.
+
+ https://bugs.webkit.org/show_bug.cgi?id=20081
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::PluginView):
+ * plugins/PluginView.h:
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::updatePluginWidget):
+ (WebCore::PluginView::paint):
+ (WebCore::PluginView::platformDestroy):
+
+2009-10-06 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Add support for windowless NPAPI plugins
+
+ https://bugs.webkit.org/show_bug.cgi?id=20081
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::setFrameRect):
+ (WebCore::PluginView::handleEvent):
+ (WebCore::PluginView::PluginView):
+ * plugins/PluginView.h:
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::updatePluginWidget):
+ (WebCore::PluginView::paint):
+ (WebCore::PluginView::dispatchNPEvent):
+ (WebCore::setSharedXEventFields):
+ (WebCore::PluginView::initXEvent):
+ (WebCore::setXKeyEventSpecificFields):
+ (WebCore::PluginView::handleKeyboardEvent):
+ (WebCore::inputEventState):
+ (WebCore::setXButtonEventSpecificFields):
+ (WebCore::setXMotionEventSpecificFields):
+ (WebCore::setXCrossingEventSpecificFields):
+ (WebCore::PluginView::handleMouseEvent):
+ (WebCore::PluginView::handleFocusInEvent):
+ (WebCore::PluginView::handleFocusOutEvent):
+ (WebCore::PluginView::setNPWindowRect):
+ (WebCore::PluginView::setNPWindowIfNeeded):
+ (WebCore::PluginView::getValueStatic):
+ (WebCore::PluginView::invalidateRect):
+ (WebCore::PluginView::invalidateRegion):
+ (WebCore::PluginView::forceRedraw):
+ (WebCore::getPluginDisplay):
+ (WebCore::PluginView::platformStart):
+
+2009-10-05 Dirk Schulze <krit@webkit.org>
+
+ Reviewed by Nikolas Zimmermann.
+
+ SVG Filters do not support source images besides "sourceGraphic"
+ [https://bugs.webkit.org/show_bug.cgi?id=6022]
+
+ Add support for SourceAlpha to SVG filters.
+
+ Test: svg/filters/sourceAlpha.svg
+
+ * platform/graphics/filters/SourceAlpha.cpp:
+ (WebCore::SourceAlpha::calculateEffectRect):
+ (WebCore::SourceAlpha::apply):
+ * platform/graphics/filters/SourceAlpha.h:
+
+2009-10-05 John Abd-El-Malek <jam@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ Fix reliablity bot crash in DateExtension.
+ https://bugs.webkit.org/show_bug.cgi?id=30033
+
+ There were a few problems using the weak persistent pointers because no one else had a
+ handle to them. The new approach stores them as a hidden value on the Date constructor.
+
+ * bindings/v8/DateExtension.cpp:
+ (WebCore::DateExtension::setAllowSleep):
+ (WebCore::DateExtension::GetNativeFunction):
+ (WebCore::DateExtension::Setup):
+ (WebCore::DateExtension::OnSleepDetected):
+ * bindings/v8/DateExtension.h:
+ * bindings/v8/V8HiddenPropertyName.cpp:
+ (WebCore::V8HiddenPropertyName::sleepFunction):
+ * bindings/v8/V8HiddenPropertyName.h:
+
+2009-10-05 Stephanie Lewis <slewis@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Crash when trying to load a null stylesheet for a site specific hack.
+ https://bugs.webkit.org/show_bug.cgi?id=30105
+
+ Created a testcase and tested in browser. DRT doesn't test
+ site specific hacks.
+
+ * html/HTMLLinkElement.cpp:
+ (WebCore::HTMLLinkElement::setCSSStyleSheet):
+
+2009-10-05 James Robinson <jamesr@google.com>
+
+ Reviewed by Darin Adler.
+
+ Fix forward declaration (struct vs class mismatch)
+
+ https://bugs.webkit.org/show_bug.cgi?id=30094
+
+ * loader/RedirectScheduler.h:
+
+2009-10-05 Julie Parent <jparent@chromium.org>
+
+ Unreviewed, last Chromium build fix corresponding to revision 49113.
+ Add include for BeforeLoadEvent to DOMObjectsInclude.h.
+
+ * bindings/v8/DOMObjectsInclude.h:
+
+2009-10-05 Simon Fraser <simon.fraser@apple.com>
+
+ Fix Windows build.
+
+ * html/HTMLMediaElement.cpp:
+
+2009-10-05 Simon Fraser <simon.fraser@apple.com>
+
+ Fix the build: MediaControllerThemeQT was renamed to MediaControllerThemeQuickTime.
+
+ * rendering/RenderThemeMac.mm:
+ (WebCore::RenderThemeMac::shouldRenderMediaControlPart):
+
+2009-10-05 Pierre d'Herbemont <pdherbemont@webkit.org>
+
+ Reviewed by Simon Fraser
+
+ Support fullscreen in MediaPlayer (Mac)
+ https://bugs.webkit.org/show_bug.cgi?id=26742
+
+ Add a fullscreen button to the <video> controller if the media engine,
+ and the theme have support for fullscreen, and can show appropriate controls.
+ Clicking the button calls through the ChromeClient to the WebVideoFullscreenController
+ in WebKit to do a nice animation to fullscreen, with a custom controller.
+
+ * DerivedSources.make:
+ * WebCore.Video.exp: Added.
+ New export file for when VIDEO is enabled.
+
+ * WebCore.base.exp: Export WebCore::HTMLNames::videoTag
+ * WebCore.xcodeproj/project.pbxproj: New files
+
+ * html/HTMLMediaElement.h:
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::HTMLMediaElement):
+ (WebCore::HTMLMediaElement::willRemove):
+ (WebCore::HTMLMediaElement::screenRect):
+ (WebCore::HTMLMediaElement::enterFullscreen):
+ (WebCore::HTMLMediaElement::exitFullscreen):
+ (WebCore::HTMLMediaElement::platformMedia):
+ Add fullscreen logic. platformMedia returns a pointer to platform-specific playback data
+ used for fullscreen.
+
+ * html/HTMLVideoElement.h:
+ * html/HTMLVideoElement.cpp:
+ (WebCore::HTMLVideoElement::supportsFullscreen): Check with both the player and the ChromeClient
+ to see if it's possile to enter fullscreen for this element.
+
+ * page/ChromeClient.h:
+ (WebCore::ChromeClient::supportsFullscreenForNode):
+ (WebCore::ChromeClient::enterFullscreenForNode):
+ (WebCore::ChromeClient::exitFullscreenForNode):
+ New methods
+
+ * platform/graphics/MediaPlayer.h:
+ * platform/graphics/MediaPlayer.cpp:
+ (WebCore::NullMediaPlayerPrivate::platformMedia):
+ (WebCore::MediaPlayer::platformMedia):
+ * platform/graphics/MediaPlayerPrivate.h:
+ (WebCore::MediaPlayerPrivateInterface::platformMedia):
+ * platform/graphics/mac/MediaPlayerPrivateQTKit.h:
+ * platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
+ (WebCore::MediaPlayerPrivate::platformMedia):
+ (WebCore::MediaPlayerPrivate::supportsFullscreen):
+ New methods to return platform-specific playback data for fullscreen.
+
+ * rendering/MediaControlElements.cpp:
+ (WebCore::MediaControlFullscreenButtonElement::defaultEventHandler):
+ Hook up the fullscreen button.
+ * rendering/RenderThemeMac.h:
+ * rendering/RenderThemeMac.mm:
+ (WebCore::RenderThemeMac::shouldRenderMediaControlPart):
+ Allow the RenderThemeMac to make a decision about the availability of fullscreen based
+ on the QuickTime version, since this affects what controls are availabl.e
+
+2009-10-05 Kevin Decker <kdecker@apple.com>
+
+ Export a few more methods from Settings.h
+
+ Rubberstamped by Jon Honeycutt.
+
+ * WebCore.base.exp:
+
+2009-10-05 Dmitry Titov <dimich@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ 1-char fix for obviously reverse condition.
+ https://bugs.webkit.org/show_bug.cgi?id=30100
+ No test since the only difference is a timing of GC.
+
+ * bindings/js/ScriptCachedFrameData.cpp:
+ (WebCore::ScriptCachedFrameData::clear): Revert condition. Almost a typo.
+
+2009-09-30 Kenneth Russell <kbr@google.com>
+
+ Reviewed by Darin Fisher.
+
+ Update platform-specific #ifdefs in GraphicsContext3D.h for the
+ Chromium port.
+ https://bugs.webkit.org/show_bug.cgi?id=29936
+
+ * platform/graphics/GraphicsContext3D.h:
+ Changed #if PLATFORM(SKIA) to #if PLATFORM(CHROMIUM).
+
+2009-10-05 Dan Bernstein <mitz@apple.com>
+
+ Reviewed by Darin Adler.
+
+ REGRESSION (r47440): Inserting text in the middle of content in a scrolled textfield results in painting bugs
+ <rdar://problem/7269108>
+ https://bugs.webkit.org/show_bug.cgi?id=29982
+
+ Test: fast/repaint/line-in-scrolled-clipped-block.html
+
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::layoutBlock): Use the unclipped overflow rect
+ (including layout overflow) for the repaint rect calculation.
+
+2009-10-05 Drew Wilson <atwilson@google.com>
+
+ Reviewed by David Levin.
+
+ Chromium wants to turn off SharedWorkers at runtime
+ https://bugs.webkit.org/show_bug.cgi?id=29757
+
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::JSDOMWindow::sharedWorker):
+ Now returns jsUndefined if isAvailable() returns false, to allow SharedWorkers to be disabled at runtime.
+ * workers/DefaultSharedWorkerRepository.cpp:
+ (WebCore::SharedWorkerRepository::isAvailable):
+ Made SharedWorkers available by default.
+ * workers/SharedWorkerRepository.h:
+ Added definition for SharedWorkerRepository::isAvailable().
+
+2009-10-05 Hironori Bono <hbono@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ A super quick fix for Bug 28710.
+
+ https://bugs.webkit.org/show_bug.cgi?id=28710
+
+ This change just resets the style sent to addStyleMarkup() to avoid an assertion error
+ and creates an empty style when computedStyleAtPosition is 0 to avoid a crash.
+ (This change is nothing but a better-than-crash change.)
+
+ Tests: editing/selection/select-crash-001.html
+ editing/selection/select-crash-002.html
+
+ * editing/ApplyStyleCommand.cpp:
+ (WebCore::editingStyleAtPosition): Resets the style sent to addStyleMarkup() if it is not valid.
+ * editing/markup.cpp:
+ (WebCore::createMarkup): Creates an empty style if computedStyleAtPosition is 0.
+
+2009-10-05 Sam Weinig <sam@webkit.org>
+
+ Reviewed by Mark Rowe.
+
+ Silence duplicate errors logged for missing getComputedStyle
+ implementations. Improves the error message as well.
+
+ * css/CSSComputedStyleDeclaration.cpp:
+ (WebCore::logUnimplementedPropertyID):
+ (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
+
+2009-10-05 Julie Parent <jparent@chromium.org>
+
+ Unreviewed, Chromium build fix #3. Add V8BeforeLoadEvent.[cc|h] to derived sources.
+
+ * bindings/v8/DerivedSourcesAllInOne.cpp:
+ * bindings/v8/V8Index.cpp:
+
+2009-10-05 Mark Rowe <mrowe@apple.com>
+
+ Try and fix the GTK build.
+
+ * GNUmakefile.am:
+
+2009-10-05 Julie Parent <jparent@chromium.org>
+
+ Unreviewed, Chromium build fix #2. Add new BEFORELOADEVENT to V8ClassIndex.
+
+ * bindings/v8/V8Index.h:
+
+2009-10-05 Julie Parent <jparent@chromium.org>
+
+ Unreviewed, Chromium build fix. Missing "," after entry for BeforeLoadEvent.idl.
+
+ * WebCore.gypi:
+
+2009-10-05 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Add a beforeload event that will be fired before subresources load. (It isn't fired yet.) The event
+ has one field, the URL that is going to be requested. Setting preventDefault will stop the load
+ from occurring.
+
+ * DerivedSources.cpp:
+ * DerivedSources.make:
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * dom/BeforeLoadEvent.h: Added.
+ (WebCore::BeforeLoadEvent::create):
+ (WebCore::BeforeLoadEvent::initBeforeLoadEvent):
+ (WebCore::BeforeLoadEvent::url):
+ (WebCore::BeforeLoadEvent::BeforeLoadEvent):
+ * dom/BeforeLoadEvent.idl: Added.
+ * dom/EventNames.h:
+ * page/DOMWindow.idl:
+
+2009-10-05 Priit Laes <plaes@plaes.org>
+
+ Reviewed by Gustavo Noronha.
+
+ Add Gentoo-specific paths for searching browser plugins.
+ https://bugs.webkit.org/show_bug.cgi?id=30088
+
+ * plugins/PluginDatabase.cpp:
+ (WebCore::PluginDatabase::defaultPluginDirectories):
+
+2009-10-02 Chris Marrin <cmarrin@apple.com>
+
+ Reviewed by Adele Peterson.
+
+ Add functionality to pause/throttle CSS transitions/animations in a WebView
+ https://bugs.webkit.org/show_bug.cgi?id=29942
+
+ Exporting call from AnimationController
+
+ * WebCore.base.exp:
+
+2009-10-05 Kevin Decker <kdecker@apple.com>
+
+ Rubberstamped by Anders Carlsson.
+
+ * WebCore.base.exp: Update export of HaltablePlugin/PluginHalterClient.
+ * WebCore.xcodeproj/project.pbxproj: Likewise.
+
+2009-10-05 Eric Seidel <eric@webkit.org>
+
+ No review, rolling out r49104.
+ http://trac.webkit.org/changeset/49104
+
+ * html/HTMLInputElement.cpp:
+ * html/HTMLInputElement.h:
+ * html/HTMLInputElement.idl:
+ * html/ValidityState.cpp:
+ * html/ValidityState.h:
+ (WebCore::ValidityState::rangeUnderflow):
+ (WebCore::ValidityState::rangeOverflow):
+ * rendering/RenderSlider.cpp:
+ (WebCore::SliderRange::SliderRange):
+ (WebCore::SliderRange::valueFromElement):
+
+2009-10-05 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Update style immediately when validation-related values are updated.
+ https://bugs.webkit.org/show_bug.cgi?id=28868
+
+ In order to apply :valid, :invalid, :optional or :required lively,
+ - call setNeedsStyleRecalc() when properties which can change
+ willValidate state are updated, and
+ (Parent form element, name, disabled, readonly)
+ - call updateValidity() when properties which can change validity
+ state are updated. (value, pattern, required)
+
+ Tests: fast/forms/input-live-pseudo-selectors.html
+ fast/forms/textarea-live-pseudo-selectors.html
+
+ * html/HTMLFormControlElement.cpp:
+ (WebCore::HTMLFormControlElement::HTMLFormControlElement):
+ (WebCore::HTMLFormControlElement::parseMappedAttribute):
+ (WebCore::HTMLFormControlElement::required):
+ (WebCore::HTMLFormControlElement::updateValidity):
+ * html/HTMLFormControlElement.h:
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::setInputType):
+ (WebCore::HTMLInputElement::parseMappedAttribute):
+ (WebCore::HTMLInputElement::setValue):
+ (WebCore::HTMLInputElement::setValueFromRenderer):
+ (WebCore::HTMLInputElement::setFileListFromRenderer):
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::setValue):
+ * rendering/RenderTextControlMultiLine.cpp:
+ (WebCore::RenderTextControlMultiLine::subtreeHasChanged):
+
+2009-10-05 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Implement min/max attributes, ValidityState.rangeUnderflow and
+ ValidityState.rangeOverflow for <input type=number> and <input type=range>
+ https://bugs.webkit.org/show_bug.cgi?id=29069
+
+ Tests: fast/forms/ValidityState-rangeOverflow-number.html
+ fast/forms/ValidityState-rangeOverflow-range.html
+ fast/forms/ValidityState-rangeUnderflow-number.html
+ fast/forms/ValidityState-rangeUnderflow-range.html
+ fast/forms/input-minmax.html
+
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::rangeUnderflow):
+ (WebCore::HTMLInputElement::rangeOverflow):
+ (WebCore::HTMLInputElement::rangeMinimum):
+ (WebCore::HTMLInputElement::rangeMaximum):
+ * html/HTMLInputElement.h:
+ * html/HTMLInputElement.idl:
+ * html/ValidityState.cpp:
+ (WebCore::ValidityState::rangeUnderflow):
+ (WebCore::ValidityState::rangeOverflow):
+ * html/ValidityState.h:
+ * rendering/RenderSlider.cpp:
+ (WebCore::SliderRange::SliderRange):
+ (WebCore::SliderRange::valueFromElement):
+
+2009-10-05 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Introduces
+ - new CSS pseudo selector: "-webkit-input-list-button"
+ - new CSS apperance type: "list-button"
+ - new ControlPart value: "ListButtonPart"
+ for the UI of the list attribute of the input element, and adds
+ implementation to draw ListButtonPart on Mac.
+ The code is guarded by ENABLE(DATALIST).
+
+ https://bugs.webkit.org/show_bug.cgi?id=27794
+
+ Test: platform/mac/fast/forms/input-list-button-size.html
+
+ * css/CSSPrimitiveValueMappings.h:
+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
+ * css/CSSSelector.cpp:
+ (WebCore::CSSSelector::extractPseudoType):
+ * css/CSSSelector.h:
+ (WebCore::CSSSelector::):
+ * css/CSSStyleSelector.cpp:
+ (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector):
+ * css/CSSValueKeywords.in:
+ * css/html.css:
+ * html/HTMLInputElement.cpp:
+ * platform/ThemeTypes.h:
+ (WebCore::):
+ * platform/mac/ThemeMac.mm:
+ (WebCore::listButtonSizes):
+ (WebCore::button):
+ (WebCore::paintButton):
+ (WebCore::ThemeMac::controlSize):
+ (WebCore::ThemeMac::minimumControlSize):
+ (WebCore::ThemeMac::controlBorder):
+ (WebCore::ThemeMac::paint):
+ * rendering/RenderTheme.cpp:
+ (WebCore::RenderTheme::adjustStyle):
+ (WebCore::RenderTheme::paint):
+ (WebCore::RenderTheme::paintBorderOnly):
+ (WebCore::RenderTheme::paintDecorations):
+ * rendering/RenderThemeMac.mm:
+ (WebCore::RenderThemeMac::adjustRepaintRect):
+ * rendering/style/RenderStyleConstants.h:
+ (WebCore::):
+
+2009-10-05 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30065>
+ nodeTitleInfo should be placed in ElementsTreeOutline.
+
+ Move nodeTitleInfo into ElementsTreeOutline.js from utilities.js.
+
+ * inspector/front-end/ElementsTreeOutline.js:
+ (WebInspector.ElementsTreeElement):
+ (WebInspector.ElementsTreeElement.prototype._updateTitle):
+ (WebInspector.ElementsTreeElement.prototype._nodeTitleInfo):
+ * inspector/front-end/utilities.js:
+
+2009-10-02 Yael Aharon <yael.aharon@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Inform the application when a new request is created
+ https://bugs.webkit.org/show_bug.cgi?id=29975
+
+ Emit a signal each time a request is created, with the request and the frame
+ that created it.
+
+ * platform/network/qt/QNetworkReplyHandler.cpp:
+ (WebCore::QNetworkReplyHandler::sendResponseIfNeeded):
+ (WebCore::QNetworkReplyHandler::start):
+
+2009-10-05 Ben Murdoch <benm@google.com>
+
+ Reviewed by Darin Adler.
+
+ Add an ASSERT in updateGuidVersionMap.
+ https://bugs.webkit.org/show_bug.cgi?id=30077
+
+ * storage/Database.cpp:
+ (WebCore::updateGuidVersionMap): ASSERT that the guidMutex() is locked.
+
+2009-10-05 Nate Chapin <japhet@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ Allow V8 to throw an exception in _NPN_SetException without worrying about context
+ if we don't have enough information to find the correct context.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30026
+
+ Part of the fix for Chromium's failure of LayouTests/plugins/netscape-throw-exception.html.
+
+ * bindings/v8/NPV8Object.cpp:
+ (_NPN_SetException): Don't suppress the exception if we can't find the relevant context.
+
+2009-10-05 Mikhail Naganov <mnaganov@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Place "Close" button in docked mode on the same side as the window "Close" button in detached mode.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29961
+
+ * inspector/front-end/inspector.css:
+ * inspector/front-end/inspector.html:
+ * inspector/front-end/inspector.js:
+ (WebInspector.loaded):
+
+2009-10-05 J-P Nurmi <jpnurmi@gmail.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Added pure virtual QWebPageClient::pluginParent()
+
+ https://bugs.webkit.org/show_bug.cgi?id=29710
+
+ * platform/qt/QWebPageClient.h:
+
+2009-10-05 Jakub Wieczorek <faw217@gmail.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] windowsKeyCodeForKeyEvent() returns a wrong value for the F10 key.
+ https://bugs.webkit.org/show_bug.cgi?id=30042
+
+ * platform/qt/PlatformKeyboardEventQt.cpp:
+ (WebCore::windowsKeyCodeForKeyEvent):
+
+2009-10-05 Fumitoshi Ukai <ukai@chromium.org>
+
+ Unreviewed build fix for ENABLE(WEB_SOCKETS) and v8.
+
+ V8ObjectEventListener.h has been removed at r48978
+
+ * bindings/v8/custom/V8WebSocketCustom.cpp:
+
+2009-10-04 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector console stops working while JS in IFRAME is paused.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29958
+
+ * inspector/front-end/InjectedScript.js:
+ (InjectedScript._evaluateOn):
+ (InjectedScript.addInspectedNode):
+ (InjectedScript._ensureCommandLineAPIInstalled):
+
+2009-10-04 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Introduce inspected object groups for console
+ and watch evaluation results so that they could be released
+ explicitly.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29891
+
+ * bindings/js/JSInspectorBackendCustom.cpp:
+ (WebCore::JSInspectorBackend::wrapObject):
+ * bindings/v8/custom/V8InspectorBackendCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::wrapObject):
+ (WebCore::InspectorBackend::releaseWrapperObjectGroup):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::clearConsoleMessages):
+ (WebCore::InspectorController::resetScriptObjects):
+ (WebCore::InspectorController::wrapObject):
+ (WebCore::InspectorController::unwrapObject):
+ (WebCore::InspectorController::releaseWrapperObjectGroup):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::addMessageToConsole):
+ * inspector/front-end/ConsoleView.js:
+ (WebInspector.ConsoleView.prototype.evalInInspectedWindow):
+ (WebInspector.ConsoleView.prototype.doEvalInWindow):
+ (WebInspector.ConsoleView.prototype._enterKeyPressed):
+ * inspector/front-end/InjectedScript.js:
+ (InjectedScript.evaluate):
+ (InjectedScript._evaluateAndWrap):
+ (InjectedScript.evaluateInCallFrame):
+ * inspector/front-end/ScriptsPanel.js:
+ (WebInspector.ScriptsPanel.prototype.evaluateInSelectedCallFrame):
+ (WebInspector.ScriptsPanel.prototype.doEvalInCallFrame):
+ * inspector/front-end/WatchExpressionsSidebarPane.js:
+ (WebInspector.WatchExpressionsSidebarPane):
+ (WebInspector.WatchExpressionsSection.prototype.update):
+
+2009-10-02 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Eric Carlson.
+
+ Move mediaControls extras for the Qt port into WebCore/css like other ports
+
+ https://bugs.webkit.org/show_bug.cgi?id=30013
+
+ * WebCore.pro:
+ * WebCore.qrc:
+ * css/mediaControlsQt.css: Renamed from WebCore/css/qt/mediaControls-extras.css.
+ * platform/qt/RenderThemeQt.cpp:
+ (WebCore::RenderThemeQt::extraMediaControlsStyleSheet):
+
+2009-10-02 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Reviewed by Eric Carlson.
+
+ Rename WebCore/css/mediaControlsQT.css and MediaControllerThemeQT
+
+ https://bugs.webkit.org/show_bug.cgi?id=30013
+
+ The QT suffix has been expanded to QuickTime, to not cause confusion
+ and name-crashes with similar files in the Qt port.
+
+ * DerivedSources.make:
+ * WebCore.xcodeproj/project.pbxproj:
+ * css/mediaControlsQuickTime.css: Renamed from WebCore/css/mediaControlsQT.css.
+ * rendering/RenderThemeMac.mm:
+ (WebCore::):
+ (WebCore::mediaControllerTheme):
+ (WebCore::RenderThemeMac::adjustSliderThumbSize):
+ (WebCore::getUnzoomedRectAndAdjustCurrentContext):
+ (WebCore::RenderThemeMac::extraMediaControlsStyleSheet):
+
+2009-10-04 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30064>
+ Syntax Highlighting CSS shouldn't be duplicated.
+
+ Refactor syntax highlighting CSS into a new file, add it to the
+ projects, and have SourceFrame.js and inspector.html include the
+ new CSS file.
+
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * inspector/front-end/SourceFrame.js:
+ (WebInspector.SourceFrame.prototype._loaded):
+ * inspector/front-end/inspector.css:
+ * inspector/front-end/inspector.html:
+ * inspector/front-end/inspectorSyntaxHighlight.css: Added.
+ * inspector/front-end/WebKit.qrc:
+
+2009-10-04 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30062>
+ Inspector should syntax highlight JS/CSS in elements view.
+
+ Add syntax highlighting of CSS and JavaScript tags to the elements panel.
+ Copied CSS rules from SourceFrame.js to inspector.css, and have the text nodes
+ in utilities.js call the CSS or JS Syntax highlighters if their parent is a script
+ or style tag.
+
+ * inspector/front-end/inspector.css:
+ * inspector/front-end/utilities.js:
+
+2009-10-04 Fumitoshi Ukai <ukai@chromium.org>
+
+ Reviewed by Eric Seidel
+
+ Enable Web Sockets in chromium build.
+ https://bugs.webkit.org/show_bug.cgi?id=29917
+
+ * WebCore.gyp/WebCore.gyp:
+
+2009-10-04 Xan Lopez <xlopez@igalia.com>
+
+ Reviewed by Gustova Noronha.
+
+ [GTK] performs a POST when refreshing a view that was obtained with a GET
+ https://bugs.webkit.org/show_bug.cgi?id=29761
+
+ Update the HTTP method in the request stored by willSendRequest
+ after a redirect, since it could have changed.
+
+ Test: http/tests/navigation/postredirect-reload.html
+
+ * platform/network/soup/ResourceHandleSoup.cpp:
+ (WebCore::restartedCallback):
+
+2009-10-04 Xan Lopez <xlopez@igalia.com>
+
+ Revert previous patch, as the newly added test breaks other tests.
+
+ * platform/network/soup/ResourceHandleSoup.cpp:
+ (WebCore::restartedCallback):
+
+2009-10-04 Xan Lopez <xlopez@igalia.com>
+
+ Reviewed by Gustova Noronha.
+
+ [GTK] performs a POST when refreshing a view that was obtained with a GET
+ https://bugs.webkit.org/show_bug.cgi?id=29761
+
+ Update the HTTP method in the request stored by willSendRequest
+ after a redirect, since it could have changed.
+
+ Test: http/tests/navigation/postredirect-reload.html
+
+ * platform/network/soup/ResourceHandleSoup.cpp:
+ (WebCore::restartedCallback):
+
+2009-10-04 Vitaly Repeshko <vitalyr@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ [V8] Fixed Function leak in V8LazyEventListener.
+ (Should fix the remaning leak in
+ https://bugs.webkit.org/show_bug.cgi?id=29093).
+ V8LazyEventListeners used to create FunctionTemplates for each
+ wrapped listener which in turn created Functions that were cached
+ forever in V8 Context. Now there is at most one such Function per
+ Context.
+ https://bugs.webkit.org/show_bug.cgi?id=30060
+
+ Added new hidden property name to store toString result:
+ * bindings/v8/V8HiddenPropertyName.cpp:
+ * bindings/v8/V8HiddenPropertyName.h:
+
+ Switched to static FunctionTemplate:
+ * bindings/v8/V8LazyEventListener.cpp:
+ (WebCore::V8LazyEventListenerToString):
+ (WebCore::V8LazyEventListener::prepareListenerObject):
+
+2009-10-03 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ CSS Source View Should be Syntax Highlighted
+ https://bugs.webkit.org/show_bug.cgi?id=14359
+
+ Support for WebKit's CSS Variables @variables and var()
+
+ * inspector/front-end/SourceFrame.js:
+ (WebInspector.CSSSourceSyntaxHighligher):
+
+2009-10-03 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Inspector should remember preferences for docked/undocked etc
+ https://bugs.webkit.org/show_bug.cgi?id=29089
+
+ * inspector/front-end/ResourcesPanel.js:
+ (WebInspector.ResourcesPanel.prototype._toggleLargerResources): toggle the preference
+ * inspector/front-end/inspector.js:
+ (WebInspector._loadPreferences): factored out loading preferences
+ (WebInspector.loaded):
+
+2009-10-03 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ CSS Source View Should be Syntax Highlighted
+ https://bugs.webkit.org/show_bug.cgi?id=14359
+
+ Trigger the Syntax Highlighter for CSS files.
+
+ * inspector/front-end/SourceFrame.js:
+ (WebInspector.SourceFrame.prototype.syntaxHighlightJavascript):
+ (WebInspector.SourceFrame.prototype.syntaxHighlightCSS):
+ * inspector/front-end/SourceView.js:
+ (WebInspector.SourceView.prototype._contentLoaded):
+
+ Factored out the Syntax Highlighting procedure into a "Class"
+ Added CSSSourceSyntaxHighlighter and JavaScriptSourceSyntaxHighlighter
+
+ (WebInspector.SourceSyntaxHighligher):
+ (WebInspector.SourceSyntaxHighligher.prototype.createSpan):
+ (WebInspector.SourceSyntaxHighligher.prototype.process.processChunk):
+ (WebInspector.SourceSyntaxHighligher.prototype.process):
+ (WebInspector.CSSSourceSyntaxHighligher): the CSS Highlighter
+ (WebInspector.JavaScriptSourceSyntaxHighligher): the JS Highlighter
+
+2009-10-03 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Sam Weinig.
+
+ Factor back-forward list methods out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30037
+
+ This change moves these back-forward related methods from FrameLoader
+ to Page. It's possible we should move these methods into some kind of
+ "page controller" object, but we can figure that out in a future patch.
+
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/RedirectScheduler.cpp:
+ (WebCore::RedirectScheduler::timerFired):
+ * page/ContextMenuController.cpp:
+ (WebCore::ContextMenuController::contextMenuItemSelected):
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::close):
+ * page/History.cpp:
+ (WebCore::History::length):
+ * page/Page.cpp:
+ (WebCore::Page::canGoBackOrForward):
+ (WebCore::Page::goBackOrForward):
+ (WebCore::Page::getHistoryLength):
+ * page/Page.h:
+ * platform/ContextMenu.cpp:
+ (WebCore::ContextMenu::populate):
+ (WebCore::ContextMenu::checkOrEnableIfNeeded):
+
+2009-10-02 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: prepare InspectorController for being used from layout tests.
+ This change adds evaluateForTestInFrontend method with the callback that
+ allows evaluating arbitrary code in the frontend context.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30008
+
+ * WebCore.Inspector.exp:
+ * WebCore.order:
+ * inspector/InspectorBackend.cpp:
+ (WebCore::InspectorBackend::didEvaluateForTestInFrontend):
+ * inspector/InspectorBackend.h:
+ * inspector/InspectorBackend.idl:
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::populateScriptObjects):
+ (WebCore::InspectorController::evaluateForTestInFrontend):
+ (WebCore::InspectorController::didEvaluateForTestInFrontend):
+ * inspector/InspectorController.h:
+ * inspector/InspectorFrontend.cpp:
+ (WebCore::InspectorFrontend::evaluateForTestInFrontend):
+ * inspector/InspectorFrontend.h:
+ * inspector/front-end/inspector.js:
+ (WebInspector.evaluateForTestInFrontend):
+
+2009-10-02 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: Node search mode is not getting reset on element selection.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30016
+
+ * inspector/front-end/ElementsPanel.js:
+ (WebInspector.ElementsPanel.this.treeOutline.focusedNodeChanged):
+
+2009-10-02 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <https://bugs.webkit.org/show_bug.cgi?id=30036>
+ Should be able to resize Cookie Columns.
+
+ * inspector/front-end/CookieItemsView.js:
+ (WebInspector.CookieItemsView.prototype.update.callback):
+ (WebInspector.CookieItemsView.prototype.update):
+ (WebInspector.CookieItemsView.prototype.resize):
+
+2009-09-25 Jon Honeycutt <jhoneycutt@apple.com>
+
+ Make WebCore::PluginView participate in plug-in halting.
+
+ Reviewed by Sam Weinig.
+
+ * platform/graphics/BitmapImage.h:
+ Declare a create() function that takes an HBITMAP.
+
+ * platform/graphics/win/ImageCGWin.cpp:
+ (WebCore::BitmapImage::create):
+ Use GetObject() to fill out a DIBSECTION structure for the given
+ HBITMAP. Call CGBitmapContextCreate() to create a CG context from the
+ bits of the bitmap. Create a CG image from the context, and pass this
+ when creating a new BitmapImage.
+
+ * plugins/PluginView.cpp:
+ (WebCore::PluginView::start):
+ If we successfully started, tell our parent frame's Page.
+ (WebCore::PluginView::stop):
+ Tell our parent frame's Page that we stopped.
+ (WebCore::PluginView::node):
+
+ * plugins/PluginView.h:
+ Inherit from HaltablePlugin.
+ (WebCore::PluginView::setPlatformPluginWidget):
+ On platforms where the platform plug-in widget is the WebCore::Widget's
+ platform widget, have setPlatformPluginWidget() call
+ setPlatformWidget().
+
+ * plugins/PluginViewNone.cpp:
+ (WebCore::PluginView::halt):
+ Stubbed.
+ (WebCore::PluginView::restart):
+ Stubbed.
+
+ * plugins/gtk/PluginViewGtk.cpp:
+ (WebCore::PluginView::halt):
+ Stubbed.
+ (WebCore::PluginView::restart):
+ Stubbed.
+
+ * plugins/mac/PluginViewMac.cpp:
+ (WebCore::PluginView::halt):
+ Stubbed.
+ (WebCore::PluginView::restart):
+ Stubbed.
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::halt):
+ Stubbed.
+ (WebCore::PluginView::restart):
+ Stubbed.
+
+ * plugins/win/PluginViewWin.cpp:
+ (WebCore::PluginView::platformDestroy):
+ After destroying the window, set the platform plug-in widget to 0 to
+ ensure that Widget isn't holding a stale handle.
+ (WebCore::PluginView::halt):
+ Have our element's RenderWidget display a screenshot of the plug-in,
+ then stop the plug-in and destroy it.
+ (WebCore::PluginView::restart):
+ Clear the RenderWidget's substitute image, then start the plug-in.
+
+ * rendering/RenderWidget.cpp:
+ (WebCore::RenderWidget::showSubstituteImage):
+ Set m_substituteImage to the passed image, and repaint.
+ (WebCore::RenderWidget::paint):
+ If we have a substitute image, paint that instead of allowing the
+ widget to paint itself.
+
+ * rendering/RenderWidget.h:
+ Declare showSubstituteImage(). Added a member to store the substitute
+ image.
+
+2009-10-02 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Move PolicyCheck out of FrameLoader.{h,cpp}
+ https://bugs.webkit.org/show_bug.cgi?id=30035
+
+ Purely code motion (and adding a destructor).
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/PolicyCheck.cpp:
+ * loader/PolicyCheck.h:
+
+2009-10-02 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] Add NPNVToolkit value quirk in plugins for nspluginwrapper.
+ Plugin error message was:
+ ERROR: failed to initialize brower-side RPC events listener
+ https://bugs.webkit.org/show_bug.cgi?id=25053
+
+ (WebCore::staticPluginQuirkRequiresGtkToolKit_NPN_GetValue):
+ (WebCore::PluginPackage::load):
+
+2009-10-02 Jocelyn Turcotte <jocelyn.turcotte@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] X sync our XEmbed container window creation before sending the
+ xid to plugins.
+ https://bugs.webkit.org/show_bug.cgi?id=25053
+
+ * plugins/qt/PluginViewQt.cpp:
+ (WebCore::PluginView::setNPWindowIfNeeded):
+
+2009-10-02 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Setting zero size on a container of a video element doesn't hide the controller
+ https://bugs.webkit.org/show_bug.cgi?id=30031
+
+ Fix a logic error in enclosingCompositingLayer() when mixing normal flow and
+ positioned layers. This resulted in enclosingCompositingLayer() giving back a different
+ answer to the logic used to actually parent compositing layers, so layer positions
+ and layer hierarchy would be out of agreement.
+
+ Test: compositing/geometry/clipped-video-controller.html
+
+ * rendering/RenderLayer.cpp:
+ (WebCore::compositingContainer):
+ (WebCore::RenderLayer::enclosingCompositingLayer):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::setCompositingParent):
+
+2009-10-02 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Eric Seidel.
+
+ - Move the following methods of HTMLInputElement and HTMLTextAreaElement
+ to HTMLTextFormControlElement.
+ setSelectionStart()
+ setSelectionEnd()
+ select()
+ setSelectionRange()
+ selectionStart()
+ selectionEnd()
+ selection()
+
+ - Introduce cachedSelectionStart() and cachedSelectionEnd().
+
+ - Unify HTMLInputElement::isTextFieldWithRenderer() and
+ HTMLTextAreaElement::rendererAfterUpdateLayout() into textRendererAfterUpdateLayout().
+
+ - Unify a part of parseMappedAttribute() of HTMLInputElement and HTMLTextAreaElement.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29782
+
+ * html/HTMLFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::textRendererAfterUpdateLayout):
+ (WebCore::HTMLTextFormControlElement::setSelectionStart):
+ (WebCore::HTMLTextFormControlElement::setSelectionEnd):
+ (WebCore::HTMLTextFormControlElement::select):
+ (WebCore::HTMLTextFormControlElement::setSelectionRange):
+ (WebCore::HTMLTextFormControlElement::selectionStart):
+ (WebCore::HTMLTextFormControlElement::selectionEnd):
+ (WebCore::HTMLTextFormControlElement::selection):
+ (WebCore::HTMLTextFormControlElement::parseMappedAttribute):
+ * html/HTMLFormControlElement.h:
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::parseMappedAttribute):
+ * html/HTMLInputElement.h:
+ (WebCore::HTMLInputElement::select):
+ (WebCore::HTMLInputElement::cachedSelectionStart):
+ (WebCore::HTMLInputElement::cachedSelectionEnd):
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::parseMappedAttribute):
+ * html/HTMLTextAreaElement.h:
+ (WebCore::HTMLTextAreaElement::cachedSelectionStart):
+ (WebCore::HTMLTextAreaElement::cachedSelectionEnd):
+
+2009-10-02 Vitaly Repeshko <vitalyr@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ [V8] Disconnect event listeners on navigation.
+ Fixes http://crbug.com/23597.
+ https://bugs.webkit.org/show_bug.cgi?id=30027
+
+ Added V8ListenerGuard that is shared by listeners and proxy. On
+ navigation proxy sets a flag in the guard turning off listeners.
+
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::V8AbstractEventListener::V8AbstractEventListener):
+ * bindings/v8/V8AbstractEventListener.h:
+ (WebCore::V8ListenerGuard::create):
+ (WebCore::V8ListenerGuard::isDisconnected):
+ (WebCore::V8ListenerGuard::disconnectListeners):
+ (WebCore::V8ListenerGuard::V8ListenerGuard):
+ (WebCore::V8AbstractEventListener::disconnected):
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getEventListener):
+ * bindings/v8/V8EventListenerList.h:
+ (WebCore::V8EventListenerList::findOrCreateWrapper):
+ * bindings/v8/V8LazyEventListener.cpp:
+ (WebCore::V8LazyEventListener::V8LazyEventListener):
+ * bindings/v8/V8Proxy.cpp:
+ (WebCore::V8Proxy::V8Proxy):
+ (WebCore::V8Proxy::disconnectFrame):
+ (WebCore::V8Proxy::disconnectEventListeners):
+ (WebCore::V8Proxy::clearForNavigation):
+ * bindings/v8/V8Proxy.h:
+ (WebCore::V8Proxy::listenerGuard):
+ * bindings/v8/V8WorkerContextEventListener.cpp:
+ (WebCore::V8WorkerContextEventListener::V8WorkerContextEventListener):
+ * bindings/v8/V8WorkerContextEventListener.h:
+ (WebCore::V8WorkerContextEventListener::create):
+ * bindings/v8/WorkerContextExecutionProxy.cpp:
+ (WebCore::WorkerContextExecutionProxy::WorkerContextExecutionProxy):
+ (WebCore::WorkerContextExecutionProxy::dispose):
+ (WebCore::WorkerContextExecutionProxy::findOrCreateEventListener):
+ * bindings/v8/WorkerContextExecutionProxy.h:
+ * bindings/v8/custom/V8CustomEventListener.cpp:
+ (WebCore::V8EventListener::V8EventListener):
+ * bindings/v8/custom/V8CustomEventListener.h:
+ (WebCore::V8EventListener::create):
+
+2009-10-02 Kenneth Russell <kbr@google.com>
+
+ Reviewed by Dimitri Glazkov.
+
+ [chromium] Fix WebGL build after CustomGetter constructor changes
+ https://bugs.webkit.org/show_bug.cgi?id=30020
+
+ * page/DOMWindow.idl:
+ Changed CustomGetter to JSCCustomGetter for CanvasArray constructors.
+
+2009-10-02 Patrick Mueller <Patrick_Mueller@us.ibm.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: text in a "Request Payload" section disappears on selection
+ https://bugs.webkit.org/show_bug.cgi?id=29967
+
+ No new tests.
+
+ * inspector/front-end/ResourceView.js:
+ (WebInspector.ResourceView.prototype._refreshRequestPayload):
+
+2009-10-02 Vitaly Repeshko <vitalyr@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ [V8] Recursion guard for V8Proxy::callFunction.
+ Fixes http://crbug.com/23278.
+ https://bugs.webkit.org/show_bug.cgi?id=29974
+
+ Test: fast/xmlhttprequest/xmlhttprequest-recursive-sync-event.html
+
+ * bindings/v8/V8Proxy.cpp:
+ (WebCore::V8Proxy::callFunction):
+
+2009-10-02 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Jon Honeycutt.
+
+ Fix test breakages by adding null checks, and putting inspector code in
+ ENABLE(INSPECTOR).
+
+ * dom/Document.cpp:
+ (WebCore::Document::finishedParsing):
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::dispatchLoadEvent):
+
+2009-10-02 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Clean up the QNetworkReplyHandler to only apply HTTP headers
+ for protocols in the HTTP family.
+
+ * platform/network/qt/QNetworkReplyHandler.cpp:
+ (WebCore::QNetworkReplyHandler::finish):
+ (WebCore::QNetworkReplyHandler::sendResponseIfNeeded):
+
+2009-10-02 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Move error check into sendResponseIfNeeded() as suggested
+ by Eric Seidel. Also, remove some dead code.
+
+ * platform/network/qt/QNetworkReplyHandler.cpp:
+ (WebCore::QNetworkReplyHandler::finish):
+ (WebCore::QNetworkReplyHandler::sendResponseIfNeeded):
+
+2009-10-02 Enrica Casucci <enrica@apple.com>
+
+ Reviewed by Adele Peterson.
+
+ Assertion failure in CompositeEditCommand::moveParagraphs() and crash in Node::nodeIndex() when pasting.
+ <rdar://problem/7148712>
+ https://bugs.webkit.org/show_bug.cgi?id=28992
+
+ Test: editing/selection/replace-selection-crash.html
+
+ * editing/ReplaceSelectionCommand.cpp:
+ (WebCore::ReplaceSelectionCommand::mergeEndIfNeeded): Handle properly the case of
+ the destination position matching the end of the paragraph to move.
+
+2009-10-02 Jeremy Orlow <jorlow@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Implement per-storage-area quotas for LocalStorage
+ https://bugs.webkit.org/show_bug.cgi?id=29991
+
+ I put 90% of the code in StorageMap since the decision to allow an update is
+ closely tied to quota tracking. The quota is set via a page's Settings class.
+ Like with the local storage path and whether it's enabled, it's assumed that
+ all pages in the same group will have the same settings. The setting defaults
+ to 5mb which is what the spec suggests, but it can easily be changed to
+ anything else--including StorageMap::noQuota. Any values in LocalStorage are
+ grandfathered in regarudless of quota, so importItem only tracks (and will
+ never block) imports.
+
+ I believe this change is a good transition to more complex quota management.
+ For example, if we wanted to track quotas in the SQLite DB, then we'd just add
+ a function to the StorageMap that sets the quota. This would be fine since all
+ use of LocalStorage is blocked on the import completing, so you'd never hit a
+ quota error in the mean time. Also, if embedders wanted to ask the user
+ whether to expand the quota whenever it's hit (before deciding whether or not
+ to raise an exception), a callback via the chrome client should be fairly easy.
+ That said, I think it's best to add these features in steps rather than one
+ huge patch. (Both of these are on my TODO list, btw.)
+
+ Included is a layout test that verifies the behavior. It assumes the default
+ quota is 5mb (since that's what Settings defaults to).
+
+ Test: storage/domstorage/localstorage/quota.html
+
+ * page/PageGroup.cpp:
+ (WebCore::PageGroup::localStorage):
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ (WebCore::Settings::setLocalStorageQuota):
+ * page/Settings.h:
+ (WebCore::Settings::localStorageQuota):
+ * storage/StorageAreaImpl.cpp:
+ (WebCore::StorageAreaImpl::create):
+ (WebCore::StorageAreaImpl::StorageAreaImpl):
+ (WebCore::StorageAreaImpl::setItem):
+ (WebCore::StorageAreaImpl::clear):
+ * storage/StorageAreaImpl.h:
+ * storage/StorageMap.cpp:
+ (WebCore::StorageMap::create):
+ (WebCore::StorageMap::StorageMap):
+ (WebCore::StorageMap::copy):
+ (WebCore::StorageMap::setItem):
+ (WebCore::StorageMap::removeItem):
+ (WebCore::StorageMap::importItem):
+ * storage/StorageMap.h:
+ (WebCore::StorageMap::quota):
+ * storage/StorageNamespace.cpp:
+ (WebCore::StorageNamespace::localStorageNamespace):
+ * storage/StorageNamespace.h:
+ * storage/StorageNamespaceImpl.cpp:
+ (WebCore::StorageNamespaceImpl::localStorageNamespace):
+ (WebCore::StorageNamespaceImpl::sessionStorageNamespace):
+ (WebCore::StorageNamespaceImpl::StorageNamespaceImpl):
+ (WebCore::StorageNamespaceImpl::copy):
+ (WebCore::StorageNamespaceImpl::storageArea):
+ * storage/StorageNamespaceImpl.h:
+
+2009-10-02 Joseph Pecoraro <joepeck@webkit.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Database Inspector crashes Safari when table has more than 21 columns
+ https://bugs.webkit.org/show_bug.cgi?id=29924
+
+ * inspector/front-end/StoragePanel.js:
+ (WebInspector.StoragePanel.prototype.dataGridForResult): adjust the minimum column width percentage to be flexible for many columns.
+
+2009-10-02 Brian Weinstein <bweinstein@apple.com>
+
+ Reviewed by Timothy Hatcher.
+
+ Fixes <http://webkit.org/b/14370>.
+ Inspector's timeline should record when certain DOM events fired.
+
+ This patch adds calls into the Web Inspector when the main frame
+ fires an load event, and when the document fires its DOMContent
+ event. Once these values are passed in, they are sent to the Web Inspector
+ as a timing change, and these are denoted by vertical lines in the resources
+ panel (blue for DOM Content, red for load event).
+
+ * English.lproj/localizedStrings.js: Added tooltip text.
+ * dom/Document.cpp:
+ (WebCore::Document::finishedParsing): Added an Inspector callback for DOM Content.
+ * inspector/InspectorController.cpp:
+ (WebCore::InspectorController::mainResourceFiredDOMContentEvent): Tell the main resource it got the event.
+ (WebCore::InspectorController::mainResourceFiredLoadEvent): Ditto.
+ * inspector/InspectorController.h:
+ * inspector/InspectorResource.cpp:
+ (WebCore::InspectorResource::InspectorResource): Added new variables.
+ (WebCore::InspectorResource::updateScriptObject): Send new variables to inspector.js.
+ (WebCore::InspectorResource::markDOMContentEventTime): Send a TimingChange event.
+ (WebCore::InspectorResource::markLoadEventTime): Ditto.
+ * inspector/InspectorResource.h:
+ * inspector/front-end/ResourcesPanel.js:
+ (WebInspector.ResourcesPanel.prototype.get mainResourceLoadTime):
+ (WebInspector.ResourcesPanel.prototype.set mainResourceLoadTime):
+ (WebInspector.ResourcesPanel.prototype.get mainResourceDOMContentTime):
+ (WebInspector.ResourcesPanel.prototype.set mainResourceDOMContentTime):
+ (WebInspector.ResourcesPanel.prototype.reset):
+ (WebInspector.ResourcesPanel.prototype._updateGraphDividersIfNeeded): Draw dividers for event timings.
+ (WebInspector.ResourceTimeCalculator.prototype.computePercentageFromEventTime):
+ * inspector/front-end/inspector.css:
+ * inspector/front-end/inspector.js:
+ (WebInspector.updateResource):
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::dispatchLoadEvent): Add an Inspector callback for the Load event.
+
+2009-10-02 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Add support for blacklist patterns to user stylesheets and scripts in addition to whitelist patterns.
+
+ * WebCore.base.exp:
+ * dom/Document.cpp:
+ (WebCore::Document::pageGroupUserSheets):
+ * page/Frame.cpp:
+ (WebCore::Frame::injectUserScriptsForWorld):
+ * page/PageGroup.cpp:
+ (WebCore::PageGroup::addUserScript):
+ (WebCore::PageGroup::addUserStyleSheet):
+ (WebCore::PageGroup::removeUserContentWithURLForWorld):
+ (WebCore::PageGroup::removeUserContentForWorld):
+ * page/PageGroup.h:
+ * page/UserContentURLPattern.cpp:
+ (WebCore::UserContentURLPattern::matchesPatterns):
+ * page/UserContentURLPattern.h:
+ * page/UserScript.h:
+ (WebCore::UserScript::UserScript):
+ (WebCore::UserScript::whitelist):
+ (WebCore::UserScript::blacklist):
+ * page/UserStyleSheet.h:
+ (WebCore::UserStyleSheet::UserStyleSheet):
+ (WebCore::UserStyleSheet::whitelist):
+ (WebCore::UserStyleSheet::blacklist):
+
+2009-10-02 Laszlo Gombos <laszlo.1.gombos@nokia.com>
+
+ Reviewed by Darin Adler.
+
+ Build fix when SVG is not enabled
+ https://bugs.webkit.org/show_bug.cgi?id=30011
+
+ Move TextRenderingMode related functions out from
+ the ENABLE(SVG) guard.
+
+ * css/CSSPrimitiveValueMappings.h:
+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
+ (WebCore::CSSPrimitiveValue::operator TextRenderingMode):
+
+2009-10-02 Kenneth Russell <kbr@google.com>
+
+ Reviewed by Oliver Hunt.
+
+ WebGL crashes with recent CanvasArray change
+ https://bugs.webkit.org/show_bug.cgi?id=30018
+
+ Test: fast/canvas/webgl/array-unit-tests.html
+
+ * html/canvas/CanvasArray.cpp:
+ (WebCore::CanvasArray::CanvasArray):
+ Fix bug where PassRefPtr was tested after transferring value to RefPtr.
+
+2009-10-02 Steve Falkenburg <sfalken@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ <https://bugs.webkit.org/show_bug.cgi?id=29989>
+ Safari version number shouldn't be exposed in WebKit code
+
+ For a WebKit version of 532.3.4:
+ Product version is: 5.32.3.4 (was 4.0.3.0)
+ File version is: 5.32.3.4 (was 4.532.3.4)
+
+ * WebCore.vcproj/QTMovieWin.rc:
+
+2009-10-02 Stephen White <senorblanco@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Enable two point radial gradients in Chromium/Skia.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30017
+
+ Covered by the following tests:
+
+ LayoutTests/svg/W3C-SVG-1.1/pservers-grad-13-b.svg
+ LayoutTests/fast/backgrounds/svg-as-background-3.html
+ LayoutTests/fast/gradients/generated-gradients.html
+ LayoutTests/fast/gradients/simple-gradients.html
+
+ * platform/graphics/skia/GradientSkia.cpp:
+ (WebCore::Gradient::platformGradient):
+
+2009-10-02 Norbert Leser <norbert.leser@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Conditionally guard cursor code (cursor and updateCursor functions) with !QT_NO_CURSOR.
+ Otherwise, it is inconsistent with class declaration of QCursor.
+
+ No new tests.
+
+ * platform/qt/QWebPageClient.h:
+
+2009-10-02 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GTK] missing support for anamorphic PAR video size
+ https://bugs.webkit.org/show_bug.cgi?id=29717
+
+ cleanup of caps handling in the video sink
+
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_set_caps):
+
+2009-10-02 Prasanth Ullattil <prasanth.ullattil@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Fix compiler warnings about unused function arguments.
+
+ * bridge/qt/qt_class.h:
+ * bridge/qt/qt_runtime.cpp:
+ (JSC::Bindings::QtRuntimeMetaMethod::call):
+ (JSC::Bindings::QtRuntimeConnectionMethod::call):
+ * dom/XMLTokenizerQt.cpp:
+ (WebCore::XMLTokenizer::initializeParserContext):
+ * platform/graphics/qt/FontCacheQt.cpp:
+ (WebCore::FontCache::getTraitsInFamily):
+ (WebCore::FontCache::getCachedFontPlatformData):
+ * platform/graphics/qt/FontFallbackListQt.cpp:
+ (WebCore::FontFallbackList::setPlatformFont):
+ * platform/graphics/qt/FontQt.cpp:
+ (WebCore::Font::offsetForPositionForComplexText):
+ * platform/graphics/qt/GraphicsContextQt.cpp:
+ (WebCore::GraphicsContext::drawLineForText):
+ (WebCore::GraphicsContext::drawLineForMisspellingOrBadGrammar):
+ (WebCore::GraphicsContext::setPlatformShadow):
+ (WebCore::GraphicsContext::setURLForRect):
+ * platform/graphics/qt/IconQt.cpp:
+ (WebCore::Icon::createIconForFiles):
+ * platform/graphics/qt/ImageBufferQt.cpp:
+ (WebCore::ImageBuffer::ImageBuffer):
+ * platform/graphics/qt/ImageDecoderQt.cpp:
+ (WebCore::ImageDecoderQt::frameBufferAtIndex):
+ * platform/graphics/qt/MediaPlayerPrivatePhonon.cpp:
+ (WebCore::MediaPlayerPrivate::supportsType):
+ (WebCore::MediaPlayerPrivate::setEndTime):
+ * platform/graphics/qt/SimpleFontDataQt.cpp:
+ (WebCore::SimpleFontData::containsCharacters):
+ * platform/graphics/qt/StillImageQt.h:
+ (WebCore::StillImage::destroyDecodedData):
+ * platform/network/qt/DnsPrefetchHelper.h:
+ (WebCore::DnsPrefetchHelper::lookedUp):
+ * platform/qt/ContextMenuQt.cpp:
+ (WebCore::ContextMenu::setPlatformDescription):
+ * platform/qt/DragDataQt.cpp:
+ (WebCore::DragData::asURL):
+ * platform/qt/PopupMenuQt.cpp:
+ (WebCore::PopupMenu::populate):
+ * platform/qt/RenderThemeQt.cpp:
+ (WebCore::RenderThemeQt::supportsFocusRing):
+ (WebCore::RenderThemeQt::systemFont):
+ (WebCore::RenderThemeQt::adjustButtonStyle):
+ (WebCore::RenderThemeQt::adjustMenuListButtonStyle):
+ (WebCore::RenderThemeQt::paintMediaSeekBackButton):
+ (WebCore::RenderThemeQt::paintMediaSeekForwardButton):
+ * platform/qt/ScrollViewQt.cpp:
+ (WebCore::ScrollView::platformAddChild):
+ * platform/qt/SearchPopupMenuQt.cpp:
+ (WebCore::SearchPopupMenu::saveRecentSearches):
+ (WebCore::SearchPopupMenu::loadRecentSearches):
+ * platform/qt/TemporaryLinkStubs.cpp:
+ (WebCore::signedPublicKeyAndChallengeString):
+ * platform/qt/WidgetQt.cpp:
+ (WebCore::Widget::paint):
+ * xml/XSLStyleSheetQt.cpp:
+ (WebCore::XSLStyleSheet::loadChildSheet):
+ (WebCore::XSLStyleSheet::setParentStyleSheet):
+ * xml/XSLTProcessorQt.cpp:
+ (WebCore::XSLTMessageHandler::handleMessage):
+ (WebCore::XSLTProcessor::transformToString):
+
+2009-10-02 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GTK] missing support for anamorphic PAR video size
+ https://bugs.webkit.org/show_bug.cgi?id=29717
+
+ Scale the cairo surface of the video sink depending on the
+ pixel-aspect-ratio of the video buffer to paint. Also
+ destruct/re-create the surface when setSize() is called with a new
+ size.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::naturalSize):
+ (WebCore::MediaPlayerPrivate::setSize):
+ (WebCore::MediaPlayerPrivate::paint):
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_idle_func):
+
+2009-10-02 Ben Murdoch <benm@google.com>
+
+ Reviewed by David Kilzer.
+
+ Stale database version persists through browser refresh (changeVersion doesn't work)
+ https://bugs.webkit.org/show_bug.cgi?id=27836
+
+ Tests: storage/change-version-handle-reuse.html
+ storage/change-version.html
+
+ * bindings/v8/custom/V8DatabaseCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL): Implement the V8 binding for database.changeVersion().
+ (WebCore::createTransaction): Fix a bug that was checking the wrong argument index to save the success callback.
+ * storage/Database.cpp:
+ (WebCore::updateGuidVersionMap): Safely update the Guid/version hash map.
+ (WebCore::Database::~Database): Remove code that removes the database from the guid->database and guid->version maps.
+ (WebCore::Database::setVersionInDatabase): Add a comment to explain some behaviour.
+ (WebCore::Database::close): Move the code that updates the maps from the destructor to here.
+ (WebCore::Database::performOpenAndVerify): Call updateGuidVersionMap instead of setting the hash map directly.
+ (WebCore::Database::setExpectedVersion): Update the in memory guid->version map when we want to update the database version.
+
+2009-10-02 Janne Koskinen <janne.p.koskinen@digia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Partial WINSCW build fix.
+
+ Add parentheses around the function pointer declaration, similar to the
+ second hunk in r48825.
+
+ * loader/CachedResourceHandle.h:
+
+2009-10-02 Adam Barth <abarth@webkit.org>
+
+ Unreviewed attempted build fix by Xcode magic.
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-10-02 Adam Barth <abarth@webkit.org>
+
+ Unreviewed build fix. Actually add the new files.
+
+ * loader/RedirectScheduler.cpp: Added.
+ (WebCore::ScheduledRedirection::):
+ (WebCore::ScheduledRedirection::ScheduledRedirection):
+ (WebCore::RedirectScheduler::RedirectScheduler):
+ (WebCore::RedirectScheduler::~RedirectScheduler):
+ (WebCore::RedirectScheduler::redirectScheduledDuringLoad):
+ (WebCore::RedirectScheduler::clear):
+ (WebCore::RedirectScheduler::scheduleRedirect):
+ (WebCore::RedirectScheduler::mustLockBackForwardList):
+ (WebCore::RedirectScheduler::scheduleLocationChange):
+ (WebCore::RedirectScheduler::scheduleFormSubmission):
+ (WebCore::RedirectScheduler::scheduleRefresh):
+ (WebCore::RedirectScheduler::locationChangePending):
+ (WebCore::RedirectScheduler::scheduleHistoryNavigation):
+ (WebCore::RedirectScheduler::timerFired):
+ (WebCore::RedirectScheduler::schedule):
+ (WebCore::RedirectScheduler::startTimer):
+ (WebCore::RedirectScheduler::cancel):
+ * loader/RedirectScheduler.h: Added.
+
+2009-10-01 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Move RedirectScheduler to its own file
+ https://bugs.webkit.org/show_bug.cgi?id=29952
+
+ This change is purely code motion.
+
+ No behavior change.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCoreSources.bkl:
+ * loader/FrameLoader.cpp:
+ * loader/FrameLoader.h:
+ * loader/RedirectScheduler.cpp: Added.
+ (WebCore::ScheduledRedirection::):
+ (WebCore::ScheduledRedirection::ScheduledRedirection):
+ (WebCore::RedirectScheduler::RedirectScheduler):
+ (WebCore::RedirectScheduler::~RedirectScheduler):
+ (WebCore::RedirectScheduler::redirectScheduledDuringLoad):
+ (WebCore::RedirectScheduler::clear):
+ (WebCore::RedirectScheduler::scheduleRedirect):
+ (WebCore::RedirectScheduler::mustLockBackForwardList):
+ (WebCore::RedirectScheduler::scheduleLocationChange):
+ (WebCore::RedirectScheduler::scheduleFormSubmission):
+ (WebCore::RedirectScheduler::scheduleRefresh):
+ (WebCore::RedirectScheduler::locationChangePending):
+ (WebCore::RedirectScheduler::scheduleHistoryNavigation):
+ (WebCore::RedirectScheduler::timerFired):
+ (WebCore::RedirectScheduler::schedule):
+ (WebCore::RedirectScheduler::startTimer):
+ (WebCore::RedirectScheduler::cancel):
+ * loader/RedirectScheduler.h: Added.
+
+2009-10-02 Dave MacLachlan <dmaclach@gmail.com>
+
+ Reviewed by David Levin.
+
+ Clean up warnings in WebCore/bindings/v8/npruntime.cpp
+ https://bugs.webkit.org/show_bug.cgi?id=29971
+
+ Gets rid of warnings on gcc about using anonymous namespaces
+ warning: 'StringKeyHashTraits' has a base
+ 'WTF::GenericHashTraits<<unnamed>::StringKey>'
+ whose type uses the anonymous namespace
+ and
+ warning: 'WTF::PairHashTraits<StringKeyHashTraits,
+ WTF::HashTraits<PrivateIdentifier*> >' has a base
+ 'WTF::GenericHashTraits<std::pair<<unnamed>::StringKey,
+ PrivateIdentifier*> >' whose type uses the anonymous namespace
+
+ No tests required.
+
+ * bindings/v8/npruntime.cpp:
+
+2009-10-01 Mark Rowe <mrowe@apple.com>
+
+ Fix the Tiger build. Don't unconditionally enable 3D canvas as it is not supported on Tiger.
+
+ * Configurations/FeatureDefines.xcconfig:
+
+2009-10-01 Chris Marrin <cmarrin@apple.com>
+
+ Reviewed by Oliver Hunt.
+
+ Turn on ENABLE_3D_CANVAS in TOT
+ https://bugs.webkit.org/show_bug.cgi?id=29906
+
+ Fixed a bug found when running tests with flag on
+
+ * Configurations/FeatureDefines.xcconfig:
+ * WebCore.base.exp:
+ * bindings/js/JSCanvasArrayBufferConstructor.h:
+ (WebCore::construct):
+ * html/HTMLCanvasElement.cpp:
+ (WebCore::HTMLCanvasElement::getContext):
+ * html/canvas/CanvasArray.cpp:
+ (WebCore::CanvasArray::CanvasArray):
+ * html/canvas/CanvasByteArray.cpp:
+ (WebCore::CanvasByteArray::create):
+ * html/canvas/CanvasFloatArray.cpp:
+ (WebCore::CanvasFloatArray::create):
+ * html/canvas/CanvasIntArray.cpp:
+ (WebCore::CanvasIntArray::create):
+ * html/canvas/CanvasShortArray.cpp:
+ (WebCore::CanvasShortArray::create):
+ * html/canvas/CanvasUnsignedByteArray.cpp:
+ (WebCore::CanvasUnsignedByteArray::create):
+ * html/canvas/CanvasUnsignedIntArray.cpp:
+ (WebCore::CanvasUnsignedIntArray::create):
+ * html/canvas/CanvasUnsignedShortArray.cpp:
+ (WebCore::CanvasUnsignedShortArray::create):
+ * page/Settings.cpp:
+ (WebCore::Settings::Settings):
+ (WebCore::Settings::setWebGLEnabled):
+ * page/Settings.h:
+ (WebCore::Settings::webGLEnabled):
+
+2009-10-01 Beth Dakin <bdakin@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Fix for <rdar://problem/7264725> Re-add a vendor prefix to box-
+ shadow (29927)
+ -and corresponding-
+ https://bugs.webkit.org/show_bug.cgi?id=29927
+
+ * css/CSSComputedStyleDeclaration.cpp:
+ (WebCore::):
+ (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
+ * css/CSSParser.cpp:
+ (WebCore::CSSParser::parseValue):
+ (WebCore::ShadowParseContext::ShadowParseContext):
+ (WebCore::ShadowParseContext::commitValue):
+ (WebCore::ShadowParseContext::commitLength):
+ (WebCore::ShadowParseContext::commitColor):
+ (WebCore::cssPropertyID):
+ * css/CSSPropertyNames.in:
+ * css/CSSStyleSelector.cpp:
+ (WebCore::CSSStyleSelector::applyProperty):
+ * page/animation/AnimationBase.cpp:
+ (WebCore::ensurePropertyMap):
+
+2009-10-01 Beth Dakin <bdakin@apple.com>
+
+ Rubber-stamped by Sam Weinig.
+
+ At bad merge at some point in the development of my patch must have
+ put TextRenderMode.h in a weird spot in the xcodeproj. Moving it
+ back where it belongs!
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-09-30 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Remove FrameLoader::schedule* APIs
+ https://bugs.webkit.org/show_bug.cgi?id=29950
+
+ Change clients of FrameLoader::schedule* to call redirectScheduler
+ directly.
+
+ No behavior change.
+
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::JSDOMWindow::setLocation):
+ (WebCore::createWindow):
+ (WebCore::JSDOMWindow::open):
+ * bindings/js/JSDocumentCustom.cpp:
+ (WebCore::JSDocument::setLocation):
+ * bindings/js/JSLocationCustom.cpp:
+ (WebCore::navigateIfAllowed):
+ (WebCore::JSLocation::reload):
+ * bindings/v8/V8Utilities.cpp:
+ (WebCore::navigateIfAllowed):
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::createWindow):
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8LocationCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * dom/Document.cpp:
+ (WebCore::Document::implicitClose):
+ (WebCore::Document::processHttpEquiv):
+ * html/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::write):
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::requestFrame):
+ (WebCore::FrameLoader::submitForm):
+ (WebCore::FrameLoader::receivedFirstData):
+ * loader/FrameLoader.h:
+ * loader/appcache/ApplicationCacheGroup.cpp:
+ (WebCore::ApplicationCacheGroup::selectCache):
+ * page/History.cpp:
+ (WebCore::History::back):
+ (WebCore::History::forward):
+ (WebCore::History::go):
+
+2009-10-01 Beth Dakin <bdakin@apple.com>
+
+ Just removing a comment I accidentally committed earlier.
+
+ * platform/graphics/mac/SimpleFontDataMac.mm:
+ (WebCore::SimpleFontData::getCFStringAttributes):
+
+2009-09-30 Jeremy Orlow <jorlow@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Clean up use of const and mutable in StorageMap
+ https://bugs.webkit.org/show_bug.cgi?id=29933
+
+ What's the point of having every single member variable be mutable and nearly
+ every method be const? Let's clean it up.
+
+ * storage/StorageMap.cpp:
+ (WebCore::StorageMap::setIteratorToIndex):
+ (WebCore::StorageMap::key):
+ (WebCore::StorageMap::importItem):
+ * storage/StorageMap.h:
+
+2009-10-01 Beth Dakin <bdakin@apple.com>
+
+ Reviewed by Dave Hyatt.
+
+ Fix for <rdar://problem/6934421> Support CSS for Text Kerning and
+ ligature
+ -and corresponding-
+ https://bugs.webkit.org/show_bug.cgi?id=6136
+
+ This patch makes the SVG CSS property text-rendering work with any
+ HTML, much like it does in Firefox. It accepts four possible input
+ values: auto, optimizeSpeed, optimizeLegibility, and
+ geometricPrecision. Right now, in this implementation, here is what
+ those values correspond to:
+
+ auto = optimizeSpeed = what we normally when the value's not set
+ optimizeLegibility = geometricPrecision = ligatures kerning
+
+ Add new file TextRenderingMode.h to the project files.
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+
+ CSS support for the new CSSPropertyTextRendering
+ * css/CSSComputedStyleDeclaration.cpp:
+ (WebCore::):
+ (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
+ * css/CSSParser.cpp:
+ (WebCore::CSSParser::parseValue):
+ * css/CSSPrimitiveValueMappings.h:
+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
+ (WebCore::CSSPrimitiveValue::operator TextRenderingMode):
+ * css/CSSPropertyNames.in:
+ * css/CSSStyleSelector.cpp:
+ (WebCore::CSSStyleSelector::applyProperty):
+ * css/CSSValueKeywords.in:
+
+ All the old SVG CSS support for this property can go away. When
+ it's used in SVG, it will just fall into the normal HTML case.
+ * css/SVGCSSComputedStyleDeclaration.cpp:
+ (WebCore::CSSComputedStyleDeclaration::getSVGPropertyCSSValue):
+ * css/SVGCSSParser.cpp:
+ (WebCore::CSSParser::parseSVGValue):
+ * css/SVGCSSPropertyNames.in:
+ * css/SVGCSSStyleSelector.cpp:
+ (WebCore::CSSStyleSelector::applySVGProperty):
+ * css/SVGCSSValueKeywords.in:
+
+ FontDescription stores the m_textRendering bit.
+ * platform/graphics/FontDescription.h:
+ (WebCore::FontDescription::FontDescription):
+ (WebCore::FontDescription::textRenderingMode):
+ (WebCore::FontDescription::setTextRenderingMode):
+ (WebCore::FontDescription::operator==):
+
+ We want to fall into the complex text rendering code path if
+ kerning and ligatures have been enabled with this property.
+ * platform/graphics/FontFastPath.cpp:
+ (WebCore::Font::canUseGlyphCache):
+
+ Now takes a TextRenderingMode as a parameter.
+ * platform/graphics/SimpleFontData.h:
+
+ New header for the enum.
+ * platform/graphics/TextRenderingMode.h: Added.
+ (WebCore::):
+
+ getCFStringAttributes() now takes a TextRenderingMode as an
+ attribute.
+ * platform/graphics/mac/CoreTextController.cpp:
+ (WebCore::CoreTextController::collectCoreTextRunsForCharacters):
+
+ Enable kerning and ligatures whenever the TextRenderingMode is
+ OptimizeLegibility or GeometricPrecision
+ * platform/graphics/mac/FontMacATSUI.mm:
+ (WebCore::disableLigatures):
+ (WebCore::initializeATSUStyle):
+ (WebCore::ATSULayoutParameters::initialize):
+ * platform/graphics/mac/SimpleFontDataMac.mm:
+ (WebCore::SimpleFontData::getCFStringAttributes):
+
+ More SVG CSS stuff that isn't needed anymore since SVG will use the
+ new HTML CSS implementation.
+ * rendering/style/SVGRenderStyle.h:
+ (WebCore::SVGRenderStyle::InheritedFlags::operator==):
+ (WebCore::SVGRenderStyle::setBitDefaults):
+ * rendering/style/SVGRenderStyleDefs.h:
+
+2009-10-01 Yury Semikhatsky <yurys@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Use isClosure property of scope proxy to decide whether the
+ scope is a closure.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29965
+
+ * inspector/front-end/ScopeChainSidebarPane.js:
+ (WebInspector.ScopeChainSidebarPane.prototype.update):
+
+2009-10-01 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dave Hyatt.
+
+ Odd color transitions on anchors with transition-property: all
+ https://bugs.webkit.org/show_bug.cgi?id=29911
+
+ When transitioning maybe-invalid colors, if the source and destination
+ color are both invalid, then don't animate.
+
+ This fixes an issue where a child element of an element running a color
+ transition, with -webkit-transition-property:all, would show a color change.
+ This happened because the "maybe invalid color" logic copied the color style
+ into -webkit-text-fill-color for both endpoints, causing -webkit-text-fill-color
+ to animate while the transition ran, and to then to disappear when the transition
+ finished.
+
+ Test: transitions/color-transition-all.html
+
+ * page/animation/AnimationBase.cpp:
+ (WebCore::PropertyWrapperMaybeInvalidColor::equals):
+ (WebCore::PropertyWrapperMaybeInvalidColor::blend):
+
+2009-10-01 Victor Wang <victorw@chromium.org>
+
+ Reviewed by Oliver Hunt.
+
+ Allow dragging a node who has child nodes.
+
+ https://bugs.webkit.org/show_bug.cgi?id=28632
+
+ Test: fast/events/drag-parent-node.html
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::shouldDragAutoNode):
+
+2009-10-01 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GTK] media player: better mute support
+ https://bugs.webkit.org/show_bug.cgi?id=29960
+
+ Handle volume and mute state with the two corresponding properties
+ of playbin2.
+
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivate::setMuted):
+ (WebCore::MediaPlayerPrivate::setVolume):
+
+2009-10-01 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Gustavo Noronha.
+
+ [GTK] video sink pad template colorspace is wrong
+ https://bugs.webkit.org/show_bug.cgi?id=29953
+
+ Set sink pad template colorspace depending on byte order.
+
+ * platform/graphics/gtk/VideoSinkGStreamer.cpp:
+ (webkit_video_sink_idle_func):
+
+2009-10-01 Vitaly Repeshko <vitalyr@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ [V8] Refactored V8 event listeners:
+ (This change should fix http://crbug.com/21079 and
+ https://bugs.webkit.org/show_bug.cgi?id=29093.)
+ o All listeners use weak handles to JS objects to avoid creating
+ cycles and leaking memory.
+ o "Object" variants of listeners removed.
+ o All event accessor callbacks are generated.
+ o Custom event accessors removed.
+ o All wrappers have hidden dependencies on their listeners to
+ prevent listeners from being collected.
+ o All variats of getEventListener function grouped in V8DOMWrapper.
+ o Pointers to C+EventListener wrappers are stored in JS objects
+ instead of event listener lists.
+ https://bugs.webkit.org/show_bug.cgi?id=29825
+
+ * WebCore.gypi: Removed "Object" listeners.
+ * bindings/scripts/CodeGeneratorV8.pm: Now handles event accessors.
+ * bindings/v8/DOMObjectsInclude.h:
+
+ V8AbstractEventListener manages weak JS handle:
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::weakEventListenerCallback):
+ (WebCore::V8AbstractEventListener::V8AbstractEventListener):
+ (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+ (WebCore::V8AbstractEventListener::handleEvent):
+ (WebCore::V8AbstractEventListener::disposeListenerObject):
+ (WebCore::V8AbstractEventListener::setListenerObject):
+ * bindings/v8/V8AbstractEventListener.h:
+ (WebCore::V8AbstractEventListener::cast):
+ (WebCore::V8AbstractEventListener::isLazy):
+ (WebCore::V8AbstractEventListener::getListenerObject):
+ (WebCore::V8AbstractEventListener::getExistingListenerObject):
+ (WebCore::V8AbstractEventListener::hasExistingListenerObject):
+ (WebCore::V8AbstractEventListener::disconnectFrame):
+ (WebCore::V8AbstractEventListener::disconnected):
+ (WebCore::V8AbstractEventListener::prepareListenerObject):
+ (WebCore::V8AbstractEventListener::lineNumber):
+ (WebCore::V8AbstractEventListener::virtualisAttribute):
+
+ Grouped getEventListener functions:
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getTemplate):
+ (WebCore::V8DOMWrapper::getEventListener):
+ * bindings/v8/V8DOMWrapper.h:
+
+ Removed most event listener objects bookkeeping:
+ * bindings/v8/V8EventListenerList.cpp:
+ * bindings/v8/V8EventListenerList.h:
+ (WebCore::V8EventListenerList::findWrapper):
+ (WebCore::V8EventListenerList::clearWrapper):
+ (WebCore::V8EventListenerList::doFindWrapper):
+ (WebCore::V8EventListenerList::getHiddenProperty):
+ (WebCore::V8EventListenerList::findOrCreateWrapper):
+
+ Added hidden properties for storing EventListener wrappers:
+ * bindings/v8/V8HiddenPropertyName.cpp:
+ (WebCore::V8HiddenPropertyName::listener):
+ (WebCore::V8HiddenPropertyName::attributeListener):
+ * bindings/v8/V8HiddenPropertyName.h:
+
+ * bindings/v8/V8LazyEventListener.cpp:
+ (WebCore::V8LazyEventListener::V8LazyEventListener):
+ (WebCore::V8LazyEventListener::callListenerFunction):
+ (WebCore::V8LazyEventListener::prepareListenerObject):
+ * bindings/v8/V8LazyEventListener.h:
+ (WebCore::V8LazyEventListener::isLazy):
+ * bindings/v8/V8ObjectEventListener.cpp: Removed.
+ * bindings/v8/V8ObjectEventListener.h: Removed.
+ * bindings/v8/V8Proxy.cpp:
+ (WebCore::V8Proxy::disconnectFrame):
+ (WebCore::V8Proxy::disconnectEventListeners):
+ * bindings/v8/V8Proxy.h:
+ * bindings/v8/V8WorkerContextEventListener.cpp:
+ (WebCore::V8WorkerContextEventListener::reportError):
+ (WebCore::V8WorkerContextEventListener::getReceiverObject):
+ * bindings/v8/V8WorkerContextEventListener.h:
+ * bindings/v8/V8WorkerContextObjectEventListener.cpp: Removed.
+ * bindings/v8/V8WorkerContextObjectEventListener.h: Removed.
+ * bindings/v8/WorkerContextExecutionProxy.cpp:
+ (WebCore::WorkerContextExecutionProxy::dispose):
+ (WebCore::WorkerContextExecutionProxy::initContextIfNeeded):
+ (WebCore::WorkerContextExecutionProxy::findOrCreateEventListener):
+ * bindings/v8/WorkerContextExecutionProxy.h:
+ * bindings/v8/custom/V8AbstractWorkerCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8CustomBinding.h:
+ * bindings/v8/custom/V8CustomEventListener.cpp:
+ (WebCore::V8EventListener::V8EventListener):
+ (WebCore::V8EventListener::getListenerFunction):
+ (WebCore::V8EventListener::callListenerFunction):
+ * bindings/v8/custom/V8CustomEventListener.h:
+ * bindings/v8/custom/V8DOMApplicationCacheCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp:
+ * bindings/v8/custom/V8MessagePortCustom.cpp:
+ (WebCore::getEventListener):
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8NodeCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8NotificationCenterCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8SVGElementInstanceCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8WebSocketCustom.cpp:
+ * bindings/v8/custom/V8WorkerContextCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8WorkerCustom.cpp:
+ * bindings/v8/custom/V8XMLHttpRequestConstructor.cpp:
+ * bindings/v8/custom/V8XMLHttpRequestCustom.cpp:
+ (WebCore::CALLBACK_FUNC_DECL):
+ * bindings/v8/custom/V8XMLHttpRequestUploadCustom.cpp:
+
+2009-10-01 Alexis Menard <alexis.menard@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ Rename QWebGraphicsItem to QGraphicsWebView
+
+ * WebCore.pro:
+
+2009-10-01 Dumitru Daniliuc <dumi@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Read-only transactions do not change file sizes and therefore
+ should not trigger quota updates.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29945
+
+ * storage/SQLTransaction.cpp:
+ (WebCore::SQLTransaction::openTransactionAndPreflight):
+ (WebCore::SQLTransaction::runStatements):
+
+2009-09-30 Timothy Hatcher <timothy@apple.com>
+
+ Fix list box scrolling by correctly overriding the scroll()
+ function on RenderBox.
+
+ <rdar://problem/7255440> REGRESSION (r48683): Mousewheel scrolling
+ of listboxes is broken (29756)
+
+ Reviewed by Dan Bernstein.
+
+ * rendering/RenderListBox.cpp:
+ (WebCore::RenderListBox::scroll):
+ * rendering/RenderListBox.h:
+ * rendering/RenderTextControlSingleLine.cpp:
+ (WebCore::RenderTextControlSingleLine::scroll):
+ * rendering/RenderTextControlSingleLine.h:
+
+2009-10-01 Yury Semikhatsky <yurys@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Make a copy of listeners array before dispatching an event in
+ WebInspector.Object.prototype.dispatchEventToListeners. Otherwise if current
+ listener removes itself from the array next listener will be skipped.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29920
+
+ * inspector/front-end/Object.js:
+ (WebInspector.Object.prototype.dispatchEventToListeners): make a copy of listeners array before dispatching an event
+
+2009-10-01 Martin Robinson <martin.james.robinson@gmail.com>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] GtkIMContext filtering interferes with DOM key events
+ https://bugs.webkit.org/show_bug.cgi?id=28733
+
+ Ensure that keyboard events filtered by the GtkIMContext still create
+ the proper DOM events.
+
+ No tests added. Instead previously skipped tests have been enabled.
+
+ * platform/gtk/KeyEventGtk.cpp:
+ (WebCore::keyIdentifierForGdkKeyCode):
+ (WebCore::singleCharacterString):
+
+2009-10-01 Philippe Normand <pnormand@igalia.com>
+
+ Reviewed by Xan Lopez.
+
+ [GTK] data: uri support in media player
+ https://bugs.webkit.org/show_bug.cgi?id=29842
+
+ New GStreamer element to handle data: uris. For now only base64
+ encoded data is supported. Decoded data is handed over to
+ giostreamsrc.
+
+ * GNUmakefile.am:
+ * platform/graphics/gtk/DataSourceGStreamer.cpp: Added.
+ (_do_init):
+ (webkit_data_src_base_init):
+ (webkit_data_src_class_init):
+ (webkit_data_src_reset):
+ (webkit_data_src_init):
+ (webkit_data_src_finalize):
+ (webkit_data_src_uri_get_type):
+ (webkit_data_src_uri_get_protocols):
+ (webkit_data_src_uri_get_uri):
+ (webkit_data_src_uri_set_uri):
+ (webkit_data_src_uri_handler_init):
+ * platform/graphics/gtk/DataSourceGStreamer.h: Added.
+ * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::do_gst_init):
+ (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
+ (WebCore::MediaPlayerPrivate::mimeTypeCache):
+
+2009-09-30 Daniel Bates <dbates@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29944
+
+ Reduces false positives in the XSSAuditor by explicitly allowing requests
+ that do not contain illegal URI characters.
+
+ As a side effect of this change, the tests property-inject.html,
+ property-escape-noquotes.html, and property-escape-noquotes-tab-slash-chars.html
+ fail because these attacks do not contain any illegal URI characters and
+ thus are now allowed by the XSSAuditor, where previously they weren't. A future
+ change may reinstate this functionality.
+
+ Tests: http/tests/security/xssAuditor/script-tag-safe2.html
+ http/tests/security/xssAuditor/script-tag-safe3.html
+
+ * page/XSSAuditor.cpp:
+ (WebCore::isIllegalURICharacter): Added method.
+ (WebCore::XSSAuditor::canEvaluate):
+ (WebCore::XSSAuditor::canCreateInlineEventListener):
+ (WebCore::XSSAuditor::findInRequest): Added parameter
+ allowRequestIfNoIllegalURICharacters.
+ * page/XSSAuditor.h:
+
+2009-09-30 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ reproducible freeze and crash on closing form popup at bosch-home.nl
+ https://bugs.webkit.org/show_bug.cgi?id=28948
+
+ showModalDialog calls getDirect on what is actually a window shell,
+ so ends up not getting a value (since no value can ever be placed
+ directly on the shell), which leads to incorrect behaviour.
+
+ We use a manual test rather than automatic as it was not
+ possible to get a modal run loop to work inside DRT.
+
+ * bindings/js/JSDOMWindowCustom.cpp:
+ (WebCore::JSDOMWindow::showModalDialog):
+ * manual-tests/showModalDialog-returnValue.html: manual testcase.
+
+2009-09-30 Kent Tamura <tkent@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Adds ValidityState.tooLong support for <input> and <textarea>.
+
+ Introduces tooLong() in HTMLFormControlElement and it always returns false.
+ HTMLInputElement and HTMLTextAreaElement overrides it and checks the text
+ length and maxLength. tooLong() should work only for `dirty' values.
+ So, introduces m_isDirty flag for HTMLTextAreaElement, and
+ !m_data.value().isNull() works as a dirty flag for HTMLInputElement.
+
+ Renames parameter names of setMaxLength().
+
+ https://bugs.webkit.org/show_bug.cgi?id=27454
+
+ Tests: fast/forms/ValidityState-tooLong-input.html
+ fast/forms/ValidityState-tooLong-textarea.html
+
+ * html/HTMLFormControlElement.h:
+ (WebCore::HTMLFormControlElement::tooLong):
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::tooLong):
+ (WebCore::HTMLInputElement::setMaxLength):
+ * html/HTMLInputElement.h:
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::HTMLTextAreaElement):
+ (WebCore::HTMLTextAreaElement::reset):
+ (WebCore::HTMLTextAreaElement::updateValue):
+ (WebCore::HTMLTextAreaElement::setMaxLength):
+ (WebCore::HTMLTextAreaElement::tooLong):
+ * html/HTMLTextAreaElement.h:
+ * html/ValidityState.h:
+ (WebCore::ValidityState::tooLong):
+
+2009-09-30 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Maciej Stachowiak.
+
+ Factor RedirectScheduler out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=29948
+
+ This change introduces a new sub-object of Frame, redirectScheduler.
+ The redirectScheduler is responsible for scheduling redirects.
+
+ This change leaves the code for the redirectScheduler in
+ FrameLoader.cpp. A future change will move the class into its own
+ file.
+
+ No behavior change (hopefully!).
+
+ * loader/FrameLoader.cpp:
+ (WebCore::RedirectScheduler::RedirectScheduler):
+ (WebCore::RedirectScheduler::~RedirectScheduler):
+ (WebCore::RedirectScheduler::redirectScheduledDuringLoad):
+ (WebCore::RedirectScheduler::clear):
+ (WebCore::FrameLoader::FrameLoader):
+ (WebCore::FrameLoader::setDefersLoading):
+ (WebCore::FrameLoader::stopLoading):
+ (WebCore::FrameLoader::didOpenURL):
+ (WebCore::FrameLoader::didExplicitOpen):
+ (WebCore::FrameLoader::cancelAndClear):
+ (WebCore::FrameLoader::clear):
+ (WebCore::FrameLoader::checkCompleted):
+ (WebCore::FrameLoader::isScheduledLocationChangePending):
+ (WebCore::FrameLoader::scheduleHTTPRedirection):
+ (WebCore::RedirectScheduler::scheduleRedirect):
+ (WebCore::RedirectScheduler::mustLockBackForwardList):
+ (WebCore::FrameLoader::scheduleLocationChange):
+ (WebCore::RedirectScheduler::scheduleLocationChange):
+ (WebCore::FrameLoader::scheduleFormSubmission):
+ (WebCore::RedirectScheduler::scheduleFormSubmission):
+ (WebCore::FrameLoader::scheduleRefresh):
+ (WebCore::RedirectScheduler::scheduleRefresh):
+ (WebCore::RedirectScheduler::locationChangePending):
+ (WebCore::FrameLoader::scheduleHistoryNavigation):
+ (WebCore::RedirectScheduler::scheduleHistoryNavigation):
+ (WebCore::RedirectScheduler::timerFired):
+ (WebCore::FrameLoader::provisionalLoadStarted):
+ (WebCore::RedirectScheduler::schedule):
+ (WebCore::RedirectScheduler::startTimer):
+ (WebCore::RedirectScheduler::cancel):
+ (WebCore::FrameLoader::completed):
+ (WebCore::FrameLoader::open):
+ * loader/FrameLoader.h:
+ (WebCore::FrameLoader::committedFirstRealDocumentLoad):
+ * page/Frame.cpp:
+ (WebCore::Frame::Frame):
+ (WebCore::Frame::redirectScheduler):
+ * page/Frame.h:
+
+2009-09-30 Maciej Stachowiak <mjs@apple.com>
+
+ Build fix, not reviewed.
+
+ More Windows build fixes for https://bugs.webkit.org/show_bug.cgi?id=29943
+
+ * platform/network/cf/ResourceHandleCFNet.cpp:
+ (WebCore::willSendRequest):
+
+2009-09-30 Maciej Stachowiak <mjs@apple.com>
+
+ Build fix, not reviewed.
+
+ Fix windows build for fix for https://bugs.webkit.org/show_bug.cgi?id=29943
+
+ * platform/network/cf/ResourceHandleCFNet.cpp:
+ (WebCore::willSendRequest):
+
+2009-09-30 Dimitri Glazkov <dglazkov@chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ [V8] HTMLAudioElement, HTMLImageElement, and HTMLOptionElement are constructable, but they shouldn't be.
+ Only Audio, Image, and Option should be constructable.
+ https://bugs.webkit.org/show_bug.cgi?id=29940
+
+ Test: fast/dom/dom-constructor.html
+
+ * WebCore.gypi: Added new files to project.
+ * bindings/scripts/CodeGeneratorV8.pm: Modified to generate custom constructors.
+ * bindings/v8/V8DOMWrapper.cpp:
+ (WebCore::V8DOMWrapper::getTemplate): Removed handling of HTMLImageElement, HTMLOptionElement
+ and HTMLAudioElement construction.
+ * bindings/v8/V8HTMLAudioElementConstructor.h: Added.
+ * bindings/v8/V8HTMLImageElementConstructor.h: Added.
+ * bindings/v8/V8HTMLOptionElementConstructor.h: Added.
+ * bindings/v8/V8Index.cpp: Added new headers.
+ * bindings/v8/V8Index.h: Added Audio, Image and Option decls.
+ * bindings/v8/custom/V8CustomBinding.h: Ditto.
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::ACCESSOR_GETTER): Added custom constructors.
+ * bindings/v8/custom/V8HTMLAudioElementConstructor.cpp:
+ (WebCore::V8HTMLImageElementConstructor::GetTemplate): Added custom template creator.
+ * bindings/v8/custom/V8HTMLOptionElementConstructor.cpp:
+ (WebCore::V8HTMLOptionElementConstructor::GetTemplate): Ditto.
+ * bindings/v8/custom/V8HTMLImageElementConstructor.cpp:
+ (WebCore::V8HTMLImageElementConstructor::GetTemplate): Ditto.
+
+2009-09-30 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Brady Eidson.
+
+ 307 redirects should pass along http body and Content-Type header
+ https://bugs.webkit.org/show_bug.cgi?id=29943
+
+ Follow-up fix for:
+ <rdar://problem/3802660> SAP: 307 (Temporary Redirect) responses should use POST, not GET
+
+ Test: http/tests/loading/resources/redirect-methods-result.php
+
+ * platform/network/cf/ResourceHandleCFNet.cpp:
+ (WebCore::willSendRequest): Pass along http body and Content-Type header.
+ * platform/network/mac/ResourceHandleMac.mm:
+ (-[WebCoreResourceHandleAsDelegate connection:willSendRequest:redirectResponse:]): ditto
+
+2009-09-30 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ Fixed https://bugs.webkit.org/show_bug.cgi?id=29941
+ REGRESSION (r48882-r48888): Many memory leaks on SnowLeopard leaks bot
+
+ Forgot to implement a destructor for JSDOMWindowBaseData, so it was
+ leaking its RefPtr data member.
+
+ * bindings/js/JSDOMWindowBase.cpp:
+ (WebCore::JSDOMWindowBase::destroyJSDOMWindowBaseData):
+ * bindings/js/JSDOMWindowBase.h:
+ (WebCore::JSDOMWindowBase::JSDOMWindowBaseData::JSDOMWindowBaseData::JSDOMWindowBaseData):
+
+2009-09-30 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Tim Hatcher.
+
+ Make sure the removal of user stylesheets results in all of the WebViews being updated to
+ reflect the changes.
+
+ * page/PageGroup.cpp:
+ (WebCore::PageGroup::removeUserContentWithURLForWorld):
+ (WebCore::PageGroup::removeUserContentForWorld):
+
+2009-09-30 Dan Bernstein <mitz@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ REGRESSION(r47440): drop down menus at americanexpress.com disappear on mouse out
+ https://bugs.webkit.org/show_bug.cgi?id=29209
+
+ Test: fast/inline/relative-positioned-overflow.html
+
+ * rendering/InlineFlowBox.cpp:
+ (WebCore::InlineFlowBox::computeVerticalOverflow): Add self-painting
+ inlines to overflow to ensure that they are included in hit-testing.
+
+2009-09-30 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ transforms/3d tests are not run in Release builds
+ https://bugs.webkit.org/show_bug.cgi?id=29827
+
+ Make sure we export the WebCoreHas3DRendering symbol in Release builds,
+ because this symbols is used by run-webkit-tests (via 'nm') to detect whether
+ WebCore was built with ENABLE_3D_RENDERING turned on.
+
+ * DerivedSources.make:
+ * WebCore.3DRendering.exp: Added.
+ * WebCore.xcodeproj/project.pbxproj:
+
+2009-09-30 Jeremy Orlow <jorlow@chromium.org>
+
+ Build fix for QT. Didn't know WebCore.pro existed.
+
+ * WebCore.pro:
+
+2009-09-30 Dave Hyatt <hyatt@apple.com>
+
+ Reviewed by Adam Roben.
+
+ Add a method for removal of user scripts and stylesheets by URL from a specific world.
+
+ * page/PageGroup.cpp:
+ (WebCore::PageGroup::removeUserContentURLForWorld):
+ * page/PageGroup.h:
+
+2009-09-30 Chris Hawk <hawk@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Fix for conditionals in the WebCore gyp file, which contained two separate
+ 'conditions' values for the webcore target. The first entry was ignored,
+ resulting in some missine defines.
+ https://bugs.webkit.org/show_bug.cgi?id=29907
+
+ * WebCore.gyp/WebCore.gyp:
+
+2009-09-21 Jeremy Orlow <jorlow@chromium.org>
+
+ Reviewed by Adam Barth.
+
+ DOM Storage needs to be more careful about where "ThreadSafe" objects are destroyed.
+ https://bugs.webkit.org/show_bug.cgi?id=29265
+
+ DOM Storage needs to be more careful about where "ThreadSafe" objects are
+ destroyed. With the current code, there actually isn't a race condition, but
+ it sure would be easy for someone to introduce one. A bunch of
+ ThreadSafeShared objects have RefPtrs to objects that are NOT ThreadSafeShared
+ objects. If it were possible any of these objects' destructors to be fired off
+ the main thread, then the you'd have a race condition. The code should be more
+ clear and self-documenting about how things related to each other.
+
+ Since the lifetime of a LocalStorageTask is bounded by the LocalStorageThread
+ which is bounded by the StorageSyncManager, StorageAreaImpl, and
+ StorageAreaSync, there's no reason for LocalStorageTask to store anything other
+ than pointers. By breaking this dependency, we can eliminate the risk.
+
+ Note that we _could_ have LocalStorageThread's task queue just store
+ LocalStorageTask*'s rather than RefPtr<LocalStorageTask>s but then we'd need to
+ manually take care of deleting. It'd probably also be possible to change
+ LocalStorageThread around so that it needn't hold onto a reference of itself
+ and have a more deterministic shutdown, but my initial attempts to do so
+ failed, and I decided it wasn't worth changing. The queue is killed before
+ hand, so the thread is 100% impotent before the main thread continues anyway.
+
+ The constructors and destructors of StorageSyncManager, StorageAreaImpl, and
+ StorageAreaSync now have ASSERTs to verify they're running on the main thread.
+ I'm fairly positive that it'd be impossible to hit these asserts and the fact
+ that these classes are no longer ThreadSafeShared should make it clear how
+ they're meant to be used, but I think it's worth it to be extra sure. Of
+ course, ideally, we'd have such an assert every time a ref is incremented or
+ decremented.
+
+ Behavior should be unchanged and this is just an internal code cleanup, so no
+ new tests.
+
+ * storage/LocalStorageTask.cpp:
+ (WebCore::LocalStorageTask::LocalStorageTask):
+ (WebCore::LocalStorageTask::performTask):
+ * storage/LocalStorageTask.h:
+ (WebCore::LocalStorageTask::createImport):
+ (WebCore::LocalStorageTask::createSync):
+ (WebCore::LocalStorageTask::createTerminate):
+ * storage/LocalStorageThread.cpp:
+ (WebCore::LocalStorageThread::scheduleImport):
+ (WebCore::LocalStorageThread::scheduleSync):
+ * storage/LocalStorageThread.h:
+ * storage/StorageArea.h:
+ * storage/StorageAreaImpl.cpp:
+ (WebCore::StorageAreaImpl::~StorageAreaImpl):
+ (WebCore::StorageAreaImpl::StorageAreaImpl):
+ * storage/StorageAreaSync.cpp:
+ (WebCore::StorageAreaSync::StorageAreaSync):
+ (WebCore::StorageAreaSync::~StorageAreaSync):
+ * storage/StorageSyncManager.cpp:
+ (WebCore::StorageSyncManager::StorageSyncManager):
+ (WebCore::StorageSyncManager::~StorageSyncManager):
+ (WebCore::StorageSyncManager::scheduleImport):
+ (WebCore::StorageSyncManager::scheduleSync):
+ * storage/StorageSyncManager.h:
+
+2009-09-28 Jeremy Orlow <jorlow@chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Chromium needs to be able to override the way storage events are delivered
+ https://bugs.webkit.org/show_bug.cgi?id=29655
+
+ Chromium needs to be able to override the way storage events are delivered.
+ This replaced https://bugs.webkit.org/show_bug.cgi?id=29257 because it'll be
+ faster (no vtables and extra allocation) and somewhat cleaner (no dependency
+ injection). This is necessary because Chromium needs to transport events across
+ a process barrier and then dispatch them without use of a Frame*.
+
+ Behavior should not change with this, so no updates to tests.
+
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCoreSources.bkl:
+ * storage/StorageAreaImpl.cpp:
+ (WebCore::StorageAreaImpl::setItem):
+ (WebCore::StorageAreaImpl::removeItem):
+ (WebCore::StorageAreaImpl::clear):
+ * storage/StorageAreaImpl.h:
+ * storage/StorageEventDispatcher.cpp: Copied from WebCore/storage/StorageAreaImpl.cpp.
+ (WebCore::StorageEventDispatcher::dispatch):
+ * storage/StorageEventDispatcher.h: Added. (Well, technically in the other half of this patch.)
+
+2009-09-30 Jian Li <jianli@chromium.org>
+
+ Reviewed by Darin Adler.
+
+ Need to check NULL frame in EventHandler::updateDragAndDrop.
+ https://bugs.webkit.org/show_bug.cgi?id=29929
+
+ Test: http/tests/misc/drag-over-iframe-invalid-source-crash.html
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::updateDragAndDrop):
+
+2009-09-29 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ ASSERTION FAILED: !repaintContainer || repaintContainer == this
+ https://bugs.webkit.org/show_bug.cgi?id=29755
+
+ Generalize the fix for this bug to account for cases where there may be multiple
+ containing blocks between the repaint container, and the container of the element
+ being repainted.
+
+ Test: compositing/repaint/opacity-between-absolute2.html
+
+ * rendering/RenderBox.cpp:
+ (WebCore::RenderBox::mapLocalToContainer):
+ Call offsetFromAncestorContainer() to get the correct offset.
+
+ (WebCore::RenderBox::computeRectForRepaint): Ditto
+ * rendering/RenderInline.cpp:
+ (WebCore::RenderInline::computeRectForRepaint): Ditto.
+
+ * rendering/RenderObject.h:
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::offsetFromAncestorContainer):
+ New method that computes an offset from some object in the ancestor container() chain.
+
+2009-09-30 Andras Becsi <becsi.andras@stud.u-szeged.hu>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Fix TextCodecQt::decode method after r48752 to return a non-null string if the length of the input is 0.
+ This fixes https://bugs.webkit.org/show_bug.cgi?id=29736.
+
+ * platform/text/qt/TextCodecQt.cpp:
+ (WebCore::TextCodecQt::decode):
+
2009-09-29 Dave Hyatt <hyatt@apple.com>
Reviewed by Jon Honeycutt.
@@ -572,7 +9664,7 @@
* platform/network/qt/QNetworkReplyHandler.cpp:
(WebCore::QNetworkReplyHandler::finish):
-009-09-29 Pavel Feldman <pfeldman@chromium.org>
+2009-09-29 Pavel Feldman <pfeldman@chromium.org>
Reviewed by Timothy Hatcher.
@@ -1645,7 +10737,7 @@
can't happen when working with JavaScript since the Element will be kept
alive due to the change above.
(WebCore::NamedNodeMap::addAttribute): Fix function name in comment.
- (WebCore::NamedNodeMap::removeAttribute): Removed unneeded "+ 1" and added
+ (WebCore::NamedNodeMap::removeAttribute): Removed unneeded "1" and added
missing braces.
* dom/NamedAttrMap.h: Made the element function public so it can be used by
@@ -1768,7 +10860,7 @@
1. if the insertion node has a non opaque background color and one of the parent element did have
a solid background color the new paragraph did not have the element with the solid color in the tree.
2. in some circumstances it generated more markup than the original paragraph had (a span with bold, italic,
- background color and some font attribute was being reproduced as span + bold + italic + font as separate tags.
+ background color and some font attribute was being reproduced as span bold italic font as separate tags.
The new approach is to recreate in the new paragraph the same hierarchy of nodes found in the
paragraph where the insertion point is.
@@ -2104,7 +11196,7 @@
Reviewed by Oliver Hunt.
- Implement correct horizontal scrollbar behavior for GTK+ also on
+ Implement correct horizontal scrollbar behavior for GTKalso on
styled scrollbars.
https://bugs.webkit.org/show_bug.cgi?id=29348
@@ -3978,7 +13070,7 @@
2009-09-19 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
- Unreviewed build fix for GTK+ and a blind one for Qt after r48566.
+ Unreviewed build fix for GTKand a blind one for Qt after r48566.
* GNUmakefile.am:
* WebCore.pro:
@@ -4732,7 +13824,7 @@
Reviewed by Oliver Hunt.
<rdar://problem/7007541>
- CrashTracer: 4800+ crashes in Safari at com.apple.WebKit • WTF::HashTableIterator...
+ CrashTracer: 4800crashes in Safari at com.apple.WebKit • WTF::HashTableIterator...
Make RuntimeObjectImp more robust against m_instance being a null (which can happen if an OOP plug-in
crashes while we're calling into it).
@@ -6014,7 +15106,7 @@
Reviewed by Dan Bernstein.
- <rdar://problem/7047282> Safari crashes at WebCore::RenderMenuList::adjustInnerStyle() + 436
+ <rdar://problem/7047282> Safari crashes at WebCore::RenderMenuList::adjustInnerStyle() 436
Avoid a crash when a mouse event handler on a <select> changes the select from a popup
to a list (by setting the 'size' property) inside the event handler.
@@ -7030,7 +16122,7 @@
Reviewed by Gustavo Noronha.
- Build fix for GTK+ after r48267.
+ Build fix for GTKafter r48267.
* platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivate::buffered):
@@ -8071,7 +17163,7 @@
2009-09-08 Xan Lopez <xlopez@igalia.com>
- Unreviewed attempt to fix the GTK+ build.
+ Unreviewed attempt to fix the GTKbuild.
* GNUmakefile.am:
@@ -13737,7 +22829,7 @@
do not set playbin's audio sink.
* platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
* platform/graphics/gtk/VideoSinkGStreamer.cpp:
- (webkit_video_sink_idle_func): Use C++ casts, decrease reference count of async
+ (webkit_video_sink_idle_func): Use C+casts, decrease reference count of async
queue at the end of the idle function.
(webkit_video_sink_render): Increase reference count of async queue.
(webkit_video_sink_stop): Remove any idle functions with the sink as data.
@@ -15498,7 +24590,7 @@
Reviewed by Eric Seidel.
- Add 'icu::' qualifier when refering to ICU C++ names to the other
+ Add 'icu::' qualifier when refering to ICU C+names to the other
file with this issue missed in the previous check-in.
https://bugs.webkit.org/show_bug.cgi?id=28410
@@ -15781,7 +24873,7 @@
Reviewed by Eric Seidel
- Add 'icu::' qualifier when refering to ICU C++ names.
+ Add 'icu::' qualifier when refering to ICU C+names.
https://bugs.webkit.org/show_bug.cgi?id=28410
@@ -19959,7 +29051,7 @@ form controls that have different validity states.
Reviewed by Sam Weinig.
<rdar://problem/6952336>
- CrashTracer: [USER] 3 crashes in Safari at com.apple.WebCore • WebCore::SecurityOrigin::canAccess const + 27
+ CrashTracer: [USER] 3 crashes in Safari at com.apple.WebCore • WebCore::SecurityOrigin::canAccess const 27
Make sure to set the security origin before calling dispatchWindowObjectAvailable.
@@ -20283,11 +29375,11 @@ form controls that have different validity states.
Reviewed by Darin Adler.
https://bugs.webkit.org/show_bug.cgi?id=28204
- Allow C++ exceptions to be disabled in WebCore's V8 Mac build.
+ Allow C+exceptions to be disabled in WebCore's V8 Mac build.
* WebCorePrefix.h:
Only undefine |try| and |catch| when building Objective-C[++],
- leaving the C++ library definitions intact for C++.
+ leaving the C+library definitions intact for C++.
2009-08-12 Nate Chapin <japhet@chromium.org>
@@ -21337,7 +30429,7 @@ form controls that have different validity states.
Reviewed by Darin Fisher.
- Cleanup DOM Storage namespace shutdown code + usage of security origin.
+ Cleanup DOM Storage namespace shutdown code usage of security origin.
https://bugs.webkit.org/show_bug.cgi?id=28094
If a storage namespace is not explicitly closed, be sure to do so on
@@ -21444,7 +30536,7 @@ form controls that have different validity states.
2009-08-10 Xan Lopez <xlopez@igalia.com>
- Fix GTK+ build.
+ Fix GTKbuild.
* platform/network/soup/ResourceHandleSoup.cpp:
(WebCore::):
@@ -21458,7 +30550,7 @@ form controls that have different validity states.
* platform/graphics/GlyphBuffer.h: Removed advanceData().
* platform/graphics/wince/GraphicsContextWince.cpp:
(WebCore::GraphicsContext::drawText): Changed to use advances(from)
- instead of advanceData() + from.
+ instead of advanceData() from.
2009-08-10 Xan Lopez <xlopez@igalia.com>
@@ -21771,7 +30863,7 @@ form controls that have different validity states.
Modify FrameLoadType enum to match the order of WebFrameLoadType in WebFramePrivate.h / IWebFramePrivate.idl.
The mac/win public API exposes the old 'FrameLoadTypeReloadAllowingStaleData' value, which resides between
- 'FrameLoadTypeReload' and 'FrameLoadTypeSame'. Work around this problem, by assigning 'FrameLoadTypeSame = FrameLoadTypeReload + 2'.
+ 'FrameLoadTypeReload' and 'FrameLoadTypeSame'. Work around this problem, by assigning 'FrameLoadTypeSame = FrameLoadTypeReload 2'.
Add a note to the FrameLoadType enum to keep it in sync with WebFramePrivate.h & IWebFramePrivate.idl.
@@ -29081,7 +38173,7 @@ form controls that have different validity states.
I decided to change these to Base:: instead of DOMObjectWithGlobal::
for future-proofing. All autogenerated classes use a typedef Base
- to avoid bugs like these. Sadly C++ does not have a built-in super:: we could use.
+ to avoid bugs like these. Sadly C+does not have a built-in super:: we could use.
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSAbstractWorkerCustom.cpp:
@@ -29949,7 +39041,7 @@ form controls that have different validity states.
2009-07-22 Xan Lopez <xlopez@igalia.com>
- Attempt to fix the GTK+ build.
+ Attempt to fix the GTKbuild.
* GNUmakefile.am:
@@ -36010,7 +45102,7 @@ form controls that have different validity states.
Crash in RenderMedia::styleDidChange.
<rdar://problem/7044313> CrashTracer: quicklook crashed generating thumbnail for page with
- media element (RenderMedia::styleDidChange + 115)
+ media element (RenderMedia::styleDidChange 115)
Speculative fix for crash in styleDidChange. Null check controller elements before tell
them to update style.
@@ -37128,7 +46220,7 @@ form controls that have different validity states.
Not reviewed, Chromium build fix.
- Add in missing header + fix syntax issue that crept into last patch.
+ Add in missing header fix syntax issue that crept into last patch.
https://bugs.webkit.org/show_bug.cgi?id=27027
* rendering/RenderThemeChromiumMac.mm:
@@ -37959,7 +47051,7 @@ form controls that have different validity states.
Report the caret offset from the end of the selection, otherwise
we'll report the same offset when moving the caret while
- modififying the selection (eg, with Shift + Right).
+ modififying the selection (eg, with Shift Right).
* editing/gtk/SelectionControllerGtk.cpp:
(WebCore::SelectionController::notifyAccessibilityForSelectionChange):
@@ -39228,7 +48320,7 @@ form controls that have different validity states.
Reviewed by Geoff Garen.
- <rdar://problem/6960286> CrashTracer: [REGRESSION] 1120 crashes in Safari at com.apple.WebCore WebCore::JSLazyEventListener::parseCode const + 62
+ <rdar://problem/6960286> CrashTracer: [REGRESSION] 1120 crashes in Safari at com.apple.WebCore WebCore::JSLazyEventListener::parseCode const 62
<select> elements and other elements the produce popups can keep their popups
live across a page load. If this occurs and the <select> element has an
@@ -39884,7 +48976,7 @@ form controls that have different validity states.
Reviewed by Jan Alonzo.
- [GTK] Don't use deprecated GTK+ symbols.
+ [GTK] Don't use deprecated GTKsymbols.
https://bugs.webkit.org/show_bug.cgi?id=26583
* plugins/gtk/gtk2xtbin.c:
@@ -45377,7 +54469,7 @@ form controls that have different validity states.
Reviewed by Brady Eidson.
- <rdar://problem/6660037> CrashTracer: [USER] 46 crashes in Safari at com.apple.WebCore • WebCore::CachedCSSStyleSheet::addClient + 53
+ <rdar://problem/6660037> CrashTracer: [USER] 46 crashes in Safari at com.apple.WebCore • WebCore::CachedCSSStyleSheet::addClient 53
When revalidating a resource, calling addClient() on one client might cause another to get removed.
@@ -45439,7 +54531,7 @@ form controls that have different validity states.
Update of https://bugs.webkit.org/show_bug.cgi?id=26353.
Provide an assignment operator to avoid improper reference
counts on the Cairo font objects. This brings the Windows
- Cairo port in line with the GTK+ port.
+ Cairo port in line with the GTKport.
* platform/graphics/win/FontPlatformData.h:
* platform/graphics/win/FontPlatformDataCairoWin.cpp:
diff --git a/src/3rdparty/webkit/WebCore/DerivedSources.cpp b/src/3rdparty/webkit/WebCore/DerivedSources.cpp
index 2131793..be83136 100644
--- a/src/3rdparty/webkit/WebCore/DerivedSources.cpp
+++ b/src/3rdparty/webkit/WebCore/DerivedSources.cpp
@@ -28,6 +28,7 @@
#include "JSAbstractWorker.cpp"
#include "JSAttr.cpp"
#include "JSBarInfo.cpp"
+#include "JSBeforeLoadEvent.cpp"
#include "JSCanvasGradient.cpp"
#include "JSCanvasPattern.cpp"
#include "JSCanvasRenderingContext.cpp"
@@ -243,6 +244,7 @@
#include "JSSVGFEImageElement.cpp"
#include "JSSVGFEMergeElement.cpp"
#include "JSSVGFEMergeNodeElement.cpp"
+#include "JSSVGFEMorphologyElement.cpp"
#include "JSSVGFEOffsetElement.cpp"
#include "JSSVGFEPointLightElement.cpp"
#include "JSSVGFESpecularLightingElement.cpp"
diff --git a/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ExceptionHelpers.h b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ExceptionHelpers.h
new file mode 100644
index 0000000..661c61a
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/ExceptionHelpers.h
@@ -0,0 +1,4 @@
+#ifndef WebCore_FWD_ExceptionHelpers_h
+#define WebCore_FWD_ExceptionHelpers_h
+#include <JavaScriptCore/ExceptionHelpers.h>
+#endif
diff --git a/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSCell.h b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSCell.h
new file mode 100644
index 0000000..83a1575
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSCell.h
@@ -0,0 +1,4 @@
+#ifndef WebCore_FWD_JSCell_h
+#define WebCore_FWD_JSCell_h
+#include <JavaScriptCore/JSCell.h>
+#endif
diff --git a/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StructureChain.h b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StructureChain.h
new file mode 100644
index 0000000..7c60fa7
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/StructureChain.h
@@ -0,0 +1,5 @@
+#ifndef WebCore_FWD_StructureChain_h
+#define WebCore_FWD_StructureChain_h
+#include <JavaScriptCore/StructureChain.h>
+#endif
+
diff --git a/src/3rdparty/webkit/WebCore/WebCore.3DRendering.exp b/src/3rdparty/webkit/WebCore/WebCore.3DRendering.exp
new file mode 100644
index 0000000..4a84c63
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/WebCore.3DRendering.exp
@@ -0,0 +1 @@
+_WebCoreHas3DRendering
diff --git a/src/3rdparty/webkit/WebCore/WebCore.SVG.Filters.exp b/src/3rdparty/webkit/WebCore/WebCore.SVG.Filters.exp
index b0244db..5698258 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.SVG.Filters.exp
+++ b/src/3rdparty/webkit/WebCore/WebCore.SVG.Filters.exp
@@ -15,6 +15,7 @@
.objc_class_name_DOMSVGFEImageElement
.objc_class_name_DOMSVGFEMergeElement
.objc_class_name_DOMSVGFEMergeNodeElement
+.objc_class_name_DOMSVGFEMorphologyElement
.objc_class_name_DOMSVGFEOffsetElement
.objc_class_name_DOMSVGFEPointLightElement
.objc_class_name_DOMSVGFESpecularLightingElement
diff --git a/src/3rdparty/webkit/WebCore/WebCore.Video.exp b/src/3rdparty/webkit/WebCore/WebCore.Video.exp
new file mode 100644
index 0000000..5d35698
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/WebCore.Video.exp
@@ -0,0 +1,14 @@
+__ZN7WebCore16HTMLMediaElement4playEv
+__ZN7WebCore16HTMLMediaElement5pauseEv
+__ZNK7WebCore16HTMLMediaElement6volumeEv
+__ZNK7WebCore16HTMLMediaElement7canPlayEv
+__ZNK7WebCore16HTMLMediaElement8durationEv
+__ZNK7WebCore16HTMLMediaElement5mutedEv
+__ZN7WebCore16HTMLMediaElement8setMutedEb
+__ZN7WebCore16HTMLMediaElement9setVolumeEfRi
+__ZN7WebCore16HTMLMediaElement6rewindEf
+__ZN7WebCore16HTMLMediaElement10screenRectEv
+__ZNK7WebCore16HTMLMediaElement11currentTimeEv
+__ZNK7WebCore16HTMLMediaElement13platformMediaEv
+__ZN7WebCore16HTMLMediaElement14setCurrentTimeEfRi
+__ZN7WebCore16HTMLMediaElement14exitFullscreenEv
diff --git a/src/3rdparty/webkit/WebCore/WebCore.gypi b/src/3rdparty/webkit/WebCore/WebCore.gypi
index 43e739c..c0da0ec 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.gypi
+++ b/src/3rdparty/webkit/WebCore/WebCore.gypi
@@ -31,6 +31,7 @@
'css/WebKitCSSMatrix.idl',
'css/WebKitCSSTransformValue.idl',
'dom/Attr.idl',
+ 'dom/BeforeLoadEvent.idl',
'dom/CDATASection.idl',
'dom/CharacterData.idl',
'dom/ClientRect.idl',
@@ -76,6 +77,7 @@
'dom/WebKitAnimationEvent.idl',
'dom/WebKitTransitionEvent.idl',
'dom/WheelEvent.idl',
+ 'html/canvas/CanvasActiveInfo.idl',
'html/canvas/CanvasArray.idl',
'html/canvas/CanvasArrayBuffer.idl',
'html/canvas/CanvasBuffer.idl',
@@ -258,6 +260,7 @@
'svg/SVGFEImageElement.idl',
'svg/SVGFEMergeElement.idl',
'svg/SVGFEMergeNodeElement.idl',
+ 'svg/SVGFEMorphologyElement.idl',
'svg/SVGFEOffsetElement.idl',
'svg/SVGFEPointLightElement.idl',
'svg/SVGFESpecularLightingElement.idl',
@@ -345,7 +348,6 @@
'svg/SVGTransform.idl',
'svg/SVGTransformList.idl',
'svg/SVGTransformable.idl',
- 'svg/SVGURIReference.idl',
'svg/SVGUnitTypes.idl',
'svg/SVGUseElement.idl',
'svg/SVGViewElement.idl',
@@ -428,6 +430,8 @@
'bindings/js/DOMObjectWithSVGContext.h',
'bindings/js/GCController.cpp',
'bindings/js/GCController.h',
+ 'bindings/js/JSCallbackData.cpp',
+ 'bindings/js/JSCallbackData.h',
'bindings/js/JSAttrCustom.cpp',
'bindings/js/JSAudioConstructor.cpp',
'bindings/js/JSAudioConstructor.h',
@@ -482,6 +486,8 @@
'bindings/js/JSEventListener.h',
'bindings/js/JSEventTarget.cpp',
'bindings/js/JSEventTarget.h',
+ 'bindings/js/JSExceptionBase.cpp',
+ 'bindings/js/JSExceptionBase.h',
'bindings/js/JSGeolocationCustom.cpp',
'bindings/js/JSHistoryCustom.cpp',
'bindings/js/JSHistoryCustom.h',
@@ -622,6 +628,7 @@
'bindings/js/StringSourceProvider.h',
'bindings/js/WorkerScriptController.cpp',
'bindings/js/WorkerScriptController.h',
+ 'bindings/ScriptControllerBase.cpp',
'bindings/v8/ChildThreadDOMData.cpp',
'bindings/v8/ChildThreadDOMData.h',
'bindings/v8/custom/V8AbstractWorkerCustom.cpp',
@@ -669,6 +676,7 @@
'bindings/v8/custom/V8EventCustom.cpp',
'bindings/v8/custom/V8FileListCustom.cpp',
'bindings/v8/custom/V8HTMLAudioElementConstructor.cpp',
+ 'bindings/v8/custom/V8HTMLAudioElementConstructor.h',
'bindings/v8/custom/V8HTMLCanvasElementCustom.cpp',
'bindings/v8/custom/V8HTMLCollectionCustom.cpp',
'bindings/v8/custom/V8HTMLDataGridElementCustom.cpp',
@@ -678,8 +686,10 @@
'bindings/v8/custom/V8HTMLFrameSetElementCustom.cpp',
'bindings/v8/custom/V8HTMLIFrameElementCustom.cpp',
'bindings/v8/custom/V8HTMLImageElementConstructor.cpp',
+ 'bindings/v8/custom/V8HTMLImageElementConstructor.h',
'bindings/v8/custom/V8HTMLInputElementCustom.cpp',
'bindings/v8/custom/V8HTMLOptionElementConstructor.cpp',
+ 'bindings/v8/custom/V8HTMLOptionElementConstructor.h',
'bindings/v8/custom/V8HTMLOptionsCollectionCustom.cpp',
'bindings/v8/custom/V8HTMLPlugInElementCustom.cpp',
'bindings/v8/custom/V8HTMLSelectElementCollectionCustom.cpp',
@@ -761,8 +771,11 @@
'bindings/v8/ScriptState.h',
'bindings/v8/ScriptState.cpp',
'bindings/v8/ScriptString.h',
+ 'bindings/v8/ScriptStringImpl.cpp',
+ 'bindings/v8/ScriptStringImpl.h',
'bindings/v8/ScriptValue.cpp',
'bindings/v8/ScriptValue.h',
+ 'bindings/v8/SerializedScriptValue.h',
'bindings/v8/StaticDOMDataStore.cpp',
'bindings/v8/StaticDOMDataStore.h',
'bindings/v8/V8AbstractEventListener.cpp',
@@ -799,8 +812,6 @@
'bindings/v8/V8NPUtils.h',
'bindings/v8/V8NodeFilterCondition.cpp',
'bindings/v8/V8NodeFilterCondition.h',
- 'bindings/v8/V8ObjectEventListener.cpp',
- 'bindings/v8/V8ObjectEventListener.h',
'bindings/v8/V8Proxy.cpp',
'bindings/v8/V8Proxy.h',
'bindings/v8/V8SVGPODTypeWrapper.h',
@@ -808,8 +819,6 @@
'bindings/v8/V8Utilities.h',
'bindings/v8/V8WorkerContextEventListener.cpp',
'bindings/v8/V8WorkerContextEventListener.h',
- 'bindings/v8/V8WorkerContextObjectEventListener.cpp',
- 'bindings/v8/V8WorkerContextObjectEventListener.h',
'bindings/v8/WorkerContextExecutionProxy.h',
'bindings/v8/WorkerContextExecutionProxy.cpp',
'bindings/v8/WorkerScriptController.h',
@@ -961,6 +970,7 @@
'dom/Attribute.h',
'dom/BeforeTextInsertedEvent.cpp',
'dom/BeforeTextInsertedEvent.h',
+ 'dom/BeforeLoadEvent.h',
'dom/BeforeUnloadEvent.cpp',
'dom/BeforeUnloadEvent.h',
'dom/CDATASection.cpp',
@@ -1611,6 +1621,8 @@
'loader/FrameLoader.h',
'loader/FrameLoaderClient.h',
'loader/FrameLoaderTypes.h',
+ 'loader/HistoryController.cpp',
+ 'loader/HistoryController.h',
'loader/ImageDocument.cpp',
'loader/ImageDocument.h',
'loader/ImageLoader.cpp',
@@ -1627,12 +1639,20 @@
'loader/PlaceholderDocument.h',
'loader/PluginDocument.cpp',
'loader/PluginDocument.h',
+ 'loader/PolicyCallback.cpp',
+ 'loader/PolicyCallback.h',
+ 'loader/PolicyChecker.cpp',
+ 'loader/PolicyChecker.h',
'loader/ProgressTracker.cpp',
'loader/ProgressTracker.h',
+ 'loader/RedirectScheduler.cpp',
+ 'loader/RedirectScheduler.h',
'loader/Request.cpp',
'loader/Request.h',
'loader/ResourceLoader.cpp',
'loader/ResourceLoader.h',
+ 'loader/ResourceLoadNotifier.cpp',
+ 'loader/ResourceLoadNotifier.h',
'loader/SubresourceLoader.cpp',
'loader/SubresourceLoader.h',
'loader/SubresourceLoaderClient.h',
@@ -1823,7 +1843,7 @@
'platform/chromium/KeyboardCodesWin.h',
'platform/chromium/Language.cpp',
'platform/chromium/LinkHashChromium.cpp',
- 'platform/chromium/MimeTypeRegistryChromium.cpp',
+ 'platform/chromium/MIMETypeRegistryChromium.cpp',
'platform/chromium/PasteboardChromium.cpp',
'platform/chromium/PasteboardPrivate.h',
'platform/chromium/PlatformCursor.h',
@@ -1921,6 +1941,8 @@
'platform/graphics/filters/FEComponentTransfer.h',
'platform/graphics/filters/FEComposite.cpp',
'platform/graphics/filters/FEComposite.h',
+ 'platform/graphics/filters/FEGaussianBlur.cpp',
+ 'platform/graphics/filters/FEGaussianBlur.h',
'platform/graphics/filters/SourceAlpha.cpp',
'platform/graphics/filters/SourceAlpha.h',
'platform/graphics/filters/SourceGraphic.cpp',
@@ -2935,6 +2957,8 @@
'rendering/RenderMarquee.h',
'rendering/RenderMedia.cpp',
'rendering/RenderMedia.h',
+ 'rendering/RenderMediaControlsChromium.cpp',
+ 'rendering/RenderMediaControlsChromium.h',
'rendering/RenderMenuList.cpp',
'rendering/RenderMenuList.h',
'rendering/RenderObject.cpp',
@@ -3105,6 +3129,7 @@
'storage/StorageAreaSync.h',
'storage/StorageEvent.cpp',
'storage/StorageEvent.h',
+ 'storage/StorageEventDispatcher.cpp',
'storage/StorageEventDispatcher.h',
'storage/StorageMap.cpp',
'storage/StorageMap.h',
@@ -3129,8 +3154,6 @@
'svg/graphics/filters/SVGFEDisplacementMap.h',
'svg/graphics/filters/SVGFEFlood.cpp',
'svg/graphics/filters/SVGFEFlood.h',
- 'svg/graphics/filters/SVGFEGaussianBlur.cpp',
- 'svg/graphics/filters/SVGFEGaussianBlur.h',
'svg/graphics/filters/SVGFEImage.cpp',
'svg/graphics/filters/SVGFEImage.h',
'svg/graphics/filters/SVGFEMerge.cpp',
@@ -3275,6 +3298,8 @@
'svg/SVGFEMergeElement.h',
'svg/SVGFEMergeNodeElement.cpp',
'svg/SVGFEMergeNodeElement.h',
+ 'svg/SVGFEMorphologyElement.cpp',
+ 'svg/SVGFEMorphologyElement.h',
'svg/SVGFEOffsetElement.cpp',
'svg/SVGFEOffsetElement.h',
'svg/SVGFEPointLightElement.cpp',
@@ -3456,6 +3481,8 @@
'svg/SVGZoomAndPan.h',
'svg/SVGZoomEvent.cpp',
'svg/SVGZoomEvent.h',
+ 'svg/SynchronizablePropertyController.cpp',
+ 'svg/SynchronizablePropertyController.h',
'svg/SynchronizableTypeWrapper.h',
'websockets/WebSocket.cpp',
'websockets/WebSocket.h',
@@ -3470,8 +3497,6 @@
'workers/DedicatedWorkerContext.h',
'workers/DedicatedWorkerThread.cpp',
'workers/DedicatedWorkerThread.h',
- 'workers/DefaultSharedWorkerRepository.cpp',
- 'workers/DefaultSharedWorkerRepository.h',
'workers/GenericWorkerTask.h',
'workers/SharedWorker.cpp',
'workers/SharedWorker.h',
@@ -3613,6 +3638,7 @@
'inspector/front-end/StoragePanel.js',
'inspector/front-end/StylesSidebarPane.js',
'inspector/front-end/SummaryBar.js',
+ 'inspector/front-end/TestController.js',
'inspector/front-end/TextPrompt.js',
'inspector/front-end/TimelineAgent.js',
'inspector/front-end/TopDownProfileDataGridTree.js',
@@ -3621,6 +3647,7 @@
'inspector/front-end/View.js',
'inspector/front-end/WatchExpressionsSidebarPane.js',
'inspector/front-end/inspector.css',
+ 'inspector/front-end/inspectorSyntaxHighlight.css',
],
'webinspector_image_files': [
diff --git a/src/3rdparty/webkit/WebCore/WebCore.order b/src/3rdparty/webkit/WebCore/WebCore.order
index ff42e26..c1040e2 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.order
+++ b/src/3rdparty/webkit/WebCore/WebCore.order
@@ -7851,6 +7851,7 @@ __ZN3WTF9HashTableIPN7WebCore4PageES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3
__ZN3WTF9HashTableIPN7WebCore4PageES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E47removeAndInvalida
__ZN3WTF9HashTableIPN7WebCore4PageES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6removeEPS3_
__ZN7WebCore19InspectorController22inspectedPageDestroyedEv
+__ZN7WebCore19InspectorController25evaluateForTestInFrontendElRKNS_6StringE
__ZN7WebCore19InspectorController5closeEv
__ZN7WebCore15BackForwardList5closeEv
__ZN3WTF6VectorINS_6RefPtrIN7WebCore11HistoryItemEEELm0EE14shrinkCapacityEm
diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro
index 1c39bb8..f321aad 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.pro
+++ b/src/3rdparty/webkit/WebCore/WebCore.pro
@@ -87,6 +87,19 @@ win32-g++ {
QMAKE_LIBDIR_POST += $$split(TMPPATH,";")
}
+# Temporary workaround to pick up the DEF file from the same place as all the others
+symbian {
+ shared {
+ MMP_RULES -= defBlock
+
+ MMP_RULES += "$${LITERAL_HASH}ifdef WINSCW" \
+ "DEFFILE ../../../s60installs/bwins/$${TARGET}.def" \
+ "$${LITERAL_HASH}elif defined EABI" \
+ "DEFFILE ../../../s60installs/eabi/$${TARGET}.def" \
+ "$${LITERAL_HASH}endif"
+ }
+}
+
# Assume that symbian OS always comes with sqlite
symbian:!CONFIG(QTDIR_build): CONFIG += system-sqlite
@@ -164,7 +177,7 @@ contains(DEFINES, ENABLE_SINGLE_THREADED=1) {
# Nescape plugins support (NPAPI)
!contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=.) {
- unix|win32-*:!embedded:!wince*:!symbian {
+ unix|win32-*:!embedded:!wince*: {
DEFINES += ENABLE_NETSCAPE_PLUGIN_API=1
} else {
DEFINES += ENABLE_NETSCAPE_PLUGIN_API=0
@@ -296,7 +309,8 @@ STYLESHEETS_EMBED = \
$$PWD/css/svg.css \
$$PWD/css/view-source.css \
$$PWD/css/wml.css \
- $$PWD/css/mediaControls.css
+ $$PWD/css/mediaControls.css \
+ $$PWD/css/mediaControlsQt.css
DOMLUT_FILES += \
bindings/js/JSDOMWindowBase.cpp \
@@ -330,6 +344,7 @@ IDL_BINDINGS += \
css/WebKitCSSMatrix.idl \
css/WebKitCSSTransformValue.idl \
dom/Attr.idl \
+ dom/BeforeLoadEvent.idl \
dom/CharacterData.idl \
dom/ClientRect.idl \
dom/ClientRectList.idl \
@@ -545,6 +560,7 @@ IDL_BINDINGS += \
svg/SVGFEImageElement.idl \
svg/SVGFEMergeElement.idl \
svg/SVGFEMergeNodeElement.idl \
+ svg/SVGFEMorphologyElement.idl \
svg/SVGFEOffsetElement.idl \
svg/SVGFEPointLightElement.idl \
svg/SVGFESpecularLightingElement.idl \
@@ -669,6 +685,7 @@ SOURCES += \
accessibility/AccessibilityTableRow.cpp \
accessibility/AXObjectCache.cpp \
bindings/js/GCController.cpp \
+ bindings/js/JSCallbackData.cpp \
bindings/js/JSAttrCustom.cpp \
bindings/js/JSCDATASectionCustom.cpp \
bindings/js/JSCanvasRenderingContextCustom.cpp \
@@ -697,6 +714,7 @@ SOURCES += \
bindings/js/JSEventSourceConstructor.cpp \
bindings/js/JSEventSourceCustom.cpp \
bindings/js/JSEventTarget.cpp \
+ bindings/js/JSExceptionBase.cpp \
bindings/js/JSGeolocationCustom.cpp \
bindings/js/JSHTMLAllCollection.cpp \
bindings/js/JSHistoryCustom.cpp \
@@ -763,6 +781,8 @@ SOURCES += \
bindings/js/ScriptState.cpp \
bindings/js/ScriptValue.cpp \
bindings/js/ScheduledAction.cpp \
+ bindings/js/SerializedScriptValue.cpp \
+ bindings/ScriptControllerBase.cpp \
bridge/IdentifierRep.cpp \
bridge/NP_jsobject.cpp \
bridge/npruntime.cpp \
@@ -1097,6 +1117,7 @@ SOURCES += \
loader/DocumentThreadableLoader.cpp \
loader/FormState.cpp \
loader/FrameLoader.cpp \
+ loader/HistoryController.cpp \
loader/FTPDirectoryDocument.cpp \
loader/FTPDirectoryParser.cpp \
loader/icon/IconLoader.cpp \
@@ -1109,9 +1130,13 @@ SOURCES += \
loader/NetscapePlugInStreamLoader.cpp \
loader/PlaceholderDocument.cpp \
loader/PluginDocument.cpp \
+ loader/PolicyCallback.cpp \
+ loader/PolicyChecker.cpp \
loader/ProgressTracker.cpp \
+ loader/RedirectScheduler.cpp \
loader/Request.cpp \
loader/ResourceLoader.cpp \
+ loader/ResourceLoadNotifier.cpp \
loader/SubresourceLoader.cpp \
loader/TextDocument.cpp \
loader/TextResourceDecoder.cpp \
@@ -1174,6 +1199,7 @@ SOURCES += \
platform/DragImage.cpp \
platform/FileChooser.cpp \
platform/GeolocationService.cpp \
+ platform/image-decoders/qt/RGBA32BufferQt.cpp \
platform/graphics/FontDescription.cpp \
platform/graphics/FontFamily.cpp \
platform/graphics/BitmapImage.cpp \
@@ -1367,6 +1393,7 @@ HEADERS += \
bindings/js/CachedScriptSourceProvider.h \
bindings/js/DOMObjectWithSVGContext.h \
bindings/js/GCController.h \
+ bindings/js/JSCallbackData.h \
bindings/js/JSAudioConstructor.h \
bindings/js/JSCSSStyleDeclarationCustom.h \
bindings/js/JSCustomPositionCallback.h \
@@ -1427,6 +1454,7 @@ HEADERS += \
bindings/js/ScriptSourceProvider.h \
bindings/js/ScriptState.h \
bindings/js/ScriptValue.h \
+ bindings/js/SerializedScriptValue.h \
bindings/js/StringSourceProvider.h \
bindings/js/WorkerScriptController.h \
bridge/c/c_class.h \
@@ -1850,6 +1878,7 @@ HEADERS += \
platform/DragImage.h \
platform/FileChooser.h \
platform/GeolocationService.h \
+ platform/image-decoders/ImageDecoder.h \
platform/mock/GeolocationServiceMock.h \
platform/graphics/BitmapImage.h \
platform/graphics/Color.h \
@@ -2085,7 +2114,6 @@ HEADERS += \
svg/graphics/filters/SVGFEDiffuseLighting.h \
svg/graphics/filters/SVGFEDisplacementMap.h \
svg/graphics/filters/SVGFEFlood.h \
- svg/graphics/filters/SVGFEGaussianBlur.h \
svg/graphics/filters/SVGFEImage.h \
svg/graphics/filters/SVGFEMerge.h \
svg/graphics/filters/SVGFEMorphology.h \
@@ -2149,6 +2177,7 @@ HEADERS += \
svg/SVGFELightElement.h \
svg/SVGFEMergeElement.h \
svg/SVGFEMergeNodeElement.h \
+ svg/SVGFEMorphologyElement.h \
svg/SVGFEOffsetElement.h \
svg/SVGFEPointLightElement.h \
svg/SVGFESpecularLightingElement.h \
@@ -2236,6 +2265,7 @@ HEADERS += \
svg/SVGViewSpec.h \
svg/SVGZoomAndPan.h \
svg/SVGZoomEvent.h \
+ svg/SynchronizablePropertyController.h \
wml/WMLAccessElement.h \
wml/WMLAElement.h \
wml/WMLAnchorElement.h \
@@ -2333,7 +2363,6 @@ SOURCES += \
platform/graphics/qt/ImageBufferQt.cpp \
platform/graphics/qt/ImageDecoderQt.cpp \
platform/graphics/qt/ImageQt.cpp \
- platform/graphics/qt/ImageSourceQt.cpp \
platform/graphics/qt/IntPointQt.cpp \
platform/graphics/qt/IntRectQt.cpp \
platform/graphics/qt/IntSizeQt.cpp \
@@ -2443,46 +2472,61 @@ contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=1) {
SOURCES += plugins/npapi.cpp
- unix {
- DEFINES += ENABLE_PLUGIN_PACKAGE_SIMPLE_HASH=1
+ symbian {
+ SOURCES += \
+ plugins/symbian/PluginPackageSymbian.cpp \
+ plugins/symbian/PluginDatabaseSymbian.cpp \
+ plugins/symbian/PluginViewSymbian.cpp \
+ plugins/symbian/PluginContainerSymbian.cpp
- mac {
- SOURCES += \
- plugins/mac/PluginPackageMac.cpp \
- plugins/mac/PluginViewMac.cpp
- OBJECTIVE_SOURCES += \
- platform/text/mac/StringImplMac.mm \
- platform/mac/WebCoreNSStringExtras.mm
- INCLUDEPATH += platform/mac
- # Note: XP_MACOSX is defined in npapi.h
- } else {
- !embedded: CONFIG += x11
- SOURCES += \
- plugins/qt/PluginContainerQt.cpp \
- plugins/qt/PluginPackageQt.cpp \
- plugins/qt/PluginViewQt.cpp
- HEADERS += \
- plugins/qt/PluginContainerQt.h
- DEFINES += XP_UNIX
- }
- }
+ HEADERS += \
+ plugins/symbian/PluginContainerSymbian.h \
+ plugins/symbian/npinterface.h
- win32-* {
- INCLUDEPATH += $$PWD/plugins/win
-
- SOURCES += page/win/PageWin.cpp \
- plugins/win/PluginDatabaseWin.cpp \
- plugins/win/PluginPackageWin.cpp \
- plugins/win/PluginMessageThrottlerWin.cpp \
- plugins/win/PluginViewWin.cpp
-
- LIBS += \
- -ladvapi32 \
- -lgdi32 \
- -lshell32 \
- -lshlwapi \
- -luser32 \
- -lversion
+ LIBS += -lefsrv
+
+ } else {
+
+ unix {
+
+ mac {
+ SOURCES += \
+ plugins/mac/PluginPackageMac.cpp \
+ plugins/mac/PluginViewMac.cpp
+ OBJECTIVE_SOURCES += \
+ platform/text/mac/StringImplMac.mm \
+ platform/mac/WebCoreNSStringExtras.mm
+ INCLUDEPATH += platform/mac
+ # Note: XP_MACOSX is defined in npapi.h
+ } else {
+ !embedded: CONFIG += x11
+ SOURCES += \
+ plugins/qt/PluginContainerQt.cpp \
+ plugins/qt/PluginPackageQt.cpp \
+ plugins/qt/PluginViewQt.cpp
+ HEADERS += \
+ plugins/qt/PluginContainerQt.h
+ DEFINES += XP_UNIX
+ }
+ }
+
+ win32-* {
+ INCLUDEPATH += $$PWD/plugins/win
+
+ SOURCES += page/win/PageWin.cpp \
+ plugins/win/PluginDatabaseWin.cpp \
+ plugins/win/PluginPackageWin.cpp \
+ plugins/win/PluginMessageThrottlerWin.cpp \
+ plugins/win/PluginViewWin.cpp
+
+ LIBS += \
+ -ladvapi32 \
+ -lgdi32 \
+ -lshell32 \
+ -lshlwapi \
+ -luser32 \
+ -lversion
+ }
}
} else {
@@ -2592,6 +2636,7 @@ contains(DEFINES, ENABLE_DOM_STORAGE=1) {
storage/StorageAreaImpl.h \
storage/StorageAreaSync.h \
storage/StorageEvent.h \
+ storage/StorageEventDispatcher.h \
storage/Storage.h \
storage/StorageMap.h \
storage/StorageNamespace.h \
@@ -2606,6 +2651,7 @@ contains(DEFINES, ENABLE_DOM_STORAGE=1) {
storage/StorageAreaImpl.cpp \
storage/StorageAreaSync.cpp \
storage/StorageEvent.cpp \
+ storage/StorageEventDispatcher.cpp \
storage/StorageMap.cpp \
storage/StorageNamespace.cpp \
storage/StorageNamespaceImpl.cpp \
@@ -2743,6 +2789,7 @@ contains(DEFINES, ENABLE_FILTERS=1) {
platform/graphics/filters/FEColorMatrix.cpp \
platform/graphics/filters/FEComponentTransfer.cpp \
platform/graphics/filters/FEComposite.cpp \
+ platform/graphics/filters/FEGaussianBlur.cpp \
platform/graphics/filters/FilterEffect.cpp \
platform/graphics/filters/SourceAlpha.cpp \
platform/graphics/filters/SourceGraphic.cpp
@@ -2887,6 +2934,7 @@ contains(DEFINES, ENABLE_SVG=1) {
svg/SVGFELightElement.cpp \
svg/SVGFEMergeElement.cpp \
svg/SVGFEMergeNodeElement.cpp \
+ svg/SVGFEMorphologyElement.cpp \
svg/SVGFEOffsetElement.cpp \
svg/SVGFEPointLightElement.cpp \
svg/SVGFESpecularLightingElement.cpp \
@@ -2973,6 +3021,7 @@ contains(DEFINES, ENABLE_SVG=1) {
svg/SVGViewElement.cpp \
svg/SVGViewSpec.cpp \
svg/SVGZoomAndPan.cpp \
+ svg/SynchronizablePropertyController.cpp \
svg/animation/SMILTime.cpp \
svg/animation/SMILTimeContainer.cpp \
svg/animation/SVGSMILElement.cpp \
@@ -2980,7 +3029,6 @@ contains(DEFINES, ENABLE_SVG=1) {
svg/graphics/filters/SVGFEDiffuseLighting.cpp \
svg/graphics/filters/SVGFEDisplacementMap.cpp \
svg/graphics/filters/SVGFEFlood.cpp \
- svg/graphics/filters/SVGFEGaussianBlur.cpp \
svg/graphics/filters/SVGFEImage.cpp \
svg/graphics/filters/SVGFEMerge.cpp \
svg/graphics/filters/SVGFEMorphology.cpp \
diff --git a/src/3rdparty/webkit/WebCore/WebCore.qrc b/src/3rdparty/webkit/WebCore/WebCore.qrc
index b3fe43a..69f860a 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.qrc
+++ b/src/3rdparty/webkit/WebCore/WebCore.qrc
@@ -1,7 +1,4 @@
<!DOCTYPE RCC><RCC version="1.0">
-<qresource prefix="/webcore/css">
- <file alias="mediaControls-extras.css">css/qt/mediaControls-extras.css</file>
-</qresource>
<qresource prefix="/webkit/resources">
<file alias="missingImage.png">Resources/missingImage.png</file>
<file alias="nullPlugin.png">Resources/nullPlugin.png</file>
diff --git a/src/3rdparty/webkit/WebCore/accessibility/AccessibilityMediaControls.cpp b/src/3rdparty/webkit/WebCore/accessibility/AccessibilityMediaControls.cpp
index a807ab9..7200de9 100644
--- a/src/3rdparty/webkit/WebCore/accessibility/AccessibilityMediaControls.cpp
+++ b/src/3rdparty/webkit/WebCore/accessibility/AccessibilityMediaControls.cpp
@@ -101,6 +101,7 @@ MediaControlElementType AccessibilityMediaControl::controlType() const
String AccessibilityMediaControl::controlTypeName() const
{
+ DEFINE_STATIC_LOCAL(const String, mediaFullscreenButtonName, ("FullscreenButton"));
DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, ("MuteButton"));
DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, ("PlayButton"));
DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, ("SeekBackButton"));
@@ -114,6 +115,8 @@ String AccessibilityMediaControl::controlTypeName() const
DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, ("TimeRemainingDisplay"));
switch (controlType()) {
+ case MediaFullscreenButton:
+ return mediaFullscreenButtonName;
case MediaMuteButton:
return mediaMuteButtonName;
case MediaPlayButton:
diff --git a/src/3rdparty/webkit/WebCore/bindings/ScriptControllerBase.cpp b/src/3rdparty/webkit/WebCore/bindings/ScriptControllerBase.cpp
new file mode 100644
index 0000000..4d73d83
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/ScriptControllerBase.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
+ * Copyright (C) 2001 Peter Kelly (pmk@post.com)
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "ScriptController.h"
+
+#include "Frame.h"
+#include "Page.h"
+#include "ScriptSourceCode.h"
+#include "ScriptValue.h"
+#include "Settings.h"
+#include "XSSAuditor.h"
+
+namespace WebCore {
+
+ScriptValue ScriptController::executeScript(const String& script, bool forceUserGesture)
+{
+ return executeScript(ScriptSourceCode(script, forceUserGesture ? KURL() : m_frame->loader()->url()));
+}
+
+ScriptValue ScriptController::executeScript(const ScriptSourceCode& sourceCode)
+{
+ if (!isEnabled() || isPaused())
+ return ScriptValue();
+
+ bool wasInExecuteScript = m_inExecuteScript;
+ m_inExecuteScript = true;
+
+ ScriptValue result = evaluate(sourceCode);
+
+ if (!wasInExecuteScript) {
+ m_inExecuteScript = false;
+ Document::updateStyleForAllDocuments();
+ }
+
+ return result;
+}
+
+bool ScriptController::executeIfJavaScriptURL(const KURL& url, bool userGesture, bool replaceDocument)
+{
+ if (!protocolIsJavaScript(url))
+ return false;
+
+ if (m_frame->page() && !m_frame->page()->javaScriptURLsAreAllowed())
+ return true;
+
+ const int javascriptSchemeLength = sizeof("javascript:") - 1;
+
+ String script = decodeURLEscapeSequences(url.string().substring(javascriptSchemeLength));
+ ScriptValue result;
+ if (xssAuditor()->canEvaluateJavaScriptURL(script))
+ result = executeScript(script, userGesture);
+
+ String scriptResult;
+ if (!result.getString(scriptResult))
+ return true;
+
+ // FIXME: We should always replace the document, but doing so
+ // synchronously can cause crashes:
+ // http://bugs.webkit.org/show_bug.cgi?id=16782
+ if (replaceDocument)
+ m_frame->loader()->replaceDocument(scriptResult);
+
+ return true;
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp
index 9411ad8..a6cbd91 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSAbstractWorkerCustom.cpp
@@ -46,10 +46,6 @@ namespace WebCore {
JSValue JSAbstractWorker::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -60,10 +56,6 @@ JSValue JSAbstractWorker::addEventListener(ExecState* exec, const ArgList& args)
JSValue JSAbstractWorker::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.cpp
new file mode 100644
index 0000000..d08f760
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSCallbackData.h"
+
+#include "Document.h"
+#include "JSDOMBinding.h"
+
+using namespace JSC;
+
+namespace WebCore {
+
+void JSCallbackData::deleteData(void* context)
+{
+ delete static_cast<JSCallbackData*>(context);
+}
+
+JSValue JSCallbackData::invokeCallback(MarkedArgumentBuffer& args, bool* raisedException)
+{
+ ASSERT(callback());
+ ASSERT(globalObject());
+
+ ExecState* exec = globalObject()->globalExec();
+
+ JSValue function = callback()->get(exec, Identifier(exec, "handleEvent"));
+ CallData callData;
+ CallType callType = function.getCallData(callData);
+ if (callType == CallTypeNone) {
+ callType = callback()->getCallData(callData);
+ if (callType == CallTypeNone)
+ return JSValue();
+ function = callback();
+ }
+
+ globalObject()->globalData()->timeoutChecker.start();
+ JSValue result = call(exec, function, callType, callData, callback(), args);
+ globalObject()->globalData()->timeoutChecker.stop();
+
+ Document::updateStyleForAllDocuments();
+
+ if (exec->hadException()) {
+ reportCurrentException(exec);
+ if (raisedException)
+ *raisedException = true;
+ return result;
+ }
+
+ return result;
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.h
new file mode 100644
index 0000000..4fc9f84
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCallbackData.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef JSCallbackData_h
+#define JSCallbackData_h
+
+#include "JSDOMGlobalObject.h"
+#include <runtime/JSObject.h>
+#include <runtime/Protect.h>
+#include <wtf/Threading.h>
+
+namespace WebCore {
+
+// We have to clean up this data on the main thread because unprotecting a
+// JSObject on a non-main thread without synchronization would corrupt the heap
+// (and synchronization would be slow).
+
+class JSCallbackData {
+public:
+ static void deleteData(void*);
+
+ JSCallbackData(JSC::JSObject* callback, JSDOMGlobalObject* globalObject)
+ : m_callback(callback)
+ , m_globalObject(globalObject)
+ {
+ }
+
+ ~JSCallbackData()
+ {
+ ASSERT(isMainThread());
+ }
+
+ JSC::JSObject* callback() { return m_callback.get(); }
+ JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
+
+ JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer&, bool* raisedException = 0);
+
+private:
+ JSC::ProtectedPtr<JSC::JSObject> m_callback;
+ JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+};
+
+} // namespace WebCore
+
+#endif // JSCallbackData_h
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayBufferConstructor.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayBufferConstructor.h
index 44c9000..5f1254e 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayBufferConstructor.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayBufferConstructor.h
@@ -47,8 +47,9 @@ namespace WebCore {
//
RefPtr<C> arrayObject;
+ // For the 0 args case, just create an object without a buffer
if (args.size() < 1)
- return 0;
+ return C::create(0, 0, 0);
if (args.at(0).isObject()) {
RefPtr<CanvasArrayBuffer> buffer = toCanvasArrayBuffer(args.at(0));
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayCustom.cpp
index 4aa1547..14548d7 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCanvasArrayCustom.cpp
@@ -29,6 +29,13 @@
#include "config.h"
#include "JSCanvasArray.h"
+#include "JSCanvasByteArray.h"
+#include "JSCanvasUnsignedByteArray.h"
+#include "JSCanvasShortArray.h"
+#include "JSCanvasUnsignedShortArray.h"
+#include "JSCanvasIntArray.h"
+#include "JSCanvasUnsignedIntArray.h"
+#include "JSCanvasFloatArray.h"
#include "CanvasArray.h"
@@ -38,17 +45,21 @@ namespace WebCore {
JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, CanvasArray* object)
{
- if (!object)
- return jsUndefined();
-
-
-
-#if ENABLE(3D_CANVAS)
- if (object->is3d())
- return getDOMObjectWrapper<JSCanvasRenderingContext3D>(exec, globalObject, static_cast<CanvasRenderingContext3D*>(object));
-#endif
- ASSERT(object->is2d());
- return getDOMObjectWrapper<JSCanvasRenderingContext2D>(exec, globalObject, static_cast<CanvasRenderingContext2D*>(object));
+ if (object->isFloatArray())
+ return getDOMObjectWrapper<JSCanvasFloatArray>(exec, globalObject, static_cast<CanvasFloatArray*>(object));
+ if (object->isUnsignedByteArray())
+ return getDOMObjectWrapper<JSCanvasUnsignedByteArray>(exec, globalObject, static_cast<CanvasUnsignedByteArray*>(object));
+ if (object->isByteArray())
+ return getDOMObjectWrapper<JSCanvasByteArray>(exec, globalObject, static_cast<CanvasByteArray*>(object));
+ if (object->isIntArray())
+ return getDOMObjectWrapper<JSCanvasIntArray>(exec, globalObject, static_cast<CanvasIntArray*>(object));
+ if (object->isUnsignedIntArray())
+ return getDOMObjectWrapper<JSCanvasUnsignedIntArray>(exec, globalObject, static_cast<CanvasUnsignedIntArray*>(object));
+ if (object->isShortArray())
+ return getDOMObjectWrapper<JSCanvasShortArray>(exec, globalObject, static_cast<CanvasShortArray*>(object));
+ if (object->isUnsignedShortArray())
+ return getDOMObjectWrapper<JSCanvasUnsignedShortArray>(exec, globalObject, static_cast<CanvasUnsignedShortArray*>(object));
+ return jsUndefined();
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp
index 7074423..e5f83aa 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.cpp
@@ -36,45 +36,19 @@ namespace WebCore {
using namespace JSC;
JSCustomPositionCallback::JSCustomPositionCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(callback, globalObject)
{
}
void JSCustomPositionCallback::handleEvent(Geoposition* geoposition)
{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
-
- ExecState* exec = m_globalObject->globalExec();
-
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- JSValue function = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData callData;
- CallType callType = function.getCallData(callData);
- if (callType == CallTypeNone) {
- callType = m_callback->getCallData(callData);
- if (callType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- function = m_callback;
- }
-
RefPtr<JSCustomPositionCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
+ ExecState* exec = m_data.globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), geoposition));
-
- m_globalObject->globalData()->timeoutChecker.start();
- call(exec, function, callType, callData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException())
- reportCurrentException(exec);
-
- Document::updateStyleForAllDocuments();
+ m_data.invokeCallback(args);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.h
index 15a166a..ad5528d 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionCallback.h
@@ -26,14 +26,14 @@
#ifndef JSCustomPositionCallback_h
#define JSCustomPositionCallback_h
+#include "JSCallbackData.h"
#include "PositionCallback.h"
-#include "JSDOMGlobalObject.h"
-#include <runtime/Protect.h>
#include <wtf/Forward.h>
namespace WebCore {
class Geoposition;
+class JSDOMGlobalObject;
class JSCustomPositionCallback : public PositionCallback {
public:
@@ -46,9 +46,8 @@ private:
JSCustomPositionCallback(JSC::JSObject* callback, JSDOMGlobalObject*);
virtual void handleEvent(Geoposition*);
-
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+
+ JSCallbackData m_data;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp
index 9109cd1..bd64deb 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.cpp
@@ -36,45 +36,20 @@ namespace WebCore {
using namespace JSC;
JSCustomPositionErrorCallback::JSCustomPositionErrorCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(callback, globalObject)
{
}
void JSCustomPositionErrorCallback::handleEvent(PositionError* positionError)
{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
+ RefPtr<JSCustomPositionErrorCallback> protect(this);
- ExecState* exec = m_globalObject->globalExec();
-
JSC::JSLock lock(SilenceAssertionsOnly);
-
- JSValue function = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData callData;
- CallType callType = function.getCallData(callData);
- if (callType == CallTypeNone) {
- callType = m_callback->getCallData(callData);
- if (callType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- function = m_callback;
- }
-
- RefPtr<JSCustomPositionErrorCallback> protect(this);
-
+ ExecState* exec = m_data.globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), positionError));
- m_globalObject->globalData()->timeoutChecker.start();
- call(exec, function, callType, callData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException())
- reportCurrentException(exec);
-
- Document::updateStyleForAllDocuments();
+ m_data.invokeCallback(args);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.h
index d97e967..59328ca 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomPositionErrorCallback.h
@@ -26,9 +26,8 @@
#ifndef JSCustomPositionErrorCallback_h
#define JSCustomPositionErrorCallback_h
+#include "JSCallbackData.h"
#include "PositionErrorCallback.h"
-#include "JSDOMGlobalObject.h"
-#include <runtime/Protect.h>
#include <wtf/Forward.h>
namespace WebCore {
@@ -45,9 +44,8 @@ public:
private:
JSCustomPositionErrorCallback(JSC::JSObject* callback, JSDOMGlobalObject* globalObject);
virtual void handleEvent(PositionError*);
-
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+
+ JSCallbackData m_data;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp
index cdeda8f..1f6bd95 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.cpp
@@ -36,55 +36,38 @@
#include "JSSQLResultSet.h"
#include "JSSQLTransaction.h"
#include <runtime/JSLock.h>
+#include <wtf/MainThread.h>
namespace WebCore {
using namespace JSC;
JSCustomSQLStatementCallback::JSCustomSQLStatementCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(new JSCallbackData(callback, globalObject))
{
}
-void JSCustomSQLStatementCallback::handleEvent(SQLTransaction* transaction, SQLResultSet* resultSet, bool& raisedException)
+JSCustomSQLStatementCallback::~JSCustomSQLStatementCallback()
{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
-
- ExecState* exec = m_globalObject->globalExec();
-
- JSC::JSLock lock(SilenceAssertionsOnly);
+ callOnMainThread(JSCallbackData::deleteData, m_data);
+#ifndef NDEBUG
+ m_data = 0;
+#endif
+}
- JSValue function = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData callData;
- CallType callType = function.getCallData(callData);
- if (callType == CallTypeNone) {
- callType = m_callback->getCallData(callData);
- if (callType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- function = m_callback;
- }
+void JSCustomSQLStatementCallback::handleEvent(SQLTransaction* transaction, SQLResultSet* resultSet, bool& raisedException)
+{
+ ASSERT(m_data);
RefPtr<JSCustomSQLStatementCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
+ ExecState* exec = m_data->globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), transaction));
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), resultSet));
-
- m_globalObject->globalData()->timeoutChecker.start();
- call(exec, function, callType, callData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException()) {
- reportCurrentException(exec);
-
- raisedException = true;
- }
- Document::updateStyleForAllDocuments();
+ m_data->invokeCallback(args, &raisedException);
}
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h
index e6600c5..259aecf 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementCallback.h
@@ -31,9 +31,8 @@
#if ENABLE(DATABASE)
-#include "JSDOMGlobalObject.h"
+#include "JSCallbackData.h"
#include "SQLStatementCallback.h"
-#include <runtime/Protect.h>
#include <wtf/Forward.h>
namespace WebCore {
@@ -46,14 +45,15 @@ public:
{
return adoptRef(new JSCustomSQLStatementCallback(callback, globalObject));
}
+
+ virtual ~JSCustomSQLStatementCallback();
virtual void handleEvent(SQLTransaction*, SQLResultSet*, bool& raisedException);
private:
JSCustomSQLStatementCallback(JSC::JSObject* callback, JSDOMGlobalObject*);
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+ JSCallbackData* m_data;
};
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp
index ea47c64..6178509 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp
@@ -32,70 +32,51 @@
#if ENABLE(DATABASE)
#include "Frame.h"
-#include "ScriptController.h"
+#include "JSCallbackData.h"
#include "JSSQLError.h"
#include "JSSQLTransaction.h"
+#include "ScriptController.h"
#include <runtime/JSLock.h>
+#include <wtf/MainThread.h>
namespace WebCore {
using namespace JSC;
JSCustomSQLStatementErrorCallback::JSCustomSQLStatementErrorCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(new JSCallbackData(callback, globalObject))
{
}
-
-bool JSCustomSQLStatementErrorCallback::handleEvent(SQLTransaction* transaction, SQLError* error)
+
+JSCustomSQLStatementErrorCallback::~JSCustomSQLStatementErrorCallback()
{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
-
- ExecState* exec = m_globalObject->globalExec();
-
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- JSValue handleEventFunction = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData handleEventCallData;
- CallType handleEventCallType = handleEventFunction.getCallData(handleEventCallData);
- CallData callbackCallData;
- CallType callbackCallType = CallTypeNone;
+ callOnMainThread(JSCallbackData::deleteData, m_data);
+#ifndef NDEBUG
+ m_data = 0;
+#endif
+}
- if (handleEventCallType == CallTypeNone) {
- callbackCallType = m_callback->getCallData(callbackCallData);
- if (callbackCallType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return true;
- }
- }
+bool JSCustomSQLStatementErrorCallback::handleEvent(SQLTransaction* transaction, SQLError* error)
+{
+ ASSERT(m_data);
RefPtr<JSCustomSQLStatementErrorCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
+ ExecState* exec = m_data->globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), transaction));
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), error));
-
- JSValue result;
- m_globalObject->globalData()->timeoutChecker.start();
- if (handleEventCallType != CallTypeNone)
- result = call(exec, handleEventFunction, handleEventCallType, handleEventCallData, m_callback, args);
- else
- result = call(exec, m_callback, callbackCallType, callbackCallData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException()) {
- reportCurrentException(exec);
-
+
+ bool raisedException = false;
+ JSValue result = m_data->invokeCallback(args, &raisedException);
+ if (raisedException) {
// The spec says:
// "If the error callback returns false, then move on to the next statement..."
// "Otherwise, the error callback did not return false, or there was no error callback"
// Therefore an exception and returning true are the same thing - so, return true on an exception
return true;
}
-
- Document::updateStyleForAllDocuments();
-
return result.toBoolean(exec);
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h
index e03ac35..ac4e45f 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.h
@@ -37,7 +37,8 @@
#include <wtf/Forward.h>
namespace WebCore {
-
+
+class JSCallbackData;
class SQLError;
class JSCustomSQLStatementErrorCallback : public SQLStatementErrorCallback {
@@ -46,14 +47,15 @@ public:
{
return adoptRef(new JSCustomSQLStatementErrorCallback(callback, globalObject));
}
-
+
+ virtual ~JSCustomSQLStatementErrorCallback();
+
virtual bool handleEvent(SQLTransaction*, SQLError*);
private:
JSCustomSQLStatementErrorCallback(JSC::JSObject* callback, JSDOMGlobalObject*);
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+ JSCallbackData* m_data;
};
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp
index 1886345..456022f 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.cpp
@@ -32,6 +32,7 @@
#if ENABLE(DATABASE)
#include "Frame.h"
+#include "JSCallbackData.h"
#include "JSDOMGlobalObject.h"
#include "JSSQLTransaction.h"
#include "Page.h"
@@ -48,42 +49,17 @@ using namespace JSC;
static WTF::RefCountedLeakCounter counter("JSCustomSQLTransactionCallback");
#endif
-// We have to clean up the data on the main thread because unprotecting the
-// JSObject on a non-main thread would register that thread for JavaScript
-// garbage collection, which could unnecessarily slow things down.
-
-class JSCustomSQLTransactionCallback::Data {
-public:
- Data(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
- {
- }
-
- JSObject* callback() { return m_callback; }
- JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
-
-private:
- ProtectedPtr<JSObject> m_callback;
- ProtectedPtr<JSDOMGlobalObject> m_globalObject;
-};
-
JSCustomSQLTransactionCallback::JSCustomSQLTransactionCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_data(new Data(callback, globalObject))
+ : m_data(new JSCallbackData(callback, globalObject))
{
#ifndef NDEBUG
counter.increment();
#endif
}
-void JSCustomSQLTransactionCallback::deleteData(void* context)
-{
- delete static_cast<Data*>(context);
-}
-
JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback()
{
- callOnMainThread(deleteData, m_data);
+ callOnMainThread(JSCallbackData::deleteData, m_data);
#ifndef NDEBUG
m_data = 0;
counter.decrement();
@@ -93,47 +69,14 @@ JSCustomSQLTransactionCallback::~JSCustomSQLTransactionCallback()
void JSCustomSQLTransactionCallback::handleEvent(SQLTransaction* transaction, bool& raisedException)
{
ASSERT(m_data);
- ASSERT(m_data->callback());
- ASSERT(m_data->globalObject());
- JSDOMGlobalObject* globalObject = m_data->globalObject();
- ExecState* exec = globalObject->globalExec();
-
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- JSValue handleEventFunction = m_data->callback()->get(exec, Identifier(exec, "handleEvent"));
- CallData handleEventCallData;
- CallType handleEventCallType = handleEventFunction.getCallData(handleEventCallData);
- CallData callbackCallData;
- CallType callbackCallType = CallTypeNone;
-
- if (handleEventCallType == CallTypeNone) {
- callbackCallType = m_data->callback()->getCallData(callbackCallData);
- if (callbackCallType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- }
-
RefPtr<JSCustomSQLTransactionCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
+ ExecState* exec = m_data->globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), transaction));
-
- globalObject->globalData()->timeoutChecker.start();
- if (handleEventCallType != CallTypeNone)
- call(exec, handleEventFunction, handleEventCallType, handleEventCallData, m_data->callback(), args);
- else
- call(exec, m_data->callback(), callbackCallType, callbackCallData, m_data->callback(), args);
- globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException()) {
- reportCurrentException(exec);
-
- raisedException = true;
- }
-
- Document::updateStyleForAllDocuments();
+ m_data->invokeCallback(args, &raisedException);
}
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h
index f7f78f2..f142e59 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionCallback.h
@@ -41,6 +41,7 @@ namespace JSC {
namespace WebCore {
class Frame;
+class JSCallbackData;
class JSDOMGlobalObject;
class JSCustomSQLTransactionCallback : public SQLTransactionCallback {
@@ -57,10 +58,7 @@ public:
private:
JSCustomSQLTransactionCallback(JSC::JSObject* callback, JSDOMGlobalObject*);
- static void deleteData(void*);
-
- class Data;
- Data* m_data;
+ JSCallbackData* m_data;
};
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp
index b2f8280..331e014 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp
@@ -32,54 +32,40 @@
#if ENABLE(DATABASE)
#include "Frame.h"
-#include "ScriptController.h"
+#include "JSCallbackData.h"
#include "JSSQLError.h"
+#include "ScriptController.h"
#include <runtime/JSLock.h>
+#include <wtf/MainThread.h>
namespace WebCore {
using namespace JSC;
JSCustomSQLTransactionErrorCallback::JSCustomSQLTransactionErrorCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(new JSCallbackData(callback, globalObject))
{
}
-
-void JSCustomSQLTransactionErrorCallback::handleEvent(SQLError* error)
-{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
-
- ExecState* exec = m_globalObject->globalExec();
- JSC::JSLock lock(SilenceAssertionsOnly);
+JSCustomSQLTransactionErrorCallback::~JSCustomSQLTransactionErrorCallback()
+{
+ callOnMainThread(JSCallbackData::deleteData, m_data);
+#ifndef NDEBUG
+ m_data = 0;
+#endif
+}
- JSValue function = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData callData;
- CallType callType = function.getCallData(callData);
- if (callType == CallTypeNone) {
- callType = m_callback->getCallData(callData);
- if (callType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- function = m_callback;
- }
+void JSCustomSQLTransactionErrorCallback::handleEvent(SQLError* error)
+{
+ ASSERT(m_data);
RefPtr<JSCustomSQLTransactionErrorCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
+ ExecState* exec = m_data->globalObject()->globalExec();
MarkedArgumentBuffer args;
args.append(toJS(exec, deprecatedGlobalObjectForPrototype(exec), error));
-
- m_globalObject->globalData()->timeoutChecker.start();
- call(exec, function, callType, callData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException())
- reportCurrentException(exec);
-
- Document::updateStyleForAllDocuments();
+ m_data->invokeCallback(args);
}
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h
index 42fcbce..54bf33b 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h
@@ -38,6 +38,7 @@
namespace WebCore {
+class JSCallbackData;
class SQLError;
class JSCustomSQLTransactionErrorCallback : public SQLTransactionErrorCallback {
@@ -47,13 +48,14 @@ public:
return adoptRef(new JSCustomSQLTransactionErrorCallback(callback, globalObject));
}
+ virtual ~JSCustomSQLTransactionErrorCallback();
+
virtual void handleEvent(SQLError*);
private:
JSCustomSQLTransactionErrorCallback(JSC::JSObject* callback, JSDOMGlobalObject* globalObject);
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+ JSCallbackData* m_data;
};
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp
index 5300c42..0edd66f 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.cpp
@@ -30,53 +30,38 @@
#include "JSCustomVoidCallback.h"
#include "Frame.h"
+#include "JSCallbackData.h"
#include "JSDOMWindowCustom.h"
#include "ScriptController.h"
#include <runtime/JSLock.h>
+#include <wtf/MainThread.h>
namespace WebCore {
using namespace JSC;
JSCustomVoidCallback::JSCustomVoidCallback(JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(callback)
- , m_globalObject(globalObject)
+ : m_data(new JSCallbackData(callback, globalObject))
{
}
+
+JSCustomVoidCallback::~JSCustomVoidCallback()
+{
+ callOnMainThread(JSCallbackData::deleteData, m_data);
+#ifndef NDEBUG
+ m_data = 0;
+#endif
+}
void JSCustomVoidCallback::handleEvent()
{
- ASSERT(m_callback);
- ASSERT(m_globalObject);
+ ASSERT(m_data);
- ExecState* exec = m_globalObject->globalExec();
-
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- JSValue function = m_callback->get(exec, Identifier(exec, "handleEvent"));
- CallData callData;
- CallType callType = function.getCallData(callData);
- if (callType == CallTypeNone) {
- callType = m_callback->getCallData(callData);
- if (callType == CallTypeNone) {
- // FIXME: Should an exception be thrown here?
- return;
- }
- function = m_callback;
- }
-
RefPtr<JSCustomVoidCallback> protect(this);
+ JSC::JSLock lock(SilenceAssertionsOnly);
MarkedArgumentBuffer args;
-
- m_globalObject->globalData()->timeoutChecker.start();
- call(exec, function, callType, callData, m_callback, args);
- m_globalObject->globalData()->timeoutChecker.stop();
-
- if (exec->hadException())
- reportCurrentException(exec);
-
- Document::updateStyleForAllDocuments();
+ m_data->invokeCallback(args);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h
index f3db49f..4b8d7ea 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSCustomVoidCallback.h
@@ -36,6 +36,8 @@
namespace WebCore {
+class JSCallbackData;
+
class JSCustomVoidCallback : public VoidCallback {
public:
static PassRefPtr<JSCustomVoidCallback> create(JSC::JSObject* callback, JSDOMGlobalObject* globalObject)
@@ -43,13 +45,14 @@ public:
return adoptRef(new JSCustomVoidCallback(callback, globalObject));
}
+ virtual ~JSCustomVoidCallback();
+
virtual void handleEvent();
private:
JSCustomVoidCallback(JSC::JSObject* callback, JSDOMGlobalObject*);
- JSC::ProtectedPtr<JSC::JSObject> m_callback;
- JSC::ProtectedPtr<JSDOMGlobalObject> m_globalObject;
+ JSCallbackData* m_data;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp
index 49ef5e3..8634589 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMApplicationCacheCustom.cpp
@@ -87,10 +87,6 @@ JSValue JSDOMApplicationCache::remove(ExecState* exec, const ArgList& args)
JSValue JSDOMApplicationCache::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -101,10 +97,6 @@ JSValue JSDOMApplicationCache::addEventListener(ExecState* exec, const ArgList&
JSValue JSDOMApplicationCache::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp
index 515c088..8168323 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.cpp
@@ -25,6 +25,7 @@
#include "DOMCoreException.h"
#include "Document.h"
#include "EventException.h"
+#include "ExceptionBase.h"
#include "ExceptionCode.h"
#include "Frame.h"
#include "HTMLAudioElement.h"
@@ -35,6 +36,7 @@
#include "JSDOMCoreException.h"
#include "JSDOMWindowCustom.h"
#include "JSEventException.h"
+#include "JSExceptionBase.h"
#include "JSNode.h"
#include "JSRangeException.h"
#include "JSXMLHttpRequestException.h"
@@ -468,6 +470,9 @@ void reportException(ExecState* exec, JSValue exception)
UString exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL")).toString(exec);
exec->clearException();
+ if (ExceptionBase* exceptionBase = toExceptionBase(exception))
+ errorMessage = exceptionBase->message() + ": " + exceptionBase->description();
+
ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->scriptExecutionContext();
ASSERT(scriptExecutionContext);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h
index 9c0ad7e..9af45d7 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMBinding.h
@@ -76,10 +76,12 @@ namespace WebCore {
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasStandardGetOwnPropertySlot));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | DOMObject::StructureFlags;
+
DOMObjectWithGlobalPointer(NonNullPassRefPtr<JSC::Structure> structure, JSDOMGlobalObject* globalObject)
: DOMObject(structure)
, m_globalObject(globalObject)
@@ -106,10 +108,11 @@ namespace WebCore {
public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasStandardGetOwnPropertySlot | JSC::ImplementsHasInstance));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = JSC::ImplementsHasInstance | JSC::OverridesMarkChildren | DOMObjectWithGlobalPointer::StructureFlags;
DOMConstructorObject(NonNullPassRefPtr<JSC::Structure> structure, JSDOMGlobalObject* globalObject)
: DOMObjectWithGlobalPointer(structure, globalObject)
{
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp
index 372684c..53bb26b 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.cpp
@@ -51,7 +51,7 @@ void JSDOMGlobalObject::markChildren(MarkStack& markStack)
JSDOMStructureMap::iterator end = structures().end();
for (JSDOMStructureMap::iterator it = structures().begin(); it != end; ++it)
- it->second->markAggregate(markStack);
+ markStack.append(it->second->storedPrototype());
JSDOMConstructorMap::iterator end2 = constructors().end();
for (JSDOMConstructorMap::iterator it2 = constructors().begin(); it2 != end2; ++it2)
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h
index 00c3bbf..ce26857 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMGlobalObject.h
@@ -73,6 +73,12 @@ namespace WebCore {
{
}
+ JSDOMGlobalObjectData(Destructor destructor)
+ : JSGlobalObjectData(destructor)
+ , evt(0)
+ {
+ }
+
JSDOMStructureMap structures;
JSDOMConstructorMap constructors;
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp
index fe4d59c..a04ef89 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.cpp
@@ -42,12 +42,6 @@ namespace WebCore {
const ClassInfo JSDOMWindowBase::s_info = { "Window", 0, 0, 0 };
-JSDOMWindowBase::JSDOMWindowBaseData::JSDOMWindowBaseData(PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell)
- : impl(window)
- , shell(shell)
-{
-}
-
JSDOMWindowBase::JSDOMWindowBase(NonNullPassRefPtr<Structure> structure, PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell)
: JSDOMGlobalObject(structure, new JSDOMWindowBaseData(window, shell), shell)
{
@@ -175,6 +169,11 @@ JSGlobalData* JSDOMWindowBase::commonJSGlobalData()
return globalData;
}
+void JSDOMWindowBase::destroyJSDOMWindowBaseData(void* jsDOMWindowBaseData)
+{
+ delete static_cast<JSDOMWindowBaseData*>(jsDOMWindowBaseData);
+}
+
// JSDOMGlobalObject* is ignored, accesing a window in any context will
// use that DOMWindow's prototype chain.
JSValue toJS(ExecState* exec, JSDOMGlobalObject*, DOMWindow* domWindow)
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h
index 09fe4bc..52c3c1d 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowBase.h
@@ -76,7 +76,12 @@ namespace WebCore {
private:
struct JSDOMWindowBaseData : public JSDOMGlobalObjectData {
- JSDOMWindowBaseData(PassRefPtr<DOMWindow>, JSDOMWindowShell*);
+ JSDOMWindowBaseData(PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell)
+ : JSDOMGlobalObjectData(destroyJSDOMWindowBaseData)
+ , impl(window)
+ , shell(shell)
+ {
+ }
RefPtr<DOMWindow> impl;
JSDOMWindowShell* shell;
@@ -85,6 +90,8 @@ namespace WebCore {
bool allowsAccessFromPrivate(const JSC::JSGlobalObject*) const;
String crossDomainAccessErrorMessage(const JSC::JSGlobalObject*) const;
+ static void destroyJSDOMWindowBaseData(void*);
+
JSDOMWindowBaseData* d() const { return static_cast<JSDOMWindowBaseData*>(JSC::JSVariableObject::d); }
};
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp
index 7410107..deb92cb 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp
@@ -79,7 +79,9 @@
#include "RegisteredEventListener.h"
#include "ScheduledAction.h"
#include "ScriptController.h"
+#include "SerializedScriptValue.h"
#include "Settings.h"
+#include "SharedWorkerRepository.h"
#include "WindowFeatures.h"
#include <runtime/Error.h>
#include <runtime/JSFunction.h>
@@ -589,7 +591,7 @@ void JSDOMWindow::setLocation(ExecState* exec, JSValue value)
if (!protocolIsJavaScript(url) || allowsAccessFrom(exec)) {
// We want a new history item if this JS was called via a user gesture
- frame->loader()->scheduleLocationChange(url, lexicalFrame->loader()->outgoingReferrer(), !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, processingUserGesture(exec));
+ frame->redirectScheduler()->scheduleLocationChange(url, lexicalFrame->loader()->outgoingReferrer(), !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, processingUserGesture(exec));
}
}
@@ -713,7 +715,9 @@ JSValue JSDOMWindow::worker(ExecState* exec) const
#if ENABLE(SHARED_WORKERS)
JSValue JSDOMWindow::sharedWorker(ExecState* exec) const
{
- return getDOMConstructor<JSSharedWorkerConstructor>(exec, this);
+ if (SharedWorkerRepository::isAvailable())
+ return getDOMConstructor<JSSharedWorkerConstructor>(exec, this);
+ return jsUndefined();
}
#endif
@@ -726,8 +730,6 @@ JSValue JSDOMWindow::webSocket(ExecState* exec) const
Settings* settings = frame->settings();
if (!settings)
return jsUndefined();
- if (!settings->experimentalWebSocketsEnabled())
- return jsUndefined();
return getDOMConstructor<JSWebSocketConstructor>(exec, this);
}
#endif
@@ -767,7 +769,7 @@ static Frame* createWindow(ExecState* exec, Frame* lexicalFrame, Frame* dynamicF
return 0;
newFrame->loader()->setOpener(openerFrame);
- newFrame->loader()->setOpenedByDOM();
+ newFrame->page()->setOpenedByDOM();
JSDOMWindow* newWindow = toJSDOMWindow(newFrame);
@@ -781,7 +783,7 @@ static Frame* createWindow(ExecState* exec, Frame* lexicalFrame, Frame* dynamicF
if (created)
newFrame->loader()->changeLocation(completedURL, referrer, false, false, userGesture);
else if (!url.isEmpty())
- newFrame->loader()->scheduleLocationChange(completedURL.string(), referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
+ newFrame->redirectScheduler()->scheduleLocationChange(completedURL.string(), referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
}
return newFrame;
@@ -838,7 +840,7 @@ JSValue JSDOMWindow::open(ExecState* exec, const ArgList& args)
// here.
String referrer = dynamicFrame->loader()->outgoingReferrer();
- frame->loader()->scheduleLocationChange(completedURL, referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
+ frame->redirectScheduler()->scheduleLocationChange(completedURL, referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
}
return toJS(exec, frame->domWindow());
}
@@ -933,7 +935,15 @@ JSValue JSDOMWindow::showModalDialog(ExecState* exec, const ArgList& args)
JSDOMWindow* dialogWindow = toJSDOMWindow(dialogFrame);
dialogFrame->page()->chrome()->runModal();
- return dialogWindow->getDirect(Identifier(exec, "returnValue"));
+ Identifier returnValue(exec, "returnValue");
+ if (dialogWindow->allowsAccessFromNoErrorMessage(exec)) {
+ PropertySlot slot;
+ // This is safe, we have already performed the origin security check and we are
+ // not interested in any of the DOM properties of the window.
+ if (dialogWindow->JSGlobalObject::getOwnPropertySlot(exec, returnValue, slot))
+ return slot.getValue(exec, returnValue);
+ }
+ return jsUndefined();
}
JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args)
@@ -941,7 +951,7 @@ JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args)
DOMWindow* window = impl();
DOMWindow* source = asJSDOMWindow(exec->lexicalGlobalObject())->impl();
- String message = args.at(0).toString(exec);
+ PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, args.at(0));
if (exec->hadException())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h
index 23af340..1bb0938 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowShell.h
@@ -60,10 +60,12 @@ namespace WebCore {
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
private:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | DOMObject::StructureFlags;
+
virtual void markChildren(JSC::MarkStack&);
virtual JSC::UString className() const;
virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDesktopNotificationsCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDesktopNotificationsCustom.cpp
index 493d7bd..9bff637 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDesktopNotificationsCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDesktopNotificationsCustom.cpp
@@ -63,29 +63,21 @@ JSValue JSNotificationCenter::requestPermission(ExecState* exec, const ArgList&
JSValue JSNotification::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
- impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener)), globalObject, false), args.at(2).toBoolean(exec));
+ impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener)), false), args.at(2).toBoolean(exec));
return jsUndefined();
}
JSValue JSNotification::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
- impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), globalObject, false).get(), args.at(2).toBoolean(exec));
+ impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
return jsUndefined();
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp
index e48b593..d7f8725 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDocumentCustom.cpp
@@ -88,7 +88,7 @@ void JSDocument::setLocation(ExecState* exec, JSValue value)
str = activeFrame->document()->completeURL(str).string();
bool userGesture = activeFrame->script()->processingUserGesture();
- frame->loader()->scheduleLocationChange(str, activeFrame->loader()->outgoingReferrer(), !activeFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
+ frame->redirectScheduler()->scheduleLocationChange(str, activeFrame->loader()->outgoingReferrer(), !activeFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture);
}
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, Document* document)
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp
index 162543d..edf9151 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSEventCustom.cpp
@@ -31,6 +31,7 @@
#include "Clipboard.h"
#include "Event.h"
+#include "JSBeforeLoadEvent.h"
#include "JSClipboard.h"
#include "JSErrorEvent.h"
#include "JSKeyboardEvent.h"
@@ -46,6 +47,7 @@
#include "JSWebKitTransitionEvent.h"
#include "JSWheelEvent.h"
#include "JSXMLHttpRequestProgressEvent.h"
+#include "BeforeLoadEvent.h"
#include "ErrorEvent.h"
#include "KeyboardEvent.h"
#include "MessageEvent.h"
@@ -120,7 +122,8 @@ JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, Event* event)
wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, XMLHttpRequestProgressEvent, event);
else
wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ProgressEvent, event);
- }
+ } else if (event->isBeforeLoadEvent())
+ wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, BeforeLoadEvent, event);
#if ENABLE(DOM_STORAGE)
else if (event->isStorageEvent())
wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, StorageEvent, event);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSEventSourceCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSEventSourceCustom.cpp
index 404bf11..00dfe12 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSEventSourceCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSEventSourceCustom.cpp
@@ -45,10 +45,6 @@ namespace WebCore {
JSValue JSEventSource::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -59,10 +55,6 @@ JSValue JSEventSource::addEventListener(ExecState* exec, const ArgList& args)
JSValue JSEventSource::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.cpp
new file mode 100644
index 0000000..3749eed
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSExceptionBase.h"
+
+#include "JSDOMCoreException.h"
+#include "JSEventException.h"
+#include "JSRangeException.h"
+#include "JSXMLHttpRequestException.h"
+#if ENABLE(SVG)
+#include "JSSVGException.h"
+#endif
+#if ENABLE(XPATH)
+#include "JSXPathException.h"
+#endif
+
+namespace WebCore {
+
+ExceptionBase* toExceptionBase(JSC::JSValue value)
+{
+ if (DOMCoreException* domException = toDOMCoreException(value))
+ return reinterpret_cast<ExceptionBase*>(domException);
+ if (RangeException* rangeException = toRangeException(value))
+ return reinterpret_cast<ExceptionBase*>(rangeException);
+ if (EventException* eventException = toEventException(value))
+ return reinterpret_cast<ExceptionBase*>(eventException);
+ if (XMLHttpRequestException* xmlHttpException = toXMLHttpRequestException(value))
+ return reinterpret_cast<ExceptionBase*>(xmlHttpException);
+#if ENABLE(SVG)
+ if (SVGException* svgException = toSVGException(value))
+ return reinterpret_cast<ExceptionBase*>(svgException);
+#endif
+#if ENABLE(XPATH)
+ if (XPathException* pathException = toXPathException(value))
+ return reinterpret_cast<ExceptionBase*>(pathException);
+#endif
+
+ return 0;
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.h b/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.h
new file mode 100644
index 0000000..01c6ac2
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSExceptionBase.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef JSExceptionBase_h
+#define JSExceptionBase_h
+
+namespace JSC {
+
+class JSValue;
+
+} // namespace JSC
+
+namespace WebCore {
+
+class ExceptionBase;
+
+ExceptionBase* toExceptionBase(JSC::JSValue);
+
+} // namespace WebCore
+
+#endif // JSExceptionBase_h
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h b/src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h
index e6fe7f5..da3a758 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSHTMLAllCollection.h
@@ -42,10 +42,12 @@ namespace WebCore {
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue proto)
{
- return JSC::Structure::create(proto, JSC::TypeInfo(JSC::ObjectType, JSC::MasqueradesAsUndefined));
+ return JSC::Structure::create(proto, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static const JSC::ClassInfo s_info;
+ protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::MasqueradesAsUndefined | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSHTMLCollection::StructureFlags;
private:
virtual bool toBoolean(JSC::ExecState*) const { return false; }
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp
index 583d971..391cacc 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSInspectorBackendCustom.cpp
@@ -66,10 +66,7 @@
#if ENABLE(JAVASCRIPT_DEBUGGER)
#include "JavaScriptCallFrame.h"
#include "JavaScriptDebugServer.h"
-#include "JavaScriptProfile.h"
#include "JSJavaScriptCallFrame.h"
-#include <profiler/Profile.h>
-#include <profiler/Profiler.h>
#endif
using namespace JSC;
@@ -122,27 +119,20 @@ JSValue JSInspectorBackend::search(ExecState* exec, const ArgList& args)
}
#if ENABLE(DATABASE)
-JSValue JSInspectorBackend::databaseTableNames(ExecState* exec, const ArgList& args)
+JSValue JSInspectorBackend::databaseForId(ExecState* exec, const ArgList& args)
{
if (args.size() < 1)
return jsUndefined();
- JSQuarantinedObjectWrapper* wrapper = JSQuarantinedObjectWrapper::asWrapper(args.at(0));
- if (!wrapper)
+ InspectorController* ic = impl()->inspectorController();
+ if (!ic)
return jsUndefined();
- Database* database = toDatabase(wrapper->unwrappedObject());
+ Database* database = impl()->databaseForId(args.at(0).toInt32(exec));
if (!database)
return jsUndefined();
-
- MarkedArgumentBuffer result;
-
- Vector<String> tableNames = database->tableNames();
- unsigned length = tableNames.size();
- for (unsigned i = 0; i < length; ++i)
- result.append(jsString(exec, tableNames[i]));
-
- return constructArray(exec, result);
+ JSDOMWindow* inspectedWindow = toJSDOMWindow(ic->inspectedPage()->mainFrame());
+ return JSInspectedObjectWrapper::wrap(inspectedWindow->globalExec(), toJS(exec, database));
}
#endif
@@ -260,21 +250,6 @@ JSValue JSInspectorBackend::currentCallFrame(ExecState* exec, const ArgList&)
return JSInspectedObjectWrapper::wrap(globalExec, toJS(exec, callFrame));
}
-JSValue JSInspectorBackend::profiles(JSC::ExecState* exec, const JSC::ArgList&)
-{
- JSLock lock(SilenceAssertionsOnly);
- MarkedArgumentBuffer result;
- InspectorController* ic = impl()->inspectorController();
- if (!ic)
- return jsUndefined();
- const Vector<RefPtr<Profile> >& profiles = ic->profiles();
-
- for (size_t i = 0; i < profiles.size(); ++i)
- result.append(toJS(exec, profiles[i].get()));
-
- return constructArray(exec, result);
-}
-
#endif
JSValue JSInspectorBackend::nodeForId(ExecState* exec, const ArgList& args)
@@ -295,12 +270,12 @@ JSValue JSInspectorBackend::nodeForId(ExecState* exec, const ArgList& args)
return JSInspectedObjectWrapper::wrap(inspectedWindow->globalExec(), toJS(exec, deprecatedGlobalObjectForPrototype(inspectedWindow->globalExec()), node));
}
-JSValue JSInspectorBackend::wrapObject(ExecState*, const ArgList& args)
+JSValue JSInspectorBackend::wrapObject(ExecState* exec, const ArgList& args)
{
- if (args.size() < 1)
+ if (args.size() < 2)
return jsUndefined();
- return impl()->wrapObject(ScriptValue(args.at(0))).jsValue();
+ return impl()->wrapObject(ScriptValue(args.at(0)), args.at(1).toString(exec)).jsValue();
}
JSValue JSInspectorBackend::unwrapObject(ExecState* exec, const ArgList& args)
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp
index aecec5e..c76a2b1 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSLocationCustom.cpp
@@ -196,7 +196,7 @@ static void navigateIfAllowed(ExecState* exec, Frame* frame, const KURL& url, bo
return;
if (!protocolIsJavaScript(url) || allowsAccessFromFrame(exec, frame))
- frame->loader()->scheduleLocationChange(url.string(), lexicalFrame->loader()->outgoingReferrer(), lockHistory, lockBackForwardList, processingUserGesture(exec));
+ frame->redirectScheduler()->scheduleLocationChange(url.string(), lexicalFrame->loader()->outgoingReferrer(), lockHistory, lockBackForwardList, processingUserGesture(exec));
}
void JSLocation::setHref(ExecState* exec, JSValue value)
@@ -326,7 +326,7 @@ JSValue JSLocation::reload(ExecState* exec, const ArgList&)
return jsUndefined();
if (!protocolIsJavaScript(frame->loader()->url()))
- frame->loader()->scheduleRefresh(processingUserGesture(exec));
+ frame->redirectScheduler()->scheduleRefresh(processingUserGesture(exec));
return jsUndefined();
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSMessageEventCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSMessageEventCustom.cpp
index 4c61c04..2e7b2d0 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSMessageEventCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSMessageEventCustom.cpp
@@ -59,7 +59,7 @@ JSC::JSValue JSMessageEvent::initMessageEvent(JSC::ExecState* exec, const JSC::A
const UString& typeArg = args.at(0).toString(exec);
bool canBubbleArg = args.at(1).toBoolean(exec);
bool cancelableArg = args.at(2).toBoolean(exec);
- const UString& dataArg = args.at(3).toString(exec);
+ PassRefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(exec, args.at(3));
const UString& originArg = args.at(4).toString(exec);
const UString& lastEventIdArg = args.at(5).toString(exec);
DOMWindow* sourceArg = toDOMWindow(args.at(6));
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp
index 210c93e..a0a92be 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp
@@ -57,10 +57,6 @@ void JSMessagePort::markChildren(MarkStack& markStack)
JSValue JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -71,10 +67,6 @@ JSValue JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
JSValue JSMessagePort::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.h b/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.h
index 7e90943..17b1eae 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.h
@@ -49,7 +49,7 @@ namespace WebCore {
template <typename T>
inline JSC::JSValue handlePostMessage(JSC::ExecState* exec, const JSC::ArgList& args, T* impl)
{
- String message = args.at(0).toString(exec);
+ PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, args.at(0));
MessagePortArray portArray;
fillMessagePortArray(exec, args.at(1), portArray);
if (exec->hadException())
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp
index 52f21e7..4e7d622 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSNodeCustom.cpp
@@ -110,14 +110,6 @@ JSValue JSNode::appendChild(ExecState* exec, const ArgList& args)
JSValue JSNode::addEventListener(ExecState* exec, const ArgList& args)
{
- Document* document = impl()->document();
- if (!document)
- return jsUndefined();
-
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(document);
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -128,14 +120,6 @@ JSValue JSNode::addEventListener(ExecState* exec, const ArgList& args)
JSValue JSNode::removeEventListener(ExecState* exec, const ArgList& args)
{
- Document* document = impl()->document();
- if (!document)
- return jsUndefined();
-
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(document);
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h b/src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h
index 94a92bd..9f62495 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSQuarantinedObjectWrapper.h
@@ -47,10 +47,12 @@ namespace WebCore {
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue proto)
{
- return JSC::Structure::create(proto, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance | JSC::OverridesHasInstance));
+ return JSC::Structure::create(proto, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::ImplementsHasInstance | JSC::OverridesHasInstance | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::JSObject::StructureFlags;
+
JSQuarantinedObjectWrapper(JSC::ExecState* unwrappedExec, JSC::JSObject* unwrappedObject, NonNullPassRefPtr<JSC::Structure>);
virtual void markChildren(JSC::MarkStack&);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp
index 571e302..fd3742d 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSSVGElementInstanceCustom.cpp
@@ -50,10 +50,6 @@ void JSSVGElementInstance::markChildren(MarkStack& markStack)
JSValue JSSVGElementInstance::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -64,10 +60,6 @@ JSValue JSSVGElementInstance::addEventListener(ExecState* exec, const ArgList& a
JSValue JSSVGElementInstance::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSWebSocketCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSWebSocketCustom.cpp
index d305502..bea3563 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSWebSocketCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSWebSocketCustom.cpp
@@ -36,6 +36,7 @@
#include "JSWebSocket.h"
#include "KURL.h"
+#include "JSEventListener.h"
#include "WebSocket.h"
#include "NotImplemented.h"
#include <runtime/Error.h>
@@ -59,7 +60,25 @@ JSValue JSWebSocket::send(ExecState* exec, const ArgList& args)
return ret;
}
-// FIXME: implement addEventListener/removeEventListener.
+JSValue JSWebSocket::addEventListener(ExecState* exec, const ArgList& args)
+{
+ JSValue listener = args.at(1);
+ if (!listener.isObject())
+ return jsUndefined();
+
+ impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false), args.at(2).toBoolean(exec));
+ return jsUndefined();
+}
+
+JSValue JSWebSocket::removeEventListener(ExecState* exec, const ArgList& args)
+{
+ JSValue listener = args.at(1);
+ if (!listener.isObject())
+ return jsUndefined();
+
+ impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
+ return jsUndefined();
+}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
index 4b44db2..7d3f8af 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp
@@ -152,10 +152,6 @@ JSValue JSXMLHttpRequest::overrideMimeType(ExecState* exec, const ArgList& args)
JSValue JSXMLHttpRequest::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -166,10 +162,6 @@ JSValue JSXMLHttpRequest::addEventListener(ExecState* exec, const ArgList& args)
JSValue JSXMLHttpRequest::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp
index dab0a3e..275d1fb 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/JSXMLHttpRequestUploadCustom.cpp
@@ -56,10 +56,6 @@ void JSXMLHttpRequestUpload::markChildren(MarkStack& markStack)
JSValue JSXMLHttpRequestUpload::addEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
@@ -70,10 +66,6 @@ JSValue JSXMLHttpRequestUpload::addEventListener(ExecState* exec, const ArgList&
JSValue JSXMLHttpRequestUpload::removeEventListener(ExecState* exec, const ArgList& args)
{
- JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
- if (!globalObject)
- return jsUndefined();
-
JSValue listener = args.at(1);
if (!listener.isObject())
return jsUndefined();
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp b/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp
index 9e64bce..93155e1 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.cpp
@@ -125,7 +125,7 @@ void ScheduledAction::execute(Document* document)
executeFunctionInContext(window, window->shell());
Document::updateStyleForAllDocuments();
} else
- frame->loader()->executeScript(m_code);
+ frame->script()->executeScript(m_code);
frame->script()->setProcessingTimerCallback(false);
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h b/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h
index e7d0b75..2cd36ed 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScheduledAction.h
@@ -21,6 +21,7 @@
#define ScheduledAction_h
#include "PlatformString.h"
+#include <runtime/JSCell.h>
#include <runtime/Protect.h>
#include <wtf/Vector.h>
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp b/src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp
index 8852611..77b8ca4 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScriptCachedFrameData.cpp
@@ -86,7 +86,7 @@ void ScriptCachedFrameData::clear()
{
JSLock lock(SilenceAssertionsOnly);
- if (!m_window) {
+ if (m_window) {
m_window = 0;
gcController().garbageCollectSoon();
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp b/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp
index dfa1602..54acc90 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.cpp
@@ -48,6 +48,7 @@ ScriptController::ScriptController(Frame* frame)
: m_frame(frame)
, m_handlerLineNumber(0)
, m_sourceURL(0)
+ , m_inExecuteScript(false)
, m_processingTimerCallback(false)
, m_paused(false)
, m_allowPopupsFromPlugin(false)
@@ -84,7 +85,7 @@ ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)
{
const SourceCode& jsSourceCode = sourceCode.jsSourceCode();
String sourceURL = jsSourceCode.provider()->url();
-
+
if (!m_XSSAuditor->canEvaluate(sourceCode.source())) {
// This script is not safe to be evaluated.
return JSValue();
@@ -185,6 +186,9 @@ bool ScriptController::processingUserGestureEvent() const
return false;
if (Event* event = m_windowShell->window()->currentEvent()) {
+ if (event->createdByDOM())
+ return false;
+
const AtomicString& type = event->type();
if ( // mouse events
type == eventNames().clickEvent || type == eventNames().mousedownEvent ||
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h b/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h
index 56e8f0c..bd4b65e 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScriptController.h
@@ -80,6 +80,12 @@ public:
return m_windowShell->window();
}
+ ScriptValue executeScript(const ScriptSourceCode&);
+ ScriptValue executeScript(const String& script, bool forceUserGesture = false);
+
+ // Returns true if argument is a JavaScript URL.
+ bool executeIfJavaScriptURL(const KURL&, bool userGesture = false, bool replaceDocument = true);
+
ScriptValue evaluate(const ScriptSourceCode&);
void evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>&);
@@ -155,6 +161,8 @@ private:
int m_handlerLineNumber;
const String* m_sourceURL;
+ bool m_inExecuteScript;
+
bool m_processingTimerCallback;
bool m_paused;
bool m_allowPopupsFromPlugin;
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp b/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp
index b527a96..1172e8e 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.cpp
@@ -103,6 +103,14 @@ bool ScriptObject::set(const char* name, int value)
return handleException(m_scriptState);
}
+bool ScriptObject::set(const char* name, unsigned value)
+{
+ JSLock lock(SilenceAssertionsOnly);
+ PutPropertySlot slot;
+ jsObject()->put(m_scriptState, Identifier(m_scriptState, name), jsNumber(m_scriptState, value), slot);
+ return handleException(m_scriptState);
+}
+
bool ScriptObject::set(const char* name, bool value)
{
JSLock lock(SilenceAssertionsOnly);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h b/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h
index a8b11e0..31381f3 100644
--- a/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h
+++ b/src/3rdparty/webkit/WebCore/bindings/js/ScriptObject.h
@@ -52,6 +52,7 @@ namespace WebCore {
bool set(const char* name, double);
bool set(const char* name, long long);
bool set(const char* name, int);
+ bool set(const char* name, unsigned);
bool set(const char* name, bool);
static ScriptObject createNew(ScriptState*);
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.cpp b/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.cpp
new file mode 100644
index 0000000..48cd92d
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.cpp
@@ -0,0 +1,839 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "config.h"
+#include "SerializedScriptValue.h"
+
+#include <runtime/DateInstance.h>
+#include <runtime/ExceptionHelpers.h>
+#include <runtime/PropertyNameArray.h>
+#include <wtf/HashTraits.h>
+#include <wtf/Vector.h>
+
+using namespace JSC;
+
+namespace WebCore {
+
+class SerializedObject : public SharedSerializedData
+{
+public:
+ typedef Vector<RefPtr<StringImpl> > PropertyNameList;
+ typedef Vector<SerializedScriptValueData> ValueList;
+
+ void set(const Identifier& propertyName, const SerializedScriptValueData& value)
+ {
+ ASSERT(m_names.size() == m_values.size());
+ m_names.append(String(propertyName.ustring()).crossThreadString().impl());
+ m_values.append(value);
+ }
+
+ PropertyNameList& names() { return m_names; }
+
+ ValueList& values() { return m_values; }
+
+ static PassRefPtr<SerializedObject> create()
+ {
+ return adoptRef(new SerializedObject);
+ }
+
+ void clear()
+ {
+ m_names.clear();
+ m_values.clear();
+ }
+
+private:
+ SerializedObject() { }
+ PropertyNameList m_names;
+ ValueList m_values;
+};
+
+class SerializedArray : public SharedSerializedData
+{
+ typedef HashMap<unsigned, SerializedScriptValueData, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned> > SparseMap;
+public:
+ void setIndex(unsigned index, const SerializedScriptValueData& value)
+ {
+ ASSERT(index < m_length);
+ if (index == m_compactStorage.size())
+ m_compactStorage.append(value);
+ else
+ m_sparseStorage.set(index, value);
+ }
+
+ bool canDoFastRead(unsigned index) const
+ {
+ ASSERT(index < m_length);
+ return index < m_compactStorage.size();
+ }
+
+ const SerializedScriptValueData& getIndex(unsigned index)
+ {
+ ASSERT(index < m_compactStorage.size());
+ return m_compactStorage[index];
+ }
+
+ SerializedScriptValueData getSparseIndex(unsigned index, bool& hasIndex)
+ {
+ ASSERT(index >= m_compactStorage.size());
+ ASSERT(index < m_length);
+ SparseMap::iterator iter = m_sparseStorage.find(index);
+ if (iter == m_sparseStorage.end()) {
+ hasIndex = false;
+ return SerializedScriptValueData();
+ }
+ hasIndex = true;
+ return iter->second;
+ }
+
+ unsigned length() const
+ {
+ return m_length;
+ }
+
+ static PassRefPtr<SerializedArray> create(unsigned length)
+ {
+ return adoptRef(new SerializedArray(length));
+ }
+
+ void clear()
+ {
+ m_compactStorage.clear();
+ m_sparseStorage.clear();
+ m_length = 0;
+ }
+private:
+ SerializedArray(unsigned length)
+ : m_length(length)
+ {
+ }
+
+ Vector<SerializedScriptValueData> m_compactStorage;
+ SparseMap m_sparseStorage;
+ unsigned m_length;
+};
+
+SerializedScriptValueData::SerializedScriptValueData(RefPtr<SerializedObject> data)
+ : m_type(ObjectType)
+ , m_sharedData(data)
+{
+}
+
+SerializedScriptValueData::SerializedScriptValueData(RefPtr<SerializedArray> data)
+ : m_type(ArrayType)
+ , m_sharedData(data)
+{
+}
+
+SerializedArray* SharedSerializedData::asArray()
+{
+ return static_cast<SerializedArray*>(this);
+}
+
+SerializedObject* SharedSerializedData::asObject()
+{
+ return static_cast<SerializedObject*>(this);
+}
+
+static const unsigned maximumFilterRecursion = 40000;
+enum WalkerState { StateUnknown, ArrayStartState, ArrayStartVisitMember, ArrayEndVisitMember,
+ ObjectStartState, ObjectStartVisitMember, ObjectEndVisitMember };
+template <typename TreeWalker> typename TreeWalker::OutputType walk(TreeWalker& context, typename TreeWalker::InputType in)
+{
+ typedef typename TreeWalker::InputObject InputObject;
+ typedef typename TreeWalker::InputArray InputArray;
+ typedef typename TreeWalker::OutputObject OutputObject;
+ typedef typename TreeWalker::OutputArray OutputArray;
+ typedef typename TreeWalker::InputType InputType;
+ typedef typename TreeWalker::OutputType OutputType;
+ typedef typename TreeWalker::PropertyList PropertyList;
+
+ Vector<uint32_t, 16> indexStack;
+ Vector<uint32_t, 16> lengthStack;
+ Vector<PropertyList, 16> propertyStack;
+ Vector<InputObject, 16> inputObjectStack;
+ Vector<InputArray, 16> inputArrayStack;
+ Vector<OutputObject, 16> outputObjectStack;
+ Vector<OutputArray, 16> outputArrayStack;
+ Vector<WalkerState, 16> stateStack;
+ WalkerState state = StateUnknown;
+ InputType inValue = in;
+ OutputType outValue = context.null();
+
+ unsigned tickCount = context.ticksUntilNextCheck();
+ while (1) {
+ switch (state) {
+ arrayStartState:
+ case ArrayStartState: {
+ ASSERT(context.isArray(inValue));
+ if (inputObjectStack.size() + inputArrayStack.size() > maximumFilterRecursion) {
+ context.throwStackOverflow();
+ return context.null();
+ }
+
+ InputArray inArray = context.asInputArray(inValue);
+ unsigned length = context.length(inArray);
+ OutputArray outArray = context.createOutputArray(length);
+ if (!context.startArray(inArray, outArray))
+ return context.null();
+ inputArrayStack.append(inArray);
+ outputArrayStack.append(outArray);
+ indexStack.append(0);
+ lengthStack.append(length);
+ // fallthrough
+ }
+ arrayStartVisitMember:
+ case ArrayStartVisitMember: {
+ if (!--tickCount) {
+ if (context.didTimeOut()) {
+ context.throwInterruptedException();
+ return context.null();
+ }
+ tickCount = context.ticksUntilNextCheck();
+ }
+
+ InputArray array = inputArrayStack.last();
+ uint32_t index = indexStack.last();
+ if (index == lengthStack.last()) {
+ InputArray inArray = inputArrayStack.last();
+ OutputArray outArray = outputArrayStack.last();
+ context.endArray(inArray, outArray);
+ outValue = outArray;
+ inputArrayStack.removeLast();
+ outputArrayStack.removeLast();
+ indexStack.removeLast();
+ lengthStack.removeLast();
+ break;
+ }
+ if (context.canDoFastRead(array, index))
+ inValue = context.getIndex(array, index);
+ else {
+ bool hasIndex = false;
+ inValue = context.getSparseIndex(array, index, hasIndex);
+ if (!hasIndex) {
+ indexStack.last()++;
+ goto arrayStartVisitMember;
+ }
+ }
+
+ if (OutputType transformed = context.convertIfTerminal(inValue))
+ outValue = transformed;
+ else {
+ stateStack.append(ArrayEndVisitMember);
+ goto stateUnknown;
+ }
+ // fallthrough
+ }
+ case ArrayEndVisitMember: {
+ OutputArray outArray = outputArrayStack.last();
+ context.putProperty(outArray, indexStack.last(), outValue);
+ indexStack.last()++;
+ goto arrayStartVisitMember;
+ }
+ objectStartState:
+ case ObjectStartState: {
+ ASSERT(context.isObject(inValue));
+ if (inputObjectStack.size() + inputArrayStack.size() > maximumFilterRecursion) {
+ context.throwStackOverflow();
+ return context.null();
+ }
+ InputObject inObject = context.asInputObject(inValue);
+ OutputObject outObject = context.createOutputObject();
+ if (!context.startObject(inObject, outObject))
+ return context.null();
+ inputObjectStack.append(inObject);
+ outputObjectStack.append(outObject);
+ indexStack.append(0);
+ context.getPropertyNames(inObject, propertyStack);
+ // fallthrough
+ }
+ objectStartVisitMember:
+ case ObjectStartVisitMember: {
+ if (!--tickCount) {
+ if (context.didTimeOut()) {
+ context.throwInterruptedException();
+ return context.null();
+ }
+ tickCount = context.ticksUntilNextCheck();
+ }
+
+ InputObject object = inputObjectStack.last();
+ uint32_t index = indexStack.last();
+ PropertyList& properties = propertyStack.last();
+ if (index == properties.size()) {
+ InputObject inObject = inputObjectStack.last();
+ OutputObject outObject = outputObjectStack.last();
+ context.endObject(inObject, outObject);
+ outValue = outObject;
+ inputObjectStack.removeLast();
+ outputObjectStack.removeLast();
+ indexStack.removeLast();
+ propertyStack.removeLast();
+ break;
+ }
+ inValue = context.getProperty(object, properties[index], index);
+
+ if (context.shouldTerminate())
+ return context.null();
+
+ if (OutputType transformed = context.convertIfTerminal(inValue))
+ outValue = transformed;
+ else {
+ stateStack.append(ObjectEndVisitMember);
+ goto stateUnknown;
+ }
+ // fallthrough
+ }
+ case ObjectEndVisitMember: {
+ context.putProperty(outputObjectStack.last(), propertyStack.last()[indexStack.last()], outValue);
+ if (context.shouldTerminate())
+ return context.null();
+
+ indexStack.last()++;
+ goto objectStartVisitMember;
+ }
+ stateUnknown:
+ case StateUnknown:
+ if (OutputType transformed = context.convertIfTerminal(inValue)) {
+ outValue = transformed;
+ break;
+ }
+ if (context.isArray(inValue))
+ goto arrayStartState;
+ goto objectStartState;
+ }
+ if (stateStack.isEmpty())
+ break;
+
+ state = stateStack.last();
+ stateStack.removeLast();
+
+ if (!--tickCount) {
+ if (context.didTimeOut()) {
+ context.throwInterruptedException();
+ return context.null();
+ }
+ tickCount = context.ticksUntilNextCheck();
+ }
+ }
+ return outValue;
+}
+
+struct BaseWalker {
+ BaseWalker(ExecState* exec)
+ : m_exec(exec)
+ , m_timeoutChecker(exec->globalData().timeoutChecker)
+ {
+ m_timeoutChecker.reset();
+ }
+ ExecState* m_exec;
+ TimeoutChecker m_timeoutChecker;
+ MarkedArgumentBuffer m_gcBuffer;
+
+ bool shouldTerminate()
+ {
+ return m_exec->hadException();
+ }
+
+ unsigned ticksUntilNextCheck()
+ {
+ return m_timeoutChecker.ticksUntilNextCheck();
+ }
+
+ bool didTimeOut()
+ {
+ return m_timeoutChecker.didTimeOut(m_exec);
+ }
+
+ void throwStackOverflow()
+ {
+ m_exec->setException(createStackOverflowError(m_exec));
+ }
+
+ void throwInterruptedException()
+ {
+ m_exec->setException(createInterruptedExecutionException(&m_exec->globalData()));
+ }
+};
+
+struct SerializingTreeWalker : public BaseWalker {
+ typedef JSValue InputType;
+ typedef JSArray* InputArray;
+ typedef JSObject* InputObject;
+ typedef SerializedScriptValueData OutputType;
+ typedef RefPtr<SerializedArray> OutputArray;
+ typedef RefPtr<SerializedObject> OutputObject;
+ typedef PropertyNameArray PropertyList;
+
+ SerializingTreeWalker(ExecState* exec)
+ : BaseWalker(exec)
+ {
+ }
+
+ OutputType null() { return SerializedScriptValueData(); }
+
+ bool isArray(JSValue value)
+ {
+ if (!value.isObject())
+ return false;
+ JSObject* object = asObject(value);
+ return isJSArray(&m_exec->globalData(), object) || object->inherits(&JSArray::info);
+ }
+
+ bool isObject(JSValue value)
+ {
+ return value.isObject();
+ }
+
+ JSArray* asInputArray(JSValue value)
+ {
+ return asArray(value);
+ }
+
+ JSObject* asInputObject(JSValue value)
+ {
+ return asObject(value);
+ }
+
+ PassRefPtr<SerializedArray> createOutputArray(unsigned length)
+ {
+ return SerializedArray::create(length);
+ }
+
+ PassRefPtr<SerializedObject> createOutputObject()
+ {
+ return SerializedObject::create();
+ }
+
+ uint32_t length(JSValue array)
+ {
+ ASSERT(array.isObject());
+ JSObject* object = asObject(array);
+ return object->get(m_exec, m_exec->propertyNames().length).toUInt32(m_exec);
+ }
+
+ bool canDoFastRead(JSArray* array, unsigned index)
+ {
+ return isJSArray(&m_exec->globalData(), array) && array->canGetIndex(index);
+ }
+
+ JSValue getIndex(JSArray* array, unsigned index)
+ {
+ return array->getIndex(index);
+ }
+
+ JSValue getSparseIndex(JSObject* object, unsigned propertyName, bool& hasIndex)
+ {
+ PropertySlot slot(object);
+ if (object->getOwnPropertySlot(m_exec, propertyName, slot)) {
+ hasIndex = true;
+ return slot.getValue(m_exec, propertyName);
+ }
+ hasIndex = false;
+ return jsNull();
+ }
+
+ JSValue getProperty(JSObject* object, const Identifier& propertyName, unsigned)
+ {
+ PropertySlot slot(object);
+ if (object->getOwnPropertySlot(m_exec, propertyName, slot))
+ return slot.getValue(m_exec, propertyName);
+ return jsNull();
+ }
+
+ SerializedScriptValueData convertIfTerminal(JSValue value)
+ {
+ if (!value.isCell())
+ return SerializedScriptValueData(value);
+
+ if (value.isString())
+ return SerializedScriptValueData(asString(value)->value());
+
+ if (value.isNumber())
+ return SerializedScriptValueData(SerializedScriptValueData::NumberType, value.uncheckedGetNumber());
+
+ if (value.isObject() && asObject(value)->inherits(&DateInstance::info))
+ return SerializedScriptValueData(SerializedScriptValueData::DateType, asDateInstance(value)->internalNumber());
+
+ if (isArray(value))
+ return SerializedScriptValueData();
+
+ CallData unusedData;
+ if (value.isObject() && value.getCallData(unusedData) == CallTypeNone)
+ return SerializedScriptValueData();
+
+ // Any other types are expected to serialize as null.
+ return SerializedScriptValueData(jsNull());
+ }
+
+ void getPropertyNames(JSObject* object, Vector<PropertyNameArray, 16>& propertyStack)
+ {
+ propertyStack.append(PropertyNameArray(m_exec));
+ object->getOwnPropertyNames(m_exec, propertyStack.last());
+ }
+
+ void putProperty(RefPtr<SerializedArray> array, unsigned propertyName, const SerializedScriptValueData& value)
+ {
+ array->setIndex(propertyName, value);
+ }
+
+ void putProperty(RefPtr<SerializedObject> object, const Identifier& propertyName, const SerializedScriptValueData& value)
+ {
+ object->set(propertyName, value);
+ }
+
+ bool startArray(JSArray* inArray, RefPtr<SerializedArray>)
+ {
+ // Cycle detection
+ if (!m_cycleDetector.add(inArray).second) {
+ m_exec->setException(createTypeError(m_exec, "Cannot post cyclic structures."));
+ return false;
+ }
+ m_gcBuffer.append(inArray);
+ return true;
+ }
+
+ void endArray(JSArray* inArray, RefPtr<SerializedArray>)
+ {
+ m_cycleDetector.remove(inArray);
+ m_gcBuffer.removeLast();
+ }
+
+ bool startObject(JSObject* inObject, RefPtr<SerializedObject>)
+ {
+ // Cycle detection
+ if (!m_cycleDetector.add(inObject).second) {
+ m_exec->setException(createTypeError(m_exec, "Cannot post cyclic structures."));
+ return false;
+ }
+ m_gcBuffer.append(inObject);
+ return true;
+ }
+
+ void endObject(JSObject* inObject, RefPtr<SerializedObject>)
+ {
+ m_cycleDetector.remove(inObject);
+ m_gcBuffer.removeLast();
+ }
+
+private:
+ HashSet<JSObject*> m_cycleDetector;
+};
+
+SerializedScriptValueData SerializedScriptValueData::serialize(ExecState* exec, JSValue inValue)
+{
+ SerializingTreeWalker context(exec);
+ return walk<SerializingTreeWalker>(context, inValue);
+}
+
+
+struct DeserializingTreeWalker : public BaseWalker {
+ typedef SerializedScriptValueData InputType;
+ typedef RefPtr<SerializedArray> InputArray;
+ typedef RefPtr<SerializedObject> InputObject;
+ typedef JSValue OutputType;
+ typedef JSArray* OutputArray;
+ typedef JSObject* OutputObject;
+ typedef SerializedObject::PropertyNameList PropertyList;
+
+ DeserializingTreeWalker(ExecState* exec, bool mustCopy)
+ : BaseWalker(exec)
+ , m_mustCopy(mustCopy)
+ {
+ }
+
+ OutputType null() { return jsNull(); }
+
+ bool isArray(const SerializedScriptValueData& value)
+ {
+ return value.type() == SerializedScriptValueData::ArrayType;
+ }
+
+ bool isObject(const SerializedScriptValueData& value)
+ {
+ return value.type() == SerializedScriptValueData::ObjectType;
+ }
+
+ SerializedArray* asInputArray(const SerializedScriptValueData& value)
+ {
+ return value.asArray();
+ }
+
+ SerializedObject* asInputObject(const SerializedScriptValueData& value)
+ {
+ return value.asObject();
+ }
+
+ JSArray* createOutputArray(unsigned length)
+ {
+ JSArray* array = constructEmptyArray(m_exec);
+ array->setLength(length);
+ return array;
+ }
+
+ JSObject* createOutputObject()
+ {
+ return constructEmptyObject(m_exec);
+ }
+
+ uint32_t length(RefPtr<SerializedArray> array)
+ {
+ return array->length();
+ }
+
+ bool canDoFastRead(RefPtr<SerializedArray> array, unsigned index)
+ {
+ return array->canDoFastRead(index);
+ }
+
+ SerializedScriptValueData getIndex(RefPtr<SerializedArray> array, unsigned index)
+ {
+ return array->getIndex(index);
+ }
+
+ SerializedScriptValueData getSparseIndex(RefPtr<SerializedArray> array, unsigned propertyName, bool& hasIndex)
+ {
+ return array->getSparseIndex(propertyName, hasIndex);
+ }
+
+ SerializedScriptValueData getProperty(RefPtr<SerializedObject> object, const RefPtr<StringImpl>& propertyName, unsigned propertyIndex)
+ {
+ ASSERT(object->names()[propertyIndex] == propertyName);
+ UNUSED_PARAM(propertyName);
+ return object->values()[propertyIndex];
+ }
+
+ JSValue convertIfTerminal(SerializedScriptValueData& value)
+ {
+ switch (value.type()) {
+ case SerializedScriptValueData::ArrayType:
+ case SerializedScriptValueData::ObjectType:
+ return JSValue();
+ case SerializedScriptValueData::StringType:
+ return jsString(m_exec, value.asString().crossThreadString());
+ case SerializedScriptValueData::ImmediateType:
+ return value.asImmediate();
+ case SerializedScriptValueData::NumberType:
+ return jsNumber(m_exec, value.asDouble());
+ case SerializedScriptValueData::DateType:
+ return new (m_exec) DateInstance(m_exec, value.asDouble());
+ default:
+ ASSERT_NOT_REACHED();
+ return JSValue();
+ }
+ }
+
+ void getPropertyNames(RefPtr<SerializedObject> object, Vector<SerializedObject::PropertyNameList, 16>& properties)
+ {
+ properties.append(object->names());
+ }
+
+ void putProperty(JSArray* array, unsigned propertyName, JSValue value)
+ {
+ array->put(m_exec, propertyName, value);
+ }
+
+ void putProperty(JSObject* object, const RefPtr<StringImpl> propertyName, JSValue value)
+ {
+ object->putDirect(Identifier(m_exec, String(propertyName)), value);
+ }
+
+ bool startArray(RefPtr<SerializedArray>, JSArray* outArray)
+ {
+ m_gcBuffer.append(outArray);
+ return true;
+ }
+ void endArray(RefPtr<SerializedArray>, JSArray*)
+ {
+ m_gcBuffer.removeLast();
+ }
+ bool startObject(RefPtr<SerializedObject>, JSObject* outObject)
+ {
+ m_gcBuffer.append(outObject);
+ return true;
+ }
+ void endObject(RefPtr<SerializedObject>, JSObject*)
+ {
+ m_gcBuffer.removeLast();
+ }
+
+private:
+ bool m_mustCopy;
+};
+
+JSValue SerializedScriptValueData::deserialize(ExecState* exec, bool mustCopy) const
+{
+ DeserializingTreeWalker context(exec, mustCopy);
+ return walk<DeserializingTreeWalker>(context, *this);
+}
+
+struct TeardownTreeWalker {
+ typedef SerializedScriptValueData InputType;
+ typedef RefPtr<SerializedArray> InputArray;
+ typedef RefPtr<SerializedObject> InputObject;
+ typedef bool OutputType;
+ typedef bool OutputArray;
+ typedef bool OutputObject;
+ typedef SerializedObject::PropertyNameList PropertyList;
+
+ bool shouldTerminate()
+ {
+ return false;
+ }
+
+ unsigned ticksUntilNextCheck()
+ {
+ return 0xFFFFFFFF;
+ }
+
+ bool didTimeOut()
+ {
+ return false;
+ }
+
+ void throwStackOverflow()
+ {
+ }
+
+ void throwInterruptedException()
+ {
+ }
+
+ bool null() { return false; }
+
+ bool isArray(const SerializedScriptValueData& value)
+ {
+ return value.type() == SerializedScriptValueData::ArrayType;
+ }
+
+ bool isObject(const SerializedScriptValueData& value)
+ {
+ return value.type() == SerializedScriptValueData::ObjectType;
+ }
+
+ SerializedArray* asInputArray(const SerializedScriptValueData& value)
+ {
+ return value.asArray();
+ }
+
+ SerializedObject* asInputObject(const SerializedScriptValueData& value)
+ {
+ return value.asObject();
+ }
+
+ bool createOutputArray(unsigned)
+ {
+ return false;
+ }
+
+ bool createOutputObject()
+ {
+ return false;
+ }
+
+ uint32_t length(RefPtr<SerializedArray> array)
+ {
+ return array->length();
+ }
+
+ bool canDoFastRead(RefPtr<SerializedArray> array, unsigned index)
+ {
+ return array->canDoFastRead(index);
+ }
+
+ SerializedScriptValueData getIndex(RefPtr<SerializedArray> array, unsigned index)
+ {
+ return array->getIndex(index);
+ }
+
+ SerializedScriptValueData getSparseIndex(RefPtr<SerializedArray> array, unsigned propertyName, bool& hasIndex)
+ {
+ return array->getSparseIndex(propertyName, hasIndex);
+ }
+
+ SerializedScriptValueData getProperty(RefPtr<SerializedObject> object, const RefPtr<StringImpl>& propertyName, unsigned propertyIndex)
+ {
+ ASSERT(object->names()[propertyIndex] == propertyName);
+ UNUSED_PARAM(propertyName);
+ return object->values()[propertyIndex];
+ }
+
+ bool convertIfTerminal(SerializedScriptValueData& value)
+ {
+ switch (value.type()) {
+ case SerializedScriptValueData::ArrayType:
+ case SerializedScriptValueData::ObjectType:
+ return false;
+ case SerializedScriptValueData::StringType:
+ case SerializedScriptValueData::ImmediateType:
+ case SerializedScriptValueData::NumberType:
+ return true;
+ default:
+ ASSERT_NOT_REACHED();
+ return JSValue();
+ }
+ }
+
+ void getPropertyNames(RefPtr<SerializedObject> object, Vector<SerializedObject::PropertyNameList, 16>& properties)
+ {
+ properties.append(object->names());
+ }
+
+ void putProperty(bool, unsigned, bool)
+ {
+ }
+
+ void putProperty(bool, const RefPtr<StringImpl>&, bool)
+ {
+ }
+
+ bool startArray(RefPtr<SerializedArray>, bool)
+ {
+ return true;
+ }
+ void endArray(RefPtr<SerializedArray> array, bool)
+ {
+ array->clear();
+ }
+ bool startObject(RefPtr<SerializedObject>, bool)
+ {
+ return true;
+ }
+ void endObject(RefPtr<SerializedObject> object, bool)
+ {
+ object->clear();
+ }
+};
+
+void SerializedScriptValueData::tearDownSerializedData()
+{
+ if (m_sharedData && m_sharedData->refCount() > 1)
+ return;
+ TeardownTreeWalker context;
+ walk<TeardownTreeWalker>(context, *this);
+}
+
+}
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.h b/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.h
new file mode 100644
index 0000000..f8a126f
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/bindings/js/SerializedScriptValue.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef SerializedScriptValue_h
+#define SerializedScriptValue_h
+
+#include "ScriptValue.h"
+
+namespace WebCore {
+ class SerializedObject;
+ class SerializedArray;
+
+ class SharedSerializedData : public RefCounted<SharedSerializedData> {
+ public:
+ virtual ~SharedSerializedData() { }
+ SerializedArray* asArray();
+ SerializedObject* asObject();
+ };
+
+ class SerializedScriptValue;
+
+ class SerializedScriptValueData {
+ public:
+ enum SerializedType {
+ EmptyType,
+ DateType,
+ NumberType,
+ ImmediateType,
+ ObjectType,
+ ArrayType,
+ StringType
+ };
+
+ SerializedType type() const { return m_type; }
+ static SerializedScriptValueData serialize(JSC::ExecState*, JSC::JSValue);
+ JSC::JSValue deserialize(JSC::ExecState*, bool mustCopy) const;
+
+ ~SerializedScriptValueData()
+ {
+ if (m_sharedData)
+ tearDownSerializedData();
+ }
+
+ SerializedScriptValueData()
+ : m_type(EmptyType)
+ {
+ }
+
+ explicit SerializedScriptValueData(const String& string)
+ : m_type(StringType)
+ , m_string(string.crossThreadString()) // FIXME: Should be able to just share the Rep
+ {
+ }
+
+ explicit SerializedScriptValueData(JSC::JSValue value)
+ : m_type(ImmediateType)
+ {
+ ASSERT(!value.isCell());
+ m_data.m_immediate = JSC::JSValue::encode(value);
+ }
+
+ SerializedScriptValueData(SerializedType type, double value)
+ : m_type(type)
+ {
+ m_data.m_double = value;
+ }
+
+ SerializedScriptValueData(RefPtr<SerializedObject>);
+ SerializedScriptValueData(RefPtr<SerializedArray>);
+
+ JSC::JSValue asImmediate() const
+ {
+ ASSERT(m_type == ImmediateType);
+ return JSC::JSValue::decode(m_data.m_immediate);
+ }
+
+ double asDouble() const
+ {
+ ASSERT(m_type == NumberType || m_type == DateType);
+ return m_data.m_double;
+ }
+
+ String asString() const
+ {
+ ASSERT(m_type == StringType);
+ return m_string;
+ }
+
+ SerializedObject* asObject() const
+ {
+ ASSERT(m_type == ObjectType);
+ ASSERT(m_sharedData);
+ return m_sharedData->asObject();
+ }
+
+ SerializedArray* asArray() const
+ {
+ ASSERT(m_type == ArrayType);
+ ASSERT(m_sharedData);
+ return m_sharedData->asArray();
+ }
+
+ operator bool() const { return m_type != EmptyType; }
+
+ SerializedScriptValueData release()
+ {
+ SerializedScriptValueData result = *this;
+ *this = SerializedScriptValueData();
+ return result;
+ }
+
+ private:
+ void tearDownSerializedData();
+ SerializedType m_type;
+ RefPtr<SharedSerializedData> m_sharedData;
+ String m_string;
+ union {
+ double m_double;
+ JSC::EncodedJSValue m_immediate;
+ } m_data;
+ };
+
+ class SerializedScriptValue : public RefCounted<SerializedScriptValue> {
+ public:
+ static PassRefPtr<SerializedScriptValue> create(JSC::ExecState* exec, JSC::JSValue value)
+ {
+ return adoptRef(new SerializedScriptValue(SerializedScriptValueData::serialize(exec, value)));
+ }
+
+ static PassRefPtr<SerializedScriptValue> create(String string)
+ {
+ return adoptRef(new SerializedScriptValue(SerializedScriptValueData(string)));
+ }
+
+ static PassRefPtr<SerializedScriptValue> create()
+ {
+ return adoptRef(new SerializedScriptValue(SerializedScriptValueData()));
+ }
+
+ PassRefPtr<SerializedScriptValue> release()
+ {
+ PassRefPtr<SerializedScriptValue> result = adoptRef(new SerializedScriptValue(m_value));
+ m_value = SerializedScriptValueData();
+ result->m_mustCopy = true;
+ return result;
+ }
+
+ String toString()
+ {
+ if (m_value.type() != SerializedScriptValueData::StringType)
+ return "";
+ return m_value.asString();
+ }
+
+ JSC::JSValue deserialize(JSC::ExecState* exec)
+ {
+ if (!m_value)
+ return JSC::jsNull();
+ return m_value.deserialize(exec, m_mustCopy);
+ }
+
+ ~SerializedScriptValue() {}
+
+ private:
+ SerializedScriptValue(SerializedScriptValueData value)
+ : m_value(value)
+ , m_mustCopy(false)
+ {
+ }
+
+ SerializedScriptValueData m_value;
+ bool m_mustCopy;
+ };
+}
+
+#endif // SerializedScriptValue_h
diff --git a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm
index 92bd390..c1cb0a0 100644
--- a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm
+++ b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGenerator.pm
@@ -59,6 +59,12 @@ my %svgAnimatedTypeHash = ("SVGAnimatedAngle" => 1, "SVGAnimatedBoolean" => 1,
"SVGAnimatedRect" => 1, "SVGAnimatedString" => 1,
"SVGAnimatedTransformList" => 1);
+my %svgAttributesInHTMLHash = ("class" => 1, "id" => 1, "onabort" => 1, "onclick" => 1,
+ "onerror" => 1, "onload" => 1, "onmousedown" => 1,
+ "onmousemove" => 1, "onmouseout" => 1, "onmouseover" => 1,
+ "onmouseup" => 1, "onresize" => 1, "onscroll" => 1,
+ "onunload" => 1);
+
# Cache of IDL file pathnames.
my $idlFiles;
@@ -347,4 +353,12 @@ sub WK_lcfirst
return $ret;
}
+# Return the C++ namespace that a given attribute name string is defined in.
+sub NamespaceForAttributeName
+{
+ my ($object, $interfaceName, $attributeName) = @_;
+ return "SVGNames" if $interfaceName =~ /^SVG/ && !$svgAttributesInHTMLHash{$attributeName};
+ return "HTMLNames";
+}
+
1;
diff --git a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm
index 4d5cb96..4ca441b 100644
--- a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm
+++ b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorCOM.pm
@@ -524,7 +524,7 @@ sub GenerateCPPAttributeSignature
sub GenerateCPPAttribute
{
- my ($attribute, $className, $implementationClass) = @_;
+ my ($attribute, $className, $implementationClass, $IDLType) = @_;
my $implementationClassWithoutNamespace = StripNamespace($implementationClass);
@@ -598,9 +598,10 @@ sub GenerateCPPAttribute
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $CPPImplementationWebCoreIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $attributeName : ($reflect || $reflectURL);
- push(@setterImplementation, " impl${implementationClassWithoutNamespace}()->setAttribute(WebCore::HTMLNames::${contentAttributeName}Attr, " . join(", ", @setterParams) . ");\n");
+ my $namespace = $codeGenerator->NamespaceForAttributeName($IDLType, $contentAttributeName);
+ $CPPImplementationWebCoreIncludes{"${namespace}.h"} = 1;
+ push(@setterImplementation, " impl${implementationClassWithoutNamespace}()->setAttribute(WebCore::${namespace}::${contentAttributeName}Attr, " . join(", ", @setterParams) . ");\n");
} else {
push(@setterImplementation, " impl${implementationClassWithoutNamespace}()->${setterName}(" . join(", ", @setterParams) . ");\n");
}
@@ -620,10 +621,11 @@ sub GenerateCPPAttribute
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $attributeName : ($reflect || $reflectURL);
+ my $namespace = $codeGenerator->NamespaceForAttributeName($IDLType, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
my $getAttributeFunctionName = $reflectURL ? "getURLAttribute" : "getAttribute";
- $implementationGetter = "impl${implementationClassWithoutNamespace}()->${getAttributeFunctionName}(WebCore::HTMLNames::${contentAttributeName}Attr)";
+ $implementationGetter = "impl${implementationClassWithoutNamespace}()->${getAttributeFunctionName}(WebCore::${namespace}::${contentAttributeName}Attr)";
} else {
$implementationGetter = "impl${implementationClassWithoutNamespace}()->" . $codeGenerator->WK_lcfirst($attributeName) . "(" . ($hasGetterException ? "ec" : ""). ")";
}
@@ -1154,7 +1156,7 @@ sub GenerateCPPImplementation
AddIncludesForTypeInCPPImplementation($attribute->signature->type);
- my %attributes = GenerateCPPAttribute($attribute, $className, $implementationClass);
+ my %attributes = GenerateCPPAttribute($attribute, $className, $implementationClass, $IDLType);
push(@CPPImplementationContent, values(%attributes));
}
}
@@ -1182,7 +1184,7 @@ sub GenerateCPPImplementation
AddIncludesForTypeInCPPImplementation($attribute->signature->type);
- my %attributes = GenerateCPPAttribute($attribute, $className, $implementationClass);
+ my %attributes = GenerateCPPAttribute($attribute, $className, $implementationClass, $IDLType);
push(@CPPImplementationContent, values(%attributes));
}
}
diff --git a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm
index d552aa0..ff7b52f 100644
--- a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm
+++ b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorJS.pm
@@ -463,6 +463,7 @@ sub GenerateHeader
my $className = "JS$interfaceName";
my $implClassName = $interfaceName;
my @ancestorInterfaceNames = ();
+ my %structureFlags = ();
# We only support multiple parents with SVG (for now).
if (@{$dataNode->parents} > 1) {
@@ -574,6 +575,7 @@ sub GenerateHeader
push(@headerContent, " virtual bool getOwnPropertySlot(JSC::ExecState*, unsigned propertyName, JSC::PropertySlot&);\n") if ($dataNode->extendedAttributes->{"HasIndexGetter"} || $dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"}) && !$dataNode->extendedAttributes->{"HasOverridingNameGetter"};
push(@headerContent, " bool getOwnPropertySlotDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::PropertySlot&);\n") if $dataNode->extendedAttributes->{"DelegatingGetOwnPropertySlot"};
push(@headerContent, " bool getOwnPropertyDescriptorDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);\n") if $dataNode->extendedAttributes->{"DelegatingGetOwnPropertySlot"};
+ $structureFlags{"JSC::OverridesGetOwnPropertySlot"} = 1;
}
# Check if we have any writable properties
@@ -602,21 +604,20 @@ sub GenerateHeader
# Structure ID
if ($interfaceName eq "DOMWindow") {
- push(@headerContent,
- " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
- " {\n" .
- " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance | JSC::NeedsThisConversion));\n" .
- " }\n\n");
- } elsif ($hasGetter) {
- push(@headerContent,
- " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
- " {\n" .
- " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));\n" .
- " }\n\n");
+ $structureFlags{"JSC::ImplementsHasInstance"} = 1;
+ $structureFlags{"JSC::NeedsThisConversion"} = 1;
}
+ push(@headerContent,
+ " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
+ " {\n" .
+ " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));\n" .
+ " }\n\n");
# markChildren function
- push(@headerContent, " virtual void markChildren(JSC::MarkStack&);\n\n") if $needsMarkChildren;
+ if ($needsMarkChildren) {
+ push(@headerContent, " virtual void markChildren(JSC::MarkStack&);\n\n");
+ $structureFlags{"JSC::OverridesMarkChildren"} = 1;
+ }
# Custom pushEventHandlerScope function
push(@headerContent, " virtual void pushEventHandlerScope(JSC::ExecState*, JSC::ScopeChain&) const;\n\n") if $dataNode->extendedAttributes->{"CustomPushEventHandlerScope"};
@@ -628,13 +629,19 @@ sub GenerateHeader
push(@headerContent, " virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier&);\n") if $dataNode->extendedAttributes->{"CustomDeleteProperty"};
# Custom getPropertyNames function exists on DOMWindow
- push(@headerContent, " virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);\n") if $interfaceName eq "DOMWindow";
+ if ($interfaceName eq "DOMWindow") {
+ push(@headerContent, " virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);\n");
+ $structureFlags{"JSC::OverridesGetPropertyNames"} = 1;
+ }
# Custom defineProperty function exists on DOMWindow
push(@headerContent, " virtual bool defineOwnProperty(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&, bool shouldThrow);\n") if $interfaceName eq "DOMWindow";
# Custom getOwnPropertyNames function
- push(@headerContent, " virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);\n") if ($dataNode->extendedAttributes->{"CustomGetPropertyNames"} || $dataNode->extendedAttributes->{"HasIndexGetter"} || $dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"});
+ if ($dataNode->extendedAttributes->{"CustomGetPropertyNames"} || $dataNode->extendedAttributes->{"HasIndexGetter"} || $dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"}) {
+ push(@headerContent, " virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);\n");
+ $structureFlags{"JSC::OverridesGetPropertyNames"} = 1;
+ }
# Custom getPropertyAttributes function
push(@headerContent, " virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&, unsigned& attributes) const;\n") if $dataNode->extendedAttributes->{"CustomGetPropertyAttributes"};
@@ -712,6 +719,14 @@ sub GenerateHeader
push(@headerContent, " return static_cast<$implClassName*>(Base::impl());\n");
push(@headerContent, " }\n");
}
+
+ # structure flags
+ push(@headerContent, "protected:\n");
+ push(@headerContent, " static const unsigned StructureFlags = ");
+ foreach my $structureFlag (keys %structureFlags) {
+ push(@headerContent, $structureFlag . " | ");
+ }
+ push(@headerContent, "Base::StructureFlags;\n");
# Index getter
if ($dataNode->extendedAttributes->{"HasIndexGetter"}) {
@@ -719,6 +734,7 @@ sub GenerateHeader
}
if ($dataNode->extendedAttributes->{"HasCustomIndexGetter"} || $dataNode->extendedAttributes->{"HasNumericIndexGetter"}) {
push(@headerContent, " JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);\n");
+
}
# Index setter
@@ -770,6 +786,7 @@ sub GenerateHeader
push(@headerContent, "\n");
# Add prototype declaration.
+ %structureFlags = ();
push(@headerContent, "class ${className}Prototype : public JSC::JSObject {\n");
push(@headerContent, " typedef JSC::JSObject Base;\n");
push(@headerContent, "public:\n");
@@ -787,19 +804,16 @@ sub GenerateHeader
push(@headerContent, " virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);\n");
push(@headerContent, " bool getOwnPropertySlotDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::PropertySlot&);\n") if $dataNode->extendedAttributes->{"DelegatingPrototypeGetOwnPropertySlot"};
push(@headerContent, " bool getOwnPropertyDescriptorDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);\n") if $dataNode->extendedAttributes->{"DelegatingPrototypeGetOwnPropertySlot"};
-
- push(@headerContent,
- " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
- " {\n" .
- " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType" . ($needsMarkChildren ? "" : ", JSC::HasDefaultMark") . "));\n" .
- " }\n");
- } elsif ($dataNode->extendedAttributes->{"CustomMarkFunction"}) {
- push(@headerContent,
- " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
- " {\n" .
- " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));\n" .
- " }\n");
+ $structureFlags{"JSC::OverridesGetOwnPropertySlot"} = 1;
}
+ if ($dataNode->extendedAttributes->{"CustomMarkFunction"} or $needsMarkChildren) {
+ $structureFlags{"JSC::OverridesMarkChildren"} = 1;
+ }
+ push(@headerContent,
+ " static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)\n" .
+ " {\n" .
+ " return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));\n" .
+ " }\n");
if ($dataNode->extendedAttributes->{"DelegatingPrototypePutFunction"}) {
push(@headerContent, " virtual void put(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&);\n");
push(@headerContent, " bool putDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::JSValue, JSC::PutPropertySlot&);\n");
@@ -810,6 +824,14 @@ sub GenerateHeader
push(@headerContent, " ${className}Prototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }\n");
+ # structure flags
+ push(@headerContent, "protected:\n");
+ push(@headerContent, " static const unsigned StructureFlags = ");
+ foreach my $structureFlag (keys %structureFlags) {
+ push(@headerContent, $structureFlag . " | ");
+ }
+ push(@headerContent, "Base::StructureFlags;\n");
+
push(@headerContent, "};\n\n");
if ($numFunctions > 0) {
@@ -1323,10 +1345,11 @@ sub GenerateImplementation
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $name : ($reflect || $reflectURL);
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
my $getAttributeFunctionName = $reflectURL ? "getURLAttribute" : "getAttribute";
- $value = "imp->$getAttributeFunctionName(HTMLNames::${contentAttributeName}Attr)"
+ $value = "imp->$getAttributeFunctionName(${namespace}::${contentAttributeName}Attr)"
} else {
$value = "imp->$implGetterFunctionName()";
}
@@ -1483,9 +1506,10 @@ sub GenerateImplementation
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $name : ($reflect || $reflectURL);
- push(@implContent, " imp->setAttribute(HTMLNames::${contentAttributeName}Attr, $nativeValue");
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
+ push(@implContent, " imp->setAttribute(${namespace}::${contentAttributeName}Attr, $nativeValue");
} else {
push(@implContent, " imp->set$implSetterFunctionName($nativeValue");
}
@@ -1842,6 +1866,11 @@ sub JSValueToNative
return "$value.toString(exec)";
}
+ if ($type eq "SerializedScriptValue") {
+ $implIncludes{"SerializedScriptValue.h"} = 1;
+ return "SerializedScriptValue::create(exec, $value)";
+ }
+
$implIncludes{"FloatPoint.h"} = 1 if $type eq "SVGPoint";
$implIncludes{"FloatRect.h"} = 1 if $type eq "SVGRect";
$implIncludes{"HTMLOptionElement.h"} = 1 if $type eq "HTMLOptionElement";
@@ -1928,6 +1957,8 @@ sub NativeToJSValue
}
if ($codeGenerator->IsSVGAnimatedType($type)) {
+ # Some SVGFE*Element.idl use 'operator' as attribute name, rewrite as '_operator' to avoid clashes with C/C++
+ $value =~ s/operator\(\)/_operator\(\)/ if ($value =~ /operator/);
$value =~ s/\(\)//;
$value .= "Animated()";
}
@@ -1947,6 +1978,9 @@ sub NativeToJSValue
$joinedName = $type;
$joinedName =~ s/Abs|Rel//;
$implIncludes{"$joinedName.h"} = 1;
+ } elsif ($type eq "SerializedScriptValue") {
+ $implIncludes{"$type.h"} = 1;
+ return "$value->deserialize(exec)";
} else {
# Default, include header with same name.
$implIncludes{"JS$type.h"} = 1;
@@ -2241,8 +2275,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
EOF
if ($canConstruct) {
diff --git a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm
index 0026ba1..91248c5 100644
--- a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm
+++ b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorObjC.pm
@@ -311,7 +311,7 @@ sub GetClassName
my $name = $codeGenerator->StripModule(shift);
# special cases
- return "NSString" if $codeGenerator->IsStringType($name);
+ return "NSString" if $codeGenerator->IsStringType($name) or $name eq "SerializedScriptValue";
return "NS$name" if IsNativeObjCType($name);
return "BOOL" if $name eq "boolean";
return "unsigned" if $name eq "unsigned long";
@@ -492,6 +492,11 @@ sub GetObjCTypeGetter
return "WTF::getPtr(nativeEventListener)" if $type eq "EventListener";
return "WTF::getPtr(nativeNodeFilter)" if $type eq "NodeFilter";
return "WTF::getPtr(nativeResolver)" if $type eq "XPathNSResolver";
+
+ if ($type eq "SerializedScriptValue") {
+ $implIncludes{"SerializedScriptValue.h"} = 1;
+ return "WebCore::SerializedScriptValue::create(WebCore::String($argName))";
+ }
return "core($argName)";
}
@@ -607,6 +612,11 @@ sub AddIncludesForType
return;
}
+ if ($type eq "SerializedScriptValue") {
+ $implIncludes{"SerializedScriptValue.h"} = 1;
+ return;
+ }
+
# FIXME: won't compile without these
$implIncludes{"CSSMutableStyleDeclaration.h"} = 1 if $type eq "CSSStyleDeclaration";
$implIncludes{"NameNodeList.h"} = 1 if $type eq "NodeList";
@@ -715,6 +725,8 @@ sub GenerateHeader
my $attributeIsReadonly = ($attribute->type =~ /^readonly/);
my $property = "\@property" . GetPropertyAttributes($attribute->signature->type, $attributeIsReadonly);
+ # Some SVGFE*Element.idl use 'operator' as attribute name, rewrite as '_operator' to avoid clashes with C/C++
+ $attributeName =~ s/operator/_operator/ if ($attributeName =~ /operator/);
$property .= " " . $attributeType . ($attributeType =~ /\*$/ ? "" : " ") . $attributeName;
my $publicInterfaceKey = $property . ";";
@@ -1139,15 +1151,21 @@ sub GenerateImplementation
# - GETTER
my $getterSig = "- ($attributeType)$attributeInterfaceName\n";
+
+ # Some SVGFE*Element.idl use 'operator' as attribute name, rewrite as '_operator' to avoid clashes with C/C++
+ $attributeName =~ s/operatorAnimated/_operatorAnimated/ if ($attributeName =~ /operatorAnimated/);
+ $getterSig =~ s/operator/_operator/ if ($getterSig =~ /operator/);
+
my $hasGetterException = @{$attribute->getterExceptions};
my $getterContentHead;
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $attributeName : ($reflect || $reflectURL);
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
my $getAttributeFunctionName = $reflectURL ? "getURLAttribute" : "getAttribute";
- $getterContentHead = "IMPL->${getAttributeFunctionName}(WebCore::HTMLNames::${contentAttributeName}Attr";
+ $getterContentHead = "IMPL->${getAttributeFunctionName}(WebCore::${namespace}::${contentAttributeName}Attr";
} else {
$getterContentHead = "IMPL->" . $codeGenerator->WK_lcfirst($attributeName) . "(";
}
@@ -1212,6 +1230,9 @@ sub GenerateImplementation
} elsif ($idlType eq "Color") {
$getterContentHead = "WebCore::nsColor($getterContentHead";
$getterContentTail .= ")";
+ } elsif ($attribute->signature->type eq "SerializedScriptValue") {
+ $getterContentHead = "$getterContentHead";
+ $getterContentTail .= "->toString()";
} elsif (ConversionNeeded($attribute->signature->type)) {
$getterContentHead = "kit(WTF::getPtr($getterContentHead";
$getterContentTail .= "))";
@@ -1278,20 +1299,20 @@ sub GenerateImplementation
} else {
push(@implContent, " IMPL->$coreSetterName($arg);\n");
}
- } elsif ($hasSetterException) {
- push(@implContent, " $exceptionInit\n");
- push(@implContent, " IMPL->$coreSetterName($arg, ec);\n");
- push(@implContent, " $exceptionRaiseOnError\n");
} else {
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
+ push(@implContent, " $exceptionInit\n") if $hasSetterException;
+ my $ec = $hasSetterException ? ", ec" : "";
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = (($reflect || $reflectURL) eq "1") ? $attributeName : ($reflect || $reflectURL);
- push(@implContent, " IMPL->setAttribute(WebCore::HTMLNames::${contentAttributeName}Attr, $arg);\n");
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
+ push(@implContent, " IMPL->setAttribute(WebCore::${namespace}::${contentAttributeName}Attr, $arg$ec);\n");
} else {
- push(@implContent, " IMPL->$coreSetterName($arg);\n");
+ push(@implContent, " IMPL->$coreSetterName($arg$ec);\n");
}
+ push(@implContent, " $exceptionRaiseOnError\n") if $hasSetterException;
}
push(@implContent, "}\n\n");
@@ -1446,6 +1467,8 @@ sub GenerateImplementation
push(@functionContent, " return $toReturn;\n");
push(@functionContent, " return nil;\n");
}
+ } elsif ($returnType eq "SerializedScriptValue") {
+ $content = "foo";
} else {
if (ConversionNeeded($function->signature->type)) {
if ($codeGenerator->IsPodType($function->signature->type)) {
diff --git a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm
index 7f1508b..28562f1 100644
--- a/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/src/3rdparty/webkit/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -326,10 +326,26 @@ sub IsNodeSubType
return 0;
}
-sub RequiresCustomEventListenerAccessors
+sub GetHiddenDependencyIndex
{
my $dataNode = shift;
- return !IsNodeSubType($dataNode) && $dataNode->name ne "SVGElementInstance";
+ my $attribute = shift;
+ my $name = $dataNode->name;
+ return "V8Custom::kNodeEventListenerCacheIndex" if IsNodeSubType($dataNode);
+ return "V8Custom::kSVGElementInstanceEventListenerCacheIndex" if $name eq "SVGElementInstance";
+ return "V8Custom::kAbstractWorkerRequestCacheIndex" if $name eq "AbstractWorker";
+ return "V8Custom::kWorkerRequestCacheIndex" if $name eq "Worker";
+ return "V8Custom::kDedicatedWorkerContextRequestCacheIndex" if $name eq "DedicatedWorkerContext";
+ return "V8Custom::kWorkerContextRequestCacheIndex" if $name eq "WorkerContext";
+ return "V8Custom::kWorkerContextRequestCacheIndex" if $name eq "SharedWorkerContext";
+ return "V8Custom::kMessagePortRequestCacheIndex" if $name eq "MessagePort";
+ return "V8Custom::kWebSocketCacheIndex" if $name eq "WebSocket";
+ return "V8Custom::kXMLHttpRequestCacheIndex" if $name eq "XMLHttpRequest";
+ return "V8Custom::kXMLHttpRequestCacheIndex" if $name eq "XMLHttpRequestUpload";
+ return "V8Custom::kDOMApplicationCacheCacheIndex" if $name eq "DOMApplicationCache";
+ return "V8Custom::kNotificationRequestCacheIndex" if $name eq "Notification";
+ return "V8Custom::kDOMWindowEventListenerCacheIndex" if $name eq "DOMWindow";
+ die "Unexpected name " . $name . " when generating " . $attribute;
}
sub HolderToNative
@@ -444,6 +460,7 @@ sub GenerateNormalAttrGetter
my $dataNode = shift;
my $classIndex = shift;
my $implClassName = shift;
+ my $interfaceName = shift;
my $attrExt = $attribute->signature->extendedAttributes;
@@ -500,11 +517,17 @@ END
}
} elsif ($attrExt->{"v8OnProto"} || $attrExt->{"V8DisallowShadowing"}) {
+ if ($classIndex eq "DOMWINDOW") {
+ push(@implContentDecls, <<END);
+ v8::Handle<v8::Object> holder = info.Holder();
+END
+ } else {
# perform lookup first
push(@implContentDecls, <<END);
v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::$classIndex, info.This());
if (holder.IsEmpty()) return v8::Undefined();
END
+ }
HolderToNative($dataNode, $implClassName, $classIndex);
} else {
push(@implContentDecls, <<END);
@@ -540,10 +563,11 @@ END
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = ($reflect || $reflectURL) eq "1" ? $attrName : ($reflect || $reflectURL);
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
my $getAttributeFunctionName = $reflectURL ? "getURLAttribute" : "getAttribute";
- $getterString = "imp->$getAttributeFunctionName(HTMLNames::${contentAttributeName}Attr";
+ $getterString = "imp->$getAttributeFunctionName(${namespace}::${contentAttributeName}Attr";
} else {
$getterString = "imp->$getterFunc(";
}
@@ -594,6 +618,10 @@ END
}
} else {
+ if ($attribute->signature->type eq "EventListener" && $dataNode->name eq "DOMWindow") {
+ push(@implContentDecls, " if (!imp->document())\n");
+ push(@implContentDecls, " return v8::Undefined();\n");
+ }
push(@implContentDecls, " $nativeType v = ");
push(@implContentDecls, "$getterString;\n");
@@ -651,6 +679,7 @@ sub GenerateNormalAttrSetter
my $dataNode = shift;
my $classIndex = shift;
my $implClassName = shift;
+ my $interfaceName = shift;
my $attrExt = $attribute->signature->extendedAttributes;
@@ -672,11 +701,17 @@ sub GenerateNormalAttrSetter
push(@implContentDecls, " $implClassName* imp = &imp_instance;\n");
} elsif ($attrExt->{"v8OnProto"}) {
+ if ($classIndex eq "DOMWINDOW") {
+ push(@implContentDecls, <<END);
+ v8::Handle<v8::Object> holder = info.Holder();
+END
+ } else {
# perform lookup first
push(@implContentDecls, <<END);
v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::$classIndex, info.This());
- if (holder.IsEmpty()) return v8::Undefined();
+ if (holder.IsEmpty()) return;
END
+ }
HolderToNative($dataNode, $implClassName, $classIndex);
} else {
push(@implContentDecls, <<END);
@@ -687,7 +722,11 @@ END
my $nativeType = GetNativeTypeFromSignature($attribute->signature, 0);
if ($attribute->signature->type eq "EventListener") {
- push(@implContentDecls, " $nativeType v = V8DOMWrapper::getEventListener(imp, value, true, false);\n");
+ if ($dataNode->name eq "DOMWindow") {
+ push(@implContentDecls, " if (!imp->document())\n");
+ push(@implContentDecls, " return;\n");
+ }
+ push(@implContentDecls, " $nativeType v = V8DOMWrapper::getEventListener(imp, value, true, ListenerFindOrCreate);\n");
} else {
push(@implContentDecls, " $nativeType v = " . JSValueToNative($attribute->signature, "value") . ";\n");
}
@@ -719,20 +758,24 @@ END
my $reflect = $attribute->signature->extendedAttributes->{"Reflect"};
my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"};
if ($reflect || $reflectURL) {
- $implIncludes{"HTMLNames.h"} = 1;
my $contentAttributeName = ($reflect || $reflectURL) eq "1" ? $attrName : ($reflect || $reflectURL);
- push(@implContentDecls, " imp->setAttribute(HTMLNames::${contentAttributeName}Attr, $result");
+ my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName);
+ $implIncludes{"${namespace}.h"} = 1;
+ push(@implContentDecls, " imp->setAttribute(${namespace}::${contentAttributeName}Attr, $result");
} elsif ($attribute->signature->type eq "EventListener") {
$implIncludes{"V8AbstractEventListener.h"} = 1;
$implIncludes{"V8CustomBinding.h"} = 1;
+ $cacheIndex = GetHiddenDependencyIndex($dataNode, $attrName);
push(@implContentDecls, " $nativeType old = imp->$attrName();\n");
- push(@implContentDecls, " if (old && static_cast<V8AbstractEventListener*>(old.get())->isObjectListener()) {\n");
- push(@implContentDecls, " v8::Local<v8::Object> oldListener = static_cast<V8AbstractEventListener*>(old.get())->getListenerObject();\n");
- push(@implContentDecls, " removeHiddenDependency(holder, oldListener, V8Custom::kNodeEventListenerCacheIndex);\n");
+ push(@implContentDecls, " V8AbstractEventListener* oldListener = old ? V8AbstractEventListener::cast(old.get()) : 0;\n");
+ push(@implContentDecls, " if (oldListener) {\n");
+ push(@implContentDecls, " v8::Local<v8::Object> oldListenerObject = oldListener->getExistingListenerObject();\n");
+ push(@implContentDecls, " if (!oldListenerObject.IsEmpty())\n");
+ push(@implContentDecls, " removeHiddenDependency(holder, oldListenerObject, $cacheIndex);\n");
push(@implContentDecls, " }\n");
push(@implContentDecls, " imp->set$implSetterFunctionName($result);\n");
push(@implContentDecls, " if ($result)\n");
- push(@implContentDecls, " createHiddenDependency(holder, value, V8Custom::kNodeEventListenerCacheIndex");
+ push(@implContentDecls, " createHiddenDependency(holder, value, $cacheIndex");
} else {
push(@implContentDecls, " imp->set$implSetterFunctionName(" . $result);
}
@@ -905,142 +948,134 @@ sub GenerateBatchedAttributeData
my $attributes = shift;
foreach my $attribute (@$attributes) {
- my $attrName = $attribute->signature->name;
- my $attrExt = $attribute->signature->extendedAttributes;
-
- my $accessControl = "v8::DEFAULT";
- if ($attrExt->{"DoNotCheckDomainSecurityOnGet"}) {
- $accessControl = "v8::ALL_CAN_READ";
- } elsif ($attrExt->{"DoNotCheckDomainSecurityOnSet"}) {
- $accessControl = "v8::ALL_CAN_WRITE";
- } elsif ($attrExt->{"DoNotCheckDomainSecurity"}) {
- $accessControl = "v8::ALL_CAN_READ";
- if (!($attribute->type =~ /^readonly/) && !($attrExt->{"V8ReadOnly"})) {
- $accessControl .= "|v8::ALL_CAN_WRITE";
- }
- }
- if ($attrExt->{"V8DisallowShadowing"}) {
- $accessControl .= "|v8::PROHIBITS_OVERWRITING";
- }
- $accessControl = "static_cast<v8::AccessControl>(" . $accessControl . ")";
-
- my $customAccessor =
- $attrExt->{"Custom"} ||
- $attrExt->{"CustomSetter"} ||
- $attrExt->{"CustomGetter"} ||
- $attrExt->{"V8Custom"} ||
- $attrExt->{"V8CustomSetter"} ||
- $attrExt->{"V8CustomGetter"} ||
- "";
- if ($customAccessor eq 1) {
- # use the naming convension, interface + (capitalize) attr name
- $customAccessor = $interfaceName . $codeGenerator->WK_ucfirst($attrName);
- }
+ my $conditionalString = GenerateConditionalString($attribute->signature);
+ push(@implContent, "\n#if ${conditionalString}\n") if $conditionalString;
+ GenerateSingleBatchedAttribute($interfaceName, $attribute, ",", "");
+ push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
+ }
+}
- my $getter;
- my $setter;
- my $propAttr = "v8::None";
- my $hasCustomSetter = 0;
+sub GenerateSingleBatchedAttribute
+{
+ my $interfaceName = shift;
+ my $attribute = shift;
+ my $delimiter = shift;
+ my $indent = shift;
+ my $attrName = $attribute->signature->name;
+ my $attrExt = $attribute->signature->extendedAttributes;
- # Check attributes.
- if ($attrExt->{"DontEnum"}) {
- $propAttr .= "|v8::DontEnum";
- }
- if ($attrExt->{"V8DisallowShadowing"}) {
- $propAttr .= "|v8::DontDelete";
+ my $accessControl = "v8::DEFAULT";
+ if ($attrExt->{"DoNotCheckDomainSecurityOnGet"}) {
+ $accessControl = "v8::ALL_CAN_READ";
+ } elsif ($attrExt->{"DoNotCheckDomainSecurityOnSet"}) {
+ $accessControl = "v8::ALL_CAN_WRITE";
+ } elsif ($attrExt->{"DoNotCheckDomainSecurity"}) {
+ $accessControl = "v8::ALL_CAN_READ";
+ if (!($attribute->type =~ /^readonly/) && !($attrExt->{"V8ReadOnly"})) {
+ $accessControl .= "|v8::ALL_CAN_WRITE";
}
+ }
+ if ($attrExt->{"V8DisallowShadowing"}) {
+ $accessControl .= "|v8::PROHIBITS_OVERWRITING";
+ }
+ $accessControl = "static_cast<v8::AccessControl>(" . $accessControl . ")";
+
+ my $customAccessor =
+ $attrExt->{"Custom"} ||
+ $attrExt->{"CustomSetter"} ||
+ $attrExt->{"CustomGetter"} ||
+ $attrExt->{"V8Custom"} ||
+ $attrExt->{"V8CustomSetter"} ||
+ $attrExt->{"V8CustomGetter"} ||
+ "";
+ if ($customAccessor eq 1) {
+ # use the naming convension, interface + (capitalize) attr name
+ $customAccessor = $interfaceName . $codeGenerator->WK_ucfirst($attrName);
+ }
- my $on_proto = "0 /* on instance */";
- my $data = "V8ClassIndex::INVALID_CLASS_INDEX /* no data */";
+ my $getter;
+ my $setter;
+ my $propAttr = "v8::None";
+ my $hasCustomSetter = 0;
- # Constructor
- if ($attribute->signature->type =~ /Constructor$/) {
- my $constructorType = $codeGenerator->StripModule($attribute->signature->type);
- $constructorType =~ s/Constructor$//;
- my $constructorIndex = uc($constructorType);
+ # Check attributes.
+ if ($attrExt->{"DontEnum"}) {
+ $propAttr .= "|v8::DontEnum";
+ }
+ if ($attrExt->{"V8DisallowShadowing"}) {
+ $propAttr .= "|v8::DontDelete";
+ }
+
+ my $on_proto = "0 /* on instance */";
+ my $data = "V8ClassIndex::INVALID_CLASS_INDEX /* no data */";
+
+ # Constructor
+ if ($attribute->signature->type =~ /Constructor$/) {
+ my $constructorType = $codeGenerator->StripModule($attribute->signature->type);
+ $constructorType =~ s/Constructor$//;
+ my $constructorIndex = uc($constructorType);
+ if ($customAccessor) {
+ $getter = "V8Custom::v8${customAccessor}AccessorGetter";
+ } else {
$data = "V8ClassIndex::${constructorIndex}";
$getter = "${interfaceName}Internal::${interfaceName}ConstructorGetter";
- $setter = "0";
- $propAttr = "v8::ReadOnly";
-
- # EventListeners
- } elsif ($attribute->signature->type eq "EventListener" && RequiresCustomEventListenerAccessors($dataNode)) {
- if ($interfaceName eq "DOMWindow") {
- $getter = "V8Custom::v8DOMWindowEventHandlerAccessorGetter";
- $setter = "V8Custom::v8DOMWindowEventHandlerAccessorSetter";
- } elsif ($interfaceName eq "DOMApplicationCache") {
- $getter = "V8Custom::v8DOMApplicationCacheEventHandlerAccessorGetter";
- $setter = "V8Custom::v8DOMApplicationCacheEventHandlerAccessorSetter";
- } elsif ($interfaceName eq "Notification") {
- $getter = "V8Custom::v8NotificationEventHandlerAccessorGetter";
- $setter = "V8Custom::v8NotificationEventHandlerAccessorSetter";
- } else {
- $getter = "V8Custom::v8${customAccessor}AccessorGetter";
- if ($interfaceName eq "WorkerContext" and $attrName eq "self") {
- $setter = "0";
- $propAttr = "v8::ReadOnly";
- } else {
- $setter = "V8Custom::v8${customAccessor}AccessorSetter";
- }
- }
- } else {
- # Default Getter and Setter
- $getter = "${interfaceName}Internal::${attrName}AttrGetter";
- $setter = "${interfaceName}Internal::${attrName}AttrSetter";
-
- # Custom Setter
- if ($attrExt->{"CustomSetter"} || $attrExt->{"V8CustomSetter"} || $attrExt->{"Custom"} || $attrExt->{"V8Custom"}) {
- $hasCustomSetter = 1;
- $setter = "V8Custom::v8${customAccessor}AccessorSetter";
- }
-
- # Custom Getter
- if ($attrExt->{"CustomGetter"} || $attrExt->{"Custom"} || $attrExt->{"V8Custom"}) {
- $getter = "V8Custom::v8${customAccessor}AccessorGetter";
- }
}
+ $setter = "0";
+ $propAttr = "v8::ReadOnly";
- # Replaceable
- if ($attrExt->{"Replaceable"} && !$hasCustomSetter) {
- $setter = "0";
- # Handle the special case of window.top being marked as Replaceable.
- # FIXME: Investigate whether we could treat window.top as replaceable
- # and allow shadowing without it being a security hole.
- if (!($interfaceName eq "DOMWindow" and $attrName eq "top")) {
- $propAttr .= "|v8::ReadOnly";
- }
+ } else {
+ # Default Getter and Setter
+ $getter = "${interfaceName}Internal::${attrName}AttrGetter";
+ $setter = "${interfaceName}Internal::${attrName}AttrSetter";
+
+ # Custom Setter
+ if ($attrExt->{"CustomSetter"} || $attrExt->{"V8CustomSetter"} || $attrExt->{"Custom"} || $attrExt->{"V8Custom"}) {
+ $hasCustomSetter = 1;
+ $setter = "V8Custom::v8${customAccessor}AccessorSetter";
}
- # Read only attributes
- if ($attribute->type =~ /^readonly/ || $attrExt->{"V8ReadOnly"}) {
- $setter = "0";
+ # Custom Getter
+ if ($attrExt->{"CustomGetter"} || $attrExt->{"Custom"} || $attrExt->{"V8Custom"}) {
+ $getter = "V8Custom::v8${customAccessor}AccessorGetter";
}
+ }
- # An accessor can be installed on the proto
- if ($attrExt->{"v8OnProto"}) {
- $on_proto = "1 /* on proto */";
+ # Replaceable
+ if ($attrExt->{"Replaceable"} && !$hasCustomSetter) {
+ $setter = "0";
+ # Handle the special case of window.top being marked as Replaceable.
+ # FIXME: Investigate whether we could treat window.top as replaceable
+ # and allow shadowing without it being a security hole.
+ if (!($interfaceName eq "DOMWindow" and $attrName eq "top")) {
+ $propAttr .= "|v8::ReadOnly";
}
+ }
- my $commentInfo = "Attribute '$attrName' (Type: '" . $attribute->type .
- "' ExtAttr: '" . join(' ', keys(%{$attrExt})) . "')";
-
- my $conditionalString = GenerateConditionalString($attribute->signature);
- push(@implContent, "\n#if ${conditionalString}\n") if $conditionalString;
+ # Read only attributes
+ if ($attribute->type =~ /^readonly/ || $attrExt->{"V8ReadOnly"}) {
+ $setter = "0";
+ }
- push(@implContent, <<END);
- // $commentInfo
- { "$attrName",
- $getter,
- $setter,
- $data,
- $accessControl,
- static_cast<v8::PropertyAttribute>($propAttr),
- $on_proto },
-END
- push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
+ # An accessor can be installed on the proto
+ if ($attrExt->{"v8OnProto"}) {
+ $on_proto = "1 /* on proto */";
}
-}
+ my $commentInfo = "Attribute '$attrName' (Type: '" . $attribute->type .
+ "' ExtAttr: '" . join(' ', keys(%{$attrExt})) . "')";
+
+ push(@implContent, $indent . " {\n");
+ push(@implContent, $indent . " \/\/ $commentInfo\n");
+ push(@implContent, $indent . " \"$attrName\",\n");
+ push(@implContent, $indent . " $getter,\n");
+ push(@implContent, $indent . " $setter,\n");
+ push(@implContent, $indent . " $data,\n");
+ push(@implContent, $indent . " $accessControl,\n");
+ push(@implContent, $indent . " static_cast<v8::PropertyAttribute>($propAttr),\n");
+ push(@implContent, $indent . " $on_proto\n");
+ push(@implContent, $indent . " }" . $delimiter . "\n");
+END
+}
sub GenerateImplementation
{
@@ -1088,20 +1123,16 @@ sub GenerateImplementation
# Generate special code for the constructor attributes.
if ($attrType =~ /Constructor$/) {
- $hasConstructors = 1;
+ if ($attribute->signature->extendedAttributes->{"CustomGetter"}) {
+ $implIncludes{"V8CustomBinding.h"} = 1;
+ } else {
+ $hasConstructors = 1;
+ }
next;
}
- # Make EventListeners custom for some types.
- # FIXME: make the perl code capable of generating the
- # event setters/getters. For now, WebKit has started removing the
- # [Custom] attribute, so just automatically insert it to avoid forking
- # other files. This should be okay because we can't generate stubs
- # for any event getter/setters anyway.
- if ($attrType eq "EventListener" && RequiresCustomEventListenerAccessors($dataNode)) {
- $attribute->signature->extendedAttributes->{"Custom"} = 1;
- $implIncludes{"V8CustomBinding.h"} = 1;
- next;
+ if ($attrType eq "EventListener" && $interfaceName eq "DOMWindow") {
+ $attribute->signature->extendedAttributes->{"v8OnProto"} = 1;
}
# Do not generate accessor if this is a custom attribute. The
@@ -1117,7 +1148,7 @@ sub GenerateImplementation
if ($attribute->signature->extendedAttributes->{"CustomGetter"}) {
$implIncludes{"V8CustomBinding.h"} = 1;
} else {
- GenerateNormalAttrGetter($attribute, $dataNode, $classIndex, $implClassName);
+ GenerateNormalAttrGetter($attribute, $dataNode, $classIndex, $implClassName, $interfaceName);
}
if ($attribute->signature->extendedAttributes->{"CustomSetter"} ||
$attribute->signature->extendedAttributes->{"V8CustomSetter"}) {
@@ -1126,7 +1157,7 @@ sub GenerateImplementation
$dataNode->extendedAttributes->{"ExtendsDOMGlobalObject"} || die "Replaceable attribute can only be used in interface that defines ExtendsDOMGlobalObject attribute!";
# GenerateReplaceableAttrSetter($implClassName);
} elsif ($attribute->type !~ /^readonly/ && !$attribute->signature->extendedAttributes->{"V8ReadOnly"}) {
- GenerateNormalAttrSetter($attribute, $dataNode, $classIndex, $implClassName);
+ GenerateNormalAttrSetter($attribute, $dataNode, $classIndex, $implClassName, $interfaceName);
}
}
@@ -1157,20 +1188,24 @@ sub GenerateImplementation
# For the DOMWindow interface we partition the attributes into the
# ones that disallows shadowing and the rest.
- my @disallows_shadowing;
+ my @disallowsShadowing;
+ # Also separate out attributes that are enabled at runtime so we can process them specially.
+ my @enabledAtRuntime;
my @normal;
- if ($interfaceName eq "DOMWindow") {
- foreach my $attribute (@$attributes) {
- if ($attribute->signature->extendedAttributes->{"V8DisallowShadowing"}) {
- push(@disallows_shadowing, $attribute);
- } else {
- push(@normal, $attribute);
- }
+ foreach my $attribute (@$attributes) {
+ if ($interfaceName eq "DOMWindow" && $attribute->signature->extendedAttributes->{"V8DisallowShadowing"}) {
+ push(@disallowsShadowing, $attribute);
+ } elsif ($attribute->signature->extendedAttributes->{"EnabledAtRuntime"}) {
+ push(@enabledAtRuntime, $attribute);
+ } else {
+ push(@normal, $attribute);
}
- # Put the attributes that disallow shadowing on the shadow object.
- $attributes = \@normal;
+ }
+ $attributes = \@normal;
+ # Put the attributes that disallow shadowing on the shadow object.
+ if (@disallowsShadowing) {
push(@implContent, "static const BatchedAttribute shadow_attrs[] = {\n");
- GenerateBatchedAttributeData($dataNode, \@disallows_shadowing);
+ GenerateBatchedAttributeData($dataNode, \@disallowsShadowing);
push(@implContent, "};\n");
}
@@ -1252,6 +1287,21 @@ END
END
}
+ # Setup the enable-at-runtime attrs if we have them
+ foreach my $runtime_attr (@enabledAtRuntime) {
+ $enable_function = $interfaceName . $codeGenerator->WK_ucfirst($runtime_attr->signature->name);
+ my $conditionalString = GenerateConditionalString($runtime_attr->signature);
+ push(@implContent, "\n#if ${conditionalString}\n") if $conditionalString;
+ push(@implContent, " if (V8Custom::v8${enable_function}Enabled()) {\n");
+ push(@implContent, " static const BatchedAttribute attrData =\\\n");
+ GenerateSingleBatchedAttribute($interfaceName, $runtime_attr, ";", " ");
+ push(@implContent, <<END);
+ configureAttribute(instance, proto, attrData);
+ }
+END
+ push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
+ }
+
# Define our functions with Set() or SetAccessor()
foreach my $function (@{$dataNode->functions}) {
my $attrExt = $function->signature->extendedAttributes;
@@ -1456,7 +1506,7 @@ sub GenerateFunctionCallString()
$paramName = "SVGPODListItem<" . GetNativeType($paramType, 1) . ">::copy($paramName)";
}
- if ($parameter->type eq "NodeFilter") {
+ if ($parameter->type eq "NodeFilter" || $parameter->type eq "XPathNSResolver") {
$functionString .= "$paramName.get()";
} else {
$functionString .= $paramName;
@@ -1601,6 +1651,7 @@ sub IsRefPtrType
{
my $type = shift;
return 1 if $type eq "Attr";
+ return 1 if $type eq "CanvasActiveInfo";
return 1 if $type eq "CanvasArray";
return 1 if $type eq "CanvasArrayBuffer";
return 1 if $type eq "CanvasBooleanArray";
@@ -1738,6 +1789,9 @@ sub GetNativeType
# temporary hack
return "RefPtr<NodeFilter>" if $type eq "NodeFilter";
+ # necessary as resolvers could be constructed on fly.
+ return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver";
+
return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter;
# Default, assume native type is a pointer with same type name as idl type
@@ -1873,6 +1927,11 @@ sub JSValueToNative
return "toWebCoreString($value)";
}
+ if ($type eq "SerializedScriptValue") {
+ $implIncludes{"SerializedScriptValue.h"} = 1;
+ return "SerializedScriptValue::create($value)";
+ }
+
if ($type eq "NodeFilter") {
return "V8DOMWrapper::wrapNativeNodeFilter($value)";
}
@@ -1894,6 +1953,10 @@ sub JSValueToNative
return "V8Node::HasInstance($value) ? V8DOMWrapper::convertDOMWrapperToNode<Node>(v8::Handle<v8::Object>::Cast($value)) : 0";
}
+ if ($type eq "XPathNSResolver") {
+ return "V8DOMWrapper::getXPathNSResolver($value)";
+ }
+
AddIncludesForType($type);
# $implIncludes{"$type.h"} = 1 unless AvoidInclusionOfType($type);
@@ -1945,10 +2008,16 @@ sub CreateCustomSignature
if ($first) { $first = 0; }
else { $result .= ", "; }
if (IsWrapperType($parameter->type)) {
- my $type = $parameter->type;
- my $header = GetV8HeaderName($type);
- $implIncludes{$header} = 1;
- $result .= "V8${type}::GetRawTemplate()";
+ if ($parameter->type eq "XPathNSResolver") {
+ # Special case for XPathNSResolver. All other browsers accepts a callable,
+ # so, even though it's against IDL, accept objects here.
+ $result .= "v8::Handle<v8::FunctionTemplate>()";
+ } else {
+ my $type = $parameter->type;
+ my $header = GetV8HeaderName($type);
+ $implIncludes{$header} = 1;
+ $result .= "V8${type}::GetRawTemplate()";
+ }
} else {
$result .= "v8::Handle<v8::FunctionTemplate>()";
}
@@ -2053,7 +2122,9 @@ sub ReturnNativeToJSValue
# For all the types where we use 'int' as the representation type,
# we use Integer::New which has a fast Smi conversion check.
- return "return v8::Integer::New($value)" if GetNativeType($type) eq "int";
+ my $nativeType = GetNativeType($type);
+ return "return v8::Integer::New($value)" if $nativeType eq "int";
+ return "return v8::Integer::NewFromUnsigned($value)" if $nativeType eq "unsigned";
return "return v8::Number::New($value)" if $codeGenerator->IsPrimitiveType($type) or $type eq "SVGPaintType";
@@ -2091,6 +2162,11 @@ sub ReturnNativeToJSValue
return "return V8DOMWrapper::convertEventListenerToV8Object($value)";
}
+ if ($type eq "SerializedScriptValue") {
+ $implIncludes{"$type.h"} = 1;
+ return "return v8String($value->toString())";
+ }
+
if ($type eq "DedicatedWorkerContext" or $type eq "WorkerContext" or $type eq "SharedWorkerContext") {
$implIncludes{"WorkerContextExecutionProxy.h"} = 1;
return "return WorkerContextExecutionProxy::convertWorkerContextToV8Object($value)";
diff --git a/src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h b/src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h
index 8e0e0d9..8128bf8 100644
--- a/src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h
+++ b/src/3rdparty/webkit/WebCore/bridge/IdentifierRep.h
@@ -27,11 +27,12 @@
#define IdentifierRep_h
#include <wtf/Assertions.h>
+#include <wtf/FastAllocBase.h>
#include <string.h>
namespace WebCore {
-class IdentifierRep {
+class IdentifierRep : public FastAllocBase {
public:
static IdentifierRep* get(int);
static IdentifierRep* get(const char*);
diff --git a/src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp b/src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp
index fcdd166..77b5966 100644
--- a/src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp
+++ b/src/3rdparty/webkit/WebCore/bridge/c/c_instance.cpp
@@ -121,15 +121,19 @@ JSValue CInstance::invokeMethod(ExecState* exec, const MethodList& methodList, c
convertValueToNPVariant(exec, args.at(i), &cArgs[i]);
// Invoke the 'C' method.
+ bool retval = true;
NPVariant resultVariant;
VOID_TO_NPVARIANT(resultVariant);
{
JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
ASSERT(globalExceptionString().isNull());
- _object->_class->invoke(_object, ident, cArgs.data(), count, &resultVariant);
+ retval = _object->_class->invoke(_object, ident, cArgs.data(), count, &resultVariant);
moveGlobalExceptionToExecState(exec);
}
+
+ if (!retval)
+ throwError(exec, GeneralError, "Error calling method on NPObject!");
for (i = 0; i < count; i++)
_NPN_ReleaseVariantValue(&cArgs[i]);
@@ -153,14 +157,18 @@ JSValue CInstance::invokeDefaultMethod(ExecState* exec, const ArgList& args)
convertValueToNPVariant(exec, args.at(i), &cArgs[i]);
// Invoke the 'C' method.
+ bool retval = true;
NPVariant resultVariant;
VOID_TO_NPVARIANT(resultVariant);
{
JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
ASSERT(globalExceptionString().isNull());
- _object->_class->invokeDefault(_object, cArgs.data(), count, &resultVariant);
+ retval = _object->_class->invokeDefault(_object, cArgs.data(), count, &resultVariant);
moveGlobalExceptionToExecState(exec);
}
+
+ if (!retval)
+ throwError(exec, GeneralError, "Error calling method on NPObject!");
for (i = 0; i < count; i++)
_NPN_ReleaseVariantValue(&cArgs[i]);
@@ -188,14 +196,18 @@ JSValue CInstance::invokeConstruct(ExecState* exec, const ArgList& args)
convertValueToNPVariant(exec, args.at(i), &cArgs[i]);
// Invoke the 'C' method.
+ bool retval = true;
NPVariant resultVariant;
VOID_TO_NPVARIANT(resultVariant);
{
JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
ASSERT(globalExceptionString().isNull());
- _object->_class->construct(_object, cArgs.data(), count, &resultVariant);
+ retval = _object->_class->construct(_object, cArgs.data(), count, &resultVariant);
moveGlobalExceptionToExecState(exec);
}
+
+ if (!retval)
+ throwError(exec, GeneralError, "Error calling method on NPObject!");
for (i = 0; i < count; i++)
_NPN_ReleaseVariantValue(&cArgs[i]);
diff --git a/src/3rdparty/webkit/WebCore/bridge/npapi.h b/src/3rdparty/webkit/WebCore/bridge/npapi.h
index 07121b0..5d48b0d 100644
--- a/src/3rdparty/webkit/WebCore/bridge/npapi.h
+++ b/src/3rdparty/webkit/WebCore/bridge/npapi.h
@@ -64,7 +64,9 @@
# endif /* XP_MAC */
# endif /* macintosh */
# ifdef __INTEL__
-# undef NULL
+# ifndef __SYMBIAN32__
+# undef NULL
+# endif
# ifndef XP_WIN
# define XP_WIN 1
# endif /* __INTEL__ */
@@ -106,6 +108,11 @@
#include <stdio.h>
#endif
+#if defined(XP_SYMBIAN)
+ #include <QEvent>
+ #include <QRegion>
+#endif
+
#ifdef XP_WIN
#include <windows.h>
#endif
@@ -526,9 +533,9 @@ typedef struct _NPWindow
uint32 height;
NPRect clipRect; /* Clipping rectangle in port coordinates */
/* Used by MAC only. */
-#ifdef XP_UNIX
+#if defined(XP_UNIX) || defined(XP_SYMBIAN)
void * ws_info; /* Platform-dependent additonal data */
-#endif /* XP_UNIX */
+#endif /* XP_UNIX || XP_SYMBIAN */
NPWindowType type; /* Is this a window or a drawable? */
} NPWindow;
@@ -578,6 +585,8 @@ typedef enum {
typedef EventRecord NPEvent;
#endif
+#elif defined(XP_SYMBIAN)
+typedef QEvent NPEvent;
#elif defined(XP_WIN)
typedef struct _NPEvent
{
@@ -608,6 +617,8 @@ typedef CGPathRef NPCGRegion;
typedef HRGN NPRegion;
#elif defined(XP_UNIX)
typedef Region NPRegion;
+#elif defined(XP_SYMBIAN)
+typedef QRegion* NPRegion;
#else
typedef void *NPRegion;
#endif /* XP_MAC */
diff --git a/src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h b/src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h
index edb577c..f2ce954 100644
--- a/src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h
+++ b/src/3rdparty/webkit/WebCore/bridge/qt/qt_runtime.h
@@ -151,7 +151,7 @@ public:
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, OverridesGetOwnPropertySlot | OverridesMarkChildren));
}
protected:
diff --git a/src/3rdparty/webkit/WebCore/bridge/runtime_array.h b/src/3rdparty/webkit/WebCore/bridge/runtime_array.h
index f614f7f..1218b8c 100644
--- a/src/3rdparty/webkit/WebCore/bridge/runtime_array.h
+++ b/src/3rdparty/webkit/WebCore/bridge/runtime_array.h
@@ -59,10 +59,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
private:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&);
static JSValue indexGetter(ExecState*, const Identifier&, const PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/bridge/runtime_method.h b/src/3rdparty/webkit/WebCore/bridge/runtime_method.h
index 3233ffa..9676048 100644
--- a/src/3rdparty/webkit/WebCore/bridge/runtime_method.h
+++ b/src/3rdparty/webkit/WebCore/bridge/runtime_method.h
@@ -47,10 +47,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
private:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesMarkChildren | InternalFunction::StructureFlags;
static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&);
virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
diff --git a/src/3rdparty/webkit/WebCore/bridge/runtime_object.h b/src/3rdparty/webkit/WebCore/bridge/runtime_object.h
index f16778e..391e078 100644
--- a/src/3rdparty/webkit/WebCore/bridge/runtime_object.h
+++ b/src/3rdparty/webkit/WebCore/bridge/runtime_object.h
@@ -62,10 +62,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue prototype)
{
- return Structure::create(prototype, TypeInfo(ObjectType));
+ return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags));
}
protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags;
RuntimeObjectImp(ExecState*, NonNullPassRefPtr<Structure>, PassRefPtr<Bindings::Instance>);
private:
diff --git a/src/3rdparty/webkit/WebCore/bridge/runtime_root.h b/src/3rdparty/webkit/WebCore/bridge/runtime_root.h
index eacbb57..fdd73c4 100644
--- a/src/3rdparty/webkit/WebCore/bridge/runtime_root.h
+++ b/src/3rdparty/webkit/WebCore/bridge/runtime_root.h
@@ -31,8 +31,10 @@
#endif
#include <runtime/Protect.h>
+#include <wtf/Forward.h>
#include <wtf/HashSet.h>
#include <wtf/Noncopyable.h>
+#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
namespace JSC {
diff --git a/src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp b/src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp
index 2935c31..4e067ce 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp
+++ b/src/3rdparty/webkit/WebCore/css/CSSComputedStyleDeclaration.cpp
@@ -77,7 +77,6 @@ static const int computedProperties[] = {
CSSPropertyBorderTopStyle,
CSSPropertyBorderTopWidth,
CSSPropertyBottom,
- CSSPropertyBoxShadow,
CSSPropertyCaptionSide,
CSSPropertyClear,
CSSPropertyClip,
@@ -129,6 +128,7 @@ static const int computedProperties[] = {
CSSPropertyTextAlign,
CSSPropertyTextDecoration,
CSSPropertyTextIndent,
+ CSSPropertyTextRendering,
CSSPropertyTextShadow,
CSSPropertyTextOverflow,
CSSPropertyTextTransform,
@@ -170,6 +170,7 @@ static const int computedProperties[] = {
CSSPropertyWebkitBoxOrient,
CSSPropertyWebkitBoxPack,
CSSPropertyWebkitBoxReflect,
+ CSSPropertyWebkitBoxShadow,
CSSPropertyWebkitBoxSizing,
CSSPropertyWebkitColumnBreakAfter,
CSSPropertyWebkitColumnBreakBefore,
@@ -252,7 +253,6 @@ static const int computedProperties[] = {
CSSPropertyStrokeMiterlimit,
CSSPropertyStrokeOpacity,
CSSPropertyStrokeWidth,
- CSSPropertyTextRendering,
CSSPropertyAlignmentBaseline,
CSSPropertyBaselineShift,
CSSPropertyDominantBaseline,
@@ -637,6 +637,15 @@ static PassRefPtr<CSSValue> fillRepeatToCSSValue(EFillRepeat xRepeat, EFillRepea
return list.release();
}
+static void logUnimplementedPropertyID(int propertyID)
+{
+ DEFINE_STATIC_LOCAL(HashSet<int>, propertyIDSet, ());
+ if (!propertyIDSet.add(propertyID).second)
+ return;
+
+ LOG_ERROR("WebKit does not yet implement getComputedStyle for '%s'.", getPropertyName(static_cast<CSSPropertyID>(propertyID)));
+}
+
PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const
{
Node* node = m_node.get();
@@ -767,7 +776,7 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
}
case CSSPropertyWebkitBoxReflect:
return valueForReflection(style->boxReflect());
- case CSSPropertyBoxShadow:
+ case CSSPropertyWebkitBoxShadow:
return valueForShadow(style->boxShadow(), static_cast<CSSPropertyID>(propertyID));
case CSSPropertyCaptionSide:
return CSSPrimitiveValue::create(style->captionSide());
@@ -897,7 +906,8 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
// for how high to be in pixels does include things like minimum font size and the zoom factor.
// On the other hand, since font-size doesn't include the zoom factor, we really can't do
// that here either.
- return CSSPrimitiveValue::create(static_cast<int>(length.percent() * style->fontDescription().specifiedSize()) / 100, CSSPrimitiveValue::CSS_PX);
+ // The line height returned is rounded to the nearest integer.
+ return CSSPrimitiveValue::create(length.calcMinValue(style->fontDescription().specifiedSize(), true), CSSPrimitiveValue::CSS_PX);
return CSSPrimitiveValue::create(length.value(), CSSPrimitiveValue::CSS_PX);
}
case CSSPropertyListStyleImage:
@@ -1052,6 +1062,8 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
return CSSPrimitiveValue::create(style->textIndent());
case CSSPropertyTextShadow:
return valueForShadow(style->textShadow(), static_cast<CSSPropertyID>(propertyID));
+ case CSSPropertyTextRendering:
+ return CSSPrimitiveValue::create(style->fontDescription().textRenderingMode());
case CSSPropertyTextOverflow:
if (style->textOverflow())
return CSSPrimitiveValue::createIdentifier(CSSValueEllipsis);
@@ -1413,7 +1425,7 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
#endif
}
- LOG_ERROR("unimplemented propertyID: %d", propertyID);
+ logUnimplementedPropertyID(propertyID);
return 0;
}
diff --git a/src/3rdparty/webkit/WebCore/css/CSSGrammar.y b/src/3rdparty/webkit/WebCore/css/CSSGrammar.y
index 1c1f7b4..0530e91 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSGrammar.y
+++ b/src/3rdparty/webkit/WebCore/css/CSSGrammar.y
@@ -97,7 +97,7 @@ static int cssyylex(YYSTYPE* yylval, void* parser)
%}
-%expect 50
+%expect 51
%nonassoc LOWEST_PREC
@@ -268,7 +268,7 @@ static int cssyylex(YYSTYPE* yylval, void* parser)
%%
stylesheet:
- maybe_charset maybe_sgml import_list variables_list namespace_list rule_list
+ maybe_space maybe_charset maybe_sgml import_list variables_list namespace_list rule_list
| webkit_rule maybe_space
| webkit_decls maybe_space
| webkit_value maybe_space
diff --git a/src/3rdparty/webkit/WebCore/css/CSSParser.cpp b/src/3rdparty/webkit/WebCore/css/CSSParser.cpp
index c46bf36..10949dd 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSParser.cpp
+++ b/src/3rdparty/webkit/WebCore/css/CSSParser.cpp
@@ -405,9 +405,6 @@ Document* CSSParser::document() const
bool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict)
{
- if (unitflags & FNonNeg && value->fValue < 0)
- return false;
-
bool b = false;
switch (value->unit) {
case CSSPrimitiveValue::CSS_NUMBER:
@@ -451,6 +448,8 @@ bool CSSParser::validUnit(CSSParserValue* value, Units unitflags, bool strict)
default:
break;
}
+ if (b && unitflags & FNonNeg && value->fValue < 0)
+ b = false;
return b;
}
@@ -894,6 +893,13 @@ bool CSSParser::parseValue(int propId, bool important)
int propId1, propId2;
bool result = false;
if (parseFillProperty(propId, propId1, propId2, val1, val2)) {
+ OwnPtr<ShorthandScope> shorthandScope;
+ if (propId == CSSPropertyBackgroundPosition ||
+ propId == CSSPropertyBackgroundRepeat ||
+ propId == CSSPropertyWebkitMaskPosition ||
+ propId == CSSPropertyWebkitMaskRepeat) {
+ shorthandScope.set(new ShorthandScope(this, propId));
+ }
addProperty(propId1, val1.release(), important);
if (val2)
addProperty(propId2, val2.release(), important);
@@ -1190,7 +1196,7 @@ bool CSSParser::parseValue(int propId, bool important)
valid_primitive = validUnit(value, FLength, m_strict);
break;
case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
- case CSSPropertyBoxShadow:
+ case CSSPropertyWebkitBoxShadow:
if (id == CSSValueNone)
valid_primitive = true;
else
@@ -1433,6 +1439,11 @@ bool CSSParser::parseValue(int propId, bool important)
id == CSSValueWave)
valid_primitive = true;
break;
+ case CSSPropertyTextRendering: // auto | optimizeSpeed | optimizeLegibility | geometricPrecision
+ if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueOptimizelegibility
+ || id == CSSValueGeometricprecision)
+ valid_primitive = true;
+ break;
case CSSPropertyTextLineThroughWidth:
case CSSPropertyTextOverlineWidth:
case CSSPropertyTextUnderlineWidth:
@@ -3605,7 +3616,7 @@ struct ShadowParseContext {
, allowBlur(false)
, allowSpread(false)
, allowColor(true)
- , allowStyle(prop == CSSPropertyBoxShadow)
+ , allowStyle(prop == CSSPropertyWebkitBoxShadow)
, allowBreak(true)
{
}
@@ -3637,7 +3648,7 @@ struct ShadowParseContext {
allowY = false;
allowBlur = false;
allowSpread = false;
- allowStyle = property == CSSPropertyBoxShadow;
+ allowStyle = property == CSSPropertyWebkitBoxShadow;
}
void commitLength(CSSParserValue* v)
@@ -3656,12 +3667,12 @@ struct ShadowParseContext {
allowY = false;
allowBlur = true;
allowColor = true;
- allowStyle = property == CSSPropertyBoxShadow;
+ allowStyle = property == CSSPropertyWebkitBoxShadow;
allowBreak = true;
} else if (allowBlur) {
blur = val.release();
allowBlur = false;
- allowSpread = property == CSSPropertyBoxShadow;
+ allowSpread = property == CSSPropertyWebkitBoxShadow;
} else if (allowSpread) {
spread = val.release();
allowSpread = false;
@@ -3678,7 +3689,7 @@ struct ShadowParseContext {
} else {
allowBlur = false;
allowSpread = false;
- allowStyle = property == CSSPropertyBoxShadow;
+ allowStyle = property == CSSPropertyWebkitBoxShadow;
}
}
@@ -5171,11 +5182,6 @@ static int cssPropertyID(const UChar* propertyName, unsigned length)
const char* const opacity = "opacity";
name = opacity;
length = strlen(opacity);
- } else if (strcmp(buffer, "-webkit-box-shadow") == 0) {
- // CSS Backgrounds/Borders. -webkit-box-shadow worked in Safari 4 and earlier.
- const char* const boxShadow = "box-shadow";
- name = boxShadow;
- length = strlen(boxShadow);
} else if (strcmp(buffer, "-webkit-background-size") == 0) {
// CSS Backgrounds/Borders. -webkit-background-size worked in Safari 4 and earlier.
const char* const backgroundSize = "background-size";
diff --git a/src/3rdparty/webkit/WebCore/css/CSSParserValues.h b/src/3rdparty/webkit/WebCore/css/CSSParserValues.h
index 24bd9b7..242cda8 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSParserValues.h
+++ b/src/3rdparty/webkit/WebCore/css/CSSParserValues.h
@@ -60,7 +60,7 @@ struct CSSParserValue {
PassRefPtr<CSSValue> createCSSValue();
};
-class CSSParserValueList {
+class CSSParserValueList : public FastAllocBase {
public:
CSSParserValueList()
: m_current(0)
diff --git a/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp b/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp
index 1f2c9ca..d2286bb 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp
+++ b/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValue.cpp
@@ -34,6 +34,8 @@
#include "Rect.h"
#include "RenderStyle.h"
#include <wtf/ASCIICType.h>
+#include <wtf/MathExtras.h>
+#include <wtf/StringExtras.h>
#include <wtf/StdLibExtras.h>
#if ENABLE(DASHBOARD_SUPPORT)
@@ -684,6 +686,71 @@ int CSSPrimitiveValue::getIdent()
return m_value.ident;
}
+static void appendCSSDouble(Vector<UChar>& vector, double value)
+{
+ // From the CSS specification section titled "Integers and real numbers",
+ // real numbers are only formatted as [sign] [digits] "." [digits].
+ // This differs from printf-style formatting in that exponents (e.g. 1.3e06)
+ // are not allowed. Since NaN/inf are also not valid CSS values this
+ // function doesn't handle them.
+
+ // For compatibility with what was returned by older versions of
+ // WebKit, we target 6 digits of precision.
+ const int digitsAfterDecimalPoint = 6;
+ long long rounded = llround(fabs(value) * 1000000.0);
+ if (rounded == 0) {
+ vector.append('0');
+ return;
+ }
+
+ char buf[24];
+ int length = snprintf(buf, sizeof(buf), "%lld", rounded);
+ int decimalPoint = length - digitsAfterDecimalPoint;
+
+ // We are matching printf("%g")'s behavior and must trim trailing zeros,
+ // regardless of whether they're significant.
+ while (length > 0 && length > decimalPoint && buf[length - 1] == '0')
+ length--;
+
+ // Reserve an estimate of space for the number of digits we anticipate
+ // along with a minus sign/initial zero/decimal point.
+ vector.reserveCapacity(vector.size() + 3 + length);
+
+ if (value < 0)
+ vector.append('-');
+
+ if (decimalPoint <= 0) {
+ // Only digits after the decimal point.
+ vector.append('0');
+ vector.append('.');
+ for (int i = decimalPoint; i < 0; i++)
+ vector.append('0');
+ for (int i = 0; i < length; i++)
+ vector.append(buf[i]);
+ } else if (length <= decimalPoint) {
+ // Only digits before the decimal point.
+ for (int i = 0; i < length; i++)
+ vector.append(buf[i]);
+ } else {
+ // Digits before and after the decimal point.
+ for (int i = 0; i < decimalPoint; i++)
+ vector.append(buf[i]);
+ vector.append('.');
+ for (int i = decimalPoint; i < length; i++)
+ vector.append(buf[i]);
+ }
+}
+
+static String formatWithUnits(double value, const char* units)
+{
+ Vector<UChar> result;
+ appendCSSDouble(result, value);
+ result.reserveCapacity(result.size() + strlen(units));
+ for (int i = 0; units[i]; i++)
+ result.append(units[i]);
+ return String::adopt(result);
+}
+
String CSSPrimitiveValue::cssText() const
{
// FIXME: return the original value instead of a generated one (e.g. color
@@ -695,61 +762,61 @@ String CSSPrimitiveValue::cssText() const
break;
case CSS_NUMBER:
case CSS_PARSER_INTEGER:
- text = String::number(m_value.num);
+ text = formatWithUnits(m_value.num, "");
break;
case CSS_PERCENTAGE:
- text = String::format("%.6lg%%", m_value.num);
+ text = formatWithUnits(m_value.num, "%");
break;
case CSS_EMS:
- text = String::format("%.6lgem", m_value.num);
+ text = formatWithUnits(m_value.num, "em");
break;
case CSS_EXS:
- text = String::format("%.6lgex", m_value.num);
+ text = formatWithUnits(m_value.num, "ex");
break;
case CSS_REMS:
- text = String::format("%.6lgrem", m_value.num);
+ text = formatWithUnits(m_value.num, "rem");
break;
case CSS_PX:
- text = String::format("%.6lgpx", m_value.num);
+ text = formatWithUnits(m_value.num, "px");
break;
case CSS_CM:
- text = String::format("%.6lgcm", m_value.num);
+ text = formatWithUnits(m_value.num, "cm");
break;
case CSS_MM:
- text = String::format("%.6lgmm", m_value.num);
+ text = formatWithUnits(m_value.num, "mm");
break;
case CSS_IN:
- text = String::format("%.6lgin", m_value.num);
+ text = formatWithUnits(m_value.num, "in");
break;
case CSS_PT:
- text = String::format("%.6lgpt", m_value.num);
+ text = formatWithUnits(m_value.num, "pt");
break;
case CSS_PC:
- text = String::format("%.6lgpc", m_value.num);
+ text = formatWithUnits(m_value.num, "pc");
break;
case CSS_DEG:
- text = String::format("%.6lgdeg", m_value.num);
+ text = formatWithUnits(m_value.num, "deg");
break;
case CSS_RAD:
- text = String::format("%.6lgrad", m_value.num);
+ text = formatWithUnits(m_value.num, "rad");
break;
case CSS_GRAD:
- text = String::format("%.6lggrad", m_value.num);
+ text = formatWithUnits(m_value.num, "grad");
break;
case CSS_MS:
- text = String::format("%.6lgms", m_value.num);
+ text = formatWithUnits(m_value.num, "ms");
break;
case CSS_S:
- text = String::format("%.6lgs", m_value.num);
+ text = formatWithUnits(m_value.num, "s");
break;
case CSS_HZ:
- text = String::format("%.6lghz", m_value.num);
+ text = formatWithUnits(m_value.num, "hz");
break;
case CSS_KHZ:
- text = String::format("%.6lgkhz", m_value.num);
+ text = formatWithUnits(m_value.num, "khz");
break;
case CSS_TURN:
- text = String::format("%.6lgturn", m_value.num);
+ text = formatWithUnits(m_value.num, "turn");
break;
case CSS_DIMENSION:
// FIXME
diff --git a/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h b/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h
index b46322d..3616aa5 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h
+++ b/src/3rdparty/webkit/WebCore/css/CSSPrimitiveValueMappings.h
@@ -36,6 +36,7 @@
#include "RenderStyleConstants.h"
#include "SVGRenderStyleDefs.h"
#include "TextDirection.h"
+#include "TextRenderingMode.h"
#include "ThemeTypes.h"
namespace WebCore {
@@ -199,6 +200,11 @@ template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e)
case ListboxPart:
m_value.ident = CSSValueListbox;
break;
+#if ENABLE(DATALIST)
+ case ListButtonPart:
+ m_value.ident = CSSValueListButton;
+ break;
+#endif
case ListItemPart:
m_value.ident = CSSValueListitem;
break;
@@ -1838,6 +1844,42 @@ template<> inline CSSPrimitiveValue::operator FontSmoothingMode() const
return AutoSmoothing;
}
+template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e)
+ : m_type(CSS_IDENT)
+{
+ switch (e) {
+ case AutoTextRendering:
+ m_value.ident = CSSValueAuto;
+ break;
+ case OptimizeSpeed:
+ m_value.ident = CSSValueOptimizespeed;
+ break;
+ case OptimizeLegibility:
+ m_value.ident = CSSValueOptimizelegibility;
+ break;
+ case GeometricPrecision:
+ m_value.ident = CSSValueGeometricprecision;
+ break;
+ }
+}
+
+template<> inline CSSPrimitiveValue::operator TextRenderingMode() const
+{
+ switch (m_value.ident) {
+ case CSSValueAuto:
+ return AutoTextRendering;
+ case CSSValueOptimizespeed:
+ return OptimizeSpeed;
+ case CSSValueOptimizelegibility:
+ return OptimizeLegibility;
+ case CSSValueGeometricprecision:
+ return GeometricPrecision;
+ default:
+ ASSERT_NOT_REACHED();
+ return AutoTextRendering;
+ }
+}
+
#if ENABLE(SVG)
template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineCap e)
@@ -2241,42 +2283,6 @@ template<> inline CSSPrimitiveValue::operator ETextAnchor() const
}
}
-template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextRendering e)
- : m_type(CSS_IDENT)
-{
- switch (e) {
- case TR_AUTO:
- m_value.ident = CSSValueAuto;
- break;
- case TR_OPTIMIZESPEED:
- m_value.ident = CSSValueOptimizespeed;
- break;
- case TR_OPTIMIZELEGIBILITY:
- m_value.ident = CSSValueOptimizelegibility;
- break;
- case TR_GEOMETRICPRECISION:
- m_value.ident = CSSValueGeometricprecision;
- break;
- }
-}
-
-template<> inline CSSPrimitiveValue::operator ETextRendering() const
-{
- switch (m_value.ident) {
- case CSSValueAuto:
- return TR_AUTO;
- case CSSValueOptimizespeed:
- return TR_OPTIMIZESPEED;
- case CSSValueOptimizelegibility:
- return TR_OPTIMIZELEGIBILITY;
- case CSSValueGeometricprecision:
- return TR_GEOMETRICPRECISION;
- default:
- ASSERT_NOT_REACHED();
- return TR_AUTO;
- }
-}
-
template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWritingMode e)
: m_type(CSS_IDENT)
{
diff --git a/src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in b/src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in
index 1bf526b..5ef6605 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in
+++ b/src/3rdparty/webkit/WebCore/css/CSSPropertyNames.in
@@ -49,7 +49,6 @@ border-top-style
border-top-width
border-width
bottom
-box-shadow
caption-side
clear
clip
@@ -127,6 +126,7 @@ text-overline-color
text-overline-mode
text-overline-style
text-overline-width
+text-rendering
text-shadow
text-transform
text-underline
@@ -179,6 +179,7 @@ zoom
-webkit-box-orient
-webkit-box-pack
-webkit-box-reflect
+-webkit-box-shadow
-webkit-box-sizing
-webkit-column-break-after
-webkit-column-break-before
diff --git a/src/3rdparty/webkit/WebCore/css/CSSSelector.cpp b/src/3rdparty/webkit/WebCore/css/CSSSelector.cpp
index 9d9dd1b..313528f 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSSelector.cpp
+++ b/src/3rdparty/webkit/WebCore/css/CSSSelector.cpp
@@ -99,6 +99,9 @@ void CSSSelector::extractPseudoType() const
DEFINE_STATIC_LOCAL(AtomicString, focus, ("focus"));
DEFINE_STATIC_LOCAL(AtomicString, hover, ("hover"));
DEFINE_STATIC_LOCAL(AtomicString, indeterminate, ("indeterminate"));
+#if ENABLE(DATALIST)
+ DEFINE_STATIC_LOCAL(AtomicString, inputListButton, ("-webkit-input-list-button"));
+#endif
DEFINE_STATIC_LOCAL(AtomicString, inputPlaceholder, ("-webkit-input-placeholder"));
DEFINE_STATIC_LOCAL(AtomicString, lastChild, ("last-child"));
DEFINE_STATIC_LOCAL(AtomicString, lastOfType, ("last-of-type"));
@@ -197,7 +200,14 @@ void CSSSelector::extractPseudoType() const
m_pseudoType = PseudoFirstChild;
else if (m_value == fullPageMedia)
m_pseudoType = PseudoFullPageMedia;
- else if (m_value == inputPlaceholder) {
+ else
+#if ENABLE(DATALIST)
+ if (m_value == inputListButton) {
+ m_pseudoType = PseudoInputListButton;
+ element = true;
+ } else
+#endif
+ if (m_value == inputPlaceholder) {
m_pseudoType = PseudoInputPlaceholder;
element = true;
} else if (m_value == lastChild)
diff --git a/src/3rdparty/webkit/WebCore/css/CSSSelector.h b/src/3rdparty/webkit/WebCore/css/CSSSelector.h
index 7836136..0c3b677 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSSelector.h
+++ b/src/3rdparty/webkit/WebCore/css/CSSSelector.h
@@ -183,7 +183,8 @@ namespace WebCore {
PseudoMediaControlsRewindButton,
PseudoMediaControlsReturnToRealtimeButton,
PseudoMediaControlsStatusDisplay,
- PseudoMediaControlsFullscreenButton
+ PseudoMediaControlsFullscreenButton,
+ PseudoInputListButton
};
PseudoType pseudoType() const
diff --git a/src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp b/src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp
index dc9f2e5..181e480 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp
+++ b/src/3rdparty/webkit/WebCore/css/CSSStyleSelector.cpp
@@ -2494,6 +2494,11 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme
case CSSSelector::PseudoFileUploadButton:
dynamicPseudo = FILE_UPLOAD_BUTTON;
return true;
+#if ENABLE(DATALIST)
+ case CSSSelector::PseudoInputListButton:
+ dynamicPseudo = INPUT_LIST_BUTTON;
+ return true;
+#endif
case CSSSelector::PseudoInputPlaceholder:
dynamicPseudo = INPUT_PLACEHOLDER;
return true;
@@ -4634,9 +4639,23 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
HANDLE_INHERIT_AND_INITIAL(outlineOffset, OutlineOffset)
m_style->setOutlineOffset(primitiveValue->computeLengthInt(style(), m_rootElementStyle, zoomFactor));
return;
-
+ case CSSPropertyTextRendering: {
+ FontDescription fontDescription = m_style->fontDescription();
+ if (isInherit)
+ fontDescription.setTextRenderingMode(m_parentStyle->fontDescription().textRenderingMode());
+ else if (isInitial)
+ fontDescription.setTextRenderingMode(AutoTextRendering);
+ else {
+ if (!primitiveValue)
+ return;
+ fontDescription.setTextRenderingMode(*primitiveValue);
+ }
+ if (m_style->setFontDescription(fontDescription))
+ m_fontDirty = true;
+ return;
+ }
case CSSPropertyTextShadow:
- case CSSPropertyBoxShadow: {
+ case CSSPropertyWebkitBoxShadow: {
if (isInherit) {
if (id == CSSPropertyTextShadow)
return m_style->setTextShadow(m_parentStyle->textShadow() ? new ShadowData(*m_parentStyle->textShadow()) : 0);
diff --git a/src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in b/src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in
index 791f425..1b7b1d8 100644
--- a/src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in
+++ b/src/3rdparty/webkit/WebCore/css/CSSValueKeywords.in
@@ -501,6 +501,7 @@ square-button
button
button-bevel
default-button
+list-button
listbox
listitem
media-fullscreen-button
@@ -631,3 +632,9 @@ stroke
# none
antialiased
subpixel-antialiased
+
+# text-rendering
+#auto
+optimizeSpeed
+optimizeLegibility
+geometricPrecision
diff --git a/src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp b/src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp
index 2cd90a9..e8492d4 100644
--- a/src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp
+++ b/src/3rdparty/webkit/WebCore/css/SVGCSSComputedStyleDeclaration.cpp
@@ -93,8 +93,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getSVGPropertyCSSValue(int pro
return CSSPrimitiveValue::create(svgStyle->strokeMiterLimit(), CSSPrimitiveValue::CSS_NUMBER);
case CSSPropertyStrokeOpacity:
return CSSPrimitiveValue::create(svgStyle->strokeOpacity(), CSSPrimitiveValue::CSS_NUMBER);
- case CSSPropertyTextRendering:
- return CSSPrimitiveValue::create(svgStyle->textRendering());
case CSSPropertyAlignmentBaseline:
return CSSPrimitiveValue::create(svgStyle->alignmentBaseline());
case CSSPropertyDominantBaseline:
diff --git a/src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp b/src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp
index 04ba185..0ae9fbc 100644
--- a/src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp
+++ b/src/3rdparty/webkit/WebCore/css/SVGCSSParser.cpp
@@ -132,12 +132,6 @@ bool CSSParser::parseSVGValue(int propId, bool important)
valid_primitive = true;
break;
- case CSSPropertyTextRendering: // auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit
- if (id == CSSValueAuto || id == CSSValueOptimizespeed || id == CSSValueOptimizelegibility ||
- id == CSSValueGeometricprecision)
- valid_primitive = true;
- break;
-
case CSSPropertyImageRendering: // auto | optimizeSpeed |
case CSSPropertyColorRendering: // optimizeQuality | inherit
if (id == CSSValueAuto || id == CSSValueOptimizespeed ||
diff --git a/src/3rdparty/webkit/WebCore/css/SVGCSSPropertyNames.in b/src/3rdparty/webkit/WebCore/css/SVGCSSPropertyNames.in
index 965fbbf..e400ffe 100644
--- a/src/3rdparty/webkit/WebCore/css/SVGCSSPropertyNames.in
+++ b/src/3rdparty/webkit/WebCore/css/SVGCSSPropertyNames.in
@@ -37,7 +37,7 @@ stroke-linejoin
stroke-miterlimit
stroke-opacity
stroke-width
-text-rendering
+# text-rendering
alignment-baseline
baseline-shift
dominant-baseline
diff --git a/src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp b/src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp
index d326dde..b81b4f2 100644
--- a/src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp
+++ b/src/3rdparty/webkit/WebCore/css/SVGCSSStyleSelector.cpp
@@ -229,13 +229,6 @@ void CSSStyleSelector::applySVGProperty(int id, CSSValue* value)
svgstyle->setShapeRendering(*primitiveValue);
break;
}
- case CSSPropertyTextRendering:
- {
- HANDLE_INHERIT_AND_INITIAL(textRendering, TextRendering)
- if (primitiveValue)
- svgstyle->setTextRendering(*primitiveValue);
- break;
- }
// end of ident only properties
case CSSPropertyFill:
{
diff --git a/src/3rdparty/webkit/WebCore/css/SVGCSSValueKeywords.in b/src/3rdparty/webkit/WebCore/css/SVGCSSValueKeywords.in
index c866a17..152a68f 100644
--- a/src/3rdparty/webkit/WebCore/css/SVGCSSValueKeywords.in
+++ b/src/3rdparty/webkit/WebCore/css/SVGCSSValueKeywords.in
@@ -196,7 +196,7 @@ linearRGB
# CSS_PROP_COLOR_RENDERING
#auto
-optimizeSpeed
+#optimizeSpeed
optimizeQuality
## CSS_PROP_FILL
@@ -220,7 +220,7 @@ optimizeQuality
#auto
#optimizeSpeed
crispEdges
-geometricPrecision
+#geometricPrecision
# CSS_PROP_STROKE
# CSS_PROP_STROKE_DASHARRAY
@@ -238,11 +238,6 @@ bevel
# CSS_PROP_STROKE_MITERLIMIT
# CSS_PROP_STROKE_OPACITY
# CSS_PROP_STROKE_WIDTH
-# CSS_PROP_TEXT_RENDERING
-#auto
-#optimizeSpeed
-optimizeLegibility
-#geometricPrecision
# CSS_PROP_ALIGNMENT_BASELINE
#auto
diff --git a/src/3rdparty/webkit/WebCore/css/html.css b/src/3rdparty/webkit/WebCore/css/html.css
index 30d5661..095fab3 100644
--- a/src/3rdparty/webkit/WebCore/css/html.css
+++ b/src/3rdparty/webkit/WebCore/css/html.css
@@ -354,6 +354,11 @@ input[type="search"]::-webkit-search-results-button {
display: inline-block;
}
+input::-webkit-input-list-button {
+ -webkit-appearance: list-button;
+ display: inline-block;
+}
+
textarea {
-webkit-appearance: textarea;
background-color: white;
diff --git a/src/3rdparty/webkit/WebCore/css/makevalues.pl b/src/3rdparty/webkit/WebCore/css/makevalues.pl
index 3f52e64..e49981d 100644
--- a/src/3rdparty/webkit/WebCore/css/makevalues.pl
+++ b/src/3rdparty/webkit/WebCore/css/makevalues.pl
@@ -86,7 +86,7 @@ const char* getValueName(unsigned short id);
EOF
close HEADER;
-system("gperf -L ANSI-C -E -C -n -o -t --key-positions=\"*\" -NfindValue -Hhash_val -Wwordlist_value -D CSSValueKeywords.gperf > CSSValueKeywords.c");
+system("gperf -L ANSI-C -E -C -n -o -t --key-positions=\"*\" -NfindValue -Hhash_val -Wwordlist_value -D CSSValueKeywords.gperf > CSSValueKeywords.c") == 0 || die "calling gperf failed: $?";
open C, ">>CSSValueKeywords.c" || die "Could not open CSSValueKeywords.c for writing";
print C "static const char * const valueList[] = {\n";
diff --git a/src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css b/src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css
index 16ff0e4..0f667bd 100644
--- a/src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css
+++ b/src/3rdparty/webkit/WebCore/css/mediaControlsChromium.css
@@ -83,8 +83,8 @@ audio::-webkit-media-controls-timeline-container, video::-webkit-media-controls-
width: auto;
height: 32px;
- border-left-color: rgba(255, 255, 255, 0.2);
- border-right-color: rgba(255, 255, 255, 0.2);
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+ border-right: 1px solid rgba(255, 255, 255, 0.2);
}
audio::-webkit-media-controls-current-time-display, video::-webkit-media-controls-current-time-display {
@@ -141,7 +141,7 @@ audio::-webkit-media-controls-timeline, video::-webkit-media-controls-timeline {
-webkit-appearance: media-slider;
position: absolute;
top: auto;
- bottom: 8px;
+ bottom: 7px;
left: 6px;
right: 65px;
height: 16px;
diff --git a/src/3rdparty/webkit/WebCore/css/qt/mediaControls-extras.css b/src/3rdparty/webkit/WebCore/css/mediaControlsQt.css
index d85deae..a9c3609 100644
--- a/src/3rdparty/webkit/WebCore/css/qt/mediaControls-extras.css
+++ b/src/3rdparty/webkit/WebCore/css/mediaControlsQt.css
@@ -25,18 +25,38 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+ /* QtWebKit media controls. Extends mediaControls.css */
+
audio {
height: 34px;
width: 400px;
}
+audio::-webkit-media-controls-panel, video::-webkit-media-controls-panel {
+ display: -webkit-box;
+ -webkit-box-orient: horizontal;
+ -webkit-box-align: end;
+ -webkit-user-select: none;
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ z-index: 0;
+ overflow: hidden;
+ height: 100%;
+ text-align: right;
+}
+
+video:-webkit-full-page-media::-webkit-media-controls-panel {
+ display: none;
+}
+
audio::-webkit-media-controls-mute-button, video::-webkit-media-controls-mute-button {
left: auto;
right: 5px;
width: 12px;
height: 12px;
padding: 6px;
- margin: 5px 0px;
+ margin: 5px 5px 5px 3px;
}
audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-button {
@@ -44,17 +64,18 @@ audio::-webkit-media-controls-play-button, video::-webkit-media-controls-play-bu
width: 9px;
height: 12px;
padding: 6px 12px 6px 11px;
- margin: 5px 0px;
+ margin: 5px 3px 5px 5px;
}
-audio::-webkit-media-controls-time-display, video::-webkit-media-controls-time-display {
- /* Since MediaControlElements are always created with a renderer we have to hide
- the controls we don't use, so they don't mess up activation and event handling */
- left: 0px;
- top: 0px;
- width: 0px;
- height: 0px;
+audio::-webkit-media-controls-timeline-container, video::-webkit-media-controls-timeline-container {
+ height: 34px;
+}
+audio::-webkit-media-controls-current-time-display, video::-webkit-media-controls-current-time-display {
+ display: none;
+}
+
+audio::-webkit-media-controls-time-remaining-display, video::-webkit-media-controls-time-remaining-display {
display: none;
}
@@ -66,6 +87,14 @@ audio::-webkit-media-controls-timeline, video::-webkit-media-controls-timeline {
margin: 5px 0px;
}
+audio::-webkit-media-controls-volume-slider-container, video::-webkit-media-controls-volume-slider-container {
+ display: none;
+}
+
+audio::-webkit-media-controls-volume-slider, video::-webkit-media-controls-volume-slider {
+ display: none;
+}
+
audio::-webkit-media-controls-seek-back-button, video::-webkit-media-controls-seek-back-button {
/* Since MediaControlElements are always created with a renderer we have to hide
the controls we don't use, so they don't mess up activation and event handling */
@@ -99,3 +128,11 @@ audio::-webkit-media-controls-fullscreen-button, video::-webkit-media-controls-f
display: none;
}
+audio::-webkit-media-controls-rewind-button, video::-webkit-media-controls-rewind-button {
+ display: none;
+}
+
+audio::-webkit-media-controls-return-to-realtime-button, video::-webkit-media-controls-return-to-realtime-button {
+ display: none;
+}
+
diff --git a/src/3rdparty/webkit/WebCore/css/mediaControlsQT.css b/src/3rdparty/webkit/WebCore/css/mediaControlsQuickTime.css
index 5cf48ae..5cf48ae 100644
--- a/src/3rdparty/webkit/WebCore/css/mediaControlsQT.css
+++ b/src/3rdparty/webkit/WebCore/css/mediaControlsQuickTime.css
diff --git a/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.h b/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.h
new file mode 100644
index 0000000..fc5814a
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef BeforeLoadEvent_h
+#define BeforeLoadEvent_h
+
+#include "Event.h"
+#include "EventNames.h"
+
+namespace WebCore {
+
+class BeforeLoadEvent : public Event {
+public:
+ virtual bool isBeforeLoadEvent() const { return true; }
+
+ static PassRefPtr<BeforeLoadEvent> create(const String& url)
+ {
+ return adoptRef(new BeforeLoadEvent(url));
+ }
+
+ void initBeforeLoadEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& url)
+ {
+ if (dispatched())
+ return;
+
+ initEvent(type, canBubble, cancelable);
+
+ m_url = url;
+ }
+
+ const String& url() const { return m_url; }
+
+private:
+ BeforeLoadEvent(const String& url)
+ : Event(eventNames().beforeloadEvent, false, true)
+ , m_url(url)
+ {}
+
+ String m_url;
+};
+
+} // namespace WebCore
+
+#endif // BeforeLoadEvent_h
diff --git a/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.idl b/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.idl
new file mode 100644
index 0000000..d06a39d
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/dom/BeforeLoadEvent.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+module events {
+
+ interface [
+ GenerateConstructor
+ ] BeforeLoadEvent : Event {
+ void initBeforeLoadEvent(in DOMString type,
+ in boolean canBubble,
+ in boolean cancelable,
+ in DOMString url);
+ readonly attribute DOMString url;
+ };
+
+}
diff --git a/src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp b/src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp
index 7274b5d..5cd0781 100644
--- a/src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/ContainerNode.cpp
@@ -23,6 +23,7 @@
#include "config.h"
#include "ContainerNode.h"
+#include "BeforeLoadEvent.h"
#include "Cache.h"
#include "ContainerNodeAlgorithms.h"
#include "DeleteButtonController.h"
@@ -909,4 +910,15 @@ static void dispatchChildRemovalEvents(Node* child)
}
}
+bool ContainerNode::dispatchBeforeLoadEvent(const String& sourceURL)
+{
+ if (!document()->hasListenerType(Document::BEFORELOAD_LISTENER))
+ return true;
+
+ RefPtr<ContainerNode> protector(this);
+ RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL);
+ dispatchEvent(beforeLoadEvent.get());
+ return !beforeLoadEvent->defaultPrevented();
+}
+
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/dom/ContainerNode.h b/src/3rdparty/webkit/WebCore/dom/ContainerNode.h
index aa480a7..9789f1f 100644
--- a/src/3rdparty/webkit/WebCore/dom/ContainerNode.h
+++ b/src/3rdparty/webkit/WebCore/dom/ContainerNode.h
@@ -71,6 +71,8 @@ public:
void removeAllChildren();
void cloneChildNodes(ContainerNode* clone);
+
+ bool dispatchBeforeLoadEvent(const String& sourceURL);
protected:
ContainerNode(Document*, ConstructionType = CreateContainer);
diff --git a/src/3rdparty/webkit/WebCore/dom/Document.cpp b/src/3rdparty/webkit/WebCore/dom/Document.cpp
index 6dba900..475a8c1 100644
--- a/src/3rdparty/webkit/WebCore/dom/Document.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/Document.cpp
@@ -943,7 +943,7 @@ Element* Document::elementFromPoint(int x, int y) const
return 0;
float zoomFactor = frame->pageZoomFactor();
- IntPoint point = roundedIntPoint(FloatPoint(x * zoomFactor, y * zoomFactor)) + view()->scrollOffset();
+ IntPoint point = roundedIntPoint(FloatPoint((x + view()->scrollX()) * zoomFactor, (y + view()->scrollY()) * zoomFactor));
if (!frameView->visibleContentRect().contains(point))
return 0;
@@ -973,7 +973,7 @@ PassRefPtr<Range> Document::caretRangeFromPoint(int x, int y)
return 0;
float zoomFactor = frame->pageZoomFactor();
- IntPoint point = roundedIntPoint(FloatPoint(x * zoomFactor, y * zoomFactor)) + view()->scrollOffset();
+ IntPoint point = roundedIntPoint(FloatPoint((x + view()->scrollX()) * zoomFactor, (y + view()->scrollY()) * zoomFactor));
if (!frameView->visibleContentRect().contains(point))
return 0;
@@ -1561,6 +1561,9 @@ void Document::open(Document* ownerDocument)
implicitOpen();
+ if (DOMWindow* domWindow = this->domWindow())
+ domWindow->removeAllEventListeners();
+
if (m_frame)
m_frame->loader()->didExplicitOpen();
}
@@ -1582,7 +1585,11 @@ void Document::implicitOpen()
{
cancelParsing();
- clear();
+ delete m_tokenizer;
+ m_tokenizer = 0;
+
+ removeChildren();
+
m_tokenizer = createTokenizer();
setParsing(true);
@@ -1664,7 +1671,7 @@ void Document::implicitClose()
return;
}
- bool wasLocationChangePending = frame() && frame()->loader()->isScheduledLocationChangePending();
+ bool wasLocationChangePending = frame() && frame()->redirectScheduler()->locationChangePending();
bool doload = !parsing() && m_tokenizer && !m_processingLoadEvent && !wasLocationChangePending;
if (!doload)
@@ -1711,7 +1718,7 @@ void Document::implicitClose()
if (f)
f->animation()->resumeAnimations(this);
- ImageLoader::dispatchPendingLoadEvents();
+ ImageLoader::dispatchPendingEvents();
dispatchWindowLoadEvent();
dispatchWindowEvent(PageTransitionEvent::create(eventNames().pageshowEvent, false), this);
if (f)
@@ -1731,7 +1738,7 @@ void Document::implicitClose()
// fires. This will improve onload scores, and other browsers do it.
// If they wanna cheat, we can too. -dwh
- if (frame()->loader()->isScheduledLocationChangePending() && elapsedTime() < cLayoutScheduleThreshold) {
+ if (frame()->redirectScheduler()->locationChangePending() && elapsedTime() < cLayoutScheduleThreshold) {
// Just bail out. Before or during the onload we were shifted to another page.
// The old i-Bench suite does this. When this happens don't bother painting or laying out.
view()->unscheduleRelayout();
@@ -1860,16 +1867,6 @@ void Document::finishParsing()
m_tokenizer->finish();
}
-void Document::clear()
-{
- delete m_tokenizer;
- m_tokenizer = 0;
-
- removeChildren();
- if (DOMWindow* domWindow = this->domWindow())
- domWindow->removeAllEventListeners();
-}
-
const KURL& Document::virtualURL() const
{
return m_url;
@@ -1969,7 +1966,7 @@ const Vector<RefPtr<CSSStyleSheet> >* Document::pageGroupUserSheets() const
const UserStyleSheetVector* sheets = it->second;
for (unsigned i = 0; i < sheets->size(); ++i) {
const UserStyleSheet* sheet = sheets->at(i).get();
- if (!UserContentURLPattern::matchesPatterns(url(), sheet->patterns()))
+ if (!UserContentURLPattern::matchesPatterns(url(), sheet->whitelist(), sheet->blacklist()))
continue;
RefPtr<CSSStyleSheet> parsedSheet = CSSStyleSheet::create(const_cast<Document*>(this), sheet->url());
parsedSheet->setIsUserStyleSheet(true);
@@ -2160,7 +2157,7 @@ void Document::processHttpEquiv(const String& equiv, const String& content)
url = frame->loader()->url().string();
else
url = completeURL(url).string();
- frame->loader()->scheduleHTTPRedirection(delay, url);
+ frame->redirectScheduler()->scheduleRedirect(delay, url);
}
} else if (equalIgnoringCase(equiv, "set-cookie")) {
// FIXME: make setCookie work on XML documents too; e.g. in case of <html:meta .....>
@@ -2174,7 +2171,7 @@ void Document::processHttpEquiv(const String& equiv, const String& content)
FrameLoader* frameLoader = frame->loader();
if (frameLoader->shouldInterruptLoadForXFrameOptions(content, url())) {
frameLoader->stopAllLoaders();
- frameLoader->scheduleLocationChange(blankURL(), String());
+ frame->redirectScheduler()->scheduleLocationChange(blankURL(), String());
}
}
}
@@ -2357,8 +2354,8 @@ void Document::removePendingSheet()
if (!m_pendingStylesheets && m_tokenizer)
m_tokenizer->executeScriptsWaitingForStylesheets();
- if (!m_pendingStylesheets && m_gotoAnchorNeededAfterStylesheetsLoad && m_frame)
- m_frame->loader()->gotoAnchor();
+ if (!m_pendingStylesheets && m_gotoAnchorNeededAfterStylesheetsLoad && view())
+ view()->scrollToFragment(m_frame->loader()->url());
}
void Document::updateStyleSelector()
@@ -2894,42 +2891,47 @@ void Document::dispatchWindowLoadEvent()
PassRefPtr<Event> Document::createEvent(const String& eventType, ExceptionCode& ec)
{
+ RefPtr<Event> event;
if (eventType == "Event" || eventType == "Events" || eventType == "HTMLEvents")
- return Event::create();
- if (eventType == "KeyboardEvent" || eventType == "KeyboardEvents")
- return KeyboardEvent::create();
- if (eventType == "MessageEvent")
- return MessageEvent::create();
- if (eventType == "MouseEvent" || eventType == "MouseEvents")
- return MouseEvent::create();
- if (eventType == "MutationEvent" || eventType == "MutationEvents")
- return MutationEvent::create();
- if (eventType == "OverflowEvent")
- return OverflowEvent::create();
- if (eventType == "PageTransitionEvent")
- return PageTransitionEvent::create();
- if (eventType == "ProgressEvent")
- return ProgressEvent::create();
+ event = Event::create();
+ else if (eventType == "KeyboardEvent" || eventType == "KeyboardEvents")
+ event = KeyboardEvent::create();
+ else if (eventType == "MessageEvent")
+ event = MessageEvent::create();
+ else if (eventType == "MouseEvent" || eventType == "MouseEvents")
+ event = MouseEvent::create();
+ else if (eventType == "MutationEvent" || eventType == "MutationEvents")
+ event = MutationEvent::create();
+ else if (eventType == "OverflowEvent")
+ event = OverflowEvent::create();
+ else if (eventType == "PageTransitionEvent")
+ event = PageTransitionEvent::create();
+ else if (eventType == "ProgressEvent")
+ event = ProgressEvent::create();
#if ENABLE(DOM_STORAGE)
- if (eventType == "StorageEvent")
- return StorageEvent::create();
+ else if (eventType == "StorageEvent")
+ event = StorageEvent::create();
#endif
- if (eventType == "TextEvent")
- return TextEvent::create();
- if (eventType == "UIEvent" || eventType == "UIEvents")
- return UIEvent::create();
- if (eventType == "WebKitAnimationEvent")
- return WebKitAnimationEvent::create();
- if (eventType == "WebKitTransitionEvent")
- return WebKitTransitionEvent::create();
- if (eventType == "WheelEvent")
- return WheelEvent::create();
+ else if (eventType == "TextEvent")
+ event = TextEvent::create();
+ else if (eventType == "UIEvent" || eventType == "UIEvents")
+ event = UIEvent::create();
+ else if (eventType == "WebKitAnimationEvent")
+ event = WebKitAnimationEvent::create();
+ else if (eventType == "WebKitTransitionEvent")
+ event = WebKitTransitionEvent::create();
+ else if (eventType == "WheelEvent")
+ event = WheelEvent::create();
#if ENABLE(SVG)
- if (eventType == "SVGEvents")
- return Event::create();
- if (eventType == "SVGZoomEvents")
- return SVGZoomEvent::create();
+ else if (eventType == "SVGEvents")
+ event = Event::create();
+ else if (eventType == "SVGZoomEvents")
+ event = SVGZoomEvent::create();
#endif
+ if (event) {
+ event->setCreatedByDOM(true);
+ return event.release();
+ }
ec = NOT_SUPPORTED_ERR;
return 0;
}
@@ -2960,6 +2962,8 @@ void Document::addListenerTypeIfNeeded(const AtomicString& eventType)
addListenerType(ANIMATIONITERATION_LISTENER);
else if (eventType == eventNames().webkitTransitionEndEvent)
addListenerType(TRANSITIONEND_LISTENER);
+ else if (eventType == eventNames().beforeloadEvent)
+ addListenerType(BEFORELOAD_LISTENER);
}
CSSStyleDeclaration* Document::getOverrideStyle(Element*, const String&)
@@ -4016,8 +4020,17 @@ void Document::finishedParsing()
{
setParsing(false);
dispatchEvent(Event::create(eventNames().DOMContentLoadedEvent, true, false));
- if (Frame* f = frame())
+ if (Frame* f = frame()) {
f->loader()->finishedParsing();
+
+#if ENABLE(INSPECTOR)
+ if (!page())
+ return;
+
+ if (InspectorController* controller = page()->inspectorController())
+ controller->mainResourceFiredDOMContentEvent(f->loader()->documentLoader(), url());
+#endif
+ }
}
Vector<String> Document::formElementsState() const
@@ -4230,7 +4243,7 @@ void Document::initSecurityContext()
m_cookieURL = url;
ScriptExecutionContext::setSecurityOrigin(SecurityOrigin::create(url));
- if (FrameLoader::allowSubstituteDataAccessToLocal()) {
+ if (SecurityOrigin::allowSubstituteDataAccessToLocal()) {
// If this document was loaded with substituteData, then the document can
// load local resources. See https://bugs.webkit.org/show_bug.cgi?id=16756
// and https://bugs.webkit.org/show_bug.cgi?id=19760 for further
@@ -4494,7 +4507,7 @@ void Document::resourceRetrievedByXMLHttpRequest(unsigned long identifier, const
Frame* frame = this->frame();
if (frame) {
FrameLoader* frameLoader = frame->loader();
- frameLoader->didLoadResourceByXMLHttpRequest(identifier, sourceString);
+ frameLoader->notifier()->didLoadResourceByXMLHttpRequest(identifier, sourceString);
}
}
diff --git a/src/3rdparty/webkit/WebCore/dom/Document.h b/src/3rdparty/webkit/WebCore/dom/Document.h
index f05c9f9..09bba58 100644
--- a/src/3rdparty/webkit/WebCore/dom/Document.h
+++ b/src/3rdparty/webkit/WebCore/dom/Document.h
@@ -473,7 +473,6 @@ public:
void write(const String& text, Document* ownerDocument = 0);
void writeln(const String& text, Document* ownerDocument = 0);
void finishParsing();
- void clear();
bool wellFormed() const { return m_wellFormed; }
@@ -615,7 +614,8 @@ public:
ANIMATIONEND_LISTENER = 0x100,
ANIMATIONSTART_LISTENER = 0x200,
ANIMATIONITERATION_LISTENER = 0x400,
- TRANSITIONEND_LISTENER = 0x800
+ TRANSITIONEND_LISTENER = 0x800,
+ BEFORELOAD_LISTENER = 0x1000
};
bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); }
diff --git a/src/3rdparty/webkit/WebCore/dom/Document.idl b/src/3rdparty/webkit/WebCore/dom/Document.idl
index 822f860..e9b5480 100644
--- a/src/3rdparty/webkit/WebCore/dom/Document.idl
+++ b/src/3rdparty/webkit/WebCore/dom/Document.idl
@@ -172,6 +172,9 @@ module core {
attribute HTMLElement body
setter raises (DOMException);
+#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
+ readonly attribute HTMLHeadElement head;
+#endif
readonly attribute HTMLCollection images;
readonly attribute HTMLCollection applets;
readonly attribute HTMLCollection links;
diff --git a/src/3rdparty/webkit/WebCore/dom/Element.cpp b/src/3rdparty/webkit/WebCore/dom/Element.cpp
index 50ff033..621c63a 100644
--- a/src/3rdparty/webkit/WebCore/dom/Element.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/Element.cpp
@@ -123,6 +123,7 @@ PassRefPtr<Element> Element::cloneElementWithoutChildren()
void Element::removeAttribute(const QualifiedName& name, ExceptionCode& ec)
{
if (namedAttrMap) {
+ ec = 0;
namedAttrMap->removeNamedItem(name, ec);
if (ec == NOT_FOUND_ERR)
ec = 0;
@@ -515,7 +516,7 @@ void Element::setAttribute(const AtomicString& name, const AtomicString& value,
return;
}
- const AtomicString& localName = (shouldIgnoreAttributeCase(this) && !name.string().impl()->isLower()) ? AtomicString(name.string().lower()) : name;
+ const AtomicString& localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
// allocate attributemap if necessary
Attribute* old = attributes(false)->getAttributeItem(localName, false);
diff --git a/src/3rdparty/webkit/WebCore/dom/Event.cpp b/src/3rdparty/webkit/WebCore/dom/Event.cpp
index 4088e2c..ba310ef 100644
--- a/src/3rdparty/webkit/WebCore/dom/Event.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/Event.cpp
@@ -35,6 +35,7 @@ Event::Event()
, m_defaultPrevented(false)
, m_defaultHandled(false)
, m_cancelBubble(false)
+ , m_createdByDOM(false)
, m_eventPhase(0)
, m_currentTarget(0)
, m_createTime(static_cast<DOMTimeStamp>(currentTime() * 1000.0))
@@ -49,6 +50,7 @@ Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableAr
, m_defaultPrevented(false)
, m_defaultHandled(false)
, m_cancelBubble(false)
+ , m_createdByDOM(false)
, m_eventPhase(0)
, m_currentTarget(0)
, m_createTime(static_cast<DOMTimeStamp>(currentTime() * 1000.0))
@@ -149,6 +151,11 @@ bool Event::isXMLHttpRequestProgressEvent() const
return false;
}
+bool Event::isBeforeLoadEvent() const
+{
+ return false;
+}
+
#if ENABLE(SVG)
bool Event::isSVGZoomEvent() const
{
diff --git a/src/3rdparty/webkit/WebCore/dom/Event.h b/src/3rdparty/webkit/WebCore/dom/Event.h
index 7d06378..74a2f10 100644
--- a/src/3rdparty/webkit/WebCore/dom/Event.h
+++ b/src/3rdparty/webkit/WebCore/dom/Event.h
@@ -114,6 +114,7 @@ namespace WebCore {
virtual bool isXMLHttpRequestProgressEvent() const;
virtual bool isWebKitAnimationEvent() const;
virtual bool isWebKitTransitionEvent() const;
+ virtual bool isBeforeLoadEvent() const;
#if ENABLE(SVG)
virtual bool isSVGZoomEvent() const;
#endif
@@ -144,6 +145,9 @@ namespace WebCore {
virtual Clipboard* clipboard() const { return 0; }
+ bool createdByDOM() const { return m_createdByDOM; }
+ void setCreatedByDOM(bool createdByDOM) { m_createdByDOM = createdByDOM; }
+
protected:
Event();
Event(const AtomicString& type, bool canBubble, bool cancelable);
@@ -161,6 +165,9 @@ namespace WebCore {
bool m_defaultHandled;
bool m_cancelBubble;
+ // Whether this event was created by document.createEvent().
+ bool m_createdByDOM;
+
unsigned short m_eventPhase;
EventTarget* m_currentTarget;
RefPtr<EventTarget> m_target;
diff --git a/src/3rdparty/webkit/WebCore/dom/EventNames.h b/src/3rdparty/webkit/WebCore/dom/EventNames.h
index 0eb98ec..2c4cd32 100644
--- a/src/3rdparty/webkit/WebCore/dom/EventNames.h
+++ b/src/3rdparty/webkit/WebCore/dom/EventNames.h
@@ -32,6 +32,7 @@ namespace WebCore {
macro(abort) \
macro(beforecopy) \
macro(beforecut) \
+ macro(beforeload) \
macro(beforepaste) \
macro(beforeunload) \
macro(blur) \
@@ -63,7 +64,6 @@ namespace WebCore {
macro(keypress) \
macro(keyup) \
macro(load) \
- macro(loadend) \
macro(loadstart) \
macro(message) \
macro(mousedown) \
diff --git a/src/3rdparty/webkit/WebCore/dom/ExceptionBase.cpp b/src/3rdparty/webkit/WebCore/dom/ExceptionBase.cpp
index c73d514..d175d8b 100644
--- a/src/3rdparty/webkit/WebCore/dom/ExceptionBase.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/ExceptionBase.cpp
@@ -34,6 +34,7 @@ namespace WebCore {
ExceptionBase::ExceptionBase(const ExceptionCodeDescription& description)
: m_code(description.code)
, m_name(description.name)
+ , m_description(description.description)
{
if (description.name)
m_message = String::format("%s: %s Exception %d", description.name, description.typeName, description.code);
diff --git a/src/3rdparty/webkit/WebCore/dom/ExceptionBase.h b/src/3rdparty/webkit/WebCore/dom/ExceptionBase.h
index 44fad7e..81e2d7f 100644
--- a/src/3rdparty/webkit/WebCore/dom/ExceptionBase.h
+++ b/src/3rdparty/webkit/WebCore/dom/ExceptionBase.h
@@ -40,6 +40,7 @@ namespace WebCore {
unsigned short code() const { return m_code; }
String name() const { return m_name; }
String message() const { return m_message; }
+ String description() const { return m_description; }
String toString() const;
@@ -50,6 +51,7 @@ namespace WebCore {
unsigned short m_code;
String m_name;
String m_message;
+ String m_description;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp b/src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp
index 0291a21..7bb8a50 100644
--- a/src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/ExceptionCode.cpp
@@ -65,25 +65,70 @@ static const char* const exceptionNames[] = {
"QUOTA_EXCEEDED_ERR"
};
+static const char* const exceptionDescriptions[] = {
+ "Index or size was negative, or greater than the allowed value.",
+ "The specified range of text did not fit into a DOMString.",
+ "A Node was inserted somewhere it doesn't belong.",
+ "A Node was used in a different document than the one that created it (that doesn't support it).",
+ "An invalid or illegal character was specified, such as in an XML name.",
+ "Data was specified for a Node which does not support data.",
+ "An attempt was made to modify an object where modifications are not allowed.",
+ "An attempt was made to reference a Node in a context where it does not exist.",
+ "The implementation did not support the requested type of object or operation.",
+ "An attempt was made to add an attribute that is already in use elsewhere.",
+ "An attempt was made to use an object that is not, or is no longer, usable.",
+ "An invalid or illegal string was specified.",
+ "An attempt was made to modify the type of the underlying object.",
+ "An attempt was made to create or change an object in a way which is incorrect with regard to namespaces.",
+ "A parameter or an operation was not supported by the underlying object.",
+ "A call to a method such as insertBefore or removeChild would make the Node invalid with respect to \"partial validity\", this exception would be raised and the operation would not be done.",
+ "The type of an object was incompatible with the expected type of the parameter associated to the object.",
+ "An attempt was made to break through the security policy of the user agent.",
+ // FIXME: Couldn't find a description in the HTML/DOM specifications for NETWORK_ERR, ABORT_ERR, URL_MISMATCH_ERR, and QUOTA_EXCEEDED_ERR
+ "A network error occured.",
+ "The user aborted a request.",
+ "A worker global scope represented an absolute URL that is not equal to the resulting absolute URL.",
+ "An attempt was made to add something to storage that exceeded the quota."
+};
+
static const char* const rangeExceptionNames[] = {
"BAD_BOUNDARYPOINTS_ERR",
"INVALID_NODE_TYPE_ERR"
};
+static const char* const rangeExceptionDescriptions[] = {
+ "The boundary-points of a Range did not meet specific requirements.",
+ "The container of an boundary-point of a Range was being set to either a node of an invalid type or a node with an ancestor of an invalid type."
+};
+
static const char* const eventExceptionNames[] = {
"UNSPECIFIED_EVENT_TYPE_ERR"
};
+static const char* const eventExceptionDescriptions[] = {
+ "The Event's type was not specified by initializing the event before the method was called."
+};
+
static const char* const xmlHttpRequestExceptionNames[] = {
"NETWORK_ERR",
"ABORT_ERR"
};
+static const char* const xmlHttpRequestExceptionDescriptions[] = {
+ "A network error occured in synchronous requests.",
+ "The user aborted a request in synchronous requests."
+};
+
#if ENABLE(XPATH)
static const char* const xpathExceptionNames[] = {
"INVALID_EXPRESSION_ERR",
"TYPE_ERR"
};
+
+static const char* const xpathExceptionDescriptions[] = {
+ "The expression had a syntax error or otherwise is not a legal expression according to the rules of the specific XPathEvaluator.",
+ "The expression could not be converted to return the specified type."
+};
#endif
#if ENABLE(SVG)
@@ -92,6 +137,12 @@ static const char* const svgExceptionNames[] = {
"SVG_INVALID_VALUE_ERR",
"SVG_MATRIX_NOT_INVERTABLE"
};
+
+static const char* const svgExceptionDescriptions[] = {
+ "An object of the wrong type was passed to an operation.",
+ "An invalid value was passed to an operation or assigned to an attribute.",
+ "An attempt was made to invert a matrix that is not invertible."
+};
#endif
void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& description)
@@ -101,6 +152,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
const char* typeName;
int code = ec;
const char* const* nameTable;
+ const char* const* descriptionTable;
int nameTableSize;
int nameTableOffset;
ExceptionType type;
@@ -110,6 +162,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
typeName = "DOM Range";
code -= RangeException::RangeExceptionOffset;
nameTable = rangeExceptionNames;
+ descriptionTable = rangeExceptionDescriptions;
nameTableSize = sizeof(rangeExceptionNames) / sizeof(rangeExceptionNames[0]);
nameTableOffset = RangeException::BAD_BOUNDARYPOINTS_ERR;
} else if (code >= EventException::EventExceptionOffset && code <= EventException::EventExceptionMax) {
@@ -117,6 +170,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
typeName = "DOM Events";
code -= EventException::EventExceptionOffset;
nameTable = eventExceptionNames;
+ descriptionTable = eventExceptionDescriptions;
nameTableSize = sizeof(eventExceptionNames) / sizeof(eventExceptionNames[0]);
nameTableOffset = EventException::UNSPECIFIED_EVENT_TYPE_ERR;
} else if (code >= XMLHttpRequestException::XMLHttpRequestExceptionOffset && code <= XMLHttpRequestException::XMLHttpRequestExceptionMax) {
@@ -124,6 +178,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
typeName = "XMLHttpRequest";
code -= XMLHttpRequestException::XMLHttpRequestExceptionOffset;
nameTable = xmlHttpRequestExceptionNames;
+ descriptionTable = xmlHttpRequestExceptionDescriptions;
nameTableSize = sizeof(xmlHttpRequestExceptionNames) / sizeof(xmlHttpRequestExceptionNames[0]);
// XMLHttpRequest exception codes start with 101 and we don't want 100 empty elements in the name array
nameTableOffset = XMLHttpRequestException::NETWORK_ERR;
@@ -133,6 +188,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
typeName = "DOM XPath";
code -= XPathException::XPathExceptionOffset;
nameTable = xpathExceptionNames;
+ descriptionTable = xpathExceptionDescriptions;
nameTableSize = sizeof(xpathExceptionNames) / sizeof(xpathExceptionNames[0]);
// XPath exception codes start with 51 and we don't want 51 empty elements in the name array
nameTableOffset = XPathException::INVALID_EXPRESSION_ERR;
@@ -143,6 +199,7 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
typeName = "DOM SVG";
code -= SVGException::SVGExceptionOffset;
nameTable = svgExceptionNames;
+ descriptionTable = svgExceptionDescriptions;
nameTableSize = sizeof(svgExceptionNames) / sizeof(svgExceptionNames[0]);
nameTableOffset = SVGException::SVG_WRONG_TYPE_ERR;
#endif
@@ -150,17 +207,20 @@ void getExceptionCodeDescription(ExceptionCode ec, ExceptionCodeDescription& des
type = DOMExceptionType;
typeName = "DOM";
nameTable = exceptionNames;
+ descriptionTable = exceptionDescriptions;
nameTableSize = sizeof(exceptionNames) / sizeof(exceptionNames[0]);
nameTableOffset = INDEX_SIZE_ERR;
}
description.typeName = typeName;
description.name = (ec >= nameTableOffset && ec - nameTableOffset < nameTableSize) ? nameTable[ec - nameTableOffset] : 0;
+ description.description = (ec >= nameTableOffset && ec - nameTableOffset < nameTableSize) ? descriptionTable[ec - nameTableOffset] : 0;
description.code = code;
description.type = type;
// All exceptions used in the DOM code should have names.
ASSERT(description.name);
+ ASSERT(description.description);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/dom/ExceptionCode.h b/src/3rdparty/webkit/WebCore/dom/ExceptionCode.h
index 58b18e2..573fb36 100644
--- a/src/3rdparty/webkit/WebCore/dom/ExceptionCode.h
+++ b/src/3rdparty/webkit/WebCore/dom/ExceptionCode.h
@@ -77,6 +77,7 @@ namespace WebCore {
struct ExceptionCodeDescription {
const char* typeName; // has spaces and is suitable for use in exception description strings; maximum length is 10 characters
const char* name; // exception name, also intended for use in exception description strings; 0 if name not known; maximum length is 27 characters
+ const char* description; // exception description, intended for use in exception strings; more readable explanation of error
int code; // numeric value of the exception within a particular type
ExceptionType type;
};
diff --git a/src/3rdparty/webkit/WebCore/dom/MessageEvent.cpp b/src/3rdparty/webkit/WebCore/dom/MessageEvent.cpp
index 2ef8bc2..3c84642 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessageEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/MessageEvent.cpp
@@ -34,10 +34,11 @@
namespace WebCore {
MessageEvent::MessageEvent()
+ : m_data(SerializedScriptValue::create())
{
}
-MessageEvent::MessageEvent(const String& data, const String& origin, const String& lastEventId, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortArray> ports)
+MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortArray> ports)
: Event(eventNames().messageEvent, false, false)
, m_data(data)
, m_origin(origin)
@@ -51,7 +52,7 @@ MessageEvent::~MessageEvent()
{
}
-void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& data, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtr<MessagePortArray> ports)
+void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtr<MessagePortArray> ports)
{
if (dispatched())
return;
@@ -74,7 +75,7 @@ MessagePort* MessageEvent::messagePort()
return (*m_ports)[0].get();
}
-void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePort* port)
+void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePort* port)
{
MessagePortArray* ports = 0;
if (port) {
diff --git a/src/3rdparty/webkit/WebCore/dom/MessageEvent.h b/src/3rdparty/webkit/WebCore/dom/MessageEvent.h
index 555ed47..b7f9b02 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessageEvent.h
+++ b/src/3rdparty/webkit/WebCore/dom/MessageEvent.h
@@ -31,6 +31,7 @@
#include "DOMWindow.h"
#include "Event.h"
#include "MessagePort.h"
+#include "SerializedScriptValue.h"
namespace WebCore {
@@ -42,15 +43,15 @@ namespace WebCore {
{
return adoptRef(new MessageEvent);
}
- static PassRefPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, const String& data = "", const String& origin = "", const String& lastEventId = "", PassRefPtr<DOMWindow> source = 0)
+ static PassRefPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, PassRefPtr<SerializedScriptValue> data = 0, const String& origin = "", const String& lastEventId = "", PassRefPtr<DOMWindow> source = 0)
{
return adoptRef(new MessageEvent(data, origin, lastEventId, source, ports));
}
virtual ~MessageEvent();
- void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& data, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtr<MessagePortArray>);
+ void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtr<MessagePortArray>);
- const String& data() const { return m_data; }
+ SerializedScriptValue* data() const { return m_data.get(); }
const String& origin() const { return m_origin; }
const String& lastEventId() const { return m_lastEventId; }
DOMWindow* source() const { return m_source.get(); }
@@ -59,15 +60,15 @@ namespace WebCore {
// FIXME: remove this when we update the ObjC bindings (bug #28774).
MessagePort* messagePort();
// FIXME: remove this when we update the ObjC bindings (bug #28774).
- void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePort*);
+ void initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, DOMWindow* source, MessagePort*);
virtual bool isMessageEvent() const;
private:
MessageEvent();
- MessageEvent(const String& data, const String& origin, const String& lastEventId, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortArray>);
+ MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortArray>);
- String m_data;
+ RefPtr<SerializedScriptValue> m_data;
String m_origin;
String m_lastEventId;
RefPtr<DOMWindow> m_source;
diff --git a/src/3rdparty/webkit/WebCore/dom/MessageEvent.idl b/src/3rdparty/webkit/WebCore/dom/MessageEvent.idl
index a32cc93..7e497fc 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessageEvent.idl
+++ b/src/3rdparty/webkit/WebCore/dom/MessageEvent.idl
@@ -30,20 +30,20 @@ module events {
GenerateConstructor,
NoStaticTables
] MessageEvent : Event {
+ readonly attribute SerializedScriptValue data;
- readonly attribute DOMString data;
readonly attribute DOMString origin;
readonly attribute DOMString lastEventId;
readonly attribute DOMWindow source;
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
readonly attribute [CustomGetter] Array ports;
- [Custom] void initMessageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString dataArg, in DOMString originArg, in DOMString lastEventIdArg, in DOMWindow sourceArg, in Array messagePorts);
+ [Custom] void initMessageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in SerializedScriptValue dataArg, in DOMString originArg, in DOMString lastEventIdArg, in DOMWindow sourceArg, in Array messagePorts);
#else
// There's no good way to expose an array via the ObjC bindings, so for now just expose a single port.
readonly attribute MessagePort messagePort;
- void initMessageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString dataArg, in DOMString originArg, in DOMString lastEventIdArg, in DOMWindow sourceArg, in MessagePort messagePort);
+ void initMessageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in SerializedScriptValue dataArg, in DOMString originArg, in DOMString lastEventIdArg, in DOMWindow sourceArg, in MessagePort messagePort);
#endif
};
diff --git a/src/3rdparty/webkit/WebCore/dom/MessagePort.cpp b/src/3rdparty/webkit/WebCore/dom/MessagePort.cpp
index 50a0106..9f6e649 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessagePort.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/MessagePort.cpp
@@ -56,7 +56,7 @@ MessagePort::~MessagePort()
}
// FIXME: remove this when we update the ObjC bindings (bug #28774).
-void MessagePort::postMessage(const String& message, MessagePort* port, ExceptionCode& ec)
+void MessagePort::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort* port, ExceptionCode& ec)
{
MessagePortArray ports;
if (port)
@@ -64,12 +64,12 @@ void MessagePort::postMessage(const String& message, MessagePort* port, Exceptio
postMessage(message, &ports, ec);
}
-void MessagePort::postMessage(const String& message, ExceptionCode& ec)
+void MessagePort::postMessage(PassRefPtr<SerializedScriptValue> message, ExceptionCode& ec)
{
postMessage(message, static_cast<MessagePortArray*>(0), ec);
}
-void MessagePort::postMessage(const String& message, const MessagePortArray* ports, ExceptionCode& ec)
+void MessagePort::postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionCode& ec)
{
if (!m_entangledChannel)
return;
diff --git a/src/3rdparty/webkit/WebCore/dom/MessagePort.h b/src/3rdparty/webkit/WebCore/dom/MessagePort.h
index e649d5d..0ab0f50 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessagePort.h
+++ b/src/3rdparty/webkit/WebCore/dom/MessagePort.h
@@ -56,10 +56,10 @@ namespace WebCore {
static PassRefPtr<MessagePort> create(ScriptExecutionContext& scriptExecutionContext) { return adoptRef(new MessagePort(scriptExecutionContext)); }
~MessagePort();
- void postMessage(const String& message, ExceptionCode&);
- void postMessage(const String& message, const MessagePortArray*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionCode&);
// FIXME: remove this when we update the ObjC bindings (bug #28774).
- void postMessage(const String& message, MessagePort*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, ExceptionCode&);
void start();
void close();
diff --git a/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp b/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp
index 34b2ce7..e1a3ac6 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.cpp
@@ -33,13 +33,13 @@
namespace WebCore {
-PassOwnPtr<MessagePortChannel::EventData> MessagePortChannel::EventData::create(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
+PassOwnPtr<MessagePortChannel::EventData> MessagePortChannel::EventData::create(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
{
return new EventData(message, channels);
}
-MessagePortChannel::EventData::EventData(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
- : m_message(message.copy())
+MessagePortChannel::EventData::EventData(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
+ : m_message(message->release())
, m_channels(channels)
{
}
diff --git a/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h b/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h
index 4acfe7f..2321b1f 100644
--- a/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h
+++ b/src/3rdparty/webkit/WebCore/dom/MessagePortChannel.h
@@ -33,6 +33,8 @@
#include "PlatformString.h"
+#include "SerializedScriptValue.h"
+
#include <wtf/OwnPtr.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/PassRefPtr.h>
@@ -45,6 +47,7 @@ namespace WebCore {
class MessagePortChannel;
class PlatformMessagePortChannel;
class ScriptExecutionContext;
+ class SerializedScriptValue;
class String;
// The overwhelmingly common case is sending a single port, so handle that efficiently with an inline buffer of size 1.
@@ -77,14 +80,14 @@ namespace WebCore {
class EventData {
public:
- static PassOwnPtr<EventData> create(const String&, PassOwnPtr<MessagePortChannelArray>);
+ static PassOwnPtr<EventData> create(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
- const String& message() { return m_message; }
+ SerializedScriptValue* message() { return m_message.get(); }
PassOwnPtr<MessagePortChannelArray> channels() { return m_channels.release(); }
private:
- EventData(const String& message, PassOwnPtr<MessagePortChannelArray>);
- String m_message;
+ EventData(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray>);
+ RefPtr<SerializedScriptValue> m_message;
OwnPtr<MessagePortChannelArray> m_channels;
};
diff --git a/src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp b/src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp
index 4ed85ce..87815b1 100644
--- a/src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/MouseRelatedEvent.cpp
@@ -57,7 +57,7 @@ static int contentsX(AbstractView* abstractView)
FrameView* frameView = frame->view();
if (!frameView)
return 0;
- return frameView->scrollX();
+ return frameView->scrollX() / frame->pageZoomFactor();
}
static int contentsY(AbstractView* abstractView)
@@ -70,7 +70,7 @@ static int contentsY(AbstractView* abstractView)
FrameView* frameView = frame->view();
if (!frameView)
return 0;
- return frameView->scrollY();
+ return frameView->scrollY() / frame->pageZoomFactor();
}
MouseRelatedEvent::MouseRelatedEvent(const AtomicString& eventType, bool canBubble, bool cancelable, PassRefPtr<AbstractView> viewArg,
diff --git a/src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp b/src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp
index 8404481..72993dd 100644
--- a/src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/ProcessingInstruction.cpp
@@ -64,6 +64,7 @@ void ProcessingInstruction::setData(const String& data, ExceptionCode&)
int oldLength = m_data.length();
m_data = data;
document()->textRemoved(this, 0, oldLength);
+ checkStyleSheet();
}
String ProcessingInstruction::nodeName() const
@@ -142,13 +143,21 @@ void ProcessingInstruction::checkStyleSheet()
}
#endif
} else {
+ if (m_cachedSheet) {
+ m_cachedSheet->removeClient(this);
+ m_cachedSheet = 0;
+ }
+
+ String url = document()->completeURL(href).string();
+ if (!dispatchBeforeLoadEvent(url))
+ return;
+
m_loading = true;
document()->addPendingSheet();
- if (m_cachedSheet)
- m_cachedSheet->removeClient(this);
+
#if ENABLE(XSLT)
if (m_isXSL)
- m_cachedSheet = document()->docLoader()->requestXSLStyleSheet(document()->completeURL(href).string());
+ m_cachedSheet = document()->docLoader()->requestXSLStyleSheet(url);
else
#endif
{
@@ -156,10 +165,15 @@ void ProcessingInstruction::checkStyleSheet()
if (charset.isEmpty())
charset = document()->frame()->loader()->encoding();
- m_cachedSheet = document()->docLoader()->requestCSSStyleSheet(document()->completeURL(href).string(), charset);
+ m_cachedSheet = document()->docLoader()->requestCSSStyleSheet(url, charset);
}
if (m_cachedSheet)
m_cachedSheet->addClient(this);
+ else {
+ // The request may have been denied if (for example) the stylesheet is local and the document is remote.
+ m_loading = false;
+ document()->removePendingSheet();
+ }
}
}
}
diff --git a/src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp b/src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp
index 607c846..2c5f39a 100644
--- a/src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/QualifiedName.cpp
@@ -97,4 +97,11 @@ void QualifiedName::init()
}
}
+const AtomicString& QualifiedName::localNameUpper() const
+{
+ if (!m_impl->m_localNameUpper)
+ m_impl->m_localNameUpper = m_impl->m_localName.upper();
+ return m_impl->m_localNameUpper;
+}
+
}
diff --git a/src/3rdparty/webkit/WebCore/dom/QualifiedName.h b/src/3rdparty/webkit/WebCore/dom/QualifiedName.h
index 939927b..3b9f5c4 100644
--- a/src/3rdparty/webkit/WebCore/dom/QualifiedName.h
+++ b/src/3rdparty/webkit/WebCore/dom/QualifiedName.h
@@ -41,9 +41,10 @@ public:
return adoptRef(new QualifiedNameImpl(prefix, localName, namespaceURI));
}
- AtomicString m_prefix;
- AtomicString m_localName;
- AtomicString m_namespace;
+ const AtomicString m_prefix;
+ const AtomicString m_localName;
+ const AtomicString m_namespace;
+ mutable AtomicString m_localNameUpper;
private:
QualifiedNameImpl(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI)
@@ -76,6 +77,9 @@ public:
const AtomicString& localName() const { return m_impl->m_localName; }
const AtomicString& namespaceURI() const { return m_impl->m_namespace; }
+ // Uppercased localName, cached for efficiency
+ const AtomicString& localNameUpper() const;
+
String toString() const;
QualifiedNameImpl* impl() const { return m_impl; }
diff --git a/src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp b/src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp
index fe38b46..827aff3 100644
--- a/src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/ScriptElement.cpp
@@ -151,6 +151,9 @@ void ScriptElementData::requestScript(const String& sourceUrl)
if (!document->frame())
return;
+ if (!m_element->dispatchBeforeLoadEvent(sourceUrl))
+ return;
+
ASSERT(!m_cachedScript);
m_cachedScript = document->docLoader()->requestScript(sourceUrl, scriptCharset());
m_requested = true;
diff --git a/src/3rdparty/webkit/WebCore/dom/StyledElement.cpp b/src/3rdparty/webkit/WebCore/dom/StyledElement.cpp
index 5212380..46ce137 100644
--- a/src/3rdparty/webkit/WebCore/dom/StyledElement.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/StyledElement.cpp
@@ -240,8 +240,8 @@ void StyledElement::parseMappedAttribute(MappedAttribute *attr)
if (namedAttrMap) {
if (attr->isNull())
namedAttrMap->setID(nullAtom);
- else if (document()->inCompatMode() && !attr->value().impl()->isLower())
- namedAttrMap->setID(AtomicString(attr->value().string().lower()));
+ else if (document()->inCompatMode())
+ namedAttrMap->setID(attr->value().lower());
else
namedAttrMap->setID(attr->value());
}
diff --git a/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp b/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp
index 4d06343..543927d 100644
--- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp
@@ -40,6 +40,7 @@
#include "HTMLLinkElement.h"
#include "HTMLNames.h"
#include "HTMLStyleElement.h"
+#include "ImageLoader.h"
#include "ProcessingInstruction.h"
#include "ResourceError.h"
#include "ResourceHandle.h"
@@ -105,6 +106,9 @@ void XMLTokenizer::write(const SegmentedString& s, bool /*appendData*/)
}
doWrite(s.toString());
+
+ // After parsing, go ahead and dispatch image beforeload/load events.
+ ImageLoader::dispatchPendingEvents();
}
void XMLTokenizer::handleError(ErrorType type, const char* m, int lineNumber, int columnNumber)
@@ -296,7 +300,7 @@ void XMLTokenizer::notifyFinished(CachedResource* unusedResource)
if (errorOccurred)
scriptElement->dispatchErrorEvent();
else {
- m_view->frame()->loader()->executeScript(sourceCode);
+ m_view->frame()->script()->executeScript(sourceCode);
scriptElement->dispatchLoadEvent();
}
diff --git a/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp b/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp
index d3c6546..6cc0a0c 100644
--- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp
@@ -851,7 +851,8 @@ void XMLTokenizer::endElementNs()
if (!scriptHref.isEmpty()) {
// we have a src attribute
String scriptCharset = scriptElement->scriptCharset();
- if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) {
+ if (element->dispatchBeforeLoadEvent(scriptHref) &&
+ (m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) {
m_scriptElement = element;
m_pendingScript->addClient(this);
@@ -861,7 +862,7 @@ void XMLTokenizer::endElementNs()
} else
m_scriptElement = 0;
} else
- m_view->frame()->loader()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), m_doc->url(), m_scriptStartLine));
+ m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), m_doc->url(), m_scriptStartLine));
}
m_requestingScript = false;
setCurrentNode(parent.get());
@@ -886,7 +887,7 @@ void XMLTokenizer::error(ErrorType type, const char* message, va_list args)
if (m_parserStopped)
return;
-#if PLATFORM(WIN_OS)
+#if COMPILER(MSVC)
char m[1024];
vsnprintf(m, sizeof(m) - 1, message, args);
#else
@@ -900,7 +901,7 @@ void XMLTokenizer::error(ErrorType type, const char* message, va_list args)
else
handleError(type, m, lineNumber(), columnNumber());
-#if !PLATFORM(WIN_OS)
+#if !COMPILER(MSVC)
free(m);
#endif
}
diff --git a/src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp b/src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp
index 04405d6..65cbc21 100644
--- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp
+++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizerQt.cpp
@@ -611,7 +611,8 @@ void XMLTokenizer::parseEndElement()
if (!scriptHref.isEmpty()) {
// we have a src attribute
String scriptCharset = scriptElement->scriptCharset();
- if ((m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) {
+ if (element->dispatchBeforeLoadEvent(scriptHref) &&
+ (m_pendingScript = m_doc->docLoader()->requestScript(scriptHref, scriptCharset))) {
m_scriptElement = element;
m_pendingScript->addClient(this);
@@ -621,7 +622,7 @@ void XMLTokenizer::parseEndElement()
} else
m_scriptElement = 0;
} else
- m_view->frame()->loader()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), m_doc->url(), m_scriptStartLine));
+ m_view->frame()->script()->executeScript(ScriptSourceCode(scriptElement->scriptContent(), m_doc->url(), m_scriptStartLine));
}
m_requestingScript = false;
setCurrentNode(parent.get());
diff --git a/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp b/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp
index 0c3aa42..89d862f 100644
--- a/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.cpp
@@ -383,7 +383,11 @@ size_t numEditingStyleProperties = sizeof(editingStyleProperties)/sizeof(editing
PassRefPtr<CSSMutableStyleDeclaration> editingStyleAtPosition(Position pos, ShouldIncludeTypingStyle shouldIncludeTypingStyle)
{
RefPtr<CSSComputedStyleDeclaration> computedStyleAtPosition = pos.computedStyle();
- RefPtr<CSSMutableStyleDeclaration> style = computedStyleAtPosition->copyPropertiesInSet(editingStyleProperties, numEditingStyleProperties);
+ RefPtr<CSSMutableStyleDeclaration> style;
+ if (!computedStyleAtPosition)
+ style = CSSMutableStyleDeclaration::create();
+ else
+ style = computedStyleAtPosition->copyPropertiesInSet(editingStyleProperties, numEditingStyleProperties);
if (style && pos.node() && pos.node()->computedStyle()) {
RenderStyle* renderStyle = pos.node()->computedStyle();
@@ -1075,6 +1079,23 @@ void ApplyStyleCommand::applyInlineStyleToRange(CSSMutableStyleDeclaration* styl
}
}
+bool ApplyStyleCommand::shouldRemoveTextDecorationTag(CSSStyleDeclaration* styleToApply, int textDecorationAddedByTag) const
+{
+ // Honor text-decorations-in-effect
+ RefPtr<CSSValue> textDecorationsToApply = styleToApply->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect);
+ if (!textDecorationsToApply || !textDecorationsToApply->isValueList())
+ textDecorationsToApply = styleToApply->getPropertyCSSValue(CSSPropertyTextDecoration);
+
+ // When there is no text decorations to apply, remove any one of u, s, & strike
+ if (!textDecorationsToApply || !textDecorationsToApply->isValueList())
+ return true;
+
+ // Remove node if it implicitly adds style not present in styleToApply
+ CSSValueList* valueList = static_cast<CSSValueList*>(textDecorationsToApply.get());
+ RefPtr<CSSPrimitiveValue> value = CSSPrimitiveValue::createIdentifier(textDecorationAddedByTag);
+ return !valueList->hasValue(value.get());
+}
+
// This function maps from styling tags to CSS styles. Used for knowing which
// styling tags should be removed when toggling styles.
bool ApplyStyleCommand::implicitlyStyledElementShouldBeRemovedWhenApplyingStyle(HTMLElement* elem, CSSMutableStyleDeclaration* style)
@@ -1088,36 +1109,25 @@ bool ApplyStyleCommand::implicitlyStyledElementShouldBeRemovedWhenApplyingStyle(
case CSSPropertyFontWeight:
// IE inserts "strong" tags for execCommand("bold"), so we remove them, even though they're not strictly presentational
if (elem->hasLocalName(bTag) || elem->hasLocalName(strongTag))
- return true;
+ return !equalIgnoringCase(property.value()->cssText(), "bold") || !elem->hasChildNodes();
break;
case CSSPropertyVerticalAlign:
- if (elem->hasLocalName(subTag) || elem->hasLocalName(supTag))
- return true;
+ if (elem->hasLocalName(subTag))
+ return !equalIgnoringCase(property.value()->cssText(), "sub") || !elem->hasChildNodes();
+ if (elem->hasLocalName(supTag))
+ return !equalIgnoringCase(property.value()->cssText(), "sup") || !elem->hasChildNodes();
break;
case CSSPropertyFontStyle:
// IE inserts "em" tags for execCommand("italic"), so we remove them, even though they're not strictly presentational
if (elem->hasLocalName(iTag) || elem->hasLocalName(emTag))
- return true;
+ return !equalIgnoringCase(property.value()->cssText(), "italic") || !elem->hasChildNodes();
break;
case CSSPropertyTextDecoration:
case CSSPropertyWebkitTextDecorationsInEffect:
- ASSERT(property.value());
- if (property.value()->isValueList()) {
- CSSValueList* valueList = static_cast<CSSValueList*>(property.value());
- DEFINE_STATIC_LOCAL(RefPtr<CSSPrimitiveValue>, underline, (CSSPrimitiveValue::createIdentifier(CSSValueUnderline)));
- DEFINE_STATIC_LOCAL(RefPtr<CSSPrimitiveValue>, lineThrough, (CSSPrimitiveValue::createIdentifier(CSSValueLineThrough)));
- // Because style is new style to be applied, we delete element only if the element is not used in style.
- if (!valueList->hasValue(underline.get()) && elem->hasLocalName(uTag))
- return true;
- if (!valueList->hasValue(lineThrough.get()) && (elem->hasLocalName(strikeTag) || elem->hasLocalName(sTag)))
- return true;
- } else {
- // If the value is NOT a list, then it must be "none", in which case we should remove all text decorations.
- ASSERT(property.value()->cssText() == "none");
- if (elem->hasLocalName(uTag) || elem->hasLocalName(strikeTag) || elem->hasLocalName(sTag))
- return true;
- }
- break;
+ if (elem->hasLocalName(uTag))
+ return shouldRemoveTextDecorationTag(style, CSSValueUnderline) || !elem->hasChildNodes();
+ else if (elem->hasLocalName(sTag) || elem->hasTagName(strikeTag))
+ return shouldRemoveTextDecorationTag(style,CSSValueLineThrough) || !elem->hasChildNodes();
}
}
return false;
@@ -1303,19 +1313,18 @@ void ApplyStyleCommand::applyTextDecorationStyle(Node *node, CSSMutableStyleDecl
if (!style || style->cssText().isEmpty())
return;
- if (node->isTextNode()) {
- RefPtr<HTMLElement> styleSpan = createStyleSpanElement(document());
- surroundNodeRangeWithElement(node, node, styleSpan.get());
- node = styleSpan.get();
- }
-
- if (!node->isElementNode())
- return;
+ StyleChange styleChange(style, Position(node, 0));
+ if (styleChange.cssStyle().length()) {
+ if (node->isTextNode()) {
+ RefPtr<HTMLElement> styleSpan = createStyleSpanElement(document());
+ surroundNodeRangeWithElement(node, node, styleSpan.get());
+ node = styleSpan.get();
+ }
- HTMLElement *element = static_cast<HTMLElement *>(node);
+ if (!node->isElementNode())
+ return;
- StyleChange styleChange(style, Position(element, 0));
- if (styleChange.cssStyle().length()) {
+ HTMLElement *element = static_cast<HTMLElement *>(node);
String cssText = styleChange.cssStyle();
CSSMutableStyleDeclaration *decl = element->inlineStyleDecl();
if (decl)
@@ -1675,6 +1684,20 @@ void ApplyStyleCommand::surroundNodeRangeWithElement(Node* startNode, Node* endN
break;
node = next;
}
+
+ Node* nextSibling = element->nextSibling();
+ Node* previousSibling = element->previousSibling();
+ if (nextSibling && nextSibling->isElementNode() && nextSibling->isContentEditable()
+ && areIdenticalElements(element.get(), static_cast<Element*>(nextSibling)))
+ mergeIdenticalElements(element, static_cast<Element*>(nextSibling));
+
+ if (previousSibling && previousSibling->isElementNode() && previousSibling->isContentEditable()) {
+ Node* mergedElement = previousSibling->nextSibling();
+ if (mergedElement->isElementNode() && mergedElement->isContentEditable()
+ && areIdenticalElements(static_cast<Element*>(previousSibling), static_cast<Element*>(mergedElement)))
+ mergeIdenticalElements(static_cast<Element*>(previousSibling), static_cast<Element*>(mergedElement));
+ }
+
// FIXME: We should probably call updateStartEnd if the start or end was in the node
// range so that the endingSelection() is canonicalized. See the comments at the end of
// VisibleSelection::validate().
diff --git a/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h b/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h
index 29aa483..2804604 100644
--- a/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h
+++ b/src/3rdparty/webkit/WebCore/editing/ApplyStyleCommand.h
@@ -62,6 +62,7 @@ private:
CSSMutableStyleDeclaration* style() const { return m_style.get(); }
// style-removal helpers
+ bool shouldRemoveTextDecorationTag(CSSStyleDeclaration* styleToApply, int textDecorationAddedByTag) const;
bool implicitlyStyledElementShouldBeRemovedWhenApplyingStyle(HTMLElement*, CSSMutableStyleDeclaration*);
void replaceWithSpanOrRemoveIfWithoutAttributes(HTMLElement*&);
void removeHTMLFontStyle(CSSMutableStyleDeclaration*, HTMLElement*);
diff --git a/src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp b/src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp
index 196a4da..abd0174 100644
--- a/src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/EditorCommand.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
* Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2009 Igalia S.L.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -1096,6 +1097,19 @@ static bool enabledVisibleSelection(Frame* frame, Event* event, EditorCommandSou
return (selection.isCaret() && selection.isContentEditable()) || selection.isRange();
}
+static bool caretBrowsingEnabled(Frame* frame)
+{
+ return frame->settings() && frame->settings()->caretBrowsingEnabled();
+}
+
+static EditorCommandSource dummyEditorCommandSource = static_cast<EditorCommandSource>(0);
+
+static bool enabledVisibleSelectionOrCaretBrowsing(Frame* frame, Event* event, EditorCommandSource)
+{
+ // The EditorCommandSource parameter is unused in enabledVisibleSelection, so just pass a dummy variable
+ return caretBrowsingEnabled(frame) || enabledVisibleSelection(frame, event, dummyEditorCommandSource);
+}
+
static bool enabledVisibleSelectionAndMark(Frame* frame, Event* event, EditorCommandSource)
{
const VisibleSelection& selection = frame->editor()->selectionForCommand(event);
@@ -1140,6 +1154,12 @@ static bool enabledInEditableText(Frame* frame, Event* event, EditorCommandSourc
return frame->editor()->selectionForCommand(event).isContentEditable();
}
+static bool enabledInEditableTextOrCaretBrowsing(Frame* frame, Event* event, EditorCommandSource)
+{
+ // The EditorCommandSource parameter is unused in enabledInEditableText, so just pass a dummy variable
+ return caretBrowsingEnabled(frame) || enabledInEditableText(frame, event, dummyEditorCommandSource);
+}
+
static bool enabledInRichlyEditableText(Frame* frame, Event*, EditorCommandSource)
{
return frame->selection()->isCaretOrRange() && frame->selection()->isContentRichlyEditable();
@@ -1330,20 +1350,20 @@ static const CommandMap& createCommandMap()
{ "MakeTextWritingDirectionRightToLeft", { executeMakeTextWritingDirectionRightToLeft, supportedFromMenuOrKeyBinding, enabledInRichlyEditableText, stateTextWritingDirectionRightToLeft, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveBackward", { executeMoveBackward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveBackwardAndModifySelection", { executeMoveBackwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveDown", { executeMoveDown, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveDownAndModifySelection", { executeMoveDownAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveDown", { executeMoveDown, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveDownAndModifySelection", { executeMoveDownAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveForward", { executeMoveForward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveForwardAndModifySelection", { executeMoveForwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveLeft", { executeMoveLeft, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveLeftAndModifySelection", { executeMoveLeftAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveLeft", { executeMoveLeft, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveLeftAndModifySelection", { executeMoveLeftAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MovePageDown", { executeMovePageDown, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MovePageDownAndModifySelection", { executeMovePageDownAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MovePageUp", { executeMovePageUp, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MovePageUpAndModifySelection", { executeMovePageUpAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveParagraphBackwardAndModifySelection", { executeMoveParagraphBackwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveParagraphForwardAndModifySelection", { executeMoveParagraphForwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveRight", { executeMoveRight, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveRightAndModifySelection", { executeMoveRightAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveParagraphBackwardAndModifySelection", { executeMoveParagraphBackwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveParagraphForwardAndModifySelection", { executeMoveParagraphForwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveRight", { executeMoveRight, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveRightAndModifySelection", { executeMoveRightAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveToBeginningOfDocument", { executeMoveToBeginningOfDocument, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveToBeginningOfDocumentAndModifySelection", { executeMoveToBeginningOfDocumentAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveToBeginningOfLine", { executeMoveToBeginningOfLine, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
@@ -1364,16 +1384,16 @@ static const CommandMap& createCommandMap()
{ "MoveToLeftEndOfLineAndModifySelection", { executeMoveToLeftEndOfLineAndModifySelection, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveToRightEndOfLine", { executeMoveToRightEndOfLine, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveToRightEndOfLineAndModifySelection", { executeMoveToRightEndOfLineAndModifySelection, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveUp", { executeMoveUp, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveUpAndModifySelection", { executeMoveUpAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveUp", { executeMoveUp, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveUpAndModifySelection", { executeMoveUpAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveWordBackward", { executeMoveWordBackward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveWordBackwardAndModifySelection", { executeMoveWordBackwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveWordForward", { executeMoveWordForward, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "MoveWordForwardAndModifySelection", { executeMoveWordForwardAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveWordLeft", { executeMoveWordLeft, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveWordLeftAndModifySelection", { executeMoveWordLeftAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveWordRight", { executeMoveWordRight, supportedFromMenuOrKeyBinding, enabledInEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
- { "MoveWordRightAndModifySelection", { executeMoveWordRightAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelection, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveWordLeft", { executeMoveWordLeft, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveWordLeftAndModifySelection", { executeMoveWordLeftAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveWordRight", { executeMoveWordRight, supportedFromMenuOrKeyBinding, enabledInEditableTextOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
+ { "MoveWordRightAndModifySelection", { executeMoveWordRightAndModifySelection, supportedFromMenuOrKeyBinding, enabledVisibleSelectionOrCaretBrowsing, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "Outdent", { executeOutdent, supported, enabledInRichlyEditableText, stateNone, valueNull, notTextInsertion, doNotAllowExecutionWhenDisabled } },
{ "Paste", { executePaste, supportedPaste, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
{ "PasteAndMatchStyle", { executePasteAndMatchStyle, supportedPaste, enabledPaste, stateNone, valueNull, notTextInsertion, allowExecutionWhenDisabled } },
diff --git a/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp b/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp
index 308ba74..84fa147 100644
--- a/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.cpp
@@ -33,7 +33,6 @@
#include "InsertLineBreakCommand.h"
#include "InsertListCommand.h"
#include "Range.h"
-#include "DocumentFragment.h"
#include "SplitElementCommand.h"
#include "TextIterator.h"
#include "htmlediting.h"
@@ -68,6 +67,37 @@ IndentOutdentCommand::IndentOutdentCommand(Document* document, EIndentType typeO
{
}
+// This function is a workaround for moveParagraph's tendency to strip blockquotes. It updates lastBlockquote to point to the
+// correct level for the current paragraph, and returns a pointer to a placeholder br where the insertion should be performed.
+PassRefPtr<Element> IndentOutdentCommand::prepareBlockquoteLevelForInsertion(const VisiblePosition& currentParagraph, RefPtr<Element>& lastBlockquote)
+{
+ int currentBlockquoteLevel = 0;
+ int lastBlockquoteLevel = 0;
+ Node* node = currentParagraph.deepEquivalent().node();
+ while ((node = enclosingNodeWithTag(Position(node->parentNode(), 0), blockquoteTag)))
+ currentBlockquoteLevel++;
+ node = lastBlockquote.get();
+ while ((node = enclosingNodeWithTag(Position(node->parentNode(), 0), blockquoteTag)))
+ lastBlockquoteLevel++;
+ while (currentBlockquoteLevel > lastBlockquoteLevel) {
+ RefPtr<Element> newBlockquote = createIndentBlockquoteElement(document());
+ appendNode(newBlockquote, lastBlockquote);
+ lastBlockquote = newBlockquote;
+ lastBlockquoteLevel++;
+ }
+ while (currentBlockquoteLevel < lastBlockquoteLevel) {
+ lastBlockquote = static_cast<Element*>(enclosingNodeWithTag(Position(lastBlockquote->parentNode(), 0), blockquoteTag));
+ lastBlockquoteLevel--;
+ }
+ RefPtr<Element> placeholder = createBreakElement(document());
+ appendNode(placeholder, lastBlockquote);
+ // Add another br before the placeholder if it collapsed.
+ VisiblePosition visiblePos(Position(placeholder.get(), 0));
+ if (!isStartOfParagraph(visiblePos))
+ insertNodeBefore(createBreakElement(document()), placeholder);
+ return placeholder.release();
+}
+
bool IndentOutdentCommand::tryIndentingAsListItem(const VisiblePosition& endOfCurrentParagraph)
{
// If our selection is not inside a list, bail out.
@@ -81,14 +111,19 @@ bool IndentOutdentCommand::tryIndentingAsListItem(const VisiblePosition& endOfCu
// FIXME: we need to deal with the case where there is no li (malformed HTML)
if (!selectedListItem->hasTagName(liTag))
return false;
-
+
// FIXME: previousElementSibling does not ignore non-rendered content like <span></span>. Should we?
Element* previousList = selectedListItem->previousElementSibling();
Element* nextList = selectedListItem->nextElementSibling();
RefPtr<Element> newList = document()->createElement(listNode->tagQName(), false);
+ RefPtr<Element> newListItem = selectedListItem->cloneElementWithoutChildren();
+ RefPtr<Element> placeholder = createBreakElement(document());
insertNodeBefore(newList, selectedListItem);
- appendParagraphIntoNode(visiblePositionBeforeNode(selectedListItem), visiblePositionAfterNode(selectedListItem), newList.get());
+ appendNode(newListItem, newList);
+ appendNode(placeholder, newListItem);
+
+ moveParagraph(startOfParagraph(endOfCurrentParagraph), endOfCurrentParagraph, VisiblePosition(Position(placeholder, 0)), true);
if (canMergeLists(previousList, newList.get()))
mergeIdenticalElements(previousList, newList);
@@ -98,79 +133,29 @@ bool IndentOutdentCommand::tryIndentingAsListItem(const VisiblePosition& endOfCu
return true;
}
-void IndentOutdentCommand::indentIntoBlockquote(const VisiblePosition& startOfCurrentParagraph, const VisiblePosition& endOfCurrentParagraph, RefPtr<Element>& targetBlockquote, Node* nodeToSplitTo)
+void IndentOutdentCommand::indentIntoBlockquote(const VisiblePosition& endOfCurrentParagraph, const VisiblePosition& endOfNextParagraph, RefPtr<Element>& targetBlockquote)
{
Node* enclosingCell = 0;
if (!targetBlockquote) {
- // Create a new blockquote and insert it as a child of the enclosing block element. We accomplish
+ // Create a new blockquote and insert it as a child of the root editable element. We accomplish
// this by splitting all parents of the current paragraph up to that point.
targetBlockquote = createIndentBlockquoteElement(document());
- if (isTableCell(nodeToSplitTo))
- enclosingCell = nodeToSplitTo;
- RefPtr<Node> startOfNewBlock = splitTreeToNode(startOfCurrentParagraph.deepEquivalent().node(), nodeToSplitTo);
+ Position start = startOfParagraph(endOfCurrentParagraph).deepEquivalent();
+ enclosingCell = enclosingNodeOfType(start, &isTableCell);
+ Node* nodeToSplitTo = enclosingCell ? enclosingCell : editableRootForPosition(start);
+ RefPtr<Node> startOfNewBlock = splitTreeToNode(start.node(), nodeToSplitTo);
insertNodeBefore(targetBlockquote, startOfNewBlock);
}
- VisiblePosition endOfNextParagraph = endOfParagraph(endOfCurrentParagraph.next());
- appendParagraphIntoNode(startOfCurrentParagraph, endOfCurrentParagraph, targetBlockquote.get());
+ RefPtr<Element> insertionPoint = prepareBlockquoteLevelForInsertion(endOfCurrentParagraph, targetBlockquote);
// Don't put the next paragraph in the blockquote we just created for this paragraph unless
// the next paragraph is in the same cell.
if (enclosingCell && enclosingCell != enclosingNodeOfType(endOfNextParagraph.deepEquivalent(), &isTableCell))
targetBlockquote = 0;
-}
-
-// Enclose all nodes between start and end by newParent, which is a sibling node of nodes between start and end
-// FIXME: moveParagraph is overly complicated. We need to clean up moveParagraph so that it uses appendParagraphIntoNode
-// or prepare more specialized functions and delete moveParagraph
-void IndentOutdentCommand::appendParagraphIntoNode(const VisiblePosition& start, const VisiblePosition& end, Node* newParent)
-{
- ASSERT(newParent);
- ASSERT(newParent->isContentEditable());
- ASSERT(isStartOfParagraph(start) && isEndOfParagraph(end));
-
- Position endOfParagraph = end.deepEquivalent().downstream();
- Node* insertionPoint = newParent->lastChild();// Remember the place to put br later
- // Look for the beginning of the last paragraph in newParent
- Node* startOfLastParagraph = startOfParagraph(Position(newParent, newParent->childNodeCount())).deepEquivalent().node();
- if (startOfLastParagraph && !startOfLastParagraph->isDescendantOf(newParent))
- startOfLastParagraph = 0;
-
- // Extend the range so that we can append wrapping nodes as well if they're containd within the paragraph
- ExceptionCode ec = 0;
- RefPtr<Range> selectedRange = createRange(document(), start, end, ec);
- RefPtr<Range> extendedRange = extendRangeToWrappingNodes(selectedRange, selectedRange.get(), newParent->parentNode());
- newParent->appendChild(extendedRange->extractContents(ec), ec);
-
- // If the start of paragraph didn't change by appending nodes, we should insert br to seperate the paragraphs.
- Node* startOfNewParagraph = startOfParagraph(Position(newParent, newParent->childNodeCount())).deepEquivalent().node();
- if (startOfNewParagraph == startOfLastParagraph) {
- if (insertionPoint)
- newParent->insertBefore(createBreakElement(document()), insertionPoint->nextSibling(), ec);
- else
- newParent->appendChild(createBreakElement(document()), ec);
- }
-
- // Remove unnecessary br from the place where we moved the paragraph from
- removeUnnecessaryLineBreakAt(endOfParagraph);
-}
-
-void IndentOutdentCommand::removeUnnecessaryLineBreakAt(const Position& endOfParagraph)
-{
- // If there is something in this paragraph, then don't remove br.
- if (!isStartOfParagraph(endOfParagraph) || !isEndOfParagraph(endOfParagraph))
- return;
-
- // We only care about br at the end of paragraph
- Node* br = endOfParagraph.node();
- Node* parentNode = br->parentNode();
-
- // If the node isn't br or the parent node is empty, then don't remove.
- if (!br->hasTagName(brTag) || isVisiblyAdjacent(positionInParentBeforeNode(parentNode), positionInParentAfterNode(parentNode)))
- return;
- removeNodeAndPruneAncestors(br);
+ moveParagraph(startOfParagraph(endOfCurrentParagraph), endOfCurrentParagraph, VisiblePosition(Position(insertionPoint, 0)), true);
}
void IndentOutdentCommand::indentRegion()
@@ -178,7 +163,8 @@ void IndentOutdentCommand::indentRegion()
VisibleSelection selection = selectionForParagraphIteration(endingSelection());
VisiblePosition startOfSelection = selection.visibleStart();
VisiblePosition endOfSelection = selection.visibleEnd();
- RefPtr<Range> selectedRange = selection.firstRange();
+ int startIndex = indexForVisiblePosition(startOfSelection);
+ int endIndex = indexForVisiblePosition(endOfSelection);
ASSERT(!startOfSelection.isNull());
ASSERT(!endOfSelection.isNull());
@@ -203,24 +189,10 @@ void IndentOutdentCommand::indentRegion()
VisiblePosition endOfNextParagraph = endOfParagraph(endOfCurrentParagraph.next());
if (tryIndentingAsListItem(endOfCurrentParagraph))
blockquoteForNextIndent = 0;
- else {
- VisiblePosition startOfCurrentParagraph = startOfParagraph(endOfCurrentParagraph);
- Node* blockNode = enclosingBlock(endOfCurrentParagraph.deepEquivalent().node()->parentNode());
- // extend the region so that it contains all the ancestor blocks within the selection
- ExceptionCode ec;
- Element* unsplittableNode = unsplittableElementForPosition(endOfCurrentParagraph.deepEquivalent());
- RefPtr<Range> originalRange = createRange(document(), endOfCurrentParagraph, endOfCurrentParagraph, ec);
- RefPtr<Range> extendedRange = extendRangeToWrappingNodes(originalRange, selectedRange.get(), unsplittableNode);
- if (originalRange != extendedRange) {
- ExceptionCode ec = 0;
- endOfCurrentParagraph = endOfParagraph(extendedRange->endPosition().previous());
- blockNode = enclosingBlock(extendedRange->commonAncestorContainer(ec));
- }
-
- endOfNextParagraph = endOfParagraph(endOfCurrentParagraph.next());
- indentIntoBlockquote(startOfCurrentParagraph, endOfCurrentParagraph, blockquoteForNextIndent, blockNode);
- // blockquoteForNextIndent will be updated in the function
- }
+ else
+ indentIntoBlockquote(endOfCurrentParagraph, endOfNextParagraph, blockquoteForNextIndent);
+ // blockquoteForNextIndent maybe updated
+ // this is due to the way prepareBlockquoteLevelForInsertion was designed.
// Sanity check: Make sure our moveParagraph calls didn't remove endOfNextParagraph.deepEquivalent().node()
// If somehow we did, return to prevent crashes.
if (endOfNextParagraph.isNotNull() && !endOfNextParagraph.deepEquivalent().node()->inDocument()) {
@@ -229,7 +201,13 @@ void IndentOutdentCommand::indentRegion()
}
endOfCurrentParagraph = endOfNextParagraph;
}
-
+
+ updateLayout();
+
+ RefPtr<Range> startRange = TextIterator::rangeFromLocationAndLength(document()->documentElement(), startIndex, 0, true);
+ RefPtr<Range> endRange = TextIterator::rangeFromLocationAndLength(document()->documentElement(), endIndex, 0, true);
+ if (startRange && endRange)
+ setEndingSelection(VisibleSelection(startRange->startPosition(), endRange->startPosition(), DOWNSTREAM));
}
void IndentOutdentCommand::outdentParagraph()
diff --git a/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h b/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h
index d83128e..419f832f 100644
--- a/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h
+++ b/src/3rdparty/webkit/WebCore/editing/IndentOutdentCommand.h
@@ -46,14 +46,12 @@ private:
virtual void doApply();
virtual EditAction editingAction() const { return m_typeOfAction == Indent ? EditActionIndent : EditActionOutdent; }
- void appendParagraphIntoNode(const VisiblePosition& start, const VisiblePosition& end, Node* newParent);
- void removeUnnecessaryLineBreakAt(const Position& endOfParagraph);
-
void indentRegion();
void outdentRegion();
void outdentParagraph();
+ PassRefPtr<Element> prepareBlockquoteLevelForInsertion(const VisiblePosition&, RefPtr<Element>&);
bool tryIndentingAsListItem(const VisiblePosition&);
- void indentIntoBlockquote(const VisiblePosition&, const VisiblePosition&, RefPtr<Element>& targetBlockquote, Node* nodeToSplitTo);
+ void indentIntoBlockquote(const VisiblePosition&, const VisiblePosition&, RefPtr<Element>&);
EIndentType m_typeOfAction;
int m_marginInPixels;
diff --git a/src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp b/src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp
index a3a43b3..b40dab2 100644
--- a/src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/ReplaceSelectionCommand.cpp
@@ -695,8 +695,17 @@ void ReplaceSelectionCommand::mergeEndIfNeeded()
VisiblePosition destination = mergeForward ? endOfInsertedContent.next() : endOfInsertedContent;
VisiblePosition startOfParagraphToMove = mergeForward ? startOfParagraph(endOfInsertedContent) : endOfInsertedContent.next();
+
+ // Merging forward could result in deleting the destination anchor node.
+ // To avoid this, we add a placeholder node before the start of the paragraph.
+ if (endOfParagraph(startOfParagraphToMove) == destination) {
+ RefPtr<Node> placeholder = createBreakElement(document());
+ insertNodeBefore(placeholder, startOfParagraphToMove.deepEquivalent().node());
+ destination = VisiblePosition(Position(placeholder.get(), 0));
+ }
moveParagraph(startOfParagraphToMove, endOfParagraph(startOfParagraphToMove), destination);
+
// Merging forward will remove m_lastLeafInserted from the document.
// FIXME: Maintain positions for the start and end of inserted content instead of keeping nodes. The nodes are
// only ever used to create positions where inserted content starts/ends. Also, we sometimes insert content
@@ -705,6 +714,10 @@ void ReplaceSelectionCommand::mergeEndIfNeeded()
m_lastLeafInserted = destination.previous().deepEquivalent().node();
if (!m_firstNodeInserted->inDocument())
m_firstNodeInserted = endingSelection().visibleStart().deepEquivalent().node();
+ // If we merged text nodes, m_lastLeafInserted could be null. If this is the case,
+ // we use m_firstNodeInserted.
+ if (!m_lastLeafInserted)
+ m_lastLeafInserted = m_firstNodeInserted;
}
}
diff --git a/src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp b/src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp
index 8adfd71..206de86 100644
--- a/src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/VisibleSelection.cpp
@@ -237,7 +237,7 @@ void VisibleSelection::appendTrailingWhitespace()
for (; charIt.length(); charIt.advance(1)) {
UChar c = charIt.characters()[0];
- if (!isSpaceOrNewline(c) && c != noBreakSpace)
+ if (!isSpaceOrNewline(c) && c != noBreakSpace || c == '\n')
break;
m_end = charIt.range()->endPosition();
}
diff --git a/src/3rdparty/webkit/WebCore/editing/markup.cpp b/src/3rdparty/webkit/WebCore/editing/markup.cpp
index 43e7c92..47714e7 100644
--- a/src/3rdparty/webkit/WebCore/editing/markup.cpp
+++ b/src/3rdparty/webkit/WebCore/editing/markup.cpp
@@ -983,8 +983,16 @@ String createMarkup(const Range* range, Vector<Node*>* nodes, EAnnotateForInterc
if (!fullySelectedRootStyle->getPropertyCSSValue(CSSPropertyBackgroundImage) && static_cast<Element*>(fullySelectedRoot)->hasAttribute(backgroundAttr))
fullySelectedRootStyle->setProperty(CSSPropertyBackgroundImage, "url('" + static_cast<Element*>(fullySelectedRoot)->getAttribute(backgroundAttr) + "')");
- if (fullySelectedRootStyle->length())
+ if (fullySelectedRootStyle->length()) {
+ // Reset the CSS properties to avoid an assertion error in addStyleMarkup().
+ // This assertion is caused at least when we select all text of a <body> element whose
+ // 'text-decoration' property is "inherit", and copy it.
+ if (!propertyMissingOrEqualToNone(fullySelectedRootStyle.get(), CSSPropertyTextDecoration))
+ fullySelectedRootStyle->setProperty(CSSPropertyTextDecoration, CSSValueNone);
+ if (!propertyMissingOrEqualToNone(fullySelectedRootStyle.get(), CSSPropertyWebkitTextDecorationsInEffect))
+ fullySelectedRootStyle->setProperty(CSSPropertyWebkitTextDecorationsInEffect, CSSValueNone);
addStyleMarkup(preMarkups, markups, fullySelectedRootStyle.get(), document, true);
+ }
} else {
// Since this node and all the other ancestors are not in the selection we want to set RangeFullySelectsNode to DoesNotFullySelectNode
// so that styles that affect the exterior of the node are not included.
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp b/src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp
index 6428e64..335562e 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/CSSGrammar.cpp
@@ -554,9 +554,9 @@ union yyalloc
#endif
/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 28
+#define YYFINAL 24
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 1329
+#define YYLAST 1275
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 86
@@ -565,7 +565,7 @@ union yyalloc
/* YYNRULES -- Number of rules. */
#define YYNRULES 268
/* YYNRULES -- Number of states. */
-#define YYNSTATES 515
+#define YYNSTATES 516
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
@@ -617,130 +617,130 @@ static const yytype_uint8 yytranslate[] =
YYRHS. */
static const yytype_uint16 yyprhs[] =
{
- 0, 0, 3, 10, 13, 16, 19, 22, 25, 28,
- 31, 33, 35, 42, 49, 55, 61, 67, 73, 79,
- 80, 83, 84, 87, 90, 91, 93, 95, 97, 103,
- 107, 111, 112, 116, 118, 119, 123, 124, 128, 129,
- 133, 135, 137, 139, 141, 143, 145, 147, 149, 151,
- 152, 156, 158, 160, 162, 164, 166, 168, 170, 172,
- 174, 181, 188, 192, 196, 204, 212, 213, 217, 219,
- 222, 224, 228, 230, 233, 237, 242, 246, 252, 257,
- 262, 269, 274, 282, 285, 291, 295, 300, 303, 310,
- 314, 318, 319, 322, 324, 326, 329, 330, 335, 343,
- 345, 351, 352, 356, 357, 359, 361, 363, 368, 369,
- 371, 373, 378, 381, 389, 396, 399, 408, 410, 412,
- 413, 417, 424, 426, 432, 434, 436, 440, 444, 452,
- 456, 460, 463, 466, 469, 471, 473, 479, 481, 486,
- 489, 492, 494, 496, 499, 503, 506, 508, 511, 514,
- 516, 519, 521, 524, 528, 531, 533, 535, 537, 540,
- 543, 545, 547, 549, 551, 553, 556, 559, 564, 573,
- 579, 589, 591, 593, 595, 597, 599, 601, 603, 605,
- 608, 612, 617, 622, 627, 634, 636, 639, 641, 645,
- 647, 650, 653, 657, 662, 666, 672, 677, 682, 689,
- 695, 698, 701, 708, 715, 718, 722, 727, 730, 733,
- 736, 737, 739, 743, 746, 749, 752, 753, 755, 758,
- 761, 764, 767, 771, 774, 777, 779, 782, 784, 787,
- 790, 793, 796, 799, 802, 805, 808, 811, 814, 817,
- 820, 823, 826, 829, 832, 835, 838, 841, 844, 847,
- 850, 853, 855, 861, 865, 868, 871, 873, 876, 880,
- 884, 887, 891, 893, 895, 898, 904, 908, 910
+ 0, 0, 3, 11, 14, 17, 20, 23, 26, 29,
+ 32, 34, 36, 43, 50, 56, 62, 68, 74, 80,
+ 81, 84, 85, 88, 91, 92, 94, 96, 98, 104,
+ 108, 112, 113, 117, 119, 120, 124, 125, 129, 130,
+ 134, 136, 138, 140, 142, 144, 146, 148, 150, 152,
+ 153, 157, 159, 161, 163, 165, 167, 169, 171, 173,
+ 175, 182, 189, 193, 197, 205, 213, 214, 218, 220,
+ 223, 225, 229, 231, 234, 238, 243, 247, 253, 258,
+ 263, 270, 275, 283, 286, 292, 296, 301, 304, 311,
+ 315, 319, 320, 323, 325, 327, 330, 331, 336, 344,
+ 346, 352, 353, 357, 358, 360, 362, 364, 369, 370,
+ 372, 374, 379, 382, 390, 397, 400, 409, 411, 413,
+ 414, 418, 425, 427, 433, 435, 437, 441, 445, 453,
+ 457, 461, 464, 467, 470, 472, 474, 480, 482, 487,
+ 490, 493, 495, 497, 500, 504, 507, 509, 512, 515,
+ 517, 520, 522, 525, 529, 532, 534, 536, 538, 541,
+ 544, 546, 548, 550, 552, 554, 557, 560, 565, 574,
+ 580, 590, 592, 594, 596, 598, 600, 602, 604, 606,
+ 609, 613, 618, 623, 628, 635, 637, 640, 642, 646,
+ 648, 651, 654, 658, 663, 667, 673, 678, 683, 690,
+ 696, 699, 702, 709, 716, 719, 723, 728, 731, 734,
+ 737, 738, 740, 744, 747, 750, 753, 754, 756, 759,
+ 762, 765, 768, 772, 775, 778, 780, 783, 785, 788,
+ 791, 794, 797, 800, 803, 806, 809, 812, 815, 818,
+ 821, 824, 827, 830, 833, 836, 839, 842, 845, 848,
+ 851, 854, 856, 862, 866, 869, 872, 874, 877, 881,
+ 885, 888, 892, 894, 896, 899, 905, 909, 911
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const yytype_int16 yyrhs[] =
{
- 87, 0, -1, 98, 97, 101, 102, 103, 104, -1,
- 89, 96, -1, 91, 96, -1, 93, 96, -1, 94,
- 96, -1, 95, 96, -1, 92, 96, -1, 90, 96,
- -1, 105, -1, 110, -1, 28, 71, 96, 88, 96,
- 72, -1, 30, 71, 96, 134, 96, 72, -1, 29,
- 71, 96, 156, 72, -1, 38, 71, 96, 113, 72,
- -1, 32, 71, 96, 161, 72, -1, 33, 5, 96,
- 126, 72, -1, 34, 71, 96, 142, 72, -1, -1,
- 96, 5, -1, -1, 97, 6, -1, 97, 5, -1,
- -1, 100, -1, 72, -1, 0, -1, 26, 96, 12,
- 96, 73, -1, 26, 1, 174, -1, 26, 1, 73,
- -1, -1, 101, 110, 97, -1, 170, -1, -1, 102,
- 111, 97, -1, -1, 103, 117, 97, -1, -1, 104,
- 106, 97, -1, 141, -1, 129, -1, 137, -1, 138,
- -1, 131, -1, 105, -1, 173, -1, 169, -1, 171,
- -1, -1, 107, 109, 97, -1, 141, -1, 137, -1,
- 138, -1, 131, -1, 108, -1, 173, -1, 169, -1,
- 171, -1, 172, -1, 22, 96, 119, 96, 127, 73,
- -1, 22, 96, 119, 96, 127, 174, -1, 22, 1,
- 73, -1, 22, 1, 174, -1, 35, 96, 127, 71,
- 96, 113, 72, -1, 36, 96, 112, 71, 96, 113,
- 72, -1, -1, 37, 5, 128, -1, 115, -1, 114,
- 115, -1, 114, -1, 1, 175, 1, -1, 1, -1,
- 114, 1, -1, 115, 73, 96, -1, 115, 175, 73,
- 96, -1, 1, 73, 96, -1, 1, 175, 1, 73,
- 96, -1, 114, 115, 73, 96, -1, 114, 1, 73,
- 96, -1, 114, 1, 175, 1, 73, 96, -1, 116,
- 17, 96, 161, -1, 116, 96, 71, 96, 156, 72,
- 96, -1, 116, 1, -1, 116, 17, 96, 1, 161,
- -1, 116, 17, 96, -1, 116, 17, 96, 1, -1,
- 13, 96, -1, 27, 96, 118, 119, 96, 73, -1,
- 27, 1, 174, -1, 27, 1, 73, -1, -1, 13,
- 5, -1, 12, -1, 66, -1, 13, 96, -1, -1,
- 17, 96, 161, 96, -1, 74, 96, 120, 96, 121,
- 75, 96, -1, 122, -1, 123, 96, 43, 96, 122,
- -1, -1, 43, 96, 123, -1, -1, 41, -1, 42,
- -1, 123, -1, 125, 96, 130, 124, -1, -1, 128,
- -1, 126, -1, 128, 76, 96, 126, -1, 128, 1,
- -1, 24, 96, 128, 71, 96, 107, 168, -1, 24,
- 96, 71, 96, 107, 168, -1, 13, 96, -1, 31,
- 96, 132, 96, 71, 96, 133, 72, -1, 13, -1,
- 12, -1, -1, 133, 134, 96, -1, 135, 96, 71,
- 96, 156, 72, -1, 136, -1, 135, 96, 76, 96,
- 136, -1, 63, -1, 13, -1, 23, 1, 174, -1,
- 23, 1, 73, -1, 25, 96, 71, 96, 156, 72,
- 96, -1, 25, 1, 174, -1, 25, 1, 73, -1,
- 77, 96, -1, 78, 96, -1, 79, 96, -1, 80,
- -1, 77, -1, 142, 71, 96, 156, 99, -1, 144,
- -1, 142, 76, 96, 144, -1, 142, 1, -1, 144,
- 5, -1, 146, -1, 143, -1, 143, 146, -1, 144,
- 139, 146, -1, 144, 1, -1, 21, -1, 20, 21,
- -1, 13, 21, -1, 147, -1, 147, 148, -1, 148,
- -1, 145, 147, -1, 145, 147, 148, -1, 145, 148,
- -1, 13, -1, 20, -1, 149, -1, 148, 149, -1,
- 148, 1, -1, 16, -1, 15, -1, 150, -1, 152,
- -1, 155, -1, 18, 13, -1, 13, 96, -1, 19,
- 96, 151, 81, -1, 19, 96, 151, 153, 96, 154,
- 96, 81, -1, 19, 96, 145, 151, 81, -1, 19,
- 96, 145, 151, 153, 96, 154, 96, 81, -1, 82,
- -1, 7, -1, 8, -1, 9, -1, 10, -1, 11,
- -1, 13, -1, 12, -1, 17, 13, -1, 17, 17,
- 13, -1, 17, 67, 14, 75, -1, 17, 67, 65,
- 75, -1, 17, 67, 13, 75, -1, 17, 68, 96,
- 146, 96, 75, -1, 158, -1, 157, 158, -1, 157,
- -1, 1, 175, 1, -1, 1, -1, 157, 1, -1,
- 157, 175, -1, 158, 73, 96, -1, 158, 175, 73,
- 96, -1, 1, 73, 96, -1, 1, 175, 1, 73,
- 96, -1, 157, 158, 73, 96, -1, 157, 1, 73,
- 96, -1, 157, 1, 175, 1, 73, 96, -1, 159,
- 17, 96, 161, 160, -1, 165, 96, -1, 159, 1,
- -1, 159, 17, 96, 1, 161, 160, -1, 159, 17,
- 96, 161, 160, 1, -1, 40, 96, -1, 159, 17,
- 96, -1, 159, 17, 96, 1, -1, 159, 174, -1,
- 13, 96, -1, 40, 96, -1, -1, 163, -1, 161,
- 162, 163, -1, 161, 1, -1, 83, 96, -1, 76,
- 96, -1, -1, 164, -1, 140, 164, -1, 12, 96,
- -1, 13, 96, -1, 62, 96, -1, 140, 62, 96,
- -1, 66, 96, -1, 69, 96, -1, 167, -1, 84,
- 96, -1, 166, -1, 165, 96, -1, 85, 96, -1,
- 65, 96, -1, 64, 96, -1, 63, 96, -1, 48,
- 96, -1, 49, 96, -1, 50, 96, -1, 51, 96,
- -1, 52, 96, -1, 53, 96, -1, 54, 96, -1,
- 55, 96, -1, 56, 96, -1, 57, 96, -1, 58,
- 96, -1, 59, 96, -1, 60, 96, -1, 61, 96,
- -1, 46, 96, -1, 45, 96, -1, 47, 96, -1,
- 44, 96, -1, 70, -1, 67, 96, 161, 75, 96,
- -1, 67, 96, 1, -1, 15, 96, -1, 16, 96,
- -1, 99, -1, 1, 99, -1, 39, 1, 174, -1,
- 39, 1, 73, -1, 169, 97, -1, 170, 169, 97,
- -1, 110, -1, 129, -1, 1, 174, -1, 71, 1,
- 175, 1, 99, -1, 71, 1, 99, -1, 174, -1,
- 175, 1, 174, -1
+ 87, 0, -1, 96, 98, 97, 101, 102, 103, 104,
+ -1, 89, 96, -1, 91, 96, -1, 93, 96, -1,
+ 94, 96, -1, 95, 96, -1, 92, 96, -1, 90,
+ 96, -1, 105, -1, 110, -1, 28, 71, 96, 88,
+ 96, 72, -1, 30, 71, 96, 134, 96, 72, -1,
+ 29, 71, 96, 156, 72, -1, 38, 71, 96, 113,
+ 72, -1, 32, 71, 96, 161, 72, -1, 33, 5,
+ 96, 126, 72, -1, 34, 71, 96, 142, 72, -1,
+ -1, 96, 5, -1, -1, 97, 6, -1, 97, 5,
+ -1, -1, 100, -1, 72, -1, 0, -1, 26, 96,
+ 12, 96, 73, -1, 26, 1, 174, -1, 26, 1,
+ 73, -1, -1, 101, 110, 97, -1, 170, -1, -1,
+ 102, 111, 97, -1, -1, 103, 117, 97, -1, -1,
+ 104, 106, 97, -1, 141, -1, 129, -1, 137, -1,
+ 138, -1, 131, -1, 105, -1, 173, -1, 169, -1,
+ 171, -1, -1, 107, 109, 97, -1, 141, -1, 137,
+ -1, 138, -1, 131, -1, 108, -1, 173, -1, 169,
+ -1, 171, -1, 172, -1, 22, 96, 119, 96, 127,
+ 73, -1, 22, 96, 119, 96, 127, 174, -1, 22,
+ 1, 73, -1, 22, 1, 174, -1, 35, 96, 127,
+ 71, 96, 113, 72, -1, 36, 96, 112, 71, 96,
+ 113, 72, -1, -1, 37, 5, 128, -1, 115, -1,
+ 114, 115, -1, 114, -1, 1, 175, 1, -1, 1,
+ -1, 114, 1, -1, 115, 73, 96, -1, 115, 175,
+ 73, 96, -1, 1, 73, 96, -1, 1, 175, 1,
+ 73, 96, -1, 114, 115, 73, 96, -1, 114, 1,
+ 73, 96, -1, 114, 1, 175, 1, 73, 96, -1,
+ 116, 17, 96, 161, -1, 116, 96, 71, 96, 156,
+ 72, 96, -1, 116, 1, -1, 116, 17, 96, 1,
+ 161, -1, 116, 17, 96, -1, 116, 17, 96, 1,
+ -1, 13, 96, -1, 27, 96, 118, 119, 96, 73,
+ -1, 27, 1, 174, -1, 27, 1, 73, -1, -1,
+ 13, 5, -1, 12, -1, 66, -1, 13, 96, -1,
+ -1, 17, 96, 161, 96, -1, 74, 96, 120, 96,
+ 121, 75, 96, -1, 122, -1, 123, 96, 43, 96,
+ 122, -1, -1, 43, 96, 123, -1, -1, 41, -1,
+ 42, -1, 123, -1, 125, 96, 130, 124, -1, -1,
+ 128, -1, 126, -1, 128, 76, 96, 126, -1, 128,
+ 1, -1, 24, 96, 128, 71, 96, 107, 168, -1,
+ 24, 96, 71, 96, 107, 168, -1, 13, 96, -1,
+ 31, 96, 132, 96, 71, 96, 133, 72, -1, 13,
+ -1, 12, -1, -1, 133, 134, 96, -1, 135, 96,
+ 71, 96, 156, 72, -1, 136, -1, 135, 96, 76,
+ 96, 136, -1, 63, -1, 13, -1, 23, 1, 174,
+ -1, 23, 1, 73, -1, 25, 96, 71, 96, 156,
+ 72, 96, -1, 25, 1, 174, -1, 25, 1, 73,
+ -1, 77, 96, -1, 78, 96, -1, 79, 96, -1,
+ 80, -1, 77, -1, 142, 71, 96, 156, 99, -1,
+ 144, -1, 142, 76, 96, 144, -1, 142, 1, -1,
+ 144, 5, -1, 146, -1, 143, -1, 143, 146, -1,
+ 144, 139, 146, -1, 144, 1, -1, 21, -1, 20,
+ 21, -1, 13, 21, -1, 147, -1, 147, 148, -1,
+ 148, -1, 145, 147, -1, 145, 147, 148, -1, 145,
+ 148, -1, 13, -1, 20, -1, 149, -1, 148, 149,
+ -1, 148, 1, -1, 16, -1, 15, -1, 150, -1,
+ 152, -1, 155, -1, 18, 13, -1, 13, 96, -1,
+ 19, 96, 151, 81, -1, 19, 96, 151, 153, 96,
+ 154, 96, 81, -1, 19, 96, 145, 151, 81, -1,
+ 19, 96, 145, 151, 153, 96, 154, 96, 81, -1,
+ 82, -1, 7, -1, 8, -1, 9, -1, 10, -1,
+ 11, -1, 13, -1, 12, -1, 17, 13, -1, 17,
+ 17, 13, -1, 17, 67, 14, 75, -1, 17, 67,
+ 65, 75, -1, 17, 67, 13, 75, -1, 17, 68,
+ 96, 146, 96, 75, -1, 158, -1, 157, 158, -1,
+ 157, -1, 1, 175, 1, -1, 1, -1, 157, 1,
+ -1, 157, 175, -1, 158, 73, 96, -1, 158, 175,
+ 73, 96, -1, 1, 73, 96, -1, 1, 175, 1,
+ 73, 96, -1, 157, 158, 73, 96, -1, 157, 1,
+ 73, 96, -1, 157, 1, 175, 1, 73, 96, -1,
+ 159, 17, 96, 161, 160, -1, 165, 96, -1, 159,
+ 1, -1, 159, 17, 96, 1, 161, 160, -1, 159,
+ 17, 96, 161, 160, 1, -1, 40, 96, -1, 159,
+ 17, 96, -1, 159, 17, 96, 1, -1, 159, 174,
+ -1, 13, 96, -1, 40, 96, -1, -1, 163, -1,
+ 161, 162, 163, -1, 161, 1, -1, 83, 96, -1,
+ 76, 96, -1, -1, 164, -1, 140, 164, -1, 12,
+ 96, -1, 13, 96, -1, 62, 96, -1, 140, 62,
+ 96, -1, 66, 96, -1, 69, 96, -1, 167, -1,
+ 84, 96, -1, 166, -1, 165, 96, -1, 85, 96,
+ -1, 65, 96, -1, 64, 96, -1, 63, 96, -1,
+ 48, 96, -1, 49, 96, -1, 50, 96, -1, 51,
+ 96, -1, 52, 96, -1, 53, 96, -1, 54, 96,
+ -1, 55, 96, -1, 56, 96, -1, 57, 96, -1,
+ 58, 96, -1, 59, 96, -1, 60, 96, -1, 61,
+ 96, -1, 46, 96, -1, 45, 96, -1, 47, 96,
+ -1, 44, 96, -1, 70, -1, 67, 96, 161, 75,
+ 96, -1, 67, 96, 1, -1, 15, 96, -1, 16,
+ 96, -1, 99, -1, 1, 99, -1, 39, 1, 174,
+ -1, 39, 1, 73, -1, 169, 97, -1, 170, 169,
+ 97, -1, 110, -1, 129, -1, 1, 174, -1, 71,
+ 1, 175, 1, 99, -1, 71, 1, 99, -1, 174,
+ -1, 175, 1, 174, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
@@ -873,7 +873,7 @@ static const yytype_uint8 yyr1[] =
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
static const yytype_uint8 yyr2[] =
{
- 0, 2, 6, 2, 2, 2, 2, 2, 2, 2,
+ 0, 2, 7, 2, 2, 2, 2, 2, 2, 2,
1, 1, 6, 6, 5, 5, 5, 5, 5, 0,
2, 0, 2, 2, 0, 1, 1, 1, 5, 3,
3, 0, 3, 1, 0, 3, 0, 3, 0, 3,
@@ -907,145 +907,145 @@ static const yytype_uint8 yyr2[] =
means the default is an error. */
static const yytype_uint16 yydefact[] =
{
- 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 21, 25, 0,
- 0, 19, 19, 19, 19, 19, 19, 19, 1, 3,
- 9, 4, 8, 5, 6, 7, 31, 0, 30, 29,
- 20, 19, 0, 0, 0, 0, 103, 0, 0, 23,
- 22, 0, 34, 21, 33, 0, 0, 155, 161, 160,
- 0, 0, 19, 156, 146, 0, 0, 19, 0, 19,
- 19, 10, 11, 41, 44, 42, 43, 40, 0, 142,
- 0, 0, 141, 149, 0, 157, 162, 163, 164, 189,
- 19, 19, 251, 0, 0, 185, 0, 19, 125, 124,
- 19, 19, 122, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 0, 0, 0, 0, 0, 0, 0, 19,
+ 19, 19, 19, 19, 19, 19, 24, 19, 19, 19,
+ 19, 19, 19, 19, 1, 3, 9, 4, 8, 5,
+ 6, 7, 20, 0, 21, 25, 0, 0, 0, 0,
+ 103, 0, 0, 0, 0, 31, 155, 161, 160, 0,
+ 0, 19, 156, 146, 0, 0, 19, 0, 19, 19,
+ 10, 11, 41, 44, 42, 43, 40, 0, 142, 0,
+ 0, 141, 149, 0, 157, 162, 163, 164, 189, 19,
+ 19, 251, 0, 0, 185, 0, 19, 125, 124, 19,
+ 19, 122, 19, 19, 19, 19, 19, 19, 19, 19,
19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 135, 134, 19, 19, 0, 0, 211, 217,
- 19, 227, 225, 104, 105, 19, 99, 106, 19, 0,
- 0, 72, 19, 0, 0, 68, 0, 0, 36, 21,
- 260, 21, 27, 26, 266, 267, 0, 28, 148, 179,
- 0, 0, 19, 165, 0, 147, 0, 0, 0, 103,
- 0, 0, 0, 0, 139, 19, 19, 143, 145, 140,
- 19, 19, 19, 0, 155, 156, 152, 0, 0, 159,
- 158, 19, 0, 208, 204, 14, 190, 186, 0, 19,
- 0, 201, 19, 207, 200, 0, 0, 219, 220, 254,
- 255, 250, 248, 247, 249, 233, 234, 235, 236, 237,
- 238, 239, 240, 241, 242, 243, 244, 245, 246, 221,
- 232, 231, 230, 223, 0, 224, 226, 229, 19, 218,
- 213, 16, 19, 19, 0, 228, 0, 0, 0, 17,
- 18, 19, 0, 87, 15, 73, 69, 19, 0, 83,
- 19, 0, 259, 258, 19, 19, 38, 21, 32, 261,
- 0, 180, 0, 0, 0, 0, 19, 0, 0, 0,
- 62, 63, 93, 94, 19, 127, 126, 19, 110, 0,
- 130, 129, 19, 118, 117, 19, 12, 0, 0, 131,
- 132, 133, 144, 0, 194, 188, 19, 0, 19, 0,
- 192, 19, 0, 13, 19, 19, 253, 0, 222, 215,
- 214, 212, 19, 19, 19, 19, 101, 76, 71, 19,
- 0, 19, 74, 19, 0, 19, 103, 66, 0, 0,
- 21, 35, 265, 268, 183, 181, 182, 19, 166, 19,
- 0, 172, 173, 174, 175, 176, 167, 171, 19, 108,
- 49, 112, 19, 19, 0, 0, 0, 0, 19, 197,
- 0, 196, 193, 206, 0, 0, 0, 19, 95, 96,
- 0, 115, 19, 107, 19, 79, 0, 78, 75, 86,
- 0, 0, 0, 0, 0, 0, 0, 91, 0, 45,
- 21, 262, 47, 48, 46, 37, 0, 169, 19, 0,
- 0, 0, 49, 103, 0, 19, 136, 195, 19, 0,
- 19, 0, 0, 123, 252, 19, 0, 100, 0, 77,
- 19, 0, 0, 19, 103, 19, 90, 89, 0, 0,
- 264, 39, 184, 0, 178, 177, 19, 60, 61, 0,
- 256, 55, 21, 263, 54, 52, 53, 51, 114, 57,
- 58, 59, 56, 0, 111, 19, 119, 198, 202, 209,
- 203, 121, 0, 19, 102, 80, 19, 0, 0, 0,
- 92, 19, 19, 0, 257, 50, 113, 128, 0, 0,
- 98, 82, 0, 0, 0, 0, 168, 116, 19, 97,
- 64, 65, 88, 170, 120
+ 19, 135, 134, 19, 19, 0, 0, 211, 217, 19,
+ 227, 225, 104, 105, 19, 99, 106, 19, 0, 0,
+ 72, 19, 0, 0, 68, 0, 0, 30, 29, 19,
+ 23, 22, 0, 34, 21, 33, 148, 179, 0, 0,
+ 19, 165, 0, 147, 0, 0, 0, 103, 0, 0,
+ 0, 0, 139, 19, 19, 143, 145, 140, 19, 19,
+ 19, 0, 155, 156, 152, 0, 0, 159, 158, 19,
+ 267, 0, 208, 204, 14, 190, 186, 0, 19, 0,
+ 201, 19, 207, 200, 0, 0, 219, 220, 254, 255,
+ 250, 248, 247, 249, 233, 234, 235, 236, 237, 238,
+ 239, 240, 241, 242, 243, 244, 245, 246, 221, 232,
+ 231, 230, 223, 0, 224, 226, 229, 19, 218, 213,
+ 16, 19, 19, 0, 228, 0, 0, 0, 17, 18,
+ 19, 0, 87, 15, 73, 69, 19, 0, 83, 19,
+ 0, 0, 0, 0, 36, 21, 260, 21, 180, 0,
+ 0, 0, 0, 19, 0, 0, 0, 62, 63, 93,
+ 94, 19, 127, 126, 19, 110, 0, 130, 129, 19,
+ 118, 117, 19, 12, 0, 0, 131, 132, 133, 144,
+ 0, 194, 188, 19, 0, 19, 0, 192, 19, 0,
+ 13, 19, 19, 253, 0, 222, 215, 214, 212, 19,
+ 19, 19, 19, 101, 76, 71, 19, 0, 19, 74,
+ 19, 0, 19, 27, 26, 266, 0, 28, 259, 258,
+ 19, 19, 38, 21, 32, 261, 183, 181, 182, 19,
+ 166, 19, 0, 172, 173, 174, 175, 176, 167, 171,
+ 19, 108, 49, 112, 19, 19, 0, 0, 0, 0,
+ 19, 268, 197, 0, 196, 193, 206, 0, 0, 0,
+ 19, 95, 96, 0, 115, 19, 107, 19, 79, 0,
+ 78, 75, 86, 0, 0, 0, 103, 66, 0, 0,
+ 21, 35, 0, 169, 19, 0, 0, 0, 0, 49,
+ 103, 0, 19, 136, 195, 19, 0, 19, 0, 0,
+ 123, 252, 19, 0, 100, 0, 77, 19, 0, 0,
+ 265, 0, 0, 0, 0, 91, 0, 45, 21, 262,
+ 47, 48, 46, 37, 184, 0, 178, 177, 19, 60,
+ 61, 0, 256, 55, 21, 263, 54, 52, 53, 51,
+ 114, 57, 58, 59, 56, 0, 111, 19, 119, 198,
+ 202, 209, 203, 121, 0, 19, 102, 80, 19, 19,
+ 103, 19, 90, 89, 0, 0, 264, 39, 19, 0,
+ 257, 50, 113, 128, 0, 0, 98, 82, 0, 0,
+ 0, 92, 19, 0, 168, 116, 19, 97, 0, 0,
+ 0, 170, 120, 64, 65, 88
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 9, 70, 10, 11, 12, 13, 14, 15, 16,
- 257, 36, 17, 460, 18, 52, 158, 276, 349, 71,
- 410, 421, 461, 462, 411, 277, 405, 153, 154, 155,
- 156, 350, 449, 294, 333, 436, 146, 147, 393, 148,
- 298, 402, 403, 73, 336, 74, 305, 498, 100, 101,
- 102, 75, 76, 193, 136, 77, 78, 79, 80, 81,
- 82, 83, 84, 85, 86, 289, 87, 368, 456, 88,
- 93, 94, 95, 96, 431, 137, 254, 138, 139, 140,
- 141, 142, 468, 469, 54, 470, 471, 472, 165, 166
+ -1, 8, 59, 9, 10, 11, 12, 13, 14, 15,
+ 246, 45, 34, 452, 35, 153, 264, 342, 399, 60,
+ 438, 408, 453, 454, 439, 343, 433, 142, 143, 144,
+ 145, 400, 485, 281, 320, 423, 135, 136, 386, 137,
+ 285, 406, 407, 62, 323, 63, 292, 494, 89, 90,
+ 91, 64, 65, 181, 125, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 276, 76, 360, 448, 77,
+ 82, 83, 84, 85, 418, 126, 243, 127, 128, 129,
+ 130, 131, 460, 461, 155, 462, 463, 464, 190, 191
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
-#define YYPACT_NINF -301
+#define YYPACT_NINF -240
static const yytype_int16 yypact[] =
{
- 467, 43, -9, 143, 155, 174, 47, 179, 199, 202,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -15,
- 220, -301, -301, -301, -301, -301, -301, -301, -301, 233,
- 233, 233, 233, 233, 233, 233, 31, 325, -301, -301,
- -301, -301, 769, 191, 420, 1125, 407, 556, 38, -301,
- -301, 336, 290, -301, 345, 146, 14, 374, -301, -301,
- 419, 393, -301, 397, -301, 402, 446, -301, 194, -301,
- -301, -301, -301, -301, -301, -301, -301, -301, 82, 616,
- 297, 629, -301, 454, 164, -301, -301, -301, -301, 236,
- -301, -301, -301, 384, 640, 237, 277, -301, -301, -301,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -301,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -301,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -301,
- -301, -301, -301, -301, -301, -301, 807, 911, -301, -301,
- -301, -301, -301, -301, -301, -301, -301, 28, -301, 390,
- 87, 248, -301, 394, 185, 308, 229, 355, 319, -301,
- 405, -301, -301, -301, -301, -301, 450, -301, -301, -301,
- 471, 292, -301, -301, 25, -301, 364, 285, 367, 311,
- 379, 22, 37, 196, -301, -301, -301, -301, -301, -301,
- -301, -301, -301, 616, -301, -301, 454, 205, 344, -301,
- -301, -301, 466, 233, 233, -301, 484, 416, 94, -301,
- 62, -301, -301, -301, 233, 223, 183, 233, 233, 233,
- 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
- 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
- 233, 233, 233, 233, 1062, 233, 233, 233, -301, -301,
- -301, -301, -301, -301, 1184, 233, 60, 29, 383, -301,
- -301, -301, 493, 233, -301, 507, 429, -301, 83, -301,
- -301, 192, -301, -301, -301, -301, 476, -301, 405, 405,
- 146, -301, 431, 457, 470, 556, 374, 397, 529, 68,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, 96,
- -301, -301, -301, -301, -301, -301, -301, 191, 556, 233,
- 233, 233, -301, 382, 233, 508, -301, 545, -301, 481,
- 233, -301, 538, -301, -301, -301, -301, 985, 233, 233,
- 233, -301, -301, -301, -301, -301, 519, 233, 541, -301,
- 569, -301, 233, -301, 760, -301, 404, 23, 555, 915,
- -301, 405, -301, -301, -301, -301, -301, -301, 233, -301,
- 167, -301, -301, -301, -301, -301, -301, -301, -301, 389,
- 233, -301, -301, -301, 191, 208, 161, 487, -301, 233,
- 546, 233, 233, 1184, 464, 191, 420, -301, 233, 36,
- 131, 233, -301, -301, -301, 233, 579, 233, 233, 1184,
- 612, 191, 535, 97, 611, 549, 620, 400, 481, -301,
- -301, -301, -301, -301, -301, 405, 152, -301, -301, 323,
- 632, 1257, 233, 407, 554, -301, -301, 233, -301, 464,
- -301, 215, 558, -301, 233, -301, 563, -301, 131, 233,
- -301, 686, 567, -301, 272, -301, -301, -301, 638, 299,
- -301, 405, -301, 323, -301, -301, -301, -301, -301, 146,
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -301,
- -301, -301, -301, 1257, -301, -301, 233, 233, -301, 233,
- -301, -301, 1125, -301, 28, 233, -301, 38, 136, 38,
- -301, -301, -301, 0, -301, 405, -301, 233, 181, 834,
- 233, 233, 582, 583, 182, 1, -301, -301, -301, 233,
- -301, -301, -301, -301, 233
+ 616, -4, 91, 115, 122, 66, 194, 201, 72, -240,
+ -240, -240, -240, -240, -240, -240, 36, -240, -240, -240,
+ -240, -240, -240, -240, -240, 244, 244, 244, 244, 244,
+ 244, 244, -240, 489, -240, -240, 844, 343, 25, 1131,
+ 347, 557, 333, -3, 37, 34, 257, -240, -240, 310,
+ 291, -240, 304, -240, 495, 346, -240, 220, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, 80, 640, 330,
+ 703, -240, 777, 152, -240, -240, -240, -240, 143, -240,
+ -240, -240, 278, 433, 212, 203, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, 964, 917, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, 41, -240, 281, 163,
+ 313, -240, 290, 174, 326, 243, 362, -240, -240, -240,
+ -240, -240, 375, 359, -240, 357, -240, -240, 387, 22,
+ -240, -240, 32, -240, 355, 179, 374, 295, 378, 200,
+ 275, 183, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, 640, -240, -240, 777, 191, 564, -240, -240, -240,
+ -240, 404, 244, 244, -240, 440, 337, 63, -240, 4,
+ -240, -240, -240, 244, 185, 123, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 1068, 244, 244, 244, -240, -240, -240,
+ -240, -240, -240, 1190, 244, 294, 233, 305, -240, -240,
+ -240, 418, 244, -240, 493, 350, -240, 129, -240, -240,
+ 206, 3, 167, 513, 8, -240, 42, -240, -240, 388,
+ 389, 394, 557, 257, 304, 464, 286, -240, -240, -240,
+ -240, -240, -240, -240, -240, -240, 124, -240, -240, -240,
+ -240, -240, -240, -240, 343, 557, 244, 244, 244, -240,
+ 712, 244, 514, -240, 479, -240, 413, 244, -240, 544,
+ -240, -240, -240, -240, 991, 244, 244, 244, -240, -240,
+ -240, -240, -240, 446, 244, 547, -240, 491, -240, 244,
+ -240, 766, -240, -240, -240, -240, 492, -240, -240, -240,
+ -240, -240, 481, -240, 42, 42, -240, -240, -240, -240,
+ 244, -240, 384, -240, -240, -240, -240, -240, -240, -240,
+ -240, 398, 244, -240, -240, -240, 343, 208, 154, 353,
+ -240, -240, 244, 552, 244, 244, 1190, 470, 343, 25,
+ -240, 244, 180, 160, 244, -240, -240, -240, 244, 626,
+ 244, 244, 1190, 618, 343, 3, 301, 227, 486, 921,
+ -240, 42, 56, -240, -240, 431, 638, 90, 437, 244,
+ 347, 425, -240, -240, 244, -240, 470, -240, 181, 466,
+ -240, 244, -240, 473, -240, 160, 244, -240, 692, 496,
+ -240, 441, 546, 487, 639, 311, 413, -240, -240, -240,
+ -240, -240, -240, 42, -240, 431, -240, -240, -240, -240,
+ -240, 3, -240, -240, -240, -240, -240, -240, -240, -240,
+ -240, -240, -240, -240, -240, 437, -240, -240, 244, 244,
+ -240, 244, -240, -240, 1131, -240, 41, 244, -240, -240,
+ 400, -240, -240, -240, 558, 12, -240, 42, -240, 1,
+ -240, 42, -240, 244, 13, 840, 244, 244, 333, 146,
+ 333, -240, -240, 2, -240, -240, -240, 244, 499, 540,
+ 178, -240, 244, -240, -240, -240
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -301, -301, -301, -301, -301, -301, -301, -301, -301, -301,
- -1, -21, -301, -51, -301, -301, -301, -301, -301, 302,
- -301, 264, -301, -301, 5, -301, -301, 217, -301, 536,
- -301, -301, -301, 245, -301, -301, 310, 269, -301, -301,
- -45, 339, -177, -202, -301, -146, -301, -301, 211, -301,
- 327, -132, -130, -301, -301, -103, 667, -301, 408, 543,
- -48, 634, -65, -55, -301, 430, -301, 359, 267, -301,
- -300, -301, 627, -301, 293, -190, -301, 469, 588, -35,
- -301, -301, 252, -19, -301, 377, -301, 378, -16, -3
+ -240, -240, -240, -240, -240, -240, -240, -240, -240, -240,
+ 0, -125, -240, -236, -240, -240, -240, -240, -240, 168,
+ -240, 213, -240, -240, -20, -240, -240, -84, -240, 483,
+ -240, -240, -240, 142, -240, -240, 249, 222, -240, -240,
+ -39, 241, -165, -232, -240, -126, -240, -240, 144, -240,
+ 272, -110, -106, -240, -240, -91, 611, -240, 391, 530,
+ -60, 630, -38, -42, -240, 421, -240, 354, 269, -240,
+ -239, -240, 632, -240, 308, -173, -240, 482, 601, -33,
+ -240, -240, 267, -17, -240, 334, -240, 335, -16, -18
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@@ -1055,334 +1055,324 @@ static const yytype_int16 yypgoto[] =
#define YYTABLE_NINF -217
static const yytype_int16 yytable[] =
{
- 20, 149, 299, 39, 164, 40, 40, 376, 97, 29,
- 30, 31, 32, 33, 34, 35, 197, 53, 198, 40,
- 42, 43, 44, 45, 46, 47, 48, 40, 40, 200,
- 40, 187, 160, -19, 40, 161, 49, 50, 286, 151,
- 56, 40, 40, 40, 19, 287, 64, 72, -19, 303,
- 304, 152, 25, 435, 327, -19, 37, 159, 38, 97,
- 404, 174, 21, 319, 177, 40, 179, 181, 182, 183,
- 51, -19, 334, 332, 424, 361, 362, 363, 364, 365,
- 213, 506, 513, 184, 319, 432, 202, 167, 184, 203,
- 204, 208, 210, 302, -191, 319, 214, 371, 371, 215,
- 216, 442, 217, 218, 219, 220, 221, 222, 223, 224,
- 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
- 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
- 245, 313, 384, 246, 247, 321, 40, 371, 278, 255,
- 279, 273, 200, 200, 256, 312, 162, 258, 262, 366,
- 367, 263, 268, 185, 400, 271, 343, 40, 186, 260,
- 291, 162, 296, 186, 301, 199, -191, 372, -109, -151,
- -109, 285, 373, 373, 361, 362, 363, 364, 365, 58,
- 59, 60, 61, 62, 307, 308, 265, 40, 40, 309,
- 310, 311, 89, 429, 98, 180, 40, 40, 152, -19,
- 314, 40, 28, 317, 90, 145, 199, -67, 320, 441,
- -154, 322, 373, 40, 22, -199, 480, 37, 163, 463,
- 58, 59, 60, 61, 62, 40, 23, 452, 40, 352,
- 269, 91, 41, 163, -19, -151, -151, 357, 40, -151,
- -151, -151, -151, -151, 99, 24, 270, 328, 417, 367,
- 26, 329, 330, 507, 324, 512, 351, -70, 200, 325,
- 337, 92, 340, 345, 353, -19, 342, 488, 306, 344,
- 27, 463, 97, 346, 347, 464, -154, -154, 211, 425,
- -154, -154, -154, -154, -154, 358, -199, -199, -199, 465,
- 40, 466, 499, 369, 212, 323, 370, 292, 188, 353,
- -19, 374, 189, 353, 375, 282, 283, 37, 37, 201,
- 209, 292, 65, 143, 144, 379, 40, 381, 467, 37,
- 382, 261, 353, 385, 386, 426, 55, 464, 40, 415,
- 412, 388, 389, 390, 391, 454, 455, 157, 395, 97,
- 397, 465, 398, 466, 401, 199, 145, 407, 37, -150,
- 97, 293, 143, 144, 274, 275, 416, 284, 358, 58,
- 59, 60, 61, 62, 353, 293, 97, 419, -137, -137,
- 467, 422, 423, -137, 190, 191, 192, 427, 474, 37,
- 353, 267, 297, 199, 51, 145, 434, -153, 40, 451,
- 447, 438, 450, 439, 40, 168, 335, 58, 59, 60,
- 61, 62, -103, 176, 458, 40, 173, -19, 494, 40,
- 49, 50, 40, 448, -19, -150, -150, 453, 175, -150,
- -150, -150, -150, -150, 476, 40, 37, 477, 272, 479,
- 143, 144, 169, 98, 482, 37, 170, 290, 37, 485,
- 295, 495, 487, 450, 489, 143, 144, 178, 143, 144,
- 37, 280, 300, -153, -153, 493, 205, -153, -153, -153,
- -153, -153, 259, 145, -210, 250, 264, 315, -19, 58,
- 59, 60, 61, 62, 497, -108, -216, -216, 145, -216,
- -216, 145, 500, 99, 281, 501, 171, 172, 188, 318,
- 504, 505, 189, 1, 338, 2, 3, 4, 509, 5,
- 6, 7, 341, 348, 430, 8, 354, 514, -216, -216,
- -216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, 355, -216, -216, -210, -210, -210, -205, 383,
- 252, -216, 359, 40, -216, 356, 380, 253, -216, -216,
- 103, 104, 37, 105, 106, 37, 406, 316, -138, -138,
- -19, 40, 392, -138, 190, 191, 192, -19, -19, 57,
- 396, 58, 59, 60, 61, 62, 63, 64, 37, 37,
- 339, 378, 107, 108, 109, 110, 111, 112, 113, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 443, 131, 92, -205,
- -205, -205, 37, 250, 394, 132, 444, 37, 133, 428,
- 445, -19, 134, 135, -216, -216, 475, -216, -216, 57,
- 481, 58, 59, 60, 61, 62, 63, 64, 483, 486,
- -187, 206, 194, 490, 58, 59, 60, 61, 62, 195,
- 37, 409, 440, 90, 510, 511, -216, -216, -216, -216,
+ 16, 138, 286, 333, 86, 306, 32, 32, 175, 25,
+ 26, 27, 28, 29, 30, 31, 61, 36, 37, 38,
+ 39, 40, 41, 42, 279, 335, 87, 148, 154, 266,
+ 32, 188, 185, 44, 186, 269, 270, 32, 87, 150,
+ 151, 32, 32, 340, 341, 273, -19, 150, 151, 149,
+ 86, 162, 274, 53, 165, 368, 167, 169, 170, 171,
+ 314, 32, 33, -191, 306, 197, 199, 17, 146, 202,
+ 147, 21, 24, 152, 146, 334, 88, 308, 280, 192,
+ 193, 172, 504, 511, -19, 505, 203, 271, 88, 204,
+ 205, 363, 206, 207, 208, 209, 210, 211, 212, 213,
+ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
+ 234, 299, 251, 235, 236, 363, 257, 411, 32, 244,
+ 306, 444, 413, 265, 245, -191, 377, 247, 267, 419,
+ 344, 252, 345, 188, 188, 260, 300, 363, 278, 262,
+ 283, 173, 288, 187, 333, 429, 174, -151, 393, 430,
+ 272, -109, 18, -109, 172, 32, 365, 47, 48, 49,
+ 50, 51, 32, 294, 295, 254, 455, 304, 296, 297,
+ 298, -199, 472, 32, 32, 32, 19, 141, 32, 301,
+ 32, 279, 187, 20, 311, 364, -154, 422, 307, 312,
+ 365, 309, 330, 416, 200, 32, 47, 48, 49, 50,
+ 51, 32, 349, 32, 146, 490, 189, -67, 401, 428,
+ 201, 168, 365, -151, -151, -19, 334, -151, -151, -151,
+ -151, -151, 32, 455, 134, 249, 327, 315, 32, 174,
+ 337, 316, 317, 336, 258, 280, -70, 339, -19, 32,
+ 324, 515, -199, -199, -199, 293, 329, 310, 188, 331,
+ 259, 86, -154, -154, 432, 22, -154, -154, -154, -154,
+ -154, 289, 23, 350, 146, 443, 321, 332, 156, 412,
+ 32, 361, 456, 146, 362, 198, 371, 290, 291, 366,
+ 371, -19, 367, 353, 354, 355, 356, 357, 457, 32,
+ 32, 495, 458, 372, 161, 374, 32, 319, 375, 371,
+ 32, 378, 379, 487, -19, 499, 32, 459, 322, 381,
+ 382, 383, 384, 157, 484, 163, 388, 158, 390, 491,
+ 391, 176, 394, 86, 140, 177, 132, 133, 32, 456,
+ 396, 397, 132, 133, 78, 86, 141, 166, 32, 402,
+ 194, 350, 32, 248, 176, 457, 79, 371, 177, 458,
+ 405, 86, 253, 261, 409, 410, 284, 358, 359, 134,
+ 414, 466, -108, 371, 459, 134, 263, 159, 160, 371,
+ 421, 54, 440, 80, 146, 425, 250, 426, 132, 133,
+ 450, 353, 354, 355, 356, 357, 152, 146, 435, 256,
+ 268, -137, -137, 32, 445, 302, -137, 178, 179, 180,
+ 305, -103, 468, 81, 508, 469, 509, 471, 483, 325,
+ 486, 134, 474, 328, -138, -138, 146, 477, 277, -138,
+ 178, 179, 180, -187, 195, 486, 32, 333, 451, 132,
+ 133, 132, 133, 446, 447, 146, 79, 282, 489, 146,
+ 46, 287, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 346, 347, 403, 359, 493, 58, 348,
+ -210, 239, 134, 80, 134, 496, 152, 351, 497, 498,
+ 373, 500, -216, -216, 146, -216, -216, 434, 503, 385,
+ 43, -19, 389, 395, -19, 507, 164, 467, -19, -19,
+ -19, -19, 510, 81, 146, -187, 512, -19, 398, 334,
+ 417, 146, 479, 303, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
+ -216, -216, -216, -216, -216, -216, -216, -216, 473, -216,
+ -216, -210, -210, -210, -205, 376, 241, -216, 475, 32,
+ -216, 480, -19, 242, -216, -216, 92, 93, 481, 94,
+ 95, -19, 32, 501, 146, 187, 326, 437, 478, -150,
+ 46, 513, 47, 48, 49, 50, 51, 52, 53, 47,
+ 48, 49, 50, 51, 146, 146, 338, 370, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+ 118, 119, 514, 120, 81, -205, -205, -205, 146, 239,
+ 387, 121, 465, 146, 122, 415, 255, 502, 123, 124,
+ -216, -216, 424, -216, -216, -150, -150, 431, 506, -150,
+ -150, -150, -150, -150, 1, 2, 3, 476, 4, 5,
+ 6, 420, 139, 46, 7, 47, 48, 49, 50, 51,
+ 52, 53, -216, -216, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- 91, -216, -216, -81, -81, -81, 473, 250, 252, -216,
- 266, 37, -216, 446, 491, 253, -216, -216, -216, -216,
- 437, -216, -216, 37, 502, 457, 503, 484, 420, 508,
- 92, 37, -187, 433, 150, 196, 377, 288, 360, 418,
- 492, 207, 478, 331, 249, 496, 413, 414, 0, 0,
+ -216, -216, -216, -216, -216, -216, 369, -216, -216, -81,
+ -81, -81, 275, 239, 241, -216, 352, 146, -216, 427,
+ 184, 242, -216, -216, -216, -216, 404, -216, -216, 146,
+ 146, 449, 482, 187, 488, 196, 182, -153, 47, 48,
+ 49, 50, 51, 183, 470, 318, 238, 47, 48, 49,
+ 50, 51, 492, 441, 442, 0, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, -216, -216, 0, -216, -216, -84, -84, -84,
- 0, 399, 252, -216, 0, 40, -216, 0, 0, 253,
- -216, -216, 103, 104, 40, 105, 106, 0, 0, 0,
- 0, 0, 57, 0, 58, 59, 60, 61, 62, 63,
- 64, 65, 66, 67, 68, 0, 0, 0, 0, 0,
- 69, 0, 0, 0, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 0, 131,
- 92, -85, -85, -85, 0, 250, 0, 132, 0, -19,
- 133, 0, 0, 0, 134, 135, -216, -216, 0, -216,
- -216, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 248,
- 126, 127, 128, 0, 0, 0, 0, 0, -216, -216,
+ 0, -216, -216, -84, -84, -84, 0, 392, 241, -216,
+ 0, 32, -216, 0, 0, 242, -216, -216, 92, 93,
+ 0, 94, 95, -153, -153, 0, 0, -153, -153, -153,
+ -153, -153, 47, 48, 49, 50, 51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
+ 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
+ 116, 117, 118, 119, 0, 120, 81, -85, -85, -85,
+ 0, 239, 0, 121, 0, -19, 122, 0, 0, 32,
+ 123, 124, -216, -216, 0, -216, -216, 46, 0, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 0, 0, 0, 0, 0, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
+ -216, -216, -216, -216, -216, -216, -216, -216, 0, -216,
+ -216, 0, 0, 0, 0, -19, 241, -216, 239, 0,
+ -216, -2, 436, 242, -216, -216, 0, 0, 0, -216,
+ -216, 0, -216, -216, 46, 0, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 0, 0, 0,
+ 0, 0, 58, 0, 0, 0, 0, 0, 0, 0,
+ 152, -216, -216, -216, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, 0, -216, -216, 0, 0, 0, 0, -19,
- 252, -216, 250, 0, -216, -2, 408, 253, -216, -216,
- 0, 0, 0, -216, -216, 0, -216, -216, 57, 0,
- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 68, 0, 0, 0, 0, 0, 69, 0, 0, 0,
- 0, 0, 0, 0, 51, -216, -216, -216, -216, -216,
+ -216, -216, -216, -216, -216, 0, -216, -216, 0, 240,
+ 0, 0, 239, 241, -216, 0, 0, -216, 0, 0,
+ 242, -216, -216, -216, -216, 0, -216, -216, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 112, 113, 237, 115, 116, 117,
+ 0, 0, 0, 0, 0, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
-216, -216, -216, -216, -216, -216, -216, -216, -216, 0,
- -216, -216, 0, 251, 0, 0, 250, 252, -216, 0,
- 0, -216, 0, 0, 253, -216, -216, -216, -216, 0,
- -216, -216, 0, 0, 0, 0, 0, 0, 0, 0,
+ -216, -216, 0, 0, 0, 0, 380, 241, -216, 313,
+ 0, -216, 0, 32, 242, -216, -216, 0, 0, 0,
+ 92, 93, 0, 94, 95, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, -216,
- -216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, -216, -216, -216, -216, -216, -216, -216, -216,
- -216, -216, -216, 0, -216, -216, 0, 0, 0, 0,
- 387, 252, -216, 326, 0, -216, 0, 40, 253, -216,
- -216, 0, 0, 0, 103, 104, 0, 105, 106, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
- 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
- 40, 131, 92, 0, 0, 0, 0, 103, 104, 132,
- 105, 106, 133, 0, 0, 0, 134, 135, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 107,
- 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
- 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
- 128, 129, 130, 0, 131, 92, 103, 104, 0, 105,
- 106, 0, 132, 0, 0, 133, 0, 0, 0, 134,
- 135, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 107, 108,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
- 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 0, 131, 92, 0, 0, 162, 459, 0,
- 0, 132, 0, 0, 133, 0, 0, 0, 134, 135,
- 57, 0, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, 68, 0, 0, 0, 0, 0, 69, 0,
- 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
+ 114, 115, 116, 117, 118, 119, 32, 120, 81, 0,
+ 0, 0, 0, 92, 93, 121, 94, 95, 122, 0,
+ 0, 0, 123, 124, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 96, 97, 98, 99, 100,
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 0,
+ 120, 81, 92, 93, 0, 94, 95, 0, 121, 0,
+ 0, 122, 0, 0, 0, 123, 124, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 163
+ 0, 0, 0, 0, 96, 97, 98, 99, 100, 101,
+ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119, 0, 120,
+ 81, 0, 0, 0, 0, 0, 0, 121, 0, 0,
+ 122, 0, 0, 0, 123, 124
};
static const yytype_int16 yycheck[] =
{
- 1, 46, 179, 19, 55, 5, 5, 307, 43, 10,
- 11, 12, 13, 14, 15, 16, 81, 36, 83, 5,
- 21, 22, 23, 24, 25, 26, 27, 5, 5, 84,
- 5, 79, 53, 5, 5, 54, 5, 6, 13, 1,
- 41, 5, 5, 5, 1, 20, 21, 42, 5, 12,
- 13, 13, 5, 17, 244, 12, 71, 52, 73, 94,
- 37, 62, 71, 1, 65, 5, 67, 68, 69, 70,
- 39, 43, 43, 13, 374, 7, 8, 9, 10, 11,
- 96, 81, 81, 1, 1, 385, 89, 73, 1, 90,
- 91, 94, 95, 71, 0, 1, 97, 1, 1, 100,
- 101, 401, 103, 104, 105, 106, 107, 108, 109, 110,
- 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
- 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
- 131, 196, 322, 134, 135, 73, 5, 1, 159, 140,
- 161, 157, 197, 198, 145, 193, 0, 148, 151, 81,
- 82, 152, 155, 71, 344, 156, 73, 5, 76, 72,
- 176, 0, 178, 76, 180, 1, 72, 71, 71, 5,
- 73, 172, 76, 76, 7, 8, 9, 10, 11, 15,
- 16, 17, 18, 19, 185, 186, 1, 5, 5, 190,
- 191, 192, 1, 383, 13, 1, 5, 5, 13, 5,
- 201, 5, 0, 206, 13, 74, 1, 71, 209, 399,
- 5, 212, 76, 5, 71, 0, 1, 71, 72, 421,
- 15, 16, 17, 18, 19, 5, 71, 75, 5, 280,
- 1, 40, 12, 72, 5, 71, 72, 285, 5, 75,
- 76, 77, 78, 79, 63, 71, 17, 248, 81, 82,
- 71, 252, 253, 72, 71, 73, 277, 72, 313, 76,
- 261, 70, 265, 71, 280, 71, 267, 444, 72, 270,
- 71, 473, 307, 274, 275, 421, 71, 72, 1, 71,
- 75, 76, 77, 78, 79, 286, 71, 72, 73, 421,
- 5, 421, 482, 294, 17, 72, 297, 12, 1, 315,
- 71, 302, 5, 319, 305, 13, 14, 71, 71, 73,
- 73, 12, 22, 41, 42, 316, 5, 318, 421, 71,
- 321, 73, 338, 324, 325, 376, 1, 473, 5, 350,
- 349, 332, 333, 334, 335, 12, 13, 1, 339, 374,
- 341, 473, 343, 473, 345, 1, 74, 348, 71, 5,
- 385, 66, 41, 42, 35, 36, 357, 65, 359, 15,
- 16, 17, 18, 19, 380, 66, 401, 368, 71, 72,
- 473, 372, 373, 76, 77, 78, 79, 378, 423, 71,
- 396, 73, 71, 1, 39, 74, 387, 5, 5, 410,
- 406, 392, 408, 394, 5, 21, 13, 15, 16, 17,
- 18, 19, 13, 1, 420, 5, 13, 5, 459, 5,
- 5, 6, 5, 13, 12, 71, 72, 418, 21, 75,
- 76, 77, 78, 79, 425, 5, 71, 428, 73, 430,
- 41, 42, 13, 13, 435, 71, 17, 73, 71, 440,
- 73, 462, 443, 459, 445, 41, 42, 1, 41, 42,
- 71, 1, 73, 71, 72, 456, 72, 75, 76, 77,
- 78, 79, 72, 74, 0, 1, 72, 1, 66, 15,
- 16, 17, 18, 19, 475, 71, 12, 13, 74, 15,
- 16, 74, 483, 63, 13, 486, 67, 68, 1, 73,
- 491, 492, 5, 26, 1, 28, 29, 30, 499, 32,
- 33, 34, 73, 27, 40, 38, 75, 508, 44, 45,
+ 0, 40, 167, 0, 37, 1, 5, 5, 68, 9,
+ 10, 11, 12, 13, 14, 15, 36, 17, 18, 19,
+ 20, 21, 22, 23, 12, 261, 13, 43, 45, 154,
+ 5, 73, 70, 33, 72, 13, 14, 5, 13, 5,
+ 6, 5, 5, 35, 36, 13, 5, 5, 6, 12,
+ 83, 51, 20, 21, 54, 294, 56, 57, 58, 59,
+ 233, 5, 26, 0, 1, 83, 84, 71, 71, 85,
+ 73, 5, 0, 39, 71, 72, 63, 73, 66, 79,
+ 80, 1, 81, 81, 43, 72, 86, 65, 63, 89,
+ 90, 1, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 181, 140, 123, 124, 1, 144, 366, 5, 129,
+ 1, 75, 368, 153, 134, 72, 309, 137, 155, 378,
+ 265, 141, 267, 185, 186, 145, 184, 1, 164, 149,
+ 166, 71, 168, 1, 0, 394, 76, 5, 331, 395,
+ 160, 71, 71, 73, 1, 5, 76, 15, 16, 17,
+ 18, 19, 5, 173, 174, 1, 408, 195, 178, 179,
+ 180, 0, 1, 5, 5, 5, 71, 13, 5, 189,
+ 5, 12, 1, 71, 71, 71, 5, 17, 198, 76,
+ 76, 201, 73, 376, 1, 5, 15, 16, 17, 18,
+ 19, 5, 272, 5, 71, 451, 73, 71, 343, 392,
+ 17, 1, 76, 71, 72, 5, 72, 75, 76, 77,
+ 78, 79, 5, 465, 74, 72, 254, 237, 5, 76,
+ 73, 241, 242, 261, 1, 66, 72, 263, 5, 5,
+ 250, 73, 71, 72, 73, 72, 256, 72, 300, 259,
+ 17, 294, 71, 72, 37, 71, 75, 76, 77, 78,
+ 79, 71, 71, 273, 71, 400, 43, 71, 21, 71,
+ 5, 281, 408, 71, 284, 73, 302, 12, 13, 289,
+ 306, 71, 292, 7, 8, 9, 10, 11, 408, 5,
+ 5, 474, 408, 303, 13, 305, 5, 13, 308, 325,
+ 5, 311, 312, 438, 71, 480, 5, 408, 13, 319,
+ 320, 321, 322, 13, 13, 21, 326, 17, 328, 454,
+ 330, 1, 332, 366, 1, 5, 41, 42, 5, 465,
+ 340, 341, 41, 42, 1, 378, 13, 1, 5, 349,
+ 72, 351, 5, 72, 1, 465, 13, 373, 5, 465,
+ 360, 394, 72, 1, 364, 365, 71, 81, 82, 74,
+ 370, 410, 71, 389, 465, 74, 1, 67, 68, 395,
+ 380, 22, 399, 40, 71, 385, 73, 387, 41, 42,
+ 406, 7, 8, 9, 10, 11, 39, 71, 398, 73,
+ 13, 71, 72, 5, 404, 1, 76, 77, 78, 79,
+ 73, 13, 412, 70, 498, 415, 500, 417, 434, 1,
+ 436, 74, 422, 73, 71, 72, 71, 427, 73, 76,
+ 77, 78, 79, 0, 1, 451, 5, 0, 1, 41,
+ 42, 41, 42, 12, 13, 71, 13, 73, 448, 71,
+ 13, 73, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 75, 75, 81, 82, 467, 31, 75,
+ 0, 1, 74, 40, 74, 475, 39, 13, 478, 479,
+ 1, 481, 12, 13, 71, 15, 16, 1, 488, 43,
+ 1, 5, 1, 1, 5, 495, 1, 72, 12, 13,
+ 5, 12, 502, 70, 71, 72, 506, 12, 27, 72,
+ 40, 71, 71, 73, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 72, 69,
+ 70, 71, 72, 73, 0, 1, 76, 77, 75, 5,
+ 80, 5, 66, 83, 84, 85, 12, 13, 71, 15,
+ 16, 66, 5, 5, 71, 1, 73, 399, 72, 5,
+ 13, 72, 15, 16, 17, 18, 19, 20, 21, 15,
+ 16, 17, 18, 19, 71, 71, 73, 73, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, 75, 69, 70, 71, 72, 73, 0, 1,
- 76, 77, 13, 5, 80, 75, 1, 83, 84, 85,
- 12, 13, 71, 15, 16, 71, 1, 73, 71, 72,
- 5, 5, 43, 76, 77, 78, 79, 12, 13, 13,
- 1, 15, 16, 17, 18, 19, 20, 21, 71, 71,
- 73, 73, 44, 45, 46, 47, 48, 49, 50, 51,
+ 66, 67, 72, 69, 70, 71, 72, 73, 71, 1,
+ 73, 77, 409, 71, 80, 73, 143, 485, 84, 85,
+ 12, 13, 383, 15, 16, 71, 72, 396, 494, 75,
+ 76, 77, 78, 79, 28, 29, 30, 425, 32, 33,
+ 34, 379, 41, 13, 38, 15, 16, 17, 18, 19,
+ 20, 21, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
- 62, 63, 64, 65, 66, 67, 71, 69, 70, 71,
- 72, 73, 71, 1, 73, 77, 5, 71, 80, 73,
- 71, 66, 84, 85, 12, 13, 72, 15, 16, 13,
- 72, 15, 16, 17, 18, 19, 20, 21, 75, 72,
- 0, 1, 13, 5, 15, 16, 17, 18, 19, 20,
- 71, 349, 73, 13, 72, 72, 44, 45, 46, 47,
+ 62, 63, 64, 65, 66, 67, 295, 69, 70, 71,
+ 72, 73, 162, 1, 76, 77, 275, 71, 80, 73,
+ 70, 83, 84, 85, 12, 13, 352, 15, 16, 71,
+ 71, 73, 73, 1, 445, 83, 13, 5, 15, 16,
+ 17, 18, 19, 20, 416, 243, 125, 15, 16, 17,
+ 18, 19, 465, 399, 399, -1, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 40, 69, 70, 71, 72, 73, 422, 1, 76, 77,
- 154, 71, 80, 73, 449, 83, 84, 85, 12, 13,
- 390, 15, 16, 71, 487, 73, 489, 438, 369, 498,
- 70, 71, 72, 386, 47, 81, 308, 174, 288, 360,
- 453, 94, 429, 254, 136, 473, 349, 349, -1, -1,
+ -1, 69, 70, 71, 72, 73, -1, 1, 76, 77,
+ -1, 5, 80, -1, -1, 83, 84, 85, 12, 13,
+ -1, 15, 16, 71, 72, -1, -1, 75, 76, 77,
+ 78, 79, 15, 16, 17, 18, 19, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, -1, 69, 70, 71, 72, 73,
- -1, 1, 76, 77, -1, 5, 80, -1, -1, 83,
- 84, 85, 12, 13, 5, 15, 16, -1, -1, -1,
- -1, -1, 13, -1, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- 31, -1, -1, -1, 44, 45, 46, 47, 48, 49,
+ -1, 1, -1, 77, -1, 5, 80, -1, -1, 5,
+ 84, 85, 12, 13, -1, 15, 16, 13, -1, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ -1, -1, -1, -1, -1, 31, -1, -1, -1, -1,
+ -1, -1, -1, -1, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, -1, 69,
- 70, 71, 72, 73, -1, 1, -1, 77, -1, 5,
- 80, -1, -1, -1, 84, 85, 12, 13, -1, 15,
- 16, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 70, -1, -1, -1, -1, 75, 76, 77, 1, -1,
+ 80, 0, 1, 83, 84, 85, -1, -1, -1, 12,
+ 13, -1, 15, 16, 13, -1, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, -1, -1, -1,
+ -1, -1, 31, -1, -1, -1, -1, -1, -1, -1,
+ 39, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
- 63, 64, 65, -1, -1, -1, -1, -1, 44, 45,
+ 63, 64, 65, 66, 67, -1, 69, 70, -1, 72,
+ -1, -1, 1, 76, 77, -1, -1, 80, -1, -1,
+ 83, 84, 85, 12, 13, -1, 15, 16, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, -1, 69, 70, -1, -1, -1, -1, 75,
- 76, 77, 1, -1, 80, 0, 1, 83, 84, 85,
- -1, -1, -1, 12, 13, -1, 15, 16, 13, -1,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, -1, -1, -1, -1, -1, 31, -1, -1, -1,
- -1, -1, -1, -1, 39, 44, 45, 46, 47, 48,
+ -1, -1, -1, -1, -1, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 65, 66, 67, -1,
- 69, 70, -1, 72, -1, -1, 1, 76, 77, -1,
- -1, 80, -1, -1, 83, 84, 85, 12, 13, -1,
- 15, 16, -1, -1, -1, -1, -1, -1, -1, -1,
+ 69, 70, -1, -1, -1, -1, 75, 76, 77, 1,
+ -1, 80, -1, 5, 83, 84, 85, -1, -1, -1,
+ 12, 13, -1, 15, 16, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, -1, 69, 70, -1, -1, -1, -1,
- 75, 76, 77, 1, -1, 80, -1, 5, 83, 84,
- 85, -1, -1, -1, 12, 13, -1, 15, 16, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 5, 69, 70, -1,
+ -1, -1, -1, 12, 13, 77, 15, 16, 80, -1,
+ -1, -1, 84, 85, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 5, 69, 70, -1, -1, -1, -1, 12, 13, 77,
- 15, 16, 80, -1, -1, -1, 84, 85, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, -1, 69, 70, 12, 13, -1, 15,
- 16, -1, 77, -1, -1, 80, -1, -1, -1, 84,
- 85, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 44, 45,
- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, -1, 69, 70, -1, -1, 0, 1, -1,
- -1, 77, -1, -1, 80, -1, -1, -1, 84, 85,
- 13, -1, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, -1, -1, -1, -1, -1, 31, -1,
- -1, -1, -1, -1, -1, -1, 39, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, -1,
+ 69, 70, 12, 13, -1, 15, 16, -1, 77, -1,
+ -1, 80, -1, -1, -1, 84, 85, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 72
+ -1, -1, -1, -1, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, -1, 69,
+ 70, -1, -1, -1, -1, -1, -1, 77, -1, -1,
+ 80, -1, -1, -1, 84, 85
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
- 0, 26, 28, 29, 30, 32, 33, 34, 38, 87,
- 89, 90, 91, 92, 93, 94, 95, 98, 100, 1,
- 96, 71, 71, 71, 71, 5, 71, 71, 0, 96,
- 96, 96, 96, 96, 96, 96, 97, 71, 73, 174,
- 5, 12, 96, 96, 96, 96, 96, 96, 96, 5,
- 6, 39, 101, 169, 170, 1, 96, 13, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 31,
- 88, 105, 110, 129, 131, 137, 138, 141, 142, 143,
- 144, 145, 146, 147, 148, 149, 150, 152, 155, 1,
- 13, 40, 70, 156, 157, 158, 159, 165, 13, 63,
- 134, 135, 136, 12, 13, 15, 16, 44, 45, 46,
- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 69, 77, 80, 84, 85, 140, 161, 163, 164,
- 165, 166, 167, 41, 42, 74, 122, 123, 125, 126,
- 142, 1, 13, 113, 114, 115, 116, 1, 102, 110,
- 97, 169, 0, 72, 99, 174, 175, 73, 21, 13,
- 17, 67, 68, 13, 96, 21, 1, 96, 1, 96,
- 1, 96, 96, 96, 1, 71, 76, 146, 1, 5,
- 77, 78, 79, 139, 13, 20, 147, 148, 148, 1,
- 149, 73, 175, 96, 96, 72, 1, 158, 175, 73,
- 175, 1, 17, 174, 96, 96, 96, 96, 96, 96,
+ 0, 28, 29, 30, 32, 33, 34, 38, 87, 89,
+ 90, 91, 92, 93, 94, 95, 96, 71, 71, 71,
+ 71, 5, 71, 71, 0, 96, 96, 96, 96, 96,
+ 96, 96, 5, 26, 98, 100, 96, 96, 96, 96,
+ 96, 96, 96, 1, 96, 97, 13, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 31, 88,
+ 105, 110, 129, 131, 137, 138, 141, 142, 143, 144,
+ 145, 146, 147, 148, 149, 150, 152, 155, 1, 13,
+ 40, 70, 156, 157, 158, 159, 165, 13, 63, 134,
+ 135, 136, 12, 13, 15, 16, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 69, 77, 80, 84, 85, 140, 161, 163, 164, 165,
+ 166, 167, 41, 42, 74, 122, 123, 125, 126, 142,
+ 1, 13, 113, 114, 115, 116, 71, 73, 174, 12,
+ 5, 6, 39, 101, 169, 170, 21, 13, 17, 67,
+ 68, 13, 96, 21, 1, 96, 1, 96, 1, 96,
+ 96, 96, 1, 71, 76, 146, 1, 5, 77, 78,
+ 79, 139, 13, 20, 147, 148, 148, 1, 149, 73,
+ 174, 175, 96, 96, 72, 1, 158, 175, 73, 175,
+ 1, 17, 174, 96, 96, 96, 96, 96, 96, 96,
96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 62, 164,
- 1, 72, 76, 83, 162, 96, 96, 96, 96, 72,
- 72, 73, 175, 96, 72, 1, 115, 73, 175, 1,
- 17, 96, 73, 174, 35, 36, 103, 111, 97, 97,
- 1, 13, 13, 14, 65, 96, 13, 20, 145, 151,
- 73, 174, 12, 66, 119, 73, 174, 71, 126, 128,
- 73, 174, 71, 12, 13, 132, 72, 96, 96, 96,
- 96, 96, 146, 148, 96, 1, 73, 175, 73, 1,
- 96, 73, 96, 72, 71, 76, 1, 161, 96, 96,
- 96, 163, 13, 120, 43, 13, 130, 96, 1, 73,
- 175, 73, 96, 73, 96, 71, 96, 96, 27, 104,
- 117, 97, 99, 174, 75, 75, 75, 146, 96, 13,
- 151, 7, 8, 9, 10, 11, 81, 82, 153, 96,
- 96, 1, 71, 76, 96, 96, 156, 144, 73, 96,
- 1, 96, 96, 1, 161, 96, 96, 75, 96, 96,
- 96, 96, 43, 124, 73, 96, 1, 96, 96, 1,
- 161, 96, 127, 128, 37, 112, 1, 96, 1, 105,
- 106, 110, 169, 171, 173, 97, 96, 81, 153, 96,
- 127, 107, 96, 96, 156, 71, 99, 96, 73, 161,
- 40, 160, 156, 136, 96, 17, 121, 122, 96, 96,
- 73, 161, 156, 71, 5, 71, 73, 174, 13, 118,
- 174, 97, 75, 96, 12, 13, 154, 73, 174, 1,
- 99, 108, 109, 129, 131, 137, 138, 141, 168, 169,
- 171, 172, 173, 107, 126, 72, 96, 96, 160, 96,
- 1, 72, 96, 75, 123, 96, 72, 96, 128, 96,
- 5, 119, 154, 96, 99, 97, 168, 96, 133, 161,
- 96, 96, 113, 113, 96, 96, 81, 72, 134, 96,
- 72, 72, 73, 81, 96
+ 96, 96, 96, 96, 96, 96, 96, 62, 164, 1,
+ 72, 76, 83, 162, 96, 96, 96, 96, 72, 72,
+ 73, 175, 96, 72, 1, 115, 73, 175, 1, 17,
+ 96, 1, 96, 1, 102, 110, 97, 169, 13, 13,
+ 14, 65, 96, 13, 20, 145, 151, 73, 174, 12,
+ 66, 119, 73, 174, 71, 126, 128, 73, 174, 71,
+ 12, 13, 132, 72, 96, 96, 96, 96, 96, 146,
+ 148, 96, 1, 73, 175, 73, 1, 96, 73, 96,
+ 72, 71, 76, 1, 161, 96, 96, 96, 163, 13,
+ 120, 43, 13, 130, 96, 1, 73, 175, 73, 96,
+ 73, 96, 71, 0, 72, 99, 175, 73, 73, 174,
+ 35, 36, 103, 111, 97, 97, 75, 75, 75, 146,
+ 96, 13, 151, 7, 8, 9, 10, 11, 81, 82,
+ 153, 96, 96, 1, 71, 76, 96, 96, 156, 144,
+ 73, 174, 96, 1, 96, 96, 1, 161, 96, 96,
+ 75, 96, 96, 96, 96, 43, 124, 73, 96, 1,
+ 96, 96, 1, 161, 96, 1, 96, 96, 27, 104,
+ 117, 97, 96, 81, 153, 96, 127, 128, 107, 96,
+ 96, 156, 71, 99, 96, 73, 161, 40, 160, 156,
+ 136, 96, 17, 121, 122, 96, 96, 73, 161, 156,
+ 99, 127, 37, 112, 1, 96, 1, 105, 106, 110,
+ 169, 171, 173, 97, 75, 96, 12, 13, 154, 73,
+ 174, 1, 99, 108, 109, 129, 131, 137, 138, 141,
+ 168, 169, 171, 172, 173, 107, 126, 72, 96, 96,
+ 160, 96, 1, 72, 96, 75, 123, 96, 72, 71,
+ 5, 71, 73, 174, 13, 118, 174, 97, 154, 96,
+ 99, 97, 168, 96, 133, 161, 96, 96, 96, 128,
+ 96, 5, 119, 96, 81, 72, 134, 96, 113, 113,
+ 96, 81, 96, 72, 72, 73
};
#define yyerrok (yyerrstatus = 0)
@@ -3907,7 +3897,7 @@ yyreduce:
/* Line 1267 of yacc.c. */
-#line 3911 "WebCore/tmp/../generated/CSSGrammar.tab.c"
+#line 3901 "WebCore/tmp/../generated/CSSGrammar.tab.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
index d4e26cc..8780c36 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.cpp
@@ -241,25 +241,25 @@ findProp (register const char *str, register unsigned int len)
{"zoom", CSSPropertyZoom},
#line 23 "CSSPropertyNames.gperf"
{"border", CSSPropertyBorder},
-#line 266 "CSSPropertyNames.gperf"
+#line 267 "CSSPropertyNames.gperf"
{"marker", CSSPropertyMarker},
#line 24 "CSSPropertyNames.gperf"
{"border-bottom", CSSPropertyBorderBottom},
-#line 268 "CSSPropertyNames.gperf"
+#line 269 "CSSPropertyNames.gperf"
{"marker-mid", CSSPropertyMarkerMid},
-#line 79 "CSSPropertyNames.gperf"
+#line 78 "CSSPropertyNames.gperf"
{"margin", CSSPropertyMargin},
#line 285 "CSSPropertyNames.gperf"
{"kerning", CSSPropertyKerning},
-#line 267 "CSSPropertyNames.gperf"
+#line 268 "CSSPropertyNames.gperf"
{"marker-end", CSSPropertyMarkerEnd},
-#line 80 "CSSPropertyNames.gperf"
+#line 79 "CSSPropertyNames.gperf"
{"margin-bottom", CSSPropertyMarginBottom},
-#line 250 "CSSPropertyNames.gperf"
+#line 251 "CSSPropertyNames.gperf"
{"mask", CSSPropertyMask},
-#line 271 "CSSPropertyNames.gperf"
+#line 272 "CSSPropertyNames.gperf"
{"stroke", CSSPropertyStroke},
-#line 112 "CSSPropertyNames.gperf"
+#line 111 "CSSPropertyNames.gperf"
{"size", CSSPropertySize},
#line 144 "CSSPropertyNames.gperf"
{"word-break", CSSPropertyWordBreak},
@@ -267,115 +267,115 @@ findProp (register const char *str, register unsigned int len)
{"writing-mode", CSSPropertyWritingMode},
#line 162 "CSSPropertyNames.gperf"
{"-webkit-binding", CSSPropertyWebkitBinding},
-#line 110 "CSSPropertyNames.gperf"
+#line 109 "CSSPropertyNames.gperf"
{"resize", CSSPropertyResize},
-#line 265 "CSSPropertyNames.gperf"
+#line 266 "CSSPropertyNames.gperf"
{"image-rendering", CSSPropertyImageRendering},
#line 149 "CSSPropertyNames.gperf"
{"-webkit-animation", CSSPropertyWebkitAnimation},
#line 165 "CSSPropertyNames.gperf"
{"-webkit-border-image", CSSPropertyWebkitBorderImage},
-#line 204 "CSSPropertyNames.gperf"
+#line 205 "CSSPropertyNames.gperf"
{"-webkit-mask", CSSPropertyWebkitMask},
#line 136 "CSSPropertyNames.gperf"
{"top", CSSPropertyTop},
#line 142 "CSSPropertyNames.gperf"
{"widows", CSSPropertyWidows},
-#line 269 "CSSPropertyNames.gperf"
+#line 270 "CSSPropertyNames.gperf"
{"marker-start", CSSPropertyMarkerStart},
#line 154 "CSSPropertyNames.gperf"
{"-webkit-animation-name", CSSPropertyWebkitAnimationName},
-#line 103 "CSSPropertyNames.gperf"
+#line 102 "CSSPropertyNames.gperf"
{"page", CSSPropertyPage},
-#line 209 "CSSPropertyNames.gperf"
+#line 210 "CSSPropertyNames.gperf"
{"-webkit-mask-image", CSSPropertyWebkitMaskImage},
#line 43 "CSSPropertyNames.gperf"
{"border-top", CSSPropertyBorderTop},
-#line 98 "CSSPropertyNames.gperf"
+#line 97 "CSSPropertyNames.gperf"
{"padding", CSSPropertyPadding},
-#line 239 "CSSPropertyNames.gperf"
+#line 240 "CSSPropertyNames.gperf"
{"-webkit-transition", CSSPropertyWebkitTransition},
-#line 210 "CSSPropertyNames.gperf"
+#line 211 "CSSPropertyNames.gperf"
{"-webkit-mask-origin", CSSPropertyWebkitMaskOrigin},
-#line 99 "CSSPropertyNames.gperf"
+#line 98 "CSSPropertyNames.gperf"
{"padding-bottom", CSSPropertyPaddingBottom},
-#line 83 "CSSPropertyNames.gperf"
+#line 82 "CSSPropertyNames.gperf"
{"margin-top", CSSPropertyMarginTop},
-#line 196 "CSSPropertyNames.gperf"
+#line 197 "CSSPropertyNames.gperf"
{"-webkit-margin-start", CSSPropertyWebkitMarginStart},
-#line 56 "CSSPropertyNames.gperf"
+#line 55 "CSSPropertyNames.gperf"
{"content", CSSPropertyContent},
-#line 108 "CSSPropertyNames.gperf"
+#line 107 "CSSPropertyNames.gperf"
{"position", CSSPropertyPosition},
-#line 60 "CSSPropertyNames.gperf"
+#line 59 "CSSPropertyNames.gperf"
{"direction", CSSPropertyDirection},
-#line 217 "CSSPropertyNames.gperf"
+#line 218 "CSSPropertyNames.gperf"
{"-webkit-mask-size", CSSPropertyWebkitMaskSize},
-#line 113 "CSSPropertyNames.gperf"
+#line 112 "CSSPropertyNames.gperf"
{"src", CSSPropertySrc},
#line 146 "CSSPropertyNames.gperf"
{"word-wrap", CSSPropertyWordWrap},
-#line 219 "CSSPropertyNames.gperf"
+#line 220 "CSSPropertyNames.gperf"
{"-webkit-nbsp-mode", CSSPropertyWebkitNbspMode},
-#line 106 "CSSPropertyNames.gperf"
+#line 105 "CSSPropertyNames.gperf"
{"page-break-inside", CSSPropertyPageBreakInside},
-#line 214 "CSSPropertyNames.gperf"
+#line 215 "CSSPropertyNames.gperf"
{"-webkit-mask-repeat", CSSPropertyWebkitMaskRepeat},
-#line 102 "CSSPropertyNames.gperf"
+#line 101 "CSSPropertyNames.gperf"
{"padding-top", CSSPropertyPaddingTop},
-#line 220 "CSSPropertyNames.gperf"
+#line 221 "CSSPropertyNames.gperf"
{"-webkit-padding-start", CSSPropertyWebkitPaddingStart},
#line 151 "CSSPropertyNames.gperf"
{"-webkit-animation-direction", CSSPropertyWebkitAnimationDirection},
-#line 211 "CSSPropertyNames.gperf"
+#line 212 "CSSPropertyNames.gperf"
{"-webkit-mask-position", CSSPropertyWebkitMaskPosition},
-#line 192 "CSSPropertyNames.gperf"
+#line 193 "CSSPropertyNames.gperf"
{"-webkit-line-break", CSSPropertyWebkitLineBreak},
-#line 276 "CSSPropertyNames.gperf"
+#line 277 "CSSPropertyNames.gperf"
{"stroke-miterlimit", CSSPropertyStrokeMiterlimit},
-#line 225 "CSSPropertyNames.gperf"
+#line 226 "CSSPropertyNames.gperf"
{"-webkit-rtl-ordering", CSSPropertyWebkitRtlOrdering},
-#line 275 "CSSPropertyNames.gperf"
+#line 276 "CSSPropertyNames.gperf"
{"stroke-linejoin", CSSPropertyStrokeLinejoin},
#line 282 "CSSPropertyNames.gperf"
{"dominant-baseline", CSSPropertyDominantBaseline},
-#line 52 "CSSPropertyNames.gperf"
+#line 51 "CSSPropertyNames.gperf"
{"caption-side", CSSPropertyCaptionSide},
-#line 107 "CSSPropertyNames.gperf"
+#line 106 "CSSPropertyNames.gperf"
{"pointer-events", CSSPropertyPointerEvents},
-#line 55 "CSSPropertyNames.gperf"
+#line 54 "CSSPropertyNames.gperf"
{"color", CSSPropertyColor},
#line 41 "CSSPropertyNames.gperf"
{"border-spacing", CSSPropertyBorderSpacing},
-#line 53 "CSSPropertyNames.gperf"
+#line 52 "CSSPropertyNames.gperf"
{"clear", CSSPropertyClear},
#line 36 "CSSPropertyNames.gperf"
{"border-radius", CSSPropertyBorderRadius},
-#line 109 "CSSPropertyNames.gperf"
+#line 108 "CSSPropertyNames.gperf"
{"quotes", CSSPropertyQuotes},
#line 145 "CSSPropertyNames.gperf"
{"word-spacing", CSSPropertyWordSpacing},
#line 31 "CSSPropertyNames.gperf"
{"border-color", CSSPropertyBorderColor},
-#line 198 "CSSPropertyNames.gperf"
+#line 199 "CSSPropertyNames.gperf"
{"-webkit-marquee", CSSPropertyWebkitMarquee},
#line 25 "CSSPropertyNames.gperf"
{"border-bottom-color", CSSPropertyBorderBottomColor},
#line 152 "CSSPropertyNames.gperf"
{"-webkit-animation-duration", CSSPropertyWebkitAnimationDuration},
-#line 244 "CSSPropertyNames.gperf"
+#line 245 "CSSPropertyNames.gperf"
{"-webkit-user-drag", CSSPropertyWebkitUserDrag},
#line 166 "CSSPropertyNames.gperf"
{"-webkit-border-radius", CSSPropertyWebkitBorderRadius},
-#line 208 "CSSPropertyNames.gperf"
+#line 209 "CSSPropertyNames.gperf"
{"-webkit-mask-composite", CSSPropertyWebkitMaskComposite},
-#line 261 "CSSPropertyNames.gperf"
+#line 262 "CSSPropertyNames.gperf"
{"color-rendering", CSSPropertyColorRendering},
#line 137 "CSSPropertyNames.gperf"
{"unicode-bidi", CSSPropertyUnicodeBidi},
-#line 54 "CSSPropertyNames.gperf"
+#line 53 "CSSPropertyNames.gperf"
{"clip", CSSPropertyClip},
-#line 241 "CSSPropertyNames.gperf"
+#line 242 "CSSPropertyNames.gperf"
{"-webkit-transition-duration", CSSPropertyWebkitTransitionDuration},
#line 157 "CSSPropertyNames.gperf"
{"-webkit-appearance", CSSPropertyWebkitAppearance},
@@ -383,9 +383,9 @@ findProp (register const char *str, register unsigned int len)
{"background", CSSPropertyBackground},
#line 138 "CSSPropertyNames.gperf"
{"unicode-range", CSSPropertyUnicodeRange},
-#line 59 "CSSPropertyNames.gperf"
+#line 58 "CSSPropertyNames.gperf"
{"cursor", CSSPropertyCursor},
-#line 90 "CSSPropertyNames.gperf"
+#line 89 "CSSPropertyNames.gperf"
{"outline", CSSPropertyOutline},
#line 14 "CSSPropertyNames.gperf"
{"background-image", CSSPropertyBackgroundImage},
@@ -393,171 +393,171 @@ findProp (register const char *str, register unsigned int len)
{"border-top-color", CSSPropertyBorderTopColor},
#line 15 "CSSPropertyNames.gperf"
{"background-origin", CSSPropertyBackgroundOrigin},
-#line 58 "CSSPropertyNames.gperf"
+#line 57 "CSSPropertyNames.gperf"
{"counter-reset", CSSPropertyCounterReset},
-#line 256 "CSSPropertyNames.gperf"
+#line 257 "CSSPropertyNames.gperf"
{"stop-color", CSSPropertyStopColor},
#line 280 "CSSPropertyNames.gperf"
{"alignment-baseline", CSSPropertyAlignmentBaseline},
#line 22 "CSSPropertyNames.gperf"
{"background-size", CSSPropertyBackgroundSize},
-#line 201 "CSSPropertyNames.gperf"
+#line 202 "CSSPropertyNames.gperf"
{"-webkit-marquee-repetition", CSSPropertyWebkitMarqueeRepetition},
-#line 274 "CSSPropertyNames.gperf"
+#line 275 "CSSPropertyNames.gperf"
{"stroke-linecap", CSSPropertyStrokeLinecap},
#line 161 "CSSPropertyNames.gperf"
{"-webkit-background-origin", CSSPropertyWebkitBackgroundOrigin},
-#line 73 "CSSPropertyNames.gperf"
+#line 72 "CSSPropertyNames.gperf"
{"letter-spacing", CSSPropertyLetterSpacing},
-#line 202 "CSSPropertyNames.gperf"
+#line 203 "CSSPropertyNames.gperf"
{"-webkit-marquee-speed", CSSPropertyWebkitMarqueeSpeed},
-#line 207 "CSSPropertyNames.gperf"
+#line 208 "CSSPropertyNames.gperf"
{"-webkit-mask-clip", CSSPropertyWebkitMaskClip},
#line 153 "CSSPropertyNames.gperf"
{"-webkit-animation-iteration-count", CSSPropertyWebkitAnimationIterationCount},
-#line 199 "CSSPropertyNames.gperf"
- {"-webkit-marquee-direction", CSSPropertyWebkitMarqueeDirection},
#line 200 "CSSPropertyNames.gperf"
+ {"-webkit-marquee-direction", CSSPropertyWebkitMarqueeDirection},
+#line 201 "CSSPropertyNames.gperf"
{"-webkit-marquee-increment", CSSPropertyWebkitMarqueeIncrement},
#line 19 "CSSPropertyNames.gperf"
{"background-repeat", CSSPropertyBackgroundRepeat},
-#line 221 "CSSPropertyNames.gperf"
+#line 222 "CSSPropertyNames.gperf"
{"-webkit-perspective", CSSPropertyWebkitPerspective},
-#line 111 "CSSPropertyNames.gperf"
+#line 110 "CSSPropertyNames.gperf"
{"right", CSSPropertyRight},
-#line 57 "CSSPropertyNames.gperf"
+#line 56 "CSSPropertyNames.gperf"
{"counter-increment", CSSPropertyCounterIncrement},
#line 143 "CSSPropertyNames.gperf"
{"width", CSSPropertyWidth},
#line 16 "CSSPropertyNames.gperf"
{"background-position", CSSPropertyBackgroundPosition},
-#line 87 "CSSPropertyNames.gperf"
+#line 86 "CSSPropertyNames.gperf"
{"min-width", CSSPropertyMinWidth},
-#line 222 "CSSPropertyNames.gperf"
+#line 223 "CSSPropertyNames.gperf"
{"-webkit-perspective-origin", CSSPropertyWebkitPerspectiveOrigin},
#line 37 "CSSPropertyNames.gperf"
{"border-right", CSSPropertyBorderRight},
#line 49 "CSSPropertyNames.gperf"
{"border-width", CSSPropertyBorderWidth},
-#line 64 "CSSPropertyNames.gperf"
+#line 63 "CSSPropertyNames.gperf"
{"font", CSSPropertyFont},
-#line 82 "CSSPropertyNames.gperf"
+#line 81 "CSSPropertyNames.gperf"
{"margin-right", CSSPropertyMarginRight},
#line 29 "CSSPropertyNames.gperf"
{"border-bottom-width", CSSPropertyBorderBottomWidth},
-#line 251 "CSSPropertyNames.gperf"
+#line 252 "CSSPropertyNames.gperf"
{"enable-background", CSSPropertyEnableBackground},
-#line 278 "CSSPropertyNames.gperf"
+#line 279 "CSSPropertyNames.gperf"
{"stroke-width", CSSPropertyStrokeWidth},
-#line 188 "CSSPropertyNames.gperf"
+#line 189 "CSSPropertyNames.gperf"
{"-webkit-columns", CSSPropertyWebkitColumns},
-#line 193 "CSSPropertyNames.gperf"
+#line 194 "CSSPropertyNames.gperf"
{"-webkit-line-clamp", CSSPropertyWebkitLineClamp},
-#line 258 "CSSPropertyNames.gperf"
+#line 259 "CSSPropertyNames.gperf"
{"color-interpolation", CSSPropertyColorInterpolation},
#line 163 "CSSPropertyNames.gperf"
{"-webkit-border-fit", CSSPropertyWebkitBorderFit},
-#line 66 "CSSPropertyNames.gperf"
+#line 65 "CSSPropertyNames.gperf"
{"font-size", CSSPropertyFontSize},
#line 30 "CSSPropertyNames.gperf"
{"border-collapse", CSSPropertyBorderCollapse},
-#line 117 "CSSPropertyNames.gperf"
+#line 116 "CSSPropertyNames.gperf"
{"text-indent", CSSPropertyTextIndent},
#line 147 "CSSPropertyNames.gperf"
{"z-index", CSSPropertyZIndex},
#line 139 "CSSPropertyNames.gperf"
{"vertical-align", CSSPropertyVerticalAlign},
-#line 180 "CSSPropertyNames.gperf"
+#line 181 "CSSPropertyNames.gperf"
{"-webkit-column-break-inside", CSSPropertyWebkitColumnBreakInside},
-#line 101 "CSSPropertyNames.gperf"
+#line 100 "CSSPropertyNames.gperf"
{"padding-right", CSSPropertyPaddingRight},
-#line 246 "CSSPropertyNames.gperf"
+#line 247 "CSSPropertyNames.gperf"
{"-webkit-user-select", CSSPropertyWebkitUserSelect},
#line 48 "CSSPropertyNames.gperf"
{"border-top-width", CSSPropertyBorderTopWidth},
-#line 279 "CSSPropertyNames.gperf"
+#line 128 "CSSPropertyNames.gperf"
{"text-rendering", CSSPropertyTextRendering},
-#line 89 "CSSPropertyNames.gperf"
+#line 88 "CSSPropertyNames.gperf"
{"orphans", CSSPropertyOrphans},
#line 174 "CSSPropertyNames.gperf"
{"-webkit-box-orient", CSSPropertyWebkitBoxOrient},
-#line 233 "CSSPropertyNames.gperf"
+#line 234 "CSSPropertyNames.gperf"
{"-webkit-transform", CSSPropertyWebkitTransform},
-#line 182 "CSSPropertyNames.gperf"
+#line 183 "CSSPropertyNames.gperf"
{"-webkit-column-gap", CSSPropertyWebkitColumnGap},
-#line 195 "CSSPropertyNames.gperf"
+#line 196 "CSSPropertyNames.gperf"
{"-webkit-margin-collapse", CSSPropertyWebkitMarginCollapse},
#line 160 "CSSPropertyNames.gperf"
{"-webkit-background-composite", CSSPropertyWebkitBackgroundComposite},
-#line 194 "CSSPropertyNames.gperf"
+#line 195 "CSSPropertyNames.gperf"
{"-webkit-margin-bottom-collapse", CSSPropertyWebkitMarginBottomCollapse},
#line 13 "CSSPropertyNames.gperf"
{"background-color", CSSPropertyBackgroundColor},
-#line 230 "CSSPropertyNames.gperf"
+#line 231 "CSSPropertyNames.gperf"
{"-webkit-text-stroke", CSSPropertyWebkitTextStroke},
-#line 270 "CSSPropertyNames.gperf"
+#line 271 "CSSPropertyNames.gperf"
{"shape-rendering", CSSPropertyShapeRendering},
-#line 105 "CSSPropertyNames.gperf"
+#line 104 "CSSPropertyNames.gperf"
{"page-break-before", CSSPropertyPageBreakBefore},
-#line 234 "CSSPropertyNames.gperf"
+#line 235 "CSSPropertyNames.gperf"
{"-webkit-transform-origin", CSSPropertyWebkitTransformOrigin},
-#line 104 "CSSPropertyNames.gperf"
+#line 103 "CSSPropertyNames.gperf"
{"page-break-after", CSSPropertyPageBreakAfter},
-#line 91 "CSSPropertyNames.gperf"
+#line 90 "CSSPropertyNames.gperf"
{"outline-color", CSSPropertyOutlineColor},
-#line 206 "CSSPropertyNames.gperf"
+#line 207 "CSSPropertyNames.gperf"
{"-webkit-mask-box-image", CSSPropertyWebkitMaskBoxImage},
-#line 177 "CSSPropertyNames.gperf"
+#line 178 "CSSPropertyNames.gperf"
{"-webkit-box-sizing", CSSPropertyWebkitBoxSizing},
-#line 72 "CSSPropertyNames.gperf"
+#line 71 "CSSPropertyNames.gperf"
{"left", CSSPropertyLeft},
-#line 237 "CSSPropertyNames.gperf"
+#line 238 "CSSPropertyNames.gperf"
{"-webkit-transform-origin-z", CSSPropertyWebkitTransformOriginZ},
-#line 69 "CSSPropertyNames.gperf"
+#line 68 "CSSPropertyNames.gperf"
{"font-variant", CSSPropertyFontVariant},
-#line 63 "CSSPropertyNames.gperf"
+#line 62 "CSSPropertyNames.gperf"
{"float", CSSPropertyFloat},
-#line 252 "CSSPropertyNames.gperf"
+#line 253 "CSSPropertyNames.gperf"
{"filter", CSSPropertyFilter},
#line 32 "CSSPropertyNames.gperf"
{"border-left", CSSPropertyBorderLeft},
-#line 205 "CSSPropertyNames.gperf"
+#line 206 "CSSPropertyNames.gperf"
{"-webkit-mask-attachment", CSSPropertyWebkitMaskAttachment},
-#line 116 "CSSPropertyNames.gperf"
+#line 115 "CSSPropertyNames.gperf"
{"text-decoration", CSSPropertyTextDecoration},
-#line 81 "CSSPropertyNames.gperf"
+#line 80 "CSSPropertyNames.gperf"
{"margin-left", CSSPropertyMarginLeft},
#line 12 "CSSPropertyNames.gperf"
{"background-clip", CSSPropertyBackgroundClip},
-#line 197 "CSSPropertyNames.gperf"
+#line 198 "CSSPropertyNames.gperf"
{"-webkit-margin-top-collapse", CSSPropertyWebkitMarginTopCollapse},
#line 167 "CSSPropertyNames.gperf"
{"-webkit-border-vertical-spacing", CSSPropertyWebkitBorderVerticalSpacing},
-#line 249 "CSSPropertyNames.gperf"
+#line 250 "CSSPropertyNames.gperf"
{"clip-rule", CSSPropertyClipRule},
#line 169 "CSSPropertyNames.gperf"
{"-webkit-box-direction", CSSPropertyWebkitBoxDirection},
#line 141 "CSSPropertyNames.gperf"
{"white-space", CSSPropertyWhiteSpace},
-#line 115 "CSSPropertyNames.gperf"
+#line 114 "CSSPropertyNames.gperf"
{"text-align", CSSPropertyTextAlign},
-#line 215 "CSSPropertyNames.gperf"
+#line 216 "CSSPropertyNames.gperf"
{"-webkit-mask-repeat-x", CSSPropertyWebkitMaskRepeatX},
#line 159 "CSSPropertyNames.gperf"
{"-webkit-background-clip", CSSPropertyWebkitBackgroundClip},
-#line 216 "CSSPropertyNames.gperf"
+#line 217 "CSSPropertyNames.gperf"
{"-webkit-mask-repeat-y", CSSPropertyWebkitMaskRepeatY},
#line 168 "CSSPropertyNames.gperf"
{"-webkit-box-align", CSSPropertyWebkitBoxAlign},
-#line 212 "CSSPropertyNames.gperf"
+#line 213 "CSSPropertyNames.gperf"
{"-webkit-mask-position-x", CSSPropertyWebkitMaskPositionX},
-#line 100 "CSSPropertyNames.gperf"
+#line 99 "CSSPropertyNames.gperf"
{"padding-left", CSSPropertyPaddingLeft},
-#line 189 "CSSPropertyNames.gperf"
+#line 190 "CSSPropertyNames.gperf"
{"-webkit-font-size-delta", CSSPropertyWebkitFontSizeDelta},
#line 27 "CSSPropertyNames.gperf"
{"border-bottom-right-radius", CSSPropertyBorderBottomRightRadius},
-#line 88 "CSSPropertyNames.gperf"
+#line 87 "CSSPropertyNames.gperf"
{"opacity", CSSPropertyOpacity},
#line 38 "CSSPropertyNames.gperf"
{"border-right-color", CSSPropertyBorderRightColor},
@@ -567,61 +567,61 @@ findProp (register const char *str, register unsigned int len)
{"-webkit-box-lines", CSSPropertyWebkitBoxLines},
#line 42 "CSSPropertyNames.gperf"
{"border-style", CSSPropertyBorderStyle},
-#line 213 "CSSPropertyNames.gperf"
+#line 214 "CSSPropertyNames.gperf"
{"-webkit-mask-position-y", CSSPropertyWebkitMaskPositionY},
-#line 95 "CSSPropertyNames.gperf"
+#line 94 "CSSPropertyNames.gperf"
{"overflow", CSSPropertyOverflow},
#line 28 "CSSPropertyNames.gperf"
{"border-bottom-style", CSSPropertyBorderBottomStyle},
-#line 262 "CSSPropertyNames.gperf"
+#line 263 "CSSPropertyNames.gperf"
{"fill", CSSPropertyFill},
#line 150 "CSSPropertyNames.gperf"
{"-webkit-animation-delay", CSSPropertyWebkitAnimationDelay},
-#line 277 "CSSPropertyNames.gperf"
+#line 278 "CSSPropertyNames.gperf"
{"stroke-opacity", CSSPropertyStrokeOpacity},
-#line 124 "CSSPropertyNames.gperf"
+#line 123 "CSSPropertyNames.gperf"
{"text-overline", CSSPropertyTextOverline},
-#line 181 "CSSPropertyNames.gperf"
+#line 182 "CSSPropertyNames.gperf"
{"-webkit-column-count", CSSPropertyWebkitColumnCount},
-#line 126 "CSSPropertyNames.gperf"
+#line 125 "CSSPropertyNames.gperf"
{"text-overline-mode", CSSPropertyTextOverlineMode},
#line 46 "CSSPropertyNames.gperf"
{"border-top-right-radius", CSSPropertyBorderTopRightRadius},
-#line 240 "CSSPropertyNames.gperf"
+#line 241 "CSSPropertyNames.gperf"
{"-webkit-transition-delay", CSSPropertyWebkitTransitionDelay},
-#line 61 "CSSPropertyNames.gperf"
+#line 60 "CSSPropertyNames.gperf"
{"display", CSSPropertyDisplay},
-#line 94 "CSSPropertyNames.gperf"
+#line 93 "CSSPropertyNames.gperf"
{"outline-width", CSSPropertyOutlineWidth},
-#line 242 "CSSPropertyNames.gperf"
+#line 243 "CSSPropertyNames.gperf"
{"-webkit-transition-property", CSSPropertyWebkitTransitionProperty},
#line 47 "CSSPropertyNames.gperf"
{"border-top-style", CSSPropertyBorderTopStyle},
-#line 183 "CSSPropertyNames.gperf"
+#line 184 "CSSPropertyNames.gperf"
{"-webkit-column-rule", CSSPropertyWebkitColumnRule},
#line 140 "CSSPropertyNames.gperf"
{"visibility", CSSPropertyVisibility},
-#line 248 "CSSPropertyNames.gperf"
+#line 249 "CSSPropertyNames.gperf"
{"clip-path", CSSPropertyClipPath},
-#line 257 "CSSPropertyNames.gperf"
+#line 258 "CSSPropertyNames.gperf"
{"stop-opacity", CSSPropertyStopOpacity},
-#line 247 "CSSPropertyNames.gperf"
+#line 248 "CSSPropertyNames.gperf"
{"-webkit-variable-declaration-block", CSSPropertyWebkitVariableDeclarationBlock},
-#line 229 "CSSPropertyNames.gperf"
+#line 230 "CSSPropertyNames.gperf"
{"-webkit-text-size-adjust", CSSPropertyWebkitTextSizeAdjust},
-#line 231 "CSSPropertyNames.gperf"
+#line 232 "CSSPropertyNames.gperf"
{"-webkit-text-stroke-color", CSSPropertyWebkitTextStrokeColor},
-#line 255 "CSSPropertyNames.gperf"
+#line 256 "CSSPropertyNames.gperf"
{"lighting-color", CSSPropertyLightingColor},
-#line 71 "CSSPropertyNames.gperf"
+#line 70 "CSSPropertyNames.gperf"
{"height", CSSPropertyHeight},
-#line 253 "CSSPropertyNames.gperf"
+#line 254 "CSSPropertyNames.gperf"
{"flood-color", CSSPropertyFloodColor},
#line 156 "CSSPropertyNames.gperf"
{"-webkit-animation-timing-function", CSSPropertyWebkitAnimationTimingFunction},
#line 131 "CSSPropertyNames.gperf"
{"text-underline", CSSPropertyTextUnderline},
-#line 86 "CSSPropertyNames.gperf"
+#line 85 "CSSPropertyNames.gperf"
{"min-height", CSSPropertyMinHeight},
#line 155 "CSSPropertyNames.gperf"
{"-webkit-animation-play-state", CSSPropertyWebkitAnimationPlayState},
@@ -633,23 +633,23 @@ findProp (register const char *str, register unsigned int len)
{"background-attachment", CSSPropertyBackgroundAttachment},
#line 33 "CSSPropertyNames.gperf"
{"border-left-color", CSSPropertyBorderLeftColor},
-#line 75 "CSSPropertyNames.gperf"
+#line 74 "CSSPropertyNames.gperf"
{"list-style", CSSPropertyListStyle},
#line 164 "CSSPropertyNames.gperf"
{"-webkit-border-horizontal-spacing", CSSPropertyWebkitBorderHorizontalSpacing},
-#line 243 "CSSPropertyNames.gperf"
+#line 244 "CSSPropertyNames.gperf"
{"-webkit-transition-timing-function", CSSPropertyWebkitTransitionTimingFunction},
-#line 76 "CSSPropertyNames.gperf"
+#line 75 "CSSPropertyNames.gperf"
{"list-style-image", CSSPropertyListStyleImage},
#line 40 "CSSPropertyNames.gperf"
{"border-right-width", CSSPropertyBorderRightWidth},
-#line 187 "CSSPropertyNames.gperf"
+#line 188 "CSSPropertyNames.gperf"
{"-webkit-column-width", CSSPropertyWebkitColumnWidth},
#line 20 "CSSPropertyNames.gperf"
{"background-repeat-x", CSSPropertyBackgroundRepeatX},
-#line 70 "CSSPropertyNames.gperf"
+#line 69 "CSSPropertyNames.gperf"
{"font-weight", CSSPropertyFontWeight},
-#line 260 "CSSPropertyNames.gperf"
+#line 261 "CSSPropertyNames.gperf"
{"color-profile", CSSPropertyColorProfile},
#line 45 "CSSPropertyNames.gperf"
{"border-top-left-radius", CSSPropertyBorderTopLeftRadius},
@@ -657,139 +657,139 @@ findProp (register const char *str, register unsigned int len)
{"background-repeat-y", CSSPropertyBackgroundRepeatY},
#line 17 "CSSPropertyNames.gperf"
{"background-position-x", CSSPropertyBackgroundPositionX},
-#line 85 "CSSPropertyNames.gperf"
+#line 84 "CSSPropertyNames.gperf"
{"max-width", CSSPropertyMaxWidth},
-#line 223 "CSSPropertyNames.gperf"
+#line 224 "CSSPropertyNames.gperf"
{"-webkit-perspective-origin-x", CSSPropertyWebkitPerspectiveOriginX},
-#line 179 "CSSPropertyNames.gperf"
+#line 180 "CSSPropertyNames.gperf"
{"-webkit-column-break-before", CSSPropertyWebkitColumnBreakBefore},
-#line 178 "CSSPropertyNames.gperf"
+#line 179 "CSSPropertyNames.gperf"
{"-webkit-column-break-after", CSSPropertyWebkitColumnBreakAfter},
#line 18 "CSSPropertyNames.gperf"
{"background-position-y", CSSPropertyBackgroundPositionY},
-#line 190 "CSSPropertyNames.gperf"
+#line 191 "CSSPropertyNames.gperf"
{"-webkit-font-smoothing", CSSPropertyWebkitFontSmoothing},
#line 173 "CSSPropertyNames.gperf"
{"-webkit-box-ordinal-group", CSSPropertyWebkitBoxOrdinalGroup},
-#line 203 "CSSPropertyNames.gperf"
+#line 204 "CSSPropertyNames.gperf"
{"-webkit-marquee-style", CSSPropertyWebkitMarqueeStyle},
-#line 224 "CSSPropertyNames.gperf"
+#line 225 "CSSPropertyNames.gperf"
{"-webkit-perspective-origin-y", CSSPropertyWebkitPerspectiveOriginY},
-#line 51 "CSSPropertyNames.gperf"
- {"box-shadow", CSSPropertyBoxShadow},
#line 129 "CSSPropertyNames.gperf"
{"text-shadow", CSSPropertyTextShadow},
-#line 74 "CSSPropertyNames.gperf"
+#line 73 "CSSPropertyNames.gperf"
{"line-height", CSSPropertyLineHeight},
-#line 77 "CSSPropertyNames.gperf"
+#line 76 "CSSPropertyNames.gperf"
{"list-style-position", CSSPropertyListStylePosition},
-#line 114 "CSSPropertyNames.gperf"
+#line 113 "CSSPropertyNames.gperf"
{"table-layout", CSSPropertyTableLayout},
-#line 125 "CSSPropertyNames.gperf"
+#line 177 "CSSPropertyNames.gperf"
+ {"-webkit-box-shadow", CSSPropertyWebkitBoxShadow},
+#line 124 "CSSPropertyNames.gperf"
{"text-overline-color", CSSPropertyTextOverlineColor},
-#line 62 "CSSPropertyNames.gperf"
+#line 61 "CSSPropertyNames.gperf"
{"empty-cells", CSSPropertyEmptyCells},
-#line 232 "CSSPropertyNames.gperf"
+#line 233 "CSSPropertyNames.gperf"
{"-webkit-text-stroke-width", CSSPropertyWebkitTextStrokeWidth},
#line 130 "CSSPropertyNames.gperf"
{"text-transform", CSSPropertyTextTransform},
-#line 67 "CSSPropertyNames.gperf"
+#line 66 "CSSPropertyNames.gperf"
{"font-stretch", CSSPropertyFontStretch},
-#line 93 "CSSPropertyNames.gperf"
+#line 92 "CSSPropertyNames.gperf"
{"outline-style", CSSPropertyOutlineStyle},
#line 286 "CSSPropertyNames.gperf"
{"text-anchor", CSSPropertyTextAnchor},
-#line 184 "CSSPropertyNames.gperf"
+#line 185 "CSSPropertyNames.gperf"
{"-webkit-column-rule-color", CSSPropertyWebkitColumnRuleColor},
-#line 272 "CSSPropertyNames.gperf"
+#line 273 "CSSPropertyNames.gperf"
{"stroke-dasharray", CSSPropertyStrokeDasharray},
#line 35 "CSSPropertyNames.gperf"
{"border-left-width", CSSPropertyBorderLeftWidth},
-#line 264 "CSSPropertyNames.gperf"
+#line 265 "CSSPropertyNames.gperf"
{"fill-rule", CSSPropertyFillRule},
-#line 235 "CSSPropertyNames.gperf"
+#line 236 "CSSPropertyNames.gperf"
{"-webkit-transform-origin-x", CSSPropertyWebkitTransformOriginX},
#line 281 "CSSPropertyNames.gperf"
{"baseline-shift", CSSPropertyBaselineShift},
#line 132 "CSSPropertyNames.gperf"
{"text-underline-color", CSSPropertyTextUnderlineColor},
-#line 236 "CSSPropertyNames.gperf"
+#line 237 "CSSPropertyNames.gperf"
{"-webkit-transform-origin-y", CSSPropertyWebkitTransformOriginY},
-#line 259 "CSSPropertyNames.gperf"
+#line 260 "CSSPropertyNames.gperf"
{"color-interpolation-filters", CSSPropertyColorInterpolationFilters},
#line 39 "CSSPropertyNames.gperf"
{"border-right-style", CSSPropertyBorderRightStyle},
-#line 68 "CSSPropertyNames.gperf"
+#line 67 "CSSPropertyNames.gperf"
{"font-style", CSSPropertyFontStyle},
-#line 128 "CSSPropertyNames.gperf"
+#line 127 "CSSPropertyNames.gperf"
{"text-overline-width", CSSPropertyTextOverlineWidth},
-#line 96 "CSSPropertyNames.gperf"
+#line 95 "CSSPropertyNames.gperf"
{"overflow-x", CSSPropertyOverflowX},
-#line 123 "CSSPropertyNames.gperf"
+#line 122 "CSSPropertyNames.gperf"
{"text-overflow", CSSPropertyTextOverflow},
#line 176 "CSSPropertyNames.gperf"
{"-webkit-box-reflect", CSSPropertyWebkitBoxReflect},
-#line 245 "CSSPropertyNames.gperf"
+#line 246 "CSSPropertyNames.gperf"
{"-webkit-user-modify", CSSPropertyWebkitUserModify},
-#line 186 "CSSPropertyNames.gperf"
+#line 187 "CSSPropertyNames.gperf"
{"-webkit-column-rule-width", CSSPropertyWebkitColumnRuleWidth},
-#line 97 "CSSPropertyNames.gperf"
+#line 96 "CSSPropertyNames.gperf"
{"overflow-y", CSSPropertyOverflowY},
-#line 238 "CSSPropertyNames.gperf"
+#line 239 "CSSPropertyNames.gperf"
{"-webkit-transform-style", CSSPropertyWebkitTransformStyle},
-#line 92 "CSSPropertyNames.gperf"
+#line 91 "CSSPropertyNames.gperf"
{"outline-offset", CSSPropertyOutlineOffset},
#line 135 "CSSPropertyNames.gperf"
{"text-underline-width", CSSPropertyTextUnderlineWidth},
-#line 254 "CSSPropertyNames.gperf"
+#line 255 "CSSPropertyNames.gperf"
{"flood-opacity", CSSPropertyFloodOpacity},
#line 34 "CSSPropertyNames.gperf"
{"border-left-style", CSSPropertyBorderLeftStyle},
-#line 84 "CSSPropertyNames.gperf"
+#line 83 "CSSPropertyNames.gperf"
{"max-height", CSSPropertyMaxHeight},
-#line 228 "CSSPropertyNames.gperf"
+#line 229 "CSSPropertyNames.gperf"
{"-webkit-text-security", CSSPropertyWebkitTextSecurity},
-#line 191 "CSSPropertyNames.gperf"
+#line 192 "CSSPropertyNames.gperf"
{"-webkit-highlight", CSSPropertyWebkitHighlight},
-#line 263 "CSSPropertyNames.gperf"
+#line 264 "CSSPropertyNames.gperf"
{"fill-opacity", CSSPropertyFillOpacity},
-#line 273 "CSSPropertyNames.gperf"
+#line 274 "CSSPropertyNames.gperf"
{"stroke-dashoffset", CSSPropertyStrokeDashoffset},
-#line 127 "CSSPropertyNames.gperf"
+#line 126 "CSSPropertyNames.gperf"
{"text-overline-style", CSSPropertyTextOverlineStyle},
-#line 78 "CSSPropertyNames.gperf"
+#line 77 "CSSPropertyNames.gperf"
{"list-style-type", CSSPropertyListStyleType},
-#line 218 "CSSPropertyNames.gperf"
+#line 219 "CSSPropertyNames.gperf"
{"-webkit-match-nearest-mail-blockquote-color", CSSPropertyWebkitMatchNearestMailBlockquoteColor},
-#line 185 "CSSPropertyNames.gperf"
+#line 186 "CSSPropertyNames.gperf"
{"-webkit-column-rule-style", CSSPropertyWebkitColumnRuleStyle},
#line 158 "CSSPropertyNames.gperf"
{"-webkit-backface-visibility", CSSPropertyWebkitBackfaceVisibility},
-#line 227 "CSSPropertyNames.gperf"
+#line 228 "CSSPropertyNames.gperf"
{"-webkit-text-fill-color", CSSPropertyWebkitTextFillColor},
#line 134 "CSSPropertyNames.gperf"
{"text-underline-style", CSSPropertyTextUnderlineStyle},
#line 284 "CSSPropertyNames.gperf"
{"glyph-orientation-vertical", CSSPropertyGlyphOrientationVertical},
-#line 65 "CSSPropertyNames.gperf"
+#line 64 "CSSPropertyNames.gperf"
{"font-family", CSSPropertyFontFamily},
#line 170 "CSSPropertyNames.gperf"
{"-webkit-box-flex", CSSPropertyWebkitBoxFlex},
-#line 118 "CSSPropertyNames.gperf"
+#line 117 "CSSPropertyNames.gperf"
{"text-line-through", CSSPropertyTextLineThrough},
-#line 120 "CSSPropertyNames.gperf"
+#line 119 "CSSPropertyNames.gperf"
{"text-line-through-mode", CSSPropertyTextLineThroughMode},
-#line 226 "CSSPropertyNames.gperf"
+#line 227 "CSSPropertyNames.gperf"
{"-webkit-text-decorations-in-effect", CSSPropertyWebkitTextDecorationsInEffect},
#line 283 "CSSPropertyNames.gperf"
{"glyph-orientation-horizontal", CSSPropertyGlyphOrientationHorizontal},
#line 171 "CSSPropertyNames.gperf"
{"-webkit-box-flex-group", CSSPropertyWebkitBoxFlexGroup},
-#line 119 "CSSPropertyNames.gperf"
+#line 118 "CSSPropertyNames.gperf"
{"text-line-through-color", CSSPropertyTextLineThroughColor},
-#line 122 "CSSPropertyNames.gperf"
- {"text-line-through-width", CSSPropertyTextLineThroughWidth},
#line 121 "CSSPropertyNames.gperf"
+ {"text-line-through-width", CSSPropertyTextLineThroughWidth},
+#line 120 "CSSPropertyNames.gperf"
{"text-line-through-style", CSSPropertyTextLineThroughStyle}
};
@@ -869,9 +869,9 @@ findProp (register const char *str, register unsigned int len)
-1, -1, 208, -1, 209, -1, 210, -1, -1, 211,
-1, -1, -1, 212, -1, -1, -1, 213, -1, -1,
-1, 214, -1, -1, -1, -1, 215, 216, -1, -1,
- 217, 218, -1, 219, -1, 220, 221, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 222, -1, -1, 223,
- -1, -1, -1, -1, -1, -1, -1, 224, -1, 225,
+ 217, 218, -1, 219, -1, -1, 220, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 221, -1, -1, 222,
+ -1, -1, -1, -1, -1, -1, -1, 223, 224, 225,
-1, 226, -1, -1, -1, 227, -1, -1, -1, 228,
-1, -1, 229, -1, -1, -1, -1, -1, 230, -1,
-1, 231, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1042,7 +1042,6 @@ static const char * const propertyNameStrings[278] = {
"border-top-width",
"border-width",
"bottom",
-"box-shadow",
"caption-side",
"clear",
"clip",
@@ -1120,6 +1119,7 @@ static const char * const propertyNameStrings[278] = {
"text-overline-mode",
"text-overline-style",
"text-overline-width",
+"text-rendering",
"text-shadow",
"text-transform",
"text-underline",
@@ -1168,6 +1168,7 @@ static const char * const propertyNameStrings[278] = {
"-webkit-box-orient",
"-webkit-box-pack",
"-webkit-box-reflect",
+"-webkit-box-shadow",
"-webkit-box-sizing",
"-webkit-column-break-after",
"-webkit-column-break-before",
@@ -1270,7 +1271,6 @@ static const char * const propertyNameStrings[278] = {
"stroke-miterlimit",
"stroke-opacity",
"stroke-width",
-"text-rendering",
"alignment-baseline",
"baseline-shift",
"dominant-baseline",
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h
index 9af7f73..f1332e3 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h
+++ b/src/3rdparty/webkit/WebCore/generated/CSSPropertyNames.h
@@ -46,84 +46,84 @@ enum CSSPropertyID {
CSSPropertyBorderTopWidth = 1039,
CSSPropertyBorderWidth = 1040,
CSSPropertyBottom = 1041,
- CSSPropertyBoxShadow = 1042,
- CSSPropertyCaptionSide = 1043,
- CSSPropertyClear = 1044,
- CSSPropertyClip = 1045,
- CSSPropertyColor = 1046,
- CSSPropertyContent = 1047,
- CSSPropertyCounterIncrement = 1048,
- CSSPropertyCounterReset = 1049,
- CSSPropertyCursor = 1050,
- CSSPropertyDirection = 1051,
- CSSPropertyDisplay = 1052,
- CSSPropertyEmptyCells = 1053,
- CSSPropertyFloat = 1054,
- CSSPropertyFont = 1055,
- CSSPropertyFontFamily = 1056,
- CSSPropertyFontSize = 1057,
- CSSPropertyFontStretch = 1058,
- CSSPropertyFontStyle = 1059,
- CSSPropertyFontVariant = 1060,
- CSSPropertyFontWeight = 1061,
- CSSPropertyHeight = 1062,
- CSSPropertyLeft = 1063,
- CSSPropertyLetterSpacing = 1064,
- CSSPropertyLineHeight = 1065,
- CSSPropertyListStyle = 1066,
- CSSPropertyListStyleImage = 1067,
- CSSPropertyListStylePosition = 1068,
- CSSPropertyListStyleType = 1069,
- CSSPropertyMargin = 1070,
- CSSPropertyMarginBottom = 1071,
- CSSPropertyMarginLeft = 1072,
- CSSPropertyMarginRight = 1073,
- CSSPropertyMarginTop = 1074,
- CSSPropertyMaxHeight = 1075,
- CSSPropertyMaxWidth = 1076,
- CSSPropertyMinHeight = 1077,
- CSSPropertyMinWidth = 1078,
- CSSPropertyOpacity = 1079,
- CSSPropertyOrphans = 1080,
- CSSPropertyOutline = 1081,
- CSSPropertyOutlineColor = 1082,
- CSSPropertyOutlineOffset = 1083,
- CSSPropertyOutlineStyle = 1084,
- CSSPropertyOutlineWidth = 1085,
- CSSPropertyOverflow = 1086,
- CSSPropertyOverflowX = 1087,
- CSSPropertyOverflowY = 1088,
- CSSPropertyPadding = 1089,
- CSSPropertyPaddingBottom = 1090,
- CSSPropertyPaddingLeft = 1091,
- CSSPropertyPaddingRight = 1092,
- CSSPropertyPaddingTop = 1093,
- CSSPropertyPage = 1094,
- CSSPropertyPageBreakAfter = 1095,
- CSSPropertyPageBreakBefore = 1096,
- CSSPropertyPageBreakInside = 1097,
- CSSPropertyPointerEvents = 1098,
- CSSPropertyPosition = 1099,
- CSSPropertyQuotes = 1100,
- CSSPropertyResize = 1101,
- CSSPropertyRight = 1102,
- CSSPropertySize = 1103,
- CSSPropertySrc = 1104,
- CSSPropertyTableLayout = 1105,
- CSSPropertyTextAlign = 1106,
- CSSPropertyTextDecoration = 1107,
- CSSPropertyTextIndent = 1108,
- CSSPropertyTextLineThrough = 1109,
- CSSPropertyTextLineThroughColor = 1110,
- CSSPropertyTextLineThroughMode = 1111,
- CSSPropertyTextLineThroughStyle = 1112,
- CSSPropertyTextLineThroughWidth = 1113,
- CSSPropertyTextOverflow = 1114,
- CSSPropertyTextOverline = 1115,
- CSSPropertyTextOverlineColor = 1116,
- CSSPropertyTextOverlineMode = 1117,
- CSSPropertyTextOverlineStyle = 1118,
- CSSPropertyTextOverlineWidth = 1119,
+ CSSPropertyCaptionSide = 1042,
+ CSSPropertyClear = 1043,
+ CSSPropertyClip = 1044,
+ CSSPropertyColor = 1045,
+ CSSPropertyContent = 1046,
+ CSSPropertyCounterIncrement = 1047,
+ CSSPropertyCounterReset = 1048,
+ CSSPropertyCursor = 1049,
+ CSSPropertyDirection = 1050,
+ CSSPropertyDisplay = 1051,
+ CSSPropertyEmptyCells = 1052,
+ CSSPropertyFloat = 1053,
+ CSSPropertyFont = 1054,
+ CSSPropertyFontFamily = 1055,
+ CSSPropertyFontSize = 1056,
+ CSSPropertyFontStretch = 1057,
+ CSSPropertyFontStyle = 1058,
+ CSSPropertyFontVariant = 1059,
+ CSSPropertyFontWeight = 1060,
+ CSSPropertyHeight = 1061,
+ CSSPropertyLeft = 1062,
+ CSSPropertyLetterSpacing = 1063,
+ CSSPropertyLineHeight = 1064,
+ CSSPropertyListStyle = 1065,
+ CSSPropertyListStyleImage = 1066,
+ CSSPropertyListStylePosition = 1067,
+ CSSPropertyListStyleType = 1068,
+ CSSPropertyMargin = 1069,
+ CSSPropertyMarginBottom = 1070,
+ CSSPropertyMarginLeft = 1071,
+ CSSPropertyMarginRight = 1072,
+ CSSPropertyMarginTop = 1073,
+ CSSPropertyMaxHeight = 1074,
+ CSSPropertyMaxWidth = 1075,
+ CSSPropertyMinHeight = 1076,
+ CSSPropertyMinWidth = 1077,
+ CSSPropertyOpacity = 1078,
+ CSSPropertyOrphans = 1079,
+ CSSPropertyOutline = 1080,
+ CSSPropertyOutlineColor = 1081,
+ CSSPropertyOutlineOffset = 1082,
+ CSSPropertyOutlineStyle = 1083,
+ CSSPropertyOutlineWidth = 1084,
+ CSSPropertyOverflow = 1085,
+ CSSPropertyOverflowX = 1086,
+ CSSPropertyOverflowY = 1087,
+ CSSPropertyPadding = 1088,
+ CSSPropertyPaddingBottom = 1089,
+ CSSPropertyPaddingLeft = 1090,
+ CSSPropertyPaddingRight = 1091,
+ CSSPropertyPaddingTop = 1092,
+ CSSPropertyPage = 1093,
+ CSSPropertyPageBreakAfter = 1094,
+ CSSPropertyPageBreakBefore = 1095,
+ CSSPropertyPageBreakInside = 1096,
+ CSSPropertyPointerEvents = 1097,
+ CSSPropertyPosition = 1098,
+ CSSPropertyQuotes = 1099,
+ CSSPropertyResize = 1100,
+ CSSPropertyRight = 1101,
+ CSSPropertySize = 1102,
+ CSSPropertySrc = 1103,
+ CSSPropertyTableLayout = 1104,
+ CSSPropertyTextAlign = 1105,
+ CSSPropertyTextDecoration = 1106,
+ CSSPropertyTextIndent = 1107,
+ CSSPropertyTextLineThrough = 1108,
+ CSSPropertyTextLineThroughColor = 1109,
+ CSSPropertyTextLineThroughMode = 1110,
+ CSSPropertyTextLineThroughStyle = 1111,
+ CSSPropertyTextLineThroughWidth = 1112,
+ CSSPropertyTextOverflow = 1113,
+ CSSPropertyTextOverline = 1114,
+ CSSPropertyTextOverlineColor = 1115,
+ CSSPropertyTextOverlineMode = 1116,
+ CSSPropertyTextOverlineStyle = 1117,
+ CSSPropertyTextOverlineWidth = 1118,
+ CSSPropertyTextRendering = 1119,
CSSPropertyTextShadow = 1120,
CSSPropertyTextTransform = 1121,
CSSPropertyTextUnderline = 1122,
@@ -172,109 +172,109 @@ enum CSSPropertyID {
CSSPropertyWebkitBoxOrient = 1165,
CSSPropertyWebkitBoxPack = 1166,
CSSPropertyWebkitBoxReflect = 1167,
- CSSPropertyWebkitBoxSizing = 1168,
- CSSPropertyWebkitColumnBreakAfter = 1169,
- CSSPropertyWebkitColumnBreakBefore = 1170,
- CSSPropertyWebkitColumnBreakInside = 1171,
- CSSPropertyWebkitColumnCount = 1172,
- CSSPropertyWebkitColumnGap = 1173,
- CSSPropertyWebkitColumnRule = 1174,
- CSSPropertyWebkitColumnRuleColor = 1175,
- CSSPropertyWebkitColumnRuleStyle = 1176,
- CSSPropertyWebkitColumnRuleWidth = 1177,
- CSSPropertyWebkitColumnWidth = 1178,
- CSSPropertyWebkitColumns = 1179,
- CSSPropertyWebkitFontSizeDelta = 1180,
- CSSPropertyWebkitFontSmoothing = 1181,
- CSSPropertyWebkitHighlight = 1182,
- CSSPropertyWebkitLineBreak = 1183,
- CSSPropertyWebkitLineClamp = 1184,
- CSSPropertyWebkitMarginBottomCollapse = 1185,
- CSSPropertyWebkitMarginCollapse = 1186,
- CSSPropertyWebkitMarginStart = 1187,
- CSSPropertyWebkitMarginTopCollapse = 1188,
- CSSPropertyWebkitMarquee = 1189,
- CSSPropertyWebkitMarqueeDirection = 1190,
- CSSPropertyWebkitMarqueeIncrement = 1191,
- CSSPropertyWebkitMarqueeRepetition = 1192,
- CSSPropertyWebkitMarqueeSpeed = 1193,
- CSSPropertyWebkitMarqueeStyle = 1194,
- CSSPropertyWebkitMask = 1195,
- CSSPropertyWebkitMaskAttachment = 1196,
- CSSPropertyWebkitMaskBoxImage = 1197,
- CSSPropertyWebkitMaskClip = 1198,
- CSSPropertyWebkitMaskComposite = 1199,
- CSSPropertyWebkitMaskImage = 1200,
- CSSPropertyWebkitMaskOrigin = 1201,
- CSSPropertyWebkitMaskPosition = 1202,
- CSSPropertyWebkitMaskPositionX = 1203,
- CSSPropertyWebkitMaskPositionY = 1204,
- CSSPropertyWebkitMaskRepeat = 1205,
- CSSPropertyWebkitMaskRepeatX = 1206,
- CSSPropertyWebkitMaskRepeatY = 1207,
- CSSPropertyWebkitMaskSize = 1208,
- CSSPropertyWebkitMatchNearestMailBlockquoteColor = 1209,
- CSSPropertyWebkitNbspMode = 1210,
- CSSPropertyWebkitPaddingStart = 1211,
- CSSPropertyWebkitPerspective = 1212,
- CSSPropertyWebkitPerspectiveOrigin = 1213,
- CSSPropertyWebkitPerspectiveOriginX = 1214,
- CSSPropertyWebkitPerspectiveOriginY = 1215,
- CSSPropertyWebkitRtlOrdering = 1216,
- CSSPropertyWebkitTextDecorationsInEffect = 1217,
- CSSPropertyWebkitTextFillColor = 1218,
- CSSPropertyWebkitTextSecurity = 1219,
- CSSPropertyWebkitTextSizeAdjust = 1220,
- CSSPropertyWebkitTextStroke = 1221,
- CSSPropertyWebkitTextStrokeColor = 1222,
- CSSPropertyWebkitTextStrokeWidth = 1223,
- CSSPropertyWebkitTransform = 1224,
- CSSPropertyWebkitTransformOrigin = 1225,
- CSSPropertyWebkitTransformOriginX = 1226,
- CSSPropertyWebkitTransformOriginY = 1227,
- CSSPropertyWebkitTransformOriginZ = 1228,
- CSSPropertyWebkitTransformStyle = 1229,
- CSSPropertyWebkitTransition = 1230,
- CSSPropertyWebkitTransitionDelay = 1231,
- CSSPropertyWebkitTransitionDuration = 1232,
- CSSPropertyWebkitTransitionProperty = 1233,
- CSSPropertyWebkitTransitionTimingFunction = 1234,
- CSSPropertyWebkitUserDrag = 1235,
- CSSPropertyWebkitUserModify = 1236,
- CSSPropertyWebkitUserSelect = 1237,
- CSSPropertyWebkitVariableDeclarationBlock = 1238,
- CSSPropertyClipPath = 1239,
- CSSPropertyClipRule = 1240,
- CSSPropertyMask = 1241,
- CSSPropertyEnableBackground = 1242,
- CSSPropertyFilter = 1243,
- CSSPropertyFloodColor = 1244,
- CSSPropertyFloodOpacity = 1245,
- CSSPropertyLightingColor = 1246,
- CSSPropertyStopColor = 1247,
- CSSPropertyStopOpacity = 1248,
- CSSPropertyColorInterpolation = 1249,
- CSSPropertyColorInterpolationFilters = 1250,
- CSSPropertyColorProfile = 1251,
- CSSPropertyColorRendering = 1252,
- CSSPropertyFill = 1253,
- CSSPropertyFillOpacity = 1254,
- CSSPropertyFillRule = 1255,
- CSSPropertyImageRendering = 1256,
- CSSPropertyMarker = 1257,
- CSSPropertyMarkerEnd = 1258,
- CSSPropertyMarkerMid = 1259,
- CSSPropertyMarkerStart = 1260,
- CSSPropertyShapeRendering = 1261,
- CSSPropertyStroke = 1262,
- CSSPropertyStrokeDasharray = 1263,
- CSSPropertyStrokeDashoffset = 1264,
- CSSPropertyStrokeLinecap = 1265,
- CSSPropertyStrokeLinejoin = 1266,
- CSSPropertyStrokeMiterlimit = 1267,
- CSSPropertyStrokeOpacity = 1268,
- CSSPropertyStrokeWidth = 1269,
- CSSPropertyTextRendering = 1270,
+ CSSPropertyWebkitBoxShadow = 1168,
+ CSSPropertyWebkitBoxSizing = 1169,
+ CSSPropertyWebkitColumnBreakAfter = 1170,
+ CSSPropertyWebkitColumnBreakBefore = 1171,
+ CSSPropertyWebkitColumnBreakInside = 1172,
+ CSSPropertyWebkitColumnCount = 1173,
+ CSSPropertyWebkitColumnGap = 1174,
+ CSSPropertyWebkitColumnRule = 1175,
+ CSSPropertyWebkitColumnRuleColor = 1176,
+ CSSPropertyWebkitColumnRuleStyle = 1177,
+ CSSPropertyWebkitColumnRuleWidth = 1178,
+ CSSPropertyWebkitColumnWidth = 1179,
+ CSSPropertyWebkitColumns = 1180,
+ CSSPropertyWebkitFontSizeDelta = 1181,
+ CSSPropertyWebkitFontSmoothing = 1182,
+ CSSPropertyWebkitHighlight = 1183,
+ CSSPropertyWebkitLineBreak = 1184,
+ CSSPropertyWebkitLineClamp = 1185,
+ CSSPropertyWebkitMarginBottomCollapse = 1186,
+ CSSPropertyWebkitMarginCollapse = 1187,
+ CSSPropertyWebkitMarginStart = 1188,
+ CSSPropertyWebkitMarginTopCollapse = 1189,
+ CSSPropertyWebkitMarquee = 1190,
+ CSSPropertyWebkitMarqueeDirection = 1191,
+ CSSPropertyWebkitMarqueeIncrement = 1192,
+ CSSPropertyWebkitMarqueeRepetition = 1193,
+ CSSPropertyWebkitMarqueeSpeed = 1194,
+ CSSPropertyWebkitMarqueeStyle = 1195,
+ CSSPropertyWebkitMask = 1196,
+ CSSPropertyWebkitMaskAttachment = 1197,
+ CSSPropertyWebkitMaskBoxImage = 1198,
+ CSSPropertyWebkitMaskClip = 1199,
+ CSSPropertyWebkitMaskComposite = 1200,
+ CSSPropertyWebkitMaskImage = 1201,
+ CSSPropertyWebkitMaskOrigin = 1202,
+ CSSPropertyWebkitMaskPosition = 1203,
+ CSSPropertyWebkitMaskPositionX = 1204,
+ CSSPropertyWebkitMaskPositionY = 1205,
+ CSSPropertyWebkitMaskRepeat = 1206,
+ CSSPropertyWebkitMaskRepeatX = 1207,
+ CSSPropertyWebkitMaskRepeatY = 1208,
+ CSSPropertyWebkitMaskSize = 1209,
+ CSSPropertyWebkitMatchNearestMailBlockquoteColor = 1210,
+ CSSPropertyWebkitNbspMode = 1211,
+ CSSPropertyWebkitPaddingStart = 1212,
+ CSSPropertyWebkitPerspective = 1213,
+ CSSPropertyWebkitPerspectiveOrigin = 1214,
+ CSSPropertyWebkitPerspectiveOriginX = 1215,
+ CSSPropertyWebkitPerspectiveOriginY = 1216,
+ CSSPropertyWebkitRtlOrdering = 1217,
+ CSSPropertyWebkitTextDecorationsInEffect = 1218,
+ CSSPropertyWebkitTextFillColor = 1219,
+ CSSPropertyWebkitTextSecurity = 1220,
+ CSSPropertyWebkitTextSizeAdjust = 1221,
+ CSSPropertyWebkitTextStroke = 1222,
+ CSSPropertyWebkitTextStrokeColor = 1223,
+ CSSPropertyWebkitTextStrokeWidth = 1224,
+ CSSPropertyWebkitTransform = 1225,
+ CSSPropertyWebkitTransformOrigin = 1226,
+ CSSPropertyWebkitTransformOriginX = 1227,
+ CSSPropertyWebkitTransformOriginY = 1228,
+ CSSPropertyWebkitTransformOriginZ = 1229,
+ CSSPropertyWebkitTransformStyle = 1230,
+ CSSPropertyWebkitTransition = 1231,
+ CSSPropertyWebkitTransitionDelay = 1232,
+ CSSPropertyWebkitTransitionDuration = 1233,
+ CSSPropertyWebkitTransitionProperty = 1234,
+ CSSPropertyWebkitTransitionTimingFunction = 1235,
+ CSSPropertyWebkitUserDrag = 1236,
+ CSSPropertyWebkitUserModify = 1237,
+ CSSPropertyWebkitUserSelect = 1238,
+ CSSPropertyWebkitVariableDeclarationBlock = 1239,
+ CSSPropertyClipPath = 1240,
+ CSSPropertyClipRule = 1241,
+ CSSPropertyMask = 1242,
+ CSSPropertyEnableBackground = 1243,
+ CSSPropertyFilter = 1244,
+ CSSPropertyFloodColor = 1245,
+ CSSPropertyFloodOpacity = 1246,
+ CSSPropertyLightingColor = 1247,
+ CSSPropertyStopColor = 1248,
+ CSSPropertyStopOpacity = 1249,
+ CSSPropertyColorInterpolation = 1250,
+ CSSPropertyColorInterpolationFilters = 1251,
+ CSSPropertyColorProfile = 1252,
+ CSSPropertyColorRendering = 1253,
+ CSSPropertyFill = 1254,
+ CSSPropertyFillOpacity = 1255,
+ CSSPropertyFillRule = 1256,
+ CSSPropertyImageRendering = 1257,
+ CSSPropertyMarker = 1258,
+ CSSPropertyMarkerEnd = 1259,
+ CSSPropertyMarkerMid = 1260,
+ CSSPropertyMarkerStart = 1261,
+ CSSPropertyShapeRendering = 1262,
+ CSSPropertyStroke = 1263,
+ CSSPropertyStrokeDasharray = 1264,
+ CSSPropertyStrokeDashoffset = 1265,
+ CSSPropertyStrokeLinecap = 1266,
+ CSSPropertyStrokeLinejoin = 1267,
+ CSSPropertyStrokeMiterlimit = 1268,
+ CSSPropertyStrokeOpacity = 1269,
+ CSSPropertyStrokeWidth = 1270,
CSSPropertyAlignmentBaseline = 1271,
CSSPropertyBaselineShift = 1272,
CSSPropertyDominantBaseline = 1273,
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
index 1975392..c2143c5 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
+++ b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.c
@@ -191,7 +191,7 @@ findValue (register const char *str, register unsigned int len)
{
enum
{
- TOTAL_KEYWORDS = 548,
+ TOTAL_KEYWORDS = 549,
MIN_WORD_LENGTH = 2,
MAX_WORD_LENGTH = 31,
MIN_HASH_VALUE = 0,
@@ -206,7 +206,7 @@ findValue (register const char *str, register unsigned int len)
{"300", CSSValue300},
#line 289 "CSSValueKeywords.gperf"
{"end", CSSValueEnd},
-#line 556 "CSSValueKeywords.gperf"
+#line 557 "CSSValueKeywords.gperf"
{"lr", CSSValueLr},
#line 48 "CSSValueKeywords.gperf"
{"900", CSSValue900},
@@ -226,7 +226,7 @@ findValue (register const char *str, register unsigned int len)
{"400", CSSValue400},
#line 41 "CSSValueKeywords.gperf"
{"200", CSSValue200},
-#line 490 "CSSValueKeywords.gperf"
+#line 494 "CSSValueKeywords.gperf"
{"oldlace", CSSValueOldlace},
#line 71 "CSSValueKeywords.gperf"
{"cursive", CSSValueCursive},
@@ -234,13 +234,13 @@ findValue (register const char *str, register unsigned int len)
{"above", CSSValueAbove},
#line 253 "CSSValueKeywords.gperf"
{"cross", CSSValueCross},
-#line 411 "CSSValueKeywords.gperf"
+#line 415 "CSSValueKeywords.gperf"
{"coral", CSSValueCoral},
#line 13 "CSSValueKeywords.gperf"
{"none", CSSValueNone},
-#line 502 "CSSValueKeywords.gperf"
+#line 506 "CSSValueKeywords.gperf"
{"plum", CSSValuePlum},
-#line 558 "CSSValueKeywords.gperf"
+#line 559 "CSSValueKeywords.gperf"
{"tb", CSSValueTb},
#line 86 "CSSValueKeywords.gperf"
{"purple", CSSValuePurple},
@@ -258,7 +258,7 @@ findValue (register const char *str, register unsigned int len)
{"monospace", CSSValueMonospace},
#line 216 "CSSValueKeywords.gperf"
{"e-resize", CSSValueEResize},
-#line 378 "CSSValueKeywords.gperf"
+#line 379 "CSSValueKeywords.gperf"
{"lines", CSSValueLines},
#line 222 "CSSValueKeywords.gperf"
{"s-resize", CSSValueSResize},
@@ -272,7 +272,7 @@ findValue (register const char *str, register unsigned int len)
{"lime", CSSValueLime},
#line 164 "CSSValueKeywords.gperf"
{"circle", CSSValueCircle},
-#line 474 "CSSValueKeywords.gperf"
+#line 478 "CSSValueKeywords.gperf"
{"linen", CSSValueLinen},
#line 219 "CSSValueKeywords.gperf"
{"n-resize", CSSValueNResize},
@@ -280,15 +280,15 @@ findValue (register const char *str, register unsigned int len)
{"inset", CSSValueInset},
#line 296 "CSSValueKeywords.gperf"
{"multiple", CSSValueMultiple},
-#line 410 "CSSValueKeywords.gperf"
+#line 414 "CSSValueKeywords.gperf"
{"chocolate", CSSValueChocolate},
#line 314 "CSSValueKeywords.gperf"
{"clip", CSSValueClip},
-#line 374 "CSSValueKeywords.gperf"
+#line 375 "CSSValueKeywords.gperf"
{"contain", CSSValueContain},
-#line 414 "CSSValueKeywords.gperf"
+#line 418 "CSSValueKeywords.gperf"
{"crimson", CSSValueCrimson},
-#line 413 "CSSValueKeywords.gperf"
+#line 417 "CSSValueKeywords.gperf"
{"cornsilk", CSSValueCornsilk},
#line 187 "CSSValueKeywords.gperf"
{"compact", CSSValueCompact},
@@ -296,21 +296,21 @@ findValue (register const char *str, register unsigned int len)
{"scroll", CSSValueScroll},
#line 254 "CSSValueKeywords.gperf"
{"embed", CSSValueEmbed},
-#line 521 "CSSValueKeywords.gperf"
+#line 525 "CSSValueKeywords.gperf"
{"tomato", CSSValueTomato},
#line 150 "CSSValueKeywords.gperf"
{"top", CSSValueTop},
#line 264 "CSSValueKeywords.gperf"
{"loud", CSSValueLoud},
-#line 370 "CSSValueKeywords.gperf"
+#line 371 "CSSValueKeywords.gperf"
{"content", CSSValueContent},
#line 77 "CSSValueKeywords.gperf"
{"blue", CSSValueBlue},
#line 263 "CSSValueKeywords.gperf"
{"local", CSSValueLocal},
-#line 523 "CSSValueKeywords.gperf"
+#line 527 "CSSValueKeywords.gperf"
{"violet", CSSValueViolet},
-#line 501 "CSSValueKeywords.gperf"
+#line 505 "CSSValueKeywords.gperf"
{"pink", CSSValuePink},
#line 284 "CSSValueKeywords.gperf"
{"thin", CSSValueThin},
@@ -324,23 +324,23 @@ findValue (register const char *str, register unsigned int len)
{"initial", CSSValueInitial},
#line 82 "CSSValueKeywords.gperf"
{"maroon", CSSValueMaroon},
-#line 383 "CSSValueKeywords.gperf"
+#line 384 "CSSValueKeywords.gperf"
{"ease", CSSValueEase},
-#line 507 "CSSValueKeywords.gperf"
+#line 511 "CSSValueKeywords.gperf"
{"salmon", CSSValueSalmon},
-#line 519 "CSSValueKeywords.gperf"
+#line 523 "CSSValueKeywords.gperf"
{"tan", CSSValueTan},
-#line 358 "CSSValueKeywords.gperf"
+#line 359 "CSSValueKeywords.gperf"
{"caret", CSSValueCaret},
-#line 520 "CSSValueKeywords.gperf"
+#line 524 "CSSValueKeywords.gperf"
{"thistle", CSSValueThistle},
#line 189 "CSSValueKeywords.gperf"
{"table", CSSValueTable},
#line 283 "CSSValueKeywords.gperf"
{"thick", CSSValueThick},
-#line 488 "CSSValueKeywords.gperf"
+#line 492 "CSSValueKeywords.gperf"
{"moccasin", CSSValueMoccasin},
-#line 553 "CSSValueKeywords.gperf"
+#line 554 "CSSValueKeywords.gperf"
{"lr-tb", CSSValueLrTb},
#line 162 "CSSValueKeywords.gperf"
{"inside", CSSValueInside},
@@ -348,23 +348,23 @@ findValue (register const char *str, register unsigned int len)
{"slide", CSSValueSlide},
#line 145 "CSSValueKeywords.gperf"
{"middle", CSSValueMiddle},
-#line 401 "CSSValueKeywords.gperf"
+#line 405 "CSSValueKeywords.gperf"
{"azure", CSSValueAzure},
#line 75 "CSSValueKeywords.gperf"
{"aqua", CSSValueAqua},
-#line 415 "CSSValueKeywords.gperf"
+#line 419 "CSSValueKeywords.gperf"
{"cyan", CSSValueCyan},
-#line 557 "CSSValueKeywords.gperf"
+#line 558 "CSSValueKeywords.gperf"
{"rl", CSSValueRl},
#line 324 "CSSValueKeywords.gperf"
{"space", CSSValueSpace},
-#line 405 "CSSValueKeywords.gperf"
+#line 409 "CSSValueKeywords.gperf"
{"blueviolet", CSSValueBlueviolet},
#line 184 "CSSValueKeywords.gperf"
{"block", CSSValueBlock},
#line 163 "CSSValueKeywords.gperf"
{"disc", CSSValueDisc},
-#line 334 "CSSValueKeywords.gperf"
+#line 335 "CSSValueKeywords.gperf"
{"listitem", CSSValueListitem},
#line 16 "CSSValueKeywords.gperf"
{"groove", CSSValueGroove},
@@ -372,13 +372,13 @@ findValue (register const char *str, register unsigned int len)
{"ltr", CSSValueLtr},
#line 202 "CSSValueKeywords.gperf"
{"auto", CSSValueAuto},
-#line 453 "CSSValueKeywords.gperf"
+#line 457 "CSSValueKeywords.gperf"
{"khaki", CSSValueKhaki},
-#line 451 "CSSValueKeywords.gperf"
+#line 455 "CSSValueKeywords.gperf"
{"indigo", CSSValueIndigo},
-#line 555 "CSSValueKeywords.gperf"
+#line 556 "CSSValueKeywords.gperf"
{"tb-rl", CSSValueTbRl},
-#line 380 "CSSValueKeywords.gperf"
+#line 381 "CSSValueKeywords.gperf"
{"paused", CSSValuePaused},
#line 22 "CSSValueKeywords.gperf"
{"double", CSSValueDouble},
@@ -390,7 +390,7 @@ findValue (register const char *str, register unsigned int len)
{"visible", CSSValueVisible},
#line 37 "CSSValueKeywords.gperf"
{"bold", CSSValueBold},
-#line 516 "CSSValueKeywords.gperf"
+#line 520 "CSSValueKeywords.gperf"
{"snow", CSSValueSnow},
#line 249 "CSSValueKeywords.gperf"
{"blink", CSSValueBlink},
@@ -398,7 +398,7 @@ findValue (register const char *str, register unsigned int len)
{"move", CSSValueMove},
#line 302 "CSSValueKeywords.gperf"
{"slow", CSSValueSlow},
-#line 384 "CSSValueKeywords.gperf"
+#line 385 "CSSValueKeywords.gperf"
{"linear", CSSValueLinear},
#line 88 "CSSValueKeywords.gperf"
{"silver", CSSValueSilver},
@@ -410,9 +410,9 @@ findValue (register const char *str, register unsigned int len)
{"caption", CSSValueCaption},
#line 18 "CSSValueKeywords.gperf"
{"outset", CSSValueOutset},
-#line 395 "CSSValueKeywords.gperf"
+#line 396 "CSSValueKeywords.gperf"
{"stroke", CSSValueStroke},
-#line 527 "CSSValueKeywords.gperf"
+#line 531 "CSSValueKeywords.gperf"
{"nonzero", CSSValueNonzero},
#line 295 "CSSValueKeywords.gperf"
{"single", CSSValueSingle},
@@ -426,7 +426,7 @@ findValue (register const char *str, register unsigned int len)
{"black", CSSValueBlack},
#line 223 "CSSValueKeywords.gperf"
{"w-resize", CSSValueWResize},
-#line 428 "CSSValueKeywords.gperf"
+#line 432 "CSSValueKeywords.gperf"
{"darksalmon", CSSValueDarksalmon},
#line 304 "CSSValueKeywords.gperf"
{"infinite", CSSValueInfinite},
@@ -436,13 +436,13 @@ findValue (register const char *str, register unsigned int len)
{"inactivecaption", CSSValueInactivecaption},
#line 144 "CSSValueKeywords.gperf"
{"baseline", CSSValueBaseline},
-#line 367 "CSSValueKeywords.gperf"
+#line 368 "CSSValueKeywords.gperf"
{"round", CSSValueRound},
#line 238 "CSSValueKeywords.gperf"
{"capitalize", CSSValueCapitalize},
#line 244 "CSSValueKeywords.gperf"
{"absolute", CSSValueAbsolute},
-#line 486 "CSSValueKeywords.gperf"
+#line 490 "CSSValueKeywords.gperf"
{"mintcream", CSSValueMintcream},
#line 33 "CSSValueKeywords.gperf"
{"oblique", CSSValueOblique},
@@ -452,15 +452,15 @@ findValue (register const char *str, register unsigned int len)
{"large", CSSValueLarge},
#line 274 "CSSValueKeywords.gperf"
{"portrait", CSSValuePortrait},
-#line 445 "CSSValueKeywords.gperf"
+#line 449 "CSSValueKeywords.gperf"
{"gold", CSSValueGold},
#line 57 "CSSValueKeywords.gperf"
{"smaller", CSSValueSmaller},
-#line 434 "CSSValueKeywords.gperf"
+#line 438 "CSSValueKeywords.gperf"
{"darkviolet", CSSValueDarkviolet},
-#line 377 "CSSValueKeywords.gperf"
+#line 378 "CSSValueKeywords.gperf"
{"visual", CSSValueVisual},
-#line 450 "CSSValueKeywords.gperf"
+#line 454 "CSSValueKeywords.gperf"
{"indianred", CSSValueIndianred},
#line 85 "CSSValueKeywords.gperf"
{"orange", CSSValueOrange},
@@ -470,13 +470,13 @@ findValue (register const char *str, register unsigned int len)
{"pointer", CSSValuePointer},
#line 90 "CSSValueKeywords.gperf"
{"white", CSSValueWhite},
-#line 522 "CSSValueKeywords.gperf"
+#line 526 "CSSValueKeywords.gperf"
{"turquoise", CSSValueTurquoise},
#line 212 "CSSValueKeywords.gperf"
{"no-drop", CSSValueNoDrop},
-#line 554 "CSSValueKeywords.gperf"
+#line 555 "CSSValueKeywords.gperf"
{"rl-tb", CSSValueRlTb},
-#line 393 "CSSValueKeywords.gperf"
+#line 394 "CSSValueKeywords.gperf"
{"painted", CSSValuePainted},
#line 208 "CSSValueKeywords.gperf"
{"cell", CSSValueCell},
@@ -486,27 +486,27 @@ findValue (register const char *str, register unsigned int len)
{"pre", CSSValuePre},
#line 165 "CSSValueKeywords.gperf"
{"square", CSSValueSquare},
-#line 396 "CSSValueKeywords.gperf"
+#line 397 "CSSValueKeywords.gperf"
{"antialiased", CSSValueAntialiased},
-#line 537 "CSSValueKeywords.gperf"
+#line 539 "CSSValueKeywords.gperf"
{"butt", CSSValueButt},
-#line 406 "CSSValueKeywords.gperf"
+#line 410 "CSSValueKeywords.gperf"
{"brown", CSSValueBrown},
#line 32 "CSSValueKeywords.gperf"
{"italic", CSSValueItalic},
-#line 535 "CSSValueKeywords.gperf"
+#line 538 "CSSValueKeywords.gperf"
{"crispedges", CSSValueCrispedges},
-#line 512 "CSSValueKeywords.gperf"
+#line 516 "CSSValueKeywords.gperf"
{"skyblue", CSSValueSkyblue},
#line 330 "CSSValueKeywords.gperf"
{"button", CSSValueButton},
-#line 525 "CSSValueKeywords.gperf"
+#line 529 "CSSValueKeywords.gperf"
{"whitesmoke", CSSValueWhitesmoke},
#line 282 "CSSValueKeywords.gperf"
{"static", CSSValueStatic},
#line 237 "CSSValueKeywords.gperf"
{"rtl", CSSValueRtl},
-#line 400 "CSSValueKeywords.gperf"
+#line 404 "CSSValueKeywords.gperf"
{"aquamarine", CSSValueAquamarine},
#line 310 "CSSValueKeywords.gperf"
{"element", CSSValueElement},
@@ -516,31 +516,31 @@ findValue (register const char *str, register unsigned int len)
{"bottom", CSSValueBottom},
#line 114 "CSSValueKeywords.gperf"
{"scrollbar", CSSValueScrollbar},
-#line 394 "CSSValueKeywords.gperf"
+#line 395 "CSSValueKeywords.gperf"
{"fill", CSSValueFill},
-#line 368 "CSSValueKeywords.gperf"
+#line 369 "CSSValueKeywords.gperf"
{"border", CSSValueBorder},
#line 35 "CSSValueKeywords.gperf"
{"small-caps", CSSValueSmallCaps},
#line 211 "CSSValueKeywords.gperf"
{"progress", CSSValueProgress},
-#line 379 "CSSValueKeywords.gperf"
+#line 380 "CSSValueKeywords.gperf"
{"running", CSSValueRunning},
#line 38 "CSSValueKeywords.gperf"
{"bolder", CSSValueBolder},
-#line 398 "CSSValueKeywords.gperf"
+#line 402 "CSSValueKeywords.gperf"
{"aliceblue", CSSValueAliceblue},
#line 197 "CSSValueKeywords.gperf"
{"table-cell", CSSValueTableCell},
-#line 375 "CSSValueKeywords.gperf"
+#line 376 "CSSValueKeywords.gperf"
{"cover", CSSValueCover},
-#line 385 "CSSValueKeywords.gperf"
+#line 386 "CSSValueKeywords.gperf"
{"ease-in", CSSValueEaseIn},
#line 92 "CSSValueKeywords.gperf"
{"transparent", CSSValueTransparent},
-#line 511 "CSSValueKeywords.gperf"
+#line 515 "CSSValueKeywords.gperf"
{"sienna", CSSValueSienna},
-#line 390 "CSSValueKeywords.gperf"
+#line 391 "CSSValueKeywords.gperf"
{"visiblepainted", CSSValueVisiblepainted},
#line 285 "CSSValueKeywords.gperf"
{"underline", CSSValueUnderline},
@@ -558,13 +558,13 @@ findValue (register const char *str, register unsigned int len)
{"ahead", CSSValueAhead},
#line 185 "CSSValueKeywords.gperf"
{"list-item", CSSValueListItem},
-#line 376 "CSSValueKeywords.gperf"
+#line 377 "CSSValueKeywords.gperf"
{"logical", CSSValueLogical},
#line 186 "CSSValueKeywords.gperf"
{"run-in", CSSValueRunIn},
#line 259 "CSSValueKeywords.gperf"
{"invert", CSSValueInvert},
-#line 372 "CSSValueKeywords.gperf"
+#line 373 "CSSValueKeywords.gperf"
{"padding", CSSValuePadding},
#line 306 "CSSValueKeywords.gperf"
{"alternate", CSSValueAlternate},
@@ -578,15 +578,15 @@ findValue (register const char *str, register unsigned int len)
{"inline-table", CSSValueInlineTable},
#line 19 "CSSValueKeywords.gperf"
{"dotted", CSSValueDotted},
-#line 538 "CSSValueKeywords.gperf"
+#line 540 "CSSValueKeywords.gperf"
{"miter", CSSValueMiter},
-#line 473 "CSSValueKeywords.gperf"
+#line 477 "CSSValueKeywords.gperf"
{"limegreen", CSSValueLimegreen},
#line 312 "CSSValueKeywords.gperf"
{"intrinsic", CSSValueIntrinsic},
#line 141 "CSSValueKeywords.gperf"
{"xor", CSSValueXor},
-#line 491 "CSSValueKeywords.gperf"
+#line 495 "CSSValueKeywords.gperf"
{"olivedrab", CSSValueOlivedrab},
#line 188 "CSSValueKeywords.gperf"
{"inline-block", CSSValueInlineBlock},
@@ -594,13 +594,13 @@ findValue (register const char *str, register unsigned int len)
{"source-in", CSSValueSourceIn},
#line 316 "CSSValueKeywords.gperf"
{"discard", CSSValueDiscard},
-#line 497 "CSSValueKeywords.gperf"
+#line 501 "CSSValueKeywords.gperf"
{"palevioletred", CSSValuePalevioletred},
#line 27 "CSSValueKeywords.gperf"
{"small-caption", CSSValueSmallCaption},
-#line 533 "CSSValueKeywords.gperf"
+#line 399 "CSSValueKeywords.gperf"
{"optimizespeed", CSSValueOptimizespeed},
-#line 388 "CSSValueKeywords.gperf"
+#line 389 "CSSValueKeywords.gperf"
{"document", CSSValueDocument},
#line 89 "CSSValueKeywords.gperf"
{"teal", CSSValueTeal},
@@ -608,15 +608,15 @@ findValue (register const char *str, register unsigned int len)
{"larger", CSSValueLarger},
#line 116 "CSSValueKeywords.gperf"
{"threedface", CSSValueThreedface},
-#line 403 "CSSValueKeywords.gperf"
+#line 407 "CSSValueKeywords.gperf"
{"bisque", CSSValueBisque},
-#line 381 "CSSValueKeywords.gperf"
+#line 382 "CSSValueKeywords.gperf"
{"flat", CSSValueFlat},
-#line 408 "CSSValueKeywords.gperf"
+#line 412 "CSSValueKeywords.gperf"
{"cadetblue", CSSValueCadetblue},
-#line 513 "CSSValueKeywords.gperf"
+#line 517 "CSSValueKeywords.gperf"
{"slateblue", CSSValueSlateblue},
-#line 392 "CSSValueKeywords.gperf"
+#line 393 "CSSValueKeywords.gperf"
{"visiblestroke", CSSValueVisiblestroke},
#line 87 "CSSValueKeywords.gperf"
{"red", CSSValueRed},
@@ -624,11 +624,11 @@ findValue (register const char *str, register unsigned int len)
{"table-caption", CSSValueTableCaption},
#line 136 "CSSValueKeywords.gperf"
{"source-atop", CSSValueSourceAtop},
-#line 423 "CSSValueKeywords.gperf"
+#line 427 "CSSValueKeywords.gperf"
{"darkmagenta", CSSValueDarkmagenta},
#line 50 "CSSValueKeywords.gperf"
{"x-small", CSSValueXSmall},
-#line 531 "CSSValueKeywords.gperf"
+#line 535 "CSSValueKeywords.gperf"
{"srgb", CSSValueSrgb},
#line 228 "CSSValueKeywords.gperf"
{"col-resize", CSSValueColResize},
@@ -638,9 +638,9 @@ findValue (register const char *str, register unsigned int len)
{"fast", CSSValueFast},
#line 131 "CSSValueKeywords.gperf"
{"clear", CSSValueClear},
-#line 427 "CSSValueKeywords.gperf"
+#line 431 "CSSValueKeywords.gperf"
{"darkred", CSSValueDarkred},
-#line 495 "CSSValueKeywords.gperf"
+#line 499 "CSSValueKeywords.gperf"
{"palegreen", CSSValuePalegreen},
#line 320 "CSSValueKeywords.gperf"
{"continuous", CSSValueContinuous},
@@ -662,15 +662,15 @@ findValue (register const char *str, register unsigned int len)
{"menu", CSSValueMenu},
#line 267 "CSSValueKeywords.gperf"
{"mix", CSSValueMix},
-#line 543 "CSSValueKeywords.gperf"
+#line 544 "CSSValueKeywords.gperf"
{"central", CSSValueCentral},
#line 154 "CSSValueKeywords.gperf"
{"left", CSSValueLeft},
#line 14 "CSSValueKeywords.gperf"
{"hidden", CSSValueHidden},
-#line 500 "CSSValueKeywords.gperf"
+#line 504 "CSSValueKeywords.gperf"
{"peru", CSSValuePeru},
-#line 475 "CSSValueKeywords.gperf"
+#line 479 "CSSValueKeywords.gperf"
{"magenta", CSSValueMagenta},
#line 278 "CSSValueKeywords.gperf"
{"relative", CSSValueRelative},
@@ -682,11 +682,11 @@ findValue (register const char *str, register unsigned int len)
{"medium", CSSValueMedium},
#line 220 "CSSValueKeywords.gperf"
{"se-resize", CSSValueSeResize},
-#line 389 "CSSValueKeywords.gperf"
+#line 390 "CSSValueKeywords.gperf"
{"reset", CSSValueReset},
-#line 505 "CSSValueKeywords.gperf"
+#line 509 "CSSValueKeywords.gperf"
{"royalblue", CSSValueRoyalblue},
-#line 416 "CSSValueKeywords.gperf"
+#line 420 "CSSValueKeywords.gperf"
{"darkblue", CSSValueDarkblue},
#line 217 "CSSValueKeywords.gperf"
{"ne-resize", CSSValueNeResize},
@@ -696,17 +696,17 @@ findValue (register const char *str, register unsigned int len)
{"appworkspace", CSSValueAppworkspace},
#line 251 "CSSValueKeywords.gperf"
{"close-quote", CSSValueCloseQuote},
-#line 391 "CSSValueKeywords.gperf"
+#line 392 "CSSValueKeywords.gperf"
{"visiblefill", CSSValueVisiblefill},
-#line 492 "CSSValueKeywords.gperf"
+#line 496 "CSSValueKeywords.gperf"
{"orangered", CSSValueOrangered},
#line 120 "CSSValueKeywords.gperf"
{"window", CSSValueWindow},
-#line 524 "CSSValueKeywords.gperf"
+#line 528 "CSSValueKeywords.gperf"
{"wheat", CSSValueWheat},
-#line 493 "CSSValueKeywords.gperf"
+#line 497 "CSSValueKeywords.gperf"
{"orchid", CSSValueOrchid},
-#line 446 "CSSValueKeywords.gperf"
+#line 450 "CSSValueKeywords.gperf"
{"goldenrod", CSSValueGoldenrod},
#line 127 "CSSValueKeywords.gperf"
{"repeat", CSSValueRepeat},
@@ -718,33 +718,33 @@ findValue (register const char *str, register unsigned int len)
{"no-close-quote", CSSValueNoCloseQuote},
#line 313 "CSSValueKeywords.gperf"
{"min-intrinsic", CSSValueMinIntrinsic},
-#line 350 "CSSValueKeywords.gperf"
+#line 351 "CSSValueKeywords.gperf"
{"menulist", CSSValueMenulist},
#line 203 "CSSValueKeywords.gperf"
{"crosshair", CSSValueCrosshair},
-#line 454 "CSSValueKeywords.gperf"
+#line 458 "CSSValueKeywords.gperf"
{"lavender", CSSValueLavender},
#line 133 "CSSValueKeywords.gperf"
{"source-over", CSSValueSourceOver},
#line 276 "CSSValueKeywords.gperf"
{"pre-line", CSSValuePreLine},
-#line 420 "CSSValueKeywords.gperf"
+#line 424 "CSSValueKeywords.gperf"
{"darkgreen", CSSValueDarkgreen},
-#line 430 "CSSValueKeywords.gperf"
+#line 434 "CSSValueKeywords.gperf"
{"darkslateblue", CSSValueDarkslateblue},
#line 269 "CSSValueKeywords.gperf"
{"no-open-quote", CSSValueNoOpenQuote},
-#line 429 "CSSValueKeywords.gperf"
+#line 433 "CSSValueKeywords.gperf"
{"darkseagreen", CSSValueDarkseagreen},
-#line 425 "CSSValueKeywords.gperf"
+#line 429 "CSSValueKeywords.gperf"
{"darkorange", CSSValueDarkorange},
-#line 547 "CSSValueKeywords.gperf"
+#line 548 "CSSValueKeywords.gperf"
{"alphabetic", CSSValueAlphabetic},
#line 265 "CSSValueKeywords.gperf"
{"lower", CSSValueLower},
-#line 386 "CSSValueKeywords.gperf"
+#line 387 "CSSValueKeywords.gperf"
{"ease-out", CSSValueEaseOut},
-#line 551 "CSSValueKeywords.gperf"
+#line 552 "CSSValueKeywords.gperf"
{"no-change", CSSValueNoChange},
#line 287 "CSSValueKeywords.gperf"
{"stretch", CSSValueStretch},
@@ -752,15 +752,15 @@ findValue (register const char *str, register unsigned int len)
{"table-column", CSSValueTableColumn},
#line 240 "CSSValueKeywords.gperf"
{"lowercase", CSSValueLowercase},
-#line 424 "CSSValueKeywords.gperf"
+#line 428 "CSSValueKeywords.gperf"
{"darkolivegreen", CSSValueDarkolivegreen},
-#line 517 "CSSValueKeywords.gperf"
+#line 521 "CSSValueKeywords.gperf"
{"springgreen", CSSValueSpringgreen},
-#line 539 "CSSValueKeywords.gperf"
+#line 541 "CSSValueKeywords.gperf"
{"bevel", CSSValueBevel},
#line 179 "CSSValueKeywords.gperf"
{"hiragana", CSSValueHiragana},
-#line 529 "CSSValueKeywords.gperf"
+#line 533 "CSSValueKeywords.gperf"
{"accumulate", CSSValueAccumulate},
#line 247 "CSSValueKeywords.gperf"
{"below", CSSValueBelow},
@@ -768,7 +768,7 @@ findValue (register const char *str, register unsigned int len)
{"nowrap", CSSValueNowrap},
#line 69 "CSSValueKeywords.gperf"
{"serif", CSSValueSerif},
-#line 443 "CSSValueKeywords.gperf"
+#line 447 "CSSValueKeywords.gperf"
{"gainsboro", CSSValueGainsboro},
#line 224 "CSSValueKeywords.gperf"
{"ew-resize", CSSValueEwResize},
@@ -776,21 +776,21 @@ findValue (register const char *str, register unsigned int len)
{"sw-resize", CSSValueSwResize},
#line 135 "CSSValueKeywords.gperf"
{"source-out", CSSValueSourceOut},
-#line 402 "CSSValueKeywords.gperf"
+#line 406 "CSSValueKeywords.gperf"
{"beige", CSSValueBeige},
#line 60 "CSSValueKeywords.gperf"
{"narrower", CSSValueNarrower},
#line 218 "CSSValueKeywords.gperf"
{"nw-resize", CSSValueNwResize},
-#line 333 "CSSValueKeywords.gperf"
+#line 334 "CSSValueKeywords.gperf"
{"listbox", CSSValueListbox},
-#line 449 "CSSValueKeywords.gperf"
+#line 453 "CSSValueKeywords.gperf"
{"hotpink", CSSValueHotpink},
#line 99 "CSSValueKeywords.gperf"
{"buttonface", CSSValueButtonface},
-#line 494 "CSSValueKeywords.gperf"
+#line 498 "CSSValueKeywords.gperf"
{"palegoldenrod", CSSValuePalegoldenrod},
-#line 532 "CSSValueKeywords.gperf"
+#line 536 "CSSValueKeywords.gperf"
{"linearrgb", CSSValueLinearrgb},
#line 20 "CSSValueKeywords.gperf"
{"dashed", CSSValueDashed},
@@ -802,57 +802,59 @@ findValue (register const char *str, register unsigned int len)
{"break-all", CSSValueBreakAll},
#line 250 "CSSValueKeywords.gperf"
{"both", CSSValueBoth},
-#line 409 "CSSValueKeywords.gperf"
+#line 413 "CSSValueKeywords.gperf"
{"chartreuse", CSSValueChartreuse},
-#line 506 "CSSValueKeywords.gperf"
+#line 510 "CSSValueKeywords.gperf"
{"saddlebrown", CSSValueSaddlebrown},
#line 331 "CSSValueKeywords.gperf"
{"button-bevel", CSSValueButtonBevel},
-#line 422 "CSSValueKeywords.gperf"
+#line 426 "CSSValueKeywords.gperf"
{"darkkhaki", CSSValueDarkkhaki},
#line 66 "CSSValueKeywords.gperf"
{"expanded", CSSValueExpanded},
#line 232 "CSSValueKeywords.gperf"
{"help", CSSValueHelp},
-#line 440 "CSSValueKeywords.gperf"
+#line 444 "CSSValueKeywords.gperf"
{"firebrick", CSSValueFirebrick},
-#line 528 "CSSValueKeywords.gperf"
+#line 532 "CSSValueKeywords.gperf"
{"evenodd", CSSValueEvenodd},
#line 142 "CSSValueKeywords.gperf"
{"plus-darker", CSSValuePlusDarker},
#line 273 "CSSValueKeywords.gperf"
{"overline", CSSValueOverline},
-#line 417 "CSSValueKeywords.gperf"
+#line 421 "CSSValueKeywords.gperf"
{"darkcyan", CSSValueDarkcyan},
#line 293 "CSSValueKeywords.gperf"
{"inline-axis", CSSValueInlineAxis},
#line 107 "CSSValueKeywords.gperf"
{"inactiveborder", CSSValueInactiveborder},
-#line 442 "CSSValueKeywords.gperf"
+#line 446 "CSSValueKeywords.gperf"
{"forestgreen", CSSValueForestgreen},
#line 103 "CSSValueKeywords.gperf"
{"captiontext", CSSValueCaptiontext},
-#line 530 "CSSValueKeywords.gperf"
+#line 534 "CSSValueKeywords.gperf"
{"new", CSSValueNew},
#line 79 "CSSValueKeywords.gperf"
{"gray", CSSValueGray},
#line 194 "CSSValueKeywords.gperf"
{"table-row", CSSValueTableRow},
-#line 549 "CSSValueKeywords.gperf"
+#line 333 "CSSValueKeywords.gperf"
+ {"list-button", CSSValueListButton},
+#line 550 "CSSValueKeywords.gperf"
{"mathematical", CSSValueMathematical},
#line 213 "CSSValueKeywords.gperf"
{"not-allowed", CSSValueNotAllowed},
-#line 439 "CSSValueKeywords.gperf"
+#line 443 "CSSValueKeywords.gperf"
{"dodgerblue", CSSValueDodgerblue},
-#line 487 "CSSValueKeywords.gperf"
+#line 491 "CSSValueKeywords.gperf"
{"mistyrose", CSSValueMistyrose},
#line 174 "CSSValueKeywords.gperf"
{"upper-latin", CSSValueUpperLatin},
#line 109 "CSSValueKeywords.gperf"
{"inactivecaptiontext", CSSValueInactivecaptiontext},
-#line 509 "CSSValueKeywords.gperf"
+#line 513 "CSSValueKeywords.gperf"
{"seagreen", CSSValueSeagreen},
-#line 355 "CSSValueKeywords.gperf"
+#line 356 "CSSValueKeywords.gperf"
{"slider-vertical", CSSValueSliderVertical},
#line 54 "CSSValueKeywords.gperf"
{"x-large", CSSValueXLarge},
@@ -862,35 +864,35 @@ findValue (register const char *str, register unsigned int len)
{"semi-condensed", CSSValueSemiCondensed},
#line 78 "CSSValueKeywords.gperf"
{"fuchsia", CSSValueFuchsia},
-#line 418 "CSSValueKeywords.gperf"
+#line 422 "CSSValueKeywords.gperf"
{"darkgoldenrod", CSSValueDarkgoldenrod},
#line 297 "CSSValueKeywords.gperf"
{"forwards", CSSValueForwards},
-#line 510 "CSSValueKeywords.gperf"
+#line 514 "CSSValueKeywords.gperf"
{"seashell", CSSValueSeashell},
#line 298 "CSSValueKeywords.gperf"
{"backwards", CSSValueBackwards},
#line 119 "CSSValueKeywords.gperf"
{"threedshadow", CSSValueThreedshadow},
-#line 382 "CSSValueKeywords.gperf"
+#line 383 "CSSValueKeywords.gperf"
{"preserve-3d", CSSValuePreserve3d},
-#line 435 "CSSValueKeywords.gperf"
+#line 439 "CSSValueKeywords.gperf"
{"deeppink", CSSValueDeeppink},
-#line 496 "CSSValueKeywords.gperf"
+#line 500 "CSSValueKeywords.gperf"
{"paleturquoise", CSSValuePaleturquoise},
#line 204 "CSSValueKeywords.gperf"
{"default", CSSValueDefault},
#line 138 "CSSValueKeywords.gperf"
{"destination-in", CSSValueDestinationIn},
-#line 404 "CSSValueKeywords.gperf"
+#line 408 "CSSValueKeywords.gperf"
{"blanchedalmond", CSSValueBlanchedalmond},
-#line 552 "CSSValueKeywords.gperf"
+#line 553 "CSSValueKeywords.gperf"
{"reset-size", CSSValueResetSize},
-#line 518 "CSSValueKeywords.gperf"
+#line 522 "CSSValueKeywords.gperf"
{"steelblue", CSSValueSteelblue},
#line 70 "CSSValueKeywords.gperf"
{"sans-serif", CSSValueSansSerif},
-#line 342 "CSSValueKeywords.gperf"
+#line 343 "CSSValueKeywords.gperf"
{"media-slider", CSSValueMediaSlider},
#line 230 "CSSValueKeywords.gperf"
{"text", CSSValueText},
@@ -906,29 +908,29 @@ findValue (register const char *str, register unsigned int len)
{"buttontext", CSSValueButtontext},
#line 140 "CSSValueKeywords.gperf"
{"destination-atop", CSSValueDestinationAtop},
-#line 477 "CSSValueKeywords.gperf"
+#line 481 "CSSValueKeywords.gperf"
{"mediumblue", CSSValueMediumblue},
-#line 484 "CSSValueKeywords.gperf"
+#line 488 "CSSValueKeywords.gperf"
{"mediumvioletred", CSSValueMediumvioletred},
-#line 452 "CSSValueKeywords.gperf"
+#line 456 "CSSValueKeywords.gperf"
{"ivory", CSSValueIvory},
-#line 387 "CSSValueKeywords.gperf"
+#line 388 "CSSValueKeywords.gperf"
{"ease-in-out", CSSValueEaseInOut},
-#line 548 "CSSValueKeywords.gperf"
+#line 549 "CSSValueKeywords.gperf"
{"hanging", CSSValueHanging},
-#line 371 "CSSValueKeywords.gperf"
+#line 372 "CSSValueKeywords.gperf"
{"content-box", CSSValueContentBox},
-#line 466 "CSSValueKeywords.gperf"
+#line 470 "CSSValueKeywords.gperf"
{"lightsalmon", CSSValueLightsalmon},
-#line 397 "CSSValueKeywords.gperf"
+#line 398 "CSSValueKeywords.gperf"
{"subpixel-antialiased", CSSValueSubpixelAntialiased},
-#line 407 "CSSValueKeywords.gperf"
+#line 411 "CSSValueKeywords.gperf"
{"burlywood", CSSValueBurlywood},
-#line 444 "CSSValueKeywords.gperf"
+#line 448 "CSSValueKeywords.gperf"
{"ghostwhite", CSSValueGhostwhite},
#line 177 "CSSValueKeywords.gperf"
{"georgian", CSSValueGeorgian},
-#line 426 "CSSValueKeywords.gperf"
+#line 430 "CSSValueKeywords.gperf"
{"darkorchid", CSSValueDarkorchid},
#line 245 "CSSValueKeywords.gperf"
{"always", CSSValueAlways},
@@ -936,15 +938,15 @@ findValue (register const char *str, register unsigned int len)
{"upper-roman", CSSValueUpperRoman},
#line 172 "CSSValueKeywords.gperf"
{"lower-latin", CSSValueLowerLatin},
-#line 456 "CSSValueKeywords.gperf"
+#line 460 "CSSValueKeywords.gperf"
{"lawngreen", CSSValueLawngreen},
#line 49 "CSSValueKeywords.gperf"
{"xx-small", CSSValueXxSmall},
-#line 481 "CSSValueKeywords.gperf"
+#line 485 "CSSValueKeywords.gperf"
{"mediumslateblue", CSSValueMediumslateblue},
#line 271 "CSSValueKeywords.gperf"
{"open-quote", CSSValueOpenQuote},
-#line 480 "CSSValueKeywords.gperf"
+#line 484 "CSSValueKeywords.gperf"
{"mediumseagreen", CSSValueMediumseagreen},
#line 326 "CSSValueKeywords.gperf"
{"checkbox", CSSValueCheckbox},
@@ -956,37 +958,37 @@ findValue (register const char *str, register unsigned int len)
{"fixed", CSSValueFixed},
#line 72 "CSSValueKeywords.gperf"
{"fantasy", CSSValueFantasy},
-#line 433 "CSSValueKeywords.gperf"
+#line 437 "CSSValueKeywords.gperf"
{"darkturquoise", CSSValueDarkturquoise},
-#line 465 "CSSValueKeywords.gperf"
+#line 469 "CSSValueKeywords.gperf"
{"lightpink", CSSValueLightpink},
#line 277 "CSSValueKeywords.gperf"
{"pre-wrap", CSSValuePreWrap},
#line 125 "CSSValueKeywords.gperf"
{"grey", CSSValueGrey},
-#line 479 "CSSValueKeywords.gperf"
+#line 483 "CSSValueKeywords.gperf"
{"mediumpurple", CSSValueMediumpurple},
-#line 515 "CSSValueKeywords.gperf"
+#line 519 "CSSValueKeywords.gperf"
{"slategrey", CSSValueSlategrey},
#line 329 "CSSValueKeywords.gperf"
{"square-button", CSSValueSquareButton},
-#line 514 "CSSValueKeywords.gperf"
+#line 518 "CSSValueKeywords.gperf"
{"slategray", CSSValueSlategray},
-#line 438 "CSSValueKeywords.gperf"
+#line 442 "CSSValueKeywords.gperf"
{"dimgrey", CSSValueDimgrey},
#line 137 "CSSValueKeywords.gperf"
{"destination-over", CSSValueDestinationOver},
-#line 437 "CSSValueKeywords.gperf"
+#line 441 "CSSValueKeywords.gperf"
{"dimgray", CSSValueDimgray},
#line 209 "CSSValueKeywords.gperf"
{"context-menu", CSSValueContextMenu},
-#line 536 "CSSValueKeywords.gperf"
+#line 401 "CSSValueKeywords.gperf"
{"geometricprecision", CSSValueGeometricprecision},
#line 91 "CSSValueKeywords.gperf"
{"yellow", CSSValueYellow},
#line 317 "CSSValueKeywords.gperf"
{"dot-dash", CSSValueDotDash},
-#line 485 "CSSValueKeywords.gperf"
+#line 489 "CSSValueKeywords.gperf"
{"midnightblue", CSSValueMidnightblue},
#line 155 "CSSValueKeywords.gperf"
{"right", CSSValueRight},
@@ -994,43 +996,43 @@ findValue (register const char *str, register unsigned int len)
{"background", CSSValueBackground},
#line 39 "CSSValueKeywords.gperf"
{"lighter", CSSValueLighter},
-#line 365 "CSSValueKeywords.gperf"
+#line 366 "CSSValueKeywords.gperf"
{"textarea", CSSValueTextarea},
#line 226 "CSSValueKeywords.gperf"
{"nesw-resize", CSSValueNeswResize},
-#line 476 "CSSValueKeywords.gperf"
+#line 480 "CSSValueKeywords.gperf"
{"mediumaquamarine", CSSValueMediumaquamarine},
#line 110 "CSSValueKeywords.gperf"
{"infobackground", CSSValueInfobackground},
#line 113 "CSSValueKeywords.gperf"
{"menutext", CSSValueMenutext},
-#line 550 "CSSValueKeywords.gperf"
+#line 551 "CSSValueKeywords.gperf"
{"use-script", CSSValueUseScript},
-#line 489 "CSSValueKeywords.gperf"
+#line 493 "CSSValueKeywords.gperf"
{"navajowhite", CSSValueNavajowhite},
#line 61 "CSSValueKeywords.gperf"
{"ultra-condensed", CSSValueUltraCondensed},
-#line 459 "CSSValueKeywords.gperf"
+#line 463 "CSSValueKeywords.gperf"
{"lightcoral", CSSValueLightcoral},
#line 143 "CSSValueKeywords.gperf"
{"plus-lighter", CSSValuePlusLighter},
-#line 366 "CSSValueKeywords.gperf"
+#line 367 "CSSValueKeywords.gperf"
{"caps-lock-indicator", CSSValueCapsLockIndicator},
#line 168 "CSSValueKeywords.gperf"
{"lower-roman", CSSValueLowerRoman},
-#line 503 "CSSValueKeywords.gperf"
+#line 507 "CSSValueKeywords.gperf"
{"powderblue", CSSValuePowderblue},
#line 101 "CSSValueKeywords.gperf"
{"buttonshadow", CSSValueButtonshadow},
#line 139 "CSSValueKeywords.gperf"
{"destination-out", CSSValueDestinationOut},
-#line 542 "CSSValueKeywords.gperf"
+#line 543 "CSSValueKeywords.gperf"
{"after-edge", CSSValueAfterEdge},
-#line 421 "CSSValueKeywords.gperf"
+#line 425 "CSSValueKeywords.gperf"
{"darkgrey", CSSValueDarkgrey},
-#line 419 "CSSValueKeywords.gperf"
+#line 423 "CSSValueKeywords.gperf"
{"darkgray", CSSValueDarkgray},
-#line 412 "CSSValueKeywords.gperf"
+#line 416 "CSSValueKeywords.gperf"
{"cornflowerblue", CSSValueCornflowerblue},
#line 328 "CSSValueKeywords.gperf"
{"push-button", CSSValuePushButton},
@@ -1044,71 +1046,71 @@ findValue (register const char *str, register unsigned int len)
{"hebrew", CSSValueHebrew},
#line 122 "CSSValueKeywords.gperf"
{"windowtext", CSSValueWindowtext},
-#line 432 "CSSValueKeywords.gperf"
+#line 436 "CSSValueKeywords.gperf"
{"darkslategrey", CSSValueDarkslategrey},
-#line 431 "CSSValueKeywords.gperf"
+#line 435 "CSSValueKeywords.gperf"
{"darkslategray", CSSValueDarkslategray},
-#line 546 "CSSValueKeywords.gperf"
+#line 547 "CSSValueKeywords.gperf"
{"ideographic", CSSValueIdeographic},
#line 207 "CSSValueKeywords.gperf"
{"vertical-text", CSSValueVerticalText},
#line 173 "CSSValueKeywords.gperf"
{"upper-alpha", CSSValueUpperAlpha},
-#line 399 "CSSValueKeywords.gperf"
+#line 403 "CSSValueKeywords.gperf"
{"antiquewhite", CSSValueAntiquewhite},
#line 115 "CSSValueKeywords.gperf"
{"threeddarkshadow", CSSValueThreeddarkshadow},
-#line 534 "CSSValueKeywords.gperf"
+#line 537 "CSSValueKeywords.gperf"
{"optimizequality", CSSValueOptimizequality},
#line 148 "CSSValueKeywords.gperf"
{"text-top", CSSValueTextTop},
-#line 441 "CSSValueKeywords.gperf"
+#line 445 "CSSValueKeywords.gperf"
{"floralwhite", CSSValueFloralwhite},
#line 178 "CSSValueKeywords.gperf"
{"cjk-ideographic", CSSValueCjkIdeographic},
-#line 369 "CSSValueKeywords.gperf"
+#line 370 "CSSValueKeywords.gperf"
{"border-box", CSSValueBorderBox},
-#line 448 "CSSValueKeywords.gperf"
+#line 452 "CSSValueKeywords.gperf"
{"honeydew", CSSValueHoneydew},
#line 272 "CSSValueKeywords.gperf"
{"overlay", CSSValueOverlay},
#line 323 "CSSValueKeywords.gperf"
{"break-word", CSSValueBreakWord},
-#line 458 "CSSValueKeywords.gperf"
+#line 462 "CSSValueKeywords.gperf"
{"lightblue", CSSValueLightblue},
-#line 508 "CSSValueKeywords.gperf"
+#line 512 "CSSValueKeywords.gperf"
{"sandybrown", CSSValueSandybrown},
-#line 504 "CSSValueKeywords.gperf"
+#line 508 "CSSValueKeywords.gperf"
{"rosybrown", CSSValueRosybrown},
-#line 447 "CSSValueKeywords.gperf"
+#line 451 "CSSValueKeywords.gperf"
{"greenyellow", CSSValueGreenyellow},
-#line 540 "CSSValueKeywords.gperf"
+#line 400 "CSSValueKeywords.gperf"
{"optimizelegibility", CSSValueOptimizelegibility},
-#line 373 "CSSValueKeywords.gperf"
+#line 374 "CSSValueKeywords.gperf"
{"padding-box", CSSValuePaddingBox},
#line 182 "CSSValueKeywords.gperf"
{"katakana-iroha", CSSValueKatakanaIroha},
#line 321 "CSSValueKeywords.gperf"
{"skip-white-space", CSSValueSkipWhiteSpace},
-#line 478 "CSSValueKeywords.gperf"
+#line 482 "CSSValueKeywords.gperf"
{"mediumorchid", CSSValueMediumorchid},
-#line 471 "CSSValueKeywords.gperf"
+#line 475 "CSSValueKeywords.gperf"
{"lightsteelblue", CSSValueLightsteelblue},
-#line 463 "CSSValueKeywords.gperf"
+#line 467 "CSSValueKeywords.gperf"
{"lightgreen", CSSValueLightgreen},
#line 65 "CSSValueKeywords.gperf"
{"semi-expanded", CSSValueSemiExpanded},
-#line 467 "CSSValueKeywords.gperf"
+#line 471 "CSSValueKeywords.gperf"
{"lightseagreen", CSSValueLightseagreen},
-#line 351 "CSSValueKeywords.gperf"
+#line 352 "CSSValueKeywords.gperf"
{"menulist-button", CSSValueMenulistButton},
-#line 354 "CSSValueKeywords.gperf"
+#line 355 "CSSValueKeywords.gperf"
{"slider-horizontal", CSSValueSliderHorizontal},
#line 128 "CSSValueKeywords.gperf"
{"repeat-x", CSSValueRepeatX},
#line 170 "CSSValueKeywords.gperf"
{"lower-greek", CSSValueLowerGreek},
-#line 483 "CSSValueKeywords.gperf"
+#line 487 "CSSValueKeywords.gperf"
{"mediumturquoise", CSSValueMediumturquoise},
#line 171 "CSSValueKeywords.gperf"
{"lower-alpha", CSSValueLowerAlpha},
@@ -1118,41 +1120,41 @@ findValue (register const char *str, register unsigned int len)
{"graytext", CSSValueGraytext},
#line 129 "CSSValueKeywords.gperf"
{"repeat-y", CSSValueRepeatY},
-#line 498 "CSSValueKeywords.gperf"
+#line 502 "CSSValueKeywords.gperf"
{"papayawhip", CSSValuePapayawhip},
-#line 364 "CSSValueKeywords.gperf"
+#line 365 "CSSValueKeywords.gperf"
{"textfield", CSSValueTextfield},
#line 149 "CSSValueKeywords.gperf"
{"text-bottom", CSSValueTextBottom},
-#line 541 "CSSValueKeywords.gperf"
+#line 542 "CSSValueKeywords.gperf"
{"before-edge", CSSValueBeforeEdge},
#line 62 "CSSValueKeywords.gperf"
{"extra-condensed", CSSValueExtraCondensed},
-#line 455 "CSSValueKeywords.gperf"
+#line 459 "CSSValueKeywords.gperf"
{"lavenderblush", CSSValueLavenderblush},
-#line 345 "CSSValueKeywords.gperf"
+#line 346 "CSSValueKeywords.gperf"
{"media-volume-slider", CSSValueMediaVolumeSlider},
#line 26 "CSSValueKeywords.gperf"
{"message-box", CSSValueMessageBox},
-#line 352 "CSSValueKeywords.gperf"
+#line 353 "CSSValueKeywords.gperf"
{"menulist-text", CSSValueMenulistText},
-#line 482 "CSSValueKeywords.gperf"
+#line 486 "CSSValueKeywords.gperf"
{"mediumspringgreen", CSSValueMediumspringgreen},
-#line 460 "CSSValueKeywords.gperf"
+#line 464 "CSSValueKeywords.gperf"
{"lightcyan", CSSValueLightcyan},
#line 308 "CSSValueKeywords.gperf"
{"read-write", CSSValueReadWrite},
#line 258 "CSSValueKeywords.gperf"
{"higher", CSSValueHigher},
-#line 526 "CSSValueKeywords.gperf"
+#line 530 "CSSValueKeywords.gperf"
{"yellowgreen", CSSValueYellowgreen},
#line 318 "CSSValueKeywords.gperf"
{"dot-dot-dash", CSSValueDotDotDash},
-#line 457 "CSSValueKeywords.gperf"
+#line 461 "CSSValueKeywords.gperf"
{"lemonchiffon", CSSValueLemonchiffon},
#line 307 "CSSValueKeywords.gperf"
{"read-only", CSSValueReadOnly},
-#line 359 "CSSValueKeywords.gperf"
+#line 360 "CSSValueKeywords.gperf"
{"searchfield", CSSValueSearchfield},
#line 181 "CSSValueKeywords.gperf"
{"hiragana-iroha", CSSValueHiraganaIroha},
@@ -1162,7 +1164,7 @@ findValue (register const char *str, register unsigned int len)
{"threedlightshadow", CSSValueThreedlightshadow},
#line 201 "CSSValueKeywords.gperf"
{"-wap-marquee", CSSValueWapMarquee},
-#line 336 "CSSValueKeywords.gperf"
+#line 337 "CSSValueKeywords.gperf"
{"media-mute-button", CSSValueMediaMuteButton},
#line 68 "CSSValueKeywords.gperf"
{"ultra-expanded", CSSValueUltraExpanded},
@@ -1172,21 +1174,21 @@ findValue (register const char *str, register unsigned int len)
{"-webkit-link", CSSValueWebkitLink},
#line 167 "CSSValueKeywords.gperf"
{"decimal-leading-zero", CSSValueDecimalLeadingZero},
-#line 357 "CSSValueKeywords.gperf"
+#line 358 "CSSValueKeywords.gperf"
{"sliderthumb-vertical", CSSValueSliderthumbVertical},
#line 94 "CSSValueKeywords.gperf"
{"-webkit-activelink", CSSValueWebkitActivelink},
-#line 472 "CSSValueKeywords.gperf"
+#line 476 "CSSValueKeywords.gperf"
{"lightyellow", CSSValueLightyellow},
-#line 436 "CSSValueKeywords.gperf"
+#line 440 "CSSValueKeywords.gperf"
{"deepskyblue", CSSValueDeepskyblue},
#line 191 "CSSValueKeywords.gperf"
{"table-row-group", CSSValueTableRowGroup},
-#line 343 "CSSValueKeywords.gperf"
+#line 344 "CSSValueKeywords.gperf"
{"media-sliderthumb", CSSValueMediaSliderthumb},
#line 160 "CSSValueKeywords.gperf"
{"-webkit-center", CSSValueWebkitCenter},
-#line 338 "CSSValueKeywords.gperf"
+#line 339 "CSSValueKeywords.gperf"
{"media-seek-back-button", CSSValueMediaSeekBackButton},
#line 30 "CSSValueKeywords.gperf"
{"-webkit-control", CSSValueWebkitControl},
@@ -1194,37 +1196,37 @@ findValue (register const char *str, register unsigned int len)
{"line-through", CSSValueLineThrough},
#line 153 "CSSValueKeywords.gperf"
{"-webkit-auto", CSSValueWebkitAuto},
-#line 464 "CSSValueKeywords.gperf"
+#line 468 "CSSValueKeywords.gperf"
{"lightgrey", CSSValueLightgrey},
-#line 462 "CSSValueKeywords.gperf"
+#line 466 "CSSValueKeywords.gperf"
{"lightgray", CSSValueLightgray},
#line 325 "CSSValueKeywords.gperf"
{"after-white-space", CSSValueAfterWhiteSpace},
-#line 468 "CSSValueKeywords.gperf"
+#line 472 "CSSValueKeywords.gperf"
{"lightskyblue", CSSValueLightskyblue},
-#line 499 "CSSValueKeywords.gperf"
+#line 503 "CSSValueKeywords.gperf"
{"peachpuff", CSSValuePeachpuff},
-#line 337 "CSSValueKeywords.gperf"
+#line 338 "CSSValueKeywords.gperf"
{"media-play-button", CSSValueMediaPlayButton},
-#line 340 "CSSValueKeywords.gperf"
+#line 341 "CSSValueKeywords.gperf"
{"media-rewind-button", CSSValueMediaRewindButton},
#line 117 "CSSValueKeywords.gperf"
{"threedhighlight", CSSValueThreedhighlight},
#line 67 "CSSValueKeywords.gperf"
{"extra-expanded", CSSValueExtraExpanded},
-#line 470 "CSSValueKeywords.gperf"
+#line 474 "CSSValueKeywords.gperf"
{"lightslategrey", CSSValueLightslategrey},
-#line 469 "CSSValueKeywords.gperf"
+#line 473 "CSSValueKeywords.gperf"
{"lightslategray", CSSValueLightslategray},
#line 214 "CSSValueKeywords.gperf"
{"-webkit-zoom-in", CSSValueWebkitZoomIn},
#line 193 "CSSValueKeywords.gperf"
{"table-footer-group", CSSValueTableFooterGroup},
-#line 353 "CSSValueKeywords.gperf"
+#line 354 "CSSValueKeywords.gperf"
{"menulist-textfield", CSSValueMenulistTextfield},
#line 158 "CSSValueKeywords.gperf"
{"-webkit-left", CSSValueWebkitLeft},
-#line 344 "CSSValueKeywords.gperf"
+#line 345 "CSSValueKeywords.gperf"
{"media-volume-slider-container", CSSValueMediaVolumeSliderContainer},
#line 105 "CSSValueKeywords.gperf"
{"highlight", CSSValueHighlight},
@@ -1234,7 +1236,7 @@ findValue (register const char *str, register unsigned int len)
{"table-header-group", CSSValueTableHeaderGroup},
#line 266 "CSSValueKeywords.gperf"
{"-webkit-marquee", CSSValueWebkitMarquee},
-#line 347 "CSSValueKeywords.gperf"
+#line 348 "CSSValueKeywords.gperf"
{"media-controls-background", CSSValueMediaControlsBackground},
#line 234 "CSSValueKeywords.gperf"
{"-webkit-grab", CSSValueWebkitGrab},
@@ -1244,7 +1246,7 @@ findValue (register const char *str, register unsigned int len)
{"-webkit-text", CSSValueWebkitText},
#line 28 "CSSValueKeywords.gperf"
{"-webkit-mini-control", CSSValueWebkitMiniControl},
-#line 335 "CSSValueKeywords.gperf"
+#line 336 "CSSValueKeywords.gperf"
{"media-fullscreen-button", CSSValueMediaFullscreenButton},
#line 215 "CSSValueKeywords.gperf"
{"-webkit-zoom-out", CSSValueWebkitZoomOut},
@@ -1252,43 +1254,43 @@ findValue (register const char *str, register unsigned int len)
{"buttonhighlight", CSSValueButtonhighlight},
#line 199 "CSSValueKeywords.gperf"
{"-webkit-box", CSSValueWebkitBox},
-#line 356 "CSSValueKeywords.gperf"
+#line 357 "CSSValueKeywords.gperf"
{"sliderthumb-horizontal", CSSValueSliderthumbHorizontal},
-#line 360 "CSSValueKeywords.gperf"
+#line 361 "CSSValueKeywords.gperf"
{"searchfield-decoration", CSSValueSearchfieldDecoration},
#line 152 "CSSValueKeywords.gperf"
{"-webkit-baseline-middle", CSSValueWebkitBaselineMiddle},
-#line 346 "CSSValueKeywords.gperf"
+#line 347 "CSSValueKeywords.gperf"
{"media-volume-sliderthumb", CSSValueMediaVolumeSliderthumb},
#line 74 "CSSValueKeywords.gperf"
{"-webkit-body", CSSValueWebkitBody},
-#line 461 "CSSValueKeywords.gperf"
+#line 465 "CSSValueKeywords.gperf"
{"lightgoldenrodyellow", CSSValueLightgoldenrodyellow},
-#line 545 "CSSValueKeywords.gperf"
+#line 546 "CSSValueKeywords.gperf"
{"text-after-edge", CSSValueTextAfterEdge},
-#line 349 "CSSValueKeywords.gperf"
+#line 350 "CSSValueKeywords.gperf"
{"media-time-remaining-display", CSSValueMediaTimeRemainingDisplay},
#line 159 "CSSValueKeywords.gperf"
{"-webkit-right", CSSValueWebkitRight},
-#line 544 "CSSValueKeywords.gperf"
+#line 545 "CSSValueKeywords.gperf"
{"text-before-edge", CSSValueTextBeforeEdge},
#line 235 "CSSValueKeywords.gperf"
{"-webkit-grabbing", CSSValueWebkitGrabbing},
#line 200 "CSSValueKeywords.gperf"
{"-webkit-inline-box", CSSValueWebkitInlineBox},
-#line 348 "CSSValueKeywords.gperf"
+#line 349 "CSSValueKeywords.gperf"
{"media-current-time-display", CSSValueMediaCurrentTimeDisplay},
#line 106 "CSSValueKeywords.gperf"
{"highlighttext", CSSValueHighlighttext},
-#line 363 "CSSValueKeywords.gperf"
+#line 364 "CSSValueKeywords.gperf"
{"searchfield-cancel-button", CSSValueSearchfieldCancelButton},
-#line 339 "CSSValueKeywords.gperf"
+#line 340 "CSSValueKeywords.gperf"
{"media-seek-forward-button", CSSValueMediaSeekForwardButton},
-#line 341 "CSSValueKeywords.gperf"
+#line 342 "CSSValueKeywords.gperf"
{"media-return-to-realtime-button", CSSValueMediaReturnToRealtimeButton},
-#line 361 "CSSValueKeywords.gperf"
- {"searchfield-results-decoration", CSSValueSearchfieldResultsDecoration},
#line 362 "CSSValueKeywords.gperf"
+ {"searchfield-results-decoration", CSSValueSearchfieldResultsDecoration},
+#line 363 "CSSValueKeywords.gperf"
{"searchfield-results-button", CSSValueSearchfieldResultsButton},
#line 309 "CSSValueKeywords.gperf"
{"read-write-plaintext-only", CSSValueReadWritePlaintextOnly},
@@ -1470,223 +1472,223 @@ findValue (register const char *str, register unsigned int len)
-1, -1, 317, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 318, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 319, -1, -1, -1, -1, -1, 320, -1, -1, -1,
- -1, 321, 322, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 323, -1, -1, 324, -1, -1,
- -1, -1, -1, -1, -1, -1, 325, 326, -1, 327,
- -1, -1, 328, -1, -1, 329, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 330, 331, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 332, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 333, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 334, -1, -1, -1, -1, -1, -1, -1,
- -1, 335, -1, -1, -1, -1, 336, -1, -1, -1,
- -1, 337, -1, -1, -1, -1, -1, 338, -1, -1,
- -1, 339, -1, -1, -1, 340, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 341, -1, -1, -1, -1,
- 342, -1, -1, -1, -1, 343, -1, -1, -1, -1,
- 344, -1, -1, -1, -1, 345, 346, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 347, -1, -1, -1,
- -1, -1, 348, -1, -1, -1, 349, -1, -1, -1,
- -1, -1, 350, -1, -1, -1, -1, -1, -1, -1,
+ -1, 319, -1, -1, -1, -1, -1, -1, -1, -1,
+ 320, -1, -1, -1, -1, -1, 321, -1, -1, -1,
+ -1, 322, 323, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 324, -1, -1, 325, -1, -1,
+ -1, -1, -1, -1, -1, -1, 326, 327, -1, 328,
+ -1, -1, 329, -1, -1, 330, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 331, 332, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 333, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 334, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 335, -1, -1, -1, -1, -1, -1, -1,
+ -1, 336, -1, -1, -1, -1, 337, -1, -1, -1,
+ -1, 338, -1, -1, -1, -1, -1, 339, -1, -1,
+ -1, 340, -1, -1, -1, 341, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 342, -1, -1, -1, -1,
+ 343, -1, -1, -1, -1, 344, -1, -1, -1, -1,
+ 345, -1, -1, -1, -1, 346, 347, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 348, -1, -1, -1,
+ -1, -1, 349, -1, -1, -1, 350, -1, -1, -1,
-1, -1, 351, -1, -1, -1, -1, -1, -1, -1,
- 352, -1, -1, -1, -1, 353, 354, 355, -1, -1,
- 356, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 357, -1, -1,
- -1, 358, -1, -1, -1, -1, 359, 360, 361, -1,
- -1, -1, 362, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 352, -1, -1, -1, -1, -1, -1, -1,
+ 353, -1, -1, -1, -1, 354, 355, 356, -1, -1,
+ 357, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 358, -1, -1,
+ -1, 359, -1, -1, -1, -1, 360, 361, 362, -1,
-1, -1, 363, -1, -1, -1, -1, -1, -1, -1,
- -1, 364, 365, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 366,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 367, 368, -1, 369, 370, -1, -1, -1, 371,
- -1, 372, -1, -1, -1, -1, -1, 373, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 374, -1,
- -1, 375, 376, -1, -1, -1, -1, -1, -1, -1,
- -1, 377, -1, 378, -1, -1, -1, -1, -1, -1,
- -1, -1, 379, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 364, -1, -1, -1, -1, -1, -1, -1,
+ -1, 365, 366, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 367,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 368, 369, -1, 370, 371, -1, -1, -1, 372,
+ -1, 373, -1, -1, -1, -1, -1, 374, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 375, -1,
+ -1, 376, 377, -1, -1, -1, -1, -1, -1, -1,
+ -1, 378, -1, 379, -1, -1, -1, -1, -1, -1,
+ -1, -1, 380, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 380, 381, -1, -1, -1, -1, -1, -1, -1,
+ -1, 381, 382, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 382, -1, 383, -1, -1, -1, 384, 385, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 386, -1,
- -1, 387, -1, 388, -1, -1, 389, -1, -1, -1,
+ 383, -1, 384, -1, -1, -1, 385, 386, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 387, -1,
+ -1, 388, -1, 389, -1, -1, 390, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 390, -1, -1, -1,
- -1, -1, 391, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 391, -1, -1, -1,
+ -1, -1, 392, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 392, -1, 393, -1, -1, -1, 394, 395, -1, -1,
- -1, -1, -1, -1, -1, -1, 396, -1, -1, -1,
+ 393, -1, 394, -1, -1, -1, 395, 396, -1, -1,
-1, -1, -1, -1, -1, -1, 397, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 398, 399, 400, -1,
- -1, 401, -1, -1, -1, 402, -1, -1, 403, -1,
- -1, -1, -1, -1, -1, 404, 405, -1, -1, -1,
- -1, -1, 406, 407, -1, -1, 408, -1, -1, -1,
- -1, 409, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 410, -1, -1,
- 411, -1, -1, -1, -1, -1, -1, 412, 413, -1,
- -1, -1, -1, 414, -1, -1, -1, -1, -1, -1,
- -1, 415, -1, -1, -1, -1, 416, -1, -1, -1,
- -1, -1, -1, -1, -1, 417, 418, -1, 419, -1,
- -1, 420, -1, -1, 421, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 398, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 399, 400, 401, -1,
+ -1, 402, -1, -1, -1, 403, -1, -1, 404, -1,
+ -1, -1, -1, -1, -1, 405, 406, -1, -1, -1,
+ -1, -1, 407, 408, -1, -1, 409, -1, -1, -1,
+ -1, 410, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 411, -1, -1,
+ 412, -1, -1, -1, -1, -1, -1, 413, 414, -1,
+ -1, -1, -1, 415, -1, -1, -1, -1, -1, -1,
+ -1, 416, -1, -1, -1, -1, 417, -1, -1, -1,
+ -1, -1, -1, -1, -1, 418, 419, -1, 420, -1,
+ -1, 421, -1, -1, 422, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 422, -1,
- -1, -1, -1, 423, -1, -1, 424, -1, -1, -1,
- -1, -1, 425, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 423, -1,
+ -1, -1, -1, 424, -1, -1, 425, -1, -1, -1,
+ -1, -1, 426, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 426, -1, -1, -1, -1, -1,
- -1, -1, -1, 427, -1, -1, -1, -1, -1, -1,
- -1, -1, 428, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 427, -1, -1, -1, -1, -1,
+ -1, -1, -1, 428, -1, -1, -1, -1, -1, -1,
+ -1, -1, 429, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 429, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 430, -1, -1, -1, -1, -1, -1, -1, -1,
+ 430, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 431, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 431, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 432, -1, -1, -1, 433, 434, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 435, -1, -1,
- -1, -1, 436, -1, -1, -1, -1, -1, -1, -1,
- -1, 437, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 438, -1, -1, -1, -1, -1, -1, -1,
+ -1, 432, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 433, -1, -1, -1, 434, 435, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 436, -1, -1,
+ -1, -1, 437, -1, -1, -1, -1, -1, -1, -1,
+ -1, 438, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 439, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 439, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 440, -1,
- -1, -1, -1, -1, 441, -1, -1, 442, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 443, -1, -1,
- -1, -1, 444, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 445, 446, 447, -1, -1,
- -1, 448, -1, -1, -1, -1, -1, 449, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 440, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 441, -1,
+ -1, -1, -1, -1, 442, -1, -1, 443, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 444, -1, -1,
+ -1, -1, 445, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 446, 447, 448, -1, -1,
+ -1, 449, -1, -1, -1, -1, -1, 450, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 450, 451, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 452, -1, -1, -1, -1, 453, -1,
+ 451, 452, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 453, -1, -1, -1, -1, 454, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 454, -1, -1,
- -1, 455, -1, -1, -1, -1, -1, -1, -1, -1,
- 456, -1, -1, -1, -1, -1, -1, -1, 457, -1,
+ -1, -1, -1, -1, -1, -1, -1, 455, -1, -1,
+ -1, 456, -1, -1, -1, -1, -1, -1, -1, -1,
+ 457, -1, -1, -1, -1, -1, -1, -1, 458, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 458, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 459,
- -1, -1, -1, -1, -1, -1, 460, -1, -1, -1,
- -1, 461, 462, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 463, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 459, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 460,
+ -1, -1, -1, -1, -1, -1, 461, -1, -1, -1,
+ -1, 462, 463, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 464, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 465, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 466, -1, -1,
- -1, 467, -1, -1, -1, -1, -1, 468, -1, -1,
+ -1, -1, -1, -1, -1, -1, 466, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 467, -1, -1,
+ -1, 468, -1, -1, -1, -1, -1, 469, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 469, -1, -1,
- -1, 470, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 470, -1, -1,
-1, 471, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 472, -1, -1, -1, -1, -1, -1,
- 473, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 472, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 473, -1, -1, -1, -1, -1, -1,
+ 474, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 474, 475, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 476, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 475, 476, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 477, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 477, -1, -1,
- -1, 478, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 479, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 480, -1,
- 481, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 482, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 483, -1, 484, -1,
+ -1, -1, -1, -1, -1, -1, -1, 478, -1, -1,
+ -1, 479, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 480, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 481, -1,
+ 482, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 483, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 484, -1, 485, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 485, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 486, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 486, -1, -1,
- -1, -1, -1, -1, 487, -1, -1, -1, -1, -1,
- -1, -1, -1, 488, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 487, -1, -1,
+ -1, -1, -1, -1, 488, -1, -1, -1, -1, -1,
+ -1, -1, -1, 489, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 489, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 490, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 491, -1, -1, -1, -1,
+ -1, -1, 490, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 491, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 492, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 492, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 493, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 494, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 495, -1, -1,
- -1, -1, 496, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 495, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 496, -1, -1,
+ -1, -1, 497, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 497, -1,
- -1, -1, -1, 498, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 498, -1,
+ -1, -1, -1, 499, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 499, 500, -1, -1, -1, -1, -1, -1,
+ -1, -1, 500, 501, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 501, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 502, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 502, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 503, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 504, -1, -1,
- -1, -1, 505, -1, -1, -1, -1, -1, 506, -1,
- -1, -1, -1, 507, -1, -1, -1, 508, -1, -1,
+ -1, 504, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 505, -1, -1,
+ -1, -1, 506, -1, -1, -1, -1, -1, 507, -1,
+ -1, -1, -1, 508, -1, -1, -1, 509, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 509, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 510, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 510, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 511, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 511, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 512, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1694,50 +1696,50 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 512, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 513, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 513, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 514, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 514, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 515, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 515, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 516, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 516,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 517,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 517, 518, -1,
+ -1, -1, -1, -1, -1, -1, -1, 518, 519, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 519, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 520, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 520, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 521, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 521, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 522, -1, -1, -1, -1,
+ -1, -1, 522, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 523, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 523, 524, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 525, -1,
+ -1, -1, 524, 525, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 526, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 526, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 527, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 527, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 528, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 528, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 529, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1748,22 +1750,22 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 529, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 530, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 530, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 531, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 531, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 532, -1, -1,
+ -1, -1, -1, -1, 532, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 533, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 534, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1778,9 +1780,9 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 534, -1,
- -1, -1, -1, -1, -1, -1, -1, 535, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 536,
+ -1, -1, -1, -1, -1, -1, -1, -1, 535, -1,
+ -1, -1, -1, -1, -1, -1, -1, 536, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 537,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1790,7 +1792,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 537, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 538, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1802,11 +1804,11 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 538, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 539, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 539, -1,
- -1, -1, -1, -1, -1, 540, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 540, -1,
+ -1, -1, -1, -1, -1, 541, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1834,7 +1836,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 541, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 542, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1856,7 +1858,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 542, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 543, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1877,7 +1879,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 543, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 544, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1891,7 +1893,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 544, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 545, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1924,7 +1926,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 545, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 546, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -1950,7 +1952,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 546, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 547, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -2017,7 +2019,7 @@ findValue (register const char *str, register unsigned int len)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 547
+ -1, 548
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -2039,7 +2041,7 @@ findValue (register const char *str, register unsigned int len)
}
return 0;
}
-#line 559 "CSSValueKeywords.gperf"
+#line 560 "CSSValueKeywords.gperf"
static const char * const valueList[] = {
"",
@@ -2365,6 +2367,7 @@ static const char * const valueList[] = {
"button",
"button-bevel",
"default-button",
+"list-button",
"listbox",
"listitem",
"media-fullscreen-button",
@@ -2430,6 +2433,9 @@ static const char * const valueList[] = {
"stroke",
"antialiased",
"subpixel-antialiased",
+"optimizespeed",
+"optimizelegibility",
+"geometricprecision",
"aliceblue",
"antiquewhite",
"aquamarine",
@@ -2565,14 +2571,11 @@ static const char * const valueList[] = {
"new",
"srgb",
"linearrgb",
-"optimizespeed",
"optimizequality",
"crispedges",
-"geometricprecision",
"butt",
"miter",
"bevel",
-"optimizelegibility",
"before-edge",
"after-edge",
"central",
diff --git a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h
index d3b22e4..e05d7ed 100644
--- a/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h
+++ b/src/3rdparty/webkit/WebCore/generated/CSSValueKeywords.h
@@ -326,233 +326,234 @@ const int CSSValueSquareButton = 319;
const int CSSValueButton = 320;
const int CSSValueButtonBevel = 321;
const int CSSValueDefaultButton = 322;
-const int CSSValueListbox = 323;
-const int CSSValueListitem = 324;
-const int CSSValueMediaFullscreenButton = 325;
-const int CSSValueMediaMuteButton = 326;
-const int CSSValueMediaPlayButton = 327;
-const int CSSValueMediaSeekBackButton = 328;
-const int CSSValueMediaSeekForwardButton = 329;
-const int CSSValueMediaRewindButton = 330;
-const int CSSValueMediaReturnToRealtimeButton = 331;
-const int CSSValueMediaSlider = 332;
-const int CSSValueMediaSliderthumb = 333;
-const int CSSValueMediaVolumeSliderContainer = 334;
-const int CSSValueMediaVolumeSlider = 335;
-const int CSSValueMediaVolumeSliderthumb = 336;
-const int CSSValueMediaControlsBackground = 337;
-const int CSSValueMediaCurrentTimeDisplay = 338;
-const int CSSValueMediaTimeRemainingDisplay = 339;
-const int CSSValueMenulist = 340;
-const int CSSValueMenulistButton = 341;
-const int CSSValueMenulistText = 342;
-const int CSSValueMenulistTextfield = 343;
-const int CSSValueSliderHorizontal = 344;
-const int CSSValueSliderVertical = 345;
-const int CSSValueSliderthumbHorizontal = 346;
-const int CSSValueSliderthumbVertical = 347;
-const int CSSValueCaret = 348;
-const int CSSValueSearchfield = 349;
-const int CSSValueSearchfieldDecoration = 350;
-const int CSSValueSearchfieldResultsDecoration = 351;
-const int CSSValueSearchfieldResultsButton = 352;
-const int CSSValueSearchfieldCancelButton = 353;
-const int CSSValueTextfield = 354;
-const int CSSValueTextarea = 355;
-const int CSSValueCapsLockIndicator = 356;
-const int CSSValueRound = 357;
-const int CSSValueBorder = 358;
-const int CSSValueBorderBox = 359;
-const int CSSValueContent = 360;
-const int CSSValueContentBox = 361;
-const int CSSValuePadding = 362;
-const int CSSValuePaddingBox = 363;
-const int CSSValueContain = 364;
-const int CSSValueCover = 365;
-const int CSSValueLogical = 366;
-const int CSSValueVisual = 367;
-const int CSSValueLines = 368;
-const int CSSValueRunning = 369;
-const int CSSValuePaused = 370;
-const int CSSValueFlat = 371;
-const int CSSValuePreserve3d = 372;
-const int CSSValueEase = 373;
-const int CSSValueLinear = 374;
-const int CSSValueEaseIn = 375;
-const int CSSValueEaseOut = 376;
-const int CSSValueEaseInOut = 377;
-const int CSSValueDocument = 378;
-const int CSSValueReset = 379;
-const int CSSValueVisiblepainted = 380;
-const int CSSValueVisiblefill = 381;
-const int CSSValueVisiblestroke = 382;
-const int CSSValuePainted = 383;
-const int CSSValueFill = 384;
-const int CSSValueStroke = 385;
-const int CSSValueAntialiased = 386;
-const int CSSValueSubpixelAntialiased = 387;
-const int CSSValueAliceblue = 388;
-const int CSSValueAntiquewhite = 389;
-const int CSSValueAquamarine = 390;
-const int CSSValueAzure = 391;
-const int CSSValueBeige = 392;
-const int CSSValueBisque = 393;
-const int CSSValueBlanchedalmond = 394;
-const int CSSValueBlueviolet = 395;
-const int CSSValueBrown = 396;
-const int CSSValueBurlywood = 397;
-const int CSSValueCadetblue = 398;
-const int CSSValueChartreuse = 399;
-const int CSSValueChocolate = 400;
-const int CSSValueCoral = 401;
-const int CSSValueCornflowerblue = 402;
-const int CSSValueCornsilk = 403;
-const int CSSValueCrimson = 404;
-const int CSSValueCyan = 405;
-const int CSSValueDarkblue = 406;
-const int CSSValueDarkcyan = 407;
-const int CSSValueDarkgoldenrod = 408;
-const int CSSValueDarkgray = 409;
-const int CSSValueDarkgreen = 410;
-const int CSSValueDarkgrey = 411;
-const int CSSValueDarkkhaki = 412;
-const int CSSValueDarkmagenta = 413;
-const int CSSValueDarkolivegreen = 414;
-const int CSSValueDarkorange = 415;
-const int CSSValueDarkorchid = 416;
-const int CSSValueDarkred = 417;
-const int CSSValueDarksalmon = 418;
-const int CSSValueDarkseagreen = 419;
-const int CSSValueDarkslateblue = 420;
-const int CSSValueDarkslategray = 421;
-const int CSSValueDarkslategrey = 422;
-const int CSSValueDarkturquoise = 423;
-const int CSSValueDarkviolet = 424;
-const int CSSValueDeeppink = 425;
-const int CSSValueDeepskyblue = 426;
-const int CSSValueDimgray = 427;
-const int CSSValueDimgrey = 428;
-const int CSSValueDodgerblue = 429;
-const int CSSValueFirebrick = 430;
-const int CSSValueFloralwhite = 431;
-const int CSSValueForestgreen = 432;
-const int CSSValueGainsboro = 433;
-const int CSSValueGhostwhite = 434;
-const int CSSValueGold = 435;
-const int CSSValueGoldenrod = 436;
-const int CSSValueGreenyellow = 437;
-const int CSSValueHoneydew = 438;
-const int CSSValueHotpink = 439;
-const int CSSValueIndianred = 440;
-const int CSSValueIndigo = 441;
-const int CSSValueIvory = 442;
-const int CSSValueKhaki = 443;
-const int CSSValueLavender = 444;
-const int CSSValueLavenderblush = 445;
-const int CSSValueLawngreen = 446;
-const int CSSValueLemonchiffon = 447;
-const int CSSValueLightblue = 448;
-const int CSSValueLightcoral = 449;
-const int CSSValueLightcyan = 450;
-const int CSSValueLightgoldenrodyellow = 451;
-const int CSSValueLightgray = 452;
-const int CSSValueLightgreen = 453;
-const int CSSValueLightgrey = 454;
-const int CSSValueLightpink = 455;
-const int CSSValueLightsalmon = 456;
-const int CSSValueLightseagreen = 457;
-const int CSSValueLightskyblue = 458;
-const int CSSValueLightslategray = 459;
-const int CSSValueLightslategrey = 460;
-const int CSSValueLightsteelblue = 461;
-const int CSSValueLightyellow = 462;
-const int CSSValueLimegreen = 463;
-const int CSSValueLinen = 464;
-const int CSSValueMagenta = 465;
-const int CSSValueMediumaquamarine = 466;
-const int CSSValueMediumblue = 467;
-const int CSSValueMediumorchid = 468;
-const int CSSValueMediumpurple = 469;
-const int CSSValueMediumseagreen = 470;
-const int CSSValueMediumslateblue = 471;
-const int CSSValueMediumspringgreen = 472;
-const int CSSValueMediumturquoise = 473;
-const int CSSValueMediumvioletred = 474;
-const int CSSValueMidnightblue = 475;
-const int CSSValueMintcream = 476;
-const int CSSValueMistyrose = 477;
-const int CSSValueMoccasin = 478;
-const int CSSValueNavajowhite = 479;
-const int CSSValueOldlace = 480;
-const int CSSValueOlivedrab = 481;
-const int CSSValueOrangered = 482;
-const int CSSValueOrchid = 483;
-const int CSSValuePalegoldenrod = 484;
-const int CSSValuePalegreen = 485;
-const int CSSValuePaleturquoise = 486;
-const int CSSValuePalevioletred = 487;
-const int CSSValuePapayawhip = 488;
-const int CSSValuePeachpuff = 489;
-const int CSSValuePeru = 490;
-const int CSSValuePink = 491;
-const int CSSValuePlum = 492;
-const int CSSValuePowderblue = 493;
-const int CSSValueRosybrown = 494;
-const int CSSValueRoyalblue = 495;
-const int CSSValueSaddlebrown = 496;
-const int CSSValueSalmon = 497;
-const int CSSValueSandybrown = 498;
-const int CSSValueSeagreen = 499;
-const int CSSValueSeashell = 500;
-const int CSSValueSienna = 501;
-const int CSSValueSkyblue = 502;
-const int CSSValueSlateblue = 503;
-const int CSSValueSlategray = 504;
-const int CSSValueSlategrey = 505;
-const int CSSValueSnow = 506;
-const int CSSValueSpringgreen = 507;
-const int CSSValueSteelblue = 508;
-const int CSSValueTan = 509;
-const int CSSValueThistle = 510;
-const int CSSValueTomato = 511;
-const int CSSValueTurquoise = 512;
-const int CSSValueViolet = 513;
-const int CSSValueWheat = 514;
-const int CSSValueWhitesmoke = 515;
-const int CSSValueYellowgreen = 516;
-const int CSSValueNonzero = 517;
-const int CSSValueEvenodd = 518;
-const int CSSValueAccumulate = 519;
-const int CSSValueNew = 520;
-const int CSSValueSrgb = 521;
-const int CSSValueLinearrgb = 522;
-const int CSSValueOptimizespeed = 523;
-const int CSSValueOptimizequality = 524;
-const int CSSValueCrispedges = 525;
-const int CSSValueGeometricprecision = 526;
-const int CSSValueButt = 527;
-const int CSSValueMiter = 528;
-const int CSSValueBevel = 529;
-const int CSSValueOptimizelegibility = 530;
-const int CSSValueBeforeEdge = 531;
-const int CSSValueAfterEdge = 532;
-const int CSSValueCentral = 533;
-const int CSSValueTextBeforeEdge = 534;
-const int CSSValueTextAfterEdge = 535;
-const int CSSValueIdeographic = 536;
-const int CSSValueAlphabetic = 537;
-const int CSSValueHanging = 538;
-const int CSSValueMathematical = 539;
-const int CSSValueUseScript = 540;
-const int CSSValueNoChange = 541;
-const int CSSValueResetSize = 542;
-const int CSSValueLrTb = 543;
-const int CSSValueRlTb = 544;
-const int CSSValueTbRl = 545;
-const int CSSValueLr = 546;
-const int CSSValueRl = 547;
-const int CSSValueTb = 548;
-const int numCSSValueKeywords = 549;
+const int CSSValueListButton = 323;
+const int CSSValueListbox = 324;
+const int CSSValueListitem = 325;
+const int CSSValueMediaFullscreenButton = 326;
+const int CSSValueMediaMuteButton = 327;
+const int CSSValueMediaPlayButton = 328;
+const int CSSValueMediaSeekBackButton = 329;
+const int CSSValueMediaSeekForwardButton = 330;
+const int CSSValueMediaRewindButton = 331;
+const int CSSValueMediaReturnToRealtimeButton = 332;
+const int CSSValueMediaSlider = 333;
+const int CSSValueMediaSliderthumb = 334;
+const int CSSValueMediaVolumeSliderContainer = 335;
+const int CSSValueMediaVolumeSlider = 336;
+const int CSSValueMediaVolumeSliderthumb = 337;
+const int CSSValueMediaControlsBackground = 338;
+const int CSSValueMediaCurrentTimeDisplay = 339;
+const int CSSValueMediaTimeRemainingDisplay = 340;
+const int CSSValueMenulist = 341;
+const int CSSValueMenulistButton = 342;
+const int CSSValueMenulistText = 343;
+const int CSSValueMenulistTextfield = 344;
+const int CSSValueSliderHorizontal = 345;
+const int CSSValueSliderVertical = 346;
+const int CSSValueSliderthumbHorizontal = 347;
+const int CSSValueSliderthumbVertical = 348;
+const int CSSValueCaret = 349;
+const int CSSValueSearchfield = 350;
+const int CSSValueSearchfieldDecoration = 351;
+const int CSSValueSearchfieldResultsDecoration = 352;
+const int CSSValueSearchfieldResultsButton = 353;
+const int CSSValueSearchfieldCancelButton = 354;
+const int CSSValueTextfield = 355;
+const int CSSValueTextarea = 356;
+const int CSSValueCapsLockIndicator = 357;
+const int CSSValueRound = 358;
+const int CSSValueBorder = 359;
+const int CSSValueBorderBox = 360;
+const int CSSValueContent = 361;
+const int CSSValueContentBox = 362;
+const int CSSValuePadding = 363;
+const int CSSValuePaddingBox = 364;
+const int CSSValueContain = 365;
+const int CSSValueCover = 366;
+const int CSSValueLogical = 367;
+const int CSSValueVisual = 368;
+const int CSSValueLines = 369;
+const int CSSValueRunning = 370;
+const int CSSValuePaused = 371;
+const int CSSValueFlat = 372;
+const int CSSValuePreserve3d = 373;
+const int CSSValueEase = 374;
+const int CSSValueLinear = 375;
+const int CSSValueEaseIn = 376;
+const int CSSValueEaseOut = 377;
+const int CSSValueEaseInOut = 378;
+const int CSSValueDocument = 379;
+const int CSSValueReset = 380;
+const int CSSValueVisiblepainted = 381;
+const int CSSValueVisiblefill = 382;
+const int CSSValueVisiblestroke = 383;
+const int CSSValuePainted = 384;
+const int CSSValueFill = 385;
+const int CSSValueStroke = 386;
+const int CSSValueAntialiased = 387;
+const int CSSValueSubpixelAntialiased = 388;
+const int CSSValueOptimizespeed = 389;
+const int CSSValueOptimizelegibility = 390;
+const int CSSValueGeometricprecision = 391;
+const int CSSValueAliceblue = 392;
+const int CSSValueAntiquewhite = 393;
+const int CSSValueAquamarine = 394;
+const int CSSValueAzure = 395;
+const int CSSValueBeige = 396;
+const int CSSValueBisque = 397;
+const int CSSValueBlanchedalmond = 398;
+const int CSSValueBlueviolet = 399;
+const int CSSValueBrown = 400;
+const int CSSValueBurlywood = 401;
+const int CSSValueCadetblue = 402;
+const int CSSValueChartreuse = 403;
+const int CSSValueChocolate = 404;
+const int CSSValueCoral = 405;
+const int CSSValueCornflowerblue = 406;
+const int CSSValueCornsilk = 407;
+const int CSSValueCrimson = 408;
+const int CSSValueCyan = 409;
+const int CSSValueDarkblue = 410;
+const int CSSValueDarkcyan = 411;
+const int CSSValueDarkgoldenrod = 412;
+const int CSSValueDarkgray = 413;
+const int CSSValueDarkgreen = 414;
+const int CSSValueDarkgrey = 415;
+const int CSSValueDarkkhaki = 416;
+const int CSSValueDarkmagenta = 417;
+const int CSSValueDarkolivegreen = 418;
+const int CSSValueDarkorange = 419;
+const int CSSValueDarkorchid = 420;
+const int CSSValueDarkred = 421;
+const int CSSValueDarksalmon = 422;
+const int CSSValueDarkseagreen = 423;
+const int CSSValueDarkslateblue = 424;
+const int CSSValueDarkslategray = 425;
+const int CSSValueDarkslategrey = 426;
+const int CSSValueDarkturquoise = 427;
+const int CSSValueDarkviolet = 428;
+const int CSSValueDeeppink = 429;
+const int CSSValueDeepskyblue = 430;
+const int CSSValueDimgray = 431;
+const int CSSValueDimgrey = 432;
+const int CSSValueDodgerblue = 433;
+const int CSSValueFirebrick = 434;
+const int CSSValueFloralwhite = 435;
+const int CSSValueForestgreen = 436;
+const int CSSValueGainsboro = 437;
+const int CSSValueGhostwhite = 438;
+const int CSSValueGold = 439;
+const int CSSValueGoldenrod = 440;
+const int CSSValueGreenyellow = 441;
+const int CSSValueHoneydew = 442;
+const int CSSValueHotpink = 443;
+const int CSSValueIndianred = 444;
+const int CSSValueIndigo = 445;
+const int CSSValueIvory = 446;
+const int CSSValueKhaki = 447;
+const int CSSValueLavender = 448;
+const int CSSValueLavenderblush = 449;
+const int CSSValueLawngreen = 450;
+const int CSSValueLemonchiffon = 451;
+const int CSSValueLightblue = 452;
+const int CSSValueLightcoral = 453;
+const int CSSValueLightcyan = 454;
+const int CSSValueLightgoldenrodyellow = 455;
+const int CSSValueLightgray = 456;
+const int CSSValueLightgreen = 457;
+const int CSSValueLightgrey = 458;
+const int CSSValueLightpink = 459;
+const int CSSValueLightsalmon = 460;
+const int CSSValueLightseagreen = 461;
+const int CSSValueLightskyblue = 462;
+const int CSSValueLightslategray = 463;
+const int CSSValueLightslategrey = 464;
+const int CSSValueLightsteelblue = 465;
+const int CSSValueLightyellow = 466;
+const int CSSValueLimegreen = 467;
+const int CSSValueLinen = 468;
+const int CSSValueMagenta = 469;
+const int CSSValueMediumaquamarine = 470;
+const int CSSValueMediumblue = 471;
+const int CSSValueMediumorchid = 472;
+const int CSSValueMediumpurple = 473;
+const int CSSValueMediumseagreen = 474;
+const int CSSValueMediumslateblue = 475;
+const int CSSValueMediumspringgreen = 476;
+const int CSSValueMediumturquoise = 477;
+const int CSSValueMediumvioletred = 478;
+const int CSSValueMidnightblue = 479;
+const int CSSValueMintcream = 480;
+const int CSSValueMistyrose = 481;
+const int CSSValueMoccasin = 482;
+const int CSSValueNavajowhite = 483;
+const int CSSValueOldlace = 484;
+const int CSSValueOlivedrab = 485;
+const int CSSValueOrangered = 486;
+const int CSSValueOrchid = 487;
+const int CSSValuePalegoldenrod = 488;
+const int CSSValuePalegreen = 489;
+const int CSSValuePaleturquoise = 490;
+const int CSSValuePalevioletred = 491;
+const int CSSValuePapayawhip = 492;
+const int CSSValuePeachpuff = 493;
+const int CSSValuePeru = 494;
+const int CSSValuePink = 495;
+const int CSSValuePlum = 496;
+const int CSSValuePowderblue = 497;
+const int CSSValueRosybrown = 498;
+const int CSSValueRoyalblue = 499;
+const int CSSValueSaddlebrown = 500;
+const int CSSValueSalmon = 501;
+const int CSSValueSandybrown = 502;
+const int CSSValueSeagreen = 503;
+const int CSSValueSeashell = 504;
+const int CSSValueSienna = 505;
+const int CSSValueSkyblue = 506;
+const int CSSValueSlateblue = 507;
+const int CSSValueSlategray = 508;
+const int CSSValueSlategrey = 509;
+const int CSSValueSnow = 510;
+const int CSSValueSpringgreen = 511;
+const int CSSValueSteelblue = 512;
+const int CSSValueTan = 513;
+const int CSSValueThistle = 514;
+const int CSSValueTomato = 515;
+const int CSSValueTurquoise = 516;
+const int CSSValueViolet = 517;
+const int CSSValueWheat = 518;
+const int CSSValueWhitesmoke = 519;
+const int CSSValueYellowgreen = 520;
+const int CSSValueNonzero = 521;
+const int CSSValueEvenodd = 522;
+const int CSSValueAccumulate = 523;
+const int CSSValueNew = 524;
+const int CSSValueSrgb = 525;
+const int CSSValueLinearrgb = 526;
+const int CSSValueOptimizequality = 527;
+const int CSSValueCrispedges = 528;
+const int CSSValueButt = 529;
+const int CSSValueMiter = 530;
+const int CSSValueBevel = 531;
+const int CSSValueBeforeEdge = 532;
+const int CSSValueAfterEdge = 533;
+const int CSSValueCentral = 534;
+const int CSSValueTextBeforeEdge = 535;
+const int CSSValueTextAfterEdge = 536;
+const int CSSValueIdeographic = 537;
+const int CSSValueAlphabetic = 538;
+const int CSSValueHanging = 539;
+const int CSSValueMathematical = 540;
+const int CSSValueUseScript = 541;
+const int CSSValueNoChange = 542;
+const int CSSValueResetSize = 543;
+const int CSSValueLrTb = 544;
+const int CSSValueRlTb = 545;
+const int CSSValueTbRl = 546;
+const int CSSValueLr = 547;
+const int CSSValueRl = 548;
+const int CSSValueTb = 549;
+const int numCSSValueKeywords = 550;
const size_t maxCSSValueKeywordLength = 31;
const char* getValueName(unsigned short id);
diff --git a/src/3rdparty/webkit/WebCore/generated/Grammar.cpp b/src/3rdparty/webkit/WebCore/generated/Grammar.cpp
index 973f104..ee402fc 100644
--- a/src/3rdparty/webkit/WebCore/generated/Grammar.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/Grammar.cpp
@@ -236,6 +236,7 @@
#include "JSObject.h"
#include "JSString.h"
+#include "Lexer.h"
#include "NodeConstructors.h"
#include "NodeInfo.h"
#include <stdlib.h>
@@ -257,7 +258,6 @@
#define YYERROR_VERBOSE
#endif
-int jscyylex(void* lvalp, void* llocp, void* globalPtr);
int jscyyerror(const char*);
static inline bool allowAutomaticSemicolon(JSC::Lexer&, int);
diff --git a/src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp b/src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp
index 4e51f54..06d1f1f 100644
--- a/src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/HTMLNames.cpp
@@ -409,6 +409,7 @@ DEFINE_GLOBAL(QualifiedName, objectAttr, nullAtom, "object", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onabortAttr, nullAtom, "onabort", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onbeforecopyAttr, nullAtom, "onbeforecopy", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onbeforecutAttr, nullAtom, "onbeforecut", xhtmlNamespaceURI);
+DEFINE_GLOBAL(QualifiedName, onbeforeloadAttr, nullAtom, "onbeforeload", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onbeforepasteAttr, nullAtom, "onbeforepaste", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onbeforeunloadAttr, nullAtom, "onbeforeunload", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onblurAttr, nullAtom, "onblur", xhtmlNamespaceURI);
@@ -441,7 +442,6 @@ DEFINE_GLOBAL(QualifiedName, onkeyupAttr, nullAtom, "onkeyup", xhtmlNamespaceURI
DEFINE_GLOBAL(QualifiedName, onloadAttr, nullAtom, "onload", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onloadeddataAttr, nullAtom, "onloadeddata", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onloadedmetadataAttr, nullAtom, "onloadedmetadata", xhtmlNamespaceURI);
-DEFINE_GLOBAL(QualifiedName, onloadendAttr, nullAtom, "onloadend", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onloadstartAttr, nullAtom, "onloadstart", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onmousedownAttr, nullAtom, "onmousedown", xhtmlNamespaceURI);
DEFINE_GLOBAL(QualifiedName, onmousemoveAttr, nullAtom, "onmousemove", xhtmlNamespaceURI);
@@ -661,6 +661,7 @@ WebCore::QualifiedName** getHTMLAttrs(size_t* size)
(WebCore::QualifiedName*)&onabortAttr,
(WebCore::QualifiedName*)&onbeforecopyAttr,
(WebCore::QualifiedName*)&onbeforecutAttr,
+ (WebCore::QualifiedName*)&onbeforeloadAttr,
(WebCore::QualifiedName*)&onbeforepasteAttr,
(WebCore::QualifiedName*)&onbeforeunloadAttr,
(WebCore::QualifiedName*)&onblurAttr,
@@ -693,7 +694,6 @@ WebCore::QualifiedName** getHTMLAttrs(size_t* size)
(WebCore::QualifiedName*)&onloadAttr,
(WebCore::QualifiedName*)&onloadeddataAttr,
(WebCore::QualifiedName*)&onloadedmetadataAttr,
- (WebCore::QualifiedName*)&onloadendAttr,
(WebCore::QualifiedName*)&onloadstartAttr,
(WebCore::QualifiedName*)&onmousedownAttr,
(WebCore::QualifiedName*)&onmousemoveAttr,
@@ -1166,6 +1166,7 @@ void init()
const char *onabortAttrString = "onabort";
const char *onbeforecopyAttrString = "onbeforecopy";
const char *onbeforecutAttrString = "onbeforecut";
+ const char *onbeforeloadAttrString = "onbeforeload";
const char *onbeforepasteAttrString = "onbeforepaste";
const char *onbeforeunloadAttrString = "onbeforeunload";
const char *onblurAttrString = "onblur";
@@ -1198,7 +1199,6 @@ void init()
const char *onloadAttrString = "onload";
const char *onloadeddataAttrString = "onloadeddata";
const char *onloadedmetadataAttrString = "onloadedmetadata";
- const char *onloadendAttrString = "onloadend";
const char *onloadstartAttrString = "onloadstart";
const char *onmousedownAttrString = "onmousedown";
const char *onmousemoveAttrString = "onmousemove";
@@ -1413,6 +1413,7 @@ void init()
new ((void*)&onabortAttr) QualifiedName(nullAtom, onabortAttrString, nullAtom);
new ((void*)&onbeforecopyAttr) QualifiedName(nullAtom, onbeforecopyAttrString, nullAtom);
new ((void*)&onbeforecutAttr) QualifiedName(nullAtom, onbeforecutAttrString, nullAtom);
+ new ((void*)&onbeforeloadAttr) QualifiedName(nullAtom, onbeforeloadAttrString, nullAtom);
new ((void*)&onbeforepasteAttr) QualifiedName(nullAtom, onbeforepasteAttrString, nullAtom);
new ((void*)&onbeforeunloadAttr) QualifiedName(nullAtom, onbeforeunloadAttrString, nullAtom);
new ((void*)&onblurAttr) QualifiedName(nullAtom, onblurAttrString, nullAtom);
@@ -1445,7 +1446,6 @@ void init()
new ((void*)&onloadAttr) QualifiedName(nullAtom, onloadAttrString, nullAtom);
new ((void*)&onloadeddataAttr) QualifiedName(nullAtom, onloadeddataAttrString, nullAtom);
new ((void*)&onloadedmetadataAttr) QualifiedName(nullAtom, onloadedmetadataAttrString, nullAtom);
- new ((void*)&onloadendAttr) QualifiedName(nullAtom, onloadendAttrString, nullAtom);
new ((void*)&onloadstartAttr) QualifiedName(nullAtom, onloadstartAttrString, nullAtom);
new ((void*)&onmousedownAttr) QualifiedName(nullAtom, onmousedownAttrString, nullAtom);
new ((void*)&onmousemoveAttr) QualifiedName(nullAtom, onmousemoveAttrString, nullAtom);
diff --git a/src/3rdparty/webkit/WebCore/generated/HTMLNames.h b/src/3rdparty/webkit/WebCore/generated/HTMLNames.h
index d7d327f..6fd108e 100644
--- a/src/3rdparty/webkit/WebCore/generated/HTMLNames.h
+++ b/src/3rdparty/webkit/WebCore/generated/HTMLNames.h
@@ -280,6 +280,7 @@ extern const WebCore::QualifiedName objectAttr;
extern const WebCore::QualifiedName onabortAttr;
extern const WebCore::QualifiedName onbeforecopyAttr;
extern const WebCore::QualifiedName onbeforecutAttr;
+extern const WebCore::QualifiedName onbeforeloadAttr;
extern const WebCore::QualifiedName onbeforepasteAttr;
extern const WebCore::QualifiedName onbeforeunloadAttr;
extern const WebCore::QualifiedName onblurAttr;
@@ -312,7 +313,6 @@ extern const WebCore::QualifiedName onkeyupAttr;
extern const WebCore::QualifiedName onloadAttr;
extern const WebCore::QualifiedName onloadeddataAttr;
extern const WebCore::QualifiedName onloadedmetadataAttr;
-extern const WebCore::QualifiedName onloadendAttr;
extern const WebCore::QualifiedName onloadstartAttr;
extern const WebCore::QualifiedName onmousedownAttr;
extern const WebCore::QualifiedName onmousemoveAttr;
diff --git a/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp b/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp
index 1bc76c7..d472340 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSAbstractWorkerConstructor::s_info = { "AbstractWorkerConstructor", 0, &JSAbstractWorkerConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h b/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h
index a4232c5..882c091 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSAbstractWorker.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -60,6 +60,8 @@ public:
private:
RefPtr<AbstractWorker> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, AbstractWorker*);
@@ -75,9 +77,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSAbstractWorkerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSAttr.cpp b/src/3rdparty/webkit/WebCore/generated/JSAttr.cpp
index b8a69a5..89cfed1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSAttr.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSAttr.cpp
@@ -84,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSAttrConstructor::s_info = { "AttrConstructor", 0, &JSAttrConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSAttr.h b/src/3rdparty/webkit/WebCore/generated/JSAttr.h
index f1aa7af..1562011 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSAttr.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSAttr.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -54,6 +54,8 @@ public:
{
return static_cast<Attr*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
Attr* toAttr(JSC::JSValue);
@@ -66,9 +68,11 @@ public:
static const JSC::ClassInfo s_info;
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSAttrPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSBarInfo.h b/src/3rdparty/webkit/WebCore/generated/JSBarInfo.h
index 7f11801..9c389a1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSBarInfo.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSBarInfo.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
BarInfo* impl() const { return m_impl.get(); }
private:
RefPtr<BarInfo> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, BarInfo*);
@@ -61,7 +63,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSBarInfoPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.cpp
new file mode 100644
index 0000000..a7ec577
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.cpp
@@ -0,0 +1,188 @@
+/*
+ This file is part of the WebKit open source project.
+ This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+#include "JSBeforeLoadEvent.h"
+
+#include "BeforeLoadEvent.h"
+#include "KURL.h"
+#include <runtime/Error.h>
+#include <runtime/JSString.h>
+#include <wtf/GetPtr.h>
+
+using namespace JSC;
+
+namespace WebCore {
+
+ASSERT_CLASS_FITS_IN_CELL(JSBeforeLoadEvent);
+
+/* Hash table */
+
+static const HashTableValue JSBeforeLoadEventTableValues[3] =
+{
+ { "url", DontDelete|ReadOnly, (intptr_t)jsBeforeLoadEventUrl, (intptr_t)0 },
+ { "constructor", DontEnum|ReadOnly, (intptr_t)jsBeforeLoadEventConstructor, (intptr_t)0 },
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSBeforeLoadEventTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 1, JSBeforeLoadEventTableValues, 0 };
+#else
+ { 4, 3, JSBeforeLoadEventTableValues, 0 };
+#endif
+
+/* Hash table for constructor */
+
+static const HashTableValue JSBeforeLoadEventConstructorTableValues[1] =
+{
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSBeforeLoadEventConstructorTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 0, JSBeforeLoadEventConstructorTableValues, 0 };
+#else
+ { 1, 0, JSBeforeLoadEventConstructorTableValues, 0 };
+#endif
+
+class JSBeforeLoadEventConstructor : public DOMConstructorObject {
+public:
+ JSBeforeLoadEventConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)
+ : DOMConstructorObject(JSBeforeLoadEventConstructor::createStructure(globalObject->objectPrototype()), globalObject)
+ {
+ putDirect(exec->propertyNames().prototype, JSBeforeLoadEventPrototype::self(exec, globalObject), None);
+ }
+ virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
+ virtual const ClassInfo* classInfo() const { return &s_info; }
+ static const ClassInfo s_info;
+
+ static PassRefPtr<Structure> createStructure(JSValue proto)
+ {
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
+};
+
+const ClassInfo JSBeforeLoadEventConstructor::s_info = { "BeforeLoadEventConstructor", 0, &JSBeforeLoadEventConstructorTable, 0 };
+
+bool JSBeforeLoadEventConstructor::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticValueSlot<JSBeforeLoadEventConstructor, DOMObject>(exec, &JSBeforeLoadEventConstructorTable, this, propertyName, slot);
+}
+
+bool JSBeforeLoadEventConstructor::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticValueDescriptor<JSBeforeLoadEventConstructor, DOMObject>(exec, &JSBeforeLoadEventConstructorTable, this, propertyName, descriptor);
+}
+
+/* Hash table for prototype */
+
+static const HashTableValue JSBeforeLoadEventPrototypeTableValues[2] =
+{
+ { "initBeforeLoadEvent", DontDelete|Function, (intptr_t)jsBeforeLoadEventPrototypeFunctionInitBeforeLoadEvent, (intptr_t)4 },
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSBeforeLoadEventPrototypeTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 0, JSBeforeLoadEventPrototypeTableValues, 0 };
+#else
+ { 2, 1, JSBeforeLoadEventPrototypeTableValues, 0 };
+#endif
+
+const ClassInfo JSBeforeLoadEventPrototype::s_info = { "BeforeLoadEventPrototype", 0, &JSBeforeLoadEventPrototypeTable, 0 };
+
+JSObject* JSBeforeLoadEventPrototype::self(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return getDOMPrototype<JSBeforeLoadEvent>(exec, globalObject);
+}
+
+bool JSBeforeLoadEventPrototype::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticFunctionSlot<JSObject>(exec, &JSBeforeLoadEventPrototypeTable, this, propertyName, slot);
+}
+
+bool JSBeforeLoadEventPrototype::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticFunctionDescriptor<JSObject>(exec, &JSBeforeLoadEventPrototypeTable, this, propertyName, descriptor);
+}
+
+const ClassInfo JSBeforeLoadEvent::s_info = { "BeforeLoadEvent", &JSEvent::s_info, &JSBeforeLoadEventTable, 0 };
+
+JSBeforeLoadEvent::JSBeforeLoadEvent(NonNullPassRefPtr<Structure> structure, JSDOMGlobalObject* globalObject, PassRefPtr<BeforeLoadEvent> impl)
+ : JSEvent(structure, globalObject, impl)
+{
+}
+
+JSObject* JSBeforeLoadEvent::createPrototype(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return new (exec) JSBeforeLoadEventPrototype(JSBeforeLoadEventPrototype::createStructure(JSEventPrototype::self(exec, globalObject)));
+}
+
+bool JSBeforeLoadEvent::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticValueSlot<JSBeforeLoadEvent, Base>(exec, &JSBeforeLoadEventTable, this, propertyName, slot);
+}
+
+bool JSBeforeLoadEvent::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticValueDescriptor<JSBeforeLoadEvent, Base>(exec, &JSBeforeLoadEventTable, this, propertyName, descriptor);
+}
+
+JSValue jsBeforeLoadEventUrl(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSBeforeLoadEvent* castedThis = static_cast<JSBeforeLoadEvent*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ BeforeLoadEvent* imp = static_cast<BeforeLoadEvent*>(castedThis->impl());
+ return jsString(exec, imp->url());
+}
+
+JSValue jsBeforeLoadEventConstructor(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSBeforeLoadEvent* domObject = static_cast<JSBeforeLoadEvent*>(asObject(slot.slotBase()));
+ return JSBeforeLoadEvent::getConstructor(exec, domObject->globalObject());
+}
+JSValue JSBeforeLoadEvent::getConstructor(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return getDOMConstructor<JSBeforeLoadEventConstructor>(exec, static_cast<JSDOMGlobalObject*>(globalObject));
+}
+
+JSValue JSC_HOST_CALL jsBeforeLoadEventPrototypeFunctionInitBeforeLoadEvent(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSBeforeLoadEvent::s_info))
+ return throwError(exec, TypeError);
+ JSBeforeLoadEvent* castedThisObj = static_cast<JSBeforeLoadEvent*>(asObject(thisValue));
+ BeforeLoadEvent* imp = static_cast<BeforeLoadEvent*>(castedThisObj->impl());
+ const UString& type = args.at(0).toString(exec);
+ bool canBubble = args.at(1).toBoolean(exec);
+ bool cancelable = args.at(2).toBoolean(exec);
+ const UString& url = args.at(3).toString(exec);
+
+ imp->initBeforeLoadEvent(type, canBubble, cancelable, url);
+ return jsUndefined();
+}
+
+
+}
diff --git a/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.h b/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.h
new file mode 100644
index 0000000..e575192
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/generated/JSBeforeLoadEvent.h
@@ -0,0 +1,78 @@
+/*
+ This file is part of the WebKit open source project.
+ This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef JSBeforeLoadEvent_h
+#define JSBeforeLoadEvent_h
+
+#include "JSEvent.h"
+
+namespace WebCore {
+
+class BeforeLoadEvent;
+
+class JSBeforeLoadEvent : public JSEvent {
+ typedef JSEvent Base;
+public:
+ JSBeforeLoadEvent(NonNullPassRefPtr<JSC::Structure>, JSDOMGlobalObject*, PassRefPtr<BeforeLoadEvent>);
+ static JSC::JSObject* createPrototype(JSC::ExecState*, JSC::JSGlobalObject*);
+ virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
+ virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
+ static const JSC::ClassInfo s_info;
+
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+ static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
+};
+
+
+class JSBeforeLoadEventPrototype : public JSC::JSObject {
+ typedef JSC::JSObject Base;
+public:
+ static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
+ virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
+ static const JSC::ClassInfo s_info;
+ virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier&, JSC::PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+ JSBeforeLoadEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
+};
+
+// Functions
+
+JSC::JSValue JSC_HOST_CALL jsBeforeLoadEventPrototypeFunctionInitBeforeLoadEvent(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+// Attributes
+
+JSC::JSValue jsBeforeLoadEventUrl(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsBeforeLoadEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+
+} // namespace WebCore
+
+#endif
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp b/src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp
index 01b4c11..bdc4a93 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCDATASection.cpp
@@ -73,8 +73,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCDATASectionConstructor::s_info = { "CDATASectionConstructor", 0, &JSCDATASectionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCDATASection.h b/src/3rdparty/webkit/WebCore/generated/JSCDATASection.h
index 8d1352c..80b824c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCDATASection.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCDATASection.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, CDATASection*);
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCDATASectionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp
index 83f4a64..52c01c7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.cpp
@@ -75,8 +75,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSCharsetRuleConstructor::s_info = { "CSSCharsetRuleConstructor", 0, &JSCSSCharsetRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h
index 9ad4e9c..971cfb1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSCharsetRule.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSCharsetRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp
index 38b6fce..012e437 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSFontFaceRuleConstructor::s_info = { "CSSFontFaceRuleConstructor", 0, &JSCSSFontFaceRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h
index c99c45d..6a6acb2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSFontFaceRule.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSFontFaceRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp
index c23f7fe..e3ae983 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSImportRuleConstructor::s_info = { "CSSImportRuleConstructor", 0, &JSCSSImportRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h
index 5e73495..14e289a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSImportRule.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSImportRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp
index e0c713b..fbb26e8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSMediaRuleConstructor::s_info = { "CSSMediaRuleConstructor", 0, &JSCSSMediaRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h
index 3751a8e..225e70a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSMediaRule.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSMediaRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp
index 1d94046..b1da3b9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSPageRuleConstructor::s_info = { "CSSPageRuleConstructor", 0, &JSCSSPageRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h
index d62bc67..8ba0942 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSPageRule.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSPageRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp
index ee2288d..ea0517c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.cpp
@@ -110,8 +110,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSPrimitiveValueConstructor::s_info = { "CSSPrimitiveValueConstructor", 0, &JSCSSPrimitiveValueConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h b/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h
index a2cec7c..c015d4c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSPrimitiveValue.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSPrimitiveValuePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp
index 02231b7..307b17a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSRule.cpp
@@ -92,8 +92,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSRuleConstructor::s_info = { "CSSRuleConstructor", 0, &JSCSSRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSRule.h
index 4df85da..afc609c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSRule.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -52,6 +52,8 @@ public:
private:
RefPtr<CSSRule> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CSSRule*);
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp
index 3c7bb93..e02a6ce 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSRuleListConstructor::s_info = { "CSSRuleListConstructor", 0, &JSCSSRuleListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h b/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h
index 5f61961..8b4a59d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSRuleList.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<CSSRuleList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -71,9 +73,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSRuleListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp
index 63cd7a5..6292b64 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSStyleDeclarationConstructor::s_info = { "CSSStyleDeclarationConstructor", 0, &JSCSSStyleDeclarationConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h
index bf9f943..48c6a9b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleDeclaration.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -57,6 +57,8 @@ public:
private:
RefPtr<CSSStyleDeclaration> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, CSSStyleDeclaration*, const JSC::Identifier&);
@@ -76,9 +78,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSStyleDeclarationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp
index aa27d94..d44bb5c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSStyleRuleConstructor::s_info = { "CSSStyleRuleConstructor", 0, &JSCSSStyleRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h
index 9955974..fc72cbf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleRule.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSStyleRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp
index 4073c6f..e2d45bc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSStyleSheetConstructor::s_info = { "CSSStyleSheetConstructor", 0, &JSCSSStyleSheetConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h
index a807b47..4df8ea3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSStyleSheet.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSStyleSheetPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp
index 6f61adb..22f6c30 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSValue.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSValueConstructor::s_info = { "CSSValueConstructor", 0, &JSCSSValueConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSValue.h b/src/3rdparty/webkit/WebCore/generated/JSCSSValue.h
index ceec3aa..cd54be1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSValue.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSValue.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -52,6 +52,8 @@ public:
private:
RefPtr<CSSValue> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CSSValue*);
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSValuePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp
index 56afec2..3e78786 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSValueListConstructor::s_info = { "CSSValueListConstructor", 0, &JSCSSValueListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h b/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h
index 8603e87..c57887e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSValueList.h
@@ -40,11 +40,13 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSValueListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp
index 65f225f..ef1d726 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSVariablesDeclarationConstructor::s_info = { "CSSVariablesDeclarationConstructor", 0, &JSCSSVariablesDeclarationConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h
index dff45a3..1eee675 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesDeclaration.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<CSSVariablesDeclaration> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCSSVariablesDeclarationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp
index 2c61ec7..4888123 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCSSVariablesRuleConstructor::s_info = { "CSSVariablesRuleConstructor", 0, &JSCSSVariablesRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h
index 6248363..f3bee08 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCSSVariablesRule.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCSSVariablesRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.cpp b/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.cpp
index 26409c8..aeeeb4f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.cpp
@@ -145,10 +145,6 @@ JSValue JSC_HOST_CALL jsCanvasArrayPrototypeFunctionAlignedSizeInBytes(ExecState
return result;
}
-JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, CanvasArray* object)
-{
- return getDOMObjectWrapper<JSCanvasArray>(exec, globalObject, object);
-}
CanvasArray* toCanvasArray(JSC::JSValue value)
{
return value.inherits(&JSCanvasArray::s_info) ? static_cast<JSCanvasArray*>(asObject(value))->impl() : 0;
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.h
index 0a12328..0d67612 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasArray.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
CanvasArray* impl() const { return m_impl.get(); }
private:
RefPtr<CanvasArray> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CanvasArray*);
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCanvasArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasArrayBuffer.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasArrayBuffer.h
index 16a3945..eff168f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasArrayBuffer.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasArrayBuffer.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
CanvasArrayBuffer* impl() const { return m_impl.get(); }
private:
RefPtr<CanvasArrayBuffer> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CanvasArrayBuffer*);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasArrayBufferPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasByteArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasByteArray.h
index 0c30bfd..c76c679 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasByteArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasByteArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasByteArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasByteArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasFloatArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasFloatArray.h
index 347e334..c96508e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasFloatArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasFloatArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasFloatArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasFloatArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h
index 6d5c822..bd7aa3d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasGradient.h
@@ -39,10 +39,17 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
CanvasGradient* impl() const { return m_impl.get(); }
private:
RefPtr<CanvasGradient> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CanvasGradient*);
@@ -58,9 +65,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCanvasGradientPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasIntArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasIntArray.h
index e0358dd..f4deadf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasIntArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasIntArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasIntArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasIntArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h
index e7d0a9c..7574813 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasPattern.h
@@ -39,10 +39,17 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
CanvasPattern* impl() const { return m_impl.get(); }
private:
RefPtr<CanvasPattern> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CanvasPattern*);
@@ -54,7 +61,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasPatternPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.cpp b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.cpp
index ad807c6..1d06dfe 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCanvasRenderingContextConstructor::s_info = { "CanvasRenderingContextConstructor", 0, &JSCanvasRenderingContextConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.h
index 7b6ca92..a8b56a4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<CanvasRenderingContext> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, CanvasRenderingContext*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasRenderingContextPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp
index dc8d58f..97b4d72 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCanvasRenderingContext2DConstructor::s_info = { "CanvasRenderingContext2DConstructor", 0, &JSCanvasRenderingContext2DConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h
index 03008b6..5637651 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext2D.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -62,6 +62,8 @@ public:
JSC::JSValue setShadow(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue createPattern(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue putImageData(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -75,9 +77,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCanvasRenderingContext2DPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.cpp b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.cpp
index ff9f7b6..7ed7f05 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.cpp
@@ -24,6 +24,8 @@
#include "JSCanvasRenderingContext3D.h"
+#include "CanvasActiveInfo.h"
+#include "CanvasArray.h"
#include "CanvasBuffer.h"
#include "CanvasFloatArray.h"
#include "CanvasFramebuffer.h"
@@ -34,6 +36,8 @@
#include "CanvasShader.h"
#include "CanvasTexture.h"
#include "CanvasUnsignedByteArray.h"
+#include "JSCanvasActiveInfo.h"
+#include "JSCanvasArray.h"
#include "JSCanvasBuffer.h"
#include "JSCanvasFloatArray.h"
#include "JSCanvasFramebuffer.h"
@@ -400,8 +404,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCanvasRenderingContext3DConstructor::s_info = { "CanvasRenderingContext3DConstructor", 0, &JSCanvasRenderingContext3DConstructorTable, 0 };
@@ -418,7 +425,7 @@ bool JSCanvasRenderingContext3DConstructor::getOwnPropertyDescriptor(ExecState*
/* Hash table for prototype */
-static const HashTableValue JSCanvasRenderingContext3DPrototypeTableValues[450] =
+static const HashTableValue JSCanvasRenderingContext3DPrototypeTableValues[453] =
{
{ "DEPTH_BUFFER_BIT", DontDelete|ReadOnly, (intptr_t)jsCanvasRenderingContext3DDEPTH_BUFFER_BIT, (intptr_t)0 },
{ "STENCIL_BUFFER_BIT", DontDelete|ReadOnly, (intptr_t)jsCanvasRenderingContext3DSTENCIL_BUFFER_BIT, (intptr_t)0 },
@@ -775,6 +782,8 @@ static const HashTableValue JSCanvasRenderingContext3DPrototypeTableValues[450]
{ "framebufferTexture2D", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionFramebufferTexture2D, (intptr_t)5 },
{ "frontFace", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionFrontFace, (intptr_t)1 },
{ "generateMipmap", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGenerateMipmap, (intptr_t)1 },
+ { "getActiveAttrib", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGetActiveAttrib, (intptr_t)2 },
+ { "getActiveUniform", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGetActiveUniform, (intptr_t)2 },
{ "getAttribLocation", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGetAttribLocation, (intptr_t)2 },
{ "getBoolean", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGetBoolean, (intptr_t)1 },
{ "getBooleanv", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionGetBooleanv, (intptr_t)1 },
@@ -823,6 +832,7 @@ static const HashTableValue JSCanvasRenderingContext3DPrototypeTableValues[450]
{ "linkProgram", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionLinkProgram, (intptr_t)1 },
{ "pixelStorei", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionPixelStorei, (intptr_t)2 },
{ "polygonOffset", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionPolygonOffset, (intptr_t)2 },
+ { "readPixels", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionReadPixels, (intptr_t)6 },
{ "releaseShaderCompiler", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionReleaseShaderCompiler, (intptr_t)0 },
{ "renderbufferStorage", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionRenderbufferStorage, (intptr_t)4 },
{ "sampleCoverage", DontDelete|Function, (intptr_t)jsCanvasRenderingContext3DPrototypeFunctionSampleCoverage, (intptr_t)2 },
@@ -876,7 +886,7 @@ static JSC_CONST_HASHTABLE HashTable JSCanvasRenderingContext3DPrototypeTable =
#if ENABLE(PERFECT_HASH_SIZE)
{ 65535, JSCanvasRenderingContext3DPrototypeTableValues, 0 };
#else
- { 1103, 1023, JSCanvasRenderingContext3DPrototypeTableValues, 0 };
+ { 1104, 1023, JSCanvasRenderingContext3DPrototypeTableValues, 0 };
#endif
const ClassInfo JSCanvasRenderingContext3DPrototype::s_info = { "CanvasRenderingContext3DPrototype", 0, &JSCanvasRenderingContext3DPrototypeTable, 0 };
@@ -1661,6 +1671,40 @@ JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGenerateMipmap(
return jsUndefined();
}
+JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetActiveAttrib(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSCanvasRenderingContext3D::s_info))
+ return throwError(exec, TypeError);
+ JSCanvasRenderingContext3D* castedThisObj = static_cast<JSCanvasRenderingContext3D*>(asObject(thisValue));
+ CanvasRenderingContext3D* imp = static_cast<CanvasRenderingContext3D*>(castedThisObj->impl());
+ ExceptionCode ec = 0;
+ CanvasProgram* program = toCanvasProgram(args.at(0));
+ unsigned index = args.at(1).toInt32(exec);
+
+
+ JSC::JSValue result = toJS(exec, castedThisObj->globalObject(), WTF::getPtr(imp->getActiveAttrib(program, index, ec)));
+ setDOMException(exec, ec);
+ return result;
+}
+
+JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetActiveUniform(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSCanvasRenderingContext3D::s_info))
+ return throwError(exec, TypeError);
+ JSCanvasRenderingContext3D* castedThisObj = static_cast<JSCanvasRenderingContext3D*>(asObject(thisValue));
+ CanvasRenderingContext3D* imp = static_cast<CanvasRenderingContext3D*>(castedThisObj->impl());
+ ExceptionCode ec = 0;
+ CanvasProgram* program = toCanvasProgram(args.at(0));
+ unsigned index = args.at(1).toInt32(exec);
+
+
+ JSC::JSValue result = toJS(exec, castedThisObj->globalObject(), WTF::getPtr(imp->getActiveUniform(program, index, ec)));
+ setDOMException(exec, ec);
+ return result;
+}
+
JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetAttribLocation(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
@@ -2357,6 +2401,25 @@ JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionPolygonOffset(E
return jsUndefined();
}
+JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionReadPixels(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSCanvasRenderingContext3D::s_info))
+ return throwError(exec, TypeError);
+ JSCanvasRenderingContext3D* castedThisObj = static_cast<JSCanvasRenderingContext3D*>(asObject(thisValue));
+ CanvasRenderingContext3D* imp = static_cast<CanvasRenderingContext3D*>(castedThisObj->impl());
+ int x = args.at(0).toInt32(exec);
+ int y = args.at(1).toInt32(exec);
+ unsigned width = args.at(2).toInt32(exec);
+ unsigned height = args.at(3).toInt32(exec);
+ unsigned format = args.at(4).toInt32(exec);
+ unsigned type = args.at(5).toInt32(exec);
+
+
+ JSC::JSValue result = toJS(exec, castedThisObj->globalObject(), WTF::getPtr(imp->readPixels(x, y, width, height, format, type)));
+ return result;
+}
+
JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionReleaseShaderCompiler(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.h
index 6833836..75ad4d1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasRenderingContext3D.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -66,6 +66,8 @@ public:
JSC::JSValue vertexAttrib2fv(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue vertexAttrib3fv(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue vertexAttrib4fv(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -79,9 +81,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCanvasRenderingContext3DPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -139,6 +143,8 @@ JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionFramebuffe
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionFramebufferTexture2D(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionFrontFace(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGenerateMipmap(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetActiveAttrib(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetActiveUniform(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetAttribLocation(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetBoolean(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionGetBooleanv(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
@@ -187,6 +193,7 @@ JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionLineWidth(
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionLinkProgram(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionPixelStorei(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionPolygonOffset(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionReadPixels(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionReleaseShaderCompiler(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionRenderbufferStorage(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsCanvasRenderingContext3DPrototypeFunctionSampleCoverage(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasShortArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasShortArray.h
index b5b4aa5..688ca0c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasShortArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasShortArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasShortArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasShortArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedByteArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedByteArray.h
index 9e9b643..ccfaef6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedByteArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedByteArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasUnsignedByteArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasUnsignedByteArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedIntArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedIntArray.h
index 916f08f..c53c7ef 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedIntArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedIntArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasUnsignedIntArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasUnsignedIntArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedShortArray.h b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedShortArray.h
index c2d3efb..e9e5127 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedShortArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCanvasUnsignedShortArray.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
{
return static_cast<CanvasUnsignedShortArray*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -66,7 +68,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCanvasUnsignedShortArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp b/src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp
index 2e261cd..2148888 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCharacterData.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCharacterDataConstructor::s_info = { "CharacterDataConstructor", 0, &JSCharacterDataConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCharacterData.h b/src/3rdparty/webkit/WebCore/generated/JSCharacterData.h
index 11d2aab..f06e22b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCharacterData.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCharacterData.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSCharacterDataPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp b/src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp
index e871f45..175d660 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSClientRect.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSClientRectConstructor::s_info = { "ClientRectConstructor", 0, &JSClientRectConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClientRect.h b/src/3rdparty/webkit/WebCore/generated/JSClientRect.h
index 2ed96dd..18962f2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClientRect.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSClientRect.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<ClientRect> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, ClientRect*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSClientRectPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp b/src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp
index 2dd60cc..143ee8c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSClientRectList.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSClientRectListConstructor::s_info = { "ClientRectListConstructor", 0, &JSClientRectListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClientRectList.h b/src/3rdparty/webkit/WebCore/generated/JSClientRectList.h
index 6149018..ce8cb3f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClientRectList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSClientRectList.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<ClientRectList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSClientRectListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp b/src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp
index 22ff137..f72e341 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSClipboard.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSClipboardConstructor::s_info = { "ClipboardConstructor", 0, &JSClipboardConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSClipboard.h b/src/3rdparty/webkit/WebCore/generated/JSClipboard.h
index d4a5532..e4458a7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSClipboard.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSClipboard.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -61,6 +61,8 @@ public:
private:
RefPtr<Clipboard> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Clipboard*);
@@ -76,9 +78,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSClipboardPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSComment.cpp b/src/3rdparty/webkit/WebCore/generated/JSComment.cpp
index 323c771..770a3f2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSComment.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSComment.cpp
@@ -73,8 +73,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCommentConstructor::s_info = { "CommentConstructor", 0, &JSCommentConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSComment.h b/src/3rdparty/webkit/WebCore/generated/JSComment.h
index 79c47c4..e88ddf4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSComment.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSComment.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCommentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSConsole.h b/src/3rdparty/webkit/WebCore/generated/JSConsole.h
index c933ca9..c55cc0e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSConsole.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSConsole.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -53,6 +53,8 @@ public:
private:
RefPtr<Console> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Console*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSConsolePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCoordinates.h b/src/3rdparty/webkit/WebCore/generated/JSCoordinates.h
index 3de9a5b..be0408b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCoordinates.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCoordinates.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -56,6 +56,8 @@ public:
private:
RefPtr<Coordinates> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Coordinates*);
@@ -67,7 +69,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCoordinatesPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCounter.cpp b/src/3rdparty/webkit/WebCore/generated/JSCounter.cpp
index c8ba9f9..d17a368 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCounter.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSCounter.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSCounterConstructor::s_info = { "CounterConstructor", 0, &JSCounterConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSCounter.h b/src/3rdparty/webkit/WebCore/generated/JSCounter.h
index ffc98ba2..9827a48 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSCounter.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSCounter.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<Counter> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Counter*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSCounterPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h b/src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h
index d306322..2ee87d4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMApplicationCache.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -59,6 +59,8 @@ public:
private:
RefPtr<DOMApplicationCache> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DOMApplicationCache*);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMApplicationCachePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp b/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp
index c909c02..d625e2b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.cpp
@@ -102,8 +102,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDOMCoreExceptionConstructor::s_info = { "DOMExceptionConstructor", 0, &JSDOMCoreExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h b/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h
index 116ac2e..0d99c15 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMCoreException.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<DOMCoreException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DOMCoreException*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMCoreExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp b/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp
index 588e21b..62eef6c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDOMImplementationConstructor::s_info = { "DOMImplementationConstructor", 0, &JSDOMImplementationConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h b/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h
index 755f035..8dc907f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMImplementation.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<DOMImplementation> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DOMImplementation*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMImplementationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp b/src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp
index ff99782..4af88cb 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMParser.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
static JSObject* constructDOMParser(ExecState* exec, JSObject* constructor, const ArgList&)
{
return asObject(toJS(exec, static_cast<JSDOMParserConstructor*>(constructor)->globalObject(), DOMParser::create()));
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMParser.h b/src/3rdparty/webkit/WebCore/generated/JSDOMParser.h
index ff7f395..8788ff2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMParser.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMParser.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<DOMParser> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DOMParser*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMParserPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h b/src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h
index e26b627..863723f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMSelection.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
DOMSelection* impl() const { return m_impl.get(); }
private:
RefPtr<DOMSelection> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DOMSelection*);
@@ -65,9 +67,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMSelectionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp b/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp
index 24fc1de..dc53217 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.cpp
@@ -36,6 +36,7 @@
#include "EventListener.h"
#include "JSAttr.h"
#include "JSBarInfo.h"
+#include "JSBeforeLoadEvent.h"
#include "JSCDATASection.h"
#include "JSCSSCharsetRule.h"
#include "JSCSSFontFaceRule.h"
@@ -245,7 +246,7 @@ ASSERT_CLASS_FITS_IN_CELL(JSDOMWindow);
/* Hash table */
-static const HashTableValue JSDOMWindowTableValues[295] =
+static const HashTableValue JSDOMWindowTableValues[296] =
{
{ "screen", DontDelete|ReadOnly, (intptr_t)jsDOMWindowScreen, (intptr_t)0 },
{ "history", DontDelete|ReadOnly, (intptr_t)jsDOMWindowHistory, (intptr_t)0 },
@@ -499,6 +500,7 @@ static const HashTableValue JSDOMWindowTableValues[295] =
{ "CanvasFloatArray", DontDelete, (intptr_t)jsDOMWindowCanvasFloatArrayConstructor, (intptr_t)setJSDOMWindowCanvasFloatArrayConstructor },
#endif
{ "Event", DontDelete, (intptr_t)jsDOMWindowEventConstructor, (intptr_t)setJSDOMWindowEventConstructor },
+ { "BeforeLoadEvent", DontDelete, (intptr_t)jsDOMWindowBeforeLoadEventConstructor, (intptr_t)setJSDOMWindowBeforeLoadEventConstructor },
{ "KeyboardEvent", DontDelete, (intptr_t)jsDOMWindowKeyboardEventConstructor, (intptr_t)setJSDOMWindowKeyboardEventConstructor },
{ "MouseEvent", DontDelete, (intptr_t)jsDOMWindowMouseEventConstructor, (intptr_t)setJSDOMWindowMouseEventConstructor },
{ "MutationEvent", DontDelete, (intptr_t)jsDOMWindowMutationEventConstructor, (intptr_t)setJSDOMWindowMutationEventConstructor },
@@ -2974,6 +2976,14 @@ JSValue jsDOMWindowEventConstructor(ExecState* exec, const Identifier&, const Pr
return JSEvent::getConstructor(exec, castedThis);
}
+JSValue jsDOMWindowBeforeLoadEventConstructor(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSDOMWindow* castedThis = static_cast<JSDOMWindow*>(asObject(slot.slotBase()));
+ if (!castedThis->allowsAccessFrom(exec))
+ return jsUndefined();
+ return JSBeforeLoadEvent::getConstructor(exec, castedThis);
+}
+
JSValue jsDOMWindowKeyboardEventConstructor(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSDOMWindow* castedThis = static_cast<JSDOMWindow*>(asObject(slot.slotBase()));
@@ -5363,6 +5373,14 @@ void setJSDOMWindowEventConstructor(ExecState* exec, JSObject* thisObject, JSVal
static_cast<JSDOMWindow*>(thisObject)->putDirect(Identifier(exec, "Event"), value);
}
+void setJSDOMWindowBeforeLoadEventConstructor(ExecState* exec, JSObject* thisObject, JSValue value)
+{
+ if (!static_cast<JSDOMWindow*>(thisObject)->allowsAccessFrom(exec))
+ return;
+ // Shadowing a built-in constructor
+ static_cast<JSDOMWindow*>(thisObject)->putDirect(Identifier(exec, "BeforeLoadEvent"), value);
+}
+
void setJSDOMWindowKeyboardEventConstructor(ExecState* exec, JSObject* thisObject, JSValue value)
{
if (!static_cast<JSDOMWindow*>(thisObject)->allowsAccessFrom(exec))
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h b/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h
index 75a1e50..232c8eb 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDOMWindow.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance | JSC::NeedsThisConversion));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -99,6 +99,8 @@ public:
{
return static_cast<DOMWindow*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::ImplementsHasInstance | JSC::NeedsThisConversion | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
DOMWindow* toDOMWindow(JSC::JSValue);
@@ -113,9 +115,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDOMWindowPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -601,6 +605,8 @@ JSC::JSValue jsDOMWindowCanvasFloatArrayConstructor(JSC::ExecState*, const JSC::
void setJSDOMWindowCanvasFloatArrayConstructor(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsDOMWindowEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSDOMWindowEventConstructor(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
+JSC::JSValue jsDOMWindowBeforeLoadEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+void setJSDOMWindowBeforeLoadEventConstructor(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsDOMWindowKeyboardEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSDOMWindowKeyboardEventConstructor(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsDOMWindowMouseEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp
index 15ae6c3..586edd1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.cpp
@@ -91,8 +91,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDataGridColumnConstructor::s_info = { "DataGridColumnConstructor", 0, &JSDataGridColumnConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h
index 515b549..c53c99d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumn.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<DataGridColumn> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, DataGridColumn*);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDataGridColumnPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp
index dc8e05f..08585fe 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDataGridColumnListConstructor::s_info = { "DataGridColumnListConstructor", 0, &JSDataGridColumnListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h
index 0c3f10f..ac4d33e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDataGridColumnList.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<DataGridColumnList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, DataGridColumnList*, const JSC::Identifier&);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDataGridColumnListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDatabase.h b/src/3rdparty/webkit/WebCore/generated/JSDatabase.h
index d902ced..0353427 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDatabase.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDatabase.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -57,6 +57,8 @@ public:
private:
RefPtr<Database> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Database*);
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDatabasePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h b/src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h
index b3591bf..2e65842 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDedicatedWorkerContext.h
@@ -42,7 +42,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -52,6 +52,8 @@ public:
{
return static_cast<DedicatedWorkerContext*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
DedicatedWorkerContext* toDedicatedWorkerContext(JSC::JSValue);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDedicatedWorkerContextPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocument.cpp b/src/3rdparty/webkit/WebCore/generated/JSDocument.cpp
index 5017f30..47a2936 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocument.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocument.cpp
@@ -39,6 +39,7 @@
#include "Frame.h"
#include "HTMLCollection.h"
#include "HTMLElement.h"
+#include "HTMLHeadElement.h"
#include "JSAttr.h"
#include "JSCDATASection.h"
#include "JSCSSStyleDeclaration.h"
@@ -57,6 +58,7 @@
#include "JSEventListener.h"
#include "JSHTMLCollection.h"
#include "JSHTMLElement.h"
+#include "JSHTMLHeadElement.h"
#include "JSNode.h"
#include "JSNodeFilter.h"
#include "JSNodeIterator.h"
@@ -96,7 +98,7 @@ ASSERT_CLASS_FITS_IN_CELL(JSDocument);
/* Hash table */
-static const HashTableValue JSDocumentTableValues[70] =
+static const HashTableValue JSDocumentTableValues[71] =
{
{ "doctype", DontDelete|ReadOnly, (intptr_t)jsDocumentDoctype, (intptr_t)0 },
{ "implementation", DontDelete|ReadOnly, (intptr_t)jsDocumentImplementation, (intptr_t)0 },
@@ -114,6 +116,7 @@ static const HashTableValue JSDocumentTableValues[70] =
{ "URL", DontDelete|ReadOnly, (intptr_t)jsDocumentURL, (intptr_t)0 },
{ "cookie", DontDelete, (intptr_t)jsDocumentCookie, (intptr_t)setJSDocumentCookie },
{ "body", DontDelete, (intptr_t)jsDocumentBody, (intptr_t)setJSDocumentBody },
+ { "head", DontDelete|ReadOnly, (intptr_t)jsDocumentHead, (intptr_t)0 },
{ "images", DontDelete|ReadOnly, (intptr_t)jsDocumentImages, (intptr_t)0 },
{ "applets", DontDelete|ReadOnly, (intptr_t)jsDocumentApplets, (intptr_t)0 },
{ "links", DontDelete|ReadOnly, (intptr_t)jsDocumentLinks, (intptr_t)0 },
@@ -205,8 +208,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDocumentConstructor::s_info = { "DocumentConstructor", 0, &JSDocumentConstructorTable, 0 };
@@ -434,6 +440,14 @@ JSValue jsDocumentBody(ExecState* exec, const Identifier&, const PropertySlot& s
return toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->body()));
}
+JSValue jsDocumentHead(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSDocument* castedThis = static_cast<JSDocument*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ Document* imp = static_cast<Document*>(castedThis->impl());
+ return toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->head()));
+}
+
JSValue jsDocumentImages(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSDocument* castedThis = static_cast<JSDocument*>(asObject(slot.slotBase()));
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocument.h b/src/3rdparty/webkit/WebCore/generated/JSDocument.h
index 7cdbcbb..7b72b9b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocument.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocument.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -58,6 +58,8 @@ public:
{
return static_cast<Document*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
ALWAYS_INLINE bool JSDocument::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot)
@@ -83,9 +85,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDocumentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -152,6 +156,7 @@ JSC::JSValue jsDocumentCookie(JSC::ExecState*, const JSC::Identifier&, const JSC
void setJSDocumentCookie(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsDocumentBody(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSDocumentBody(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
+JSC::JSValue jsDocumentHead(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsDocumentImages(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsDocumentApplets(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsDocumentLinks(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp b/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp
index f848040..19a132e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDocumentFragmentConstructor::s_info = { "DocumentFragmentConstructor", 0, &JSDocumentFragmentConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h b/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h
index e532ca9..83120bf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocumentFragment.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSDocumentFragmentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp b/src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp
index 69e3fc6..3ca49dd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocumentType.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSDocumentTypeConstructor::s_info = { "DocumentTypeConstructor", 0, &JSDocumentTypeConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSDocumentType.h b/src/3rdparty/webkit/WebCore/generated/JSDocumentType.h
index c80a701..72da9be 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSDocumentType.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSDocumentType.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -48,6 +48,8 @@ public:
{
return static_cast<DocumentType*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
DocumentType* toDocumentType(JSC::JSValue);
@@ -58,7 +60,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSDocumentTypePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSElement.cpp
index 3844cb7..869c23f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSElement.cpp
@@ -153,8 +153,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSElementConstructor::s_info = { "ElementConstructor", 0, &JSElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSElement.h b/src/3rdparty/webkit/WebCore/generated/JSElement.h
index 39998c0..141d115 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSElement.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -59,6 +59,8 @@ public:
{
return static_cast<Element*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
ALWAYS_INLINE bool JSElement::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot)
@@ -84,9 +86,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEntity.cpp b/src/3rdparty/webkit/WebCore/generated/JSEntity.cpp
index 20d9cba..6f870e4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEntity.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSEntity.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSEntityConstructor::s_info = { "EntityConstructor", 0, &JSEntityConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEntity.h b/src/3rdparty/webkit/WebCore/generated/JSEntity.h
index 3f79f68..6ea4fe5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEntity.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSEntity.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSEntityPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp b/src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp
index e33b91f..505374a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSEntityReference.cpp
@@ -73,8 +73,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSEntityReferenceConstructor::s_info = { "EntityReferenceConstructor", 0, &JSEntityReferenceConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEntityReference.h b/src/3rdparty/webkit/WebCore/generated/JSEntityReference.h
index 5d05523..bec01e6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEntityReference.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSEntityReference.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSEntityReferencePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp
index d1cad0b..ef9a080 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSErrorEventConstructor::s_info = { "ErrorEventConstructor", 0, &JSErrorEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h b/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h
index 9046f11..080b573 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSErrorEvent.h
@@ -41,10 +41,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSErrorEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSEvent.cpp
index a7a0894..acd952f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSEvent.cpp
@@ -109,8 +109,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSEventConstructor::s_info = { "EventConstructor", 0, &JSEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEvent.h b/src/3rdparty/webkit/WebCore/generated/JSEvent.h
index d338302..0249fe1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSEvent.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<Event> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Event*);
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEventException.cpp b/src/3rdparty/webkit/WebCore/generated/JSEventException.cpp
index 326e792..2246c8f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEventException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSEventException.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSEventExceptionConstructor::s_info = { "EventExceptionConstructor", 0, &JSEventExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEventException.h b/src/3rdparty/webkit/WebCore/generated/JSEventException.h
index 093aa6a..694cbad 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEventException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSEventException.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<EventException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, EventException*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSEventExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSEventSource.h b/src/3rdparty/webkit/WebCore/generated/JSEventSource.h
index dbaa492..4d5803b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSEventSource.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSEventSource.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -59,6 +59,8 @@ public:
private:
RefPtr<EventSource> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, EventSource*);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSEventSourcePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSFile.cpp b/src/3rdparty/webkit/WebCore/generated/JSFile.cpp
index 962f1f5e..2ee62ae 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSFile.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSFile.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSFileConstructor::s_info = { "FileConstructor", 0, &JSFileConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSFile.h b/src/3rdparty/webkit/WebCore/generated/JSFile.h
index d47f286..3a5ed41 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSFile.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSFile.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<File> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, File*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSFilePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSFileList.cpp b/src/3rdparty/webkit/WebCore/generated/JSFileList.cpp
index 228615a..931aae4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSFileList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSFileList.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSFileListConstructor::s_info = { "FileListConstructor", 0, &JSFileListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSFileList.h b/src/3rdparty/webkit/WebCore/generated/JSFileList.h
index 21bed99..495f47a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSFileList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSFileList.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<FileList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSFileListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSGeolocation.h b/src/3rdparty/webkit/WebCore/generated/JSGeolocation.h
index 6b3453b..e948667 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSGeolocation.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSGeolocation.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -54,6 +54,8 @@ public:
private:
RefPtr<Geolocation> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Geolocation*);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSGeolocationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSGeoposition.h b/src/3rdparty/webkit/WebCore/generated/JSGeoposition.h
index 7406bb2..a58a41e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSGeoposition.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSGeoposition.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
Geoposition* impl() const { return m_impl.get(); }
private:
RefPtr<Geoposition> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Geoposition*);
@@ -61,7 +63,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSGeopositionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp
index 2b59fd0..3ba8201 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.cpp
@@ -96,8 +96,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLAnchorElementConstructor::s_info = { "HTMLAnchorElementConstructor", 0, &JSHTMLAnchorElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h
index 6bfc3d6..db460ea 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAnchorElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLAnchorElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp
index c822a44..df39815 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLAppletElementConstructor::s_info = { "HTMLAppletElementConstructor", 0, &JSHTMLAppletElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h
index 5390216..68eee1a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAppletElement.h
@@ -44,12 +44,14 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual JSC::CallType getCallData(JSC::CallData&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLAppletElement*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLAppletElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp
index c5fc1d6..50ca880 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.cpp
@@ -90,8 +90,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLAreaElementConstructor::s_info = { "HTMLAreaElementConstructor", 0, &JSHTMLAreaElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h
index 6d9cb85..e2edf7b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAreaElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLAreaElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp
index d537dd8..991a0b5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLAudioElementConstructor::s_info = { "HTMLAudioElementConstructor", 0, &JSHTMLAudioElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h
index 2710178..b8cd9ad 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLAudioElement.h
@@ -41,10 +41,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLAudioElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp
index a806ac1..23e43af 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLBRElementConstructor::s_info = { "HTMLBRElementConstructor", 0, &JSHTMLBRElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h
index 71069f1..6e6a691 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBRElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLBRElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp
index 125f8f8..fe57b25 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLBaseElementConstructor::s_info = { "HTMLBaseElementConstructor", 0, &JSHTMLBaseElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h
index 9af935a..6e86fb6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLBaseElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp
index 507e7c3..806680f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLBaseFontElementConstructor::s_info = { "HTMLBaseFontElementConstructor", 0, &JSHTMLBaseFontElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h
index c1da140..02a5ece 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBaseFontElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLBaseFontElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp
index 1d33ea3..1d65349 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLBlockquoteElementConstructor::s_info = { "HTMLBlockquoteElementConstructor", 0, &JSHTMLBlockquoteElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h
index 0ac17ba..acead7b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBlockquoteElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLBlockquoteElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp
index 80db063..920f152 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.cpp
@@ -94,8 +94,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLBodyElementConstructor::s_info = { "HTMLBodyElementConstructor", 0, &JSHTMLBodyElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h
index 8ce19c0..8f4e940 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLBodyElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLBodyElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp
index 3f9655e..1874cb7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.cpp
@@ -90,8 +90,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLButtonElementConstructor::s_info = { "HTMLButtonElementConstructor", 0, &JSHTMLButtonElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h
index 21c3e80..3b8204b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLButtonElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLButtonElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp
index ce41e88..5c7e058 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLCanvasElementConstructor::s_info = { "HTMLCanvasElementConstructor", 0, &JSHTMLCanvasElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h
index b0dedfe..012b6df 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLCanvasElement.h
@@ -40,12 +40,14 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLCanvasElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp
index a4644e2..63c0d93 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLCollectionConstructor::s_info = { "HTMLCollectionConstructor", 0, &JSHTMLCollectionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h
index edffe1d..447f620 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLCollection.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual JSC::CallType getCallData(JSC::CallData&);
@@ -60,6 +60,8 @@ public:
private:
RefPtr<HTMLCollection> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLCollection*, const JSC::Identifier&);
@@ -79,9 +81,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLCollectionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp
index ab9f86d..bd1f703 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.cpp
@@ -74,8 +74,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDListElementConstructor::s_info = { "HTMLDListElementConstructor", 0, &JSHTMLDListElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h
index 852fe01..4d602c9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDListElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDListElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp
index 7654d1a..089228d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.cpp
@@ -84,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDataGridCellElementConstructor::s_info = { "HTMLDataGridCellElementConstructor", 0, &JSHTMLDataGridCellElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h
index 7b778bd..5bdeff2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridCellElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDataGridCellElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp
index b39dddf..9a85c51 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.cpp
@@ -84,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDataGridColElementConstructor::s_info = { "HTMLDataGridColElementConstructor", 0, &JSHTMLDataGridColElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h
index 3e09036..473a1fc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridColElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDataGridColElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp
index 8400732..217df53 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDataGridElementConstructor::s_info = { "HTMLDataGridElementConstructor", 0, &JSHTMLDataGridElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h
index e466ebd..eedca14 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridElement.h
@@ -42,7 +42,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -50,6 +50,8 @@ public:
// Custom attributes
JSC::JSValue dataSource(JSC::ExecState*) const;
void setDataSource(JSC::ExecState*, JSC::JSValue);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,7 +61,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDataGridElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp
index 2225c98..c9ca326 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDataGridRowElementConstructor::s_info = { "HTMLDataGridRowElementConstructor", 0, &JSHTMLDataGridRowElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h
index 749cf0c..2316318 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataGridRowElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDataGridRowElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.cpp
index a7dcd91..4f88a2b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDataListElementConstructor::s_info = { "HTMLDataListElementConstructor", 0, &JSHTMLDataListElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.h
index 32d34bc..79c6274 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDataListElement.h
@@ -41,10 +41,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDataListElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp
index 838dc83..6c1a334 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.cpp
@@ -74,8 +74,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDirectoryElementConstructor::s_info = { "HTMLDirectoryElementConstructor", 0, &JSHTMLDirectoryElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h
index a0c1aa1..71661a3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDirectoryElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDirectoryElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp
index 5fa429c..78da25f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDivElementConstructor::s_info = { "HTMLDivElementConstructor", 0, &JSHTMLDivElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h
index 7751ffe..7806e45 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDivElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLDivElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp
index 5e1cd6c..e45c9ec 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.cpp
@@ -97,8 +97,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLDocumentConstructor::s_info = { "HTMLDocumentConstructor", 0, &JSHTMLDocumentConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h
index f19fb41..feb5b88 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLDocument.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
JSC::JSValue open(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue write(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue writeln(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLDocument*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLDocumentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp
index dc08b3d..86d32d2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.cpp
@@ -96,8 +96,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLElementConstructor::s_info = { "HTMLElementConstructor", 0, &JSHTMLElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h
index aef78d2..6928db7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLElement.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void pushEventHandlerScope(JSC::ExecState*, JSC::ScopeChain&) const;
@@ -51,6 +51,8 @@ public:
{
return static_cast<HTMLElement*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
HTMLElement* toHTMLElement(JSC::JSValue);
@@ -65,9 +67,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp
index d4333cc..1d43b5e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.cpp
@@ -88,8 +88,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLEmbedElementConstructor::s_info = { "HTMLEmbedElementConstructor", 0, &JSHTMLEmbedElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h
index 8a1d7bb..e7c27cc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLEmbedElement.h
@@ -44,12 +44,14 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual JSC::CallType getCallData(JSC::CallData&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLEmbedElement*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLEmbedElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp
index 2bec961..d161eae 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLFieldSetElementConstructor::s_info = { "HTMLFieldSetElementConstructor", 0, &JSHTMLFieldSetElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h
index 38edfb2..f23e5fa 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFieldSetElement.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLFieldSetElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp
index 794640f..720a0b9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLFontElementConstructor::s_info = { "HTMLFontElementConstructor", 0, &JSHTMLFontElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h
index 61a0b78..cb4670c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFontElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLFontElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp
index bdd60b8..bd11b40 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.cpp
@@ -91,8 +91,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLFormElementConstructor::s_info = { "HTMLFormElementConstructor", 0, &JSHTMLFormElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h
index a28742e..b022fd6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFormElement.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -48,6 +48,8 @@ public:
// Custom functions
JSC::JSValue submit(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLFormElement*, const JSC::Identifier&);
@@ -65,9 +67,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLFormElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp
index 03a071e..4ddb621 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.cpp
@@ -98,8 +98,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLFrameElementConstructor::s_info = { "HTMLFrameElementConstructor", 0, &JSHTMLFrameElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h
index fe0b2fa..7894c4f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameElement.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -48,6 +48,8 @@ public:
// Custom attributes
void setSrc(JSC::ExecState*, JSC::JSValue);
void setLocation(JSC::ExecState*, JSC::JSValue);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -61,9 +63,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLFrameElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp
index 8c69079..f336c76 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.cpp
@@ -90,8 +90,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLFrameSetElementConstructor::s_info = { "HTMLFrameSetElementConstructor", 0, &JSHTMLFrameSetElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h
index e9aa3f9..216fa59 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLFrameSetElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLFrameSetElement*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -56,7 +58,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLFrameSetElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp
index 72ac500..e58b90d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLHRElementConstructor::s_info = { "HTMLHRElementConstructor", 0, &JSHTMLHRElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h
index c69d61b..4472820 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHRElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLHRElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp
index 7bcb644..ab10942 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLHeadElementConstructor::s_info = { "HTMLHeadElementConstructor", 0, &JSHTMLHeadElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h
index c3b4d50..585eb60 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLHeadElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp
index 7e0f680..5409279 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLHeadingElementConstructor::s_info = { "HTMLHeadingElementConstructor", 0, &JSHTMLHeadingElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h
index 512e05b..a33f6f6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHeadingElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLHeadingElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp
index 932a96c..f9c9b3e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLHtmlElementConstructor::s_info = { "HTMLHtmlElementConstructor", 0, &JSHTMLHtmlElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h
index a46605c..37b9bdd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLHtmlElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLHtmlElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp
index 3606652..ea1d18c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.cpp
@@ -96,8 +96,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLIFrameElementConstructor::s_info = { "HTMLIFrameElementConstructor", 0, &JSHTMLIFrameElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h
index 22ed276..6153f79 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLIFrameElement.h
@@ -40,13 +40,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
// Custom attributes
void setSrc(JSC::ExecState*, JSC::JSValue);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -60,9 +62,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLIFrameElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp
index 029933c..7a6e0f7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.cpp
@@ -95,8 +95,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLImageElementConstructor::s_info = { "HTMLImageElementConstructor", 0, &JSHTMLImageElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h
index 2ec34dc..403a98b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLImageElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLImageElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp
index ea6e7cb..5b65ab8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.cpp
@@ -43,7 +43,7 @@ ASSERT_CLASS_FITS_IN_CELL(JSHTMLInputElement);
/* Hash table */
-static const HashTableValue JSHTMLInputElementTableValues[31] =
+static const HashTableValue JSHTMLInputElementTableValues[33] =
{
{ "defaultValue", DontDelete, (intptr_t)jsHTMLInputElementDefaultValue, (intptr_t)setJSHTMLInputElementDefaultValue },
{ "defaultChecked", DontDelete, (intptr_t)jsHTMLInputElementDefaultChecked, (intptr_t)setJSHTMLInputElementDefaultChecked },
@@ -57,7 +57,9 @@ static const HashTableValue JSHTMLInputElementTableValues[31] =
{ "checked", DontDelete, (intptr_t)jsHTMLInputElementChecked, (intptr_t)setJSHTMLInputElementChecked },
{ "disabled", DontDelete, (intptr_t)jsHTMLInputElementDisabled, (intptr_t)setJSHTMLInputElementDisabled },
{ "autofocus", DontDelete, (intptr_t)jsHTMLInputElementAutofocus, (intptr_t)setJSHTMLInputElementAutofocus },
+ { "max", DontDelete, (intptr_t)jsHTMLInputElementMax, (intptr_t)setJSHTMLInputElementMax },
{ "maxLength", DontDelete, (intptr_t)jsHTMLInputElementMaxLength, (intptr_t)setJSHTMLInputElementMaxLength },
+ { "min", DontDelete, (intptr_t)jsHTMLInputElementMin, (intptr_t)setJSHTMLInputElementMin },
{ "multiple", DontDelete, (intptr_t)jsHTMLInputElementMultiple, (intptr_t)setJSHTMLInputElementMultiple },
{ "name", DontDelete, (intptr_t)jsHTMLInputElementName, (intptr_t)setJSHTMLInputElementName },
{ "pattern", DontDelete, (intptr_t)jsHTMLInputElementPattern, (intptr_t)setJSHTMLInputElementPattern },
@@ -82,7 +84,7 @@ static JSC_CONST_HASHTABLE HashTable JSHTMLInputElementTable =
#if ENABLE(PERFECT_HASH_SIZE)
{ 2047, JSHTMLInputElementTableValues, 0 };
#else
- { 72, 63, JSHTMLInputElementTableValues, 0 };
+ { 73, 63, JSHTMLInputElementTableValues, 0 };
#endif
/* Hash table for constructor */
@@ -113,8 +115,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLInputElementConstructor::s_info = { "HTMLInputElementConstructor", 0, &JSHTMLInputElementConstructorTable, 0 };
@@ -283,6 +288,14 @@ JSValue jsHTMLInputElementAutofocus(ExecState* exec, const Identifier&, const Pr
return jsBoolean(imp->autofocus());
}
+JSValue jsHTMLInputElementMax(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSHTMLInputElement* castedThis = static_cast<JSHTMLInputElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ HTMLInputElement* imp = static_cast<HTMLInputElement*>(castedThis->impl());
+ return jsString(exec, imp->getAttribute(HTMLNames::maxAttr));
+}
+
JSValue jsHTMLInputElementMaxLength(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSHTMLInputElement* castedThis = static_cast<JSHTMLInputElement*>(asObject(slot.slotBase()));
@@ -291,6 +304,14 @@ JSValue jsHTMLInputElementMaxLength(ExecState* exec, const Identifier&, const Pr
return jsNumber(exec, imp->maxLength());
}
+JSValue jsHTMLInputElementMin(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSHTMLInputElement* castedThis = static_cast<JSHTMLInputElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ HTMLInputElement* imp = static_cast<HTMLInputElement*>(castedThis->impl());
+ return jsString(exec, imp->getAttribute(HTMLNames::minAttr));
+}
+
JSValue jsHTMLInputElementMultiple(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSHTMLInputElement* castedThis = static_cast<JSHTMLInputElement*>(asObject(slot.slotBase()));
@@ -483,6 +504,12 @@ void setJSHTMLInputElementAutofocus(ExecState* exec, JSObject* thisObject, JSVal
imp->setAutofocus(value.toBoolean(exec));
}
+void setJSHTMLInputElementMax(ExecState* exec, JSObject* thisObject, JSValue value)
+{
+ HTMLInputElement* imp = static_cast<HTMLInputElement*>(static_cast<JSHTMLInputElement*>(thisObject)->impl());
+ imp->setAttribute(HTMLNames::maxAttr, value.toString(exec));
+}
+
void setJSHTMLInputElementMaxLength(ExecState* exec, JSObject* thisObject, JSValue value)
{
HTMLInputElement* imp = static_cast<HTMLInputElement*>(static_cast<JSHTMLInputElement*>(thisObject)->impl());
@@ -491,6 +518,12 @@ void setJSHTMLInputElementMaxLength(ExecState* exec, JSObject* thisObject, JSVal
setDOMException(exec, ec);
}
+void setJSHTMLInputElementMin(ExecState* exec, JSObject* thisObject, JSValue value)
+{
+ HTMLInputElement* imp = static_cast<HTMLInputElement*>(static_cast<JSHTMLInputElement*>(thisObject)->impl());
+ imp->setAttribute(HTMLNames::minAttr, value.toString(exec));
+}
+
void setJSHTMLInputElementMultiple(ExecState* exec, JSObject* thisObject, JSValue value)
{
HTMLInputElement* imp = static_cast<HTMLInputElement*>(static_cast<JSHTMLInputElement*>(thisObject)->impl());
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h
index e26b281..5ed72b6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLInputElement.h
@@ -40,7 +40,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
// Custom functions
JSC::JSValue setSelectionRange(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLInputElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -103,8 +107,12 @@ JSC::JSValue jsHTMLInputElementDisabled(JSC::ExecState*, const JSC::Identifier&,
void setJSHTMLInputElementDisabled(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsHTMLInputElementAutofocus(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSHTMLInputElementAutofocus(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
+JSC::JSValue jsHTMLInputElementMax(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+void setJSHTMLInputElementMax(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsHTMLInputElementMaxLength(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSHTMLInputElementMaxLength(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
+JSC::JSValue jsHTMLInputElementMin(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+void setJSHTMLInputElementMin(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsHTMLInputElementMultiple(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void setJSHTMLInputElementMultiple(JSC::ExecState*, JSC::JSObject*, JSC::JSValue);
JSC::JSValue jsHTMLInputElementName(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp
index 2ae43a7..41814f4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLIsIndexElementConstructor::s_info = { "HTMLIsIndexElementConstructor", 0, &JSHTMLIsIndexElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h
index 9ac79cb..8f21361 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLIsIndexElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLIsIndexElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp
index f27b58e..2cc828c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLLIElementConstructor::s_info = { "HTMLLIElementConstructor", 0, &JSHTMLLIElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h
index 09d6ffb..948746c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLIElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLLIElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp
index 7409c70..214ed4f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLLabelElementConstructor::s_info = { "HTMLLabelElementConstructor", 0, &JSHTMLLabelElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h
index 1991301..3577f5f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLabelElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLLabelElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp
index 5efaebb..000b301 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLLegendElementConstructor::s_info = { "HTMLLegendElementConstructor", 0, &JSHTMLLegendElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h
index c766306..420e05d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLegendElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLLegendElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp
index 5692047..3283d26 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.cpp
@@ -87,8 +87,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLLinkElementConstructor::s_info = { "HTMLLinkElementConstructor", 0, &JSHTMLLinkElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h
index 5d46062..5ea2147 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLLinkElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLLinkElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp
index e3e9ef1..d4fc27d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLMapElementConstructor::s_info = { "HTMLMapElementConstructor", 0, &JSHTMLMapElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h
index f17deae..2312094 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMapElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLMapElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp
index a5e3697..9db661a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.cpp
@@ -74,8 +74,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLMarqueeElementConstructor::s_info = { "HTMLMarqueeElementConstructor", 0, &JSHTMLMarqueeElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h
index 64d552f..de9770a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMarqueeElement.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLMarqueeElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp
index 8fc5aa6..f3f3a8d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.cpp
@@ -117,8 +117,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLMediaElementConstructor::s_info = { "HTMLMediaElementConstructor", 0, &JSHTMLMediaElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h
index 2eee952..66ea4cf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMediaElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLMediaElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp
index d6439e0..67daa6e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.cpp
@@ -74,8 +74,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLMenuElementConstructor::s_info = { "HTMLMenuElementConstructor", 0, &JSHTMLMenuElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h
index 88c816d..d778342 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMenuElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLMenuElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp
index 494076c..b32b1d1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLMetaElementConstructor::s_info = { "HTMLMetaElementConstructor", 0, &JSHTMLMetaElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h
index 2bb93a3..4ff2b8e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLMetaElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLMetaElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp
index 259618f..d440576 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLModElementConstructor::s_info = { "HTMLModElementConstructor", 0, &JSHTMLModElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h
index 6f920e4..a2aed45 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLModElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLModElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp
index 1bf8256..105c49e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLOListElementConstructor::s_info = { "HTMLOListElementConstructor", 0, &JSHTMLOListElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h
index a2d095e..9ecb940 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOListElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLOListElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp
index 57f2fa6..7203ff1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.cpp
@@ -106,8 +106,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLObjectElementConstructor::s_info = { "HTMLObjectElementConstructor", 0, &JSHTMLObjectElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h
index d4ad484..4dd52ad 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLObjectElement.h
@@ -44,12 +44,14 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual JSC::CallType getCallData(JSC::CallData&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, HTMLObjectElement*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLObjectElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp
index 2772290..340f910 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLOptGroupElementConstructor::s_info = { "HTMLOptGroupElementConstructor", 0, &JSHTMLOptGroupElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h
index a7cd4d9..1d57815 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptGroupElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLOptGroupElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp
index 4b32c87..b10d41c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLOptionElementConstructor::s_info = { "HTMLOptionElementConstructor", 0, &JSHTMLOptionElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h
index 232be18..44a2d3e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionElement.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -49,6 +49,8 @@ public:
{
return static_cast<HTMLOptionElement*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
HTMLOptionElement* toHTMLOptionElement(JSC::JSValue);
@@ -59,7 +61,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLOptionElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h
index 800b0a8..034fa1b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLOptionsCollection.h
@@ -42,7 +42,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -57,6 +57,8 @@ public:
{
return static_cast<HTMLOptionsCollection*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLOptionsCollectionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp
index a065d16..098d111 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLParagraphElementConstructor::s_info = { "HTMLParagraphElementConstructor", 0, &JSHTMLParagraphElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h
index f7b5e37..fc15b12 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLParagraphElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLParagraphElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp
index bec35a7..51eb728 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLParamElementConstructor::s_info = { "HTMLParamElementConstructor", 0, &JSHTMLParamElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h
index 1dde72d..be8f7b8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLParamElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLParamElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp
index 4d5fb9c..d06b203 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLPreElementConstructor::s_info = { "HTMLPreElementConstructor", 0, &JSHTMLPreElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h
index 92c86fa..ef78b72 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLPreElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLPreElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp
index 1864245..c1b9957 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLQuoteElementConstructor::s_info = { "HTMLQuoteElementConstructor", 0, &JSHTMLQuoteElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h
index 03edf4e..f0f1248 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLQuoteElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLQuoteElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp
index 5867c87..4e39698 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLScriptElementConstructor::s_info = { "HTMLScriptElementConstructor", 0, &JSHTMLScriptElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h
index 9cb3874..93f4dba 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLScriptElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLScriptElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp
index 1edfb8c..5feda47 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLSelectElementConstructor::s_info = { "HTMLSelectElementConstructor", 0, &JSHTMLSelectElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h
index 12141cd..32066cd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLSelectElement.h
@@ -42,7 +42,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -50,6 +50,8 @@ public:
// Custom functions
JSC::JSValue remove(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
};
@@ -65,9 +67,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLSelectElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp
index f6ce114..377c409 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLSourceElementConstructor::s_info = { "HTMLSourceElementConstructor", 0, &JSHTMLSourceElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h
index d33d1a2..f66761e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLSourceElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLSourceElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp
index 7fb2ddb..5137a97 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLStyleElementConstructor::s_info = { "HTMLStyleElementConstructor", 0, &JSHTMLStyleElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h
index efa49f6..c05261c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLStyleElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLStyleElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp
index 1668c03..4b81e96 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableCaptionElementConstructor::s_info = { "HTMLTableCaptionElementConstructor", 0, &JSHTMLTableCaptionElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h
index fa4f77d..4dafac5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCaptionElement.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -49,6 +49,8 @@ public:
{
return static_cast<HTMLTableCaptionElement*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
HTMLTableCaptionElement* toHTMLTableCaptionElement(JSC::JSValue);
@@ -59,7 +61,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLTableCaptionElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp
index 2d3c63c..5ff1e49 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.cpp
@@ -91,8 +91,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableCellElementConstructor::s_info = { "HTMLTableCellElementConstructor", 0, &JSHTMLTableCellElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h
index d5f5ad0..baa70fc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableCellElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLTableCellElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp
index e3bcbef..8bfb70a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableColElementConstructor::s_info = { "HTMLTableColElementConstructor", 0, &JSHTMLTableColElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h
index 95aebe4..f761d51 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableColElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLTableColElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp
index 70f45a2..1cafa00 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.cpp
@@ -98,8 +98,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableElementConstructor::s_info = { "HTMLTableElementConstructor", 0, &JSHTMLTableElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h
index 08ef645..9bc9dc7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLTableElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp
index 29dbcf6..6dd1622 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableRowElementConstructor::s_info = { "HTMLTableRowElementConstructor", 0, &JSHTMLTableRowElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h
index 3adbb01..a997475 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableRowElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLTableRowElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp
index ad10c49..b00b883 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTableSectionElementConstructor::s_info = { "HTMLTableSectionElementConstructor", 0, &JSHTMLTableSectionElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h
index 85c54c1..6760be5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTableSectionElement.h
@@ -41,7 +41,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -49,6 +49,8 @@ public:
{
return static_cast<HTMLTableSectionElement*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
HTMLTableSectionElement* toHTMLTableSectionElement(JSC::JSValue);
@@ -63,9 +65,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLTableSectionElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp
index 8d43a63..fdd60b4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTextAreaElementConstructor::s_info = { "HTMLTextAreaElementConstructor", 0, &JSHTMLTextAreaElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h
index 3b28ae9..3b36f3a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTextAreaElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHTMLTextAreaElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp
index 51bffa4..fe642d3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLTitleElementConstructor::s_info = { "HTMLTitleElementConstructor", 0, &JSHTMLTitleElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h
index 8f88dac..8cc7eca 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLTitleElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLTitleElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp
index 5a541b4..58bc209 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLUListElementConstructor::s_info = { "HTMLUListElementConstructor", 0, &JSHTMLUListElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h
index 9f7f717..d65d7cb 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLUListElement.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLUListElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp
index 4331798..b8f2da3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.cpp
@@ -84,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSHTMLVideoElementConstructor::s_info = { "HTMLVideoElementConstructor", 0, &JSHTMLVideoElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h b/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h
index e74590f..7a60109 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHTMLVideoElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSHTMLVideoElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSHistory.h b/src/3rdparty/webkit/WebCore/generated/JSHistory.h
index 9ea7e91..a08fc19 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSHistory.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSHistory.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier&);
@@ -56,6 +56,8 @@ public:
private:
RefPtr<History> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, History*);
@@ -71,9 +73,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSHistoryPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSImageData.cpp b/src/3rdparty/webkit/WebCore/generated/JSImageData.cpp
index 973ec26..a21fb87 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSImageData.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSImageData.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSImageDataConstructor::s_info = { "ImageDataConstructor", 0, &JSImageDataConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSImageData.h b/src/3rdparty/webkit/WebCore/generated/JSImageData.h
index d84357c..0c42e5b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSImageData.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSImageData.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<ImageData> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, ImageData*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSImageDataPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp b/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp
index f770cf2..8da82cc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSInspectorBackendConstructor::s_info = { "InspectorBackendConstructor", 0, &JSInspectorBackendConstructorTable, 0 };
@@ -96,7 +99,7 @@ bool JSInspectorBackendConstructor::getOwnPropertyDescriptor(ExecState* exec, co
/* Hash table for prototype */
-static const HashTableValue JSInspectorBackendPrototypeTableValues[71] =
+static const HashTableValue JSInspectorBackendPrototypeTableValues[77] =
{
{ "hideDOMNodeHighlight", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionHideDOMNodeHighlight, (intptr_t)0 },
{ "highlightDOMNode", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionHighlightDOMNode, (intptr_t)1 },
@@ -112,16 +115,16 @@ static const HashTableValue JSInspectorBackendPrototypeTableValues[71] =
{ "addResourceSourceToFrame", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionAddResourceSourceToFrame, (intptr_t)2 },
{ "addSourceToFrame", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionAddSourceToFrame, (intptr_t)3 },
{ "search", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSearch, (intptr_t)2 },
- { "databaseTableNames", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDatabaseTableNames, (intptr_t)1 },
+ { "getDatabaseTableNames", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetDatabaseTableNames, (intptr_t)2 },
{ "setting", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetting, (intptr_t)1 },
{ "setSetting", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetSetting, (intptr_t)2 },
{ "inspectedWindow", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionInspectedWindow, (intptr_t)0 },
{ "localizedStringsURL", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionLocalizedStringsURL, (intptr_t)0 },
{ "hiddenPanels", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionHiddenPanels, (intptr_t)0 },
{ "platform", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionPlatform, (intptr_t)0 },
- { "enableTimeline", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionEnableTimeline, (intptr_t)1 },
- { "disableTimeline", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDisableTimeline, (intptr_t)1 },
- { "timelineEnabled", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionTimelineEnabled, (intptr_t)0 },
+ { "startTimelineProfiler", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionStartTimelineProfiler, (intptr_t)0 },
+ { "stopTimelineProfiler", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionStopTimelineProfiler, (intptr_t)0 },
+ { "timelineProfilerEnabled", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionTimelineProfilerEnabled, (intptr_t)0 },
{ "moveByUnrestricted", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionMoveByUnrestricted, (intptr_t)2 },
{ "setAttachedWindowHeight", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetAttachedWindowHeight, (intptr_t)1 },
{ "wrapCallback", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionWrapCallback, (intptr_t)1 },
@@ -148,26 +151,32 @@ static const HashTableValue JSInspectorBackendPrototypeTableValues[71] =
{ "disableProfiler", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDisableProfiler, (intptr_t)1 },
{ "startProfiling", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionStartProfiling, (intptr_t)0 },
{ "stopProfiling", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionStopProfiling, (intptr_t)0 },
- { "profiles", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionProfiles, (intptr_t)0 },
- { "dispatchOnInjectedScript", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDispatchOnInjectedScript, (intptr_t)3 },
+ { "getProfileHeaders", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetProfileHeaders, (intptr_t)1 },
+ { "getProfile", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetProfile, (intptr_t)2 },
+ { "dispatchOnInjectedScript", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDispatchOnInjectedScript, (intptr_t)4 },
{ "getChildNodes", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetChildNodes, (intptr_t)2 },
{ "setAttribute", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetAttribute, (intptr_t)4 },
{ "removeAttribute", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionRemoveAttribute, (intptr_t)3 },
{ "setTextNodeValue", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetTextNodeValue, (intptr_t)3 },
{ "getEventListenersForNode", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetEventListenersForNode, (intptr_t)2 },
{ "copyNode", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionCopyNode, (intptr_t)1 },
- { "getCookies", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetCookies, (intptr_t)1 },
- { "deleteCookie", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDeleteCookie, (intptr_t)1 },
+ { "removeNode", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionRemoveNode, (intptr_t)2 },
+ { "getCookies", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetCookies, (intptr_t)2 },
+ { "deleteCookie", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDeleteCookie, (intptr_t)2 },
{ "nodeForId", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionNodeForId, (intptr_t)1 },
- { "wrapObject", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionWrapObject, (intptr_t)1 },
+ { "wrapObject", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionWrapObject, (intptr_t)2 },
{ "unwrapObject", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionUnwrapObject, (intptr_t)1 },
+ { "releaseWrapperObjectGroup", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionReleaseWrapperObjectGroup, (intptr_t)1 },
{ "pushNodePathToFrontend", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionPushNodePathToFrontend, (intptr_t)2 },
{ "addNodesToSearchResult", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionAddNodesToSearchResult, (intptr_t)1 },
{ "selectDatabase", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSelectDatabase, (intptr_t)1 },
+ { "databaseForId", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDatabaseForId, (intptr_t)1 },
{ "selectDOMStorage", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSelectDOMStorage, (intptr_t)1 },
{ "getDOMStorageEntries", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionGetDOMStorageEntries, (intptr_t)2 },
{ "setDOMStorageItem", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionSetDOMStorageItem, (intptr_t)4 },
{ "removeDOMStorageItem", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionRemoveDOMStorageItem, (intptr_t)3 },
+ { "reportDidDispatchOnInjectedScript", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionReportDidDispatchOnInjectedScript, (intptr_t)3 },
+ { "didEvaluateForTestInFrontend", DontDelete|Function, (intptr_t)jsInspectorBackendPrototypeFunctionDidEvaluateForTestInFrontend, (intptr_t)2 },
{ 0, 0, 0, 0 }
};
@@ -175,7 +184,7 @@ static JSC_CONST_HASHTABLE HashTable JSInspectorBackendPrototypeTable =
#if ENABLE(PERFECT_HASH_SIZE)
{ 4095, JSInspectorBackendPrototypeTableValues, 0 };
#else
- { 262, 255, JSInspectorBackendPrototypeTableValues, 0 };
+ { 267, 255, JSInspectorBackendPrototypeTableValues, 0 };
#endif
const ClassInfo JSInspectorBackendPrototype::s_info = { "InspectorBackendPrototype", 0, &JSInspectorBackendPrototypeTable, 0 };
@@ -404,13 +413,18 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSearch(ExecState* exec,
return castedThisObj->search(exec, args);
}
-JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDatabaseTableNames(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetDatabaseTableNames(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
if (!thisValue.inherits(&JSInspectorBackend::s_info))
return throwError(exec, TypeError);
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
- return castedThisObj->databaseTableNames(exec, args);
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+ int databaseId = args.at(1).toInt32(exec);
+
+ imp->getDatabaseTableNames(callId, databaseId);
+ return jsUndefined();
}
JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetting(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
@@ -479,33 +493,31 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionPlatform(ExecState* exe
return result;
}
-JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionEnableTimeline(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStartTimelineProfiler(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
if (!thisValue.inherits(&JSInspectorBackend::s_info))
return throwError(exec, TypeError);
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
- bool always = args.at(0).toBoolean(exec);
- imp->enableTimeline(always);
+ imp->startTimelineProfiler();
return jsUndefined();
}
-JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDisableTimeline(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStopTimelineProfiler(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
if (!thisValue.inherits(&JSInspectorBackend::s_info))
return throwError(exec, TypeError);
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
- bool always = args.at(0).toBoolean(exec);
- imp->disableTimeline(always);
+ imp->stopTimelineProfiler();
return jsUndefined();
}
-JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionTimelineEnabled(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionTimelineProfilerEnabled(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
if (!thisValue.inherits(&JSInspectorBackend::s_info))
@@ -514,7 +526,7 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionTimelineEnabled(ExecSta
InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
- JSC::JSValue result = jsBoolean(imp->timelineEnabled());
+ JSC::JSValue result = jsBoolean(imp->timelineProfilerEnabled());
return result;
}
@@ -847,13 +859,31 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStopProfiling(ExecState
return jsUndefined();
}
-JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionProfiles(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetProfileHeaders(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+
+ imp->getProfileHeaders(callId);
+ return jsUndefined();
+}
+
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetProfile(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
if (!thisValue.inherits(&JSInspectorBackend::s_info))
return throwError(exec, TypeError);
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
- return castedThisObj->profiles(exec, args);
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+ unsigned uid = args.at(1).toInt32(exec);
+
+ imp->getProfile(callId, uid);
+ return jsUndefined();
}
JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDispatchOnInjectedScript(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
@@ -866,8 +896,9 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDispatchOnInjectedScrip
int callId = args.at(0).toInt32(exec);
const UString& methodName = args.at(1).toString(exec);
const UString& arguments = args.at(2).toString(exec);
+ bool async = args.at(3).toBoolean(exec);
- imp->dispatchOnInjectedScript(callId, methodName, arguments);
+ imp->dispatchOnInjectedScript(callId, methodName, arguments, async);
return jsUndefined();
}
@@ -958,6 +989,20 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionCopyNode(ExecState* exe
return jsUndefined();
}
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionRemoveNode(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+ int nodeId = args.at(1).toInt32(exec);
+
+ imp->removeNode(callId, nodeId);
+ return jsUndefined();
+}
+
JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetCookies(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
@@ -966,8 +1011,9 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetCookies(ExecState* e
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
int callId = args.at(0).toInt32(exec);
+ const UString& domain = args.at(1).toString(exec);
- imp->getCookies(callId);
+ imp->getCookies(callId, domain);
return jsUndefined();
}
@@ -979,8 +1025,9 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDeleteCookie(ExecState*
JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
const UString& cookieName = args.at(0).toString(exec);
+ const UString& domain = args.at(1).toString(exec);
- imp->deleteCookie(cookieName);
+ imp->deleteCookie(cookieName, domain);
return jsUndefined();
}
@@ -1011,6 +1058,19 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionUnwrapObject(ExecState*
return castedThisObj->unwrapObject(exec, args);
}
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionReleaseWrapperObjectGroup(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ const UString& objectGroup = args.at(0).toString(exec);
+
+ imp->releaseWrapperObjectGroup(objectGroup);
+ return jsUndefined();
+}
+
JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionPushNodePathToFrontend(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
@@ -1042,6 +1102,15 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSelectDatabase(ExecStat
return castedThisObj->selectDatabase(exec, args);
}
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDatabaseForId(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ return castedThisObj->databaseForId(exec, args);
+}
+
JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSelectDOMStorage(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
{
UNUSED_PARAM(args);
@@ -1096,6 +1165,35 @@ JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionRemoveDOMStorageItem(Ex
return jsUndefined();
}
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionReportDidDispatchOnInjectedScript(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+ const UString& result = args.at(1).toString(exec);
+ bool isException = args.at(2).toBoolean(exec);
+
+ imp->reportDidDispatchOnInjectedScript(callId, result, isException);
+ return jsUndefined();
+}
+
+JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDidEvaluateForTestInFrontend(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSInspectorBackend::s_info))
+ return throwError(exec, TypeError);
+ JSInspectorBackend* castedThisObj = static_cast<JSInspectorBackend*>(asObject(thisValue));
+ InspectorBackend* imp = static_cast<InspectorBackend*>(castedThisObj->impl());
+ int callId = args.at(0).toInt32(exec);
+ const UString& jsonResult = args.at(1).toString(exec);
+
+ imp->didEvaluateForTestInFrontend(callId, jsonResult);
+ return jsUndefined();
+}
+
JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, InspectorBackend* object)
{
return getDOMObjectWrapper<JSInspectorBackend>(exec, globalObject, object);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h b/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h
index 5e2239f..f4a1925 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSInspectorBackend.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,23 +51,24 @@ public:
// Custom functions
JSC::JSValue highlightDOMNode(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue search(JSC::ExecState*, const JSC::ArgList&);
- JSC::JSValue databaseTableNames(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue setting(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue setSetting(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue inspectedWindow(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue wrapCallback(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue currentCallFrame(JSC::ExecState*, const JSC::ArgList&);
- JSC::JSValue profiles(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue nodeForId(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue wrapObject(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue unwrapObject(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue pushNodePathToFrontend(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue selectDatabase(JSC::ExecState*, const JSC::ArgList&);
+ JSC::JSValue databaseForId(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue selectDOMStorage(JSC::ExecState*, const JSC::ArgList&);
InspectorBackend* impl() const { return m_impl.get(); }
private:
RefPtr<InspectorBackend> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, InspectorBackend*);
@@ -83,9 +84,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSInspectorBackendPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -104,16 +107,16 @@ JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSearchingForNode(J
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionAddResourceSourceToFrame(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionAddSourceToFrame(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSearch(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
-JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDatabaseTableNames(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetDatabaseTableNames(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetting(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetSetting(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionInspectedWindow(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionLocalizedStringsURL(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionHiddenPanels(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionPlatform(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
-JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionEnableTimeline(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
-JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDisableTimeline(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
-JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionTimelineEnabled(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStartTimelineProfiler(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStopTimelineProfiler(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionTimelineProfilerEnabled(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionMoveByUnrestricted(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetAttachedWindowHeight(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionWrapCallback(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
@@ -140,7 +143,8 @@ JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionEnableProfiler(JSC
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDisableProfiler(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStartProfiling(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionStopProfiling(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
-JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionProfiles(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetProfileHeaders(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetProfile(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDispatchOnInjectedScript(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetChildNodes(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetAttribute(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
@@ -148,18 +152,23 @@ JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionRemoveAttribute(JS
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetTextNodeValue(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetEventListenersForNode(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionCopyNode(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionRemoveNode(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetCookies(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDeleteCookie(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionNodeForId(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionWrapObject(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionUnwrapObject(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionReleaseWrapperObjectGroup(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionPushNodePathToFrontend(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionAddNodesToSearchResult(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSelectDatabase(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDatabaseForId(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSelectDOMStorage(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionGetDOMStorageEntries(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionSetDOMStorageItem(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionRemoveDOMStorageItem(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionReportDidDispatchOnInjectedScript(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsInspectorBackendPrototypeFunctionDidEvaluateForTestInFrontend(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
// Attributes
JSC::JSValue jsInspectorBackendConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h b/src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h
index c958ee0..a209147 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSJavaScriptCallFrame.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -60,6 +60,8 @@ public:
private:
RefPtr<JavaScriptCallFrame> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JavaScriptCallFrame*);
@@ -75,9 +77,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSJavaScriptCallFramePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp
index 90d964d..4beaa59 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSKeyboardEventConstructor::s_info = { "KeyboardEventConstructor", 0, &JSKeyboardEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h b/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h
index c1567b8..7d60933 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSKeyboardEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSKeyboardEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSLocation.h b/src/3rdparty/webkit/WebCore/generated/JSLocation.h
index ecdeffc..2948ce6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSLocation.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSLocation.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier&);
@@ -73,6 +73,8 @@ public:
private:
RefPtr<Location> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Location*);
@@ -88,12 +90,14 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void put(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&);
bool putDelegate(JSC::ExecState*, const JSC::Identifier&, JSC::JSValue, JSC::PutPropertySlot&);
virtual void defineGetter(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSObject* getterFunction, unsigned attributes);
JSLocationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMedia.cpp b/src/3rdparty/webkit/WebCore/generated/JSMedia.cpp
index 6f18ed0..b7d4c19 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMedia.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMedia.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMediaConstructor::s_info = { "MediaConstructor", 0, &JSMediaConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMedia.h b/src/3rdparty/webkit/WebCore/generated/JSMedia.h
index 5a08af2..fec492b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMedia.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMedia.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<Media> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Media*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMediaPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp b/src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp
index a1bc33e..97e35e0 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMediaError.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMediaErrorConstructor::s_info = { "MediaErrorConstructor", 0, &JSMediaErrorConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMediaError.h b/src/3rdparty/webkit/WebCore/generated/JSMediaError.h
index 9dfecd3..847dd0e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMediaError.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMediaError.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<MediaError> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, MediaError*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMediaErrorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp b/src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp
index 1167ae5..93a17b4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMediaList.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMediaListConstructor::s_info = { "MediaListConstructor", 0, &JSMediaListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMediaList.h b/src/3rdparty/webkit/WebCore/generated/JSMediaList.h
index a37501d..30853df 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMediaList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMediaList.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<MediaList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMediaListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h b/src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h
index 63503fc..8b8b127 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMessageChannel.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -52,6 +52,8 @@ public:
private:
RefPtr<MessageChannel> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, MessageChannel*);
@@ -65,9 +67,11 @@ public:
static const JSC::ClassInfo s_info;
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMessageChannelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp
index 2867a17..f308150 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.cpp
@@ -25,6 +25,7 @@
#include "JSDOMWindow.h"
#include "KURL.h"
#include "MessageEvent.h"
+#include "SerializedScriptValue.h"
#include <runtime/Error.h>
#include <runtime/JSString.h>
#include <wtf/GetPtr.h>
@@ -83,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMessageEventConstructor::s_info = { "MessageEventConstructor", 0, &JSMessageEventConstructorTable, 0 };
@@ -166,7 +170,7 @@ JSValue jsMessageEventData(ExecState* exec, const Identifier&, const PropertySlo
JSMessageEvent* castedThis = static_cast<JSMessageEvent*>(asObject(slot.slotBase()));
UNUSED_PARAM(exec);
MessageEvent* imp = static_cast<MessageEvent*>(castedThis->impl());
- return jsString(exec, imp->data());
+ return imp->data()->deserialize(exec);
}
JSValue jsMessageEventOrigin(ExecState* exec, const Identifier&, const PropertySlot& slot)
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h b/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h
index 1cb3562..d109987 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMessageEvent.h
@@ -39,7 +39,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -49,6 +49,8 @@ public:
// Custom functions
JSC::JSValue initMessageEvent(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -62,9 +64,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMessageEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp b/src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp
index 2f84364..28e1492 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMessagePort.cpp
@@ -83,8 +83,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMessagePortConstructor::s_info = { "MessagePortConstructor", 0, &JSMessagePortConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMessagePort.h b/src/3rdparty/webkit/WebCore/generated/JSMessagePort.h
index 6c6e94e..6d3aa61 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMessagePort.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMessagePort.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -59,6 +59,8 @@ public:
private:
RefPtr<MessagePort> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, MessagePort*);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMessagePortPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp b/src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp
index 1f97845..f797df2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMimeType.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMimeTypeConstructor::s_info = { "MimeTypeConstructor", 0, &JSMimeTypeConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMimeType.h b/src/3rdparty/webkit/WebCore/generated/JSMimeType.h
index 9c4d1e3..e3ee635 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMimeType.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMimeType.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<MimeType> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, MimeType*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSMimeTypePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp b/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp
index 1a7f06b..0384539 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMimeTypeArrayConstructor::s_info = { "MimeTypeArrayConstructor", 0, &JSMimeTypeArrayConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h b/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h
index 1fe01bb..87b7438 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMimeTypeArray.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<MimeTypeArray> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, MimeTypeArray*, const JSC::Identifier&);
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMimeTypeArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp
index 9b2220b..47c4b14 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.cpp
@@ -99,8 +99,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMouseEventConstructor::s_info = { "MouseEventConstructor", 0, &JSMouseEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h b/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h
index b13d5e6..c7a6e9e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMouseEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMouseEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp
index cb47db7..6565d40 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.cpp
@@ -87,8 +87,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSMutationEventConstructor::s_info = { "MutationEventConstructor", 0, &JSMutationEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h b/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h
index 4a06315..2fbd82b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSMutationEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSMutationEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp b/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp
index eafaee1..e3cc8d2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNamedNodeMapConstructor::s_info = { "NamedNodeMapConstructor", 0, &JSNamedNodeMapConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h b/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h
index 6ea0e2f..305877b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNamedNodeMap.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<NamedNodeMap> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, NamedNodeMap*, const JSC::Identifier&);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNamedNodeMapPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNavigator.h b/src/3rdparty/webkit/WebCore/generated/JSNavigator.h
index ec14055..5847e96 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNavigator.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNavigator.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -52,6 +52,8 @@ public:
private:
RefPtr<Navigator> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Navigator*);
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNavigatorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNode.cpp b/src/3rdparty/webkit/WebCore/generated/JSNode.cpp
index 8ae675c..e132829 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNode.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNode.cpp
@@ -124,8 +124,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNodeConstructor::s_info = { "NodeConstructor", 0, &JSNodeConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNode.h b/src/3rdparty/webkit/WebCore/generated/JSNode.h
index 2275f39..0398122 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNode.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNode.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -66,6 +66,8 @@ public:
private:
RefPtr<Node> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
ALWAYS_INLINE bool JSNode::getOwnPropertySlot(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertySlot& slot)
@@ -92,9 +94,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNodePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp b/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp
index c50caf8..141a060 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.cpp
@@ -90,8 +90,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNodeFilterConstructor::s_info = { "NodeFilterConstructor", 0, &JSNodeFilterConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h b/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h
index 48eb6b4..c59011a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeFilter.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -56,6 +56,8 @@ public:
private:
RefPtr<NodeFilter> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, NodeFilter*);
@@ -71,9 +73,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNodeFilterPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp b/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp
index 89ea643..cf85e40 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNodeIteratorConstructor::s_info = { "NodeIteratorConstructor", 0, &JSNodeIteratorConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h b/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h
index 21902e5..64bf10f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeIterator.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -57,6 +57,8 @@ public:
private:
RefPtr<NodeIterator> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, NodeIterator*);
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNodeIteratorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp b/src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp
index be3bf91..01ee9ac 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeList.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNodeListConstructor::s_info = { "NodeListConstructor", 0, &JSNodeListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNodeList.h b/src/3rdparty/webkit/WebCore/generated/JSNodeList.h
index 82e1cb6..76840f0 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNodeList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNodeList.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual JSC::CallType getCallData(JSC::CallData&);
@@ -56,6 +56,8 @@ public:
private:
RefPtr<NodeList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, NodeList*, const JSC::Identifier&);
@@ -75,9 +77,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSNodeListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNotation.cpp b/src/3rdparty/webkit/WebCore/generated/JSNotation.cpp
index 60a04fa..bf91e7c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNotation.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSNotation.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSNotationConstructor::s_info = { "NotationConstructor", 0, &JSNotationConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSNotation.h b/src/3rdparty/webkit/WebCore/generated/JSNotation.h
index 71fd2d8..79656a2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSNotation.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSNotation.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSNotationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp
index 26bd08e..fdc3a64 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.cpp
@@ -81,8 +81,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSOverflowEventConstructor::s_info = { "OverflowEventConstructor", 0, &JSOverflowEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h b/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h
index 8e2fb7f..e9e10d3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSOverflowEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSOverflowEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.cpp
index 254d0e9..55d5a54 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.cpp
@@ -75,8 +75,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSPageTransitionEventConstructor::s_info = { "PageTransitionEventConstructor", 0, &JSPageTransitionEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.h b/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.h
index 5829b8d..6e38558 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSPageTransitionEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSPageTransitionEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp b/src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp
index 1c4b9a6..035a352 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSPlugin.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSPluginConstructor::s_info = { "PluginConstructor", 0, &JSPluginConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPlugin.h b/src/3rdparty/webkit/WebCore/generated/JSPlugin.h
index 98de1de..03da3df 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPlugin.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSPlugin.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<Plugin> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, Plugin*, const JSC::Identifier&);
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSPluginPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp b/src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp
index 0e8eec0..bd0b579 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSPluginArray.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSPluginArrayConstructor::s_info = { "PluginArrayConstructor", 0, &JSPluginArrayConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPluginArray.h b/src/3rdparty/webkit/WebCore/generated/JSPluginArray.h
index 859aefb..9c2e6ef 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPluginArray.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSPluginArray.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<PluginArray> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, PluginArray*, const JSC::Identifier&);
@@ -72,9 +74,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSPluginArrayPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp b/src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp
index 557c029..e178bd9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSPositionError.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSPositionErrorConstructor::s_info = { "PositionErrorConstructor", 0, &JSPositionErrorConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSPositionError.h b/src/3rdparty/webkit/WebCore/generated/JSPositionError.h
index 7e680ae..01ba3e7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSPositionError.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSPositionError.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<PositionError> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, PositionError*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSPositionErrorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp b/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp
index 267a269..8c8de3a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSProcessingInstructionConstructor::s_info = { "ProcessingInstructionConstructor", 0, &JSProcessingInstructionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h b/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h
index 6780d2e..b3c239b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSProcessingInstruction.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSProcessingInstructionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp
index 3b1caaa..c74e80d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSProgressEventConstructor::s_info = { "ProgressEventConstructor", 0, &JSProgressEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h b/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h
index c2c4877..34e1985 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSProgressEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSProgressEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp b/src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp
index 5144543..0dff99a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSRGBColor.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSRGBColorConstructor::s_info = { "RGBColorConstructor", 0, &JSRGBColorConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRGBColor.h b/src/3rdparty/webkit/WebCore/generated/JSRGBColor.h
index d1425e4..2e6c715 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRGBColor.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSRGBColor.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<RGBColor> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RGBColor*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSRGBColorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRange.cpp b/src/3rdparty/webkit/WebCore/generated/JSRange.cpp
index d6d4d93..cc59119 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRange.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSRange.cpp
@@ -100,8 +100,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSRangeConstructor::s_info = { "RangeConstructor", 0, &JSRangeConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRange.h b/src/3rdparty/webkit/WebCore/generated/JSRange.h
index b58a4bf..8b45a3f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRange.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSRange.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<Range> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Range*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSRangePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp b/src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp
index 5a975cc..2f8e618 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSRangeException.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSRangeExceptionConstructor::s_info = { "RangeExceptionConstructor", 0, &JSRangeExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRangeException.h b/src/3rdparty/webkit/WebCore/generated/JSRangeException.h
index 162acb8..1a9e2ae 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRangeException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSRangeException.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<RangeException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RangeException*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSRangeExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRect.cpp b/src/3rdparty/webkit/WebCore/generated/JSRect.cpp
index 84d20e4..37c4669 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRect.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSRect.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSRectConstructor::s_info = { "RectConstructor", 0, &JSRectConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSRect.h b/src/3rdparty/webkit/WebCore/generated/JSRect.h
index cefef58..476a5a2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSRect.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSRect.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<Rect> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Rect*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSRectPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSQLError.h b/src/3rdparty/webkit/WebCore/generated/JSSQLError.h
index 9174130..5368452 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSQLError.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSQLError.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SQLError* impl() const { return m_impl.get(); }
private:
RefPtr<SQLError> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SQLError*);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSQLErrorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h b/src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h
index f463380..b1551f2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSQLResultSet.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SQLResultSet* impl() const { return m_impl.get(); }
private:
RefPtr<SQLResultSet> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SQLResultSet*);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSQLResultSetPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h b/src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h
index 83df584..67b8fd2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSQLResultSetRowList.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -55,6 +55,8 @@ public:
private:
RefPtr<SQLResultSetRowList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SQLResultSetRowList*);
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSQLResultSetRowListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h b/src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h
index a3886d3..7438597 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSQLTransaction.h
@@ -41,6 +41,11 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
// Custom functions
JSC::JSValue executeSql(JSC::ExecState*, const JSC::ArgList&);
@@ -48,6 +53,8 @@ public:
private:
RefPtr<SQLTransaction> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SQLTransaction*);
@@ -63,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSQLTransactionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h
index f7d3cf9..f54337b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGAElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h
index ac03bb4..050f980 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAltGlyphElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAltGlyphElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp
index 6c82779..220f4a6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGAngleConstructor::s_info = { "SVGAngleConstructor", 0, &JSSVGAngleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h
index 2630c3d..42fdbbd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAngle.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<SVGAngle> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAngle*, SVGElement* context);
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGAnglePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h
index 48cf5f7..52ab586 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateColorElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimateColorElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h
index e94048a..0ffe6de 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimateElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h
index 0628bee..3a99234 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimateTransformElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimateTransformElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h
index 8b1be0b..c822dc7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedAngle.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedAngle* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedAngle> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedAngle*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedAnglePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h
index 14f3208..c6690a2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedBoolean.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedBoolean* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedBoolean> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedBoolean*, SVGElement* context);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedBooleanPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h
index b2a40c2..6f036d5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedEnumeration.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedEnumeration* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedEnumeration> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedEnumeration*, SVGElement* context);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedEnumerationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h
index 4484335..113f0b2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedInteger.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedInteger* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedInteger> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedInteger*, SVGElement* context);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedIntegerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h
index 7016f60..671eed8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLength.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedLength* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedLength> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedLength*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedLengthPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h
index e95fb92..aa32b12 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedLengthList.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedLengthList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedLengthList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedLengthList*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedLengthListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h
index e33b50d..4c49a92 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumber.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedNumber* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedNumber> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedNumber*, SVGElement* context);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedNumberPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h
index 3729b0a..4b61561 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedNumberList.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedNumberList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedNumberList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedNumberList*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedNumberListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h
index 5a1feb6..eca4cb6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedPreserveAspectRatio.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedPreserveAspectRatio* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedPreserveAspectRatio> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedPreserveAspectRatio*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedPreserveAspectRatioPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h
index 7f9e25d..904a78c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedRect.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedRect* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedRect> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedRect*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedRectPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h
index b7d35e1..216e643 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedString.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedString* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedString> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedString*, SVGElement* context);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedStringPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h
index 9917280..3c7b0a2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimatedTransformList.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGAnimatedTransformList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGAnimatedTransformList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGAnimatedTransformList*, SVGElement* context);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGAnimatedTransformListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h
index f0d421d..e36dc3a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGAnimationElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGAnimationElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h
index 8c609b5..0633d2e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGCircleElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGCircleElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h
index 2dcb7f2..8818254 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGClipPathElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGClipPathElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp
index d60e65d..7a89671 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGColor.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGColorConstructor::s_info = { "SVGColorConstructor", 0, &JSSVGColorConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGColor.h b/src/3rdparty/webkit/WebCore/generated/JSSVGColor.h
index 03f5c31..220f73e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGColor.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGColor.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGColorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp
index e37e52e..f346d07 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.cpp
@@ -92,8 +92,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGComponentTransferFunctionElementConstructor::s_info = { "SVGComponentTransferFunctionElementConstructor", 0, &JSSVGComponentTransferFunctionElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h
index bda4119..b7cf7c4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGComponentTransferFunctionElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGComponentTransferFunctionElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h
index 137803a..ef61751 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGCursorElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGCursorElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h
index 522d278..da6470b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGDefsElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGDefsElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h
index 920127b..1f43e7a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGDescElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGDescElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h b/src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h
index 830952b..47c6b15 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGDocument.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGDocumentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp
index 2278043..c4cc3a4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGElement.cpp
@@ -24,6 +24,7 @@
#include "JSSVGElement.h"
+#include "HTMLNames.h"
#include "JSSVGElement.h"
#include "JSSVGSVGElement.h"
#include "KURL.h"
@@ -104,7 +105,7 @@ JSValue jsSVGElementId(ExecState* exec, const Identifier&, const PropertySlot& s
JSSVGElement* castedThis = static_cast<JSSVGElement*>(asObject(slot.slotBase()));
UNUSED_PARAM(exec);
SVGElement* imp = static_cast<SVGElement*>(castedThis->impl());
- return jsString(exec, imp->id());
+ return jsString(exec, imp->getAttribute(HTMLNames::idAttr));
}
JSValue jsSVGElementXmlbase(ExecState* exec, const Identifier&, const PropertySlot& slot)
@@ -140,7 +141,7 @@ void setJSSVGElementId(ExecState* exec, JSObject* thisObject, JSValue value)
{
SVGElement* imp = static_cast<SVGElement*>(static_cast<JSSVGElement*>(thisObject)->impl());
ExceptionCode ec = 0;
- imp->setId(valueToStringWithNullCheck(exec, value), ec);
+ imp->setAttribute(HTMLNames::idAttr, valueToStringWithNullCheck(exec, value), ec);
setDOMException(exec, ec);
}
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGElement.h
index 39b1660..111f9b9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGElement.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGElement* impl() const
{
return static_cast<SVGElement*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
SVGElement* toSVGElement(JSC::JSValue);
@@ -60,7 +62,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h b/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h
index 2ed2f72..57a150f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstance.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -62,6 +62,8 @@ public:
private:
RefPtr<SVGElementInstance> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGElementInstance*);
@@ -77,9 +79,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGElementInstancePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h
index bfbebed..257f405 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGElementInstanceList.h
@@ -46,13 +46,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGElementInstanceList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGElementInstanceList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGElementInstanceList*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGElementInstanceListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h
index 477b037..100dfa1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGEllipseElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGEllipseElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp
index 0b41188..039182f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGException.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGExceptionConstructor::s_info = { "SVGExceptionConstructor", 0, &JSSVGExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGException.h b/src/3rdparty/webkit/WebCore/generated/JSSVGException.h
index 646f003..21f4221 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGException.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<SVGException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGException*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp
index e7aebf9..d32f276 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFEBlendElementConstructor::s_info = { "SVGFEBlendElementConstructor", 0, &JSSVGFEBlendElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h
index 41cc90a..910f9b8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEBlendElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEBlendElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp
index 34252d9..0f1d439 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFEColorMatrixElementConstructor::s_info = { "SVGFEColorMatrixElementConstructor", 0, &JSSVGFEColorMatrixElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h
index 65b8b2a..5c9305e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEColorMatrixElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEColorMatrixElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h
index 71ca39c..265d70c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEComponentTransferElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEComponentTransferElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp
index 782be78..c0de8f7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.cpp
@@ -49,7 +49,7 @@ static const HashTableValue JSSVGFECompositeElementTableValues[16] =
{
{ "in1", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementIn1, (intptr_t)0 },
{ "in2", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementIn2, (intptr_t)0 },
- { "_operator", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElement_operator, (intptr_t)0 },
+ { "operator", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementOperator, (intptr_t)0 },
{ "k1", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementK1, (intptr_t)0 },
{ "k2", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementK2, (intptr_t)0 },
{ "k3", DontDelete|ReadOnly, (intptr_t)jsSVGFECompositeElementK3, (intptr_t)0 },
@@ -107,8 +107,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFECompositeElementConstructor::s_info = { "SVGFECompositeElementConstructor", 0, &JSSVGFECompositeElementConstructorTable, 0 };
@@ -202,7 +205,7 @@ JSValue jsSVGFECompositeElementIn2(ExecState* exec, const Identifier&, const Pro
return toJS(exec, castedThis->globalObject(), obj.get(), imp);
}
-JSValue jsSVGFECompositeElement_operator(ExecState* exec, const Identifier&, const PropertySlot& slot)
+JSValue jsSVGFECompositeElementOperator(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSSVGFECompositeElement* castedThis = static_cast<JSSVGFECompositeElement*>(asObject(slot.slotBase()));
UNUSED_PARAM(exec);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h
index ef165b9..70cb296 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFECompositeElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFECompositeElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -71,7 +75,7 @@ JSC::JSValue JSC_HOST_CALL jsSVGFECompositeElementPrototypeFunctionGetPresentati
JSC::JSValue jsSVGFECompositeElementIn1(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFECompositeElementIn2(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
-JSC::JSValue jsSVGFECompositeElement_operator(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFECompositeElementOperator(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFECompositeElementK1(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFECompositeElementK2(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFECompositeElementK3(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h
index 87eac3d..442cb71 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDiffuseLightingElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEDiffuseLightingElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp
index c5f7fbb..6bdd56e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.cpp
@@ -103,8 +103,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFEDisplacementMapElementConstructor::s_info = { "SVGFEDisplacementMapElementConstructor", 0, &JSSVGFEDisplacementMapElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h
index 39098b8..d5eafce 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDisplacementMapElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEDisplacementMapElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h
index 810f1cd..becbe95 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEDistantLightElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEDistantLightElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp
index 2c331e3..3ee186c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.cpp
@@ -43,9 +43,8 @@ ASSERT_CLASS_FITS_IN_CELL(JSSVGFEFloodElement);
/* Hash table */
-static const HashTableValue JSSVGFEFloodElementTableValues[10] =
+static const HashTableValue JSSVGFEFloodElementTableValues[9] =
{
- { "in1", DontDelete|ReadOnly, (intptr_t)jsSVGFEFloodElementIn1, (intptr_t)0 },
{ "x", DontDelete|ReadOnly, (intptr_t)jsSVGFEFloodElementX, (intptr_t)0 },
{ "y", DontDelete|ReadOnly, (intptr_t)jsSVGFEFloodElementY, (intptr_t)0 },
{ "width", DontDelete|ReadOnly, (intptr_t)jsSVGFEFloodElementWidth, (intptr_t)0 },
@@ -61,7 +60,7 @@ static JSC_CONST_HASHTABLE HashTable JSSVGFEFloodElementTable =
#if ENABLE(PERFECT_HASH_SIZE)
{ 255, JSSVGFEFloodElementTableValues, 0 };
#else
- { 34, 31, JSSVGFEFloodElementTableValues, 0 };
+ { 18, 15, JSSVGFEFloodElementTableValues, 0 };
#endif
/* Hash table for constructor */
@@ -92,8 +91,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFEFloodElementConstructor::s_info = { "SVGFEFloodElementConstructor", 0, &JSSVGFEFloodElementConstructorTable, 0 };
@@ -162,15 +164,6 @@ bool JSSVGFEFloodElement::getOwnPropertyDescriptor(ExecState* exec, const Identi
return getStaticValueDescriptor<JSSVGFEFloodElement, Base>(exec, &JSSVGFEFloodElementTable, this, propertyName, descriptor);
}
-JSValue jsSVGFEFloodElementIn1(ExecState* exec, const Identifier&, const PropertySlot& slot)
-{
- JSSVGFEFloodElement* castedThis = static_cast<JSSVGFEFloodElement*>(asObject(slot.slotBase()));
- UNUSED_PARAM(exec);
- SVGFEFloodElement* imp = static_cast<SVGFEFloodElement*>(castedThis->impl());
- RefPtr<SVGAnimatedString> obj = imp->in1Animated();
- return toJS(exec, castedThis->globalObject(), obj.get(), imp);
-}
-
JSValue jsSVGFEFloodElementX(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSSVGFEFloodElement* castedThis = static_cast<JSSVGFEFloodElement*>(asObject(slot.slotBase()));
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h
index a87b884..2dccbf8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFloodElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEFloodElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -69,7 +73,6 @@ public:
JSC::JSValue JSC_HOST_CALL jsSVGFEFloodElementPrototypeFunctionGetPresentationAttribute(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
// Attributes
-JSC::JSValue jsSVGFEFloodElementIn1(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFEFloodElementX(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFEFloodElementY(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsSVGFEFloodElementWidth(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h
index 7956656..9165733 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncAElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEFuncAElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h
index d6c8c74..712f096 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncBElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEFuncBElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h
index d9e1767..ecb6430 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncGElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEFuncGElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h
index 179a254..f338fae 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEFuncRElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEFuncRElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h
index 1227008..7715726 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEGaussianBlurElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEGaussianBlurElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h
index a21a67b..616d7e5 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEImageElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEImageElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h
index 501ce85..112f064 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEMergeElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h
index 5f055ee..966eacf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMergeNodeElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEMergeNodeElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.cpp
new file mode 100644
index 0000000..b8b7ae5
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.cpp
@@ -0,0 +1,336 @@
+/*
+ This file is part of the WebKit open source project.
+ This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+
+#if ENABLE(SVG) && ENABLE(FILTERS)
+
+#include "JSSVGFEMorphologyElement.h"
+
+#include "CSSMutableStyleDeclaration.h"
+#include "CSSStyleDeclaration.h"
+#include "CSSValue.h"
+#include "JSCSSStyleDeclaration.h"
+#include "JSCSSValue.h"
+#include "JSSVGAnimatedEnumeration.h"
+#include "JSSVGAnimatedLength.h"
+#include "JSSVGAnimatedNumber.h"
+#include "JSSVGAnimatedString.h"
+#include "SVGFEMorphologyElement.h"
+#include <runtime/Error.h>
+#include <wtf/GetPtr.h>
+
+using namespace JSC;
+
+namespace WebCore {
+
+ASSERT_CLASS_FITS_IN_CELL(JSSVGFEMorphologyElement);
+
+/* Hash table */
+
+static const HashTableValue JSSVGFEMorphologyElementTableValues[13] =
+{
+ { "in1", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementIn1, (intptr_t)0 },
+ { "operator", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementOperator, (intptr_t)0 },
+ { "radiusX", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementRadiusX, (intptr_t)0 },
+ { "radiusY", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementRadiusY, (intptr_t)0 },
+ { "x", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementX, (intptr_t)0 },
+ { "y", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementY, (intptr_t)0 },
+ { "width", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementWidth, (intptr_t)0 },
+ { "height", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementHeight, (intptr_t)0 },
+ { "result", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementResult, (intptr_t)0 },
+ { "className", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementClassName, (intptr_t)0 },
+ { "style", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementStyle, (intptr_t)0 },
+ { "constructor", DontEnum|ReadOnly, (intptr_t)jsSVGFEMorphologyElementConstructor, (intptr_t)0 },
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSSVGFEMorphologyElementTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 255, JSSVGFEMorphologyElementTableValues, 0 };
+#else
+ { 34, 31, JSSVGFEMorphologyElementTableValues, 0 };
+#endif
+
+/* Hash table for constructor */
+
+static const HashTableValue JSSVGFEMorphologyElementConstructorTableValues[4] =
+{
+ { "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_UNKNOWN, (intptr_t)0 },
+ { "SVG_MORPHOLOGY_OPERATOR_ERODE", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_ERODE, (intptr_t)0 },
+ { "SVG_MORPHOLOGY_OPERATOR_DILATE", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_DILATE, (intptr_t)0 },
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSSVGFEMorphologyElementConstructorTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 3, JSSVGFEMorphologyElementConstructorTableValues, 0 };
+#else
+ { 8, 7, JSSVGFEMorphologyElementConstructorTableValues, 0 };
+#endif
+
+class JSSVGFEMorphologyElementConstructor : public DOMConstructorObject {
+public:
+ JSSVGFEMorphologyElementConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)
+ : DOMConstructorObject(JSSVGFEMorphologyElementConstructor::createStructure(globalObject->objectPrototype()), globalObject)
+ {
+ putDirect(exec->propertyNames().prototype, JSSVGFEMorphologyElementPrototype::self(exec, globalObject), None);
+ }
+ virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
+ virtual const ClassInfo* classInfo() const { return &s_info; }
+ static const ClassInfo s_info;
+
+ static PassRefPtr<Structure> createStructure(JSValue proto)
+ {
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
+};
+
+const ClassInfo JSSVGFEMorphologyElementConstructor::s_info = { "SVGFEMorphologyElementConstructor", 0, &JSSVGFEMorphologyElementConstructorTable, 0 };
+
+bool JSSVGFEMorphologyElementConstructor::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticValueSlot<JSSVGFEMorphologyElementConstructor, DOMObject>(exec, &JSSVGFEMorphologyElementConstructorTable, this, propertyName, slot);
+}
+
+bool JSSVGFEMorphologyElementConstructor::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticValueDescriptor<JSSVGFEMorphologyElementConstructor, DOMObject>(exec, &JSSVGFEMorphologyElementConstructorTable, this, propertyName, descriptor);
+}
+
+/* Hash table for prototype */
+
+static const HashTableValue JSSVGFEMorphologyElementPrototypeTableValues[6] =
+{
+ { "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_UNKNOWN, (intptr_t)0 },
+ { "SVG_MORPHOLOGY_OPERATOR_ERODE", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_ERODE, (intptr_t)0 },
+ { "SVG_MORPHOLOGY_OPERATOR_DILATE", DontDelete|ReadOnly, (intptr_t)jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_DILATE, (intptr_t)0 },
+ { "setRadius", DontDelete|Function, (intptr_t)jsSVGFEMorphologyElementPrototypeFunctionSetRadius, (intptr_t)2 },
+ { "getPresentationAttribute", DontDelete|Function, (intptr_t)jsSVGFEMorphologyElementPrototypeFunctionGetPresentationAttribute, (intptr_t)1 },
+ { 0, 0, 0, 0 }
+};
+
+static JSC_CONST_HASHTABLE HashTable JSSVGFEMorphologyElementPrototypeTable =
+#if ENABLE(PERFECT_HASH_SIZE)
+ { 63, JSSVGFEMorphologyElementPrototypeTableValues, 0 };
+#else
+ { 17, 15, JSSVGFEMorphologyElementPrototypeTableValues, 0 };
+#endif
+
+const ClassInfo JSSVGFEMorphologyElementPrototype::s_info = { "SVGFEMorphologyElementPrototype", 0, &JSSVGFEMorphologyElementPrototypeTable, 0 };
+
+JSObject* JSSVGFEMorphologyElementPrototype::self(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return getDOMPrototype<JSSVGFEMorphologyElement>(exec, globalObject);
+}
+
+bool JSSVGFEMorphologyElementPrototype::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticPropertySlot<JSSVGFEMorphologyElementPrototype, JSObject>(exec, &JSSVGFEMorphologyElementPrototypeTable, this, propertyName, slot);
+}
+
+bool JSSVGFEMorphologyElementPrototype::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticPropertyDescriptor<JSSVGFEMorphologyElementPrototype, JSObject>(exec, &JSSVGFEMorphologyElementPrototypeTable, this, propertyName, descriptor);
+}
+
+const ClassInfo JSSVGFEMorphologyElement::s_info = { "SVGFEMorphologyElement", &JSSVGElement::s_info, &JSSVGFEMorphologyElementTable, 0 };
+
+JSSVGFEMorphologyElement::JSSVGFEMorphologyElement(NonNullPassRefPtr<Structure> structure, JSDOMGlobalObject* globalObject, PassRefPtr<SVGFEMorphologyElement> impl)
+ : JSSVGElement(structure, globalObject, impl)
+{
+}
+
+JSObject* JSSVGFEMorphologyElement::createPrototype(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return new (exec) JSSVGFEMorphologyElementPrototype(JSSVGFEMorphologyElementPrototype::createStructure(JSSVGElementPrototype::self(exec, globalObject)));
+}
+
+bool JSSVGFEMorphologyElement::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+ return getStaticValueSlot<JSSVGFEMorphologyElement, Base>(exec, &JSSVGFEMorphologyElementTable, this, propertyName, slot);
+}
+
+bool JSSVGFEMorphologyElement::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
+{
+ return getStaticValueDescriptor<JSSVGFEMorphologyElement, Base>(exec, &JSSVGFEMorphologyElementTable, this, propertyName, descriptor);
+}
+
+JSValue jsSVGFEMorphologyElementIn1(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedString> obj = imp->in1Animated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementOperator(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedEnumeration> obj = imp->_operatorAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementRadiusX(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedNumber> obj = imp->radiusXAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementRadiusY(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedNumber> obj = imp->radiusYAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementX(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedLength> obj = imp->xAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementY(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedLength> obj = imp->yAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementWidth(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedLength> obj = imp->widthAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementHeight(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedLength> obj = imp->heightAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementResult(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedString> obj = imp->resultAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementClassName(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ RefPtr<SVGAnimatedString> obj = imp->classNameAnimated();
+ return toJS(exec, castedThis->globalObject(), obj.get(), imp);
+}
+
+JSValue jsSVGFEMorphologyElementStyle(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* castedThis = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ UNUSED_PARAM(exec);
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThis->impl());
+ return toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->style()));
+}
+
+JSValue jsSVGFEMorphologyElementConstructor(ExecState* exec, const Identifier&, const PropertySlot& slot)
+{
+ JSSVGFEMorphologyElement* domObject = static_cast<JSSVGFEMorphologyElement*>(asObject(slot.slotBase()));
+ return JSSVGFEMorphologyElement::getConstructor(exec, domObject->globalObject());
+}
+JSValue JSSVGFEMorphologyElement::getConstructor(ExecState* exec, JSGlobalObject* globalObject)
+{
+ return getDOMConstructor<JSSVGFEMorphologyElementConstructor>(exec, static_cast<JSDOMGlobalObject*>(globalObject));
+}
+
+JSValue JSC_HOST_CALL jsSVGFEMorphologyElementPrototypeFunctionSetRadius(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSSVGFEMorphologyElement::s_info))
+ return throwError(exec, TypeError);
+ JSSVGFEMorphologyElement* castedThisObj = static_cast<JSSVGFEMorphologyElement*>(asObject(thisValue));
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThisObj->impl());
+ float radiusX = args.at(0).toFloat(exec);
+ float radiusY = args.at(1).toFloat(exec);
+
+ imp->setRadius(radiusX, radiusY);
+ return jsUndefined();
+}
+
+JSValue JSC_HOST_CALL jsSVGFEMorphologyElementPrototypeFunctionGetPresentationAttribute(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSSVGFEMorphologyElement::s_info))
+ return throwError(exec, TypeError);
+ JSSVGFEMorphologyElement* castedThisObj = static_cast<JSSVGFEMorphologyElement*>(asObject(thisValue));
+ SVGFEMorphologyElement* imp = static_cast<SVGFEMorphologyElement*>(castedThisObj->impl());
+ const UString& name = args.at(0).toString(exec);
+
+
+ JSC::JSValue result = toJS(exec, castedThisObj->globalObject(), WTF::getPtr(imp->getPresentationAttribute(name)));
+ return result;
+}
+
+// Constant getters
+
+JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_UNKNOWN(ExecState* exec, const Identifier&, const PropertySlot&)
+{
+ return jsNumber(exec, static_cast<int>(0));
+}
+
+JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_ERODE(ExecState* exec, const Identifier&, const PropertySlot&)
+{
+ return jsNumber(exec, static_cast<int>(1));
+}
+
+JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_DILATE(ExecState* exec, const Identifier&, const PropertySlot&)
+{
+ return jsNumber(exec, static_cast<int>(2));
+}
+
+
+}
+
+#endif // ENABLE(SVG) && ENABLE(FILTERS)
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.h
new file mode 100644
index 0000000..8db6463
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEMorphologyElement.h
@@ -0,0 +1,99 @@
+/*
+ This file is part of the WebKit open source project.
+ This file has been generated by generate-bindings.pl. DO NOT MODIFY!
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef JSSVGFEMorphologyElement_h
+#define JSSVGFEMorphologyElement_h
+
+#if ENABLE(SVG) && ENABLE(FILTERS)
+
+#include "JSSVGElement.h"
+#include "SVGElement.h"
+
+namespace WebCore {
+
+class SVGFEMorphologyElement;
+
+class JSSVGFEMorphologyElement : public JSSVGElement {
+ typedef JSSVGElement Base;
+public:
+ JSSVGFEMorphologyElement(NonNullPassRefPtr<JSC::Structure>, JSDOMGlobalObject*, PassRefPtr<SVGFEMorphologyElement>);
+ static JSC::JSObject* createPrototype(JSC::ExecState*, JSC::JSGlobalObject*);
+ virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
+ virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
+ static const JSC::ClassInfo s_info;
+
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+ static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
+};
+
+
+class JSSVGFEMorphologyElementPrototype : public JSC::JSObject {
+ typedef JSC::JSObject Base;
+public:
+ static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
+ virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
+ static const JSC::ClassInfo s_info;
+ virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier&, JSC::PropertySlot&);
+ virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+ JSSVGFEMorphologyElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
+};
+
+// Functions
+
+JSC::JSValue JSC_HOST_CALL jsSVGFEMorphologyElementPrototypeFunctionSetRadius(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsSVGFEMorphologyElementPrototypeFunctionGetPresentationAttribute(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+// Attributes
+
+JSC::JSValue jsSVGFEMorphologyElementIn1(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementOperator(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementRadiusX(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementRadiusY(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementX(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementY(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementWidth(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementHeight(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementResult(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementClassName(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementStyle(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+// Constants
+
+JSC::JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_UNKNOWN(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_ERODE(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+JSC::JSValue jsSVGFEMorphologyElementSVG_MORPHOLOGY_OPERATOR_DILATE(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
+
+} // namespace WebCore
+
+#endif // ENABLE(SVG) && ENABLE(FILTERS)
+
+#endif
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h
index 0128ea8..3d7387e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEOffsetElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFEOffsetElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h
index 89b64e9..fa8fe77 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFEPointLightElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFEPointLightElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h
index 7ee5759..09c903f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFESpecularLightingElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFESpecularLightingElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h
index aae0f88..8a3a4ab 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFESpotLightElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFESpotLightElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h
index ed9d87b..f1e489e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFETileElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFETileElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp
index a302215..845cdb6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.cpp
@@ -106,8 +106,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGFETurbulenceElementConstructor::s_info = { "SVGFETurbulenceElementConstructor", 0, &JSSVGFETurbulenceElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h
index f8c35f2..7d100b6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFETurbulenceElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFETurbulenceElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h
index 343c406..9e0b45f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFilterElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGFilterElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h
index 289dc62..e6ce8a2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h
index 84cda77..87d2243 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontFaceElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h
index 36f0094..9ffb7b4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceFormatElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontFaceFormatElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h
index 8504888..1abfcbb 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceNameElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontFaceNameElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h
index 2fb2971..1a154ab 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceSrcElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontFaceSrcElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h
index e58cf9d..eede5c0 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGFontFaceUriElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGFontFaceUriElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h
index fa75e42..6e8121a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGForeignObjectElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGForeignObjectElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h
index b4885f9..7c6aa85 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGGElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGGElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h
index 38834f0..05f62df 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGGlyphElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGGlyphElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp
index 7c9b33b..4286016 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.cpp
@@ -97,8 +97,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGGradientElementConstructor::s_info = { "SVGGradientElementConstructor", 0, &JSSVGGradientElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h
index dbfd6e0..3207003 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGGradientElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGGradientElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h
index 17394ba..aeab2d1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGHKernElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGHKernElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h
index 7319718..97bc1e1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGImageElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGImageElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp
index 0f545f8..f97df89 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGLength.cpp
@@ -95,8 +95,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGLengthConstructor::s_info = { "SVGLengthConstructor", 0, &JSSVGLengthConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGLength.h b/src/3rdparty/webkit/WebCore/generated/JSSVGLength.h
index 25f5729..e6c66f4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGLength.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGLength.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -61,6 +61,8 @@ public:
private:
RefPtr<JSSVGPODTypeWrapper<SVGLength> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<SVGLength>*, SVGElement* context);
@@ -76,9 +78,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGLengthPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h
index 7ed12ca..bd9adda 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGLengthList.h
@@ -46,13 +46,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGLengthList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGLengthList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGLengthList*, SVGElement* context);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGLengthListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h
index b9eeb3d..1089b37 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGLineElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGLineElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h
index e71ffe3..ea2f85d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGLinearGradientElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGLinearGradientElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp
index c712ba8..add8265 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.cpp
@@ -112,8 +112,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGMarkerElementConstructor::s_info = { "SVGMarkerElementConstructor", 0, &JSSVGMarkerElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h
index b70410d..ca04951 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMarkerElement.h
@@ -43,10 +43,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -60,9 +62,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGMarkerElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h
index b391d02..042ba89 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMaskElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGMaskElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h b/src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h
index 9c9ece7..6a9d2af 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMatrix.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -58,6 +58,8 @@ public:
private:
RefPtr<JSSVGPODTypeWrapper<TransformationMatrix> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<TransformationMatrix>*, SVGElement* context);
@@ -73,9 +75,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGMatrixPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h
index 0195ff6..462b52d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMetadataElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGMetadataElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h
index d891881..d3584bd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGMissingGlyphElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGMissingGlyphElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h b/src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h
index 4aaeaf9..cf3bc5c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGNumber.h
@@ -46,13 +46,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPODTypeWrapper<float> * impl() const { return m_impl.get(); }
private:
RefPtr<JSSVGPODTypeWrapper<float> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<float>*, SVGElement* context);
@@ -64,7 +66,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGNumberPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h
index 9dd4cb2..4a2cbfe 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGNumberList.h
@@ -46,13 +46,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGNumberList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGNumberList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGNumberList*, SVGElement* context);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGNumberListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp
index 1f86378..c523ddd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.cpp
@@ -92,8 +92,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGPaintConstructor::s_info = { "SVGPaintConstructor", 0, &JSSVGPaintConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h
index 7ef72ed..deaa540 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPaint.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPaintPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h
index 64b0504..b02974b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPathElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp
index f31f795..2f1ecbd 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.cpp
@@ -101,8 +101,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGPathSegConstructor::s_info = { "SVGPathSegConstructor", 0, &JSSVGPathSegConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h
index d648d64..d5da317 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSeg.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<SVGPathSeg> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGPathSeg*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPathSegPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h
index 6c99037..9b7eeec 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegArcAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h
index d6af11b..819d791 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegArcRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegArcRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h
index a20af24..bccce45 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegClosePath.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegClosePathPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h
index ac4640f..b1c676f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoCubicAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h
index 848cce1..0e5cba9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoCubicRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h
index a54e166..478a81d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoCubicSmoothAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h
index 8b0463f..799df23 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoCubicSmoothRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoCubicSmoothRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h
index edb17bd..e29bb76 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoQuadraticAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h
index 8286761..d348b02 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoQuadraticRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h
index 9ffcea7..9cf1562 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoQuadraticSmoothAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h
index 199fad7..9b2d888 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegCurvetoQuadraticSmoothRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegCurvetoQuadraticSmoothRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h
index 1cdc6ff..bcd5ee1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h
index b4aa488..314570b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoHorizontalAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h
index 004a444..8df3aba 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoHorizontalRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoHorizontalRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h
index 8b8faa6..f9a1c1e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h
index 45b5ee2..6258a0c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoVerticalAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h
index 95230b1..7355926 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegLinetoVerticalRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegLinetoVerticalRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h
index d9d7040..120fc96 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegList.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -62,6 +62,8 @@ public:
private:
RefPtr<SVGPathSegList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGPathSegList*, SVGElement* context);
@@ -77,9 +79,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPathSegListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h
index f7781ac..b81a644 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoAbs.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegMovetoAbsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h
index 93cec0e..57b606b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPathSegMovetoRel.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGPathSegMovetoRelPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h
index d1ce76a..6cd8a73 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPatternElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPatternElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h
index 93cb8e0..97ec466 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPoint.h
@@ -47,13 +47,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPODTypeWrapper<FloatPoint> * impl() const { return m_impl.get(); }
private:
RefPtr<JSSVGPODTypeWrapper<FloatPoint> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<FloatPoint>*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPointPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h
index e8b783f..c029a46 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPointList.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -62,6 +62,8 @@ public:
private:
RefPtr<SVGPointList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGPointList*, SVGElement* context);
@@ -77,9 +79,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPointListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h
index e1cbd06..0eeac84 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPolygonElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPolygonElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h
index 3a654d3..bd58c78 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPolylineElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPolylineElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp
index 0345319..0f3329c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.cpp
@@ -93,8 +93,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGPreserveAspectRatioConstructor::s_info = { "SVGPreserveAspectRatioConstructor", 0, &JSSVGPreserveAspectRatioConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h b/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h
index 26ed465..32f1661 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGPreserveAspectRatio.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<SVGPreserveAspectRatio> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGPreserveAspectRatio*, SVGElement* context);
@@ -70,9 +72,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPreserveAspectRatioPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h
index a284b03..a4c3b87 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGRadialGradientElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGRadialGradientElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGRect.h b/src/3rdparty/webkit/WebCore/generated/JSSVGRect.h
index 0a99542..209e365 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGRect.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGRect.h
@@ -47,13 +47,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGPODTypeWrapper<FloatRect> * impl() const { return m_impl.get(); }
private:
RefPtr<JSSVGPODTypeWrapper<FloatRect> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<FloatRect>*, SVGElement* context);
@@ -65,7 +67,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGRectPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h
index 94b753a..7572ac1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGRectElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGRectElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp
index 7d645fd..b484fbf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGRenderingIntentConstructor::s_info = { "SVGRenderingIntentConstructor", 0, &JSSVGRenderingIntentConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h b/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h
index 4a0f363..16fcff2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGRenderingIntent.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<SVGRenderingIntent> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGRenderingIntent*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGRenderingIntentPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h
index 9ef7c3f..91ec122 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGSVGElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGSVGElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h
index 5ddcded..bc4a7eb4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGScriptElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGScriptElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h
index 39c660d..1dee3f0 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGSetElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGSetElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h
index 2269249..9dc52b2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGStopElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGStopElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h
index 5299968..b328bac 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGStringList.h
@@ -46,13 +46,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SVGStringList* impl() const { return m_impl.get(); }
private:
RefPtr<SVGStringList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGStringList*, SVGElement* context);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGStringListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h
index 1cf73b2..608c278 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGStyleElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -55,7 +57,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGStyleElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h
index c1a6099..a91244f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGSwitchElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGSwitchElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h
index c4dc23b..c430257 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGSymbolElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGSymbolElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h
index 6d24e83..74ab8c4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTRefElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGTRefElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h
index 6529758..cb9df9d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTSpanElement.h
@@ -38,6 +38,13 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
@@ -47,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGTSpanElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp
index dc8dfae..31a570f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.cpp
@@ -108,8 +108,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGTextContentElementConstructor::s_info = { "SVGTextContentElementConstructor", 0, &JSSVGTextContentElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h
index 35db44b..5bbe15f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextContentElement.h
@@ -43,10 +43,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -60,9 +62,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTextContentElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h
index 0f0959d..d605de3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTextElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp
index b4f0c20..d952072 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGTextPathElementConstructor::s_info = { "SVGTextPathElementConstructor", 0, &JSSVGTextPathElementConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h
index ada62bf..cf883be 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPathElement.h
@@ -42,10 +42,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTextPathElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h
index f861e89..04d1db3 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTextPositioningElement.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGTextPositioningElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h
index 9972b69..67a353d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTitleElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTitleElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp
index 4a67764..82cddb6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGTransformConstructor::s_info = { "SVGTransformConstructor", 0, &JSSVGTransformConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h
index bce97e5..592af87 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTransform.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<JSSVGPODTypeWrapper<SVGTransform> > m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSSVGPODTypeWrapper<SVGTransform>*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTransformPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h b/src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h
index 36ff356..a8fe9e4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGTransformList.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -62,6 +62,8 @@ public:
private:
RefPtr<SVGTransformList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGTransformList*, SVGElement* context);
@@ -77,9 +79,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGTransformListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp b/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp
index 683398f..452fc9c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSSVGUnitTypesConstructor::s_info = { "SVGUnitTypesConstructor", 0, &JSSVGUnitTypesConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h b/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h
index 4d92f84..0c20046 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGUnitTypes.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<SVGUnitTypes> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SVGUnitTypes*, SVGElement* context);
@@ -69,9 +71,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGUnitTypesPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h
index 2c9f142..c5665c0 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGUseElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGUseElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h b/src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h
index bfeda85..db1533f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGViewElement.h
@@ -43,9 +43,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -59,9 +61,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSVGViewElementPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h b/src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h
index b3a34c6..19bd2e7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSVGZoomEvent.h
@@ -42,9 +42,11 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -54,7 +56,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSVGZoomEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSScreen.h b/src/3rdparty/webkit/WebCore/generated/JSScreen.h
index 7a54e9c..01a4545 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSScreen.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSScreen.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
Screen* impl() const { return m_impl.get(); }
private:
RefPtr<Screen> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Screen*);
@@ -61,7 +63,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSScreenPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSharedWorker.h b/src/3rdparty/webkit/WebCore/generated/JSSharedWorker.h
index a622e83..55d5f4f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSharedWorker.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSharedWorker.h
@@ -42,7 +42,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -51,6 +51,8 @@ public:
{
return static_cast<SharedWorker*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, SharedWorker*);
@@ -64,9 +66,11 @@ public:
static const JSC::ClassInfo s_info;
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSSharedWorkerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSSharedWorkerContext.h b/src/3rdparty/webkit/WebCore/generated/JSSharedWorkerContext.h
index 21543e5..65cfada 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSSharedWorkerContext.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSSharedWorkerContext.h
@@ -42,13 +42,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
SharedWorkerContext* impl() const
{
return static_cast<SharedWorkerContext*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
SharedWorkerContext* toSharedWorkerContext(JSC::JSValue);
@@ -59,7 +61,13 @@ public:
void* operator new(size_t, JSC::JSGlobalData*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSSharedWorkerContextPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStorage.cpp b/src/3rdparty/webkit/WebCore/generated/JSStorage.cpp
index 54f6c7d..998b8cf 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStorage.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSStorage.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSStorageConstructor::s_info = { "StorageConstructor", 0, &JSStorageConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStorage.h b/src/3rdparty/webkit/WebCore/generated/JSStorage.h
index 1d15472..e2dea63 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStorage.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSStorage.h
@@ -47,7 +47,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier&);
@@ -57,6 +57,8 @@ public:
private:
RefPtr<Storage> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
private:
static bool canGetItemsForName(JSC::ExecState*, Storage*, const JSC::Identifier&);
static JSC::JSValue nameGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
@@ -75,9 +77,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSStoragePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp
index f467736..bc8468c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.cpp
@@ -24,8 +24,6 @@
#include "JSStorageEvent.h"
-#include "DOMWindow.h"
-#include "JSDOMWindow.h"
#include "JSStorage.h"
#include "KURL.h"
#include "Storage.h"
@@ -42,13 +40,12 @@ ASSERT_CLASS_FITS_IN_CELL(JSStorageEvent);
/* Hash table */
-static const HashTableValue JSStorageEventTableValues[8] =
+static const HashTableValue JSStorageEventTableValues[7] =
{
{ "key", DontDelete|ReadOnly, (intptr_t)jsStorageEventKey, (intptr_t)0 },
{ "oldValue", DontDelete|ReadOnly, (intptr_t)jsStorageEventOldValue, (intptr_t)0 },
{ "newValue", DontDelete|ReadOnly, (intptr_t)jsStorageEventNewValue, (intptr_t)0 },
{ "uri", DontDelete|ReadOnly, (intptr_t)jsStorageEventUri, (intptr_t)0 },
- { "source", DontDelete|ReadOnly, (intptr_t)jsStorageEventSource, (intptr_t)0 },
{ "storageArea", DontDelete|ReadOnly, (intptr_t)jsStorageEventStorageArea, (intptr_t)0 },
{ "constructor", DontEnum|ReadOnly, (intptr_t)jsStorageEventConstructor, (intptr_t)0 },
{ 0, 0, 0, 0 }
@@ -89,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSStorageEventConstructor::s_info = { "StorageEventConstructor", 0, &JSStorageEventConstructorTable, 0 };
@@ -109,7 +109,7 @@ bool JSStorageEventConstructor::getOwnPropertyDescriptor(ExecState* exec, const
static const HashTableValue JSStorageEventPrototypeTableValues[2] =
{
- { "initStorageEvent", DontDelete|Function, (intptr_t)jsStorageEventPrototypeFunctionInitStorageEvent, (intptr_t)9 },
+ { "initStorageEvent", DontDelete|Function, (intptr_t)jsStorageEventPrototypeFunctionInitStorageEvent, (intptr_t)8 },
{ 0, 0, 0, 0 }
};
@@ -191,14 +191,6 @@ JSValue jsStorageEventUri(ExecState* exec, const Identifier&, const PropertySlot
return jsString(exec, imp->uri());
}
-JSValue jsStorageEventSource(ExecState* exec, const Identifier&, const PropertySlot& slot)
-{
- JSStorageEvent* castedThis = static_cast<JSStorageEvent*>(asObject(slot.slotBase()));
- UNUSED_PARAM(exec);
- StorageEvent* imp = static_cast<StorageEvent*>(castedThis->impl());
- return toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->source()));
-}
-
JSValue jsStorageEventStorageArea(ExecState* exec, const Identifier&, const PropertySlot& slot)
{
JSStorageEvent* castedThis = static_cast<JSStorageEvent*>(asObject(slot.slotBase()));
@@ -231,10 +223,9 @@ JSValue JSC_HOST_CALL jsStorageEventPrototypeFunctionInitStorageEvent(ExecState*
const UString& oldValueArg = valueToStringWithNullCheck(exec, args.at(4));
const UString& newValueArg = valueToStringWithNullCheck(exec, args.at(5));
const UString& uriArg = args.at(6).toString(exec);
- DOMWindow* sourceArg = toDOMWindow(args.at(7));
- Storage* storageAreaArg = toStorage(args.at(8));
+ Storage* storageAreaArg = toStorage(args.at(7));
- imp->initStorageEvent(typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, uriArg, sourceArg, storageAreaArg);
+ imp->initStorageEvent(typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, uriArg, storageAreaArg);
return jsUndefined();
}
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h b/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h
index bfd8a67..a9552c1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSStorageEvent.h
@@ -41,10 +41,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -58,9 +60,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSStorageEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
@@ -72,7 +76,6 @@ JSC::JSValue jsStorageEventKey(JSC::ExecState*, const JSC::Identifier&, const JS
JSC::JSValue jsStorageEventOldValue(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsStorageEventNewValue(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsStorageEventUri(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
-JSC::JSValue jsStorageEventSource(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsStorageEventStorageArea(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
JSC::JSValue jsStorageEventConstructor(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp b/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp
index bfa30f4..ae7011d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSStyleSheetConstructor::s_info = { "StyleSheetConstructor", 0, &JSStyleSheetConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h b/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h
index 6c67955..cfdd964 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSStyleSheet.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -54,6 +54,8 @@ public:
private:
RefPtr<StyleSheet> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, StyleSheet*);
@@ -67,9 +69,11 @@ public:
static const JSC::ClassInfo s_info;
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSStyleSheetPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp b/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp
index aa1d6bd..5d07cc1 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSStyleSheetListConstructor::s_info = { "StyleSheetListConstructor", 0, &JSStyleSheetListConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h b/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h
index 757b8ad..7b518aa 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSStyleSheetList.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -55,6 +55,8 @@ public:
private:
RefPtr<StyleSheetList> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
private:
static bool canGetItemsForName(JSC::ExecState*, StyleSheetList*, const JSC::Identifier&);
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSStyleSheetListPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSText.cpp b/src/3rdparty/webkit/WebCore/generated/JSText.cpp
index d90e3f2..62ba04b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSText.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSText.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSTextConstructor::s_info = { "TextConstructor", 0, &JSTextConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSText.h b/src/3rdparty/webkit/WebCore/generated/JSText.h
index dc31f61..2c53691 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSText.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSText.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, Text*);
@@ -57,9 +59,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSTextPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp
index 3ddab29..3a5c4d9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSTextEvent.cpp
@@ -78,8 +78,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSTextEventConstructor::s_info = { "TextEventConstructor", 0, &JSTextEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTextEvent.h b/src/3rdparty/webkit/WebCore/generated/JSTextEvent.h
index 19e77ce..576d55e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTextEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSTextEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSTextEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp b/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp
index b267f76..627ad3b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.cpp
@@ -75,8 +75,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSTextMetricsConstructor::s_info = { "TextMetricsConstructor", 0, &JSTextMetricsConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h b/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h
index 9e3968a..9cf013f 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSTextMetrics.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<TextMetrics> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TextMetrics*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSTextMetricsPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h b/src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h
index 0db2dff..201df06 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSTimeRanges.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
TimeRanges* impl() const { return m_impl.get(); }
private:
RefPtr<TimeRanges> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TimeRanges*);
@@ -67,9 +69,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSTimeRangesPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp b/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp
index fe72cad..a26425e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.cpp
@@ -84,8 +84,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSTreeWalkerConstructor::s_info = { "TreeWalkerConstructor", 0, &JSTreeWalkerConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h b/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h
index 091bdd0..3daf9e8 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSTreeWalker.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -63,6 +63,8 @@ public:
private:
RefPtr<TreeWalker> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TreeWalker*);
@@ -78,9 +80,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSTreeWalkerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp
index 236845e..1aa2963 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSUIEvent.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSUIEventConstructor::s_info = { "UIEventConstructor", 0, &JSUIEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSUIEvent.h b/src/3rdparty/webkit/WebCore/generated/JSUIEvent.h
index b9658a4..19f8ed2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSUIEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSUIEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSUIEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSValidityState.h b/src/3rdparty/webkit/WebCore/generated/JSValidityState.h
index 760480c..ece0459 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSValidityState.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSValidityState.h
@@ -43,13 +43,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
ValidityState* impl() const { return m_impl.get(); }
private:
RefPtr<ValidityState> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, ValidityState*);
@@ -61,7 +63,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSValidityStatePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h b/src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h
index 9b82bb2..da043af 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSVoidCallback.h
@@ -39,10 +39,17 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
VoidCallback* impl() const { return m_impl.get(); }
private:
RefPtr<VoidCallback> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, VoidCallback*);
@@ -58,9 +65,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSVoidCallbackPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp
index 9dbd396..e5a3892 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWebKitAnimationEventConstructor::s_info = { "WebKitAnimationEventConstructor", 0, &JSWebKitAnimationEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h
index 1631bad..e4e622a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitAnimationEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebKitAnimationEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp
index cb7a615..e801d63 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWebKitCSSKeyframeRuleConstructor::s_info = { "WebKitCSSKeyframeRuleConstructor", 0, &JSWebKitCSSKeyframeRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h
index 5fea55d..98289d4 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframeRule.h
@@ -40,10 +40,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -53,7 +55,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSWebKitCSSKeyframeRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp
index 5538ba7..6ea3237 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWebKitCSSKeyframesRuleConstructor::s_info = { "WebKitCSSKeyframesRuleConstructor", 0, &JSWebKitCSSKeyframesRuleConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h
index 73d10cf..e76ba2a 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSKeyframesRule.h
@@ -41,11 +41,13 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
static JSC::JSValue indexGetter(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
};
@@ -60,9 +62,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebKitCSSKeyframesRulePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h
index 83c2c3d..3823098 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSMatrix.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
WebKitCSSMatrix* impl() const { return m_impl.get(); }
private:
RefPtr<WebKitCSSMatrix> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, WebKitCSSMatrix*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebKitCSSMatrixPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp
index 0c2fa6c..b62daea 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.cpp
@@ -96,8 +96,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWebKitCSSTransformValueConstructor::s_info = { "WebKitCSSTransformValueConstructor", 0, &JSWebKitCSSTransformValueConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h
index 6fc7d2a..bb819bb 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitCSSTransformValue.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebKitCSSTransformValuePrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h
index 885040d..319980d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitPoint.h
@@ -44,13 +44,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
WebKitPoint* impl() const { return m_impl.get(); }
private:
RefPtr<WebKitPoint> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, WebKitPoint*);
@@ -62,7 +64,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSWebKitPointPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp
index b4c83b4..20066f7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.cpp
@@ -79,8 +79,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWebKitTransitionEventConstructor::s_info = { "WebKitTransitionEventConstructor", 0, &JSWebKitTransitionEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h b/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h
index e649dc4..015574c 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebKitTransitionEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -56,9 +58,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebKitTransitionEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebSocket.cpp b/src/3rdparty/webkit/WebCore/generated/JSWebSocket.cpp
index 44fa960..ea8ff3d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebSocket.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebSocket.cpp
@@ -24,9 +24,11 @@
#include "JSWebSocket.h"
+#include "Event.h"
#include "EventListener.h"
#include "Frame.h"
#include "JSDOMGlobalObject.h"
+#include "JSEvent.h"
#include "JSEventListener.h"
#include "KURL.h"
#include "RegisteredEventListener.h"
@@ -64,13 +66,16 @@ static JSC_CONST_HASHTABLE HashTable JSWebSocketTable =
/* Hash table for prototype */
-static const HashTableValue JSWebSocketPrototypeTableValues[6] =
+static const HashTableValue JSWebSocketPrototypeTableValues[9] =
{
{ "CONNECTING", DontDelete|ReadOnly, (intptr_t)jsWebSocketCONNECTING, (intptr_t)0 },
{ "OPEN", DontDelete|ReadOnly, (intptr_t)jsWebSocketOPEN, (intptr_t)0 },
{ "CLOSED", DontDelete|ReadOnly, (intptr_t)jsWebSocketCLOSED, (intptr_t)0 },
{ "send", DontDelete|Function, (intptr_t)jsWebSocketPrototypeFunctionSend, (intptr_t)1 },
{ "close", DontDelete|Function, (intptr_t)jsWebSocketPrototypeFunctionClose, (intptr_t)0 },
+ { "addEventListener", DontDelete|Function, (intptr_t)jsWebSocketPrototypeFunctionAddEventListener, (intptr_t)3 },
+ { "removeEventListener", DontDelete|Function, (intptr_t)jsWebSocketPrototypeFunctionRemoveEventListener, (intptr_t)3 },
+ { "dispatchEvent", DontDelete|Function, (intptr_t)jsWebSocketPrototypeFunctionDispatchEvent, (intptr_t)1 },
{ 0, 0, 0, 0 }
};
@@ -257,6 +262,40 @@ JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionClose(ExecState* exec, JSObjec
return jsUndefined();
}
+JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionAddEventListener(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSWebSocket::s_info))
+ return throwError(exec, TypeError);
+ JSWebSocket* castedThisObj = static_cast<JSWebSocket*>(asObject(thisValue));
+ return castedThisObj->addEventListener(exec, args);
+}
+
+JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionRemoveEventListener(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSWebSocket::s_info))
+ return throwError(exec, TypeError);
+ JSWebSocket* castedThisObj = static_cast<JSWebSocket*>(asObject(thisValue));
+ return castedThisObj->removeEventListener(exec, args);
+}
+
+JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionDispatchEvent(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args)
+{
+ UNUSED_PARAM(args);
+ if (!thisValue.inherits(&JSWebSocket::s_info))
+ return throwError(exec, TypeError);
+ JSWebSocket* castedThisObj = static_cast<JSWebSocket*>(asObject(thisValue));
+ WebSocket* imp = static_cast<WebSocket*>(castedThisObj->impl());
+ ExceptionCode ec = 0;
+ Event* evt = toEvent(args.at(0));
+
+
+ JSC::JSValue result = jsBoolean(imp->dispatchEvent(evt, ec));
+ setDOMException(exec, ec);
+ return result;
+}
+
// Constant getters
JSValue jsWebSocketCONNECTING(ExecState* exec, const Identifier&, const PropertySlot&)
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWebSocket.h b/src/3rdparty/webkit/WebCore/generated/JSWebSocket.h
index 0632872..9428212 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWebSocket.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWebSocket.h
@@ -46,7 +46,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -54,10 +54,14 @@ public:
// Custom functions
JSC::JSValue send(JSC::ExecState*, const JSC::ArgList&);
+ JSC::JSValue addEventListener(JSC::ExecState*, const JSC::ArgList&);
+ JSC::JSValue removeEventListener(JSC::ExecState*, const JSC::ArgList&);
WebSocket* impl() const { return m_impl.get(); }
private:
RefPtr<WebSocket> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, WebSocket*);
@@ -73,15 +77,20 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWebSocketPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
JSC::JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionSend(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
JSC::JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionClose(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionAddEventListener(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionRemoveEventListener(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
+JSC::JSValue JSC_HOST_CALL jsWebSocketPrototypeFunctionDispatchEvent(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&);
// Attributes
JSC::JSValue jsWebSocketURL(JSC::ExecState*, const JSC::Identifier&, const JSC::PropertySlot&);
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp
index e60e32c..589f570 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.cpp
@@ -89,8 +89,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWheelEventConstructor::s_info = { "WheelEventConstructor", 0, &JSWheelEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h b/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h
index ae8aa6a..6901d93 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWheelEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSWheelEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWorker.h b/src/3rdparty/webkit/WebCore/generated/JSWorker.h
index 3aa7221..28f2e38 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWorker.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWorker.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
@@ -53,6 +53,8 @@ public:
{
return static_cast<Worker*>(Base::impl());
}
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Worker*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWorkerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h b/src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h
index 37d6c87..f44ba01 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWorkerContext.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -61,6 +61,8 @@ public:
JSC::JSValue setInterval(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue addEventListener(JSC::ExecState*, const JSC::ArgList&);
JSC::JSValue removeEventListener(JSC::ExecState*, const JSC::ArgList&);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -74,9 +76,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWorkerContextPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp b/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp
index 7b634ae..e24d0d6 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.cpp
@@ -87,8 +87,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSWorkerLocationConstructor::s_info = { "WorkerLocationConstructor", 0, &JSWorkerLocationConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h b/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h
index 0002c4c..e7d8062 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWorkerLocation.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<WorkerLocation> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, WorkerLocation*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSWorkerLocationPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h b/src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h
index 92e0094..f459679 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSWorkerNavigator.h
@@ -45,13 +45,15 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
WorkerNavigator* impl() const { return m_impl.get(); }
private:
RefPtr<WorkerNavigator> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, WorkerNavigator*);
@@ -63,7 +65,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSWorkerNavigatorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h
index 0582f1e..5c05753 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequest.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -65,6 +65,8 @@ public:
private:
RefPtr<XMLHttpRequest> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XMLHttpRequest*);
@@ -80,9 +82,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXMLHttpRequestPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp
index 45908b3..30e0d72 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.cpp
@@ -82,8 +82,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXMLHttpRequestExceptionConstructor::s_info = { "XMLHttpRequestExceptionConstructor", 0, &JSXMLHttpRequestExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h
index f04fdf5..54dcfde 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestException.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<XMLHttpRequestException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XMLHttpRequestException*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXMLHttpRequestExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp
index 4baf3f1..6343a1b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.cpp
@@ -76,8 +76,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXMLHttpRequestProgressEventConstructor::s_info = { "XMLHttpRequestProgressEventConstructor", 0, &JSXMLHttpRequestProgressEventConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h
index f12a906..6486dd7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestProgressEvent.h
@@ -39,10 +39,12 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
@@ -52,7 +54,13 @@ public:
static JSC::JSObject* self(JSC::ExecState*, JSC::JSGlobalObject*);
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
JSXMLHttpRequestProgressEventPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
// Attributes
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp
index 8c44709..bc5fff9 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXMLHttpRequestUploadConstructor::s_info = { "XMLHttpRequestUploadConstructor", 0, &JSXMLHttpRequestUploadConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h
index fdf98ac..a613e6d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLHttpRequestUpload.h
@@ -44,7 +44,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
virtual void markChildren(JSC::MarkStack&);
@@ -58,6 +58,8 @@ public:
private:
RefPtr<XMLHttpRequestUpload> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XMLHttpRequestUpload*);
@@ -73,9 +75,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXMLHttpRequestUploadPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesMarkChildren | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp b/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp
index 1dcfc94..e6cdd6b 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.cpp
@@ -77,8 +77,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
static JSObject* constructXMLSerializer(ExecState* exec, JSObject* constructor, const ArgList&)
{
return asObject(toJS(exec, static_cast<JSXMLSerializerConstructor*>(constructor)->globalObject(), XMLSerializer::create()));
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h b/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h
index e8b08c8..fd50d5d 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXMLSerializer.h
@@ -43,7 +43,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -51,6 +51,8 @@ public:
private:
RefPtr<XMLSerializer> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XMLSerializer*);
@@ -66,9 +68,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXMLSerializerPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp b/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp
index 4ce95ca..e25be26 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.cpp
@@ -86,8 +86,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
static JSObject* constructXPathEvaluator(ExecState* exec, JSObject* constructor, const ArgList&)
{
return asObject(toJS(exec, static_cast<JSXPathEvaluatorConstructor*>(constructor)->globalObject(), XPathEvaluator::create()));
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h b/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h
index 997f066..9b37465 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathEvaluator.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<XPathEvaluator> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XPathEvaluator*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXPathEvaluatorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp b/src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp
index 7911fad..3894ac2 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathException.cpp
@@ -85,8 +85,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXPathExceptionConstructor::s_info = { "XPathExceptionConstructor", 0, &JSXPathExceptionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathException.h b/src/3rdparty/webkit/WebCore/generated/JSXPathException.h
index a33d9a1..f73ba88 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathException.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathException.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<XPathException> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XPathException*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXPathExceptionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp b/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp
index d5531e5..9464146 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.cpp
@@ -80,8 +80,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXPathExpressionConstructor::s_info = { "XPathExpressionConstructor", 0, &JSXPathExpressionConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h b/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h
index a3b2bd1..f5fd0dc 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathExpression.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<XPathExpression> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XPathExpression*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXPathExpressionPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h b/src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h
index 3e28973..86ce543 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathNSResolver.h
@@ -41,10 +41,17 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
XPathNSResolver* impl() const { return m_impl.get(); }
private:
RefPtr<XPathNSResolver> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XPathNSResolver*);
@@ -60,9 +67,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXPathNSResolverPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp b/src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp
index 82387c6..337f473 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathResult.cpp
@@ -99,8 +99,11 @@ public:
static PassRefPtr<Structure> createStructure(JSValue proto)
{
- return Structure::create(proto, TypeInfo(ObjectType, ImplementsHasInstance));
+ return Structure::create(proto, TypeInfo(ObjectType, StructureFlags));
}
+
+protected:
+ static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | DOMConstructorObject::StructureFlags;
};
const ClassInfo JSXPathResultConstructor::s_info = { "XPathResultConstructor", 0, &JSXPathResultConstructorTable, 0 };
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXPathResult.h b/src/3rdparty/webkit/WebCore/generated/JSXPathResult.h
index 4c5a467..a8db49e 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXPathResult.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXPathResult.h
@@ -45,7 +45,7 @@ public:
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
static JSC::JSValue getConstructor(JSC::ExecState*, JSC::JSGlobalObject*);
@@ -53,6 +53,8 @@ public:
private:
RefPtr<XPathResult> m_impl;
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XPathResult*);
@@ -68,9 +70,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXPathResultPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h b/src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h
index b9c061c..821dca7 100644
--- a/src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h
+++ b/src/3rdparty/webkit/WebCore/generated/JSXSLTProcessor.h
@@ -41,6 +41,11 @@ public:
virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
static const JSC::ClassInfo s_info;
+ static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
+ }
+
// Custom functions
JSC::JSValue importStylesheet(JSC::ExecState*, const JSC::ArgList&);
@@ -53,6 +58,8 @@ public:
private:
RefPtr<XSLTProcessor> m_impl;
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
};
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, XSLTProcessor*);
@@ -68,9 +75,11 @@ public:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
static PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
{
- return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::HasDefaultMark));
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
}
JSXSLTProcessorPrototype(NonNullPassRefPtr<JSC::Structure> structure) : JSC::JSObject(structure) { }
+protected:
+ static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
};
// Functions
diff --git a/src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h b/src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h
index bbbd75e..2d411d2 100644
--- a/src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h
+++ b/src/3rdparty/webkit/WebCore/generated/StringPrototype.lut.h
@@ -4,7 +4,7 @@
namespace JSC {
-static const struct HashTableValue stringTableValues[33] = {
+static const struct HashTableValue stringTableValues[36] = {
{ "toString", DontEnum|Function, (intptr_t)stringProtoFuncToString, (intptr_t)0 },
{ "valueOf", DontEnum|Function, (intptr_t)stringProtoFuncToString, (intptr_t)0 },
{ "charAt", DontEnum|Function, (intptr_t)stringProtoFuncCharAt, (intptr_t)1 },
@@ -37,9 +37,12 @@ static const struct HashTableValue stringTableValues[33] = {
{ "fontsize", DontEnum|Function, (intptr_t)stringProtoFuncFontsize, (intptr_t)1 },
{ "anchor", DontEnum|Function, (intptr_t)stringProtoFuncAnchor, (intptr_t)1 },
{ "link", DontEnum|Function, (intptr_t)stringProtoFuncLink, (intptr_t)1 },
+ { "trim", DontEnum|Function, (intptr_t)stringProtoFuncTrim, (intptr_t)0 },
+ { "trimLeft", DontEnum|Function, (intptr_t)stringProtoFuncTrimLeft, (intptr_t)0 },
+ { "trimRight", DontEnum|Function, (intptr_t)stringProtoFuncTrimRight, (intptr_t)0 },
{ 0, 0, 0, 0 }
};
extern JSC_CONST_HASHTABLE HashTable stringTable =
- { 71, 63, stringTableValues, 0 };
+ { 133, 127, stringTableValues, 0 };
} // namespace
diff --git a/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h b/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h
index 6f0af23..d7f1f85 100644
--- a/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h
+++ b/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheets.h
@@ -1,8 +1,9 @@
namespace WebCore {
-extern const char htmlUserAgentStyleSheet[8636];
+extern const char htmlUserAgentStyleSheet[8729];
extern const char quirksUserAgentStyleSheet[359];
extern const char svgUserAgentStyleSheet[358];
extern const char sourceUserAgentStyleSheet[2004];
extern const char wmlUserAgentStyleSheet[3039];
extern const char mediaControlsUserAgentStyleSheet[2582];
+extern const char mediaControlsQtUserAgentStyleSheet[2249];
}
diff --git a/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp b/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp
index 8b8d7f3..7a18470 100644
--- a/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp
+++ b/src/3rdparty/webkit/WebCore/generated/UserAgentStyleSheetsData.cpp
@@ -1,5 +1,5 @@
namespace WebCore {
-extern const char htmlUserAgentStyleSheet[8636] = {
+extern const char htmlUserAgentStyleSheet[8729] = {
110, 97, 109, 101, 115, 112, 97, 99, 101, 32, 34, 104, 116, 116, 112, 58,
47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57,
57, 47, 120, 104, 116, 109, 108, 34, 59, 32, 104, 116, 109, 108, 32, 123,
@@ -244,302 +244,308 @@ extern const char htmlUserAgentStyleSheet[8636] = {
101, 97, 114, 97, 110, 99, 101, 58, 32, 115, 101, 97, 114, 99, 104, 102,
105, 101, 108, 100, 45, 114, 101, 115, 117, 108, 116, 115, 45, 98, 117, 116,
116, 111, 110, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 105, 110,
- 108, 105, 110, 101, 45, 98, 108, 111, 99, 107, 59, 32, 125, 32, 116, 101,
- 120, 116, 97, 114, 101, 97, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116,
- 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 116, 101, 120,
- 116, 97, 114, 101, 97, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110,
- 100, 45, 99, 111, 108, 111, 114, 58, 32, 119, 104, 105, 116, 101, 59, 32,
- 98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105,
- 100, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108, 45, 111,
- 114, 100, 101, 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99, 97, 108,
- 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 117, 115, 101, 114, 45, 115,
- 101, 108, 101, 99, 116, 58, 32, 116, 101, 120, 116, 59, 32, 45, 119, 101,
- 98, 107, 105, 116, 45, 98, 111, 120, 45, 111, 114, 105, 101, 110, 116, 58,
- 32, 118, 101, 114, 116, 105, 99, 97, 108, 59, 32, 114, 101, 115, 105, 122,
- 101, 58, 32, 97, 117, 116, 111, 59, 32, 99, 117, 114, 115, 111, 114, 58,
- 32, 97, 117, 116, 111, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32,
- 50, 112, 120, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101,
- 58, 32, 112, 114, 101, 45, 119, 114, 97, 112, 59, 32, 119, 111, 114, 100,
- 45, 119, 114, 97, 112, 58, 32, 98, 114, 101, 97, 107, 45, 119, 111, 114,
- 100, 59, 32, 125, 32, 105, 110, 112, 117, 116, 58, 58, 45, 119, 101, 98,
- 107, 105, 116, 45, 105, 110, 112, 117, 116, 45, 112, 108, 97, 99, 101, 104,
- 111, 108, 100, 101, 114, 44, 32, 105, 115, 105, 110, 100, 101, 120, 58, 58,
- 45, 119, 101, 98, 107, 105, 116, 45, 105, 110, 112, 117, 116, 45, 112, 108,
- 97, 99, 101, 104, 111, 108, 100, 101, 114, 44, 32, 116, 101, 120, 116, 97,
- 114, 101, 97, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 105, 110, 112,
- 117, 116, 45, 112, 108, 97, 99, 101, 104, 111, 108, 100, 101, 114, 32, 123,
- 32, 99, 111, 108, 111, 114, 58, 32, 100, 97, 114, 107, 71, 114, 97, 121,
- 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34,
- 112, 97, 115, 115, 119, 111, 114, 100, 34, 93, 32, 123, 32, 45, 119, 101,
- 98, 107, 105, 116, 45, 116, 101, 120, 116, 45, 115, 101, 99, 117, 114, 105,
- 116, 121, 58, 32, 100, 105, 115, 99, 32, 33, 105, 109, 112, 111, 114, 116,
- 97, 110, 116, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
- 101, 61, 34, 104, 105, 100, 100, 101, 110, 34, 93, 44, 32, 105, 110, 112,
- 117, 116, 91, 116, 121, 112, 101, 61, 34, 105, 109, 97, 103, 101, 34, 93,
- 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105,
- 108, 101, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
- 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 105, 110, 105, 116, 105,
- 97, 108, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 105, 110, 105,
- 116, 105, 97, 108, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100,
- 45, 99, 111, 108, 111, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59,
- 32, 98, 111, 114, 100, 101, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108,
+ 108, 105, 110, 101, 45, 98, 108, 111, 99, 107, 59, 32, 125, 32, 105, 110,
+ 112, 117, 116, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 105, 110, 112,
+ 117, 116, 45, 108, 105, 115, 116, 45, 98, 117, 116, 116, 111, 110, 32, 123,
+ 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101, 97, 114, 97,
+ 110, 99, 101, 58, 32, 108, 105, 115, 116, 45, 98, 117, 116, 116, 111, 110,
+ 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 105, 110, 108, 105, 110,
+ 101, 45, 98, 108, 111, 99, 107, 59, 32, 125, 32, 116, 101, 120, 116, 97,
+ 114, 101, 97, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112,
+ 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 116, 101, 120, 116, 97, 114,
+ 101, 97, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99,
+ 111, 108, 111, 114, 58, 32, 119, 104, 105, 116, 101, 59, 32, 98, 111, 114,
+ 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, 59, 32,
+ 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108, 45, 111, 114, 100, 101,
+ 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99, 97, 108, 59, 32, 45,
+ 119, 101, 98, 107, 105, 116, 45, 117, 115, 101, 114, 45, 115, 101, 108, 101,
+ 99, 116, 58, 32, 116, 101, 120, 116, 59, 32, 45, 119, 101, 98, 107, 105,
+ 116, 45, 98, 111, 120, 45, 111, 114, 105, 101, 110, 116, 58, 32, 118, 101,
+ 114, 116, 105, 99, 97, 108, 59, 32, 114, 101, 115, 105, 122, 101, 58, 32,
+ 97, 117, 116, 111, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 97, 117,
+ 116, 111, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 50, 112, 120,
+ 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32, 112,
+ 114, 101, 45, 119, 114, 97, 112, 59, 32, 119, 111, 114, 100, 45, 119, 114,
+ 97, 112, 58, 32, 98, 114, 101, 97, 107, 45, 119, 111, 114, 100, 59, 32,
+ 125, 32, 105, 110, 112, 117, 116, 58, 58, 45, 119, 101, 98, 107, 105, 116,
+ 45, 105, 110, 112, 117, 116, 45, 112, 108, 97, 99, 101, 104, 111, 108, 100,
+ 101, 114, 44, 32, 105, 115, 105, 110, 100, 101, 120, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 105, 110, 112, 117, 116, 45, 112, 108, 97, 99, 101,
+ 104, 111, 108, 100, 101, 114, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97,
+ 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 105, 110, 112, 117, 116, 45,
+ 112, 108, 97, 99, 101, 104, 111, 108, 100, 101, 114, 32, 123, 32, 99, 111,
+ 108, 111, 114, 58, 32, 100, 97, 114, 107, 71, 114, 97, 121, 59, 32, 125,
+ 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 112, 97, 115,
+ 115, 119, 111, 114, 100, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105,
+ 116, 45, 116, 101, 120, 116, 45, 115, 101, 99, 117, 114, 105, 116, 121, 58,
+ 32, 100, 105, 115, 99, 32, 33, 105, 109, 112, 111, 114, 116, 97, 110, 116,
59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34,
- 102, 105, 108, 101, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116,
- 45, 98, 111, 120, 45, 97, 108, 105, 103, 110, 58, 32, 98, 97, 115, 101,
- 108, 105, 110, 101, 59, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110,
- 58, 32, 115, 116, 97, 114, 116, 32, 33, 105, 109, 112, 111, 114, 116, 97,
- 110, 116, 59, 32, 125, 32, 105, 110, 112, 117, 116, 58, 45, 119, 101, 98,
- 107, 105, 116, 45, 97, 117, 116, 111, 102, 105, 108, 108, 32, 123, 32, 98,
+ 104, 105, 100, 100, 101, 110, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91,
+ 116, 121, 112, 101, 61, 34, 105, 109, 97, 103, 101, 34, 93, 44, 32, 105,
+ 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105, 108, 101, 34,
+ 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101,
+ 97, 114, 97, 110, 99, 101, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59,
+ 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 105, 110, 105, 116, 105, 97,
+ 108, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111,
+ 108, 111, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 98, 111,
+ 114, 100, 101, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 125,
+ 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105, 108,
+ 101, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111,
+ 120, 45, 97, 108, 105, 103, 110, 58, 32, 98, 97, 115, 101, 108, 105, 110,
+ 101, 59, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 115,
+ 116, 97, 114, 116, 32, 33, 105, 109, 112, 111, 114, 116, 97, 110, 116, 59,
+ 32, 125, 32, 105, 110, 112, 117, 116, 58, 45, 119, 101, 98, 107, 105, 116,
+ 45, 97, 117, 116, 111, 102, 105, 108, 108, 32, 123, 32, 98, 97, 99, 107,
+ 103, 114, 111, 117, 110, 100, 45, 99, 111, 108, 111, 114, 58, 32, 98, 97,
+ 99, 107, 103, 114, 111, 117, 110, 100, 45, 105, 109, 97, 103, 101, 58, 110,
+ 111, 110, 101, 32, 33, 105, 109, 112, 111, 114, 116, 97, 110, 116, 59, 32,
+ 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 97,
+ 100, 105, 111, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
+ 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 93, 32, 123, 32,
+ 109, 97, 114, 103, 105, 110, 58, 32, 51, 112, 120, 32, 48, 46, 53, 101,
+ 120, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 105, 110, 105, 116,
+ 105, 97, 108, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45,
+ 99, 111, 108, 111, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32,
+ 98, 111, 114, 100, 101, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59,
+ 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 98,
+ 117, 116, 116, 111, 110, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116,
+ 121, 112, 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 44, 32, 105,
+ 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 101, 115, 101, 116,
+ 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34,
+ 102, 105, 108, 101, 34, 93, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45,
+ 102, 105, 108, 101, 45, 117, 112, 108, 111, 97, 100, 45, 98, 117, 116, 116,
+ 111, 110, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112,
+ 101, 97, 114, 97, 110, 99, 101, 58, 32, 112, 117, 115, 104, 45, 98, 117,
+ 116, 116, 111, 110, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99,
+ 101, 58, 32, 112, 114, 101, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116,
+ 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 44, 32, 105,
+ 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 115, 117, 98, 109, 105,
+ 116, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61,
+ 34, 114, 101, 115, 101, 116, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91,
+ 116, 121, 112, 101, 61, 34, 102, 105, 108, 101, 34, 93, 58, 58, 45, 119,
+ 101, 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108, 111, 97,
+ 100, 45, 98, 117, 116, 116, 111, 110, 44, 32, 98, 117, 116, 116, 111, 110,
+ 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 97,
+ 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 32, 116, 101,
+ 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114,
+ 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 100, 101, 102, 97, 117, 108,
+ 116, 59, 32, 99, 111, 108, 111, 114, 58, 32, 66, 117, 116, 116, 111, 110,
+ 84, 101, 120, 116, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 50,
+ 112, 120, 32, 54, 112, 120, 32, 51, 112, 120, 32, 54, 112, 120, 59, 32,
+ 98, 111, 114, 100, 101, 114, 58, 32, 50, 112, 120, 32, 111, 117, 116, 115,
+ 101, 116, 32, 66, 117, 116, 116, 111, 110, 70, 97, 99, 101, 59, 32, 98,
97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108, 111, 114, 58,
- 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 105, 109, 97, 103,
- 101, 58, 110, 111, 110, 101, 32, 33, 105, 109, 112, 111, 114, 116, 97, 110,
- 116, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61,
- 34, 114, 97, 100, 105, 111, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91,
- 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 93,
- 32, 123, 32, 109, 97, 114, 103, 105, 110, 58, 32, 51, 112, 120, 32, 48,
- 46, 53, 101, 120, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 105,
- 110, 105, 116, 105, 97, 108, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117,
- 110, 100, 45, 99, 111, 108, 111, 114, 58, 32, 105, 110, 105, 116, 105, 97,
- 108, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 105, 110, 105, 116, 105,
- 97, 108, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
- 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 44, 32, 105, 110, 112, 117,
- 116, 91, 116, 121, 112, 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93,
- 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 101,
- 115, 101, 116, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
- 101, 61, 34, 102, 105, 108, 101, 34, 93, 58, 58, 45, 119, 101, 98, 107,
- 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108, 111, 97, 100, 45, 98,
- 117, 116, 116, 111, 110, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45,
- 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 112, 117, 115, 104,
- 45, 98, 117, 116, 116, 111, 110, 59, 32, 119, 104, 105, 116, 101, 45, 115,
- 112, 97, 99, 101, 58, 32, 112, 114, 101, 32, 125, 32, 105, 110, 112, 117,
+ 32, 66, 117, 116, 116, 111, 110, 70, 97, 99, 101, 59, 32, 45, 119, 101,
+ 98, 107, 105, 116, 45, 98, 111, 120, 45, 115, 105, 122, 105, 110, 103, 58,
+ 32, 98, 111, 114, 100, 101, 114, 45, 98, 111, 120, 32, 125, 32, 105, 110,
+ 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 97, 110, 103, 101, 34,
+ 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101,
+ 97, 114, 97, 110, 99, 101, 58, 32, 115, 108, 105, 100, 101, 114, 45, 104,
+ 111, 114, 105, 122, 111, 110, 116, 97, 108, 59, 32, 112, 97, 100, 100, 105,
+ 110, 103, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 98, 111, 114,
+ 100, 101, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 109, 97,
+ 114, 103, 105, 110, 58, 32, 50, 112, 120, 59, 32, 125, 32, 105, 110, 112,
+ 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 97, 110, 103, 101, 34, 93,
+ 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 115, 108, 105, 100, 101, 114,
+ 45, 116, 104, 117, 109, 98, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116,
+ 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 115, 108, 105,
+ 100, 101, 114, 116, 104, 117, 109, 98, 45, 104, 111, 114, 105, 122, 111, 110,
+ 116, 97, 108, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
+ 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 58, 100, 105, 115, 97,
+ 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
+ 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 100, 105, 115, 97, 98,
+ 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61,
+ 34, 114, 101, 115, 101, 116, 34, 93, 58, 100, 105, 115, 97, 98, 108, 101,
+ 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102,
+ 105, 108, 101, 34, 93, 58, 100, 105, 115, 97, 98, 108, 101, 100, 58, 58,
+ 45, 119, 101, 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108,
+ 111, 97, 100, 45, 98, 117, 116, 116, 111, 110, 44, 32, 98, 117, 116, 116,
+ 111, 110, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32, 115, 101, 108,
+ 101, 99, 116, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32, 107, 101,
+ 121, 103, 101, 110, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32, 111,
+ 112, 116, 103, 114, 111, 117, 112, 58, 100, 105, 115, 97, 98, 108, 101, 100,
+ 44, 32, 111, 112, 116, 105, 111, 110, 58, 100, 105, 115, 97, 98, 108, 101,
+ 100, 44, 32, 100, 97, 116, 97, 103, 114, 105, 100, 58, 100, 105, 115, 97,
+ 98, 108, 101, 100, 32, 123, 32, 99, 111, 108, 111, 114, 58, 32, 71, 114,
+ 97, 121, 84, 101, 120, 116, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116,
+ 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 58, 97, 99,
+ 116, 105, 118, 101, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
+ 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 97, 99, 116, 105, 118,
+ 101, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114,
+ 101, 115, 101, 116, 34, 93, 58, 97, 99, 116, 105, 118, 101, 44, 32, 105,
+ 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105, 108, 101, 34,
+ 93, 58, 97, 99, 116, 105, 118, 101, 58, 58, 45, 119, 101, 98, 107, 105,
+ 116, 45, 102, 105, 108, 101, 45, 117, 112, 108, 111, 97, 100, 45, 98, 117,
+ 116, 116, 111, 110, 44, 32, 98, 117, 116, 116, 111, 110, 58, 97, 99, 116,
+ 105, 118, 101, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45, 115, 116, 121,
+ 108, 101, 58, 32, 105, 110, 115, 101, 116, 32, 125, 32, 105, 110, 112, 117,
116, 91, 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93,
+ 58, 97, 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98, 108, 101, 100,
44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 115, 117,
- 98, 109, 105, 116, 34, 93, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121,
- 112, 101, 61, 34, 114, 101, 115, 101, 116, 34, 93, 44, 32, 105, 110, 112,
+ 98, 109, 105, 116, 34, 93, 58, 97, 99, 116, 105, 118, 101, 58, 100, 105,
+ 115, 97, 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121,
+ 112, 101, 61, 34, 114, 101, 115, 101, 116, 34, 93, 58, 97, 99, 116, 105,
+ 118, 101, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32, 105, 110, 112,
117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105, 108, 101, 34, 93, 58,
+ 97, 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98, 108, 101, 100, 58,
58, 45, 119, 101, 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112,
108, 111, 97, 100, 45, 98, 117, 116, 116, 111, 110, 44, 32, 98, 117, 116,
- 116, 111, 110, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111,
- 120, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59,
- 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110,
- 116, 101, 114, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 100, 101, 102,
- 97, 117, 108, 116, 59, 32, 99, 111, 108, 111, 114, 58, 32, 66, 117, 116,
- 116, 111, 110, 84, 101, 120, 116, 59, 32, 112, 97, 100, 100, 105, 110, 103,
- 58, 32, 50, 112, 120, 32, 54, 112, 120, 32, 51, 112, 120, 32, 54, 112,
- 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 50, 112, 120, 32, 111,
- 117, 116, 115, 101, 116, 32, 66, 117, 116, 116, 111, 110, 70, 97, 99, 101,
- 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108,
- 111, 114, 58, 32, 66, 117, 116, 116, 111, 110, 70, 97, 99, 101, 59, 32,
- 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 115, 105, 122, 105,
- 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, 111, 120, 32, 125,
- 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 97, 110,
- 103, 101, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
- 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 115, 108, 105, 100, 101,
- 114, 45, 104, 111, 114, 105, 122, 111, 110, 116, 97, 108, 59, 32, 112, 97,
- 100, 100, 105, 110, 103, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32,
- 98, 111, 114, 100, 101, 114, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59,
- 32, 109, 97, 114, 103, 105, 110, 58, 32, 50, 112, 120, 59, 32, 125, 32,
- 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 97, 110, 103,
- 101, 34, 93, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 115, 108, 105,
- 100, 101, 114, 45, 116, 104, 117, 109, 98, 32, 123, 32, 45, 119, 101, 98,
- 107, 105, 116, 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32,
- 115, 108, 105, 100, 101, 114, 116, 104, 117, 109, 98, 45, 104, 111, 114, 105,
- 122, 111, 110, 116, 97, 108, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91,
- 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 58, 100,
- 105, 115, 97, 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116,
- 121, 112, 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 100, 105,
- 115, 97, 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121,
- 112, 101, 61, 34, 114, 101, 115, 101, 116, 34, 93, 58, 100, 105, 115, 97,
- 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
- 61, 34, 102, 105, 108, 101, 34, 93, 58, 100, 105, 115, 97, 98, 108, 101,
- 100, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 102, 105, 108, 101, 45,
- 117, 112, 108, 111, 97, 100, 45, 98, 117, 116, 116, 111, 110, 44, 32, 98,
- 117, 116, 116, 111, 110, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32,
- 115, 101, 108, 101, 99, 116, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44,
- 32, 107, 101, 121, 103, 101, 110, 58, 100, 105, 115, 97, 98, 108, 101, 100,
- 44, 32, 111, 112, 116, 103, 114, 111, 117, 112, 58, 100, 105, 115, 97, 98,
- 108, 101, 100, 44, 32, 111, 112, 116, 105, 111, 110, 58, 100, 105, 115, 97,
- 98, 108, 101, 100, 44, 32, 100, 97, 116, 97, 103, 114, 105, 100, 58, 100,
- 105, 115, 97, 98, 108, 101, 100, 32, 123, 32, 99, 111, 108, 111, 114, 58,
- 32, 71, 114, 97, 121, 84, 101, 120, 116, 32, 125, 32, 105, 110, 112, 117,
- 116, 91, 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93,
- 58, 97, 99, 116, 105, 118, 101, 44, 32, 105, 110, 112, 117, 116, 91, 116,
- 121, 112, 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 97, 99,
- 116, 105, 118, 101, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
- 61, 34, 114, 101, 115, 101, 116, 34, 93, 58, 97, 99, 116, 105, 118, 101,
- 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105,
- 108, 101, 34, 93, 58, 97, 99, 116, 105, 118, 101, 58, 58, 45, 119, 101,
- 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108, 111, 97, 100,
- 45, 98, 117, 116, 116, 111, 110, 44, 32, 98, 117, 116, 116, 111, 110, 58,
- 97, 99, 116, 105, 118, 101, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45,
- 115, 116, 121, 108, 101, 58, 32, 105, 110, 115, 101, 116, 32, 125, 32, 105,
- 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111,
- 110, 34, 93, 58, 97, 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98,
- 108, 101, 100, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61,
- 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 97, 99, 116, 105, 118, 101,
- 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32, 105, 110, 112, 117, 116,
- 91, 116, 121, 112, 101, 61, 34, 114, 101, 115, 101, 116, 34, 93, 58, 97,
- 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98, 108, 101, 100, 44, 32,
- 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102, 105, 108, 101,
- 34, 93, 58, 97, 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98, 108,
- 101, 100, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 102, 105, 108, 101,
- 45, 117, 112, 108, 111, 97, 100, 45, 98, 117, 116, 116, 111, 110, 44, 32,
- 98, 117, 116, 116, 111, 110, 58, 97, 99, 116, 105, 118, 101, 58, 100, 105,
- 115, 97, 98, 108, 101, 100, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45,
- 115, 116, 121, 108, 101, 58, 32, 111, 117, 116, 115, 101, 116, 32, 125, 32,
- 97, 114, 101, 97, 44, 32, 112, 97, 114, 97, 109, 32, 123, 32, 100, 105,
- 115, 112, 108, 97, 121, 58, 32, 110, 111, 110, 101, 32, 125, 32, 105, 110,
- 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98,
- 111, 120, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
- 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 99, 104, 101, 99, 107,
- 98, 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120,
+ 116, 111, 110, 58, 97, 99, 116, 105, 118, 101, 58, 100, 105, 115, 97, 98,
+ 108, 101, 100, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45, 115, 116, 121,
+ 108, 101, 58, 32, 111, 117, 116, 115, 101, 116, 32, 125, 32, 97, 114, 101,
+ 97, 44, 32, 112, 97, 114, 97, 109, 32, 123, 32, 100, 105, 115, 112, 108,
+ 97, 121, 58, 32, 110, 111, 110, 101, 32, 125, 32, 105, 110, 112, 117, 116,
+ 91, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34,
+ 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101,
+ 97, 114, 97, 110, 99, 101, 58, 32, 99, 104, 101, 99, 107, 98, 111, 120,
+ 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 115, 105,
+ 122, 105, 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, 111, 120,
+ 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34,
+ 114, 97, 100, 105, 111, 34, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105,
+ 116, 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 114, 97,
+ 100, 105, 111, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120,
45, 115, 105, 122, 105, 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45,
- 98, 111, 120, 59, 32, 125, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
- 101, 61, 34, 114, 97, 100, 105, 111, 34, 93, 32, 123, 32, 45, 119, 101,
- 98, 107, 105, 116, 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58,
- 32, 114, 97, 100, 105, 111, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45,
- 98, 111, 120, 45, 115, 105, 122, 105, 110, 103, 58, 32, 98, 111, 114, 100,
- 101, 114, 45, 98, 111, 120, 59, 32, 125, 32, 107, 101, 121, 103, 101, 110,
- 44, 32, 115, 101, 108, 101, 99, 116, 32, 123, 32, 45, 119, 101, 98, 107,
- 105, 116, 45, 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 109,
- 101, 110, 117, 108, 105, 115, 116, 59, 32, 45, 119, 101, 98, 107, 105, 116,
- 45, 98, 111, 120, 45, 115, 105, 122, 105, 110, 103, 58, 32, 98, 111, 114,
- 100, 101, 114, 45, 98, 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116,
- 45, 98, 111, 120, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116,
- 101, 114, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32,
- 115, 111, 108, 105, 100, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98,
- 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 53, 112,
- 120, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32,
- 112, 114, 101, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108,
- 45, 111, 114, 100, 101, 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99,
- 97, 108, 59, 32, 99, 111, 108, 111, 114, 58, 32, 98, 108, 97, 99, 107,
- 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108,
- 111, 114, 58, 32, 119, 104, 105, 116, 101, 59, 32, 99, 117, 114, 115, 111,
- 114, 58, 32, 100, 101, 102, 97, 117, 108, 116, 59, 32, 125, 32, 115, 101,
- 108, 101, 99, 116, 91, 115, 105, 122, 101, 93, 44, 32, 115, 101, 108, 101,
- 99, 116, 91, 109, 117, 108, 116, 105, 112, 108, 101, 93, 44, 32, 115, 101,
- 108, 101, 99, 116, 91, 115, 105, 122, 101, 93, 91, 109, 117, 108, 116, 105,
- 112, 108, 101, 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
- 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 108, 105, 115, 116, 98,
- 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45,
- 97, 108, 105, 103, 110, 58, 32, 115, 116, 97, 114, 116, 59, 32, 98, 111,
- 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 105, 110, 115, 101, 116, 32,
- 103, 114, 97, 121, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111,
- 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 105, 110, 105,
- 116, 105, 97, 108, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99,
- 101, 58, 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 125, 32, 115, 101,
- 108, 101, 99, 116, 91, 115, 105, 122, 101, 61, 34, 48, 34, 93, 44, 32,
- 115, 101, 108, 101, 99, 116, 91, 115, 105, 122, 101, 61, 34, 49, 34, 93,
- 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101, 97,
- 114, 97, 110, 99, 101, 58, 32, 109, 101, 110, 117, 108, 105, 115, 116, 59,
+ 98, 111, 120, 59, 32, 125, 32, 107, 101, 121, 103, 101, 110, 44, 32, 115,
+ 101, 108, 101, 99, 116, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45,
+ 97, 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 109, 101, 110, 117,
+ 108, 105, 115, 116, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111,
+ 120, 45, 115, 105, 122, 105, 110, 103, 58, 32, 98, 111, 114, 100, 101, 114,
+ 45, 98, 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111,
+ 120, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59,
+ 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108,
+ 105, 100, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 114, 100,
+ 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 53, 112, 120, 59, 32,
+ 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32, 112, 114, 101,
+ 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108, 45, 111, 114,
+ 100, 101, 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99, 97, 108, 59,
+ 32, 99, 111, 108, 111, 114, 58, 32, 98, 108, 97, 99, 107, 59, 32, 98,
+ 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108, 111, 114, 58,
+ 32, 119, 104, 105, 116, 101, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32,
+ 100, 101, 102, 97, 117, 108, 116, 59, 32, 125, 32, 115, 101, 108, 101, 99,
+ 116, 91, 115, 105, 122, 101, 93, 44, 32, 115, 101, 108, 101, 99, 116, 91,
+ 109, 117, 108, 116, 105, 112, 108, 101, 93, 44, 32, 115, 101, 108, 101, 99,
+ 116, 91, 115, 105, 122, 101, 93, 91, 109, 117, 108, 116, 105, 112, 108, 101,
+ 93, 32, 123, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101,
+ 97, 114, 97, 110, 99, 101, 58, 32, 108, 105, 115, 116, 98, 111, 120, 59,
32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 97, 108, 105,
- 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 32, 98, 111, 114, 100,
- 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, 59, 32, 45,
- 119, 101, 98, 107, 105, 116, 45, 98, 111, 114, 100, 101, 114, 45, 114, 97,
- 100, 105, 117, 115, 58, 32, 53, 112, 120, 59, 32, 119, 104, 105, 116, 101,
- 45, 115, 112, 97, 99, 101, 58, 32, 112, 114, 101, 59, 32, 125, 32, 100,
- 97, 116, 97, 108, 105, 115, 116, 32, 123, 32, 100, 105, 115, 112, 108, 97,
- 121, 58, 32, 110, 111, 110, 101, 59, 32, 125, 32, 111, 112, 116, 103, 114,
- 111, 117, 112, 32, 123, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104,
- 116, 58, 32, 98, 111, 108, 100, 101, 114, 59, 32, 125, 32, 111, 112, 116,
- 105, 111, 110, 32, 123, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104,
- 116, 58, 32, 110, 111, 114, 109, 97, 108, 59, 32, 125, 32, 100, 97, 116,
- 97, 103, 114, 105, 100, 32, 123, 32, 104, 101, 105, 103, 104, 116, 58, 32,
- 49, 53, 48, 112, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
- 112, 112, 101, 97, 114, 97, 110, 99, 101, 58, 32, 100, 97, 116, 97, 103,
- 114, 105, 100, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120,
- 45, 115, 105, 122, 105, 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45,
- 98, 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108,
- 45, 111, 114, 100, 101, 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99,
- 97, 108, 59, 32, 99, 111, 108, 111, 114, 58, 32, 98, 108, 97, 99, 107,
- 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108,
- 111, 114, 58, 32, 119, 104, 105, 116, 101, 59, 32, 99, 117, 114, 115, 111,
- 114, 58, 32, 100, 101, 102, 97, 117, 108, 116, 59, 32, 98, 111, 114, 100,
- 101, 114, 58, 32, 49, 112, 120, 32, 105, 110, 115, 101, 116, 32, 103, 114,
- 97, 121, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58,
- 32, 105, 110, 105, 116, 105, 97, 108, 59, 32, 125, 32, 117, 44, 32, 105,
- 110, 115, 32, 123, 32, 116, 101, 120, 116, 45, 100, 101, 99, 111, 114, 97,
- 116, 105, 111, 110, 58, 32, 117, 110, 100, 101, 114, 108, 105, 110, 101, 32,
- 125, 32, 115, 116, 114, 111, 110, 103, 44, 32, 98, 32, 123, 32, 102, 111,
- 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, 98, 111, 108, 100, 101,
- 114, 32, 125, 32, 105, 44, 32, 99, 105, 116, 101, 44, 32, 101, 109, 44,
- 32, 118, 97, 114, 44, 32, 97, 100, 100, 114, 101, 115, 115, 32, 123, 32,
- 102, 111, 110, 116, 45, 115, 116, 121, 108, 101, 58, 32, 105, 116, 97, 108,
- 105, 99, 32, 125, 32, 116, 116, 44, 32, 99, 111, 100, 101, 44, 32, 107,
- 98, 100, 44, 32, 115, 97, 109, 112, 32, 123, 32, 102, 111, 110, 116, 45,
- 102, 97, 109, 105, 108, 121, 58, 32, 109, 111, 110, 111, 115, 112, 97, 99,
- 101, 32, 125, 32, 112, 114, 101, 44, 32, 120, 109, 112, 44, 32, 112, 108,
- 97, 105, 110, 116, 101, 120, 116, 44, 32, 108, 105, 115, 116, 105, 110, 103,
- 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 98, 108, 111, 99,
- 107, 59, 32, 102, 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32,
- 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 119, 104, 105, 116, 101,
- 45, 115, 112, 97, 99, 101, 58, 32, 112, 114, 101, 59, 32, 109, 97, 114,
- 103, 105, 110, 58, 32, 49, 95, 95, 113, 101, 109, 32, 48, 32, 125, 32,
- 98, 105, 103, 32, 123, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58,
- 32, 108, 97, 114, 103, 101, 114, 32, 125, 32, 115, 109, 97, 108, 108, 32,
- 123, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 115, 109, 97,
- 108, 108, 101, 114, 32, 125, 32, 115, 44, 32, 115, 116, 114, 105, 107, 101,
- 44, 32, 100, 101, 108, 32, 123, 32, 116, 101, 120, 116, 45, 100, 101, 99,
- 111, 114, 97, 116, 105, 111, 110, 58, 32, 108, 105, 110, 101, 45, 116, 104,
- 114, 111, 117, 103, 104, 32, 125, 32, 115, 117, 98, 32, 123, 32, 118, 101,
- 114, 116, 105, 99, 97, 108, 45, 97, 108, 105, 103, 110, 58, 32, 115, 117,
- 98, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 115, 109,
- 97, 108, 108, 101, 114, 32, 125, 32, 115, 117, 112, 32, 123, 32, 118, 101,
- 114, 116, 105, 99, 97, 108, 45, 97, 108, 105, 103, 110, 58, 32, 115, 117,
- 112, 101, 114, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32,
- 115, 109, 97, 108, 108, 101, 114, 32, 125, 32, 110, 111, 98, 114, 32, 123,
- 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32, 110, 111,
- 119, 114, 97, 112, 32, 125, 32, 58, 102, 111, 99, 117, 115, 32, 123, 32,
- 111, 117, 116, 108, 105, 110, 101, 58, 32, 97, 117, 116, 111, 32, 53, 112,
- 120, 32, 45, 119, 101, 98, 107, 105, 116, 45, 102, 111, 99, 117, 115, 45,
- 114, 105, 110, 103, 45, 99, 111, 108, 111, 114, 32, 125, 32, 104, 116, 109,
- 108, 58, 102, 111, 99, 117, 115, 44, 32, 98, 111, 100, 121, 58, 102, 111,
- 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 114, 101, 97, 100, 111,
- 110, 108, 121, 93, 58, 102, 111, 99, 117, 115, 32, 123, 32, 111, 117, 116,
- 108, 105, 110, 101, 58, 32, 110, 111, 110, 101, 32, 125, 32, 105, 110, 112,
- 117, 116, 58, 102, 111, 99, 117, 115, 44, 32, 116, 101, 120, 116, 97, 114,
- 101, 97, 58, 102, 111, 99, 117, 115, 44, 32, 105, 115, 105, 110, 100, 101,
- 120, 58, 102, 111, 99, 117, 115, 44, 32, 107, 101, 121, 103, 101, 110, 58,
- 102, 111, 99, 117, 115, 44, 32, 115, 101, 108, 101, 99, 116, 58, 102, 111,
- 99, 117, 115, 32, 123, 32, 111, 117, 116, 108, 105, 110, 101, 45, 111, 102,
- 102, 115, 101, 116, 58, 32, 45, 50, 112, 120, 32, 125, 32, 105, 110, 112,
- 117, 116, 91, 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34,
- 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116,
- 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 93, 58,
- 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
- 101, 61, 34, 102, 105, 108, 101, 34, 93, 58, 102, 111, 99, 117, 115, 44,
- 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 104, 105, 100,
- 100, 101, 110, 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112,
- 117, 116, 91, 116, 121, 112, 101, 61, 34, 105, 109, 97, 103, 101, 34, 93,
- 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121,
- 112, 101, 61, 34, 114, 97, 100, 105, 111, 34, 93, 58, 102, 111, 99, 117,
- 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114,
- 101, 115, 101, 116, 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110,
- 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 115, 101, 97, 114, 99, 104,
- 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91,
- 116, 121, 112, 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 102,
+ 103, 110, 58, 32, 115, 116, 97, 114, 116, 59, 32, 98, 111, 114, 100, 101,
+ 114, 58, 32, 49, 112, 120, 32, 105, 110, 115, 101, 116, 32, 103, 114, 97,
+ 121, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 114, 100, 101,
+ 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 105, 110, 105, 116, 105, 97,
+ 108, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32,
+ 105, 110, 105, 116, 105, 97, 108, 59, 32, 125, 32, 115, 101, 108, 101, 99,
+ 116, 91, 115, 105, 122, 101, 61, 34, 48, 34, 93, 44, 32, 115, 101, 108,
+ 101, 99, 116, 91, 115, 105, 122, 101, 61, 34, 49, 34, 93, 32, 123, 32,
+ 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101, 97, 114, 97, 110,
+ 99, 101, 58, 32, 109, 101, 110, 117, 108, 105, 115, 116, 59, 32, 45, 119,
+ 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 97, 108, 105, 103, 110, 58,
+ 32, 99, 101, 110, 116, 101, 114, 59, 32, 98, 111, 114, 100, 101, 114, 58,
+ 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, 59, 32, 45, 119, 101, 98,
+ 107, 105, 116, 45, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, 117,
+ 115, 58, 32, 53, 112, 120, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112,
+ 97, 99, 101, 58, 32, 112, 114, 101, 59, 32, 125, 32, 100, 97, 116, 97,
+ 108, 105, 115, 116, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32,
+ 110, 111, 110, 101, 59, 32, 125, 32, 111, 112, 116, 103, 114, 111, 117, 112,
+ 32, 123, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32,
+ 98, 111, 108, 100, 101, 114, 59, 32, 125, 32, 111, 112, 116, 105, 111, 110,
+ 32, 123, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32,
+ 110, 111, 114, 109, 97, 108, 59, 32, 125, 32, 100, 97, 116, 97, 103, 114,
+ 105, 100, 32, 123, 32, 104, 101, 105, 103, 104, 116, 58, 32, 49, 53, 48,
+ 112, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97, 112, 112, 101,
+ 97, 114, 97, 110, 99, 101, 58, 32, 100, 97, 116, 97, 103, 114, 105, 100,
+ 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98, 111, 120, 45, 115, 105,
+ 122, 105, 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, 111, 120,
+ 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 114, 116, 108, 45, 111, 114,
+ 100, 101, 114, 105, 110, 103, 58, 32, 108, 111, 103, 105, 99, 97, 108, 59,
+ 32, 99, 111, 108, 111, 114, 58, 32, 98, 108, 97, 99, 107, 59, 32, 98,
+ 97, 99, 107, 103, 114, 111, 117, 110, 100, 45, 99, 111, 108, 111, 114, 58,
+ 32, 119, 104, 105, 116, 101, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32,
+ 100, 101, 102, 97, 117, 108, 116, 59, 32, 98, 111, 114, 100, 101, 114, 58,
+ 32, 49, 112, 120, 32, 105, 110, 115, 101, 116, 32, 103, 114, 97, 121, 59,
+ 32, 119, 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32, 105, 110,
+ 105, 116, 105, 97, 108, 59, 32, 125, 32, 117, 44, 32, 105, 110, 115, 32,
+ 123, 32, 116, 101, 120, 116, 45, 100, 101, 99, 111, 114, 97, 116, 105, 111,
+ 110, 58, 32, 117, 110, 100, 101, 114, 108, 105, 110, 101, 32, 125, 32, 115,
+ 116, 114, 111, 110, 103, 44, 32, 98, 32, 123, 32, 102, 111, 110, 116, 45,
+ 119, 101, 105, 103, 104, 116, 58, 32, 98, 111, 108, 100, 101, 114, 32, 125,
+ 32, 105, 44, 32, 99, 105, 116, 101, 44, 32, 101, 109, 44, 32, 118, 97,
+ 114, 44, 32, 97, 100, 100, 114, 101, 115, 115, 32, 123, 32, 102, 111, 110,
+ 116, 45, 115, 116, 121, 108, 101, 58, 32, 105, 116, 97, 108, 105, 99, 32,
+ 125, 32, 116, 116, 44, 32, 99, 111, 100, 101, 44, 32, 107, 98, 100, 44,
+ 32, 115, 97, 109, 112, 32, 123, 32, 102, 111, 110, 116, 45, 102, 97, 109,
+ 105, 108, 121, 58, 32, 109, 111, 110, 111, 115, 112, 97, 99, 101, 32, 125,
+ 32, 112, 114, 101, 44, 32, 120, 109, 112, 44, 32, 112, 108, 97, 105, 110,
+ 116, 101, 120, 116, 44, 32, 108, 105, 115, 116, 105, 110, 103, 32, 123, 32,
+ 100, 105, 115, 112, 108, 97, 121, 58, 32, 98, 108, 111, 99, 107, 59, 32,
+ 102, 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, 109, 111, 110,
+ 111, 115, 112, 97, 99, 101, 59, 32, 119, 104, 105, 116, 101, 45, 115, 112,
+ 97, 99, 101, 58, 32, 112, 114, 101, 59, 32, 109, 97, 114, 103, 105, 110,
+ 58, 32, 49, 95, 95, 113, 101, 109, 32, 48, 32, 125, 32, 98, 105, 103,
+ 32, 123, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 108, 97,
+ 114, 103, 101, 114, 32, 125, 32, 115, 109, 97, 108, 108, 32, 123, 32, 102,
+ 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, 101,
+ 114, 32, 125, 32, 115, 44, 32, 115, 116, 114, 105, 107, 101, 44, 32, 100,
+ 101, 108, 32, 123, 32, 116, 101, 120, 116, 45, 100, 101, 99, 111, 114, 97,
+ 116, 105, 111, 110, 58, 32, 108, 105, 110, 101, 45, 116, 104, 114, 111, 117,
+ 103, 104, 32, 125, 32, 115, 117, 98, 32, 123, 32, 118, 101, 114, 116, 105,
+ 99, 97, 108, 45, 97, 108, 105, 103, 110, 58, 32, 115, 117, 98, 59, 32,
+ 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108,
+ 101, 114, 32, 125, 32, 115, 117, 112, 32, 123, 32, 118, 101, 114, 116, 105,
+ 99, 97, 108, 45, 97, 108, 105, 103, 110, 58, 32, 115, 117, 112, 101, 114,
+ 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 115, 109, 97,
+ 108, 108, 101, 114, 32, 125, 32, 110, 111, 98, 114, 32, 123, 32, 119, 104,
+ 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97,
+ 112, 32, 125, 32, 58, 102, 111, 99, 117, 115, 32, 123, 32, 111, 117, 116,
+ 108, 105, 110, 101, 58, 32, 97, 117, 116, 111, 32, 53, 112, 120, 32, 45,
+ 119, 101, 98, 107, 105, 116, 45, 102, 111, 99, 117, 115, 45, 114, 105, 110,
+ 103, 45, 99, 111, 108, 111, 114, 32, 125, 32, 104, 116, 109, 108, 58, 102,
+ 111, 99, 117, 115, 44, 32, 98, 111, 100, 121, 58, 102, 111, 99, 117, 115,
+ 44, 32, 105, 110, 112, 117, 116, 91, 114, 101, 97, 100, 111, 110, 108, 121,
+ 93, 58, 102, 111, 99, 117, 115, 32, 123, 32, 111, 117, 116, 108, 105, 110,
+ 101, 58, 32, 110, 111, 110, 101, 32, 125, 32, 105, 110, 112, 117, 116, 58,
+ 102, 111, 99, 117, 115, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 58,
+ 102, 111, 99, 117, 115, 44, 32, 105, 115, 105, 110, 100, 101, 120, 58, 102,
+ 111, 99, 117, 115, 44, 32, 107, 101, 121, 103, 101, 110, 58, 102, 111, 99,
+ 117, 115, 44, 32, 115, 101, 108, 101, 99, 116, 58, 102, 111, 99, 117, 115,
+ 32, 123, 32, 111, 117, 116, 108, 105, 110, 101, 45, 111, 102, 102, 115, 101,
+ 116, 58, 32, 45, 50, 112, 120, 32, 125, 32, 105, 110, 112, 117, 116, 91,
+ 116, 121, 112, 101, 61, 34, 98, 117, 116, 116, 111, 110, 34, 93, 58, 102,
111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101,
- 61, 34, 102, 105, 108, 101, 34, 93, 58, 102, 111, 99, 117, 115, 58, 58,
- 45, 119, 101, 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108,
- 111, 97, 100, 45, 98, 117, 116, 116, 111, 110, 32, 123, 32, 111, 117, 116,
- 108, 105, 110, 101, 45, 111, 102, 102, 115, 101, 116, 58, 32, 48, 32, 125,
- 32, 97, 58, 45, 119, 101, 98, 107, 105, 116, 45, 97, 110, 121, 45, 108,
- 105, 110, 107, 32, 123, 32, 99, 111, 108, 111, 114, 58, 32, 45, 119, 101,
- 98, 107, 105, 116, 45, 108, 105, 110, 107, 59, 32, 116, 101, 120, 116, 45,
- 100, 101, 99, 111, 114, 97, 116, 105, 111, 110, 58, 32, 117, 110, 100, 101,
- 114, 108, 105, 110, 101, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 97,
- 117, 116, 111, 59, 32, 125, 32, 97, 58, 45, 119, 101, 98, 107, 105, 116,
- 45, 97, 110, 121, 45, 108, 105, 110, 107, 58, 97, 99, 116, 105, 118, 101,
+ 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 93, 58, 102, 111, 99,
+ 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34,
+ 102, 105, 108, 101, 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110,
+ 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 104, 105, 100, 100, 101, 110,
+ 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91,
+ 116, 121, 112, 101, 61, 34, 105, 109, 97, 103, 101, 34, 93, 58, 102, 111,
+ 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61,
+ 34, 114, 97, 100, 105, 111, 34, 93, 58, 102, 111, 99, 117, 115, 44, 32,
+ 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 114, 101, 115, 101,
+ 116, 34, 93, 58, 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116,
+ 91, 116, 121, 112, 101, 61, 34, 115, 101, 97, 114, 99, 104, 34, 93, 58,
+ 102, 111, 99, 117, 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112,
+ 101, 61, 34, 115, 117, 98, 109, 105, 116, 34, 93, 58, 102, 111, 99, 117,
+ 115, 44, 32, 105, 110, 112, 117, 116, 91, 116, 121, 112, 101, 61, 34, 102,
+ 105, 108, 101, 34, 93, 58, 102, 111, 99, 117, 115, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 102, 105, 108, 101, 45, 117, 112, 108, 111, 97, 100,
+ 45, 98, 117, 116, 116, 111, 110, 32, 123, 32, 111, 117, 116, 108, 105, 110,
+ 101, 45, 111, 102, 102, 115, 101, 116, 58, 32, 48, 32, 125, 32, 97, 58,
+ 45, 119, 101, 98, 107, 105, 116, 45, 97, 110, 121, 45, 108, 105, 110, 107,
32, 123, 32, 99, 111, 108, 111, 114, 58, 32, 45, 119, 101, 98, 107, 105,
- 116, 45, 97, 99, 116, 105, 118, 101, 108, 105, 110, 107, 32, 125, 32, 110,
- 111, 102, 114, 97, 109, 101, 115, 32, 123, 32, 100, 105, 115, 112, 108, 97,
- 121, 58, 32, 110, 111, 110, 101, 32, 125, 32, 102, 114, 97, 109, 101, 115,
- 101, 116, 44, 32, 102, 114, 97, 109, 101, 32, 123, 32, 100, 105, 115, 112,
- 108, 97, 121, 58, 32, 98, 108, 111, 99, 107, 32, 125, 32, 102, 114, 97,
- 109, 101, 115, 101, 116, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45, 99,
- 111, 108, 111, 114, 58, 32, 105, 110, 104, 101, 114, 105, 116, 32, 125, 32,
- 105, 102, 114, 97, 109, 101, 32, 123, 32, 98, 111, 114, 100, 101, 114, 58,
- 32, 50, 112, 120, 32, 105, 110, 115, 101, 116, 32, 125
+ 116, 45, 108, 105, 110, 107, 59, 32, 116, 101, 120, 116, 45, 100, 101, 99,
+ 111, 114, 97, 116, 105, 111, 110, 58, 32, 117, 110, 100, 101, 114, 108, 105,
+ 110, 101, 59, 32, 99, 117, 114, 115, 111, 114, 58, 32, 97, 117, 116, 111,
+ 59, 32, 125, 32, 97, 58, 45, 119, 101, 98, 107, 105, 116, 45, 97, 110,
+ 121, 45, 108, 105, 110, 107, 58, 97, 99, 116, 105, 118, 101, 32, 123, 32,
+ 99, 111, 108, 111, 114, 58, 32, 45, 119, 101, 98, 107, 105, 116, 45, 97,
+ 99, 116, 105, 118, 101, 108, 105, 110, 107, 32, 125, 32, 110, 111, 102, 114,
+ 97, 109, 101, 115, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32,
+ 110, 111, 110, 101, 32, 125, 32, 102, 114, 97, 109, 101, 115, 101, 116, 44,
+ 32, 102, 114, 97, 109, 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121,
+ 58, 32, 98, 108, 111, 99, 107, 32, 125, 32, 102, 114, 97, 109, 101, 115,
+ 101, 116, 32, 123, 32, 98, 111, 114, 100, 101, 114, 45, 99, 111, 108, 111,
+ 114, 58, 32, 105, 110, 104, 101, 114, 105, 116, 32, 125, 32, 105, 102, 114,
+ 97, 109, 101, 32, 123, 32, 98, 111, 114, 100, 101, 114, 58, 32, 50, 112,
+ 120, 32, 105, 110, 115, 101, 116, 32, 125
};
extern const char quirksUserAgentStyleSheet[359] = {
105, 109, 103, 91, 97, 108, 105, 103, 110, 61, 34, 108, 101, 102, 116, 34,
@@ -1075,4 +1081,147 @@ extern const char mediaControlsUserAgentStyleSheet[2582] = {
116, 111, 110, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110,
111, 110, 101, 59, 32, 125
};
+extern const char mediaControlsQtUserAgentStyleSheet[2249] = {
+ 97, 117, 100, 105, 111, 32, 123, 32, 104, 101, 105, 103, 104, 116, 58, 32,
+ 51, 52, 112, 120, 59, 32, 119, 105, 100, 116, 104, 58, 32, 52, 48, 48,
+ 112, 120, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114,
+ 111, 108, 115, 45, 112, 97, 110, 101, 108, 44, 32, 118, 105, 100, 101, 111,
+ 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45,
+ 99, 111, 110, 116, 114, 111, 108, 115, 45, 112, 97, 110, 101, 108, 32, 123,
+ 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 45, 119, 101, 98, 107, 105,
+ 116, 45, 98, 111, 120, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98,
+ 111, 120, 45, 111, 114, 105, 101, 110, 116, 58, 32, 104, 111, 114, 105, 122,
+ 111, 110, 116, 97, 108, 59, 32, 45, 119, 101, 98, 107, 105, 116, 45, 98,
+ 111, 120, 45, 97, 108, 105, 103, 110, 58, 32, 101, 110, 100, 59, 32, 45,
+ 119, 101, 98, 107, 105, 116, 45, 117, 115, 101, 114, 45, 115, 101, 108, 101,
+ 99, 116, 58, 32, 110, 111, 110, 101, 59, 32, 112, 111, 115, 105, 116, 105,
+ 111, 110, 58, 32, 97, 98, 115, 111, 108, 117, 116, 101, 59, 32, 98, 111,
+ 116, 116, 111, 109, 58, 32, 48, 59, 32, 119, 105, 100, 116, 104, 58, 32,
+ 49, 48, 48, 37, 59, 32, 122, 45, 105, 110, 100, 101, 120, 58, 32, 48,
+ 59, 32, 111, 118, 101, 114, 102, 108, 111, 119, 58, 32, 104, 105, 100, 100,
+ 101, 110, 59, 32, 104, 101, 105, 103, 104, 116, 58, 32, 49, 48, 48, 37,
+ 59, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 114, 105,
+ 103, 104, 116, 59, 32, 125, 32, 118, 105, 100, 101, 111, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 102, 117, 108, 108, 45, 112, 97, 103, 101, 45, 109,
+ 101, 100, 105, 97, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101,
+ 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 112, 97, 110,
+ 101, 108, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111,
+ 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114,
+ 111, 108, 115, 45, 109, 117, 116, 101, 45, 98, 117, 116, 116, 111, 110, 44,
+ 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45,
+ 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 109,
+ 117, 116, 101, 45, 98, 117, 116, 116, 111, 110, 32, 123, 32, 108, 101, 102,
+ 116, 58, 32, 97, 117, 116, 111, 59, 32, 114, 105, 103, 104, 116, 58, 32,
+ 53, 112, 120, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, 112, 120,
+ 59, 32, 104, 101, 105, 103, 104, 116, 58, 32, 49, 50, 112, 120, 59, 32,
+ 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112, 120, 59, 32, 109, 97,
+ 114, 103, 105, 110, 58, 32, 53, 112, 120, 32, 53, 112, 120, 32, 53, 112,
+ 120, 32, 51, 112, 120, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58,
+ 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111,
+ 110, 116, 114, 111, 108, 115, 45, 112, 108, 97, 121, 45, 98, 117, 116, 116,
+ 111, 110, 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107,
+ 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108,
+ 115, 45, 112, 108, 97, 121, 45, 98, 117, 116, 116, 111, 110, 32, 123, 32,
+ 108, 101, 102, 116, 58, 32, 53, 112, 120, 59, 32, 119, 105, 100, 116, 104,
+ 58, 32, 57, 112, 120, 59, 32, 104, 101, 105, 103, 104, 116, 58, 32, 49,
+ 50, 112, 120, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112,
+ 120, 32, 49, 50, 112, 120, 32, 54, 112, 120, 32, 49, 49, 112, 120, 59,
+ 32, 109, 97, 114, 103, 105, 110, 58, 32, 53, 112, 120, 32, 51, 112, 120,
+ 32, 53, 112, 120, 32, 53, 112, 120, 59, 32, 125, 32, 97, 117, 100, 105,
+ 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97,
+ 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 116, 105, 109, 101, 108, 105,
+ 110, 101, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 44, 32, 118, 105,
+ 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100,
+ 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 116, 105, 109, 101,
+ 108, 105, 110, 101, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123,
+ 32, 104, 101, 105, 103, 104, 116, 58, 32, 51, 52, 112, 120, 59, 32, 125,
+ 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45,
+ 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 99,
+ 117, 114, 114, 101, 110, 116, 45, 116, 105, 109, 101, 45, 100, 105, 115, 112,
+ 108, 97, 121, 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98,
+ 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111,
+ 108, 115, 45, 99, 117, 114, 114, 101, 110, 116, 45, 116, 105, 109, 101, 45,
+ 100, 105, 115, 112, 108, 97, 121, 32, 123, 32, 100, 105, 115, 112, 108, 97,
+ 121, 58, 32, 110, 111, 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111,
+ 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45,
+ 99, 111, 110, 116, 114, 111, 108, 115, 45, 116, 105, 109, 101, 45, 114, 101,
+ 109, 97, 105, 110, 105, 110, 103, 45, 100, 105, 115, 112, 108, 97, 121, 44,
+ 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45,
+ 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 116,
+ 105, 109, 101, 45, 114, 101, 109, 97, 105, 110, 105, 110, 103, 45, 100, 105,
+ 115, 112, 108, 97, 121, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58,
+ 32, 110, 111, 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58,
+ 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111,
+ 110, 116, 114, 111, 108, 115, 45, 116, 105, 109, 101, 108, 105, 110, 101, 44,
+ 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45,
+ 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 116,
+ 105, 109, 101, 108, 105, 110, 101, 32, 123, 32, 108, 101, 102, 116, 58, 32,
+ 52, 50, 112, 120, 59, 32, 114, 105, 103, 104, 116, 58, 32, 51, 52, 112,
+ 120, 59, 32, 104, 101, 105, 103, 104, 116, 58, 32, 49, 50, 112, 120, 59,
+ 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112, 120, 32, 56, 112,
+ 120, 59, 32, 109, 97, 114, 103, 105, 110, 58, 32, 53, 112, 120, 32, 48,
+ 112, 120, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114,
+ 111, 108, 115, 45, 118, 111, 108, 117, 109, 101, 45, 115, 108, 105, 100, 101,
+ 114, 45, 99, 111, 110, 116, 97, 105, 110, 101, 114, 44, 32, 118, 105, 100,
+ 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105,
+ 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 118, 111, 108, 117, 109,
+ 101, 45, 115, 108, 105, 100, 101, 114, 45, 99, 111, 110, 116, 97, 105, 110,
+ 101, 114, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111,
+ 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114,
+ 111, 108, 115, 45, 118, 111, 108, 117, 109, 101, 45, 115, 108, 105, 100, 101,
+ 114, 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105,
+ 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115,
+ 45, 118, 111, 108, 117, 109, 101, 45, 115, 108, 105, 100, 101, 114, 32, 123,
+ 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111, 110, 101, 59, 32,
+ 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116,
+ 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45,
+ 115, 101, 101, 107, 45, 98, 97, 99, 107, 45, 98, 117, 116, 116, 111, 110,
+ 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116,
+ 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45,
+ 115, 101, 101, 107, 45, 98, 97, 99, 107, 45, 98, 117, 116, 116, 111, 110,
+ 32, 123, 32, 108, 101, 102, 116, 58, 32, 48, 112, 120, 59, 32, 116, 111,
+ 112, 58, 32, 48, 112, 120, 59, 32, 119, 105, 100, 116, 104, 58, 32, 48,
+ 112, 120, 59, 32, 104, 101, 105, 103, 104, 116, 58, 32, 48, 112, 120, 59,
+ 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111, 110, 101, 59, 32,
+ 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116,
+ 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45,
+ 115, 101, 101, 107, 45, 102, 111, 114, 119, 97, 114, 100, 45, 98, 117, 116,
+ 116, 111, 110, 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119, 101, 98,
+ 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114, 111,
+ 108, 115, 45, 115, 101, 101, 107, 45, 102, 111, 114, 119, 97, 114, 100, 45,
+ 98, 117, 116, 116, 111, 110, 32, 123, 32, 108, 101, 102, 116, 58, 32, 48,
+ 112, 120, 59, 32, 116, 111, 112, 58, 32, 48, 112, 120, 59, 32, 119, 105,
+ 100, 116, 104, 58, 32, 48, 112, 120, 59, 32, 104, 101, 105, 103, 104, 116,
+ 58, 32, 48, 112, 120, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32,
+ 110, 111, 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45,
+ 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110,
+ 116, 114, 111, 108, 115, 45, 102, 117, 108, 108, 115, 99, 114, 101, 101, 110,
+ 45, 98, 117, 116, 116, 111, 110, 44, 32, 118, 105, 100, 101, 111, 58, 58,
+ 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111,
+ 110, 116, 114, 111, 108, 115, 45, 102, 117, 108, 108, 115, 99, 114, 101, 101,
+ 110, 45, 98, 117, 116, 116, 111, 110, 32, 123, 32, 108, 101, 102, 116, 58,
+ 32, 48, 112, 120, 59, 32, 116, 111, 112, 58, 32, 48, 112, 120, 59, 32,
+ 119, 105, 100, 116, 104, 58, 32, 48, 112, 120, 59, 32, 104, 101, 105, 103,
+ 104, 116, 58, 32, 48, 112, 120, 59, 32, 100, 105, 115, 112, 108, 97, 121,
+ 58, 32, 110, 111, 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58,
+ 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99,
+ 111, 110, 116, 114, 111, 108, 115, 45, 114, 101, 119, 105, 110, 100, 45, 98,
+ 117, 116, 116, 111, 110, 44, 32, 118, 105, 100, 101, 111, 58, 58, 45, 119,
+ 101, 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116,
+ 114, 111, 108, 115, 45, 114, 101, 119, 105, 110, 100, 45, 98, 117, 116, 116,
+ 111, 110, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 110, 111,
+ 110, 101, 59, 32, 125, 32, 97, 117, 100, 105, 111, 58, 58, 45, 119, 101,
+ 98, 107, 105, 116, 45, 109, 101, 100, 105, 97, 45, 99, 111, 110, 116, 114,
+ 111, 108, 115, 45, 114, 101, 116, 117, 114, 110, 45, 116, 111, 45, 114, 101,
+ 97, 108, 116, 105, 109, 101, 45, 98, 117, 116, 116, 111, 110, 44, 32, 118,
+ 105, 100, 101, 111, 58, 58, 45, 119, 101, 98, 107, 105, 116, 45, 109, 101,
+ 100, 105, 97, 45, 99, 111, 110, 116, 114, 111, 108, 115, 45, 114, 101, 116,
+ 117, 114, 110, 45, 116, 111, 45, 114, 101, 97, 108, 116, 105, 109, 101, 45,
+ 98, 117, 116, 116, 111, 110, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121,
+ 58, 32, 110, 111, 110, 101, 59, 32, 125
+};
}
diff --git a/src/3rdparty/webkit/WebCore/generated/WebKitVersion.h b/src/3rdparty/webkit/WebCore/generated/WebKitVersion.h
index 5dede20..11e6af2 100644
--- a/src/3rdparty/webkit/WebCore/generated/WebKitVersion.h
+++ b/src/3rdparty/webkit/WebCore/generated/WebKitVersion.h
@@ -31,6 +31,6 @@
#define WebKitVersion_h
#define WEBKIT_MAJOR_VERSION 532
-#define WEBKIT_MINOR_VERSION 1
+#define WEBKIT_MINOR_VERSION 3
#endif //WebKitVersion_h
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp
index daa7919..968f144 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.cpp
@@ -27,6 +27,7 @@
#include "DNS.h"
#include "EventNames.h"
#include "Frame.h"
+#include "FrameLoaderTypes.h"
#include "HTMLImageElement.h"
#include "HTMLNames.h"
#include "KeyboardEvent.h"
@@ -43,6 +44,7 @@ using namespace HTMLNames;
HTMLAnchorElement::HTMLAnchorElement(const QualifiedName& tagName, Document* document)
: HTMLElement(tagName, document, CreateElement)
, m_wasShiftKeyDownOnMouseDown(false)
+ , m_linkRelations(0)
{
}
@@ -67,7 +69,7 @@ bool HTMLAnchorElement::supportsFocus() const
bool HTMLAnchorElement::isMouseFocusable() const
{
// Anchor elements should be mouse focusable, https://bugs.webkit.org/show_bug.cgi?id=26856
-#if !PLATFORM(GTK)
+#if PLATFORM(MAC)
if (isLink())
return false;
#endif
@@ -200,7 +202,7 @@ void HTMLAnchorElement::defaultEventHandler(Event* evt)
}
if (!evt->defaultPrevented() && document()->frame())
- document()->frame()->loader()->urlSelected(document()->completeURL(url), getAttribute(targetAttr), evt, false, false, true);
+ document()->frame()->loader()->urlSelected(document()->completeURL(url), getAttribute(targetAttr), evt, false, false, true, hasRel(RelationNoReferrer) ? NoReferrer : SendReferrer);
evt->setDefaultHandled();
} else if (isLink() && isContentEditable()) {
@@ -274,10 +276,11 @@ void HTMLAnchorElement::parseMappedAttribute(MappedAttribute *attr)
}
}
} else if (attr->name() == nameAttr ||
- attr->name() == titleAttr ||
- attr->name() == relAttr) {
+ attr->name() == titleAttr) {
// Do nothing.
- } else
+ } else if (attr->name() == relAttr)
+ setRel(attr->value());
+ else
HTMLElement::parseMappedAttribute(attr);
}
@@ -321,6 +324,20 @@ void HTMLAnchorElement::setHref(const AtomicString& value)
setAttribute(hrefAttr, value);
}
+bool HTMLAnchorElement::hasRel(uint32_t relation) const
+{
+ return m_linkRelations & relation;
+}
+
+void HTMLAnchorElement::setRel(const String& value)
+{
+ m_linkRelations = 0;
+ ClassNames newLinkRelations(value, true);
+ // FIXME: Add link relations as they are implemented
+ if (newLinkRelations.contains("noreferrer"))
+ m_linkRelations |= RelationNoReferrer;
+}
+
const AtomicString& HTMLAnchorElement::name() const
{
return getAttribute(nameAttr);
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h b/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h
index f538be2..e47ea99 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLAnchorElement.h
@@ -28,6 +28,29 @@
namespace WebCore {
+// Link relation bitmask values.
+// FIXME: Uncomment as the various link relations are implemented.
+enum {
+// RelationAlternate = 0x00000001,
+// RelationArchives = 0x00000002,
+// RelationAuthor = 0x00000004,
+// RelationBoomark = 0x00000008,
+// RelationExternal = 0x00000010,
+// RelationFirst = 0x00000020,
+// RelationHelp = 0x00000040,
+// RelationIndex = 0x00000080,
+// RelationLast = 0x00000100,
+// RelationLicense = 0x00000200,
+// RelationNext = 0x00000400,
+// RelationNoFolow = 0x00000800,
+ RelationNoReferrer = 0x00001000,
+// RelationPrev = 0x00002000,
+// RelationSearch = 0x00004000,
+// RelationSidebar = 0x00008000,
+// RelationTag = 0x00010000,
+// RelationUp = 0x00020000,
+};
+
class HTMLAnchorElement : public HTMLElement {
public:
static PassRefPtr<HTMLAnchorElement> create(Document*);
@@ -51,6 +74,9 @@ public:
bool isLiveLink() const;
+ bool hasRel(uint32_t relation) const;
+ void setRel(const String&);
+
protected:
HTMLAnchorElement(const QualifiedName&, Document*);
@@ -73,6 +99,7 @@ private:
RefPtr<Element> m_rootEditableElementForSelectionOnMouseDown;
bool m_wasShiftKeyDownOnMouseDown;
+ uint32_t m_linkRelations;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in b/src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in
index 63a5c21..340779e 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in
+++ b/src/3rdparty/webkit/WebCore/html/HTMLAttributeNames.in
@@ -125,6 +125,7 @@ object
onabort
onbeforecopy
onbeforecut
+onbeforeload
onbeforepaste
onbeforeunload
onblur
@@ -157,7 +158,6 @@ onkeyup
onload
onloadeddata
onloadedmetadata
-onloadend
onloadstart
onmousedown
onmousemove
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
index 9b2f70c..335b20f 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLCanvasElement.cpp
@@ -138,7 +138,7 @@ String HTMLCanvasElement::toDataURL(const String& mimeType, ExceptionCode& ec)
return String();
}
- if (m_size.isEmpty())
+ if (m_size.isEmpty() || !buffer())
return String("data:,");
if (mimeType.isNull() || !MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType))
@@ -166,7 +166,7 @@ CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type)
}
#if ENABLE(3D_CANVAS)
Settings* settings = document()->settings();
- if (settings && settings->experimentalWebGLEnabled()) {
+ if (settings && settings->webGLEnabled()) {
if ((type == "webkit-3d") ||
(type == "GL")) {
if (m_context && !m_context->is3d())
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp b/src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp
index fd939c8..0d1cb19 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLDocument.cpp
@@ -307,8 +307,7 @@ PassRefPtr<Element> HTMLDocument::createElement(const AtomicString& name, Except
ec = INVALID_CHARACTER_ERR;
return 0;
}
- AtomicString lowerName = name.string().impl()->isLower() ? name : AtomicString(name.string().lower());
- return HTMLElementFactory::createHTMLElement(QualifiedName(nullAtom, lowerName, xhtmlNamespaceURI), this, 0, false);
+ return HTMLElementFactory::createHTMLElement(QualifiedName(nullAtom, name.lower(), xhtmlNamespaceURI), this, 0, false);
}
static void addItemToMap(HashCountedSet<AtomicStringImpl*>& map, const AtomicString& name)
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLElement.cpp
index 967a8e0..df3cb7d 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLElement.cpp
@@ -67,7 +67,7 @@ String HTMLElement::nodeName() const
// the string on a hit in the hash.
// FIXME: We should have a way to detect XHTML elements and replace the hasPrefix() check with it.
if (document()->isHTMLDocument() && !tagQName().hasPrefix())
- return tagQName().localName().string().upper();
+ return tagQName().localNameUpper();
return Element::nodeName();
}
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp
index 8e66fe0..ea46980 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.cpp
@@ -41,6 +41,7 @@
#include "RenderBox.h"
#include "RenderTextControl.h"
#include "RenderTheme.h"
+#include "ScriptEventListener.h"
#include "ValidityState.h"
namespace WebCore {
@@ -52,6 +53,7 @@ HTMLFormControlElement::HTMLFormControlElement(const QualifiedName& tagName, Doc
, m_form(f)
, m_disabled(false)
, m_readOnly(false)
+ , m_required(false)
, m_valueMatchesRenderer(false)
{
if (!m_form)
@@ -86,9 +88,9 @@ ValidityState* HTMLFormControlElement::validity()
void HTMLFormControlElement::parseMappedAttribute(MappedAttribute *attr)
{
- if (attr->name() == nameAttr) {
- // Do nothing.
- } else if (attr->name() == disabledAttr) {
+ if (attr->name() == nameAttr)
+ setNeedsStyleRecalc();
+ else if (attr->name() == disabledAttr) {
bool oldDisabled = m_disabled;
m_disabled = !attr->isNull();
if (oldDisabled != m_disabled) {
@@ -104,6 +106,11 @@ void HTMLFormControlElement::parseMappedAttribute(MappedAttribute *attr)
if (renderer() && renderer()->style()->hasAppearance())
renderer()->theme()->stateChanged(renderer(), ReadOnlyState);
}
+ } else if (attr->name() == requiredAttr) {
+ bool oldRequired = m_required;
+ m_required = !attr->isNull();
+ if (oldRequired != m_required)
+ setNeedsStyleRecalc();
} else
HTMLElement::parseMappedAttribute(attr);
}
@@ -218,7 +225,7 @@ void HTMLFormControlElement::setAutofocus(bool b)
bool HTMLFormControlElement::required() const
{
- return hasAttribute(requiredAttr);
+ return m_required;
}
void HTMLFormControlElement::setRequired(bool b)
@@ -291,6 +298,14 @@ bool HTMLFormControlElement::checkValidity()
return true;
}
+void HTMLFormControlElement::updateValidity()
+{
+ if (willValidate()) {
+ // Update style for pseudo classes such as :valid :invalid.
+ setNeedsStyleRecalc();
+ }
+}
+
void HTMLFormControlElement::setCustomValidity(const String& error)
{
validity()->setCustomErrorMessage(error);
@@ -408,4 +423,81 @@ void HTMLTextFormControlElement::updatePlaceholderVisibility(bool placeholderVal
toRenderTextControl(renderer())->updatePlaceholderVisibility(placeholderShouldBeVisible(), placeholderValueChanged);
}
+RenderTextControl* HTMLTextFormControlElement::textRendererAfterUpdateLayout()
+{
+ if (!isTextFormControl())
+ return 0;
+ document()->updateLayoutIgnorePendingStylesheets();
+ return toRenderTextControl(renderer());
+}
+
+void HTMLTextFormControlElement::setSelectionStart(int start)
+{
+ if (RenderTextControl* renderer = textRendererAfterUpdateLayout())
+ renderer->setSelectionStart(start);
+}
+
+void HTMLTextFormControlElement::setSelectionEnd(int end)
+{
+ if (RenderTextControl* renderer = textRendererAfterUpdateLayout())
+ renderer->setSelectionEnd(end);
+}
+
+void HTMLTextFormControlElement::select()
+{
+ if (RenderTextControl* renderer = textRendererAfterUpdateLayout())
+ renderer->select();
+}
+
+void HTMLTextFormControlElement::setSelectionRange(int start, int end)
+{
+ if (RenderTextControl* renderer = textRendererAfterUpdateLayout())
+ renderer->setSelectionRange(start, end);
+}
+
+int HTMLTextFormControlElement::selectionStart()
+{
+ if (!isTextFormControl())
+ return 0;
+ if (document()->focusedNode() != this && cachedSelectionStart() >= 0)
+ return cachedSelectionStart();
+ if (!renderer())
+ return 0;
+ return toRenderTextControl(renderer())->selectionStart();
+}
+
+int HTMLTextFormControlElement::selectionEnd()
+{
+ if (!isTextFormControl())
+ return 0;
+ if (document()->focusedNode() != this && cachedSelectionEnd() >= 0)
+ return cachedSelectionEnd();
+ if (!renderer())
+ return 0;
+ return toRenderTextControl(renderer())->selectionEnd();
+}
+
+VisibleSelection HTMLTextFormControlElement::selection() const
+{
+ if (!renderer() || !isTextFormControl() || cachedSelectionStart() < 0 || cachedSelectionEnd() < 0)
+ return VisibleSelection();
+ return toRenderTextControl(renderer())->selection(cachedSelectionStart(), cachedSelectionEnd());
+}
+
+void HTMLTextFormControlElement::parseMappedAttribute(MappedAttribute* attr)
+{
+ if (attr->name() == placeholderAttr)
+ updatePlaceholderVisibility(true);
+ else if (attr->name() == onfocusAttr)
+ setAttributeEventListener(eventNames().focusEvent, createAttributeEventListener(this, attr));
+ else if (attr->name() == onblurAttr)
+ setAttributeEventListener(eventNames().blurEvent, createAttributeEventListener(this, attr));
+ else if (attr->name() == onselectAttr)
+ setAttributeEventListener(eventNames().selectEvent, createAttributeEventListener(this, attr));
+ else if (attr->name() == onchangeAttr)
+ setAttributeEventListener(eventNames().changeEvent, createAttributeEventListener(this, attr));
+ else
+ HTMLFormControlElementWithState::parseMappedAttribute(attr);
+}
+
} // namespace Webcore
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h b/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h
index 7b3cfbd..b5dc7ce 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLFormControlElement.h
@@ -30,7 +30,9 @@ namespace WebCore {
class FormDataList;
class HTMLFormElement;
+class RenderTextControl;
class ValidityState;
+class VisibleSelection;
class HTMLFormControlElement : public HTMLElement {
public:
@@ -106,10 +108,11 @@ public:
virtual bool willValidate() const;
bool checkValidity();
+ void updateValidity();
void setCustomValidity(const String&);
-
virtual bool valueMissing() const { return false; }
virtual bool patternMismatch() const { return false; }
+ virtual bool tooLong() const { return false; }
void formDestroyed() { m_form = 0; }
@@ -126,9 +129,10 @@ private:
HTMLFormElement* m_form;
RefPtr<ValidityState> m_validityState;
- bool m_disabled;
- bool m_readOnly;
- bool m_valueMatchesRenderer;
+ bool m_disabled : 1;
+ bool m_readOnly : 1;
+ bool m_required : 1;
+ bool m_valueMatchesRenderer : 1;
};
class HTMLFormControlElementWithState : public HTMLFormControlElement {
@@ -150,9 +154,20 @@ public:
virtual void dispatchFocusEvent();
virtual void dispatchBlurEvent();
+ int selectionStart();
+ int selectionEnd();
+ void setSelectionStart(int);
+ void setSelectionEnd(int);
+ void select();
+ void setSelectionRange(int start, int end);
+ VisibleSelection selection() const;
+
protected:
bool placeholderShouldBeVisible() const;
void updatePlaceholderVisibility(bool);
+ virtual int cachedSelectionStart() const = 0;
+ virtual int cachedSelectionEnd() const = 0;
+ virtual void parseMappedAttribute(MappedAttribute*);
private:
// A subclass should return true if placeholder processing is needed.
@@ -163,6 +178,7 @@ private:
virtual void handleFocusEvent() { }
// Called in dispatchBlurEvent(), after placeholder process, before calling parent's dispatchBlurEvent().
virtual void handleBlurEvent() { }
+ RenderTextControl* textRendererAfterUpdateLayout();
};
} //namespace
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp b/src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp
index 1bc4995..80df829 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLFrameElementBase.cpp
@@ -137,9 +137,11 @@ void HTMLFrameElementBase::parseMappedAttribute(MappedAttribute *attr)
m_viewSource = !attr->isNull();
if (contentFrame())
contentFrame()->setInViewSourceMode(viewSourceMode());
- } else if (attr->name() == onloadAttr) {
+ } else if (attr->name() == onloadAttr)
setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
- } else if (attr->name() == onbeforeunloadAttr) {
+ else if (attr->name() == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
+ else if (attr->name() == onbeforeunloadAttr) {
// FIXME: should <frame> elements have beforeunload handlers?
setAttributeEventListener(eventNames().beforeunloadEvent, createAttributeEventListener(this, attr));
} else
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp
index 932e718..d353073 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp
@@ -118,6 +118,8 @@ void HTMLImageElement::parseMappedAttribute(MappedAttribute* attr)
setAttributeEventListener(eventNames().abortEvent, createAttributeEventListener(this, attr));
else if (attrName == onloadAttr)
setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
+ else if (attrName == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
else if (attrName == compositeAttr) {
if (!parseCompositeOperator(attr->value(), m_compositeOperator))
m_compositeOperator = CompositeSourceOver;
@@ -167,7 +169,7 @@ void HTMLImageElement::attach()
{
HTMLElement::attach();
- if (renderer() && renderer()->isImage()) {
+ if (renderer() && renderer()->isImage() && m_imageLoader.haveFiredBeforeLoadEvent()) {
RenderImage* imageObj = toRenderImage(renderer());
if (imageObj->hasImage())
return;
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp
index e6b8228..ed3405a 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp
@@ -196,6 +196,98 @@ bool HTMLInputElement::patternMismatch() const
return false;
}
+bool HTMLInputElement::tooLong() const
+{
+ switch (inputType()) {
+ case EMAIL:
+ case PASSWORD:
+ case SEARCH:
+ case TELEPHONE:
+ case TEXT:
+ case URL: {
+ int max = maxLength();
+ if (max < 0)
+ return false;
+ // Return false for the default value even if it is longer than maxLength.
+ bool userEdited = !m_data.value().isNull();
+ if (!userEdited)
+ return false;
+ return value().length() > static_cast<unsigned>(max);
+ }
+ case BUTTON:
+ case CHECKBOX:
+ case COLOR:
+ case FILE:
+ case HIDDEN:
+ case IMAGE:
+ case ISINDEX:
+ case NUMBER:
+ case RADIO:
+ case RANGE:
+ case RESET:
+ case SUBMIT:
+ return false;
+ }
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
+bool HTMLInputElement::rangeUnderflow() const
+{
+ if (inputType() == NUMBER) {
+ double min = 0.0;
+ double doubleValue = 0.0;
+ if (formStringToDouble(getAttribute(minAttr), &min) && formStringToDouble(value(), &doubleValue))
+ return doubleValue < min;
+ } else if (inputType() == RANGE) {
+ double doubleValue;
+ if (formStringToDouble(value(), &doubleValue))
+ return doubleValue < rangeMinimum();
+ }
+ return false;
+}
+
+bool HTMLInputElement::rangeOverflow() const
+{
+ if (inputType() == NUMBER) {
+ double max = 0.0;
+ double doubleValue = 0.0;
+ if (formStringToDouble(getAttribute(maxAttr), &max) && formStringToDouble(value(), &doubleValue))
+ return doubleValue > max;
+ } else if (inputType() == RANGE) {
+ double doubleValue;
+ if (formStringToDouble(value(), &doubleValue))
+ return doubleValue > rangeMaximum();
+ }
+ return false;
+}
+
+double HTMLInputElement::rangeMinimum() const
+{
+ ASSERT(inputType() == RANGE);
+ // The range type's "default minimum" is 0.
+ double min = 0.0;
+ formStringToDouble(getAttribute(minAttr), &min);
+ return min;
+}
+
+double HTMLInputElement::rangeMaximum() const
+{
+ ASSERT(inputType() == RANGE);
+ // The range type's "default maximum" is 100.
+ static const double defaultMaximum = 100.0;
+ double max = defaultMaximum;
+ formStringToDouble(getAttribute(maxAttr), &max);
+ const double min = rangeMinimum();
+
+ if (max < min) {
+ // A remedy for the inconsistent min/max values.
+ // Sets the maxmimum to the default (100.0) or the minimum value.
+ max = min < defaultMaximum ? defaultMaximum : min;
+ }
+ return max;
+}
+
static inline CheckedRadioButtons& checkedRadioButtons(const HTMLInputElement *element)
{
if (HTMLFormElement* form = element->form())
@@ -382,6 +474,7 @@ void HTMLInputElement::setInputType(const String& t)
}
InputElement::notifyFormStateChanged(this);
+ updateValidity();
}
m_haveType = true;
@@ -543,63 +636,6 @@ bool HTMLInputElement::canHaveSelection() const
return isTextField();
}
-int HTMLInputElement::selectionStart() const
-{
- if (!isTextField())
- return 0;
- if (document()->focusedNode() != this && m_data.cachedSelectionStart() != -1)
- return m_data.cachedSelectionStart();
- if (!renderer())
- return 0;
- return toRenderTextControl(renderer())->selectionStart();
-}
-
-int HTMLInputElement::selectionEnd() const
-{
- if (!isTextField())
- return 0;
- if (document()->focusedNode() != this && m_data.cachedSelectionEnd() != -1)
- return m_data.cachedSelectionEnd();
- if (!renderer())
- return 0;
- return toRenderTextControl(renderer())->selectionEnd();
-}
-
-static bool isTextFieldWithRenderer(HTMLInputElement* element)
-{
- if (!element->isTextField())
- return false;
-
- element->document()->updateLayoutIgnorePendingStylesheets();
- if (!element->renderer())
- return false;
-
- return true;
-}
-
-void HTMLInputElement::setSelectionStart(int start)
-{
- if (isTextFieldWithRenderer(this))
- toRenderTextControl(renderer())->setSelectionStart(start);
-}
-
-void HTMLInputElement::setSelectionEnd(int end)
-{
- if (isTextFieldWithRenderer(this))
- toRenderTextControl(renderer())->setSelectionEnd(end);
-}
-
-void HTMLInputElement::select()
-{
- if (isTextFieldWithRenderer(this))
- toRenderTextControl(renderer())->select();
-}
-
-void HTMLInputElement::setSelectionRange(int start, int end)
-{
- InputElement::updateSelectionRange(this, this, start, end);
-}
-
void HTMLInputElement::accessKeyAction(bool sendToAnyElement)
{
switch (inputType()) {
@@ -659,6 +695,7 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
checkedRadioButtons(this).removeButton(this);
m_data.setName(attr->value());
checkedRadioButtons(this).addButton(this);
+ HTMLFormControlElementWithState::parseMappedAttribute(attr);
} else if (attr->name() == autocompleteAttr) {
if (equalIgnoringCase(attr->value(), "off")) {
m_autocomplete = Off;
@@ -678,12 +715,14 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
if (m_data.value().isNull())
setNeedsStyleRecalc();
setFormControlValueMatchesRenderer(false);
+ updateValidity();
} else if (attr->name() == checkedAttr) {
m_defaultChecked = !attr->isNull();
if (m_useDefaultChecked) {
setChecked(m_defaultChecked);
m_useDefaultChecked = true;
}
+ updateValidity();
} else if (attr->name() == maxlengthAttr)
InputElement::parseMaxLengthAttribute(m_data, this, this, attr);
else if (attr->name() == sizeAttr)
@@ -715,14 +754,6 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
} else if (attr->name() == heightAttr) {
if (respectHeightAndWidthAttrs())
addCSSLength(attr, CSSPropertyHeight, attr->value());
- } else if (attr->name() == onfocusAttr) {
- setAttributeEventListener(eventNames().focusEvent, createAttributeEventListener(this, attr));
- } else if (attr->name() == onblurAttr) {
- setAttributeEventListener(eventNames().blurEvent, createAttributeEventListener(this, attr));
- } else if (attr->name() == onselectAttr) {
- setAttributeEventListener(eventNames().selectEvent, createAttributeEventListener(this, attr));
- } else if (attr->name() == onchangeAttr) {
- setAttributeEventListener(eventNames().changeEvent, createAttributeEventListener(this, attr));
}
// Search field and slider attributes all just cause updateFromElement to be called through style
// recalcing.
@@ -730,7 +761,7 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
setAttributeEventListener(eventNames().searchEvent, createAttributeEventListener(this, attr));
} else if (attr->name() == resultsAttr) {
int oldResults = m_maxResults;
- m_maxResults = !attr->isNull() ? min(attr->value().toInt(), maxSavedResults) : -1;
+ m_maxResults = !attr->isNull() ? std::min(attr->value().toInt(), maxSavedResults) : -1;
// FIXME: Detaching just for maxResults change is not ideal. We should figure out the right
// time to relayout for this change.
if (m_maxResults != oldResults && (m_maxResults <= 0 || oldResults <= 0) && attached()) {
@@ -738,8 +769,6 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
attach();
}
setNeedsStyleRecalc();
- } else if (attr->name() == placeholderAttr) {
- updatePlaceholderVisibility(true);
} else if (attr->name() == autosaveAttr ||
attr->name() == incrementalAttr ||
attr->name() == minAttr ||
@@ -747,13 +776,15 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
attr->name() == multipleAttr ||
attr->name() == precisionAttr)
setNeedsStyleRecalc();
+ else if (attr->name() == patternAttr)
+ updateValidity();
#if ENABLE(DATALIST)
else if (attr->name() == listAttr)
m_hasNonEmptyList = !attr->isEmpty();
// FIXME: we need to tell this change to a renderer if the attribute affects the appearance.
#endif
else
- HTMLFormControlElementWithState::parseMappedAttribute(attr);
+ HTMLTextFormControlElement::parseMappedAttribute(attr);
}
bool HTMLInputElement::rendererIsNeeded(RenderStyle *style)
@@ -831,7 +862,7 @@ void HTMLInputElement::attach()
if (!m_imageLoader)
m_imageLoader.set(new HTMLImageLoader(this));
m_imageLoader->updateFromElement();
- if (renderer()) {
+ if (renderer() && m_imageLoader->haveFiredBeforeLoadEvent()) {
RenderImage* imageObj = toRenderImage(renderer());
imageObj->setCachedImage(m_imageLoader->image());
@@ -1127,6 +1158,7 @@ void HTMLInputElement::setValue(const String& value)
cacheSelection(max, max);
}
InputElement::notifyFormStateChanged(this);
+ updateValidity();
}
String HTMLInputElement::placeholder() const
@@ -1150,6 +1182,7 @@ void HTMLInputElement::setValueFromRenderer(const String& value)
ASSERT(inputType() != FILE);
updatePlaceholderVisibility(false);
InputElement::setValueFromRenderer(m_data, this, this, value);
+ updateValidity();
}
void HTMLInputElement::setFileListFromRenderer(const Vector<String>& paths)
@@ -1161,6 +1194,7 @@ void HTMLInputElement::setFileListFromRenderer(const Vector<String>& paths)
setFormControlValueMatchesRenderer(true);
InputElement::notifyFormStateChanged(this);
+ updateValidity();
}
bool HTMLInputElement::storesValueSeparateFromAttribute() const
@@ -1610,12 +1644,12 @@ int HTMLInputElement::maxLength() const
return m_data.maxLength();
}
-void HTMLInputElement::setMaxLength(int _maxLength, ExceptionCode& exceptionCode)
+void HTMLInputElement::setMaxLength(int maxLength, ExceptionCode& ec)
{
- if (_maxLength < 0)
- exceptionCode = INDEX_SIZE_ERR;
+ if (maxLength < 0)
+ ec = INDEX_SIZE_ERR;
else
- setAttribute(maxlengthAttr, String::number(_maxLength));
+ setAttribute(maxlengthAttr, String::number(maxLength));
}
bool HTMLInputElement::multiple() const
@@ -1746,13 +1780,6 @@ void HTMLInputElement::onSearch()
dispatchEvent(Event::create(eventNames().searchEvent, true, false));
}
-VisibleSelection HTMLInputElement::selection() const
-{
- if (!renderer() || !isTextField() || m_data.cachedSelectionStart() == -1 || m_data.cachedSelectionEnd() == -1)
- return VisibleSelection();
- return toRenderTextControl(renderer())->selection(m_data.cachedSelectionStart(), m_data.cachedSelectionEnd());
-}
-
void HTMLInputElement::documentDidBecomeActive()
{
ASSERT(needsActivationCallback());
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.h b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.h
index 16e3b58..799d92c 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.h
@@ -93,6 +93,15 @@ public:
virtual bool valueMissing() const;
virtual bool patternMismatch() const;
+ virtual bool tooLong() const;
+ // For ValidityState
+ bool rangeUnderflow() const;
+ bool rangeOverflow() const;
+ // Returns the minimum value for type=range. Don't call this for other types.
+ double rangeMinimum() const;
+ // Returns the maximum value for type=range. Don't call this for other types.
+ // This always returns a value which is <= rangeMinimum().
+ double rangeMaximum() const;
bool isTextButton() const { return m_type == SUBMIT || m_type == RESET || m_type == BUTTON; }
virtual bool isRadioButton() const { return m_type == RADIO; }
@@ -128,12 +137,7 @@ public:
virtual bool canStartSelection() const;
bool canHaveSelection() const;
- int selectionStart() const;
- int selectionEnd() const;
- void setSelectionStart(int);
- void setSelectionEnd(int);
- virtual void select();
- void setSelectionRange(int start, int end);
+ virtual void select() { HTMLTextFormControlElement::select(); }
virtual void accessKeyAction(bool sendToAnyElement);
@@ -218,8 +222,6 @@ public:
void addSearchResult();
void onSearch();
- VisibleSelection selection() const;
-
virtual String sanitizeValue(const String&) const;
virtual void documentDidBecomeActive();
@@ -248,6 +250,8 @@ private:
virtual bool isEmptyValue() const { return value().isEmpty(); }
virtual void handleFocusEvent();
virtual void handleBlurEvent();
+ virtual int cachedSelectionStart() const { return m_data.cachedSelectionStart(); }
+ virtual int cachedSelectionEnd() const { return m_data.cachedSelectionEnd(); }
virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
virtual bool isRequiredFormControl() const;
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl
index 7cdf487..59248f4 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl
+++ b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.idl
@@ -42,8 +42,14 @@ module html {
#if defined(ENABLE_DATALIST) && ENABLE_DATALIST
readonly attribute HTMLElement list;
#endif
+#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
+ attribute [Reflect] DOMString max;
+#endif
attribute long maxLength
setter raises(DOMException);
+#if !defined(LANGUAGE_COM) || !LANGUAGE_COM
+ attribute [Reflect] DOMString min;
+#endif
attribute boolean multiple;
attribute [ConvertNullToNullString] DOMString name;
attribute [Reflect] DOMString pattern;
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp
index 0971ef5..6b74221 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLLinkElement.cpp
@@ -38,6 +38,7 @@
#include "MediaList.h"
#include "MediaQueryEvaluator.h"
#include "Page.h"
+#include "ScriptEventListener.h"
#include "Settings.h"
namespace WebCore {
@@ -126,7 +127,9 @@ void HTMLLinkElement::parseMappedAttribute(MappedAttribute *attr)
process();
} else if (attr->name() == disabledAttr) {
setDisabledState(!attr->isNull());
- } else {
+ } else if (attr->name() == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
+ else {
if (attr->name() == titleAttr && m_sheet)
m_sheet->setTitle(attr->value());
HTMLElement::parseMappedAttribute(attr);
@@ -187,11 +190,7 @@ void HTMLLinkElement::process()
// This was buggy and would incorrectly match <link rel="alternate">, which has a different specified meaning. -dwh
if (m_disabledState != 2 && (m_isStyleSheet || acceptIfTypeContainsTextCSS && type.contains("text/css")) && document()->frame() && m_url.isValid()) {
// also, don't load style sheets for standalone documents
- // Add ourselves as a pending sheet, but only if we aren't an alternate
- // stylesheet. Alternate stylesheets don't hold up render tree construction.
- if (!isAlternate())
- document()->addPendingSheet();
-
+
String charset = getAttribute(charsetAttr);
if (charset.isEmpty() && document()->frame())
charset = document()->frame()->loader()->encoding();
@@ -200,14 +199,28 @@ void HTMLLinkElement::process()
if (m_loading)
document()->removePendingSheet();
m_cachedSheet->removeClient(this);
+ m_cachedSheet = 0;
}
+
+ if (!dispatchBeforeLoadEvent(m_url))
+ return;
+
m_loading = true;
+
+ // Add ourselves as a pending sheet, but only if we aren't an alternate
+ // stylesheet. Alternate stylesheets don't hold up render tree construction.
+ if (!isAlternate())
+ document()->addPendingSheet();
+
m_cachedSheet = document()->docLoader()->requestCSSStyleSheet(m_url, charset);
+
if (m_cachedSheet)
m_cachedSheet->addClient(this);
- else if (!isAlternate()) { // The request may have been denied if stylesheet is local and document is remote.
+ else {
+ // The request may have been denied if (for example) the stylesheet is local and the document is remote.
m_loading = false;
- document()->removePendingSheet();
+ if (!isAlternate())
+ document()->removePendingSheet();
}
} else if (m_sheet) {
// we no longer contain a stylesheet, e.g. perhaps rel or type was changed
@@ -261,7 +274,7 @@ void HTMLLinkElement::setCSSStyleSheet(const String& url, const String& charset,
DEFINE_STATIC_LOCAL(const String, mediaWikiKHTMLFixesStyleSheet, ("/* KHTML fix stylesheet */\n/* work around the horizontal scrollbars */\n#column-content { margin-left: 0; }\n\n"));
// There are two variants of KHTMLFixes.css. One is equal to mediaWikiKHTMLFixesStyleSheet,
// while the other lacks the second trailing newline.
- if (url.endsWith(slashKHTMLFixesDotCss) && mediaWikiKHTMLFixesStyleSheet.startsWith(sheetText)
+ if (url.endsWith(slashKHTMLFixesDotCss) && !sheetText.isNull() && mediaWikiKHTMLFixesStyleSheet.startsWith(sheetText)
&& sheetText.length() >= mediaWikiKHTMLFixesStyleSheet.length() - 1) {
ASSERT(m_sheet->length() == 1);
ExceptionCode ec;
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp
index 2409d37..11ca3ba 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.cpp
@@ -28,6 +28,9 @@
#if ENABLE(VIDEO)
#include "HTMLMediaElement.h"
+#include "ClientRect.h"
+#include "ClientRectList.h"
+#include "ChromeClient.h"
#include "CSSHelper.h"
#include "CSSPropertyNames.h"
#include "CSSValueKeywords.h"
@@ -39,6 +42,7 @@
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClient.h"
+#include "FrameView.h"
#include "HTMLDocument.h"
#include "HTMLNames.h"
#include "HTMLSourceElement.h"
@@ -53,6 +57,7 @@
#include "Page.h"
#include "ProgressEvent.h"
#include "RenderVideo.h"
+#include "RenderView.h"
#include "ScriptEventListener.h"
#include "TimeRanges.h"
#include <limits>
@@ -111,6 +116,7 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* doc)
, m_sentEndEvent(false)
, m_pausedInternal(false)
, m_sendProgressEvents(true)
+ , m_isFullscreen(false)
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
, m_needWidgetUpdate(false)
#endif
@@ -161,6 +167,8 @@ void HTMLMediaElement::parseMappedAttribute(MappedAttribute* attr)
m_player->setAutobuffer(!attr->isNull());
} else if (attrName == onabortAttr)
setAttributeEventListener(eventNames().abortEvent, createAttributeEventListener(this, attr));
+ else if (attrName == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
else if (attrName == oncanplayAttr)
setAttributeEventListener(eventNames().canplayEvent, createAttributeEventListener(this, attr));
else if (attrName == oncanplaythroughAttr)
@@ -179,8 +187,6 @@ void HTMLMediaElement::parseMappedAttribute(MappedAttribute* attr)
setAttributeEventListener(eventNames().loadeddataEvent, createAttributeEventListener(this, attr));
else if (attrName == onloadedmetadataAttr)
setAttributeEventListener(eventNames().loadedmetadataEvent, createAttributeEventListener(this, attr));
- else if (attrName == onloadendAttr)
- setAttributeEventListener(eventNames().loadendEvent, createAttributeEventListener(this, attr));
else if (attrName == onloadstartAttr)
setAttributeEventListener(eventNames().loadstartEvent, createAttributeEventListener(this, attr));
else if (attrName == onpauseAttr)
@@ -241,6 +247,12 @@ void HTMLMediaElement::insertedIntoDocument()
scheduleLoad();
}
+void HTMLMediaElement::willRemove()
+{
+ if (m_isFullscreen)
+ exitFullscreen();
+ HTMLElement::willRemove();
+}
void HTMLMediaElement::removedFromDocument()
{
if (m_networkState > NETWORK_EMPTY)
@@ -454,17 +466,15 @@ void HTMLMediaElement::loadInternal()
// 4 - If the media element's networkState is set to NETWORK_LOADING or NETWORK_IDLE, set
// the error attribute to a new MediaError object whose code attribute is set to
// MEDIA_ERR_ABORTED, fire a progress event called abort at the media element, in the
- // context of the fetching process that is in progress for the element, and fire a progress
- // event called loadend at the media element, in the context of the same fetching process.
+ // context of the fetching process that is in progress for the element.
if (m_networkState == NETWORK_LOADING || m_networkState == NETWORK_IDLE) {
m_error = MediaError::create(MediaError::MEDIA_ERR_ABORTED);
- // fire synchronous 'abort' and 'loadend'
+ // fire synchronous 'abort'
bool totalKnown = m_player && m_player->totalBytesKnown();
unsigned loaded = m_player ? m_player->bytesLoaded() : 0;
unsigned total = m_player ? m_player->totalBytes() : 0;
dispatchEvent(ProgressEvent::create(eventNames().abortEvent, totalKnown, loaded, total));
- dispatchEvent(ProgressEvent::create(eventNames().loadendEvent, totalKnown, loaded, total));
}
// 5
@@ -496,35 +506,34 @@ void HTMLMediaElement::loadInternal()
void HTMLMediaElement::selectMediaResource()
{
- // 1 - If the media element has neither a src attribute nor any source element children, run these substeps
+ // 1 - Set the networkState to NETWORK_NO_SOURCE
+ m_networkState = NETWORK_NO_SOURCE;
+
+ // 2 - Asynchronously await a stable state.
+
+ // 3 - If the media element has neither a src attribute nor any source element children, run these substeps
String mediaSrc = getAttribute(srcAttr);
if (!mediaSrc && !havePotentialSourceChild()) {
m_loadState = WaitingForSource;
- // 1 - Set the networkState to NETWORK_NO_SOURCE
- m_networkState = NETWORK_NO_SOURCE;
-
- // 2 - While the media element has neither a src attribute nor any source element children,
- // wait. (This steps might wait forever.)
-
- m_delayingTheLoadEvent = false;
+ // 1 - Set the networkState to NETWORK_EMPTY and abort these steps
+ m_networkState = NETWORK_EMPTY;
+ ASSERT(!m_delayingTheLoadEvent);
return;
}
- // 2
+ // 4
m_delayingTheLoadEvent = true;
-
- // 3
m_networkState = NETWORK_LOADING;
- // 4
+ // 5
scheduleProgressEvent(eventNames().loadstartEvent);
- // 5 - If the media element has a src attribute, then run these substeps
+ // 6 - If the media element has a src attribute, then run these substeps
ContentType contentType("");
- if (!mediaSrc.isEmpty()) {
+ if (!mediaSrc.isNull()) {
KURL mediaURL = document()->completeURL(mediaSrc);
- if (isSafeToLoadURL(mediaURL, Complain)) {
+ if (isSafeToLoadURL(mediaURL, Complain) && dispatchBeforeLoadEvent(mediaURL.string())) {
m_loadState = LoadingFromSrcAttr;
loadResource(mediaURL, contentType);
} else
@@ -553,9 +562,20 @@ void HTMLMediaElement::loadNextSourceChild()
loadResource(mediaURL, contentType);
}
-void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType)
+void HTMLMediaElement::loadResource(const KURL& initialURL, ContentType& contentType)
{
- ASSERT(isSafeToLoadURL(url, Complain));
+ ASSERT(isSafeToLoadURL(initialURL, Complain));
+
+ Frame* frame = document()->frame();
+ if (!frame)
+ return;
+ FrameLoader* loader = frame->loader();
+ if (!loader)
+ return;
+
+ KURL url(initialURL);
+ if (!loader->willLoadMediaElementURL(url))
+ return;
// The resource fetch algorithm
m_networkState = NETWORK_LOADING;
@@ -577,7 +597,13 @@ void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType)
updateVolume();
m_player->load(m_currentSrc, contentType);
-
+
+ if (isVideo() && m_player->canLoadPoster()) {
+ KURL posterUrl = static_cast<HTMLVideoElement*>(this)->poster();
+ if (!posterUrl.isEmpty())
+ m_player->setPoster(posterUrl);
+ }
+
if (renderer())
renderer()->updateFromElement();
}
@@ -588,7 +614,7 @@ bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidSourceAction acti
FrameLoader* loader = frame ? frame->loader() : 0;
// don't allow remote to local urls, and check with the frame loader client.
- if (!loader || !loader->canLoad(url, String(), document()) || !loader->client()->shouldLoadMediaElementURL(url)) {
+ if (!loader || !SecurityOrigin::canLoad(url, String(), document())) {
if (actionIfInvalid == Complain)
FrameLoader::reportLocalLoadFailed(frame, url.string());
return false;
@@ -614,24 +640,19 @@ void HTMLMediaElement::noneSupported()
m_loadState = WaitingForSource;
m_currentSourceNode = 0;
- // 4 - Reaching this step indicates that either the URL failed to resolve, or the media
+ // 5 - Reaching this step indicates that either the URL failed to resolve, or the media
// resource failed to load. Set the error attribute to a new MediaError object whose
// code attribute is set to MEDIA_ERR_SRC_NOT_SUPPORTED.
m_error = MediaError::create(MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED);
- // 5 - Set the element's networkState attribute to the NETWORK_NO_SOURCE value.
+ // 6 - Set the element's networkState attribute to the NETWORK_NO_SOURCE value.
m_networkState = NETWORK_NO_SOURCE;
- // 6 - Queue a task to fire a progress event called error at the media element, in
+ // 7 - Queue a task to fire a progress event called error at the media element, in
// the context of the fetching process that was used to try to obtain the media
// resource in the resource fetch algorithm.
scheduleProgressEvent(eventNames().errorEvent);
- // 7 - Queue a task to fire a progress event called loadend at the media element, in
- // the context of the fetching process that was used to try to obtain the media
- // resource in the resource fetch algorithm.
- scheduleProgressEvent(eventNames().loadendEvent);
-
// 8 - Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
m_delayingTheLoadEvent = false;
@@ -657,19 +678,15 @@ void HTMLMediaElement::mediaEngineError(PassRefPtr<MediaError> err)
// the context of the fetching process started by this instance of this algorithm.
scheduleProgressEvent(eventNames().errorEvent);
- // 4 - Queue a task to fire a progress event called loadend at the media element, in
- // the context of the fetching process started by this instance of this algorithm.
- scheduleProgressEvent(eventNames().loadendEvent);
-
- // 5 - Set the element's networkState attribute to the NETWORK_EMPTY value and queue a
+ // 4 - Set the element's networkState attribute to the NETWORK_EMPTY value and queue a
// task to fire a simple event called emptied at the element.
m_networkState = NETWORK_EMPTY;
scheduleEvent(eventNames().emptiedEvent);
- // 6 - Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
+ // 5 - Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
m_delayingTheLoadEvent = false;
- // 7 - Abort the overall resource selection algorithm.
+ // 6 - Abort the overall resource selection algorithm.
m_currentSourceNode = 0;
}
@@ -756,7 +773,6 @@ void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state)
setReadyState(currentState);
scheduleProgressEvent(eventNames().loadEvent);
- scheduleProgressEvent(eventNames().loadendEvent);
}
}
}
@@ -1355,7 +1371,7 @@ KURL HTMLMediaElement::selectNextSourceChild(ContentType *contentType, InvalidSo
// Is it safe to load this url?
mediaURL = source->src();
- if (!mediaURL.isValid() || !isSafeToLoadURL(mediaURL, actionIfInvalid))
+ if (!mediaURL.isValid() || !isSafeToLoadURL(mediaURL, actionIfInvalid) || !dispatchBeforeLoadEvent(mediaURL.string()))
goto check_again;
// Making it this far means the <source> looks reasonable
@@ -1514,7 +1530,12 @@ PassRefPtr<TimeRanges> HTMLMediaElement::seekable() const
bool HTMLMediaElement::potentiallyPlaying() const
{
- return !paused() && m_readyState >= HAVE_FUTURE_DATA && !endedPlayback() && !stoppedDueToErrors() && !pausedForUserInteraction();
+ return m_readyState >= HAVE_FUTURE_DATA && couldPlayIfEnoughData();
+}
+
+bool HTMLMediaElement::couldPlayIfEnoughData() const
+{
+ return !paused() && !endedPlayback() && !stoppedDueToErrors() && !pausedForUserInteraction();
}
bool HTMLMediaElement::endedPlayback() const
@@ -1598,7 +1619,8 @@ void HTMLMediaElement::updatePlayState()
float time = currentTime();
if (time > m_lastSeekTime)
addPlayedRange(m_lastSeekTime, time);
- }
+ } else if (couldPlayIfEnoughData() && playerPaused)
+ m_player->prepareToPlay();
if (renderer())
renderer()->updateFromElement();
@@ -1629,17 +1651,13 @@ void HTMLMediaElement::userCancelledLoad()
#endif
stopPeriodicTimers();
- // 2 - Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORT.
+ // 2 - Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORTED.
m_error = MediaError::create(MediaError::MEDIA_ERR_ABORTED);
// 3 - Queue a task to fire a progress event called abort at the media element, in the context
// of the fetching process started by this instance of this algorithm.
scheduleProgressEvent(eventNames().abortEvent);
- // 4 - Queue a task to fire a progress event called loadend at the media element, in the context
- // of the fetching process started by this instance of this algorithm.
- scheduleProgressEvent(eventNames().loadendEvent);
-
// 5 - If the media element's readyState attribute has a value equal to HAVE_NOTHING, set the
// element's networkState attribute to the NETWORK_EMPTY value and queue a task to fire a
// simple event called emptied at the element. Otherwise, set set the element's networkState
@@ -1696,6 +1714,14 @@ void HTMLMediaElement::mediaVolumeDidChange()
updateVolume();
}
+const IntRect HTMLMediaElement::screenRect()
+{
+ IntRect elementRect;
+ if (renderer())
+ elementRect = renderer()->view()->frameView()->contentsToScreen(renderer()->absoluteBoundingBoxRect());
+ return elementRect;
+}
+
void HTMLMediaElement::defaultEventHandler(Event* event)
{
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
@@ -1768,6 +1794,28 @@ void HTMLMediaElement::finishParsingChildren()
#endif
+void HTMLMediaElement::enterFullscreen()
+{
+ ASSERT(!m_isFullscreen);
+ if (!renderer())
+ return;
+ if (document() && document()->page())
+ document()->page()->chrome()->client()->enterFullscreenForNode(this);
+ m_isFullscreen = true;
+}
+
+void HTMLMediaElement::exitFullscreen()
+{
+ ASSERT(m_isFullscreen);
+ if (document() && document()->page())
+ document()->page()->chrome()->client()->exitFullscreenForNode(this);
+ m_isFullscreen = false;
+}
+
+PlatformMedia HTMLMediaElement::platformMedia() const
+{
+ return m_player ? m_player->platformMedia() : NoPlatformMedia;
+}
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h b/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h
index aa8d5f7..0005e07 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLMediaElement.h
@@ -43,7 +43,7 @@ class HTMLSourceElement;
class MediaError;
class KURL;
class TimeRanges;
-
+
class HTMLMediaElement : public HTMLElement, public MediaPlayerClient {
public:
HTMLMediaElement(const QualifiedName&, Document*);
@@ -57,6 +57,7 @@ public:
virtual bool rendererIsNeeded(RenderStyle*);
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
virtual void insertedIntoDocument();
+ virtual void willRemove();
virtual void removedFromDocument();
virtual void attach();
virtual void recalcStyle(StyleChange);
@@ -73,6 +74,8 @@ public:
// Eventually overloaded in HTMLVideoElement
virtual bool supportsFullscreen() const { return false; };
virtual bool supportsSave() const;
+
+ PlatformMedia platformMedia() const;
void scheduleLoad();
@@ -141,6 +144,8 @@ public:
void beginScrubbing();
void endScrubbing();
+ const IntRect screenRect();
+
bool canPlay() const;
float percentLoaded() const;
@@ -154,6 +159,9 @@ public:
#endif
bool hasSingleSecurityOrigin() const { return !m_player || m_player->hasSingleSecurityOrigin(); }
+
+ void enterFullscreen();
+ void exitFullscreen();
protected:
float getTimeOffsetAttribute(const QualifiedName&, float valueOnError) const;
@@ -233,6 +241,7 @@ private:
bool endedPlayback() const;
bool stoppedDueToErrors() const;
bool pausedForUserInteraction() const;
+ bool couldPlayIfEnoughData() const;
float minTimeSeekable() const;
float maxTimeSeekable() const;
@@ -310,6 +319,8 @@ protected:
// support progress events so setting m_sendProgressEvents disables them
bool m_sendProgressEvents : 1;
+ bool m_isFullscreen : 1;
+
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
bool m_needWidgetUpdate : 1;
#endif
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp
index 9765c43..d3ccfa4 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLObjectElement.cpp
@@ -95,9 +95,11 @@ void HTMLObjectElement::parseMappedAttribute(MappedAttribute *attr)
m_classId = val;
if (renderer())
m_needWidgetUpdate = true;
- } else if (attr->name() == onloadAttr) {
+ } else if (attr->name() == onloadAttr)
setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
- } else if (attr->name() == nameAttr) {
+ else if (attr->name() == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
+ else if (attr->name() == nameAttr) {
const AtomicString& newName = attr->value();
if (isDocNamedItem() && inDocument() && document()->isHTMLDocument()) {
HTMLDocument* document = static_cast<HTMLDocument*>(this->document());
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp
index ce7fee6..636c579 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLScriptElement.cpp
@@ -71,6 +71,8 @@ void HTMLScriptElement::parseMappedAttribute(MappedAttribute* attr)
handleSourceAttribute(m_data, attr->value());
else if (attrName == onloadAttr)
setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
+ else if (attrName == onbeforeloadAttr)
+ setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
else
HTMLElement::parseMappedAttribute(attr);
}
@@ -217,7 +219,7 @@ String HTMLScriptElement::forAttributeValue() const
{
return getAttribute(forAttr).string();
}
-
+
void HTMLScriptElement::dispatchLoadEvent()
{
ASSERT(!m_data.haveFiredLoadEvent());
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp
index b5e4ced..3030018 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.cpp
@@ -70,6 +70,7 @@ HTMLTextAreaElement::HTMLTextAreaElement(const QualifiedName& tagName, Document*
, m_wrap(SoftWrap)
, m_cachedSelectionStart(-1)
, m_cachedSelectionEnd(-1)
+ , m_isDirty(false)
{
ASSERT(hasTagName(textareaTag));
setFormControlValueMatchesRenderer(true);
@@ -93,54 +94,6 @@ void HTMLTextAreaElement::restoreFormControlState(const String& state)
setDefaultValue(state);
}
-int HTMLTextAreaElement::selectionStart()
-{
- if (!renderer())
- return 0;
- if (document()->focusedNode() != this && m_cachedSelectionStart >= 0)
- return m_cachedSelectionStart;
- return toRenderTextControl(renderer())->selectionStart();
-}
-
-int HTMLTextAreaElement::selectionEnd()
-{
- if (!renderer())
- return 0;
- if (document()->focusedNode() != this && m_cachedSelectionEnd >= 0)
- return m_cachedSelectionEnd;
- return toRenderTextControl(renderer())->selectionEnd();
-}
-
-static RenderTextControl* rendererAfterUpdateLayout(HTMLTextAreaElement* element)
-{
- element->document()->updateLayoutIgnorePendingStylesheets();
- return toRenderTextControl(element->renderer());
-}
-
-void HTMLTextAreaElement::setSelectionStart(int start)
-{
- if (RenderTextControl* renderer = rendererAfterUpdateLayout(this))
- renderer->setSelectionStart(start);
-}
-
-void HTMLTextAreaElement::setSelectionEnd(int end)
-{
- if (RenderTextControl* renderer = rendererAfterUpdateLayout(this))
- renderer->setSelectionEnd(end);
-}
-
-void HTMLTextAreaElement::select()
-{
- if (RenderTextControl* renderer = rendererAfterUpdateLayout(this))
- renderer->select();
-}
-
-void HTMLTextAreaElement::setSelectionRange(int start, int end)
-{
- if (RenderTextControl* renderer = rendererAfterUpdateLayout(this))
- renderer->setSelectionRange(start, end);
-}
-
void HTMLTextAreaElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
{
setValue(defaultValue());
@@ -196,18 +149,8 @@ void HTMLTextAreaElement::parseMappedAttribute(MappedAttribute* attr)
} else if (attr->name() == alignAttr) {
// Don't map 'align' attribute. This matches what Firefox, Opera and IE do.
// See http://bugs.webkit.org/show_bug.cgi?id=7075
- } else if (attr->name() == placeholderAttr) {
- updatePlaceholderVisibility(true);
- } else if (attr->name() == onfocusAttr)
- setAttributeEventListener(eventNames().focusEvent, createAttributeEventListener(this, attr));
- else if (attr->name() == onblurAttr)
- setAttributeEventListener(eventNames().blurEvent, createAttributeEventListener(this, attr));
- else if (attr->name() == onselectAttr)
- setAttributeEventListener(eventNames().selectEvent, createAttributeEventListener(this, attr));
- else if (attr->name() == onchangeAttr)
- setAttributeEventListener(eventNames().changeEvent, createAttributeEventListener(this, attr));
- else
- HTMLFormControlElementWithState::parseMappedAttribute(attr);
+ } else
+ HTMLTextFormControlElement::parseMappedAttribute(attr);
}
RenderObject* HTMLTextAreaElement::createRenderer(RenderArena* arena, RenderStyle*)
@@ -231,6 +174,7 @@ bool HTMLTextAreaElement::appendFormData(FormDataList& encoding, bool)
void HTMLTextAreaElement::reset()
{
setValue(defaultValue());
+ m_isDirty = false;
}
bool HTMLTextAreaElement::isKeyboardFocusable(KeyboardEvent*) const
@@ -316,6 +260,7 @@ void HTMLTextAreaElement::updateValue() const
m_value = toRenderTextControl(renderer())->text();
const_cast<HTMLTextAreaElement*>(this)->setFormControlValueMatchesRenderer(true);
notifyFormStateChanged(this);
+ m_isDirty = true;
}
String HTMLTextAreaElement::value() const
@@ -353,6 +298,7 @@ void HTMLTextAreaElement::setValue(const String& value)
setNeedsStyleRecalc();
notifyFormStateChanged(this);
+ updateValidity();
}
String HTMLTextAreaElement::defaultValue() const
@@ -409,14 +355,26 @@ int HTMLTextAreaElement::maxLength() const
return ok && value >= 0 ? value : -1;
}
-void HTMLTextAreaElement::setMaxLength(int newValue, ExceptionCode& exceptionCode)
+void HTMLTextAreaElement::setMaxLength(int newValue, ExceptionCode& ec)
{
if (newValue < 0)
- exceptionCode = INDEX_SIZE_ERR;
+ ec = INDEX_SIZE_ERR;
else
setAttribute(maxlengthAttr, String::number(newValue));
}
+bool HTMLTextAreaElement::tooLong() const
+{
+ // Return false for the default value even if it is longer than maxLength.
+ if (!m_isDirty)
+ return false;
+
+ int max = maxLength();
+ if (max < 0)
+ return false;
+ return value().length() > static_cast<unsigned>(max);
+}
+
void HTMLTextAreaElement::accessKeyAction(bool)
{
focus();
@@ -442,13 +400,6 @@ void HTMLTextAreaElement::setRows(int rows)
setAttribute(rowsAttr, String::number(rows));
}
-VisibleSelection HTMLTextAreaElement::selection() const
-{
- if (!renderer() || m_cachedSelectionStart < 0 || m_cachedSelectionEnd < 0)
- return VisibleSelection();
- return toRenderTextControl(renderer())->selection(m_cachedSelectionStart, m_cachedSelectionEnd);
-}
-
bool HTMLTextAreaElement::shouldUseInputMethod() const
{
return true;
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h
index cfd471a..23f61d3 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLTextAreaElement.h
@@ -55,15 +55,6 @@ public:
virtual bool valueMissing() const { return isRequiredFormControl() && !disabled() && !readOnly() && value().isEmpty(); }
- int selectionStart();
- int selectionEnd();
-
- void setSelectionStart(int);
- void setSelectionEnd(int);
-
- void select();
- void setSelectionRange(int, int);
-
virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
virtual void parseMappedAttribute(MappedAttribute*);
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
@@ -81,6 +72,7 @@ public:
int textLength() const { return value().length(); }
int maxLength() const;
void setMaxLength(int, ExceptionCode&);
+ virtual bool tooLong() const;
void rendererWillBeDestroyed();
@@ -93,7 +85,6 @@ public:
void setRows(int);
void cacheSelection(int s, int e) { m_cachedSelectionStart = s; m_cachedSelectionEnd = e; };
- VisibleSelection selection() const;
virtual bool shouldUseInputMethod() const;
@@ -106,6 +97,8 @@ private:
virtual bool supportsPlaceholder() const { return true; }
virtual bool isEmptyValue() const { return value().isEmpty(); }
+ virtual int cachedSelectionStart() const { return m_cachedSelectionStart; }
+ virtual int cachedSelectionEnd() const { return m_cachedSelectionEnd; }
virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
virtual bool isRequiredFormControl() const { return required(); }
@@ -116,6 +109,7 @@ private:
mutable String m_value;
int m_cachedSelectionStart;
int m_cachedSelectionEnd;
+ mutable bool m_isDirty;
};
} //namespace
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp b/src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp
index fa68151..33af997 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLTokenizer.cpp
@@ -43,6 +43,7 @@
#include "HTMLParser.h"
#include "HTMLScriptElement.h"
#include "HTMLViewSourceDocument.h"
+#include "ImageLoader.h"
#include "InspectorTimelineAgent.h"
#include "MappedAttribute.h"
#include "Page.h"
@@ -441,7 +442,8 @@ HTMLTokenizer::State HTMLTokenizer::scriptHandler(State state)
#endif
// The parser might have been stopped by for example a window.close call in an earlier script.
// If so, we don't want to load scripts.
- if (!m_parserStopped && (cs = m_doc->docLoader()->requestScript(m_scriptTagSrcAttrValue, m_scriptTagCharsetAttrValue)))
+ if (!m_parserStopped && m_scriptNode->dispatchBeforeLoadEvent(m_scriptTagSrcAttrValue) &&
+ (cs = m_doc->docLoader()->requestScript(m_scriptTagSrcAttrValue, m_scriptTagCharsetAttrValue)))
m_pendingScripts.append(cs);
else
m_scriptNode = 0;
@@ -560,7 +562,7 @@ HTMLTokenizer::State HTMLTokenizer::scriptExecution(const ScriptSourceCode& sour
#endif
m_state = state;
- m_doc->frame()->loader()->executeScript(sourceCode);
+ m_doc->frame()->script()->executeScript(sourceCode);
state = m_state;
state.setAllowYield(true);
@@ -1673,7 +1675,7 @@ void HTMLTokenizer::write(const SegmentedString& str, bool appendData)
State state = m_state;
- while (!m_src.isEmpty() && (!frame || !frame->loader()->isScheduledLocationChangePending())) {
+ while (!m_src.isEmpty() && (!frame || !frame->redirectScheduler()->locationChangePending())) {
if (!continueProcessing(processedCount, startTime, state))
break;
@@ -1801,6 +1803,9 @@ void HTMLTokenizer::write(const SegmentedString& str, bool appendData)
if (m_noMoreData && !m_inWrite && !state.loadingExtScript() && !m_executingScript && !m_timer.isActive())
end(); // this actually causes us to be deleted
+
+ // After parsing, go ahead and dispatch image beforeload/load events.
+ ImageLoader::dispatchPendingEvents();
}
void HTMLTokenizer::stopParsing()
@@ -1981,6 +1986,14 @@ void HTMLTokenizer::enlargeScriptBuffer(int len)
CRASH();
int newSize = m_scriptCodeCapacity + delta;
+ // If we allow fastRealloc(ptr, 0), it will call CRASH(). We run into this
+ // case if the HTML being parsed begins with "<!--" and there's more data
+ // coming.
+ if (!newSize) {
+ ASSERT(!m_scriptCode);
+ return;
+ }
+
m_scriptCode = static_cast<UChar*>(fastRealloc(m_scriptCode, newSize * sizeof(UChar)));
m_scriptCodeCapacity = newSize;
}
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp b/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp
index ecd74e7..5bbc167 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp
+++ b/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.cpp
@@ -28,6 +28,7 @@
#if ENABLE(VIDEO)
#include "HTMLVideoElement.h"
+#include "ChromeClient.h"
#include "CSSHelper.h"
#include "CSSPropertyNames.h"
#include "Document.h"
@@ -112,6 +113,18 @@ void HTMLVideoElement::parseMappedAttribute(MappedAttribute* attr)
HTMLMediaElement::parseMappedAttribute(attr);
}
+bool HTMLVideoElement::supportsFullscreen() const
+{
+ Page* page = document() ? document()->page() : 0;
+ if (!page)
+ return false;
+
+ if (!m_player || !m_player->supportsFullscreen())
+ return false;
+
+ return page->chrome()->client()->supportsFullscreenForNode(this);
+}
+
unsigned HTMLVideoElement::videoWidth() const
{
if (!m_player)
diff --git a/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h b/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h
index dc9714a..096eb53 100644
--- a/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h
+++ b/src/3rdparty/webkit/WebCore/html/HTMLVideoElement.h
@@ -49,7 +49,7 @@ public:
virtual void parseMappedAttribute(MappedAttribute* attr);
virtual bool isVideo() const { return true; }
virtual bool hasVideo() const { return player() && player()->hasVideo(); }
- virtual bool supportsFullscreen() const { return player() && player()->supportsFullscreen(); }
+ virtual bool supportsFullscreen() const;
virtual bool isURLAttribute(Attribute*) const;
virtual const QualifiedName& imageSourceAttributeName() const;
diff --git a/src/3rdparty/webkit/WebCore/html/ValidityState.cpp b/src/3rdparty/webkit/WebCore/html/ValidityState.cpp
index df8933d..6b0a0b4 100644
--- a/src/3rdparty/webkit/WebCore/html/ValidityState.cpp
+++ b/src/3rdparty/webkit/WebCore/html/ValidityState.cpp
@@ -26,6 +26,12 @@
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "KURL.h"
+#include "RegularExpression.h"
+#include <wtf/StdLibExtras.h>
+
+#define EMAIL_LOCALPART "[a-z0-9!#$%&'*+/=?^_`{|}~.-]+"
+#define EMAIL_DOMAINPART "[a-z0-9-]+(\\.[a-z0-9-]+)+"
+#define EMAIL_PATTERN EMAIL_LOCALPART "@" EMAIL_DOMAINPART
namespace WebCore {
@@ -55,11 +61,38 @@ bool ValidityState::typeMismatch()
return !HTMLInputElement::formStringToDouble(value, 0);
case HTMLInputElement::URL:
return !KURL(KURL(), value).isValid();
+ case HTMLInputElement::EMAIL:
+ {
+ if (!input->multiple())
+ return !isValidEmailAddress(value);
+
+ Vector<String> email_list;
+ value.split(',', email_list);
+ for (unsigned i = 0; i < email_list.size(); ++i)
+ if (!isValidEmailAddress(email_list[i]))
+ return true;
+
+ return false;
+ }
default:
return false;
}
}
+bool ValidityState::rangeUnderflow()
+{
+ if (!control()->hasTagName(inputTag))
+ return false;
+ return static_cast<HTMLInputElement*>(control())->rangeUnderflow();
+}
+
+bool ValidityState::rangeOverflow()
+{
+ if (!control()->hasTagName(inputTag))
+ return false;
+ return static_cast<HTMLInputElement*>(control())->rangeOverflow();
+}
+
bool ValidityState::valid()
{
bool someError = typeMismatch() || stepMismatch() || rangeUnderflow() || rangeOverflow() ||
@@ -81,4 +114,19 @@ bool ValidityState::isValidColorString(const String& value)
return color.isValid() && !color.hasAlpha();
}
+bool ValidityState::isValidEmailAddress(const String& email)
+{
+ if (email.isEmpty())
+ return false;
+
+ DEFINE_STATIC_LOCAL(AtomicString, emailPattern, (EMAIL_PATTERN));
+ DEFINE_STATIC_LOCAL(RegularExpression, regExp, (emailPattern, TextCaseInsensitive));
+
+ int matchLength = 0;
+ int emailLength = email.length();
+ int matchOffset = regExp.match(email, 0, &matchLength);
+
+ return matchOffset == 0 && matchLength == emailLength;
+}
+
} // namespace
diff --git a/src/3rdparty/webkit/WebCore/html/ValidityState.h b/src/3rdparty/webkit/WebCore/html/ValidityState.h
index 1b87f99..1dee306 100644
--- a/src/3rdparty/webkit/WebCore/html/ValidityState.h
+++ b/src/3rdparty/webkit/WebCore/html/ValidityState.h
@@ -43,9 +43,9 @@ namespace WebCore {
bool valueMissing() { return control()->valueMissing(); }
bool typeMismatch();
bool patternMismatch() { return control()->patternMismatch(); }
- bool tooLong() { return false; }
- bool rangeUnderflow() { return false; }
- bool rangeOverflow() { return false; }
+ bool tooLong() { return control()->tooLong(); }
+ bool rangeUnderflow();
+ bool rangeOverflow();
bool stepMismatch() { return false; }
bool customError() { return !m_customErrorMessage.isEmpty(); }
bool valid();
@@ -56,6 +56,7 @@ namespace WebCore {
String m_customErrorMessage;
static bool isValidColorString(const String&);
+ bool isValidEmailAddress(const String&);
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.h
new file mode 100644
index 0000000..b04b0d0
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef CanvasActiveInfo_h
+#define CanvasActiveInfo_h
+
+#include "PlatformString.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class CanvasActiveInfo : public RefCounted<CanvasActiveInfo> {
+public:
+ static PassRefPtr<CanvasActiveInfo> create(const String& name, unsigned type, int size)
+ {
+ return adoptRef(new CanvasActiveInfo(name, type, size));
+ }
+ String name() const { return m_name; }
+ unsigned type() const { return m_type; }
+ int size() const { return m_size; }
+
+private:
+ CanvasActiveInfo(const String& name, unsigned type, int size)
+ : m_name(name)
+ , m_type(type)
+ , m_size(size)
+ {
+ ASSERT(name.length());
+ ASSERT(type);
+ ASSERT(size);
+ }
+ String m_name;
+ unsigned m_type;
+ int m_size;
+};
+
+}
+
+#endif // CanvasActiveInfo_h
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.idl b/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.idl
new file mode 100644
index 0000000..6ceae29
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasActiveInfo.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+ interface [
+ Conditional=3D_CANVAS,
+ ] CanvasActiveInfo {
+ readonly attribute int size;
+ readonly attribute unsigned int type;
+ readonly attribute DOMString name;
+ };
+
+}
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.cpp
index 37cc840..6b5688a 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.cpp
@@ -36,7 +36,7 @@ namespace WebCore {
: m_offset(offset)
, m_buffer(buffer)
{
- m_baseAddress = static_cast<char*>(m_buffer->data()) + m_offset;
+ m_baseAddress = m_buffer ? (static_cast<char*>(m_buffer->data()) + m_offset) : 0;
}
CanvasArray::~CanvasArray()
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.h
index e34ad8c..8cedbbe 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.h
@@ -34,6 +34,14 @@
namespace WebCore {
class CanvasArray : public RefCounted<CanvasArray> {
public:
+ virtual bool isByteArray() const { return false; }
+ virtual bool isUnsignedByteArray() const { return false; }
+ virtual bool isShortArray() const { return false; }
+ virtual bool isUnsignedShortArray() const { return false; }
+ virtual bool isIntArray() const { return false; }
+ virtual bool isUnsignedIntArray() const { return false; }
+ virtual bool isFloatArray() const { return false; }
+
PassRefPtr<CanvasArrayBuffer> buffer() {
return m_buffer;
}
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.idl b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.idl
index 01bb37e..63b2dcd 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.idl
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasArray.idl
@@ -24,7 +24,7 @@
*/
module html {
- interface [Conditional=3D_CANVAS] CanvasArray {
+ interface [Conditional=3D_CANVAS, CustomToJS] CanvasArray {
readonly attribute long length;
int sizeInBytes();
int alignedSizeInBytes();
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.cpp
index 8375334..0f72ccf 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.cpp
@@ -48,12 +48,13 @@ PassRefPtr<CanvasByteArray> CanvasByteArray::create(signed char* array, unsigned
PassRefPtr<CanvasByteArray> CanvasByteArray::create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length)
{
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(signed char))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(signed char))) > buffer->byteLength())
+ return NULL;
}
-
+
return adoptRef(new CanvasByteArray(buffer, offset, length));
}
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.h
index 34ae292..69cadf7 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasByteArray.h
@@ -27,6 +27,7 @@
#define CanvasByteArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -37,6 +38,8 @@ namespace WebCore {
class CanvasByteArray : public CanvasArray {
public:
+ virtual bool isByteArray() const { return true; }
+
static PassRefPtr<CanvasByteArray> create(unsigned length);
static PassRefPtr<CanvasByteArray> create(signed char* array, unsigned length);
static PassRefPtr<CanvasByteArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.cpp
index c78be1a..09561cb 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.cpp
@@ -48,16 +48,15 @@ namespace WebCore {
PassRefPtr<CanvasFloatArray> CanvasFloatArray::create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length)
{
// Make sure the offset results in valid alignment.
- if ((offset % sizeof(float)) != 0) {
+ if ((offset % sizeof(float)) != 0)
return NULL;
- }
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(float))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(float))) > buffer->byteLength())
+ return NULL;
}
-
return adoptRef(new CanvasFloatArray(buffer, offset, length));
}
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.h
index 49bd897..d2dc4ff 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasFloatArray.h
@@ -35,6 +35,8 @@ namespace WebCore {
class CanvasFloatArray : public CanvasArray {
public:
+ virtual bool isFloatArray() const { return true; }
+
static PassRefPtr<CanvasFloatArray> create(unsigned length);
static PassRefPtr<CanvasFloatArray> create(float* array, unsigned length);
static PassRefPtr<CanvasFloatArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.cpp
index 9a07b6e..4716d7b 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.cpp
@@ -51,16 +51,16 @@ namespace WebCore {
unsigned length)
{
// Make sure the offset results in valid alignment.
- if ((offset % sizeof(int)) != 0) {
+ if ((offset % sizeof(int)) != 0)
return NULL;
- }
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(int))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(int))) > buffer->byteLength())
+ return NULL;
}
-
+
return adoptRef(new CanvasIntArray(buffer, offset, length));
}
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.h
index ace6410..4977034 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasIntArray.h
@@ -27,6 +27,7 @@
#define CanvasIntArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -35,6 +36,8 @@ namespace WebCore {
class CanvasIntArray : public CanvasArray {
public:
+ virtual bool isIntArray() const { return true; }
+
static PassRefPtr<CanvasIntArray> create(unsigned length);
static PassRefPtr<CanvasIntArray> create(int* array, unsigned length);
static PassRefPtr<CanvasIntArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasObject.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasObject.h
index 413da71..748278d 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasObject.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasObject.h
@@ -48,12 +48,12 @@ namespace WebCore {
deleteObject();
m_context = 0;
}
-
+
+ CanvasRenderingContext3D* context() const { return m_context; }
+
protected:
CanvasObject(CanvasRenderingContext3D*);
virtual void _deleteObject(Platform3DObject) = 0;
-
- CanvasRenderingContext3D* context() const { return m_context; }
private:
Platform3DObject m_object;
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext2D.cpp
index ed462fc..5e25b93 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext2D.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext2D.cpp
@@ -687,7 +687,7 @@ void CanvasRenderingContext2D::clip()
return;
if (!state().m_invertibleCTM)
return;
- c->clip(m_path);
+ c->canvasClip(m_path);
#if ENABLE(DASHBOARD_SUPPORT)
clearPathForDashboardBackwardCompatibilityMode();
#endif
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.cpp
index b810500..9cca57b 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.cpp
@@ -28,6 +28,8 @@
#if ENABLE(3D_CANVAS)
#include "CanvasRenderingContext3D.h"
+
+#include "CanvasActiveInfo.h"
#include "CanvasBuffer.h"
#include "CanvasFramebuffer.h"
#include "CanvasProgram.h"
@@ -477,6 +479,26 @@ void CanvasRenderingContext3D::generateMipmap(unsigned long target)
cleanupAfterGraphicsCall(false);
}
+PassRefPtr<CanvasActiveInfo> CanvasRenderingContext3D::getActiveAttrib(CanvasProgram* program, unsigned long index, ExceptionCode& ec)
+{
+ ActiveInfo info;
+ if (!program || program->context() != this || !m_context.getActiveAttrib(program, index, info)) {
+ ec = INDEX_SIZE_ERR;
+ return 0;
+ }
+ return CanvasActiveInfo::create(info.name, info.type, info.size);
+}
+
+PassRefPtr<CanvasActiveInfo> CanvasRenderingContext3D::getActiveUniform(CanvasProgram* program, unsigned long index, ExceptionCode& ec)
+{
+ ActiveInfo info;
+ if (!program || program->context() != this || !m_context.getActiveUniform(program, index, info)) {
+ ec = INDEX_SIZE_ERR;
+ return 0;
+ }
+ return CanvasActiveInfo::create(info.name, info.type, info.size);
+}
+
int CanvasRenderingContext3D::getAttribLocation(CanvasProgram* program, const String& name)
{
return m_context.getAttribLocation(program, name);
@@ -792,6 +814,13 @@ void CanvasRenderingContext3D::polygonOffset(double factor, double units)
cleanupAfterGraphicsCall(false);
}
+PassRefPtr<CanvasArray> CanvasRenderingContext3D::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type)
+{
+ RefPtr<CanvasArray> array = m_context.readPixels(x, y, width, height, format, type);
+ cleanupAfterGraphicsCall(false);
+ return array;
+}
+
void CanvasRenderingContext3D::releaseShaderCompiler()
{
m_context.releaseShaderCompiler();
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.h
index a4a68fc..526281b 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.h
@@ -36,6 +36,7 @@
namespace WebCore {
+class CanvasActiveInfo;
class CanvasBuffer;
class CanvasFramebuffer;
class CanvasObject;
@@ -123,7 +124,10 @@ class WebKitCSSMatrix;
void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, CanvasTexture*, long level);
void frontFace(unsigned long mode);
void generateMipmap(unsigned long target);
-
+
+ PassRefPtr<CanvasActiveInfo> getActiveAttrib(CanvasProgram*, unsigned long index, ExceptionCode&);
+ PassRefPtr<CanvasActiveInfo> getActiveUniform(CanvasProgram*, unsigned long index, ExceptionCode&);
+
int getAttribLocation(CanvasProgram*, const String& name);
bool getBoolean(unsigned long pname);
@@ -187,8 +191,7 @@ class WebKitCSSMatrix;
void pixelStorei(unsigned long pname, long param);
void polygonOffset(double factor, double units);
- // TBD
- //void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels);
+ PassRefPtr<CanvasArray> readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type);
void releaseShaderCompiler();
void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.idl b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.idl
index 4b9a889..db0fff3 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.idl
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasRenderingContext3D.idl
@@ -530,8 +530,11 @@ module html {
void generateMipmap(in unsigned long target);
// FIXME: these need to be added per the WebGL spec
- // CanvasActiveInfo getActiveAttrib(GLuint program, GLuint index);
- // CanvasActiveInfo getActiveUniform(GLuint program, GLuint index);
+ CanvasActiveInfo getActiveAttrib(in CanvasProgram program, in unsigned long index)
+ raises (DOMException);
+ CanvasActiveInfo getActiveUniform(in CanvasProgram program, in unsigned long index)
+ raises (DOMException);
+
// CanvasShaderArray glGetAttachedShaders(GLuint program);
int getAttribLocation(in CanvasProgram program, in DOMString name);
@@ -597,8 +600,7 @@ module html {
void pixelStorei(in unsigned long pname, in long param);
void polygonOffset(in double factor, in double units);
- // FIXME
- //void readPixels(in long x, in long y, in unsigned long width, in unsigned long height, in unsigned long format, in unsigned long type, void* pixels);
+ CanvasArray readPixels(in long x, in long y, in unsigned long width, in unsigned long height, in unsigned long format, in unsigned long type);
void releaseShaderCompiler();
void renderbufferStorage(in unsigned long target, in unsigned long internalformat, in unsigned long width, in unsigned long height);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.cpp
index 44fc18e..d0cf135 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.cpp
@@ -51,14 +51,14 @@ namespace WebCore {
unsigned length)
{
// Make sure the offset results in valid alignment.
- if ((offset % sizeof(short)) != 0) {
+ if ((offset % sizeof(short)) != 0)
return NULL;
- }
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(short))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(short))) > buffer->byteLength())
+ return NULL;
}
return adoptRef(new CanvasShortArray(buffer, offset, length));
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.h
index 2ac86b5..1eeef0c 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasShortArray.h
@@ -27,6 +27,7 @@
#define CanvasShortArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -35,6 +36,8 @@ namespace WebCore {
class CanvasShortArray : public CanvasArray {
public:
+ virtual bool isShortArray() const { return true; }
+
static PassRefPtr<CanvasShortArray> create(unsigned length);
static PassRefPtr<CanvasShortArray> create(short* array, unsigned length);
static PassRefPtr<CanvasShortArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.cpp
index 0ad7b2b..a75066c 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.cpp
@@ -50,10 +50,11 @@ namespace WebCore {
int offset,
unsigned length)
{
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(unsigned char))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(unsigned char))) > buffer->byteLength())
+ return NULL;
}
return adoptRef(new CanvasUnsignedByteArray(buffer, offset, length));
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.h
index f1b7348..d8864e0 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedByteArray.h
@@ -27,6 +27,7 @@
#define CanvasUnsignedByteArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -35,6 +36,8 @@ namespace WebCore {
class CanvasUnsignedByteArray : public CanvasArray {
public:
+ virtual bool isUnsignedByteArray() const { return true; }
+
static PassRefPtr<CanvasUnsignedByteArray> create(unsigned length);
static PassRefPtr<CanvasUnsignedByteArray> create(unsigned char* array, unsigned length);
static PassRefPtr<CanvasUnsignedByteArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.cpp
index e00e783..bd26343 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.cpp
@@ -55,10 +55,11 @@ namespace WebCore {
return NULL;
}
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(unsigned int))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(unsigned int))) > buffer->byteLength())
+ return NULL;
}
return adoptRef(new CanvasUnsignedIntArray(buffer, offset, length));
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.h
index 21f0d10..10b8edf 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedIntArray.h
@@ -27,6 +27,7 @@
#define CanvasUnsignedIntArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -35,6 +36,8 @@ namespace WebCore {
class CanvasUnsignedIntArray : public CanvasArray {
public:
+ virtual bool isUnsignedIntArray() const { return true; }
+
static PassRefPtr<CanvasUnsignedIntArray> create(unsigned length);
static PassRefPtr<CanvasUnsignedIntArray> create(unsigned int* array, unsigned length);
static PassRefPtr<CanvasUnsignedIntArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.cpp b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.cpp
index 03a4ce1..45d827b 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.cpp
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.cpp
@@ -55,10 +55,11 @@ namespace WebCore {
return NULL;
}
- // Check to make sure we are talking about a valid region of
- // the given CanvasArrayBuffer's storage.
- if ((offset + (length * sizeof(unsigned short))) > buffer->byteLength()) {
- return NULL;
+ if (buffer) {
+ // Check to make sure we are talking about a valid region of
+ // the given CanvasArrayBuffer's storage.
+ if ((offset + (length * sizeof(unsigned short))) > buffer->byteLength())
+ return NULL;
}
return adoptRef(new CanvasUnsignedShortArray(buffer, offset, length));
diff --git a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.h b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.h
index 324e868..9e27566 100644
--- a/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.h
+++ b/src/3rdparty/webkit/WebCore/html/canvas/CanvasUnsignedShortArray.h
@@ -27,6 +27,7 @@
#define CanvasUnsignedShortArray_h
#include "CanvasArray.h"
+#include <limits>
#include <wtf/MathExtras.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -35,6 +36,8 @@ namespace WebCore {
class CanvasUnsignedShortArray : public CanvasArray {
public:
+ virtual bool isUnsignedShortArray() const { return true; }
+
static PassRefPtr<CanvasUnsignedShortArray> create(unsigned length);
static PassRefPtr<CanvasUnsignedShortArray> create(unsigned short* array, unsigned length);
static PassRefPtr<CanvasUnsignedShortArray> create(PassRefPtr<CanvasArrayBuffer> buffer, int offset, unsigned length);
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp
index 752ec0c..83a9719 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.cpp
@@ -46,6 +46,7 @@
#include "InspectorFrontend.h"
#include "InspectorResource.h"
#include "Pasteboard.h"
+#include "ScriptArray.h"
#include "ScriptFunctionCall.h"
#if ENABLE(DOM_STORAGE)
@@ -257,33 +258,26 @@ const String& InspectorBackend::platform() const
return platform;
}
-void InspectorBackend::enableTimeline(bool always)
+void InspectorBackend::startTimelineProfiler()
{
if (m_inspectorController)
- m_inspectorController->enableTimeline(always);
+ m_inspectorController->startTimelineProfiler();
}
-void InspectorBackend::disableTimeline(bool always)
+void InspectorBackend::stopTimelineProfiler()
{
if (m_inspectorController)
- m_inspectorController->disableTimeline(always);
+ m_inspectorController->stopTimelineProfiler();
}
-bool InspectorBackend::timelineEnabled() const
+bool InspectorBackend::timelineProfilerEnabled() const
{
if (m_inspectorController)
- return m_inspectorController->timelineEnabled();
+ return m_inspectorController->timelineProfilerEnabled();
return false;
}
#if ENABLE(JAVASCRIPT_DEBUGGER)
-const ProfilesArray& InspectorBackend::profiles() const
-{
- if (m_inspectorController)
- return m_inspectorController->profiles();
- return m_emptyProfiles;
-}
-
void InspectorBackend::startProfiling()
{
if (m_inspectorController)
@@ -315,6 +309,18 @@ bool InspectorBackend::profilerEnabled()
return false;
}
+void InspectorBackend::getProfileHeaders(long callId)
+{
+ if (m_inspectorController)
+ m_inspectorController->getProfileHeaders(callId);
+}
+
+void InspectorBackend::getProfile(long callId, unsigned uid)
+{
+ if (m_inspectorController)
+ m_inspectorController->getProfile(callId, uid);
+}
+
void InspectorBackend::enableDebugger(bool always)
{
if (m_inspectorController)
@@ -395,7 +401,7 @@ void InspectorBackend::stepOutOfFunctionInDebugger()
#endif
-void InspectorBackend::dispatchOnInjectedScript(long callId, const String& methodName, const String& arguments)
+void InspectorBackend::dispatchOnInjectedScript(long callId, const String& methodName, const String& arguments, bool async)
{
InspectorFrontend* frontend = inspectorFrontend();
if (!frontend)
@@ -404,8 +410,12 @@ void InspectorBackend::dispatchOnInjectedScript(long callId, const String& metho
ScriptFunctionCall function(m_inspectorController->m_scriptState, m_inspectorController->m_injectedScriptObj, "dispatch");
function.appendArgument(methodName);
function.appendArgument(arguments);
+ if (async)
+ function.appendArgument(static_cast<int>(callId));
bool hadException = false;
ScriptValue result = function.call(hadException);
+ if (async)
+ return; // InjectedScript will return result asynchronously by means of ::reportDidDispatchOnInjectedScript.
if (hadException)
frontend->didDispatchOnInjectedScript(callId, "", true);
else
@@ -450,18 +460,48 @@ void InspectorBackend::copyNode(long nodeId)
String markup = createMarkup(node);
Pasteboard::generalPasteboard()->writePlainText(markup);
}
+
+void InspectorBackend::removeNode(long callId, long nodeId)
+{
+ InspectorFrontend* frontend = inspectorFrontend();
+ if (!frontend)
+ return;
+
+ Node* node = nodeForId(nodeId);
+ if (!node) {
+ // Use -1 to denote an error condition.
+ frontend->didRemoveNode(callId, -1);
+ return;
+ }
+
+ Node* parentNode = node->parentNode();
+ if (!parentNode) {
+ frontend->didRemoveNode(callId, -1);
+ return;
+ }
+
+ ExceptionCode code;
+ parentNode->removeChild(node, code);
+ if (code) {
+ frontend->didRemoveNode(callId, -1);
+ return;
+ }
+
+ frontend->didRemoveNode(callId, nodeId);
+}
-void InspectorBackend::getCookies(long callId)
+void InspectorBackend::getCookies(long callId, const String& domain)
{
- if (InspectorDOMAgent* domAgent = inspectorDOMAgent())
- domAgent->getCookies(callId);
+ if (!m_inspectorController)
+ return;
+ m_inspectorController->getCookies(callId, domain);
}
-void InspectorBackend::deleteCookie(const String& cookieName)
+void InspectorBackend::deleteCookie(const String& cookieName, const String& domain)
{
if (!m_inspectorController)
return;
- m_inspectorController->deleteCookie(cookieName);
+ m_inspectorController->deleteCookie(cookieName, domain);
}
void InspectorBackend::highlight(long nodeId)
@@ -477,10 +517,10 @@ Node* InspectorBackend::nodeForId(long nodeId)
return 0;
}
-ScriptValue InspectorBackend::wrapObject(const ScriptValue& object)
+ScriptValue InspectorBackend::wrapObject(const ScriptValue& object, const String& objectGroup)
{
if (m_inspectorController)
- return m_inspectorController->wrapObject(object);
+ return m_inspectorController->wrapObject(object, objectGroup);
return ScriptValue();
}
@@ -491,6 +531,12 @@ ScriptValue InspectorBackend::unwrapObject(const String& objectId)
return ScriptValue();
}
+void InspectorBackend::releaseWrapperObjectGroup(const String& objectGroup)
+{
+ if (m_inspectorController)
+ m_inspectorController->releaseWrapperObjectGroup(objectGroup);
+}
+
long InspectorBackend::pushNodePathToFrontend(Node* node, bool selectInUI)
{
InspectorFrontend* frontend = inspectorFrontend();
@@ -510,10 +556,32 @@ void InspectorBackend::addNodesToSearchResult(const String& nodeIds)
}
#if ENABLE(DATABASE)
+Database* InspectorBackend::databaseForId(long databaseId)
+{
+ if (m_inspectorController)
+ return m_inspectorController->databaseForId(databaseId);
+ return 0;
+}
+
void InspectorBackend::selectDatabase(Database* database)
{
- if (InspectorFrontend* frontend = inspectorFrontend())
- frontend->selectDatabase(database);
+ if (m_inspectorController)
+ m_inspectorController->selectDatabase(database);
+}
+
+void InspectorBackend::getDatabaseTableNames(long callId, long databaseId)
+{
+ if (InspectorFrontend* frontend = inspectorFrontend()) {
+ ScriptArray result = frontend->newScriptArray();
+ Database* database = m_inspectorController->databaseForId(databaseId);
+ if (database) {
+ Vector<String> tableNames = database->tableNames();
+ unsigned length = tableNames.size();
+ for (unsigned i = 0; i < length; ++i)
+ result.set(i, tableNames[i]);
+ }
+ frontend->didGetDatabaseTableNames(callId, result);
+ }
}
#endif
@@ -543,6 +611,18 @@ void InspectorBackend::removeDOMStorageItem(long callId, long storageId, const S
}
#endif
+void InspectorBackend::didEvaluateForTestInFrontend(long callId, const String& jsonResult)
+{
+ if (m_inspectorController)
+ m_inspectorController->didEvaluateForTestInFrontend(callId, jsonResult);
+}
+
+void InspectorBackend::reportDidDispatchOnInjectedScript(long callId, const String& result, bool isException)
+{
+ if (InspectorFrontend* frontend = inspectorFrontend())
+ frontend->didDispatchOnInjectedScript(callId, result, isException);
+}
+
InspectorDOMAgent* InspectorBackend::inspectorDOMAgent()
{
if (!m_inspectorController)
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h
index 72278a3..9d75e2f 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.h
@@ -95,13 +95,11 @@ public:
const String& platform() const;
- void enableTimeline(bool always);
- void disableTimeline(bool always);
- bool timelineEnabled() const;
+ void startTimelineProfiler();
+ void stopTimelineProfiler();
+ bool timelineProfilerEnabled() const;
#if ENABLE(JAVASCRIPT_DEBUGGER)
- const ProfilesArray& profiles() const;
-
void startProfiling();
void stopProfiling();
@@ -109,6 +107,9 @@ public:
void disableProfiler(bool always);
bool profilerEnabled();
+ void getProfileHeaders(long callId);
+ void getProfile(long callId, unsigned uid);
+
void enableDebugger(bool always);
void disableDebugger(bool always);
bool debuggerEnabled() const;
@@ -130,26 +131,30 @@ public:
void stepOutOfFunctionInDebugger();
#endif
- void dispatchOnInjectedScript(long callId, const String& methodName, const String& arguments);
+ void dispatchOnInjectedScript(long callId, const String& methodName, const String& arguments, bool async);
void getChildNodes(long callId, long nodeId);
void setAttribute(long callId, long elementId, const String& name, const String& value);
void removeAttribute(long callId, long elementId, const String& name);
void setTextNodeValue(long callId, long nodeId, const String& value);
void getEventListenersForNode(long callId, long nodeId);
void copyNode(long nodeId);
+ void removeNode(long callId, long nodeId);
- void getCookies(long callId);
- void deleteCookie(const String& cookieName);
+ void getCookies(long callId, const String& domain);
+ void deleteCookie(const String& cookieName, const String& domain);
// Generic code called from custom implementations.
void highlight(long nodeId);
Node* nodeForId(long nodeId);
- ScriptValue wrapObject(const ScriptValue& object);
+ ScriptValue wrapObject(const ScriptValue& object, const String& objectGroup);
ScriptValue unwrapObject(const String& objectId);
+ void releaseWrapperObjectGroup(const String& objectGroup);
long pushNodePathToFrontend(Node* node, bool selectInUI);
void addNodesToSearchResult(const String& nodeIds);
#if ENABLE(DATABASE)
+ Database* databaseForId(long databaseId);
void selectDatabase(Database* database);
+ void getDatabaseTableNames(long callId, long databaseId);
#endif
#if ENABLE(DOM_STORAGE)
void selectDOMStorage(Storage* storage);
@@ -157,6 +162,8 @@ public:
void setDOMStorageItem(long callId, long storageId, const String& key, const String& value);
void removeDOMStorageItem(long callId, long storageId, const String& key);
#endif
+ void reportDidDispatchOnInjectedScript(long callId, const String& result, bool isException);
+ void didEvaluateForTestInFrontend(long callId, const String& jsonResult);
private:
InspectorBackend(InspectorController* inspectorController, InspectorClient* client);
@@ -165,9 +172,6 @@ private:
InspectorController* m_inspectorController;
InspectorClient* m_client;
-#if ENABLE(JAVASCRIPT_DEBUGGER)
- ProfilesArray m_emptyProfiles;
-#endif
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl
index 5c6babb..7a00c6a 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorBackend.idl
@@ -52,17 +52,18 @@ module core {
boolean addSourceToFrame(in DOMString mimeType, in DOMString sourceValue, in Node frame);
[Custom] void search(in Node node, in DOMString query);
#if defined(ENABLE_DATABASE) && ENABLE_DATABASE
- [Custom] DOMObject databaseTableNames(in Database database);
+ void getDatabaseTableNames(in long callId, in long databaseId);
#endif
+
[Custom] DOMObject setting(in DOMString key);
[Custom] void setSetting(in DOMString key, in DOMObject value);
[Custom] DOMWindow inspectedWindow();
DOMString localizedStringsURL();
DOMString hiddenPanels();
DOMString platform();
- void enableTimeline(in boolean always);
- void disableTimeline(in boolean always);
- boolean timelineEnabled();
+ void startTimelineProfiler();
+ void stopTimelineProfiler();
+ boolean timelineProfilerEnabled();
[ImplementationFunction=moveWindowBy] void moveByUnrestricted(in float x, in float y);
void setAttachedWindowHeight(in unsigned long height);
[Custom] DOMObject wrapCallback(in DOMObject callback);
@@ -99,27 +100,32 @@ module core {
void startProfiling();
void stopProfiling();
- [Custom] Array profiles();
+ void getProfileHeaders(in long callId);
+ void getProfile(in long callId, in unsigned long uid);
#endif
- void dispatchOnInjectedScript(in long callId, in DOMString methodName, in DOMString arguments);
+ void dispatchOnInjectedScript(in long callId, in DOMString methodName, in DOMString arguments, in boolean async);
void getChildNodes(in long callId, in long nodeId);
void setAttribute(in long callId, in long elementId, in DOMString name, in DOMString value);
void removeAttribute(in long callId, in long elementId, in DOMString name);
void setTextNodeValue(in long callId, in long nodeId, in DOMString value);
void getEventListenersForNode(in long callId, in long nodeId);
void copyNode(in long nodeId);
+ void removeNode(in long callId, in long nodeId);
- void getCookies(in long callId);
- void deleteCookie(in DOMString cookieName);
+ void getCookies(in long callId, in DOMString domain);
+ void deleteCookie(in DOMString cookieName, in DOMString domain);
// Called from InjectedScript.
+ // TODO: extract into a separate IDL.
[Custom] DOMObject nodeForId(in long nodeId);
- [Custom] long wrapObject(in DOMObject object);
+ [Custom] long wrapObject(in DOMObject object, in DOMString objectGroup);
[Custom] DOMObject unwrapObject(in long objectId);
+ void releaseWrapperObjectGroup(in DOMString objectGroup);
[Custom] int pushNodePathToFrontend(in DOMObject node, in boolean selectInUI);
void addNodesToSearchResult(in DOMString nodeIds);
#if defined(ENABLE_DATABASE) && ENABLE_DATABASE
[Custom] void selectDatabase(in DOMObject database);
+ [Custom] DOMObject databaseForId(in long databaseId);
#endif
#if defined(ENABLE_DOM_STORAGE) && ENABLE_DOM_STORAGE
[Custom] void selectDOMStorage(in DOMObject storage);
@@ -127,5 +133,7 @@ module core {
void setDOMStorageItem(in long callId, in long storageId, in DOMString key, in DOMString value);
void removeDOMStorageItem(in long callId, in long storageId, in DOMString key);
#endif
+ void reportDidDispatchOnInjectedScript(in long callId, in DOMString result, in boolean isException);
+ void didEvaluateForTestInFrontend(in long callId, in DOMString jsonResult);
};
}
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp
index bb77ebf..a5b8cbf 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorController.cpp
@@ -36,6 +36,7 @@
#include "CachedResource.h"
#include "Console.h"
#include "ConsoleMessage.h"
+#include "Cookie.h"
#include "CookieJar.h"
#include "Document.h"
#include "DocumentLoader.h"
@@ -76,6 +77,7 @@
#include "TextEncoding.h"
#include "TextIterator.h"
#include <wtf/CurrentTime.h>
+#include <wtf/ListHashSet.h>
#include <wtf/RefCounted.h>
#include <wtf/StdLibExtras.h>
@@ -105,12 +107,12 @@ using namespace std;
namespace WebCore {
static const char* const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
+static const char* const CPUProfileType = "CPU";
static const char* const resourceTrackingEnabledSettingName = "resourceTrackingEnabled";
static const char* const debuggerEnabledSettingName = "debuggerEnabled";
static const char* const profilerEnabledSettingName = "profilerEnabled";
static const char* const inspectorAttachedHeightName = "inspectorAttachedHeight";
static const char* const lastActivePanelSettingName = "lastActivePanel";
-static const char* const timelineEnabledSettingName = "timelineEnabled";
static const unsigned defaultAttachedHeight = 300;
static const float minimumAttachedHeight = 250.0f;
@@ -179,11 +181,6 @@ void InspectorController::inspectedPageDestroyed()
if (m_scriptState)
ScriptGlobalObject::remove(m_scriptState, "InspectorController");
- if (m_page) {
- m_page->setParentInspectorController(0);
- m_page = 0;
- }
-
ASSERT(m_inspectedPage);
m_inspectedPage = 0;
@@ -380,7 +377,7 @@ void InspectorController::addConsoleMessage(ScriptState* scriptState, ConsoleMes
m_consoleMessages.append(consoleMessage);
}
- if (m_frontend)
+ if (windowVisible())
m_previousMessage->addToConsole(m_frontend.get());
}
@@ -390,7 +387,7 @@ void InspectorController::clearConsoleMessages(bool clearUI)
m_consoleMessages.clear();
m_previousMessage = 0;
m_groupLevel = 0;
- m_idToConsoleObject.clear();
+ releaseWrapperObjectGroup("console");
if (m_domAgent)
m_domAgent->releaseDanglingNodes();
if (clearUI && m_frontend)
@@ -556,10 +553,7 @@ void InspectorController::setFrontendProxyObject(ScriptState* scriptState, Scrip
m_injectedScriptObj = injectedScriptObj;
m_frontend.set(new InspectorFrontend(this, scriptState, webInspectorObj));
m_domAgent = new InspectorDOMAgent(m_frontend.get());
-
- Setting timelineEnabled = setting(timelineEnabledSettingName);
- if (timelineEnabled.type() == Setting::BooleanType && timelineEnabled.booleanValue())
- m_timelineAgent = new InspectorTimelineAgent(m_frontend.get());
+ m_timelineAgent = 0;
}
void InspectorController::show()
@@ -621,6 +615,9 @@ void InspectorController::close()
m_domAgent = 0;
m_timelineAgent = 0;
m_scriptState = 0;
+ if (m_page)
+ m_page->setParentInspectorController(0);
+ m_page = 0;
}
void InspectorController::showWindow()
@@ -654,25 +651,32 @@ void InspectorController::populateScriptObjects()
m_domAgent->setDocument(m_inspectedPage->mainFrame()->document());
ResourcesMap::iterator resourcesEnd = m_resources.end();
- for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it)
+ for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
it->second->createScriptObject(m_frontend.get());
+ m_frontend->addCookieDomain(it->second->frame()->document()->url().host());
+ }
unsigned messageCount = m_consoleMessages.size();
for (unsigned i = 0; i < messageCount; ++i)
m_consoleMessages[i]->addToConsole(m_frontend.get());
#if ENABLE(DATABASE)
- DatabaseResourcesSet::iterator databasesEnd = m_databaseResources.end();
- for (DatabaseResourcesSet::iterator it = m_databaseResources.begin(); it != databasesEnd; ++it)
- (*it)->bind(m_frontend.get());
+ DatabaseResourcesMap::iterator databasesEnd = m_databaseResources.end();
+ for (DatabaseResourcesMap::iterator it = m_databaseResources.begin(); it != databasesEnd; ++it)
+ it->second->bind(m_frontend.get());
#endif
#if ENABLE(DOM_STORAGE)
- DOMStorageResourcesSet::iterator domStorageEnd = m_domStorageResources.end();
- for (DOMStorageResourcesSet::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
- (*it)->bind(m_frontend.get());
+ DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
+ for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
+ it->second->bind(m_frontend.get());
#endif
m_frontend->populateInterface();
+
+ // Dispatch pending frontend commands
+ for (Vector<pair<long, String> >::iterator it = m_pendingEvaluateTestCommands.begin(); it != m_pendingEvaluateTestCommands.end(); ++it)
+ m_frontend->evaluateForTestInFrontend((*it).first, (*it).second);
+ m_pendingEvaluateTestCommands.clear();
}
void InspectorController::resetScriptObjects()
@@ -685,14 +689,14 @@ void InspectorController::resetScriptObjects()
it->second->releaseScriptObject(m_frontend.get(), false);
#if ENABLE(DATABASE)
- DatabaseResourcesSet::iterator databasesEnd = m_databaseResources.end();
- for (DatabaseResourcesSet::iterator it = m_databaseResources.begin(); it != databasesEnd; ++it)
- (*it)->unbind();
+ DatabaseResourcesMap::iterator databasesEnd = m_databaseResources.end();
+ for (DatabaseResourcesMap::iterator it = m_databaseResources.begin(); it != databasesEnd; ++it)
+ it->second->unbind();
#endif
#if ENABLE(DOM_STORAGE)
- DOMStorageResourcesSet::iterator domStorageEnd = m_domStorageResources.end();
- for (DOMStorageResourcesSet::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
- (*it)->unbind();
+ DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
+ for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
+ it->second->unbind();
#endif
if (m_timelineAgent)
@@ -700,6 +704,8 @@ void InspectorController::resetScriptObjects()
m_frontend->reset();
m_domAgent->setDocument(0);
+ m_objectGroups.clear();
+ m_idToWrappedObject.clear();
}
void InspectorController::pruneResources(ResourcesMap* resourceMap, DocumentLoader* loaderToKeep)
@@ -715,7 +721,7 @@ void InspectorController::pruneResources(ResourcesMap* resourceMap, DocumentLoad
if (!loaderToKeep || !resource->isSameLoader(loaderToKeep)) {
removeResource(resource);
- if (m_frontend)
+ if (windowVisible())
resource->releaseScriptObject(m_frontend.get(), true);
}
}
@@ -756,7 +762,8 @@ void InspectorController::didCommitLoad(DocumentLoader* loader)
// We don't add the main resource until its load is committed. This is
// needed to keep the load for a user-entered URL from showing up in the
// list of resources for the page they are navigating away from.
- m_mainResource->createScriptObject(m_frontend.get());
+ if (windowVisible())
+ m_mainResource->createScriptObject(m_frontend.get());
} else {
// Pages loaded from the page cache are committed before
// m_mainResource is the right resource for this load, so we
@@ -850,7 +857,7 @@ void InspectorController::didLoadResourceFromMemoryCache(DocumentLoader* loader,
ensureResourceTrackingSettingsLoaded();
if (!isMainResource && !m_resourceTrackingEnabled)
return;
-
+
RefPtr<InspectorResource> resource = InspectorResource::createCached(m_nextIdentifier--, loader, cachedResource);
if (isMainResource) {
@@ -860,7 +867,7 @@ void InspectorController::didLoadResourceFromMemoryCache(DocumentLoader* loader,
addResource(resource.get());
- if (m_frontend)
+ if (windowVisible())
resource->createScriptObject(m_frontend.get());
}
@@ -886,10 +893,34 @@ void InspectorController::identifierForInitialRequest(unsigned long identifier,
addResource(resource.get());
- if (m_frontend && loader->frameLoader()->isLoadingFromCachedPage() && resource == m_mainResource)
+ if (windowVisible() && loader->frameLoader()->isLoadingFromCachedPage() && resource == m_mainResource)
resource->createScriptObject(m_frontend.get());
}
+void InspectorController::mainResourceFiredDOMContentEvent(DocumentLoader* loader, const KURL& url)
+{
+ if (!enabled() || !isMainResourceLoader(loader, url))
+ return;
+
+ if (m_mainResource) {
+ m_mainResource->markDOMContentEventTime();
+ if (windowVisible())
+ m_mainResource->updateScriptObject(m_frontend.get());
+ }
+}
+
+void InspectorController::mainResourceFiredLoadEvent(DocumentLoader* loader, const KURL& url)
+{
+ if (!enabled() || !isMainResourceLoader(loader, url))
+ return;
+
+ if (m_mainResource) {
+ m_mainResource->markLoadEventTime();
+ if (windowVisible())
+ m_mainResource->updateScriptObject(m_frontend.get());
+ }
+}
+
bool InspectorController::isMainResourceLoader(DocumentLoader* loader, const KURL& requestUrl)
{
return loader->frame() == m_inspectedPage->mainFrame() && requestUrl == loader->requestURL();
@@ -908,7 +939,7 @@ void InspectorController::willSendRequest(DocumentLoader*, unsigned long identif
resource->updateResponse(redirectResponse);
}
- if (resource != m_mainResource && m_frontend)
+ if (resource != m_mainResource && windowVisible())
resource->createScriptObject(m_frontend.get());
}
@@ -921,7 +952,7 @@ void InspectorController::didReceiveResponse(DocumentLoader*, unsigned long iden
resource->updateResponse(response);
resource->markResponseReceivedTime();
- if (m_frontend)
+ if (windowVisible())
resource->updateScriptObject(m_frontend.get());
}
@@ -933,7 +964,7 @@ void InspectorController::didReceiveContentLength(DocumentLoader*, unsigned long
resource->addLength(lengthReceived);
- if (m_frontend)
+ if (windowVisible())
resource->updateScriptObject(m_frontend.get());
}
@@ -949,8 +980,10 @@ void InspectorController::didFinishLoading(DocumentLoader*, unsigned long identi
addResource(resource.get());
- if (m_frontend)
+ if (windowVisible()) {
resource->updateScriptObject(m_frontend.get());
+ m_frontend->addCookieDomain(resource->frame()->document()->url().host());
+ }
}
void InspectorController::didFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError& /*error*/)
@@ -966,7 +999,7 @@ void InspectorController::didFailLoading(DocumentLoader*, unsigned long identifi
addResource(resource.get());
- if (m_frontend)
+ if (windowVisible())
resource->updateScriptObject(m_frontend.get());
}
@@ -981,7 +1014,7 @@ void InspectorController::resourceRetrievedByXMLHttpRequest(unsigned long identi
resource->setXMLHttpResponseText(sourceString);
- if (m_frontend)
+ if (windowVisible())
resource->updateScriptObject(m_frontend.get());
}
@@ -998,7 +1031,7 @@ void InspectorController::scriptImported(unsigned long identifier, const String&
// thing by the Inspector. They should be made into distinct types.
resource->setXMLHttpResponseText(ScriptString(sourceString));
- if (m_frontend)
+ if (windowVisible())
resource->updateScriptObject(m_frontend.get());
}
@@ -1046,47 +1079,62 @@ void InspectorController::ensureResourceTrackingSettingsLoaded()
m_resourceTrackingEnabled = true;
}
-void InspectorController::enableTimeline(bool always)
+void InspectorController::startTimelineProfiler()
{
if (!enabled())
return;
- if (always)
- setSetting(timelineEnabledSettingName, Setting(true));
-
- if (m_timelineAgent.get())
+ if (m_timelineAgent)
return;
m_timelineAgent = new InspectorTimelineAgent(m_frontend.get());
if (m_frontend)
- m_frontend->timelineWasEnabled();
+ m_frontend->timelineProfilerWasStarted();
}
-void InspectorController::disableTimeline(bool always)
+void InspectorController::stopTimelineProfiler()
{
if (!enabled())
return;
- if (always)
- setSetting(timelineEnabledSettingName, Setting(false));
-
- if (!m_timelineAgent.get())
+ if (!m_timelineAgent)
return;
- m_timelineAgent.set(0);
+ m_timelineAgent = 0;
if (m_frontend)
- m_frontend->timelineWasDisabled();
+ m_frontend->timelineProfilerWasStopped();
}
-bool InspectorController::timelineEnabled() const
+bool InspectorController::timelineProfilerEnabled() const
{
if (!enabled())
return false;
- return m_timelineAgent.get();
+ return m_timelineAgent;
}
#if ENABLE(DATABASE)
+void InspectorController::selectDatabase(Database* database)
+{
+ if (!m_frontend)
+ return;
+
+ for (DatabaseResourcesMap::iterator it = m_databaseResources.begin(); it != m_databaseResources.end(); ++it) {
+ if (it->second->database() == database) {
+ m_frontend->selectDatabase(it->first);
+ break;
+ }
+ }
+}
+
+Database* InspectorController::databaseForId(int databaseId)
+{
+ DatabaseResourcesMap::iterator it = m_databaseResources.find(databaseId);
+ if (it == m_databaseResources.end())
+ return 0;
+ return it->second->database();
+}
+
void InspectorController::didOpenDatabase(Database* database, const String& domain, const String& name, const String& version)
{
if (!enabled())
@@ -1094,32 +1142,101 @@ void InspectorController::didOpenDatabase(Database* database, const String& doma
RefPtr<InspectorDatabaseResource> resource = InspectorDatabaseResource::create(database, domain, name, version);
- m_databaseResources.add(resource);
+ m_databaseResources.set(resource->id(), resource);
// Resources are only bound while visible.
- if (m_frontend && windowVisible())
+ if (windowVisible())
resource->bind(m_frontend.get());
}
#endif
+void InspectorController::getCookies(long callId, const String& host)
+{
+ if (!m_frontend)
+ return;
+
+ // If we can get raw cookies.
+ ListHashSet<Cookie> rawCookiesList;
+
+ // If we can't get raw cookies - fall back to String representation
+ String stringCookiesList;
+
+ // Return value to getRawCookies should be the same for every call because
+ // the return value is platform/network backend specific, and the call will
+ // always return the same true/false value.
+ bool rawCookiesImplemented = false;
+
+ ResourcesMap::iterator resourcesEnd = m_resources.end();
+ for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
+ Document* document = it->second->frame()->document();
+ if (document->url().host() == host) {
+ Vector<Cookie> docCookiesList;
+ rawCookiesImplemented = getRawCookies(document, document->cookieURL(), docCookiesList);
+
+ if (!rawCookiesImplemented)
+ // FIXME: We need duplication checking for the String representation of cookies.
+ stringCookiesList += document->cookie();
+ else {
+ int cookiesSize = docCookiesList.size();
+ for (int i = 0; i < cookiesSize; i++) {
+ if (!rawCookiesList.contains(docCookiesList[i]))
+ rawCookiesList.add(docCookiesList[i]);
+ }
+ }
+ }
+ }
+
+ if (!rawCookiesImplemented)
+ m_frontend->didGetCookies(callId, m_frontend->newScriptArray(), stringCookiesList);
+ else
+ m_frontend->didGetCookies(callId, buildArrayForCookies(rawCookiesList), String());
+}
+
+ScriptArray InspectorController::buildArrayForCookies(ListHashSet<Cookie>& cookiesList)
+{
+ ScriptArray cookies = m_frontend->newScriptArray();
+
+ ListHashSet<Cookie>::iterator end = cookiesList.end();
+ ListHashSet<Cookie>::iterator it = cookiesList.begin();
+ for (int i = 0; it != end; ++it, i++)
+ cookies.set(i, buildObjectForCookie(*it));
+
+ return cookies;
+}
+
+ScriptObject InspectorController::buildObjectForCookie(const Cookie& cookie)
+{
+ ScriptObject value = m_frontend->newScriptObject();
+ value.set("name", cookie.name);
+ value.set("value", cookie.value);
+ value.set("domain", cookie.domain);
+ value.set("path", cookie.path);
+ value.set("expires", cookie.expires);
+ value.set("size", (cookie.name.length() + cookie.value.length()));
+ value.set("httpOnly", cookie.httpOnly);
+ value.set("secure", cookie.secure);
+ value.set("session", cookie.session);
+ return value;
+}
+
#if ENABLE(DOM_STORAGE)
void InspectorController::didUseDOMStorage(StorageArea* storageArea, bool isLocalStorage, Frame* frame)
{
if (!enabled())
return;
- DOMStorageResourcesSet::iterator domStorageEnd = m_domStorageResources.end();
- for (DOMStorageResourcesSet::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
- if ((*it)->isSameHostAndType(frame, isLocalStorage))
+ DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
+ for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
+ if (it->second->isSameHostAndType(frame, isLocalStorage))
return;
RefPtr<Storage> domStorage = Storage::create(frame, storageArea);
RefPtr<InspectorDOMStorageResource> resource = InspectorDOMStorageResource::create(domStorage.get(), isLocalStorage, frame);
- m_domStorageResources.add(resource);
+ m_domStorageResources.set(resource->id(), resource);
// Resources are only bound while visible.
- if (m_frontend && windowVisible())
+ if (windowVisible())
resource->bind(m_frontend.get());
}
@@ -1132,10 +1249,10 @@ void InspectorController::selectDOMStorage(Storage* storage)
Frame* frame = storage->frame();
bool isLocalStorage = (frame->domWindow()->localStorage() == storage);
int storageResourceId = 0;
- DOMStorageResourcesSet::iterator domStorageEnd = m_domStorageResources.end();
- for (DOMStorageResourcesSet::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it) {
- if ((*it)->isSameHostAndType(frame, isLocalStorage)) {
- storageResourceId = (*it)->id();
+ DOMStorageResourcesMap::iterator domStorageEnd = m_domStorageResources.end();
+ for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it) {
+ if (it->second->isSameHostAndType(frame, isLocalStorage)) {
+ storageResourceId = it->first;
break;
}
}
@@ -1196,11 +1313,10 @@ void InspectorController::removeDOMStorageItem(long callId, long storageId, cons
InspectorDOMStorageResource* InspectorController::getDOMStorageResourceForId(int storageId)
{
- DOMStorageResourcesSet::iterator domStorageEnd = m_domStorageResources.end();
- for (DOMStorageResourcesSet::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it)
- if ((*it)->id() == storageId)
- return it->get();
- return 0;
+ DOMStorageResourcesMap::iterator it = m_domStorageResources.find(storageId);
+ if (it == m_domStorageResources.end())
+ return 0;
+ return it->second.get();
}
#endif
@@ -1221,11 +1337,11 @@ void InspectorController::addProfile(PassRefPtr<Profile> prpProfile, unsigned li
return;
RefPtr<Profile> profile = prpProfile;
- m_profiles.append(profile);
+ m_profiles.add(profile->uid(), profile);
if (m_frontend) {
JSLock lock(SilenceAssertionsOnly);
- m_frontend->addProfile(toJS(m_scriptState, profile.get()));
+ m_frontend->addProfileHeader(createProfileHeader(*profile));
}
addProfileFinishedMessageToConsole(profile, lineNumber, sourceURL);
@@ -1236,8 +1352,10 @@ void InspectorController::addProfileFinishedMessageToConsole(PassRefPtr<Profile>
RefPtr<Profile> profile = prpProfile;
UString message = "Profile \"webkit-profile://";
- message += encodeWithURLEscapeSequences(profile->title());
+ message += encodeWithURLEscapeSequences(CPUProfileType);
message += "/";
+ message += encodeWithURLEscapeSequences(profile->title());
+ message += "#";
message += UString::from(profile->uid());
message += "\" finished.";
addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL);
@@ -1246,11 +1364,42 @@ void InspectorController::addProfileFinishedMessageToConsole(PassRefPtr<Profile>
void InspectorController::addStartProfilingMessageToConsole(const UString& title, unsigned lineNumber, const UString& sourceURL)
{
UString message = "Profile \"webkit-profile://";
+ message += encodeWithURLEscapeSequences(CPUProfileType);
+ message += "/";
message += encodeWithURLEscapeSequences(title);
- message += "/0\" started.";
+ message += "#0\" started.";
addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lineNumber, sourceURL);
}
+void InspectorController::getProfileHeaders(long callId)
+{
+ if (!m_frontend)
+ return;
+ ScriptArray result = m_frontend->newScriptArray();
+ ProfilesMap::iterator profilesEnd = m_profiles.end();
+ int i = 0;
+ for (ProfilesMap::iterator it = m_profiles.begin(); it != profilesEnd; ++it)
+ result.set(i++, createProfileHeader(*it->second));
+ m_frontend->didGetProfileHeaders(callId, result);
+}
+
+void InspectorController::getProfile(long callId, unsigned uid)
+{
+ if (!m_frontend)
+ return;
+ ProfilesMap::iterator it = m_profiles.find(uid);
+ if (it != m_profiles.end())
+ m_frontend->didGetProfile(callId, toJS(m_scriptState, it->second.get()));
+}
+
+ScriptObject InspectorController::createProfileHeader(const JSC::Profile& profile)
+{
+ ScriptObject header = m_frontend->newScriptObject();
+ header.set("title", profile.title());
+ header.set("uid", profile.uid());
+ return header;
+}
+
UString InspectorController::getCurrentUserInitiatedProfileName(bool incrementProfileNumber = false)
{
if (incrementProfileNumber)
@@ -1429,6 +1578,25 @@ void InspectorController::didContinue()
#endif
+void InspectorController::evaluateForTestInFrontend(long callId, const String& script)
+{
+ if (m_frontend)
+ m_frontend->evaluateForTestInFrontend(callId, script);
+ else
+ m_pendingEvaluateTestCommands.append(pair<long, String>(callId, script));
+}
+
+void InspectorController::didEvaluateForTestInFrontend(long callId, const String& jsonResult)
+{
+ ScriptState* scriptState = scriptStateFromPage(m_inspectedPage);
+ ScriptObject window;
+ ScriptGlobalObject::get(scriptState, "window", window);
+ ScriptFunctionCall function(scriptState, window, "didEvaluateForTestInFrontend");
+ function.appendArgument(static_cast<int>(callId));
+ function.appendArgument(jsonResult);
+ function.call();
+}
+
static Path quadToPath(const FloatQuad& quad)
{
Path quadPath;
@@ -1623,15 +1791,18 @@ InspectorController::SpecialPanels InspectorController::specialPanelForJSName(co
return ElementsPanel;
}
-ScriptValue InspectorController::wrapObject(const ScriptValue& quarantinedObject)
+ScriptValue InspectorController::wrapObject(const ScriptValue& quarantinedObject, const String& objectGroup)
{
ScriptFunctionCall function(m_scriptState, m_injectedScriptObj, "createProxyObject");
function.appendArgument(quarantinedObject);
if (quarantinedObject.isObject()) {
long id = m_lastBoundObjectId++;
String objectId = String::format("object#%ld", id);
- m_idToConsoleObject.set(objectId, quarantinedObject);
-
+ m_idToWrappedObject.set(objectId, quarantinedObject);
+ ObjectGroupsMap::iterator it = m_objectGroups.find(objectGroup);
+ if (it == m_objectGroups.end())
+ it = m_objectGroups.set(objectGroup, Vector<String>()).first;
+ it->second.append(objectId);
function.appendArgument(objectId);
}
ScriptValue wrapper = function.call();
@@ -1640,22 +1811,38 @@ ScriptValue InspectorController::wrapObject(const ScriptValue& quarantinedObject
ScriptValue InspectorController::unwrapObject(const String& objectId)
{
- HashMap<String, ScriptValue>::iterator it = m_idToConsoleObject.find(objectId);
- if (it != m_idToConsoleObject.end())
+ HashMap<String, ScriptValue>::iterator it = m_idToWrappedObject.find(objectId);
+ if (it != m_idToWrappedObject.end())
return it->second;
return ScriptValue();
}
+void InspectorController::releaseWrapperObjectGroup(const String& objectGroup)
+{
+ ObjectGroupsMap::iterator groupIt = m_objectGroups.find(objectGroup);
+ if (groupIt == m_objectGroups.end())
+ return;
+
+ Vector<String>& groupIds = groupIt->second;
+ for (Vector<String>::iterator it = groupIds.begin(); it != groupIds.end(); ++it)
+ m_idToWrappedObject.remove(*it);
+ m_objectGroups.remove(groupIt);
+}
+
void InspectorController::resetInjectedScript()
{
ScriptFunctionCall function(m_scriptState, m_injectedScriptObj, "reset");
function.call();
}
-void InspectorController::deleteCookie(const String& cookieName)
+void InspectorController::deleteCookie(const String& cookieName, const String& domain)
{
- Document* document = m_inspectedPage->mainFrame()->document();
- WebCore::deleteCookie(document, document->cookieURL(), cookieName);
+ ResourcesMap::iterator resourcesEnd = m_resources.end();
+ for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
+ Document* document = it->second->frame()->document();
+ if (document->url().host() == domain)
+ WebCore::deleteCookie(document, document->cookieURL(), cookieName);
+ }
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorController.h b/src/3rdparty/webkit/WebCore/inspector/InspectorController.h
index ff7a516..8c14532 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorController.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorController.h
@@ -30,7 +30,9 @@
#define InspectorController_h
#include "Console.h"
+#include "Cookie.h"
#include "PlatformString.h"
+#include "ScriptArray.h"
#include "ScriptObject.h"
#include "ScriptState.h"
#include "ScriptValue.h"
@@ -39,6 +41,7 @@
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
+#include <wtf/ListHashSet.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
@@ -90,8 +93,9 @@ class InspectorController
public:
typedef HashMap<long long, RefPtr<InspectorResource> > ResourcesMap;
typedef HashMap<RefPtr<Frame>, ResourcesMap*> FrameResourcesMap;
- typedef HashSet<RefPtr<InspectorDatabaseResource> > DatabaseResourcesSet;
- typedef HashSet<RefPtr<InspectorDOMStorageResource> > DOMStorageResourcesSet;
+ typedef HashMap<int, RefPtr<InspectorDatabaseResource> > DatabaseResourcesMap;
+ typedef HashMap<int, RefPtr<InspectorDOMStorageResource> > DOMStorageResourcesMap;
+ typedef HashMap<String, Vector<String> > ObjectGroupsMap;
typedef enum {
CurrentPanel,
@@ -224,11 +228,16 @@ public:
bool resourceTrackingEnabled() const { return m_resourceTrackingEnabled; }
void ensureResourceTrackingSettingsLoaded();
- void enableTimeline(bool always = false);
- void disableTimeline(bool always = false);
- bool timelineEnabled() const;
+ void startTimelineProfiler();
+ void stopTimelineProfiler();
+ bool timelineProfilerEnabled() const;
InspectorTimelineAgent* timelineAgent() { return m_timelineAgent.get(); }
+ void mainResourceFiredLoadEvent(DocumentLoader*, const KURL&);
+ void mainResourceFiredDOMContentEvent(DocumentLoader*, const KURL&);
+
+ void getCookies(long callId, const String& url);
+
#if ENABLE(DATABASE)
void didOpenDatabase(Database*, const String& domain, const String& name, const String& version);
#endif
@@ -256,7 +265,6 @@ public:
void addProfile(PassRefPtr<JSC::Profile>, unsigned lineNumber, const JSC::UString& sourceURL);
void addProfileFinishedMessageToConsole(PassRefPtr<JSC::Profile>, unsigned lineNumber, const JSC::UString& sourceURL);
void addStartProfilingMessageToConsole(const JSC::UString& title, unsigned lineNumber, const JSC::UString& sourceURL);
- const ProfilesArray& profiles() const { return m_profiles; }
bool isRecordingUserInitiatedProfile() const { return m_recordingUserInitiatedProfile; }
@@ -280,6 +288,8 @@ public:
virtual void didContinue();
#endif
+ void evaluateForTestInFrontend(long callId, const String& script);
+
private:
friend class InspectorBackend;
// Following are used from InspectorBackend and internally.
@@ -295,21 +305,34 @@ private:
// Following are used from InspectorFrontend only. We don't want to expose them to the
// rest of the InspectorController clients.
// TODO: extract these into a separate interface.
- ScriptValue wrapObject(const ScriptValue& object);
+ ScriptValue wrapObject(const ScriptValue& object, const String& objectGroup);
ScriptValue unwrapObject(const String& objectId);
+ void releaseWrapperObjectGroup(const String& objectGroup);
void resetInjectedScript();
- void deleteCookie(const String& cookieName);
+ void deleteCookie(const String& cookieName, const String& domain);
#if ENABLE(JAVASCRIPT_DEBUGGER)
+ typedef HashMap<unsigned int, RefPtr<JSC::Profile> > ProfilesMap;
+
void startUserInitiatedProfilingSoon();
void toggleRecordButton(bool);
void enableDebuggerFromFrontend(bool always);
+ void getProfileHeaders(long callId);
+ void getProfile(long callId, unsigned uid);
+ ScriptObject createProfileHeader(const JSC::Profile& profile);
+#endif
+#if ENABLE(DATABASE)
+ void selectDatabase(Database* database);
+ Database* databaseForId(int databaseId);
#endif
#if ENABLE(DOM_STORAGE)
InspectorDOMStorageResource* getDOMStorageResourceForId(int storageId);
#endif
+
+ ScriptObject buildObjectForCookie(const Cookie&);
+ ScriptArray buildArrayForCookies(ListHashSet<Cookie>&);
void focusNode();
@@ -328,6 +351,8 @@ private:
SpecialPanels specialPanelForJSName(const String& panelName);
+ void didEvaluateForTestInFrontend(long callId, const String& jsonResult);
+
Page* m_inspectedPage;
InspectorClient* m_client;
OwnPtr<InspectorFrontend> m_frontend;
@@ -344,10 +369,10 @@ private:
HashMap<String, double> m_times;
HashMap<String, unsigned> m_counts;
#if ENABLE(DATABASE)
- DatabaseResourcesSet m_databaseResources;
+ DatabaseResourcesMap m_databaseResources;
#endif
#if ENABLE(DOM_STORAGE)
- DOMStorageResourcesSet m_domStorageResources;
+ DOMStorageResourcesMap m_domStorageResources;
#endif
ScriptState* m_scriptState;
bool m_windowVisible;
@@ -360,8 +385,11 @@ private:
bool m_resourceTrackingEnabled;
bool m_resourceTrackingSettingsLoaded;
RefPtr<InspectorBackend> m_inspectorBackend;
- HashMap<String, ScriptValue> m_idToConsoleObject;
+ HashMap<String, ScriptValue> m_idToWrappedObject;
+ ObjectGroupsMap m_objectGroups;
+
long m_lastBoundObjectId;
+ Vector<pair<long, String> > m_pendingEvaluateTestCommands;
#if ENABLE(JAVASCRIPT_DEBUGGER)
bool m_debuggerEnabled;
bool m_attachDebuggerWhenShown;
@@ -370,7 +398,7 @@ private:
int m_currentUserInitiatedProfileNumber;
unsigned m_nextUserInitiatedProfileNumber;
Timer<InspectorController> m_startProfiling;
- ProfilesArray m_profiles;
+ ProfilesMap m_profiles;
#endif
};
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.cpp
index ad8e8b8..f6c2d46 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.cpp
@@ -438,18 +438,6 @@ void InspectorDOMAgent::getEventListenersForNode(long callId, long nodeId)
m_frontend->didGetEventListenersForNode(callId, nodeId, listenersArray);
}
-void InspectorDOMAgent::getCookies(long callId)
-{
- Document* doc = mainFrameDocument();
- Vector<Cookie> cookiesList;
- bool isImplemented = getRawCookies(doc, doc->cookieURL(), cookiesList);
-
- if (!isImplemented)
- m_frontend->didGetCookies(callId, m_frontend->newScriptArray(), doc->cookie());
- else
- m_frontend->didGetCookies(callId, buildArrayForCookies(cookiesList), String());
-}
-
ScriptObject InspectorDOMAgent::buildObjectForNode(Node* node, int depth, NodeToIdMap* nodesMap)
{
ScriptObject value = m_frontend->newScriptObject();
@@ -549,32 +537,6 @@ ScriptObject InspectorDOMAgent::buildObjectForEventListener(const RegisteredEven
return value;
}
-ScriptObject InspectorDOMAgent::buildObjectForCookie(const Cookie& cookie)
-{
- ScriptObject value = m_frontend->newScriptObject();
- value.set("name", cookie.name);
- value.set("value", cookie.value);
- value.set("domain", cookie.domain);
- value.set("path", cookie.path);
- value.set("expires", cookie.expires);
- value.set("size", static_cast<int>(cookie.name.length() + cookie.value.length()));
- value.set("httpOnly", cookie.httpOnly);
- value.set("secure", cookie.secure);
- value.set("session", cookie.session);
- return value;
-}
-
-ScriptArray InspectorDOMAgent::buildArrayForCookies(const Vector<Cookie>& cookiesList)
-{
- ScriptArray cookies = m_frontend->newScriptArray();
- unsigned length = cookiesList.size();
- for (unsigned i = 0; i < length; ++i) {
- const Cookie& cookie = cookiesList[i];
- cookies.set(i, buildObjectForCookie(cookie));
- }
- return cookies;
-}
-
Node* InspectorDOMAgent::innerFirstChild(Node* node)
{
if (node->isFrameOwnerElement()) {
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.h b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.h
index 548e2b2..b9bdb6b 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMAgent.h
@@ -53,8 +53,6 @@ namespace WebCore {
class Node;
class Page;
- struct Cookie;
-
struct EventListenerInfo {
EventListenerInfo(Node* node, const AtomicString& eventType, const EventListenerVector& eventListenerVector)
: node(node)
@@ -88,7 +86,6 @@ namespace WebCore {
void removeAttribute(long callId, long elementId, const String& name);
void setTextNodeValue(long callId, long nodeId, const String& value);
void getEventListenersForNode(long callId, long nodeId);
- void getCookies(long callId);
// Methods called from the InspectorController.
void setDocument(Document* document);
@@ -116,9 +113,6 @@ namespace WebCore {
ScriptObject buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, Node* node);
- ScriptObject buildObjectForCookie(const Cookie& cookie);
- ScriptArray buildArrayForCookies(const Vector<Cookie>& cookiesList);
-
// We represent embedded doms as a part of the same hierarchy. Hence we treat children of frame owners differently.
// We also skip whitespace text nodes conditionally. Following methods encapsulate these specifics.
Node* innerFirstChild(Node* node);
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp
index 37818e7..c93e987 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDOMStorageResource.cpp
@@ -104,7 +104,7 @@ void InspectorDOMStorageResource::handleEvent(ScriptExecutionContext*, Event* ev
ASSERT(eventNames().storageEvent == event->type());
StorageEvent* storageEvent = static_cast<StorageEvent*>(event);
Storage* storage = storageEvent->storageArea();
- bool isLocalStorage = storageEvent->source()->localStorage() == storage;
+ bool isLocalStorage = storage->frame()->domWindow()->localStorage() == storage;
if (isSameHostAndType(storage->frame(), isLocalStorage))
m_frontend->updateDOMStorage(m_id);
}
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp
index a58968f..c2dc5c6 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.cpp
@@ -41,8 +41,11 @@
namespace WebCore {
+int InspectorDatabaseResource::s_nextUnusedId = 1;
+
InspectorDatabaseResource::InspectorDatabaseResource(Database* database, const String& domain, const String& name, const String& version)
: m_database(database)
+ , m_id(s_nextUnusedId++)
, m_domain(domain)
, m_name(name)
, m_version(version)
@@ -59,7 +62,7 @@ void InspectorDatabaseResource::bind(InspectorFrontend* frontend)
ScriptObject database;
if (!getQuarantinedScriptObject(m_database.get(), database))
return;
- jsonObject.set("database", database);
+ jsonObject.set("id", m_id);
jsonObject.set("domain", m_domain);
jsonObject.set("name", m_name);
jsonObject.set("version", m_version);
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h b/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h
index 38f9fa1..f82d898 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorDatabaseResource.h
@@ -53,16 +53,19 @@ namespace WebCore {
void bind(InspectorFrontend* frontend);
void unbind();
-
+ Database* database() { return m_database.get(); }
+ long id() const { return m_id; }
private:
InspectorDatabaseResource(Database*, const String& domain, const String& name, const String& version);
RefPtr<Database> m_database;
+ int m_id;
String m_domain;
String m_name;
String m_version;
bool m_scriptObjectCreated;
+ static int s_nextUnusedId;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp
index 63bb6e2..2e6dc2b 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.cpp
@@ -87,7 +87,7 @@ void InspectorFrontend::addMessageToConsole(const ScriptObject& messageObj, cons
function->appendArgument(frames[i]);
} else if (!wrappedArguments.isEmpty()) {
for (unsigned i = 0; i < wrappedArguments.size(); ++i)
- function->appendArgument(m_inspectorController->wrapObject(wrappedArguments[i]));
+ function->appendArgument(m_inspectorController->wrapObject(wrappedArguments[i], "console"));
} else
function->appendArgument(message);
function->call();
@@ -125,6 +125,13 @@ void InspectorFrontend::removeResource(long long identifier)
function->call();
}
+void InspectorFrontend::addCookieDomain(String domain)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("addCookieDomain"));
+ function->appendArgument(domain);
+ function->call();
+}
+
void InspectorFrontend::updateFocusedNode(long long nodeId)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("updateFocusedNode"));
@@ -190,14 +197,14 @@ void InspectorFrontend::resourceTrackingWasDisabled()
callSimpleFunction("resourceTrackingWasDisabled");
}
-void InspectorFrontend::timelineWasEnabled()
+void InspectorFrontend::timelineProfilerWasStarted()
{
- callSimpleFunction("timelineWasEnabled");
+ callSimpleFunction("timelineProfilerWasStarted");
}
-void InspectorFrontend::timelineWasDisabled()
+void InspectorFrontend::timelineProfilerWasStopped()
{
- callSimpleFunction("timelineWasDisabled");
+ callSimpleFunction("timelineProfilerWasStopped");
}
void InspectorFrontend::addItemToTimeline(const ScriptObject& itemObj)
@@ -254,9 +261,9 @@ void InspectorFrontend::failedToParseScriptSource(const JSC::SourceCode& source,
function->call();
}
-void InspectorFrontend::addProfile(const JSC::JSValue& profile)
+void InspectorFrontend::addProfileHeader(const ScriptValue& profile)
{
- OwnPtr<ScriptFunctionCall> function(newFunctionCall("addProfile"));
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("addProfileHeader"));
function->appendArgument(profile);
function->call();
}
@@ -268,38 +275,32 @@ void InspectorFrontend::setRecordingProfile(bool isProfiling)
function->call();
}
-void InspectorFrontend::pausedScript(const ScriptValue& callFrames)
+void InspectorFrontend::didGetProfileHeaders(int callId, const ScriptArray& headers)
{
- OwnPtr<ScriptFunctionCall> function(newFunctionCall("pausedScript"));
- function->appendArgument(callFrames);
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("didGetProfileHeaders"));
+ function->appendArgument(callId);
+ function->appendArgument(headers);
function->call();
}
-void InspectorFrontend::resumedScript()
+void InspectorFrontend::didGetProfile(int callId, const ScriptValue& profile)
{
- callSimpleFunction("resumedScript");
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("didGetProfile"));
+ function->appendArgument(callId);
+ function->appendArgument(profile);
+ function->call();
}
-#endif
-#if ENABLE(DATABASE)
-bool InspectorFrontend::addDatabase(const ScriptObject& dbObject)
+void InspectorFrontend::pausedScript(const ScriptValue& callFrames)
{
- OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDatabase"));
- function->appendArgument(dbObject);
- bool hadException = false;
- function->call(hadException);
- return !hadException;
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("pausedScript"));
+ function->appendArgument(callFrames);
+ function->call();
}
-#endif
-#if ENABLE(DOM_STORAGE)
-bool InspectorFrontend::addDOMStorage(const ScriptObject& domStorageObj)
+void InspectorFrontend::resumedScript()
{
- OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDOMStorage"));
- function->appendArgument(domStorageObj);
- bool hadException = false;
- function->call(hadException);
- return !hadException;
+ callSimpleFunction("resumedScript");
}
#endif
@@ -358,6 +359,14 @@ void InspectorFrontend::attributesUpdated(int id, const ScriptArray& attributes)
function->call();
}
+void InspectorFrontend::didRemoveNode(int callId, int nodeId)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("didRemoveNode"));
+ function->appendArgument(callId);
+ function->appendArgument(nodeId);
+ function->call();
+}
+
void InspectorFrontend::didGetChildNodes(int callId)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("didGetChildNodes"));
@@ -401,18 +410,40 @@ void InspectorFrontend::didDispatchOnInjectedScript(int callId, const String& re
}
#if ENABLE(DATABASE)
-void InspectorFrontend::selectDatabase(Database* database)
+bool InspectorFrontend::addDatabase(const ScriptObject& dbObject)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDatabase"));
+ function->appendArgument(dbObject);
+ bool hadException = false;
+ function->call(hadException);
+ return !hadException;
+}
+
+void InspectorFrontend::selectDatabase(int databaseId)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("selectDatabase"));
- ScriptObject quarantinedObject;
- if (!getQuarantinedScriptObject(database, quarantinedObject))
- return;
- function->appendArgument(quarantinedObject);
+ function->appendArgument(databaseId);
+ function->call();
+}
+void InspectorFrontend::didGetDatabaseTableNames(int callId, const ScriptArray& tableNames)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("didGetDatabaseTableNames"));
+ function->appendArgument(callId);
+ function->appendArgument(tableNames);
function->call();
}
#endif
#if ENABLE(DOM_STORAGE)
+bool InspectorFrontend::addDOMStorage(const ScriptObject& domStorageObj)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDOMStorage"));
+ function->appendArgument(domStorageObj);
+ bool hadException = false;
+ function->call(hadException);
+ return !hadException;
+}
+
void InspectorFrontend::selectDOMStorage(int storageId)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("selectDOMStorage"));
@@ -459,6 +490,14 @@ void InspectorFrontend::addNodesToSearchResult(const String& nodeIds)
function->call();
}
+void InspectorFrontend::evaluateForTestInFrontend(int callId, const String& script)
+{
+ OwnPtr<ScriptFunctionCall> function(newFunctionCall("evaluateForTestInFrontend"));
+ function->appendArgument(callId);
+ function->appendArgument(script);
+ function->call();
+}
+
PassOwnPtr<ScriptFunctionCall> InspectorFrontend::newFunctionCall(const String& functionName)
{
ScriptFunctionCall* function = new ScriptFunctionCall(m_scriptState, m_webInspector, "dispatch");
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h b/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h
index 51f17fb..0883ac2 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorFrontend.h
@@ -70,6 +70,8 @@ namespace WebCore {
bool updateResource(long long identifier, const ScriptObject& resourceObj);
void removeResource(long long identifier);
+ void addCookieDomain(String);
+
void updateFocusedNode(long long nodeId);
void setAttachedWindow(bool attached);
void showPanel(int panel);
@@ -87,15 +89,18 @@ namespace WebCore {
void profilerWasDisabled();
void parsedScriptSource(const JSC::SourceCode&);
void failedToParseScriptSource(const JSC::SourceCode&, int errorLine, const JSC::UString& errorMessage);
- void addProfile(const JSC::JSValue& profile);
+ void addProfileHeader(const ScriptValue& profile);
void setRecordingProfile(bool isProfiling);
+ void didGetProfileHeaders(int callId, const ScriptArray& headers);
+ void didGetProfile(int callId, const ScriptValue& profile);
void pausedScript(const ScriptValue& callFrames);
void resumedScript();
#endif
#if ENABLE(DATABASE)
bool addDatabase(const ScriptObject& dbObj);
- void selectDatabase(Database* database);
+ void selectDatabase(int databaseId);
+ void didGetDatabaseTableNames(int callId, const ScriptArray& tableNames);
#endif
#if ENABLE(DOM_STORAGE)
@@ -117,9 +122,10 @@ namespace WebCore {
void didGetChildNodes(int callId);
void didApplyDomChange(int callId, bool success);
void didGetEventListenersForNode(int callId, int nodeId, ScriptArray& listenersArray);
+ void didRemoveNode(int callId, int nodeId);
- void timelineWasEnabled();
- void timelineWasDisabled();
+ void timelineProfilerWasStarted();
+ void timelineProfilerWasStopped();
void addItemToTimeline(const ScriptObject& itemObj);
void didGetCookies(int callId, const ScriptArray& cookies, const String& cookiesString);
@@ -129,6 +135,7 @@ namespace WebCore {
ScriptState* scriptState() const { return m_scriptState; }
+ void evaluateForTestInFrontend(int callId, const String& script);
private:
PassOwnPtr<ScriptFunctionCall> newFunctionCall(const String& functionName);
void callSimpleFunction(const String& functionName);
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp b/src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp
index 484a0bd..69ab39b 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorResource.cpp
@@ -59,6 +59,8 @@ InspectorResource::InspectorResource(long long identifier, DocumentLoader* loade
, m_startTime(-1.0)
, m_responseReceivedTime(-1.0)
, m_endTime(-1.0)
+ , m_loadEventTime(-1.0)
+ , m_domContentEventTime(-1.0)
, m_isMainResource(false)
{
}
@@ -200,6 +202,10 @@ void InspectorResource::updateScriptObject(InspectorFrontend* frontend)
jsonObject.set("responseReceivedTime", m_responseReceivedTime);
if (m_endTime > 0)
jsonObject.set("endTime", m_endTime);
+ if (m_loadEventTime > 0)
+ jsonObject.set("loadEventTime", m_loadEventTime);
+ if (m_domContentEventTime > 0)
+ jsonObject.set("domContentEventTime", m_domContentEventTime);
jsonObject.set("didTimingChange", true);
}
if (!frontend->updateResource(m_identifier, jsonObject))
@@ -320,6 +326,18 @@ void InspectorResource::endTiming()
m_changes.set(CompletionChange);
}
+void InspectorResource::markDOMContentEventTime()
+{
+ m_domContentEventTime = currentTime();
+ m_changes.set(TimingChange);
+}
+
+void InspectorResource::markLoadEventTime()
+{
+ m_loadEventTime = currentTime();
+ m_changes.set(TimingChange);
+}
+
void InspectorResource::markFailed()
{
m_failed = true;
diff --git a/src/3rdparty/webkit/WebCore/inspector/InspectorResource.h b/src/3rdparty/webkit/WebCore/inspector/InspectorResource.h
index 5e37e41..880eab7 100644
--- a/src/3rdparty/webkit/WebCore/inspector/InspectorResource.h
+++ b/src/3rdparty/webkit/WebCore/inspector/InspectorResource.h
@@ -103,6 +103,8 @@ namespace WebCore {
void startTiming();
void markResponseReceivedTime();
+ void markLoadEventTime();
+ void markDOMContentEventTime();
void endTiming();
void markFailed();
@@ -161,6 +163,8 @@ namespace WebCore {
double m_startTime;
double m_responseReceivedTime;
double m_endTime;
+ double m_loadEventTime;
+ double m_domContentEventTime;
ScriptString m_xmlHttpResponseText;
Changes m_changes;
bool m_isMainResource;
diff --git a/src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h b/src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h
index e86b0eb..47cdac2 100644
--- a/src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h
+++ b/src/3rdparty/webkit/WebCore/inspector/JavaScriptCallFrame.h
@@ -44,7 +44,12 @@ namespace WebCore {
return adoptRef(new JavaScriptCallFrame(debuggerCallFrame, caller, sourceID, line));
}
- void invalidate() { m_isValid = false; }
+ void invalidate()
+ {
+ m_isValid = false;
+ m_debuggerCallFrame = 0;
+ }
+
bool isValid() const { return m_isValid; }
JavaScriptCallFrame* caller();
@@ -56,6 +61,7 @@ namespace WebCore {
m_debuggerCallFrame = debuggerCallFrame;
m_line = line;
m_sourceID = sourceID;
+ m_isValid = true;
}
String functionName() const;
diff --git a/src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp b/src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp
index 3c3e279..2d462f6 100644
--- a/src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp
+++ b/src/3rdparty/webkit/WebCore/inspector/JavaScriptProfileNode.cpp
@@ -104,28 +104,6 @@ static JSValueRef getSelfTime(JSContextRef ctx, JSObjectRef thisObject, JSString
return JSValueMakeNumber(ctx, profileNode->selfTime());
}
-static JSValueRef getTotalPercent(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
-{
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- if (!JSValueIsObjectOfClass(ctx, thisObject, ProfileNodeClass()))
- return JSValueMakeUndefined(ctx);
-
- ProfileNode* profileNode = static_cast<ProfileNode*>(JSObjectGetPrivate(thisObject));
- return JSValueMakeNumber(ctx, profileNode->totalPercent());
-}
-
-static JSValueRef getSelfPercent(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
-{
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- if (!JSValueIsObjectOfClass(ctx, thisObject, ProfileNodeClass()))
- return JSValueMakeUndefined(ctx);
-
- ProfileNode* profileNode = static_cast<ProfileNode*>(JSObjectGetPrivate(thisObject));
- return JSValueMakeNumber(ctx, profileNode->selfPercent());
-}
-
static JSValueRef getNumberOfCalls(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
{
JSC::JSLock lock(SilenceAssertionsOnly);
@@ -184,30 +162,6 @@ static JSValueRef getChildren(JSContextRef ctx, JSObjectRef thisObject, JSString
return result;
}
-static JSValueRef getParent(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
-{
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- if (!JSValueIsObjectOfClass(ctx, thisObject, ProfileNodeClass()))
- return JSValueMakeUndefined(ctx);
-
- ProfileNode* profileNode = static_cast<ProfileNode*>(JSObjectGetPrivate(thisObject));
- ExecState* exec = toJS(ctx);
- return toRef(exec, toJS(exec, profileNode->parent()));
-}
-
-static JSValueRef getHead(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
-{
- JSC::JSLock lock(SilenceAssertionsOnly);
-
- if (!JSValueIsObjectOfClass(ctx, thisObject, ProfileNodeClass()))
- return JSValueMakeUndefined(ctx);
-
- ProfileNode* profileNode = static_cast<ProfileNode*>(JSObjectGetPrivate(thisObject));
- ExecState* exec = toJS(ctx);
- return toRef(exec, toJS(exec, profileNode->head()));
-}
-
static JSValueRef getVisible(JSContextRef ctx, JSObjectRef thisObject, JSStringRef, JSValueRef*)
{
JSC::JSLock lock(SilenceAssertionsOnly);
@@ -245,12 +199,8 @@ JSClassRef ProfileNodeClass()
{ "lineNumber", getLineNumber, 0, kJSPropertyAttributeNone },
{ "totalTime", getTotalTime, 0, kJSPropertyAttributeNone },
{ "selfTime", getSelfTime, 0, kJSPropertyAttributeNone },
- { "totalPercent", getTotalPercent, 0, kJSPropertyAttributeNone },
- { "selfPercent", getSelfPercent, 0, kJSPropertyAttributeNone },
{ "numberOfCalls", getNumberOfCalls, 0, kJSPropertyAttributeNone },
{ "children", getChildren, 0, kJSPropertyAttributeNone },
- { "parent", getParent, 0, kJSPropertyAttributeNone },
- { "head", getHead, 0, kJSClassAttributeNone },
{ "visible", getVisible, 0, kJSPropertyAttributeNone },
{ "callUID", getCallUID, 0, kJSPropertyAttributeNone },
{ 0, 0, 0, 0 }
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ConsoleView.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ConsoleView.js
index 4f50ecc..aa0e08c 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ConsoleView.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ConsoleView.js
@@ -27,6 +27,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
+
WebInspector.ConsoleView = function(drawer)
{
WebInspector.View.call(this, document.getElementById("console-view"));
@@ -44,7 +46,7 @@ WebInspector.ConsoleView = function(drawer)
this.promptElement = document.getElementById("console-prompt");
this.promptElement.handleKeyEvent = this._promptKeyDown.bind(this);
- this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), " .=:[({;");
+ this.prompt = new WebInspector.TextPrompt(this.promptElement, this.completions.bind(this), ExpressionStopCharacters + ".");
this.topGroup = new WebInspector.ConsoleGroup(null, 0);
this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
@@ -274,8 +276,7 @@ WebInspector.ConsoleView.prototype = {
completions: function(wordRange, bestMatchOnly, completionsReadyCallback)
{
// Pass less stop characters to rangeOfWord so the range will be a more complete expression.
- const expressionStopCharacters = " =:{;";
- var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, expressionStopCharacters, this.promptElement, "backward");
+ var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, this.promptElement, "backward");
var expressionString = expressionRange.toString();
var lastIndex = expressionString.length - 1;
@@ -292,16 +293,6 @@ WebInspector.ConsoleView.prototype = {
var reportCompletions = this._reportCompletions.bind(this, bestMatchOnly, completionsReadyCallback, dotNotation, bracketNotation, prefix);
// Collect comma separated object properties for the completion.
- if (!expressionString) {
- if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
- // Evaluate into properties in scope of the selected call frame.
- reportCompletions(WebInspector.panels.scripts.variablesInSelectedCallFrame());
- return;
- } else {
- expressionString = "this";
- }
- }
-
var includeInspectorCommandLineAPI = (!dotNotation && !bracketNotation);
if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused)
var callFrameId = WebInspector.panels.scripts.selectedCallFrameId();
@@ -343,7 +334,7 @@ WebInspector.ConsoleView.prototype = {
if (bestMatchOnly)
break;
}
- setTimeout(completionsReadyCallback, 0, results);
+ completionsReadyCallback(results);
},
_clearButtonClicked: function()
@@ -391,16 +382,16 @@ WebInspector.ConsoleView.prototype = {
this.prompt.handleKeyEvent(event);
},
- evalInInspectedWindow: function(expression, callback)
+ evalInInspectedWindow: function(expression, objectGroup, callback)
{
if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
- WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, callback);
+ WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, objectGroup, callback);
return;
}
- this.doEvalInWindow(expression, callback);
+ this.doEvalInWindow(expression, objectGroup, callback);
},
- doEvalInWindow: function(expression, callback)
+ doEvalInWindow: function(expression, objectGroup, callback)
{
if (!expression) {
// There is no expression, so the completion should happen against global properties.
@@ -411,7 +402,7 @@ WebInspector.ConsoleView.prototype = {
{
callback(result.value, result.isException);
};
- InjectedScriptAccess.evaluate(expression, evalCallback);
+ InjectedScriptAccess.evaluate(expression, objectGroup, evalCallback);
},
_enterKeyPressed: function(event)
@@ -439,7 +430,7 @@ WebInspector.ConsoleView.prototype = {
self.prompt.text = "";
self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
}
- this.evalInInspectedWindow(str, printResult);
+ this.evalInInspectedWindow(str, "console", printResult);
},
_format: function(output, forceObjectFormat)
@@ -514,21 +505,31 @@ WebInspector.ConsoleView.prototype = {
_formatarray: function(arr, elem)
{
- var self = this;
- function printResult(properties)
- {
- if (!properties)
- return;
- elem.appendChild(document.createTextNode("["));
- for (var i = 0; i < properties.length; ++i) {
- var property = properties[i].value;
- elem.appendChild(self._format(property));
- if (i < properties.length - 1)
- elem.appendChild(document.createTextNode(", "));
- }
- elem.appendChild(document.createTextNode("]"));
+ InjectedScriptAccess.getProperties(arr, false, this._printArray.bind(this, elem));
+ },
+
+ _printArray: function(elem, properties)
+ {
+ if (!properties)
+ return;
+ var elements = [];
+ for (var i = 0; i < properties.length; ++i) {
+ var name = properties[i].name;
+ if (name == parseInt(name))
+ elements[name] = this._format(properties[i].value);
+ }
+
+ elem.appendChild(document.createTextNode("["));
+ for (var i = 0; i < elements.length; ++i) {
+ var element = elements[i];
+ if (element)
+ elem.appendChild(element);
+ else
+ elem.appendChild(document.createTextNode("undefined"))
+ if (i < elements.length - 1)
+ elem.appendChild(document.createTextNode(", "));
}
- InjectedScriptAccess.getProperties(arr, false, printResult);
+ elem.appendChild(document.createTextNode("]"));
},
_formatnode: function(object, elem)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/CookieItemsView.js b/src/3rdparty/webkit/WebCore/inspector/front-end/CookieItemsView.js
index f9604a4..9f9845c 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/CookieItemsView.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/CookieItemsView.js
@@ -27,7 +27,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-WebInspector.CookieItemsView = function()
+WebInspector.CookieItemsView = function(cookieDomain)
{
WebInspector.View.call(this);
@@ -40,6 +40,8 @@ WebInspector.CookieItemsView = function()
this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
+
+ this._cookieDomain = cookieDomain;
}
WebInspector.CookieItemsView.prototype = {
@@ -70,6 +72,7 @@ WebInspector.CookieItemsView.prototype = {
if (dataGrid) {
self._dataGrid = dataGrid;
self.element.appendChild(dataGrid.element);
+ self._dataGrid.updateWidths();
if (isAdvanced)
self.deleteButton.visible = true;
} else {
@@ -82,7 +85,7 @@ WebInspector.CookieItemsView.prototype = {
}
}
- WebInspector.Cookies.getCookiesAsync(callback);
+ WebInspector.Cookies.getCookiesAsync(callback, this._cookieDomain);
},
dataGridForCookies: function(cookies)
@@ -246,6 +249,12 @@ WebInspector.CookieItemsView.prototype = {
return dataGrid;
},
+
+ resize: function()
+ {
+ if (this._dataGrid)
+ this._dataGrid.updateWidths();
+ },
_deleteButtonClicked: function(event)
{
@@ -253,7 +262,7 @@ WebInspector.CookieItemsView.prototype = {
return;
var cookie = this._dataGrid.selectedNode.cookie;
- InspectorController.deleteCookie(cookie.name);
+ InspectorController.deleteCookie(cookie.name, this._cookieDomain);
this.update();
},
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/DOMAgent.js b/src/3rdparty/webkit/WebCore/inspector/front-end/DOMAgent.js
index a151c05..25ffafa 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/DOMAgent.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/DOMAgent.js
@@ -307,13 +307,6 @@ WebInspector.DOMAgent = function() {
this._window = new WebInspector.DOMWindow(this);
this._idToDOMNode = null;
this.document = null;
-
- // TODO: update ElementsPanel to not track embedded iframes - it is already being handled
- // in the agent backend.
-
- // Whitespace is ignored in InspectorDOMAgent already -> no need to filter.
- // TODO: Either remove all of its usages or push value into the agent backend.
- Preferences.ignoreWhitespace = false;
}
WebInspector.DOMAgent.prototype = {
@@ -417,10 +410,8 @@ WebInspector.DOMAgent.prototype = {
node._childNodeCount = newValue;
var outline = WebInspector.panels.elements.treeOutline;
var treeElement = outline.findTreeElement(node);
- if (treeElement) {
+ if (treeElement)
treeElement.hasChildren = newValue;
- treeElement.whitespaceIgnored = Preferences.ignoreWhitespace;
- }
},
_childNodeInserted: function(parentId, prevId, payload)
@@ -446,7 +437,7 @@ WebInspector.DOMAgent.prototype = {
WebInspector.Cookies = {}
-WebInspector.Cookies.getCookiesAsync = function(callback)
+WebInspector.Cookies.getCookiesAsync = function(callback, cookieDomain)
{
function mycallback(cookies, cookiesString) {
if (cookiesString)
@@ -455,7 +446,7 @@ WebInspector.Cookies.getCookiesAsync = function(callback)
callback(cookies, true);
}
var callId = WebInspector.Callback.wrap(mycallback);
- InspectorController.getCookies(callId);
+ InspectorController.getCookies(callId, cookieDomain);
}
WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/Database.js b/src/3rdparty/webkit/WebCore/inspector/front-end/Database.js
index dcab2ab..1a348fc 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/Database.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/Database.js
@@ -26,18 +26,18 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-WebInspector.Database = function(database, domain, name, version)
+WebInspector.Database = function(id, domain, name, version)
{
- this._database = database;
- this.domain = domain;
- this.name = name;
- this.version = version;
+ this._id = id;
+ this._domain = domain;
+ this._name = name;
+ this._version = version;
}
WebInspector.Database.prototype = {
- isDatabase: function(db)
+ get id()
{
- return this._database === db;
+ return this._id;
},
get name()
@@ -47,8 +47,6 @@ WebInspector.Database.prototype = {
set name(x)
{
- if (this._name === x)
- return;
this._name = x;
},
@@ -59,8 +57,6 @@ WebInspector.Database.prototype = {
set version(x)
{
- if (this._version === x)
- return;
this._version = x;
},
@@ -71,8 +67,6 @@ WebInspector.Database.prototype = {
set domain(x)
{
- if (this._domain === x)
- return;
this._domain = x;
},
@@ -83,31 +77,26 @@ WebInspector.Database.prototype = {
getTableNames: function(callback)
{
- var names = InspectorController.databaseTableNames(this._database);
- function sortingCallback()
+ function sortingCallback(names)
{
callback(names.sort());
}
- setTimeout(sortingCallback, 0);
+ var callId = WebInspector.Callback.wrap(sortingCallback);
+ InspectorController.getDatabaseTableNames(callId, this._id);
},
executeSql: function(query, onSuccess, onError)
{
- function successCallback(tx, result)
+ function callback(result)
{
+ if (!(result instanceof Array)) {
+ onError(result);
+ return;
+ }
onSuccess(result);
}
-
- function errorCallback(tx, error)
- {
- onError(error);
- }
-
- var self = this;
- function queryTransaction(tx)
- {
- tx.executeSql(query, null, InspectorController.wrapCallback(successCallback.bind(self)), InspectorController.wrapCallback(errorCallback.bind(self)));
- }
- this._database.transaction(InspectorController.wrapCallback(queryTransaction.bind(this)), InspectorController.wrapCallback(errorCallback.bind(this)));
+ InjectedScriptAccess.executeSql(this._id, query, callback);
}
}
+
+WebInspector.didGetDatabaseTableNames = WebInspector.Callback.processCallback;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js
index 1b61a7b..5d0e6d7 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsPanel.js
@@ -60,7 +60,7 @@ WebInspector.ElementsPanel = function()
if (InspectorController.searchingForNode()) {
InspectorController.toggleNodeSearch();
- this.panel.nodeSearchButton.removeStyleClass("toggled-on");
+ this.panel.nodeSearchButton.toggled = false;
}
if (this._focusedDOMNode)
InjectedScriptAccess.addInspectedNode(this._focusedDOMNode.id, function() {});
@@ -479,7 +479,7 @@ WebInspector.ElementsPanel.prototype = {
updatedParentTreeElements.push(parentNodeItem);
}
- if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestor(this.focusedDOMNode, parent)))
+ if (!updateBreadcrumbs && (this.focusedDOMNode === parent || isAncestorNode(this.focusedDOMNode, parent)))
updateBreadcrumbs = true;
}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js
index d8c4d89..c4bd372 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ElementsTreeOutline.js
@@ -115,12 +115,12 @@ WebInspector.ElementsTreeOutline.prototype = {
this.appendChild(treeElement);
} else {
// FIXME: this could use findTreeElement to reuse a tree element if it already exists
- var node = (Preferences.ignoreWhitespace ? firstChildSkippingWhitespace.call(this.rootDOMNode) : this.rootDOMNode.firstChild);
+ var node = this.rootDOMNode.firstChild;
while (node) {
treeElement = new WebInspector.ElementsTreeElement(node);
treeElement.selectable = this.selectEnabled;
this.appendChild(treeElement);
- node = Preferences.ignoreWhitespace ? nextSiblingSkippingWhitespace.call(node) : node.nextSibling;
+ node = node.nextSibling;
}
}
@@ -184,6 +184,34 @@ WebInspector.ElementsTreeOutline.prototype = {
return element;
},
+
+ handleKeyEvent: function(event)
+ {
+ var selectedElement = this.selectedTreeElement;
+ if (!selectedElement)
+ return;
+
+ // Delete or backspace pressed, delete the node.
+ if (event.keyCode === 8 || event.keyCode === 46) {
+ selectedElement.remove();
+ return;
+ }
+
+ // On Enter or Return start editing the first attribute
+ // or create a new attribute on the selected element.
+ if (event.keyIdentifier === "Enter") {
+ if (this._editing)
+ return;
+
+ selectedElement._startEditing();
+
+ // prevent a newline from being immediately inserted
+ event.preventDefault();
+ return;
+ }
+
+ TreeOutline.prototype.handleKeyEvent.call(this, event);
+ },
_onmousedown: function(event)
{
@@ -197,12 +225,15 @@ WebInspector.ElementsTreeOutline.prototype = {
_onmousemove: function(event)
{
+ var element = this._treeElementFromEvent(event);
+ if (element && this._previousHoveredElement === element)
+ return;
+
if (this._previousHoveredElement) {
this._previousHoveredElement.hovered = false;
delete this._previousHoveredElement;
}
- var element = this._treeElementFromEvent(event);
if (element && !element.elementCloseTag) {
element.hovered = true;
this._previousHoveredElement = element;
@@ -230,14 +261,10 @@ WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;
WebInspector.ElementsTreeElement = function(node)
{
- var hasChildren = Preferences.ignoreWhitespace ? (firstChildSkippingWhitespace.call(node) ? true : false) : node.hasChildNodes();
- var titleInfo = nodeTitleInfo.call(node, hasChildren, WebInspector.linkifyURL);
-
- if (titleInfo.hasChildren)
- this.whitespaceIgnored = Preferences.ignoreWhitespace;
+ var hasChildrenOverride = node.hasChildNodes() && !this._showInlineText(node);
// The title will be updated in onattach.
- TreeElement.call(this, "", node, titleInfo.hasChildren);
+ TreeElement.call(this, "", node, hasChildrenOverride);
if (this.representedObject.nodeType == Node.ELEMENT_NODE)
this._canAddAttributes = true;
@@ -280,36 +307,39 @@ WebInspector.ElementsTreeElement.prototype = {
if (x) {
this.updateSelection();
this.listItemElement.addStyleClass("hovered");
- } else
+ if (this._canAddAttributes)
+ this._pendingToggleNewAttribute = setTimeout(this.toggleNewAttributeButton.bind(this, true), 500);
+ } else {
this.listItemElement.removeStyleClass("hovered");
- if (this._canAddAttributes)
- this.toggleNewAttributeButton();
+ if (this._pendingToggleNewAttribute) {
+ clearTimeout(this._pendingToggleNewAttribute);
+ delete this._pendingToggleNewAttribute;
+ }
+ this.toggleNewAttributeButton(false);
+ }
}
},
- toggleNewAttributeButton: function()
+ toggleNewAttributeButton: function(visible)
{
- function removeWhenEditing(event)
+ function removeAddAttributeSpan()
{
if (this._addAttributeElement && this._addAttributeElement.parentNode)
this._addAttributeElement.parentNode.removeChild(this._addAttributeElement);
delete this._addAttributeElement;
}
- if (!this._addAttributeElement && this._hovered && !this._editing) {
+ if (!this._addAttributeElement && visible && !this._editing) {
var span = document.createElement("span");
- span.className = "add-attribute";
- span.textContent = "\u2026";
- span.addEventListener("dblclick", removeWhenEditing.bind(this), false);
+ span.className = "add-attribute webkit-html-attribute-name";
+ span.textContent = " ?=\"\"";
+ span.addEventListener("dblclick", removeAddAttributeSpan.bind(this), false);
this._addAttributeElement = span;
var tag = this.listItemElement.getElementsByClassName("webkit-html-tag")[0];
this._insertInLastAttributePosition(tag, span);
- } else if (!this._hovered && this._addAttributeElement) {
- if (this._addAttributeElement.parentNode)
- this._addAttributeElement.parentNode.removeChild(this._addAttributeElement);
- delete this._addAttributeElement;
- }
+ } else if (!visible && this._addAttributeElement)
+ removeAddAttributeSpan.call(this);
},
updateSelection: function()
@@ -362,11 +392,9 @@ WebInspector.ElementsTreeElement.prototype = {
onpopulate: function()
{
- if (this.children.length || this.whitespaceIgnored !== Preferences.ignoreWhitespace)
+ if (this.children.length || this._showInlineText(this.representedObject))
return;
- this.whitespaceIgnored = Preferences.ignoreWhitespace;
-
this.updateChildren();
},
@@ -390,7 +418,7 @@ WebInspector.ElementsTreeElement.prototype = {
function updateChildrenOfNode(node)
{
var treeOutline = treeElement.treeOutline;
- var child = (Preferences.ignoreWhitespace ? firstChildSkippingWhitespace.call(node) : node.firstChild);
+ var child = node.firstChild;
while (child) {
var currentTreeElement = treeElement.children[treeChildIndex];
if (!currentTreeElement || currentTreeElement.representedObject !== child) {
@@ -418,7 +446,7 @@ WebInspector.ElementsTreeElement.prototype = {
}
}
- child = Preferences.ignoreWhitespace ? nextSiblingSkippingWhitespace.call(child) : child.nextSibling;
+ child = child.nextSibling;
++treeChildIndex;
}
}
@@ -491,7 +519,7 @@ WebInspector.ElementsTreeElement.prototype = {
if (this._editing)
return;
- if (this._startEditing(event, treeElement))
+ if (this._startEditingFromEvent(event, treeElement))
return;
if (this.treeOutline.panel) {
@@ -516,7 +544,7 @@ WebInspector.ElementsTreeElement.prototype = {
}
},
- _startEditing: function(event, treeElement)
+ _startEditingFromEvent: function(event, treeElement)
{
if (this.treeOutline.focusedDOMNode != this.representedObject)
return;
@@ -539,6 +567,30 @@ WebInspector.ElementsTreeElement.prototype = {
return false;
},
+ _startEditing: function()
+ {
+ if (this.treeOutline.focusedDOMNode !== this.representedObject)
+ return;
+
+ var listItem = this._listItemNode;
+
+ if (this._canAddAttributes) {
+ this.toggleNewAttributeButton(false);
+ var attribute = listItem.getElementsByClassName("webkit-html-attribute")[0];
+ if (attribute)
+ return this._startEditingAttribute(attribute, attribute.getElementsByClassName("webkit-html-attribute-name")[0]);
+
+ return this._addNewAttribute(listItem);
+ }
+
+ if (this.representedObject.nodeType === Node.TEXT_NODE) {
+ var textNode = listItem.getElementsByClassName("webkit-html-text-node")[0];
+ if (textNode)
+ return this._startEditingTextNode(textNode);
+ return;
+ }
+ },
+
_addNewAttribute: function(listItemElement)
{
var attr = document.createElement("span");
@@ -646,7 +698,7 @@ WebInspector.ElementsTreeElement.prototype = {
}
}
- if (!found && moveDirection === "backward")
+ if (!found && moveDirection === "backward" && attributes.length > 0)
moveToAttribute = attributes[attributes.length - 1].name;
else if (!found && moveDirection === "forward" && !/^\s*$/.test(newText))
newAttribute = true;
@@ -720,12 +772,138 @@ WebInspector.ElementsTreeElement.prototype = {
_updateTitle: function()
{
- var title = nodeTitleInfo.call(this.representedObject, this.hasChildren, WebInspector.linkifyURL).title;
+ var title = this._nodeTitleInfo(this.representedObject, this.hasChildren, WebInspector.linkifyURL).title;
this.title = "<span class=\"highlight\">" + title + "</span>";
delete this.selectionElement;
this.updateSelection();
this._preventFollowingLinksOnDoubleClick();
},
+
+ _nodeTitleInfo: function(node, hasChildren, linkify)
+ {
+ var info = {title: "", hasChildren: hasChildren};
+
+ switch (node.nodeType) {
+ case Node.DOCUMENT_NODE:
+ info.title = "Document";
+ break;
+
+ case Node.ELEMENT_NODE:
+ info.title = "<span class=\"webkit-html-tag\">&lt;" + node.nodeName.toLowerCase().escapeHTML();
+
+ if (node.hasAttributes()) {
+ for (var i = 0; i < node.attributes.length; ++i) {
+ var attr = node.attributes[i];
+ info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
+
+ var value = attr.value;
+ if (linkify && (attr.name === "src" || attr.name === "href")) {
+ var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
+ info.title += linkify(attr.value, value, "webkit-html-attribute-value", node.nodeName.toLowerCase() == "a");
+ } else {
+ var value = value.escapeHTML();
+ value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
+ info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
+ }
+ info.title += "\"</span>";
+ }
+ }
+ info.title += "&gt;</span>&#8203;";
+
+ // If this element only has a single child that is a text node,
+ // just show that text and the closing tag inline rather than
+ // create a subtree for them
+
+ var textChild = onlyTextChild.call(node);
+ var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
+
+ if (showInlineText) {
+ info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;<span class=\"webkit-html-tag\">&lt;/" + node.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
+ info.hasChildren = false;
+ }
+ break;
+
+ case Node.TEXT_NODE:
+ if (isNodeWhitespace.call(node))
+ info.title = "(whitespace)";
+ else {
+ if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "script") {
+ var newNode = document.createElement("span");
+ newNode.textContent = node.textContent;
+
+ var javascriptSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(null, null);
+ javascriptSyntaxHighlighter.syntaxHighlightLine(newNode, null);
+
+ info.title = "<span class=\"webkit-html-text-node webkit-html-js-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+ } else if (node.parentNode && node.parentNode.nodeName.toLowerCase() == "style") {
+ var newNode = document.createElement("span");
+ newNode.textContent = node.textContent;
+
+ var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighligher(null, null);
+ cssSyntaxHighlighter.syntaxHighlightLine(newNode, null);
+
+ info.title = "<span class=\"webkit-html-text-node webkit-html-css-node\">" + newNode.innerHTML.replace(/^[\n\r]*/, "").replace(/\s*$/, "") + "</span>";
+ } else {
+ info.title = "\"<span class=\"webkit-html-text-node\">" + node.nodeValue.escapeHTML() + "</span>\"";
+ }
+ }
+ break;
+
+ case Node.COMMENT_NODE:
+ info.title = "<span class=\"webkit-html-comment\">&lt;!--" + node.nodeValue.escapeHTML() + "--&gt;</span>";
+ break;
+
+ case Node.DOCUMENT_TYPE_NODE:
+ info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + node.nodeName;
+ if (node.publicId) {
+ info.title += " PUBLIC \"" + node.publicId + "\"";
+ if (node.systemId)
+ info.title += " \"" + node.systemId + "\"";
+ } else if (node.systemId)
+ info.title += " SYSTEM \"" + node.systemId + "\"";
+ if (node.internalSubset)
+ info.title += " [" + node.internalSubset + "]";
+ info.title += "&gt;</span>";
+ break;
+ default:
+ info.title = node.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
+ }
+
+ return info;
+ },
+
+ _showInlineText: function(node)
+ {
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ var textChild = onlyTextChild.call(node);
+ if (textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength)
+ return true;
+ }
+ return false;
+ },
+
+ remove: function()
+ {
+ var parentElement = this.parent;
+ if (!parentElement)
+ return;
+
+ var self = this;
+ function removeNodeCallback(removedNodeId)
+ {
+ // -1 is an error code, which means removing the node from the DOM failed,
+ // so we shouldn't remove it from the tree.
+ if (removedNodeId === -1)
+ return;
+
+ parentElement.removeChild(self);
+ }
+
+ var callId = WebInspector.Callback.wrap(removeNodeCallback);
+ InspectorController.removeNode(callId, this.representedObject.id);
+ }
}
WebInspector.ElementsTreeElement.prototype.__proto__ = TreeElement.prototype;
+
+WebInspector.didRemoveNode = WebInspector.Callback.processCallback;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScript.js b/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScript.js
index 87293b8..3ce96d0 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScript.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScript.js
@@ -41,9 +41,12 @@ InjectedScript.reset = function()
InjectedScript.reset();
-InjectedScript.dispatch = function(methodName, args)
+InjectedScript.dispatch = function(methodName, args, callId)
{
- var result = InjectedScript[methodName].apply(InjectedScript, JSON.parse(args));
+ var argsArray = JSON.parse(args);
+ if (callId)
+ argsArray.splice(0, 0, callId); // Methods that run asynchronously have a call back id parameter.
+ var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
if (typeof result === "undefined") {
InjectedScript._window().console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
result = null;
@@ -514,12 +517,28 @@ InjectedScript.getCompletions = function(expression, includeInspectorCommandLine
var callFrame = InjectedScript._callFrameForId(callFrameId);
if (!callFrame)
return props;
- expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
+ if (expression)
+ expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression);
+ else {
+ // Evaluate into properties in scope of the selected call frame.
+ var scopeChain = callFrame.scopeChain;
+ for (var i = 0; i < scopeChain.length; ++i) {
+ var scopeObject = scopeChain[i];
+ try {
+ for (var propertyName in scopeObject)
+ props[propertyName] = true;
+ } catch (e) {
+ }
+ }
+ }
} else {
+ if (!expression)
+ expression = "this";
expressionResult = InjectedScript._evaluateOn(InjectedScript._window().eval, InjectedScript._window(), expression);
}
- for (var prop in expressionResult)
- props[prop] = true;
+ if (expressionResult)
+ for (var prop in expressionResult)
+ props[prop] = true;
if (includeInspectorCommandLineAPI)
for (var prop in InjectedScript._window()._inspectorCommandLineAPI)
if (prop.charAt(0) !== '_')
@@ -529,16 +548,16 @@ InjectedScript.getCompletions = function(expression, includeInspectorCommandLine
return props;
}
-InjectedScript.evaluate = function(expression)
+InjectedScript.evaluate = function(expression, objectGroup)
{
- return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression);
+ return InjectedScript._evaluateAndWrap(InjectedScript._window().eval, InjectedScript._window(), expression, objectGroup);
}
-InjectedScript._evaluateAndWrap = function(evalFunction, object, expression)
+InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup)
{
var result = {};
try {
- result.value = InspectorController.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression));
+ result.value = InspectorController.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression), objectGroup);
// Handle error that might have happened while describing result.
if (result.value.errorText) {
result.value = result.value.errorText;
@@ -553,7 +572,7 @@ InjectedScript._evaluateAndWrap = function(evalFunction, object, expression)
InjectedScript._evaluateOn = function(evalFunction, object, expression)
{
- InjectedScript._ensureCommandLineAPIInstalled();
+ InjectedScript._ensureCommandLineAPIInstalled(evalFunction, object);
// Surround the expression in with statements to inject our command line API so that
// the window object properties still take more precedent than our API functions.
expression = "with (window._inspectorCommandLineAPI) { with (window) { " + expression + " } }";
@@ -572,7 +591,7 @@ InjectedScript.addInspectedNode = function(nodeId)
if (!node)
return false;
- InjectedScript._ensureCommandLineAPIInstalled();
+ InjectedScript._ensureCommandLineAPIInstalled(InjectedScript._window().eval, InjectedScript._window());
var inspectedNodes = InjectedScript._window()._inspectorCommandLineAPI._inspectedNodes;
inspectedNodes.unshift(node);
if (inspectedNodes.length >= 5)
@@ -838,12 +857,12 @@ InjectedScript.getCallFrames = function()
return result;
}
-InjectedScript.evaluateInCallFrame = function(callFrameId, code)
+InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
{
var callFrame = InjectedScript._callFrameForId(callFrameId);
if (!callFrame)
return false;
- return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code);
+ return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
}
InjectedScript._callFrameForId = function(id)
@@ -880,13 +899,11 @@ InjectedScript._inspectObject = function(o)
}
}
-InjectedScript._ensureCommandLineAPIInstalled = function(inspectedWindow)
+InjectedScript._ensureCommandLineAPIInstalled = function(evalFunction, evalObject)
{
- var inspectedWindow = InjectedScript._window();
- if (inspectedWindow._inspectorCommandLineAPI)
+ if (evalFunction.call(evalObject, "window._inspectorCommandLineAPI"))
return;
-
- inspectedWindow.eval("window._inspectorCommandLineAPI = { \
+ var inspectorCommandLineAPI = evalFunction.call(evalObject, "window._inspectorCommandLineAPI = { \
$: function() { return document.getElementById.apply(document, arguments) }, \
$$: function() { return document.querySelectorAll.apply(document, arguments) }, \
$x: function(xpath, context) { \
@@ -913,8 +930,8 @@ InjectedScript._ensureCommandLineAPIInstalled = function(inspectedWindow)
get $4() { return _inspectorCommandLineAPI._inspectedNodes[4] } \
};");
- inspectedWindow._inspectorCommandLineAPI.clear = InspectorController.wrapCallback(InjectedScript._clearConsoleMessages);
- inspectedWindow._inspectorCommandLineAPI.inspect = InspectorController.wrapCallback(InjectedScript._inspectObject);
+ inspectorCommandLineAPI.clear = InspectorController.wrapCallback(InjectedScript._clearConsoleMessages);
+ inspectorCommandLineAPI.inspect = InspectorController.wrapCallback(InjectedScript._inspectObject);
}
InjectedScript._resolveObject = function(objectProxy)
@@ -1031,18 +1048,51 @@ InjectedScript.CallFrameProxy.prototype = {
scopeObjectProxy.isDocument = true;
else if (!foundLocalScope)
scopeObjectProxy.isWithBlock = true;
- scopeObjectProxy.properties = [];
- try {
- for (var propertyName in scopeObject)
- scopeObjectProxy.properties.push(propertyName);
- } catch (e) {
- }
scopeChainProxy.push(scopeObjectProxy);
}
return scopeChainProxy;
}
}
+InjectedScript.executeSql = function(callId, databaseId, query)
+{
+ function successCallback(tx, result)
+ {
+ var rows = result.rows;
+ var result = [];
+ var length = rows.length;
+ for (var i = 0; i < length; ++i) {
+ var data = {};
+ result.push(data);
+ var row = rows.item(i);
+ for (var columnIdentifier in row) {
+ // FIXME: (Bug 19439) We should specially format SQL NULL here
+ // (which is represented by JavaScript null here, and turned
+ // into the string "null" by the String() function).
+ var text = row[columnIdentifier];
+ data[columnIdentifier] = String(text);
+ }
+ }
+ InspectorController.reportDidDispatchOnInjectedScript(callId, JSON.stringify(result), false);
+ }
+
+ function errorCallback(tx, error)
+ {
+ InspectorController.reportDidDispatchOnInjectedScript(callId, JSON.stringify(error), false);
+ }
+
+ function queryTransaction(tx)
+ {
+ tx.executeSql(query, null, InspectorController.wrapCallback(successCallback), InspectorController.wrapCallback(errorCallback));
+ }
+
+ var database = InspectorController.databaseForId(databaseId);
+ if (!database)
+ errorCallback(null, { code : 2 }); // Return as unexpected version.
+ database.transaction(InspectorController.wrapCallback(queryTransaction), InspectorController.wrapCallback(errorCallback));
+ return true;
+}
+
Object.type = function(obj)
{
if (obj === null)
@@ -1068,6 +1118,8 @@ Object.type = function(obj)
return "date";
if (obj instanceof win.RegExp)
return "regexp";
+ if (obj instanceof win.NodeList)
+ return "array";
if (obj instanceof win.Error)
return "error";
return type;
@@ -1090,9 +1142,8 @@ Object.describe = function(obj, abbreviated)
switch (type1) {
case "object":
case "node":
- return type2;
case "array":
- return "[" + obj.toString() + "]";
+ return type2;
case "string":
if (!abbreviated)
return obj;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScriptAccess.js b/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScriptAccess.js
index 67312f7..c6d4b65 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScriptAccess.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/InjectedScriptAccess.js
@@ -31,7 +31,7 @@
var InjectedScriptAccess = {};
-InjectedScriptAccess._installHandler = function(methodName)
+InjectedScriptAccess._installHandler = function(methodName, async)
{
InjectedScriptAccess[methodName] = function()
{
@@ -47,35 +47,37 @@ InjectedScriptAccess._installHandler = function(methodName)
WebInspector.console.addMessage(new WebInspector.ConsoleTextMessage("Error dispatching: " + methodName));
}
var callId = WebInspector.Callback.wrap(myCallback);
- InspectorController.dispatchOnInjectedScript(callId, methodName, argsString);
+ InspectorController.dispatchOnInjectedScript(callId, methodName, argsString, !!async);
};
}
// InjectedScriptAccess message forwarding puts some constraints on the way methods are imlpemented and called:
// - Make sure corresponding methods in InjectedScript return non-null and non-undefined values,
// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
-InjectedScriptAccess._installHandler("getStyles");
+// We keep these sorted.
+InjectedScriptAccess._installHandler("addInspectedNode");
+InjectedScriptAccess._installHandler("addStyleSelector");
+InjectedScriptAccess._installHandler("applyStyleRuleText");
+InjectedScriptAccess._installHandler("applyStyleText");
+InjectedScriptAccess._installHandler("evaluate");
+InjectedScriptAccess._installHandler("evaluateInCallFrame");
+InjectedScriptAccess._installHandler("getCompletions");
InjectedScriptAccess._installHandler("getComputedStyle");
InjectedScriptAccess._installHandler("getInlineStyle");
-InjectedScriptAccess._installHandler("applyStyleText");
-InjectedScriptAccess._installHandler("setStyleText");
-InjectedScriptAccess._installHandler("toggleStyleEnabled");
-InjectedScriptAccess._installHandler("applyStyleRuleText");
-InjectedScriptAccess._installHandler("addStyleSelector");
-InjectedScriptAccess._installHandler("setStyleProperty");
-InjectedScriptAccess._installHandler("getPrototypes");
InjectedScriptAccess._installHandler("getProperties");
-InjectedScriptAccess._installHandler("setPropertyValue");
-InjectedScriptAccess._installHandler("getCompletions");
-InjectedScriptAccess._installHandler("evaluate");
-InjectedScriptAccess._installHandler("addInspectedNode");
-InjectedScriptAccess._installHandler("pushNodeToFrontend");
-InjectedScriptAccess._installHandler("evaluate");
-InjectedScriptAccess._installHandler("addInspectedNode");
-InjectedScriptAccess._installHandler("pushNodeToFrontend");
+InjectedScriptAccess._installHandler("getPrototypes");
+InjectedScriptAccess._installHandler("getStyles");
+InjectedScriptAccess._installHandler("openInInspectedWindow");
InjectedScriptAccess._installHandler("performSearch");
+InjectedScriptAccess._installHandler("pushNodeToFrontend");
InjectedScriptAccess._installHandler("searchCanceled");
-InjectedScriptAccess._installHandler("openInInspectedWindow");
-InjectedScriptAccess._installHandler("evaluateInCallFrame");
+InjectedScriptAccess._installHandler("setPropertyValue");
+InjectedScriptAccess._installHandler("setStyleProperty");
+InjectedScriptAccess._installHandler("setStyleText");
+InjectedScriptAccess._installHandler("toggleStyleEnabled");
+
+// Some methods can't run synchronously even on the injected script side (such as DB transactions).
+// Mark them as asynchronous here.
+InjectedScriptAccess._installHandler("executeSql", true);
WebInspector.didDispatchOnInjectedScript = WebInspector.Callback.processCallback;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/Object.js b/src/3rdparty/webkit/WebCore/inspector/front-end/Object.js
index 80202b0..74fb56e 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/Object.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/Object.js
@@ -67,10 +67,10 @@ WebInspector.Object.prototype = {
}
var event = {target: this, type: eventType, defaultPrevented: false};
- event.stopPropagation = stopPropagation.bind(event);
- event.preventDefault = preventDefault.bind(event);
+ event.stopPropagation = stopPropagation;
+ event.preventDefault = preventDefault;
- var listeners = this._listeners[eventType];
+ var listeners = this._listeners[eventType].slice(0);
for (var i = 0; i < listeners.length; ++i) {
listeners[i].listener.call(listeners[i].thisObject, event);
if (stoppedPropagation)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js
index 2b8c6ce..ee96345 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ProfileView.js
@@ -23,7 +23,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-WebInspector.ProfileView = function(profile)
+// FIXME: Rename the file.
+
+WebInspector.CPUProfileView = function(profile)
{
WebInspector.View.call(this);
@@ -78,15 +80,25 @@ WebInspector.ProfileView = function(profile)
this.profile = profile;
- this.profileDataGridTree = this.bottomUpProfileDataGridTree;
- this.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
-
- this.refresh();
+ var self = this;
+ function profileCallback(profile)
+ {
+ self.profile.representedObject = profile;
+ self._assignParentsInProfile();
+
+ self.profileDataGridTree = self.bottomUpProfileDataGridTree;
+ self.profileDataGridTree.sort(WebInspector.ProfileDataGridTree.propertyComparator("selfTime", false));
+
+ self.refresh();
+
+ self._updatePercentButton();
+ }
- this._updatePercentButton();
+ var callId = WebInspector.Callback.wrap(profileCallback);
+ InspectorController.getProfile(callId, this.profile.uid);
}
-WebInspector.ProfileView.prototype = {
+WebInspector.CPUProfileView.prototype = {
get statusBarItems()
{
return [this.viewSelectElement, this.percentButton.element, this.focusButton.element, this.excludeButton.element, this.resetButton.element];
@@ -158,7 +170,7 @@ WebInspector.ProfileView.prototype = {
WebInspector.View.prototype.hide.call(this);
this._currentSearchResultIndex = -1;
},
-
+
resize: function()
{
if (this.dataGrid)
@@ -493,7 +505,7 @@ WebInspector.ProfileView.prototype = {
_sortData: function(event)
{
- this._sortProfile(this.profile);
+ this._sortProfile(this.profile.representedObject);
},
_sortProfile: function()
@@ -533,7 +545,100 @@ WebInspector.ProfileView.prototype = {
event.preventDefault();
event.stopPropagation();
+ },
+
+ _assignParentsInProfile: function()
+ {
+ var head = this.profile.head;
+ head.parent = null;
+ head.head = null;
+ var nodesToTraverse = [ { parent: head, children: head.children } ];
+ while (nodesToTraverse.length > 0) {
+ var pair = nodesToTraverse.shift();
+ var parent = pair.parent;
+ var children = pair.children;
+ var length = children.length;
+ for (var i = 0; i < length; ++i) {
+ children[i].head = head;
+ children[i].parent = parent;
+ if (children[i].children.length > 0)
+ nodesToTraverse.push({ parent: children[i], children: children[i].children });
+ }
+ }
+ }
+}
+
+WebInspector.CPUProfileView.prototype.__proto__ = WebInspector.View.prototype;
+
+WebInspector.CPUProfileType = function()
+{
+ WebInspector.ProfileType.call(this, WebInspector.CPUProfileType.TypeId, WebInspector.UIString("CPU PROFILES"));
+ this._recording = false;
+}
+
+WebInspector.CPUProfileType.TypeId = "CPU";
+
+WebInspector.CPUProfileType.prototype = {
+ get buttonTooltip()
+ {
+ return this._recording ? WebInspector.UIString("Stop profiling.") : WebInspector.UIString("Start profiling.");
+ },
+
+ get buttonStyle()
+ {
+ return this._recording ? "record-profile-status-bar-item status-bar-item toggled-on" : "record-profile-status-bar-item status-bar-item";
+ },
+
+ buttonClicked: function()
+ {
+ this._recording = !this._recording;
+
+ if (this._recording)
+ InspectorController.startProfiling();
+ else
+ InspectorController.stopProfiling();
+ },
+
+ setRecordingProfile: function(isProfiling)
+ {
+ this._recording = isProfiling;
}
}
-WebInspector.ProfileView.prototype.__proto__ = WebInspector.View.prototype;
+WebInspector.CPUProfileType.prototype.__proto__ = WebInspector.ProfileType.prototype;
+
+WebInspector.CPUProfile = function(profile)
+{
+ this.representedObject = profile;
+ this.typeId = WebInspector.CPUProfileType.TypeId;
+}
+
+WebInspector.CPUProfile.prototype = {
+ get title()
+ {
+ return this.representedObject.title;
+ },
+
+ get uid()
+ {
+ return this.representedObject.uid;
+ },
+
+ get head()
+ {
+ return this.representedObject.head;
+ },
+
+ createView: function()
+ {
+ return new WebInspector.CPUProfileView(this);
+ },
+
+ // FIXME: Extract this into a superclass so that createView can be simply overridden by subclasses.
+ viewForProfile: function()
+ {
+ if (!this._profileView)
+ this._profileView = this.createView();
+ return this._profileView;
+ }
+}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js
index 3bd4464..55e286e 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ProfilesPanel.js
@@ -25,11 +25,52 @@
const UserInitiatedProfileName = "org.webkit.profiles.user-initiated";
+WebInspector.ProfileType = function(id, name)
+{
+ this._id = id;
+ this._name = name;
+}
+
+WebInspector.ProfileType.URLRegExp = /webkit-profile:\/\/(.+)\/(.+)#([0-9]+)/;
+
+WebInspector.ProfileType.prototype = {
+ get buttonTooltip()
+ {
+ return "";
+ },
+
+ get buttonStyle()
+ {
+ return undefined;
+ },
+
+ get buttonCaption()
+ {
+ return this.name;
+ },
+
+ get id()
+ {
+ return this._id;
+ },
+
+ get name()
+ {
+ return this._name;
+ },
+
+ buttonClicked: function()
+ {
+ }
+}
+
WebInspector.ProfilesPanel = function()
{
WebInspector.Panel.call(this);
this.element.addStyleClass("profiles");
+ this._profileTypesByIdMap = {};
+ this._profileTypeButtonsByIdMap = {};
var panelEnablerHeading = WebInspector.UIString("You need to enable profiling before you can use the Profiles panel.");
var panelEnablerDisclaimer = WebInspector.UIString("Enabling profiling will make scripts run slower.");
@@ -52,19 +93,8 @@ WebInspector.ProfilesPanel = function()
this.sidebarTreeElement = document.createElement("ol");
this.sidebarTreeElement.className = "sidebar-tree";
this.sidebarElement.appendChild(this.sidebarTreeElement);
-
this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
- this.profilesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("CPU PROFILES"), null, true);
- this.sidebarTree.appendChild(this.profilesListTreeElement);
- this.profilesListTreeElement.expand();
-
- this.snapshotsListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("HEAP SNAPSHOTS"), null, true);
- if (Preferences.heapProfilerPresent) {
- this.sidebarTree.appendChild(this.snapshotsListTreeElement);
- this.snapshotsListTreeElement.expand();
- }
-
this.profileViews = document.createElement("div");
this.profileViews.id = "profile-views";
this.element.appendChild(this.profileViews);
@@ -72,18 +102,10 @@ WebInspector.ProfilesPanel = function()
this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
this.enableToggleButton.addEventListener("click", this._toggleProfiling.bind(this), false);
- this.recordButton = new WebInspector.StatusBarButton(WebInspector.UIString("Start profiling."), "record-profile-status-bar-item");
- this.recordButton.addEventListener("click", this._recordClicked.bind(this), false);
-
- this.recording = false;
-
- this.snapshotButton = new WebInspector.StatusBarButton(WebInspector.UIString("Take heap snapshot."), "heap-snapshot-status-bar-item");
- this.snapshotButton.visible = Preferences.heapProfilerPresent;
- this.snapshotButton.addEventListener("click", this._snapshotClicked.bind(this), false);
-
this.profileViewStatusBarItemsContainer = document.createElement("div");
this.profileViewStatusBarItemsContainer.id = "profile-view-status-bar-items";
+ this._profiles = [];
this.reset();
}
@@ -97,7 +119,25 @@ WebInspector.ProfilesPanel.prototype = {
get statusBarItems()
{
- return [this.enableToggleButton.element, this.recordButton.element, this.snapshotButton.element, this.profileViewStatusBarItemsContainer];
+ function clickHandler(profileType, buttonElement)
+ {
+ profileType.buttonClicked.call(profileType);
+ this.updateProfileTypeButtons();
+ }
+
+ var items = [this.enableToggleButton.element];
+ // FIXME: Generate a single "combo-button".
+ for (var typeId in this._profileTypesByIdMap) {
+ var profileType = this.getProfileType(typeId);
+ if (profileType.buttonStyle) {
+ var button = new WebInspector.StatusBarButton(profileType.buttonTooltip, profileType.buttonStyle, profileType.buttonCaption);
+ this._profileTypeButtonsByIdMap[typeId] = button.element;
+ button.element.addEventListener("click", clickHandler.bind(this, profileType, button.element), false);
+ items.push(button.element);
+ }
+ }
+ items.push(this.profileViewStatusBarItemsContainer);
+ return items;
},
show: function()
@@ -129,13 +169,8 @@ WebInspector.ProfilesPanel.prototype = {
reset: function()
{
- if (this._profiles) {
- var profiledLength = this._profiles.length;
- for (var i = 0; i < profiledLength; ++i) {
- var profile = this._profiles[i];
- delete profile._profileView;
- }
- }
+ for (var i = 0; i < this._profiles.length; ++i)
+ delete this._profiles[i]._profileView;
delete this.currentQuery;
this.searchCanceled();
@@ -147,8 +182,9 @@ WebInspector.ProfilesPanel.prototype = {
this.sidebarTreeElement.removeStyleClass("some-expandable");
- this.profilesListTreeElement.removeChildren();
- this.snapshotsListTreeElement.removeChildren();
+ for (var typeId in this._profileTypesByIdMap)
+ this.getProfileType(typeId).treeElement.removeChildren();
+
this.profileViews.removeChildren();
this.profileViewStatusBarItemsContainer.removeChildren();
@@ -161,20 +197,34 @@ WebInspector.ProfilesPanel.prototype = {
this.sidebarTree.handleKeyEvent(event);
},
- addProfile: function(profile)
+ registerProfileType: function(profileType)
{
- this._profiles.push(profile);
- this._profilesIdMap[profile.uid] = profile;
+ this._profileTypesByIdMap[profileType.id] = profileType;
+ profileType.treeElement = new WebInspector.SidebarSectionTreeElement(profileType.name, null, true);
+ this.sidebarTree.appendChild(profileType.treeElement);
+ profileType.treeElement.expand();
+ },
+
+ _makeKey: function(text, profileTypeId)
+ {
+ return escape(text) + '/' + escape(profileTypeId);
+ },
- var sidebarParent = this.profilesListTreeElement;
+ addProfileHeader: function(typeId, profile)
+ {
+ var sidebarParent = this.getProfileType(typeId).treeElement;
var small = false;
var alternateTitle;
+ this._profiles.push(profile);
+ this._profilesIdMap[this._makeKey(profile.uid, typeId)] = profile;
+
if (profile.title.indexOf(UserInitiatedProfileName) !== 0) {
- if (!(profile.title in this._profileGroups))
- this._profileGroups[profile.title] = [];
+ var profileTitleKey = this._makeKey(profile.title, typeId);
+ if (!(profileTitleKey in this._profileGroups))
+ this._profileGroups[profileTitleKey] = [];
- var group = this._profileGroups[profile.title];
+ var group = this._profileGroups[profileTitleKey];
group.push(profile);
if (group.length === 2) {
@@ -182,12 +232,12 @@ WebInspector.ProfilesPanel.prototype = {
group._profilesTreeElement = new WebInspector.ProfileGroupSidebarTreeElement(profile.title);
// Insert at the same index for the first profile of the group.
- var index = this.sidebarTree.children.indexOf(group[0]._profilesTreeElement);
- this.sidebarTree.insertChild(group._profilesTreeElement, index);
+ var index = sidebarParent.children.indexOf(group[0]._profilesTreeElement);
+ sidebarParent.insertChild(group._profilesTreeElement, index);
// Move the first profile to the group.
var selected = group[0]._profilesTreeElement.selected;
- this.sidebarTree.removeChild(group[0]._profilesTreeElement);
+ sidebarParent.removeChild(group[0]._profilesTreeElement);
group._profilesTreeElement.appendChild(group[0]._profilesTreeElement);
if (selected) {
group[0]._profilesTreeElement.select();
@@ -214,6 +264,8 @@ WebInspector.ProfilesPanel.prototype = {
profile._profilesTreeElement = profileTreeElement;
sidebarParent.appendChild(profileTreeElement);
+ if (!this.visibleView)
+ this.showProfile(profile);
},
showProfile: function(profile)
@@ -224,7 +276,7 @@ WebInspector.ProfilesPanel.prototype = {
if (this.visibleView)
this.visibleView.hide();
- var view = this.profileViewForProfile(profile);
+ var view = profile.viewForProfile();
view.show(this.profileViews);
@@ -245,18 +297,28 @@ WebInspector.ProfilesPanel.prototype = {
this.showProfile(view.profile);
},
- profileViewForProfile: function(profile)
+ getProfileType: function(typeId)
{
- if (!profile)
- return null;
- if (!profile._profileView)
- profile._profileView = new WebInspector.ProfileView(profile);
- return profile._profileView;
+ return this._profileTypesByIdMap[typeId];
},
- showProfileById: function(uid)
+ showProfileForURL: function(url)
{
- this.showProfile(this._profilesIdMap[uid]);
+ var match = url.match(WebInspector.ProfileType.URLRegExp);
+ if (!match)
+ return;
+ this.showProfile(this._profilesIdMap[this._makeKey(match[3], match[1])]);
+ },
+
+ updateProfileTypeButtons: function()
+ {
+ for (var typeId in this._profileTypeButtonsByIdMap) {
+ var buttonElement = this._profileTypeButtonsByIdMap[typeId];
+ var profileType = this.getProfileType(typeId);
+ buttonElement.className = profileType.buttonStyle;
+ buttonElement.title = profileType.buttonTooltip;
+ // FIXME: Apply profileType.buttonCaption once captions are added to button controls.
+ }
},
closeVisibleView: function()
@@ -266,16 +328,17 @@ WebInspector.ProfilesPanel.prototype = {
delete this.visibleView;
},
- displayTitleForProfileLink: function(title)
+ displayTitleForProfileLink: function(title, typeId)
{
title = unescape(title);
if (title.indexOf(UserInitiatedProfileName) === 0) {
title = WebInspector.UIString("Profile %d", title.substring(UserInitiatedProfileName.length + 1));
} else {
- if (!(title in this._profileGroupsForLinks))
- this._profileGroupsForLinks[title] = 0;
+ var titleKey = this._makeKey(title, typeId);
+ if (!(titleKey in this._profileGroupsForLinks))
+ this._profileGroupsForLinks[titleKey] = 0;
- groupNumber = ++this._profileGroupsForLinks[title];
+ groupNumber = ++this._profileGroupsForLinks[titleKey];
if (groupNumber > 2)
// The title is used in the console message announcing that a profile has started so it gets
@@ -296,7 +359,7 @@ WebInspector.ProfilesPanel.prototype = {
var profilesLength = this._profiles.length;
for (var i = 0; i < profilesLength; ++i) {
- var view = this.profileViewForProfile(this._profiles[i]);
+ var view = this._profiles[i].viewForProfile();
if (!view.performSearch || view === visibleView)
continue;
views.push(view);
@@ -323,19 +386,6 @@ WebInspector.ProfilesPanel.prototype = {
}
},
- setRecordingProfile: function(isProfiling)
- {
- this.recording = isProfiling;
-
- if (isProfiling) {
- this.recordButton.toggled = true;
- this.recordButton.title = WebInspector.UIString("Stop profiling.");
- } else {
- this.recordButton.toggled = false;
- this.recordButton.title = WebInspector.UIString("Start profiling.");
- }
- },
-
resize: function()
{
var visibleView = this.visibleView;
@@ -345,39 +395,24 @@ WebInspector.ProfilesPanel.prototype = {
_updateInterface: function()
{
+ // FIXME: Replace ProfileType-specific button visibility changes by a single ProfileType-agnostic "combo-button" visibility change.
if (InspectorController.profilerEnabled()) {
this.enableToggleButton.title = WebInspector.UIString("Profiling enabled. Click to disable.");
this.enableToggleButton.toggled = true;
- this.recordButton.visible = true;
- if (Preferences.heapProfilerPresent)
- this.snapshotButton.visible = true;
+ for (var typeId in this._profileTypeButtonsByIdMap)
+ this._profileTypeButtonsByIdMap[typeId].removeStyleClass("hidden");
this.profileViewStatusBarItemsContainer.removeStyleClass("hidden");
this.panelEnablerView.visible = false;
} else {
this.enableToggleButton.title = WebInspector.UIString("Profiling disabled. Click to enable.");
this.enableToggleButton.toggled = false;
- this.recordButton.visible = false;
- this.snapshotButton.visible = false;
+ for (var typeId in this._profileTypeButtonsByIdMap)
+ this._profileTypeButtonsByIdMap[typeId].addStyleClass("hidden");
this.profileViewStatusBarItemsContainer.addStyleClass("hidden");
this.panelEnablerView.visible = true;
}
},
- _recordClicked: function()
- {
- this.recording = !this.recording;
-
- if (this.recording)
- InspectorController.startProfiling();
- else
- InspectorController.stopProfiling();
- },
-
- _snapshotClicked: function()
- {
- InspectorController.takeHeapSnapshot();
- },
-
_enableProfiling: function()
{
if (InspectorController.profilerEnabled())
@@ -397,19 +432,19 @@ WebInspector.ProfilesPanel.prototype = {
{
// FIXME: This code needs to be adjusted when more profiling types are added.
// Currently defaults to CPU profiles.
- var cpuProfiles = this.sidebarTree.children[0];
+ var cpuProfiles = this.getProfileType(WebInspector.CPUProfileType.TypeId).treeElement;
if (cpuProfiles.children.length)
return;
- var profiles = InspectorController.profiles();
- var profilesLength = profiles.length;
- for (var i = 0; i < profilesLength; ++i) {
- var profile = profiles[i];
- this.addProfile(profile);
+ function populateCallback(profileHeaders) {
+ profileHeaders.sort(function(a, b) { return a.uid - b.uid; });
+ var profileHeadersLength = profileHeaders.length;
+ for (var i = 0; i < profileHeadersLength; ++i)
+ WebInspector.addProfileHeader(profileHeaders[i]);
}
- if (cpuProfiles.children[0])
- cpuProfiles.children[0].select();
+ var callId = WebInspector.Callback.wrap(populateCallback);
+ InspectorController.getProfileHeaders(callId);
delete this._shouldPopulateProfiles;
},
@@ -535,3 +570,6 @@ WebInspector.ProfileGroupSidebarTreeElement.prototype = {
}
WebInspector.ProfileGroupSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
+
+WebInspector.didGetProfileHeaders = WebInspector.Callback.processCallback;
+WebInspector.didGetProfile = WebInspector.Callback.processCallback;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ResourceView.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ResourceView.js
index 4fcc956..28586f6 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ResourceView.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ResourceView.js
@@ -197,6 +197,7 @@ WebInspector.ResourceView.prototype = {
var title = "<div class=\"header-name\">&nbsp;</div>";
title += "<div class=\"raw-form-data header-value\">" + formData.escapeHTML() + "</div>";
var parmTreeElement = new TreeElement(title, null, false);
+ parmTreeElement.selectable = false;
this.requestPayloadTreeElement.appendChild(parmTreeElement);
},
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js
index 2c96974..0f873e7 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ResourcesPanel.js
@@ -71,6 +71,10 @@ WebInspector.ResourcesPanel = function()
this.dividersElement = document.createElement("div");
this.dividersElement.id = "resources-dividers";
this.containerContentElement.appendChild(this.dividersElement);
+
+ this.eventDividersElement = document.createElement("div");
+ this.eventDividersElement.id = "resources-event-dividers";
+ this.containerContentElement.appendChild(this.eventDividersElement);
this.dividersLabelBarElement = document.createElement("div");
this.dividersLabelBarElement.id = "resources-dividers-label-bar";
@@ -133,8 +137,12 @@ WebInspector.ResourcesPanel = function()
this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
- this.largerResourcesButton.toggled = true;
+ this.largerResourcesButton.toggled = Preferences.resourcesLargeRows;
this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
+ if (!Preferences.resourcesLargeRows) {
+ Preferences.resourcesLargeRows = !Preferences.resourcesLargeRows;
+ this._toggleLargerResources(); // this will toggle the preference back to the original
+ }
this.sortingSelectElement = document.createElement("select");
this.sortingSelectElement.className = "status-bar-item";
@@ -204,6 +212,37 @@ WebInspector.ResourcesPanel.prototype = {
{
return WebInspector.UIString("Resources");
},
+
+ get mainResourceLoadTime()
+ {
+ return this._mainResourceLoadTime || -1;
+ },
+
+ set mainResourceLoadTime(x)
+ {
+ if (this._mainResourceLoadTime === x)
+ return;
+
+ this._mainResourceLoadTime = x;
+
+ // Update the dividers to draw the new line
+ this._updateGraphDividersIfNeeded(true);
+ },
+
+ get mainResourceDOMContentTime()
+ {
+ return this._mainResourceDOMContentTime || -1;
+ },
+
+ set mainResourceDOMContentTime(x)
+ {
+ if (this._mainResourceDOMContentTime === x)
+ return;
+
+ this._mainResourceDOMContentTime = x;
+
+ this._updateGraphDividersIfNeeded(true);
+ },
get statusBarItems()
{
@@ -451,6 +490,9 @@ WebInspector.ResourcesPanel.prototype = {
this._resources = [];
this._staleResources = [];
+
+ this.mainResourceLoadTime = -1;
+ this.mainResourceDOMContentTime = -1;
this.resourcesTreeElement.removeChildren();
this.viewsContainerElement.removeChildren();
@@ -702,6 +744,7 @@ WebInspector.ResourcesPanel.prototype = {
this._currentDividerSlice = slice;
this.dividersElement.removeChildren();
+ this.eventDividersElement.removeChildren();
this.dividersLabelBarElement.removeChildren();
for (var i = 1; i <= dividerCount; ++i) {
@@ -721,6 +764,43 @@ WebInspector.ResourcesPanel.prototype = {
this.dividersLabelBarElement.appendChild(divider);
}
+
+ if (this.calculator.startAtZero) {
+ // If our current sorting method starts at zero, that means it shows all
+ // resources starting at the same point, and so onLoad event and DOMContent
+ // event lines really wouldn't make much sense here, so don't render them.
+ return;
+ }
+
+ if (this.mainResourceLoadTime !== -1) {
+ var percent = this.calculator.computePercentageFromEventTime(this.mainResourceLoadTime);
+
+ var loadDivider = document.createElement("div");
+ loadDivider.className = "resources-onload-divider";
+
+ var loadDividerPadding = document.createElement("div");
+ loadDividerPadding.className = "resources-event-divider-padding";
+ loadDividerPadding.style.left = percent + "%";
+ loadDividerPadding.title = WebInspector.UIString("Load event fired");
+ loadDividerPadding.appendChild(loadDivider);
+
+ this.eventDividersElement.appendChild(loadDividerPadding);
+ }
+
+ if (this.mainResourceDOMContentTime !== -1) {
+ var percent = this.calculator.computePercentageFromEventTime(this.mainResourceDOMContentTime);
+
+ var domContentDivider = document.createElement("div");
+ domContentDivider.className = "resources-ondomcontent-divider";
+
+ var domContentDividerPadding = document.createElement("div");
+ domContentDividerPadding.className = "resources-event-divider-padding";
+ domContentDividerPadding.style.left = percent + "%";
+ domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
+ domContentDividerPadding.appendChild(domContentDivider);
+
+ this.eventDividersElement.appendChild(domContentDividerPadding);
+ }
},
_updateSummaryGraph: function()
@@ -733,6 +813,7 @@ WebInspector.ResourcesPanel.prototype = {
var scrollTop = this.containerElement.scrollTop;
var dividersTop = (scrollTop < this.summaryBar.element.offsetHeight ? this.summaryBar.element.offsetHeight : scrollTop);
this.dividersElement.style.top = scrollTop + "px";
+ this.eventDividersElement.style.top = scrollTop + "px";
this.dividersLabelBarElement.style.top = dividersTop + "px";
},
@@ -766,6 +847,8 @@ WebInspector.ResourcesPanel.prototype = {
return;
this.resourcesTreeElement.smallChildren = !this.resourcesTreeElement.smallChildren;
+ Preferences.resourcesLargeRows = !Preferences.resourcesLargeRows;
+ InspectorController.setSetting("resources-large-rows", Preferences.resourcesLargeRows);
if (this.resourcesTreeElement.smallChildren) {
this.resourcesGraphsElement.addStyleClass("small");
@@ -1048,6 +1131,17 @@ WebInspector.ResourceTimeCalculator.prototype = {
return {start: start, middle: middle, end: end};
},
+
+ computePercentageFromEventTime: function(eventTime)
+ {
+ // This function computes a percentage in terms of the total loading time
+ // of a specific event. If startAtZero is set, then this is useless, and we
+ // want to return 0.
+ if (eventTime !== -1 && !this.startAtZero)
+ return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
+
+ return 0;
+ },
computeBarGraphLabels: function(resource)
{
@@ -1193,13 +1287,12 @@ WebInspector.ResourceSidebarTreeElement.prototype = {
{
WebInspector.SidebarTreeElement.prototype.onattach.call(this);
- var link = document.createElement("a");
- link.href = this.resource.url;
- link.className = "invisible";
- while (this._listItemNode.firstChild)
- link.appendChild(this._listItemNode.firstChild);
- this._listItemNode.appendChild(link);
this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
+ this._listItemNode.draggable = true;
+
+ // FIXME: should actually add handler to parent, to be resolved via
+ // https://bugs.webkit.org/show_bug.cgi?id=30227
+ this._listItemNode.addEventListener("dragstart", this.ondragstart.bind(this), false);
},
onselect: function()
@@ -1212,6 +1305,13 @@ WebInspector.ResourceSidebarTreeElement.prototype = {
InjectedScriptAccess.openInInspectedWindow(this.resource.url, function() {});
},
+ ondragstart: function(event) {
+ event.dataTransfer.setData("text/plain", this.resource.url);
+ event.dataTransfer.setData("text/uri-list", this.resource.url + "\r\n");
+ event.dataTransfer.effectAllowed = "copy";
+ return true;
+ },
+
get mainTitle()
{
return this.resource.displayName;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ScopeChainSidebarPane.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ScopeChainSidebarPane.js
index 3875324..fdfcd38 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ScopeChainSidebarPane.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ScopeChainSidebarPane.js
@@ -55,14 +55,16 @@ WebInspector.ScopeChainSidebarPane.prototype = {
var extraProperties = null;
if (scopeObjectProxy.isLocal) {
- if (scopeObjectProxy.thisObject) {
+ foundLocalScope = true;
+ title = WebInspector.UIString("Local");
+ emptyPlaceholder = WebInspector.UIString("No Variables");
+ subtitle = null;
+ if (scopeObjectProxy.thisObject)
extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
- title = WebInspector.UIString("Local");
- } else
- title = WebInspector.UIString("Closure");
+ } else if (scopeObjectProxy.isClosure) {
+ title = WebInspector.UIString("Closure");
emptyPlaceholder = WebInspector.UIString("No Variables");
subtitle = null;
- foundLocalScope = true;
} else if (i === (scopeChain.length - 1))
title = WebInspector.UIString("Global");
else if (scopeObjectProxy.isElement)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js b/src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js
index ae918d1..4aa0ab2 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/ScriptsPanel.js
@@ -359,7 +359,7 @@ WebInspector.ScriptsPanel.prototype = {
return selectedCallFrame.id;
},
- evaluateInSelectedCallFrame: function(code, updateInterface, callback)
+ evaluateInSelectedCallFrame: function(code, updateInterface, objectGroup, callback)
{
var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
if (!this._paused || !selectedCallFrame)
@@ -375,33 +375,17 @@ WebInspector.ScriptsPanel.prototype = {
if (updateInterface)
self.sidebarPanes.scopechain.update(selectedCallFrame);
}
- this.doEvalInCallFrame(selectedCallFrame, code, updatingCallbackWrapper);
+ this.doEvalInCallFrame(selectedCallFrame, code, objectGroup, updatingCallbackWrapper);
},
- doEvalInCallFrame: function(callFrame, code, callback)
+ doEvalInCallFrame: function(callFrame, code, objectGroup, callback)
{
function evalCallback(result)
{
if (result)
callback(result.value, result.isException);
}
- InjectedScriptAccess.evaluateInCallFrame(callFrame.id, code, evalCallback);
- },
-
- variablesInSelectedCallFrame: function()
- {
- var selectedCallFrame = this.sidebarPanes.callstack.selectedCallFrame;
- if (!this._paused || !selectedCallFrame)
- return {};
-
- var result = {};
- var scopeChain = selectedCallFrame.scopeChain;
- for (var i = 0; i < scopeChain.length; ++i) {
- var scopeObjectProperties = scopeChain[i].properties;
- for (var j = 0; j < scopeObjectProperties.length; ++j)
- result[scopeObjectProperties[j]] = true;
- }
- return result;
+ InjectedScriptAccess.evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
},
debuggerPaused: function(callFrames)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js b/src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js
index e364cb2..790055a 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/SourceFrame.js
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -216,12 +217,18 @@ WebInspector.SourceFrame.prototype = {
headElement = this.element.contentDocument.createElement("head");
this.element.contentDocument.documentElement.insertBefore(headElement, this.element.contentDocument.documentElement.firstChild);
}
+
+ var linkElement = this.element.contentDocument.createElement("link");
+ linkElement.type = "text/css";
+ linkElement.rel = "stylesheet";
+ linkElement.href = "inspectorSyntaxHighlight.css";
+ headElement.appendChild(linkElement);
var styleElement = this.element.contentDocument.createElement("style");
headElement.appendChild(styleElement);
// Add these style rules here since they are specific to the Inspector. They also behave oddly and not
- // all properties apply if added to view-source.css (becuase it is a user agent sheet.)
+ // all properties apply if added to view-source.css (because it is a user agent sheet.)
var styleText = ".webkit-line-number { background-repeat: no-repeat; background-position: right 1px; }\n";
styleText += ".webkit-execution-line .webkit-line-number { color: transparent; background-image: -webkit-canvas(program-counter); }\n";
@@ -240,10 +247,6 @@ WebInspector.SourceFrame.prototype = {
styleText += ".webkit-line-content { background-color: white; }\n";
styleText += "@-webkit-keyframes fadeout {from {background-color: rgb(255, 255, 120);} to { background-color: white;}}\n";
styleText += ".webkit-highlighted-line .webkit-line-content { background-color: rgb(255, 255, 120); -webkit-animation: 'fadeout' 2s 500ms}\n";
- styleText += ".webkit-javascript-comment { color: rgb(0, 116, 0); }\n";
- styleText += ".webkit-javascript-keyword { color: rgb(170, 13, 145); }\n";
- styleText += ".webkit-javascript-number { color: rgb(28, 0, 207); }\n";
- styleText += ".webkit-javascript-string, .webkit-javascript-regexp { color: rgb(196, 26, 22); }\n";
// TODO: Move these styles into inspector.css once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed and popup moved into the top frame.
styleText += ".popup-content { position: absolute; z-index: 10000; padding: 4px; background-color: rgb(203, 226, 255); -webkit-border-radius: 7px; border: 2px solid rgb(169, 172, 203); }";
@@ -253,7 +256,7 @@ WebInspector.SourceFrame.prototype = {
styleText += ".popup-content input#bp-condition { font-family: monospace; margin: 0; border: 1px inset rgb(190, 190, 190) !important; width: 100%; box-shadow: none !important; outline: none !important; -webkit-user-modify: read-write; }";
// This class is already in inspector.css
styleText += ".hidden { display: none !important; }";
-
+
styleElement.textContent = styleText;
this._needsProgramCounterImage = true;
@@ -311,11 +314,11 @@ WebInspector.SourceFrame.prototype = {
var sourceRow = event.target.enclosingNodeOrSelfWithNodeName("tr");
if (!sourceRow._breakpointObject && this.addBreakpointDelegate)
this.addBreakpointDelegate(this.lineNumberForSourceRow(sourceRow));
-
+
var breakpoint = sourceRow._breakpointObject;
if (!breakpoint)
return;
-
+
this._editBreakpointCondition(event.target, sourceRow, breakpoint);
event.preventDefault();
},
@@ -340,7 +343,7 @@ WebInspector.SourceFrame.prototype = {
// TODO: Migrate the popup to the top-level document and remove the blur listener from conditionElement once https://bugs.webkit.org/show_bug.cgi?id=28913 is fixed.
var popupDocument = this.element.contentDocument;
this._showBreakpointConditionPopup(eventTarget, breakpoint.line, popupDocument);
-
+
function committed(element, newText)
{
breakpoint.condition = newText;
@@ -359,7 +362,7 @@ WebInspector.SourceFrame.prototype = {
var dismissedHandler = dismissed.bind(this);
this._conditionEditorElement.addEventListener("blur", dismissedHandler, false);
-
+
WebInspector.startEditing(this._conditionEditorElement, committed.bind(this), dismissedHandler);
this._conditionEditorElement.value = breakpoint.condition;
this._conditionEditorElement.select();
@@ -716,191 +719,394 @@ WebInspector.SourceFrame.prototype = {
if (!table)
return;
- function deleteContinueFlags(cell)
- {
- if (!cell)
- return;
- delete cell._commentContinues;
- delete cell._singleQuoteStringContinues;
- delete cell._doubleQuoteStringContinues;
- delete cell._regexpContinues;
- }
+ var jsSyntaxHighlighter = new WebInspector.JavaScriptSourceSyntaxHighlighter(table, this);
+ jsSyntaxHighlighter.process();
+ },
- function createSpan(content, className)
- {
- var span = document.createElement("span");
- span.className = className;
- span.appendChild(document.createTextNode(content));
- return span;
- }
+ syntaxHighlightCSS: function()
+ {
+ var table = this.element.contentDocument.getElementsByTagName("table")[0];
+ if (!table)
+ return;
- function generateFinder(regex, matchNumber, className)
- {
- return function(str) {
- var match = regex.exec(str);
- if (!match)
- return null;
- previousMatchLength = match[matchNumber].length;
- return createSpan(match[matchNumber], className);
- };
- }
+ var cssSyntaxHighlighter = new WebInspector.CSSSourceSyntaxHighligher(table, this);
+ cssSyntaxHighlighter.process();
+ }
+}
- var findNumber = generateFinder(/^(-?(\d+\.?\d*([eE][+-]\d+)?|0[xX]\h+|Infinity)|NaN)(?:\W|$)/, 1, "webkit-javascript-number");
- var findKeyword = generateFinder(/^(null|true|false|break|case|catch|const|default|finally|for|instanceof|new|var|continue|function|return|void|delete|if|this|do|while|else|in|switch|throw|try|typeof|with|debugger|class|enum|export|extends|import|super|get|set)(?:\W|$)/, 1, "webkit-javascript-keyword");
- var findSingleLineString = generateFinder(/^"(?:[^"\\]|\\.)*"|^'([^'\\]|\\.)*'/, 0, "webkit-javascript-string"); // " this quote keeps Xcode happy
- var findMultilineCommentStart = generateFinder(/^\/\*.*$/, 0, "webkit-javascript-comment");
- var findMultilineCommentEnd = generateFinder(/^.*?\*\//, 0, "webkit-javascript-comment");
- var findMultilineSingleQuoteStringStart = generateFinder(/^'(?:[^'\\]|\\.)*\\$/, 0, "webkit-javascript-string");
- var findMultilineSingleQuoteStringEnd = generateFinder(/^(?:[^'\\]|\\.)*?'/, 0, "webkit-javascript-string");
- var findMultilineDoubleQuoteStringStart = generateFinder(/^"(?:[^"\\]|\\.)*\\$/, 0, "webkit-javascript-string");
- var findMultilineDoubleQuoteStringEnd = generateFinder(/^(?:[^"\\]|\\.)*?"/, 0, "webkit-javascript-string");
- var findMultilineRegExpEnd = generateFinder(/^(?:[^\/\\]|\\.)*?\/([gim]{0,3})/, 0, "webkit-javascript-regexp");
- var findSingleLineComment = generateFinder(/^\/\/.*|^\/\*.*?\*\//, 0, "webkit-javascript-comment");
-
- function findMultilineRegExpStart(str)
- {
- var match = /^\/(?:[^\/\\]|\\.)*\\$/.exec(str);
- if (!match || !/\\|\$|\.[\?\*\+]|[^\|]\|[^\|]/.test(match[0]))
+WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
+
+WebInspector.SourceSyntaxHighligher = function(table, sourceFrame)
+{
+ this.table = table;
+ this.sourceFrame = sourceFrame;
+}
+
+WebInspector.SourceSyntaxHighligher.prototype = {
+ createSpan: function(content, className)
+ {
+ var span = document.createElement("span");
+ span.className = className;
+ span.appendChild(document.createTextNode(content));
+ return span;
+ },
+
+ generateFinder: function(regex, matchNumber, className)
+ {
+ return function(str) {
+ var match = regex.exec(str);
+ if (!match)
return null;
- var node = createSpan(match[0], "webkit-javascript-regexp");
- previousMatchLength = match[0].length;
- return node;
- }
+ this.previousMatchLength = match[matchNumber].length;
+ return this.createSpan(match[matchNumber], className);
+ };
+ },
+
+ process: function()
+ {
+ // Split up the work into chunks so we don't block the
+ // UI thread while processing.
+
+ var i = 0;
+ var rows = this.table.rows;
+ var rowsLength = rows.length;
+ var previousCell = null;
+ const linesPerChunk = 10;
- function findSingleLineRegExp(str)
+ function processChunk()
{
- var match = /^(\/(?:[^\/\\]|\\.)*\/([gim]{0,3}))(.?)/.exec(str);
- if (!match || !(match[2].length > 0 || /\\|\$|\.[\?\*\+]|[^\|]\|[^\|]/.test(match[1]) || /\.|;|,/.test(match[3])))
- return null;
- var node = createSpan(match[1], "webkit-javascript-regexp");
- previousMatchLength = match[1].length;
- return node;
+ for (var end = Math.min(i + linesPerChunk, rowsLength); i < end; ++i) {
+ var row = rows[i];
+ if (!row)
+ continue;
+ var cell = row.cells[1];
+ if (!cell)
+ continue;
+ this.syntaxHighlightLine(cell, previousCell);
+ if (i < (end - 1))
+ this.deleteContinueFlags(previousCell);
+ previousCell = cell;
+ }
+
+ if (i >= rowsLength && processChunkInterval) {
+ this.deleteContinueFlags(previousCell);
+ delete this.previousMatchLength;
+ clearInterval(processChunkInterval);
+
+ this.sourceFrame.dispatchEventToListeners("syntax highlighting complete");
+ }
}
- function syntaxHighlightJavascriptLine(line, prevLine)
- {
- var messageBubble = line.lastChild;
- if (messageBubble && messageBubble.nodeType === Node.ELEMENT_NODE && messageBubble.hasStyleClass("webkit-html-message-bubble"))
- line.removeChild(messageBubble);
- else
- messageBubble = null;
+ var boundProcessChunk = processChunk.bind(this);
+ var processChunkInterval = setInterval(boundProcessChunk, 25);
+ boundProcessChunk();
+ }
+}
+
+WebInspector.CSSSourceSyntaxHighligher = function(table, sourceFrame) {
+ WebInspector.SourceSyntaxHighligher.call(this, table, sourceFrame);
+
+ this.findNumber = this.generateFinder(/^((-?(\d+|\d*\.\d+))|^(#[a-fA-F0-9]{3,6}))(?:\D|$)/, 1, "webkit-css-number");
+ this.findUnits = this.generateFinder(/^(px|em|pt|in|cm|mm|pc|ex)(?:\W|$)/, 1, "webkit-css-unit");
+ this.findKeyword = this.generateFinder(/^(rgba?|hsla?|var)(?:\W|$)/, 1, "webkit-css-keyword");
+ this.findSingleLineString = this.generateFinder(/^"(?:[^"\\]|\\.)*"|^'([^'\\]|\\.)*'/, 0, "webkit-css-string"); // " this quote keeps Xcode happy
+ this.findSingleLineComment = this.generateFinder(/^\/\*.*?\*\//, 0, "webkit-css-comment");
+ this.findMultilineCommentStart = this.generateFinder(/^\/\*.*$/, 0, "webkit-css-comment");
+ this.findMultilineCommentEnd = this.generateFinder(/^.*?\*\//, 0, "webkit-css-comment");
+ this.findSelector = this.generateFinder(/^([#\.]?[_a-zA-Z].*?)(?:\W|$)/, 1, "webkit-css-selector");
+ this.findProperty = this.generateFinder(/^(-?[_a-z0-9][_a-z0-9-]*\s*)(?:\:)/, 1, "webkit-css-property");
+ this.findGenericIdent = this.generateFinder(/^([@-]?[_a-z0-9][_a-z0-9-]*)(?:\W|$)/, 1, "webkit-css-string");
+}
+
+WebInspector.CSSSourceSyntaxHighligher.prototype = {
+ deleteContinueFlags: function(cell)
+ {
+ if (!cell)
+ return;
+ delete cell._commentContinues;
+ delete cell._inSelector;
+ },
+
+ findPseudoClass: function(str)
+ {
+ var match = /^(::?)([_a-z0-9][_a-z0-9-]*)/.exec(str);
+ if (!match)
+ return null;
+ this.previousMatchLength = match[0].length;
+ var span = document.createElement("span");
+ span.appendChild(document.createTextNode(match[1]));
+ span.appendChild(this.createSpan(match[2], "webkit-css-pseudo-class"));
+ return span;
+ },
+
+ findURL: function(str)
+ {
+ var match = /^(?:local|url)\(([^\)]*?)\)/.exec(str);
+ if (!match)
+ return null;
+ this.previousMatchLength = match[0].length;
+ var innerUrlSpan = this.createSpan(match[1], "webkit-css-url");
+ var outerSpan = document.createElement("span");
+ outerSpan.appendChild(this.createSpan("url", "webkit-css-keyword"));
+ outerSpan.appendChild(document.createTextNode("("));
+ outerSpan.appendChild(innerUrlSpan);
+ outerSpan.appendChild(document.createTextNode(")"));
+ return outerSpan;
+ },
+
+ findAtRule: function(str)
+ {
+ var match = /^@[_a-z0-9][_a-z0-9-]*(?:\W|$)/.exec(str);
+ if (!match)
+ return null;
+ this.previousMatchLength = match[0].length;
+ return this.createSpan(match[0], "webkit-css-at-rule");
+ },
- var code = line.textContent;
+ syntaxHighlightLine: function(line, prevLine)
+ {
+ var code = line.textContent;
+ while (line.firstChild)
+ line.removeChild(line.firstChild);
- while (line.firstChild)
- line.removeChild(line.firstChild);
+ var token;
+ var tmp = 0;
+ var i = 0;
+ this.previousMatchLength = 0;
- var token;
- var tmp = 0;
- var i = 0;
- previousMatchLength = 0;
+ if (prevLine) {
+ if (prevLine._commentContinues) {
+ if (!(token = this.findMultilineCommentEnd(code))) {
+ token = this.createSpan(code, "webkit-javascript-comment");
+ line._commentContinues = true;
+ }
+ }
+ if (token) {
+ i += this.previousMatchLength ? this.previousMatchLength : code.length;
+ tmp = i;
+ line.appendChild(token);
+ }
+ }
- if (prevLine) {
- if (prevLine._commentContinues) {
- if (!(token = findMultilineCommentEnd(code))) {
- token = createSpan(code, "webkit-javascript-comment");
- line._commentContinues = true;
+ var inSelector = (prevLine && prevLine._inSelector); // inside a selector, we can now parse properties and values
+ var inAtRuleBlock = (prevLine && prevLine._inAtRuleBlock); // inside an @rule block, but not necessarily inside a selector yet
+ var atRuleStarted = (prevLine && prevLine._atRuleStarted); // we received an @rule, we may stop the @rule at a semicolon or open a block and become inAtRuleBlock
+ var atRuleIsSelector = (prevLine && prevLine._atRuleIsSelector); // when this @rule opens a block it immediately goes into parsing properties and values instead of selectors
+
+ for ( ; i < code.length; ++i) {
+ var codeFragment = code.substr(i);
+ var prevChar = code[i - 1];
+ var currChar = codeFragment[0];
+ token = this.findSingleLineComment(codeFragment);
+ if (!token) {
+ if ((token = this.findMultilineCommentStart(codeFragment)))
+ line._commentContinues = true;
+ else if (currChar === ";" && !inAtRuleBlock)
+ atRuleStarted = false;
+ else if (currChar === "}") {
+ if (inSelector && inAtRuleBlock && atRuleIsSelector) {
+ inSelector = false;
+ inAtRuleBlock = false;
+ atRuleStarted = false;
+ } else if (inSelector) {
+ inSelector = false;
+ } else if (inAtRuleBlock) {
+ inAtRuleBlock = false;
+ atRuleStarted = false;
}
- } else if (prevLine._singleQuoteStringContinues) {
- if (!(token = findMultilineSingleQuoteStringEnd(code))) {
- token = createSpan(code, "webkit-javascript-string");
- line._singleQuoteStringContinues = true;
+ } else if (currChar === "{") {
+ if (!atRuleStarted || inAtRuleBlock) {
+ inSelector = true;
+ } else if (!inAtRuleBlock && atRuleIsSelector) {
+ inAtRuleBlock = true;
+ inSelector = true;
+ } else if (!inAtRuleBlock) {
+ inAtRuleBlock = true;
+ inSelector = false;
}
- } else if (prevLine._doubleQuoteStringContinues) {
- if (!(token = findMultilineDoubleQuoteStringEnd(code))) {
- token = createSpan(code, "webkit-javascript-string");
- line._doubleQuoteStringContinues = true;
+ } else if (inSelector) {
+ if (!prevChar || /^\d/.test(prevChar)) {
+ token = this.findUnits(codeFragment);
+ } else if (!prevChar || /^\W/.test(prevChar)) {
+ token = this.findNumber(codeFragment) ||
+ this.findKeyword(codeFragment) ||
+ this.findURL(codeFragment) ||
+ this.findProperty(codeFragment) ||
+ this.findAtRule(codeFragment) ||
+ this.findGenericIdent(codeFragment) ||
+ this.findSingleLineString(codeFragment);
}
- } else if (prevLine._regexpContinues) {
- if (!(token = findMultilineRegExpEnd(code))) {
- token = createSpan(code, "webkit-javascript-regexp");
- line._regexpContinues = true;
+ } else if (!inSelector) {
+ if (atRuleStarted && !inAtRuleBlock)
+ token = this.findURL(codeFragment); // for @import
+ if (!token) {
+ token = this.findSelector(codeFragment) ||
+ this.findPseudoClass(codeFragment) ||
+ this.findAtRule(codeFragment);
}
}
- if (token) {
- i += previousMatchLength ? previousMatchLength : code.length;
- tmp = i;
- line.appendChild(token);
- }
}
- for ( ; i < code.length; ++i) {
- var codeFragment = code.substr(i);
- var prevChar = code[i - 1];
- token = findSingleLineComment(codeFragment);
- if (!token) {
- if ((token = findMultilineCommentStart(codeFragment)))
- line._commentContinues = true;
- else if (!prevChar || /^\W/.test(prevChar)) {
- token = findNumber(codeFragment, code[i - 1]) ||
- findKeyword(codeFragment, code[i - 1]) ||
- findSingleLineString(codeFragment) ||
- findSingleLineRegExp(codeFragment);
- if (!token) {
- if (token = findMultilineSingleQuoteStringStart(codeFragment))
- line._singleQuoteStringContinues = true;
- else if (token = findMultilineDoubleQuoteStringStart(codeFragment))
- line._doubleQuoteStringContinues = true;
- else if (token = findMultilineRegExpStart(codeFragment))
- line._regexpContinues = true;
- }
- }
- }
+ if (token) {
+ if (currChar === "@") {
+ atRuleStarted = true;
- if (token) {
- if (tmp !== i)
- line.appendChild(document.createTextNode(code.substring(tmp, i)));
- line.appendChild(token);
- i += previousMatchLength - 1;
- tmp = i + 1;
+ // The @font-face, @page, and @variables at-rules do not contain selectors like other at-rules
+ // instead it acts as a selector and contains properties and values.
+ var text = token.textContent;
+ atRuleIsSelector = /font-face/.test(text) || /page/.test(text) || /variables/.test(text);
}
+
+ if (tmp !== i)
+ line.appendChild(document.createTextNode(code.substring(tmp, i)));
+ line.appendChild(token);
+ i += this.previousMatchLength - 1;
+ tmp = i + 1;
}
+ }
- if (tmp < code.length)
- line.appendChild(document.createTextNode(code.substring(tmp, i)));
+ line._inSelector = inSelector;
+ line._inAtRuleBlock = inAtRuleBlock;
+ line._atRuleStarted = atRuleStarted;
+ line._atRuleIsSelector = atRuleIsSelector;
- if (messageBubble)
- line.appendChild(messageBubble);
- }
+ if (tmp < code.length)
+ line.appendChild(document.createTextNode(code.substring(tmp, i)));
+ }
+}
- var i = 0;
- var rows = table.rows;
- var rowsLength = rows.length;
- var previousCell = null;
- var previousMatchLength = 0;
- var sourceFrame = this;
+WebInspector.CSSSourceSyntaxHighligher.prototype.__proto__ = WebInspector.SourceSyntaxHighligher.prototype;
+
+WebInspector.JavaScriptSourceSyntaxHighlighter = function(table, sourceFrame) {
+ WebInspector.SourceSyntaxHighligher.call(this, table, sourceFrame);
+
+ this.findNumber = this.generateFinder(/^(-?(\d+\.?\d*([eE][+-]\d+)?|0[xX]\h+|Infinity)|NaN)(?:\W|$)/, 1, "webkit-javascript-number");
+ this.findKeyword = this.generateFinder(/^(null|true|false|break|case|catch|const|default|finally|for|instanceof|new|var|continue|function|return|void|delete|if|this|do|while|else|in|switch|throw|try|typeof|with|debugger|class|enum|export|extends|import|super|get|set)(?:\W|$)/, 1, "webkit-javascript-keyword");
+ this.findSingleLineString = this.generateFinder(/^"(?:[^"\\]|\\.)*"|^'([^'\\]|\\.)*'/, 0, "webkit-javascript-string"); // " this quote keeps Xcode happy
+ this.findMultilineCommentStart = this.generateFinder(/^\/\*.*$/, 0, "webkit-javascript-comment");
+ this.findMultilineCommentEnd = this.generateFinder(/^.*?\*\//, 0, "webkit-javascript-comment");
+ this.findMultilineSingleQuoteStringStart = this.generateFinder(/^'(?:[^'\\]|\\.)*\\$/, 0, "webkit-javascript-string");
+ this.findMultilineSingleQuoteStringEnd = this.generateFinder(/^(?:[^'\\]|\\.)*?'/, 0, "webkit-javascript-string");
+ this.findMultilineDoubleQuoteStringStart = this.generateFinder(/^"(?:[^"\\]|\\.)*\\$/, 0, "webkit-javascript-string");
+ this.findMultilineDoubleQuoteStringEnd = this.generateFinder(/^(?:[^"\\]|\\.)*?"/, 0, "webkit-javascript-string");
+ this.findMultilineRegExpEnd = this.generateFinder(/^(?:[^\/\\]|\\.)*?\/([gim]{0,3})/, 0, "webkit-javascript-regexp");
+ this.findSingleLineComment = this.generateFinder(/^\/\/.*|^\/\*.*?\*\//, 0, "webkit-javascript-comment");
+}
- // Split up the work into chunks so we don't block the
- // UI thread while processing.
+WebInspector.JavaScriptSourceSyntaxHighlighter.prototype = {
+ deleteContinueFlags: function(cell)
+ {
+ if (!cell)
+ return;
+ delete cell._commentContinues;
+ delete cell._singleQuoteStringContinues;
+ delete cell._doubleQuoteStringContinues;
+ delete cell._regexpContinues;
+ },
- function processChunk()
- {
- for (var end = Math.min(i + 10, rowsLength); i < end; ++i) {
- var row = rows[i];
- if (!row)
- continue;
- var cell = row.cells[1];
- if (!cell)
- continue;
- syntaxHighlightJavascriptLine(cell, previousCell);
- if (i < (end - 1))
- deleteContinueFlags(previousCell);
- previousCell = cell;
+ findMultilineRegExpStart: function(str)
+ {
+ var match = /^\/(?:[^\/\\]|\\.)*\\$/.exec(str);
+ if (!match || !/\\|\$|\.[\?\*\+]|[^\|]\|[^\|]/.test(match[0]))
+ return null;
+ this.previousMatchLength = match[0].length;
+ return this.createSpan(match[0], "webkit-javascript-regexp");
+ },
+
+ findSingleLineRegExp: function(str)
+ {
+ var match = /^(\/(?:[^\/\\]|\\.)*\/([gim]{0,3}))(.?)/.exec(str);
+ if (!match || !(match[2].length > 0 || /\\|\$|\.[\?\*\+]|[^\|]\|[^\|]/.test(match[1]) || /\.|;|,/.test(match[3])))
+ return null;
+ this.previousMatchLength = match[1].length;
+ return this.createSpan(match[1], "webkit-javascript-regexp");
+ },
+
+ syntaxHighlightLine: function(line, prevLine)
+ {
+ var messageBubble = line.lastChild;
+ if (messageBubble && messageBubble.nodeType === Node.ELEMENT_NODE && messageBubble.hasStyleClass("webkit-html-message-bubble"))
+ line.removeChild(messageBubble);
+ else
+ messageBubble = null;
+
+ var code = line.textContent;
+
+ while (line.firstChild)
+ line.removeChild(line.firstChild);
+
+ var token;
+ var tmp = 0;
+ var i = 0;
+ this.previousMatchLength = 0;
+
+ if (prevLine) {
+ if (prevLine._commentContinues) {
+ if (!(token = this.findMultilineCommentEnd(code))) {
+ token = this.createSpan(code, "webkit-javascript-comment");
+ line._commentContinues = true;
+ }
+ } else if (prevLine._singleQuoteStringContinues) {
+ if (!(token = this.findMultilineSingleQuoteStringEnd(code))) {
+ token = this.createSpan(code, "webkit-javascript-string");
+ line._singleQuoteStringContinues = true;
+ }
+ } else if (prevLine._doubleQuoteStringContinues) {
+ if (!(token = this.findMultilineDoubleQuoteStringEnd(code))) {
+ token = this.createSpan(code, "webkit-javascript-string");
+ line._doubleQuoteStringContinues = true;
+ }
+ } else if (prevLine._regexpContinues) {
+ if (!(token = this.findMultilineRegExpEnd(code))) {
+ token = this.createSpan(code, "webkit-javascript-regexp");
+ line._regexpContinues = true;
+ }
+ }
+ if (token) {
+ i += this.previousMatchLength ? this.previousMatchLength : code.length;
+ tmp = i;
+ line.appendChild(token);
}
+ }
- if (i >= rowsLength && processChunkInterval) {
- deleteContinueFlags(previousCell);
- clearInterval(processChunkInterval);
+ for ( ; i < code.length; ++i) {
+ var codeFragment = code.substr(i);
+ var prevChar = code[i - 1];
+ token = this.findSingleLineComment(codeFragment);
+ if (!token) {
+ if ((token = this.findMultilineCommentStart(codeFragment)))
+ line._commentContinues = true;
+ else if (!prevChar || /^\W/.test(prevChar)) {
+ token = this.findNumber(codeFragment) ||
+ this.findKeyword(codeFragment) ||
+ this.findSingleLineString(codeFragment) ||
+ this.findSingleLineRegExp(codeFragment);
+ if (!token) {
+ if (token = this.findMultilineSingleQuoteStringStart(codeFragment))
+ line._singleQuoteStringContinues = true;
+ else if (token = this.findMultilineDoubleQuoteStringStart(codeFragment))
+ line._doubleQuoteStringContinues = true;
+ else if (token = this.findMultilineRegExpStart(codeFragment))
+ line._regexpContinues = true;
+ }
+ }
+ }
- sourceFrame.dispatchEventToListeners("syntax highlighting complete");
+ if (token) {
+ if (tmp !== i)
+ line.appendChild(document.createTextNode(code.substring(tmp, i)));
+ line.appendChild(token);
+ i += this.previousMatchLength - 1;
+ tmp = i + 1;
}
}
- processChunk();
+ if (tmp < code.length)
+ line.appendChild(document.createTextNode(code.substring(tmp, i)));
- var processChunkInterval = setInterval(processChunk, 25);
+ if (messageBubble)
+ line.appendChild(messageBubble);
}
}
-WebInspector.SourceFrame.prototype.__proto__ = WebInspector.Object.prototype;
-
+WebInspector.JavaScriptSourceSyntaxHighlighter.prototype.__proto__ = WebInspector.SourceSyntaxHighligher.prototype;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js b/src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js
index 97a5bd5..c1b1bbf 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/SourceView.js
@@ -106,11 +106,16 @@ WebInspector.SourceView.prototype = {
this.sourceFrame.removeEventListener("content loaded", this._contentLoaded, this);
if (this.resource.type === WebInspector.Resource.Type.Script
- || this.resource.mimeType === 'application/json'
- || this.resource.mimeType === 'application/javascript'
+ || this.resource.mimeType === "application/json"
+ || this.resource.mimeType === "application/javascript"
|| /\.js(on)?$/.test(this.resource.lastPathComponent) ) {
this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
this.sourceFrame.syntaxHighlightJavascript();
+ } else if (this.resource.type === WebInspector.Resource.Type.Stylesheet
+ || this.resource.mimeType === "text/css"
+ || /\.css$/.test(this.resource.lastPathComponent) ) {
+ this.sourceFrame.addEventListener("syntax highlighting complete", this._syntaxHighlightingComplete, this);
+ this.sourceFrame.syntaxHighlightCSS();
} else
this._sourceFrameSetupFinished();
},
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/StoragePanel.js b/src/3rdparty/webkit/WebCore/inspector/front-end/StoragePanel.js
index 01c657d..66b4a92 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/StoragePanel.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/StoragePanel.js
@@ -63,9 +63,6 @@ WebInspector.StoragePanel = function(database)
this.sidebarTree.appendChild(this.cookieListTreeElement);
this.cookieListTreeElement.expand();
- this.cookieTreeElement = new WebInspector.CookieSidebarTreeElement();
- this.cookieListTreeElement.appendChild(this.cookieTreeElement);
-
this.storageViews = document.createElement("div");
this.storageViews.id = "storage-views";
this.element.appendChild(this.storageViews);
@@ -120,11 +117,14 @@ WebInspector.StoragePanel.prototype = {
this._domStorage = [];
- delete this._cookieView;
+ this._cookieDomains = {};
+ this._cookieViews = {};
this.databasesListTreeElement.removeChildren();
this.localStorageListTreeElement.removeChildren();
this.sessionStorageListTreeElement.removeChildren();
+ this.cookieListTreeElement.removeChildren();
+
this.storageViews.removeChildren();
this.storageViewStatusBarItemsContainer.removeChildren();
@@ -146,6 +146,17 @@ WebInspector.StoragePanel.prototype = {
database._databasesTreeElement = databaseTreeElement;
this.databasesListTreeElement.appendChild(databaseTreeElement);
},
+
+ addCookieDomain: function(domain)
+ {
+ // Eliminate duplicate domains from the list.
+ if (typeof this._cookieDomains[domain] !== "undefined")
+ return;
+
+ var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
+ this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
+ this._cookieDomains[domain] = true;
+ },
addDOMStorage: function(domStorage)
{
@@ -158,12 +169,12 @@ WebInspector.StoragePanel.prototype = {
this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
},
- selectDatabase: function(db)
+ selectDatabase: function(databaseId)
{
var database;
for (var i = 0, len = this._databases.length; i < len; ++i) {
database = this._databases[i];
- if (database.isDatabase(db)) {
+ if (database.id === databaseId) {
this.showDatabase(database);
database._databasesTreeElement.select();
return;
@@ -240,15 +251,15 @@ WebInspector.StoragePanel.prototype = {
this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
},
- showCookies: function()
+ showCookies: function(cookieDomain)
{
if (this.visibleView)
this.visibleView.hide();
- var view = this._cookieView;
+ var view = this._cookieViews[cookieDomain];
if (!view) {
- view = new WebInspector.CookieItemsView();
- this._cookieView = view;
+ view = new WebInspector.CookieItemsView(cookieDomain);
+ this._cookieViews[cookieDomain] = view;
}
view.show(this.storageViews);
@@ -297,20 +308,21 @@ WebInspector.StoragePanel.prototype = {
database.getTableNames(tableNamesCallback);
},
- dataGridForResult: function(result)
+ dataGridForResult: function(rows)
{
- if (!result.rows.length)
+ if (!rows.length)
return null;
var columns = {};
+ var numColumns = 0;
- var rows = result.rows;
- for (var columnIdentifier in rows.item(0)) {
+ for (var columnIdentifier in rows[0]) {
var column = {};
column.width = columnIdentifier.length;
column.title = columnIdentifier;
columns[columnIdentifier] = column;
+ ++numColumns;
}
var nodes = [];
@@ -318,12 +330,9 @@ WebInspector.StoragePanel.prototype = {
for (var i = 0; i < length; ++i) {
var data = {};
- var row = rows.item(i);
+ var row = rows[i];
for (var columnIdentifier in row) {
- // FIXME: (Bug 19439) We should specially format SQL NULL here
- // (which is represented by JavaScript null here, and turned
- // into the string "null" by the String() function).
- var text = String(row[columnIdentifier]);
+ var text = row[columnIdentifier];
data[columnIdentifier] = text;
if (text.length > columns[columnIdentifier].width)
columns[columnIdentifier].width = text.length;
@@ -339,7 +348,7 @@ WebInspector.StoragePanel.prototype = {
totalColumnWidths += columns[columnIdentifier].width;
// Calculate the percentage width for the columns.
- const minimumPrecent = 5;
+ const minimumPrecent = Math.min(5, Math.floor(100/numColumns));
var recoupPercent = 0;
for (var columnIdentifier in columns) {
var width = columns[columnIdentifier].width;
@@ -549,7 +558,7 @@ WebInspector.DOMStorageSidebarTreeElement.prototype = {
get mainTitle()
{
- return this.domStorage.domain;
+ return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files");
},
set mainTitle(x)
@@ -570,9 +579,10 @@ WebInspector.DOMStorageSidebarTreeElement.prototype = {
WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
-WebInspector.CookieSidebarTreeElement = function()
+WebInspector.CookieSidebarTreeElement = function(cookieDomain)
{
- WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", null, "", null, false);
+ WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
+ this._cookieDomain = cookieDomain;
this.refreshTitles();
}
@@ -580,12 +590,12 @@ WebInspector.CookieSidebarTreeElement = function()
WebInspector.CookieSidebarTreeElement.prototype = {
onselect: function()
{
- WebInspector.panels.storage.showCookies();
+ WebInspector.panels.storage.showCookies(this._cookieDomain);
},
-
+
get mainTitle()
{
- return WebInspector.UIString("Cookies");
+ return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files");
},
set mainTitle(x)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/TestController.js b/src/3rdparty/webkit/WebCore/inspector/front-end/TestController.js
new file mode 100644
index 0000000..8da59e7
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/TestController.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.TestController = function(callId)
+{
+ this._callId = callId;
+ this._waitUntilDone = false;
+}
+
+WebInspector.TestController.prototype = {
+ waitUntilDone: function()
+ {
+ this._waitUntilDone = true;
+ },
+
+ notifyDone: function(result)
+ {
+ var message = typeof result === "undefined" ? "<undefined>" : JSON.stringify(result);
+ InspectorController.didEvaluateForTestInFrontend(this._callId, message);
+ }
+}
+
+WebInspector.evaluateForTestInFrontend = function(callId, script)
+{
+ var controller = new WebInspector.TestController(callId);
+ try {
+ var result;
+ if (window[script] && typeof window[script] === "function")
+ result = window[script].call(this, controller);
+ else
+ result = window.eval(script);
+
+ if (!controller._waitUntilDone)
+ controller.notifyDone(result);
+ } catch (e) {
+ controller.notifyDone(e.toString());
+ }
+}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js b/src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js
index 5ff774f..f73ab0d 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/TextPrompt.js
@@ -252,7 +252,7 @@ WebInspector.TextPrompt.prototype = {
foundNextText = true;
}
- node = node.traverseNextNode(false, this.element);
+ node = node.traverseNextNode(this.element);
}
return true;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/TimelineAgent.js b/src/3rdparty/webkit/WebCore/inspector/front-end/TimelineAgent.js
index 6d18732..4363da8 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/TimelineAgent.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/TimelineAgent.js
@@ -45,10 +45,10 @@ WebInspector.addItemToTimeline = function(record) {
// Not implemented.
}
-WebInspector.timelineWasEnabled = function() {
+WebInspector.timelineProfilerWasStarted = function() {
// Not implemented.
}
-WebInspector.timelineWasDisabled = function() {
+WebInspector.timelineProfilerWasStopped = function() {
// Not implemented.
}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js b/src/3rdparty/webkit/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
index d6d1d61..96a20ab 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
@@ -75,6 +75,8 @@ WebInspector.WatchExpressionsSection = function()
this.editable = true;
this.expanded = true;
this.propertiesElement.addStyleClass("watch-expressions");
+
+ this._watchObjectGroupId = "watch-group";
}
WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
@@ -114,6 +116,7 @@ WebInspector.WatchExpressionsSection.prototype = {
this.updateProperties(properties, WebInspector.WatchExpressionTreeElement, WebInspector.WatchExpressionsSection.CompareProperties);
}
+ InspectorController.releaseWrapperObjectGroup(this._watchObjectGroupId)
var properties = [];
// Count the properties, so we known when to call this.updateProperties()
@@ -129,10 +132,10 @@ WebInspector.WatchExpressionsSection.prototype = {
// which is checked in the appendResult inner function.
for (var i = 0; i < this.watchExpressions.length; ++i) {
var expression = this.watchExpressions[i];
- if (!expression)
+ if (!expression)
continue;
- WebInspector.console.evalInInspectedWindow("(" + expression + ")", appendResult.bind(this, expression, i));
+ WebInspector.console.evalInInspectedWindow("(" + expression + ")", this._watchObjectGroupId, appendResult.bind(this, expression, i));
}
// note this is setting the expansion of the tree, not the section;
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc b/src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc
index 1aaeb3d..32f15ce 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/WebKit.qrc
@@ -57,6 +57,7 @@
<file>StoragePanel.js</file>
<file>StylesSidebarPane.js</file>
<file>SummaryBar.js</file>
+ <file>TestController.js</file>
<file>TextPrompt.js</file>
<file>TimelineAgent.js</file>
<file>TopDownProfileDataGridTree.js</file>
@@ -65,6 +66,7 @@
<file>View.js</file>
<file>WatchExpressionsSidebarPane.js</file>
<file>inspector.css</file>
+ <file>inspectorSyntaxHighlight.css</file>
<file>Images/back.png</file>
<file>Images/checker.png</file>
<file>Images/clearConsoleButtonGlyph.png</file>
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css
index 358c13c..fc08bc2 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.css
@@ -211,7 +211,7 @@ body.attached #search-results-matches {
background-image: url(Images/profilesIcon.png);
}
-#close-button {
+#close-button-left, #close-button-right {
width: 14px;
height: 14px;
background-image: url(Images/closeButtons.png);
@@ -221,19 +221,27 @@ body.attached #search-results-matches {
margin: 5px 0;
}
-#close-button:hover {
+#close-button-left:hover, #close-button-right:hover {
background-position: 14px 0;
}
-#close-button:active {
+#close-button-left:active, #close-button-right:active {
background-position: 28px 0;
}
-body.detached .toolbar-item.close {
+body.detached .toolbar-item.close-left, body.detached .toolbar-item.close-right {
display: none;
}
-body.attached.platform-qt .toolbar-item.close {
+body.attached.platform-qt .toolbar-item.close-left, body.attached.platform-qt .toolbar-item.close-right {
+ display: none;
+}
+
+body.platform-mac-tiger .toolbar-item.close-right, body.platform-mac-leopard .toolbar-item.close-right {
+ display: none;
+}
+
+body:not(.platform-mac-tiger):not(.platform-mac-leopard) .toolbar-item.close-left {
display: none;
}
@@ -818,11 +826,6 @@ body.drawer-visible #drawer {
vertical-align: top;
}
-.invisible {
- color: inherit;
- text-decoration: none;
-}
-
.webkit-line-gutter-backdrop {
/* Keep this in sync with view-source.css (.webkit-line-gutter-backdrop) */
width: 31px;
@@ -1637,6 +1640,10 @@ li.editing .swatch, li.editing .enabled-button, li.editing-sub-part .delete-but
background-position: -46px 0px;
}
+.pane > .title > select > option, .pane > .title > select > hr {
+ color: black;
+}
+
.pane > .body {
position: relative;
display: none;
@@ -2512,6 +2519,7 @@ button.enable-toggle-status-bar-item.toggled-on .glyph {
-webkit-background-size: 1px 6px;
-webkit-background-origin: padding;
-webkit-background-clip: padding;
+ z-index: 400;
}
.summary-graph-legend {
@@ -2558,6 +2566,16 @@ button.enable-toggle-status-bar-item.toggled-on .glyph {
z-index: -100;
}
+#resources-event-dividers {
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 100%;
+ top: 0;
+ z-index: 300;
+ pointer-events: none;
+}
+
#resources-dividers-label-bar {
position: absolute;
top: 93px;
@@ -2578,6 +2596,32 @@ button.enable-toggle-status-bar-item.toggled-on .glyph {
background-color: rgba(0, 0, 0, 0.1);
}
+.resources-event-divider-padding {
+ position: absolute;
+ width: 8px;
+ top: 0;
+ bottom: 0;
+ pointer-events: auto;
+}
+
+.resources-onload-divider {
+ position: absolute;
+ width: 2px;
+ top: 0;
+ bottom: 0;
+ z-index: 300;
+ background-color: rgba(255, 0, 0, 0.5);
+}
+
+.resources-ondomcontent-divider {
+ position: absolute;
+ width: 2px;
+ top: 0;
+ bottom: 0;
+ z-index: 300;
+ background-color: rgba(0, 0, 255, 0.5);
+}
+
.resources-divider.last {
background-color: transparent;
}
@@ -3404,3 +3448,7 @@ ol.breakpoint-list {
.breakpoint-list a:hover {
color: rgb(15%, 15%, 15%);
}
+
+.webkit-html-js-node, .webkit-html-css-node {
+ white-space: pre;
+}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html
index f54e302..4fa69e0 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.html
@@ -30,6 +30,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="inspector.css">
+ <link rel="stylesheet" type="text/css" href="inspectorSyntaxHighlight.css">
<script type="text/javascript" src="utilities.js"></script>
<script type="text/javascript" src="treeoutline.js"></script>
<script type="text/javascript" src="inspector.js"></script>
@@ -93,13 +94,15 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<script type="text/javascript" src="InjectedScript.js"></script>
<script type="text/javascript" src="InjectedScriptAccess.js"></script>
<script type="text/javascript" src="TimelineAgent.js"></script>
+ <script type="text/javascript" src="TestController.js"></script>
</head>
<body class="detached">
<div id="toolbar">
- <div class="toolbar-item close"><button id="close-button"></button></div>
+ <div class="toolbar-item close-left"><button id="close-button-left"></button></div>
<div class="toolbar-item flexable-space"></div>
<div class="toolbar-item hidden" id="search-results-matches"></div>
<div class="toolbar-item"><input id="search" type="search" incremental results="0"><div id="search-toolbar-label" class="toolbar-label"></div></div>
+ <div class="toolbar-item close-right"><button id="close-button-right"></button></div>
</div>
<div id="main">
<div id="main-panels" tabindex="0" spellcheck="false"></div>
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js
index de4f4fb..17b02a1 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/inspector.js
@@ -29,7 +29,6 @@
*/
var Preferences = {
- ignoreWhitespace: true,
showUserAgentStyles: true,
maxInlineTextChildLength: 80,
minConsoleHeight: 75,
@@ -43,7 +42,8 @@ var Preferences = {
samplingCPUProfiler: false,
showColorNicknames: true,
colorFormat: "hex",
- eventListenersFilter: "all"
+ eventListenersFilter: "all",
+ resourcesLargeRows: true
}
var WebInspector = {
@@ -139,12 +139,29 @@ var WebInspector = {
this.panels.resources = new WebInspector.ResourcesPanel();
if (hiddenPanels.indexOf("scripts") === -1)
this.panels.scripts = new WebInspector.ScriptsPanel();
- if (hiddenPanels.indexOf("profiles") === -1)
+ if (hiddenPanels.indexOf("profiles") === -1) {
this.panels.profiles = new WebInspector.ProfilesPanel();
+ this.panels.profiles.registerProfileType(new WebInspector.CPUProfileType());
+ }
if (hiddenPanels.indexOf("storage") === -1 && hiddenPanels.indexOf("databases") === -1)
this.panels.storage = new WebInspector.StoragePanel();
},
+ _loadPreferences: function()
+ {
+ var colorFormat = InspectorController.setting("color-format");
+ if (colorFormat)
+ Preferences.colorFormat = colorFormat;
+
+ var eventListenersFilter = InspectorController.setting("event-listeners-filter");
+ if (eventListenersFilter)
+ Preferences.eventListenersFilter = eventListenersFilter;
+
+ var resourcesLargeRows = InspectorController.setting("resources-large-rows");
+ if (typeof resourcesLargeRows !== "undefined")
+ Preferences.resourcesLargeRows = resourcesLargeRows;
+ },
+
get attached()
{
return this._attached;
@@ -351,13 +368,7 @@ WebInspector.loaded = function()
var platform = InspectorController.platform();
document.body.addStyleClass("platform-" + platform);
- var colorFormat = InspectorController.setting("color-format");
- if (colorFormat)
- Preferences.colorFormat = colorFormat;
-
- var eventListenersFilter = InspectorController.setting("event-listeners-filter");
- if (eventListenersFilter)
- Preferences.eventListenersFilter = eventListenersFilter;
+ this._loadPreferences();
this.drawer = new WebInspector.Drawer();
this.console = new WebInspector.ConsoleView(this.drawer);
@@ -449,8 +460,9 @@ WebInspector.loaded = function()
searchField.addEventListener("keyup", this.searchKeyUp.bind(this), false);
searchField.addEventListener("search", this.performSearch.bind(this), false); // when the search is emptied
- document.getElementById("toolbar").addEventListener("mousedown", this.toolbarDragStart, true);
- document.getElementById("close-button").addEventListener("click", this.close, true);
+ toolbarElement.addEventListener("mousedown", this.toolbarDragStart, true);
+ document.getElementById("close-button-left").addEventListener("click", this.close, true);
+ document.getElementById("close-button-right").addEventListener("click", this.close, true);
InspectorController.loaded();
}
@@ -476,7 +488,14 @@ window.addEventListener("load", windowLoaded, false);
WebInspector.dispatch = function() {
var methodName = arguments[0];
var parameters = Array.prototype.slice.call(arguments, 1);
- WebInspector[methodName].apply(this, parameters);
+
+ // We'd like to enforce asynchronous interaction between the inspector controller and the frontend.
+ // This is important to LayoutTests.
+ function delayDispatch()
+ {
+ WebInspector[methodName].apply(WebInspector, parameters);
+ }
+ setTimeout(delayDispatch, 0);
}
WebInspector.windowUnload = function(event)
@@ -537,10 +556,9 @@ WebInspector.documentClick = function(event)
WebInspector.showResourceForURL(anchor.href, anchor.lineNumber, anchor.preferredPanel);
} else {
- var profileStringRegEx = new RegExp("webkit-profile://.+/([0-9]+)");
- var profileString = profileStringRegEx.exec(anchor.href);
+ var profileString = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
if (profileString)
- WebInspector.showProfileById(profileString[1])
+ WebInspector.showProfileForURL(anchor.href);
}
}
@@ -989,6 +1007,21 @@ WebInspector.updateResource = function(identifier, payload)
resource.responseReceivedTime = payload.responseReceivedTime;
if (payload.endTime)
resource.endTime = payload.endTime;
+
+ if (payload.loadEventTime) {
+ // This loadEventTime is for the main resource, and we want to show it
+ // for all resources on this page. This means we want to set it as a member
+ // of the resources panel instead of the individual resource.
+ if (this.panels.resources)
+ this.panels.resources.mainResourceLoadTime = payload.loadEventTime;
+ }
+
+ if (payload.domContentEventTime) {
+ // This domContentEventTime is for the main resource, so it should go in
+ // the resources panel for the same reasons as above.
+ if (this.panels.resources)
+ this.panels.resources.mainResourceDOMContentTime = payload.domContentEventTime;
+ }
}
}
@@ -1009,13 +1042,19 @@ WebInspector.removeResource = function(identifier)
WebInspector.addDatabase = function(payload)
{
var database = new WebInspector.Database(
- payload.database,
+ payload.id,
payload.domain,
payload.name,
payload.version);
this.panels.storage.addDatabase(database);
}
+WebInspector.addCookieDomain = function(domain)
+{
+ if (this.panels.storage)
+ this.panels.storage.addCookieDomain(domain);
+}
+
WebInspector.addDOMStorage = function(payload)
{
var domStorage = new WebInspector.DOMStorage(
@@ -1224,14 +1263,15 @@ WebInspector.log = function(message)
logMessage(message);
}
-WebInspector.addProfile = function(profile)
+WebInspector.addProfileHeader = function(profile)
{
- this.panels.profiles.addProfile(profile);
+ this.panels.profiles.addProfileHeader(WebInspector.CPUProfileType.TypeId, new WebInspector.CPUProfile(profile));
}
WebInspector.setRecordingProfile = function(isProfiling)
{
- this.panels.profiles.setRecordingProfile(isProfiling);
+ this.panels.profiles.getProfileType(WebInspector.CPUProfileType.TypeId).setRecordingProfile(isProfiling);
+ this.panels.profiles.updateProfileTypeButtons();
}
WebInspector.drawLoadingPieChart = function(canvas, percent) {
@@ -1337,13 +1377,9 @@ WebInspector.linkifyStringAsFragment = function(string)
var nonLink = string.substring(0, linkIndex);
container.appendChild(document.createTextNode(nonLink));
- var profileStringRegEx = new RegExp("webkit-profile://(.+)/[0-9]+");
- var profileStringMatches = profileStringRegEx.exec(title);
- var profileTitle;
+ var profileStringMatches = WebInspector.ProfileType.URLRegExp.exec(title);
if (profileStringMatches)
- profileTitle = profileStringMatches[1];
- if (profileTitle)
- title = WebInspector.panels.profiles.displayTitleForProfileLink(profileTitle);
+ title = WebInspector.panels.profiles.displayTitleForProfileLink(profileStringMatches[2], profileStringMatches[1]);
var realURL = (linkString.indexOf("www.") === 0 ? "http://" + linkString : linkString);
container.appendChild(WebInspector.linkifyURLAsNode(realURL, title, null, (realURL in WebInspector.resourceURLMap)));
@@ -1356,9 +1392,9 @@ WebInspector.linkifyStringAsFragment = function(string)
return container;
}
-WebInspector.showProfileById = function(uid) {
+WebInspector.showProfileForURL = function(url) {
WebInspector.showProfilesPanel();
- WebInspector.panels.profiles.showProfileById(uid);
+ WebInspector.panels.profiles.showProfileForURL(url);
}
WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal)
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/inspectorSyntaxHighlight.css b/src/3rdparty/webkit/WebCore/inspector/front-end/inspectorSyntaxHighlight.css
new file mode 100644
index 0000000..2cbb3c5
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/inspectorSyntaxHighlight.css
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.webkit-css-comment {
+ color: rgb(0, 116, 0);
+}
+
+.webkit-css-string, .webkit-css-keyword, .webkit-css-unit {
+ color: rgb(7, 144, 154);
+}
+
+.webkit-css-number {
+ color: rgb(50, 0, 255);
+}
+
+.webkit-css-property, .webkit-css-at-rule {
+ color: rgb(200, 0, 0);
+}
+
+.webkit-css-url {
+ color: rgb(0, 0, 0);
+}
+
+.webkit-css-selector {
+ color: rgb(0, 0, 0);
+}
+
+.webkit-css-pseudo-class {
+ color: rgb(128, 128, 128);
+}
+
+.webkit-javascript-comment {
+ color: rgb(0, 116, 0);
+}
+
+.webkit-javascript-keyword {
+ color: rgb(170, 13, 145);
+}
+
+.webkit-javascript-number {
+ color: rgb(28, 0, 207);
+}
+
+.webkit-javascript-string, .webkit-javascript-regexp {
+ color: rgb(196, 26, 22);
+}
diff --git a/src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js b/src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js
index 5f41b56..6df23de 100644
--- a/src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js
+++ b/src/3rdparty/webkit/WebCore/inspector/front-end/utilities.js
@@ -91,7 +91,7 @@ Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, di
if (startNode)
break;
- node = node.traversePreviousNode(false, stayWithinNode);
+ node = node.traversePreviousNode(stayWithinNode);
}
if (!startNode) {
@@ -126,7 +126,7 @@ Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, di
if (endNode)
break;
- node = node.traverseNextNode(false, stayWithinNode);
+ node = node.traverseNextNode(stayWithinNode);
}
if (!endNode) {
@@ -269,9 +269,6 @@ Element.prototype.offsetRelativeToWindow = function(targetWindow)
return elementOffset;
}
-Element.prototype.firstChildSkippingWhitespace = firstChildSkippingWhitespace;
-Element.prototype.lastChildSkippingWhitespace = lastChildSkippingWhitespace;
-
Node.prototype.isWhitespace = isNodeWhitespace;
Node.prototype.displayName = nodeDisplayName;
Node.prototype.isAncestor = function(node)
@@ -279,8 +276,6 @@ Node.prototype.isAncestor = function(node)
return isAncestorNode(this, node);
};
Node.prototype.isDescendant = isDescendantNode;
-Node.prototype.nextSiblingSkippingWhitespace = nextSiblingSkippingWhitespace;
-Node.prototype.previousSiblingSkippingWhitespace = previousSiblingSkippingWhitespace;
Node.prototype.traverseNextNode = traverseNextNode;
Node.prototype.traversePreviousNode = traversePreviousNode;
Node.prototype.onlyTextChild = onlyTextChild;
@@ -455,172 +450,58 @@ function isDescendantNode(descendant)
return isAncestorNode(descendant, this);
}
-function nextSiblingSkippingWhitespace()
-{
- if (!this)
- return;
- var node = this.nextSibling;
- while (node && node.nodeType === Node.TEXT_NODE && isNodeWhitespace.call(node))
- node = node.nextSibling;
- return node;
-}
-
-function previousSiblingSkippingWhitespace()
+function traverseNextNode(stayWithin)
{
if (!this)
return;
- var node = this.previousSibling;
- while (node && node.nodeType === Node.TEXT_NODE && isNodeWhitespace.call(node))
- node = node.previousSibling;
- return node;
-}
-function firstChildSkippingWhitespace()
-{
- if (!this)
- return;
var node = this.firstChild;
- while (node && node.nodeType === Node.TEXT_NODE && isNodeWhitespace.call(node))
- node = nextSiblingSkippingWhitespace.call(node);
- return node;
-}
-
-function lastChildSkippingWhitespace()
-{
- if (!this)
- return;
- var node = this.lastChild;
- while (node && node.nodeType === Node.TEXT_NODE && isNodeWhitespace.call(node))
- node = previousSiblingSkippingWhitespace.call(node);
- return node;
-}
-
-function traverseNextNode(skipWhitespace, stayWithin)
-{
- if (!this)
- return;
-
- var node = skipWhitespace ? firstChildSkippingWhitespace.call(this) : this.firstChild;
if (node)
return node;
if (stayWithin && this === stayWithin)
return null;
- node = skipWhitespace ? nextSiblingSkippingWhitespace.call(this) : this.nextSibling;
+ node = this.nextSibling;
if (node)
return node;
node = this;
- while (node && !(skipWhitespace ? nextSiblingSkippingWhitespace.call(node) : node.nextSibling) && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
+ while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
node = node.parentNode;
if (!node)
return null;
- return skipWhitespace ? nextSiblingSkippingWhitespace.call(node) : node.nextSibling;
+ return node.nextSibling;
}
-function traversePreviousNode(skipWhitespace, stayWithin)
+function traversePreviousNode(stayWithin)
{
if (!this)
return;
if (stayWithin && this === stayWithin)
return null;
- var node = skipWhitespace ? previousSiblingSkippingWhitespace.call(this) : this.previousSibling;
- while (node && (skipWhitespace ? lastChildSkippingWhitespace.call(node) : node.lastChild) )
- node = skipWhitespace ? lastChildSkippingWhitespace.call(node) : node.lastChild;
+ var node = this.previousSibling;
+ while (node && node.lastChild)
+ node = node.lastChild;
if (node)
return node;
return this.parentNode;
}
-function onlyTextChild(ignoreWhitespace)
+function onlyTextChild()
{
if (!this)
return null;
- var firstChild = ignoreWhitespace ? firstChildSkippingWhitespace.call(this) : this.firstChild;
+ var firstChild = this.firstChild;
if (!firstChild || firstChild.nodeType !== Node.TEXT_NODE)
return null;
- var sibling = ignoreWhitespace ? nextSiblingSkippingWhitespace.call(firstChild) : firstChild.nextSibling;
+ var sibling = firstChild.nextSibling;
return sibling ? null : firstChild;
}
-function nodeTitleInfo(hasChildren, linkify)
-{
- var info = {title: "", hasChildren: hasChildren};
-
- switch (this.nodeType) {
- case Node.DOCUMENT_NODE:
- info.title = "Document";
- break;
-
- case Node.ELEMENT_NODE:
- info.title = "<span class=\"webkit-html-tag\">&lt;" + this.nodeName.toLowerCase().escapeHTML();
-
- if (this.hasAttributes()) {
- for (var i = 0; i < this.attributes.length; ++i) {
- var attr = this.attributes[i];
- info.title += " <span class=\"webkit-html-attribute\"><span class=\"webkit-html-attribute-name\">" + attr.name.escapeHTML() + "</span>=&#8203;\"";
-
- var value = attr.value;
- if (linkify && (attr.name === "src" || attr.name === "href")) {
- var value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B");
- info.title += linkify(attr.value, value, "webkit-html-attribute-value", this.nodeName.toLowerCase() == "a");
- } else {
- var value = value.escapeHTML();
- value = value.replace(/([\/;:\)\]\}])/g, "$1&#8203;");
- info.title += "<span class=\"webkit-html-attribute-value\">" + value + "</span>";
- }
- info.title += "\"</span>";
- }
- }
- info.title += "&gt;</span>&#8203;";
-
- // If this element only has a single child that is a text node,
- // just show that text and the closing tag inline rather than
- // create a subtree for them
-
- var textChild = onlyTextChild.call(this, Preferences.ignoreWhitespace);
- var showInlineText = textChild && textChild.textContent.length < Preferences.maxInlineTextChildLength;
-
- if (showInlineText) {
- info.title += "<span class=\"webkit-html-text-node\">" + textChild.nodeValue.escapeHTML() + "</span>&#8203;<span class=\"webkit-html-tag\">&lt;/" + this.nodeName.toLowerCase().escapeHTML() + "&gt;</span>";
- info.hasChildren = false;
- }
- break;
-
- case Node.TEXT_NODE:
- if (isNodeWhitespace.call(this))
- info.title = "(whitespace)";
- else
- info.title = "\"<span class=\"webkit-html-text-node\">" + this.nodeValue.escapeHTML() + "</span>\"";
- break
-
- case Node.COMMENT_NODE:
- info.title = "<span class=\"webkit-html-comment\">&lt;!--" + this.nodeValue.escapeHTML() + "--&gt;</span>";
- break;
-
- case Node.DOCUMENT_TYPE_NODE:
- info.title = "<span class=\"webkit-html-doctype\">&lt;!DOCTYPE " + this.nodeName;
- if (this.publicId) {
- info.title += " PUBLIC \"" + this.publicId + "\"";
- if (this.systemId)
- info.title += " \"" + this.systemId + "\"";
- } else if (this.systemId)
- info.title += " SYSTEM \"" + this.systemId + "\"";
- if (this.internalSubset)
- info.title += " [" + this.internalSubset + "]";
- info.title += "&gt;</span>";
- break;
- default:
- info.title = this.nodeName.toLowerCase().collapseWhitespace().escapeHTML();
- }
-
- return info;
-}
-
function appropriateSelectorForNode(node, justSelector)
{
if (!node)
diff --git a/src/3rdparty/webkit/WebCore/loader/Cache.cpp b/src/3rdparty/webkit/WebCore/loader/Cache.cpp
index 14edae9..391790f 100644
--- a/src/3rdparty/webkit/WebCore/loader/Cache.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/Cache.cpp
@@ -34,6 +34,7 @@
#include "FrameView.h"
#include "Image.h"
#include "ResourceHandle.h"
+#include "SecurityOrigin.h"
#include <stdio.h>
#include <wtf/CurrentTime.h>
@@ -104,7 +105,7 @@ CachedResource* Cache::requestResource(DocLoader* docLoader, CachedResource::Typ
if (resource && requestIsPreload && !resource->isPreloaded())
return 0;
- if (FrameLoader::restrictAccessToLocal() && !FrameLoader::canLoad(url, String(), docLoader->doc())) {
+ if (SecurityOrigin::restrictAccessToLocal() && !SecurityOrigin::canLoad(url, String(), docLoader->doc())) {
Document* doc = docLoader->doc();
if (doc && !requestIsPreload)
FrameLoader::reportLocalLoadFailed(doc->frame(), url.string());
diff --git a/src/3rdparty/webkit/WebCore/loader/CachedResourceClient.h b/src/3rdparty/webkit/WebCore/loader/CachedResourceClient.h
index 2e0b15b..dd9bb94 100644
--- a/src/3rdparty/webkit/WebCore/loader/CachedResourceClient.h
+++ b/src/3rdparty/webkit/WebCore/loader/CachedResourceClient.h
@@ -25,6 +25,8 @@
#ifndef CachedResourceClient_h
#define CachedResourceClient_h
+#include <wtf/FastAllocBase.h>
+
#if ENABLE(XBL)
namespace XBL {
class XBLDocument;
@@ -48,7 +50,7 @@ namespace WebCore {
* inherit from this class and overload one of the 3 functions
*
*/
- class CachedResourceClient
+ class CachedResourceClient : public FastAllocBase
{
public:
virtual ~CachedResourceClient() { }
diff --git a/src/3rdparty/webkit/WebCore/loader/CachedResourceHandle.h b/src/3rdparty/webkit/WebCore/loader/CachedResourceHandle.h
index feb59b9..0956e0c 100644
--- a/src/3rdparty/webkit/WebCore/loader/CachedResourceHandle.h
+++ b/src/3rdparty/webkit/WebCore/loader/CachedResourceHandle.h
@@ -71,9 +71,10 @@ namespace WebCore {
bool operator==(const CachedResourceHandleBase& o) const { return get() == o.get(); }
bool operator!=(const CachedResourceHandleBase& o) const { return get() != o.get(); }
};
-
- // Don't inline for winscw compiler to prevent the compiler agressively resolving
- // the base class of R* when CachedResourceHandler<T>(R*) is inlined.
+
+ // Don't inline for winscw compiler to prevent the compiler agressively resolving
+ // the base class of R* when CachedResourceHandler<T>(R*) is inlined. The bug is
+ // reported at: https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812.
template <class R>
#if !COMPILER(WINSCW)
inline
diff --git a/src/3rdparty/webkit/WebCore/loader/EmptyClients.h b/src/3rdparty/webkit/WebCore/loader/EmptyClients.h
index 14d36f1..91c7030 100644
--- a/src/3rdparty/webkit/WebCore/loader/EmptyClients.h
+++ b/src/3rdparty/webkit/WebCore/loader/EmptyClients.h
@@ -488,6 +488,7 @@ class EmptyPluginHalterClient : public PluginHalterClient
{
public:
virtual bool shouldHaltPlugin(Node*) const { return false; }
+ virtual bool enabled() const { return false; }
};
}
diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp b/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp
index 93a1f10..df46397 100644
--- a/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp
@@ -55,6 +55,7 @@
#include "FrameLoaderClient.h"
#include "FrameTree.h"
#include "FrameView.h"
+#include "HTMLAnchorElement.h"
#include "HTMLAppletElement.h"
#include "HTMLFormElement.h"
#include "HTMLFrameElement.h"
@@ -123,96 +124,12 @@ using namespace SVGNames;
#endif
using namespace HTMLNames;
-struct ScheduledRedirection {
- enum Type { redirection, locationChange, historyNavigation, formSubmission };
-
- const Type type;
- const double delay;
- const String url;
- const String referrer;
- const FrameLoadRequest frameRequest;
- const RefPtr<Event> event;
- const RefPtr<FormState> formState;
- const int historySteps;
- const bool lockHistory;
- const bool lockBackForwardList;
- const bool wasUserGesture;
- const bool wasRefresh;
- const bool wasDuringLoad;
- bool toldClient;
-
- ScheduledRedirection(double delay, const String& url, bool lockHistory, bool lockBackForwardList, bool wasUserGesture, bool refresh)
- : type(redirection)
- , delay(delay)
- , url(url)
- , historySteps(0)
- , lockHistory(lockHistory)
- , lockBackForwardList(lockBackForwardList)
- , wasUserGesture(wasUserGesture)
- , wasRefresh(refresh)
- , wasDuringLoad(false)
- , toldClient(false)
- {
- ASSERT(!url.isEmpty());
- }
-
- ScheduledRedirection(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture, bool refresh, bool duringLoad)
- : type(locationChange)
- , delay(0)
- , url(url)
- , referrer(referrer)
- , historySteps(0)
- , lockHistory(lockHistory)
- , lockBackForwardList(lockBackForwardList)
- , wasUserGesture(wasUserGesture)
- , wasRefresh(refresh)
- , wasDuringLoad(duringLoad)
- , toldClient(false)
- {
- ASSERT(!url.isEmpty());
- }
-
- explicit ScheduledRedirection(int historyNavigationSteps)
- : type(historyNavigation)
- , delay(0)
- , historySteps(historyNavigationSteps)
- , lockHistory(false)
- , lockBackForwardList(false)
- , wasUserGesture(false)
- , wasRefresh(false)
- , wasDuringLoad(false)
- , toldClient(false)
- {
- }
-
- ScheduledRedirection(const FrameLoadRequest& frameRequest,
- bool lockHistory, bool lockBackForwardList, PassRefPtr<Event> event, PassRefPtr<FormState> formState,
- bool duringLoad)
- : type(formSubmission)
- , delay(0)
- , frameRequest(frameRequest)
- , event(event)
- , formState(formState)
- , historySteps(0)
- , lockHistory(lockHistory)
- , lockBackForwardList(lockBackForwardList)
- , wasUserGesture(false)
- , wasRefresh(false)
- , wasDuringLoad(duringLoad)
- , toldClient(false)
- {
- ASSERT(!frameRequest.isEmpty());
- ASSERT(this->formState);
- }
-};
-
#if ENABLE(XHTMLMP)
static const char defaultAcceptHeader[] = "application/xml,application/vnd.wap.xhtml+xml,application/xhtml+xml;profile='http://www.wapforum.org/xhtml',text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
#else
static const char defaultAcceptHeader[] = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
#endif
static double storedTimeOfLastCompletedLoad;
-static FrameLoader::LocalLoadPolicy localLoadPolicy = FrameLoader::AllowLocalLoadsForLocalOnly;
bool isBackForwardLoadType(FrameLoadType type)
{
@@ -250,39 +167,36 @@ static inline bool canReferToParentFrameEncoding(const Frame* frame, const Frame
FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
: m_frame(frame)
, m_client(client)
+ , m_policyChecker(frame)
+ , m_history(frame)
+ , m_notifer(frame)
, m_state(FrameStateCommittedPage)
, m_loadType(FrameLoadTypeStandard)
- , m_policyLoadType(FrameLoadTypeStandard)
, m_delegateIsHandlingProvisionalLoadError(false)
- , m_delegateIsDecidingNavigationPolicy(false)
- , m_delegateIsHandlingUnimplementablePolicy(false)
, m_firstLayoutDone(false)
, m_quickRedirectComing(false)
, m_sentRedirectNotification(false)
, m_inStopAllLoaders(false)
, m_isExecutingJavaScriptFormAction(false)
- , m_isRunningScript(false)
, m_didCallImplicitClose(false)
, m_wasUnloadEventEmitted(false)
, m_unloadEventBeingDispatched(false)
, m_isComplete(false)
, m_isLoadingMainResource(false)
- , m_cancellingWithLoadInProgress(false)
, m_needsClear(false)
, m_receivedData(false)
, m_encodingWasChosenByUser(false)
, m_containsPlugIns(false)
- , m_redirectionTimer(this, &FrameLoader::redirectionTimerFired)
, m_checkTimer(this, &FrameLoader::checkTimerFired)
, m_shouldCallCheckCompleted(false)
, m_shouldCallCheckLoadComplete(false)
, m_opener(0)
- , m_openedByDOM(false)
, m_creatingInitialEmptyDocument(false)
, m_isDisplayingInitialEmptyDocument(false)
, m_committedFirstRealDocumentLoad(false)
, m_didPerformFirstNavigation(false)
, m_loadingFromCachedPage(false)
+ , m_suppressOpenerInNewFrame(false)
#ifndef NDEBUG
, m_didDispatchDidCommitLoad(false)
#endif
@@ -327,7 +241,7 @@ void FrameLoader::setDefersLoading(bool defers)
m_policyDocumentLoader->setDefersLoading(defers);
if (!defers) {
- startRedirectionTimer();
+ m_frame->redirectScheduler()->startTimer();
startCheckCompleteTimer();
}
}
@@ -340,7 +254,7 @@ Frame* FrameLoader::createWindow(FrameLoader* frameLoaderForFrameLookup, const F
Frame* frame = frameLoaderForFrameLookup->frame()->tree()->find(request.frameName());
if (frame && shouldAllowNavigation(frame)) {
if (!request.resourceRequest().url().isEmpty())
- frame->loader()->loadFrameRequest(request, false, false, 0, 0);
+ frame->loader()->loadFrameRequest(request, false, false, 0, 0, SendReferrer);
if (Page* page = frame->page())
page->chrome()->focus();
created = false;
@@ -404,15 +318,17 @@ void FrameLoader::changeLocation(const KURL& url, const String& referrer, bool l
ResourceRequest request(url, referrer, refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy);
- if (executeIfJavaScriptURL(request.url(), userGesture))
+ if (m_frame->script()->executeIfJavaScriptURL(request.url(), userGesture))
return;
- urlSelected(request, "_self", 0, lockHistory, lockBackForwardList, userGesture);
+ urlSelected(request, "_self", 0, lockHistory, lockBackForwardList, userGesture, SendReferrer);
}
-void FrameLoader::urlSelected(const ResourceRequest& request, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, bool userGesture)
+void FrameLoader::urlSelected(const ResourceRequest& request, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, bool userGesture, ReferrerPolicy referrerPolicy)
{
- if (executeIfJavaScriptURL(request.url(), userGesture, false))
+ ASSERT(!m_suppressOpenerInNewFrame);
+
+ if (m_frame->script()->executeIfJavaScriptURL(request.url(), userGesture, false))
return;
String target = passedTarget;
@@ -421,11 +337,16 @@ void FrameLoader::urlSelected(const ResourceRequest& request, const String& pass
FrameLoadRequest frameRequest(request, target);
- if (frameRequest.resourceRequest().httpReferrer().isEmpty())
+ if (referrerPolicy == NoReferrer) {
+ m_suppressOpenerInNewFrame = true;
+ setOpener(0);
+ } else if (frameRequest.resourceRequest().httpReferrer().isEmpty())
frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer);
addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin());
- loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0);
+ loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0, referrerPolicy);
+
+ m_suppressOpenerInNewFrame = false;
}
bool FrameLoader::requestFrame(HTMLFrameOwnerElement* ownerElement, const String& urlString, const AtomicString& frameName)
@@ -441,7 +362,7 @@ bool FrameLoader::requestFrame(HTMLFrameOwnerElement* ownerElement, const String
Frame* frame = ownerElement->contentFrame();
if (frame)
- frame->loader()->scheduleLocationChange(url.string(), m_outgoingReferrer, true, true, isProcessingUserGesture());
+ frame->redirectScheduler()->scheduleLocationChange(url.string(), m_outgoingReferrer, true, true, isProcessingUserGesture());
else
frame = loadSubframe(ownerElement, url, frameName, m_outgoingReferrer);
@@ -449,7 +370,7 @@ bool FrameLoader::requestFrame(HTMLFrameOwnerElement* ownerElement, const String
return false;
if (!scriptURL.isEmpty())
- frame->loader()->executeIfJavaScriptURL(scriptURL);
+ frame->script()->executeIfJavaScriptURL(scriptURL);
return true;
}
@@ -466,12 +387,12 @@ Frame* FrameLoader::loadSubframe(HTMLFrameOwnerElement* ownerElement, const KURL
marginHeight = o->getMarginHeight();
}
- if (!canLoad(url, referrer)) {
+ if (!SecurityOrigin::canLoad(url, referrer, 0)) {
FrameLoader::reportLocalLoadFailed(m_frame, url.string());
return 0;
}
- bool hideReferrer = shouldHideReferrer(url, referrer);
+ bool hideReferrer = SecurityOrigin::shouldHideReferrer(url, referrer);
RefPtr<Frame> frame = m_client->createFrame(url, name, ownerElement, hideReferrer ? String() : referrer, allowsScrolling, marginWidth, marginHeight);
if (!frame) {
@@ -521,7 +442,7 @@ void FrameLoader::submitForm(const char* action, const String& url, PassRefPtr<F
if (protocolIsJavaScript(u)) {
m_isExecutingJavaScriptFormAction = true;
- executeIfJavaScriptURL(u, false, false);
+ m_frame->script()->executeIfJavaScriptURL(u, false, false);
m_isExecutingJavaScriptFormAction = false;
return;
}
@@ -576,7 +497,7 @@ void FrameLoader::submitForm(const char* action, const String& url, PassRefPtr<F
frameRequest.resourceRequest().setURL(u);
addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin());
- targetFrame->loader()->scheduleFormSubmission(frameRequest, lockHistory, event, formState);
+ targetFrame->redirectScheduler()->scheduleFormSubmission(frameRequest, lockHistory, event, formState);
}
void FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy, DatabasePolicy databasePolicy)
@@ -605,8 +526,14 @@ void FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy, DatabasePolic
}
// Dispatching the unload event could have made m_frame->document() null.
- if (m_frame->document() && !m_frame->document()->inPageCache())
- m_frame->document()->removeAllEventListeners();
+ if (m_frame->document() && !m_frame->document()->inPageCache()) {
+ // Don't remove event listeners from a transitional empty document (see bug 28716 for more information).
+ bool keepEventListeners = m_isDisplayingInitialEmptyDocument && m_provisionalDocumentLoader
+ && m_frame->document()->securityOrigin()->isSecureTransitionTo(m_provisionalDocumentLoader->url());
+
+ if (!keepEventListeners)
+ m_frame->document()->removeAllEventListeners();
+ }
}
m_isComplete = true; // to avoid calling completed() in finishedParsing()
@@ -634,7 +561,7 @@ void FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy, DatabasePolic
for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling())
child->loader()->stopLoading(unloadEventPolicy);
- cancelRedirection();
+ m_frame->redirectScheduler()->cancel();
}
void FrameLoader::stop()
@@ -653,7 +580,7 @@ void FrameLoader::stop()
bool FrameLoader::closeURL()
{
- saveDocumentState();
+ history()->saveDocumentState();
// Should only send the pagehide event here if the current document exists and has not been placed in the page cache.
Document* currentDocument = m_frame->document();
@@ -663,13 +590,6 @@ bool FrameLoader::closeURL()
return true;
}
-void FrameLoader::cancelRedirection(bool cancelWithLoadInProgress)
-{
- m_cancellingWithLoadInProgress = cancelWithLoadInProgress;
-
- stopRedirectionTimer();
-}
-
KURL FrameLoader::iconURL()
{
// If this isn't a top level frame, return nothing
@@ -695,15 +615,14 @@ KURL FrameLoader::iconURL()
bool FrameLoader::didOpenURL(const KURL& url)
{
- if (m_scheduledRedirection && m_scheduledRedirection->wasDuringLoad) {
+ if (m_frame->redirectScheduler()->redirectScheduledDuringLoad()) {
// A redirect was scheduled before the document was created.
// This can happen when one frame changes another frame's location.
return false;
}
- cancelRedirection();
+ m_frame->redirectScheduler()->cancel();
m_frame->editor()->clearLastEditCommand();
- closeURL();
m_isComplete = false;
m_isLoadingMainResource = true;
@@ -738,71 +657,15 @@ void FrameLoader::didExplicitOpen()
// from a subsequent window.document.open / window.document.write call.
// Cancelling redirection here works for all cases because document.open
// implicitly precedes document.write.
- cancelRedirection();
+ m_frame->redirectScheduler()->cancel();
if (m_frame->document()->url() != blankURL())
m_URL = m_frame->document()->url();
}
-bool FrameLoader::executeIfJavaScriptURL(const KURL& url, bool userGesture, bool replaceDocument)
-{
- if (!protocolIsJavaScript(url))
- return false;
-
- if (m_frame->page() && !m_frame->page()->javaScriptURLsAreAllowed())
- return true;
-
- const int javascriptSchemeLength = sizeof("javascript:") - 1;
-
- String script = url.string().substring(javascriptSchemeLength);
- ScriptValue result;
- if (m_frame->script()->xssAuditor()->canEvaluateJavaScriptURL(script))
- result = executeScript(decodeURLEscapeSequences(script), userGesture);
-
- String scriptResult;
- if (!result.getString(scriptResult))
- return true;
-
- SecurityOrigin* currentSecurityOrigin = m_frame->document()->securityOrigin();
-
- // FIXME: We should always replace the document, but doing so
- // synchronously can cause crashes:
- // http://bugs.webkit.org/show_bug.cgi?id=16782
- if (replaceDocument) {
- stopAllLoaders();
- begin(m_URL, true, currentSecurityOrigin);
- write(scriptResult);
- end();
- }
-
- return true;
-}
-
-ScriptValue FrameLoader::executeScript(const String& script, bool forceUserGesture)
-{
- return executeScript(ScriptSourceCode(script, forceUserGesture ? KURL() : m_URL));
-}
-
-ScriptValue FrameLoader::executeScript(const ScriptSourceCode& sourceCode)
-{
- if (!m_frame->script()->isEnabled() || m_frame->script()->isPaused())
- return ScriptValue();
-
- bool wasRunningScript = m_isRunningScript;
- m_isRunningScript = true;
-
- ScriptValue result = m_frame->script()->evaluate(sourceCode);
-
- if (!wasRunningScript) {
- m_isRunningScript = false;
- Document::updateStyleForAllDocuments();
- }
-
- return result;
-}
void FrameLoader::cancelAndClear()
{
- cancelRedirection();
+ m_frame->redirectScheduler()->cancel();
if (!m_isComplete)
closeURL();
@@ -811,6 +674,14 @@ void FrameLoader::cancelAndClear()
m_frame->script()->updatePlatformScriptObjects();
}
+void FrameLoader::replaceDocument(const String& html)
+{
+ stopAllLoaders();
+ begin(m_URL, true, m_frame->document()->securityOrigin());
+ write(html);
+ end();
+}
+
void FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView)
{
m_frame->editor()->clear();
@@ -853,8 +724,7 @@ void FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects, boo
if (clearScriptObjects)
m_frame->script()->clearScriptObjects();
- m_redirectionTimer.stop();
- m_scheduledRedirection.clear();
+ m_frame->redirectScheduler()->clear();
m_checkTimer.stop();
m_shouldCallCheckCompleted = false;
@@ -895,7 +765,7 @@ void FrameLoader::receivedFirstData()
else
url = m_frame->document()->completeURL(url).string();
- scheduleHTTPRedirection(delay, url);
+ m_frame->redirectScheduler()->scheduleRedirect(delay, url);
}
const String& FrameLoader::responseMIMEType() const
@@ -972,7 +842,7 @@ void FrameLoader::begin(const KURL& url, bool dispatch, SecurityOrigin* origin)
document->parseDNSPrefetchControlHeader(dnsPrefetchControl);
}
- restoreDocumentState();
+ history()->restoreDocumentState();
document->implicitOpen();
@@ -1151,21 +1021,6 @@ void FrameLoader::startIconLoader()
m_iconLoader->startLoading();
}
-void FrameLoader::setLocalLoadPolicy(LocalLoadPolicy policy)
-{
- localLoadPolicy = policy;
-}
-
-bool FrameLoader::restrictAccessToLocal()
-{
- return localLoadPolicy != FrameLoader::AllowLocalLoadsForAll;
-}
-
-bool FrameLoader::allowSubstituteDataAccessToLocal()
-{
- return localLoadPolicy != FrameLoader::AllowLocalLoadsForLocalOnly;
-}
-
void FrameLoader::commitIconURLToIconDatabase(const KURL& icon)
{
ASSERT(iconDatabase());
@@ -1174,52 +1029,6 @@ void FrameLoader::commitIconURLToIconDatabase(const KURL& icon)
iconDatabase()->setIconURLForPageURL(icon.string(), originalRequestURL().string());
}
-void FrameLoader::restoreDocumentState()
-{
- Document* doc = m_frame->document();
-
- HistoryItem* itemToRestore = 0;
-
- switch (loadType()) {
- case FrameLoadTypeReload:
- case FrameLoadTypeReloadFromOrigin:
- case FrameLoadTypeSame:
- case FrameLoadTypeReplace:
- break;
- case FrameLoadTypeBack:
- case FrameLoadTypeBackWMLDeckNotAccessible:
- case FrameLoadTypeForward:
- case FrameLoadTypeIndexedBackForward:
- case FrameLoadTypeRedirectWithLockedBackForwardList:
- case FrameLoadTypeStandard:
- itemToRestore = m_currentHistoryItem.get();
- }
-
- if (!itemToRestore)
- return;
-
- LOG(Loading, "WebCoreLoading %s: restoring form state from %p", m_frame->tree()->name().string().utf8().data(), itemToRestore);
- doc->setStateForNewFormElements(itemToRestore->documentState());
-}
-
-void FrameLoader::gotoAnchor()
-{
- // If our URL has no ref, then we have no place we need to jump to.
- // OTOH If CSS target was set previously, we want to set it to 0, recalc
- // and possibly repaint because :target pseudo class may have been
- // set (see bug 11321).
- if (!m_URL.hasFragmentIdentifier() && !m_frame->document()->cssTarget())
- return;
-
- String fragmentIdentifier = m_URL.fragmentIdentifier();
- if (gotoAnchor(fragmentIdentifier))
- return;
-
- // Try again after decoding the ref, based on the document's encoding.
- if (m_decoder)
- gotoAnchor(decodeURLEscapeSequences(fragmentIdentifier, m_decoder->encoding()));
-}
-
void FrameLoader::finishedParsing()
{
if (m_creatingInitialEmptyDocument)
@@ -1242,8 +1051,7 @@ void FrameLoader::finishedParsing()
// Check if the scrollbars are really needed for the content.
// If not, remove them, relayout, and repaint.
m_frame->view()->restoreScrollbar();
-
- gotoAnchor();
+ m_frame->view()->scrollToFragment(m_URL);
}
void FrameLoader::loadDone()
@@ -1298,7 +1106,7 @@ void FrameLoader::checkCompleted()
RefPtr<Frame> protect(m_frame);
checkCallImplicitClose(); // if we didn't do it before
- startRedirectionTimer();
+ m_frame->redirectScheduler()->startTimer();
completed();
if (m_frame->page())
@@ -1363,186 +1171,11 @@ KURL FrameLoader::completeURL(const String& url)
return m_frame->document()->completeURL(url);
}
-void FrameLoader::scheduleHTTPRedirection(double delay, const String& url)
-{
- if (delay < 0 || delay > INT_MAX / 1000)
- return;
-
- if (!m_frame->page())
- return;
-
- if (url.isEmpty())
- return;
-
- // We want a new history item if the refresh timeout is > 1 second.
- if (!m_scheduledRedirection || delay <= m_scheduledRedirection->delay)
- scheduleRedirection(new ScheduledRedirection(delay, url, true, delay <= 1, false, false));
-}
-
-static bool mustLockBackForwardList(Frame* targetFrame)
-{
- // Navigation of a subframe during loading of an ancestor frame does not create a new back/forward item.
- // The definition of "during load" is any time before all handlers for the load event have been run.
- // See https://bugs.webkit.org/show_bug.cgi?id=14957 for the original motivation for this.
-
- for (Frame* ancestor = targetFrame->tree()->parent(); ancestor; ancestor = ancestor->tree()->parent()) {
- Document* document = ancestor->document();
- if (!ancestor->loader()->isComplete() || document && document->processingLoadEvent())
- return true;
- }
- return false;
-}
-
-void FrameLoader::scheduleLocationChange(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture)
-{
- if (!m_frame->page())
- return;
-
- if (url.isEmpty())
- return;
-
- lockBackForwardList = lockBackForwardList || mustLockBackForwardList(m_frame);
-
- // If the URL we're going to navigate to is the same as the current one, except for the
- // fragment part, we don't need to schedule the location change.
- KURL parsedURL(ParsedURLString, url);
- if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(m_URL, parsedURL)) {
- changeLocation(completeURL(url), referrer, lockHistory, lockBackForwardList, wasUserGesture);
- return;
- }
-
- // Handle a location change of a page with no document as a special case.
- // This may happen when a frame changes the location of another frame.
- bool duringLoad = !m_committedFirstRealDocumentLoad;
-
- scheduleRedirection(new ScheduledRedirection(url, referrer, lockHistory, lockBackForwardList, wasUserGesture, false, duringLoad));
-}
-
-void FrameLoader::scheduleFormSubmission(const FrameLoadRequest& frameRequest,
- bool lockHistory, PassRefPtr<Event> event, PassRefPtr<FormState> formState)
-{
- ASSERT(m_frame->page());
- ASSERT(!frameRequest.isEmpty());
-
- // FIXME: Do we need special handling for form submissions where the URL is the same
- // as the current one except for the fragment part? See scheduleLocationChange above.
-
- // Handle a location change of a page with no document as a special case.
- // This may happen when a frame changes the location of another frame.
- bool duringLoad = !m_committedFirstRealDocumentLoad;
-
- scheduleRedirection(new ScheduledRedirection(frameRequest, lockHistory, mustLockBackForwardList(m_frame), event, formState, duringLoad));
-}
-
-void FrameLoader::scheduleRefresh(bool wasUserGesture)
-{
- if (!m_frame->page())
- return;
-
- if (m_URL.isEmpty())
- return;
-
- scheduleRedirection(new ScheduledRedirection(m_URL.string(), m_outgoingReferrer, true, true, wasUserGesture, true, false));
-}
-
-bool FrameLoader::isLocationChange(const ScheduledRedirection& redirection)
-{
- switch (redirection.type) {
- case ScheduledRedirection::redirection:
- return false;
- case ScheduledRedirection::historyNavigation:
- case ScheduledRedirection::locationChange:
- case ScheduledRedirection::formSubmission:
- return true;
- }
- ASSERT_NOT_REACHED();
- return false;
-}
-
-void FrameLoader::scheduleHistoryNavigation(int steps)
-{
- if (!m_frame->page())
- return;
-
- scheduleRedirection(new ScheduledRedirection(steps));
-}
-
-void FrameLoader::goBackOrForward(int distance)
-{
- if (distance == 0)
- return;
-
- Page* page = m_frame->page();
- if (!page)
- return;
- BackForwardList* list = page->backForwardList();
- if (!list)
- return;
-
- HistoryItem* item = list->itemAtIndex(distance);
- if (!item) {
- if (distance > 0) {
- int forwardListCount = list->forwardListCount();
- if (forwardListCount > 0)
- item = list->itemAtIndex(forwardListCount);
- } else {
- int backListCount = list->backListCount();
- if (backListCount > 0)
- item = list->itemAtIndex(-backListCount);
- }
- }
-
- ASSERT(item); // we should not reach this line with an empty back/forward list
- if (item)
- page->goToItem(item, FrameLoadTypeIndexedBackForward);
-}
-
-void FrameLoader::redirectionTimerFired(Timer<FrameLoader>*)
-{
- ASSERT(m_frame->page());
-
- if (m_frame->page()->defersLoading())
- return;
-
- OwnPtr<ScheduledRedirection> redirection(m_scheduledRedirection.release());
-
- switch (redirection->type) {
- case ScheduledRedirection::redirection:
- case ScheduledRedirection::locationChange:
- changeLocation(KURL(ParsedURLString, redirection->url), redirection->referrer,
- redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, redirection->wasRefresh);
- return;
- case ScheduledRedirection::historyNavigation:
- if (redirection->historySteps == 0) {
- // Special case for go(0) from a frame -> reload only the frame
- urlSelected(m_URL, "", 0, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture);
- return;
- }
- // go(i!=0) from a frame navigates into the history of the frame only,
- // in both IE and NS (but not in Mozilla). We can't easily do that.
- if (canGoBackOrForward(redirection->historySteps))
- goBackOrForward(redirection->historySteps);
- return;
- case ScheduledRedirection::formSubmission:
- // The submitForm function will find a target frame before using the redirection timer.
- // Now that the timer has fired, we need to repeat the security check which normally is done when
- // selecting a target, in case conditions have changed. Other code paths avoid this by targeting
- // without leaving a time window. If we fail the check just silently drop the form submission.
- if (!redirection->formState->sourceFrame()->loader()->shouldAllowNavigation(m_frame))
- return;
- loadFrameRequest(redirection->frameRequest, redirection->lockHistory, redirection->lockBackForwardList,
- redirection->event, redirection->formState);
- return;
- }
-
- ASSERT_NOT_REACHED();
-}
-
void FrameLoader::loadURLIntoChildFrame(const KURL& url, const String& referer, Frame* childFrame)
{
ASSERT(childFrame);
- HistoryItem* parentItem = currentHistoryItem();
+ HistoryItem* parentItem = history()->currentItem();
FrameLoadType loadType = this->loadType();
FrameLoadType childLoadType = FrameLoadTypeRedirectWithLockedBackForwardList;
@@ -1558,7 +1191,7 @@ void FrameLoader::loadURLIntoChildFrame(const KURL& url, const String& referer,
// this is needed is Radar 3213556.
workingURL = KURL(ParsedURLString, childItem->originalURLString());
childLoadType = loadType;
- childFrame->loader()->m_provisionalHistoryItem = childItem;
+ childFrame->loader()->history()->setProvisionalItem(childItem);
}
}
@@ -1601,54 +1234,6 @@ String FrameLoader::encoding() const
return settings ? settings->defaultTextEncodingName() : String();
}
-bool FrameLoader::gotoAnchor(const String& name)
-{
- ASSERT(m_frame->document());
-
- if (!m_frame->document()->haveStylesheetsLoaded()) {
- m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
- return false;
- }
-
- m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
-
- Element* anchorNode = m_frame->document()->findAnchor(name);
-
-#if ENABLE(SVG)
- if (m_frame->document()->isSVGDocument()) {
- if (name.startsWith("xpointer(")) {
- // We need to parse the xpointer reference here
- } else if (name.startsWith("svgView(")) {
- RefPtr<SVGSVGElement> svg = static_cast<SVGDocument*>(m_frame->document())->rootElement();
- if (!svg->currentView()->parseViewSpec(name))
- return false;
- svg->setUseCurrentView(true);
- } else {
- if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) {
- RefPtr<SVGViewElement> viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0;
- if (viewElement.get()) {
- RefPtr<SVGSVGElement> svg = static_cast<SVGSVGElement*>(SVGLocatable::nearestViewportElement(viewElement.get()));
- svg->inheritViewAttributes(viewElement.get());
- }
- }
- }
- // FIXME: need to decide which <svg> to focus on, and zoom to that one
- // FIXME: need to actually "highlight" the viewTarget(s)
- }
-#endif
-
- m_frame->document()->setCSSTarget(anchorNode); // Setting to null will clear the current target.
-
- // Implement the rule that "" and "top" both mean top of page as in other browsers.
- if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
- return false;
-
- if (FrameView* view = m_frame->view())
- view->maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
-
- return true;
-}
-
bool FrameLoader::requestObject(RenderPart* renderer, const String& url, const AtomicString& frameName,
const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues)
{
@@ -1728,11 +1313,13 @@ bool FrameLoader::loadPlugin(RenderPart* renderer, const KURL& url, const String
if (renderer && !useFallback) {
HTMLPlugInElement* element = toPlugInElement(renderer->node());
- if (!canLoad(url, String(), frame()->document())) {
+ if (!SecurityOrigin::canLoad(url, String(), frame()->document())) {
FrameLoader::reportLocalLoadFailed(m_frame, url.string());
return false;
}
+ checkIfRunInsecureContent(m_frame->document()->securityOrigin(), url);
+
widget = m_client->createPlugin(IntSize(renderer->contentWidth(), renderer->contentHeight()),
element, url, paramNames, paramValues, mimeType,
m_frame->document()->isPluginDocument() && !m_containsPlugIns);
@@ -1771,6 +1358,10 @@ void FrameLoader::checkIfDisplayInsecureContent(SecurityOrigin* context, const K
if (!isMixedContent(context, url))
return;
+ String message = String::format("The page at %s displayed insecure content from %s.\n",
+ m_URL.string().utf8().data(), url.string().utf8().data());
+ m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String());
+
m_client->didDisplayInsecureContent();
}
@@ -1779,6 +1370,10 @@ void FrameLoader::checkIfRunInsecureContent(SecurityOrigin* context, const KURL&
if (!isMixedContent(context, url))
return;
+ String message = String::format("The page at %s ran insecure content from %s.\n",
+ m_URL.string().utf8().data(), url.string().utf8().data());
+ m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String());
+
m_client->didRunInsecureContent(context);
}
@@ -1801,16 +1396,6 @@ void FrameLoader::setOpener(Frame* opener)
}
}
-bool FrameLoader::openedByDOM() const
-{
- return m_openedByDOM;
-}
-
-void FrameLoader::setOpenedByDOM()
-{
- m_openedByDOM = true;
-}
-
void FrameLoader::handleFallbackContent()
{
HTMLFrameOwnerElement* owner = m_frame->ownerElement();
@@ -1822,7 +1407,7 @@ void FrameLoader::handleFallbackContent()
void FrameLoader::provisionalLoadStarted()
{
m_firstLayoutDone = false;
- cancelRedirection(true);
+ m_frame->redirectScheduler()->cancel(true);
m_client->provisionalLoadStarted();
}
@@ -1892,7 +1477,7 @@ bool FrameLoader::canCachePageContainingThisFrame()
&& !SharedWorkerRepository::hasSharedWorkers(m_frame->document())
#endif
&& !m_frame->document()->usingGeolocation()
- && m_currentHistoryItem
+ && history()->currentItem()
&& !m_quickRedirectComing
&& !m_documentLoader->isLoadingInAPISense()
&& !m_documentLoader->isStopping()
@@ -2043,7 +1628,7 @@ bool FrameLoader::logCanCacheFrameDecision(int indentLevel)
#endif
if (m_frame->document()->usingGeolocation())
{ PCLOG(" -Frame uses Geolocation"); cannotCache = true; }
- if (!m_currentHistoryItem)
+ if (!history()->currentItem())
{ PCLOG(" -No current history item"); cannotCache = true; }
if (m_quickRedirectComing)
{ PCLOG(" -Quick redirect is coming"); cannotCache = true; }
@@ -2109,7 +1694,7 @@ private:
RefPtr<Document> m_document;
};
-
+
// This does the same kind of work that didOpenURL does, except it relies on the fact
// that a higher level already checked that the URLs match and the scrolling is the right thing to do.
void FrameLoader::scrollToAnchor(const KURL& url)
@@ -2121,12 +1706,13 @@ void FrameLoader::scrollToAnchor(const KURL& url)
}
m_URL = url;
- updateHistoryForAnchorScroll();
+ history()->updateForAnchorScroll();
// If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor
m_frame->eventHandler()->stopAutoscrollTimer();
started();
- gotoAnchor();
+ if (FrameView* view = m_frame->view())
+ view->scrollToFragment(m_URL);
// It's important to model this as a load that starts and immediately finishes.
// Otherwise, the parent frame may think we never finished loading.
@@ -2139,78 +1725,11 @@ bool FrameLoader::isComplete() const
return m_isComplete;
}
-void FrameLoader::scheduleRedirection(PassOwnPtr<ScheduledRedirection> redirection)
-{
- ASSERT(m_frame->page());
-
- // If a redirect was scheduled during a load, then stop the current load.
- // Otherwise when the current load transitions from a provisional to a
- // committed state, pending redirects may be cancelled.
- if (redirection->wasDuringLoad) {
- if (m_provisionalDocumentLoader)
- m_provisionalDocumentLoader->stopLoading();
- stopLoading(UnloadEventPolicyUnloadAndPageHide);
- }
-
- stopRedirectionTimer();
- m_scheduledRedirection = redirection;
- if (!m_isComplete && m_scheduledRedirection->type != ScheduledRedirection::redirection)
- completed();
- startRedirectionTimer();
-}
-
-void FrameLoader::startRedirectionTimer()
-{
- if (!m_scheduledRedirection)
- return;
-
- ASSERT(m_frame->page());
-
- if (m_redirectionTimer.isActive())
- return;
-
- if (m_scheduledRedirection->type == ScheduledRedirection::redirection && !allAncestorsAreComplete())
- return;
-
- m_redirectionTimer.startOneShot(m_scheduledRedirection->delay);
-
- switch (m_scheduledRedirection->type) {
- case ScheduledRedirection::locationChange:
- case ScheduledRedirection::redirection:
- if (m_scheduledRedirection->toldClient)
- return;
- m_scheduledRedirection->toldClient = true;
- clientRedirected(KURL(ParsedURLString, m_scheduledRedirection->url),
- m_scheduledRedirection->delay,
- currentTime() + m_redirectionTimer.nextFireInterval(),
- m_scheduledRedirection->lockBackForwardList);
- return;
- case ScheduledRedirection::formSubmission:
- // FIXME: It would make sense to report form submissions as client redirects too.
- // But we didn't do that in the past when form submission used a separate delay
- // mechanism, so doing it will be a behavior change.
- return;
- case ScheduledRedirection::historyNavigation:
- // Don't report history navigations.
- return;
- }
- ASSERT_NOT_REACHED();
-}
-
-void FrameLoader::stopRedirectionTimer()
-{
- m_redirectionTimer.stop();
-
- OwnPtr<ScheduledRedirection> redirection(m_scheduledRedirection.release());
- if (redirection && redirection->toldClient)
- clientRedirectCancelledOrFinished(m_cancellingWithLoadInProgress);
-}
-
void FrameLoader::completed()
{
RefPtr<Frame> protect(m_frame);
for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling())
- child->loader()->startRedirectionTimer();
+ child->redirectScheduler()->startTimer();
if (Frame* parent = m_frame->tree()->parent())
parent->loader()->checkCompleted();
if (m_frame->view())
@@ -2264,7 +1783,7 @@ static bool isFeedWithNestedProtocolInHTTPFamily(const KURL& url)
}
void FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHistory, bool lockBackForwardList,
- PassRefPtr<Event> event, PassRefPtr<FormState> formState)
+ PassRefPtr<Event> event, PassRefPtr<FormState> formState, ReferrerPolicy referrerPolicy)
{
KURL url = request.resourceRequest().url();
@@ -2277,13 +1796,13 @@ void FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHis
ASSERT(frame()->document());
if (SecurityOrigin::shouldTreatURLAsLocal(url.string()) && !isFeedWithNestedProtocolInHTTPFamily(url)) {
- if (!canLoad(url, String(), frame()->document()) && !canLoad(url, referrer)) {
+ if (!SecurityOrigin::canLoad(url, String(), frame()->document()) && !SecurityOrigin::canLoad(url, referrer, 0)) {
FrameLoader::reportLocalLoadFailed(m_frame, url.string());
return;
}
}
- if (shouldHideReferrer(url, referrer))
+ if (SecurityOrigin::shouldHideReferrer(url, referrer) || referrerPolicy == NoReferrer)
referrer = String();
FrameLoadType loadType;
@@ -2340,7 +1859,8 @@ void FrameLoader::loadURL(const KURL& newURL, const String& referrer, const Stri
NavigationAction action(newURL, newLoadType, isFormSubmission, event);
if (!targetFrame && !frameName.isEmpty()) {
- checkNewWindowPolicy(action, request, formState.release(), frameName);
+ policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy,
+ request, formState.release(), frameName, this);
return;
}
@@ -2353,9 +1873,9 @@ void FrameLoader::loadURL(const KURL& newURL, const String& referrer, const Stri
// work properly.
if (shouldScrollToAnchor(isFormSubmission, newLoadType, newURL)) {
oldDocumentLoader->setTriggeringAction(action);
- stopPolicyCheck();
- m_policyLoadType = newLoadType;
- checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(),
+ policyChecker()->stopCheck();
+ policyChecker()->setLoadType(newLoadType);
+ policyChecker()->checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(),
callContinueFragmentScrollAfterNavigationPolicy, this);
} else {
// must grab this now, since this load may stop the previous load and clear this flag
@@ -2404,7 +1924,7 @@ void FrameLoader::load(const ResourceRequest& request, const String& frameName,
return;
}
- checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), request, 0, frameName);
+ policyChecker()->checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), FrameLoader::callContinueLoadAfterNewWindowPolicy, request, 0, frameName, this);
}
void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, bool lockHistory, FrameLoadType type, PassRefPtr<FormState> formState)
@@ -2462,54 +1982,41 @@ void FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType t
if (m_unloadEventBeingDispatched)
return;
- m_policyLoadType = type;
+ policyChecker()->setLoadType(type);
RefPtr<FormState> formState = prpFormState;
bool isFormSubmission = formState;
const KURL& newURL = loader->request().url();
- if (shouldScrollToAnchor(isFormSubmission, m_policyLoadType, newURL)) {
+ if (shouldScrollToAnchor(isFormSubmission, policyChecker()->loadType(), newURL)) {
RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader;
- NavigationAction action(newURL, m_policyLoadType, isFormSubmission);
+ NavigationAction action(newURL, policyChecker()->loadType(), isFormSubmission);
oldDocumentLoader->setTriggeringAction(action);
- stopPolicyCheck();
- checkNavigationPolicy(loader->request(), oldDocumentLoader.get(), formState,
+ policyChecker()->stopCheck();
+ policyChecker()->checkNavigationPolicy(loader->request(), oldDocumentLoader.get(), formState,
callContinueFragmentScrollAfterNavigationPolicy, this);
} else {
if (Frame* parent = m_frame->tree()->parent())
loader->setOverrideEncoding(parent->loader()->documentLoader()->overrideEncoding());
- stopPolicyCheck();
+ policyChecker()->stopCheck();
setPolicyDocumentLoader(loader);
if (loader->triggeringAction().isEmpty())
- loader->setTriggeringAction(NavigationAction(newURL, m_policyLoadType, isFormSubmission));
+ loader->setTriggeringAction(NavigationAction(newURL, policyChecker()->loadType(), isFormSubmission));
+
+ if (Element* ownerElement = m_frame->document()->ownerElement()) {
+ if (!ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) {
+ continueLoadAfterNavigationPolicy(loader->request(), formState, false);
+ return;
+ }
+ }
- checkNavigationPolicy(loader->request(), loader, formState,
+ policyChecker()->checkNavigationPolicy(loader->request(), loader, formState,
callContinueLoadAfterNavigationPolicy, this);
}
}
-bool FrameLoader::canLoad(const KURL& url, const String& referrer, const Document* doc)
-{
- return canLoad(url, referrer, doc ? doc->securityOrigin() : 0);
-}
-
-bool FrameLoader::canLoad(const KURL& url, const String& referrer, const SecurityOrigin* securityOrigin)
-{
- // We can always load any URL that isn't considered local (e.g. http URLs).
- if (!SecurityOrigin::shouldTreatURLAsLocal(url.string()))
- return true;
-
- // If we were provided a document, we let its local file policy dictate the result,
- // otherwise we allow local loads only if the supplied referrer is also local.
- if (securityOrigin)
- return securityOrigin->canLoadLocalResources();
- if (!referrer.isEmpty())
- return SecurityOrigin::shouldTreatURLAsLocal(referrer);
- return false;
-}
-
void FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url)
{
ASSERT(!url.isEmpty());
@@ -2519,22 +2026,6 @@ void FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url)
frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Not allowed to load local resource: " + url, 0, String());
}
-bool FrameLoader::shouldHideReferrer(const KURL& url, const String& referrer)
-{
- bool referrerIsSecureURL = protocolIs(referrer, "https");
- bool referrerIsWebURL = referrerIsSecureURL || protocolIs(referrer, "http");
-
- if (!referrerIsWebURL)
- return true;
-
- if (!referrerIsSecureURL)
- return false;
-
- bool URLIsSecureURL = url.protocolIs("https");
-
- return !URLIsSecureURL;
-}
-
const ResourceRequest& FrameLoader::initialRequest() const
{
return activeDocumentLoader()->originalRequest();
@@ -2545,50 +2036,23 @@ void FrameLoader::receivedData(const char* data, int length)
activeDocumentLoader()->receivedData(data, length);
}
-void FrameLoader::handleUnimplementablePolicy(const ResourceError& error)
+bool FrameLoader::willLoadMediaElementURL(KURL& url)
{
- m_delegateIsHandlingUnimplementablePolicy = true;
- m_client->dispatchUnableToImplementPolicy(error);
- m_delegateIsHandlingUnimplementablePolicy = false;
-}
+ ResourceRequest request(url);
-void FrameLoader::cannotShowMIMEType(const ResourceResponse& response)
-{
- handleUnimplementablePolicy(m_client->cannotShowMIMETypeError(response));
-}
+ unsigned long identifier;
+ ResourceError error;
+ requestFromDelegate(request, identifier, error);
+ notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, ResourceResponse(url, String(), -1, String(), String()), -1, error);
-ResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request)
-{
- return m_client->interruptForPolicyChangeError(request);
-}
+ url = request.url();
-void FrameLoader::checkNavigationPolicy(const ResourceRequest& newRequest, NavigationPolicyDecisionFunction function, void* argument)
-{
- checkNavigationPolicy(newRequest, activeDocumentLoader(), 0, function, argument);
+ return error.isNull();
}
-void FrameLoader::checkContentPolicy(const String& MIMEType, ContentPolicyDecisionFunction function, void* argument)
+ResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request)
{
- ASSERT(activeDocumentLoader());
-
- // Always show content with valid substitute data.
- if (activeDocumentLoader()->substituteData().isValid()) {
- function(argument, PolicyUse);
- return;
- }
-
-#if ENABLE(FTPDIR)
- // Respect the hidden FTP Directory Listing pref so it can be tested even if the policy delegate might otherwise disallow it
- Settings* settings = m_frame->settings();
- if (settings && settings->forceFTPDirectoryListings() && MIMEType == "application/x-ftp-directory") {
- function(argument, PolicyUse);
- return;
- }
-#endif
-
- m_policyCheck.set(function, argument);
- m_client->dispatchDecidePolicyForMIMEType(&FrameLoader::continueAfterContentPolicy,
- MIMEType, activeDocumentLoader()->request());
+ return m_client->interruptForPolicyChangeError(request);
}
bool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader)
@@ -2598,7 +2062,7 @@ bool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader)
if (unreachableURL.isEmpty())
return false;
- if (!isBackForwardLoadType(m_policyLoadType))
+ if (!isBackForwardLoadType(policyChecker()->loadType()))
return false;
// We only treat unreachableURLs specially during the delegate callbacks
@@ -2607,7 +2071,7 @@ bool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader)
// case handles malformed URLs and unknown schemes. Loading alternate content
// at other times behaves like a standard load.
DocumentLoader* compareDocumentLoader = 0;
- if (m_delegateIsDecidingNavigationPolicy || m_delegateIsHandlingUnimplementablePolicy)
+ if (policyChecker()->delegateIsDecidingNavigationPolicy() || policyChecker()->delegateIsHandlingUnimplementablePolicy())
compareDocumentLoader = m_policyDocumentLoader.get();
else if (m_delegateIsHandlingProvisionalLoadError)
compareDocumentLoader = m_provisionalDocumentLoader.get();
@@ -2762,7 +2226,7 @@ void FrameLoader::stopAllLoaders(DatabasePolicy databasePolicy)
m_inStopAllLoaders = true;
- stopPolicyCheck();
+ policyChecker()->stopCheck();
stopLoadingSubframes();
if (m_provisionalDocumentLoader)
@@ -2893,7 +2357,7 @@ void FrameLoader::commitProvisionalLoad(PassRefPtr<CachedPage> prpCachedPage)
// Check to see if we need to cache the page we are navigating away from into the back/forward cache.
// We are doing this here because we know for sure that a new page is about to be loaded.
- cachePageForHistoryItem(m_currentHistoryItem.get());
+ cachePageForHistoryItem(history()->currentItem());
if (m_loadType != FrameLoadTypeReplace)
closeOldDataSources();
@@ -2927,7 +2391,7 @@ void FrameLoader::commitProvisionalLoad(PassRefPtr<CachedPage> prpCachedPage)
LOG(Loading, "WebCoreLoading %s: Finished committing provisional load to URL %s", m_frame->tree()->name().string().utf8().data(), m_URL.string().utf8().data());
if (m_loadType == FrameLoadTypeStandard && m_documentLoader->isClientRedirect())
- updateHistoryForClientRedirect();
+ history()->updateForClientRedirect();
if (m_loadingFromCachedPage) {
m_frame->document()->documentDidBecomeActive();
@@ -2947,10 +2411,10 @@ void FrameLoader::commitProvisionalLoad(PassRefPtr<CachedPage> prpCachedPage)
// FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.
// However, with today's computers and networking speeds, this won't happen in practice.
// Could be an issue with a giant local file.
- sendRemainingDelegateMessages(identifier, response, static_cast<int>(response.expectedContentLength()), error);
+ notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, static_cast<int>(response.expectedContentLength()), error);
}
- pageCache()->remove(m_currentHistoryItem.get());
+ pageCache()->remove(history()->currentItem());
m_documentLoader->setPrimaryLoadComplete(true);
@@ -2968,7 +2432,7 @@ void FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage)
return;
m_client->setCopiesOnScroll();
- updateHistoryForCommit();
+ history()->updateForCommit();
// The call to closeURL() invokes the unload event handler, which can execute arbitrary
// JavaScript. If the script initiates a new load, we need to abandon the current load,
@@ -3000,7 +2464,7 @@ void FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage)
case FrameLoadTypeIndexedBackForward:
if (Page* page = m_frame->page())
if (page->backForwardList()) {
- updateHistoryForBackForwardNavigation();
+ history()->updateForBackForwardNavigation();
// Create a document view for this document, or used the cached view.
if (cachedPage) {
@@ -3018,12 +2482,12 @@ void FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage)
case FrameLoadTypeReloadFromOrigin:
case FrameLoadTypeSame:
case FrameLoadTypeReplace:
- updateHistoryForReload();
+ history()->updateForReload();
m_client->transitionToCommittedForNewPage();
break;
case FrameLoadTypeStandard:
- updateHistoryForStandardLoad();
+ history()->updateForStandardLoad();
#ifndef BUILDING_ON_TIGER
// This code was originally added for a Leopard performance imporvement. We decided to
// ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>.
@@ -3034,7 +2498,7 @@ void FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage)
break;
case FrameLoadTypeRedirectWithLockedBackForwardList:
- updateHistoryForRedirectWithLockedBackForwardList();
+ history()->updateForRedirectWithLockedBackForwardList();
m_client->transitionToCommittedForNewPage();
break;
@@ -3130,7 +2594,7 @@ void FrameLoader::open(CachedPage& cachedPage)
ASSERT(m_frame->page());
ASSERT(m_frame->page()->mainFrame() == m_frame);
- cancelRedirection();
+ m_frame->redirectScheduler()->cancel();
// We still have to close the previous part page.
closeURL();
@@ -3242,12 +2706,6 @@ String FrameLoader::generatedMIMETypeForURLScheme(const String& URLScheme)
return m_client->generatedMIMETypeForURLScheme(URLScheme);
}
-void FrameLoader::cancelContentPolicyCheck()
-{
- m_client->cancelPolicyCheck();
- m_policyCheck.clear();
-}
-
void FrameLoader::didReceiveServerRedirectForProvisionalLoadForFrame()
{
m_client->dispatchDidReceiveServerRedirectForProvisionalLoad();
@@ -3288,6 +2746,8 @@ void FrameLoader::finishedLoadingDocument(DocumentLoader* loader)
loader->setParsedArchiveData(mainResource->data());
m_responseMIMEType = mainResource->mimeType();
+
+ closeURL();
didOpenURL(mainResource->url());
String userChosenEncoding = documentLoader()->overrideEncoding();
@@ -3367,14 +2827,6 @@ CachePolicy FrameLoader::subresourceCachePolicy() const
return CachePolicyVerify;
}
-void FrameLoader::stopPolicyCheck()
-{
- m_client->cancelPolicyCheck();
- PolicyCheck check = m_policyCheck;
- m_policyCheck.clear();
- check.cancel();
-}
-
void FrameLoader::checkLoadCompleteForThisFrame()
{
ASSERT(m_client->hasWebView());
@@ -3397,7 +2849,7 @@ void FrameLoader::checkLoadCompleteForThisFrame()
RefPtr<HistoryItem> item;
if (Page* page = m_frame->page())
if (isBackForwardLoadType(loadType()) && m_frame == page->mainFrame())
- item = m_currentHistoryItem;
+ item = history()->currentItem();
bool shouldReset = true;
if (!(pdl->isLoadingInAPISense() && !pdl->isStopping())) {
@@ -3446,7 +2898,7 @@ void FrameLoader::checkLoadCompleteForThisFrame()
// If the user had a scroll point, scroll to it, overriding the anchor point if any.
if (Page* page = m_frame->page())
if ((isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) && page->backForwardList())
- restoreScrollPositionAndViewState();
+ history()->restoreScrollPositionAndViewState();
if (m_creatingInitialEmptyDocument || !m_committedFirstRealDocumentLoad)
return;
@@ -3473,14 +2925,7 @@ void FrameLoader::checkLoadCompleteForThisFrame()
ASSERT_NOT_REACHED();
}
-void FrameLoader::continueAfterContentPolicy(PolicyAction policy)
-{
- PolicyCheck check = m_policyCheck;
- m_policyCheck.clear();
- check.call(policy);
-}
-
-void FrameLoader::continueLoadAfterWillSubmitForm(PolicyAction)
+void FrameLoader::continueLoadAfterWillSubmitForm()
{
if (!m_provisionalDocumentLoader)
return;
@@ -3503,7 +2948,7 @@ void FrameLoader::continueLoadAfterWillSubmitForm(PolicyAction)
if (Page* page = m_frame->page()) {
identifier = page->progress()->createUniqueIdentifier();
- dispatchAssignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest());
+ notifier()->assignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest());
}
if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier))
@@ -3514,7 +2959,7 @@ void FrameLoader::didFirstLayout()
{
if (Page* page = m_frame->page())
if (isBackForwardLoadType(m_loadType) && page->backForwardList())
- restoreScrollPositionAndViewState();
+ history()->restoreScrollPositionAndViewState();
m_firstLayoutDone = true;
m_client->dispatchDidFirstLayout();
@@ -3531,9 +2976,7 @@ void FrameLoader::frameLoadCompleted()
m_client->frameLoadCompleted();
- // Even if already complete, we might have set a previous item on a frame that
- // didn't do any data loading on the past transaction. Make sure to clear these out.
- m_previousHistoryItem = 0;
+ history()->updateForFrameLoadCompleted();
// After a canceled provisional load, firstLayoutDone is false.
// Reset it to true if we're displaying a page.
@@ -3634,7 +3077,7 @@ void FrameLoader::detachFromParent()
closeURL();
stopAllLoaders();
- saveScrollPositionAndViewStateToItem(currentHistoryItem());
+ history()->saveScrollPositionAndViewStateToItem(history()->currentItem());
detachChildren();
#if ENABLE(INSPECTOR)
@@ -3777,7 +3220,7 @@ void FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String
if (Frame* targetFrame = formState ? 0 : findFrameForNavigation(frameName))
targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release());
else
- checkNewWindowPolicy(action, workingResourceRequest, formState.release(), frameName);
+ policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, workingResourceRequest, formState.release(), frameName, this);
} else
loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release());
}
@@ -3785,7 +3228,7 @@ void FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String
unsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data)
{
String referrer = m_outgoingReferrer;
- if (shouldHideReferrer(request.url(), referrer))
+ if (SecurityOrigin::shouldHideReferrer(request.url(), referrer))
referrer = String();
ResourceRequest initialRequest = request;
@@ -3820,49 +3263,9 @@ unsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& requ
}
#endif
}
-
- sendRemainingDelegateMessages(identifier, response, data.size(), error);
- return identifier;
-}
-
-void FrameLoader::assignIdentifierToInitialRequest(unsigned long identifier, const ResourceRequest& clientRequest)
-{
- return dispatchAssignIdentifierToInitialRequest(identifier, activeDocumentLoader(), clientRequest);
-}
-
-void FrameLoader::willSendRequest(ResourceLoader* loader, ResourceRequest& clientRequest, const ResourceResponse& redirectResponse)
-{
- applyUserAgent(clientRequest);
- dispatchWillSendRequest(loader->documentLoader(), loader->identifier(), clientRequest, redirectResponse);
-}
-
-void FrameLoader::didReceiveResponse(ResourceLoader* loader, const ResourceResponse& r)
-{
- activeDocumentLoader()->addResponse(r);
-
- if (Page* page = m_frame->page())
- page->progress()->incrementProgress(loader->identifier(), r);
- dispatchDidReceiveResponse(loader->documentLoader(), loader->identifier(), r);
-}
-void FrameLoader::didReceiveData(ResourceLoader* loader, const char* data, int length, int lengthReceived)
-{
- if (Page* page = m_frame->page())
- page->progress()->incrementProgress(loader->identifier(), data, length);
- dispatchDidReceiveContentLength(loader->documentLoader(), loader->identifier(), lengthReceived);
-}
-
-void FrameLoader::didFailToLoad(ResourceLoader* loader, const ResourceError& error)
-{
- if (Page* page = m_frame->page())
- page->progress()->completeProgress(loader->identifier());
- if (!error.isNull())
- m_client->dispatchDidFailLoading(loader->documentLoader(), loader->identifier(), error);
-}
-
-void FrameLoader::didLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString)
-{
- m_client->dispatchDidLoadResourceByXMLHttpRequest(identifier, sourceString);
+ notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, data.size(), error);
+ return identifier;
}
const ResourceRequest& FrameLoader::originalRequest() const
@@ -3876,7 +3279,7 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error, bool isC
RefPtr<Frame> protect(m_frame);
RefPtr<DocumentLoader> loader = activeDocumentLoader();
-
+
if (isComplete) {
// FIXME: Don't want to do this if an entirely new load is going, so should check
// that both data sources on the frame are either this or nil.
@@ -3884,7 +3287,7 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error, bool isC
if (m_client->shouldFallBack(error))
handleFallbackContent();
}
-
+
if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) {
if (m_submittedFormURL == m_provisionalDocumentLoader->originalRequestCopy().url())
m_submittedFormURL = KURL();
@@ -3892,7 +3295,7 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error, bool isC
// We might have made a page cache item, but now we're bailing out due to an error before we ever
// transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state
// so that the existing view (that wenever got far enough to replace) can continue being used.
- invalidateCurrentItemCachedPage();
+ history()->invalidateCurrentItemCachedPage();
// Call clientRedirectCancelledOrFinished here so that the frame load delegate is notified that the redirect's
// status has changed, if there was a redirect. The frame load delegate may have saved some state about
@@ -3902,8 +3305,7 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error, bool isC
if (m_sentRedirectNotification)
clientRedirectCancelledOrFinished(false);
}
-
-
+
loader->mainReceivedError(error, isComplete);
}
@@ -3916,7 +3318,7 @@ void FrameLoader::callContinueFragmentScrollAfterNavigationPolicy(void* argument
void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue)
{
- bool isRedirect = m_quickRedirectComing || m_policyLoadType == FrameLoadTypeRedirectWithLockedBackForwardList;
+ bool isRedirect = m_quickRedirectComing || policyChecker()->loadType() == FrameLoadTypeRedirectWithLockedBackForwardList;
m_quickRedirectComing = false;
if (!shouldContinue)
@@ -3937,7 +3339,7 @@ void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequ
// we have already saved away the scroll and doc state for the long slow load,
// but it's not an obvious case.
- addHistoryItemForFragmentScroll();
+ history()->updateBackForwardListForFragmentScroll();
}
scrollToAnchor(url);
@@ -3972,101 +3374,6 @@ bool FrameLoader::shouldScrollToAnchor(bool isFormSubmission, FrameLoadType load
&& !m_frame->document()->isFrameSet();
}
-void FrameLoader::checkNewWindowPolicy(const NavigationAction& action, const ResourceRequest& request,
- PassRefPtr<FormState> formState, const String& frameName)
-{
- m_policyCheck.set(request, formState, frameName,
- callContinueLoadAfterNewWindowPolicy, this);
- m_client->dispatchDecidePolicyForNewWindowAction(&FrameLoader::continueAfterNewWindowPolicy,
- action, request, formState, frameName);
-}
-
-void FrameLoader::continueAfterNewWindowPolicy(PolicyAction policy)
-{
- PolicyCheck check = m_policyCheck;
- m_policyCheck.clear();
-
- switch (policy) {
- case PolicyIgnore:
- check.clearRequest();
- break;
- case PolicyDownload:
- m_client->startDownload(check.request());
- check.clearRequest();
- break;
- case PolicyUse:
- break;
- }
-
- check.call(policy == PolicyUse);
-}
-
-void FrameLoader::checkNavigationPolicy(const ResourceRequest& request, DocumentLoader* loader,
- PassRefPtr<FormState> formState, NavigationPolicyDecisionFunction function, void* argument)
-{
- NavigationAction action = loader->triggeringAction();
- if (action.isEmpty()) {
- action = NavigationAction(request.url(), NavigationTypeOther);
- loader->setTriggeringAction(action);
- }
-
- // Don't ask more than once for the same request or if we are loading an empty URL.
- // This avoids confusion on the part of the client.
- if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) {
- function(argument, request, 0, true);
- loader->setLastCheckedRequest(request);
- return;
- }
-
- // We are always willing to show alternate content for unreachable URLs;
- // treat it like a reload so it maintains the right state for b/f list.
- if (loader->substituteData().isValid() && !loader->substituteData().failingURL().isEmpty()) {
- if (isBackForwardLoadType(m_policyLoadType))
- m_policyLoadType = FrameLoadTypeReload;
- function(argument, request, 0, true);
- return;
- }
-
- loader->setLastCheckedRequest(request);
-
- m_policyCheck.set(request, formState.get(), function, argument);
-
- m_delegateIsDecidingNavigationPolicy = true;
- m_client->dispatchDecidePolicyForNavigationAction(&FrameLoader::continueAfterNavigationPolicy,
- action, request, formState);
- m_delegateIsDecidingNavigationPolicy = false;
-}
-
-void FrameLoader::continueAfterNavigationPolicy(PolicyAction policy)
-{
- PolicyCheck check = m_policyCheck;
- m_policyCheck.clear();
-
- bool shouldContinue = policy == PolicyUse;
-
- switch (policy) {
- case PolicyIgnore:
- check.clearRequest();
- break;
- case PolicyDownload:
- m_client->startDownload(check.request());
- check.clearRequest();
- break;
- case PolicyUse: {
- ResourceRequest request(check.request());
-
- if (!m_client->canHandleRequest(request)) {
- handleUnimplementablePolicy(m_client->cannotShowURLError(check.request()));
- check.clearRequest();
- shouldContinue = false;
- }
- break;
- }
- }
-
- check.call(shouldContinue);
-}
-
void FrameLoader::callContinueLoadAfterNavigationPolicy(void* argument,
const ResourceRequest& request, PassRefPtr<FormState> formState, bool shouldContinue)
{
@@ -4081,7 +3388,7 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, Pass
// through this method already, nested; otherwise, policyDataSource should still be set.
ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableURL().isEmpty());
- bool isTargetItem = m_provisionalHistoryItem ? m_provisionalHistoryItem->isTargetItem() : false;
+ bool isTargetItem = history()->provisionalItem() ? history()->provisionalItem()->isTargetItem() : false;
// Two reasons we can't continue:
// 1) Navigation policy delegate said we can't so request is nil. A primary case of this
@@ -4101,10 +3408,10 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, Pass
// If the navigation request came from the back/forward menu, and we punt on it, we have the
// problem that we have optimistically moved the b/f cursor already, so move it back. For sanity,
// we only do this when punting a navigation for the target frame or top-level frame.
- if ((isTargetItem || isLoadingMainFrame()) && isBackForwardLoadType(m_policyLoadType))
+ if ((isTargetItem || isLoadingMainFrame()) && isBackForwardLoadType(policyChecker()->loadType()))
if (Page* page = m_frame->page()) {
Frame* mainFrame = page->mainFrame();
- if (HistoryItem* resetItem = mainFrame->loader()->m_currentHistoryItem.get()) {
+ if (HistoryItem* resetItem = mainFrame->loader()->history()->currentItem()) {
page->backForwardList()->goToItem(resetItem);
Settings* settings = m_frame->settings();
page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : resetItem);
@@ -4113,7 +3420,7 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, Pass
return;
}
- FrameLoadType type = m_policyLoadType;
+ FrameLoadType type = policyChecker()->loadType();
stopAllLoaders();
// <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders()
@@ -4138,12 +3445,11 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, Pass
return;
if (formState)
- m_client->dispatchWillSubmitForm(&FrameLoader::continueLoadAfterWillSubmitForm, formState);
+ m_client->dispatchWillSubmitForm(&PolicyChecker::continueLoadAfterWillSubmitForm, formState);
else
continueLoadAfterWillSubmitForm();
}
-
void FrameLoader::callContinueLoadAfterNewWindowPolicy(void* argument,
const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, bool shouldContinue)
{
@@ -4165,26 +3471,13 @@ void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& reques
if (frameName != "_blank")
mainFrame->tree()->setName(frameName);
- mainFrame->loader()->setOpenedByDOM();
+ mainFrame->page()->setOpenedByDOM();
mainFrame->loader()->m_client->dispatchShow();
- mainFrame->loader()->setOpener(frame.get());
+ if (!m_suppressOpenerInNewFrame)
+ mainFrame->loader()->setOpener(frame.get());
mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState);
}
-void FrameLoader::sendRemainingDelegateMessages(unsigned long identifier, const ResourceResponse& response, int length, const ResourceError& error)
-{
- if (!response.isNull())
- dispatchDidReceiveResponse(m_documentLoader.get(), identifier, response);
-
- if (length > 0)
- dispatchDidReceiveContentLength(m_documentLoader.get(), identifier, length);
-
- if (error.isNull())
- dispatchDidFinishLoading(m_documentLoader.get(), identifier);
- else
- m_client->dispatchDidFailLoading(m_documentLoader.get(), identifier, error);
-}
-
void FrameLoader::requestFromDelegate(ResourceRequest& request, unsigned long& identifier, ResourceError& error)
{
ASSERT(!request.isNull());
@@ -4192,11 +3485,11 @@ void FrameLoader::requestFromDelegate(ResourceRequest& request, unsigned long& i
identifier = 0;
if (Page* page = m_frame->page()) {
identifier = page->progress()->createUniqueIdentifier();
- dispatchAssignIdentifierToInitialRequest(identifier, m_documentLoader.get(), request);
+ notifier()->assignIdentifierToInitialRequest(identifier, m_documentLoader.get(), request);
}
ResourceRequest newRequest(request);
- dispatchWillSendRequest(m_documentLoader.get(), identifier, newRequest, ResourceResponse());
+ notifier()->dispatchWillSendRequest(m_documentLoader.get(), identifier, newRequest, ResourceResponse());
if (newRequest.isNull())
error = cancelledError(request);
@@ -4234,7 +3527,7 @@ void FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource)
unsigned long identifier;
ResourceError error;
requestFromDelegate(request, identifier, error);
- sendRemainingDelegateMessages(identifier, resource->response(), resource->encodedSize(), error);
+ notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, resource->response(), resource->encodedSize(), error);
}
void FrameLoader::applyUserAgent(ResourceRequest& request)
@@ -4262,34 +3555,9 @@ bool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, con
return false;
}
-bool FrameLoader::canGoBackOrForward(int distance) const
-{
- if (Page* page = m_frame->page()) {
- if (distance == 0)
- return true;
- if (distance > 0 && distance <= page->backForwardList()->forwardListCount())
- return true;
- if (distance < 0 && -distance <= page->backForwardList()->backListCount())
- return true;
- }
- return false;
-}
-
-int FrameLoader::getHistoryLength()
-{
- if (Page* page = m_frame->page())
- return page->backForwardList()->backListCount() + 1;
- return 0;
-}
-
-void FrameLoader::addHistoryItemForFragmentScroll()
-{
- addBackForwardItemClippedAtTarget(false);
-}
-
bool FrameLoader::loadProvisionalItemFromCachedPage()
{
- RefPtr<CachedPage> cachedPage = pageCache()->get(m_provisionalHistoryItem.get());
+ RefPtr<CachedPage> cachedPage = pageCache()->get(history()->provisionalItem());
if (!cachedPage || !cachedPage->document())
return false;
@@ -4333,119 +3601,21 @@ void FrameLoader::pageHidden()
bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const
{
- if (!m_currentHistoryItem)
+ if (!history()->currentItem())
return false;
- return url == m_currentHistoryItem->url() || url == m_currentHistoryItem->originalURL();
-}
-
-PassRefPtr<HistoryItem> FrameLoader::createHistoryItem(bool useOriginal)
-{
- DocumentLoader* docLoader = documentLoader();
-
- KURL unreachableURL = docLoader ? docLoader->unreachableURL() : KURL();
-
- KURL url;
- KURL originalURL;
-
- if (!unreachableURL.isEmpty()) {
- url = unreachableURL;
- originalURL = unreachableURL;
- } else {
- originalURL = docLoader ? docLoader->originalURL() : KURL();
- if (useOriginal)
- url = originalURL;
- else if (docLoader)
- url = docLoader->requestURL();
- }
-
- LOG(History, "WebCoreHistory: Creating item for %s", url.string().ascii().data());
-
- // Frames that have never successfully loaded any content
- // may have no URL at all. Currently our history code can't
- // deal with such things, so we nip that in the bud here.
- // Later we may want to learn to live with nil for URL.
- // See bug 3368236 and related bugs for more information.
- if (url.isEmpty())
- url = blankURL();
- if (originalURL.isEmpty())
- originalURL = blankURL();
-
- Frame* parentFrame = m_frame->tree()->parent();
- String parent = parentFrame ? parentFrame->tree()->name() : "";
- String title = docLoader ? docLoader->title() : "";
-
- RefPtr<HistoryItem> item = HistoryItem::create(url, m_frame->tree()->name(), parent, title);
- item->setOriginalURLString(originalURL.string());
-
- if (!unreachableURL.isEmpty() || !docLoader || docLoader->response().httpStatusCode() >= 400)
- item->setLastVisitWasFailure(true);
-
- // Save form state if this is a POST
- if (docLoader) {
- if (useOriginal)
- item->setFormInfoFromRequest(docLoader->originalRequest());
- else
- item->setFormInfoFromRequest(docLoader->request());
- }
-
- // Set the item for which we will save document state
- m_previousHistoryItem = m_currentHistoryItem;
- m_currentHistoryItem = item;
-
- return item.release();
+ return url == history()->currentItem()->url() || url == history()->currentItem()->originalURL();
}
-void FrameLoader::addBackForwardItemClippedAtTarget(bool doClip)
+void FrameLoader::checkDidPerformFirstNavigation()
{
- // In the case of saving state about a page with frames, we store a tree of items that mirrors the frame tree.
- // The item that was the target of the user's navigation is designated as the "targetItem".
- // When this function is called with doClip=true we're able to create the whole tree except for the target's children,
- // which will be loaded in the future. That part of the tree will be filled out as the child loads are committed.
-
Page* page = m_frame->page();
if (!page)
return;
- if (documentLoader()->urlForHistory().isEmpty())
- return;
-
- Frame* mainFrame = page->mainFrame();
- ASSERT(mainFrame);
- FrameLoader* frameLoader = mainFrame->loader();
-
- if (!frameLoader->m_didPerformFirstNavigation && page->backForwardList()->entries().size() == 1) {
- frameLoader->m_didPerformFirstNavigation = true;
+ if (!m_didPerformFirstNavigation && page->backForwardList()->entries().size() == 1) {
+ m_didPerformFirstNavigation = true;
m_client->didPerformFirstNavigation();
}
-
- RefPtr<HistoryItem> item = frameLoader->createHistoryItemTree(m_frame, doClip);
- LOG(BackForward, "WebCoreBackForward - Adding backforward item %p for frame %s", item.get(), documentLoader()->url().string().ascii().data());
- page->backForwardList()->addItem(item);
-}
-
-PassRefPtr<HistoryItem> FrameLoader::createHistoryItemTree(Frame* targetFrame, bool clipAtTarget)
-{
- RefPtr<HistoryItem> bfItem = createHistoryItem(m_frame->tree()->parent() ? true : false);
- if (m_previousHistoryItem)
- saveScrollPositionAndViewStateToItem(m_previousHistoryItem.get());
- if (!(clipAtTarget && m_frame == targetFrame)) {
- // save frame state for items that aren't loading (khtml doesn't save those)
- saveDocumentState();
- for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) {
- FrameLoader* childLoader = child->loader();
- bool hasChildLoaded = childLoader->frameHasLoaded();
-
- // If the child is a frame corresponding to an <object> element that never loaded,
- // we don't want to create a history item, because that causes fallback content
- // to be ignored on reload.
-
- if (!(!hasChildLoaded && childLoader->isHostedByObjectElement()))
- bfItem->addChildItem(childLoader->createHistoryItemTree(targetFrame, clipAtTarget));
- }
- }
- if (m_frame == targetFrame)
- bfItem->setIsTargetItem(true);
- return bfItem;
}
Frame* FrameLoader::findFrameForNavigation(const AtomicString& name)
@@ -4456,100 +3626,10 @@ Frame* FrameLoader::findFrameForNavigation(const AtomicString& name)
return frame;
}
-void FrameLoader::saveScrollPositionAndViewStateToItem(HistoryItem* item)
-{
- if (!item || !m_frame->view())
- return;
-
- item->setScrollPoint(m_frame->view()->scrollPosition());
- // FIXME: It would be great to work out a way to put this code in WebCore instead of calling through to the client.
- m_client->saveViewStateToItem(item);
-}
-
-/*
- There is a race condition between the layout and load completion that affects restoring the scroll position.
- We try to restore the scroll position at both the first layout and upon load completion.
-
- 1) If first layout happens before the load completes, we want to restore the scroll position then so that the
- first time we draw the page is already scrolled to the right place, instead of starting at the top and later
- jumping down. It is possible that the old scroll position is past the part of the doc laid out so far, in
- which case the restore silent fails and we will fix it in when we try to restore on doc completion.
- 2) If the layout happens after the load completes, the attempt to restore at load completion time silently
- fails. We then successfully restore it when the layout happens.
-*/
-void FrameLoader::restoreScrollPositionAndViewState()
-{
- if (!m_committedFirstRealDocumentLoad)
- return;
-
- ASSERT(m_currentHistoryItem);
-
- // FIXME: As the ASSERT attests, it seems we should always have a currentItem here.
- // One counterexample is <rdar://problem/4917290>
- // For now, to cover this issue in release builds, there is no technical harm to returning
- // early and from a user standpoint - as in the above radar - the previous page load failed
- // so there *is* no scroll or view state to restore!
- if (!m_currentHistoryItem)
- return;
-
- // FIXME: It would be great to work out a way to put this code in WebCore instead of calling
- // through to the client. It's currently used only for the PDF view on Mac.
- m_client->restoreViewState();
-
- if (FrameView* view = m_frame->view())
- if (!view->wasScrolledByUser())
- view->setScrollPosition(m_currentHistoryItem->scrollPoint());
-}
-
-void FrameLoader::invalidateCurrentItemCachedPage()
-{
- // When we are pre-commit, the currentItem is where the pageCache data resides
- CachedPage* cachedPage = pageCache()->get(m_currentHistoryItem.get());
-
- // FIXME: This is a grotesque hack to fix <rdar://problem/4059059> Crash in RenderFlow::detach
- // Somehow the PageState object is not properly updated, and is holding onto a stale document.
- // Both Xcode and FileMaker see this crash, Safari does not.
-
- ASSERT(!cachedPage || cachedPage->document() == m_frame->document());
- if (cachedPage && cachedPage->document() == m_frame->document()) {
- cachedPage->document()->setInPageCache(false);
- cachedPage->clear();
- }
-
- if (cachedPage)
- pageCache()->remove(m_currentHistoryItem.get());
-}
-
-void FrameLoader::saveDocumentState()
-{
- if (m_creatingInitialEmptyDocument)
- return;
-
- // For a standard page load, we will have a previous item set, which will be used to
- // store the form state. However, in some cases we will have no previous item, and
- // the current item is the right place to save the state. One example is when we
- // detach a bunch of frames because we are navigating from a site with frames to
- // another site. Another is when saving the frame state of a frame that is not the
- // target of the current navigation (if we even decide to save with that granularity).
-
- // Because of previousItem's "masking" of currentItem for this purpose, it's important
- // that previousItem be cleared at the end of a page transition. We leverage the
- // checkLoadComplete recursion to achieve this goal.
-
- HistoryItem* item = m_previousHistoryItem ? m_previousHistoryItem.get() : m_currentHistoryItem.get();
- if (!item)
- return;
-
- Document* document = m_frame->document();
- ASSERT(document);
-
- if (item->isCurrentDocument(document)) {
- LOG(Loading, "WebCoreLoading %s: saving form state to %p", m_frame->tree()->name().string().utf8().data(), item);
- item->setDocumentState(document->formElementsState());
- }
-}
-
// Loads content into this frame, as specified by history item
+// FIXME: This function should really be split into a couple pieces, some of
+// which should be methods of HistoryController and some of which should be
+// methods of FrameLoader.
void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
{
if (!m_frame->page())
@@ -4568,7 +3648,7 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
// check for all that as an additional optimization.
// We also do not do anchor-style navigation if we're posting a form or navigating from
// a page that was resulted from a form post.
- bool shouldScroll = !formData && !(m_currentHistoryItem && m_currentHistoryItem->formData()) && urlsMatchItem(item);
+ bool shouldScroll = !formData && !(history()->currentItem() && history()->currentItem()->formData()) && history()->urlsMatchItem(item);
#if ENABLE(WML)
// All WML decks should go through the real load mechanism, not the scroll-to-anchor code
@@ -4578,12 +3658,12 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
if (shouldScroll) {
// Must do this maintenance here, since we don't go through a real page reload
- saveScrollPositionAndViewStateToItem(m_currentHistoryItem.get());
+ history()->saveScrollPositionAndViewStateToItem(history()->currentItem());
if (FrameView* view = m_frame->view())
view->setWasScrolledByUser(false);
- m_currentHistoryItem = item;
+ history()->setCurrentItem(item);
// FIXME: Form state might need to be saved here too.
@@ -4592,7 +3672,7 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
scrollToAnchor(item->url());
// must do this maintenance here, since we don't go through a real page reload
- restoreScrollPositionAndViewState();
+ history()->restoreScrollPositionAndViewState();
// Fake the URL change by updating the data source's request. This will no longer
// be necessary if we do the better fix described above.
@@ -4604,7 +3684,7 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
m_client->didFinishLoad();
} else {
// Remember this item so we can traverse any child items as child frames load
- m_provisionalHistoryItem = item;
+ history()->setProvisionalItem(item);
bool inPageCache = false;
@@ -4621,7 +3701,7 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0);
inPageCache = true;
} else {
- LOG(PageCache, "Not restoring page for %s from back/forward cache because cache entry has expired", m_provisionalHistoryItem->url().string().ascii().data());
+ LOG(PageCache, "Not restoring page for %s from back/forward cache because cache entry has expired", history()->provisionalItem()->url().string().ascii().data());
pageCache()->remove(item);
}
}
@@ -4696,322 +3776,6 @@ void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
}
}
-// Walk the frame tree and ensure that the URLs match the URLs in the item.
-bool FrameLoader::urlsMatchItem(HistoryItem* item) const
-{
- const KURL& currentURL = documentLoader()->url();
- if (!equalIgnoringFragmentIdentifier(currentURL, item->url()))
- return false;
-
- const HistoryItemVector& childItems = item->children();
-
- unsigned size = childItems.size();
- for (unsigned i = 0; i < size; ++i) {
- Frame* childFrame = m_frame->tree()->child(childItems[i]->target());
- if (childFrame && !childFrame->loader()->urlsMatchItem(childItems[i].get()))
- return false;
- }
-
- return true;
-}
-
-// Main funnel for navigating to a previous location (back/forward, non-search snap-back)
-// This includes recursion to handle loading into framesets properly
-void FrameLoader::goToItem(HistoryItem* targetItem, FrameLoadType type)
-{
- ASSERT(!m_frame->tree()->parent());
-
- // shouldGoToHistoryItem is a private delegate method. This is needed to fix:
- // <rdar://problem/3951283> can view pages from the back/forward cache that should be disallowed by Parental Controls
- // Ultimately, history item navigations should go through the policy delegate. That's covered in:
- // <rdar://problem/3979539> back/forward cache navigations should consult policy delegate
- Page* page = m_frame->page();
- if (!page)
- return;
- if (!m_client->shouldGoToHistoryItem(targetItem))
- return;
-
- // Set the BF cursor before commit, which lets the user quickly click back/forward again.
- // - plus, it only makes sense for the top level of the operation through the frametree,
- // as opposed to happening for some/one of the page commits that might happen soon
- BackForwardList* bfList = page->backForwardList();
- HistoryItem* currentItem = bfList->currentItem();
- bfList->goToItem(targetItem);
- Settings* settings = m_frame->settings();
- page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : targetItem);
- recursiveGoToItem(targetItem, currentItem, type);
-}
-
-// The general idea here is to traverse the frame tree and the item tree in parallel,
-// tracking whether each frame already has the content the item requests. If there is
-// a match (by URL), we just restore scroll position and recurse. Otherwise we must
-// reload that frame, and all its kids.
-void FrameLoader::recursiveGoToItem(HistoryItem* item, HistoryItem* fromItem, FrameLoadType type)
-{
- ASSERT(item);
- ASSERT(fromItem);
-
- KURL itemURL = item->url();
- KURL currentURL;
- if (documentLoader())
- currentURL = documentLoader()->url();
-
- // Always reload the target frame of the item we're going to. This ensures that we will
- // do -some- load for the transition, which means a proper notification will be posted
- // to the app.
- // The exact URL has to match, including fragment. We want to go through the _load
- // method, even if to do a within-page navigation.
- // The current frame tree and the frame tree snapshot in the item have to match.
- if (!item->isTargetItem() &&
- itemURL == currentURL &&
- ((m_frame->tree()->name().isEmpty() && item->target().isEmpty()) || m_frame->tree()->name() == item->target()) &&
- childFramesMatchItem(item))
- {
- // This content is good, so leave it alone and look for children that need reloading
- // Save form state (works from currentItem, since prevItem is nil)
- ASSERT(!m_previousHistoryItem);
- saveDocumentState();
- saveScrollPositionAndViewStateToItem(m_currentHistoryItem.get());
-
- if (FrameView* view = m_frame->view())
- view->setWasScrolledByUser(false);
-
- m_currentHistoryItem = item;
-
- // Restore form state (works from currentItem)
- restoreDocumentState();
-
- // Restore the scroll position (we choose to do this rather than going back to the anchor point)
- restoreScrollPositionAndViewState();
-
- const HistoryItemVector& childItems = item->children();
-
- int size = childItems.size();
- for (int i = 0; i < size; ++i) {
- String childFrameName = childItems[i]->target();
- HistoryItem* fromChildItem = fromItem->childItemWithTarget(childFrameName);
- ASSERT(fromChildItem || fromItem->isTargetItem());
- Frame* childFrame = m_frame->tree()->child(childFrameName);
- ASSERT(childFrame);
- childFrame->loader()->recursiveGoToItem(childItems[i].get(), fromChildItem, type);
- }
- } else {
- loadItem(item, type);
- }
-}
-
-// helper method that determines whether the subframes described by the item's subitems
-// match our own current frameset
-bool FrameLoader::childFramesMatchItem(HistoryItem* item) const
-{
- const HistoryItemVector& childItems = item->children();
- if (childItems.size() != m_frame->tree()->childCount())
- return false;
-
- unsigned size = childItems.size();
- for (unsigned i = 0; i < size; ++i) {
- if (!m_frame->tree()->child(childItems[i]->target()))
- return false;
- }
-
- // Found matches for all item targets
- return true;
-}
-
-// There are 3 things you might think of as "history", all of which are handled by these functions.
-//
-// 1) Back/forward: The m_currentHistoryItem is part of this mechanism.
-// 2) Global history: Handled by the client.
-// 3) Visited links: Handled by the PageGroup.
-
-void FrameLoader::updateHistoryForStandardLoad()
-{
- LOG(History, "WebCoreHistory: Updating History for Standard Load in frame %s", documentLoader()->url().string().ascii().data());
-
- Settings* settings = m_frame->settings();
- bool needPrivacy = !settings || settings->privateBrowsingEnabled();
- const KURL& historyURL = documentLoader()->urlForHistory();
-
- if (!documentLoader()->isClientRedirect()) {
- if (!historyURL.isEmpty()) {
- addBackForwardItemClippedAtTarget(true);
- if (!needPrivacy) {
- m_client->updateGlobalHistory();
- m_documentLoader->setDidCreateGlobalHistoryEntry(true);
- if (m_documentLoader->unreachableURL().isEmpty())
- m_client->updateGlobalHistoryRedirectLinks();
- }
- if (Page* page = m_frame->page())
- page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
- }
- } else if (documentLoader()->unreachableURL().isEmpty() && m_currentHistoryItem) {
- m_currentHistoryItem->setURL(documentLoader()->url());
- m_currentHistoryItem->setFormInfoFromRequest(documentLoader()->request());
- }
-
- if (!historyURL.isEmpty() && !needPrivacy) {
- if (Page* page = m_frame->page())
- page->group().addVisitedLink(historyURL);
-
- if (!m_documentLoader->didCreateGlobalHistoryEntry() && documentLoader()->unreachableURL().isEmpty() && !url().isEmpty())
- m_client->updateGlobalHistoryRedirectLinks();
- }
-}
-
-void FrameLoader::updateHistoryForClientRedirect()
-{
-#if !LOG_DISABLED
- if (documentLoader())
- LOG(History, "WebCoreHistory: Updating History for client redirect in frame %s", documentLoader()->title().utf8().data());
-#endif
-
- // Clear out form data so we don't try to restore it into the incoming page. Must happen after
- // webcore has closed the URL and saved away the form state.
- if (m_currentHistoryItem) {
- m_currentHistoryItem->clearDocumentState();
- m_currentHistoryItem->clearScrollPoint();
- }
-
- Settings* settings = m_frame->settings();
- bool needPrivacy = !settings || settings->privateBrowsingEnabled();
- const KURL& historyURL = documentLoader()->urlForHistory();
-
- if (!historyURL.isEmpty() && !needPrivacy) {
- if (Page* page = m_frame->page())
- page->group().addVisitedLink(historyURL);
- }
-}
-
-void FrameLoader::updateHistoryForBackForwardNavigation()
-{
-#if !LOG_DISABLED
- if (documentLoader())
- LOG(History, "WebCoreHistory: Updating History for back/forward navigation in frame %s", documentLoader()->title().utf8().data());
-#endif
-
- // Must grab the current scroll position before disturbing it
- saveScrollPositionAndViewStateToItem(m_previousHistoryItem.get());
-}
-
-void FrameLoader::updateHistoryForReload()
-{
-#if !LOG_DISABLED
- if (documentLoader())
- LOG(History, "WebCoreHistory: Updating History for reload in frame %s", documentLoader()->title().utf8().data());
-#endif
-
- if (m_currentHistoryItem) {
- pageCache()->remove(m_currentHistoryItem.get());
-
- if (loadType() == FrameLoadTypeReload || loadType() == FrameLoadTypeReloadFromOrigin)
- saveScrollPositionAndViewStateToItem(m_currentHistoryItem.get());
-
- // Sometimes loading a page again leads to a different result because of cookies. Bugzilla 4072
- if (documentLoader()->unreachableURL().isEmpty())
- m_currentHistoryItem->setURL(documentLoader()->requestURL());
- }
-}
-
-void FrameLoader::updateHistoryForRedirectWithLockedBackForwardList()
-{
-#if !LOG_DISABLED
- if (documentLoader())
- LOG(History, "WebCoreHistory: Updating History for redirect load in frame %s", documentLoader()->title().utf8().data());
-#endif
-
- Settings* settings = m_frame->settings();
- bool needPrivacy = !settings || settings->privateBrowsingEnabled();
- const KURL& historyURL = documentLoader()->urlForHistory();
-
- if (documentLoader()->isClientRedirect()) {
- if (!m_currentHistoryItem && !m_frame->tree()->parent()) {
- if (!historyURL.isEmpty()) {
- addBackForwardItemClippedAtTarget(true);
- if (!needPrivacy) {
- m_client->updateGlobalHistory();
- m_documentLoader->setDidCreateGlobalHistoryEntry(true);
- if (m_documentLoader->unreachableURL().isEmpty())
- m_client->updateGlobalHistoryRedirectLinks();
- }
- if (Page* page = m_frame->page())
- page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
- }
- }
- if (m_currentHistoryItem) {
- m_currentHistoryItem->setURL(documentLoader()->url());
- m_currentHistoryItem->setFormInfoFromRequest(documentLoader()->request());
- }
- } else {
- Frame* parentFrame = m_frame->tree()->parent();
- if (parentFrame && parentFrame->loader()->m_currentHistoryItem)
- parentFrame->loader()->m_currentHistoryItem->setChildItem(createHistoryItem(true));
- }
-
- if (!historyURL.isEmpty() && !needPrivacy) {
- if (Page* page = m_frame->page())
- page->group().addVisitedLink(historyURL);
-
- if (!m_documentLoader->didCreateGlobalHistoryEntry() && documentLoader()->unreachableURL().isEmpty() && !url().isEmpty())
- m_client->updateGlobalHistoryRedirectLinks();
- }
-}
-
-void FrameLoader::updateHistoryForCommit()
-{
-#if !LOG_DISABLED
- if (documentLoader())
- LOG(History, "WebCoreHistory: Updating History for commit in frame %s", documentLoader()->title().utf8().data());
-#endif
- FrameLoadType type = loadType();
- if (isBackForwardLoadType(type) ||
- ((type == FrameLoadTypeReload || type == FrameLoadTypeReloadFromOrigin) && !provisionalDocumentLoader()->unreachableURL().isEmpty())) {
- // Once committed, we want to use current item for saving DocState, and
- // the provisional item for restoring state.
- // Note previousItem must be set before we close the URL, which will
- // happen when the data source is made non-provisional below
- m_previousHistoryItem = m_currentHistoryItem;
- ASSERT(m_provisionalHistoryItem);
- m_currentHistoryItem = m_provisionalHistoryItem;
- m_provisionalHistoryItem = 0;
- }
-}
-
-void FrameLoader::updateHistoryForAnchorScroll()
-{
- if (m_URL.isEmpty())
- return;
-
- Settings* settings = m_frame->settings();
- if (!settings || settings->privateBrowsingEnabled())
- return;
-
- Page* page = m_frame->page();
- if (!page)
- return;
-
- page->group().addVisitedLink(m_URL);
-}
-
-// Walk the frame tree, telling all frames to save their form state into their current
-// history item.
-void FrameLoader::saveDocumentAndScrollState()
-{
- for (Frame* frame = m_frame; frame; frame = frame->tree()->traverseNext(m_frame)) {
- frame->loader()->saveDocumentState();
- frame->loader()->saveScrollPositionAndViewStateToItem(frame->loader()->currentHistoryItem());
- }
-}
-
-HistoryItem* FrameLoader::currentHistoryItem()
-{
- return m_currentHistoryItem.get();
-}
-
-void FrameLoader::setCurrentHistoryItem(PassRefPtr<HistoryItem> item)
-{
- m_currentHistoryItem = item;
-}
-
void FrameLoader::setMainDocumentError(DocumentLoader* loader, const ResourceError& error)
{
m_client->setMainDocumentError(loader, error);
@@ -5053,116 +3817,11 @@ ResourceError FrameLoader::fileDoesNotExistError(const ResourceResponse& respons
return m_client->fileDoesNotExistError(response);
}
-void FrameLoader::didFinishLoad(ResourceLoader* loader)
-{
- if (Page* page = m_frame->page())
- page->progress()->completeProgress(loader->identifier());
- dispatchDidFinishLoading(loader->documentLoader(), loader->identifier());
-}
-
bool FrameLoader::shouldUseCredentialStorage(ResourceLoader* loader)
{
return m_client->shouldUseCredentialStorage(loader->documentLoader(), loader->identifier());
}
-void FrameLoader::didReceiveAuthenticationChallenge(ResourceLoader* loader, const AuthenticationChallenge& currentWebChallenge)
-{
- m_client->dispatchDidReceiveAuthenticationChallenge(loader->documentLoader(), loader->identifier(), currentWebChallenge);
-}
-
-void FrameLoader::didCancelAuthenticationChallenge(ResourceLoader* loader, const AuthenticationChallenge& currentWebChallenge)
-{
- m_client->dispatchDidCancelAuthenticationChallenge(loader->documentLoader(), loader->identifier(), currentWebChallenge);
-}
-
-PolicyCheck::PolicyCheck()
- : m_navigationFunction(0)
- , m_newWindowFunction(0)
- , m_contentFunction(0)
-{
-}
-
-void PolicyCheck::clear()
-{
- clearRequest();
- m_navigationFunction = 0;
- m_newWindowFunction = 0;
- m_contentFunction = 0;
-}
-
-void PolicyCheck::set(const ResourceRequest& request, PassRefPtr<FormState> formState,
- NavigationPolicyDecisionFunction function, void* argument)
-{
- m_request = request;
- m_formState = formState;
- m_frameName = String();
-
- m_navigationFunction = function;
- m_newWindowFunction = 0;
- m_contentFunction = 0;
- m_argument = argument;
-}
-
-void PolicyCheck::set(const ResourceRequest& request, PassRefPtr<FormState> formState,
- const String& frameName, NewWindowPolicyDecisionFunction function, void* argument)
-{
- m_request = request;
- m_formState = formState;
- m_frameName = frameName;
-
- m_navigationFunction = 0;
- m_newWindowFunction = function;
- m_contentFunction = 0;
- m_argument = argument;
-}
-
-void PolicyCheck::set(ContentPolicyDecisionFunction function, void* argument)
-{
- m_request = ResourceRequest();
- m_formState = 0;
- m_frameName = String();
-
- m_navigationFunction = 0;
- m_newWindowFunction = 0;
- m_contentFunction = function;
- m_argument = argument;
-}
-
-void PolicyCheck::call(bool shouldContinue)
-{
- if (m_navigationFunction)
- m_navigationFunction(m_argument, m_request, m_formState.get(), shouldContinue);
- if (m_newWindowFunction)
- m_newWindowFunction(m_argument, m_request, m_formState.get(), m_frameName, shouldContinue);
- ASSERT(!m_contentFunction);
-}
-
-void PolicyCheck::call(PolicyAction action)
-{
- ASSERT(!m_navigationFunction);
- ASSERT(!m_newWindowFunction);
- ASSERT(m_contentFunction);
- m_contentFunction(m_argument, action);
-}
-
-void PolicyCheck::clearRequest()
-{
- m_request = ResourceRequest();
- m_formState = 0;
- m_frameName = String();
-}
-
-void PolicyCheck::cancel()
-{
- clearRequest();
- if (m_navigationFunction)
- m_navigationFunction(m_argument, m_request, m_formState.get(), false);
- if (m_newWindowFunction)
- m_newWindowFunction(m_argument, m_request, m_formState.get(), m_frameName, false);
- if (m_contentFunction)
- m_contentFunction(m_argument, PolicyIgnore);
-}
-
void FrameLoader::setTitle(const String& title)
{
documentLoader()->setTitle(title);
@@ -5219,7 +3878,7 @@ PassRefPtr<Widget> FrameLoader::createJavaAppletWidget(const IntSize& size, HTML
if (!codeBaseURLString.isEmpty()) {
KURL codeBaseURL = completeURL(codeBaseURLString);
- if (!canLoad(codeBaseURL, String(), element->document())) {
+ if (!SecurityOrigin::canLoad(codeBaseURL, String(), element->document())) {
FrameLoader::reportLocalLoadFailed(m_frame, codeBaseURL.string());
return 0;
}
@@ -5243,8 +3902,7 @@ void FrameLoader::didChangeTitle(DocumentLoader* loader)
if (loader == m_documentLoader) {
// Must update the entries in the back-forward list too.
- if (m_currentHistoryItem)
- m_currentHistoryItem->setTitle(loader->title());
+ history()->setCurrentItemTitle(loader->title());
// This must go through the WebFrame because it has the right notion of the current b/f item.
m_client->setTitle(loader->title(), loader->urlForHistory());
m_client->setMainFrameDocumentReady(true); // update observers with new DOMDocument
@@ -5269,63 +3927,6 @@ void FrameLoader::dispatchDidCommitLoad()
#endif
}
-void FrameLoader::dispatchAssignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request)
-{
- m_client->assignIdentifierToInitialRequest(identifier, loader, request);
-
-#if ENABLE(INSPECTOR)
- if (Page* page = m_frame->page())
- page->inspectorController()->identifierForInitialRequest(identifier, loader, request);
-#endif
-}
-
-void FrameLoader::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse)
-{
- StringImpl* oldRequestURL = request.url().string().impl();
- m_documentLoader->didTellClientAboutLoad(request.url());
-
- m_client->dispatchWillSendRequest(loader, identifier, request, redirectResponse);
-
- // If the URL changed, then we want to put that new URL in the "did tell client" set too.
- if (!request.isNull() && oldRequestURL != request.url().string().impl())
- m_documentLoader->didTellClientAboutLoad(request.url());
-
-#if ENABLE(INSPECTOR)
- if (Page* page = m_frame->page())
- page->inspectorController()->willSendRequest(loader, identifier, request, redirectResponse);
-#endif
-}
-
-void FrameLoader::dispatchDidReceiveResponse(DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r)
-{
- m_client->dispatchDidReceiveResponse(loader, identifier, r);
-
-#if ENABLE(INSPECTOR)
- if (Page* page = m_frame->page())
- page->inspectorController()->didReceiveResponse(loader, identifier, r);
-#endif
-}
-
-void FrameLoader::dispatchDidReceiveContentLength(DocumentLoader* loader, unsigned long identifier, int length)
-{
- m_client->dispatchDidReceiveContentLength(loader, identifier, length);
-
-#if ENABLE(INSPECTOR)
- if (Page* page = m_frame->page())
- page->inspectorController()->didReceiveContentLength(loader, identifier, length);
-#endif
-}
-
-void FrameLoader::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier)
-{
- m_client->dispatchDidFinishLoading(loader, identifier);
-
-#if ENABLE(INSPECTOR)
- if (Page* page = m_frame->page())
- page->inspectorController()->didFinishLoading(loader, identifier);
-#endif
-}
-
void FrameLoader::tellClientAboutPastMemoryCacheLoads()
{
ASSERT(m_frame->page());
diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoader.h b/src/3rdparty/webkit/WebCore/loader/FrameLoader.h
index 4b4959b..bf0eebc 100644
--- a/src/3rdparty/webkit/WebCore/loader/FrameLoader.h
+++ b/src/3rdparty/webkit/WebCore/loader/FrameLoader.h
@@ -32,6 +32,11 @@
#include "CachePolicy.h"
#include "FrameLoaderTypes.h"
+#include "HistoryController.h"
+#include "PolicyCallback.h"
+#include "PolicyChecker.h"
+#include "RedirectScheduler.h"
+#include "ResourceLoadNotifier.h"
#include "ResourceRequest.h"
#include "ThreadableLoader.h"
#include "Timer.h"
@@ -39,603 +44,465 @@
namespace WebCore {
- class Archive;
- class AuthenticationChallenge;
- class CachedFrameBase;
- class CachedPage;
- class CachedResource;
- class Document;
- class DocumentLoader;
- class Event;
- class FormData;
- class FormState;
- class Frame;
- class FrameLoaderClient;
- class HistoryItem;
- class HTMLAppletElement;
- class HTMLFormElement;
- class HTMLFrameOwnerElement;
- class IconLoader;
- class IntSize;
- class NavigationAction;
- class RenderPart;
- class ResourceError;
- class ResourceLoader;
- class ResourceResponse;
- class ScriptSourceCode;
- class ScriptString;
- class ScriptValue;
- class SecurityOrigin;
- class SharedBuffer;
- class SubstituteData;
- class TextResourceDecoder;
- class Widget;
-
- struct FrameLoadRequest;
- struct ScheduledRedirection;
- struct WindowFeatures;
-
- bool isBackForwardLoadType(FrameLoadType);
-
- typedef void (*NavigationPolicyDecisionFunction)(void* argument,
- const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
- typedef void (*NewWindowPolicyDecisionFunction)(void* argument,
- const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
- typedef void (*ContentPolicyDecisionFunction)(void* argument, PolicyAction);
-
- class PolicyCheck {
- public:
- PolicyCheck();
-
- void clear();
- void set(const ResourceRequest&, PassRefPtr<FormState>,
- NavigationPolicyDecisionFunction, void* argument);
- void set(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName,
- NewWindowPolicyDecisionFunction, void* argument);
- void set(ContentPolicyDecisionFunction, void* argument);
-
- const ResourceRequest& request() const { return m_request; }
- void clearRequest();
-
- void call(bool shouldContinue);
- void call(PolicyAction);
- void cancel();
-
- private:
- ResourceRequest m_request;
- RefPtr<FormState> m_formState;
- String m_frameName;
-
- NavigationPolicyDecisionFunction m_navigationFunction;
- NewWindowPolicyDecisionFunction m_newWindowFunction;
- ContentPolicyDecisionFunction m_contentFunction;
- void* m_argument;
- };
-
- class FrameLoader : public Noncopyable {
- public:
- FrameLoader(Frame*, FrameLoaderClient*);
- ~FrameLoader();
-
- void init();
-
- Frame* frame() const { return m_frame; }
-
- // FIXME: This is not cool, people. There are too many different functions that all start loads.
- // We should aim to consolidate these into a smaller set of functions, and try to reuse more of
- // the logic by extracting common code paths.
-
- void prepareForLoadStart();
- void setupForReplace();
- void setupForReplaceByMIMEType(const String& newMIMEType);
-
- void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
-
- void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList, // Called by submitForm, calls loadPostRequest and loadURL.
- PassRefPtr<Event>, PassRefPtr<FormState>);
-
- void load(const ResourceRequest&, bool lockHistory); // Called by WebFrame, calls load(ResourceRequest, SubstituteData).
- void load(const ResourceRequest&, const SubstituteData&, bool lockHistory); // Called both by WebFrame and internally, calls load(DocumentLoader*).
- void load(const ResourceRequest&, const String& frameName, bool lockHistory); // Called by WebPluginController.
-
- void loadArchive(PassRefPtr<Archive>);
-
- // Returns true for any non-local URL. If document parameter is supplied, its local load policy dictates,
- // otherwise if referrer is non-empty and represents a local file, then the local load is allowed.
- static bool canLoad(const KURL&, const String& referrer, const Document*);
- static bool canLoad(const KURL&, const String& referrer, const SecurityOrigin* = 0);
- static void reportLocalLoadFailed(Frame*, const String& url);
-
- static bool shouldHideReferrer(const KURL&, const String& referrer);
-
- // Called by createWindow in JSDOMWindowBase.cpp, e.g. to fulfill a modal dialog creation
- Frame* createWindow(FrameLoader* frameLoaderForFrameLookup, const FrameLoadRequest&, const WindowFeatures&, bool& created);
-
- unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
-
- bool canHandleRequest(const ResourceRequest&);
-
- // Also not cool.
- void stopAllLoaders(DatabasePolicy = DatabasePolicyStop);
- void stopForUserCancel(bool deferCheckLoadComplete = false);
-
- bool isLoadingMainResource() const { return m_isLoadingMainResource; }
- bool isLoading() const;
- bool frameHasLoaded() const;
-
- int numPendingOrLoadingRequests(bool recurse) const;
- String referrer() const;
- String outgoingReferrer() const;
- String outgoingOrigin() const;
-
- DocumentLoader* activeDocumentLoader() const;
- DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
- DocumentLoader* policyDocumentLoader() const { return m_policyDocumentLoader.get(); }
- DocumentLoader* provisionalDocumentLoader() const { return m_provisionalDocumentLoader.get(); }
- FrameState state() const { return m_state; }
- static double timeOfLastCompletedLoad();
-
- bool shouldUseCredentialStorage(ResourceLoader*);
- void didReceiveAuthenticationChallenge(ResourceLoader*, const AuthenticationChallenge&);
- void didCancelAuthenticationChallenge(ResourceLoader*, const AuthenticationChallenge&);
-
- void assignIdentifierToInitialRequest(unsigned long identifier, const ResourceRequest&);
- void willSendRequest(ResourceLoader*, ResourceRequest&, const ResourceResponse& redirectResponse);
- void didReceiveResponse(ResourceLoader*, const ResourceResponse&);
- void didReceiveData(ResourceLoader*, const char*, int, int lengthReceived);
- void didFinishLoad(ResourceLoader*);
- void didFailToLoad(ResourceLoader*, const ResourceError&);
- void didLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString);
- const ResourceRequest& originalRequest() const;
- const ResourceRequest& initialRequest() const;
- void receivedMainResourceError(const ResourceError&, bool isComplete);
- void receivedData(const char*, int);
-
- void handleFallbackContent();
- bool isStopping() const;
+class Archive;
+class AuthenticationChallenge;
+class CachedFrameBase;
+class CachedPage;
+class CachedResource;
+class Document;
+class DocumentLoader;
+class Event;
+class FormData;
+class FormState;
+class Frame;
+class FrameLoaderClient;
+class HistoryItem;
+class HTMLAppletElement;
+class HTMLFormElement;
+class HTMLFrameOwnerElement;
+class IconLoader;
+class IntSize;
+class NavigationAction;
+class RenderPart;
+class ResourceError;
+class ResourceLoader;
+class ResourceResponse;
+class ScriptSourceCode;
+class ScriptString;
+class ScriptValue;
+class SecurityOrigin;
+class SharedBuffer;
+class SubstituteData;
+class TextResourceDecoder;
+class Widget;
+
+struct FrameLoadRequest;
+struct WindowFeatures;
+
+bool isBackForwardLoadType(FrameLoadType);
+
+class FrameLoader : public Noncopyable {
+public:
+ FrameLoader(Frame*, FrameLoaderClient*);
+ ~FrameLoader();
+
+ void init();
+
+ Frame* frame() const { return m_frame; }
+
+ PolicyChecker* policyChecker() const { return &m_policyChecker; }
+ HistoryController* history() const { return &m_history; }
+ ResourceLoadNotifier* notifier() const { return &m_notifer; }
+
+ // FIXME: This is not cool, people. There are too many different functions that all start loads.
+ // We should aim to consolidate these into a smaller set of functions, and try to reuse more of
+ // the logic by extracting common code paths.
+
+ void prepareForLoadStart();
+ void setupForReplace();
+ void setupForReplaceByMIMEType(const String& newMIMEType);
+
+ void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
+
+ void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList, // Called by submitForm, calls loadPostRequest and loadURL.
+ PassRefPtr<Event>, PassRefPtr<FormState>, ReferrerPolicy);
+
+ void load(const ResourceRequest&, bool lockHistory); // Called by WebFrame, calls load(ResourceRequest, SubstituteData).
+ void load(const ResourceRequest&, const SubstituteData&, bool lockHistory); // Called both by WebFrame and internally, calls load(DocumentLoader*).
+ void load(const ResourceRequest&, const String& frameName, bool lockHistory); // Called by WebPluginController.
+
+ void loadArchive(PassRefPtr<Archive>);
- void finishedLoading();
+ static void reportLocalLoadFailed(Frame*, const String& url);
- ResourceError cancelledError(const ResourceRequest&) const;
- ResourceError fileDoesNotExistError(const ResourceResponse&) const;
- ResourceError blockedError(const ResourceRequest&) const;
- ResourceError cannotShowURLError(const ResourceRequest&) const;
+ // Called by createWindow in JSDOMWindowBase.cpp, e.g. to fulfill a modal dialog creation
+ Frame* createWindow(FrameLoader* frameLoaderForFrameLookup, const FrameLoadRequest&, const WindowFeatures&, bool& created);
- void cannotShowMIMEType(const ResourceResponse&);
- ResourceError interruptionForPolicyChangeError(const ResourceRequest&);
+ unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
- bool isHostedByObjectElement() const;
- bool isLoadingMainFrame() const;
- bool canShowMIMEType(const String& MIMEType) const;
- bool representationExistsForURLScheme(const String& URLScheme);
- String generatedMIMETypeForURLScheme(const String& URLScheme);
+ bool canHandleRequest(const ResourceRequest&);
- void checkNavigationPolicy(const ResourceRequest&, NavigationPolicyDecisionFunction function, void* argument);
- void checkContentPolicy(const String& MIMEType, ContentPolicyDecisionFunction, void* argument);
- void cancelContentPolicyCheck();
+ // Also not cool.
+ void stopAllLoaders(DatabasePolicy = DatabasePolicyStop);
+ void stopForUserCancel(bool deferCheckLoadComplete = false);
- void reload(bool endToEndReload = false);
- void reloadWithOverrideEncoding(const String& overrideEncoding);
+ bool isLoadingMainResource() const { return m_isLoadingMainResource; }
+ bool isLoading() const;
+ bool frameHasLoaded() const;
- void didReceiveServerRedirectForProvisionalLoadForFrame();
- void finishedLoadingDocument(DocumentLoader*);
- void committedLoad(DocumentLoader*, const char*, int);
- bool isReplacing() const;
- void setReplacing();
- void revertToProvisional(DocumentLoader*);
- void setMainDocumentError(DocumentLoader*, const ResourceError&);
- void mainReceivedCompleteError(DocumentLoader*, const ResourceError&);
- bool subframeIsLoading() const;
- void willChangeTitle(DocumentLoader*);
- void didChangeTitle(DocumentLoader*);
+ int numPendingOrLoadingRequests(bool recurse) const;
+ String referrer() const;
+ String outgoingReferrer() const;
+ String outgoingOrigin() const;
- FrameLoadType loadType() const;
- CachePolicy subresourceCachePolicy() const;
+ DocumentLoader* activeDocumentLoader() const;
+ DocumentLoader* documentLoader() const { return m_documentLoader.get(); }
+ DocumentLoader* policyDocumentLoader() const { return m_policyDocumentLoader.get(); }
+ DocumentLoader* provisionalDocumentLoader() const { return m_provisionalDocumentLoader.get(); }
+ FrameState state() const { return m_state; }
+ static double timeOfLastCompletedLoad();
- void didFirstLayout();
- bool firstLayoutDone() const;
+ bool shouldUseCredentialStorage(ResourceLoader*);
+ const ResourceRequest& originalRequest() const;
+ const ResourceRequest& initialRequest() const;
+ void receivedMainResourceError(const ResourceError&, bool isComplete);
+ void receivedData(const char*, int);
- void didFirstVisuallyNonEmptyLayout();
+ bool willLoadMediaElementURL(KURL&);
- void loadedResourceFromMemoryCache(const CachedResource*);
- void tellClientAboutPastMemoryCacheLoads();
+ void handleFallbackContent();
+ bool isStopping() const;
- void checkLoadComplete();
- void detachFromParent();
- void detachViewsAndDocumentLoader();
+ void finishedLoading();
- void addExtraFieldsToSubresourceRequest(ResourceRequest&);
- void addExtraFieldsToMainResourceRequest(ResourceRequest&);
-
- static void addHTTPOriginIfNeeded(ResourceRequest&, String origin);
+ ResourceError cancelledError(const ResourceRequest&) const;
+ ResourceError fileDoesNotExistError(const ResourceResponse&) const;
+ ResourceError blockedError(const ResourceRequest&) const;
+ ResourceError cannotShowURLError(const ResourceRequest&) const;
+ ResourceError interruptionForPolicyChangeError(const ResourceRequest&);
- FrameLoaderClient* client() const { return m_client; }
+ bool isHostedByObjectElement() const;
+ bool isLoadingMainFrame() const;
+ bool canShowMIMEType(const String& MIMEType) const;
+ bool representationExistsForURLScheme(const String& URLScheme);
+ String generatedMIMETypeForURLScheme(const String& URLScheme);
- void setDefersLoading(bool);
+ void reload(bool endToEndReload = false);
+ void reloadWithOverrideEncoding(const String& overrideEncoding);
- void changeLocation(const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool userGesture = false, bool refresh = false);
- void urlSelected(const ResourceRequest&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, bool userGesture);
- bool requestFrame(HTMLFrameOwnerElement*, const String& url, const AtomicString& frameName);
+ void didReceiveServerRedirectForProvisionalLoadForFrame();
+ void finishedLoadingDocument(DocumentLoader*);
+ void committedLoad(DocumentLoader*, const char*, int);
+ bool isReplacing() const;
+ void setReplacing();
+ void revertToProvisional(DocumentLoader*);
+ void setMainDocumentError(DocumentLoader*, const ResourceError&);
+ void mainReceivedCompleteError(DocumentLoader*, const ResourceError&);
+ bool subframeIsLoading() const;
+ void willChangeTitle(DocumentLoader*);
+ void didChangeTitle(DocumentLoader*);
- void submitForm(const char* action, const String& url,
- PassRefPtr<FormData>, const String& target, const String& contentType, const String& boundary,
- bool lockHistory, PassRefPtr<Event>, PassRefPtr<FormState>);
+ FrameLoadType loadType() const;
+ CachePolicy subresourceCachePolicy() const;
- void stop();
- void stopLoading(UnloadEventPolicy, DatabasePolicy = DatabasePolicyStop);
- bool closeURL();
+ void didFirstLayout();
+ bool firstLayoutDone() const;
- void didExplicitOpen();
+ void didFirstVisuallyNonEmptyLayout();
- KURL iconURL();
- void commitIconURLToIconDatabase(const KURL&);
+ void loadedResourceFromMemoryCache(const CachedResource*);
+ void tellClientAboutPastMemoryCacheLoads();
- KURL baseURL() const;
+ void checkLoadComplete();
+ void detachFromParent();
+ void detachViewsAndDocumentLoader();
- bool isScheduledLocationChangePending() const { return m_scheduledRedirection && isLocationChange(*m_scheduledRedirection); }
- void scheduleHTTPRedirection(double delay, const String& url);
- void scheduleLocationChange(const String& url, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool userGesture = false);
- void scheduleRefresh(bool userGesture = false);
- void scheduleHistoryNavigation(int steps);
+ void addExtraFieldsToSubresourceRequest(ResourceRequest&);
+ void addExtraFieldsToMainResourceRequest(ResourceRequest&);
+
+ static void addHTTPOriginIfNeeded(ResourceRequest&, String origin);
- bool canGoBackOrForward(int distance) const;
- void goBackOrForward(int distance);
- int getHistoryLength();
+ FrameLoaderClient* client() const { return m_client; }
- void begin();
- void begin(const KURL&, bool dispatchWindowObjectAvailable = true, SecurityOrigin* forcedSecurityOrigin = 0);
+ void setDefersLoading(bool);
- void write(const char* string, int length = -1, bool flush = false);
- void write(const String&);
- void end();
- void endIfNotLoadingMainResource();
+ void changeLocation(const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool userGesture = false, bool refresh = false);
+ void urlSelected(const ResourceRequest&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, bool userGesture, ReferrerPolicy);
+ bool requestFrame(HTMLFrameOwnerElement*, const String& url, const AtomicString& frameName);
- void setEncoding(const String& encoding, bool userChosen);
- String encoding() const;
+ void submitForm(const char* action, const String& url,
+ PassRefPtr<FormData>, const String& target, const String& contentType, const String& boundary,
+ bool lockHistory, PassRefPtr<Event>, PassRefPtr<FormState>);
- ScriptValue executeScript(const ScriptSourceCode&);
- ScriptValue executeScript(const String& script, bool forceUserGesture = false);
+ void stop();
+ void stopLoading(UnloadEventPolicy, DatabasePolicy = DatabasePolicyStop);
+ bool closeURL();
- void gotoAnchor();
+ void didExplicitOpen();
- void tokenizerProcessedData();
+ KURL iconURL();
+ void commitIconURLToIconDatabase(const KURL&);
- void handledOnloadEvents();
- String userAgent(const KURL&) const;
+ KURL baseURL() const;
- PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const HashMap<String, String>& args);
+ void replaceDocument(const String&);
- void dispatchWindowObjectAvailable();
- void dispatchDocumentElementAvailable();
- void restoreDocumentState();
+ void begin();
+ void begin(const KURL&, bool dispatchWindowObjectAvailable = true, SecurityOrigin* forcedSecurityOrigin = 0);
- // Mixed content related functions.
- static bool isMixedContent(SecurityOrigin* context, const KURL&);
- void checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL&);
- void checkIfRunInsecureContent(SecurityOrigin* context, const KURL&);
+ void write(const char* string, int length = -1, bool flush = false);
+ void write(const String&);
+ void end();
+ void endIfNotLoadingMainResource();
- Frame* opener();
- void setOpener(Frame*);
- bool openedByDOM() const;
- void setOpenedByDOM();
+ void setEncoding(const String& encoding, bool userChosen);
+ String encoding() const;
- bool isProcessingUserGesture();
+ void tokenizerProcessedData();
- void resetMultipleFormSubmissionProtection();
+ void handledOnloadEvents();
+ String userAgent(const KURL&) const;
- void addData(const char* bytes, int length);
+ PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const HashMap<String, String>& args);
- void checkCallImplicitClose();
+ void dispatchWindowObjectAvailable();
+ void dispatchDocumentElementAvailable();
- void frameDetached();
+ // Mixed content related functions.
+ static bool isMixedContent(SecurityOrigin* context, const KURL&);
+ void checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL&);
+ void checkIfRunInsecureContent(SecurityOrigin* context, const KURL&);
- const KURL& url() const { return m_URL; }
+ Frame* opener();
+ void setOpener(Frame*);
- void setResponseMIMEType(const String&);
- const String& responseMIMEType() const;
+ bool isProcessingUserGesture();
- bool containsPlugins() const;
+ void resetMultipleFormSubmissionProtection();
- void loadDone();
- void finishedParsing();
- void checkCompleted();
+ void addData(const char* bytes, int length);
- bool isComplete() const;
+ void checkCallImplicitClose();
- bool requestObject(RenderPart* frame, const String& url, const AtomicString& frameName,
- const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues);
+ void frameDetached();
- KURL completeURL(const String& url);
+ const KURL& url() const { return m_URL; }
- void cancelAndClear();
+ void setResponseMIMEType(const String&);
+ const String& responseMIMEType() const;
- void setTitle(const String&);
+ bool containsPlugins() const;
- void commitProvisionalLoad(PassRefPtr<CachedPage>);
- bool isLoadingFromCachedPage() const { return m_loadingFromCachedPage; }
+ void loadDone();
+ void finishedParsing();
+ void checkCompleted();
- void goToItem(HistoryItem*, FrameLoadType);
- void saveDocumentAndScrollState();
+ void checkDidPerformFirstNavigation();
- HistoryItem* currentHistoryItem();
- void setCurrentHistoryItem(PassRefPtr<HistoryItem>);
+ bool isComplete() const;
- enum LocalLoadPolicy {
- AllowLocalLoadsForAll, // No restriction on local loads.
- AllowLocalLoadsForLocalAndSubstituteData,
- AllowLocalLoadsForLocalOnly,
- };
- static void setLocalLoadPolicy(LocalLoadPolicy);
- static bool restrictAccessToLocal();
- static bool allowSubstituteDataAccessToLocal();
+ bool requestObject(RenderPart* frame, const String& url, const AtomicString& frameName,
+ const String& serviceType, const Vector<String>& paramNames, const Vector<String>& paramValues);
- bool committingFirstRealLoad() const { return !m_creatingInitialEmptyDocument && !m_committedFirstRealDocumentLoad; }
+ KURL completeURL(const String& url);
- void iconLoadDecisionAvailable();
+ void cancelAndClear();
- bool shouldAllowNavigation(Frame* targetFrame) const;
- Frame* findFrameForNavigation(const AtomicString& name);
+ void setTitle(const String&);
- void startIconLoader();
+ void commitProvisionalLoad(PassRefPtr<CachedPage>);
+ bool isLoadingFromCachedPage() const { return m_loadingFromCachedPage; }
- void applyUserAgent(ResourceRequest& request);
+ bool committingFirstRealLoad() const { return !m_creatingInitialEmptyDocument && !m_committedFirstRealDocumentLoad; }
+ bool committedFirstRealDocumentLoad() const { return m_committedFirstRealDocumentLoad; }
+ bool creatingInitialEmptyDocument() const { return m_creatingInitialEmptyDocument; }
- bool shouldInterruptLoadForXFrameOptions(const String&, const KURL&);
+ void iconLoadDecisionAvailable();
- void open(CachedFrameBase&);
+ bool shouldAllowNavigation(Frame* targetFrame) const;
+ Frame* findFrameForNavigation(const AtomicString& name);
- private:
- PassRefPtr<HistoryItem> createHistoryItem(bool useOriginal);
- PassRefPtr<HistoryItem> createHistoryItemTree(Frame* targetFrame, bool clipAtTarget);
+ void startIconLoader();
- bool canCachePageContainingThisFrame();
-#ifndef NDEBUG
- void logCanCachePageDecision();
- bool logCanCacheFrameDecision(int indentLevel);
-#endif
+ void applyUserAgent(ResourceRequest& request);
- void addBackForwardItemClippedAtTarget(bool doClip);
- void restoreScrollPositionAndViewState();
- void saveDocumentState();
- void loadItem(HistoryItem*, FrameLoadType);
- bool urlsMatchItem(HistoryItem*) const;
- void invalidateCurrentItemCachedPage();
- void recursiveGoToItem(HistoryItem*, HistoryItem*, FrameLoadType);
- bool childFramesMatchItem(HistoryItem*) const;
-
- void updateHistoryForBackForwardNavigation();
- void updateHistoryForReload();
- void updateHistoryForStandardLoad();
- void updateHistoryForRedirectWithLockedBackForwardList();
- void updateHistoryForClientRedirect();
- void updateHistoryForCommit();
- void updateHistoryForAnchorScroll();
-
- void redirectionTimerFired(Timer<FrameLoader>*);
- void checkTimerFired(Timer<FrameLoader>*);
-
- void cancelRedirection(bool newLoadInProgress = false);
+ bool shouldInterruptLoadForXFrameOptions(const String&, const KURL&);
- void started();
+ void open(CachedFrameBase&);
- void completed();
+ // FIXME: Should these really be public?
+ void completed();
+ bool allAncestorsAreComplete() const; // including this
+ bool allChildrenAreComplete() const; // immediate children, not all descendants
+ void clientRedirected(const KURL&, double delay, double fireDate, bool lockBackForwardList);
+ void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
+ void loadItem(HistoryItem*, FrameLoadType);
- bool shouldUsePlugin(const KURL&, const String& mimeType, bool hasFallback, bool& useFallback);
- bool loadPlugin(RenderPart*, const KURL&, const String& mimeType,
- const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
-
- bool loadProvisionalItemFromCachedPage();
- void cachePageForHistoryItem(HistoryItem*);
- void pageHidden();
+ // FIXME: This is public because this asynchronous callback from the FrameLoaderClient
+ // uses the policy machinery (and therefore is called via the PolicyChecker). Once we
+ // introduce a proper callback type for this function, we should make it private again.
+ void continueLoadAfterWillSubmitForm();
- void receivedFirstData();
+private:
+ bool canCachePageContainingThisFrame();
+#ifndef NDEBUG
+ void logCanCachePageDecision();
+ bool logCanCacheFrameDecision(int indentLevel);
+#endif
- void updateFirstPartyForCookies();
- void setFirstPartyForCookies(const KURL&);
-
- void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType loadType, bool isMainResource, bool cookiePolicyURLFromRequest);
+ void checkTimerFired(Timer<FrameLoader>*);
- // Also not cool.
- void stopLoadingSubframes();
+ void started();
- void clearProvisionalLoad();
- void markLoadComplete();
- void transitionToCommitted(PassRefPtr<CachedPage>);
- void frameLoadCompleted();
+ bool shouldUsePlugin(const KURL&, const String& mimeType, bool hasFallback, bool& useFallback);
+ bool loadPlugin(RenderPart*, const KURL&, const String& mimeType,
+ const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback);
+
+ bool loadProvisionalItemFromCachedPage();
+ void cachePageForHistoryItem(HistoryItem*);
+ void pageHidden();
- void mainReceivedError(const ResourceError&, bool isComplete);
+ void receivedFirstData();
+
+ void updateFirstPartyForCookies();
+ void setFirstPartyForCookies(const KURL&);
+
+ void addExtraFieldsToRequest(ResourceRequest&, FrameLoadType loadType, bool isMainResource, bool cookiePolicyURLFromRequest);
- void setLoadType(FrameLoadType);
+ // Also not cool.
+ void stopLoadingSubframes();
- void checkNavigationPolicy(const ResourceRequest&, DocumentLoader*, PassRefPtr<FormState>, NavigationPolicyDecisionFunction, void* argument);
- void checkNewWindowPolicy(const NavigationAction&, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName);
+ void clearProvisionalLoad();
+ void markLoadComplete();
+ void transitionToCommitted(PassRefPtr<CachedPage>);
+ void frameLoadCompleted();
- void continueAfterNavigationPolicy(PolicyAction);
- void continueAfterNewWindowPolicy(PolicyAction);
- void continueAfterContentPolicy(PolicyAction);
- void continueLoadAfterWillSubmitForm(PolicyAction = PolicyUse);
+ void mainReceivedError(const ResourceError&, bool isComplete);
- static void callContinueLoadAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
- void continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
- static void callContinueLoadAfterNewWindowPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
- void continueLoadAfterNewWindowPolicy(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
- static void callContinueFragmentScrollAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
- void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
- bool shouldScrollToAnchor(bool isFormSubmission, FrameLoadType, const KURL&);
- void addHistoryItemForFragmentScroll();
+ void setLoadType(FrameLoadType);
- void stopPolicyCheck();
+ static void callContinueLoadAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
+ static void callContinueLoadAfterNewWindowPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
+ static void callContinueFragmentScrollAfterNavigationPolicy(void*, const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
- void checkLoadCompleteForThisFrame();
+ void continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
+ void continueLoadAfterNewWindowPolicy(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
+ void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
- void setDocumentLoader(DocumentLoader*);
- void setPolicyDocumentLoader(DocumentLoader*);
- void setProvisionalDocumentLoader(DocumentLoader*);
+ bool shouldScrollToAnchor(bool isFormSubmission, FrameLoadType, const KURL&);
- void setState(FrameState);
+ void checkLoadCompleteForThisFrame();
- void closeOldDataSources();
- void open(CachedPage&);
+ void setDocumentLoader(DocumentLoader*);
+ void setPolicyDocumentLoader(DocumentLoader*);
+ void setProvisionalDocumentLoader(DocumentLoader*);
- void updateHistoryAfterClientRedirect();
+ void setState(FrameState);
- void clear(bool clearWindowProperties = true, bool clearScriptObjects = true, bool clearFrameView = true);
+ void closeOldDataSources();
+ void open(CachedPage&);
- bool shouldReloadToHandleUnreachableURL(DocumentLoader*);
- void handleUnimplementablePolicy(const ResourceError&);
+ void updateHistoryAfterClientRedirect();
- void scheduleRedirection(PassOwnPtr<ScheduledRedirection>);
- void startRedirectionTimer();
- void stopRedirectionTimer();
+ void clear(bool clearWindowProperties = true, bool clearScriptObjects = true, bool clearFrameView = true);
- void dispatchDidCommitLoad();
- void dispatchAssignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&);
- void dispatchWillSendRequest(DocumentLoader*, unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
- void dispatchDidReceiveResponse(DocumentLoader*, unsigned long identifier, const ResourceResponse&);
- void dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int length);
- void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier);
+ bool shouldReloadToHandleUnreachableURL(DocumentLoader*);
- static bool isLocationChange(const ScheduledRedirection&);
- void scheduleFormSubmission(const FrameLoadRequest&, bool lockHistory, PassRefPtr<Event>, PassRefPtr<FormState>);
+ void dispatchDidCommitLoad();
- void loadWithDocumentLoader(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>); // Calls continueLoadAfterNavigationPolicy
- void load(DocumentLoader*); // Calls loadWithDocumentLoader
+ void loadWithDocumentLoader(DocumentLoader*, FrameLoadType, PassRefPtr<FormState>); // Calls continueLoadAfterNavigationPolicy
+ void load(DocumentLoader*); // Calls loadWithDocumentLoader
- void loadWithNavigationAction(const ResourceRequest&, const NavigationAction&, // Calls loadWithDocumentLoader
- bool lockHistory, FrameLoadType, PassRefPtr<FormState>);
+ void loadWithNavigationAction(const ResourceRequest&, const NavigationAction&, // Calls loadWithDocumentLoader
+ bool lockHistory, FrameLoadType, PassRefPtr<FormState>);
- void loadPostRequest(const ResourceRequest&, const String& referrer, // Called by loadFrameRequest, calls loadWithNavigationAction
- const String& frameName, bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
- void loadURL(const KURL&, const String& referrer, const String& frameName, // Called by loadFrameRequest, calls loadWithNavigationAction or dispatches to navigation policy delegate
- bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
+ void loadPostRequest(const ResourceRequest&, const String& referrer, // Called by loadFrameRequest, calls loadWithNavigationAction
+ const String& frameName, bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
+ void loadURL(const KURL&, const String& referrer, const String& frameName, // Called by loadFrameRequest, calls loadWithNavigationAction or dispatches to navigation policy delegate
+ bool lockHistory, FrameLoadType, PassRefPtr<Event>, PassRefPtr<FormState>);
- void clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress);
- void clientRedirected(const KURL&, double delay, double fireDate, bool lockBackForwardList);
- bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
+ bool shouldReload(const KURL& currentURL, const KURL& destinationURL);
- void sendRemainingDelegateMessages(unsigned long identifier, const ResourceResponse&, int length, const ResourceError&);
- void requestFromDelegate(ResourceRequest&, unsigned long& identifier, ResourceError&);
+ void requestFromDelegate(ResourceRequest&, unsigned long& identifier, ResourceError&);
- void recursiveCheckLoadComplete();
+ void recursiveCheckLoadComplete();
- void detachChildren();
- void closeAndRemoveChild(Frame*);
+ void detachChildren();
+ void closeAndRemoveChild(Frame*);
- Frame* loadSubframe(HTMLFrameOwnerElement*, const KURL&, const String& name, const String& referrer);
+ Frame* loadSubframe(HTMLFrameOwnerElement*, const KURL&, const String& name, const String& referrer);
- // Returns true if argument is a JavaScript URL.
- bool executeIfJavaScriptURL(const KURL&, bool userGesture = false, bool replaceDocument = true);
+ void scrollToAnchor(const KURL&);
- bool gotoAnchor(const String& name); // returns true if the anchor was found
- void scrollToAnchor(const KURL&);
+ void provisionalLoadStarted();
- void provisionalLoadStarted();
+ bool canCachePage();
- bool canCachePage();
+ bool didOpenURL(const KURL&);
- bool didOpenURL(const KURL&);
+ void scheduleCheckCompleted();
+ void scheduleCheckLoadComplete();
+ void startCheckCompleteTimer();
- void scheduleCheckCompleted();
- void scheduleCheckLoadComplete();
- void startCheckCompleteTimer();
+ KURL originalRequestURL() const;
- KURL originalRequestURL() const;
+ bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
- bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
+ Frame* m_frame;
+ FrameLoaderClient* m_client;
- void saveScrollPositionAndViewStateToItem(HistoryItem*);
+ mutable PolicyChecker m_policyChecker;
+ mutable HistoryController m_history;
+ mutable ResourceLoadNotifier m_notifer;
- bool allAncestorsAreComplete() const; // including this
- bool allChildrenAreComplete() const; // immediate children, not all descendants
+ FrameState m_state;
+ FrameLoadType m_loadType;
- Frame* m_frame;
- FrameLoaderClient* m_client;
+ // Document loaders for the three phases of frame loading. Note that while
+ // a new request is being loaded, the old document loader may still be referenced.
+ // E.g. while a new request is in the "policy" state, the old document loader may
+ // be consulted in particular as it makes sense to imply certain settings on the new loader.
+ RefPtr<DocumentLoader> m_documentLoader;
+ RefPtr<DocumentLoader> m_provisionalDocumentLoader;
+ RefPtr<DocumentLoader> m_policyDocumentLoader;
- FrameState m_state;
- FrameLoadType m_loadType;
+ bool m_delegateIsHandlingProvisionalLoadError;
- // Document loaders for the three phases of frame loading. Note that while
- // a new request is being loaded, the old document loader may still be referenced.
- // E.g. while a new request is in the "policy" state, the old document loader may
- // be consulted in particular as it makes sense to imply certain settings on the new loader.
- RefPtr<DocumentLoader> m_documentLoader;
- RefPtr<DocumentLoader> m_provisionalDocumentLoader;
- RefPtr<DocumentLoader> m_policyDocumentLoader;
+ bool m_firstLayoutDone;
+ bool m_quickRedirectComing;
+ bool m_sentRedirectNotification;
+ bool m_inStopAllLoaders;
- // This identifies the type of navigation action which prompted this load. Note
- // that WebKit conveys this value as the WebActionNavigationTypeKey value
- // on navigation action delegate callbacks.
- FrameLoadType m_policyLoadType;
- PolicyCheck m_policyCheck;
+ String m_outgoingReferrer;
- bool m_delegateIsHandlingProvisionalLoadError;
- bool m_delegateIsDecidingNavigationPolicy;
- bool m_delegateIsHandlingUnimplementablePolicy;
+ bool m_isExecutingJavaScriptFormAction;
- bool m_firstLayoutDone;
- bool m_quickRedirectComing;
- bool m_sentRedirectNotification;
- bool m_inStopAllLoaders;
+ String m_responseMIMEType;
- String m_outgoingReferrer;
+ bool m_didCallImplicitClose;
+ bool m_wasUnloadEventEmitted;
+ bool m_unloadEventBeingDispatched;
+ bool m_isComplete;
+ bool m_isLoadingMainResource;
- bool m_isExecutingJavaScriptFormAction;
- bool m_isRunningScript;
+ KURL m_URL;
+ KURL m_workingURL;
- String m_responseMIMEType;
+ OwnPtr<IconLoader> m_iconLoader;
+ bool m_mayLoadIconLater;
- bool m_didCallImplicitClose;
- bool m_wasUnloadEventEmitted;
- bool m_unloadEventBeingDispatched;
- bool m_isComplete;
- bool m_isLoadingMainResource;
+ bool m_cancellingWithLoadInProgress;
- KURL m_URL;
- KURL m_workingURL;
+ bool m_needsClear;
+ bool m_receivedData;
- OwnPtr<IconLoader> m_iconLoader;
- bool m_mayLoadIconLater;
+ bool m_encodingWasChosenByUser;
+ String m_encoding;
+ RefPtr<TextResourceDecoder> m_decoder;
- bool m_cancellingWithLoadInProgress;
+ bool m_containsPlugIns;
- OwnPtr<ScheduledRedirection> m_scheduledRedirection;
+ KURL m_submittedFormURL;
- bool m_needsClear;
- bool m_receivedData;
+ Timer<FrameLoader> m_checkTimer;
+ bool m_shouldCallCheckCompleted;
+ bool m_shouldCallCheckLoadComplete;
- bool m_encodingWasChosenByUser;
- String m_encoding;
- RefPtr<TextResourceDecoder> m_decoder;
+ Frame* m_opener;
+ HashSet<Frame*> m_openedFrames;
- bool m_containsPlugIns;
+ bool m_creatingInitialEmptyDocument;
+ bool m_isDisplayingInitialEmptyDocument;
+ bool m_committedFirstRealDocumentLoad;
- KURL m_submittedFormURL;
+ bool m_didPerformFirstNavigation;
+ bool m_loadingFromCachedPage;
+ bool m_suppressOpenerInNewFrame;
- Timer<FrameLoader> m_redirectionTimer;
- Timer<FrameLoader> m_checkTimer;
- bool m_shouldCallCheckCompleted;
- bool m_shouldCallCheckLoadComplete;
-
- Frame* m_opener;
- HashSet<Frame*> m_openedFrames;
-
- bool m_openedByDOM;
-
- bool m_creatingInitialEmptyDocument;
- bool m_isDisplayingInitialEmptyDocument;
- bool m_committedFirstRealDocumentLoad;
-
- RefPtr<HistoryItem> m_currentHistoryItem;
- RefPtr<HistoryItem> m_previousHistoryItem;
- RefPtr<HistoryItem> m_provisionalHistoryItem;
-
- bool m_didPerformFirstNavigation;
- bool m_loadingFromCachedPage;
-
#ifndef NDEBUG
- bool m_didDispatchDidCommitLoad;
+ bool m_didDispatchDidCommitLoad;
#endif
- };
+};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h b/src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h
index 5ba4b10..2042b32 100644
--- a/src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h
+++ b/src/3rdparty/webkit/WebCore/loader/FrameLoaderClient.h
@@ -60,6 +60,7 @@ namespace WebCore {
class KURL;
class NavigationAction;
class PluginView;
+ class PolicyChecker;
class ResourceError;
class ResourceHandle;
class ResourceLoader;
@@ -72,7 +73,7 @@ namespace WebCore {
class String;
class Widget;
- typedef void (FrameLoader::*FramePolicyFunction)(PolicyAction);
+ typedef void (PolicyChecker::*FramePolicyFunction)(PolicyAction);
class FrameLoaderClient {
public:
diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h b/src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h
index 76299f5..e7d51c7 100644
--- a/src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h
+++ b/src/3rdparty/webkit/WebCore/loader/FrameLoaderTypes.h
@@ -87,6 +87,11 @@ namespace WebCore {
UnloadEventPolicyUnloadOnly,
UnloadEventPolicyUnloadAndPageHide
};
+
+ enum ReferrerPolicy {
+ SendReferrer,
+ NoReferrer
+ };
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/loader/HistoryController.cpp b/src/3rdparty/webkit/WebCore/loader/HistoryController.cpp
new file mode 100644
index 0000000..501640a
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/HistoryController.cpp
@@ -0,0 +1,627 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "HistoryController.h"
+
+#include "CachedPage.h"
+#include "CString.h"
+#include "DocumentLoader.h"
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClient.h"
+#include "FrameTree.h"
+#include "FrameView.h"
+#include "HistoryItem.h"
+#include "Logging.h"
+#include "Page.h"
+#include "PageCache.h"
+#include "PageGroup.h"
+#include "Settings.h"
+
+namespace WebCore {
+
+HistoryController::HistoryController(Frame* frame)
+ : m_frame(frame)
+{
+}
+
+HistoryController::~HistoryController()
+{
+}
+
+void HistoryController::saveScrollPositionAndViewStateToItem(HistoryItem* item)
+{
+ if (!item || !m_frame->view())
+ return;
+
+ item->setScrollPoint(m_frame->view()->scrollPosition());
+ // FIXME: It would be great to work out a way to put this code in WebCore instead of calling through to the client.
+ m_frame->loader()->client()->saveViewStateToItem(item);
+}
+
+/*
+ There is a race condition between the layout and load completion that affects restoring the scroll position.
+ We try to restore the scroll position at both the first layout and upon load completion.
+
+ 1) If first layout happens before the load completes, we want to restore the scroll position then so that the
+ first time we draw the page is already scrolled to the right place, instead of starting at the top and later
+ jumping down. It is possible that the old scroll position is past the part of the doc laid out so far, in
+ which case the restore silent fails and we will fix it in when we try to restore on doc completion.
+ 2) If the layout happens after the load completes, the attempt to restore at load completion time silently
+ fails. We then successfully restore it when the layout happens.
+*/
+void HistoryController::restoreScrollPositionAndViewState()
+{
+ if (!m_frame->loader()->committedFirstRealDocumentLoad())
+ return;
+
+ ASSERT(m_currentItem);
+
+ // FIXME: As the ASSERT attests, it seems we should always have a currentItem here.
+ // One counterexample is <rdar://problem/4917290>
+ // For now, to cover this issue in release builds, there is no technical harm to returning
+ // early and from a user standpoint - as in the above radar - the previous page load failed
+ // so there *is* no scroll or view state to restore!
+ if (!m_currentItem)
+ return;
+
+ // FIXME: It would be great to work out a way to put this code in WebCore instead of calling
+ // through to the client. It's currently used only for the PDF view on Mac.
+ m_frame->loader()->client()->restoreViewState();
+
+ if (FrameView* view = m_frame->view())
+ if (!view->wasScrolledByUser())
+ view->setScrollPosition(m_currentItem->scrollPoint());
+}
+
+void HistoryController::updateBackForwardListForFragmentScroll()
+{
+ updateBackForwardListClippedAtTarget(false);
+}
+
+void HistoryController::saveDocumentState()
+{
+ // FIXME: Reading this bit of FrameLoader state here is unfortunate. I need to study
+ // this more to see if we can remove this dependency.
+ if (m_frame->loader()->creatingInitialEmptyDocument())
+ return;
+
+ // For a standard page load, we will have a previous item set, which will be used to
+ // store the form state. However, in some cases we will have no previous item, and
+ // the current item is the right place to save the state. One example is when we
+ // detach a bunch of frames because we are navigating from a site with frames to
+ // another site. Another is when saving the frame state of a frame that is not the
+ // target of the current navigation (if we even decide to save with that granularity).
+
+ // Because of previousItem's "masking" of currentItem for this purpose, it's important
+ // that previousItem be cleared at the end of a page transition. We leverage the
+ // checkLoadComplete recursion to achieve this goal.
+
+ HistoryItem* item = m_previousItem ? m_previousItem.get() : m_currentItem.get();
+ if (!item)
+ return;
+
+ Document* document = m_frame->document();
+ ASSERT(document);
+
+ if (item->isCurrentDocument(document)) {
+ LOG(Loading, "WebCoreLoading %s: saving form state to %p", m_frame->tree()->name().string().utf8().data(), item);
+ item->setDocumentState(document->formElementsState());
+ }
+}
+
+// Walk the frame tree, telling all frames to save their form state into their current
+// history item.
+void HistoryController::saveDocumentAndScrollState()
+{
+ for (Frame* frame = m_frame; frame; frame = frame->tree()->traverseNext(m_frame)) {
+ frame->loader()->history()->saveDocumentState();
+ frame->loader()->history()->saveScrollPositionAndViewStateToItem(frame->loader()->history()->currentItem());
+ }
+}
+
+void HistoryController::restoreDocumentState()
+{
+ Document* doc = m_frame->document();
+
+ HistoryItem* itemToRestore = 0;
+
+ switch (m_frame->loader()->loadType()) {
+ case FrameLoadTypeReload:
+ case FrameLoadTypeReloadFromOrigin:
+ case FrameLoadTypeSame:
+ case FrameLoadTypeReplace:
+ break;
+ case FrameLoadTypeBack:
+ case FrameLoadTypeBackWMLDeckNotAccessible:
+ case FrameLoadTypeForward:
+ case FrameLoadTypeIndexedBackForward:
+ case FrameLoadTypeRedirectWithLockedBackForwardList:
+ case FrameLoadTypeStandard:
+ itemToRestore = m_currentItem.get();
+ }
+
+ if (!itemToRestore)
+ return;
+
+ LOG(Loading, "WebCoreLoading %s: restoring form state from %p", m_frame->tree()->name().string().utf8().data(), itemToRestore);
+ doc->setStateForNewFormElements(itemToRestore->documentState());
+}
+
+void HistoryController::invalidateCurrentItemCachedPage()
+{
+ // When we are pre-commit, the currentItem is where the pageCache data resides
+ CachedPage* cachedPage = pageCache()->get(currentItem());
+
+ // FIXME: This is a grotesque hack to fix <rdar://problem/4059059> Crash in RenderFlow::detach
+ // Somehow the PageState object is not properly updated, and is holding onto a stale document.
+ // Both Xcode and FileMaker see this crash, Safari does not.
+
+ ASSERT(!cachedPage || cachedPage->document() == m_frame->document());
+ if (cachedPage && cachedPage->document() == m_frame->document()) {
+ cachedPage->document()->setInPageCache(false);
+ cachedPage->clear();
+ }
+
+ if (cachedPage)
+ pageCache()->remove(currentItem());
+}
+
+// Main funnel for navigating to a previous location (back/forward, non-search snap-back)
+// This includes recursion to handle loading into framesets properly
+void HistoryController::goToItem(HistoryItem* targetItem, FrameLoadType type)
+{
+ ASSERT(!m_frame->tree()->parent());
+
+ // shouldGoToHistoryItem is a private delegate method. This is needed to fix:
+ // <rdar://problem/3951283> can view pages from the back/forward cache that should be disallowed by Parental Controls
+ // Ultimately, history item navigations should go through the policy delegate. That's covered in:
+ // <rdar://problem/3979539> back/forward cache navigations should consult policy delegate
+ Page* page = m_frame->page();
+ if (!page)
+ return;
+ if (!m_frame->loader()->client()->shouldGoToHistoryItem(targetItem))
+ return;
+
+ // Set the BF cursor before commit, which lets the user quickly click back/forward again.
+ // - plus, it only makes sense for the top level of the operation through the frametree,
+ // as opposed to happening for some/one of the page commits that might happen soon
+ BackForwardList* bfList = page->backForwardList();
+ HistoryItem* currentItem = bfList->currentItem();
+ bfList->goToItem(targetItem);
+ Settings* settings = m_frame->settings();
+ page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : targetItem);
+ recursiveGoToItem(targetItem, currentItem, type);
+}
+
+// Walk the frame tree and ensure that the URLs match the URLs in the item.
+bool HistoryController::urlsMatchItem(HistoryItem* item) const
+{
+ const KURL& currentURL = m_frame->loader()->documentLoader()->url();
+ if (!equalIgnoringFragmentIdentifier(currentURL, item->url()))
+ return false;
+
+ const HistoryItemVector& childItems = item->children();
+
+ unsigned size = childItems.size();
+ for (unsigned i = 0; i < size; ++i) {
+ Frame* childFrame = m_frame->tree()->child(childItems[i]->target());
+ if (childFrame && !childFrame->loader()->history()->urlsMatchItem(childItems[i].get()))
+ return false;
+ }
+
+ return true;
+}
+
+void HistoryController::updateForBackForwardNavigation()
+{
+#if !LOG_DISABLED
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for back/forward navigation in frame %s", m_frame->loader()->documentLoader()->title().utf8().data());
+#endif
+
+ // Must grab the current scroll position before disturbing it
+ saveScrollPositionAndViewStateToItem(m_previousItem.get());
+}
+
+void HistoryController::updateForReload()
+{
+#if !LOG_DISABLED
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for reload in frame %s", m_frame->loader()->documentLoader()->title().utf8().data());
+#endif
+
+ if (m_currentItem) {
+ pageCache()->remove(m_currentItem.get());
+
+ if (m_frame->loader()->loadType() == FrameLoadTypeReload || m_frame->loader()->loadType() == FrameLoadTypeReloadFromOrigin)
+ saveScrollPositionAndViewStateToItem(m_currentItem.get());
+
+ // Sometimes loading a page again leads to a different result because of cookies. Bugzilla 4072
+ if (m_frame->loader()->documentLoader()->unreachableURL().isEmpty())
+ m_currentItem->setURL(m_frame->loader()->documentLoader()->requestURL());
+ }
+}
+
+// There are 3 things you might think of as "history", all of which are handled by these functions.
+//
+// 1) Back/forward: The m_currentItem is part of this mechanism.
+// 2) Global history: Handled by the client.
+// 3) Visited links: Handled by the PageGroup.
+
+void HistoryController::updateForStandardLoad()
+{
+ LOG(History, "WebCoreHistory: Updating History for Standard Load in frame %s", m_frame->loader()->documentLoader()->url().string().ascii().data());
+
+ FrameLoader* frameLoader = m_frame->loader();
+
+ Settings* settings = m_frame->settings();
+ bool needPrivacy = !settings || settings->privateBrowsingEnabled();
+ const KURL& historyURL = frameLoader->documentLoader()->urlForHistory();
+
+ if (!frameLoader->documentLoader()->isClientRedirect()) {
+ if (!historyURL.isEmpty()) {
+ updateBackForwardListClippedAtTarget(true);
+ if (!needPrivacy) {
+ frameLoader->client()->updateGlobalHistory();
+ frameLoader->documentLoader()->setDidCreateGlobalHistoryEntry(true);
+ if (frameLoader->documentLoader()->unreachableURL().isEmpty())
+ frameLoader->client()->updateGlobalHistoryRedirectLinks();
+ }
+ if (Page* page = m_frame->page())
+ page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
+ }
+ } else if (frameLoader->documentLoader()->unreachableURL().isEmpty() && m_currentItem) {
+ m_currentItem->setURL(frameLoader->documentLoader()->url());
+ m_currentItem->setFormInfoFromRequest(frameLoader->documentLoader()->request());
+ }
+
+ if (!historyURL.isEmpty() && !needPrivacy) {
+ if (Page* page = m_frame->page())
+ page->group().addVisitedLink(historyURL);
+
+ if (!frameLoader->documentLoader()->didCreateGlobalHistoryEntry() && frameLoader->documentLoader()->unreachableURL().isEmpty() && !frameLoader->url().isEmpty())
+ frameLoader->client()->updateGlobalHistoryRedirectLinks();
+ }
+}
+
+void HistoryController::updateForRedirectWithLockedBackForwardList()
+{
+#if !LOG_DISABLED
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for redirect load in frame %s", m_frame->loader()->documentLoader()->title().utf8().data());
+#endif
+
+ Settings* settings = m_frame->settings();
+ bool needPrivacy = !settings || settings->privateBrowsingEnabled();
+ const KURL& historyURL = m_frame->loader()->documentLoader()->urlForHistory();
+
+ if (m_frame->loader()->documentLoader()->isClientRedirect()) {
+ if (!m_currentItem && !m_frame->tree()->parent()) {
+ if (!historyURL.isEmpty()) {
+ updateBackForwardListClippedAtTarget(true);
+ if (!needPrivacy) {
+ m_frame->loader()->client()->updateGlobalHistory();
+ m_frame->loader()->documentLoader()->setDidCreateGlobalHistoryEntry(true);
+ if (m_frame->loader()->documentLoader()->unreachableURL().isEmpty())
+ m_frame->loader()->client()->updateGlobalHistoryRedirectLinks();
+ }
+ if (Page* page = m_frame->page())
+ page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
+ }
+ }
+ if (m_currentItem) {
+ m_currentItem->setURL(m_frame->loader()->documentLoader()->url());
+ m_currentItem->setFormInfoFromRequest(m_frame->loader()->documentLoader()->request());
+ }
+ } else {
+ Frame* parentFrame = m_frame->tree()->parent();
+ if (parentFrame && parentFrame->loader()->history()->m_currentItem)
+ parentFrame->loader()->history()->m_currentItem->setChildItem(createItem(true));
+ }
+
+ if (!historyURL.isEmpty() && !needPrivacy) {
+ if (Page* page = m_frame->page())
+ page->group().addVisitedLink(historyURL);
+
+ if (!m_frame->loader()->documentLoader()->didCreateGlobalHistoryEntry() && m_frame->loader()->documentLoader()->unreachableURL().isEmpty() && !m_frame->loader()->url().isEmpty())
+ m_frame->loader()->client()->updateGlobalHistoryRedirectLinks();
+ }
+}
+
+void HistoryController::updateForClientRedirect()
+{
+#if !LOG_DISABLED
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for client redirect in frame %s", m_frame->loader()->documentLoader()->title().utf8().data());
+#endif
+
+ // Clear out form data so we don't try to restore it into the incoming page. Must happen after
+ // webcore has closed the URL and saved away the form state.
+ if (m_currentItem) {
+ m_currentItem->clearDocumentState();
+ m_currentItem->clearScrollPoint();
+ }
+
+ Settings* settings = m_frame->settings();
+ bool needPrivacy = !settings || settings->privateBrowsingEnabled();
+ const KURL& historyURL = m_frame->loader()->documentLoader()->urlForHistory();
+
+ if (!historyURL.isEmpty() && !needPrivacy) {
+ if (Page* page = m_frame->page())
+ page->group().addVisitedLink(historyURL);
+ }
+}
+
+void HistoryController::updateForCommit()
+{
+ FrameLoader* frameLoader = m_frame->loader();
+#if !LOG_DISABLED
+ if (frameLoader->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for commit in frame %s", frameLoader->documentLoader()->title().utf8().data());
+#endif
+ FrameLoadType type = frameLoader->loadType();
+ if (isBackForwardLoadType(type) ||
+ ((type == FrameLoadTypeReload || type == FrameLoadTypeReloadFromOrigin) && !frameLoader->provisionalDocumentLoader()->unreachableURL().isEmpty())) {
+ // Once committed, we want to use current item for saving DocState, and
+ // the provisional item for restoring state.
+ // Note previousItem must be set before we close the URL, which will
+ // happen when the data source is made non-provisional below
+ m_previousItem = m_currentItem;
+ ASSERT(m_provisionalItem);
+ m_currentItem = m_provisionalItem;
+ m_provisionalItem = 0;
+ }
+}
+
+void HistoryController::updateForAnchorScroll()
+{
+ if (m_frame->loader()->url().isEmpty())
+ return;
+
+ Settings* settings = m_frame->settings();
+ if (!settings || settings->privateBrowsingEnabled())
+ return;
+
+ Page* page = m_frame->page();
+ if (!page)
+ return;
+
+ page->group().addVisitedLink(m_frame->loader()->url());
+}
+
+void HistoryController::updateForFrameLoadCompleted()
+{
+ // Even if already complete, we might have set a previous item on a frame that
+ // didn't do any data loading on the past transaction. Make sure to clear these out.
+ m_previousItem = 0;
+}
+
+void HistoryController::setCurrentItem(HistoryItem* item)
+{
+ m_currentItem = item;
+}
+
+void HistoryController::setCurrentItemTitle(const String& title)
+{
+ if (m_currentItem)
+ m_currentItem->setTitle(title);
+}
+
+void HistoryController::setProvisionalItem(HistoryItem* item)
+{
+ m_provisionalItem = item;
+}
+
+PassRefPtr<HistoryItem> HistoryController::createItem(bool useOriginal)
+{
+ DocumentLoader* docLoader = m_frame->loader()->documentLoader();
+
+ KURL unreachableURL = docLoader ? docLoader->unreachableURL() : KURL();
+
+ KURL url;
+ KURL originalURL;
+
+ if (!unreachableURL.isEmpty()) {
+ url = unreachableURL;
+ originalURL = unreachableURL;
+ } else {
+ originalURL = docLoader ? docLoader->originalURL() : KURL();
+ if (useOriginal)
+ url = originalURL;
+ else if (docLoader)
+ url = docLoader->requestURL();
+ }
+
+ LOG(History, "WebCoreHistory: Creating item for %s", url.string().ascii().data());
+
+ // Frames that have never successfully loaded any content
+ // may have no URL at all. Currently our history code can't
+ // deal with such things, so we nip that in the bud here.
+ // Later we may want to learn to live with nil for URL.
+ // See bug 3368236 and related bugs for more information.
+ if (url.isEmpty())
+ url = blankURL();
+ if (originalURL.isEmpty())
+ originalURL = blankURL();
+
+ Frame* parentFrame = m_frame->tree()->parent();
+ String parent = parentFrame ? parentFrame->tree()->name() : "";
+ String title = docLoader ? docLoader->title() : "";
+
+ RefPtr<HistoryItem> item = HistoryItem::create(url, m_frame->tree()->name(), parent, title);
+ item->setOriginalURLString(originalURL.string());
+
+ if (!unreachableURL.isEmpty() || !docLoader || docLoader->response().httpStatusCode() >= 400)
+ item->setLastVisitWasFailure(true);
+
+ // Save form state if this is a POST
+ if (docLoader) {
+ if (useOriginal)
+ item->setFormInfoFromRequest(docLoader->originalRequest());
+ else
+ item->setFormInfoFromRequest(docLoader->request());
+ }
+
+ // Set the item for which we will save document state
+ m_previousItem = m_currentItem;
+ m_currentItem = item;
+
+ return item.release();
+}
+
+PassRefPtr<HistoryItem> HistoryController::createItemTree(Frame* targetFrame, bool clipAtTarget)
+{
+ RefPtr<HistoryItem> bfItem = createItem(m_frame->tree()->parent() ? true : false);
+ if (m_previousItem)
+ saveScrollPositionAndViewStateToItem(m_previousItem.get());
+ if (!(clipAtTarget && m_frame == targetFrame)) {
+ // save frame state for items that aren't loading (khtml doesn't save those)
+ saveDocumentState();
+ for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) {
+ FrameLoader* childLoader = child->loader();
+ bool hasChildLoaded = childLoader->frameHasLoaded();
+
+ // If the child is a frame corresponding to an <object> element that never loaded,
+ // we don't want to create a history item, because that causes fallback content
+ // to be ignored on reload.
+
+ if (!(!hasChildLoaded && childLoader->isHostedByObjectElement()))
+ bfItem->addChildItem(childLoader->history()->createItemTree(targetFrame, clipAtTarget));
+ }
+ }
+ if (m_frame == targetFrame)
+ bfItem->setIsTargetItem(true);
+ return bfItem;
+}
+
+// The general idea here is to traverse the frame tree and the item tree in parallel,
+// tracking whether each frame already has the content the item requests. If there is
+// a match (by URL), we just restore scroll position and recurse. Otherwise we must
+// reload that frame, and all its kids.
+void HistoryController::recursiveGoToItem(HistoryItem* item, HistoryItem* fromItem, FrameLoadType type)
+{
+ ASSERT(item);
+ ASSERT(fromItem);
+
+ KURL itemURL = item->url();
+ KURL currentURL;
+ if (m_frame->loader()->documentLoader())
+ currentURL = m_frame->loader()->documentLoader()->url();
+
+ // Always reload the target frame of the item we're going to. This ensures that we will
+ // do -some- load for the transition, which means a proper notification will be posted
+ // to the app.
+ // The exact URL has to match, including fragment. We want to go through the _load
+ // method, even if to do a within-page navigation.
+ // The current frame tree and the frame tree snapshot in the item have to match.
+ if (!item->isTargetItem() &&
+ itemURL == currentURL &&
+ ((m_frame->tree()->name().isEmpty() && item->target().isEmpty()) || m_frame->tree()->name() == item->target()) &&
+ childFramesMatchItem(item))
+ {
+ // This content is good, so leave it alone and look for children that need reloading
+ // Save form state (works from currentItem, since prevItem is nil)
+ ASSERT(!m_previousItem);
+ saveDocumentState();
+ saveScrollPositionAndViewStateToItem(m_currentItem.get());
+
+ if (FrameView* view = m_frame->view())
+ view->setWasScrolledByUser(false);
+
+ m_currentItem = item;
+
+ // Restore form state (works from currentItem)
+ restoreDocumentState();
+
+ // Restore the scroll position (we choose to do this rather than going back to the anchor point)
+ restoreScrollPositionAndViewState();
+
+ const HistoryItemVector& childItems = item->children();
+
+ int size = childItems.size();
+ for (int i = 0; i < size; ++i) {
+ String childFrameName = childItems[i]->target();
+ HistoryItem* fromChildItem = fromItem->childItemWithTarget(childFrameName);
+ ASSERT(fromChildItem || fromItem->isTargetItem());
+ Frame* childFrame = m_frame->tree()->child(childFrameName);
+ ASSERT(childFrame);
+ childFrame->loader()->history()->recursiveGoToItem(childItems[i].get(), fromChildItem, type);
+ }
+ } else {
+ m_frame->loader()->loadItem(item, type);
+ }
+}
+
+// helper method that determines whether the subframes described by the item's subitems
+// match our own current frameset
+bool HistoryController::childFramesMatchItem(HistoryItem* item) const
+{
+ const HistoryItemVector& childItems = item->children();
+ if (childItems.size() != m_frame->tree()->childCount())
+ return false;
+
+ unsigned size = childItems.size();
+ for (unsigned i = 0; i < size; ++i) {
+ if (!m_frame->tree()->child(childItems[i]->target()))
+ return false;
+ }
+
+ // Found matches for all item targets
+ return true;
+}
+
+void HistoryController::updateBackForwardListClippedAtTarget(bool doClip)
+{
+ // In the case of saving state about a page with frames, we store a tree of items that mirrors the frame tree.
+ // The item that was the target of the user's navigation is designated as the "targetItem".
+ // When this function is called with doClip=true we're able to create the whole tree except for the target's children,
+ // which will be loaded in the future. That part of the tree will be filled out as the child loads are committed.
+
+ Page* page = m_frame->page();
+ if (!page)
+ return;
+
+ if (m_frame->loader()->documentLoader()->urlForHistory().isEmpty())
+ return;
+
+ Frame* mainFrame = page->mainFrame();
+ ASSERT(mainFrame);
+ FrameLoader* frameLoader = mainFrame->loader();
+
+ frameLoader->checkDidPerformFirstNavigation();
+
+ RefPtr<HistoryItem> item = frameLoader->history()->createItemTree(m_frame, doClip);
+ LOG(BackForward, "WebCoreBackForward - Adding backforward item %p for frame %s", item.get(), m_frame->loader()->documentLoader()->url().string().ascii().data());
+ page->backForwardList()->addItem(item);
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/loader/HistoryController.h b/src/3rdparty/webkit/WebCore/loader/HistoryController.h
new file mode 100644
index 0000000..4ecae69
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/HistoryController.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HistoryController_h
+#define HistoryController_h
+
+#include "FrameLoaderTypes.h"
+#include "PlatformString.h"
+#include <wtf/Noncopyable.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class Frame;
+class HistoryItem;
+
+class HistoryController : public Noncopyable {
+public:
+ HistoryController(Frame*);
+ ~HistoryController();
+
+ void saveScrollPositionAndViewStateToItem(HistoryItem*);
+ void restoreScrollPositionAndViewState();
+
+ void updateBackForwardListForFragmentScroll();
+
+ void saveDocumentState();
+ void saveDocumentAndScrollState();
+ void restoreDocumentState();
+
+ void invalidateCurrentItemCachedPage();
+
+ void goToItem(HistoryItem*, FrameLoadType);
+ bool urlsMatchItem(HistoryItem*) const;
+
+ void updateForBackForwardNavigation();
+ void updateForReload();
+ void updateForStandardLoad();
+ void updateForRedirectWithLockedBackForwardList();
+ void updateForClientRedirect();
+ void updateForCommit();
+ void updateForAnchorScroll();
+ void updateForFrameLoadCompleted();
+
+ HistoryItem* currentItem() const { return m_currentItem.get(); }
+ void setCurrentItem(HistoryItem*);
+ void setCurrentItemTitle(const String&);
+
+ HistoryItem* provisionalItem() const { return m_provisionalItem.get(); }
+ void setProvisionalItem(HistoryItem*);
+
+private:
+ PassRefPtr<HistoryItem> createItem(bool useOriginal);
+ PassRefPtr<HistoryItem> createItemTree(Frame* targetFrame, bool clipAtTarget);
+
+ void recursiveGoToItem(HistoryItem*, HistoryItem*, FrameLoadType);
+ bool childFramesMatchItem(HistoryItem*) const;
+ void updateBackForwardListClippedAtTarget(bool doClip);
+
+ Frame* m_frame;
+
+ RefPtr<HistoryItem> m_currentItem;
+ RefPtr<HistoryItem> m_previousItem;
+ RefPtr<HistoryItem> m_provisionalItem;
+};
+
+} // namespace WebCore
+
+#endif // HistoryController_h
diff --git a/src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp b/src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp
index b183a66..cdc31bc 100644
--- a/src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/ImageLoader.cpp
@@ -31,34 +31,40 @@
namespace WebCore {
-class ImageLoadEventSender {
+class ImageEventSender {
public:
- ImageLoadEventSender();
+ ImageEventSender(const AtomicString& eventType);
- void dispatchLoadEventSoon(ImageLoader*);
- void cancelLoadEvent(ImageLoader*);
+ void dispatchEventSoon(ImageLoader*);
+ void cancelEvent(ImageLoader*);
- void dispatchPendingLoadEvents();
+ void dispatchPendingEvents();
private:
- ~ImageLoadEventSender();
+ void timerFired(Timer<ImageEventSender>*);
- void timerFired(Timer<ImageLoadEventSender>*);
-
- Timer<ImageLoadEventSender> m_timer;
+ AtomicString m_eventType;
+ Timer<ImageEventSender> m_timer;
Vector<ImageLoader*> m_dispatchSoonList;
Vector<ImageLoader*> m_dispatchingList;
};
-static ImageLoadEventSender& loadEventSender()
+static ImageEventSender& beforeLoadEventSender()
+{
+ DEFINE_STATIC_LOCAL(ImageEventSender, sender, (eventNames().beforeloadEvent));
+ return sender;
+}
+
+static ImageEventSender& loadEventSender()
{
- DEFINE_STATIC_LOCAL(ImageLoadEventSender, sender, ());
+ DEFINE_STATIC_LOCAL(ImageEventSender, sender, (eventNames().loadEvent));
return sender;
}
ImageLoader::ImageLoader(Element* element)
: m_element(element)
, m_image(0)
+ , m_firedBeforeLoad(true)
, m_firedLoad(true)
, m_imageComplete(true)
, m_loadManually(false)
@@ -69,7 +75,10 @@ ImageLoader::~ImageLoader()
{
if (m_image)
m_image->removeClient(this);
- loadEventSender().cancelLoadEvent(this);
+ if (!m_firedBeforeLoad)
+ beforeLoadEventSender().cancelEvent(this);
+ if (!m_firedLoad)
+ loadEventSender().cancelEvent(this);
}
void ImageLoader::setImage(CachedImage* newImage)
@@ -78,6 +87,7 @@ void ImageLoader::setImage(CachedImage* newImage)
CachedImage* oldImage = m_image.get();
if (newImage != oldImage) {
setLoadingImage(newImage);
+ m_firedBeforeLoad = true;
m_firedLoad = true;
m_imageComplete = true;
if (newImage)
@@ -89,16 +99,16 @@ void ImageLoader::setImage(CachedImage* newImage)
if (RenderObject* renderer = m_element->renderer()) {
if (!renderer->isImage())
return;
-
toRenderImage(renderer)->resetAnimation();
}
}
void ImageLoader::setLoadingImage(CachedImage* loadingImage)
{
- m_firedLoad = false;
- m_imageComplete = false;
m_image = loadingImage;
+ m_firedBeforeLoad = !loadingImage;
+ m_firedLoad = !loadingImage;
+ m_imageComplete = !loadingImage;
}
void ImageLoader::updateFromElement()
@@ -137,8 +147,13 @@ void ImageLoader::updateFromElement()
CachedImage* oldImage = m_image.get();
if (newImage != oldImage) {
setLoadingImage(newImage);
- if (newImage)
+ if (newImage) {
newImage->addClient(this);
+ if (!m_element->document()->hasListenerType(Document::BEFORELOAD_LISTENER))
+ dispatchPendingBeforeLoadEvent();
+ else
+ beforeLoadEventSender().dispatchEventSoon(this);
+ }
if (oldImage)
oldImage->removeClient(this);
}
@@ -146,7 +161,6 @@ void ImageLoader::updateFromElement()
if (RenderObject* renderer = m_element->renderer()) {
if (!renderer->isImage())
return;
-
toRenderImage(renderer)->resetAnimation();
}
}
@@ -161,16 +175,48 @@ void ImageLoader::updateFromElementIgnoringPreviousError()
void ImageLoader::notifyFinished(CachedResource*)
{
ASSERT(m_failedLoadURL.isEmpty());
+
m_imageComplete = true;
+ if (haveFiredBeforeLoadEvent())
+ updateRenderer();
- loadEventSender().dispatchLoadEventSoon(this);
+ loadEventSender().dispatchEventSoon(this);
+}
+void ImageLoader::updateRenderer()
+{
if (RenderObject* renderer = m_element->renderer()) {
if (!renderer->isImage())
return;
+ RenderImage* imageRenderer = toRenderImage(renderer);
+
+ // Only update the renderer if it doesn't have an image or if what we have
+ // is a complete image. This prevents flickering in the case where a dynamic
+ // change is happening between two images.
+ CachedImage* cachedImage = imageRenderer->cachedImage();
+ if (m_image != cachedImage && (m_imageComplete || !imageRenderer->cachedImage()))
+ imageRenderer->setCachedImage(m_image.get());
+ }
+}
- toRenderImage(renderer)->setCachedImage(m_image.get());
+void ImageLoader::dispatchPendingBeforeLoadEvent()
+{
+ if (m_firedBeforeLoad)
+ return;
+ if (!m_image)
+ return;
+ if (!m_element->document()->attached())
+ return;
+ m_firedBeforeLoad = true;
+ if (m_element->dispatchBeforeLoadEvent(m_image->url())) {
+ updateRenderer();
+ return;
+ }
+ if (m_image) {
+ m_image->removeClient(this);
+ m_image = 0;
}
+ loadEventSender().cancelEvent(this);
}
void ImageLoader::dispatchPendingLoadEvent()
@@ -185,24 +231,26 @@ void ImageLoader::dispatchPendingLoadEvent()
dispatchLoadEvent();
}
-void ImageLoader::dispatchPendingLoadEvents()
+void ImageLoader::dispatchPendingEvents()
{
- loadEventSender().dispatchPendingLoadEvents();
+ beforeLoadEventSender().dispatchPendingEvents();
+ loadEventSender().dispatchPendingEvents();
}
-ImageLoadEventSender::ImageLoadEventSender()
- : m_timer(this, &ImageLoadEventSender::timerFired)
+ImageEventSender::ImageEventSender(const AtomicString& eventType)
+ : m_eventType(eventType)
+ , m_timer(this, &ImageEventSender::timerFired)
{
}
-void ImageLoadEventSender::dispatchLoadEventSoon(ImageLoader* loader)
+void ImageEventSender::dispatchEventSoon(ImageLoader* loader)
{
m_dispatchSoonList.append(loader);
if (!m_timer.isActive())
m_timer.startOneShot(0);
}
-void ImageLoadEventSender::cancelLoadEvent(ImageLoader* loader)
+void ImageEventSender::cancelEvent(ImageLoader* loader)
{
// Remove instances of this loader from both lists.
// Use loops because we allow multiple instances to get into the lists.
@@ -220,7 +268,7 @@ void ImageLoadEventSender::cancelLoadEvent(ImageLoader* loader)
m_timer.stop();
}
-void ImageLoadEventSender::dispatchPendingLoadEvents()
+void ImageEventSender::dispatchPendingEvents()
{
// Need to avoid re-entering this function; if new dispatches are
// scheduled before the parent finishes processing the list, they
@@ -233,15 +281,19 @@ void ImageLoadEventSender::dispatchPendingLoadEvents()
m_dispatchingList.swap(m_dispatchSoonList);
size_t size = m_dispatchingList.size();
for (size_t i = 0; i < size; ++i) {
- if (ImageLoader* loader = m_dispatchingList[i])
- loader->dispatchPendingLoadEvent();
+ if (ImageLoader* loader = m_dispatchingList[i]) {
+ if (m_eventType == eventNames().beforeloadEvent)
+ loader->dispatchPendingBeforeLoadEvent();
+ else
+ loader->dispatchPendingLoadEvent();
+ }
}
m_dispatchingList.clear();
}
-void ImageLoadEventSender::timerFired(Timer<ImageLoadEventSender>*)
+void ImageEventSender::timerFired(Timer<ImageEventSender>*)
{
- dispatchPendingLoadEvents();
+ dispatchPendingEvents();
}
}
diff --git a/src/3rdparty/webkit/WebCore/loader/ImageLoader.h b/src/3rdparty/webkit/WebCore/loader/ImageLoader.h
index 3496f75..7f42e33 100644
--- a/src/3rdparty/webkit/WebCore/loader/ImageLoader.h
+++ b/src/3rdparty/webkit/WebCore/loader/ImageLoader.h
@@ -53,9 +53,10 @@ public:
void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
+ bool haveFiredBeforeLoadEvent() const { return m_firedBeforeLoad; }
bool haveFiredLoadEvent() const { return m_firedLoad; }
- static void dispatchPendingLoadEvents();
+ static void dispatchPendingEvents();
protected:
virtual void notifyFinished(CachedResource*);
@@ -64,14 +65,18 @@ private:
virtual void dispatchLoadEvent() = 0;
virtual String sourceURI(const AtomicString&) const = 0;
- friend class ImageLoadEventSender;
+ friend class ImageEventSender;
+ void dispatchPendingBeforeLoadEvent();
void dispatchPendingLoadEvent();
void setLoadingImage(CachedImage*);
+ void updateRenderer();
+
Element* m_element;
CachedResourceHandle<CachedImage> m_image;
AtomicString m_failedLoadURL;
+ bool m_firedBeforeLoad : 1;
bool m_firedLoad : 1;
bool m_imageComplete : 1;
bool m_loadManually : 1;
diff --git a/src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp b/src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp
index a3e90fd..c37daef 100644
--- a/src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/MainResourceLoader.cpp
@@ -77,7 +77,7 @@ void MainResourceLoader::receivedError(const ResourceError& error)
if (!cancelled()) {
ASSERT(!reachedTerminalState());
- frameLoader()->didFailToLoad(this, error);
+ frameLoader()->notifier()->didFailToLoad(this, error);
releaseResources();
}
@@ -93,7 +93,7 @@ void MainResourceLoader::didCancel(const ResourceError& error)
RefPtr<MainResourceLoader> protect(this);
if (m_waitingForContentPolicy) {
- frameLoader()->cancelContentPolicyCheck();
+ frameLoader()->policyChecker()->cancelCheck();
ASSERT(m_waitingForContentPolicy);
m_waitingForContentPolicy = false;
deref(); // balances ref in didReceiveResponse
@@ -182,7 +182,7 @@ void MainResourceLoader::willSendRequest(ResourceRequest& newRequest, const Reso
// synchronously for these redirect cases.
if (!redirectResponse.isNull()) {
ref(); // balanced by deref in continueAfterNavigationPolicy
- frameLoader()->checkNavigationPolicy(newRequest, callContinueAfterNavigationPolicy, this);
+ frameLoader()->policyChecker()->checkNavigationPolicy(newRequest, callContinueAfterNavigationPolicy, this);
}
}
@@ -205,7 +205,7 @@ void MainResourceLoader::continueAfterContentPolicy(PolicyAction contentPolicy,
// Prevent remote web archives from loading because they can claim to be from any domain and thus avoid cross-domain security checks (4120255).
bool isRemoteWebArchive = equalIgnoringCase("application/x-webarchive", mimeType) && !m_substituteData.isValid() && !url.isLocalFile();
if (!frameLoader()->canShowMIMEType(mimeType) || isRemoteWebArchive) {
- frameLoader()->cannotShowMIMEType(r);
+ frameLoader()->policyChecker()->cannotShowMIMEType(r);
// Check reachedTerminalState since the load may have already been cancelled inside of _handleUnimplementablePolicyWithErrorCode::.
if (!reachedTerminalState())
stopLoadingForPolicyChange();
@@ -320,7 +320,25 @@ void MainResourceLoader::didReceiveResponse(const ResourceResponse& r)
ASSERT(!m_waitingForContentPolicy);
m_waitingForContentPolicy = true;
ref(); // balanced by deref in continueAfterContentPolicy and didCancel
- frameLoader()->checkContentPolicy(m_response.mimeType(), callContinueAfterContentPolicy, this);
+
+ ASSERT(frameLoader()->activeDocumentLoader());
+
+ // Always show content with valid substitute data.
+ if (frameLoader()->activeDocumentLoader()->substituteData().isValid()) {
+ callContinueAfterContentPolicy(this, PolicyUse);
+ return;
+ }
+
+#if ENABLE(FTPDIR)
+ // Respect the hidden FTP Directory Listing pref so it can be tested even if the policy delegate might otherwise disallow it
+ Settings* settings = m_frame->settings();
+ if (settings && settings->forceFTPDirectoryListings() && m_response.mimeType() == "application/x-ftp-directory") {
+ callContinueAfterContentPolicy(this, PolicyUse);
+ return;
+ }
+#endif
+
+ frameLoader()->policyChecker()->checkContentPolicy(m_response.mimeType(), callContinueAfterContentPolicy, this);
}
void MainResourceLoader::didReceiveData(const char* data, int length, long long lengthReceived, bool allAtOnce)
diff --git a/src/3rdparty/webkit/WebCore/loader/PolicyCallback.cpp b/src/3rdparty/webkit/WebCore/loader/PolicyCallback.cpp
new file mode 100644
index 0000000..14799cf
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/PolicyCallback.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PolicyCallback.h"
+
+#include "FormState.h"
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "HTMLFormElement.h"
+
+namespace WebCore {
+
+PolicyCallback::PolicyCallback()
+ : m_navigationFunction(0)
+ , m_newWindowFunction(0)
+ , m_contentFunction(0)
+{
+}
+
+PolicyCallback::~PolicyCallback()
+{
+}
+
+void PolicyCallback::clear()
+{
+ clearRequest();
+ m_navigationFunction = 0;
+ m_newWindowFunction = 0;
+ m_contentFunction = 0;
+}
+
+void PolicyCallback::set(const ResourceRequest& request, PassRefPtr<FormState> formState,
+ NavigationPolicyDecisionFunction function, void* argument)
+{
+ m_request = request;
+ m_formState = formState;
+ m_frameName = String();
+
+ m_navigationFunction = function;
+ m_newWindowFunction = 0;
+ m_contentFunction = 0;
+ m_argument = argument;
+}
+
+void PolicyCallback::set(const ResourceRequest& request, PassRefPtr<FormState> formState,
+ const String& frameName, NewWindowPolicyDecisionFunction function, void* argument)
+{
+ m_request = request;
+ m_formState = formState;
+ m_frameName = frameName;
+
+ m_navigationFunction = 0;
+ m_newWindowFunction = function;
+ m_contentFunction = 0;
+ m_argument = argument;
+}
+
+void PolicyCallback::set(ContentPolicyDecisionFunction function, void* argument)
+{
+ m_request = ResourceRequest();
+ m_formState = 0;
+ m_frameName = String();
+
+ m_navigationFunction = 0;
+ m_newWindowFunction = 0;
+ m_contentFunction = function;
+ m_argument = argument;
+}
+
+void PolicyCallback::call(bool shouldContinue)
+{
+ if (m_navigationFunction)
+ m_navigationFunction(m_argument, m_request, m_formState.get(), shouldContinue);
+ if (m_newWindowFunction)
+ m_newWindowFunction(m_argument, m_request, m_formState.get(), m_frameName, shouldContinue);
+ ASSERT(!m_contentFunction);
+}
+
+void PolicyCallback::call(PolicyAction action)
+{
+ ASSERT(!m_navigationFunction);
+ ASSERT(!m_newWindowFunction);
+ ASSERT(m_contentFunction);
+ m_contentFunction(m_argument, action);
+}
+
+void PolicyCallback::clearRequest()
+{
+ m_request = ResourceRequest();
+ m_formState = 0;
+ m_frameName = String();
+}
+
+void PolicyCallback::cancel()
+{
+ clearRequest();
+ if (m_navigationFunction)
+ m_navigationFunction(m_argument, m_request, m_formState.get(), false);
+ if (m_newWindowFunction)
+ m_newWindowFunction(m_argument, m_request, m_formState.get(), m_frameName, false);
+ if (m_contentFunction)
+ m_contentFunction(m_argument, PolicyIgnore);
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/loader/PolicyCallback.h b/src/3rdparty/webkit/WebCore/loader/PolicyCallback.h
new file mode 100644
index 0000000..757fff8
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/PolicyCallback.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PolicyCallback_h
+#define PolicyCallback_h
+
+#include "FrameLoaderTypes.h"
+#include "PlatformString.h"
+#include "ResourceRequest.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class FormState;
+
+typedef void (*NavigationPolicyDecisionFunction)(void* argument,
+ const ResourceRequest&, PassRefPtr<FormState>, bool shouldContinue);
+typedef void (*NewWindowPolicyDecisionFunction)(void* argument,
+ const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, bool shouldContinue);
+typedef void (*ContentPolicyDecisionFunction)(void* argument, PolicyAction);
+
+class PolicyCallback {
+public:
+ PolicyCallback();
+ ~PolicyCallback();
+
+ void clear();
+ void set(const ResourceRequest&, PassRefPtr<FormState>,
+ NavigationPolicyDecisionFunction, void* argument);
+ void set(const ResourceRequest&, PassRefPtr<FormState>, const String& frameName,
+ NewWindowPolicyDecisionFunction, void* argument);
+ void set(ContentPolicyDecisionFunction, void* argument);
+
+ const ResourceRequest& request() const { return m_request; }
+ void clearRequest();
+
+ void call(bool shouldContinue);
+ void call(PolicyAction);
+ void cancel();
+
+private:
+ ResourceRequest m_request;
+ RefPtr<FormState> m_formState;
+ String m_frameName;
+
+ NavigationPolicyDecisionFunction m_navigationFunction;
+ NewWindowPolicyDecisionFunction m_newWindowFunction;
+ ContentPolicyDecisionFunction m_contentFunction;
+ void* m_argument;
+};
+
+} // namespace WebCore
+
+#endif // PolicyCallback_h
diff --git a/src/3rdparty/webkit/WebCore/loader/PolicyChecker.cpp b/src/3rdparty/webkit/WebCore/loader/PolicyChecker.cpp
new file mode 100644
index 0000000..196ab4f
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/PolicyChecker.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "PolicyChecker.h"
+
+#include "DocumentLoader.h"
+#include "FormState.h"
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClient.h"
+#include "HTMLFormElement.h"
+
+namespace WebCore {
+
+PolicyChecker::PolicyChecker(Frame* frame)
+ : m_frame(frame)
+ , m_delegateIsDecidingNavigationPolicy(false)
+ , m_delegateIsHandlingUnimplementablePolicy(false)
+ , m_loadType(FrameLoadTypeStandard)
+{
+}
+
+void PolicyChecker::checkNavigationPolicy(const ResourceRequest& newRequest, NavigationPolicyDecisionFunction function, void* argument)
+{
+ checkNavigationPolicy(newRequest, m_frame->loader()->activeDocumentLoader(), 0, function, argument);
+}
+
+void PolicyChecker::checkNavigationPolicy(const ResourceRequest& request, DocumentLoader* loader,
+ PassRefPtr<FormState> formState, NavigationPolicyDecisionFunction function, void* argument)
+{
+ NavigationAction action = loader->triggeringAction();
+ if (action.isEmpty()) {
+ action = NavigationAction(request.url(), NavigationTypeOther);
+ loader->setTriggeringAction(action);
+ }
+
+ // Don't ask more than once for the same request or if we are loading an empty URL.
+ // This avoids confusion on the part of the client.
+ if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) {
+ function(argument, request, 0, true);
+ loader->setLastCheckedRequest(request);
+ return;
+ }
+
+ // We are always willing to show alternate content for unreachable URLs;
+ // treat it like a reload so it maintains the right state for b/f list.
+ if (loader->substituteData().isValid() && !loader->substituteData().failingURL().isEmpty()) {
+ if (isBackForwardLoadType(m_loadType))
+ m_loadType = FrameLoadTypeReload;
+ function(argument, request, 0, true);
+ return;
+ }
+
+ loader->setLastCheckedRequest(request);
+
+ m_callback.set(request, formState.get(), function, argument);
+
+ m_delegateIsDecidingNavigationPolicy = true;
+ m_frame->loader()->client()->dispatchDecidePolicyForNavigationAction(&PolicyChecker::continueAfterNavigationPolicy,
+ action, request, formState);
+ m_delegateIsDecidingNavigationPolicy = false;
+}
+
+void PolicyChecker::checkNewWindowPolicy(const NavigationAction& action, NewWindowPolicyDecisionFunction function,
+ const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, void* argument)
+{
+ m_callback.set(request, formState, frameName, function, argument);
+ m_frame->loader()->client()->dispatchDecidePolicyForNewWindowAction(&PolicyChecker::continueAfterNewWindowPolicy,
+ action, request, formState, frameName);
+}
+
+void PolicyChecker::checkContentPolicy(const String& MIMEType, ContentPolicyDecisionFunction function, void* argument)
+{
+ m_callback.set(function, argument);
+ m_frame->loader()->client()->dispatchDecidePolicyForMIMEType(&PolicyChecker::continueAfterContentPolicy,
+ MIMEType, m_frame->loader()->activeDocumentLoader()->request());
+}
+
+void PolicyChecker::cancelCheck()
+{
+ m_frame->loader()->client()->cancelPolicyCheck();
+ m_callback.clear();
+}
+
+void PolicyChecker::stopCheck()
+{
+ m_frame->loader()->client()->cancelPolicyCheck();
+ PolicyCallback callback = m_callback;
+ m_callback.clear();
+ callback.cancel();
+}
+
+void PolicyChecker::cannotShowMIMEType(const ResourceResponse& response)
+{
+ handleUnimplementablePolicy(m_frame->loader()->client()->cannotShowMIMETypeError(response));
+}
+
+void PolicyChecker::continueLoadAfterWillSubmitForm(PolicyAction)
+{
+ // See header file for an explaination of why this function
+ // isn't like the others.
+ m_frame->loader()->continueLoadAfterWillSubmitForm();
+}
+
+void PolicyChecker::continueAfterNavigationPolicy(PolicyAction policy)
+{
+ PolicyCallback callback = m_callback;
+ m_callback.clear();
+
+ bool shouldContinue = policy == PolicyUse;
+
+ switch (policy) {
+ case PolicyIgnore:
+ callback.clearRequest();
+ break;
+ case PolicyDownload:
+ m_frame->loader()->client()->startDownload(callback.request());
+ callback.clearRequest();
+ break;
+ case PolicyUse: {
+ ResourceRequest request(callback.request());
+
+ if (!m_frame->loader()->client()->canHandleRequest(request)) {
+ handleUnimplementablePolicy(m_frame->loader()->cannotShowURLError(callback.request()));
+ callback.clearRequest();
+ shouldContinue = false;
+ }
+ break;
+ }
+ }
+
+ callback.call(shouldContinue);
+}
+
+void PolicyChecker::continueAfterNewWindowPolicy(PolicyAction policy)
+{
+ PolicyCallback callback = m_callback;
+ m_callback.clear();
+
+ switch (policy) {
+ case PolicyIgnore:
+ callback.clearRequest();
+ break;
+ case PolicyDownload:
+ m_frame->loader()->client()->startDownload(callback.request());
+ callback.clearRequest();
+ break;
+ case PolicyUse:
+ break;
+ }
+
+ callback.call(policy == PolicyUse);
+}
+
+void PolicyChecker::continueAfterContentPolicy(PolicyAction policy)
+{
+ PolicyCallback callback = m_callback;
+ m_callback.clear();
+ callback.call(policy);
+}
+
+void PolicyChecker::handleUnimplementablePolicy(const ResourceError& error)
+{
+ m_delegateIsHandlingUnimplementablePolicy = true;
+ m_frame->loader()->client()->dispatchUnableToImplementPolicy(error);
+ m_delegateIsHandlingUnimplementablePolicy = false;
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/loader/PolicyChecker.h b/src/3rdparty/webkit/WebCore/loader/PolicyChecker.h
new file mode 100644
index 0000000..541729c
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/PolicyChecker.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PolicyChecker_h
+#define PolicyChecker_h
+
+#include "FrameLoaderTypes.h"
+#include "PlatformString.h"
+#include "PolicyCallback.h"
+#include "ResourceRequest.h"
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+class DocumentLoader;
+class FormState;
+class Frame;
+class NavigationAction;
+class ResourceError;
+class ResourceResponse;
+
+class PolicyChecker : public Noncopyable {
+public:
+ PolicyChecker(Frame*);
+
+ void checkNavigationPolicy(const ResourceRequest&, DocumentLoader*, PassRefPtr<FormState>, NavigationPolicyDecisionFunction, void* argument);
+ void checkNavigationPolicy(const ResourceRequest&, NavigationPolicyDecisionFunction, void* argument);
+ void checkNewWindowPolicy(const NavigationAction&, NewWindowPolicyDecisionFunction, const ResourceRequest&, PassRefPtr<FormState>, const String& frameName, void* argument);
+ void checkContentPolicy(const String& MIMEType, ContentPolicyDecisionFunction, void* argument);
+
+ // FIXME: These are different. They could use better names.
+ void cancelCheck();
+ void stopCheck();
+
+ void cannotShowMIMEType(const ResourceResponse&);
+
+ FrameLoadType loadType() const { return m_loadType; }
+ void setLoadType(FrameLoadType loadType) { m_loadType = loadType; }
+
+ bool delegateIsDecidingNavigationPolicy() const { return m_delegateIsDecidingNavigationPolicy; }
+ bool delegateIsHandlingUnimplementablePolicy() const { return m_delegateIsHandlingUnimplementablePolicy; }
+
+ // FIXME: This function is a cheat. Basically, this is just an asynchronouc callback
+ // from the FrameLoaderClient, but this callback uses the policy types and so has to
+ // live on this object. In the long term, we should create a type for non-policy
+ // callbacks from the FrameLoaderClient and remove this vestige. I just don't have
+ // the heart to hack on all the platforms to make that happen right now.
+ void continueLoadAfterWillSubmitForm(PolicyAction);
+
+private:
+ void continueAfterNavigationPolicy(PolicyAction);
+ void continueAfterNewWindowPolicy(PolicyAction);
+ void continueAfterContentPolicy(PolicyAction);
+
+ void handleUnimplementablePolicy(const ResourceError&);
+
+ Frame* m_frame;
+
+ bool m_delegateIsDecidingNavigationPolicy;
+ bool m_delegateIsHandlingUnimplementablePolicy;
+
+ // This identifies the type of navigation action which prompted this load. Note
+ // that WebKit conveys this value as the WebActionNavigationTypeKey value
+ // on navigation action delegate callbacks.
+ FrameLoadType m_loadType;
+ PolicyCallback m_callback;
+};
+
+} // namespace WebCore
+
+#endif // PolicyChecker_h
diff --git a/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp
new file mode 100644
index 0000000..f015c12
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ * Copyright (C) 2009 Adam Barth. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RedirectScheduler.h"
+
+#include "DocumentLoader.h"
+#include "Event.h"
+#include "FormState.h"
+#include "Frame.h"
+#include "FrameLoadRequest.h"
+#include "FrameLoader.h"
+#include "HTMLFormElement.h"
+#include <wtf/CurrentTime.h>
+
+namespace WebCore {
+
+struct ScheduledRedirection {
+ enum Type { redirection, locationChange, historyNavigation, formSubmission };
+
+ const Type type;
+ const double delay;
+ const String url;
+ const String referrer;
+ const FrameLoadRequest frameRequest;
+ const RefPtr<Event> event;
+ const RefPtr<FormState> formState;
+ const int historySteps;
+ const bool lockHistory;
+ const bool lockBackForwardList;
+ const bool wasUserGesture;
+ const bool wasRefresh;
+ const bool wasDuringLoad;
+ bool toldClient;
+
+ ScheduledRedirection(double delay, const String& url, bool lockHistory, bool lockBackForwardList, bool wasUserGesture, bool refresh)
+ : type(redirection)
+ , delay(delay)
+ , url(url)
+ , historySteps(0)
+ , lockHistory(lockHistory)
+ , lockBackForwardList(lockBackForwardList)
+ , wasUserGesture(wasUserGesture)
+ , wasRefresh(refresh)
+ , wasDuringLoad(false)
+ , toldClient(false)
+ {
+ ASSERT(!url.isEmpty());
+ }
+
+ ScheduledRedirection(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture, bool refresh, bool duringLoad)
+ : type(locationChange)
+ , delay(0)
+ , url(url)
+ , referrer(referrer)
+ , historySteps(0)
+ , lockHistory(lockHistory)
+ , lockBackForwardList(lockBackForwardList)
+ , wasUserGesture(wasUserGesture)
+ , wasRefresh(refresh)
+ , wasDuringLoad(duringLoad)
+ , toldClient(false)
+ {
+ ASSERT(!url.isEmpty());
+ }
+
+ explicit ScheduledRedirection(int historyNavigationSteps)
+ : type(historyNavigation)
+ , delay(0)
+ , historySteps(historyNavigationSteps)
+ , lockHistory(false)
+ , lockBackForwardList(false)
+ , wasUserGesture(false)
+ , wasRefresh(false)
+ , wasDuringLoad(false)
+ , toldClient(false)
+ {
+ }
+
+ ScheduledRedirection(const FrameLoadRequest& frameRequest,
+ bool lockHistory, bool lockBackForwardList, PassRefPtr<Event> event, PassRefPtr<FormState> formState,
+ bool duringLoad)
+ : type(formSubmission)
+ , delay(0)
+ , frameRequest(frameRequest)
+ , event(event)
+ , formState(formState)
+ , historySteps(0)
+ , lockHistory(lockHistory)
+ , lockBackForwardList(lockBackForwardList)
+ , wasUserGesture(false)
+ , wasRefresh(false)
+ , wasDuringLoad(duringLoad)
+ , toldClient(false)
+ {
+ ASSERT(!frameRequest.isEmpty());
+ ASSERT(this->formState);
+ }
+};
+
+RedirectScheduler::RedirectScheduler(Frame* frame)
+ : m_frame(frame)
+ , m_timer(this, &RedirectScheduler::timerFired)
+{
+}
+
+RedirectScheduler::~RedirectScheduler()
+{
+}
+
+bool RedirectScheduler::redirectScheduledDuringLoad()
+{
+ return m_scheduledRedirection && m_scheduledRedirection->wasDuringLoad;
+}
+
+void RedirectScheduler::clear()
+{
+ m_timer.stop();
+ m_scheduledRedirection.clear();
+}
+
+void RedirectScheduler::scheduleRedirect(double delay, const String& url)
+{
+ if (delay < 0 || delay > INT_MAX / 1000)
+ return;
+
+ if (!m_frame->page())
+ return;
+
+ if (url.isEmpty())
+ return;
+
+ // We want a new history item if the refresh timeout is > 1 second.
+ if (!m_scheduledRedirection || delay <= m_scheduledRedirection->delay)
+ schedule(new ScheduledRedirection(delay, url, true, delay <= 1, false, false));
+}
+
+bool RedirectScheduler::mustLockBackForwardList(Frame* targetFrame)
+{
+ // Navigation of a subframe during loading of an ancestor frame does not create a new back/forward item.
+ // The definition of "during load" is any time before all handlers for the load event have been run.
+ // See https://bugs.webkit.org/show_bug.cgi?id=14957 for the original motivation for this.
+
+ for (Frame* ancestor = targetFrame->tree()->parent(); ancestor; ancestor = ancestor->tree()->parent()) {
+ Document* document = ancestor->document();
+ if (!ancestor->loader()->isComplete() || document && document->processingLoadEvent())
+ return true;
+ }
+ return false;
+}
+
+void RedirectScheduler::scheduleLocationChange(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture)
+{
+ if (!m_frame->page())
+ return;
+
+ if (url.isEmpty())
+ return;
+
+ lockBackForwardList = lockBackForwardList || mustLockBackForwardList(m_frame);
+
+ FrameLoader* loader = m_frame->loader();
+
+ // If the URL we're going to navigate to is the same as the current one, except for the
+ // fragment part, we don't need to schedule the location change.
+ KURL parsedURL(ParsedURLString, url);
+ if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(loader->url(), parsedURL)) {
+ loader->changeLocation(loader->completeURL(url), referrer, lockHistory, lockBackForwardList, wasUserGesture);
+ return;
+ }
+
+ // Handle a location change of a page with no document as a special case.
+ // This may happen when a frame changes the location of another frame.
+ bool duringLoad = !loader->committedFirstRealDocumentLoad();
+
+ schedule(new ScheduledRedirection(url, referrer, lockHistory, lockBackForwardList, wasUserGesture, false, duringLoad));
+}
+
+void RedirectScheduler::scheduleFormSubmission(const FrameLoadRequest& frameRequest,
+ bool lockHistory, PassRefPtr<Event> event, PassRefPtr<FormState> formState)
+{
+ ASSERT(m_frame->page());
+ ASSERT(!frameRequest.isEmpty());
+
+ // FIXME: Do we need special handling for form submissions where the URL is the same
+ // as the current one except for the fragment part? See scheduleLocationChange above.
+
+ // Handle a location change of a page with no document as a special case.
+ // This may happen when a frame changes the location of another frame.
+ bool duringLoad = !m_frame->loader()->committedFirstRealDocumentLoad();
+
+ schedule(new ScheduledRedirection(frameRequest, lockHistory, mustLockBackForwardList(m_frame), event, formState, duringLoad));
+}
+
+void RedirectScheduler::scheduleRefresh(bool wasUserGesture)
+{
+ if (!m_frame->page())
+ return;
+
+ const KURL& url = m_frame->loader()->url();
+
+ if (url.isEmpty())
+ return;
+
+ schedule(new ScheduledRedirection(url.string(), m_frame->loader()->outgoingReferrer(), true, true, wasUserGesture, true, false));
+}
+
+bool RedirectScheduler::locationChangePending()
+{
+ if (!m_scheduledRedirection)
+ return false;
+
+ switch (m_scheduledRedirection->type) {
+ case ScheduledRedirection::redirection:
+ return false;
+ case ScheduledRedirection::historyNavigation:
+ case ScheduledRedirection::locationChange:
+ case ScheduledRedirection::formSubmission:
+ return true;
+ }
+ ASSERT_NOT_REACHED();
+ return false;
+}
+
+void RedirectScheduler::scheduleHistoryNavigation(int steps)
+{
+ if (!m_frame->page())
+ return;
+
+ schedule(new ScheduledRedirection(steps));
+}
+
+void RedirectScheduler::timerFired(Timer<RedirectScheduler>*)
+{
+ ASSERT(m_frame->page());
+
+ if (m_frame->page()->defersLoading())
+ return;
+
+ OwnPtr<ScheduledRedirection> redirection(m_scheduledRedirection.release());
+ FrameLoader* loader = m_frame->loader();
+
+ switch (redirection->type) {
+ case ScheduledRedirection::redirection:
+ case ScheduledRedirection::locationChange:
+ loader->changeLocation(KURL(ParsedURLString, redirection->url), redirection->referrer,
+ redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, redirection->wasRefresh);
+ return;
+ case ScheduledRedirection::historyNavigation:
+ if (redirection->historySteps == 0) {
+ // Special case for go(0) from a frame -> reload only the frame
+ loader->urlSelected(loader->url(), "", 0, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, SendReferrer);
+ return;
+ }
+ // go(i!=0) from a frame navigates into the history of the frame only,
+ // in both IE and NS (but not in Mozilla). We can't easily do that.
+ if (m_frame->page()->canGoBackOrForward(redirection->historySteps))
+ m_frame->page()->goBackOrForward(redirection->historySteps);
+ return;
+ case ScheduledRedirection::formSubmission:
+ // The submitForm function will find a target frame before using the redirection timer.
+ // Now that the timer has fired, we need to repeat the security check which normally is done when
+ // selecting a target, in case conditions have changed. Other code paths avoid this by targeting
+ // without leaving a time window. If we fail the check just silently drop the form submission.
+ if (!redirection->formState->sourceFrame()->loader()->shouldAllowNavigation(m_frame))
+ return;
+ loader->loadFrameRequest(redirection->frameRequest, redirection->lockHistory, redirection->lockBackForwardList,
+ redirection->event, redirection->formState, SendReferrer);
+ return;
+ }
+
+ ASSERT_NOT_REACHED();
+}
+
+void RedirectScheduler::schedule(PassOwnPtr<ScheduledRedirection> redirection)
+{
+ ASSERT(m_frame->page());
+ FrameLoader* loader = m_frame->loader();
+
+ // If a redirect was scheduled during a load, then stop the current load.
+ // Otherwise when the current load transitions from a provisional to a
+ // committed state, pending redirects may be cancelled.
+ if (redirection->wasDuringLoad) {
+ if (DocumentLoader* provisionalDocumentLoader = loader->provisionalDocumentLoader())
+ provisionalDocumentLoader->stopLoading();
+ loader->stopLoading(UnloadEventPolicyUnloadAndPageHide);
+ }
+
+ cancel();
+ m_scheduledRedirection = redirection;
+ if (!loader->isComplete() && m_scheduledRedirection->type != ScheduledRedirection::redirection)
+ loader->completed();
+ startTimer();
+}
+
+void RedirectScheduler::startTimer()
+{
+ if (!m_scheduledRedirection)
+ return;
+
+ ASSERT(m_frame->page());
+
+ FrameLoader* loader = m_frame->loader();
+
+ if (m_timer.isActive())
+ return;
+
+ if (m_scheduledRedirection->type == ScheduledRedirection::redirection && !loader->allAncestorsAreComplete())
+ return;
+
+ m_timer.startOneShot(m_scheduledRedirection->delay);
+
+ switch (m_scheduledRedirection->type) {
+ case ScheduledRedirection::locationChange:
+ case ScheduledRedirection::redirection:
+ if (m_scheduledRedirection->toldClient)
+ return;
+ m_scheduledRedirection->toldClient = true;
+ loader->clientRedirected(KURL(ParsedURLString, m_scheduledRedirection->url),
+ m_scheduledRedirection->delay,
+ currentTime() + m_timer.nextFireInterval(),
+ m_scheduledRedirection->lockBackForwardList);
+ return;
+ case ScheduledRedirection::formSubmission:
+ // FIXME: It would make sense to report form submissions as client redirects too.
+ // But we didn't do that in the past when form submission used a separate delay
+ // mechanism, so doing it will be a behavior change.
+ return;
+ case ScheduledRedirection::historyNavigation:
+ // Don't report history navigations.
+ return;
+ }
+ ASSERT_NOT_REACHED();
+}
+
+void RedirectScheduler::cancel(bool newLoadInProgress)
+{
+ m_timer.stop();
+
+ OwnPtr<ScheduledRedirection> redirection(m_scheduledRedirection.release());
+ if (redirection && redirection->toldClient)
+ m_frame->loader()->clientRedirectCancelledOrFinished(newLoadInProgress);
+}
+
+} // namespace WebCore
+
diff --git a/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.h b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.h
new file mode 100644
index 0000000..005a173
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ * Copyright (C) 2009 Adam Barth. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RedirectScheduler_h
+#define RedirectScheduler_h
+
+#include "Event.h"
+#include "Timer.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+class FormState;
+class Frame;
+class String;
+
+struct FrameLoadRequest;
+struct ScheduledRedirection;
+
+class RedirectScheduler : public Noncopyable {
+public:
+ RedirectScheduler(Frame*);
+ ~RedirectScheduler();
+
+ bool redirectScheduledDuringLoad();
+ bool locationChangePending();
+
+ void scheduleRedirect(double delay, const String& url);
+ void scheduleLocationChange(const String& url, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool userGesture = false);
+ void scheduleFormSubmission(const FrameLoadRequest&, bool lockHistory, PassRefPtr<Event>, PassRefPtr<FormState>);
+ void scheduleRefresh(bool userGesture = false);
+ void scheduleHistoryNavigation(int steps);
+
+ void startTimer();
+
+ void cancel(bool newLoadInProgress = false);
+ void clear();
+
+private:
+ void timerFired(Timer<RedirectScheduler>*);
+ void schedule(PassOwnPtr<ScheduledRedirection>);
+
+ static bool mustLockBackForwardList(Frame* targetFrame);
+
+ Frame* m_frame;
+ Timer<RedirectScheduler> m_timer;
+ OwnPtr<ScheduledRedirection> m_scheduledRedirection;
+};
+
+} // namespace WebCore
+
+#endif // FrameLoader_h
diff --git a/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.cpp b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.cpp
new file mode 100644
index 0000000..4cddd01
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ResourceLoadNotifier.h"
+
+#include "DocumentLoader.h"
+#include "Frame.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClient.h"
+#include "InspectorController.h"
+#include "Page.h"
+#include "ProgressTracker.h"
+#include "ResourceLoader.h"
+
+namespace WebCore {
+
+ResourceLoadNotifier::ResourceLoadNotifier(Frame* frame)
+ : m_frame(frame)
+{
+}
+
+void ResourceLoadNotifier::didReceiveAuthenticationChallenge(ResourceLoader* loader, const AuthenticationChallenge& currentWebChallenge)
+{
+ m_frame->loader()->client()->dispatchDidReceiveAuthenticationChallenge(loader->documentLoader(), loader->identifier(), currentWebChallenge);
+}
+
+void ResourceLoadNotifier::didCancelAuthenticationChallenge(ResourceLoader* loader, const AuthenticationChallenge& currentWebChallenge)
+{
+ m_frame->loader()->client()->dispatchDidCancelAuthenticationChallenge(loader->documentLoader(), loader->identifier(), currentWebChallenge);
+}
+
+void ResourceLoadNotifier::willSendRequest(ResourceLoader* loader, ResourceRequest& clientRequest, const ResourceResponse& redirectResponse)
+{
+ m_frame->loader()->applyUserAgent(clientRequest);
+
+ dispatchWillSendRequest(loader->documentLoader(), loader->identifier(), clientRequest, redirectResponse);
+}
+
+void ResourceLoadNotifier::didReceiveResponse(ResourceLoader* loader, const ResourceResponse& r)
+{
+ loader->documentLoader()->addResponse(r);
+
+ if (Page* page = m_frame->page())
+ page->progress()->incrementProgress(loader->identifier(), r);
+
+ dispatchDidReceiveResponse(loader->documentLoader(), loader->identifier(), r);
+}
+
+void ResourceLoadNotifier::didReceiveData(ResourceLoader* loader, const char* data, int length, int lengthReceived)
+{
+ if (Page* page = m_frame->page())
+ page->progress()->incrementProgress(loader->identifier(), data, length);
+
+ dispatchDidReceiveContentLength(loader->documentLoader(), loader->identifier(), lengthReceived);
+}
+
+void ResourceLoadNotifier::didFinishLoad(ResourceLoader* loader)
+{
+ if (Page* page = m_frame->page())
+ page->progress()->completeProgress(loader->identifier());
+ dispatchDidFinishLoading(loader->documentLoader(), loader->identifier());
+}
+
+void ResourceLoadNotifier::didFailToLoad(ResourceLoader* loader, const ResourceError& error)
+{
+ if (Page* page = m_frame->page())
+ page->progress()->completeProgress(loader->identifier());
+
+ if (!error.isNull())
+ m_frame->loader()->client()->dispatchDidFailLoading(loader->documentLoader(), loader->identifier(), error);
+}
+
+void ResourceLoadNotifier::didLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString)
+{
+ m_frame->loader()->client()->dispatchDidLoadResourceByXMLHttpRequest(identifier, sourceString);
+}
+
+void ResourceLoadNotifier::assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request)
+{
+ m_frame->loader()->client()->assignIdentifierToInitialRequest(identifier, loader, request);
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = m_frame->page())
+ page->inspectorController()->identifierForInitialRequest(identifier, loader, request);
+#endif
+}
+
+void ResourceLoadNotifier::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse)
+{
+ StringImpl* oldRequestURL = request.url().string().impl();
+ m_frame->loader()->documentLoader()->didTellClientAboutLoad(request.url());
+
+ m_frame->loader()->client()->dispatchWillSendRequest(loader, identifier, request, redirectResponse);
+
+ // If the URL changed, then we want to put that new URL in the "did tell client" set too.
+ if (!request.isNull() && oldRequestURL != request.url().string().impl())
+ m_frame->loader()->documentLoader()->didTellClientAboutLoad(request.url());
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = m_frame->page())
+ page->inspectorController()->willSendRequest(loader, identifier, request, redirectResponse);
+#endif
+}
+
+void ResourceLoadNotifier::dispatchDidReceiveResponse(DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r)
+{
+ m_frame->loader()->client()->dispatchDidReceiveResponse(loader, identifier, r);
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = m_frame->page())
+ page->inspectorController()->didReceiveResponse(loader, identifier, r);
+#endif
+}
+
+void ResourceLoadNotifier::dispatchDidReceiveContentLength(DocumentLoader* loader, unsigned long identifier, int length)
+{
+ m_frame->loader()->client()->dispatchDidReceiveContentLength(loader, identifier, length);
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = m_frame->page())
+ page->inspectorController()->didReceiveContentLength(loader, identifier, length);
+#endif
+}
+
+void ResourceLoadNotifier::dispatchDidFinishLoading(DocumentLoader* loader, unsigned long identifier)
+{
+ m_frame->loader()->client()->dispatchDidFinishLoading(loader, identifier);
+
+#if ENABLE(INSPECTOR)
+ if (Page* page = m_frame->page())
+ page->inspectorController()->didFinishLoading(loader, identifier);
+#endif
+}
+
+void ResourceLoadNotifier::sendRemainingDelegateMessages(DocumentLoader* loader, unsigned long identifier, const ResourceResponse& response, int length, const ResourceError& error)
+{
+ if (!response.isNull())
+ dispatchDidReceiveResponse(loader, identifier, response);
+
+ if (length > 0)
+ dispatchDidReceiveContentLength(loader, identifier, length);
+
+ if (error.isNull())
+ dispatchDidFinishLoading(loader, identifier);
+ else
+ m_frame->loader()->client()->dispatchDidFailLoading(loader, identifier, error);
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h
new file mode 100644
index 0000000..f06ecde
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ResourceLoadNotifier_h
+#define ResourceLoadNotifier_h
+
+#include <wtf/Noncopyable.h>
+
+namespace WebCore {
+
+class AuthenticationChallenge;
+class DocumentLoader;
+class Frame;
+class ResourceError;
+class ResourceLoader;
+class ResourceResponse;
+//### tempfix, to be removed
+#ifdef __SYMBIAN32__
+struct ResourceRequest;
+#else
+class ResourceRequest;
+#endif
+class ScriptString;
+
+class ResourceLoadNotifier : public Noncopyable {
+public:
+ ResourceLoadNotifier(Frame*);
+
+ void didReceiveAuthenticationChallenge(ResourceLoader*, const AuthenticationChallenge&);
+ void didCancelAuthenticationChallenge(ResourceLoader*, const AuthenticationChallenge&);
+
+ void willSendRequest(ResourceLoader*, ResourceRequest&, const ResourceResponse& redirectResponse);
+ void didReceiveResponse(ResourceLoader*, const ResourceResponse&);
+ void didReceiveData(ResourceLoader*, const char*, int, int lengthReceived);
+ void didFinishLoad(ResourceLoader*);
+ void didFailToLoad(ResourceLoader*, const ResourceError&);
+ void didLoadResourceByXMLHttpRequest(unsigned long identifier, const ScriptString& sourceString);
+
+ void assignIdentifierToInitialRequest(unsigned long identifier, DocumentLoader*, const ResourceRequest&);
+ void dispatchWillSendRequest(DocumentLoader*, unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
+ void dispatchDidReceiveResponse(DocumentLoader*, unsigned long identifier, const ResourceResponse&);
+ void dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int length);
+ void dispatchDidFinishLoading(DocumentLoader*, unsigned long identifier);
+
+ void sendRemainingDelegateMessages(DocumentLoader*, unsigned long identifier, const ResourceResponse&, int length, const ResourceError&);
+
+private:
+ Frame* m_frame;
+};
+
+} // namespace WebCore
+
+#endif // ResourceLoadNotifier_h
diff --git a/src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp b/src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp
index ee7dea9..9244cf0 100644
--- a/src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/ResourceLoader.cpp
@@ -197,18 +197,18 @@ void ResourceLoader::willSendRequest(ResourceRequest& request, const ResourceRes
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
RefPtr<ResourceLoader> protector(this);
-
+
ASSERT(!m_reachedTerminalState);
if (m_sendResourceLoadCallbacks) {
if (!m_identifier) {
m_identifier = m_frame->page()->progress()->createUniqueIdentifier();
- frameLoader()->assignIdentifierToInitialRequest(m_identifier, request);
+ frameLoader()->notifier()->assignIdentifierToInitialRequest(m_identifier, documentLoader(), request);
}
- frameLoader()->willSendRequest(this, request, redirectResponse);
+ frameLoader()->notifier()->willSendRequest(this, request, redirectResponse);
}
-
+
m_request = request;
}
@@ -230,7 +230,7 @@ void ResourceLoader::didReceiveResponse(const ResourceResponse& r)
data->removeGeneratedFilesIfNeeded();
if (m_sendResourceLoadCallbacks)
- frameLoader()->didReceiveResponse(this, m_response);
+ frameLoader()->notifier()->didReceiveResponse(this, m_response);
}
void ResourceLoader::didReceiveData(const char* data, int length, long long lengthReceived, bool allAtOnce)
@@ -250,7 +250,7 @@ void ResourceLoader::didReceiveData(const char* data, int length, long long leng
// However, with today's computers and networking speeds, this won't happen in practice.
// Could be an issue with a giant local file.
if (m_sendResourceLoadCallbacks && m_frame)
- frameLoader()->didReceiveData(this, data, length, static_cast<int>(lengthReceived));
+ frameLoader()->notifier()->didReceiveData(this, data, length, static_cast<int>(lengthReceived));
}
void ResourceLoader::willStopBufferingData(const char* data, int length)
@@ -284,7 +284,7 @@ void ResourceLoader::didFinishLoadingOnePart()
return;
m_calledDidFinishLoad = true;
if (m_sendResourceLoadCallbacks)
- frameLoader()->didFinishLoad(this);
+ frameLoader()->notifier()->didFinishLoad(this);
}
void ResourceLoader::didFail(const ResourceError& error)
@@ -301,7 +301,7 @@ void ResourceLoader::didFail(const ResourceError& error)
data->removeGeneratedFilesIfNeeded();
if (m_sendResourceLoadCallbacks && !m_calledDidFinishLoad)
- frameLoader()->didFailToLoad(this, error);
+ frameLoader()->notifier()->didFailToLoad(this, error);
releaseResources();
}
@@ -330,7 +330,7 @@ void ResourceLoader::didCancel(const ResourceError& error)
m_handle = 0;
}
if (m_sendResourceLoadCallbacks && !m_calledDidFinishLoad)
- frameLoader()->didFailToLoad(this, error);
+ frameLoader()->notifier()->didFailToLoad(this, error);
releaseResources();
}
@@ -433,7 +433,7 @@ void ResourceLoader::didReceiveAuthenticationChallenge(const AuthenticationChall
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
RefPtr<ResourceLoader> protector(this);
- frameLoader()->didReceiveAuthenticationChallenge(this, challenge);
+ frameLoader()->notifier()->didReceiveAuthenticationChallenge(this, challenge);
}
void ResourceLoader::didCancelAuthenticationChallenge(const AuthenticationChallenge& challenge)
@@ -441,7 +441,7 @@ void ResourceLoader::didCancelAuthenticationChallenge(const AuthenticationChalle
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
RefPtr<ResourceLoader> protector(this);
- frameLoader()->didCancelAuthenticationChallenge(this, challenge);
+ frameLoader()->notifier()->didCancelAuthenticationChallenge(this, challenge);
}
void ResourceLoader::receivedCancellation(const AuthenticationChallenge&)
diff --git a/src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp b/src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp
index 047cc6d..2ee4626 100644
--- a/src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/SubresourceLoader.cpp
@@ -33,6 +33,7 @@
#include "Frame.h"
#include "FrameLoader.h"
#include "ResourceHandle.h"
+#include "SecurityOrigin.h"
#include "SubresourceLoaderClient.h"
#include <wtf/RefCountedLeakCounter.h>
@@ -72,13 +73,13 @@ PassRefPtr<SubresourceLoader> SubresourceLoader::create(Frame* frame, Subresourc
ResourceRequest newRequest = request;
if (!skipCanLoadCheck
- && FrameLoader::restrictAccessToLocal()
- && !FrameLoader::canLoad(request.url(), String(), frame->document())) {
+ && SecurityOrigin::restrictAccessToLocal()
+ && !SecurityOrigin::canLoad(request.url(), String(), frame->document())) {
FrameLoader::reportLocalLoadFailed(frame, request.url().string());
return 0;
}
- if (FrameLoader::shouldHideReferrer(request.url(), fl->outgoingReferrer()))
+ if (SecurityOrigin::shouldHideReferrer(request.url(), fl->outgoingReferrer()))
newRequest.clearHTTPReferrer();
else if (!request.httpReferrer())
newRequest.setHTTPReferrer(fl->outgoingReferrer());
diff --git a/src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp b/src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp
index 6819759..bd362f4 100644
--- a/src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/WorkerThreadableLoader.cpp
@@ -91,7 +91,7 @@ WorkerThreadableLoader::MainThreadBridge::MainThreadBridge(PassRefPtr<Threadable
const ResourceRequest& request, const ThreadableLoaderOptions& options)
: m_workerClientWrapper(workerClientWrapper)
, m_loaderProxy(loaderProxy)
- , m_taskMode(taskMode.copy())
+ , m_taskMode(taskMode.crossThreadString())
{
ASSERT(m_workerClientWrapper.get());
m_loaderProxy.postTaskToLoader(createCallbackTask(&MainThreadBridge::mainThreadCreateLoader, this, request, options));
diff --git a/src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp b/src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp
index ed27ba0..c66f36f 100644
--- a/src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/appcache/ApplicationCacheGroup.cpp
@@ -158,7 +158,7 @@ void ApplicationCacheGroup::selectCache(Frame* frame, const KURL& passedManifest
// Restart the current navigation from the top of the navigation algorithm, undoing any changes that were made
// as part of the initial load.
// The navigation will not result in the same resource being loaded, because "foreign" entries are never picked during navigation.
- frame->loader()->scheduleLocationChange(documentLoader->url(), frame->loader()->referrer(), true);
+ frame->redirectScheduler()->scheduleLocationChange(documentLoader->url(), frame->loader()->referrer(), true);
}
return;
diff --git a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp
index b78291d..78ca0a5 100644
--- a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp
@@ -128,7 +128,7 @@ bool IconDatabase::open(const String& databasePath)
return false;
}
- m_databaseDirectory = databasePath.copy();
+ m_databaseDirectory = databasePath.crossThreadString();
// Formulate the full path for the database file
m_completeDatabasePath = pathByAppendingComponent(m_databaseDirectory, defaultDatabaseFilename());
@@ -227,7 +227,7 @@ Image* IconDatabase::iconForPageURL(const String& pageURLOriginal, const IntSize
PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
if (!pageRecord) {
- pageURLCopy = pageURLOriginal.copy();
+ pageURLCopy = pageURLOriginal.crossThreadString();
pageRecord = getOrCreatePageURLRecord(pageURLCopy);
}
@@ -263,7 +263,7 @@ Image* IconDatabase::iconForPageURL(const String& pageURLOriginal, const IntSize
// mark it to be read by the background thread
if (iconRecord->imageDataStatus() == ImageDataStatusUnknown) {
if (pageURLCopy.isNull())
- pageURLCopy = pageURLOriginal.copy();
+ pageURLCopy = pageURLOriginal.crossThreadString();
MutexLocker locker(m_pendingReadingLock);
m_pageURLsInterestedInIcons.add(pageURLCopy);
@@ -312,7 +312,7 @@ String IconDatabase::iconURLForPageURL(const String& pageURLOriginal)
PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
if (!pageRecord)
- pageRecord = getOrCreatePageURLRecord(pageURLOriginal.copy());
+ pageRecord = getOrCreatePageURLRecord(pageURLOriginal.crossThreadString());
// If pageRecord is NULL, one of two things is true -
// 1 - The initial url import is incomplete and this pageURL has already been marked to be notified once it is complete if an iconURL exists
@@ -321,7 +321,7 @@ String IconDatabase::iconURLForPageURL(const String& pageURLOriginal)
return String();
// Possible the pageRecord is around because it's a retained pageURL with no iconURL, so we have to check
- return pageRecord->iconRecord() ? pageRecord->iconRecord()->iconURL().copy() : String();
+ return pageRecord->iconRecord() ? pageRecord->iconRecord()->iconURL().threadsafeCopy() : String();
}
#ifdef CAN_THEME_URL_ICON
@@ -405,7 +405,7 @@ void IconDatabase::retainIconForPageURL(const String& pageURLOriginal)
String pageURL;
if (!record) {
- pageURL = pageURLOriginal.copy();
+ pageURL = pageURLOriginal.crossThreadString();
record = new PageURLRecord(pageURL);
m_pageURLToRecordMap.set(pageURL, record);
@@ -413,7 +413,7 @@ void IconDatabase::retainIconForPageURL(const String& pageURLOriginal)
if (!record->retain()) {
if (pageURL.isNull())
- pageURL = pageURLOriginal.copy();
+ pageURL = pageURLOriginal.crossThreadString();
// This page just had its retain count bumped from 0 to 1 - Record that fact
m_retainedPageURLs.add(pageURL);
@@ -488,7 +488,7 @@ void IconDatabase::releaseIconForPageURL(const String& pageURLOriginal)
// Mark stuff for deletion from the database only if we're not in private browsing
if (!m_privateBrowsingEnabled) {
MutexLocker locker(m_pendingSyncLock);
- m_pageURLsPendingSync.set(pageURLOriginal.copy(), pageRecord->snapshot(true));
+ m_pageURLsPendingSync.set(pageURLOriginal.crossThreadString(), pageRecord->snapshot(true));
// If this page is the last page to refer to a particular IconRecord, that IconRecord needs to
// be marked for deletion
@@ -512,7 +512,7 @@ void IconDatabase::setIconDataForIconURL(PassRefPtr<SharedBuffer> dataOriginal,
return;
RefPtr<SharedBuffer> data = dataOriginal ? dataOriginal->copy() : 0;
- String iconURL = iconURLOriginal.copy();
+ String iconURL = iconURLOriginal.crossThreadString();
Vector<String> pageURLs;
{
@@ -589,8 +589,8 @@ void IconDatabase::setIconURLForPageURL(const String& iconURLOriginal, const Str
if (pageRecord && pageRecord->iconRecord() && pageRecord->iconRecord()->iconURL() == iconURLOriginal)
return;
- pageURL = pageURLOriginal.copy();
- iconURL = iconURLOriginal.copy();
+ pageURL = pageURLOriginal.crossThreadString();
+ iconURL = iconURLOriginal.crossThreadString();
if (!pageRecord) {
pageRecord = new PageURLRecord(pageURL);
@@ -847,13 +847,13 @@ bool IconDatabase::isOpen() const
String IconDatabase::databasePath() const
{
MutexLocker locker(m_syncLock);
- return m_completeDatabasePath.copy();
+ return m_completeDatabasePath.threadsafeCopy();
}
String IconDatabase::defaultDatabaseFilename()
{
DEFINE_STATIC_LOCAL(String, defaultDatabaseFilename, ("WebpageIcons.db"));
- return defaultDatabaseFilename.copy();
+ return defaultDatabaseFilename.threadsafeCopy();
}
// Unlike getOrCreatePageURLRecord(), getOrCreateIconRecord() does not mark the icon as "interested in import"
diff --git a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp
index 03a7964..7b7cc9f 100644
--- a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp
+++ b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabaseNone.cpp
@@ -53,7 +53,7 @@ const int updateTimerDelay = 5;
String IconDatabase::defaultDatabaseFilename()
{
DEFINE_STATIC_LOCAL(String, defaultDatabaseFilename, ("Icons.db"));
- return defaultDatabaseFilename.copy();
+ return defaultDatabaseFilename.threadsafeCopy();
}
IconDatabase* iconDatabase()
diff --git a/src/3rdparty/webkit/WebCore/page/ChromeClient.h b/src/3rdparty/webkit/WebCore/page/ChromeClient.h
index 2d11275..5231603 100644
--- a/src/3rdparty/webkit/WebCore/page/ChromeClient.h
+++ b/src/3rdparty/webkit/WebCore/page/ChromeClient.h
@@ -203,6 +203,10 @@ namespace WebCore {
virtual void scheduleCompositingLayerSync() = 0;
#endif
+ virtual bool supportsFullscreenForNode(const Node*) { return false; }
+ virtual void enterFullscreenForNode(Node*) { }
+ virtual void exitFullscreenForNode(Node*) { }
+
#if PLATFORM(MAC)
virtual KeyboardUIMode keyboardUIMode() { return KeyboardAccessDefault; }
diff --git a/src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp b/src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp
index a3a86a5..7d773ca 100644
--- a/src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp
+++ b/src/3rdparty/webkit/WebCore/page/ContextMenuController.cpp
@@ -166,10 +166,12 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
frame->editor()->copy();
break;
case ContextMenuItemTagGoBack:
- frame->loader()->goBackOrForward(-1);
+ if (Page* page = frame->page())
+ page->goBackOrForward(-1);
break;
case ContextMenuItemTagGoForward:
- frame->loader()->goBackOrForward(1);
+ if (Page* page = frame->page())
+ page->goBackOrForward(1);
break;
case ContextMenuItemTagStop:
frame->loader()->stop();
@@ -215,7 +217,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
break;
case ContextMenuItemTagOpenLink:
if (Frame* targetFrame = result.targetFrame())
- targetFrame->loader()->loadFrameRequest(FrameLoadRequest(ResourceRequest(result.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0);
+ targetFrame->loader()->loadFrameRequest(FrameLoadRequest(ResourceRequest(result.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer);
else
openNewWindow(result.absoluteLinkURL(), frame);
break;
diff --git a/src/3rdparty/webkit/WebCore/page/DOMWindow.cpp b/src/3rdparty/webkit/WebCore/page/DOMWindow.cpp
index 5ac4049..c30b6b9 100644
--- a/src/3rdparty/webkit/WebCore/page/DOMWindow.cpp
+++ b/src/3rdparty/webkit/WebCore/page/DOMWindow.cpp
@@ -64,6 +64,7 @@
#include "PlatformString.h"
#include "Screen.h"
#include "SecurityOrigin.h"
+#include "SerializedScriptValue.h"
#include "Settings.h"
#include "Storage.h"
#include "StorageArea.h"
@@ -80,7 +81,7 @@ namespace WebCore {
class PostMessageTimer : public TimerBase {
public:
- PostMessageTimer(DOMWindow* window, const String& message, const String& sourceOrigin, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortChannelArray> channels, SecurityOrigin* targetOrigin)
+ PostMessageTimer(DOMWindow* window, PassRefPtr<SerializedScriptValue> message, const String& sourceOrigin, PassRefPtr<DOMWindow> source, PassOwnPtr<MessagePortChannelArray> channels, SecurityOrigin* targetOrigin)
: m_window(window)
, m_message(message)
, m_origin(sourceOrigin)
@@ -104,7 +105,7 @@ private:
}
RefPtr<DOMWindow> m_window;
- String m_message;
+ RefPtr<SerializedScriptValue> m_message;
String m_origin;
RefPtr<DOMWindow> m_source;
OwnPtr<MessagePortChannelArray> m_channels;
@@ -635,7 +636,7 @@ NotificationCenter* DOMWindow::webkitNotifications() const
}
#endif
-void DOMWindow::postMessage(const String& message, MessagePort* port, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
+void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort* port, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
{
MessagePortArray ports;
if (port)
@@ -643,7 +644,7 @@ void DOMWindow::postMessage(const String& message, MessagePort* port, const Stri
postMessage(message, &ports, targetOrigin, source, ec);
}
-void DOMWindow::postMessage(const String& message, const MessagePortArray* ports, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
+void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
{
if (!m_frame)
return;
@@ -739,12 +740,9 @@ void DOMWindow::close()
return;
Settings* settings = m_frame->settings();
- bool allowScriptsToCloseWindows =
- settings && settings->allowScriptsToCloseWindows();
+ bool allowScriptsToCloseWindows = settings && settings->allowScriptsToCloseWindows();
- if (m_frame->loader()->openedByDOM()
- || m_frame->loader()->getHistoryLength() <= 1
- || allowScriptsToCloseWindows)
+ if (page->openedByDOM() || page->getHistoryLength() <= 1 || allowScriptsToCloseWindows)
m_frame->scheduleClose();
}
@@ -1296,6 +1294,14 @@ void DOMWindow::dispatchLoadEvent()
ownerEvent->setTarget(ownerElement);
ownerElement->dispatchGenericEvent(ownerEvent.release());
}
+
+#if ENABLE(INSPECTOR)
+ if (!frame() || !frame()->page())
+ return;
+
+ if (InspectorController* controller = frame()->page()->inspectorController())
+ controller->mainResourceFiredLoadEvent(frame()->loader()->documentLoader(), url());
+#endif
}
bool DOMWindow::dispatchEvent(PassRefPtr<Event> prpEvent, PassRefPtr<EventTarget> prpTarget)
diff --git a/src/3rdparty/webkit/WebCore/page/DOMWindow.h b/src/3rdparty/webkit/WebCore/page/DOMWindow.h
index f2177ee..25eadc8 100644
--- a/src/3rdparty/webkit/WebCore/page/DOMWindow.h
+++ b/src/3rdparty/webkit/WebCore/page/DOMWindow.h
@@ -59,6 +59,7 @@ namespace WebCore {
class NotificationCenter;
class PostMessageTimer;
class ScheduledAction;
+ class SerializedScriptValue;
class Screen;
class WebKitPoint;
@@ -214,9 +215,9 @@ namespace WebCore {
NotificationCenter* webkitNotifications() const;
#endif
- void postMessage(const String& message, const MessagePortArray*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
// FIXME: remove this when we update the ObjC bindings (bug #28774).
- void postMessage(const String& message, MessagePort*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
void postMessageTimerFired(PostMessageTimer*);
void scrollBy(int x, int y) const;
diff --git a/src/3rdparty/webkit/WebCore/page/DOMWindow.idl b/src/3rdparty/webkit/WebCore/page/DOMWindow.idl
index 4e3a03e..4587001 100644
--- a/src/3rdparty/webkit/WebCore/page/DOMWindow.idl
+++ b/src/3rdparty/webkit/WebCore/page/DOMWindow.idl
@@ -182,11 +182,11 @@ module window {
// cross-document messaging
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
- [DoNotCheckDomainSecurity, Custom] void postMessage(in DOMString message, in [Optional] Array messagePorts, in DOMString targetOrigin)
+ [DoNotCheckDomainSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] Array messagePorts, in DOMString targetOrigin)
raises(DOMException);
#else
// There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
- [DoNotCheckDomainSecurity, Custom] void postMessage(in DOMString message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
+ [DoNotCheckDomainSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
raises(DOMException);
#endif
@@ -434,16 +434,17 @@ module window {
attribute [Conditional=3D_CANVAS] CanvasRenderingContext3DConstructor CanvasRenderingContext3D;
attribute TextMetricsConstructor TextMetrics;
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasArrayBufferConstructor CanvasArrayBuffer; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasByteArrayConstructor CanvasByteArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasUnsignedByteArrayConstructor CanvasUnsignedByteArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasShortArrayConstructor CanvasShortArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasUnsignedShortArrayConstructor CanvasUnsignedShortArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasIntArrayConstructor CanvasIntArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasUnsignedIntArrayConstructor CanvasUnsignedIntArray; // Usable with new operator
- attribute [CustomGetter,Conditional=3D_CANVAS] CanvasFloatArrayConstructor CanvasFloatArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasArrayBufferConstructor CanvasArrayBuffer; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasByteArrayConstructor CanvasByteArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedByteArrayConstructor CanvasUnsignedByteArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasShortArrayConstructor CanvasShortArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedShortArrayConstructor CanvasUnsignedShortArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasIntArrayConstructor CanvasIntArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasUnsignedIntArrayConstructor CanvasUnsignedIntArray; // Usable with new operator
+ attribute [JSCCustomGetter,Conditional=3D_CANVAS] CanvasFloatArrayConstructor CanvasFloatArray; // Usable with new operator
attribute EventConstructor Event;
+ attribute BeforeLoadEventConstructor BeforeLoadEvent;
attribute KeyboardEventConstructor KeyboardEvent;
attribute MouseEventConstructor MouseEvent;
attribute MutationEventConstructor MutationEvent;
@@ -501,11 +502,11 @@ module window {
#endif
#if defined(ENABLE_SHARED_WORKERS) && ENABLE_SHARED_WORKERS
- attribute [JSCCustomGetter] SharedWorkerConstructor SharedWorker; // Usable with the new operator
+ attribute [JSCCustomGetter, EnabledAtRuntime] SharedWorkerConstructor SharedWorker; // Usable with the new operator
#endif
#if defined(ENABLE_WEB_SOCKETS) && ENABLE_WEB_SOCKETS
- attribute [JSCCustomGetter] WebSocketConstructor WebSocket; // Usable with the new operator
+ attribute [JSCCustomGetter,EnabledAtRuntime] WebSocketConstructor WebSocket; // Usable with the new operator
#endif
attribute PluginConstructor Plugin;
@@ -522,11 +523,11 @@ module window {
attribute StorageEventConstructor StorageEvent;
#endif
- attribute [CustomGetter,Conditional=VIDEO] HTMLAudioElementConstructor Audio; // Usable with the new operator
- attribute [Conditional=VIDEO] HTMLAudioElementConstructor HTMLAudioElement;
- attribute [Conditional=VIDEO] HTMLMediaElementConstructor HTMLMediaElement;
- attribute [Conditional=VIDEO] HTMLVideoElementConstructor HTMLVideoElement;
- attribute [Conditional=VIDEO] MediaErrorConstructor MediaError;
+ attribute [CustomGetter, Conditional=VIDEO, EnabledAtRuntime] HTMLAudioElementConstructor Audio; // Usable with the new operator
+ attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLAudioElementConstructor HTMLAudioElement;
+ attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLMediaElementConstructor HTMLMediaElement;
+ attribute [Conditional=VIDEO, EnabledAtRuntime] HTMLVideoElementConstructor HTMLVideoElement;
+ attribute [Conditional=VIDEO, EnabledAtRuntime] MediaErrorConstructor MediaError;
#if defined(ENABLE_XPATH) && ENABLE_XPATH
attribute XPathEvaluatorConstructor XPathEvaluator;
@@ -559,7 +560,7 @@ module window {
attribute SVGFECompositeElementConstructor SVGFECompositeElement;
// attribute SVGFEConvolveMatrixElementConstructor SVGFEConvolveMatrixElement;
attribute SVGFEDisplacementMapElementConstructor SVGFEDisplacementMapElement;
-// attribute SVGFEMorphologyElementConstructor SVGFEMorphologyElement;
+ attribute SVGFEMorphologyElementConstructor SVGFEMorphologyElement;
attribute SVGFETurbulenceElementConstructor SVGFETurbulenceElement;
#endif
#endif
diff --git a/src/3rdparty/webkit/WebCore/page/DragController.cpp b/src/3rdparty/webkit/WebCore/page/DragController.cpp
index ab3a653..634595a 100644
--- a/src/3rdparty/webkit/WebCore/page/DragController.cpp
+++ b/src/3rdparty/webkit/WebCore/page/DragController.cpp
@@ -649,6 +649,12 @@ bool DragController::startDrag(Frame* src, Clipboard* clipboard, DragOperation s
if (isDHTMLDrag)
dragImage = clipboard->createDragImage(dragImageOffset);
+ else {
+ // This drag operation is not a DHTML drag and may go outside the WebView.
+ // We provide a default set of allowed drag operations that follows from:
+ // http://trac.webkit.org/browser/trunk/WebKit/mac/WebView/WebHTMLView.mm?rev=48526#L3430
+ m_sourceDragOperation = (DragOperation)(DragOperationGeneric | DragOperationCopy);
+ }
// We allow DHTML/JS to set the drag image, even if its a link, image or text we're dragging.
// This is in the spirit of the IE API, which allows overriding of pasteboard data and DragOp.
diff --git a/src/3rdparty/webkit/WebCore/page/EventHandler.cpp b/src/3rdparty/webkit/WebCore/page/EventHandler.cpp
index 1075e72..4e97aba 100644
--- a/src/3rdparty/webkit/WebCore/page/EventHandler.cpp
+++ b/src/3rdparty/webkit/WebCore/page/EventHandler.cpp
@@ -127,10 +127,12 @@ inline bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResu
return false;
}
+#if ENABLE(DRAG_SUPPORT)
inline bool EventHandler::eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&)
{
return false;
}
+#endif
#endif
@@ -1528,15 +1530,15 @@ bool EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, Clipboard*
// it is sometimes incorrect when dragging within subframes, as seen with
// LayoutTests/fast/events/drag-in-frames.html.
if (newTarget) {
- if (newTarget->hasTagName(frameTag) || newTarget->hasTagName(iframeTag))
- accept = static_cast<HTMLFrameElementBase*>(newTarget)->contentFrame()->eventHandler()->updateDragAndDrop(event, clipboard);
+ Frame* frame = (newTarget->hasTagName(frameTag) || newTarget->hasTagName(iframeTag)) ? static_cast<HTMLFrameElementBase*>(newTarget)->contentFrame() : 0;
+ if (frame)
+ accept = frame->eventHandler()->updateDragAndDrop(event, clipboard);
else
accept = dispatchDragEvent(eventNames().dragenterEvent, newTarget, event, clipboard);
}
if (m_dragTarget) {
- Frame* frame = (m_dragTarget->hasTagName(frameTag) || m_dragTarget->hasTagName(iframeTag))
- ? static_cast<HTMLFrameElementBase*>(m_dragTarget.get())->contentFrame() : 0;
+ Frame* frame = (m_dragTarget->hasTagName(frameTag) || m_dragTarget->hasTagName(iframeTag)) ? static_cast<HTMLFrameElementBase*>(m_dragTarget.get())->contentFrame() : 0;
if (frame)
accept = frame->eventHandler()->updateDragAndDrop(event, clipboard);
else
@@ -1544,8 +1546,9 @@ bool EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, Clipboard*
}
} else {
if (newTarget) {
- if (newTarget->hasTagName(frameTag) || newTarget->hasTagName(iframeTag))
- accept = static_cast<HTMLFrameElementBase*>(newTarget)->contentFrame()->eventHandler()->updateDragAndDrop(event, clipboard);
+ Frame* frame = (newTarget->hasTagName(frameTag) || newTarget->hasTagName(iframeTag)) ? static_cast<HTMLFrameElementBase*>(newTarget)->contentFrame() : 0;
+ if (frame)
+ accept = frame->eventHandler()->updateDragAndDrop(event, clipboard);
else
accept = dispatchDragEvent(eventNames().dragoverEvent, newTarget, event, clipboard);
}
@@ -2178,7 +2181,7 @@ void EventHandler::freeClipboard()
bool EventHandler::shouldDragAutoNode(Node* node, const IntPoint& point) const
{
- if (!node || node->hasChildNodes() || !m_frame->view())
+ if (!node || !m_frame->view())
return false;
Page* page = m_frame->page();
return page && page->dragController()->mayStartDragAtEventLocation(m_frame, point);
diff --git a/src/3rdparty/webkit/WebCore/page/EventSource.cpp b/src/3rdparty/webkit/WebCore/page/EventSource.cpp
index ae3c0c3..2c9a343 100644
--- a/src/3rdparty/webkit/WebCore/page/EventSource.cpp
+++ b/src/3rdparty/webkit/WebCore/page/EventSource.cpp
@@ -45,6 +45,7 @@
#include "ResourceRequest.h"
#include "ResourceResponse.h"
#include "ScriptExecutionContext.h"
+#include "SerializedScriptValue.h"
#include "TextResourceDecoder.h"
#include "ThreadableLoader.h"
@@ -294,7 +295,7 @@ void EventSource::stop()
PassRefPtr<MessageEvent> EventSource::createMessageEvent()
{
RefPtr<MessageEvent> event = MessageEvent::create();
- event->initMessageEvent(m_eventName.isEmpty() ? eventNames().messageEvent : AtomicString(m_eventName), false, false, String::adopt(m_data), m_origin, m_lastEventId, 0, 0);
+ event->initMessageEvent(m_eventName.isEmpty() ? eventNames().messageEvent : AtomicString(m_eventName), false, false, SerializedScriptValue::create(String::adopt(m_data)), m_origin, m_lastEventId, 0, 0);
return event.release();
}
diff --git a/src/3rdparty/webkit/WebCore/page/Frame.cpp b/src/3rdparty/webkit/WebCore/page/Frame.cpp
index e8e796f..fab7e3f 100644
--- a/src/3rdparty/webkit/WebCore/page/Frame.cpp
+++ b/src/3rdparty/webkit/WebCore/page/Frame.cpp
@@ -123,6 +123,7 @@ Frame::Frame(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient*
: m_page(page)
, m_treeNode(this, parentFromOwnerElement(ownerElement))
, m_loader(this, frameLoaderClient)
+ , m_redirectScheduler(this)
, m_ownerElement(ownerElement)
, m_script(this)
, m_selectionGranularity(CharacterGranularity)
@@ -197,6 +198,7 @@ Frame::~Frame()
if (m_domWindow)
m_domWindow->disconnectFrame();
+ script()->clearWindowShell();
HashSet<DOMWindow*>::iterator end = m_liveFormerWindows.end();
for (HashSet<DOMWindow*>::iterator it = m_liveFormerWindows.begin(); it != end; ++it)
@@ -220,6 +222,11 @@ FrameLoader* Frame::loader() const
return &m_loader;
}
+RedirectScheduler* Frame::redirectScheduler() const
+{
+ return &m_redirectScheduler;
+}
+
FrameView* Frame::view() const
{
return m_view.get();
@@ -875,12 +882,11 @@ void Frame::injectUserScriptsForWorld(unsigned worldID, const UserScriptVector&
if (!doc)
return;
- // FIXME: Need to implement pattern checking.
Vector<ScriptSourceCode> sourceCode;
unsigned count = userScripts.size();
for (unsigned i = 0; i < count; ++i) {
UserScript* script = userScripts[i].get();
- if (script->injectionTime() == injectionTime && UserContentURLPattern::matchesPatterns(doc->url(), script->patterns()))
+ if (script->injectionTime() == injectionTime && UserContentURLPattern::matchesPatterns(doc->url(), script->whitelist(), script->blacklist()))
sourceCode.append(ScriptSourceCode(script->source(), script->url()));
}
script()->evaluateInIsolatedWorld(worldID, sourceCode);
diff --git a/src/3rdparty/webkit/WebCore/page/Frame.h b/src/3rdparty/webkit/WebCore/page/Frame.h
index b98dbc4..6208bbd 100644
--- a/src/3rdparty/webkit/WebCore/page/Frame.h
+++ b/src/3rdparty/webkit/WebCore/page/Frame.h
@@ -67,6 +67,7 @@ namespace WebCore {
class Editor;
class EventHandler;
class FrameLoader;
+ class RedirectScheduler;
class FrameLoaderClient;
class FrameTree;
class FrameView;
@@ -110,6 +111,7 @@ namespace WebCore {
Editor* editor() const;
EventHandler* eventHandler() const;
FrameLoader* loader() const;
+ RedirectScheduler* redirectScheduler() const;
SelectionController* selection() const;
FrameTree* tree() const;
AnimationController* animation() const;
@@ -334,6 +336,7 @@ namespace WebCore {
Page* m_page;
mutable FrameTree m_treeNode;
mutable FrameLoader m_loader;
+ mutable RedirectScheduler m_redirectScheduler;
mutable RefPtr<DOMWindow> m_domWindow;
HashSet<DOMWindow*> m_liveFormerWindows;
diff --git a/src/3rdparty/webkit/WebCore/page/FrameView.cpp b/src/3rdparty/webkit/WebCore/page/FrameView.cpp
index 675cba1..bc4e4f2 100644
--- a/src/3rdparty/webkit/WebCore/page/FrameView.cpp
+++ b/src/3rdparty/webkit/WebCore/page/FrameView.cpp
@@ -52,12 +52,24 @@
#include "RenderTheme.h"
#include "RenderView.h"
#include "Settings.h"
+#include "TextResourceDecoder.h"
#include <wtf/CurrentTime.h>
#if USE(ACCELERATED_COMPOSITING)
#include "RenderLayerCompositor.h"
#endif
+#if ENABLE(SVG)
+#include "SVGDocument.h"
+#include "SVGLocatable.h"
+#include "SVGNames.h"
+#include "SVGPreserveAspectRatio.h"
+#include "SVGSVGElement.h"
+#include "SVGViewElement.h"
+#include "SVGViewSpec.h"
+#endif
+
+
namespace WebCore {
using namespace HTMLNames;
@@ -640,6 +652,7 @@ void FrameView::layout(bool allowSubtree)
beginDeferredRepaints();
layer->updateLayerPositions((m_doFullRepaint ? RenderLayer::DoFullRepaint : 0)
| RenderLayer::CheckForRepaint
+ | RenderLayer::IsCompositingUpdateRoot
| RenderLayer::UpdateCompositingLayers);
endDeferredRepaints();
@@ -769,6 +782,72 @@ void FrameView::restoreScrollbar()
setScrollbarsSuppressed(false);
}
+bool FrameView::scrollToFragment(const KURL& url)
+{
+ // If our URL has no ref, then we have no place we need to jump to.
+ // OTOH If CSS target was set previously, we want to set it to 0, recalc
+ // and possibly repaint because :target pseudo class may have been
+ // set (see bug 11321).
+ if (!url.hasFragmentIdentifier() && !m_frame->document()->cssTarget())
+ return false;
+
+ String fragmentIdentifier = url.fragmentIdentifier();
+ if (scrollToAnchor(fragmentIdentifier))
+ return true;
+
+ // Try again after decoding the ref, based on the document's encoding.
+ if (TextResourceDecoder* decoder = m_frame->document()->decoder())
+ return scrollToAnchor(decodeURLEscapeSequences(fragmentIdentifier, decoder->encoding()));
+
+ return false;
+}
+
+bool FrameView::scrollToAnchor(const String& name)
+{
+ ASSERT(m_frame->document());
+
+ if (!m_frame->document()->haveStylesheetsLoaded()) {
+ m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(true);
+ return false;
+ }
+
+ m_frame->document()->setGotoAnchorNeededAfterStylesheetsLoad(false);
+
+ Element* anchorNode = m_frame->document()->findAnchor(name);
+
+#if ENABLE(SVG)
+ if (m_frame->document()->isSVGDocument()) {
+ if (name.startsWith("xpointer(")) {
+ // We need to parse the xpointer reference here
+ } else if (name.startsWith("svgView(")) {
+ RefPtr<SVGSVGElement> svg = static_cast<SVGDocument*>(m_frame->document())->rootElement();
+ if (!svg->currentView()->parseViewSpec(name))
+ return false;
+ svg->setUseCurrentView(true);
+ } else {
+ if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) {
+ RefPtr<SVGViewElement> viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0;
+ if (viewElement.get()) {
+ RefPtr<SVGSVGElement> svg = static_cast<SVGSVGElement*>(SVGLocatable::nearestViewportElement(viewElement.get()));
+ svg->inheritViewAttributes(viewElement.get());
+ }
+ }
+ }
+ // FIXME: need to decide which <svg> to focus on, and zoom to that one
+ // FIXME: need to actually "highlight" the viewTarget(s)
+ }
+#endif
+
+ m_frame->document()->setCSSTarget(anchorNode); // Setting to null will clear the current target.
+
+ // Implement the rule that "" and "top" both mean top of page as in other browsers.
+ if (!anchorNode && !(name.isEmpty() || equalIgnoringCase(name, "top")))
+ return false;
+
+ maintainScrollPositionAtAnchor(anchorNode ? static_cast<Node*>(anchorNode) : m_frame->document());
+ return true;
+}
+
void FrameView::maintainScrollPositionAtAnchor(Node* anchorNode)
{
m_maintainScrollPositionAnchor = anchorNode;
diff --git a/src/3rdparty/webkit/WebCore/page/FrameView.h b/src/3rdparty/webkit/WebCore/page/FrameView.h
index 4c900ae..3d17d2c 100644
--- a/src/3rdparty/webkit/WebCore/page/FrameView.h
+++ b/src/3rdparty/webkit/WebCore/page/FrameView.h
@@ -183,6 +183,8 @@ public:
void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
+ bool scrollToFragment(const KURL&);
+ bool scrollToAnchor(const String&);
void maintainScrollPositionAtAnchor(Node*);
// Methods to convert points and rects between the coordinate space of the renderer, and this view.
diff --git a/src/3rdparty/webkit/WebCore/page/History.cpp b/src/3rdparty/webkit/WebCore/page/History.cpp
index 2527132..9a27f1c 100644
--- a/src/3rdparty/webkit/WebCore/page/History.cpp
+++ b/src/3rdparty/webkit/WebCore/page/History.cpp
@@ -50,28 +50,30 @@ unsigned History::length() const
{
if (!m_frame)
return 0;
- return m_frame->loader()->getHistoryLength();
+ if (!m_frame->page())
+ return 0;
+ return m_frame->page()->getHistoryLength();
}
void History::back()
{
if (!m_frame)
return;
- m_frame->loader()->scheduleHistoryNavigation(-1);
+ m_frame->redirectScheduler()->scheduleHistoryNavigation(-1);
}
void History::forward()
{
if (!m_frame)
return;
- m_frame->loader()->scheduleHistoryNavigation(1);
+ m_frame->redirectScheduler()->scheduleHistoryNavigation(1);
}
void History::go(int distance)
{
if (!m_frame)
return;
- m_frame->loader()->scheduleHistoryNavigation(distance);
+ m_frame->redirectScheduler()->scheduleHistoryNavigation(distance);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/page/Page.cpp b/src/3rdparty/webkit/WebCore/page/Page.cpp
index 2d0c91c..8a685f4 100644
--- a/src/3rdparty/webkit/WebCore/page/Page.cpp
+++ b/src/3rdparty/webkit/WebCore/page/Page.cpp
@@ -119,6 +119,7 @@ Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, Edi
, m_theme(RenderTheme::themeForPage(this))
, m_editorClient(editorClient)
, m_frameCount(0)
+ , m_openedByDOM(false)
, m_tabKeyCyclesThroughElements(true)
, m_defersLoading(false)
, m_inLowQualityInterpolationMode(false)
@@ -136,7 +137,6 @@ Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, Edi
, m_customHTMLTokenizerTimeDelay(-1)
, m_customHTMLTokenizerChunkSize(-1)
, m_canStartPlugins(true)
- , m_pluginHalterClient(pluginHalterClient)
{
#if !ENABLE(CONTEXT_MENUS)
UNUSED_PARAM(contextMenuClient);
@@ -156,7 +156,10 @@ Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, Edi
ASSERT(!allPages->contains(this));
allPages->add(this);
- pluginHalterEnabledStateChanged();
+ if (pluginHalterClient) {
+ m_pluginHalter.set(new PluginHalter(pluginHalterClient));
+ m_pluginHalter->setPluginAllowedRunTime(m_settings->pluginAllowedRunTime());
+ }
#if ENABLE(JAVASCRIPT_DEBUGGER)
JavaScriptDebugServer::shared().pageCreated(this);
@@ -201,6 +204,16 @@ void Page::setMainFrame(PassRefPtr<Frame> mainFrame)
m_mainFrame = mainFrame;
}
+bool Page::openedByDOM() const
+{
+ return m_openedByDOM;
+}
+
+void Page::setOpenedByDOM()
+{
+ m_openedByDOM = true;
+}
+
BackForwardList* Page::backForwardList()
{
return m_backForwardList.get();
@@ -228,6 +241,40 @@ bool Page::goForward()
return false;
}
+bool Page::canGoBackOrForward(int distance) const
+{
+ if (distance == 0)
+ return true;
+ if (distance > 0 && distance <= m_backForwardList->forwardListCount())
+ return true;
+ if (distance < 0 && -distance <= m_backForwardList->backListCount())
+ return true;
+ return false;
+}
+
+void Page::goBackOrForward(int distance)
+{
+ if (distance == 0)
+ return;
+
+ HistoryItem* item = m_backForwardList->itemAtIndex(distance);
+ if (!item) {
+ if (distance > 0) {
+ int forwardListCount = m_backForwardList->forwardListCount();
+ if (forwardListCount > 0)
+ item = m_backForwardList->itemAtIndex(forwardListCount);
+ } else {
+ int backListCount = m_backForwardList->backListCount();
+ if (backListCount > 0)
+ item = m_backForwardList->itemAtIndex(-backListCount);
+ }
+ }
+
+ ASSERT(item); // we should not reach this line with an empty back/forward list
+ if (item)
+ goToItem(item, FrameLoadTypeIndexedBackForward);
+}
+
void Page::goToItem(HistoryItem* item, FrameLoadType type)
{
// Abort any current load if we're going to a history item
@@ -244,7 +291,12 @@ void Page::goToItem(HistoryItem* item, FrameLoadType type)
databasePolicy = DatabasePolicyContinue;
#endif
m_mainFrame->loader()->stopAllLoaders(databasePolicy);
- m_mainFrame->loader()->goToItem(item, type);
+ m_mainFrame->loader()->history()->goToItem(item, type);
+}
+
+int Page::getHistoryLength()
+{
+ return m_backForwardList->backListCount() + 1;
}
void Page::setGlobalHistoryItem(HistoryItem* item)
@@ -683,16 +735,6 @@ InspectorTimelineAgent* Page::inspectorTimelineAgent() const
}
#endif
-void Page::pluginHalterEnabledStateChanged()
-{
- if (m_settings->pluginHalterEnabled()) {
- ASSERT(!m_pluginHalter);
- m_pluginHalter.set(new PluginHalter(m_pluginHalterClient));
- m_pluginHalter->setPluginAllowedRunTime(m_settings->pluginAllowedRunTime());
- } else
- m_pluginHalter = 0;
-}
-
void Page::pluginAllowedRunTimeChanged()
{
if (m_pluginHalter)
diff --git a/src/3rdparty/webkit/WebCore/page/Page.h b/src/3rdparty/webkit/WebCore/page/Page.h
index 602d99b..4886464 100644
--- a/src/3rdparty/webkit/WebCore/page/Page.h
+++ b/src/3rdparty/webkit/WebCore/page/Page.h
@@ -103,6 +103,9 @@ namespace WebCore {
void setMainFrame(PassRefPtr<Frame>);
Frame* mainFrame() const { return m_mainFrame.get(); }
+ bool openedByDOM() const;
+ void setOpenedByDOM();
+
BackForwardList* backForwardList();
// FIXME: The following three methods don't fall under the responsibilities of the Page object
@@ -111,7 +114,10 @@ namespace WebCore {
// makes more sense when that class exists.
bool goBack();
bool goForward();
+ bool canGoBackOrForward(int distance) const;
+ void goBackOrForward(int distance);
void goToItem(HistoryItem*, FrameLoadType);
+ int getHistoryLength();
HistoryItem* globalHistoryItem() const { return m_globalHistoryItem.get(); }
void setGlobalHistoryItem(HistoryItem*);
@@ -187,7 +193,6 @@ namespace WebCore {
void didStartPlugin(HaltablePlugin*);
void didStopPlugin(HaltablePlugin*);
void pluginAllowedRunTimeChanged();
- void pluginHalterEnabledStateChanged();
static void setDebuggerForAllPages(JSC::Debugger*);
void setDebugger(JSC::Debugger*);
@@ -261,6 +266,7 @@ namespace WebCore {
int m_frameCount;
String m_groupName;
+ bool m_openedByDOM;
bool m_tabKeyCyclesThroughElements;
bool m_defersLoading;
@@ -293,7 +299,6 @@ namespace WebCore {
HashSet<PluginView*> m_unstartedPlugins;
OwnPtr<PluginHalter> m_pluginHalter;
- PluginHalterClient* m_pluginHalterClient;
#if ENABLE(DOM_STORAGE)
RefPtr<StorageNamespace> m_sessionStorage;
diff --git a/src/3rdparty/webkit/WebCore/page/PageGroup.cpp b/src/3rdparty/webkit/WebCore/page/PageGroup.cpp
index f9855a7..427c240 100644
--- a/src/3rdparty/webkit/WebCore/page/PageGroup.cpp
+++ b/src/3rdparty/webkit/WebCore/page/PageGroup.cpp
@@ -191,20 +191,21 @@ StorageNamespace* PageGroup::localStorage()
if (!m_localStorage) {
// Need a page in this page group to query the settings for the local storage database path.
Page* page = *m_pages.begin();
- ASSERT(page);
- m_localStorage = StorageNamespace::localStorageNamespace(page->settings()->localStorageDatabasePath());
+ const String& path = page->settings()->localStorageDatabasePath();
+ unsigned quota = page->settings()->localStorageQuota();
+ m_localStorage = StorageNamespace::localStorageNamespace(path, quota);
}
return m_localStorage.get();
}
#endif
-void PageGroup::addUserScript(const String& source, const KURL& url, const Vector<String>& patterns,
- unsigned worldID, UserScriptInjectionTime injectionTime)
+void PageGroup::addUserScriptToWorld(unsigned worldID, const String& source, const KURL& url, PassOwnPtr<Vector<String> > whitelist,
+ PassOwnPtr<Vector<String> > blacklist, UserScriptInjectionTime injectionTime)
{
if (worldID == UINT_MAX)
return;
- OwnPtr<UserScript> userScript(new UserScript(source, url, patterns, worldID, injectionTime));
+ OwnPtr<UserScript> userScript(new UserScript(source, url, whitelist, blacklist, worldID, injectionTime));
if (!m_userScripts)
m_userScripts.set(new UserScriptMap);
UserScriptVector*& scriptsInWorld = m_userScripts->add(worldID, 0).first->second;
@@ -213,11 +214,12 @@ void PageGroup::addUserScript(const String& source, const KURL& url, const Vecto
scriptsInWorld->append(userScript.release());
}
-void PageGroup::addUserStyleSheet(const String& source, const KURL& url, const Vector<String>& patterns, unsigned worldID)
+void PageGroup::addUserStyleSheetToWorld(unsigned worldID, const String& source, const KURL& url, PassOwnPtr<Vector<String> > whitelist,
+ PassOwnPtr<Vector<String> > blacklist)
{
if (worldID == UINT_MAX)
return;
- OwnPtr<UserStyleSheet> userStyleSheet(new UserStyleSheet(source, url, patterns, worldID));
+ OwnPtr<UserStyleSheet> userStyleSheet(new UserStyleSheet(source, url, whitelist, blacklist, worldID));
if (!m_userStyleSheets)
m_userStyleSheets.set(new UserStyleSheetMap);
UserStyleSheetVector*& styleSheetsInWorld = m_userStyleSheets->add(worldID, 0).first->second;
@@ -233,23 +235,93 @@ void PageGroup::addUserStyleSheet(const String& source, const KURL& url, const V
}
}
-void PageGroup::removeUserContentForWorld(unsigned worldID)
+void PageGroup::removeUserScriptFromWorld(unsigned worldID, const KURL& url)
{
- if (m_userScripts) {
- UserScriptMap::iterator it = m_userScripts->find(worldID);
- if (it != m_userScripts->end()) {
- m_userScripts->remove(it);
- delete it->second;
- }
+ if (!m_userScripts)
+ return;
+
+ UserScriptMap::iterator it = m_userScripts->find(worldID);
+ if (it == m_userScripts->end())
+ return;
+
+ UserScriptVector* scripts = it->second;
+ for (int i = scripts->size() - 1; i >= 0; --i) {
+ if (scripts->at(i)->url() == url)
+ scripts->remove(i);
}
- if (m_userStyleSheets) {
- UserStyleSheetMap::iterator it = m_userStyleSheets->find(worldID);
- if (it != m_userStyleSheets->end()) {
- m_userStyleSheets->remove(it);
- delete it->second;
+ if (!scripts->isEmpty())
+ return;
+
+ delete it->second;
+ m_userScripts->remove(it);
+}
+
+void PageGroup::removeUserStyleSheetFromWorld(unsigned worldID, const KURL& url)
+{
+ if (!m_userStyleSheets)
+ return;
+
+ UserStyleSheetMap::iterator it = m_userStyleSheets->find(worldID);
+ bool sheetsChanged = false;
+ if (it == m_userStyleSheets->end())
+ return;
+
+ UserStyleSheetVector* stylesheets = it->second;
+ for (int i = stylesheets->size() - 1; i >= 0; --i) {
+ if (stylesheets->at(i)->url() == url) {
+ stylesheets->remove(i);
+ sheetsChanged = true;
}
}
+
+ if (!sheetsChanged)
+ return;
+
+ if (!stylesheets->isEmpty()) {
+ delete it->second;
+ m_userStyleSheets->remove(it);
+ }
+
+ // Clear our cached sheets and have them just reparse.
+ HashSet<Page*>::const_iterator end = m_pages.end();
+ for (HashSet<Page*>::const_iterator it = m_pages.begin(); it != end; ++it) {
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
+ frame->document()->clearPageGroupUserSheets();
+ }
+}
+
+void PageGroup::removeUserScriptsFromWorld(unsigned worldID)
+{
+ if (!m_userScripts)
+ return;
+
+ UserScriptMap::iterator it = m_userScripts->find(worldID);
+ if (it == m_userScripts->end())
+ return;
+
+ delete it->second;
+ m_userScripts->remove(it);
+}
+
+void PageGroup::removeUserStyleSheetsFromWorld(unsigned worldID)
+{
+ if (!m_userStyleSheets)
+ return;
+
+ UserStyleSheetMap::iterator it = m_userStyleSheets->find(worldID);
+ if (it == m_userStyleSheets->end())
+ return;
+
+ delete it->second;
+ m_userStyleSheets->remove(it);
+
+ // Clear our cached sheets and have them just reparse.
+ HashSet<Page*>::const_iterator end = m_pages.end();
+ for (HashSet<Page*>::const_iterator it = m_pages.begin(); it != end; ++it) {
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
+ frame->document()->clearPageGroupUserSheets();
+ }
}
void PageGroup::removeAllUserContent()
diff --git a/src/3rdparty/webkit/WebCore/page/PageGroup.h b/src/3rdparty/webkit/WebCore/page/PageGroup.h
index 0bf3fbc..c233cd1 100644
--- a/src/3rdparty/webkit/WebCore/page/PageGroup.h
+++ b/src/3rdparty/webkit/WebCore/page/PageGroup.h
@@ -70,16 +70,23 @@ namespace WebCore {
bool hasLocalStorage() { return m_localStorage; }
#endif
- void addUserScript(const String& source, const KURL&, const Vector<String>& patterns,
- unsigned worldID, UserScriptInjectionTime);
- const UserScriptMap* userScripts() const { return m_userScripts.get(); }
+ void addUserScriptToWorld(unsigned worldID, const String& source, const KURL&,
+ PassOwnPtr<Vector<String> > whitelist, PassOwnPtr<Vector<String> > blacklist,
+ UserScriptInjectionTime);
+ void addUserStyleSheetToWorld(unsigned worldID, const String& source, const KURL&,
+ PassOwnPtr<Vector<String> > whitelist, PassOwnPtr<Vector<String> > blacklist);
- void addUserStyleSheet(const String& source, const KURL&, const Vector<String>& patterns, unsigned worldID);
- const UserStyleSheetMap* userStyleSheets() const { return m_userStyleSheets.get(); }
+ void removeUserScriptFromWorld(unsigned, const KURL&);
+ void removeUserStyleSheetFromWorld(unsigned, const KURL&);
- void removeUserContentForWorld(unsigned);
+ void removeUserScriptsFromWorld(unsigned);
+ void removeUserStyleSheetsFromWorld(unsigned);
+
void removeAllUserContent();
+ const UserScriptMap* userScripts() const { return m_userScripts.get(); }
+ const UserStyleSheetMap* userStyleSheets() const { return m_userStyleSheets.get(); }
+
private:
void addVisitedLink(LinkHash stringHash);
diff --git a/src/3rdparty/webkit/WebCore/page/PluginHalter.cpp b/src/3rdparty/webkit/WebCore/page/PluginHalter.cpp
index 8025337..63f5469 100644
--- a/src/3rdparty/webkit/WebCore/page/PluginHalter.cpp
+++ b/src/3rdparty/webkit/WebCore/page/PluginHalter.cpp
@@ -28,7 +28,6 @@
#include "PluginHalter.h"
#include "HaltablePlugin.h"
-#include "PluginHalterClient.h"
#include <wtf/CurrentTime.h>
#include <wtf/Vector.h>
@@ -49,6 +48,9 @@ void PluginHalter::didStartPlugin(HaltablePlugin* obj)
ASSERT_ARG(obj, obj);
ASSERT_ARG(obj, !m_plugins.contains(obj));
+ if (!m_client->enabled())
+ return;
+
double currentTime = WTF::currentTime();
m_plugins.add(obj, currentTime);
@@ -61,6 +63,9 @@ void PluginHalter::didStartPlugin(HaltablePlugin* obj)
void PluginHalter::didStopPlugin(HaltablePlugin* obj)
{
+ if (!m_client->enabled())
+ return;
+
m_plugins.remove(obj);
}
diff --git a/src/3rdparty/webkit/WebCore/page/PluginHalter.h b/src/3rdparty/webkit/WebCore/page/PluginHalter.h
index 26f5101..eddce34 100644
--- a/src/3rdparty/webkit/WebCore/page/PluginHalter.h
+++ b/src/3rdparty/webkit/WebCore/page/PluginHalter.h
@@ -26,13 +26,14 @@
#ifndef PluginHalter_h
#define PluginHalter_h
+#include "PluginHalterClient.h"
#include "Timer.h"
#include <wtf/HashMap.h>
+#include <wtf/OwnPtr.h>
namespace WebCore {
class HaltablePlugin;
-class PluginHalterClient;
class PluginHalter {
public:
@@ -47,7 +48,7 @@ private:
void timerFired(Timer<PluginHalter>*);
void startTimerIfNecessary();
- PluginHalterClient* m_client;
+ OwnPtr<PluginHalterClient> m_client;
Timer<PluginHalter> m_timer;
unsigned m_pluginAllowedRunTime;
double m_oldestStartTime;
diff --git a/src/3rdparty/webkit/WebCore/page/PluginHalterClient.h b/src/3rdparty/webkit/WebCore/page/PluginHalterClient.h
index 7ea460a..f77091f 100644
--- a/src/3rdparty/webkit/WebCore/page/PluginHalterClient.h
+++ b/src/3rdparty/webkit/WebCore/page/PluginHalterClient.h
@@ -35,6 +35,7 @@ public:
virtual ~PluginHalterClient() { }
virtual bool shouldHaltPlugin(Node*) const = 0;
+ virtual bool enabled() const = 0;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/page/PrintContext.cpp b/src/3rdparty/webkit/WebCore/page/PrintContext.cpp
index 4d3a839..bba678a 100644
--- a/src/3rdparty/webkit/WebCore/page/PrintContext.cpp
+++ b/src/3rdparty/webkit/WebCore/page/PrintContext.cpp
@@ -25,6 +25,7 @@
#include "Frame.h"
#include "FrameView.h"
#include "RenderView.h"
+#include "Settings.h"
using namespace WebCore;
@@ -95,18 +96,23 @@ void PrintContext::computePageRects(const FloatRect& printRect, float headerHeig
void PrintContext::begin(float width)
{
- // By imaging to a width a little wider than the available pixels,
- // thin pages will be scaled down a little, matching the way they
- // print in IE and Camino. This lets them use fewer sheets than they
- // would otherwise, which is presumably why other browsers do this.
- // Wide pages will be scaled down more than this.
- const float PrintingMinimumShrinkFactor = 1.25f;
-
- // This number determines how small we are willing to reduce the page content
- // in order to accommodate the widest line. If the page would have to be
- // reduced smaller to make the widest line fit, we just clip instead (this
- // behavior matches MacIE and Mozilla, at least)
- const float PrintingMaximumShrinkFactor = 2.0f;
+ float PrintingMinimumShrinkFactor = m_frame->settings() ? m_frame->settings()->printingMinimumShrinkFactor() : 0.0f;
+ float PrintingMaximumShrinkFactor = m_frame->settings() ? m_frame->settings()->printingMaximumShrinkFactor() : 0.0f;
+
+ if (PrintingMaximumShrinkFactor < PrintingMinimumShrinkFactor || PrintingMinimumShrinkFactor <= 0.0f) {
+ // By imaging to a width a little wider than the available pixels,
+ // thin pages will be scaled down a little, matching the way they
+ // print in IE and Camino. This lets them use fewer sheets than they
+ // would otherwise, which is presumably why other browsers do this.
+ // Wide pages will be scaled down more than this.
+ PrintingMinimumShrinkFactor = 1.25f;
+
+ // This number determines how small we are willing to reduce the page content
+ // in order to accommodate the widest line. If the page would have to be
+ // reduced smaller to make the widest line fit, we just clip instead (this
+ // behavior matches MacIE and Mozilla, at least)
+ PrintingMaximumShrinkFactor = 2.0f;
+ }
float minLayoutWidth = width * PrintingMinimumShrinkFactor;
float maxLayoutWidth = width * PrintingMaximumShrinkFactor;
diff --git a/src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp b/src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp
index b91c1f1..338bf9f 100644
--- a/src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp
+++ b/src/3rdparty/webkit/WebCore/page/SecurityOrigin.cpp
@@ -30,13 +30,15 @@
#include "SecurityOrigin.h"
#include "CString.h"
-#include "FrameLoader.h"
+#include "Document.h"
#include "KURL.h"
#include "OriginAccessEntry.h"
#include <wtf/StdLibExtras.h>
namespace WebCore {
+static SecurityOrigin::LocalLoadPolicy localLoadPolicy = SecurityOrigin::AllowLocalLoadsForLocalOnly;
+
typedef Vector<OriginAccessEntry> OriginAccessWhiteList;
typedef HashMap<String, OriginAccessWhiteList*> OriginAccessMap;
@@ -116,9 +118,9 @@ SecurityOrigin::SecurityOrigin(const KURL& url)
}
SecurityOrigin::SecurityOrigin(const SecurityOrigin* other)
- : m_protocol(other->m_protocol.copy())
- , m_host(other->m_host.copy())
- , m_domain(other->m_domain.copy())
+ : m_protocol(other->m_protocol.threadsafeCopy())
+ , m_host(other->m_host.threadsafeCopy())
+ , m_domain(other->m_domain.threadsafeCopy())
, m_port(other->m_port)
, m_noAccess(other->m_noAccess)
, m_universalAccess(other->m_universalAccess)
@@ -144,7 +146,7 @@ PassRefPtr<SecurityOrigin> SecurityOrigin::createEmpty()
return create(KURL());
}
-PassRefPtr<SecurityOrigin> SecurityOrigin::copy()
+PassRefPtr<SecurityOrigin> SecurityOrigin::threadsafeCopy()
{
return adoptRef(new SecurityOrigin(this));
}
@@ -237,6 +239,20 @@ bool SecurityOrigin::taintsCanvas(const KURL& url) const
return true;
}
+bool SecurityOrigin::canLoad(const KURL& url, const String& referrer, Document* document)
+{
+ if (!shouldTreatURLAsLocal(url.string()))
+ return true;
+
+ // If we were provided a document, we let its local file policy dictate the result,
+ // otherwise we allow local loads only if the supplied referrer is also local.
+ if (document)
+ return document->securityOrigin()->canLoadLocalResources();
+ if (!referrer.isEmpty())
+ return shouldTreatURLAsLocal(referrer);
+ return false;
+}
+
void SecurityOrigin::grantLoadLocalResources()
{
// This method exists only to support backwards compatibility with older
@@ -244,7 +260,7 @@ void SecurityOrigin::grantLoadLocalResources()
// in a SecurityOrigin is a security hazard because the documents without
// the privilege can obtain the privilege by injecting script into the
// documents that have been granted the privilege.
- ASSERT(FrameLoader::allowSubstituteDataAccessToLocal());
+ ASSERT(allowSubstituteDataAccessToLocal());
m_canLoadLocalResources = true;
}
@@ -370,13 +386,11 @@ bool SecurityOrigin::isSameSchemeHostPort(const SecurityOrigin* other) const
return true;
}
-// static
void SecurityOrigin::registerURLSchemeAsLocal(const String& scheme)
{
localSchemes().add(scheme);
}
-// static
void SecurityOrigin::removeURLSchemeRegisteredAsLocal(const String& scheme)
{
if (scheme == "file")
@@ -392,13 +406,11 @@ void SecurityOrigin::removeURLSchemeRegisteredAsLocal(const String& scheme)
localSchemes().remove(scheme);
}
-// static
const URLSchemesMap& SecurityOrigin::localURLSchemes()
{
return localSchemes();
}
-// static
bool SecurityOrigin::shouldTreatURLAsLocal(const String& url)
{
// This avoids an allocation of another String and the HashSet contains()
@@ -419,7 +431,6 @@ bool SecurityOrigin::shouldTreatURLAsLocal(const String& url)
return localSchemes().contains(scheme);
}
-// static
bool SecurityOrigin::shouldTreatURLSchemeAsLocal(const String& scheme)
{
// This avoids an allocation of another String and the HashSet contains()
@@ -438,18 +449,47 @@ bool SecurityOrigin::shouldTreatURLSchemeAsLocal(const String& scheme)
return localSchemes().contains(scheme);
}
-// static
void SecurityOrigin::registerURLSchemeAsNoAccess(const String& scheme)
{
noAccessSchemes().add(scheme);
}
-// static
bool SecurityOrigin::shouldTreatURLSchemeAsNoAccess(const String& scheme)
{
return noAccessSchemes().contains(scheme);
}
+bool SecurityOrigin::shouldHideReferrer(const KURL& url, const String& referrer)
+{
+ bool referrerIsSecureURL = protocolIs(referrer, "https");
+ bool referrerIsWebURL = referrerIsSecureURL || protocolIs(referrer, "http");
+
+ if (!referrerIsWebURL)
+ return true;
+
+ if (!referrerIsSecureURL)
+ return false;
+
+ bool URLIsSecureURL = url.protocolIs("https");
+
+ return !URLIsSecureURL;
+}
+
+void SecurityOrigin::setLocalLoadPolicy(LocalLoadPolicy policy)
+{
+ localLoadPolicy = policy;
+}
+
+bool SecurityOrigin::restrictAccessToLocal()
+{
+ return localLoadPolicy != SecurityOrigin::AllowLocalLoadsForAll;
+}
+
+bool SecurityOrigin::allowSubstituteDataAccessToLocal()
+{
+ return localLoadPolicy != SecurityOrigin::AllowLocalLoadsForLocalOnly;
+}
+
void SecurityOrigin::whiteListAccessFromOrigin(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomains, bool allowDestinationSubdomains)
{
ASSERT(isMainThread());
diff --git a/src/3rdparty/webkit/WebCore/page/SecurityOrigin.h b/src/3rdparty/webkit/WebCore/page/SecurityOrigin.h
index 732afa8..46e6fad 100644
--- a/src/3rdparty/webkit/WebCore/page/SecurityOrigin.h
+++ b/src/3rdparty/webkit/WebCore/page/SecurityOrigin.h
@@ -40,7 +40,8 @@
namespace WebCore {
typedef HashSet<String, CaseFoldingHash> URLSchemesMap;
-
+
+ class Document;
class KURL;
class SecurityOrigin : public ThreadSafeShared<SecurityOrigin> {
@@ -52,7 +53,7 @@ namespace WebCore {
// Create a deep copy of this SecurityOrigin. This method is useful
// when marshalling a SecurityOrigin to another thread.
- PassRefPtr<SecurityOrigin> copy();
+ PassRefPtr<SecurityOrigin> threadsafeCopy();
// Set the domain property of this security origin to newDomain. This
// function does not check whether newDomain is a suffix of the current
@@ -81,6 +82,11 @@ namespace WebCore {
// drawing an image onto an HTML canvas element with the drawImage API.
bool taintsCanvas(const KURL&) const;
+ // Returns true for any non-local URL. If document parameter is supplied,
+ // its local load policy dictates, otherwise if referrer is non-empty and
+ // represents a local file, then the local load is allowed.
+ static bool canLoad(const KURL&, const String& referrer, Document* document);
+
// Returns true if this SecurityOrigin can load local resources, such
// as images, iframes, and style sheets, and can link to local URLs.
// For example, call this function before creating an iframe to a
@@ -143,6 +149,17 @@ namespace WebCore {
static bool shouldTreatURLAsLocal(const String&);
static bool shouldTreatURLSchemeAsLocal(const String&);
+ static bool shouldHideReferrer(const KURL&, const String& referrer);
+
+ enum LocalLoadPolicy {
+ AllowLocalLoadsForAll, // No restriction on local loads.
+ AllowLocalLoadsForLocalAndSubstituteData,
+ AllowLocalLoadsForLocalOnly,
+ };
+ static void setLocalLoadPolicy(LocalLoadPolicy);
+ static bool restrictAccessToLocal();
+ static bool allowSubstituteDataAccessToLocal();
+
static void registerURLSchemeAsNoAccess(const String&);
static bool shouldTreatURLSchemeAsNoAccess(const String&);
diff --git a/src/3rdparty/webkit/WebCore/page/Settings.cpp b/src/3rdparty/webkit/WebCore/page/Settings.cpp
index ab438a1..48f310b 100644
--- a/src/3rdparty/webkit/WebCore/page/Settings.cpp
+++ b/src/3rdparty/webkit/WebCore/page/Settings.cpp
@@ -61,7 +61,10 @@ Settings::Settings(Page* page)
, m_defaultFontSize(0)
, m_defaultFixedFontSize(0)
, m_maximumDecodedImageSize(numeric_limits<size_t>::max())
+ , m_localStorageQuota(5 * 1024 * 1024) // Suggested by the HTML5 spec.
, m_pluginAllowedRunTime(numeric_limits<unsigned>::max())
+ , m_printingMinimumShrinkFactor(0.0f)
+ , m_printingMaximumShrinkFactor(0.0f)
, m_isJavaEnabled(false)
, m_loadsImagesAutomatically(false)
, m_privateBrowsingEnabled(false)
@@ -116,11 +119,7 @@ Settings::Settings(Page* page)
, m_xssAuditorEnabled(false)
, m_acceleratedCompositingEnabled(true)
, m_experimentalNotificationsEnabled(false)
- , m_pluginHalterEnabled(false)
- , m_experimentalWebGLEnabled(false)
-#if ENABLE(WEB_SOCKETS)
- , m_experimentalWebSocketsEnabled(false)
-#endif
+ , m_webGLEnabled(false)
{
// A Frame may not have been created yet, so we initialize the AtomicString
// hash before trying to use it.
@@ -262,6 +261,11 @@ void Settings::setSessionStorageEnabled(bool sessionStorageEnabled)
m_sessionStorageEnabled = sessionStorageEnabled;
}
+void Settings::setLocalStorageQuota(unsigned localStorageQuota)
+{
+ m_localStorageQuota = localStorageQuota;
+}
+
void Settings::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
{
m_privateBrowsingEnabled = privateBrowsingEnabled;
@@ -509,16 +513,6 @@ void Settings::setExperimentalNotificationsEnabled(bool enabled)
m_experimentalNotificationsEnabled = enabled;
}
-void Settings::setPluginHalterEnabled(bool enabled)
-{
- if (m_pluginHalterEnabled == enabled)
- return;
-
- m_pluginHalterEnabled = enabled;
-
- m_page->pluginHalterEnabledStateChanged();
-}
-
void Settings::setPluginAllowedRunTime(unsigned runTime)
{
m_pluginAllowedRunTime = runTime;
@@ -532,16 +526,19 @@ void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTime
}
#endif
-void Settings::setExperimentalWebGLEnabled(bool enabled)
+void Settings::setWebGLEnabled(bool enabled)
{
- m_experimentalWebGLEnabled = enabled;
+ m_webGLEnabled = enabled;
}
-#if ENABLE(WEB_SOCKETS)
-void Settings::setExperimentalWebSocketsEnabled(bool enabled)
+void Settings::setPrintingMinimumShrinkFactor(float printingMinimumShrinkFactor)
{
- m_experimentalWebSocketsEnabled = enabled;
-}
-#endif
+ m_printingMinimumShrinkFactor = printingMinimumShrinkFactor;
+}
+
+void Settings::setPrintingMaximumShrinkFactor(float printingMaximumShrinkFactor)
+{
+ m_printingMaximumShrinkFactor = printingMaximumShrinkFactor;
+}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/page/Settings.h b/src/3rdparty/webkit/WebCore/page/Settings.h
index ec9c8f9..bdb07b9 100644
--- a/src/3rdparty/webkit/WebCore/page/Settings.h
+++ b/src/3rdparty/webkit/WebCore/page/Settings.h
@@ -128,6 +128,9 @@ namespace WebCore {
void setSessionStorageEnabled(bool);
bool sessionStorageEnabled() const { return m_sessionStorageEnabled; }
+ void setLocalStorageQuota(unsigned);
+ unsigned localStorageQuota() const { return m_localStorageQuota; }
+
void setPrivateBrowsingEnabled(bool);
bool privateBrowsingEnabled() const { return m_privateBrowsingEnabled; }
@@ -261,21 +264,17 @@ namespace WebCore {
static bool shouldUseHighResolutionTimers() { return gShouldUseHighResolutionTimers; }
#endif
- void setPluginHalterEnabled(bool);
- bool pluginHalterEnabled() const { return m_pluginHalterEnabled; }
-
void setPluginAllowedRunTime(unsigned);
unsigned pluginAllowedRunTime() const { return m_pluginAllowedRunTime; }
- // This run-time flag is only temporary while the WebGL
- // specification is being developed.
- void setExperimentalWebGLEnabled(bool);
- bool experimentalWebGLEnabled() const { return m_experimentalWebGLEnabled; }
+ void setWebGLEnabled(bool);
+ bool webGLEnabled() const { return m_webGLEnabled; }
-#if ENABLE(WEB_SOCKETS)
- void setExperimentalWebSocketsEnabled(bool);
- bool experimentalWebSocketsEnabled() const { return m_experimentalWebSocketsEnabled; }
-#endif
+ void setPrintingMinimumShrinkFactor(float);
+ float printingMinimumShrinkFactor() const { return m_printingMinimumShrinkFactor; }
+
+ void setPrintingMaximumShrinkFactor(float);
+ float printingMaximumShrinkFactor() const { return m_printingMaximumShrinkFactor; }
private:
Page* m_page;
@@ -297,7 +296,10 @@ namespace WebCore {
int m_defaultFontSize;
int m_defaultFixedFontSize;
size_t m_maximumDecodedImageSize;
+ unsigned m_localStorageQuota;
unsigned m_pluginAllowedRunTime;
+ float m_printingMinimumShrinkFactor;
+ float m_printingMaximumShrinkFactor;
bool m_isJavaEnabled : 1;
bool m_loadsImagesAutomatically : 1;
bool m_privateBrowsingEnabled : 1;
@@ -343,12 +345,7 @@ namespace WebCore {
bool m_xssAuditorEnabled : 1;
bool m_acceleratedCompositingEnabled : 1;
bool m_experimentalNotificationsEnabled : 1;
- bool m_pluginHalterEnabled : 1;
- bool m_experimentalWebGLEnabled : 1;
-
-#if ENABLE(WEB_SOCKETS)
- bool m_experimentalWebSocketsEnabled : 1;
-#endif
+ bool m_webGLEnabled : 1;
#if USE(SAFARI_THEME)
static bool gShouldPaintNativeControls;
diff --git a/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.cpp b/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.cpp
index 1960131..5f0a311 100644
--- a/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.cpp
+++ b/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.cpp
@@ -30,19 +30,33 @@
namespace WebCore {
-bool UserContentURLPattern::matchesPatterns(const KURL& url, const Vector<String>& patterns)
+bool UserContentURLPattern::matchesPatterns(const KURL& url, const Vector<String>* whitelist, const Vector<String>* blacklist)
{
- // Treat no patterns at all as though a pattern of * was specified.
- if (patterns.isEmpty())
- return true;
+ // In order for a URL to be a match it has to be present in the whitelist and not present in the blacklist.
+ // If there is no whitelist at all, then all URLs are assumed to be in the whitelist.
+ bool matchesWhitelist = !whitelist || whitelist->isEmpty();
+ if (!matchesWhitelist) {
+ for (unsigned i = 0; i < whitelist->size(); ++i) {
+ UserContentURLPattern contentPattern(whitelist->at(i));
+ if (contentPattern.matches(url)) {
+ matchesWhitelist = true;
+ break;
+ }
+ }
+ }
- for (unsigned i = 0; i < patterns.size(); ++i) {
- UserContentURLPattern contentPattern(patterns[i]);
- if (contentPattern.matches(url))
- return true;
+ bool matchesBlacklist = false;
+ if (blacklist) {
+ for (unsigned i = 0; i < blacklist->size(); ++i) {
+ UserContentURLPattern contentPattern(blacklist->at(i));
+ if (contentPattern.matches(url)) {
+ matchesBlacklist = true;
+ break;
+ }
+ }
}
- return false;
+ return matchesWhitelist && !matchesBlacklist;
}
bool UserContentURLPattern::parse(const String& pattern)
diff --git a/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.h b/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.h
index bc87f55..0b1a248 100644
--- a/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.h
+++ b/src/3rdparty/webkit/WebCore/page/UserContentURLPattern.h
@@ -49,7 +49,7 @@ public:
bool matchSubdomains() const { return m_matchSubdomains; }
- static bool matchesPatterns(const KURL&, const Vector<String>&);
+ static bool matchesPatterns(const KURL&, const Vector<String>* whitelist, const Vector<String>* blacklist);
private:
bool parse(const String& pattern);
diff --git a/src/3rdparty/webkit/WebCore/page/UserScript.h b/src/3rdparty/webkit/WebCore/page/UserScript.h
index 51031ab..dbbb879 100644
--- a/src/3rdparty/webkit/WebCore/page/UserScript.h
+++ b/src/3rdparty/webkit/WebCore/page/UserScript.h
@@ -29,6 +29,7 @@
#include "KURL.h"
#include "UserScriptTypes.h"
#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
@@ -36,11 +37,12 @@ namespace WebCore {
class UserScript {
public:
UserScript(const String& source, const KURL& url,
- const Vector<String>& patterns, unsigned worldID,
- UserScriptInjectionTime injectionTime)
+ PassOwnPtr<Vector<String> > whitelist, PassOwnPtr<Vector<String> > blacklist,
+ unsigned worldID, UserScriptInjectionTime injectionTime)
: m_source(source)
, m_url(url)
- , m_patterns(patterns)
+ , m_whitelist(whitelist)
+ , m_blacklist(blacklist)
, m_worldID(worldID)
, m_injectionTime(injectionTime)
{
@@ -48,14 +50,16 @@ public:
const String& source() const { return m_source; }
const KURL& url() const { return m_url; }
- const Vector<String>& patterns() const { return m_patterns; }
+ const Vector<String>* whitelist() const { return m_whitelist.get(); }
+ const Vector<String>* blacklist() const { return m_blacklist.get(); }
unsigned worldID() const { return m_worldID; }
UserScriptInjectionTime injectionTime() const { return m_injectionTime; }
private:
String m_source;
KURL m_url;
- Vector<String> m_patterns;
+ OwnPtr<Vector<String> > m_whitelist;
+ OwnPtr<Vector<String> > m_blacklist;
unsigned m_worldID;
UserScriptInjectionTime m_injectionTime;
};
diff --git a/src/3rdparty/webkit/WebCore/page/UserStyleSheet.h b/src/3rdparty/webkit/WebCore/page/UserStyleSheet.h
index 5ae95c3..56bec40 100644
--- a/src/3rdparty/webkit/WebCore/page/UserStyleSheet.h
+++ b/src/3rdparty/webkit/WebCore/page/UserStyleSheet.h
@@ -29,6 +29,7 @@
#include "KURL.h"
#include "UserStyleSheetTypes.h"
#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
@@ -36,23 +37,27 @@ namespace WebCore {
class UserStyleSheet {
public:
UserStyleSheet(const String& source, const KURL& url,
- const Vector<String>& patterns, unsigned worldID)
+ PassOwnPtr<Vector<String> > whitelist, PassOwnPtr<Vector<String> > blacklist,
+ unsigned worldID)
: m_source(source)
, m_url(url)
- , m_patterns(patterns)
+ , m_whitelist(whitelist)
+ , m_blacklist(blacklist)
, m_worldID(worldID)
{
}
const String& source() const { return m_source; }
const KURL& url() const { return m_url; }
- const Vector<String>& patterns() const { return m_patterns; }
+ const Vector<String>* whitelist() const { return m_whitelist.get(); }
+ const Vector<String>* blacklist() const { return m_blacklist.get(); }
unsigned worldID() const { return m_worldID; }
private:
String m_source;
KURL m_url;
- Vector<String> m_patterns;
+ OwnPtr<Vector<String> > m_whitelist;
+ OwnPtr<Vector<String> > m_blacklist;
unsigned m_worldID;
};
diff --git a/src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp b/src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp
index 4fcc53c..890c3fa 100644
--- a/src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp
+++ b/src/3rdparty/webkit/WebCore/page/XSSAuditor.cpp
@@ -58,15 +58,30 @@ static bool isNonCanonicalCharacter(UChar c)
return (c == '\\' || c == '0' || c < ' ' || c >= 127);
}
-String XSSAuditor::CachingURLCanonicalizer::canonicalizeURL(const String& url, const TextEncoding& encoding, bool decodeEntities)
+static bool isIllegalURICharacter(UChar c)
{
- if (decodeEntities == m_decodeEntities && encoding == m_encoding && url == m_inputURL)
+ // The characters described in section 2.4.3 of RFC 2396 <http://www.faqs.org/rfcs/rfc2396.html> in addition to the
+ // single quote character "'" are considered illegal URI characters. That is, the following characters cannot appear
+ // in a valid URI: ', ", <, >
+ //
+ // If the request does not contain these characters then we can assume that no inline scripts have been injected
+ // into the response page, because it is impossible to write an inline script of the form <script>...</script>
+ // without "<", ">".
+ return (c == '\'' || c == '"' || c == '<' || c == '>');
+}
+
+String XSSAuditor::CachingURLCanonicalizer::canonicalizeURL(const String& url, const TextEncoding& encoding, bool decodeEntities,
+ bool decodeURLEscapeSequencesTwice)
+{
+ if (decodeEntities == m_decodeEntities && decodeURLEscapeSequencesTwice == m_decodeURLEscapeSequencesTwice
+ && encoding == m_encoding && url == m_inputURL)
return m_cachedCanonicalizedURL;
- m_cachedCanonicalizedURL = canonicalize(decodeURL(url, encoding, decodeEntities));
+ m_cachedCanonicalizedURL = canonicalize(decodeURL(url, encoding, decodeEntities, decodeURLEscapeSequencesTwice));
m_inputURL = url;
m_encoding = encoding;
m_decodeEntities = decodeEntities;
+ m_decodeURLEscapeSequencesTwice = decodeURLEscapeSequencesTwice;
return m_cachedCanonicalizedURL;
}
@@ -90,7 +105,7 @@ bool XSSAuditor::canEvaluate(const String& code) const
if (!isEnabled())
return true;
- if (findInRequest(code, false)) {
+ if (findInRequest(code, false, true)) {
DEFINE_STATIC_LOCAL(String, consoleMessage, ("Refused to execute a JavaScript script. Source code of script found within request.\n"));
m_frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, consoleMessage, 1, String());
return false;
@@ -103,7 +118,7 @@ bool XSSAuditor::canEvaluateJavaScriptURL(const String& code) const
if (!isEnabled())
return true;
- if (findInRequest(code)) {
+ if (findInRequest(code, true, false, true)) {
DEFINE_STATIC_LOCAL(String, consoleMessage, ("Refused to execute a JavaScript script. Source code of script found within request.\n"));
m_frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, consoleMessage, 1, String());
return false;
@@ -116,7 +131,7 @@ bool XSSAuditor::canCreateInlineEventListener(const String&, const String& code)
if (!isEnabled())
return true;
- if (findInRequest(code)) {
+ if (findInRequest(code, true, true)) {
DEFINE_STATIC_LOCAL(String, consoleMessage, ("Refused to execute a JavaScript script. Source code of script found within request.\n"));
m_frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, consoleMessage, 1, String());
return false;
@@ -129,6 +144,16 @@ bool XSSAuditor::canLoadExternalScriptFromSrc(const String& context, const Strin
if (!isEnabled())
return true;
+ // If the script is loaded from the same URL as the enclosing page, it's
+ // probably not an XSS attack, so we reduce false positives by allowing the
+ // script. If the script has a query string, we're more suspicious,
+ // however, because that's pretty rare and the attacker might be able to
+ // trick a server-side script into doing something dangerous with the query
+ // string.
+ KURL scriptURL(m_frame->document()->url(), url);
+ if (m_frame->document()->url().host() == scriptURL.host() && scriptURL.query().isEmpty())
+ return true;
+
if (findInRequest(context + url)) {
DEFINE_STATIC_LOCAL(String, consoleMessage, ("Refused to execute a JavaScript script. Source code of script found within request.\n"));
m_frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, consoleMessage, 1, String());
@@ -170,7 +195,7 @@ String XSSAuditor::canonicalize(const String& string)
return result.removeCharacters(&isNonCanonicalCharacter);
}
-String XSSAuditor::decodeURL(const String& string, const TextEncoding& encoding, bool decodeEntities)
+String XSSAuditor::decodeURL(const String& string, const TextEncoding& encoding, bool decodeEntities, bool decodeURLEscapeSequencesTwice)
{
String result;
String url = string;
@@ -181,6 +206,13 @@ String XSSAuditor::decodeURL(const String& string, const TextEncoding& encoding,
String decodedResult = encoding.decode(utf8Url.data(), utf8Url.length());
if (!decodedResult.isEmpty())
result = decodedResult;
+ if (decodeURLEscapeSequencesTwice) {
+ result = decodeURLEscapeSequences(result);
+ utf8Url = result.utf8();
+ decodedResult = encoding.decode(utf8Url.data(), utf8Url.length());
+ if (!decodedResult.isEmpty())
+ result = decodedResult;
+ }
if (decodeEntities)
result = decodeHTMLEntities(result);
return result;
@@ -223,18 +255,20 @@ String XSSAuditor::decodeHTMLEntities(const String& string, bool leaveUndecodabl
return String::adopt(result);
}
-bool XSSAuditor::findInRequest(const String& string, bool decodeEntities) const
+bool XSSAuditor::findInRequest(const String& string, bool decodeEntities, bool allowRequestIfNoIllegalURICharacters,
+ bool decodeURLEscapeSequencesTwice) const
{
bool result = false;
Frame* parentFrame = m_frame->tree()->parent();
if (parentFrame && m_frame->document()->url() == blankURL())
- result = findInRequest(parentFrame, string, decodeEntities);
+ result = findInRequest(parentFrame, string, decodeEntities, allowRequestIfNoIllegalURICharacters, decodeURLEscapeSequencesTwice);
if (!result)
- result = findInRequest(m_frame, string, decodeEntities);
+ result = findInRequest(m_frame, string, decodeEntities, allowRequestIfNoIllegalURICharacters, decodeURLEscapeSequencesTwice);
return result;
}
-bool XSSAuditor::findInRequest(Frame* frame, const String& string, bool decodeEntities) const
+bool XSSAuditor::findInRequest(Frame* frame, const String& string, bool decodeEntities, bool allowRequestIfNoIllegalURICharacters,
+ bool decodeURLEscapeSequencesTwice) const
{
ASSERT(frame->document());
@@ -273,9 +307,14 @@ bool XSSAuditor::findInRequest(Frame* frame, const String& string, bool decodeEn
if (string.length() < pageURL.length()) {
// The string can actually fit inside the pageURL.
- String decodedPageURL = m_cache.canonicalizeURL(pageURL, frame->document()->decoder()->encoding(), decodeEntities);
+ String decodedPageURL = m_cache.canonicalizeURL(pageURL, frame->document()->decoder()->encoding(), decodeEntities, decodeURLEscapeSequencesTwice);
+
+ if (allowRequestIfNoIllegalURICharacters && (!formDataObj || formDataObj->isEmpty())
+ && decodedPageURL.find(&isIllegalURICharacter, 0) == -1)
+ return false; // Injection is impossible because the request does not contain any illegal URI characters.
+
if (decodedPageURL.find(canonicalizedString, 0, false) != -1)
- return true; // We've found the smoking gun.
+ return true; // We've found the smoking gun.
}
if (formDataObj && !formDataObj->isEmpty()) {
@@ -285,7 +324,7 @@ bool XSSAuditor::findInRequest(Frame* frame, const String& string, bool decodeEn
// the url-encoded POST data because the length of the url-decoded
// code is less than or equal to the length of the url-encoded
// string.
- String decodedFormData = m_cache.canonicalizeURL(formData, frame->document()->decoder()->encoding(), decodeEntities);
+ String decodedFormData = m_cache.canonicalizeURL(formData, frame->document()->decoder()->encoding(), decodeEntities, decodeURLEscapeSequencesTwice);
if (decodedFormData.find(canonicalizedString, 0, false) != -1)
return true; // We found the string in the POST data.
}
diff --git a/src/3rdparty/webkit/WebCore/page/XSSAuditor.h b/src/3rdparty/webkit/WebCore/page/XSSAuditor.h
index 58b2cc2..adfa5c7 100644
--- a/src/3rdparty/webkit/WebCore/page/XSSAuditor.h
+++ b/src/3rdparty/webkit/WebCore/page/XSSAuditor.h
@@ -102,25 +102,30 @@ namespace WebCore {
class CachingURLCanonicalizer
{
public:
- CachingURLCanonicalizer() : m_decodeEntities(false) { }
- String canonicalizeURL(const String& url, const TextEncoding& encoding, bool decodeEntities);
+ CachingURLCanonicalizer() : m_decodeEntities(false), m_decodeURLEscapeSequencesTwice(false) { }
+ String canonicalizeURL(const String& url, const TextEncoding& encoding, bool decodeEntities,
+ bool decodeURLEscapeSequencesTwice);
private:
// The parameters we were called with last.
String m_inputURL;
TextEncoding m_encoding;
bool m_decodeEntities;
+ bool m_decodeURLEscapeSequencesTwice;
// The cached result.
String m_cachedCanonicalizedURL;
};
static String canonicalize(const String&);
- static String decodeURL(const String& url, const TextEncoding& encoding, bool decodeEntities);
+ static String decodeURL(const String& url, const TextEncoding& encoding, bool decodeEntities,
+ bool decodeURLEscapeSequencesTwice = false);
static String decodeHTMLEntities(const String&, bool leaveUndecodableEntitiesUntouched = true);
- bool findInRequest(const String&, bool decodeEntities = true) const;
- bool findInRequest(Frame*, const String&, bool decodeEntities = true) const;
+ bool findInRequest(const String&, bool decodeEntities = true, bool allowRequestIfNoIllegalURICharacters = false,
+ bool decodeURLEscapeSequencesTwice = false) const;
+ bool findInRequest(Frame*, const String&, bool decodeEntities = true, bool allowRequestIfNoIllegalURICharacters = false,
+ bool decodeURLEscapeSequencesTwice = false) const;
// The frame to audit.
Frame* m_frame;
diff --git a/src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp b/src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp
index e54be8b..ec0e284 100644
--- a/src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp
+++ b/src/3rdparty/webkit/WebCore/page/animation/AnimationBase.cpp
@@ -361,6 +361,10 @@ public:
{
Color fromColor = (a->*m_getter)();
Color toColor = (b->*m_getter)();
+
+ if (!fromColor.isValid() && !toColor.isValid())
+ return true;
+
if (!fromColor.isValid())
fromColor = a->color();
if (!toColor.isValid())
@@ -373,6 +377,10 @@ public:
{
Color fromColor = (a->*m_getter)();
Color toColor = (b->*m_getter)();
+
+ if (!fromColor.isValid() && !toColor.isValid())
+ return;
+
if (!fromColor.isValid())
fromColor = a->color();
if (!toColor.isValid())
@@ -635,7 +643,7 @@ static void ensurePropertyMap()
gPropertyWrappers->append(new PropertyWrapperMaybeInvalidColor(CSSPropertyOutlineColor, &RenderStyle::outlineColor, &RenderStyle::setOutlineColor));
// These are for shadows
- gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyBoxShadow, &RenderStyle::boxShadow, &RenderStyle::setBoxShadow));
+ gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyWebkitBoxShadow, &RenderStyle::boxShadow, &RenderStyle::setBoxShadow));
gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyTextShadow, &RenderStyle::textShadow, &RenderStyle::setTextShadow));
#if ENABLE(SVG)
diff --git a/src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp b/src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp
index 691932e..aa5de2c 100644
--- a/src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp
+++ b/src/3rdparty/webkit/WebCore/page/animation/AnimationController.cpp
@@ -55,7 +55,7 @@ AnimationControllerPrivate::AnimationControllerPrivate(Frame* frame)
, m_lastStyleAvailableWaiter(0)
, m_responseWaiters(0)
, m_lastResponseWaiter(0)
- , m_waitingForAResponse(false)
+ , m_waitingForResponse(false)
{
}
@@ -279,6 +279,19 @@ double AnimationControllerPrivate::beginAnimationUpdateTime()
return m_beginAnimationUpdateTime;
}
+void AnimationControllerPrivate::endAnimationUpdate()
+{
+ styleAvailable();
+ if (!m_waitingForResponse)
+ startTimeResponse(beginAnimationUpdateTime());
+}
+
+void AnimationControllerPrivate::receivedStartTimeResponse(double time)
+{
+ m_waitingForResponse = false;
+ startTimeResponse(time);
+}
+
PassRefPtr<RenderStyle> AnimationControllerPrivate::getAnimatedStyleForRenderer(RenderObject* renderer)
{
if (!renderer)
@@ -378,7 +391,7 @@ void AnimationControllerPrivate::addToStartTimeResponseWaitList(AnimationBase* a
ASSERT(!animation->next());
if (willGetResponse)
- m_waitingForAResponse = true;
+ m_waitingForResponse = true;
if (m_responseWaiters)
m_lastResponseWaiter->setNext(animation);
@@ -408,13 +421,13 @@ void AnimationControllerPrivate::removeFromStartTimeResponseWaitList(AnimationBa
}
}
-void AnimationControllerPrivate::startTimeResponse(double t)
+void AnimationControllerPrivate::startTimeResponse(double time)
{
// Go through list of waiters and send them on their way
for (AnimationBase* animation = m_responseWaiters; animation; ) {
AnimationBase* nextAnimation = animation->next();
animation->setNext(0);
- animation->onAnimationStartResponse(t);
+ animation->onAnimationStartResponse(time);
animation = nextAnimation;
}
diff --git a/src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h b/src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h
index 359b9b5..7db3803 100644
--- a/src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h
+++ b/src/3rdparty/webkit/WebCore/page/animation/AnimationControllerPrivate.h
@@ -80,18 +80,8 @@ public:
double beginAnimationUpdateTime();
void setBeginAnimationUpdateTime(double t) { m_beginAnimationUpdateTime = t; }
- void endAnimationUpdate()
- {
- styleAvailable();
- if (!m_waitingForAResponse)
- startTimeResponse(beginAnimationUpdateTime());
- }
-
- void receivedStartTimeResponse(double t)
- {
- m_waitingForAResponse = false;
- startTimeResponse(t);
- }
+ void endAnimationUpdate();
+ void receivedStartTimeResponse(double);
void addToStyleAvailableWaitList(AnimationBase*);
void removeFromStyleAvailableWaitList(AnimationBase*);
@@ -127,7 +117,7 @@ private:
AnimationBase* m_responseWaiters;
AnimationBase* m_lastResponseWaiter;
- bool m_waitingForAResponse;
+ bool m_waitingForResponse;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp b/src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp
index 8e6349d..50fc781 100644
--- a/src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp
+++ b/src/3rdparty/webkit/WebCore/page/animation/ImplicitAnimation.cpp
@@ -142,10 +142,8 @@ void ImplicitAnimation::onAnimationEnd(double elapsedTime)
if (keyframeAnim)
keyframeAnim->setUnanimatedStyle(m_toStyle);
- if (!sendTransitionEvent(eventNames().webkitTransitionEndEvent, elapsedTime)) {
- // We didn't dispatch an event, which would call endAnimation(), so we'll just call it here.
- endAnimation(true);
- }
+ sendTransitionEvent(eventNames().webkitTransitionEndEvent, elapsedTime);
+ endAnimation(true);
}
bool ImplicitAnimation::sendTransitionEvent(const AtomicString& eventType, double elapsedTime)
diff --git a/src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp b/src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp
index 39ae1e7..7e37e5f 100644
--- a/src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp
+++ b/src/3rdparty/webkit/WebCore/page/animation/KeyframeAnimation.cpp
@@ -244,10 +244,8 @@ void KeyframeAnimation::onAnimationIteration(double elapsedTime)
void KeyframeAnimation::onAnimationEnd(double elapsedTime)
{
- if (!sendAnimationEvent(eventNames().webkitAnimationEndEvent, elapsedTime)) {
- // We didn't dispatch an event, which would call endAnimation(), so we'll just call it here.
- endAnimation(true);
- }
+ sendAnimationEvent(eventNames().webkitAnimationEndEvent, elapsedTime);
+ endAnimation(true);
}
bool KeyframeAnimation::sendAnimationEvent(const AtomicString& eventType, double elapsedTime)
diff --git a/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp b/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp
index 21fa7df..ee6aa4e 100644
--- a/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp
@@ -361,10 +361,10 @@ void ContextMenu::populate()
appendItem(StopItem);
appendItem(ReloadItem);
#else
- if (loader->canGoBackOrForward(-1))
+ if (frame->page() && frame->page()->canGoBackOrForward(-1))
appendItem(BackItem);
- if (loader->canGoBackOrForward(1))
+ if (frame->page() && frame->page()->canGoBackOrForward(1))
appendItem(ForwardItem);
// use isLoadingInAPISense rather than isLoading because Stop/Reload are
@@ -721,10 +721,10 @@ void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const
#endif
#if PLATFORM(GTK)
case ContextMenuItemTagGoBack:
- shouldEnable = frame->loader()->canGoBackOrForward(-1);
+ shouldEnable = frame->page() && frame->page()->canGoBackOrForward(-1);
break;
case ContextMenuItemTagGoForward:
- shouldEnable = frame->loader()->canGoBackOrForward(1);
+ shouldEnable = frame->page() && frame->page()->canGoBackOrForward(1);
break;
case ContextMenuItemTagStop:
shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense();
diff --git a/src/3rdparty/webkit/WebCore/platform/Cookie.h b/src/3rdparty/webkit/WebCore/platform/Cookie.h
index 3e74ddc..0fe3851 100644
--- a/src/3rdparty/webkit/WebCore/platform/Cookie.h
+++ b/src/3rdparty/webkit/WebCore/platform/Cookie.h
@@ -27,6 +27,7 @@
#define Cookie_h
#include "PlatformString.h"
+#include "StringHash.h"
namespace WebCore {
@@ -58,6 +59,24 @@ namespace WebCore {
bool session;
};
+ struct CookieHash {
+ static unsigned hash(Cookie key)
+ {
+ return StringHash::hash(key.name) + StringHash::hash(key.domain) + StringHash::hash(key.path) + key.secure;
+ }
+
+ static bool equal(Cookie a, Cookie b)
+ {
+ return a.name == b.name && a.domain == b.domain && a.path == b.path && a.secure == b.secure;
+ }
+ };
+}
+
+namespace WTF {
+ template<typename T> struct DefaultHash;
+ template<> struct DefaultHash<WebCore::Cookie> {
+ typedef WebCore::CookieHash Hash;
+ };
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp
index 9ca626f..d02da6c 100644
--- a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp
@@ -41,7 +41,7 @@ namespace WebCore {
CrossThreadCopierBase<false, String>::Type CrossThreadCopierBase<false, String>::copy(const String& str)
{
- return str.copy();
+ return str.crossThreadString();
}
CrossThreadCopierBase<false, ResourceError>::Type CrossThreadCopierBase<false, ResourceError>::copy(const ResourceError& error)
diff --git a/src/3rdparty/webkit/WebCore/platform/KURL.cpp b/src/3rdparty/webkit/WebCore/platform/KURL.cpp
index aa9c624..ffacc19 100644
--- a/src/3rdparty/webkit/WebCore/platform/KURL.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/KURL.cpp
@@ -529,7 +529,7 @@ void KURL::init(const KURL& base, const String& relative, const TextEncoding& en
KURL KURL::copy() const
{
KURL result = *this;
- result.m_string = result.m_string.copy();
+ result.m_string = result.m_string.crossThreadString();
return result;
}
diff --git a/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp b/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp
index b323332..d0aae0c 100644
--- a/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp
@@ -106,7 +106,7 @@ static inline bool isUnicodeEncoding(const TextEncoding* encoding)
static bool lowerCaseEqualsASCII(const char* begin, const char* end, const char* str)
{
while (begin != end && *str) {
- ASSERT(isASCIILower(*str));
+ ASSERT(toASCIILower(*str) == *str);
if (toASCIILower(*begin++) != *str++)
return false;
}
diff --git a/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp b/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp
index d8c3318..ee8726a 100644
--- a/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp
@@ -751,6 +751,22 @@ void ScrollView::paintScrollCorner(GraphicsContext* context, const IntRect& corn
ScrollbarTheme::nativeTheme()->paintScrollCorner(this, context, cornerRect);
}
+void ScrollView::paintScrollbars(GraphicsContext* context, const IntRect& rect)
+{
+ if (m_horizontalScrollbar)
+ m_horizontalScrollbar->paint(context, rect);
+ if (m_verticalScrollbar)
+ m_verticalScrollbar->paint(context, rect);
+
+ paintScrollCorner(context, scrollCornerRect());
+}
+
+void ScrollView::paintPanScrollIcon(GraphicsContext* context)
+{
+ DEFINE_STATIC_LOCAL(Image*, panScrollIcon, (Image::loadPlatformResource("panIcon").releaseRef()));
+ context->drawImage(panScrollIcon, m_panScrollIconPoint);
+}
+
void ScrollView::paint(GraphicsContext* context, const IntRect& rect)
{
if (platformWidget()) {
@@ -785,20 +801,15 @@ void ScrollView::paint(GraphicsContext* context, const IntRect& rect)
scrollViewDirtyRect.intersect(frameRect());
context->translate(x(), y());
scrollViewDirtyRect.move(-x(), -y());
- if (m_horizontalScrollbar)
- m_horizontalScrollbar->paint(context, scrollViewDirtyRect);
- if (m_verticalScrollbar)
- m_verticalScrollbar->paint(context, scrollViewDirtyRect);
- paintScrollCorner(context, scrollCornerRect());
+ paintScrollbars(context, scrollViewDirtyRect);
+
context->restore();
}
// Paint the panScroll Icon
- if (m_drawPanScrollIcon) {
- DEFINE_STATIC_LOCAL(RefPtr<Image>, panScrollIcon, (Image::loadPlatformResource("panIcon")));
- context->drawImage(panScrollIcon.get(), m_panScrollIconPoint);
- }
+ if (m_drawPanScrollIcon)
+ paintPanScrollIcon(context);
}
bool ScrollView::isPointInScrollbarCorner(const IntPoint& windowPoint)
diff --git a/src/3rdparty/webkit/WebCore/platform/ScrollView.h b/src/3rdparty/webkit/WebCore/platform/ScrollView.h
index 8fcdf60..1950a54 100644
--- a/src/3rdparty/webkit/WebCore/platform/ScrollView.h
+++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.h
@@ -207,6 +207,7 @@ public:
// Widget override. Handles painting of the contents of the view as well as the scrollbars.
virtual void paint(GraphicsContext*, const IntRect&);
+ void paintScrollbars(GraphicsContext*, const IntRect&);
// Widget overrides to ensure that our children's visibility status is kept up to date when we get shown and hidden.
virtual void show();
@@ -217,6 +218,7 @@ public:
static const int noPanScrollRadius = 15;
void addPanScrollIcon(const IntPoint&);
void removePanScrollIcon();
+ void paintPanScrollIcon(GraphicsContext*);
virtual bool isPointInScrollbarCorner(const IntPoint&);
virtual bool scrollbarCornerPresent() const;
@@ -234,7 +236,7 @@ protected:
virtual void contentsResized() = 0;
virtual void visibleContentsResized() = 0;
-
+
// These methods are used to create/destroy scrollbars.
void setHasHorizontalScrollbar(bool);
void setHasVerticalScrollbar(bool);
diff --git a/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h b/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h
index 7171102..3fc5b0f 100644
--- a/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h
+++ b/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h
@@ -30,6 +30,9 @@
namespace WebCore {
+ // Once disabled via one or more more calls to disableSuddenTermination(), fast shutdown
+ // is not valid until enableSuddenTermination() has been called an equal number of times.
+ // On Mac, these are thin wrappers around Mac OS X functions of the same name.
void disableSuddenTermination();
void enableSuddenTermination();
diff --git a/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h b/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h
index 3ab41dd..e132313 100644
--- a/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h
+++ b/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h
@@ -46,7 +46,7 @@ typedef unsigned ControlStates;
// Must follow CSSValueKeywords.in order
enum ControlPart {
NoControlPart, CheckboxPart, RadioPart, PushButtonPart, SquareButtonPart, ButtonPart,
- ButtonBevelPart, DefaultButtonPart, ListboxPart, ListItemPart,
+ ButtonBevelPart, DefaultButtonPart, ListButtonPart, ListboxPart, ListItemPart,
MediaFullscreenButtonPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart,
MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart,
MediaSliderPart, MediaSliderThumbPart, MediaVolumeSliderContainerPart, MediaVolumeSliderPart, MediaVolumeSliderThumbPart,
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h
index 0f3f9aa..d712efb 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h
@@ -141,6 +141,7 @@ public:
#endif
#if PLATFORM(WIN)
+ static PassRefPtr<BitmapImage> create(HBITMAP);
virtual bool getHBITMAP(HBITMAP);
virtual bool getHBITMAPOfSize(HBITMAP, LPSIZE);
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h b/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h
index a60af29..fc63db9 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h
@@ -29,6 +29,7 @@
#include "FontRenderingMode.h"
#include "FontSmoothingMode.h"
#include "FontTraitsMask.h"
+#include "TextRenderingMode.h"
namespace WebCore {
@@ -63,6 +64,7 @@ public:
, m_renderingMode(NormalRenderingMode)
, m_keywordSize(0)
, m_fontSmoothing(AutoSmoothing)
+ , m_textRendering(AutoTextRendering)
{
}
@@ -87,6 +89,7 @@ public:
FontRenderingMode renderingMode() const { return static_cast<FontRenderingMode>(m_renderingMode); }
unsigned keywordSize() const { return m_keywordSize; }
FontSmoothingMode fontSmoothing() const { return static_cast<FontSmoothingMode>(m_fontSmoothing); }
+ TextRenderingMode textRenderingMode() const { return static_cast<TextRenderingMode>(m_textRendering); }
FontTraitsMask traitsMask() const;
@@ -102,6 +105,7 @@ public:
void setRenderingMode(FontRenderingMode mode) { m_renderingMode = mode; }
void setKeywordSize(unsigned s) { m_keywordSize = s; }
void setFontSmoothing(FontSmoothingMode smoothing) { m_fontSmoothing = smoothing; }
+ void setTextRenderingMode(TextRenderingMode rendering) { m_textRendering = rendering; }
private:
FontFamily m_familyList; // The list of font families to be used.
@@ -125,6 +129,7 @@ private:
// (e.g., 13px monospace vs. 16px everything else). Sizes are 1-8 (like the HTML size values for <font>).
unsigned m_fontSmoothing : 2; // FontSmoothingMode
+ unsigned m_textRendering : 2; // TextRenderingMode
};
inline bool FontDescription::operator==(const FontDescription& other) const
@@ -140,7 +145,8 @@ inline bool FontDescription::operator==(const FontDescription& other) const
&& m_usePrinterFont == other.m_usePrinterFont
&& m_renderingMode == other.m_renderingMode
&& m_keywordSize == other.m_keywordSize
- && m_fontSmoothing == other.m_fontSmoothing;
+ && m_fontSmoothing == other.m_fontSmoothing
+ && m_textRendering == other.m_textRendering;
}
}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp
index b0e39db..5246593 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp
@@ -251,6 +251,10 @@ bool Font::canUseGlyphCache(const TextRun& run) const
return false;
}
+ TextRenderingMode textMode = m_fontDescription.textRenderingMode();
+ if (textMode == OptimizeLegibility || textMode == GeometricPrecision)
+ return false;
+
return true;
}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h
index e0d9294..c6bb20c 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h
@@ -297,6 +297,11 @@ namespace WebCore {
void addPath(const Path&);
void clip(const Path&);
+
+ // This clip function is used only by <canvas> code. It allows
+ // implementations to handle clipping on the canvas differently since
+ // the disipline is different.
+ void canvasClip(const Path&);
void clipOut(const Path&);
void scale(const FloatSize&);
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h
index edda215..67224e2 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h
@@ -45,6 +45,7 @@ const Platform3DObject NullPlatform3DObject = 0;
#endif
namespace WebCore {
+ class CanvasActiveInfo;
class CanvasArray;
class CanvasBuffer;
class CanvasUnsignedByteArray;
@@ -61,9 +62,15 @@ namespace WebCore {
class HTMLVideoElement;
class ImageData;
class WebKitCSSMatrix;
-
+
+ struct ActiveInfo {
+ String name;
+ unsigned type;
+ int size;
+ };
+
// FIXME: ideally this would be used on all platforms.
-#if PLATFORM(SKIA)
+#if PLATFORM(CHROMIUM)
class GraphicsContext3DInternal;
#endif
@@ -77,7 +84,7 @@ namespace WebCore {
#if PLATFORM(MAC)
PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; }
Platform3DObject platformTexture() const { return m_texture; }
-#elif PLATFORM(SKIA)
+#elif PLATFORM(CHROMIUM)
PlatformGraphicsContext3D platformGraphicsContext3D() const;
Platform3DObject platformTexture() const;
#else
@@ -141,6 +148,9 @@ namespace WebCore {
void frontFace(unsigned long mode);
void generateMipmap(unsigned long target);
+ bool getActiveAttrib(CanvasProgram* program, unsigned long index, ActiveInfo&);
+ bool getActiveUniform(CanvasProgram* program, unsigned long index, ActiveInfo&);
+
int getAttribLocation(CanvasProgram*, const String& name);
bool getBoolean(unsigned long pname);
@@ -204,8 +214,7 @@ namespace WebCore {
void pixelStorei(unsigned long pname, long param);
void polygonOffset(double factor, double units);
- // TBD
- //void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels);
+ PassRefPtr<CanvasArray> readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type);
void releaseShaderCompiler();
void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
@@ -323,7 +332,7 @@ namespace WebCore {
#endif
// FIXME: ideally this would be used on all platforms.
-#if PLATFORM(SKIA)
+#if PLATFORM(CHROMIUM)
friend class GraphicsContext3DInternal;
OwnPtr<GraphicsContext3DInternal> m_internal;
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp
index b375bd3..d196a0c 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp
@@ -86,6 +86,16 @@ GraphicsLayer::~GraphicsLayer()
removeFromParent();
}
+bool GraphicsLayer::hasAncestor(GraphicsLayer* ancestor) const
+{
+ for (GraphicsLayer* curr = parent(); curr; curr = curr->parent()) {
+ if (curr == ancestor)
+ return true;
+ }
+
+ return false;
+}
+
void GraphicsLayer::addChild(GraphicsLayer* childLayer)
{
ASSERT(childLayer != this);
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h
index 2924073..e5b17a6 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h
@@ -172,6 +172,9 @@ public:
GraphicsLayer* parent() const { return m_parent; };
void setParent(GraphicsLayer* layer) { m_parent = layer; } // Internal use only.
+ // Returns true if the layer has the given layer as an ancestor (excluding self).
+ bool hasAncestor(GraphicsLayer*) const;
+
const Vector<GraphicsLayer*>& children() const { return m_children; }
// Add child layers. If the child is already parented, it will be removed from its old parent.
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp
index 799368b..bf7ae21 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp
@@ -120,8 +120,6 @@ size_t ImageSource::frameCount() const
return m_decoder ? m_decoder->frameCount() : 0;
}
-#if !PLATFORM(QT)
-
NativeImagePtr ImageSource::createFrameAtIndex(size_t index)
{
if (!m_decoder)
@@ -180,6 +178,4 @@ bool ImageSource::frameIsCompleteAtIndex(size_t index)
return buffer && buffer->status() == RGBA32Buffer::FrameComplete;
}
-#endif
-
}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp
index 23410b2..3b32b65 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp
@@ -62,10 +62,11 @@ public:
virtual void load(const String&) { }
virtual void cancelLoad() { }
+ virtual void prepareToPlay() { }
virtual void play() { }
virtual void pause() { }
- virtual bool supportsFullscreen() const { return false; }
+ virtual PlatformMedia platformMedia() const { return NoPlatformMedia; }
virtual IntSize naturalSize() const { return IntSize(0, 0); }
@@ -104,8 +105,10 @@ public:
virtual void paint(GraphicsContext*, const IntRect&) { }
+ virtual bool canLoadPoster() const { return false; }
+ virtual void setPoster(const String&) { }
+
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- virtual void setPoster(const String& /*url*/) { }
virtual void deliverNotification(MediaPlayerProxyNotificationType) { }
virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) { }
#endif
@@ -253,18 +256,26 @@ void MediaPlayer::load(const String& url, const ContentType& contentType)
m_private.set(createNullMediaPlayer(this));
}
-#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+bool MediaPlayer::canLoadPoster() const
+{
+ return m_private->canLoadPoster();
+}
+
void MediaPlayer::setPoster(const String& url)
{
m_private->setPoster(url);
}
-#endif
void MediaPlayer::cancelLoad()
{
m_private->cancelLoad();
}
+void MediaPlayer::prepareToPlay()
+{
+ m_private->prepareToPlay();
+}
+
void MediaPlayer::play()
{
m_private->play();
@@ -338,6 +349,11 @@ bool MediaPlayer::inMediaDocument()
return document && document->isMediaDocument();
}
+PlatformMedia MediaPlayer::platformMedia() const
+{
+ return m_private->platformMedia();
+}
+
MediaPlayer::NetworkState MediaPlayer::networkState()
{
return m_private->networkState();
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h
index 4c5ee5b..4cc6476 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h
@@ -38,8 +38,24 @@
#include <wtf/OwnPtr.h>
#include <wtf/Noncopyable.h>
+#ifdef __OBJC__
+@class QTMovie;
+#else
+class QTMovie;
+#endif
+
namespace WebCore {
+// Structure that will hold every native
+// types supported by the current media player.
+// We have to do that has multiple media players
+// backend can live at runtime.
+typedef struct PlatformMedia {
+ QTMovie* qtMovie;
+} PlatformMedia;
+
+static const PlatformMedia NoPlatformMedia = { 0 };
+
class ContentType;
class FrameView;
class GraphicsContext;
@@ -110,6 +126,8 @@ public:
bool supportsFullscreen() const;
bool supportsSave() const;
+ PlatformMedia platformMedia() const;
+
IntSize naturalSize();
bool hasVideo() const;
bool hasAudio() const;
@@ -127,6 +145,7 @@ public:
bool visible() const;
void setVisible(bool);
+ void prepareToPlay();
void play();
void pause();
@@ -186,8 +205,10 @@ public:
MediaPlayerClient* mediaPlayerClient() const { return m_mediaPlayerClient; }
+ bool canLoadPoster() const;
+ void setPoster(const String&);
+
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- void setPoster(const String& url);
void deliverNotification(MediaPlayerProxyNotificationType notification);
void setMediaPlayerProxy(WebMediaPlayerProxy* proxy);
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h
index 9cc89c5..f5687b3 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h
@@ -43,6 +43,9 @@ public:
virtual void load(const String& url) = 0;
virtual void cancelLoad() = 0;
+ virtual void prepareToPlay() { }
+ virtual PlatformMedia platformMedia() const { return NoPlatformMedia; }
+
virtual void play() = 0;
virtual void pause() = 0;
@@ -93,8 +96,10 @@ public:
virtual void setAutobuffer(bool) { };
+ virtual bool canLoadPoster() const { return false; }
+ virtual void setPoster(const String&) { }
+
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- virtual void setPoster(const String& url) = 0;
virtual void deliverNotification(MediaPlayerProxyNotificationType) = 0;
virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) = 0;
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h
index d326658..387a5c7 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h
@@ -28,6 +28,7 @@
#include "FontPlatformData.h"
#include "GlyphPageTreeNode.h"
#include "GlyphWidthMap.h"
+#include "TextRenderingMode.h"
#include <wtf/OwnPtr.h>
#if USE(ATSUI)
@@ -120,7 +121,7 @@ public:
#if USE(CORE_TEXT)
CTFontRef getCTFont() const;
- CFDictionaryRef getCFStringAttributes() const;
+ CFDictionaryRef getCFStringAttributes(TextRenderingMode) const;
#endif
#if USE(ATSUI)
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h b/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h
new file mode 100644
index 0000000..4f817a4
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TextRenderingMode_h
+#define TextRenderingMode_h
+
+namespace WebCore {
+
+ enum TextRenderingMode { AutoTextRendering, OptimizeSpeed, OptimizeLegibility, GeometricPrecision };
+
+} // namespace WebCore
+
+#endif // TextRenderingMode_h
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp
index f452a2d..1b41165 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp
@@ -133,8 +133,8 @@ void FEComposite::apply(Filter* filter)
FloatRect srcRect = FloatRect(0.f, 0.f, -1.f, -1.f);
switch (m_type) {
case FECOMPOSITE_OPERATOR_OVER:
- filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()));
filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()));
+ filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()));
break;
case FECOMPOSITE_OPERATOR_IN:
filterContext->save();
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
new file mode 100644
index 0000000..a62dfdc
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
@@ -0,0 +1,139 @@
+/*
+ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
+ 2004, 2005 Rob Buis <buis@kde.org>
+ 2005 Eric Seidel <eric@webkit.org>
+ 2009 Dirk Schulze <krit@webkit.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ aint with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+
+#if ENABLE(FILTERS)
+#include "FEGaussianBlur.h"
+
+#include "CanvasPixelArray.h"
+#include "Filter.h"
+#include "GraphicsContext.h"
+#include "ImageData.h"
+#include <math.h>
+
+namespace WebCore {
+
+FEGaussianBlur::FEGaussianBlur(FilterEffect* in, const float& x, const float& y)
+ : FilterEffect()
+ , m_in(in)
+ , m_x(x)
+ , m_y(y)
+{
+}
+
+PassRefPtr<FEGaussianBlur> FEGaussianBlur::create(FilterEffect* in, const float& x, const float& y)
+{
+ return adoptRef(new FEGaussianBlur(in, x, y));
+}
+
+float FEGaussianBlur::stdDeviationX() const
+{
+ return m_x;
+}
+
+void FEGaussianBlur::setStdDeviationX(float x)
+{
+ m_x = x;
+}
+
+float FEGaussianBlur::stdDeviationY() const
+{
+ return m_y;
+}
+
+void FEGaussianBlur::setStdDeviationY(float y)
+{
+ m_y = y;
+}
+
+void boxBlur(CanvasPixelArray*& srcPixelArray, CanvasPixelArray*& dstPixelArray,
+ unsigned dx, int stride, int strideLine, int effectWidth, int effectHeight, bool alphaImage)
+{
+ int dxLeft = static_cast<int>(floor(dx / 2));
+ int dxRight = dx - dxLeft;
+
+ for (int y = 0; y < effectHeight; ++y) {
+ int line = y * strideLine;
+ for (int channel = 3; channel >= 0; --channel) {
+ int sum = 0;
+ // Fill the kernel
+ int maxKernelSize = std::min(dxRight, effectWidth);
+ for (int i = 0; i < maxKernelSize; ++i)
+ sum += srcPixelArray->get(line + i * stride + channel);
+
+ // Blurring
+ for (int x = 0; x < effectWidth; ++x) {
+ int pixelByteOffset = line + x * stride + channel;
+ dstPixelArray->set(pixelByteOffset, static_cast<unsigned char>(sum / dx));
+ if (x >= dxLeft)
+ sum -= srcPixelArray->get(pixelByteOffset - dxLeft * stride);
+ if (x + dxRight < effectWidth)
+ sum += srcPixelArray->get(pixelByteOffset + dxRight * stride);
+ }
+ if (alphaImage) // Source image is black, it just has different alpha values
+ break;
+ }
+ }
+}
+
+void FEGaussianBlur::apply(Filter* filter)
+{
+ m_in->apply(filter);
+ if (!m_in->resultImage())
+ return;
+
+ if (!getEffectContext())
+ return;
+
+ setIsAlphaImage(m_in->isAlphaImage());
+
+ if (m_x == 0 || m_y == 0)
+ return;
+
+ unsigned sdx = static_cast<unsigned>(floor(m_x * 3 * sqrt(2 * M_PI) / 4.f + 0.5f));
+ unsigned sdy = static_cast<unsigned>(floor(m_y * 3 * sqrt(2 * M_PI) / 4.f + 0.5f));
+
+ IntRect effectDrawingRect = calculateDrawingIntRect(m_in->subRegion());
+ RefPtr<ImageData> srcImageData(m_in->resultImage()->getPremultipliedImageData(effectDrawingRect));
+ CanvasPixelArray* srcPixelArray(srcImageData->data());
+
+ IntRect imageRect(IntPoint(), resultImage()->size());
+ RefPtr<ImageData> tmpImageData = ImageData::create(imageRect.width(), imageRect.height());
+ CanvasPixelArray* tmpPixelArray(tmpImageData->data());
+
+ int stride = 4 * imageRect.width();
+ for (int i = 0; i < 3; ++i) {
+ boxBlur(srcPixelArray, tmpPixelArray, sdx, 4, stride, imageRect.width(), imageRect.height(), isAlphaImage());
+ boxBlur(tmpPixelArray, srcPixelArray, sdy, stride, 4, imageRect.height(), imageRect.width(), isAlphaImage());
+ }
+
+ resultImage()->putPremultipliedImageData(srcImageData.get(), imageRect, IntPoint());
+}
+
+void FEGaussianBlur::dump()
+{
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILTERS)
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h
index 69f1cc5..ecdb9e3 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h
@@ -19,10 +19,10 @@
Boston, MA 02110-1301, USA.
*/
-#ifndef SVGFEGaussianBlur_h
-#define SVGFEGaussianBlur_h
+#ifndef FEGaussianBlur_h
+#define FEGaussianBlur_h
-#if ENABLE(SVG) && ENABLE(FILTERS)
+#if ENABLE(FILTERS)
#include "FilterEffect.h"
#include "Filter.h"
@@ -41,7 +41,6 @@ namespace WebCore {
virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); }
void apply(Filter*);
void dump();
- TextStream& externalRepresentation(TextStream& ts) const;
private:
FEGaussianBlur(FilterEffect*, const float&, const float&);
@@ -53,6 +52,6 @@ namespace WebCore {
} // namespace WebCore
-#endif // ENABLE(SVG) && ENABLE(FILTERS)
+#endif // ENABLE(FILTERS)
-#endif // SVGFEGaussianBlur_h
+#endif // FEGaussianBlur_h
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp
index 5818e50..68900b5 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp
@@ -25,14 +25,11 @@
namespace WebCore {
FilterEffect::FilterEffect()
- : m_xBBoxMode(false)
- , m_yBBoxMode(false)
- , m_widthBBoxMode(false)
- , m_heightBBoxMode(false)
- , m_hasX(false)
+ : m_hasX(false)
, m_hasY(false)
, m_hasWidth(false)
, m_hasHeight(false)
+ , m_alphaImage(false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h
index e2b8a0e..b30e513 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h
@@ -38,18 +38,6 @@ namespace WebCore {
public:
virtual ~FilterEffect();
- bool xBoundingBoxMode() const { return m_xBBoxMode; }
- void setXBoundingBoxMode(bool bboxMode) { m_xBBoxMode = bboxMode; }
-
- bool yBoundingBoxMode() const { return m_yBBoxMode; }
- void setYBoundingBoxMode(bool bboxMode) { m_yBBoxMode = bboxMode; }
-
- bool widthBoundingBoxMode() const { return m_widthBBoxMode; }
- void setWidthBoundingBoxMode(bool bboxMode) { m_widthBBoxMode = bboxMode; }
-
- bool heightBoundingBoxMode() const { return m_heightBBoxMode; }
- void setHeightBoundingBoxMode(bool bboxMode) { m_heightBBoxMode = bboxMode; }
-
void setUnionOfChildEffectSubregions(const FloatRect& uniteRect) { m_unionOfChildEffectSubregions = uniteRect; }
FloatRect unionOfChildEffectSubregions() const { return m_unionOfChildEffectSubregions; }
@@ -79,6 +67,10 @@ namespace WebCore {
FloatRect calculateDrawingRect(const FloatRect&);
IntRect calculateDrawingIntRect(const FloatRect&);
+ // black image with different alpha values
+ bool isAlphaImage() { return m_alphaImage; }
+ void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; }
+
virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return filter->filterRegion(); }
virtual FloatRect calculateEffectRect(Filter*);
virtual void apply(Filter*) = 0;
@@ -102,6 +94,8 @@ namespace WebCore {
bool m_hasWidth : 1;
bool m_hasHeight : 1;
+ bool m_alphaImage;
+
FloatRect m_subRegion;
FloatRect m_unionOfChildEffectSubregions;
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp
index 646a57b..1b6309b 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp
@@ -22,6 +22,7 @@
#if ENABLE(FILTERS)
#include "SourceAlpha.h"
+#include "Color.h"
#include "GraphicsContext.h"
#include "PlatformString.h"
#include "Filter.h"
@@ -41,8 +42,30 @@ const AtomicString& SourceAlpha::effectName()
return s_effectName;
}
-void SourceAlpha::apply(Filter*)
+FloatRect SourceAlpha::calculateEffectRect(Filter* filter)
{
+ FloatRect clippedSourceRect = filter->sourceImageRect();
+ if (filter->sourceImageRect().x() < filter->filterRegion().x())
+ clippedSourceRect.setX(filter->filterRegion().x());
+ if (filter->sourceImageRect().y() < filter->filterRegion().y())
+ clippedSourceRect.setY(filter->filterRegion().y());
+ setSubRegion(clippedSourceRect);
+ return filter->filterRegion();
+}
+
+void SourceAlpha::apply(Filter* filter)
+{
+ GraphicsContext* filterContext = getEffectContext();
+ if (!filterContext)
+ return;
+
+ setIsAlphaImage(true);
+
+ FloatRect imageRect(FloatPoint(), filter->sourceImage()->image()->size());
+ filterContext->save();
+ filterContext->clipToImageBuffer(imageRect, filter->sourceImage());
+ filterContext->fillRect(imageRect, Color::black);
+ filterContext->restore();
}
void SourceAlpha::dump()
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h
index 5341562..172d05a 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h
@@ -35,7 +35,7 @@ namespace WebCore {
static const AtomicString& effectName();
virtual bool isSourceInput() { return true; }
- virtual FloatRect calculateEffectRect(Filter* filter) { return filter->sourceImageRect(); }
+ virtual FloatRect calculateEffectRect(Filter*);
void apply(Filter*);
void dump();
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp
index 5d16740..151766a 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp
@@ -40,7 +40,10 @@ Color::Color(const QColor& c)
Color::operator QColor() const
{
- return QColor(red(), green(), blue(), alpha());
+ if (m_valid)
+ return QColor(red(), green(), blue(), alpha());
+ else
+ return QColor();
}
}
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp
index 094054b..57a481a 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp
@@ -422,7 +422,7 @@ void GraphicsContext::drawRect(const IntRect& rect)
IntRect shadowRect = rect;
shadowRect.move(shadowSize.width(), shadowSize.height());
shadowRect.inflate(static_cast<int>(p->pen().widthF()));
- p->fillRect(shadowRect, shadowColor);
+ p->fillRect(shadowRect, QColor(shadowColor));
}
p->drawRect(rect);
@@ -482,11 +482,11 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2)
// Do a rect fill of our endpoints. This ensures we always have the
// appearance of being a border. We then draw the actual dotted/dashed line.
if (isVerticalLine) {
- p->fillRect(FloatRect(p1.x() - width / 2, p1.y() - width, width, width), color);
- p->fillRect(FloatRect(p2.x() - width / 2, p2.y(), width, width), color);
+ p->fillRect(FloatRect(p1.x() - width / 2, p1.y() - width, width, width), QColor(color));
+ p->fillRect(FloatRect(p2.x() - width / 2, p2.y(), width, width), QColor(color));
} else {
- p->fillRect(FloatRect(p1.x() - width, p1.y() - width / 2, width, width), color);
- p->fillRect(FloatRect(p2.x(), p2.y() - width / 2, width, width), color);
+ p->fillRect(FloatRect(p1.x() - width, p1.y() - width / 2, width, width), QColor(color));
+ p->fillRect(FloatRect(p2.x(), p2.y() - width / 2, width, width), QColor(color));
}
// Example: 80 pixels with a width of 30 pixels.
@@ -718,7 +718,7 @@ static inline void drawBorderlessRectShadow(GraphicsContext* context, QPainter*
if (context->getShadow(shadowSize, shadowBlur, shadowColor)) {
FloatRect shadowRect(rect);
shadowRect.move(shadowSize.width(), shadowSize.height());
- p->fillRect(shadowRect, shadowColor);
+ p->fillRect(shadowRect, QColor(shadowColor));
}
}
@@ -1053,20 +1053,29 @@ void GraphicsContext::clip(const Path& path)
m_data->p()->setClipPath(*path.platformPath(), Qt::IntersectClip);
}
+void GraphicsContext::canvasClip(const Path& path)
+{
+ clip(path);
+}
+
void GraphicsContext::clipOut(const Path& path)
{
if (paintingDisabled())
return;
QPainter* p = m_data->p();
- QRectF clipBounds = p->clipPath().boundingRect();
QPainterPath clippedOut = *path.platformPath();
QPainterPath newClip;
newClip.setFillRule(Qt::OddEvenFill);
- newClip.addRect(clipBounds);
- newClip.addPath(clippedOut);
-
- p->setClipPath(newClip, Qt::IntersectClip);
+ if (p->hasClipping()) {
+ newClip.addRect(p->clipPath().boundingRect());
+ newClip.addPath(clippedOut);
+ p->setClipPath(newClip, Qt::IntersectClip);
+ } else {
+ newClip.addRect(p->window());
+ newClip.addPath(clippedOut & newClip);
+ p->setClipPath(newClip);
+ }
}
void GraphicsContext::translate(float x, float y)
@@ -1125,13 +1134,20 @@ void GraphicsContext::clipOut(const IntRect& rect)
return;
QPainter* p = m_data->p();
- QRectF clipBounds = p->clipPath().boundingRect();
QPainterPath newClip;
newClip.setFillRule(Qt::OddEvenFill);
- newClip.addRect(clipBounds);
- newClip.addRect(QRect(rect));
-
- p->setClipPath(newClip, Qt::IntersectClip);
+ if (p->hasClipping()) {
+ newClip.addRect(p->clipPath().boundingRect());
+ newClip.addRect(QRect(rect));
+ p->setClipPath(newClip, Qt::IntersectClip);
+ } else {
+ QRect clipOutRect(rect);
+ QRect window(p->window());
+ clipOutRect &= window;
+ newClip.addRect(window);
+ newClip.addRect(clipOutRect);
+ p->setClipPath(newClip);
+ }
}
void GraphicsContext::clipOutEllipseInRect(const IntRect& rect)
@@ -1140,13 +1156,20 @@ void GraphicsContext::clipOutEllipseInRect(const IntRect& rect)
return;
QPainter* p = m_data->p();
- QRectF clipBounds = p->clipPath().boundingRect();
QPainterPath newClip;
newClip.setFillRule(Qt::OddEvenFill);
- newClip.addRect(clipBounds);
- newClip.addEllipse(QRect(rect));
-
- p->setClipPath(newClip, Qt::IntersectClip);
+ if (p->hasClipping()) {
+ newClip.addRect(p->clipPath().boundingRect());
+ newClip.addEllipse(QRect(rect));
+ p->setClipPath(newClip, Qt::IntersectClip);
+ } else {
+ QRect clipOutRect(rect);
+ QRect window(p->window());
+ clipOutRect &= window;
+ newClip.addRect(window);
+ newClip.addEllipse(clipOutRect);
+ p->setClipPath(newClip);
+ }
}
void GraphicsContext::clipToImageBuffer(const FloatRect&, const ImageBuffer*)
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
index 8851984..f8403b7 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
@@ -35,11 +35,6 @@
#include <QtGui/QImageReader>
#include <qdebug.h>
-namespace {
- const QImage::Format DesiredFormat = QImage::Format_ARGB32;
- const bool debugImageDecoderQt = false;
-}
-
namespace WebCore {
ImageDecoder* ImageDecoder::create(const SharedBuffer& data)
@@ -48,291 +43,205 @@ ImageDecoder* ImageDecoder::create(const SharedBuffer& data)
if (data.size() < 4)
return 0;
- QByteArray bytes = QByteArray::fromRawData(data.data(), data.size());
- QBuffer buffer(&bytes);
- if (!buffer.open(QBuffer::ReadOnly))
- return 0;
-
- QString imageFormat = QString::fromLatin1(QImageReader::imageFormat(&buffer).toLower());
- if (imageFormat.isEmpty())
- return 0; // Image format not supported
-
- return new ImageDecoderQt(imageFormat);
+ return new ImageDecoderQt;
}
-ImageDecoderQt::ImageData::ImageData(const QImage& image, ImageState imageState, int duration) :
- m_image(image), m_imageState(imageState), m_duration(duration)
+ImageDecoderQt::ImageDecoderQt()
+ : m_buffer(0)
+ , m_reader(0)
+ , m_repetitionCount(cAnimationNone)
{
}
-// Context, maintains IODevice on a data buffer.
-class ImageDecoderQt::ReadContext {
-public:
-
- enum LoadMode {
- // Load images incrementally. This is still experimental and
- // will cause the image plugins to report errors.
- // Also note that as of Qt 4.2.2, the JPEG loader does not return error codes
- // on "preliminary end of data".
- LoadIncrementally,
- // Load images only if all data have been received
- LoadComplete };
-
- ReadContext(SharedBuffer* data, LoadMode loadMode, ImageList &target);
-
- enum ReadResult { ReadEOF, ReadFailed, ReadPartial, ReadComplete };
-
- // Append data and read out all images. Returns the result
- // of the last read operation, so, even if ReadPartial is returned,
- // a few images might have been read.
- ReadResult read(bool allDataReceived);
-
- QImageReader *reader() { return &m_reader; }
-
-private:
- enum IncrementalReadResult { IncrementalReadFailed, IncrementalReadPartial, IncrementalReadComplete };
- // Incrementally read an image
- IncrementalReadResult readImageLines(ImageData &);
-
- const LoadMode m_loadMode;
+ImageDecoderQt::~ImageDecoderQt()
+{
+ delete m_reader;
+ delete m_buffer;
+}
- QByteArray m_data;
- QBuffer m_buffer;
- QImageReader m_reader;
+void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
+{
+ if (m_failed)
+ return;
- ImageList &m_target;
+ // No progressive loading possible
+ if (!allDataReceived)
+ return;
- // Detected data format of the stream
- enum QImage::Format m_dataFormat;
- QSize m_size;
+ // Cache our own new data.
+ ImageDecoder::setData(data, allDataReceived);
-};
+ // We expect to be only called once with allDataReceived
+ ASSERT(!m_buffer);
+ ASSERT(!m_reader);
-ImageDecoderQt::ReadContext::ReadContext(SharedBuffer* data, LoadMode loadMode, ImageList &target)
- : m_loadMode(loadMode)
- , m_data(data->data(), data->size())
- , m_buffer(&m_data)
- , m_reader(&m_buffer)
- , m_target(target)
- , m_dataFormat(QImage::Format_Invalid)
-{
- m_buffer.open(QIODevice::ReadOnly);
+ // Attempt to load the data
+ QByteArray imageData = QByteArray::fromRawData(m_data->data(), m_data->size());
+ m_buffer = new QBuffer;
+ m_buffer->setData(imageData);
+ m_buffer->open(QBuffer::ReadOnly);
+ m_reader = new QImageReader(m_buffer, m_format);
}
-
-ImageDecoderQt::ReadContext::ReadResult
- ImageDecoderQt::ReadContext::read(bool allDataReceived)
+bool ImageDecoderQt::isSizeAvailable()
{
- // Complete mode: Read only all all data received
- if (m_loadMode == LoadComplete && !allDataReceived)
- return ReadPartial;
-
- // Attempt to read out all images
- while (true) {
- if (m_target.empty() || m_target.back().m_imageState == ImageComplete) {
- // Start a new image.
- if (!m_reader.canRead())
- return ReadEOF;
-
- // Attempt to construct an empty image of the matching size and format
- // for efficient reading
- QImage newImage = m_dataFormat != QImage::Format_Invalid ?
- QImage(m_size, m_dataFormat) : QImage();
- m_target.push_back(ImageData(newImage));
- }
+ if (!ImageDecoder::isSizeAvailable() && m_reader)
+ internalDecodeSize();
- // read chunks
- switch (readImageLines(m_target.back())) {
- case IncrementalReadFailed:
- m_target.pop_back();
- return ReadFailed;
- case IncrementalReadPartial:
- return ReadPartial;
- case IncrementalReadComplete:
- m_target.back().m_imageState = ImageComplete;
- //store for next
- m_dataFormat = m_target.back().m_image.format();
- m_size = m_target.back().m_image.size();
- const bool supportsAnimation = m_reader.supportsAnimation();
-
- if (debugImageDecoderQt)
- qDebug() << "readImage(): #" << m_target.size() << " complete, " << m_size
- << " format " << m_dataFormat << " supportsAnimation=" << supportsAnimation;
- // No point in readinfg further
- if (!supportsAnimation)
- return ReadComplete;
-
- break;
- }
- }
- return ReadComplete;
+ return ImageDecoder::isSizeAvailable();
}
-
-
-ImageDecoderQt::ReadContext::IncrementalReadResult
- ImageDecoderQt::ReadContext::readImageLines(ImageData &imageData)
+size_t ImageDecoderQt::frameCount()
{
- // TODO: Implement incremental reading here,
- // set state to reflect complete header, etc.
- // For now, we read the whole image.
-
- const qint64 startPos = m_buffer.pos();
- // Oops, failed. Rewind.
- if (!m_reader.read(&imageData.m_image)) {
- m_buffer.seek(startPos);
- const bool gotHeader = imageData.m_image.size().width();
-
- if (debugImageDecoderQt)
- qDebug() << "readImageLines(): read() failed: " << m_reader.errorString()
- << " got header=" << gotHeader;
- // [Experimental] Did we manage to read the header?
- if (gotHeader) {
- imageData.m_imageState = ImageHeaderValid;
- return IncrementalReadPartial;
+ if (m_frameBufferCache.isEmpty() && m_reader) {
+ if (m_reader->supportsAnimation()) {
+ int imageCount = m_reader->imageCount();
+
+ // Fixup for Qt decoders... imageCount() is wrong
+ // and jumpToNextImage does not work either... so
+ // we will have to parse everything...
+ if (imageCount == 0)
+ forceLoadEverything();
+ else
+ m_frameBufferCache.resize(imageCount);
+ } else {
+ m_frameBufferCache.resize(1);
}
- return IncrementalReadFailed;
}
- imageData.m_duration = m_reader.nextImageDelay();
- return IncrementalReadComplete;
-}
-ImageDecoderQt::ImageDecoderQt(const QString& imageFormat)
- : m_hasAlphaChannel(false)
- , m_imageFormat(imageFormat)
-{
+ return m_frameBufferCache.size();
}
-ImageDecoderQt::~ImageDecoderQt()
+int ImageDecoderQt::repetitionCount() const
{
-}
+ if (m_reader && m_reader->supportsAnimation())
+ m_repetitionCount = qMax(0, m_reader->loopCount());
-bool ImageDecoderQt::hasFirstImageHeader() const
-{
- return !m_imageList.empty() && m_imageList[0].m_imageState >= ImageHeaderValid;
+ return m_repetitionCount;
}
-void ImageDecoderQt::reset()
+String ImageDecoderQt::filenameExtension() const
{
- m_hasAlphaChannel = false;
- m_failed = false;
- m_imageList.clear();
- m_pixmapCache.clear();
- m_loopCount = cAnimationNone;
-}
+ return String(m_format.constData(), m_format.length());
+};
-void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived)
+RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index)
{
- reset();
- ReadContext readContext(data, ReadContext::LoadComplete, m_imageList);
-
- if (debugImageDecoderQt)
- qDebug() << " setData " << data->size() << " image bytes, complete=" << allDataReceived;
-
- const ReadContext::ReadResult readResult = readContext.read(allDataReceived);
-
- if (hasFirstImageHeader())
- m_hasAlphaChannel = m_imageList[0].m_image.hasAlphaChannel();
-
- if (debugImageDecoderQt)
- qDebug() << " read returns " << readResult;
-
- switch (readResult) {
- case ReadContext::ReadFailed:
- m_failed = true;
- break;
- case ReadContext::ReadEOF:
- case ReadContext::ReadPartial:
- case ReadContext::ReadComplete:
- // Did we read anything - try to set the size.
- if (hasFirstImageHeader()) {
- QSize imgSize = m_imageList[0].m_image.size();
- setSize(imgSize.width(), imgSize.height());
-
- if (readContext.reader()->supportsAnimation()) {
- if (readContext.reader()->loopCount() != -1)
- m_loopCount = readContext.reader()->loopCount();
- else
- m_loopCount = 0; //loop forever
- }
- }
- break;
+ // In case the ImageDecoderQt got recreated we don't know
+ // yet how many images we are going to have and need to
+ // find that out now.
+ int count = m_frameBufferCache.size();
+ if (!m_failed && count == 0) {
+ internalDecodeSize();
+ count = frameCount();
}
-}
+ if (index >= static_cast<size_t>(count))
+ return 0;
-bool ImageDecoderQt::isSizeAvailable()
-{
- if (debugImageDecoderQt)
- qDebug() << " ImageDecoderQt::isSizeAvailable() returns" << ImageDecoder::isSizeAvailable();
- return ImageDecoder::isSizeAvailable();
+ RGBA32Buffer& frame = m_frameBufferCache[index];
+ if (frame.status() != RGBA32Buffer::FrameComplete && m_reader)
+ internalReadImage(index);
+ return &frame;
}
-size_t ImageDecoderQt::frameCount() const
+void ImageDecoderQt::clearFrameBufferCache(size_t index)
{
- if (debugImageDecoderQt)
- qDebug() << " ImageDecoderQt::frameCount() returns" << m_imageList.size();
- return m_imageList.size();
-}
+ // Currently QImageReader will be asked to read everything. This
+ // might change when we read gif images on demand. For now we
+ // can have a rather simple implementation.
+ if (index > m_frameBufferCache.size())
+ return;
-int ImageDecoderQt::repetitionCount() const
-{
- if (debugImageDecoderQt)
- qDebug() << " ImageDecoderQt::repetitionCount() returns" << m_loopCount;
- return m_loopCount;
+ for (size_t i = 0; i < index; ++index)
+ m_frameBufferCache[index].clear();
}
-bool ImageDecoderQt::supportsAlpha() const
+void ImageDecoderQt::internalDecodeSize()
{
- return m_hasAlphaChannel;
+ ASSERT(m_reader);
+
+ // If we have a QSize() something failed
+ QSize size = m_reader->size();
+ if (size.isEmpty())
+ return failRead();
+
+ m_format = m_reader->format();
+ setSize(size.width(), size.height());
}
-int ImageDecoderQt::duration(size_t index) const
+void ImageDecoderQt::internalReadImage(size_t frameIndex)
{
- if (index >= static_cast<size_t>(m_imageList.size()))
- return 0;
- return m_imageList[index].m_duration;
+ ASSERT(m_reader);
+
+ if (m_reader->supportsAnimation())
+ m_reader->jumpToImage(frameIndex);
+ else if (frameIndex != 0)
+ return failRead();
+
+ internalHandleCurrentImage(frameIndex);
+
+ // Attempt to return some memory
+ for (int i = 0; i < m_frameBufferCache.size(); ++i)
+ if (m_frameBufferCache[i].status() != RGBA32Buffer::FrameComplete)
+ return;
+
+ delete m_reader;
+ delete m_buffer;
+ m_buffer = 0;
+ m_reader = 0;
}
-String ImageDecoderQt::filenameExtension() const
+void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex)
{
- if (debugImageDecoderQt)
- qDebug() << " ImageDecoderQt::filenameExtension() returns" << m_imageFormat;
- return m_imageFormat;
-};
+ // Now get the QImage from Qt and place it in the RGBA32Buffer
+ QImage img;
+ if (!m_reader->read(&img))
+ return failRead();
-RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t)
-{
- Q_ASSERT("use imageAtIndex instead");
- return 0;
+ // now into the RGBA32Buffer - even if the image is not
+ QSize imageSize = img.size();
+ RGBA32Buffer* const buffer = &m_frameBufferCache[frameIndex];
+ buffer->setRect(m_reader->currentImageRect());
+ buffer->setStatus(RGBA32Buffer::FrameComplete);
+ buffer->setDuration(m_reader->nextImageDelay());
+ buffer->setDecodedImage(img);
}
-QPixmap* ImageDecoderQt::imageAtIndex(size_t index) const
-{
- if (debugImageDecoderQt)
- qDebug() << "ImageDecoderQt::imageAtIndex(" << index << ')';
+// The QImageIOHandler is not able to tell us how many frames
+// we have and we need to parse every image. We do this by
+// increasing the m_frameBufferCache by one and try to parse
+// the image. We stop when QImage::read fails and then need
+// to resize the m_frameBufferCache to the final size and update
+// the m_failed. In case we failed to decode the first image
+// we want to keep m_failed set to true.
- if (index >= static_cast<size_t>(m_imageList.size()))
- return 0;
+// TODO: Do not increment the m_frameBufferCache.size() by one but more than one
+void ImageDecoderQt::forceLoadEverything()
+{
+ int imageCount = 0;
- if (!m_pixmapCache.contains(index)) {
- m_pixmapCache.insert(index,
- QPixmap::fromImage(m_imageList[index].m_image));
+ do {
+ m_frameBufferCache.resize(++imageCount);
+ internalHandleCurrentImage(imageCount - 1);
+ } while(!m_failed);
- // store null image since the converted pixmap is already in pixmap cache
- Q_ASSERT(m_imageList[index].m_imageState == ImageComplete);
- m_imageList[index].m_image = QImage();
- }
- return &m_pixmapCache[index];
+ // If we failed decoding the first image we actually
+ // have no images and need to keep m_failed set to
+ // true otherwise we want to reset it and forget about
+ // the last attempt to decode a image.
+ m_frameBufferCache.resize(imageCount - 1);
+ m_failed = imageCount == 1;
}
-void ImageDecoderQt::clearFrame(size_t index)
+void ImageDecoderQt::failRead()
{
- if (m_imageList.size() < (int)index)
- m_imageList[index].m_image = QImage();
- m_pixmapCache.take(index);
+ setFailed();
+ delete m_reader;
+ delete m_buffer;
+ m_reader = 0;
+ m_buffer = 0;
}
-
}
// vim: ts=4 sw=4 et
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h
index 59751c5..d11b938 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h
@@ -28,10 +28,11 @@
#define ImageDecoderQt_h
#include "ImageDecoder.h"
-#include <QtGui/QImage>
+#include <QtGui/QImageReader>
#include <QtGui/QPixmap>
#include <QtCore/QList>
#include <QtCore/QHash>
+#include <QtCore/QBuffer>
namespace WebCore {
@@ -39,51 +40,35 @@ namespace WebCore {
class ImageDecoderQt : public ImageDecoder
{
public:
- ImageDecoderQt(const QString& imageFormat);
+ ImageDecoderQt();
~ImageDecoderQt();
virtual void setData(SharedBuffer* data, bool allDataReceived);
virtual bool isSizeAvailable();
- virtual size_t frameCount() const;
+ virtual size_t frameCount();
virtual int repetitionCount() const;
virtual RGBA32Buffer* frameBufferAtIndex(size_t index);
- QPixmap* imageAtIndex(size_t index) const;
- virtual bool supportsAlpha() const;
- int duration(size_t index) const;
virtual String filenameExtension() const;
- void clearFrame(size_t index);
+ virtual void clearFrameBufferCache(size_t clearBeforeFrame);
private:
ImageDecoderQt(const ImageDecoderQt&);
ImageDecoderQt &operator=(const ImageDecoderQt&);
- class ReadContext;
- void reset();
- bool hasFirstImageHeader() const;
-
- enum ImageState {
- // Started image reading
- ImagePartial,
- // Header (size / alpha) are known
- ImageHeaderValid,
- // Image is complete
- ImageComplete };
-
- struct ImageData {
- ImageData(const QImage& image, ImageState imageState = ImagePartial, int duration=0);
- QImage m_image;
- ImageState m_imageState;
- int m_duration;
- };
-
- bool m_hasAlphaChannel;
- typedef QList<ImageData> ImageList;
- mutable ImageList m_imageList;
- mutable QHash<int, QPixmap> m_pixmapCache;
- int m_loopCount;
- QString m_imageFormat;
+private:
+ void internalDecodeSize();
+ void internalReadImage(size_t);
+ void internalHandleCurrentImage(size_t);
+ void forceLoadEverything();
+ void failRead();
+
+private:
+ QByteArray m_format;
+ QBuffer* m_buffer;
+ QImageReader* m_reader;
+ mutable int m_repetitionCount;
};
diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp
index 5d40e26..da6ddac 100644
--- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp
@@ -76,6 +76,7 @@ bool FrameData::clear(bool clearMetadata)
m_haveMetadata = false;
if (m_frame) {
+ delete m_frame;
m_frame = 0;
return true;
}
diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h
index 2df3df9..5692de7 100644
--- a/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h
+++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
* Copyright (C) 2008-2009 Torch Mobile, Inc.
+ * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -37,6 +38,8 @@
#if PLATFORM(SKIA)
#include "NativeImageSkia.h"
+#elif PLATFORM(QT)
+#include <QImage>
#endif
namespace WebCore {
@@ -54,7 +57,7 @@ namespace WebCore {
DisposeOverwriteBgcolor, // Clear frame to transparent
DisposeOverwritePrevious, // Clear frame to previous framebuffer contents
};
-#if PLATFORM(SKIA)
+#if PLATFORM(SKIA) || PLATFORM(QT)
typedef uint32_t PixelData;
#else
typedef unsigned PixelData;
@@ -126,6 +129,11 @@ namespace WebCore {
setRGBA(getAddr(x, y), r, g, b, a);
}
+#if PLATFORM(QT)
+ void setDecodedImage(const QImage& image);
+ QImage decodedImage() const { return m_image; }
+#endif
+
private:
RGBA32Buffer& operator=(const RGBA32Buffer& other);
@@ -136,6 +144,8 @@ namespace WebCore {
{
#if PLATFORM(SKIA)
return m_bitmap.getAddr32(x, y);
+#elif PLATFORM(QT)
+ return reinterpret_cast<QRgb*>(m_image.scanLine(y)) + x;
#else
return m_bytes.data() + (y * width()) + x;
#endif
@@ -159,6 +169,10 @@ namespace WebCore {
#if PLATFORM(SKIA)
NativeImageSkia m_bitmap;
+#elif PLATFORM(QT)
+ mutable QImage m_image;
+ bool m_hasAlpha;
+ IntSize m_size;
#else
Vector<PixelData> m_bytes;
IntSize m_size; // The size of the buffer. This should be the
diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp b/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp
new file mode 100644
index 0000000..da6ab38
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2008, 2009 Google, Inc.
+ * Copyright (C) 2009 Holger Hans Peter Freyther
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ImageDecoder.h"
+
+#include <QPixmap>
+#include <stdio.h>
+
+namespace WebCore {
+
+RGBA32Buffer::RGBA32Buffer()
+ : m_status(FrameEmpty)
+ , m_hasAlpha(false)
+ , m_size()
+ , m_duration(0)
+ , m_disposalMethod(DisposeNotSpecified)
+{
+}
+
+// The image must not have format 8888 pre multiplied...
+void RGBA32Buffer::setDecodedImage(const QImage& image)
+{
+ m_image = image;
+ m_size = image.size();
+ m_hasAlpha = image.hasAlphaChannel();
+}
+
+void RGBA32Buffer::clear()
+{
+ m_image = QImage();
+ m_status = FrameEmpty;
+ // NOTE: Do not reset other members here; clearFrameBufferCache()
+ // calls this to free the bitmap data, but other functions like
+ // initFrameBuffer() and frameComplete() may still need to read
+ // other metadata out of this frame later.
+}
+
+void RGBA32Buffer::zeroFill()
+{
+ m_image.fill(0);
+}
+
+void RGBA32Buffer::copyBitmapData(const RGBA32Buffer& other)
+{
+ if (this == &other)
+ return;
+
+ m_image = other.m_image;
+ m_size = other.m_size;
+ m_hasAlpha = other.m_hasAlpha;
+}
+
+bool RGBA32Buffer::setSize(int newWidth, int newHeight)
+{
+ // This function should only be called once, it will leak memory
+ // otherwise.
+ ASSERT(width() == 0 && height() == 0);
+
+ m_size = IntSize(newWidth, newHeight);
+ m_image = QImage(newWidth, newHeight, QImage::Format_ARGB32_Premultiplied);
+ if (m_image.isNull()) {
+ // Allocation failure, maybe the bitmap was too big.
+ setStatus(FrameComplete);
+ return false;
+ }
+
+ // Zero the image.
+ zeroFill();
+
+ return true;
+}
+
+QPixmap* RGBA32Buffer::asNewNativeImage() const
+{
+ QPixmap pix = QPixmap::fromImage(m_image);
+ m_image = QImage();
+
+ return new QPixmap(pix);
+}
+
+bool RGBA32Buffer::hasAlpha() const
+{
+ return m_hasAlpha;
+}
+
+void RGBA32Buffer::setHasAlpha(bool alpha)
+{
+ m_hasAlpha = alpha;
+}
+
+void RGBA32Buffer::setStatus(FrameStatus status)
+{
+ m_status = status;
+}
+
+RGBA32Buffer& RGBA32Buffer::operator=(const RGBA32Buffer& other)
+{
+ if (this == &other)
+ return *this;
+
+ copyBitmapData(other);
+ setRect(other.rect());
+ setStatus(other.status());
+ setDuration(other.duration());
+ setDisposalMethod(other.disposalMethod());
+ return *this;
+}
+
+int RGBA32Buffer::width() const
+{
+ return m_size.width();
+}
+
+int RGBA32Buffer::height() const
+{
+ return m_size.height();
+}
+
+}
diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm
index 78fb659..f4321ad 100644
--- a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm
+++ b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm
@@ -107,11 +107,15 @@ static String utiTypeFromCocoaType(NSString *type)
static void addHTMLClipboardTypesForCocoaType(HashSet<String>& resultTypes, NSString *cocoaType, NSPasteboard *pasteboard)
{
// UTI may not do these right, so make sure we get the right, predictable result
- if ([cocoaType isEqualToString:NSStringPboardType])
+ if ([cocoaType isEqualToString:NSStringPboardType]) {
resultTypes.add("text/plain");
- else if ([cocoaType isEqualToString:NSURLPboardType])
+ return;
+ }
+ if ([cocoaType isEqualToString:NSURLPboardType]) {
resultTypes.add("text/uri-list");
- else if ([cocoaType isEqualToString:NSFilenamesPboardType]) {
+ return;
+ }
+ if ([cocoaType isEqualToString:NSFilenamesPboardType]) {
// If file list is empty, add nothing.
// Note that there is a chance that the file list count could have changed since we grabbed the types array.
// However, this is not really an issue for us doing a sanity check here.
@@ -122,12 +126,15 @@ static void addHTMLClipboardTypesForCocoaType(HashSet<String>& resultTypes, NSSt
resultTypes.add("text/uri-list");
resultTypes.add("Files");
}
- } else if (String utiType = utiTypeFromCocoaType(cocoaType))
+ return;
+ }
+ String utiType = utiTypeFromCocoaType(cocoaType);
+ if (!utiType.isEmpty()) {
resultTypes.add(utiType);
- else {
- // No mapping, just pass the whole string though
- resultTypes.add(cocoaType);
+ return;
}
+ // No mapping, just pass the whole string though
+ resultTypes.add(cocoaType);
}
void ClipboardMac::clearData(const String& type)
diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm
index e7e12ac..fd2f944 100644
--- a/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm
+++ b/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm
@@ -311,6 +311,14 @@ static const IntSize* buttonSizes()
return sizes;
}
+#if ENABLE(DATALIST)
+static const IntSize* listButtonSizes()
+{
+ static const IntSize sizes[3] = { IntSize(21, 21), IntSize(19, 18), IntSize(17, 16) };
+ return sizes;
+}
+#endif
+
static const int* buttonMargins(NSControlSize controlSize)
{
static const int margins[3][4] =
@@ -333,6 +341,13 @@ static NSButtonCell* button(ControlPart part, ControlStates states, const IntRec
}
// Set the control size based off the rectangle we're painting into.
+ const IntSize* sizes = buttonSizes();
+#if ENABLE(DATALIST)
+ if (part == ListButtonPart) {
+ [buttonCell setBezelStyle:NSRoundedDisclosureBezelStyle];
+ sizes = listButtonSizes();
+ } else
+#endif
if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegularControlSize].height() * zoomFactor) {
// Use the square button
if ([buttonCell bezelStyle] != NSShadowlessSquareBezelStyle)
@@ -362,7 +377,11 @@ static void paintButton(ControlPart part, ControlStates states, GraphicsContext*
LocalCurrentGraphicsContext localContext(context);
NSControlSize controlSize = [buttonCell controlSize];
+#if ENABLE(DATALIST)
+ IntSize zoomedSize = (part == ListButtonPart ? listButtonSizes() : buttonSizes())[controlSize];
+#else
IntSize zoomedSize = buttonSizes()[controlSize];
+#endif
zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored.
zoomedSize.setHeight(zoomedSize.height() * zoomFactor);
IntRect inflatedRect = zoomedRect;
@@ -442,6 +461,10 @@ LengthSize ThemeMac::controlSize(ControlPart part, const Font& font, const Lengt
case PushButtonPart:
// Height is reset to auto so that specified heights can be ignored.
return sizeFromFont(font, LengthSize(zoomedSize.width(), Length()), zoomFactor, buttonSizes());
+#if ENABLE(DATALIST)
+ case ListButtonPart:
+ return sizeFromFont(font, LengthSize(zoomedSize.width(), Length()), zoomFactor, listButtonSizes());
+#endif
default:
return zoomedSize;
}
@@ -453,6 +476,7 @@ LengthSize ThemeMac::minimumControlSize(ControlPart part, const Font& font, floa
case SquareButtonPart:
case DefaultButtonPart:
case ButtonPart:
+ case ListButtonPart:
return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoomFactor), Fixed));
default:
return Theme::minimumControlSize(part, font, zoomFactor);
@@ -465,6 +489,7 @@ LengthBox ThemeMac::controlBorder(ControlPart part, const Font& font, const Leng
case SquareButtonPart:
case DefaultButtonPart:
case ButtonPart:
+ case ListButtonPart:
return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().value());
default:
return Theme::controlBorder(part, font, zoomedBox, zoomFactor);
@@ -548,6 +573,7 @@ void ThemeMac::paint(ControlPart part, ControlStates states, GraphicsContext* co
case DefaultButtonPart:
case ButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
paintButton(part, states, context, zoomedRect, zoomFactor, scrollView);
break;
default:
diff --git a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp
index 407ed5b..ec78372 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp
@@ -43,13 +43,19 @@ static ProtectionSpaceToCredentialMap& protectionSpaceToCredentialMap()
return map;
}
-typedef HashMap<String, HashMap<String, Credential> > OriginToDefaultBasicCredentialMap;
-static OriginToDefaultBasicCredentialMap& originToDefaultBasicCredentialMap()
+static HashSet<String>& originsWithCredentials()
{
- DEFINE_STATIC_LOCAL(OriginToDefaultBasicCredentialMap, map, ());
+ DEFINE_STATIC_LOCAL(HashSet<String>, set, ());
+ return set;
+}
+
+typedef HashMap<String, ProtectionSpace> PathToDefaultProtectionSpaceMap;
+static PathToDefaultProtectionSpaceMap& pathToDefaultProtectionSpaceMap()
+{
+ DEFINE_STATIC_LOCAL(PathToDefaultProtectionSpaceMap, map, ());
return map;
}
-
+
static String originStringFromURL(const KURL& url)
{
if (url.port())
@@ -58,32 +64,37 @@ static String originStringFromURL(const KURL& url)
return url.protocol() + "://" + url.host() + "/";
}
+static String protectionSpaceMapKeyFromURL(const KURL& url)
+{
+ ASSERT(url.isValid());
+
+ // Remove the last path component that is not a directory to determine the subtree for which credentials will apply.
+ // We keep a leading slash, but remove a trailing one.
+ String directoryURL = url.string().substring(0, url.pathEnd());
+ unsigned directoryURLPathStart = url.pathStart();
+ ASSERT(directoryURL[directoryURLPathStart] == '/');
+ if (directoryURL.length() > directoryURLPathStart + 1) {
+ int index = directoryURL.reverseFind('/');
+ ASSERT(index > 0);
+ directoryURL = directoryURL.substring(0, (static_cast<unsigned>(index) != directoryURLPathStart) ? index : directoryURLPathStart + 1);
+ }
+ ASSERT(directoryURL.length() == directoryURLPathStart + 1 || directoryURL[directoryURL.length() - 1] != '/');
+
+ return directoryURL;
+}
+
void CredentialStorage::set(const Credential& credential, const ProtectionSpace& protectionSpace, const KURL& url)
{
ASSERT(url.protocolInHTTPFamily());
ASSERT(url.isValid());
protectionSpaceToCredentialMap().set(protectionSpace, credential);
-
+ originsWithCredentials().add(originStringFromURL(url));
+
ProtectionSpaceAuthenticationScheme scheme = protectionSpace.authenticationScheme();
- if (url.protocolInHTTPFamily() && (scheme == ProtectionSpaceAuthenticationSchemeHTTPBasic || scheme == ProtectionSpaceAuthenticationSchemeDefault)) {
- String origin = originStringFromURL(url);
-
- HashMap<String, Credential> pathToCredentialMap;
- pair<HashMap<String, HashMap<String, Credential> >::iterator, bool> result = originToDefaultBasicCredentialMap().add(origin, pathToCredentialMap);
-
- // Remove the last path component that is not a directory to determine the subpath for which this credential applies.
- // We keep a leading slash, but remove a trailing one.
- String path = url.path();
- ASSERT(path.length() > 0);
- ASSERT(path[0] == '/');
- if (path.length() > 1) {
- int index = path.reverseFind('/');
- path = path.substring(0, index ? index : 1);
- }
- ASSERT(path.length() == 1 || path[path.length() - 1] != '/');
-
- result.first->second.set(path, credential);
+ if (scheme == ProtectionSpaceAuthenticationSchemeHTTPBasic || scheme == ProtectionSpaceAuthenticationSchemeDefault) {
+ // The map can contain both a path and its subpath - while redundant, this makes lookups faster.
+ pathToDefaultProtectionSpaceMap().set(protectionSpaceMapKeyFromURL(url), protectionSpace);
}
}
@@ -92,33 +103,53 @@ Credential CredentialStorage::get(const ProtectionSpace& protectionSpace)
return protectionSpaceToCredentialMap().get(protectionSpace);
}
-Credential CredentialStorage::getDefaultAuthenticationCredential(const KURL& url)
+static PathToDefaultProtectionSpaceMap::iterator findDefaultProtectionSpaceForURL(const KURL& url)
{
ASSERT(url.protocolInHTTPFamily());
- String origin = originStringFromURL(url);
- const HashMap<String, Credential>& pathToCredentialMap(originToDefaultBasicCredentialMap().get(origin));
- if (pathToCredentialMap.isEmpty())
- return Credential();
-
- // Check to see if there is a stored credential for the subpath ancestry of this url.
- String path = url.path();
- Credential credential = pathToCredentialMap.get(path);
- while (credential.isEmpty() && !path.isNull()) {
- int index = path.reverseFind('/');
- if (index == 0) {
- credential = pathToCredentialMap.get("/");
- break;
- } else if (index == -1) {
- // This case should never happen, as all HTTP URL paths should start with a leading /
- ASSERT_NOT_REACHED();
- credential = pathToCredentialMap.get(path);
- break;
- } else {
- path = path.substring(0, index);
- credential = pathToCredentialMap.get(path);
- }
+ ASSERT(url.isValid());
+
+ PathToDefaultProtectionSpaceMap& map = pathToDefaultProtectionSpaceMap();
+
+ // Don't spend time iterating the path for origins that don't have any credentials.
+ if (!originsWithCredentials().contains(originStringFromURL(url)))
+ return map.end();
+
+ String directoryURL = protectionSpaceMapKeyFromURL(url);
+ unsigned directoryURLPathStart = url.pathStart();
+ while (true) {
+ PathToDefaultProtectionSpaceMap::iterator iter = map.find(directoryURL);
+ if (iter != map.end())
+ return iter;
+
+ if (directoryURL.length() == directoryURLPathStart + 1) // path is "/" already, cannot shorten it any more
+ return map.end();
+
+ int index = directoryURL.reverseFind('/', -2);
+ ASSERT(index > 0);
+ directoryURL = directoryURL.substring(0, (static_cast<unsigned>(index) == directoryURLPathStart) ? index + 1 : index);
+ ASSERT(directoryURL.length() > directoryURLPathStart);
+ ASSERT(directoryURL.length() == directoryURLPathStart + 1 || directoryURL[directoryURL.length() - 1] != '/');
}
- return credential;
+}
+
+bool CredentialStorage::set(const Credential& credential, const KURL& url)
+{
+ ASSERT(url.protocolInHTTPFamily());
+ ASSERT(url.isValid());
+ PathToDefaultProtectionSpaceMap::iterator iter = findDefaultProtectionSpaceForURL(url);
+ if (iter == pathToDefaultProtectionSpaceMap().end())
+ return false;
+ ASSERT(originsWithCredentials().contains(originStringFromURL(url)));
+ protectionSpaceToCredentialMap().set(iter->second, credential);
+ return true;
+}
+
+Credential CredentialStorage::get(const KURL& url)
+{
+ PathToDefaultProtectionSpaceMap::iterator iter = findDefaultProtectionSpaceForURL(url);
+ if (iter == pathToDefaultProtectionSpaceMap().end())
+ return Credential();
+ return protectionSpaceToCredentialMap().get(iter->second);
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h
index 737efa6..5086f69 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h
+++ b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h
@@ -36,7 +36,11 @@ class CredentialStorage {
public:
static void set(const Credential&, const ProtectionSpace&, const KURL&);
static Credential get(const ProtectionSpace&);
- static Credential getDefaultAuthenticationCredential(const KURL&);
+
+ // These methods work for authentication schemes that support sending credentials without waiting for a request. E.g., for HTTP Basic authentication scheme
+ // a client should assume that all paths at or deeper than the depth of a known protected resource share are within the same protection space.
+ static bool set(const Credential&, const KURL&); // Returns true if the URL corresponds to a known protection space, so credentials could be updated.
+ static Credential get(const KURL&);
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp b/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp
index ff470a0..07c66e8 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp
@@ -45,7 +45,7 @@ auto_ptr<CrossThreadHTTPHeaderMapData> HTTPHeaderMap::copyData() const
HTTPHeaderMap::const_iterator end_it = end();
for (HTTPHeaderMap::const_iterator it = begin(); it != end_it; ++it) {
- data->append(make_pair(it->first.string().copy(), it->second.copy()));
+ data->append(make_pair(it->first.string().crossThreadString(), it->second.crossThreadString()));
}
return data;
}
diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp
index 370650f..97435ba 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp
@@ -34,10 +34,10 @@ ResourceError ResourceErrorBase::copy() const
lazyInit();
ResourceError errorCopy;
- errorCopy.m_domain = m_domain.copy();
+ errorCopy.m_domain = m_domain.crossThreadString();
errorCopy.m_errorCode = m_errorCode;
- errorCopy.m_failingURL = m_failingURL.copy();
- errorCopy.m_localizedDescription = m_localizedDescription.copy();
+ errorCopy.m_failingURL = m_failingURL.crossThreadString();
+ errorCopy.m_localizedDescription = m_localizedDescription.crossThreadString();
errorCopy.m_isNull = m_isNull;
errorCopy.m_isCancellation = m_isCancellation;
return errorCopy;
diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp
index a651a3f..4c77999 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp
@@ -73,13 +73,13 @@ auto_ptr<CrossThreadResourceRequestData> ResourceRequestBase::copyData() const
data->m_cachePolicy = cachePolicy();
data->m_timeoutInterval = timeoutInterval();
data->m_firstPartyForCookies = firstPartyForCookies().copy();
- data->m_httpMethod = httpMethod().copy();
+ data->m_httpMethod = httpMethod().crossThreadString();
data->m_httpHeaders.adopt(httpHeaderFields().copyData());
data->m_responseContentDispositionEncodingFallbackArray.reserveInitialCapacity(m_responseContentDispositionEncodingFallbackArray.size());
size_t encodingArraySize = m_responseContentDispositionEncodingFallbackArray.size();
for (size_t index = 0; index < encodingArraySize; ++index) {
- data->m_responseContentDispositionEncodingFallbackArray.append(m_responseContentDispositionEncodingFallbackArray[index].copy());
+ data->m_responseContentDispositionEncodingFallbackArray.append(m_responseContentDispositionEncodingFallbackArray[index].crossThreadString());
}
if (m_httpBody)
data->m_httpBody = m_httpBody->deepCopy();
diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp
index 7f8a4e2..fd44225 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp
@@ -108,12 +108,12 @@ auto_ptr<CrossThreadResourceResponseData> ResourceResponseBase::copyData() const
{
auto_ptr<CrossThreadResourceResponseData> data(new CrossThreadResourceResponseData());
data->m_url = url().copy();
- data->m_mimeType = mimeType().copy();
+ data->m_mimeType = mimeType().crossThreadString();
data->m_expectedContentLength = expectedContentLength();
- data->m_textEncodingName = textEncodingName().copy();
- data->m_suggestedFilename = suggestedFilename().copy();
+ data->m_textEncodingName = textEncodingName().crossThreadString();
+ data->m_suggestedFilename = suggestedFilename().crossThreadString();
data->m_httpStatusCode = httpStatusCode();
- data->m_httpStatusText = httpStatusText().copy();
+ data->m_httpStatusText = httpStatusText().crossThreadString();
data->m_httpHeaders.adopt(httpHeaderFields().copyData());
data->m_lastModifiedDate = lastModifiedDate();
return data;
diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
index 3303b34..202346d 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
@@ -112,23 +112,11 @@ qint64 FormDataIODevice::writeData(const char*, qint64)
return -1;
}
-void FormDataIODevice::setParent(QNetworkReply* reply)
-{
- QIODevice::setParent(reply);
-
- connect(reply, SIGNAL(finished()), SLOT(slotFinished()), Qt::QueuedConnection);
-}
-
bool FormDataIODevice::isSequential() const
{
return true;
}
-void FormDataIODevice::slotFinished()
-{
- deleteLater();
-}
-
QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode loadMode)
: QObject(0)
, m_reply(0)
@@ -224,9 +212,7 @@ void QNetworkReplyHandler::finish()
if (m_shouldFinish)
return;
- // FIXME: Investigate if this check should be moved into sendResponseIfNeeded()
- if (!m_reply->error())
- sendResponseIfNeeded();
+ sendResponseIfNeeded();
if (!m_resourceHandle)
return;
@@ -236,19 +222,20 @@ void QNetworkReplyHandler::finish()
m_reply = 0;
return;
}
+
QNetworkReply* oldReply = m_reply;
+
if (m_redirected) {
resetState();
start();
} else if (!m_reply->error() || ignoreHttpError(m_reply, m_responseDataSent)) {
client->didFinishLoading(m_resourceHandle);
} else {
- int code = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-
QUrl url = m_reply->url();
+ int httpStatusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
- if (code) {
- ResourceError error("HTTP", code, url.toString(), m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString());
+ if (httpStatusCode) {
+ ResourceError error("HTTP", httpStatusCode, url.toString(), m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString());
client->didFail(m_resourceHandle, error);
} else {
ResourceError error("QtNetwork", m_reply->error(), url.toString(), m_reply->errorString());
@@ -267,6 +254,9 @@ void QNetworkReplyHandler::sendResponseIfNeeded()
if (m_shouldSendResponse)
return;
+ if (m_reply->error())
+ return;
+
if (m_responseSent || !m_resourceHandle)
return;
m_responseSent = true;
@@ -290,40 +280,34 @@ void QNetworkReplyHandler::sendResponseIfNeeded()
}
KURL url(m_reply->url());
- String suggestedFilename = filenameFromHTTPContentDisposition(QString::fromAscii(m_reply->rawHeader("Content-Disposition")));
-
- if (suggestedFilename.isEmpty())
- suggestedFilename = url.lastPathComponent();
-
ResourceResponse response(url, mimeType,
m_reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(),
- encoding,
- suggestedFilename);
+ encoding, String());
- const bool isLocalFileReply = (m_reply->url().scheme() == QLatin1String("file"));
- int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
- if (!isLocalFileReply) {
- response.setHTTPStatusCode(statusCode);
- response.setHTTPStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray().constData());
+ if (url.isLocalFile()) {
+ client->didReceiveResponse(m_resourceHandle, response);
+ return;
}
- else if (m_reply->error() == QNetworkReply::ContentNotFoundError)
- response.setHTTPStatusCode(404);
+ // The status code is equal to 0 for protocols not in the HTTP family.
+ int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
- /* Fill in the other fields
- * For local file requests remove the content length and the last-modified
- * headers as required by fast/dom/xmlhttprequest-get.xhtml
- */
- foreach (const QByteArray& headerName, m_reply->rawHeaderList()) {
- if (isLocalFileReply
- && (headerName == "Content-Length" || headerName == "Last-Modified"))
- continue;
+ if (url.protocolInHTTPFamily()) {
+ String suggestedFilename = filenameFromHTTPContentDisposition(QString::fromAscii(m_reply->rawHeader("Content-Disposition")));
- response.setHTTPHeaderField(QString::fromAscii(headerName), QString::fromAscii(m_reply->rawHeader(headerName)));
- }
+ if (!suggestedFilename.isEmpty())
+ response.setSuggestedFilename(suggestedFilename);
+ else
+ response.setSuggestedFilename(url.lastPathComponent());
- if (isLocalFileReply)
- response.setHTTPHeaderField(QString::fromAscii("Cache-Control"), QString::fromAscii("no-cache"));
+ response.setHTTPStatusCode(statusCode);
+ response.setHTTPStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray().constData());
+
+ // Add remaining headers.
+ foreach (const QByteArray& headerName, m_reply->rawHeaderList()) {
+ response.setHTTPHeaderField(QString::fromAscii(headerName), QString::fromAscii(m_reply->rawHeader(headerName)));
+ }
+ }
QUrl redirection = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if (redirection.isValid()) {
@@ -339,9 +323,13 @@ void QNetworkReplyHandler::sendResponseIfNeeded()
client->willSendRequest(m_resourceHandle, newRequest, response);
m_redirected = true;
m_request = newRequest.toNetworkRequest();
- } else {
- client->didReceiveResponse(m_resourceHandle, response);
+
+ ResourceHandleInternal* d = m_resourceHandle->getInternal();
+ emit d->m_frame->page()->networkRequestStarted(d->m_frame, &m_request);
+ return;
}
+
+ client->didReceiveResponse(m_resourceHandle, response);
}
void QNetworkReplyHandler::forwardData()
@@ -379,6 +367,8 @@ void QNetworkReplyHandler::start()
QNetworkAccessManager* manager = d->m_frame->page()->networkAccessManager();
+ emit d->m_frame->page()->networkRequestStarted(d->m_frame, &m_request);
+
const QUrl url = m_request.url();
const QString scheme = url.scheme();
// Post requests on files and data don't really make sense, but for
diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h
index 545119e..fccc4a6 100644
--- a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h
+++ b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h
@@ -96,16 +96,12 @@ public:
FormDataIODevice(FormData*);
~FormDataIODevice();
- void setParent(QNetworkReply*);
bool isSequential() const;
protected:
qint64 readData(char*, qint64);
qint64 writeData(const char*, qint64);
-private Q_SLOTS:
- void slotFinished();
-
private:
void moveToNextElement();
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp
index 666ad18..9d2c452 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp
@@ -239,8 +239,6 @@ static CachedImage* getCachedImage(Element* element)
void ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame)
{
ASSERT(frame);
- Q_UNUSED(url);
- Q_UNUSED(title);
//WebCore::writeURL(m_writableDataObject.get(), url, title, true, false);
if (!m_writableData)
@@ -262,8 +260,10 @@ void ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, co
return;
QList<QUrl> urls;
+ urls.append(url);
urls.append(fullURL);
+ m_writableData->setText(title);
m_writableData->setUrls(urls);
#ifndef QT_NO_CLIPBOARD
if (!isForDragging())
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp b/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp
index 77cac57..ca3ca9d 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp
@@ -33,6 +33,7 @@
#include "PlatformString.h"
#include <QCoreApplication>
+#include <QLocale>
namespace WebCore {
@@ -53,7 +54,8 @@ String resetButtonDefaultLabel()
String defaultLanguage()
{
- return "en";
+ QLocale locale;
+ return locale.name().replace("_", "-");
}
String searchableIndexIntroduction()
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
index 935882a..37ea681 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp
@@ -217,7 +217,7 @@ static int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad = false
case Qt::Key_F9:
return VK_F9;
case Qt::Key_F10:
- return VK_F11;
+ return VK_F10;
case Qt::Key_F11:
return VK_F11;
case Qt::Key_F12:
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp
index 7ba8350..8221760 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp
@@ -62,7 +62,7 @@ int screenDepthPerComponent(Widget* w)
QWebPageClient* client = w->root()->hostWindow()->platformPageClient();
if (client) {
- QWidget* view = QWidget::find(client->winId());
+ QWidget* view = client->ownerWidget();
if (view)
return view->depth();
}
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp
index b44f2ec..f6ec4f7 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp
@@ -92,7 +92,7 @@ void PopupMenu::show(const IntRect& r, FrameView* v, int index)
rect.moveTopLeft(v->contentsToWindow(r.topLeft()));
rect.setHeight(m_popup->sizeHint().height());
- m_popup->setParent(QWidget::find(client->winId()));
+ m_popup->setParent(client->ownerWidget());
m_popup->setGeometry(rect);
m_popup->setCurrentIndex(index);
m_popup->exec();
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h b/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h
index 1fc29a0..28ef724 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h
+++ b/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h
@@ -32,31 +32,45 @@ class QWebPageClient {
public:
virtual void scroll(int dx, int dy, const QRect&) = 0;
virtual void update(const QRect&) = 0;
-
+ virtual void setInputMethodEnabled(bool enable) = 0;
+#if QT_VERSION >= 0x040600
+ virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable) = 0;
+#endif
inline void resetCursor()
{
+#ifndef QT_NO_CURSOR
if (!cursor().bitmap() && cursor().shape() == m_lastCursor.shape())
return;
updateCursor(m_lastCursor);
+#endif
}
inline void setCursor(const QCursor& cursor)
{
+#ifndef QT_NO_CURSOR
m_lastCursor = cursor;
if (!cursor.bitmap() && cursor.shape() == this->cursor().shape())
return;
updateCursor(cursor);
+#endif
}
+ virtual QPalette palette() const = 0;
virtual int screenNumber() const = 0;
- virtual WId winId() const = 0;
+ virtual QWidget* ownerWidget() const = 0;
+
+ virtual QObject* pluginParent() const = 0;
protected:
+#ifndef QT_NO_CURSOR
virtual QCursor cursor() const = 0;
virtual void updateCursor(const QCursor& cursor) = 0;
+#endif
private:
+#ifndef QT_NO_CURSOR
QCursor m_lastCursor;
+#endif
};
#endif
diff --git a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp
index f505d0c..b61d356 100644
--- a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp
@@ -44,6 +44,7 @@
#include "Page.h"
#include "RenderBox.h"
#include "RenderTheme.h"
+#include "UserAgentStyleSheets.h"
#include "qwebpage.h"
#include <QApplication>
@@ -771,13 +772,7 @@ ControlPart RenderThemeQt::applyTheme(QStyleOption& option, RenderObject* o) con
String RenderThemeQt::extraMediaControlsStyleSheet()
{
- QFile platformStyleSheet(QLatin1String(":/webcore/css/mediaControls-extras.css"));
- if (platformStyleSheet.open(QFile::ReadOnly)) {
- QByteArray sheetData = platformStyleSheet.readAll();
- return QString::fromUtf8(sheetData.constData(), sheetData.length());
- }
-
- return String();
+ return String(mediaControlsQtUserAgentStyleSheet, sizeof(mediaControlsQtUserAgentStyleSheet));
}
// Helper class to transform the painter's world matrix to the object's content area, scaled to 0,0,100,100
diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp
index 7e178f9..0ad643e 100644
--- a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp
@@ -32,10 +32,10 @@
namespace WebCore {
SQLValue::SQLValue(const SQLValue& val)
+ : m_type(val.m_type)
+ , m_number(val.m_number)
+ , m_string(val.m_string.threadsafeCopy())
{
- m_number = val.m_number;
- m_string = val.m_string.copy();
- m_type = val.m_type;
}
String SQLValue::string() const
@@ -43,7 +43,7 @@ String SQLValue::string() const
ASSERT(m_type == StringValue);
// Must return a copy since ref-shared Strings are not thread safe
- return m_string.copy();
+ return m_string.threadsafeCopy();
}
double SQLValue::number() const
diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h
index 7d85051..0f854fc 100644
--- a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h
+++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h
@@ -38,9 +38,9 @@ namespace WebCore {
public:
enum Type { NullValue, NumberValue, StringValue };
- SQLValue() : m_type(NullValue) { }
+ SQLValue() : m_type(NullValue), m_number(0.0) { }
SQLValue(double number) : m_type(NumberValue), m_number(number) { }
- SQLValue(const String& s) : m_type(StringValue), m_string(s) { }
+ SQLValue(const String& s) : m_type(StringValue), m_number(0.0), m_string(s) { }
SQLValue(const SQLValue&);
Type type() const { return m_type; }
diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h
index d313435..9982254 100644
--- a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h
+++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h
@@ -24,8 +24,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef SQLDatabase_h
-#define SQLDatabase_h
+#ifndef SQLiteDatabase_h
+#define SQLiteDatabase_h
#include "PlatformString.h"
#include <wtf/Threading.h>
diff --git a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp
index 409439e..17d7832 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp
@@ -65,7 +65,9 @@ struct CStringTranslator {
static void translate(StringImpl*& location, const char* const& c, unsigned hash)
{
- location = new StringImpl(c, strlen(c), hash);
+ location = StringImpl::create(c).releaseRef();
+ location->setHash(hash);
+ location->setInTable();
}
};
@@ -140,7 +142,9 @@ struct UCharBufferTranslator {
static void translate(StringImpl*& location, const UCharBuffer& buf, unsigned hash)
{
- location = new StringImpl(buf.s, buf.length, hash);
+ location = StringImpl::create(buf.s, buf.length).releaseRef();
+ location->setHash(hash);
+ location->setInTable();
}
};
@@ -164,7 +168,9 @@ struct HashAndCharactersTranslator {
static void translate(StringImpl*& location, const HashAndCharacters& buffer, unsigned hash)
{
- location = new StringImpl(buffer.characters, buffer.length, hash);
+ location = StringImpl::create(buffer.characters, buffer.length).releaseRef();
+ location->setHash(hash);
+ location->setInTable();
}
};
@@ -222,6 +228,16 @@ void AtomicString::remove(StringImpl* r)
{
stringTable().remove(r);
}
+
+AtomicString AtomicString::lower() const
+{
+ // Note: This is a hot function in the Dromaeo benchmark.
+ StringImpl* impl = this->impl();
+ RefPtr<StringImpl> newImpl = impl->lower();
+ if (LIKELY(newImpl == impl))
+ return *this;
+ return AtomicString(newImpl);
+}
#if USE(JSC)
PassRefPtr<StringImpl> AtomicString::add(const JSC::Identifier& identifier)
diff --git a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h
index 3307a2d..8805f4c 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h
+++ b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h
@@ -83,6 +83,9 @@ public:
bool endsWith(const String& s, bool caseSensitive = true) const
{ return m_string.endsWith(s, caseSensitive); }
+ AtomicString lower() const;
+ AtomicString upper() const { return AtomicString(impl()->upper()); }
+
int toInt(bool* ok = 0) const { return m_string.toInt(ok); }
double toDouble(bool* ok = 0) const { return m_string.toDouble(ok); }
float toFloat(bool* ok = 0) const { return m_string.toFloat(ok); }
diff --git a/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h b/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h
index b9b4078..8d19c17 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h
+++ b/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h
@@ -193,16 +193,13 @@ public:
bool percentage(int& percentage) const;
- // Makes a deep copy. Helpful only if you need to use a String on another thread.
+ // Returns a StringImpl suitable for use on another thread.
+ String crossThreadString() const;
+ // Makes a deep copy. Helpful only if you need to use a String on another thread
+ // (use crossThreadString if the method call doesn't need to be threadsafe).
// Since the underlying StringImpl objects are immutable, there's no other reason
// to ever prefer copy() over plain old assignment.
- String copy() const;
-
- // Makes a deep copy like copy() but only for a substring.
- // (This ensures that you always get something suitable for a thread while subtring
- // may not. For example, in the empty string case, StringImpl::substring returns
- // empty() which is not safe for another thread.)
- String substringCopy(unsigned pos, unsigned len = UINT_MAX) const;
+ String threadsafeCopy() const;
bool isNull() const { return !m_impl; }
bool isEmpty() const;
diff --git a/src/3rdparty/webkit/WebCore/platform/text/String.cpp b/src/3rdparty/webkit/WebCore/platform/text/String.cpp
index e892ef6..bef2674 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/String.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/text/String.cpp
@@ -263,13 +263,6 @@ String String::substring(unsigned pos, unsigned len) const
return m_impl->substring(pos, len);
}
-String String::substringCopy(unsigned pos, unsigned len) const
-{
- if (!m_impl)
- return String();
- return m_impl->substringCopy(pos, len);
-}
-
String String::lower() const
{
if (!m_impl)
@@ -590,11 +583,18 @@ float String::toFloat(bool* ok) const
return m_impl->toFloat(ok);
}
-String String::copy() const
+String String::threadsafeCopy() const
+{
+ if (!m_impl)
+ return String();
+ return m_impl->threadsafeCopy();
+}
+
+String String::crossThreadString() const
{
if (!m_impl)
return String();
- return m_impl->copy();
+ return m_impl->crossThreadString();
}
bool String::isEmpty() const
diff --git a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp
index 8b749c7..5cf4ced 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp
@@ -57,7 +57,7 @@ static inline void deleteUCharVector(const UChar* p)
}
// Some of the factory methods create buffers using fastMalloc.
-// We must ensure that ll allocations of StringImpl are allocated using
+// We must ensure that all allocations of StringImpl are allocated using
// fastMalloc so that we don't have mis-matched frees. We accomplish
// this by overriding the new and delete operators.
void* StringImpl::operator new(size_t size, void* address)
@@ -79,10 +79,9 @@ void StringImpl::operator delete(void* address)
// This constructor is used only to create the empty string.
StringImpl::StringImpl()
- : m_length(0)
- , m_data(0)
+ : m_data(0)
+ , m_length(0)
, m_hash(0)
- , m_bufferIsInternal(false)
{
// Ensure that the hash is computed so that AtomicStringHash can call existingHash()
// with impunity. The empty string is special because it is never entered into
@@ -90,97 +89,20 @@ StringImpl::StringImpl()
hash();
}
-// This is one of the most common constructors, but it's also used for the copy()
-// operation. Because of that, it's the one constructor that doesn't assert the
-// length is non-zero, since we support copying the empty string.
inline StringImpl::StringImpl(const UChar* characters, unsigned length)
- : m_length(length)
+ : m_data(characters)
+ , m_length(length)
, m_hash(0)
- , m_bufferIsInternal(false)
{
- UChar* data = newUCharVector(length);
- memcpy(data, characters, length * sizeof(UChar));
- m_data = data;
-}
-
-inline StringImpl::StringImpl(const StringImpl& str, WithTerminatingNullCharacter)
- : m_length(str.m_length)
- , m_hash(str.m_hash)
- , m_bufferIsInternal(false)
-{
- m_sharedBufferAndFlags.setFlag(HasTerminatingNullCharacter);
- UChar* data = newUCharVector(str.m_length + 1);
- memcpy(data, str.m_data, str.m_length * sizeof(UChar));
- data[str.m_length] = 0;
- m_data = data;
-}
-
-inline StringImpl::StringImpl(const char* characters, unsigned length)
- : m_length(length)
- , m_hash(0)
- , m_bufferIsInternal(false)
-{
- ASSERT(characters);
- ASSERT(length);
-
- UChar* data = newUCharVector(length);
- for (unsigned i = 0; i != length; ++i) {
- unsigned char c = characters[i];
- data[i] = c;
- }
- m_data = data;
-}
-
-inline StringImpl::StringImpl(UChar* characters, unsigned length, AdoptBuffer)
- : m_length(length)
- , m_data(characters)
- , m_hash(0)
- , m_bufferIsInternal(false)
-{
- ASSERT(characters);
- ASSERT(length);
-}
-
-// This constructor is only for use by AtomicString.
-StringImpl::StringImpl(const UChar* characters, unsigned length, unsigned hash)
- : m_length(length)
- , m_hash(hash)
- , m_bufferIsInternal(false)
-{
- ASSERT(hash);
- ASSERT(characters);
- ASSERT(length);
-
- setInTable();
- UChar* data = newUCharVector(length);
- memcpy(data, characters, length * sizeof(UChar));
- m_data = data;
-}
-
-// This constructor is only for use by AtomicString.
-StringImpl::StringImpl(const char* characters, unsigned length, unsigned hash)
- : m_length(length)
- , m_hash(hash)
- , m_bufferIsInternal(false)
-{
- ASSERT(hash);
ASSERT(characters);
ASSERT(length);
-
- setInTable();
- UChar* data = newUCharVector(length);
- for (unsigned i = 0; i != length; ++i) {
- unsigned char c = characters[i];
- data[i] = c;
- }
- m_data = data;
}
StringImpl::~StringImpl()
{
if (inTable())
AtomicString::remove(this);
- if (!m_bufferIsInternal) {
+ if (!bufferIsInternal()) {
SharedUChar* sharedBuffer = m_sharedBufferAndFlags.get();
if (sharedBuffer)
sharedBuffer->deref();
@@ -218,15 +140,6 @@ PassRefPtr<StringImpl> StringImpl::substring(unsigned start, unsigned length)
return create(m_data + start, length);
}
-PassRefPtr<StringImpl> StringImpl::substringCopy(unsigned start, unsigned length)
-{
- start = min(start, m_length);
- length = min(length, m_length - start);
- if (!length)
- return adoptRef(new StringImpl);
- return create(m_data + start, length);
-}
-
UChar32 StringImpl::characterStartingAt(unsigned i)
{
if (U16_IS_SINGLE(m_data[i]))
@@ -236,46 +149,38 @@ UChar32 StringImpl::characterStartingAt(unsigned i)
return 0;
}
-bool StringImpl::isLower()
+PassRefPtr<StringImpl> StringImpl::lower()
{
- // Do a faster loop for the case where all the characters are ASCII.
- bool allLower = true;
+ // Note: This is a hot function in the Dromaeo benchmark, specifically the
+ // no-op code path up through the first 'return' statement.
+
+ // First scan the string for uppercase and non-ASCII characters:
UChar ored = 0;
- for (unsigned i = 0; i < m_length; i++) {
- UChar c = m_data[i];
- allLower = allLower && isASCIILower(c);
- ored |= c;
- }
- if (!(ored & ~0x7F))
- return allLower;
-
- // Do a slower check for cases that include non-ASCII characters.
- allLower = true;
- unsigned i = 0;
- while (i < m_length) {
- UChar32 character;
- U16_NEXT(m_data, i, m_length, character)
- allLower = allLower && Unicode::isLower(character);
+ bool noUpper = true;
+ const UChar *end = m_data + m_length;
+ for (const UChar* chp = m_data; chp != end; chp++) {
+ if (UNLIKELY(isASCIIUpper(*chp)))
+ noUpper = false;
+ ored |= *chp;
}
- return allLower;
-}
+
+ // Nothing to do if the string is all ASCII with no uppercase.
+ if (noUpper && !(ored & ~0x7F))
+ return this;
-PassRefPtr<StringImpl> StringImpl::lower()
-{
- UChar* data;
- PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data);
int32_t length = m_length;
+ UChar* data;
+ RefPtr<StringImpl> newImpl = createUninitialized(m_length, data);
- // Do a faster loop for the case where all the characters are ASCII.
- UChar ored = 0;
- for (int i = 0; i < length; i++) {
- UChar c = m_data[i];
- ored |= c;
- data[i] = toASCIILower(c);
- }
- if (!(ored & ~0x7F))
+ if (!(ored & ~0x7F)) {
+ // Do a faster loop for the case where all the characters are ASCII.
+ for (int i = 0; i < length; i++) {
+ UChar c = m_data[i];
+ data[i] = toASCIILower(c);
+ }
return newImpl;
-
+ }
+
// Do a slower implementation for cases that include non-ASCII characters.
bool error;
int32_t realLength = Unicode::toLower(data, length, m_data, m_length, &error);
@@ -290,6 +195,9 @@ PassRefPtr<StringImpl> StringImpl::lower()
PassRefPtr<StringImpl> StringImpl::upper()
{
+ // This function could be optimized for no-op cases the way lower() is,
+ // but in empirical testing, few actual calls to upper() are no-ops, so
+ // it wouldn't be worth the extra time for pre-scanning.
UChar* data;
PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data);
int32_t length = m_length;
@@ -374,6 +282,8 @@ PassRefPtr<StringImpl> StringImpl::stripWhiteSpace()
while (end && isSpaceOrNewline(m_data[end]))
end--;
+ if (!start && end == m_length - 1)
+ return this;
return create(m_data + start, end + 1 - start);
}
@@ -416,12 +326,16 @@ PassRefPtr<StringImpl> StringImpl::simplifyWhiteSpace()
const UChar* from = m_data;
const UChar* fromend = from + m_length;
int outc = 0;
+ bool changedToSpace = false;
UChar* to = data.characters();
while (true) {
- while (from != fromend && isSpaceOrNewline(*from))
+ while (from != fromend && isSpaceOrNewline(*from)) {
+ if (*from != ' ')
+ changedToSpace = true;
from++;
+ }
while (from != fromend && !isSpaceOrNewline(*from))
to[outc++] = *from++;
if (from != fromend)
@@ -433,6 +347,9 @@ PassRefPtr<StringImpl> StringImpl::simplifyWhiteSpace()
if (outc > 0 && to[outc - 1] == ' ')
outc--;
+ if (static_cast<unsigned>(outc) == m_length && !changedToSpace)
+ return this;
+
data.shrink(outc);
return adopt(data);
@@ -985,7 +902,7 @@ PassRefPtr<StringImpl> StringImpl::adopt(StringBuffer& buffer)
unsigned length = buffer.length();
if (length == 0)
return empty();
- return adoptRef(new StringImpl(buffer.release(), length, AdoptBuffer()));
+ return adoptRef(new StringImpl(buffer.release(), length));
}
PassRefPtr<StringImpl> StringImpl::adopt(Vector<UChar>& vector)
@@ -993,7 +910,7 @@ PassRefPtr<StringImpl> StringImpl::adopt(Vector<UChar>& vector)
size_t size = vector.size();
if (size == 0)
return empty();
- return adoptRef(new StringImpl(vector.releaseBuffer(), size, AdoptBuffer()));
+ return adoptRef(new StringImpl(vector.releaseBuffer(), size));
}
PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, UChar*& data)
@@ -1007,10 +924,9 @@ PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, UChar*&
// struct as well as the data which it contains. This removes one
// heap allocation from this call.
size_t size = sizeof(StringImpl) + length * sizeof(UChar);
- char* buffer = static_cast<char*>(fastMalloc(size));
- data = reinterpret_cast<UChar*>(buffer + sizeof(StringImpl));
- StringImpl* string = new (buffer) StringImpl(data, length, AdoptBuffer());
- string->m_bufferIsInternal = true;
+ StringImpl* string = static_cast<StringImpl*>(fastMalloc(size));
+ data = reinterpret_cast<UChar*>(string + 1);
+ string = new (string) StringImpl(data, length);
return adoptRef(string);
}
@@ -1051,7 +967,7 @@ PassRefPtr<StringImpl> StringImpl::create(const JSC::UString& str)
{
SharedUChar* sharedBuffer = const_cast<JSC::UString*>(&str)->rep()->sharedBuffer();
if (sharedBuffer) {
- PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(const_cast<UChar*>(str.data()), str.size(), AdoptBuffer()));
+ PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(str.data(), str.size()));
sharedBuffer->ref();
impl->m_sharedBufferAndFlags.set(sharedBuffer);
return impl;
@@ -1071,18 +987,43 @@ JSC::UString StringImpl::ustring()
PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const StringImpl& string)
{
- return adoptRef(new StringImpl(string, WithTerminatingNullCharacter()));
+ // Use createUninitialized instead of 'new StringImpl' so that the string and its buffer
+ // get allocated in a single malloc block.
+ UChar* data;
+ int length = string.m_length;
+ RefPtr<StringImpl> terminatedString = createUninitialized(length + 1, data);
+ memcpy(data, string.m_data, length * sizeof(UChar));
+ data[length] = 0;
+ terminatedString->m_length--;
+ terminatedString->m_hash = string.m_hash;
+ terminatedString->m_sharedBufferAndFlags.setFlag(HasTerminatingNullCharacter);
+ return terminatedString.release();
}
-PassRefPtr<StringImpl> StringImpl::copy()
+PassRefPtr<StringImpl> StringImpl::threadsafeCopy() const
{
- // Using the constructor directly to make sure that per-thread empty string instance isn't returned.
- return adoptRef(new StringImpl(m_data, m_length));
+ // Special-case empty strings to make sure that per-thread empty string instance isn't returned.
+ if (m_length == 0)
+ return adoptRef(new StringImpl);
+ return create(m_data, m_length);
+}
+
+PassRefPtr<StringImpl> StringImpl::crossThreadString()
+{
+ SharedUChar* shared = sharedBuffer();
+ if (shared) {
+ RefPtr<StringImpl> impl = adoptRef(new StringImpl(m_data, m_length));
+ impl->m_sharedBufferAndFlags.set(shared->crossThreadCopy().releaseRef());
+ return impl.release();
+ }
+
+ // If no shared buffer is available, create a copy.
+ return threadsafeCopy();
}
StringImpl::SharedUChar* StringImpl::sharedBuffer()
{
- if (m_length < minLengthToShare || m_bufferIsInternal)
+ if (m_length < minLengthToShare || bufferIsInternal())
return 0;
if (!m_sharedBufferAndFlags.get())
diff --git a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h
index 8b4e82d..dac25b2 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h
+++ b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h
@@ -47,7 +47,6 @@ typedef const struct __CFString * CFStringRef;
namespace WebCore {
-class AtomicString;
class StringBuffer;
struct CStringTranslator;
@@ -60,26 +59,19 @@ enum TextCaseSensitivity { TextCaseSensitive, TextCaseInsensitive };
typedef bool (*CharacterMatchFunctionPtr)(UChar);
class StringImpl : public RefCounted<StringImpl> {
- friend class AtomicString;
friend struct CStringTranslator;
friend struct HashAndCharactersTranslator;
friend struct UCharBufferTranslator;
private:
friend class ThreadGlobalData;
StringImpl();
+
+ // This adopts the UChar* without copying the buffer.
StringImpl(const UChar*, unsigned length);
- StringImpl(const char*, unsigned length);
-
- struct AdoptBuffer { };
- StringImpl(UChar*, unsigned length, AdoptBuffer);
-
- struct WithTerminatingNullCharacter { };
- StringImpl(const StringImpl&, WithTerminatingNullCharacter);
-
- // For AtomicString.
- StringImpl(const UChar*, unsigned length, unsigned hash);
- StringImpl(const char*, unsigned length, unsigned hash);
+ // For use only by AtomicString's XXXTranslator helpers.
+ void setHash(unsigned hash) { ASSERT(!m_hash); m_hash = hash; }
+
typedef CrossThreadRefCounted<OwnFastMallocPtr<UChar> > SharedUChar;
public:
@@ -114,15 +106,12 @@ public:
static unsigned computeHash(const UChar*, unsigned len);
static unsigned computeHash(const char*);
- // Makes a deep copy. Helpful only if you need to use a String on another thread.
+ // Returns a StringImpl suitable for use on another thread.
+ PassRefPtr<StringImpl> crossThreadString();
+ // Makes a deep copy. Helpful only if you need to use a String on another thread
+ // (use crossThreadString if the method call doesn't need to be threadsafe).
// Since StringImpl objects are immutable, there's no other reason to make a copy.
- PassRefPtr<StringImpl> copy();
-
- // Makes a deep copy like copy() but only for a substring.
- // (This ensures that you always get something suitable for a thread while subtring
- // may not. For example, in the empty string case, substring returns empty() which
- // is not safe for another thread.)
- PassRefPtr<StringImpl> substringCopy(unsigned pos, unsigned len = UINT_MAX);
+ PassRefPtr<StringImpl> threadsafeCopy() const;
PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX);
@@ -146,7 +135,6 @@ public:
double toDouble(bool* ok = 0);
float toFloat(bool* ok = 0);
- bool isLower();
PassRefPtr<StringImpl> lower();
PassRefPtr<StringImpl> upper();
PassRefPtr<StringImpl> secure(UChar aChar);
@@ -166,7 +154,7 @@ public:
int reverseFind(UChar, int index);
int reverseFind(StringImpl*, int index, bool caseSensitive = true);
- bool startsWith(StringImpl* m_data, bool caseSensitive = true) { return reverseFind(m_data, 0, caseSensitive) == 0; }
+ bool startsWith(StringImpl* str, bool caseSensitive = true) { return reverseFind(str, 0, caseSensitive) == 0; }
bool endsWith(StringImpl*, bool caseSensitive = true);
PassRefPtr<StringImpl> replace(UChar, UChar);
@@ -196,21 +184,22 @@ private:
void* operator new(size_t size, void* address);
static PassRefPtr<StringImpl> createStrippingNullCharactersSlowCase(const UChar*, unsigned length);
+
+ // The StringImpl struct and its data may be allocated within a single heap block.
+ // In this case, the m_data pointer is an "internal buffer", and does not need to be deallocated.
+ bool bufferIsInternal() { return m_data == reinterpret_cast<const UChar*>(this + 1); }
enum StringImplFlags {
HasTerminatingNullCharacter,
InTable,
};
- unsigned m_length;
const UChar* m_data;
+ unsigned m_length;
mutable unsigned m_hash;
PtrAndFlags<SharedUChar, StringImplFlags> m_sharedBufferAndFlags;
-
- // In some cases, we allocate the StringImpl struct and its data
- // within a single heap buffer. In this case, the m_data pointer
- // is an "internal buffer", and does not need to be deallocated.
- bool m_bufferIsInternal;
+ // There is a fictitious variable-length UChar array at the end, which is used
+ // as the internal buffer by the createUninitialized and create methods.
};
bool equal(StringImpl*, StringImpl*);
diff --git a/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp b/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp
index 5d82511..d3e2965 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp
@@ -129,6 +129,10 @@ static TextEncodingNameMap* textEncodingNameMap;
static TextCodecMap* textCodecMap;
static bool didExtendTextCodecMaps;
+static const char* const textEncodingNameBlacklist[] = {
+ "UTF-7"
+};
+
#if ERROR_DISABLED
static inline void checkExistingName(const char*, const char*) { }
@@ -171,6 +175,30 @@ static void addToTextCodecMap(const char* name, NewTextCodecFunction function, c
textCodecMap->add(atomicName, TextCodecFactory(function, additionalData));
}
+static void pruneBlacklistedCodecs()
+{
+ size_t blacklistedCodecListLength = sizeof(textEncodingNameBlacklist) / sizeof(textEncodingNameBlacklist[0]);
+ for (size_t i = 0; i < blacklistedCodecListLength; ++i) {
+ const char* atomicName = textEncodingNameMap->get(textEncodingNameBlacklist[i]);
+ if (!atomicName)
+ continue;
+
+ Vector<const char*> names;
+ TextEncodingNameMap::const_iterator it = textEncodingNameMap->begin();
+ TextEncodingNameMap::const_iterator end = textEncodingNameMap->end();
+ for (; it != end; ++it) {
+ if (it->second == atomicName)
+ names.append(it->first);
+ }
+
+ size_t length = names.size();
+ for (size_t j = 0; j < length; ++j)
+ textEncodingNameMap->remove(names[j]);
+
+ textCodecMap->remove(atomicName);
+ }
+}
+
static void buildBaseTextCodecMaps()
{
ASSERT(isMainThread());
@@ -221,6 +249,8 @@ static void extendTextCodecMaps()
TextCodecWince::registerExtendedEncodingNames(addToTextEncodingNameMap);
TextCodecWince::registerExtendedCodecs(addToTextCodecMap);
#endif
+
+ pruneBlacklistedCodecs();
}
PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding)
diff --git a/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp b/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp
index e351522..b3f75cc 100644
--- a/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp
+++ b/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp
@@ -104,7 +104,7 @@ String TextCodecQt::decode(const char* bytes, size_t length, bool flush, bool /*
#endif
const char* buf = bytes;
const char* end = buf + length;
- String unicode;
+ String unicode(""); // a non-null string is expected
while (buf < end) {
int size = end - buf;
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp
index 28e3967..3b98383 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginDataNone.cpp
@@ -27,18 +27,14 @@
#include "config.h"
#include "PluginData.h"
-#include "NotImplemented.h"
-
namespace WebCore {
void PluginData::initPlugins()
{
- notImplemented();
}
void PluginData::refresh()
{
- notImplemented();
}
};
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
index f40ed95..c7979d1 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp
@@ -320,7 +320,7 @@ void PluginDatabase::clear()
m_preferredPlugins.clear();
}
-#if !PLATFORM(WIN_OS) || PLATFORM(WX)
+#if (!PLATFORM(SYMBIAN)) && (!PLATFORM(WIN_OS) || PLATFORM(WX))
// For Safari/Win the following three methods are implemented
// in PluginDatabaseWin.cpp, but if we can use WebCore constructs
// for the logic we should perhaps move it here under XP_WIN?
@@ -355,6 +355,8 @@ Vector<String> PluginDatabase::defaultPluginDirectories()
paths.append("/usr/lib/netscape/plugins-libc6");
paths.append("/usr/lib64/netscape/plugins");
paths.append("/usr/lib64/mozilla/plugins");
+ paths.append("/usr/lib/nsbrowser/plugins");
+ paths.append("/usr/lib64/nsbrowser/plugins");
String mozHome(getenv("MOZILLA_HOME"));
mozHome.append("/plugins");
@@ -426,6 +428,6 @@ void PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
}
}
-#endif // !PLATFORM(WIN_OS)
+#endif // !PLATFORM(SYMBIAN) && !PLATFORM(WIN_OS)
}
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
index 612a9d7..19337f0 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.cpp
@@ -113,6 +113,7 @@ PluginPackage::PluginPackage(const String& path, const time_t& lastModified)
m_parentDirectory = m_path.left(m_path.length() - m_fileName.length() - 1);
}
+#if !PLATFORM(SYMBIAN)
void PluginPackage::unload()
{
if (!m_isLoaded)
@@ -125,6 +126,7 @@ void PluginPackage::unload()
unloadWithoutShutdown();
}
+#endif //!PLATFORM(SYMBIAN)
void PluginPackage::unloadWithoutShutdown()
{
@@ -183,6 +185,7 @@ void PluginPackage::determineQuirks(const String& mimeType)
#if PLATFORM(QT)
m_quirks.add(PluginQuirkRequiresGtkToolKit);
#endif
+ m_quirks.add(PluginQuirkRequiresDefaultScreenDepth);
} else {
// Flash 9 and older requests windowless plugins if we return a mozilla user agent
m_quirks.add(PluginQuirkWantsMozillaUserAgent);
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
index 3afc57f..d409ab6 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginPackage.h
@@ -36,6 +36,11 @@
#include <wtf/HashMap.h>
#include <wtf/RefCounted.h>
+#if PLATFORM(SYMBIAN)
+class QPluginLoader;
+class NPInterface;
+#endif
+
namespace WebCore {
typedef HashMap<String, String> MIMEToDescriptionsMap;
typedef HashMap<String, Vector<String> > MIMEToExtensionsMap;
@@ -70,9 +75,17 @@ namespace WebCore {
int compare(const PluginPackage&) const;
PluginQuirkSet quirks() const { return m_quirks; }
const PlatformModuleVersion& version() const { return m_moduleVersion; }
+#if PLATFORM(SYMBIAN)
+ NPInterface* npInterface() const { return m_npInterface; }
+#endif // PLATFORM(SYMBIAN)
private:
PluginPackage(const String& path, const time_t& lastModified);
+
+#if PLATFORM(SYMBIAN)
+ NPInterface* m_npInterface;
+ QPluginLoader* m_pluginLoader;
+#endif // PLATFORM(SYMBIAN)
bool fetchInfo();
bool isPluginBlacklisted();
void determineQuirks(const String& mimeType);
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp
index 487450a..b943d88 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginPackageNone.cpp
@@ -26,52 +26,20 @@
#include "config.h"
#include "PluginPackage.h"
-#include "CString.h"
-#include "MIMETypeRegistry.h"
-#include "NotImplemented.h"
-#include "npruntime_impl.h"
-#include "PluginDatabase.h"
-#include "PluginDebug.h"
-
namespace WebCore {
void PluginPackage::determineQuirks(const String&)
{
- notImplemented();
}
bool PluginPackage::fetchInfo()
{
- notImplemented();
return false;
}
bool PluginPackage::load()
{
- notImplemented();
- return false;
-}
-
-#if !ENABLE(PLUGIN_PACKAGE_SIMPLE_HASH)
-unsigned PluginPackage::hash() const
-{
- notImplemented();
-
- return 0;
-}
-
-bool PluginPackage::equal(const PluginPackage&, const PluginPackage&)
-{
- notImplemented();
return false;
}
-int PluginPackage::compareFileVersion(const PlatformModuleVersion&) const
-{
- notImplemented();
- return 0;
-}
-
-#endif
-
}
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h b/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
index b652c6e..de29baf 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginQuirkSet.h
@@ -46,6 +46,7 @@ namespace WebCore {
PluginQuirkDontSetNullWindowHandleOnDestroy = 1 << 10,
PluginQuirkDontAllowMultipleInstances = 1 << 11,
PluginQuirkRequiresGtkToolKit = 1 << 12,
+ PluginQuirkRequiresDefaultScreenDepth = 1 << 13
};
class PluginQuirkSet {
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
index 28572a4..8320bc4 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginView.cpp
@@ -53,6 +53,7 @@
#include "JSDOMBinding.h"
#include "ScriptController.h"
#include "ScriptValue.h"
+#include "SecurityOrigin.h"
#include "PluginDatabase.h"
#include "PluginDebug.h"
#include "PluginMainThreadScheduler.h"
@@ -123,12 +124,12 @@ void PluginView::setFrameRect(const IntRect& rect)
updatePluginWidget();
-#if PLATFORM(WIN_OS)
- // On Windows, always call plugin to change geometry.
+#if PLATFORM(WIN_OS) || PLATFORM(SYMBIAN)
+ // On Windows and Symbian, always call plugin to change geometry.
setNPWindowRect(rect);
#elif XP_UNIX
- // On Unix, only call plugin if it's full-page.
- if (m_mode == NP_FULL)
+ // On Unix, multiple calls to setNPWindow() in windowed mode causes Flash to crash
+ if (m_mode == NP_FULL || !m_isWindowed)
setNPWindowRect(rect);
#endif
}
@@ -147,6 +148,12 @@ void PluginView::handleEvent(Event* event)
handleMouseEvent(static_cast<MouseEvent*>(event));
else if (event->isKeyboardEvent())
handleKeyboardEvent(static_cast<KeyboardEvent*>(event));
+#if defined(Q_WS_X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ else if (event->type() == eventNames().DOMFocusOutEvent)
+ handleFocusOutEvent();
+ else if (event->type() == eventNames().DOMFocusInEvent)
+ handleFocusInEvent();
+#endif
}
void PluginView::init()
@@ -234,7 +241,13 @@ bool PluginView::start()
if (!platformStart())
m_status = PluginStatusCanNotLoadPlugin;
- return (m_status == PluginStatusLoadedSuccessfully);
+ if (m_status != PluginStatusLoadedSuccessfully)
+ return false;
+
+ if (parentFrame()->page())
+ parentFrame()->page()->didStartPlugin(this);
+
+ return true;
}
PluginView::~PluginView()
@@ -274,6 +287,9 @@ void PluginView::stop()
if (!m_isStarted)
return;
+ if (parentFrame()->page())
+ parentFrame()->page()->didStopPlugin(this);
+
LOG(Plugins, "PluginView::stop(): Stopping plug-in '%s'", m_plugin->name().utf8().data());
HashSet<RefPtr<PluginStream> > streams = m_streams;
@@ -434,7 +450,7 @@ void PluginView::performRequest(PluginRequest* request)
// Executing a script can cause the plugin view to be destroyed, so we keep a reference to the parent frame.
RefPtr<Frame> parentFrame = m_parentFrame;
- JSValue result = m_parentFrame->loader()->executeScript(jsString, request->shouldAllowPopups()).jsValue();
+ JSValue result = m_parentFrame->script()->executeScript(jsString, request->shouldAllowPopups()).jsValue();
if (targetFrameName.isNull()) {
String resultString;
@@ -501,9 +517,8 @@ NPError PluginView::load(const FrameLoadRequest& frameLoadRequest, bool sendNoti
// For security reasons, only allow JS requests to be made on the frame that contains the plug-in.
if (!targetFrameName.isNull() && m_parentFrame->tree()->find(targetFrameName) != m_parentFrame)
return NPERR_INVALID_PARAM;
- } else if (!FrameLoader::canLoad(url, String(), m_parentFrame->document())) {
+ } else if (!SecurityOrigin::canLoad(url, String(), m_parentFrame->document()))
return NPERR_GENERIC_ERROR;
- }
PluginRequest* request = new PluginRequest(frameLoadRequest, sendNotification, notifyData, arePopupsAllowed());
scheduleRequest(request);
@@ -803,12 +818,18 @@ PluginView::PluginView(Frame* parentFrame, const IntSize& size, PluginPackage* p
, m_drawingModel(NPDrawingModel(-1))
, m_eventModel(NPEventModel(-1))
#endif
-#if defined(Q_WS_X11)
+#if defined(Q_WS_X11) && ENABLE(NETSCAPE_PLUGIN_API)
, m_hasPendingGeometryChange(false)
+ , m_drawable(0)
+ , m_visual(0)
+ , m_colormap(0)
+ , m_pluginDisplay(0)
#endif
, m_loadManually(loadManually)
, m_manualStream(0)
, m_isJavaScriptPaused(false)
+ , m_isHalted(false)
+ , m_hasBeenHalted(false)
{
if (!m_plugin) {
m_status = PluginStatusCanNotFindPlugin;
@@ -1214,4 +1235,10 @@ const char* PluginView::userAgentStatic()
}
#endif
+
+Node* PluginView::node() const
+{
+ return m_element;
+}
+
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginView.h b/src/3rdparty/webkit/WebCore/plugins/PluginView.h
index 54c1065..1477561 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginView.h
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginView.h
@@ -29,6 +29,7 @@
#include "CString.h"
#include "FrameLoadRequest.h"
+#include "HaltablePlugin.h"
#include "IntRect.h"
#include "KURL.h"
#include "PlatformString.h"
@@ -106,7 +107,7 @@ namespace WebCore {
virtual void didFail(const ResourceError&) = 0;
};
- class PluginView : public Widget, private PluginStreamClient, public PluginManualLoader {
+ class PluginView : public Widget, private PluginStreamClient, public PluginManualLoader, private HaltablePlugin {
public:
static PassRefPtr<PluginView> create(Frame* parentFrame, const IntSize&, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
virtual ~PluginView();
@@ -193,6 +194,14 @@ namespace WebCore {
void didFinishLoading();
void didFail(const ResourceError&);
+ // HaltablePlugin
+ virtual void halt();
+ virtual void restart();
+ virtual Node* node() const;
+
+ bool isHalted() const { return m_isHalted; }
+ bool hasBeenHalted() const { return m_hasBeenHalted; }
+
static bool isCallingPlugin();
bool start();
@@ -249,6 +258,10 @@ namespace WebCore {
void handleKeyboardEvent(KeyboardEvent*);
void handleMouseEvent(MouseEvent*);
+#if defined(Q_WS_X11) && ENABLE(NETSCAPE_PLUGIN_API)
+ void handleFocusInEvent();
+ void handleFocusOutEvent();
+#endif
int m_mode;
int m_paramCount;
@@ -295,12 +308,13 @@ public:
void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; }
#else
public:
+ void setPlatformPluginWidget(PlatformPluginWidget widget) { setPlatformWidget(widget); }
PlatformPluginWidget platformPluginWidget() const { return platformWidget(); }
#endif
private:
-#if defined(XP_UNIX) || defined(Q_WS_X11)
+#if defined(XP_UNIX) || defined(Q_WS_X11) || PLATFORM(SYMBIAN)
void setNPWindowIfNeeded();
#elif defined(XP_MACOSX)
NP_CGContext m_npCgContext;
@@ -313,8 +327,14 @@ private:
Point globalMousePosForPlugin() const;
#endif
-#if defined(Q_WS_X11)
+#if defined(Q_WS_X11) && ENABLE(NETSCAPE_PLUGIN_API)
bool m_hasPendingGeometryChange;
+ Pixmap m_drawable;
+ Visual* m_visual;
+ Colormap m_colormap;
+ Display* m_pluginDisplay;
+
+ void initXEvent(XEvent* event);
#endif
IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
@@ -325,6 +345,9 @@ private:
bool m_isJavaScriptPaused;
+ bool m_isHalted;
+ bool m_hasBeenHalted;
+
static PluginView* s_currentPluginView;
};
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
index b694214..725af82 100644
--- a/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/PluginViewNone.cpp
@@ -26,114 +26,98 @@
#include "config.h"
#include "PluginView.h"
-#include "NotImplemented.h"
-#include "PluginPackage.h"
-
using namespace WTF;
namespace WebCore {
void PluginView::setFocus()
{
- notImplemented();
}
void PluginView::show()
{
- notImplemented();
}
void PluginView::hide()
{
- notImplemented();
}
void PluginView::paint(GraphicsContext*, const IntRect&)
{
- notImplemented();
}
void PluginView::handleKeyboardEvent(KeyboardEvent*)
{
- notImplemented();
}
void PluginView::handleMouseEvent(MouseEvent*)
{
- notImplemented();
}
void PluginView::setParent(ScrollView*)
{
- notImplemented();
}
void PluginView::setNPWindowRect(const IntRect&)
{
- notImplemented();
}
NPError PluginView::handlePostReadFile(Vector<char>&, uint32, const char*)
{
- notImplemented();
-
return 0;
}
NPError PluginView::getValue(NPNVariable, void*)
{
- notImplemented();
return 0;
}
#if ENABLE(NETSCAPE_PLUGIN_API)
NPError PluginView::getValueStatic(NPNVariable variable, void* value)
{
- notImplemented();
return 0;
}
#endif
void PluginView::invalidateRect(NPRect*)
{
- notImplemented();
}
void PluginView::invalidateRect(const IntRect&)
{
- notImplemented();
}
void PluginView::invalidateRegion(NPRegion)
{
- notImplemented();
}
void PluginView::forceRedraw()
{
- notImplemented();
}
bool PluginView::platformStart()
{
- notImplemented();
-
return true;
}
void PluginView::platformDestroy()
{
- notImplemented();
}
void PluginView::setParentVisible(bool)
{
- notImplemented();
}
void PluginView::updatePluginWidget()
{
- notImplemented();
+}
+
+void PluginView::halt()
+{
+}
+
+void PluginView::restart()
+{
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
index d242fb8..325bc4d 100644
--- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginPackageMac.cpp
@@ -159,7 +159,8 @@ bool PluginPackage::fetchInfo()
plist = readPListFile(path.get(), /*createFile*/ true, m_module);
}
- mimeDict = (CFDictionaryRef)CFDictionaryGetValue(plist.get(), CFSTR("WebPluginMIMETypes"));
+ if (plist)
+ mimeDict = (CFDictionaryRef)CFDictionaryGetValue(plist.get(), CFSTR("WebPluginMIMETypes"));
}
if (!mimeDict)
diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
index 226aab6..6521c84 100644
--- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp
@@ -174,8 +174,8 @@ bool PluginView::platformStart()
#if PLATFORM(QT)
if (QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient()) {
- if (QWidget* window = QWidget::find(client->winId())) {
- setPlatformPluginWidget(window);
+ if (QWidget* widget = client->ownerWidget()) {
+ setPlatformPluginWidget(widget);
}
}
#endif
@@ -692,6 +692,14 @@ NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const c
return NPERR_NO_ERROR;
}
+void PluginView::halt()
+{
+}
+
+void PluginView::restart()
+{
+}
+
} // namespace WebCore
#else
diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp
index 59ab5bc..cb894a7 100644
--- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginContainerQt.cpp
@@ -73,6 +73,7 @@ PluginContainerQt::PluginContainerQt(PluginView* view, QWidget* parent)
PluginContainerQt::~PluginContainerQt()
{
delete m_clientWrapper;
+ m_pluginView->setPlatformPluginWidget(0);
}
void PluginContainerQt::on_clientClosed()
diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
index 7f5a7b9..8119924 100644
--- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginPackageQt.cpp
@@ -80,6 +80,16 @@ bool PluginPackage::fetchInfo()
return true;
}
+static NPError staticPluginQuirkRequiresGtkToolKit_NPN_GetValue(NPP instance, NPNVariable variable, void* value)
+{
+ if (variable == NPNVToolkit) {
+ *static_cast<uint32*>(value) = 2;
+ return NPERR_NO_ERROR;
+ }
+
+ return NPN_GetValue(instance, variable, value);
+}
+
bool PluginPackage::load()
{
if (m_isLoaded) {
@@ -111,6 +121,12 @@ bool PluginPackage::load()
initializeBrowserFuncs();
+ if (m_path.contains("npwrapper.")) {
+ // nspluginwrapper relies on the toolkit value to know if glib is available
+ // It does so in NP_Initialize with a null instance, therefore it is done this way:
+ m_browserFuncs.getvalue = staticPluginQuirkRequiresGtkToolKit_NPN_GetValue;
+ }
+
#if defined(XP_UNIX)
npErr = NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
#else
diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
index 908e707..28637a1 100644
--- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
* Copyright (C) 2008 Collabora Ltd. All rights reserved.
+ * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,6 +31,8 @@
#include "Document.h"
#include "DocumentLoader.h"
#include "Element.h"
+#include "FloatPoint.h"
+#include "FocusController.h"
#include "Frame.h"
#include "FrameLoadRequest.h"
#include "FrameLoader.h"
@@ -57,12 +60,20 @@
#include "runtime.h"
#include "runtime_root.h"
#include "QWebPageClient.h"
+#include <QApplication>
+#include <QDesktopWidget>
#include <QKeyEvent>
+#include <QPainter>
#include <QWidget>
#include <QX11Info>
#include <runtime/JSLock.h>
#include <runtime/JSValue.h>
#include <X11/X.h>
+#ifndef QT_NO_XRENDER
+#define Bool int
+#define Status int
+#include <X11/extensions/Xrender.h>
+#endif
using JSC::ExecState;
using JSC::Interpreter;
@@ -80,7 +91,7 @@ using namespace HTMLNames;
void PluginView::updatePluginWidget()
{
- if (!parent() || !m_isWindowed || !platformPluginWidget())
+ if (!parent())
return;
ASSERT(parent()->isFrameView());
@@ -96,6 +107,15 @@ void PluginView::updatePluginWidget()
if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
return;
+ if (!m_isWindowed && m_windowRect.size() != oldWindowRect.size()) {
+ if (m_drawable)
+ XFreePixmap(QX11Info::display(), m_drawable);
+
+ m_drawable = XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(), m_windowRect.width(), m_windowRect.height(),
+ ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth);
+ QApplication::syncX(); // make sure that the server knows about the Drawable
+ }
+
// do not call setNPWindowIfNeeded immediately, will be called on paint()
m_hasPendingGeometryChange = true;
@@ -150,8 +170,67 @@ void PluginView::paint(GraphicsContext* context, const IntRect& rect)
if (context->paintingDisabled())
return;
- if (m_isWindowed && platformPluginWidget())
- setNPWindowIfNeeded();
+ setNPWindowIfNeeded();
+
+ if (m_isWindowed || !m_drawable)
+ return;
+
+ const bool syncX = m_pluginDisplay && m_pluginDisplay != QX11Info::display();
+
+ QPainter* painter = context->platformContext();
+
+ QPixmap qtDrawable = QPixmap::fromX11Pixmap(m_drawable, QPixmap::ExplicitlyShared);
+ const int drawableDepth = ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth;
+ ASSERT(drawableDepth == qtDrawable.depth());
+
+ if (m_isTransparent && drawableDepth != 32) {
+ // Attempt content propagation for drawable with no alpha by copying over from the backing store
+ QPoint offset;
+ QPaintDevice* backingStoreDevice = QPainter::redirected(painter->device(), &offset);
+ offset = -offset; // negating the offset gives us the offset of the view within the backing store pixmap
+
+ const bool hasValidBackingStore = backingStoreDevice && backingStoreDevice->devType() == QInternal::Pixmap;
+ QPixmap* backingStorePixmap = static_cast<QPixmap*>(backingStoreDevice);
+
+ // We cannot grab contents from the backing store when painting on QGraphicsView items
+ // (because backing store contents are already transformed). What we really mean to do
+ // here is to check if we are painting on QWebView, but let's be a little permissive :)
+ QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
+ const bool backingStoreHasUntransformedContents = client && qobject_cast<QWidget*>(client->pluginParent());
+
+ if (hasValidBackingStore && backingStorePixmap->depth() == drawableDepth
+ && backingStoreHasUntransformedContents) {
+ GC gc = XDefaultGC(QX11Info::display(), QX11Info::appScreen());
+ XCopyArea(QX11Info::display(), backingStorePixmap->handle(), m_drawable, gc,
+ offset.x() + m_windowRect.x() + m_clipRect.x(), offset.y() + m_windowRect.y() + m_clipRect.y(),
+ m_clipRect.width(), m_clipRect.height(), m_clipRect.x(), m_clipRect.y());
+ } else { // no backing store, clean the pixmap because the plugin thinks its transparent
+ QPainter painter(&qtDrawable);
+ painter.fillRect(m_clipRect, Qt::white);
+ }
+
+ if (syncX)
+ QApplication::syncX();
+ }
+
+ XEvent xevent;
+ memset(&xevent, 0, sizeof(XEvent));
+ XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
+ exposeEvent.type = GraphicsExpose;
+ exposeEvent.display = QX11Info::display();
+ exposeEvent.drawable = m_drawable;
+ exposeEvent.x = m_clipRect.x();
+ exposeEvent.y = m_clipRect.y();
+ exposeEvent.width = m_clipRect.x() + m_clipRect.width(); // flash bug? it thinks width is the right
+ exposeEvent.height = m_clipRect.y() + m_clipRect.height(); // flash bug? it thinks height is the bottom
+
+ dispatchNPEvent(xevent);
+
+ if (syncX)
+ XSync(m_pluginDisplay, False); // sync changes by plugin
+
+ painter->drawPixmap(frameRect().x() + m_clipRect.x(), frameRect().y() + m_clipRect.y(), qtDrawable,
+ m_clipRect.x(), m_clipRect.y(), m_clipRect.width(), m_clipRect.height());
}
// TODO: Unify across ports.
@@ -161,45 +240,55 @@ bool PluginView::dispatchNPEvent(NPEvent& event)
return false;
PluginView::setCurrentPluginView(this);
- JSC::JSLock::DropAllLocks dropAllLocks(false);
-
+ JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
setCallingPlugin(true);
- bool accepted = m_plugin->pluginFuncs();
+ bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
setCallingPlugin(false);
+ PluginView::setCurrentPluginView(0);
return accepted;
}
-void setSharedXEventFields(XEvent& xEvent, QWidget* hostWindow)
+void setSharedXEventFields(XEvent* xEvent, QWidget* ownerWidget)
{
- xEvent.xany.serial = 0; // we are unaware of the last request processed by X Server
- xEvent.xany.send_event = false;
- xEvent.xany.display = hostWindow->x11Info().display();
- // NOTE: event.xany.window doesn't always respond to the .window property of other XEvent's
+ xEvent->xany.serial = 0; // we are unaware of the last request processed by X Server
+ xEvent->xany.send_event = false;
+ xEvent->xany.display = QX11Info::display();
+ // NOTE: event->xany.window doesn't always respond to the .window property of other XEvent's
// but does in the case of KeyPress, KeyRelease, ButtonPress, ButtonRelease, and MotionNotify
// events; thus, this is right:
- xEvent.xany.window = hostWindow->window()->handle();
+ xEvent->xany.window = ownerWidget ? ownerWidget->window()->handle() : 0;
}
-void setXKeyEventSpecificFields(XEvent& xEvent, KeyboardEvent* event)
+void PluginView::initXEvent(XEvent* xEvent)
+{
+ memset(xEvent, 0, sizeof(XEvent));
+
+ QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
+ QWidget* ownerWidget = client ? client->ownerWidget() : 0;
+ setSharedXEventFields(xEvent, ownerWidget);
+}
+
+void setXKeyEventSpecificFields(XEvent* xEvent, KeyboardEvent* event)
{
QKeyEvent* qKeyEvent = event->keyEvent()->qtEvent();
- xEvent.xkey.root = QX11Info::appRootWindow();
- xEvent.xkey.subwindow = 0; // we have no child window
- xEvent.xkey.time = event->timeStamp();
- xEvent.xkey.state = qKeyEvent->nativeModifiers();
- xEvent.xkey.keycode = qKeyEvent->nativeScanCode();
- xEvent.xkey.same_screen = true;
+ xEvent->type = (event->type() == eventNames().keydownEvent) ? 2 : 3; // ints as Qt unsets KeyPress and KeyRelease
+ xEvent->xkey.root = QX11Info::appRootWindow();
+ xEvent->xkey.subwindow = 0; // we have no child window
+ xEvent->xkey.time = event->timeStamp();
+ xEvent->xkey.state = qKeyEvent->nativeModifiers();
+ xEvent->xkey.keycode = qKeyEvent->nativeScanCode();
+ xEvent->xkey.same_screen = true;
// NOTE: As the XEvents sent to the plug-in are synthesized and there is not a native window
// corresponding to the plug-in rectangle, some of the members of the XEvent structures are not
// set to their normal Xserver values. e.g. Key events don't have a position.
// source: https://developer.mozilla.org/en/NPEvent
- xEvent.xkey.x = 0;
- xEvent.xkey.y = 0;
- xEvent.xkey.x_root = 0;
- xEvent.xkey.y_root = 0;
+ xEvent->xkey.x = 0;
+ xEvent->xkey.y = 0;
+ xEvent->xkey.x_root = 0;
+ xEvent->xkey.y_root = 0;
}
void PluginView::handleKeyboardEvent(KeyboardEvent* event)
@@ -207,25 +296,147 @@ void PluginView::handleKeyboardEvent(KeyboardEvent* event)
if (m_isWindowed)
return;
- if (event->type() != "keydown" && event->type() != "keyup")
+ if (event->type() != eventNames().keydownEvent && event->type() != eventNames().keyupEvent)
return;
- XEvent npEvent; // On UNIX NPEvent is a typedef for XEvent.
-
- npEvent.type = (event->type() == "keydown") ? 2 : 3; // ints as Qt unsets KeyPress and KeyRelease
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- QWidget* window = QWidget::find(client->winId());
- setSharedXEventFields(npEvent, window);
- setXKeyEventSpecificFields(npEvent, event);
+ XEvent npEvent;
+ initXEvent(&npEvent);
+ setXKeyEventSpecificFields(&npEvent, event);
if (!dispatchNPEvent(npEvent))
event->setDefaultHandled();
}
+static unsigned int inputEventState(MouseEvent* event)
+{
+ unsigned int state = 0;
+ if (event->ctrlKey())
+ state |= ControlMask;
+ if (event->shiftKey())
+ state |= ShiftMask;
+ if (event->altKey())
+ state |= Mod1Mask;
+ if (event->metaKey())
+ state |= Mod4Mask;
+ return state;
+}
+
+static void setXButtonEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
+{
+ XButtonEvent& xbutton = xEvent->xbutton;
+ xbutton.type = event->type() == eventNames().mousedownEvent ? ButtonPress : ButtonRelease;
+ xbutton.root = QX11Info::appRootWindow();
+ xbutton.subwindow = 0;
+ xbutton.time = event->timeStamp();
+ xbutton.x = postZoomPos.x();
+ xbutton.y = postZoomPos.y();
+ xbutton.x_root = event->screenX();
+ xbutton.y_root = event->screenY();
+ xbutton.state = inputEventState(event);
+ switch (event->button()) {
+ case MiddleButton:
+ xbutton.button = Button2;
+ break;
+ case RightButton:
+ xbutton.button = Button3;
+ break;
+ case LeftButton:
+ default:
+ xbutton.button = Button1;
+ break;
+ }
+ xbutton.same_screen = true;
+}
+
+static void setXMotionEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
+{
+ XMotionEvent& xmotion = xEvent->xmotion;
+ xmotion.type = MotionNotify;
+ xmotion.root = QX11Info::appRootWindow();
+ xmotion.subwindow = 0;
+ xmotion.time = event->timeStamp();
+ xmotion.x = postZoomPos.x();
+ xmotion.y = postZoomPos.y();
+ xmotion.x_root = event->screenX();
+ xmotion.y_root = event->screenY();
+ xmotion.state = inputEventState(event);
+ xmotion.is_hint = NotifyNormal;
+ xmotion.same_screen = true;
+}
+
+static void setXCrossingEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
+{
+ XCrossingEvent& xcrossing = xEvent->xcrossing;
+ xcrossing.type = event->type() == eventNames().mouseoverEvent ? EnterNotify : LeaveNotify;
+ xcrossing.root = QX11Info::appRootWindow();
+ xcrossing.subwindow = 0;
+ xcrossing.time = event->timeStamp();
+ xcrossing.x = postZoomPos.y();
+ xcrossing.y = postZoomPos.x();
+ xcrossing.x_root = event->screenX();
+ xcrossing.y_root = event->screenY();
+ xcrossing.state = inputEventState(event);
+ xcrossing.mode = NotifyNormal;
+ xcrossing.detail = NotifyDetailNone;
+ xcrossing.same_screen = true;
+ xcrossing.focus = false;
+}
+
void PluginView::handleMouseEvent(MouseEvent* event)
{
if (m_isWindowed)
return;
+
+ if (event->type() == eventNames().mousedownEvent) {
+ // Give focus to the plugin on click
+ if (Page* page = m_parentFrame->page())
+ page->focusController()->setActive(true);
+
+ focusPluginElement();
+ }
+
+ XEvent npEvent;
+ initXEvent(&npEvent);
+
+ IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
+
+ if (event->type() == eventNames().mousedownEvent || event->type() == eventNames().mouseupEvent)
+ setXButtonEventSpecificFields(&npEvent, event, postZoomPos);
+ else if (event->type() == eventNames().mousemoveEvent)
+ setXMotionEventSpecificFields(&npEvent, event, postZoomPos);
+ else if (event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mouseoverEvent)
+ setXCrossingEventSpecificFields(&npEvent, event, postZoomPos);
+ else
+ return;
+
+ if (!dispatchNPEvent(npEvent))
+ event->setDefaultHandled();
+}
+
+void PluginView::handleFocusInEvent()
+{
+ XEvent npEvent;
+ initXEvent(&npEvent);
+
+ XFocusChangeEvent& event = npEvent.xfocus;
+ event.type = 9; /* int as Qt unsets FocusIn */
+ event.mode = NotifyNormal;
+ event.detail = NotifyDetailNone;
+
+ dispatchNPEvent(npEvent);
+}
+
+void PluginView::handleFocusOutEvent()
+{
+ XEvent npEvent;
+ initXEvent(&npEvent);
+
+ XFocusChangeEvent& event = npEvent.xfocus;
+ event.type = 10; /* int as Qt unsets FocusOut */
+ event.mode = NotifyNormal;
+ event.detail = NotifyDetailNone;
+
+ dispatchNPEvent(npEvent);
}
void PluginView::setParent(ScrollView* parent)
@@ -238,7 +449,8 @@ void PluginView::setParent(ScrollView* parent)
void PluginView::setNPWindowRect(const IntRect&)
{
- // Ignored as we don't want to move immediately.
+ if (!m_isWindowed)
+ setNPWindowIfNeeded();
}
void PluginView::setNPWindowIfNeeded()
@@ -246,36 +458,53 @@ void PluginView::setNPWindowIfNeeded()
if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
return;
+ // If the plugin didn't load sucessfully, no point in calling setwindow
+ if (m_status != PluginStatusLoadedSuccessfully)
+ return;
+
// On Unix, only call plugin if it's full-page or windowed
if (m_mode != NP_FULL && m_mode != NP_EMBED)
return;
+ // Check if the platformPluginWidget still exists
+ if (m_isWindowed && !platformPluginWidget())
+ return;
+
if (!m_hasPendingGeometryChange)
return;
m_hasPendingGeometryChange = false;
- ASSERT(platformPluginWidget());
- platformPluginWidget()->setGeometry(m_windowRect);
- // if setMask is set with an empty QRegion, no clipping will
- // be performed, so in that case we hide the plugin view
- platformPluginWidget()->setVisible(!m_clipRect.isEmpty());
- platformPluginWidget()->setMask(QRegion(m_clipRect));
+ if (m_isWindowed) {
+ platformPluginWidget()->setGeometry(m_windowRect);
+ // if setMask is set with an empty QRegion, no clipping will
+ // be performed, so in that case we hide the plugin view
+ platformPluginWidget()->setVisible(!m_clipRect.isEmpty());
+ platformPluginWidget()->setMask(QRegion(m_clipRect));
+
+ m_npWindow.x = m_windowRect.x();
+ m_npWindow.y = m_windowRect.y();
+
+ m_npWindow.clipRect.left = m_clipRect.x();
+ m_npWindow.clipRect.top = m_clipRect.y();
+ m_npWindow.clipRect.right = m_clipRect.width();
+ m_npWindow.clipRect.bottom = m_clipRect.height();
+ } else {
+ m_npWindow.x = 0;
+ m_npWindow.y = 0;
+
+ m_npWindow.clipRect.left = 0;
+ m_npWindow.clipRect.top = 0;
+ m_npWindow.clipRect.right = 0;
+ m_npWindow.clipRect.bottom = 0;
+ }
// FLASH WORKAROUND: Only set initially. Multiple calls to
- // setNPWindow() cause the plugin to crash.
- if (m_npWindow.width == -1 || m_npWindow.height == -1) {
+ // setNPWindow() cause the plugin to crash in windowed mode.
+ if (!m_isWindowed || m_npWindow.width == -1 || m_npWindow.height == -1) {
m_npWindow.width = m_windowRect.width();
m_npWindow.height = m_windowRect.height();
}
- m_npWindow.x = m_windowRect.x();
- m_npWindow.y = m_windowRect.y();
-
- m_npWindow.clipRect.left = m_clipRect.x();
- m_npWindow.clipRect.top = m_clipRect.y();
- m_npWindow.clipRect.right = m_clipRect.width();
- m_npWindow.clipRect.bottom = m_clipRect.height();
-
PluginView::setCurrentPluginView(this);
JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
setCallingPlugin(true);
@@ -340,6 +569,10 @@ NPError PluginView::getValueStatic(NPNVariable variable, void* value)
*static_cast<NPBool*>(value) = true;
return NPERR_NO_ERROR;
+ case NPNVSupportsWindowless:
+ *static_cast<NPBool*>(value) = true;
+ return NPERR_NO_ERROR;
+
default:
return NPERR_GENERIC_ERROR;
}
@@ -351,13 +584,7 @@ NPError PluginView::getValue(NPNVariable variable, void* value)
switch (variable) {
case NPNVxDisplay:
- if (platformPluginWidget())
- *(void **)value = platformPluginWidget()->x11Info().display();
- else {
- QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- QWidget* window = QWidget::find(client->winId());
- *(void **)value = window->x11Info().display();
- }
+ *(void **)value = QX11Info::display();
return NPERR_NO_ERROR;
case NPNVxtAppContext:
@@ -402,7 +629,8 @@ NPError PluginView::getValue(NPNVariable variable, void* value)
case NPNVnetscapeWindow: {
void* w = reinterpret_cast<void*>(value);
- *((XID *)w) = m_parentFrame->view()->hostWindow()->platformPageClient()->winId();
+ QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
+ *((XID *)w) = client ? client->ownerWidget()->winId() : 0;
return NPERR_NO_ERROR;
}
@@ -419,7 +647,7 @@ NPError PluginView::getValue(NPNVariable variable, void* value)
void PluginView::invalidateRect(const IntRect& rect)
{
- if (platformWidget()) {
+ if (m_isWindowed) {
platformWidget()->update(rect);
return;
}
@@ -429,17 +657,88 @@ void PluginView::invalidateRect(const IntRect& rect)
void PluginView::invalidateRect(NPRect* rect)
{
- notImplemented();
+ if (!rect) {
+ invalidate();
+ return;
+ }
+ IntRect r(rect->left, rect->top, rect->right + rect->left, rect->bottom + rect->top);
+ invalidateWindowlessPluginRect(r);
}
void PluginView::invalidateRegion(NPRegion region)
{
- notImplemented();
+ invalidate();
}
void PluginView::forceRedraw()
{
- notImplemented();
+ invalidate();
+}
+
+static Display *getPluginDisplay()
+{
+ // The plugin toolkit might run using a different X connection. At the moment, we only
+ // support gdk based plugins (like flash) that use a different X connection.
+ // The code below has the same effect as this one:
+ // Display *gdkDisplay = gdk_x11_display_get_xdisplay(gdk_display_get_default());
+ QLibrary library("libgdk-x11-2.0");
+ if (!library.load())
+ return 0;
+
+ typedef void *(*gdk_display_get_default_ptr)();
+ gdk_display_get_default_ptr gdk_display_get_default = (gdk_display_get_default_ptr)library.resolve("gdk_display_get_default");
+ if (!gdk_display_get_default)
+ return 0;
+
+ typedef void *(*gdk_x11_display_get_xdisplay_ptr)(void *);
+ gdk_x11_display_get_xdisplay_ptr gdk_x11_display_get_xdisplay = (gdk_x11_display_get_xdisplay_ptr)library.resolve("gdk_x11_display_get_xdisplay");
+ if (!gdk_x11_display_get_xdisplay)
+ return 0;
+
+ return (Display*)gdk_x11_display_get_xdisplay(gdk_display_get_default());
+}
+
+static void getVisualAndColormap(int depth, Visual **visual, Colormap *colormap)
+{
+ *visual = 0;
+ *colormap = 0;
+
+#ifndef QT_NO_XRENDER
+ static const bool useXRender = qgetenv("QT_X11_NO_XRENDER").isNull(); // Should also check for XRender >= 0.5
+#else
+ static const bool useXRender = false;
+#endif
+
+ if (!useXRender && depth == 32)
+ return;
+
+ int nvi;
+ XVisualInfo templ;
+ templ.screen = QX11Info::appScreen();
+ templ.depth = depth;
+ templ.c_class = TrueColor;
+ XVisualInfo* xvi = XGetVisualInfo(QX11Info::display(), VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi);
+
+ if (!xvi)
+ return;
+
+#ifndef QT_NO_XRENDER
+ if (depth == 32) {
+ for (int idx = 0; idx < nvi; ++idx) {
+ XRenderPictFormat* format = XRenderFindVisualFormat(QX11Info::display(), xvi[idx].visual);
+ if (format->type == PictTypeDirect && format->direct.alphaMask) {
+ *visual = xvi[idx].visual;
+ break;
+ }
+ }
+ } else
+#endif // QT_NO_XRENDER
+ *visual = xvi[0].visual;
+
+ XFree(xvi);
+
+ if (*visual)
+ *colormap = XCreateColormap(QX11Info::display(), QX11Info::appRootWindow(), *visual, AllocNone);
}
bool PluginView::platformStart()
@@ -456,30 +755,65 @@ bool PluginView::platformStart()
PluginView::setCurrentPluginView(0);
}
- if (m_needsXEmbed) {
+ if (m_isWindowed) {
QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
- setPlatformWidget(new PluginContainerQt(this, QWidget::find(client->winId())));
+ if (m_needsXEmbed && client) {
+ setPlatformWidget(new PluginContainerQt(this, client->ownerWidget()));
+ // sync our XEmbed container window creation before sending the xid to plugins.
+ QApplication::syncX();
+ } else {
+ notImplemented();
+ m_status = PluginStatusCanNotLoadPlugin;
+ return false;
+ }
} else {
- notImplemented();
- return false;
+ setPlatformWidget(0);
+ m_pluginDisplay = getPluginDisplay();
}
show();
- NPSetWindowCallbackStruct *wsi = new NPSetWindowCallbackStruct();
-
+ NPSetWindowCallbackStruct* wsi = new NPSetWindowCallbackStruct();
wsi->type = 0;
- wsi->display = platformPluginWidget()->x11Info().display();
- wsi->visual = (Visual*)platformPluginWidget()->x11Info().visual();
- wsi->depth = platformPluginWidget()->x11Info().depth();
- wsi->colormap = platformPluginWidget()->x11Info().colormap();
- m_npWindow.ws_info = wsi;
+ if (m_isWindowed) {
+ const QX11Info* x11Info = &platformPluginWidget()->x11Info();
+
+ wsi->display = x11Info->display();
+ wsi->visual = (Visual*)x11Info->visual();
+ wsi->depth = x11Info->depth();
+ wsi->colormap = x11Info->colormap();
+
+ m_npWindow.type = NPWindowTypeWindow;
+ m_npWindow.window = (void*)platformPluginWidget()->winId();
+ m_npWindow.width = -1;
+ m_npWindow.height = -1;
+ } else {
+ const QX11Info* x11Info = &QApplication::desktop()->x11Info();
+
+ if (x11Info->depth() == 32 || !m_plugin->quirks().contains(PluginQuirkRequiresDefaultScreenDepth)) {
+ getVisualAndColormap(32, &m_visual, &m_colormap);
+ wsi->depth = 32;
+ }
+
+ if (!m_visual) {
+ getVisualAndColormap(x11Info->depth(), &m_visual, &m_colormap);
+ wsi->depth = x11Info->depth();
+ }
+
+ wsi->display = x11Info->display();
+ wsi->visual = m_visual;
+ wsi->colormap = m_colormap;
- m_npWindow.type = NPWindowTypeWindow;
- m_npWindow.window = (void*)platformPluginWidget()->winId();
- m_npWindow.width = -1;
- m_npWindow.height = -1;
+ m_npWindow.type = NPWindowTypeDrawable;
+ m_npWindow.window = 0; // Not used?
+ m_npWindow.x = 0;
+ m_npWindow.y = 0;
+ m_npWindow.width = -1;
+ m_npWindow.height = -1;
+ }
+
+ m_npWindow.ws_info = wsi;
if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))) {
updatePluginWidget();
@@ -493,6 +827,20 @@ void PluginView::platformDestroy()
{
if (platformPluginWidget())
delete platformPluginWidget();
+
+ if (m_drawable)
+ XFreePixmap(QX11Info::display(), m_drawable);
+
+ if (m_colormap)
+ XFreeColormap(QX11Info::display(), m_colormap);
+}
+
+void PluginView::halt()
+{
+}
+
+void PluginView::restart()
+{
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp
new file mode 100644
index 0000000..aece0e4
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp
@@ -0,0 +1,77 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+#include "PluginContainerSymbian.h"
+
+#include "FocusController.h"
+#include "Frame.h"
+#include "FrameView.h"
+#include "Page.h"
+#include "PlatformKeyboardEvent.h"
+#include "PluginView.h"
+
+#include <QApplication>
+#include <QWidget>
+
+using namespace WebCore;
+
+PluginContainerSymbian::PluginContainerSymbian(PluginView* view, QWidget* parent)
+ : m_parent(parent)
+ , m_pluginView(view)
+ , m_hasPendingGeometryChange(false)
+{
+ setParent(m_parent);
+}
+
+PluginContainerSymbian::~PluginContainerSymbian()
+{
+}
+
+void PluginContainerSymbian::requestGeometry(const QRect& rect, const QRegion& clip)
+{
+ if (m_windowRect != rect || m_clipRegion != clip) {
+ m_windowRect = rect;
+ m_clipRegion = clip;
+ m_hasPendingGeometryChange = true;
+ }
+}
+
+void PluginContainerSymbian::adjustGeometry()
+{
+ if (m_hasPendingGeometryChange) {
+ setGeometry(m_windowRect);
+ setMask(m_clipRegion);
+ m_hasPendingGeometryChange = false;
+ }
+}
+
+void PluginContainerSymbian::focusInEvent(QFocusEvent* event)
+{
+ if (Page* page = m_pluginView->parentFrame()->page())
+ page->focusController()->setActive(true);
+
+ m_pluginView->focusPluginElement();
+}
+
+void PluginContainerSymbian::focusOutEvent(QFocusEvent*)
+{
+ if (Page* page = m_pluginView->parentFrame()->page())
+ page->focusController()->setActive(false);
+}
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h
new file mode 100644
index 0000000..fce4a71
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h
@@ -0,0 +1,50 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PluginContainerSymbian_h
+#define PluginContainerSymbian_h
+
+#include <QWidget>
+
+namespace WebCore {
+
+ class PluginView;
+
+ class PluginContainerSymbian : public QWidget {
+ Q_OBJECT
+ public:
+ PluginContainerSymbian(PluginView*, QWidget* parent);
+ ~PluginContainerSymbian();
+
+ void requestGeometry(const QRect&, const QRegion& clip = QRegion());
+ void adjustGeometry();
+
+ protected:
+ virtual void focusInEvent(QFocusEvent*);
+ virtual void focusOutEvent(QFocusEvent*);
+ private:
+ PluginView* m_pluginView;
+ QWidget* m_parent;
+ QRect m_windowRect;
+ QRegion m_clipRegion;
+ bool m_hasPendingGeometryChange;
+ };
+}
+
+#endif // PluginContainerSymbian_h
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp
new file mode 100644
index 0000000..2e09296
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginDatabaseSymbian.cpp
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "config.h"
+#include "PluginDatabase.h"
+
+#include <QFileInfo>
+#include <f32file.h>
+
+static const char QTPLUGIN_FILTER[] = "*.qtplugin";
+static const char QT_PLUGIN_FOLDER[] = ":\\resource\\qt\\plugins\\npqtplugins\\";
+
+namespace WebCore {
+
+Vector<String> PluginDatabase::defaultPluginDirectories()
+{
+ Vector<String> directories;
+ //find the installation drive
+ TDriveList drivelist;
+ TChar driveLetter;
+ RFs fsSession;
+
+ if (fsSession.Connect() == KErrNone && fsSession.DriveList(drivelist) == KErrNone) {
+ for (TInt driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++) {
+ if (drivelist[driveNumber] && fsSession.DriveToChar(driveNumber, driveLetter) == KErrNone) {
+ QString driveStringValue(QChar((uint)driveLetter.GetUpperCase()));
+ QString stubDirPath;
+ stubDirPath.append(driveStringValue);
+ stubDirPath.append(QT_PLUGIN_FOLDER);
+ if (QFileInfo(stubDirPath).exists())
+ directories.append(stubDirPath);
+ }
+ }
+ }
+
+ fsSession.Close();
+ return directories;
+}
+
+bool PluginDatabase::isPreferredPluginDirectory(const String& path)
+{
+ return true;
+}
+
+void PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
+{
+ // FIXME: This should be a case insensitive set.
+ HashSet<String> uniqueFilenames;
+
+ String fileNameFilter(QTPLUGIN_FILTER);
+
+ Vector<String>::const_iterator dirsEnd = m_pluginDirectories.end();
+ for (Vector<String>::const_iterator dIt = m_pluginDirectories.begin(); dIt != dirsEnd; ++dIt) {
+ Vector<String> pluginPaths = listDirectory(*dIt, fileNameFilter);
+ Vector<String>::const_iterator pluginsEnd = pluginPaths.end();
+ for (Vector<String>::const_iterator pIt = pluginPaths.begin(); pIt != pluginsEnd; ++pIt) {
+ if (!fileExists(*pIt))
+ continue;
+ paths.add(*pIt);
+ }
+ }
+}
+
+}
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginPackageSymbian.cpp b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginPackageSymbian.cpp
new file mode 100644
index 0000000..d5c7533
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginPackageSymbian.cpp
@@ -0,0 +1,177 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "config.h"
+#include "PluginPackage.h"
+
+#include "CString.h"
+#include "MIMETypeRegistry.h"
+#include "npinterface.h"
+#include "npruntime_impl.h"
+#include "PluginDatabase.h"
+#include "PluginDebug.h"
+#include <QPluginLoader>
+
+namespace WebCore {
+
+bool PluginPackage::fetchInfo()
+{
+ if (!load())
+ return false;
+
+ char* buf = 0;
+ NPError err = m_pluginFuncs.getvalue(0, NPPVpluginNameString, (void *)&buf);
+ m_name = buf;
+ err = m_pluginFuncs.getvalue(0, NPPVpluginDescriptionString, (void *)&buf);
+ m_description = buf;
+
+ determineModuleVersionFromDescription();
+
+ String s = m_npInterface->NP_GetMIMEDescription();
+ Vector<String> types;
+ s.split(UChar('|'), false, types); // <MIME1>;<ext1,ext2,ext3,...>;<Description>|<MIME2>|<MIME3>|...
+
+ for (int i = 0; i < types.size(); ++i) {
+ Vector<String> mime;
+ types[i].split(UChar(';'), true, mime); // <MIME1>;<ext1,ext2,ext3,...>;<Description>
+ if (mime.size() > 0) {
+ Vector<String> exts;
+ if (mime.size() > 1)
+ mime[1].split(UChar(','), false, exts); // <ext1,ext2,ext3,...>
+
+ m_mimeToExtensions.add(mime[0], exts); // <MIME>,<ext1,ext2,ext3>
+ if (mime.size() > 2)
+ m_mimeToDescriptions.add(mime[0], mime[2]); // <MIME>,<Description>
+ }
+ }
+ unload();
+ return true;
+}
+
+bool PluginPackage::load()
+{
+ if (m_isLoaded) {
+ m_loadCount++;
+ return true;
+ }
+
+ m_pluginLoader = new QPluginLoader(m_path);
+ if (!m_pluginLoader->load()) {
+ delete m_pluginLoader;
+ m_pluginLoader = 0;
+ return false;
+ }
+
+ QObject* plugin = m_pluginLoader->instance();
+ if (!plugin) {
+ m_pluginLoader->unload();
+ delete m_pluginLoader;
+ m_pluginLoader = 0;
+ return false;
+ }
+
+ // Plugin instance created
+ // Cast plugin to NPInterface,
+ m_npInterface = qobject_cast<NPInterface*>(plugin);
+ if (!m_npInterface) {
+ m_pluginLoader->unload();
+ delete m_pluginLoader;
+ m_pluginLoader = 0;
+ return false;
+ }
+
+ m_isLoaded = true;
+
+ NPError npErr;
+ memset(&m_pluginFuncs, 0, sizeof(m_pluginFuncs));
+ m_pluginFuncs.size = sizeof(m_pluginFuncs);
+ m_browserFuncs.size = sizeof(m_browserFuncs);
+ m_browserFuncs.version = NP_VERSION_MINOR;
+ m_browserFuncs.geturl = NPN_GetURL;
+ m_browserFuncs.posturl = NPN_PostURL;
+ m_browserFuncs.requestread = NPN_RequestRead;
+ m_browserFuncs.newstream = NPN_NewStream;
+ m_browserFuncs.write = NPN_Write;
+ m_browserFuncs.destroystream = NPN_DestroyStream;
+ m_browserFuncs.status = NPN_Status;
+ m_browserFuncs.uagent = NPN_UserAgent;
+ m_browserFuncs.memalloc = NPN_MemAlloc;
+ m_browserFuncs.memfree = NPN_MemFree;
+ m_browserFuncs.memflush = NPN_MemFlush;
+ m_browserFuncs.reloadplugins = NPN_ReloadPlugins;
+ m_browserFuncs.geturlnotify = NPN_GetURLNotify;
+ m_browserFuncs.posturlnotify = NPN_PostURLNotify;
+ m_browserFuncs.getvalue = NPN_GetValue;
+ m_browserFuncs.setvalue = NPN_SetValue;
+ m_browserFuncs.invalidaterect = NPN_InvalidateRect;
+ m_browserFuncs.invalidateregion = NPN_InvalidateRegion;
+ m_browserFuncs.forceredraw = NPN_ForceRedraw;
+ m_browserFuncs.getJavaEnv = NPN_GetJavaEnv;
+ m_browserFuncs.getJavaPeer = NPN_GetJavaPeer;
+ m_browserFuncs.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
+ m_browserFuncs.poppopupsenabledstate = NPN_PopPopupsEnabledState;
+ m_browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
+ m_browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
+ m_browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
+ m_browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
+ m_browserFuncs.identifierisstring = _NPN_IdentifierIsString;
+ m_browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
+ m_browserFuncs.createobject = _NPN_CreateObject;
+ m_browserFuncs.retainobject = _NPN_RetainObject;
+ m_browserFuncs.releaseobject = _NPN_ReleaseObject;
+ m_browserFuncs.invoke = _NPN_Invoke;
+ m_browserFuncs.invokeDefault = _NPN_InvokeDefault;
+ m_browserFuncs.evaluate = _NPN_Evaluate;
+ m_browserFuncs.getproperty = _NPN_GetProperty;
+ m_browserFuncs.setproperty = _NPN_SetProperty;
+ m_browserFuncs.removeproperty = _NPN_RemoveProperty;
+ m_browserFuncs.hasproperty = _NPN_HasMethod;
+ m_browserFuncs.hasmethod = _NPN_HasProperty;
+ m_browserFuncs.setexception = _NPN_SetException;
+ m_browserFuncs.enumerate = _NPN_Enumerate;
+ m_browserFuncs.construct = _NPN_Construct;
+
+ npErr = m_npInterface->NP_Initialize(&m_browserFuncs, &m_pluginFuncs);
+ if (npErr != NPERR_NO_ERROR) {
+ m_pluginLoader->unload();
+ delete m_pluginLoader;
+ m_pluginLoader = 0;
+ return false;
+ }
+
+ m_loadCount++;
+ return true;
+}
+
+void PluginPackage::unload()
+{
+ if (!m_isLoaded)
+ return;
+
+ if (--m_loadCount > 0)
+ return;
+
+ m_isLoaded = false;
+ m_npInterface->NP_Shutdown();
+
+ m_pluginLoader->unload();
+ delete m_pluginLoader;
+ m_pluginLoader = 0;
+}
+}
+
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp
new file mode 100644
index 0000000..14e25b1
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp
@@ -0,0 +1,462 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "config.h"
+#include "PluginView.h"
+
+#include "Document.h"
+#include "DocumentLoader.h"
+#include "Element.h"
+#include "FocusController.h"
+#include "Frame.h"
+#include "FrameLoadRequest.h"
+#include "FrameLoader.h"
+#include "FrameTree.h"
+#include "FrameView.h"
+#include "GraphicsContext.h"
+#include "HTMLNames.h"
+#include "HTMLPlugInElement.h"
+#include "Image.h"
+#include "JSDOMBinding.h"
+#include "KeyboardEvent.h"
+#include "MouseEvent.h"
+#include "NotImplemented.h"
+#include "npfunctions.h"
+#include "npinterface.h"
+#include "Page.h"
+#include "PlatformKeyboardEvent.h"
+#include "PlatformMouseEvent.h"
+#include "PluginContainerSymbian.h"
+#include "PluginDebug.h"
+#include "PluginMainThreadScheduler.h"
+#include "PluginPackage.h"
+#include "RenderLayer.h"
+#include "ScriptController.h"
+#include "Settings.h"
+#include "npruntime_impl.h"
+#include "runtime.h"
+#include "runtime_root.h"
+#include "QWebPageClient.h"
+#include <QKeyEvent>
+#include <QPixmap.h>
+#include <QRegion>
+#include <QVector>
+#include <QWidget>
+#include <runtime/JSLock.h>
+#include <runtime/JSValue.h>
+
+using JSC::ExecState;
+using JSC::Interpreter;
+using JSC::JSLock;
+using JSC::JSObject;
+using JSC::UString;
+
+using namespace std;
+
+using namespace WTF;
+
+namespace WebCore {
+
+using namespace HTMLNames;
+
+void PluginView::updatePluginWidget()
+{
+ if (!parent())
+ return;
+ ASSERT(parent()->isFrameView());
+ FrameView* frameView = static_cast<FrameView*>(parent());
+ IntRect oldWindowRect = m_windowRect;
+ IntRect oldClipRect = m_clipRect;
+
+ m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
+ m_clipRect = windowClipRect();
+ m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
+ if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
+ return;
+
+ // in order to move/resize the plugin window at the same time as the rest of frame
+ // during e.g. scrolling, we set the mask and geometry in the paint() function, but
+ // as paint() isn't called when the plugin window is outside the frame which can
+ // be caused by a scroll, we need to move/resize immediately.
+ if (!m_windowRect.intersects(frameView->frameRect()))
+ setNPWindowIfNeeded();
+}
+
+void PluginView::setFocus()
+{
+ if (platformPluginWidget())
+ platformPluginWidget()->setFocus(Qt::OtherFocusReason);
+ else
+ Widget::setFocus();
+}
+
+void PluginView::show()
+{
+ setSelfVisible(true);
+
+ if (isParentVisible() && platformPluginWidget())
+ platformPluginWidget()->setVisible(true);
+}
+
+void PluginView::hide()
+{
+ setSelfVisible(false);
+
+ if (isParentVisible() && platformPluginWidget())
+ platformPluginWidget()->setVisible(false);
+}
+
+void PluginView::paint(GraphicsContext* context, const IntRect& rect)
+{
+ if (!m_isStarted) {
+ paintMissingPluginIcon(context, rect);
+ return;
+ }
+
+ if (context->paintingDisabled())
+ return;
+ m_npWindow.ws_info = (void*)(context->platformContext());
+ setNPWindowIfNeeded();
+
+ if (m_isWindowed && platformPluginWidget())
+ static_cast<PluginContainerSymbian*>(platformPluginWidget())->adjustGeometry();
+
+ if (m_isWindowed)
+ return;
+
+ context->save();
+ IntRect clipRect(rect);
+ clipRect.intersect(frameRect());
+ context->clip(clipRect);
+ context->translate(frameRect().location().x(), frameRect().location().y());
+
+ QPaintEvent ev(rect);
+ QEvent& npEvent = ev;
+ dispatchNPEvent(npEvent);
+
+ context->restore();
+}
+
+// TODO: Unify across ports.
+bool PluginView::dispatchNPEvent(NPEvent& event)
+{
+ if (!m_plugin->pluginFuncs()->event)
+ return false;
+
+ PluginView::setCurrentPluginView(this);
+ JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+
+ setCallingPlugin(true);
+ bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
+ setCallingPlugin(false);
+ PluginView::setCurrentPluginView(0);
+
+ return accepted;
+}
+
+void PluginView::handleKeyboardEvent(KeyboardEvent* event)
+{
+ if (m_isWindowed)
+ return;
+
+ QEvent& npEvent = *(event->keyEvent()->qtEvent());
+ if (!dispatchNPEvent(npEvent))
+ event->setDefaultHandled();
+}
+
+void PluginView::handleMouseEvent(MouseEvent* event)
+{
+ if (m_isWindowed)
+ return;
+
+ if (event->type() == eventNames().mousedownEvent) {
+ // Give focus to the plugin on click
+ if (Page* page = m_parentFrame->page())
+ page->focusController()->setActive(true);
+
+ focusPluginElement();
+ }
+
+ QEvent::Type type;
+ if (event->type() == eventNames().mousedownEvent)
+ type = QEvent::MouseButtonPress;
+ else if (event->type() == eventNames().mousemoveEvent)
+ type = QEvent::MouseMove;
+ else if (event->type() == eventNames().mouseupEvent)
+ type = QEvent::MouseButtonRelease;
+ else
+ return;
+
+ QPoint position(event->offsetX(), event->offsetY());
+ Qt::MouseButton button;
+ switch (event->which()) {
+ case 1:
+ button = Qt::LeftButton;
+ break;
+ case 2:
+ button = Qt::MidButton;
+ break;
+ case 3:
+ button = Qt::RightButton;
+ break;
+ default:
+ button = Qt::NoButton;
+ }
+ Qt::KeyboardModifiers modifiers = 0;
+ if (event->ctrlKey())
+ modifiers |= Qt::ControlModifier;
+ if (event->altKey())
+ modifiers |= Qt::AltModifier;
+ if (event->shiftKey())
+ modifiers |= Qt::ShiftModifier;
+ if (event->metaKey())
+ modifiers |= Qt::MetaModifier;
+ QMouseEvent mouseEvent(type, position, button, button, modifiers);
+ QEvent& npEvent = mouseEvent;
+ if (!dispatchNPEvent(npEvent))
+ event->setDefaultHandled();
+}
+
+void PluginView::setParent(ScrollView* parent)
+{
+ Widget::setParent(parent);
+
+ if (parent)
+ init();
+}
+
+void PluginView::setNPWindowRect(const IntRect&)
+{
+ if (!m_isWindowed)
+ setNPWindowIfNeeded();
+}
+
+void PluginView::setNPWindowIfNeeded()
+{
+ if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
+ return;
+ if (m_isWindowed) {
+ ASSERT(platformPluginWidget());
+ platformPluginWidget()->setGeometry(m_windowRect);
+ // if setMask is set with an empty QRegion, no clipping will
+ // be performed, so in that case we hide the plugin view
+ platformPluginWidget()->setVisible(!m_clipRect.isEmpty());
+ platformPluginWidget()->setMask(QRegion(m_clipRect));
+
+ m_npWindow.x = m_windowRect.x();
+ m_npWindow.y = m_windowRect.y();
+
+ m_npWindow.clipRect.left = m_clipRect.x();
+ m_npWindow.clipRect.top = m_clipRect.y();
+ m_npWindow.clipRect.right = m_clipRect.width();
+ m_npWindow.clipRect.bottom = m_clipRect.height();
+
+ } else {
+ // always call this method before painting.
+ m_npWindow.x = 0;
+ m_npWindow.y = 0;
+
+ m_npWindow.clipRect.left = 0;
+ m_npWindow.clipRect.top = 0;
+ m_npWindow.clipRect.right = m_windowRect.width();
+ m_npWindow.clipRect.bottom = m_windowRect.height();
+ m_npWindow.window = 0;
+ }
+
+ m_npWindow.width = m_windowRect.width();
+ m_npWindow.height = m_windowRect.height();
+ if (m_npWindow.x < 0 || m_npWindow.y < 0 || m_npWindow.width <= 0 || m_npWindow.height <= 0)
+ return;
+
+ PluginView::setCurrentPluginView(this);
+ JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+ setCallingPlugin(true);
+ m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
+ setCallingPlugin(false);
+ PluginView::setCurrentPluginView(0);
+}
+
+void PluginView::setParentVisible(bool visible)
+{
+ if (isParentVisible() == visible)
+ return;
+
+ Widget::setParentVisible(visible);
+
+ if (isSelfVisible() && platformPluginWidget())
+ platformPluginWidget()->setVisible(visible);
+}
+
+NPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf)
+{
+ notImplemented();
+ return NPERR_NO_ERROR;
+}
+
+NPError PluginView::getValueStatic(NPNVariable variable, void* value)
+{
+ LOG(Plugins, "PluginView::getValueStatic(%s)", prettyNameForNPNVariable(variable).data());
+
+ switch (variable) {
+ case NPNVjavascriptEnabledBool:
+ *static_cast<NPBool*>(value) = true;
+ return NPERR_NO_ERROR;
+
+ case NPNVSupportsWindowless:
+ *static_cast<NPBool*>(value) = true;
+ return NPERR_NO_ERROR;
+
+ default:
+ return NPERR_GENERIC_ERROR;
+ }
+}
+
+NPError PluginView::getValue(NPNVariable variable, void* value)
+{
+ LOG(Plugins, "PluginView::getValue(%s)", prettyNameForNPNVariable(variable).data());
+
+ switch (variable) {
+ case NPNVWindowNPObject: {
+ if (m_isJavaScriptPaused)
+ return NPERR_GENERIC_ERROR;
+
+ NPObject* windowScriptObject = m_parentFrame->script()->windowScriptNPObject();
+
+ // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html>
+ if (windowScriptObject)
+ _NPN_RetainObject(windowScriptObject);
+
+ void** v = (void**)value;
+ *v = windowScriptObject;
+
+ return NPERR_NO_ERROR;
+ }
+
+ case NPNVPluginElementNPObject: {
+ if (m_isJavaScriptPaused)
+ return NPERR_GENERIC_ERROR;
+
+ NPObject* pluginScriptObject = 0;
+
+ if (m_element->hasTagName(appletTag) || m_element->hasTagName(embedTag) || m_element->hasTagName(objectTag))
+ pluginScriptObject = static_cast<HTMLPlugInElement*>(m_element)->getNPObject();
+
+ // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugin/npruntime.html>
+ if (pluginScriptObject)
+ _NPN_RetainObject(pluginScriptObject);
+
+ void** v = (void**)value;
+ *v = pluginScriptObject;
+
+ return NPERR_NO_ERROR;
+ }
+ default:
+ return getValueStatic(variable, value);
+ }
+}
+
+void PluginView::invalidateRect(const IntRect& rect)
+{
+ if (m_isWindowed) {
+ platformWidget()->update(rect);
+ return;
+ }
+
+ invalidateWindowlessPluginRect(rect);
+}
+
+void PluginView::invalidateRect(NPRect* rect)
+{
+ if (m_isWindowed)
+ return;
+ if (!rect) {
+ invalidate();
+ return;
+ }
+ IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
+ m_invalidRects.append(r);
+ if (!m_invalidateTimer.isActive())
+ m_invalidateTimer.startOneShot(0.001);
+}
+
+void PluginView::invalidateRegion(NPRegion region)
+{
+ if (m_isWindowed)
+ return;
+
+ if (!region)
+ return;
+
+ QVector<QRect> rects = region->rects();
+ for (int i = 0; i < rects.size(); ++i) {
+ const QRect& qRect = rects.at(i);
+ m_invalidRects.append(qRect);
+ if (!m_invalidateTimer.isActive())
+ m_invalidateTimer.startOneShot(0.001);
+ }
+}
+
+void PluginView::forceRedraw()
+{
+ if (m_isWindowed)
+ return;
+ invalidate();
+}
+
+bool PluginView::platformStart()
+{
+ ASSERT(m_isStarted);
+ ASSERT(m_status == PluginStatusLoadedSuccessfully);
+
+ show();
+
+ if (m_isWindowed) {
+ QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
+ // FIXME this will not work for QGraphicsView.
+ // But we cannot use winId because it will create a window and on S60,
+ // QWidgets should not create a window.
+ Q_ASSERT(qobject_cast<QWidget*>(client->pluginParent()));
+ setPlatformWidget(new PluginContainerSymbian(this,
+ qobject_cast<QWidget*>(client->pluginParent())));
+ m_npWindow.type = NPWindowTypeWindow;
+ m_npWindow.window = (void*)platformPluginWidget();
+
+ } else {
+ setPlatformWidget(0);
+ m_npWindow.type = NPWindowTypeDrawable;
+ m_npWindow.window = 0; // Not used?
+ }
+ setNPWindowIfNeeded();
+
+ return true;
+}
+
+void PluginView::platformDestroy()
+{
+ delete platformPluginWidget();
+}
+
+void PluginView::halt()
+{
+}
+
+void PluginView::restart()
+{
+}
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/plugins/symbian/npinterface.h b/src/3rdparty/webkit/WebCore/plugins/symbian/npinterface.h
new file mode 100644
index 0000000..0f0b6ca
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/plugins/symbian/npinterface.h
@@ -0,0 +1,37 @@
+/*
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef npinterface_H
+#define npinterface_H
+
+#include "npfunctions.h"
+#include <QtPlugin>
+
+class NPInterface {
+public:
+ virtual NPError NP_Initialize(NPNetscapeFuncs* aNPNFuncs, NPPluginFuncs* aNPPFuncs) = 0;
+ virtual void NP_Shutdown() = 0;
+ virtual char* NP_GetMIMEDescription() = 0;
+};
+
+
+QT_BEGIN_NAMESPACE
+Q_DECLARE_INTERFACE(NPInterface, "com.nokia.qts60.webplugin/1.0");
+QT_END_NAMESPACE
+
+#endif // npinterface_H
diff --git a/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp b/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
index 21ac2a4..e1bf8d6 100644
--- a/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
+++ b/src/3rdparty/webkit/WebCore/plugins/win/PluginViewWin.cpp
@@ -29,6 +29,7 @@
#include "PluginView.h"
+#include "BitmapImage.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "Element.h"
@@ -52,6 +53,7 @@
#include "PluginMessageThrottlerWin.h"
#include "PluginPackage.h"
#include "PluginMainThreadScheduler.h"
+#include "RenderWidget.h"
#include "JSDOMBinding.h"
#include "ScriptController.h"
#include "PluginDatabase.h"
@@ -75,6 +77,7 @@
#if PLATFORM(QT)
#include "QWebPageClient.h"
+#include <QWidget>
#endif
static inline HWND windowHandleForPageClient(PlatformPageClient client)
@@ -82,7 +85,7 @@ static inline HWND windowHandleForPageClient(PlatformPageClient client)
#if PLATFORM(QT)
if (!client)
return 0;
- return client->winId();
+ return client->ownerWidget()->winId();
#else
return client;
#endif
@@ -1008,8 +1011,42 @@ bool PluginView::platformStart()
void PluginView::platformDestroy()
{
- if (platformPluginWidget())
- DestroyWindow(platformPluginWidget());
+ if (!platformPluginWidget())
+ return;
+
+ DestroyWindow(platformPluginWidget());
+ setPlatformPluginWidget(0);
+}
+
+void PluginView::halt()
+{
+ ASSERT(!m_isHalted);
+ ASSERT(m_isStarted);
+
+#if !PLATFORM(QT)
+ // Show a screenshot of the plug-in.
+ OwnPtr<HBITMAP> nodeImage(m_parentFrame->nodeImage(m_element));
+ toRenderWidget(m_element->renderer())->showSubstituteImage(BitmapImage::create(nodeImage.get()));
+#endif
+
+ m_isHalted = true;
+ m_hasBeenHalted = true;
+
+ stop();
+ platformDestroy();
+}
+
+void PluginView::restart()
+{
+ ASSERT(!m_isStarted);
+ ASSERT(m_isHalted);
+
+ // Clear any substitute image.
+ toRenderWidget(m_element->renderer())->showSubstituteImage(0);
+
+ m_isHalted = false;
+ m_haveUpdatedPluginWidget = false;
+ start();
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/rendering/CounterNode.cpp b/src/3rdparty/webkit/WebCore/rendering/CounterNode.cpp
index 22a11b9..f546abb 100644
--- a/src/3rdparty/webkit/WebCore/rendering/CounterNode.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/CounterNode.cpp
@@ -63,11 +63,17 @@ void CounterNode::recount()
for (CounterNode* c = this; c; c = c->m_nextSibling) {
int oldCount = c->m_countInParent;
int newCount = c->computeCountInParent();
- c->m_countInParent = newCount;
if (oldCount == newCount)
break;
- if (c->m_renderer->isCounter())
- c->m_renderer->setNeedsLayoutAndPrefWidthsRecalc();
+ c->m_countInParent = newCount;
+ // m_renderer contains the parent of the render node
+ // corresponding to a CounterNode. Let's find the counter
+ // child and make this re-layout.
+ for (RenderObject* o = c->m_renderer->firstChild(); o; o = o->nextSibling())
+ if (!o->documentBeingDestroyed() && o->isCounter()) {
+ o->setNeedsLayoutAndPrefWidthsRecalc();
+ break;
+ }
}
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp b/src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp
index 599129b..baea956 100644
--- a/src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/InlineFlowBox.cpp
@@ -429,7 +429,7 @@ void InlineFlowBox::computeLogicalBoxHeights(int& maxPositionTop, int& maxPositi
}
lineHeight = baseline + baselineToBottom;
} else if (parentLineHeight.isPercent()) {
- lineHeight = parentLineHeight.calcMinValue(curr->renderer()->style()->fontSize());
+ lineHeight = parentLineHeight.calcMinValue(curr->renderer()->style()->fontSize(), true);
baseline = 0;
for (size_t i = 0; i < usedFonts.size(); ++i) {
int halfLeading = (lineHeight - usedFonts[i]->ascent() - usedFonts[i]->descent()) / 2;
@@ -578,28 +578,23 @@ void InlineFlowBox::computeVerticalOverflow(int lineTop, int lineBottom, bool st
topVisualOverflow = min(curr->y() + childOverflowTop, topVisualOverflow);
bottomVisualOverflow = max(curr->y() + text->height() + childOverflowBottom, bottomVisualOverflow);
- } else {
- // Only include overflow from inline flows and replaced inlines if they do not paint themselves.
- bool childIsSelfPainting = curr->boxModelObject()->hasSelfPaintingLayer();
- if (curr->renderer()->isRenderInline()) {
- InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr);
- flow->computeVerticalOverflow(lineTop, lineBottom, strictMode);
- if (!childIsSelfPainting) {
- topLayoutOverflow = min(topLayoutOverflow, flow->topLayoutOverflow());
- bottomLayoutOverflow = max(bottomLayoutOverflow, flow->bottomLayoutOverflow());
- topVisualOverflow = min(topVisualOverflow, flow->topVisualOverflow());
- bottomVisualOverflow = max(bottomVisualOverflow, flow->bottomVisualOverflow());
- }
- } else if (!childIsSelfPainting){
- RenderBox* box = toRenderBox(curr->renderer());
- int boxY = curr->y();
- int childTopOverflow = box->hasOverflowClip() ? 0 : box->topLayoutOverflow();
- int childBottomOverflow = box->hasOverflowClip() ? curr->height() : box->bottomLayoutOverflow();
- topLayoutOverflow = min(boxY + childTopOverflow, topLayoutOverflow);
- bottomLayoutOverflow = max(boxY + childBottomOverflow, bottomLayoutOverflow);
- topVisualOverflow = min(boxY + box->topVisualOverflow(), topVisualOverflow);
- bottomVisualOverflow = max(boxY + box->bottomVisualOverflow(), bottomVisualOverflow);
- }
+ } else if (curr->renderer()->isRenderInline()) {
+ InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr);
+ flow->computeVerticalOverflow(lineTop, lineBottom, strictMode);
+ topLayoutOverflow = min(topLayoutOverflow, flow->topLayoutOverflow());
+ bottomLayoutOverflow = max(bottomLayoutOverflow, flow->bottomLayoutOverflow());
+ topVisualOverflow = min(topVisualOverflow, flow->topVisualOverflow());
+ bottomVisualOverflow = max(bottomVisualOverflow, flow->bottomVisualOverflow());
+ } else if (!curr->boxModelObject()->hasSelfPaintingLayer()){
+ // Only include overflow from replaced inlines if they do not paint themselves.
+ RenderBox* box = toRenderBox(curr->renderer());
+ int boxY = curr->y();
+ int childTopOverflow = box->hasOverflowClip() ? 0 : box->topLayoutOverflow();
+ int childBottomOverflow = box->hasOverflowClip() ? curr->height() : box->bottomLayoutOverflow();
+ topLayoutOverflow = min(boxY + childTopOverflow, topLayoutOverflow);
+ bottomLayoutOverflow = max(boxY + childBottomOverflow, bottomLayoutOverflow);
+ topVisualOverflow = min(boxY + box->topVisualOverflow(), topVisualOverflow);
+ bottomVisualOverflow = max(boxY + box->bottomVisualOverflow(), bottomVisualOverflow);
}
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp b/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp
index 29e2e57..73b9a3a 100644
--- a/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.cpp
@@ -46,6 +46,16 @@ namespace WebCore {
using namespace HTMLNames;
+HTMLMediaElement* toParentMediaElement(RenderObject* o)
+{
+ Node* node = o->node();
+ Node* mediaNode = node ? node->shadowAncestorNode() : 0;
+ if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
+ return 0;
+
+ return static_cast<HTMLMediaElement*>(mediaNode);
+}
+
// FIXME: These constants may need to be tweaked to better match the seeking in the QuickTime plug-in.
static const float cSeekRepeatDelay = 0.1f;
static const float cStepTime = 0.07f;
@@ -138,7 +148,7 @@ bool MediaControlElement::rendererIsNeeded(RenderStyle* style)
ASSERT(document()->page());
return HTMLDivElement::rendererIsNeeded(style) && parent() && parent()->renderer()
- && document()->page()->theme()->shouldRenderMediaControlPart(style->appearance(), m_mediaElement);
+ && (!style->hasAppearance() || document()->page()->theme()->shouldRenderMediaControlPart(style->appearance(), m_mediaElement));
}
void MediaControlElement::attach()
@@ -366,7 +376,7 @@ bool MediaControlInputElement::rendererIsNeeded(RenderStyle* style)
ASSERT(document()->page());
return HTMLInputElement::rendererIsNeeded(style) && parent() && parent()->renderer()
- && document()->page()->theme()->shouldRenderMediaControlPart(style->appearance(), m_mediaElement);
+ && (!style->hasAppearance() || document()->page()->theme()->shouldRenderMediaControlPart(style->appearance(), m_mediaElement));
}
void MediaControlInputElement::attach()
@@ -646,12 +656,12 @@ MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(Documen
void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == eventNames().clickEvent) {
+ m_mediaElement->enterFullscreen();
event->setDefaultHandled();
}
HTMLInputElement::defaultEventHandler(event);
}
-
// ----------------------------
MediaControlTimeDisplayElement::MediaControlTimeDisplayElement(Document* document, PseudoId pseudo, HTMLMediaElement* element)
diff --git a/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h b/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h
index f692485..e562bb5 100644
--- a/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h
+++ b/src/3rdparty/webkit/WebCore/rendering/MediaControlElements.h
@@ -66,6 +66,8 @@ enum MediaControlElementType {
MediaVolumeSliderThumb
};
+HTMLMediaElement* toParentMediaElement(RenderObject*);
+
class MediaControlShadowRootElement : public HTMLDivElement {
public:
MediaControlShadowRootElement(Document*, HTMLMediaElement*);
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp
index f407099..e05c8b4 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderBR.cpp
@@ -64,7 +64,7 @@ int RenderBR::lineHeight(bool firstLine, bool /*isRootLineBox*/) const
return s->font().lineSpacing();
}
if (lh.isPercent())
- return lh.calcMinValue(s->fontSize());
+ return lh.calcMinValue(s->fontSize(), true);
return lh.value();
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp
index ae0d76d..237478d 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.cpp
@@ -774,7 +774,9 @@ void RenderBlock::layoutBlock(bool relayoutChildren)
// Repaint with our new bounds if they are different from our old bounds.
bool didFullRepaint = repainter.repaintAfterLayout();
if (!didFullRepaint && repaintTop != repaintBottom && (style()->visibility() == VISIBLE || enclosingLayer()->hasVisibleContent())) {
- IntRect repaintRect(leftVisibleOverflow(), repaintTop, rightVisibleOverflow() - leftVisibleOverflow(), repaintBottom - repaintTop);
+ int repaintLeft = min(leftVisualOverflow(), leftLayoutOverflow());
+ int repaintRight = max(rightVisualOverflow(), rightLayoutOverflow());
+ IntRect repaintRect(repaintLeft, repaintTop, repaintRight - repaintLeft, repaintBottom - repaintTop);
// FIXME: Deal with multiple column repainting. We have to split the repaint
// rect up into multiple rects if it spans columns.
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp
index c8d3037..1df82a4 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp
@@ -139,6 +139,8 @@ void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle* newStyl
markContainingBlocksForLayout();
if (style()->position() == StaticPosition)
repaint();
+ else if (newStyle->position() == AbsolutePosition || newStyle->position() == FixedPosition)
+ parent()->setChildNeedsLayout(true);
if (isFloating() && !isPositioned() && (newStyle->position() == AbsolutePosition || newStyle->position() == FixedPosition))
removeFloatingOrPositionedChildFromBlockLists();
}
@@ -961,10 +963,10 @@ void RenderBox::mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool
transformState.move(containerOffset.width(), containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
if (containerSkipped) {
- // There can't be a transfrom between repaintContainer and o, because transforms create containers, so it should be safe
+ // There can't be a transform between repaintContainer and o, because transforms create containers, so it should be safe
// to just subtract the delta between the repaintContainer and o.
- IntSize repaintContainerOffset = repaintContainer->offsetFromContainer(o);
- transformState.move(-repaintContainerOffset.width(), -repaintContainerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
+ IntSize containerOffset = repaintContainer->offsetFromAncestorContainer(o);
+ transformState.move(-containerOffset.width(), -containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
return;
}
@@ -1201,7 +1203,7 @@ void RenderBox::computeRectForRepaint(RenderBoxModelObject* repaintContainer, In
if (containerSkipped) {
// If the repaintContainer is below o, then we need to map the rect into repaintContainer's coordinates.
- IntSize containerOffset = repaintContainer->offsetFromContainer(o);
+ IntSize containerOffset = repaintContainer->offsetFromAncestorContainer(o);
rect.move(-containerOffset);
return;
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp
index 67e5cba..17c6dad 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderCounter.cpp
@@ -143,13 +143,19 @@ static bool findPlaceForCounter(RenderObject* object, const AtomicString& counte
RenderObject* resetCandidate = isReset ? object->parent() : previousSiblingOrParent(object);
RenderObject* prevCounterCandidate = object;
CounterNode* candidateCounter = 0;
+ // When a reset counter is chosen as candidateCounter, we'll
+ // decide the new node should be a child of the reset node or a
+ // sibling or the reset node. This flag controls it.
+ bool createChildForReset = true;
while ((prevCounterCandidate = prevCounterCandidate->previousInPreOrder())) {
CounterNode* c = counter(prevCounterCandidate, counterName, false);
if (prevCounterCandidate == resetCandidate) {
- if (!candidateCounter)
+ if (!candidateCounter) {
candidateCounter = c;
+ createChildForReset = true;
+ }
if (candidateCounter) {
- if (candidateCounter->isReset()) {
+ if (createChildForReset && candidateCounter->isReset()) {
parent = candidateCounter;
previousSibling = 0;
} else {
@@ -160,10 +166,19 @@ static bool findPlaceForCounter(RenderObject* object, const AtomicString& counte
}
resetCandidate = previousSiblingOrParent(resetCandidate);
} else if (c) {
- if (c->isReset())
- candidateCounter = 0;
- else if (!candidateCounter)
+ if (c->isReset()) {
+ if (c->parent()) {
+ // The new node may be the next sibling of this reset node.
+ createChildForReset = false;
+ candidateCounter = c;
+ } else {
+ createChildForReset = true;
+ candidateCounter = 0;
+ }
+ } else if (!candidateCounter) {
+ createChildForReset = true;
candidateCounter = c;
+ }
}
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp
index 51c3073..4206b1c 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderImage.cpp
@@ -227,7 +227,7 @@ bool RenderImage::setImageSizeForAltText(CachedImage* newImage /* = 0 */)
imageHeight = paddingHeight;
}
- if (newImage) {
+ if (newImage && newImage->image()) {
// imageSize() returns 0 for the error image. We need the true size of the
// error image, so we have to get it by grabbing image() directly.
imageWidth += newImage->image()->width() * style()->effectiveZoom();
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp
index a5e973e..05d29d0 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderInline.cpp
@@ -697,7 +697,7 @@ void RenderInline::computeRectForRepaint(RenderBoxModelObject* repaintContainer,
if (containerSkipped) {
// If the repaintContainer is below o, then we need to map the rect into repaintContainer's coordinates.
- IntSize containerOffset = repaintContainer->offsetFromContainer(o);
+ IntSize containerOffset = repaintContainer->offsetFromAncestorContainer(o);
rect.move(-containerOffset);
return;
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp
index 95db43a..fea61c9 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp
@@ -311,12 +311,19 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
if (m_reflection)
m_reflection->layout();
+#if USE(ACCELERATED_COMPOSITING)
+ // Clear the IsCompositingUpdateRoot flag once we've found the first compositing layer in this update.
+ bool isUpdateRoot = (flags & IsCompositingUpdateRoot);
+ if (isComposited())
+ flags &= ~IsCompositingUpdateRoot;
+#endif
+
for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
child->updateLayerPositions(flags);
#if USE(ACCELERATED_COMPOSITING)
if ((flags & UpdateCompositingLayers) && isComposited())
- backing()->updateAfterLayout(RenderLayerBacking::CompositingChildren);
+ backing()->updateAfterLayout(RenderLayerBacking::CompositingChildren, isUpdateRoot);
#endif
// With all our children positioned, now update our marquee if we need to.
@@ -662,21 +669,20 @@ RenderLayer* RenderLayer::enclosingTransformedAncestor() const
return curr;
}
+static inline const RenderLayer* compositingContainer(const RenderLayer* layer)
+{
+ return layer->isNormalFlowOnly() ? layer->parent() : layer->stackingContext();
+}
+
#if USE(ACCELERATED_COMPOSITING)
RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const
{
if (includeSelf && isComposited())
return const_cast<RenderLayer*>(this);
- // Compositing layers are parented according to stacking order and overflow list,
- // so we have to check whether the parent is a stacking context, or whether
- // the child is overflow-only.
- bool inNormalFlowList = isNormalFlowOnly();
- for (RenderLayer* curr = parent(); curr; curr = curr->parent()) {
- if (curr->isComposited() && (inNormalFlowList || curr->isStackingContext()))
- return curr;
-
- inNormalFlowList = curr->isNormalFlowOnly();
+ for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) {
+ if (curr->isComposited())
+ return const_cast<RenderLayer*>(curr);
}
return 0;
@@ -1140,8 +1146,10 @@ void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repai
#if USE(ACCELERATED_COMPOSITING)
if (compositor()->inCompositingMode()) {
- if (RenderLayer* compositingAncestor = ancestorCompositingLayer())
- compositingAncestor->backing()->updateAfterLayout(RenderLayerBacking::AllDescendants);
+ if (RenderLayer* compositingAncestor = ancestorCompositingLayer()) {
+ bool isUpdateRoot = true;
+ compositingAncestor->backing()->updateAfterLayout(RenderLayerBacking::AllDescendants, isUpdateRoot);
+ }
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h
index 9d2212b..a274638 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayer.h
@@ -298,10 +298,11 @@ public:
enum UpdateLayerPositionsFlag {
DoFullRepaint = 1,
CheckForRepaint = 1 << 1,
- UpdateCompositingLayers = 1 << 2,
+ IsCompositingUpdateRoot = 1 << 2,
+ UpdateCompositingLayers = 1 << 3,
};
typedef unsigned UpdateLayerPositionsFlags;
- void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | UpdateCompositingLayers);
+ void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers);
void updateTransform();
@@ -327,6 +328,7 @@ public:
Vector<RenderLayer*>* normalFlowList() const { return m_normalFlowList; }
bool hasVisibleContent() const { return m_hasVisibleContent; }
+ bool hasVisibleDescendant() const { return m_hasVisibleDescendant; }
void setHasVisibleContent(bool);
void dirtyVisibleContentStatus();
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp
index 941817c..d7248d4 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.cpp
@@ -89,8 +89,8 @@ void RenderLayerBacking::createGraphicsLayer()
m_graphicsLayer->setName("Anonymous Node");
#endif // NDEBUG
- updateLayerOpacity();
- updateLayerTransform();
+ updateLayerOpacity(renderer()->style());
+ updateLayerTransform(renderer()->style());
}
void RenderLayerBacking::destroyGraphicsLayer()
@@ -104,15 +104,13 @@ void RenderLayerBacking::destroyGraphicsLayer()
m_maskLayer = 0;
}
-void RenderLayerBacking::updateLayerOpacity()
+void RenderLayerBacking::updateLayerOpacity(const RenderStyle* style)
{
- m_graphicsLayer->setOpacity(compositingOpacity(renderer()->opacity()));
+ m_graphicsLayer->setOpacity(compositingOpacity(style->opacity()));
}
-void RenderLayerBacking::updateLayerTransform()
+void RenderLayerBacking::updateLayerTransform(const RenderStyle* style)
{
- RenderStyle* style = renderer()->style();
-
// FIXME: This could use m_owningLayer->transform(), but that currently has transform-origin
// baked into it, and we don't want that.
TransformationMatrix t;
@@ -148,7 +146,7 @@ void RenderLayerBacking::updateCompositedBounds()
setCompositedBounds(layerBounds);
}
-void RenderLayerBacking::updateAfterLayout(UpdateDepth updateDepth)
+void RenderLayerBacking::updateAfterLayout(UpdateDepth updateDepth, bool isUpdateRoot)
{
RenderLayerCompositor* layerCompositor = compositor();
if (!layerCompositor->compositingLayersNeedRebuild()) {
@@ -162,7 +160,7 @@ void RenderLayerBacking::updateAfterLayout(UpdateDepth updateDepth)
updateCompositedBounds();
layerCompositor->updateCompositingDescendantGeometry(m_owningLayer, m_owningLayer, updateDepth);
- if (!m_owningLayer->parent()) {
+ if (isUpdateRoot) {
updateGraphicsLayerGeometry();
layerCompositor->updateRootLayerPosition();
}
@@ -219,11 +217,11 @@ void RenderLayerBacking::updateGraphicsLayerGeometry()
// Set transform property, if it is not animating. We have to do this here because the transform
// is affected by the layer dimensions.
if (!renderer()->animation()->isAnimatingPropertyOnRenderer(renderer(), CSSPropertyWebkitTransform))
- updateLayerTransform();
+ updateLayerTransform(renderer()->style());
// Set opacity, if it is not animating.
if (!renderer()->animation()->isAnimatingPropertyOnRenderer(renderer(), CSSPropertyOpacity))
- updateLayerOpacity();
+ updateLayerOpacity(renderer()->style());
RenderStyle* style = renderer()->style();
m_graphicsLayer->setPreserves3D(style->transformStyle3D() == TransformStyle3DPreserve3D);
@@ -886,7 +884,7 @@ void RenderLayerBacking::paintIntoLayer(RenderLayer* rootLayer, GraphicsContext*
if (paintingRoot && !renderer()->isDescendantOf(paintingRoot))
paintingRootForRenderer = paintingRoot;
- bool shouldPaint = m_owningLayer->hasVisibleContent() && m_owningLayer->isSelfPaintingLayer();
+ bool shouldPaint = (m_owningLayer->hasVisibleContent() || m_owningLayer->hasVisibleDescendant()) && m_owningLayer->isSelfPaintingLayer();
if (shouldPaint && (paintingPhase & GraphicsLayerPaintBackground)) {
// If this is the root then we need to send in a bigger bounding box
@@ -1082,8 +1080,11 @@ bool RenderLayerBacking::startTransition(double beginTime, int property, const R
opacityVector.insert(new FloatAnimationValue(0, compositingOpacity(fromStyle->opacity())));
opacityVector.insert(new FloatAnimationValue(1, compositingOpacity(toStyle->opacity())));
// The boxSize param is only used for transform animations (which can only run on RenderBoxes), so we pass an empty size here.
- if (m_graphicsLayer->addAnimation(opacityVector, IntSize(), opacityAnim, String(), beginTime))
+ if (m_graphicsLayer->addAnimation(opacityVector, IntSize(), opacityAnim, String(), beginTime)) {
+ // To ensure that the correct opacity is visible when the animation ends, also set the final opacity.
+ updateLayerOpacity(toStyle);
didAnimate = true;
+ }
}
}
@@ -1093,8 +1094,11 @@ bool RenderLayerBacking::startTransition(double beginTime, int property, const R
KeyframeValueList transformVector(AnimatedPropertyWebkitTransform);
transformVector.insert(new TransformAnimationValue(0, &fromStyle->transform()));
transformVector.insert(new TransformAnimationValue(1, &toStyle->transform()));
- if (m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->borderBoxRect().size(), transformAnim, String(), beginTime))
+ if (m_graphicsLayer->addAnimation(transformVector, toRenderBox(renderer())->borderBoxRect().size(), transformAnim, String(), beginTime)) {
+ // To ensure that the correct transform is visible when the animation ends, also set the final opacity.
+ updateLayerTransform(toStyle);
didAnimate = true;
+ }
}
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h b/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h
index e12aa58..17bcaf7 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayerBacking.h
@@ -54,7 +54,7 @@ public:
RenderLayer* owningLayer() const { return m_owningLayer; }
enum UpdateDepth { CompositingChildren, AllDescendants };
- void updateAfterLayout(UpdateDepth);
+ void updateAfterLayout(UpdateDepth, bool isUpdateRoot);
// Returns true if layer configuration changed.
bool updateGraphicsLayerConfiguration();
@@ -140,8 +140,8 @@ private:
// Result is perspective origin in pixels.
FloatPoint computePerspectiveOrigin(const IntRect& borderBox) const;
- void updateLayerOpacity();
- void updateLayerTransform();
+ void updateLayerOpacity(const RenderStyle*);
+ void updateLayerTransform(const RenderStyle*);
// Return the opacity value that this layer should use for compositing.
float compositingOpacity(float rendererOpacity) const;
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp
index bcd1f08..5201287 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderLayerCompositor.cpp
@@ -535,6 +535,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
void RenderLayerCompositor::setCompositingParent(RenderLayer* childLayer, RenderLayer* parentLayer)
{
+ ASSERT(!parentLayer || childLayer->ancestorCompositingLayer() == parentLayer);
ASSERT(childLayer->isComposited());
// It's possible to be called with a parent that isn't yet composited when we're doing
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp
index f94f7ce..0edfdef 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderListBox.cpp
@@ -508,7 +508,7 @@ bool RenderListBox::listIndexIsVisible(int index)
return index >= m_indexOffset && index < m_indexOffset + numVisibleItems();
}
-bool RenderListBox::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
+bool RenderListBox::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier, Node**)
{
return m_vBar && m_vBar->scroll(direction, granularity, multiplier);
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderListBox.h b/src/3rdparty/webkit/WebCore/rendering/RenderListBox.h
index e5454e5..aafb87e 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderListBox.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderListBox.h
@@ -68,7 +68,7 @@ private:
virtual bool isPointInOverflowControl(HitTestResult&, int x, int y, int tx, int ty);
- virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
+ virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f, Node** stopNode = 0);
virtual void calcPrefWidths();
virtual int baselinePosition(bool firstLine, bool isRootLineBox) const;
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp
index 0ce0642..9cc1493 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControls.cpp
@@ -37,7 +37,7 @@ using namespace std;
namespace WebCore {
-#if !defined(NDEBUG) && defined(USE_DEBUG_SAFARI_THEME)
+#ifdef DEBUG_ALL
SOFT_LINK_DEBUG_LIBRARY(SafariTheme)
#else
SOFT_LINK_LIBRARY(SafariTheme)
@@ -82,16 +82,6 @@ void RenderMediaControls::adjustMediaSliderThumbSize(RenderObject* o)
o->style()->setHeight(Length(static_cast<int>(mediaSliderThumbHeight * zoomLevel), Fixed));
}
-static HTMLMediaElement* parentMediaElement(RenderObject* o)
-{
- Node* node = o->node();
- Node* mediaNode = node ? node->shadowAncestorNode() : 0;
- if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
- return 0;
-
- return static_cast<HTMLMediaElement*>(mediaNode);
-}
-
bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
{
ASSERT(SafariThemeLibrary());
@@ -121,7 +111,7 @@ bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, R
paintThemePart(SafariTheme::MediaSeekForwardButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaSlider: {
- if (HTMLMediaElement* mediaElement = parentMediaElement(o))
+ if (HTMLMediaElement* mediaElement = toParentMediaElement(o))
STPaintProgressIndicator(SafariTheme::MediaType, paintInfo.context->platformContext(), r, NSRegularControlSize, 0, mediaElement->percentLoaded());
break;
}
@@ -159,4 +149,3 @@ bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, R
#endif // #if ENABLE(VIDEO)
} // namespace WebCore
-
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.cpp
new file mode 100644
index 0000000..ed20ecf
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.cpp
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2009 Apple Inc.
+ * Copyright (C) 2009 Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RenderMediaControlsChromium.h"
+
+#include "Gradient.h"
+#include "GraphicsContext.h"
+#include "HTMLMediaElement.h"
+#include "HTMLNames.h"
+
+namespace WebCore {
+
+#if ENABLE(VIDEO)
+
+typedef WTF::HashMap<const char*, Image*> MediaControlImageMap;
+static MediaControlImageMap* gMediaControlImageMap = 0;
+
+static Image* platformResource(const char* name)
+{
+ if (!gMediaControlImageMap)
+ gMediaControlImageMap = new MediaControlImageMap();
+ if (Image* image = gMediaControlImageMap->get(name))
+ return image;
+ if (Image* image = Image::loadPlatformResource(name).releaseRef()) {
+ gMediaControlImageMap->set(name, image);
+ return image;
+ }
+ ASSERT_NOT_REACHED();
+ return 0;
+}
+
+static bool paintMediaButton(GraphicsContext* context, const IntRect& rect, Image* image)
+{
+ IntRect imageRect = image->rect();
+ context->drawImage(image, rect);
+ return true;
+}
+
+static bool paintMediaMuteButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ static Image* soundFull = platformResource("mediaSoundFull");
+ static Image* soundNone = platformResource("mediaSoundNone");
+ static Image* soundDisabled = platformResource("mediaSoundDisabled");
+
+ if (mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE || !mediaElement->hasAudio())
+ return paintMediaButton(paintInfo.context, rect, soundDisabled);
+
+ return paintMediaButton(paintInfo.context, rect, mediaElement->muted() ? soundNone: soundFull);
+}
+
+static bool paintMediaPlayButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ static Image* mediaPlay = platformResource("mediaPlay");
+ static Image* mediaPause = platformResource("mediaPause");
+ static Image* mediaPlayDisabled = platformResource("mediaPlayDisabled");
+
+ if (mediaElement->networkState() == HTMLMediaElement::NETWORK_EMPTY ||
+ mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE)
+ return paintMediaButton(paintInfo.context, rect, mediaPlayDisabled);
+
+ return paintMediaButton(paintInfo.context, rect, mediaElement->paused() ? mediaPlay : mediaPause);
+}
+
+static bool paintMediaSlider(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ RenderStyle* style = object->style();
+ GraphicsContext* context = paintInfo.context;
+
+ // Draw the border of the time bar.
+ // FIXME: this should be a rounded rect but need to fix GraphicsContextSkia first.
+ // https://bugs.webkit.org/show_bug.cgi?id=30143
+ context->save();
+ context->setShouldAntialias(true);
+ context->setStrokeStyle(SolidStroke);
+ context->setStrokeColor(style->borderLeftColor());
+ context->setStrokeThickness(style->borderLeftWidth());
+ context->setFillColor(style->backgroundColor());
+ context->drawRect(rect);
+ context->restore();
+
+ // Draw the buffered ranges.
+ // FIXME: Draw multiple ranges if there are multiple buffered ranges.
+ IntRect bufferedRect = rect;
+ bufferedRect.inflate(-style->borderLeftWidth());
+ bufferedRect.setWidth((bufferedRect.width() * mediaElement->percentLoaded()));
+
+ // Don't bother drawing an empty area.
+ if (!bufferedRect.isEmpty()) {
+ IntPoint sliderTopLeft = bufferedRect.location();
+ IntPoint sliderTopRight = sliderTopLeft;
+ sliderTopRight.move(0, bufferedRect.height());
+
+ RefPtr<Gradient> gradient = Gradient::create(sliderTopLeft, sliderTopRight);
+ Color startColor = object->style()->color();
+ gradient->addColorStop(0.0, startColor);
+ gradient->addColorStop(1.0, Color(startColor.red() / 2, startColor.green() / 2, startColor.blue() / 2, startColor.alpha()));
+
+ context->save();
+ context->setStrokeStyle(NoStroke);
+ context->setFillGradient(gradient);
+ context->fillRect(bufferedRect);
+ context->restore();
+ }
+
+ return true;
+}
+
+static bool paintMediaSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ if (!object->parent()->isSlider())
+ return false;
+
+ static Image* mediaSliderThumb = platformResource("mediaSliderThumb");
+ return paintMediaButton(paintInfo.context, rect, mediaSliderThumb);
+}
+
+static bool paintMediaVolumeSlider(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ GraphicsContext* context = paintInfo.context;
+ Color originalColor = context->strokeColor();
+ if (originalColor != Color::white)
+ context->setStrokeColor(Color::white);
+
+ int x = rect.x() + rect.width() / 2;
+ context->drawLine(IntPoint(x, rect.y()), IntPoint(x, rect.y() + rect.height()));
+
+ if (originalColor != Color::white)
+ context->setStrokeColor(originalColor);
+ return true;
+}
+
+static bool paintMediaVolumeSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ if (!object->parent()->isSlider())
+ return false;
+
+ static Image* mediaVolumeSliderThumb = platformResource("mediaVolumeSliderThumb");
+ return paintMediaButton(paintInfo.context, rect, mediaVolumeSliderThumb);
+}
+
+static bool paintMediaTimelineContainer(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ HTMLMediaElement* mediaElement = toParentMediaElement(object);
+ if (!mediaElement)
+ return false;
+
+ if (!rect.isEmpty()) {
+ GraphicsContext* context = paintInfo.context;
+ Color originalColor = context->strokeColor();
+ float originalThickness = context->strokeThickness();
+ StrokeStyle originalStyle = context->strokeStyle();
+
+ context->setStrokeStyle(SolidStroke);
+
+ // Draw the left border using CSS defined width and color.
+ context->setStrokeThickness(object->style()->borderLeftWidth());
+ context->setStrokeColor(object->style()->borderLeftColor().rgb());
+ context->drawLine(IntPoint(rect.x() + 1, rect.y()),
+ IntPoint(rect.x() + 1, rect.y() + rect.height()));
+
+ // Draw the right border using CSS defined width and color.
+ context->setStrokeThickness(object->style()->borderRightWidth());
+ context->setStrokeColor(object->style()->borderRightColor().rgb());
+ context->drawLine(IntPoint(rect.x() + rect.width() - 1, rect.y()),
+ IntPoint(rect.x() + rect.width() - 1, rect.y() + rect.height()));
+
+ context->setStrokeColor(originalColor);
+ context->setStrokeThickness(originalThickness);
+ context->setStrokeStyle(originalStyle);
+ }
+ return true;
+}
+
+bool RenderMediaControlsChromium::shouldRenderMediaControlPart(ControlPart part, Element* e)
+{
+ UNUSED_PARAM(e);
+
+ switch (part) {
+ case MediaMuteButtonPart:
+ case MediaPlayButtonPart:
+ case MediaSliderPart:
+ case MediaSliderThumbPart:
+ case MediaVolumeSliderContainerPart:
+ case MediaVolumeSliderPart:
+ case MediaVolumeSliderThumbPart:
+ case MediaControlsBackgroundPart:
+ case MediaCurrentTimePart:
+ case MediaTimeRemainingPart:
+ return true;
+ }
+ return false;
+}
+
+bool RenderMediaControlsChromium::paintMediaControlsPart(MediaControlElementType part, RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
+{
+ switch (part) {
+ case MediaMuteButton:
+ case MediaUnMuteButton:
+ return paintMediaMuteButton(object, paintInfo, rect);
+ case MediaPauseButton:
+ case MediaPlayButton:
+ return paintMediaPlayButton(object, paintInfo, rect);
+ case MediaSlider:
+ return paintMediaSlider(object, paintInfo, rect);
+ case MediaSliderThumb:
+ return paintMediaSliderThumb(object, paintInfo, rect);
+ case MediaVolumeSlider:
+ return paintMediaVolumeSlider(object, paintInfo, rect);
+ case MediaVolumeSliderThumb:
+ return paintMediaVolumeSliderThumb(object, paintInfo, rect);
+ case MediaTimelineContainer:
+ return paintMediaTimelineContainer(object, paintInfo, rect);
+ case MediaFullscreenButton:
+ case MediaSeekBackButton:
+ case MediaSeekForwardButton:
+ case MediaVolumeSliderContainer:
+ case MediaCurrentTimeDisplay:
+ case MediaTimeRemainingDisplay:
+ case MediaControlsPanel:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ return false;
+}
+
+void RenderMediaControlsChromium::adjustMediaSliderThumbSize(RenderObject* object)
+{
+ static Image* mediaSliderThumb = platformResource("mediaSliderThumb");
+ static Image* mediaVolumeSliderThumb = platformResource("mediaVolumeSliderThumb");
+
+ Image* thumbImage = 0;
+ if (object->style()->appearance() == MediaSliderThumbPart)
+ thumbImage = mediaSliderThumb;
+ else if (object->style()->appearance() == MediaVolumeSliderThumbPart)
+ thumbImage = mediaVolumeSliderThumb;
+
+ float zoomLevel = object->style()->effectiveZoom();
+ if (thumbImage) {
+ object->style()->setWidth(Length(static_cast<int>(thumbImage->width() * zoomLevel), Fixed));
+ object->style()->setHeight(Length(static_cast<int>(thumbImage->height() * zoomLevel), Fixed));
+ }
+}
+
+#endif // #if ENABLE(VIDEO)
+
+} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.h b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.h
new file mode 100644
index 0000000..d6d986c
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderMediaControlsChromium.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2009 Apple Inc.
+ * Copyright (C) 2009 Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RenderMediaControlsChromium_h
+#define RenderMediaControlsChromium_h
+
+#include "RenderObject.h"
+#include "MediaControlElements.h"
+
+namespace WebCore {
+
+class HTMLMediaElement;
+class RenderMediaControlsChromium {
+public:
+ static bool shouldRenderMediaControlPart(ControlPart, Element*);
+ static bool paintMediaControlsPart(MediaControlElementType, RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
+ static void adjustMediaSliderThumbSize(RenderObject*);
+};
+
+} // namespace WebCore
+
+#endif // RenderMediaControlsChromium_h
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp
index b7f59e1..a10ffd9 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp
@@ -1568,7 +1568,7 @@ void RenderObject::styleWillChange(StyleDifference diff, const RenderStyle* newS
// For changes in float styles, we need to conceivably remove ourselves
// from the floating objects list.
toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists();
- else if (isPositioned() && (newStyle->position() != AbsolutePosition && newStyle->position() != FixedPosition))
+ else if (isPositioned() && (m_style->position() != newStyle->position()))
// For changes in positioning styles, we need to conceivably remove ourselves
// from the positioned objects list.
toRenderBox(this)->removeFloatingOrPositionedChildFromBlockLists();
@@ -1755,6 +1755,23 @@ IntSize RenderObject::offsetFromContainer(RenderObject* o) const
return offset;
}
+IntSize RenderObject::offsetFromAncestorContainer(RenderObject* container) const
+{
+ IntSize offset;
+ const RenderObject* currContainer = this;
+ do {
+ RenderObject* nextContainer = currContainer->container();
+ ASSERT(nextContainer); // This means we reached the top without finding container.
+ if (!nextContainer)
+ break;
+ ASSERT(!currContainer->hasTransform());
+ offset += currContainer->offsetFromContainer(nextContainer);
+ currContainer = nextContainer;
+ } while (currContainer != container);
+
+ return offset;
+}
+
IntRect RenderObject::localCaretRect(InlineBox*, int, int* extraWidthToEndOfLine)
{
if (extraWidthToEndOfLine)
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderObject.h b/src/3rdparty/webkit/WebCore/rendering/RenderObject.h
index 367eaa6..e358c98 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderObject.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderObject.h
@@ -541,6 +541,8 @@ public:
// Return the offset from the container() renderer (excluding transforms)
virtual IntSize offsetFromContainer(RenderObject*) const;
+ // Return the offset from an object up the container() chain. Asserts that none of the intermediate objects have transforms.
+ IntSize offsetFromAncestorContainer(RenderObject*) const;
virtual void absoluteRects(Vector<IntRect>&, int, int) { }
// FIXME: useTransforms should go away eventually
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp
index 199c0da..e2c8e7d 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderPartObject.cpp
@@ -249,7 +249,8 @@ void RenderPartObject::updateWidget(bool onlyCreateNonNetscapePlugins)
return;
}
- bool success = frame->loader()->requestObject(this, url, o->getAttribute(nameAttr), serviceType, paramNames, paramValues);
+ bool success = o->dispatchBeforeLoadEvent(url) &&
+ frame->loader()->requestObject(this, url, o->getAttribute(nameAttr), serviceType, paramNames, paramValues);
if (!success && m_hasFallbackContent)
o->renderFallbackContent();
} else if (node()->hasTagName(embedTag)) {
@@ -283,7 +284,8 @@ void RenderPartObject::updateWidget(bool onlyCreateNonNetscapePlugins)
}
- frame->loader()->requestObject(this, url, o->getAttribute(nameAttr), serviceType, paramNames, paramValues);
+ if (o->dispatchBeforeLoadEvent(url))
+ frame->loader()->requestObject(this, url, o->getAttribute(nameAttr), serviceType, paramNames, paramValues);
}
#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
else if (node()->hasTagName(videoTag) || node()->hasTagName(audioTag)) {
@@ -306,7 +308,9 @@ void RenderPartObject::updateWidget(bool onlyCreateNonNetscapePlugins)
}
serviceType = "application/x-media-element-proxy-plugin";
- frame->loader()->requestObject(this, url, nullAtom, serviceType, paramNames, paramValues);
+
+ if (o->dispatchBeforeLoadEvent(url))
+ frame->loader()->requestObject(this, url, nullAtom, serviceType, paramNames, paramValues);
}
#endif
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp
index 247acda..442af39 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderSlider.cpp
@@ -50,7 +50,7 @@ static const int defaultTrackLength = 129;
struct SliderRange {
bool isIntegral;
double minimum;
- double maximum;
+ double maximum; // maximum must be >= minimum.
explicit SliderRange(HTMLInputElement*);
double clampValue(double value);
@@ -80,12 +80,8 @@ SliderRange::SliderRange(HTMLInputElement* element)
isIntegral = !equalIgnoringCase(element->getAttribute(precisionAttr), "float");
- // FIXME: This treats maximum strings that can't be parsed as 0, but perhaps 100 would be more appropriate.
- const AtomicString& maxString = element->getAttribute(maxAttr);
- maximum = maxString.isNull() ? 100.0 : maxString.toDouble();
-
- // If the maximum is smaller, use it as the minimum.
- minimum = min(element->getAttribute(minAttr).toDouble(), maximum);
+ maximum = element->rangeMaximum();
+ minimum = element->rangeMinimum();
}
double SliderRange::clampValue(double value)
@@ -96,12 +92,14 @@ double SliderRange::clampValue(double value)
double SliderRange::valueFromElement(HTMLInputElement* element, bool* wasClamped)
{
- String valueString = element->value();
- double oldValue = valueString.isNull() ? (minimum + maximum) / 2 : valueString.toDouble();
+ double oldValue;
+ bool parseSuccess = HTMLInputElement::formStringToDouble(element->value(), &oldValue);
+ if (!parseSuccess)
+ oldValue = (minimum + maximum) / 2;
double newValue = clampValue(oldValue);
if (wasClamped)
- *wasClamped = valueString.isNull() || newValue != oldValue;
+ *wasClamped = !parseSuccess || newValue != oldValue;
return newValue;
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp
index 8478432..a49e092 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlMultiLine.cpp
@@ -45,7 +45,9 @@ RenderTextControlMultiLine::~RenderTextControlMultiLine()
void RenderTextControlMultiLine::subtreeHasChanged()
{
RenderTextControl::subtreeHasChanged();
- static_cast<Element*>(node())->setFormControlValueMatchesRenderer(false);
+ HTMLTextAreaElement* textArea = static_cast<HTMLTextAreaElement*>(node());
+ textArea->setFormControlValueMatchesRenderer(false);
+ textArea->updateValidity();
if (!node()->focused())
return;
@@ -53,7 +55,7 @@ void RenderTextControlMultiLine::subtreeHasChanged()
node()->dispatchEvent(Event::create(eventNames().inputEvent, true, false));
if (Frame* frame = document()->frame())
- frame->textDidChangeInTextArea(static_cast<Element*>(node()));
+ frame->textDidChangeInTextArea(textArea);
}
bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty, HitTestAction hitTestAction)
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp
index 8d8ba97..be800a7 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.cpp
@@ -808,12 +808,12 @@ void RenderTextControlSingleLine::setScrollTop(int newTop)
innerTextElement()->setScrollTop(newTop);
}
-bool RenderTextControlSingleLine::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier)
+bool RenderTextControlSingleLine::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier, Node** stopNode)
{
RenderLayer* layer = innerTextElement()->renderBox()->layer();
if (layer && layer->scroll(direction, granularity, multiplier))
return true;
- return RenderBlock::scroll(direction, granularity, multiplier);
+ return RenderBlock::scroll(direction, granularity, multiplier, stopNode);
}
PassRefPtr<Scrollbar> RenderTextControlSingleLine::createScrollbar(ScrollbarClient* client, ScrollbarOrientation orientation, ScrollbarControlSize controlSize)
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h
index 4a17918..e30ff0d 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderTextControlSingleLine.h
@@ -72,7 +72,7 @@ private:
virtual int scrollHeight() const;
virtual void setScrollLeft(int);
virtual void setScrollTop(int);
- virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
+ virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f, Node** stopNode = 0);
int textBlockWidth() const;
virtual int preferredContentWidth(float charWidth) const;
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp
index b5826cd..5ee01e4 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderTheme.cpp
@@ -85,6 +85,7 @@ void RenderTheme::adjustStyle(CSSStyleSelector* selector, RenderStyle* style, El
#if USE(NEW_THEME)
switch (part) {
+ case ListButtonPart:
case CheckboxPart:
case RadioPart:
case PushButtonPart:
@@ -171,6 +172,7 @@ void RenderTheme::adjustStyle(CSSStyleSelector* selector, RenderStyle* style, El
return adjustRadioStyle(selector, style, e);
case PushButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
case DefaultButtonPart:
case ButtonPart:
return adjustButtonStyle(selector, style, e);
@@ -227,6 +229,7 @@ bool RenderTheme::paint(RenderObject* o, const RenderObject::PaintInfo& paintInf
case RadioPart:
case PushButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
case DefaultButtonPart:
case ButtonPart:
m_theme->paint(part, controlStatesForRenderer(o), const_cast<GraphicsContext*>(paintInfo.context), r, o->style()->effectiveZoom(), o->view()->frameView());
@@ -245,6 +248,7 @@ bool RenderTheme::paint(RenderObject* o, const RenderObject::PaintInfo& paintInf
return paintRadio(o, paintInfo, r);
case PushButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
case DefaultButtonPart:
case ButtonPart:
return paintButton(o, paintInfo, r);
@@ -335,6 +339,7 @@ bool RenderTheme::paintBorderOnly(RenderObject* o, const RenderObject::PaintInfo
case RadioPart:
case PushButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
case DefaultButtonPart:
case ButtonPart:
case MenulistPart:
@@ -369,6 +374,7 @@ bool RenderTheme::paintDecorations(RenderObject* o, const RenderObject::PaintInf
case RadioPart:
case PushButtonPart:
case SquareButtonPart:
+ case ListButtonPart:
case DefaultButtonPart:
case ButtonPart:
case MenulistPart:
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h
index 9f412a0..61b5e8f 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.h
@@ -121,6 +121,7 @@ protected:
virtual bool paintSearchFieldResultsButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
#if ENABLE(VIDEO)
+ virtual bool shouldRenderMediaControlPart(ControlPart, Element*);
virtual bool paintMediaPlayButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaMuteButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&);
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm
index 695f9fa..bcfcd57 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumMac.mm
@@ -29,7 +29,6 @@
#import "Document.h"
#import "Element.h"
#import "FrameView.h"
-#import "Gradient.h"
#import "GraphicsContext.h"
#import "HTMLInputElement.h"
#import "HTMLMediaElement.h"
@@ -38,6 +37,7 @@
#import "LocalCurrentGraphicsContext.h"
#import "MediaControlElements.h"
#import "RenderMedia.h"
+#import "RenderMediaControlsChromium.h"
#import "RenderSlider.h"
#import "RenderView.h"
#import "SharedBuffer.h"
@@ -1251,20 +1251,6 @@ bool RenderThemeChromiumMac::paintSliderThumb(RenderObject* o, const RenderObjec
return false;
}
-#if ENABLE(VIDEO)
-static Image* mediaSliderThumbImage()
-{
- static Image* mediaSliderThumb = Image::loadPlatformResource("mediaSliderThumb").releaseRef();
- return mediaSliderThumb;
-}
-
-static Image* mediaVolumeSliderThumbImage()
-{
- static Image* mediaVolumeSliderThumb = Image::loadPlatformResource("mediaVolumeSliderThumb").releaseRef();
- return mediaVolumeSliderThumb;
-}
-#endif
-
void RenderThemeChromiumMac::adjustSliderThumbSize(RenderObject* o) const
{
static const int sliderThumbWidth = 15;
@@ -1277,16 +1263,7 @@ void RenderThemeChromiumMac::adjustSliderThumbSize(RenderObject* o) const
}
#if ENABLE(VIDEO)
- Image* thumbImage = 0;
- if (o->style()->appearance() == MediaSliderThumbPart)
- thumbImage = mediaSliderThumbImage();
- else if (o->style()->appearance() == MediaVolumeSliderThumbPart)
- thumbImage = mediaVolumeSliderThumbImage();
-
- if (thumbImage) {
- o->style()->setWidth(Length(thumbImage->width(), Fixed));
- o->style()->setHeight(Length(thumbImage->height(), Fixed));
- }
+ RenderMediaControlsChromium::adjustMediaSliderThumbSize(o);
#endif
}
@@ -1537,173 +1514,44 @@ bool RenderThemeChromiumMac::paintSearchFieldResultsButton(RenderObject* o, cons
}
#if ENABLE(VIDEO)
-// Attempt to retrieve a HTMLMediaElement from a Node. Returns 0 if one cannot be found.
-static HTMLMediaElement* mediaElementParent(Node* node)
-{
- if (!node)
- return 0;
- Node* mediaNode = node->shadowAncestorNode();
- if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
- return 0;
-
- return static_cast<HTMLMediaElement*>(mediaNode);
-}
-
-bool RenderThemeChromiumMac::paintMediaButtonInternal(GraphicsContext* context, const IntRect& rect, Image* image)
+bool RenderThemeChromiumMac::shouldRenderMediaControlPart(ControlPart part, Element* e)
{
- // Create a destination rectangle for the image that is centered in the drawing rectangle, rounded left, and down.
- IntRect imageRect = image->rect();
- imageRect.setY(rect.y() + (rect.height() - image->height() + 1) / 2);
- imageRect.setX(rect.x() + (rect.width() - image->width() + 1) / 2);
-
- context->drawImage(image, imageRect);
- return true;
+ return RenderMediaControlsChromium::shouldRenderMediaControlPart(part, e);
}
bool RenderThemeChromiumMac::paintMediaPlayButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- static Image* mediaPlay = Image::loadPlatformResource("mediaPlay").releaseRef();
- static Image* mediaPause = Image::loadPlatformResource("mediaPause").releaseRef();
- static Image* mediaPlayDisabled = Image::loadPlatformResource("mediaPlayDisabled").releaseRef();
-
- if (mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE)
- return paintMediaButtonInternal(paintInfo.context, rect, mediaPlayDisabled);
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaElement->paused() ? mediaPlay : mediaPause);
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaPlayButton, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaMuteButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- static Image* soundFull = Image::loadPlatformResource("mediaSoundFull").releaseRef();
- static Image* soundNone = Image::loadPlatformResource("mediaSoundNone").releaseRef();
- static Image* soundDisabled = Image::loadPlatformResource("mediaSoundDisabled").releaseRef();
-
- if (mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE || !mediaElement->hasAudio())
- return paintMediaButtonInternal(paintInfo.context, rect, soundDisabled);
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaElement->muted() ? soundNone : soundFull);
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaMuteButton, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaSliderTrack(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- RenderStyle* style = object->style();
- GraphicsContext* context = paintInfo.context;
- context->save();
-
- context->setShouldAntialias(true);
-
- IntSize topLeftRadius = style->borderTopLeftRadius();
- IntSize topRightRadius = style->borderTopRightRadius();
- IntSize bottomLeftRadius = style->borderBottomLeftRadius();
- IntSize bottomRightRadius = style->borderBottomRightRadius();
- float borderWidth = style->borderLeftWidth();
-
- // Draw the border of the time bar.
- context->setStrokeColor(style->borderLeftColor());
- context->setStrokeThickness(borderWidth);
- context->setFillColor(style->backgroundColor());
- context->addPath(Path::createRoundedRectangle(rect, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius));
- context->drawPath();
-
- // Draw the buffered ranges.
- // FIXME: Draw multiple ranges if there are multiple buffered ranges.
- FloatRect bufferedRect = rect;
- bufferedRect.inflate(-1.0 - borderWidth);
- bufferedRect.setWidth(bufferedRect.width() * mediaElement->percentLoaded());
- bufferedRect = context->roundToDevicePixels(bufferedRect);
-
- // Don't bother drawing an empty area.
- if (bufferedRect.width() > 0 && bufferedRect.height() > 0) {
- FloatPoint sliderTopLeft = bufferedRect.location();
- FloatPoint sliderTopRight = sliderTopLeft;
- sliderTopRight.move(0.0f, bufferedRect.height());
-
- RefPtr<Gradient> gradient = Gradient::create(sliderTopLeft, sliderTopRight);
- Color startColor = object->style()->color();
- gradient->addColorStop(0.0, startColor);
- gradient->addColorStop(1.0, Color(startColor.red() / 2, startColor.green() / 2, startColor.blue() / 2, startColor.alpha()));
-
- context->setFillGradient(gradient);
- context->addPath(Path::createRoundedRectangle(bufferedRect, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius));
- context->fillPath();
- }
-
- context->restore();
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaSlider, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaVolumeSliderTrack(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- GraphicsContext* context = paintInfo.context;
- Color originalColor = context->strokeColor();
- if (originalColor != Color::white)
- context->setStrokeColor(Color::white);
-
- int x = rect.x() + rect.width() / 2;
- context->drawLine(IntPoint(x, rect.y()), IntPoint(x, rect.y() + rect.height()));
-
- if (originalColor != Color::white)
- context->setStrokeColor(originalColor);
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSlider, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- if (!object->parent()->isSlider())
- return false;
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaSliderThumbImage());
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaSliderThumb, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaVolumeSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- if (!object->parent()->isSlider())
- return false;
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaVolumeSliderThumbImage());
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSliderThumb, object, paintInfo, rect);
}
bool RenderThemeChromiumMac::paintMediaControlsBackground(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- if (!rect.isEmpty())
- {
- GraphicsContext* context = paintInfo.context;
- Color originalColor = context->strokeColor();
-
- // Draws the left border, it is always 1px wide.
- context->setStrokeColor(object->style()->borderLeftColor());
- context->drawLine(IntPoint(rect.x() + 1, rect.y()),
- IntPoint(rect.x() + 1, rect.y() + rect.height()));
-
-
- // Draws the right border, it is always 1px wide.
- context->setStrokeColor(object->style()->borderRightColor());
- context->drawLine(IntPoint(rect.x() + rect.width() - 1, rect.y()),
- IntPoint(rect.x() + rect.width() - 1, rect.y() + rect.height()));
-
- context->setStrokeColor(originalColor);
- }
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaTimelineContainer, object, paintInfo, rect);
}
String RenderThemeChromiumMac::extraMediaControlsStyleSheet()
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp
index 4f486d5..fb42bb7 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderThemeChromiumSkia.cpp
@@ -33,6 +33,7 @@
#include "MediaControlElements.h"
#include "PlatformContextSkia.h"
#include "RenderBox.h"
+#include "RenderMediaControlsChromium.h"
#include "RenderObject.h"
#include "RenderSlider.h"
#include "ScrollbarTheme.h"
@@ -96,20 +97,6 @@ static void drawBox(SkCanvas* canvas, const IntRect& rect, const SkPaint& paint)
drawVertLine(canvas, rect.x(), rect.y(), bottom, paint);
}
-#if ENABLE(VIDEO)
-// Attempt to retrieve a HTMLMediaElement from a Node. Returns NULL if one cannot be found.
-static HTMLMediaElement* mediaElementParent(Node* node)
-{
- if (!node)
- return 0;
- Node* mediaNode = node->shadowAncestorNode();
- if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
- return 0;
-
- return static_cast<HTMLMediaElement*>(mediaNode);
-}
-#endif
-
// We aim to match IE here.
// -IE uses a font based on the encoding as the default font for form controls.
// -Gecko uses MS Shell Dlg (actually calls GetStockObject(DEFAULT_GUI_FONT),
@@ -486,42 +473,10 @@ bool RenderThemeChromiumSkia::paintSearchFieldResultsButton(RenderObject* o, con
return false;
}
-bool RenderThemeChromiumSkia::paintMediaButtonInternal(GraphicsContext* context, const IntRect& rect, Image* image)
-{
- // Create a destination rectangle for the image that is centered in the drawing rectangle, rounded left, and down.
- IntRect imageRect = image->rect();
- imageRect.setY(rect.y() + (rect.height() - image->height() + 1) / 2);
- imageRect.setX(rect.x() + (rect.width() - image->width() + 1) / 2);
-
- context->drawImage(image, imageRect);
- return true;
-}
-
bool RenderThemeChromiumSkia::paintMediaControlsBackground(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- if (!rect.isEmpty())
- {
- SkCanvas* canvas = paintInfo.context->platformContext()->canvas();
- SkPaint paint;
-
- // Draws the left border, it is always 1px wide.
- paint.setColor(object->style()->borderLeftColor().rgb());
- canvas->drawLine(rect.x() + 1, rect.y(),
- rect.x() + 1, rect.y() + rect.height(),
- paint);
-
- // Draws the right border, it is always 1px wide.
- paint.setColor(object->style()->borderRightColor().rgb());
- canvas->drawLine(rect.x() + rect.width() - 1, rect.y(),
- rect.x() + rect.width() - 1, rect.y() + rect.height(),
- paint);
- }
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaTimelineContainer, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -533,62 +488,7 @@ bool RenderThemeChromiumSkia::paintMediaControlsBackground(RenderObject* object,
bool RenderThemeChromiumSkia::paintMediaSliderTrack(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- SkCanvas* canvas = paintInfo.context->platformContext()->canvas();
- SkRect backgroundRect;
- backgroundRect.set(rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height());
-
- SkPaint paint;
- paint.setAntiAlias(true);
-
- // Draw the border of the time bar. The border only has one single color,
- // width and radius. So use the property of the left border.
- SkColor borderColor = object->style()->borderLeftColor().rgb();
- int borderWidth = object->style()->borderLeftWidth();
- IntSize borderRadius = object->style()->borderTopLeftRadius();
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setStrokeWidth(borderWidth);
- paint.setColor(borderColor);
- canvas->drawRoundRect(backgroundRect, borderRadius.width(), borderRadius.height(), paint);
-
- // Draw the background of the time bar.
- SkColor backgroundColor = object->style()->backgroundColor().rgb();
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(backgroundColor);
- canvas->drawRoundRect(backgroundRect, borderRadius.width(), borderRadius.height(), paint);
-
- if (backgroundRect.width() >= 3 && backgroundRect.height() >= 3)
- {
- // Draw the buffered ranges.
- // FIXME: Draw multiple ranges if there are multiple buffered ranges.
- SkRect bufferedRect;
- bufferedRect.set(backgroundRect.fLeft + 2, backgroundRect.fTop + 2,
- backgroundRect.fRight - 1, backgroundRect.fBottom - 1);
- int width = static_cast<int>(bufferedRect.width() * mediaElement->percentLoaded());
- bufferedRect.fRight = bufferedRect.fLeft + width;
-
- SkPoint points[2] = { { 0, bufferedRect.fTop }, { 0, bufferedRect.fBottom } };
- SkColor startColor = object->style()->color().rgb();
- SkColor endColor = SkColorSetRGB(SkColorGetR(startColor) / 2,
- SkColorGetG(startColor) / 2,
- SkColorGetB(startColor) / 2);
- SkColor colors[2] = { startColor, endColor };
- SkShader* gradient = SkGradientShader::CreateLinear(points, colors, 0,
- sizeof(points) / sizeof(points[0]),
- SkShader::kMirror_TileMode, 0);
-
- paint.reset();
- paint.setShader(gradient);
- paint.setAntiAlias(true);
- // Check for round rect with zero width or height, otherwise Skia will assert
- if (bufferedRect.width() > 0 && bufferedRect.height() > 0)
- canvas->drawRoundRect(bufferedRect, borderRadius.width(), borderRadius.height(), paint);
- gradient->unref();
- }
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaSlider, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -600,17 +500,7 @@ bool RenderThemeChromiumSkia::paintMediaSliderTrack(RenderObject* object, const
bool RenderThemeChromiumSkia::paintMediaVolumeSliderTrack(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- SkCanvas* canvas = paintInfo.context->platformContext()->canvas();
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
-
- int x = rect.x() + rect.width() / 2;
- canvas->drawLine(x, rect.y(), x, rect.y() + rect.height(), paint);
- return true;
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSlider, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -619,31 +509,10 @@ bool RenderThemeChromiumSkia::paintMediaVolumeSliderTrack(RenderObject* object,
#endif
}
-static Image* mediaSliderThumbImage()
-{
- static Image* mediaSliderThumb = Image::loadPlatformResource("mediaSliderThumb").releaseRef();
- return mediaSliderThumb;
-}
-
-static Image* mediaVolumeSliderThumbImage()
-{
- static Image* mediaVolumeSliderThumb = Image::loadPlatformResource("mediaVolumeSliderThumb").releaseRef();
- return mediaVolumeSliderThumb;
-}
-
void RenderThemeChromiumSkia::adjustSliderThumbSize(RenderObject* object) const
{
#if ENABLE(VIDEO)
- Image* thumbImage = 0;
- if (object->style()->appearance() == MediaSliderThumbPart)
- thumbImage = mediaSliderThumbImage();
- else if (object->style()->appearance() == MediaVolumeSliderThumbPart)
- thumbImage = mediaVolumeSliderThumbImage();
-
- if (thumbImage) {
- object->style()->setWidth(Length(thumbImage->width(), Fixed));
- object->style()->setHeight(Length(thumbImage->height(), Fixed));
- }
+ RenderMediaControlsChromium::adjustMediaSliderThumbSize(object);
#else
UNUSED_PARAM(object);
#endif
@@ -652,10 +521,7 @@ void RenderThemeChromiumSkia::adjustSliderThumbSize(RenderObject* object) const
bool RenderThemeChromiumSkia::paintMediaSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- if (!object->parent()->isSlider())
- return false;
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaSliderThumbImage());
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaSliderThumb, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -667,10 +533,7 @@ bool RenderThemeChromiumSkia::paintMediaSliderThumb(RenderObject* object, const
bool RenderThemeChromiumSkia::paintMediaVolumeSliderThumb(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- if (!object->parent()->isSlider())
- return false;
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaVolumeSliderThumbImage());
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSliderThumb, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -682,18 +545,7 @@ bool RenderThemeChromiumSkia::paintMediaVolumeSliderThumb(RenderObject* object,
bool RenderThemeChromiumSkia::paintMediaPlayButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- static Image* mediaPlay = Image::loadPlatformResource("mediaPlay").releaseRef();
- static Image* mediaPause = Image::loadPlatformResource("mediaPause").releaseRef();
- static Image* mediaPlayDisabled = Image::loadPlatformResource("mediaPlayDisabled").releaseRef();
-
- if (mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE)
- return paintMediaButtonInternal(paintInfo.context, rect, mediaPlayDisabled);
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaElement->paused() ? mediaPlay : mediaPause);
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaPlayButton, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -705,18 +557,7 @@ bool RenderThemeChromiumSkia::paintMediaPlayButton(RenderObject* object, const R
bool RenderThemeChromiumSkia::paintMediaMuteButton(RenderObject* object, const RenderObject::PaintInfo& paintInfo, const IntRect& rect)
{
#if ENABLE(VIDEO)
- HTMLMediaElement* mediaElement = mediaElementParent(object->node());
- if (!mediaElement)
- return false;
-
- static Image* soundFull = Image::loadPlatformResource("mediaSoundFull").releaseRef();
- static Image* soundNone = Image::loadPlatformResource("mediaSoundNone").releaseRef();
- static Image* soundDisabled = Image::loadPlatformResource("mediaSoundDisabled").releaseRef();
-
- if (mediaElement->networkState() == HTMLMediaElement::NETWORK_NO_SOURCE || !mediaElement->hasAudio())
- return paintMediaButtonInternal(paintInfo.context, rect, soundDisabled);
-
- return paintMediaButtonInternal(paintInfo.context, rect, mediaElement->muted() ? soundNone: soundFull);
+ return RenderMediaControlsChromium::paintMediaControlsPart(MediaMuteButton, object, paintInfo, rect);
#else
UNUSED_PARAM(object);
UNUSED_PARAM(paintInfo);
@@ -744,8 +585,9 @@ bool RenderThemeChromiumSkia::paintMenuList(RenderObject* o, const RenderObject:
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kFill_Style);
+ int arrowXPosition = (o->style()->direction() == RTL) ? rect.x() + 7 : right - 13;
SkPath path;
- path.moveTo(right - 13, middle - 3);
+ path.moveTo(arrowXPosition, middle - 3);
path.rLineTo(6, 0);
path.rLineTo(-3, 6);
path.close();
@@ -871,13 +713,7 @@ int RenderThemeChromiumSkia::buttonInternalPaddingBottom() const
#if ENABLE(VIDEO)
bool RenderThemeChromiumSkia::shouldRenderMediaControlPart(ControlPart part, Element* e)
{
- HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(e);
- switch (part) {
- case MediaMuteButtonPart:
- return true;
- default:
- return RenderTheme::shouldRenderMediaControlPart(part, e);
- }
+ return RenderMediaControlsChromium::shouldRenderMediaControlPart(part, e);
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h b/src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h
index 85f141f..1d68c63 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderThemeMac.h
@@ -132,6 +132,8 @@ protected:
// Media controls
virtual String extraMediaControlsStyleSheet();
+
+ virtual bool shouldRenderMediaControlPart(ControlPart, Element*);
#endif
private:
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp
index 8e53088..2ea3b8b 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderThemeSafari.cpp
@@ -86,7 +86,7 @@ PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
return safariTheme; // keep the reference of one.
}
-#if !defined(NDEBUG) && defined(USE_DEBUG_SAFARI_THEME)
+#ifdef DEBUG_ALL
SOFT_LINK_DEBUG_LIBRARY(SafariTheme)
#else
SOFT_LINK_LIBRARY(SafariTheme)
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp b/src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp
index ef78b07..9af7137 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderWidget.cpp
@@ -175,6 +175,12 @@ void RenderWidget::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
}
}
+void RenderWidget::showSubstituteImage(PassRefPtr<Image> prpImage)
+{
+ m_substituteImage = prpImage;
+ repaint();
+}
+
void RenderWidget::paint(PaintInfo& paintInfo, int tx, int ty)
{
if (!shouldPaint(paintInfo, tx, ty))
@@ -222,7 +228,10 @@ void RenderWidget::paint(PaintInfo& paintInfo, int tx, int ty)
// Tell the widget to paint now. This is the only time the widget is allowed
// to paint itself. That way it will composite properly with z-indexed layers.
- m_widget->paint(paintInfo.context, paintInfo.rect);
+ if (m_substituteImage)
+ paintInfo.context->drawImage(m_substituteImage.get(), m_widget->frameRect());
+ else
+ m_widget->paint(paintInfo.context, paintInfo.rect);
if (m_widget->isFrameView() && paintInfo.overlapTestRequests && !static_cast<FrameView*>(m_widget.get())->useSlowRepaints()) {
ASSERT(!paintInfo.overlapTestRequests->contains(this));
diff --git a/src/3rdparty/webkit/WebCore/rendering/RenderWidget.h b/src/3rdparty/webkit/WebCore/rendering/RenderWidget.h
index 098f69e..78537fd 100644
--- a/src/3rdparty/webkit/WebCore/rendering/RenderWidget.h
+++ b/src/3rdparty/webkit/WebCore/rendering/RenderWidget.h
@@ -40,6 +40,8 @@ public:
void updateWidgetPosition();
+ void showSubstituteImage(PassRefPtr<Image>);
+
protected:
RenderWidget(Node*);
@@ -66,6 +68,7 @@ private:
void deref(RenderArena*);
RefPtr<Widget> m_widget;
+ RefPtr<Image> m_substituteImage;
FrameView* m_frameView;
int m_refCount;
};
diff --git a/src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp b/src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp
index fb6866f..0f295e4 100644
--- a/src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp
+++ b/src/3rdparty/webkit/WebCore/rendering/SVGRenderSupport.cpp
@@ -220,7 +220,7 @@ FloatRect SVGRenderBase::filterBoundingBoxForRenderer(const RenderObject* object
#if ENABLE(FILTERS)
SVGResourceFilter* filter = getFilterById(object->document(), object->style()->svgStyle()->filter());
if (filter)
- return filter->filterBBoxForItemBBox(object->objectBoundingBox());
+ return filter->filterBoundingBox();
#else
UNUSED_PARAM(object);
#endif
diff --git a/src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h b/src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h
index be5d1cf..1e1688c 100644
--- a/src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h
+++ b/src/3rdparty/webkit/WebCore/rendering/style/RenderStyle.h
@@ -462,7 +462,7 @@ public:
return font().lineSpacing();
if (lh.isPercent())
- return lh.calcMinValue(fontSize());
+ return lh.calcMinValue(fontSize(), true);
return lh.value();
}
diff --git a/src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h b/src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h
index a47defb..3010947 100644
--- a/src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h
+++ b/src/3rdparty/webkit/WebCore/rendering/style/RenderStyleConstants.h
@@ -72,6 +72,7 @@ enum PseudoId {
MEDIA_CONTROLS_VOLUME_SLIDER, MEDIA_CONTROLS_VOLUME_SLIDER_CONTAINER, MEDIA_CONTROLS_CURRENT_TIME_DISPLAY, MEDIA_CONTROLS_TIME_REMAINING_DISPLAY, MEDIA_CONTROLS_SEEK_BACK_BUTTON,
MEDIA_CONTROLS_SEEK_FORWARD_BUTTON, MEDIA_CONTROLS_FULLSCREEN_BUTTON, MEDIA_CONTROLS_REWIND_BUTTON, MEDIA_CONTROLS_RETURN_TO_REALTIME_BUTTON,
MEDIA_CONTROLS_STATUS_DISPLAY, SCROLLBAR_THUMB, SCROLLBAR_BUTTON, SCROLLBAR_TRACK, SCROLLBAR_TRACK_PIECE, SCROLLBAR_CORNER, RESIZER,
+ INPUT_LIST_BUTTON,
FIRST_INTERNAL_PSEUDOID = FILE_UPLOAD_BUTTON
};
diff --git a/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.h b/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.h
index 0e9dae4..e50d349 100644
--- a/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.h
+++ b/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyle.h
@@ -65,7 +65,6 @@ namespace WebCore {
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(LineJoin, JoinStyle, joinStyle, MiterJoin)
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EShapeRendering, ShapeRendering, shapeRendering, SR_AUTO)
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(ETextAnchor, TextAnchor, textAnchor, TA_START)
- SVG_RS_DEFINE_ATTRIBUTE_INHERITED(ETextRendering, TextRendering, textRendering, TR_AUTO)
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EWritingMode, WritingMode, writingMode, WM_LRTB)
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EGlyphOrientation, GlyphOrientationHorizontal, glyphOrientationHorizontal, GO_0DEG)
SVG_RS_DEFINE_ATTRIBUTE_INHERITED(EGlyphOrientation, GlyphOrientationVertical, glyphOrientationVertical, GO_AUTO)
@@ -113,7 +112,6 @@ namespace WebCore {
return (_colorRendering == other._colorRendering) &&
(_imageRendering == other._imageRendering) &&
(_shapeRendering == other._shapeRendering) &&
- (_textRendering == other._textRendering) &&
(_clipRule == other._clipRule) &&
(_fillRule == other._fillRule) &&
(_capStyle == other._capStyle) &&
@@ -134,7 +132,6 @@ namespace WebCore {
unsigned _colorRendering : 2; // EColorRendering
unsigned _imageRendering : 2; // EImageRendering
unsigned _shapeRendering : 2; // EShapeRendering
- unsigned _textRendering : 2; // ETextRendering
unsigned _clipRule : 1; // WindRule
unsigned _fillRule : 1; // WindRule
unsigned _capStyle : 2; // LineCap
@@ -190,7 +187,6 @@ namespace WebCore {
svg_inherited_flags._fillRule = initialFillRule();
svg_inherited_flags._imageRendering = initialImageRendering();
svg_inherited_flags._shapeRendering = initialShapeRendering();
- svg_inherited_flags._textRendering = initialTextRendering();
svg_inherited_flags._textAnchor = initialTextAnchor();
svg_inherited_flags._capStyle = initialCapStyle();
svg_inherited_flags._joinStyle = initialJoinStyle();
diff --git a/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h b/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h
index b7bf026..c0f5d4e 100644
--- a/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h
+++ b/src/3rdparty/webkit/WebCore/rendering/style/SVGRenderStyleDefs.h
@@ -95,10 +95,6 @@ namespace WebCore {
SR_AUTO, SR_OPTIMIZESPEED, SR_CRISPEDGES, SR_GEOMETRICPRECISION
};
- enum ETextRendering {
- TR_AUTO, TR_OPTIMIZESPEED, TR_OPTIMIZELEGIBILITY, TR_GEOMETRICPRECISION
- };
-
enum EWritingMode {
WM_LRTB, WM_LR, WM_RLTB, WM_RL, WM_TBRL, WM_TB
};
diff --git a/src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp b/src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp
index 33660e7..17a9407 100644
--- a/src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/ChangeVersionWrapper.cpp
@@ -34,8 +34,8 @@
namespace WebCore {
ChangeVersionWrapper::ChangeVersionWrapper(const String& oldVersion, const String& newVersion)
- : m_oldVersion(oldVersion.copy())
- , m_newVersion(newVersion.copy())
+ : m_oldVersion(oldVersion.crossThreadString())
+ , m_newVersion(newVersion.crossThreadString())
{
}
diff --git a/src/3rdparty/webkit/WebCore/storage/Database.cpp b/src/3rdparty/webkit/WebCore/storage/Database.cpp
index be0c490..08ea289 100644
--- a/src/3rdparty/webkit/WebCore/storage/Database.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/Database.cpp
@@ -89,6 +89,22 @@ static GuidVersionMap& guidToVersionMap()
return map;
}
+// NOTE: Caller must lock guidMutex().
+static inline void updateGuidVersionMap(int guid, String newVersion)
+{
+ // Ensure the the mutex is locked.
+ ASSERT(!guidMutex().tryLock());
+
+ // Note: It is not safe to put an empty string into the guidToVersionMap() map.
+ // That's because the map is cross-thread, but empty strings are per-thread.
+ // The copy() function makes a version of the string you can use on the current
+ // thread, but we need a string we can keep in a cross-thread data structure.
+ // FIXME: This is a quite-awkward restriction to have to program with.
+
+ // Map null string to empty string (see comment above).
+ guidToVersionMap().set(guid, newVersion.isEmpty() ? String() : newVersion.threadsafeCopy());
+}
+
typedef HashMap<int, HashSet<Database*>*> GuidDatabaseMap;
static GuidDatabaseMap& guidToDatabaseMap()
{
@@ -134,7 +150,7 @@ PassRefPtr<Database> Database::openDatabase(Document* document, const String& na
Database::Database(Document* document, const String& name, const String& expectedVersion)
: m_transactionInProgress(false)
, m_document(document)
- , m_name(name.copy())
+ , m_name(name.crossThreadString())
, m_guid(0)
, m_expectedVersion(expectedVersion)
, m_deleted(false)
@@ -149,8 +165,6 @@ Database::Database(Document* document, const String& name, const String& expecte
#if USE(JSC)
JSC::initializeThreading();
- // Database code violates the normal JSCore contract by calling jsUnprotect from a secondary thread, and thus needs additional locking.
- JSDOMWindow::commonJSGlobalData()->heap.setGCProtectNeedsLocking();
#endif
m_guid = guidForOriginAndName(m_securityOrigin->toString(), name);
@@ -177,20 +191,6 @@ Database::Database(Document* document, const String& name, const String& expecte
Database::~Database()
{
- {
- MutexLocker locker(guidMutex());
-
- HashSet<Database*>* hashSet = guidToDatabaseMap().get(m_guid);
- ASSERT(hashSet);
- ASSERT(hashSet->contains(this));
- hashSet->remove(this);
- if (hashSet->isEmpty()) {
- guidToDatabaseMap().remove(m_guid);
- delete hashSet;
- guidToVersionMap().remove(m_guid);
- }
- }
-
if (m_document->databaseThread())
m_document->databaseThread()->unscheduleDatabaseTasks(this);
@@ -245,7 +245,7 @@ bool Database::getVersionFromDatabase(String& version)
m_databaseAuthorizer->disable();
- bool result = retrieveTextResultFromDatabase(m_sqliteDatabase, getVersionQuery.copy(), version);
+ bool result = retrieveTextResultFromDatabase(m_sqliteDatabase, getVersionQuery.threadsafeCopy(), version);
if (!result)
LOG_ERROR("Failed to retrieve version from database %s", databaseDebugName().ascii().data());
@@ -277,11 +277,13 @@ static bool setTextValueInDatabase(SQLiteDatabase& db, const String& query, cons
bool Database::setVersionInDatabase(const String& version)
{
+ // The INSERT will replace an existing entry for the database with the new version number, due to the UNIQUE ON CONFLICT REPLACE
+ // clause in the CREATE statement (see Database::performOpenAndVerify()).
DEFINE_STATIC_LOCAL(String, setVersionQuery, ("INSERT INTO " + databaseInfoTableName() + " (key, value) VALUES ('" + databaseVersionKey() + "', ?);"));
m_databaseAuthorizer->disable();
- bool result = setTextValueInDatabase(m_sqliteDatabase, setVersionQuery.copy(), version);
+ bool result = setTextValueInDatabase(m_sqliteDatabase, setVersionQuery.threadsafeCopy(), version);
if (!result)
LOG_ERROR("Failed to set version %s in database (%s)", version.ascii().data(), setVersionQuery.ascii().data());
@@ -330,6 +332,20 @@ void Database::close()
m_sqliteDatabase.close();
m_document->databaseThread()->recordDatabaseClosed(this);
m_opened = false;
+
+ {
+ MutexLocker locker(guidMutex());
+
+ HashSet<Database*>* hashSet = guidToDatabaseMap().get(m_guid);
+ ASSERT(hashSet);
+ ASSERT(hashSet->contains(this));
+ hashSet->remove(this);
+ if (hashSet->isEmpty()) {
+ guidToDatabaseMap().remove(m_guid);
+ delete hashSet;
+ guidToVersionMap().remove(m_guid);
+ }
+ }
}
}
@@ -449,15 +465,9 @@ bool Database::performOpenAndVerify(ExceptionCode& e)
{
MutexLocker locker(guidMutex());
- // Note: It is not safe to put an empty string into the guidToVersionMap() map.
- // That's because the map is cross-thread, but empty strings are per-thread.
- // The copy() function makes a version of the string you can use on the current
- // thread, but we need a string we can keep in a cross-thread data structure.
- // FIXME: This is a quite-awkward restriction to have to program with.
-
GuidVersionMap::iterator entry = guidToVersionMap().find(m_guid);
if (entry != guidToVersionMap().end()) {
- // Map null string to empty string (see comment above).
+ // Map null string to empty string (see updateGuidVersionMap()).
currentVersion = entry->second.isNull() ? String("") : entry->second;
LOG(StorageAPI, "Current cached version for guid %i is %s", m_guid, currentVersion.ascii().data());
} else {
@@ -488,8 +498,7 @@ bool Database::performOpenAndVerify(ExceptionCode& e)
currentVersion = m_expectedVersion;
}
- // Map empty string to null string (see comment above).
- guidToVersionMap().set(m_guid, currentVersion.isEmpty() ? String() : currentVersion.copy());
+ updateGuidVersionMap(m_guid, currentVersion);
}
}
@@ -607,7 +616,7 @@ String Database::version() const
if (m_deleted)
return String();
MutexLocker locker(guidMutex());
- return guidToVersionMap().get(m_guid).copy();
+ return guidToVersionMap().get(m_guid).threadsafeCopy();
}
void Database::deliverPendingCallback(void* context)
@@ -632,18 +641,21 @@ Vector<String> Database::tableNames()
void Database::setExpectedVersion(const String& version)
{
- m_expectedVersion = version.copy();
+ m_expectedVersion = version.threadsafeCopy();
+ // Update the in memory database version map.
+ MutexLocker locker(guidMutex());
+ updateGuidVersionMap(m_guid, version);
}
PassRefPtr<SecurityOrigin> Database::securityOriginCopy() const
{
- return m_securityOrigin->copy();
+ return m_securityOrigin->threadsafeCopy();
}
String Database::stringIdentifier() const
{
// Return a deep copy for ref counting thread safety
- return m_name.copy();
+ return m_name.threadsafeCopy();
}
#endif
diff --git a/src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp b/src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp
index 491e6f1..265cd0d 100644
--- a/src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/DatabaseTracker.cpp
@@ -762,7 +762,7 @@ void DatabaseTracker::scheduleNotifyDatabaseChanged(SecurityOrigin* origin, cons
{
MutexLocker locker(notificationMutex());
- notificationQueue().append(pair<SecurityOrigin*, String>(origin, name.copy()));
+ notificationQueue().append(pair<SecurityOrigin*, String>(origin, name.crossThreadString()));
scheduleForNotification();
}
diff --git a/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp b/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp
index 4cea845..12cc083 100644
--- a/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.cpp
@@ -33,16 +33,18 @@
namespace WebCore {
-LocalStorageTask::LocalStorageTask(Type type, PassRefPtr<StorageAreaSync> area)
+LocalStorageTask::LocalStorageTask(Type type, StorageAreaSync* area)
: m_type(type)
, m_area(area)
+ , m_thread(0)
{
ASSERT(m_area);
ASSERT(m_type == AreaImport || m_type == AreaSync);
}
-LocalStorageTask::LocalStorageTask(Type type, PassRefPtr<LocalStorageThread> thread)
+LocalStorageTask::LocalStorageTask(Type type, LocalStorageThread* thread)
: m_type(type)
+ , m_area(0)
, m_thread(thread)
{
ASSERT(m_thread);
@@ -57,11 +59,9 @@ void LocalStorageTask::performTask()
{
switch (m_type) {
case AreaImport:
- ASSERT(m_area);
m_area->performImport();
break;
case AreaSync:
- ASSERT(m_area);
m_area->performSync();
break;
case TerminateThread:
diff --git a/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h b/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h
index 726b41f..f03d851 100644
--- a/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h
+++ b/src/3rdparty/webkit/WebCore/storage/LocalStorageTask.h
@@ -44,19 +44,19 @@ namespace WebCore {
~LocalStorageTask();
- static PassRefPtr<LocalStorageTask> createImport(PassRefPtr<StorageAreaSync> area) { return adoptRef(new LocalStorageTask(AreaImport, area)); }
- static PassRefPtr<LocalStorageTask> createSync(PassRefPtr<StorageAreaSync> area) { return adoptRef(new LocalStorageTask(AreaSync, area)); }
- static PassRefPtr<LocalStorageTask> createTerminate(PassRefPtr<LocalStorageThread> thread) { return adoptRef(new LocalStorageTask(TerminateThread, thread)); }
+ static PassRefPtr<LocalStorageTask> createImport(StorageAreaSync* area) { return adoptRef(new LocalStorageTask(AreaImport, area)); }
+ static PassRefPtr<LocalStorageTask> createSync(StorageAreaSync* area) { return adoptRef(new LocalStorageTask(AreaSync, area)); }
+ static PassRefPtr<LocalStorageTask> createTerminate(LocalStorageThread* thread) { return adoptRef(new LocalStorageTask(TerminateThread, thread)); }
void performTask();
private:
- LocalStorageTask(Type, PassRefPtr<StorageAreaSync>);
- LocalStorageTask(Type, PassRefPtr<LocalStorageThread>);
+ LocalStorageTask(Type, StorageAreaSync*);
+ LocalStorageTask(Type, LocalStorageThread*);
Type m_type;
- RefPtr<StorageAreaSync> m_area;
- RefPtr<LocalStorageThread> m_thread;
+ StorageAreaSync* m_area;
+ LocalStorageThread* m_thread;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp b/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp
index c85d5e6..78640a9 100644
--- a/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.cpp
@@ -86,13 +86,13 @@ void* LocalStorageThread::localStorageThread()
return 0;
}
-void LocalStorageThread::scheduleImport(PassRefPtr<StorageAreaSync> area)
+void LocalStorageThread::scheduleImport(StorageAreaSync* area)
{
ASSERT(!m_queue.killed() && m_threadID);
m_queue.append(LocalStorageTask::createImport(area));
}
-void LocalStorageThread::scheduleSync(PassRefPtr<StorageAreaSync> area)
+void LocalStorageThread::scheduleSync(StorageAreaSync* area)
{
ASSERT(!m_queue.killed() && m_threadID);
m_queue.append(LocalStorageTask::createSync(area));
diff --git a/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h b/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h
index b903fb9..e9e2b58 100644
--- a/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h
+++ b/src/3rdparty/webkit/WebCore/storage/LocalStorageThread.h
@@ -45,8 +45,8 @@ namespace WebCore {
bool start();
- void scheduleImport(PassRefPtr<StorageAreaSync>);
- void scheduleSync(PassRefPtr<StorageAreaSync>);
+ void scheduleImport(StorageAreaSync*);
+ void scheduleSync(StorageAreaSync*);
// Called from the main thread to synchronously shut down this thread
void terminate();
diff --git a/src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp b/src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp
index b757f70..20bb34d 100644
--- a/src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/OriginQuotaManager.cpp
@@ -79,7 +79,7 @@ void OriginQuotaManager::addDatabase(SecurityOrigin* origin, const String& datab
OriginUsageRecord* usageRecord = m_usageMap.get(origin);
ASSERT(usageRecord);
- usageRecord->addDatabase(databaseIdentifier.copy(), fullPath.copy());
+ usageRecord->addDatabase(databaseIdentifier.threadsafeCopy(), fullPath.threadsafeCopy());
}
void OriginQuotaManager::removeDatabase(SecurityOrigin* origin, const String& databaseIdentifier)
diff --git a/src/3rdparty/webkit/WebCore/storage/SQLError.h b/src/3rdparty/webkit/WebCore/storage/SQLError.h
index a17efa9..4414e6b 100644
--- a/src/3rdparty/webkit/WebCore/storage/SQLError.h
+++ b/src/3rdparty/webkit/WebCore/storage/SQLError.h
@@ -41,10 +41,10 @@ public:
static PassRefPtr<SQLError> create(unsigned code, const String& message) { return adoptRef(new SQLError(code, message)); }
unsigned code() const { return m_code; }
- String message() const { return m_message.copy(); }
+ String message() const { return m_message.threadsafeCopy(); }
private:
- SQLError(unsigned code, const String& message) : m_code(code), m_message(message.copy()) { }
+ SQLError(unsigned code, const String& message) : m_code(code), m_message(message.threadsafeCopy()) { }
unsigned m_code;
String m_message;
};
diff --git a/src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp b/src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp
index 970f757..b4eb9ef 100644
--- a/src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/SQLStatement.cpp
@@ -50,7 +50,7 @@ PassRefPtr<SQLStatement> SQLStatement::create(const String& statement, const Vec
}
SQLStatement::SQLStatement(const String& statement, const Vector<SQLValue>& arguments, PassRefPtr<SQLStatementCallback> callback, PassRefPtr<SQLStatementErrorCallback> errorCallback, bool readOnly)
- : m_statement(statement.copy())
+ : m_statement(statement.crossThreadString())
, m_arguments(arguments)
, m_statementCallback(callback)
, m_statementErrorCallback(errorCallback)
diff --git a/src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp b/src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp
index dabbac2..149b384 100644
--- a/src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/SQLTransaction.cpp
@@ -232,8 +232,9 @@ void SQLTransaction::openTransactionAndPreflight()
return;
}
- // Set the maximum usage for this transaction
- m_database->m_sqliteDatabase.setMaximumSize(m_database->maximumSize());
+ // Set the maximum usage for this transaction if this transactions is not read-only
+ if (!m_readOnly)
+ m_database->m_sqliteDatabase.setMaximumSize(m_database->maximumSize());
ASSERT(!m_sqliteTransaction);
m_sqliteTransaction.set(new SQLiteTransaction(m_database->m_sqliteDatabase, m_readOnly));
@@ -307,7 +308,10 @@ void SQLTransaction::runStatements()
// FIXME - Another place that needs fixing up after <rdar://problem/5628468> is addressed.
// See ::openTransactionAndPreflight() for discussion
- // Reset the maximum size here, as it was increased to allow us to retry this statement
+ // Reset the maximum size here, as it was increased to allow us to retry this statement.
+ // m_shouldRetryCurrentStatement is set to true only when a statement exceeds
+ // the quota, which can happen only in a read-write transaction. Therefore, there
+ // is no need to check here if the transaction is read-write.
m_database->m_sqliteDatabase.setMaximumSize(m_database->maximumSize());
} else {
// If the current statement has already been run, failed due to quota constraints, and we're not retrying it,
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageArea.h b/src/3rdparty/webkit/WebCore/storage/StorageArea.h
index e0f7f06..a64d44a 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageArea.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageArea.h
@@ -31,7 +31,7 @@
#include "PlatformString.h"
#include <wtf/PassRefPtr.h>
-#include <wtf/Threading.h>
+#include <wtf/RefCounted.h>
namespace WebCore {
@@ -42,7 +42,7 @@ namespace WebCore {
enum StorageType { LocalStorage, SessionStorage };
// This interface is required for Chromium since these actions need to be proxied between processes.
- class StorageArea : public ThreadSafeShared<StorageArea> {
+ class StorageArea : public RefCounted<StorageArea> {
public:
virtual ~StorageArea() { }
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp b/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp
index 66447d3..612cb5f 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.cpp
@@ -28,16 +28,11 @@
#if ENABLE(DOM_STORAGE)
-#include "DOMWindow.h"
-#include "EventNames.h"
#include "ExceptionCode.h"
#include "Frame.h"
-#include "Page.h"
-#include "PageGroup.h"
-#include "SecurityOrigin.h"
#include "Settings.h"
-#include "StorageEvent.h"
#include "StorageAreaSync.h"
+#include "StorageEventDispatcher.h"
#include "StorageMap.h"
#include "StorageSyncManager.h"
@@ -45,22 +40,24 @@ namespace WebCore {
StorageAreaImpl::~StorageAreaImpl()
{
+ ASSERT(isMainThread());
}
-PassRefPtr<StorageAreaImpl> StorageAreaImpl::create(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager)
+PassRefPtr<StorageAreaImpl> StorageAreaImpl::create(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager, unsigned quota)
{
- return adoptRef(new StorageAreaImpl(storageType, origin, syncManager));
+ return adoptRef(new StorageAreaImpl(storageType, origin, syncManager, quota));
}
-StorageAreaImpl::StorageAreaImpl(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager)
+StorageAreaImpl::StorageAreaImpl(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager, unsigned quota)
: m_storageType(storageType)
, m_securityOrigin(origin)
- , m_storageMap(StorageMap::create())
+ , m_storageMap(StorageMap::create(quota))
, m_storageSyncManager(syncManager)
#ifndef NDEBUG
, m_isShutdown(false)
#endif
{
+ ASSERT(isMainThread());
ASSERT(m_securityOrigin);
ASSERT(m_storageMap);
@@ -87,6 +84,7 @@ StorageAreaImpl::StorageAreaImpl(StorageAreaImpl* area)
, m_isShutdown(area->m_isShutdown)
#endif
{
+ ASSERT(isMainThread());
ASSERT(m_securityOrigin);
ASSERT(m_storageMap);
ASSERT(!m_isShutdown);
@@ -137,15 +135,14 @@ void StorageAreaImpl::setItem(const String& key, const String& value, ExceptionC
return;
}
- // FIXME: For LocalStorage where a disk quota will be enforced, here is where we need to do quota checking.
- // If we decide to enforce a memory quota for SessionStorage, this is where we'd do that, also.
- // if (<over quota>) {
- // ec = QUOTA_EXCEEDED_ERR;
- // return;
- // }
-
String oldValue;
- RefPtr<StorageMap> newMap = m_storageMap->setItem(key, value, oldValue);
+ bool quotaException;
+ RefPtr<StorageMap> newMap = m_storageMap->setItem(key, value, oldValue, quotaException);
+
+ if (quotaException) {
+ ec = QUOTA_EXCEEDED_ERR;
+ return;
+ }
if (newMap)
m_storageMap = newMap.release();
@@ -154,7 +151,7 @@ void StorageAreaImpl::setItem(const String& key, const String& value, ExceptionC
if (oldValue != value) {
if (m_storageAreaSync)
m_storageAreaSync->scheduleItemForSync(key, value);
- dispatchStorageEvent(key, oldValue, value, frame);
+ StorageEventDispatcher::dispatch(key, oldValue, value, m_storageType, m_securityOrigin.get(), frame);
}
}
@@ -175,7 +172,7 @@ void StorageAreaImpl::removeItem(const String& key, Frame* frame)
if (!oldValue.isNull()) {
if (m_storageAreaSync)
m_storageAreaSync->scheduleItemForSync(key, String());
- dispatchStorageEvent(key, oldValue, String(), frame);
+ StorageEventDispatcher::dispatch(key, oldValue, String(), m_storageType, m_securityOrigin.get(), frame);
}
}
@@ -187,11 +184,12 @@ void StorageAreaImpl::clear(Frame* frame)
if (privateBrowsingEnabled(frame))
return;
- m_storageMap = StorageMap::create();
+ unsigned quota = m_storageMap->quota();
+ m_storageMap = StorageMap::create(quota);
if (m_storageAreaSync)
m_storageAreaSync->scheduleClear();
- dispatchStorageEvent(String(), String(), String(), frame);
+ StorageEventDispatcher::dispatch(String(), String(), String(), m_storageType, m_securityOrigin.get(), frame);
}
bool StorageAreaImpl::contains(const String& key) const
@@ -229,45 +227,6 @@ void StorageAreaImpl::blockUntilImportComplete() const
m_storageAreaSync->blockUntilImportComplete();
}
-void StorageAreaImpl::dispatchStorageEvent(const String& key, const String& oldValue, const String& newValue, Frame* sourceFrame)
-{
-#if PLATFORM(CHROMIUM)
- // FIXME: Events are currently broken in Chromium.
- return;
-#endif
-
- Page* page = sourceFrame->page();
- if (!page)
- return;
-
- // We need to copy all relevant frames from every page to a vector since sending the event to one frame might mutate the frame tree
- // of any given page in the group or mutate the page group itself.
- Vector<RefPtr<Frame> > frames;
- if (m_storageType == SessionStorage) {
- // Send events only to our page.
- for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
- if (frame->document()->securityOrigin()->equal(securityOrigin()))
- frames.append(frame);
- }
-
- for (unsigned i = 0; i < frames.size(); ++i)
- frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documentURI(), sourceFrame->domWindow(), frames[i]->domWindow()->sessionStorage()));
- } else {
- // Send events to every page.
- const HashSet<Page*>& pages = page->group().pages();
- HashSet<Page*>::const_iterator end = pages.end();
- for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) {
- for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
- if (frame->document()->securityOrigin()->equal(securityOrigin()))
- frames.append(frame);
- }
- }
-
- for (unsigned i = 0; i < frames.size(); ++i)
- frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documentURI(), sourceFrame->domWindow(), frames[i]->domWindow()->localStorage()));
- }
-}
-
}
#endif // ENABLE(DOM_STORAGE)
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h b/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h
index a7cc9f6..fe21a45 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageAreaImpl.h
@@ -41,7 +41,7 @@ namespace WebCore {
class StorageAreaImpl : public StorageArea {
public:
- static PassRefPtr<StorageAreaImpl> create(StorageType, PassRefPtr<SecurityOrigin>, PassRefPtr<StorageSyncManager>);
+ static PassRefPtr<StorageAreaImpl> create(StorageType, PassRefPtr<SecurityOrigin>, PassRefPtr<StorageSyncManager>, unsigned quota);
virtual ~StorageAreaImpl();
// The HTML5 DOM Storage API (and contains)
@@ -61,13 +61,11 @@ namespace WebCore {
SecurityOrigin* securityOrigin();
private:
- StorageAreaImpl(StorageType, PassRefPtr<SecurityOrigin>, PassRefPtr<StorageSyncManager>);
+ StorageAreaImpl(StorageType, PassRefPtr<SecurityOrigin>, PassRefPtr<StorageSyncManager>, unsigned quota);
StorageAreaImpl(StorageAreaImpl*);
void blockUntilImportComplete() const;
- void dispatchStorageEvent(const String& key, const String& oldValue, const String& newValue, Frame* sourceFrame);
-
StorageType m_storageType;
RefPtr<SecurityOrigin> m_securityOrigin;
RefPtr<StorageMap> m_storageMap;
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp b/src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp
index 2a642b4..ad41e28 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageAreaSync.cpp
@@ -57,6 +57,7 @@ StorageAreaSync::StorageAreaSync(PassRefPtr<StorageSyncManager> storageSyncManag
, m_syncScheduled(false)
, m_importComplete(false)
{
+ ASSERT(isMainThread());
ASSERT(m_storageArea);
ASSERT(m_syncManager);
@@ -68,6 +69,7 @@ StorageAreaSync::StorageAreaSync(PassRefPtr<StorageSyncManager> storageSyncManag
StorageAreaSync::~StorageAreaSync()
{
+ ASSERT(isMainThread());
ASSERT(!m_syncTimer.isActive());
}
@@ -138,7 +140,7 @@ void StorageAreaSync::syncTimerFired(Timer<StorageAreaSync>*)
}
for (; it != end; ++it)
- m_itemsPendingSync.set(it->first.copy(), it->second.copy());
+ m_itemsPendingSync.set(it->first.crossThreadString(), it->second.crossThreadString());
if (!m_syncScheduled) {
m_syncScheduled = true;
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp b/src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp
index f3b3b70..13ccfe9 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageEvent.cpp
@@ -28,7 +28,6 @@
#if ENABLE(DOM_STORAGE)
-#include "DOMWindow.h"
#include "Storage.h"
namespace WebCore {
@@ -42,23 +41,22 @@ StorageEvent::StorageEvent()
{
}
-PassRefPtr<StorageEvent> StorageEvent::create(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea)
+PassRefPtr<StorageEvent> StorageEvent::create(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea)
{
- return adoptRef(new StorageEvent(type, key, oldValue, newValue, uri, source, storageArea));
+ return adoptRef(new StorageEvent(type, key, oldValue, newValue, uri, storageArea));
}
-StorageEvent::StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea)
+StorageEvent::StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea)
: Event(type, false, true)
, m_key(key)
, m_oldValue(oldValue)
, m_newValue(newValue)
, m_uri(uri)
- , m_source(source)
, m_storageArea(storageArea)
{
}
-void StorageEvent::initStorageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea)
+void StorageEvent::initStorageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea)
{
if (dispatched())
return;
@@ -69,7 +67,6 @@ void StorageEvent::initStorageEvent(const AtomicString& type, bool canBubble, bo
m_oldValue = oldValue;
m_newValue = newValue;
m_uri = uri;
- m_source = source;
m_storageArea = storageArea;
}
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageEvent.h b/src/3rdparty/webkit/WebCore/storage/StorageEvent.h
index 7e2bcff..fa7535b 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageEvent.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageEvent.h
@@ -33,37 +33,34 @@
namespace WebCore {
- class DOMWindow;
class Storage;
class StorageEvent : public Event {
public:
static PassRefPtr<StorageEvent> create();
- static PassRefPtr<StorageEvent> create(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea);
+ static PassRefPtr<StorageEvent> create(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea);
const String& key() const { return m_key; }
const String& oldValue() const { return m_oldValue; }
const String& newValue() const { return m_newValue; }
const String& uri() const { return m_uri; }
- DOMWindow* source() const { return m_source.get(); }
Storage* storageArea() const { return m_storageArea.get(); }
- void initStorageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea);
+ void initStorageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea);
// Needed once we support init<blank>EventNS
- // void initStorageEventNS(in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString uriArg, in Window sourceArg, Storage storageAreaArg);
+ // void initStorageEventNS(in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString uriArg, Storage storageAreaArg);
virtual bool isStorageEvent() const { return true; }
private:
StorageEvent();
- StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, PassRefPtr<DOMWindow> source, Storage* storageArea);
+ StorageEvent(const AtomicString& type, const String& key, const String& oldValue, const String& newValue, const String& uri, Storage* storageArea);
String m_key;
String m_oldValue;
String m_newValue;
String m_uri;
- RefPtr<DOMWindow> m_source;
RefPtr<Storage> m_storageArea;
};
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageEvent.idl b/src/3rdparty/webkit/WebCore/storage/StorageEvent.idl
index 5a3f993..7c87561 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageEvent.idl
+++ b/src/3rdparty/webkit/WebCore/storage/StorageEvent.idl
@@ -33,12 +33,11 @@ module storage {
readonly attribute [ConvertNullStringTo=Null] DOMString oldValue;
readonly attribute [ConvertNullStringTo=Null] DOMString newValue;
readonly attribute DOMString uri;
- readonly attribute DOMWindow source;
readonly attribute Storage storageArea;
- void initStorageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in [ConvertNullToNullString] DOMString oldValueArg, in [ConvertNullToNullString] DOMString newValueArg, in DOMString uriArg, in DOMWindow sourceArg, in Storage storageAreaArg);
+ void initStorageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in [ConvertNullToNullString] DOMString oldValueArg, in [ConvertNullToNullString] DOMString newValueArg, in DOMString uriArg, in Storage storageAreaArg);
// Needed once we support init<blank>EventNS
- // void initStorageEventNS(in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString uriArg, in DOMWindow sourceArg, in Storage storageAreaArg);
+ // void initStorageEventNS(in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString uriArg, in Storage storageAreaArg);
};
}
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageEventDispatcher.cpp b/src/3rdparty/webkit/WebCore/storage/StorageEventDispatcher.cpp
new file mode 100644
index 0000000..d2eab66
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/storage/StorageEventDispatcher.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "StorageEventDispatcher.h"
+
+#if ENABLE(DOM_STORAGE)
+
+#include "DOMWindow.h"
+#include "EventNames.h"
+#include "Frame.h"
+#include "Page.h"
+#include "PageGroup.h"
+#include "SecurityOrigin.h"
+#include "StorageEvent.h"
+
+namespace WebCore {
+
+void StorageEventDispatcher::dispatch(const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* securityOrigin, Frame* sourceFrame)
+{
+ Page* page = sourceFrame->page();
+ if (!page)
+ return;
+
+ // We need to copy all relevant frames from every page to a vector since sending the event to one frame might mutate the frame tree
+ // of any given page in the group or mutate the page group itself.
+ Vector<RefPtr<Frame> > frames;
+ if (storageType == SessionStorage) {
+ // Send events only to our page.
+ for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
+ if (frame->document()->securityOrigin()->equal(securityOrigin))
+ frames.append(frame);
+ }
+
+ for (unsigned i = 0; i < frames.size(); ++i)
+ frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documentURI(), frames[i]->domWindow()->sessionStorage()));
+ } else {
+ // Send events to every page.
+ const HashSet<Page*>& pages = page->group().pages();
+ HashSet<Page*>::const_iterator end = pages.end();
+ for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) {
+ for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
+ if (frame->document()->securityOrigin()->equal(securityOrigin))
+ frames.append(frame);
+ }
+ }
+
+ for (unsigned i = 0; i < frames.size(); ++i)
+ frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, sourceFrame->document()->documentURI(), frames[i]->domWindow()->localStorage()));
+ }
+}
+
+}
+
+#endif // ENABLE(DOM_STORAGE)
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageMap.cpp b/src/3rdparty/webkit/WebCore/storage/StorageMap.cpp
index 6ddf323..5498d9e 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageMap.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageMap.cpp
@@ -30,20 +30,22 @@
namespace WebCore {
-PassRefPtr<StorageMap> StorageMap::create()
+PassRefPtr<StorageMap> StorageMap::create(unsigned quota)
{
- return adoptRef(new StorageMap);
+ return adoptRef(new StorageMap(quota));
}
-StorageMap::StorageMap()
+StorageMap::StorageMap(unsigned quota)
: m_iterator(m_map.end())
, m_iteratorIndex(UINT_MAX)
+ , m_quotaSize(quota) // quota measured in bytes
+ , m_currentLength(0)
{
}
PassRefPtr<StorageMap> StorageMap::copy()
{
- RefPtr<StorageMap> newMap = create();
+ RefPtr<StorageMap> newMap = create(m_quotaSize);
newMap->m_map = m_map;
return newMap.release();
}
@@ -54,7 +56,7 @@ void StorageMap::invalidateIterator()
m_iteratorIndex = UINT_MAX;
}
-void StorageMap::setIteratorToIndex(unsigned index) const
+void StorageMap::setIteratorToIndex(unsigned index)
{
// FIXME: Once we have bidirectional iterators for HashMap we can be more intelligent about this.
// The requested index will be closest to begin(), our current iterator, or end(), and we
@@ -82,7 +84,7 @@ unsigned StorageMap::length() const
return m_map.size();
}
-String StorageMap::key(unsigned index) const
+String StorageMap::key(unsigned index)
{
if (index >= length())
return String();
@@ -96,27 +98,34 @@ String StorageMap::getItem(const String& key) const
return m_map.get(key);
}
-PassRefPtr<StorageMap> StorageMap::setItem(const String& key, const String& value, String& oldValue)
+PassRefPtr<StorageMap> StorageMap::setItem(const String& key, const String& value, String& oldValue, bool& quotaException)
{
ASSERT(!value.isNull());
+ quotaException = false;
// Implement copy-on-write semantics here. We're guaranteed that the only refs of StorageMaps belong to Storage objects
// so if more than one Storage object refs this map, copy it before mutating it.
if (refCount() > 1) {
RefPtr<StorageMap> newStorageMap = copy();
- newStorageMap->setItem(key, value, oldValue);
+ newStorageMap->setItem(key, value, oldValue, quotaException);
return newStorageMap.release();
}
- pair<HashMap<String, String>::iterator, bool> addResult = m_map.add(key, value);
+ // Quota tracking. If the quota is enabled and this would go over it, bail.
+ oldValue = m_map.get(key);
+ unsigned newLength = m_currentLength + value.length() - oldValue.length();
+ bool overQuota = newLength > m_quotaSize / sizeof(UChar);
+ bool overflow = (newLength > m_currentLength) != (value.length() > oldValue.length());
+ ASSERT(!overflow); // If we're debugging, make a fuss. But it's still worth checking this in the following if statement.
+ if (m_quotaSize != noQuota && (overflow || overQuota)) {
+ quotaException = true;
+ return 0;
+ }
+ m_currentLength = newLength;
- if (addResult.second) {
- // There was no "oldValue" so null it out.
- oldValue = String();
- } else {
- oldValue = addResult.first->second;
+ pair<HashMap<String, String>::iterator, bool> addResult = m_map.add(key, value);
+ if (!addResult.second)
addResult.first->second = value;
- }
invalidateIterator();
@@ -137,6 +146,10 @@ PassRefPtr<StorageMap> StorageMap::removeItem(const String& key, String& oldValu
if (!oldValue.isNull())
invalidateIterator();
+ // Update quota.
+ ASSERT(m_currentLength - oldValue.length() <= m_currentLength);
+ m_currentLength -= oldValue.length();
+
return 0;
}
@@ -145,14 +158,18 @@ bool StorageMap::contains(const String& key) const
return m_map.contains(key);
}
-void StorageMap::importItem(const String& key, const String& value) const
+void StorageMap::importItem(const String& key, const String& value)
{
// Be sure to copy the keys/values as items imported on a background thread are destined
// to cross a thread boundary
- pair<HashMap<String, String>::iterator, bool> result = m_map.add(key.copy(), String());
+ pair<HashMap<String, String>::iterator, bool> result = m_map.add(key.threadsafeCopy(), String());
if (result.second)
- result.first->second = value.copy();
+ result.first->second = value.threadsafeCopy();
+
+ // Update quota.
+ ASSERT(m_currentLength + value.length() >= m_currentLength);
+ m_currentLength += value.length();
}
}
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageMap.h b/src/3rdparty/webkit/WebCore/storage/StorageMap.h
index afb90bb..fa5f46c 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageMap.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageMap.h
@@ -39,27 +39,35 @@ namespace WebCore {
class StorageMap : public RefCounted<StorageMap> {
public:
- static PassRefPtr<StorageMap> create();
+ // Quota size mesured in bytes.
+ static PassRefPtr<StorageMap> create(unsigned quotaSize);
unsigned length() const;
- String key(unsigned index) const;
+ String key(unsigned index);
String getItem(const String&) const;
- PassRefPtr<StorageMap> setItem(const String& key, const String& value, String& oldValue);
+ PassRefPtr<StorageMap> setItem(const String& key, const String& value, String& oldValue, bool& quota_exception);
PassRefPtr<StorageMap> removeItem(const String&, String& oldValue);
bool contains(const String& key) const;
- void importItem(const String& key, const String& value) const;
+ void importItem(const String& key, const String& value);
+
+ unsigned quota() const { return m_quotaSize; }
+
+ static const unsigned noQuota = UINT_MAX;
private:
- StorageMap();
+ StorageMap(unsigned quota);
PassRefPtr<StorageMap> copy();
void invalidateIterator();
- void setIteratorToIndex(unsigned) const;
+ void setIteratorToIndex(unsigned);
+
+ HashMap<String, String> m_map;
+ HashMap<String, String>::iterator m_iterator;
+ unsigned m_iteratorIndex;
- mutable HashMap<String, String> m_map;
- mutable HashMap<String, String>::iterator m_iterator;
- mutable unsigned m_iteratorIndex;
+ unsigned m_quotaSize; // Measured in bytes.
+ unsigned m_currentLength; // Measured in UChars.
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp b/src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp
index 6fcae63..6b8caeb 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageNamespace.cpp
@@ -36,9 +36,9 @@
namespace WebCore {
-PassRefPtr<StorageNamespace> StorageNamespace::localStorageNamespace(const String& path)
+PassRefPtr<StorageNamespace> StorageNamespace::localStorageNamespace(const String& path, unsigned quota)
{
- return StorageNamespaceImpl::localStorageNamespace(path);
+ return StorageNamespaceImpl::localStorageNamespace(path, quota);
}
PassRefPtr<StorageNamespace> StorageNamespace::sessionStorageNamespace()
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageNamespace.h b/src/3rdparty/webkit/WebCore/storage/StorageNamespace.h
index 6866746..0ac5f86 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageNamespace.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageNamespace.h
@@ -41,7 +41,7 @@ namespace WebCore {
// This interface is required for Chromium since these actions need to be proxied between processes.
class StorageNamespace : public RefCounted<StorageNamespace> {
public:
- static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path);
+ static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path, unsigned quota);
static PassRefPtr<StorageNamespace> sessionStorageNamespace();
virtual ~StorageNamespace() { }
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp b/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp
index d5af31f..19ff6b4 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.cpp
@@ -31,6 +31,7 @@
#include "SecurityOriginHash.h"
#include "StringHash.h"
#include "StorageAreaImpl.h"
+#include "StorageMap.h"
#include "StorageSyncManager.h"
#include <wtf/StdLibExtras.h>
@@ -44,12 +45,12 @@ static LocalStorageNamespaceMap& localStorageNamespaceMap()
return localStorageNamespaceMap;
}
-PassRefPtr<StorageNamespace> StorageNamespaceImpl::localStorageNamespace(const String& path)
+PassRefPtr<StorageNamespace> StorageNamespaceImpl::localStorageNamespace(const String& path, unsigned quota)
{
const String lookupPath = path.isNull() ? String("") : path;
LocalStorageNamespaceMap::iterator it = localStorageNamespaceMap().find(lookupPath);
if (it == localStorageNamespaceMap().end()) {
- RefPtr<StorageNamespace> storageNamespace = adoptRef(new StorageNamespaceImpl(LocalStorage, lookupPath));
+ RefPtr<StorageNamespace> storageNamespace = adoptRef(new StorageNamespaceImpl(LocalStorage, lookupPath, quota));
localStorageNamespaceMap().set(lookupPath, storageNamespace.get());
return storageNamespace.release();
}
@@ -59,13 +60,14 @@ PassRefPtr<StorageNamespace> StorageNamespaceImpl::localStorageNamespace(const S
PassRefPtr<StorageNamespace> StorageNamespaceImpl::sessionStorageNamespace()
{
- return adoptRef(new StorageNamespaceImpl(SessionStorage, String()));
+ return adoptRef(new StorageNamespaceImpl(SessionStorage, String(), StorageMap::noQuota));
}
-StorageNamespaceImpl::StorageNamespaceImpl(StorageType storageType, const String& path)
+StorageNamespaceImpl::StorageNamespaceImpl(StorageType storageType, const String& path, unsigned quota)
: m_storageType(storageType)
- , m_path(path.copy()) // Copy makes it safe for our other thread to access the path.
+ , m_path(path.crossThreadString())
, m_syncManager(0)
+ , m_quota(quota)
, m_isShutdown(false)
{
if (m_storageType == LocalStorage && !m_path.isEmpty())
@@ -91,7 +93,7 @@ PassRefPtr<StorageNamespace> StorageNamespaceImpl::copy()
ASSERT(!m_isShutdown);
ASSERT(m_storageType == SessionStorage);
- StorageNamespaceImpl* newNamespace = new StorageNamespaceImpl(m_storageType, m_path);
+ StorageNamespaceImpl* newNamespace = new StorageNamespaceImpl(m_storageType, m_path, m_quota);
StorageAreaMap::iterator end = m_storageAreaMap.end();
for (StorageAreaMap::iterator i = m_storageAreaMap.begin(); i != end; ++i)
@@ -109,7 +111,7 @@ PassRefPtr<StorageArea> StorageNamespaceImpl::storageArea(PassRefPtr<SecurityOri
if (storageArea = m_storageAreaMap.get(origin))
return storageArea.release();
- storageArea = StorageAreaImpl::create(m_storageType, origin, m_syncManager);
+ storageArea = StorageAreaImpl::create(m_storageType, origin, m_syncManager, m_quota);
m_storageAreaMap.set(origin.release(), storageArea);
return storageArea.release();
}
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h b/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h
index 05a12ad..b81b55a 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageNamespaceImpl.h
@@ -42,7 +42,7 @@ namespace WebCore {
class StorageNamespaceImpl : public StorageNamespace {
public:
- static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path);
+ static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path, unsigned quota);
static PassRefPtr<StorageNamespace> sessionStorageNamespace();
virtual ~StorageNamespaceImpl();
@@ -52,7 +52,7 @@ namespace WebCore {
virtual void unlock();
private:
- StorageNamespaceImpl(StorageType, const String& path);
+ StorageNamespaceImpl(StorageType, const String& path, unsigned quota);
typedef HashMap<RefPtr<SecurityOrigin>, RefPtr<StorageAreaImpl>, SecurityOriginHash> StorageAreaMap;
StorageAreaMap m_storageAreaMap;
@@ -63,6 +63,7 @@ namespace WebCore {
String m_path;
RefPtr<StorageSyncManager> m_syncManager;
+ unsigned m_quota; // The default quota for each new storage area.
bool m_isShutdown;
};
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp b/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp
index 961b9b2..f9276dd 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp
+++ b/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.cpp
@@ -48,8 +48,9 @@ PassRefPtr<StorageSyncManager> StorageSyncManager::create(const String& path)
}
StorageSyncManager::StorageSyncManager(const String& path)
- : m_path(path.copy())
+ : m_path(path.crossThreadString())
{
+ ASSERT(isMainThread());
ASSERT(!m_path.isEmpty());
m_thread = LocalStorageThread::create();
m_thread->start();
@@ -57,6 +58,7 @@ StorageSyncManager::StorageSyncManager(const String& path)
StorageSyncManager::~StorageSyncManager()
{
+ ASSERT(isMainThread());
}
String StorageSyncManager::fullDatabaseFilename(SecurityOrigin* origin)
@@ -85,7 +87,7 @@ bool StorageSyncManager::scheduleImport(PassRefPtr<StorageAreaSync> area)
ASSERT(isMainThread());
if (m_thread)
- m_thread->scheduleImport(area);
+ m_thread->scheduleImport(area.get());
return m_thread;
}
@@ -95,7 +97,7 @@ void StorageSyncManager::scheduleSync(PassRefPtr<StorageAreaSync> area)
ASSERT(isMainThread());
if (m_thread)
- m_thread->scheduleSync(area);
+ m_thread->scheduleSync(area.get());
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h b/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h
index b8c817f..fe35e3d 100644
--- a/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h
+++ b/src/3rdparty/webkit/WebCore/storage/StorageSyncManager.h
@@ -31,8 +31,8 @@
#include "PlatformString.h"
#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
-#include <wtf/Threading.h>
namespace WebCore {
@@ -40,7 +40,7 @@ namespace WebCore {
class SecurityOrigin;
class StorageAreaSync;
- class StorageSyncManager : public ThreadSafeShared<StorageSyncManager> {
+ class StorageSyncManager : public RefCounted<StorageSyncManager> {
public:
static PassRefPtr<StorageSyncManager> create(const String& path);
~StorageSyncManager();
diff --git a/src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h b/src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h
index fc59465..0aefbac 100644
--- a/src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h
+++ b/src/3rdparty/webkit/WebCore/svg/LinearGradientAttributes.h
@@ -29,10 +29,10 @@
namespace WebCore {
struct LinearGradientAttributes : GradientAttributes {
LinearGradientAttributes()
- : m_x1(0.0)
- , m_y1(0.0)
- , m_x2(1.0)
- , m_y2(0.0)
+ : m_x1()
+ , m_y1()
+ , m_x2(LengthModeWidth, "100%")
+ , m_y2()
, m_x1Set(false)
, m_y1Set(false)
, m_x2Set(false)
@@ -40,15 +40,15 @@ namespace WebCore {
{
}
- double x1() const { return m_x1; }
- double y1() const { return m_y1; }
- double x2() const { return m_x2; }
- double y2() const { return m_y2; }
+ SVGLength x1() const { return m_x1; }
+ SVGLength y1() const { return m_y1; }
+ SVGLength x2() const { return m_x2; }
+ SVGLength y2() const { return m_y2; }
- void setX1(double value) { m_x1 = value; m_x1Set = true; }
- void setY1(double value) { m_y1 = value; m_y1Set = true; }
- void setX2(double value) { m_x2 = value; m_x2Set = true; }
- void setY2(double value) { m_y2 = value; m_y2Set = true; }
+ void setX1(const SVGLength& value) { m_x1 = value; m_x1Set = true; }
+ void setY1(const SVGLength& value) { m_y1 = value; m_y1Set = true; }
+ void setX2(const SVGLength& value) { m_x2 = value; m_x2Set = true; }
+ void setY2(const SVGLength& value) { m_y2 = value; m_y2Set = true; }
bool hasX1() const { return m_x1Set; }
bool hasY1() const { return m_y1Set; }
@@ -57,10 +57,10 @@ namespace WebCore {
private:
// Properties
- double m_x1;
- double m_y1;
- double m_x2;
- double m_y2;
+ SVGLength m_x1;
+ SVGLength m_y1;
+ SVGLength m_x2;
+ SVGLength m_y2;
// Property states
bool m_x1Set : 1;
diff --git a/src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h b/src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h
index 273cd29..7645721 100644
--- a/src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h
+++ b/src/3rdparty/webkit/WebCore/svg/RadialGradientAttributes.h
@@ -29,11 +29,11 @@
namespace WebCore {
struct RadialGradientAttributes : GradientAttributes {
RadialGradientAttributes()
- : m_cx(0.5)
- , m_cy(0.5)
- , m_r(0.5)
- , m_fx(0.0)
- , m_fy(0.0)
+ : m_cx(LengthModeWidth, "50%")
+ , m_cy(LengthModeWidth, "50%")
+ , m_r(LengthModeWidth, "50%")
+ , m_fx()
+ , m_fy()
, m_cxSet(false)
, m_cySet(false)
, m_rSet(false)
@@ -42,17 +42,17 @@ namespace WebCore {
{
}
- double cx() const { return m_cx; }
- double cy() const { return m_cy; }
- double r() const { return m_r; }
- double fx() const { return m_fx; }
- double fy() const { return m_fy; }
+ SVGLength cx() const { return m_cx; }
+ SVGLength cy() const { return m_cy; }
+ SVGLength r() const { return m_r; }
+ SVGLength fx() const { return m_fx; }
+ SVGLength fy() const { return m_fy; }
- void setCx(double value) { m_cx = value; m_cxSet = true; }
- void setCy(double value) { m_cy = value; m_cySet = true; }
- void setR(double value) { m_r = value; m_rSet = true; }
- void setFx(double value) { m_fx = value; m_fxSet = true; }
- void setFy(double value) { m_fy = value; m_fySet = true; }
+ void setCx(const SVGLength& value) { m_cx = value; m_cxSet = true; }
+ void setCy(const SVGLength& value) { m_cy = value; m_cySet = true; }
+ void setR(const SVGLength& value) { m_r = value; m_rSet = true; }
+ void setFx(const SVGLength& value) { m_fx = value; m_fxSet = true; }
+ void setFy(const SVGLength& value) { m_fy = value; m_fySet = true; }
bool hasCx() const { return m_cxSet; }
bool hasCy() const { return m_cySet; }
@@ -62,11 +62,11 @@ namespace WebCore {
private:
// Properties
- double m_cx;
- double m_cy;
- double m_r;
- double m_fx;
- double m_fy;
+ SVGLength m_cx;
+ SVGLength m_cy;
+ SVGLength m_r;
+ SVGLength m_fx;
+ SVGLength m_fy;
// Property states
bool m_cxSet : 1;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp
index 6bf7f91..7cb7b3e 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAElement.cpp
@@ -33,6 +33,7 @@
#include "EventNames.h"
#include "Frame.h"
#include "FrameLoader.h"
+#include "FrameLoaderTypes.h"
#include "KeyboardEvent.h"
#include "MappedAttribute.h"
#include "MouseEvent.h"
@@ -53,6 +54,8 @@ SVGAElement::SVGAElement(const QualifiedName& tagName, Document *doc)
, SVGLangSpace()
, SVGExternalResourcesRequired()
, m_target(this, SVGNames::targetAttr)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
@@ -152,7 +155,7 @@ void SVGAElement::defaultEventHandler(Event* evt)
}
#endif
if (document()->frame())
- document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true);
+ document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true, SendReferrer);
}
evt->setDefaultHandled();
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAElement.h b/src/3rdparty/webkit/WebCore/svg/SVGAElement.h
index 8890ca4..a3e59c5 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAElement.h
@@ -3,8 +3,6 @@
2004, 2005 Rob Buis <buis@kde.org>
2007 Eric Seidel <eric@webkit.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -60,11 +58,16 @@ namespace WebCore {
virtual bool childShouldCreateRenderer(Node*) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGAElement, SVGNames::aTagString, SVGNames::targetAttrString, String, Target, target)
+
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGAElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGAElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp b/src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp
index 6ca4539..6606243 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAllInOne.cpp
@@ -67,6 +67,7 @@
#include "SVGFELightElement.cpp"
#include "SVGFEMergeElement.cpp"
#include "SVGFEMergeNodeElement.cpp"
+#include "SVGFEMorphologyElement.cpp"
#include "SVGFEOffsetElement.cpp"
#include "SVGFEPointLightElement.cpp"
#include "SVGFESpecularLightingElement.cpp"
@@ -149,3 +150,4 @@
#include "SVGViewSpec.cpp"
#include "SVGZoomAndPan.cpp"
#include "SVGZoomEvent.cpp"
+#include "SynchronizablePropertyController.cpp"
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.cpp
index d9da3f6..f13edf5 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.cpp
@@ -35,6 +35,7 @@ namespace WebCore {
SVGAltGlyphElement::SVGAltGlyphElement(const QualifiedName& tagName, Document* doc)
: SVGTextPositioningElement(tagName, doc)
+ , m_href(this, XLinkNames::hrefAttr)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.h b/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.h
index 91c99e3..b571880 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAltGlyphElement.h
@@ -47,8 +47,9 @@ namespace WebCore {
SVGGlyphElement* glyphElement() const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
+ private:
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGAltGlyphElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h b/src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h
index 6803055..984046f 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAnimatedProperty.h
@@ -1,5 +1,6 @@
/*
Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ Copyright (C) Research In Motion Limited 2009. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -62,14 +63,16 @@ namespace WebCore {
struct IsDerivedFromSVGElement;
// Helper template used for synchronizing SVG <-> XML properties
- template<typename OwnerElement, typename DecoratedType>
- void synchronizeProperty(const OwnerElement* ownerElement, const QualifiedName& attributeName, DecoratedType baseValue);
+ template<typename OwnerType, typename DecoratedType, bool isDerivedFromSVGElement>
+ struct PropertySynchronizer;
// Abstract base class
class SVGAnimatedPropertyBase : public Noncopyable {
public:
virtual ~SVGAnimatedPropertyBase() { }
virtual void synchronize() const = 0;
+ virtual void startAnimation() const = 0;
+ virtual void stopAnimation() = 0;
};
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -124,6 +127,7 @@ namespace WebCore {
// Tear offs only used by bindings, never in internal code
PassRefPtr<TearOff> animatedTearOff() const;
+ void registerProperty();
virtual void synchronize() const;
void startAnimation() const;
@@ -140,6 +144,10 @@ namespace WebCore {
const AtomicString& m_attributeIdentifier;
mutable SynchronizableTypeWrapper<StorableType> m_value;
+
+#ifndef NDEBUG
+ bool m_registered;
+#endif
};
// SVGAnimatedPropertyTearOff implementation
@@ -186,8 +194,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeName.localName())
, m_value()
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -198,8 +210,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeIdentifier)
, m_value()
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -211,8 +227,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeName.localName())
, m_value(arg1)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -225,8 +245,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeIdentifier)
, m_value(arg1)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -239,8 +263,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeName.localName())
, m_value(arg1, arg2)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -254,8 +282,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeIdentifier)
, m_value(arg1, arg2)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -269,8 +301,12 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeName.localName())
, m_value(arg1, arg2, arg3)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
@@ -285,20 +321,26 @@ namespace WebCore {
, m_attributeName(attributeName)
, m_attributeIdentifier(attributeIdentifier)
, m_value(arg1, arg2, arg3)
+#ifndef NDEBUG
+ , m_registered(false)
+#endif
{
ASSERT(m_ownerType);
+ registerProperty();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::DecoratedType
SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::value() const
{
+ ASSERT(m_registered);
return m_value;
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::setValue(typename SVGAnimatedProperty::DecoratedType newValue)
{
+ ASSERT(m_registered);
m_value = newValue;
ownerElement()->setSynchronizedSVGAttributes(false);
}
@@ -307,6 +349,7 @@ namespace WebCore {
typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::DecoratedType
SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::baseValue() const
{
+ ASSERT(m_registered);
const OwnerElement* ownerElement = this->ownerElement();
SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions();
if (extensions && extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier))
@@ -318,6 +361,7 @@ namespace WebCore {
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::setBaseValue(typename SVGAnimatedProperty::DecoratedType newValue)
{
+ ASSERT(m_registered);
const OwnerElement* ownerElement = this->ownerElement();
SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions();
if (extensions && extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier)) {
@@ -334,25 +378,38 @@ namespace WebCore {
PassRefPtr<typename SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::TearOff>
SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::animatedTearOff() const
{
+ ASSERT(m_registered);
return lookupOrCreateWrapper<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName, TearOff, OwnerElement>(*this, ownerElement(), m_attributeName, m_attributeIdentifier);
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
+ void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::registerProperty()
+ {
+ ASSERT(!m_registered);
+ ownerElement()->propertyController().registerProperty(m_attributeName, this);
+
+#ifndef NDEBUG
+ m_registered = true;
+#endif
+ }
+
+ template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::synchronize() const
{
+ ASSERT(m_registered);
if (!m_value.needsSynchronization())
return;
- synchronizeProperty<OwnerElement, DecoratedType>(ownerElement(), m_attributeName, baseValue());
+ PropertySynchronizer<OwnerElement, DecoratedType, IsDerivedFromSVGElement<OwnerType>::value>::synchronize(ownerElement(), m_attributeName, baseValue());
m_value.setSynchronized();
}
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::startAnimation() const
{
+ ASSERT(m_registered);
const OwnerElement* ownerElement = this->ownerElement();
- SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions();
- if (extensions) {
+ if (SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions()) {
ASSERT(!extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier));
extensions->setBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier, m_value);
}
@@ -361,12 +418,12 @@ namespace WebCore {
template<typename OwnerTypeArg, typename AnimatedTypeArg, const char* TagName, const char* PropertyName>
void SVGAnimatedProperty<OwnerTypeArg, AnimatedTypeArg, TagName, PropertyName>::stopAnimation()
{
+ ASSERT(m_registered);
const OwnerElement* ownerElement = this->ownerElement();
- SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions();
- if (extensions) {
+ if (SVGDocumentExtensions* extensions = ownerElement->accessDocumentSVGExtensions()) {
ASSERT(extensions->hasBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier));
setValue(extensions->baseValue<DecoratedType>(ownerElement, m_attributeIdentifier));
- extensions->removeBaseValue<AnimatedType>(ownerElement, m_attributeIdentifier);
+ extensions->removeBaseValue<DecoratedType>(ownerElement, m_attributeIdentifier);
}
}
@@ -406,39 +463,37 @@ namespace WebCore {
static const bool value = true;
};
- class SVGExternalResourcesRequired;
- template<>
- struct IsDerivedFromSVGElement<SVGExternalResourcesRequired> : Noncopyable {
- static const bool value = false;
- };
-
- class SVGFitToViewBox;
+ class SVGViewSpec;
template<>
- struct IsDerivedFromSVGElement<SVGFitToViewBox> : Noncopyable {
+ struct IsDerivedFromSVGElement<SVGViewSpec> : Noncopyable {
static const bool value = false;
};
- class SVGURIReference;
- template<>
- struct IsDerivedFromSVGElement<SVGURIReference> : Noncopyable {
- static const bool value = false;
+ // PropertySynchronizer implementation
+ template<typename OwnerElement, typename DecoratedType>
+ struct PropertySynchronizer<OwnerElement, DecoratedType, true> : Noncopyable {
+ static void synchronize(const OwnerElement* ownerElement, const QualifiedName& attributeName, DecoratedType baseValue)
+ {
+ AtomicString value(SVGAnimatedTypeValue<DecoratedType>::toString(baseValue));
+
+ NamedNodeMap* namedAttrMap = ownerElement->attributes(false);
+ Attribute* old = namedAttrMap->getAttributeItem(attributeName);
+ if (old && value.isNull())
+ namedAttrMap->removeAttribute(old->name());
+ else if (!old && !value.isNull())
+ namedAttrMap->addAttribute(const_cast<OwnerElement*>(ownerElement)->createAttribute(attributeName, value));
+ else if (old && !value.isNull())
+ old->setValue(value);
+ }
};
- // Central function handling the main SVG<->XML synchronization part.
template<typename OwnerElement, typename DecoratedType>
- void synchronizeProperty(const OwnerElement* ownerElement, const QualifiedName& attributeName, DecoratedType baseValue)
- {
- AtomicString value(SVGAnimatedTypeValue<DecoratedType>::toString(baseValue));
-
- NamedNodeMap* namedAttrMap = ownerElement->attributes(false);
- Attribute* old = namedAttrMap->getAttributeItem(attributeName);
- if (old && value.isNull())
- namedAttrMap->removeAttribute(old->name());
- else if (!old && !value.isNull())
- namedAttrMap->addAttribute(const_cast<OwnerElement*>(ownerElement)->createAttribute(attributeName, value));
- else if (old && !value.isNull())
- old->setValue(value);
- }
+ struct PropertySynchronizer<OwnerElement, DecoratedType, false> : Noncopyable {
+ static void synchronize(const OwnerElement*, const QualifiedName&, DecoratedType)
+ {
+ // no-op, for types not inheriting from Element, thus nothing to synchronize
+ }
+ };
// Helper macro used to register animated properties within SVG* classes
#define ANIMATED_PROPERTY_DECLARATIONS(OwnerType, ElementTag, AttributeTag, AnimatedType, UpperProperty, LowerProperty) \
@@ -451,8 +506,7 @@ namespace WebCore {
void set##UpperProperty(DecoratedTypeFor##UpperProperty type) { m_##LowerProperty.setValue(type); } \
DecoratedTypeFor##UpperProperty LowerProperty##BaseValue() const { return m_##LowerProperty.baseValue(); } \
void set##UpperProperty##BaseValue(DecoratedTypeFor##UpperProperty type) { m_##LowerProperty.setBaseValue(type); } \
- PassRefPtr<SVGAnimatedProperty##UpperProperty::TearOff> LowerProperty##Animated() const { return m_##LowerProperty.animatedTearOff(); } \
- void synchronize##UpperProperty() const { m_##LowerProperty.synchronize(); }
+ PassRefPtr<SVGAnimatedProperty##UpperProperty::TearOff> LowerProperty##Animated() const { return m_##LowerProperty.animatedTearOff(); }
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAnimatedTemplate.h b/src/3rdparty/webkit/WebCore/svg/SVGAnimatedTemplate.h
index 3f04c5b..e7c49c1 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAnimatedTemplate.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAnimatedTemplate.h
@@ -158,7 +158,7 @@ namespace WebCore {
if (!wrapper) {
wrapper = Type::create(creator, element, attrName);
- element->addSVGPropertySynchronizer(attrName, creator);
+ element->propertyController().setPropertyNeedsSynchronization(attrName);
Type::wrapperCache()->set(key, wrapper.get());
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp
index cf945f8..67e32e0 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.cpp
@@ -52,7 +52,8 @@ namespace WebCore {
SVGAnimationElement::SVGAnimationElement(const QualifiedName& tagName, Document* doc)
: SVGSMILElement(tagName, doc)
, SVGTests()
- , SVGExternalResourcesRequired()
+ , SVGExternalResourcesRequired()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
, m_animationValid(false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h b/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h
index 1835a8d..b0b091b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGAnimationElement.h
@@ -1,12 +1,10 @@
/*
- Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+ Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
Copyright (C) 2007 Eric Seidel <eric@webkit.org>
Copyright (C) 2008 Apple Inc. All rights reserved.
Copyright (C) 2008 Cameron McCormack <cam@mcc.id.au>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -66,8 +64,6 @@ namespace WebCore {
static bool attributeIsCSS(const String& attributeName);
protected:
- virtual const SVGElement* contextElement() const { return this; }
-
enum CalcMode { CalcModeDiscrete, CalcModeLinear, CalcModePaced, CalcModeSpline };
CalcMode calcMode() const;
@@ -109,6 +105,11 @@ namespace WebCore {
float calculatePercentForSpline(float percent, unsigned splineIndex) const;
protected:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGAnimationElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
bool m_animationValid;
Vector<String> m_values;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp
index 0c48f51..2329299 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.cpp
@@ -41,6 +41,7 @@ SVGCircleElement::SVGCircleElement(const QualifiedName& tagName, Document* doc)
, m_cx(this, SVGNames::cxAttr, LengthModeWidth)
, m_cy(this, SVGNames::cyAttr, LengthModeHeight)
, m_r(this, SVGNames::rAttr, LengthModeOther)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.h b/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.h
index 598e51f..69b015d 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGCircleElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -47,13 +45,17 @@ namespace WebCore {
virtual Path toPathData() const;
protected:
- virtual const SVGElement* contextElement() const { return this; }
virtual bool hasRelativeValues() const;
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGNames::circleTagString, SVGNames::cxAttrString, SVGLength, Cx, cx)
ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGNames::circleTagString, SVGNames::cyAttrString, SVGLength, Cy, cy)
ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGNames::circleTagString, SVGNames::rAttrString, SVGLength, R, r)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp
index 691e4d5..bbeac91 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.cpp
@@ -40,6 +40,7 @@ SVGClipPathElement::SVGClipPathElement(const QualifiedName& tagName, Document* d
, SVGLangSpace()
, SVGExternalResourcesRequired()
, m_clipPathUnits(this, SVGNames::clipPathUnitsAttr, SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h b/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h
index 4043554..6079159 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGClipPathElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -49,12 +47,14 @@ namespace WebCore {
virtual SVGResource* canvasResource();
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGClipPathElement, SVGNames::clipPathTagString, SVGNames::clipPathUnitsAttrString, int, ClipPathUnits, clipPathUnits)
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGClipPathElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
RefPtr<SVGResourceClipper> m_clipper;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp
index 12e9e5d..b282aa3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.cpp
@@ -40,6 +40,8 @@ SVGCursorElement::SVGCursorElement(const QualifiedName& tagName, Document* doc)
, SVGURIReference()
, m_x(this, SVGNames::xAttr, LengthModeWidth)
, m_y(this, SVGNames::yAttr, LengthModeHeight)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.h b/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.h
index ddafb76..ee919a4 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGCursorElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -50,13 +48,18 @@ namespace WebCore {
virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGNames::cursorTagString, SVGNames::xAttrString, SVGLength, X, x)
ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGNames::cursorTagString, SVGNames::yAttrString, SVGLength, Y, y)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
HashSet<SVGElement*> m_clients;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.cpp
index b084bb2..c03c09b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.cpp
@@ -34,6 +34,7 @@ SVGDefsElement::SVGDefsElement(const QualifiedName& tagName, Document* doc)
, SVGTests()
, SVGLangSpace()
, SVGExternalResourcesRequired()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.h b/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.h
index c4cac62..4bb206e 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGDefsElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -43,8 +41,11 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
+ private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGDefsElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGElement.cpp
index 2169dd6..a16493a 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGElement.cpp
@@ -3,6 +3,7 @@
2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
Copyright (C) 2008 Apple Inc. All rights reserved.
Copyright (C) 2008 Alp Toker <alp@atoker.com>
+ Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -77,16 +78,6 @@ bool SVGElement::isSupported(StringImpl* feature, StringImpl* version) const
return DOMImplementation::hasFeature(feature, version);
}
-String SVGElement::id() const
-{
- return getAttribute(idAttr);
-}
-
-void SVGElement::setId(const String& value, ExceptionCode&)
-{
- setAttribute(idAttr, value);
-}
-
String SVGElement::xmlbase() const
{
return getAttribute(XMLNames::baseAttr);
@@ -243,7 +234,7 @@ void SVGElement::insertedIntoDocument()
StyledElement::insertedIntoDocument();
SVGDocumentExtensions* extensions = document()->accessSVGExtensions();
- String resourceId = SVGURIReference::getTarget(id());
+ String resourceId = SVGURIReference::getTarget(getAttribute(idAttr));
if (extensions->isPendingResource(resourceId)) {
std::auto_ptr<HashSet<SVGStyledElement*> > clients(extensions->removePendingResource(resourceId));
if (clients->isEmpty())
@@ -279,10 +270,10 @@ void SVGElement::updateAnimatedSVGAttribute(const String& name) const
m_synchronizingSVGAttributes = true;
if (name.isEmpty()) {
- invokeAllSVGPropertySynchronizers();
+ m_propertyController.synchronizeAllProperties();
setSynchronizedSVGAttributes(true);
} else
- invokeSVGPropertySynchronizer(name);
+ m_propertyController.synchronizeProperty(name);
m_synchronizingSVGAttributes = false;
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGElement.h b/src/3rdparty/webkit/WebCore/svg/SVGElement.h
index 3a17567..b247a74 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGElement.h
@@ -25,6 +25,7 @@
#if ENABLE(SVG)
#include "StyledElement.h"
#include "SVGAnimatedProperty.h"
+#include "SynchronizablePropertyController.h"
namespace WebCore {
@@ -41,8 +42,6 @@ namespace WebCore {
static PassRefPtr<SVGElement> create(const QualifiedName&, Document*);
virtual ~SVGElement();
- String id() const;
- void setId(const String&, ExceptionCode&);
String xmlbase() const;
void setXmlbase(const String&, ExceptionCode&);
@@ -79,14 +78,11 @@ namespace WebCore {
HashSet<SVGElementInstance*> instancesForElement() const;
- void addSVGPropertySynchronizer(const QualifiedName& attrName, const SVGAnimatedPropertyBase& base) const
- {
- m_svgPropertyMap.set(attrName.localName(), &base);
- }
-
void setCursorElement(SVGCursorElement* cursorElement) { m_cursorElement = cursorElement; }
void setCursorImageValue(CSSCursorImageValue* cursorImageValue) { m_cursorImageValue = cursorImageValue; }
+ SynchronizablePropertyController& propertyController() const { return m_propertyController; }
+
protected:
SVGElement(const QualifiedName&, Document*);
@@ -108,36 +104,13 @@ namespace WebCore {
virtual void buildPendingResource() { }
- // Inlined methods handling SVG property synchronization
- void invokeSVGPropertySynchronizer(const String& name) const
- {
- if (m_svgPropertyMap.contains(name)) {
- const SVGAnimatedPropertyBase* property = m_svgPropertyMap.get(name);
- ASSERT(property);
-
- property->synchronize();
- }
- }
-
- void invokeAllSVGPropertySynchronizers() const
- {
- HashMap<String, const SVGAnimatedPropertyBase*>::const_iterator it = m_svgPropertyMap.begin();
- const HashMap<String, const SVGAnimatedPropertyBase*>::const_iterator end = m_svgPropertyMap.end();
- for (; it != end; ++it) {
- const SVGAnimatedPropertyBase* property = it->second;
- ASSERT(property);
-
- property->synchronize();
- }
- }
-
void mapInstanceToElement(SVGElementInstance*);
void removeInstanceMapping(SVGElementInstance*);
virtual bool haveLoadedRequiredResources();
ContainerNode* m_shadowParent;
- mutable HashMap<String, const SVGAnimatedPropertyBase*> m_svgPropertyMap;
+ mutable SynchronizablePropertyController m_propertyController;
SVGCursorElement* m_cursorElement;
CSSCursorImageValue* m_cursorImageValue;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGElement.idl b/src/3rdparty/webkit/WebCore/svg/SVGElement.idl
index a1f331f..e4112c1 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGElement.idl
+++ b/src/3rdparty/webkit/WebCore/svg/SVGElement.idl
@@ -25,7 +25,7 @@
module svg {
interface [GenerateNativeConverter, Conditional=SVG] SVGElement : Element {
- attribute [ConvertNullToNullString] DOMString id
+ attribute [ConvertNullToNullString, Reflect] DOMString id
setter raises(DOMException);
attribute [ConvertNullToNullString] DOMString xmlbase
setter raises(DOMException);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp
index 6d56ff8..4c67ff3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.cpp
@@ -42,6 +42,7 @@ SVGEllipseElement::SVGEllipseElement(const QualifiedName& tagName, Document* doc
, m_cy(this, SVGNames::cyAttr, LengthModeHeight)
, m_rx(this, SVGNames::rxAttr, LengthModeWidth)
, m_ry(this, SVGNames::ryAttr, LengthModeHeight)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.h b/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.h
index 8c7d3a1..5b54fd5 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGEllipseElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -47,7 +45,6 @@ namespace WebCore {
virtual Path toPathData() const;
protected:
- virtual const SVGElement* contextElement() const { return this; }
virtual bool hasRelativeValues() const;
private:
@@ -55,6 +52,11 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGNames::ellipseTagString, SVGNames::cyAttrString, SVGLength, Cy, cy)
ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGNames::ellipseTagString, SVGNames::rxAttrString, SVGLength, Rx, rx)
ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGNames::ellipseTagString, SVGNames::ryAttrString, SVGLength, Ry, ry)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp b/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp
index 640f92e..201ecbf 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.cpp
@@ -35,7 +35,6 @@ namespace WebCore {
char SVGExternalResourcesRequiredIdentifier[] = "SVGExternalResourcesRequired";
SVGExternalResourcesRequired::SVGExternalResourcesRequired()
- : m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.h b/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.h
index e491e4b..f088c82 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGExternalResourcesRequired.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -32,16 +30,11 @@ namespace WebCore {
extern char SVGExternalResourcesRequiredIdentifier[];
class MappedAttribute;
- // FIXME: This is wrong for several reasons:
- // 1. externalResourcesRequired is not animateable according to SVG 1.1 section 5.9
- // 2. externalResourcesRequired should just be part of SVGElement, and default to "false" for all elements
- /*
- SPEC: Note that the SVG DOM
- defines the attribute externalResourcesRequired as being of type SVGAnimatedBoolean, whereas the
- SVG language definition says that externalResourcesRequired is not animated. Because the SVG
- language definition states that externalResourcesRequired cannot be animated, the animVal will
- always be the same as the baseVal.
- */
+ // Notes on a SVG 1.1 spec discrepancy:
+ // The SVG DOM defines the attribute externalResourcesRequired as being of type SVGAnimatedBoolean, whereas the
+ // SVG language definition says that externalResourcesRequired is not animated. Because the SVG language definition
+ // states that externalResourcesRequired cannot be animated, the animVal will always be the same as the baseVal.
+ // FIXME: When implementing animVal support, make sure that animVal==baseVal for externalResourcesRequired
class SVGExternalResourcesRequired {
public:
SVGExternalResourcesRequired();
@@ -50,12 +43,8 @@ namespace WebCore {
bool parseMappedAttribute(MappedAttribute*);
bool isKnownAttribute(const QualifiedName&);
- virtual const SVGElement* contextElement() const = 0;
-
- private:
- ANIMATED_PROPERTY_DECLARATIONS(SVGExternalResourcesRequired, SVGExternalResourcesRequiredIdentifier,
- SVGNames::externalResourcesRequiredAttrString, bool,
- ExternalResourcesRequired, externalResourcesRequired)
+ protected:
+ virtual void setExternalResourcesRequiredBaseValue(SVGAnimatedTypeValue<bool>::DecoratedType type) = 0;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl b/src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl
index 97a13fc..d317997 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFECompositeElement.idl
@@ -38,7 +38,7 @@ module svg {
readonly attribute SVGAnimatedString in1;
readonly attribute SVGAnimatedString in2;
- readonly attribute SVGAnimatedEnumeration _operator;
+ readonly attribute SVGAnimatedEnumeration operator;
readonly attribute SVGAnimatedNumber k1;
readonly attribute SVGAnimatedNumber k2;
readonly attribute SVGAnimatedNumber k3;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp
index ae5ce94..3d80799 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.cpp
@@ -34,7 +34,6 @@ namespace WebCore {
SVGFEFloodElement::SVGFEFloodElement(const QualifiedName& tagName, Document* doc)
: SVGFilterPrimitiveStandardAttributes(tagName, doc)
- , m_in1(this, SVGNames::inAttr)
{
}
@@ -42,28 +41,14 @@ SVGFEFloodElement::~SVGFEFloodElement()
{
}
-void SVGFEFloodElement::parseMappedAttribute(MappedAttribute* attr)
-{
- const String& value = attr->value();
- if (attr->name() == SVGNames::inAttr)
- setIn1BaseValue(value);
- else
- SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr);
-}
-
bool SVGFEFloodElement::build(SVGResourceFilter* filterResource)
{
- FilterEffect* input = filterResource->builder()->getEffectById(in1());
-
- if (!input)
- return false;
-
RefPtr<RenderStyle> filterStyle = styleForRenderer();
Color color = filterStyle->svgStyle()->floodColor();
float opacity = filterStyle->svgStyle()->floodOpacity();
- RefPtr<FilterEffect> effect = FEFlood::create(input, color, opacity);
+ RefPtr<FilterEffect> effect = FEFlood::create(color, opacity);
filterResource->addFilterEffect(this, effect.release());
return true;
@@ -71,6 +56,6 @@ bool SVGFEFloodElement::build(SVGResourceFilter* filterResource)
}
-#endif // ENABLE(SVG)
+#endif // ENABLE(SVG) && ENABLE(FILTERS)
// vim:ts=4:noet
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h
index ca4e18b..e83fc94 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.h
@@ -33,14 +33,10 @@ namespace WebCore {
SVGFEFloodElement(const QualifiedName&, Document*);
virtual ~SVGFEFloodElement();
- virtual void parseMappedAttribute(MappedAttribute*);
virtual bool build(SVGResourceFilter*);
-
- private:
- ANIMATED_PROPERTY_DECLARATIONS(SVGFEFloodElement, SVGNames::feFloodTagString, SVGNames::inAttrString, String, In1, in1)
};
} // namespace WebCore
-#endif // ENABLE(SVG)
+#endif // ENABLE(SVG) && ENABLE(FILTERS)
#endif
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl
index 814bbdf..b3c3180 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEFloodElement.idl
@@ -27,8 +27,5 @@ module svg {
interface [Conditional=SVG&FILTERS, GenerateConstructor] SVGFEFloodElement : SVGElement,
SVGFilterPrimitiveStandardAttributes {
-
- readonly attribute SVGAnimatedString in1;
-
};
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h
index 187c212..c9bb613 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEGaussianBlurElement.h
@@ -24,7 +24,7 @@
#define SVGFEGaussianBlurElement_h
#if ENABLE(SVG) && ENABLE(FILTERS)
-#include "SVGFEGaussianBlur.h"
+#include "FEGaussianBlur.h"
#include "SVGFilterPrimitiveStandardAttributes.h"
namespace WebCore {
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp
index 8122960..269d6b2 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.cpp
@@ -43,6 +43,8 @@ SVGFEImageElement::SVGFEImageElement(const QualifiedName& tagName, Document* doc
, SVGLangSpace()
, SVGExternalResourcesRequired()
, m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h
index 67f3bd5..7c6d89b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEImageElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -49,12 +47,17 @@ namespace WebCore {
virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
virtual bool build(SVGResourceFilter*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGFEImageElement, SVGNames::feImageTagString, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEImageElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEImageElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
CachedResourceHandle<CachedImage> m_cachedImage;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h
index f6e79fb..92947a1 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFELightElement.h
@@ -39,9 +39,6 @@ namespace WebCore {
virtual LightSource* lightSource() const = 0;
virtual void parseMappedAttribute(MappedAttribute*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGFELightElement, SVGFELightElementIdentifier, SVGNames::azimuthAttrString, float, Azimuth, azimuth)
ANIMATED_PROPERTY_DECLARATIONS(SVGFELightElement, SVGFELightElementIdentifier, SVGNames::elevationAttrString, float, Elevation, elevation)
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp
index cb3a781..8f4eed9 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEMergeElement.cpp
@@ -45,6 +45,8 @@ bool SVGFEMergeElement::build(SVGResourceFilter* filterResource)
for (Node* n = firstChild(); n != 0; n = n->nextSibling()) {
if (n->hasTagName(SVGNames::feMergeNodeTag)) {
FilterEffect* mergeEffect = filterResource->builder()->getEffectById(static_cast<SVGFEMergeNodeElement*>(n)->in1());
+ if (!mergeEffect)
+ return false;
mergeInputs.append(mergeEffect);
}
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h
index 4633f98..cdec8d2 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEMergeNodeElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -36,9 +34,6 @@ namespace WebCore {
virtual void parseMappedAttribute(MappedAttribute*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGFEMergeNodeElement, SVGNames::feMergeNodeTagString, SVGNames::inAttrString, String, In1, in1)
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.cpp
new file mode 100644
index 0000000..4a06188
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.cpp
@@ -0,0 +1,88 @@
+/*
+ Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+
+#if ENABLE(SVG) && ENABLE(FILTERS)
+#include "SVGFEMorphologyElement.h"
+
+#include "MappedAttribute.h"
+#include "SVGNames.h"
+#include "SVGParserUtilities.h"
+#include "SVGResourceFilter.h"
+
+namespace WebCore {
+
+char SVGRadiusXAttrIdentifier[] = "SVGRadiusXAttr";
+char SVGRadiusYAttrIdentifier[] = "SVGRadiusYAttr";
+
+SVGFEMorphologyElement::SVGFEMorphologyElement(const QualifiedName& tagName, Document* document)
+ : SVGFilterPrimitiveStandardAttributes(tagName, document)
+ , m_in1(this, SVGNames::inAttr)
+ , m__operator(this, SVGNames::operatorAttr, FEMORPHOLOGY_OPERATOR_ERODE)
+ , m_radiusX(this, SVGNames::radiusAttr)
+ , m_radiusY(this, SVGNames::radiusAttr)
+{
+}
+
+SVGFEMorphologyElement::~SVGFEMorphologyElement()
+{
+}
+
+void SVGFEMorphologyElement::setRadius(float, float)
+{
+ // FIXME: Needs an implementation.
+}
+
+void SVGFEMorphologyElement::parseMappedAttribute(MappedAttribute* attr)
+{
+ const String& value = attr->value();
+ if (attr->name() == SVGNames::operatorAttr) {
+ if (value == "erode")
+ set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_ERODE);
+ else if (value == "dilate")
+ set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_DILATE);
+ } else if (attr->name() == SVGNames::inAttr)
+ setIn1BaseValue(value);
+ else if (attr->name() == SVGNames::radiusAttr) {
+ float x, y;
+ if (parseNumberOptionalNumber(value, x, y)) {
+ setRadiusXBaseValue(x);
+ setRadiusYBaseValue(y);
+ }
+ } else
+ SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr);
+}
+
+bool SVGFEMorphologyElement::build(SVGResourceFilter* filterResource)
+{
+ FilterEffect* input1 = filterResource->builder()->getEffectById(in1());
+
+ if (!input1)
+ return false;
+
+ RefPtr<FilterEffect> effect = FEMorphology::create(input1, static_cast<MorphologyOperatorType>(_operator()), radiusX(), radiusY());
+ filterResource->addFilterEffect(this, effect.release());
+
+ return true;
+}
+
+} //namespace WebCore
+
+#endif // ENABLE(SVG)
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.h
new file mode 100644
index 0000000..6c1aec1
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SVGFEMorphologyElement_h
+#define SVGFEMorphologyElement_h
+
+#if ENABLE(SVG) && ENABLE(FILTERS)
+#include "SVGFEMorphology.h"
+#include "SVGFilterPrimitiveStandardAttributes.h"
+
+namespace WebCore {
+
+ extern char SVGRadiusXAttrIdentifier[];
+ extern char SVGRadiusYAttrIdentifier[];
+
+ class SVGFEMorphologyElement : public SVGFilterPrimitiveStandardAttributes {
+ public:
+ SVGFEMorphologyElement(const QualifiedName&, Document*);
+ virtual ~SVGFEMorphologyElement();
+
+ void setRadius(float radiusX, float radiusY);
+
+ virtual void parseMappedAttribute(MappedAttribute*);
+ virtual bool build(SVGResourceFilter*);
+
+ private:
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEMorphologyElement, SVGNames::feMorphologyTagString, SVGNames::inAttrString, String, In1, in1)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEMorphologyElement, SVGNames::feMorphologyTagString, SVGNames::operatorAttrString, int, _operator, _operator)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEMorphologyElement, SVGNames::feMorphologyTagString, SVGRadiusXAttrIdentifier, float, RadiusX, radiusX)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFEMorphologyElement, SVGNames::feMorphologyTagString, SVGRadiusYAttrIdentifier, float, RadiusY, radiusY)
+ };
+
+} // namespace WebCore
+
+#endif // ENABLE(SVG)
+#endif
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.idl b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.idl
new file mode 100644
index 0000000..cce0e36
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFEMorphologyElement.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module svg {
+
+ interface [Conditional=SVG&FILTERS, GenerateConstructor] SVGFEMorphologyElement : SVGElement,
+ SVGFilterPrimitiveStandardAttributes {
+ // Morphology Operators
+ const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
+ const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
+ const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
+
+ readonly attribute SVGAnimatedString in1;
+ readonly attribute SVGAnimatedEnumeration operator;
+ readonly attribute SVGAnimatedNumber radiusX;
+ readonly attribute SVGAnimatedNumber radiusY;
+
+ void setRadius(in float radiusX, in float radiusY);
+ };
+
+}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp
index 7703b6f..db46179 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.cpp
@@ -2,6 +2,7 @@
Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
This file is part of the KDE project
@@ -54,6 +55,8 @@ SVGFilterElement::SVGFilterElement(const QualifiedName& tagName, Document* doc)
, m_height(this, SVGNames::heightAttr, LengthModeHeight, "120%")
, m_filterResX(this, SVGNames::filterResAttr)
, m_filterResY(this, SVGNames::filterResAttr)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
// Spec: If the x/y attribute is not specified, the effect is as if a value of "-10%" were specified.
// Spec: If the width/height attribute is not specified, the effect is as if a value of "120%" were specified.
@@ -100,39 +103,36 @@ void SVGFilterElement::parseMappedAttribute(MappedAttribute* attr)
}
}
-SVGResource* SVGFilterElement::canvasResource()
+void SVGFilterElement::buildFilter(const FloatRect& targetRect) const
{
- if (!attached())
- return 0;
-
- if (!m_filter)
- m_filter = new SVGResourceFilter();
-
bool filterBBoxMode = filterUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
- m_filter->setFilterBoundingBoxMode(filterBBoxMode);
-
- float _x, _y, _width, _height;
-
- if (filterBBoxMode) {
- _x = x().valueAsPercentage();
- _y = y().valueAsPercentage();
- _width = width().valueAsPercentage();
- _height = height().valueAsPercentage();
- } else {
- m_filter->setXBoundingBoxMode(x().unitType() == LengthTypePercentage);
- m_filter->setYBoundingBoxMode(y().unitType() == LengthTypePercentage);
-
- _x = x().value(this);
- _y = y().value(this);
- _width = width().value(this);
- _height = height().value(this);
- }
-
- m_filter->setFilterRect(FloatRect(_x, _y, _width, _height));
-
bool primitiveBBoxMode = primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
+
+ FloatRect filterBBox;
+ if (filterBBoxMode)
+ filterBBox = FloatRect(x().valueAsPercentage(),
+ y().valueAsPercentage(),
+ width().valueAsPercentage(),
+ height().valueAsPercentage());
+ else
+ filterBBox = FloatRect(x().value(this),
+ y().value(this),
+ width().value(this),
+ height().value(this));
+
+ FloatRect filterRect = filterBBox;
+ if (filterBBoxMode)
+ filterRect = FloatRect(targetRect.x() + filterRect.x() * targetRect.width(),
+ targetRect.y() + filterRect.y() * targetRect.height(),
+ filterRect.width() * targetRect.width(),
+ filterRect.height() * targetRect.height());
+
+ m_filter->setFilterBoundingBox(filterRect);
+ m_filter->setFilterRect(filterBBox);
m_filter->setEffectBoundingBoxMode(primitiveBBoxMode);
+ m_filter->setFilterBoundingBoxMode(filterBBoxMode);
+ // Add effects to the filter
m_filter->builder()->clearEffects();
for (Node* n = firstChild(); n != 0; n = n->nextSibling()) {
SVGElement* element = 0;
@@ -147,12 +147,18 @@ SVGResource* SVGFilterElement::canvasResource()
}
}
}
+}
+SVGResource* SVGFilterElement::canvasResource()
+{
+ if (!attached())
+ return 0;
+
+ if (!m_filter)
+ m_filter = SVGResourceFilter::create(this);
return m_filter.get();
}
}
-#endif // ENABLE(SVG)
-
-// vim:ts=4:noet
+#endif // ENABLE(SVG) && ENABLE(FILTERS)
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h
index 541ec14..836c689 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFilterElement.h
@@ -3,8 +3,6 @@
Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -51,9 +49,6 @@ namespace WebCore {
virtual void parseMappedAttribute(MappedAttribute*);
virtual bool rendererIsNeeded(RenderStyle*) { return false; }
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGNames::filterTagString, SVGNames::filterUnitsAttrString, int, FilterUnits, filterUnits)
ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGNames::filterTagString, SVGNames::primitiveUnitsAttrString, int, PrimitiveUnits, primitiveUnits)
@@ -64,7 +59,19 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGNames::filterTagString, SVGFilterResXIdentifier, long, FilterResX, filterResX)
ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGNames::filterTagString, SVGFilterResYIdentifier, long, FilterResY, filterResY)
- RefPtr<SVGResourceFilter> m_filter;
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ mutable RefPtr<SVGResourceFilter> m_filter;
+
+ private:
+ friend class SVGResourceFilter;
+ void buildFilter(const FloatRect& targetRect) const;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp
index 3eeb625..67c8bff 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp
@@ -1,8 +1,7 @@
/*
Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
-
- This file is part of the KDE project
+ 2009 Dirk Schulze <krit@webkit.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -77,8 +76,6 @@ void SVGFilterPrimitiveStandardAttributes::setStandardAttributes(SVGResourceFilt
ASSERT(resourceFilter);
- float _x, _y, _width, _height;
-
if (this->hasAttribute(SVGNames::xAttr))
filterEffect->setHasX(true);
if (this->hasAttribute(SVGNames::yAttr))
@@ -88,47 +85,19 @@ void SVGFilterPrimitiveStandardAttributes::setStandardAttributes(SVGResourceFilt
if (this->hasAttribute(SVGNames::heightAttr))
filterEffect->setHasHeight(true);
- if (resourceFilter->effectBoundingBoxMode()) {
- _x = x().valueAsPercentage();
- _y = y().valueAsPercentage();
- _width = width().valueAsPercentage();
- _height = height().valueAsPercentage();
- } else {
- // We need to resolve any percentages in filter rect space.
- if (x().unitType() == LengthTypePercentage) {
- filterEffect->setXBoundingBoxMode(true);
- _x = x().valueAsPercentage();
- } else {
- filterEffect->setXBoundingBoxMode(false);
- _x = x().value(this);
- }
-
- if (y().unitType() == LengthTypePercentage) {
- filterEffect->setYBoundingBoxMode(true);
- _y = y().valueAsPercentage();
- } else {
- filterEffect->setYBoundingBoxMode(false);
- _y = y().value(this);
- }
-
- if (width().unitType() == LengthTypePercentage) {
- filterEffect->setWidthBoundingBoxMode(true);
- _width = width().valueAsPercentage();
- } else {
- filterEffect->setWidthBoundingBoxMode(false);
- _width = width().value(this);
- }
-
- if (height().unitType() == LengthTypePercentage) {
- filterEffect->setHeightBoundingBoxMode(true);
- _height = height().valueAsPercentage();
- } else {
- filterEffect->setHeightBoundingBoxMode(false);
- _height = height().value(this);
- }
- }
-
- filterEffect->setSubRegion(FloatRect(_x, _y, _width, _height));
+ FloatRect effectBBox;
+ if (resourceFilter->effectBoundingBoxMode())
+ effectBBox = FloatRect(x().valueAsPercentage(),
+ y().valueAsPercentage(),
+ width().valueAsPercentage(),
+ height().valueAsPercentage());
+ else
+ effectBBox = FloatRect(x().value(this),
+ y().value(this),
+ width().value(this),
+ height().value(this));
+
+ filterEffect->setSubRegion(effectBBox);
}
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h b/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h
index 3cdbb37..cb8ec1c 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -50,7 +48,6 @@ namespace WebCore {
protected:
friend class SVGResourceFilter;
void setStandardAttributes(SVGResourceFilter*, FilterEffect*) const;
- virtual const SVGElement* contextElement() const { return this; }
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGFilterPrimitiveStandardAttributesIdentifier, SVGNames::xAttrString, SVGLength, X, x)
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp
index 847038c..c566a8f 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.cpp
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -25,6 +23,7 @@
#if ENABLE(SVG)
#include "SVGFitToViewBox.h"
+#include "Attr.h"
#include "Document.h"
#include "FloatRect.h"
#include "MappedAttribute.h"
@@ -39,8 +38,6 @@ namespace WebCore {
char SVGFitToViewBoxIdentifier[] = "SVGFitToViewBox";
SVGFitToViewBox::SVGFitToViewBox()
- : m_viewBox(this, SVGNames::viewBoxAttr)
- , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
{
}
@@ -48,9 +45,8 @@ SVGFitToViewBox::~SVGFitToViewBox()
{
}
-bool SVGFitToViewBox::parseViewBox(const UChar*& c, const UChar* end, float& x, float& y, float& w, float& h, bool validate)
+bool SVGFitToViewBox::parseViewBox(Document* doc, const UChar*& c, const UChar* end, float& x, float& y, float& w, float& h, bool validate)
{
- Document* doc = contextElement()->document();
String str(c, end - c);
skipOptionalSpaces(c, end);
@@ -81,24 +77,22 @@ bool SVGFitToViewBox::parseViewBox(const UChar*& c, const UChar* end, float& x,
return true;
}
-TransformationMatrix SVGFitToViewBox::viewBoxToViewTransform(float viewWidth, float viewHeight) const
+TransformationMatrix SVGFitToViewBox::viewBoxToViewTransform(const FloatRect& viewBoxRect, SVGPreserveAspectRatio* preserveAspectRatio, float viewWidth, float viewHeight)
{
- FloatRect viewBoxRect = viewBox();
+ ASSERT(preserveAspectRatio);
if (!viewBoxRect.width() || !viewBoxRect.height())
return TransformationMatrix();
- return preserveAspectRatio()->getCTM(viewBoxRect.x(),
- viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(),
- 0, 0, viewWidth, viewHeight);
+ return preserveAspectRatio->getCTM(viewBoxRect.x(), viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(), 0, 0, viewWidth, viewHeight);
}
-bool SVGFitToViewBox::parseMappedAttribute(MappedAttribute* attr)
+bool SVGFitToViewBox::parseMappedAttribute(Document* document, MappedAttribute* attr)
{
if (attr->name() == SVGNames::viewBoxAttr) {
float x = 0.0f, y = 0.0f, w = 0.0f, h = 0.0f;
const UChar* c = attr->value().characters();
const UChar* end = c + attr->value().length();
- if (parseViewBox(c, end, x, y, w, h))
+ if (parseViewBox(document, c, end, x, y, w, h))
setViewBoxBaseValue(FloatRect(x, y, w, h));
return true;
} else if (attr->name() == SVGNames::preserveAspectRatioAttr) {
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.h b/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.h
index ac03df4..503a0ef 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFitToViewBox.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -38,17 +36,17 @@ namespace WebCore {
SVGFitToViewBox();
virtual ~SVGFitToViewBox();
- bool parseViewBox(const UChar*& start, const UChar* end, float& x, float& y, float& w, float& h, bool validate = true);
- virtual TransformationMatrix viewBoxToViewTransform(float viewWidth, float viewHeight) const;
+ bool parseViewBox(Document*, const UChar*& start, const UChar* end, float& x, float& y, float& w, float& h, bool validate = true);
+ static TransformationMatrix viewBoxToViewTransform(const FloatRect& viewBoxRect, SVGPreserveAspectRatio*, float viewWidth, float viewHeight);
- bool parseMappedAttribute(MappedAttribute*);
+ bool parseMappedAttribute(Document*, MappedAttribute*);
bool isKnownAttribute(const QualifiedName&);
- virtual const SVGElement* contextElement() const = 0;
+ protected:
+ virtual SVGAnimatedTypeValue<FloatRect>::DecoratedType viewBoxBaseValue() const = 0;
+ virtual void setViewBoxBaseValue(SVGAnimatedTypeValue<FloatRect>::DecoratedType type) = 0;
- private:
- ANIMATED_PROPERTY_DECLARATIONS(SVGFitToViewBox, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
- ANIMATED_PROPERTY_DECLARATIONS(SVGFitToViewBox, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+ virtual SVGAnimatedTypeValue<SVGPreserveAspectRatio>::DecoratedType preserveAspectRatioBaseValue() const = 0;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFontElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGFontElement.cpp
index 98321f4..7d62b8c 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFontElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFontElement.cpp
@@ -39,7 +39,8 @@ namespace WebCore {
using namespace SVGNames;
SVGFontElement::SVGFontElement(const QualifiedName& tagName, Document* doc)
- : SVGStyledElement(tagName, doc)
+ : SVGStyledElement(tagName, doc)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
, m_isGlyphCacheValid(false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGFontElement.h b/src/3rdparty/webkit/WebCore/svg/SVGFontElement.h
index 42468da..1fc5136 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGFontElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGFontElement.h
@@ -47,10 +47,12 @@ namespace WebCore {
SVGMissingGlyphElement* firstMissingGlyphElement() const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGFontElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
void ensureGlyphCache() const;
typedef Vector<SVGHorizontalKerningPair> KerningPairVector;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp
index 5cfca8a..1e75741 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.cpp
@@ -43,6 +43,8 @@ SVGForeignObjectElement::SVGForeignObjectElement(const QualifiedName& tagName, D
, m_y(this, SVGNames::yAttr, LengthModeHeight)
, m_width(this, SVGNames::widthAttr, LengthModeWidth)
, m_height(this, SVGNames::heightAttr, LengthModeHeight)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.h b/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.h
index 14dbe68..1848e2b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGForeignObjectElement.h
@@ -1,8 +1,6 @@
/*
Copyright (C) 2006 Apple Computer, Inc.
- This file is part of the WebKit project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -48,14 +46,19 @@ namespace WebCore {
bool childShouldCreateRenderer(Node*) const;
virtual RenderObject* createRenderer(RenderArena* arena, RenderStyle* style);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGNames::foreignObjectTagString, SVGNames::xAttrString, SVGLength, X, x)
ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGNames::foreignObjectTagString, SVGNames::yAttrString, SVGLength, Y, y)
ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGNames::foreignObjectTagString, SVGNames::widthAttrString, SVGLength, Width, width)
ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGNames::foreignObjectTagString, SVGNames::heightAttrString, SVGLength, Height, height)
+
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGGElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGGElement.cpp
index 2b50d74..241f264 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGGElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGGElement.cpp
@@ -34,6 +34,7 @@ SVGGElement::SVGGElement(const QualifiedName& tagName, Document* doc)
, SVGTests()
, SVGLangSpace()
, SVGExternalResourcesRequired()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGGElement.h b/src/3rdparty/webkit/WebCore/svg/SVGGElement.h
index 8e3b368..9cfb5a3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGGElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGGElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -47,10 +45,12 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGGElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
friend class SVGUseElement;
TransformationMatrix localMatrix() const;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp
index 8034286..93e2cb4 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.cpp
@@ -48,6 +48,8 @@ SVGGradientElement::SVGGradientElement(const QualifiedName& tagName, Document* d
, m_spreadMethod(this, SVGNames::spreadMethodAttr)
, m_gradientUnits(this, SVGNames::gradientUnitsAttr, SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
, m_gradientTransform(this, SVGNames::gradientTransformAttr, SVGTransformList::create(SVGNames::gradientTransformAttr))
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.h b/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.h
index 2027258..8413597 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGGradientElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -60,12 +58,18 @@ namespace WebCore {
Vector<SVGGradientStop> buildStops() const;
mutable RefPtr<SVGPaintServerGradient> m_resource;
- virtual const SVGElement* contextElement() const { return this; }
-
protected:
ANIMATED_PROPERTY_DECLARATIONS(SVGGradientElement, SVGGradientElementIdentifier, SVGNames::spreadMethodAttrString, int, SpreadMethod, spreadMethod)
ANIMATED_PROPERTY_DECLARATIONS(SVGGradientElement, SVGGradientElementIdentifier, SVGNames::gradientUnitsAttrString, int, GradientUnits, gradientUnits)
ANIMATED_PROPERTY_DECLARATIONS(SVGGradientElement, SVGGradientElementIdentifier, SVGNames::gradientTransformAttrString, SVGTransformList, GradientTransform, gradientTransform)
+
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGGradientElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGGradientElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp
index 299828f..e29846c 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGImageElement.cpp
@@ -45,7 +45,9 @@ SVGImageElement::SVGImageElement(const QualifiedName& tagName, Document* doc)
, m_y(this, SVGNames::yAttr, LengthModeHeight)
, m_width(this, SVGNames::widthAttr, LengthModeWidth)
, m_height(this, SVGNames::heightAttr, LengthModeHeight)
- , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
, m_imageLoader(this)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGImageElement.h b/src/3rdparty/webkit/WebCore/svg/SVGImageElement.h
index 1d242b5..1bdcdba 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGImageElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGImageElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -61,7 +59,6 @@ namespace WebCore {
protected:
virtual bool haveLoadedRequiredResources();
virtual bool hasRelativeValues() const;
- virtual const SVGElement* contextElement() const { return this; }
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGNames::imageTagString, SVGNames::xAttrString, SVGLength, X, x)
@@ -70,6 +67,14 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGNames::imageTagString, SVGNames::heightAttrString, SVGLength, Height, height)
ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGNames::imageTagString, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
SVGImageLoader m_imageLoader;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp
index cb31178..4f7b7e5 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGLineElement.cpp
@@ -42,6 +42,7 @@ SVGLineElement::SVGLineElement(const QualifiedName& tagName, Document* doc)
, m_y1(this, SVGNames::y1Attr, LengthModeHeight)
, m_x2(this, SVGNames::x2Attr, LengthModeWidth)
, m_y2(this, SVGNames::y2Attr, LengthModeHeight)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGLineElement.h b/src/3rdparty/webkit/WebCore/svg/SVGLineElement.h
index 2d89f5c..a24e009 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGLineElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGLineElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -51,7 +49,6 @@ namespace WebCore {
virtual bool supportsMarkers() const { return true; }
protected:
- virtual const SVGElement* contextElement() const { return this; }
virtual bool hasRelativeValues() const;
private:
@@ -59,6 +56,11 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGNames::lineTagString, SVGNames::y1AttrString, SVGLength, Y1, y1)
ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGNames::lineTagString, SVGNames::x2AttrString, SVGLength, X2, x2)
ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGNames::lineTagString, SVGNames::y2AttrString, SVGLength, Y2, y2)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp
index 9927a50..f5c8cee 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGLinearGradientElement.cpp
@@ -84,8 +84,15 @@ void SVGLinearGradientElement::buildGradient() const
RefPtr<SVGPaintServerLinearGradient> linearGradient = WTF::static_pointer_cast<SVGPaintServerLinearGradient>(m_resource);
- FloatPoint startPoint = FloatPoint::narrowPrecision(attributes.x1(), attributes.y1());
- FloatPoint endPoint = FloatPoint::narrowPrecision(attributes.x2(), attributes.y2());
+ FloatPoint startPoint;
+ FloatPoint endPoint;
+ if (attributes.boundingBoxMode()) {
+ startPoint = FloatPoint(attributes.x1().valueAsPercentage(), attributes.y1().valueAsPercentage());
+ endPoint = FloatPoint(attributes.x2().valueAsPercentage(), attributes.y2().valueAsPercentage());
+ } else {
+ startPoint = FloatPoint(attributes.x1().value(this), attributes.y1().value(this));
+ endPoint = FloatPoint(attributes.x2().value(this), attributes.y2().value(this));
+ }
RefPtr<Gradient> gradient = Gradient::create(startPoint, endPoint);
gradient->setSpreadMethod(attributes.spreadMethod());
@@ -142,16 +149,16 @@ LinearGradientAttributes SVGLinearGradientElement::collectGradientProperties() c
const SVGLinearGradientElement* linear = static_cast<const SVGLinearGradientElement*>(current);
if (!attributes.hasX1() && current->hasAttribute(SVGNames::x1Attr))
- attributes.setX1(linear->x1().valueAsPercentage());
+ attributes.setX1(linear->x1());
if (!attributes.hasY1() && current->hasAttribute(SVGNames::y1Attr))
- attributes.setY1(linear->y1().valueAsPercentage());
+ attributes.setY1(linear->y1());
if (!attributes.hasX2() && current->hasAttribute(SVGNames::x2Attr))
- attributes.setX2(linear->x2().valueAsPercentage());
+ attributes.setX2(linear->x2());
if (!attributes.hasY2() && current->hasAttribute(SVGNames::y2Attr))
- attributes.setY2(linear->y2().valueAsPercentage());
+ attributes.setY2(linear->y2());
}
processedGradients.add(current);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.cpp
index b3214ed..b8c862a 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.cpp
@@ -31,6 +31,8 @@ namespace WebCore {
SVGMPathElement::SVGMPathElement(const QualifiedName& qname, Document* doc)
: SVGElement(qname, doc)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
@@ -47,7 +49,7 @@ void SVGMPathElement::parseMappedAttribute(MappedAttribute* attr)
SVGPathElement* SVGMPathElement::pathElement()
{
- Element* target = document()->getElementById(getTarget(SVGURIReference::href()));
+ Element* target = document()->getElementById(getTarget(href()));
if (target && target->hasTagName(SVGNames::pathTag))
return static_cast<SVGPathElement*>(target);
return 0;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h b/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h
index 988cead..ded6cdf 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMPathElement.h
@@ -1,28 +1,26 @@
/*
- Copyright (C) 2007 Eric Seidel <eric@webkit.org>
-
- This file is part of the WebKit project
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
- */
+ Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
#ifndef SVGMPathElement_h
#define SVGMPathElement_h
-#if ENABLE(SVG)
+#if ENABLE(SVG)
#include "SVGURIReference.h"
#include "SVGExternalResourcesRequired.h"
@@ -31,8 +29,8 @@ namespace WebCore {
class SVGPathElement;
class SVGMPathElement : public SVGElement,
- SVGURIReference,
- SVGExternalResourcesRequired {
+ public SVGURIReference,
+ public SVGExternalResourcesRequired {
public:
SVGMPathElement(const QualifiedName&, Document*);
virtual ~SVGMPathElement();
@@ -41,13 +39,17 @@ namespace WebCore {
SVGPathElement* pathElement();
- protected:
- virtual const SVGElement* contextElement() const { return this; }
+ private:
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMPathElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMPathElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
#endif // ENABLE(SVG)
#endif // SVGMPathElement_h
-
-// vim:ts=4:noet
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp
index b09e718..2e96926 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.cpp
@@ -50,6 +50,9 @@ SVGMarkerElement::SVGMarkerElement(const QualifiedName& tagName, Document* doc)
, m_markerUnits(this, SVGNames::markerUnitsAttr, SVG_MARKERUNITS_STROKEWIDTH)
, m_orientType(this, SVGNames::orientAttr, SVG_MARKER_ORIENT_ANGLE)
, m_orientAngle(this, SVGNames::orientAttr, SVGAngle::create())
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
{
// Spec: If the markerWidth/markerHeight attribute is not specified, the effect is as if a value of "3" were specified.
}
@@ -63,6 +66,11 @@ SVGMarkerElement::~SVGMarkerElement()
detach();
}
+TransformationMatrix SVGMarkerElement::viewBoxToViewTransform(float viewWidth, float viewHeight) const
+{
+ return SVGFitToViewBox::viewBoxToViewTransform(viewBox(), preserveAspectRatio(), viewWidth, viewHeight);
+}
+
void SVGMarkerElement::parseMappedAttribute(MappedAttribute* attr)
{
if (attr->name() == SVGNames::markerUnitsAttr) {
@@ -94,7 +102,7 @@ void SVGMarkerElement::parseMappedAttribute(MappedAttribute* attr)
return;
if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
return;
- if (SVGFitToViewBox::parseMappedAttribute(attr))
+ if (SVGFitToViewBox::parseMappedAttribute(document(), attr))
return;
SVGStyledElement::parseMappedAttribute(attr);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.h b/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.h
index e2e3493..7e08a96 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMarkerElement.h
@@ -58,6 +58,8 @@ namespace WebCore {
SVGMarkerElement(const QualifiedName&, Document*);
virtual ~SVGMarkerElement();
+ TransformationMatrix viewBoxToViewTransform(float viewWidth, float viewHeight) const;
+
void setOrientToAuto();
void setOrientToAngle(PassRefPtr<SVGAngle>);
@@ -68,9 +70,6 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
virtual SVGResource* canvasResource();
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGNames::markerTagString, SVGNames::refXAttrString, SVGLength, RefX, refX)
ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGNames::markerTagString, SVGNames::refYAttrString, SVGLength, RefY, refY)
@@ -80,6 +79,15 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGNames::markerTagString, SVGOrientTypeAttrIdentifier, int, OrientType, orientType)
ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGNames::markerTagString, SVGOrientAngleAttrIdentifier, SVGAngle, OrientAngle, orientAngle)
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ // SVGFitToViewBox
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+
RefPtr<SVGResourceMarker> m_marker;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp
index 6b75527..127f6f4 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.cpp
@@ -55,6 +55,8 @@ SVGMaskElement::SVGMaskElement(const QualifiedName& tagName, Document* doc)
, m_y(this, SVGNames::yAttr, LengthModeHeight, "-10%")
, m_width(this, SVGNames::widthAttr, LengthModeWidth, "120%")
, m_height(this, SVGNames::heightAttr, LengthModeHeight, "120%")
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
// Spec: If the x/y attribute is not specified, the effect is as if a value of "-10%" were specified.
// Spec: If the width/height attribute is not specified, the effect is as if a value of "120%" were specified.
@@ -128,45 +130,45 @@ void SVGMaskElement::childrenChanged(bool changedByParser, Node* beforeChange, N
PassOwnPtr<ImageBuffer> SVGMaskElement::drawMaskerContent(const FloatRect& targetRect, FloatRect& maskDestRect) const
{
// Determine specified mask size
- float xValue;
- float yValue;
- float widthValue;
- float heightValue;
-
- if (maskUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
- xValue = x().valueAsPercentage() * targetRect.width();
- yValue = y().valueAsPercentage() * targetRect.height();
- widthValue = width().valueAsPercentage() * targetRect.width();
- heightValue = height().valueAsPercentage() * targetRect.height();
- } else {
- xValue = x().value(this);
- yValue = y().value(this);
- widthValue = width().value(this);
- heightValue = height().value(this);
- }
-
- IntSize imageSize(lroundf(widthValue), lroundf(heightValue));
+ if (maskUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ maskDestRect = FloatRect(x().valueAsPercentage() * targetRect.width(),
+ y().valueAsPercentage() * targetRect.height(),
+ width().valueAsPercentage() * targetRect.width(),
+ height().valueAsPercentage() * targetRect.height());
+ else
+ maskDestRect = FloatRect(x().value(this),
+ y().value(this),
+ width().value(this),
+ height().value(this));
+
+ IntSize imageSize(lroundf(maskDestRect.width()), lroundf(maskDestRect.height()));
clampImageBufferSizeToViewport(document()->view(), imageSize);
- if (imageSize.width() < static_cast<int>(widthValue))
- widthValue = imageSize.width();
+ if (imageSize.width() < static_cast<int>(maskDestRect.width()))
+ maskDestRect.setWidth(imageSize.width());
- if (imageSize.height() < static_cast<int>(heightValue))
- heightValue = imageSize.height();
+ if (imageSize.height() < static_cast<int>(maskDestRect.height()))
+ maskDestRect.setHeight(imageSize.height());
- OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(imageSize);
+ // FIXME: This changes color space to linearRGB, the default color space
+ // for masking operations in SVG. We need a switch for the other color-space
+ // attribute values sRGB, inherit and auto.
+ OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(imageSize, LinearRGB);
if (!maskImage)
return 0;
- maskDestRect = FloatRect(xValue, yValue, widthValue, heightValue);
+ FloatPoint maskContextLocation = maskDestRect.location();
if (maskUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
maskDestRect.move(targetRect.x(), targetRect.y());
+ if (maskContentUnits() != SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ maskContextLocation.move(targetRect.x(), targetRect.y());
+
GraphicsContext* maskImageContext = maskImage->context();
ASSERT(maskImageContext);
maskImageContext->save();
- maskImageContext->translate(-xValue, -yValue);
+ maskImageContext->translate(-maskContextLocation.x(), -maskContextLocation.y());
if (maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
maskImageContext->save();
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h b/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h
index f2b7ae5..362c730 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGMaskElement.h
@@ -1,8 +1,6 @@
/*
Copyright (C) 2005 Alexander Kellett <lypanov@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -54,9 +52,6 @@ namespace WebCore {
PassOwnPtr<ImageBuffer> drawMaskerContent(const FloatRect& targetRect, FloatRect& maskRect) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGNames::maskTagString, SVGNames::maskUnitsAttrString, int, MaskUnits, maskUnits)
ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGNames::maskTagString, SVGNames::maskContentUnitsAttrString, int, MaskContentUnits, maskContentUnits)
@@ -65,6 +60,14 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGNames::maskTagString, SVGNames::widthAttrString, SVGLength, Width, width)
ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGNames::maskTagString, SVGNames::heightAttrString, SVGLength, Height, height)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
RefPtr<SVGResourceMasker> m_masker;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp
index 172cac1..7079929 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPathElement.cpp
@@ -50,6 +50,7 @@ SVGPathElement::SVGPathElement(const QualifiedName& tagName, Document* doc)
, SVGLangSpace()
, SVGExternalResourcesRequired()
, m_pathLength(this, SVGNames::pathLengthAttr, 0.0f)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPathElement.h b/src/3rdparty/webkit/WebCore/svg/SVGPathElement.h
index 362a85b..7ea010b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPathElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPathElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -99,13 +97,15 @@ namespace WebCore {
virtual bool supportsMarkers() const { return true; }
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
mutable RefPtr<SVGPathSegList> m_pathSegList;
ANIMATED_PROPERTY_DECLARATIONS(SVGPathElement, SVGNames::pathTagString, SVGNames::pathLengthAttrString, float, PathLength, pathLength)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPathElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp
index befca85..34b7db4 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.cpp
@@ -64,6 +64,10 @@ SVGPatternElement::SVGPatternElement(const QualifiedName& tagName, Document* doc
, m_patternUnits(this, SVGNames::patternUnitsAttr, SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
, m_patternContentUnits(this, SVGNames::patternContentUnitsAttr, SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE)
, m_patternTransform(this, SVGNames::patternTransformAttr, SVGTransformList::create(SVGNames::patternTransformAttr))
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
{
}
@@ -110,7 +114,7 @@ void SVGPatternElement::parseMappedAttribute(MappedAttribute* attr)
return;
if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
return;
- if (SVGFitToViewBox::parseMappedAttribute(attr))
+ if (SVGFitToViewBox::parseMappedAttribute(document(), attr))
return;
SVGStyledElement::parseMappedAttribute(attr);
@@ -195,7 +199,7 @@ void SVGPatternElement::buildPattern(const FloatRect& targetRect) const
}
}
- TransformationMatrix viewBoxCTM = viewBoxToViewTransform(patternBoundaries.width(), patternBoundaries.height());
+ TransformationMatrix viewBoxCTM = viewBoxToViewTransform(viewBox(), preserveAspectRatio(), patternBoundaries.width(), patternBoundaries.height());
FloatRect patternBoundariesIncludingOverflow = patternBoundaries;
// Apply objectBoundingBoxMode fixup for patternContentUnits, if viewBox is not set.
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.h b/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.h
index 2e6399c..6a679af 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPatternElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -58,9 +56,6 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
virtual SVGResource* canvasResource();
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGNames::patternTagString, SVGNames::xAttrString, SVGLength, X, x)
ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGNames::patternTagString, SVGNames::yAttrString, SVGLength, Y, y)
@@ -70,6 +65,18 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGNames::patternTagString, SVGNames::patternContentUnitsAttrString, int, PatternContentUnits, patternContentUnits)
ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGNames::patternTagString, SVGNames::patternTransformAttrString, SVGTransformList, PatternTransform, patternTransform)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ // SVGPatternElement
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+
mutable RefPtr<SVGPaintServerPattern> m_resource;
private:
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp
index db39c52..62e53a3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.cpp
@@ -42,6 +42,7 @@ SVGPolyElement::SVGPolyElement(const QualifiedName& tagName, Document* doc)
, SVGLangSpace()
, SVGExternalResourcesRequired()
, SVGAnimatedPoints()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
@@ -117,7 +118,7 @@ void SVGPolyElement::updateAnimatedSVGAttribute(const String& name) const
if (name == SVGNames::pointsAttr.localName()) {
m_synchronizingSVGAttributes = true;
- synchronizeProperty<SVGPolyElement, SVGPointList*>(this, SVGNames::pointsAttr, m_points.get());
+ PropertySynchronizer<SVGPolyElement, SVGPointList*, true>::synchronize(this, SVGNames::pointsAttr, m_points.get());
setSynchronizedSVGAttributes(true);
m_synchronizingSVGAttributes = false;
return;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h b/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h
index 8dd16cd..2ffd150 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGPolyElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -54,10 +52,12 @@ namespace WebCore {
virtual void updateAnimatedSVGAttribute(const String&) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGPolyElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
mutable RefPtr<SVGPointList> m_points;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp
index 23a8579..a9b5cff 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGRadialGradientElement.cpp
@@ -92,29 +92,39 @@ void SVGRadialGradientElement::buildGradient() const
RefPtr<SVGPaintServerRadialGradient> radialGradient = WTF::static_pointer_cast<SVGPaintServerRadialGradient>(m_resource);
- double adjustedFocusX = attributes.fx();
- double adjustedFocusY = attributes.fy();
+ FloatPoint focalPoint;
+ FloatPoint centerPoint;
+ float radius;
+ if (attributes.boundingBoxMode()) {
+ focalPoint = FloatPoint(attributes.fx().valueAsPercentage(), attributes.fy().valueAsPercentage());
+ centerPoint = FloatPoint(attributes.cx().valueAsPercentage(), attributes.cy().valueAsPercentage());
+ radius = attributes.r().valueAsPercentage();
+ } else {
+ focalPoint = FloatPoint(attributes.fx().value(this), attributes.fy().value(this));
+ centerPoint = FloatPoint(attributes.cx().value(this), attributes.cy().value(this));
+ radius = attributes.r().value(this);
+ }
+
+ float adjustedFocusX = focalPoint.x();
+ float adjustedFocusY = focalPoint.y();
- double fdx = attributes.fx() - attributes.cx();
- double fdy = attributes.fy() - attributes.cy();
+ float fdx = focalPoint.x() - centerPoint.x();
+ float fdy = focalPoint.y() - centerPoint.y();
// Spec: If (fx, fy) lies outside the circle defined by (cx, cy) and
// r, set (fx, fy) to the point of intersection of the line through
// (fx, fy) and the circle.
- if (sqrt(fdx * fdx + fdy * fdy) > attributes.r()) {
- double angle = atan2(attributes.fy() * 100.0, attributes.fx() * 100.0);
- adjustedFocusX = cos(angle) * attributes.r();
- adjustedFocusY = sin(angle) * attributes.r();
+ if (sqrt(fdx * fdx + fdy * fdy) > radius) {
+ float angle = atan2f(focalPoint.y() * 100.0f, focalPoint.x() * 100.0f);
+ adjustedFocusX = cosf(angle) * radius;
+ adjustedFocusY = sinf(angle) * radius;
}
- FloatPoint focalPoint = FloatPoint::narrowPrecision(attributes.fx(), attributes.fy());
- FloatPoint centerPoint = FloatPoint::narrowPrecision(attributes.cx(), attributes.cy());
-
RefPtr<Gradient> gradient = Gradient::create(
- FloatPoint::narrowPrecision(adjustedFocusX, adjustedFocusY),
+ FloatPoint(adjustedFocusX, adjustedFocusY),
0.f, // SVG does not support a "focus radius"
centerPoint,
- narrowPrecisionToFloat(attributes.r()));
+ radius);
gradient->setSpreadMethod(attributes.spreadMethod());
Vector<SVGGradientStop> stops = attributes.stops();
@@ -134,7 +144,7 @@ void SVGRadialGradientElement::buildGradient() const
radialGradient->setGradientTransform(attributes.gradientTransform());
radialGradient->setGradientCenter(centerPoint);
radialGradient->setGradientFocal(focalPoint);
- radialGradient->setGradientRadius(narrowPrecisionToFloat(attributes.r()));
+ radialGradient->setGradientRadius(radius);
radialGradient->setGradientStops(attributes.stops());
}
@@ -166,19 +176,19 @@ RadialGradientAttributes SVGRadialGradientElement::collectGradientProperties() c
const SVGRadialGradientElement* radial = static_cast<const SVGRadialGradientElement*>(current);
if (!attributes.hasCx() && current->hasAttribute(SVGNames::cxAttr))
- attributes.setCx(radial->cx().valueAsPercentage());
+ attributes.setCx(radial->cx());
if (!attributes.hasCy() && current->hasAttribute(SVGNames::cyAttr))
- attributes.setCy(radial->cy().valueAsPercentage());
+ attributes.setCy(radial->cy());
if (!attributes.hasR() && current->hasAttribute(SVGNames::rAttr))
- attributes.setR(radial->r().valueAsPercentage());
+ attributes.setR(radial->r());
if (!attributes.hasFx() && current->hasAttribute(SVGNames::fxAttr))
- attributes.setFx(radial->fx().valueAsPercentage());
+ attributes.setFx(radial->fx());
if (!attributes.hasFy() && current->hasAttribute(SVGNames::fyAttr))
- attributes.setFy(radial->fy().valueAsPercentage());
+ attributes.setFy(radial->fy());
}
processedGradients.add(current);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp
index bfb6205..966976a 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGRectElement.cpp
@@ -43,6 +43,7 @@ SVGRectElement::SVGRectElement(const QualifiedName& tagName, Document *doc)
, m_height(this, SVGNames::heightAttr, LengthModeHeight)
, m_rx(this, SVGNames::rxAttr, LengthModeWidth)
, m_ry(this, SVGNames::ryAttr, LengthModeHeight)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGRectElement.h b/src/3rdparty/webkit/WebCore/svg/SVGRectElement.h
index 2937c23..a4d859e 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGRectElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGRectElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -47,7 +45,6 @@ namespace WebCore {
virtual Path toPathData() const;
protected:
- virtual const SVGElement* contextElement() const { return this; }
virtual bool hasRelativeValues() const;
private:
@@ -57,6 +54,11 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGNames::rectTagString, SVGNames::heightAttrString, SVGLength, Height, height)
ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGNames::rectTagString, SVGNames::rxAttrString, SVGLength, Rx, rx)
ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGNames::rectTagString, SVGNames::ryAttrString, SVGLength, Ry, ry)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp
index 29e72b8..2d5008b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.cpp
@@ -66,7 +66,10 @@ SVGSVGElement::SVGSVGElement(const QualifiedName& tagName, Document* doc)
, m_x(this, SVGNames::xAttr, LengthModeWidth)
, m_y(this, SVGNames::yAttr, LengthModeHeight)
, m_width(this, SVGNames::widthAttr, LengthModeWidth, "100%")
- , m_height(this, SVGNames::heightAttr, LengthModeHeight, "100%")
+ , m_height(this, SVGNames::heightAttr, LengthModeHeight, "100%")
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
, m_useCurrentView(false)
, m_timeContainer(SMILTimeContainer::create(this))
, m_viewSpec(0)
@@ -261,7 +264,7 @@ void SVGSVGElement::parseMappedAttribute(MappedAttribute* attr)
return;
if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
return;
- if (SVGFitToViewBox::parseMappedAttribute(attr))
+ if (SVGFitToViewBox::parseMappedAttribute(document(), attr))
return;
if (SVGZoomAndPan::parseMappedAttribute(attr))
return;
@@ -513,13 +516,8 @@ TransformationMatrix SVGSVGElement::viewBoxToViewTransform(float viewWidth, floa
viewBoxRect = currentView()->viewBox();
} else
viewBoxRect = viewBox();
- if (!viewBoxRect.width() || !viewBoxRect.height())
- return TransformationMatrix();
-
- TransformationMatrix ctm = preserveAspectRatio()->getCTM(viewBoxRect.x(),
- viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(),
- 0, 0, viewWidth, viewHeight);
+ TransformationMatrix ctm = SVGFitToViewBox::viewBoxToViewTransform(viewBoxRect, preserveAspectRatio(), viewWidth, viewHeight);
if (useCurrentView() && currentView())
return currentView()->transform()->concatenate().matrix() * ctm;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h b/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h
index 223ebf6..f30e8f6 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSVGElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -128,13 +126,11 @@ namespace WebCore {
virtual void svgAttributeChanged(const QualifiedName&);
- virtual TransformationMatrix viewBoxToViewTransform(float viewWidth, float viewHeight) const;
+ TransformationMatrix viewBoxToViewTransform(float viewWidth, float viewHeight) const;
void inheritViewAttributes(SVGViewElement*);
protected:
- virtual const SVGElement* contextElement() const { return this; }
-
friend class RenderSVGRoot;
friend class RenderSVGViewportContainer;
@@ -148,6 +144,15 @@ namespace WebCore {
ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGNames::svgTagString, SVGNames::widthAttrString, SVGLength, Width, width)
ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGNames::svgTagString, SVGNames::heightAttrString, SVGLength, Height, height)
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ // SVGFitToViewBox
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+
virtual void documentWillBecomeInactive();
virtual void documentDidBecomeActive();
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp
index 587542c..c2f4a6e 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.cpp
@@ -37,6 +37,8 @@ SVGScriptElement::SVGScriptElement(const QualifiedName& tagName, Document* doc,
: SVGElement(tagName, doc)
, SVGURIReference()
, SVGExternalResourcesRequired()
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
, m_data(this, this)
{
m_data.setCreatedByParser(createdByParser);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h b/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h
index f2efc8e..699c535 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGScriptElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -60,7 +58,6 @@ namespace WebCore {
virtual bool shouldExecuteAsJavaScript() const { return false; }
protected:
- virtual const SVGElement* contextElement() const { return this; }
virtual bool haveLoadedRequiredResources();
virtual String sourceAttributeValue() const;
@@ -73,6 +70,15 @@ namespace WebCore {
virtual void dispatchErrorEvent();
private:
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGScriptElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGScriptElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ private:
ScriptElementData m_data;
String m_type;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.cpp
index 2867d00..a07b2a7 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.cpp
@@ -34,6 +34,7 @@ SVGSwitchElement::SVGSwitchElement(const QualifiedName& tagName, Document* doc)
, SVGTests()
, SVGLangSpace()
, SVGExternalResourcesRequired()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h b/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h
index a2be835..f5e9a0d 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSwitchElement.h
@@ -1,9 +1,7 @@
/*
- Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+ Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -22,8 +20,8 @@
#ifndef SVGSwitchElement_h
#define SVGSwitchElement_h
-#if ENABLE(SVG)
+#if ENABLE(SVG)
#include "SVGExternalResourcesRequired.h"
#include "SVGLangSpace.h"
#include "SVGStyledTransformableElement.h"
@@ -44,16 +42,14 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
- mutable bool m_insideRenderSection;
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSwitchElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
#endif // ENABLE(SVG)
#endif
-
-// vim:ts=4:noet
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.cpp
index 073a13d..4155b0c 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.cpp
@@ -34,6 +34,9 @@ SVGSymbolElement::SVGSymbolElement(const QualifiedName& tagName, Document* doc)
, SVGLangSpace()
, SVGExternalResourcesRequired()
, SVGFitToViewBox()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
{
}
@@ -47,7 +50,7 @@ void SVGSymbolElement::parseMappedAttribute(MappedAttribute* attr)
return;
if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
return;
- if (SVGFitToViewBox::parseMappedAttribute(attr))
+ if (SVGFitToViewBox::parseMappedAttribute(document(), attr))
return;
SVGStyledElement::parseMappedAttribute(attr);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.h b/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.h
index a6ccbce..5c68202 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGSymbolElement.h
@@ -1,9 +1,7 @@
/*
- Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+ Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -22,8 +20,8 @@
#ifndef SVGSymbolElement_h
#define SVGSymbolElement_h
-#if ENABLE(SVG)
+#if ENABLE(SVG)
#include "SVGExternalResourcesRequired.h"
#include "SVGFitToViewBox.h"
#include "SVGLangSpace.h"
@@ -44,8 +42,15 @@ namespace WebCore {
virtual bool rendererIsNeeded(RenderStyle*) { return false; }
- protected:
- virtual const SVGElement* contextElement() const { return this; }
+ private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSymbolElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ // SVGFitToViewBox
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSymbolElement, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGSymbolElement, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.cpp
index 872e7c8..5b8640a 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.cpp
@@ -35,6 +35,7 @@ namespace WebCore {
SVGTRefElement::SVGTRefElement(const QualifiedName& tagName, Document* doc)
: SVGTextPositioningElement(tagName, doc)
, SVGURIReference()
+ , m_href(this, XLinkNames::hrefAttr)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.h b/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.h
index 88eeef1..71d40a0 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTRefElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -40,11 +38,11 @@ namespace WebCore {
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
bool childShouldCreateRenderer(Node*) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
void updateReferencedText();
+
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGTRefElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp
index 86009c1..9334304 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.cpp
@@ -52,6 +52,7 @@ SVGTextContentElement::SVGTextContentElement(const QualifiedName& tagName, Docum
, SVGExternalResourcesRequired()
, m_textLength(this, SVGNames::textLengthAttr, LengthModeOther)
, m_lengthAdjust(this, SVGNames::lengthAdjustAttr, LENGTHADJUST_SPACING)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h b/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h
index 9933b2c..9b2c938 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTextContentElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -66,12 +64,14 @@ namespace WebCore {
bool isKnownAttribute(const QualifiedName&);
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, SVGTextContentElementIdentifier, SVGNames::textLengthAttrString, SVGLength, TextLength, textLength)
ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, SVGTextContentElementIdentifier, SVGNames::lengthAdjustAttrString, int, LengthAdjust, lengthAdjust)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp
index 54a4aa2..ebbb628 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.cpp
@@ -41,6 +41,7 @@ SVGTextPathElement::SVGTextPathElement(const QualifiedName& tagName, Document* d
, m_startOffset(this, SVGNames::startOffsetAttr, LengthModeOther)
, m_method(this, SVGNames::methodAttr, SVG_TEXTPATH_METHODTYPE_ALIGN)
, m_spacing(this, SVGNames::spacingAttr, SVG_TEXTPATH_SPACINGTYPE_EXACT)
+ , m_href(this, XLinkNames::hrefAttr)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h b/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h
index 4e8899a..1bfcc8b 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGTextPathElement.h
@@ -1,8 +1,6 @@
/*
Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -64,13 +62,13 @@ namespace WebCore {
bool childShouldCreateRenderer(Node*) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGTextPathElement, SVGNames::textPathTagString, SVGNames::startOffsetAttrString, SVGLength, StartOffset, startOffset)
ANIMATED_PROPERTY_DECLARATIONS(SVGTextPathElement, SVGNames::textPathTagString, SVGNames::methodAttrString, int, Method, method)
ANIMATED_PROPERTY_DECLARATIONS(SVGTextPathElement, SVGNames::textPathTagString, SVGNames::spacingAttrString, int, Spacing, spacing)
+
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGTextPathElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp b/src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp
index 8871229..24febc3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGURIReference.cpp
@@ -30,7 +30,6 @@ namespace WebCore {
char SVGURIReferenceIdentifier[] = "SVGURIReference";
SVGURIReference::SVGURIReference()
- : m_href(this, XLinkNames::hrefAttr)
{
}
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGURIReference.h b/src/3rdparty/webkit/WebCore/svg/SVGURIReference.h
index 35ac640..812fb59 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGURIReference.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGURIReference.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ Copyright (C) 2004, 2005, 2008, 2009 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005 Rob Buis <buis@kde.org>
This file is part of the KDE project
@@ -42,10 +42,8 @@ namespace WebCore {
static String getTarget(const String& url);
- virtual const SVGElement* contextElement() const = 0;
-
- private:
- ANIMATED_PROPERTY_DECLARATIONS(SVGURIReference, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+ protected:
+ virtual void setHrefBaseValue(SVGAnimatedTypeValue<String>::DecoratedType type) = 0;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp
index 0c2abe0..42517bd 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGUseElement.cpp
@@ -65,6 +65,8 @@ SVGUseElement::SVGUseElement(const QualifiedName& tagName, Document* doc)
, m_y(this, SVGNames::yAttr, LengthModeHeight)
, m_width(this, SVGNames::widthAttr, LengthModeWidth)
, m_height(this, SVGNames::heightAttr, LengthModeHeight)
+ , m_href(this, XLinkNames::hrefAttr)
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
{
}
@@ -482,13 +484,7 @@ void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
targetInstance->appendChild(instancePtr.get());
// Enter recursion, appending new instance tree nodes to the "instance" object.
- if (element->hasChildNodes())
- buildInstanceTree(element, instancePtr.get(), foundProblem);
-
- // Spec: If the referenced object is itself a 'use', or if there are 'use' subelements within the referenced
- // object, the instance tree will contain recursive expansion of the indirect references to form a complete tree.
- if (element->hasTagName(SVGNames::useTag))
- handleDeepUseReferencing(static_cast<SVGUseElement*>(element), instancePtr.get(), foundProblem);
+ buildInstanceTree(element, instancePtr.get(), foundProblem);
}
// Spec: If the referenced object is itself a 'use', or if there are 'use' subelements within the referenced
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGUseElement.h b/src/3rdparty/webkit/WebCore/svg/SVGUseElement.h
index 1e5b81c..45ca783 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGUseElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGUseElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -68,15 +66,20 @@ namespace WebCore {
static void removeDisallowedElementsFromSubtree(Node* element);
SVGElementInstance* instanceForShadowTreeElement(Node* element) const;
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGNames::useTagString, SVGNames::xAttrString, SVGLength, X, x)
ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGNames::useTagString, SVGNames::yAttrString, SVGLength, Y, y)
ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGNames::useTagString, SVGNames::widthAttrString, SVGLength, Width, width)
ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGNames::useTagString, SVGNames::heightAttrString, SVGLength, Height, height)
+ // SVGURIReference
+ ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGURIReferenceIdentifier, XLinkNames::hrefAttrString, String, Href, href)
+
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
private:
// Instance tree handling
void buildInstanceTree(SVGElement* target, SVGElementInstance* targetInstance, bool& foundCycle);
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp b/src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp
index 61cb397..af1d1fe 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGViewElement.cpp
@@ -40,6 +40,9 @@ SVGViewElement::SVGViewElement(const QualifiedName& tagName, Document* doc)
, SVGExternalResourcesRequired()
, SVGFitToViewBox()
, SVGZoomAndPan()
+ , m_externalResourcesRequired(this, SVGNames::externalResourcesRequiredAttr, false)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
{
}
@@ -61,7 +64,7 @@ void SVGViewElement::parseMappedAttribute(MappedAttribute* attr)
viewTarget()->reset(attr->value());
else {
if (SVGExternalResourcesRequired::parseMappedAttribute(attr)
- || SVGFitToViewBox::parseMappedAttribute(attr)
+ || SVGFitToViewBox::parseMappedAttribute(document(), attr)
|| SVGZoomAndPan::parseMappedAttribute(attr))
return;
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGViewElement.h b/src/3rdparty/webkit/WebCore/svg/SVGViewElement.h
index 840dea9..33d0ae3 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGViewElement.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGViewElement.h
@@ -2,8 +2,6 @@
Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
2004, 2005, 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -46,10 +44,16 @@ namespace WebCore {
virtual bool rendererIsNeeded(RenderStyle*) { return false; }
- protected:
- virtual const SVGElement* contextElement() const { return this; }
-
private:
+ // SVGExternalResourcesRequired
+ ANIMATED_PROPERTY_DECLARATIONS(SVGViewElement, SVGExternalResourcesRequiredIdentifier,
+ SVGNames::externalResourcesRequiredAttrString, bool,
+ ExternalResourcesRequired, externalResourcesRequired)
+
+ // SVGFitToViewBox
+ ANIMATED_PROPERTY_DECLARATIONS(SVGViewElement, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGViewElement, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+
mutable RefPtr<SVGStringList> m_viewTarget;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp b/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp
index b12b1c2..e6ded33 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.cpp
@@ -1,8 +1,6 @@
/*
Copyright (C) 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -36,8 +34,10 @@ namespace WebCore {
SVGViewSpec::SVGViewSpec(const SVGSVGElement* contextElement)
: SVGFitToViewBox()
, SVGZoomAndPan()
- , m_transform(SVGTransformList::create(SVGNames::transformAttr))
, m_contextElement(contextElement)
+ , m_viewBox(this, SVGNames::viewBoxAttr)
+ , m_preserveAspectRatio(this, SVGNames::preserveAspectRatioAttr, SVGPreserveAspectRatio::create())
+ , m_transform(SVGTransformList::create(SVGNames::transformAttr))
{
}
@@ -55,7 +55,7 @@ void SVGViewSpec::setViewBoxString(const String& viewBox)
float x, y, w, h;
const UChar* c = viewBox.characters();
const UChar* end = c + viewBox.length();
- if (!parseViewBox(c, end, x, y, w, h, false))
+ if (!parseViewBox(m_contextElement->document(), c, end, x, y, w, h, false))
return;
setViewBoxBaseValue(FloatRect(x, y, w, h));
}
@@ -74,12 +74,7 @@ void SVGViewSpec::setViewTargetString(const String& viewTargetString)
SVGElement* SVGViewSpec::viewTarget() const
{
- return static_cast<SVGElement*>(m_contextElement->ownerDocument()->getElementById(m_viewTargetString));
-}
-
-const SVGElement* SVGViewSpec::contextElement() const
-{
- return m_contextElement;
+ return static_cast<SVGElement*>(m_contextElement->document()->getElementById(m_viewTargetString));
}
static const UChar svgViewSpec[] = {'s', 'v', 'g', 'V', 'i', 'e', 'w'};
@@ -111,7 +106,7 @@ bool SVGViewSpec::parseViewSpec(const String& viewSpec)
return false;
currViewSpec++;
float x, y, w, h;
- if (!parseViewBox(currViewSpec, end, x, y, w, h, false))
+ if (!parseViewBox(m_contextElement->document(), currViewSpec, end, x, y, w, h, false))
return false;
setViewBoxBaseValue(FloatRect(x, y, w, h));
if (currViewSpec >= end || *currViewSpec != ')')
diff --git a/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.h b/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.h
index 8624089..090b7ae 100644
--- a/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.h
+++ b/src/3rdparty/webkit/WebCore/svg/SVGViewSpec.h
@@ -1,8 +1,6 @@
/*
Copyright (C) 2007 Rob Buis <buis@kde.org>
- This file is part of the KDE project
-
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
@@ -53,11 +51,16 @@ namespace WebCore {
String viewTargetString() const { return m_viewTargetString; }
SVGElement* viewTarget() const;
- virtual const SVGElement* contextElement() const;
+ const SVGSVGElement* contextElement() const { return m_contextElement; }
private:
- mutable RefPtr<SVGTransformList> m_transform;
const SVGSVGElement* m_contextElement;
+
+ // SVGFitToViewBox
+ ANIMATED_PROPERTY_DECLARATIONS(SVGViewSpec, SVGFitToViewBoxIdentifier, SVGNames::viewBoxAttrString, FloatRect, ViewBox, viewBox)
+ ANIMATED_PROPERTY_DECLARATIONS(SVGViewSpec, SVGFitToViewBoxIdentifier, SVGNames::preserveAspectRatioAttrString, SVGPreserveAspectRatio, PreserveAspectRatio, preserveAspectRatio)
+
+ mutable RefPtr<SVGTransformList> m_transform;
String m_viewTargetString;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.cpp b/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.cpp
new file mode 100644
index 0000000..e969514
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.cpp
@@ -0,0 +1,163 @@
+/*
+ Copyright (C) Research In Motion Limited 2009. All rights reserved.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "config.h"
+
+#if ENABLE(SVG)
+#include "SynchronizablePropertyController.h"
+
+#include "NamedNodeMap.h"
+#include "Node.h"
+#include "SVGAnimatedProperty.h"
+
+namespace WebCore {
+
+SynchronizablePropertyController::SynchronizablePropertyController()
+{
+}
+
+void SynchronizablePropertyController::registerProperty(const QualifiedName& attrName, SVGAnimatedPropertyBase* base)
+{
+ // 'attrName' is ambigious. For instance in SVGMarkerElement both 'orientType' / 'orientAngle'
+ // SVG DOM objects are synchronized with the 'orient' attribute. This why we need a HashSet.
+ SynchronizableProperty property(base);
+
+ PropertyMap::iterator it = m_map.find(attrName.localName());
+ if (it == m_map.end()) {
+ Properties properties;
+ properties.add(property);
+ m_map.set(attrName.localName(), properties);
+ return;
+ }
+
+ Properties& properties = it->second;
+ ASSERT(!properties.isEmpty());
+
+ properties.add(property);
+}
+
+void SynchronizablePropertyController::setPropertyNeedsSynchronization(const QualifiedName& attrName)
+{
+ PropertyMap::iterator itProp = m_map.find(attrName.localName());
+ ASSERT(itProp != m_map.end());
+
+ Properties& properties = itProp->second;
+ ASSERT(!properties.isEmpty());
+
+ Properties::iterator it = properties.begin();
+ Properties::iterator end = properties.end();
+
+ for (; it != end; ++it) {
+ SynchronizableProperty& property = *it;
+ ASSERT(property.base);
+ property.shouldSynchronize = true;
+ }
+}
+
+void SynchronizablePropertyController::synchronizeProperty(const String& name)
+{
+ PropertyMap::iterator itProp = m_map.find(name);
+ if (itProp == m_map.end())
+ return;
+
+ Properties& properties = itProp->second;
+ ASSERT(!properties.isEmpty());
+
+ Properties::iterator it = properties.begin();
+ Properties::iterator end = properties.end();
+
+ for (; it != end; ++it) {
+ SynchronizableProperty& property = *it;
+ ASSERT(property.base);
+
+ if (!property.shouldSynchronize)
+ continue;
+
+ property.base->synchronize();
+ }
+}
+
+void SynchronizablePropertyController::synchronizeAllProperties()
+{
+ if (m_map.isEmpty())
+ return;
+
+ PropertyMap::iterator itProp = m_map.begin();
+ PropertyMap::iterator endProp = m_map.end();
+
+ for (; itProp != endProp; ++itProp) {
+ Properties& properties = itProp->second;
+ ASSERT(!properties.isEmpty());
+
+ Properties::iterator it = properties.begin();
+ Properties::iterator end = properties.end();
+
+ for (; it != end; ++it) {
+ SynchronizableProperty& property = *it;
+ ASSERT(property.base);
+
+ if (!property.shouldSynchronize)
+ continue;
+
+ property.base->synchronize();
+ }
+ }
+}
+
+void SynchronizablePropertyController::startAnimation(const String& name)
+{
+ PropertyMap::iterator itProp = m_map.find(name);
+ if (itProp == m_map.end())
+ return;
+
+ Properties& properties = itProp->second;
+ ASSERT(!properties.isEmpty());
+
+ Properties::iterator it = properties.begin();
+ Properties::iterator end = properties.end();
+
+ for (; it != end; ++it) {
+ SynchronizableProperty& property = *it;
+ ASSERT(property.base);
+ property.base->startAnimation();
+ }
+}
+
+void SynchronizablePropertyController::stopAnimation(const String& name)
+{
+ PropertyMap::iterator itProp = m_map.find(name);
+ if (itProp == m_map.end())
+ return;
+
+ Properties& properties = itProp->second;
+ ASSERT(!properties.isEmpty());
+
+ Properties::iterator it = properties.begin();
+ Properties::iterator end = properties.end();
+
+ for (; it != end; ++it) {
+ SynchronizableProperty& property = *it;
+ ASSERT(property.base);
+ property.base->stopAnimation();
+ }
+}
+
+}
+
+#endif // ENABLE(SVG)
diff --git a/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.h b/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.h
new file mode 100644
index 0000000..b7f101b
--- /dev/null
+++ b/src/3rdparty/webkit/WebCore/svg/SynchronizablePropertyController.h
@@ -0,0 +1,122 @@
+/*
+ Copyright (C) Research In Motion Limited 2009. All rights reserved.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SynchronizablePropertyController_h
+#define SynchronizablePropertyController_h
+
+#if ENABLE(SVG)
+#include "StringHash.h"
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
+#include <wtf/Noncopyable.h>
+
+namespace WebCore {
+
+class QualifiedName;
+class SVGAnimatedPropertyBase;
+
+struct SynchronizableProperty {
+ SynchronizableProperty()
+ : base(0)
+ , shouldSynchronize(false)
+ {
+ }
+
+ explicit SynchronizableProperty(SVGAnimatedPropertyBase* _base)
+ : base(_base)
+ , shouldSynchronize(false)
+ {
+ }
+
+ explicit SynchronizableProperty(WTF::HashTableDeletedValueType)
+ : base(reinterpret_cast<SVGAnimatedPropertyBase*>(-1))
+ , shouldSynchronize(false)
+ {
+ }
+
+ bool isHashTableDeletedValue() const
+ {
+ return base == reinterpret_cast<SVGAnimatedPropertyBase*>(-1);
+ }
+
+ bool operator==(const SynchronizableProperty& other) const
+ {
+ return base == other.base && shouldSynchronize == other.shouldSynchronize;
+ }
+
+ SVGAnimatedPropertyBase* base;
+ bool shouldSynchronize;
+};
+
+struct SynchronizablePropertyHash {
+ static unsigned hash(const SynchronizableProperty& key)
+ {
+ return StringImpl::computeHash(reinterpret_cast<const UChar*>(&key), sizeof(SynchronizableProperty) / sizeof(UChar));
+ }
+
+ static bool equal(const SynchronizableProperty& a, const SynchronizableProperty& b)
+ {
+ return a == b;
+ }
+
+ static const bool safeToCompareToEmptyOrDeleted = true;
+};
+
+struct SynchronizablePropertyHashTraits : WTF::GenericHashTraits<SynchronizableProperty> {
+ static const bool emptyValueIsZero = true;
+
+ static void constructDeletedValue(SynchronizableProperty& slot)
+ {
+ new (&slot) SynchronizableProperty(WTF::HashTableDeletedValue);
+ }
+
+ static bool isDeletedValue(const SynchronizableProperty& value)
+ {
+ return value.isHashTableDeletedValue();
+ }
+};
+
+// Helper class used exclusively by SVGElement to keep track of all animatable properties within a SVGElement,
+// and wheter they are supposed to be synchronized or not (depending wheter AnimatedPropertyTearOff's have been created)
+class SynchronizablePropertyController : public Noncopyable {
+public:
+ void registerProperty(const QualifiedName&, SVGAnimatedPropertyBase*);
+ void setPropertyNeedsSynchronization(const QualifiedName&);
+
+ void synchronizeProperty(const String&);
+ void synchronizeAllProperties();
+
+ void startAnimation(const String&);
+ void stopAnimation(const String&);
+
+private:
+ friend class SVGElement;
+ SynchronizablePropertyController();
+
+private:
+ typedef HashSet<SynchronizableProperty, SynchronizablePropertyHash, SynchronizablePropertyHashTraits> Properties;
+ typedef HashMap<String, Properties> PropertyMap;
+
+ PropertyMap m_map;
+};
+
+};
+
+#endif // ENABLE(SVG)
+#endif // SynchronizablePropertyController_h
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp
index bb68b82..0a506f8 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGImage.cpp
@@ -239,14 +239,13 @@ bool SVGImage::dataChanged(bool allDataReceived)
static DragClient* dummyDragClient = 0;
#endif
static InspectorClient* dummyInspectorClient = new EmptyInspectorClient;
- static PluginHalterClient* dummyPluginHalterClient = new EmptyPluginHalterClient;
m_chromeClient.set(new SVGImageChromeClient(this));
// FIXME: If this SVG ends up loading itself, we might leak the world.
- // THe comment said that the Cache code does not know about CachedImages
+ // The comment said that the Cache code does not know about CachedImages
// holding Frames and won't know to break the cycle. But
- m_page.set(new Page(m_chromeClient.get(), dummyContextMenuClient, dummyEditorClient, dummyDragClient, dummyInspectorClient, dummyPluginHalterClient));
+ m_page.set(new Page(m_chromeClient.get(), dummyContextMenuClient, dummyEditorClient, dummyDragClient, dummyInspectorClient, 0));
m_page->settings()->setJavaScriptEnabled(false);
m_page->settings()->setPluginsEnabled(false);
@@ -256,7 +255,7 @@ bool SVGImage::dataChanged(bool allDataReceived)
ResourceRequest fakeRequest(KURL(ParsedURLString, ""));
FrameLoader* loader = frame->loader();
loader->load(fakeRequest, false); // Make sure the DocumentLoader is created
- loader->cancelContentPolicyCheck(); // cancel any policy checks
+ loader->policyChecker()->cancelCheck(); // cancel any policy checks
loader->commitProvisionalLoad(0);
loader->setResponseMIMEType("image/svg+xml");
loader->begin(KURL()); // create the empty document
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp
index 4a4bdd5..973743c 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.cpp
@@ -31,52 +31,44 @@
#include "PlatformString.h"
#include "SVGFilter.h"
#include "SVGFilterBuilder.h"
+#include "SVGFilterElement.h"
#include "SVGRenderTreeAsText.h"
#include "SVGFilterPrimitiveStandardAttributes.h"
namespace WebCore {
-SVGResourceFilter::SVGResourceFilter()
- : m_filterBBoxMode(false)
+SVGResourceFilter::SVGResourceFilter(const SVGFilterElement* ownerElement)
+ : SVGResource()
+ , m_ownerElement(ownerElement)
+ , m_filterBBoxMode(false)
, m_effectBBoxMode(false)
- , m_xBBoxMode(false)
- , m_yBBoxMode(false)
, m_savedContext(0)
, m_sourceGraphicBuffer(0)
{
m_filterBuilder.set(new SVGFilterBuilder());
}
-void SVGResourceFilter::addFilterEffect(SVGFilterPrimitiveStandardAttributes* effectAttributes, PassRefPtr<FilterEffect> effect)
+SVGResourceFilter::~SVGResourceFilter()
{
- effectAttributes->setStandardAttributes(this, effect.get());
- builder()->add(effectAttributes->result(), effect);
}
-FloatRect SVGResourceFilter::filterBBoxForItemBBox(const FloatRect& itemBBox) const
+void SVGResourceFilter::addFilterEffect(SVGFilterPrimitiveStandardAttributes* effectAttributes, PassRefPtr<FilterEffect> effect)
{
- FloatRect filterBBox = filterRect();
-
- if (filterBoundingBoxMode())
- filterBBox = FloatRect(itemBBox.x() + filterBBox.x() * itemBBox.width(),
- itemBBox.y() + filterBBox.y() * itemBBox.height(),
- filterBBox.width() * itemBBox.width(),
- filterBBox.height() * itemBBox.height());
-
- return filterBBox;
+ effectAttributes->setStandardAttributes(this, effect.get());
+ builder()->add(effectAttributes->result(), effect);
}
void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObject* object)
{
- m_itemBBox = object->objectBoundingBox();
- m_filterBBox = filterBBoxForItemBBox(m_itemBBox);
+ FloatRect targetRect = object->objectBoundingBox();
+ m_ownerElement->buildFilter(targetRect);
// clip sourceImage to filterRegion
- FloatRect clippedSourceRect = m_itemBBox;
+ FloatRect clippedSourceRect = targetRect;
clippedSourceRect.intersect(m_filterBBox);
// prepare Filters
- m_filter = SVGFilter::create(m_itemBBox, m_filterBBox, m_effectBBoxMode, m_filterBBoxMode);
+ m_filter = SVGFilter::create(targetRect, m_filterBBox, m_effectBBoxMode);
FilterEffect* lastEffect = m_filterBuilder->lastEffect();
if (lastEffect)
@@ -91,8 +83,8 @@ void SVGResourceFilter::prepareFilter(GraphicsContext*& context, const RenderObj
return;
GraphicsContext* sourceGraphicContext = sourceGraphic->context();
- sourceGraphicContext->translate(-m_itemBBox.x(), -m_itemBBox.y());
- sourceGraphicContext->clearRect(FloatRect(FloatPoint(), m_itemBBox.size()));
+ sourceGraphicContext->translate(-targetRect.x(), -targetRect.y());
+ sourceGraphicContext->clearRect(FloatRect(FloatPoint(), targetRect.size()));
m_sourceGraphicBuffer.set(sourceGraphic.release());
m_savedContext = context;
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h
index ee1efca..86b11fe 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/SVGResourceFilter.h
@@ -43,11 +43,13 @@ class Filter;
class FilterEffect;
class GraphicsContext;
class SVGFilterBuilder;
+class SVGFilterElement;
class SVGFilterPrimitiveStandardAttributes;
class SVGResourceFilter : public SVGResource {
public:
- SVGResourceFilter();
+ static PassRefPtr<SVGResourceFilter> create(const SVGFilterElement* ownerElement) { return adoptRef(new SVGResourceFilter(ownerElement)); }
+ virtual ~SVGResourceFilter();
virtual SVGResourceType resourceType() const { return FilterResourceType; }
@@ -57,44 +59,31 @@ public:
bool effectBoundingBoxMode() const { return m_effectBBoxMode; }
void setEffectBoundingBoxMode(bool bboxMode) { m_effectBBoxMode = bboxMode; }
- bool xBoundingBoxMode() const { return m_xBBoxMode; }
- void setXBoundingBoxMode(bool bboxMode) { m_xBBoxMode = bboxMode; }
-
- bool yBoundingBoxMode() const { return m_yBBoxMode; }
- void setYBoundingBoxMode(bool bboxMode) { m_yBBoxMode = bboxMode; }
-
FloatRect filterRect() const { return m_filterRect; }
void setFilterRect(const FloatRect& rect) { m_filterRect = rect; }
FloatRect filterBoundingBox() { return m_filterBBox; }
void setFilterBoundingBox(const FloatRect& rect) { m_filterBBox = rect; }
- FloatRect itemBoundingBox() { return m_itemBBox; }
- void setItemBoundingBox(const FloatRect& rect) { m_itemBBox = rect; }
-
- FloatRect filterBBoxForItemBBox(const FloatRect& itemBBox) const;
-
- virtual TextStream& externalRepresentation(TextStream&) const;
-
void prepareFilter(GraphicsContext*&, const RenderObject*);
void applyFilter(GraphicsContext*&, const RenderObject*);
void addFilterEffect(SVGFilterPrimitiveStandardAttributes*, PassRefPtr<FilterEffect>);
SVGFilterBuilder* builder() { return m_filterBuilder.get(); }
+
+ virtual TextStream& externalRepresentation(TextStream&) const;
private:
+ SVGResourceFilter(const SVGFilterElement*);
+
+ const SVGFilterElement* m_ownerElement;
bool m_filterBBoxMode : 1;
bool m_effectBBoxMode : 1;
- bool m_xBBoxMode : 1;
- bool m_yBBoxMode : 1;
-
FloatRect m_filterRect;
-
FloatRect m_filterBBox;
- FloatRect m_itemBBox;
OwnPtr<SVGFilterBuilder> m_filterBuilder;
GraphicsContext* m_savedContext;
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp
index 3f4a6d7..668209f 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.cpp
@@ -31,17 +31,16 @@
namespace WebCore {
-FEFlood::FEFlood(FilterEffect* in, const Color& floodColor, const float& floodOpacity)
+FEFlood::FEFlood(const Color& floodColor, const float& floodOpacity)
: FilterEffect()
- , m_in(in)
, m_floodColor(floodColor)
, m_floodOpacity(floodOpacity)
{
}
-PassRefPtr<FEFlood> FEFlood::create(FilterEffect* in, const Color& floodColor, const float& floodOpacity)
+PassRefPtr<FEFlood> FEFlood::create(const Color& floodColor, const float& floodOpacity)
{
- return adoptRef(new FEFlood(in, floodColor, floodOpacity));
+ return adoptRef(new FEFlood(floodColor, floodOpacity));
}
Color FEFlood::floodColor() const
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h
index 21985db..91795dd 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEFlood.h
@@ -31,7 +31,7 @@ namespace WebCore {
class FEFlood : public FilterEffect {
public:
- static PassRefPtr<FEFlood> create(FilterEffect*, const Color&, const float&);
+ static PassRefPtr<FEFlood> create(const Color&, const float&);
Color floodColor() const;
void setFloodColor(const Color &);
@@ -44,9 +44,8 @@ namespace WebCore {
TextStream& externalRepresentation(TextStream& ts) const;
private:
- FEFlood(FilterEffect*, const Color&, const float&);
+ FEFlood(const Color&, const float&);
- RefPtr<FilterEffect> m_in;
Color m_floodColor;
float m_floodOpacity;
};
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp
deleted file mode 100644
index 601c39e..0000000
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org>
- 2004, 2005 Rob Buis <buis@kde.org>
- 2005 Eric Seidel <eric@webkit.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- aint with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-
-#if ENABLE(SVG) && ENABLE(FILTERS)
-#include "SVGFEGaussianBlur.h"
-#include "SVGRenderTreeAsText.h"
-#include "Filter.h"
-
-namespace WebCore {
-
-FEGaussianBlur::FEGaussianBlur(FilterEffect* in, const float& x, const float& y)
- : FilterEffect()
- , m_in(in)
- , m_x(x)
- , m_y(y)
-{
-}
-
-PassRefPtr<FEGaussianBlur> FEGaussianBlur::create(FilterEffect* in, const float& x, const float& y)
-{
- return adoptRef(new FEGaussianBlur(in, x, y));
-}
-
-float FEGaussianBlur::stdDeviationX() const
-{
- return m_x;
-}
-
-void FEGaussianBlur::setStdDeviationX(float x)
-{
- m_x = x;
-}
-
-float FEGaussianBlur::stdDeviationY() const
-{
- return m_y;
-}
-
-void FEGaussianBlur::setStdDeviationY(float y)
-{
- m_y = y;
-}
-
-void FEGaussianBlur::apply(Filter*)
-{
-}
-
-void FEGaussianBlur::dump()
-{
-}
-
-TextStream& FEGaussianBlur::externalRepresentation(TextStream& ts) const
-{
- ts << "[type=GAUSSIAN-BLUR] ";
- FilterEffect::externalRepresentation(ts);
- ts << " [std dev. x=" << stdDeviationX() << " y=" << stdDeviationY() << "]";
- return ts;
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(SVG) && ENABLE(FILTERS)
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp
index 3767734..f7fc5d8 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.cpp
@@ -28,7 +28,7 @@
namespace WebCore {
-FEMorphology::FEMorphology(FilterEffect* in, MorphologyOperatorType type, const float& radiusX, const float& radiusY)
+FEMorphology::FEMorphology(FilterEffect* in, MorphologyOperatorType type, float radiusX, float radiusY)
: FilterEffect()
, m_in(in)
, m_type(type)
@@ -37,7 +37,7 @@ FEMorphology::FEMorphology(FilterEffect* in, MorphologyOperatorType type, const
{
}
-PassRefPtr<FEMorphology> FEMorphology::create(FilterEffect* in, MorphologyOperatorType type, const float& radiusX, const float& radiusY)
+PassRefPtr<FEMorphology> FEMorphology::create(FilterEffect* in, MorphologyOperatorType type, float radiusX, float radiusY)
{
return adoptRef(new FEMorphology(in, type, radiusX, radiusY));
}
@@ -88,8 +88,8 @@ static TextStream& operator<<(TextStream& ts, MorphologyOperatorType t)
ts << "UNKNOWN"; break;
case FEMORPHOLOGY_OPERATOR_ERODE:
ts << "ERODE"; break;
- case FEMORPHOLOGY_OPERATOR_DIALATE:
- ts << "DIALATE"; break;
+ case FEMORPHOLOGY_OPERATOR_DILATE:
+ ts << "DILATE"; break;
}
return ts;
}
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h
index bdc2b9b..6a321c8 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFEMorphology.h
@@ -31,12 +31,12 @@ namespace WebCore {
enum MorphologyOperatorType {
FEMORPHOLOGY_OPERATOR_UNKNOWN = 0,
FEMORPHOLOGY_OPERATOR_ERODE = 1,
- FEMORPHOLOGY_OPERATOR_DIALATE = 2
+ FEMORPHOLOGY_OPERATOR_DILATE = 2
};
class FEMorphology : public FilterEffect {
public:
- PassRefPtr<FEMorphology> create(FilterEffect*, MorphologyOperatorType, const float&, const float&);
+ static PassRefPtr<FEMorphology> create(FilterEffect*, MorphologyOperatorType, float radiusX, float radiusY);
MorphologyOperatorType morphologyOperator() const;
void setMorphologyOperator(MorphologyOperatorType);
@@ -52,7 +52,7 @@ namespace WebCore {
TextStream& externalRepresentation(TextStream& ts) const;
private:
- FEMorphology(FilterEffect*, MorphologyOperatorType, const float&, const float&);
+ FEMorphology(FilterEffect*, MorphologyOperatorType, float radiusX, float radiusY);
RefPtr<FilterEffect> m_in;
MorphologyOperatorType m_type;
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp
index c892ee9..6bfcf39 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.cpp
@@ -24,12 +24,11 @@
namespace WebCore {
-SVGFilter::SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode, bool filterBBoxMode)
+SVGFilter::SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode)
: Filter()
, m_itemBox(itemBox)
, m_filterRect(filterRect)
, m_effectBBoxMode(effectBBoxMode)
- , m_filterBBoxMode(filterBBoxMode)
{
}
@@ -37,7 +36,6 @@ void SVGFilter::calculateEffectSubRegion(FilterEffect* effect)
{
FloatRect subRegionBBox = effect->subRegion();
FloatRect useBBox = effect->unionOfChildEffectSubregions();
-
FloatRect newSubRegion = subRegionBBox;
if (m_effectBBoxMode) {
@@ -55,17 +53,17 @@ void SVGFilter::calculateEffectSubRegion(FilterEffect* effect)
if (effect->hasHeight())
newSubRegion.setHeight(subRegionBBox.height() * m_itemBox.height());
} else {
- if (effect->xBoundingBoxMode())
- newSubRegion.setX(useBBox.x() + subRegionBBox.x() * useBBox.width());
+ if (!effect->hasX())
+ newSubRegion.setX(useBBox.x());
- if (effect->yBoundingBoxMode())
- newSubRegion.setY(useBBox.y() + subRegionBBox.y() * useBBox.height());
+ if (!effect->hasY())
+ newSubRegion.setY(useBBox.y());
- if (effect->widthBoundingBoxMode())
- newSubRegion.setWidth(subRegionBBox.width() * useBBox.width());
+ if (!effect->hasWidth())
+ newSubRegion.setWidth(useBBox.width());
- if (effect->heightBoundingBoxMode())
- newSubRegion.setHeight(subRegionBBox.height() * useBBox.height());
+ if (!effect->hasHeight())
+ newSubRegion.setHeight(useBBox.height());
}
// clip every filter effect to the filter region
@@ -74,9 +72,9 @@ void SVGFilter::calculateEffectSubRegion(FilterEffect* effect)
effect->setSubRegion(newSubRegion);
}
-PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode, bool filterBBoxMode)
+PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode)
{
- return adoptRef(new SVGFilter(itemBox, filterRect, effectBBoxMode, filterBBoxMode));
+ return adoptRef(new SVGFilter(itemBox, filterRect, effectBBoxMode));
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h
index d6e5f77..f23d1ea 100644
--- a/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h
+++ b/src/3rdparty/webkit/WebCore/svg/graphics/filters/SVGFilter.h
@@ -33,7 +33,7 @@ namespace WebCore {
class SVGFilter : public Filter {
public:
- static PassRefPtr<SVGFilter> create(const FloatRect&, const FloatRect&, bool, bool);
+ static PassRefPtr<SVGFilter> create(const FloatRect&, const FloatRect&, bool);
bool effectBoundingBoxMode() { return m_effectBBoxMode; }
@@ -42,12 +42,11 @@ namespace WebCore {
void calculateEffectSubRegion(FilterEffect*);
private:
- SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool itemBBoxMode, bool filterBBoxMode);
+ SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode);
FloatRect m_itemBox;
FloatRect m_filterRect;
bool m_effectBBoxMode;
- bool m_filterBBoxMode;
};
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/svg/svgtags.in b/src/3rdparty/webkit/WebCore/svg/svgtags.in
index 471c77b..30a0e4c 100644
--- a/src/3rdparty/webkit/WebCore/svg/svgtags.in
+++ b/src/3rdparty/webkit/WebCore/svg/svgtags.in
@@ -47,9 +47,7 @@ feGaussianBlur createWithNew
feImage createWithNew
feMerge createWithNew
feMergeNode createWithNew
-#if 0
feMorphology createWithNew
-#endif
feOffset createWithNew
fePointLight createWithNew
feSpecularLighting createWithNew
diff --git a/src/3rdparty/webkit/WebCore/websockets/WebSocket.cpp b/src/3rdparty/webkit/WebCore/websockets/WebSocket.cpp
index dd89c14..f3bbdd7 100644
--- a/src/3rdparty/webkit/WebCore/websockets/WebSocket.cpp
+++ b/src/3rdparty/webkit/WebCore/websockets/WebSocket.cpp
@@ -86,6 +86,22 @@ static bool isValidProtocolString(const WebCore::String& protocol)
return true;
}
+#if USE(V8)
+
+static bool webSocketsAvailable = false;
+
+void WebSocket::setIsAvailable(bool available)
+{
+ webSocketsAvailable = available;
+}
+
+bool WebSocket::isAvailable()
+{
+ return webSocketsAvailable;
+}
+
+#endif
+
WebSocket::WebSocket(ScriptExecutionContext* context)
: ActiveDOMObject(context, this)
, m_state(CONNECTING)
@@ -189,7 +205,7 @@ void WebSocket::didReceiveMessage(const String& msg)
return;
RefPtr<MessageEvent> evt = MessageEvent::create();
// FIXME: origin, lastEventId, source, messagePort.
- evt->initMessageEvent(eventNames().messageEvent, false, false, msg, "", "", 0, 0);
+ evt->initMessageEvent(eventNames().messageEvent, false, false, SerializedScriptValue::create(msg), "", "", 0, 0);
scriptExecutionContext()->postTask(ProcessWebSocketEventTask::create(this, evt));
}
diff --git a/src/3rdparty/webkit/WebCore/websockets/WebSocket.h b/src/3rdparty/webkit/WebCore/websockets/WebSocket.h
index c5b7ee7..9ecbed7 100644
--- a/src/3rdparty/webkit/WebCore/websockets/WebSocket.h
+++ b/src/3rdparty/webkit/WebCore/websockets/WebSocket.h
@@ -50,6 +50,10 @@ namespace WebCore {
class WebSocket : public RefCounted<WebSocket>, public EventTarget, public ActiveDOMObject, public WebSocketChannelClient {
public:
+#if USE(V8)
+ static void setIsAvailable(bool);
+ static bool isAvailable();
+#endif
static PassRefPtr<WebSocket> create(ScriptExecutionContext* context) { return adoptRef(new WebSocket(context)); }
virtual ~WebSocket();
diff --git a/src/3rdparty/webkit/WebCore/websockets/WebSocket.idl b/src/3rdparty/webkit/WebCore/websockets/WebSocket.idl
index 04606fe..c662940 100644
--- a/src/3rdparty/webkit/WebCore/websockets/WebSocket.idl
+++ b/src/3rdparty/webkit/WebCore/websockets/WebSocket.idl
@@ -55,13 +55,13 @@ module websockets {
void close();
// EventTarget interface
- // [Custom] void addEventListener(in DOMString type,
- // in EventListener listener,
- // in boolean useCapture);
- // [Custom] void removeEventListener(in DOMString type,
- // in EventListener listener,
- // in boolean useCapture);
- // boolean dispatchEvent(in Event evt)
- // raises(EventException);
+ [Custom] void addEventListener(in DOMString type,
+ in EventListener listener,
+ in boolean useCapture);
+ [Custom] void removeEventListener(in DOMString type,
+ in EventListener listener,
+ in boolean useCapture);
+ boolean dispatchEvent(in Event evt)
+ raises(EventException);
};
}
diff --git a/src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp b/src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp
index d47868a..e577218 100644
--- a/src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp
+++ b/src/3rdparty/webkit/WebCore/wml/WMLImageElement.cpp
@@ -94,13 +94,12 @@ void WMLImageElement::attach()
{
WMLElement::attach();
- if (renderer() && renderer()->isImage()) {
+ if (renderer() && renderer()->isImage() && m_imageLoader.haveFiredBeforeLoadEvent()) {
RenderImage* imageObj = toRenderImage(renderer());
if (imageObj->hasImage())
return;
-
imageObj->setCachedImage(m_imageLoader.image());
-
+
// If we have no image at all because we have no src attribute, set
// image height and width for the alt text instead.
if (!m_imageLoader.image() && !imageObj->cachedImage())
diff --git a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp
index 5206fd9..82dc4b3 100644
--- a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.cpp
@@ -47,7 +47,7 @@ DedicatedWorkerContext::DedicatedWorkerContext(const KURL& url, const String& us
}
// FIXME: remove this when we update the ObjC bindings (bug #28774).
-void DedicatedWorkerContext::postMessage(const String& message, MessagePort* port, ExceptionCode& ec)
+void DedicatedWorkerContext::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort* port, ExceptionCode& ec)
{
MessagePortArray ports;
if (port)
@@ -55,12 +55,12 @@ void DedicatedWorkerContext::postMessage(const String& message, MessagePort* por
postMessage(message, &ports, ec);
}
-void DedicatedWorkerContext::postMessage(const String& message, ExceptionCode& ec)
+void DedicatedWorkerContext::postMessage(PassRefPtr<SerializedScriptValue> message, ExceptionCode& ec)
{
postMessage(message, static_cast<MessagePortArray*>(0), ec);
}
-void DedicatedWorkerContext::postMessage(const String& message, const MessagePortArray* ports, ExceptionCode& ec)
+void DedicatedWorkerContext::postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionCode& ec)
{
if (isClosing())
return;
diff --git a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h
index 7609fcd..74a39d9 100644
--- a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h
+++ b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.h
@@ -55,10 +55,10 @@ namespace WebCore {
// EventTarget
virtual DedicatedWorkerContext* toDedicatedWorkerContext() { return this; }
- void postMessage(const String&, ExceptionCode&);
- void postMessage(const String&, const MessagePortArray*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue>, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue>, const MessagePortArray*, ExceptionCode&);
// FIXME: remove this when we update the ObjC bindings (bug #28774).
- void postMessage(const String&, MessagePort*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue>, MessagePort*, ExceptionCode&);
DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
diff --git a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl
index 899bbae..f421b9a 100644
--- a/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl
+++ b/src/3rdparty/webkit/WebCore/workers/DedicatedWorkerContext.idl
@@ -39,7 +39,7 @@ module threads {
] DedicatedWorkerContext : WorkerContext {
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
- [Custom] void postMessage(in DOMString message, in [Optional] Array messagePorts)
+ [Custom] void postMessage(in any message, in [Optional] Array messagePorts)
raises(DOMException);
#else
// There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
diff --git a/src/3rdparty/webkit/WebCore/workers/DefaultSharedWorkerRepository.cpp b/src/3rdparty/webkit/WebCore/workers/DefaultSharedWorkerRepository.cpp
index 11106ee..8b1a480 100644
--- a/src/3rdparty/webkit/WebCore/workers/DefaultSharedWorkerRepository.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/DefaultSharedWorkerRepository.cpp
@@ -63,8 +63,13 @@ public:
void setThread(PassRefPtr<SharedWorkerThread> thread) { m_thread = thread; }
SharedWorkerThread* thread() { return m_thread.get(); }
bool isClosing() const { return m_closing; }
- KURL url() const { return m_url.copy(); }
- String name() const { return m_name.copy(); }
+ KURL url() const
+ {
+ // Don't use m_url.copy() because it isn't a threadsafe method.
+ return KURL(ParsedURLString, m_url.string().threadsafeCopy());
+ }
+
+ String name() const { return m_name.threadsafeCopy(); }
bool matches(const String& name, PassRefPtr<SecurityOrigin> origin, const KURL& urlToMatch) const;
// WorkerLoaderProxy
@@ -102,7 +107,7 @@ private:
SharedWorkerProxy::SharedWorkerProxy(const String& name, const KURL& url, PassRefPtr<SecurityOrigin> origin)
: m_closing(false)
- , m_name(name.copy())
+ , m_name(name.crossThreadString())
, m_url(url.copy())
, m_origin(origin)
{
@@ -311,6 +316,12 @@ void DefaultSharedWorkerRepository::workerScriptLoaded(SharedWorkerProxy& proxy,
proxy.thread()->runLoop().postTask(SharedWorkerConnectTask::create(port));
}
+bool SharedWorkerRepository::isAvailable()
+{
+ // SharedWorkers are enabled on the default WebKit platform.
+ return true;
+}
+
void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr<MessagePortChannel> port, const KURL& url, const String& name, ExceptionCode& ec)
{
DefaultSharedWorkerRepository::instance().connectToWorker(worker, port, url, name, ec);
@@ -379,8 +390,9 @@ void DefaultSharedWorkerRepository::connectToWorker(PassRefPtr<SharedWorker> wor
PassRefPtr<SharedWorkerProxy> DefaultSharedWorkerRepository::getProxy(const String& name, const KURL& url)
{
// Look for an existing worker, and create one if it doesn't exist.
- // Items in the cache are freed on another thread, so copy the URL before creating the origin, to make sure no references to external strings linger.
- RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url.copy());
+ // Items in the cache are freed on another thread, so do a threadsafe copy of the URL before creating the origin,
+ // to make sure no references to external strings linger.
+ RefPtr<SecurityOrigin> origin = SecurityOrigin::create(KURL(ParsedURLString, url.string().threadsafeCopy()));
for (unsigned i = 0; i < m_proxies.size(); i++) {
if (!m_proxies[i]->isClosing() && m_proxies[i]->matches(name, origin, url))
return m_proxies[i];
diff --git a/src/3rdparty/webkit/WebCore/workers/SharedWorkerRepository.h b/src/3rdparty/webkit/WebCore/workers/SharedWorkerRepository.h
index 96d2fb1..49f3941 100644
--- a/src/3rdparty/webkit/WebCore/workers/SharedWorkerRepository.h
+++ b/src/3rdparty/webkit/WebCore/workers/SharedWorkerRepository.h
@@ -48,6 +48,9 @@ namespace WebCore {
// Interface to a repository which manages references to the set of active shared workers.
class SharedWorkerRepository {
public:
+ // Returns true if the platform supports SharedWorkers, otherwise false.
+ static bool isAvailable();
+
// Connects the passed SharedWorker object with the specified worker thread, creating a new thread if necessary.
static void connect(PassRefPtr<SharedWorker>, PassOwnPtr<MessagePortChannel>, const KURL&, const String& name, ExceptionCode&);
diff --git a/src/3rdparty/webkit/WebCore/workers/SharedWorkerThread.cpp b/src/3rdparty/webkit/WebCore/workers/SharedWorkerThread.cpp
index ded4834..e59df4f 100644
--- a/src/3rdparty/webkit/WebCore/workers/SharedWorkerThread.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/SharedWorkerThread.cpp
@@ -45,7 +45,7 @@ PassRefPtr<SharedWorkerThread> SharedWorkerThread::create(const String& name, co
SharedWorkerThread::SharedWorkerThread(const String& name, const KURL& url, const String& userAgent, const String& sourceCode, WorkerLoaderProxy& workerLoaderProxy, WorkerReportingProxy& workerReportingProxy)
: WorkerThread(url, userAgent, sourceCode, workerLoaderProxy, workerReportingProxy)
- , m_name(name.copy())
+ , m_name(name.crossThreadString())
{
}
diff --git a/src/3rdparty/webkit/WebCore/workers/Worker.cpp b/src/3rdparty/webkit/WebCore/workers/Worker.cpp
index c2c25c1..864b7c6 100644
--- a/src/3rdparty/webkit/WebCore/workers/Worker.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/Worker.cpp
@@ -70,7 +70,7 @@ Worker::~Worker()
}
// FIXME: remove this when we update the ObjC bindings (bug #28774).
-void Worker::postMessage(const String& message, MessagePort* port, ExceptionCode& ec)
+void Worker::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort* port, ExceptionCode& ec)
{
MessagePortArray ports;
if (port)
@@ -78,12 +78,12 @@ void Worker::postMessage(const String& message, MessagePort* port, ExceptionCode
postMessage(message, &ports, ec);
}
-void Worker::postMessage(const String& message, ExceptionCode& ec)
+void Worker::postMessage(PassRefPtr<SerializedScriptValue> message, ExceptionCode& ec)
{
postMessage(message, static_cast<MessagePortArray*>(0), ec);
}
-void Worker::postMessage(const String& message, const MessagePortArray* ports, ExceptionCode& ec)
+void Worker::postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionCode& ec)
{
// Disentangle the port in preparation for sending it to the remote context.
OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(ports, ec);
diff --git a/src/3rdparty/webkit/WebCore/workers/Worker.h b/src/3rdparty/webkit/WebCore/workers/Worker.h
index 41d39a2..6b8fa84 100644
--- a/src/3rdparty/webkit/WebCore/workers/Worker.h
+++ b/src/3rdparty/webkit/WebCore/workers/Worker.h
@@ -58,10 +58,10 @@ namespace WebCore {
virtual Worker* toWorker() { return this; }
- void postMessage(const String&, ExceptionCode&);
- void postMessage(const String&, const MessagePortArray*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue>, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue>, const MessagePortArray*, ExceptionCode&);
// FIXME: remove this when we update the ObjC bindings (bug #28774).
- void postMessage(const String& message, MessagePort*, ExceptionCode&);
+ void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, ExceptionCode&);
void terminate();
diff --git a/src/3rdparty/webkit/WebCore/workers/Worker.idl b/src/3rdparty/webkit/WebCore/workers/Worker.idl
index 9c9342b..0382739 100644
--- a/src/3rdparty/webkit/WebCore/workers/Worker.idl
+++ b/src/3rdparty/webkit/WebCore/workers/Worker.idl
@@ -35,11 +35,11 @@ module threads {
attribute EventListener onmessage;
#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
- [Custom] void postMessage(in DOMString message, in [Optional] Array messagePorts)
+ [Custom] void postMessage(in SerialisedScriptValue message, in [Optional] Array messagePorts)
raises(DOMException);
#else
// There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
- void postMessage(in DOMString message, in [Optional] MessagePort messagePort)
+ void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort)
raises(DOMException);
#endif
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h b/src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h
index d55452e..e1ca139 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerContextProxy.h
@@ -53,7 +53,7 @@ namespace WebCore {
virtual void terminateWorkerContext() = 0;
- virtual void postMessageToWorkerContext(const String&, PassOwnPtr<MessagePortChannelArray>) = 0;
+ virtual void postMessageToWorkerContext(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>) = 0;
virtual bool hasPendingActivity() const = 0;
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp b/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp
index 3d28f9e..0b66694 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.cpp
@@ -46,14 +46,14 @@ namespace WebCore {
class MessageWorkerContextTask : public ScriptExecutionContext::Task {
public:
- static PassRefPtr<MessageWorkerContextTask> create(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
+ static PassRefPtr<MessageWorkerContextTask> create(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
{
return adoptRef(new MessageWorkerContextTask(message, channels));
}
private:
- MessageWorkerContextTask(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
- : m_message(message.copy())
+ MessageWorkerContextTask(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
+ : m_message(message->release())
, m_channels(channels)
{
}
@@ -68,20 +68,20 @@ private:
}
private:
- String m_message;
+ RefPtr<SerializedScriptValue> m_message;
OwnPtr<MessagePortChannelArray> m_channels;
};
class MessageWorkerTask : public ScriptExecutionContext::Task {
public:
- static PassRefPtr<MessageWorkerTask> create(const String& message, PassOwnPtr<MessagePortChannelArray> channels, WorkerMessagingProxy* messagingProxy)
+ static PassRefPtr<MessageWorkerTask> create(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels, WorkerMessagingProxy* messagingProxy)
{
return adoptRef(new MessageWorkerTask(message, channels, messagingProxy));
}
private:
- MessageWorkerTask(const String& message, PassOwnPtr<MessagePortChannelArray> channels, WorkerMessagingProxy* messagingProxy)
- : m_message(message.copy())
+ MessageWorkerTask(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels, WorkerMessagingProxy* messagingProxy)
+ : m_message(message->release())
, m_channels(channels)
, m_messagingProxy(messagingProxy)
{
@@ -98,7 +98,7 @@ private:
}
private:
- String m_message;
+ RefPtr<SerializedScriptValue> m_message;
OwnPtr<MessagePortChannelArray> m_channels;
WorkerMessagingProxy* m_messagingProxy;
};
@@ -112,9 +112,9 @@ public:
private:
WorkerExceptionTask(const String& errorMessage, int lineNumber, const String& sourceURL, WorkerMessagingProxy* messagingProxy)
- : m_errorMessage(errorMessage.copy())
+ : m_errorMessage(errorMessage.crossThreadString())
, m_lineNumber(lineNumber)
- , m_sourceURL(sourceURL.copy())
+ , m_sourceURL(sourceURL.crossThreadString())
, m_messagingProxy(messagingProxy)
{
}
@@ -240,12 +240,12 @@ void WorkerMessagingProxy::startWorkerContext(const KURL& scriptURL, const Strin
thread->start();
}
-void WorkerMessagingProxy::postMessageToWorkerObject(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
+void WorkerMessagingProxy::postMessageToWorkerObject(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
{
m_scriptExecutionContext->postTask(MessageWorkerTask::create(message, channels.release(), this));
}
-void WorkerMessagingProxy::postMessageToWorkerContext(const String& message, PassOwnPtr<MessagePortChannelArray> channels)
+void WorkerMessagingProxy::postMessageToWorkerContext(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels)
{
if (m_askedToTerminate)
return;
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h b/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h
index 8ab0cb6..754102a 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerMessagingProxy.h
@@ -54,13 +54,13 @@ namespace WebCore {
// (Only use these methods in the worker object thread.)
virtual void startWorkerContext(const KURL& scriptURL, const String& userAgent, const String& sourceCode);
virtual void terminateWorkerContext();
- virtual void postMessageToWorkerContext(const String&, PassOwnPtr<MessagePortChannelArray>);
+ virtual void postMessageToWorkerContext(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
virtual bool hasPendingActivity() const;
virtual void workerObjectDestroyed();
// Implementations of WorkerObjectProxy.
// (Only use these methods in the worker context thread.)
- virtual void postMessageToWorkerObject(const String&, PassOwnPtr<MessagePortChannelArray>);
+ virtual void postMessageToWorkerObject(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
virtual void postExceptionToWorkerObject(const String& errorMessage, int lineNumber, const String& sourceURL);
virtual void postConsoleMessageToWorkerObject(MessageDestination, MessageSource, MessageType, MessageLevel, const String& message, int lineNumber, const String& sourceURL);
virtual void confirmMessageFromWorkerObject(bool hasPendingActivity);
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h b/src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h
index 77a7d7d..33e0bc3 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerObjectProxy.h
@@ -44,7 +44,7 @@ namespace WebCore {
// A proxy to talk to the worker object.
class WorkerObjectProxy : public WorkerReportingProxy {
public:
- virtual void postMessageToWorkerObject(const String&, PassOwnPtr<MessagePortChannelArray>) = 0;
+ virtual void postMessageToWorkerObject(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>) = 0;
virtual void confirmMessageFromWorkerObject(bool hasPendingActivity) = 0;
virtual void reportPendingActivity(bool hasPendingActivity) = 0;
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp b/src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp
index 449dd78..6a58d52 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerRunLoop.cpp
@@ -77,7 +77,7 @@ public:
private:
Task(PassRefPtr<ScriptExecutionContext::Task> task, const String& mode)
: m_task(task)
- , m_mode(mode.copy())
+ , m_mode(mode.crossThreadString())
{
}
@@ -205,7 +205,7 @@ void WorkerRunLoop::postTask(PassRefPtr<ScriptExecutionContext::Task> task)
void WorkerRunLoop::postTaskForMode(PassRefPtr<ScriptExecutionContext::Task> task, const String& mode)
{
- m_messageQueue.append(Task::create(task, mode.copy()));
+ m_messageQueue.append(Task::create(task, mode.crossThreadString()));
}
} // namespace WebCore
diff --git a/src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp b/src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp
index 22253bf..467157b 100644
--- a/src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp
+++ b/src/3rdparty/webkit/WebCore/workers/WorkerThread.cpp
@@ -71,8 +71,8 @@ private:
WorkerThreadStartupData::WorkerThreadStartupData(const KURL& scriptURL, const String& userAgent, const String& sourceCode)
: m_scriptURL(scriptURL.copy())
- , m_userAgent(userAgent.copy())
- , m_sourceCode(sourceCode.copy())
+ , m_userAgent(userAgent.crossThreadString())
+ , m_sourceCode(sourceCode.crossThreadString())
{
}
diff --git a/src/3rdparty/webkit/WebKit.pri b/src/3rdparty/webkit/WebKit.pri
index fd918c9..2dba0d4 100644
--- a/src/3rdparty/webkit/WebKit.pri
+++ b/src/3rdparty/webkit/WebKit.pri
@@ -31,7 +31,10 @@ building-libs {
DEPENDPATH += $$PWD/WebKit/qt/Api
}
-DEFINES += USE_SYSTEM_MALLOC
+!mac:!unix|symbian {
+ DEFINES += USE_SYSTEM_MALLOC
+}
+
CONFIG(release, debug|release) {
DEFINES += NDEBUG
}
diff --git a/src/3rdparty/webkit/WebKit/ChangeLog b/src/3rdparty/webkit/WebKit/ChangeLog
index 2f8f18f..607a039 100644
--- a/src/3rdparty/webkit/WebKit/ChangeLog
+++ b/src/3rdparty/webkit/WebKit/ChangeLog
@@ -1,3 +1,136 @@
+2009-10-19 John Gregg <johnnyg@google.com>
+
+ Reviewed by Dimitri Glazkov.
+
+ set ENABLE_NOTIFICATIONS=1 for Chromium
+ https://bugs.webkit.org/show_bug.cgi?id=29949
+
+ * chromium/features.gypi:
+
+2009-10-13 Drew Wilson <atwilson@atwilson-macpro.local>
+
+ Reviewed by David Levin.
+
+ Enable SHARED_WORKERS for Chromium
+ https://bugs.webkit.org/show_bug.cgi?id=30289
+
+ * chromium/features.gypi:
+ Turned on ENABLE_SHARED_WORKERS by default. This doesn't actually turn on
+ SharedWorkers yet, as Chromium overrides this flag in its feature_overrides.gypi.
+
+2009-10-12 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Chromium Port - Windows
+ https://bugs.webkit.org/show_bug.cgi?id=29969
+
+ * chromium/DEPS: Added gtest dep required by windows and incremented some of the deps revisions.
+
+2009-10-06 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Mark Rowe.
+
+ accessibility/media-element.html crashes (and has incorrect result)
+ https://bugs.webkit.org/show_bug.cgi?id=30108
+
+ Fix up the accessibilty label for the newly added fullscreen button,
+ and update the test result accordingly.
+
+ * English.lproj/Localizable.strings:
+
+2009-10-05 Kevin Decker <kdecker@apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ * WebKit.xcodeproj/project.pbxproj: Add WebPluginHalterClient to the project.
+
+2009-10-05 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ One of the dependencies' SVN url was missing a @ before the revision number.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30101
+
+ * chromium/DEPS:
+
+2009-10-05 Pierre d'Herbemont <pdherbemont@webkit.org>
+
+ Reviewed by Simon Fraser
+
+ Support fullscreen in MediaPlayer (Mac)
+ https://bugs.webkit.org/show_bug.cgi?id=26742
+
+ Add new files for video fullscreen.
+
+ * WebKit.xcodeproj/project.pbxproj:
+
+2009-10-05 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: add testing harness for Web Inspector.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30010
+
+ * WebKit.xcodeproj/project.pbxproj:
+
+2009-10-04 Fumitoshi Ukai <ukai@chromium.org>
+
+ Reviewed by Eric Seidel
+
+ Enable Web Sockets in chromium build.
+ https://bugs.webkit.org/show_bug.cgi?id=29917
+
+ * chromium/features.gypi:
+
+2009-10-02 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Added gyp_webkit that does a subset of the things gyp_chromium does
+ plus some specialization for an upstream chromium build.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29986
+
+ * chromium/DEPS: Points to gyp_webkit instead of gyp_chromium.
+ * chromium/gyp_webkit: A new python file.
+
+2009-10-01 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Make it possible to override the list of feature defines when building
+ downstream.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29979
+
+ * chromium/features.gypi:
+
+2009-10-01 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ Added windows-specific dependencies, updated some revisions and
+ re-organized file to make revision tracking easier. Also removed
+ extensions/v8 dependency that is no longer needed upstream.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29973
+
+ * chromium/DEPS:
+
+2009-09-30 Yaar Schnitman <yaar@chromium.org>
+
+ Reviewed by Dimitri Glazkov.
+
+ 1. Keeping up with downstream revisions.
+ 2. Turning off v8 snapshot build step.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29928
+
+ * chromium/DEPS
+
2009-09-29 Brady Eidson <beidson@apple.com>
Reviewed by John Sullivan.
diff --git a/src/3rdparty/webkit/WebKit/mac/Configurations/Version.xcconfig b/src/3rdparty/webkit/WebKit/mac/Configurations/Version.xcconfig
index 3229ab5..6572d2c 100644
--- a/src/3rdparty/webkit/WebKit/mac/Configurations/Version.xcconfig
+++ b/src/3rdparty/webkit/WebKit/mac/Configurations/Version.xcconfig
@@ -22,7 +22,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
MAJOR_VERSION = 532;
-MINOR_VERSION = 1;
+MINOR_VERSION = 3;
TINY_VERSION = 0;
FULL_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION);
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp
index 2a0ee20..7e485a0 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp
@@ -1,5 +1,6 @@
/*
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+ Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -44,12 +45,21 @@ public:
virtual void scroll(int dx, int dy, const QRect&);
virtual void update(const QRect& dirtyRect);
+ virtual void setInputMethodEnabled(bool enable);
+#if QT_VERSION >= 0x040600
+ virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable);
+#endif
+#ifndef QT_NO_CURSOR
virtual QCursor cursor() const;
virtual void updateCursor(const QCursor& cursor);
+#endif
+ virtual QPalette palette() const;
virtual int screenNumber() const;
- virtual WId winId() const;
+ virtual QWidget* ownerWidget() const;
+
+ virtual QObject* pluginParent() const;
void _q_doLoadProgress(int progress);
void _q_doLoadFinished(bool success);
@@ -79,10 +89,7 @@ void QGraphicsWebViewPrivate::_q_doLoadFinished(bool success)
if (q->title().isEmpty())
emit q->urlChanged(q->url());
- if (success)
- emit q->loadFinished();
- else
- emit q->loadFailed();
+ emit q->loadFinished(success);
}
void QGraphicsWebViewPrivate::scroll(int dx, int dy, const QRect& rectToScroll)
@@ -95,6 +102,21 @@ void QGraphicsWebViewPrivate::update(const QRect & dirtyRect)
q->update(QRectF(dirtyRect));
}
+
+void QGraphicsWebViewPrivate::setInputMethodEnabled(bool enable)
+{
+ q->setAttribute(Qt::WA_InputMethodEnabled, enable);
+}
+#if QT_VERSION >= 0x040600
+void QGraphicsWebViewPrivate::setInputMethodHint(Qt::InputMethodHint hint, bool enable)
+{
+ if (enable)
+ q->setInputMethodHints(q->inputMethodHints() | hint);
+ else
+ q->setInputMethodHints(q->inputMethodHints() & ~hint);
+}
+#endif
+#ifndef QT_NO_CURSOR
QCursor QGraphicsWebViewPrivate::cursor() const
{
return q->cursor();
@@ -104,6 +126,12 @@ void QGraphicsWebViewPrivate::updateCursor(const QCursor& cursor)
{
q->setCursor(cursor);
}
+#endif
+
+QPalette QGraphicsWebViewPrivate::palette() const
+{
+ return q->palette();
+}
int QGraphicsWebViewPrivate::screenNumber() const
{
@@ -117,14 +145,15 @@ int QGraphicsWebViewPrivate::screenNumber() const
return 0;
}
-WId QGraphicsWebViewPrivate::winId() const
+QWidget* QGraphicsWebViewPrivate::ownerWidget() const
{
const QList<QGraphicsView*> views = q->scene()->views();
+ return views.value(0);
+}
- if (!views.isEmpty())
- return views.at(0)->winId();
-
- return 0;
+QObject* QGraphicsWebViewPrivate::pluginParent() const
+{
+ return q;
}
void QGraphicsWebViewPrivate::_q_setStatusBarMessage(const QString& s)
@@ -166,8 +195,10 @@ QGraphicsWebView::QGraphicsWebView(QGraphicsItem* parent)
*/
QGraphicsWebView::~QGraphicsWebView()
{
- if (d->page)
+ if (d->page) {
d->page->d->view = 0;
+ d->page->d->client = 0; // unset the page client
+ }
if (d->page && d->page->parent() == this)
delete d->page;
@@ -220,21 +251,38 @@ bool QGraphicsWebView::event(QEvent* event)
// Re-implemented in order to allows fixing event-related bugs in patch releases.
if (d->page) {
+#ifndef QT_NO_CONTEXTMENU
+ if (event->type() == QEvent::GraphicsSceneContextMenu) {
+ if (!isEnabled())
+ return false;
+
+ QGraphicsSceneContextMenuEvent* ev = static_cast<QGraphicsSceneContextMenuEvent*>(event);
+ QContextMenuEvent fakeEvent(QContextMenuEvent::Reason(ev->reason()), ev->pos().toPoint());
+ if (d->page->swallowContextMenuEvent(&fakeEvent)) {
+ event->accept();
+ return true;
+ }
+ d->page->updatePositionDependentActions(fakeEvent.pos());
+ } else
+#endif // QT_NO_CONTEXTMENU
+ {
#ifndef QT_NO_CURSOR
#if QT_VERSION >= 0x040400
- } else if (event->type() == QEvent::CursorChange) {
- // An unsetCursor will set the cursor to Qt::ArrowCursor.
- // Thus this cursor change might be a QWidget::unsetCursor()
- // If this is not the case and it came from WebCore, the
- // QWebPageClient already has set its cursor internally
- // to Qt::ArrowCursor, so updating the cursor is always
- // right, as it falls back to the last cursor set by
- // WebCore.
- // FIXME: Add a QEvent::CursorUnset or similar to Qt.
- if (cursor().shape() == Qt::ArrowCursor)
- d->resetCursor();
+ if (event->type() == QEvent::CursorChange) {
+ // An unsetCursor will set the cursor to Qt::ArrowCursor.
+ // Thus this cursor change might be a QWidget::unsetCursor()
+ // If this is not the case and it came from WebCore, the
+ // QWebPageClient already has set its cursor internally
+ // to Qt::ArrowCursor, so updating the cursor is always
+ // right, as it falls back to the last cursor set by
+ // WebCore.
+ // FIXME: Add a QEvent::CursorUnset or similar to Qt.
+ if (cursor().shape() == Qt::ArrowCursor)
+ d->resetCursor();
+ }
#endif
#endif
+ }
}
return QGraphicsWidget::event(event);
}
@@ -589,7 +637,6 @@ void QGraphicsWebView::hoverMoveEvent(QGraphicsSceneHoverEvent* ev)
QMouseEvent me = QMouseEvent(QEvent::MouseMove,
ev->pos().toPoint(), Qt::NoButton,
Qt::NoButton, Qt::NoModifier);
- d->page->setView(ev->widget());
d->page->event(&me);
ev->setAccepted(accepted);
}
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h
index a8478d8..26f7374 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h
@@ -95,8 +95,7 @@ public Q_SLOTS:
Q_SIGNALS:
void loadStarted();
- void loadFinished();
- void loadFailed();
+ void loadFinished(bool);
void progressChanged(qreal);
void interactivityChanged();
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp
index 939d881..5b83870 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.cpp
@@ -30,12 +30,14 @@
#include "Document.h"
#include "DocumentFragment.h"
#include "FrameView.h"
+#include "GraphicsContext.h"
#include "HTMLElement.h"
#include "JSGlobalObject.h"
#include "JSHTMLElement.h"
#include "JSObject.h"
#include "NodeList.h"
#include "PropertyNameArray.h"
+#include "RenderImage.h"
#include "ScriptFunctionCall.h"
#include "StaticNodeList.h"
#include "qt_runtime.h"
@@ -45,6 +47,8 @@
#include <parser/SourceCode.h>
#include <wtf/Vector.h>
+#include <QPainter>
+
using namespace WebCore;
class QWebElementPrivate {
@@ -1411,3 +1415,38 @@ QWebElement QWebElement::enclosingElement(WebCore::Node* node)
Returns true if this element points to a different underlying DOM object
than \a o; otherwise returns false.
*/
+
+
+/*!
+ Render the element into \a painter .
+*/
+void QWebElement::render(QPainter* painter)
+{
+ WebCore::Element* e = m_element;
+ Document* doc = e ? e->document() : 0;
+ if (!doc)
+ return;
+
+ Frame* frame = doc->frame();
+ if (!frame || !frame->view() || !frame->contentRenderer())
+ return;
+
+ FrameView* view = frame->view();
+
+ view->layoutIfNeededRecursive();
+
+ IntRect rect = e->getRect();
+
+ if (rect.size().isEmpty())
+ return;
+
+ GraphicsContext context(painter);
+
+ context.save();
+ context.translate(-rect.x(), -rect.y());
+ view->setNodeToDraw(e);
+ view->paintContents(&context, rect);
+ view->setNodeToDraw(0);
+ context.restore();
+}
+
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h b/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h
index 3db4637..351ccb4 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h
@@ -31,6 +31,10 @@ namespace WebCore {
class Node;
}
+QT_BEGIN_NAMESPACE
+class QPainter;
+QT_END_NAMESPACE
+
class QWebFrame;
class QWebElementPrivate;
@@ -133,6 +137,8 @@ public:
QString styleProperty(const QString& name, StyleResolveStrategy strategy) const;
void setStyleProperty(const QString& name, const QString& value);
+ void render(QPainter* painter);
+
private:
explicit QWebElement(WebCore::Element*);
explicit QWebElement(WebCore::Node*);
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
index 780f862..d2c324d 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp
@@ -540,15 +540,26 @@ QUrl QWebFrame::url() const
*/
QUrl QWebFrame::requestedUrl() const
{
- // In the following edge cases (where the failing document
- // loader does not get commited by the frame loader) it is
- // safer to rely on outgoingReferrer than originalRequest.
- if (!d->frame->loader()->activeDocumentLoader()
- || (!d->frameLoaderClient->m_loadError.isNull()
- && !d->frame->loader()->outgoingReferrer().isEmpty()))
- return QUrl(d->frame->loader()->outgoingReferrer());
+ // There are some possible edge cases to be handled here,
+ // apart from checking if activeDocumentLoader is valid:
+ //
+ // * Method can be called while processing an unsucessful load.
+ // In this case, frameLoaderClient will hold the current error
+ // (m_loadError), and we will make use of it to recover the 'failingURL'.
+ // * If the 'failingURL' holds a null'ed string though, we fallback
+ // to 'outgoingReferrer' (it yet is safer than originalRequest).
+ FrameLoader* loader = d->frame->loader();
+ FrameLoaderClientQt* loaderClient = d->frameLoaderClient;
+
+ if (!loader->activeDocumentLoader()
+ || !loaderClient->m_loadError.isNull()) {
+ if (!loaderClient->m_loadError.failingURL().isNull())
+ return QUrl(loaderClient->m_loadError.failingURL());
+ else if (!loader->outgoingReferrer().isEmpty())
+ return QUrl(loader->outgoingReferrer());
+ }
- return d->frame->loader()->originalRequest().url();
+ return loader->originalRequest().url();
}
/*!
\since 4.6
@@ -710,7 +721,9 @@ void QWebFrame::load(const QNetworkRequest &req,
script can be specified through the charset attribute of the HTML script tag. It is also possible
for the encoding to be specified by web server.
- \sa toHtml()
+ \note This method will not affect session or global history for the frame.
+
+ \sa toHtml(), setContent()
*/
void QWebFrame::setHtml(const QString &html, const QUrl &baseUrl)
{
@@ -718,7 +731,7 @@ void QWebFrame::setHtml(const QString &html, const QUrl &baseUrl)
WebCore::ResourceRequest request(kurl);
const QByteArray utf8 = html.toUtf8();
WTF::RefPtr<WebCore::SharedBuffer> data = WebCore::SharedBuffer::create(utf8.constData(), utf8.length());
- WebCore::SubstituteData substituteData(data, WebCore::String("text/html"), WebCore::String("utf-8"), kurl);
+ WebCore::SubstituteData substituteData(data, WebCore::String("text/html"), WebCore::String("utf-8"), KURL());
d->frame->loader()->load(request, substituteData, false);
}
@@ -731,7 +744,9 @@ void QWebFrame::setHtml(const QString &html, const QUrl &baseUrl)
The \a data is loaded immediately; external objects are loaded asynchronously.
- \sa toHtml()
+ \note This method will not affect session or global history for the frame.
+
+ \sa toHtml(), setHtml()
*/
void QWebFrame::setContent(const QByteArray &data, const QString &mimeType, const QUrl &baseUrl)
{
@@ -741,11 +756,10 @@ void QWebFrame::setContent(const QByteArray &data, const QString &mimeType, cons
QString actualMimeType = mimeType;
if (actualMimeType.isEmpty())
actualMimeType = QLatin1String("text/html");
- WebCore::SubstituteData substituteData(buffer, WebCore::String(actualMimeType), WebCore::String(), kurl);
+ WebCore::SubstituteData substituteData(buffer, WebCore::String(actualMimeType), WebCore::String(), KURL());
d->frame->loader()->load(request, substituteData, false);
}
-
/*!
Returns the parent frame of this frame, or 0 if the frame is the web pages
main frame.
@@ -1248,7 +1262,7 @@ QVariant QWebFrame::evaluateJavaScript(const QString& scriptSource)
ScriptController *proxy = d->frame->script();
QVariant rc;
if (proxy) {
- JSC::JSValue v = d->frame->loader()->executeScript(ScriptSourceCode(scriptSource)).jsValue();
+ JSC::JSValue v = d->frame->script()->executeScript(ScriptSourceCode(scriptSource)).jsValue();
int distance = 0;
rc = JSC::Bindings::convertValueToQVariant(proxy->globalObject()->globalExec(), v, QMetaType::Void, &distance);
}
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
index 655fd0e..31d193e 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp
@@ -271,7 +271,7 @@ QWebPagePrivate::QWebPagePrivate(QWebPage *qq)
{
WebCore::InitializeLoggingChannelsIfNecessary();
JSC::initializeThreading();
- WebCore::FrameLoader::setLocalLoadPolicy(WebCore::FrameLoader::AllowLocalLoadsForLocalAndSubstituteData);
+ WebCore::SecurityOrigin::setLocalLoadPolicy(WebCore::SecurityOrigin::AllowLocalLoadsForLocalAndSubstituteData);
chromeClient = new ChromeClientQt(q);
contextMenuClient = new ContextMenuClientQt();
@@ -279,9 +279,6 @@ QWebPagePrivate::QWebPagePrivate(QWebPage *qq)
page = new Page(chromeClient, contextMenuClient, editorClient,
new DragClientQt(q), new InspectorClientQt(q), 0);
- // ### should be configurable
- page->settings()->setDefaultTextEncodingName("iso-8859-1");
-
settings = new QWebSettings(page->settings());
#ifndef QT_NO_UNDOSTACK
@@ -461,10 +458,10 @@ void QWebPagePrivate::updateAction(QWebPage::WebAction action)
switch (action) {
case QWebPage::Back:
- enabled = loader->canGoBackOrForward(-1);
+ enabled = page->canGoBackOrForward(-1);
break;
case QWebPage::Forward:
- enabled = loader->canGoBackOrForward(1);
+ enabled = page->canGoBackOrForward(1);
break;
case QWebPage::Stop:
enabled = loader->isLoading();
@@ -584,8 +581,6 @@ void QWebPagePrivate::timerEvent(QTimerEvent *ev)
void QWebPagePrivate::mouseMoveEvent(QGraphicsSceneMouseEvent* ev)
{
- q->setView(ev->widget());
-
WebCore::Frame* frame = QWebFramePrivate::core(mainFrame);
if (!frame->view())
return;
@@ -606,8 +601,6 @@ void QWebPagePrivate::mouseMoveEvent(QMouseEvent *ev)
void QWebPagePrivate::mousePressEvent(QGraphicsSceneMouseEvent* ev)
{
- q->setView(ev->widget());
-
WebCore::Frame* frame = QWebFramePrivate::core(mainFrame);
if (!frame->view())
return;
@@ -663,8 +656,6 @@ void QWebPagePrivate::mousePressEvent(QMouseEvent *ev)
void QWebPagePrivate::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *ev)
{
- q->setView(ev->widget());
-
WebCore::Frame* frame = QWebFramePrivate::core(mainFrame);
if (!frame->view())
return;
@@ -750,8 +741,6 @@ void QWebPagePrivate::handleClipboard(QEvent* ev, Qt::MouseButton button)
void QWebPagePrivate::mouseReleaseEvent(QGraphicsSceneMouseEvent* ev)
{
- q->setView(ev->widget());
-
WebCore::Frame* frame = QWebFramePrivate::core(mainFrame);
if (!frame->view())
return;
@@ -833,8 +822,6 @@ QMenu *QWebPage::createStandardContextMenu()
#ifndef QT_NO_WHEELEVENT
void QWebPagePrivate::wheelEvent(QGraphicsSceneWheelEvent* ev)
{
- q->setView(ev->widget());
-
WebCore::Frame* frame = QWebFramePrivate::core(mainFrame);
if (!frame->view())
return;
@@ -990,8 +977,6 @@ void QWebPagePrivate::focusOutEvent(QFocusEvent*)
void QWebPagePrivate::dragEnterEvent(QGraphicsSceneDragDropEvent* ev)
{
- q->setView(ev->widget());
-
#ifndef QT_NO_DRAGANDDROP
DragData dragData(ev->mimeData(), ev->pos().toPoint(),
QCursor::pos(), dropActionToDragOp(ev->possibleActions()));
@@ -1016,8 +1001,6 @@ void QWebPagePrivate::dragEnterEvent(QDragEnterEvent* ev)
void QWebPagePrivate::dragLeaveEvent(QGraphicsSceneDragDropEvent* ev)
{
- q->setView(ev->widget());
-
#ifndef QT_NO_DRAGANDDROP
DragData dragData(0, IntPoint(), QCursor::pos(), DragOperationNone);
page->dragController()->dragExited(&dragData);
@@ -1036,8 +1019,6 @@ void QWebPagePrivate::dragLeaveEvent(QDragLeaveEvent* ev)
void QWebPagePrivate::dragMoveEvent(QGraphicsSceneDragDropEvent* ev)
{
- q->setView(ev->widget());
-
#ifndef QT_NO_DRAGANDDROP
DragData dragData(ev->mimeData(), ev->pos().toPoint(),
QCursor::pos(), dropActionToDragOp(ev->possibleActions()));
@@ -1863,7 +1844,7 @@ void QWebPage::triggerAction(WebAction action, bool)
WTF::RefPtr<WebCore::Frame> wcFrame = targetFrame->d->frame;
targetFrame->d->frame->loader()->loadFrameRequest(frameLoadRequest(d->hitTestResult.linkUrl(), wcFrame.get()),
/*lockHistory*/ false, /*lockBackForwardList*/ false, /*event*/ 0,
- /*FormState*/ 0);
+ /*FormState*/ 0, SendReferrer);
break;
}
// fall through
@@ -1975,7 +1956,7 @@ void QWebPage::setViewportSize(const QSize &size) const
}
}
-QSize QWebPage::fixedContentsSize() const
+QSize QWebPage::preferredContentsSize() const
{
QWebFrame* frame = d->mainFrame;
if (frame) {
@@ -1988,7 +1969,7 @@ QSize QWebPage::fixedContentsSize() const
}
/*!
- \property QWebPage::fixedContentsSize
+ \property QWebPage::preferredContentsSize
\since 4.6
\brief the size of the fixed layout
@@ -1996,7 +1977,7 @@ QSize QWebPage::fixedContentsSize() const
1024x768 for example then webkit will layout the page as if the viewport were that size
rather than something different.
*/
-void QWebPage::setFixedContentsSize(const QSize &size) const
+void QWebPage::setPreferredContentsSize(const QSize &size) const
{
d->fixedLayoutSize = size;
@@ -2684,6 +2665,43 @@ void QWebPage::updatePositionDependentActions(const QPoint &pos)
*/
/*!
+ \class QWebPage::ErrorPageExtensionOption
+ \since 4.6
+ \brief The ErrorPageExtensionOption class describes the option
+ for the error page extension.
+
+ \inmodule QtWebKit
+
+ The ErrorPageExtensionOption class holds the \a url for which an error occoured as well as
+ the associated \a frame.
+
+ The error itself is reported by an error \a domain, the \a error code as well as \a errorString.
+
+ \sa QWebPage::ErrorPageExtensionReturn
+*/
+
+/*!
+ \class QWebPage::ErrorPageExtensionReturn
+ \since 4.6
+ \brief The ErrorPageExtensionReturn describes the error page, which will be shown for the
+ frame for which the error occured.
+
+ \inmodule QtWebKit
+
+ The ErrorPageExtensionReturn class holds the data needed for creating an error page. Some are
+ optional such as \a contentType, which defaults to "text/html", as well as the \a encoding, which
+ is assumed to be UTF-8 if not indicated otherwise.
+
+ The error page is stored in the \a content byte array, as HTML content. In order to convert a
+ QString to a byte array, the QString::toUtf8() method can be used.
+
+ External objects such as stylesheets or images referenced in the HTML are located relative to
+ \a baseUrl.
+
+ \sa QWebPage::ErrorPageExtensionOption, QString::toUtf8()
+*/
+
+/*!
\class QWebPage::ChooseMultipleFilesExtensionOption
\since 4.5
\brief The ChooseMultipleFilesExtensionOption class describes the option
@@ -2850,6 +2868,9 @@ QNetworkProxy QWebPage::networkProxy() const
Sets the QNetworkAccessManager \a manager responsible for serving network requests for this
QWebPage.
+ \note It is currently not supported to change the network access manager after the
+ QWebPage has used it. The results of doing this are undefined.
+
\sa networkAccessManager()
*/
void QWebPage::setNetworkAccessManager(QNetworkAccessManager *manager)
@@ -3359,6 +3380,16 @@ quint64 QWebPage::bytesReceived() const
*/
/*!
+ \since 4.6
+ \fn void QWebPage::networkRequestStarted(QWebFrame* frame, QNetworkRequest* request);
+ \preliminary
+
+ This signal is emitted when a \a frame of the current page requests a web resource. The application
+ may want to associate the \a request with the \a frame that initiated it by storing the \a frame
+ as an attribute of the \a request.
+*/
+
+/*!
\fn QWebPagePrivate* QWebPage::handle() const
\internal
*/
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h
index 41d1835..f2bbde0 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h
@@ -56,6 +56,7 @@ namespace WebCore {
class InspectorClientQt;
class ResourceHandle;
class HitTestResult;
+ class QNetworkReplyHandler;
struct FrameLoadRequest;
}
@@ -66,7 +67,7 @@ class QWEBKIT_EXPORT QWebPage : public QObject {
Q_PROPERTY(bool modified READ isModified)
Q_PROPERTY(QString selectedText READ selectedText)
Q_PROPERTY(QSize viewportSize READ viewportSize WRITE setViewportSize)
- Q_PROPERTY(QSize fixedContentsSize READ fixedContentsSize WRITE setFixedContentsSize)
+ Q_PROPERTY(QSize preferredContentsSize READ preferredContentsSize WRITE setPreferredContentsSize)
Q_PROPERTY(bool forwardUnsupportedContent READ forwardUnsupportedContent WRITE setForwardUnsupportedContent)
Q_PROPERTY(LinkDelegationPolicy linkDelegationPolicy READ linkDelegationPolicy WRITE setLinkDelegationPolicy)
Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
@@ -236,8 +237,8 @@ public:
QSize viewportSize() const;
void setViewportSize(const QSize &size) const;
- QSize fixedContentsSize() const;
- void setFixedContentsSize(const QSize &size) const;
+ QSize preferredContentsSize() const;
+ void setPreferredContentsSize(const QSize &size) const;
virtual bool event(QEvent*);
bool focusNextPrevChild(bool next);
@@ -288,6 +289,8 @@ public:
enum ErrorDomain { QtNetwork, Http, WebKit };
class ErrorPageExtensionOption : public ExtensionOption {
public:
+ QUrl url;
+ QWebFrame* frame;
ErrorDomain domain;
int error;
QString errorString;
@@ -344,6 +347,8 @@ Q_SIGNALS:
void saveFrameStateRequested(QWebFrame* frame, QWebHistoryItem* item);
void restoreFrameStateRequested(QWebFrame* frame);
+ void networkRequestStarted(QWebFrame* frame, QNetworkRequest* request);
+
protected:
virtual QWebPage *createWindow(WebWindowType type);
virtual QObject *createPlugin(const QString &classid, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues);
@@ -378,6 +383,7 @@ private:
friend class WebCore::FrameLoaderClientQt;
friend class WebCore::InspectorClientQt;
friend class WebCore::ResourceHandle;
+ friend class WebCore::QNetworkReplyHandler;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWebPage::FindFlags)
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp
index eedf7d1..ffa21e4 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.cpp
@@ -62,6 +62,8 @@ public:
QString localStoragePath;
QString offlineWebApplicationCachePath;
qint64 offlineStorageDefaultQuota;
+ float printingMinimumShrinkFactor;
+ float printingMaximumShrinkFactor;
void apply();
WebCore::Settings* settings;
@@ -174,6 +176,12 @@ void QWebSettingsPrivate::apply()
QString storagePath = !localStoragePath.isEmpty() ? localStoragePath : global->localStoragePath;
settings->setLocalStorageDatabasePath(storagePath);
+ float minimumShrinkFactor = printingMinimumShrinkFactor > 0.0f ? printingMinimumShrinkFactor : global->printingMinimumShrinkFactor;
+ settings->setPrintingMinimumShrinkFactor(minimumShrinkFactor);
+
+ float maximumShrinkFactor = printingMaximumShrinkFactor > 0.0f ? printingMaximumShrinkFactor : global->printingMaximumShrinkFactor;
+ settings->setPrintingMaximumShrinkFactor(maximumShrinkFactor);
+
value = attributes.value(QWebSettings::ZoomTextOnly,
global->attributes.value(QWebSettings::ZoomTextOnly));
settings->setZoomsTextOnly(value);
@@ -377,6 +385,9 @@ QWebSettings::QWebSettings()
d->attributes.insert(QWebSettings::LocalContentCanAccessRemoteUrls, false);
d->attributes.insert(QWebSettings::SessionStorageEnabled, true);
d->offlineStorageDefaultQuota = 5 * 1024 * 1024;
+ d->defaultTextEncoding = QLatin1String("iso-8859-1");
+ d->printingMinimumShrinkFactor = 0.0f;
+ d->printingMaximumShrinkFactor = 0.0f;
}
/*!
@@ -491,6 +502,60 @@ QString QWebSettings::defaultTextEncoding() const
}
/*!
+ \since 4.7
+ Specifies minimum shrink fator allowed for printing. If set to 0 a
+ default value is used.
+
+ When printing, content will be shrunk to reduce page usage, it
+ will reduced by a factor between printingMinimumShrinkFactor and
+ printingMaximumShrinkFactor.
+
+ \sa printingMinimumShrinkFactor()
+ \sa setPrintingMaximumShrinkFactor()
+ \sa printingMaximumShrinkFactor()
+*/
+void QWebSettings::setPrintingMinimumShrinkFactor(float printingMinimumShrinkFactor)
+{
+ d->printingMinimumShrinkFactor = printingMinimumShrinkFactor;
+ d->apply();
+}
+
+/*!
+ \since 4.7
+ returns the minimum shrink factor used for printing.
+
+ \sa setPrintingMinimumShrinkFactor()
+*/
+float QWebSettings::printingMinimumShrinkFactor() const
+{
+ return d->printingMinimumShrinkFactor;
+}
+
+/*!
+ \since 4.7
+ Specifies maximum shrink fator allowed for printing. If set to 0 a
+ default value is used.
+
+ \sa setPrintingMinimumShrinkFactor()
+*/
+void QWebSettings::setPrintingMaximumShrinkFactor(float printingMaximumShrinkFactor)
+{
+ d->printingMaximumShrinkFactor = printingMaximumShrinkFactor;
+ d->apply();
+}
+
+/*!
+ \since 4.7
+ returns the maximum shrink factor used for printing.
+
+ \sa setPrintingMinimumShrinkFactor()
+*/
+float QWebSettings::printingMaximumShrinkFactor() const
+{
+ return d->printingMaximumShrinkFactor;
+}
+
+/*!
Sets the path of the icon database to \a path. The icon database is used
to store "favicons" associated with web sites.
@@ -628,11 +693,6 @@ void QWebSettings::clearMemoryCaches()
// Invalidating the font cache and freeing all inactive font data.
WebCore::fontCache()->invalidate();
-#if ENABLE(OFFLINE_WEB_APPLICATIONS)
- // Empty the application cache.
- WebCore::cacheStorage().empty();
-#endif
-
// Empty the Cross-Origin Preflight cache
WebCore::CrossOriginPreflightResultCache::shared().empty();
}
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h b/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h
index 4790823..e68ea53 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebsettings.h
@@ -103,6 +103,12 @@ public:
void setDefaultTextEncoding(const QString &encoding);
QString defaultTextEncoding() const;
+ void setPrintingMinimumShrinkFactor(float printingMinimumShrinkFactor);
+ float printingMinimumShrinkFactor() const;
+
+ void setPrintingMaximumShrinkFactor(float printingMaximimShrinkFactor);
+ float printingMaximumShrinkFactor() const;
+
static void setIconDatabasePath(const QString &location);
static QString iconDatabasePath();
static void clearIconDatabase();
diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp
index 882f3d7..95d7183 100644
--- a/src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebview.cpp
@@ -1,6 +1,7 @@
/*
Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
Copyright (C) 2008 Holger Hans Peter Freyther
+ Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -47,12 +48,21 @@ public:
virtual void scroll(int dx, int dy, const QRect&);
virtual void update(const QRect& dirtyRect);
+ virtual void setInputMethodEnabled(bool enable);
+#if QT_VERSION >= 0x040600
+ virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable);
+#endif
+#ifndef QT_NO_CURSOR
virtual QCursor cursor() const;
virtual void updateCursor(const QCursor& cursor);
+#endif
+ virtual QPalette palette() const;
virtual int screenNumber() const;
- virtual WId winId() const;
+ virtual QWidget* ownerWidget() const;
+
+ virtual QObject* pluginParent() const;
void _q_pageDestroyed();
@@ -72,6 +82,20 @@ void QWebViewPrivate::update(const QRect & dirtyRect)
view->update(dirtyRect);
}
+void QWebViewPrivate::setInputMethodEnabled(bool enable)
+{
+ view->setAttribute(Qt::WA_InputMethodEnabled, enable);
+}
+#if QT_VERSION >= 0x040600
+void QWebViewPrivate::setInputMethodHint(Qt::InputMethodHint hint, bool enable)
+{
+ if (enable)
+ view->setInputMethodHints(view->inputMethodHints() | hint);
+ else
+ view->setInputMethodHints(view->inputMethodHints() & ~hint);
+}
+#endif
+#ifndef QT_NO_CURSOR
QCursor QWebViewPrivate::cursor() const
{
return view->cursor();
@@ -81,6 +105,12 @@ void QWebViewPrivate::updateCursor(const QCursor& cursor)
{
view->setCursor(cursor);
}
+#endif
+
+QPalette QWebViewPrivate::palette() const
+{
+ return view->palette();
+}
int QWebViewPrivate::screenNumber() const
{
@@ -92,12 +122,14 @@ int QWebViewPrivate::screenNumber() const
return 0;
}
-WId QWebViewPrivate::winId() const
+QWidget* QWebViewPrivate::ownerWidget() const
{
- if (view)
- return view->winId();
+ return view;
+}
- return 0;
+QObject* QWebViewPrivate::pluginParent() const
+{
+ return view;
}
void QWebViewPrivate::_q_pageDestroyed()
@@ -119,7 +151,7 @@ void QWebViewPrivate::_q_pageDestroyed()
It can be used in various applications to display web content live from the
Internet.
- The image below shows QWebView previewed in \QD with the Trolltech website.
+ The image below shows QWebView previewed in \QD with a Nokia website.
\image qwebview-url.png
@@ -213,8 +245,10 @@ QWebView::QWebView(QWidget *parent)
*/
QWebView::~QWebView()
{
- if (d->page)
+ if (d->page) {
d->page->d->view = 0;
+ d->page->d->client = 0;
+ }
if (d->page && d->page->parent() == this)
delete d->page;
diff --git a/src/3rdparty/webkit/WebKit/qt/ChangeLog b/src/3rdparty/webkit/WebKit/qt/ChangeLog
index 99ddaa5..7987613 100644
--- a/src/3rdparty/webkit/WebKit/qt/ChangeLog
+++ b/src/3rdparty/webkit/WebKit/qt/ChangeLog
@@ -1,3 +1,484 @@
+2009-10-19 Nate Chapin <japhet@chromium.org>
+
+ Unreviewed, build fix.
+
+ Update call to FrameLoader::loadFrameRequest().
+
+ * Api/qwebpage.cpp:
+ (QWebPage::triggerAction):
+
+2009-10-19 Viatcheslav Ostapenko <ostapenko.viatcheslav@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ Add QWebElement::render API which allows rendering of single
+ element.
+
+ * Api/qwebelement.cpp:
+ (QWebElement::render):
+ * Api/qwebelement.h:
+ * tests/qwebelement/tst_qwebelement.cpp:
+ (tst_QWebElement::render):
+ * tests/qwebelement/qwebelement.qrc:
+ * tests/qwebelement/image.png: Added.
+
+2009-10-19 Markus Goetz <Markus.Goetz@nokia.com>
+
+ Reviewed by Ariya Hidayat.
+
+ QWebPage: Doc: setNetworkAccessManager should only be called once.
+
+ * Api/qwebpage.cpp:
+
+2009-10-19 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Tor Arne.
+
+ Wrong ifdef combination in QGraphicsWebView's event method.
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebView::event):
+
+2009-10-19 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Holger Freyther.
+
+ [Qt] Windowed Plugins: Don't crash when client is 0.
+
+ Client is 0 when we use QWebPage without a QWebView or QGraphicsWebView.
+ In addition, setFrameRect()/updatePluginWidget() is called even if the
+ plugin was not succesfully loaded. updatePluginWidget() updates the
+ window rect which is, in theory, useful to draw something that indicates
+ that we didn't load successfully.
+
+ So, a status check is added to setNPWindowIfNeeded.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30380
+
+ * tests/qwebpage/qwebpage.pro:
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (takeScreenshot):
+ (tst_QWebPage::screenshot_data):
+ (tst_QWebPage::screenshot):
+ * tests/resources/test.swf: Copied from LayoutTests/fast/replaced/resources/test.swf.
+
+2009-10-19 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Holger Freyther.
+
+ [Qt] Windowed Plugins: Fix crash when QWebPage is deleted after QWebView.
+
+ Fixes various sources of crashes:
+ 1. The PluginContainer is a child of QWebView. When the view gets deleted,
+ the PluginView is not notified about the deletion of PluginContainer.
+ 2. QWebView destructor does not set client to 0.
+ 3. Sometimes pending paint events are sent after the plugin has died, so add
+ a check in PluginView::setNPWindowIfNeeded.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30354
+
+ * Api/qwebview.cpp:
+ (QWebView::~QWebView):
+ * tests/qwebview/qwebview.pro:
+ * tests/qwebview/tst_qwebview.cpp:
+ (tst_QWebView::reusePage_data):
+ (tst_QWebView::reusePage):
+
+2009-10-19 Jakob Truelsen <antialize@gmail.com>
+
+ Reviewed by Adam Barth.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29042
+
+ Allow one to costumize the minimal and maximal shrink factors,
+ Added methods setPrintingMinimumShrinkFactor, printingMinimumShrinkFactor,
+ setPrintingMaximumShrinkFactor, printingMaximumShrinkFactor to QWebSettings.
+
+
+ * Api/qwebsettings.cpp:
+ (QWebSettingsPrivate::apply):
+ (QWebSettings::QWebSettings):
+ (QWebSettings::setPrintingMinimumShrinkFactor):
+ (QWebSettings::printingMinimumShrinkFactor):
+ (QWebSettings::setPrintingMaximumShrinkFactor):
+ (QWebSettings::printingMaximumShrinkFactor):
+ * Api/qwebsettings.h:
+
+2009-10-18 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Rename fixedContentsSize property to preferredContentsSize as
+ agreed upon with Simon Hausmann and Matthias Ettrich.
+
+ * Api/qwebpage.cpp:
+ (QWebPage::preferredContentsSize):
+ (QWebPage::setPreferredContentsSize):
+ * Api/qwebpage.h:
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::transitionToCommittedForNewPage):
+
+2009-10-16 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] QGLauncher leaks WebPage object
+ https://bugs.webkit.org/show_bug.cgi?id=30465
+
+ Make 'SharedScene' to own 'WebPage' reference and delete it at its destructor.
+
+ * Api/qwebpage.cpp:
+ (QWebPage::view):
+ * Api/qwebpage_p.h:
+ * QGVLauncher/main.cpp:
+ (SharedScene::SharedScene):
+ (SharedScene::~SharedScene):
+
+2009-10-16 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] "dangling" pointer to qwebpage's view object can leads QGLauncher to crash
+ https://bugs.webkit.org/show_bug.cgi?id=30459
+
+ Remove all setView(ev->widget()) calls in QWebPage and QGWV event handling methods,
+ since QWebPageClient would do the trick.
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebView::hoverMoveEvent):
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::mouseMoveEvent):
+ (QWebPagePrivate::mousePressEvent):
+ (QWebPagePrivate::mouseDoubleClickEvent):
+ (QWebPagePrivate::mouseReleaseEvent):
+ (QWebPagePrivate::wheelEvent):
+ (QWebPagePrivate::dragEnterEvent):
+ (QWebPagePrivate::dragLeaveEvent):
+ (QWebPagePrivate::dragMoveEvent):
+
+2009-10-16 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
+
+ Pull out r49676 as it caused build breakges on Symbian
+
+ * Api/qwebpage.cpp:
+
+2009-10-16 Yael Aharon <yael.aharon@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ [Qt] Need a way to inform the application when a Netscape plugin is created or deleted
+ https://bugs.webkit.org/show_bug.cgi?id=30179
+
+ Added "c" style static methods for the application to hook up for
+ receiving notifications when a plugin is created or destroyed.
+
+ * Api/qwebpage.cpp:
+
+2009-10-15 Antonio Gomes <tonikitoo@webkit.org>
+
+ Rubberstamped by Tor Arne.
+
+ Make QGLauncher's WebPage class constructor to get a QObject* as parent (not QWidget*).
+
+ * QGVLauncher/main.cpp:
+ (WebPage::WebPage):
+
+2009-10-15 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Tor Arne.
+
+ [Qt] QGLauncher crashes while closing a window
+ https://bugs.webkit.org/show_bug.cgi?id=30385
+
+ Set page's pageClient reference to '0' at QGWV deletion.
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebView::~QGraphicsWebView):
+ * tests/qgraphicswebview/tst_qgraphicswebview.cpp:
+ (WebPage::WebPage):
+ (WebPage::aborting):
+ (tst_QGraphicsWebView::crashOnViewlessWebPages):
+
+2009-10-13 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Make context menu to work in QGraphicsWebView
+ https://bugs.webkit.org/show_bug.cgi?id=30336
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebView::event):
+
+2009-10-13 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Plugins : Remove all traces of winId. Use ownerWidget() instead.
+
+ This is a bug for two reasons:
+ 1. Everytime we use winId(), we end up creating a native widget. This causes an
+ unnecessary copy of contents from the backing store to the native widget.
+ 2. Neither windowed nor windowless plugins require the winId of the QWebView or
+ QGraphicsView.
+
+ Introduce ownerWidget() which returns a QWidget * without creating a native widget
+ (as opposed to QWidget::find(winId)).
+
+ https://bugs.webkit.org/show_bug.cgi?id=30170
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebViewPrivate::ownerWidget):
+ * Api/qwebview.cpp:
+ (QWebViewPrivate::ownerWidget):
+
+2009-10-13 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Add some initial autotests for QWebPage's ErrorPageExtention
+ https://bugs.webkit.org/show_bug.cgi?id=30296
+
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (ErrorPage::ErrorPage):
+ (ErrorPage::supportsExtension):
+ (ErrorPage::extension):
+ (tst_QWebPage::errorPageExtension):
+
+2009-10-13 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] better handle possible edge cases on qwebframe::requestedUrl use
+ https://bugs.webkit.org/show_bug.cgi?id=30216
+
+ QWebFrame::requestedUrl can be called at any time during the load
+ process, including:
+
+ * An error handling (whereas an alternate error page for unsuccessful
+ load is being set);
+ * A ssl error exception call;
+ * During navigation notifications/callbacks (titleChanged, urlChanged,
+ progresses, addHistoryEntry, etc);
+ * Among others.
+
+ This patch makes requestedUrl calls to fallback to FrameLoaderClient
+ m_loadError's failingURL when an error has occurred, unless it is
+ null/empty.
+
+ Also, m_loadError is now being reset at each the main frame starts a
+ load, in order to avoid previous load errors footprints.
+
+ * Api/qwebframe.cpp:
+ (QWebFrame::requestedUrl):
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::postProgressStartedNotification):
+
+2009-10-12 Jakub Wieczorek <faw217@gmail.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Missing default value for the default text encoding.
+ https://bugs.webkit.org/show_bug.cgi?id=30311
+
+ QtWebKit has provided a default, hardcoded value for default charset but since
+ the addition of the defaultTextEncoding setting in QWebSettings, that hardcoded
+ value has had no effect.
+
+ Added a regression test and unskipped fast/dom/Document/document-charset.html,
+ which is passing now.
+
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::QWebPagePrivate):
+ * Api/qwebsettings.cpp:
+ (QWebSettings::QWebSettings):
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (tst_QWebPage::defaultTextEncoding):
+
+2009-10-12 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ Implement the new palette() methods on the page clients
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebViewPrivate::palette):
+ * Api/qwebview.cpp:
+ (QWebViewPrivate::palette):
+
+2009-10-12 Jedrzej Nowacki <jedrzej.nowacki@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ QWebPage's createViewlessPlugin autotest crash fix.
+
+ It is possible that plugins that are QWidgets or QGraphicsWidgets
+ are created before a view has been assigned to a QWebPage. The
+ plug-ins won't be fully functional, as by design, they should
+ visualise something, but they won't crash and will stay in memory.
+
+ An autotest that covers this use-case, is included.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30118
+
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::createPlugin):
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (PluginTrackedPageWidget::PluginTrackedPageWidget):
+ (PluginTrackedPageGraphicsWidget::PluginTrackedPageGraphicsWidget):
+ (PluginTrackedPageGraphicsWidget::createPlugin):
+ (tst_QWebPage::destroyPlugin):
+ (tst_QWebPage::createViewlessPlugin):
+
+2009-10-09 Joe Ligman <joseph.ligman@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Sets Qt::WA_InputMethodEnabled and Qt::ImhHiddenText for password fields in EditorClientQt
+ setInputMethodState. This change is needed so widgets such as the s60 software
+ input panel can receive input method events for password fields.
+ It's up to the Qt platform to determine which widget will receive input method
+ events when these flags are set.
+ Also added implementation for setInputMethodEnabled and setInputMethodHint
+ to QGraphicsWebViewPrivate and QWebViewPrivate. This change removes the direct
+ dependency on QWebView and uses QWebPageClient.
+ Added autotest to tst_qwebpage.cpp
+ https://bugs.webkit.org/show_bug.cgi?id=30023
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebViewPrivate::setInputMethodEnabled):
+ (QGraphicsWebViewPrivate::setInputMethodHint):
+ * Api/qwebview.cpp:
+ (QWebViewPrivate::setInputMethodEnabled):
+ (QWebViewPrivate::setInputMethodHint):
+ * WebCoreSupport/EditorClientQt.cpp:
+ (WebCore::EditorClientQt::setInputMethodState):
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (tst_QWebPage::inputMethods):
+
+2009-10-08 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move executeScript from FrameLoader to ScriptController
+ https://bugs.webkit.org/show_bug.cgi?id=30200
+
+ Update API call.
+
+ * Api/qwebframe.cpp:
+ (QWebFrame::evaluateJavaScript):
+
+2009-10-08 Jedrzej Nowacki <jedrzej.nowacki@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Part of testOptionalJSObjects autotest was marked as "expect to fail".
+
+ Two places in tst_QWebPage::testOptionalJSObjects were marked as
+ expected to fail. The problem concern checking if a feature is enabled
+ or disabled. According to discussion on webkit dev mailing list
+ a disabled feature should be invisible from java script level, but
+ there are exceptions from the rule. So we decided to disable the test
+ for now.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29867
+
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (tst_QWebPage::testOptionalJSObjects):
+
+2009-10-07 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Darin Adler.
+
+ Factor PolicyChecker out of FrameLoader
+ https://bugs.webkit.org/show_bug.cgi?id=30155
+
+ Move the policy callback to the policy object.
+
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::callPolicyFunction):
+
+2009-10-07 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Get rid of useless loadFailed signal in QGraphicsWebView
+ https://bugs.webkit.org/show_bug.cgi?id=30166
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebViewPrivate::_q_doLoadFinished):
+ * Api/qgraphicswebview.h:
+ * QGVLauncher/main.cpp:
+ (MainWindow::init):
+ (MainWindow::loadFinished):
+
+2009-10-07 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ Add a simple rotation effect to QGVLauncher
+
+ https://bugs.webkit.org/show_bug.cgi?id=30162
+
+ * QGVLauncher/main.cpp:
+ (MainView::animatedFlip):
+ (MainWindow::animatedFlip):
+ (MainWindow::buildUI):
+
+2009-10-07 Volker Hilsheimer <volker.hilsheimer@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Doc: Document HTML and status as properties.
+
+ * Api/qgraphicswebview.cpp:
+
+2009-10-07 Martin Smith <msmith@trolltech.com>
+
+ Reviewed by Simon Hausmann.
+
+ Fix qdoc warning about disabled renderHints property
+ on Symbian.
+
+ * Api/qwebview.cpp:
+ * Api/qwebview.h:
+
+2009-10-06 Adam Barth <abarth@webkit.org>
+
+ Reviewed by Eric Seidel.
+
+ Move setLocalLoadPolicy and friends to SecurityOrigin
+ https://bugs.webkit.org/show_bug.cgi?id=30110
+
+ Call the new API.
+
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::QWebPagePrivate):
+
+2009-10-06 Benjamin C Meyer <bmeyer@rim.com>
+
+ Reviewed by Ariya Hidayat.
+
+ When the drag data contains an image set it on the QDrag so it will be visible to the user.
+
+ * WebCoreSupport/DragClientQt.cpp:
+ (WebCore::DragClientQt::startDrag):
+
+2009-10-06 Pavel Feldman <pfeldman@chromium.org>
+
+ Reviewed by Timothy Hatcher.
+
+ Web Inspector: close inspector client view on
+ InspectorController::close API call.
+
+ In order to run batch web inspector layout tests (and not affect
+ subsequent tests) we should close inspector client's view upon
+ InspectorController::close API call.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30009
+
+ * WebCoreSupport/InspectorClientQt.cpp:
+ (WebCore::InspectorClientQt::createPage):
+
2009-10-06 Janne Koskinen <janne.p.koskinen@digia.com>
Reviewed by Simon Hausmann.
@@ -11,6 +492,159 @@
* Api/qwebview.cpp:
(QWebView::QWebView):
+2009-10-05 Holger Hans Peter Freyther <zecke@selfish.org>
+
+ Reviewed by Simon Hausmann.
+
+ QtLauncher: print the number of loaded urls
+
+ When using the -r mode print the number of URLs loaded so far. This
+ is extremly useful when opening the same URL over and over again and
+ one wants to see the progress.
+
+ * QtLauncher/main.cpp:
+ (URLLoader::URLLoader):
+ (URLLoader::loadNext):
+
+2009-10-05 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ Add screenshot option to menubar
+
+ https://bugs.webkit.org/show_bug.cgi?id=30067
+
+ * QtLauncher/main.cpp:
+ (MainWindow::screenshot):
+ (MainWindow::setupUI):
+
+2009-10-05 Girish Ramakrishnan <girish@forwardbias.in>
+
+ Reviewed by Simon Hausmann.
+
+ Setting the env QTLAUNCHER_USE_ARGB_VISUALS makes Qt use WA_TranslucentWindow.
+
+ https://bugs.webkit.org/show_bug.cgi?id=30068
+
+ * QtLauncher/main.cpp:
+ (MainWindow::MainWindow):
+
+2009-10-05 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Rubberstamped by Simon Hausmann.
+
+ Add documentation to the ErrorPageExtension.
+
+ * Api/qwebpage.cpp:
+
+2009-10-02 Yael Aharon <yael.aharon@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ [Qt] Inform the application when a new request is created
+ https://bugs.webkit.org/show_bug.cgi?id=29975
+
+ Add a signal to QWebPage, to inform the application when a request is created.
+
+ * Api/qwebpage.cpp:
+ * Api/qwebpage.h:
+ * tests/qwebpage/tst_qwebpage.cpp:
+ (tst_QWebPage::loadFinished):
+
+2009-10-05 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ ErrorPageExtension: Add a pointer to the QWebFrame that had
+ an error.
+
+ * Api/qwebpage.h:
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::callErrorPageExtension):
+
+2009-10-05 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by Tor Arne Vestbø.
+
+ Do not empty the offline web appcache when clearing
+ memory caches. That one is not in memory, but stored
+ in sqlite.
+
+ * Api/qwebsettings.cpp:
+ (QWebSettings::clearMemoryCaches):
+
+2009-10-05 J-P Nurmi <jpnurmi@gmail.com>
+
+ Reviewed by Simon Hausmann.
+
+ Added QGraphicsWidget-plugins support to FrameLoaderClientQt.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29710
+
+ * Api/qgraphicswebview.cpp:
+ (QGraphicsWebViewPrivate::pluginParent):
+ * Api/qwebview.cpp:
+ (QWebViewPrivate::pluginParent):
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::):
+ (WebCore::FrameLoaderClientQt::createPlugin):
+
+2009-10-03 Adam Barth <abarth@webkit.org>
+
+ Unreview build fix. I wish I had a try server...
+
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::updateAction):
+
+2009-10-02 Norbert Leser <norbert.leser@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Conditionally guard cursor code (cursor and updateCursor functions) with !QT_NO_CURSOR.
+ Otherwise, it is inconsistent with class declaration of QCursor.
+
+ * Api/qgraphicswebview.cpp:
+ * Api/qwebview.cpp:
+
+2009-10-02 Prasanth Ullattil <prasanth.ullattil@nokia.com>
+
+ Reviewed by Simon Hausmann.
+
+ Fix compiler warnings about unused function arguments.
+
+ * Api/qwebframe.cpp:
+ (QWebFrame::scrollBarMinimum):
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::focusInEvent):
+ (QWebPagePrivate::focusOutEvent):
+ (QWebPagePrivate::leaveEvent):
+ (QWebPage::javaScriptAlert):
+ (QWebPage::javaScriptConfirm):
+ (QWebPage::javaScriptPrompt):
+ (QWebPage::triggerAction):
+ (QWebPage::acceptNavigationRequest):
+ (QWebPage::chooseFile):
+ * WebCoreSupport/ChromeClientQt.cpp:
+ (WebCore::ChromeClientQt::repaint):
+ (WebCore::ChromeClientQt::mouseDidMoveOverElement):
+ (WebCore::ChromeClientQt::reachedMaxAppCacheSize):
+ * WebCoreSupport/ContextMenuClientQt.cpp:
+ (WebCore::ContextMenuClientQt::downloadURL):
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::dispatchWillPerformClientRedirect):
+ (WebCore::FrameLoaderClientQt::setMainFrameDocumentReady):
+ (WebCore::FrameLoaderClientQt::representationExistsForURLScheme):
+ (WebCore::FrameLoaderClientQt::generatedMIMETypeForURLScheme):
+ (WebCore::FrameLoaderClientQt::shouldGoToHistoryItem):
+ (WebCore::FrameLoaderClientQt::pluginWillHandleLoadError):
+ (WebCore::FrameLoaderClientQt::assignIdentifierToInitialRequest):
+ (WebCore::FrameLoaderClientQt::dispatchDidFinishLoading):
+ (WebCore::FrameLoaderClientQt::createJavaAppletWidget):
+ * WebCoreSupport/InspectorClientQt.cpp:
+ (WebCore::InspectorClientQt::setAttachedWindowHeight):
+ (WebCore::InspectorClientQt::highlight):
+ (WebCore::InspectorClientQt::removeSetting):
+
2009-10-01 Simon Hausmann <simon.hausmann@nokia.com>
Reviewed by Tor Arne Vestbø.
@@ -23,6 +657,37 @@
(QWebPagePrivate::handleSoftwareInputPanel):
* Api/qwebpage_p.h:
+2009-10-01 Alexis Menard <alexis.menard@nokia.com>
+
+ Reviewed by Tor Arne Vestbø.
+
+ Rename QWebGraphicsItem to QGraphicsWebView
+
+ * Api/headers.pri:
+ * Api/qwebpage.h:
+ * Api/qwebgraphicsitem.cpp: Renamed.
+ * Api/qwebgraphicsitem.h: Renamed.
+ * WebKit/qt/QGVLauncher/main.cpp:
+ * tests/tests.pro:
+ * tests/qwebgraphicsitem/qwebgraphicsitem.pro: Renamed.
+ * tests/qwebgraphicsitem/tst_qwebgraphicsitem.cpp: Renamed.
+
+2009-10-01 Antonio Gomes <tonikitoo@webkit.org>
+
+ Reviewed by Simon Hausmann.
+
+ https://bugs.webkit.org/show_bug.cgi?id=29248
+ [Qt] [API] Make it possible to have 'invisible' loads
+
+ Make QWebFrame's setHtml and setContent methods to not change
+ session and global history at all.
+
+ * Api/qwebframe.cpp:
+ (QWebFrame::setHtml):
+ (QWebFrame::setContent):
+ * tests/qwebframe/qwebframe.pro:
+ * tests/qwebframe/tst_qwebframe.cpp:
+
2009-10-01 Kristian Amlie <kristian.amlie@nokia.com>
Reviewed by Simon Hausmann.
@@ -59,6 +724,17 @@
* tests/qwebpage/tst_qwebpage.cpp:
(tst_QWebPage::inputMethods):
+2009-09-30 Kenneth Rohde Christiansen <kenneth@webkit.org>
+
+ Reviewed by David Hyatt.
+
+ Add the failed URL to the ErrorPageExtension, as it is quite
+ useful for creating error pages.
+
+ * Api/qwebpage.h:
+ * WebCoreSupport/FrameLoaderClientQt.cpp:
+ (WebCore::FrameLoaderClientQt::callErrorPageExtension):
+
2009-09-29 Andras Becsi <becsi.andras@stud.u-szeged.hu>
Reviewed by Tor Arne Vestbø.
diff --git a/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.cpp b/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.cpp
deleted file mode 100644
index d7fae07..0000000
--- a/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.cpp
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * kimgio import filter for MS Windows .ico files
- *
- * Distributed under the terms of the LGPL
- * Copyright (c) 2000 Malte Starostik <malte@kde.org>
- *
- */
-
-#include "config.h"
-#include "ICOHandler.h"
-
-#include <cstring>
-#include <cstdlib>
-#include <algorithm>
-#include <vector>
-
-#include <QtGui/QImage>
-#include <QtGui/QBitmap>
-#include <QtGui/QApplication>
-#include <QtCore/QVector>
-#include <QtGui/QDesktopWidget>
-
-namespace
-{
- // Global header (see http://www.daubnet.com/formats/ICO.html)
- struct IcoHeader
- {
- enum Type { Icon = 1, Cursor };
- quint16 reserved;
- quint16 type;
- quint16 count;
- };
-
- inline QDataStream& operator >>( QDataStream& s, IcoHeader& h )
- {
- return s >> h.reserved >> h.type >> h.count;
- }
-
- // Based on qt_read_dib et al. from qimage.cpp
- // (c) 1992-2002 Nokia Corporation and/or its subsidiary(-ies).
- struct BMP_INFOHDR
- {
- static const quint32 Size = 40;
- quint32 biSize; // size of this struct
- quint32 biWidth; // pixmap width
- quint32 biHeight; // pixmap height
- quint16 biPlanes; // should be 1
- quint16 biBitCount; // number of bits per pixel
- enum Compression { RGB = 0 };
- quint32 biCompression; // compression method
- quint32 biSizeImage; // size of image
- quint32 biXPelsPerMeter; // horizontal resolution
- quint32 biYPelsPerMeter; // vertical resolution
- quint32 biClrUsed; // number of colors used
- quint32 biClrImportant; // number of important colors
- };
- const quint32 BMP_INFOHDR::Size;
-
- QDataStream& operator >>( QDataStream &s, BMP_INFOHDR &bi )
- {
- s >> bi.biSize;
- if ( bi.biSize == BMP_INFOHDR::Size )
- {
- s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount;
- s >> bi.biCompression >> bi.biSizeImage;
- s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter;
- s >> bi.biClrUsed >> bi.biClrImportant;
- }
- return s;
- }
-
-#if 0
- QDataStream &operator<<( QDataStream &s, const BMP_INFOHDR &bi )
- {
- s << bi.biSize;
- s << bi.biWidth << bi.biHeight;
- s << bi.biPlanes;
- s << bi.biBitCount;
- s << bi.biCompression;
- s << bi.biSizeImage;
- s << bi.biXPelsPerMeter << bi.biYPelsPerMeter;
- s << bi.biClrUsed << bi.biClrImportant;
- return s;
- }
-#endif
-
- // Header for every icon in the file
- struct IconRec
- {
- unsigned char width;
- unsigned char height;
- quint16 colors;
- quint16 hotspotX;
- quint16 hotspotY;
- quint32 size;
- quint32 offset;
- };
-
- inline QDataStream& operator >>( QDataStream& s, IconRec& r )
- {
- return s >> r.width >> r.height >> r.colors
- >> r.hotspotX >> r.hotspotY >> r.size >> r.offset;
- }
-
- struct LessDifference
- {
- LessDifference( unsigned s, unsigned c )
- : size( s ), colors( c ) {}
-
- bool operator ()( const IconRec& lhs, const IconRec& rhs ) const
- {
- // closest size match precedes everything else
- if ( std::abs( int( lhs.width - size ) ) <
- std::abs( int( rhs.width - size ) ) ) return true;
- else if ( std::abs( int( lhs.width - size ) ) >
- std::abs( int( rhs.width - size ) ) ) return false;
- else if ( colors == 0 )
- {
- // high/true color requested
- if ( lhs.colors == 0 ) return true;
- else if ( rhs.colors == 0 ) return false;
- else return lhs.colors > rhs.colors;
- }
- else
- {
- // indexed icon requested
- if ( lhs.colors == 0 && rhs.colors == 0 ) return false;
- else if ( lhs.colors == 0 ) return false;
- else return std::abs( int( lhs.colors - colors ) ) <
- std::abs( int( rhs.colors - colors ) );
- }
- }
- unsigned size;
- unsigned colors;
- };
-
- bool loadFromDIB( QDataStream& stream, const IconRec& rec, QImage& icon )
- {
- BMP_INFOHDR header;
- stream >> header;
- if ( stream.atEnd() || header.biSize != BMP_INFOHDR::Size ||
- header.biSize > rec.size ||
- header.biCompression != BMP_INFOHDR::RGB ||
- ( header.biBitCount != 1 && header.biBitCount != 4 &&
- header.biBitCount != 8 && header.biBitCount != 24 &&
- header.biBitCount != 32 ) ) return false;
-
- unsigned paletteSize, paletteEntries;
-
- if (header.biBitCount > 8)
- {
- paletteEntries = 0;
- paletteSize = 0;
- }
- else
- {
- paletteSize = (1 << header.biBitCount);
- paletteEntries = paletteSize;
- if (header.biClrUsed && header.biClrUsed < paletteSize)
- paletteEntries = header.biClrUsed;
- }
-
- // Always create a 32-bit image to get the mask right
- // Note: this is safe as rec.width, rec.height are bytes
- icon = QImage( rec.width, rec.height, QImage::Format_ARGB32 );
- if ( icon.isNull() ) return false;
-
- QVector< QRgb > colorTable( paletteSize );
-
- colorTable.fill( QRgb( 0 ) );
- for ( unsigned i = 0; i < paletteEntries; ++i )
- {
- unsigned char rgb[ 4 ];
- stream.readRawData( reinterpret_cast< char* >( &rgb ),
- sizeof( rgb ) );
- colorTable[ i ] = qRgb( rgb[ 2 ], rgb[ 1 ], rgb[ 0 ] );
- }
-
- unsigned bpl = ( rec.width * header.biBitCount + 31 ) / 32 * 4;
-
- unsigned char* buf = new unsigned char[ bpl ];
- for ( unsigned y = rec.height; !stream.atEnd() && y--; )
- {
- stream.readRawData( reinterpret_cast< char* >( buf ), bpl );
- unsigned char* pixel = buf;
- QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine( y ) );
- switch ( header.biBitCount )
- {
- case 1:
- for ( unsigned x = 0; x < rec.width; ++x )
- *p++ = colorTable[
- ( pixel[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ];
- break;
- case 4:
- for ( unsigned x = 0; x < rec.width; ++x )
- if ( x & 1 ) *p++ = colorTable[ pixel[ x / 2 ] & 0x0f ];
- else *p++ = colorTable[ pixel[ x / 2 ] >> 4 ];
- break;
- case 8:
- for ( unsigned x = 0; x < rec.width; ++x )
- *p++ = colorTable[ pixel[ x ] ];
- break;
- case 24:
- for ( unsigned x = 0; x < rec.width; ++x )
- *p++ = qRgb( pixel[ 3 * x + 2 ],
- pixel[ 3 * x + 1 ],
- pixel[ 3 * x ] );
- break;
- case 32:
- for ( unsigned x = 0; x < rec.width; ++x )
- *p++ = qRgba( pixel[ 4 * x + 2 ],
- pixel[ 4 * x + 1 ],
- pixel[ 4 * x ],
- pixel[ 4 * x + 3] );
- break;
- }
- }
- delete[] buf;
-
- if ( header.biBitCount < 32 )
- {
- // Traditional 1-bit mask
- bpl = ( rec.width + 31 ) / 32 * 4;
- buf = new unsigned char[ bpl ];
- for ( unsigned y = rec.height; y--; )
- {
- stream.readRawData( reinterpret_cast< char* >( buf ), bpl );
- QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine( y ) );
- for ( unsigned x = 0; x < rec.width; ++x, ++p )
- if ( ( ( buf[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ) )
- *p &= RGB_MASK;
- }
- delete[] buf;
- }
- return true;
- }
-}
-
-ICOHandler::ICOHandler()
-{
-}
-
-bool ICOHandler::canRead() const
-{
- return canRead(device());
-}
-
-bool ICOHandler::read(QImage *outImage)
-{
-
- qint64 offset = device()->pos();
-
- QDataStream stream( device() );
- stream.setByteOrder( QDataStream::LittleEndian );
- IcoHeader header;
- stream >> header;
- if ( stream.atEnd() || !header.count ||
- ( header.type != IcoHeader::Icon && header.type != IcoHeader::Cursor) )
- return false;
-
- unsigned requestedSize = 32;
- unsigned requestedColors = QApplication::desktop()->depth() > 8 ? 0 : QApplication::desktop()->depth();
- int requestedIndex = -1;
-#if 0
- if ( io->parameters() )
- {
- QStringList params = QString(io->parameters()).split( ';', QString::SkipEmptyParts );
- QMap< QString, QString > options;
- for ( QStringList::ConstIterator it = params.begin();
- it != params.end(); ++it )
- {
- QStringList tmp = (*it).split( '=', QString::SkipEmptyParts );
- if ( tmp.count() == 2 ) options[ tmp[ 0 ] ] = tmp[ 1 ];
- }
- if ( options[ "index" ].toUInt() )
- requestedIndex = options[ "index" ].toUInt();
- if ( options[ "size" ].toUInt() )
- requestedSize = options[ "size" ].toUInt();
- if ( options[ "colors" ].toUInt() )
- requestedColors = options[ "colors" ].toUInt();
- }
-#endif
-
- typedef std::vector< IconRec > IconList;
- IconList icons;
- for ( unsigned i = 0; i < header.count; ++i )
- {
- if ( stream.atEnd() )
- return false;
- IconRec rec;
- stream >> rec;
- icons.push_back( rec );
- }
- IconList::const_iterator selected;
- if (requestedIndex >= 0) {
- selected = std::min( icons.begin() + requestedIndex, icons.end() );
- } else {
- selected = std::min_element( icons.begin(), icons.end(),
- LessDifference( requestedSize, requestedColors ) );
- }
- if ( stream.atEnd() || selected == icons.end() ||
- offset + selected->offset > device()->size() )
- return false;
-
- device()->seek( offset + selected->offset );
- QImage icon;
- if ( loadFromDIB( stream, *selected, icon ) )
- {
-#ifndef QT_NO_IMAGE_TEXT
- icon.setText( "X-Index", 0, QString::number( selected - icons.begin() ) );
- if ( header.type == IcoHeader::Cursor )
- {
- icon.setText( "X-HotspotX", 0, QString::number( selected->hotspotX ) );
- icon.setText( "X-HotspotY", 0, QString::number( selected->hotspotY ) );
- }
-#endif
- *outImage = icon;
- return true;
- }
- return false;
-}
-
-bool ICOHandler::write(const QImage &/*image*/)
-{
-#if 0
- if (image.isNull())
- return;
-
- QByteArray dibData;
- QDataStream dib(dibData, QIODevice::ReadWrite);
- dib.setByteOrder(QDataStream::LittleEndian);
-
- QImage pixels = image;
- QImage mask;
- if (io->image().hasAlphaBuffer())
- mask = image.createAlphaMask();
- else
- mask = image.createHeuristicMask();
- mask.invertPixels();
- for ( int y = 0; y < pixels.height(); ++y )
- for ( int x = 0; x < pixels.width(); ++x )
- if ( mask.pixel( x, y ) == 0 ) pixels.setPixel( x, y, 0 );
-
- if (!qt_write_dib(dib, pixels))
- return;
-
- uint hdrPos = dib.device()->at();
- if (!qt_write_dib(dib, mask))
- return;
- memmove(dibData.data() + hdrPos, dibData.data() + hdrPos + BMP_WIN + 8, dibData.size() - hdrPos - BMP_WIN - 8);
- dibData.resize(dibData.size() - BMP_WIN - 8);
-
- QDataStream ico(device());
- ico.setByteOrder(QDataStream::LittleEndian);
- IcoHeader hdr;
- hdr.reserved = 0;
- hdr.type = Icon;
- hdr.count = 1;
- ico << hdr.reserved << hdr.type << hdr.count;
- IconRec rec;
- rec.width = image.width();
- rec.height = image.height();
- if (image.numColors() <= 16)
- rec.colors = 16;
- else if (image.depth() <= 8)
- rec.colors = 256;
- else
- rec.colors = 0;
- rec.hotspotX = 0;
- rec.hotspotY = 0;
- rec.dibSize = dibData.size();
- ico << rec.width << rec.height << rec.colors
- << rec.hotspotX << rec.hotspotY << rec.dibSize;
- rec.dibOffset = ico.device()->at() + sizeof(rec.dibOffset);
- ico << rec.dibOffset;
-
- BMP_INFOHDR dibHeader;
- dib.device()->at(0);
- dib >> dibHeader;
- dibHeader.biHeight = image.height() << 1;
- dib.device()->at(0);
- dib << dibHeader;
-
- ico.writeRawBytes(dibData.data(), dibData.size());
- return true;
-#endif
- return false;
-}
-
-QByteArray ICOHandler::name() const
-{
- return "ico";
-}
-
-bool ICOHandler::canRead(QIODevice *device)
-{
- if (!device) {
- qWarning("ICOHandler::canRead() called with no device");
- return false;
- }
-
- const qint64 oldPos = device->pos();
-
- char head[8];
- qint64 readBytes = device->read(head, sizeof(head));
- const bool readOk = readBytes == sizeof(head);
-
- if (device->isSequential()) {
- while (readBytes > 0)
- device->ungetChar(head[readBytes-- - 1]);
- } else {
- device->seek(oldPos);
- }
-
- if ( !readOk )
- return false;
-
- return head[2] == '\001' && head[3] == '\000' && // type should be 1
- ( head[6] == 16 || head[6] == 32 || head[6] == 64 ) && // width can only be one of those
- ( head[7] == 16 || head[7] == 32 || head[7] == 64 ); // same for height
-}
-
-class ICOPlugin : public QImageIOPlugin
-{
-public:
- QStringList keys() const;
- Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
- QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
-};
-
-QStringList ICOPlugin::keys() const
-{
- return QStringList() << "ico" << "ICO";
-}
-
-QImageIOPlugin::Capabilities ICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
-{
- if (format == "ico" || format == "ICO")
- return Capabilities(CanRead);
- if (!format.isEmpty())
- return 0;
- if (!device->isOpen())
- return 0;
-
- Capabilities cap;
- if (device->isReadable() && ICOHandler::canRead(device))
- cap |= CanRead;
- return cap;
-}
-
-QImageIOHandler *ICOPlugin::create(QIODevice *device, const QByteArray &format) const
-{
- QImageIOHandler *handler = new ICOHandler;
- handler->setDevice(device);
- handler->setFormat(format);
- return handler;
-}
-
-Q_EXPORT_STATIC_PLUGIN(ICOPlugin)
-Q_EXPORT_PLUGIN2(qtwebico, ICOPlugin)
diff --git a/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.h b/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.h
deleted file mode 100644
index 4f1f1d6..0000000
--- a/src/3rdparty/webkit/WebKit/qt/Plugins/ICOHandler.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * ico.h - kimgio import filter for MS Windows .ico files
- *
- * Distributed under the terms of the LGPL
- * Copyright (c) 2000 Malte Starostik <malte@kde.org>
- *
- */
-
-// You can use QImageIO::setParameters() to request a specific
-// Icon out of an .ico file:
-//
-// Options consist of a name=value pair and are separated by a semicolon.
-// Available options are:
-// size=<size> select the icon that most closely matches <size> (pixels)
-// default: 32
-// colors=<num> select the icon that has <num> colors (or comes closest)
-// default: 1 << display depth or 0 (RGB) if display depth > 8
-// index=<index> select the indexth icon from the file. If this option
-// is present, the size and colors options will be ignored.
-// default: none
-// If both size and colors are given, size takes precedence.
-//
-// The old format is still supported:
-// the parameters consist of a single string in the form
-// "<size>[:<colors>]" which correspond to the options above
-//
-// If an icon was returned (i.e. the file is valid and the index option
-// if present was not out of range), the icon's index within the .ico
-// file is returned in the text tag "X-Index" of the image.
-// If the icon is in fact a cursor, its hotspot coordinates are returned
-// in the text tags "X-HotspotX" and "X-HotspotY".
-
-#ifndef _ICOHANDLER_H_
-#define _ICOHANDLER_H_
-
-#include <QtGui/QImageIOPlugin>
-
-class ICOHandler : public QImageIOHandler
-{
-public:
- ICOHandler();
-
- bool canRead() const;
- bool read(QImage *image);
- bool write(const QImage &image);
-
- QByteArray name() const;
-
- static bool canRead(QIODevice *device);
-};
-
-#endif
diff --git a/src/3rdparty/webkit/WebKit/qt/Plugins/Plugins.pro b/src/3rdparty/webkit/WebKit/qt/Plugins/Plugins.pro
deleted file mode 100644
index a9b4f82..0000000
--- a/src/3rdparty/webkit/WebKit/qt/Plugins/Plugins.pro
+++ /dev/null
@@ -1,14 +0,0 @@
-TEMPLATE = lib
-TARGET = qtwebico
-CONFIG += plugin
-HEADERS += ICOHandler.h
-SOURCES += ICOHandler.cpp
-
-include(../../WebKit.pri)
-
-contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
-unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
-
-target.path = $$[QT_INSTALL_PLUGINS]/imageformats
-INSTALLS += target
-
diff --git a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp
index 0df0768..99e438d 100644
--- a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/DragClientQt.cpp
@@ -66,6 +66,8 @@ void DragClientQt::startDrag(DragImageRef, const IntPoint&, const IntPoint&, Cli
QWidget* view = m_webPage->view();
if (view) {
QDrag *drag = new QDrag(view);
+ if (clipboardData->hasImage())
+ drag->setPixmap(qvariant_cast<QPixmap>(clipboardData->imageData()));
drag->setMimeData(clipboardData);
drag->start();
}
diff --git a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
index 5d5df97..34241f0 100644
--- a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/EditorClientQt.cpp
@@ -41,6 +41,7 @@
#include "FocusController.h"
#include "Frame.h"
#include "HTMLElement.h"
+#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "KeyboardCodes.h"
#include "KeyboardEvent.h"
@@ -48,6 +49,7 @@
#include "Page.h"
#include "Page.h"
#include "PlatformKeyboardEvent.h"
+#include "QWebPageClient.h"
#include "Range.h"
#include <stdio.h>
@@ -596,10 +598,26 @@ bool EditorClientQt::isEditing() const
void EditorClientQt::setInputMethodState(bool active)
{
- QWidget *view = m_page->view();
- if (view)
- view->setAttribute(Qt::WA_InputMethodEnabled, active);
-
+ QWebPageClient* webPageClient = m_page->d->client;
+ if (webPageClient) {
+#if QT_VERSION >= 0x040600
+ bool isPasswordField = false;
+ if (!active) {
+ // Setting the Qt::WA_InputMethodEnabled attribute true and Qt::ImhHiddenText flag
+ // for password fields. The Qt platform is responsible for determining which widget
+ // will receive input method events for password fields.
+ Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
+ if (frame && frame->document() && frame->document()->focusedNode()) {
+ if (frame->document()->focusedNode()->hasTagName(HTMLNames::inputTag)) {
+ HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(frame->document()->focusedNode());
+ active = isPasswordField = inputElement->isPasswordField();
+ }
+ }
+ }
+ webPageClient->setInputMethodHint(Qt::ImhHiddenText, isPasswordField);
+#endif
+ webPageClient->setInputMethodEnabled(active);
+ }
emit m_page->microFocusChanged();
}
diff --git a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
index 905e11d..81ccbe8 100644
--- a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
@@ -55,8 +55,10 @@
#include "ResourceHandle.h"
#include "Settings.h"
#include "ScriptString.h"
+#include "QWebPageClient.h"
#include "qwebpage.h"
+#include "qwebpage_p.h"
#include "qwebframe.h"
#include "qwebframe_p.h"
#include "qwebhistoryinterface.h"
@@ -67,6 +69,8 @@
#include <QCoreApplication>
#include <QDebug>
#if QT_VERSION >= 0x040400
+#include <QGraphicsScene>
+#include <QGraphicsWidget>
#include <QNetworkRequest>
#include <QNetworkReply>
#else
@@ -183,7 +187,7 @@ QWebFrame* FrameLoaderClientQt::webFrame() const
void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
{
- (m_frame->loader()->*function)(action);
+ (m_frame->loader()->policyChecker()->*function)(action);
}
bool FrameLoaderClientQt::hasWebView() const
@@ -210,12 +214,12 @@ void FrameLoaderClientQt::transitionToCommittedForNewPage()
QColor backgroundColor = brush.style() == Qt::SolidPattern ? brush.color() : QColor();
QWebPage* page = m_webFrame->page();
- const QSize fixedLayoutSize = page->fixedContentsSize();
+ const QSize preferredLayoutSize = page->preferredContentsSize();
m_frame->createView(m_webFrame->page()->viewportSize(),
backgroundColor, !backgroundColor.alpha(),
- fixedLayoutSize.isValid() ? IntSize(fixedLayoutSize) : IntSize(),
- fixedLayoutSize.isValid(),
+ preferredLayoutSize.isValid() ? IntSize(preferredLayoutSize) : IntSize(),
+ preferredLayoutSize.isValid(),
(ScrollbarMode)m_webFrame->scrollBarPolicy(Qt::Horizontal),
(ScrollbarMode)m_webFrame->scrollBarPolicy(Qt::Vertical));
}
@@ -374,7 +378,8 @@ void FrameLoaderClientQt::dispatchDidFinishLoad()
if (dumpFrameLoaderCallbacks)
printf("%s - didFinishLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
- m_loadError = ResourceError(); // clears the previous error
+ // Clears the previous error.
+ m_loadError = ResourceError();
if (!m_webFrame)
return;
@@ -428,6 +433,8 @@ void FrameLoaderClientQt::revertToProvisionalState(DocumentLoader*)
void FrameLoaderClientQt::postProgressStartedNotification()
{
if (m_webFrame && m_frame->page()) {
+ // A new load starts, so lets clear the previous error.
+ m_loadError = ResourceError();
emit loadStarted();
postProgressEstimateChangedNotification();
}
@@ -875,6 +882,8 @@ void FrameLoaderClientQt::callErrorPageExtension(const WebCore::ResourceError& e
else
return;
+ option.url = QUrl(error.failingURL());
+ option.frame = m_webFrame;
option.error = error.errorCode();
option.errorString = error.localizedDescription();
@@ -883,7 +892,7 @@ void FrameLoaderClientQt::callErrorPageExtension(const WebCore::ResourceError& e
return;
KURL baseUrl(output.baseUrl);
- KURL failingUrl(QUrl(error.failingURL()));
+ KURL failingUrl(option.url);
WebCore::ResourceRequest request(baseUrl);
WTF::RefPtr<WebCore::SharedBuffer> buffer = WebCore::SharedBuffer::create(output.content.constData(), output.content.length());
@@ -1116,6 +1125,53 @@ public:
}
};
+#if QT_VERSION >= 0x040600
+class QtPluginGraphicsWidget: public Widget
+{
+public:
+ static RefPtr<QtPluginGraphicsWidget> create(QGraphicsWidget* w = 0)
+ {
+ return adoptRef(new QtPluginGraphicsWidget(w));
+ }
+
+ ~QtPluginGraphicsWidget()
+ {
+ if (graphicsWidget)
+ graphicsWidget->deleteLater();
+ }
+ virtual void invalidateRect(const IntRect& r)
+ {
+ QGraphicsScene* scene = graphicsWidget ? graphicsWidget->scene() : 0;
+ if (scene)
+ scene->update(QRect(r));
+ }
+ virtual void frameRectsChanged()
+ {
+ if (!graphicsWidget)
+ return;
+
+ IntRect windowRect = convertToContainingWindow(IntRect(0, 0, frameRect().width(), frameRect().height()));
+ graphicsWidget->setGeometry(QRect(windowRect));
+
+ // FIXME: clipping of graphics widgets
+ }
+ virtual void show()
+ {
+ if (graphicsWidget)
+ graphicsWidget->show();
+ }
+ virtual void hide()
+ {
+ if (graphicsWidget)
+ graphicsWidget->hide();
+ }
+private:
+ QtPluginGraphicsWidget(QGraphicsWidget* w = 0): Widget(0), graphicsWidget(w) {}
+
+ QGraphicsWidget* graphicsWidget;
+};
+#endif
+
PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize, HTMLPlugInElement* element, const KURL& url, const Vector<String>& paramNames,
const Vector<String>& paramValues, const String& mimeType, bool loadManually)
{
@@ -1177,15 +1233,34 @@ PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize,
if (object) {
QWidget* widget = qobject_cast<QWidget*>(object);
if (widget) {
- QWidget* view = m_webFrame->page()->view();
- if (view)
- widget->setParent(view);
+ QWidget* parentWidget;
+ if (m_webFrame->page()->d->client)
+ parentWidget = qobject_cast<QWidget*>(m_webFrame->page()->d->client->pluginParent());
+ else
+ parentWidget = 0; // The plug-in won't be fully functional because the QWebView doesn't exist.
+ widget->setParent(parentWidget);
RefPtr<QtPluginWidget> w = adoptRef(new QtPluginWidget());
w->setPlatformWidget(widget);
// Make sure it's invisible until properly placed into the layout
w->setFrameRect(IntRect(0, 0, 0, 0));
return w;
}
+#if QT_VERSION >= 0x040600
+ QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(object);
+ if (graphicsWidget) {
+ QGraphicsObject* parentWidget;
+ if (m_webFrame->page()->d->client)
+ parentWidget = qobject_cast<QGraphicsObject*>(m_webFrame->page()->d->client->pluginParent());
+ else
+ parentWidget = 0; // The plug-in won't be fully functional because the QWebView doesn't exist.
+ graphicsWidget->hide();
+ graphicsWidget->setParentItem(parentWidget);
+ RefPtr<QtPluginGraphicsWidget> w = QtPluginGraphicsWidget::create(graphicsWidget);
+ // Make sure it's invisible until properly placed into the layout
+ w->setFrameRect(IntRect(0, 0, 0, 0));
+ return w;
+ }
+#endif
// FIXME: make things work for widgetless plugins as well
delete object;
} else { // NPAPI Plugins
diff --git a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
index 3931a85..12f405c 100644
--- a/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp
@@ -84,9 +84,6 @@ void InspectorClientQt::inspectorDestroyed()
Page* InspectorClientQt::createPage()
{
- if (m_inspectorView)
- return m_inspectorView->page()->d->page;
-
QWebView* inspectorView = new QWebView;
InspectorClientWebPage* inspectorPage = new InspectorClientWebPage(inspectorView);
inspectorView->setPage(inspectorPage);
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp b/src/3rdparty/webkit/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp
index 1a57286..4bdb7f5 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp
@@ -19,7 +19,33 @@
#include <QtTest/QtTest>
+#include <QGraphicsView>
#include <qgraphicswebview.h>
+#include <qwebpage.h>
+#include <qwebframe.h>
+
+/**
+ * Starts an event loop that runs until the given signal is received.
+ * Optionally the event loop
+ * can return earlier on a timeout.
+ *
+ * \return \p true if the requested signal was received
+ * \p false on timeout
+ */
+static bool waitForSignal(QObject* obj, const char* signal, int timeout = 10000)
+{
+ QEventLoop loop;
+ QObject::connect(obj, signal, &loop, SLOT(quit()));
+ QTimer timer;
+ QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
+ if (timeout > 0) {
+ QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
+ timer.setSingleShot(true);
+ timer.start(timeout);
+ }
+ loop.exec();
+ return timeoutSpy.isEmpty();
+}
class tst_QGraphicsWebView : public QObject
{
@@ -27,6 +53,7 @@ class tst_QGraphicsWebView : public QObject
private slots:
void qgraphicswebview();
+ void crashOnViewlessWebPages();
};
void tst_QGraphicsWebView::qgraphicswebview()
@@ -53,6 +80,55 @@ void tst_QGraphicsWebView::qgraphicswebview()
item.setContent(QByteArray());
}
+class WebPage : public QWebPage
+{
+ Q_OBJECT
+
+public:
+ WebPage(QObject* parent = 0): QWebPage(parent)
+ {
+ }
+
+ QGraphicsWebView* webView;
+
+private slots:
+ // Force a webview deletion during the load.
+ // It should not cause WebPage to crash due to
+ // it accessing invalid pageClient pointer.
+ void aborting()
+ {
+ delete webView;
+ }
+};
+
+void tst_QGraphicsWebView::crashOnViewlessWebPages()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ QGraphicsWebView* webView = new QGraphicsWebView;
+ WebPage* page = new WebPage;
+ webView->setPage(page);
+ page->webView = webView;
+ connect(page->mainFrame(), SIGNAL(initialLayoutCompleted()), page, SLOT(aborting()));
+
+ scene.addItem(webView);
+
+ view.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ view.resize(600, 480);
+ webView->resize(view.geometry().size());
+ QTest::qWait(200);
+ view.show();
+
+ page->mainFrame()->setHtml(QString("data:text/html,"
+ "<frameset cols=\"25%,75%\">"
+ "<frame src=\"data:text/html,foo \">"
+ "<frame src=\"data:text/html,bar\">"
+ "</frameset>"));
+
+ QVERIFY(::waitForSignal(page, SIGNAL(loadFinished(bool))));
+}
+
QTEST_MAIN(tst_QGraphicsWebView)
#include "tst_qgraphicswebview.moc"
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/image.png b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/image.png
new file mode 100644
index 0000000..8d70364
--- /dev/null
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/image.png
Binary files differ
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc
index ed01440..28b9d7b 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/qwebelement.qrc
@@ -2,5 +2,6 @@
<qresource prefix="/">
<file>style.css</file>
<file>style2.css</file>
+<file>image.png</file>
</qresource>
</RCC>
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp
index 00783d1..db2f7d7 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp
@@ -87,6 +87,7 @@ private slots:
void firstChildNextSibling();
void lastChildPreviousSibling();
void hasSetFocus();
+ void render();
private:
QWebView* m_view;
@@ -825,5 +826,79 @@ void tst_QWebElement::hasSetFocus()
QVERIFY(input2.hasFocus());
}
+void tst_QWebElement::render()
+{
+ QString html( "<html>"
+ "<head><style>"
+ "body, iframe { margin: 0px; border: none; }"
+ "</style></head>"
+ "<body><table width='300px' height='300px' border='1'>"
+ "<tr>"
+ "<td>test"
+ "</td>"
+ "<td><img src='qrc:///image.png'>"
+ "</td>"
+ "</tr>"
+ "</table>"
+ "</body>"
+ "</html>"
+ );
+
+ QWebPage page;
+ QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool)));
+ page.mainFrame()->setHtml(html);
+
+ waitForSignal(&page, SIGNAL(loadFinished(bool)));
+ QCOMPARE(loadSpy.count(), 1);
+
+ QList<QWebElement> imgs = page.mainFrame()->findAllElements("img");
+ QCOMPARE(imgs.count(), 1);
+
+ QImage resource(":/image.png");
+ QRect imageRect(0, 0, resource.width(), resource.height());
+
+ QImage testImage(resource.width(), resource.height(), QImage::Format_ARGB32);
+ QPainter painter0(&testImage);
+ painter0.fillRect(imageRect, Qt::white);
+ painter0.drawImage(0, 0, resource);
+ painter0.end();
+
+ QImage image1(resource.width(), resource.height(), QImage::Format_ARGB32);
+ QPainter painter1(&image1);
+ painter1.fillRect(imageRect, Qt::white);
+ imgs[0].render(&painter1);
+ painter1.end();
+
+ QVERIFY(image1 == testImage);
+
+ // render image 2nd time to make sure that cached rendering works fine
+ QImage image2(resource.width(), resource.height(), QImage::Format_ARGB32);
+ QPainter painter2(&image2);
+ painter2.fillRect(imageRect, Qt::white);
+ imgs[0].render(&painter2);
+ painter2.end();
+
+ QVERIFY(image2 == testImage);
+
+ // compare table rendered through QWebElement::render to whole page table rendering
+ QRect tableRect(0, 0, 300, 300);
+ QList<QWebElement> tables = page.mainFrame()->findAllElements("table");
+ QCOMPARE(tables.count(), 1);
+
+ QImage image3(300, 300, QImage::Format_ARGB32);
+ QPainter painter3(&image3);
+ painter3.fillRect(tableRect, Qt::white);
+ tables[0].render(&painter3);
+ painter3.end();
+
+ QImage image4(300, 300, QImage::Format_ARGB32);
+ QPainter painter4(&image4);
+ page.mainFrame()->setClipRenderToViewport(false);
+ page.mainFrame()->render(&painter4, tableRect);
+ painter4.end();
+
+ QVERIFY(image3 == image4);
+}
+
QTEST_MAIN(tst_QWebElement)
#include "tst_qwebelement.moc"
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.pro b/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.pro
index 81037c3..4c92e91 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.pro
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/qwebframe.pro
@@ -5,5 +5,6 @@ SOURCES += tst_qwebframe.cpp
RESOURCES += qwebframe.qrc
QT += testlib network
QMAKE_RPATHDIR = $$OUTPUT_DIR/lib $$QMAKE_RPATHDIR
+DEFINES += SRCDIR=\\\"$$PWD/resources\\\"
symbian:TARGET.UID3 = 0xA000E53D
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp b/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp
index 797446b..80c9d72 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp
@@ -586,6 +586,7 @@ private slots:
void javaScriptWindowObjectClearedOnEvaluate();
void setHtml();
void setHtmlWithResource();
+ void setHtmlWithBaseURL();
void ipv6HostEncoding();
void metaData();
void popupFocus();
@@ -699,6 +700,7 @@ void tst_QWebFrame::init()
m_page = m_view->page();
m_myObject = new MyQObject();
m_page->mainFrame()->addToJavaScriptWindowObject("myObject", m_myObject);
+ QDir::setCurrent(SRCDIR);
}
void tst_QWebFrame::cleanup()
@@ -2370,6 +2372,28 @@ void tst_QWebFrame::setHtmlWithResource()
QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("red"));
}
+void tst_QWebFrame::setHtmlWithBaseURL()
+{
+ QString html("<html><body><p>hello world</p><img src='resources/image2.png'/></body></html>");
+
+ QWebPage page;
+ QWebFrame* frame = page.mainFrame();
+
+ // in few seconds, the image should be completey loaded
+ QSignalSpy spy(&page, SIGNAL(loadFinished(bool)));
+
+ frame->setHtml(html, QUrl::fromLocalFile(QDir::currentPath()));
+ QTest::qWait(200);
+ QCOMPARE(spy.count(), 1);
+
+ QCOMPARE(frame->evaluateJavaScript("document.images.length").toInt(), 1);
+ QCOMPARE(frame->evaluateJavaScript("document.images[0].width").toInt(), 128);
+ QCOMPARE(frame->evaluateJavaScript("document.images[0].height").toInt(), 128);
+
+ // no history item has to be added.
+ QCOMPARE(m_view->page()->history()->count(), 0);
+}
+
class TestNetworkManager : public QNetworkAccessManager
{
public:
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro b/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro
index 82ffac6..101837a 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/qwebpage.pro
@@ -5,5 +5,6 @@ SOURCES += tst_qwebpage.cpp
RESOURCES += tst_qwebpage.qrc
QT += testlib network
QMAKE_RPATHDIR = $$OUTPUT_DIR/lib $$QMAKE_RPATHDIR
+DEFINES += SRCDIR=\\\"$$PWD/\\\"
symbian:TARGET.UID3 = 0xA000E53E
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp b/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
index 8f9a740..21b3bc7 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
@@ -1,5 +1,6 @@
/*
Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -23,6 +24,7 @@
#include <qwebelement.h>
#include <qwebpage.h>
#include <qwidget.h>
+#include <QGraphicsWidget>
#include <qwebview.h>
#include <qwebframe.h>
#include <qwebhistory.h>
@@ -33,6 +35,7 @@
#include <qwebsecurityorigin.h>
#include <qwebdatabase.h>
#include <QPushButton>
+#include <QDir>
// Will try to wait for the condition while allowing event processing
#define QTRY_COMPARE(__expr, __expected) \
@@ -101,7 +104,9 @@ private slots:
void contextMenuCrash();
void database();
void createPlugin();
+ void destroyPlugin_data();
void destroyPlugin();
+ void createViewlessPlugin_data();
void createViewlessPlugin();
void multiplePageGroupsAndLocalStorage();
void cursorMovements();
@@ -116,9 +121,14 @@ private slots:
void testEnablePersistentStorage();
void consoleOutput();
void inputMethods();
+ void defaultTextEncoding();
+ void errorPageExtension();
void crashTests_LazyInitializationOfMainFrame();
+ void screenshot_data();
+ void screenshot();
+
private:
QWebView* m_view;
QWebPage* m_page;
@@ -222,6 +232,9 @@ void tst_QWebPage::infiniteLoopJS()
void tst_QWebPage::loadFinished()
{
+ qRegisterMetaType<QWebFrame*>("QWebFrame*");
+ qRegisterMetaType<QNetworkRequest*>("QNetworkRequest*");
+ QSignalSpy spyNetworkRequestStarted(m_page, SIGNAL(networkRequestStarted(QWebFrame*, QNetworkRequest*)));
QSignalSpy spyLoadStarted(m_view, SIGNAL(loadStarted()));
QSignalSpy spyLoadFinished(m_view, SIGNAL(loadFinished(bool)));
@@ -232,6 +245,7 @@ void tst_QWebPage::loadFinished()
QTest::qWait(3000);
+ QVERIFY(spyNetworkRequestStarted.count() > 1);
QVERIFY(spyLoadStarted.count() > 1);
QVERIFY(spyLoadFinished.count() > 1);
@@ -617,50 +631,93 @@ void tst_QWebPage::createPlugin()
QCOMPARE(newPage->calls.count(), 0);
}
-class PluginTrackedPage : public QWebPage
-{
+
+// Standard base class for template PluginTracerPage. In tests it is used as interface.
+class PluginCounterPage : public QWebPage {
public:
+ int m_count;
+ QPointer<QObject> m_widget;
+ PluginCounterPage(QObject* parent = 0) : QWebPage(parent), m_count(0), m_widget(0)
+ {
+ settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+ }
+};
- int count;
- QPointer<QWidget> widget;
+template<class T>
+class PluginTracerPage : public PluginCounterPage {
+public:
+ PluginTracerPage(QObject* parent = 0) : PluginCounterPage(parent) {}
+ virtual QObject* createPlugin(const QString&, const QUrl&, const QStringList&, const QStringList&)
+ {
+ m_count++;
+ return m_widget = new T();
+ }
+};
- PluginTrackedPage(QWidget *parent = 0) : QWebPage(parent), count(0) {
- settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+class PluginFactory {
+public:
+ enum FactoredType {QWidgetType, QGraphicsWidgetType};
+ static PluginCounterPage* create(FactoredType type, QObject* parent = 0)
+ {
+ PluginCounterPage* result = 0;
+ switch (type) {
+ case QWidgetType:
+ result = new PluginTracerPage<QWidget>(parent);
+ break;
+ case QGraphicsWidgetType:
+ result = new PluginTracerPage<QGraphicsWidget>(parent);
+ break;
+ default: {/*Oops*/};
+ }
+ return result;
}
- virtual QObject* createPlugin(const QString&, const QUrl&, const QStringList&, const QStringList&) {
- count++;
- QWidget *w = new QWidget;
- widget = w;
- return w;
+ static void prepareTestData()
+ {
+ QTest::addColumn<int>("type");
+ QTest::newRow("QWidget") << (int)PluginFactory::QWidgetType;
+ QTest::newRow("QGraphicsWidget") << (int)PluginFactory::QGraphicsWidgetType;
}
};
+void tst_QWebPage::destroyPlugin_data()
+{
+ PluginFactory::prepareTestData();
+}
+
void tst_QWebPage::destroyPlugin()
{
- PluginTrackedPage* page = new PluginTrackedPage(m_view);
+ QFETCH(int, type);
+ PluginCounterPage* page = PluginFactory::create((PluginFactory::FactoredType)type, m_view);
m_view->setPage(page);
// we create the plugin, so the widget should be constructed
QString content("<html><body><object type=\"application/x-qt-plugin\" classid=\"QProgressBar\"></object></body></html>");
m_view->setHtml(content);
- QVERIFY(page->widget != 0);
- QCOMPARE(page->count, 1);
+ QVERIFY(page->m_widget);
+ QCOMPARE(page->m_count, 1);
// navigate away, the plugin widget should be destructed
m_view->setHtml("<html><body>Hi</body></html>");
QTestEventLoop::instance().enterLoop(1);
- QVERIFY(page->widget == 0);
+ QVERIFY(!page->m_widget);
+}
+
+void tst_QWebPage::createViewlessPlugin_data()
+{
+ PluginFactory::prepareTestData();
}
void tst_QWebPage::createViewlessPlugin()
{
- PluginTrackedPage* page = new PluginTrackedPage;
+ QFETCH(int, type);
+ PluginCounterPage* page = PluginFactory::create((PluginFactory::FactoredType)type);
QString content("<html><body><object type=\"application/x-qt-plugin\" classid=\"QProgressBar\"></object></body></html>");
page->mainFrame()->setHtml(content);
- QCOMPARE(page->count, 1);
- QVERIFY(page->widget != 0);
+ QCOMPARE(page->m_count, 1);
+ QVERIFY(page->m_widget);
delete page;
+
}
// import private API
@@ -1208,7 +1265,8 @@ void tst_QWebPage::frameAt()
void tst_QWebPage::inputMethods()
{
m_view->page()->mainFrame()->setHtml("<html><body>" \
- "<input type='text' id='input1' style='font-family: serif' value='' maxlength='20'/>" \
+ "<input type='text' id='input1' style='font-family: serif' value='' maxlength='20'/><br>" \
+ "<input type='password'/>" \
"</body></html>");
m_view->page()->mainFrame()->setFocus();
@@ -1291,6 +1349,21 @@ void tst_QWebPage::inputMethods()
value = variant.value<QString>();
QCOMPARE(value, QString("QtWebKit"));
#endif
+
+ //ImhHiddenText
+ QMouseEvent evpresPassword(QEvent::MouseButtonPress, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
+ m_view->page()->event(&evpresPassword);
+ QMouseEvent evrelPassword(QEvent::MouseButtonRelease, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
+ m_view->page()->event(&evrelPassword);
+
+ QVERIFY(m_view->testAttribute(Qt::WA_InputMethodEnabled));
+#if QT_VERSION >= 0x040600
+ QVERIFY(m_view->inputMethodHints() & Qt::ImhHiddenText);
+
+ m_view->page()->event(&evpres);
+ m_view->page()->event(&evrel);
+ QVERIFY(!(m_view->inputMethodHints() & Qt::ImhHiddenText));
+#endif
}
// import a little DRT helper function to trigger the garbage collector
@@ -1354,8 +1427,10 @@ void tst_QWebPage::testOptionalJSObjects()
webPage1.currentFrame()->setHtml(QString("<html><body>test</body></html>"), QUrl());
webPage2.currentFrame()->setHtml(QString("<html><body>test</body></html>"), QUrl());
+ QEXPECT_FAIL("","Feature enabled/disabled checking problem. Look at bugs.webkit.org/show_bug.cgi?id=29867", Continue);
QCOMPARE(testFlag(webPage1, QWebSettings::OfflineWebApplicationCacheEnabled, "applicationCache", false), false);
QCOMPARE(testFlag(webPage2, QWebSettings::OfflineWebApplicationCacheEnabled, "applicationCache", true), true);
+ QEXPECT_FAIL("","Feature enabled/disabled checking problem. Look at bugs.webkit.org/show_bug.cgi?id=29867", Continue);
QCOMPARE(testFlag(webPage1, QWebSettings::OfflineWebApplicationCacheEnabled, "applicationCache", false), false);
QCOMPARE(testFlag(webPage2, QWebSettings::OfflineWebApplicationCacheEnabled, "applicationCache", false), true);
@@ -1394,6 +1469,79 @@ void tst_QWebPage::testEnablePersistentStorage()
QVERIFY(!webPage.settings()->iconDatabasePath().isEmpty());
}
+void tst_QWebPage::defaultTextEncoding()
+{
+ QWebFrame* mainFrame = m_page->mainFrame();
+
+ QString defaultCharset = mainFrame->evaluateJavaScript("document.defaultCharset").toString();
+ QVERIFY(!defaultCharset.isEmpty());
+ QCOMPARE(QWebSettings::globalSettings()->defaultTextEncoding(), defaultCharset);
+
+ m_page->settings()->setDefaultTextEncoding(QString("utf-8"));
+ QString charset = mainFrame->evaluateJavaScript("document.defaultCharset").toString();
+ QCOMPARE(charset, QString("utf-8"));
+ QCOMPARE(m_page->settings()->defaultTextEncoding(), charset);
+
+ m_page->settings()->setDefaultTextEncoding(QString());
+ charset = mainFrame->evaluateJavaScript("document.defaultCharset").toString();
+ QVERIFY(!charset.isEmpty());
+ QCOMPARE(charset, defaultCharset);
+
+ QWebSettings::globalSettings()->setDefaultTextEncoding(QString("utf-8"));
+ charset = mainFrame->evaluateJavaScript("document.defaultCharset").toString();
+ QCOMPARE(charset, QString("utf-8"));
+ QCOMPARE(QWebSettings::globalSettings()->defaultTextEncoding(), charset);
+}
+
+class ErrorPage : public QWebPage
+{
+public:
+
+ ErrorPage(QWidget* parent = 0): QWebPage(parent)
+ {
+ }
+
+ virtual bool supportsExtension(Extension extension) const
+ {
+ return extension == ErrorPageExtension;
+ }
+
+ virtual bool extension(Extension, const ExtensionOption* option, ExtensionReturn* output)
+ {
+ const ErrorPageExtensionOption* info = static_cast<const ErrorPageExtensionOption*>(option);
+ ErrorPageExtensionReturn* errorPage = static_cast<ErrorPageExtensionReturn*>(output);
+
+ if (info->frame == mainFrame()) {
+ errorPage->content = "data:text/html,error";
+ return true;
+ }
+
+ return false;
+ }
+};
+
+void tst_QWebPage::errorPageExtension()
+{
+ ErrorPage* page = new ErrorPage;
+ m_view->setPage(page);
+
+ QSignalSpy spyLoadFinished(m_view, SIGNAL(loadFinished(bool)));
+
+ page->mainFrame()->load(QUrl("qrc:///frametest/index.html"));
+ QTRY_COMPARE(spyLoadFinished.count(), 1);
+
+ page->mainFrame()->setUrl(QUrl("http://non.existent/url"));
+ QTest::qWait(2000);
+ QTRY_COMPARE(spyLoadFinished.count(), 2);
+ QCOMPARE(page->mainFrame()->toPlainText(), QString("data:text/html,error"));
+ QCOMPARE(page->history()->count(), 2);
+ QCOMPARE(page->history()->currentItem().url(), QUrl("http://non.existent/url"));
+ QCOMPARE(page->history()->canGoBack(), true);
+ QCOMPARE(page->history()->canGoForward(), false);
+
+ m_view->setPage(0);
+}
+
void tst_QWebPage::crashTests_LazyInitializationOfMainFrame()
{
{
@@ -1414,6 +1562,52 @@ void tst_QWebPage::crashTests_LazyInitializationOfMainFrame()
}
}
+static void takeScreenshot(QWebPage* page)
+{
+ QWebFrame* mainFrame = page->mainFrame();
+ page->setViewportSize(mainFrame->contentsSize());
+ QImage image(page->viewportSize(), QImage::Format_ARGB32);
+ QPainter painter(&image);
+ mainFrame->render(&painter);
+ painter.end();
+}
+
+void tst_QWebPage::screenshot_data()
+{
+ QTest::addColumn<QString>("html");
+ QTest::newRow("WithoutPlugin") << "<html><body id='b'>text</body></html>";
+ QTest::newRow("WindowedPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf'></embed></body></html>");
+ QTest::newRow("WindowlessPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf' wmode='transparent'></embed></body></html>");
+}
+
+void tst_QWebPage::screenshot()
+{
+ QDir::setCurrent(SRCDIR);
+
+ QFETCH(QString, html);
+ QWebPage* page = new QWebPage;
+ page->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+ QWebFrame* mainFrame = page->mainFrame();
+ mainFrame->setHtml(html, QUrl::fromLocalFile(QDir::currentPath()));
+ if (html.contains("</embed>")) {
+ // some reasonable time for the PluginStream to feed test.swf to flash and start painting
+ QTest::qWait(2000);
+ }
+
+ // take screenshot without a view
+ takeScreenshot(page);
+
+ QWebView* view = new QWebView;
+ view->setPage(page);
+
+ // take screenshot when attached to a view
+ takeScreenshot(page);
+
+ delete page;
+ delete view;
+
+ QDir::setCurrent(QApplication::applicationDirPath());
+}
QTEST_MAIN(tst_QWebPage)
#include "tst_qwebpage.moc"
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro b/src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro
index d9d122c..bba7c39 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebview/qwebview.pro
@@ -4,5 +4,6 @@ include(../../../../WebKit.pri)
SOURCES += tst_qwebview.cpp
QT += testlib network
QMAKE_RPATHDIR = $$OUTPUT_DIR/lib $$QMAKE_RPATHDIR
+DEFINES += SRCDIR=\\\"$$PWD/\\\"
symbian:TARGET.UID3 = 0xA000E53F
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp b/src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp
index 01d0e92..9204223 100644
--- a/src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebview/tst_qwebview.cpp
@@ -1,6 +1,7 @@
/*
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
Copyright (C) 2009 Torch Mobile Inc.
+ Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -26,6 +27,7 @@
#include <qnetworkrequest.h>
#include <qdiriterator.h>
#include <qwebkitversion.h>
+#include <qwebframe.h>
class tst_QWebView : public QObject
{
@@ -42,6 +44,9 @@ private slots:
void guessUrlFromString_data();
void guessUrlFromString();
void getWebKitVersion();
+
+ void reusePage_data();
+ void reusePage();
};
// This will be called before the first test function is executed.
@@ -167,6 +172,46 @@ void tst_QWebView::getWebKitVersion()
QVERIFY(qWebKitVersion().toDouble() > 0);
}
+void tst_QWebView::reusePage_data()
+{
+ QTest::addColumn<QString>("html");
+ QTest::newRow("WithoutPlugin") << "<html><body id='b'>text</body></html>";
+ QTest::newRow("WindowedPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf'></embed></body></html>");
+ QTest::newRow("WindowlessPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf' wmode=\"transparent\"></embed></body></html>");
+}
+
+void tst_QWebView::reusePage()
+{
+ QDir::setCurrent(SRCDIR);
+
+ QFETCH(QString, html);
+ QWebView* view1 = new QWebView;
+ QPointer<QWebPage> page = new QWebPage;
+ view1->setPage(page);
+ page->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+ QWebFrame* mainFrame = page->mainFrame();
+ mainFrame->setHtml(html, QUrl::fromLocalFile(QDir::currentPath()));
+ if (html.contains("</embed>")) {
+ // some reasonable time for the PluginStream to feed test.swf to flash and start painting
+ QTest::qWait(2000);
+ }
+
+ view1->show();
+ QTest::qWait(2000);
+ delete view1;
+ QVERIFY(page != 0); // deleting view must not have deleted the page, since it's not a child of view
+
+ QWebView *view2 = new QWebView;
+ view2->setPage(page);
+ view2->show(); // in Windowless mode, you should still be able to see the plugin here
+ QTest::qWait(2000);
+ delete view2;
+
+ delete page; // must not crash
+
+ QDir::setCurrent(QApplication::applicationDirPath());
+}
+
QTEST_MAIN(tst_QWebView)
#include "tst_qwebview.moc"
diff --git a/src/3rdparty/webkit/WebKit/qt/tests/resources/test.swf b/src/3rdparty/webkit/WebKit/qt/tests/resources/test.swf
new file mode 100644
index 0000000..8952982
--- /dev/null
+++ b/src/3rdparty/webkit/WebKit/qt/tests/resources/test.swf
Binary files differ
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 2769040..f83c2a1 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -144,6 +144,7 @@
#include "qabstractanimation.h"
#include "qanimationgroup.h"
+
#include <QtCore/qdebug.h>
#include "qabstractanimation_p.h"
@@ -176,7 +177,8 @@ Q_GLOBAL_STATIC(QThreadStorage<QUnifiedTimer *>, unifiedTimer)
QUnifiedTimer::QUnifiedTimer() :
QObject(), lastTick(0), timingInterval(DEFAULT_TIMER_INTERVAL),
- currentAnimationIdx(0), consistentTiming(false)
+ currentAnimationIdx(0), consistentTiming(false), isPauseTimerActive(false),
+ runningLeafAnimations(0)
{
}
@@ -192,50 +194,93 @@ QUnifiedTimer *QUnifiedTimer::instance()
return inst;
}
+void QUnifiedTimer::ensureTimerUpdate(QAbstractAnimation *animation)
+{
+ if (isPauseTimerActive) {
+ updateAnimationsTime();
+ } else {
+ // this code is needed when ensureTimerUpdate is called from setState because we update
+ // the currentTime when an animation starts running (otherwise we could remove it)
+ animation->setCurrentTime(animation->currentTime());
+ }
+}
+
+void QUnifiedTimer::updateAnimationsTime()
+{
+ // ignore consistentTiming in case the pause timer is active
+ const int delta = (consistentTiming && !isPauseTimerActive) ?
+ timingInterval : time.elapsed() - lastTick;
+ lastTick = time.elapsed();
+
+ //we make sure we only call update time if the time has actually changed
+ //it might happen in some cases that the time doesn't change because events are delayed
+ //when the CPU load is high
+ if (delta) {
+ for (currentAnimationIdx = 0; currentAnimationIdx < animations.count(); ++currentAnimationIdx) {
+ QAbstractAnimation *animation = animations.at(currentAnimationIdx);
+ int elapsed = QAbstractAnimationPrivate::get(animation)->totalCurrentTime
+ + (animation->direction() == QAbstractAnimation::Forward ? delta : -delta);
+ animation->setCurrentTime(elapsed);
+ }
+ currentAnimationIdx = 0;
+ }
+}
+
+void QUnifiedTimer::restartAnimationTimer()
+{
+ if (runningLeafAnimations == 0 && !runningPauseAnimations.isEmpty()) {
+ int closestTimeToFinish = closestPauseAnimationTimeToFinish();
+ animationTimer.start(closestTimeToFinish, this);
+ isPauseTimerActive = true;
+ } else if (!animationTimer.isActive() || isPauseTimerActive) {
+ animationTimer.start(timingInterval, this);
+ isPauseTimerActive = false;
+ }
+}
+
void QUnifiedTimer::timerEvent(QTimerEvent *event)
{
if (event->timerId() == startStopAnimationTimer.timerId()) {
startStopAnimationTimer.stop();
+
//we transfer the waiting animations into the "really running" state
animations += animationsToStart;
animationsToStart.clear();
if (animations.isEmpty()) {
animationTimer.stop();
- } else if (!animationTimer.isActive()) {
- animationTimer.start(timingInterval, this);
- lastTick = 0;
- time.start();
- }
- } else if (event->timerId() == animationTimer.timerId()) {
- //this is simply the time we last received a tick
- const int oldLastTick = lastTick;
- lastTick = consistentTiming ? oldLastTick + timingInterval : time.elapsed();
-
- //we make sure we only call update time if the time has actually changed
- //it might happen in some cases that the time doesn't change because events are delayed
- //when the CPU load is high
- if (const int delta = lastTick - oldLastTick) {
- for (currentAnimationIdx = 0; currentAnimationIdx < animations.count(); ++currentAnimationIdx) {
- QAbstractAnimation *animation = animations.at(currentAnimationIdx);
- int elapsed = QAbstractAnimationPrivate::get(animation)->totalCurrentTime
- + (animation->direction() == QAbstractAnimation::Forward ? delta : -delta);
- animation->setCurrentTime(elapsed);
+ isPauseTimerActive = false;
+ // invalidate the start reference time
+ time = QTime();
+ } else {
+ restartAnimationTimer();
+ if (!time.isValid()) {
+ lastTick = 0;
+ time.start();
}
- currentAnimationIdx = 0;
}
+ } else if (event->timerId() == animationTimer.timerId()) {
+ // update current time on all top level animations
+ updateAnimationsTime();
+ restartAnimationTimer();
}
}
-void QUnifiedTimer::registerAnimation(QAbstractAnimation *animation)
+void QUnifiedTimer::registerAnimation(QAbstractAnimation *animation, bool isTopLevel)
{
- Q_ASSERT(!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer);
- QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer = true;
- animationsToStart << animation;
- startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this);
+ registerRunningAnimation(animation);
+ if (isTopLevel) {
+ Q_ASSERT(!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer);
+ QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer = true;
+ animationsToStart << animation;
+ if (!startStopAnimationTimer.isActive())
+ startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this);
+ }
}
void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation)
{
+ unregisterRunningAnimation(animation);
+
if (!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer)
return;
@@ -245,7 +290,8 @@ void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation)
// this is needed if we unregister an animation while its running
if (idx <= currentAnimationIdx)
--currentAnimationIdx;
- if (animations.isEmpty())
+
+ if (animations.isEmpty() && !startStopAnimationTimer.isActive())
startStopAnimationTimer.start(STARTSTOP_TIMER_DELAY, this);
} else {
animationsToStart.removeOne(animation);
@@ -253,6 +299,47 @@ void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation)
QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer = false;
}
+void QUnifiedTimer::registerRunningAnimation(QAbstractAnimation *animation)
+{
+ if (QAbstractAnimationPrivate::get(animation)->isGroup)
+ return;
+
+ if (QAbstractAnimationPrivate::get(animation)->isPause)
+ runningPauseAnimations << animation;
+ else
+ runningLeafAnimations++;
+}
+
+void QUnifiedTimer::unregisterRunningAnimation(QAbstractAnimation *animation)
+{
+ if (QAbstractAnimationPrivate::get(animation)->isGroup)
+ return;
+
+ if (QAbstractAnimationPrivate::get(animation)->isPause)
+ runningPauseAnimations.removeOne(animation);
+ else
+ runningLeafAnimations--;
+ Q_ASSERT(runningLeafAnimations >= 0);
+}
+
+int QUnifiedTimer::closestPauseAnimationTimeToFinish()
+{
+ int closestTimeToFinish = INT_MAX;
+ for (int i = 0; i < runningPauseAnimations.size(); ++i) {
+ QAbstractAnimation *animation = runningPauseAnimations.at(i);
+ int timeToFinish;
+
+ if (animation->direction() == QAbstractAnimation::Forward)
+ timeToFinish = animation->duration() - animation->currentTime();
+ else
+ timeToFinish = animation->currentTime();
+
+ if (timeToFinish < closestTimeToFinish)
+ closestTimeToFinish = timeToFinish;
+ }
+ return closestTimeToFinish;
+}
+
void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
{
Q_Q(QAbstractAnimation);
@@ -270,7 +357,7 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
//here we reset the time if needed
//we don't call setCurrentTime because this might change the way the animation
//behaves: changing the state or changing the current value
- totalCurrentTime = currentTime =(direction == QAbstractAnimation::Forward) ?
+ totalCurrentTime = currentTime = (direction == QAbstractAnimation::Forward) ?
0 : (loopCount == -1 ? q->duration() : q->totalDuration());
}
@@ -292,22 +379,26 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
switch (state) {
case QAbstractAnimation::Paused:
+ if (hasRegisteredTimer)
+ // currentTime needs to be updated if pauseTimer is active
+ QUnifiedTimer::instance()->ensureTimerUpdate(q);
+ if (!guard)
+ return;
+ //here we're sure that we were in running state before and that the
+ //animation is currently registered
+ QUnifiedTimer::instance()->unregisterAnimation(q);
+ break;
case QAbstractAnimation::Running:
- //this ensures that the value is updated now that the animation is running
- if(oldState == QAbstractAnimation::Stopped) {
- q->setCurrentTime(currentTime);
- if (!guard)
- return;
- }
-
- // Register timer if our parent is not running.
- if (state == QAbstractAnimation::Running) {
- if (!group || group->state() == QAbstractAnimation::Stopped) {
- QUnifiedTimer::instance()->registerAnimation(q);
+ {
+ bool isTopLevel = !group || group->state() == QAbstractAnimation::Stopped;
+ QUnifiedTimer::instance()->registerAnimation(q, isTopLevel);
+
+ // this ensures that the value is updated now that the animation is running
+ if (oldState == QAbstractAnimation::Stopped) {
+ if (isTopLevel)
+ // currentTime needs to be updated if pauseTimer is active
+ QUnifiedTimer::instance()->ensureTimerUpdate(q);
}
- } else {
- //new state is paused
- QUnifiedTimer::instance()->unregisterAnimation(q);
}
break;
case QAbstractAnimation::Stopped:
@@ -319,7 +410,8 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
if (deleteWhenStopped)
q->deleteLater();
- QUnifiedTimer::instance()->unregisterAnimation(q);
+ if (oldState == QAbstractAnimation::Running)
+ QUnifiedTimer::instance()->unregisterAnimation(q);
if (dura == -1 || loopCount < 0
|| (oldDirection == QAbstractAnimation::Forward && (oldCurrentTime * (oldCurrentLoop + 1)) == (dura * loopCount))
@@ -366,7 +458,8 @@ QAbstractAnimation::~QAbstractAnimation()
QAbstractAnimation::State oldState = d->state;
d->state = Stopped;
emit stateChanged(oldState, d->state);
- QUnifiedTimer::instance()->unregisterAnimation(this);
+ if (oldState == QAbstractAnimation::Running)
+ QUnifiedTimer::instance()->unregisterAnimation(this);
}
}
@@ -452,7 +545,6 @@ void QAbstractAnimation::setDirection(Direction direction)
if (d->direction == direction)
return;
- d->direction = direction;
if (state() == Stopped) {
if (direction == Backward) {
d->currentTime = duration();
@@ -462,7 +554,19 @@ void QAbstractAnimation::setDirection(Direction direction)
d->currentLoop = 0;
}
}
+
+ // the commands order below is important: first we need to setCurrentTime with the old direction,
+ // then update the direction on this and all children and finally restart the pauseTimer if needed
+ if (d->hasRegisteredTimer)
+ QUnifiedTimer::instance()->ensureTimerUpdate(this);
+
+ d->direction = direction;
updateDirection(direction);
+
+ if (d->hasRegisteredTimer)
+ // needed to update the timer interval in case of a pause animation
+ QUnifiedTimer::instance()->restartAnimationTimer();
+
emit directionChanged(direction);
}
@@ -543,13 +647,13 @@ int QAbstractAnimation::currentLoop() const
*/
int QAbstractAnimation::totalDuration() const
{
- Q_D(const QAbstractAnimation);
- if (d->loopCount < 0)
- return -1;
int dura = duration();
- if (dura == -1)
+ if (dura <= 0)
+ return dura;
+ int loopcount = loopCount();
+ if (loopcount < 0)
return -1;
- return dura * d->loopCount;
+ return dura * loopcount;
}
/*!
@@ -580,7 +684,7 @@ void QAbstractAnimation::setCurrentTime(int msecs)
// Calculate new time and loop.
int dura = duration();
- int totalDura = (d->loopCount < 0 || dura == -1) ? -1 : dura * d->loopCount;
+ int totalDura = dura <= 0 ? dura : ((d->loopCount < 0) ? -1 : dura * d->loopCount);
if (totalDura != -1)
msecs = qMin(totalDura, msecs);
d->totalCurrentTime = msecs;
@@ -659,7 +763,7 @@ void QAbstractAnimation::stop()
/*!
Pauses the animation. When the animation is paused, state() returns Paused.
- The value of currentTime will remain unchanged until resume() or start()
+ The value of currentTime will remain unchanged until resume() or start()
is called. If you want to continue from the current time, call resume().
\sa start(), state(), resume()
diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h
index 1a79f40..bef0499 100644
--- a/src/corelib/animation/qabstractanimation_p.h
+++ b/src/corelib/animation/qabstractanimation_p.h
@@ -70,12 +70,14 @@ public:
QAbstractAnimationPrivate()
: state(QAbstractAnimation::Stopped),
direction(QAbstractAnimation::Forward),
- deleteWhenStopped(false),
totalCurrentTime(0),
currentTime(0),
loopCount(1),
currentLoop(0),
+ deleteWhenStopped(false),
hasRegisteredTimer(false),
+ isPause(false),
+ isGroup(false),
group(0)
{
}
@@ -89,7 +91,6 @@ public:
QAbstractAnimation::State state;
QAbstractAnimation::Direction direction;
- bool deleteWhenStopped;
void setState(QAbstractAnimation::State state);
int totalCurrentTime;
@@ -97,7 +98,10 @@ public:
int loopCount;
int currentLoop;
+ bool deleteWhenStopped;
bool hasRegisteredTimer;
+ bool isPause;
+ bool isGroup;
QAnimationGroup *group;
@@ -115,14 +119,14 @@ public:
//XXX this is needed by dui
static Q_CORE_EXPORT QUnifiedTimer *instance();
- void registerAnimation(QAbstractAnimation *animation);
+ void registerAnimation(QAbstractAnimation *animation, bool isTopLevel);
void unregisterAnimation(QAbstractAnimation *animation);
//defines the timing interval. Default is DEFAULT_TIMER_INTERVAL
void setTimingInterval(int interval)
{
timingInterval = interval;
- if (animationTimer.isActive()) {
+ if (animationTimer.isActive() && !isPauseTimerActive) {
//we changed the timing interval
animationTimer.start(timingInterval, this);
}
@@ -134,22 +138,46 @@ public:
*/
void setConsistentTiming(bool consistent) { consistentTiming = consistent; }
- int elapsedTime() const { return lastTick; }
+ /*
+ this is used for updating the currentTime of all animations in case the pause
+ timer is active or, otherwise, only of the animation passed as parameter.
+ */
+ void ensureTimerUpdate(QAbstractAnimation *animation);
+
+ /*
+ this will evaluate the need of restarting the pause timer in case there is still
+ some pause animations running.
+ */
+ void restartAnimationTimer();
protected:
void timerEvent(QTimerEvent *);
private:
- // timer used for all active animations
+ // timer used for all active (running) animations
QBasicTimer animationTimer;
- // timer used to delay the check if we should start/stop the global timer
+ // timer used to delay the check if we should start/stop the animation timer
QBasicTimer startStopAnimationTimer;
+
QTime time;
int lastTick;
int timingInterval;
int currentAnimationIdx;
bool consistentTiming;
+ // bool to indicate that only pause animations are active
+ bool isPauseTimerActive;
+
QList<QAbstractAnimation*> animations, animationsToStart;
+
+ // this is the count of running animations that are not a group neither a pause animation
+ int runningLeafAnimations;
+ QList<QAbstractAnimation*> runningPauseAnimations;
+
+ void registerRunningAnimation(QAbstractAnimation *animation);
+ void unregisterRunningAnimation(QAbstractAnimation *animation);
+
+ void updateAnimationsTime();
+ int closestPauseAnimationTimeToFinish();
};
QT_END_NAMESPACE
diff --git a/src/corelib/animation/qanimationgroup_p.h b/src/corelib/animation/qanimationgroup_p.h
index 45eab58..bb1cfb3 100644
--- a/src/corelib/animation/qanimationgroup_p.h
+++ b/src/corelib/animation/qanimationgroup_p.h
@@ -68,7 +68,9 @@ class QAnimationGroupPrivate : public QAbstractAnimationPrivate
Q_DECLARE_PUBLIC(QAnimationGroup)
public:
QAnimationGroupPrivate()
- { }
+ {
+ isGroup = true;
+ }
virtual void animationInsertedAt(int index) { Q_UNUSED(index) };
virtual void animationRemovedAt(int index);
diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp
index 2812854..0a04c14 100644
--- a/src/corelib/animation/qparallelanimationgroup.cpp
+++ b/src/corelib/animation/qparallelanimationgroup.cpp
@@ -136,7 +136,9 @@ void QParallelAnimationGroup::updateCurrentTime(int currentTime)
int dura = duration();
if (dura > 0) {
for (int i = 0; i < d->animations.size(); ++i) {
- d->animations.at(i)->setCurrentTime(dura); // will stop
+ QAbstractAnimation *animation = d->animations.at(i);
+ if (animation->state() != QAbstractAnimation::Stopped)
+ d->animations.at(i)->setCurrentTime(dura); // will stop
}
}
} else if (d->currentLoop < d->lastLoop) {
@@ -160,7 +162,7 @@ void QParallelAnimationGroup::updateCurrentTime(int currentTime)
QAbstractAnimation *animation = d->animations.at(i);
const int dura = animation->totalDuration();
//if the loopcount is bigger we should always start all animations
- if (d->currentLoop > d->lastLoop
+ if (d->currentLoop > d->lastLoop
//if we're at the end of the animation, we need to start it if it wasn't already started in this loop
//this happens in Backward direction where not all animations are started at the same time
|| d->shouldAnimationStart(animation, d->lastCurrentTime > dura /*startIfAtEnd*/)) {
@@ -283,7 +285,7 @@ bool QParallelAnimationGroupPrivate::shouldAnimationStart(QAbstractAnimation *an
void QParallelAnimationGroupPrivate::applyGroupState(QAbstractAnimation *animation)
{
- switch (state)
+ switch (state)
{
case QAbstractAnimation::Running:
animation->start();
diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp
index 2fd12aa..21e5b08 100644
--- a/src/corelib/animation/qpauseanimation.cpp
+++ b/src/corelib/animation/qpauseanimation.cpp
@@ -73,8 +73,9 @@ QT_BEGIN_NAMESPACE
class QPauseAnimationPrivate : public QAbstractAnimationPrivate
{
public:
- QPauseAnimationPrivate() : QAbstractAnimationPrivate(), duration(0)
+ QPauseAnimationPrivate() : QAbstractAnimationPrivate(), duration(250)
{
+ isPause = true;
}
int duration;
@@ -113,6 +114,7 @@ QPauseAnimation::~QPauseAnimation()
\brief the duration of the pause.
The duration of the pause. The duration should not be negative.
+ The default duration is 250 milliseconds.
*/
int QPauseAnimation::duration() const
{
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 742f4ec..7d47944 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -46,6 +46,7 @@
#include "qthreadstorage.h"
#include "qdir.h"
#include "qstringlist.h"
+#include "qdatetime.h"
#ifndef QT_NO_QOBJECT
#include <private/qthread_p.h>
@@ -2478,7 +2479,7 @@ bool qputenv(const char *varName, const QByteArray& value)
#endif
}
-#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
+#if (defined(Q_OS_UNIX) || defined(Q_OS_WIN)) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
# if defined(Q_OS_INTEGRITY) && defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER < 500)
// older versions of INTEGRITY used a long instead of a uint for the seed.
@@ -2523,6 +2524,48 @@ void qsrand(uint seed)
#endif
}
+/*! \internal
+ \relates <QtGlobal>
+ \since 4.6
+
+ Seed the PRNG, but only if it has not already been seeded.
+
+ The default seed is a combination of current time, a stack address and a
+ serial counter (since thread stack addresses are re-used).
+*/
+void qsrand()
+{
+#if (defined(Q_OS_UNIX) || defined(Q_OS_WIN)) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
+ SeedStorageType *pseed = randTLS()->localData();
+ if (pseed) {
+ // already seeded
+ return;
+ }
+ randTLS()->setLocalData(pseed = new SeedStorageType);
+ // start beyond 1 to avoid the sequence reset
+ static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(2);
+ *pseed = QDateTime::currentDateTime().toTime_t()
+ + quintptr(&pseed)
+ + serial.fetchAndAddRelaxed(1);
+#if defined(Q_OS_WIN)
+ // for Windows the srand function must still be called.
+ srand(*pseed);
+#endif
+
+#elif defined(Q_OS_WIN)
+ static unsigned int seed = 0;
+
+ if (seed)
+ return;
+
+ seed = GetTickCount();
+ srand(seed);
+#else
+ // Symbian?
+
+#endif // defined(Q_OS_UNIX) || defined(Q_OS_WIN)) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
+}
+
/*!
\relates <QtGlobal>
\since 4.2
@@ -2645,7 +2688,7 @@ int qrand()
\relates <QtGlobal>
Marks the string literal \a sourceText for dynamic translation in
- the given \a context, i.e the stored \a sourceText will not be
+ the given \a context; i.e, the stored \a sourceText will not be
altered. The \a context is typically a class and also needs to
be specified as string literal.
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index df17546..5ee1815 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -466,7 +466,7 @@ namespace QT_NAMESPACE {}
# define Q_NO_USING_KEYWORD
# define QT_NO_STL_WCHAR
# endif
-# if __GNUC__ >= 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
# define Q_ALIGNOF(type) __alignof__(type)
# define Q_TYPEOF(expr) __typeof__(expr)
# define Q_DECL_ALIGN(n) __attribute__((__aligned__(n)))
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index 4234a7e..2b62c6b 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -44,10 +44,6 @@
#include <QtCore/qglobal.h>
-#ifdef Q_OS_SYMBIAN
-# include <e32def.h>
-#endif
-
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -501,8 +497,6 @@ public:
WA_WState_AcceptedTouchBeginEvent = 122,
WA_TouchPadAcceptSingleTouchEvents = 123,
- WA_DontUseStandardGestures = 124,
-
// Add new attributes before this line
WA_AttributeCount
};
@@ -1615,9 +1609,32 @@ public:
enum GestureState
{
NoGesture,
- GestureStarted = 1,
- GestureUpdated = 2,
- GestureFinished = 3
+ GestureStarted = 1,
+ GestureUpdated = 2,
+ GestureFinished = 3,
+ GestureCanceled = 4
+ };
+
+ enum GestureType
+ {
+ TapGesture = 1,
+ TapAndHoldGesture = 2,
+ PanGesture = 3,
+ PinchGesture = 4,
+ SwipeGesture = 5,
+
+ CustomGesture = 0x0100,
+
+ LastGestureType = ~0u
+ };
+
+ enum GestureContext
+ {
+ WidgetGesture = 0,
+ WidgetWithChildrenGesture = 3,
+
+ ItemGesture = WidgetGesture,
+ ItemWithChildrenGesture = WidgetWithChildrenGesture
};
enum NavigationMode
@@ -1638,7 +1655,6 @@ public:
;
#endif
-
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::MouseButtons)
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::Orientations)
Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::KeyboardModifiers)
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index ab232bf..e8d6df0 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -1225,8 +1225,6 @@
\value WA_TouchPadAcceptSingleTouchEvents Allows touchpad single
touch events to be sent to the widget.
- \value WA_DontUseStandardGestures Disables standard gestures on Qt widgets.
-
\omitvalue WA_SetLayoutDirection
\omitvalue WA_InputMethodTransparent
\omitvalue WA_WState_CompressKeys
@@ -1829,7 +1827,9 @@
\value TabFocus the widget accepts focus by tabbing.
\value ClickFocus the widget accepts focus by clicking.
\value StrongFocus the widget accepts focus by both tabbing
- and clicking.
+ and clicking. On Mac OS X this will also
+ be indicate that the widget accepts tab focus
+ when in 'Text/List focus mode'.
\value WheelFocus like Qt::StrongFocus plus the widget accepts
focus by using the mouse wheel.
\value NoFocus the widget does not accept focus.
@@ -2798,15 +2798,54 @@
This enum type describes the state of a gesture.
- \value NoGesture Initial state
\value GestureStarted A continuous gesture has started.
\value GestureUpdated A gesture continues.
\value GestureFinished A gesture has finished.
+ \value GestureCanceled A gesture was canceled.
+ \omitvalue NoGesture
\sa QGesture
*/
/*!
+ \enum Qt::GestureType
+ \since 4.6
+
+ This enum type describes the standard gestures.
+
+ \value TapGesture A Tap gesture.
+ \value TapAndHoldGesture A Tap-And-Hold (Long-Tap) gesture.
+ \value PanGesture A Pan gesture.
+ \value PinchGesture A Pinch gesture.
+ \value SwipeGesture A Swipe gesture.
+ \value CustomGesture User-defined gesture ID.
+ \value LastGestureType Last user gesture ID.
+
+ User-defined gestures are registered with the
+ QApplication::registerGestureRecognizer() function which generates a custom gesture ID
+ in the range of values from CustomGesture to LastGestureType.
+
+ \sa QGesture, QWidget::grabGesture()
+*/
+
+/*!
+ \enum Qt::GestureContext
+ \since 4.6
+
+ This enum type describes the context of a gesture.
+
+ For a QGesture to trigger, the gesture recognizer should filter events for
+ a widget tree. This enum describes for which widget the gesture recognizer
+ should filter events:
+
+ \value WidgetGesture Gestures can only start over the widget itself.
+ \value WidgetWithChildrenGesture Gestures can start on the widget or over
+ any of its children.
+
+ \sa QWidget::grabGesture()
+*/
+
+/*!
\enum Qt::NavigationMode
\since 4.6
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index a67b3bd..59db9a6 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -1930,7 +1930,7 @@ QString QDir::currentPath()
Under non-Windows operating systems the \c HOME environment
variable is used if it exists, otherwise the path returned by the
- rootPath().
+ rootPath(). On Symbian always the same as the path returned by the rootPath().
\sa home(), currentPath(), rootPath(), tempPath()
*/
@@ -2002,7 +2002,8 @@ QString QDir::tempPath()
Returns the absolute path of the root directory.
For Unix operating systems this returns "/". For Windows file
- systems this normally returns "c:/".
+ systems this normally returns "c:/". On Symbian this typically returns
+ "c:/data", i.e. the same as native PathInfo::PhoneMemoryRootPath().
\sa root(), drives(), currentPath(), homePath(), tempPath()
*/
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index a6a61dd..37161bc 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -97,6 +97,10 @@ QT_END_NAMESPACE
#include <private/qwineventnotifier_p.h>
#endif
+#ifdef Q_OS_SYMBIAN
+#include <e32std.h>
+#endif
+
#ifndef QT_NO_PROCESS
QT_BEGIN_NAMESPACE
@@ -412,7 +416,7 @@ void QProcessPrivate::Channel::clear()
}
/*! \fn bool QProcessPrivate::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)
-
+
\internal
*/
@@ -2238,7 +2242,7 @@ QProcessEnvironment QProcessEnvironment::systemEnvironment()
\relates QProcess
Typedef for the identifiers used to represent processes on the underlying
- platform. On Unix, this corresponds to \l qint64; on Windows, it
+ platform. On Unix and Symbian, this corresponds to \l qint64; on Windows, it
corresponds to \c{_PROCESS_INFORMATION*}.
\sa QProcess::pid()
diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h
index 09a6fc8..ffcd5de 100644
--- a/src/corelib/io/qprocess.h
+++ b/src/corelib/io/qprocess.h
@@ -54,13 +54,8 @@ QT_MODULE(Core)
#ifndef QT_NO_PROCESS
-#if (!defined(Q_OS_WIN32) && !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)) || defined(qdoc)
+#if (!defined(Q_OS_WIN32) && !defined(Q_OS_WINCE)) || defined(qdoc)
typedef qint64 Q_PID;
-#elif defined(Q_OS_SYMBIAN)
-QT_END_NAMESPACE
-# include <e32std.h>
-QT_BEGIN_NAMESPACE
-typedef TProcessId Q_PID;
#else
QT_END_NAMESPACE
typedef struct _PROCESS_INFORMATION *Q_PID;
diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h
index 8092792..09be544 100644
--- a/src/corelib/io/qprocess_p.h
+++ b/src/corelib/io/qprocess_p.h
@@ -77,6 +77,9 @@ class QSocketNotifier;
class QWindowsPipeWriter;
class QWinEventNotifier;
class QTimer;
+#if defined(Q_OS_SYMBIAN)
+class RProcess;
+#endif
class QProcessEnvironmentPrivate: public QSharedData
{
diff --git a/src/corelib/io/qprocess_symbian.cpp b/src/corelib/io/qprocess_symbian.cpp
index f5de750..1f5117f 100644
--- a/src/corelib/io/qprocess_symbian.cpp
+++ b/src/corelib/io/qprocess_symbian.cpp
@@ -791,7 +791,7 @@ void QProcessPrivate::startProcess()
TInt err = qt_create_symbian_process(&symbianProcess, program, arguments);
if (err == KErrNone) {
- pid = symbianProcess->Id();
+ pid = symbianProcess->Id().Id();
::fcntl(deathPipe[0], F_SETFL, ::fcntl(deathPipe[0], F_GETFL) | O_NONBLOCK);
@@ -816,7 +816,7 @@ void QProcessPrivate::startProcess()
symbianProcess->Resume();
- QPROCESS_DEBUG_PRINT("QProcessPrivate::startProcess(): this: 0x%x, pid: %d", this, (TUint)pid);
+ QPROCESS_DEBUG_PRINT("QProcessPrivate::startProcess(): this: 0x%x, pid: %ld", this, pid);
// Notify child start
_q_startupNotification();
@@ -1021,7 +1021,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
if (err == KErrNone) {
if (pid)
- *pid = (qint64)newProc->Id();
+ *pid = newProc->Id().Id();
newProc->Resume();
newProc->Close();
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 1fd2165..a1c9833 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -2565,8 +2565,9 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
Example:
\snippet doc/src/snippets/code/src_corelib_io_qsettings.cpp 10
- The scope is QSettings::UserScope and the format is
- QSettings::NativeFormat.
+ The scope is set to QSettings::UserScope, and the format is
+ set to QSettings::NativeFormat (i.e. calling setDefaultFormat()
+ before calling this constructor has no effect).
\sa setDefaultFormat(), {Fallback Mechanism}
*/
@@ -2583,11 +2584,12 @@ QSettings::QSettings(const QString &organization, const QString &application, QO
If \a scope is QSettings::UserScope, the QSettings object searches
user-specific settings first, before it searches system-wide
- settings as a fallback. If \a scope is
- QSettings::SystemScope, the QSettings object ignores user-specific
- settings and provides access to system-wide settings.
+ settings as a fallback. If \a scope is QSettings::SystemScope, the
+ QSettings object ignores user-specific settings and provides
+ access to system-wide settings.
- The storage format is QSettings::NativeFormat.
+ The storage format is set to QSettings::NativeFormat (i.e. calling
+ setDefaultFormat() before calling this constructor has no effect).
If no application name is given, the QSettings object will
only access the organization-wide \l{Fallback Mechanism}{locations}.
@@ -2668,6 +2670,8 @@ QSettings::QSettings(const QString &fileName, Format format, QObject *parent)
The scope is QSettings::UserScope and the format is
defaultFormat() (QSettings::NativeFormat by default).
+ Use setDefaultFormat() before calling this constructor
+ to change the default format used by this constructor.
The code
@@ -3352,10 +3356,12 @@ QVariant QSettings::value(const QString &key, const QVariant &defaultValue) cons
/*!
\since 4.4
- Sets the default file format to the given \a format, used for storing
- settings for the QSettings(QObject *) constructor.
+ Sets the default file format to the given \a format, which is used
+ for storing settings for the QSettings(QObject *) constructor.
- If no default format is set, QSettings::NativeFormat is used.
+ If no default format is set, QSettings::NativeFormat is used. See
+ the documentation for the QSettings constructor you are using to
+ see if that constructor will ignore this function.
\sa format()
*/
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 22d0019..6001d9d 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -3874,10 +3874,15 @@ QByteArray QUrlPrivate::toEncoded(QUrl::FormattingOptions options) const
}
}
- if (host.startsWith(QLatin1Char('[')))
+ if (host.startsWith(QLatin1Char('['))) {
url += host.toLatin1();
- else
+ } else if (host.contains(QLatin1Char(':'))) {
+ url += '[';
+ url += host.toLatin1();
+ url += ']';
+ } else {
url += QUrl::toAce(host);
+ }
if (!(options & QUrl::RemovePort) && port != -1) {
url += ':';
url += QString::number(port).toAscii();
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index 744e6a9..9098515 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -228,6 +228,9 @@ QT_BEGIN_NAMESPACE
\value TouchBegin Beginning of a sequence of touch-screen and/or track-pad events (QTouchEvent)
\value TouchUpdate Touch-screen event (QTouchEvent)
\value TouchEnd End of touch-event sequence (QTouchEvent)
+ \value WinIdChange The window system identifer for this native widget has changed
+ \value Gesture A gesture was triggered (QGestureEvent)
+ \value GestureOverride A gesture override was triggered (QGestureEvent)
User events should have values between \c User and \c{MaxUser}:
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index d66cead..6427d17 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -283,6 +283,10 @@ public:
UpdateSoftKeys = 201, // Internal for compressing soft key updates
+ WinIdChange = 203,
+ Gesture = 198,
+ GestureOverride = 202,
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
@@ -324,6 +328,7 @@ private:
friend class QGraphicsView;
friend class QGraphicsViewPrivate;
friend class QGraphicsScenePrivate;
+ friend class QGestureManager;
};
class Q_CORE_EXPORT QTimerEvent : public QEvent
diff --git a/src/corelib/kernel/qeventdispatcher_symbian.cpp b/src/corelib/kernel/qeventdispatcher_symbian.cpp
index acbb7e4..b32696d 100644
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp
@@ -668,6 +668,7 @@ void QEventDispatcherSymbian::closingDown()
bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags flags )
{
bool handledAnyEvent = false;
+ bool oldNoSocketEventsValue = m_noSocketEvents;
QT_TRY {
Q_D(QAbstractEventDispatcher);
@@ -686,7 +687,6 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla
block = false;
}
- bool oldNoSocketEventsValue = m_noSocketEvents;
if (flags & QEventLoop::ExcludeSocketNotifiers) {
m_noSocketEvents = true;
} else {
@@ -749,11 +749,11 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla
block = false;
if (timeState == TimeStarted && time.elapsed() > 100) {
priority = m_processHandle.Priority();
- m_processHandle.SetPriority(EPriorityLow);
+ m_processHandle.SetPriority(EPriorityBackground);
time.start();
// Slight chance of race condition in the next lines, but nothing fatal
// will happen, just wrong priority.
- if (m_processHandle.Priority() == EPriorityLow) {
+ if (m_processHandle.Priority() == EPriorityBackground) {
m_processHandle.SetPriority(priority);
}
}
@@ -762,14 +762,14 @@ bool QEventDispatcherSymbian::processEvents ( QEventLoop::ProcessEventsFlags fla
};
emit awake();
-
- m_noSocketEvents = oldNoSocketEventsValue;
} QT_CATCH (const std::exception& ex) {
#ifndef QT_NO_EXCEPTIONS
CActiveScheduler::Current()->Error(qt_symbian_exception2Error(ex));
#endif
}
+ m_noSocketEvents = oldNoSocketEventsValue;
+
return handledAnyEvent;
}
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index a8120cf..7be19b3 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -3332,6 +3332,7 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
QObjectConnectionListVector *connectionLists = sender->d_func()->connectionLists;
if (!connectionLists) {
+ locker.unlock();
if (qt_signal_spy_callback_set.signal_end_callback != 0)
qt_signal_spy_callback_set.signal_end_callback(sender, signal_absolute_index);
return;
@@ -3401,11 +3402,11 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign
}
#endif
- locker.relock();
-
if (qt_signal_spy_callback_set.slot_end_callback != 0)
qt_signal_spy_callback_set.slot_end_callback(receiver, method);
+ locker.relock();
+
QObjectPrivate::resetCurrentSender(receiver, &currentSender, previousSender);
if (connectionLists->orphaned)
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 7224ad3..3c79653 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -548,9 +548,11 @@ bool QUuid::operator>(const QUuid &other) const
On any platform other than Windows, this function returns a new
UUID with variant QUuid::DCE and version QUuid::Random. The random
numbers used to construct the UUID are obtained from the local
- pseudo-random generator, which is usually not a cryptographic
+ pseudo-random generator, qrand(), which is usually not a cryptographic
quality random number generator. Therefore, a UUID generated by
- this function can't be guaranteed to be unique.
+ this function can't be guaranteed to be unique. If the pseudo-random
+ number generator for the calling thread has not yet been seeded, this
+ function will seed the pseudo-random number generator by calling qsrand().
On a Windows platform, a GUID is generated, which almost certainly
\e{will} be unique, on this or any other system, networked or not.
@@ -578,6 +580,8 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include "stdlib.h" // For srand/rand
QT_END_INCLUDE_NAMESPACE
+extern void qsrand(); // in qglobal.cpp
+
QUuid QUuid::createUuid()
{
static const int intbits = sizeof(int)*8;
@@ -585,10 +589,11 @@ QUuid QUuid::createUuid()
if (!randbits) {
int max = RAND_MAX;
do { ++randbits; } while ((max=max>>1));
- qsrand((uint)QDateTime::currentDateTime().toTime_t());
- qrand(); // Skip first
}
+ // reseed, but only if not already seeded
+ qsrand();
+
QUuid result;
uint *data = &(result.data1);
int chunks = 16 / sizeof(uint);
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 1b559cf..54465bb 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -73,6 +73,10 @@
#include <private/qcore_mac_p.h>
#endif
+#if defined(Q_OS_SYMBIAN)
+#include <e32std.h>
+#endif
+
QT_BEGIN_NAMESPACE
enum {
@@ -1128,6 +1132,12 @@ QDate QDate::currentDate()
memset(&st, 0, sizeof(SYSTEMTIME));
GetLocalTime(&st);
d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay);
+#elif defined(Q_OS_SYMBIAN)
+ TTime localTime;
+ localTime.HomeTime();
+ TDateTime localDateTime = localTime.DateTime();
+ // months and days are zero indexed
+ d.jd = julianDayFromDate(localDateTime.Year(), localDateTime.Month() + 1, localDateTime.Day() + 1 );
#else
// posix compliant system
time_t ltime;
@@ -1823,6 +1833,12 @@ QTime QTime::currentTime()
#if defined(Q_OS_WINCE)
ct.startTick = GetTickCount() % MSECS_PER_DAY;
#endif
+#elif defined(Q_OS_SYMBIAN)
+ TTime localTime;
+ localTime.HomeTime();
+ TDateTime localDateTime = localTime.DateTime();
+ ct.mds = MSECS_PER_HOUR * localDateTime.Hour() + MSECS_PER_MIN * localDateTime.Minute()
+ + 1000 * localDateTime.Second() + (localDateTime.MicroSecond() / 1000);
#elif defined(Q_OS_UNIX)
// posix compliant system
struct timeval tv;
@@ -2874,6 +2890,8 @@ QDateTime QDateTime::currentDateTime()
t.mds = MSECS_PER_HOUR * st.wHour + MSECS_PER_MIN * st.wMinute + 1000 * st.wSecond
+ st.wMilliseconds;
return QDateTime(d, t);
+#elif defined(Q_OS_SYMBIAN)
+ return QDateTime(QDate::currentDate(), QTime::currentTime());
#else
#if defined(Q_OS_UNIX)
// posix compliant system
@@ -3700,6 +3718,27 @@ static QDateTimePrivate::Spec utcToLocal(QDate &date, QTime &time)
res.tm_mon = sysTime.wMonth - 1;
res.tm_year = sysTime.wYear - 1900;
brokenDown = &res;
+#elif defined(Q_OS_SYMBIAN)
+ // months and days are zero index based
+ _LIT(KUnixEpoch, "19700000:000000.000000");
+ TTimeIntervalSeconds utcOffset = User::UTCOffset();
+ TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
+ TTime epochTTime;
+ TInt err = epochTTime.Set(KUnixEpoch);
+ if(err == KErrNone) {
+ TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
+ utcTTime = utcTTime + utcOffset;
+ TDateTime utcDateTime = utcTTime.DateTime();
+ tm res;
+ res.tm_sec = utcDateTime.Second();
+ res.tm_min = utcDateTime.Minute();
+ res.tm_hour = utcDateTime.Hour();
+ res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
+ res.tm_mon = utcDateTime.Month();
+ res.tm_year = utcDateTime.Year() - 1900;
+ res.tm_isdst = 0;
+ brokenDown = &res;
+ }
#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
// use the reentrant version of localtime() where available
tzset();
@@ -3745,7 +3784,7 @@ static void localToUtc(QDate &date, QTime &time, int isdst)
localTM.tm_mon = fakeDate.month() - 1;
localTM.tm_year = fakeDate.year() - 1900;
localTM.tm_isdst = (int)isdst;
-#if defined(Q_OS_WINCE)
+#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
time_t secsSince1Jan1970UTC = toTime_tHelper(fakeDate, time);
#else
#if defined(Q_OS_WIN)
@@ -3770,6 +3809,27 @@ static void localToUtc(QDate &date, QTime &time, int isdst)
res.tm_year = sysTime.wYear - 1900;
res.tm_isdst = (int)isdst;
brokenDown = &res;
+#elif defined(Q_OS_SYMBIAN)
+ // months and days are zero index based
+ _LIT(KUnixEpoch, "19700000:000000.000000");
+ TTimeIntervalSeconds utcOffset = TTimeIntervalSeconds(0 - User::UTCOffset().Int());
+ TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
+ TTime epochTTime;
+ TInt err = epochTTime.Set(KUnixEpoch);
+ if(err == KErrNone) {
+ TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
+ utcTTime = utcTTime + utcOffset;
+ TDateTime utcDateTime = utcTTime.DateTime();
+ tm res;
+ res.tm_sec = utcDateTime.Second();
+ res.tm_min = utcDateTime.Minute();
+ res.tm_hour = utcDateTime.Hour();
+ res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
+ res.tm_mon = utcDateTime.Month();
+ res.tm_year = utcDateTime.Year() - 1900;
+ res.tm_isdst = (int)isdst;
+ brokenDown = &res;
+ }
#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
// use the reentrant version of gmtime() where available
tm res;
diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h
index 96fe91c..8f6d9d9 100644
--- a/src/gui/accessible/qaccessible.h
+++ b/src/gui/accessible/qaccessible.h
@@ -310,7 +310,8 @@ namespace QAccessible2
TextInterface,
EditableTextInterface,
ValueInterface,
- TableInterface
+ TableInterface,
+ ActionInterface
};
}
@@ -319,6 +320,7 @@ class QAccessibleTextInterface;
class QAccessibleEditableTextInterface;
class QAccessibleValueInterface;
class QAccessibleTableInterface;
+class QAccessibleActionInterface;
class Q_GUI_EXPORT QAccessibleInterface : public QAccessible
{
@@ -376,6 +378,9 @@ public:
inline QAccessibleTableInterface *tableInterface()
{ return reinterpret_cast<QAccessibleTableInterface *>(cast_helper(QAccessible2::TableInterface)); }
+ inline QAccessibleActionInterface *actionInterface()
+ { return reinterpret_cast<QAccessibleActionInterface *>(cast_helper(QAccessible2::ActionInterface)); }
+
private:
QAccessible2Interface *cast_helper(QAccessible2::InterfaceType);
};
diff --git a/src/gui/accessible/qaccessible2.cpp b/src/gui/accessible/qaccessible2.cpp
index f731962..0867368 100644
--- a/src/gui/accessible/qaccessible2.cpp
+++ b/src/gui/accessible/qaccessible2.cpp
@@ -108,6 +108,18 @@ QT_BEGIN_NAMESPACE
\link http://www.linux-foundation.org/en/Accessibility/IAccessible2 IAccessible2 Specification \endlink
*/
+/*!
+ \class QAccessibleActionInterface
+ \ingroup accessibility
+ \internal
+ \preliminary
+
+ \brief The QAccessibleActionInterface class implements support for
+ the IAccessibleAction interface.
+
+ \link http://www.linux-foundation.org/en/Accessibility/IAccessible2 IAccessible2 Specification \endlink
+*/
+
QAccessibleSimpleEditableTextInterface::QAccessibleSimpleEditableTextInterface(
QAccessibleInterface *accessibleInterface)
: iface(accessibleInterface)
diff --git a/src/gui/accessible/qaccessible2.h b/src/gui/accessible/qaccessible2.h
index 3281509..435c640 100644
--- a/src/gui/accessible/qaccessible2.h
+++ b/src/gui/accessible/qaccessible2.h
@@ -81,6 +81,7 @@ inline QAccessible2Interface *qAccessibleValueCastHelper() { return 0; }
inline QAccessible2Interface *qAccessibleTextCastHelper() { return 0; }
inline QAccessible2Interface *qAccessibleEditableTextCastHelper() { return 0; }
inline QAccessible2Interface *qAccessibleTableCastHelper() { return 0; }
+inline QAccessible2Interface *qAccessibleActionCastHelper() { return 0; }
#define Q_ACCESSIBLE_OBJECT \
public: \
@@ -95,6 +96,8 @@ inline QAccessible2Interface *qAccessibleTableCastHelper() { return 0; }
return qAccessibleValueCastHelper(); \
case QAccessible2::TableInterface: \
return qAccessibleTableCastHelper(); \
+ case QAccessible2::ActionInterface: \
+ return qAccessibleActionCastHelper(); \
} \
return 0; \
} \
@@ -208,6 +211,19 @@ public:
int *columnSpan, bool *isSelected) = 0;
};
+class Q_GUI_EXPORT QAccessibleActionInterface : public QAccessible2Interface
+{
+public:
+ inline QAccessible2Interface *qAccessibleActionCastHelper() { return this; }
+
+ virtual int actionCount() = 0;
+ virtual void doAction(int actionIndex) = 0;
+ virtual QString description(int actionIndex) = 0;
+ virtual QString name(int actionIndex) = 0;
+ virtual QString localizedName(int actionIndex) = 0;
+ virtual QStringList keyBindings(int actionIndex) = 0;
+};
+
#endif // QT_NO_ACCESSIBILITY
QT_END_NAMESPACE
diff --git a/src/gui/animation/qguivariantanimation.cpp b/src/gui/animation/qguivariantanimation.cpp
index 0ae79b6..1e9c166 100644
--- a/src/gui/animation/qguivariantanimation.cpp
+++ b/src/gui/animation/qguivariantanimation.cpp
@@ -54,10 +54,10 @@ QT_BEGIN_NAMESPACE
template<> Q_INLINE_TEMPLATE QColor _q_interpolate(const QColor &f,const QColor &t, qreal progress)
{
- return QColor(_q_interpolate(f.red(), t.red(), progress),
- _q_interpolate(f.green(), t.green(), progress),
- _q_interpolate(f.blue(), t.blue(), progress),
- _q_interpolate(f.alpha(), t.alpha(), progress));
+ return QColor(qBound(0,_q_interpolate(f.red(), t.red(), progress),255),
+ qBound(0,_q_interpolate(f.green(), t.green(), progress),255),
+ qBound(0,_q_interpolate(f.blue(), t.blue(), progress),255),
+ qBound(0,_q_interpolate(f.alpha(), t.alpha(), progress),255));
}
template<> Q_INLINE_TEMPLATE QQuaternion _q_interpolate(const QQuaternion &f,const QQuaternion &t, qreal progress)
diff --git a/src/gui/dialogs/qcolordialog_mac.mm b/src/gui/dialogs/qcolordialog_mac.mm
index f6b88bb..9e4fdd1 100644
--- a/src/gui/dialogs/qcolordialog_mac.mm
+++ b/src/gui/dialogs/qcolordialog_mac.mm
@@ -44,6 +44,7 @@
#include <qapplication.h>
#include <qtimer.h>
#include <qdialogbuttonbox.h>
+#include <qabstracteventdispatcher.h>
#include <private/qapplication_p.h>
#include <private/qt_mac_p.h>
#include <qdebug.h>
@@ -319,6 +320,7 @@ QT_USE_NAMESPACE
QMacCocoaAutoReleasePool pool;
mDialogIsExecuting = true;
[NSApp runModalForWindow:mColorPanel];
+ QAbstractEventDispatcher::instance()->interrupt();
if (mResultCode == NSCancelButton)
mPriv->colorDialog()->reject();
else
@@ -411,7 +413,7 @@ void QColorDialogPrivate::openCocoaColorPanel(const QColor &initial,
void QColorDialogPrivate::closeCocoaColorPanel()
{
- [[static_cast<QCocoaColorPanelDelegate *>(delegate) colorPanel] close];
+ [static_cast<QCocoaColorPanelDelegate *>(delegate) onCancelClicked];
}
void QColorDialogPrivate::releaseCocoaColorPanelDelegate()
diff --git a/src/gui/dialogs/qerrormessage.cpp b/src/gui/dialogs/qerrormessage.cpp
index 436ef94..762936a 100644
--- a/src/gui/dialogs/qerrormessage.cpp
+++ b/src/gui/dialogs/qerrormessage.cpp
@@ -245,12 +245,6 @@ QErrorMessage::QErrorMessage(QWidget * parent)
Q_D(QErrorMessage);
QGridLayout * grid = new QGridLayout(this);
d->icon = new QLabel(this);
-#ifdef QT_SOFTKEYS_ENABLED
- d->okAction = new QAction(this);
- d->okAction->setSoftKeyRole(QAction::PositiveSoftKey);
- connect(d->okAction, SIGNAL(triggered()), this, SLOT(accept()));
- addAction(d->okAction);
-#endif
#ifndef QT_NO_MESSAGEBOX
d->icon->setPixmap(QMessageBox::standardIcon(QMessageBox::Information));
d->icon->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
@@ -262,6 +256,13 @@ QErrorMessage::QErrorMessage(QWidget * parent)
d->again->setChecked(true);
grid->addWidget(d->again, 1, 1, Qt::AlignTop);
d->ok = new QPushButton(this);
+#ifdef QT_SOFTKEYS_ENABLED
+ d->okAction = new QAction(d->ok);
+ d->okAction->setSoftKeyRole(QAction::PositiveSoftKey);
+ connect(d->okAction, SIGNAL(triggered()), this, SLOT(accept()));
+ addAction(d->okAction);
+#endif
+
#if defined(Q_WS_WINCE) || defined(Q_WS_S60)
d->ok->setFixedSize(0,0);
diff --git a/src/gui/dialogs/qfiledialog_mac.mm b/src/gui/dialogs/qfiledialog_mac.mm
index 3a4ecce..d9bec27 100644
--- a/src/gui/dialogs/qfiledialog_mac.mm
+++ b/src/gui/dialogs/qfiledialog_mac.mm
@@ -62,6 +62,7 @@
#include <qvarlengtharray.h>
#include <qdesktopwidget.h>
#include <stdlib.h>
+#include <qabstracteventdispatcher.h>
#include "ui_qfiledialog.h"
QT_BEGIN_NAMESPACE
@@ -245,6 +246,8 @@ QT_USE_NAMESPACE
mReturnCode = [mSavePanel
runModalForDirectory:mCurrentDir
file:selectable ? filename : @"untitled"];
+
+ QAbstractEventDispatcher::instance()->interrupt();
return (mReturnCode == NSOKButton);
}
@@ -277,6 +280,10 @@ QT_USE_NAMESPACE
- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
{
Q_UNUSED(sender);
+
+ if ([filename length] == 0)
+ return NO;
+
QString qtFileName = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(filename);
QFileInfo info(qtFileName.normalized(QT_PREPEND_NAMESPACE(QString::NormalizationForm_C)));
QString path = info.absolutePath();
diff --git a/src/gui/dialogs/qfiledialog_win.cpp b/src/gui/dialogs/qfiledialog_win.cpp
index b59c28b..8089b43 100644
--- a/src/gui/dialogs/qfiledialog_win.cpp
+++ b/src/gui/dialogs/qfiledialog_win.cpp
@@ -251,10 +251,10 @@ static OPENFILENAME* qt_win_make_OFN(QWidget *parent,
ofn->nMaxFile = maxLen;
ofn->lpstrInitialDir = (wchar_t*)tInitDir.utf16();
ofn->lpstrTitle = (wchar_t*)tTitle.utf16();
- ofn->Flags = (OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_EXPLORER);
+ ofn->Flags = (OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_PATHMUSTEXIST);
if (mode == QFileDialog::ExistingFile ||
mode == QFileDialog::ExistingFiles)
- ofn->Flags |= (OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST);
+ ofn->Flags |= (OFN_FILEMUSTEXIST);
if (mode == QFileDialog::ExistingFiles)
ofn->Flags |= (OFN_ALLOWMULTISELECT);
if (!(options & QFileDialog::DontConfirmOverwrite))
diff --git a/src/gui/dialogs/qprintdialog_mac.mm b/src/gui/dialogs/qprintdialog_mac.mm
index 667fc40..56a065a 100644
--- a/src/gui/dialogs/qprintdialog_mac.mm
+++ b/src/gui/dialogs/qprintdialog_mac.mm
@@ -122,6 +122,8 @@ QT_END_NAMESPACE
QT_USE_NAMESPACE
+#ifdef QT_MAC_USE_COCOA
+
@class QCocoaPrintPanelDelegate;
@interface QCocoaPrintPanelDelegate : NSObject {
@@ -197,6 +199,8 @@ QT_USE_NAMESPACE
}
@end
+#endif
+
QT_BEGIN_NAMESPACE
extern void macStartInterceptWindowTitle(QWidget *window);
diff --git a/src/gui/dialogs/qprogressdialog.cpp b/src/gui/dialogs/qprogressdialog.cpp
index 5fb10bf..f5024bb 100644
--- a/src/gui/dialogs/qprogressdialog.cpp
+++ b/src/gui/dialogs/qprogressdialog.cpp
@@ -453,7 +453,7 @@ void QProgressDialog::setCancelButton(QPushButton *cancelButton)
cancelButton->show();
#else
{
- d->cancelAction = new QAction(cancelButton->text(), this);
+ d->cancelAction = new QAction(cancelButton->text(), cancelButton);
d->cancelAction->setSoftKeyRole(QAction::NegativeSoftKey);
connect(d->cancelAction, SIGNAL(triggered()), this, SIGNAL(canceled()));
addAction(d->cancelAction);
diff --git a/src/gui/dialogs/qwizard.cpp b/src/gui/dialogs/qwizard.cpp
index 0f6d353..0102e25 100644
--- a/src/gui/dialogs/qwizard.cpp
+++ b/src/gui/dialogs/qwizard.cpp
@@ -1340,7 +1340,7 @@ bool QWizardPrivate::ensureButton(QWizard::WizardButton which) const
pushButton->setText(buttonDefaultText(wizStyle, which, this));
#ifdef QT_SOFTKEYS_ENABLED
- QAction *softKey = new QAction(pushButton->text(), antiFlickerWidget);
+ QAction *softKey = new QAction(pushButton->text(), pushButton);
QAction::SoftKeyRole softKeyRole;
switch(which) {
case QWizard::NextButton:
diff --git a/src/gui/effects/qgraphicseffect.cpp b/src/gui/effects/qgraphicseffect.cpp
index ee01fdc..96d35b0 100644
--- a/src/gui/effects/qgraphicseffect.cpp
+++ b/src/gui/effects/qgraphicseffect.cpp
@@ -105,6 +105,7 @@
#include <QtGui/qpainter.h>
#include <QtCore/qrect.h>
#include <QtCore/qdebug.h>
+#include <private/qdrawhelper_p.h>
QT_BEGIN_NAMESPACE
@@ -252,7 +253,24 @@ bool QGraphicsEffectSource::isPixmap() const
*/
QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offset) const
{
- return d_func()->pixmap(system, offset);
+ Q_D(const QGraphicsEffectSource);
+
+ QPixmap pm;
+ if (d->m_cachedSystem == system)
+ QPixmapCache::find(d->m_cacheKey, &pm);
+
+ if (pm.isNull()) {
+ pm = d->pixmap(system, &d->m_cachedOffset);
+ d->m_cachedSystem = system;
+
+ d->invalidateCache();
+ d->m_cacheKey = QPixmapCache::insert(pm);
+ }
+
+ if (offset)
+ *offset = d->m_cachedOffset;
+
+ return pm;
}
/*!
@@ -893,15 +911,8 @@ void QGraphicsBlurEffect::draw(QPainter *painter, QGraphicsEffectSource *source)
return;
}
- QPoint offset;
- if (source->isPixmap()) {
- // No point in drawing in device coordinates (pixmap will be scaled anyways).
- const QPixmap pixmap = source->pixmap(Qt::LogicalCoordinates, &offset);
- d->filter->draw(painter, offset, pixmap);
- return;
- }
-
// Draw pixmap in device coordinates to avoid pixmap scaling.
+ QPoint offset;
const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset);
QTransform restoreTransform = painter->worldTransform();
painter->setWorldTransform(QTransform());
@@ -1084,15 +1095,8 @@ void QGraphicsDropShadowEffect::draw(QPainter *painter, QGraphicsEffectSource *s
return;
}
- QPoint offset;
- if (source->isPixmap()) {
- // No point in drawing in device coordinates (pixmap will be scaled anyways).
- const QPixmap pixmap = source->pixmap(Qt::LogicalCoordinates, &offset);
- d->filter->draw(painter, offset, pixmap);
- return;
- }
-
// Draw pixmap in device coordinates to avoid pixmap scaling.
+ QPoint offset;
const QPixmap pixmap = source->pixmap(Qt::DeviceCoordinates, &offset);
QTransform restoreTransform = painter->worldTransform();
painter->setWorldTransform(QTransform());
@@ -1475,6 +1479,8 @@ void QGraphicsBloomEffect::setStrength(qreal strength)
The \a strength parameter holds the effect's new strength.
*/
+extern QPixmap qt_toRasterPixmap(const QPixmap &pixmap);
+
/*!
\reimp
*/
@@ -1486,42 +1492,37 @@ void QGraphicsBloomEffect::draw(QPainter *painter, QGraphicsEffectSource *source
return;
}
- const Qt::CoordinateSystem system = source->isPixmap()
- ? Qt::LogicalCoordinates : Qt::DeviceCoordinates;
QPoint offset;
- QPixmap pixmap = source->pixmap(system, &offset);
- QImage result = pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
+ QPixmap pixmap = qt_toRasterPixmap(source->pixmap(Qt::DeviceCoordinates, &offset));
// Blur.
- QPainter blurPainter(&pixmap);
+ QImage overlay(pixmap.size(), QImage::Format_ARGB32_Premultiplied);
+ overlay.fill(0);
+
+ QPainter blurPainter(&overlay);
d->blurFilter.draw(&blurPainter, QPointF(), pixmap);
blurPainter.end();
// Brighten.
- QImage overlay = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
const int numBits = overlay.width() * overlay.height();
QRgb *bits = reinterpret_cast<QRgb *>(overlay.bits());
for (int i = 0; i < numBits; ++i) {
- const QRgb bit = bits[i];
- bits[i] = qRgba(d->colorTable[qRed(bit)], d->colorTable[qGreen(bit)],
- d->colorTable[qBlue(bit)], qAlpha(bit));
+ const QRgb pixel = INV_PREMUL(bits[i]);
+ bits[i] = PREMUL(qRgba(d->colorTable[qRed(pixel)], d->colorTable[qGreen(pixel)],
+ d->colorTable[qBlue(pixel)], qAlpha(pixel)));
}
// Composite.
- QPainter compPainter(&result);
+ QPainter compPainter(&pixmap);
compPainter.setCompositionMode(QPainter::CompositionMode_Overlay);
compPainter.setOpacity(d->strength);
compPainter.drawImage(0, 0, overlay);
compPainter.end();
- if (system == Qt::DeviceCoordinates) {
- QTransform restoreTransform = painter->worldTransform();
- painter->setWorldTransform(QTransform());
- painter->drawImage(offset, result);
- painter->setWorldTransform(restoreTransform);
- } else {
- painter->drawImage(offset, result);
- }
+ QTransform restoreTransform = painter->worldTransform();
+ painter->setWorldTransform(QTransform());
+ painter->drawPixmap(offset, pixmap);
+ painter->setWorldTransform(restoreTransform);
}
QT_END_NAMESPACE
diff --git a/src/gui/effects/qgraphicseffect.h b/src/gui/effects/qgraphicseffect.h
index c5d3ede..c89851e 100644
--- a/src/gui/effects/qgraphicseffect.h
+++ b/src/gui/effects/qgraphicseffect.h
@@ -87,6 +87,7 @@ private:
friend class QGraphicsEffectPrivate;
friend class QGraphicsScenePrivate;
friend class QGraphicsItem;
+ friend class QGraphicsItemPrivate;
friend class QWidget;
friend class QWidgetPrivate;
};
diff --git a/src/gui/effects/qgraphicseffect_p.h b/src/gui/effects/qgraphicseffect_p.h
index ff2fb85..8fb55d8 100644
--- a/src/gui/effects/qgraphicseffect_p.h
+++ b/src/gui/effects/qgraphicseffect_p.h
@@ -55,6 +55,8 @@
#include "qgraphicseffect.h"
+#include <QPixmapCache>
+
#include <private/qobject_p.h>
#include <private/qpixmapfilter_p.h>
@@ -65,7 +67,7 @@ class QGraphicsEffectSourcePrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QGraphicsEffectSource)
public:
QGraphicsEffectSourcePrivate() : QObjectPrivate() {}
- virtual ~QGraphicsEffectSourcePrivate() {}
+ virtual ~QGraphicsEffectSourcePrivate() { invalidateCache(); }
virtual void detach() = 0;
virtual QRectF boundingRect(Qt::CoordinateSystem system) const = 0;
virtual QRect deviceRect() const = 0;
@@ -77,9 +79,16 @@ public:
virtual bool isPixmap() const = 0;
virtual QPixmap pixmap(Qt::CoordinateSystem system, QPoint *offset = 0) const = 0;
virtual void effectBoundingRectChanged() = 0;
+ void invalidateCache() const { QPixmapCache::remove(m_cacheKey); }
+
friend class QGraphicsScenePrivate;
friend class QGraphicsItem;
friend class QGraphicsItemPrivate;
+
+private:
+ mutable Qt::CoordinateSystem m_cachedSystem;
+ mutable QPoint m_cachedOffset;
+ mutable QPixmapCache::Key m_cacheKey;
};
class Q_GUI_EXPORT QGraphicsEffectPrivate : public QObjectPrivate
@@ -94,6 +103,7 @@ public:
if (source) {
flags |= QGraphicsEffect::SourceDetached;
source->d_func()->detach();
+ source->d_func()->invalidateCache();
delete source;
}
source = newSource;
diff --git a/src/gui/egl/qegl.cpp b/src/gui/egl/qegl.cpp
index 840b9d6..39291d3 100644
--- a/src/gui/egl/qegl.cpp
+++ b/src/gui/egl/qegl.cpp
@@ -61,6 +61,7 @@ QEglContext::QEglContext()
, cfg(0)
, currentSurface(EGL_NO_SURFACE)
, current(false)
+ , ownsContext(true)
{
}
@@ -206,7 +207,7 @@ void QEglContext::destroySurface(EGLSurface surface)
// Destroy the context. Note: this does not destroy the surface.
void QEglContext::destroy()
{
- if (ctx != EGL_NO_CONTEXT)
+ if (ctx != EGL_NO_CONTEXT && ownsContext)
eglDestroyContext(dpy, ctx);
dpy = EGL_NO_DISPLAY;
ctx = EGL_NO_CONTEXT;
diff --git a/src/gui/egl/qegl_p.h b/src/gui/egl/qegl_p.h
index dc399da..16b5b16 100644
--- a/src/gui/egl/qegl_p.h
+++ b/src/gui/egl/qegl_p.h
@@ -110,7 +110,7 @@ public:
EGLDisplay display() const { return dpy; }
EGLContext context() const { return ctx; }
- void setContext(EGLContext context) { ctx = context; }
+ void setContext(EGLContext context) { ctx = context; ownsContext = false;}
EGLConfig config() const { return cfg; }
void setConfig(EGLConfig config) { cfg = config; }
@@ -131,6 +131,7 @@ private:
EGLConfig cfg;
EGLSurface currentSurface;
bool current;
+ bool ownsContext;
static EGLDisplay getDisplay(QPaintDevice *device);
diff --git a/src/gui/egl/qegl_qws.cpp b/src/gui/egl/qegl_qws.cpp
index 590b666..df1179a 100644
--- a/src/gui/egl/qegl_qws.cpp
+++ b/src/gui/egl/qegl_qws.cpp
@@ -83,7 +83,8 @@ static QScreen *screenForDevice(QPaintDevice *device)
screenNumber = 0;
screen = screen->subScreens()[screenNumber];
}
- while (screen->classId() == QScreen::ProxyClass) {
+ while (screen->classId() == QScreen::ProxyClass ||
+ screen->classId() == QScreen::TransformedClass) {
screen = static_cast<QProxyScreen *>(screen)->screen();
}
return screen;
diff --git a/src/gui/embedded/directfb.pri b/src/gui/embedded/directfb.pri
index fa4dd68..84253b5 100644
--- a/src/gui/embedded/directfb.pri
+++ b/src/gui/embedded/directfb.pri
@@ -1,7 +1,7 @@
# These defines might be necessary if your DirectFB driver doesn't
# support all of the DirectFB API.
#
-#DEFINES += QT_NO_DIRECTFB_SUBSURFACE
+#DEFINES += QT_DIRECTFB_SUBSURFACE
#DEFINES += QT_DIRECTFB_WINDOW_AS_CURSOR
#DEFINES += QT_NO_DIRECTFB_IMAGEPROVIDER
#DEFINES += QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout.cpp b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
index ffbb67c..e21cd99 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
@@ -48,36 +48,60 @@
\ingroup geomanagement
\ingroup graphicsview-api
- The anchor layout is a layout where one can specify how widgets should be placed relative to
- each other. The specification is called an anchor, and it is set up by calling anchor().
+ The anchor layout allows developers to specify how widgets should be placed relative to
+ each other, and to the layout itself. The specification is made by adding anchors to the
+ layout by calling addAnchor(), addAnchors() or addCornerAnchors().
+
+ Existing anchors in the layout can be accessed with the anchor() function.
+ Items that are anchored are automatically added to the layout, and if items
+ are removed, all their anchors will be automatically removed.
+
+ \beginfloatleft
+ \inlineimage simpleanchorlayout-example.png Using an anchor layout to align simple colored widgets.
+ \endfloat
+
Anchors are always set up between edges of an item, where the "center" is also considered to
- be an edge. Considering this example:
- \code
- QGraphicsAnchorLayout *l = new QGraphicsAnchorLayout;
- QGraphicsWidget *a = new QGraphicsWidget;
- QGraphicsWidget *b = new QGraphicsWidget;
- l->anchor(a, Qt::AnchorRight, b, Qt::AnchorLeft);
- \endcode
-
- Here is the right edge of item A anchored to the left edge of item B, with the result that
- item B will be placed to the right of item A, with a spacing between A and B. If the
- spacing is negative, the items will overlap to some extent. Items that are anchored are
- automatically added to the layout, and if items are removed, all their anchors will be
- automatically removed
-
- \section1 Size Hints and Size Policies in QGraphicsAnchorLayout
+ be an edge. Consider the following example:
+
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding anchors
+
+ Here, the right edge of item \c a is anchored to the left edge of item \c b and the bottom
+ edge of item \c a is anchored to the top edge of item \c b, with the result that
+ item \c b will be placed diagonally to the right and below item \c b.
+
+ The addCornerAnchors() function provides a simpler way of anchoring the corners
+ of two widgets than the two individual calls to addAnchor() shown in the code
+ above. Here, we see how a widget can be anchored to the top-left corner of the enclosing
+ layout:
+
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding a corner anchor
+
+ In cases where anchors are used to match the widths or heights of widgets, it is
+ convenient to use the addAnchors() function. As with the other functions for specifying
+ anchors, it can also be used to anchor a widget to a layout.
+
+ \clearfloat
+ \section1 Size Hints and Size Policies in an Anchor Layout
QGraphicsAnchorLayout respects each item's size hints and size policies. However it does
- not respect stretch factors currently. This might change in the future, so please refrain
- from using stretch factors in anchor layout to avoid any future regressions.
+ not currently respect their stretch factors. This might change in the future, so avoid
+ using stretch factors in anchor layouts if you want to avoid any future regressions in
+ behavior.
+
+ \section1 Spacing within an Anchor Layout
- \section1 Spacing within QGraphicsAnchorLayout
+ The layout may distribute some space between the items. If the spacing has not been
+ explicitly specified, the actual amount of space will usually be 0.
- Between the items, the layout can distribute some space. If the spacing has not been
- explicitly specified, the actual amount of space will usually be 0, but if the first edge
- is the "opposite" of the second edge (i.e. Right is anchored to Left or vice-versa), the
- size of the anchor will be queried from the style through the pixelMetric
- PM_LayoutHorizontalSpacing (or PM_LayoutVerticalSpacing for vertical anchors).
+ However, if the first edge is the \e opposite of the second edge (e.g., the right edge
+ of the first widget is anchored to the left edge of the second widget), the size of the
+ anchor will be queried from the style through a pixel metric:
+ \l{QStyle::}{PM_LayoutHorizontalSpacing} for horizontal anchors and
+ \l{QStyle::}{PM_LayoutVerticalSpacing} for vertical anchors.
+
+ If the spacing is negative, the items will overlap to some extent.
+
+ \sa QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayout
*/
/*!
@@ -118,13 +142,40 @@ QGraphicsAnchor::~QGraphicsAnchor()
}
/*!
+ \property QGraphicsAnchor::sizePolicy
+ \brief the size policy for the QGraphicsAnchor.
+
+ By setting the size policy on an anchor you can configure how the item can resize itself
+ from its preferred spacing. For instance, if the anchor has the size policy
+ QSizePolicy::Minimum, the spacing is the minimum size of the anchor. However, its size
+ can grow up to the anchors maximum size. If the default size policy is QSizePolicy::Fixed,
+ the anchor can neither grow or shrink, which means that the only size the anchor can have
+ is the spacing. QSizePolicy::Fixed is the default size policy.
+ QGraphicsAnchor always has a minimum spacing of 0 and a very large maximum spacing.
+
+ \sa QGraphicsAnchor::spacing
+*/
+
+void QGraphicsAnchor::setSizePolicy(QSizePolicy::Policy policy)
+{
+ Q_D(QGraphicsAnchor);
+ d->setSizePolicy(policy);
+}
+
+QSizePolicy::Policy QGraphicsAnchor::sizePolicy() const
+{
+ Q_D(const QGraphicsAnchor);
+ return d->sizePolicy;
+}
+
+/*!
\property QGraphicsAnchor::spacing
- \brief the space between items in the QGraphicsAnchorLayout.
+ \brief the preferred space between items in the QGraphicsAnchorLayout.
Depending on the anchor type, the default spacing is either
0 or a value returned from the style.
- \sa QGraphicsAnchorLayout::anchor()
+ \sa QGraphicsAnchorLayout::addAnchor()
*/
void QGraphicsAnchor::setSpacing(qreal spacing)
{
@@ -188,7 +239,7 @@ QGraphicsAnchorLayout::~QGraphicsAnchorLayout()
If there is already an anchor between the edges, the the new anchor will replace the old one.
\a firstItem and \a secondItem are automatically added to the layout if they are not part
- of the layout. This means that count() can increase with up to 2.
+ of the layout. This means that count() can increase by up to 2.
The spacing an anchor will get depends on the type of anchor. For instance, anchors from the
Right edge of one item to the Left edge of another (or vice versa) will use the default
@@ -198,7 +249,10 @@ QGraphicsAnchorLayout::~QGraphicsAnchorLayout()
The spacing can also be set manually by using QGraphicsAnchor::setSpacing() method.
- \sa addCornerAnchors(), addAnchors()
+ Calling this function where \a firstItem or \a secondItem are ancestors of the layout have
+ undefined behaviour.
+
+ \sa addAnchors(), addCornerAnchors()
*/
QGraphicsAnchor *
QGraphicsAnchorLayout::addAnchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge,
@@ -223,29 +277,26 @@ QGraphicsAnchorLayout::anchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint fi
}
/*!
- Creates two anchors between \a firstItem and \a secondItem, where one is for the horizontal
- edge and another one for the vertical edge that the corners \a firstCorner and \a
- secondCorner specifies.
- The magnitude of the anchors is picked up from the style.
+ Creates two anchors between \a firstItem and \a secondItem specified by the corners,
+ \a firstCorner and \a secondCorner, where one is for the horizontal edge and another
+ one for the vertical edge.
- This is a convenience function, since anchoring corners can be expressed as anchoring two edges.
- For instance,
- \code
- layout->addAnchor(layout, Qt::AnchorTop, b, Qt::AnchorTop);
- layout->addAnchor(layout, Qt::AnchorLeft, b, Qt::AnchorLeft);
- \endcode
+ This is a convenience function, since anchoring corners can be expressed as anchoring
+ two edges. For instance:
- has the same effect as
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding a corner anchor in two steps
- \code
- layout->addCornerAnchors(layout, Qt::TopLeft, b, Qt::TopLeft);
- \endcode
+ This can also be achieved with the following line of code:
+
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding a corner anchor
If there is already an anchor between the edge pairs, it will be replaced by the anchors that
this function specifies.
\a firstItem and \a secondItem are automatically added to the layout if they are not part of the
- layout. This means that count() can increase with up to 2.
+ layout. This means that count() can increase by up to 2.
+
+ \sa addAnchor(), addAnchors()
*/
void QGraphicsAnchorLayout::addCornerAnchors(QGraphicsLayoutItem *firstItem,
Qt::Corner firstCorner,
@@ -272,17 +323,16 @@ void QGraphicsAnchorLayout::addCornerAnchors(QGraphicsLayoutItem *firstItem,
edges of \a secondItem, so that \a firstItem has the same size as
\a secondItem in the dimensions specified by \a orientations.
- Calling this convenience function with the following arguments
- \code
- l->addAnchors(firstItem, secondItem, Qt::Horizontal)
- \endcode
+ For example, the following example anchors the left and right edges of two items
+ to match their widths:
+
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding anchors to match sizes in two steps
- is the same as
+ This can also be achieved using the following line of code:
- \code
- l->addAnchor(firstItem, Qt::AnchorLeft, secondItem, Qt::AnchorLeft);
- l->addAnchor(firstItem, Qt::AnchorRight, secondItem, Qt::AnchorRight);
- \endcode
+ \snippet examples/graphicsview/simpleanchorlayout/main.cpp adding anchors to match sizes
+
+ \sa addAnchor(), addCornerAnchors()
*/
void QGraphicsAnchorLayout::addAnchors(QGraphicsLayoutItem *firstItem,
QGraphicsLayoutItem *secondItem,
@@ -306,6 +356,13 @@ void QGraphicsAnchorLayout::addAnchors(QGraphicsLayoutItem *firstItem,
void QGraphicsAnchorLayout::setHorizontalSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
+
+ // ### We don't support negative spacing yet
+ if (spacing < 0) {
+ spacing = 0;
+ qWarning() << "QGraphicsAnchorLayout does not support negative spacing.";
+ }
+
d->spacings[0] = spacing;
invalidate();
}
@@ -318,6 +375,13 @@ void QGraphicsAnchorLayout::setHorizontalSpacing(qreal spacing)
void QGraphicsAnchorLayout::setVerticalSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
+
+ // ### We don't support negative spacing yet
+ if (spacing < 0) {
+ spacing = 0;
+ qWarning() << "QGraphicsAnchorLayout does not support negative spacing.";
+ }
+
d->spacings[1] = spacing;
invalidate();
}
@@ -327,11 +391,23 @@ void QGraphicsAnchorLayout::setVerticalSpacing(qreal spacing)
If an item is anchored with no spacing associated with the anchor, it will use the default
spacing.
+
+ Currently QGraphicsAnchorLayout does not support negative default spacings.
+
\sa setHorizontalSpacing(), setVerticalSpacing()
*/
void QGraphicsAnchorLayout::setSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
+
+ // ### Currently we do not support negative anchors inside the graph.
+ // To avoid those being created by a negative spacing, we must
+ // make this test.
+ if (spacing < 0) {
+ spacing = 0;
+ qWarning() << "QGraphicsAnchorLayout does not support negative spacing.";
+ }
+
d->spacings[0] = d->spacings[1] = spacing;
invalidate();
}
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout.h b/src/gui/graphicsview/qgraphicsanchorlayout.h
index 99dbf92..01c3a86 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout.h
+++ b/src/gui/graphicsview/qgraphicsanchorlayout.h
@@ -62,10 +62,13 @@ class Q_GUI_EXPORT QGraphicsAnchor : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing RESET unsetSpacing)
+ Q_PROPERTY(QSizePolicy::Policy sizePolicy READ sizePolicy WRITE setSizePolicy)
public:
void setSpacing(qreal spacing);
void unsetSpacing();
qreal spacing() const;
+ void setSizePolicy(QSizePolicy::Policy policy);
+ QSizePolicy::Policy sizePolicy() const;
~QGraphicsAnchor();
private:
QGraphicsAnchor(QGraphicsAnchorLayout *parent);
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
index f9b5c8c..8c8c303 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -53,7 +53,8 @@ QT_BEGIN_NAMESPACE
QGraphicsAnchorPrivate::QGraphicsAnchorPrivate(int version)
- : QObjectPrivate(version), layoutPrivate(0), data(0)
+ : QObjectPrivate(version), layoutPrivate(0), data(0),
+ sizePolicy(QSizePolicy::Fixed)
{
}
@@ -62,6 +63,14 @@ QGraphicsAnchorPrivate::~QGraphicsAnchorPrivate()
layoutPrivate->removeAnchor(data->from, data->to);
}
+void QGraphicsAnchorPrivate::setSizePolicy(QSizePolicy::Policy policy)
+{
+ if (sizePolicy != policy) {
+ sizePolicy = policy;
+ layoutPrivate->q_func()->invalidate();
+ }
+}
+
void QGraphicsAnchorPrivate::setSpacing(qreal value)
{
if (data) {
@@ -92,28 +101,11 @@ qreal QGraphicsAnchorPrivate::spacing() const
}
-static void sizeHintsFromItem(QGraphicsLayoutItem *item,
- const QGraphicsAnchorLayoutPrivate::Orientation orient,
- qreal *minSize, qreal *prefSize,
- qreal *expSize, qreal *maxSize)
+static void internalSizeHints(QSizePolicy::Policy policy,
+ qreal minSizeHint, qreal prefSizeHint, qreal maxSizeHint,
+ qreal *minSize, qreal *prefSize,
+ qreal *expSize, qreal *maxSize)
{
- QSizePolicy::Policy policy;
- qreal minSizeHint;
- qreal prefSizeHint;
- qreal maxSizeHint;
-
- if (orient == QGraphicsAnchorLayoutPrivate::Horizontal) {
- policy = item->sizePolicy().horizontalPolicy();
- minSizeHint = item->effectiveSizeHint(Qt::MinimumSize).width();
- prefSizeHint = item->effectiveSizeHint(Qt::PreferredSize).width();
- maxSizeHint = item->effectiveSizeHint(Qt::MaximumSize).width();
- } else {
- policy = item->sizePolicy().verticalPolicy();
- minSizeHint = item->effectiveSizeHint(Qt::MinimumSize).height();
- prefSizeHint = item->effectiveSizeHint(Qt::PreferredSize).height();
- maxSizeHint = item->effectiveSizeHint(Qt::MaximumSize).height();
- }
-
// minSize, prefSize and maxSize are initialized
// with item's preferred Size: this is QSizePolicy::Fixed.
//
@@ -139,7 +131,7 @@ static void sizeHintsFromItem(QGraphicsLayoutItem *item,
// Note that these two initializations are affected by the previous flags
if (policy & QSizePolicy::IgnoreFlag)
- *prefSize = *maxSize;
+ *prefSize = *minSize;
else
*prefSize = prefSizeHint;
@@ -153,38 +145,63 @@ void AnchorData::refreshSizeHints(qreal effectiveSpacing)
{
const bool isInternalAnchor = from->m_item == to->m_item;
+ QSizePolicy::Policy policy;
+ qreal minSizeHint;
+ qreal prefSizeHint;
+ qreal maxSizeHint;
+
if (isInternalAnchor) {
const QGraphicsAnchorLayoutPrivate::Orientation orient =
QGraphicsAnchorLayoutPrivate::edgeOrientation(from->m_edge);
+ const Qt::AnchorPoint centerEdge =
+ QGraphicsAnchorLayoutPrivate::pickEdge(Qt::AnchorHorizontalCenter, orient);
+ bool hasCenter = (from->m_edge == centerEdge || to->m_edge == centerEdge);
if (isLayoutAnchor) {
minSize = 0;
prefSize = 0;
expSize = 0;
maxSize = QWIDGETSIZE_MAX;
+ if (hasCenter)
+ maxSize /= 2;
+ return;
} else {
- QGraphicsLayoutItem *item = from->m_item;
- sizeHintsFromItem(item, orient, &minSize, &prefSize, &expSize, &maxSize);
- }
- const Qt::AnchorPoint centerEdge =
- QGraphicsAnchorLayoutPrivate::pickEdge(Qt::AnchorHorizontalCenter, orient);
- bool hasCenter = (from->m_edge == centerEdge || to->m_edge == centerEdge);
+ QGraphicsLayoutItem *item = from->m_item;
+ if (orient == QGraphicsAnchorLayoutPrivate::Horizontal) {
+ policy = item->sizePolicy().horizontalPolicy();
+ minSizeHint = item->effectiveSizeHint(Qt::MinimumSize).width();
+ prefSizeHint = item->effectiveSizeHint(Qt::PreferredSize).width();
+ maxSizeHint = item->effectiveSizeHint(Qt::MaximumSize).width();
+ } else {
+ policy = item->sizePolicy().verticalPolicy();
+ minSizeHint = item->effectiveSizeHint(Qt::MinimumSize).height();
+ prefSizeHint = item->effectiveSizeHint(Qt::PreferredSize).height();
+ maxSizeHint = item->effectiveSizeHint(Qt::MaximumSize).height();
+ }
- if (hasCenter) {
- minSize /= 2;
- prefSize /= 2;
- expSize /= 2;
- maxSize /= 2;
+ if (hasCenter) {
+ minSizeHint /= 2;
+ prefSizeHint /= 2;
+ maxSizeHint /= 2;
+ }
}
-
- } else if (!hasSize) {
- // Anchor has no size defined, use given default information
- minSize = effectiveSpacing;
- prefSize = effectiveSpacing;
- expSize = effectiveSpacing;
- maxSize = effectiveSpacing;
+ } else {
+ Q_ASSERT(graphicsAnchor);
+ policy = graphicsAnchor->sizePolicy();
+ minSizeHint = 0;
+ if (hasSize) {
+ // One can only configure the preferred size of a normal anchor. Their minimum and
+ // maximum "size hints" are always 0 and QWIDGETSIZE_MAX, correspondingly. However,
+ // their effective size hints might be narrowed down due to their size policies.
+ prefSizeHint = prefSize;
+ } else {
+ prefSizeHint = effectiveSpacing;
+ }
+ maxSizeHint = QWIDGETSIZE_MAX;
}
+ internalSizeHints(policy, minSizeHint, prefSizeHint, maxSizeHint,
+ &minSize, &prefSize, &expSize, &maxSize);
// Set the anchor effective sizes to preferred.
//
@@ -250,44 +267,61 @@ void ParallelAnchorData::refreshSizeHints_helper(qreal effectiveSpacing,
0 is at Preferred
1 is at Maximum
*/
-static qreal getFactor(qreal value, qreal min, qreal pref, qreal max)
-{
- // ### Maybe remove some of the assertions? (since outside is asserting us)
- Q_ASSERT(value > min || qFuzzyCompare(value, min));
- Q_ASSERT(value < max || qFuzzyCompare(value, max));
-
- if (qFuzzyCompare(value, min)) {
- return -1.0;
- } else if (qFuzzyCompare(value, pref)) {
- return 0.0;
- } else if (qFuzzyCompare(value, max)) {
- return 1.0;
- } else if (value < pref) {
- // Since value < pref and value != pref and min <= value,
- // we can assert that min < pref.
- Q_ASSERT(min < pref);
- return (value - min) / (pref - min) - 1;
+static QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> getFactor(qreal value, qreal min,
+ qreal pref, qreal exp,
+ qreal max)
+{
+ QGraphicsAnchorLayoutPrivate::Interval interval;
+ qreal lower;
+ qreal upper;
+
+ if (value < pref) {
+ interval = QGraphicsAnchorLayoutPrivate::MinToPreferred;
+ lower = min;
+ upper = pref;
+ } else if (value < exp) {
+ interval = QGraphicsAnchorLayoutPrivate::PreferredToExpanding;
+ lower = pref;
+ upper = exp;
} else {
- // Since value > pref and value != pref and max >= value,
- // we can assert that max > pref.
- Q_ASSERT(max > pref);
- return (value - pref) / (max - pref);
+ interval = QGraphicsAnchorLayoutPrivate::ExpandingToMax;
+ lower = exp;
+ upper = max;
}
+
+ qreal progress;
+ if (upper == lower) {
+ progress = 0;
+ } else {
+ progress = (value - lower) / (upper - lower);
+ }
+
+ return qMakePair(interval, progress);
}
-static qreal getExpandingFactor(const qreal &expSize, const qreal &sizeAtPreferred,
- const qreal &sizeAtExpanding, const qreal &sizeAtMaximum)
+static qreal interpolate(const QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> &factor,
+ qreal min, qreal pref,
+ qreal exp, qreal max)
{
- const qreal lower = qMin(sizeAtPreferred, sizeAtMaximum);
- const qreal upper = qMax(sizeAtPreferred, sizeAtMaximum);
- const qreal boundedExpSize = qBound(lower, expSize, upper);
+ qreal lower;
+ qreal upper;
- const qreal bandSize = sizeAtMaximum - boundedExpSize;
- if (bandSize == 0) {
- return 0;
- } else {
- return (sizeAtExpanding - boundedExpSize) / bandSize;
+ switch (factor.first) {
+ case QGraphicsAnchorLayoutPrivate::MinToPreferred:
+ lower = min;
+ upper = pref;
+ break;
+ case QGraphicsAnchorLayoutPrivate::PreferredToExpanding:
+ lower = pref;
+ upper = exp;
+ break;
+ case QGraphicsAnchorLayoutPrivate::ExpandingToMax:
+ lower = exp;
+ upper = max;
+ break;
}
+
+ return lower + factor.second * (upper - lower);
}
void SequentialAnchorData::updateChildrenSizes()
@@ -307,27 +341,22 @@ void SequentialAnchorData::updateChildrenSizes()
// Band here refers if the value is in the Minimum To Preferred
// band (the lower band) or the Preferred To Maximum (the upper band).
- const qreal minFactor = getFactor(sizeAtMinimum, minSize, prefSize, maxSize);
- const qreal prefFactor = getFactor(sizeAtPreferred, minSize, prefSize, maxSize);
- const qreal maxFactor = getFactor(sizeAtMaximum, minSize, prefSize, maxSize);
- const qreal expFactor = getExpandingFactor(expSize, sizeAtPreferred, sizeAtExpanding, sizeAtMaximum);
+ const QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> minFactor =
+ getFactor(sizeAtMinimum, minSize, prefSize, expSize, maxSize);
+ const QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> prefFactor =
+ getFactor(sizeAtPreferred, minSize, prefSize, expSize, maxSize);
+ const QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> expFactor =
+ getFactor(sizeAtExpanding, minSize, prefSize, expSize, maxSize);
+ const QPair<QGraphicsAnchorLayoutPrivate::Interval, qreal> maxFactor =
+ getFactor(sizeAtMaximum, minSize, prefSize, expSize, maxSize);
for (int i = 0; i < m_edges.count(); ++i) {
AnchorData *e = m_edges.at(i);
- qreal bandSize = minFactor > 0 ? e->maxSize - e->prefSize : e->prefSize - e->minSize;
- e->sizeAtMinimum = e->prefSize + bandSize * minFactor;
-
- bandSize = prefFactor > 0 ? e->maxSize - e->prefSize : e->prefSize - e->minSize;
- e->sizeAtPreferred = e->prefSize + bandSize * prefFactor;
-
- bandSize = maxFactor > 0 ? e->maxSize - e->prefSize : e->prefSize - e->minSize;
- e->sizeAtMaximum = e->prefSize + bandSize * maxFactor;
-
- const qreal lower = qMin(e->sizeAtPreferred, e->sizeAtMaximum);
- const qreal upper = qMax(e->sizeAtPreferred, e->sizeAtMaximum);
- const qreal edgeBoundedExpSize = qBound(lower, e->expSize, upper);
- e->sizeAtExpanding = edgeBoundedExpSize + expFactor * (e->sizeAtMaximum - edgeBoundedExpSize);
+ e->sizeAtMinimum = interpolate(minFactor, e->minSize, e->prefSize, e->expSize, e->maxSize);
+ e->sizeAtPreferred = interpolate(prefFactor, e->minSize, e->prefSize, e->expSize, e->maxSize);
+ e->sizeAtExpanding = interpolate(expFactor, e->minSize, e->prefSize, e->expSize, e->maxSize);
+ e->sizeAtMaximum = interpolate(maxFactor, e->minSize, e->prefSize, e->expSize, e->maxSize);
e->updateChildrenSizes();
}
@@ -494,36 +523,46 @@ static bool simplifySequentialChunk(Graph<AnchorVertex, AnchorData> *graph,
const QVector<AnchorVertex*> &vertices,
AnchorVertex *after)
{
- int i;
+ AnchorData *data = graph->edgeData(before, vertices.first());
+ Q_ASSERT(data);
+
+ const bool forward = (before == data->from);
+ QVector<AnchorVertex *> orderedVertices;
+
+ if (forward) {
+ orderedVertices = vertices;
+ } else {
+ qSwap(before, after);
+ for (int i = vertices.count() - 1; i >= 0; --i)
+ orderedVertices.append(vertices.at(i));
+ }
+
#if defined(QT_DEBUG) && 0
QString strVertices;
- for (i = 0; i < vertices.count(); ++i)
- strVertices += QString::fromAscii("%1 - ").arg(vertices.at(i)->toString());
+ for (int i = 0; i < orderedVertices.count(); ++i) {
+ strVertices += QString::fromAscii("%1 - ").arg(orderedVertices.at(i)->toString());
+ }
QString strPath = QString::fromAscii("%1 - %2%3").arg(before->toString(), strVertices, after->toString());
qDebug("simplifying [%s] to [%s - %s]", qPrintable(strPath), qPrintable(before->toString()), qPrintable(after->toString()));
#endif
SequentialAnchorData *sequence = new SequentialAnchorData;
AnchorVertex *prev = before;
- AnchorData *data;
- for (i = 0; i <= vertices.count(); ++i) {
- AnchorVertex *next = (i < vertices.count()) ? vertices.at(i) : after;
- data = graph->takeEdge(prev, next);
- sequence->m_edges.append(data);
+
+ for (int i = 0; i <= orderedVertices.count(); ++i) {
+ AnchorVertex *next = (i < orderedVertices.count()) ? orderedVertices.at(i) : after;
+ AnchorData *ad = graph->takeEdge(prev, next);
+ Q_ASSERT(ad);
+ sequence->m_edges.append(ad);
prev = next;
}
- sequence->setVertices(vertices);
+
+ sequence->setVertices(orderedVertices);
sequence->from = before;
sequence->to = after;
sequence->refreshSizeHints_helper(0, false);
- // data here is the last edge in the sequence
- // ### this seems to be here for supporting reverse order sequences,
- // but doesnt seem to be used right now
- if (data->from != vertices.last())
- qSwap(sequence->from, sequence->to);
-
// Note that since layout 'edges' can't be simplified away from
// the graph, it's safe to assume that if there's a layout
// 'edge', it'll be in the boundaries of the sequence.
@@ -578,15 +617,6 @@ static bool simplifySequentialChunk(Graph<AnchorVertex, AnchorData> *graph,
2. Go to (1)
3. Done
-
- * Gathering sequential anchors *
- The algorithm walks the graph in depth-first order, and only collects vertices that has two
- edges connected to it. If the vertex does not have two edges or if it is a layout edge,
- it will take all the previously collected vertices and try to create a simplified sequential
- anchor representing all the previously collected vertices.
- Once the simplified anchor is inserted, the collected list is cleared in order to find the next
- sequence to simplify.
- Note that there are some catches to this that are not covered by the above explanation.
*/
void QGraphicsAnchorLayoutPrivate::simplifyGraph(Orientation orientation)
{
@@ -603,9 +633,7 @@ void QGraphicsAnchorLayoutPrivate::simplifyGraph(Orientation orientation)
orientation == Horizontal ? "Horizontal" : "Vertical");
#endif
- AnchorVertex *rootVertex = graph[orientation].rootVertex();
-
- if (!rootVertex)
+ if (!graph[orientation].rootVertex())
return;
bool dirty;
@@ -614,164 +642,171 @@ void QGraphicsAnchorLayoutPrivate::simplifyGraph(Orientation orientation)
} while (dirty);
}
+/*!
+ \internal
+
+ One iteration of the simplification algorithm. Returns true if another iteration is needed.
+
+ The algorithm walks the graph in depth-first order, and only collects vertices that has two
+ edges connected to it. If the vertex does not have two edges or if it is a layout edge, it
+ will take all the previously collected vertices and try to create a simplified sequential
+ anchor representing all the previously collected vertices. Once the simplified anchor is
+ inserted, the collected list is cleared in order to find the next sequence to simplify.
+
+ Note that there are some catches to this that are not covered by the above explanation, see
+ the function comments for more details.
+*/
bool QGraphicsAnchorLayoutPrivate::simplifyGraphIteration(QGraphicsAnchorLayoutPrivate::Orientation orientation)
{
Q_Q(QGraphicsAnchorLayout);
Graph<AnchorVertex, AnchorData> &g = graph[orientation];
- AnchorVertex *v = g.rootVertex();
QSet<AnchorVertex *> visited;
- QStack<AnchorVertex *> stack;
- stack.push(v);
+ QStack<QPair<AnchorVertex *, AnchorVertex *> > stack;
+ stack.push(qMakePair(static_cast<AnchorVertex *>(0), g.rootVertex()));
QVector<AnchorVertex*> candidates;
+ bool candidatesForward;
const Qt::AnchorPoint centerEdge = pickEdge(Qt::AnchorHorizontalCenter, orientation);
- const Qt::AnchorPoint layoutEdge = oppositeEdge(v->m_edge);
- bool dirty = false;
-
- // walk depth-first.
+ // Walk depth-first, in the stack we store start of the candidate sequence (beforeSequence)
+ // and the vertex to be visited.
while (!stack.isEmpty()) {
- v = stack.pop();
- QList<AnchorVertex *> vertices = g.adjacentVertices(v);
- const int count = vertices.count();
- bool endOfSequence = (v->m_item == q && v->m_edge == layoutEdge) || count != 2;
- if (count == 2 && v->m_item != q) {
- candidates.append(v);
- if (visited.contains(vertices.first()) && visited.contains(vertices.last())) {
- // in case of a cycle
- endOfSequence = true;
+ QPair<AnchorVertex *, AnchorVertex *> pair = stack.pop();
+ AnchorVertex *beforeSequence = pair.first;
+ AnchorVertex *v = pair.second;
+
+ // The basic idea is to determine whether we found an end of sequence,
+ // if that's the case, we stop adding vertices to the candidate list
+ // and do a simplification step.
+ //
+ // A vertex can trigger an end of sequence if
+ // (a) it is a layout vertex, we don't simplify away the layout vertices;
+ // (b) it does not have exactly 2 adjacents;
+ // (c) it will change the direction of the sequence;
+ // (d) its next adjacent is already visited (a cycle in the graph).
+
+ const QList<AnchorVertex *> &adjacents = g.adjacentVertices(v);
+ const bool isLayoutVertex = v->m_item == q;
+ AnchorVertex *afterSequence = v;
+ bool endOfSequence = false;
+
+ //
+ // Identify the end cases.
+ //
+
+ // Identifies cases (a) and (b)
+ endOfSequence = isLayoutVertex || adjacents.count() != 2;
+
+ if (!endOfSequence) {
+ // If this is the first vertice, determine what is the direction to use for this
+ // sequence.
+ if (candidates.isEmpty()) {
+ const AnchorData *data = g.edgeData(beforeSequence, v);
+ Q_ASSERT(data);
+ candidatesForward = (beforeSequence == data->from);
}
- }
- if (endOfSequence && candidates.count() >= 1) {
- int i;
- AnchorVertex *afterSequence= 0;
- AnchorVertex *beforeSequence = 0;
- // find the items before and after the valid sequence
- if (candidates.count() == 1) {
- QList<AnchorVertex *> beforeAndAfterVertices = g.adjacentVertices(candidates.at(0));
- Q_ASSERT(beforeAndAfterVertices.count() == 2);
- // Since we only have one vertex, we can pick
- // any of the two vertices to become before/after.
- afterSequence = beforeAndAfterVertices.last();
- beforeSequence = beforeAndAfterVertices.first();
- } else {
- QList<AnchorVertex *> adjacentOfSecondLastVertex = g.adjacentVertices(candidates.last());
- Q_ASSERT(adjacentOfSecondLastVertex.count() == 2);
- if (adjacentOfSecondLastVertex.first() == candidates.at(candidates.count() - 2))
- afterSequence = adjacentOfSecondLastVertex.last();
- else
- afterSequence = adjacentOfSecondLastVertex.first();
- QList<AnchorVertex *> adjacentOfSecondVertex = g.adjacentVertices(candidates.first());
- Q_ASSERT(adjacentOfSecondVertex.count() == 2);
- if (adjacentOfSecondVertex.first() == candidates.at(1))
- beforeSequence = adjacentOfSecondVertex.last();
- else
- beforeSequence = adjacentOfSecondVertex.first();
+ // This is a tricky part. We peek at the next vertex to find out
+ //
+ // - whether the edge from this vertex to the next vertex has the same direction;
+ // - whether we already visited the next vertex.
+ //
+ // Those are needed to identify (c) and (d). Note that unlike (a) and (b), we preempt
+ // the end of sequence by looking into the next vertex.
+
+ // Peek at the next vertex
+ AnchorVertex *after;
+ if (candidates.isEmpty())
+ after = (beforeSequence == adjacents.last() ? adjacents.first() : adjacents.last());
+ else
+ after = (candidates.last() == adjacents.last() ? adjacents.first() : adjacents.last());
+
+ // ### At this point we assumed that candidates will not contain 'after', this may not hold
+ // when simplifying FLOATing anchors.
+ Q_ASSERT(!candidates.contains(after));
+
+ const AnchorData *data = g.edgeData(v, after);
+ Q_ASSERT(data);
+ const bool willChangeDirection = (candidatesForward != (v == data->from));
+ const bool cycleFound = visited.contains(after);
+
+ // Now cases (c) and (d)...
+ endOfSequence = willChangeDirection || cycleFound;
+
+ if (endOfSequence) {
+ if (!willChangeDirection) {
+ // If the direction will not change, we can add the current vertex to the
+ // candidates list and we know that 'after' can be used as afterSequence.
+ candidates.append(v);
+ afterSequence = after;
+ }
+ } else {
+ // If it's not an end of sequence, then the vertex didn't trigger neither of the
+ // previously four cases, so it can be added to the candidates list.
+ candidates.append(v);
}
- // The complete path of the sequence to simplify is: beforeSequence, <candidates>, afterSequence
- // where beforeSequence and afterSequence are the endpoints where the anchor is inserted
- // between.
-#if defined(QT_DEBUG) && 0
- // ### DEBUG
- QString strCandidates;
- for (i = 0; i < candidates.count(); ++i)
- strCandidates += QString::fromAscii("%1 - ").arg(candidates.at(i)->toString());
- QString strPath = QString::fromAscii("%1 - %2%3").arg(beforeSequence->toString(), strCandidates, afterSequence->toString());
- qDebug("candidate list for sequential simplification:\n[%s]", qPrintable(strPath));
-#endif
+ }
- bool forward = true;
- AnchorVertex *prev = beforeSequence;
- int intervalFrom = 0;
+ //
+ // Add next non-visited vertices to the stack.
+ //
+ for (int i = 0; i < adjacents.count(); ++i) {
+ AnchorVertex *next = adjacents.at(i);
+ if (visited.contains(next))
+ continue;
- // Check for directionality (from). We don't want to destroy that information,
- // thus we only combine anchors with the same direction.
+ // If current vertex is an end of sequence, and it'll reset the candidates list. So
+ // the next vertices will build candidates lists with the current vertex as 'before'
+ // vertex. If it's not an end of sequence, we keep the original 'before' vertex,
+ // since we are keeping the candidates list.
+ if (endOfSequence)
+ stack.push(qMakePair(v, next));
+ else
+ stack.push(qMakePair(beforeSequence, next));
+ }
- // "i" is the index *including* the beforeSequence and afterSequence vertices.
- for (i = 1; i <= candidates.count() + 1; ++i) {
- bool atVertexAfter = i > candidates.count();
- AnchorVertex *v1 = atVertexAfter ? afterSequence : candidates.at(i - 1);
- AnchorData *data = g.edgeData(prev, v1);
- Q_ASSERT(data);
- if (i == 1) {
- forward = (prev == data->from ? true : false);
- } else if (forward != (prev == data->from) || atVertexAfter) {
- int intervalTo = i;
- if (forward != (prev == data->from))
- --intervalTo;
-
- // intervalFrom and intervalTo should now be indices to the vertex before and
- // after the sequential anchor.
- if (intervalTo - intervalFrom >= 2) {
- // simplify in the range [intervalFrom, intervalTo]
-
- // Trim off internal center anchors (Left-Center/Center-Right) from the
- // start and the end of the sequence. We never want to simplify internal
- // center anchors where there is an external anchor connected to the center.
- AnchorVertex *intervalVertexFrom = intervalFrom == 0 ? beforeSequence : candidates.at(intervalFrom - 1);
- int effectiveIntervalFrom = intervalFrom;
- if (intervalVertexFrom->m_edge == centerEdge
- && intervalVertexFrom->m_item == candidates.at(effectiveIntervalFrom)->m_item) {
- ++effectiveIntervalFrom;
- intervalVertexFrom = candidates.at(effectiveIntervalFrom - 1);
- }
- AnchorVertex *intervalVertexTo = intervalTo <= candidates.count() ? candidates.at(intervalTo - 1) : afterSequence;
- int effectiveIntervalTo = intervalTo;
- if (intervalVertexTo->m_edge == centerEdge
- && intervalVertexTo->m_item == candidates.at(effectiveIntervalTo - 2)->m_item) {
- --effectiveIntervalTo;
- intervalVertexTo = candidates.at(effectiveIntervalTo - 1);
- }
- if (effectiveIntervalTo - effectiveIntervalFrom >= 2) {
- QVector<AnchorVertex*> subCandidates;
- if (forward) {
- subCandidates = candidates.mid(effectiveIntervalFrom, effectiveIntervalTo - effectiveIntervalFrom - 1);
- } else {
- // reverse the order of the candidates.
- qSwap(intervalVertexFrom, intervalVertexTo);
- do {
- ++effectiveIntervalFrom;
- subCandidates.prepend(candidates.at(effectiveIntervalFrom - 1));
- } while (effectiveIntervalFrom < effectiveIntervalTo - 1);
- }
- if (simplifySequentialChunk(&g, intervalVertexFrom, subCandidates, intervalVertexTo)) {
- dirty = true;
- break;
- }
- // finished simplification of chunk with same direction
- }
- }
- if (forward == (prev == data->from))
- --intervalTo;
- intervalFrom = intervalTo;
-
- forward = !forward;
- }
- prev = v1;
- }
+ visited.insert(v);
- if (dirty)
- break;
- }
+ if (!endOfSequence || candidates.isEmpty())
+ continue;
- if (endOfSequence)
- candidates.clear();
+ //
+ // Create a sequence for (beforeSequence, candidates, afterSequence).
+ //
- for (int i = 0; i < count; ++i) {
- AnchorVertex *next = vertices.at(i);
- if (next->m_item == q && next->m_edge == centerEdge)
+ // One restriction we have is to not simplify half of an anchor and let the other half
+ // unsimplified. So we remove center edges before and after the sequence.
+ if (beforeSequence->m_edge == centerEdge && beforeSequence->m_item == candidates.first()->m_item) {
+ beforeSequence = candidates.first();
+ candidates.remove(0);
+
+ // If there's not candidates to be simplified, leave.
+ if (candidates.isEmpty())
continue;
- if (visited.contains(next))
+ }
+
+ if (afterSequence->m_edge == centerEdge && afterSequence->m_item == candidates.last()->m_item) {
+ afterSequence = candidates.last();
+ candidates.remove(candidates.count() - 1);
+
+ if (candidates.isEmpty())
continue;
- stack.push(next);
}
- visited.insert(v);
+ // This function will remove the candidates from the graph and create one edge between
+ // beforeSequence and afterSequence. This function returns true if the sequential
+ // simplification also caused a parallel simplification to be created. In this case we end
+ // the iteration and start again (since all the visited state we have may be outdated).
+ if (simplifySequentialChunk(&g, beforeSequence, candidates, afterSequence))
+ return true;
+
+ // If there was no parallel simplification, we'll keep walking the graph. So we clear the
+ // candidates list to start again.
+ candidates.clear();
}
- return dirty;
+ return false;
}
static void restoreSimplifiedAnchor(Graph<AnchorVertex, AnchorData> &g,
@@ -1173,18 +1208,18 @@ QGraphicsAnchor *QGraphicsAnchorLayoutPrivate::addAnchor(QGraphicsLayoutItem *fi
|| secondItem == q
|| pickEdge(firstEdge, Horizontal) == Qt::AnchorHorizontalCenter
|| oppositeEdge(firstEdge) != secondEdge) {
- data->setFixedSize(0);
+ data->setPreferredSize(0);
} else {
data->unsetSize();
}
addAnchor_helper(firstItem, firstEdge, secondItem, secondEdge, data);
} else if (*spacing >= 0) {
- data->setFixedSize(*spacing);
+ data->setPreferredSize(*spacing);
addAnchor_helper(firstItem, firstEdge, secondItem, secondEdge, data);
} else {
- data->setFixedSize(-*spacing);
+ data->setPreferredSize(-*spacing);
addAnchor_helper(secondItem, secondEdge, firstItem, firstEdge, data);
}
@@ -1371,9 +1406,9 @@ void QGraphicsAnchorLayoutPrivate::setAnchorSize(AnchorData *data, const qreal *
// positive by definition.
// "negative spacing" is handled by inverting the standard item order.
if (*anchorSize >= 0) {
- data->setFixedSize(*anchorSize);
+ data->setPreferredSize(*anchorSize);
} else {
- data->setFixedSize(-*anchorSize);
+ data->setPreferredSize(-*anchorSize);
qSwap(data->from, data->to);
}
} else {
@@ -1550,6 +1585,13 @@ qreal QGraphicsAnchorLayoutPrivate::effectiveSpacing(Orientation orientation) co
}
}
}
+
+ // ### Currently we do not support negative anchors inside the graph.
+ // To avoid those being created by a negative style spacing, we must
+ // make this test.
+ if (s < 0)
+ s = 0;
+
return s;
}
@@ -1565,13 +1607,24 @@ void QGraphicsAnchorLayoutPrivate::calculateGraphs()
if (!calculateGraphCacheDirty)
return;
+#if defined(QT_DEBUG) && 0
+ static int count = 0;
+ count++;
+ dumpGraph(QString::fromAscii("%1-before").arg(count));
+#endif
+
calculateGraphs(Horizontal);
calculateGraphs(Vertical);
+#if defined(QT_DEBUG) && 0
+ dumpGraph(QString::fromAscii("%1-after").arg(count));
+#endif
+
calculateGraphCacheDirty = 0;
}
-// ### remove me:
+// ### Maybe getGraphParts could return the variables when traversing, at least
+// for trunk...
QList<AnchorData *> getVariables(QList<QSimplexConstraint *> constraints)
{
QSet<AnchorData *> variableSet;
@@ -1635,65 +1688,92 @@ void QGraphicsAnchorLayoutPrivate::calculateGraphs(
// 2) The floating or semi-floating anchors (items) that are those which
// are connected to only one (or none) of the layout sides, thus are not
// influenced by the layout size.
- QList<QList<QSimplexConstraint *> > parts;
- parts = getGraphParts(orientation);
+ QList<QList<QSimplexConstraint *> > parts = getGraphParts(orientation);
// Now run the simplex solver to calculate Minimum, Preferred and Maximum sizes
// of the "trunk" set of constraints and variables.
// ### does trunk always exist? empty = trunk is the layout left->center->right
QList<QSimplexConstraint *> trunkConstraints = parts[0];
- QList<QSimplexConstraint *> sizeHintConstraints;
- sizeHintConstraints = constraintsFromSizeHints(getVariables(trunkConstraints));
- trunkConstraints += sizeHintConstraints;
+ QList<AnchorData *> trunkVariables = getVariables(trunkConstraints);
// For minimum and maximum, use the path between the two layout sides as the
// objective function.
-
- // Retrieve that path
AnchorVertex *v = internalVertex(q, pickEdge(Qt::AnchorRight, orientation));
GraphPath trunkPath = graphPaths[orientation].value(v);
+ bool feasible = calculateTrunk(orientation, trunkPath, trunkConstraints, trunkVariables);
+
+ // For the other parts that not the trunk, solve only for the preferred size
+ // that is the size they will remain at, since they are not stretched by the
+ // layout.
+
+ // Skipping the first (trunk)
+ for (int i = 1; i < parts.count(); ++i) {
+ if (!feasible)
+ break;
+
+ QList<QSimplexConstraint *> partConstraints = parts[i];
+ QList<AnchorData *> partVariables = getVariables(partConstraints);
+ Q_ASSERT(!partVariables.isEmpty());
+ feasible &= calculateNonTrunk(partConstraints, partVariables);
+ }
+
+ // Propagate the new sizes down the simplified graph, ie. tell the
+ // group anchors to set their children anchors sizes.
+ updateAnchorSizes(orientation);
+
+ graphHasConflicts[orientation] = !feasible;
+
+ // Clean up our data structures. They are not needed anymore since
+ // distribution uses just interpolation.
+ qDeleteAll(constraints[orientation]);
+ constraints[orientation].clear();
+ graphPaths[orientation].clear(); // ###
+}
+
+/*!
+ \internal
+
+ Calculate the sizes for all anchors which are part of the trunk. This works
+ on top of a (possibly) simplified graph.
+*/
+bool QGraphicsAnchorLayoutPrivate::calculateTrunk(Orientation orientation, const GraphPath &path,
+ const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables)
+{
bool feasible = true;
- if (!trunkConstraints.isEmpty()) {
+ bool needsSimplex = !constraints.isEmpty();
+
#if 0
- qDebug("Simplex used for trunk of %s",
- orientation == Horizontal ? "Horizontal" : "Vertical");
+ qDebug("Simplex %s for trunk of %s", needsSimplex ? "used" : "NOT used",
+ orientation == Horizontal ? "Horizontal" : "Vertical");
#endif
- // Solve min and max size hints for trunk
- qreal min, max;
- feasible = solveMinMax(trunkConstraints, trunkPath, &min, &max);
+ if (needsSimplex) {
- if (feasible) {
- // Solve for preferred. The objective function is calculated from the constraints
- // and variables internally.
- solvePreferred(trunkConstraints);
+ QList<QSimplexConstraint *> sizeHintConstraints = constraintsFromSizeHints(variables);
+ QList<QSimplexConstraint *> allConstraints = constraints + sizeHintConstraints;
- // remove sizeHintConstraints from trunkConstraints
- trunkConstraints = parts[0];
-
- // Solve for expanding. The objective function and the constraints from items
- // are calculated internally.
- solveExpanding(trunkConstraints);
-
- // Propagate the new sizes down the simplified graph, ie. tell the
- // group anchors to set their children anchors sizes.
+ // Solve min and max size hints
+ qreal min, max;
+ feasible = solveMinMax(allConstraints, path, &min, &max);
- // ### we calculated variables already a few times, can't we reuse that?
- QList<AnchorData *> trunkVariables = getVariables(trunkConstraints);
+ if (feasible) {
+ solvePreferred(allConstraints, variables);
- for (int i = 0; i < trunkVariables.count(); ++i)
- trunkVariables.at(i)->updateChildrenSizes();
+ // Note that we don't include the sizeHintConstraints, since they
+ // have a different logic for solveExpanding().
+ solveExpanding(constraints, variables);
// Calculate and set the preferred and expanding sizes for the layout,
// from the edge sizes that were calculated above.
qreal pref(0.0);
qreal expanding(0.0);
- foreach (const AnchorData *ad, trunkPath.positives) {
+ foreach (const AnchorData *ad, path.positives) {
pref += ad->sizeAtPreferred;
expanding += ad->sizeAtExpanding;
}
- foreach (const AnchorData *ad, trunkPath.negatives) {
+ foreach (const AnchorData *ad, path.negatives) {
pref -= ad->sizeAtPreferred;
expanding -= ad->sizeAtExpanding;
}
@@ -1703,76 +1783,57 @@ void QGraphicsAnchorLayoutPrivate::calculateGraphs(
sizeHints[orientation][Qt::MaximumSize] = max;
sizeAtExpanding[orientation] = expanding;
}
- } else {
-#if 0
- qDebug("Simplex NOT used for trunk of %s",
- orientation == Horizontal ? "Horizontal" : "Vertical");
-#endif
+ qDeleteAll(sizeHintConstraints);
+
+ } else {
// No Simplex is necessary because the path was simplified all the way to a single
// anchor.
- Q_ASSERT(trunkPath.positives.count() == 1);
- Q_ASSERT(trunkPath.negatives.count() == 0);
+ Q_ASSERT(path.positives.count() == 1);
+ Q_ASSERT(path.negatives.count() == 0);
- AnchorData *ad = trunkPath.positives.toList()[0];
+ AnchorData *ad = path.positives.toList()[0];
ad->sizeAtMinimum = ad->minSize;
ad->sizeAtPreferred = ad->prefSize;
ad->sizeAtExpanding = ad->expSize;
ad->sizeAtMaximum = ad->maxSize;
- // Propagate
- ad->updateChildrenSizes();
-
sizeHints[orientation][Qt::MinimumSize] = ad->sizeAtMinimum;
sizeHints[orientation][Qt::PreferredSize] = ad->sizeAtPreferred;
sizeHints[orientation][Qt::MaximumSize] = ad->sizeAtMaximum;
sizeAtExpanding[orientation] = ad->sizeAtExpanding;
}
- // Delete the constraints, we won't use them anymore.
- qDeleteAll(sizeHintConstraints);
- sizeHintConstraints.clear();
+#if defined(QT_DEBUG) || defined(Q_AUTOTEST_EXPORT)
+ lastCalculationUsedSimplex[orientation] = needsSimplex;
+#endif
- // For the other parts that not the trunk, solve only for the preferred size
- // that is the size they will remain at, since they are not stretched by the
- // layout.
+ return feasible;
+}
- // Solve the other only for preferred, skip trunk
- if (feasible) {
- for (int i = 1; i < parts.count(); ++i) {
- QList<QSimplexConstraint *> partConstraints = parts[i];
- QList<AnchorData *> partVariables = getVariables(partConstraints);
- Q_ASSERT(!partVariables.isEmpty());
-
- sizeHintConstraints = constraintsFromSizeHints(partVariables);
- partConstraints += sizeHintConstraints;
- feasible &= solvePreferred(partConstraints);
- if (!feasible)
- break;
-
- // Propagate size at preferred to other sizes. Semi-floats
- // always will be in their sizeAtPreferred.
- for (int j = 0; j < partVariables.count(); ++j) {
- AnchorData *ad = partVariables[j];
- Q_ASSERT(ad);
- ad->sizeAtMinimum = ad->sizeAtPreferred;
- ad->sizeAtExpanding = ad->sizeAtPreferred;
- ad->sizeAtMaximum = ad->sizeAtPreferred;
- ad->updateChildrenSizes();
- }
+/*!
+ \internal
+*/
+bool QGraphicsAnchorLayoutPrivate::calculateNonTrunk(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables)
+{
+ QList<QSimplexConstraint *> sizeHintConstraints = constraintsFromSizeHints(variables);
+ bool feasible = solvePreferred(constraints + sizeHintConstraints, variables);
- // Delete the constraints, we won't use them anymore.
- qDeleteAll(sizeHintConstraints);
- sizeHintConstraints.clear();
+ if (feasible) {
+ // Propagate size at preferred to other sizes. Semi-floats always will be
+ // in their sizeAtPreferred.
+ for (int j = 0; j < variables.count(); ++j) {
+ AnchorData *ad = variables[j];
+ Q_ASSERT(ad);
+ ad->sizeAtMinimum = ad->sizeAtPreferred;
+ ad->sizeAtExpanding = ad->sizeAtPreferred;
+ ad->sizeAtMaximum = ad->sizeAtPreferred;
}
}
- graphHasConflicts[orientation] = !feasible;
- // Clean up our data structures. They are not needed anymore since
- // distribution uses just interpolation.
- qDeleteAll(constraints[orientation]);
- constraints[orientation].clear();
- graphPaths[orientation].clear(); // ###
+ qDeleteAll(sizeHintConstraints);
+ return feasible;
}
/*!
@@ -1876,6 +1937,20 @@ void QGraphicsAnchorLayoutPrivate::constraintsFromPaths(Orientation orientation)
/*!
\internal
+*/
+void QGraphicsAnchorLayoutPrivate::updateAnchorSizes(Orientation orientation)
+{
+ Graph<AnchorVertex, AnchorData> &g = graph[orientation];
+ const QList<QPair<AnchorVertex *, AnchorVertex *> > &vertices = g.connections();
+
+ for (int i = 0; i < vertices.count(); ++i) {
+ AnchorData *ad = g.edgeData(vertices.at(i).first, vertices.at(i).second);
+ ad->updateChildrenSizes();
+ }
+}
+
+/*!
+ \internal
Create LP constraints for each anchor based on its minimum and maximum
sizes, as specified in its size hints
@@ -2160,39 +2235,26 @@ void QGraphicsAnchorLayoutPrivate::calculateVertexPositions(
\internal
Calculate interpolation parameters based on current Layout Size.
- Must once before calling "interpolateEdgeSize()" for each edge.
+ Must be called once before calling "interpolateEdgeSize()" for
+ the edges.
*/
void QGraphicsAnchorLayoutPrivate::setupEdgesInterpolation(
Orientation orientation)
{
Q_Q(QGraphicsAnchorLayout);
- qreal lower, upper, current;
- if (orientation == Horizontal) {
- current = q->contentsRect().width();
- } else {
- current = q->contentsRect().height();
- }
+ qreal current;
+ current = (orientation == Horizontal) ? q->contentsRect().width() : q->contentsRect().height();
- if (current < sizeHints[orientation][Qt::PreferredSize]) {
- interpolationInterval[orientation] = MinToPreferred;
- lower = sizeHints[orientation][Qt::MinimumSize];
- upper = sizeHints[orientation][Qt::PreferredSize];
- } else if (current < sizeAtExpanding[orientation]) {
- interpolationInterval[orientation] = PreferredToExpanding;
- lower = sizeHints[orientation][Qt::PreferredSize];
- upper = sizeAtExpanding[orientation];
- } else {
- interpolationInterval[orientation] = ExpandingToMax;
- lower = sizeAtExpanding[orientation];
- upper = sizeHints[orientation][Qt::MaximumSize];
- }
+ QPair<Interval, qreal> result;
+ result = getFactor(current,
+ sizeHints[orientation][Qt::MinimumSize],
+ sizeHints[orientation][Qt::PreferredSize],
+ sizeAtExpanding[orientation],
+ sizeHints[orientation][Qt::MaximumSize]);
- if (upper == lower) {
- interpolationProgress[orientation] = 0;
- } else {
- interpolationProgress[orientation] = (current - lower) / (upper - lower);
- }
+ interpolationInterval[orientation] = result.first;
+ interpolationProgress[orientation] = result.second;
}
/*!
@@ -2219,20 +2281,11 @@ void QGraphicsAnchorLayoutPrivate::interpolateEdge(AnchorVertex *base,
AnchorData *edge,
Orientation orientation)
{
- qreal lower, upper;
+ const QPair<Interval, qreal> factor(interpolationInterval[orientation],
+ interpolationProgress[orientation]);
- if (interpolationInterval[orientation] == MinToPreferred) {
- lower = edge->sizeAtMinimum;
- upper = edge->sizeAtPreferred;
- } else if (interpolationInterval[orientation] == PreferredToExpanding) {
- lower = edge->sizeAtPreferred;
- upper = edge->sizeAtExpanding;
- } else {
- lower = edge->sizeAtExpanding;
- upper = edge->sizeAtMaximum;
- }
-
- qreal edgeDistance = (interpolationProgress[orientation] * (upper - lower)) + lower;
+ qreal edgeDistance = interpolate(factor, edge->sizeAtMinimum, edge->sizeAtPreferred,
+ edge->sizeAtExpanding, edge->sizeAtMaximum);
Q_ASSERT(edge->from == base || edge->to == base);
@@ -2303,7 +2356,7 @@ void QGraphicsAnchorLayoutPrivate::interpolateSequentialEdges(
interpolateEdge(prev, data->m_edges.last(), orientation);
}
-bool QGraphicsAnchorLayoutPrivate::solveMinMax(QList<QSimplexConstraint *> constraints,
+bool QGraphicsAnchorLayoutPrivate::solveMinMax(const QList<QSimplexConstraint *> &constraints,
GraphPath path, qreal *min, qreal *max)
{
QSimplex simplex;
@@ -2344,9 +2397,9 @@ bool QGraphicsAnchorLayoutPrivate::solveMinMax(QList<QSimplexConstraint *> const
return feasible;
}
-bool QGraphicsAnchorLayoutPrivate::solvePreferred(QList<QSimplexConstraint *> constraints)
+bool QGraphicsAnchorLayoutPrivate::solvePreferred(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables)
{
- QList<AnchorData *> variables = getVariables(constraints);
QList<QSimplexConstraint *> preferredConstraints;
QList<QSimplexVariable *> preferredVariables;
QSimplexConstraint objective;
@@ -2369,7 +2422,7 @@ bool QGraphicsAnchorLayoutPrivate::solvePreferred(QList<QSimplexConstraint *> co
// A + A_shrinker - A_grower = A_pref
//
for (int i = 0; i < variables.size(); ++i) {
- AnchorData *ad = static_cast<AnchorData *>(variables[i]);
+ AnchorData *ad = variables[i];
if (ad->skipInPreferred)
continue;
@@ -2400,7 +2453,7 @@ bool QGraphicsAnchorLayoutPrivate::solvePreferred(QList<QSimplexConstraint *> co
// Save sizeAtPreferred results
for (int i = 0; i < variables.size(); ++i) {
- AnchorData *ad = static_cast<AnchorData *>(variables[i]);
+ AnchorData *ad = variables[i];
ad->sizeAtPreferred = ad->result;
}
@@ -2461,9 +2514,9 @@ bool QGraphicsAnchorLayoutPrivate::solvePreferred(QList<QSimplexConstraint *> co
expanding ones will shrink. Only after non-expanding anchors have
shrinked all the way, the expanding anchors will start to shrink too.
*/
-void QGraphicsAnchorLayoutPrivate::solveExpanding(QList<QSimplexConstraint *> constraints)
+void QGraphicsAnchorLayoutPrivate::solveExpanding(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables)
{
- QList<AnchorData *> variables = getVariables(constraints);
QList<QSimplexConstraint *> itemConstraints;
QSimplexConstraint *objective = new QSimplexConstraint;
bool hasExpanding = false;
@@ -2566,9 +2619,9 @@ bool QGraphicsAnchorLayoutPrivate::hasConflicts() const
}
#ifdef QT_DEBUG
-void QGraphicsAnchorLayoutPrivate::dumpGraph()
+void QGraphicsAnchorLayoutPrivate::dumpGraph(const QString &name)
{
- QFile file(QString::fromAscii("anchorlayout.dot"));
+ QFile file(QString::fromAscii("anchorlayout.%1.dot").arg(name));
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
qWarning("Could not write to %s", file.fileName().toLocal8Bit().constData());
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.h b/src/gui/graphicsview/qgraphicsanchorlayout_p.h
index 9ac0e19..d45c004 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout_p.h
+++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.h
@@ -169,16 +169,9 @@ struct AnchorData : public QSimplexVariable {
QString name;
#endif
- inline void setFixedSize(qreal size)
+ inline void setPreferredSize(qreal size)
{
- minSize = size;
prefSize = size;
- expSize = size;
- maxSize = size;
- sizeAtMinimum = size;
- sizeAtPreferred = size;
- sizeAtExpanding = size;
- sizeAtMaximum = size;
hasSize = true;
}
@@ -316,8 +309,11 @@ public:
void unsetSpacing();
qreal spacing() const;
+ void setSizePolicy(QSizePolicy::Policy policy);
+
QGraphicsAnchorLayoutPrivate *layoutPrivate;
AnchorData *data;
+ QSizePolicy::Policy sizePolicy;
};
@@ -438,9 +434,17 @@ public:
void calculateGraphs();
void calculateGraphs(Orientation orientation);
+
+ bool calculateTrunk(Orientation orientation, const GraphPath &trunkPath,
+ const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables);
+ bool calculateNonTrunk(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables);
+
void setAnchorSizeHintsFromItems(Orientation orientation);
void findPaths(Orientation orientation);
void constraintsFromPaths(Orientation orientation);
+ void updateAnchorSizes(Orientation orientation);
QList<QSimplexConstraint *> constraintsFromSizeHints(const QList<AnchorData *> &anchors);
QList<QList<QSimplexConstraint *> > getGraphParts(Orientation orientation);
void identifyFloatItems(const QSet<AnchorData *> &visited, Orientation orientation);
@@ -471,14 +475,16 @@ public:
Orientation orientation);
// Linear Programming solver methods
- bool solveMinMax(QList<QSimplexConstraint *> constraints,
+ bool solveMinMax(const QList<QSimplexConstraint *> &constraints,
GraphPath path, qreal *min, qreal *max);
- bool solvePreferred(QList<QSimplexConstraint *> constraints);
- void solveExpanding(QList<QSimplexConstraint *> constraints);
+ bool solvePreferred(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables);
+ void solveExpanding(const QList<QSimplexConstraint *> &constraints,
+ const QList<AnchorData *> &variables);
bool hasConflicts() const;
#ifdef QT_DEBUG
- void dumpGraph();
+ void dumpGraph(const QString &name = QString());
#endif
@@ -513,7 +519,13 @@ public:
bool graphHasConflicts[2];
QSet<QGraphicsLayoutItem *> m_floatItems[2];
+#if defined(QT_DEBUG) || defined(Q_AUTOTEST_EXPORT)
+ bool lastCalculationUsedSimplex[2];
+#endif
+
uint calculateGraphCacheDirty : 1;
+
+ friend class QGraphicsAnchorPrivate;
};
QT_END_NAMESPACE
diff --git a/src/gui/graphicsview/qgraphicsgridlayout.cpp b/src/gui/graphicsview/qgraphicsgridlayout.cpp
index d1d91db..9a8dba0 100644
--- a/src/gui/graphicsview/qgraphicsgridlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsgridlayout.cpp
@@ -63,7 +63,7 @@
You can access each item in the layout by calling count() and itemAt(). Calling
removeAt() will remove an item from the layout, without
destroying it.
-
+
\sa QGraphicsLinearLayout, QGraphicsWidget
*/
@@ -89,7 +89,7 @@ public:
QLayoutStyleInfo styleInfo() const;
QGridLayoutEngine engine;
-#ifdef QT_DEBUG
+#ifdef QT_DEBUG
void dump(int indent) const;
#endif
};
@@ -121,7 +121,7 @@ QGraphicsGridLayout::~QGraphicsGridLayout()
for (int i = count() - 1; i >= 0; --i) {
QGraphicsLayoutItem *item = itemAt(i);
// The following lines can be removed, but this removes the item
- // from the layout more efficiently than the implementation of
+ // from the layout more efficiently than the implementation of
// ~QGraphicsLayoutItem.
removeAt(i);
if (item) {
@@ -141,18 +141,22 @@ void QGraphicsGridLayout::addItem(QGraphicsLayoutItem *item, int row, int column
{
Q_D(QGraphicsGridLayout);
if (row < 0 || column < 0) {
- qWarning("QGraphicsGridLayout::addItem: invalid row/column: %d",
- row < 0 ? row : column);
- return;
+ qWarning("QGraphicsGridLayout::addItem: invalid row/column: %d",
+ row < 0 ? row : column);
+ return;
}
if (columnSpan < 1 || rowSpan < 1) {
- qWarning("QGraphicsGridLayout::addItem: invalid row span/column span: %d",
- rowSpan < 1 ? rowSpan : columnSpan);
- return;
+ qWarning("QGraphicsGridLayout::addItem: invalid row span/column span: %d",
+ rowSpan < 1 ? rowSpan : columnSpan);
+ return;
}
if (!item) {
- qWarning("QGraphicsGridLayout::addItem: cannot add null item");
- return;
+ qWarning("QGraphicsGridLayout::addItem: cannot add null item");
+ return;
+ }
+ if (item == this) {
+ qWarning("QGraphicsGridLayout::addItem: cannot insert itself");
+ return;
}
d->addChildLayoutItem(item);
@@ -647,5 +651,5 @@ QSizePolicy::ControlTypes QGraphicsGridLayout::controlTypes(LayoutSide side) con
#endif
QT_END_NAMESPACE
-
-#endif //QT_NO_GRAPHICSVIEW
+
+#endif //QT_NO_GRAPHICSVIEW
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 3069733..f892bb4 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -663,6 +663,8 @@
#include <private/qpixmap_x11_p.h>
#endif
+#include <private/qgesturemanager_p.h>
+
#include <math.h>
QT_BEGIN_NAMESPACE
@@ -1226,7 +1228,7 @@ void QGraphicsItemCache::purge()
}
/*!
- Constructs a QGraphicsItem with the given \a parent.
+ Constructs a QGraphicsItem, passing \a item to QGraphicsItem's constructor. It does not modify \fn QObject::parent().
If \a parent is 0, you can add the item to a scene by calling
QGraphicsScene::addItem(). The item will then become a top-level item.
@@ -1509,6 +1511,8 @@ const QGraphicsObject *QGraphicsItem::toGraphicsObject() const
the parent. You should not \l{QGraphicsScene::addItem()}{add} the
item to the scene yourself.
+ Calling this function on an item that is an ancestor of \a parent have undefined behaviour.
+
\sa parentItem(), childItems()
*/
void QGraphicsItem::setParentItem(QGraphicsItem *parent)
@@ -2480,12 +2484,14 @@ void QGraphicsItem::setOpacity(qreal opacity)
itemChange(ItemOpacityHasChanged, newOpacityVariant);
// Update.
- if (d_ptr->scene)
+ if (d_ptr->scene) {
+ d_ptr->invalidateGraphicsEffectsRecursively();
d_ptr->scene->d_func()->markDirty(this, QRectF(),
/*invalidateChildren=*/true,
/*maybeDirtyClipPath=*/false,
/*force=*/false,
/*ignoreOpacity=*/true);
+ }
if (d_ptr->isObject)
emit static_cast<QGraphicsObject *>(this)->opacityChanged();
@@ -4733,7 +4739,7 @@ bool QGraphicsItem::isObscuredBy(const QGraphicsItem *item) const
{
if (!item)
return false;
- return QGraphicsSceneBspTreeIndexPrivate::closestItemFirst_withoutCache(item, this)
+ return qt_closestItemFirst(item, this)
&& qt_QGraphicsItem_isObscured(this, item, boundingRect());
}
@@ -4947,6 +4953,22 @@ int QGraphicsItemPrivate::depth() const
/*!
\internal
*/
+void QGraphicsItemPrivate::invalidateGraphicsEffectsRecursively()
+{
+ QGraphicsItemPrivate *itemPrivate = this;
+ do {
+ if (itemPrivate->graphicsEffect) {
+ itemPrivate->notifyInvalidated = 1;
+
+ if (!itemPrivate->updateDueToGraphicsEffect)
+ static_cast<QGraphicsItemEffectSourcePrivate *>(itemPrivate->graphicsEffect->d_func()->source->d_func())->invalidateCache();
+ }
+ } while ((itemPrivate = itemPrivate->parent ? itemPrivate->parent->d_ptr.data() : 0));
+}
+
+/*!
+ \internal
+*/
void QGraphicsItemPrivate::invalidateDepthRecursively()
{
if (itemDepth == -1)
@@ -5278,11 +5300,7 @@ void QGraphicsItem::update(const QRectF &rect)
return;
// Make sure we notify effects about invalidated source.
- QGraphicsItem *item = this;
- do {
- if (item->d_ptr->graphicsEffect)
- item->d_ptr->notifyInvalidated = 1;
- } while ((item = item->d_ptr->parent));
+ d_ptr->invalidateGraphicsEffectsRecursively();
if (CacheMode(d_ptr->cacheMode) != NoCache) {
// Invalidate cache.
@@ -7286,8 +7304,21 @@ QGraphicsObject::QGraphicsObject(QGraphicsItemPrivate &dd, QGraphicsItem *parent
}
/*!
+ Subscribes the graphics object to the given \a gesture for the specified \a context.
+
+ \sa QGestureEvent
+*/
+
+void QGraphicsObject::grabGesture(Qt::GestureType gesture, Qt::GestureContext context)
+{
+ QGraphicsItemPrivate * const d = QGraphicsItem::d_func();
+ d->gestureContext.insert(gesture, context);
+ (void)QGestureManager::instance(); // create a gesture manager
+}
+
+/*!
\property QGraphicsObject::parent
- \brief the parent of the item
+ \brief the parent of the item. It is independent from \fn QObject::parent.
\sa QGraphicsItem::setParentItem(), QGraphicsItem::parentObject()
*/
@@ -10706,6 +10737,7 @@ QPixmap QGraphicsItemEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QP
}
pixmapPainter.end();
+
return pixmap;
}
@@ -10725,6 +10757,23 @@ QDebug operator<<(QDebug debug, QGraphicsItem *item)
return debug;
}
+QDebug operator<<(QDebug debug, QGraphicsObject *item)
+{
+ if (!item) {
+ debug << "QGraphicsObject(0)";
+ return debug;
+ }
+
+ debug.nospace() << item->metaObject()->className() << '(' << (void*)item;
+ if (!item->objectName().isEmpty())
+ debug << ", name = " << item->objectName();
+ debug.nospace() << ", parent = " << ((void*)item->parentItem())
+ << ", pos = " << item->pos()
+ << ", z = " << item->zValue() << ", flags = "
+ << item->flags() << ')';
+ return debug.space();
+}
+
QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemChange change)
{
const char *str = "UnknownChange";
diff --git a/src/gui/graphicsview/qgraphicsitem.h b/src/gui/graphicsview/qgraphicsitem.h
index e6e324a..f3fe99c 100644
--- a/src/gui/graphicsview/qgraphicsitem.h
+++ b/src/gui/graphicsview/qgraphicsitem.h
@@ -464,6 +464,7 @@ private:
friend class QGraphicsSceneBspTree;
friend class QGraphicsView;
friend class QGraphicsViewPrivate;
+ friend class QGraphicsObject;
friend class QGraphicsWidget;
friend class QGraphicsWidgetPrivate;
friend class QGraphicsProxyWidgetPrivate;
@@ -473,6 +474,7 @@ private:
friend class QGraphicsSceneBspTreeIndexPrivate;
friend class QGraphicsItemEffectSourcePrivate;
friend class QGraphicsTransformPrivate;
+ friend class QGestureManager;
friend class ::tst_QGraphicsItem;
friend bool qt_closestLeaf(const QGraphicsItem *, const QGraphicsItem *);
friend bool qt_closestItemFirst(const QGraphicsItem *, const QGraphicsItem *);
@@ -553,6 +555,8 @@ public:
using QObject::children;
#endif
+ void grabGesture(Qt::GestureType type, Qt::GestureContext context = Qt::ItemWithChildrenGesture);
+
Q_SIGNALS:
void parentChanged();
void opacityChanged();
@@ -1116,6 +1120,7 @@ template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem *item);
+Q_GUI_EXPORT QDebug operator<<(QDebug debug, QGraphicsObject *item);
Q_GUI_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemChange change);
Q_GUI_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlag flag);
Q_GUI_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlags flags);
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index 51bfea1..046f5dc 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -177,6 +177,7 @@ public:
wantsActive(0),
holesInSiblingIndex(0),
sequentialOrdering(1),
+ updateDueToGraphicsEffect(0),
globalStackingOrder(-1),
q_ptr(0)
{
@@ -221,6 +222,7 @@ public:
bool discardUpdateRequest(bool ignoreClipping = false, bool ignoreVisibleBit = false,
bool ignoreDirtyBit = false, bool ignoreOpacity = false) const;
int depth() const;
+ void invalidateGraphicsEffectsRecursively();
void invalidateDepthRecursively();
void resolveDepth();
void addChild(QGraphicsItem *child);
@@ -450,6 +452,7 @@ public:
QGraphicsItem *focusScopeItem;
Qt::InputMethodHints imHints;
QGraphicsItem::PanelModality panelModality;
+ QMap<Qt::GestureType, Qt::GestureContext> gestureContext;
// Packed 32 bits
quint32 acceptedMouseButtons : 5;
@@ -501,6 +504,7 @@ public:
quint32 wantsActive : 1;
quint32 holesInSiblingIndex : 1;
quint32 sequentialOrdering : 1;
+ quint32 updateDueToGraphicsEffect : 1;
// Optional stacking order
int globalStackingOrder;
@@ -538,7 +542,7 @@ struct QGraphicsItemPrivate::TransformData
QMatrix4x4 m;
for (int i = 0; i < graphicsTransforms.size(); ++i)
graphicsTransforms.at(i)->applyTo(&m);
- x *= m.toTransform();
+ x *= m.toTransform(0);
}
x.translate(xOrigin, yOrigin);
x.rotate(rotation);
@@ -588,8 +592,11 @@ public:
inline const QWidget *widget() const
{ return 0; }
- inline void update()
- { item->update(); }
+ inline void update() {
+ item->d_ptr->updateDueToGraphicsEffect = true;
+ item->update();
+ item->d_ptr->updateDueToGraphicsEffect = false;
+ }
inline void effectBoundingRectChanged()
{ item->prepareGeometryChange(); }
@@ -618,10 +625,76 @@ public:
QGraphicsItem *item;
QGraphicsItemPaintInfo *info;
+ QTransform lastEffectTransform;
};
/*!
+ Returns true if \a item1 is on top of \a item2.
+ The items dont need to be siblings.
+
+ \internal
+*/
+inline bool qt_closestItemFirst(const QGraphicsItem *item1, const QGraphicsItem *item2)
+{
+ // Siblings? Just check their z-values.
+ const QGraphicsItemPrivate *d1 = item1->d_ptr.data();
+ const QGraphicsItemPrivate *d2 = item2->d_ptr.data();
+ if (d1->parent == d2->parent)
+ return qt_closestLeaf(item1, item2);
+
+ // Find common ancestor, and each item's ancestor closest to the common
+ // ancestor.
+ int item1Depth = d1->depth();
+ int item2Depth = d2->depth();
+ const QGraphicsItem *p = item1;
+ const QGraphicsItem *t1 = item1;
+ while (item1Depth > item2Depth && (p = p->d_ptr->parent)) {
+ if (p == item2) {
+ // item2 is one of item1's ancestors; item1 is on top
+ return !(t1->d_ptr->flags & QGraphicsItem::ItemStacksBehindParent);
+ }
+ t1 = p;
+ --item1Depth;
+ }
+ p = item2;
+ const QGraphicsItem *t2 = item2;
+ while (item2Depth > item1Depth && (p = p->d_ptr->parent)) {
+ if (p == item1) {
+ // item1 is one of item2's ancestors; item1 is not on top
+ return (t2->d_ptr->flags & QGraphicsItem::ItemStacksBehindParent);
+ }
+ t2 = p;
+ --item2Depth;
+ }
+
+ // item1Ancestor is now at the same level as item2Ancestor, but not the same.
+ const QGraphicsItem *p1 = t1;
+ const QGraphicsItem *p2 = t2;
+ while (t1 && t1 != t2) {
+ p1 = t1;
+ p2 = t2;
+ t1 = t1->d_ptr->parent;
+ t2 = t2->d_ptr->parent;
+ }
+
+ // in case we have a common ancestor, we compare the immediate children in the ancestor's path.
+ // otherwise we compare the respective items' topLevelItems directly.
+ return qt_closestLeaf(p1, p2);
+}
+
+/*!
+ Returns true if \a item2 is on top of \a item1.
+ The items dont need to be siblings.
+
+ \internal
+*/
+inline bool qt_closestItemLast(const QGraphicsItem *item1, const QGraphicsItem *item2)
+{
+ return qt_closestItemFirst(item2, item1);
+}
+
+/*!
\internal
*/
inline bool qt_closestLeaf(const QGraphicsItem *item1, const QGraphicsItem *item2)
@@ -641,7 +714,7 @@ inline bool qt_closestLeaf(const QGraphicsItem *item1, const QGraphicsItem *item
/*!
\internal
*/
-static inline bool qt_notclosestLeaf(const QGraphicsItem *item1, const QGraphicsItem *item2)
+inline bool qt_notclosestLeaf(const QGraphicsItem *item1, const QGraphicsItem *item2)
{ return qt_closestLeaf(item2, item1); }
/*
diff --git a/src/gui/graphicsview/qgraphicslinearlayout.cpp b/src/gui/graphicsview/qgraphicslinearlayout.cpp
index 0aa68df..7ff7c9b 100644
--- a/src/gui/graphicsview/qgraphicslinearlayout.cpp
+++ b/src/gui/graphicsview/qgraphicslinearlayout.cpp
@@ -272,6 +272,10 @@ void QGraphicsLinearLayout::insertItem(int index, QGraphicsLayoutItem *item)
qWarning("QGraphicsLinearLayout::insertItem: cannot insert null item");
return;
}
+ if (item == this) {
+ qWarning("QGraphicsLinearLayout::insertItem: cannot insert itself");
+ return;
+ }
d->addChildLayoutItem(item);
Q_ASSERT(item);
diff --git a/src/gui/graphicsview/qgraphicsproxywidget.cpp b/src/gui/graphicsview/qgraphicsproxywidget.cpp
index 15b9ff3..64c51ad 100644
--- a/src/gui/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/gui/graphicsview/qgraphicsproxywidget.cpp
@@ -57,6 +57,9 @@
#include <QtGui/qpainter.h>
#include <QtGui/qstyleoption.h>
#include <QtGui/qgraphicsview.h>
+#include <QtGui/qlistview.h>
+#include <QtGui/qlineedit.h>
+#include <QtGui/qtextedit.h>
QT_BEGIN_NAMESPACE
@@ -86,7 +89,9 @@ QT_BEGIN_NAMESPACE
of embedded widgets through creating a child proxy for each popup. This
means that when an embedded QComboBox shows its popup list, a new
QGraphicsProxyWidget is created automatically, embedding the popup, and
- positioning it correctly.
+ positioning it correctly. This only works if the popup is child of the
+ embedded widget (for example QToolButton::setMenu() requires the QMenu instance
+ to be child of the QToolButton).
\section1 Embedding a Widget with QGraphicsProxyWidget
@@ -184,6 +189,7 @@ QT_BEGIN_NAMESPACE
*/
extern bool qt_sendSpontaneousEvent(QObject *, QEvent *);
+extern bool qt_tab_all_widgets;
/*!
\internal
@@ -369,6 +375,7 @@ QVariant QGraphicsProxyWidgetPrivate::inputMethodQueryHelper(Qt::InputMethodQuer
/*!
\internal
+ Some of the logic is shared with QApplicationPrivate::focusNextPrevChild_helper
*/
QWidget *QGraphicsProxyWidgetPrivate::findFocusChild(QWidget *child, bool next) const
{
@@ -382,14 +389,16 @@ QWidget *QGraphicsProxyWidgetPrivate::findFocusChild(QWidget *child, bool next)
child = next ? child->d_func()->focus_next : child->d_func()->focus_prev;
if ((next && child == widget) || (!next && child == widget->d_func()->focus_prev)) {
return 0;
- }
+ }
}
QWidget *oldChild = child;
+ uint focus_flag = qt_tab_all_widgets ? Qt::TabFocus : Qt::StrongFocus;
do {
if (child->isEnabled()
&& child->isVisibleTo(widget)
- && (child->focusPolicy() & Qt::TabFocus)) {
+ && (child->focusPolicy() & focus_flag == focus_flag)
+ && !(child->d_func()->extra && child->d_func()->extra->focus_proxy)) {
return child;
}
child = next ? child->d_func()->focus_next : child->d_func()->focus_prev;
@@ -973,7 +982,7 @@ void QGraphicsProxyWidget::hideEvent(QHideEvent *event)
void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
Q_D(QGraphicsProxyWidget);
- if (!event || !d->widget || !d->widget->isVisible())
+ if (!event || !d->widget || !d->widget->isVisible() || !hasFocus())
return;
// Find widget position and receiver.
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 961f44f..c459d21 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -242,7 +242,6 @@
#include <QtGui/qstyleoption.h>
#include <QtGui/qtooltip.h>
#include <QtGui/qtransform.h>
-#include <QtGui/qgesture.h>
#include <QtGui/qinputcontext.h>
#include <QtGui/qgraphicseffect.h>
#include <private/qapplication_p.h>
@@ -251,6 +250,14 @@
#include <private/qt_x11_p.h>
#endif
#include <private/qgraphicseffect_p.h>
+#include <private/qgesturemanager_p.h>
+
+// #define GESTURE_DEBUG
+#ifndef GESTURE_DEBUG
+# define DEBUG if (0) qDebug
+#else
+# define DEBUG qDebug
+#endif
QT_BEGIN_NAMESPACE
@@ -420,8 +427,12 @@ void QGraphicsScenePrivate::unregisterTopLevelItem(QGraphicsItem *item)
*/
void QGraphicsScenePrivate::_q_polishItems()
{
+ QSet<QGraphicsItem *>::Iterator it;
const QVariant booleanTrueVariant(true);
- foreach (QGraphicsItem *item, unpolishedItems) {
+ while (!unpolishedItems.isEmpty()) {
+ it = unpolishedItems.begin();
+ QGraphicsItem *item = *it;
+ unpolishedItems.erase(it);
if (!item->d_ptr->explicitlyHidden) {
item->itemChange(QGraphicsItem::ItemVisibleChange, booleanTrueVariant);
item->itemChange(QGraphicsItem::ItemVisibleHasChanged, booleanTrueVariant);
@@ -431,7 +442,6 @@ void QGraphicsScenePrivate::_q_polishItems()
QApplication::sendEvent((QGraphicsWidget *)item, &event);
}
}
- unpolishedItems.clear();
}
void QGraphicsScenePrivate::_q_processDirtyItems()
@@ -549,7 +559,7 @@ void QGraphicsScenePrivate::removeItemHelper(QGraphicsItem *item)
selectedItems.remove(item);
hoverItems.removeAll(item);
cachedItemsUnderMouse.removeAll(item);
- unpolishedItems.removeAll(item);
+ unpolishedItems.remove(item);
resetDirtyItem(item);
//We remove all references of item from the sceneEventFilter arrays
@@ -1049,6 +1059,14 @@ bool QGraphicsScenePrivate::filterEvent(QGraphicsItem *item, QEvent *event)
*/
bool QGraphicsScenePrivate::sendEvent(QGraphicsItem *item, QEvent *event)
{
+ if (QGraphicsObject *object = item->toGraphicsObject()) {
+ QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
+ if (qAppPriv->gestureManager) {
+ if (qAppPriv->gestureManager->filterEvent(object, event))
+ return true;
+ }
+ }
+
if (filterEvent(item, event))
return false;
if (filterDescendantEvent(item, event))
@@ -2484,7 +2502,7 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
if (!item->d_ptr->explicitlyHidden) {
if (d->unpolishedItems.isEmpty())
QMetaObject::invokeMethod(this, "_q_polishItems", Qt::QueuedConnection);
- d->unpolishedItems << item;
+ d->unpolishedItems.insert(item);
}
// Reenable selectionChanged() for individual items
@@ -3362,6 +3380,10 @@ bool QGraphicsScene::event(QEvent *event)
case QEvent::TouchEnd:
d->touchEventHandler(static_cast<QTouchEvent *>(event));
break;
+ case QEvent::Gesture:
+ case QEvent::GestureOverride:
+ d->gestureEventHandler(static_cast<QGestureEvent *>(event));
+ break;
default:
return QObject::event(event);
}
@@ -4566,6 +4588,11 @@ void QGraphicsScenePrivate::drawSubtreeRecursive(QGraphicsItem *item, QPainter *
else
painter->setWorldTransform(*transformPtr);
painter->setOpacity(opacity);
+
+ if (sourced->lastEffectTransform != painter->worldTransform()) {
+ sourced->lastEffectTransform = painter->worldTransform();
+ sourced->invalidateCache();
+ }
item->d_ptr->graphicsEffect->draw(painter, source);
painter->setWorldTransform(restoreTransform);
sourced->info = 0;
@@ -5294,7 +5321,7 @@ void QGraphicsScene::setActivePanel(QGraphicsItem *item)
/*!
\since 4.4
- Returns the current active window, or 0 if there is no window is currently
+ Returns the current active window, or 0 if no window is currently
active.
\sa QGraphicsScene::setActiveWindow()
@@ -5475,11 +5502,11 @@ void QGraphicsScenePrivate::touchEventHandler(QTouchEvent *sceneTouchEvent)
}
if (itemsNeedingEvents.isEmpty()) {
- sceneTouchEvent->ignore();
+ sceneTouchEvent->accept();
return;
}
- bool acceptSceneTouchEvent = false;
+ bool ignoreSceneTouchEvent = true;
QHash<QGraphicsItem *, StatesAndTouchPoints>::ConstIterator it = itemsNeedingEvents.constBegin();
const QHash<QGraphicsItem *, StatesAndTouchPoints>::ConstIterator end = itemsNeedingEvents.constEnd();
for (; it != end; ++it) {
@@ -5522,19 +5549,20 @@ void QGraphicsScenePrivate::touchEventHandler(QTouchEvent *sceneTouchEvent)
item->d_ptr->acceptedTouchBeginEvent = true;
bool res = sendTouchBeginEvent(item, &touchEvent)
&& touchEvent.isAccepted();
- acceptSceneTouchEvent = acceptSceneTouchEvent || res;
+ if (!res)
+ ignoreSceneTouchEvent = false;
break;
}
default:
if (item->d_ptr->acceptedTouchBeginEvent) {
updateTouchPointsForItem(item, &touchEvent);
(void) sendEvent(item, &touchEvent);
- acceptSceneTouchEvent = true;
+ ignoreSceneTouchEvent = false;
}
break;
}
}
- sceneTouchEvent->setAccepted(acceptSceneTouchEvent);
+ sceneTouchEvent->setAccepted(ignoreSceneTouchEvent);
}
bool QGraphicsScenePrivate::sendTouchBeginEvent(QGraphicsItem *origin, QTouchEvent *touchEvent)
@@ -5695,6 +5723,238 @@ void QGraphicsScenePrivate::leaveModal(QGraphicsItem *panel)
dispatchHoverEvent(&hoverEvent);
}
+void QGraphicsScenePrivate::getGestureTargets(const QSet<QGesture *> &gestures,
+ QWidget *viewport,
+ QMap<Qt::GestureType, QGesture *> *conflictedGestures,
+ QList<QList<QGraphicsObject *> > *conflictedItems,
+ QHash<QGesture *, QGraphicsObject *> *normalGestures)
+{
+ foreach (QGesture *gesture, gestures) {
+ Qt::GestureType gestureType = gesture->gestureType();
+ if (gesture->hasHotSpot()) {
+ QPoint screenPos = gesture->hotSpot().toPoint();
+ QList<QGraphicsItem *> items = itemsAtPosition(screenPos, QPointF(), viewport);
+ QList<QGraphicsObject *> result;
+ for (int j = 0; j < items.size(); ++j) {
+ QGraphicsObject *item = items.at(j)->toGraphicsObject();
+ if (!item)
+ continue;
+ QGraphicsItemPrivate *d = item->QGraphicsItem::d_func();
+ if (d->gestureContext.contains(gestureType)) {
+ result.append(item);
+ }
+ }
+ DEBUG() << "QGraphicsScenePrivate::getGestureTargets:"
+ << gesture << result;
+ if (result.size() == 1) {
+ normalGestures->insert(gesture, result.first());
+ } else if (!result.isEmpty()) {
+ conflictedGestures->insert(gestureType, gesture);
+ conflictedItems->append(result);
+ }
+ }
+ }
+}
+
+void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
+{
+ QWidget *viewport = event->widget();
+ if (!viewport)
+ return;
+ QList<QGesture *> allGestures = event->allGestures();
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "Delivering gestures:" << allGestures;
+
+ typedef QHash<QGraphicsObject *, QList<QGesture *> > GesturesPerItem;
+ GesturesPerItem gesturesPerItem;
+
+ QSet<QGesture *> startedGestures;
+ foreach (QGesture *gesture, allGestures) {
+ QGraphicsObject *target = gestureTargets.value(gesture, 0);
+ if (!target) {
+ // when we are not in started mode but don't have a target
+ // then the only one interested in gesture is the view/scene
+ if (gesture->state() == Qt::GestureStarted)
+ startedGestures.insert(gesture);
+ } else {
+ gesturesPerItem[target].append(gesture);
+ }
+ }
+
+ QMap<Qt::GestureType, QGesture *> conflictedGestures;
+ QList<QList<QGraphicsObject *> > conflictedItems;
+ QHash<QGesture *, QGraphicsObject *> normalGestures;
+ getGestureTargets(startedGestures, viewport, &conflictedGestures, &conflictedItems,
+ &normalGestures);
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "Conflicting gestures:" << conflictedGestures.values() << conflictedItems;
+ Q_ASSERT((conflictedGestures.isEmpty() && conflictedItems.isEmpty()) ||
+ (!conflictedGestures.isEmpty() && !conflictedItems.isEmpty()));
+
+ // gestures that were sent as override events, but no one accepted them
+ QHash<QGesture *, QGraphicsObject *> ignoredConflictedGestures;
+
+ // deliver conflicted gestures as override events first
+ while (!conflictedGestures.isEmpty() && !conflictedItems.isEmpty()) {
+ // get the topmost item to deliver the override event
+ Q_ASSERT(!conflictedItems.isEmpty());
+ Q_ASSERT(!conflictedItems.first().isEmpty());
+ QGraphicsObject *topmost = conflictedItems.first().first();
+ for (int i = 1; i < conflictedItems.size(); ++i) {
+ QGraphicsObject *item = conflictedItems.at(i).first();
+ if (qt_closestItemFirst(item, topmost)) {
+ topmost = item;
+ }
+ }
+ // get a list of gestures to send to the item
+ QList<Qt::GestureType> grabbedGestures =
+ topmost->QGraphicsItem::d_func()->gestureContext.keys();
+ QList<QGesture *> gestures;
+ for (int i = 0; i < grabbedGestures.size(); ++i) {
+ if (QGesture *g = conflictedGestures.value(grabbedGestures.at(i), 0)) {
+ gestures.append(g);
+ if (!ignoredConflictedGestures.contains(g))
+ ignoredConflictedGestures.insert(g, topmost);
+ }
+ }
+
+ // send gesture override to the topmost item
+ QGestureEvent ev(gestures);
+ ev.t = QEvent::GestureOverride;
+ ev.setWidget(event->widget());
+ // mark event and individual gestures as ignored
+ ev.ignore();
+ foreach(QGesture *g, gestures)
+ ev.setAccepted(g, false);
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "delivering override to"
+ << topmost << gestures;
+ sendEvent(topmost, &ev);
+ // mark all accepted gestures to deliver them as normal gesture events
+ foreach (QGesture *g, gestures) {
+ if (ev.isAccepted() || ev.isAccepted(g)) {
+ conflictedGestures.remove(g->gestureType());
+ gestureTargets.remove(g);
+ // add the gesture to the list of normal delivered gestures
+ normalGestures.insert(g, topmost);
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "override was accepted:"
+ << g << topmost;
+ ignoredConflictedGestures.remove(g);
+ }
+ }
+ // remove the item that we've already delivered from the list
+ for (int i = 0; i < conflictedItems.size(); ) {
+ QList<QGraphicsObject *> &items = conflictedItems[i];
+ if (items.first() == topmost) {
+ items.removeFirst();
+ if (items.isEmpty()) {
+ conflictedItems.removeAt(i);
+ continue;
+ }
+ }
+ ++i;
+ }
+ }
+
+ // put back those started gestures that are not in the conflicted state
+ // and remember their targets
+ QHash<QGesture *, QGraphicsObject *>::const_iterator it = normalGestures.begin(),
+ e = normalGestures.end();
+ for (; it != e; ++it) {
+ QGesture *g = it.key();
+ QGraphicsObject *receiver = it.value();
+ Q_ASSERT(!gestureTargets.contains(g));
+ gestureTargets.insert(g, receiver);
+ gesturesPerItem[receiver].append(g);
+ }
+ it = ignoredConflictedGestures.begin();
+ e = ignoredConflictedGestures.end();
+ for (; it != e; ++it) {
+ QGesture *g = it.key();
+ QGraphicsObject *receiver = it.value();
+ Q_ASSERT(!gestureTargets.contains(g));
+ gestureTargets.insert(g, receiver);
+ gesturesPerItem[receiver].append(g);
+ }
+
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "Started gestures:" << normalGestures.keys()
+ << "All gestures:" << gesturesPerItem.values();
+
+ // deliver all events
+ QList<QGesture *> alreadyIgnoredGestures;
+ QHash<QGraphicsObject *, QSet<QGesture *> > itemIgnoredGestures;
+ QList<QGraphicsObject *> targetItems = gesturesPerItem.keys();
+ qSort(targetItems.begin(), targetItems.end(), qt_closestItemFirst);
+ for (int i = 0; i < targetItems.size(); ++i) {
+ QGraphicsObject *item = targetItems.at(i);
+ QList<QGesture *> gestures = gesturesPerItem.value(item);
+ // remove gestures that were already delivered once and were ignored
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "already ignored gestures for item"
+ << item << ":" << itemIgnoredGestures.value(item);
+
+ if (itemIgnoredGestures.contains(item)) // don't deliver twice to the same item
+ continue;
+
+ QGraphicsItemPrivate *gid = item->QGraphicsItem::d_func();
+ foreach(QGesture *g, alreadyIgnoredGestures) {
+ if (gid->gestureContext.contains(g->gestureType()))
+ gestures += g;
+ }
+ if (gestures.isEmpty())
+ continue;
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "delivering to"
+ << item << gestures;
+ QGestureEvent ev(gestures);
+ ev.setWidget(event->widget());
+ sendEvent(item, &ev);
+ QSet<QGesture *> ignoredGestures;
+ foreach (QGesture *g, gestures) {
+ if (!ev.isAccepted() && !ev.isAccepted(g))
+ ignoredGestures.insert(g);
+ }
+ if (!ignoredGestures.isEmpty()) {
+ // get a list of items under the (current) hotspot of each ignored
+ // gesture and start delivery again from the beginning
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "item has ignored the event, will propagate."
+ << item << ignoredGestures;
+ itemIgnoredGestures[item] += ignoredGestures;
+ QMap<Qt::GestureType, QGesture *> conflictedGestures;
+ QList<QList<QGraphicsObject *> > itemsForConflictedGestures;
+ QHash<QGesture *, QGraphicsObject *> normalGestures;
+ getGestureTargets(ignoredGestures, viewport,
+ &conflictedGestures, &itemsForConflictedGestures,
+ &normalGestures);
+ QSet<QGraphicsObject *> itemsSet = targetItems.toSet();
+ for (int k = 0; k < itemsForConflictedGestures.size(); ++k)
+ itemsSet += itemsForConflictedGestures.at(k).toSet();
+ targetItems = itemsSet.toList();
+ qSort(targetItems.begin(), targetItems.end(), qt_closestItemFirst);
+ alreadyIgnoredGestures = conflictedGestures.values();
+ DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
+ << "new targets:" << targetItems;
+ i = -1; // start delivery again
+ continue;
+ }
+ }
+
+ // forget about targets for gestures that have ended
+ foreach (QGesture *g, allGestures) {
+ switch (g->state()) {
+ case Qt::GestureFinished:
+ case Qt::GestureCanceled:
+ gestureTargets.remove(g);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
QT_END_NAMESPACE
#include "moc_qgraphicsscene.cpp"
diff --git a/src/gui/graphicsview/qgraphicsscene.h b/src/gui/graphicsview/qgraphicsscene.h
index ba47530..d6d48d7 100644
--- a/src/gui/graphicsview/qgraphicsscene.h
+++ b/src/gui/graphicsview/qgraphicsscene.h
@@ -311,6 +311,7 @@ private:
friend class QGraphicsSceneBspTreeIndex;
friend class QGraphicsSceneBspTreeIndexPrivate;
friend class QGraphicsItemEffectSourcePrivate;
+ friend class QGesture;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsScene::SceneLayers)
diff --git a/src/gui/graphicsview/qgraphicsscene_p.h b/src/gui/graphicsview/qgraphicsscene_p.h
index 5000860..cd20fd0 100644
--- a/src/gui/graphicsview/qgraphicsscene_p.h
+++ b/src/gui/graphicsview/qgraphicsscene_p.h
@@ -108,7 +108,7 @@ public:
QPainterPath selectionArea;
int selectionChanging;
QSet<QGraphicsItem *> selectedItems;
- QList<QGraphicsItem *> unpolishedItems;
+ QSet<QGraphicsItem *> unpolishedItems;
QList<QGraphicsItem *> topLevelItems;
bool needSortTopLevelItems;
bool holesInTopLevelSiblingIndex;
@@ -282,6 +282,13 @@ public:
bool allItemsIgnoreTouchEvents;
void enableTouchEventsOnViews();
+ QHash<QGesture *, QGraphicsObject *> gestureTargets;
+ void gestureEventHandler(QGestureEvent *event);
+ void getGestureTargets(const QSet<QGesture *> &gestures, QWidget *viewport,
+ QMap<Qt::GestureType, QGesture *> *conflictedGestures,
+ QList<QList<QGraphicsObject *> > *conflictedItems,
+ QHash<QGesture *, QGraphicsObject *> *normalGestures);
+
void updateInputMethodSensitivityInViews();
QList<QGraphicsItem *> modalPanels;
diff --git a/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp b/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
index e21183a..47ae3f1 100644
--- a/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
+++ b/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
@@ -405,70 +405,6 @@ QList<QGraphicsItem *> QGraphicsSceneBspTreeIndexPrivate::estimateItems(const QR
}
/*!
- Returns true if \a item1 is on top of \a item2.
-
- \internal
-*/
-bool QGraphicsSceneBspTreeIndexPrivate::closestItemFirst_withoutCache(const QGraphicsItem *item1, const QGraphicsItem *item2)
-{
- // Siblings? Just check their z-values.
- const QGraphicsItemPrivate *d1 = item1->d_ptr.data();
- const QGraphicsItemPrivate *d2 = item2->d_ptr.data();
- if (d1->parent == d2->parent)
- return qt_closestLeaf(item1, item2);
-
- // Find common ancestor, and each item's ancestor closest to the common
- // ancestor.
- int item1Depth = d1->depth();
- int item2Depth = d2->depth();
- const QGraphicsItem *p = item1;
- const QGraphicsItem *t1 = item1;
- while (item1Depth > item2Depth && (p = p->d_ptr->parent)) {
- if (p == item2) {
- // item2 is one of item1's ancestors; item1 is on top
- return !(t1->d_ptr->flags & QGraphicsItem::ItemStacksBehindParent);
- }
- t1 = p;
- --item1Depth;
- }
- p = item2;
- const QGraphicsItem *t2 = item2;
- while (item2Depth > item1Depth && (p = p->d_ptr->parent)) {
- if (p == item1) {
- // item1 is one of item2's ancestors; item1 is not on top
- return (t2->d_ptr->flags & QGraphicsItem::ItemStacksBehindParent);
- }
- t2 = p;
- --item2Depth;
- }
-
- // item1Ancestor is now at the same level as item2Ancestor, but not the same.
- const QGraphicsItem *a1 = t1;
- const QGraphicsItem *a2 = t2;
- while (a1) {
- const QGraphicsItem *p1 = a1;
- const QGraphicsItem *p2 = a2;
- a1 = a1->parentItem();
- a2 = a2->parentItem();
- if (a1 && a1 == a2)
- return qt_closestLeaf(p1, p2);
- }
-
- // No common ancestor? Then just compare the items' toplevels directly.
- return qt_closestLeaf(t1->topLevelItem(), t2->topLevelItem());
-}
-
-/*!
- Returns true if \a item2 is on top of \a item1.
-
- \internal
-*/
-bool QGraphicsSceneBspTreeIndexPrivate::closestItemLast_withoutCache(const QGraphicsItem *item1, const QGraphicsItem *item2)
-{
- return closestItemFirst_withoutCache(item2, item1);
-}
-
-/*!
Sort a list of \a itemList in a specific \a order and use the cache if requested.
\internal
@@ -495,9 +431,9 @@ void QGraphicsSceneBspTreeIndexPrivate::sortItems(QList<QGraphicsItem *> *itemLi
}
} else {
if (order == Qt::DescendingOrder) {
- qSort(itemList->begin(), itemList->end(), closestItemFirst_withoutCache);
+ qSort(itemList->begin(), itemList->end(), qt_closestItemFirst);
} else if (order == Qt::AscendingOrder) {
- qSort(itemList->begin(), itemList->end(), closestItemLast_withoutCache);
+ qSort(itemList->begin(), itemList->end(), qt_closestItemLast);
}
}
}
diff --git a/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h b/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h
index 0a86bb7..c130190 100644
--- a/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h
+++ b/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.h
@@ -145,8 +145,6 @@ public:
QList<QGraphicsItem *> estimateItems(const QRectF &, Qt::SortOrder, bool b = false);
static void climbTree(QGraphicsItem *item, int *stackingOrder);
- static bool closestItemFirst_withoutCache(const QGraphicsItem *item1, const QGraphicsItem *item2);
- static bool closestItemLast_withoutCache(const QGraphicsItem *item1, const QGraphicsItem *item2);
static inline bool closestItemFirst_withCache(const QGraphicsItem *item1, const QGraphicsItem *item2)
{
diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp
index ec1a2f5..49d8999 100644
--- a/src/gui/graphicsview/qgraphicstransform.cpp
+++ b/src/gui/graphicsview/qgraphicstransform.cpp
@@ -547,7 +547,9 @@ void QGraphicsRotation::applyTo(QMatrix4x4 *matrix) const
return;
matrix->translate(d->origin);
- matrix->rotate(d->angle, d->axis.x(), d->axis.y(), d->axis.z());
+ QMatrix4x4 m;
+ m.rotate(d->angle, d->axis.x(), d->axis.y(), d->axis.z());
+ *matrix *= m.toTransform();
matrix->translate(-d->origin);
}
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp
index 32747cc..710c745 100644
--- a/src/gui/graphicsview/qgraphicsview.cpp
+++ b/src/gui/graphicsview/qgraphicsview.cpp
@@ -2701,6 +2701,19 @@ bool QGraphicsView::viewportEvent(QEvent *event)
return true;
}
+ case QEvent::Gesture:
+ case QEvent::GestureOverride:
+ {
+ if (!isEnabled())
+ return false;
+
+ if (d->scene && d->sceneInteractionAllowed) {
+ QGestureEvent *gestureEvent = static_cast<QGestureEvent *>(event);
+ gestureEvent->setWidget(viewport());
+ (void) QApplication::sendEvent(d->scene, gestureEvent);
+ }
+ return true;
+ }
default:
break;
}
diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp
index 5412e11..46c5431 100644
--- a/src/gui/image/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -78,6 +78,8 @@ static QString fallbackTheme()
return X11->desktopVersion >= 4
? QString::fromLatin1("oxygen")
: QString::fromLatin1("crystalsvg");
+ } else {
+ return QLatin1String("hicolor");
}
#endif
return QString();
@@ -87,6 +89,8 @@ QIconLoader::QIconLoader() :
m_themeKey(1), m_supportsSvg(false)
{
m_systemTheme = qt_guiPlatformPlugin()->systemIconThemeName();
+ if (m_systemTheme.isEmpty())
+ m_systemTheme = fallbackTheme();
QFactoryLoader iconFactoryLoader(QIconEngineFactoryInterfaceV2_iid,
QLatin1String("/iconengines"),
@@ -107,6 +111,8 @@ void QIconLoader::updateSystemTheme()
// Only change if this is not explicitly set by the user
if (m_userTheme.isEmpty()) {
QString theme = qt_guiPlatformPlugin()->systemIconThemeName();
+ if (theme.isEmpty())
+ theme = fallbackTheme();
if (theme != m_systemTheme) {
m_systemTheme = theme;
invalidateKey();
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 9048387..571ef9d 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -377,6 +377,9 @@ bool QImageData::checkForAlphaPixels() const
\note If you would like to load QImage objects in a static build of Qt,
refer to the \l{How To Create Qt Plugins#Static Plugins}{Plugin HowTo}.
+ \warning Painting on a QImage with the format
+ QImage::Format_Indexed8 is not supported.
+
\tableofcontents
\section1 Reading and Writing Image Files
@@ -543,11 +546,7 @@ bool QImageData::checkForAlphaPixels() const
Each pixel stored in a QImage is represented by an integer. The
size of the integer varies depending on the format. QImage
supports several image formats described by the \l Format
- enum. The monochrome (1-bit), 8-bit and 32-bit images are
- available in all versions of Qt. In addition Qt for Embedded Linux
- also supports 2-bit, 4-bit, and 16-bit images. For more information
- about the Qt Extended specific formats, see the documentation of the \l
- Format enum.
+ enum.
Monochrome images are stored using 1-bit indexes into a color table
with at most two colors. There are two different types of
@@ -704,9 +703,20 @@ bool QImageData::checkForAlphaPixels() const
packed with the most significant bit (MSB) first.
\value Format_MonoLSB The image is stored using 1-bit per pixel. Bytes are
packed with the less significant bit (LSB) first.
- \value Format_Indexed8 The image is stored using 8-bit indexes into a colormap.
+
+ \value Format_Indexed8 The image is stored using 8-bit indexes
+ into a colormap. \warning Drawing into a
+ QImage with Indexed8 format is not
+ supported.
+
\value Format_RGB32 The image is stored using a 32-bit RGB format (0xffRRGGBB).
- \value Format_ARGB32 The image is stored using a 32-bit ARGB format (0xAARRGGBB).
+
+ \value Format_ARGB32 The image is stored using a 32-bit ARGB
+ format (0xAARRGGBB). \warning Do not
+ render into ARGB32 images using
+ QPainter. Format_ARGB32_Premultiplied is
+ significantly faster.
+
\value Format_ARGB32_Premultiplied The image is stored using a premultiplied 32-bit
ARGB format (0xAARRGGBB), i.e. the red,
green, and blue channels are multiplied
@@ -715,7 +725,9 @@ bool QImageData::checkForAlphaPixels() const
undefined.) Certain operations (such as image composition
using alpha blending) are faster using premultiplied ARGB32
than with plain ARGB32.
+
\value Format_RGB16 The image is stored using a 16-bit RGB format (5-6-5).
+
\value Format_ARGB8565_Premultiplied The image is stored using a
premultiplied 24-bit ARGB format (8-5-6-5).
\value Format_RGB666 The image is stored using a 24-bit RGB format (6-6-6).
diff --git a/src/gui/image/qimagepixmapcleanuphooks.cpp b/src/gui/image/qimagepixmapcleanuphooks.cpp
index d08d3ef..ac30646 100644
--- a/src/gui/image/qimagepixmapcleanuphooks.cpp
+++ b/src/gui/image/qimagepixmapcleanuphooks.cpp
@@ -70,19 +70,30 @@ QImagePixmapCleanupHooks *QImagePixmapCleanupHooks::instance()
return qt_image_and_pixmap_cleanup_hooks;
}
-void QImagePixmapCleanupHooks::addPixmapHook(_qt_pixmap_cleanup_hook_pm hook)
+void QImagePixmapCleanupHooks::addPixmapModificationHook(_qt_pixmap_cleanup_hook_pm hook)
{
- pixmapHooks.append(hook);
+ pixmapModificationHooks.append(hook);
}
+void QImagePixmapCleanupHooks::addPixmapDestructionHook(_qt_pixmap_cleanup_hook_pm hook)
+{
+ pixmapDestructionHooks.append(hook);
+}
+
+
void QImagePixmapCleanupHooks::addImageHook(_qt_image_cleanup_hook_64 hook)
{
imageHooks.append(hook);
}
-void QImagePixmapCleanupHooks::removePixmapHook(_qt_pixmap_cleanup_hook_pm hook)
+void QImagePixmapCleanupHooks::removePixmapModificationHook(_qt_pixmap_cleanup_hook_pm hook)
+{
+ pixmapModificationHooks.removeAll(hook);
+}
+
+void QImagePixmapCleanupHooks::removePixmapDestructionHook(_qt_pixmap_cleanup_hook_pm hook)
{
- pixmapHooks.removeAll(hook);
+ pixmapDestructionHooks.removeAll(hook);
}
void QImagePixmapCleanupHooks::removeImageHook(_qt_image_cleanup_hook_64 hook)
@@ -91,18 +102,29 @@ void QImagePixmapCleanupHooks::removeImageHook(_qt_image_cleanup_hook_64 hook)
}
-void QImagePixmapCleanupHooks::executePixmapHooks(QPixmap* pm)
+void QImagePixmapCleanupHooks::executePixmapModificationHooks(QPixmap* pm)
{
- for (int i = 0; i < qt_image_and_pixmap_cleanup_hooks->pixmapHooks.count(); ++i)
- qt_image_and_pixmap_cleanup_hooks->pixmapHooks[i](pm);
+ Q_ASSERT(qt_image_and_pixmap_cleanup_hooks);
+ for (int i = 0; i < qt_image_and_pixmap_cleanup_hooks->pixmapModificationHooks.count(); ++i)
+ qt_image_and_pixmap_cleanup_hooks->pixmapModificationHooks[i](pm);
if (qt_pixmap_cleanup_hook_64)
qt_pixmap_cleanup_hook_64(pm->cacheKey());
}
+void QImagePixmapCleanupHooks::executePixmapDestructionHooks(QPixmap* pm)
+{
+ Q_ASSERT(qt_image_and_pixmap_cleanup_hooks);
+ for (int i = 0; i < qt_image_and_pixmap_cleanup_hooks->pixmapDestructionHooks.count(); ++i)
+ qt_image_and_pixmap_cleanup_hooks->pixmapDestructionHooks[i](pm);
+
+ if (qt_pixmap_cleanup_hook_64)
+ qt_pixmap_cleanup_hook_64(pm->cacheKey());
+}
void QImagePixmapCleanupHooks::executeImageHooks(qint64 key)
{
+ Q_ASSERT(qt_image_and_pixmap_cleanup_hooks);
for (int i = 0; i < qt_image_and_pixmap_cleanup_hooks->imageHooks.count(); ++i)
qt_image_and_pixmap_cleanup_hooks->imageHooks[i](key);
diff --git a/src/gui/image/qimagepixmapcleanuphooks_p.h b/src/gui/image/qimagepixmapcleanuphooks_p.h
index dd2d0f7..16c8974 100644
--- a/src/gui/image/qimagepixmapcleanuphooks_p.h
+++ b/src/gui/image/qimagepixmapcleanuphooks_p.h
@@ -70,18 +70,27 @@ public:
static QImagePixmapCleanupHooks *instance();
- void addPixmapHook(_qt_pixmap_cleanup_hook_pm);
+ // Gets called when a pixmap is about to be modified:
+ void addPixmapModificationHook(_qt_pixmap_cleanup_hook_pm);
+
+ // Gets called when a pixmap is about to be destroyed:
+ void addPixmapDestructionHook(_qt_pixmap_cleanup_hook_pm);
+
+ // Gets called when an image is about to be modified or destroyed:
void addImageHook(_qt_image_cleanup_hook_64);
- void removePixmapHook(_qt_pixmap_cleanup_hook_pm);
+ void removePixmapModificationHook(_qt_pixmap_cleanup_hook_pm);
+ void removePixmapDestructionHook(_qt_pixmap_cleanup_hook_pm);
void removeImageHook(_qt_image_cleanup_hook_64);
- static void executePixmapHooks(QPixmap*);
+ static void executePixmapModificationHooks(QPixmap*);
+ static void executePixmapDestructionHooks(QPixmap*);
static void executeImageHooks(qint64 key);
private:
QList<_qt_image_cleanup_hook_64> imageHooks;
- QList<_qt_pixmap_cleanup_hook_pm> pixmapHooks;
+ QList<_qt_pixmap_cleanup_hook_pm> pixmapModificationHooks;
+ QList<_qt_pixmap_cleanup_hook_pm> pixmapDestructionHooks;
};
QT_END_NAMESPACE
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 558ae54..a3b7516 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -322,8 +322,9 @@ QPixmap::QPixmap(const char * const xpm[])
QPixmap::~QPixmap()
{
- if (data->is_cached && data->ref == 1)
- QImagePixmapCleanupHooks::executePixmapHooks(this);
+ Q_ASSERT(data->ref >= 1); // Catch if ref-counting changes again
+ if (data->is_cached && data->ref == 1) // ref will be decrememnted after destructor returns
+ QImagePixmapCleanupHooks::executePixmapDestructionHooks(this);
}
/*!
@@ -361,13 +362,7 @@ QPixmap QPixmap::copy(const QRect &rect) const
const QRect r = rect.isEmpty() ? QRect(0, 0, width(), height()) : rect;
- QPixmapData *d;
- QGraphicsSystem* gs = QApplicationPrivate::graphicsSystem();
- if (gs)
- d = gs->createPixmapData(data->pixelType());
- else
- d = QGraphicsSystem::createDefaultPixmapData(data->pixelType());
-
+ QPixmapData *d = data->createCompatiblePixmapData();
d->copy(data.data(), r);
return QPixmap(d);
}
@@ -475,9 +470,11 @@ QPixmap::operator QVariant() const
conversion fails.
If the pixmap has 1-bit depth, the returned image will also be 1
- bit deep. If the pixmap has 2- to 8-bit depth, the returned image
- has 8-bit depth. If the pixmap has greater than 8-bit depth, the
- returned image has 32-bit depth.
+ bit deep. Images with more bits will be returned in a format
+ closely represents the underlying system. Usually this will be
+ QImage::Format_ARGB32_Premultiplied for pixmaps with an alpha and
+ QImage::Format_RGB32 or QImage::Format_RGB16 for pixmaps without
+ alpha.
Note that for the moment, alpha masks on monochrome images are
ignored.
@@ -947,6 +944,9 @@ bool QPixmap::doImageIO(QImageWriter *writer, int quality) const
/*!
Fills the pixmap with the given \a color.
+ The effect of this function is undefined when the pixmap is
+ being painted on.
+
\sa {QPixmap#Pixmap Transformations}{Pixmap Transformations}
*/
@@ -955,7 +955,24 @@ void QPixmap::fill(const QColor &color)
if (isNull())
return;
- detach();
+ // Some people are probably already calling fill while a painter is active, so to not break
+ // their programs, only print a warning and return when the fill operation could cause a crash.
+ if (paintingActive() && (color.alpha() != 255) && !hasAlphaChannel()) {
+ qWarning("QPixmap::fill: Cannot fill while pixmap is being painted on");
+ return;
+ }
+
+ if (data->ref == 1) {
+ // detach() will also remove this pixmap from caches, so
+ // it has to be called even when ref == 1.
+ detach();
+ } else {
+ // Don't bother to make a copy of the data object, since
+ // it will be filled with new pixel data anyway.
+ QPixmapData *d = data->createCompatiblePixmapData();
+ d->resize(data->width(), data->height());
+ data = d;
+ }
data->fill(color);
}
@@ -1663,10 +1680,10 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode)
identifies the contents of the QPixmap object.
The x11Info() function returns information about the configuration
- of the X display used to display the widget. The
- x11PictureHandle() function returns the X11 Picture handle of the
- pixmap for XRender support. Note that the two latter functions are
- only available on x11.
+ of the X display used by the screen to which the pixmap currently
+ belongs. The x11PictureHandle() function returns the X11 Picture
+ handle of the pixmap for XRender support. Note that the two latter
+ functions are only available on x11.
\endtable
@@ -1689,8 +1706,8 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode)
In addition, on Symbian, the QPixmap class supports conversion to
and from CFbsBitmap: the toSymbianCFbsBitmap() function creates
- CFbsBitmap equivalent to the QPixmap, based on given mode and returns
- a CFbsBitmap object. The fromSymbianCFbsBitmap() function returns a
+ CFbsBitmap equivalent to the QPixmap, based on given mode and returns
+ a CFbsBitmap object. The fromSymbianCFbsBitmap() function returns a
QPixmap that is equivalent to the given bitmap and given mode.
\section1 Pixmap Transformations
@@ -1903,7 +1920,7 @@ void QPixmap::detach()
}
if (data->is_cached && data->ref == 1)
- QImagePixmapCleanupHooks::executePixmapHooks(this);
+ QImagePixmapCleanupHooks::executePixmapModificationHooks(this);
#if defined(Q_WS_MAC)
QMacPixmapData *macData = id == QPixmapData::MacClass ? static_cast<QMacPixmapData*>(data.data()) : 0;
@@ -2084,7 +2101,7 @@ QPixmapData* QPixmap::pixmapData() const
/*! \fn const QX11Info &QPixmap::x11Info() const
\bold{X11 only:} Returns information about the configuration of
- the X display used to display the widget.
+ the X display used by the screen to which the pixmap currently belongs.
\warning This function is only available on X11.
diff --git a/src/gui/image/qpixmap_mac.cpp b/src/gui/image/qpixmap_mac.cpp
index de532fd..afa6f83 100644
--- a/src/gui/image/qpixmap_mac.cpp
+++ b/src/gui/image/qpixmap_mac.cpp
@@ -166,6 +166,11 @@ QMacPixmapData::QMacPixmapData(PixelType type)
{
}
+QPixmapData *QMacPixmapData::createCompatiblePixmapData() const
+{
+ return new QMacPixmapData(pixelType());
+}
+
#define BEST_BYTE_ALIGNMENT 16
#define COMPTUE_BEST_BYTES_PER_ROW(bpr) \
(((bpr) + (BEST_BYTE_ALIGNMENT - 1)) & ~(BEST_BYTE_ALIGNMENT - 1))
diff --git a/src/gui/image/qpixmap_mac_p.h b/src/gui/image/qpixmap_mac_p.h
index 528dd1f..a3fb95f 100644
--- a/src/gui/image/qpixmap_mac_p.h
+++ b/src/gui/image/qpixmap_mac_p.h
@@ -65,6 +65,8 @@ public:
QMacPixmapData(PixelType type);
~QMacPixmapData();
+ QPixmapData *createCompatiblePixmapData() const;
+
void resize(int width, int height);
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
void copy(const QPixmapData *data, const QRect &rect);
diff --git a/src/gui/image/qpixmap_raster.cpp b/src/gui/image/qpixmap_raster.cpp
index ad68b07..fc76dc3 100644
--- a/src/gui/image/qpixmap_raster.cpp
+++ b/src/gui/image/qpixmap_raster.cpp
@@ -55,6 +55,29 @@ QT_BEGIN_NAMESPACE
const uchar qt_pixmap_bit_mask[] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80 };
+QPixmap qt_toRasterPixmap(const QImage &image)
+{
+ QPixmapData *data =
+ new QRasterPixmapData(image.depth() == 1
+ ? QPixmapData::BitmapType
+ : QPixmapData::PixmapType);
+
+ data->fromImage(image, Qt::AutoColor);
+
+ return QPixmap(data);
+}
+
+QPixmap qt_toRasterPixmap(const QPixmap &pixmap)
+{
+ if (pixmap.isNull())
+ return QPixmap();
+
+ if (QPixmap(pixmap).data_ptr()->classId() == QPixmapData::RasterClass)
+ return pixmap;
+
+ return qt_toRasterPixmap(pixmap.toImage());
+}
+
QRasterPixmapData::QRasterPixmapData(PixelType type)
: QPixmapData(type, RasterClass)
{
@@ -64,6 +87,11 @@ QRasterPixmapData::~QRasterPixmapData()
{
}
+QPixmapData *QRasterPixmapData::createCompatiblePixmapData() const
+{
+ return new QRasterPixmapData(pixelType());
+}
+
void QRasterPixmapData::resize(int width, int height)
{
QImage::Format format;
diff --git a/src/gui/image/qpixmap_raster_p.h b/src/gui/image/qpixmap_raster_p.h
index da0405e..1553940 100644
--- a/src/gui/image/qpixmap_raster_p.h
+++ b/src/gui/image/qpixmap_raster_p.h
@@ -68,6 +68,8 @@ public:
QRasterPixmapData(PixelType type);
~QRasterPixmapData();
+ QPixmapData *createCompatiblePixmapData() const;
+
void resize(int width, int height);
void fromFile(const QString &filename, Qt::ImageConversionFlags flags);
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
diff --git a/src/gui/image/qpixmap_s60.cpp b/src/gui/image/qpixmap_s60.cpp
index 554c0f3..666d608 100644
--- a/src/gui/image/qpixmap_s60.cpp
+++ b/src/gui/image/qpixmap_s60.cpp
@@ -496,11 +496,12 @@ void QS60PixmapData::fromImage(const QImage &img, Qt::ImageConversionFlags flags
mode = EColor16MU;
break;
case QImage::Format_ARGB32_Premultiplied:
-#if !defined(__SERIES60_31__) && !defined(__S60_32__)
- mode = EColor16MAP;
- break;
-#endif
- destFormat = QImage::Format_ARGB32;
+ if (S60->supportsPremultipliedAlpha) {
+ mode = Q_SYMBIAN_ECOLOR16MAP;
+ break;
+ } else {
+ destFormat = QImage::Format_ARGB32;
+ }
// Fall through intended
case QImage::Format_ARGB32:
mode = EColor16MA;
@@ -690,6 +691,10 @@ void QS60PixmapData::beginDataAccess()
bytes = newBytes;
TDisplayMode mode = cfbsBitmap->DisplayMode();
QImage::Format format = qt_TDisplayMode2Format(mode);
+ //on S60 3.1, premultiplied alpha pixels are stored in a bitmap with 16MA type
+ if (format == QImage::Format_ARGB32)
+ format = QImage::Format_ARGB32_Premultiplied; // pixel data is actually in premultiplied format
+
TSize size = cfbsBitmap->SizeInPixels();
QVector<QRgb> savedColorTable;
@@ -716,6 +721,8 @@ void QS60PixmapData::beginDataAccess()
void QS60PixmapData::endDataAccess(bool readOnly) const
{
+ Q_UNUSED(readOnly);
+
if(!cfbsBitmap)
return;
@@ -792,8 +799,8 @@ void* QS60PixmapData::toNativeType(NativeType type)
bool needsCopy = false;
QSysInfo::SymbianVersion symbianVersion = QSysInfo::symbianVersion();
- if (symbianVersion == QSysInfo::SV_9_2 || symbianVersion == QSysInfo::SV_9_3) {
- // Convert argb32_premultiplied to argb32 since Symbian 9.2 and Symbian 9.3 do
+ if (!(S60->supportsPremultipliedAlpha)) {
+ // Convert argb32_premultiplied to argb32 since Symbian 9.2 does
// not support premultipied format.
if (image.format() == QImage::Format_ARGB32_Premultiplied) {
diff --git a/src/gui/image/qpixmap_x11.cpp b/src/gui/image/qpixmap_x11.cpp
index 74543a0..ea9eff9 100644
--- a/src/gui/image/qpixmap_x11.cpp
+++ b/src/gui/image/qpixmap_x11.cpp
@@ -319,6 +319,11 @@ QX11PixmapData::QX11PixmapData(PixelType type)
{
}
+QPixmapData *QX11PixmapData::createCompatiblePixmapData() const
+{
+ return new QX11PixmapData(pixelType());
+}
+
void QX11PixmapData::resize(int width, int height)
{
setSerialNumber(++qt_pixmap_serial);
diff --git a/src/gui/image/qpixmap_x11_p.h b/src/gui/image/qpixmap_x11_p.h
index e34e690..8ce7c0d 100644
--- a/src/gui/image/qpixmap_x11_p.h
+++ b/src/gui/image/qpixmap_x11_p.h
@@ -71,6 +71,8 @@ public:
// Qt::ImageConversionFlags flags);
~QX11PixmapData();
+ QPixmapData *createCompatiblePixmapData() const;
+
void resize(int width, int height);
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
void copy(const QPixmapData *data, const QRect &rect);
@@ -101,6 +103,7 @@ private:
friend class QRasterWindowSurface;
friend class QGLContextPrivate; // Needs to access xinfo, gl_surface & flags
friend class QEglContext; // Needs gl_surface
+ friend class QX11GLPixmapData; // Needs gl_surface
friend bool qt_createEGLSurfaceForPixmap(QPixmapData*, bool); // Needs gl_surface
void release();
diff --git a/src/gui/image/qpixmapcache.cpp b/src/gui/image/qpixmapcache.cpp
index f12d397..b0b7d72 100644
--- a/src/gui/image/qpixmapcache.cpp
+++ b/src/gui/image/qpixmapcache.cpp
@@ -221,6 +221,7 @@ QPMCache::QPMCache()
}
QPMCache::~QPMCache()
{
+ clear();
free(keyArray);
}
diff --git a/src/gui/image/qpixmapdata.cpp b/src/gui/image/qpixmapdata.cpp
index 93fc2eb..1ad1f02 100644
--- a/src/gui/image/qpixmapdata.cpp
+++ b/src/gui/image/qpixmapdata.cpp
@@ -43,6 +43,8 @@
#include <QtCore/qbuffer.h>
#include <QtGui/qbitmap.h>
#include <QtGui/qimagereader.h>
+#include <private/qgraphicssystem_p.h>
+#include <private/qapplication_p.h>
QT_BEGIN_NAMESPACE
@@ -67,6 +69,17 @@ QPixmapData::~QPixmapData()
{
}
+QPixmapData *QPixmapData::createCompatiblePixmapData() const
+{
+ QPixmapData *d;
+ QGraphicsSystem *gs = QApplicationPrivate::graphicsSystem();
+ if (gs)
+ d = gs->createPixmapData(pixelType());
+ else
+ d = QGraphicsSystem::createDefaultPixmapData(pixelType());
+ return d;
+}
+
static QImage makeBitmapCompliantIfNeeded(QPixmapData *d, const QImage &image, Qt::ImageConversionFlags flags)
{
if (d->pixelType() == QPixmapData::BitmapType) {
diff --git a/src/gui/image/qpixmapdata_p.h b/src/gui/image/qpixmapdata_p.h
index c26fba3..2f4f201 100644
--- a/src/gui/image/qpixmapdata_p.h
+++ b/src/gui/image/qpixmapdata_p.h
@@ -75,9 +75,11 @@ public:
enum ClassId { RasterClass, X11Class, MacClass, DirectFBClass,
OpenGLClass, OpenVGClass, CustomClass = 1024 };
- QPixmapData(PixelType pixelpType, int classId);
+ QPixmapData(PixelType pixelType, int classId);
virtual ~QPixmapData();
+ virtual QPixmapData *createCompatiblePixmapData() const;
+
virtual void resize(int width, int height) = 0;
virtual void fromImage(const QImage &image,
Qt::ImageConversionFlags flags) = 0;
diff --git a/src/gui/image/qpixmapfilter.cpp b/src/gui/image/qpixmapfilter.cpp
index df445db..9fcf776 100644
--- a/src/gui/image/qpixmapfilter.cpp
+++ b/src/gui/image/qpixmapfilter.cpp
@@ -591,7 +591,7 @@ QRectF QPixmapBlurFilter::boundingRectFor(const QRectF &rect) const
// Blur the image according to the blur radius
// Based on exponential blur algorithm by Jani Huhtanen
// (maximum radius is set to 16)
-static QImage blurred(const QImage& image, const QRect& rect, int radius)
+static QImage blurred(const QImage& image, const QRect& rect, int radius, bool alphaOnly = false)
{
int tab[] = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 };
int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius-1];
@@ -606,47 +606,53 @@ static QImage blurred(const QImage& image, const QRect& rect, int radius)
int rgba[4];
unsigned char* p;
+ int i1 = 0;
+ int i2 = 3;
+
+ if (alphaOnly)
+ i1 = i2 = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3);
+
for (int col = c1; col <= c2; col++) {
p = result.scanLine(r1) + col * 4;
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
rgba[i] = p[i] << 4;
p += bpl;
for (int j = r1; j < r2; j++, p += bpl)
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int row = r1; row <= r2; row++) {
p = result.scanLine(row) + c1 * 4;
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
rgba[i] = p[i] << 4;
p += 4;
for (int j = c1; j < c2; j++, p += 4)
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int col = c1; col <= c2; col++) {
p = result.scanLine(r2) + col * 4;
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
rgba[i] = p[i] << 4;
p -= bpl;
for (int j = r1; j < r2; j++, p -= bpl)
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
for (int row = r1; row <= r2; row++) {
p = result.scanLine(row) + c2 * 4;
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
rgba[i] = p[i] << 4;
p -= 4;
for (int j = c1; j < c2; j++, p -= 4)
- for (int i = 0; i < 4; i++)
+ for (int i = i1; i <= i2; i++)
p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4;
}
@@ -892,11 +898,11 @@ class QPixmapDropShadowFilterPrivate : public QPixmapFilterPrivate
{
public:
QPixmapDropShadowFilterPrivate()
- : offset(8, 8), color(63, 63, 63, 180), blurFilter(new QPixmapBlurFilter) {}
+ : offset(8, 8), color(63, 63, 63, 180), radius(1) {}
QPointF offset;
QColor color;
- QPixmapBlurFilter *blurFilter;
+ int radius;
};
/*!
@@ -940,8 +946,6 @@ public:
QPixmapDropShadowFilter::QPixmapDropShadowFilter(QObject *parent)
: QPixmapFilter(*new QPixmapDropShadowFilterPrivate, DropShadowFilter, parent)
{
- Q_D(QPixmapDropShadowFilter);
- d->blurFilter->setRadius(1);
}
/*!
@@ -951,8 +955,6 @@ QPixmapDropShadowFilter::QPixmapDropShadowFilter(QObject *parent)
*/
QPixmapDropShadowFilter::~QPixmapDropShadowFilter()
{
- Q_D(QPixmapDropShadowFilter);
- delete d->blurFilter;
}
/*!
@@ -967,7 +969,7 @@ QPixmapDropShadowFilter::~QPixmapDropShadowFilter()
int QPixmapDropShadowFilter::blurRadius() const
{
Q_D(const QPixmapDropShadowFilter);
- return d->blurFilter->radius();
+ return d->radius;
}
/*!
@@ -982,7 +984,7 @@ int QPixmapDropShadowFilter::blurRadius() const
void QPixmapDropShadowFilter::setBlurRadius(int radius)
{
Q_D(QPixmapDropShadowFilter);
- d->blurFilter->setRadius(radius);
+ d->radius = radius;
}
/*!
@@ -1056,7 +1058,7 @@ QRectF QPixmapDropShadowFilter::boundingRectFor(const QRectF &rect) const
{
Q_D(const QPixmapDropShadowFilter);
- const qreal delta = qreal(d->blurFilter->radius() * 2);
+ const qreal delta = qreal(d->radius * 2);
qreal x1 = qMin(rect.left(), rect.left() + d->offset.x() - delta);
qreal y1 = qMin(rect.top(), rect.top() + d->offset.y() - delta);
qreal x2 = qMax(rect.right(), rect.right() + d->offset.x() + delta);
@@ -1079,24 +1081,25 @@ void QPixmapDropShadowFilter::draw(QPainter *p,
QPixmapDropShadowFilter *dropShadowFilter = static_cast<QPixmapDropShadowFilter*>(filter);
if (dropShadowFilter) {
dropShadowFilter->setColor(d->color);
- dropShadowFilter->setBlurRadius(d->blurFilter->radius());
+ dropShadowFilter->setBlurRadius(d->radius);
dropShadowFilter->setOffset(d->offset);
dropShadowFilter->draw(p, pos, px, src);
return;
}
- QImage tmp = src.isNull() ? px.toImage() : px.copy(src.toRect()).toImage();
- QPainter tmpPainter(&tmp);
+ QImage tmp = src.isNull() ? px.toImage() : px.copy(src.toAlignedRect()).toImage();
+
+ // blur the alpha channel
+ tmp = blurred(tmp, tmp.rect(), d->radius, true);
// blacken the image...
+ QPainter tmpPainter(&tmp);
tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
tmpPainter.fillRect(0, 0, tmp.width(), tmp.height(), d->color);
tmpPainter.end();
- const QPixmap pixTmp = QPixmap::fromImage(tmp);
-
// draw the blurred drop shadow...
- d->blurFilter->draw(p, pos + d->offset, pixTmp);
+ p->drawImage(pos + d->offset, tmp);
// Draw the actual pixmap...
p->drawPixmap(pos, px, src);
diff --git a/src/gui/inputmethod/qinputcontext.cpp b/src/gui/inputmethod/qinputcontext.cpp
index 8ee417f..ea6ed35 100644
--- a/src/gui/inputmethod/qinputcontext.cpp
+++ b/src/gui/inputmethod/qinputcontext.cpp
@@ -467,32 +467,32 @@ bool QInputContext::x11FilterEvent(QWidget * /*keywidget*/, XEvent * /*event*/)
}
#endif // Q_WS_X11
-#ifdef Q_WS_S60
+#ifdef Q_OS_SYMBIAN
/*!
\since 4.6
This function may be overridden only if input method is depending
- on Symbian and you need raw TWsEvent. Otherwise, this function must not.
+ on Symbian and you need raw Symbian events. Otherwise, this function must not.
- This function is designed to filter raw key events on S60, but
+ This function is designed to filter raw key events on Symbian, but
other input methods may use this to implement some special
features.
Return true if the \a event has been consumed. Otherwise, the
unfiltered \a event will be translated into QEvent and forwarded
- to filterEvent(). Filtering at both s60FilterEvent() and
+ to filterEvent(). Filtering at both symbianFilterEvent() and
filterEvent() in single input method is allowed.
\a keywidget is a client widget into which a text is inputted. \a
- event is inputted TWsEvent.
+ event is inputted QSymbianEvent.
\sa filterEvent()
*/
-bool QInputContext::s60FilterEvent(QWidget * /*keywidget*/, TWsEvent * /*event*/)
+bool QInputContext::symbianFilterEvent(QWidget * /*keywidget*/, const QSymbianEvent * /*event*/)
{
return false;
}
-#endif // Q_WS_S60
+#endif // Q_OS_SYMBIAN
QT_END_NAMESPACE
diff --git a/src/gui/inputmethod/qinputcontext.h b/src/gui/inputmethod/qinputcontext.h
index 73b05d8..14096e3 100644
--- a/src/gui/inputmethod/qinputcontext.h
+++ b/src/gui/inputmethod/qinputcontext.h
@@ -67,10 +67,6 @@
QT_BEGIN_HEADER
-#ifdef Q_WS_S60
-class TWsEvent;
-#endif
-
QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
@@ -79,6 +75,9 @@ class QWidget;
class QFont;
class QPopupMenu;
class QInputContextPrivate;
+#ifdef Q_OS_SYMBIAN
+class QSymbianEvent;
+#endif
class Q_GUI_EXPORT QInputContext : public QObject
{
@@ -108,9 +107,9 @@ public:
#if defined(Q_WS_X11)
virtual bool x11FilterEvent( QWidget *keywidget, XEvent *event );
#endif // Q_WS_X11
-#if defined(Q_WS_S60)
- virtual bool s60FilterEvent( QWidget *keywidget, TWsEvent *event );
-#endif // Q_WS_S60
+#if defined(Q_OS_SYMBIAN)
+ virtual bool symbianFilterEvent( QWidget *keywidget, const QSymbianEvent *event );
+#endif // Q_OS_SYMBIAN
virtual bool filterEvent( const QEvent *event );
void sendEvent(const QInputMethodEvent &event);
diff --git a/src/gui/inputmethod/qmacinputcontext_mac.cpp b/src/gui/inputmethod/qmacinputcontext_mac.cpp
index 116d233..994edb9 100644
--- a/src/gui/inputmethod/qmacinputcontext_mac.cpp
+++ b/src/gui/inputmethod/qmacinputcontext_mac.cpp
@@ -217,7 +217,11 @@ QMacInputContext::globalEventProcessor(EventHandlerCallRef, EventRef event, void
case kEventClassTextInput: {
handled_event = false;
QWidget *widget = QApplicationPrivate::focus_widget;
- if(!widget || (context && widget->inputContext() != context)) {
+ bool canCompose = widget && (!context || widget->inputContext() == context)
+ && !(widget->inputMethodHints() & Qt::ImhDigitsOnly
+ || widget->inputMethodHints() & Qt::ImhFormattedNumbersOnly
+ || widget->inputMethodHints() & Qt::ImhHiddenText);
+ if(!canCompose) {
handled_event = false;
} else if(ekind == kEventTextInputOffsetToPos) {
if(!widget->testAttribute(Qt::WA_InputMethodEnabled)) {
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp
index 37f4184..d91cedd 100644
--- a/src/gui/itemviews/qabstractitemview.cpp
+++ b/src/gui/itemviews/qabstractitemview.cpp
@@ -1697,7 +1697,7 @@ void QAbstractItemView::mouseMoveEvent(QMouseEvent *event)
if ((event->buttons() & Qt::LeftButton) && d->selectionAllowed(index) && d->selectionModel) {
setState(DragSelectingState);
QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
- if (command.testFlag(QItemSelectionModel::Toggle)) {
+ if (d->ctrlDragSelectionFlag != QItemSelectionModel::NoUpdate && command.testFlag(QItemSelectionModel::Toggle)) {
command &= ~QItemSelectionModel::Toggle;
command |= d->ctrlDragSelectionFlag;
}
@@ -2185,6 +2185,9 @@ void QAbstractItemView::keyPressEvent(QKeyEvent *event)
} else {
d->selectionModel->setCurrentIndex(newCurrent, command);
d->pressedPosition = visualRect(newCurrent).center() + d->offset();
+ // We copy the same behaviour as for mousePressEvent().
+ QRect rect(d->pressedPosition - d->offset(), QSize(1, 1));
+ setSelection(rect, command);
}
return;
}
@@ -3026,7 +3029,7 @@ void QAbstractItemView::update(const QModelIndex &index)
//this test is important for peformance reason
//For example in dataChanged we simply update all the cells without checking
//it can be a major bottleneck to update rects that aren't even part of the viewport
- if (d->viewport->geometry().intersects(rect))
+ if (d->viewport->rect().intersects(rect))
d->viewport->update(rect);
}
}
diff --git a/src/gui/itemviews/qheaderview.cpp b/src/gui/itemviews/qheaderview.cpp
index a754579..fc9820f 100644
--- a/src/gui/itemviews/qheaderview.cpp
+++ b/src/gui/itemviews/qheaderview.cpp
@@ -524,10 +524,8 @@ QSize QHeaderView::sizeHint() const
Q_D(const QHeaderView);
if (d->cachedSizeHint.isValid())
return d->cachedSizeHint;
- int width = 0;
- int height = 0;
+ d->cachedSizeHint = QSize(0, 0); //reinitialize the cached size hint
const int sectionCount = count();
- d->executePostedLayout();
// get size hint for the first n sections
int i = 0;
diff --git a/src/gui/itemviews/qlistview.cpp b/src/gui/itemviews/qlistview.cpp
index 9b0b00f..f58f458 100644
--- a/src/gui/itemviews/qlistview.cpp
+++ b/src/gui/itemviews/qlistview.cpp
@@ -1105,13 +1105,13 @@ QModelIndex QListView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifie
++row;
if (row >= rowCount)
return QModelIndex();
- return d->model->index(row, 0, d->root);
+ return d->model->index(row, d->column, d->root);
}
const QRect initialRect = rectForIndex(current);
QRect rect = initialRect;
if (rect.isEmpty()) {
- return d->model->index(0, 0, d->root);
+ return d->model->index(0, d->column, d->root);
}
if (d->gridSize().isValid()) rect.setSize(d->gridSize());
@@ -1900,7 +1900,7 @@ void QListModeViewBase::updateVerticalScrollBar(const QSize &step)
if (verticalScrollMode() == QAbstractItemView::ScrollPerItem
&& ((flow() == QListView::TopToBottom && !isWrapping())
|| (flow() == QListView::LeftToRight && isWrapping()))) {
- const int steps = (flow() == QListView::TopToBottom ? flowPositions : segmentPositions).count() - 1;
+ const int steps = (flow() == QListView::TopToBottom ? scrollValueMap : segmentPositions).count() - 1;
if (steps > 0) {
const int pageSteps = perItemScrollingPageSteps(viewport()->height(), contentsSize.height(), isWrapping());
verticalScrollBar()->setSingleStep(1);
@@ -1921,7 +1921,7 @@ void QListModeViewBase::updateHorizontalScrollBar(const QSize &step)
if (horizontalScrollMode() == QAbstractItemView::ScrollPerItem
&& ((flow() == QListView::TopToBottom && isWrapping())
|| (flow() == QListView::LeftToRight && !isWrapping()))) {
- int steps = (flow() == QListView::TopToBottom ? segmentPositions : flowPositions).count() - 1;
+ int steps = (flow() == QListView::TopToBottom ? segmentPositions : scrollValueMap).count() - 1;
if (steps > 0) {
const int pageSteps = perItemScrollingPageSteps(viewport()->width(), contentsSize.width(), isWrapping());
horizontalScrollBar()->setSingleStep(1);
@@ -1939,7 +1939,11 @@ int QListModeViewBase::verticalScrollToValue(int index, QListView::ScrollHint hi
bool above, bool below, const QRect &area, const QRect &rect) const
{
if (verticalScrollMode() == QAbstractItemView::ScrollPerItem) {
- int value = qBound(0, verticalScrollBar()->value(), flowPositions.count() - 1);
+ int value;
+ if (scrollValueMap.isEmpty())
+ value = 0;
+ else
+ value = qBound(0, scrollValueMap.at(verticalScrollBar()->value()), flowPositions.count() - 1);
if (above)
hint = QListView::PositionAtTop;
else if (below)
@@ -1966,8 +1970,8 @@ int QListModeViewBase::horizontalOffset() const
return (isRightToLeft() ? maximum - position : position);
}
} else if (flow() == QListView::LeftToRight && !flowPositions.isEmpty()) {
- int position = flowPositions.at(horizontalScrollBar()->value());
- int maximum = flowPositions.at(horizontalScrollBar()->maximum());
+ int position = flowPositions.at(scrollValueMap.at(horizontalScrollBar()->value()));
+ int maximum = flowPositions.at(scrollValueMap.at(horizontalScrollBar()->maximum()));
return (isRightToLeft() ? maximum - position : position);
}
}
@@ -1986,9 +1990,9 @@ int QListModeViewBase::verticalOffset() const
}
} else if (flow() == QListView::TopToBottom && !flowPositions.isEmpty()) {
int value = verticalScrollBar()->value();
- if (value > flowPositions.count())
+ if (value > scrollValueMap.count())
return 0;
- return flowPositions.at(value) - spacing();
+ return flowPositions.at(scrollValueMap.at(value)) - spacing();
}
}
return QCommonListViewBase::verticalOffset();
@@ -2000,7 +2004,11 @@ int QListModeViewBase::horizontalScrollToValue(int index, QListView::ScrollHint
if (horizontalScrollMode() != QAbstractItemView::ScrollPerItem)
return QCommonListViewBase::horizontalScrollToValue(index, hint, leftOf, rightOf, area, rect);
- int value = qBound(0, horizontalScrollBar()->value(), flowPositions.count() - 1);
+ int value;
+ if (scrollValueMap.isEmpty())
+ value = 0;
+ else
+ value = qBound(0, scrollValueMap.at(horizontalScrollBar()->value()), flowPositions.count() - 1);
if (leftOf)
hint = QListView::PositionAtTop;
else if (rightOf)
@@ -2043,14 +2051,14 @@ void QListModeViewBase::scrollContentsBy(int dx, int dy, bool scrollElasticBand)
if (vertical && flow() == QListView::TopToBottom && dy != 0) {
int currentValue = qBound(0, verticalValue, max);
int previousValue = qBound(0, currentValue + dy, max);
- int currentCoordinate = flowPositions.at(currentValue);
- int previousCoordinate = flowPositions.at(previousValue);
+ int currentCoordinate = flowPositions.at(scrollValueMap.at(currentValue));
+ int previousCoordinate = flowPositions.at(scrollValueMap.at(previousValue));
dy = previousCoordinate - currentCoordinate;
} else if (horizontal && flow() == QListView::LeftToRight && dx != 0) {
int currentValue = qBound(0, horizontalValue, max);
int previousValue = qBound(0, currentValue + dx, max);
- int currentCoordinate = flowPositions.at(currentValue);
- int previousCoordinate = flowPositions.at(previousValue);
+ int currentCoordinate = flowPositions.at(scrollValueMap.at(currentValue));
+ int previousCoordinate = flowPositions.at(scrollValueMap.at(previousValue));
dx = previousCoordinate - currentCoordinate;
}
}
@@ -2113,6 +2121,7 @@ QPoint QListModeViewBase::initStaticLayout(const QListViewLayoutInfo &info)
segmentPositions.clear();
segmentStartRows.clear();
segmentExtents.clear();
+ scrollValueMap.clear();
x = info.bounds.left() + info.spacing;
y = info.bounds.top() + info.spacing;
segmentPositions.append(info.flow == QListView::LeftToRight ? y : x);
@@ -2204,6 +2213,7 @@ void QListModeViewBase::doStaticLayout(const QListViewLayoutInfo &info)
deltaSegPosition = 0;
}
// save the flow position of this item
+ scrollValueMap.append(flowPositions.count());
flowPositions.append(flowPosition);
// prepare for the next item
deltaSegPosition = qMax(deltaSegHint, deltaSegPosition);
@@ -2229,6 +2239,7 @@ void QListModeViewBase::doStaticLayout(const QListViewLayoutInfo &info)
// if it is the last batch, save the end of the segments
if (info.last == info.max) {
segmentExtents.append(flowPosition);
+ scrollValueMap.append(flowPositions.count());
flowPositions.append(flowPosition);
segmentPositions.append(info.wrap ? segPosition + deltaSegPosition : INT_MAX);
}
@@ -2306,7 +2317,14 @@ QRect QListModeViewBase::mapToViewport(const QRect &rect) const
int QListModeViewBase::perItemScrollingPageSteps(int length, int bounds, bool wrap) const
{
- const QVector<int> positions = (wrap ? segmentPositions : flowPositions);
+ QVector<int> positions;
+ if (wrap)
+ positions = segmentPositions;
+ else if (!flowPositions.isEmpty()) {
+ positions.reserve(scrollValueMap.size());
+ foreach (int itemShown, scrollValueMap)
+ positions.append(flowPositions.at(itemShown));
+ }
if (positions.isEmpty() || bounds <= length)
return positions.count();
if (uniformItemSizes()) {
@@ -2490,7 +2508,7 @@ bool QIconModeViewBase::filterDropEvent(QDropEvent *e)
for (int i = 0; i < indexes.count(); ++i) {
QModelIndex index = indexes.at(i);
QRect rect = dd->rectForIndex(index);
- viewport()->update(mapToViewport(rect));
+ viewport()->update(dd->mapToViewport(rect, false));
QPoint dest = rect.topLeft() + delta;
if (qq->isRightToLeft())
dest.setX(dd->flipX(dest.x()) - rect.width());
diff --git a/src/gui/itemviews/qlistview_p.h b/src/gui/itemviews/qlistview_p.h
index b6785da..de4c7f3 100644
--- a/src/gui/itemviews/qlistview_p.h
+++ b/src/gui/itemviews/qlistview_p.h
@@ -205,6 +205,7 @@ public:
QVector<int> segmentPositions;
QVector<int> segmentStartRows;
QVector<int> segmentExtents;
+ QVector<int> scrollValueMap;
// used when laying out in batches
int batchSavedPosition;
diff --git a/src/gui/itemviews/qtableview.cpp b/src/gui/itemviews/qtableview.cpp
index 15bd445..2a937f1 100644
--- a/src/gui/itemviews/qtableview.cpp
+++ b/src/gui/itemviews/qtableview.cpp
@@ -779,8 +779,6 @@ void QTableViewPrivate::drawAndClipSpans(const QRegion &area, QPainter *painter,
foreach (QSpanCollection::Span *span, visibleSpans) {
int row = span->top();
int col = span->left();
- if (isHidden(row, col))
- continue;
QModelIndex index = model->index(row, col, root);
if (!index.isValid())
continue;
@@ -1119,6 +1117,9 @@ void QTableView::setHorizontalHeader(QHeaderView *header)
connect(d->horizontalHeader, SIGNAL(sectionHandleDoubleClicked(int)),
this, SLOT(resizeColumnToContents(int)));
connect(d->horizontalHeader, SIGNAL(geometriesChanged()), this, SLOT(updateGeometries()));
+
+ //update the sorting enabled states on the new header
+ setSortingEnabled(d->sortingEnabled);
}
/*!
@@ -1480,12 +1481,30 @@ QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifi
++column;
while (isRowHidden(d->logicalRow(row)) && row < bottom)
++row;
+ d->visualCursor = QPoint(column, row);
return d->model->index(d->logicalRow(row), d->logicalColumn(column), d->root);
}
- int visualRow = d->visualRow(current.row());
+ // Update visual cursor if current index has changed.
+ QPoint visualCurrent(d->visualColumn(current.column()), d->visualRow(current.row()));
+ if (visualCurrent != d->visualCursor) {
+ if (d->hasSpans()) {
+ QSpanCollection::Span span = d->span(current.row(), current.column());
+ if (span.top() > d->visualCursor.y() || d->visualCursor.y() > span.bottom()
+ || span.left() > d->visualCursor.x() || d->visualCursor.x() > span.right())
+ d->visualCursor = visualCurrent;
+ } else {
+ d->visualCursor = visualCurrent;
+ }
+ }
+
+ int visualRow = d->visualCursor.y();
+ if (visualRow > bottom)
+ visualRow = bottom;
Q_ASSERT(visualRow != -1);
- int visualColumn = d->visualColumn(current.column());
+ int visualColumn = d->visualCursor.x();
+ if (visualColumn > right)
+ visualColumn = right;
Q_ASSERT(visualColumn != -1);
if (isRightToLeft()) {
@@ -1496,22 +1515,33 @@ QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifi
}
switch (cursorAction) {
- case MoveUp:
+ case MoveUp: {
+ int originalRow = visualRow;
#ifdef QT_KEYPAD_NAVIGATION
if (QApplication::keypadNavigationEnabled() && visualRow == 0)
visualRow = d->visualRow(model()->rowCount() - 1) + 1;
+ // FIXME? visualRow = bottom + 1;
#endif
- --visualRow;
- while (visualRow > 0 && d->isVisualRowHiddenOrDisabled(visualRow, visualColumn))
+ int r = d->logicalRow(visualRow);
+ int c = d->logicalColumn(visualColumn);
+ if (r != -1 && d->hasSpans()) {
+ QSpanCollection::Span span = d->span(r, c);
+ if (span.width() > 1 || span.height() > 1)
+ visualRow = d->visualRow(span.top());
+ }
+ while (visualRow >= 0) {
--visualRow;
- if (d->hasSpans()) {
- int row = d->logicalRow(visualRow);
- QSpanCollection::Span span = d->span(row, current.column());
- visualRow = d->visualRow(span.top());
- visualColumn = d->visualColumn(span.left());
+ r = d->logicalRow(visualRow);
+ c = d->logicalColumn(visualColumn);
+ if (r == -1 || (!isRowHidden(r) && d->isCellEnabled(r, c)))
+ break;
}
+ if (visualRow < 0)
+ visualRow = originalRow;
break;
- case MoveDown:
+ }
+ case MoveDown: {
+ int originalRow = visualRow;
if (d->hasSpans()) {
QSpanCollection::Span span = d->span(current.row(), current.column());
visualRow = d->visualRow(d->rowSpanEndLogical(span.top(), span.height()));
@@ -1520,71 +1550,106 @@ QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifi
if (QApplication::keypadNavigationEnabled() && visualRow >= bottom)
visualRow = -1;
#endif
- ++visualRow;
- while (visualRow < bottom && d->isVisualRowHiddenOrDisabled(visualRow, visualColumn))
+ int r = d->logicalRow(visualRow);
+ int c = d->logicalColumn(visualColumn);
+ if (r != -1 && d->hasSpans()) {
+ QSpanCollection::Span span = d->span(r, c);
+ if (span.width() > 1 || span.height() > 1)
+ visualRow = d->visualRow(d->rowSpanEndLogical(span.top(), span.height()));
+ }
+ while (visualRow <= bottom) {
++visualRow;
- if (d->hasSpans()) {
- int row = d->logicalRow(visualRow);
- QSpanCollection::Span span = d->span(row, current.column());
- visualColumn = d->visualColumn(span.left());
+ r = d->logicalRow(visualRow);
+ c = d->logicalColumn(visualColumn);
+ if (r == -1 || (!isRowHidden(r) && d->isCellEnabled(r, c)))
+ break;
}
+ if (visualRow > bottom)
+ visualRow = originalRow;
break;
- case MovePrevious: {
- int left = 0;
- while (d->isVisualColumnHiddenOrDisabled(visualRow, left) && left < right)
- ++left;
- if (visualColumn == left) {
- visualColumn = right;
- int top = 0;
- while (top < bottom && d->isVisualRowHiddenOrDisabled(top, visualColumn))
- ++top;
- if (visualRow == top)
+ }
+ case MovePrevious:
+ case MoveLeft: {
+ int originalRow = visualRow;
+ int originalColumn = visualColumn;
+ bool firstTime = true;
+ bool looped = false;
+ bool wrapped = false;
+ do {
+ int r = d->logicalRow(visualRow);
+ int c = d->logicalColumn(visualColumn);
+ if (firstTime && c != -1 && d->hasSpans()) {
+ firstTime = false;
+ QSpanCollection::Span span = d->span(r, c);
+ if (span.width() > 1 || span.height() > 1)
+ visualColumn = d->visualColumn(span.left());
+ }
+ while (visualColumn >= 0) {
+ --visualColumn;
+ r = d->logicalRow(visualRow);
+ c = d->logicalColumn(visualColumn);
+ if (r == -1 || c == -1 || (!isRowHidden(r) && !isColumnHidden(c) && d->isCellEnabled(r, c)))
+ break;
+ if (wrapped && (originalRow < visualRow || (originalRow == visualRow && originalColumn <= visualColumn))) {
+ looped = true;
+ break;
+ }
+ }
+ if (cursorAction == MoveLeft || visualColumn >= 0)
+ break;
+ visualColumn = right + 1;
+ if (visualRow == 0) {
+ wrapped = true;
visualRow = bottom;
- else
- --visualRow;
- while (visualRow > 0 && d->isVisualRowHiddenOrDisabled(visualRow, visualColumn))
+ } else {
--visualRow;
- break;
- } // else MoveLeft
- }
- case MoveLeft:
- --visualColumn;
- while (visualColumn > 0 && d->isVisualColumnHiddenOrDisabled(visualRow, visualColumn))
- --visualColumn;
- if (d->hasSpans()) {
- int column = d->logicalColumn(visualColumn);
- QSpanCollection::Span span = d->span(current.row(), column);
- visualRow = d->visualRow(span.top());
- visualColumn = d->visualColumn(span.left());
- }
+ }
+ } while (!looped);
+ if (visualColumn < 0)
+ visualColumn = originalColumn;
break;
+ }
case MoveNext:
- if (visualColumn == right) {
- visualColumn = 0;
- while (visualColumn < right && d->isVisualColumnHiddenOrDisabled(visualRow, visualColumn))
+ case MoveRight: {
+ int originalRow = visualRow;
+ int originalColumn = visualColumn;
+ bool firstTime = true;
+ bool looped = false;
+ bool wrapped = false;
+ do {
+ int r = d->logicalRow(visualRow);
+ int c = d->logicalColumn(visualColumn);
+ if (firstTime && c != -1 && d->hasSpans()) {
+ firstTime = false;
+ QSpanCollection::Span span = d->span(r, c);
+ if (span.width() > 1 || span.height() > 1)
+ visualColumn = d->visualColumn(d->columnSpanEndLogical(span.left(), span.width()));
+ }
+ while (visualColumn <= right) {
++visualColumn;
- if (visualRow == bottom)
+ r = d->logicalRow(visualRow);
+ c = d->logicalColumn(visualColumn);
+ if (r == -1 || c == -1 || (!isRowHidden(r) && !isColumnHidden(c) && d->isCellEnabled(r, c)))
+ break;
+ if (wrapped && (originalRow > visualRow || (originalRow == visualRow && originalColumn >= visualColumn))) {
+ looped = true;
+ break;
+ }
+ }
+ if (cursorAction == MoveRight || visualColumn <= right)
+ break;
+ visualColumn = -1;
+ if (visualRow == bottom) {
+ wrapped = true;
visualRow = 0;
- else
- ++visualRow;
- while (visualRow < bottom && d->isVisualRowHiddenOrDisabled(visualRow, visualColumn))
+ } else {
++visualRow;
- break;
- } // else MoveRight
- case MoveRight:
- if (d->hasSpans()) {
- QSpanCollection::Span span = d->span(current.row(), current.column());
- visualColumn = d->visualColumn(d->columnSpanEndLogical(span.left(), span.width()));
- }
- ++visualColumn;
- while (visualColumn < right && d->isVisualColumnHiddenOrDisabled(visualRow, visualColumn))
- ++visualColumn;
- if (d->hasSpans()) {
- int column = d->logicalColumn(visualColumn);
- QSpanCollection::Span span = d->span(current.row(), column);
- visualRow = d->visualRow(span.top());
- }
+ }
+ } while (!looped);
+ if (visualColumn > right)
+ visualColumn = originalColumn;
break;
+ }
case MoveHome:
visualColumn = 0;
while (visualColumn < right && d->isVisualColumnHiddenOrDisabled(visualRow, visualColumn))
@@ -1613,14 +1678,15 @@ QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifi
return d->model->index(newRow, current.column(), d->root);
}}
+ d->visualCursor = QPoint(visualColumn, visualRow);
int logicalRow = d->logicalRow(visualRow);
int logicalColumn = d->logicalColumn(visualColumn);
if (!d->model->hasIndex(logicalRow, logicalColumn, d->root))
return QModelIndex();
QModelIndex result = d->model->index(logicalRow, logicalColumn, d->root);
- if (!isIndexHidden(result) && d->isIndexEnabled(result))
- return d->model->index(logicalRow, logicalColumn, d->root);
+ if (!d->isRowHidden(logicalRow) && !d->isColumnHidden(logicalColumn) && d->isIndexEnabled(result))
+ return result;
return QModelIndex();
}
@@ -2375,7 +2441,8 @@ bool QTableView::isCornerButtonEnabled() const
QRect QTableView::visualRect(const QModelIndex &index) const
{
Q_D(const QTableView);
- if (!d->isIndexValid(index) || index.parent() != d->root || isIndexHidden(index) )
+ if (!d->isIndexValid(index) || index.parent() != d->root
+ || (!d->hasSpans() && isIndexHidden(index)))
return QRect();
d->executePostedLayout();
diff --git a/src/gui/itemviews/qtableview_p.h b/src/gui/itemviews/qtableview_p.h
index c785bd7..9fa14c2 100644
--- a/src/gui/itemviews/qtableview_p.h
+++ b/src/gui/itemviews/qtableview_p.h
@@ -135,7 +135,8 @@ public:
rowSectionAnchor(-1), columnSectionAnchor(-1),
columnResizeTimerID(0), rowResizeTimerID(0),
horizontalHeader(0), verticalHeader(0),
- sortingEnabled(false), geometryRecursionBlock(false)
+ sortingEnabled(false), geometryRecursionBlock(false),
+ visualCursor(QPoint())
{
wrapItemText = true;
#ifndef QT_NO_DRAGANDDROP
@@ -183,6 +184,7 @@ public:
QWidget *cornerWidget;
bool sortingEnabled;
bool geometryRecursionBlock;
+ QPoint visualCursor; // (Row,column) cell coordinates to track through span navigation.
QSpanCollection spans;
diff --git a/src/gui/itemviews/qtablewidget.cpp b/src/gui/itemviews/qtablewidget.cpp
index a086498..21c4e0a 100644
--- a/src/gui/itemviews/qtablewidget.cpp
+++ b/src/gui/itemviews/qtablewidget.cpp
@@ -571,6 +571,8 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order,
colItems.remove(oldRow);
vit = sortedInsertionIterator(vit, colItems.end(), order, item);
int newRow = qMax((int)(vit - colItems.begin()), 0);
+ if ((newRow < oldRow) && !(*item < *colItems.at(oldRow - 1)) && !(*colItems.at(oldRow - 1) < *item))
+ newRow = oldRow;
vit = colItems.insert(vit, item);
if (newRow != oldRow) {
changed = true;
diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp
index 210534e..f37d8c7 100644
--- a/src/gui/itemviews/qtreeview.cpp
+++ b/src/gui/itemviews/qtreeview.cpp
@@ -2908,6 +2908,8 @@ void QTreeViewPrivate::expand(int item, bool emitSignal)
layout(item);
q->setState(oldState);
+ if (model->canFetchMore(index))
+ model->fetchMore(index);
if (emitSignal) {
emit q->expanded(index);
#ifndef QT_NO_ANIMATION
@@ -2915,8 +2917,6 @@ void QTreeViewPrivate::expand(int item, bool emitSignal)
beginAnimatedOperation();
#endif //QT_NO_ANIMATION
}
- if (model->canFetchMore(index))
- model->fetchMore(index);
}
void QTreeViewPrivate::collapse(int item, bool emitSignal)
@@ -3005,10 +3005,12 @@ void QTreeViewPrivate::beginAnimatedOperation()
animatedOperation.setEndValue(animatedOperation.top() + h);
}
- animatedOperation.after = renderTreeToPixmapForAnimation(rect);
+ if (!rect.isEmpty()) {
+ animatedOperation.after = renderTreeToPixmapForAnimation(rect);
- q->setState(QAbstractItemView::AnimatingState);
- animatedOperation.start(); //let's start the animation
+ q->setState(QAbstractItemView::AnimatingState);
+ animatedOperation.start(); //let's start the animation
+ }
}
void QTreeViewPrivate::drawAnimatedOperation(QPainter *painter) const
diff --git a/src/gui/itemviews/qtreewidget.cpp b/src/gui/itemviews/qtreewidget.cpp
index 06342d8..040c498 100644
--- a/src/gui/itemviews/qtreewidget.cpp
+++ b/src/gui/itemviews/qtreewidget.cpp
@@ -623,7 +623,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order,
lit = sortedInsertionIterator(lit, lst.end(), order, item);
int newRow = qMax(lit - lst.begin(), 0);
- if ((newRow < oldRow) && !(*item < *lst.at(oldRow - 1)))
+ if ((newRow < oldRow) && !(*item < *lst.at(oldRow - 1)) && !(*lst.at(oldRow - 1) < *item ))
newRow = oldRow;
lit = lst.insert(lit, item);
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 760d73c..8859358 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -45,10 +45,11 @@ HEADERS += \
kernel/qkeymapper_p.h \
kernel/qgesture.h \
kernel/qgesture_p.h \
- kernel/qstandardgestures.h \
- kernel/qstandardgestures_p.h \
- kernel/qsoftkeymanager_p.h \
- kernel/qguiplatformplugin_p.h
+ kernel/qstandardgestures_p.h \
+ kernel/qgesturerecognizer.h \
+ kernel/qgesturemanager_p.h \
+ kernel/qsoftkeymanager_p.h \
+ kernel/qguiplatformplugin_p.h
SOURCES += \
kernel/qaction.cpp \
@@ -79,13 +80,19 @@ SOURCES += \
kernel/qwidgetaction.cpp \
kernel/qkeymapper.cpp \
kernel/qgesture.cpp \
- kernel/qstandardgestures.cpp \
- kernel/qsoftkeymanager.cpp \
- kernel/qguiplatformplugin.cpp
+ kernel/qstandardgestures.cpp \
+ kernel/qgesturerecognizer.cpp \
+ kernel/qgesturemanager.cpp \
+ kernel/qsoftkeymanager.cpp \
+ kernel/qdesktopwidget.cpp \
+ kernel/qguiplatformplugin.cpp
win32 {
DEFINES += QT_NO_DIRECTDRAW
+ HEADERS += \
+ kernel/qwinnativepangesturerecognizer_win_p.h
+
SOURCES += \
kernel/qapplication_win.cpp \
kernel/qclipboard_win.cpp \
@@ -96,7 +103,8 @@ win32 {
kernel/qsound_win.cpp \
kernel/qwidget_win.cpp \
kernel/qole_win.cpp \
- kernel/qkeymapper_win.cpp
+ kernel/qkeymapper_win.cpp \
+ kernel/qwinnativepangesturerecognizer_win.cpp
!contains(DEFINES, QT_NO_DIRECTDRAW):LIBS += ddraw.lib
}
@@ -198,6 +206,7 @@ embedded {
qcocoaview_mac_p.h \
qcocoaapplication_mac_p.h \
qcocoaapplicationdelegate_mac_p.h \
+ qmacgesturerecognizer_mac_p.h \
qmultitouch_mac_p.h
OBJECTIVE_SOURCES += \
@@ -217,7 +226,8 @@ embedded {
kernel/qdesktopwidget_mac.mm \
kernel/qeventdispatcher_mac.mm \
kernel/qcocoawindowcustomthemeframe_mac.mm \
- kernel/qmultitouch_mac.mm \
+ kernel/qmacgesturerecognizer_mac.mm \
+ kernel/qmultitouch_mac.mm
HEADERS += \
kernel/qt_cocoa_helpers_mac_p.h \
diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp
index 6a6e549..5f5650f 100644
--- a/src/gui/kernel/qaction.cpp
+++ b/src/gui/kernel/qaction.cpp
@@ -276,7 +276,7 @@ void QActionPrivate::setShortcutEnabled(bool enable, QShortcutMap &map)
This enum describes how an action should be placed in the softkey bar. Currently this enum only
has an effect on the Symbian platform.
- \value NoSoftKey This action should be used as a softkey
+ \value NoSoftKey This action should not be used as a softkey
\value PositiveSoftKey This action is used to describe a softkey with a positive or non-destructive
role such as Ok, Select, or Options.
\value NegativeSoftKey This action is used to describe a soft ey with a negative or destructive role
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index 43addb6..7c38d4b 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -68,9 +68,6 @@
#include "private/qstylesheetstyle_p.h"
#include "private/qstyle_p.h"
#include "qmessagebox.h"
-#include "qlineedit.h"
-#include "qlistview.h"
-#include "qtextedit.h"
#include <QtGui/qgraphicsproxywidget.h>
#include "qinputcontext.h"
@@ -99,6 +96,9 @@
#include "qapplication.h"
+#include "qgesture.h"
+#include "private/qgesturemanager_p.h"
+
#ifndef QT_NO_LIBRARY
#include "qlibrary.h"
#endif
@@ -154,6 +154,14 @@ bool QApplicationPrivate::autoSipEnabled = false;
bool QApplicationPrivate::autoSipEnabled = true;
#endif
+QGestureManager* QGestureManager::instance()
+{
+ QApplicationPrivate *d = qApp->d_func();
+ if (!d->gestureManager)
+ d->gestureManager = new QGestureManager(qApp);
+ return d->gestureManager;
+}
+
QApplicationPrivate::QApplicationPrivate(int &argc, char **argv, QApplication::Type type)
: QCoreApplicationPrivate(argc, argv)
{
@@ -177,6 +185,8 @@ QApplicationPrivate::QApplicationPrivate(int &argc, char **argv, QApplication::T
directPainters = 0;
#endif
+ gestureManager = 0;
+
if (!self)
self = this;
}
@@ -930,7 +940,7 @@ void QApplicationPrivate::initialize()
graphics_system = QGraphicsSystemFactory::create(graphics_system_name);
#endif
#ifndef QT_NO_WHEELEVENT
-#ifdef Q_OS_MAC
+#ifdef Q_OS_MAC
QApplicationPrivate::wheel_scroll_lines = 1;
#else
QApplicationPrivate::wheel_scroll_lines = 3;
@@ -1021,11 +1031,11 @@ QApplication::~QApplication()
d->eventDispatcher->closingDown();
d->eventDispatcher = 0;
+ QApplicationPrivate::is_app_closing = true;
+ QApplicationPrivate::is_app_running = false;
delete qt_desktopWidget;
qt_desktopWidget = 0;
- QApplicationPrivate::is_app_closing = true;
- QApplicationPrivate::is_app_running = false;
#ifndef QT_NO_CLIPBOARD
delete qt_clipboard;
@@ -2485,9 +2495,12 @@ void QApplication::setActiveWindow(QWidget* act)
/*!internal
* Helper function that returns the new focus widget, but does not set the focus reason.
* Returns 0 if a new focus widget could not be found.
+ * Shared with QGraphicsProxyWidgetPrivate::findFocusChild()
*/
QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool next)
{
+ uint focus_flag = qt_tab_all_widgets ? Qt::TabFocus : Qt::StrongFocus;
+
QWidget *f = toplevel->focusWidget();
if (!f)
f = toplevel;
@@ -2495,22 +2508,11 @@ QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool
QWidget *w = f;
QWidget *test = f->d_func()->focus_next;
while (test && test != f) {
- if ((test->focusPolicy() & Qt::TabFocus)
+ if ((test->focusPolicy() & focus_flag) == focus_flag
&& !(test->d_func()->extra && test->d_func()->extra->focus_proxy)
&& test->isVisibleTo(toplevel) && test->isEnabled()
&& !(w->windowType() == Qt::SubWindow && !w->isAncestorOf(test))
- && (toplevel->windowType() != Qt::SubWindow || toplevel->isAncestorOf(test))
- && (qt_tab_all_widgets
-#ifndef QT_NO_LINEEDIT
- || qobject_cast<QLineEdit*>(test)
-#endif
-#ifndef QT_NO_TEXTEDIT
- || qobject_cast<QTextEdit*>(test)
-#endif
-#ifndef QT_NO_ITEMVIEWS
- || qobject_cast<QListView*>(test)
-#endif
- )) {
+ && (toplevel->windowType() != Qt::SubWindow || toplevel->isAncestorOf(test))) {
w = test;
if (next)
break;
@@ -2649,7 +2651,10 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) {
if (!isAlien(w))
break;
if (w->testAttribute(Qt::WA_SetCursor)) {
- parentOfLeavingCursor = w->parentWidget();
+ QWidget *parent = w->parentWidget();
+ while (parent && parent->d_func()->data.in_destructor)
+ parent = parent->parentWidget();
+ parentOfLeavingCursor = parent;
//continue looping, we need to find the downest alien widget with a cursor.
// (downest on the screen)
}
@@ -3632,6 +3637,18 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
#endif // !QT_NO_WHEELEVENT || !QT_NO_TABLETEVENT
}
+ // walk through parents and check for gestures
+ if (d->gestureManager) {
+ if (receiver->isWidgetType()) {
+ if (d->gestureManager->filterEvent(static_cast<QWidget *>(receiver), e))
+ return true;
+ } else if (QGesture *gesture = qobject_cast<QGesture *>(receiver)) {
+ if (d->gestureManager->filterEvent(gesture, e))
+ return true;
+ }
+ }
+
+
// User input and window activation makes tooltips sleep
switch (e->type()) {
case QEvent::Wheel:
@@ -4133,6 +4150,66 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
}
break;
}
+ case QEvent::Gesture:
+ case QEvent::GestureOverride:
+ {
+ if (receiver->isWidgetType()) {
+ QWidget *w = static_cast<QWidget *>(receiver);
+ QGestureEvent *gestureEvent = static_cast<QGestureEvent *>(e);
+ QList<QGesture *> allGestures = gestureEvent->allGestures();
+
+ bool eventAccepted = gestureEvent->isAccepted();
+ bool wasAccepted = eventAccepted;
+ while (w) {
+ // send only gestures the widget expects
+ QList<QGesture *> gestures;
+ QWidgetPrivate *wd = w->d_func();
+ for (int i = 0; i < allGestures.size();) {
+ QGesture *g = allGestures.at(i);
+ Qt::GestureType type = g->gestureType();
+ if (wd->gestureContext.contains(type)) {
+ allGestures.removeAt(i);
+ gestures.append(g);
+ } else {
+ ++i;
+ }
+ }
+ if (!gestures.isEmpty()) { // we have gestures for this w
+ QGestureEvent ge(gestures);
+ ge.t = gestureEvent->t;
+ ge.spont = gestureEvent->spont;
+ ge.m_accept = wasAccepted;
+ ge.d_func()->accepted = gestureEvent->d_func()->accepted;
+ res = d->notify_helper(w, &ge);
+ gestureEvent->spont = false;
+ eventAccepted = ge.isAccepted();
+ for (int i = 0; i < gestures.size(); ++i) {
+ QGesture *g = gestures.at(i);
+ if ((res && eventAccepted) || (!eventAccepted && ge.isAccepted(g))) {
+ // if the gesture was accepted, mark the target widget for it
+ gestureEvent->d_func()->targetWidgets[g->gestureType()] = w;
+ gestureEvent->setAccepted(g, true);
+ } else if (!eventAccepted && !ge.isAccepted(g)) {
+ // if the gesture was explicitly ignored by the application,
+ // put it back so a parent can get it
+ allGestures.append(g);
+ }
+ }
+ }
+ if (allGestures.isEmpty()) // everything delivered
+ break;
+ if (w->isWindow())
+ break;
+ w = w->parentWidget();
+ }
+ foreach (QGesture *g, allGestures)
+ gestureEvent->setAccepted(g, false);
+ gestureEvent->m_accept = false; // to make sure we check individual gestures
+ } else {
+ res = d->notify_helper(receiver, e);
+ }
+ break;
+ }
default:
res = d->notify_helper(receiver, e);
break;
@@ -5540,6 +5617,37 @@ Q_GUI_EXPORT void qt_translateRawTouchEvent(QWidget *window,
QApplicationPrivate::translateRawTouchEvent(window, deviceType, touchPoints);
}
+/*!
+ \since 4.6
+
+ Registers the given \a recognizer in the gesture framework and returns a gesture ID
+ for it.
+
+ The application takes ownership of the \a recognizer and returns the gesture type
+ ID associated with it. For gesture recognizers which handle custom QGesture
+ objects (i.e., those which return Qt::CustomGesture in a QGesture::gestureType()
+ function) the return value is a gesture ID between Qt::CustomGesture and
+ Qt::LastGestureType, inclusive.
+
+ \sa unregisterGestureRecognizer(), QGestureRecognizer::createGesture(), QGesture
+*/
+Qt::GestureType QApplication::registerGestureRecognizer(QGestureRecognizer *recognizer)
+{
+ return QGestureManager::instance()->registerGestureRecognizer(recognizer);
+}
+
+/*!
+ \since 4.6
+
+ Unregisters all gesture recognizers of the specified \a type.
+
+ \sa registerGestureRecognizer()
+*/
+void QApplication::unregisterGestureRecognizer(Qt::GestureType type)
+{
+ QGestureManager::instance()->unregisterGestureRecognizer(type);
+}
+
QT_END_NAMESPACE
#include "moc_qapplication.cpp"
diff --git a/src/gui/kernel/qapplication.h b/src/gui/kernel/qapplication.h
index 5f21a56..5a8e325 100644
--- a/src/gui/kernel/qapplication.h
+++ b/src/gui/kernel/qapplication.h
@@ -61,9 +61,6 @@
QT_BEGIN_HEADER
-#if defined(Q_OS_SYMBIAN)
-class TWsEvent;
-#endif
#if defined(Q_WS_S60)
class CApaApplication;
#endif
@@ -83,9 +80,13 @@ class QLocale;
#if defined(Q_WS_QWS)
class QDecoration;
#endif
+#if defined(Q_OS_SYMBIAN)
+class QSymbianEvent;
+#endif
class QApplication;
class QApplicationPrivate;
+class QGestureRecognizer;
#if defined(qApp)
#undef qApp
#endif
@@ -240,10 +241,8 @@ public:
int x11ProcessEvent(XEvent*);
#endif
#if defined(Q_OS_SYMBIAN)
- int s60ProcessEvent(TWsEvent *event);
- virtual bool s60EventFilter(TWsEvent *aEvent);
- void symbianHandleCommand(int command);
- void symbianResourceChange(int type);
+ int symbianProcessEvent(const QSymbianEvent *event);
+ virtual bool symbianEventFilter(const QSymbianEvent *event);
#endif
#if defined(Q_WS_QWS)
virtual bool qwsEventFilter(QWSEvent *);
@@ -289,6 +288,9 @@ public:
static Qt::NavigationMode navigationMode();
#endif
+ Qt::GestureType registerGestureRecognizer(QGestureRecognizer *recognizer);
+ void unregisterGestureRecognizer(Qt::GestureType type);
+
Q_SIGNALS:
void lastWindowClosed();
void focusChanged(QWidget *old, QWidget *now);
@@ -400,6 +402,7 @@ private:
friend class QDirectPainter;
friend class QDirectPainterPrivate;
#endif
+ friend class QGestureManager;
#if defined(Q_WS_MAC) || defined(Q_WS_X11)
Q_PRIVATE_SLOT(d_func(), void _q_alertTimeOut())
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm
index f9c8aa3..771cddc 100644
--- a/src/gui/kernel/qapplication_mac.mm
+++ b/src/gui/kernel/qapplication_mac.mm
@@ -203,6 +203,8 @@ static EventHandlerRef tablet_proximity_handler = 0;
static EventHandlerUPP tablet_proximity_UPP = 0;
bool QApplicationPrivate::native_modal_dialog_active;
+Q_GUI_EXPORT bool qt_applefontsmoothing_enabled;
+
/*****************************************************************************
External functions
*****************************************************************************/
@@ -222,6 +224,12 @@ extern bool qt_sendSpontaneousEvent(QObject *obj, QEvent *event); // qapplicatio
void onApplicationWindowChangedActivation( QWidget*widget, bool activated );
void onApplicationChangedActivation( bool activated );
+static void qt_mac_read_fontsmoothing_settings()
+{
+ NSInteger appleFontSmoothing = [[NSUserDefaults standardUserDefaults] integerForKey:@"AppleFontSmoothing"];
+ qt_applefontsmoothing_enabled = (appleFontSmoothing > 0);
+}
+
Q_GUI_EXPORT bool qt_mac_execute_apple_script(const char *script, long script_len, AEDesc *ret) {
OSStatus err;
AEDesc scriptTextDesc;
@@ -1203,6 +1211,9 @@ void qt_init(QApplicationPrivate *priv, int)
}
if (QApplication::desktopSettingsAware())
QApplicationPrivate::qt_mac_apply_settings();
+
+ qt_mac_read_fontsmoothing_settings();
+
// Cocoa application delegate
#ifdef QT_MAC_USE_COCOA
NSApplication *cocoaApp = [NSApplication sharedApplication];
diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h
index 95b6d28..65f61e9 100644
--- a/src/gui/kernel/qapplication_p.h
+++ b/src/gui/kernel/qapplication_p.h
@@ -83,8 +83,8 @@ class QGraphicsSystem;
class QInputContext;
class QObject;
class QWidget;
-class QGestureManager;
class QSocketNotifier;
+class QGestureManager;
extern bool qt_is_gui_used;
#ifndef QT_NO_CLIPBOARD
@@ -265,20 +265,6 @@ typedef struct tagGESTURECONFIG
#endif // Q_WS_WIN
-class QPanGesture;
-class QPinchGesture;
-class QSwipeGesture;
-
-struct QStandardGestures
-{
- QPanGesture *pan;
- QPinchGesture *pinch;
- QSwipeGesture *swipe;
-
- QStandardGestures() : pan(0), pinch(0), swipe(0) { }
-};
-
-
class QScopedLoopLevelCounter
{
QThreadData *threadData;
@@ -517,11 +503,18 @@ public:
static void setNavigationMode(Qt::NavigationMode mode);
static TUint resolveS60ScanCode(TInt scanCode, TUint keysym);
QSet<WId> nativeWindows;
+
+ int symbianProcessWsEvent(const TWsEvent *event);
+ int symbianHandleCommand(int command);
+ int symbianResourceChange(int type);
+
#endif
#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined (Q_WS_QWS)
void sendSyntheticEnterLeave(QWidget *widget);
#endif
+ QGestureManager *gestureManager;
+
QMap<int, QWidget *> widgetForTouchPointId;
QMap<int, QTouchEvent::TouchPoint> appCurrentTouchPoints;
static void updateTouchPointsForWidget(QWidget *widget, QTouchEvent *touchEvent);
@@ -536,9 +529,6 @@ public:
QTouchEvent::DeviceType deviceType,
const QList<QTouchEvent::TouchPoint> &touchPoints);
- typedef QMap<QWidget*, QStandardGestures> WidgetStandardGesturesMap;
- WidgetStandardGesturesMap widgetGestures;
-
#if defined(Q_WS_WIN)
static PtrRegisterTouchWindow RegisterTouchWindow;
static PtrGetTouchInputInfo GetTouchInputInfo;
@@ -555,7 +545,6 @@ public:
PtrBeginPanningFeedback BeginPanningFeedback;
PtrUpdatePanningFeedback UpdatePanningFeedback;
PtrEndPanningFeedback EndPanningFeedback;
- QWidget *gestureWidget;
#endif
#ifdef QT_RX71_MULTITOUCH
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index acd1041..689429e 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -42,6 +42,7 @@
#include "qapplication_p.h"
#include "qsessionmanager.h"
#include "qevent.h"
+#include "qsymbianevent.h"
#include "qeventdispatcher_s60_p.h"
#include "qwidget.h"
#include "qdesktopwidget.h"
@@ -352,7 +353,8 @@ QSymbianControl::~QSymbianControl()
{
if (S60->curWin == this)
S60->curWin = 0;
- setFocusSafely(false);
+ if (!QApplicationPrivate::is_app_closing)
+ setFocusSafely(false);
S60->appUi()->RemoveFromStack(this);
delete m_longTapDetector;
}
@@ -463,12 +465,47 @@ void QSymbianControl::HandlePointerEventL(const TPointerEvent& pEvent)
QT_TRYCATCH_LEAVING(HandlePointerEvent(pEvent));
}
+typedef QPair<QWidget*,QMouseEvent> Event;
+
+/*
+ * Helper function called by HandlePointerEvent - separated to keep that function readable
+ */
+static void generateEnterLeaveEvents(QList<Event> &events, QWidget *widgetUnderPointer,
+ QPoint globalPos, Qt::MouseButton button, Qt::KeyboardModifiers modifiers)
+{
+ //moved to another widget, create enter and leave events
+ if (S60->lastPointerEventTarget) {
+ QMouseEvent mEventLeave(QEvent::Leave, S60->lastPointerEventTarget->mapFromGlobal(
+ S60->lastCursorPos), S60->lastCursorPos, button, QApplicationPrivate::mouse_buttons,
+ modifiers);
+ events.append(Event(S60->lastPointerEventTarget, mEventLeave));
+ }
+ if (widgetUnderPointer) {
+ QMouseEvent mEventEnter(QEvent::Enter, widgetUnderPointer->mapFromGlobal(globalPos),
+ globalPos, button, QApplicationPrivate::mouse_buttons, modifiers);
+
+ events.append(Event(widgetUnderPointer, mEventEnter));
+#ifndef QT_NO_CURSOR
+ S60->curWin = widgetUnderPointer->effectiveWinId();
+ if (!QApplication::overrideCursor()) {
+#ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS
+ if (S60->brokenPointerCursors)
+ qt_symbian_set_pointer_sprite(widgetUnderPointer->cursor());
+ else
+#endif
+ qt_symbian_setWindowCursor(widgetUnderPointer->cursor(), S60->curWin);
+ }
+#endif
+ }
+}
+
+
void QSymbianControl::HandlePointerEvent(const TPointerEvent& pEvent)
{
- //### refactor me, getting too complex
QMouseEvent::Type type;
Qt::MouseButton button;
mapS60MouseEventTypeToQt(&type, &button, &pEvent);
+ Qt::KeyboardModifiers modifiers = mapToQtModifiers(pEvent.iModifiers);
if (m_previousEventLongTap)
if (type == QEvent::MouseButtonRelease){
@@ -480,79 +517,76 @@ void QSymbianControl::HandlePointerEvent(const TPointerEvent& pEvent)
return;
// store events for later sending/saving
- QWidget *alienWidget;
- typedef QPair<QWidget*,QMouseEvent> Event;
QList<Event > events;
QPoint widgetPos = QPoint(pEvent.iPosition.iX, pEvent.iPosition.iY);
TPoint controlScreenPos = PositionRelativeToScreen();
QPoint globalPos = QPoint(controlScreenPos.iX, controlScreenPos.iY) + widgetPos;
- if (type == QEvent::MouseButtonPress || type == QEvent::MouseButtonDblClick || type == QEvent::MouseMove)
- {
- // get the widget where the event happened
- alienWidget = qwidget->childAt(widgetPos);
- if (!alienWidget)
- alienWidget = qwidget;
- S60->mousePressTarget = alienWidget;
+ // widgets interested in the event
+ QWidget *widgetUnderPointer = qwidget->childAt(widgetPos);
+ if (!widgetUnderPointer)
+ widgetUnderPointer = qwidget; //i.e. this container widget
+
+ QWidget *widgetWithMouseGrab = QWidget::mouseGrabber();
+
+ // handle auto grab of pointer when pressing / releasing
+ if (!widgetWithMouseGrab && type == QEvent::MouseButtonPress) {
+ //if previously auto-grabbed, generate a fake mouse release (platform bug: mouse release event was lost)
+ if (S60->mousePressTarget) {
+ QMouseEvent mEvent(QEvent::MouseButtonRelease, S60->mousePressTarget->mapFromGlobal(globalPos), globalPos,
+ button, QApplicationPrivate::mouse_buttons, modifiers);
+ events.append(Event(S60->mousePressTarget,mEvent));
+ }
+ //auto grab the mouse
+ widgetWithMouseGrab = S60->mousePressTarget = widgetUnderPointer;
+ widgetWithMouseGrab->grabMouse();
+ }
+ if (widgetWithMouseGrab && widgetWithMouseGrab == S60->mousePressTarget && type == QEvent::MouseButtonRelease) {
+ //release the auto grab - note this release event still goes to the autograb widget
+ S60->mousePressTarget = 0;
+ widgetWithMouseGrab->releaseMouse();
}
- alienWidget = S60->mousePressTarget;
+ QWidget *widgetToReceiveMouseEvent;
+ if (widgetWithMouseGrab)
+ widgetToReceiveMouseEvent = widgetWithMouseGrab;
+ else
+ widgetToReceiveMouseEvent = widgetUnderPointer;
- if (alienWidget != S60->lastPointerEventTarget)
- if (type == QEvent::MouseButtonPress || type == QEvent::MouseButtonDblClick || type == QEvent::MouseMove)
- {
- //moved to another widget, create enter and leave events
- if (S60->lastPointerEventTarget)
- {
- QMouseEvent mEventLeave(QEvent::Leave, S60->lastPointerEventTarget->mapFromGlobal(S60->lastCursorPos), S60->lastCursorPos,
- button, QApplicationPrivate::mouse_buttons, mapToQtModifiers(pEvent.iModifiers));
- events.append(Event(S60->lastPointerEventTarget,mEventLeave));
- }
- if (alienWidget) {
- QMouseEvent mEventEnter(QEvent::Enter, alienWidget->mapFromGlobal(globalPos),
- globalPos, button, QApplicationPrivate::mouse_buttons, mapToQtModifiers(
- pEvent.iModifiers));
+ //queue QEvent::Enter and QEvent::Leave, if the pointer has moved
+ if (widgetUnderPointer != S60->lastPointerEventTarget && (type == QEvent::MouseButtonPress || type == QEvent::MouseButtonDblClick || type == QEvent::MouseMove))
+ generateEnterLeaveEvents(events, widgetUnderPointer, globalPos, button, modifiers);
- events.append(Event(alienWidget, mEventEnter));
-#ifndef QT_NO_CURSOR
- S60->curWin = alienWidget->effectiveWinId();
- if (!QApplication::overrideCursor()) {
-#ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS
- if (S60->brokenPointerCursors)
- qt_symbian_set_pointer_sprite(alienWidget->cursor());
- else
-#endif
- qt_symbian_setWindowCursor(alienWidget->cursor(), S60->curWin);
- }
-#endif
- }
- }
+ //save global state
S60->lastCursorPos = globalPos;
+ S60->lastPointerEventPos = widgetPos;
+ S60->lastPointerEventTarget = widgetUnderPointer;
+
#if !defined(QT_NO_CURSOR) && !defined(Q_SYMBIAN_FIXED_POINTER_CURSORS)
if (S60->brokenPointerCursors)
qt_symbian_move_cursor_sprite();
#endif
- S60->lastPointerEventPos = widgetPos;
- S60->lastPointerEventTarget = alienWidget;
- if (alienWidget)
- {
- QMouseEvent mEvent(type, alienWidget->mapFromGlobal(globalPos), globalPos,
- button, QApplicationPrivate::mouse_buttons, mapToQtModifiers(pEvent.iModifiers));
- events.append(Event(alienWidget,mEvent));
- QEventDispatcherS60 *dispatcher;
- // It is theoretically possible for someone to install a different event dispatcher.
- if ((dispatcher = qobject_cast<QEventDispatcherS60 *>(alienWidget->d_func()->threadData->eventDispatcher)) != 0) {
- if (dispatcher->excludeUserInputEvents()) {
- for (int i=0;i < events.count();++i)
- {
- Event next = events[i];
- dispatcher->saveInputEvent(this, next.first, new QMouseEvent(next.second));
- }
- return;
+
+ //queue this event.
+ Q_ASSERT(widgetToReceiveMouseEvent);
+ QMouseEvent mEvent(type, widgetToReceiveMouseEvent->mapFromGlobal(globalPos), globalPos,
+ button, QApplicationPrivate::mouse_buttons, modifiers);
+ events.append(Event(widgetToReceiveMouseEvent,mEvent));
+ QEventDispatcherS60 *dispatcher;
+ // It is theoretically possible for someone to install a different event dispatcher.
+ if ((dispatcher = qobject_cast<QEventDispatcherS60 *>(widgetToReceiveMouseEvent->d_func()->threadData->eventDispatcher)) != 0) {
+ if (dispatcher->excludeUserInputEvents()) {
+ for (int i=0;i < events.count();++i)
+ {
+ Event next = events[i];
+ dispatcher->saveInputEvent(this, next.first, new QMouseEvent(next.second));
}
+ return;
}
}
+
+ //send events in the queue
for (int i=0;i < events.count();++i)
{
Event next = events[i];
@@ -688,7 +722,7 @@ TKeyResponse QSymbianControl::OfferKeyEvent(const TKeyEvent& keyEvent, TEventCod
Qt::KeyboardModifiers mods = mapToQtModifiers(keyEvent.iModifiers);
QKeyEventEx qKeyEvent(type == EEventKeyUp ? QEvent::KeyRelease : QEvent::KeyPress, keyCode,
mods, qt_keymapper_private()->translateKeyEvent(keyCode, mods),
- false, 1, keyEvent.iScanCode, s60Keysym, mods);
+ false, 1, keyEvent.iScanCode, s60Keysym, keyEvent.iModifiers);
// WId wid = reinterpret_cast<RWindowGroup *>(keyEvent.Handle())->Child();
// if (!wid)
// Could happen if window isn't shown yet.
@@ -948,7 +982,8 @@ void QSymbianControl::setFocusSafely(bool focus)
S60->appUi()->RemoveFromStack(this);
QT_TRAP_THROWING(S60->appUi()->AddToStackL(this,
ECoeStackPriorityDefault, ECoeStackFlagStandard));
- lastFocusedControl = 0;
+ if(this == lastFocusedControl)
+ lastFocusedControl = 0;
this->SetFocus(false);
}
}
@@ -1022,6 +1057,13 @@ void qt_init(QApplicationPrivate * /* priv */, int)
TDisplayMode mode = S60->screenDevice()->DisplayMode();
S60->screenDepth = TDisplayModeUtils::NumDisplayModeBitsPerPixel(mode);
+ //NB: RWsSession::GetColorModeList tells you what window modes are supported,
+ //not what bitmap formats.
+ if(QSysInfo::symbianVersion() == QSysInfo::SV_9_2)
+ S60->supportsPremultipliedAlpha = 0;
+ else
+ S60->supportsPremultipliedAlpha = 1;
+
RProcess me;
TSecureId securId = me.SecureId();
S60->uid = securId.operator TUid();
@@ -1050,6 +1092,13 @@ void qt_init(QApplicationPrivate * /* priv */, int)
err = HAL::Get(HALData::EPen, touch);
if (err != KErrNone || touchIsUnsupportedOnSystem)
touch = 0;
+#ifdef __WINS__
+ if(QSysInfo::symbianVersion() <= QSysInfo::SV_9_4) {
+ //for symbian SDK emulator, force values to match typical devices.
+ mouse = 0;
+ touch = touchIsUnsupportedOnSystem ? 0 : 1;
+ }
+#endif
if (mouse || machineUID == KMachineUidSamsungI8510) {
S60->hasTouchscreen = false;
S60->virtualMouseRequired = false;
@@ -1121,6 +1170,11 @@ void qt_init(QApplicationPrivate * /* priv */, int)
;
}
*/
+
+ // Register WId with the metatype system. This is to enable
+ // QWidgetPrivate::create_sys to used delayed slot invokation in order
+ // to destroy WId objects during reparenting.
+ qRegisterMetaType<WId>("WId");
}
/*****************************************************************************
@@ -1380,43 +1434,47 @@ void QApplication::beep()
\warning This function is only available on Symbian.
\since 4.6
- This function processes an individual Symbian window server
+ This function processes an individual Symbian event
\a event. It returns 1 if the event was handled, 0 if
the \a event was not handled, and -1 if the event was
- not handled because the event handle (\c{TWsEvent::Handle()})
- is not known to Qt.
+ not handled because the event is not known to Qt.
*/
-int QApplication::s60ProcessEvent(TWsEvent *event)
+
+int QApplication::symbianProcessEvent(const QSymbianEvent *event)
{
- bool handled = s60EventFilter(event);
- if (handled)
+ Q_D(QApplication);
+
+ QScopedLoopLevelCounter counter(d->threadData);
+
+ QWidget *w = qApp ? qApp->focusWidget() : 0;
+ if (w) {
+ QInputContext *ic = w->inputContext();
+ if (ic && ic->symbianFilterEvent(w, event))
+ return 1;
+ }
+
+ if (symbianEventFilter(event))
return 1;
+ switch (event->type()) {
+ case QSymbianEvent::WindowServerEvent:
+ return d->symbianProcessWsEvent(event->windowServerEvent());
+ case QSymbianEvent::CommandEvent:
+ return d->symbianHandleCommand(event->command());
+ case QSymbianEvent::ResourceChangeEvent:
+ return d->symbianResourceChange(event->resourceChangeType());
+ default:
+ return -1;
+ }
+}
+
+int QApplicationPrivate::symbianProcessWsEvent(const TWsEvent *event)
+{
// Qt event handling. Handle some events regardless of if the handle is in our
// widget map or not.
CCoeControl* control = reinterpret_cast<CCoeControl*>(event->Handle());
const bool controlInMap = QWidgetPrivate::mapper && QWidgetPrivate::mapper->contains(control);
switch (event->Type()) {
-#if !defined(QT_NO_IM) && defined(Q_WS_S60)
- case EEventKey:
- case EEventKeyUp:
- case EEventKeyDown:
- {
- // The control doesn't seem to be any of our widgets, so rely on the focused
- // widget instead. If the user needs the control, it can be found inside the
- // event structure.
- QWidget *w = qApp ? qApp->focusWidget() : 0;
- if (w) {
- QInputContext *ic = w->inputContext();
- if (ic && ic->s60FilterEvent(w, event)) {
- return 1;
- } else {
- return 0;
- }
- }
- break;
- }
-#endif
case EEventPointerEnter:
if (controlInMap)
return 1; // Qt::Enter will be generated in HandlePointerL
@@ -1505,15 +1563,15 @@ int QApplication::s60ProcessEvent(TWsEvent *event)
If you create an application that inherits QApplication and reimplement
this function, you get direct access to events that the are received
- from the Symbian window server. The events are passed in the TWsEvent
- \a aEvent parameter.
+ from Symbian. The events are passed in the \a event parameter.
Return true if you want to stop the event from being processed. Return
- false for normal event dispatching. The default implementation
- false, and does nothing with \a aEvent.
+ false for normal event dispatching. The default implementation returns
+ false, and does nothing with \a event.
*/
-bool QApplication::s60EventFilter(TWsEvent * /* aEvent */)
+bool QApplication::symbianEventFilter(const QSymbianEvent *event)
{
+ Q_UNUSED(event);
return false;
}
@@ -1528,32 +1586,39 @@ bool QApplication::s60EventFilter(TWsEvent * /* aEvent */)
\sa s60EventFilter(), s60ProcessEvent()
*/
-void QApplication::symbianHandleCommand(int command)
+int QApplicationPrivate::symbianHandleCommand(int command)
{
- QScopedLoopLevelCounter counter(d_func()->threadData);
+ Q_Q(QApplication);
+ int ret = 0;
+
switch (command) {
#ifdef Q_WS_S60
case EAknSoftkeyExit: {
QCloseEvent ev;
- QApplication::sendSpontaneousEvent(this, &ev);
- if (ev.isAccepted())
- quit();
+ QApplication::sendSpontaneousEvent(q, &ev);
+ if (ev.isAccepted()) {
+ q->quit();
+ ret = 1;
+ }
break;
}
#endif
case EEikCmdExit:
- quit();
+ q->quit();
+ ret = 1;
break;
default:
bool handled = QSoftKeyManager::handleCommand(command);
+ if (handled)
+ ret = 1;
#ifdef Q_WS_S60
- if (!handled)
- QMenuBarPrivate::symbianCommands(command);
-#else
- Q_UNUSED(handled);
+ else
+ ret = QMenuBarPrivate::symbianCommands(command);
#endif
break;
}
+
+ return ret;
}
/*!
@@ -1565,8 +1630,10 @@ void QApplication::symbianHandleCommand(int command)
Currently, KEikDynamicLayoutVariantSwitch and
KAknsMessageSkinChange are handled.
*/
-void QApplication::symbianResourceChange(int type)
+int QApplicationPrivate::symbianResourceChange(int type)
{
+ int ret = 0;
+
switch (type) {
#ifdef Q_WS_S60
case KEikDynamicLayoutVariantSwitch:
@@ -1585,22 +1652,28 @@ void QApplication::symbianResourceChange(int type)
#endif
s60Style = qobject_cast<QS60Style*>(QApplication::style());
- if (s60Style)
+ if (s60Style) {
s60Style->d_func()->handleDynamicLayoutVariantSwitch();
+ ret = 1;
+ }
#endif
}
break;
#ifndef QT_NO_STYLE_S60
case KAknsMessageSkinChange:
- if (QS60Style *s60Style = qobject_cast<QS60Style*>(QApplication::style()))
+ if (QS60Style *s60Style = qobject_cast<QS60Style*>(QApplication::style())) {
s60Style->d_func()->handleSkinChange();
+ ret = 1;
+ }
break;
#endif
#endif // Q_WS_S60
default:
break;
}
+
+ return ret;
}
#ifndef QT_NO_WHEELEVENT
diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp
index 270562f..5bb25fa 100644
--- a/src/gui/kernel/qapplication_win.cpp
+++ b/src/gui/kernel/qapplication_win.cpp
@@ -92,8 +92,6 @@ extern void qt_wince_hide_taskbar(HWND hwnd); //defined in qguifunctions_wince.c
#include <private/qkeymapper_p.h>
#include <private/qlocale_p.h>
#include "qevent_p.h"
-#include "qstandardgestures.h"
-#include "qstandardgestures_p.h"
//#define ALIEN_DEBUG
@@ -821,13 +819,16 @@ void qt_init(QApplicationPrivate *priv, int)
priv->GetGestureInfo = 0;
priv->GetGestureExtraArgs = 0;
+ priv->CloseGestureInfoHandle = 0;
+ priv->SetGestureConfig = 0;
+ priv->GetGestureConfig = 0;
+ priv->BeginPanningFeedback = 0;
+ priv->UpdatePanningFeedback = 0;
+ priv->EndPanningFeedback = 0;
#if defined(Q_WS_WINCE_WM) && defined(QT_WINCE_GESTURES)
priv->GetGestureInfo = (PtrGetGestureInfo) &TKGetGestureInfo;
priv->GetGestureExtraArgs = (PtrGetGestureExtraArgs) &TKGetGestureExtraArguments;
- priv->CloseGestureInfoHandle = (PtrCloseGestureInfoHandle) 0;
- priv->SetGestureConfig = (PtrSetGestureConfig) 0;
- priv->GetGestureConfig = (PtrGetGestureConfig) 0;
#elif !defined(Q_WS_WINCE)
priv->GetGestureInfo =
(PtrGetGestureInfo)QLibrary::resolve(QLatin1String("user32"),
@@ -854,7 +855,6 @@ void qt_init(QApplicationPrivate *priv, int)
(PtrEndPanningFeedback)QLibrary::resolve(QLatin1String("uxtheme"),
"EndPanningFeedback");
#endif
- priv->gestureWidget = 0;
}
/*****************************************************************************
@@ -2499,24 +2499,24 @@ LRESULT CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam
if (qAppPriv->GetGestureInfo)
bResult = qAppPriv->GetGestureInfo((HANDLE)msg.lParam, &gi);
if (bResult) {
- if (gi.dwID == GID_BEGIN) {
- // find the alien widget for the gesture position.
- // This might not be accurate as the position is the center
- // point of two fingers for multi-finger gestures.
- QPoint pt(gi.ptsLocation.x, gi.ptsLocation.y);
- QWidget *w = widget->childAt(widget->mapFromGlobal(pt));
- qAppPriv->gestureWidget = w ? w : widget;
- }
- if (qAppPriv->gestureWidget)
- static_cast<QETWidget*>(qAppPriv->gestureWidget)->translateGestureEvent(msg, gi);
- if (qAppPriv->CloseGestureInfoHandle)
- qAppPriv->CloseGestureInfoHandle((HANDLE)msg.lParam);
- if (gi.dwID == GID_END)
- qAppPriv->gestureWidget = 0;
- } else {
- DWORD dwErr = GetLastError();
- if (dwErr > 0)
- qWarning() << "translateGestureEvent: error = " << dwErr;
+// if (gi.dwID == GID_BEGIN) {
+// // find the alien widget for the gesture position.
+// // This might not be accurate as the position is the center
+// // point of two fingers for multi-finger gestures.
+// QPoint pt(gi.ptsLocation.x, gi.ptsLocation.y);
+// QWidget *w = widget->childAt(widget->mapFromGlobal(pt));
+// qAppPriv->gestureWidget = w ? w : widget;
+// }
+// if (qAppPriv->gestureWidget)
+// static_cast<QETWidget*>(qAppPriv->gestureWidget)->translateGestureEvent(msg, gi);
+// if (qAppPriv->CloseGestureInfoHandle)
+// qAppPriv->CloseGestureInfoHandle((HANDLE)msg.lParam);
+// if (gi.dwID == GID_END)
+// qAppPriv->gestureWidget = 0;
+// } else {
+// DWORD dwErr = GetLastError();
+// if (dwErr > 0)
+// qWarning() << "translateGestureEvent: error = " << dwErr;
}
result = true;
break;
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm
index b1c5fc5..d49c150 100644
--- a/src/gui/kernel/qcocoaview_mac.mm
+++ b/src/gui/kernel/qcocoaview_mac.mm
@@ -51,6 +51,7 @@
#include <private/qmacinputcontext_p.h>
#include <private/qmultitouch_mac_p.h>
#include <private/qevent_p.h>
+#include <private/qbackingstore_p.h>
#include <qscrollarea.h>
#include <qhash.h>
@@ -503,6 +504,12 @@ extern "C" {
- (void)drawRect:(NSRect)aRect
{
+ if (QApplicationPrivate::graphicsSystem() != 0) {
+ if (QWidgetBackingStore *bs = qwidgetprivate->maybeBackingStore())
+ bs->markDirty(qwidget->rect(), qwidget);
+ qwidgetprivate->syncBackingStore(qwidget->rect());
+ return;
+ }
CGContextRef cg = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
qwidgetprivate->hd = cg;
CGContextSaveGState(cg);
@@ -1066,7 +1073,10 @@ extern "C" {
sendToPopup = true;
}
- if (widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled)) {
+ if (widgetToGetKey->testAttribute(Qt::WA_InputMethodEnabled)
+ && !(widgetToGetKey->inputMethodHints() & Qt::ImhDigitsOnly
+ || widgetToGetKey->inputMethodHints() & Qt::ImhFormattedNumbersOnly
+ || widgetToGetKey->inputMethodHints() & Qt::ImhHiddenText)) {
[qt_mac_nativeview_for(widgetToGetKey) interpretKeyEvents:[NSArray arrayWithObject: theEvent]];
}
if (sendKeyEvents && !composing) {
@@ -1420,29 +1430,29 @@ Qt::DropAction QDragManager::drag(QDrag *o)
// convert the image to NSImage.
NSImage *image = (NSImage *)qt_mac_create_nsimage(pix);
[image retain];
- DnDParams *dndParams = [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent];
+ DnDParams dndParams = *[QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent];
// save supported actions
- [dndParams->view setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)];
- NSPoint imageLoc = {dndParams->localPoint.x - hotspot.x(),
- dndParams->localPoint.y + pix.height() - hotspot.y()};
+ [dndParams.view setSupportedActions: qt_mac_mapDropActions(dragPrivate()->possible_actions)];
+ NSPoint imageLoc = {dndParams.localPoint.x - hotspot.x(),
+ dndParams.localPoint.y + pix.height() - hotspot.y()};
NSSize mouseOffset = {0.0, 0.0};
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
- NSPoint windowPoint = [dndParams->theEvent locationInWindow];
+ NSPoint windowPoint = [dndParams.theEvent locationInWindow];
dragPrivate()->executed_action = Qt::ActionMask;
// do the drag
- [dndParams->view retain];
- [dndParams->view dragImage:image
+ [dndParams.view retain];
+ [dndParams.view dragImage:image
at:imageLoc
offset:mouseOffset
- event:dndParams->theEvent
+ event:dndParams.theEvent
pasteboard:pboard
- source:dndParams->view
+ source:dndParams.view
slideBack:YES];
- [dndParams->view release];
+ [dndParams.view release];
[image release];
dragPrivate()->executed_action = Qt::IgnoreAction;
object = 0;
- Qt::DropAction performedAction(qt_mac_mapNSDragOperation(dndParams->performedAction));
+ Qt::DropAction performedAction(qt_mac_mapNSDragOperation(dndParams.performedAction));
// do post drag processing, if required.
if(performedAction != Qt::IgnoreAction) {
// check if the receiver points us to a file location.
diff --git a/src/gui/kernel/qcursor_s60.cpp b/src/gui/kernel/qcursor_s60.cpp
index 0d8283d..7f5c32a 100644
--- a/src/gui/kernel/qcursor_s60.cpp
+++ b/src/gui/kernel/qcursor_s60.cpp
@@ -110,7 +110,7 @@ void qt_symbian_set_cursor_visible(bool visible) {
else
cursorSpriteVisible--;
Q_ASSERT(cursorSpriteVisible >=0);
-
+
if (cursorSpriteVisible && !S60->mouseInteractionEnabled) {
#ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS
if (S60->brokenPointerCursors)
@@ -119,7 +119,7 @@ void qt_symbian_set_cursor_visible(bool visible) {
#endif
S60->wsSession().SetPointerCursorMode(EPointerCursorNormal);
} else if (!cursorSpriteVisible && S60->mouseInteractionEnabled) {
-#ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS
+#ifndef Q_SYMBIAN_FIXED_POINTER_CURSORS
if (S60->brokenPointerCursors)
qt_symbian_hide_pointer_sprite();
else
@@ -188,7 +188,7 @@ Qt::HANDLE QCursor::handle() const
return reinterpret_cast<Qt::HANDLE> (&(d->pcurs));
#ifdef Q_SYMBIAN_HAS_SYSTEM_CURSORS
- // don't construct shape cursors, QApplication_s60 will use the system cursor instead
+ // don't construct shape cursors, QApplication_s60 will use the system cursor instead
if (!(d->bm))
return 0;
#endif
@@ -228,12 +228,12 @@ void QCursorData::loadShapeFromResource(RWsSpriteBase& target, QString resource,
/*
* Constructs the native cursor from resources compiled into QtGui
* This is needed only when the platform doesn't have system cursors.
- *
+ *
* System cursors are higher performance, since they are constructed once
* and shared by all applications by specifying the shape number.
* Due to symbian platform security considerations, and the fact most
* existing phones have a broken RWsPointerCursor, system cursors are not
- * being used.
+ * being used.
*/
void QCursorData::constructShapeSprite(RWsSpriteBase& target)
{
@@ -346,7 +346,7 @@ void QCursorData::constructCursorSprite(RWsSpriteBase& target)
member->iMaskBitmap = pixmap.mask().toSymbianCFbsBitmap();
}
else {
- member->iMaskBitmap = pixmap.createHeuristicMask().toSymbianCFbsBitmap();
+ member->iMaskBitmap = 0; //opaque rectangle cursor (due to EDrawModePEN)
}
}
@@ -371,11 +371,11 @@ void qt_symbian_show_pointer_sprite()
} else {
cursorSprite = QCursor(Qt::ArrowCursor);
}
-
+
cursorSprite.d->scurs = RWsSprite(S60->wsSession());
QPoint pos = QCursor::pos();
cursorSprite.d->scurs.Construct(S60->windowGroup(), TPoint(pos.x(), pos.y()), ESpriteNoChildClip | ESpriteNoShadows);
-
+
cursorSprite.d->constructCursorSprite(cursorSprite.d->scurs);
cursorSprite.d->scurs.Activate();
}
@@ -409,7 +409,7 @@ void qt_symbian_set_pointer_sprite(const QCursor& cursor)
* RWsPointerCursor, this function is called in response to pointer events
* and when QCursor::setPos() is called.
* Performance is worse than a real pointer cursor, due to extra context
- * switches vs. the window server moving the cursor by itself.
+ * switches vs. the window server moving the cursor by itself.
*/
void qt_symbian_move_cursor_sprite()
{
@@ -421,7 +421,7 @@ void qt_symbian_move_cursor_sprite()
/*
* Translate from Qt::CursorShape to OS system pointer cursor list index.
* Currently we control the implementation of the system pointer cursor list,
- * so this function is trivial. That may not always be the case.
+ * so this function is trivial. That may not always be the case.
*/
TInt qt_symbian_translate_cursor_shape(Qt::CursorShape shape)
{
@@ -462,7 +462,7 @@ void qt_symbian_set_cursor(QWidget *w, bool force)
/*
* Makes the specified cursor appear above a specific native window group
* Called from QSymbianControl and QApplication::restoreOverrideCursor
- *
+ *
* Window server is needed for this, so there is no equivalent when using
* the sprite workaround.
*/
@@ -486,7 +486,7 @@ void qt_symbian_setWindowGroupCursor(const QCursor &cursor, RWindowTreeNode &nod
/*
* Makes the specified cursor appear above a specific native window
* Called from QSymbianControl and QApplication::restoreOverrideCursor
- *
+ *
* Window server is needed for this, so there is no equivalent when using
* the sprite workaround.
*/
diff --git a/tests/manual/gestures/pinch/main.cpp b/src/gui/kernel/qdesktopwidget.cpp
index 4d9c14c..b1e1008 100644
--- a/tests/manual/gestures/pinch/main.cpp
+++ b/src/gui/kernel/qdesktopwidget.cpp
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the test suite of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,30 +39,29 @@
**
****************************************************************************/
-#include <QtGui>
-#include "pinchwidget.h"
+#include "qglobal.h"
-class MainWindow : public QWidget
-{
-public:
- MainWindow();
-};
+QT_BEGIN_NAMESPACE
+
+#include "qdesktopwidget.h"
+#include "qwidget_p.h"
-MainWindow::MainWindow()
+const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const
{
- QVBoxLayout *l = new QVBoxLayout(this);
- QPushButton *btn = new QPushButton(QLatin1String("AcceptTouchEvents"));
- l->addWidget(btn);
- QImage image(":/images/qt-logo.png");
- PinchWidget *w = new PinchWidget(image);
- l->addWidget(w);
- connect(btn, SIGNAL(clicked()), w, SLOT(acceptTouchEvents()));
+ QRect rect = QWidgetPrivate::screenGeometry(widget);
+ if (rect.isNull())
+ return screenGeometry(screenNumber(widget));
+ else return rect;
}
-int main(int argc, char *argv[])
+const QRect QDesktopWidget::availableGeometry(const QWidget *widget) const
{
- QApplication app(argc, argv);
- MainWindow w;
- w.show();
- return app.exec();
+ QRect rect = QWidgetPrivate::screenGeometry(widget);
+ if (rect.isNull())
+ return availableGeometry(screenNumber(widget));
+ else
+ return rect;
}
+
+QT_END_NAMESPACE
+
diff --git a/src/gui/kernel/qdesktopwidget.h b/src/gui/kernel/qdesktopwidget.h
index 85f479e..6e3447c 100644
--- a/src/gui/kernel/qdesktopwidget.h
+++ b/src/gui/kernel/qdesktopwidget.h
@@ -75,14 +75,12 @@ public:
QWidget *screen(int screen = -1);
const QRect screenGeometry(int screen = -1) const;
- const QRect screenGeometry(const QWidget *widget) const
- { return screenGeometry(screenNumber(widget)); }
+ const QRect screenGeometry(const QWidget *widget) const;
const QRect screenGeometry(const QPoint &point) const
{ return screenGeometry(screenNumber(point)); }
const QRect availableGeometry(int screen = -1) const;
- const QRect availableGeometry(const QWidget *widget) const
- { return availableGeometry(screenNumber(widget)); }
+ const QRect availableGeometry(const QWidget *widget) const;
const QRect availableGeometry(const QPoint &point) const
{ return availableGeometry(screenNumber(point)); }
diff --git a/src/gui/kernel/qdnd_s60.cpp b/src/gui/kernel/qdnd_s60.cpp
index 3d6ecd2..a8d3ac5 100644
--- a/src/gui/kernel/qdnd_s60.cpp
+++ b/src/gui/kernel/qdnd_s60.cpp
@@ -277,7 +277,7 @@ Qt::DropAction QDragManager::drag(QDrag *o)
qApp->installEventFilter(this);
- global_accepted_action = Qt::MoveAction;
+ global_accepted_action = defaultAction(dragPrivate()->possible_actions, Qt::NoModifier);
qt_symbian_dnd_dragging = true;
eventLoop = new QEventLoop;
@@ -288,7 +288,7 @@ Qt::DropAction QDragManager::drag(QDrag *o)
#ifndef QT_NO_CURSOR
qt_symbian_set_cursor_visible(false);
-
+
overrideCursor = QCursor(); //deref the cursor data
qt_symbian_dnd_dragging = false;
#endif
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 7b9cc9a..065bd09 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -45,10 +45,13 @@
#include "private/qapplication_p.h"
#include "private/qkeysequence_p.h"
#include "qwidget.h"
+#include "qgraphicsview.h"
#include "qdebug.h"
#include "qmime.h"
#include "qdnd_p.h"
#include "qevent_p.h"
+#include "qgesture.h"
+#include "qgesture_p.h"
QT_BEGIN_NAMESPACE
@@ -3357,6 +3360,9 @@ QDebug operator<<(QDebug dbg, const QEvent *e) {
case QEvent::ChildRemoved: n = n ? n : "ChildRemoved";
dbg.nospace() << "QChildEvent(" << n << ", " << (static_cast<const QChildEvent*>(e))->child();
return dbg.space();
+ case QEvent::Gesture:
+ n = "Gesture";
+ break;
default:
dbg.nospace() << "QEvent(" << (const void *)e << ", type = " << e->type() << ')';
return dbg.space();
@@ -3558,6 +3564,7 @@ QMenubarUpdatedEvent::QMenubarUpdatedEvent(QMenuBar * const menuBar)
\brief The QTouchEvent class contains parameters that describe a touch event.
\since 4.6
\ingroup events
+ \ingroup multitouch
\section1 Enabling Touch Events
@@ -4186,4 +4193,229 @@ QTouchEvent::TouchPoint &QTouchEvent::TouchPoint::operator=(const QTouchEvent::T
return *this;
}
+/*!
+ \class QGestureEvent
+ \since 4.6
+ \ingroup events
+ \ingroup gestures
+
+ \brief The QGestureEvent class provides the description of triggered gestures.
+
+ The QGestureEvent class contains a list of gestures, which can be obtained using the
+ allGestures() function.
+
+ The gestures are either active or canceled. A list of those that are currently being
+ executed can be obtained using the activeGestures() function. A list of those which
+ were previously active and have been canceled can be accessed using the
+ canceledGestures() function. A gesture might be canceled if the current window loses
+ focus, for example, or because of a timeout, or for other reasons.
+
+ If the event handler does not accept the event by calling the generic
+ QEvent::accept() function, all individual QGesture object that were not accepted
+ will be propagated up the parent widget chain until a widget accepts them
+ individually, by calling QGestureEvent::accept() for each of them, or an event
+ filter consumes the event.
+
+ \sa QGesture, QGestureRecognizer,
+ QWidget::grabGesture(), QGraphicsObject::grabGesture()
+*/
+
+/*!
+ Creates new QGestureEvent containing a list of \a gestures.
+*/
+QGestureEvent::QGestureEvent(const QList<QGesture *> &gestures)
+ : QEvent(QEvent::Gesture)
+{
+ d = reinterpret_cast<QEventPrivate *>(new QGestureEventPrivate(gestures));
+}
+
+/*!
+ Destroys QGestureEvent.
+*/
+QGestureEvent::~QGestureEvent()
+{
+ delete reinterpret_cast<QGestureEventPrivate *>(d);
+}
+
+/*!
+ Returns all gestures that are delivered in the event.
+*/
+QList<QGesture *> QGestureEvent::allGestures() const
+{
+ return d_func()->gestures;
+}
+
+/*!
+ Returns a gesture object by \a type.
+*/
+QGesture *QGestureEvent::gesture(Qt::GestureType type) const
+{
+ const QGestureEventPrivate *d = d_func();
+ for(int i = 0; i < d->gestures.size(); ++i)
+ if (d->gestures.at(i)->gestureType() == type)
+ return d->gestures.at(i);
+ return 0;
+}
+
+/*!
+ Returns a list of active (not canceled) gestures.
+*/
+QList<QGesture *> QGestureEvent::activeGestures() const
+{
+ return d_func()->gestures;
+}
+
+/*!
+ Returns a list of canceled gestures.
+*/
+QList<QGesture *> QGestureEvent::canceledGestures() const
+{
+ return d_func()->gestures;
+}
+
+/*!
+ Sets the accept flag of the given \a gesture object to the specified \a value.
+
+ Setting the accept flag indicates that the event receiver wants the \a gesture.
+ Unwanted gestures may be propagated to the parent widget.
+
+ By default, gestures in events of type QEvent::Gesture are accepted, and
+ gestures in QEvent::GestureOverride events are ignored.
+
+ For convenience, the accept flag can also be set with
+ \l{QGestureEvent::accept()}{accept(gesture)}, and cleared with
+ \l{QGestureEvent::ignore()}{ignore(gesture)}.
+*/
+void QGestureEvent::setAccepted(QGesture *gesture, bool value)
+{
+ setAccepted(false);
+ if (gesture)
+ d_func()->accepted[gesture->gestureType()] = value;
+}
+
+/*!
+ Sets the accept flag of the given \a gesture object, the equivalent of calling
+ \l{QGestureEvent::setAccepted()}{setAccepted(gesture, true)}.
+
+ Setting the accept flag indicates that the event receiver wants the
+ gesture. Unwanted gestures may be propagated to the parent widget.
+
+ \sa QGestureEvent::ignore()
+*/
+void QGestureEvent::accept(QGesture *gesture)
+{
+ setAccepted(gesture, true);
+}
+
+/*!
+ Clears the accept flag parameter of the given \a gesture object, the equivalent
+ of calling \l{QGestureEvent::setAccepted()}{setAccepted(gesture, false)}.
+
+ Clearing the accept flag indicates that the event receiver does not
+ want the gesture. Unwanted gestures may be propgated to the parent widget.
+
+ \sa QGestureEvent::accept()
+*/
+void QGestureEvent::ignore(QGesture *gesture)
+{
+ setAccepted(gesture, false);
+}
+
+/*!
+ Returns true if the \a gesture is accepted; otherwise returns false.
+*/
+bool QGestureEvent::isAccepted(QGesture *gesture) const
+{
+ return gesture ? d_func()->accepted.value(gesture->gestureType(), true) : false;
+}
+
+/*!
+ Sets the widget for this event.
+*/
+void QGestureEvent::setWidget(QWidget *widget)
+{
+ d_func()->widget = widget;
+}
+
+/*!
+ Returns the widget on which the event occurred.
+*/
+QWidget *QGestureEvent::widget() const
+{
+ return d_func()->widget;
+}
+
+/*!
+ Returns the scene-local coordinates if the \a gesturePoint is inside a graphics view.
+
+ \sa QPointF::isNull().
+*/
+QPointF QGestureEvent::mapToScene(const QPointF &gesturePoint) const
+{
+ QWidget *w = widget();
+ if (w) // we get the viewport as widget, not the graphics view
+ w = w->parentWidget();
+ QGraphicsView *view = qobject_cast<QGraphicsView*>(w);
+ if (view) {
+ return view->mapToScene(view->mapFromGlobal(gesturePoint.toPoint()));
+ }
+ return QPointF();
+}
+
+/*!
+ \internal
+*/
+QGestureEventPrivate *QGestureEvent::d_func()
+{
+ return reinterpret_cast<QGestureEventPrivate *>(d);
+}
+
+/*!
+ \internal
+*/
+const QGestureEventPrivate *QGestureEvent::d_func() const
+{
+ return reinterpret_cast<const QGestureEventPrivate *>(d);
+}
+
+#ifdef Q_NO_USING_KEYWORD
+/*!
+ \fn void QGestureEvent::setAccepted(bool accepted)
+
+ Sets or clears the event's internal flag that determines whether it should
+ be delivered to other objects.
+
+ Calling this function with a value of true for \a accepted indicates that the
+ caller has accepted the event and that it should not be propagated further.
+ Calling this function with a value of false indicates that the caller has
+ ignored the event and that it should be delivered to other objects.
+
+ For convenience, the accept flag can also be set with accept(), and cleared
+ with ignore().
+
+ \sa QEvent::accepted
+*/
+/*!
+ \fn bool QGestureEvent::isAccepted() const
+
+ Returns true is the event has been accepted; otherwise returns false.
+
+ \sa QEvent::accepted
+*/
+/*!
+ \fn void QGestureEvent::accept()
+
+ Accepts the event, the equivalent of calling setAccepted(true).
+
+ \sa QEvent::accept()
+*/
+/*!
+ \fn void QGestureEvent::ignore()
+
+ Ignores the event, the equivalent of calling setAccepted(false).
+
+ \sa QEvent::ignore()
+*/
+#endif
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index 4396766..b7370fd 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -819,6 +819,51 @@ protected:
friend class QApplicationPrivate;
};
+class QGesture;
+class QGestureEventPrivate;
+class Q_GUI_EXPORT QGestureEvent : public QEvent
+{
+public:
+ QGestureEvent(const QList<QGesture *> &gestures);
+ ~QGestureEvent();
+
+ QList<QGesture *> allGestures() const;
+ QGesture *gesture(Qt::GestureType type) const;
+
+ QList<QGesture *> activeGestures() const;
+ QList<QGesture *> canceledGestures() const;
+
+#ifdef Q_NO_USING_KEYWORD
+ inline void setAccepted(bool accepted) { QEvent::setAccepted(accepted); }
+ inline bool isAccepted() const { return QEvent::isAccepted(); }
+
+ inline void accept() { QEvent::accept(); }
+ inline void ignore() { QEvent::ignore(); }
+#else
+ using QEvent::setAccepted;
+ using QEvent::isAccepted;
+ using QEvent::accept;
+ using QEvent::ignore;
+#endif
+
+ void setAccepted(QGesture *, bool);
+ void accept(QGesture *);
+ void ignore(QGesture *);
+ bool isAccepted(QGesture *) const;
+
+ void setWidget(QWidget *widget);
+ QWidget *widget() const;
+
+ QPointF mapToScene(const QPointF &gesturePoint) const;
+
+private:
+ QGestureEventPrivate *d_func();
+ const QGestureEventPrivate *d_func() const;
+
+ friend class QApplication;
+ friend class QGestureManager;
+};
+
QT_END_NAMESPACE
QT_END_HEADER
diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h
index c7a4975..6e6ab01 100644
--- a/src/gui/kernel/qevent_p.h
+++ b/src/gui/kernel/qevent_p.h
@@ -150,6 +150,20 @@ public:
#endif
};
+class QGestureEventPrivate
+{
+public:
+ inline QGestureEventPrivate(const QList<QGesture *> &list)
+ : gestures(list), widget(0)
+ {
+ }
+
+ QList<QGesture *> gestures;
+ QWidget *widget;
+ QMap<Qt::GestureType, bool> accepted;
+ QMap<Qt::GestureType, QWidget *> targetWidgets;
+};
+
QT_END_NAMESPACE
#endif // QEVENT_P_H
diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm
index 7152705..c9dd949 100644
--- a/src/gui/kernel/qeventdispatcher_mac.mm
+++ b/src/gui/kernel/qeventdispatcher_mac.mm
@@ -136,14 +136,19 @@ void QEventDispatcherMacPrivate::activateTimer(CFRunLoopTimerRef, void *info)
if (tmr == 0 || tmr->pending == true)
return; // Can't send another timer event if it's pending.
- tmr->pending = true;
- QTimerEvent e(tmr->id);
- qt_sendSpontaneousEvent(tmr->obj, &e);
- // Get the value again in case the timer gets unregistered during the sendEvent.
- tmr = macTimerHash.value(timerID);
- if (tmr != 0)
- tmr->pending = false;
+ if (blockSendPostedEvents) {
+ QCoreApplication::postEvent(tmr->obj, new QTimerEvent(tmr->id));
+ } else {
+ tmr->pending = true;
+ QTimerEvent e(tmr->id);
+ qt_sendSpontaneousEvent(tmr->obj, &e);
+ // Get the value again in case the timer gets unregistered during the sendEvent.
+ tmr = macTimerHash.value(timerID);
+ if (tmr != 0)
+ tmr->pending = false;
+ }
+
}
void QEventDispatcherMac::registerTimer(int timerId, int interval, QObject *obj)
@@ -767,7 +772,7 @@ NSModalSession QEventDispatcherMacPrivate::currentModalSession()
// Sadly, we need to introduce this little event flush
// to stop dialogs from blinking/poping in front if a
// modal session restart was needed:
- while (NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
+ while (NSEvent *event = [NSApp nextEventMatchingMask:0
untilDate:nil
inMode:NSDefaultRunLoopMode
dequeue: YES]) {
@@ -942,7 +947,7 @@ Boolean QEventDispatcherMacPrivate::postedEventSourceEqualCallback(const void *i
inline static void processPostedEvents(QEventDispatcherMacPrivate *const d, const bool blockSendPostedEvents)
{
- if (blockSendPostedEvents) {
+ if (blockSendPostedEvents || d->interrupt) {
CFRunLoopSourceSignal(d->postedEventsSource);
} else {
if (!d->threadData->canWait || (d->serialNumber != d->lastSerial)) {
diff --git a/src/gui/kernel/qgesture.cpp b/src/gui/kernel/qgesture.cpp
index 237ce46..ecdd661 100644
--- a/src/gui/kernel/qgesture.cpp
+++ b/src/gui/kernel/qgesture.cpp
@@ -40,274 +40,579 @@
****************************************************************************/
#include "qgesture.h"
-#include <private/qgesture_p.h>
-#include "qgraphicsitem.h"
+#include "private/qgesture_p.h"
QT_BEGIN_NAMESPACE
-
-class QEventFilterProxyGraphicsItem : public QGraphicsItem
-{
-public:
- QEventFilterProxyGraphicsItem(QGesture *g)
- : gesture(g)
- {
- }
- bool sceneEventFilter(QGraphicsItem *, QEvent *event)
- {
- return gesture ? gesture->filterEvent(event) : false;
- }
- QRectF boundingRect() const { return QRectF(); }
- void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) { }
-
-private:
- QGesture *gesture;
-};
-
-/*!
+ /*!
\class QGesture
\since 4.6
- \preliminary
+ \ingroup gestures
+
+ \brief The QGesture class represents a gesture, containing properties that
+ describe the corresponding user input.
- \brief The QGesture class is the base class for implementing custom
- gestures.
+ Gesture objects are not constructed directly by developers. They are created by
+ the QGestureRecognizer object that is registered with the application; see
+ QApplication::registerGestureRecognizer().
- This class represents both an object that recognizes a gesture out of a set
- of input events (a gesture recognizer), and a gesture object itself that
- can be used to get extended information about the triggered gesture.
+ \section1 Gesture Properties
The class has a list of properties that can be queried by the user to get
- some gesture-specific parameters (for example, an offset of a Pan gesture).
+ some gesture-specific arguments. For example, the pinch gesture has a scale
+ factor that is exposed as a property.
+
+ Developers of custom gesture recognizers can add additional properties in
+ order to provide additional information about a gesture. This can be done
+ by adding new dynamic properties to a QGesture object, or by subclassing
+ the QGesture class (or one of its subclasses).
+
+ \section1 Lifecycle of a Gesture Object
- Usually gesture recognizer implements a state machine, storing its state
- internally in the recognizer object. The recognizer receives input events
- through the \l{QGesture::}{filterEvent()} virtual function and decides
- whether the event should change the state of the recognizer by emitting an
- appropriate signal.
+ A QGesture instance is created when the application calls QWidget::grabGesture()
+ or QGraphicsObject::grabGesture() to configure a widget or graphics object (the
+ target object) for gesture input. One gesture object is created for each target
+ object.
- Input events should be either fed to the recognizer one by one with a
- filterEvent() function, or the gesture recognizer should be attached to an
- object it filters events for by specifying it as a parent object. The
- QGesture object installs itself as an event filter to the parent object
- automatically, the unsetObject() function should be used to remove an event
- filter from the parent object. To make a
- gesture that operates on a QGraphicsItem, both the appropriate QGraphicsView
- should be passed as a parent object and setGraphicsItem() functions should
- be used to attach a gesture to a graphics item.
+ The registered gesture recognizer monitors the input events for the target
+ object via its \l{QGestureRecognizer::}{filterEvent()} function, updating the
+ properties of the gesture object as required.
- This is a base class, to create a custom gesture type, you should subclass
- it and implement its pure virtual functions.
+ The gesture object may be delivered to the target object in a QGestureEvent if
+ the corresponding gesture is active or has just been canceled. Each event that
+ is delivered contains a list of gesture objects, since support for more than
+ one gesture may be enabled for the target object. Due to the way events are
+ handled in Qt, gesture events may be filtered by other objects.
- \sa QPanGesture
+ \sa QGestureEvent, QGestureRecognizer
*/
-/*! \fn bool QGesture::filterEvent(QEvent *event)
+/*!
+ Constructs a new gesture object with the given \a parent.
- Parses input \a event and emits a signal when detects a gesture.
+ QGesture objects are created by gesture recognizers in the
+ QGestureRecognizer::createGesture() function.
+*/
+QGesture::QGesture(QObject *parent)
+ : QObject(*new QGesturePrivate, parent)
+{
+ d_func()->gestureType = Qt::CustomGesture;
+}
+
+/*!
+ \internal
+*/
+QGesture::QGesture(QGesturePrivate &dd, QObject *parent)
+ : QObject(dd, parent)
+{
+}
- In your reimplementation of this function, if you want to filter the \a
- event out, i.e. stop it being handled further, return true; otherwise
- return false;
+/*!
+ Destroys the gesture object.
+*/
+QGesture::~QGesture()
+{
+}
- This is a pure virtual function that needs to be implemented in subclasses.
+/*!
+ \property QGesture::state
+ \brief the current state of the gesture
*/
-/*! \fn void QGesture::started()
+/*!
+ \property QGesture::gestureType
+ \brief the type of the gesture
+*/
- The signal is emitted when the gesture is started. Extended information
- about the gesture is contained in the signal sender object.
+/*!
+ \property QGesture::hotSpot
- In addition to started(), a triggered() signal should also be emitted.
+ \brief The point that is used to find the receiver for the gesture event.
+
+ The hot-spot is a point in the global coordinate system, use
+ QWidget::mapFromGlobal() or QGestureEvent::mapToScene() to get a
+ local hot-spot.
+
+ If the hot-spot is not set, the targetObject is used as the receiver of the
+ gesture event.
*/
-/*! \fn void QGesture::triggered()
+/*!
+ \property QGesture::hasHotSpot
+ \brief whether the gesture has a hot-spot
+*/
- The signal is emitted when the gesture is detected. Extended information
- about the gesture is contained in the signal sender object.
+/*!
+ \property QGesture::targetObject
+ \brief the target object which will receive the gesture event if the hotSpot is
+ not set
*/
-/*! \fn void QGesture::finished()
+Qt::GestureType QGesture::gestureType() const
+{
+ return d_func()->gestureType;
+}
+
+Qt::GestureState QGesture::state() const
+{
+ return d_func()->state;
+}
+
+QPointF QGesture::hotSpot() const
+{
+ return d_func()->hotSpot;
+}
+
+void QGesture::setHotSpot(const QPointF &value)
+{
+ Q_D(QGesture);
+ d->hotSpot = value;
+ d->isHotSpotSet = true;
+}
+
+bool QGesture::hasHotSpot() const
+{
+ return d_func()->isHotSpotSet;
+}
+
+void QGesture::unsetHotSpot()
+{
+ d_func()->isHotSpotSet = false;
+}
+
+/*!
+ \class QPanGesture
+ \since 4.6
+ \brief The QPanGesture class describes a panning gesture made by the user.
+ \ingroup gestures
+
+ \image pangesture.png
- The signal is emitted when the gesture is finished. Extended information
- about the gesture is contained in the signal sender object.
+ \sa {Gestures Programming}, QPinchGesture, QSwipeGesture
*/
-/*! \fn void QGesture::canceled()
+/*!
+ \property QPanGesture::totalOffset
+ \brief the total offset from the first input position to the current input
+ position
- The signal is emitted when the gesture is canceled, for example the
- reset() function is called while the gesture was in the process of
- emitting a triggered() signal. Extended information about the
- gesture is contained in the sender object.
+ The total offset measures the total change in position of the user's input
+ covered by the gesture on the input device.
*/
/*!
- Creates a new gesture handler object and marks it as a child of \a
- parent. \a gestureTarget is the object that the gesture will watch
- for events.
+ \property QPanGesture::lastOffset
+ \brief the last offset recorded for this gesture
- The \a parent object is also the default event source for the
- gesture, meaning that the gesture installs itself as an event filter
- for the \a parent.
+ The last offset contains the change in position of the user's input as
+ reported in the \l offset property when a previous gesture event was
+ delivered for this gesture.
- \sa setGraphicsItem()
+ If no previous event was delivered with information about this gesture
+ (i.e., this gesture object contains information about the first movement
+ in the gesture) then this property contains a zero size.
*/
-QGesture::QGesture(QObject *gestureTarget, QObject *parent)
- : QObject(*new QGesturePrivate, parent)
+
+/*!
+ \property QPanGesture::offset
+ \brief the offset from the previous input position to the current input
+ position
+
+ The offset measures the change in position of the user's input on the
+ input device.
+*/
+
+/*!
+ \property QPanGesture::acceleration
+*/
+
+/*!
+ \internal
+*/
+QPanGesture::QPanGesture(QObject *parent)
+ : QGesture(*new QPanGesturePrivate, parent)
{
- setGestureTarget(gestureTarget);
+ d_func()->gestureType = Qt::PanGesture;
}
-/*! \internal
- */
-QGesture::QGesture(QGesturePrivate &dd, QObject *gestureTarget, QObject *parent)
- : QObject(dd, parent)
+QPointF QPanGesture::totalOffset() const
{
- setGestureTarget(gestureTarget);
+ return d_func()->totalOffset;
}
-/*!
- Destroys the gesture object.
-*/
-QGesture::~QGesture()
+QPointF QPanGesture::lastOffset() const
{
+ return d_func()->lastOffset;
}
-/*!
- \property QGesture::gestureTarget
+QPointF QPanGesture::offset() const
+{
+ return d_func()->offset;
+}
- Gesture target is the object that the gesture will watch for events.
- Typically this means that the gesture installs an event filter on the
- target object.
-*/
-void QGesture::setGestureTarget(QObject *object)
+qreal QPanGesture::acceleration() const
+{
+ return d_func()->acceleration;
+}
+
+
+void QPanGesture::setTotalOffset(const QPointF &value)
{
- d_func()->setupGestureTarget(object);
+ d_func()->totalOffset = value;
}
-QObject* QGesture::gestureTarget() const
+void QPanGesture::setLastOffset(const QPointF &value)
{
- return d_func()->gestureTarget;
+ d_func()->lastOffset = value;
}
-void QGesturePrivate::setupGestureTarget(QObject *object)
+void QPanGesture::setOffset(const QPointF &value)
{
- Q_Q(QGesture);
- if (gestureTarget)
- gestureTarget->removeEventFilter(q);
- if (object)
- object->installEventFilter(q);
- gestureTarget = object;
+ d_func()->offset = value;
}
-/*! \internal
- */
-bool QGesture::eventFilter(QObject *receiver, QEvent *event)
+void QPanGesture::setAcceleration(qreal value)
{
- Q_D(QGesture);
- if (d->graphicsItem && receiver == parent())
- return false;
- return filterEvent(event);
+ d_func()->acceleration = value;
}
/*!
- \property QGesture::state
+ \class QPinchGesture
+ \since 4.6
+ \brief The QPinchGesture class describes a pinch gesture made my the user.
+ \ingroup multitouch
+ \ingroup gestures
+
+ A pinch gesture is a form of multitouch user input in which the user typically
+ touches two points on the input device with a thumb and finger, before moving
+ them closer together or further apart to change the scale factor, zoom, or level
+ of detail of the user interface.
- \brief The current state of the gesture.
+ \image pinchgesture.png
+
+ Instead of repeatedly applying the same pinching gesture, the user may
+ continue to touch the input device in one place, and apply a second touch
+ to a new point, continuing the gesture. When this occurs, gesture events
+ will continue to be delivered to the target object, containing an instance
+ of QPinchGesture in the Qt::GestureUpdated state.
+
+ \sa {Gestures Programming}, QPanGesture, QSwipeGesture
*/
/*!
- Returns the gesture recognition state.
- */
-Qt::GestureState QGesture::state() const
+ \enum QPinchGesture::WhatChange
+
+ This enum describes the changes that can occur to the properties of
+ the gesture object.
+
+ \value ScaleFactorChanged The scale factor held by scaleFactor changed.
+ \value RotationAngleChanged The rotation angle held by rotationAngle changed.
+ \value CenterPointChanged The center point held by centerPoint changed.
+
+ \sa whatChanged
+*/
+
+/*!
+ \property QPinchGesture::whatChanged
+ \brief the property of the gesture that has changed
+
+ This property indicates which of the other properties has changed since
+ the previous gesture event included information about this gesture. You
+ can use this information to determine which aspect of your user interface
+ needs to be updated.
+
+ \sa scaleFactor, rotationAngle, centerPoint
+*/
+
+/*!
+ \property QPinchGesture::totalScaleFactor
+ \brief the total scale factor
+
+ The total scale factor measures the total change in scale factor from the
+ original value to the current scale factor.
+
+ \sa scaleFactor, lastScaleFactor
+*/
+/*!
+ \property QPinchGesture::lastScaleFactor
+ \brief the last scale factor recorded for this gesture
+
+ The last scale factor contains the scale factor reported in the
+ \l scaleFactor property when a previous gesture event included
+ information about this gesture.
+
+ If no previous event was delivered with information about this gesture
+ (i.e., this gesture object contains information about the first movement
+ in the gesture) then this property contains zero.
+
+ \sa scaleFactor, totalScaleFactor
+*/
+/*!
+ \property QPinchGesture::scaleFactor
+ \brief the current scale factor
+
+ The scale factor measures the scale factor associated with the distance
+ between two of the user's inputs on a multitouch device.
+
+ \sa totalScaleFactor, lastScaleFactor
+*/
+
+/*!
+ \property QPinchGesture::totalRotationAngle
+ \brief the total angle covered by the gesture
+
+ This total angle measures the complete angle covered by the gesture. Usually, this
+ is equal to the value held by the \l rotationAngle property, except in the case where
+ the user performs multiple rotations by removing and repositioning one of the touch
+ points, as described above. In this case, the total angle will be the sum of the
+ rotation angles for the multiple stages of the gesture.
+
+ \sa rotationAngle, lastRotationAngle
+*/
+/*!
+ \property QPinchGesture::lastRotationAngle
+ \brief the last reported angle covered by the gesture motion
+
+ The last rotation angle is the angle as reported in the \l rotationAngle property
+ when a previous gesture event was delivered for this gesture.
+
+ \sa rotationAngle, totalRotationAngle
+*/
+/*!
+ \property QPinchGesture::rotationAngle
+ \brief the angle covered by the gesture motion
+
+ \sa totalRotationAngle, lastRotationAngle
+*/
+
+/*!
+ \property QPinchGesture::startCenterPoint
+ \brief the starting position of the center point
+
+ \sa centerPoint, lastCenterPoint
+*/
+/*!
+ \property QPinchGesture::lastCenterPoint
+ \brief the last position of the center point recorded for this gesture
+
+ \sa centerPoint, startCenterPoint
+*/
+/*!
+ \property QPinchGesture::centerPoint
+ \brief the current center point
+
+ The center point is the midpoint between the two input points in the gesture.
+
+ \sa startCenterPoint, lastCenterPoint
+*/
+
+/*!
+ \internal
+*/
+QPinchGesture::QPinchGesture(QObject *parent)
+ : QGesture(*new QPinchGesturePrivate, parent)
{
- return d_func()->state;
+ d_func()->gestureType = Qt::PinchGesture;
}
-/*!
- Sets this gesture's recognition state to \a state and emits appropriate
- signals.
+QPinchGesture::WhatChanged QPinchGesture::whatChanged() const
+{
+ return d_func()->whatChanged;
+}
+
+void QPinchGesture::setWhatChanged(QPinchGesture::WhatChanged value)
+{
+ d_func()->whatChanged = value;
+}
- This functions emits the signals according to the old state and the new
- \a state, and it should be called after all the internal properties have been
- initialized.
- \sa started(), triggered(), finished(), canceled()
- */
-void QGesture::updateState(Qt::GestureState state)
+QPointF QPinchGesture::startCenterPoint() const
{
- Q_D(QGesture);
- if (d->state == state) {
- if (state == Qt::GestureUpdated)
- emit triggered();
- return;
- }
- const Qt::GestureState oldState = d->state;
- if (state != Qt::NoGesture && oldState > state) {
- // comparing the state as ints: state should only be changed from
- // started to (optionally) updated and to finished.
- d->state = state;
- qWarning("QGesture::updateState: incorrect new state");
- return;
- }
- if (oldState == Qt::NoGesture) {
- d->state = Qt::GestureStarted;
- emit started();
- }
- d->state = state;
- if (state == Qt::GestureUpdated)
- emit triggered();
- else if (state == Qt::GestureFinished)
- emit finished();
- else if (state == Qt::NoGesture)
- emit canceled();
-
- if (state == Qt::GestureFinished) {
- // gesture is finished, so we reset the internal state.
- d->state = Qt::NoGesture;
- }
-}
-
-/*!
- Sets the \a graphicsItem the gesture is filtering events for.
-
- The gesture will install an event filter to the \a graphicsItem and
- redirect them to the filterEvent() function.
-
- \sa graphicsItem()
-*/
-void QGesture::setGraphicsItem(QGraphicsItem *graphicsItem)
+ return d_func()->startCenterPoint;
+}
+
+QPointF QPinchGesture::lastCenterPoint() const
{
- Q_D(QGesture);
- if (d->graphicsItem && d->eventFilterProxyGraphicsItem)
- d->graphicsItem->removeSceneEventFilter(d->eventFilterProxyGraphicsItem);
- d->graphicsItem = graphicsItem;
- if (!d->eventFilterProxyGraphicsItem)
- d->eventFilterProxyGraphicsItem = new QEventFilterProxyGraphicsItem(this);
- if (graphicsItem)
- graphicsItem->installSceneEventFilter(d->eventFilterProxyGraphicsItem);
+ return d_func()->lastCenterPoint;
+}
+
+QPointF QPinchGesture::centerPoint() const
+{
+ return d_func()->centerPoint;
+}
+
+void QPinchGesture::setStartCenterPoint(const QPointF &value)
+{
+ d_func()->startCenterPoint = value;
+}
+
+void QPinchGesture::setLastCenterPoint(const QPointF &value)
+{
+ d_func()->lastCenterPoint = value;
+}
+
+void QPinchGesture::setCenterPoint(const QPointF &value)
+{
+ d_func()->centerPoint = value;
}
+
+qreal QPinchGesture::totalScaleFactor() const
+{
+ return d_func()->totalScaleFactor;
+}
+
+qreal QPinchGesture::lastScaleFactor() const
+{
+ return d_func()->lastScaleFactor;
+}
+
+qreal QPinchGesture::scaleFactor() const
+{
+ return d_func()->scaleFactor;
+}
+
+void QPinchGesture::setTotalScaleFactor(qreal value)
+{
+ d_func()->totalScaleFactor = value;
+}
+
+void QPinchGesture::setLastScaleFactor(qreal value)
+{
+ d_func()->lastScaleFactor = value;
+}
+
+void QPinchGesture::setScaleFactor(qreal value)
+{
+ d_func()->scaleFactor = value;
+}
+
+
+qreal QPinchGesture::totalRotationAngle() const
+{
+ return d_func()->totalRotationAngle;
+}
+
+qreal QPinchGesture::lastRotationAngle() const
+{
+ return d_func()->lastRotationAngle;
+}
+
+qreal QPinchGesture::rotationAngle() const
+{
+ return d_func()->rotationAngle;
+}
+
+void QPinchGesture::setTotalRotationAngle(qreal value)
+{
+ d_func()->totalRotationAngle = value;
+}
+
+void QPinchGesture::setLastRotationAngle(qreal value)
+{
+ d_func()->lastRotationAngle = value;
+}
+
+void QPinchGesture::setRotationAngle(qreal value)
+{
+ d_func()->rotationAngle = value;
+}
+
+/*!
+ \class QSwipeGesture
+ \since 4.6
+ \brief The QSwipeGesture class describes a swipe gesture made by the user.
+ \ingroup gestures
+
+ \image swipegesture.png
+
+ \sa {Gestures Programming}, QPanGesture, QPinchGesture
+*/
+
+/*!
+ \enum QSwipeGesture::SwipeDirection
+
+ This enum describes the possible directions for the gesture's motion
+ along the horizontal and vertical axes.
+
+ \value NoDirection The gesture had no motion associated with it on a particular axis.
+ \value Left The gesture involved a horizontal motion to the left.
+ \value Right The gesture involved a horizontal motion to the right.
+ \value Up The gesture involved an upward vertical motion.
+ \value Down The gesture involved a downward vertical motion.
+*/
+
/*!
- Returns the graphics item the gesture is filtering events for.
+ \property QSwipeGesture::horizontalDirection
+ \brief the horizontal direction of the gesture
- \sa setGraphicsItem()
+ If the gesture has a horizontal component, the horizontal direction
+ is either Left or Right; otherwise, it is NoDirection.
+
+ \sa verticalDirection, swipeAngle
*/
-QGraphicsItem* QGesture::graphicsItem() const
+
+/*!
+ \property QSwipeGesture::verticalDirection
+ \brief the vertical direction of the gesture
+
+ If the gesture has a vertical component, the vertical direction
+ is either Up or Down; otherwise, it is NoDirection.
+
+ \sa horizontalDirection, swipeAngle
+*/
+
+/*!
+ \property QSwipeGesture::swipeAngle
+ \brief the angle of the motion associated with the gesture
+
+ If the gesture has either a horizontal or vertical component, the
+ swipe angle describes the angle between the direction of motion and the
+ x-axis as defined using the standard widget
+ \l{The Coordinate System}{coordinate system}.
+
+ \sa horizontalDirection, verticalDirection
+*/
+
+/*!
+ \internal
+*/
+QSwipeGesture::QSwipeGesture(QObject *parent)
+ : QGesture(*new QSwipeGesturePrivate, parent)
+{
+ d_func()->gestureType = Qt::SwipeGesture;
+}
+
+QSwipeGesture::SwipeDirection QSwipeGesture::horizontalDirection() const
{
- return d_func()->graphicsItem;
+ Q_D(const QSwipeGesture);
+ if (d->swipeAngle < 0 || d->swipeAngle == 90 || d->swipeAngle == 270)
+ return QSwipeGesture::NoDirection;
+ else if (d->swipeAngle < 90 || d->swipeAngle > 270)
+ return QSwipeGesture::Right;
+ else
+ return QSwipeGesture::Left;
}
-/*! \fn void QGesture::reset()
+QSwipeGesture::SwipeDirection QSwipeGesture::verticalDirection() const
+{
+ Q_D(const QSwipeGesture);
+ if (d->swipeAngle <= 0 || d->swipeAngle == 180)
+ return QSwipeGesture::NoDirection;
+ else if (d->swipeAngle < 180)
+ return QSwipeGesture::Up;
+ else
+ return QSwipeGesture::Down;
+}
- Resets the internal state of the gesture. This function might be called by
- the filterEvent() implementation in a derived class, or by the user to
- cancel a gesture. The base class implementation calls
- updateState(Qt::NoGesture) which emits the canceled()
- signal if the state() of the gesture indicated it was active.
-*/
-void QGesture::reset()
+qreal QSwipeGesture::swipeAngle() const
+{
+ return d_func()->swipeAngle;
+}
+
+void QSwipeGesture::setSwipeAngle(qreal value)
{
- updateState(Qt::NoGesture);
+ d_func()->swipeAngle = value;
}
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qgesture.h b/src/gui/kernel/qgesture.h
index 440565e..6469959 100644
--- a/src/gui/kernel/qgesture.h
+++ b/src/gui/kernel/qgesture.h
@@ -51,11 +51,12 @@
QT_BEGIN_HEADER
+Q_DECLARE_METATYPE(Qt::GestureState)
+
QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
-class QGraphicsItem;
class QGesturePrivate;
class Q_GUI_EXPORT QGesture : public QObject
{
@@ -63,37 +64,146 @@ class Q_GUI_EXPORT QGesture : public QObject
Q_DECLARE_PRIVATE(QGesture)
Q_PROPERTY(Qt::GestureState state READ state)
- Q_PROPERTY(QObject* gestureTarget READ gestureTarget WRITE setGestureTarget)
+ Q_PROPERTY(Qt::GestureType gestureType READ gestureType)
+ Q_PROPERTY(QPointF hotSpot READ hotSpot WRITE setHotSpot RESET unsetHotSpot)
+ Q_PROPERTY(bool hasHotSpot READ hasHotSpot)
public:
- explicit QGesture(QObject *gestureTarget = 0, QObject *parent = 0);
+ explicit QGesture(QObject *parent = 0);
~QGesture();
- virtual bool filterEvent(QEvent *event) = 0;
-
- void setGestureTarget(QObject *object);
- QObject* gestureTarget() const;
-
- void setGraphicsItem(QGraphicsItem *);
- QGraphicsItem *graphicsItem() const;
+ Qt::GestureType gestureType() const;
Qt::GestureState state() const;
+ QPointF hotSpot() const;
+ void setHotSpot(const QPointF &value);
+ bool hasHotSpot() const;
+ void unsetHotSpot();
+
protected:
- QGesture(QGesturePrivate &dd, QObject *gestureTarget, QObject *parent);
- bool eventFilter(QObject*, QEvent*);
+ QGesture(QGesturePrivate &dd, QObject *parent);
- virtual void reset();
- void updateState(Qt::GestureState state);
+private:
+ friend class QGestureEvent;
+ friend class QGestureRecognizer;
+ friend class QGestureManager;
+};
-Q_SIGNALS:
- void started();
- void triggered();
- void finished();
- void canceled();
+class QPanGesturePrivate;
+class Q_GUI_EXPORT QPanGesture : public QGesture
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QPanGesture)
-private:
- friend class QWidget;
+ Q_PROPERTY(QPointF totalOffset READ totalOffset WRITE setTotalOffset)
+ Q_PROPERTY(QPointF lastOffset READ lastOffset WRITE setLastOffset)
+ Q_PROPERTY(QPointF offset READ offset WRITE setOffset)
+ Q_PROPERTY(qreal acceleration READ acceleration WRITE setAcceleration)
+
+public:
+ QPanGesture(QObject *parent = 0);
+
+ QPointF totalOffset() const;
+ QPointF lastOffset() const;
+ QPointF offset() const;
+ qreal acceleration() const;
+
+ void setTotalOffset(const QPointF &value);
+ void setLastOffset(const QPointF &value);
+ void setOffset(const QPointF &value);
+ void setAcceleration(qreal value);
+
+ friend class QPanGestureRecognizer;
+ friend class QWinNativePanGestureRecognizer;
+};
+
+class QPinchGesturePrivate;
+class Q_GUI_EXPORT QPinchGesture : public QGesture
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QPinchGesture)
+
+public:
+ enum WhatChange {
+ ScaleFactorChanged = 0x1,
+ RotationAngleChanged = 0x2,
+ CenterPointChanged = 0x4
+ };
+ Q_DECLARE_FLAGS(WhatChanged, WhatChange)
+
+ Q_PROPERTY(WhatChanged whatChanged READ whatChanged WRITE setWhatChanged)
+
+ Q_PROPERTY(qreal totalScaleFactor READ totalScaleFactor WRITE setTotalScaleFactor)
+ Q_PROPERTY(qreal lastScaleFactor READ lastScaleFactor WRITE setLastScaleFactor)
+ Q_PROPERTY(qreal scaleFactor READ scaleFactor WRITE setScaleFactor)
+
+ Q_PROPERTY(qreal totalRotationAngle READ totalRotationAngle WRITE setTotalRotationAngle)
+ Q_PROPERTY(qreal lastRotationAngle READ lastRotationAngle WRITE setLastRotationAngle)
+ Q_PROPERTY(qreal rotationAngle READ rotationAngle WRITE setRotationAngle)
+
+ Q_PROPERTY(QPointF startCenterPoint READ startCenterPoint WRITE setStartCenterPoint)
+ Q_PROPERTY(QPointF lastCenterPoint READ lastCenterPoint WRITE setLastCenterPoint)
+ Q_PROPERTY(QPointF centerPoint READ centerPoint WRITE setCenterPoint)
+
+public:
+ QPinchGesture(QObject *parent = 0);
+
+ WhatChanged whatChanged() const;
+ void setWhatChanged(WhatChanged value);
+
+ QPointF startCenterPoint() const;
+ QPointF lastCenterPoint() const;
+ QPointF centerPoint() const;
+ void setStartCenterPoint(const QPointF &value);
+ void setLastCenterPoint(const QPointF &value);
+ void setCenterPoint(const QPointF &value);
+
+ qreal totalScaleFactor() const;
+ qreal lastScaleFactor() const;
+ qreal scaleFactor() const;
+ void setTotalScaleFactor(qreal value);
+ void setLastScaleFactor(qreal value);
+ void setScaleFactor(qreal value);
+
+ qreal totalRotationAngle() const;
+ qreal lastRotationAngle() const;
+ qreal rotationAngle() const;
+ void setTotalRotationAngle(qreal value);
+ void setLastRotationAngle(qreal value);
+ void setRotationAngle(qreal value);
+
+ friend class QPinchGestureRecognizer;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QPinchGesture::WhatChanged)
+
+QT_BEGIN_NAMESPACE
+
+class QSwipeGesturePrivate;
+class Q_GUI_EXPORT QSwipeGesture : public QGesture
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QSwipeGesture)
+ Q_ENUMS(SwipeDirection)
+
+ Q_PROPERTY(SwipeDirection horizontalDirection READ horizontalDirection STORED false)
+ Q_PROPERTY(SwipeDirection verticalDirection READ verticalDirection STORED false)
+ Q_PROPERTY(qreal swipeAngle READ swipeAngle WRITE setSwipeAngle)
+
+public:
+ enum SwipeDirection { NoDirection, Left, Right, Up, Down };
+ QSwipeGesture(QObject *parent = 0);
+
+ SwipeDirection horizontalDirection() const;
+ SwipeDirection verticalDirection() const;
+
+ qreal swipeAngle() const;
+ void setSwipeAngle(qreal value);
+
+ friend class QSwipeGestureRecognizer;
};
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qgesture_p.h b/src/gui/kernel/qgesture_p.h
index 52e399f..975c0c9 100644
--- a/src/gui/kernel/qgesture_p.h
+++ b/src/gui/kernel/qgesture_p.h
@@ -61,29 +61,82 @@
QT_BEGIN_NAMESPACE
-class QObject;
-class QGraphicsItem;
class QGesturePrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QGesture)
public:
QGesturePrivate()
- : gestureTarget(0), graphicsItem(0), eventFilterProxyGraphicsItem(0),
- state(Qt::NoGesture), implicitGesture(false)
+ : gestureType(Qt::CustomGesture), state(Qt::NoGesture), isHotSpotSet(false),
+ targetObject(0)
{
}
- virtual void setupGestureTarget(QObject *o);
+ Qt::GestureType gestureType;
+ Qt::GestureState state;
+ QPointF hotSpot;
+ bool isHotSpotSet;
+ QObject *targetObject;
+};
- QPointer<QObject> gestureTarget;
- QGraphicsItem *graphicsItem;
- QGraphicsItem *eventFilterProxyGraphicsItem;
+class QPanGesturePrivate : public QGesturePrivate
+{
+ Q_DECLARE_PUBLIC(QPanGesture)
- Qt::GestureState state;
+public:
+ QPanGesturePrivate()
+ : acceleration(0)
+ {
+ }
+
+ QPointF totalOffset;
+ QPointF lastOffset;
+ QPointF offset;
+ QPoint lastPosition;
+ qreal acceleration;
+};
+
+class QPinchGesturePrivate : public QGesturePrivate
+{
+ Q_DECLARE_PUBLIC(QPinchGesture)
+
+public:
+ QPinchGesturePrivate()
+ : whatChanged(0), totalScaleFactor(0), lastScaleFactor(0), scaleFactor(0),
+ totalRotationAngle(0), lastRotationAngle(0), rotationAngle(0)
+ {
+ }
+
+ QPinchGesture::WhatChanged whatChanged;
+
+ QPointF startCenterPoint;
+ QPointF lastCenterPoint;
+ QPointF centerPoint;
+
+ qreal totalScaleFactor;
+ qreal lastScaleFactor;
+ qreal scaleFactor;
+
+ qreal totalRotationAngle;
+ qreal lastRotationAngle;
+ qreal rotationAngle;
+};
+
+class QSwipeGesturePrivate : public QGesturePrivate
+{
+ Q_DECLARE_PUBLIC(QSwipeGesture)
+
+public:
+ QSwipeGesturePrivate()
+ : horizontalDirection(QSwipeGesture::NoDirection),
+ verticalDirection(QSwipeGesture::NoDirection),
+ swipeAngle(0)
+ {
+ }
- // the flag specifies if the gesture was created implicitely by Qt.
- bool implicitGesture;
+ QSwipeGesture::SwipeDirection horizontalDirection;
+ QSwipeGesture::SwipeDirection verticalDirection;
+ qreal swipeAngle;
};
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp
new file mode 100644
index 0000000..ed8e744
--- /dev/null
+++ b/src/gui/kernel/qgesturemanager.cpp
@@ -0,0 +1,543 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "private/qgesturemanager_p.h"
+#include "private/qstandardgestures_p.h"
+#include "private/qwidget_p.h"
+#include "private/qgesture_p.h"
+#include "private/qgraphicsitem_p.h"
+#include "private/qevent_p.h"
+#include "qgesture.h"
+#include "qevent.h"
+#include "qgraphicsitem.h"
+
+#ifdef Q_WS_MAC
+#include "qmacgesturerecognizer_mac_p.h"
+#endif
+
+#include "qdebug.h"
+
+// #define GESTURE_DEBUG
+#ifndef GESTURE_DEBUG
+# define DEBUG if (0) qDebug
+#else
+# define DEBUG qDebug
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QGestureManager::QGestureManager(QObject *parent)
+ : QObject(parent), state(NotGesture), lastCustomGestureId(0)
+{
+ qRegisterMetaType<Qt::GestureState>();
+
+#if defined(Q_WS_MAC)
+ registerGestureRecognizer(new QMacSwipeGestureRecognizer);
+ registerGestureRecognizer(new QMacPinchGestureRecognizer);
+ #if defined(QT_MAC_USE_COCOA)
+ registerGestureRecognizer(new QMacPanGestureRecognizer);
+ #endif
+#else
+ registerGestureRecognizer(new QPanGestureRecognizer);
+#endif
+}
+
+QGestureManager::~QGestureManager()
+{
+
+}
+
+Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *recognizer)
+{
+ QGesture *dummy = recognizer->createGesture(0);
+ if (!dummy) {
+ qWarning("QGestureManager::registerGestureRecognizer: "
+ "the recognizer fails to create a gesture object, skipping registration.");
+ return Qt::GestureType(0);
+ }
+ Qt::GestureType type = dummy->gestureType();
+ if (type == Qt::CustomGesture) {
+ // generate a new custom gesture id
+ ++lastCustomGestureId;
+ type = Qt::GestureType(Qt::CustomGesture + lastCustomGestureId);
+ }
+ recognizers.insertMulti(type, recognizer);
+ delete dummy;
+ return type;
+}
+
+void QGestureManager::unregisterGestureRecognizer(Qt::GestureType)
+{
+
+}
+
+QGesture *QGestureManager::getState(QObject *object, Qt::GestureType type)
+{
+ // if the widget is being deleted we should be carefull and not to
+ // create a new state, as it will create QWeakPointer which doesnt work
+ // from the destructor.
+ if (object->isWidgetType()) {
+ if (static_cast<QWidget *>(object)->d_func()->data.in_destructor)
+ return 0;
+ } else if (QGesture *g = qobject_cast<QGesture *>(object)) {
+ return g;
+ } else {
+ Q_ASSERT(qobject_cast<QGraphicsObject *>(object));
+ }
+
+ QGesture *state =
+ objectGestures.value(QGestureManager::ObjectGesture(object, type));
+ if (!state) {
+ QGestureRecognizer *recognizer = recognizers.value(type);
+ if (recognizer) {
+ state = recognizer->createGesture(object);
+ if (!state)
+ return 0;
+ if (state->gestureType() == Qt::CustomGesture) {
+ // if the recognizer didn't fill in the gesture type, then this
+ // is a custom gesture with autogenerated it and we fill it.
+ state->d_func()->gestureType = type;
+#if defined(GESTURE_DEBUG)
+ state->setObjectName(QString::number((int)type));
+#endif
+ }
+ objectGestures.insert(QGestureManager::ObjectGesture(object, type), state);
+ gestureToRecognizer[state] = recognizer;
+ gestureOwners[state] = object;
+ }
+ }
+ return state;
+}
+
+bool QGestureManager::filterEventThroughContexts(const QMap<QObject *,
+ Qt::GestureType> &contexts,
+ QEvent *event)
+{
+ QSet<QGesture *> triggeredGestures;
+ QSet<QGesture *> finishedGestures;
+ QSet<QGesture *> newMaybeGestures;
+ QSet<QGesture *> canceledGestures;
+ QSet<QGesture *> notGestures;
+
+ // TODO: sort contexts by the gesture type and check if one of the contexts
+ // is already active.
+
+ // filter the event through recognizers
+ typedef QMap<QObject *, Qt::GestureType>::const_iterator ContextIterator;
+ for (ContextIterator cit = contexts.begin(), ce = contexts.end(); cit != ce; ++cit) {
+ Qt::GestureType gestureType = cit.value();
+ QMap<Qt::GestureType, QGestureRecognizer *>::const_iterator
+ rit = recognizers.lowerBound(gestureType),
+ re = recognizers.upperBound(gestureType);
+ for (; rit != re; ++rit) {
+ QGestureRecognizer *recognizer = rit.value();
+ QObject *target = cit.key();
+ QGesture *state = getState(target, gestureType);
+ if (!state)
+ continue;
+ QGestureRecognizer::Result result = recognizer->filterEvent(state, target, event);
+ QGestureRecognizer::Result type = result & QGestureRecognizer::ResultState_Mask;
+ if (type == QGestureRecognizer::GestureTriggered) {
+ DEBUG() << "QGestureManager: gesture triggered: " << state;
+ triggeredGestures << state;
+ } else if (type == QGestureRecognizer::GestureFinished) {
+ DEBUG() << "QGestureManager: gesture finished: " << state;
+ finishedGestures << state;
+ } else if (type == QGestureRecognizer::MaybeGesture) {
+ DEBUG() << "QGestureManager: maybe gesture: " << state;
+ newMaybeGestures << state;
+ } else if (type == QGestureRecognizer::NotGesture) {
+ DEBUG() << "QGestureManager: not gesture: " << state;
+ notGestures << state;
+ } else if (type == QGestureRecognizer::Ignore) {
+ DEBUG() << "QGestureManager: gesture ignored the event: " << state;
+ } else {
+ DEBUG() << "QGestureManager: hm, lets assume the recognizer"
+ << "ignored the event: " << state;
+ }
+ if (result & QGestureRecognizer::ConsumeEventHint) {
+ DEBUG() << "QGestureManager: we were asked to consume the event: "
+ << state;
+ //TODO: consume events if asked
+ }
+ }
+ }
+
+ QSet<QGesture *> startedGestures = triggeredGestures - activeGestures;
+ triggeredGestures &= activeGestures;
+
+ // check if a running gesture switched back to maybe state
+ QSet<QGesture *> activeToMaybeGestures = activeGestures & newMaybeGestures;
+
+ // check if a running gesture switched back to not gesture state,
+ // i.e. were canceled
+ QSet<QGesture *> activeToCancelGestures = activeGestures & notGestures;
+ canceledGestures += activeToCancelGestures;
+
+ // start timers for new gestures in maybe state
+ foreach (QGesture *state, newMaybeGestures) {
+ QBasicTimer &timer = maybeGestures[state];
+ if (!timer.isActive())
+ timer.start(3000, this);
+ }
+ // kill timers for gestures that were in maybe state
+ QSet<QGesture *> notMaybeGestures = (startedGestures | triggeredGestures
+ | finishedGestures | canceledGestures
+ | notGestures);
+ foreach(QGesture *gesture, notMaybeGestures) {
+ QMap<QGesture *, QBasicTimer>::iterator it =
+ maybeGestures.find(gesture);
+ if (it != maybeGestures.end()) {
+ it.value().stop();
+ maybeGestures.erase(it);
+ }
+ }
+
+ Q_ASSERT((startedGestures & finishedGestures).isEmpty());
+ Q_ASSERT((startedGestures & newMaybeGestures).isEmpty());
+ Q_ASSERT((startedGestures & canceledGestures).isEmpty());
+ Q_ASSERT((finishedGestures & newMaybeGestures).isEmpty());
+ Q_ASSERT((finishedGestures & canceledGestures).isEmpty());
+ Q_ASSERT((canceledGestures & newMaybeGestures).isEmpty());
+
+ QSet<QGesture *> notStarted = finishedGestures - activeGestures;
+ if (!notStarted.isEmpty()) {
+ // there are some gestures that claim to be finished, but never started.
+ // probably those are "singleshot" gestures so we'll fake the started state.
+ foreach (QGesture *gesture, notStarted)
+ gesture->d_func()->state = Qt::GestureStarted;
+ QSet<QGesture *> undeliveredGestures;
+ deliverEvents(notStarted, &undeliveredGestures);
+ finishedGestures -= undeliveredGestures;
+ }
+
+ activeGestures += startedGestures;
+ // sanity check: all triggered gestures should already be in active gestures list
+ Q_ASSERT((activeGestures & triggeredGestures).size() == triggeredGestures.size());
+ activeGestures -= finishedGestures;
+ activeGestures -= activeToMaybeGestures;
+ activeGestures -= canceledGestures;
+
+ // set the proper gesture state on each gesture
+ foreach (QGesture *gesture, startedGestures)
+ gesture->d_func()->state = Qt::GestureStarted;
+ foreach (QGesture *gesture, triggeredGestures)
+ gesture->d_func()->state = Qt::GestureUpdated;
+ foreach (QGesture *gesture, finishedGestures)
+ gesture->d_func()->state = Qt::GestureFinished;
+ foreach (QGesture *gesture, canceledGestures)
+ gesture->d_func()->state = Qt::GestureCanceled;
+ foreach (QGesture *gesture, activeToMaybeGestures)
+ gesture->d_func()->state = Qt::GestureFinished;
+
+ if (!activeGestures.isEmpty() || !maybeGestures.isEmpty() ||
+ !startedGestures.isEmpty() || !triggeredGestures.isEmpty() ||
+ !finishedGestures.isEmpty() || !canceledGestures.isEmpty()) {
+ DEBUG() << "QGestureManager::filterEvent:"
+ << "\n\tactiveGestures:" << activeGestures
+ << "\n\tmaybeGestures:" << maybeGestures.keys()
+ << "\n\tstarted:" << startedGestures
+ << "\n\ttriggered:" << triggeredGestures
+ << "\n\tfinished:" << finishedGestures
+ << "\n\tcanceled:" << canceledGestures;
+ }
+
+ QSet<QGesture *> undeliveredGestures;
+ deliverEvents(startedGestures+triggeredGestures+finishedGestures+canceledGestures,
+ &undeliveredGestures);
+
+ activeGestures -= undeliveredGestures;
+
+ // reset gestures that ended
+ QSet<QGesture *> endedGestures =
+ finishedGestures + canceledGestures + undeliveredGestures;
+ foreach (QGesture *gesture, endedGestures) {
+ if (QGestureRecognizer *recognizer = gestureToRecognizer.value(gesture, 0)) {
+ recognizer->reset(gesture);
+ }
+ gestureTargets.remove(gesture);
+ }
+ return false;
+}
+
+bool QGestureManager::filterEvent(QWidget *receiver, QEvent *event)
+{
+ QSet<Qt::GestureType> types;
+ QMap<QObject *, Qt::GestureType> contexts;
+ QWidget *w = receiver;
+ typedef QMap<Qt::GestureType, Qt::GestureContext>::const_iterator ContextIterator;
+ if (!w->d_func()->gestureContext.isEmpty()) {
+ for(ContextIterator it = w->d_func()->gestureContext.begin(),
+ e = w->d_func()->gestureContext.end(); it != e; ++it) {
+ types.insert(it.key());
+ contexts.insertMulti(w, it.key());
+ }
+ }
+ // find all gesture contexts for the widget tree
+ w = w->isWindow() ? 0 : w->parentWidget();
+ while (w)
+ {
+ for (ContextIterator it = w->d_func()->gestureContext.begin(),
+ e = w->d_func()->gestureContext.end(); it != e; ++it) {
+ if (it.value() == Qt::WidgetWithChildrenGesture) {
+ if (!types.contains(it.key())) {
+ types.insert(it.key());
+ contexts.insertMulti(w, it.key());
+ }
+ }
+ }
+ if (w->isWindow())
+ break;
+ w = w->parentWidget();
+ }
+ return filterEventThroughContexts(contexts, event);
+}
+
+bool QGestureManager::filterEvent(QGraphicsObject *receiver, QEvent *event)
+{
+ QSet<Qt::GestureType> types;
+ QMap<QObject *, Qt::GestureType> contexts;
+ QGraphicsObject *item = receiver;
+ if (!item->QGraphicsItem::d_func()->gestureContext.isEmpty()) {
+ typedef QMap<Qt::GestureType, Qt::GestureContext>::const_iterator ContextIterator;
+ for(ContextIterator it = item->QGraphicsItem::d_func()->gestureContext.begin(),
+ e = item->QGraphicsItem::d_func()->gestureContext.end(); it != e; ++it) {
+ types.insert(it.key());
+ contexts.insertMulti(item, it.key());
+ }
+ }
+ // find all gesture contexts for the graphics object tree
+ item = item->parentObject();
+ while (item)
+ {
+ typedef QMap<Qt::GestureType, Qt::GestureContext>::const_iterator ContextIterator;
+ for (ContextIterator it = item->QGraphicsItem::d_func()->gestureContext.begin(),
+ e = item->QGraphicsItem::d_func()->gestureContext.end(); it != e; ++it) {
+ if (it.value() == Qt::ItemWithChildrenGesture) {
+ if (!types.contains(it.key()))
+ contexts.insertMulti(item, it.key());
+ }
+ }
+ item = item->parentObject();
+ }
+ return filterEventThroughContexts(contexts, event);
+}
+
+bool QGestureManager::filterEvent(QGesture *state, QEvent *event)
+{
+ QMap<QObject *, Qt::GestureType> contexts;
+ contexts.insert(state, state->gestureType());
+ return filterEventThroughContexts(contexts, event);
+}
+
+void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures,
+ QMap<QWidget *, QList<QGesture *> > *conflicts,
+ QMap<QWidget *, QList<QGesture *> > *normal)
+{
+ typedef QHash<Qt::GestureType, QHash<QWidget *, QGesture *> > GestureByTypes;
+ GestureByTypes gestureByTypes;
+
+ // sort gestures by types
+ foreach (QGesture *gesture, gestures) {
+ QWidget *receiver = gestureTargets.value(gesture, 0);
+ Q_ASSERT(receiver);
+ gestureByTypes[gesture->gestureType()].insert(receiver, gesture);
+ }
+
+ // for each gesture type
+ foreach (Qt::GestureType type, gestureByTypes.keys()) {
+ QHash<QWidget *, QGesture *> gestures = gestureByTypes.value(type);
+ foreach (QWidget *widget, gestures.keys()) {
+ QWidget *w = widget->parentWidget();
+ while (w) {
+ QMap<Qt::GestureType, Qt::GestureContext>::const_iterator it
+ = w->d_func()->gestureContext.find(type);
+ if (it != w->d_func()->gestureContext.end()) {
+ // i.e. 'w' listens to gesture 'type'
+ Qt::GestureContext context = it.value();
+ if (context == Qt::WidgetWithChildrenGesture && w != widget) {
+ // conflicting gesture!
+ (*conflicts)[widget].append(gestures[widget]);
+ break;
+ }
+ }
+ if (w->isWindow()) {
+ w = 0;
+ break;
+ }
+ w = w->parentWidget();
+ }
+ if (!w)
+ (*normal)[widget].append(gestures[widget]);
+ }
+ }
+}
+
+void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures,
+ QSet<QGesture *> *undeliveredGestures)
+{
+ if (gestures.isEmpty())
+ return;
+
+ typedef QMap<QWidget *, QList<QGesture *> > GesturesPerWidget;
+ GesturesPerWidget conflictedGestures;
+ GesturesPerWidget normalStartedGestures;
+
+ QSet<QGesture *> startedGestures;
+ // first figure out the initial receivers of gestures
+ for (QSet<QGesture *>::const_iterator it = gestures.begin(),
+ e = gestures.end(); it != e; ++it) {
+ QGesture *gesture = *it;
+ QWidget *target = gestureTargets.value(gesture, 0);
+ if (!target) {
+ // the gesture has just started and doesn't have a target yet.
+ Q_ASSERT(gesture->state() == Qt::GestureStarted);
+ if (gesture->hasHotSpot()) {
+ // guess the target widget using the hotspot of the gesture
+ QPoint pt = gesture->hotSpot().toPoint();
+ if (QWidget *w = qApp->topLevelAt(pt)) {
+ target = w->childAt(w->mapFromGlobal(pt));
+ }
+ } else {
+ // or use the context of the gesture
+ QObject *context = gestureOwners.value(gesture, 0);
+ if (context->isWidgetType())
+ target = static_cast<QWidget *>(context);
+ }
+ if (target)
+ gestureTargets.insert(gesture, target);
+ }
+
+ Qt::GestureType gestureType = gesture->gestureType();
+ Q_ASSERT(gestureType != Qt::CustomGesture);
+
+ if (target) {
+ if (gesture->state() == Qt::GestureStarted) {
+ startedGestures.insert(gesture);
+ } else {
+ normalStartedGestures[target].append(gesture);
+ }
+ } else {
+ DEBUG() << "QGestureManager::deliverEvent: could not find the target for gesture"
+ << gesture->gestureType();
+ qWarning("QGestureManager::deliverEvent: could not find the target for gesture");
+ undeliveredGestures->insert(gesture);
+ }
+ }
+
+ getGestureTargets(startedGestures, &conflictedGestures, &normalStartedGestures);
+ DEBUG() << "QGestureManager::deliverEvents:"
+ << "\nstarted: " << startedGestures
+ << "\nconflicted: " << conflictedGestures
+ << "\nnormal: " << normalStartedGestures
+ << "\n";
+
+ // if there are conflicting gestures, send the GestureOverride event
+ for (GesturesPerWidget::const_iterator it = conflictedGestures.begin(),
+ e = conflictedGestures.end(); it != e; ++it) {
+ QWidget *receiver = it.key();
+ QList<QGesture *> gestures = it.value();
+ DEBUG() << "QGestureManager::deliverEvents: sending GestureOverride to"
+ << receiver
+ << "gestures:" << gestures;
+ QGestureEvent event(gestures);
+ event.t = QEvent::GestureOverride;
+ // mark event and individual gestures as ignored
+ event.ignore();
+ foreach(QGesture *g, gestures)
+ event.setAccepted(g, false);
+
+ QApplication::sendEvent(receiver, &event);
+ bool eventAccepted = event.isAccepted();
+ foreach(QGesture *gesture, event.allGestures()) {
+ if (eventAccepted || event.isAccepted(gesture)) {
+ QWidget *w = event.d_func()->targetWidgets.value(gesture->gestureType(), 0);
+ Q_ASSERT(w);
+ DEBUG() << "override event: gesture was accepted:" << gesture << w;
+ QList<QGesture *> &gestures = normalStartedGestures[w];
+ gestures.append(gesture);
+ // override the target
+ gestureTargets[gesture] = w;
+ } else {
+ DEBUG() << "override event: gesture wasn't accepted. putting back:" << gesture;
+ QList<QGesture *> &gestures = normalStartedGestures[receiver];
+ gestures.append(gesture);
+ }
+ }
+ }
+
+ // delivering gestures that are not in conflicted state
+ for (GesturesPerWidget::const_iterator it = normalStartedGestures.begin(),
+ e = normalStartedGestures.end(); it != e; ++it) {
+ if (!it.value().isEmpty()) {
+ DEBUG() << "QGestureManager::deliverEvents: sending to" << it.key()
+ << "gestures:" << it.value();
+ QGestureEvent event(it.value());
+ QApplication::sendEvent(it.key(), &event);
+ }
+ }
+}
+
+void QGestureManager::timerEvent(QTimerEvent *event)
+{
+ QMap<QGesture*, QBasicTimer>::iterator it = maybeGestures.begin(),
+ e = maybeGestures.end();
+ for (; it != e; ) {
+ QBasicTimer &timer = it.value();
+ Q_ASSERT(timer.isActive());
+ if (timer.timerId() == event->timerId()) {
+ timer.stop();
+ QGesture *gesture = it.key();
+ it = maybeGestures.erase(it);
+ DEBUG() << "QGestureManager::timerEvent: gesture stopped due to timeout:"
+ << gesture;
+ QGestureRecognizer *recognizer = gestureToRecognizer.value(gesture, 0);
+ if (recognizer)
+ recognizer->reset(gesture);
+ } else {
+ ++it;
+ }
+ }
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qgesturemanager_p.cpp"
diff --git a/src/gui/kernel/qgesturemanager_p.h b/src/gui/kernel/qgesturemanager_p.h
new file mode 100644
index 0000000..f0e7225
--- /dev/null
+++ b/src/gui/kernel/qgesturemanager_p.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGESTUREMANAGER_P_H
+#define QGESTUREMANAGER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qobject.h"
+#include "qbasictimer.h"
+#include "private/qwidget_p.h"
+#include "qgesturerecognizer.h"
+
+QT_BEGIN_NAMESPACE
+
+class QBasicTimer;
+class QGraphicsObject;
+class QGestureManager : public QObject
+{
+ Q_OBJECT
+public:
+ QGestureManager(QObject *parent);
+ ~QGestureManager();
+
+ Qt::GestureType registerGestureRecognizer(QGestureRecognizer *recognizer);
+ void unregisterGestureRecognizer(Qt::GestureType type);
+
+ bool filterEvent(QWidget *receiver, QEvent *event);
+ bool filterEvent(QGesture *receiver, QEvent *event);
+ bool filterEvent(QGraphicsObject *receiver, QEvent *event);
+
+ // declared in qapplication.cpp
+ static QGestureManager* instance();
+
+protected:
+ void timerEvent(QTimerEvent *event);
+ bool filterEventThroughContexts(const QMap<QObject *, Qt::GestureType> &contexts,
+ QEvent *event);
+
+private:
+ QMultiMap<Qt::GestureType, QGestureRecognizer *> recognizers;
+
+ QSet<QGesture *> activeGestures;
+ QMap<QGesture *, QBasicTimer> maybeGestures;
+
+ enum State {
+ Gesture,
+ NotGesture,
+ MaybeGesture // this means timers are up and waiting for some
+ // more events, and input events are handled by
+ // gesture recognizer explicitely
+ } state;
+
+ struct ObjectGesture
+ {
+ QWeakPointer<QObject> object;
+ Qt::GestureType gesture;
+
+ ObjectGesture(QObject *o, const Qt::GestureType &g) : object(o), gesture(g) { }
+ inline bool operator<(const ObjectGesture& rhs) const
+ {
+ if (object.data() < rhs.object.data())
+ return true;
+ if (object == rhs.object)
+ return gesture < rhs.gesture;
+ return false;
+ }
+ };
+
+ QMap<ObjectGesture, QGesture *> objectGestures;
+ QMap<QGesture *, QGestureRecognizer *> gestureToRecognizer;
+ QHash<QGesture *, QObject *> gestureOwners;
+
+ QHash<QGesture *, QWidget *> gestureTargets;
+
+ int lastCustomGestureId;
+
+ QGesture *getState(QObject *widget, Qt::GestureType gesture);
+ void deliverEvents(const QSet<QGesture *> &gestures,
+ QSet<QGesture *> *undeliveredGestures);
+ void getGestureTargets(const QSet<QGesture*> &gestures,
+ QMap<QWidget *, QList<QGesture *> > *conflicts,
+ QMap<QWidget *, QList<QGesture *> > *normal);
+};
+
+QT_END_NAMESPACE
+
+#endif // QGESTUREMANAGER_P_H
diff --git a/src/gui/kernel/qgesturerecognizer.cpp b/src/gui/kernel/qgesturerecognizer.cpp
new file mode 100644
index 0000000..9de3bcc
--- /dev/null
+++ b/src/gui/kernel/qgesturerecognizer.cpp
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgesturerecognizer.h"
+
+#include "private/qgesture_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QGestureRecognizer
+ \since 4.6
+ \brief The QGestureRecognizer class provides the infrastructure for gesture recognition.
+ \ingroup gestures
+
+ Gesture recognizers are responsible for creating and managing QGesture objects and
+ monitoring input events sent to QWidget and QGraphicsObject subclasses.
+ QGestureRecognizer is the base class for implementing custom gestures.
+
+ Developers that only need to provide gesture recognition for standard gestures do not
+ need to use this class directly. Instances will be created behind the scenes by the
+ framework.
+
+ \section1 Recognizing Gestures
+
+ The process of recognizing gestures involves filtering input events sent to specific
+ objects, and modifying the associated QGesture objects to include relevant information
+ about the user's input.
+
+ Gestures are created when the framework calls createGesture() to handle user input
+ for a particular instance of a QWidget or QGraphicsObject subclass. A QGesture object
+ is created for each widget or item that is configured to use gestures.
+
+ Once a QGesture has been created for a target object, the gesture recognizer will
+ receive events for it in its filterEvent() handler function.
+
+ When a gesture is canceled, the reset() function is called, giving the recognizer the
+ chance to update the appropriate properties in the corresponding QGesture object.
+
+ \section1 Supporting New Gestures
+
+ To add support for new gestures, you need to derive from QGestureRecognizer to create
+ a custom recognizer class, construct an instance of this class, and register it with
+ the application by calling QApplication::registerGestureRecognizer(). You can also
+ subclass QGesture to create a custom gesture class, or rely on dynamic properties
+ to express specific details of the gesture you want to handle.
+
+ Your custom QGestureRecognizer subclass needs to reimplement the filterEvent() function
+ to handle and filter the incoming input events for QWidget and QGraphicsObject subclasses.
+ Although the logic for gesture recognition is implemented in this function, you can
+ store persistent information about the state of the recognition process in the QGesture
+ object supplied. The filterEvent() function must return a value of Qt::GestureState that
+ indicates the state of recognition for a given gesture and target object. This determines
+ whether or not a gesture event will be delivered to a target object.
+
+ If you choose to represent a gesture by a custom QGesture subclass, you will need to
+ reimplement the createGesture() function to construct instances of your gesture class.
+ Similarly, you may need to reimplement the reset() function if your custom gesture
+ objects need to be specially handled when a gesture is canceled.
+
+ \sa QGesture
+*/
+
+/*!
+ \enum QGestureRecognizer::ResultFlags
+
+ This enum describes the result of the current event filtering step in
+ a gesture recognizer state machine.
+
+ The result consists of a state value (one of Ignore, NotGesture,
+ MaybeGesture, GestureTriggered, GestureFinished) and an optional hint
+ (ConsumeEventHint).
+
+ \value Ignore The event does not change the state of the recognizer.
+
+ \value NotGesture The event made it clear that it is not a gesture. If the
+ gesture recognizer was in GestureTriggered state before, then the gesture
+ is canceled and the appropriate QGesture object will be delivered to the
+ target as a part of a QGestureEvent.
+
+ \value MaybeGesture The event changed the internal state of the recognizer,
+ but it isn't clear yet if it is a gesture or not. The recognizer needs to
+ filter more events to decide. Gesture recognizers in the MaybeGesture state
+ may be reset automatically if they take too long to recognize gestures.
+
+ \value GestureTriggered The gesture has been triggered and the appropriate
+ QGesture object will be delivered to the target as a part of a
+ QGestureEvent.
+
+ \value GestureFinished The gesture has been finished successfully and the
+ appropriate QGesture object will be delivered to the target as a part of a
+ QGestureEvent.
+
+ \value ConsumeEventHint This hint specifies that the gesture framework should
+ consume the filtered event and not deliver it to the receiver.
+
+ \omitvalue ResultState_Mask
+ \omitvalue ResultHint_Mask
+
+ \sa QGestureRecognizer::filterEvent()
+*/
+
+/*!
+ Constructs a new gesture recognizer object.
+*/
+QGestureRecognizer::QGestureRecognizer()
+{
+}
+
+/*!
+ Destroys the gesture recognizer.
+*/
+QGestureRecognizer::~QGestureRecognizer()
+{
+}
+
+/*!
+ This function is called by Qt to create a new QGesture object for the
+ given \a target (QWidget or QGraphicsObject).
+
+ Reimplement this function to create a custom QGesture-derived gesture
+ object if necessary.
+*/
+QGesture *QGestureRecognizer::createGesture(QObject *target)
+{
+ Q_UNUSED(target);
+ return new QGesture;
+}
+
+/*!
+ This function is called by the framework to reset a given \a gesture.
+
+ Reimplement this function to implement additional requirements for custom QGesture
+ objects. This may be necessary if you implement a custom QGesture whose properties
+ need special handling when the gesture is reset.
+*/
+void QGestureRecognizer::reset(QGesture *gesture)
+{
+ if (gesture) {
+ QGesturePrivate *d = gesture->d_func();
+ d->state = Qt::NoGesture;
+ d->hotSpot = QPointF();
+ d->targetObject = 0;
+ }
+}
+
+/*!
+ \fn QGestureRecognizer::filterEvent(QGesture *gesture, QObject *watched, QEvent *event)
+
+ Handles the given \a event for the \a watched object, updating the state of the \a gesture
+ object as required, and returns a suitable Result for the current recognition step.
+
+ This function is called by the framework to allow the recognizer to filter input events
+ dispatched to QWidget or QGraphicsObject instances that it is monitoring.
+
+ The result reflects how much of the gesture has been recognized. The state of the
+ \a gesture object is set depending on the result.
+
+ \sa Qt::GestureState
+*/
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qglpaintdevice_qws.cpp b/src/gui/kernel/qgesturerecognizer.h
index 600efa6..efd8565 100644
--- a/src/opengl/qglpaintdevice_qws.cpp
+++ b/src/gui/kernel/qgesturerecognizer.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the QtOpenGL module of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,58 +39,55 @@
**
****************************************************************************/
-#include <private/qglpaintdevice_qws_p.h>
-#include <private/qgl_p.h>
-#include <private/qpaintengine_opengl_p.h>
-#include <private/qglwindowsurface_qws_p.h>
+#ifndef QGESTURERECOGNIZER_H
+#define QGESTURERECOGNIZER_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
-class QWSGLPaintDevicePrivate
+QT_MODULE(Gui)
+
+class QObject;
+class QEvent;
+class QGesture;
+class Q_GUI_EXPORT QGestureRecognizer
{
public:
- QWidget *widget;
-};
+ enum ResultFlags
+ {
+ Ignore = 0x0001,
+ NotGesture = 0x0002,
+ MaybeGesture = 0x0004,
+ GestureTriggered = 0x0008, // Gesture started or updated
+ GestureFinished = 0x0010,
-class QMetricAccessor : public QWidget {
-public:
- int metric(PaintDeviceMetric m) {
- return QWidget::metric(m);
- }
-};
+ ResultState_Mask = 0x00ff,
-QWSGLPaintDevice::QWSGLPaintDevice(QWidget *widget) :
- d_ptr(new QWSGLPaintDevicePrivate)
-{
- Q_D(QWSGLPaintDevice);
- d->widget = widget;
-}
+ ConsumeEventHint = 0x0100,
+ // StoreEventHint = 0x0200,
+ // ReplayStoredEventsHint = 0x0400,
+ // DiscardStoredEventsHint = 0x0800,
-QWSGLPaintDevice::~QWSGLPaintDevice()
-{
-}
+ ResultHint_Mask = 0xff00
+ };
+ Q_DECLARE_FLAGS(Result, ResultFlags)
-QPaintEngine* QWSGLPaintDevice::paintEngine() const
-{
-#if !defined(QT_OPENGL_ES_2)
- return qt_qgl_paint_engine();
-#else
- return 0; // XXX
-#endif
-}
-
-int QWSGLPaintDevice::metric(PaintDeviceMetric m) const
-{
- Q_D(const QWSGLPaintDevice);
- Q_ASSERT(d->widget);
+ QGestureRecognizer();
+ virtual ~QGestureRecognizer();
- return ((QMetricAccessor *) d->widget)->metric(m);
-}
+ virtual QGesture *createGesture(QObject *target);
+ virtual QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event) = 0;
-QWSGLWindowSurface* QWSGLPaintDevice::windowSurface() const
-{
- Q_D(const QWSGLPaintDevice);
- return static_cast<QWSGLWindowSurface*>(d->widget->windowSurface());
-}
+ virtual void reset(QGesture *state);
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QGestureRecognizer::Result)
QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QGESTURERECOGNIZER_H
diff --git a/src/gui/kernel/qkeymapper_win.cpp b/src/gui/kernel/qkeymapper_win.cpp
index be207df..f95efa2 100644
--- a/src/gui/kernel/qkeymapper_win.cpp
+++ b/src/gui/kernel/qkeymapper_win.cpp
@@ -438,10 +438,10 @@ static const Qt::KeyboardModifiers ModsTbl[] = {
*/
inline int winceKeyBend(int keyCode)
{
-#ifdef Q_OS_WINCE_WM
+#if defined(Q_OS_WINCE_WM) && defined(QT_KEYPAD_NAVIGATION)
// remap return or action key to select key for windows mobile.
// will be changed to a table remapping function in the next version (4.6/7).
- if (keyCode == 13)
+ if (keyCode == VK_RETURN && QApplication::keypadNavigationEnabled())
return Qt::Key_Select;
else
return KeyTbl[keyCode];
diff --git a/src/gui/kernel/qmacgesturerecognizer_mac.mm b/src/gui/kernel/qmacgesturerecognizer_mac.mm
new file mode 100644
index 0000000..7019580
--- /dev/null
+++ b/src/gui/kernel/qmacgesturerecognizer_mac.mm
@@ -0,0 +1,267 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmacgesturerecognizer_mac_p.h"
+#include "qgesture.h"
+#include "qgesture_p.h"
+#include "qevent.h"
+#include "qevent_p.h"
+#include "qwidget.h"
+#include "qdebug.h"
+
+QT_BEGIN_NAMESPACE
+
+QMacSwipeGestureRecognizer::QMacSwipeGestureRecognizer()
+{
+}
+
+QGesture *QMacSwipeGestureRecognizer::createGesture(QObject * /*target*/)
+{
+ return new QSwipeGesture;
+}
+
+QGestureRecognizer::Result
+QMacSwipeGestureRecognizer::filterEvent(QGesture *gesture, QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::NativeGesture && obj->isWidgetType()) {
+ QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
+ switch (ev->gestureType) {
+ case QNativeGestureEvent::Swipe: {
+ QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture);
+ g->setSwipeAngle(ev->angle);
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ break; }
+ default:
+ break;
+ }
+ }
+
+ return QGestureRecognizer::Ignore;
+}
+
+void QMacSwipeGestureRecognizer::reset(QGesture *gesture)
+{
+ QSwipeGesture *g = static_cast<QSwipeGesture *>(gesture);
+ g->setSwipeAngle(0);
+ QGestureRecognizer::reset(gesture);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+QMacPinchGestureRecognizer::QMacPinchGestureRecognizer()
+{
+}
+
+QGesture *QMacPinchGestureRecognizer::createGesture(QObject * /*target*/)
+{
+ return new QPinchGesture;
+}
+
+QGestureRecognizer::Result
+QMacPinchGestureRecognizer::filterEvent(QGesture *gesture, QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::NativeGesture && obj->isWidgetType()) {
+ QPinchGesture *g = static_cast<QPinchGesture *>(gesture);
+ QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
+ switch(ev->gestureType) {
+ case QNativeGestureEvent::GestureBegin:
+ reset(gesture);
+ g->setStartCenterPoint(static_cast<QWidget*>(obj)->mapFromGlobal(ev->position));
+ g->setCenterPoint(g->startCenterPoint());
+ g->setWhatChanged(QPinchGesture::CenterPointChanged);
+ return QGestureRecognizer::MaybeGesture | QGestureRecognizer::ConsumeEventHint;
+ case QNativeGestureEvent::Rotate: {
+ g->setLastScaleFactor(g->scaleFactor());
+ g->setLastRotationAngle(g->rotationAngle());
+ g->setRotationAngle(g->rotationAngle() + ev->percentage);
+ g->setWhatChanged(QPinchGesture::RotationAngleChanged);
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ break;
+ }
+ case QNativeGestureEvent::Zoom:
+ g->setLastScaleFactor(g->scaleFactor());
+ g->setLastRotationAngle(g->rotationAngle());
+ g->setScaleFactor(g->scaleFactor() + ev->percentage);
+ g->setWhatChanged(QPinchGesture::ScaleFactorChanged);
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ break;
+ case QNativeGestureEvent::GestureEnd:
+ return QGestureRecognizer::GestureFinished | QGestureRecognizer::ConsumeEventHint;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return QGestureRecognizer::Ignore;
+}
+
+void QMacPinchGestureRecognizer::reset(QGesture *gesture)
+{
+ QPinchGesture *g = static_cast<QPinchGesture *>(gesture);
+ g->setWhatChanged(0);
+ g->setScaleFactor(1.0f);
+ g->setTotalScaleFactor(1.0f);
+ g->setLastScaleFactor(1.0f);
+ g->setRotationAngle(0.0f);
+ g->setTotalRotationAngle(0.0f);
+ g->setLastRotationAngle(0.0f);
+ g->setCenterPoint(QPointF());
+ g->setStartCenterPoint(QPointF());
+ g->setLastCenterPoint(QPointF());
+ QGestureRecognizer::reset(gesture);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+#if defined(QT_MAC_USE_COCOA)
+
+QMacPanGestureRecognizer::QMacPanGestureRecognizer() : _panCanceled(true)
+{
+}
+
+QGesture *QMacPanGestureRecognizer::createGesture(QObject *target)
+{
+ if (!target)
+ return new QPanGesture;
+
+ if (QWidget *w = qobject_cast<QWidget *>(target)) {
+ w->setAttribute(Qt::WA_AcceptTouchEvents);
+ w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
+ return new QPanGesture;
+ }
+ return 0;
+}
+
+QGestureRecognizer::Result
+QMacPanGestureRecognizer::filterEvent(QGesture *gesture, QObject *target, QEvent *event)
+{
+ const int panBeginDelay = 300;
+ const int panBeginRadius = 3;
+
+ QPanGesture *g = static_cast<QPanGesture *>(gesture);
+
+ switch (event->type()) {
+ case QEvent::TouchBegin: {
+ const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
+ if (ev->touchPoints().size() == 1) {
+ reset(gesture);
+ _startPos = QCursor::pos();
+ _lastPos = _startPos;
+ _panTimer.start(panBeginDelay, target);
+ _panCanceled = false;
+ return QGestureRecognizer::MaybeGesture;
+ }
+ break;}
+ case QEvent::TouchEnd: {
+ if (_panCanceled)
+ break;
+
+ const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
+ if (ev->touchPoints().size() == 1)
+ return QGestureRecognizer::GestureFinished;
+ break;}
+ case QEvent::TouchUpdate: {
+ if (_panCanceled)
+ break;
+
+ const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
+ if (ev->touchPoints().size() == 1) {
+ if (_panTimer.isActive()) {
+ // INVARIANT: Still in maybeGesture. Check if the user
+ // moved his finger so much that it makes sense to cancel the pan:
+ const QPointF p = QCursor::pos();
+ if ((p - _startPos).manhattanLength() > panBeginRadius) {
+ _panCanceled = true;
+ _panTimer.stop();
+ return QGestureRecognizer::NotGesture;
+ }
+ } else {
+ const QPointF p = QCursor::pos();
+ const QPointF posOffset = p - _lastPos;
+ g->setLastOffset(g->offset());
+ g->setOffset(QPointF(posOffset.x(), posOffset.y()));
+ g->setTotalOffset(g->lastOffset() + g->offset());
+ _lastPos = p;
+ return QGestureRecognizer::GestureTriggered;
+ }
+ } else if (_panTimer.isActive()) {
+ // I only want to cancel the pan if the user is pressing
+ // more than one finger, and the pan hasn't started yet:
+ _panCanceled = true;
+ _panTimer.stop();
+ return QGestureRecognizer::NotGesture;
+ }
+ break;}
+ case QEvent::Timer: {
+ QTimerEvent *ev = static_cast<QTimerEvent *>(event);
+ if (ev->timerId() == _panTimer.timerId()) {
+ _panTimer.stop();
+ if (_panCanceled)
+ break;
+ // Begin new pan session!
+ _startPos = QCursor::pos();
+ _lastPos = _startPos;
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ }
+ break; }
+ default:
+ break;
+ }
+
+ return QGestureRecognizer::Ignore;
+}
+
+void QMacPanGestureRecognizer::reset(QGesture *gesture)
+{
+ QPanGesture *g = static_cast<QPanGesture *>(gesture);
+ _startPos = QPointF();
+ _lastPos = QPointF();
+ _panCanceled = true;
+ g->setOffset(QPointF(0, 0));
+ g->setLastOffset(QPointF(0, 0));
+ g->setTotalOffset(QPointF(0, 0));
+ g->setAcceleration(qreal(1));
+ QGestureRecognizer::reset(gesture);
+}
+#endif // QT_MAC_USE_COCOA
+
+QT_END_NAMESPACE
diff --git a/examples/qws/ahigl/qwindowsurface_ahigl_p.h b/src/gui/kernel/qmacgesturerecognizer_mac_p.h
index bcb0509..bdc2e08 100644
--- a/examples/qws/ahigl/qwindowsurface_ahigl_p.h
+++ b/src/gui/kernel/qmacgesturerecognizer_mac_p.h
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the examples of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,54 +39,65 @@
**
****************************************************************************/
-#ifndef QWINDOWSURFACE_AHIGL_P_H
-#define QWINDOWSURFACE_AHIGL_P_H
+#ifndef QMACSWIPEGESTURERECOGNIZER_MAC_P_H
+#define QMACSWIPEGESTURERECOGNIZER_MAC_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
-// of the QAhiGLWindowSurface class. This header file may change from
-// version to version without notice, or even be removed.
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
//
// We mean it.
//
-#include <QtOpenGL/private/qglwindowsurface_qws_p.h>
-#include <GLES/gl.h>
-#include <GLES/egl.h>
+#include "qtimer.h"
+#include "qpoint.h"
+#include "qgesturerecognizer.h"
QT_BEGIN_NAMESPACE
-class QAhiGLWindowSurfacePrivate;
-QT_END_NAMESPACE
-//! [0]
-class QAhiGLWindowSurface : public QWSGLWindowSurface
+class QMacSwipeGestureRecognizer : public QGestureRecognizer
{
public:
- QAhiGLWindowSurface(QWidget *widget, EGLDisplay eglDisplay,
- EGLSurface eglSurface, EGLContext eglContext);
- QAhiGLWindowSurface(EGLDisplay eglDisplay, EGLSurface eglSurface,
- EGLContext eglContext);
- ~QAhiGLWindowSurface();
+ QMacSwipeGestureRecognizer();
- QString key() const { return QLatin1String("ahigl"); }
- void setGeometry(const QRect &rect);
- QPaintDevice *paintDevice();
- void beginPaint(const QRegion &region);
- bool isValid() const;
+ QGesture *createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *gesture, QObject *watched, QEvent *event);
+ void reset(QGesture *gesture);
+};
- QByteArray permanentState() const;
- void setPermanentState(const QByteArray &);
+class QMacPinchGestureRecognizer : public QGestureRecognizer
+{
+public:
+ QMacPinchGestureRecognizer();
- QImage image() const { return QImage(); }
+ QGesture *createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *gesture, QObject *watched, QEvent *event);
+ void reset(QGesture *gesture);
+};
- GLuint textureId() const;
+#if defined(QT_MAC_USE_COCOA)
+class QMacPanGestureRecognizer : public QObject, public QGestureRecognizer
+{
+public:
+ QMacPanGestureRecognizer();
+
+ QGesture *createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *gesture, QObject *watched, QEvent *event);
+ void reset(QGesture *gesture);
private:
- QAhiGLWindowSurfacePrivate *d_ptr;
+ QPointF _startPos;
+ QPointF _lastPos;
+ QBasicTimer _panTimer;
+ bool _panCanceled;
};
-//! [0]
-#endif // QWINDOWSURFACE_AHIGL_P_H
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QMACSWIPEGESTURERECOGNIZER_MAC_P_H
diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp
index cd3ad22..6116a5e 100644
--- a/src/gui/kernel/qsoftkeymanager.cpp
+++ b/src/gui/kernel/qsoftkeymanager.cpp
@@ -125,7 +125,6 @@ QAction *QSoftKeyManager::createAction(StandardSoftKey standardKey, QWidget *act
break;
}
action->setSoftKeyRole(softKeyRole);
- action->setEnabled(actionWidget->isEnabled());
return action;
}
@@ -200,6 +199,7 @@ bool QSoftKeyManager::event(QEvent *e)
void QSoftKeyManagerPrivate::updateSoftKeys_sys(const QList<QAction*> &softkeys)
{
CEikButtonGroupContainer* nativeContainer = S60->buttonGroupContainer();
+ nativeContainer->DrawableWindow()->SetPointerCapturePriority(1); //keep softkeys available in modal dialog
QT_TRAP_THROWING(nativeContainer->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY_WITH_IDS));
int position = -1;
@@ -209,7 +209,7 @@ void QSoftKeyManagerPrivate::updateSoftKeys_sys(const QList<QAction*> &softkeys)
for (int index = 0; index < softkeys.count(); index++) {
const QAction* softKeyAction = softkeys.at(index);
switch (softKeyAction->softKeyRole()) {
- // Positive Actions go on LSK
+ // Positive Actions on the LSK
case QAction::PositiveSoftKey:
position = 0;
break;
@@ -252,7 +252,8 @@ bool QSoftKeyManager::handleCommand(int command)
QAction *action = softKeys.at(i);
if (action->softKeyRole() != QAction::NoSoftKey) {
if (j == index) {
- if (action->isEnabled()) {
+ QWidget *parent = action->parentWidget();
+ if (parent && parent->isEnabled()) {
action->activate(QAction::Trigger);
return true;
}
diff --git a/src/gui/kernel/qstandardgestures.cpp b/src/gui/kernel/qstandardgestures.cpp
index 3cfb987..a136379 100644
--- a/src/gui/kernel/qstandardgestures.cpp
+++ b/src/gui/kernel/qstandardgestures.cpp
@@ -39,201 +39,125 @@
**
****************************************************************************/
-#include "qstandardgestures.h"
#include "qstandardgestures_p.h"
-
-#include <qabstractscrollarea.h>
-#include <qscrollbar.h>
-#include <private/qapplication_p.h>
-#include <private/qevent_p.h>
-#include <private/qwidget_p.h>
-#include <qmath.h>
+#include "qgesture.h"
+#include "qgesture_p.h"
+#include "qevent.h"
+#include "qwidget.h"
QT_BEGIN_NAMESPACE
-#ifdef Q_WS_WIN
-QWidgetPrivate *qt_widget_private(QWidget *widget);
-#endif
-
-/*!
- \class QPanGesture
- \preliminary
- \since 4.6
-
- \brief The QPanGesture class represents a Pan gesture,
- providing additional information related to panning.
-*/
-
-/*!
- \enum QSwipeGesture::SwipeDirection
- \brief This enum specifies the direction of the swipe gesture.
-
- \value NoDirection
- \value Left
- \value Right
- \value Up
- \value Down
-*/
-
-/*!
- Creates a new pan gesture handler object and marks it as a child of
- \a parent. The pan gesture handler watches \a gestureTarget for its
- events.
-
- On some platform like Windows it's necessary to provide a non-null
- widget as \a parent to get native gesture support.
-*/
-QPanGesture::QPanGesture(QWidget *gestureTarget, QObject *parent)
- : QGesture(*new QPanGesturePrivate, gestureTarget, parent)
+QPanGestureRecognizer::QPanGestureRecognizer()
{
- setObjectName(QLatin1String("QPanGesture"));
-}
-
-void QPanGesturePrivate::setupGestureTarget(QObject *newGestureTarget)
-{
- Q_Q(QPanGesture);
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
-
- if (gestureTarget && gestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(gestureTarget.data());
- if (qAppPriv->widgetGestures[w].pan == q)
- qAppPriv->widgetGestures[w].pan = 0;
-#if defined(Q_WS_WIN)
- qt_widget_private(w)->winSetupGestures();
-#elif defined(Q_WS_MAC)
- w->setAttribute(Qt::WA_AcceptTouchEvents, false);
- w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents, false);
-#endif
- }
-
- if (newGestureTarget && newGestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(newGestureTarget);
- qAppPriv->widgetGestures[w].pan = q;
-#if defined(Q_WS_WIN)
- qt_widget_private(w)->winSetupGestures();
-#elif defined(Q_WS_MAC)
- w->setAttribute(Qt::WA_AcceptTouchEvents);
- w->setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
-#endif
- }
- QGesturePrivate::setupGestureTarget(newGestureTarget);
-}
-
-/*! \internal */
-bool QPanGesture::event(QEvent *event)
-{
-#if defined(QT_MAC_USE_COCOA)
- Q_D(QPanGesture);
- if (event->type() == QEvent::Timer) {
- const QTimerEvent *te = static_cast<QTimerEvent *>(event);
- if (te->timerId() == d->singleTouchPanTimer.timerId()) {
- d->singleTouchPanTimer.stop();
- updateState(Qt::GestureStarted);
- }
- }
-#endif
-
- return QObject::event(event);
}
-bool QPanGesture::eventFilter(QObject *receiver, QEvent *event)
+QGesture *QPanGestureRecognizer::createGesture(QObject *target)
{
- Q_D(QPanGesture);
-
- if (d->implicitGesture && d->gestureTarget && d->gestureTarget->isWidgetType() &&
- static_cast<QWidget*>(d->gestureTarget.data())->testAttribute(Qt::WA_DontUseStandardGestures))
- return false;
-
-#ifdef Q_WS_WIN
- if (receiver->isWidgetType() && event->type() == QEvent::NativeGesture) {
- QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- QApplicationPrivate::WidgetStandardGesturesMap::iterator it;
- it = qAppPriv->widgetGestures.find(static_cast<QWidget*>(receiver));
- if (it == qAppPriv->widgetGestures.end())
- return false;
- if (this != it.value().pan)
- return false;
- Qt::GestureState nextState = Qt::NoGesture;
- switch(ev->gestureType) {
- case QNativeGestureEvent::GestureBegin:
- // next we might receive the first gesture update event, so we
- // prepare for it.
- d->state = Qt::NoGesture;
- return false;
- case QNativeGestureEvent::Pan:
- nextState = Qt::GestureUpdated;
- event->accept();
- break;
- case QNativeGestureEvent::GestureEnd:
- if (state() == Qt::NoGesture)
- return false; // some other gesture has ended
- nextState = Qt::GestureFinished;
- break;
- default:
- return false;
- }
- if (state() == Qt::NoGesture) {
- d->lastOffset = d->totalOffset = d->offset = QSize();
- } else {
- d->lastOffset = d->offset;
- d->offset = QSize(ev->position.x() - d->lastPosition.x(),
- ev->position.y() - d->lastPosition.y());
- d->totalOffset += d->offset;
- }
- d->lastPosition = ev->position;
- updateState(nextState);
- return true;
+ if (target && target->isWidgetType()) {
+ static_cast<QWidget *>(target)->setAttribute(Qt::WA_AcceptTouchEvents);
}
-#endif
- return QGesture::eventFilter(receiver, event);
+ return new QPanGesture;
}
-/*! \internal */
-bool QPanGesture::filterEvent(QEvent *event)
+QGestureRecognizer::Result QPanGestureRecognizer::filterEvent(QGesture *state, QObject *, QEvent *event)
{
- Q_D(QPanGesture);
+ QPanGesture *q = static_cast<QPanGesture*>(state);
+ QPanGesturePrivate *d = q->d_func();
- if (d->implicitGesture && d->gestureTarget && d->gestureTarget->isWidgetType() &&
- static_cast<QWidget*>(d->gestureTarget.data())->testAttribute(Qt::WA_DontUseStandardGestures))
- return false;
-
-#if defined(Q_WS_WIN)
const QTouchEvent *ev = static_cast<const QTouchEvent*>(event);
- if (event->type() == QEvent::TouchBegin) {
+ QGestureRecognizer::Result result;
+
+ switch (event->type()) {
+ case QEvent::TouchBegin: {
+ result = QGestureRecognizer::MaybeGesture;
QTouchEvent::TouchPoint p = ev->touchPoints().at(0);
d->lastPosition = p.pos().toPoint();
- d->lastOffset = d->totalOffset = d->offset = QSize();
- } else if (event->type() == QEvent::TouchEnd) {
- if (state() != Qt::NoGesture) {
+ d->lastOffset = d->totalOffset = d->offset = QPointF();
+ break;
+ }
+ case QEvent::TouchEnd: {
+ if (q->state() != Qt::NoGesture) {
if (ev->touchPoints().size() == 2) {
QTouchEvent::TouchPoint p1 = ev->touchPoints().at(0);
QTouchEvent::TouchPoint p2 = ev->touchPoints().at(1);
d->lastOffset = d->offset;
d->offset =
- QSize(p1.pos().x() - p1.lastPos().x() + p2.pos().x() - p2.lastPos().x(),
+ QPointF(p1.pos().x() - p1.lastPos().x() + p2.pos().x() - p2.lastPos().x(),
p1.pos().y() - p1.lastPos().y() + p2.pos().y() - p2.lastPos().y()) / 2;
d->totalOffset += d->offset;
}
- updateState(Qt::GestureFinished);
+ result = QGestureRecognizer::GestureFinished;
+ } else {
+ result = QGestureRecognizer::NotGesture;
}
- reset();
- } else if (event->type() == QEvent::TouchUpdate) {
- if (ev->touchPoints().size() == 2) {
+ break;
+ }
+ case QEvent::TouchUpdate: {
+ if (ev->touchPoints().size() >= 2) {
QTouchEvent::TouchPoint p1 = ev->touchPoints().at(0);
QTouchEvent::TouchPoint p2 = ev->touchPoints().at(1);
d->lastOffset = d->offset;
d->offset =
- QSize(p1.pos().x() - p1.lastPos().x() + p2.pos().x() - p2.lastPos().x(),
+ QPointF(p1.pos().x() - p1.lastPos().x() + p2.pos().x() - p2.lastPos().x(),
p1.pos().y() - p1.lastPos().y() + p2.pos().y() - p2.lastPos().y()) / 2;
d->totalOffset += d->offset;
- if (d->totalOffset.width() > 10 || d->totalOffset.height() > 10 ||
- d->totalOffset.width() < -10 || d->totalOffset.height() < -10) {
- updateState(Qt::GestureUpdated);
+ if (d->totalOffset.x() > 10 || d->totalOffset.y() > 10 ||
+ d->totalOffset.x() < -10 || d->totalOffset.y() < -10) {
+ result = QGestureRecognizer::GestureTriggered;
+ } else {
+ result = QGestureRecognizer::MaybeGesture;
}
}
+ break;
+ }
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonRelease:
+ result = QGestureRecognizer::Ignore;
+ break;
+ default:
+ result = QGestureRecognizer::Ignore;
+ break;
+ }
+ return result;
+}
+
+void QPanGestureRecognizer::reset(QGesture *state)
+{
+ QPanGesture *pan = static_cast<QPanGesture*>(state);
+ QPanGesturePrivate *d = pan->d_func();
+
+ d->totalOffset = d->lastOffset = d->offset = QPointF();
+ d->lastPosition = QPoint();
+ d->acceleration = 0;
+
+//#if defined(QT_MAC_USE_COCOA)
+// d->singleTouchPanTimer.stop();
+// d->prevMousePos = QPointF(0, 0);
+//#endif
+
+ QGestureRecognizer::reset(state);
+}
+
+/*! \internal */
+/*
+bool QPanGestureRecognizer::event(QEvent *event)
+{
+#if defined(QT_MAC_USE_COCOA)
+ Q_D(QPanGesture);
+ if (event->type() == QEvent::Timer) {
+ const QTimerEvent *te = static_cast<QTimerEvent *>(event);
+ if (te->timerId() == d->singleTouchPanTimer.timerId()) {
+ d->singleTouchPanTimer.stop();
+ updateState(Qt::GestureStarted);
+ }
}
+#endif
+
+ bool consume = false;
+
+#if defined(Q_WS_WIN)
#elif defined(QT_MAC_USE_COCOA)
// The following implements single touch
// panning on Mac:
@@ -244,16 +168,25 @@ bool QPanGesture::filterEvent(QEvent *event)
switch (event->type()) {
case QEvent::TouchBegin: {
if (ev->touchPoints().size() == 1) {
+ d->delayManager->setEnabled(true);
+ consume = d->delayManager->append(d->gestureTarget, *event);
d->lastPosition = QCursor::pos();
d->singleTouchPanTimer.start(panBeginDelay, this);
}
break;}
case QEvent::TouchEnd: {
- if (state() != Qt::NoGesture)
+ d->delayManager->setEnabled(false);
+ if (state() != Qt::NoGesture) {
updateState(Qt::GestureFinished);
+ consume = true;
+ d->delayManager->clear();
+ } else {
+ d->delayManager->replay();
+ }
reset();
break;}
case QEvent::TouchUpdate: {
+ consume = d->delayManager->append(d->gestureTarget, *event);
if (ev->touchPoints().size() == 1) {
if (state() == Qt::NoGesture) {
// INVARIANT: The singleTouchTimer has still not fired.
@@ -261,11 +194,15 @@ bool QPanGesture::filterEvent(QEvent *event)
// the starting point that it makes sense to cancel:
const QPointF startPos = ev->touchPoints().at(0).startPos().toPoint();
const QPointF p = ev->touchPoints().at(0).pos().toPoint();
- if ((startPos - p).manhattanLength() > panBeginRadius)
+ if ((startPos - p).manhattanLength() > panBeginRadius) {
+ d->delayManager->replay();
+ consume = false;
reset();
- else
+ } else {
d->lastPosition = QCursor::pos();
+ }
} else {
+ d->delayManager->clear();
QPointF mousePos = QCursor::pos();
QPointF dist = mousePos - d->lastPosition;
d->lastPosition = mousePos;
@@ -275,527 +212,25 @@ bool QPanGesture::filterEvent(QEvent *event)
updateState(Qt::GestureUpdated);
}
} else if (state() == Qt::NoGesture) {
+ d->delayManager->replay();
+ consume = false;
reset();
}
break;}
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonRelease:
+ if (d->delayManager->isEnabled())
+ consume = d->delayManager->append(d->gestureTarget, *event);
+ break;
default:
return false;
}
#else
Q_UNUSED(event);
#endif
- return false;
-}
-
-/*! \internal */
-void QPanGesture::reset()
-{
- Q_D(QPanGesture);
- d->lastOffset = d->totalOffset = d->offset = QSize(0, 0);
- d->lastPosition = QPoint(0, 0);
-
-#if defined(QT_MAC_USE_COCOA)
- d->singleTouchPanTimer.stop();
- d->prevMousePos = QPointF(0, 0);
-#endif
-
- QGesture::reset();
-}
-
-/*!
- \property QPanGesture::totalOffset
-
- Specifies a total pan offset since the start of the gesture.
-*/
-QSizeF QPanGesture::totalOffset() const
-{
- Q_D(const QPanGesture);
- return d->totalOffset;
-}
-
-/*!
- \property QPanGesture::lastOffset
-
- Specifies a pan offset the last time the gesture was triggered.
-*/
-QSizeF QPanGesture::lastOffset() const
-{
- Q_D(const QPanGesture);
- return d->lastOffset;
-}
-
-/*!
- \property QPanGesture::offset
-
- Specifies the current pan offset since the last time the gesture was
- triggered.
-*/
-QSizeF QPanGesture::offset() const
-{
- Q_D(const QPanGesture);
- return d->offset;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-/*!
- \class QPinchGesture
- \preliminary
- \since 4.6
-
- \brief The QPinchGesture class represents a Pinch gesture,
- providing additional information related to zooming and/or rotation.
-*/
-
-/*!
- Creates a new Pinch gesture handler object and marks it as a child
- of \a parent. The pan gesture handler watches \a gestureTarget for its
- events.
-
- On some platform like Windows it's necessary to provide a non-null
- widget as \a parent to get native gesture support.
-*/
-QPinchGesture::QPinchGesture(QWidget *gestureTarget, QObject *parent)
- : QGesture(*new QPinchGesturePrivate, gestureTarget, parent)
-{
- setObjectName(QLatin1String("QPinchGesture"));
-}
-
-void QPinchGesturePrivate::setupGestureTarget(QObject *newGestureTarget)
-{
- Q_Q(QPinchGesture);
- if (gestureTarget && gestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(gestureTarget.data());
- QApplicationPrivate::instance()->widgetGestures[w].pinch = 0;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
-
- if (newGestureTarget && newGestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(newGestureTarget);
- QApplicationPrivate::instance()->widgetGestures[w].pinch = q;
-#ifdef Q_WS_WIN
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- QGesturePrivate::setupGestureTarget(newGestureTarget);
-}
-
-/*! \internal */
-bool QPinchGesture::event(QEvent *event)
-{
- return QObject::event(event);
-}
-
-bool QPinchGesture::eventFilter(QObject *receiver, QEvent *event)
-{
- Q_D(QPinchGesture);
-
- if (d->implicitGesture && d->gestureTarget && d->gestureTarget->isWidgetType() &&
- static_cast<QWidget*>(d->gestureTarget.data())->testAttribute(Qt::WA_DontUseStandardGestures))
- return false;
-
-#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
- if (receiver->isWidgetType() && event->type() == QEvent::NativeGesture) {
- QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
-#if defined(Q_WS_WIN)
- QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- QApplicationPrivate::WidgetStandardGesturesMap::iterator it;
- it = qAppPriv->widgetGestures.find(static_cast<QWidget*>(receiver));
- if (it == qAppPriv->widgetGestures.end())
- return false;
- if (this != it.value().pinch)
- return false;
-#endif
- Qt::GestureState nextState = Qt::NoGesture;
-
- switch(ev->gestureType) {
- case QNativeGestureEvent::GestureBegin:
- // next we might receive the first gesture update event, so we
- // prepare for it.
- d->state = Qt::NoGesture;
- d->changes = 0;
- d->totalScaleFactor = d->scaleFactor = d->lastScaleFactor = 1.;
- d->totalRotationAngle = d->rotationAngle = d->lastRotationAngle = 0.;
- d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPointF();
-#if defined(Q_WS_WIN)
- d->initialDistance = 0;
- d->lastSequenceId = ev->sequenceId;
-#endif
- return false;
- case QNativeGestureEvent::Rotate: {
- d->lastScaleFactor = d->scaleFactor;
- d->lastRotationAngle = d->rotationAngle;
-#if defined(Q_WS_MAC)
- d->rotationAngle += ev->percentage;
- nextState = Qt::GestureUpdated;
-#elif defined(Q_WS_WIN)
- // This is a workaround for an issue with the native rotation
- // gesture on Windows 7. For some reason the rotation angle in the
- // first WM_GESTURE message in a sequence contains value that is
- // off a little bit and causes the rotating item to "jump", so
- // we just ignore the first WM_GESTURE in every sequence.
- bool windowsRotateWorkaround = false;
- if (!d->lastSequenceId) {
- windowsRotateWorkaround = true;
- d->lastSequenceId = ev->sequenceId;
- }
- if (d->lastSequenceId > 0 && d->lastSequenceId != (ulong)-1 && ev->sequenceId != d->lastSequenceId) {
- // this is the first WM_GESTURE message in a sequence.
- d->totalRotationAngle += d->rotationAngle;
- windowsRotateWorkaround = true;
- // a magic value to mark that the next WM_GESTURE message is
- // the second message in a sequence and we should clear the
- // lastRotationAngle
- d->lastSequenceId = (ulong)-1;
- }
- if (!windowsRotateWorkaround) {
- d->rotationAngle = -1 * GID_ROTATE_ANGLE_FROM_ARGUMENT(ev->argument) * 180. / M_PI;
- if (d->lastSequenceId == (ulong)-1) {
- // a special case since we need to set the lastRotationAngle to
- // rotationAngle when the first WM_GESTURE is received in each
- // sequence.
- d->lastRotationAngle = d->rotationAngle;
- }
- d->lastSequenceId = ev->sequenceId;
- }
- if (!windowsRotateWorkaround)
- nextState = Qt::GestureUpdated;
-#endif
- d->changes = QPinchGesture::RotationAngleChanged;
- event->accept();
- break;
- }
- case QNativeGestureEvent::Zoom:
- d->lastRotationAngle = d->rotationAngle;
- d->lastScaleFactor = d->scaleFactor;
-#if defined(Q_WS_WIN)
- if (d->initialDistance != 0) {
- int distance = int(qint64(ev->argument));
- if (d->lastSequenceId && ev->sequenceId != d->lastSequenceId) {
- d->totalScaleFactor *= d->scaleFactor;
- d->initialDistance = int(qint64(ev->argument));
- d->lastScaleFactor = d->scaleFactor = (qreal) distance / d->initialDistance;
- } else {
- d->scaleFactor = (qreal) distance / d->initialDistance;
- }
- d->lastSequenceId = ev->sequenceId;
- } else {
- d->initialDistance = int(qint64(ev->argument));
- }
-#elif defined(Q_WS_MAC)
- d->scaleFactor += ev->percentage;
-#endif
- nextState = Qt::GestureUpdated;
- d->changes = QPinchGesture::ScaleFactorChanged;
- event->accept();
- break;
- case QNativeGestureEvent::GestureEnd:
- if (state() == Qt::NoGesture)
- return false; // some other gesture has ended
- nextState = Qt::GestureFinished;
- break;
- default:
- return false;
- }
- if (d->startCenterPoint.isNull())
- d->startCenterPoint = d->centerPoint;
- d->lastCenterPoint = d->centerPoint;
- d->centerPoint = static_cast<QWidget*>(receiver)->mapFromGlobal(ev->position);
- if (d->lastCenterPoint != d->centerPoint)
- d->changes |= QPinchGesture::CenterPointChanged;
- updateState(nextState);
- return true;
- }
-#endif
- return QGesture::eventFilter(receiver, event);
-}
-
-
-/*! \internal */
-bool QPinchGesture::filterEvent(QEvent *event)
-{
- Q_D(QPinchGesture);
-
- if (d->implicitGesture && d->gestureTarget && d->gestureTarget->isWidgetType() &&
- static_cast<QWidget*>(d->gestureTarget.data())->testAttribute(Qt::WA_DontUseStandardGestures))
- return false;
-
- Q_UNUSED(event);
- return false;
-}
-
-/*! \internal */
-void QPinchGesture::reset()
-{
- Q_D(QPinchGesture);
- d->changes = 0;
- d->totalScaleFactor = d->scaleFactor = d->lastScaleFactor = 1.;
- d->totalRotationAngle = d->rotationAngle = d->lastRotationAngle = 0.;
- d->startCenterPoint = d->centerPoint = d->lastCenterPoint = QPointF();
- QGesture::reset();
-}
-
-/*! \enum QPinchGesture::WhatChange
- \value ScaleFactorChanged
- \value RotationAngleChanged
- \value CenterPointChanged
-*/
-
-/*!
- \property QPinchGesture::whatChanged
-
- Specifies which values were changed in the gesture.
-*/
-QPinchGesture::WhatChanged QPinchGesture::whatChanged() const
-{
- return d_func()->changes;
-}
-
-/*!
- \property QPinchGesture::totalScaleFactor
-
- Specifies a total scale factor of the pinch gesture since the gesture
- started.
-*/
-qreal QPinchGesture::totalScaleFactor() const
-{
- Q_D(const QPinchGesture);
- return d->totalScaleFactor * d->scaleFactor;
-}
-
-/*!
- \property QPinchGesture::scaleFactor
-
- Specifies a scale factor of the pinch gesture.
-
- If the gesture consists of several pinch sequences (i.e. zoom and rotate
- sequences), then this property specifies the scale factor in the current
- sequence. When pinching changes the rotation angle only, the value of this
- property is 1.
-*/
-qreal QPinchGesture::scaleFactor() const
-{
- return d_func()->scaleFactor;
-}
-
-/*!
- \property QPinchGesture::lastScaleFactor
-
- Specifies a previous scale factor of the pinch gesture.
-*/
-qreal QPinchGesture::lastScaleFactor() const
-{
- return d_func()->lastScaleFactor;
-}
-
-/*!
- \property QPinchGesture::totalRotationAngle
-
- Specifies a total rotation angle of the gesture since the gesture started.
-
- The angle is specified in degrees.
-*/
-qreal QPinchGesture::totalRotationAngle() const
-{
- Q_D(const QPinchGesture);
- return d->totalRotationAngle + d->rotationAngle;
-}
-
-/*!
- \property QPinchGesture::rotationAngle
-
- Specifies a rotation angle of the gesture.
-
- If the gesture consists of several pinch sequences (i.e. zoom and rotate
- sequences), then this property specifies the rotation angle in the current
- sequence. When pinching changes the scale factor only, the value of this
- property is 0.
-
- The angle is specified in degrees.
-*/
-qreal QPinchGesture::rotationAngle() const
-{
- return d_func()->rotationAngle;
-}
-
-/*!
- \property QPinchGesture::lastRotationAngle
-
- Specifies a previous rotation angle of the gesture.
-
- The angle is specified in degrees.
-*/
-qreal QPinchGesture::lastRotationAngle() const
-{
- return d_func()->lastRotationAngle;
-}
-
-/*!
- \property QPinchGesture::centerPoint
-
- Specifies a center point of the gesture. The point can be used as a center
- point that the object is rotated around.
-*/
-QPointF QPinchGesture::centerPoint() const
-{
- return d_func()->centerPoint;
-}
-
-/*!
- \property QPinchGesture::lastCenterPoint
-
- Specifies a previous center point of the gesture.
-*/
-QPointF QPinchGesture::lastCenterPoint() const
-{
- return d_func()->lastCenterPoint;
-}
-
-/*!
- \property QPinchGesture::startCenterPoint
-
- Specifies an initial center point of the gesture. Difference between the
- startCenterPoint and the centerPoint is the distance at which pinching
- fingers has shifted.
-*/
-QPointF QPinchGesture::startCenterPoint() const
-{
- return d_func()->startCenterPoint;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-/*!
- \class QSwipeGesture
- \preliminary
- \since 4.6
-
- \brief The QSwipeGesture class represents a swipe gesture,
- providing additional information related to swiping.
-*/
-
-/*!
- Creates a new Swipe gesture handler object and marks it as a
- child of \a parent. The swipe gesture handler watches \a
- gestureTarget for its events.
-
- On some platform like Windows it's necessary to provide a non-null
- widget as \a parent to get native gesture support.
-*/
-QSwipeGesture::QSwipeGesture(QWidget *gestureTarget, QObject *parent)
- : QGesture(*new QSwipeGesturePrivate, gestureTarget, parent)
-{
- setObjectName(QLatin1String("QSwipeGesture"));
-}
-
-void QSwipeGesturePrivate::setupGestureTarget(QObject *newGestureTarget)
-{
- Q_Q(QSwipeGesture);
- if (gestureTarget && gestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(gestureTarget.data());
- QApplicationPrivate::instance()->widgetGestures[w].swipe = 0;
-#if defined(Q_WS_WIN)
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
-
- if (newGestureTarget && newGestureTarget->isWidgetType()) {
- QWidget *w = static_cast<QWidget*>(newGestureTarget);
- QApplicationPrivate::instance()->widgetGestures[w].swipe = q;
-#if defined(Q_WS_WIN)
- qt_widget_private(w)->winSetupGestures();
-#endif
- }
- QGesturePrivate::setupGestureTarget(newGestureTarget);
-}
-
-/*!
- \property QSwipeGesture::swipeAngle
-
- Holds the angle of the swipe gesture, 0..360.
-*/
-qreal QSwipeGesture::swipeAngle() const
-{
- Q_D(const QSwipeGesture);
- return d->swipeAngle;
-}
-
-/*!
- \property QSwipeGesture::horizontalDirection
-
- Holds the direction for the horizontal component of the swipe
- gesture, SwipeDirection::Left or SwipeDirection::Right.
- SwipeDirection::NoDirection if there is no horizontal
- component to the swipe gesture.
-*/
-QSwipeGesture::SwipeDirection QSwipeGesture::horizontalDirection() const
-{
- Q_D(const QSwipeGesture);
- if (d->swipeAngle < 0 || d->swipeAngle == 90 || d->swipeAngle == 270)
- return QSwipeGesture::NoDirection;
- else if (d->swipeAngle < 90 || d->swipeAngle > 270)
- return QSwipeGesture::Right;
- else
- return QSwipeGesture::Left;
-}
-
-
-/*!
- \property QSwipeGesture::verticalDirection
-
- Holds the direction for the vertical component of the swipe
- gesture, SwipeDirection::Down or SwipeDirection::Up.
- SwipeDirection::NoDirection if there is no vertical
- component to the swipe gesture.
-*/
-QSwipeGesture::SwipeDirection QSwipeGesture::verticalDirection() const
-{
- Q_D(const QSwipeGesture);
- if (d->swipeAngle <= 0 || d->swipeAngle == 180)
- return QSwipeGesture::NoDirection;
- else if (d->swipeAngle < 180)
- return QSwipeGesture::Up;
- else
- return QSwipeGesture::Down;
-}
-
-bool QSwipeGesture::eventFilter(QObject *receiver, QEvent *event)
-{
- Q_D(QSwipeGesture);
- if (receiver->isWidgetType() && event->type() == QEvent::NativeGesture) {
- QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
- switch (ev->gestureType) {
- case QNativeGestureEvent::Swipe:
- d->swipeAngle = ev->angle;
- updateState(Qt::GestureStarted);
- updateState(Qt::GestureUpdated);
- updateState(Qt::GestureFinished);
- break;
- default:
- return false;
- }
- return true;
- }
- return QGesture::eventFilter(receiver, event);
-}
-
-/*! \internal */
-bool QSwipeGesture::filterEvent(QEvent *)
-{
- return false;
-}
-
-/*! \internal */
-void QSwipeGesture::reset()
-{
- Q_D(QSwipeGesture);
- d->swipeAngle = -1;
- QGesture::reset();
+ return QGestureRecognizer::Ignore;
}
+ */
QT_END_NAMESPACE
-
-#include "moc_qstandardgestures.cpp"
-
diff --git a/src/gui/kernel/qstandardgestures.h b/src/gui/kernel/qstandardgestures.h
deleted file mode 100644
index 9e8291b..0000000
--- a/src/gui/kernel/qstandardgestures.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTANDARDGESTURES_H
-#define QSTANDARDGESTURES_H
-
-#include <QtGui/qevent.h>
-#include <QtCore/qbasictimer.h>
-
-#include <QtGui/qgesture.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Gui)
-
-class QPanGesturePrivate;
-class Q_GUI_EXPORT QPanGesture : public QGesture
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QPanGesture)
-
- Q_PROPERTY(QSizeF totalOffset READ totalOffset)
- Q_PROPERTY(QSizeF lastOffset READ lastOffset)
- Q_PROPERTY(QSizeF offset READ offset)
-
-public:
- QPanGesture(QWidget *gestureTarget, QObject *parent = 0);
-
- bool filterEvent(QEvent *event);
-
- QSizeF totalOffset() const;
- QSizeF lastOffset() const;
- QSizeF offset() const;
-
-protected:
- void reset();
-
-private:
- bool event(QEvent *event);
- bool eventFilter(QObject *receiver, QEvent *event);
-
- friend class QWidget;
- friend class QAbstractScrollAreaPrivate;
-};
-
-class QPinchGesturePrivate;
-class Q_GUI_EXPORT QPinchGesture : public QGesture
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QPinchGesture)
-
-public:
- enum WhatChange {
- ScaleFactorChanged = 0x1,
- RotationAngleChanged = 0x2,
- CenterPointChanged = 0x4
- };
- Q_DECLARE_FLAGS(WhatChanged, WhatChange)
-
- Q_PROPERTY(WhatChanged whatChanged READ whatChanged)
-
- Q_PROPERTY(qreal totalScaleFactor READ totalScaleFactor)
- Q_PROPERTY(qreal lastScaleFactor READ lastScaleFactor)
- Q_PROPERTY(qreal scaleFactor READ scaleFactor)
-
- Q_PROPERTY(qreal totalRotationAngle READ totalRotationAngle)
- Q_PROPERTY(qreal lastRotationAngle READ lastRotationAngle)
- Q_PROPERTY(qreal rotationAngle READ rotationAngle)
-
- Q_PROPERTY(QPointF startCenterPoint READ startCenterPoint)
- Q_PROPERTY(QPointF lastCenterPoint READ lastCenterPoint)
- Q_PROPERTY(QPointF centerPoint READ centerPoint)
-
-public:
-
- QPinchGesture(QWidget *gestureTarget, QObject *parent = 0);
-
- bool filterEvent(QEvent *event);
- void reset();
-
- WhatChanged whatChanged() const;
-
- QPointF startCenterPoint() const;
- QPointF lastCenterPoint() const;
- QPointF centerPoint() const;
-
- qreal totalScaleFactor() const;
- qreal lastScaleFactor() const;
- qreal scaleFactor() const;
-
- qreal totalRotationAngle() const;
- qreal lastRotationAngle() const;
- qreal rotationAngle() const;
-
-private:
- bool event(QEvent *event);
- bool eventFilter(QObject *receiver, QEvent *event);
-
- friend class QWidget;
-};
-
-class QSwipeGesturePrivate;
-class Q_GUI_EXPORT QSwipeGesture : public QGesture
-{
- Q_OBJECT
- Q_ENUMS(SwipeDirection)
-
- Q_PROPERTY(SwipeDirection horizontalDirection READ horizontalDirection)
- Q_PROPERTY(SwipeDirection verticalDirection READ verticalDirection)
- Q_PROPERTY(qreal swipeAngle READ swipeAngle)
-
- Q_DECLARE_PRIVATE(QSwipeGesture)
-
-public:
- enum SwipeDirection { NoDirection, Left, Right, Up, Down };
- QSwipeGesture(QWidget *gestureTarget, QObject *parent = 0);
-
- bool filterEvent(QEvent *event);
- void reset();
-
- SwipeDirection horizontalDirection() const;
- SwipeDirection verticalDirection() const;
- qreal swipeAngle() const;
-
-private:
- bool eventFilter(QObject *receiver, QEvent *event);
-
- friend class QWidget;
-};
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QSTANDARDGESTURES_H
diff --git a/src/gui/kernel/qstandardgestures_p.h b/src/gui/kernel/qstandardgestures_p.h
index 79aadfd..fec5c2f 100644
--- a/src/gui/kernel/qstandardgestures_p.h
+++ b/src/gui/kernel/qstandardgestures_p.h
@@ -53,83 +53,20 @@
// We mean it.
//
-#include "qevent.h"
-#include "qbasictimer.h"
-#include "qdebug.h"
-
-#include "qgesture.h"
-#include "qgesture_p.h"
-
-#include "qstandardgestures.h"
-#include "qbasictimer.h"
+#include "qgesturerecognizer.h"
+#include "private/qgesture_p.h"
QT_BEGIN_NAMESPACE
-class QPanGesturePrivate : public QGesturePrivate
-{
- Q_DECLARE_PUBLIC(QPanGesture)
-
-public:
- void setupGestureTarget(QObject *o);
-
- QSizeF totalOffset;
- QSizeF lastOffset;
- QSizeF offset;
- QPointF lastPosition;
-
-#if defined(QT_MAC_USE_COCOA)
- QBasicTimer singleTouchPanTimer;
- QPointF prevMousePos;
-#endif
-};
-
-class QPinchGesturePrivate : public QGesturePrivate
+class QPanGestureRecognizer : public QGestureRecognizer
{
- Q_DECLARE_PUBLIC(QPinchGesture)
-
public:
- QPinchGesturePrivate()
- : changes(0), totalScaleFactor(0.), lastScaleFactor(0.), scaleFactor(0.),
- totalRotationAngle(0.), lastRotationAngle(0.), rotationAngle(0.)
-#ifdef Q_WS_WIN
- ,initialDistance(0), lastSequenceId(0)
-#endif
- {
- }
+ QPanGestureRecognizer();
- void setupGestureTarget(QObject *o);
-
- QPinchGesture::WhatChanged changes;
-
- qreal totalScaleFactor; // total scale factor, excluding the current sequence.
- qreal lastScaleFactor;
- qreal scaleFactor; // scale factor in the current sequence.
-
- qreal totalRotationAngle; // total rotation angle, excluding the current sequence.
- qreal lastRotationAngle;
- qreal rotationAngle; // rotation angle in the current sequence.
-
- QPointF startCenterPoint;
- QPointF lastCenterPoint;
- QPointF centerPoint;
-#ifdef Q_WS_WIN
- int initialDistance;
- ulong lastSequenceId;
-#endif
-};
-
-class QSwipeGesturePrivate : public QGesturePrivate
-{
- Q_DECLARE_PUBLIC(QSwipeGesture)
-
-public:
- QSwipeGesturePrivate()
- : swipeAngle(-1)
- {
- }
+ QGesture *createGesture(QObject *target);
- void setupGestureTarget(QObject *o);
- qreal swipeAngle;
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
};
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index d33791b..e25bc81 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -81,6 +81,9 @@ QT_BEGIN_NAMESPACE
// system events seems to start with 0x10
const TInt KInternalStatusPaneChange = 0x50000000;
+//this macro exists because EColor16MAP enum value doesn't exist in Symbian OS 9.2
+#define Q_SYMBIAN_ECOLOR16MAP TDisplayMode(13)
+
class QS60Data
{
public:
@@ -108,6 +111,7 @@ public:
int mouseInteractionEnabled : 1;
int virtualMouseRequired : 1;
int qtOwnsS60Environment : 1;
+ int supportsPremultipliedAlpha : 1;
QApplication::QS60MainApplicationFactory s60ApplicationFactory; // typedef'ed pointer type
static inline void updateScreenSize();
static inline RWsSession& wsSession();
@@ -199,7 +203,7 @@ inline void QS60Data::updateScreenSize()
S60->screenHeightInPixels = params.iPixelSize.iHeight;
S60->screenWidthInTwips = params.iTwipsSize.iWidth;
S60->screenHeightInTwips = params.iTwipsSize.iHeight;
-
+
S60->virtualMouseMaxAccel = qMax(S60->screenHeightInPixels, S60->screenWidthInPixels) / 20;
TReal inches = S60->screenHeightInTwips / (TReal)KTwipsPerInch;
@@ -302,11 +306,9 @@ static inline QImage::Format qt_TDisplayMode2Format(TDisplayMode mode)
case EColor16MA:
format = QImage::Format_ARGB32;
break;
-#if !defined(__SERIES60_31__) && !defined(__S60_32__)
- case EColor16MAP:
+ case Q_SYMBIAN_ECOLOR16MAP:
format = QImage::Format_ARGB32_Premultiplied;
break;
-#endif
default:
format = QImage::Format_Invalid;
break;
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 56602f7..102f4c9 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -93,6 +93,7 @@
# include "qx11info_x11.h"
#endif
+#include <private/qgraphicseffect_p.h>
#include <private/qwindowsurface_p.h>
#include <private/qbackingstore_p.h>
#ifdef Q_WS_MAC
@@ -115,6 +116,7 @@
#include "private/qevent_p.h"
#include "private/qgraphicssystem_p.h"
+#include "private/qgesturemanager_p.h"
// widget/widget data creation count
//#define QWIDGET_EXTRA_DEBUG
@@ -148,24 +150,6 @@ static inline bool hasBackingStoreSupport()
#endif
}
-/*!
- \internal
-
- Returns true if \a p or any of its parents enable the
- Qt::BypassGraphicsProxyWidget window flag. Used in QWidget::show() and
- QWidget::setParent() to determine whether it's necessary to embed the
- widget into a QGraphicsProxyWidget or not.
-*/
-static inline bool bypassGraphicsProxyWidget(QWidget *p)
-{
- while (p) {
- if (p->windowFlags() & Qt::BypassGraphicsProxyWidget)
- return true;
- p = p->parentWidget();
- }
- return false;
-}
-
#ifdef Q_WS_MAC
# define QT_NO_PAINT_DEBUG
#endif
@@ -1354,6 +1338,8 @@ void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow)
d->setWindowIcon_sys(true);
if (isWindow() && !d->topData()->iconText.isEmpty())
d->setWindowIconText_helper(d->topData()->iconText);
+ if (isWindow() && !d->topData()->caption.isEmpty())
+ d->setWindowTitle_helper(d->topData()->caption);
if (windowType() != Qt::Desktop) {
d->updateSystemBackground();
@@ -1501,6 +1487,8 @@ void QWidgetPrivate::setWinId(WId id) // set widget identifier
mapper->remove(data.winid);
}
+ const WId oldWinId = data.winid;
+
data.winid = id;
#if defined(Q_WS_X11)
hd = id; // X11: hd == ident
@@ -1508,6 +1496,16 @@ void QWidgetPrivate::setWinId(WId id) // set widget identifier
if (mapper && id && !userDesktopWidget) {
mapper->insert(data.winid, q);
}
+
+ if(oldWinId != id) {
+ // Do not emit an event when the old winId is destroyed. This only
+ // happens (a) during widget destruction, and (b) immediately prior
+ // to creation of a new winId, for example as a result of re-parenting.
+ if(id != 0) {
+ QEvent e(QEvent::WinIdChange);
+ QCoreApplication::sendEvent(q, &e);
+ }
+ }
}
void QWidgetPrivate::createTLExtra()
@@ -1791,12 +1789,29 @@ QRegion QWidgetPrivate::clipRegion() const
return r;
}
+void QWidgetPrivate::invalidateGraphicsEffectsRecursively()
+{
+ Q_Q(QWidget);
+ QWidget *w = q;
+ do {
+ if (w->graphicsEffect()) {
+ QWidgetEffectSourcePrivate *sourced =
+ static_cast<QWidgetEffectSourcePrivate *>(w->graphicsEffect()->source()->d_func());
+ if (!sourced->updateDueToGraphicsEffect)
+ w->graphicsEffect()->source()->d_func()->invalidateCache();
+ }
+ w = w->parentWidget();
+ } while (w);
+}
+
void QWidgetPrivate::setDirtyOpaqueRegion()
{
Q_Q(QWidget);
dirtyOpaqueChildren = true;
+ invalidateGraphicsEffectsRecursively();
+
if (q->isWindow())
return;
@@ -2226,8 +2241,8 @@ QWidget *QWidget::find(WId id)
against. If Qt is using Carbon, the {WId} is actually an HIViewRef. If Qt
is using Cocoa, {WId} is a pointer to an NSView.
- \note We recommend that you do not store this value as it is likely to
- change at run-time.
+ This value may change at run-time. An event with type QEvent::WinIdChange
+ will be sent to the widget following a change in window system identifier.
\sa find()
*/
@@ -5200,6 +5215,10 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
paintEngine->d_func()->systemClip = QRegion();
} else {
context.painter = sharedPainter;
+ if (sharedPainter->worldTransform() != sourced->lastEffectTransform) {
+ sourced->invalidateCache();
+ sourced->lastEffectTransform = sharedPainter->worldTransform();
+ }
sharedPainter->save();
sharedPainter->translate(offset);
graphicsEffect->draw(sharedPainter, source);
@@ -5472,6 +5491,7 @@ QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *
return pixmap;
}
+#ifndef QT_NO_GRAPHICSVIEW
/*!
\internal
@@ -5480,7 +5500,7 @@ QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *
If successful, the function returns the proxy that embeds the widget, or 0 if no embedded
widget was found.
*/
-QGraphicsProxyWidget * QWidgetPrivate::nearestGraphicsProxyWidget(QWidget *origin)
+QGraphicsProxyWidget * QWidgetPrivate::nearestGraphicsProxyWidget(const QWidget *origin)
{
if (origin) {
QWExtra *extra = origin->d_func()->extra;
@@ -5490,6 +5510,7 @@ QGraphicsProxyWidget * QWidgetPrivate::nearestGraphicsProxyWidget(QWidget *origi
}
return 0;
}
+#endif
/*!
\property QWidget::locale
@@ -5664,9 +5685,8 @@ QString qt_setWindowTitle_helperHelper(const QString &title, const QWidget *widg
void QWidgetPrivate::setWindowTitle_helper(const QString &title)
{
Q_Q(QWidget);
- if (!q->testAttribute(Qt::WA_WState_Created))
- createWinId();
- setWindowTitle_sys(qt_setWindowTitle_helperHelper(title, q));
+ if (q->testAttribute(Qt::WA_WState_Created))
+ setWindowTitle_sys(qt_setWindowTitle_helperHelper(title, q));
}
void QWidgetPrivate::setWindowIconText_helper(const QString &title)
@@ -7725,6 +7745,10 @@ void QWidget::adjustSize()
Q_D(QWidget);
ensurePolished();
QSize s = d->adjustedSize();
+
+ if (d->layout)
+ d->layout->activate();
+
if (s.isValid())
resize(s);
}
@@ -8332,6 +8356,9 @@ bool QWidget::event(QEvent *event)
(void) QApplication::sendEvent(this, &mouseEvent);
break;
}
+ case QEvent::Gesture:
+ event->ignore();
+ break;
#ifndef QT_NO_PROPERTIES
case QEvent::DynamicPropertyChange: {
const QByteArray &propName = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
@@ -11668,6 +11695,19 @@ QGraphicsProxyWidget *QWidget::graphicsProxyWidget() const
Synonym for QList<QWidget *>.
*/
+/*!
+ Subscribes the widget to a given \a gesture with a \a context.
+
+ \sa QGestureEvent
+ \since 4.6
+*/
+void QWidget::grabGesture(Qt::GestureType gesture, Qt::GestureContext context)
+{
+ Q_D(QWidget);
+ d->gestureContext.insert(gesture, context);
+ (void)QGestureManager::instance(); // create a gesture manager
+}
+
QT_END_NAMESPACE
#include "moc_qwidget.cpp"
@@ -11981,3 +12021,10 @@ void QWidget::clearMask()
XRender extension is not supported on the X11 display, or if the
handle could not be created.
*/
+
+#ifdef Q_OS_SYMBIAN
+void QWidgetPrivate::_q_delayedDestroy(WId winId)
+{
+ delete winId;
+}
+#endif
diff --git a/src/gui/kernel/qwidget.h b/src/gui/kernel/qwidget.h
index 76418af..e603a1a 100644
--- a/src/gui/kernel/qwidget.h
+++ b/src/gui/kernel/qwidget.h
@@ -96,7 +96,6 @@ class QIcon;
class QWindowSurface;
class QLocale;
class QGraphicsProxyWidget;
-class QGestureManager;
class QGraphicsEffect;
#if defined(Q_WS_X11)
class QX11Info;
@@ -355,6 +354,8 @@ public:
QGraphicsEffect *graphicsEffect() const;
void setGraphicsEffect(QGraphicsEffect *effect);
+ void grabGesture(Qt::GestureType type, Qt::GestureContext context = Qt::WidgetWithChildrenGesture);
+
public Q_SLOTS:
void setWindowTitle(const QString &);
#ifndef QT_NO_STYLE_STYLESHEET
@@ -725,18 +726,17 @@ private:
friend class QGLContext;
friend class QGLWidget;
friend class QGLWindowSurface;
- friend class QGLWindowSurfaceGLPaintDevice;
- friend class QVGWindowSurface;
friend class QX11PaintEngine;
friend class QWin32PaintEngine;
friend class QShortcutPrivate;
friend class QShortcutMap;
friend class QWindowSurface;
- friend class QD3DWindowSurface;
friend class QGraphicsProxyWidget;
friend class QGraphicsProxyWidgetPrivate;
friend class QStyleSheetStyle;
friend struct QWidgetExceptionCleaner;
+ friend class QGestureManager;
+ friend class QWinNativePanGestureRecognizer;
#ifdef Q_WS_MAC
friend class QCoreGraphicsPaintEnginePrivate;
@@ -773,6 +773,9 @@ private:
private:
Q_DISABLE_COPY(QWidget)
Q_PRIVATE_SLOT(d_func(), void _q_showIfNotHidden())
+#ifdef Q_OS_SYMBIAN
+ Q_PRIVATE_SLOT(d_func(), void _q_delayedDestroy(WId winId))
+#endif
QWidgetData *data;
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index c966aa3..05c6a5b 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -305,6 +305,8 @@ bool qt_mac_insideKeyWindow(const QWidget *w)
{
#ifdef QT_MAC_USE_COCOA
return [[reinterpret_cast<NSView *>(w->winId()) window] isKeyWindow];
+#else
+ Q_UNUSED(w);
#endif
return false;
}
@@ -3301,7 +3303,11 @@ void QWidgetPrivate::show_sys()
[window miniaturize:window];
#endif
} else if (!q->testAttribute(Qt::WA_ShowWithoutActivating)) {
+#ifndef QT_MAC_USE_COCOA
qt_event_request_activate(q);
+#else
+ [qt_mac_window_for(q) makeKeyWindow];
+#endif
}
} else if(topData()->embedded || !q->parentWidget() || q->parentWidget()->isVisible()) {
#ifndef QT_MAC_USE_COCOA
@@ -3404,8 +3410,13 @@ void QWidgetPrivate::hide_sys()
}
#endif
}
- if(w && w->isVisible() && !w->isMinimized())
- qt_event_request_activate(w);
+ if(w && w->isVisible() && !w->isMinimized()) {
+#ifndef QT_MAC_USE_COCOA
+ qt_event_request_activate(w);
+#else
+ [qt_mac_window_for(w) makeKeyWindow];
+#endif
+ }
}
} else {
invalidateBuffer(q->rect());
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index c06ef73..159a3f2 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -63,6 +63,10 @@
#include "QtGui/qstyle.h"
#include "QtGui/qapplication.h"
#include <private/qgraphicseffect_p.h>
+#include "QtGui/qgraphicsproxywidget.h"
+#include "QtGui/qgraphicsscene.h"
+#include "QtGui/qgraphicsview.h"
+#include <private/qgesture_p.h>
#ifdef Q_WS_WIN
#include "QtCore/qt_windows.h"
@@ -178,7 +182,9 @@ struct QWExtra {
// Regular pointers (keep them together to avoid gaps on 64 bits architectures).
void *glContext; // if the widget is hijacked by QGLWindowSurface
QTLWExtra *topextra; // only useful for TLWs
+#ifndef QT_NO_GRAPHICSVIEW
QGraphicsProxyWidget *proxyWidget; // if the widget is embedded
+#endif
#ifndef QT_NO_CURSOR
QCursor *curs;
#endif
@@ -233,6 +239,24 @@ struct QWExtra {
#endif
};
+/*!
+ \internal
+
+ Returns true if \a p or any of its parents enable the
+ Qt::BypassGraphicsProxyWidget window flag. Used in QWidget::show() and
+ QWidget::setParent() to determine whether it's necessary to embed the
+ widget into a QGraphicsProxyWidget or not.
+*/
+static inline bool bypassGraphicsProxyWidget(const QWidget *p)
+{
+ while (p) {
+ if (p->windowFlags() & Qt::BypassGraphicsProxyWidget)
+ return true;
+ p = p->parentWidget();
+ }
+ return false;
+}
+
class Q_GUI_EXPORT QWidgetPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QWidget)
@@ -294,7 +318,8 @@ public:
void setMask_sys(const QRegion &);
#ifdef Q_OS_SYMBIAN
void setSoftKeys_sys(const QList<QAction*> &softkeys);
- void activateSymbianWindow();
+ void activateSymbianWindow(WId wid = 0);
+ void _q_delayedDestroy(WId winId);
#endif
void raise_sys();
@@ -342,7 +367,9 @@ public:
QPainter *beginSharedPainter();
bool endSharedPainter();
- static QGraphicsProxyWidget * nearestGraphicsProxyWidget(QWidget *origin);
+#ifndef QT_NO_GRAPHICSVIEW
+ static QGraphicsProxyWidget * nearestGraphicsProxyWidget(const QWidget *origin);
+#endif
QWindowSurface *createDefaultWindowSurface();
QWindowSurface *createDefaultWindowSurface_sys();
void repaint_sys(const QRegion &rgn);
@@ -357,6 +384,7 @@ public:
void setOpaque(bool opaque);
void updateIsTranslucent();
bool paintOnScreen() const;
+ void invalidateGraphicsEffectsRecursively();
QRegion getOpaqueRegion() const;
const QRegion &getOpaqueChildren() const;
@@ -439,6 +467,31 @@ public:
void setModal_sys();
+ // This is an helper function that return the available geometry for
+ // a widget and takes care is this one is in QGraphicsView.
+ // If the widget is not embed in a scene then the geometry available is
+ // null, we let QDesktopWidget decide for us.
+ static QRect screenGeometry(const QWidget *widget)
+ {
+ QRect screen;
+#ifndef QT_NO_GRAPHICSVIEW
+ QGraphicsProxyWidget *ancestorProxy = widget->d_func()->nearestGraphicsProxyWidget(widget);
+ //It's embedded if it has an ancestor
+ if (ancestorProxy) {
+ if (!bypassGraphicsProxyWidget(widget)) {
+ // One view, let be smart and return the viewport rect then the popup is aligned
+ if (ancestorProxy->scene()->views().size() == 1) {
+ QGraphicsView *view = ancestorProxy->scene()->views().at(0);
+ screen = view->mapToScene(view->viewport()->rect()).boundingRect().toRect();
+ } else {
+ screen = ancestorProxy->scene()->sceneRect().toRect();
+ }
+ }
+ }
+#endif
+ return screen;
+ }
+
inline void setRedirected(QPaintDevice *replacement, const QPoint &offset)
{
Q_ASSERT(q_func()->testAttribute(Qt::WA_WState_InPaintEvent));
@@ -578,6 +631,7 @@ public:
#ifndef QT_NO_ACTION
QList<QAction*> actions;
#endif
+ QMap<Qt::GestureType, Qt::GestureContext> gestureContext;
// Bit fields.
uint high_attributes[3]; // the low ones are in QWidget::widget_attributes
@@ -604,6 +658,7 @@ public:
bool isBackgroundInherited() const;
#elif defined(Q_WS_WIN) // <--------------------------------------------------------- WIN
uint noPaintOnScreen : 1; // see qwidget_win.cpp ::paintEngine()
+ uint nativeGesturePanEnabled : 1;
bool shouldShowMaximizeButton();
void winUpdateIsOpaque();
@@ -724,7 +779,7 @@ class QWidgetEffectSourcePrivate : public QGraphicsEffectSourcePrivate
{
public:
QWidgetEffectSourcePrivate(QWidget *widget)
- : QGraphicsEffectSourcePrivate(), m_widget(widget), context(0)
+ : QGraphicsEffectSourcePrivate(), m_widget(widget), context(0), updateDueToGraphicsEffect(false)
{}
inline void detach()
@@ -737,7 +792,11 @@ public:
{ return m_widget; }
inline void update()
- { m_widget->update(); }
+ {
+ updateDueToGraphicsEffect = true;
+ m_widget->update();
+ updateDueToGraphicsEffect = false;
+ }
inline bool isPixmap() const
{ return false; }
@@ -749,7 +808,7 @@ public:
if (QWidget *parent = m_widget->parentWidget())
parent->update();
else
- m_widget->update();
+ update();
}
inline const QStyleOption *styleOption() const
@@ -764,6 +823,8 @@ public:
QWidget *m_widget;
QWidgetPaintContext *context;
+ QTransform lastEffectTransform;
+ bool updateDueToGraphicsEffect;
};
inline QWExtra *QWidgetPrivate::extraData() const
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index b0d405a..abf5ba5 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -56,6 +56,12 @@
#include <aknappui.h>
#endif
+// This is necessary in order to be able to perform delayed invokation on slots
+// which take arguments of type WId. One example is
+// QWidgetPrivate::_q_delayedDestroy, which is used to delay destruction of
+// CCoeControl objects until after the CONE event handler has finished running.
+Q_DECLARE_METATYPE(WId)
+
QT_BEGIN_NAMESPACE
extern bool qt_nograb();
@@ -318,8 +324,6 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
bool desktop = (type == Qt::Desktop);
//bool tool = (type == Qt::Tool || type == Qt::Drawer);
- WId id = 0;
-
if (popup)
flags |= Qt::WindowStaysOnTopHint; // a popup stays on top
@@ -341,13 +345,10 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
data.crect.setSize(QSize(width, height));
}
- CCoeControl *destroyw = 0;
+ CCoeControl *const destroyw = destroyOldWindow ? data.winid : 0;
createExtra();
if (window) {
- if (destroyOldWindow)
- destroyw = data.winid;
- id = window;
setWinId(window);
TRect tr = window->Rect();
data.crect.setRect(tr.iTl.iX, tr.iTl.iY, tr.Width(), tr.Height());
@@ -355,10 +356,15 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
} else if (topLevel) {
if (!q->testAttribute(Qt::WA_Moved) && !q->testAttribute(Qt::WA_DontShowOnScreen))
data.crect.moveTopLeft(QPoint(clientRect.iTl.iX, clientRect.iTl.iY));
- QSymbianControl *control= q_check_ptr(new QSymbianControl(q));
- id = (WId)control;
- setWinId(id);
- QT_TRAP_THROWING(control->ConstructL(true,desktop));
+
+ QScopedPointer<QSymbianControl> control( q_check_ptr(new QSymbianControl(q)) );
+ QT_TRAP_THROWING(control->ConstructL(true, desktop));
+
+ // Symbian windows are always created in an inactive state
+ // We perform this assignment for the case where the window is being re-created
+ // as aa result of a call to setParent_sys, on either this widget or one of its
+ // ancestors.
+ extra->activated = 0;
if (!desktop) {
TInt stackingFlags;
@@ -368,7 +374,7 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
stackingFlags = ECoeStackFlagStandard;
}
control->MakeVisible(false);
- QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control, ECoeStackPriorityDefault, stackingFlags));
+ QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control.data(), ECoeStackPriorityDefault, stackingFlags));
// Avoid keyboard focus to a hidden window.
control->setFocusSafely(false);
@@ -391,11 +397,22 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
int x, y, w, h;
data.crect.getRect(&x, &y, &w, &h);
control->SetRect(TRect(TPoint(x, y), TSize(w, h)));
+
+ // We wait until the control is fully constructed before calling setWinId, because
+ // this generates a WinIdChanged event.
+ setWinId(control.take());
+
} else if (q->testAttribute(Qt::WA_NativeWindow) || paintOnScreen()) { // create native child widget
- QSymbianControl *control = new QSymbianControl(q);
- setWinId(control);
+
+ QScopedPointer<QSymbianControl> control( q_check_ptr(new QSymbianControl(q)) );
QT_TRAP_THROWING(control->ConstructL(!parentWidget));
+ // Symbian windows are always created in an inactive state
+ // We perform this assignment for the case where the window is being re-created
+ // as aa result of a call to setParent_sys, on either this widget or one of its
+ // ancestors.
+ extra->activated = 0;
+
TInt stackingFlags;
if ((q->windowType() & Qt::Popup) == Qt::Popup) {
stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus;
@@ -403,7 +420,7 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
stackingFlags = ECoeStackFlagStandard;
}
control->MakeVisible(false);
- QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control, ECoeStackPriorityDefault, stackingFlags));
+ QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control.data(), ECoeStackPriorityDefault, stackingFlags));
// Avoid keyboard focus to a hidden window.
control->setFocusSafely(false);
@@ -418,12 +435,21 @@ void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool de
| EPointerFilterMove | EPointerFilterDrag, 0);
if (q->isVisible() && q->testAttribute(Qt::WA_Mapped))
- activateSymbianWindow();
+ activateSymbianWindow(control.data());
+
+ // We wait until the control is fully constructed before calling setWinId, because
+ // this generates a WinIdChanged event.
+ setWinId(control.take());
}
if (destroyw) {
destroyw->ControlEnv()->AppUi()->RemoveFromStack(destroyw);
- CBase::Delete(destroyw);
+
+ // Delay deletion of the control in case this function is called in the
+ // context of a CONE event handler such as
+ // CCoeControl::ProcessPointerEventL
+ QMetaObject::invokeMethod(q, "_q_delayedDestroy",
+ Qt::QueuedConnection, Q_ARG(WId, destroyw));
}
if (q->testAttribute(Qt::WA_AcceptTouchEvents))
@@ -468,7 +494,7 @@ void QWidgetPrivate::show_sys()
invalidateBuffer(q->rect());
}
-void QWidgetPrivate::activateSymbianWindow()
+void QWidgetPrivate::activateSymbianWindow(WId wid)
{
Q_Q(QWidget);
@@ -476,8 +502,12 @@ void QWidgetPrivate::activateSymbianWindow()
Q_ASSERT(q->testAttribute(Qt::WA_Mapped));
Q_ASSERT(!extra->activated);
- WId id = q->internalWinId();
- QT_TRAP_THROWING(id->ActivateL());
+ if(!wid)
+ wid = q->internalWinId();
+
+ Q_ASSERT(wid);
+
+ QT_TRAP_THROWING(wid->ActivateL());
extra->activated = 1;
}
@@ -520,8 +550,13 @@ void QWidgetPrivate::raise_sys()
Q_Q(QWidget);
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
- if (q->internalWinId())
+ if (q->internalWinId()) {
q->internalWinId()->DrawableWindow()->SetOrdinalPosition(0);
+
+ // If toplevel widget, raise app to foreground
+ if (q->isWindow())
+ S60->wsSession().SetWindowGroupOrdinalPosition(S60->windowGroup().Identifier(), 0);
+ }
}
void QWidgetPrivate::lower_sys()
@@ -571,8 +606,14 @@ void QWidgetPrivate::reparentChildren()
w->d_func()->invalidateBuffer(w->rect());
WId parent = q->effectiveWinId();
WId child = w->effectiveWinId();
- if (parent != child)
- child->SetParent(parent);
+ if (parent != child) {
+ // Child widget is native. Because Symbian windows cannot be
+ // re-parented, we must re-create the window.
+ const WId window = 0;
+ const bool initializeWindow = false;
+ const bool destroyOldWindow = true;
+ w->d_func()->create_sys(window, initializeWindow, destroyOldWindow);
+ }
// ### TODO: We probably also need to update the component array here
w->d_func()->reparentChildren();
} else {
diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp
index a0982f4..2b11bec 100644
--- a/src/gui/kernel/qwidget_win.cpp
+++ b/src/gui/kernel/qwidget_win.cpp
@@ -2029,11 +2029,6 @@ void QWidgetPrivate::winSetupGestures()
if (!q || !q->isVisible())
return;
QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
- QApplicationPrivate::WidgetStandardGesturesMap::const_iterator it =
- qAppPriv->widgetGestures.find(q);
- if (it == qAppPriv->widgetGestures.end())
- return;
- const QStandardGestures &gestures = it.value();
WId winid = q->effectiveWinId();
bool needh = false;
@@ -2052,10 +2047,10 @@ void QWidgetPrivate::winSetupGestures()
singleFingerPanEnabled = asa->d_func()->singleFingerPanEnabled;
}
if (winid && qAppPriv->SetGestureConfig) {
- GESTURECONFIG gc[3];
+ GESTURECONFIG gc[1];
memset(gc, 0, sizeof(gc));
gc[0].dwID = GID_PAN;
- if (gestures.pan) {
+ if (nativeGesturePanEnabled) {
gc[0].dwWant = GC_PAN;
if (needv && singleFingerPanEnabled)
gc[0].dwWant |= GC_PAN_WITH_SINGLE_FINGER_VERTICALLY;
@@ -2069,16 +2064,16 @@ void QWidgetPrivate::winSetupGestures()
gc[0].dwBlock = GC_PAN;
}
- gc[1].dwID = GID_ZOOM;
- if (gestures.pinch)
- gc[1].dwWant = GC_ZOOM;
- else
- gc[1].dwBlock = GC_ZOOM;
- gc[2].dwID = GID_ROTATE;
- if (gestures.pinch)
- gc[2].dwWant = GC_ROTATE;
- else
- gc[2].dwBlock = GC_ROTATE;
+// gc[1].dwID = GID_ZOOM;
+// if (gestures.pinch)
+// gc[1].dwWant = GC_ZOOM;
+// else
+// gc[1].dwBlock = GC_ZOOM;
+// gc[2].dwID = GID_ROTATE;
+// if (gestures.pinch)
+// gc[2].dwWant = GC_ROTATE;
+// else
+// gc[2].dwBlock = GC_ROTATE;
qAppPriv->SetGestureConfig(winid, 0, sizeof(gc)/sizeof(gc[0]), gc, sizeof(gc[0]));
}
diff --git a/src/gui/kernel/qwidget_wince.cpp b/src/gui/kernel/qwidget_wince.cpp
index 4a0d30c..2fe69e4 100644
--- a/src/gui/kernel/qwidget_wince.cpp
+++ b/src/gui/kernel/qwidget_wince.cpp
@@ -474,7 +474,7 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
int normal = SW_SHOWNOACTIVATE;
if ((oldstate & Qt::WindowMinimized) && !(newstate & Qt::WindowMinimized))
- newstate |= Qt::WindowActive;
+ newstate |= Qt::WindowActive;
if (newstate & Qt::WindowActive)
normal = SW_SHOWNORMAL;
if (isWindow()) {
@@ -490,13 +490,13 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
d->topData()->normalGeometry = geometry();
}
if ((oldstate & Qt::WindowMaximized) != (newstate & Qt::WindowMaximized)) {
- if (!(newstate & Qt::WindowMaximized)) {
+ if (!(newstate & Qt::WindowMaximized)) {
int style = GetWindowLong(internalWinId(), GWL_STYLE) | WS_BORDER | WS_POPUP | WS_CAPTION;
SetWindowLong(internalWinId(), GWL_STYLE, style);
SetWindowLong(internalWinId(), GWL_EXSTYLE, GetWindowLong (internalWinId(), GWL_EXSTYLE) & ~ WS_EX_NODRAG);
}
- if (isVisible() && newstate & Qt::WindowMaximized)
- qt_wince_maximize(this);
+ if (isVisible() && newstate & Qt::WindowMaximized)
+ qt_wince_maximize(this);
if (isVisible() && !(newstate & Qt::WindowMinimized)) {
ShowWindow(internalWinId(), (newstate & Qt::WindowMaximized) ? max : normal);
if (!(newstate & Qt::WindowFullScreen)) {
@@ -558,18 +558,10 @@ void QWidget::setWindowState(Qt::WindowStates newstate)
else if (newstate & Qt::WindowMaximized) {
ShowWindow(internalWinId(), max);
qt_wince_maximize(this);
+ } else {
+ ShowWindow(internalWinId(), normal);
}
}
- if ((newstate & Qt::WindowMaximized) && !(newstate & Qt::WindowFullScreen)) {
- QRect r = d->topData()->normalGeometry;
-#ifdef Q_WS_WINCE_WM
- if (!inherits("QDialog") && !inherits("QMdiArea") && !isVisible()) {
- d->data.crect.setRect(0, 0, -1, -1);
- }
-#else
- qt_wince_maximize(this);
-#endif
- }
}
data->window_state = newstate;
QWindowStateChangeEvent e(oldstate);
diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
index 283dfb2..28676da 100644
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -518,14 +518,18 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
if (!window)
initializeWindow = true;
+ QX11Info *parentXinfo = parentWidget ? &parentWidget->d_func()->xinfo : 0;
+
if (desktop &&
qt_x11_create_desktop_on_screen >= 0 &&
qt_x11_create_desktop_on_screen != xinfo.screen()) {
// desktop on a certain screen other than the default requested
QX11InfoData *xd = &X11->screens[qt_x11_create_desktop_on_screen];
xinfo.setX11Data(xd);
- } else if (parentWidget && parentWidget->d_func()->xinfo.screen() != xinfo.screen()) {
- xinfo = parentWidget->d_func()->xinfo;
+ } else if (parentXinfo && (parentXinfo->screen() != xinfo.screen()
+ || parentXinfo->visual() != xinfo.visual()))
+ {
+ xinfo = *parentXinfo;
}
//get display, screen number, root window and desktop geometry for
@@ -920,6 +924,43 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
#endif
}
+static void qt_x11_recreateWidget(QWidget *widget)
+{
+ if (widget->inherits("QGLWidget")) {
+ // We send QGLWidgets a ParentChange event which causes them to
+ // recreate their GL context, which in turn causes them to choose
+ // their visual again. Now that WA_TranslucentBackground is set,
+ // QGLContext::chooseVisual will select an ARGB visual.
+ QEvent e(QEvent::ParentChange);
+ QApplication::sendEvent(widget, &e);
+ } else {
+ // For regular widgets, reparent them with their parent which
+ // also triggers a recreation of the native window
+ QPoint pos = widget->pos();
+ bool visible = widget->isVisible();
+ if (visible)
+ widget->hide();
+
+ widget->setParent(widget->parentWidget(), widget->windowFlags());
+ widget->move(pos);
+ if (visible)
+ widget->show();
+ }
+}
+
+static void qt_x11_recreateNativeWidgetsRecursive(QWidget *widget)
+{
+ if (widget->internalWinId())
+ qt_x11_recreateWidget(widget);
+
+ const QObjectList &children = widget->children();
+ for (int i = 0; i < children.size(); ++i) {
+ QWidget *child = qobject_cast<QWidget*>(children.at(i));
+ if (child)
+ qt_x11_recreateNativeWidgetsRecursive(child);
+ }
+}
+
void QWidgetPrivate::x11UpdateIsOpaque()
{
#ifndef QT_NO_XRENDER
@@ -930,29 +971,9 @@ void QWidgetPrivate::x11UpdateIsOpaque()
bool topLevel = (data.window_flags & Qt::Window);
int screen = xinfo.screen();
if (topLevel && X11->use_xrender
- && X11->argbVisuals[screen] && xinfo.depth() != 32) {
-
- if (q->inherits("QGLWidget")) {
- // We send QGLWidgets a ParentChange event which causes them to
- // recreate their GL context, which in turn causes them to choose
- // their visual again. Now that WA_TranslucentBackground is set,
- // QGLContext::chooseVisual will select an ARGB visual.
- QEvent e(QEvent::ParentChange);
- QApplication::sendEvent(q, &e);
- }
- else {
- // For regular widgets, reparent them with their parent which
- // also triggers a recreation of the native window
- QPoint pos = q->pos();
- bool visible = q->isVisible();
- if (visible)
- q->hide();
-
- q->setParent(q->parentWidget(), q->windowFlags());
- q->move(pos);
- if (visible)
- q->show();
- }
+ && X11->argbVisuals[screen] && xinfo.depth() != 32)
+ {
+ qt_x11_recreateNativeWidgetsRecursive(q);
}
#endif
}
diff --git a/src/gui/kernel/qwinnativepangesturerecognizer_win.cpp b/src/gui/kernel/qwinnativepangesturerecognizer_win.cpp
new file mode 100644
index 0000000..12d3058
--- /dev/null
+++ b/src/gui/kernel/qwinnativepangesturerecognizer_win.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "private/qwinnativepangesturerecognizer_win_p.h"
+
+#include "qevent.h"
+#include "qgraphicsitem.h"
+#include "qgesture.h"
+
+#include "private/qgesture_p.h"
+#include "private/qevent_p.h"
+#include "private/qapplication_p.h"
+#include "private/qwidget_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QWinNativePanGestureRecognizer::QWinNativePanGestureRecognizer()
+{
+}
+
+QGesture* QWinNativePanGestureRecognizer::createGesture(QObject *target) const
+{
+ if (!target)
+ return new QPanGesture; // a special case
+ if (qobject_cast<QGraphicsObject*>(target))
+ return 0;
+ if (!target->isWidgetType())
+ return 0;
+
+ QWidget *q = static_cast<QWidget*>(target);
+ QWidgetPrivate *d = q->d_func();
+ d->nativeGesturePanEnabled = true;
+ d->winSetupGestures();
+
+ return new QPanGesture;
+}
+
+QGestureRecognizer::Result QWinNativePanGestureRecognizer::filterEvent(QGesture *state, QObject *, QEvent *event)
+{
+ QPanGesture *q = static_cast<QPanGesture*>(state);
+ QPanGesturePrivate *d = q->d_func();
+
+ QGestureRecognizer::Result result = QGestureRecognizer::Ignore;
+ if (event->type() == QEvent::NativeGesture) {
+ QNativeGestureEvent *ev = static_cast<QNativeGestureEvent*>(event);
+ switch(ev->gestureType) {
+ case QNativeGestureEvent::GestureBegin:
+ break;
+ case QNativeGestureEvent::Pan:
+ result = QGestureRecognizer::GestureTriggered;
+ event->accept();
+ break;
+ case QNativeGestureEvent::GestureEnd:
+ if (q->state() == Qt::NoGesture)
+ return QGestureRecognizer::Ignore; // some other gesture has ended
+ result = QGestureRecognizer::GestureFinished;
+ break;
+ default:
+ return QGestureRecognizer::Ignore;
+ }
+ if (q->state() == Qt::NoGesture) {
+ d->lastOffset = d->totalOffset = d->offset = QPointF();
+ } else {
+ d->lastOffset = d->offset;
+ d->offset = QPointF(ev->position.x() - d->lastPosition.x(),
+ ev->position.y() - d->lastPosition.y());
+ d->totalOffset += d->offset;
+ }
+ d->lastPosition = ev->position;
+ }
+ return result;
+}
+
+void QWinNativePanGestureRecognizer::reset(QGesture *state)
+{
+ QPanGesture *pan = static_cast<QPanGesture*>(state);
+ QPanGesturePrivate *d = pan->d_func();
+
+ d->totalOffset = d->lastOffset = d->offset = QPointF();
+ d->lastPosition = QPoint();
+ d->acceleration = 0;
+
+ QGestureRecognizer::reset(state);
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h b/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h
new file mode 100644
index 0000000..a1e8511
--- /dev/null
+++ b/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINNATIVEPANGESTURERECOGNIZER_WIN_P_H
+#define QWINNATIVEPANGESTURERECOGNIZER_WIN_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QGestureRecognizer>
+
+QT_BEGIN_NAMESPACE
+
+class QWinNativePanGestureRecognizer : public QGestureRecognizer
+{
+public:
+ QWinNativePanGestureRecognizer();
+
+ QGesture* createGesture(QObject *target) const;
+
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+};
+
+QT_END_NAMESPACE
+
+#endif // QWINNATIVEPANGESTURERECOGNIZER_WIN_P_H
diff --git a/src/gui/kernel/symbian.pri b/src/gui/kernel/symbian.pri
index 5497ccb..69422dd 100644
--- a/src/gui/kernel/symbian.pri
+++ b/src/gui/kernel/symbian.pri
@@ -1,4 +1,7 @@
symbian {
contains(QT_CONFIG, s60): LIBS+= $$QMAKE_LIBS_S60
RESOURCES += symbian/symbianresources.qrc
+
+ HEADERS += symbian/qsymbianevent.h
+ SOURCES += symbian/qsymbianevent.cpp
}
diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp
index 7c07df8..3cd1402 100644
--- a/src/gui/painting/qbackingstore.cpp
+++ b/src/gui/painting/qbackingstore.cpp
@@ -56,6 +56,7 @@
#include <private/qwindowsurface_raster_p.h>
#include <private/qapplication_p.h>
#include <private/qpaintengine_raster_p.h>
+#include <private/qgraphicseffect_p.h>
#include "qgraphicssystem_p.h"
@@ -540,6 +541,8 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up
Q_ASSERT(widget->window() == tlw);
Q_ASSERT(!rgn.isEmpty());
+ widget->d_func()->invalidateGraphicsEffectsRecursively();
+
if (widget->d_func()->paintOnScreen()) {
if (widget->d_func()->dirty.isEmpty()) {
widget->d_func()->dirty = rgn;
@@ -615,6 +618,8 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd
Q_ASSERT(widget->window() == tlw);
Q_ASSERT(!rect.isEmpty());
+ widget->d_func()->invalidateGraphicsEffectsRecursively();
+
if (widget->d_func()->paintOnScreen()) {
if (widget->d_func()->dirty.isEmpty()) {
widget->d_func()->dirty = QRegion(rect);
diff --git a/src/gui/painting/qbackingstore_p.h b/src/gui/painting/qbackingstore_p.h
index 94d756e..3288dae 100644
--- a/src/gui/painting/qbackingstore_p.h
+++ b/src/gui/painting/qbackingstore_p.h
@@ -97,6 +97,12 @@ public:
);
}
+ // ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
+ void markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately = false,
+ bool invalidateBuffer = false);
+ void markDirty(const QRect &rect, QWidget *widget, bool updateImmediately = false,
+ bool invalidateBuffer = false);
+
private:
QWidget *tlw;
QRegion dirtyOnScreen; // needsFlush
@@ -126,11 +132,6 @@ private:
QRegion dirtyRegion(QWidget *widget = 0) const;
QRegion staticContents(QWidget *widget = 0, const QRect &withinClipRect = QRect()) const;
- // ### Qt 4.6: Merge into a template function (after MSVC isn't supported anymore).
- void markDirty(const QRegion &rgn, QWidget *widget, bool updateImmediately = false,
- bool invalidateBuffer = false);
- void markDirty(const QRect &rect, QWidget *widget, bool updateImmediately = false,
- bool invalidateBuffer = false);
void markDirtyOnScreen(const QRegion &dirtyOnScreen, QWidget *widget, const QPoint &topLevelOffset);
void removeDirtyWidget(QWidget *w);
diff --git a/src/gui/painting/qblendfunctions.cpp b/src/gui/painting/qblendfunctions.cpp
index 89adaf5..f8dd424 100644
--- a/src/gui/painting/qblendfunctions.cpp
+++ b/src/gui/painting/qblendfunctions.cpp
@@ -374,9 +374,9 @@ template <typename T> void qt_blend_argb24_on_rgb16(uchar *destPixels, int dbpl,
const uchar *src = srcPixels + y * sbpl;
const uchar *srcEnd = src + srcOffset;
while (src < srcEnd) {
-#if defined(QT_ARCH_ARM) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_))
+#if defined(QT_ARCH_ARM) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_)) || (defined(QT_ARCH_SPARC) && defined(Q_CC_GNU))
// non-16-bit aligned memory access is not possible on PowerPC,
- // ARM <v6 (QT_ARCH_ARMV6) & SH & AVR32
+ // ARM <v6 (QT_ARCH_ARMV6) & SH & AVR32 & SPARC w/GCC
quint16 spix = (quint16(src[2])<<8) + src[1];
#else
quint16 spix = *(quint16 *) (src + 1);
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp
index d9b824b..4da993b 100644
--- a/src/gui/painting/qcolor.cpp
+++ b/src/gui/painting/qcolor.cpp
@@ -176,22 +176,25 @@ QT_BEGIN_NAMESPACE
\section1 Predefined Colors
- There are 20 predefined QColors: Qt::white, Qt::black,
- Qt::red, Qt::darkRed, Qt::green, Qt::darkGreen, Qt::blue,
- Qt::darkBlue, Qt::cyan, Qt::darkCyan, Qt::magenta,
- Qt::darkMagenta, Qt::yellow, Qt::darkYellow, Qt::gray,
- Qt::darkGray, Qt::lightGray, Qt::color0, Qt::color1, and
- Qt::transparent.
+ There are 20 predefined QColors described by the Qt::GlobalColor enum,
+ including black, white, primary and secondary colors, darker versions
+ of these colors and three shades of gray. QColor also recognizes a
+ variety of color names; the static colorNames() function returns a
+ QStringList color names that QColor knows about.
\img qt-colors.png Qt Colors
- QColor provides the static colorNames() function which returns a
- QStringList containing the color names Qt knows about.
+ Additionally, the Qt::color0, Qt::color1 and Qt::transparent colors
+ are used for special purposes.
- The colors Qt::color0 (zero pixel value) and Qt::color1 (non-zero
- pixel value) are special colors for drawing in QBitmaps. Painting with
- Qt::color0 sets the bitmap bits to 0 (transparent, i.e. background), and
- painting with Qt::color1 sets the bits to 1 (opaque, i.e. foreground).
+ Qt::color0 (zero pixel value) and Qt::color1 (non-zero pixel value)
+ are special colors for drawing in QBitmaps. Painting with Qt::color0
+ sets the bitmap bits to 0 (transparent; i.e., background), and painting
+ with Qt::color1 sets the bits to 1 (opaque; i.e., foreground).
+
+ Qt::transparent is used to indicate a transparent pixel. When painting
+ with this value, a pixel value will be used that is appropriate for the
+ underlying pixel format in use.
\section1 The HSV Color Model
diff --git a/src/gui/painting/qpaintdevice.cpp b/src/gui/painting/qpaintdevice.cpp
index 95c0b44..6114938 100644
--- a/src/gui/painting/qpaintdevice.cpp
+++ b/src/gui/painting/qpaintdevice.cpp
@@ -65,4 +65,9 @@ int QPaintDevice::metric(PaintDeviceMetric) const
return 0;
}
+Q_GUI_EXPORT int qt_paint_device_metric(const QPaintDevice *device, QPaintDevice::PaintDeviceMetric metric)
+{
+ return device->metric(metric);
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/painting/qpaintdevice.h b/src/gui/painting/qpaintdevice.h
index 92aa3cb..c8e86b8 100644
--- a/src/gui/painting/qpaintdevice.h
+++ b/src/gui/painting/qpaintdevice.h
@@ -137,6 +137,7 @@ public:
friend class QPainter;
friend class QFontEngineMac;
friend class QX11PaintEngine;
+ friend Q_GUI_EXPORT int qt_paint_device_metric(const QPaintDevice *device, PaintDeviceMetric metric);
};
#ifdef QT3_SUPPORT
diff --git a/src/gui/painting/qpaintengine.h b/src/gui/painting/qpaintengine.h
index 5b82e7b..bf4b4ea 100644
--- a/src/gui/painting/qpaintengine.h
+++ b/src/gui/painting/qpaintengine.h
@@ -278,6 +278,7 @@ private:
friend class QWin32PaintEnginePrivate;
friend class QMacCGContext;
friend class QPreviewPaintEngine;
+ friend class QX11GLPixmapData;
};
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 6037bd5..fd0e810 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -132,6 +132,10 @@ static const qreal aliasedCoordinateDelta = 0.5 - 0.015625;
extern bool qt_cleartype_enabled;
#endif
+#ifdef Q_WS_MAC
+extern bool qt_applefontsmoothing_enabled;
+#endif
+
/********************************************************************************
* Span functions
@@ -508,7 +512,7 @@ bool QRasterPaintEngine::begin(QPaintDevice *device)
#if defined(Q_WS_WIN)
else if (qt_cleartype_enabled)
#elif defined (Q_WS_MAC)
- else if (true)
+ else if (qt_applefontsmoothing_enabled)
#else
else if (false)
#endif
@@ -2376,6 +2380,7 @@ void QRasterPaintEngine::drawPixmap(const QPointF &pos, const QPixmap &pixmap)
Q_D(QRasterPaintEngine);
QRasterPaintEngineState *s = state();
if (s->matrix.type() <= QTransform::TxTranslate) {
+ ensurePen();
drawBitmap(pos + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
} else {
drawImage(pos, d->rasterBuffer->colorizeBitmap(image, s->pen.color()));
@@ -2389,6 +2394,7 @@ void QRasterPaintEngine::drawPixmap(const QPointF &pos, const QPixmap &pixmap)
Q_D(QRasterPaintEngine);
QRasterPaintEngineState *s = state();
if (s->matrix.type() <= QTransform::TxTranslate) {
+ ensurePen();
drawBitmap(pos + QPointF(s->matrix.dx(), s->matrix.dy()), image, &s->penData);
} else {
drawImage(pos, d->rasterBuffer->colorizeBitmap(image, s->pen.color()));
@@ -4213,13 +4219,6 @@ void QRasterBuffer::prepare(QCustomRasterPaintDevice *device)
drawHelper = qDrawHelper + format;
}
-class MetricAccessor : public QWidget {
-public:
- int metric(PaintDeviceMetric m) {
- return QWidget::metric(m);
- }
-};
-
int QCustomRasterPaintDevice::metric(PaintDeviceMetric m) const
{
switch (m) {
@@ -4231,7 +4230,7 @@ int QCustomRasterPaintDevice::metric(PaintDeviceMetric m) const
break;
}
- return (static_cast<MetricAccessor*>(widget)->metric(m));
+ return qt_paint_device_metric(widget, m);
}
int QCustomRasterPaintDevice::bytesPerLine() const
diff --git a/src/gui/painting/qpaintengine_s60.cpp b/src/gui/painting/qpaintengine_s60.cpp
index e17dba1..6f4f398 100644
--- a/src/gui/painting/qpaintengine_s60.cpp
+++ b/src/gui/painting/qpaintengine_s60.cpp
@@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE
class QS60PaintEnginePrivate : public QRasterPaintEnginePrivate
{
public:
- QS60PaintEnginePrivate(QS60PaintEngine *engine) { }
+ QS60PaintEnginePrivate(QS60PaintEngine *engine) { Q_UNUSED(engine); }
};
QS60PaintEngine::QS60PaintEngine(QPaintDevice *device, QS60PixmapData *data)
diff --git a/src/gui/painting/qpaintengineex_p.h b/src/gui/painting/qpaintengineex_p.h
index 81ed06b..3ec9bd6 100644
--- a/src/gui/painting/qpaintengineex_p.h
+++ b/src/gui/painting/qpaintengineex_p.h
@@ -54,6 +54,7 @@
//
#include <QtGui/qpaintengine.h>
+#include <QtGui/qdrawutil.h>
#include <private/qpaintengine_p.h>
#include <private/qstroker_p.h>
@@ -71,12 +72,6 @@ class QPainterState;
class QPaintEngineExPrivate;
struct StrokeHandler;
-namespace QDrawPixmaps
-{
- struct Data;
- enum DrawingHint;
-}
-
struct QIntRect {
int x1, y1, x2, y2;
inline void set(const QRect &r) {
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index f271af9..cddad7d 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -1608,9 +1608,21 @@ void QPainter::restore()
\warning A paint device can only be painted by one painter at a
time.
+ \warning Painting on a QImage with the format
+ QImage::Format_Indexed8 is not supported.
+
\sa end(), QPainter()
*/
+static inline void qt_cleanup_painter_state(QPainterPrivate *d)
+{
+ d->states.clear();
+ delete d->state;
+ d->state = 0;
+ d->engine = 0;
+ d->device = 0;
+}
+
bool QPainter::begin(QPaintDevice *pd)
{
Q_ASSERT(pd);
@@ -1656,15 +1668,21 @@ bool QPainter::begin(QPaintDevice *pd)
printf("QPainter::begin(), device=%p, type=%d\n", pd, pd->devType());
#endif
-
- d->device = pd;
if (pd->devType() == QInternal::Pixmap)
static_cast<QPixmap *>(pd)->detach();
else if (pd->devType() == QInternal::Image)
static_cast<QImage *>(pd)->detach();
d->engine = pd->paintEngine();
- d->extended = d->engine && d->engine->isExtended() ? static_cast<QPaintEngineEx *>(d->engine) : 0;
+
+ if (!d->engine) {
+ qWarning("QPainter::begin: Paint device returned engine == 0, type: %d", pd->devType());
+ return false;
+ }
+
+ d->device = pd;
+
+ d->extended = d->engine->isExtended() ? static_cast<QPaintEngineEx *>(d->engine) : 0;
if (d->emulationEngine)
d->emulationEngine->real_engine = d->extended;
@@ -1677,11 +1695,6 @@ bool QPainter::begin(QPaintDevice *pd)
d->state->redirectionMatrix.translate(-redirectionOffset.x(), -redirectionOffset.y());
d->state->brushOrigin = QPointF();
- if (!d->engine) {
- qWarning("QPainter::begin: Paint device returned engine == 0, type: %d", pd->devType());
- return false;
- }
-
// Slip a painter state into the engine before we do any other operations
if (d->extended)
d->extended->setState(d->state);
@@ -1700,8 +1713,7 @@ bool QPainter::begin(QPaintDevice *pd)
&& !paintOutsidePaintEvent && !inPaintEvent) {
qWarning("QPainter::begin: Widget painting can only begin as a "
"result of a paintEvent");
- d->engine = 0;
- d->device = 0;
+ qt_cleanup_painter_state(d);
return false;
}
@@ -1719,8 +1731,7 @@ bool QPainter::begin(QPaintDevice *pd)
Q_ASSERT(pm);
if (pm->isNull()) {
qWarning("QPainter::begin: Cannot paint on a null pixmap");
- d->engine = 0;
- d->device = 0;
+ qt_cleanup_painter_state(d);
return false;
}
@@ -1736,8 +1747,12 @@ bool QPainter::begin(QPaintDevice *pd)
Q_ASSERT(img);
if (img->isNull()) {
qWarning("QPainter::begin: Cannot paint on a null image");
- d->engine = 0;
- d->device = 0;
+ qt_cleanup_painter_state(d);
+ return false;
+ } else if (img->format() == QImage::Format_Indexed8) {
+ // Painting on indexed8 images is not supported.
+ qWarning("QPainter::begin: Cannot paint on an image with the QImage::Format_Indexed8 format");
+ qt_cleanup_painter_state(d);
return false;
}
if (img->depth() == 1) {
@@ -1760,12 +1775,8 @@ bool QPainter::begin(QPaintDevice *pd)
if (d->engine->isActive()) {
end();
} else {
- d->states.clear();
- delete d->state;
- d->state = 0;
+ qt_cleanup_painter_state(d);
}
- d->engine = 0;
- d->device = 0;
return false;
} else {
d->engine->setActive(begun);
@@ -1828,10 +1839,7 @@ bool QPainter::end()
if (!d->engine) {
qWarning("QPainter::end: Painter not active, aborted");
- d->states.clear();
- delete d->state;
- d->state = 0;
- d->device = 0;
+ qt_cleanup_painter_state(d);
return false;
}
@@ -1862,8 +1870,6 @@ bool QPainter::end()
delete d->engine;
}
- d->engine = 0;
-
if (d->emulationEngine) {
delete d->emulationEngine;
d->emulationEngine = 0;
@@ -1873,11 +1879,8 @@ bool QPainter::end()
d->extended = 0;
}
- d->states.clear();
- delete d->state;
- d->state = 0;
+ qt_cleanup_painter_state(d);
- d->device = 0;
return ended;
}
@@ -2051,8 +2054,7 @@ QPoint QPainter::brushOrigin() const
Sets the brush origin to \a position.
The brush origin specifies the (0, 0) coordinate of the painter's
- brush. This setting only applies to pattern brushes and pixmap
- brushes.
+ brush.
Note that while the brushOrigin() was necessary to adopt the
parent's background for a widget in Qt 3, this is no longer the
diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp
index 66d0c9d..b602690 100644
--- a/src/gui/painting/qrasterizer.cpp
+++ b/src/gui/painting/qrasterizer.cpp
@@ -310,7 +310,7 @@ struct QBoolToType
template <typename T>
void qScanConvert(QScanConverter &d, T allVertical)
{
- qSort(d.m_lines.data(), d.m_lines.data() + d.m_lines.size(), topOrder);
+ qSort(d.m_lines.data(), d.m_lines.data() + d.m_lines.size(), QT_PREPEND_NAMESPACE(topOrder));
int line = 0;
for (int y = d.m_lines.first().top; y <= d.m_bottom; ++y) {
for (; line < d.m_lines.size() && d.m_lines.at(line).top == y; ++line) {
@@ -319,7 +319,7 @@ void qScanConvert(QScanConverter &d, T allVertical)
QScanConverter::Line *l = &d.m_lines.at(line);
d.m_active.resize(d.m_active.size() + 1);
int j;
- for (j = d.m_active.size() - 2; j >= 0 && xOrder(l, d.m_active.at(j)); --j)
+ for (j = d.m_active.size() - 2; j >= 0 && QT_PREPEND_NAMESPACE(xOrder)(l, d.m_active.at(j)); --j)
d.m_active.at(j+1) = d.m_active.at(j);
d.m_active.at(j+1) = l;
} else {
@@ -334,7 +334,7 @@ void qScanConvert(QScanConverter &d, T allVertical)
for (int i = 1; i < numActive; ++i) {
QScanConverter::Line *l = d.m_active.at(i);
int j;
- for (j = i-1; j >= 0 && xOrder(l, d.m_active.at(j)); --j)
+ for (j = i-1; j >= 0 && QT_PREPEND_NAMESPACE(xOrder)(l, d.m_active.at(j)); --j)
d.m_active.at(j+1) = d.m_active.at(j);
d.m_active.at(j+1) = l;
}
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index 9063945..c57b3c1 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -969,13 +969,31 @@ QPointF qt_curves_for_arc(const QRectF &rect, qreal startAngle, qreal sweepLengt
}
+static inline void qdashstroker_moveTo(qfixed x, qfixed y, void *data) {
+ ((QStroker *) data)->moveTo(x, y);
+}
+
+static inline void qdashstroker_lineTo(qfixed x, qfixed y, void *data) {
+ ((QStroker *) data)->lineTo(x, y);
+}
+
+static inline void qdashstroker_cubicTo(qfixed, qfixed, qfixed, qfixed, qfixed, qfixed, void *) {
+ Q_ASSERT(0);
+// ((QStroker *) data)->cubicTo(c1x, c1y, c2x, c2y, ex, ey);
+}
+
+
/*******************************************************************************
* QDashStroker members
*/
QDashStroker::QDashStroker(QStroker *stroker)
- : m_stroker(stroker), m_dashOffset(0)
+ : m_stroker(stroker), m_dashOffset(0), m_stroke_width(1), m_miter_limit(1)
{
-
+ if (m_stroker) {
+ setMoveToHook(qdashstroker_moveTo);
+ setLineToHook(qdashstroker_lineTo);
+ setCubicToHook(qdashstroker_cubicTo);
+ }
}
QVector<qfixed> QDashStroker::patternForStyle(Qt::PenStyle style)
@@ -1012,10 +1030,16 @@ void QDashStroker::processCurrentSubpath()
int dashCount = qMin(m_dashPattern.size(), 32);
qfixed dashes[32];
+ if (m_stroker) {
+ m_customData = m_stroker;
+ m_stroke_width = m_stroker->strokeWidth();
+ m_miter_limit = m_stroker->miterLimit();
+ }
+
qreal longestLength = 0;
qreal sumLength = 0;
for (int i=0; i<dashCount; ++i) {
- dashes[i] = qMax(m_dashPattern.at(i), qreal(0)) * m_stroker->strokeWidth();
+ dashes[i] = qMax(m_dashPattern.at(i), qreal(0)) * m_stroke_width;
sumLength += dashes[i];
if (dashes[i] > longestLength)
longestLength = dashes[i];
@@ -1031,7 +1055,7 @@ void QDashStroker::processCurrentSubpath()
int idash = 0; // Index to current dash
qreal pos = 0; // The position on the curve, 0 <= pos <= path.length
qreal elen = 0; // element length
- qreal doffset = m_dashOffset * m_stroker->strokeWidth();
+ qreal doffset = m_dashOffset * m_stroke_width;
// make sure doffset is in range [0..sumLength)
doffset -= qFloor(doffset / sumLength) * sumLength;
@@ -1056,7 +1080,7 @@ void QDashStroker::processCurrentSubpath()
qfixed2d line_to_pos;
// Pad to avoid clipping the borders of thick pens.
- qfixed padding = qt_real_to_fixed(qMax(m_stroker->strokeWidth(), m_stroker->miterLimit()) * longestLength);
+ qfixed padding = qt_real_to_fixed(qMax(m_stroke_width, m_miter_limit) * longestLength);
qfixed2d clip_tl = { qt_real_to_fixed(m_clip_rect.left()) - padding,
qt_real_to_fixed(m_clip_rect.top()) - padding };
qfixed2d clip_br = { qt_real_to_fixed(m_clip_rect.right()) + padding ,
@@ -1108,7 +1132,7 @@ void QDashStroker::processCurrentSubpath()
// continue the current dash, without starting a
// new subpath.
if (!has_offset || !hasMoveTo) {
- m_stroker->moveTo(move_to_pos.x, move_to_pos.y);
+ emitMoveTo(move_to_pos.x, move_to_pos.y);
hasMoveTo = true;
}
@@ -1120,7 +1144,7 @@ void QDashStroker::processCurrentSubpath()
|| (line_to_pos.x > clip_tl.x && line_to_pos.x < clip_br.x
&& line_to_pos.y > clip_tl.y && line_to_pos.y < clip_br.y))
{
- m_stroker->lineTo(line_to_pos.x, line_to_pos.y);
+ emitLineTo(line_to_pos.x, line_to_pos.y);
}
} else {
move_to_pos.x = qt_real_to_fixed(p2.x());
@@ -1134,6 +1158,7 @@ void QDashStroker::processCurrentSubpath()
estart = estop;
prev = e;
}
+
}
QT_END_NAMESPACE
diff --git a/src/gui/painting/qstroker_p.h b/src/gui/painting/qstroker_p.h
index d33eeb4..a10ebd9 100644
--- a/src/gui/painting/qstroker_p.h
+++ b/src/gui/painting/qstroker_p.h
@@ -171,7 +171,6 @@ protected:
QRectF m_clip_rect;
-private:
void *m_customData;
qStrokerMoveToHook m_moveTo;
qStrokerLineToHook m_lineTo;
@@ -258,12 +257,18 @@ public:
virtual void begin(void *data);
virtual void end();
+ inline void setStrokeWidth(qreal width) { m_stroke_width = width; }
+ inline void setMiterLimit(qreal limit) { m_miter_limit = limit; }
+
protected:
virtual void processCurrentSubpath();
QStroker *m_stroker;
QVector<qfixed> m_dashPattern;
qreal m_dashOffset;
+
+ qreal m_stroke_width;
+ qreal m_miter_limit;
};
@@ -361,16 +366,16 @@ inline void QStroker::emitCubicTo(qfixed c1x, qfixed c1y,
*/
inline void QDashStroker::begin(void *data)
{
- Q_ASSERT(m_stroker);
- m_stroker->begin(data);
+ if (m_stroker)
+ m_stroker->begin(data);
QStrokerOps::begin(data);
}
inline void QDashStroker::end()
{
- Q_ASSERT(m_stroker);
QStrokerOps::end();
- m_stroker->end();
+ if (m_stroker)
+ m_stroker->end();
}
QT_END_NAMESPACE
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index 25b6aba..a192e87 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -229,8 +229,8 @@ void QImageTextureGlyphCache::createTextureData(int width, int height)
int QImageTextureGlyphCache::glyphMargin() const
{
-#ifdef Q_WS_MAC
- return 2;
+#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
+ return 0;
#else
return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0;
#endif
diff --git a/src/gui/s60framework/qs60mainapplication.cpp b/src/gui/s60framework/qs60mainapplication.cpp
index 2973c97..82e7743 100644
--- a/src/gui/s60framework/qs60mainapplication.cpp
+++ b/src/gui/s60framework/qs60mainapplication.cpp
@@ -60,27 +60,32 @@ CApaApplication *newS60Application()
_LIT(KQtWrapperResourceFile, "\\resource\\apps\\s60main.rsc");
/*!
- * \class QS60MainApplication
- * \obsolete
- * \since 4.6
- * \brief The QS60MainApplication class provides support for migration from S60.
- *
- * The QS60MainApplication provides a helper class for use in migrating from existing S60 based
- * applications to Qt based applications. It is used in the exact same way as the
- * \c CAknApplication class from Symbian, but internally provides extensions used by Qt.
- *
- * When modifying old S60 applications that rely on implementing functions in \c CAknApplication,
- * the class should be modified to inherit from this class instead of \c CAknApplication. Then the
- * application can choose to override only certain functions. To make Qt use the custom application
- * objects, pass a factory function to
- * QApplication::QApplication(QApplication::QS60MainApplicationFactory, int &, char **).
- *
- * For more information on \c CAknApplication, please see the S60 documentation.
- *
- * Unlike other Qt classes, QS60MainApplication behaves like an S60 class, and can throw Symbian
- * leaves.
- *
- * \sa QS60MainDocument, QS60MainAppUi, QApplication::QS60MainApplicationFactory
+ \class QS60MainApplication
+ \since 4.6
+ \brief The QS60MainApplication class provides support for migration from S60.
+
+ \warning This class is provided only to get access to S60 specific
+ functionality in the application framework classes. It is not
+ portable. We strongly recommend against using it in new applications.
+
+ The QS60MainApplication provides a helper class for use in migrating
+ from existing S60 based applications to Qt based applications. It is
+ used in the exact same way as the \c CAknApplication class from
+ Symbian, but internally provides extensions used by Qt.
+
+ When modifying old S60 applications that rely on implementing
+ functions in \c CAknApplication, the class should be modified to
+ inherit from this class instead of \c CAknApplication. Then the
+ application can choose to override only certain functions. To make
+ Qt use the custom application objects, pass a factory function to
+ \c{QApplication::QApplication(QApplication::QS60MainApplicationFactory, int &, char **)}.
+
+ For more information on \c CAknApplication, please see the S60 documentation.
+
+ Unlike other Qt classes, QS60MainApplication behaves like an S60 class, and can throw Symbian
+ leaves.
+
+ \sa QS60MainDocument, QS60MainAppUi, QApplication::QS60MainApplicationFactory
*/
/*!
diff --git a/src/gui/s60framework/qs60mainappui.cpp b/src/gui/s60framework/qs60mainappui.cpp
index d8181f8..4ad78f9 100644
--- a/src/gui/s60framework/qs60mainappui.cpp
+++ b/src/gui/s60framework/qs60mainappui.cpp
@@ -50,6 +50,7 @@
#include "qs60mainappui.h"
#include <QtGui/qapplication.h>
+#include <QtGui/qsymbianevent.h>
#include <QtGui/qmenu.h>
#include <private/qmenu_p.h>
#include <private/qt_s60_p.h>
@@ -58,25 +59,31 @@
QT_BEGIN_NAMESPACE
/*!
- * \class QS60MainAppUi
- * \obsolete
- * \since 4.6
- * \brief Helper class for S60 migration
- *
- * The QS60MainAppUi provides a helper class for use in migrating from existing S60 based
- * applications to Qt based applications. It is used in the exact same way as the
- * \c CAknAppUi class from Symbian, but internally provides extensions used by Qt.
- *
- * When modifying old S60 applications that rely on implementing functions in \c CAknAppUi,
- * the class should be modified to inherit from this class instead of \c CAknAppUi. Then the
- * application can choose to override only certain functions.
- *
- * For more information on \c CAknAppUi, please see the S60 documentation.
- *
- * Unlike other Qt classes, QS60MainAppUi behaves like an S60 class, and can throw Symbian
- * leaves.
- *
- * \sa QS60MainDocument, QS60MainApplication
+ \class QS60MainAppUi
+ \since 4.6
+ \brief The QS60MainAppUi class is a helper class for S60 migration.
+
+ \warning This class is provided only to get access to S60 specific
+ functionality in the application framework classes. It is not
+ portable. We strongly recommend against using it in new applications.
+
+ The QS60MainAppUi provides a helper class for use in migrating from
+ existing S60 based applications to Qt based applications. It is used
+ in the exact same way as the \c CAknAppUi class from Symbian, but
+ internally provides extensions used by Qt.
+
+ When modifying old S60 applications that rely on implementing
+ functions in \c CAknAppUi, the class should be modified to inherit
+ from this class instead of \c CAknAppUi. Then the application can
+ choose to override only certain functions.
+
+ For more information on \c CAknAppUi, please see the S60
+ documentation.
+
+ Unlike other Qt classes, QS60MainAppUi behaves like an S60 class,
+ and can throw Symbian leaves.
+
+ \sa QS60MainDocument, QS60MainApplication
*/
/*!
@@ -128,8 +135,10 @@ QS60MainAppUi::~QS60MainAppUi()
*/
void QS60MainAppUi::HandleCommandL(TInt command)
{
- if (qApp)
- QT_TRYCATCH_LEAVING(qApp->symbianHandleCommand(command));
+ if (qApp) {
+ QSymbianEvent event(QSymbianEvent::CommandEvent, command);
+ QT_TRYCATCH_LEAVING(qApp->symbianProcessEvent(&event));
+ }
}
/*!
@@ -145,8 +154,10 @@ void QS60MainAppUi::HandleResourceChangeL(TInt type)
{
CAknAppUi::HandleResourceChangeL(type);
- if (qApp)
- QT_TRYCATCH_LEAVING(qApp->symbianResourceChange(type));
+ if (qApp) {
+ QSymbianEvent event(QSymbianEvent::ResourceChangeEvent, type);
+ QT_TRYCATCH_LEAVING(qApp->symbianProcessEvent(&event));
+ }
}
/*!
@@ -158,16 +169,18 @@ void QS60MainAppUi::HandleResourceChangeL(TInt type)
* If you override this function, you should call the base class implementation if you do not
* handle the event.
*/
-void QS60MainAppUi::HandleWsEventL(const TWsEvent& event, CCoeControl *destination)
+void QS60MainAppUi::HandleWsEventL(const TWsEvent& wsEvent, CCoeControl *destination)
{
int result = 0;
- if (qApp)
+ if (qApp) {
+ QSymbianEvent event(&wsEvent);
QT_TRYCATCH_LEAVING(
- result = qApp->s60ProcessEvent(const_cast<TWsEvent*>(&event))
+ result = qApp->symbianProcessEvent(&event)
);
+ }
if (result <= 0)
- CAknAppUi::HandleWsEventL(event, destination);
+ CAknAppUi::HandleWsEventL(wsEvent, destination);
}
diff --git a/src/gui/s60framework/qs60maindocument.cpp b/src/gui/s60framework/qs60maindocument.cpp
index 52595db..7405784 100644
--- a/src/gui/s60framework/qs60maindocument.cpp
+++ b/src/gui/s60framework/qs60maindocument.cpp
@@ -47,25 +47,31 @@
QT_BEGIN_NAMESPACE
/*!
- * \class QS60MainDocument
- * \obsolete
- * \since 4.6
- * \brief Helper class for S60 migration
- *
- * The QS60MainDocument provides a helper class for use in migrating from existing S60 based
- * applications to Qt based applications. It is used in the exact same way as the
- * \c CAknDocument class from Symbian, but internally provides extensions used by Qt.
- *
- * When modifying old S60 applications that rely on implementing functions in \c CAknDocument,
- * the class should be modified to inherit from this class instead of \c CAknDocument. Then the
- * application can choose to override only certain functions.
- *
- * For more information on \c CAknDocument, please see the S60 documentation.
- *
- * Unlike other Qt classes, QS60MainDocument behaves like an S60 class, and can throw Symbian
- * leaves.
- *
- * \sa QS60MainApplication, QS60MainAppUi
+ \class QS60MainDocument
+ \since 4.6
+ \brief The QS60MainDocument class is a helper class for S60 migration.
+
+ \warning This class is provided only to get access to S60 specific
+ functionality in the application framework classes. It is not
+ portable. We strongly recommend against using it in new applications.
+
+ The QS60MainDocument provides a helper class for use in migrating
+ from existing S60 based applications to Qt based applications. It is
+ used in the exact same way as the \c CAknDocument class from
+ Symbian, but internally provides extensions used by Qt.
+
+ When modifying old S60 applications that rely on implementing
+ functions in \c CAknDocument, the class should be modified to
+ inherit from this class instead of \c CAknDocument. Then the
+ application can choose to override only certain functions.
+
+ For more information on \c CAknDocument, please see the S60
+ documentation.
+
+ Unlike other Qt classes, QS60MainDocument behaves like an S60 class,
+ and can throw Symbian leaves.
+
+ \sa QS60MainApplication, QS60MainAppUi
*/
/*!
diff --git a/src/gui/styles/gtksymbols.cpp b/src/gui/styles/gtksymbols.cpp
index d62f717..6ec5796 100644
--- a/src/gui/styles/gtksymbols.cpp
+++ b/src/gui/styles/gtksymbols.cpp
@@ -984,15 +984,18 @@ QIcon QGtk::getFilesystemIcon(const QFileInfo &info)
if (QGtk::gnome_vfs_init && QGtk::gnome_icon_lookup_sync) {
QGtk::gnome_vfs_init();
GtkIconTheme *theme = QGtk::gtk_icon_theme_get_default();
- QString fileurl = QUrl::fromLocalFile(info.absoluteFilePath()).toEncoded();
+ QByteArray fileurl = QUrl::fromLocalFile(info.absoluteFilePath()).toEncoded();
char * icon_name = QGtk::gnome_icon_lookup_sync(theme,
NULL,
- qPrintable(fileurl),
+ fileurl.data(),
NULL,
GNOME_ICON_LOOKUP_FLAGS_NONE,
NULL);
- return QIcon::fromTheme(icon_name);
+ QString iconName = QString::fromUtf8(icon_name);
g_free(icon_name);
+ if (iconName.startsWith(QLatin1Char('/')))
+ return QIcon(iconName);
+ return QIcon::fromTheme(iconName);
}
return icon;
}
diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 4fa1d03..4c6bc46 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -1313,7 +1313,7 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
painter->save();
painter->setClipRect(voptAdj.rect);
- const bool isSelected = (voptAdj.state & QStyle::State_HasFocus);
+ const bool isSelected = (vopt->state & QStyle::State_Selected);
bool isVisible = false;
int scrollBarWidth = 0;
@@ -1358,7 +1358,27 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
// draw the focus rect
if (isSelected) {
- const QRect highlightRect = option->rect.adjusted(1,1,-1,-1);
+ QRect highlightRect = option->rect.adjusted(1,1,-1,-1);
+ const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget);
+ if (view && view->selectionBehavior() != QAbstractItemView::SelectItems) {
+ // set highlight rect so that it is continuous from cell to cell, yet sligthly
+ // smaller than cell rect
+ int xBeginning = 0, yBeginning = 0, xEnd = 0, yEnd = 0;
+ if (view->selectionBehavior() == QAbstractItemView::SelectRows) {
+ yBeginning = 1; yEnd = -1;
+ if (vopt->viewItemPosition == QStyleOptionViewItemV4::Beginning)
+ xBeginning = 1;
+ else if (vopt->viewItemPosition == QStyleOptionViewItemV4::End)
+ xEnd = -1;
+ } else if (view->selectionBehavior() == QAbstractItemView::SelectColumns) {
+ xBeginning = 1; xEnd = -1;
+ if (vopt->viewItemPosition == QStyleOptionViewItemV4::Beginning)
+ yBeginning = 1;
+ else if (vopt->viewItemPosition == QStyleOptionViewItemV4::End)
+ yEnd = -1;
+ }
+ highlightRect = option->rect.adjusted(xBeginning, yBeginning, xEnd, xBeginning);
+ }
QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ListHighlight, painter, highlightRect, flags);
}
@@ -1824,8 +1844,8 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option,
//todo: update to horizontal table graphic
QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_TableHeaderItem, painter, option->rect, flags | QS60StylePrivate::SF_PointWest);
}
- } else if (qobject_cast<const QFrame *>(widget)) {
- QCommonStyle::drawControl(element, option, painter, widget);
+ } else if (qobject_cast<const QFrame *>(widget)) {
+ QCommonStyle::drawControl(element, option, painter, widget);
}
break;
case CE_MenuScroller:
@@ -2196,6 +2216,12 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt,
if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt))
sz += QSize(2*f->lineWidth, 4*f->lineWidth);
break;
+ case CT_TabBarTab:
+ QSize naviPaneSize = QS60StylePrivate::naviPaneSize();
+ sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget);
+ if (naviPaneSize.height() > sz.height())
+ sz.setHeight(naviPaneSize.height());
+ break;
default:
sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget);
break;
@@ -2405,8 +2431,8 @@ QRect QS60Style::subControlRect(ComplexControl control, const QStyleOptionComple
case SC_ComboBoxArrow:
ret.setRect(
ret.x() + ret.width() - buttonMargin - buttonWidth,
- ret.y() + buttonMargin,
- buttonWidth,
+ ret.y() + buttonMargin,
+ buttonWidth,
height - 2*buttonMargin);
break;
case SC_ComboBoxEditField: {
diff --git a/src/gui/styles/qs60style.h b/src/gui/styles/qs60style.h
index 6be3197..ab10792 100644
--- a/src/gui/styles/qs60style.h
+++ b/src/gui/styles/qs60style.h
@@ -101,7 +101,7 @@ protected Q_SLOTS:
private:
Q_DISABLE_COPY(QS60Style)
friend class QStyleFactory;
- friend class QApplication;
+ friend class QApplicationPrivate;
};
#endif // QT_NO_STYLE_S60
diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h
index 5422ff6..8e53eee 100644
--- a/src/gui/styles/qs60style_p.h
+++ b/src/gui/styles/qs60style_p.h
@@ -460,6 +460,8 @@ public:
void handleSkinChange();
#endif // Q_WS_S60
+ static QSize naviPaneSize();
+
private:
static void drawPart(QS60StyleEnums::SkinParts part, QPainter *painter,
const QRect &rect, SkinElementFlags flags = KDefaultSkinElementFlags);
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index cde48d8..9765066 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -61,6 +61,7 @@
#include <AknFontAccess.h>
#include <AknLayoutFont.h>
#include <aknutils.h>
+#include <aknnavi.h>
#if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
@@ -104,6 +105,7 @@ public:
static bool disabledPartGraphic(QS60StyleEnums::SkinParts &part);
static bool disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame);
static QPixmap generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
+ static QSize naviPaneSize();
private:
static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
@@ -747,9 +749,8 @@ QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(QS60StylePrivate::SkinFr
QPixmap result;
// QS60WindowSurface::unlockBitmapHeap();
- static const bool canDoEColor16MAP = !(QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || QSysInfo::s60Version() == QSysInfo::SV_S60_3_2);
- static const TDisplayMode displayMode = canDoEColor16MAP ? TDisplayMode(13) : EColor16MA; // 13 = EColor16MAP
- static const TInt drawParam = canDoEColor16MAP ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
+ static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
+ static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
CFbsBitmap *frame = new (ELeave) CFbsBitmap(); //offscreen
CleanupStack::PushL(frame);
@@ -776,7 +777,7 @@ QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(QS60StylePrivate::SkinFr
frameSkinID, centerSkinID,
drawParam );
- if (canDoEColor16MAP) {
+ if (S60->supportsPremultipliedAlpha) {
if (drawn)
result = fromFbsBitmap(frame, NULL, flags, QImage::Format_ARGB32_Premultiplied);
} else {
@@ -1389,6 +1390,24 @@ void QS60StylePrivate::handleSkinChange()
topLevelWidget->ensurePolished();
}
}
+
+QSize QS60StylePrivate::naviPaneSize()
+{
+ return QS60StyleModeSpecifics::naviPaneSize();
+}
+
+QSize QS60StyleModeSpecifics::naviPaneSize()
+{
+ CAknNavigationControlContainer* naviContainer;
+ if (S60->statusPane())
+ naviContainer = static_cast<CAknNavigationControlContainer*>
+ (S60->statusPane()->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+ if (naviContainer)
+ return QSize(naviContainer->Size().iWidth, naviContainer->Size().iHeight);
+ else
+ return QSize(0,0);
+}
+
#endif // Q_WS_S60
QT_END_NAMESPACE
diff --git a/src/gui/styles/qs60style_simulated.cpp b/src/gui/styles/qs60style_simulated.cpp
index 89a9158..8a2616d 100644
--- a/src/gui/styles/qs60style_simulated.cpp
+++ b/src/gui/styles/qs60style_simulated.cpp
@@ -326,6 +326,10 @@ QPixmap QS60StylePrivate::backgroundTexture()
return *m_background;
}
+QSize QS60StylePrivate::naviPaneSize()
+{
+ return QSize(0, 0);
+}
bool QS60StylePrivate::isTouchSupported()
{
diff --git a/src/gui/styles/qwindowsmobilestyle.cpp b/src/gui/styles/qwindowsmobilestyle.cpp
index d27b1ec..5fa6251 100644
--- a/src/gui/styles/qwindowsmobilestyle.cpp
+++ b/src/gui/styles/qwindowsmobilestyle.cpp
@@ -5592,8 +5592,43 @@ void QWindowsMobileStyle::drawControl(ControlElement element, const QStyleOption
painter->drawLine(rect.bottomLeft(), rect.bottomRight());
}
#endif // QT_NO_SCROLLAREA
- break; }
-
+ break;
+ }
+#ifndef QT_NO_COMBOBOX
+ case CE_ComboBoxLabel:
+ // This is copied from qcommonstyle.cpp with the difference, that
+ // the editRect isn't adjusted when calling drawItemText.
+ if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
+ QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
+ painter->save();
+ painter->setClipRect(editRect);
+ if (!cb->currentIcon.isNull()) {
+ QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
+ : QIcon::Disabled;
+ QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
+ QRect iconRect(editRect);
+ iconRect.setWidth(cb->iconSize.width() + 4);
+ iconRect = alignedRect(cb->direction,
+ Qt::AlignLeft | Qt::AlignVCenter,
+ iconRect.size(), editRect);
+ if (cb->editable)
+ painter->fillRect(iconRect, option->palette.brush(QPalette::Base));
+ proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);
+
+ if (cb->direction == Qt::RightToLeft)
+ editRect.translate(-4 - cb->iconSize.width(), 0);
+ else
+ editRect.translate(cb->iconSize.width() + 4, 0);
+ }
+ if (!cb->currentText.isEmpty() && !cb->editable) {
+ proxy()->drawItemText(painter, editRect,
+ visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
+ cb->palette, cb->state & State_Enabled, cb->currentText);
+ }
+ painter->restore();
+ }
+ break;
+#endif // QT_NO_COMBOBOX
#ifndef QT_NO_DOCKWIDGET
case CE_DockWidgetTitle:
if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
@@ -6003,7 +6038,7 @@ void QWindowsMobileStyle::drawComplexControl(ComplexControl control, const QStyl
}
painter->restore();
break;
-#endif // QT_NO_SLIDER
+#endif // QT_NO_SCROLLBAR
case CC_ToolButton:
if (const QStyleOptionToolButton *toolbutton
= qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
@@ -6154,24 +6189,24 @@ void QWindowsMobileStyle::drawComplexControl(ComplexControl control, const QStyl
qDrawPlainRect(painter, option->rect, option->palette.shadow().color(), proxy()->pixelMetric(PM_ComboBoxFrameWidth, option, widget), &editBrush);
else
painter->fillRect(option->rect, editBrush);
- State flags = State_None;
- QRect ar = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxArrow, widget);
- if ((option->state & State_On)) {
- painter->fillRect(ar.adjusted(0, 0, 1, 1),cmb->palette.brush(QPalette::Shadow));
- }
- if (d->doubleControls)
- ar.adjust(5, 0, 5, 0);
- else
- ar.adjust(2, 0, -2, 0);
- if (option->state & State_Enabled)
- flags |= State_Enabled;
- if (option->state & State_On)
- flags |= State_Sunken;
- QStyleOption arrowOpt(0);
- arrowOpt.rect = ar;
- arrowOpt.palette = cmb->palette;
- arrowOpt.state = flags;
- proxy()->drawPrimitive(PrimitiveElement(PE_IndicatorArrowDownBig), &arrowOpt, painter, widget);
+ State flags = State_None;
+ QRect ar = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxArrow, widget);
+ if ((option->state & State_On)) {
+ painter->fillRect(ar.adjusted(0, 0, 1, 1),cmb->palette.brush(QPalette::Shadow));
+ }
+ if (d->doubleControls)
+ ar.adjust(5, 0, 5, 0);
+ else
+ ar.adjust(2, 0, -2, 0);
+ if (option->state & State_Enabled)
+ flags |= State_Enabled;
+ if (option->state & State_On)
+ flags |= State_Sunken;
+ QStyleOption arrowOpt(0);
+ arrowOpt.rect = ar;
+ arrowOpt.palette = cmb->palette;
+ arrowOpt.state = flags;
+ proxy()->drawPrimitive(PrimitiveElement(PE_IndicatorArrowDownBig), &arrowOpt, painter, widget);
if (cmb->subControls & SC_ComboBoxEditField) {
QRect re = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxEditField, widget);
if (cmb->state & State_HasFocus && !cmb->editable)
@@ -6335,7 +6370,7 @@ QSize QWindowsMobileStyle::sizeFromContents(ContentsType type, const QStyleOptio
case CT_ComboBox:
if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
int fw = comboBox->frame ? proxy()->pixelMetric(PM_ComboBoxFrameWidth, option, widget) * 2 : 0;
- newSize = QSize(newSize.width() + fw + 9, newSize.height() + fw-4); //Nine is a magic Number - See CommonStyle for real magic (23)
+ newSize = QSize(newSize.width() + fw + 9, newSize.height() + fw); //Nine is a magic Number - See CommonStyle for real magic (23)
}
break;
#endif
@@ -6618,14 +6653,21 @@ QRect QWindowsMobileStyle::subControlRect(ComplexControl control, const QStyleOp
switch (subControl) {
case SC_ComboBoxArrow:
rect.setRect(xpos, y + bmarg, he - 2*bmarg, he - 2*bmarg);
- rect.setRect(xpos, y + bmarg, int((he - 2*bmarg)), he - 2*bmarg);
break;
- case SC_ComboBoxEditField:
- rect.setRect(x + margin+4, y + margin+2, wi - 4 * margin - int((he - 2*bmarg) * 0.84f) -2, he - 2 * margin-4);
- break;
- case SC_ComboBoxFrame:
- rect = comboBox->rect;
- break;
+ case SC_ComboBoxEditField:
+ rect.setRect(x + margin, y + margin, wi - 2 * margin - int((he - 2*bmarg) * 0.84f), he - 2 * margin);
+ if (d->doubleControls) {
+ if (comboBox->editable)
+ rect.adjust(2, 0, 0, 0);
+ else
+ rect.adjust(4, 2, 0, -2);
+ } else if (!comboBox->editable) {
+ rect.adjust(2, 1, 0, -1);
+ }
+ break;
+ case SC_ComboBoxFrame:
+ rect = comboBox->rect;
+ break;
default:
break;
}
@@ -6999,7 +7041,7 @@ int QWindowsMobileStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, co
} else {
d->doubleControls ? ret = 36 : ret = 18;
}
- break;
+ break;
case PM_ScrollBarExtent: {
if (d->smartphone)
@@ -7055,7 +7097,7 @@ int QWindowsMobileStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, co
break;
case PM_TextCursorWidth:
ret = 2;
- break;
+ break;
case PM_TabBar_ScrollButtonOverlap:
ret = 0;
break;
@@ -7089,7 +7131,7 @@ int QWindowsMobileStyle::styleHint(StyleHint hint, const QStyleOption *opt, cons
#endif
case SH_ToolBar_Movable:
ret = false;
- break;
+ break;
case SH_ScrollBar_ContextMenu:
ret = false;
break;
diff --git a/src/gui/symbian/qsymbianevent.cpp b/src/gui/symbian/qsymbianevent.cpp
new file mode 100644
index 0000000..af2c861
--- /dev/null
+++ b/src/gui/symbian/qsymbianevent.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsymbianevent.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QSymbianEvent
+ \brief The QSymbianEvent class contains a Symbian event of any type.
+ \since 4.6
+
+ The class is used as a generic container type for all types of Symbian
+ events.
+
+ \note This class is only available on Symbian.
+
+ \sa QApplication::symbianEventFilter()
+*/
+
+/*!
+ \enum QSymbianEvent::Type
+
+ \value InvalidEvent The event is not valid.
+ \value WindowServerEvent Indicates an event of type \c TWsEvent.
+ \value CommandEvent Indicates that the event is a Symbian command.
+ \value ResourceChangeEvent Indicates that the event is a Symbian resource change type.
+*/
+
+/*!
+ \fn QSymbianEvent::type()
+
+ Returns the event type contained in the QSymbianEvent instance.
+*/
+
+/*!
+ \fn QSymbianEvent::isValid()
+
+ Returns whether this QSymbianEvent instance contains a valid event.
+*/
+
+/*!
+ Constructs a QSymbianEvent containing the given window server event
+ \a windowServerEvent.
+*/
+QSymbianEvent::QSymbianEvent(const TWsEvent *windowServerEvent)
+ : m_type(WindowServerEvent)
+ , m_eventPtr(windowServerEvent)
+{
+}
+
+/*!
+ Constructs a QSymbianEvent containing the given event value
+ \a value. The type of event is controlled by the \a eventType parameter.
+*/
+QSymbianEvent::QSymbianEvent(QSymbianEvent::Type eventType, int value)
+{
+ switch (eventType) {
+ case CommandEvent:
+ case ResourceChangeEvent:
+ m_type = eventType;
+ m_eventValue = value;
+ break;
+ default:
+ m_type = InvalidEvent;
+ m_eventValue = 0;
+ break;
+ }
+}
+
+/*!
+ Destroys the QSymbianEvent.
+*/
+QSymbianEvent::~QSymbianEvent()
+{
+}
+
+/*!
+ Returns the window server event contained in the class instance, or 0 if the event type
+ is not \c WindowServerEvent.
+*/
+const TWsEvent *QSymbianEvent::windowServerEvent() const
+{
+ return (m_type == WindowServerEvent) ? static_cast<const TWsEvent *>(m_eventPtr) : 0;
+}
+
+/*!
+ Returns the command contained in the class instance, or 0 if the event type
+ is not \c CommandEvent.
+*/
+int QSymbianEvent::command() const
+{
+ return (m_type == CommandEvent) ? m_eventValue : 0;
+}
+
+/*!
+ Returns the resource change type contained in the class instance, or 0 if the event type
+ is not \c ResourceChangeEvent.
+*/
+int QSymbianEvent::resourceChangeType() const
+{
+ return (m_type == ResourceChangeEvent) ? m_eventValue : 0;
+}
+
+QT_END_NAMESPACE
diff --git a/doc/src/snippets/gestures/qgesture.h b/src/gui/symbian/qsymbianevent.h
index 3fc89a1..74aa5d0 100644
--- a/doc/src/snippets/gestures/qgesture.h
+++ b/src/gui/symbian/qsymbianevent.h
@@ -39,15 +39,14 @@
**
****************************************************************************/
-#ifndef QGESTURE_H
-#define QGESTURE_H
+#ifndef QSYMBIANEVENT_H
+#define QSYMBIANEVENT_H
-#include <QtCore/qobject.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qdatetime.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qmetatype.h>
+#include <QtCore/qglobal.h>
+
+#ifdef Q_OS_SYMBIAN
+
+class TWsEvent;
QT_BEGIN_HEADER
@@ -55,47 +54,51 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
-class QGraphicsItem;
-class QGesturePrivate;
-class Q_GUI_EXPORT QGesture : public QObject
+class Q_GUI_EXPORT QSymbianEvent
{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QGesture)
-
- Q_PROPERTY(Qt::GestureState state READ state)
-
public:
- explicit QGesture(QObject *parent = 0);
- ~QGesture();
+ enum Type {
+ InvalidEvent,
+ WindowServerEvent,
+ CommandEvent,
+ ResourceChangeEvent
+ };
- virtual bool filterEvent(QEvent *event) = 0;
+ QSymbianEvent(const TWsEvent *windowServerEvent);
+ QSymbianEvent(Type eventType, int value);
+ ~QSymbianEvent();
- void setGraphicsItem(QGraphicsItem *);
- QGraphicsItem *graphicsItem() const;
+ Type type() const;
+ bool isValid() const;
- Qt::GestureState state() const;
+ const TWsEvent *windowServerEvent() const;
+ int command() const;
+ int resourceChangeType() const;
-protected:
- QGesture(QGesturePrivate &dd, QObject *parent);
- bool eventFilter(QObject*, QEvent*);
+private:
+ Type m_type;
+ union {
+ const void *m_eventPtr;
+ int m_eventValue;
- virtual void reset();
- void updateState(Qt::GestureState state);
+ qint64 m_reserved;
+ };
+};
-//! [qgesture-signals]
-Q_SIGNALS:
- void started();
- void triggered();
- void finished();
- void cancelled();
-//! [qgesture-signals]
+inline QSymbianEvent::Type QSymbianEvent::type() const
+{
+ return m_type;
+}
-private:
- friend class QWidget;
-};
+inline bool QSymbianEvent::isValid() const
+{
+ return m_type != InvalidEvent;
+}
QT_END_NAMESPACE
QT_END_HEADER
-#endif // QGESTURE_H
+#endif // Q_OS_SYMBIAN
+
+#endif // QSYMBIANEVENT_H
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index d0f4d2e..738e36a 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -1351,7 +1351,12 @@ static void match(int script, const QFontDef &request,
unsigned int score = ~0u;
+#ifdef Q_WS_X11
load(family_name, script, forceXLFD);
+#else
+ Q_UNUSED(forceXLFD);
+ load(family_name, script);
+#endif
QFontDatabasePrivate *db = privateDb();
for (int x = 0; x < db->count; ++x) {
diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp
index 382c4fe..27ff003 100644
--- a/src/gui/text/qfontdatabase_x11.cpp
+++ b/src/gui/text/qfontdatabase_x11.cpp
@@ -752,7 +752,7 @@ QFontDef qt_FcPatternToQFontDef(FcPattern *pattern, const QFontDef &request)
if (X11->display)
dpi = QX11Info::appDpiY();
else
- dpi = 96; // ####
+ dpi = qt_defaultDpiY();
}
double size;
diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm
index 758d8af..8ce437d 100644
--- a/src/gui/text/qfontengine_mac.mm
+++ b/src/gui/text/qfontengine_mac.mm
@@ -119,6 +119,28 @@ OSStatus QMacFontPath::closePath(void *data)
}
+
+void qmacfontengine_gamma_correct(QImage *image)
+{
+ extern uchar qt_pow_rgb_gamma[256];
+
+ // gamma correct the pixels back to linear color space...
+ int h = image->height();
+ int w = image->width();
+
+ for (int y=0; y<h; ++y) {
+ uint *pixels = (uint *) image->scanLine(y);
+ for (int x=0; x<w; ++x) {
+ uint p = pixels[x];
+ uint r = qt_pow_rgb_gamma[qRed(p)];
+ uint g = qt_pow_rgb_gamma[qGreen(p)];
+ uint b = qt_pow_rgb_gamma[qBlue(p)];
+ pixels[x] = (r << 16) | (g << 8) | b | 0xff000000;
+ }
+ }
+}
+
+
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
QCoreTextFontEngineMulti::QCoreTextFontEngineMulti(const ATSFontFamilyRef &, const ATSFontRef &atsFontRef, const QFontDef &fontDef, bool kerning)
: QFontEngineMulti(0)
@@ -534,7 +556,7 @@ void QCoreTextFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *position
}
}
-QImage QCoreTextFontEngine::alphaMapForGlyph(glyph_t glyph)
+QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, int margin, bool aa)
{
const glyph_metrics_t br = boundingBox(glyph);
QImage im(qRound(br.width)+2, qRound(br.height)+2, QImage::Format_RGB32);
@@ -549,9 +571,10 @@ QImage QCoreTextFontEngine::alphaMapForGlyph(glyph_t glyph)
8, im.bytesPerLine(), colorspace,
cgflags);
CGContextSetFontSize(ctx, fontDef.pixelSize);
- CGContextSetShouldAntialias(ctx, fontDef.pointSize > qt_antialiasing_threshold
- && !(fontDef.styleStrategy & QFont::NoAntialias));
- CGContextSetShouldSmoothFonts(ctx, false);
+ CGContextSetShouldAntialias(ctx, aa ||
+ (fontDef.pointSize > qt_antialiasing_threshold
+ && !(fontDef.styleStrategy & QFont::NoAntialias)));
+ CGContextSetShouldSmoothFonts(ctx, aa);
CGAffineTransform oldTextMatrix = CGContextGetTextMatrix(ctx);
CGAffineTransform cgMatrix = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
@@ -586,6 +609,13 @@ QImage QCoreTextFontEngine::alphaMapForGlyph(glyph_t glyph)
CGContextRelease(ctx);
+ return im;
+}
+
+QImage QCoreTextFontEngine::alphaMapForGlyph(glyph_t glyph)
+{
+ QImage im = imageForGlyph(glyph, 0, false);
+
QImage indexed(im.width(), im.height(), QImage::Format_Indexed8);
QVector<QRgb> colors(256);
for (int i=0; i<256; ++i)
@@ -605,6 +635,16 @@ QImage QCoreTextFontEngine::alphaMapForGlyph(glyph_t glyph)
return indexed;
}
+QImage QCoreTextFontEngine::alphaRGBMapForGlyph(glyph_t glyph, int margin, const QTransform &x)
+{
+ if (x.type() >= QTransform::TxScale)
+ return QFontEngine::alphaRGBMapForGlyph(glyph, margin, x);
+
+ QImage im = imageForGlyph(glyph, margin, true);
+ qmacfontengine_gamma_correct(&im);
+ return im;
+}
+
void QCoreTextFontEngine::recalcAdvances(int numGlyphs, QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const
{
Q_ASSERT(false);
@@ -790,7 +830,6 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
surrogates += (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00
&& str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
}
- Q_ASSERT(*nfo->numGlyphs == item->length - surrogates);
#endif
for (nextCharStop = item->from; nextCharStop < item->from + item->length; ++nextCharStop)
if (item->charAttributes[nextCharStop].charStop)
@@ -816,10 +855,13 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
QFixed xAdvance = FixedToQFixed(layoutData[glyphIdx + 1].realPos - layoutData[glyphIdx].realPos);
if (glyphId != 0xffff || i == 0) {
- nfo->glyphs->glyphs[i] = (glyphId & 0x00ffffff) | (fontIdx << 24);
+ if (i < nfo->glyphs->numGlyphs)
+ {
+ nfo->glyphs->glyphs[i] = (glyphId & 0x00ffffff) | (fontIdx << 24);
- nfo->glyphs->advances_y[i] = yAdvance;
- nfo->glyphs->advances_x[i] = xAdvance;
+ nfo->glyphs->advances_y[i] = yAdvance;
+ nfo->glyphs->advances_x[i] = xAdvance;
+ }
} else {
// ATSUI gives us 0xffff as glyph id at the index in the glyph array for
// a character position that maps to a ligtature. Such a glyph id does not
@@ -989,6 +1031,8 @@ bool QFontEngineMacMulti::stringToCMapInternal(const QChar *str, int len, QGlyph
nfo.flags = flags;
nfo.shaperItem = shaperItem;
+ int prevNumGlyphs = *nglyphs;
+
QVarLengthArray<int> mappedFonts(len);
for (int i = 0; i < len; ++i)
mappedFonts[i] = 0;
@@ -1100,6 +1144,8 @@ bool QFontEngineMacMulti::stringToCMapInternal(const QChar *str, int len, QGlyph
}
ATSUClearLayoutCache(textLayout, kATSUFromTextBeginning);
+ if (prevNumGlyphs < *nfo.numGlyphs)
+ return false;
return true;
}
@@ -1505,19 +1551,7 @@ QImage QFontEngineMac::alphaRGBMapForGlyph(glyph_t glyph, int margin, const QTra
im = im.transformed(t);
}
- extern uchar qt_pow_rgb_gamma[256];
-
- // gamma correct the pixels back to linear color space...
- for (int y=0; y<im.height(); ++y) {
- uint *pixels = (uint *) im.scanLine(y);
- for (int x=0; x<im.width(); ++x) {
- uint p = pixels[x];
- uint r = qt_pow_rgb_gamma[qRed(p)];
- uint g = qt_pow_rgb_gamma[qGreen(p)];
- uint b = qt_pow_rgb_gamma[qBlue(p)];
- pixels[x] = (r << 16) | (g << 8) | b | 0xff000000;
- }
- }
+ qmacfontengine_gamma_correct(&im);
return im;
}
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h
index 50124fa..728c344 100644
--- a/src/gui/text/qfontengine_p.h
+++ b/src/gui/text/qfontengine_p.h
@@ -448,12 +448,13 @@ public:
virtual bool getSfntTableData(uint /*tag*/, uchar * /*buffer*/, uint * /*length*/) const;
virtual void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics);
virtual QImage alphaMapForGlyph(glyph_t);
+ virtual QImage alphaRGBMapForGlyph(glyph_t, int margin, const QTransform &t);
virtual qreal minRightBearing() const;
virtual qreal minLeftBearing() const;
-
private:
+ QImage imageForGlyph(glyph_t glyph, int margin, bool colorful);
CTFontRef ctfont;
CGFontRef cgFont;
QCoreTextFontEngineMulti *parentEngine;
diff --git a/src/gui/text/qfontengine_win.cpp b/src/gui/text/qfontengine_win.cpp
index cc555a3..d781c70 100644
--- a/src/gui/text/qfontengine_win.cpp
+++ b/src/gui/text/qfontengine_win.cpp
@@ -125,6 +125,7 @@ HDC shared_dc()
}
#endif
+#ifndef Q_WS_WINCE
typedef BOOL (WINAPI *PtrGetCharWidthI)(HDC, UINT, UINT, LPWORD, LPINT);
static PtrGetCharWidthI ptrGetCharWidthI = 0;
static bool resolvedGetCharWidthI = false;
@@ -136,6 +137,7 @@ static void resolveGetCharWidthI()
resolvedGetCharWidthI = true;
ptrGetCharWidthI = (PtrGetCharWidthI)QLibrary::resolve(QLatin1String("gdi32"), "GetCharWidthI");
}
+#endif // !defined(Q_WS_WINCE)
// defined in qtextengine_win.cpp
typedef void *SCRIPT_CACHE;
@@ -340,8 +342,10 @@ QFontEngineWin::QFontEngineWin(const QString &name, HFONT _hfont, bool stockFont
designAdvances = 0;
designAdvancesSize = 0;
+#ifndef Q_WS_WINCE
if (!resolvedGetCharWidthI)
resolveGetCharWidthI();
+#endif
}
QFontEngineWin::~QFontEngineWin()
@@ -381,80 +385,18 @@ bool QFontEngineWin::stringToCMap(const QChar *str, int len, QGlyphLayout *glyph
if (flags & QTextEngine::GlyphIndicesOnly)
return true;
-#if defined(Q_WS_WINCE)
- HDC hdc = shared_dc();
- if (flags & QTextEngine::DesignMetrics) {
- HGDIOBJ oldFont = 0;
- int glyph_pos = 0;
- for(register int i = 0; i < len; i++) {
- bool surrogate = (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00 && i < len-1
- && str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
- unsigned int glyph = glyphs->glyphs[glyph_pos];
- if(int(glyph) >= designAdvancesSize) {
- int newSize = (glyph + 256) >> 8 << 8;
- designAdvances = q_check_ptr((QFixed *)realloc(designAdvances, newSize*sizeof(QFixed)));
- for(int i = designAdvancesSize; i < newSize; ++i)
- designAdvances[i] = -1000000;
- designAdvancesSize = newSize;
- }
- if(designAdvances[glyph] < -999999) {
- if(!oldFont)
- oldFont = selectDesignFont();
- SIZE size = {0, 0};
- GetTextExtentPoint32(hdc, (wchar_t *)(str+i), surrogate ? 2 : 1, &size);
- designAdvances[glyph] = QFixed((int)size.cx)/designToDevice;
- }
- glyphs->advances_x[glyph_pos] = designAdvances[glyph];
- glyphs->advances_y[glyph_pos] = 0;
- if (surrogate)
- ++i;
- ++glyph_pos;
- }
- if(oldFont)
- DeleteObject(SelectObject(hdc, oldFont));
- } else {
- int glyph_pos = 0;
- HGDIOBJ oldFont = 0;
-
- for(register int i = 0; i < len; i++) {
- bool surrogate = (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00 && i < len-1
- && str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
- unsigned int glyph = glyphs->glyphs[glyph_pos];
-
- glyphs->advances_y[glyph_pos] = 0;
-
- if (glyph >= widthCacheSize) {
- int newSize = (glyph + 256) >> 8 << 8;
- widthCache = q_check_ptr((unsigned char *)realloc(widthCache,
- newSize*sizeof(QFixed)));
- memset(widthCache + widthCacheSize, 0, newSize - widthCacheSize);
- widthCacheSize = newSize;
- }
- glyphs->advances_x[glyph_pos] = widthCache[glyph];
- // font-width cache failed
- if (glyphs->advances_x[glyph_pos] == 0) {
- SIZE size = {0, 0};
- if (!oldFont)
- oldFont = SelectObject(hdc, hfont);
- GetTextExtentPoint32(hdc, (wchar_t *)str + i, surrogate ? 2 : 1, &size);
- glyphs->advances_x[glyph_pos] = size.cx;
- // if glyph's within cache range, store it for later
- if (size.cx > 0 && size.cx < 0x100)
- widthCache[glyph] = size.cx;
- }
-
- if (surrogate)
- ++i;
- ++glyph_pos;
- }
+ recalcAdvances(glyphs, flags);
+ return true;
+}
- if (oldFont)
- SelectObject(hdc, oldFont);
- }
+inline void calculateTTFGlyphWidth(HDC hdc, UINT glyph, int &width)
+{
+#if defined(Q_WS_WINCE)
+ GetCharWidth32(hdc, glyph, glyph, &width);
#else
- recalcAdvances(glyphs, flags);
+ if (ptrGetCharWidthI)
+ ptrGetCharWidthI(hdc, glyph, 1, 0, &width);
#endif
- return true;
}
void QFontEngineWin::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const
@@ -477,8 +419,7 @@ void QFontEngineWin::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFla
oldFont = selectDesignFont();
int width = 0;
- if (ptrGetCharWidthI)
- ptrGetCharWidthI(hdc, glyph, 1, 0, &width);
+ calculateTTFGlyphWidth(hdc, glyph, width);
designAdvances[glyph] = QFixed(width) / designToDevice;
}
glyphs->advances_x[i] = designAdvances[glyph];
@@ -517,8 +458,8 @@ void QFontEngineWin::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFla
SIZE size = {0, 0};
GetTextExtentPoint32(hdc, (wchar_t *)ch, chrLen, &size);
width = size.cx;
- } else if (ptrGetCharWidthI) {
- ptrGetCharWidthI(hdc, glyph, 1, 0, &width);
+ } else {
+ calculateTTFGlyphWidth(hdc, glyph, width);
}
glyphs->advances_x[i] = width;
// if glyph's within cache range, store it for later
diff --git a/src/gui/text/qfontengine_x11.cpp b/src/gui/text/qfontengine_x11.cpp
index ffc0eb4..ff3f628 100644
--- a/src/gui/text/qfontengine_x11.cpp
+++ b/src/gui/text/qfontengine_x11.cpp
@@ -491,7 +491,7 @@ glyph_metrics_t QFontEngineXLFD::boundingBox(const QGlyphLayout &glyphs)
// XCharStruct::rbearing is defined as distance from left edge to rightmost pixel
xmax = qMax(xmax, overall.xoff + glyphs.offsets[i].x + xcs->rbearing);
ymax = qMax(ymax, y + xcs->ascent + xcs->descent);
- overall.xoff += glyphs.advances_x[i];
+ overall.xoff += glyphs.advances_x[i] + QFixed::fromFixed(glyphs.justifications[i].space_18d6);
} else {
QFixed size = _fs->ascent;
overall.x = qMin(overall.x, overall.xoff);
diff --git a/src/gui/text/qtextcontrol.cpp b/src/gui/text/qtextcontrol.cpp
index db4c07c..ee8b751 100644
--- a/src/gui/text/qtextcontrol.cpp
+++ b/src/gui/text/qtextcontrol.cpp
@@ -505,9 +505,13 @@ void QTextControlPrivate::startDrag()
drag->setMimeData(data);
Qt::DropActions actions = Qt::CopyAction;
- if (interactionFlags & Qt::TextEditable)
+ Qt::DropAction action;
+ if (interactionFlags & Qt::TextEditable) {
actions |= Qt::MoveAction;
- Qt::DropAction action = drag->exec(actions, Qt::MoveAction);
+ action = drag->exec(actions, Qt::MoveAction);
+ } else {
+ action = drag->exec(actions, Qt::CopyAction);
+ }
if (action == Qt::MoveAction && drag->target() != contextWidget)
cursor.removeSelectedText();
diff --git a/src/gui/text/qtextengine_mac.cpp b/src/gui/text/qtextengine_mac.cpp
index 4f20094..e101830 100644
--- a/src/gui/text/qtextengine_mac.cpp
+++ b/src/gui/text/qtextengine_mac.cpp
@@ -50,7 +50,6 @@ static void heuristicSetGlyphAttributes(const QChar *uc, int length, QGlyphLayou
{
// ### zeroWidth and justification are missing here!!!!!
- Q_ASSERT(num_glyphs <= length);
Q_UNUSED(num_glyphs);
// qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs);
@@ -596,7 +595,7 @@ void QTextEngine::shapeTextMac(int item) const
}
while (true) {
- ensureSpace(num_glyphs);
+ ensureSpace(num_glyphs);
num_glyphs = layoutData->glyphLayout.numGlyphs - layoutData->used;
QGlyphLayout g = availableGlyphs(&si);
@@ -611,9 +610,9 @@ void QTextEngine::shapeTextMac(int item) const
log_clusters,
attributes())) {
- heuristicSetGlyphAttributes(str, len, &g, log_clusters, num_glyphs);
- break;
- }
+ heuristicSetGlyphAttributes(str, len, &g, log_clusters, num_glyphs);
+ break;
+ }
}
si.num_glyphs = num_glyphs;
diff --git a/src/gui/text/qtextodfwriter.cpp b/src/gui/text/qtextodfwriter.cpp
index 3521ade..9b7e8de 100644
--- a/src/gui/text/qtextodfwriter.cpp
+++ b/src/gui/text/qtextodfwriter.cpp
@@ -550,9 +550,9 @@ void QTextOdfWriter::writeCharacterFormat(QXmlStreamWriter &writer, QTextCharFor
}
}
if (format.hasProperty(QTextFormat::FontLetterSpacing))
- writer.writeAttribute(foNS, QString::fromLatin1("letter-spacing"), pixelToPoint(format.fontLetterSpacing()) );
+ writer.writeAttribute(foNS, QString::fromLatin1("letter-spacing"), pixelToPoint(format.fontLetterSpacing()));
if (format.hasProperty(QTextFormat::FontWordSpacing))
- writer.writeAttribute(foNS, QString::fromLatin1("letter-spacing"), pixelToPoint(format.fontWordSpacing()) );
+ writer.writeAttribute(foNS, QString::fromLatin1("word-spacing"), pixelToPoint(format.fontWordSpacing()));
if (format.hasProperty(QTextFormat::FontUnderline))
writer.writeAttribute(styleNS, QString::fromLatin1("text-underline-type"),
format.fontUnderline() ? QString::fromLatin1("single") : QString::fromLatin1("none"));
diff --git a/src/gui/widgets/qabstractscrollarea.cpp b/src/gui/widgets/qabstractscrollarea.cpp
index d8702cf..0896256 100644
--- a/src/gui/widgets/qabstractscrollarea.cpp
+++ b/src/gui/widgets/qabstractscrollarea.cpp
@@ -52,11 +52,6 @@
#include "qboxlayout.h"
#include "qpainter.h"
-#ifdef Q_WS_WIN
-#include "qstandardgestures.h"
-#include <private/qstandardgestures_p.h>
-#endif
-
#include "qabstractscrollarea_p.h"
#include <qwidget.h>
@@ -165,7 +160,7 @@ QAbstractScrollAreaPrivate::QAbstractScrollAreaPrivate()
viewport(0), cornerWidget(0), left(0), top(0), right(0), bottom(0),
xoffset(0), yoffset(0), viewportFilter(0)
#ifdef Q_WS_WIN
- , panGesture(0), singleFingerPanEnabled(false)
+ , singleFingerPanEnabled(false)
#endif
{
}
@@ -298,14 +293,6 @@ void QAbstractScrollAreaPrivate::init()
q->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
layoutChildren();
-
-#ifdef Q_WS_WIN
- panGesture = new QPanGesture(viewport, q);
- panGesture->d_func()->implicitGesture = true;
- QObject::connect(panGesture, SIGNAL(started()), q, SLOT(_q_gestureTriggered()));
- QObject::connect(panGesture, SIGNAL(triggered()), q, SLOT(_q_gestureTriggered()));
- QObject::connect(panGesture, SIGNAL(finished()), q, SLOT(_q_gestureTriggered()));
-#endif // Q_WS_WIN
}
#ifdef Q_WS_WIN
@@ -556,9 +543,6 @@ void QAbstractScrollArea::setViewport(QWidget *widget)
if (isVisible())
d->viewport->show();
QMetaObject::invokeMethod(this, "setupViewport", Q_ARG(QWidget *, widget));
-#ifdef Q_WS_WIN
- d->panGesture->setGestureTarget(widget);
-#endif
delete oldViewport;
}
}
@@ -1351,26 +1335,24 @@ void QAbstractScrollArea::setupViewport(QWidget *viewport)
Q_UNUSED(viewport);
}
-#ifdef Q_WS_WIN
-void QAbstractScrollAreaPrivate::_q_gestureTriggered()
-{
- Q_Q(QAbstractScrollArea);
- QPanGesture *g = qobject_cast<QPanGesture*>(q->sender());
- if (!g)
- return;
- QScrollBar *hBar = q->horizontalScrollBar();
- QScrollBar *vBar = q->verticalScrollBar();
- QSizeF delta = g->lastOffset();
- if (!delta.isNull()) {
- if (QApplication::isRightToLeft())
- delta.rwidth() *= -1;
- int newX = hBar->value() - delta.width();
- int newY = vBar->value() - delta.height();
- hbar->setValue(newX);
- vbar->setValue(newY);
- }
-}
-#endif
+//void QAbstractScrollAreaPrivate::_q_gestureTriggered()
+//{
+// Q_Q(QAbstractScrollArea);
+// QPanGesture *g = qobject_cast<QPanGesture*>(q->sender());
+// if (!g)
+// return;
+// QScrollBar *hBar = q->horizontalScrollBar();
+// QScrollBar *vBar = q->verticalScrollBar();
+// QSizeF delta = g->lastOffset();
+// if (!delta.isNull()) {
+// if (QApplication::isRightToLeft())
+// delta.rwidth() *= -1;
+// int newX = hBar->value() - delta.width();
+// int newY = vBar->value() - delta.height();
+// hbar->setValue(newX);
+// vbar->setValue(newY);
+// }
+//}
QT_END_NAMESPACE
diff --git a/src/gui/widgets/qabstractscrollarea.h b/src/gui/widgets/qabstractscrollarea.h
index 3773477..b3a1861 100644
--- a/src/gui/widgets/qabstractscrollarea.h
+++ b/src/gui/widgets/qabstractscrollarea.h
@@ -129,10 +129,6 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_vslide(int))
Q_PRIVATE_SLOT(d_func(), void _q_showOrHideScrollBars())
-#ifdef Q_WS_WIN
- Q_PRIVATE_SLOT(d_func(), void _q_gestureTriggered())
-#endif
-
friend class QStyleSheetStyle;
friend class QWidgetPrivate;
};
diff --git a/src/gui/widgets/qabstractscrollarea_p.h b/src/gui/widgets/qabstractscrollarea_p.h
index 0bb2851..bfb8917 100644
--- a/src/gui/widgets/qabstractscrollarea_p.h
+++ b/src/gui/widgets/qabstractscrollarea_p.h
@@ -60,7 +60,6 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_SCROLLAREA
-class QPanGesture;
class QScrollBar;
class QAbstractScrollAreaScrollBarContainer;
class Q_AUTOTEST_EXPORT QAbstractScrollAreaPrivate: public QFramePrivate
@@ -102,8 +101,6 @@ public:
QScopedPointer<QObject> viewportFilter;
#ifdef Q_WS_WIN
- QPanGesture *panGesture;
- virtual void _q_gestureTriggered();
bool singleFingerPanEnabled;
void setSingleFingerPanEnabled(bool on = true);
#endif
diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp
index b606538..0e888d6 100644
--- a/src/gui/widgets/qcombobox.cpp
+++ b/src/gui/widgets/qcombobox.cpp
@@ -2174,11 +2174,14 @@ void QComboBox::insertSeparator(int index)
/*!
Removes the item at the given \a index from the combobox.
This will update the current index if the index is removed.
+
+ This function does nothing if \a index is out of range.
*/
void QComboBox::removeItem(int index)
{
- Q_ASSERT(index >= 0 && index < count());
Q_D(QComboBox);
+ if (index < 0 || index >= count())
+ return;
d->model->removeRows(index, 1, d->root);
}
diff --git a/src/gui/widgets/qdialogbuttonbox.cpp b/src/gui/widgets/qdialogbuttonbox.cpp
index 280ca63..2231b98 100644
--- a/src/gui/widgets/qdialogbuttonbox.cpp
+++ b/src/gui/widgets/qdialogbuttonbox.cpp
@@ -560,7 +560,7 @@ QAction* QDialogButtonBoxPrivate::createSoftKey(QAbstractButton *button, QDialog
Q_Q(QDialogButtonBox);
QAction::SoftKeyRole softkeyRole;
- QAction *action = new QAction(button->text(), q);
+ QAction *action = new QAction(button->text(), button);
switch (role) {
case ApplyRole:
@@ -581,7 +581,6 @@ QAction* QDialogButtonBoxPrivate::createSoftKey(QAbstractButton *button, QDialog
}
QObject::connect(action, SIGNAL(triggered()), button, SIGNAL(clicked()));
action->setSoftKeyRole(softkeyRole);
- action->setEnabled(button->isEnabled());
return action;
}
#endif
@@ -874,6 +873,11 @@ void QDialogButtonBox::setOrientation(Qt::Orientation orientation)
void QDialogButtonBox::clear()
{
Q_D(QDialogButtonBox);
+#ifdef QT_SOFTKEYS_ENABLED
+ // Delete softkey actions as they have the buttons as parents
+ qDeleteAll(d->softKeyActions.values());
+ d->softKeyActions.clear();
+#endif
// Remove the created standard buttons, they should be in the other lists, which will
// do the deletion
d->standardButtonHash.clear();
@@ -1026,6 +1030,11 @@ QPushButton *QDialogButtonBox::addButton(StandardButton button)
void QDialogButtonBox::setStandardButtons(StandardButtons buttons)
{
Q_D(QDialogButtonBox);
+#ifdef QT_SOFTKEYS_ENABLED
+ // Delete softkey actions since they have the buttons as parents
+ qDeleteAll(d->softKeyActions.values());
+ d->softKeyActions.clear();
+#endif
// Clear out all the old standard buttons, then recreate them.
qDeleteAll(d->standardButtonHash.keys());
d->standardButtonHash.clear();
diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp
index 5930540..7f9ff82 100644
--- a/src/gui/widgets/qlinecontrol.cpp
+++ b/src/gui/widgets/qlinecontrol.cpp
@@ -1290,7 +1290,7 @@ void QLineControl::setCursorBlinkPeriod(int msec)
m_blinkStatus = 1;
} else {
m_blinkTimer = 0;
- if (m_blinkStatus == 0)
+ if (m_blinkStatus == 1)
emit updateNeeded(inputMask().isEmpty() ? cursorRect() : QRect());
}
m_blinkPeriod = msec;
diff --git a/src/gui/widgets/qmainwindow.cpp b/src/gui/widgets/qmainwindow.cpp
index 0947e1b..501e62f 100644
--- a/src/gui/widgets/qmainwindow.cpp
+++ b/src/gui/widgets/qmainwindow.cpp
@@ -119,7 +119,7 @@ void QMainWindowPrivate::init()
q->setAttribute(Qt::WA_Hover);
#ifdef QT_SOFTKEYS_ENABLED
menuBarAction = QSoftKeyManager::createAction(QSoftKeyManager::MenuSoftKey, q);
- menuBarAction->setObjectName("_q_menuSoftKeyAction");
+ menuBarAction->setObjectName(QLatin1String("_q_menuSoftKeyAction"));
#endif
}
@@ -933,7 +933,7 @@ static bool checkDockWidgetArea(Qt::DockWidgetArea area, const char *where)
}
#ifndef QT_NO_TABBAR
-/*!
+/*!
\property QMainWindow::documentMode
\brief whether the tab bar for tabbed dockwidgets is set to document mode.
\since 4.5
@@ -954,7 +954,7 @@ void QMainWindow::setDocumentMode(bool enabled)
#endif // QT_NO_TABBAR
#ifndef QT_NO_TABWIDGET
-/*!
+/*!
\property QMainWindow::tabShape
\brief the tab shape used for tabbed dock widgets.
\since 4.5
diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp
index 687e1bc..ea25901 100644
--- a/src/gui/widgets/qmenu.cpp
+++ b/src/gui/widgets/qmenu.cpp
@@ -180,6 +180,21 @@ int QMenuPrivate::scrollerHeight() const
}
//Windows and KDE allows menus to cover the taskbar, while GNOME and Mac don't
+QRect QMenuPrivate::popupGeometry(const QWidget *widget) const
+{
+#ifdef Q_WS_WIN
+ return QApplication::desktop()->screenGeometry(widget);
+#elif defined Q_WS_X11
+ if (X11->desktopEnvironment == DE_KDE)
+ return QApplication::desktop()->screenGeometry(widget);
+ else
+ return QApplication::desktop()->availableGeometry(widget);
+#else
+ return QApplication::desktop()->availableGeometry(widget);
+#endif
+}
+
+//Windows and KDE allows menus to cover the taskbar, while GNOME and Mac don't
QRect QMenuPrivate::popupGeometry(int screen) const
{
#ifdef Q_WS_WIN
@@ -234,7 +249,7 @@ void QMenuPrivate::updateActionRects() const
}
int max_column_width = 0,
- dh = popupGeometry(QApplication::desktop()->screenNumber(q)).height(),
+ dh = popupGeometry(q).height(),
y = 0;
QStyle *style = q->style();
QStyleOption opt;
@@ -744,7 +759,7 @@ void QMenuPrivate::scrollMenu(QAction *action, QMenuScroller::ScrollLocation loc
if (newScrollFlags & QMenuScroller::ScrollUp)
newOffset -= vmargin;
- QRect screen = popupGeometry(QApplication::desktop()->screenNumber(q));
+ QRect screen = popupGeometry(q);
const int desktopFrame = q->style()->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, 0, q);
if (q->height() < screen.height()-(desktopFrame*2)-1) {
QRect geom = q->geometry();
@@ -960,10 +975,19 @@ bool QMenuPrivate::mouseEventTaken(QMouseEvent *e)
return false;
}
+class ExceptionGuard
+{
+public:
+ inline ExceptionGuard(bool *w = 0) : watched(w) { Q_ASSERT(!(*watched)); *watched = true; }
+ inline ~ExceptionGuard() { *watched = false; }
+ inline operator bool() { return *watched; }
+private:
+ bool *watched;
+};
+
void QMenuPrivate::activateCausedStack(const QList<QPointer<QWidget> > &causedStack, QAction *action, QAction::ActionEvent action_e, bool self)
{
- Q_ASSERT(!activationRecursionGuard);
- activationRecursionGuard = true;
+ ExceptionGuard guard(&activationRecursionGuard);
#ifdef QT3_SUPPORT
const int actionId = q_func()->findIdForAction(action);
#endif
@@ -1008,7 +1032,6 @@ void QMenuPrivate::activateCausedStack(const QList<QPointer<QWidget> > &causedSt
#endif
}
}
- activationRecursionGuard = false;
}
void QMenuPrivate::activateAction(QAction *action, QAction::ActionEvent action_e, bool self)
@@ -1789,7 +1812,15 @@ void QMenu::popup(const QPoint &p, QAction *atAction)
d->updateActionRects();
QPoint pos = p;
QSize size = sizeHint();
- QRect screen = d->popupGeometry(QApplication::desktop()->screenNumber(p));
+ QRect screen;
+#ifndef QT_NO_GRAPHICSVIEW
+ bool isEmbedded = d->nearestGraphicsProxyWidget(this);
+ if (isEmbedded)
+ screen = d->popupGeometry(this);
+ else
+#endif
+ screen = d->popupGeometry(QApplication::desktop()->screenNumber(p));
+
const int desktopFrame = style()->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, 0, this);
bool adjustToDesktop = !window()->testAttribute(Qt::WA_DontShowOnScreen);
#ifdef QT_KEYPAD_NAVIGATION
@@ -2927,7 +2958,7 @@ void QMenu::internalDelayedPopup()
QPoint pos(rightPos);
QMenu *caused = qobject_cast<QMenu*>(d->activeMenu->d_func()->causedPopup.widget);
- const QRect availGeometry(d->popupGeometry(QApplication::desktop()->screenNumber(caused)));
+ const QRect availGeometry(d->popupGeometry(caused));
if (isRightToLeft()) {
pos = leftPos;
if ((caused && caused->x() < x()) || pos.x() < availGeometry.left()) {
diff --git a/src/gui/widgets/qmenu_mac.mm b/src/gui/widgets/qmenu_mac.mm
index 4fc3d3d..b238faf 100644
--- a/src/gui/widgets/qmenu_mac.mm
+++ b/src/gui/widgets/qmenu_mac.mm
@@ -1425,7 +1425,7 @@ QMenuPrivate::QMacMenuPrivate::syncAction(QMacMenuAction *action)
SetMenuItemProperty(data.submenuHandle, 0, kMenuCreatorQt, kMenuPropertyCausedQWidget, sizeof(caused), &caused);
#else
NSMenu *subMenu = static_cast<NSMenu *>(action->action->menu()->macMenu());
- if ([subMenu supermenu] != nil) {
+ if ([subMenu supermenu] && [subMenu supermenu] != [item menu]) {
// The menu is already a sub-menu of another one. Cocoa will throw an exception,
// in such cases. For the time being, a new QMenu with same set of actions is the
// only workaround.
@@ -1718,7 +1718,7 @@ QMenuBarPrivate::QMacMenuBarPrivate::syncAction(QMacMenuAction *action)
GetMenuItemProperty(action->menu, 0, kMenuCreatorQt, kMenuPropertyQWidget, sizeof(caused), 0, &caused);
SetMenuItemProperty(submenu, 0, kMenuCreatorQt, kMenuPropertyCausedQWidget, sizeof(caused), &caused);
#else
- if ([submenu supermenu] != nil)
+ if ([submenu supermenu] && [submenu supermenu] != [item menu])
return;
else
[item setSubmenu:submenu];
@@ -1771,6 +1771,16 @@ QMenuBarPrivate::QMacMenuBarPrivate::removeAction(QMacMenuAction *action)
actionItems.removeAll(action);
}
+bool QMenuBarPrivate::macWidgetHasNativeMenubar(QWidget *widget)
+{
+ // This function is different from q->isNativeMenuBar(), as
+ // it returns true only if a native menu bar is actually
+ // _created_.
+ if (!widget)
+ return false;
+ return menubars()->contains(widget->window());
+}
+
void
QMenuBarPrivate::macCreateMenuBar(QWidget *parent)
{
@@ -1778,16 +1788,22 @@ QMenuBarPrivate::macCreateMenuBar(QWidget *parent)
static int dontUseNativeMenuBar = -1;
// We call the isNativeMenuBar function here
// because that will make sure that local overrides
- // are dealt with correctly.
+ // are dealt with correctly. q->isNativeMenuBar() will, if not
+ // overridden, depend on the attribute Qt::AA_DontUseNativeMenuBar:
bool qt_mac_no_native_menubar = !q->isNativeMenuBar();
if (qt_mac_no_native_menubar == false && dontUseNativeMenuBar < 0) {
+ // The menubar is set to be native. Let's check (one time only
+ // for all menubars) if this is OK with the rest of the environment.
+ // As a result, Qt::AA_DontUseNativeMenuBar is set. NB: the application
+ // might still choose to not respect, or change, this flag.
bool isPlugin = QApplication::testAttribute(Qt::AA_MacPluginApplication);
bool environmentSaysNo = !qgetenv("QT_MAC_NO_NATIVE_MENUBAR").isEmpty();
dontUseNativeMenuBar = isPlugin || environmentSaysNo;
QApplication::instance()->setAttribute(Qt::AA_DontUseNativeMenuBar, dontUseNativeMenuBar);
qt_mac_no_native_menubar = !q->isNativeMenuBar();
}
- if (!qt_mac_no_native_menubar) {
+ if (qt_mac_no_native_menubar == false) {
+ // INVARIANT: Use native menubar.
extern void qt_event_request_menubarupdate(); //qapplication_mac.cpp
qt_event_request_menubarupdate();
if (!parent && !fallback) {
diff --git a/src/gui/widgets/qmenu_p.h b/src/gui/widgets/qmenu_p.h
index 9c4f260..9348f7b 100644
--- a/src/gui/widgets/qmenu_p.h
+++ b/src/gui/widgets/qmenu_p.h
@@ -192,11 +192,12 @@ public:
mutable QVector<QRect> actionRects;
mutable QWidgetList widgetItems;
void updateActionRects() const;
- QRect popupGeometry(int screen=-1) const;
+ QRect popupGeometry(const QWidget *widget) const;
+ QRect popupGeometry(int screen = -1) const;
mutable uint ncols : 4; //4 bits is probably plenty
uint collapsibleSeparators : 1;
- uint activationRecursionGuard : 1;
+ bool activationRecursionGuard;
//selection
static QPointer<QMenu> mouseDown;
diff --git a/src/gui/widgets/qmenu_symbian.cpp b/src/gui/widgets/qmenu_symbian.cpp
index d757f98..94c4177 100644
--- a/src/gui/widgets/qmenu_symbian.cpp
+++ b/src/gui/widgets/qmenu_symbian.cpp
@@ -243,11 +243,14 @@ void qt_symbian_show_submenu( CEikMenuPane* menuPane, int id)
}
#endif // Q_WS_S60
-void QMenuBarPrivate::symbianCommands(int command)
+int QMenuBarPrivate::symbianCommands(int command)
{
+ int ret = 0;
+
if (command == contexMenuCommand && !widgetWithContextMenu.isNull()) {
QContextMenuEvent* event = new QContextMenuEvent(QContextMenuEvent::Keyboard, QPoint(0,0));
QCoreApplication::postEvent(widgetWithContextMenu, event);
+ ret = 1;
}
int size = nativeMenuBars.size();
@@ -258,8 +261,11 @@ void QMenuBarPrivate::symbianCommands(int command)
emit nativeMenuBars.at(i)->triggered(menu->action);
menu->action->activate(QAction::Trigger);
+ ret = 1;
break;
}
+
+ return ret;
}
void QMenuBarPrivate::symbianCreateMenuBar(QWidget *parent)
diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp
index 13e7de4..f2f0722 100644
--- a/src/gui/widgets/qmenubar.cpp
+++ b/src/gui/widgets/qmenubar.cpp
@@ -1370,8 +1370,13 @@ void QMenuBarPrivate::handleReparent()
oldWindow = newWindow;
#ifdef Q_WS_MAC
- macDestroyMenuBar();
- macCreateMenuBar(newParent);
+ if (q->isNativeMenuBar() && !macWidgetHasNativeMenubar(newParent)) {
+ // If the new parent got a native menubar from before, keep that
+ // menubar rather than replace it with this one (because a parents
+ // menubar has precedence over children menubars).
+ macDestroyMenuBar();
+ macCreateMenuBar(newParent);
+ }
#endif
#ifdef Q_WS_WINCE
diff --git a/src/gui/widgets/qmenubar_p.h b/src/gui/widgets/qmenubar_p.h
index 0b27b97..da2b8d7 100644
--- a/src/gui/widgets/qmenubar_p.h
+++ b/src/gui/widgets/qmenubar_p.h
@@ -196,6 +196,7 @@ public:
return 0;
}
} *mac_menubar;
+ bool macWidgetHasNativeMenubar(QWidget *widget);
void macCreateMenuBar(QWidget *);
void macDestroyMenuBar();
OSMenuRef macMenu();
@@ -265,7 +266,7 @@ public:
void insertNativeMenuItems(const QList<QAction*> &actions);
} *symbian_menubar;
- static void symbianCommands(int command);
+ static int symbianCommands(int command);
#endif
};
diff --git a/src/gui/widgets/qplaintextedit.cpp b/src/gui/widgets/qplaintextedit.cpp
index 2ed6cd7..22438bf 100644
--- a/src/gui/widgets/qplaintextedit.cpp
+++ b/src/gui/widgets/qplaintextedit.cpp
@@ -65,11 +65,6 @@
#include <limits.h>
#include <qtexttable.h>
#include <qvariant.h>
-
-#ifdef Q_WS_WIN
-#include <qstandardgestures.h>
-#endif
-
#include <qinputcontext.h>
#ifndef QT_NO_TEXTEDIT
@@ -2937,33 +2932,29 @@ QAbstractTextDocumentLayout::PaintContext QPlainTextEdit::getPaintContext() cons
(\a available is true) or unavailable (\a available is false).
*/
-#ifdef Q_WS_WIN
-
-void QPlainTextEditPrivate::_q_gestureTriggered()
-{
- Q_Q(QPlainTextEdit);
- QPanGesture *g = qobject_cast<QPanGesture*>(q->sender());
- if (!g)
- return;
- QScrollBar *hBar = q->horizontalScrollBar();
- QScrollBar *vBar = q->verticalScrollBar();
- if (g->state() == Qt::GestureStarted)
- originalOffsetY = vBar->value();
- QSizeF totalOffset = g->totalOffset();
- if (!totalOffset.isNull()) {
- if (QApplication::isRightToLeft())
- totalOffset.rwidth() *= -1;
- // QPlainTextEdit scrolls by lines only in vertical direction
- QFontMetrics fm(q->document()->defaultFont());
- int lineHeight = fm.height();
- int newX = hBar->value() - g->lastOffset().width();
- int newY = originalOffsetY - totalOffset.height()/lineHeight;
- hbar->setValue(newX);
- vbar->setValue(newY);
- }
-}
-
-#endif
+//void QPlainTextEditPrivate::_q_gestureTriggered()
+//{
+// Q_Q(QPlainTextEdit);
+// QPanGesture *g = qobject_cast<QPanGesture*>(q->sender());
+// if (!g)
+// return;
+// QScrollBar *hBar = q->horizontalScrollBar();
+// QScrollBar *vBar = q->verticalScrollBar();
+// if (g->state() == Qt::GestureStarted)
+// originalOffsetY = vBar->value();
+// QSizeF totalOffset = g->totalOffset();
+// if (!totalOffset.isNull()) {
+// if (QApplication::isRightToLeft())
+// totalOffset.rwidth() *= -1;
+// // QPlainTextEdit scrolls by lines only in vertical direction
+// QFontMetrics fm(q->document()->defaultFont());
+// int lineHeight = fm.height();
+// int newX = hBar->value() - g->lastOffset().width();
+// int newY = originalOffsetY - totalOffset.height()/lineHeight;
+// hbar->setValue(newX);
+// vbar->setValue(newY);
+// }
+//}
QT_END_NAMESPACE
diff --git a/src/gui/widgets/qplaintextedit.h b/src/gui/widgets/qplaintextedit.h
index 1d6881b..60aed1d 100644
--- a/src/gui/widgets/qplaintextedit.h
+++ b/src/gui/widgets/qplaintextedit.h
@@ -270,10 +270,6 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_verticalScrollbarActionTriggered(int))
Q_PRIVATE_SLOT(d_func(), void _q_cursorPositionChanged())
-#ifdef Q_WS_WIN
- Q_PRIVATE_SLOT(d_func(), void _q_gestureTriggered())
-#endif
-
friend class QPlainTextEditControl;
};
diff --git a/src/gui/widgets/qplaintextedit_p.h b/src/gui/widgets/qplaintextedit_p.h
index 5fe6f4d..7adf403 100644
--- a/src/gui/widgets/qplaintextedit_p.h
+++ b/src/gui/widgets/qplaintextedit_p.h
@@ -72,7 +72,6 @@ class QMimeData;
class QPlainTextEdit;
class ExtraArea;
-class QPanGesture;
class QPlainTextEditControl : public QTextControl
{
@@ -179,10 +178,6 @@ public:
void _q_modificationChanged(bool);
int originalOffsetY;
-
-#ifdef Q_WS_WIN
- void _q_gestureTriggered();
-#endif
};
QT_END_NAMESPACE
diff --git a/src/gui/widgets/qpushbutton.cpp b/src/gui/widgets/qpushbutton.cpp
index 1352e1b..eb34336 100644
--- a/src/gui/widgets/qpushbutton.cpp
+++ b/src/gui/widgets/qpushbutton.cpp
@@ -590,7 +590,7 @@ void QPushButtonPrivate::_q_popupPressed()
int x = globalPos.x();
int y = globalPos.y();
if (horizontal) {
- if (globalPos.y() + rect.height() + menuSize.height() <= QApplication::desktop()->height()) {
+ if (globalPos.y() + rect.height() + menuSize.height() <= QApplication::desktop()->availableGeometry(q).height()) {
y += rect.height();
} else {
y -= menuSize.height();
@@ -598,7 +598,7 @@ void QPushButtonPrivate::_q_popupPressed()
if (q->layoutDirection() == Qt::RightToLeft)
x += rect.width() - menuSize.width();
} else {
- if (globalPos.x() + rect.width() + menu->sizeHint().width() <= QApplication::desktop()->width())
+ if (globalPos.x() + rect.width() + menu->sizeHint().width() <= QApplication::desktop()->availableGeometry(q).width())
x += rect.width();
else
x -= menuSize.width();
diff --git a/src/gui/widgets/qtextedit.cpp b/src/gui/widgets/qtextedit.cpp
index b894aa8..f477fee 100644
--- a/src/gui/widgets/qtextedit.cpp
+++ b/src/gui/widgets/qtextedit.cpp
@@ -2079,8 +2079,8 @@ void QTextEdit::setReadOnly(bool ro)
} else {
flags = Qt::TextEditorInteraction;
}
- setAttribute(Qt::WA_InputMethodEnabled, shouldEnableInputMethod(this));
d->control->setTextInteractionFlags(flags);
+ setAttribute(Qt::WA_InputMethodEnabled, shouldEnableInputMethod(this));
}
/*!
diff --git a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
index 55020a6..e828238 100644
--- a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
+++ b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp
@@ -52,6 +52,8 @@
#include "qaudiodeviceinfo_alsa_p.h"
+#include <alsa/version.h>
+
QT_BEGIN_NAMESPACE
QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray dev, QAudio::Mode mode)
@@ -151,8 +153,19 @@ bool QAudioDeviceInfoInternal::open()
int err = 0;
QString dev = device;
if(!dev.contains(QLatin1String("default"))) {
- int idx = snd_card_get_index(dev.toLocal8Bit().constData());
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
+ dev = QString(QLatin1String("default:CARD=%1")).arg(dev);
+#else
+ int idx = 0;
+ char *name;
+
+ while(snd_card_get_name(idx,&name) == 0) {
+ if(dev.contains(QLatin1String(name)))
+ break;
+ idx++;
+ }
dev = QString(QLatin1String("hw:%1,0")).arg(idx);
+#endif
}
if(mode == QAudio::AudioOutput) {
err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0);
@@ -184,8 +197,19 @@ bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const
// open()
if(!dev.contains(QLatin1String("default"))) {
- int idx = snd_card_get_index(dev.toLocal8Bit().constData());
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
+ dev = QString(QLatin1String("default:CARD=%1")).arg(dev);
+#else
+ int idx = 0;
+ char *name;
+
+ while(snd_card_get_name(idx,&name) == 0) {
+ if(dev.contains(QLatin1String(name)))
+ break;
+ idx++;
+ }
dev = QString(QLatin1String("hw:%1,0")).arg(idx);
+#endif
}
if(mode == QAudio::AudioOutput) {
err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0);
@@ -362,7 +386,7 @@ QList<QByteArray> QAudioDeviceInfoInternal::deviceList(QAudio::Mode mode)
{
QList<QByteArray> devices;
QByteArray filter;
-
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
// Create a list of all current audio devices that support mode
void **hints, **n;
char *name, *descr, *io;
@@ -404,7 +428,17 @@ QList<QByteArray> QAudioDeviceInfoInternal::deviceList(QAudio::Mode mode)
if(devices.size() > 0) {
devices.append("default");
}
+#else
+ int idx = 0;
+ char* name;
+ while(snd_card_get_name(idx,&name) == 0) {
+ devices.append(name);
+ idx++;
+ }
+ if (idx > 0)
+ devices.append("default");
+#endif
return devices;
}
diff --git a/src/multimedia/audio/qaudioinput_alsa_p.cpp b/src/multimedia/audio/qaudioinput_alsa_p.cpp
index 5e9aa81..9eb8cfb 100644
--- a/src/multimedia/audio/qaudioinput_alsa_p.cpp
+++ b/src/multimedia/audio/qaudioinput_alsa_p.cpp
@@ -249,6 +249,7 @@ bool QAudioInputPrivate::open()
QTime now(QTime::currentTime());
qDebug()<<now.second()<<"s "<<now.msec()<<"ms :open()";
#endif
+ clockStamp.restart();
timeStamp.restart();
elapsedTimeOffset = 0;
@@ -259,9 +260,21 @@ bool QAudioInputPrivate::open()
QString dev = QString(QLatin1String(m_device.constData()));
if(!dev.contains(QLatin1String("default"))) {
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
dev = QString(QLatin1String("default:CARD=%1")).arg(QLatin1String(m_device.constData()));
- }
+#else
+ int idx = 0;
+ char *name;
+ while(snd_card_get_name(idx,&name) == 0) {
+ if(m_device.contains(name))
+ break;
+ idx++;
+ }
+ dev = QString(QLatin1String("hw:%1,0")).arg(idx);
+#endif
+ }
+
// Step 1: try and open the device
while((count < 5) && (err < 0)) {
err=snd_pcm_open(&handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0);
@@ -601,6 +614,7 @@ qint64 QAudioInputPrivate::clock() const
if (deviceState == QAudio::StopState)
return 0;
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
snd_pcm_status_t* status;
snd_pcm_status_alloca(&status);
@@ -616,9 +630,12 @@ qint64 QAudioInputPrivate::clock() const
l = -l;
l %= 1000000;
}
- return ((t1.tv_sec * 1000)+l/1000);
+ return ((t1.tv_sec * 1000000)+l);
} else
return 0;
+#else
+ return clockStamp.elapsed()*1000;
+#endif
}
void QAudioInputPrivate::reset()
diff --git a/src/multimedia/audio/qaudioinput_alsa_p.h b/src/multimedia/audio/qaudioinput_alsa_p.h
index 5583ea0..2ed7453 100644
--- a/src/multimedia/audio/qaudioinput_alsa_p.h
+++ b/src/multimedia/audio/qaudioinput_alsa_p.h
@@ -117,6 +117,7 @@ private:
QTimer* timer;
QTime timeStamp;
+ QTime clockStamp;
qint64 elapsedTimeOffset;
int intervalTime;
char* audioBuffer;
diff --git a/src/multimedia/audio/qaudioinput_win32_p.cpp b/src/multimedia/audio/qaudioinput_win32_p.cpp
index b6b1efe..a059e76 100644
--- a/src/multimedia/audio/qaudioinput_win32_p.cpp
+++ b/src/multimedia/audio/qaudioinput_win32_p.cpp
@@ -544,7 +544,7 @@ qint64 QAudioInputPrivate::clock() const
if (deviceState == QAudio::StopState)
return 0;
- return timeStampOpened.elapsed();
+ return timeStampOpened.elapsed()*1000;
}
void QAudioInputPrivate::reset()
diff --git a/src/multimedia/audio/qaudiooutput_alsa_p.cpp b/src/multimedia/audio/qaudiooutput_alsa_p.cpp
index d814d97..689da89 100644
--- a/src/multimedia/audio/qaudiooutput_alsa_p.cpp
+++ b/src/multimedia/audio/qaudiooutput_alsa_p.cpp
@@ -282,7 +282,19 @@ bool QAudioOutputPrivate::open()
QString dev = QLatin1String(m_device.constData());
if(!dev.contains(QLatin1String("default"))) {
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
dev = QString(QLatin1String("default:CARD=%1")).arg(QLatin1String(m_device.constData()));
+#else
+ int idx = 0;
+ char *name;
+
+ while(snd_card_get_name(idx,&name) == 0) {
+ if(m_device.contains(name))
+ break;
+ idx++;
+ }
+ dev = QString(QLatin1String("hw:%1,0")).arg(idx);
+#endif
}
// Step 1: try and open the device
while((count < 5) && (err < 0)) {
@@ -407,6 +419,7 @@ bool QAudioOutputPrivate::open()
// Step 6: Start audio processing
timer->start(period_time/1000);
+ clockStamp.restart();
timeStamp.restart();
elapsedTimeOffset = 0;
errorState = QAudio::NoError;
@@ -653,6 +666,7 @@ qint64 QAudioOutputPrivate::clock() const
if (deviceState == QAudio::StopState)
return 0;
+#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14)
snd_pcm_status_t* status;
snd_pcm_status_alloca(&status);
@@ -668,9 +682,12 @@ qint64 QAudioOutputPrivate::clock() const
l = -l;
l %= 1000000;
}
- return ((t1.tv_sec * 1000)+l/1000);
+ return ((t1.tv_sec * 1000000)+l);
} else
return 0;
+#else
+ return clockStamp.elapsed()*1000;
+#endif
return 0;
}
diff --git a/src/multimedia/audio/qaudiooutput_alsa_p.h b/src/multimedia/audio/qaudiooutput_alsa_p.h
index 6d4177d..298e89e 100644
--- a/src/multimedia/audio/qaudiooutput_alsa_p.h
+++ b/src/multimedia/audio/qaudiooutput_alsa_p.h
@@ -134,6 +134,7 @@ private:
QByteArray m_device;
int bytesAvailable;
QTime timeStamp;
+ QTime clockStamp;
qint64 elapsedTimeOffset;
char* audioBuffer;
snd_pcm_t* handle;
diff --git a/src/multimedia/audio/qaudiooutput_win32_p.cpp b/src/multimedia/audio/qaudiooutput_win32_p.cpp
index 2c4a1c2..1810ed2 100644
--- a/src/multimedia/audio/qaudiooutput_win32_p.cpp
+++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp
@@ -496,7 +496,7 @@ qint64 QAudioOutputPrivate::clock() const
if (deviceState == QAudio::StopState)
return 0;
- return timeStampOpened.elapsed();
+ return timeStampOpened.elapsed()*1000;
}
QAudio::Error QAudioOutputPrivate::error() const
diff --git a/src/multimedia/video/qvideosurfaceformat.cpp b/src/multimedia/video/qvideosurfaceformat.cpp
index 2b0de96..e6ef8f3 100644
--- a/src/multimedia/video/qvideosurfaceformat.cpp
+++ b/src/multimedia/video/qvideosurfaceformat.cpp
@@ -58,7 +58,7 @@ public:
, scanLineDirection(QVideoSurfaceFormat::TopToBottom)
, pixelAspectRatio(1, 1)
, yuvColorSpace(QVideoSurfaceFormat::YCbCr_Undefined)
- , frameRate(0, 0)
+ , frameRate(0.0)
{
}
@@ -73,7 +73,7 @@ public:
, pixelAspectRatio(1, 1)
, yuvColorSpace(QVideoSurfaceFormat::YCbCr_Undefined)
, viewport(QPoint(0, 0), size)
- , frameRate(0, 0)
+ , frameRate(0.0)
{
}
@@ -100,7 +100,7 @@ public:
&& frameSize == other.frameSize
&& pixelAspectRatio == other.pixelAspectRatio
&& viewport == other.viewport
- && frameRate == other.frameRate
+ && frameRatesEqual(frameRate, other.frameRate)
&& yuvColorSpace == other.yuvColorSpace
&& propertyNames.count() == other.propertyNames.count()) {
for (int i = 0; i < propertyNames.count(); ++i) {
@@ -115,6 +115,11 @@ public:
}
}
+ inline static bool frameRatesEqual(qreal r1, qreal r2)
+ {
+ return qAbs(r1 - r2) <= 0.00001 * qMin(qAbs(r1), qAbs(r2));
+ }
+
QVideoFrame::PixelFormat pixelFormat;
QAbstractVideoBuffer::HandleType handleType;
QVideoSurfaceFormat::Direction scanLineDirection;
@@ -122,7 +127,7 @@ public:
QSize pixelAspectRatio;
QVideoSurfaceFormat::YuvColorSpace yuvColorSpace;
QRect viewport;
- QVideoSurfaceFormat::FrameRate frameRate;
+ qreal frameRate;
QList<QByteArray> propertyNames;
QList<QVariant> propertyValues;
};
@@ -201,15 +206,6 @@ public:
The full range Y'CbCr color space used in JPEG files.
*/
-
-/*!
- \typedef QVideoSurfaceFormat::FrameRate
-
- A pair of integers representing the frame rate of a video stream.
-
- The first number is the numerator and the second the denominator.
-*/
-
/*!
Constructs a null video stream format.
*/
@@ -415,41 +411,24 @@ void QVideoSurfaceFormat::setScanLineDirection(Direction direction)
}
/*!
- Returns the frame rate of a video stream.
-
- The frame rate is a rational number represented by a pair of integers.
- The first integer is the numerator and the second the denominator.
+ Returns the frame rate of a video stream in frames per second.
*/
-QVideoSurfaceFormat::FrameRate QVideoSurfaceFormat::frameRate() const
+qreal QVideoSurfaceFormat::frameRate() const
{
return d->frameRate;
}
/*!
- Sets the frame \a rate of a video stream.
-
- The frame rate is a rational number represented by a pair of integers.
- The first integer is the numerator and the second the denominator.
+ Sets the frame \a rate of a video stream in frames per second.
*/
-void QVideoSurfaceFormat::setFrameRate(const FrameRate &rate)
+void QVideoSurfaceFormat::setFrameRate(qreal rate)
{
d->frameRate = rate;
}
/*!
- \overload
-
- Sets the \a numerator and \a denominator of the frame rate of a video stream.
-*/
-
-void QVideoSurfaceFormat::setFrameRate(int numerator, int denominator)
-{
- d->frameRate = qMakePair(numerator, denominator);
-}
-
-/*!
Returns a video stream's pixel aspect ratio.
*/
@@ -599,8 +578,8 @@ void QVideoSurfaceFormat::setProperty(const char *name, const QVariant &value)
if (qVariantCanConvert<Direction>(value))
d->scanLineDirection = qvariant_cast<Direction>(value);
} else if (qstrcmp(name, "frameRate") == 0) {
- if (qVariantCanConvert<FrameRate>(value))
- d->frameRate = qvariant_cast<FrameRate>(value);
+ if (qVariantCanConvert<qreal>(value))
+ d->frameRate = qvariant_cast<qreal>(value);
} else if (qstrcmp(name, "pixelAspectRatio") == 0) {
if (qVariantCanConvert<QSize>(value))
d->pixelAspectRatio = qvariant_cast<QSize>(value);
diff --git a/src/multimedia/video/qvideosurfaceformat.h b/src/multimedia/video/qvideosurfaceformat.h
index b3005bd..1f4a5cb 100644
--- a/src/multimedia/video/qvideosurfaceformat.h
+++ b/src/multimedia/video/qvideosurfaceformat.h
@@ -87,8 +87,6 @@ public:
#endif
};
- typedef QPair<int, int> FrameRate;
-
QVideoSurfaceFormat();
QVideoSurfaceFormat(
const QSize &size,
@@ -120,9 +118,8 @@ public:
Direction scanLineDirection() const;
void setScanLineDirection(Direction direction);
- FrameRate frameRate() const;
- void setFrameRate(const FrameRate &rate);
- void setFrameRate(int numerator, int denominator = 1);
+ qreal frameRate() const;
+ void setFrameRate(qreal rate);
QSize pixelAspectRatio() const;
void setPixelAspectRatio(const QSize &ratio);
@@ -147,7 +144,6 @@ Q_MULTIMEDIA_EXPORT QDebug operator<<(QDebug, const QVideoSurfaceFormat &);
QT_END_NAMESPACE
-Q_DECLARE_METATYPE(QVideoSurfaceFormat::FrameRate)
Q_DECLARE_METATYPE(QVideoSurfaceFormat::Direction)
Q_DECLARE_METATYPE(QVideoSurfaceFormat::YuvColorSpace)
diff --git a/src/network/access/qhttp.cpp b/src/network/access/qhttp.cpp
index 69faee3..f006fba 100644
--- a/src/network/access/qhttp.cpp
+++ b/src/network/access/qhttp.cpp
@@ -121,6 +121,9 @@ public:
void _q_slotError(QAbstractSocket::SocketError);
void _q_slotClosed();
void _q_slotBytesWritten(qint64 numBytes);
+#ifndef QT_NO_OPENSSL
+ void _q_slotEncryptedBytesWritten(qint64 numBytes);
+#endif
void _q_slotDoFinished();
void _q_slotSendRequest();
void _q_continuePost();
@@ -135,6 +138,8 @@ public:
void closeConn();
void setSock(QTcpSocket *sock);
+ void postMoreData();
+
QTcpSocket *socket;
int reconnectAttempts;
bool deleteSocket;
@@ -2659,19 +2664,40 @@ void QHttpPrivate::_q_slotError(QAbstractSocket::SocketError err)
closeConn();
}
+#ifndef QT_NO_OPENSSL
+void QHttpPrivate::_q_slotEncryptedBytesWritten(qint64 written)
+{
+ Q_UNUSED(written);
+ postMoreData();
+}
+#endif
+
void QHttpPrivate::_q_slotBytesWritten(qint64 written)
{
Q_Q(QHttp);
bytesDone += written;
emit q->dataSendProgress(bytesDone, bytesTotal);
+ postMoreData();
+}
+// Send the POST data
+void QHttpPrivate::postMoreData()
+{
if (pendingPost)
return;
if (!postDevice)
return;
+ // the following is backported code from Qt 4.6 QNetworkAccessManager.
+ // We also have to check the encryptedBytesToWrite() if it is an SSL socket.
+#ifndef QT_NO_OPENSSL
+ QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
+ // if it is really an ssl socket, check more than just bytesToWrite()
+ if ((socket->bytesToWrite() + (sslSocket ? sslSocket->encryptedBytesToWrite() : 0)) == 0) {
+#else
if (socket->bytesToWrite() == 0) {
+#endif
int max = qMin<qint64>(4096, postDevice->size() - postDevice->pos());
QByteArray arr;
arr.resize(max);
@@ -3097,6 +3123,8 @@ void QHttpPrivate::setSock(QTcpSocket *sock)
if (qobject_cast<QSslSocket *>(socket)) {
QObject::connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)),
q, SIGNAL(sslErrors(const QList<QSslError> &)));
+ QObject::connect(socket, SIGNAL(encryptedBytesWritten(qint64)),
+ q, SLOT(_q_slotEncryptedBytesWritten(qint64)));
}
#endif
}
diff --git a/src/network/access/qhttp.h b/src/network/access/qhttp.h
index e5061ca..f30def2 100644
--- a/src/network/access/qhttp.h
+++ b/src/network/access/qhttp.h
@@ -290,6 +290,9 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_slotError(QAbstractSocket::SocketError))
Q_PRIVATE_SLOT(d_func(), void _q_slotClosed())
Q_PRIVATE_SLOT(d_func(), void _q_slotBytesWritten(qint64 numBytes))
+#ifndef QT_NO_OPENSSL
+ Q_PRIVATE_SLOT(d_func(), void _q_slotEncryptedBytesWritten(qint64 numBytes))
+#endif
Q_PRIVATE_SLOT(d_func(), void _q_slotDoFinished())
Q_PRIVATE_SLOT(d_func(), void _q_slotSendRequest())
Q_PRIVATE_SLOT(d_func(), void _q_continuePost())
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index beab9af..6962ab3 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -69,6 +69,11 @@ void QHttpNetworkConnectionChannel::init()
socket = new QTcpSocket;
#endif
+ // limit the socket read buffer size. we will read everything into
+ // the QHttpNetworkReply anyway, so let's grow only that and not
+ // here and there.
+ socket->setReadBufferSize(64*1024);
+
QObject::connect(socket, SIGNAL(bytesWritten(qint64)),
this, SLOT(_q_bytesWritten(qint64)),
Qt::DirectConnection);
@@ -100,6 +105,9 @@ void QHttpNetworkConnectionChannel::init()
QObject::connect(sslSocket, SIGNAL(sslErrors(const QList<QSslError>&)),
this, SLOT(_q_sslErrors(const QList<QSslError>&)),
Qt::DirectConnection);
+ QObject::connect(sslSocket, SIGNAL(encryptedBytesWritten(qint64)),
+ this, SLOT(_q_encryptedBytesWritten(qint64)),
+ Qt::DirectConnection);
}
#endif
}
@@ -876,6 +884,15 @@ void QHttpNetworkConnectionChannel::_q_sslErrors(const QList<QSslError> &errors)
//QNetworkReply::NetworkError errorCode = QNetworkReply::ProtocolFailure;
emit connection->sslErrors(errors);
}
+
+void QHttpNetworkConnectionChannel::_q_encryptedBytesWritten(qint64 bytes)
+{
+ Q_UNUSED(bytes);
+ // bytes have been written to the socket. write even more of them :)
+ if (isSocketWriting())
+ sendRequest();
+ // otherwise we do nothing
+}
#endif
QT_END_NAMESPACE
diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h
index 1d1153e..127a431 100644
--- a/src/network/access/qhttpnetworkconnectionchannel_p.h
+++ b/src/network/access/qhttpnetworkconnectionchannel_p.h
@@ -180,6 +180,7 @@ public:
#ifndef QT_NO_OPENSSL
void _q_encrypted(); // start sending request (https)
void _q_sslErrors(const QList<QSslError> &errors); // ssl errors from the socket
+ void _q_encryptedBytesWritten(qint64 bytes); // proceed sending
#endif
};
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 439d564..b1160aa 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -95,9 +95,10 @@ static void ensureInitialized()
/*!
\class QNetworkAccessManager
\brief The QNetworkAccessManager class allows the application to
- post network requests and receive replies
+ send network requests and receive replies
\since 4.4
+ \ingroup network
\inmodule QtNetwork
\reentrant
diff --git a/src/network/access/qnetworkreply.cpp b/src/network/access/qnetworkreply.cpp
index 4eb53bf..9ab4057 100644
--- a/src/network/access/qnetworkreply.cpp
+++ b/src/network/access/qnetworkreply.cpp
@@ -59,9 +59,10 @@ QNetworkReplyPrivate::QNetworkReplyPrivate()
\class QNetworkReply
\since 4.4
\brief The QNetworkReply class contains the data and headers for a request
- posted with QNetworkAccessManager
+ sent with QNetworkAccessManager
\reentrant
+ \ingroup network
\inmodule QtNetwork
The QNetworkReply class contains the data and meta data related to
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index 33bc57b..86195c6 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QNetworkRequest
- \brief The QNetworkRequest class holds one request to be sent with the Network Access API.
+ \brief The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.
\since 4.4
\ingroup network
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp
index c3b89ed..6f92424 100644
--- a/src/network/kernel/qnetworkproxy_win.cpp
+++ b/src/network/kernel/qnetworkproxy_win.cpp
@@ -399,7 +399,12 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro
if (isBypassed(query.peerHostName(), sp->proxyBypass))
return sp->defaultResult;
- return parseServerList(query, sp->proxyServerList);
+ QList<QNetworkProxy> result = parseServerList(query, sp->proxyServerList);
+ // In some cases, this was empty. See SF task 00062670
+ if (result.isEmpty())
+ return sp->defaultResult;
+
+ return result;
}
QT_END_NAMESPACE
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 86ccef2..9fb0b47 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -1578,6 +1578,13 @@ bool QAbstractSocket::setSocketDescriptor(int socketDescriptor, SocketState sock
*/
void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
{
+#ifndef QT_NO_OPENSSL
+ if (QSslSocket *sslSocket = qobject_cast<QSslSocket*>(this)) {
+ sslSocket->setSocketOption(option, value);
+ return;
+ }
+#endif
+
if (!d_func()->socketEngine)
return;
@@ -1600,6 +1607,12 @@ void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, cons
*/
QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
{
+#ifndef QT_NO_OPENSSL
+ if (QSslSocket *sslSocket = qobject_cast<QSslSocket*>(this)) {
+ return sslSocket->socketOption(option);
+ }
+#endif
+
if (!d_func()->socketEngine)
return QVariant();
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 0e9cb4f..2c88130 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -149,6 +149,13 @@
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (\l{http://www.openssl.org/}).
+ \note Be aware of the difference between the bytesWritten() signal and
+ the encryptedBytesWritten() signal. For a QTcpSocket, bytesWritten()
+ will get emitted as soon as data has been written to the TCP socket.
+ For a QSslSocket, bytesWritten() will get emitted when the data
+ is being encrypted and encryptedBytesWritten()
+ will get emitted as soon as data has been written to the TCP socket.
+
\sa QSslCertificate, QSslCipher, QSslError
*/
@@ -460,6 +467,22 @@ bool QSslSocket::setSocketDescriptor(int socketDescriptor, SocketState state, Op
return retVal;
}
+void QSslSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
+{
+ Q_D(QSslSocket);
+ if (d->plainSocket)
+ d->plainSocket->setSocketOption(option, value);
+}
+
+QVariant QSslSocket::socketOption(QAbstractSocket::SocketOption option)
+{
+ Q_D(QSslSocket);
+ if (d->plainSocket)
+ return d->plainSocket->socketOption(option);
+ else
+ return QVariant();
+}
+
/*!
Returns the current mode for the socket; either UnencryptedMode, where
QSslSocket behaves identially to QTcpSocket, or one of SslClientMode or
@@ -1717,6 +1740,11 @@ qint64 QSslSocket::readData(char *data, qint64 maxlen)
#ifdef QSSLSOCKET_DEBUG
qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") ==" << readBytes;
#endif
+
+ // possibly trigger another transmit() to decrypt more data from the socket
+ if (d->readBuffer.isEmpty() && d->plainSocket->bytesAvailable())
+ QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
+
return readBytes;
}
@@ -2111,6 +2139,16 @@ void QSslSocketPrivate::_q_flushWriteBuffer()
q->flush();
}
+/*!
+ \internal
+*/
+void QSslSocketPrivate::_q_flushReadBuffer()
+{
+ // trigger a read from the plainSocket into SSL
+ if (mode != QSslSocket::UnencryptedMode)
+ transmit();
+}
+
QT_END_NAMESPACE
// For private slots
diff --git a/src/network/ssl/qsslsocket.h b/src/network/ssl/qsslsocket.h
index a41e600..82cda35 100644
--- a/src/network/ssl/qsslsocket.h
+++ b/src/network/ssl/qsslsocket.h
@@ -90,6 +90,10 @@ public:
bool setSocketDescriptor(int socketDescriptor, SocketState state = ConnectedState,
OpenMode openMode = ReadWrite);
+ // ### Qt 5: Make virtual
+ void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
+ QVariant socketOption(QAbstractSocket::SocketOption option);
+
SslMode mode() const;
bool isEncrypted() const;
@@ -203,6 +207,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_readyReadSlot())
Q_PRIVATE_SLOT(d_func(), void _q_bytesWrittenSlot(qint64))
Q_PRIVATE_SLOT(d_func(), void _q_flushWriteBuffer())
+ Q_PRIVATE_SLOT(d_func(), void _q_flushReadBuffer())
friend class QSslSocketBackendPrivate;
};
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index 24d4ebe..ee21956 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -120,6 +120,7 @@ public:
void _q_readyReadSlot();
void _q_bytesWrittenSlot(qint64);
void _q_flushWriteBuffer();
+ void _q_flushReadBuffer();
// Platform specific functions
virtual void startClientEncryption() = 0;
diff --git a/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp b/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp
index 24606bc..ab2026c 100644
--- a/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp
+++ b/src/opengl/gl2paintengineex/qglcustomshaderstage.cpp
@@ -52,7 +52,7 @@ public:
QGLCustomShaderStagePrivate() :
m_manager(0) {}
- QGLEngineShaderManager* m_manager;
+ QPointer<QGLEngineShaderManager> m_manager;
QByteArray m_source;
};
diff --git a/src/opengl/gl2paintengineex/qglengineshadersource_p.h b/src/opengl/gl2paintengineex/qglengineshadersource_p.h
index 6712bf6..3eef808 100644
--- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h
+++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h
@@ -131,7 +131,6 @@ static const char* const qglslPositionWithPatternBrushVertexShader = "\
gl_Position.xy = gl_Position.xy * invertedHTexCoordsZ; \
gl_Position.w = invertedHTexCoordsZ; \
patternTexCoords.xy = (hTexCoords.xy * 0.125) * invertedHTexCoordsZ; \
- patternTexCoords.y = -patternTexCoords.y; \
}";
static const char* const qglslAffinePositionWithPatternBrushVertexShader
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index ab02c69..bcc6bdb 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -81,6 +81,8 @@
#include "qglengineshadermanager_p.h"
#include "qgl2pexvertexarray_p.h"
+#include "qtriangulatingstroker_p.h"
+
#include <QDebug>
QT_BEGIN_NAMESPACE
@@ -469,8 +471,6 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms()
QPointF translationPoint;
if (style <= Qt::DiagCrossPattern) {
- translationPoint = q->state()->brushOrigin;
-
QColor col = qt_premultiplyColor(currentBrush->color(), (GLfloat)q->state()->opacity);
shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::PatternColor), col);
@@ -528,8 +528,6 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms()
shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::HalfViewportSize), halfViewportSize);
}
else if (style == Qt::TexturePattern) {
- translationPoint = q->state()->brushOrigin;
-
const QPixmap& texPixmap = currentBrush->texture();
if (qHasPixmapTexture(*currentBrush) && currentBrush->texture().isQBitmap()) {
@@ -546,9 +544,13 @@ void QGL2PaintEngineExPrivate::updateBrushUniforms()
else
qWarning("QGL2PaintEngineEx: Unimplemented fill style");
+ const QPointF &brushOrigin = q->state()->brushOrigin;
+ QTransform matrix = q->state()->matrix;
+ matrix.translate(brushOrigin.x(), brushOrigin.y());
+
QTransform translate(1, 0, 0, 1, -translationPoint.x(), -translationPoint.y());
QTransform gl_to_qt(1, 0, 0, -1, 0, height);
- QTransform inv_matrix = gl_to_qt * (brushQTransform * q->state()->matrix).inverted() * translate;
+ QTransform inv_matrix = gl_to_qt * (brushQTransform * matrix).inverted() * translate;
shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BrushTransform), inv_matrix);
shaderManager->currentProgram()->setUniformValue(location(QGLEngineShaderManager::BrushTexture), QT_BRUSH_TEXTURE_UNIT);
@@ -572,7 +574,6 @@ void QGL2PaintEngineExPrivate::updateMatrix()
//
// We expand out the multiplication to save the cost of a full 4x4
// matrix multiplication as most of the components are trivial.
-
const QTransform& transform = q->state()->matrix;
if (mode == TextDrawingMode) {
@@ -628,6 +629,9 @@ void QGL2PaintEngineExPrivate::updateMatrix()
// The actual data has been updated so both shader program's uniforms need updating
simpleShaderMatrixUniformDirty = true;
shaderMatrixUniformDirty = true;
+
+ dasher.setInvScale(inverseScale);
+ stroker.setInvScale(inverseScale);
}
@@ -838,28 +842,6 @@ void QGL2PaintEngineExPrivate::transferMode(EngineMode newMode)
mode = newMode;
}
-void QGL2PaintEngineExPrivate::drawOutline(const QVectorPath& path)
-{
- transferMode(BrushDrawingMode);
-
- // Might need to call updateMatrix to re-calculate inverseScale
- if (matrixDirty)
- updateMatrix();
-
- vertexCoordinateArray.clear();
- vertexCoordinateArray.addPath(path, inverseScale);
-
- if (path.hasImplicitClose()) {
- // Close the path's outline
- vertexCoordinateArray.lineToArray(path.points()[0], path.points()[1]);
- vertexCoordinateArray.stops().last() += 1;
- }
-
- prepareForDraw(currentBrush->isOpaque());
- drawVertexArrays(vertexCoordinateArray, GL_LINE_STRIP);
-}
-
-
// Assumes everything is configured for the brush you want to use
void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
{
@@ -922,8 +904,14 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
}
-void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(QGL2PEXVertexArray& vertexArray, bool useWindingFill)
+void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(const float *data,
+ int count,
+ const QVector<int> *stops,
+ const QGLRect &bounds,
+ StencilFillMode mode)
{
+ Q_ASSERT(count || stops);
+
// qDebug("QGL2PaintEngineExPrivate::fillStencilWithVertexArray()");
glStencilMask(0xff); // Enable stencil writes
@@ -955,19 +943,20 @@ void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(QGL2PEXVertexArray& ve
}
#endif
- if (useWindingFill) {
+ if (mode == WindingFillMode) {
+ Q_ASSERT(stops && !count);
if (q->state()->clipTestEnabled) {
// Flatten clip values higher than current clip, and set high bit to match current clip
glStencilFunc(GL_LEQUAL, GL_STENCIL_HIGH_BIT | q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
- composite(vertexArray.boundingRect());
+ composite(bounds);
glStencilFunc(GL_EQUAL, GL_STENCIL_HIGH_BIT, GL_STENCIL_HIGH_BIT);
} else if (!stencilClean) {
// Clear stencil buffer within bounding rect
glStencilFunc(GL_ALWAYS, 0, 0xff);
glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
- composite(vertexArray.boundingRect());
+ composite(bounds);
}
// Inc. for front-facing triangle
@@ -975,19 +964,43 @@ void QGL2PaintEngineExPrivate::fillStencilWithVertexArray(QGL2PEXVertexArray& ve
// Dec. for back-facing "holes"
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_DECR_WRAP);
glStencilMask(~GL_STENCIL_HIGH_BIT);
- drawVertexArrays(vertexArray, GL_TRIANGLE_FAN);
+ drawVertexArrays(data, stops, GL_TRIANGLE_FAN);
if (q->state()->clipTestEnabled) {
// Clear high bit of stencil outside of path
glStencilFunc(GL_EQUAL, q->state()->currentClip, ~GL_STENCIL_HIGH_BIT);
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
glStencilMask(GL_STENCIL_HIGH_BIT);
- composite(vertexArray.boundingRect());
+ composite(bounds);
}
- } else {
+ } else if (mode == OddEvenFillMode) {
glStencilMask(GL_STENCIL_HIGH_BIT);
glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
- drawVertexArrays(vertexArray, GL_TRIANGLE_FAN);
+ drawVertexArrays(data, stops, GL_TRIANGLE_FAN);
+
+ } else { // TriStripStrokeFillMode
+ Q_ASSERT(count && !stops); // tristrips generated directly, so no vertexArray or stops
+ glStencilMask(GL_STENCIL_HIGH_BIT);
+#if 0
+ glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
+ glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+ glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
+ glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+#else
+
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ if (q->state()->clipTestEnabled) {
+ glStencilFunc(GL_LEQUAL, q->state()->currentClip | GL_STENCIL_HIGH_BIT,
+ ~GL_STENCIL_HIGH_BIT);
+ } else {
+ glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff);
+ }
+ glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+ glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
+ glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+#endif
}
// Enable color writes & disable stencil writes
@@ -1122,14 +1135,15 @@ void QGL2PaintEngineExPrivate::composite(const QGLRect& boundingRect)
}
// Draws the vertex array as a set of <vertexArrayStops.size()> triangle fans.
-void QGL2PaintEngineExPrivate::drawVertexArrays(QGL2PEXVertexArray& vertexArray, GLenum primitive)
+void QGL2PaintEngineExPrivate::drawVertexArrays(const float *data, const QVector<int> *stops,
+ GLenum primitive)
{
// Now setup the pointer to the vertex array:
glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
- glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray.data());
+ glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
int previousStop = 0;
- foreach(int stop, vertexArray.stops()) {
+ foreach(int stop, *stops) {
/*
qDebug("Drawing triangle fan for vertecies %d -> %d:", previousStop, stop-1);
for (int i=previousStop; i<stop; ++i)
@@ -1180,12 +1194,29 @@ void QGL2PaintEngineEx::fill(const QVectorPath &path, const QBrush &brush)
{
Q_D(QGL2PaintEngineEx);
- if (qbrush_style(brush) == Qt::NoBrush)
+ Qt::BrushStyle style = qbrush_style(brush);
+ if (style == Qt::NoBrush)
return;
if (!d->inRenderText)
ensureActive();
+
+ QOpenGL2PaintEngineState *s = state();
+ bool doOffset = !(s->renderHints & QPainter::Antialiasing) && style == Qt::SolidPattern;
+
+ if (doOffset) {
+ d->temporaryTransform = s->matrix;
+ QTransform tx = QTransform::fromTranslate(.49, .49);
+ s->matrix = s->matrix * tx;
+ d->matrixDirty = true;
+ }
+
d->setBrush(&brush);
d->fill(path);
+
+ if (doOffset) {
+ s->matrix = d->temporaryTransform;
+ d->matrixDirty = true;
+ }
}
void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
@@ -1197,23 +1228,89 @@ void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
if (penStyle == Qt::NoPen || qbrush_style(penBrush) == Qt::NoBrush)
return;
+ QOpenGL2PaintEngineState *s = state();
+
ensureActive();
- qreal penWidth = qpen_widthf(pen);
- if ( (pen.isCosmetic() && (penStyle == Qt::SolidLine)) && (penWidth < 2.5f) )
- {
- // We only handle solid, cosmetic pens with a width of 1 pixel
- const QBrush& brush = pen.brush();
- d->setBrush(&brush);
+ bool doOffset = !(s->renderHints & QPainter::Antialiasing);
+ if (doOffset) {
+ d->temporaryTransform = s->matrix;
+ QTransform tx = QTransform::fromTranslate(0.49, .49);
+ s->matrix = s->matrix * tx;
+ d->matrixDirty = true;
+ }
- if (penWidth < 0.01f)
- glLineWidth(1.0);
- else
- glLineWidth(penWidth);
+ bool opaque = penBrush.isOpaque() && s->opacity > 0.99;
+ d->setBrush(&penBrush);
+ d->transferMode(BrushDrawingMode);
+
+ // updateMatrix() is responsible for setting the inverse scale on
+ // the strokers, so we need to call it here and not wait for
+ // prepareForDraw() down below.
+ d->updateMatrix();
+
+ if (penStyle == Qt::SolidLine) {
+ d->stroker.process(path, pen);
+
+ } else { // Some sort of dash
+ d->dasher.process(path, pen);
+
+ QVectorPath dashStroke(d->dasher.points(),
+ d->dasher.elementCount(),
+ d->dasher.elementTypes());
+ d->stroker.process(dashStroke, pen);
+ }
+
+
+ QGLContext *ctx = d->ctx;
+
+ if (opaque) {
+ d->prepareForDraw(opaque);
+ glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+ glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, false, 0, d->stroker.vertices());
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, d->stroker.vertexCount() / 2);
+
+// QBrush b(Qt::green);
+// d->setBrush(&b);
+// d->prepareForDraw(true);
+// glDrawArrays(GL_LINE_STRIP, 0, d->stroker.vertexCount() / 2);
+
+ glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+
+ } else {
+ qreal width = qpen_widthf(pen) / 2;
+ if (width == 0)
+ width = 0.5;
+ qreal extra = pen.joinStyle() == Qt::MiterJoin
+ ? qMax(pen.miterLimit() * width, width)
+ : width;
+
+ if (pen.isCosmetic())
+ extra = extra * d->inverseScale;
+
+ QRectF bounds = path.controlPointRect().adjusted(-extra, -extra, extra, extra);
+
+ d->fillStencilWithVertexArray(d->stroker.vertices(), d->stroker.vertexCount() / 2,
+ 0, bounds, QGL2PaintEngineExPrivate::TriStripStrokeFillMode);
+
+ glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+
+ // Pass when any bit is set, replace stencil value with 0
+ glStencilFunc(GL_NOTEQUAL, 0, GL_STENCIL_HIGH_BIT);
+ d->prepareForDraw(false);
+
+ // Stencil the brush onto the dest buffer
+ d->composite(bounds);
- d->drawOutline(path);
- } else
- return QPaintEngineEx::stroke(path, pen);
+ glStencilMask(0);
+
+ d->updateClipScissorTest();
+ }
+
+ if (doOffset) {
+ s->matrix = d->temporaryTransform;
+ d->matrixDirty = true;
+ }
}
void QGL2PaintEngineEx::penChanged() { }
@@ -1542,7 +1639,7 @@ void QGL2PaintEngineEx::drawPixmaps(const QDrawPixmaps::Data *drawingData, int d
s = qFastSin(drawingData[i].rotation * Q_PI / 180);
c = qFastCos(drawingData[i].rotation * Q_PI / 180);
}
-
+
qreal right = 0.5 * drawingData[i].scaleX * drawingData[i].source.width();
qreal bottom = 0.5 * drawingData[i].scaleY * drawingData[i].source.height();
QGLPoint bottomRight(right * c - bottom * s, right * s + bottom * c);
@@ -1625,7 +1722,6 @@ bool QGL2PaintEngineEx::begin(QPaintDevice *pdev)
const QSize sz = d->device->size();
d->width = sz.width();
d->height = sz.height();
- d->last_created_state = 0;
d->mode = BrushDrawingMode;
d->brushTextureDirty = true;
d->brushUniformsDirty = true;
@@ -2023,27 +2119,32 @@ void QGL2PaintEngineEx::setState(QPainterState *new_state)
QPaintEngineEx::setState(s);
- if (s == d->last_created_state) {
- d->last_created_state = 0;
+ if (s->isNew) {
+ // Newly created state object. The call to setState()
+ // will either be followed by a call to begin(), or we are
+ // setting the state as part of a save().
+ s->isNew = false;
return;
}
- if (old_state == s || s->renderHintsChanged)
+ // Setting the state as part of a restore().
+
+ if (old_state == s || old_state->renderHintsChanged)
renderHintsChanged();
- if (old_state == s || s->matrixChanged) {
+ if (old_state == s || old_state->matrixChanged) {
d->matrixDirty = true;
d->simpleShaderMatrixUniformDirty = true;
d->shaderMatrixUniformDirty = true;
}
- if (old_state == s || s->compositionModeChanged)
+ if (old_state == s || old_state->compositionModeChanged)
d->compositionModeDirty = true;
- if (old_state == s || s->opacityChanged)
+ if (old_state == s || old_state->opacityChanged)
d->opacityUniformDirty = true;
- if (old_state == s || s->clipChanged) {
+ if (old_state == s || old_state->clipChanged) {
if (old_state && old_state != s && old_state->canRestoreClip) {
d->updateClipScissorTest();
glDepthFunc(GL_LEQUAL);
@@ -2055,8 +2156,6 @@ void QGL2PaintEngineEx::setState(QPainterState *new_state)
QPainterState *QGL2PaintEngineEx::createState(QPainterState *orig) const
{
- Q_D(const QGL2PaintEngineEx);
-
if (orig)
const_cast<QGL2PaintEngineEx *>(this)->ensureActive();
@@ -2072,7 +2171,6 @@ QPainterState *QGL2PaintEngineEx::createState(QPainterState *orig) const
s->renderHintsChanged = false;
s->clipChanged = false;
- d->last_created_state = s;
return s;
}
@@ -2085,6 +2183,7 @@ void QGL2PaintEngineEx::setRenderTextActive(bool active)
QOpenGL2PaintEngineState::QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &other)
: QPainterState(other)
{
+ isNew = true;
needsClipBufferClear = other.needsClipBufferClear;
clipTestEnabled = other.clipTestEnabled;
currentClip = other.currentClip;
@@ -2094,6 +2193,7 @@ QOpenGL2PaintEngineState::QOpenGL2PaintEngineState(QOpenGL2PaintEngineState &oth
QOpenGL2PaintEngineState::QOpenGL2PaintEngineState()
{
+ isNew = true;
needsClipBufferClear = true;
clipTestEnabled = false;
canRestoreClip = true;
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
index 46be398..209cd36 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2_p.h
@@ -62,6 +62,7 @@
#include <private/qglpixmapfilter_p.h>
#include <private/qfontengine_p.h>
#include <private/qdatabuffer_p.h>
+#include <private/qtriangulatingstroker_p.h>
enum EngineMode {
ImageDrawingMode,
@@ -82,6 +83,7 @@ public:
QOpenGL2PaintEngineState();
~QOpenGL2PaintEngineState();
+ uint isNew : 1;
uint needsClipBufferClear : 1;
uint clipTestEnabled : 1;
uint canRestoreClip : 1;
@@ -159,6 +161,12 @@ class QGL2PaintEngineExPrivate : public QPaintEngineExPrivate
{
Q_DECLARE_PUBLIC(QGL2PaintEngineEx)
public:
+ enum StencilFillMode {
+ OddEvenFillMode,
+ WindingFillMode,
+ TriStripStrokeFillMode
+ };
+
QGL2PaintEngineExPrivate(QGL2PaintEngineEx *q_ptr) :
q(q_ptr),
width(0), height(0),
@@ -184,15 +192,24 @@ public:
// fill, drawOutline, drawTexture & drawCachedGlyphs are the rendering entry points:
void fill(const QVectorPath &path);
- void drawOutline(const QVectorPath& path);
void drawTexture(const QGLRect& dest, const QGLRect& src, const QSize &textureSize, bool opaque, bool pattern = false);
void drawCachedGlyphs(const QPointF &p, QFontEngineGlyphCache::Type glyphType, const QTextItemInt &ti);
- void drawVertexArrays(QGL2PEXVertexArray& vertexArray, GLenum primitive);
+ void drawVertexArrays(const float *data, const QVector<int> *stops, GLenum primitive);
+ void drawVertexArrays(QGL2PEXVertexArray &vertexArray, GLenum primitive) {
+ drawVertexArrays((const float *) vertexArray.data(), &vertexArray.stops(), primitive);
+ }
+
// ^ draws whatever is in the vertex array
void composite(const QGLRect& boundingRect);
// ^ Composites the bounding rect onto dest buffer
- void fillStencilWithVertexArray(QGL2PEXVertexArray& vertexArray, bool useWindingFill);
+
+ void fillStencilWithVertexArray(const float *data, int count, const QVector<int> *stops, const QGLRect &bounds, StencilFillMode mode);
+ void fillStencilWithVertexArray(QGL2PEXVertexArray& vertexArray, bool useWindingFill) {
+ fillStencilWithVertexArray((const float *) vertexArray.data(), 0, &vertexArray.stops(),
+ vertexArray.boundingRect(),
+ useWindingFill ? WindingFillMode : OddEvenFillMode);
+ }
// ^ Calls drawVertexArrays to render into stencil buffer
bool prepareForDraw(bool srcPixelsAreOpaque);
@@ -212,8 +229,6 @@ public:
EngineMode mode;
QFontEngineGlyphCache::Type glyphCacheType;
- mutable QOpenGL2PaintEngineState *last_created_state;
-
// Dirty flags
bool matrixDirty; // Implies matrix uniforms are also dirty
bool compositionModeDirty;
@@ -267,6 +282,10 @@ public:
float textureInvertedY;
+ QTriangulatingStroker stroker;
+ QDashedStrokeProcessor dasher;
+ QTransform temporaryTransform;
+
QScopedPointer<QPixmapFilter> convolutionFilter;
QScopedPointer<QPixmapFilter> colorizeFilter;
QScopedPointer<QPixmapFilter> blurFilter;
diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp
new file mode 100644
index 0000000..a3c8266
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp
@@ -0,0 +1,340 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtriangulatingstroker_p.h"
+#include <qmath.h>
+
+
+#define CURVE_FLATNESS Q_PI / 8
+
+
+
+
+void QTriangulatingStroker::endCapOrJoinClosed(const qreal *start, const qreal *cur,
+ bool implicitClose, bool endsAtStart)
+{
+ if (endsAtStart) {
+ join(start + 2);
+ } else if (implicitClose) {
+ join(start);
+ lineTo(start);
+ join(start+2);
+ } else {
+ endCap(cur);
+ }
+}
+
+
+void QTriangulatingStroker::process(const QVectorPath &path, const QPen &pen)
+{
+ const qreal *pts = path.points();
+ const QPainterPath::ElementType *types = path.elements();
+ int count = path.elementCount();
+ if (count < 2)
+ return;
+
+ float realWidth = qpen_widthf(pen);
+ if (realWidth == 0)
+ realWidth = 1;
+
+ m_width = realWidth / 2;
+
+ bool cosmetic = pen.isCosmetic();
+ if (cosmetic) {
+ m_width = m_width * m_inv_scale;
+ }
+
+ m_join_style = qpen_joinStyle(pen);
+ m_cap_style = qpen_capStyle(pen);
+ m_vertices.reset();
+ m_miter_limit = pen.miterLimit() * qpen_widthf(pen);
+
+ // The curvyness is based on the notion that I originally wanted
+ // roughly one line segment pr 4 pixels. This may seem little, but
+ // because we sample at constantly incrementing B(t) E [0<t<1], we
+ // will get longer segments where the curvature is small and smaller
+ // segments when the curvature is high.
+ //
+ // To get a rough idea of the length of each curve, I pretend that
+ // the curve is a 90 degree arc, whose radius is
+ // qMax(curveBounds.width, curveBounds.height). Based on this
+ // logic we can estimate the length of the outline edges based on
+ // the radius + a pen width and adjusting for scale factors
+ // depending on if the pen is cosmetic or not.
+ //
+ // The curvyness value of PI/14 was based on,
+ // arcLength=2*PI*r/4=PI/2 and splitting length into somewhere
+ // between 3 and 8 where 5 seemed to be give pretty good results
+ // hence: Q_PI/14. Lower divisors will give more detail at the
+ // direct cost of performance.
+
+ // simplfy pens that are thin in device size (2px wide or less)
+ if (realWidth < 2.5 && (cosmetic || m_inv_scale == 1)) {
+ if (m_cap_style == Qt::RoundCap)
+ m_cap_style = Qt::SquareCap;
+ if (m_join_style == Qt::RoundJoin)
+ m_join_style = Qt::MiterJoin;
+ m_curvyness_add = 0.5;
+ m_curvyness_mul = CURVE_FLATNESS;
+ m_roundness = 1;
+ } else if (cosmetic) {
+ m_curvyness_add = realWidth / 2;
+ m_curvyness_mul = CURVE_FLATNESS;
+ m_roundness = qMax<int>(4, realWidth * CURVE_FLATNESS);
+ } else {
+ m_curvyness_add = m_width;
+ m_curvyness_mul = CURVE_FLATNESS / m_inv_scale;
+ m_roundness = qMax<int>(4, realWidth * m_curvyness_mul);
+ }
+
+ // Over this level of segmentation, there doesn't seem to be any
+ // benefit, even for huge penWidth
+ if (m_roundness > 24)
+ m_roundness = 24;
+
+ m_sin_theta = qSin(Q_PI / m_roundness); // ### Use qFastSin
+ m_cos_theta = qCos(Q_PI / m_roundness);
+
+ const qreal *endPts = pts + (count<<1);
+ const qreal *startPts;
+
+ Qt::PenCapStyle cap = m_cap_style;
+
+ if (!types) {
+ startPts = pts;
+
+ bool endsAtStart = startPts[0] == *(endPts-2) && startPts[1] == *(endPts-1);
+
+ Qt::PenCapStyle cap = m_cap_style;
+ if (endsAtStart || path.hasImplicitClose())
+ m_cap_style = Qt::FlatCap;
+ moveTo(pts);
+ m_cap_style = cap;
+ pts += 2;
+ lineTo(pts);
+ pts += 2;
+ while (pts < endPts) {
+ join(pts);
+ lineTo(pts);
+ pts += 2;
+ }
+
+ endCapOrJoinClosed(startPts, pts-2, path.hasImplicitClose(), endsAtStart);
+
+ } else {
+ bool endsAtStart;
+ while (pts < endPts) {
+ switch (*types) {
+ case QPainterPath::MoveToElement: {
+ if (pts != path.points())
+ endCapOrJoinClosed(startPts, pts, path.hasImplicitClose(), endsAtStart);
+
+ startPts = pts;
+ int end = (endPts - pts) / 2;
+ int i = 2; // Start looking to ahead since we never have two moveto's in a row
+ while (i<end && types[i] != QPainterPath::MoveToElement) {
+ ++i;
+ }
+ endsAtStart = startPts[0] == pts[i*2 - 2] && startPts[1] == pts[i*2 - 1];
+ if (endsAtStart || path.hasImplicitClose())
+ m_cap_style = Qt::FlatCap;
+
+ moveTo(pts);
+ m_cap_style = cap;
+ pts+=2;
+ ++types;
+ break; }
+ case QPainterPath::LineToElement:
+ if (*(types - 1) != QPainterPath::MoveToElement)
+ join(pts);
+ lineTo(pts);
+ pts+=2;
+ ++types;
+ break;
+ case QPainterPath::CurveToElement:
+ if (*(types - 1) != QPainterPath::MoveToElement)
+ join(pts);
+ cubicTo(pts);
+ pts+=6;
+ types+=3;
+ break;
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+ }
+
+ endCapOrJoinClosed(startPts, pts-2, path.hasImplicitClose(), endsAtStart);
+ }
+}
+
+void QTriangulatingStroker::cubicTo(const qreal *pts)
+{
+ const QPointF *p = (const QPointF *) pts;
+ QBezier bezier = QBezier::fromPoints(*(p - 1), p[0], p[1], p[2]);
+
+ QRectF bounds = bezier.bounds();
+ float rad = qMax(bounds.width(), bounds.height());
+ int threshold = qMin<float>(64, (rad + m_curvyness_add) * m_curvyness_mul);
+ if (threshold < 4)
+ threshold = 4;
+ qreal threshold_minus_1 = threshold - 1;
+ float vx, vy;
+
+ float cx = m_cx, cy = m_cy;
+ float x, y;
+
+ for (int i=1; i<threshold; ++i) {
+ qreal t = qreal(i) / threshold_minus_1;
+ QPointF p = bezier.pointAt(t);
+ x = p.x();
+ y = p.y();
+
+ normalVector(cx, cy, x, y, &vx, &vy);
+
+ emitLineSegment(x, y, vx, vy);
+
+ cx = x;
+ cy = y;
+ }
+
+ m_cx = cx;
+ m_cy = cy;
+
+ m_nvx = vx;
+ m_nvy = vy;
+}
+
+
+
+static void qdashprocessor_moveTo(qreal x, qreal y, void *data)
+{
+ ((QDashedStrokeProcessor *) data)->addElement(QPainterPath::MoveToElement, x, y);
+}
+
+static void qdashprocessor_lineTo(qreal x, qreal y, void *data)
+{
+ ((QDashedStrokeProcessor *) data)->addElement(QPainterPath::LineToElement, x, y);
+}
+
+static void qdashprocessor_cubicTo(qreal, qreal, qreal, qreal, qreal, qreal, void *)
+{
+ Q_ASSERT(0); // The dasher should not produce curves...
+}
+
+QDashedStrokeProcessor::QDashedStrokeProcessor()
+ : m_dash_stroker(0), m_inv_scale(1)
+{
+ m_dash_stroker.setMoveToHook(qdashprocessor_moveTo);
+ m_dash_stroker.setLineToHook(qdashprocessor_lineTo);
+ m_dash_stroker.setCubicToHook(qdashprocessor_cubicTo);
+}
+
+void QDashedStrokeProcessor::process(const QVectorPath &path, const QPen &pen)
+{
+
+ const qreal *pts = path.points();
+ const QPainterPath::ElementType *types = path.elements();
+ int count = path.elementCount();
+
+ m_points.reset();
+ m_types.reset();
+
+ qreal width = pen.width();
+ if (width == 0)
+ width = 1;
+
+ m_dash_stroker.setDashPattern(pen.dashPattern());
+ m_dash_stroker.setStrokeWidth(width);
+ m_dash_stroker.setMiterLimit(pen.miterLimit());
+ qreal curvyness = sqrt(width) * m_inv_scale / 8;
+
+ if (count < 2)
+ return;
+
+ const qreal *endPts = pts + (count<<1);
+
+ m_dash_stroker.begin(this);
+
+ if (!types) {
+ m_dash_stroker.moveTo(pts[0], pts[1]);
+ pts += 2;
+ while (pts < endPts) {
+ m_dash_stroker.lineTo(pts[0], pts[1]);
+ pts += 2;
+ }
+ } else {
+ while (pts < endPts) {
+ switch (*types) {
+ case QPainterPath::MoveToElement:
+ m_dash_stroker.moveTo(pts[0], pts[1]);
+ pts += 2;
+ ++types;
+ break;
+ case QPainterPath::LineToElement:
+ m_dash_stroker.lineTo(pts[0], pts[1]);
+ pts += 2;
+ ++types;
+ break;
+ case QPainterPath::CurveToElement: {
+ QBezier b = QBezier::fromPoints(*(((const QPointF *) pts) - 1),
+ *(((const QPointF *) pts)),
+ *(((const QPointF *) pts) + 1),
+ *(((const QPointF *) pts) + 2));
+ QRectF bounds = b.bounds();
+ int threshold = qMin<float>(64, qMax(bounds.width(), bounds.height()) * curvyness);
+ if (threshold < 4)
+ threshold = 4;
+ qreal threshold_minus_1 = threshold - 1;
+ for (int i=0; i<threshold; ++i) {
+ QPointF pt = b.pointAt(i / threshold_minus_1);
+ m_dash_stroker.lineTo(pt.x(), pt.y());
+ }
+ pts += 6;
+ types += 3;
+ break; }
+ default: break;
+ }
+ }
+ }
+
+ m_dash_stroker.end();
+}
diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h
new file mode 100644
index 0000000..b7354db
--- /dev/null
+++ b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h
@@ -0,0 +1,299 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTRIANGULATINGSTROKER_P_H
+#define QTRIANGULATINGSTROKER_P_H
+
+#include <private/qdatabuffer_p.h>
+#include <private/qvectorpath_p.h>
+#include <private/qbezier_p.h>
+#include <private/qnumeric_p.h>
+#include <private/qmath_p.h>
+
+
+class QTriangulatingStroker
+{
+public:
+ void process(const QVectorPath &path, const QPen &pen);
+
+ inline int vertexCount() const { return m_vertices.size(); }
+ inline const float *vertices() const { return m_vertices.data(); }
+
+ inline void setInvScale(qreal invScale) { m_inv_scale = invScale; }
+
+private:
+ inline void emitLineSegment(float x, float y, float nx, float ny);
+ inline void moveTo(const qreal *pts);
+ inline void lineTo(const qreal *pts);
+ void cubicTo(const qreal *pts);
+ inline void join(const qreal *pts);
+ inline void normalVector(float x1, float y1, float x2, float y2, float *nx, float *ny);
+ inline void endCap(const qreal *pts);
+ inline void arc(float x, float y);
+ void endCapOrJoinClosed(const qreal *start, const qreal *cur, bool implicitClose, bool endsAtStart);
+
+
+ QDataBuffer<float> m_vertices;
+
+ float m_cx, m_cy; // current points
+ float m_nvx, m_nvy; // normal vector...
+ float m_width;
+ qreal m_miter_limit;
+
+ int m_roundness; // Number of line segments in a round join
+ qreal m_sin_theta; // sin(m_roundness / 360);
+ qreal m_cos_theta; // cos(m_roundness / 360);
+ qreal m_inv_scale;
+ float m_curvyness_mul;
+ float m_curvyness_add;
+
+ Qt::PenJoinStyle m_join_style;
+ Qt::PenCapStyle m_cap_style;
+};
+
+class QDashedStrokeProcessor
+{
+public:
+ QDashedStrokeProcessor();
+
+ void process(const QVectorPath &path, const QPen &pen);
+
+ inline void addElement(QPainterPath::ElementType type, qreal x, qreal y) {
+ m_points.add(x);
+ m_points.add(y);
+ m_types.add(type);
+ }
+
+ inline int elementCount() const { return m_types.size(); }
+ inline qreal *points() const { return m_points.data(); }
+ inline QPainterPath::ElementType *elementTypes() const { return m_types.data(); }
+
+ inline void setInvScale(qreal invScale) { m_inv_scale = invScale; }
+
+private:
+ QDataBuffer<qreal> m_points;
+ QDataBuffer<QPainterPath::ElementType> m_types;
+ QDashStroker m_dash_stroker;
+ qreal m_inv_scale;
+};
+
+
+
+
+
+inline void QTriangulatingStroker::normalVector(float x1, float y1, float x2, float y2,
+ float *nx, float *ny)
+{
+ float dx = x2 - x1;
+ float dy = y2 - y1;
+ float pw = m_width / sqrt(dx*dx + dy*dy);
+ *nx = -dy * pw;
+ *ny = dx * pw;
+}
+
+
+
+inline void QTriangulatingStroker::emitLineSegment(float x, float y, float vx, float vy)
+{
+ m_vertices.add(x + vx);
+ m_vertices.add(y + vy);
+ m_vertices.add(x - vx);
+ m_vertices.add(y - vy);
+}
+
+
+
+// We draw a full circle for any round join or round cap which is a
+// bit of overkill...
+inline void QTriangulatingStroker::arc(float x, float y)
+{
+ float dx = m_width;
+ float dy = 0;
+ for (int i=0; i<=m_roundness; ++i) {
+ float tmpx = dx * m_cos_theta - dy * m_sin_theta;
+ float tmpy = dx * m_sin_theta + dy * m_cos_theta;
+ dx = tmpx;
+ dy = tmpy;
+ emitLineSegment(x, y, dx, dy);
+ }
+}
+
+
+
+inline void QTriangulatingStroker::endCap(const qreal *pts)
+{
+ switch (m_cap_style) {
+ case Qt::FlatCap:
+ break;
+ case Qt::SquareCap: {
+ float dx = m_cx - *(pts - 2);
+ float dy = m_cy - *(pts - 1);
+
+ float len = m_width / sqrt(dx * dx + dy * dy);
+ dx = dx * len;
+ dy = dy * len;
+
+ emitLineSegment(m_cx + dx, m_cy + dy, m_nvx, m_nvy);
+ break; }
+ case Qt::RoundCap:
+ arc(m_cx, m_cy);
+ break;
+ default: break; // to shut gcc up...
+ }
+
+ int count = m_vertices.size();
+ m_vertices.add(m_vertices.at(count-2));
+ m_vertices.add(m_vertices.at(count-1));
+}
+
+
+void QTriangulatingStroker::moveTo(const qreal *pts)
+{
+ m_cx = pts[0];
+ m_cy = pts[1];
+
+ float x2 = pts[2];
+ float y2 = pts[3];
+ normalVector(m_cx, m_cy, x2, y2, &m_nvx, &m_nvy);
+
+
+ // To acheive jumps we insert zero-area tringles. This is done by
+ // adding two identical points in both the end of previous strip
+ // and beginning of next strip
+ bool invisibleJump = m_vertices.size();
+
+ switch (m_cap_style) {
+ case Qt::FlatCap:
+ if (invisibleJump) {
+ m_vertices.add(m_cx + m_nvx);
+ m_vertices.add(m_cy + m_nvy);
+ }
+ break;
+ case Qt::SquareCap: {
+ float dx = x2 - m_cx;
+ float dy = y2 - m_cy;
+ float len = m_width / sqrt(dx * dx + dy * dy);
+ dx = dx * len;
+ dy = dy * len;
+ float sx = m_cx - dx;
+ float sy = m_cy - dy;
+ if (invisibleJump) {
+ m_vertices.add(sx + m_nvx);
+ m_vertices.add(sy + m_nvy);
+ }
+ emitLineSegment(sx, sy, m_nvx, m_nvy);
+ break; }
+ case Qt::RoundCap:
+ if (invisibleJump) {
+ m_vertices.add(m_cx + m_nvx);
+ m_vertices.add(m_cy + m_nvy);
+ }
+
+ // This emitLineSegment is not needed for the arc, but we need
+ // to start where we put the invisibleJump vertex, otherwise
+ // we'll have visible triangles between subpaths.
+ emitLineSegment(m_cx, m_cy, m_nvx, m_nvy);
+ arc(m_cx, m_cy);
+ break;
+ default: break; // ssssh gcc...
+ }
+ emitLineSegment(m_cx, m_cy, m_nvx, m_nvy);
+}
+
+
+
+void QTriangulatingStroker::lineTo(const qreal *pts)
+{
+ emitLineSegment(pts[0], pts[1], m_nvx, m_nvy);
+ m_cx = pts[0];
+ m_cy = pts[1];
+}
+
+
+
+
+
+void QTriangulatingStroker::join(const qreal *pts)
+{
+ // Creates a join to the next segment (m_cx, m_cy) -> (pts[0], pts[1])
+ normalVector(m_cx, m_cy, pts[0], pts[1], &m_nvx, &m_nvy);
+
+ switch (m_join_style) {
+ case Qt::BevelJoin:
+ break;
+ case Qt::MiterJoin: {
+ int p1 = m_vertices.size() - 6;
+ int p2 = m_vertices.size() - 2;
+ QLineF line(m_vertices.at(p1), m_vertices.at(p1+1),
+ m_vertices.at(p2), m_vertices.at(p2+1));
+ QLineF nextLine(m_cx - m_nvx, m_cy - m_nvy,
+ pts[0] - m_nvx, pts[1] - m_nvy);
+
+ QPointF isect;
+ if (line.intersect(nextLine, &isect) != QLineF::NoIntersection
+ && QLineF(line.p2(), isect).length() <= m_miter_limit) {
+ // The intersection point mirrored over the m_cx, m_cy point
+ m_vertices.add(m_cx - (isect.x() - m_cx));
+ m_vertices.add(m_cy - (isect.y() - m_cy));
+
+ // The intersection point
+ m_vertices.add(isect.x());
+ m_vertices.add(isect.y());
+ }
+ // else
+ // Do a plain bevel join if the miter limit is exceeded or if
+ // the lines are parallel. This is not what the raster
+ // engine's stroker does, but it is both faster and similar to
+ // what some other graphics API's do.
+
+ break; }
+ case Qt::RoundJoin:
+ arc(m_cx, m_cy);
+ break;
+
+ default: break; // gcc warn--
+ }
+
+ emitLineSegment(m_cx, m_cy, m_nvx, m_nvy);
+}
+
+
+#endif
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index d434725..a212675 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -60,7 +60,8 @@ SOURCES += qgl.cpp \
gl2paintengineex/qgl2pexvertexarray_p.h \
gl2paintengineex/qpaintengineex_opengl2_p.h \
gl2paintengineex/qglengineshadersource_p.h \
- gl2paintengineex/qglcustomshaderstage_p.h
+ gl2paintengineex/qglcustomshaderstage_p.h \
+ gl2paintengineex/qtriangulatingstroker_p.h
SOURCES += qglshaderprogram.cpp \
qglpixmapfilter.cpp \
@@ -72,7 +73,8 @@ SOURCES += qgl.cpp \
gl2paintengineex/qglengineshadermanager.cpp \
gl2paintengineex/qgl2pexvertexarray.cpp \
gl2paintengineex/qpaintengineex_opengl2.cpp \
- gl2paintengineex/qglcustomshaderstage.cpp
+ gl2paintengineex/qglcustomshaderstage.cpp \
+ gl2paintengineex/qtriangulatingstroker.cpp
}
@@ -80,9 +82,13 @@ x11 {
contains(QT_CONFIG, opengles1)|contains(QT_CONFIG, opengles1cl)|contains(QT_CONFIG, opengles2) {
SOURCES += qgl_x11egl.cpp \
qglpixelbuffer_egl.cpp \
- qgl_egl.cpp
+ qgl_egl.cpp \
+ qpixmapdata_x11gl_egl.cpp \
+ qwindowsurface_x11gl.cpp
- HEADERS += qgl_egl_p.h
+ HEADERS += qgl_egl_p.h \
+ qpixmapdata_x11gl_p.h \
+ qwindowsurface_x11gl_p.h
} else {
SOURCES += qgl_x11.cpp \
@@ -126,14 +132,12 @@ wince*: {
embedded {
SOURCES += qgl_qws.cpp \
- qglpaintdevice_qws.cpp \
qglpixelbuffer_egl.cpp \
qglscreen_qws.cpp \
qglwindowsurface_qws.cpp \
qgl_egl.cpp
- HEADERS += qglpaintdevice_qws_p.h \
- qglscreen_qws.h \
+ HEADERS += qglscreen_qws.h \
qglwindowsurface_qws_p.h \
qgl_egl_p.h
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 3f96d1c..6720ae7 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -76,7 +76,6 @@
#endif
#ifdef Q_WS_QWS
-#include <private/qglpaintdevice_qws_p.h>
#include <private/qglwindowsurface_qws_p.h>
#endif
@@ -150,7 +149,9 @@ QGLSignalProxy *QGLSignalProxy::instance()
class QGLEngineSelector
{
public:
- QGLEngineSelector() : engineType(QPaintEngine::MaxUser) { }
+ QGLEngineSelector() : engineType(QPaintEngine::MaxUser)
+ {
+ }
void setPreferredPaintEngine(QPaintEngine::Type type) {
if (type == QPaintEngine::OpenGL || type == QPaintEngine::OpenGL2)
@@ -158,6 +159,25 @@ public:
}
QPaintEngine::Type preferredPaintEngine() {
+#ifdef Q_WS_MAC
+ // The ATI X1600 driver for Mac OS X does not support return
+ // values from functions in GLSL. Since working around this in
+ // the GL2 engine would require a big, ugly rewrite, we're
+ // falling back to the GL 1 engine..
+ static bool mac_x1600_check_done = false;
+ if (!mac_x1600_check_done) {
+ QGLWidget *tmp = 0;
+ if (!QGLContext::currentContext()) {
+ tmp = new QGLWidget();
+ tmp->makeCurrent();
+ }
+ if (strstr((char *) glGetString(GL_RENDERER), "X1600"))
+ engineType = QPaintEngine::OpenGL;
+ if (tmp)
+ delete tmp;
+ mac_x1600_check_done = true;
+ }
+#endif
if (engineType == QPaintEngine::MaxUser) {
// No user-set engine - use the defaults
#if defined(QT_OPENGL_ES_2)
@@ -1567,7 +1587,10 @@ QGLTextureCache::QGLTextureCache()
Q_ASSERT(qt_gl_texture_cache == 0);
qt_gl_texture_cache = this;
- QImagePixmapCleanupHooks::instance()->addPixmapHook(pixmapCleanupHook);
+ QImagePixmapCleanupHooks::instance()->addPixmapModificationHook(cleanupTextures);
+#ifdef Q_WS_X11
+ QImagePixmapCleanupHooks::instance()->addPixmapDestructionHook(cleanupPixmapSurfaces);
+#endif
QImagePixmapCleanupHooks::instance()->addImageHook(imageCleanupHook);
}
@@ -1575,7 +1598,10 @@ QGLTextureCache::~QGLTextureCache()
{
qt_gl_texture_cache = 0;
- QImagePixmapCleanupHooks::instance()->removePixmapHook(pixmapCleanupHook);
+ QImagePixmapCleanupHooks::instance()->removePixmapModificationHook(cleanupTextures);
+#ifdef Q_WS_X11
+ QImagePixmapCleanupHooks::instance()->removePixmapDestructionHook(cleanupPixmapSurfaces);
+#endif
QImagePixmapCleanupHooks::instance()->removeImageHook(imageCleanupHook);
}
@@ -1643,7 +1669,7 @@ void QGLTextureCache::imageCleanupHook(qint64 cacheKey)
}
-void QGLTextureCache::pixmapCleanupHook(QPixmap* pixmap)
+void QGLTextureCache::cleanupTextures(QPixmap* pixmap)
{
// ### remove when the GL texture cache becomes thread-safe
if (qApp->thread() == QThread::currentThread()) {
@@ -1652,14 +1678,21 @@ void QGLTextureCache::pixmapCleanupHook(QPixmap* pixmap)
if (texture && texture->options & QGLContext::MemoryManagedBindOption)
instance()->remove(cacheKey);
}
+}
+
#if defined(Q_WS_X11)
+void QGLTextureCache::cleanupPixmapSurfaces(QPixmap* pixmap)
+{
+ // Remove any bound textures first:
+ cleanupTextures(pixmap);
+
QPixmapData *pd = pixmap->data_ptr().data();
if (pd->classId() == QPixmapData::X11Class) {
Q_ASSERT(pd->ref == 1); // Make sure reference counting isn't broken
QGLContextPrivate::destroyGlSurfaceForPixmap(pd);
}
-#endif
}
+#endif
void QGLTextureCache::deleteIfEmpty()
{
@@ -1960,6 +1993,32 @@ GLuint QGLContext::bindTexture(const QString &fileName)
return tx_id;
}
+static inline QRgb qt_gl_convertToGLFormatHelper(QRgb src_pixel, GLenum texture_format)
+{
+ if (texture_format == GL_BGRA) {
+ if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+ return ((src_pixel << 24) & 0xff000000)
+ | ((src_pixel >> 24) & 0x000000ff)
+ | ((src_pixel << 8) & 0x00ff0000)
+ | ((src_pixel >> 8) & 0x0000ff00);
+ } else {
+ return src_pixel;
+ }
+ } else { // GL_RGBA
+ if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+ return (src_pixel << 8) | ((src_pixel >> 24) & 0xff);
+ } else {
+ return ((src_pixel << 16) & 0xff0000)
+ | ((src_pixel >> 16) & 0xff)
+ | (src_pixel & 0xff00ff00);
+ }
+ }
+}
+
+QRgb qt_gl_convertToGLFormat(QRgb src_pixel, GLenum texture_format)
+{
+ return qt_gl_convertToGLFormatHelper(src_pixel, texture_format);
+}
static void convertToGLFormatHelper(QImage &dst, const QImage &img, GLenum texture_format)
{
@@ -1988,25 +2047,7 @@ static void convertToGLFormatHelper(QImage &dst, const QImage &img, GLenum textu
const uint *src = (const quint32 *) (srcPixels - (srcy >> 16) * sbpl);
int srcx = basex;
for (int x=0; x<target_width; ++x) {
- uint src_pixel = src[srcx >> 16];
- if (texture_format == GL_BGRA) {
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- dest[x] = ((src_pixel << 24) & 0xff000000)
- | ((src_pixel >> 24) & 0x000000ff)
- | ((src_pixel << 8) & 0x00ff0000)
- | ((src_pixel >> 8) & 0x0000ff00);
- } else {
- dest[x] = src_pixel;
- }
- } else { // GL_RGBA
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- dest[x] = (src_pixel << 8) | ((src_pixel >> 24) & 0xff);
- } else {
- dest[x] = ((src_pixel << 16) & 0xff0000)
- | ((src_pixel >> 16) & 0xff)
- | (src_pixel & 0xff00ff00);
- }
- }
+ dest[x] = qt_gl_convertToGLFormatHelper(src[srcx >> 16], texture_format);
srcx += ix;
}
dest = (quint32 *)(((uchar *) dest) + dbpl);
@@ -2334,7 +2375,7 @@ QGLTexture *QGLContextPrivate::bindTexture(const QPixmap &pixmap, GLenum target,
#if defined(Q_WS_X11)
// Try to use texture_from_pixmap
- if (pd->classId() == QPixmapData::X11Class) {
+ if (pd->classId() == QPixmapData::X11Class && pd->pixelType() == QPixmapData::PixmapType) {
texture = bindTextureFromNativePixmap(pd, key, options);
if (texture) {
texture->options |= QGLContext::MemoryManagedBindOption;
@@ -4717,16 +4758,19 @@ Q_GLOBAL_STATIC(QGL2PaintEngineEx, qt_gl_2_engine)
Q_GLOBAL_STATIC(QOpenGLPaintEngine, qt_gl_engine)
#endif
-#ifdef Q_WS_QWS
Q_OPENGL_EXPORT QPaintEngine* qt_qgl_paint_engine()
{
-#if !defined(QT_OPENGL_ES_2)
+#if defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
return qt_gl_engine();
+#elif defined(QT_OPENGL_ES_2)
+ return qt_gl_2_engine();
#else
- return 0; // XXX
+ if (qt_gl_preferGL2Engine())
+ return qt_gl_2_engine();
+ else
+ return qt_gl_engine();
#endif
}
-#endif
/*!
\internal
@@ -4736,16 +4780,7 @@ Q_OPENGL_EXPORT QPaintEngine* qt_qgl_paint_engine()
*/
QPaintEngine *QGLWidget::paintEngine() const
{
-#if defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
- return qt_gl_engine();
-#elif defined(QT_OPENGL_ES_2)
- return qt_gl_2_engine();
-#else
- if (qt_gl_preferGL2Engine())
- return qt_gl_2_engine();
- else
- return qt_gl_engine();
-#endif
+ return qt_qgl_paint_engine();
}
#ifdef QT3_SUPPORT
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
index b1c1317..e14e7fb 100644
--- a/src/opengl/qgl.h
+++ b/src/opengl/qgl.h
@@ -411,6 +411,7 @@ private:
friend class QGLFramebufferObjectPrivate;
friend class QGLFBOGLPaintDevice;
friend class QGLPaintDevice;
+ friend class QX11GLPixmapData;
private:
Q_DISABLE_COPY(QGLContext)
};
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 8d4f673..9a17c67 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -498,16 +498,18 @@ public:
static QGLTextureCache *instance();
static void deleteIfEmpty();
static void imageCleanupHook(qint64 cacheKey);
- static void pixmapCleanupHook(QPixmap* pixmap);
+ static void cleanupTextures(QPixmap* pixmap);
+#ifdef Q_WS_X11
+ // X11 needs to catch pixmap data destruction to delete EGL/GLX pixmap surfaces
+ static void cleanupPixmapSurfaces(QPixmap* pixmap);
+#endif
private:
QCache<qint64, QGLTexture> m_cache;
};
-#ifdef Q_WS_QWS
-extern QPaintEngine* qt_qgl_paint_engine();
-#endif
+extern Q_OPENGL_EXPORT QPaintEngine* qt_qgl_paint_engine();
bool qt_gl_preferGL2Engine();
diff --git a/src/opengl/qgl_qws.cpp b/src/opengl/qgl_qws.cpp
index bb23ace..5e59975 100644
--- a/src/opengl/qgl_qws.cpp
+++ b/src/opengl/qgl_qws.cpp
@@ -73,7 +73,8 @@ static QGLScreen *glScreenForDevice(QPaintDevice *device)
screenNumber = 0;
screen = screen->subScreens()[screenNumber];
}
- while (screen->classId() == QScreen::ProxyClass) {
+ while (screen->classId() == QScreen::ProxyClass ||
+ screen->classId() == QScreen::TransformedClass) {
screen = static_cast<QProxyScreen *>(screen)->screen();
}
if (screen->classId() == QScreen::GLClass)
diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp
index 971a660..3894ed1 100644
--- a/src/opengl/qgl_x11egl.cpp
+++ b/src/opengl/qgl_x11egl.cpp
@@ -513,11 +513,22 @@ bool Q_OPENGL_EXPORT qt_createEGLSurfaceForPixmap(QPixmapData* pmd, bool readOnl
pixmapConfig,
(EGLNativePixmapType) pixmapData->handle(),
pixmapAttribs.properties());
+// qDebug("qt_createEGLSurfaceForPixmap() created surface 0x%x for pixmap 0x%x",
+// pixmapSurface, pixmapData->handle());
if (pixmapSurface == EGL_NO_SURFACE) {
- qWarning("Failed to create a pixmap surface using config %d", (int)pixmapConfig);
+ qWarning() << "Failed to create a pixmap surface using config" << (int)pixmapConfig
+ << ":" << QEglContext::errorString(eglGetError());
return false;
}
+ static bool doneOnce = false;
+ if (!doneOnce) {
+ // Make sure QGLTextureCache is instanciated so it can install cleanup hooks
+ // which cleanup the EGL surface.
+ QGLTextureCache::instance();
+ doneOnce = true;
+ }
+
Q_ASSERT(sizeof(Qt::HANDLE) >= sizeof(EGLSurface)); // Just to make totally sure!
pixmapData->gl_surface = (Qt::HANDLE)pixmapSurface;
pixmapData->is_cached = true; // Make sure the cleanup hook gets called
diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp
index 5585208..7374594 100644
--- a/src/opengl/qglframebufferobject.cpp
+++ b/src/opengl/qglframebufferobject.cpp
@@ -331,8 +331,22 @@ void QGLFBOGLPaintDevice::setFBO(QGLFramebufferObject* f,
}
}
+QGLContext *QGLFBOGLPaintDevice::context() const
+{
+ QGLContext *fboContext = const_cast<QGLContext *>(fbo->d_ptr->fbo_guard.context());
+ QGLContext *currentContext = const_cast<QGLContext *>(QGLContext::currentContext());
+
+ if (QGLContextPrivate::contextGroup(fboContext) == QGLContextPrivate::contextGroup(currentContext))
+ return currentContext;
+ else
+ return fboContext;
+}
+
void QGLFBOGLPaintDevice::ensureActiveTarget()
{
+ if (QGLContext::currentContext() != context())
+ context()->makeCurrent();
+
QGLContext* ctx = const_cast<QGLContext*>(QGLContext::currentContext());
Q_ASSERT(ctx);
const GLuint fboId = fbo->d_func()->fbo();
@@ -344,6 +358,9 @@ void QGLFBOGLPaintDevice::ensureActiveTarget()
void QGLFBOGLPaintDevice::beginPaint()
{
+ if (QGLContext::currentContext() != context())
+ context()->makeCurrent();
+
// We let QFBO track the previously bound FBO rather than doing it
// ourselves here. This has the advantage that begin/release & bind/end
// work as expected.
@@ -451,6 +468,7 @@ void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz,
QT_CHECK_GLERROR();
valid = checkFramebufferStatus();
+ glBindTexture(target, 0);
color_buffer = 0;
} else {
@@ -819,7 +837,8 @@ QGLFramebufferObject::~QGLFramebufferObject()
if (isValid() && ctx) {
QGLShareContextScope scope(ctx);
- glDeleteTextures(1, &d->texture);
+ if (d->texture)
+ glDeleteTextures(1, &d->texture);
if (d->color_buffer)
glDeleteRenderbuffers(1, &d->color_buffer);
if (d->depth_stencil_buffer)
@@ -1187,7 +1206,8 @@ QGLFramebufferObject::Attachment QGLFramebufferObject::attachment() const
bool QGLFramebufferObject::isBound() const
{
Q_D(const QGLFramebufferObject);
- return QGLContext::currentContext()->d_ptr->current_fbo == d->fbo();
+ const QGLContext *current = QGLContext::currentContext();
+ return current ? current->d_ptr->current_fbo == d->fbo() : false;
}
/*!
diff --git a/src/opengl/qglframebufferobject_p.h b/src/opengl/qglframebufferobject_p.h
index 055a752..122c42e 100644
--- a/src/opengl/qglframebufferobject_p.h
+++ b/src/opengl/qglframebufferobject_p.h
@@ -109,7 +109,7 @@ class QGLFBOGLPaintDevice : public QGLPaintDevice
public:
virtual QPaintEngine* paintEngine() const {return fbo->paintEngine();}
virtual QSize size() const {return fbo->size();}
- virtual QGLContext* context() const {return const_cast<QGLContext *>(QGLContext::currentContext());}
+ virtual QGLContext* context() const;
virtual QGLFormat format() const {return fboFormat;}
virtual void ensureActiveTarget();
virtual void beginPaint();
@@ -127,7 +127,7 @@ private:
class QGLFramebufferObjectPrivate
{
public:
- QGLFramebufferObjectPrivate() : fbo_guard(0), depth_stencil_buffer(0), valid(false), previous_fbo(0), engine(0) {}
+ QGLFramebufferObjectPrivate() : fbo_guard(0), texture(0), depth_stencil_buffer(0), color_buffer(0), valid(false), previous_fbo(0), engine(0) {}
~QGLFramebufferObjectPrivate() {}
void init(QGLFramebufferObject *q, const QSize& sz,
diff --git a/src/opengl/qglpaintdevice.cpp b/src/opengl/qglpaintdevice.cpp
index e68a4b9..2867de5 100644
--- a/src/opengl/qglpaintdevice.cpp
+++ b/src/opengl/qglpaintdevice.cpp
@@ -44,6 +44,9 @@
#include <private/qglpixelbuffer_p.h>
#include <private/qglframebufferobject_p.h>
#include <private/qwindowsurface_gl_p.h>
+#ifdef Q_WS_X11
+#include <private/qpixmapdata_x11gl_p.h>
+#endif
#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
#include <private/qpixmapdata_gl_p.h>
@@ -81,6 +84,7 @@ void QGLPaintDevice::beginPaint()
// explicitly unbind. Otherwise the painting will go into
// the previous FBO instead of to the window.
m_previousFBO = ctx->d_func()->current_fbo;
+
if (m_previousFBO != m_thisFBO) {
ctx->d_ptr->current_fbo = m_thisFBO;
glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_thisFBO);
@@ -186,8 +190,14 @@ QGLPaintDevice* QGLPaintDevice::getDevice(QPaintDevice* pd)
case QInternal::Pixmap: {
#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
QPixmapData* pmd = static_cast<QPixmap*>(pd)->pixmapData();
- Q_ASSERT(pmd->classId() == QPixmapData::OpenGLClass);
- glpd = static_cast<QGLPixmapData*>(pmd)->glDevice();
+ if (pmd->classId() == QPixmapData::OpenGLClass)
+ glpd = static_cast<QGLPixmapData*>(pmd)->glDevice();
+#ifdef Q_WS_X11
+ else if (pmd->classId() == QPixmapData::X11Class)
+ glpd = static_cast<QX11GLPixmapData*>(pmd);
+#endif
+ else
+ qWarning("Pixmap type not supported for GL rendering");
#else
qWarning("Pixmap render targets not supported on OpenGL ES 1.x");
#endif
diff --git a/src/opengl/qglpaintdevice_p.h b/src/opengl/qglpaintdevice_p.h
index 1e7ba8d..63ba5da 100644
--- a/src/opengl/qglpaintdevice_p.h
+++ b/src/opengl/qglpaintdevice_p.h
@@ -60,7 +60,7 @@
QT_BEGIN_NAMESPACE
-class QGLPaintDevice : public QPaintDevice
+class Q_OPENGL_EXPORT QGLPaintDevice : public QPaintDevice
{
public:
QGLPaintDevice();
diff --git a/src/opengl/qglwindowsurface_qws.cpp b/src/opengl/qglwindowsurface_qws.cpp
index 6bf3257..5041cb9 100644
--- a/src/opengl/qglwindowsurface_qws.cpp
+++ b/src/opengl/qglwindowsurface_qws.cpp
@@ -43,7 +43,6 @@
#include <QtGui/QWidget>
#include <QtOpenGL/QGLWidget>
#include "private/qglwindowsurface_qws_p.h"
-#include "private/qglpaintdevice_qws_p.h"
#include "private/qpaintengine_opengl_p.h"
QT_BEGIN_NAMESPACE
diff --git a/src/opengl/qgraphicssystem_gl.cpp b/src/opengl/qgraphicssystem_gl.cpp
index 3e7fece..c0d9233 100644
--- a/src/opengl/qgraphicssystem_gl.cpp
+++ b/src/opengl/qgraphicssystem_gl.cpp
@@ -47,12 +47,22 @@
#include "private/qgl_p.h"
#include <private/qwindowsurface_raster_p.h>
+#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
+#include "private/qpixmapdata_x11gl_p.h"
+#include "private/qwindowsurface_x11gl_p.h"
+#endif
+
QT_BEGIN_NAMESPACE
extern QGLWidget *qt_gl_getShareWidget();
QPixmapData *QGLGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
{
+#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
+ if (type == QPixmapData::PixmapType && QX11GLPixmapData::hasX11GLPixmaps())
+ return new QX11GLPixmapData();
+#endif
+
return new QGLPixmapData(type);
}
@@ -66,6 +76,11 @@ QWindowSurface *QGLGraphicsSystem::createWindowSurface(QWidget *widget) const
return new QRasterWindowSurface(widget);
#endif
+#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
+ if (QX11GLPixmapData::hasX11GLPixmaps())
+ return new QX11GLWindowSurface(widget);
+#endif
+
return new QGLWindowSurface(widget);
}
diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp
index 3e4a8e7..aa6b6c9 100644
--- a/src/opengl/qpaintengine_opengl.cpp
+++ b/src/opengl/qpaintengine_opengl.cpp
@@ -66,7 +66,6 @@
#include "util/fragmentprograms_p.h"
#ifdef Q_WS_QWS
-#include "private/qglpaintdevice_qws_p.h"
#include "private/qglwindowsurface_qws_p.h"
#include "qwsmanager_qws.h"
#include "private/qwsmanager_p.h"
@@ -747,7 +746,6 @@ public:
uint has_brush : 1;
uint has_fast_pen : 1;
uint use_stencil_method : 1;
- uint dirty_stencil : 1;
uint dirty_drawable_texture : 1;
uint has_stencil_face_ext : 1;
uint use_fragment_programs : 1;
@@ -758,6 +756,8 @@ public:
uint use_system_clip : 1;
uint use_emulation : 1;
+ QRegion dirty_stencil;
+
void updateUseEmulation();
QTransform matrix;
@@ -1222,7 +1222,7 @@ inline void QOpenGLPaintEnginePrivate::setGradientOps(const QBrush &brush, const
fragment_brush = FRAGMENT_PROGRAM_BRUSH_CONICAL;
else if (current_style == Qt::SolidPattern)
fragment_brush = FRAGMENT_PROGRAM_BRUSH_SOLID;
- else if (current_style == Qt::TexturePattern)
+ else if (current_style == Qt::TexturePattern && !brush.texture().isQBitmap())
fragment_brush = FRAGMENT_PROGRAM_BRUSH_TEXTURE;
else
fragment_brush = FRAGMENT_PROGRAM_BRUSH_PATTERN;
@@ -1260,7 +1260,9 @@ bool QOpenGLPaintEngine::begin(QPaintDevice *pdev)
d->matrix = QTransform();
d->has_antialiasing = false;
d->high_quality_antialiasing = false;
- d->dirty_stencil = true;
+
+ QSize sz(d->device->size());
+ d->dirty_stencil = QRect(0, 0, sz.width(), sz.height());
d->use_emulation = false;
@@ -1348,7 +1350,6 @@ bool QOpenGLPaintEngine::begin(QPaintDevice *pdev)
d->offscreen.begin();
- QSize sz(d->device->size());
glViewport(0, 0, sz.width(), sz.height()); // XXX (Embedded): We need a solution for GLWidgets that draw in a part or a bigger surface...
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@@ -1596,7 +1597,8 @@ void QOpenGLPaintEnginePrivate::updateGradient(const QBrush &brush, const QRectF
qreal realRadius = g->radius();
QTransform translate(1, 0, 0, 1, -realFocal.x(), -realFocal.y());
QTransform gl_to_qt(1, 0, 0, -1, 0, pdev->height());
- QTransform inv_matrix = gl_to_qt * matrix.inverted() * brush.transform().inverted() * translate;
+ QTransform m = QTransform(matrix).translate(brush_origin.x(), brush_origin.y());
+ QTransform inv_matrix = gl_to_qt * (brush.transform() * m).inverted() * translate;
setInvMatrixData(inv_matrix);
@@ -1609,7 +1611,8 @@ void QOpenGLPaintEnginePrivate::updateGradient(const QBrush &brush, const QRectF
QPointF realCenter = g->center();
QTransform translate(1, 0, 0, 1, -realCenter.x(), -realCenter.y());
QTransform gl_to_qt(1, 0, 0, -1, 0, pdev->height());
- QTransform inv_matrix = gl_to_qt * matrix.inverted() * brush.transform().inverted() * translate;
+ QTransform m = QTransform(matrix).translate(brush_origin.x(), brush_origin.y());
+ QTransform inv_matrix = gl_to_qt * (brush.transform() * m).inverted() * translate;
setInvMatrixData(inv_matrix);
@@ -1621,8 +1624,8 @@ void QOpenGLPaintEnginePrivate::updateGradient(const QBrush &brush, const QRectF
QPointF realFinal = g->finalStop();
QTransform translate(1, 0, 0, 1, -realStart.x(), -realStart.y());
QTransform gl_to_qt(1, 0, 0, -1, 0, pdev->height());
-
- QTransform inv_matrix = gl_to_qt * matrix.inverted() * brush.transform().inverted() * translate;
+ QTransform m = QTransform(matrix).translate(brush_origin.x(), brush_origin.y());
+ QTransform inv_matrix = gl_to_qt * (brush.transform() * m).inverted() * translate;
setInvMatrixData(inv_matrix);
@@ -1633,10 +1636,9 @@ void QOpenGLPaintEnginePrivate::updateGradient(const QBrush &brush, const QRectF
linear_data[2] = 1.0f / (l.x() * l.x() + l.y() * l.y());
} else if (style != Qt::SolidPattern) {
- QTransform translate(1, 0, 0, 1, brush_origin.x(), brush_origin.y());
QTransform gl_to_qt(1, 0, 0, -1, 0, pdev->height());
-
- QTransform inv_matrix = gl_to_qt * matrix.inverted() * brush.transform().inverted() * translate;
+ QTransform m = QTransform(matrix).translate(brush_origin.x(), brush_origin.y());
+ QTransform inv_matrix = gl_to_qt * (brush.transform() * m).inverted();
setInvMatrixData(inv_matrix);
}
@@ -1949,34 +1951,34 @@ void QOpenGLPaintEnginePrivate::fillVertexArray(Qt::FillRule fillRule)
{
Q_Q(QOpenGLPaintEngine);
- if (dirty_stencil) {
- disableClipping();
+ QRect rect = dirty_stencil.boundingRect();
- if (use_system_clip) {
- glEnable(GL_SCISSOR_TEST);
+ if (use_system_clip)
+ rect = q->systemClip().intersected(dirty_stencil).boundingRect();
- QRect rect = q->systemClip().boundingRect();
+ glStencilMask(~0);
- const int left = rect.left();
- const int width = rect.width();
- const int bottom = device->size().height() - (rect.bottom() + 1);
- const int height = rect.height();
+ if (!rect.isEmpty()) {
+ disableClipping();
- glScissor(left, bottom, width, height);
- }
+ glEnable(GL_SCISSOR_TEST);
+
+ const int left = rect.left();
+ const int width = rect.width();
+ const int bottom = device->size().height() - (rect.bottom() + 1);
+ const int height = rect.height();
+
+ glScissor(left, bottom, width, height);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
- dirty_stencil = false;
+ dirty_stencil -= rect;
- if (use_system_clip)
- glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_SCISSOR_TEST);
enableClipping();
}
- glStencilMask(~0);
-
// Enable stencil.
glEnable(GL_STENCIL_TEST);
@@ -4310,6 +4312,16 @@ void QOpenGLPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QR
void QOpenGLPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &offset)
{
Q_D(QOpenGLPaintEngine);
+ if (pm.depth() == 1) {
+ QPixmap tpx(pm.size());
+ tpx.fill(Qt::transparent);
+ QPainter p(&tpx);
+ p.setPen(d->cpen);
+ p.drawPixmap(0, 0, pm);
+ p.end();
+ drawTiledPixmap(r, tpx, offset);
+ return;
+ }
QImage scaled;
const int sz = d->max_texture_size;
@@ -5206,7 +5218,7 @@ void QOpenGLPaintEnginePrivate::composite(GLuint primitive, const q_vertexType *
device->context()->d_func()->bindTexture(cbrush.textureImage(), GL_TEXTURE_2D, GL_RGBA,
QGLContext::InternalBindOption);
else
- device->context()->d_func()->bindTexture(qt_imageForBrush(current_style, true),
+ device->context()->d_func()->bindTexture(qt_imageForBrush(current_style, false),
GL_TEXTURE_2D, GL_RGBA,
QGLContext::InternalBindOption);
diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp
index cbb310b..83ebece 100644
--- a/src/opengl/qpixmapdata_gl.cpp
+++ b/src/opengl/qpixmapdata_gl.cpp
@@ -240,6 +240,11 @@ QGLPixmapData::~QGLPixmapData()
}
}
+QPixmapData *QGLPixmapData::createCompatiblePixmapData() const
+{
+ return new QGLPixmapData(pixelType());
+}
+
bool QGLPixmapData::isValid() const
{
return w > 0 && h > 0;
@@ -421,6 +426,10 @@ QImage QGLPixmapData::fillImage(const QColor &color) const
if (pixelType() == BitmapType) {
img = QImage(w, h, QImage::Format_MonoLSB);
+ img.setNumColors(2);
+ img.setColor(0, QColor(Qt::color0).rgba());
+ img.setColor(1, QColor(Qt::color1).rgba());
+
if (color == Qt::color1)
img.fill(1);
else
@@ -559,6 +568,7 @@ QPaintEngine* QGLPixmapData::paintEngine() const
return m_source.paintEngine();
}
+extern QRgb qt_gl_convertToGLFormat(QRgb src_pixel, GLenum texture_format);
// If copyBack is true, bind will copy the contents of the render
// FBO to the texture (which is not bound to the texture, as it's
@@ -568,17 +578,26 @@ GLuint QGLPixmapData::bind(bool copyBack) const
if (m_renderFbo && copyBack) {
copyBackFromRenderFbo(true);
} else {
- if (m_hasFillColor) {
- m_dirty = true;
- m_source = QImage(w, h, QImage::Format_ARGB32_Premultiplied);
- m_source.fill(PREMUL(m_fillColor.rgba()));
- m_hasFillColor = false;
- }
ensureCreated();
}
GLuint id = m_texture.id;
glBindTexture(GL_TEXTURE_2D, id);
+
+ if (m_hasFillColor) {
+ if (!useFramebufferObjects()) {
+ m_source = QImage(w, h, QImage::Format_ARGB32_Premultiplied);
+ m_source.fill(PREMUL(m_fillColor.rgba()));
+ }
+
+ m_hasFillColor = false;
+
+ GLenum format = qt_gl_preferredTextureFormat();
+ QImage tx(w, h, QImage::Format_ARGB32_Premultiplied);
+ tx.fill(qt_gl_convertToGLFormat(m_fillColor.rgba(), format));
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, GL_UNSIGNED_BYTE, tx.bits());
+ }
+
return id;
}
diff --git a/src/opengl/qpixmapdata_gl_p.h b/src/opengl/qpixmapdata_gl_p.h
index f67a7c2..6190d38 100644
--- a/src/opengl/qpixmapdata_gl_p.h
+++ b/src/opengl/qpixmapdata_gl_p.h
@@ -101,6 +101,8 @@ public:
QGLPixmapData(PixelType type);
~QGLPixmapData();
+ QPixmapData *createCompatiblePixmapData() const;
+
// Re-implemented from QPixmapData:
void resize(int width, int height);
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp
new file mode 100644
index 0000000..813e6c8
--- /dev/null
+++ b/src/opengl/qpixmapdata_x11gl_egl.cpp
@@ -0,0 +1,252 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgl_p.h>
+#include <private/qegl_p.h>
+#include <private/qeglproperties_p.h>
+#include <private/qpaintengineex_opengl2_p.h>
+
+#include "qpixmapdata_x11gl_p.h"
+
+QT_BEGIN_NAMESPACE
+
+extern EGLConfig qt_chooseEGLConfigForPixmap(bool hasAlpha, bool readOnly); // in qgl_x11egl.cpp
+extern bool qt_createEGLSurfaceForPixmap(QPixmapData* pmd, bool readOnly); // in qgl_x11egl.cpp
+
+// On 16bpp systems, RGB & ARGB pixmaps are different bit-depths and therefore need
+// different contexts:
+static EGLContext qPixmapARGBSharedEglContext = EGL_NO_CONTEXT;
+static EGLContext qPixmapRGBSharedEglContext = EGL_NO_CONTEXT;
+
+bool QX11GLPixmapData::hasX11GLPixmaps()
+{
+ static bool checkedForX11Pixmaps = false;
+ static bool haveX11Pixmaps = false;
+
+ if (checkedForX11Pixmaps)
+ return haveX11Pixmaps;
+
+ checkedForX11Pixmaps = true;
+
+ QX11PixmapData *argbPixmapData = 0;
+ QX11PixmapData *rgbPixmapData = 0;
+ do {
+ if (qgetenv("QT_USE_X11GL_PIXMAPS").isEmpty())
+ break;
+
+ // Check we actually have EGL configs which support pixmaps
+ EGLConfig argbConfig = qt_chooseEGLConfigForPixmap(true, false);
+ EGLConfig rgbConfig = qt_chooseEGLConfigForPixmap(false, false);
+
+ if (argbConfig == 0 || rgbConfig == 0)
+ break;
+
+ // Create the shared contexts:
+ eglBindAPI(EGL_OPENGL_ES_API);
+ EGLint contextAttribs[] = {
+#if defined(QT_OPENGL_ES_2)
+ EGL_CONTEXT_CLIENT_VERSION, 2,
+#endif
+ EGL_NONE
+ };
+ qPixmapARGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0),
+ argbConfig, 0, contextAttribs);
+
+ if (argbConfig == rgbConfig) {
+ // If the configs are the same, we can re-use the same context.
+ qPixmapRGBSharedEglContext = qPixmapARGBSharedEglContext;
+ } else {
+ qPixmapRGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0),
+ rgbConfig, 0, contextAttribs);
+ }
+
+ argbPixmapData = new QX11PixmapData(QPixmapData::PixmapType);
+ argbPixmapData->resize(100, 100);
+ argbPixmapData->fill(Qt::transparent); // Force ARGB
+
+ if (!qt_createEGLSurfaceForPixmap(argbPixmapData, false))
+ break;
+
+ haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0),
+ (EGLSurface)argbPixmapData->gl_surface,
+ (EGLSurface)argbPixmapData->gl_surface,
+ qPixmapARGBSharedEglContext);
+ if (!haveX11Pixmaps) {
+ EGLint err = eglGetError();
+ qWarning() << "Unable to make pixmap config current:" << err << QEglContext::errorString(err);
+ break;
+ }
+
+ // If the ARGB & RGB configs are the same, we don't need to check RGB too
+ if (haveX11Pixmaps && (argbConfig != rgbConfig)) {
+ rgbPixmapData = new QX11PixmapData(QPixmapData::PixmapType);
+ rgbPixmapData->resize(100, 100);
+ rgbPixmapData->fill(Qt::red);
+
+ // Try to actually create an EGL pixmap surface
+ if (!qt_createEGLSurfaceForPixmap(rgbPixmapData, false))
+ break;
+
+ haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0),
+ (EGLSurface)rgbPixmapData->gl_surface,
+ (EGLSurface)rgbPixmapData->gl_surface,
+ qPixmapRGBSharedEglContext);
+ if (!haveX11Pixmaps) {
+ EGLint err = eglGetError();
+ qWarning() << "Unable to make pixmap config current:" << err << QEglContext::errorString(err);
+ break;
+ }
+ }
+ } while (0);
+
+ if (qPixmapARGBSharedEglContext || qPixmapRGBSharedEglContext) {
+ eglMakeCurrent(QEglContext::defaultDisplay(0),
+ EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ }
+
+ if (argbPixmapData) {
+ if (argbPixmapData->gl_surface)
+ QGLContextPrivate::destroyGlSurfaceForPixmap(argbPixmapData);
+ delete argbPixmapData;
+ argbPixmapData = 0;
+ }
+ if (rgbPixmapData) {
+ if (rgbPixmapData->gl_surface)
+ QGLContextPrivate::destroyGlSurfaceForPixmap(rgbPixmapData);
+ delete rgbPixmapData;
+ rgbPixmapData = 0;
+ }
+
+ if (!haveX11Pixmaps) {
+ // Clean up the context(s) if we can't use X11GL pixmaps
+ if (qPixmapARGBSharedEglContext != EGL_NO_CONTEXT)
+ eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapARGBSharedEglContext);
+
+ if (qPixmapRGBSharedEglContext != qPixmapARGBSharedEglContext &&
+ qPixmapRGBSharedEglContext != EGL_NO_CONTEXT)
+ {
+ eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapRGBSharedEglContext);
+ }
+ qPixmapRGBSharedEglContext = EGL_NO_CONTEXT;
+ qPixmapARGBSharedEglContext = EGL_NO_CONTEXT;
+ }
+
+ if (haveX11Pixmaps)
+ qDebug("QX11GLPixmapData is supported");
+ else
+ qDebug("QX11GLPixmapData is *NOT* being used");
+
+ return haveX11Pixmaps;
+}
+
+QX11GLPixmapData::QX11GLPixmapData()
+ : QX11PixmapData(QPixmapData::PixmapType),
+ ctx(0)
+{
+}
+
+QX11GLPixmapData::~QX11GLPixmapData()
+{
+}
+
+static QGL2PaintEngineEx* qt_gl2_engine_for_pixmaps = 0;
+
+QPaintEngine* QX11GLPixmapData::paintEngine() const
+{
+ // We need to create the context before beginPaint - do it here:
+ if (!ctx) {
+ ctx = new QGLContext(glFormat());
+ if (ctx->d_func()->eglContext == 0)
+ ctx->d_func()->eglContext = new QEglContext();
+ ctx->d_func()->eglContext->openDisplay(0); // ;-)
+ ctx->d_func()->eglContext->setApi(QEgl::OpenGL);
+ ctx->d_func()->eglContext->setContext(hasAlphaChannel() ? qPixmapARGBSharedEglContext
+ : qPixmapRGBSharedEglContext);
+ }
+
+ if (!qt_gl2_engine_for_pixmaps)
+ qt_gl2_engine_for_pixmaps = new QGL2PaintEngineEx();
+
+ // Support multiple painters on multiple pixmaps simultaniously
+ if (qt_gl2_engine_for_pixmaps->isActive()) {
+ qWarning("Pixmap paint engine already active");
+ QPaintEngine* engine = new QGL2PaintEngineEx();
+ engine->setAutoDestruct(true);
+ return engine;
+ }
+
+ return qt_gl2_engine_for_pixmaps;
+}
+
+void QX11GLPixmapData::beginPaint()
+{
+// qDebug("QX11GLPixmapData::beginPaint()");
+ if ((EGLSurface)gl_surface == EGL_NO_SURFACE) {
+ qt_createEGLSurfaceForPixmap(this, false);
+ ctx->d_func()->eglSurface = (EGLSurface)gl_surface;
+ ctx->d_func()->valid = true; // ;-)
+ }
+ QGLPaintDevice::beginPaint();
+}
+
+void QX11GLPixmapData::endPaint()
+{
+ glFinish();
+ QGLPaintDevice::endPaint();
+}
+
+QGLContext* QX11GLPixmapData::context() const
+{
+ return ctx;
+}
+
+QSize QX11GLPixmapData::size() const
+{
+ return QSize(w, h);
+}
+
+
+QGLFormat QX11GLPixmapData::glFormat()
+{
+ return QGLFormat::defaultFormat(); //###
+}
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qpixmapdata_x11gl_p.h b/src/opengl/qpixmapdata_x11gl_p.h
new file mode 100644
index 0000000..bba9bb3
--- /dev/null
+++ b/src/opengl/qpixmapdata_x11gl_p.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPIXMAPDATA_X11GL_P_H
+#define QPIXMAPDATA_X11GL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qpixmapdata_p.h>
+#include <private/qpixmap_x11_p.h>
+#include <private/qglpaintdevice_p.h>
+
+#include <qgl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QX11GLPixmapData : public QX11PixmapData, public QGLPaintDevice
+{
+public:
+ QX11GLPixmapData();
+ virtual ~QX11GLPixmapData();
+
+ // Re-implemented from QGLPaintDevice
+ QPaintEngine* paintEngine() const; // Also re-implements QX11PixmapData::paintEngine
+ void beginPaint();
+ void endPaint();
+ QGLContext* context() const;
+ QSize size() const;
+
+ static bool hasX11GLPixmaps();
+ static QGLFormat glFormat();
+private:
+ mutable QGLContext* ctx;
+};
+
+
+QT_END_NAMESPACE
+
+#endif // QPIXMAPDATA_X11GL_P_H
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 7f8577a..4547416 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -280,22 +280,12 @@ QGLContext* QGLWindowSurfaceGLPaintDevice::context() const
int QGLWindowSurfaceGLPaintDevice::metric(PaintDeviceMetric m) const
{
- return d->q_ptr->window()->metric(m);
+ return qt_paint_device_metric(d->q_ptr->window(), m);
}
-Q_GLOBAL_STATIC(QGL2PaintEngineEx, qt_gl_window_surface_2_engine)
-
-#if !defined (QT_OPENGL_ES_2)
-Q_GLOBAL_STATIC(QOpenGLPaintEngine, qt_gl_window_surface_engine)
-#endif
-
QPaintEngine *QGLWindowSurfaceGLPaintDevice::paintEngine() const
{
-#if !defined(QT_OPENGL_ES_2)
- if (!qt_gl_preferGL2Engine())
- return qt_gl_window_surface_engine();
-#endif
- return qt_gl_window_surface_2_engine();
+ return qt_qgl_paint_engine();
}
QGLWindowSurface::QGLWindowSurface(QWidget *window)
@@ -374,6 +364,7 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
if (ctxpriv->eglSurface == EGL_NO_SURFACE) {
qWarning() << "hijackWindow() could not create EGL surface";
}
+ qDebug("QGLWindowSurface - using EGLConfig %d", ctxpriv->eglContext->config());
#endif
widgetPrivate->extraData()->glContext = ctx;
@@ -428,6 +419,12 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
return;
}
+ //### Find out why d_ptr->geometry_updated isn't always false.
+ // flush() should not be called when d_ptr->geometry_updated is true. It assumes that either
+ // d_ptr->fbo or d_ptr->pb is allocated and has the correct size.
+ if (d_ptr->geometry_updated)
+ return;
+
QWidget *parent = widget->internalWinId() ? widget : widget->nativeParentWidget();
Q_ASSERT(parent);
diff --git a/src/opengl/qwindowsurface_x11gl.cpp b/src/opengl/qwindowsurface_x11gl.cpp
new file mode 100644
index 0000000..8ef239d
--- /dev/null
+++ b/src/opengl/qwindowsurface_x11gl.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenGL module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QTime>
+#include <QDebug>
+
+#include <private/qt_x11_p.h>
+#include <private/qimagepixmapcleanuphooks_p.h>
+
+#include "qwindowsurface_x11gl_p.h"
+#include "qpixmapdata_x11gl_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QX11GLWindowSurface::QX11GLWindowSurface(QWidget* window)
+ : QWindowSurface(window), m_GC(0), m_window(window)
+{
+}
+
+QX11GLWindowSurface::~QX11GLWindowSurface()
+{
+ if (m_GC)
+ XFree(m_GC);
+}
+
+QPaintDevice *QX11GLWindowSurface::paintDevice()
+{
+ return &m_backBuffer;
+}
+
+extern void *qt_getClipRects(const QRegion &r, int &num); // in qpaintengine_x11.cpp
+
+void QX11GLWindowSurface::flush(QWidget *widget, const QRegion &widgetRegion, const QPoint &offset)
+{
+// qDebug("QX11GLWindowSurface::flush()");
+ QTime startTime = QTime::currentTime();
+ if (m_backBuffer.isNull()) {
+ qDebug("QHarmattanWindowSurface::flush() - backBuffer is null, not flushing anything");
+ return;
+ }
+
+ QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
+ QRegion windowRegion(widgetRegion);
+ QRect boundingRect = widgetRegion.boundingRect();
+ if (!widgetOffset.isNull())
+ windowRegion.translate(-widgetOffset);
+ QRect windowBoundingRect = windowRegion.boundingRect();
+
+ int rectCount;
+ XRectangle *rects = (XRectangle *)qt_getClipRects(windowRegion, rectCount);
+ if (rectCount <= 0)
+ return;
+// qDebug() << "XSetClipRectangles";
+// for (int i = 0; i < num; ++i)
+// qDebug() << ' ' << i << rects[i].x << rects[i].x << rects[i].y << rects[i].width << rects[i].height;
+
+ if (m_GC == 0) {
+ m_GC = XCreateGC(X11->display, m_window->handle(), 0, 0);
+ XSetGraphicsExposures(X11->display, m_GC, False);
+ }
+
+ XSetClipRectangles(X11->display, m_GC, 0, 0, rects, rectCount, YXBanded);
+ XCopyArea(X11->display, m_backBuffer.handle(), m_window->handle(), m_GC,
+ boundingRect.x() + offset.x(), boundingRect.y() + offset.y(),
+ boundingRect.width(), boundingRect.height(),
+ windowBoundingRect.x(), windowBoundingRect.y());
+}
+
+void QX11GLWindowSurface::setGeometry(const QRect &rect)
+{
+ if (rect.width() > m_backBuffer.size().width() || rect.height() > m_backBuffer.size().height()) {
+ QSize newSize = rect.size();
+// QSize newSize(1024,512);
+ qDebug() << "QX11GLWindowSurface::setGeometry() - creating a pixmap of size" << newSize;
+ QX11GLPixmapData *pd = new QX11GLPixmapData;
+ pd->resize(newSize.width(), newSize.height());
+ m_backBuffer = QPixmap(pd);
+ }
+
+// if (gc)
+// XFreeGC(X11->display, gc);
+// gc = XCreateGC(X11->display, d_ptr->device.handle(), 0, 0);
+// XSetGraphicsExposures(X11->display, gc, False);
+ QWindowSurface::setGeometry(rect);
+}
+
+bool QX11GLWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ return false;
+}
+
+/*
+void QX11GLWindowSurface::beginPaint(const QRegion &region)
+{
+}
+
+void QX11GLWindowSurface::endPaint(const QRegion &region)
+{
+}
+
+QImage *QX11GLWindowSurface::buffer(const QWidget *widget)
+{
+}
+*/
+
+QT_END_NAMESPACE
diff --git a/src/opengl/qglpaintdevice_qws_p.h b/src/opengl/qwindowsurface_x11gl_p.h
index 6dc9d31..5ba4dc5 100644
--- a/src/opengl/qglpaintdevice_qws_p.h
+++ b/src/opengl/qwindowsurface_x11gl_p.h
@@ -39,48 +39,43 @@
**
****************************************************************************/
-#ifndef QWSGLPAINTDEVICE_GL_P_H
-#define QWSGLPAINTDEVICE_GL_P_H
+#ifndef QWINDOWSURFACE_X11GL_P_H
+#define QWINDOWSURFACE_X11GL_P_H
//
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of the QGLWindowSurface class. This header file may change from
-// version to version without notice, or even be removed.
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
//
// We mean it.
//
-#include <QtCore/qscopedpointer.h>
-#include <QPaintDevice>
+#include <private/qwindowsurface_p.h>
QT_BEGIN_NAMESPACE
-class QWidget;
-class QWSGLWindowSurface;
-class QWSGLPaintDevicePrivate;
-
-class Q_OPENGL_EXPORT QWSGLPaintDevice : public QPaintDevice
+class QX11GLWindowSurface : public QWindowSurface
{
- Q_DECLARE_PRIVATE(QWSGLPaintDevice)
public:
- QWSGLPaintDevice(QWidget *widget);
- ~QWSGLPaintDevice();
-
- QPaintEngine *paintEngine() const;
-
- int metric(PaintDeviceMetric m) const;
+ QX11GLWindowSurface(QWidget* window);
+ virtual ~QX11GLWindowSurface();
- QWSGLWindowSurface *windowSurface() const;
+ // Inherreted from QWindowSurface
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void setGeometry(const QRect &rect);
+ bool scroll(const QRegion &area, int dx, int dy);
private:
- friend class QWSGLWindowSurface;
- QScopedPointer<QWSGLPaintDevicePrivate> d_ptr;
+ GC m_GC;
+ QPixmap m_backBuffer;
+ QWidget *m_window;
};
QT_END_NAMESPACE
-#endif // QWSGLPAINTDEVICE_GL_P_H
+#endif // QWINDOWSURFACE_X11GL_P_H
diff --git a/src/opengl/util/composition_mode_colorburn.glsl b/src/opengl/util/composition_mode_colorburn.glsl
index a5a153f..c913b97 100644
--- a/src/opengl/util/composition_mode_colorburn.glsl
+++ b/src/opengl/util/composition_mode_colorburn.glsl
@@ -5,8 +5,8 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = mix(src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
- src.a * (src.rgb * dst.a + dst.rgb * src.a - src.a * dst.a) / max(src.rgb, 0.00001) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
+ result.rgb = mix(src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
+ src.a * (src.rgb * dst.a + dst.rgb * src.a - src.a * dst.a) / max(src.rgb, 0.00001) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
step(src.a * dst.a, src.rgb * dst.a + dst.rgb * src.a));
result.a = src.a + dst.a - src.a * dst.a;
return result;
diff --git a/src/opengl/util/composition_mode_colordodge.glsl b/src/opengl/util/composition_mode_colordodge.glsl
index c194441..b75e83c 100644
--- a/src/opengl/util/composition_mode_colordodge.glsl
+++ b/src/opengl/util/composition_mode_colordodge.glsl
@@ -5,8 +5,8 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- vec3 temp = src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
- result.rgb = mix(dst.rgb * src.a / max(1 - src.rgb / max(src.a, 0.000001), 0.000001) + temp,
+ vec3 temp = src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
+ result.rgb = mix(dst.rgb * src.a / max(1.0 - src.rgb / max(src.a, 0.000001), 0.000001) + temp,
src.a * dst.a + temp,
step(src.a * dst.a, src.rgb * dst.a + dst.rgb * src.a));
diff --git a/src/opengl/util/composition_mode_darken.glsl b/src/opengl/util/composition_mode_darken.glsl
index c1e83fd..8bbb82b 100644
--- a/src/opengl/util/composition_mode_darken.glsl
+++ b/src/opengl/util/composition_mode_darken.glsl
@@ -3,7 +3,7 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = min(src.rgb * dst.a, dst.rgb * src.a) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
+ result.rgb = min(src.rgb * dst.a, dst.rgb * src.a) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_difference.glsl b/src/opengl/util/composition_mode_difference.glsl
index ca13ce7..3c46ec7 100644
--- a/src/opengl/util/composition_mode_difference.glsl
+++ b/src/opengl/util/composition_mode_difference.glsl
@@ -3,7 +3,7 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = src.rgb + dst.rgb - 2 * min(src.rgb * dst.a, dst.rgb * src.a);
+ result.rgb = src.rgb + dst.rgb - 2.0 * min(src.rgb * dst.a, dst.rgb * src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_exclusion.glsl b/src/opengl/util/composition_mode_exclusion.glsl
index ccd1183..59c2da9 100644
--- a/src/opengl/util/composition_mode_exclusion.glsl
+++ b/src/opengl/util/composition_mode_exclusion.glsl
@@ -3,7 +3,7 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = (src.rgb * dst.a + dst.rgb * src.a - 2 * src.rgb * dst.rgb) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
+ result.rgb = (src.rgb * dst.a + dst.rgb * src.a - 2.0 * src.rgb * dst.rgb) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_hardlight.glsl b/src/opengl/util/composition_mode_hardlight.glsl
index 9dd4de3..4ea3550 100644
--- a/src/opengl/util/composition_mode_hardlight.glsl
+++ b/src/opengl/util/composition_mode_hardlight.glsl
@@ -5,9 +5,9 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = mix(2 * src.rgb * dst.rgb + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
- src.a * dst.a - 2 * (dst.a - dst.rgb) * (src.a - src.rgb) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
- step(src.a, 2 * src.rgb));
+ result.rgb = mix(2.0 * src.rgb * dst.rgb + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
+ src.a * dst.a - 2.0 * (dst.a - dst.rgb) * (src.a - src.rgb) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
+ step(src.a, 2.0 * src.rgb));
result.a = src.a + dst.a - src.a * dst.a;
return result;
diff --git a/src/opengl/util/composition_mode_lighten.glsl b/src/opengl/util/composition_mode_lighten.glsl
index 1fbd27a..13ef507 100644
--- a/src/opengl/util/composition_mode_lighten.glsl
+++ b/src/opengl/util/composition_mode_lighten.glsl
@@ -3,7 +3,7 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = max(src.rgb * dst.a, dst.rgb * src.a) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
+ result.rgb = max(src.rgb * dst.a, dst.rgb * src.a) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_multiply.glsl b/src/opengl/util/composition_mode_multiply.glsl
index 268345a..f90b7f0 100644
--- a/src/opengl/util/composition_mode_multiply.glsl
+++ b/src/opengl/util/composition_mode_multiply.glsl
@@ -3,7 +3,7 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = src.rgb * dst.rgb + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
+ result.rgb = src.rgb * dst.rgb + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_overlay.glsl b/src/opengl/util/composition_mode_overlay.glsl
index a9b7226..f621bde 100644
--- a/src/opengl/util/composition_mode_overlay.glsl
+++ b/src/opengl/util/composition_mode_overlay.glsl
@@ -5,9 +5,9 @@
vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
- result.rgb = mix(2 * src.rgb * dst.rgb + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
- src.a * dst.a - 2 * (dst.a - dst.rgb) * (src.a - src.rgb) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a),
- step(dst.a, 2 * dst.rgb));
+ result.rgb = mix(2.0 * src.rgb * dst.rgb + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
+ src.a * dst.a - 2.0 * (dst.a - dst.rgb) * (src.a - src.rgb) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a),
+ step(dst.a, 2.0 * dst.rgb));
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/composition_mode_softlight.glsl b/src/opengl/util/composition_mode_softlight.glsl
index 0237827..4777b74 100644
--- a/src/opengl/util/composition_mode_softlight.glsl
+++ b/src/opengl/util/composition_mode_softlight.glsl
@@ -8,11 +8,11 @@ vec4 composite(vec4 src, vec4 dst)
{
vec4 result;
float da = max(dst.a, 0.00001);
- result.rgb = mix(dst.rgb * (src.a - (1 - dst.rgb / da) * (2 * src.rgb - src.a)),
- mix(dst.rgb * (src.a - (1 - dst.rgb / da) * (2 * src.rgb - src.a) * (3 - 8 * dst.rgb / da)),
- (dst.rgb * src.a + (sqrt(dst.rgb / da) * dst.a - dst.rgb) * (2 * src.rgb - src.a)),
- step(dst.a, 8 * dst.rgb)),
- step(src.a, 2 * src.rgb)) + src.rgb * (1 - dst.a) + dst.rgb * (1 - src.a);
+ result.rgb = mix(dst.rgb * (src.a - (1.0 - dst.rgb / da) * (2.0 * src.rgb - src.a)),
+ mix(dst.rgb * (src.a - (1.0 - dst.rgb / da) * (2.0 * src.rgb - src.a) * (3.0 - 8.0 * dst.rgb / da)),
+ (dst.rgb * src.a + (sqrt(dst.rgb / da) * dst.a - dst.rgb) * (2.0 * src.rgb - src.a)),
+ step(dst.a, 8.0 * dst.rgb)),
+ step(src.a, 2.0 * src.rgb)) + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
result.a = src.a + dst.a - src.a * dst.a;
return result;
}
diff --git a/src/opengl/util/conical_brush.glsl b/src/opengl/util/conical_brush.glsl
index 83ee2f5..b3ec1d7 100644
--- a/src/opengl/util/conical_brush.glsl
+++ b/src/opengl/util/conical_brush.glsl
@@ -20,7 +20,7 @@ vec4 brush()
/* float val = fmod((atan2(-A.y, A.x) + angle) / (2.0 * M_PI), 1); */
if (abs(A.y) == abs(A.x))
A.y += 0.002;
- float t = (atan2(-A.y, A.x) + angle) / (2.0 * M_PI);
+ float t = (atan(-A.y, A.x) + angle) / (2.0 * M_PI);
float val = t - floor(t);
return texture1D(palette, val);
}
diff --git a/src/opengl/util/ellipse.glsl b/src/opengl/util/ellipse.glsl
deleted file mode 100644
index 860ae77..0000000
--- a/src/opengl/util/ellipse.glsl
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "ellipse_functions.glsl"
-
-void main()
-{
- gl_FragColor = ellipse();
-}
diff --git a/src/opengl/util/ellipse_aa.glsl b/src/opengl/util/ellipse_aa.glsl
index f7a6454..257e3bb 100644
--- a/src/opengl/util/ellipse_aa.glsl
+++ b/src/opengl/util/ellipse_aa.glsl
@@ -1,6 +1,58 @@
-#include "ellipse_functions.glsl"
+uniform vec3 inv_matrix_m0;
+uniform vec3 inv_matrix_m1;
+uniform vec3 inv_matrix_m2;
+
+uniform vec2 ellipse_offset;
+
+// ellipse equation
+
+// s^2/a^2 + t^2/b^2 = 1
+//
+// implicit equation:
+// g(s,t) = 1 - s^2/r_s^2 - t^2/r_t^2
+
+// distance from ellipse:
+// grad = [dg/dx dg/dy]
+// d(s, t) ~= g(s, t) / |grad|
+
+// dg/dx = dg/ds * ds/dx + dg/dt * dt/dx
+// dg/dy = dg/ds * ds/dy + dg/dt * dt/dy
+
+float ellipse_aa()
+{
+ mat3 mat;
+
+ mat[0] = inv_matrix_m0;
+ mat[1] = inv_matrix_m1;
+ mat[2] = inv_matrix_m2;
+
+ vec3 hcoords = mat * vec3(gl_FragCoord.xy + ellipse_offset, 1);
+ float inv_w = 1.0 / hcoords.z;
+ vec2 st = hcoords.xy * inv_w;
+
+ vec4 xy = vec4(mat[0].xy, mat[1].xy);
+ vec2 h = vec2(mat[0].z, mat[1].z);
+
+ vec4 dstdxy = (xy.xzyw - h.xyxy * st.xxyy) * inv_w;
+
+ //dstdxy.x = (mat[0].x - mat[0].z * st.x) * inv_w; // ds/dx
+ //dstdxy.y = (mat[1].x - mat[1].z * st.x) * inv_w; // ds/dy
+ //dstdxy.z = (mat[0].y - mat[0].z * st.y) * inv_w; // dt/dx
+ //dstdxy.w = (mat[1].y - mat[1].z * st.y) * inv_w; // dt/dy
+
+ vec2 inv_r = gl_TexCoord[0].xy;
+ vec2 n = st * inv_r;
+ float g = 1.0 - dot(n, n);
+
+ vec2 dgdst = -2.0 * n * inv_r;
+
+ vec2 grad = vec2(dot(dgdst, dstdxy.xz),
+ dot(dgdst, dstdxy.yw));
+
+ return smoothstep(-0.5, 0.5, g * inversesqrt(dot(grad, grad)));
+}
void main()
{
- gl_FragColor = ellipse_aa();
+ gl_FragColor = ellipse_aa().xxxx;
}
diff --git a/src/opengl/util/ellipse_aa_copy.glsl b/src/opengl/util/ellipse_aa_copy.glsl
deleted file mode 100644
index 5372f58..0000000
--- a/src/opengl/util/ellipse_aa_copy.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-uniform vec2 r; // r_x and r_y
-
-uniform sampler2D texture;
-uniform vec2 inv_texture_size;
-
-#include "ellipse_functions.glsl"
-
-void main()
-{
- gl_FragColor = ellipse_aa() * texture2D(texture, gl_FragCoord.xy * inv_texture_size);
-}
diff --git a/src/opengl/util/ellipse_aa_radial.glsl b/src/opengl/util/ellipse_aa_radial.glsl
deleted file mode 100644
index 0878f99..0000000
--- a/src/opengl/util/ellipse_aa_radial.glsl
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "ellipse_functions.glsl"
-
-uniform sampler1D palette;
-uniform vec2 fmp;
-uniform float fmp2_m_radius2;
-uniform vec4 inv_matrix;
-uniform vec2 inv_matrix_offset;
-
-void main()
-{
- // float2 A = frag_coord.xy;//mul(inv_matrix, frag_coord.xy) + inv_matrix_offset;
- mat2 mat;
- mat[0][0] = inv_matrix.x;
- mat[0][1] = inv_matrix.y;
- mat[1][0] = inv_matrix.z;
- mat[1][1] = inv_matrix.w;
- vec2 A = gl_FragCoord.xy * mat + inv_matrix_offset;
- vec2 B = fmp;
- float a = fmp2_m_radius2;
- float b = 2.0*dot(A, B);
- float c = -dot(A, A);
- float val = (-b + sqrt(b*b - 4.0*a*c)) / (2.0*a);
- gl_FragColor = texture1D(palette, val) * ellipse_aa();
-}
diff --git a/src/opengl/util/ellipse_functions.glsl b/src/opengl/util/ellipse_functions.glsl
deleted file mode 100644
index eed18e8..0000000
--- a/src/opengl/util/ellipse_functions.glsl
+++ /dev/null
@@ -1,63 +0,0 @@
-uniform vec3 inv_matrix_m0;
-uniform vec3 inv_matrix_m1;
-uniform vec3 inv_matrix_m2;
-
-uniform vec2 ellipse_offset;
-
-float ellipse()
-{
- vec2 st = gl_TexCoord[0].st;
-
- if (dot(st, st) > 1)
- discard;
-
- return 1.0;
-}
-
-// ellipse equation
-
-// s^2/a^2 + t^2/b^2 = 1
-//
-// implicit equation:
-// g(s,t) = 1 - s^2/r_s^2 - t^2/r_t^2
-
-// distance from ellipse:
-// grad = [dg/dx dg/dy]
-// d(s, t) ~= g(s, t) / |grad|
-
-// dg/dx = dg/ds * ds/dx + dg/dt * dt/dx
-// dg/dy = dg/ds * ds/dy + dg/dt * dt/dy
-
-float ellipse_aa()
-{
- mat3 mat;
-
- mat[0] = inv_matrix_m0;
- mat[1] = inv_matrix_m1;
- mat[2] = inv_matrix_m2;
-
- vec3 hcoords = mat * vec3(gl_FragCoord.xy + ellipse_offset, 1);
- float inv_w = 1.0 / hcoords.z;
- vec2 st = hcoords.xy * inv_w;
-
- vec4 xy = vec4(mat[0].xy, mat[1].xy);
- vec2 h = vec2(mat[0].z, mat[1].z);
-
- vec4 dstdxy = (xy.xzyw - h.xyxy * st.xxyy) * inv_w;
-
- //dstdxy.x = (mat[0].x - mat[0].z * st.x) * inv_w; // ds/dx
- //dstdxy.y = (mat[1].x - mat[1].z * st.x) * inv_w; // ds/dy
- //dstdxy.z = (mat[0].y - mat[0].z * st.y) * inv_w; // dt/dx
- //dstdxy.w = (mat[1].y - mat[1].z * st.y) * inv_w; // dt/dy
-
- vec2 inv_r = gl_TexCoord[0].xy;
- vec2 n = st * inv_r;
- float g = 1.0 - dot(n, n);
-
- vec2 dgdst = -2.0 * n * inv_r;
-
- vec2 grad = vec2(dot(dgdst, dstdxy.xz),
- dot(dgdst, dstdxy.yw));
-
- return smoothstep(-0.5, 0.5, g * inversesqrt(dot(grad, grad)));
-}
diff --git a/src/opengl/util/fragmentprograms_p.h b/src/opengl/util/fragmentprograms_p.h
index 340023c..9154c6e 100644
--- a/src/opengl/util/fragmentprograms_p.h
+++ b/src/opengl/util/fragmentprograms_p.h
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+
#ifndef FRAGMENTPROGRAMS_P_H
#define FRAGMENTPROGRAMS_P_H
@@ -131,58 +132,57 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA =
"TEMP R2;\n"
"TEMP R3;\n"
"TEMP R4;\n"
- "ADD R4.x, fragment.position, c[0];\n"
+ "ADD R3.z, fragment.position.x, c[0].x;\n"
"ADD R0.y, fragment.position, -c[0].x;\n"
- "MAX R3.w, fragment.texcoord[0].y, R0.y;\n"
+ "MAX R4.x, fragment.texcoord[0].y, R0.y;\n"
"ADD R0.x, fragment.position.y, c[0];\n"
- "MIN R3.z, R0.x, fragment.texcoord[0].x;\n"
+ "MIN R3.w, R0.x, fragment.texcoord[0].x;\n"
"ADD R2.z, fragment.position.x, -c[0].x;\n"
- "MOV R0.yw, R3.w;\n"
- "MOV R0.xz, R3.z;\n"
- "MAD R1, fragment.texcoord[1].xxzz, R0, fragment.texcoord[1].yyww;\n"
- "MAD R1.zw, fragment.position.x, c[0].y, -R1;\n"
- "MOV R0.z, R1.x;\n"
- "MOV R0.w, R1.z;\n"
- "MOV R0.y, R1.w;\n"
- "MOV R0.x, R1.y;\n"
- "MIN R2.xy, R0.zwzw, R0;\n"
- "SGE R1.xy, R0, R0.zwzw;\n"
- "ADD R1.zw, -fragment.texcoord[0], -fragment.texcoord[0];\n"
- "MAX R0.xy, R0.zwzw, R0;\n"
- "MAD R3.xy, R1, R1.zwzw, fragment.texcoord[0].zwzw;\n"
- "MOV R2.w, R4.x;\n"
- "ADD R1, -R2.xxyy, R2.zwzw;\n"
- "MAD R1, R1, R3.xxyy, R3.w;\n"
- "ADD R3.xy, R1.ywzw, R1.xzzw;\n"
- "ADD R4.zw, R3.z, -R1.xyxz;\n"
- "ADD R1.zw, -R3.w, R1.xyyw;\n"
- "ADD R1.xy, R4.x, -R2;\n"
- "MUL R1.xy, R1, R1.zwzw;\n"
- "MAD R3.xy, -R3, c[0].x, R3.z;\n"
- "ADD R2.w, R4.x, -R2.z;\n"
- "MUL R0.zw, R3.xyxy, R2.w;\n"
- "ADD R2.w, R3.z, -R3;\n"
- "ADD R3.xy, -R2.z, R0;\n"
+ "MOV R2.w, R3.z;\n"
+ "MOV R0.yw, R4.x;\n"
+ "MOV R0.xz, R3.w;\n"
+ "MAD R0, fragment.texcoord[1].xxzz, R0, fragment.texcoord[1].yyww;\n"
+ "MAD R0.zw, fragment.position.x, c[0].y, -R0;\n"
+ "MOV R2.x, R0;\n"
+ "MOV R2.y, R0.z;\n"
+ "MOV R1.w, R0;\n"
+ "MOV R1.z, R0.y;\n"
+ "MIN R1.xy, R2, R1.zwzw;\n"
+ "SGE R0.xy, R1.zwzw, R2;\n"
+ "ADD R0.zw, -fragment.texcoord[0], -fragment.texcoord[0];\n"
+ "MAD R3.xy, R0, R0.zwzw, fragment.texcoord[0].zwzw;\n"
+ "ADD R0, -R1.xxyy, R2.zwzw;\n"
+ "MAD R0, R0, R3.xxyy, R4.x;\n"
+ "ADD R3.xy, R0.ywzw, R0.xzzw;\n"
+ "ADD R4.zw, R3.w, -R0.xyxz;\n"
+ "ADD R0.zw, -R4.x, R0.xyyw;\n"
+ "ADD R0.xy, R3.z, -R1;\n"
+ "MAX R1.zw, R2.xyxy, R1;\n"
+ "MUL R0.xy, R0, R0.zwzw;\n"
+ "MAD R3.xy, -R3, c[0].x, R3.w;\n"
+ "ADD R2.w, R3.z, -R2.z;\n"
+ "MUL R2.xy, R3, R2.w;\n"
+ "ADD R2.w, R3, -R4.x;\n"
+ "ADD R3.xy, -R2.z, R1.zwzw;\n"
"MUL R3.xy, R4.zwzw, R3;\n"
- "ADD R4.zw, R2.xyxy, R0.xyxy;\n"
- "MAD R1.zw, R4, c[0].x, -R2.z;\n"
- "MAD R1.xy, -R1, c[0].x, R2.w;\n"
- "MAD R4.zw, R2.w, R1, -R1.xyxy;\n"
- "SGE R1.zw, R4.x, R0.xyxy;\n"
- "MAD R3.xy, R3, c[0].x, -R0.zwzw;\n"
- "MAD R1.xy, R1.zwzw, R4.zwzw, R1;\n"
- "MAD R0.zw, R1, R3.xyxy, R0;\n"
- "ADD R1.zw, R0, -R1.xyxy;\n"
- "SGE R0.zw, R2.z, R2.xyxy;\n"
- "MAD R0.zw, R0, R1, R1.xyxy;\n"
- "ADD R0.zw, -R2.w, R0;\n"
- "SGE R1.xy, R4.x, R2;\n"
- "MAD R0.zw, R1.xyxy, R0, R2.w;\n"
- "SGE R0.xy, R0, R2.z;\n"
- "MUL R0.xy, R0.zwzw, R0;\n"
- "ADD R0.x, R2.w, -R0;\n"
- "SGE R0.z, R3, R3.w;\n"
- "ADD R0.x, R0, -R0.y;\n"
+ "ADD R4.zw, R1.xyxy, R1;\n"
+ "MAD R0.zw, R4, c[0].x, -R2.z;\n"
+ "MAD R0.xy, -R0, c[0].x, R2.w;\n"
+ "MAD R4.zw, R0, R2.w, -R0.xyxy;\n"
+ "SGE R0.zw, R3.z, R1;\n"
+ "MAD R0.xy, R0.zwzw, R4.zwzw, R0;\n"
+ "MAD R3.xy, R3, c[0].x, -R2;\n"
+ "MAD R0.zw, R0, R3.xyxy, R2.xyxy;\n"
+ "ADD R2.xy, R0.zwzw, -R0;\n"
+ "SGE R0.zw, R2.z, R1.xyxy;\n"
+ "MAD R0.xy, R0.zwzw, R2, R0;\n"
+ "SGE R0.zw, R1, R2.z;\n"
+ "ADD R0.xy, R0, -R2.w;\n"
+ "SGE R1.xy, R3.z, R1;\n"
+ "MAD R0.xy, R1, R0, R2.w;\n"
+ "MAD R0.x, -R0, R0.z, R2.w;\n"
+ "SGE R0.z, R3.w, R4.x;\n"
+ "MAD R0.x, -R0.y, R0.w, R0;\n"
"MUL result.color, R0.x, R0.z;\n"
"END\n"
;
@@ -200,27 +200,27 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_MASK_ELLIPSE_AA =
"MAD R0.xyz, R0.x, c[0], R1;\n"
"ADD R0.xyz, R0, c[2];\n"
"RCP R2.z, R0.z;\n"
- "MUL R1.zw, R0.xyxy, R2.z;\n"
- "MUL R2.xy, R1.zwzw, fragment.texcoord[0];\n"
- "MOV R1.x, c[0].z;\n"
- "MOV R1.y, c[1].z;\n"
- "MOV R0.xy, c[0];\n"
- "MOV R0.zw, c[1].xyxy;\n"
- "MAD R0, R1.zzww, -R1.xyxy, R0.xzyw;\n"
+ "MUL R0.zw, R0.xyxy, R2.z;\n"
+ "MUL R2.xy, R0.zwzw, fragment.texcoord[0];\n"
+ "MOV R1.xy, c[0];\n"
+ "MOV R1.zw, c[1].xyxy;\n"
+ "MOV R0.x, c[0].z;\n"
+ "MOV R0.y, c[1].z;\n"
+ "MAD R0, R0.zzww, -R0.xyxy, R1.xzyw;\n"
"MUL R1.xy, R2, fragment.texcoord[0];\n"
"MUL R0, R2.z, R0;\n"
"MUL R1.xy, R1, c[4].x;\n"
"MUL R1.zw, R1.xyxy, R0.xyxz;\n"
- "MUL R0.xy, R1, R0.ywzw;\n"
- "ADD R0.w, R0.x, R0.y;\n"
- "MUL R0.xy, R2, R2;\n"
- "ADD R0.x, R0, R0.y;\n"
- "ADD R0.z, R1, R1.w;\n"
- "MUL R0.zw, R0, R0;\n"
+ "MUL R0.zw, R1.xyxy, R0.xyyw;\n"
"ADD R0.y, R0.z, R0.w;\n"
- "RSQ R0.y, R0.y;\n"
- "ADD R0.x, -R0, c[4].y;\n"
- "MAD_SAT R0.x, R0.y, R0, -c[4].z;\n"
+ "ADD R0.x, R1.z, R1.w;\n"
+ "MUL R0.xy, R0, R0;\n"
+ "ADD R0.x, R0, R0.y;\n"
+ "MUL R0.zw, R2.xyxy, R2.xyxy;\n"
+ "ADD R0.z, R0, R0.w;\n"
+ "ADD R0.y, -R0.z, c[4];\n"
+ "RSQ R0.x, R0.x;\n"
+ "MAD_SAT R0.x, R0, R0.y, -c[4].z;\n"
"MUL R0.y, -R0.x, c[4].w;\n"
"ADD R0.y, R0, c[5].x;\n"
"MUL R0.x, R0, R0;\n"
@@ -407,13 +407,13 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE
"TEMP R3;\n"
"MUL R0.xy, fragment.position, c[1];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "ADD R1.y, -fragment.color.primary.w, c[4].x;\n"
- "MAX R1.x, fragment.color.primary.w, c[4].y;\n"
- "MUL R2.xyz, R0, R1.y;\n"
+ "ADD R1.x, -fragment.color.primary.w, c[4];\n"
+ "MAX R1.y, fragment.color.primary.w, c[4];\n"
+ "MUL R2.xyz, R0, R1.x;\n"
"ADD R1.w, -R0, c[4].x;\n"
"MAD R3.xyz, fragment.color.primary, R1.w, R2;\n"
- "RCP R1.x, R1.x;\n"
- "MAD R1.xyz, -fragment.color.primary, R1.x, c[4].x;\n"
+ "RCP R1.y, R1.y;\n"
+ "MAD R1.xyz, -fragment.color.primary, R1.y, c[4].x;\n"
"MAX R1.xyz, R1, c[4].y;\n"
"MUL R2.xyz, fragment.color.primary.w, R0;\n"
"MUL R1.w, fragment.color.primary, R0;\n"
@@ -519,8 +519,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT =
"!!ARBfp1.0\n"
"PARAM c[6] = { program.local[0..3],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -529,39 +529,39 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE
"TEMP R5;\n"
"MUL R0.xy, fragment.position, c[1];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.x, R0.w, c[4].y;\n"
+ "MAX R1.x, R0.w, c[4].z;\n"
"RCP R1.w, R1.x;\n"
- "MUL R2.xyz, R0, R1.w;\n"
- "MUL R1.xyz, -R2, c[5].x;\n"
- "RSQ R2.w, R2.x;\n"
- "ADD R4.xyz, R1, c[4].w;\n"
+ "MUL R1.xyz, R0, R1.w;\n"
+ "MUL R4.xyz, -R1, c[4].w;\n"
+ "RSQ R2.x, R1.x;\n"
+ "RSQ R2.z, R1.z;\n"
+ "RSQ R2.y, R1.y;\n"
"MAD R1.xyz, -R0, R1.w, c[4].x;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "RCP R2.x, R2.w;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
- "MAD R5.xyz, R0.w, R2, -R0;\n"
- "MAD R2.xyz, fragment.color.primary, c[4].z, -fragment.color.primary.w;\n"
- "MUL R3.xyz, R1, R2;\n"
- "MAD R3.xyz, -R3, R4, fragment.color.primary.w;\n"
- "MUL R4.xyz, R5, R2;\n"
+ "MAD R3.xyz, R0.w, R2, -R0;\n"
+ "MAD R2.xyz, fragment.color.primary, c[4].y, -fragment.color.primary.w;\n"
+ "MUL R3.xyz, R2, R3;\n"
+ "ADD R5.xyz, R4, c[5].x;\n"
+ "MUL R4.xyz, R1, R2;\n"
"MAD R1.xyz, -R1, R2, fragment.color.primary.w;\n"
- "MUL R3.xyz, R0, R3;\n"
- "MAD R4.xyz, fragment.color.primary.w, R0, R4;\n"
- "ADD R5.xyz, R4, -R3;\n"
- "MUL R4.xyz, R0, c[5].x;\n"
- "SGE R2.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R2, R5, R3;\n"
+ "MUL R2.xyz, fragment.color.primary, c[4].y;\n"
+ "MAD R5.xyz, -R4, R5, fragment.color.primary.w;\n"
+ "MAD R3.xyz, fragment.color.primary.w, R0, R3;\n"
+ "MAD R4.xyz, -R0, R5, R3;\n"
+ "MUL R3.xyz, R0, c[4].w;\n"
+ "MUL R5.xyz, R0, R5;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R3.xyz, R3, R4, R5;\n"
+ "MAD R3.xyz, -R0, R1, R3;\n"
"MUL R1.xyz, R0, R1;\n"
- "MUL R3.xyz, fragment.color.primary, c[4].z;\n"
- "ADD R2.xyz, R2, -R1;\n"
- "SGE R3.xyz, R3, fragment.color.primary.w;\n"
- "MAD R1.xyz, R3, R2, R1;\n"
- "ADD R1.w, -R0, c[4].x;\n"
- "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
- "ADD R1.w, -fragment.color.primary, c[4].x;\n"
- "MAD R2.xyz, R0, R1.w, R1;\n"
+ "SGE R2.xyz, R2, fragment.color.primary.w;\n"
+ "MAD R2.xyz, R2, R3, R1;\n"
+ "ADD R1.x, -R0.w, c[4];\n"
+ "MAD R2.xyz, fragment.color.primary, R1.x, R2;\n"
+ "ADD R1.x, -fragment.color.primary.w, c[4];\n"
+ "MAD R2.xyz, R0, R1.x, R2;\n"
"ADD R1.z, fragment.color.primary.w, R0.w;\n"
"MAD R2.w, -fragment.color.primary, R0, R1.z;\n"
"ADD R1.xy, fragment.position, c[2];\n"
@@ -861,8 +861,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[3] = { program.local[0],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -871,41 +871,41 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_SOLID_COMPOSITION_MODE
"TEMP R5;\n"
"MUL R0.xy, fragment.position, c[0];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.x, R0.w, c[1].y;\n"
+ "MAX R1.x, R0.w, c[1].z;\n"
"RCP R1.w, R1.x;\n"
- "MUL R2.xyz, R0, R1.w;\n"
- "MUL R1.xyz, -R2, c[2].x;\n"
- "ADD R4.xyz, R1, c[1].w;\n"
- "MAD R1.xyz, -R0, R1.w, c[1].x;\n"
- "RSQ R2.w, R2.x;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "RCP R2.x, R2.w;\n"
+ "MUL R1.xyz, R0, R1.w;\n"
+ "MUL R4.xyz, -R1, c[1].w;\n"
+ "RSQ R2.x, R1.x;\n"
+ "RSQ R2.z, R1.z;\n"
+ "RSQ R2.y, R1.y;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
- "MAD R5.xyz, R0.w, R2, -R0;\n"
- "MAD R2.xyz, fragment.color.primary, c[1].z, -fragment.color.primary.w;\n"
- "MUL R3.xyz, R1, R2;\n"
- "MAD R3.xyz, -R3, R4, fragment.color.primary.w;\n"
- "MUL R4.xyz, R5, R2;\n"
+ "MAD R3.xyz, R0.w, R2, -R0;\n"
+ "MAD R2.xyz, fragment.color.primary, c[1].y, -fragment.color.primary.w;\n"
+ "MUL R3.xyz, R2, R3;\n"
+ "MAD R3.xyz, fragment.color.primary.w, R0, R3;\n"
+ "MAD R1.xyz, -R0, R1.w, c[1].x;\n"
+ "ADD R5.xyz, R4, c[2].x;\n"
+ "MUL R4.xyz, R1, R2;\n"
"MAD R1.xyz, -R1, R2, fragment.color.primary.w;\n"
- "MUL R3.xyz, R0, R3;\n"
- "MAD R4.xyz, fragment.color.primary.w, R0, R4;\n"
- "ADD R5.xyz, R4, -R3;\n"
- "MUL R4.xyz, R0, c[2].x;\n"
- "SGE R2.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R2, R5, R3;\n"
+ "MAD R5.xyz, -R4, R5, fragment.color.primary.w;\n"
+ "MAD R4.xyz, -R0, R5, R3;\n"
+ "MUL R3.xyz, R0, c[1].w;\n"
+ "MUL R2.xyz, fragment.color.primary, c[1].y;\n"
+ "MUL R5.xyz, R0, R5;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R3.xyz, R3, R4, R5;\n"
+ "MAD R3.xyz, -R0, R1, R3;\n"
"MUL R1.xyz, R0, R1;\n"
- "MUL R3.xyz, fragment.color.primary, c[1].z;\n"
- "ADD R2.xyz, R2, -R1;\n"
- "SGE R3.xyz, R3, fragment.color.primary.w;\n"
- "MAD R1.xyz, R3, R2, R1;\n"
- "ADD R1.w, -R0, c[1].x;\n"
- "MAD R1.xyz, fragment.color.primary, R1.w, R1;\n"
- "ADD R1.w, fragment.color.primary, R0;\n"
- "ADD R2.x, -fragment.color.primary.w, c[1];\n"
- "MAD result.color.xyz, R0, R2.x, R1;\n"
- "MAD result.color.w, -fragment.color.primary, R0, R1;\n"
+ "SGE R2.xyz, R2, fragment.color.primary.w;\n"
+ "MAD R2.xyz, R2, R3, R1;\n"
+ "ADD R1.x, -R0.w, c[1];\n"
+ "MAD R2.xyz, fragment.color.primary, R1.x, R2;\n"
+ "ADD R1.x, fragment.color.primary.w, R0.w;\n"
+ "ADD R1.y, -fragment.color.primary.w, c[1].x;\n"
+ "MAD result.color.xyz, R0, R1.y, R2;\n"
+ "MAD result.color.w, -fragment.color.primary, R0, R1.x;\n"
"END\n"
;
@@ -1085,18 +1085,18 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"ADD R0.z, R0, R0.w;\n"
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MOV R0.x, c[9];\n"
"MUL R0.z, -R0, c[1].x;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
"ADD R3.xy, fragment.position, c[7];\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[9].x;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.z, R0.x, R0.y;\n"
+ "RCP R0.x, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.z, R0.x, R0;\n"
"TEX R1, R0.z, texture[2], 1D;\n"
"MUL R0.xy, fragment.position, c[6];\n"
"TEX R0, R0, texture[0], 2D;\n"
@@ -1125,24 +1125,24 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MOV R0.x, c[9];\n"
"MUL R0.z, -R0, c[1].x;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
"MUL R1.xy, fragment.position, c[6];\n"
"TEX R1, R1, texture[0], 2D;\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[9].x;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
- "TEX R0, R0, texture[2], 1D;\n"
+ "RCP R0.x, R0.z;\n"
"ADD R2.w, -R1, c[9].z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
+ "TEX R0, R0, texture[2], 1D;\n"
"ADD R3.xyz, R0.w, -R0;\n"
"ADD R2.xyz, R1.w, -R1;\n"
"MUL R2.xyz, R2, R3;\n"
@@ -1283,20 +1283,20 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MOV R0.x, c[9];\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[9].x;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "RCP R0.x, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
"TEX R0, R0, texture[2], 1D;\n"
"MAX R1.x, R0.w, c[9].w;\n"
"RCP R1.x, R1.x;\n"
@@ -1350,17 +1350,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[9];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[9].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[2], 1D;\n"
"MUL R2.xyz, R0.w, R1;\n"
@@ -1408,24 +1408,24 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MOV R0.x, c[9];\n"
"MUL R0.z, -R0, c[1].x;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
"MUL R1.xy, fragment.position, c[6];\n"
"TEX R1, R1, texture[0], 2D;\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[9].x;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
- "TEX R0, R0, texture[2], 1D;\n"
+ "RCP R0.x, R0.z;\n"
"ADD R2.w, -R1, c[9].z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
+ "TEX R0, R0, texture[2], 1D;\n"
"ADD R3.xyz, R0.w, -R0;\n"
"ADD R2.xyz, R1.w, -R1;\n"
"MUL R2.xyz, R2, R3;\n"
@@ -1457,7 +1457,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..8],\n"
" { 2, 4, 1, 9.9999997e-006 },\n"
- " { 3, 8 } };\n"
+ " { 8, 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -1469,65 +1469,65 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MAD R0.xyz, fragment.position.x, c[2], R0;\n"
"ADD R0.xyz, R0, c[4];\n"
"RCP R0.z, R0.z;\n"
+ "MUL R1.xy, fragment.position, c[6];\n"
+ "TEX R1, R1, texture[0], 2D;\n"
+ "MAX R0.w, R1, c[9];\n"
+ "RCP R2.w, R0.w;\n"
+ "MUL R5.xyz, R1, R2.w;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[9].x;\n"
+ "MOV R0.x, c[9];\n"
+ "RSQ R2.x, R5.x;\n"
+ "RSQ R2.z, R5.z;\n"
+ "RSQ R2.y, R5.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[9];\n"
- "MUL R0.x, R0, c[9];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "MOV R0.z, c[9].x;\n"
- "MUL R1.y, R0.z, c[1].x;\n"
- "RSQ R0.y, R0.y;\n"
- "RCP R0.y, R0.y;\n"
- "ADD R1.x, -R0, R0.y;\n"
- "RCP R1.y, R1.y;\n"
- "MUL R0.xy, fragment.position, c[6];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.z, R0.w, c[9].w;\n"
- "RCP R2.w, R1.z;\n"
- "MUL R2.xyz, R0, R2.w;\n"
- "MAD R6.xyz, -R2, c[10].y, c[10].x;\n"
- "MAD R3.xyz, -R0, R2.w, c[9].z;\n"
- "RSQ R2.w, R2.x;\n"
- "RCP R2.x, R2.w;\n"
- "MUL R1.x, R1, R1.y;\n"
- "TEX R1, R1, texture[2], 1D;\n"
- "MAD R4.xyz, R1, c[9].x, -R1.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R5.xyz, -R5, R6, R1.w;\n"
- "MAD R3.xyz, -R3, R4, R1.w;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R0, R5;\n"
- "MUL R3.xyz, R0, R3;\n"
- "ADD R2.w, -R0, c[9].z;\n"
+ "MUL R0.z, R0, c[9].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
+ "RSQ R0.z, R0.z;\n"
+ "RCP R0.x, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
+ "TEX R0, R0, texture[2], 1D;\n"
+ "MAD R3.xyz, R0, c[9].x, -R0.w;\n"
+ "MAD R6.xyz, -R5, c[10].x, c[10].y;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
- "MAD R2.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R1.w, R0, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R1, c[9].x;\n"
- "MUL R2.xyz, R0, c[10].y;\n"
- "SGE R2.xyz, R2, R0.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
+ "MAD R2.xyz, R1.w, R2, -R1;\n"
+ "MUL R2.xyz, R3, R2;\n"
+ "MAD R4.xyz, R0.w, R1, R2;\n"
+ "MAD R2.xyz, -R1, R2.w, c[9].z;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MUL R3.xyz, R0, c[9].x;\n"
+ "MUL R4.xyz, R1, c[10].x;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "ADD R2.w, -R1, c[9].z;\n"
+ "MUL R6.xyz, R1, R6;\n"
"SGE R4.xyz, R4, R1.w;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[9].z;\n"
- "MAD R2.xyz, R0, R2.x, R1;\n"
- "ADD R1.z, R1.w, R0.w;\n"
- "MAD R2.w, -R1, R0, R1.z;\n"
- "ADD R1.xy, fragment.position, c[7];\n"
- "MUL R1.xy, R1, c[5];\n"
- "TEX R1, R1, texture[1], 2D;\n"
- "ADD R2, R2, -R0;\n"
- "DP4 R1.x, R1, c[8];\n"
- "MAD result.color, R1.x, R2, R0;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, -R0.w, c[9].z;\n"
+ "MAD R2.xyz, R1, R0.x, R2;\n"
+ "ADD R0.z, R0.w, R1.w;\n"
+ "MAD R2.w, -R0, R1, R0.z;\n"
+ "ADD R0.xy, fragment.position, c[7];\n"
+ "MUL R0.xy, R0, c[5];\n"
+ "TEX R0, R0, texture[1], 2D;\n"
+ "ADD R2, R2, -R1;\n"
+ "DP4 R0.x, R0, c[8];\n"
+ "MAD result.color, R0.x, R2, R1;\n"
"END\n"
;
@@ -1642,23 +1642,23 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[8];\n"
- "MUL R0.x, R0, c[8];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.y, R0.y;\n"
- "RCP R0.z, R0.y;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "MUL R0.y, R0.x, c[8].x;\n"
+ "MUL R0.z, R0, c[8].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.x, R0.x;\n"
+ "RCP R0.z, R0.x;\n"
+ "ADD R0.y, -R0, R0.z;\n"
"MUL R0.zw, fragment.position.xyxy, c[7].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
"MUL R2.xyz, R1, c[5].y;\n"
- "MOV R0.y, c[8].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "MOV R0.x, c[8];\n"
+ "MUL R0.x, R0, c[1];\n"
+ "RCP R0.x, R0.x;\n"
+ "MUL R0.x, R0.y, R0;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MUL R3.xyz, R0.w, R2;\n"
"MUL R2.xyz, R0, c[5].x;\n"
@@ -1689,22 +1689,22 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.y, R0.y;\n"
- "RCP R0.z, R0.y;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.x, R0.x;\n"
+ "RCP R0.z, R0.x;\n"
+ "ADD R0.y, -R0, R0.z;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.x, R0, c[1];\n"
+ "RCP R0.x, R0.x;\n"
+ "MUL R0.x, R0.y, R0;\n"
"TEX R0, R0, texture[1], 1D;\n"
"ADD R2.x, -R1.w, c[6].z;\n"
"MUL R2.xyz, R0, R2.x;\n"
@@ -1733,16 +1733,16 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
@@ -1765,27 +1765,27 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MOV R0.x, c[6];\n"
"MUL R0.z, -R0, c[1].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
"MUL R1.xy, fragment.position, c[5];\n"
"TEX R1, R1, texture[0], 2D;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[6].x;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "RCP R0.x, R0.z;\n"
+ "ADD R2.w, -R1, c[6].z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
"TEX R0, R0, texture[1], 1D;\n"
"ADD R3.xyz, R0.w, -R0;\n"
"ADD R2.xyz, R1.w, -R1;\n"
"MUL R2.xyz, R2, R3;\n"
- "ADD R2.w, -R1, c[6].z;\n"
"MUL R2.xyz, R2, c[6].x;\n"
"MAD R2.xyz, R0.w, R1.w, -R2;\n"
"MAD R2.xyz, R0, R2.w, R2;\n"
@@ -1822,17 +1822,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MUL R2.xyz, R0, R1.w;\n"
@@ -1865,17 +1865,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MUL R2.xyz, R0, R1.w;\n"
@@ -1904,20 +1904,20 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MOV R0.x, c[6];\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "RCP R0.x, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MAX R1.x, R0.w, c[6].w;\n"
"RCP R1.x, R1.x;\n"
@@ -1965,17 +1965,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MUL R2.xyz, R0.w, R1;\n"
@@ -2017,24 +2017,24 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MOV R0.x, c[6];\n"
"MUL R0.z, -R0, c[1].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
"MUL R1.xy, fragment.position, c[5];\n"
"TEX R1, R1, texture[0], 2D;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.z, R0.x, R0.x, -R0.y;\n"
- "MOV R0.y, c[6].x;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RSQ R0.z, R0.z;\n"
- "RCP R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
- "TEX R0, R0, texture[1], 1D;\n"
+ "RCP R0.x, R0.z;\n"
"ADD R2.w, -R1, c[6].z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
+ "TEX R0, R0, texture[1], 1D;\n"
"ADD R3.xyz, R0.w, -R0;\n"
"ADD R2.xyz, R1.w, -R1;\n"
"MUL R2.xyz, R2, R3;\n"
@@ -2060,7 +2060,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..5],\n"
" { 2, 4, 1, 9.9999997e-006 },\n"
- " { 3, 8 } };\n"
+ " { 8, 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2072,59 +2072,59 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MAD R0.xyz, fragment.position.x, c[2], R0;\n"
"ADD R0.xyz, R0, c[4];\n"
"RCP R0.z, R0.z;\n"
+ "MUL R1.xy, fragment.position, c[5];\n"
+ "TEX R1, R1, texture[0], 2D;\n"
+ "MAX R0.w, R1, c[6];\n"
+ "RCP R2.w, R0.w;\n"
+ "MUL R5.xyz, R1, R2.w;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MOV R0.x, c[6];\n"
+ "RSQ R2.x, R5.x;\n"
+ "RSQ R2.z, R5.z;\n"
+ "RSQ R2.y, R5.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
- "TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "MAX R0.z, R1.w, c[6].w;\n"
- "RCP R2.w, R0.z;\n"
- "MUL R2.xyz, R1, R2.w;\n"
- "MAD R6.xyz, -R2, c[7].y, c[7].x;\n"
- "MAD R3.xyz, -R1, R2.w, c[6].z;\n"
- "RSQ R2.w, R2.x;\n"
- "RCP R2.x, R2.w;\n"
- "RSQ R0.y, R0.y;\n"
- "RCP R0.y, R0.y;\n"
- "ADD R0.x, -R0, R0.y;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.z, R0.y, R0.y, -R0;\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
+ "RSQ R0.z, R0.z;\n"
+ "RCP R0.x, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0.y, R0;\n"
+ "MUL R0.x, R0, R0.z;\n"
"TEX R0, R0, texture[1], 1D;\n"
- "MAD R4.xyz, R0, c[6].x, -R0.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R5.xyz, -R5, R6, R0.w;\n"
- "MAD R3.xyz, -R3, R4, R0.w;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R1, R5;\n"
- "MUL R3.xyz, R1, R3;\n"
+ "MAD R3.xyz, R0, c[6].x, -R0.w;\n"
+ "MAD R6.xyz, -R5, c[7].x, c[7].y;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
"MAD R2.xyz, R1.w, R2, -R1;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R0.w, R1, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R0, c[6].x;\n"
- "MUL R2.xyz, R1, c[7].y;\n"
- "SGE R2.xyz, R2, R1.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "SGE R4.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
+ "MUL R2.xyz, R3, R2;\n"
+ "MAD R4.xyz, R0.w, R1, R2;\n"
+ "MAD R2.xyz, -R1, R2.w, c[6].z;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R3.xyz, R0, c[6].x;\n"
+ "MUL R4.xyz, R1, c[7].x;\n"
+ "MUL R6.xyz, R1, R6;\n"
+ "SGE R4.xyz, R4, R1.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
"ADD R2.w, -R1, c[6].z;\n"
- "MAD R0.xyz, R0, R2.w, R2;\n"
- "ADD R2.x, R0.w, R1.w;\n"
- "ADD R2.y, -R0.w, c[6].z;\n"
- "MAD result.color.xyz, R1, R2.y, R0;\n"
- "MAD result.color.w, -R0, R1, R2.x;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, R0.w, R1.w;\n"
+ "ADD R0.y, -R0.w, c[6].z;\n"
+ "MAD result.color.xyz, R1, R0.y, R2;\n"
+ "MAD result.color.w, -R0, R1, R0.x;\n"
"END\n"
;
@@ -2146,16 +2146,16 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
@@ -2187,17 +2187,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
- "MUL R0.y, R0.z, c[6];\n"
- "MUL R0.x, R0, c[6];\n"
- "MAD R0.y, R0.x, R0.x, -R0;\n"
- "RSQ R0.z, R0.y;\n"
+ "MUL R0.y, R0.x, c[6].x;\n"
+ "MUL R0.z, R0, c[6].y;\n"
+ "MAD R0.x, R0.y, R0.y, -R0.z;\n"
+ "RSQ R0.z, R0.x;\n"
+ "MOV R0.x, c[6];\n"
+ "MUL R0.w, R0.x, c[1].x;\n"
"RCP R0.z, R0.z;\n"
- "ADD R0.x, -R0, R0.z;\n"
+ "ADD R0.x, -R0.y, R0.z;\n"
+ "RCP R0.y, R0.w;\n"
"MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MOV R0.y, c[6].x;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.y, R0.y;\n"
"MUL R0.x, R0, R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
"MUL R2.xyz, R0.w, R1;\n"
@@ -2225,8 +2225,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
- "MUL R0.xy, R0, c[0];\n"
"ADD R0.z, R0, R0.w;\n"
+ "MUL R0.xy, R0, c[0];\n"
"ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
"MUL R0.y, R0.z, c[8];\n"
@@ -2235,12 +2235,12 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"RSQ R0.y, R0.y;\n"
"RCP R0.y, R0.y;\n"
"ADD R1.x, -R0, R0.y;\n"
- "MOV R0.z, c[8].x;\n"
- "MUL R0.z, R0, c[1].x;\n"
- "RCP R1.y, R0.z;\n"
- "ADD R0.xy, fragment.position, c[6];\n"
- "MUL R0.xy, R0, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "MOV R0.x, c[8];\n"
+ "MUL R0.x, R0, c[1];\n"
+ "RCP R1.y, R0.x;\n"
+ "ADD R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
+ "MUL R0.zw, R0, c[5].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1.x, R1, R1.y;\n"
"DP4 R1.y, R0, c[7];\n"
"TEX R0, R1, texture[1], 1D;\n"
@@ -2260,19 +2260,19 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.zw, R0.xyxy, R0.xyxy;\n"
"MUL R0.xy, R0, c[0];\n"
- "ADD R0.x, R0, R0.y;\n"
"ADD R0.z, R0, R0.w;\n"
+ "ADD R0.x, R0, R0.y;\n"
"MUL R0.z, -R0, c[1].x;\n"
"MUL R0.y, R0.z, c[5];\n"
"MUL R0.x, R0, c[5];\n"
"MAD R0.z, R0.x, R0.x, -R0.y;\n"
"MOV R0.y, c[5].x;\n"
"RSQ R0.z, R0.z;\n"
- "MUL R0.y, R0, c[1].x;\n"
- "RCP R0.z, R0.z;\n"
- "RCP R0.y, R0.y;\n"
- "ADD R0.x, -R0, R0.z;\n"
- "MUL R0.x, R0, R0.y;\n"
+ "MUL R0.w, R0.y, c[1].x;\n"
+ "RCP R0.y, R0.z;\n"
+ "RCP R0.z, R0.w;\n"
+ "ADD R0.x, -R0, R0.y;\n"
+ "MUL R0.x, R0, R0.z;\n"
"TEX result.color, R0, texture[0], 1D;\n"
"END\n"
;
@@ -2280,9 +2280,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_RADIAL_COMPOSITION_MOD
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF =
"!!ARBfp1.0\n"
"PARAM c[13] = { program.local[0..9],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2349,9 +2349,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2410,9 +2410,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2467,9 +2467,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 2, 1 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2542,9 +2542,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2606,9 +2606,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2670,9 +2670,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 1, 1e-006 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 1e-006 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2747,9 +2747,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 1, 9.9999997e-006 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 9.9999997e-006 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2761,16 +2761,16 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
- "ABS R0.z, R0.x;\n"
- "ABS R0.w, R0.y;\n"
- "ADD R0.w, R0, -R0.z;\n"
+ "ABS R0.w, R0.x;\n"
+ "ABS R0.z, R0.y;\n"
+ "ADD R0.z, R0, -R0.w;\n"
"ADD R1.x, R0.y, c[8];\n"
- "ABS R0.w, R0;\n"
- "CMP R0.y, -R0.w, R0, R1.x;\n"
- "ABS R0.w, -R0.y;\n"
- "MAX R1.x, R0.z, R0.w;\n"
+ "ABS R0.z, R0;\n"
+ "CMP R0.y, -R0.z, R0, R1.x;\n"
+ "ABS R0.z, -R0.y;\n"
+ "MAX R1.x, R0.w, R0.z;\n"
"RCP R1.y, R1.x;\n"
- "MIN R1.x, R0.z, R0.w;\n"
+ "MIN R1.x, R0.w, R0.z;\n"
"MUL R1.x, R1, R1.y;\n"
"MUL R1.y, R1.x, R1.x;\n"
"MAD R1.z, R1.y, c[8].y, c[8];\n"
@@ -2779,8 +2779,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"MAD R1.z, R1, R1.y, -c[9].y;\n"
"MAD R1.y, R1.z, R1, c[9].z;\n"
"MUL R1.x, R1.y, R1;\n"
- "ADD R0.z, -R0, R0.w;\n"
"ADD R1.y, -R1.x, c[9].w;\n"
+ "ADD R0.z, -R0.w, R0;\n"
"CMP R0.z, -R0, R1.y, R1.x;\n"
"ADD R0.w, -R0.z, c[10].x;\n"
"CMP R0.x, R0, R0.w, R0.z;\n"
@@ -2825,9 +2825,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 2, 1 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2900,10 +2900,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT =
"!!ARBfp1.0\n"
"PARAM c[12] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1, 9.9999997e-006 },\n"
- " { 2, 3, 8 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 2 },\n"
+ " { 9.9999997e-006, 8, 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -2916,86 +2916,86 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
- "ABS R0.z, R0.x;\n"
- "ABS R0.w, R0.y;\n"
- "ADD R0.w, R0, -R0.z;\n"
- "ADD R1.x, R0.y, c[8].y;\n"
- "ABS R0.w, R0;\n"
- "CMP R0.y, -R0.w, R0, R1.x;\n"
- "ABS R0.w, -R0.y;\n"
- "MAX R1.x, R0.z, R0.w;\n"
+ "ABS R0.w, R0.x;\n"
+ "ABS R0.z, R0.y;\n"
+ "ADD R0.z, R0, -R0.w;\n"
+ "ADD R1.x, R0.y, c[8];\n"
+ "ABS R0.z, R0;\n"
+ "CMP R0.y, -R0.z, R0, R1.x;\n"
+ "ABS R0.z, -R0.y;\n"
+ "MAX R1.x, R0.w, R0.z;\n"
"RCP R1.y, R1.x;\n"
- "MIN R1.x, R0.z, R0.w;\n"
+ "MIN R1.x, R0.w, R0.z;\n"
"MUL R1.x, R1, R1.y;\n"
"MUL R1.y, R1.x, R1.x;\n"
- "MAD R1.z, R1.y, c[9].x, c[9].y;\n"
- "MAD R1.z, R1, R1.y, -c[9];\n"
- "MAD R1.z, R1, R1.y, c[9].w;\n"
- "MAD R1.z, R1, R1.y, -c[10].x;\n"
- "MAD R1.y, R1.z, R1, c[10];\n"
+ "MAD R1.z, R1.y, c[8].y, c[8];\n"
+ "MAD R1.z, R1, R1.y, -c[8].w;\n"
+ "MAD R1.z, R1, R1.y, c[9].x;\n"
+ "MAD R1.z, R1, R1.y, -c[9].y;\n"
+ "MAD R1.y, R1.z, R1, c[9].z;\n"
"MUL R1.x, R1.y, R1;\n"
- "ADD R1.y, -R1.x, c[8].w;\n"
- "ADD R0.z, -R0, R0.w;\n"
+ "ADD R1.y, -R1.x, c[9].w;\n"
+ "ADD R0.z, -R0.w, R0;\n"
"CMP R0.z, -R0, R1.y, R1.x;\n"
- "ADD R0.w, -R0.z, c[8].z;\n"
+ "ADD R0.w, -R0.z, c[10].x;\n"
"CMP R0.x, R0, R0.w, R0.z;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
"CMP R0.x, -R0.y, -R0, R0;\n"
+ "TEX R1, R0.zwzw, texture[0], 2D;\n"
+ "MAX R0.y, R1.w, c[11].x;\n"
+ "RCP R2.w, R0.y;\n"
+ "MUL R5.xyz, R1, R2.w;\n"
+ "RSQ R2.x, R5.x;\n"
+ "RSQ R2.z, R5.z;\n"
+ "RSQ R2.y, R5.y;\n"
"ADD R0.x, R0, c[0];\n"
- "MUL R1.x, R0, c[8];\n"
- "FLR R1.y, R1.x;\n"
- "MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "MAX R2.x, R0.w, c[10].w;\n"
- "RCP R2.w, R2.x;\n"
- "MUL R2.xyz, R0, R2.w;\n"
- "MAD R6.xyz, -R2, c[11].z, c[11].y;\n"
- "MAD R3.xyz, -R0, R2.w, c[10].z;\n"
- "RSQ R2.w, R2.x;\n"
- "RCP R2.x, R2.w;\n"
- "ADD R1.x, R1, -R1.y;\n"
- "TEX R1, R1, texture[2], 1D;\n"
- "MAD R4.xyz, R1, c[11].x, -R1.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R5.xyz, -R5, R6, R1.w;\n"
- "MAD R3.xyz, -R3, R4, R1.w;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R0, R5;\n"
- "MUL R3.xyz, R0, R3;\n"
- "ADD R2.w, -R0, c[10].z;\n"
+ "MUL R0.x, R0, c[10].y;\n"
+ "FLR R0.y, R0.x;\n"
+ "ADD R0.x, R0, -R0.y;\n"
+ "TEX R0, R0, texture[2], 1D;\n"
+ "MAD R3.xyz, R0, c[10].w, -R0.w;\n"
+ "MAD R6.xyz, -R5, c[11].y, c[11].z;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
- "MAD R2.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R1.w, R0, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R1, c[11].x;\n"
- "MUL R2.xyz, R0, c[11].z;\n"
- "SGE R2.xyz, R2, R0.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
+ "MAD R2.xyz, R1.w, R2, -R1;\n"
+ "MUL R2.xyz, R3, R2;\n"
+ "MAD R4.xyz, R0.w, R1, R2;\n"
+ "MAD R2.xyz, -R1, R2.w, c[10].z;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MUL R3.xyz, R0, c[10].w;\n"
+ "MUL R4.xyz, R1, c[11].y;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "ADD R2.w, -R1, c[10].z;\n"
+ "MUL R6.xyz, R1, R6;\n"
"SGE R4.xyz, R4, R1.w;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[10].z;\n"
- "MAD R2.xyz, R0, R2.x, R1;\n"
- "ADD R1.z, R1.w, R0.w;\n"
- "MAD R2.w, -R1, R0, R1.z;\n"
- "ADD R1.xy, fragment.position, c[6];\n"
- "MUL R1.xy, R1, c[4];\n"
- "TEX R1, R1, texture[1], 2D;\n"
- "ADD R2, R2, -R0;\n"
- "DP4 R1.x, R1, c[7];\n"
- "MAD result.color, R1.x, R2, R0;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, -R0.w, c[10].z;\n"
+ "MAD R2.xyz, R1, R0.x, R2;\n"
+ "ADD R0.z, R0.w, R1.w;\n"
+ "MAD R2.w, -R0, R1, R0.z;\n"
+ "ADD R0.xy, fragment.position, c[6];\n"
+ "MUL R0.xy, R0, c[4];\n"
+ "TEX R0, R0, texture[1], 2D;\n"
+ "ADD R2, R2, -R1;\n"
+ "DP4 R0.x, R0, c[7];\n"
+ "MAD result.color, R0.x, R2, R1;\n"
"END\n"
;
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 2 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3055,9 +3055,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION =
"!!ARBfp1.0\n"
"PARAM c[11] = { program.local[0..7],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 2, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3120,9 +3120,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SIMPLE_PORTER_DUFF_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[10] = { program.local[0..6],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3183,9 +3183,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_MULTIPLY_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3238,9 +3238,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SCREEN_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3288,9 +3288,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_OVERLAY_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 2, 1 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3356,9 +3356,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DARKEN_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3414,9 +3414,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_LIGHTEN_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3472,9 +3472,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORDODGE_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 1, 1e-006 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 1e-006 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3542,9 +3542,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_COLORBURN_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 1, 9.9999997e-006 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 9.9999997e-006 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3556,16 +3556,16 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
- "ABS R0.z, R0.x;\n"
- "ABS R0.w, R0.y;\n"
- "ADD R0.w, R0, -R0.z;\n"
+ "ABS R0.w, R0.x;\n"
+ "ABS R0.z, R0.y;\n"
+ "ADD R0.z, R0, -R0.w;\n"
"ADD R1.x, R0.y, c[5];\n"
- "ABS R0.w, R0;\n"
- "CMP R0.y, -R0.w, R0, R1.x;\n"
- "ABS R0.w, -R0.y;\n"
- "MAX R1.x, R0.z, R0.w;\n"
+ "ABS R0.z, R0;\n"
+ "CMP R0.y, -R0.z, R0, R1.x;\n"
+ "ABS R0.z, -R0.y;\n"
+ "MAX R1.x, R0.w, R0.z;\n"
"RCP R1.y, R1.x;\n"
- "MIN R1.x, R0.z, R0.w;\n"
+ "MIN R1.x, R0.w, R0.z;\n"
"MUL R1.x, R1, R1.y;\n"
"MUL R1.y, R1.x, R1.x;\n"
"MAD R1.z, R1.y, c[5].y, c[5];\n"
@@ -3574,8 +3574,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"MAD R1.z, R1, R1.y, -c[6].y;\n"
"MAD R1.y, R1.z, R1, c[6].z;\n"
"MUL R1.x, R1.y, R1;\n"
- "ADD R0.z, -R0, R0.w;\n"
"ADD R1.y, -R1.x, c[6].w;\n"
+ "ADD R0.z, -R0.w, R0;\n"
"CMP R0.z, -R0, R1.y, R1.x;\n"
"ADD R0.w, -R0.z, c[7].x;\n"
"CMP R0.x, R0, R0.w, R0.z;\n"
@@ -3614,9 +3614,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_HARDLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.0020000001, -0.01348047, 0.057477314, 0.12123907 },\n"
- " { 0.19563593, 0.33299461, 0.99999565, 1.5707964 },\n"
- " { 3.1415927, 0.15915494, 2, 1 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3683,10 +3683,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[9] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 1, 9.9999997e-006 },\n"
- " { 2, 3, 8 } };\n"
+ " { 0.0020000001, -0.01348047, 0.05747731, 0.1212391 },\n"
+ " { 0.1956359, 0.33299461, 0.99999559, 1.570796 },\n"
+ " { 3.141593, 0.15915494, 1, 2 },\n"
+ " { 9.9999997e-006, 8, 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3699,80 +3699,80 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
- "ABS R0.z, R0.x;\n"
- "ABS R0.w, R0.y;\n"
- "ADD R0.w, R0, -R0.z;\n"
- "ADD R1.x, R0.y, c[5].y;\n"
- "ABS R0.w, R0;\n"
- "CMP R0.y, -R0.w, R0, R1.x;\n"
- "ABS R0.w, -R0.y;\n"
- "MAX R1.x, R0.z, R0.w;\n"
+ "ABS R0.w, R0.x;\n"
+ "ABS R0.z, R0.y;\n"
+ "ADD R0.z, R0, -R0.w;\n"
+ "ADD R1.x, R0.y, c[5];\n"
+ "ABS R0.z, R0;\n"
+ "CMP R0.y, -R0.z, R0, R1.x;\n"
+ "ABS R0.z, -R0.y;\n"
+ "MAX R1.x, R0.w, R0.z;\n"
"RCP R1.y, R1.x;\n"
- "MIN R1.x, R0.z, R0.w;\n"
+ "MIN R1.x, R0.w, R0.z;\n"
"MUL R1.x, R1, R1.y;\n"
"MUL R1.y, R1.x, R1.x;\n"
- "MAD R1.z, R1.y, c[6].x, c[6].y;\n"
- "MAD R1.z, R1, R1.y, -c[6];\n"
- "MAD R1.z, R1, R1.y, c[6].w;\n"
- "MAD R1.z, R1, R1.y, -c[7].x;\n"
- "MAD R1.y, R1.z, R1, c[7];\n"
+ "MAD R1.z, R1.y, c[5].y, c[5];\n"
+ "MAD R1.z, R1, R1.y, -c[5].w;\n"
+ "MAD R1.z, R1, R1.y, c[6].x;\n"
+ "MAD R1.z, R1, R1.y, -c[6].y;\n"
+ "MAD R1.y, R1.z, R1, c[6].z;\n"
"MUL R1.x, R1.y, R1;\n"
- "ADD R0.z, -R0, R0.w;\n"
- "ADD R1.y, -R1.x, c[5].w;\n"
+ "ADD R1.y, -R1.x, c[6].w;\n"
+ "ADD R0.z, -R0.w, R0;\n"
"CMP R0.z, -R0, R1.y, R1.x;\n"
- "ADD R0.w, -R0.z, c[5].z;\n"
+ "ADD R0.w, -R0.z, c[7].x;\n"
"CMP R0.x, R0, R0.w, R0.z;\n"
- "CMP R0.x, -R0.y, -R0, R0;\n"
"MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "CMP R0.x, -R0.y, -R0, R0;\n"
"TEX R1, R0.zwzw, texture[0], 2D;\n"
- "MAX R2.x, R1.w, c[7].w;\n"
- "RCP R2.w, R2.x;\n"
- "MUL R2.xyz, R1, R2.w;\n"
- "MAD R6.xyz, -R2, c[8].z, c[8].y;\n"
- "MAD R3.xyz, -R1, R2.w, c[7].z;\n"
- "RSQ R2.w, R2.x;\n"
- "RCP R2.x, R2.w;\n"
+ "MAX R0.y, R1.w, c[8].x;\n"
+ "RCP R2.w, R0.y;\n"
+ "MUL R5.xyz, R1, R2.w;\n"
+ "RSQ R2.x, R5.x;\n"
+ "RSQ R2.z, R5.z;\n"
+ "RSQ R2.y, R5.y;\n"
"ADD R0.x, R0, c[0];\n"
- "MUL R0.x, R0, c[5];\n"
+ "MUL R0.x, R0, c[7].y;\n"
"FLR R0.y, R0.x;\n"
"ADD R0.x, R0, -R0.y;\n"
"TEX R0, R0, texture[1], 1D;\n"
- "MAD R4.xyz, R0, c[8].x, -R0.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R5.xyz, -R5, R6, R0.w;\n"
- "MAD R3.xyz, -R3, R4, R0.w;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R1, R5;\n"
- "MUL R3.xyz, R1, R3;\n"
+ "MAD R3.xyz, R0, c[7].w, -R0.w;\n"
+ "MAD R6.xyz, -R5, c[8].y, c[8].z;\n"
+ "RCP R2.x, R2.x;\n"
"RCP R2.z, R2.z;\n"
"RCP R2.y, R2.y;\n"
"MAD R2.xyz, R1.w, R2, -R1;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R0.w, R1, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R0, c[8].x;\n"
- "MUL R2.xyz, R1, c[8].z;\n"
- "SGE R2.xyz, R2, R1.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "SGE R4.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
+ "MUL R2.xyz, R3, R2;\n"
+ "MAD R4.xyz, R0.w, R1, R2;\n"
+ "MAD R2.xyz, -R1, R2.w, c[7].z;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R3.xyz, R0, c[7].w;\n"
+ "MUL R4.xyz, R1, c[8].y;\n"
+ "MUL R6.xyz, R1, R6;\n"
+ "SGE R4.xyz, R4, R1.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
"ADD R2.w, -R1, c[7].z;\n"
- "MAD R0.xyz, R0, R2.w, R2;\n"
- "ADD R2.x, R0.w, R1.w;\n"
- "ADD R2.y, -R0.w, c[7].z;\n"
- "MAD result.color.xyz, R1, R2.y, R0;\n"
- "MAD result.color.w, -R0, R1, R2.x;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, R0.w, R1.w;\n"
+ "ADD R0.y, -R0.w, c[7].z;\n"
+ "MAD result.color.xyz, R1, R0.y, R2;\n"
+ "MAD result.color.w, -R0, R1, R0.x;\n"
"END\n"
;
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_DIFFERENCE_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 2 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3826,9 +3826,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODES_EXCLUSION_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[8] = { program.local[0..4],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565, 2, 1 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559, 2, 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -3885,9 +3885,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_MASK =
"!!ARBfp1.0\n"
"PARAM c[10] = { program.local[0..6],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"MUL R0.xyz, fragment.position.y, c[2];\n"
@@ -3919,11 +3919,11 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
"ADD R0.w, -R0.z, c[7].z;\n"
"CMP R0.x, R0, R0.w, R0.z;\n"
"CMP R0.x, -R0.y, -R0, R0;\n"
- "ADD R0.z, R0.x, c[0].x;\n"
- "MUL R1.x, R0.z, c[7];\n"
+ "ADD R0.x, R0, c[0];\n"
+ "MUL R1.x, R0, c[7];\n"
"FLR R1.y, R1.x;\n"
- "ADD R0.xy, fragment.position, c[5];\n"
- "MUL R0.xy, R0, c[4];\n"
+ "ADD R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
+ "MUL R0.xy, R0.zwzw, c[4];\n"
"TEX R0, R0, texture[0], 2D;\n"
"ADD R1.x, R1, -R1.y;\n"
"DP4 R1.y, R0, c[6];\n"
@@ -3935,9 +3935,9 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_CONICAL_COMPOSITION_MODE_BLEND_MODE_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[7] = { program.local[0..3],\n"
- " { 0.15915494, 0.0020000001, 3.1415927, 1.5707964 },\n"
- " { -0.01348047, 0.057477314, 0.12123907, 0.19563593 },\n"
- " { 0.33299461, 0.99999565 } };\n"
+ " { 0.15915494, 0.0020000001, 3.141593, 1.570796 },\n"
+ " { -0.01348047, 0.05747731, 0.1212391, 0.1956359 },\n"
+ " { 0.33299461, 0.99999559 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"MUL R0.xyz, fragment.position.y, c[2];\n"
@@ -4356,8 +4356,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MOD
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT =
"!!ARBfp1.0\n"
"PARAM c[10] = { program.local[0..7],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -4365,58 +4365,58 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MOD
"TEMP R4;\n"
"TEMP R5;\n"
"TEMP R6;\n"
- "MUL R2.xyz, fragment.position.y, c[2];\n"
- "MAD R3.xyz, fragment.position.x, c[1], R2;\n"
"MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.x, R0.w, c[8].y;\n"
- "RCP R2.w, R1.x;\n"
- "MUL R1.xyz, R0, R2.w;\n"
- "RSQ R1.w, R1.x;\n"
- "RSQ R2.y, R1.y;\n"
- "ADD R3.xyz, R3, c[3];\n"
- "RCP R2.x, R1.w;\n"
- "RCP R1.w, R3.z;\n"
- "MUL R3.xy, R3, R1.w;\n"
- "RSQ R1.w, R1.z;\n"
- "RCP R2.z, R1.w;\n"
- "RCP R2.y, R2.y;\n"
- "MAD R6.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, -R1, c[9].x;\n"
- "ADD R5.xyz, R2, c[8].w;\n"
- "MAD R2.xyz, -R0, R2.w, c[8].x;\n"
- "MUL R3.xy, R3, c[0];\n"
- "ADD R1.w, R3.x, R3.y;\n"
- "MUL R1.w, R1, c[0].z;\n"
- "TEX R1, R1.w, texture[2], 1D;\n"
- "MAD R3.xyz, R1, c[8].z, -R1.w;\n"
- "MUL R4.xyz, R2, R3;\n"
- "MAD R4.xyz, -R4, R5, R1.w;\n"
- "MAD R2.xyz, -R2, R3, R1.w;\n"
- "MUL R5.xyz, R6, R3;\n"
- "MUL R4.xyz, R0, R4;\n"
- "MAD R5.xyz, R1.w, R0, R5;\n"
- "ADD R6.xyz, R5, -R4;\n"
- "MUL R5.xyz, R0, c[9].x;\n"
- "SGE R3.xyz, R5, R0.w;\n"
- "MAD R3.xyz, R3, R6, R4;\n"
- "MUL R2.xyz, R0, R2;\n"
- "MUL R4.xyz, R1, c[8].z;\n"
+ "TEX R1, R0, texture[0], 2D;\n"
+ "MAX R0.w, R1, c[8].z;\n"
+ "RCP R2.w, R0.w;\n"
+ "MUL R2.xyz, R1, R2.w;\n"
+ "RSQ R0.w, R2.x;\n"
+ "MUL R5.xyz, -R2, c[8].w;\n"
+ "MUL R0.xyz, fragment.position.y, c[2];\n"
+ "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
+ "ADD R0.xyz, R0, c[3];\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "ADD R0.x, R0, R0.y;\n"
+ "RSQ R0.z, R2.y;\n"
+ "RSQ R0.y, R2.z;\n"
+ "MAD R2.xyz, -R1, R2.w, c[8].x;\n"
+ "RCP R3.x, R0.w;\n"
+ "RCP R3.y, R0.z;\n"
+ "RCP R3.z, R0.y;\n"
+ "MUL R0.x, R0, c[0].z;\n"
+ "TEX R0, R0, texture[2], 1D;\n"
+ "MAD R4.xyz, R1.w, R3, -R1;\n"
+ "MAD R3.xyz, R0, c[8].y, -R0.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[9].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MUL R3.xyz, R0, c[8].y;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R4.xyz, R0.w, R1, R4;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R4.xyz, R1, c[8].w;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "ADD R2.w, -R1, c[8].x;\n"
+ "MUL R6.xyz, R1, R6;\n"
"SGE R4.xyz, R4, R1.w;\n"
- "ADD R3.xyz, R3, -R2;\n"
- "MAD R2.xyz, R4, R3, R2;\n"
- "ADD R2.w, -R0, c[8].x;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[8];\n"
- "MAD R2.xyz, R0, R2.x, R1;\n"
- "ADD R1.z, R1.w, R0.w;\n"
- "MAD R2.w, -R1, R0, R1.z;\n"
- "ADD R1.xy, fragment.position, c[6];\n"
- "MUL R1.xy, R1, c[4];\n"
- "TEX R1, R1, texture[1], 2D;\n"
- "ADD R2, R2, -R0;\n"
- "DP4 R1.x, R1, c[7];\n"
- "MAD result.color, R1.x, R2, R0;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, -R0.w, c[8];\n"
+ "MAD R2.xyz, R1, R0.x, R2;\n"
+ "ADD R0.z, R0.w, R1.w;\n"
+ "MAD R2.w, -R0, R1, R0.z;\n"
+ "ADD R0.xy, fragment.position, c[6];\n"
+ "MUL R0.xy, R0, c[4];\n"
+ "TEX R0, R0, texture[1], 2D;\n"
+ "ADD R2, R2, -R1;\n"
+ "DP4 R0.x, R0, c[7];\n"
+ "MAD result.color, R0.x, R2, R1;\n"
"END\n"
;
@@ -4815,8 +4815,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MOD
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[7] = { program.local[0..4],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -4824,52 +4824,52 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_LINEAR_COMPOSITION_MOD
"TEMP R4;\n"
"TEMP R5;\n"
"TEMP R6;\n"
- "MUL R2.xyz, fragment.position.y, c[2];\n"
- "MAD R3.xyz, fragment.position.x, c[1], R2;\n"
"MUL R0.xy, fragment.position, c[4];\n"
"TEX R1, R0, texture[0], 2D;\n"
- "MAX R0.x, R1.w, c[5].y;\n"
- "RCP R2.w, R0.x;\n"
- "MUL R0.xyz, R1, R2.w;\n"
- "RSQ R0.w, R0.x;\n"
- "RSQ R2.y, R0.y;\n"
- "ADD R3.xyz, R3, c[3];\n"
- "RCP R2.x, R0.w;\n"
- "RCP R0.w, R3.z;\n"
- "MUL R3.xy, R3, R0.w;\n"
- "RSQ R0.w, R0.z;\n"
- "RCP R2.z, R0.w;\n"
- "RCP R2.y, R2.y;\n"
- "MAD R6.xyz, R1.w, R2, -R1;\n"
- "MUL R2.xyz, -R0, c[6].x;\n"
- "ADD R5.xyz, R2, c[5].w;\n"
+ "MAX R0.w, R1, c[5].z;\n"
+ "RCP R2.w, R0.w;\n"
+ "MUL R2.xyz, R1, R2.w;\n"
+ "RSQ R0.w, R2.x;\n"
+ "MUL R5.xyz, -R2, c[5].w;\n"
+ "MUL R0.xyz, fragment.position.y, c[2];\n"
+ "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
+ "ADD R0.xyz, R0, c[3];\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "ADD R0.x, R0, R0.y;\n"
+ "RSQ R0.z, R2.y;\n"
+ "RSQ R0.y, R2.z;\n"
"MAD R2.xyz, -R1, R2.w, c[5].x;\n"
- "MUL R3.xy, R3, c[0];\n"
- "ADD R0.w, R3.x, R3.y;\n"
- "MUL R0.w, R0, c[0].z;\n"
- "TEX R0, R0.w, texture[1], 1D;\n"
- "MAD R3.xyz, R0, c[5].z, -R0.w;\n"
- "MUL R4.xyz, R2, R3;\n"
- "MAD R4.xyz, -R4, R5, R0.w;\n"
- "MUL R5.xyz, R6, R3;\n"
+ "RCP R3.x, R0.w;\n"
+ "RCP R3.y, R0.z;\n"
+ "RCP R3.z, R0.y;\n"
+ "MUL R0.x, R0, c[0].z;\n"
+ "TEX R0, R0, texture[1], 1D;\n"
+ "MAD R4.xyz, R1.w, R3, -R1;\n"
+ "MAD R3.xyz, R0, c[5].y, -R0.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[6].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
"MAD R2.xyz, -R2, R3, R0.w;\n"
- "MUL R4.xyz, R1, R4;\n"
- "MAD R5.xyz, R0.w, R1, R5;\n"
- "ADD R6.xyz, R5, -R4;\n"
- "MUL R5.xyz, R1, c[6].x;\n"
- "SGE R3.xyz, R5, R1.w;\n"
- "MAD R3.xyz, R3, R6, R4;\n"
+ "MUL R3.xyz, R0, c[5].y;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R4.xyz, R0.w, R1, R4;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R4.xyz, R1, c[5].w;\n"
+ "MUL R6.xyz, R1, R6;\n"
+ "SGE R4.xyz, R4, R1.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
"MUL R2.xyz, R1, R2;\n"
- "MUL R4.xyz, R0, c[5].z;\n"
- "ADD R3.xyz, R3, -R2;\n"
- "SGE R4.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R4, R3, R2;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
"ADD R2.w, -R1, c[5].x;\n"
- "MAD R0.xyz, R0, R2.w, R2;\n"
- "ADD R2.x, R0.w, R1.w;\n"
- "ADD R2.y, -R0.w, c[5].x;\n"
- "MAD result.color.xyz, R1, R2.y, R0;\n"
- "MAD result.color.w, -R0, R1, R2.x;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, R0.w, R1.w;\n"
+ "ADD R0.y, -R0.w, c[5].x;\n"
+ "MAD result.color.xyz, R1, R0.y, R2;\n"
+ "MAD result.color.w, -R0, R1, R0.x;\n"
"END\n"
;
@@ -5333,8 +5333,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT =
"!!ARBfp1.0\n"
"PARAM c[10] = { program.local[0..7],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -5343,55 +5343,55 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
"TEMP R5;\n"
"TEMP R6;\n"
"MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.x, R0.w, c[8].y;\n"
- "RCP R2.w, R1.x;\n"
- "MUL R1.xyz, R0, R2.w;\n"
- "RSQ R1.w, R1.x;\n"
- "RCP R2.x, R1.w;\n"
- "RSQ R1.w, R1.y;\n"
- "RSQ R2.z, R1.z;\n"
- "MUL R3.xyz, fragment.position.y, c[2];\n"
- "MAD R3.xyz, fragment.position.x, c[1], R3;\n"
- "ADD R3.xyz, R3, c[3];\n"
- "RCP R2.y, R1.w;\n"
- "RCP R1.w, R3.z;\n"
- "MUL R3.xy, R3, R1.w;\n"
- "RCP R2.z, R2.z;\n"
- "MAD R6.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, -R1, c[9].x;\n"
- "ADD R5.xyz, R2, c[8].w;\n"
- "MAD R2.xyz, -R0, R2.w, c[8].x;\n"
- "MUL R3.xy, R3, c[0];\n"
- "TEX R1, R3, texture[2], 2D;\n"
- "MAD R3.xyz, R1, c[8].z, -R1.w;\n"
- "MUL R4.xyz, R2, R3;\n"
- "MAD R4.xyz, -R4, R5, R1.w;\n"
- "MAD R2.xyz, -R2, R3, R1.w;\n"
- "MUL R5.xyz, R6, R3;\n"
- "MUL R4.xyz, R0, R4;\n"
- "MAD R5.xyz, R1.w, R0, R5;\n"
- "ADD R6.xyz, R5, -R4;\n"
- "MUL R5.xyz, R0, c[9].x;\n"
- "SGE R3.xyz, R5, R0.w;\n"
- "MAD R3.xyz, R3, R6, R4;\n"
- "MUL R2.xyz, R0, R2;\n"
- "MUL R4.xyz, R1, c[8].z;\n"
+ "TEX R1, R0, texture[0], 2D;\n"
+ "MAX R0.x, R1.w, c[8].z;\n"
+ "RCP R2.w, R0.x;\n"
+ "MUL R2.xyz, R1, R2.w;\n"
+ "RSQ R0.w, R2.x;\n"
+ "RCP R3.x, R0.w;\n"
+ "RSQ R0.w, R2.y;\n"
+ "MUL R5.xyz, -R2, c[8].w;\n"
+ "MUL R0.xyz, fragment.position.y, c[2];\n"
+ "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
+ "ADD R0.xyz, R0, c[3];\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "RSQ R0.z, R2.z;\n"
+ "MAD R2.xyz, -R1, R2.w, c[8].x;\n"
+ "RCP R3.y, R0.w;\n"
+ "RCP R3.z, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "TEX R0, R0, texture[2], 2D;\n"
+ "MAD R4.xyz, R1.w, R3, -R1;\n"
+ "MAD R3.xyz, R0, c[8].y, -R0.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[9].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R0.w;\n"
+ "MUL R3.xyz, R0, c[8].y;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R4.xyz, R0.w, R1, R4;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R4.xyz, R1, c[8].w;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "ADD R2.w, -R1, c[8].x;\n"
+ "MUL R6.xyz, R1, R6;\n"
"SGE R4.xyz, R4, R1.w;\n"
- "ADD R3.xyz, R3, -R2;\n"
- "MAD R2.xyz, R4, R3, R2;\n"
- "ADD R2.w, -R0, c[8].x;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[8];\n"
- "MAD R2.xyz, R0, R2.x, R1;\n"
- "ADD R1.z, R1.w, R0.w;\n"
- "MAD R2.w, -R1, R0, R1.z;\n"
- "ADD R1.xy, fragment.position, c[6];\n"
- "MUL R1.xy, R1, c[4];\n"
- "TEX R1, R1, texture[1], 2D;\n"
- "ADD R2, R2, -R0;\n"
- "DP4 R1.x, R1, c[7];\n"
- "MAD result.color, R1.x, R2, R0;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
+ "MUL R2.xyz, R1, R2;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, -R0.w, c[8];\n"
+ "MAD R2.xyz, R1, R0.x, R2;\n"
+ "ADD R0.z, R0.w, R1.w;\n"
+ "MAD R2.w, -R0, R1, R0.z;\n"
+ "ADD R0.xy, fragment.position, c[6];\n"
+ "MUL R0.xy, R0, c[4];\n"
+ "TEX R0, R0, texture[1], 2D;\n"
+ "ADD R2, R2, -R1;\n"
+ "DP4 R0.x, R0, c[7];\n"
+ "MAD result.color, R0.x, R2, R1;\n"
"END\n"
;
@@ -5475,10 +5475,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
"MUL R0.xyz, fragment.position.y, c[2];\n"
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
- "RCP R1.x, R0.z;\n"
- "MUL R0.xy, R0, R1.x;\n"
- "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
- "TEX R1, R0.zwzw, texture[0], 2D;\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R1.xy, fragment.position, c[6];\n"
+ "TEX R1, R1, texture[0], 2D;\n"
"MUL R2.xyz, R1, c[4].y;\n"
"MUL R0.xy, R0, c[0];\n"
"TEX R0, R0, texture[1], 2D;\n"
@@ -5508,10 +5508,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
"MUL R0.xyz, fragment.position.y, c[2];\n"
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
- "RCP R1.x, R0.z;\n"
- "MUL R0.xy, R0, R1.x;\n"
- "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
- "TEX R1, R0.zwzw, texture[0], 2D;\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R1.xy, fragment.position, c[4];\n"
+ "TEX R1, R1, texture[0], 2D;\n"
"MUL R0.xy, R0, c[0];\n"
"TEX R0, R0, texture[1], 2D;\n"
"ADD R2.x, -R1.w, c[5];\n"
@@ -5768,8 +5768,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[7] = { program.local[0..4],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -5779,48 +5779,48 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_TEXTURE_COMPOSITION_MO
"TEMP R6;\n"
"MUL R0.xy, fragment.position, c[4];\n"
"TEX R1, R0, texture[0], 2D;\n"
- "MAX R0.x, R1.w, c[5].y;\n"
+ "MAX R0.x, R1.w, c[5].z;\n"
"RCP R2.w, R0.x;\n"
- "MUL R0.xyz, R1, R2.w;\n"
- "RSQ R0.w, R0.x;\n"
- "RCP R2.x, R0.w;\n"
- "RSQ R0.w, R0.y;\n"
- "RSQ R2.z, R0.z;\n"
- "MUL R3.xyz, fragment.position.y, c[2];\n"
- "MAD R3.xyz, fragment.position.x, c[1], R3;\n"
- "ADD R3.xyz, R3, c[3];\n"
- "RCP R2.y, R0.w;\n"
- "RCP R0.w, R3.z;\n"
- "MUL R3.xy, R3, R0.w;\n"
- "RCP R2.z, R2.z;\n"
- "MAD R6.xyz, R1.w, R2, -R1;\n"
- "MUL R2.xyz, -R0, c[6].x;\n"
- "ADD R5.xyz, R2, c[5].w;\n"
+ "MUL R2.xyz, R1, R2.w;\n"
+ "RSQ R0.w, R2.x;\n"
+ "RCP R3.x, R0.w;\n"
+ "RSQ R0.w, R2.y;\n"
+ "MUL R5.xyz, -R2, c[5].w;\n"
+ "MUL R0.xyz, fragment.position.y, c[2];\n"
+ "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
+ "ADD R0.xyz, R0, c[3];\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "RSQ R0.z, R2.z;\n"
"MAD R2.xyz, -R1, R2.w, c[5].x;\n"
- "MUL R3.xy, R3, c[0];\n"
- "TEX R0, R3, texture[1], 2D;\n"
- "MAD R3.xyz, R0, c[5].z, -R0.w;\n"
- "MUL R4.xyz, R2, R3;\n"
- "MAD R4.xyz, -R4, R5, R0.w;\n"
- "MUL R5.xyz, R6, R3;\n"
+ "RCP R3.y, R0.w;\n"
+ "RCP R3.z, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "TEX R0, R0, texture[1], 2D;\n"
+ "MAD R4.xyz, R1.w, R3, -R1;\n"
+ "MAD R3.xyz, R0, c[5].y, -R0.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[6].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
"MAD R2.xyz, -R2, R3, R0.w;\n"
- "MUL R4.xyz, R1, R4;\n"
- "MAD R5.xyz, R0.w, R1, R5;\n"
- "ADD R6.xyz, R5, -R4;\n"
- "MUL R5.xyz, R1, c[6].x;\n"
- "SGE R3.xyz, R5, R1.w;\n"
- "MAD R3.xyz, R3, R6, R4;\n"
+ "MUL R3.xyz, R0, c[5].y;\n"
+ "MAD R6.xyz, -R5, R6, R0.w;\n"
+ "MAD R4.xyz, R0.w, R1, R4;\n"
+ "MAD R5.xyz, -R1, R6, R4;\n"
+ "MUL R4.xyz, R1, c[5].w;\n"
+ "MUL R6.xyz, R1, R6;\n"
+ "SGE R4.xyz, R4, R1.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R1, R2, R4;\n"
"MUL R2.xyz, R1, R2;\n"
- "MUL R4.xyz, R0, c[5].z;\n"
- "ADD R3.xyz, R3, -R2;\n"
- "SGE R4.xyz, R4, R0.w;\n"
- "MAD R2.xyz, R4, R3, R2;\n"
+ "SGE R3.xyz, R3, R0.w;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
"ADD R2.w, -R1, c[5].x;\n"
- "MAD R0.xyz, R0, R2.w, R2;\n"
- "ADD R2.x, R0.w, R1.w;\n"
- "ADD R2.y, -R0.w, c[5].x;\n"
- "MAD result.color.xyz, R1, R2.y, R0;\n"
- "MAD result.color.w, -R0, R1, R2.x;\n"
+ "MAD R2.xyz, R0, R2.w, R2;\n"
+ "ADD R0.x, R0.w, R1.w;\n"
+ "ADD R0.y, -R0.w, c[5].x;\n"
+ "MAD result.color.xyz, R1, R0.y, R2;\n"
+ "MAD result.color.w, -R0, R1, R0.x;\n"
"END\n"
;
@@ -5927,12 +5927,12 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
- "MUL R0.zw, R0.xyxy, R0.z;\n"
- "MUL R1.xy, R0.zwzw, c[0];\n"
- "MOV R1.y, -R1;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
+ "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[7];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "TEX R1.x, R1, texture[2], 2D;\n"
+ "ADD R1.x, -R1, c[10];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R2.xyz, R0, c[4].y;\n"
"MUL R3.xyz, R1.w, R2;\n"
@@ -5968,12 +5968,12 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
- "MUL R0.zw, R0.xyxy, R0.z;\n"
- "MUL R1.xy, R0.zwzw, c[0];\n"
- "MOV R1.y, -R1;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.zw, R0.xyxy, c[0].xyxy;\n"
+ "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "TEX R1.x, R1, texture[2], 2D;\n"
+ "ADD R1.x, -R1, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"ADD R2.x, -R0.w, c[8];\n"
"MUL R2.xyz, R1, R2.x;\n"
@@ -5993,7 +5993,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN =
"!!ARBfp1.0\n"
- "PARAM c[8] = { program.local[0..7] };\n"
+ "PARAM c[9] = { program.local[0..7],\n"
+ " { 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6004,12 +6005,12 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
- "TEX R1.x, R0, texture[2], 2D;\n"
- "MUL R0.xy, fragment.position, c[5];\n"
+ "TEX R0.x, R0, texture[2], 2D;\n"
+ "ADD R0.z, -R0.x, c[8].x;\n"
"ADD R3.xy, fragment.position, c[6];\n"
+ "MUL R1, fragment.color.primary, R0.z;\n"
+ "MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
"ADD R2, R1, R0;\n"
"MAD R2, -R1, R0, R2;\n"
"MUL R3.xy, R3, c[4];\n"
@@ -6023,7 +6024,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY =
"!!ARBfp1.0\n"
"PARAM c[9] = { program.local[0..7],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6035,25 +6036,25 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
- "TEX R1.x, R0, texture[2], 2D;\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "ADD R2.w, -R0, c[8].y;\n"
+ "TEX R0.x, R0, texture[2], 2D;\n"
+ "ADD R0.x, -R0, c[8];\n"
+ "MUL R1, fragment.color.primary, R0.x;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
+ "ADD R2.w, -R0, c[8].x;\n"
"ADD R3.xyz, R1.w, -R1;\n"
"ADD R2.xyz, R0.w, -R0;\n"
"MUL R2.xyz, R2, R3;\n"
- "MUL R2.xyz, R2, c[8].x;\n"
+ "MUL R2.xyz, R2, c[8].y;\n"
"MAD R2.xyz, R1.w, R0.w, -R2;\n"
"MUL R4.xyz, R1, R2.w;\n"
"MUL R3.xyz, R1, R0;\n"
"MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[8].y;\n"
- "MAD R3.xyz, R3, c[8].x, R4;\n"
+ "ADD R2.x, -R1.w, c[8];\n"
+ "MAD R3.xyz, R3, c[8].y, R4;\n"
"MAD R3.xyz, R0, R2.x, R3;\n"
"MAD R1.xyz, R0, R2.x, R1;\n"
- "MUL R2.xyz, R0, c[8].x;\n"
+ "MUL R2.xyz, R0, c[8].y;\n"
"ADD R1.xyz, R1, -R3;\n"
"SGE R2.xyz, R2, R0.w;\n"
"MAD R2.xyz, R2, R1, R3;\n"
@@ -6082,11 +6083,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
+ "TEX R1.x, R0, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
+ "ADD R1.x, -R1, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R3.xyz, R1.w, R0;\n"
"MUL R2.xyz, R1, R0.w;\n"
@@ -6120,11 +6120,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
+ "TEX R1.x, R0, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
+ "ADD R1.x, -R1, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R3.xyz, R1.w, R0;\n"
"MUL R2.xyz, R1, R0.w;\n"
@@ -6159,13 +6158,13 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
"TEX R0.x, R0, texture[2], 2D;\n"
+ "ADD R0.x, -R0, c[8];\n"
"MUL R1, fragment.color.primary, R0.x;\n"
"MAX R0.x, R1.w, c[8].y;\n"
"RCP R0.x, R0.x;\n"
- "MAD R0.xyz, -R1, R0.x, c[8].x;\n"
- "MAX R2.xyz, R0, c[8].y;\n"
+ "MAD R2.xyz, -R1, R0.x, c[8].x;\n"
+ "MAX R2.xyz, R2, c[8].y;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
"ADD R2.w, -R1, c[8].x;\n"
@@ -6210,12 +6209,11 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
+ "TEX R0.x, R0, texture[2], 2D;\n"
+ "ADD R1.x, -R0, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R2.xyz, R1.w, R0;\n"
"MAD R3.xyz, R1, R0.w, R2;\n"
"MAD R2.xyz, -R1.w, R0.w, R3;\n"
@@ -6249,7 +6247,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT =
"!!ARBfp1.0\n"
"PARAM c[9] = { program.local[0..7],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6261,23 +6259,23 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
- "TEX R1.x, R0, texture[2], 2D;\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[5];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "ADD R2.w, -R0, c[8].y;\n"
+ "TEX R0.x, R0, texture[2], 2D;\n"
+ "ADD R0.x, -R0, c[8];\n"
+ "MUL R1, fragment.color.primary, R0.x;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[5].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
+ "ADD R2.w, -R0, c[8].x;\n"
"ADD R3.xyz, R1.w, -R1;\n"
"ADD R2.xyz, R0.w, -R0;\n"
"MUL R2.xyz, R2, R3;\n"
- "MUL R2.xyz, R2, c[8].x;\n"
+ "MUL R2.xyz, R2, c[8].y;\n"
"MAD R2.xyz, R1.w, R0.w, -R2;\n"
"MUL R4.xyz, R1, R2.w;\n"
"MAD R2.xyz, R1, R2.w, R2;\n"
"MUL R3.xyz, R1, R0;\n"
- "ADD R2.w, -R1, c[8].y;\n"
- "MAD R3.xyz, R3, c[8].x, R4;\n"
- "MUL R1.xyz, R1, c[8].x;\n"
+ "ADD R2.w, -R1, c[8].x;\n"
+ "MAD R3.xyz, R3, c[8].y, R4;\n"
+ "MUL R1.xyz, R1, c[8].y;\n"
"SGE R1.xyz, R1, R1.w;\n"
"MAD R3.xyz, R0, R2.w, R3;\n"
"MAD R2.xyz, R0, R2.w, R2;\n"
@@ -6297,8 +6295,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT =
"!!ARBfp1.0\n"
"PARAM c[10] = { program.local[0..7],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6306,50 +6304,50 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"TEMP R4;\n"
"TEMP R5;\n"
"TEMP R6;\n"
- "MUL R0.xyz, fragment.position.y, c[2];\n"
- "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
- "ADD R1.xyz, R0, c[3];\n"
- "RCP R0.z, R1.z;\n"
- "MUL R1.xy, R1, R0.z;\n"
- "MUL R1.xy, R1, c[0];\n"
- "MOV R1.y, -R1;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.z, R0.w, c[8].y;\n"
- "RCP R2.w, R1.z;\n"
+ "MAX R1.w, R0, c[8].z;\n"
+ "RCP R2.w, R1.w;\n"
"MUL R2.xyz, R0, R2.w;\n"
- "MUL R6.xyz, -R2, c[9].x;\n"
- "MAD R3.xyz, -R0, R2.w, c[8].x;\n"
+ "RSQ R1.w, R2.x;\n"
+ "MUL R5.xyz, -R2, c[8].w;\n"
+ "MUL R1.xyz, fragment.position.y, c[2];\n"
+ "MAD R1.xyz, fragment.position.x, c[1], R1;\n"
+ "ADD R1.xyz, R1, c[3];\n"
+ "RCP R1.z, R1.z;\n"
+ "MUL R1.xy, R1, R1.z;\n"
+ "MUL R1.xy, R1, c[0];\n"
"TEX R1.x, R1, texture[2], 2D;\n"
+ "RSQ R1.z, R2.y;\n"
+ "RSQ R1.y, R2.z;\n"
+ "MAD R2.xyz, -R0, R2.w, c[8].x;\n"
+ "RCP R3.x, R1.w;\n"
+ "RCP R3.y, R1.z;\n"
+ "RCP R3.z, R1.y;\n"
+ "ADD R1.x, -R1, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
- "MAD R4.xyz, R1, c[8].z, -R1.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R3.xyz, -R3, R4, R1.w;\n"
- "ADD R6.xyz, R6, c[8].w;\n"
- "MAD R5.xyz, -R5, R6, R1.w;\n"
- "RSQ R2.x, R2.x;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R0, R5;\n"
- "MUL R3.xyz, R0, R3;\n"
+ "MAD R4.xyz, R0.w, R3, -R0;\n"
+ "MAD R3.xyz, R1, c[8].y, -R1.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[9].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R1.w;\n"
+ "MUL R3.xyz, R1, c[8].y;\n"
+ "MAD R6.xyz, -R5, R6, R1.w;\n"
+ "MAD R4.xyz, R1.w, R0, R4;\n"
+ "MAD R5.xyz, -R0, R6, R4;\n"
+ "MUL R4.xyz, R0, c[8].w;\n"
+ "SGE R3.xyz, R3, R1.w;\n"
"ADD R2.w, -R0, c[8].x;\n"
- "RCP R2.x, R2.x;\n"
- "RCP R2.z, R2.z;\n"
- "RCP R2.y, R2.y;\n"
- "MAD R2.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R1.w, R0, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R1, c[8].z;\n"
- "MUL R2.xyz, R0, c[9].x;\n"
- "SGE R2.xyz, R2, R0.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
- "SGE R4.xyz, R4, R1.w;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[8];\n"
- "MAD R2.xyz, R0, R2.x, R1;\n"
+ "MUL R6.xyz, R0, R6;\n"
+ "SGE R4.xyz, R4, R0.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R0, R2, R4;\n"
+ "MUL R2.xyz, R0, R2;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
+ "MAD R2.xyz, R1, R2.w, R2;\n"
+ "ADD R1.x, -R1.w, c[8];\n"
+ "MAD R2.xyz, R0, R1.x, R2;\n"
"ADD R1.z, R1.w, R0.w;\n"
"MAD R2.w, -R1, R0, R1.z;\n"
"ADD R1.xy, fragment.position, c[6];\n"
@@ -6364,7 +6362,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE =
"!!ARBfp1.0\n"
"PARAM c[9] = { program.local[0..7],\n"
- " { 2 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6375,17 +6373,16 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
+ "TEX R1.x, R0, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[5];\n"
+ "ADD R1.x, -R1, c[8];\n"
"TEX R0, R0, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"ADD R2.xyz, R1, R0;\n"
"MUL R3.xyz, R1.w, R0;\n"
"MUL R1.xyz, R1, R0.w;\n"
"MIN R1.xyz, R1, R3;\n"
- "MAD R2.xyz, -R1, c[8].x, R2;\n"
+ "MAD R2.xyz, -R1, c[8].y, R2;\n"
"ADD R1.z, R1.w, R0.w;\n"
"MAD R2.w, -R1, R0, R1.z;\n"
"ADD R1.xy, fragment.position, c[6];\n"
@@ -6400,7 +6397,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION =
"!!ARBfp1.0\n"
"PARAM c[9] = { program.local[0..7],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6411,19 +6408,18 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[2], 2D;\n"
+ "TEX R1.x, R0, texture[2], 2D;\n"
"MUL R0.xy, fragment.position, c[5];\n"
"TEX R0, R0, texture[0], 2D;\n"
+ "ADD R1.x, -R1, c[8];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R2.xyz, R1.w, R0;\n"
"MAD R3.xyz, R1, R0.w, R2;\n"
"MUL R2.xyz, R1, R0;\n"
- "MAD R2.xyz, -R2, c[8].x, R3;\n"
- "ADD R2.w, -R0, c[8].y;\n"
+ "MAD R2.xyz, -R2, c[8].y, R3;\n"
+ "ADD R2.w, -R0, c[8].x;\n"
"MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, -R1.w, c[8].y;\n"
+ "ADD R2.x, -R1.w, c[8];\n"
"MAD R2.xyz, R0, R2.x, R1;\n"
"ADD R1.z, R1.w, R0.w;\n"
"MAD R2.w, -R1, R0, R1.z;\n"
@@ -6448,13 +6444,13 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
- "MUL R0.zw, R0.xyxy, R0.z;\n"
- "MUL R1.xy, R0.zwzw, c[0];\n"
- "MOV R1.y, -R1;\n"
- "MUL R0.xy, fragment.position, c[6];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "TEX R1.x, R0, texture[1], 2D;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[6].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R2.xyz, R0, c[4].y;\n"
- "TEX R1.x, R1, texture[1], 2D;\n"
+ "ADD R1.x, -R1, c[7];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R3.xyz, R1.w, R2;\n"
"MUL R2.xyz, R1, c[4].x;\n"
@@ -6483,12 +6479,12 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
"ADD R0.xyz, R0, c[3];\n"
"RCP R0.z, R0.z;\n"
- "MUL R0.zw, R0.xyxy, R0.z;\n"
- "MUL R1.xy, R0.zwzw, c[0];\n"
- "MOV R1.y, -R1;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "TEX R1.x, R1, texture[1], 2D;\n"
+ "MUL R0.xy, R0, R0.z;\n"
+ "MUL R0.xy, R0, c[0];\n"
+ "TEX R1.x, R0, texture[1], 2D;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
+ "ADD R1.x, -R1, c[5];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"ADD R2.x, -R0.w, c[5];\n"
"MUL R2.xyz, R1, R2.x;\n"
@@ -6502,7 +6498,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SCREEN_NOMASK =
"!!ARBfp1.0\n"
- "PARAM c[5] = { program.local[0..4] };\n"
+ "PARAM c[6] = { program.local[0..4],\n"
+ " { 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6512,11 +6509,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"ADD R2, R1, R0;\n"
"MAD result.color, -R1, R0, R2;\n"
@@ -6526,7 +6522,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_OVERLAY_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[6] = { program.local[0..4],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6537,25 +6533,25 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
- "TEX R1.x, R0, texture[1], 2D;\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R0.x, -R0, c[5];\n"
+ "MUL R1, fragment.color.primary, R0.x;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"ADD R3.xyz, R1.w, -R1;\n"
"ADD R2.xyz, R0.w, -R0;\n"
"MUL R2.xyz, R2, R3;\n"
- "ADD R2.w, -R0, c[5].y;\n"
- "MUL R2.xyz, R2, c[5].x;\n"
+ "ADD R2.w, -R0, c[5].x;\n"
+ "MUL R2.xyz, R2, c[5].y;\n"
"MAD R2.xyz, R1.w, R0.w, -R2;\n"
"MAD R2.xyz, R1, R2.w, R2;\n"
"MUL R3.xyz, R1, R2.w;\n"
"MUL R1.xyz, R1, R0;\n"
- "ADD R2.w, -R1, c[5].y;\n"
- "MAD R1.xyz, R1, c[5].x, R3;\n"
+ "ADD R2.w, -R1, c[5].x;\n"
+ "MAD R1.xyz, R1, c[5].y, R3;\n"
"MAD R1.xyz, R0, R2.w, R1;\n"
"MAD R2.xyz, R0, R2.w, R2;\n"
- "MUL R0.xyz, R0, c[5].x;\n"
+ "MUL R0.xyz, R0, c[5].y;\n"
"ADD R2.w, R1, R0;\n"
"ADD R2.xyz, R2, -R1;\n"
"SGE R0.xyz, R0, R0.w;\n"
@@ -6578,11 +6574,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R2.xyz, R1, R0.w;\n"
"MUL R3.xyz, R1.w, R0;\n"
@@ -6610,11 +6605,10 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R2.xyz, R1, R0.w;\n"
"MUL R3.xyz, R1.w, R0;\n"
@@ -6642,31 +6636,31 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
"TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R0.x, -R0, c[5];\n"
"MUL R1, fragment.color.primary, R0.x;\n"
"MAX R0.x, R1.w, c[5].y;\n"
"RCP R0.x, R0.x;\n"
- "MAD R0.xyz, -R1, R0.x, c[5].x;\n"
- "MAX R2.xyz, R0, c[5].y;\n"
+ "MAD R3.xyz, -R1, R0.x, c[5].x;\n"
+ "MAX R3.xyz, R3, c[5].y;\n"
"MUL R0.xy, fragment.position, c[4];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "ADD R2.w, -R1, c[5].x;\n"
- "MUL R3.xyz, R0, R2.w;\n"
+ "ADD R2.x, -R1.w, c[5];\n"
+ "MUL R2.xyz, R0, R2.x;\n"
"ADD R2.w, -R0, c[5].x;\n"
- "MAD R3.xyz, R1, R2.w, R3;\n"
+ "MAD R2.xyz, R1, R2.w, R2;\n"
"MUL R0.xyz, R1.w, R0;\n"
- "RCP R2.x, R2.x;\n"
- "RCP R2.y, R2.y;\n"
- "RCP R2.z, R2.z;\n"
- "MAD R2.xyz, R0, R2, R3;\n"
+ "RCP R3.x, R3.x;\n"
+ "RCP R3.y, R3.y;\n"
+ "RCP R3.z, R3.z;\n"
+ "MAD R3.xyz, R0, R3, R2;\n"
"MAD R0.xyz, R1, R0.w, R0;\n"
- "MAD R3.xyz, R1.w, R0.w, R3;\n"
+ "MAD R2.xyz, R1.w, R0.w, R2;\n"
"MUL R2.w, R1, R0;\n"
"ADD R1.x, R1.w, R0.w;\n"
- "ADD R3.xyz, R3, -R2;\n"
+ "ADD R2.xyz, R2, -R3;\n"
"SGE R0.xyz, R0, R2.w;\n"
- "MAD result.color.xyz, R0, R3, R2;\n"
+ "MAD result.color.xyz, R0, R2, R3;\n"
"MAD result.color.w, -R1, R0, R1.x;\n"
"END\n"
;
@@ -6687,12 +6681,11 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R2.xyz, R1.w, R0;\n"
"MAD R3.xyz, R1, R0.w, R2;\n"
"ADD R2.w, -R0, c[5].x;\n"
@@ -6720,7 +6713,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_HARDLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[6] = { program.local[0..4],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6732,38 +6725,38 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
- "TEX R1.x, R0, texture[1], 2D;\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
- "ADD R2.w, -R0, c[5].y;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R0.x, -R0, c[5];\n"
+ "MUL R1, fragment.color.primary, R0.x;\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
+ "ADD R2.w, -R0, c[5].x;\n"
"ADD R3.xyz, R1.w, -R1;\n"
"ADD R2.xyz, R0.w, -R0;\n"
"MUL R2.xyz, R2, R3;\n"
- "MUL R2.xyz, R2, c[5].x;\n"
+ "MUL R2.xyz, R2, c[5].y;\n"
"MAD R2.xyz, R1.w, R0.w, -R2;\n"
+ "MAD R2.xyz, R1, R2.w, R2;\n"
"MUL R4.xyz, R1, R2.w;\n"
"MUL R3.xyz, R1, R0;\n"
- "MAD R2.xyz, R1, R2.w, R2;\n"
- "ADD R2.w, -R1, c[5].y;\n"
- "MUL R1.xyz, R1, c[5].x;\n"
- "MAD R2.xyz, R0, R2.w, R2;\n"
- "MAD R3.xyz, R3, c[5].x, R4;\n"
- "MAD R0.xyz, R0, R2.w, R3;\n"
- "ADD R2.w, R1, R0;\n"
- "ADD R2.xyz, R2, -R0;\n"
+ "MUL R1.xyz, R1, c[5].y;\n"
+ "ADD R2.w, -R1, c[5].x;\n"
+ "MAD R3.xyz, R3, c[5].y, R4;\n"
+ "MAD R3.xyz, R0, R2.w, R3;\n"
+ "MAD R0.xyz, R0, R2.w, R2;\n"
+ "ADD R2.x, R1.w, R0.w;\n"
+ "ADD R0.xyz, R0, -R3;\n"
"SGE R1.xyz, R1, R1.w;\n"
- "MAD result.color.xyz, R1, R2, R0;\n"
- "MAD result.color.w, -R1, R0, R2;\n"
+ "MAD result.color.xyz, R1, R0, R3;\n"
+ "MAD result.color.w, -R1, R0, R2.x;\n"
"END\n"
;
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_SOFTLIGHT_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[7] = { program.local[0..4],\n"
- " { 1, 9.9999997e-006, 2, 3 },\n"
- " { 8 } };\n"
+ " { 1, 2, 9.9999997e-006, 8 },\n"
+ " { 3 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6771,59 +6764,59 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"TEMP R4;\n"
"TEMP R5;\n"
"TEMP R6;\n"
- "MUL R0.xyz, fragment.position.y, c[2];\n"
- "MAD R0.xyz, fragment.position.x, c[1], R0;\n"
- "ADD R1.xyz, R0, c[3];\n"
- "RCP R0.z, R1.z;\n"
- "MUL R1.xy, R1, R0.z;\n"
- "MUL R1.xy, R1, c[0];\n"
- "MOV R1.y, -R1;\n"
"MUL R0.xy, fragment.position, c[4];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "MAX R1.z, R0.w, c[5].y;\n"
- "RCP R2.w, R1.z;\n"
+ "MAX R1.w, R0, c[5].z;\n"
+ "RCP R2.w, R1.w;\n"
"MUL R2.xyz, R0, R2.w;\n"
- "MUL R6.xyz, -R2, c[6].x;\n"
- "MAD R3.xyz, -R0, R2.w, c[5].x;\n"
+ "RSQ R1.w, R2.x;\n"
+ "MUL R5.xyz, -R2, c[5].w;\n"
+ "MUL R1.xyz, fragment.position.y, c[2];\n"
+ "MAD R1.xyz, fragment.position.x, c[1], R1;\n"
+ "ADD R1.xyz, R1, c[3];\n"
+ "RCP R1.z, R1.z;\n"
+ "MUL R1.xy, R1, R1.z;\n"
+ "MUL R1.xy, R1, c[0];\n"
"TEX R1.x, R1, texture[1], 2D;\n"
+ "RSQ R1.z, R2.y;\n"
+ "RSQ R1.y, R2.z;\n"
+ "MAD R2.xyz, -R0, R2.w, c[5].x;\n"
+ "RCP R3.x, R1.w;\n"
+ "RCP R3.y, R1.z;\n"
+ "RCP R3.z, R1.y;\n"
+ "ADD R1.x, -R1, c[5];\n"
"MUL R1, fragment.color.primary, R1.x;\n"
- "MAD R4.xyz, R1, c[5].z, -R1.w;\n"
- "MUL R5.xyz, R3, R4;\n"
- "MAD R3.xyz, -R3, R4, R1.w;\n"
- "ADD R6.xyz, R6, c[5].w;\n"
- "MAD R5.xyz, -R5, R6, R1.w;\n"
- "RSQ R2.x, R2.x;\n"
- "RSQ R2.z, R2.z;\n"
- "RSQ R2.y, R2.y;\n"
- "MUL R5.xyz, R0, R5;\n"
- "MUL R3.xyz, R0, R3;\n"
- "RCP R2.x, R2.x;\n"
- "RCP R2.z, R2.z;\n"
- "RCP R2.y, R2.y;\n"
- "MAD R2.xyz, R0.w, R2, -R0;\n"
- "MUL R2.xyz, R2, R4;\n"
- "MAD R2.xyz, R1.w, R0, R2;\n"
- "ADD R6.xyz, R2, -R5;\n"
- "MUL R4.xyz, R1, c[5].z;\n"
- "MUL R2.xyz, R0, c[6].x;\n"
- "SGE R2.xyz, R2, R0.w;\n"
- "MAD R2.xyz, R2, R6, R5;\n"
- "ADD R2.xyz, R2, -R3;\n"
- "SGE R4.xyz, R4, R1.w;\n"
- "MAD R2.xyz, R4, R2, R3;\n"
+ "MAD R4.xyz, R0.w, R3, -R0;\n"
+ "MAD R3.xyz, R1, c[5].y, -R1.w;\n"
+ "MUL R4.xyz, R3, R4;\n"
+ "ADD R6.xyz, R5, c[6].x;\n"
+ "MUL R5.xyz, R2, R3;\n"
+ "MAD R2.xyz, -R2, R3, R1.w;\n"
+ "MUL R3.xyz, R1, c[5].y;\n"
+ "MAD R6.xyz, -R5, R6, R1.w;\n"
+ "MAD R4.xyz, R1.w, R0, R4;\n"
+ "MAD R5.xyz, -R0, R6, R4;\n"
+ "MUL R4.xyz, R0, c[5].w;\n"
+ "MUL R6.xyz, R0, R6;\n"
+ "SGE R4.xyz, R4, R0.w;\n"
+ "MAD R4.xyz, R4, R5, R6;\n"
+ "MAD R4.xyz, -R0, R2, R4;\n"
+ "MUL R2.xyz, R0, R2;\n"
+ "SGE R3.xyz, R3, R1.w;\n"
+ "MAD R2.xyz, R3, R4, R2;\n"
"ADD R2.w, -R0, c[5].x;\n"
- "MAD R1.xyz, R1, R2.w, R2;\n"
- "ADD R2.x, R1.w, R0.w;\n"
- "ADD R2.y, -R1.w, c[5].x;\n"
- "MAD result.color.xyz, R0, R2.y, R1;\n"
- "MAD result.color.w, -R1, R0, R2.x;\n"
+ "MAD R2.xyz, R1, R2.w, R2;\n"
+ "ADD R1.x, R1.w, R0.w;\n"
+ "ADD R1.y, -R1.w, c[5].x;\n"
+ "MAD result.color.xyz, R0, R1.y, R2;\n"
+ "MAD result.color.w, -R1, R0, R1.x;\n"
"END\n"
;
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_DIFFERENCE_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[6] = { program.local[0..4],\n"
- " { 2 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6834,18 +6827,17 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R3.xyz, R1.w, R0;\n"
"MUL R2.xyz, R1, R0.w;\n"
"ADD R0.xyz, R1, R0;\n"
"MIN R2.xyz, R2, R3;\n"
"ADD R1.x, R1.w, R0.w;\n"
- "MAD result.color.xyz, -R2, c[5].x, R0;\n"
+ "MAD result.color.xyz, -R2, c[5].y, R0;\n"
"MAD result.color.w, -R1, R0, R1.x;\n"
"END\n"
;
@@ -6853,7 +6845,7 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODES_EXCLUSION_NOMASK =
"!!ARBfp1.0\n"
"PARAM c[6] = { program.local[0..4],\n"
- " { 2, 1 } };\n"
+ " { 1, 2 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"TEMP R2;\n"
@@ -6864,20 +6856,19 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.w, -R0.y;\n"
- "MOV R0.z, R0.x;\n"
- "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
- "MUL R0.xy, fragment.position, c[4];\n"
- "TEX R0, R0, texture[0], 2D;\n"
+ "TEX R0.x, R0, texture[1], 2D;\n"
+ "ADD R1.x, -R0, c[5];\n"
+ "MUL R0.zw, fragment.position.xyxy, c[4].xyxy;\n"
+ "TEX R0, R0.zwzw, texture[0], 2D;\n"
"MUL R1, fragment.color.primary, R1.x;\n"
"MUL R2.xyz, R1.w, R0;\n"
"MAD R3.xyz, R1, R0.w, R2;\n"
"MUL R2.xyz, R1, R0;\n"
- "MAD R2.xyz, -R2, c[5].x, R3;\n"
- "ADD R2.w, -R0, c[5].y;\n"
+ "MAD R2.xyz, -R2, c[5].y, R3;\n"
+ "ADD R2.w, -R0, c[5].x;\n"
"MAD R1.xyz, R1, R2.w, R2;\n"
"ADD R2.x, R1.w, R0.w;\n"
- "ADD R2.y, -R1.w, c[5];\n"
+ "ADD R2.y, -R1.w, c[5].x;\n"
"MAD result.color.xyz, R0, R2.y, R1;\n"
"MAD result.color.w, -R1, R0, R2.x;\n"
"END\n"
@@ -6885,29 +6876,31 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_MASK =
"!!ARBfp1.0\n"
- "PARAM c[7] = { program.local[0..6] };\n"
+ "PARAM c[8] = { program.local[0..6],\n"
+ " { 1 } };\n"
"TEMP R0;\n"
"TEMP R1;\n"
"MUL R0.xyz, fragment.position.y, c[2];\n"
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
- "ADD R1.xyz, R0, c[3];\n"
- "RCP R0.z, R1.z;\n"
- "MUL R0.zw, R1.xyxy, R0.z;\n"
- "MUL R1.xy, R0.zwzw, c[0];\n"
- "MOV R1.y, -R1;\n"
+ "ADD R0.xyz, R0, c[3];\n"
+ "RCP R0.z, R0.z;\n"
+ "MUL R0.zw, R0.xyxy, R0.z;\n"
+ "MUL R0.zw, R0, c[0].xyxy;\n"
+ "TEX R1.x, R0.zwzw, texture[1], 2D;\n"
"ADD R0.xy, fragment.position, c[5];\n"
"MUL R0.xy, R0, c[4];\n"
"TEX R0, R0, texture[0], 2D;\n"
- "TEX R1.x, R1, texture[1], 2D;\n"
- "DP4 R0.x, R0, c[6];\n"
- "MUL R1, fragment.color.primary, R1.x;\n"
- "MUL result.color, R1, R0.x;\n"
+ "DP4 R1.y, R0, c[6];\n"
+ "ADD R1.x, -R1, c[7];\n"
+ "MUL R0, fragment.color.primary, R1.x;\n"
+ "MUL result.color, R0, R1.y;\n"
"END\n"
;
static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MODE_BLEND_MODE_NOMASK =
"!!ARBfp1.0\n"
- "PARAM c[4] = { program.local[0..3] };\n"
+ "PARAM c[5] = { program.local[0..3],\n"
+ " { 1 } };\n"
"TEMP R0;\n"
"MUL R0.xyz, fragment.position.y, c[2];\n"
"MAD R0.xyz, fragment.position.x, c[1], R0;\n"
@@ -6915,8 +6908,8 @@ static const char *FragmentProgram_FRAGMENT_PROGRAM_BRUSH_PATTERN_COMPOSITION_MO
"RCP R0.z, R0.z;\n"
"MUL R0.xy, R0, R0.z;\n"
"MUL R0.xy, R0, c[0];\n"
- "MOV R0.y, -R0;\n"
"TEX R0.x, R0, texture[0], 2D;\n"
+ "ADD R0.x, -R0, c[4];\n"
"MUL result.color, fragment.color.primary, R0.x;\n"
"END\n"
;
diff --git a/src/opengl/util/generator.cpp b/src/opengl/util/generator.cpp
index 62d19ff..0202fe1 100644
--- a/src/opengl/util/generator.cpp
+++ b/src/opengl/util/generator.cpp
@@ -54,6 +54,8 @@ QT_BEGIN_NAMESPACE
QT_USE_NAMESPACE
+#define TAB " "
+
typedef QPair<QString, QString> QStringPair;
QString readSourceFile(const QString &sourceFile, bool fragmentProgram = false)
@@ -243,6 +245,30 @@ QString trimmed(QString source)
return result;
}
+void writeVariablesEnum(QTextStream &out, const char *name, const QSet<QString> &s)
+{
+ out << "enum " << name << " {";
+ QSet<QString>::const_iterator it = s.begin();
+ if (it != s.end()) {
+ out << "\n" TAB "VAR_" << it->toUpper();
+ for (++it; it != s.end(); ++it)
+ out << ",\n" TAB "VAR_" << it->toUpper();
+ }
+ out << "\n};\n\n";
+}
+
+void writeTypesEnum(QTextStream &out, const char *name, const QList<QStringPair> &s)
+{
+ out << "enum " << name << " {";
+ QList<QStringPair>::const_iterator it = s.begin();
+ if (it != s.end()) {
+ out << "\n" TAB << it->first;
+ for (++it; it != s.end(); ++it)
+ out << ",\n" TAB << it->first;
+ }
+ out << "\n};\n\n";
+}
+
void writeIncludeFile(const QSet<QString> &variables,
const QList<QStringPair> &brushes,
const QList<QStringPair> &compositionModes,
@@ -257,7 +283,7 @@ void writeIncludeFile(const QSet<QString> &variables,
QTextStream out(&includeFile);
- QLatin1String tab(" ");
+ QLatin1String tab(TAB);
out << "/****************************************************************************\n"
"**\n"
@@ -265,7 +291,7 @@ void writeIncludeFile(const QSet<QString> &variables,
"** All rights reserved.\n"
"** Contact: Nokia Corporation (qt-info@nokia.com)\n"
"**\n"
- "** This file is part of the test suite of the Qt Toolkit.\n"
+ "** This file is part of the QtOpenGL module of the Qt Toolkit.\n"
"**\n"
"** $QT_BEGIN_LICENSE:LGPL$\n"
"** No Commercial Usage\n"
@@ -315,25 +341,10 @@ void writeIncludeFile(const QSet<QString> &variables,
"//\n"
"\n";
- out << "enum FragmentVariable {\n";
- foreach (QString str, variables)
- out << tab << "VAR_" << str.toUpper() << ",\n";
- out << "};\n\n";
-
- out << "enum FragmentBrushType {\n";
- foreach (QStringPair brush, brushes)
- out << tab << brush.first << ",\n";
- out << "};\n\n";
-
- out << "enum FragmentCompositionModeType {\n";
- foreach (QStringPair mode, compositionModes)
- out << tab << mode.first << ",\n";
- out << "};\n\n";
-
- out << "enum FragmentMaskType {\n";
- foreach (QStringPair mask, masks)
- out << tab << mask.first << ",\n";
- out << "};\n\n";
+ writeVariablesEnum(out, "FragmentVariable", variables);
+ writeTypesEnum(out, "FragmentBrushType", brushes);
+ writeTypesEnum(out, "FragmentCompositionModeType", compositionModes);
+ writeTypesEnum(out, "FragmentMaskType", masks);
out << "static const unsigned int num_fragment_variables = " << variables.size() << ";\n\n";
out << "static const unsigned int num_fragment_brushes = " << brushes.size() << ";\n";
diff --git a/src/opengl/util/masks.conf b/src/opengl/util/masks.conf
index 733ac81..d853d0b 100644
--- a/src/opengl/util/masks.conf
+++ b/src/opengl/util/masks.conf
@@ -1,3 +1,2 @@
FRAGMENT_PROGRAM_MASK_TRAPEZOID_AA trap_exact_aa.glsl
FRAGMENT_PROGRAM_MASK_ELLIPSE_AA ellipse_aa.glsl
-#FRAGMENT_PROGRAM_MASK_ELLIPSE ellipse.glsl
diff --git a/src/opengl/util/pattern_brush.glsl b/src/opengl/util/pattern_brush.glsl
index e070449..31702b8 100644
--- a/src/opengl/util/pattern_brush.glsl
+++ b/src/opengl/util/pattern_brush.glsl
@@ -17,9 +17,7 @@ vec4 brush()
coords *= inv_brush_texture_size;
- coords.y = -coords.y;
-
- float alpha = texture2D(brush_texture, coords).r;
+ float alpha = 1.0 - texture2D(brush_texture, coords).r;
return gl_Color * alpha;
}
diff --git a/src/opengl/util/simple_porter_duff.glsl b/src/opengl/util/simple_porter_duff.glsl
index 83aef48..4cb0599 100644
--- a/src/opengl/util/simple_porter_duff.glsl
+++ b/src/opengl/util/simple_porter_duff.glsl
@@ -7,10 +7,10 @@ vec4 composite(vec4 src, vec4 dst)
result.xyz = porterduff_ab.x * src.xyz * dst.a
+ porterduff_ab.y * dst.xyz * src.a
- + porterduff_xyz.y * src.xyz * (1 - dst.a)
- + porterduff_xyz.z * dst.xyz * (1 - src.a);
+ + porterduff_xyz.y * src.xyz * (1.0 - dst.a)
+ + porterduff_xyz.z * dst.xyz * (1.0 - src.a);
- result.a = dot(porterduff_xyz, vec3(src.a * dst.a, src.a * (1 - dst.a), dst.a * (1 - src.a)));
+ result.a = dot(porterduff_xyz, vec3(src.a * dst.a, src.a * (1.0 - dst.a), dst.a * (1.0 - src.a)));
return result;
}
diff --git a/src/opengl/util/trap_exact_aa.glsl b/src/opengl/util/trap_exact_aa.glsl
index b96f87d..1637f43 100644
--- a/src/opengl/util/trap_exact_aa.glsl
+++ b/src/opengl/util/trap_exact_aa.glsl
@@ -14,7 +14,7 @@ float quad_aa()
vec2 invA = gl_TexCoord[0].zw;
// transform right line to left to be able to use same calculations for both
- vecX.zw = 2 * gl_FragCoord.x - vecX.zw;
+ vecX.zw = 2.0 * gl_FragCoord.x - vecX.zw;
vec2 topX = vec2(vecX.x, vecX.z);
vec2 bottomX = vec2(vecX.y, vecX.w);
@@ -33,18 +33,18 @@ float quad_aa()
vec2 temp = mix(area - 0.5 * (right - bottomXTemp) * (intersectY.yw - bottom), // left < bottom < right < top
(0.5 * (topXTemp + bottomXTemp) - left) * area, // left < bottom < top < right
- step(topXTemp, right));
+ step(topXTemp, right.xx));
vec2 excluded = 0.5 * (top - intersectY.xz) * (topXTemp - left); // bottom < left < top < right
excluded = mix((top - 0.5 * (intersectY.yw + intersectY.xz)) * (right - left), // bottom < left < right < top
- excluded, step(topXTemp, right));
+ excluded, step(topXTemp, right.xx));
excluded = mix(temp, // left < bottom < right (see calculation of temp)
- excluded, step(bottomXTemp, left));
+ excluded, step(bottomXTemp, left.xx));
excluded = mix(vec2(area, area), // right < bottom < top
- excluded, step(bottomXTemp, right));
+ excluded, step(bottomXTemp, right.xx));
excluded *= step(left, topXTemp);
@@ -53,6 +53,6 @@ float quad_aa()
void main()
{
- gl_FragColor = quad_aa();
+ gl_FragColor = quad_aa().xxxx;
}
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index b129164..da07c1d 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -1554,6 +1554,10 @@ void QVGPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
QRectF rect(points[0], points[1], points[2] - points[0],
points[5] - points[1]);
clip(rect.toRect(), op);
+ } else {
+ // The best we can do is clip to the bounding rectangle
+ // of all control points.
+ clip(path.controlPointRect().toRect(), op);
}
}
@@ -2868,6 +2872,24 @@ void qt_vg_drawVGImage(QPainter *painter, const QPointF& pos, VGImage vgImg)
drawVGImage(engine->vgPrivate(), pos, vgImg);
}
+// Used by qpixmapfilter_vg.cpp to draw filtered VGImage's as a stencil.
+void qt_vg_drawVGImageStencil
+ (QPainter *painter, const QPointF& pos, VGImage vgImg, const QBrush& brush)
+{
+ QVGPaintEngine *engine =
+ static_cast<QVGPaintEngine *>(painter->paintEngine());
+
+ QVGPaintEnginePrivate *d = engine->vgPrivate();
+
+ QTransform transform(d->imageTransform);
+ transform.translate(pos.x(), pos.y());
+ d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform);
+
+ d->ensureBrush(brush);
+ d->setImageMode(VG_DRAW_IMAGE_STENCIL);
+ vgDrawImage(vgImg);
+}
+
void QVGPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr)
{
QPixmapData *pd = pm.pixmapData();
@@ -2949,6 +2971,121 @@ void QVGPaintEngine::drawTiledPixmap
fillRect(r, brush);
}
+// Best performance will be achieved with QDrawPixmaps::OpaqueHint
+// (i.e. no opacity), no rotation or scaling, and drawing the full
+// pixmap rather than parts of the pixmap. Even having just one of
+// these conditions will improve performance.
+void QVGPaintEngine::drawPixmaps
+ (const QDrawPixmaps::Data *drawingData, int dataCount,
+ const QPixmap &pixmap, QFlags<QDrawPixmaps::DrawingHint> hints)
+{
+#if !defined(QT_SHIVAVG)
+ Q_D(QVGPaintEngine);
+
+ // If the pixmap is not VG, or the transformation is projective,
+ // then fall back to the default implementation.
+ QPixmapData *pd = pixmap.pixmapData();
+ if (pd->classId() != QPixmapData::OpenVGClass || !d->simpleTransform) {
+ QPaintEngineEx::drawPixmaps(drawingData, dataCount, pixmap, hints);
+ return;
+ }
+
+ // Bail out if nothing to do.
+ if (dataCount <= 0)
+ return;
+
+ // Bail out if we don't have a usable VGImage for the pixmap.
+ QVGPixmapData *vgpd = static_cast<QVGPixmapData *>(pd);
+ if (!vgpd->isValid())
+ return;
+ VGImage vgImg = vgpd->toVGImage();
+ if (vgImg == VG_INVALID_HANDLE)
+ return;
+
+ // We cache the results of any vgChildImage() calls because the
+ // same child is very likely to be used over and over in particle
+ // systems. However, performance is even better if vgChildImage()
+ // isn't needed at all, so use full source rects where possible.
+ QVarLengthArray<VGImage> cachedImages;
+ QVarLengthArray<QRect> cachedSources;
+
+ // Select the opacity paint object.
+ if ((hints & QDrawPixmaps::OpaqueHint) != 0 && d->opacity == 1.0f) {
+ d->setImageMode(VG_DRAW_IMAGE_NORMAL);
+ } else {
+ hints = 0;
+ if (d->fillPaint != d->opacityPaint) {
+ vgSetPaint(d->opacityPaint, VG_FILL_PATH);
+ d->fillPaint = d->opacityPaint;
+ }
+ }
+
+ for (int i = 0; i < dataCount; ++i) {
+ QTransform transform(d->imageTransform);
+ transform.translate(drawingData[i].point.x(), drawingData[i].point.y());
+ transform.rotate(drawingData[i].rotation);
+
+ VGImage child;
+ QSize imageSize = vgpd->size();
+ QRectF sr = drawingData[i].source;
+ if (sr.topLeft().isNull() && sr.size() == imageSize) {
+ child = vgImg;
+ } else {
+ // Look for a previous child with the same source rectangle
+ // to avoid constantly calling vgChildImage()/vgDestroyImage().
+ QRect src = sr.toRect();
+ int j;
+ for (j = 0; j < cachedSources.size(); ++j) {
+ if (cachedSources[j] == src)
+ break;
+ }
+ if (j < cachedSources.size()) {
+ child = cachedImages[j];
+ } else {
+ child = vgChildImage
+ (vgImg, src.x(), src.y(), src.width(), src.height());
+ cachedImages.append(child);
+ cachedSources.append(src);
+ }
+ }
+
+ VGfloat scaleX = drawingData[i].scaleX;
+ VGfloat scaleY = drawingData[i].scaleY;
+ transform.translate(-0.5 * scaleX * sr.width(),
+ -0.5 * scaleY * sr.height());
+ transform.scale(scaleX, scaleY);
+ d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform);
+
+ if ((hints & QDrawPixmaps::OpaqueHint) == 0) {
+ qreal opacity = d->opacity * drawingData[i].opacity;
+ if (opacity != 1.0f) {
+ if (d->paintOpacity != opacity) {
+ VGfloat values[4];
+ values[0] = 1.0f;
+ values[1] = 1.0f;
+ values[2] = 1.0f;
+ values[3] = opacity;
+ d->paintOpacity = opacity;
+ vgSetParameterfv
+ (d->opacityPaint, VG_PAINT_COLOR, 4, values);
+ }
+ d->setImageMode(VG_DRAW_IMAGE_MULTIPLY);
+ } else {
+ d->setImageMode(VG_DRAW_IMAGE_NORMAL);
+ }
+ }
+
+ vgDrawImage(child);
+ }
+
+ // Destroy the cached child sub-images.
+ for (int i = 0; i < cachedImages.size(); ++i)
+ vgDestroyImage(cachedImages[i]);
+#else
+ QPaintEngineEx::drawPixmaps(drawingData, dataCount, pixmap, hints);
+#endif
+}
+
QVGFontEngineCleaner::QVGFontEngineCleaner(QVGPaintEnginePrivate *d)
: QObject(), d_ptr(d)
{
@@ -3209,9 +3346,6 @@ QPixmapFilter *QVGPaintEngine::pixmapFilter(int type, const QPixmapFilter *proto
d->convolutionFilter.reset(new QVGPixmapConvolutionFilter);
return d->convolutionFilter.data();
case QPixmapFilter::ColorizeFilter:
- // Strength parameter does not work with current implementation.
- if ((static_cast<const QPixmapColorizeFilter *>(prototype))->strength() != 1.0f)
- break;
if (!d->colorizeFilter)
d->colorizeFilter.reset(new QVGPixmapColorizeFilter);
return d->colorizeFilter.data();
diff --git a/src/openvg/qpaintengine_vg_p.h b/src/openvg/qpaintengine_vg_p.h
index a3487dc..1202b55 100644
--- a/src/openvg/qpaintengine_vg_p.h
+++ b/src/openvg/qpaintengine_vg_p.h
@@ -136,6 +136,8 @@ public:
void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
+ void drawPixmaps(const QDrawPixmaps::Data *drawingData, int dataCount, const QPixmap &pixmap, QFlags<QDrawPixmaps::DrawingHint> hints);
+
void drawTextItem(const QPointF &p, const QTextItem &textItem);
void setState(QPainterState *s);
diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp
index 2003f3b..f86e116 100644
--- a/src/openvg/qpixmapdata_vg.cpp
+++ b/src/openvg/qpixmapdata_vg.cpp
@@ -101,6 +101,11 @@ QVGPixmapData::~QVGPixmapData()
#endif
}
+QPixmapData *QVGPixmapData::createCompatiblePixmapData() const
+{
+ return new QVGPixmapData(pixelType());
+}
+
bool QVGPixmapData::isValid() const
{
return (w > 0 && h > 0);
diff --git a/src/openvg/qpixmapdata_vg_p.h b/src/openvg/qpixmapdata_vg_p.h
index 99115df..f552c7b 100644
--- a/src/openvg/qpixmapdata_vg_p.h
+++ b/src/openvg/qpixmapdata_vg_p.h
@@ -72,6 +72,8 @@ public:
QVGPixmapData(PixelType type);
~QVGPixmapData();
+ QPixmapData *createCompatiblePixmapData() const;
+
// Is this pixmap valid (i.e. non-zero in size)?
bool isValid() const;
diff --git a/src/openvg/qpixmapfilter_vg.cpp b/src/openvg/qpixmapfilter_vg.cpp
index 613f4ea..8e104db 100644
--- a/src/openvg/qpixmapfilter_vg.cpp
+++ b/src/openvg/qpixmapfilter_vg.cpp
@@ -58,6 +58,8 @@ QVGPixmapConvolutionFilter::~QVGPixmapConvolutionFilter()
extern void qt_vg_drawVGImage
(QPainter *painter, const QPointF& pos, VGImage vgImg);
+extern void qt_vg_drawVGImageStencil
+ (QPainter *painter, const QPointF& pos, VGImage vgImg, const QBrush& brush);
void QVGPixmapConvolutionFilter::draw
(QPainter *painter, const QPointF &dest,
@@ -123,8 +125,7 @@ void QVGPixmapConvolutionFilter::draw
}
QVGPixmapColorizeFilter::QVGPixmapColorizeFilter()
- : QPixmapColorizeFilter(),
- firstTime(true)
+ : QPixmapColorizeFilter()
{
}
@@ -136,7 +137,7 @@ void QVGPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const
{
if (src.pixmapData()->classId() != QPixmapData::OpenVGClass) {
// The pixmap data is not an instance of QVGPixmapData, so fall
- // back to the default convolution filter implementation.
+ // back to the default colorize filter implementation.
QPixmapColorizeFilter::draw(painter, dest, src, srcRect);
return;
}
@@ -154,50 +155,45 @@ void QVGPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const
if (dstImage == VG_INVALID_HANDLE)
return;
- // Recompute the color matrix if the color has changed.
+ // Determine the weights for the matrix from the color and strength.
QColor c = color();
- if (c != prevColor || firstTime) {
- prevColor = c;
-
- // Determine the weights for the matrix from the color.
- VGfloat weights[3];
- VGfloat invweights[3];
- VGfloat alpha = c.alphaF();
- weights[0] = c.redF() * alpha;
- weights[1] = c.greenF() * alpha;
- weights[2] = c.blueF() * alpha;
- invweights[0] = 1.0f - weights[0];
- invweights[1] = 1.0f - weights[1];
- invweights[2] = 1.0f - weights[2];
-
- // Grayscale weights.
- static const VGfloat redGray = 11.0f / 32.0f;
- static const VGfloat greenGray = 16.0f / 32.0f;
- static const VGfloat blueGray = 1.0f - (redGray + greenGray);
-
- matrix[0][0] = redGray * invweights[0];
- matrix[0][1] = redGray * invweights[1];
- matrix[0][2] = redGray * invweights[2];
- matrix[0][3] = 0.0f;
- matrix[1][0] = greenGray * invweights[0];
- matrix[1][1] = greenGray * invweights[1];
- matrix[1][2] = greenGray * invweights[2];
- matrix[1][3] = 0.0f;
- matrix[2][0] = blueGray * invweights[0];
- matrix[2][1] = blueGray * invweights[1];
- matrix[2][2] = blueGray * invweights[2];
- matrix[2][3] = 0.0f;
- matrix[3][0] = 0.0f;
- matrix[3][1] = 0.0f;
- matrix[3][2] = 0.0f;
- matrix[3][3] = 1.0f;
- matrix[4][0] = weights[0];
- matrix[4][1] = weights[1];
- matrix[4][2] = weights[2];
- matrix[4][3] = 0.0f;
- }
-
- firstTime = false;
+ VGfloat strength = this->strength();
+ VGfloat weights[3];
+ VGfloat invweights[3];
+ VGfloat alpha = c.alphaF();
+ weights[0] = c.redF() * alpha;
+ weights[1] = c.greenF() * alpha;
+ weights[2] = c.blueF() * alpha;
+ invweights[0] = (1.0f - weights[0]) * strength;
+ invweights[1] = (1.0f - weights[1]) * strength;
+ invweights[2] = (1.0f - weights[2]) * strength;
+
+ // Grayscale weights.
+ static const VGfloat redGray = 11.0f / 32.0f;
+ static const VGfloat greenGray = 16.0f / 32.0f;
+ static const VGfloat blueGray = 1.0f - (redGray + greenGray);
+
+ VGfloat matrix[5][4];
+ matrix[0][0] = redGray * invweights[0] + (1.0f - strength);
+ matrix[0][1] = redGray * invweights[1];
+ matrix[0][2] = redGray * invweights[2];
+ matrix[0][3] = 0.0f;
+ matrix[1][0] = greenGray * invweights[0];
+ matrix[1][1] = greenGray * invweights[1] + (1.0f - strength);
+ matrix[1][2] = greenGray * invweights[2];
+ matrix[1][3] = 0.0f;
+ matrix[2][0] = blueGray * invweights[0];
+ matrix[2][1] = blueGray * invweights[1];
+ matrix[2][2] = blueGray * invweights[2] + (1.0f - strength);
+ matrix[2][3] = 0.0f;
+ matrix[3][0] = 0.0f;
+ matrix[3][1] = 0.0f;
+ matrix[3][2] = 0.0f;
+ matrix[3][3] = 1.0f;
+ matrix[4][0] = weights[0] * strength;
+ matrix[4][1] = weights[1] * strength;
+ matrix[4][2] = weights[2] * strength;
+ matrix[4][3] = 0.0f;
vgColorMatrix(dstImage, srcImage, matrix[0]);
@@ -219,8 +215,7 @@ void QVGPixmapColorizeFilter::draw(QPainter *painter, const QPointF &dest, const
}
QVGPixmapDropShadowFilter::QVGPixmapDropShadowFilter()
- : QPixmapDropShadowFilter(),
- firstTime(true)
+ : QPixmapDropShadowFilter()
{
}
@@ -244,49 +239,11 @@ void QVGPixmapDropShadowFilter::draw(QPainter *painter, const QPointF &dest, con
return;
QSize size = pd->size();
- VGImage tmpImage = vgCreateImage
- (VG_sARGB_8888_PRE, size.width(), size.height(),
- VG_IMAGE_QUALITY_FASTER);
- if (tmpImage == VG_INVALID_HANDLE)
- return;
-
VGImage dstImage = vgCreateImage
- (VG_sARGB_8888_PRE, size.width(), size.height(),
+ (VG_A_8, size.width(), size.height(),
VG_IMAGE_QUALITY_FASTER);
- if (dstImage == VG_INVALID_HANDLE) {
- vgDestroyImage(tmpImage);
+ if (dstImage == VG_INVALID_HANDLE)
return;
- }
-
- // Recompute the color matrix if the color has changed.
- QColor c = color();
- if (c != prevColor || firstTime) {
- prevColor = c;
-
- matrix[0][0] = 0.0f;
- matrix[0][1] = 0.0f;
- matrix[0][2] = 0.0f;
- matrix[0][3] = 0.0f;
- matrix[1][0] = 0.0f;
- matrix[1][1] = 0.0f;
- matrix[1][2] = 0.0f;
- matrix[1][3] = 0.0f;
- matrix[2][0] = 0.0f;
- matrix[2][1] = 0.0f;
- matrix[2][2] = 0.0f;
- matrix[2][3] = 0.0f;
- matrix[3][0] = c.redF();
- matrix[3][1] = c.greenF();
- matrix[3][2] = c.blueF();
- matrix[3][3] = c.alphaF();
- matrix[4][0] = 0.0f;
- matrix[4][1] = 0.0f;
- matrix[4][2] = 0.0f;
- matrix[4][3] = 0.0f;
- }
-
- // Blacken the source image.
- vgColorMatrix(tmpImage, srcImage, matrix[0]);
// Clamp the radius range. We divide by 2 because the OpenVG blur
// is "too blurry" compared to the default raster implementation.
@@ -298,9 +255,7 @@ void QVGPixmapDropShadowFilter::draw(QPainter *painter, const QPointF &dest, con
radiusF = maxRadius;
// Blur the blackened source image.
- vgGaussianBlur(dstImage, tmpImage, radiusF, radiusF, VG_TILE_PAD);
-
- firstTime = false;
+ vgGaussianBlur(dstImage, srcImage, radiusF, radiusF, VG_TILE_PAD);
VGImage child = VG_INVALID_HANDLE;
@@ -314,11 +269,10 @@ void QVGPixmapDropShadowFilter::draw(QPainter *painter, const QPointF &dest, con
child = vgChildImage(dstImage, srect.x(), srect.y(), srect.width(), srect.height());
}
- qt_vg_drawVGImage(painter, dest + offset(), child);
+ qt_vg_drawVGImageStencil(painter, dest + offset(), child, color());
if(child != dstImage)
vgDestroyImage(child);
- vgDestroyImage(tmpImage);
vgDestroyImage(dstImage);
// Now draw the actual pixmap over the top.
diff --git a/src/openvg/qpixmapfilter_vg_p.h b/src/openvg/qpixmapfilter_vg_p.h
index 58111ec..efbbc7b 100644
--- a/src/openvg/qpixmapfilter_vg_p.h
+++ b/src/openvg/qpixmapfilter_vg_p.h
@@ -79,11 +79,6 @@ public:
~QVGPixmapColorizeFilter();
void draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect) const;
-
-private:
- mutable VGfloat matrix[5][4];
- mutable QColor prevColor;
- mutable bool firstTime;
};
class Q_OPENVG_EXPORT QVGPixmapDropShadowFilter : public QPixmapDropShadowFilter
@@ -94,11 +89,6 @@ public:
~QVGPixmapDropShadowFilter();
void draw(QPainter *p, const QPointF &pos, const QPixmap &px, const QRectF &src) const;
-
-private:
- mutable VGfloat matrix[5][4];
- mutable QColor prevColor;
- mutable bool firstTime;
};
class Q_OPENVG_EXPORT QVGPixmapBlurFilter : public QPixmapBlurFilter
diff --git a/src/openvg/qwindowsurface_vg.cpp b/src/openvg/qwindowsurface_vg.cpp
index 6cc2e27..661e06a 100644
--- a/src/openvg/qwindowsurface_vg.cpp
+++ b/src/openvg/qwindowsurface_vg.cpp
@@ -111,7 +111,7 @@ QPaintEngine *QVGWindowSurface::paintEngine() const
int QVGWindowSurface::metric(PaintDeviceMetric met) const
{
- return window()->metric(met);
+ return qt_paint_device_metric(window(), met);
}
QT_END_NAMESPACE
diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp
index 3ae911f..d622c1f 100644
--- a/src/openvg/qwindowsurface_vgegl.cpp
+++ b/src/openvg/qwindowsurface_vgegl.cpp
@@ -211,6 +211,10 @@ static QEglContext *createContext(QPaintDevice *device)
int redSize = configProps.value(EGL_RED_SIZE);
if (redSize == EGL_DONT_CARE || redSize == 0)
configProps.setPixelFormat(QImage::Format_ARGB32); // XXX
+#ifndef QVG_SCISSOR_CLIP
+ // If we are using the mask to clip, then explicitly request a mask.
+ configProps.setValue(EGL_ALPHA_MASK_SIZE, 1);
+#endif
#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT |
EGL_VG_ALPHA_FORMAT_PRE_BIT);
diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp
index 667de88..9a9a778 100644
--- a/src/plugins/accessible/widgets/main.cpp
+++ b/src/plugins/accessible/widgets/main.cpp
@@ -234,8 +234,10 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec
iface = new QAccessibleDisplay(widget, Grouping);
} else if (classname == QLatin1String("QStatusBar")) {
iface = new QAccessibleWidgetEx(widget, StatusBar);
+#ifndef QT_NO_PROGRESSBAR
} else if (classname == QLatin1String("QProgressBar")) {
- iface = new QAccessibleDisplay(widget);
+ iface = new QAccessibleProgressBar(widget);
+#endif
} else if (classname == QLatin1String("QToolBar")) {
iface = new QAccessibleWidgetEx(widget, ToolBar, widget->windowTitle());
#ifndef QT_NO_MENUBAR
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
index 1aadd6c..aa51759 100644
--- a/src/plugins/accessible/widgets/simplewidgets.cpp
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -209,6 +209,62 @@ QAccessible::State QAccessibleButton::state(int child) const
return state;
}
+int QAccessibleButton::actionCount()
+{
+ return 1;
+}
+
+void QAccessibleButton::doAction(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ button()->click();
+ break;
+ }
+}
+
+QString QAccessibleButton::description(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return QLatin1String("Clicks the button.");
+ default:
+ return QString();
+ }
+}
+
+QString QAccessibleButton::name(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return QLatin1String("Press");
+ default:
+ return QString();
+ }
+}
+
+QString QAccessibleButton::localizedName(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return tr("Press");
+ default:
+ return QString();
+ }
+}
+
+QStringList QAccessibleButton::keyBindings(int actionIndex)
+{
+ switch (actionIndex) {
+#ifdef QT_NO_SHORTCUT
+ case 0:
+ return button()->shortcut().toString();
+#endif
+ default:
+ return QStringList();
+ }
+}
+
#ifndef QT_NO_TOOLBUTTON
/*!
\class QAccessibleToolButton
@@ -756,6 +812,34 @@ void QAccessibleLineEdit::scrollToSubstring(int startIndex, int endIndex)
#endif // QT_NO_LINEEDIT
+#ifndef QT_NO_PROGRESSBAR
+QAccessibleProgressBar::QAccessibleProgressBar(QWidget *o)
+ : QAccessibleDisplay(o)
+{
+ Q_ASSERT(progressBar());
+}
+
+QVariant QAccessibleProgressBar::currentValue()
+{
+ return progressBar()->value();
+}
+
+QVariant QAccessibleProgressBar::maximumValue()
+{
+ return progressBar()->maximum();
+}
+
+QVariant QAccessibleProgressBar::minimumValue()
+{
+ return progressBar()->minimum();
+}
+
+QProgressBar *QAccessibleProgressBar::progressBar() const
+{
+ return qobject_cast<QProgressBar *>(object());
+}
+#endif
+
#endif // QT_NO_ACCESSIBILITY
QT_END_NAMESPACE
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
index abe5bdc..0c1cf5e 100644
--- a/src/plugins/accessible/widgets/simplewidgets.h
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -42,6 +42,7 @@
#ifndef SIMPLEWIDGETS_H
#define SIMPLEWIDGETS_H
+#include <QtCore/qcoreapplication.h>
#include <QtGui/qaccessible2.h>
#include <QtGui/qaccessiblewidget.h>
@@ -52,9 +53,12 @@ QT_BEGIN_NAMESPACE
class QAbstractButton;
class QLineEdit;
class QToolButton;
+class QProgressBar;
-class QAccessibleButton : public QAccessibleWidgetEx
+class QAccessibleButton : public QAccessibleWidgetEx, public QAccessibleActionInterface
{
+ Q_ACCESSIBLE_OBJECT
+ Q_DECLARE_TR_FUNCTIONS(QAccessibleButton)
public:
QAccessibleButton(QWidget *w, Role r);
@@ -64,6 +68,14 @@ public:
QString actionText(int action, Text text, int child) const;
bool doAction(int action, int child, const QVariantList &params);
+ // QAccessibleActionInterface
+ int actionCount();
+ void doAction(int actionIndex);
+ QString description(int actionIndex);
+ QString name(int actionIndex);
+ QString localizedName(int actionIndex);
+ QStringList keyBindings(int actionIndex);
+
protected:
QAbstractButton *button() const;
};
@@ -101,6 +113,7 @@ protected:
class QAccessibleDisplay : public QAccessibleWidgetEx
{
+ Q_ACCESSIBLE_OBJECT
public:
explicit QAccessibleDisplay(QWidget *w, Role role = StaticText);
@@ -150,6 +163,24 @@ protected:
};
#endif // QT_NO_LINEEDIT
+#ifndef QT_NO_PROGRESSBAR
+class QAccessibleProgressBar : public QAccessibleDisplay, public QAccessibleValueInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleProgressBar(QWidget *o);
+
+ // QAccessibleValueInterface
+ QVariant currentValue();
+ QVariant maximumValue();
+ QVariant minimumValue();
+ inline void setCurrentValue(const QVariant &) {}
+
+protected:
+ QProgressBar *progressBar() const;
+};
+#endif
+
#endif // QT_NO_ACCESSIBILITY
QT_END_NAMESPACE
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp
index 8662df6..57b1950 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp
@@ -207,7 +207,7 @@ void QDirectFBMouseHandlerPrivate::readMouseData()
int wheel = 0;
if (input.type == DIET_AXISMOTION) {
-#ifdef QT_NO_DIRECTFB_LAYER
+#if defined(QT_NO_DIRECTFB_LAYER) || defined(QT_DIRECTFB_WINDOW_AS_CURSOR)
if (input.flags & DIEF_AXISABS) {
switch (input.axis) {
case DIAI_X: x = input.axisabs; break;
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
index 0f7a6de..449bc0d 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -99,8 +99,11 @@ public:
qint64 cursorImageKey;
QDirectFBScreen *q;
+ static QDirectFBScreen *instance;
};
+QDirectFBScreen *QDirectFBScreenPrivate::instance = 0;
+
QDirectFBScreenPrivate::QDirectFBScreenPrivate(QDirectFBScreen *qptr)
: QWSGraphicsSystem(qptr), dfb(0), flipFlags(DSFLIP_NONE),
directFBFlags(QDirectFBScreen::NoFlags), alphaPixmapFormat(QImage::Format_Invalid),
@@ -802,13 +805,21 @@ void QDirectFBScreenCursor::set(const QImage &image, int hotx, int hoty)
QDirectFBScreen::QDirectFBScreen(int display_id)
: QScreen(display_id, DirectFBClass), d_ptr(new QDirectFBScreenPrivate(this))
{
+ QDirectFBScreenPrivate::instance = this;
}
QDirectFBScreen::~QDirectFBScreen()
{
+ if (QDirectFBScreenPrivate::instance == this)
+ QDirectFBScreenPrivate::instance = 0;
delete d_ptr;
}
+QDirectFBScreen *QDirectFBScreen::instance()
+{
+ return QDirectFBScreenPrivate::instance;
+}
+
int QDirectFBScreen::depth(DFBSurfacePixelFormat format)
{
switch (format) {
@@ -1050,6 +1061,26 @@ static inline bool setIntOption(const QStringList &arguments, const QString &var
return false;
}
+static inline QColor colorFromName(const QString &name)
+{
+ QRegExp rx("#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])");
+ rx.setCaseSensitivity(Qt::CaseInsensitive);
+ if (rx.exactMatch(name)) {
+ Q_ASSERT(rx.numCaptures() == 4);
+ int ints[4];
+ int i;
+ for (i=0; i<4; ++i) {
+ bool ok;
+ ints[i] = rx.cap(i + 1).toUInt(&ok, 16);
+ if (!ok || ints[i] > 255)
+ break;
+ }
+ if (i == 4)
+ return QColor(ints[0], ints[1], ints[2], ints[3]);
+ }
+ return QColor(name);
+}
+
bool QDirectFBScreen::connect(const QString &displaySpec)
{
DFBResult result = DFB_OK;
@@ -1282,18 +1313,50 @@ bool QDirectFBScreen::connect(const QString &displaySpec)
#endif
#ifdef QT_DIRECTFB_WM
surface->Release(surface);
+ QColor backgroundColor;
#else
- QRegExp backgroundColorRegExp(QLatin1String("bgcolor=?(.+)"));
+ QColor &backgroundColor = d_ptr->backgroundColor;
+#endif
+
+ QRegExp backgroundColorRegExp(QLatin1String("bgcolor=(.+)"));
backgroundColorRegExp.setCaseSensitivity(Qt::CaseInsensitive);
if (displayArgs.indexOf(backgroundColorRegExp) != -1) {
- d_ptr->backgroundColor.setNamedColor(backgroundColorRegExp.cap(1));
+ backgroundColor = colorFromName(backgroundColorRegExp.cap(1));
}
- if (!d_ptr->backgroundColor.isValid())
- d_ptr->backgroundColor = Qt::green;
- d_ptr->primarySurface->Clear(d_ptr->primarySurface, d_ptr->backgroundColor.red(),
- d_ptr->backgroundColor.green(), d_ptr->backgroundColor.blue(),
- d_ptr->backgroundColor.alpha());
+#ifdef QT_NO_DIRECTFB_WM
+ if (!backgroundColor.isValid())
+ backgroundColor = Qt::green;
+ d_ptr->primarySurface->Clear(d_ptr->primarySurface, backgroundColor.red(),
+ backgroundColor.green(), backgroundColor.blue(),
+ backgroundColor.alpha());
d_ptr->primarySurface->Flip(d_ptr->primarySurface, 0, d_ptr->flipFlags);
+#else
+ if (backgroundColor.isValid()) {
+ DFBResult result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+ result = d_ptr->dfbLayer->SetBackgroundColor(d_ptr->dfbLayer, backgroundColor.red(), backgroundColor.green(),
+ backgroundColor.blue(), backgroundColor.alpha());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background color", result);
+ }
+
+ result = d_ptr->dfbLayer->SetBackgroundMode(d_ptr->dfbLayer, DLBM_COLOR);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background mode", result);
+ }
+
+ result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+
+ }
#endif
return true;
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
index 5e8c5c6..6330582 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
@@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
-#if !defined QT_NO_DIRECTFB_SUBSURFACE && !defined QT_DIRECTFB_SUBSURFACE
-#define QT_DIRECTFB_SUBSURFACE
+#if !defined QT_DIRECTFB_SUBSURFACE && !defined QT_NO_DIRECTFB_SUBSURFACE
+#define QT_NO_DIRECTFB_SUBSURFACE
#endif
#if !defined QT_NO_DIRECTFB_LAYER && !defined QT_DIRECTFB_LAYER
#define QT_DIRECTFB_LAYER
@@ -154,7 +154,6 @@ public:
void shutdownDevice();
void exposeRegion(QRegion r, int changing);
- void scroll(const QRegion &region, const QPoint &offset);
void solidFill(const QColor &color, const QRegion &region);
void setMode(int width, int height, int depth);
@@ -163,12 +162,7 @@ public:
QWSWindowSurface *createSurface(QWidget *widget) const;
QWSWindowSurface *createSurface(const QString &key) const;
- static inline QDirectFBScreen *instance() {
- QScreen *inst = QScreen::instance();
- Q_ASSERT(!inst || inst->classId() == QScreen::DirectFBClass);
- return static_cast<QDirectFBScreen*>(inst);
- }
-
+ static QDirectFBScreen *instance();
void waitIdle();
IDirectFBSurface *surfaceForWidget(const QWidget *widget, QRect *rect) const;
#ifdef QT_DIRECTFB_SUBSURFACE
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
index f33e820..3fbefc3 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
@@ -168,6 +168,16 @@ void QDirectFBWindowSurface::createWindow(const QRect &rect)
if (result != DFB_OK)
DirectFBErrorFatal("QDirectFBWindowSurface::createWindow", result);
+ if (window()) {
+ DFBWindowID winid;
+ result = dfbWindow->GetID(dfbWindow, &winid);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBWindowSurface::createWindow. Can't get ID", result);
+ } else {
+ window()->setProperty("_q_DirectFBWindowID", winid);
+ }
+ }
+
Q_ASSERT(!dfbSurface);
dfbWindow->GetSurface(dfbWindow, &dfbSurface);
updateFormat();
@@ -220,6 +230,9 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect)
if (rect.isNull()) {
#ifndef QT_NO_DIRECTFB_WM
if (dfbWindow) {
+ if (window())
+ window()->setProperty("_q_DirectFBWindowID", QVariant());
+
dfbWindow->Release(dfbWindow);
dfbWindow = 0;
}
@@ -262,7 +275,11 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect)
if (oldSurface != dfbSurface)
updateFormat();
- QWSWindowSurface::setGeometry(rect);
+ if (oldRect.size() != rect.size()) {
+ QWSWindowSurface::setGeometry(rect);
+ } else {
+ QWindowSurface::setGeometry(rect);
+ }
}
QByteArray QDirectFBWindowSurface::permanentState() const
@@ -276,6 +293,8 @@ void QDirectFBWindowSurface::setPermanentState(const QByteArray &state)
{
if (state.size() == sizeof(this)) {
sibling = *reinterpret_cast<QDirectFBWindowSurface *const*>(state.constData());
+ Q_ASSERT(sibling);
+ sibling->setSurfaceFlags(surfaceFlags());
}
}
diff --git a/src/plugins/gfxdrivers/gfxdrivers.pro b/src/plugins/gfxdrivers/gfxdrivers.pro
index 21aaf0f..d1ee3f2 100644
--- a/src/plugins/gfxdrivers/gfxdrivers.pro
+++ b/src/plugins/gfxdrivers/gfxdrivers.pro
@@ -5,6 +5,5 @@ contains(gfx-plugins, linuxfb) :SUBDIRS += linuxfb
contains(gfx-plugins, qvfb) :SUBDIRS += qvfb
contains(gfx-plugins, vnc) :SUBDIRS += vnc
contains(gfx-plugins, transformed) :SUBDIRS += transformed
-contains(gfx-plugins, hybrid) :SUBDIRS += hybrid
contains(gfx-plugins, svgalib) :SUBDIRS += svgalib
contains(gfx-plugins, powervr) :SUBDIRS += powervr
diff --git a/src/plugins/gfxdrivers/hybrid/hybrid.pro b/src/plugins/gfxdrivers/hybrid/hybrid.pro
deleted file mode 100644
index 8b8e9ef..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybrid.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-TEMPLATE = lib
-CONFIG += plugin
-QT += opengl
-
-QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
-
-TARGET = hybridscreen
-target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
-INSTALLS += target
-
-HEADERS = hybridscreen.h \
- hybridsurface.h
-SOURCES = hybridscreen.cpp \
- hybridsurface.cpp \
- hybridplugin.cpp
-
diff --git a/src/plugins/gfxdrivers/hybrid/hybridplugin.cpp b/src/plugins/gfxdrivers/hybrid/hybridplugin.cpp
deleted file mode 100644
index 17be760..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybridplugin.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "hybridscreen.h"
-
-#include <QScreenDriverPlugin>
-#include <QStringList>
-
-class HybridPlugin : public QScreenDriverPlugin
-{
-public:
- HybridPlugin();
-
- QStringList keys() const;
- QScreen *create(const QString&, int displayId);
-};
-
-HybridPlugin::HybridPlugin()
- : QScreenDriverPlugin()
-{
-}
-
-QStringList HybridPlugin::keys() const
-{
- return (QStringList() << "hybrid");
-}
-
-QScreen* HybridPlugin::create(const QString &driver, int displayId)
-{
- if (driver.toLower() != "hybrid")
- return 0;
-
- return new HybridScreen(displayId);
-}
-
-Q_EXPORT_STATIC_PLUGIN(Hybrid)
-Q_EXPORT_PLUGIN2(hybridscreendriver, HybridPlugin)
diff --git a/src/plugins/gfxdrivers/hybrid/hybridscreen.cpp b/src/plugins/gfxdrivers/hybrid/hybridscreen.cpp
deleted file mode 100644
index 4062551..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybridscreen.cpp
+++ /dev/null
@@ -1,382 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "hybridscreen.h"
-#include "hybridsurface.h"
-
-#include <QVector>
-#include <QVarLengthArray>
-#include <QApplication>
-#include <QColor>
-#include <QWidget>
-
-#include <GLES/egl.h>
-
-class HybridScreenPrivate
-{
-public:
- HybridScreenPrivate(HybridScreen *owner);
-
- bool verbose;
- EGLDisplay display;
- EGLint majorEGLVersion;
- EGLint minorEGLVersion;
-
- QScreen *screen;
-
-private:
- HybridScreen *q_ptr;
-};
-
-HybridScreenPrivate::HybridScreenPrivate(HybridScreen *owner)
- : display(EGL_NO_DISPLAY), majorEGLVersion(0), minorEGLVersion(0),
- screen(0), q_ptr(owner)
-{
-}
-
-HybridScreen::HybridScreen(int displayId)
- : QGLScreen(displayId)
-{
- d_ptr = new HybridScreenPrivate(this);
-}
-
-HybridScreen::~HybridScreen()
-{
- delete d_ptr;
-}
-
-static void error(const char *message)
-{
- const EGLint error = eglGetError();
- qWarning("HybridScreen error: %s: 0x%x", message, error);
-}
-
-static int getDisplayId(const QString &spec)
-{
- QRegExp regexp(QLatin1String(":(\\d+)\\b"));
- if (regexp.lastIndexIn(spec) != -1) {
- const QString capture = regexp.cap(1);
- return capture.toInt();
- }
- return 0;
-}
-
-bool HybridScreen::connect(const QString &displaySpec)
-{
- QString dspec = displaySpec;
- if (dspec.startsWith(QLatin1String("hybrid:"), Qt::CaseInsensitive))
- dspec = dspec.mid(QString::fromLatin1("hybrid:").size());
- else if (dspec.compare(QLatin1String("hybrid"), Qt::CaseInsensitive) == 0)
- dspec = QString();
-
- const QString displayIdSpec = QString::fromLatin1(" :%1").arg(displayId);
- if (dspec.endsWith(displayIdSpec))
- dspec = dspec.left(dspec.size() - displayIdSpec.size());
-
- const QStringList args = dspec.split(QLatin1Char(':'),
- QString::SkipEmptyParts);
- const int id = getDisplayId(dspec);
- d_ptr->screen = qt_get_screen(id, dspec.toLatin1().constData());
-
- const QScreen *screen = d_ptr->screen;
- d = screen->depth();
- w = screen->width();
- h = screen->height();
- dw = screen->deviceWidth();
- dh = screen->deviceHeight();
- lstep = screen->linestep();
- data = screen->base();
- physWidth = screen->physicalWidth();
- physHeight = screen->physicalHeight();
- setPixelFormat(screen->pixelFormat());
- setOffset(screen->offset());
-
- d_ptr->verbose = args.contains(QLatin1String("verbose"));
-
- d_ptr->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (d_ptr->display == EGL_NO_DISPLAY) {
- error("getting display");
- return false;
- }
-
- EGLBoolean status;
- status = eglInitialize(d_ptr->display,
- &d_ptr->majorEGLVersion, &d_ptr->minorEGLVersion);
- if (!status) {
- error("eglInitialize");
- return false;
- }
- if (d_ptr->verbose) {
- qDebug("Detected EGL version %d.%d",
- d_ptr->majorEGLVersion, d_ptr->minorEGLVersion);
-
- EGLint numConfigs = 0;
- eglGetConfigs(d_ptr->display, 0, 0, &numConfigs);
- qDebug("%d available configurations", numConfigs);
- }
-
- // XXX: hw: use eglQueryString to find supported APIs
-
- qt_screen = this; // XXX
-
- return true;
-}
-
-bool HybridScreen::initDevice()
-{
- if (d_ptr->screen)
- return d_ptr->screen->initDevice();
- return false;
-}
-
-void HybridScreen::shutdownDevice()
-{
- if (d_ptr->screen)
- d_ptr->screen->shutdownDevice();
-}
-
-void HybridScreen::disconnect()
-{
- if (!eglTerminate(d_ptr->display))
- error("disconnecting");
- if (d_ptr->screen) {
- d_ptr->screen->disconnect();
- delete d_ptr->screen;
- d_ptr->screen = 0;
- }
-
-}
-
-bool HybridScreen::hasOpenGLOverlays() const
-{
- return true;
-}
-
-bool HybridScreen::chooseContext(QGLContext *context,
- const QGLContext *shareContext)
-{
-#if 0
- // hw: update the glFormat variable. Probably needs a setter in the
- // QGLWindowSurface class which can be a friend of whatever it wants.
-
- GLint res;
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_LEVEL, &res);
- d_ptr->glFormat.setPlane(res);
- QT_EGL_ERR("eglGetConfigAttrib");
-
- /*
- if(deviceIsPixmap())
- res = 0;
- else
- eglDescribePixelFormat(fmt, EGL_DOUBLEBUFFER, &res);
- d_ptr->glFormat.setDoubleBuffer(res);
- */
-
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_DEPTH_SIZE, &res);
- d_ptr->glFormat.setDepth(res);
- if (d_ptr->glFormat.depth())
- d_ptr->glFormat.setDepthBufferSize(res);
-
- //eglGetConfigAttrib(d_ptr->display,d_ptr->config, EGL_RGBA, &res);
- //d_ptr->glFormat.setRgba(res);
-
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_ALPHA_SIZE, &res);
- d_ptr->glFormat.setAlpha(res);
- if (d_ptr->glFormat.alpha())
- d_ptr->glFormat.setAlphaBufferSize(res);
-
- //eglGetConfigAttrib(d_ptr->display,d_ptr->config, EGL_ACCUM_RED_SIZE, &res);
- //d_ptr->glFormat.setAccum(res);
- //if (d_ptr->glFormat.accum())
- // d_ptr->glFormat.setAccumBufferSize(res);
-
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_STENCIL_SIZE, &res);
- d_ptr->glFormat.setStencil(res);
- if (d_ptr->glFormat.stencil())
- d_ptr->glFormat.setStencilBufferSize(res);
-
- //eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_STEREO, &res);
- //d_ptr->glFormat.setStereo(res);
-
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_SAMPLE_BUFFERS, &res);
- d_ptr->glFormat.setSampleBuffers(res);
-
- if (d_ptr->glFormat.sampleBuffers()) {
- eglGetConfigAttrib(d_ptr->display, d_ptr->config, EGL_SAMPLES, &res);
- d_ptr->glFormat.setSamples(res);
- }
-#endif
-
- // hw: TODO: implement sharing of contexts
-
-#if 0
- if(shareContext &&
- (!shareContext->isValid() || !shareContext->d_func()->cx)) {
- qWarning("QGLContext::chooseContext(): Cannot share with invalid context");
- shareContext = 0;
- }
-#endif
-
-#if 0
- d_ptr->cx = ctx;
- if (shareContext && shareContext->d_func()->cx) {
- QGLContext *share = const_cast<QGLContext *>(shareContext);
- d_ptr->sharing = true;
- share->d_func()->sharing = true;
- }
-#endif
-
-#if 0
- // vblank syncing
- GLint interval = d_ptr->reqFormat.swapInterval();
- if (interval != -1) {
- if (interval != 0)
- eglSwapInterval(d_ptr->display, interval);
- }
-#endif
-
- return QGLScreen::chooseContext(context, shareContext);
-}
-
-void HybridScreen::setDirty(const QRect& rect)
-{
- d_ptr->screen->setDirty(rect);
-}
-
-void HybridScreen::setMode(int w, int h, int d)
-{
- d_ptr->screen->setMode(w, h, d);
- setDirty(region().boundingRect());
-}
-
-bool HybridScreen::supportsDepth(int depth) const
-{
- return d_ptr->screen->supportsDepth(depth);
-}
-
-void HybridScreen::save()
-{
- d_ptr->screen->save();
-}
-
-void HybridScreen::restore()
-{
- d_ptr->screen->restore();
-}
-
-void HybridScreen::blank(bool on)
-{
- d_ptr->screen->blank(on);
-}
-
-bool HybridScreen::onCard(const unsigned char *ptr) const
-{
- return d_ptr->screen->onCard(ptr);
-}
-
-bool HybridScreen::onCard(const unsigned char *ptr, ulong &offset) const
-{
- return d_ptr->screen->onCard(ptr, offset);
-}
-
-bool HybridScreen::isInterlaced() const
-{
- return d_ptr->screen->isInterlaced();
-}
-
-int HybridScreen::memoryNeeded(const QString &str)
-{
- return d_ptr->screen->memoryNeeded(str);
-}
-
-int HybridScreen::sharedRamSize(void *ptr)
-{
- return d_ptr->screen->sharedRamSize(ptr);
-}
-
-void HybridScreen::haltUpdates()
-{
- d_ptr->screen->haltUpdates();
-}
-
-void HybridScreen::resumeUpdates()
-{
- d_ptr->screen->resumeUpdates();
-}
-
-void HybridScreen::exposeRegion(QRegion r, int changing)
-{
- d_ptr->screen->exposeRegion(r, changing);
-}
-
-void HybridScreen::blit(const QImage &img, const QPoint &topLeft, const QRegion &region)
-{
- d_ptr->screen->blit(img, topLeft, region);
-}
-
-void HybridScreen::solidFill(const QColor &color, const QRegion &region)
-{
- d_ptr->screen->solidFill(color, region);
-}
-
-QWSWindowSurface* HybridScreen::createSurface(QWidget *widget) const
-{
- if (qobject_cast<QGLWidget*>(widget))
- return new HybridSurface(widget, d_ptr->display);
- return d_ptr->screen->createSurface(widget);
-}
-
-QWSWindowSurface* HybridScreen::createSurface(const QString &key) const
-{
- if (key == QLatin1String("hybrid"))
- return new HybridSurface;
- return d_ptr->screen->createSurface(key);
-}
-
-QList<QScreen*> HybridScreen::subScreens() const
-{
- return d_ptr->screen->subScreens();
-}
-
-QRegion HybridScreen::region() const
-{
- return d_ptr->screen->region();
-}
diff --git a/src/plugins/gfxdrivers/hybrid/hybridscreen.h b/src/plugins/gfxdrivers/hybrid/hybridscreen.h
deleted file mode 100644
index b7888d5..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybridscreen.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef HYBRIDSCREEN_H
-#define HYBRIDSCREEN_H
-
-#include <QtOpenGL/QGLScreen>
-
-class HybridScreenPrivate;
-
-class HybridScreen : public QGLScreen
-{
-public:
- HybridScreen(int displayId);
- ~HybridScreen();
-
- bool hasOpenGLOverlays() const;
-
- bool chooseContext(QGLContext *context, const QGLContext *shareContext);
- bool hasOpenGL() { return true; }
-
- bool initDevice();
- bool connect(const QString &displaySpec);
- void disconnect();
- void shutdownDevice();
- void setMode(int,int,int);
- bool supportsDepth(int) const;
-
- void save();
- void restore();
- void blank(bool on);
-
- bool onCard(const unsigned char *) const;
- bool onCard(const unsigned char *, ulong& out_offset) const;
-
- bool isInterlaced() const;
-
- int memoryNeeded(const QString&);
- int sharedRamSize(void *);
-
- void haltUpdates();
- void resumeUpdates();
-
- void exposeRegion(QRegion r, int changing);
-
- void blit(const QImage &img, const QPoint &topLeft, const QRegion &region);
- void solidFill(const QColor &color, const QRegion &region);
- void setDirty(const QRect&);
-
- QWSWindowSurface* createSurface(QWidget *widget) const;
- QWSWindowSurface* createSurface(const QString &key) const;
-
- QList<QScreen*> subScreens() const;
- QRegion region() const;
-private:
- HybridScreenPrivate *d_ptr;
-};
-
-#endif // HYBRIDSCREEN_H
diff --git a/src/plugins/gfxdrivers/hybrid/hybridsurface.cpp b/src/plugins/gfxdrivers/hybrid/hybridsurface.cpp
deleted file mode 100644
index df183e2..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybridsurface.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "hybridsurface.h"
-
-#include <private/qwindowsurface_qws_p.h>
-#include <private/qwslock_p.h>
-#include <qscreen_qws.h>
-#include <qvarlengtharray.h>
-
-static void error(const char *message)
-{
- const EGLint error = eglGetError();
- qWarning("HybridSurface error: %s: 0x%x", message, error);
-}
-
-static void imgToVanilla(const QImage *img, VanillaPixmap *pix)
-{
- pix->width = img->width();
- pix->height = img->height();
- pix->stride = img->bytesPerLine();
-
- if (img->depth() == 32) {
- pix->rSize = pix->gSize = pix->bSize = pix->aSize = 8;
- pix->lSize = 0;
- pix->rOffset = 16;
- pix->gOffset = 8;
- pix->bOffset = 0;
- pix->aOffset = 24;
- } else if (img->format() == QImage::Format_RGB16) {
- pix->rSize = 5;
- pix->gSize = 6;
- pix->bSize = 5;
- pix->aSize = 0;
- pix->lSize = 0;
- pix->rOffset = 11;
- pix->gOffset = 5;
- pix->bOffset = 0;
- pix->aOffset = 0;
- }
-
- pix->padding = pix->padding2 = 0;
- pix->pixels = const_cast<uchar*>(img->bits());
-}
-
-HybridSurface::HybridSurface()
- : QWSGLWindowSurface(), memlock(0)
-{
- setSurfaceFlags(Buffered | Opaque);
-}
-
-HybridSurface::HybridSurface(QWidget *w, EGLDisplay disp)
- : QWSGLWindowSurface(w), memlock(0), display(disp), config(0),
- surface(EGL_NO_SURFACE), context(EGL_NO_CONTEXT),
- pdevice(new QWSGLPaintDevice(w))
-{
- setSurfaceFlags(Buffered | Opaque);
-
- EGLint configAttribs[] = {
- EGL_RED_SIZE, 0,
- EGL_GREEN_SIZE, 0,
- EGL_BLUE_SIZE, 0,
- EGL_ALPHA_SIZE, 0,
- EGL_DEPTH_SIZE, 0,
- EGL_STENCIL_SIZE, EGL_DONT_CARE,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_NONE, EGL_NONE
- };
-
-
- EGLBoolean status;
- EGLint numConfigs;
- status = eglChooseConfig(display, configAttribs, 0, 0, &numConfigs);
- if (!status) {
- error("chooseConfig");
- return;
- }
-
- //If there isn't any configuration good enough
- if (numConfigs < 1) {
- error("chooseConfig, no matching configurations found");
- return;
- }
-
- QVarLengthArray<EGLConfig> configs(numConfigs);
-
- status = eglChooseConfig(display, configAttribs, configs.data(),
- numConfigs, &numConfigs);
- if (!status) {
- error("chooseConfig");
- return;
- }
-
- // hw: if used on an image buffer we need to check whether the resulting
- // configuration matches our requirements exactly!
- config = configs[0];
-
- context = eglCreateContext(display, config, 0, 0);
- //(shareContext ? shareContext->d_func()->cx : 0),
- //configAttribs);
- if (context == EGL_NO_CONTEXT)
- error("eglCreateContext");
-
-}
-
-HybridSurface::~HybridSurface()
-{
-}
-
-bool HybridSurface::isValid() const
-{
- return true;
-}
-
-void HybridSurface::setGeometry(const QRect &rect, const QRegion &mask)
-{
- const QSize size = rect.size();
- if (img.size() != size) {
-// QWidget *win = window();
- QImage::Format imageFormat = QImage::Format_ARGB32_Premultiplied;
- const int bytesPerPixel = 4;
-
- const int bpl = (size.width() * bytesPerPixel + 3) & ~3;
- const int imagesize = bpl * size.height();
-
- if (imagesize == 0) {
- eglDestroySurface(display, surface);
- mem.detach();
- img = QImage();
- } else {
- mem.detach();
- if (!mem.create(imagesize)) {
- perror("HybridSurface::setGeometry allocating shared memory");
- qFatal("Error creating shared memory of size %d", imagesize);
- }
- uchar *base = static_cast<uchar*>(mem.address());
- img = QImage(base, size.width(), size.height(), imageFormat);
-// setImageMetrics(img, win);
-
- imgToVanilla(&img, &vanillaPix);
- surface = eglCreatePixmapSurface(display, config, &vanillaPix, 0);
- if (surface == EGL_NO_SURFACE)
- error("setGeometry:eglCreatePixmapSurface");
-
- }
- }
- QWSWindowSurface::setGeometry(rect, mask);
-}
-
-QByteArray HybridSurface::permanentState() const
-{
- QByteArray array;
- array.resize(4 * sizeof(int) + sizeof(QImage::Format) +
- sizeof(SurfaceFlags));
-
- char *ptr = array.data();
-
- reinterpret_cast<int*>(ptr)[0] = mem.id();
- reinterpret_cast<int*>(ptr)[1] = img.width();
- reinterpret_cast<int*>(ptr)[2] = img.height();
- reinterpret_cast<int*>(ptr)[3] = (memlock ? memlock->id() : -1);
- ptr += 4 * sizeof(int);
-
- *reinterpret_cast<QImage::Format*>(ptr) = img.format();
- ptr += sizeof(QImage::Format);
-
- *reinterpret_cast<SurfaceFlags*>(ptr) = surfaceFlags();
-
- return array;
-}
-
-void HybridSurface::setPermanentState(const QByteArray &data)
-{
- int memId;
- int width;
- int height;
- int lockId;
- QImage::Format format;
- SurfaceFlags flags;
-
- const char *ptr = data.constData();
-
- memId = reinterpret_cast<const int*>(ptr)[0];
- width = reinterpret_cast<const int*>(ptr)[1];
- height = reinterpret_cast<const int*>(ptr)[2];
- lockId = reinterpret_cast<const int*>(ptr)[3];
- ptr += 4 * sizeof(int);
-
- format = *reinterpret_cast<const QImage::Format*>(ptr);
- ptr += sizeof(QImage::Format);
- flags = *reinterpret_cast<const SurfaceFlags*>(ptr);
-
- setSurfaceFlags(flags);
-
-// setMemory(memId);
- if (mem.id() != memId) {
- mem.detach();
- if (!mem.attach(memId)) {
- perror("QWSSharedMemSurface: attaching to shared memory");
- qCritical("QWSSharedMemSurface: Error attaching to"
- " shared memory 0x%x", memId);
- }
- }
-
-// setLock(lockId);
- if (!memlock || memlock->id() == lockId) {
- delete memlock;
- memlock = (lockId == -1 ? 0 : new QWSLock(lockId));
- }
-
- uchar *base = static_cast<uchar*>(mem.address());
- img = QImage(base, width, height, format);
-}
-
-QImage HybridSurface::image() const
-{
- return img;
-}
-
-QPaintDevice* HybridSurface::paintDevice()
-{
- return pdevice;
-}
-
-void HybridSurface::beginPaint(const QRegion &region)
-{
- QWSGLWindowSurface::beginPaint(region);
- eglBindAPI(EGL_OPENGL_ES_API);
-
- EGLBoolean ok = eglMakeCurrent(display, surface, surface, context);
- if (!ok)
- error("qglMakeCurrent");
-}
-
-bool HybridSurface::lock(int timeout)
-{
- Q_UNUSED(timeout);
- if (!memlock)
- return true;
- return memlock->lock(QWSLock::BackingStore);
-}
-
-void HybridSurface::unlock()
-{
- if (memlock)
- memlock->unlock(QWSLock::BackingStore);
-}
-
-QPoint HybridSurface::painterOffset() const
-{
- const QWidget *w = window();
- if (!w)
- return QPoint();
-
- if (w->mask().isEmpty())
- return QWSWindowSurface::painterOffset();
-
- const QRegion region = w->mask()
- & w->frameGeometry().translated(-w->geometry().topLeft());
- return -region.boundingRect().topLeft();
-}
-
diff --git a/src/plugins/gfxdrivers/hybrid/hybridsurface.h b/src/plugins/gfxdrivers/hybrid/hybridsurface.h
deleted file mode 100644
index 1fba95b..0000000
--- a/src/plugins/gfxdrivers/hybrid/hybridsurface.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef HYBRIDSURFACE_H
-#define HYBRIDSURFACE_H
-
-#include <private/qglwindowsurface_qws_p.h>
-#include <private/qglpaintdevice_qws_p.h>
-#include <GLES/egl.h>
-#include <vanilla/eglVanilla.h>
-#include <private/qwssharedmemory_p.h>
-
-class HybridPaintDevice;
-class HybridSurfacePrivate;
-class QWSLock;
-
-class HybridSurface : public QWSGLWindowSurface
-{
-public:
- HybridSurface();
- HybridSurface(QWidget *w, EGLDisplay display);
- ~HybridSurface();
-
- void beginPaint(const QRegion &region);
- bool lock(int timeout);
- void unlock();
-
- bool isValid() const;
- void setGeometry(const QRect &rect, const QRegion &mask);
- QString key() const { return QLatin1String("hybrid"); }
-
- QByteArray permanentState() const;
- void setPermanentState(const QByteArray &state);
-
- QImage image() const;
- QPaintDevice *paintDevice();
- QPoint painterOffset() const;
-
-private:
- QWSSharedMemory mem;
- QImage img;
- QWSLock *memlock;
- EGLDisplay display;
- EGLConfig config;
- EGLSurface surface;
- EGLContext context;
- QWSGLPaintDevice *pdevice;
-
- VanillaPixmap vanillaPix;
-};
-
-#endif // HYBRIDSURFACE_H
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c
index ac9dc8d..a9c22ef 100644
--- a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c
@@ -617,6 +617,16 @@ void pvrQwsGetGeometry(PvrQwsDrawable *drawable, PvrQwsRect *rect)
*rect = drawable->rect;
}
+void pvrQwsSetRotation(PvrQwsDrawable *drawable, int angle)
+{
+ if (drawable->rotationAngle != angle) {
+ drawable->rotationAngle = angle;
+
+ /* Force the buffers to be recreated if the rotation angle changes */
+ pvrQwsInvalidateBuffers(drawable);
+ }
+}
+
int pvrQwsGetStride(PvrQwsDrawable *drawable)
{
if (drawable->backBuffersValid)
@@ -652,7 +662,7 @@ int pvrQwsAllocBuffers(PvrQwsDrawable *drawable)
PVR2DMemFree(pvrQwsDisplay.context, drawable->backBuffers[index]);
}
}
- drawable->stridePixels = (drawable->rect.width + 7) & ~7;
+ drawable->stridePixels = (drawable->rect.width + 31) & ~31;
drawable->strideBytes =
drawable->stridePixels *
pvrQwsDisplay.screens[drawable->screen].bytesPerPixel;
@@ -818,63 +828,3 @@ void pvrQwsSetSwapFunction
drawable->swapFunction = func;
drawable->userData = userData;
}
-
-unsigned long pvrQwsGetMemoryId(PvrQwsDrawable *drawable)
-{
- unsigned long addr;
- unsigned long start;
- unsigned long end;
- unsigned long off;
- unsigned long offset;
- FILE *file;
- char buffer[BUFSIZ];
- char flags[16];
-
- if (!drawable->backBuffersValid)
- return 0;
- addr = (unsigned long)
- (drawable->backBuffers[drawable->currentBackBuffer]->pBase);
-
- /* Search /proc/self/maps for the memory region that contains "addr".
- The file offset for that memory region is the identifier we need */
- file = fopen("/proc/self/maps", "r");
- if (!file) {
- perror("/proc/self/maps");
- return 0;
- }
- offset = 0;
- while (fgets(buffer, sizeof(buffer), file)) {
- if (sscanf(buffer, "%lx-%lx %s %lx",
- &start, &end, flags, &off) < 4)
- continue;
- if (start <= addr && addr < end) {
- offset = off;
- break;
- }
- }
- fclose(file);
- return offset;
-}
-
-void *pvrQwsMapMemory(unsigned long id, int size)
-{
- void *addr;
- int fd = open("/dev/pvrsrv", O_RDWR, 0);
- if (fd < 0) {
- perror("/dev/pvrsrv");
- return 0;
- }
- addr = mmap(0, (size_t)size, PROT_READ | PROT_WRITE,
- MAP_SHARED, fd, (off_t)id);
- if (addr == (void *)(-1)) {
- perror("mmap pvr memory region");
- addr = 0;
- }
- close(fd);
- return addr;
-}
-
-void pvrQwsUnmapMemory(void *addr, int size)
-{
- munmap(addr, size);
-}
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h
index 952ff6f..55e0310 100644
--- a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h
@@ -126,6 +126,9 @@ void pvrQwsSetGeometry(PvrQwsDrawable *drawable, const PvrQwsRect *rect);
/* Get the current geometry for a drawable */
void pvrQwsGetGeometry(PvrQwsDrawable *drawable, PvrQwsRect *rect);
+/* Set the rotation angle in degrees */
+void pvrQwsSetRotation(PvrQwsDrawable *drawable, int angle);
+
/* Get the line stride for a drawable. Returns zero if the buffers
are not allocated or have been invalidated */
int pvrQwsGetStride(PvrQwsDrawable *drawable);
@@ -159,21 +162,6 @@ int pvrQwsSwapBuffers(PvrQwsDrawable *drawable, int repaintOnly);
void pvrQwsSetSwapFunction
(PvrQwsDrawable *drawable, PvrQwsSwapFunction func, void *userData);
-/* Get a memory identifier for the indicated drawable's buffer.
- The identifier can be passed to another process and then
- passed to pvrQwsMapMemory() to map the drawable's buffer into
- the other process's address space. Returns zero if the
- memory identifier could not be determined. This should only
- be used for pixmap drawables */
-unsigned long pvrQwsGetMemoryId(PvrQwsDrawable *drawable);
-
-/* Map the memory buffer of a foreign application's drawable, as
- indicated by "id" and "size". Returns null if the map failed */
-void *pvrQwsMapMemory(unsigned long id, int size);
-
-/* Unmap the memory obtained from pvrQwsMapMemory() */
-void pvrQwsUnmapMemory(void *addr, int size);
-
#ifdef __cplusplus
};
#endif
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h
index cf80a90..dcd4e4f 100644
--- a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h
@@ -114,6 +114,7 @@ struct _PvrQwsDrawable
int isFullScreen;
int strideBytes;
int stridePixels;
+ int rotationAngle;
PvrQwsSwapFunction swapFunction;
void *userData;
PvrQwsDrawable *nextWinId;
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
index 253f39f..28b2251 100644
--- a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
@@ -132,6 +132,16 @@ static WSEGLError wseglCloseDisplay(WSEGLDisplayHandle display)
return WSEGL_SUCCESS;
}
+static WSEGLRotationAngle wseglRotationValue(int degrees)
+{
+ switch (degrees) {
+ case 90: return WSEGL_ROTATE_90;
+ case 180: return WSEGL_ROTATE_180;
+ case 270: return WSEGL_ROTATE_270;
+ default: return WSEGL_ROTATE_0;
+ }
+}
+
/* Create the WSEGL drawable version of a native window */
static WSEGLError wseglCreateWindowDrawable
(WSEGLDisplayHandle display, WSEGLConfig *config,
@@ -152,7 +162,7 @@ static WSEGLError wseglCreateWindowDrawable
*drawable = (WSEGLDrawableHandle)screen;
if (!pvrQwsAllocBuffers(screen))
return WSEGL_OUT_OF_MEMORY;
- *rotationAngle = WSEGL_ROTATE_0;
+ *rotationAngle = wseglRotationValue(screen->rotationAngle);
return WSEGL_SUCCESS;
}
@@ -163,7 +173,7 @@ static WSEGLError wseglCreateWindowDrawable
/* The drawable is ready to go */
*drawable = (WSEGLDrawableHandle)draw;
- *rotationAngle = WSEGL_ROTATE_0;
+ *rotationAngle = wseglRotationValue(draw->rotationAngle);
if (!pvrQwsAllocBuffers(draw))
return WSEGL_OUT_OF_MEMORY;
return WSEGL_SUCCESS;
diff --git a/src/plugins/gfxdrivers/powervr/README b/src/plugins/gfxdrivers/powervr/README
index 4dce87f..513e7f5 100644
--- a/src/plugins/gfxdrivers/powervr/README
+++ b/src/plugins/gfxdrivers/powervr/README
@@ -31,9 +31,10 @@ strictly Unix-style markers.
* IMPORTANT: To build the QScreen plugin and the WSEGL library it depends *
* on, the pvr2d.h, wsegl.h headers for your platform are required. You *
* can find a copy of these headers in src/3rdparty/powervr for SGX based *
-* platforms like the TI OMAP3xxx. They may also work on MBX platforms too *
-* depending on how old your libEGL is. You can tell Qt where to find *
-* these headers by setting QMAKE_INCDIR_POWERVR in the mkspec. *
+* platforms like the TI OMAP3xxx. They probably will not work on MBX *
+* because of differences in the layout of certain PVR2D structures. *
+* You can tell Qt where to find the actual headers for your system by *
+* setting QMAKE_INCDIR_POWERVR in the mkspec. *
***************************************************************************
When you start a Qt/Embedded application, you should modify the QWS_DISPLAY
@@ -51,6 +52,11 @@ on the device with:
hellogl_es -qws
+The driver also supports screen rotation if Qt is configured with the
+-qt-gfx-transformed option and the QWS_DISPLAY variable is wrapped in a
+"Transformed" declaration:
+
+ Transformed:powervr:mmWidth40:mmHeight54:Rot90:0
Know Issues:
* A QGLWidget may not have window decorations if it is a top-level window.
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
index cb453d7..1dec9ea 100644
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
@@ -44,33 +44,42 @@
#include "pvrqwsdrawable_p.h"
#include <QRegExp>
#include <qwindowsystem_qws.h>
+#ifndef QT_NO_QWS_TRANSFORMED
+#include <qscreentransformed_qws.h>
+#endif
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/kd.h>
#include <fcntl.h>
#include <unistd.h>
+//![0]
PvrEglScreen::PvrEglScreen(int displayId)
: QGLScreen(displayId)
{
setOptions(NativeWindows);
setSupportsBlitInClients(true);
setSurfaceFunctions(new PvrEglScreenSurfaceFunctions(this, displayId));
+//![0]
fd = -1;
ttyfd = -1;
doGraphicsMode = true;
oldKdMode = KD_TEXT;
- if (QWSServer::instance())
- holder = new PvrEglSurfaceHolder();
- else
- holder = 0;
+ parent = 0;
+
+ // Make sure that the EGL layer is initialized and the drivers loaded.
+ EGLDisplay dpy = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
+ if (!eglInitialize(dpy, 0, 0))
+ qWarning("Could not initialize EGL display - are the drivers loaded?");
+
+ // Make sure that screen 0 is initialized.
+ pvrQwsScreenWindow(0);
}
PvrEglScreen::~PvrEglScreen()
{
if (fd >= 0)
::close(fd);
- delete holder;
}
bool PvrEglScreen::initDevice()
@@ -183,10 +192,11 @@ bool PvrEglScreen::hasOpenGL()
return true;
}
+//![1]
QWSWindowSurface* PvrEglScreen::createSurface(QWidget *widget) const
{
if (qobject_cast<QGLWidget*>(widget))
- return new PvrEglWindowSurface(widget, (QScreen *)this, displayId);
+ return new PvrEglWindowSurface(widget, (PvrEglScreen *)this, displayId);
return QScreen::createSurface(widget);
}
@@ -194,10 +204,72 @@ QWSWindowSurface* PvrEglScreen::createSurface(QWidget *widget) const
QWSWindowSurface* PvrEglScreen::createSurface(const QString &key) const
{
if (key == QLatin1String("PvrEgl"))
- return new PvrEglWindowSurface(holder);
+ return new PvrEglWindowSurface();
return QScreen::createSurface(key);
}
+//![1]
+
+#ifndef QT_NO_QWS_TRANSFORMED
+
+static const QScreen *parentScreen
+ (const QScreen *current, const QScreen *lookingFor)
+{
+ if (!current)
+ return 0;
+ switch (current->classId()) {
+ case QScreen::ProxyClass:
+ case QScreen::TransformedClass: {
+ const QScreen *child =
+ static_cast<const QProxyScreen *>(current)->screen();
+ if (child == lookingFor)
+ return current;
+ else
+ return parentScreen(child, lookingFor);
+ }
+ // Not reached.
+
+ case QScreen::MultiClass: {
+ QList<QScreen *> screens = current->subScreens();
+ foreach (QScreen *screen, screens) {
+ if (screen == lookingFor)
+ return current;
+ const QScreen *parent = parentScreen(screen, lookingFor);
+ if (parent)
+ return parent;
+ }
+ }
+ break;
+
+ default: break;
+ }
+ return 0;
+}
+
+int PvrEglScreen::transformation() const
+{
+ // We need to search for our parent screen, which is assumed to be
+ // "Transformed". If it isn't, then there is no transformation.
+ // There is no direct method to get the parent screen so we need
+ // to search every screen until we find ourselves.
+ if (!parent && qt_screen != this)
+ parent = parentScreen(qt_screen, this);
+ if (!parent)
+ return 0;
+ if (parent->classId() != QScreen::TransformedClass)
+ return 0;
+ return 90 * static_cast<const QTransformedScreen *>(parent)
+ ->transformation();
+}
+
+#else
+
+int PvrEglScreen::transformation() const
+{
+ return 0;
+}
+
+#endif
void PvrEglScreen::sync()
{
@@ -253,8 +325,10 @@ void PvrEglScreen::closeTty()
ttyfd = -1;
}
+//![2]
bool PvrEglScreenSurfaceFunctions::createNativeWindow(QWidget *widget, EGLNativeWindowType *native)
{
+//![2]
QWSWindowSurface *surface =
static_cast<QWSWindowSurface *>(widget->windowSurface());
if (!surface) {
@@ -275,116 +349,3 @@ bool PvrEglScreenSurfaceFunctions::createNativeWindow(QWidget *widget, EGLNative
*native = (EGLNativeWindowType)(nsurface->nativeDrawable());
return true;
}
-
-// The PowerVR engine on the device needs to allocate about 2Mb of
-// contiguous physical memory to manage drawing into a surface.
-//
-// The problem is that once Qtopia begins its startup sequence,
-// it allocates enough memory to severely fragment the physical
-// address space on the device. This leaves the PowerVR engine
-// unable to allocate the necessary contiguous physical memory
-// when an EGL surface is created.
-//
-// A solution to this is to pre-allocate a dummy surface early
-// in the startup sequence before memory becomes fragmented,
-// reserving it for any future EGL applications to use.
-//
-// However, the PowerVR engine has problems managing multiple
-// surfaces concurrently, and so real EGL applications end up
-// with unacceptably slow frame rates unless the dummy surface
-// is destroyed while the real EGL applications are running.
-//
-// In summary, we need to try to ensure that there is always at
-// least one EGL surface active at any given time to reserve the
-// memory but destroy the temporary surface when a real surface
-// is using the device. That is the purpose of PvrEglSurfaceHolder.
-
-PvrEglSurfaceHolder::PvrEglSurfaceHolder(QObject *parent)
- : QObject(parent)
-{
- numRealSurfaces = 0;
-
- PvrQwsRect rect;
- rect.x = 0;
- rect.y = 0;
- rect.width = 16;
- rect.height = 16;
- tempSurface = pvrQwsCreateWindow(0, -1, &rect);
-
- dpy = EGL_NO_DISPLAY;
- config = 0;
- surface = EGL_NO_SURFACE;
-
- dpy = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
- if (!eglInitialize(dpy, 0, 0)) {
- qWarning("Could not initialize EGL display - are the drivers loaded?");
- dpy = EGL_NO_DISPLAY;
- return;
- }
-
- EGLint attribList[16];
- int temp = 0;
- attribList[temp++] = EGL_LEVEL; // Framebuffer level 0
- attribList[temp++] = 0;
- attribList[temp++] = EGL_SURFACE_TYPE;
- attribList[temp++] = EGL_WINDOW_BIT;
- attribList[temp++] = EGL_NONE;
-
- EGLint numConfigs = 0;
- if (!eglChooseConfig(dpy, attribList, &config, 1, &numConfigs) || numConfigs != 1) {
- qWarning("Could not find a matching a EGL configuration");
- eglTerminate(dpy);
- dpy = EGL_NO_DISPLAY;
- return;
- }
-
- surface = eglCreateWindowSurface
- (dpy, config, (EGLNativeWindowType)(-1), NULL);
- if (surface == EGL_NO_SURFACE)
- qWarning("Could not create the temporary EGL surface");
-}
-
-PvrEglSurfaceHolder::~PvrEglSurfaceHolder()
-{
- if (surface != EGL_NO_SURFACE)
- eglDestroySurface(dpy, surface);
- if (dpy != EGL_NO_DISPLAY)
- eglTerminate(dpy);
- if (tempSurface)
- pvrQwsDestroyDrawable(tempSurface);
-}
-
-// Add a real EGL surface to the system.
-void PvrEglSurfaceHolder::addSurface()
-{
- ++numRealSurfaces;
- if (numRealSurfaces == 1) {
- // Destroy the temporary surface while some other application
- // is making use of the EGL sub-system for 3D rendering.
- if (surface != EGL_NO_SURFACE) {
- eglDestroySurface(dpy, surface);
- surface = EGL_NO_SURFACE;
- }
- }
-}
-
-// Remove an actual EGL surface from the system.
-void PvrEglSurfaceHolder::removeSurface()
-{
- if (numRealSurfaces > 0) {
- --numRealSurfaces;
- if (numRealSurfaces == 0) {
- // The last real EGL surface has been destroyed, so re-create
- // the temporary surface. There is a race condition here in
- // that Qtopia could allocate a lot of memory just after
- // the real EGL surface is destroyed but before we could
- // create the temporary surface again.
- if (surface == EGL_NO_SURFACE && dpy != EGL_NO_DISPLAY) {
- surface = eglCreateWindowSurface
- (dpy, config, (EGLNativeWindowType)(-1), NULL);
- if (surface == EGL_NO_SURFACE)
- qWarning("Could not re-create the temporary EGL surface");
- }
- }
- }
-}
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h
index 1c79f8e..5769e70 100644
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h
@@ -46,37 +46,21 @@
#include <QGLScreen>
#include "pvrqwsdrawable.h"
+class PvrEglScreen;
+
class PvrEglScreenSurfaceFunctions : public QGLScreenSurfaceFunctions
{
public:
- PvrEglScreenSurfaceFunctions(QScreen *s, int screenNum)
+ PvrEglScreenSurfaceFunctions(PvrEglScreen *s, int screenNum)
: screen(s), displayId(screenNum) {}
bool createNativeWindow(QWidget *widget, EGLNativeWindowType *native);
private:
- QScreen *screen;
+ PvrEglScreen *screen;
int displayId;
};
-class PvrEglSurfaceHolder : public QObject
-{
- Q_OBJECT
-public:
- PvrEglSurfaceHolder(QObject *parent=0);
- ~PvrEglSurfaceHolder();
-
- void addSurface();
- void removeSurface();
-
-private:
- int numRealSurfaces;
- PvrQwsDrawable *tempSurface;
- EGLDisplay dpy;
- EGLConfig config;
- EGLSurface surface;
-};
-
class PvrEglScreen : public QGLScreen
{
public:
@@ -98,6 +82,8 @@ public:
QWSWindowSurface* createSurface(QWidget *widget) const;
QWSWindowSurface* createSurface(const QString &key) const;
+ int transformation() const;
+
private:
void sync();
void openTty();
@@ -105,9 +91,9 @@ private:
int fd;
int ttyfd, oldKdMode;
- PvrEglSurfaceHolder *holder;
QString ttyDevice;
bool doGraphicsMode;
+ mutable const QScreen *parent;
};
#endif
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
index 09c0ace..4a3787f 100644
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
@@ -46,14 +46,13 @@
#include <QWSDisplay>
PvrEglWindowSurface::PvrEglWindowSurface
- (QWidget *widget, QScreen *screen, int screenNum)
+ (QWidget *widget, PvrEglScreen *screen, int screenNum)
: QWSGLWindowSurface(widget)
{
setSurfaceFlags(QWSWindowSurface::Opaque);
this->widget = widget;
this->screen = screen;
- this->holder = 0;
this->pdevice = 0;
QPoint pos = offset(widget);
@@ -64,6 +63,7 @@ PvrEglWindowSurface::PvrEglWindowSurface
pvrRect.y = pos.y();
pvrRect.width = size.width();
pvrRect.height = size.height();
+ transformRects(&pvrRect, 1);
// Try to recover a previous PvrQwsDrawable object for the widget
// if there is one. This can happen when a PvrEglWindowSurface
@@ -76,9 +76,10 @@ PvrEglWindowSurface::PvrEglWindowSurface
pvrQwsSetGeometry(drawable, &pvrRect);
else
drawable = pvrQwsCreateWindow(screenNum, (long)widget, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
}
-PvrEglWindowSurface::PvrEglWindowSurface(PvrEglSurfaceHolder *holder)
+PvrEglWindowSurface::PvrEglWindowSurface()
: QWSGLWindowSurface()
{
setSurfaceFlags(QWSWindowSurface::Opaque);
@@ -86,9 +87,6 @@ PvrEglWindowSurface::PvrEglWindowSurface(PvrEglSurfaceHolder *holder)
widget = 0;
screen = 0;
pdevice = 0;
-
- this->holder = holder;
- holder->addSurface();
}
PvrEglWindowSurface::~PvrEglWindowSurface()
@@ -100,8 +98,6 @@ PvrEglWindowSurface::~PvrEglWindowSurface()
if (drawable && pvrQwsReleaseWindow(drawable))
pvrQwsDestroyDrawable(drawable);
- if (holder)
- holder->removeSurface();
delete pdevice;
}
@@ -119,7 +115,9 @@ void PvrEglWindowSurface::setGeometry(const QRect &rect)
pvrRect.y = rect.y();
pvrRect.width = rect.width();
pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
pvrQwsSetGeometry(drawable, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
}
QWSGLWindowSurface::setGeometry(rect);
}
@@ -133,7 +131,9 @@ bool PvrEglWindowSurface::move(const QPoint &offset)
pvrRect.y = rect.y();
pvrRect.width = rect.width();
pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
pvrQwsSetGeometry(drawable, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
}
return QWSGLWindowSurface::move(offset);
}
@@ -206,7 +206,9 @@ void PvrEglWindowSurface::setDirectRegion(const QRegion &r, int id)
pvrRect.y = rect.y();
pvrRect.width = rect.width();
pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
pvrQwsSetVisibleRegion(drawable, &pvrRect, 1);
+ pvrQwsSetRotation(drawable, screen->transformation());
if (!pvrQwsSwapBuffers(drawable, 1))
screen->solidFill(QColor(0, 0, 0), region);
} else {
@@ -219,9 +221,53 @@ void PvrEglWindowSurface::setDirectRegion(const QRegion &r, int id)
pvrRects[index].width = rect.width();
pvrRects[index].height = rect.height();
}
+ transformRects(pvrRects, rects.size());
pvrQwsSetVisibleRegion(drawable, pvrRects, rects.size());
+ pvrQwsSetRotation(drawable, screen->transformation());
if (!pvrQwsSwapBuffers(drawable, 1))
screen->solidFill(QColor(0, 0, 0), region);
delete [] pvrRects;
}
}
+
+void PvrEglWindowSurface::transformRects(PvrQwsRect *rects, int count) const
+{
+ switch (screen->transformation()) {
+ case 0: break;
+
+ case 90:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = rects[index].y;
+ int y = screen->height() - (rects[index].x + rects[index].width);
+ rects[index].x = x;
+ rects[index].y = y;
+ qSwap(rects[index].width, rects[index].height);
+ }
+ }
+ break;
+
+ case 180:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = screen->width() - (rects[index].x + rects[index].width);
+ int y = screen->height() - (rects[index].y + rects[index].height);
+ rects[index].x = x;
+ rects[index].y = y;
+ }
+ }
+ break;
+
+ case 270:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = screen->width() - (rects[index].y + rects[index].height);
+ int y = rects[index].x;
+ rects[index].x = x;
+ rects[index].y = y;
+ qSwap(rects[index].width, rects[index].height);
+ }
+ }
+ break;
+ }
+}
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h
index 0da3653..b0a161c 100644
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h
@@ -45,14 +45,13 @@
#include <private/qglwindowsurface_qws_p.h>
#include "pvrqwsdrawable.h"
-class QScreen;
-class PvrEglSurfaceHolder;
+class PvrEglScreen;
class PvrEglWindowSurface : public QWSGLWindowSurface
{
public:
- PvrEglWindowSurface(QWidget *widget, QScreen *screen, int screenNum);
- PvrEglWindowSurface(PvrEglSurfaceHolder *holder);
+ PvrEglWindowSurface(QWidget *widget, PvrEglScreen *screen, int screenNum);
+ PvrEglWindowSurface();
~PvrEglWindowSurface();
QString key() const { return QLatin1String("PvrEgl"); }
@@ -77,9 +76,10 @@ public:
private:
QWidget *widget;
PvrQwsDrawable *drawable;
- QScreen *screen;
- PvrEglSurfaceHolder *holder;
+ PvrEglScreen *screen;
QPaintDevice *pdevice;
+
+ void transformRects(PvrQwsRect *rects, int count) const;
};
#endif
diff --git a/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp
index df623ba..955aa55 100644
--- a/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp
+++ b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp
@@ -350,21 +350,9 @@ QPaintEngine *ShivaVGWindowSurface::paintEngine() const
return d_ptr->engine;
}
-// We need to get access to QWidget::metric() from ShivaVGWindowSurface::metric,
-// but it is not a friend of QWidget. To get around this, we create a
-// fake QX11PaintEngine class, which is a friend.
-class QX11PaintEngine
-{
-public:
- static int metric(const QWidget *widget, QPaintDevice::PaintDeviceMetric met)
- {
- return widget->metric(met);
- }
-};
-
int ShivaVGWindowSurface::metric(PaintDeviceMetric met) const
{
- return QX11PaintEngine::metric(window(), met);
+ return qt_paint_device_metric(window(), met);
}
QT_END_NAMESPACE
diff --git a/src/qt3support/widgets/q3combobox.cpp b/src/qt3support/widgets/q3combobox.cpp
index 9e7fd77..2aee4ac 100644
--- a/src/qt3support/widgets/q3combobox.cpp
+++ b/src/qt3support/widgets/q3combobox.cpp
@@ -2234,7 +2234,8 @@ bool Q3ComboBox::autoCompletion() const
return d->useCompletion;
}
-/*!\reimp
+/*!
+ \internal
*/
void Q3ComboBox::styleChange( QStyle& s )
{
diff --git a/src/qt3support/widgets/q3toolbar.cpp b/src/qt3support/widgets/q3toolbar.cpp
index dbe3afd..00ff47b 100644
--- a/src/qt3support/widgets/q3toolbar.cpp
+++ b/src/qt3support/widgets/q3toolbar.cpp
@@ -422,7 +422,7 @@ void Q3ToolBar::addSeparator()
}
/*!
- \internal
+ \internal
*/
void Q3ToolBar::styleChange(QStyle &oldStyle)
diff --git a/src/s60installs/eabi/QtCoreu.def b/src/s60installs/eabi/QtCoreu.def
index dda89fd..2ecc48f 100644
--- a/src/s60installs/eabi/QtCoreu.def
+++ b/src/s60installs/eabi/QtCoreu.def
@@ -11,3827 +11,3570 @@ EXPORTS
_Z11qUncompressPKhi @ 10 NONAME
_Z11qt_assert_xPKcS0_S0_i @ 11 NONAME
_Z11qt_int_sqrtj @ 12 NONAME
- _Z11qt_nameprepRK7QString @ 13 NONAME ABSENT
- _Z12noforcepointR11QTextStream @ 14 NONAME
- _Z12qSharedBuildv @ 15 NONAME
- _Z12q_atomic_swpPVcc @ 16 NONAME
+ _Z12noforcepointR11QTextStream @ 13 NONAME
+ _Z12qSharedBuildv @ 14 NONAME
+ _Z12q_atomic_swpPVcc @ 15 NONAME
+ _Z12qt_s60GetRFsv @ 16 NONAME
_Z13lowercasebaseR11QTextStream @ 17 NONAME
_Z13qErrnoWarningPKcz @ 18 NONAME
_Z13qErrnoWarningiPKcz @ 19 NONAME
_Z13qFlagLocationPKc @ 20 NONAME
_Z13uppercasebaseR11QTextStream @ 21 NONAME
- _Z15lowercasedigitsR11QTextStream @ 22 NONAME
- _Z15qAddPostRoutinePFvvE @ 23 NONAME
- _Z15qInitResourceIOv @ 24 NONAME
- _Z15qt_atomic_yieldPi @ 25 NONAME
- _Z15qt_error_stringi @ 26 NONAME
- _Z15uppercasedigitsR11QTextStream @ 27 NONAME
- _Z16qt_QString2HBufCRK7QString @ 28 NONAME
- _Z16qt_check_pointerPKci @ 29 NONAME
- _Z17qt_TDesC2QStringLRK7TDesC16 @ 30 NONAME ABSENT
- _Z17qt_message_output9QtMsgTypePKc @ 31 NONAME
- _Z18qGetCharAttributesPKtjPK13HB_ScriptItemjP17HB_CharAttributes @ 32 NONAME
- _Z18qInstallMsgHandlerPFv9QtMsgTypePKcE @ 33 NONAME
- _Z18qRemovePostRoutinePFvvE @ 34 NONAME
- _Z19qcoreVariantHandlerv @ 35 NONAME
- _Z20qt_qFindChild_helperPK7QObjectRK7QStringRK11QMetaObject @ 36 NONAME
- _Z21qDeleteInEventHandlerP7QObject @ 37 NONAME
- _Z21qRegisterResourceDataiPKhS0_S0_ @ 38 NONAME
- _Z21qt_call_post_routinesv @ 39 NONAME
- _Z23qUnregisterResourceDataiPKhS0_S0_ @ 40 NONAME
- _Z23qt_qFindChildren_helperPK7QObjectRK7QStringPK7QRegExpRK11QMetaObjectP5QListIPvE @ 41 NONAME
- _Z23qt_resolveS60PluginFunci @ 42 NONAME
- _Z24qGlobalPostedEventsCountv @ 43 NONAME
- _Z2wsR11QTextStream @ 44 NONAME
- _Z32qt_register_signal_spy_callbacksRK21QSignalSpyCallbackSet @ 45 NONAME
- _Z33QBasicAtomicInt_testAndSetOrderedPViii @ 46 NONAME
- _Z34QBasicAtomicInt_fetchAndAddOrderedPVii @ 47 NONAME
- _Z35qt_translateExceptionToSymbianErrorRKSt9exception @ 48 NONAME ABSENT
- _Z35qt_translateSymbianErrorToExceptioni @ 49 NONAME ABSENT
- _Z36QBasicAtomicInt_fetchAndStoreOrderedPVii @ 50 NONAME
- _Z36qt_translateExceptionToSymbianErrorLRKSt9exception @ 51 NONAME ABSENT
- _Z37QBasicAtomicPointer_testAndSetOrderedPVPvS_S_ @ 52 NONAME
- _Z37qRegisterStaticPluginInstanceFunctionPFP7QObjectvE @ 53 NONAME
- _Z38QBasicAtomicPointer_fetchAndAddOrderedPVPvi @ 54 NONAME
- _Z3binR11QTextStream @ 55 NONAME
- _Z3bomR11QTextStream @ 56 NONAME
- _Z3decR11QTextStream @ 57 NONAME
- _Z3hexR11QTextStream @ 58 NONAME
- _Z3octR11QTextStream @ 59 NONAME
- _Z40QBasicAtomicPointer_fetchAndStoreOrderedPVPvS_ @ 60 NONAME
- _Z4endlR11QTextStream @ 61 NONAME
- _Z4leftR11QTextStream @ 62 NONAME
- _Z4qInfv @ 63 NONAME
- _Z5fixedR11QTextStream @ 64 NONAME
- _Z5flushR11QTextStream @ 65 NONAME
- _Z5qFreePv @ 66 NONAME
- _Z5qHashRK10QByteArray @ 67 NONAME
- _Z5qHashRK10QStringRef @ 68 NONAME
- _Z5qHashRK7QString @ 69 NONAME
- _Z5qHashRK9QBitArray @ 70 NONAME
- _Z5qQNaNv @ 71 NONAME
- _Z5qSNaNv @ 72 NONAME
- _Z5qdtoadiiPiS_PPcS1_ @ 73 NONAME
- _Z5qrandv @ 74 NONAME
- _Z5resetR11QTextStream @ 75 NONAME
- _Z5rightR11QTextStream @ 76 NONAME
- _Z6centerR11QTextStream @ 77 NONAME
- _Z6qDebugPKcz @ 78 NONAME
- _Z6qFatalPKcz @ 79 NONAME
- _Z6qIsInfd @ 80 NONAME
- _Z6qIsInff @ 81 NONAME
- _Z6qIsNaNd @ 82 NONAME
- _Z6qIsNaNf @ 83 NONAME
- _Z6qsrandj @ 84 NONAME
- _Z7qMallocj @ 85 NONAME
- _Z7qMemSetPvij @ 86 NONAME
- _Z7qgetenvPKc @ 87 NONAME
- _Z7qputenvPKcRK10QByteArray @ 88 NONAME
- _Z7qstrcmpPKcS0_ @ 89 NONAME
- _Z7qstrcmpRK10QByteArrayPKc @ 90 NONAME
- _Z7qstrcmpRK10QByteArrayS1_ @ 91 NONAME
- _Z7qstrcpyPcPKc @ 92 NONAME
- _Z7qstrdupPKc @ 93 NONAME
- _Z7qstrtodPKcPS0_Pb @ 94 NONAME
- _Z8qAppNamev @ 95 NONAME
- _Z8qMemCopyPvPKvj @ 96 NONAME
- _Z8qReallocPvj @ 97 NONAME
- _Z8qVersionv @ 98 NONAME
- _Z8qWarningPKcz @ 99 NONAME
- _Z8qstricmpPKcS0_ @ 100 NONAME
- _Z8qstrncpyPcPKcj @ 101 NONAME
- _Z8qstrtollPKcPS0_iPb @ 102 NONAME ABSENT
- _Z8showbaseR11QTextStream @ 103 NONAME
- _Z9forcesignR11QTextStream @ 104 NONAME
- _Z9qBadAllocv @ 105 NONAME
- _Z9qChecksumPKcj @ 106 NONAME
- _Z9qCompressPKhii @ 107 NONAME
- _Z9qCriticalPKcz @ 108 NONAME
- _Z9qIsFinited @ 109 NONAME
- _Z9qIsFinitef @ 110 NONAME
- _Z9qsnprintfPcjPKcz @ 111 NONAME
- _Z9qstrnicmpPKcS0_j @ 112 NONAME
- _Z9qt_assertPKcS0_i @ 113 NONAME
- _ZN10QByteArray10fromBase64ERKS_ @ 114 NONAME
- _ZN10QByteArray11fromRawDataEPKci @ 115 NONAME
- _ZN10QByteArray11shared_nullE @ 116 NONAME DATA 20
- _ZN10QByteArray12shared_emptyE @ 117 NONAME DATA 20
- _ZN10QByteArray19fromPercentEncodingERKS_c @ 118 NONAME
- _ZN10QByteArray4chopEi @ 119 NONAME
- _ZN10QByteArray4fillEci @ 120 NONAME
- _ZN10QByteArray5clearEv @ 121 NONAME
- _ZN10QByteArray6appendEPKc @ 122 NONAME
- _ZN10QByteArray6appendEPKci @ 123 NONAME
- _ZN10QByteArray6appendERKS_ @ 124 NONAME
- _ZN10QByteArray6appendEc @ 125 NONAME
- _ZN10QByteArray6expandEi @ 126 NONAME
- _ZN10QByteArray6insertEiPKc @ 127 NONAME
- _ZN10QByteArray6insertEiRKS_ @ 128 NONAME
- _ZN10QByteArray6insertEic @ 129 NONAME
- _ZN10QByteArray6numberEdci @ 130 NONAME
- _ZN10QByteArray6numberEii @ 131 NONAME
- _ZN10QByteArray6numberEji @ 132 NONAME
- _ZN10QByteArray6numberExi @ 133 NONAME
- _ZN10QByteArray6numberEyi @ 134 NONAME
- _ZN10QByteArray6removeEii @ 135 NONAME
- _ZN10QByteArray6resizeEi @ 136 NONAME
- _ZN10QByteArray6setNumEdci @ 137 NONAME
- _ZN10QByteArray6setNumExi @ 138 NONAME
- _ZN10QByteArray6setNumEyi @ 139 NONAME
- _ZN10QByteArray7fromHexERKS_ @ 140 NONAME
- _ZN10QByteArray7prependEPKc @ 141 NONAME
- _ZN10QByteArray7prependERKS_ @ 142 NONAME
- _ZN10QByteArray7prependEc @ 143 NONAME
- _ZN10QByteArray7reallocEi @ 144 NONAME
- _ZN10QByteArray7replaceEPKcRKS_ @ 145 NONAME
- _ZN10QByteArray7replaceEPKciS1_i @ 146 NONAME
- _ZN10QByteArray7replaceERKS_S1_ @ 147 NONAME
- _ZN10QByteArray7replaceEcRKS_ @ 148 NONAME
- _ZN10QByteArray7replaceEcc @ 149 NONAME
- _ZN10QByteArray7replaceEiiPKc @ 150 NONAME
- _ZN10QByteArray7replaceEiiRKS_ @ 151 NONAME
- _ZN10QByteArray8truncateEi @ 152 NONAME
- _ZN10QByteArrayC1EPKc @ 153 NONAME
- _ZN10QByteArrayC1EPKci @ 154 NONAME
- _ZN10QByteArrayC1Eic @ 155 NONAME
- _ZN10QByteArrayC2EPKc @ 156 NONAME
- _ZN10QByteArrayC2EPKci @ 157 NONAME
- _ZN10QByteArrayC2Eic @ 158 NONAME
- _ZN10QByteArrayaSEPKc @ 159 NONAME
- _ZN10QByteArrayaSERKS_ @ 160 NONAME
- _ZN10QEventLoop11qt_metacallEN11QMetaObject4CallEiPPv @ 161 NONAME
- _ZN10QEventLoop11qt_metacastEPKc @ 162 NONAME
- _ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE @ 163 NONAME
- _ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEEi @ 164 NONAME
- _ZN10QEventLoop16staticMetaObjectE @ 165 NONAME DATA 16
- _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE @ 166 NONAME
- _ZN10QEventLoop4exitEi @ 167 NONAME
- _ZN10QEventLoop4quitEv @ 168 NONAME
- _ZN10QEventLoop6wakeUpEv @ 169 NONAME
- _ZN10QEventLoopC1EP7QObject @ 170 NONAME
- _ZN10QEventLoopC2EP7QObject @ 171 NONAME
- _ZN10QEventLoopD0Ev @ 172 NONAME
- _ZN10QEventLoopD1Ev @ 173 NONAME
- _ZN10QEventLoopD2Ev @ 174 NONAME
- _ZN10QMutexPool17globalInstanceGetEPKv @ 175 NONAME
- _ZN10QMutexPool3getEPKv @ 176 NONAME
- _ZN10QMutexPool8instanceEv @ 177 NONAME
- _ZN10QMutexPoolC1Ebi @ 178 NONAME ABSENT
- _ZN10QMutexPoolC2Ebi @ 179 NONAME ABSENT
- _ZN10QMutexPoolD1Ev @ 180 NONAME
- _ZN10QMutexPoolD2Ev @ 181 NONAME
- _ZN10QSemaphore10tryAcquireEi @ 182 NONAME
- _ZN10QSemaphore10tryAcquireEii @ 183 NONAME
- _ZN10QSemaphore7acquireEi @ 184 NONAME
- _ZN10QSemaphore7releaseEi @ 185 NONAME
- _ZN10QSemaphoreC1Ei @ 186 NONAME
- _ZN10QSemaphoreC2Ei @ 187 NONAME
- _ZN10QSemaphoreD1Ev @ 188 NONAME
- _ZN10QSemaphoreD2Ev @ 189 NONAME
- _ZN10QTextCodec11codecForMibEi @ 190 NONAME
- _ZN10QTextCodec12codecForHtmlERK10QByteArray @ 191 NONAME
- _ZN10QTextCodec12codecForHtmlERK10QByteArrayPS_ @ 192 NONAME
- _ZN10QTextCodec12codecForNameERK10QByteArray @ 193 NONAME
- _ZN10QTextCodec13availableMibsEv @ 194 NONAME
- _ZN10QTextCodec14ConverterStateD1Ev @ 195 NONAME
- _ZN10QTextCodec14ConverterStateD2Ev @ 196 NONAME
- _ZN10QTextCodec14codecForLocaleEv @ 197 NONAME
- _ZN10QTextCodec15availableCodecsEv @ 198 NONAME
- _ZN10QTextCodec17setCodecForLocaleEPS_ @ 199 NONAME
- _ZN10QTextCodec4cftrE @ 200 NONAME DATA 4
- _ZN10QTextCodecC2Ev @ 201 NONAME
- _ZN10QTextCodecD0Ev @ 202 NONAME
- _ZN10QTextCodecD1Ev @ 203 NONAME
- _ZN10QTextCodecD2Ev @ 204 NONAME
- _ZN11QBasicTimer4stopEv @ 205 NONAME
- _ZN11QBasicTimer5startEiP7QObject @ 206 NONAME
- _ZN11QChildEventC1EN6QEvent4TypeEP7QObject @ 207 NONAME
- _ZN11QChildEventC2EN6QEvent4TypeEP7QObject @ 208 NONAME
- _ZN11QChildEventD0Ev @ 209 NONAME
- _ZN11QChildEventD1Ev @ 210 NONAME
- _ZN11QChildEventD2Ev @ 211 NONAME
- _ZN11QDataStream10writeBytesEPKcj @ 212 NONAME
- _ZN11QDataStream11readRawDataEPci @ 213 NONAME
- _ZN11QDataStream11resetStatusEv @ 214 NONAME
- _ZN11QDataStream11skipRawDataEi @ 215 NONAME
- _ZN11QDataStream11unsetDeviceEv @ 216 NONAME
- _ZN11QDataStream12setByteOrderENS_9ByteOrderE @ 217 NONAME
- _ZN11QDataStream12writeRawDataEPKci @ 218 NONAME
- _ZN11QDataStream9readBytesERPcRj @ 219 NONAME
- _ZN11QDataStream9setDeviceEP9QIODevice @ 220 NONAME
- _ZN11QDataStream9setStatusENS_6StatusE @ 221 NONAME
- _ZN11QDataStreamC1EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 222 NONAME
- _ZN11QDataStreamC1EP9QIODevice @ 223 NONAME
- _ZN11QDataStreamC1ERK10QByteArray @ 224 NONAME
- _ZN11QDataStreamC1Ev @ 225 NONAME
- _ZN11QDataStreamC2EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 226 NONAME
- _ZN11QDataStreamC2EP9QIODevice @ 227 NONAME
- _ZN11QDataStreamC2ERK10QByteArray @ 228 NONAME
- _ZN11QDataStreamC2Ev @ 229 NONAME
- _ZN11QDataStreamD0Ev @ 230 NONAME
- _ZN11QDataStreamD1Ev @ 231 NONAME
- _ZN11QDataStreamD2Ev @ 232 NONAME
- _ZN11QDataStreamlsEPKc @ 233 NONAME
- _ZN11QDataStreamlsEa @ 234 NONAME
- _ZN11QDataStreamlsEb @ 235 NONAME
- _ZN11QDataStreamlsEd @ 236 NONAME
- _ZN11QDataStreamlsEf @ 237 NONAME
- _ZN11QDataStreamlsEi @ 238 NONAME
- _ZN11QDataStreamlsEs @ 239 NONAME
- _ZN11QDataStreamlsEx @ 240 NONAME
- _ZN11QDataStreamrsERPc @ 241 NONAME
- _ZN11QDataStreamrsERa @ 242 NONAME
- _ZN11QDataStreamrsERb @ 243 NONAME
- _ZN11QDataStreamrsERd @ 244 NONAME
- _ZN11QDataStreamrsERf @ 245 NONAME
- _ZN11QDataStreamrsERi @ 246 NONAME
- _ZN11QDataStreamrsERs @ 247 NONAME
- _ZN11QDataStreamrsERx @ 248 NONAME
- _ZN11QMetaObject10disconnectEPK7QObjectiS2_i @ 249 NONAME
- _ZN11QMetaObject11changeGuardEPP7QObjectS1_ @ 250 NONAME
- _ZN11QMetaObject11removeGuardEPP7QObject @ 251 NONAME
- _ZN11QMetaObject12invokeMethodEP7QObjectPKcN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS7_S7_S7_S7_S7_S7_S7_S7_S7_ @ 252 NONAME
- _ZN11QMetaObject14normalizedTypeEPKc @ 253 NONAME
- _ZN11QMetaObject16checkConnectArgsEPKcS1_ @ 254 NONAME
- _ZN11QMetaObject18connectSlotsByNameEP7QObject @ 255 NONAME
- _ZN11QMetaObject19normalizedSignatureEPKc @ 256 NONAME
- _ZN11QMetaObject7connectEPK7QObjectiS2_iiPi @ 257 NONAME
- _ZN11QMetaObject8activateEP7QObjectPKS_iPPv @ 258 NONAME
- _ZN11QMetaObject8activateEP7QObjectPKS_iiPPv @ 259 NONAME
- _ZN11QMetaObject8activateEP7QObjectiPPv @ 260 NONAME
- _ZN11QMetaObject8activateEP7QObjectiiPPv @ 261 NONAME
- _ZN11QMetaObject8addGuardEPP7QObject @ 262 NONAME
- _ZN11QTextStream10setPadCharE5QChar @ 263 NONAME
- _ZN11QTextStream11resetStatusEv @ 264 NONAME
- _ZN11QTextStream13setFieldWidthEi @ 265 NONAME
- _ZN11QTextStream14setIntegerBaseEi @ 266 NONAME
- _ZN11QTextStream14setNumberFlagsE6QFlagsINS_10NumberFlagEE @ 267 NONAME
- _ZN11QTextStream14skipWhiteSpaceEv @ 268 NONAME
- _ZN11QTextStream17setFieldAlignmentENS_14FieldAlignmentE @ 269 NONAME
- _ZN11QTextStream20setAutoDetectUnicodeEb @ 270 NONAME
- _ZN11QTextStream21setRealNumberNotationENS_18RealNumberNotationE @ 271 NONAME
- _ZN11QTextStream22setRealNumberPrecisionEi @ 272 NONAME
- _ZN11QTextStream24setGenerateByteOrderMarkEb @ 273 NONAME
- _ZN11QTextStream4readEx @ 274 NONAME
- _ZN11QTextStream4seekEx @ 275 NONAME
- _ZN11QTextStream5flushEv @ 276 NONAME
- _ZN11QTextStream5resetEv @ 277 NONAME
- _ZN11QTextStream7readAllEv @ 278 NONAME
- _ZN11QTextStream8readLineEx @ 279 NONAME
- _ZN11QTextStream8setCodecEP10QTextCodec @ 280 NONAME
- _ZN11QTextStream8setCodecEPKc @ 281 NONAME
- _ZN11QTextStream9setDeviceEP9QIODevice @ 282 NONAME
- _ZN11QTextStream9setLocaleERK7QLocale @ 283 NONAME
- _ZN11QTextStream9setStatusENS_6StatusE @ 284 NONAME
- _ZN11QTextStream9setStringEP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 285 NONAME
- _ZN11QTextStreamC1EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 286 NONAME
- _ZN11QTextStreamC1EP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 287 NONAME
- _ZN11QTextStreamC1EP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 288 NONAME
- _ZN11QTextStreamC1EP9QIODevice @ 289 NONAME
- _ZN11QTextStreamC1ERK10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 290 NONAME
- _ZN11QTextStreamC1Ev @ 291 NONAME
- _ZN11QTextStreamC2EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 292 NONAME
- _ZN11QTextStreamC2EP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 293 NONAME
- _ZN11QTextStreamC2EP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 294 NONAME
- _ZN11QTextStreamC2EP9QIODevice @ 295 NONAME
- _ZN11QTextStreamC2ERK10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 296 NONAME
- _ZN11QTextStreamC2Ev @ 297 NONAME
- _ZN11QTextStreamD0Ev @ 298 NONAME
- _ZN11QTextStreamD1Ev @ 299 NONAME
- _ZN11QTextStreamD2Ev @ 300 NONAME
- _ZN11QTextStreamlsE5QBool @ 301 NONAME
- _ZN11QTextStreamlsE5QChar @ 302 NONAME
- _ZN11QTextStreamlsEPKc @ 303 NONAME
- _ZN11QTextStreamlsEPKv @ 304 NONAME
- _ZN11QTextStreamlsERK10QByteArray @ 305 NONAME
- _ZN11QTextStreamlsERK7QString @ 306 NONAME
- _ZN11QTextStreamlsEc @ 307 NONAME
- _ZN11QTextStreamlsEd @ 308 NONAME
- _ZN11QTextStreamlsEf @ 309 NONAME
- _ZN11QTextStreamlsEi @ 310 NONAME
- _ZN11QTextStreamlsEj @ 311 NONAME
- _ZN11QTextStreamlsEl @ 312 NONAME
- _ZN11QTextStreamlsEm @ 313 NONAME
- _ZN11QTextStreamlsEs @ 314 NONAME
- _ZN11QTextStreamlsEt @ 315 NONAME
- _ZN11QTextStreamlsEx @ 316 NONAME
- _ZN11QTextStreamlsEy @ 317 NONAME
- _ZN11QTextStreamrsEPc @ 318 NONAME
- _ZN11QTextStreamrsER10QByteArray @ 319 NONAME
- _ZN11QTextStreamrsER5QChar @ 320 NONAME
- _ZN11QTextStreamrsER7QString @ 321 NONAME
- _ZN11QTextStreamrsERc @ 322 NONAME
- _ZN11QTextStreamrsERd @ 323 NONAME
- _ZN11QTextStreamrsERf @ 324 NONAME
- _ZN11QTextStreamrsERi @ 325 NONAME
- _ZN11QTextStreamrsERj @ 326 NONAME
- _ZN11QTextStreamrsERl @ 327 NONAME
- _ZN11QTextStreamrsERm @ 328 NONAME
- _ZN11QTextStreamrsERs @ 329 NONAME
- _ZN11QTextStreamrsERt @ 330 NONAME
- _ZN11QTextStreamrsERx @ 331 NONAME
- _ZN11QTextStreamrsERy @ 332 NONAME
- _ZN11QThreadData3refEv @ 333 NONAME ABSENT
- _ZN11QThreadData4get2EP7QThread @ 334 NONAME ABSENT
- _ZN11QThreadData5derefEv @ 335 NONAME ABSENT
- _ZN11QThreadData7currentEv @ 336 NONAME ABSENT
- _ZN11QThreadDataC1Ei @ 337 NONAME ABSENT
- _ZN11QThreadDataC2Ei @ 338 NONAME ABSENT
- _ZN11QThreadDataD1Ev @ 339 NONAME ABSENT
- _ZN11QThreadDataD2Ev @ 340 NONAME ABSENT
- _ZN11QThreadPool11qt_metacallEN11QMetaObject4CallEiPPv @ 341 NONAME
- _ZN11QThreadPool11qt_metacastEPKc @ 342 NONAME
- _ZN11QThreadPool11waitForDoneEv @ 343 NONAME
- _ZN11QThreadPool13releaseThreadEv @ 344 NONAME
- _ZN11QThreadPool13reserveThreadEv @ 345 NONAME
- _ZN11QThreadPool14globalInstanceEv @ 346 NONAME
- _ZN11QThreadPool16setExpiryTimeoutEi @ 347 NONAME
- _ZN11QThreadPool16staticMetaObjectE @ 348 NONAME DATA 16
- _ZN11QThreadPool17setMaxThreadCountEi @ 349 NONAME
- _ZN11QThreadPool5startEP9QRunnablei @ 350 NONAME
- _ZN11QThreadPool8tryStartEP9QRunnable @ 351 NONAME
- _ZN11QThreadPoolC1EP7QObject @ 352 NONAME
- _ZN11QThreadPoolC2EP7QObject @ 353 NONAME
- _ZN11QThreadPoolD0Ev @ 354 NONAME
- _ZN11QThreadPoolD1Ev @ 355 NONAME
- _ZN11QThreadPoolD2Ev @ 356 NONAME
- _ZN11QTimerEventC1Ei @ 357 NONAME
- _ZN11QTimerEventC2Ei @ 358 NONAME
- _ZN11QTimerEventD0Ev @ 359 NONAME
- _ZN11QTimerEventD1Ev @ 360 NONAME
- _ZN11QTimerEventD2Ev @ 361 NONAME
- _ZN11QTranslator11qt_metacallEN11QMetaObject4CallEiPPv @ 362 NONAME
- _ZN11QTranslator11qt_metacastEPKc @ 363 NONAME
- _ZN11QTranslator16staticMetaObjectE @ 364 NONAME DATA 16
- _ZN11QTranslator4loadEPKhi @ 365 NONAME
- _ZN11QTranslator4loadERK7QStringS2_S2_S2_ @ 366 NONAME
- _ZN11QTranslatorC1EP7QObject @ 367 NONAME
- _ZN11QTranslatorC2EP7QObject @ 368 NONAME
- _ZN11QTranslatorD0Ev @ 369 NONAME
- _ZN11QTranslatorD1Ev @ 370 NONAME
- _ZN11QTranslatorD2Ev @ 371 NONAME
- _ZN11QTsciiCodecD0Ev @ 372 NONAME ABSENT
- _ZN11QTsciiCodecD1Ev @ 373 NONAME ABSENT
- _ZN11QTsciiCodecD2Ev @ 374 NONAME ABSENT
- _ZN11QVectorData11shared_nullE @ 375 NONAME DATA 16
- _ZN11QVectorData4growEiiib @ 376 NONAME
- _ZN11QVectorData6mallocEiiiPS_ @ 377 NONAME
- _ZN12QDirIterator4nextEv @ 378 NONAME
- _ZN12QDirIteratorC1ERK4QDir6QFlagsINS_12IteratorFlagEE @ 379 NONAME
- _ZN12QDirIteratorC1ERK7QString6QFlagsIN4QDir6FilterEES3_INS_12IteratorFlagEE @ 380 NONAME
- _ZN12QDirIteratorC1ERK7QString6QFlagsINS_12IteratorFlagEE @ 381 NONAME
- _ZN12QDirIteratorC1ERK7QStringRK11QStringList6QFlagsIN4QDir6FilterEES6_INS_12IteratorFlagEE @ 382 NONAME
- _ZN12QDirIteratorC2ERK4QDir6QFlagsINS_12IteratorFlagEE @ 383 NONAME
- _ZN12QDirIteratorC2ERK7QString6QFlagsIN4QDir6FilterEES3_INS_12IteratorFlagEE @ 384 NONAME
- _ZN12QDirIteratorC2ERK7QString6QFlagsINS_12IteratorFlagEE @ 385 NONAME
- _ZN12QDirIteratorC2ERK7QStringRK11QStringList6QFlagsIN4QDir6FilterEES6_INS_12IteratorFlagEE @ 386 NONAME
- _ZN12QDirIteratorD0Ev @ 387 NONAME
- _ZN12QDirIteratorD1Ev @ 388 NONAME
- _ZN12QDirIteratorD2Ev @ 389 NONAME
- _ZN12QLibraryInfo16licensedProductsEv @ 390 NONAME
- _ZN12QLibraryInfo8buildKeyEv @ 391 NONAME
- _ZN12QLibraryInfo8licenseeEv @ 392 NONAME
- _ZN12QLibraryInfo8locationENS_15LibraryLocationE @ 393 NONAME
- _ZN12QLibraryInfoC1Ev @ 394 NONAME
- _ZN12QLibraryInfoC2Ev @ 395 NONAME
- _ZN12QTextDecoder9toUnicodeEP7QStringPKci @ 396 NONAME
- _ZN12QTextDecoder9toUnicodeEPKci @ 397 NONAME
- _ZN12QTextDecoder9toUnicodeERK10QByteArray @ 398 NONAME
- _ZN12QTextDecoderD1Ev @ 399 NONAME
- _ZN12QTextDecoderD2Ev @ 400 NONAME
- _ZN12QTextEncoder11fromUnicodeEPK5QChari @ 401 NONAME
- _ZN12QTextEncoder11fromUnicodeERK7QString @ 402 NONAME
- _ZN12QTextEncoderD1Ev @ 403 NONAME
- _ZN12QTextEncoderD2Ev @ 404 NONAME
- _ZN13QFSFileEngine11currentPathERK7QString @ 405 NONAME
- _ZN13QFSFileEngine11setFileNameERK7QString @ 406 NONAME
- _ZN13QFSFileEngine12endEntryListEv @ 407 NONAME
- _ZN13QFSFileEngine14beginEntryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 408 NONAME
- _ZN13QFSFileEngine14setCurrentPathERK7QString @ 409 NONAME
- _ZN13QFSFileEngine14setPermissionsEj @ 410 NONAME
- _ZN13QFSFileEngine4copyERK7QString @ 411 NONAME
- _ZN13QFSFileEngine4linkERK7QString @ 412 NONAME
- _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 413 NONAME
- _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEP7__sFILE @ 414 NONAME
- _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEi @ 415 NONAME
- _ZN13QFSFileEngine4readEPcx @ 416 NONAME
- _ZN13QFSFileEngine4seekEx @ 417 NONAME
- _ZN13QFSFileEngine5closeEv @ 418 NONAME
- _ZN13QFSFileEngine5flushEv @ 419 NONAME
- _ZN13QFSFileEngine5writeEPKcx @ 420 NONAME
- _ZN13QFSFileEngine6drivesEv @ 421 NONAME
- _ZN13QFSFileEngine6removeEv @ 422 NONAME
- _ZN13QFSFileEngine6renameERK7QString @ 423 NONAME
- _ZN13QFSFileEngine7setSizeEx @ 424 NONAME
- _ZN13QFSFileEngine8homePathEv @ 425 NONAME
- _ZN13QFSFileEngine8readLineEPcx @ 426 NONAME
- _ZN13QFSFileEngine8rootPathEv @ 427 NONAME
- _ZN13QFSFileEngine8tempPathEv @ 428 NONAME
- _ZN13QFSFileEngine9extensionEN19QAbstractFileEngine9ExtensionEPKNS0_15ExtensionOptionEPNS0_15ExtensionReturnE @ 429 NONAME
- _ZN13QFSFileEngineC1ER20QFSFileEnginePrivate @ 430 NONAME
- _ZN13QFSFileEngineC1ERK7QString @ 431 NONAME
- _ZN13QFSFileEngineC1Ev @ 432 NONAME
- _ZN13QFSFileEngineC2ER20QFSFileEnginePrivate @ 433 NONAME
- _ZN13QFSFileEngineC2ERK7QString @ 434 NONAME
- _ZN13QFSFileEngineC2Ev @ 435 NONAME
- _ZN13QFSFileEngineD0Ev @ 436 NONAME
- _ZN13QFSFileEngineD1Ev @ 437 NONAME
- _ZN13QFSFileEngineD2Ev @ 438 NONAME
- _ZN13QFontLaoCodecD0Ev @ 439 NONAME
- _ZN13QFontLaoCodecD1Ev @ 440 NONAME
- _ZN13QFontLaoCodecD2Ev @ 441 NONAME
- _ZN13QMetaPropertyC1Ev @ 442 NONAME
- _ZN13QMetaPropertyC2Ev @ 443 NONAME
- _ZN13QPluginLoader11qt_metacallEN11QMetaObject4CallEiPPv @ 444 NONAME
- _ZN13QPluginLoader11qt_metacastEPKc @ 445 NONAME
- _ZN13QPluginLoader11setFileNameERK7QString @ 446 NONAME
- _ZN13QPluginLoader12setLoadHintsE6QFlagsIN8QLibrary8LoadHintEE @ 447 NONAME
- _ZN13QPluginLoader15staticInstancesEv @ 448 NONAME
- _ZN13QPluginLoader16staticMetaObjectE @ 449 NONAME DATA 16
- _ZN13QPluginLoader4loadEv @ 450 NONAME
- _ZN13QPluginLoader6unloadEv @ 451 NONAME
- _ZN13QPluginLoader8instanceEv @ 452 NONAME
- _ZN13QPluginLoaderC1EP7QObject @ 453 NONAME
- _ZN13QPluginLoaderC1ERK7QStringP7QObject @ 454 NONAME
- _ZN13QPluginLoaderC2EP7QObject @ 455 NONAME
- _ZN13QPluginLoaderC2ERK7QStringP7QObject @ 456 NONAME
- _ZN13QPluginLoaderD0Ev @ 457 NONAME
- _ZN13QPluginLoaderD1Ev @ 458 NONAME
- _ZN13QPluginLoaderD2Ev @ 459 NONAME
- _ZN13QSharedMemory11qt_metacallEN11QMetaObject4CallEiPPv @ 460 NONAME
- _ZN13QSharedMemory11qt_metacastEPKc @ 461 NONAME
- _ZN13QSharedMemory16staticMetaObjectE @ 462 NONAME DATA 16
- _ZN13QSharedMemory4dataEv @ 463 NONAME
- _ZN13QSharedMemory4lockEv @ 464 NONAME
- _ZN13QSharedMemory6attachENS_10AccessModeE @ 465 NONAME
- _ZN13QSharedMemory6createEiNS_10AccessModeE @ 466 NONAME
- _ZN13QSharedMemory6detachEv @ 467 NONAME
- _ZN13QSharedMemory6setKeyERK7QString @ 468 NONAME
- _ZN13QSharedMemory6unlockEv @ 469 NONAME
- _ZN13QSharedMemoryC1EP7QObject @ 470 NONAME
- _ZN13QSharedMemoryC1ERK7QStringP7QObject @ 471 NONAME
- _ZN13QSharedMemoryC2EP7QObject @ 472 NONAME
- _ZN13QSharedMemoryC2ERK7QStringP7QObject @ 473 NONAME
- _ZN13QSharedMemoryD0Ev @ 474 NONAME
- _ZN13QSharedMemoryD1Ev @ 475 NONAME
- _ZN13QSharedMemoryD2Ev @ 476 NONAME
- _ZN13QSignalMapper10setMappingEP7QObjectP7QWidget @ 477 NONAME
- _ZN13QSignalMapper10setMappingEP7QObjectRK7QString @ 478 NONAME
- _ZN13QSignalMapper10setMappingEP7QObjectS1_ @ 479 NONAME
- _ZN13QSignalMapper10setMappingEP7QObjecti @ 480 NONAME
- _ZN13QSignalMapper11qt_metacallEN11QMetaObject4CallEiPPv @ 481 NONAME
- _ZN13QSignalMapper11qt_metacastEPKc @ 482 NONAME
- _ZN13QSignalMapper14removeMappingsEP7QObject @ 483 NONAME
- _ZN13QSignalMapper16staticMetaObjectE @ 484 NONAME DATA 16
- _ZN13QSignalMapper3mapEP7QObject @ 485 NONAME
- _ZN13QSignalMapper3mapEv @ 486 NONAME
- _ZN13QSignalMapper6mappedEP7QObject @ 487 NONAME
- _ZN13QSignalMapper6mappedEP7QWidget @ 488 NONAME
- _ZN13QSignalMapper6mappedERK7QString @ 489 NONAME
- _ZN13QSignalMapper6mappedEi @ 490 NONAME
- _ZN13QSignalMapperC1EP7QObject @ 491 NONAME
- _ZN13QSignalMapperC2EP7QObject @ 492 NONAME
- _ZN13QSignalMapperD0Ev @ 493 NONAME
- _ZN13QSignalMapperD1Ev @ 494 NONAME
- _ZN13QSignalMapperD2Ev @ 495 NONAME
- _ZN13QSystemLocaleC1Eb @ 496 NONAME
- _ZN13QSystemLocaleC1Ev @ 497 NONAME
- _ZN13QSystemLocaleC2Eb @ 498 NONAME
- _ZN13QSystemLocaleC2Ev @ 499 NONAME
- _ZN13QSystemLocaleD0Ev @ 500 NONAME
- _ZN13QSystemLocaleD1Ev @ 501 NONAME
- _ZN13QSystemLocaleD2Ev @ 502 NONAME
- _ZN14QFactoryLoader10refreshAllEv @ 503 NONAME
- _ZN14QFactoryLoader11qt_metacallEN11QMetaObject4CallEiPPv @ 504 NONAME
- _ZN14QFactoryLoader11qt_metacastEPKc @ 505 NONAME
- _ZN14QFactoryLoader16staticMetaObjectE @ 506 NONAME DATA 16
- _ZN14QFactoryLoader6updateEv @ 507 NONAME
- _ZN14QFactoryLoaderC1EPKcRK7QStringN2Qt15CaseSensitivityE @ 508 NONAME
- _ZN14QFactoryLoaderC2EPKcRK7QStringN2Qt15CaseSensitivityE @ 509 NONAME
- _ZN14QFactoryLoaderD0Ev @ 510 NONAME
- _ZN14QFactoryLoaderD1Ev @ 511 NONAME
- _ZN14QFactoryLoaderD2Ev @ 512 NONAME
- _ZN14QLocalePrivate17bytearrayToDoubleEPKcPbS2_ @ 513 NONAME
- _ZN14QLocalePrivate19bytearrayToLongLongEPKciPbS2_ @ 514 NONAME
- _ZN14QLocalePrivate19updateSystemPrivateEv @ 515 NONAME
- _ZN14QLocalePrivate22bytearrayToUnsLongLongEPKciPb @ 516 NONAME
- _ZN14QMetaCallEvent13placeMetaCallEP7QObject @ 517 NONAME
- _ZN14QMetaCallEventC1EiPK7QObjectiiPiPPvP10QSemaphore @ 518 NONAME
- _ZN14QMetaCallEventC2EiPK7QObjectiiPiPPvP10QSemaphore @ 519 NONAME
- _ZN14QMetaCallEventD0Ev @ 520 NONAME
- _ZN14QMetaCallEventD1Ev @ 521 NONAME
- _ZN14QMetaCallEventD2Ev @ 522 NONAME
- _ZN14QObjectPrivate11clearGuardsEP7QObject @ 523 NONAME
- _ZN14QObjectPrivate11derefSenderEP7QObjecti @ 524 NONAME ABSENT
- _ZN14QObjectPrivate13addConnectionEiPNS_10ConnectionE @ 525 NONAME
- _ZN14QObjectPrivate14deleteChildrenEv @ 526 NONAME
- _ZN14QObjectPrivate14removeReceiverEiP7QObject @ 527 NONAME ABSENT
- _ZN14QObjectPrivate14setDeleteWatchEPS_Pi @ 528 NONAME
- _ZN14QObjectPrivate16resetDeleteWatchEPS_Pii @ 529 NONAME
- _ZN14QObjectPrivate16setCurrentSenderEP7QObjectPNS_6SenderE @ 530 NONAME
- _ZN14QObjectPrivate16setParent_helperEP7QObject @ 531 NONAME
- _ZN14QObjectPrivate18resetCurrentSenderEP7QObjectPNS_6SenderES3_ @ 532 NONAME
- _ZN14QObjectPrivate19_q_reregisterTimersEPv @ 533 NONAME
- _ZN14QObjectPrivate19moveToThread_helperEv @ 534 NONAME
- _ZN14QObjectPrivate20cleanConnectionListsEv @ 535 NONAME
- _ZN14QObjectPrivate20setThreadData_helperEP11QThreadDataS1_ @ 536 NONAME
- _ZN14QObjectPrivate9refSenderEP7QObjecti @ 537 NONAME ABSENT
- _ZN14QObjectPrivateC1Ei @ 538 NONAME
- _ZN14QObjectPrivateC2Ei @ 539 NONAME
- _ZN14QObjectPrivateD0Ev @ 540 NONAME
- _ZN14QObjectPrivateD1Ev @ 541 NONAME
- _ZN14QObjectPrivateD2Ev @ 542 NONAME
- _ZN14QReadWriteLock11lockForReadEv @ 543 NONAME
- _ZN14QReadWriteLock12lockForWriteEv @ 544 NONAME
- _ZN14QReadWriteLock14tryLockForReadEi @ 545 NONAME
- _ZN14QReadWriteLock14tryLockForReadEv @ 546 NONAME
- _ZN14QReadWriteLock15tryLockForWriteEi @ 547 NONAME
- _ZN14QReadWriteLock15tryLockForWriteEv @ 548 NONAME
- _ZN14QReadWriteLock6unlockEv @ 549 NONAME
- _ZN14QReadWriteLockC1ENS_13RecursionModeE @ 550 NONAME
- _ZN14QReadWriteLockC1Ev @ 551 NONAME
- _ZN14QReadWriteLockC2ENS_13RecursionModeE @ 552 NONAME
- _ZN14QReadWriteLockC2Ev @ 553 NONAME
- _ZN14QReadWriteLockD1Ev @ 554 NONAME
- _ZN14QReadWriteLockD2Ev @ 555 NONAME
- _ZN14QStringMatcher10setPatternERK7QString @ 556 NONAME
- _ZN14QStringMatcher18setCaseSensitivityEN2Qt15CaseSensitivityE @ 557 NONAME
- _ZN14QStringMatcherC1EPK5QChariN2Qt15CaseSensitivityE @ 558 NONAME
- _ZN14QStringMatcherC1ERK7QStringN2Qt15CaseSensitivityE @ 559 NONAME
- _ZN14QStringMatcherC1ERKS_ @ 560 NONAME
- _ZN14QStringMatcherC1Ev @ 561 NONAME
- _ZN14QStringMatcherC2EPK5QChariN2Qt15CaseSensitivityE @ 562 NONAME
- _ZN14QStringMatcherC2ERK7QStringN2Qt15CaseSensitivityE @ 563 NONAME
- _ZN14QStringMatcherC2ERKS_ @ 564 NONAME
- _ZN14QStringMatcherC2Ev @ 565 NONAME
- _ZN14QStringMatcherD1Ev @ 566 NONAME
- _ZN14QStringMatcherD2Ev @ 567 NONAME
- _ZN14QStringMatcheraSERKS_ @ 568 NONAME
- _ZN14QTemporaryFile11qt_metacallEN11QMetaObject4CallEiPPv @ 569 NONAME
- _ZN14QTemporaryFile11qt_metacastEPKc @ 570 NONAME
- _ZN14QTemporaryFile13setAutoRemoveEb @ 571 NONAME
- _ZN14QTemporaryFile15createLocalFileER5QFile @ 572 NONAME
- _ZN14QTemporaryFile15setFileTemplateERK7QString @ 573 NONAME
- _ZN14QTemporaryFile16staticMetaObjectE @ 574 NONAME DATA 16
- _ZN14QTemporaryFile4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 575 NONAME
- _ZN14QTemporaryFileC1EP7QObject @ 576 NONAME
- _ZN14QTemporaryFileC1ERK7QString @ 577 NONAME
- _ZN14QTemporaryFileC1ERK7QStringP7QObject @ 578 NONAME
- _ZN14QTemporaryFileC1Ev @ 579 NONAME
- _ZN14QTemporaryFileC2EP7QObject @ 580 NONAME
- _ZN14QTemporaryFileC2ERK7QString @ 581 NONAME
- _ZN14QTemporaryFileC2ERK7QStringP7QObject @ 582 NONAME
- _ZN14QTemporaryFileC2Ev @ 583 NONAME
- _ZN14QTemporaryFileD0Ev @ 584 NONAME
- _ZN14QTemporaryFileD1Ev @ 585 NONAME
- _ZN14QTemporaryFileD2Ev @ 586 NONAME
- _ZN14QUnicodeTables10propertiesEj @ 587 NONAME
- _ZN14QUnicodeTables10propertiesEt @ 588 NONAME
- _ZN14QUnicodeTables14lineBreakClassEj @ 589 NONAME
- _ZN14QUnicodeTables6scriptEj @ 590 NONAME
- _ZN14QWaitCondition4waitEP14QReadWriteLockm @ 591 NONAME
- _ZN14QWaitCondition4waitEP6QMutexm @ 592 NONAME
- _ZN14QWaitCondition7wakeAllEv @ 593 NONAME
- _ZN14QWaitCondition7wakeOneEv @ 594 NONAME
- _ZN14QWaitConditionC1Ev @ 595 NONAME
- _ZN14QWaitConditionC2Ev @ 596 NONAME
- _ZN14QWaitConditionD1Ev @ 597 NONAME
- _ZN14QWaitConditionD2Ev @ 598 NONAME
- _ZN15QBasicAtomicInt20fetchAndStoreOrderedEi @ 599 NONAME
- _ZN15QDateTimeParser11parseFormatERK7QString @ 600 NONAME
- _ZN15QLinkedListData11shared_nullE @ 601 NONAME DATA 20
- _ZN15QObjectUserDataD0Ev @ 602 NONAME
- _ZN15QObjectUserDataD1Ev @ 603 NONAME
- _ZN15QObjectUserDataD2Ev @ 604 NONAME
- _ZN15QSocketNotifier10setEnabledEb @ 605 NONAME
- _ZN15QSocketNotifier11qt_metacallEN11QMetaObject4CallEiPPv @ 606 NONAME
- _ZN15QSocketNotifier11qt_metacastEPKc @ 607 NONAME
- _ZN15QSocketNotifier16staticMetaObjectE @ 608 NONAME DATA 16
- _ZN15QSocketNotifier5eventEP6QEvent @ 609 NONAME
- _ZN15QSocketNotifier9activatedEi @ 610 NONAME
- _ZN15QSocketNotifierC1EiNS_4TypeEP7QObject @ 611 NONAME
- _ZN15QSocketNotifierC2EiNS_4TypeEP7QObject @ 612 NONAME
- _ZN15QSocketNotifierD0Ev @ 613 NONAME
- _ZN15QSocketNotifierD1Ev @ 614 NONAME
- _ZN15QSocketNotifierD2Ev @ 615 NONAME
- _ZN15QtSharedPointer22internalSafetyCheckAddEPVKv @ 616 NONAME
- _ZN15QtSharedPointer25internalSafetyCheckRemoveEPVKv @ 617 NONAME
- _ZN16QCoreApplication10startingUpEv @ 618 NONAME
- _ZN16QCoreApplication10unixSignalEi @ 619 NONAME
- _ZN16QCoreApplication11aboutToQuitEv @ 620 NONAME
- _ZN16QCoreApplication11closingDownEv @ 621 NONAME
- _ZN16QCoreApplication11filterEventEPvPl @ 622 NONAME
- _ZN16QCoreApplication11qt_metacallEN11QMetaObject4CallEiPPv @ 623 NONAME
- _ZN16QCoreApplication11qt_metacastEPKc @ 624 NONAME
- _ZN16QCoreApplication12libraryPathsEv @ 625 NONAME
- _ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb @ 626 NONAME
- _ZN16QCoreApplication13compressEventEP6QEventP7QObjectP14QPostEventList @ 627 NONAME
- _ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 628 NONAME
- _ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEEi @ 629 NONAME
- _ZN16QCoreApplication13testAttributeEN2Qt20ApplicationAttributeE @ 630 NONAME
- _ZN16QCoreApplication14addLibraryPathERK7QString @ 631 NONAME
- _ZN16QCoreApplication14applicationPidEv @ 632 NONAME
- _ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent @ 633 NONAME
- _ZN16QCoreApplication14setEventFilterEPFbPvPlE @ 634 NONAME
- _ZN16QCoreApplication15applicationNameEv @ 635 NONAME
- _ZN16QCoreApplication15setLibraryPathsERK11QStringList @ 636 NONAME
- _ZN16QCoreApplication16hasPendingEventsEv @ 637 NONAME
- _ZN16QCoreApplication16organizationNameEv @ 638 NONAME
- _ZN16QCoreApplication16removeTranslatorEP11QTranslator @ 639 NONAME
- _ZN16QCoreApplication16sendPostedEventsEP7QObjecti @ 640 NONAME
- _ZN16QCoreApplication16staticMetaObjectE @ 641 NONAME DATA 16
- _ZN16QCoreApplication17installTranslatorEP11QTranslator @ 642 NONAME
- _ZN16QCoreApplication17removeLibraryPathERK7QString @ 643 NONAME
- _ZN16QCoreApplication18applicationDirPathEv @ 644 NONAME
- _ZN16QCoreApplication18applicationVersionEv @ 645 NONAME
- _ZN16QCoreApplication18organizationDomainEv @ 646 NONAME
- _ZN16QCoreApplication18removePostedEventsEP7QObject @ 647 NONAME
- _ZN16QCoreApplication18removePostedEventsEP7QObjecti @ 648 NONAME
- _ZN16QCoreApplication18setApplicationNameERK7QString @ 649 NONAME
- _ZN16QCoreApplication19applicationFilePathEv @ 650 NONAME
- _ZN16QCoreApplication19setOrganizationNameERK7QString @ 651 NONAME
- _ZN16QCoreApplication21setApplicationVersionERK7QString @ 652 NONAME
- _ZN16QCoreApplication21setOrganizationDomainERK7QString @ 653 NONAME
- _ZN16QCoreApplication4argcEv @ 654 NONAME
- _ZN16QCoreApplication4argvEv @ 655 NONAME
- _ZN16QCoreApplication4execEv @ 656 NONAME
- _ZN16QCoreApplication4exitEi @ 657 NONAME
- _ZN16QCoreApplication4initEv @ 658 NONAME
- _ZN16QCoreApplication4quitEv @ 659 NONAME
- _ZN16QCoreApplication4selfE @ 660 NONAME DATA 4
- _ZN16QCoreApplication5eventEP6QEvent @ 661 NONAME
- _ZN16QCoreApplication5flushEv @ 662 NONAME
- _ZN16QCoreApplication6notifyEP7QObjectP6QEvent @ 663 NONAME
- _ZN16QCoreApplication9argumentsEv @ 664 NONAME
- _ZN16QCoreApplication9postEventEP7QObjectP6QEvent @ 665 NONAME
- _ZN16QCoreApplication9postEventEP7QObjectP6QEventi @ 666 NONAME
- _ZN16QCoreApplication9translateEPKcS1_S1_NS_8EncodingE @ 667 NONAME
- _ZN16QCoreApplication9translateEPKcS1_S1_NS_8EncodingEi @ 668 NONAME
- _ZN16QCoreApplicationC1ER23QCoreApplicationPrivate @ 669 NONAME
- _ZN16QCoreApplicationC1ERiPPc @ 670 NONAME
- _ZN16QCoreApplicationC2ER23QCoreApplicationPrivate @ 671 NONAME
- _ZN16QCoreApplicationC2ERiPPc @ 672 NONAME
- _ZN16QCoreApplicationD0Ev @ 673 NONAME
- _ZN16QCoreApplicationD1Ev @ 674 NONAME
- _ZN16QCoreApplicationD2Ev @ 675 NONAME
- _ZN16QIODevicePrivate13putCharHelperEc @ 676 NONAME
- _ZN16QIODevicePrivateC1Ev @ 677 NONAME
- _ZN16QIODevicePrivateC2Ev @ 678 NONAME
- _ZN16QIODevicePrivateD0Ev @ 679 NONAME
- _ZN16QIODevicePrivateD1Ev @ 680 NONAME
- _ZN16QIODevicePrivateD2Ev @ 681 NONAME
- _ZN16QSettingsPrivate12processChildE7QStringNS_9ChildSpecER4QMapIS0_S0_E @ 682 NONAME
- _ZN16QSettingsPrivate13iniEscapedKeyERK7QStringR10QByteArray @ 683 NONAME
- _ZN16QSettingsPrivate13normalizedKeyERK7QString @ 684 NONAME
- _ZN16QSettingsPrivate13requestUpdateEv @ 685 NONAME
- _ZN16QSettingsPrivate15iniUnescapedKeyERK10QByteArrayiiR7QString @ 686 NONAME
- _ZN16QSettingsPrivate15stringToVariantERK7QString @ 687 NONAME
- _ZN16QSettingsPrivate15variantToStringERK8QVariant @ 688 NONAME
- _ZN16QSettingsPrivate16iniEscapedStringERK7QStringR10QByteArrayP10QTextCodec @ 689 NONAME
- _ZN16QSettingsPrivate17beginGroupOrArrayERK14QSettingsGroup @ 690 NONAME
- _ZN16QSettingsPrivate20iniEscapedStringListERK11QStringListR10QByteArrayP10QTextCodec @ 691 NONAME
- _ZN16QSettingsPrivate22iniUnescapedStringListERK10QByteArrayiiR7QStringR11QStringListP10QTextCodec @ 692 NONAME
- _ZN16QSettingsPrivate23stringListToVariantListERK11QStringList @ 693 NONAME
- _ZN16QSettingsPrivate23variantListToStringListERK5QListI8QVariantE @ 694 NONAME
- _ZN16QSettingsPrivate6createEN9QSettings6FormatENS0_5ScopeERK7QStringS5_ @ 695 NONAME
- _ZN16QSettingsPrivate6createERK7QStringN9QSettings6FormatE @ 696 NONAME
- _ZN16QSettingsPrivate6updateEv @ 697 NONAME
- _ZN16QSettingsPrivate9splitArgsERK7QStringi @ 698 NONAME
- _ZN16QSettingsPrivateC2EN9QSettings6FormatE @ 699 NONAME
- _ZN16QSettingsPrivateC2EN9QSettings6FormatENS0_5ScopeERK7QStringS5_ @ 700 NONAME
- _ZN16QSettingsPrivateD0Ev @ 701 NONAME
- _ZN16QSettingsPrivateD1Ev @ 702 NONAME
- _ZN16QSettingsPrivateD2Ev @ 703 NONAME
- _ZN16QSystemSemaphore6setKeyERK7QStringiNS_10AccessModeE @ 704 NONAME
- _ZN16QSystemSemaphore7acquireEv @ 705 NONAME
- _ZN16QSystemSemaphore7releaseEi @ 706 NONAME
- _ZN16QSystemSemaphoreC1ERK7QStringiNS_10AccessModeE @ 707 NONAME
- _ZN16QSystemSemaphoreC2ERK7QStringiNS_10AccessModeE @ 708 NONAME
- _ZN16QSystemSemaphoreD1Ev @ 709 NONAME
- _ZN16QSystemSemaphoreD2Ev @ 710 NONAME
- _ZN16QTextCodecPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 711 NONAME
- _ZN16QTextCodecPlugin11qt_metacastEPKc @ 712 NONAME
- _ZN16QTextCodecPlugin16staticMetaObjectE @ 713 NONAME DATA 16
- _ZN16QTextCodecPlugin6createERK7QString @ 714 NONAME
- _ZN16QTextCodecPluginC2EP7QObject @ 715 NONAME
- _ZN16QTextCodecPluginD0Ev @ 716 NONAME
- _ZN16QTextCodecPluginD1Ev @ 717 NONAME
- _ZN16QTextCodecPluginD2Ev @ 718 NONAME
- _ZN16QXmlStreamReader10raiseErrorERK7QString @ 719 NONAME
- _ZN16QXmlStreamReader15readElementTextEv @ 720 NONAME
- _ZN16QXmlStreamReader17setEntityResolverEP24QXmlStreamEntityResolver @ 721 NONAME
- _ZN16QXmlStreamReader22setNamespaceProcessingEb @ 722 NONAME
- _ZN16QXmlStreamReader28addExtraNamespaceDeclarationERK30QXmlStreamNamespaceDeclaration @ 723 NONAME
- _ZN16QXmlStreamReader29addExtraNamespaceDeclarationsERK7QVectorI30QXmlStreamNamespaceDeclarationE @ 724 NONAME
- _ZN16QXmlStreamReader5clearEv @ 725 NONAME
- _ZN16QXmlStreamReader7addDataEPKc @ 726 NONAME
- _ZN16QXmlStreamReader7addDataERK10QByteArray @ 727 NONAME
- _ZN16QXmlStreamReader7addDataERK7QString @ 728 NONAME
- _ZN16QXmlStreamReader8readNextEv @ 729 NONAME
- _ZN16QXmlStreamReader9setDeviceEP9QIODevice @ 730 NONAME
- _ZN16QXmlStreamReaderC1EP9QIODevice @ 731 NONAME
- _ZN16QXmlStreamReaderC1EPKc @ 732 NONAME
- _ZN16QXmlStreamReaderC1ERK10QByteArray @ 733 NONAME
- _ZN16QXmlStreamReaderC1ERK7QString @ 734 NONAME
- _ZN16QXmlStreamReaderC1Ev @ 735 NONAME
- _ZN16QXmlStreamReaderC2EP9QIODevice @ 736 NONAME
- _ZN16QXmlStreamReaderC2EPKc @ 737 NONAME
- _ZN16QXmlStreamReaderC2ERK10QByteArray @ 738 NONAME
- _ZN16QXmlStreamReaderC2ERK7QString @ 739 NONAME
- _ZN16QXmlStreamReaderC2Ev @ 740 NONAME
- _ZN16QXmlStreamReaderD1Ev @ 741 NONAME
- _ZN16QXmlStreamReaderD2Ev @ 742 NONAME
- _ZN16QXmlStreamWriter10writeCDATAERK7QString @ 743 NONAME
- _ZN16QXmlStreamWriter12writeCommentERK7QString @ 744 NONAME
- _ZN16QXmlStreamWriter14writeAttributeERK19QXmlStreamAttribute @ 745 NONAME
- _ZN16QXmlStreamWriter14writeAttributeERK7QStringS2_ @ 746 NONAME
- _ZN16QXmlStreamWriter14writeAttributeERK7QStringS2_S2_ @ 747 NONAME
- _ZN16QXmlStreamWriter14writeNamespaceERK7QStringS2_ @ 748 NONAME
- _ZN16QXmlStreamWriter15writeAttributesERK20QXmlStreamAttributes @ 749 NONAME
- _ZN16QXmlStreamWriter15writeCharactersERK7QString @ 750 NONAME
- _ZN16QXmlStreamWriter15writeEndElementEv @ 751 NONAME
- _ZN16QXmlStreamWriter16writeEndDocumentEv @ 752 NONAME
- _ZN16QXmlStreamWriter16writeTextElementERK7QStringS2_ @ 753 NONAME
- _ZN16QXmlStreamWriter16writeTextElementERK7QStringS2_S2_ @ 754 NONAME
- _ZN16QXmlStreamWriter17setAutoFormattingEb @ 755 NONAME
- _ZN16QXmlStreamWriter17writeCurrentTokenERK16QXmlStreamReader @ 756 NONAME
- _ZN16QXmlStreamWriter17writeEmptyElementERK7QString @ 757 NONAME
- _ZN16QXmlStreamWriter17writeEmptyElementERK7QStringS2_ @ 758 NONAME
- _ZN16QXmlStreamWriter17writeStartElementERK7QString @ 759 NONAME
- _ZN16QXmlStreamWriter17writeStartElementERK7QStringS2_ @ 760 NONAME
- _ZN16QXmlStreamWriter18writeStartDocumentERK7QString @ 761 NONAME
- _ZN16QXmlStreamWriter18writeStartDocumentERK7QStringb @ 762 NONAME
- _ZN16QXmlStreamWriter18writeStartDocumentEv @ 763 NONAME
- _ZN16QXmlStreamWriter20writeEntityReferenceERK7QString @ 764 NONAME
- _ZN16QXmlStreamWriter21writeDefaultNamespaceERK7QString @ 765 NONAME
- _ZN16QXmlStreamWriter23setAutoFormattingIndentEi @ 766 NONAME
- _ZN16QXmlStreamWriter26writeProcessingInstructionERK7QStringS2_ @ 767 NONAME
- _ZN16QXmlStreamWriter8setCodecEP10QTextCodec @ 768 NONAME
- _ZN16QXmlStreamWriter8setCodecEPKc @ 769 NONAME
- _ZN16QXmlStreamWriter8writeDTDERK7QString @ 770 NONAME
- _ZN16QXmlStreamWriter9setDeviceEP9QIODevice @ 771 NONAME
- _ZN16QXmlStreamWriterC1EP10QByteArray @ 772 NONAME
- _ZN16QXmlStreamWriterC1EP7QString @ 773 NONAME
- _ZN16QXmlStreamWriterC1EP9QIODevice @ 774 NONAME
- _ZN16QXmlStreamWriterC1Ev @ 775 NONAME
- _ZN16QXmlStreamWriterC2EP10QByteArray @ 776 NONAME
- _ZN16QXmlStreamWriterC2EP7QString @ 777 NONAME
- _ZN16QXmlStreamWriterC2EP9QIODevice @ 778 NONAME
- _ZN16QXmlStreamWriterC2Ev @ 779 NONAME
- _ZN16QXmlStreamWriterD1Ev @ 780 NONAME
- _ZN16QXmlStreamWriterD2Ev @ 781 NONAME
- _ZN17QByteArrayMatcher10setPatternERK10QByteArray @ 782 NONAME
- _ZN17QByteArrayMatcherC1EPKci @ 783 NONAME
- _ZN17QByteArrayMatcherC1ERK10QByteArray @ 784 NONAME
- _ZN17QByteArrayMatcherC1ERKS_ @ 785 NONAME
- _ZN17QByteArrayMatcherC1Ev @ 786 NONAME
- _ZN17QByteArrayMatcherC2EPKci @ 787 NONAME
- _ZN17QByteArrayMatcherC2ERK10QByteArray @ 788 NONAME
- _ZN17QByteArrayMatcherC2ERKS_ @ 789 NONAME
- _ZN17QByteArrayMatcherC2Ev @ 790 NONAME
- _ZN17QByteArrayMatcherD1Ev @ 791 NONAME
- _ZN17QByteArrayMatcherD2Ev @ 792 NONAME
- _ZN17QByteArrayMatcheraSERKS_ @ 793 NONAME
- _ZN18QAbstractItemModel10decodeDataEiiRK11QModelIndexR11QDataStream @ 794 NONAME
- _ZN18QAbstractItemModel10insertRowsEiiRK11QModelIndex @ 795 NONAME
- _ZN18QAbstractItemModel10modelResetEv @ 796 NONAME
- _ZN18QAbstractItemModel10removeRowsEiiRK11QModelIndex @ 797 NONAME
- _ZN18QAbstractItemModel11dataChangedERK11QModelIndexS2_ @ 798 NONAME
- _ZN18QAbstractItemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 799 NONAME
- _ZN18QAbstractItemModel11qt_metacastEPKc @ 800 NONAME
- _ZN18QAbstractItemModel11rowsRemovedERK11QModelIndexii @ 801 NONAME
- _ZN18QAbstractItemModel11setItemDataERK11QModelIndexRK4QMapIi8QVariantE @ 802 NONAME
- _ZN18QAbstractItemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 803 NONAME
- _ZN18QAbstractItemModel12rowsInsertedERK11QModelIndexii @ 804 NONAME
- _ZN18QAbstractItemModel13endInsertRowsEv @ 805 NONAME
- _ZN18QAbstractItemModel13endRemoveRowsEv @ 806 NONAME
- _ZN18QAbstractItemModel13insertColumnsEiiRK11QModelIndex @ 807 NONAME
- _ZN18QAbstractItemModel13layoutChangedEv @ 808 NONAME
- _ZN18QAbstractItemModel13removeColumnsEiiRK11QModelIndex @ 809 NONAME
- _ZN18QAbstractItemModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 810 NONAME
- _ZN18QAbstractItemModel14columnsRemovedERK11QModelIndexii @ 811 NONAME
- _ZN18QAbstractItemModel15beginInsertRowsERK11QModelIndexii @ 812 NONAME
- _ZN18QAbstractItemModel15beginRemoveRowsERK11QModelIndexii @ 813 NONAME
- _ZN18QAbstractItemModel15columnsInsertedERK11QModelIndexii @ 814 NONAME
- _ZN18QAbstractItemModel16endInsertColumnsEv @ 815 NONAME
- _ZN18QAbstractItemModel16endRemoveColumnsEv @ 816 NONAME
- _ZN18QAbstractItemModel16staticMetaObjectE @ 817 NONAME DATA 16
- _ZN18QAbstractItemModel17headerDataChangedEN2Qt11OrientationEii @ 818 NONAME
- _ZN18QAbstractItemModel18beginInsertColumnsERK11QModelIndexii @ 819 NONAME
- _ZN18QAbstractItemModel18beginRemoveColumnsERK11QModelIndexii @ 820 NONAME
- _ZN18QAbstractItemModel19modelAboutToBeResetEv @ 821 NONAME
- _ZN18QAbstractItemModel20rowsAboutToBeRemovedERK11QModelIndexii @ 822 NONAME
- _ZN18QAbstractItemModel21changePersistentIndexERK11QModelIndexS2_ @ 823 NONAME
- _ZN18QAbstractItemModel21rowsAboutToBeInsertedERK11QModelIndexii @ 824 NONAME
- _ZN18QAbstractItemModel22layoutAboutToBeChangedEv @ 825 NONAME
- _ZN18QAbstractItemModel23columnsAboutToBeRemovedERK11QModelIndexii @ 826 NONAME
- _ZN18QAbstractItemModel23setSupportedDragActionsE6QFlagsIN2Qt10DropActionEE @ 827 NONAME
- _ZN18QAbstractItemModel24columnsAboutToBeInsertedERK11QModelIndexii @ 828 NONAME
- _ZN18QAbstractItemModel25changePersistentIndexListERK5QListI11QModelIndexES4_ @ 829 NONAME
- _ZN18QAbstractItemModel4sortEiN2Qt9SortOrderE @ 830 NONAME
- _ZN18QAbstractItemModel5resetEv @ 831 NONAME
- _ZN18QAbstractItemModel6revertEv @ 832 NONAME
- _ZN18QAbstractItemModel6submitEv @ 833 NONAME
- _ZN18QAbstractItemModel7setDataERK11QModelIndexRK8QVarianti @ 834 NONAME
- _ZN18QAbstractItemModel9fetchMoreERK11QModelIndex @ 835 NONAME
- _ZN18QAbstractItemModelC2EP7QObject @ 836 NONAME
- _ZN18QAbstractItemModelC2ER25QAbstractItemModelPrivateP7QObject @ 837 NONAME
- _ZN18QAbstractItemModelD0Ev @ 838 NONAME
- _ZN18QAbstractItemModelD1Ev @ 839 NONAME
- _ZN18QAbstractItemModelD2Ev @ 840 NONAME
- _ZN18QAbstractListModel11qt_metacallEN11QMetaObject4CallEiPPv @ 841 NONAME
- _ZN18QAbstractListModel11qt_metacastEPKc @ 842 NONAME
- _ZN18QAbstractListModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 843 NONAME
- _ZN18QAbstractListModel16staticMetaObjectE @ 844 NONAME DATA 16
- _ZN18QAbstractListModelC2EP7QObject @ 845 NONAME
- _ZN18QAbstractListModelC2ER25QAbstractItemModelPrivateP7QObject @ 846 NONAME
- _ZN18QAbstractListModelD0Ev @ 847 NONAME
- _ZN18QAbstractListModelD1Ev @ 848 NONAME
- _ZN18QAbstractListModelD2Ev @ 849 NONAME
- _ZN18QCryptographicHash4hashERK10QByteArrayNS_9AlgorithmE @ 850 NONAME
- _ZN18QCryptographicHash5resetEv @ 851 NONAME
- _ZN18QCryptographicHash7addDataEPKci @ 852 NONAME
- _ZN18QCryptographicHash7addDataERK10QByteArray @ 853 NONAME
- _ZN18QCryptographicHashC1ENS_9AlgorithmE @ 854 NONAME
- _ZN18QCryptographicHashC2ENS_9AlgorithmE @ 855 NONAME
- _ZN18QCryptographicHashD1Ev @ 856 NONAME
- _ZN18QCryptographicHashD2Ev @ 857 NONAME
- _ZN18QFileSystemWatcher10removePathERK7QString @ 858 NONAME
- _ZN18QFileSystemWatcher11fileChangedERK7QString @ 859 NONAME
- _ZN18QFileSystemWatcher11qt_metacallEN11QMetaObject4CallEiPPv @ 860 NONAME
- _ZN18QFileSystemWatcher11qt_metacastEPKc @ 861 NONAME
- _ZN18QFileSystemWatcher11removePathsERK11QStringList @ 862 NONAME
- _ZN18QFileSystemWatcher16directoryChangedERK7QString @ 863 NONAME
- _ZN18QFileSystemWatcher16staticMetaObjectE @ 864 NONAME DATA 16
- _ZN18QFileSystemWatcher7addPathERK7QString @ 865 NONAME
- _ZN18QFileSystemWatcher8addPathsERK11QStringList @ 866 NONAME
- _ZN18QFileSystemWatcherC1EP7QObject @ 867 NONAME
- _ZN18QFileSystemWatcherC1ERK11QStringListP7QObject @ 868 NONAME
- _ZN18QFileSystemWatcherC2EP7QObject @ 869 NONAME
- _ZN18QFileSystemWatcherC2ERK11QStringListP7QObject @ 870 NONAME
- _ZN18QFileSystemWatcherD0Ev @ 871 NONAME
- _ZN18QFileSystemWatcherD1Ev @ 872 NONAME
- _ZN18QFileSystemWatcherD2Ev @ 873 NONAME
- _ZN18QThreadStorageData3setEPv @ 874 NONAME
- _ZN18QThreadStorageData6finishEPPv @ 875 NONAME
- _ZN18QThreadStorageDataC1EPFvPvE @ 876 NONAME
- _ZN18QThreadStorageDataC2EPFvPvE @ 877 NONAME
- _ZN18QThreadStorageDataD1Ev @ 878 NONAME
- _ZN18QThreadStorageDataD2Ev @ 879 NONAME
- _ZN19QAbstractFileEngine11setFileNameERK7QString @ 880 NONAME
- _ZN19QAbstractFileEngine12endEntryListEv @ 881 NONAME
- _ZN19QAbstractFileEngine14beginEntryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 882 NONAME
- _ZN19QAbstractFileEngine14setPermissionsEj @ 883 NONAME
- _ZN19QAbstractFileEngine3mapExxN5QFile14MemoryMapFlagsE @ 884 NONAME
- _ZN19QAbstractFileEngine4copyERK7QString @ 885 NONAME
- _ZN19QAbstractFileEngine4linkERK7QString @ 886 NONAME
- _ZN19QAbstractFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 887 NONAME
- _ZN19QAbstractFileEngine4readEPcx @ 888 NONAME
- _ZN19QAbstractFileEngine4seekEx @ 889 NONAME
- _ZN19QAbstractFileEngine5closeEv @ 890 NONAME
- _ZN19QAbstractFileEngine5flushEv @ 891 NONAME
- _ZN19QAbstractFileEngine5unmapEPh @ 892 NONAME
- _ZN19QAbstractFileEngine5writeEPKcx @ 893 NONAME
- _ZN19QAbstractFileEngine6createERK7QString @ 894 NONAME
- _ZN19QAbstractFileEngine6removeEv @ 895 NONAME
- _ZN19QAbstractFileEngine6renameERK7QString @ 896 NONAME
- _ZN19QAbstractFileEngine7setSizeEx @ 897 NONAME
- _ZN19QAbstractFileEngine8readLineEPcx @ 898 NONAME
- _ZN19QAbstractFileEngine8setErrorEN5QFile9FileErrorERK7QString @ 899 NONAME
- _ZN19QAbstractFileEngine9extensionENS_9ExtensionEPKNS_15ExtensionOptionEPNS_15ExtensionReturnE @ 900 NONAME
- _ZN19QAbstractFileEngineC1ER26QAbstractFileEnginePrivate @ 901 NONAME
- _ZN19QAbstractFileEngineC1Ev @ 902 NONAME
- _ZN19QAbstractFileEngineC2ER26QAbstractFileEnginePrivate @ 903 NONAME
- _ZN19QAbstractFileEngineC2Ev @ 904 NONAME
- _ZN19QAbstractFileEngineD0Ev @ 905 NONAME
- _ZN19QAbstractFileEngineD1Ev @ 906 NONAME
- _ZN19QAbstractFileEngineD2Ev @ 907 NONAME
- _ZN19QAbstractTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 908 NONAME
- _ZN19QAbstractTableModel11qt_metacastEPKc @ 909 NONAME
- _ZN19QAbstractTableModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 910 NONAME
- _ZN19QAbstractTableModel16staticMetaObjectE @ 911 NONAME DATA 16
- _ZN19QAbstractTableModelC2EP7QObject @ 912 NONAME
- _ZN19QAbstractTableModelC2ER25QAbstractItemModelPrivateP7QObject @ 913 NONAME
- _ZN19QAbstractTableModelD0Ev @ 914 NONAME
- _ZN19QAbstractTableModelD1Ev @ 915 NONAME
- _ZN19QAbstractTableModelD2Ev @ 916 NONAME
- _ZN19QTextBoundaryFinder11setPositionEi @ 917 NONAME
- _ZN19QTextBoundaryFinder14toNextBoundaryEv @ 918 NONAME
- _ZN19QTextBoundaryFinder18toPreviousBoundaryEv @ 919 NONAME
- _ZN19QTextBoundaryFinder5toEndEv @ 920 NONAME
- _ZN19QTextBoundaryFinder7toStartEv @ 921 NONAME
- _ZN19QTextBoundaryFinderC1ENS_12BoundaryTypeEPK5QChariPhi @ 922 NONAME
- _ZN19QTextBoundaryFinderC1ENS_12BoundaryTypeERK7QString @ 923 NONAME
- _ZN19QTextBoundaryFinderC1ERKS_ @ 924 NONAME
- _ZN19QTextBoundaryFinderC1Ev @ 925 NONAME
- _ZN19QTextBoundaryFinderC2ENS_12BoundaryTypeEPK5QChariPhi @ 926 NONAME
- _ZN19QTextBoundaryFinderC2ENS_12BoundaryTypeERK7QString @ 927 NONAME
- _ZN19QTextBoundaryFinderC2ERKS_ @ 928 NONAME
- _ZN19QTextBoundaryFinderC2Ev @ 929 NONAME
- _ZN19QTextBoundaryFinderD1Ev @ 930 NONAME
- _ZN19QTextBoundaryFinderD2Ev @ 931 NONAME
- _ZN19QTextBoundaryFinderaSERKS_ @ 932 NONAME
- _ZN19QXmlStreamAttributeC1ERK7QStringS2_ @ 933 NONAME
- _ZN19QXmlStreamAttributeC1ERK7QStringS2_S2_ @ 934 NONAME
- _ZN19QXmlStreamAttributeC1ERKS_ @ 935 NONAME
- _ZN19QXmlStreamAttributeC1Ev @ 936 NONAME
- _ZN19QXmlStreamAttributeC2ERK7QStringS2_ @ 937 NONAME
- _ZN19QXmlStreamAttributeC2ERK7QStringS2_S2_ @ 938 NONAME
- _ZN19QXmlStreamAttributeC2ERKS_ @ 939 NONAME
- _ZN19QXmlStreamAttributeC2Ev @ 940 NONAME
- _ZN19QXmlStreamAttributeD1Ev @ 941 NONAME
- _ZN19QXmlStreamAttributeD2Ev @ 942 NONAME
- _ZN19QXmlStreamAttributeaSERKS_ @ 943 NONAME
- _ZN20QSharedMemoryPrivate11cleanHandleEv @ 944 NONAME
- _ZN20QSharedMemoryPrivate14setErrorStringERK7QStringi @ 945 NONAME
- _ZN20QSharedMemoryPrivate19makePlatformSafeKeyERK7QStringS2_ @ 946 NONAME
- _ZN20QSharedMemoryPrivate6attachEN13QSharedMemory10AccessModeE @ 947 NONAME
- _ZN20QSharedMemoryPrivate6createEi @ 948 NONAME
- _ZN20QSharedMemoryPrivate6detachEv @ 949 NONAME
- _ZN20QSharedMemoryPrivate6handleEv @ 950 NONAME
- _ZN20QSharedMemoryPrivate7initKeyEv @ 951 NONAME
- _ZN20QSharedMemoryPrivateC1Ev @ 952 NONAME
- _ZN20QSharedMemoryPrivateC2Ev @ 953 NONAME
- _ZN20QXmlStreamAttributes6appendERK7QStringS2_ @ 954 NONAME
- _ZN20QXmlStreamAttributes6appendERK7QStringS2_S2_ @ 955 NONAME
- _ZN21QObjectCleanupHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 956 NONAME
- _ZN21QObjectCleanupHandler11qt_metacastEPKc @ 957 NONAME
- _ZN21QObjectCleanupHandler15objectDestroyedEP7QObject @ 958 NONAME
- _ZN21QObjectCleanupHandler16staticMetaObjectE @ 959 NONAME DATA 16
- _ZN21QObjectCleanupHandler3addEP7QObject @ 960 NONAME
- _ZN21QObjectCleanupHandler5clearEv @ 961 NONAME
- _ZN21QObjectCleanupHandler6removeEP7QObject @ 962 NONAME
- _ZN21QObjectCleanupHandlerC1Ev @ 963 NONAME
- _ZN21QObjectCleanupHandlerC2Ev @ 964 NONAME
- _ZN21QObjectCleanupHandlerD0Ev @ 965 NONAME
- _ZN21QObjectCleanupHandlerD1Ev @ 966 NONAME
- _ZN21QObjectCleanupHandlerD2Ev @ 967 NONAME
- _ZN21QPersistentModelIndexC1ERK11QModelIndex @ 968 NONAME
- _ZN21QPersistentModelIndexC1ERKS_ @ 969 NONAME
- _ZN21QPersistentModelIndexC1Ev @ 970 NONAME
- _ZN21QPersistentModelIndexC2ERK11QModelIndex @ 971 NONAME
- _ZN21QPersistentModelIndexC2ERKS_ @ 972 NONAME
- _ZN21QPersistentModelIndexC2Ev @ 973 NONAME
- _ZN21QPersistentModelIndexD1Ev @ 974 NONAME
- _ZN21QPersistentModelIndexD2Ev @ 975 NONAME
- _ZN21QPersistentModelIndexaSERK11QModelIndex @ 976 NONAME
- _ZN21QPersistentModelIndexaSERKS_ @ 977 NONAME
- _ZN23QCoreApplicationPrivate10mainThreadEv @ 978 NONAME
- _ZN23QCoreApplicationPrivate13checkInstanceEPKc @ 979 NONAME
- _ZN23QCoreApplicationPrivate13notify_helperEP7QObjectP6QEvent @ 980 NONAME
- _ZN23QCoreApplicationPrivate13theMainThreadE @ 981 NONAME DATA 4
- _ZN23QCoreApplicationPrivate14is_app_closingE @ 982 NONAME DATA 1
- _ZN23QCoreApplicationPrivate14is_app_runningE @ 983 NONAME DATA 1
- _ZN23QCoreApplicationPrivate15eventDispatcherE @ 984 NONAME DATA 4
- _ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData @ 985 NONAME
- _ZN23QCoreApplicationPrivate17removePostedEventEP6QEvent @ 986 NONAME
- _ZN23QCoreApplicationPrivate19checkReceiverThreadEP7QObject @ 987 NONAME
- _ZN23QCoreApplicationPrivate21createEventDispatcherEv @ 988 NONAME
- _ZN23QCoreApplicationPrivate21isTranslatorInstalledEP11QTranslator @ 989 NONAME
- _ZN23QCoreApplicationPrivate27removePostedEvents_unlockedEP7QObjectiP11QThreadData @ 990 NONAME ABSENT
- _ZN23QCoreApplicationPrivate29sendThroughObjectEventFiltersEP7QObjectP6QEvent @ 991 NONAME
- _ZN23QCoreApplicationPrivate34sendThroughApplicationEventFiltersEP7QObjectP6QEvent @ 992 NONAME
- _ZN23QCoreApplicationPrivate35appendApplicationPathToLibraryPathsEv @ 993 NONAME
- _ZN23QCoreApplicationPrivate7attribsE @ 994 NONAME DATA 4
- _ZN23QCoreApplicationPrivateC1ERiPPc @ 995 NONAME
- _ZN23QCoreApplicationPrivateC2ERiPPc @ 996 NONAME
- _ZN23QCoreApplicationPrivateD0Ev @ 997 NONAME
- _ZN23QCoreApplicationPrivateD1Ev @ 998 NONAME
- _ZN23QCoreApplicationPrivateD2Ev @ 999 NONAME
- _ZN23QEventDispatcherSymbian10startingUpEv @ 1000 NONAME
- _ZN23QEventDispatcherSymbian10timerFiredEi @ 1001 NONAME
- _ZN23QEventDispatcherSymbian11closingDownEv @ 1002 NONAME
- _ZN23QEventDispatcherSymbian11socketFiredEP19QSocketActiveObject @ 1003 NONAME
- _ZN23QEventDispatcherSymbian13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 1004 NONAME
- _ZN23QEventDispatcherSymbian13registerTimerEiiP7QObject @ 1005 NONAME
- _ZN23QEventDispatcherSymbian15unregisterTimerEi @ 1006 NONAME
- _ZN23QEventDispatcherSymbian15wakeUpWasCalledEv @ 1007 NONAME
- _ZN23QEventDispatcherSymbian16hasPendingEventsEv @ 1008 NONAME
- _ZN23QEventDispatcherSymbian16sendPostedEventsEv @ 1009 NONAME
- _ZN23QEventDispatcherSymbian16unregisterTimersEP7QObject @ 1010 NONAME
- _ZN23QEventDispatcherSymbian22registerSocketNotifierEP15QSocketNotifier @ 1011 NONAME
- _ZN23QEventDispatcherSymbian24reactivateSocketNotifierEP15QSocketNotifier @ 1012 NONAME
- _ZN23QEventDispatcherSymbian24sendDeferredSocketEventsEv @ 1013 NONAME
- _ZN23QEventDispatcherSymbian24unregisterSocketNotifierEP15QSocketNotifier @ 1014 NONAME
- _ZN23QEventDispatcherSymbian31reactivateDeferredActiveObjectsEv @ 1015 NONAME
- _ZN23QEventDispatcherSymbian5flushEv @ 1016 NONAME
- _ZN23QEventDispatcherSymbian6wakeUpEv @ 1017 NONAME
- _ZN23QEventDispatcherSymbian9interruptEv @ 1018 NONAME
- _ZN23QEventDispatcherSymbianC1EP7QObject @ 1019 NONAME
- _ZN23QEventDispatcherSymbianC2EP7QObject @ 1020 NONAME
- _ZN23QEventDispatcherSymbianD0Ev @ 1021 NONAME
- _ZN23QEventDispatcherSymbianD1Ev @ 1022 NONAME
- _ZN23QEventDispatcherSymbianD2Ev @ 1023 NONAME
- _ZN24QAbstractEventDispatcher10startingUpEv @ 1024 NONAME
- _ZN24QAbstractEventDispatcher11closingDownEv @ 1025 NONAME
- _ZN24QAbstractEventDispatcher11filterEventEPv @ 1026 NONAME
- _ZN24QAbstractEventDispatcher11qt_metacallEN11QMetaObject4CallEiPPv @ 1027 NONAME
- _ZN24QAbstractEventDispatcher11qt_metacastEPKc @ 1028 NONAME
- _ZN24QAbstractEventDispatcher12aboutToBlockEv @ 1029 NONAME
- _ZN24QAbstractEventDispatcher13registerTimerEiP7QObject @ 1030 NONAME
- _ZN24QAbstractEventDispatcher14setEventFilterEPFbPvE @ 1031 NONAME
- _ZN24QAbstractEventDispatcher16staticMetaObjectE @ 1032 NONAME DATA 16
- _ZN24QAbstractEventDispatcher5awakeEv @ 1033 NONAME
- _ZN24QAbstractEventDispatcher8instanceEP7QThread @ 1034 NONAME
- _ZN24QAbstractEventDispatcherC2EP7QObject @ 1035 NONAME
- _ZN24QAbstractEventDispatcherC2ER31QAbstractEventDispatcherPrivateP7QObject @ 1036 NONAME
- _ZN24QAbstractEventDispatcherD0Ev @ 1037 NONAME
- _ZN24QAbstractEventDispatcherD1Ev @ 1038 NONAME
- _ZN24QAbstractEventDispatcherD2Ev @ 1039 NONAME
- _ZN24QXmlStreamEntityResolver13resolveEntityERK7QStringS2_ @ 1040 NONAME
- _ZN24QXmlStreamEntityResolver23resolveUndeclaredEntityERK7QString @ 1041 NONAME
- _ZN24QXmlStreamEntityResolverD0Ev @ 1042 NONAME
- _ZN24QXmlStreamEntityResolverD1Ev @ 1043 NONAME
- _ZN24QXmlStreamEntityResolverD2Ev @ 1044 NONAME
- _ZN25QAbstractItemModelPrivate11rowsRemovedERK11QModelIndexii @ 1045 NONAME
- _ZN25QAbstractItemModelPrivate12rowsInsertedERK11QModelIndexii @ 1046 NONAME
- _ZN25QAbstractItemModelPrivate14columnsRemovedERK11QModelIndexii @ 1047 NONAME
- _ZN25QAbstractItemModelPrivate15columnsInsertedERK11QModelIndexii @ 1048 NONAME
- _ZN25QAbstractItemModelPrivate16staticEmptyModelEv @ 1049 NONAME
- _ZN25QAbstractItemModelPrivate20rowsAboutToBeRemovedERK11QModelIndexii @ 1050 NONAME
- _ZN25QAbstractItemModelPrivate21rowsAboutToBeInsertedERK11QModelIndexii @ 1051 NONAME
- _ZN25QAbstractItemModelPrivate23columnsAboutToBeRemovedERK11QModelIndexii @ 1052 NONAME
- _ZN25QAbstractItemModelPrivate24columnsAboutToBeInsertedERK11QModelIndexii @ 1053 NONAME
- _ZN25QAbstractItemModelPrivate25removePersistentIndexDataEP25QPersistentModelIndexData @ 1054 NONAME
- _ZN25QPersistentModelIndexData6createERK11QModelIndex @ 1055 NONAME ABSENT
- _ZN25QPersistentModelIndexData7destroyEPS_ @ 1056 NONAME ABSENT
- _ZN26QAbstractFileEngineHandlerC2Ev @ 1057 NONAME
- _ZN26QAbstractFileEngineHandlerD0Ev @ 1058 NONAME
- _ZN26QAbstractFileEngineHandlerD1Ev @ 1059 NONAME
- _ZN26QAbstractFileEngineHandlerD2Ev @ 1060 NONAME
- _ZN27QAbstractFileEngineIterator7setPathERK7QString @ 1061 NONAME
- _ZN27QAbstractFileEngineIteratorC2E6QFlagsIN4QDir6FilterEERK11QStringList @ 1062 NONAME
- _ZN27QAbstractFileEngineIteratorD0Ev @ 1063 NONAME
- _ZN27QAbstractFileEngineIteratorD1Ev @ 1064 NONAME
- _ZN27QAbstractFileEngineIteratorD2Ev @ 1065 NONAME
- _ZN27QDynamicPropertyChangeEventC1ERK10QByteArray @ 1066 NONAME
- _ZN27QDynamicPropertyChangeEventC2ERK10QByteArray @ 1067 NONAME
- _ZN27QDynamicPropertyChangeEventD0Ev @ 1068 NONAME
- _ZN27QDynamicPropertyChangeEventD1Ev @ 1069 NONAME
- _ZN27QDynamicPropertyChangeEventD2Ev @ 1070 NONAME
- _ZN27QXmlStreamEntityDeclarationC1ERKS_ @ 1071 NONAME
- _ZN27QXmlStreamEntityDeclarationC1Ev @ 1072 NONAME
- _ZN27QXmlStreamEntityDeclarationC2ERKS_ @ 1073 NONAME
- _ZN27QXmlStreamEntityDeclarationC2Ev @ 1074 NONAME
- _ZN27QXmlStreamEntityDeclarationD1Ev @ 1075 NONAME
- _ZN27QXmlStreamEntityDeclarationD2Ev @ 1076 NONAME
- _ZN27QXmlStreamEntityDeclarationaSERKS_ @ 1077 NONAME
- _ZN29QXmlStreamNotationDeclarationC1ERKS_ @ 1078 NONAME
- _ZN29QXmlStreamNotationDeclarationC1Ev @ 1079 NONAME
- _ZN29QXmlStreamNotationDeclarationC2ERKS_ @ 1080 NONAME
- _ZN29QXmlStreamNotationDeclarationC2Ev @ 1081 NONAME
- _ZN29QXmlStreamNotationDeclarationD1Ev @ 1082 NONAME
- _ZN29QXmlStreamNotationDeclarationD2Ev @ 1083 NONAME
- _ZN29QXmlStreamNotationDeclarationaSERKS_ @ 1084 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC1ERK7QStringS2_ @ 1085 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC1ERKS_ @ 1086 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC1Ev @ 1087 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC2ERK7QStringS2_ @ 1088 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC2ERKS_ @ 1089 NONAME
- _ZN30QXmlStreamNamespaceDeclarationC2Ev @ 1090 NONAME
- _ZN30QXmlStreamNamespaceDeclarationD1Ev @ 1091 NONAME
- _ZN30QXmlStreamNamespaceDeclarationD2Ev @ 1092 NONAME
- _ZN30QXmlStreamNamespaceDeclarationaSERKS_ @ 1093 NONAME
- _ZN31QAbstractEventDispatcherPrivate14releaseTimerIdEi @ 1094 NONAME
- _ZN31QAbstractEventDispatcherPrivate15allocateTimerIdEv @ 1095 NONAME
- _ZN31QAbstractEventDispatcherPrivate4initEv @ 1096 NONAME
- _ZN4QDir10setCurrentERK7QString @ 1097 NONAME
- _ZN4QDir10setSortingE6QFlagsINS_8SortFlagEE @ 1098 NONAME
- _ZN4QDir11currentPathEv @ 1099 NONAME
- _ZN4QDir11searchPathsERK7QString @ 1100 NONAME
- _ZN4QDir12makeAbsoluteEv @ 1101 NONAME
- _ZN4QDir13addSearchPathERK7QStringS2_ @ 1102 NONAME
- _ZN4QDir14isRelativePathERK7QString @ 1103 NONAME
- _ZN4QDir14setNameFiltersERK11QStringList @ 1104 NONAME
- _ZN4QDir14setSearchPathsERK7QStringRK11QStringList @ 1105 NONAME
- _ZN4QDir17convertSeparatorsERK7QString @ 1106 NONAME
- _ZN4QDir18toNativeSeparatorsERK7QString @ 1107 NONAME
- _ZN4QDir20fromNativeSeparatorsERK7QString @ 1108 NONAME
- _ZN4QDir21addResourceSearchPathERK7QString @ 1109 NONAME
- _ZN4QDir21nameFiltersFromStringERK7QString @ 1110 NONAME
- _ZN4QDir2cdERK7QString @ 1111 NONAME
- _ZN4QDir4cdUpEv @ 1112 NONAME
- _ZN4QDir5matchERK11QStringListRK7QString @ 1113 NONAME
- _ZN4QDir5matchERK7QStringS2_ @ 1114 NONAME
- _ZN4QDir6drivesEv @ 1115 NONAME
- _ZN4QDir6removeERK7QString @ 1116 NONAME
- _ZN4QDir6renameERK7QStringS2_ @ 1117 NONAME
- _ZN4QDir7setPathERK7QString @ 1118 NONAME
- _ZN4QDir8homePathEv @ 1119 NONAME
- _ZN4QDir8rootPathEv @ 1120 NONAME
- _ZN4QDir8tempPathEv @ 1121 NONAME
- _ZN4QDir9cleanPathERK7QString @ 1122 NONAME
- _ZN4QDir9separatorEv @ 1123 NONAME
- _ZN4QDir9setFilterE6QFlagsINS_6FilterEE @ 1124 NONAME
- _ZN4QDirC1ERK7QString @ 1125 NONAME
- _ZN4QDirC1ERK7QStringS2_6QFlagsINS_8SortFlagEES3_INS_6FilterEE @ 1126 NONAME
- _ZN4QDirC1ERKS_ @ 1127 NONAME
- _ZN4QDirC2ERK7QString @ 1128 NONAME
- _ZN4QDirC2ERK7QStringS2_6QFlagsINS_8SortFlagEES3_INS_6FilterEE @ 1129 NONAME
- _ZN4QDirC2ERKS_ @ 1130 NONAME
- _ZN4QDirD1Ev @ 1131 NONAME
- _ZN4QDirD2Ev @ 1132 NONAME
- _ZN4QDiraSERK7QString @ 1133 NONAME
- _ZN4QDiraSERKS_ @ 1134 NONAME
- _ZN4QUrl10toPunycodeERK7QString @ 1135 NONAME
- _ZN4QUrl11fromEncodedERK10QByteArray @ 1136 NONAME
- _ZN4QUrl11fromEncodedERK10QByteArrayNS_11ParsingModeE @ 1137 NONAME
- _ZN4QUrl11setFragmentERK7QString @ 1138 NONAME
- _ZN4QUrl11setPasswordERK7QString @ 1139 NONAME
- _ZN4QUrl11setUserInfoERK7QString @ 1140 NONAME
- _ZN4QUrl11setUserNameERK7QString @ 1141 NONAME
- _ZN4QUrl12addQueryItemERK7QStringS2_ @ 1142 NONAME
- _ZN4QUrl12fromPunycodeERK10QByteArray @ 1143 NONAME
- _ZN4QUrl12idnWhitelistEv @ 1144 NONAME
- _ZN4QUrl12setAuthorityERK7QString @ 1145 NONAME
- _ZN4QUrl13fromLocalFileERK7QString @ 1146 NONAME
- _ZN4QUrl13setEncodedUrlERK10QByteArray @ 1147 NONAME
- _ZN4QUrl13setEncodedUrlERK10QByteArrayNS_11ParsingModeE @ 1148 NONAME
- _ZN4QUrl13setQueryItemsERK5QListI5QPairI7QStringS2_EE @ 1149 NONAME
- _ZN4QUrl14setEncodedHostERK10QByteArray @ 1150 NONAME
- _ZN4QUrl14setEncodedPathERK10QByteArray @ 1151 NONAME
- _ZN4QUrl15removeQueryItemERK7QString @ 1152 NONAME
- _ZN4QUrl15setEncodedQueryERK10QByteArray @ 1153 NONAME
- _ZN4QUrl15setIdnWhitelistERK11QStringList @ 1154 NONAME
- _ZN4QUrl17toPercentEncodingERK7QStringRK10QByteArrayS5_ @ 1155 NONAME
- _ZN4QUrl18setEncodedFragmentERK10QByteArray @ 1156 NONAME
- _ZN4QUrl18setEncodedPasswordERK10QByteArray @ 1157 NONAME
- _ZN4QUrl18setEncodedUserNameERK10QByteArray @ 1158 NONAME
- _ZN4QUrl18setQueryDelimitersEcc @ 1159 NONAME
- _ZN4QUrl19addEncodedQueryItemERK10QByteArrayS2_ @ 1160 NONAME
- _ZN4QUrl19fromPercentEncodingERK10QByteArray @ 1161 NONAME
- _ZN4QUrl19removeAllQueryItemsERK7QString @ 1162 NONAME
- _ZN4QUrl20setEncodedQueryItemsERK5QListI5QPairI10QByteArrayS2_EE @ 1163 NONAME
- _ZN4QUrl22removeEncodedQueryItemERK10QByteArray @ 1164 NONAME
- _ZN4QUrl26removeAllEncodedQueryItemsERK10QByteArray @ 1165 NONAME
- _ZN4QUrl5clearEv @ 1166 NONAME
- _ZN4QUrl5toAceERK7QString @ 1167 NONAME
- _ZN4QUrl6detachEv @ 1168 NONAME
- _ZN4QUrl6setUrlERK7QString @ 1169 NONAME
- _ZN4QUrl6setUrlERK7QStringNS_11ParsingModeE @ 1170 NONAME
- _ZN4QUrl7fromAceERK10QByteArray @ 1171 NONAME
- _ZN4QUrl7setHostERK7QString @ 1172 NONAME
- _ZN4QUrl7setPathERK7QString @ 1173 NONAME
- _ZN4QUrl7setPortEi @ 1174 NONAME
- _ZN4QUrl9setSchemeERK7QString @ 1175 NONAME
- _ZN4QUrlC1ERK7QString @ 1176 NONAME
- _ZN4QUrlC1ERK7QStringNS_11ParsingModeE @ 1177 NONAME
- _ZN4QUrlC1ERKS_ @ 1178 NONAME
- _ZN4QUrlC1Ev @ 1179 NONAME
- _ZN4QUrlC2ERK7QString @ 1180 NONAME
- _ZN4QUrlC2ERK7QStringNS_11ParsingModeE @ 1181 NONAME
- _ZN4QUrlC2ERKS_ @ 1182 NONAME
- _ZN4QUrlC2Ev @ 1183 NONAME
- _ZN4QUrlD1Ev @ 1184 NONAME
- _ZN4QUrlD2Ev @ 1185 NONAME
- _ZN4QUrlaSERK7QString @ 1186 NONAME
- _ZN4QUrlaSERKS_ @ 1187 NONAME
- _ZN5QChar10digitValueEj @ 1188 NONAME
- _ZN5QChar10digitValueEt @ 1189 NONAME
- _ZN5QChar11toTitleCaseEj @ 1190 NONAME
- _ZN5QChar11toTitleCaseEt @ 1191 NONAME
- _ZN5QChar12mirroredCharEj @ 1192 NONAME
- _ZN5QChar12mirroredCharEt @ 1193 NONAME
- _ZN5QChar12toCaseFoldedEj @ 1194 NONAME
- _ZN5QChar12toCaseFoldedEt @ 1195 NONAME
- _ZN5QChar13decompositionEj @ 1196 NONAME
- _ZN5QChar14combiningClassEj @ 1197 NONAME
- _ZN5QChar14combiningClassEt @ 1198 NONAME
- _ZN5QChar14unicodeVersionEj @ 1199 NONAME
- _ZN5QChar14unicodeVersionEt @ 1200 NONAME
- _ZN5QChar16decompositionTagEj @ 1201 NONAME
- _ZN5QChar7joiningEj @ 1202 NONAME
- _ZN5QChar7joiningEt @ 1203 NONAME
- _ZN5QChar7toLowerEj @ 1204 NONAME
- _ZN5QChar7toLowerEt @ 1205 NONAME
- _ZN5QChar7toUpperEj @ 1206 NONAME
- _ZN5QChar7toUpperEt @ 1207 NONAME
- _ZN5QChar8categoryEj @ 1208 NONAME
- _ZN5QChar8categoryEt @ 1209 NONAME
- _ZN5QChar9directionEj @ 1210 NONAME
- _ZN5QChar9directionEt @ 1211 NONAME
- _ZN5QChar9fromAsciiEc @ 1212 NONAME
- _ZN5QCharC1Ec @ 1213 NONAME
- _ZN5QCharC1Eh @ 1214 NONAME
- _ZN5QCharC2Ec @ 1215 NONAME
- _ZN5QCharC2Eh @ 1216 NONAME
- _ZN5QDate10fromStringERK7QStringN2Qt10DateFormatE @ 1217 NONAME
- _ZN5QDate10fromStringERK7QStringS2_ @ 1218 NONAME
- _ZN5QDate10isLeapYearEi @ 1219 NONAME
- _ZN5QDate11currentDateEv @ 1220 NONAME
- _ZN5QDate11longDayNameEi @ 1221 NONAME
- _ZN5QDate11longDayNameEiNS_13MonthNameTypeE @ 1222 NONAME
- _ZN5QDate12shortDayNameEi @ 1223 NONAME
- _ZN5QDate12shortDayNameEiNS_13MonthNameTypeE @ 1224 NONAME
- _ZN5QDate13longMonthNameEi @ 1225 NONAME
- _ZN5QDate13longMonthNameEiNS_13MonthNameTypeE @ 1226 NONAME
- _ZN5QDate14shortMonthNameEi @ 1227 NONAME
- _ZN5QDate14shortMonthNameEiNS_13MonthNameTypeE @ 1228 NONAME
- _ZN5QDate17gregorianToJulianEiii @ 1229 NONAME
- _ZN5QDate17julianToGregorianEjRiS0_S0_ @ 1230 NONAME
- _ZN5QDate6setYMDEiii @ 1231 NONAME
- _ZN5QDate7getDateEPiS0_S0_ @ 1232 NONAME
- _ZN5QDate7isValidEiii @ 1233 NONAME
- _ZN5QDate7setDateEiii @ 1234 NONAME
- _ZN5QDateC1Eiii @ 1235 NONAME
- _ZN5QDateC2Eiii @ 1236 NONAME
- _ZN5QFile10decodeNameERK10QByteArray @ 1237 NONAME
- _ZN5QFile10encodeNameERK7QString @ 1238 NONAME
- _ZN5QFile10unsetErrorEv @ 1239 NONAME
- _ZN5QFile11permissionsERK7QString @ 1240 NONAME
- _ZN5QFile11qt_metacallEN11QMetaObject4CallEiPPv @ 1241 NONAME
- _ZN5QFile11qt_metacastEPKc @ 1242 NONAME
- _ZN5QFile11setFileNameERK7QString @ 1243 NONAME
- _ZN5QFile12readLineDataEPcx @ 1244 NONAME
- _ZN5QFile14setPermissionsE6QFlagsINS_10PermissionEE @ 1245 NONAME
- _ZN5QFile14setPermissionsERK7QString6QFlagsINS_10PermissionEE @ 1246 NONAME
- _ZN5QFile16staticMetaObjectE @ 1247 NONAME DATA 16
- _ZN5QFile19setDecodingFunctionEPF7QStringRK10QByteArrayE @ 1248 NONAME
- _ZN5QFile19setEncodingFunctionEPF10QByteArrayRK7QStringE @ 1249 NONAME
- _ZN5QFile3mapExxNS_14MemoryMapFlagsE @ 1250 NONAME
- _ZN5QFile4copyERK7QString @ 1251 NONAME
- _ZN5QFile4copyERK7QStringS2_ @ 1252 NONAME
- _ZN5QFile4linkERK7QString @ 1253 NONAME
- _ZN5QFile4linkERK7QStringS2_ @ 1254 NONAME
- _ZN5QFile4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1255 NONAME
- _ZN5QFile4openEP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1256 NONAME
- _ZN5QFile4openEi6QFlagsIN9QIODevice12OpenModeFlagEE @ 1257 NONAME
- _ZN5QFile4seekEx @ 1258 NONAME
- _ZN5QFile5closeEv @ 1259 NONAME
- _ZN5QFile5flushEv @ 1260 NONAME
- _ZN5QFile5unmapEPh @ 1261 NONAME
- _ZN5QFile6existsERK7QString @ 1262 NONAME
- _ZN5QFile6removeERK7QString @ 1263 NONAME
- _ZN5QFile6removeEv @ 1264 NONAME
- _ZN5QFile6renameERK7QString @ 1265 NONAME
- _ZN5QFile6renameERK7QStringS2_ @ 1266 NONAME
- _ZN5QFile6resizeERK7QStringx @ 1267 NONAME
- _ZN5QFile6resizeEx @ 1268 NONAME
- _ZN5QFile8readDataEPcx @ 1269 NONAME
- _ZN5QFile8readLinkERK7QString @ 1270 NONAME
- _ZN5QFile9writeDataEPKcx @ 1271 NONAME
- _ZN5QFileC1EP7QObject @ 1272 NONAME
- _ZN5QFileC1ER12QFilePrivateP7QObject @ 1273 NONAME
- _ZN5QFileC1ERK7QString @ 1274 NONAME
- _ZN5QFileC1ERK7QStringP7QObject @ 1275 NONAME
- _ZN5QFileC1Ev @ 1276 NONAME
- _ZN5QFileC2EP7QObject @ 1277 NONAME
- _ZN5QFileC2ER12QFilePrivateP7QObject @ 1278 NONAME
- _ZN5QFileC2ERK7QString @ 1279 NONAME
- _ZN5QFileC2ERK7QStringP7QObject @ 1280 NONAME
- _ZN5QFileC2Ev @ 1281 NONAME
- _ZN5QFileD0Ev @ 1282 NONAME
- _ZN5QFileD1Ev @ 1283 NONAME
- _ZN5QFileD2Ev @ 1284 NONAME
- _ZN5QRect10moveCenterERK6QPoint @ 1285 NONAME
- _ZN5QSize5scaleERKS_N2Qt15AspectRatioModeE @ 1286 NONAME
- _ZN5QSize9transposeEv @ 1287 NONAME
- _ZN5QTime10fromStringERK7QStringN2Qt10DateFormatE @ 1288 NONAME
- _ZN5QTime10fromStringERK7QStringS2_ @ 1289 NONAME
- _ZN5QTime11currentTimeEv @ 1290 NONAME
- _ZN5QTime5startEv @ 1291 NONAME
- _ZN5QTime6setHMSEiiii @ 1292 NONAME
- _ZN5QTime7isValidEiiii @ 1293 NONAME
- _ZN5QTime7restartEv @ 1294 NONAME
- _ZN5QTimeC1Eiiii @ 1295 NONAME
- _ZN5QTimeC2Eiiii @ 1296 NONAME
- _ZN5QUuid10createUuidEv @ 1297 NONAME
- _ZN5QUuidC1EPKc @ 1298 NONAME
- _ZN5QUuidC1ERK7QString @ 1299 NONAME
- _ZN5QUuidC2EPKc @ 1300 NONAME
- _ZN5QUuidC2ERK7QString @ 1301 NONAME
- _ZN6QEvent17registerEventTypeEi @ 1302 NONAME
- _ZN6QEventC1ENS_4TypeE @ 1303 NONAME
- _ZN6QEventC2ENS_4TypeE @ 1304 NONAME
- _ZN6QEventD0Ev @ 1305 NONAME
- _ZN6QEventD1Ev @ 1306 NONAME
- _ZN6QEventD2Ev @ 1307 NONAME
- _ZN6QHBufCC1EP7HBufC16 @ 1308 NONAME
- _ZN6QHBufCC1ERK7QString @ 1309 NONAME
- _ZN6QHBufCC1ERKS_ @ 1310 NONAME
- _ZN6QHBufCC1Ev @ 1311 NONAME
- _ZN6QHBufCC2EP7HBufC16 @ 1312 NONAME
- _ZN6QHBufCC2ERK7QString @ 1313 NONAME
- _ZN6QHBufCC2ERKS_ @ 1314 NONAME
- _ZN6QHBufCC2Ev @ 1315 NONAME
- _ZN6QHBufCD1Ev @ 1316 NONAME
- _ZN6QHBufCD2Ev @ 1317 NONAME
- _ZN6QLineF8setAngleEf @ 1318 NONAME
- _ZN6QLineF9fromPolarEff @ 1319 NONAME
- _ZN6QMutex4lockEv @ 1320 NONAME
- _ZN6QMutex6unlockEv @ 1321 NONAME
- _ZN6QMutex7tryLockEi @ 1322 NONAME
- _ZN6QMutex7tryLockEv @ 1323 NONAME
- _ZN6QMutexC1ENS_13RecursionModeE @ 1324 NONAME
- _ZN6QMutexC2ENS_13RecursionModeE @ 1325 NONAME
- _ZN6QMutexD1Ev @ 1326 NONAME
- _ZN6QMutexD2Ev @ 1327 NONAME
- _ZN6QSizeF5scaleERKS_N2Qt15AspectRatioModeE @ 1328 NONAME
- _ZN6QSizeF9transposeEv @ 1329 NONAME
- _ZN6QTimer10singleShotEiP7QObjectPKc @ 1330 NONAME
- _ZN6QTimer10timerEventEP11QTimerEvent @ 1331 NONAME
- _ZN6QTimer11qt_metacallEN11QMetaObject4CallEiPPv @ 1332 NONAME
- _ZN6QTimer11qt_metacastEPKc @ 1333 NONAME
- _ZN6QTimer11setIntervalEi @ 1334 NONAME
- _ZN6QTimer16staticMetaObjectE @ 1335 NONAME DATA 16
- _ZN6QTimer4stopEv @ 1336 NONAME
- _ZN6QTimer5startEi @ 1337 NONAME
- _ZN6QTimer5startEv @ 1338 NONAME
- _ZN6QTimer7timeoutEv @ 1339 NONAME
- _ZN6QTimerC1EP7QObject @ 1340 NONAME
- _ZN6QTimerC2EP7QObject @ 1341 NONAME
- _ZN6QTimerD0Ev @ 1342 NONAME
- _ZN6QTimerD1Ev @ 1343 NONAME
- _ZN6QTimerD2Ev @ 1344 NONAME
- _ZN7QBuffer11qt_metacallEN11QMetaObject4CallEiPPv @ 1345 NONAME
- _ZN7QBuffer11qt_metacastEPKc @ 1346 NONAME
- _ZN7QBuffer13connectNotifyEPKc @ 1347 NONAME
- _ZN7QBuffer16disconnectNotifyEPKc @ 1348 NONAME
- _ZN7QBuffer16staticMetaObjectE @ 1349 NONAME DATA 16
- _ZN7QBuffer4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1350 NONAME
- _ZN7QBuffer4seekEx @ 1351 NONAME
- _ZN7QBuffer5closeEv @ 1352 NONAME
- _ZN7QBuffer6bufferEv @ 1353 NONAME
- _ZN7QBuffer7setDataERK10QByteArray @ 1354 NONAME
- _ZN7QBuffer8readDataEPcx @ 1355 NONAME
- _ZN7QBuffer9setBufferEP10QByteArray @ 1356 NONAME
- _ZN7QBuffer9writeDataEPKcx @ 1357 NONAME
- _ZN7QBufferC1EP10QByteArrayP7QObject @ 1358 NONAME
- _ZN7QBufferC1EP7QObject @ 1359 NONAME
- _ZN7QBufferC2EP10QByteArrayP7QObject @ 1360 NONAME
- _ZN7QBufferC2EP7QObject @ 1361 NONAME
- _ZN7QBufferD0Ev @ 1362 NONAME
- _ZN7QBufferD1Ev @ 1363 NONAME
- _ZN7QBufferD2Ev @ 1364 NONAME
- _ZN7QLocale10setDefaultERKS_ @ 1365 NONAME
- _ZN7QLocale15countryToStringENS_7CountryE @ 1366 NONAME
- _ZN7QLocale16languageToStringENS_8LanguageE @ 1367 NONAME
- _ZN7QLocale16setNumberOptionsE6QFlagsINS_12NumberOptionEE @ 1368 NONAME
- _ZN7QLocale16staticMetaObjectE @ 1369 NONAME DATA 16
- _ZN7QLocale20countriesForLanguageENS_8LanguageE @ 1370 NONAME
- _ZN7QLocale6systemEv @ 1371 NONAME
- _ZN7QLocaleC1ENS_8LanguageENS_7CountryE @ 1372 NONAME
- _ZN7QLocaleC1ERK7QString @ 1373 NONAME
- _ZN7QLocaleC1ERKS_ @ 1374 NONAME
- _ZN7QLocaleC1Ev @ 1375 NONAME
- _ZN7QLocaleC2ENS_8LanguageENS_7CountryE @ 1376 NONAME
- _ZN7QLocaleC2ERK7QString @ 1377 NONAME
- _ZN7QLocaleC2ERKS_ @ 1378 NONAME
- _ZN7QLocaleC2Ev @ 1379 NONAME
- _ZN7QLocaleaSERKS_ @ 1380 NONAME
- _ZN7QObject10childEventEP11QChildEvent @ 1381 NONAME
- _ZN7QObject10disconnectEPKS_PKcS1_S3_ @ 1382 NONAME
- _ZN7QObject10startTimerEi @ 1383 NONAME
- _ZN7QObject10timerEventEP11QTimerEvent @ 1384 NONAME
- _ZN7QObject11customEventEP6QEvent @ 1385 NONAME
- _ZN7QObject11deleteLaterEv @ 1386 NONAME
- _ZN7QObject11eventFilterEPS_P6QEvent @ 1387 NONAME
- _ZN7QObject11qt_metacallEN11QMetaObject4CallEiPPv @ 1388 NONAME
- _ZN7QObject11qt_metacastEPKc @ 1389 NONAME
- _ZN7QObject11setPropertyEPKcRK8QVariant @ 1390 NONAME
- _ZN7QObject11setUserDataEjP15QObjectUserData @ 1391 NONAME
- _ZN7QObject12blockSignalsEb @ 1392 NONAME
- _ZN7QObject12moveToThreadEP7QThread @ 1393 NONAME
- _ZN7QObject13connectNotifyEPKc @ 1394 NONAME
- _ZN7QObject13setObjectNameERK7QString @ 1395 NONAME
- _ZN7QObject14dumpObjectInfoEv @ 1396 NONAME
- _ZN7QObject14dumpObjectTreeEv @ 1397 NONAME
- _ZN7QObject16disconnectNotifyEPKc @ 1398 NONAME
- _ZN7QObject16registerUserDataEv @ 1399 NONAME
- _ZN7QObject16staticMetaObjectE @ 1400 NONAME DATA 16
- _ZN7QObject17removeEventFilterEPS_ @ 1401 NONAME
- _ZN7QObject18installEventFilterEPS_ @ 1402 NONAME
- _ZN7QObject18staticQtMetaObjectE @ 1403 NONAME DATA 16
- _ZN7QObject5eventEP6QEvent @ 1404 NONAME
- _ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE @ 1405 NONAME
- _ZN7QObject9destroyedEPS_ @ 1406 NONAME
- _ZN7QObject9killTimerEi @ 1407 NONAME
- _ZN7QObject9setParentEPS_ @ 1408 NONAME
- _ZN7QObjectC1EPS_ @ 1409 NONAME
- _ZN7QObjectC1ER14QObjectPrivatePS_ @ 1410 NONAME
- _ZN7QObjectC2EPS_ @ 1411 NONAME
- _ZN7QObjectC2ER14QObjectPrivatePS_ @ 1412 NONAME
- _ZN7QObjectD0Ev @ 1413 NONAME
- _ZN7QObjectD1Ev @ 1414 NONAME
- _ZN7QObjectD2Ev @ 1415 NONAME
- _ZN7QRegExp10setMinimalEb @ 1416 NONAME
- _ZN7QRegExp10setPatternERK7QString @ 1417 NONAME
- _ZN7QRegExp11errorStringEv @ 1418 NONAME
- _ZN7QRegExp13capturedTextsEv @ 1419 NONAME
- _ZN7QRegExp16setPatternSyntaxENS_13PatternSyntaxE @ 1420 NONAME
- _ZN7QRegExp18setCaseSensitivityEN2Qt15CaseSensitivityE @ 1421 NONAME
- _ZN7QRegExp3capEi @ 1422 NONAME
- _ZN7QRegExp3posEi @ 1423 NONAME
- _ZN7QRegExp6escapeERK7QString @ 1424 NONAME
- _ZN7QRegExpC1ERK7QStringN2Qt15CaseSensitivityENS_13PatternSyntaxE @ 1425 NONAME
- _ZN7QRegExpC1ERKS_ @ 1426 NONAME
- _ZN7QRegExpC1Ev @ 1427 NONAME
- _ZN7QRegExpC2ERK7QStringN2Qt15CaseSensitivityENS_13PatternSyntaxE @ 1428 NONAME
- _ZN7QRegExpC2ERKS_ @ 1429 NONAME
- _ZN7QRegExpC2Ev @ 1430 NONAME
- _ZN7QRegExpD1Ev @ 1431 NONAME
- _ZN7QRegExpD2Ev @ 1432 NONAME
- _ZN7QRegExpaSERKS_ @ 1433 NONAME
- _ZN7QString10fromLatin1EPKci @ 1434 NONAME
- _ZN7QString10setUnicodeEPK5QChari @ 1435 NONAME
- _ZN7QString11fromRawDataEPK5QChari @ 1436 NONAME
- _ZN7QString11shared_nullE @ 1437 NONAME DATA 20
- _ZN7QString12shared_emptyE @ 1438 NONAME DATA 20
- _ZN7QString13fromLocal8BitEPKci @ 1439 NONAME
- _ZN7QString14compare_helperEPK5QChari13QLatin1StringN2Qt15CaseSensitivityE @ 1440 NONAME
- _ZN7QString14compare_helperEPK5QChariS2_iN2Qt15CaseSensitivityE @ 1441 NONAME
- _ZN7QString14fromWCharArrayEPKwi @ 1442 NONAME
- _ZN7QString14replace_helperEPjiiPK5QChari @ 1443 NONAME
- _ZN7QString16codecForCStringsE @ 1444 NONAME DATA 4
- _ZN7QString16fromAscii_helperEPKci @ 1445 NONAME
- _ZN7QString17fromLatin1_helperEPKci @ 1446 NONAME
- _ZN7QString25localeAwareCompare_helperEPK5QChariS2_i @ 1447 NONAME
- _ZN7QString4chopEi @ 1448 NONAME
- _ZN7QString4fillE5QChari @ 1449 NONAME
- _ZN7QString4freeEPNS_4DataE @ 1450 NONAME
- _ZN7QString4growEi @ 1451 NONAME
- _ZN7QString4nullE @ 1452 NONAME DATA 1
- _ZN7QString6appendE5QChar @ 1453 NONAME
- _ZN7QString6appendERK10QStringRef @ 1454 NONAME
- _ZN7QString6appendERK13QLatin1String @ 1455 NONAME
- _ZN7QString6appendERKS_ @ 1456 NONAME
- _ZN7QString6expandEi @ 1457 NONAME
- _ZN7QString6insertEi5QChar @ 1458 NONAME
- _ZN7QString6insertEiPK5QChari @ 1459 NONAME
- _ZN7QString6insertEiRK13QLatin1String @ 1460 NONAME
- _ZN7QString6numberEdci @ 1461 NONAME
- _ZN7QString6numberEii @ 1462 NONAME
- _ZN7QString6numberEji @ 1463 NONAME
- _ZN7QString6numberEli @ 1464 NONAME
- _ZN7QString6numberEmi @ 1465 NONAME
- _ZN7QString6numberExi @ 1466 NONAME
- _ZN7QString6numberEyi @ 1467 NONAME
- _ZN7QString6removeE5QCharN2Qt15CaseSensitivityE @ 1468 NONAME
- _ZN7QString6removeERKS_N2Qt15CaseSensitivityE @ 1469 NONAME
- _ZN7QString6removeEii @ 1470 NONAME
- _ZN7QString6resizeEi @ 1471 NONAME
- _ZN7QString6setNumEdci @ 1472 NONAME
- _ZN7QString6setNumExi @ 1473 NONAME
- _ZN7QString6setNumEyi @ 1474 NONAME
- _ZN7QString7reallocEi @ 1475 NONAME
- _ZN7QString7reallocEv @ 1476 NONAME
- _ZN7QString7replaceE5QCharRK13QLatin1StringN2Qt15CaseSensitivityE @ 1477 NONAME
- _ZN7QString7replaceE5QCharRKS_N2Qt15CaseSensitivityE @ 1478 NONAME
- _ZN7QString7replaceE5QCharS0_N2Qt15CaseSensitivityE @ 1479 NONAME
- _ZN7QString7replaceEPK5QChariS2_iN2Qt15CaseSensitivityE @ 1480 NONAME
- _ZN7QString7replaceERK13QLatin1StringRKS_N2Qt15CaseSensitivityE @ 1481 NONAME
- _ZN7QString7replaceERK13QLatin1StringS2_N2Qt15CaseSensitivityE @ 1482 NONAME
- _ZN7QString7replaceERK7QRegExpRKS_ @ 1483 NONAME
- _ZN7QString7replaceERKS_RK13QLatin1StringN2Qt15CaseSensitivityE @ 1484 NONAME
- _ZN7QString7replaceERKS_S1_N2Qt15CaseSensitivityE @ 1485 NONAME
- _ZN7QString7replaceEii5QChar @ 1486 NONAME
- _ZN7QString7replaceEiiPK5QChari @ 1487 NONAME
- _ZN7QString7replaceEiiRKS_ @ 1488 NONAME
- _ZN7QString7sprintfEPKcz @ 1489 NONAME
- _ZN7QString8fromUcs4EPKji @ 1490 NONAME
- _ZN7QString8fromUtf8EPKci @ 1491 NONAME
- _ZN7QString8truncateEi @ 1492 NONAME
- _ZN7QString8vsprintfEPKcSt9__va_list @ 1493 NONAME
- _ZN7QString9fromAsciiEPKci @ 1494 NONAME
- _ZN7QString9fromUtf16EPKti @ 1495 NONAME
- _ZN7QStringC1E5QChar @ 1496 NONAME
- _ZN7QStringC1EPK5QChari @ 1497 NONAME
- _ZN7QStringC1Ei5QChar @ 1498 NONAME
- _ZN7QStringC2E5QChar @ 1499 NONAME
- _ZN7QStringC2EPK5QChari @ 1500 NONAME
- _ZN7QStringC2Ei5QChar @ 1501 NONAME
- _ZN7QStringaSE5QChar @ 1502 NONAME
- _ZN7QStringaSERKS_ @ 1503 NONAME
- _ZN7QThread10initializeEv @ 1504 NONAME
- _ZN7QThread10terminatedEv @ 1505 NONAME
- _ZN7QThread11qt_metacallEN11QMetaObject4CallEiPPv @ 1506 NONAME
- _ZN7QThread11qt_metacastEPKc @ 1507 NONAME
- _ZN7QThread11setPriorityENS_8PriorityE @ 1508 NONAME
- _ZN7QThread12setStackSizeEj @ 1509 NONAME
- _ZN7QThread13currentThreadEv @ 1510 NONAME
- _ZN7QThread15currentThreadIdEv @ 1511 NONAME
- _ZN7QThread16idealThreadCountEv @ 1512 NONAME
- _ZN7QThread16staticMetaObjectE @ 1513 NONAME DATA 16
- _ZN7QThread18yieldCurrentThreadEv @ 1514 NONAME
- _ZN7QThread21setTerminationEnabledEb @ 1515 NONAME
- _ZN7QThread3runEv @ 1516 NONAME
- _ZN7QThread4execEv @ 1517 NONAME
- _ZN7QThread4exitEi @ 1518 NONAME
- _ZN7QThread4quitEv @ 1519 NONAME
- _ZN7QThread4waitEm @ 1520 NONAME
- _ZN7QThread5sleepEm @ 1521 NONAME
- _ZN7QThread5startENS_8PriorityE @ 1522 NONAME
- _ZN7QThread6msleepEm @ 1523 NONAME
- _ZN7QThread6usleepEm @ 1524 NONAME
- _ZN7QThread7cleanupEv @ 1525 NONAME
- _ZN7QThread7startedEv @ 1526 NONAME
- _ZN7QThread8finishedEv @ 1527 NONAME
- _ZN7QThread9terminateEv @ 1528 NONAME
- _ZN7QThreadC1EP7QObject @ 1529 NONAME
- _ZN7QThreadC1ER14QThreadPrivateP7QObject @ 1530 NONAME
- _ZN7QThreadC2EP7QObject @ 1531 NONAME
- _ZN7QThreadC2ER14QThreadPrivateP7QObject @ 1532 NONAME
- _ZN7QThreadD0Ev @ 1533 NONAME
- _ZN7QThreadD1Ev @ 1534 NONAME
- _ZN7QThreadD2Ev @ 1535 NONAME
- _ZN8QLibrary11qt_metacallEN11QMetaObject4CallEiPPv @ 1536 NONAME
- _ZN8QLibrary11qt_metacastEPKc @ 1537 NONAME
- _ZN8QLibrary11setFileNameERK7QString @ 1538 NONAME
- _ZN8QLibrary12setLoadHintsE6QFlagsINS_8LoadHintEE @ 1539 NONAME
- _ZN8QLibrary16staticMetaObjectE @ 1540 NONAME DATA 16
- _ZN8QLibrary21setFileNameAndVersionERK7QStringS2_ @ 1541 NONAME
- _ZN8QLibrary21setFileNameAndVersionERK7QStringi @ 1542 NONAME
- _ZN8QLibrary4loadEv @ 1543 NONAME
- _ZN8QLibrary6unloadEv @ 1544 NONAME
- _ZN8QLibrary7resolveEPKc @ 1545 NONAME
- _ZN8QLibrary7resolveERK7QStringPKc @ 1546 NONAME
- _ZN8QLibrary7resolveERK7QStringS2_PKc @ 1547 NONAME
- _ZN8QLibrary7resolveERK7QStringiPKc @ 1548 NONAME
- _ZN8QLibrary9isLibraryERK7QString @ 1549 NONAME
- _ZN8QLibraryC1EP7QObject @ 1550 NONAME
- _ZN8QLibraryC1ERK7QStringP7QObject @ 1551 NONAME
- _ZN8QLibraryC1ERK7QStringS2_P7QObject @ 1552 NONAME
- _ZN8QLibraryC1ERK7QStringiP7QObject @ 1553 NONAME
- _ZN8QLibraryC2EP7QObject @ 1554 NONAME
- _ZN8QLibraryC2ERK7QStringP7QObject @ 1555 NONAME
- _ZN8QLibraryC2ERK7QStringS2_P7QObject @ 1556 NONAME
- _ZN8QLibraryC2ERK7QStringiP7QObject @ 1557 NONAME
- _ZN8QLibraryD0Ev @ 1558 NONAME
- _ZN8QLibraryD1Ev @ 1559 NONAME
- _ZN8QLibraryD2Ev @ 1560 NONAME
- _ZN8QMapData10createDataEv @ 1561 NONAME
- _ZN8QMapData11node_createEPPNS_4NodeEi @ 1562 NONAME
- _ZN8QMapData11node_deleteEPPNS_4NodeEiS1_ @ 1563 NONAME
- _ZN8QMapData11shared_nullE @ 1564 NONAME DATA 72
- _ZN8QMapData16continueFreeDataEi @ 1565 NONAME
- _ZN8QProcess11qt_metacallEN11QMetaObject4CallEiPPv @ 1566 NONAME
- _ZN8QProcess11qt_metacastEPKc @ 1567 NONAME
- _ZN8QProcess12stateChangedENS_12ProcessStateE @ 1568 NONAME
- _ZN8QProcess13startDetachedERK7QString @ 1569 NONAME
- _ZN8QProcess13startDetachedERK7QStringRK11QStringList @ 1570 NONAME
- _ZN8QProcess13startDetachedERK7QStringRK11QStringListS2_Px @ 1571 NONAME
- _ZN8QProcess14setEnvironmentERK11QStringList @ 1572 NONAME
- _ZN8QProcess14setReadChannelENS_14ProcessChannelE @ 1573 NONAME
- _ZN8QProcess14waitForStartedEi @ 1574 NONAME
- _ZN8QProcess15setProcessStateENS_12ProcessStateE @ 1575 NONAME
- _ZN8QProcess15waitForFinishedEi @ 1576 NONAME
- _ZN8QProcess16closeReadChannelENS_14ProcessChannelE @ 1577 NONAME
- _ZN8QProcess16staticMetaObjectE @ 1578 NONAME DATA 16
- _ZN8QProcess16waitForReadyReadEi @ 1579 NONAME
- _ZN8QProcess17closeWriteChannelEv @ 1580 NONAME
- _ZN8QProcess17setupChildProcessEv @ 1581 NONAME
- _ZN8QProcess17systemEnvironmentEv @ 1582 NONAME
- _ZN8QProcess18setReadChannelModeENS_18ProcessChannelModeE @ 1583 NONAME
- _ZN8QProcess19setWorkingDirectoryERK7QString @ 1584 NONAME
- _ZN8QProcess19waitForBytesWrittenEi @ 1585 NONAME
- _ZN8QProcess20readAllStandardErrorEv @ 1586 NONAME
- _ZN8QProcess20setStandardErrorFileERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1587 NONAME
- _ZN8QProcess20setStandardInputFileERK7QString @ 1588 NONAME
- _ZN8QProcess21readAllStandardOutputEv @ 1589 NONAME
- _ZN8QProcess21setProcessChannelModeENS_18ProcessChannelModeE @ 1590 NONAME
- _ZN8QProcess21setStandardOutputFileERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1591 NONAME
- _ZN8QProcess22readyReadStandardErrorEv @ 1592 NONAME
- _ZN8QProcess23readyReadStandardOutputEv @ 1593 NONAME
- _ZN8QProcess24setStandardOutputProcessEPS_ @ 1594 NONAME
- _ZN8QProcess4killEv @ 1595 NONAME
- _ZN8QProcess5closeEv @ 1596 NONAME
- _ZN8QProcess5errorENS_12ProcessErrorE @ 1597 NONAME
- _ZN8QProcess5startERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1598 NONAME
- _ZN8QProcess5startERK7QStringRK11QStringList6QFlagsIN9QIODevice12OpenModeFlagEE @ 1599 NONAME
- _ZN8QProcess7executeERK7QString @ 1600 NONAME
- _ZN8QProcess7executeERK7QStringRK11QStringList @ 1601 NONAME
- _ZN8QProcess7startedEv @ 1602 NONAME
- _ZN8QProcess8finishedEi @ 1603 NONAME
- _ZN8QProcess8finishedEiNS_10ExitStatusE @ 1604 NONAME
- _ZN8QProcess8readDataEPcx @ 1605 NONAME
- _ZN8QProcess9terminateEv @ 1606 NONAME
- _ZN8QProcess9writeDataEPKcx @ 1607 NONAME
- _ZN8QProcessC1EP7QObject @ 1608 NONAME
- _ZN8QProcessC2EP7QObject @ 1609 NONAME
- _ZN8QProcessD0Ev @ 1610 NONAME
- _ZN8QProcessD1Ev @ 1611 NONAME
- _ZN8QProcessD2Ev @ 1612 NONAME
- _ZN8QSysInfo10s60VersionEv @ 1613 NONAME
- _ZN8QSysInfo14symbianVersionEv @ 1614 NONAME
- _ZN8QVariant10nameToTypeEPKc @ 1615 NONAME
- _ZN8QVariant10typeToNameENS_4TypeE @ 1616 NONAME
- _ZN8QVariant4dataEv @ 1617 NONAME
- _ZN8QVariant4loadER11QDataStream @ 1618 NONAME
- _ZN8QVariant5clearEv @ 1619 NONAME
- _ZN8QVariant6createEiPKv @ 1620 NONAME
- _ZN8QVariant6detachEv @ 1621 NONAME
- _ZN8QVariant7convertENS_4TypeE @ 1622 NONAME
- _ZN8QVariant7handlerE @ 1623 NONAME DATA 4
- _ZN8QVariantC1EN2Qt11GlobalColorE @ 1624 NONAME
- _ZN8QVariantC1ENS_4TypeE @ 1625 NONAME
- _ZN8QVariantC1EPKc @ 1626 NONAME
- _ZN8QVariantC1ER11QDataStream @ 1627 NONAME
- _ZN8QVariantC1ERK10QByteArray @ 1628 NONAME
- _ZN8QVariantC1ERK11QStringList @ 1629 NONAME
- _ZN8QVariantC1ERK13QLatin1String @ 1630 NONAME
- _ZN8QVariantC1ERK4QMapI7QStringS_E @ 1631 NONAME
- _ZN8QVariantC1ERK4QUrl @ 1632 NONAME
- _ZN8QVariantC1ERK5QChar @ 1633 NONAME
- _ZN8QVariantC1ERK5QDate @ 1634 NONAME
- _ZN8QVariantC1ERK5QHashI7QStringS_E @ 1635 NONAME
- _ZN8QVariantC1ERK5QLine @ 1636 NONAME
- _ZN8QVariantC1ERK5QListIS_E @ 1637 NONAME
- _ZN8QVariantC1ERK5QRect @ 1638 NONAME
- _ZN8QVariantC1ERK5QSize @ 1639 NONAME
- _ZN8QVariantC1ERK5QTime @ 1640 NONAME
- _ZN8QVariantC1ERK6QLineF @ 1641 NONAME
- _ZN8QVariantC1ERK6QPoint @ 1642 NONAME
- _ZN8QVariantC1ERK6QRectF @ 1643 NONAME
- _ZN8QVariantC1ERK6QSizeF @ 1644 NONAME
- _ZN8QVariantC1ERK7QLocale @ 1645 NONAME
- _ZN8QVariantC1ERK7QPointF @ 1646 NONAME
- _ZN8QVariantC1ERK7QRegExp @ 1647 NONAME
- _ZN8QVariantC1ERK7QString @ 1648 NONAME
- _ZN8QVariantC1ERK9QBitArray @ 1649 NONAME
- _ZN8QVariantC1ERK9QDateTime @ 1650 NONAME
- _ZN8QVariantC1ERKS_ @ 1651 NONAME
- _ZN8QVariantC1Eb @ 1652 NONAME
- _ZN8QVariantC1Ed @ 1653 NONAME
- _ZN8QVariantC1Ei @ 1654 NONAME
- _ZN8QVariantC1EiPKv @ 1655 NONAME
- _ZN8QVariantC1Ej @ 1656 NONAME
- _ZN8QVariantC1Ex @ 1657 NONAME
- _ZN8QVariantC1Ey @ 1658 NONAME
- _ZN8QVariantC2EN2Qt11GlobalColorE @ 1659 NONAME
- _ZN8QVariantC2ENS_4TypeE @ 1660 NONAME
- _ZN8QVariantC2EPKc @ 1661 NONAME
- _ZN8QVariantC2ER11QDataStream @ 1662 NONAME
- _ZN8QVariantC2ERK10QByteArray @ 1663 NONAME
- _ZN8QVariantC2ERK11QStringList @ 1664 NONAME
- _ZN8QVariantC2ERK13QLatin1String @ 1665 NONAME
- _ZN8QVariantC2ERK4QMapI7QStringS_E @ 1666 NONAME
- _ZN8QVariantC2ERK4QUrl @ 1667 NONAME
- _ZN8QVariantC2ERK5QChar @ 1668 NONAME
- _ZN8QVariantC2ERK5QDate @ 1669 NONAME
- _ZN8QVariantC2ERK5QHashI7QStringS_E @ 1670 NONAME
- _ZN8QVariantC2ERK5QLine @ 1671 NONAME
- _ZN8QVariantC2ERK5QListIS_E @ 1672 NONAME
- _ZN8QVariantC2ERK5QRect @ 1673 NONAME
- _ZN8QVariantC2ERK5QSize @ 1674 NONAME
- _ZN8QVariantC2ERK5QTime @ 1675 NONAME
- _ZN8QVariantC2ERK6QLineF @ 1676 NONAME
- _ZN8QVariantC2ERK6QPoint @ 1677 NONAME
- _ZN8QVariantC2ERK6QRectF @ 1678 NONAME
- _ZN8QVariantC2ERK6QSizeF @ 1679 NONAME
- _ZN8QVariantC2ERK7QLocale @ 1680 NONAME
- _ZN8QVariantC2ERK7QPointF @ 1681 NONAME
- _ZN8QVariantC2ERK7QRegExp @ 1682 NONAME
- _ZN8QVariantC2ERK7QString @ 1683 NONAME
- _ZN8QVariantC2ERK9QBitArray @ 1684 NONAME
- _ZN8QVariantC2ERK9QDateTime @ 1685 NONAME
- _ZN8QVariantC2ERKS_ @ 1686 NONAME
- _ZN8QVariantC2Eb @ 1687 NONAME
- _ZN8QVariantC2Ed @ 1688 NONAME
- _ZN8QVariantC2Ei @ 1689 NONAME
- _ZN8QVariantC2EiPKv @ 1690 NONAME
- _ZN8QVariantC2Ej @ 1691 NONAME
- _ZN8QVariantC2Ex @ 1692 NONAME
- _ZN8QVariantC2Ey @ 1693 NONAME
- _ZN8QVariantD1Ev @ 1694 NONAME
- _ZN8QVariantD2Ev @ 1695 NONAME
- _ZN8QVariantaSERKS_ @ 1696 NONAME
- _ZN9QBitArray4fillEbii @ 1697 NONAME
- _ZN9QBitArray6resizeEi @ 1698 NONAME
- _ZN9QBitArrayC1Eib @ 1699 NONAME
- _ZN9QBitArrayC2Eib @ 1700 NONAME
- _ZN9QBitArrayaNERKS_ @ 1701 NONAME
- _ZN9QBitArrayeOERKS_ @ 1702 NONAME
- _ZN9QBitArrayoRERKS_ @ 1703 NONAME
- _ZN9QConfFile10clearCacheEv @ 1704 NONAME
- _ZN9QConfFile8fromNameERK7QStringb @ 1705 NONAME
- _ZN9QConfFileC1ERK7QStringb @ 1706 NONAME
- _ZN9QConfFileC2ERK7QStringb @ 1707 NONAME
- _ZN9QDateTime10fromStringERK7QStringN2Qt10DateFormatE @ 1708 NONAME
- _ZN9QDateTime10fromStringERK7QStringS2_ @ 1709 NONAME
- _ZN9QDateTime10fromTime_tEj @ 1710 NONAME
- _ZN9QDateTime11setTimeSpecEN2Qt8TimeSpecE @ 1711 NONAME
- _ZN9QDateTime12setUtcOffsetEi @ 1712 NONAME
- _ZN9QDateTime15currentDateTimeEv @ 1713 NONAME
- _ZN9QDateTime6detachEv @ 1714 NONAME
- _ZN9QDateTime7setDateERK5QDate @ 1715 NONAME
- _ZN9QDateTime7setTimeERK5QTime @ 1716 NONAME
- _ZN9QDateTime9setTime_tEj @ 1717 NONAME
- _ZN9QDateTimeC1ERK5QDate @ 1718 NONAME
- _ZN9QDateTimeC1ERK5QDateRK5QTimeN2Qt8TimeSpecE @ 1719 NONAME
- _ZN9QDateTimeC1ERKS_ @ 1720 NONAME
- _ZN9QDateTimeC1Ev @ 1721 NONAME
- _ZN9QDateTimeC2ERK5QDate @ 1722 NONAME
- _ZN9QDateTimeC2ERK5QDateRK5QTimeN2Qt8TimeSpecE @ 1723 NONAME
- _ZN9QDateTimeC2ERKS_ @ 1724 NONAME
- _ZN9QDateTimeC2Ev @ 1725 NONAME
- _ZN9QDateTimeD1Ev @ 1726 NONAME
- _ZN9QDateTimeD2Ev @ 1727 NONAME
- _ZN9QDateTimeaSERKS_ @ 1728 NONAME
- _ZN9QFileInfo10setCachingEb @ 1729 NONAME
- _ZN9QFileInfo12makeAbsoluteEv @ 1730 NONAME
- _ZN9QFileInfo6detachEv @ 1731 NONAME
- _ZN9QFileInfo7refreshEv @ 1732 NONAME
- _ZN9QFileInfo7setFileERK4QDirRK7QString @ 1733 NONAME
- _ZN9QFileInfo7setFileERK5QFile @ 1734 NONAME
- _ZN9QFileInfo7setFileERK7QString @ 1735 NONAME
- _ZN9QFileInfoC1ERK4QDirRK7QString @ 1736 NONAME
- _ZN9QFileInfoC1ERK5QFile @ 1737 NONAME
- _ZN9QFileInfoC1ERK7QString @ 1738 NONAME
- _ZN9QFileInfoC1ERKS_ @ 1739 NONAME
- _ZN9QFileInfoC1Ev @ 1740 NONAME
- _ZN9QFileInfoC2ERK4QDirRK7QString @ 1741 NONAME
- _ZN9QFileInfoC2ERK5QFile @ 1742 NONAME
- _ZN9QFileInfoC2ERK7QString @ 1743 NONAME
- _ZN9QFileInfoC2ERKS_ @ 1744 NONAME
- _ZN9QFileInfoC2Ev @ 1745 NONAME
- _ZN9QFileInfoD1Ev @ 1746 NONAME
- _ZN9QFileInfoD2Ev @ 1747 NONAME
- _ZN9QFileInfoaSERKS_ @ 1748 NONAME
- _ZN9QFileInfoeqERKS_ @ 1749 NONAME
- _ZN9QHashData11free_helperEPFvPNS_4NodeEE @ 1750 NONAME
- _ZN9QHashData11shared_nullE @ 1751 NONAME DATA 32
- _ZN9QHashData12allocateNodeEv @ 1752 NONAME
- _ZN9QHashData12previousNodeEPNS_4NodeE @ 1753 NONAME
- _ZN9QHashData13detach_helperEPFvPNS_4NodeEPvEPFvS1_Ei @ 1754 NONAME
- _ZN9QHashData13detach_helperEPFvPNS_4NodeEPvEi @ 1755 NONAME
- _ZN9QHashData14destroyAndFreeEv @ 1756 NONAME
- _ZN9QHashData6rehashEi @ 1757 NONAME
- _ZN9QHashData8freeNodeEPv @ 1758 NONAME
- _ZN9QHashData8nextNodeEPNS_4NodeE @ 1759 NONAME
- _ZN9QIODevice11qt_metacallEN11QMetaObject4CallEiPPv @ 1760 NONAME
- _ZN9QIODevice11qt_metacastEPKc @ 1761 NONAME
- _ZN9QIODevice11setOpenModeE6QFlagsINS_12OpenModeFlagEE @ 1762 NONAME
- _ZN9QIODevice12aboutToCloseEv @ 1763 NONAME
- _ZN9QIODevice12bytesWrittenEx @ 1764 NONAME
- _ZN9QIODevice12readLineDataEPcx @ 1765 NONAME
- _ZN9QIODevice14setErrorStringERK7QString @ 1766 NONAME
- _ZN9QIODevice16staticMetaObjectE @ 1767 NONAME DATA 16
- _ZN9QIODevice16waitForReadyReadEi @ 1768 NONAME
- _ZN9QIODevice18setTextModeEnabledEb @ 1769 NONAME
- _ZN9QIODevice19readChannelFinishedEv @ 1770 NONAME
- _ZN9QIODevice19waitForBytesWrittenEi @ 1771 NONAME
- _ZN9QIODevice4openE6QFlagsINS_12OpenModeFlagEE @ 1772 NONAME
- _ZN9QIODevice4peekEPcx @ 1773 NONAME
- _ZN9QIODevice4peekEx @ 1774 NONAME
- _ZN9QIODevice4readEPcx @ 1775 NONAME
- _ZN9QIODevice4readEx @ 1776 NONAME
- _ZN9QIODevice4seekEx @ 1777 NONAME
- _ZN9QIODevice5closeEv @ 1778 NONAME
- _ZN9QIODevice5resetEv @ 1779 NONAME
- _ZN9QIODevice5writeEPKc @ 1780 NONAME
- _ZN9QIODevice5writeEPKcx @ 1781 NONAME
- _ZN9QIODevice7getCharEPc @ 1782 NONAME
- _ZN9QIODevice7putCharEc @ 1783 NONAME
- _ZN9QIODevice7readAllEv @ 1784 NONAME
- _ZN9QIODevice8readLineEPcx @ 1785 NONAME
- _ZN9QIODevice8readLineEx @ 1786 NONAME
- _ZN9QIODevice9readyReadEv @ 1787 NONAME
- _ZN9QIODevice9ungetCharEc @ 1788 NONAME
- _ZN9QIODeviceC2EP7QObject @ 1789 NONAME
- _ZN9QIODeviceC2ER16QIODevicePrivateP7QObject @ 1790 NONAME
- _ZN9QIODeviceC2Ev @ 1791 NONAME
- _ZN9QIODeviceD0Ev @ 1792 NONAME
- _ZN9QIODeviceD1Ev @ 1793 NONAME
- _ZN9QIODeviceD2Ev @ 1794 NONAME
- _ZN9QInternal12callFunctionENS_16InternalFunctionEPPv @ 1795 NONAME
- _ZN9QInternal16registerCallbackENS_8CallbackEPFbPPvE @ 1796 NONAME
- _ZN9QInternal17activateCallbacksENS_8CallbackEPPv @ 1797 NONAME
- _ZN9QInternal18unregisterCallbackENS_8CallbackEPFbPPvE @ 1798 NONAME
- _ZN9QListData11shared_nullE @ 1799 NONAME DATA 24
- _ZN9QListData4moveEii @ 1800 NONAME
- _ZN9QListData5eraseEPPv @ 1801 NONAME
- _ZN9QListData6appendERKS_ @ 1802 NONAME
- _ZN9QListData6appendEv @ 1803 NONAME
- _ZN9QListData6detachEv @ 1804 NONAME
- _ZN9QListData6insertEi @ 1805 NONAME
- _ZN9QListData6removeEi @ 1806 NONAME
- _ZN9QListData6removeEii @ 1807 NONAME
- _ZN9QListData7detach2Ev @ 1808 NONAME
- _ZN9QListData7prependEv @ 1809 NONAME
- _ZN9QListData7reallocEi @ 1810 NONAME
- _ZN9QMetaType12isRegisteredEi @ 1811 NONAME
- _ZN9QMetaType12registerTypeEPKcPFvPvEPFS2_PKvE @ 1812 NONAME
- _ZN9QMetaType14unregisterTypeEPKc @ 1813 NONAME
- _ZN9QMetaType23registerStreamOperatorsEPKcPFvR11QDataStreamPKvEPFvS3_PvE @ 1814 NONAME
- _ZN9QMetaType4loadER11QDataStreamiPv @ 1815 NONAME
- _ZN9QMetaType4saveER11QDataStreamiPKv @ 1816 NONAME
- _ZN9QMetaType4typeEPKc @ 1817 NONAME
- _ZN9QMetaType7destroyEiPv @ 1818 NONAME
- _ZN9QMetaType8typeNameEi @ 1819 NONAME
- _ZN9QMetaType9constructEiPKv @ 1820 NONAME
- _ZN9QMimeData11qt_metacallEN11QMetaObject4CallEiPPv @ 1821 NONAME
- _ZN9QMimeData11qt_metacastEPKc @ 1822 NONAME
- _ZN9QMimeData12removeFormatERK7QString @ 1823 NONAME
- _ZN9QMimeData12setColorDataERK8QVariant @ 1824 NONAME
- _ZN9QMimeData12setImageDataERK8QVariant @ 1825 NONAME
- _ZN9QMimeData16staticMetaObjectE @ 1826 NONAME DATA 16
- _ZN9QMimeData5clearEv @ 1827 NONAME
- _ZN9QMimeData7setDataERK7QStringRK10QByteArray @ 1828 NONAME
- _ZN9QMimeData7setHtmlERK7QString @ 1829 NONAME
- _ZN9QMimeData7setTextERK7QString @ 1830 NONAME
- _ZN9QMimeData7setUrlsERK5QListI4QUrlE @ 1831 NONAME
- _ZN9QMimeDataC1Ev @ 1832 NONAME
- _ZN9QMimeDataC2Ev @ 1833 NONAME
- _ZN9QMimeDataD0Ev @ 1834 NONAME
- _ZN9QMimeDataD1Ev @ 1835 NONAME
- _ZN9QMimeDataD2Ev @ 1836 NONAME
- _ZN9QResource11searchPathsEv @ 1837 NONAME
- _ZN9QResource11setFileNameERK7QString @ 1838 NONAME
- _ZN9QResource13addSearchPathERK7QString @ 1839 NONAME
- _ZN9QResource16registerResourceEPKhRK7QString @ 1840 NONAME
- _ZN9QResource16registerResourceERK7QStringS2_ @ 1841 NONAME
- _ZN9QResource18unregisterResourceEPKhRK7QString @ 1842 NONAME
- _ZN9QResource18unregisterResourceERK7QStringS2_ @ 1843 NONAME
- _ZN9QResource9setLocaleERK7QLocale @ 1844 NONAME
- _ZN9QResourceC1ERK7QStringRK7QLocale @ 1845 NONAME
- _ZN9QResourceC2ERK7QStringRK7QLocale @ 1846 NONAME
- _ZN9QResourceD1Ev @ 1847 NONAME
- _ZN9QResourceD2Ev @ 1848 NONAME
- _ZN9QSettings10beginGroupERK7QString @ 1849 NONAME
- _ZN9QSettings11qt_metacallEN11QMetaObject4CallEiPPv @ 1850 NONAME
- _ZN9QSettings11qt_metacastEPKc @ 1851 NONAME
- _ZN9QSettings11setIniCodecEP10QTextCodec @ 1852 NONAME
- _ZN9QSettings11setIniCodecEPKc @ 1853 NONAME
- _ZN9QSettings13defaultFormatEv @ 1854 NONAME
- _ZN9QSettings13setArrayIndexEi @ 1855 NONAME
- _ZN9QSettings14beginReadArrayERK7QString @ 1856 NONAME
- _ZN9QSettings14registerFormatERK7QStringPFbR9QIODeviceR4QMapIS0_8QVariantEEPFbS4_RKS7_EN2Qt15CaseSensitivityE @ 1857 NONAME
- _ZN9QSettings14setUserIniPathERK7QString @ 1858 NONAME
- _ZN9QSettings15beginWriteArrayERK7QStringi @ 1859 NONAME
- _ZN9QSettings16setDefaultFormatENS_6FormatE @ 1860 NONAME
- _ZN9QSettings16setSystemIniPathERK7QString @ 1861 NONAME
- _ZN9QSettings16staticMetaObjectE @ 1862 NONAME DATA 16
- _ZN9QSettings19setFallbacksEnabledEb @ 1863 NONAME
- _ZN9QSettings4syncEv @ 1864 NONAME
- _ZN9QSettings5clearEv @ 1865 NONAME
- _ZN9QSettings5eventEP6QEvent @ 1866 NONAME
- _ZN9QSettings6removeERK7QString @ 1867 NONAME
- _ZN9QSettings7setPathENS_6FormatENS_5ScopeERK7QString @ 1868 NONAME
- _ZN9QSettings8endArrayEv @ 1869 NONAME
- _ZN9QSettings8endGroupEv @ 1870 NONAME
- _ZN9QSettings8setValueERK7QStringRK8QVariant @ 1871 NONAME
- _ZN9QSettingsC1ENS_5ScopeERK7QStringS3_P7QObject @ 1872 NONAME
- _ZN9QSettingsC1ENS_6FormatENS_5ScopeERK7QStringS4_P7QObject @ 1873 NONAME
- _ZN9QSettingsC1EP7QObject @ 1874 NONAME
- _ZN9QSettingsC1ERK7QStringNS_6FormatEP7QObject @ 1875 NONAME
- _ZN9QSettingsC1ERK7QStringS2_P7QObject @ 1876 NONAME
- _ZN9QSettingsC2ENS_5ScopeERK7QStringS3_P7QObject @ 1877 NONAME
- _ZN9QSettingsC2ENS_6FormatENS_5ScopeERK7QStringS4_P7QObject @ 1878 NONAME
- _ZN9QSettingsC2EP7QObject @ 1879 NONAME
- _ZN9QSettingsC2ERK7QStringNS_6FormatEP7QObject @ 1880 NONAME
- _ZN9QSettingsC2ERK7QStringS2_P7QObject @ 1881 NONAME
- _ZN9QSettingsD0Ev @ 1882 NONAME
- _ZN9QSettingsD1Ev @ 1883 NONAME
- _ZN9QSettingsD2Ev @ 1884 NONAME
- _ZN9QTimeLine10timerEventEP11QTimerEvent @ 1885 NONAME
- _ZN9QTimeLine11qt_metacallEN11QMetaObject4CallEiPPv @ 1886 NONAME
- _ZN9QTimeLine11qt_metacastEPKc @ 1887 NONAME
- _ZN9QTimeLine11setDurationEi @ 1888 NONAME
- _ZN9QTimeLine11setEndFrameEi @ 1889 NONAME
- _ZN9QTimeLine12frameChangedEi @ 1890 NONAME
- _ZN9QTimeLine12setDirectionENS_9DirectionE @ 1891 NONAME
- _ZN9QTimeLine12setLoopCountEi @ 1892 NONAME
- _ZN9QTimeLine12stateChangedENS_5StateE @ 1893 NONAME
- _ZN9QTimeLine12valueChangedEf @ 1894 NONAME
- _ZN9QTimeLine13setCurveShapeENS_10CurveShapeE @ 1895 NONAME
- _ZN9QTimeLine13setFrameRangeEii @ 1896 NONAME
- _ZN9QTimeLine13setStartFrameEi @ 1897 NONAME
- _ZN9QTimeLine14setCurrentTimeEi @ 1898 NONAME
- _ZN9QTimeLine15toggleDirectionEv @ 1899 NONAME
- _ZN9QTimeLine16staticMetaObjectE @ 1900 NONAME DATA 16
- _ZN9QTimeLine17setUpdateIntervalEi @ 1901 NONAME
- _ZN9QTimeLine4stopEv @ 1902 NONAME
- _ZN9QTimeLine5startEv @ 1903 NONAME
- _ZN9QTimeLine6resumeEv @ 1904 NONAME
- _ZN9QTimeLine8finishedEv @ 1905 NONAME
- _ZN9QTimeLine9setPausedEb @ 1906 NONAME
- _ZN9QTimeLineC1EiP7QObject @ 1907 NONAME
- _ZN9QTimeLineC2EiP7QObject @ 1908 NONAME
- _ZN9QTimeLineD0Ev @ 1909 NONAME
- _ZN9QTimeLineD1Ev @ 1910 NONAME
- _ZN9QTimeLineD2Ev @ 1911 NONAME
- _ZN9QXmlUtils10isBaseCharE5QChar @ 1912 NONAME
- _ZN9QXmlUtils10isExtenderE5QChar @ 1913 NONAME
- _ZN9QXmlUtils10isNameCharE5QChar @ 1914 NONAME
- _ZN9QXmlUtils10isPublicIDERK7QString @ 1915 NONAME
- _ZN9QXmlUtils13isIdeographicE5QChar @ 1916 NONAME
- _ZN9QXmlUtils13rangeContainsEPK13QXmlCharRangeS2_5QChar @ 1917 NONAME
- _ZN9QXmlUtils15isCombiningCharE5QChar @ 1918 NONAME
- _ZN9QXmlUtils6isCharE5QChar @ 1919 NONAME
- _ZN9QXmlUtils7isDigitE5QChar @ 1920 NONAME
- _ZN9QXmlUtils8isLetterE5QChar @ 1921 NONAME
- _ZN9QXmlUtils8isNCNameERK10QStringRef @ 1922 NONAME
- _ZN9QXmlUtils9isEncNameERK7QString @ 1923 NONAME
- _ZN9QtPrivate16QStringList_joinEPK11QStringListRK7QString @ 1924 NONAME
- _ZN9QtPrivate16QStringList_sortEP11QStringList @ 1925 NONAME
- _ZN9QtPrivate18QStringList_filterEPK11QStringListRK7QRegExp @ 1926 NONAME
- _ZN9QtPrivate18QStringList_filterEPK11QStringListRK7QStringN2Qt15CaseSensitivityE @ 1927 NONAME
- _ZN9QtPrivate19QStringList_indexOfEPK11QStringListR7QRegExpi @ 1928 NONAME
- _ZN9QtPrivate19QStringList_indexOfEPK11QStringListRK7QRegExpi @ 1929 NONAME
- _ZN9QtPrivate20QStringList_containsEPK11QStringListRK7QStringN2Qt15CaseSensitivityE @ 1930 NONAME
- _ZN9QtPrivate23QStringList_lastIndexOfEPK11QStringListR7QRegExpi @ 1931 NONAME
- _ZN9QtPrivate23QStringList_lastIndexOfEPK11QStringListRK7QRegExpi @ 1932 NONAME
- _ZN9QtPrivate28QStringList_removeDuplicatesEP11QStringList @ 1933 NONAME
- _ZN9QtPrivate28QStringList_replaceInStringsEP11QStringListRK7QRegExpRK7QString @ 1934 NONAME
- _ZN9QtPrivate28QStringList_replaceInStringsEP11QStringListRK7QStringS4_N2Qt15CaseSensitivityE @ 1935 NONAME
- _ZNK10QByteArray10simplifiedEv @ 1936 NONAME
- _ZNK10QByteArray10startsWithEPKc @ 1937 NONAME
- _ZNK10QByteArray10startsWithERKS_ @ 1938 NONAME
- _ZNK10QByteArray10startsWithEc @ 1939 NONAME
- _ZNK10QByteArray10toLongLongEPbi @ 1940 NONAME
- _ZNK10QByteArray11lastIndexOfEPKci @ 1941 NONAME
- _ZNK10QByteArray11lastIndexOfERKS_i @ 1942 NONAME
- _ZNK10QByteArray11lastIndexOfEci @ 1943 NONAME
- _ZNK10QByteArray11toULongLongEPbi @ 1944 NONAME
- _ZNK10QByteArray13leftJustifiedEicb @ 1945 NONAME
- _ZNK10QByteArray13nulTerminatedEv @ 1946 NONAME
- _ZNK10QByteArray14rightJustifiedEicb @ 1947 NONAME
- _ZNK10QByteArray17toPercentEncodingERKS_S1_c @ 1948 NONAME
- _ZNK10QByteArray3midEii @ 1949 NONAME
- _ZNK10QByteArray4leftEi @ 1950 NONAME
- _ZNK10QByteArray5countEPKc @ 1951 NONAME
- _ZNK10QByteArray5countERKS_ @ 1952 NONAME
- _ZNK10QByteArray5countEc @ 1953 NONAME
- _ZNK10QByteArray5rightEi @ 1954 NONAME
- _ZNK10QByteArray5splitEc @ 1955 NONAME
- _ZNK10QByteArray5toHexEv @ 1956 NONAME
- _ZNK10QByteArray5toIntEPbi @ 1957 NONAME
- _ZNK10QByteArray6isNullEv @ 1958 NONAME
- _ZNK10QByteArray6toLongEPbi @ 1959 NONAME
- _ZNK10QByteArray6toUIntEPbi @ 1960 NONAME
- _ZNK10QByteArray7indexOfEPKci @ 1961 NONAME
- _ZNK10QByteArray7indexOfERKS_i @ 1962 NONAME
- _ZNK10QByteArray7indexOfEci @ 1963 NONAME
- _ZNK10QByteArray7toFloatEPb @ 1964 NONAME
- _ZNK10QByteArray7toLowerEv @ 1965 NONAME
- _ZNK10QByteArray7toShortEPbi @ 1966 NONAME
- _ZNK10QByteArray7toULongEPbi @ 1967 NONAME
- _ZNK10QByteArray7toUpperEv @ 1968 NONAME
- _ZNK10QByteArray7trimmedEv @ 1969 NONAME
- _ZNK10QByteArray8endsWithEPKc @ 1970 NONAME
- _ZNK10QByteArray8endsWithERKS_ @ 1971 NONAME
- _ZNK10QByteArray8endsWithEc @ 1972 NONAME
- _ZNK10QByteArray8repeatedEi @ 1973 NONAME
- _ZNK10QByteArray8toBase64Ev @ 1974 NONAME
- _ZNK10QByteArray8toDoubleEPb @ 1975 NONAME
- _ZNK10QByteArray8toUShortEPbi @ 1976 NONAME
- _ZNK10QEventLoop10metaObjectEv @ 1977 NONAME
- _ZNK10QEventLoop9isRunningEv @ 1978 NONAME
- _ZNK10QSemaphore9availableEv @ 1979 NONAME
- _ZNK10QStringRef8appendToEP7QString @ 1980 NONAME
- _ZNK10QStringRef8toStringEv @ 1981 NONAME
- _ZNK10QTextCodec11fromUnicodeERK7QString @ 1982 NONAME
- _ZNK10QTextCodec11makeDecoderEv @ 1983 NONAME
- _ZNK10QTextCodec11makeEncoderEv @ 1984 NONAME
- _ZNK10QTextCodec7aliasesEv @ 1985 NONAME
- _ZNK10QTextCodec9canEncodeE5QChar @ 1986 NONAME
- _ZNK10QTextCodec9canEncodeERK7QString @ 1987 NONAME
- _ZNK10QTextCodec9toUnicodeEPKc @ 1988 NONAME
- _ZNK10QTextCodec9toUnicodeERK10QByteArray @ 1989 NONAME
- _ZNK11QDataStream5atEndEv @ 1990 NONAME
- _ZNK11QDataStream6statusEv @ 1991 NONAME
- _ZNK11QMetaMethod10attributesEv @ 1992 NONAME
- _ZNK11QMetaMethod10methodTypeEv @ 1993 NONAME
- _ZNK11QMetaMethod14parameterNamesEv @ 1994 NONAME
- _ZNK11QMetaMethod14parameterTypesEv @ 1995 NONAME
- _ZNK11QMetaMethod3tagEv @ 1996 NONAME
- _ZNK11QMetaMethod6accessEv @ 1997 NONAME
- _ZNK11QMetaMethod6invokeEP7QObjectN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS5_S5_S5_S5_S5_S5_S5_S5_S5_ @ 1998 NONAME
- _ZNK11QMetaMethod8typeNameEv @ 1999 NONAME
- _ZNK11QMetaMethod9signatureEv @ 2000 NONAME
- _ZNK11QMetaObject10enumeratorEi @ 2001 NONAME
- _ZNK11QMetaObject11constructorEi @ 2002 NONAME
- _ZNK11QMetaObject11indexOfSlotEPKc @ 2003 NONAME
- _ZNK11QMetaObject11methodCountEv @ 2004 NONAME
- _ZNK11QMetaObject11newInstanceE16QGenericArgumentS0_S0_S0_S0_S0_S0_S0_S0_S0_ @ 2005 NONAME
- _ZNK11QMetaObject12methodOffsetEv @ 2006 NONAME
- _ZNK11QMetaObject12userPropertyEv @ 2007 NONAME
- _ZNK11QMetaObject13indexOfMethodEPKc @ 2008 NONAME
- _ZNK11QMetaObject13indexOfSignalEPKc @ 2009 NONAME
- _ZNK11QMetaObject13propertyCountEv @ 2010 NONAME
- _ZNK11QMetaObject14classInfoCountEv @ 2011 NONAME
- _ZNK11QMetaObject14propertyOffsetEv @ 2012 NONAME
- _ZNK11QMetaObject15classInfoOffsetEv @ 2013 NONAME
- _ZNK11QMetaObject15enumeratorCountEv @ 2014 NONAME
- _ZNK11QMetaObject15indexOfPropertyEPKc @ 2015 NONAME
- _ZNK11QMetaObject15static_metacallENS_4CallEiPPv @ 2016 NONAME
- _ZNK11QMetaObject16constructorCountEv @ 2017 NONAME
- _ZNK11QMetaObject16enumeratorOffsetEv @ 2018 NONAME
- _ZNK11QMetaObject16indexOfClassInfoEPKc @ 2019 NONAME
- _ZNK11QMetaObject17indexOfEnumeratorEPKc @ 2020 NONAME
- _ZNK11QMetaObject18indexOfConstructorEPKc @ 2021 NONAME
- _ZNK11QMetaObject2trEPKcS1_ @ 2022 NONAME
- _ZNK11QMetaObject2trEPKcS1_i @ 2023 NONAME
- _ZNK11QMetaObject4castEP7QObject @ 2024 NONAME
- _ZNK11QMetaObject6methodEi @ 2025 NONAME
- _ZNK11QMetaObject6trUtf8EPKcS1_ @ 2026 NONAME
- _ZNK11QMetaObject6trUtf8EPKcS1_i @ 2027 NONAME
- _ZNK11QMetaObject8propertyEi @ 2028 NONAME
- _ZNK11QMetaObject9classInfoEi @ 2029 NONAME
- _ZNK11QTextStream10fieldWidthEv @ 2030 NONAME
- _ZNK11QTextStream11integerBaseEv @ 2031 NONAME
- _ZNK11QTextStream11numberFlagsEv @ 2032 NONAME
- _ZNK11QTextStream14fieldAlignmentEv @ 2033 NONAME
- _ZNK11QTextStream17autoDetectUnicodeEv @ 2034 NONAME
- _ZNK11QTextStream18realNumberNotationEv @ 2035 NONAME
- _ZNK11QTextStream19realNumberPrecisionEv @ 2036 NONAME
- _ZNK11QTextStream21generateByteOrderMarkEv @ 2037 NONAME
- _ZNK11QTextStream3posEv @ 2038 NONAME
- _ZNK11QTextStream5atEndEv @ 2039 NONAME
- _ZNK11QTextStream5codecEv @ 2040 NONAME
- _ZNK11QTextStream6deviceEv @ 2041 NONAME
- _ZNK11QTextStream6localeEv @ 2042 NONAME
- _ZNK11QTextStream6statusEv @ 2043 NONAME
- _ZNK11QTextStream6stringEv @ 2044 NONAME
- _ZNK11QTextStream7padCharEv @ 2045 NONAME
- _ZNK11QThreadPool10metaObjectEv @ 2046 NONAME
- _ZNK11QThreadPool13expiryTimeoutEv @ 2047 NONAME
- _ZNK11QThreadPool14maxThreadCountEv @ 2048 NONAME
- _ZNK11QThreadPool17activeThreadCountEv @ 2049 NONAME
- _ZNK11QTranslator10metaObjectEv @ 2050 NONAME
- _ZNK11QTranslator7isEmptyEv @ 2051 NONAME
- _ZNK11QTranslator9translateEPKcS1_S1_ @ 2052 NONAME
- _ZNK11QTranslator9translateEPKcS1_S1_i @ 2053 NONAME
- _ZNK11QTsciiCodec16convertToUnicodeEPKciPN10QTextCodec14ConverterStateE @ 2054 NONAME ABSENT
- _ZNK11QTsciiCodec18convertFromUnicodeEPK5QChariPN10QTextCodec14ConverterStateE @ 2055 NONAME ABSENT
- _ZNK11QTsciiCodec4nameEv @ 2056 NONAME ABSENT
- _ZNK11QTsciiCodec7mibEnumEv @ 2057 NONAME ABSENT
- _ZNK12QDirIterator4pathEv @ 2058 NONAME
- _ZNK12QDirIterator7hasNextEv @ 2059 NONAME
- _ZNK12QDirIterator8fileInfoEv @ 2060 NONAME
- _ZNK12QDirIterator8fileNameEv @ 2061 NONAME
- _ZNK12QDirIterator8filePathEv @ 2062 NONAME
- _ZNK12QTextDecoder10hasFailureEv @ 2063 NONAME
- _ZNK12QTextEncoder10hasFailureEv @ 2064 NONAME
- _ZNK13QFSFileEngine12isSequentialEv @ 2065 NONAME
- _ZNK13QFSFileEngine13caseSensitiveEv @ 2066 NONAME
- _ZNK13QFSFileEngine14isRelativePathEv @ 2067 NONAME
- _ZNK13QFSFileEngine15fileNameSymbianEN19QAbstractFileEngine8FileNameE @ 2068 NONAME ABSENT
- _ZNK13QFSFileEngine17supportsExtensionEN19QAbstractFileEngine9ExtensionE @ 2069 NONAME
- _ZNK13QFSFileEngine3posEv @ 2070 NONAME
- _ZNK13QFSFileEngine4sizeEv @ 2071 NONAME
- _ZNK13QFSFileEngine5mkdirERK7QStringb @ 2072 NONAME
- _ZNK13QFSFileEngine5ownerEN19QAbstractFileEngine9FileOwnerE @ 2073 NONAME
- _ZNK13QFSFileEngine5rmdirERK7QStringb @ 2074 NONAME
- _ZNK13QFSFileEngine6handleEv @ 2075 NONAME
- _ZNK13QFSFileEngine7ownerIdEN19QAbstractFileEngine9FileOwnerE @ 2076 NONAME
- _ZNK13QFSFileEngine8fileNameEN19QAbstractFileEngine8FileNameE @ 2077 NONAME
- _ZNK13QFSFileEngine8fileTimeEN19QAbstractFileEngine8FileTimeE @ 2078 NONAME
- _ZNK13QFSFileEngine9entryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 2079 NONAME
- _ZNK13QFSFileEngine9fileFlagsE6QFlagsIN19QAbstractFileEngine8FileFlagEE @ 2080 NONAME
- _ZNK13QFontLaoCodec16convertToUnicodeEPKciPN10QTextCodec14ConverterStateE @ 2081 NONAME
- _ZNK13QFontLaoCodec18convertFromUnicodeEPK5QChariPN10QTextCodec14ConverterStateE @ 2082 NONAME
- _ZNK13QFontLaoCodec4nameEv @ 2083 NONAME
- _ZNK13QFontLaoCodec7mibEnumEv @ 2084 NONAME
- _ZNK13QMetaProperty10enumeratorEv @ 2085 NONAME
- _ZNK13QMetaProperty10isEditableEPK7QObject @ 2086 NONAME
- _ZNK13QMetaProperty10isEnumTypeEv @ 2087 NONAME
- _ZNK13QMetaProperty10isFlagTypeEv @ 2088 NONAME
- _ZNK13QMetaProperty10isReadableEv @ 2089 NONAME
- _ZNK13QMetaProperty10isWritableEv @ 2090 NONAME
- _ZNK13QMetaProperty12hasStdCppSetEv @ 2091 NONAME
- _ZNK13QMetaProperty12isDesignableEPK7QObject @ 2092 NONAME
- _ZNK13QMetaProperty12isResettableEv @ 2093 NONAME
- _ZNK13QMetaProperty12isScriptableEPK7QObject @ 2094 NONAME
- _ZNK13QMetaProperty12notifySignalEv @ 2095 NONAME
- _ZNK13QMetaProperty15hasNotifySignalEv @ 2096 NONAME
- _ZNK13QMetaProperty17notifySignalIndexEv @ 2097 NONAME
- _ZNK13QMetaProperty4nameEv @ 2098 NONAME
- _ZNK13QMetaProperty4readEPK7QObject @ 2099 NONAME
- _ZNK13QMetaProperty4typeEv @ 2100 NONAME
- _ZNK13QMetaProperty5resetEP7QObject @ 2101 NONAME
- _ZNK13QMetaProperty5writeEP7QObjectRK8QVariant @ 2102 NONAME
- _ZNK13QMetaProperty6isUserEPK7QObject @ 2103 NONAME
- _ZNK13QMetaProperty8isStoredEPK7QObject @ 2104 NONAME
- _ZNK13QMetaProperty8typeNameEv @ 2105 NONAME
- _ZNK13QMetaProperty8userTypeEv @ 2106 NONAME
- _ZNK13QPluginLoader10metaObjectEv @ 2107 NONAME
- _ZNK13QPluginLoader11errorStringEv @ 2108 NONAME
- _ZNK13QPluginLoader8fileNameEv @ 2109 NONAME
- _ZNK13QPluginLoader8isLoadedEv @ 2110 NONAME
- _ZNK13QPluginLoader9loadHintsEv @ 2111 NONAME
- _ZNK13QSharedMemory10isAttachedEv @ 2112 NONAME
- _ZNK13QSharedMemory10metaObjectEv @ 2113 NONAME
- _ZNK13QSharedMemory11errorStringEv @ 2114 NONAME
- _ZNK13QSharedMemory3keyEv @ 2115 NONAME
- _ZNK13QSharedMemory4dataEv @ 2116 NONAME
- _ZNK13QSharedMemory4sizeEv @ 2117 NONAME
- _ZNK13QSharedMemory5errorEv @ 2118 NONAME
- _ZNK13QSharedMemory9constDataEv @ 2119 NONAME
- _ZNK13QSignalMapper10metaObjectEv @ 2120 NONAME
- _ZNK13QSignalMapper7mappingEP7QObject @ 2121 NONAME
- _ZNK13QSignalMapper7mappingEP7QWidget @ 2122 NONAME
- _ZNK13QSignalMapper7mappingERK7QString @ 2123 NONAME
- _ZNK13QSignalMapper7mappingEi @ 2124 NONAME
- _ZNK13QSystemLocale14fallbackLocaleEv @ 2125 NONAME
- _ZNK13QSystemLocale5queryENS_9QueryTypeE8QVariant @ 2126 NONAME
- _ZNK14QFactoryLoader10metaObjectEv @ 2127 NONAME
- _ZNK14QFactoryLoader4keysEv @ 2128 NONAME
- _ZNK14QFactoryLoader8instanceERK7QString @ 2129 NONAME
- _ZNK14QLocalePrivate13validateCharsERK7QStringNS_10NumberModeEP10QByteArrayi @ 2130 NONAME
- _ZNK14QLocalePrivate14doubleToStringEdiNS_10DoubleFormEij @ 2131 NONAME
- _ZNK14QLocalePrivate14stringToDoubleERK7QStringPbNS_18GroupSeparatorModeE @ 2132 NONAME
- _ZNK14QLocalePrivate15numberToCLocaleERK7QStringNS_18GroupSeparatorModeEP15QVarLengthArrayIcLi256EE @ 2133 NONAME
- _ZNK14QLocalePrivate16dateTimeToStringERK7QStringPK5QDatePK5QTimePK7QLocale @ 2134 NONAME
- _ZNK14QLocalePrivate16longLongToStringExiiij @ 2135 NONAME
- _ZNK14QLocalePrivate16stringToLongLongERK7QStringiPbNS_18GroupSeparatorModeE @ 2136 NONAME
- _ZNK14QLocalePrivate17measurementSystemEv @ 2137 NONAME
- _ZNK14QLocalePrivate19stringToUnsLongLongERK7QStringiPbNS_18GroupSeparatorModeE @ 2138 NONAME
- _ZNK14QLocalePrivate19unsLongLongToStringEyiiij @ 2139 NONAME
- _ZNK14QMetaClassInfo4nameEv @ 2140 NONAME
- _ZNK14QMetaClassInfo5valueEv @ 2141 NONAME
- _ZNK14QObjectPrivate10senderListEv @ 2142 NONAME
- _ZNK14QObjectPrivate12receiverListEPKc @ 2143 NONAME
- _ZNK14QObjectPrivate8isSenderEPK7QObjectPKc @ 2144 NONAME
- _ZNK14QStringMatcher7indexInEPK5QCharii @ 2145 NONAME
- _ZNK14QStringMatcher7indexInERK7QStringi @ 2146 NONAME
- _ZNK14QStringMatcher7patternEv @ 2147 NONAME
- _ZNK14QTemporaryFile10autoRemoveEv @ 2148 NONAME
- _ZNK14QTemporaryFile10fileEngineEv @ 2149 NONAME
- _ZNK14QTemporaryFile10metaObjectEv @ 2150 NONAME
- _ZNK14QTemporaryFile12fileTemplateEv @ 2151 NONAME
- _ZNK14QTemporaryFile8fileNameEv @ 2152 NONAME
- _ZNK15QDateTimeParser10fromStringERK7QStringP5QDateP5QTime @ 2153 NONAME
- _ZNK15QDateTimeParser10getMaximumEv @ 2154 NONAME
- _ZNK15QDateTimeParser10getMinimumEv @ 2155 NONAME
- _ZNK15QDateTimeParser10sectionPosERKNS_11SectionNodeE @ 2156 NONAME
- _ZNK15QDateTimeParser10sectionPosEi @ 2157 NONAME
- _ZNK15QDateTimeParser11absoluteMaxEiRK9QDateTime @ 2158 NONAME
- _ZNK15QDateTimeParser11absoluteMinEi @ 2159 NONAME
- _ZNK15QDateTimeParser11getAmPmTextENS_4AmPmENS_4CaseE @ 2160 NONAME
- _ZNK15QDateTimeParser11sectionNameEi @ 2161 NONAME
- _ZNK15QDateTimeParser11sectionNodeEi @ 2162 NONAME
- _ZNK15QDateTimeParser11sectionSizeEi @ 2163 NONAME
- _ZNK15QDateTimeParser11sectionTextERK7QStringii @ 2164 NONAME
- _ZNK15QDateTimeParser11sectionTextEi @ 2165 NONAME
- _ZNK15QDateTimeParser11sectionTypeEi @ 2166 NONAME
- _ZNK15QDateTimeParser12parseSectionERK9QDateTimeiR7QStringRiiRNS_5StateEPi @ 2167 NONAME
- _ZNK15QDateTimeParser13sectionFormatENS_7SectionEi @ 2168 NONAME
- _ZNK15QDateTimeParser13sectionFormatEi @ 2169 NONAME
- _ZNK15QDateTimeParser14potentialValueERK7QStringiiiRK9QDateTimei @ 2170 NONAME
- _ZNK15QDateTimeParser14sectionMaxSizeENS_7SectionEi @ 2171 NONAME
- _ZNK15QDateTimeParser14sectionMaxSizeEi @ 2172 NONAME
- _ZNK15QDateTimeParser17skipToNextSectionEiRK9QDateTimeRK7QString @ 2173 NONAME
- _ZNK15QDateTimeParser5parseER7QStringRiRK9QDateTimeb @ 2174 NONAME
- _ZNK15QDateTimeParser7findDayERK7QStringiiPS0_Pi @ 2175 NONAME
- _ZNK15QDateTimeParser8findAmPmER7QStringiPi @ 2176 NONAME
- _ZNK15QDateTimeParser8getDigitERK9QDateTimei @ 2177 NONAME
- _ZNK15QDateTimeParser8setDigitER9QDateTimeii @ 2178 NONAME
- _ZNK15QDateTimeParser9fieldInfoEi @ 2179 NONAME
- _ZNK15QDateTimeParser9findMonthERK7QStringiiPS0_Pi @ 2180 NONAME
- _ZNK15QDateTimeParser9maxChangeEi @ 2181 NONAME
- _ZNK15QDateTimeParser9stateNameEi @ 2182 NONAME
- _ZNK15QSocketNotifier10metaObjectEv @ 2183 NONAME
- _ZNK16QCoreApplication10metaObjectEv @ 2184 NONAME
- _ZNK16QSettingsPrivate9actualKeyERK7QString @ 2185 NONAME
- _ZNK16QSettingsPrivate9setStatusEN9QSettings6StatusE @ 2186 NONAME
- _ZNK16QSystemSemaphore11errorStringEv @ 2187 NONAME
- _ZNK16QSystemSemaphore3keyEv @ 2188 NONAME
- _ZNK16QSystemSemaphore5errorEv @ 2189 NONAME
- _ZNK16QTextCodecPlugin10metaObjectEv @ 2190 NONAME
- _ZNK16QTextCodecPlugin4keysEv @ 2191 NONAME
- _ZNK16QXmlStreamReader10attributesEv @ 2192 NONAME
- _ZNK16QXmlStreamReader10lineNumberEv @ 2193 NONAME
- _ZNK16QXmlStreamReader11dtdPublicIdEv @ 2194 NONAME
- _ZNK16QXmlStreamReader11dtdSystemIdEv @ 2195 NONAME
- _ZNK16QXmlStreamReader11errorStringEv @ 2196 NONAME
- _ZNK16QXmlStreamReader11tokenStringEv @ 2197 NONAME
- _ZNK16QXmlStreamReader12columnNumberEv @ 2198 NONAME
- _ZNK16QXmlStreamReader12isWhitespaceEv @ 2199 NONAME
- _ZNK16QXmlStreamReader12namespaceUriEv @ 2200 NONAME
- _ZNK16QXmlStreamReader13qualifiedNameEv @ 2201 NONAME
- _ZNK16QXmlStreamReader14entityResolverEv @ 2202 NONAME
- _ZNK16QXmlStreamReader15characterOffsetEv @ 2203 NONAME
- _ZNK16QXmlStreamReader15documentVersionEv @ 2204 NONAME
- _ZNK16QXmlStreamReader16documentEncodingEv @ 2205 NONAME
- _ZNK16QXmlStreamReader18entityDeclarationsEv @ 2206 NONAME
- _ZNK16QXmlStreamReader19namespaceProcessingEv @ 2207 NONAME
- _ZNK16QXmlStreamReader20isStandaloneDocumentEv @ 2208 NONAME
- _ZNK16QXmlStreamReader20notationDeclarationsEv @ 2209 NONAME
- _ZNK16QXmlStreamReader21namespaceDeclarationsEv @ 2210 NONAME
- _ZNK16QXmlStreamReader25processingInstructionDataEv @ 2211 NONAME
- _ZNK16QXmlStreamReader27processingInstructionTargetEv @ 2212 NONAME
- _ZNK16QXmlStreamReader4nameEv @ 2213 NONAME
- _ZNK16QXmlStreamReader4textEv @ 2214 NONAME
- _ZNK16QXmlStreamReader5atEndEv @ 2215 NONAME
- _ZNK16QXmlStreamReader5errorEv @ 2216 NONAME
- _ZNK16QXmlStreamReader6deviceEv @ 2217 NONAME
- _ZNK16QXmlStreamReader6prefixEv @ 2218 NONAME
- _ZNK16QXmlStreamReader7dtdNameEv @ 2219 NONAME
- _ZNK16QXmlStreamReader7isCDATAEv @ 2220 NONAME
- _ZNK16QXmlStreamReader9tokenTypeEv @ 2221 NONAME
- _ZNK16QXmlStreamWriter14autoFormattingEv @ 2222 NONAME
- _ZNK16QXmlStreamWriter20autoFormattingIndentEv @ 2223 NONAME
- _ZNK16QXmlStreamWriter5codecEv @ 2224 NONAME
- _ZNK16QXmlStreamWriter6deviceEv @ 2225 NONAME
- _ZNK17QByteArrayMatcher7indexInEPKcii @ 2226 NONAME
- _ZNK17QByteArrayMatcher7indexInERK10QByteArrayi @ 2227 NONAME
- _ZNK18CQtActiveScheduler5ErrorEi @ 2228 NONAME
- _ZNK18QAbstractItemModel10encodeDataERK5QListI11QModelIndexER11QDataStream @ 2229 NONAME
- _ZNK18QAbstractItemModel10headerDataEiN2Qt11OrientationEi @ 2230 NONAME
- _ZNK18QAbstractItemModel10metaObjectEv @ 2231 NONAME
- _ZNK18QAbstractItemModel11hasChildrenERK11QModelIndex @ 2232 NONAME
- _ZNK18QAbstractItemModel12canFetchMoreERK11QModelIndex @ 2233 NONAME
- _ZNK18QAbstractItemModel19persistentIndexListEv @ 2234 NONAME
- _ZNK18QAbstractItemModel20supportedDragActionsEv @ 2235 NONAME
- _ZNK18QAbstractItemModel20supportedDropActionsEv @ 2236 NONAME
- _ZNK18QAbstractItemModel4spanERK11QModelIndex @ 2237 NONAME
- _ZNK18QAbstractItemModel5buddyERK11QModelIndex @ 2238 NONAME
- _ZNK18QAbstractItemModel5flagsERK11QModelIndex @ 2239 NONAME
- _ZNK18QAbstractItemModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 2240 NONAME
- _ZNK18QAbstractItemModel8hasIndexEiiRK11QModelIndex @ 2241 NONAME
- _ZNK18QAbstractItemModel8itemDataERK11QModelIndex @ 2242 NONAME
- _ZNK18QAbstractItemModel8mimeDataERK5QListI11QModelIndexE @ 2243 NONAME
- _ZNK18QAbstractItemModel9mimeTypesEv @ 2244 NONAME
- _ZNK18QAbstractListModel10metaObjectEv @ 2245 NONAME
- _ZNK18QAbstractListModel11columnCountERK11QModelIndex @ 2246 NONAME
- _ZNK18QAbstractListModel11hasChildrenERK11QModelIndex @ 2247 NONAME
- _ZNK18QAbstractListModel5indexEiiRK11QModelIndex @ 2248 NONAME
- _ZNK18QAbstractListModel6parentERK11QModelIndex @ 2249 NONAME
- _ZNK18QCryptographicHash6resultEv @ 2250 NONAME
- _ZNK18QFileSystemWatcher10metaObjectEv @ 2251 NONAME
- _ZNK18QFileSystemWatcher11directoriesEv @ 2252 NONAME
- _ZNK18QFileSystemWatcher5filesEv @ 2253 NONAME
- _ZNK18QThreadStorageData3getEv @ 2254 NONAME
- _ZNK19QAbstractFileEngine11errorStringEv @ 2255 NONAME
- _ZNK19QAbstractFileEngine12isSequentialEv @ 2256 NONAME
- _ZNK19QAbstractFileEngine13caseSensitiveEv @ 2257 NONAME
- _ZNK19QAbstractFileEngine14isRelativePathEv @ 2258 NONAME
- _ZNK19QAbstractFileEngine17supportsExtensionENS_9ExtensionE @ 2259 NONAME
- _ZNK19QAbstractFileEngine3posEv @ 2260 NONAME
- _ZNK19QAbstractFileEngine4sizeEv @ 2261 NONAME
- _ZNK19QAbstractFileEngine5atEndEv @ 2262 NONAME
- _ZNK19QAbstractFileEngine5errorEv @ 2263 NONAME
- _ZNK19QAbstractFileEngine5mkdirERK7QStringb @ 2264 NONAME
- _ZNK19QAbstractFileEngine5ownerENS_9FileOwnerE @ 2265 NONAME
- _ZNK19QAbstractFileEngine5rmdirERK7QStringb @ 2266 NONAME
- _ZNK19QAbstractFileEngine6handleEv @ 2267 NONAME
- _ZNK19QAbstractFileEngine7ownerIdENS_9FileOwnerE @ 2268 NONAME
- _ZNK19QAbstractFileEngine8fileNameENS_8FileNameE @ 2269 NONAME
- _ZNK19QAbstractFileEngine8fileTimeENS_8FileTimeE @ 2270 NONAME
- _ZNK19QAbstractFileEngine9entryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 2271 NONAME
- _ZNK19QAbstractFileEngine9fileFlagsE6QFlagsINS_8FileFlagEE @ 2272 NONAME
- _ZNK19QAbstractTableModel10metaObjectEv @ 2273 NONAME
- _ZNK19QAbstractTableModel11hasChildrenERK11QModelIndex @ 2274 NONAME
- _ZNK19QAbstractTableModel5indexEiiRK11QModelIndex @ 2275 NONAME
- _ZNK19QAbstractTableModel6parentERK11QModelIndex @ 2276 NONAME
- _ZNK19QTextBoundaryFinder12isAtBoundaryEv @ 2277 NONAME
- _ZNK19QTextBoundaryFinder15boundaryReasonsEv @ 2278 NONAME
- _ZNK19QTextBoundaryFinder6stringEv @ 2279 NONAME
- _ZNK19QTextBoundaryFinder8positionEv @ 2280 NONAME
- _ZNK20QXmlStreamAttributes5valueERK13QLatin1String @ 2281 NONAME
- _ZNK20QXmlStreamAttributes5valueERK13QLatin1StringS2_ @ 2282 NONAME
- _ZNK20QXmlStreamAttributes5valueERK7QString @ 2283 NONAME
- _ZNK20QXmlStreamAttributes5valueERK7QStringRK13QLatin1String @ 2284 NONAME
- _ZNK20QXmlStreamAttributes5valueERK7QStringS2_ @ 2285 NONAME
- _ZNK21QObjectCleanupHandler10metaObjectEv @ 2286 NONAME
- _ZNK21QObjectCleanupHandler7isEmptyEv @ 2287 NONAME
- _ZNK21QPersistentModelIndex10internalIdEv @ 2288 NONAME
- _ZNK21QPersistentModelIndex15internalPointerEv @ 2289 NONAME
- _ZNK21QPersistentModelIndex3rowEv @ 2290 NONAME
- _ZNK21QPersistentModelIndex4dataEi @ 2291 NONAME
- _ZNK21QPersistentModelIndex5childEii @ 2292 NONAME
- _ZNK21QPersistentModelIndex5flagsEv @ 2293 NONAME
- _ZNK21QPersistentModelIndex5modelEv @ 2294 NONAME
- _ZNK21QPersistentModelIndex6columnEv @ 2295 NONAME
- _ZNK21QPersistentModelIndex6parentEv @ 2296 NONAME
- _ZNK21QPersistentModelIndex7isValidEv @ 2297 NONAME
- _ZNK21QPersistentModelIndex7siblingEii @ 2298 NONAME
- _ZNK21QPersistentModelIndexcvRK11QModelIndexEv @ 2299 NONAME
- _ZNK21QPersistentModelIndexeqERK11QModelIndex @ 2300 NONAME
- _ZNK21QPersistentModelIndexeqERKS_ @ 2301 NONAME
- _ZNK21QPersistentModelIndexltERKS_ @ 2302 NONAME
- _ZNK21QPersistentModelIndexneERK11QModelIndex @ 2303 NONAME
- _ZNK23QCoreApplicationPrivate7appNameEv @ 2304 NONAME
- _ZNK23QEventDispatcherSymbian16registeredTimersEP7QObject @ 2305 NONAME
- _ZNK24QAbstractEventDispatcher10metaObjectEv @ 2306 NONAME
- _ZNK27QAbstractFileEngineIterator11nameFiltersEv @ 2307 NONAME
- _ZNK27QAbstractFileEngineIterator15currentFileInfoEv @ 2308 NONAME
- _ZNK27QAbstractFileEngineIterator15currentFilePathEv @ 2309 NONAME
- _ZNK27QAbstractFileEngineIterator4pathEv @ 2310 NONAME
- _ZNK27QAbstractFileEngineIterator7filtersEv @ 2311 NONAME
- _ZNK27QAbstractFileEngineIterator9entryInfoENS_13EntryInfoTypeE @ 2312 NONAME
- _ZNK4QDir10isReadableEv @ 2313 NONAME
- _ZNK4QDir10isRelativeEv @ 2314 NONAME
- _ZNK4QDir11nameFiltersEv @ 2315 NONAME
- _ZNK4QDir12absolutePathEv @ 2316 NONAME
- _ZNK4QDir13canonicalPathEv @ 2317 NONAME
- _ZNK4QDir13entryInfoListE6QFlagsINS_6FilterEES0_INS_8SortFlagEE @ 2318 NONAME
- _ZNK4QDir13entryInfoListERK11QStringList6QFlagsINS_6FilterEES3_INS_8SortFlagEE @ 2319 NONAME
- _ZNK4QDir16absoluteFilePathERK7QString @ 2320 NONAME
- _ZNK4QDir16relativeFilePathERK7QString @ 2321 NONAME
- _ZNK4QDir4pathEv @ 2322 NONAME
- _ZNK4QDir5countEv @ 2323 NONAME
- _ZNK4QDir5mkdirERK7QString @ 2324 NONAME
- _ZNK4QDir5rmdirERK7QString @ 2325 NONAME
- _ZNK4QDir6existsERK7QString @ 2326 NONAME
- _ZNK4QDir6existsEv @ 2327 NONAME
- _ZNK4QDir6filterEv @ 2328 NONAME
- _ZNK4QDir6isRootEv @ 2329 NONAME
- _ZNK4QDir6mkpathERK7QString @ 2330 NONAME
- _ZNK4QDir6rmpathERK7QString @ 2331 NONAME
- _ZNK4QDir7dirNameEv @ 2332 NONAME
- _ZNK4QDir7refreshEv @ 2333 NONAME
- _ZNK4QDir7sortingEv @ 2334 NONAME
- _ZNK4QDir8filePathERK7QString @ 2335 NONAME
- _ZNK4QDir9entryListE6QFlagsINS_6FilterEES0_INS_8SortFlagEE @ 2336 NONAME
- _ZNK4QDir9entryListERK11QStringList6QFlagsINS_6FilterEES3_INS_8SortFlagEE @ 2337 NONAME
- _ZNK4QDireqERKS_ @ 2338 NONAME
- _ZNK4QDirixEi @ 2339 NONAME
- _ZNK4QUrl10isDetachedEv @ 2340 NONAME
- _ZNK4QUrl10isParentOfERKS_ @ 2341 NONAME
- _ZNK4QUrl10isRelativeEv @ 2342 NONAME
- _ZNK4QUrl10queryItemsEv @ 2343 NONAME
- _ZNK4QUrl11encodedHostEv @ 2344 NONAME
- _ZNK4QUrl11encodedPathEv @ 2345 NONAME
- _ZNK4QUrl11errorStringEv @ 2346 NONAME
- _ZNK4QUrl11hasFragmentEv @ 2347 NONAME
- _ZNK4QUrl11toLocalFileEv @ 2348 NONAME
- _ZNK4QUrl12encodedQueryEv @ 2349 NONAME
- _ZNK4QUrl12hasQueryItemERK7QString @ 2350 NONAME
- _ZNK4QUrl14queryItemValueERK7QString @ 2351 NONAME
- _ZNK4QUrl15encodedFragmentEv @ 2352 NONAME
- _ZNK4QUrl15encodedPasswordEv @ 2353 NONAME
- _ZNK4QUrl15encodedUserNameEv @ 2354 NONAME
- _ZNK4QUrl17encodedQueryItemsEv @ 2355 NONAME
- _ZNK4QUrl18allQueryItemValuesERK7QString @ 2356 NONAME
- _ZNK4QUrl18queryPairDelimiterEv @ 2357 NONAME
- _ZNK4QUrl19hasEncodedQueryItemERK10QByteArray @ 2358 NONAME
- _ZNK4QUrl19queryValueDelimiterEv @ 2359 NONAME
- _ZNK4QUrl21encodedQueryItemValueERK10QByteArray @ 2360 NONAME
- _ZNK4QUrl25allEncodedQueryItemValuesERK10QByteArray @ 2361 NONAME
- _ZNK4QUrl4hostEv @ 2362 NONAME
- _ZNK4QUrl4pathEv @ 2363 NONAME
- _ZNK4QUrl4portEi @ 2364 NONAME
- _ZNK4QUrl4portEv @ 2365 NONAME
- _ZNK4QUrl6schemeEv @ 2366 NONAME
- _ZNK4QUrl7isEmptyEv @ 2367 NONAME
- _ZNK4QUrl7isValidEv @ 2368 NONAME
- _ZNK4QUrl8fragmentEv @ 2369 NONAME
- _ZNK4QUrl8hasQueryEv @ 2370 NONAME
- _ZNK4QUrl8passwordEv @ 2371 NONAME
- _ZNK4QUrl8resolvedERKS_ @ 2372 NONAME
- _ZNK4QUrl8toStringE6QFlagsINS_16FormattingOptionEE @ 2373 NONAME
- _ZNK4QUrl8userInfoEv @ 2374 NONAME
- _ZNK4QUrl8userNameEv @ 2375 NONAME
- _ZNK4QUrl9authorityEv @ 2376 NONAME
- _ZNK4QUrl9toEncodedE6QFlagsINS_16FormattingOptionEE @ 2377 NONAME
- _ZNK4QUrleqERKS_ @ 2378 NONAME
- _ZNK4QUrlltERKS_ @ 2379 NONAME
- _ZNK4QUrlneERKS_ @ 2380 NONAME
- _ZNK5QChar10digitValueEv @ 2381 NONAME
- _ZNK5QChar11hasMirroredEv @ 2382 NONAME
- _ZNK5QChar11toTitleCaseEv @ 2383 NONAME
- _ZNK5QChar12mirroredCharEv @ 2384 NONAME
- _ZNK5QChar12toCaseFoldedEv @ 2385 NONAME
- _ZNK5QChar13decompositionEv @ 2386 NONAME
- _ZNK5QChar14combiningClassEv @ 2387 NONAME
- _ZNK5QChar14unicodeVersionEv @ 2388 NONAME
- _ZNK5QChar16decompositionTagEv @ 2389 NONAME
- _ZNK5QChar16isLetterOrNumberEv @ 2390 NONAME
- _ZNK5QChar6isMarkEv @ 2391 NONAME
- _ZNK5QChar7isDigitEv @ 2392 NONAME
- _ZNK5QChar7isPrintEv @ 2393 NONAME
- _ZNK5QChar7isPunctEv @ 2394 NONAME
- _ZNK5QChar7isSpaceEv @ 2395 NONAME
- _ZNK5QChar7joiningEv @ 2396 NONAME
- _ZNK5QChar7toAsciiEv @ 2397 NONAME
- _ZNK5QChar7toLowerEv @ 2398 NONAME
- _ZNK5QChar7toUpperEv @ 2399 NONAME
- _ZNK5QChar8categoryEv @ 2400 NONAME
- _ZNK5QChar8isLetterEv @ 2401 NONAME
- _ZNK5QChar8isNumberEv @ 2402 NONAME
- _ZNK5QChar8isSymbolEv @ 2403 NONAME
- _ZNK5QChar9directionEv @ 2404 NONAME
- _ZNK5QDate10daysInYearEv @ 2405 NONAME
- _ZNK5QDate10weekNumberEPi @ 2406 NONAME
- _ZNK5QDate11daysInMonthEv @ 2407 NONAME
- _ZNK5QDate3dayEv @ 2408 NONAME
- _ZNK5QDate4yearEv @ 2409 NONAME
- _ZNK5QDate5monthEv @ 2410 NONAME
- _ZNK5QDate6daysToERKS_ @ 2411 NONAME
- _ZNK5QDate7addDaysEi @ 2412 NONAME
- _ZNK5QDate7isValidEv @ 2413 NONAME
- _ZNK5QDate8addYearsEi @ 2414 NONAME
- _ZNK5QDate8toStringEN2Qt10DateFormatE @ 2415 NONAME
- _ZNK5QDate8toStringERK7QString @ 2416 NONAME
- _ZNK5QDate9addMonthsEi @ 2417 NONAME
- _ZNK5QDate9dayOfWeekEv @ 2418 NONAME
- _ZNK5QDate9dayOfYearEv @ 2419 NONAME
- _ZNK5QFile10fileEngineEv @ 2420 NONAME
- _ZNK5QFile10metaObjectEv @ 2421 NONAME
- _ZNK5QFile11permissionsEv @ 2422 NONAME
- _ZNK5QFile12isSequentialEv @ 2423 NONAME
- _ZNK5QFile3posEv @ 2424 NONAME
- _ZNK5QFile4sizeEv @ 2425 NONAME
- _ZNK5QFile5atEndEv @ 2426 NONAME
- _ZNK5QFile5errorEv @ 2427 NONAME
- _ZNK5QFile6existsEv @ 2428 NONAME
- _ZNK5QFile6handleEv @ 2429 NONAME
- _ZNK5QFile8fileNameEv @ 2430 NONAME
- _ZNK5QFile8readLinkEv @ 2431 NONAME
- _ZNK5QRect10intersectsERKS_ @ 2432 NONAME
- _ZNK5QRect10normalizedEv @ 2433 NONAME
- _ZNK5QRect8containsERK6QPointb @ 2434 NONAME
- _ZNK5QRect8containsERKS_b @ 2435 NONAME
- _ZNK5QRectanERKS_ @ 2436 NONAME
- _ZNK5QRectorERKS_ @ 2437 NONAME
- _ZNK5QTime4hourEv @ 2438 NONAME
- _ZNK5QTime4msecEv @ 2439 NONAME
- _ZNK5QTime6minuteEv @ 2440 NONAME
- _ZNK5QTime6secondEv @ 2441 NONAME
- _ZNK5QTime6secsToERKS_ @ 2442 NONAME
- _ZNK5QTime7addSecsEi @ 2443 NONAME
- _ZNK5QTime7elapsedEv @ 2444 NONAME
- _ZNK5QTime7isValidEv @ 2445 NONAME
- _ZNK5QTime7msecsToERKS_ @ 2446 NONAME
- _ZNK5QTime8addMSecsEi @ 2447 NONAME
- _ZNK5QTime8toStringEN2Qt10DateFormatE @ 2448 NONAME
- _ZNK5QTime8toStringERK7QString @ 2449 NONAME
- _ZNK5QUuid6isNullEv @ 2450 NONAME
- _ZNK5QUuid7variantEv @ 2451 NONAME
- _ZNK5QUuid7versionEv @ 2452 NONAME
- _ZNK5QUuid8toStringEv @ 2453 NONAME
- _ZNK5QUuidgtERKS_ @ 2454 NONAME
- _ZNK5QUuidltERKS_ @ 2455 NONAME
- _ZNK6QLineF10unitVectorEv @ 2456 NONAME
- _ZNK6QLineF5angleERKS_ @ 2457 NONAME
- _ZNK6QLineF5angleEv @ 2458 NONAME
- _ZNK6QLineF6isNullEv @ 2459 NONAME
- _ZNK6QLineF6lengthEv @ 2460 NONAME
- _ZNK6QLineF7angleToERKS_ @ 2461 NONAME
- _ZNK6QLineF9intersectERKS_P7QPointF @ 2462 NONAME
- _ZNK6QPoint15manhattanLengthEv @ 2463 NONAME
- _ZNK6QRectF10intersectsERKS_ @ 2464 NONAME
- _ZNK6QRectF10normalizedEv @ 2465 NONAME
- _ZNK6QRectF13toAlignedRectEv @ 2466 NONAME
- _ZNK6QRectF8containsERK7QPointF @ 2467 NONAME
- _ZNK6QRectF8containsERKS_ @ 2468 NONAME
- _ZNK6QRectFanERKS_ @ 2469 NONAME
- _ZNK6QRectForERKS_ @ 2470 NONAME
- _ZNK6QTimer10metaObjectEv @ 2471 NONAME
- _ZNK7QBuffer10metaObjectEv @ 2472 NONAME
- _ZNK7QBuffer11canReadLineEv @ 2473 NONAME
- _ZNK7QBuffer3posEv @ 2474 NONAME
- _ZNK7QBuffer4dataEv @ 2475 NONAME
- _ZNK7QBuffer4sizeEv @ 2476 NONAME
- _ZNK7QBuffer5atEndEv @ 2477 NONAME
- _ZNK7QBuffer6bufferEv @ 2478 NONAME
- _ZNK7QLocale10dateFormatENS_10FormatTypeE @ 2479 NONAME
- _ZNK7QLocale10timeFormatENS_10FormatTypeE @ 2480 NONAME
- _ZNK7QLocale10toDateTimeERK7QStringNS_10FormatTypeE @ 2481 NONAME
- _ZNK7QLocale10toDateTimeERK7QStringS2_ @ 2482 NONAME
- _ZNK7QLocale10toLongLongERK7QStringPbi @ 2483 NONAME
- _ZNK7QLocale11exponentialEv @ 2484 NONAME
- _ZNK7QLocale11toULongLongERK7QStringPbi @ 2485 NONAME
- _ZNK7QLocale12decimalPointEv @ 2486 NONAME
- _ZNK7QLocale12negativeSignEv @ 2487 NONAME
- _ZNK7QLocale12positiveSignEv @ 2488 NONAME
- _ZNK7QLocale13numberOptionsEv @ 2489 NONAME
- _ZNK7QLocale14dateTimeFormatENS_10FormatTypeE @ 2490 NONAME
- _ZNK7QLocale14groupSeparatorEv @ 2491 NONAME
- _ZNK7QLocale17measurementSystemEv @ 2492 NONAME
- _ZNK7QLocale17standaloneDayNameEiNS_10FormatTypeE @ 2493 NONAME
- _ZNK7QLocale19standaloneMonthNameEiNS_10FormatTypeE @ 2494 NONAME
- _ZNK7QLocale1dEv @ 2495 NONAME
- _ZNK7QLocale4nameEv @ 2496 NONAME
- _ZNK7QLocale5toIntERK7QStringPbi @ 2497 NONAME
- _ZNK7QLocale6amTextEv @ 2498 NONAME
- _ZNK7QLocale6pmTextEv @ 2499 NONAME
- _ZNK7QLocale6toDateERK7QStringNS_10FormatTypeE @ 2500 NONAME
- _ZNK7QLocale6toDateERK7QStringS2_ @ 2501 NONAME
- _ZNK7QLocale6toTimeERK7QStringNS_10FormatTypeE @ 2502 NONAME
- _ZNK7QLocale6toTimeERK7QStringS2_ @ 2503 NONAME
- _ZNK7QLocale6toUIntERK7QStringPbi @ 2504 NONAME
- _ZNK7QLocale7countryEv @ 2505 NONAME
- _ZNK7QLocale7dayNameEiNS_10FormatTypeE @ 2506 NONAME
- _ZNK7QLocale7percentEv @ 2507 NONAME
- _ZNK7QLocale7toFloatERK7QStringPb @ 2508 NONAME
- _ZNK7QLocale7toShortERK7QStringPbi @ 2509 NONAME
- _ZNK7QLocale8languageEv @ 2510 NONAME
- _ZNK7QLocale8toDoubleERK7QStringPb @ 2511 NONAME
- _ZNK7QLocale8toStringERK5QDateNS_10FormatTypeE @ 2512 NONAME
- _ZNK7QLocale8toStringERK5QDateRK7QString @ 2513 NONAME
- _ZNK7QLocale8toStringERK5QTimeNS_10FormatTypeE @ 2514 NONAME
- _ZNK7QLocale8toStringERK5QTimeRK7QString @ 2515 NONAME
- _ZNK7QLocale8toStringERK9QDateTimeNS_10FormatTypeE @ 2516 NONAME
- _ZNK7QLocale8toStringERK9QDateTimeRK7QString @ 2517 NONAME
- _ZNK7QLocale8toStringEdci @ 2518 NONAME
- _ZNK7QLocale8toStringEx @ 2519 NONAME
- _ZNK7QLocale8toStringEy @ 2520 NONAME
- _ZNK7QLocale8toUShortERK7QStringPbi @ 2521 NONAME
- _ZNK7QLocale9monthNameEiNS_10FormatTypeE @ 2522 NONAME
- _ZNK7QLocale9zeroDigitEv @ 2523 NONAME
- _ZNK7QObject10metaObjectEv @ 2524 NONAME
- _ZNK7QObject10objectNameEv @ 2525 NONAME
- _ZNK7QObject20dynamicPropertyNamesEv @ 2526 NONAME
- _ZNK7QObject6senderEv @ 2527 NONAME
- _ZNK7QObject6threadEv @ 2528 NONAME
- _ZNK7QObject8propertyEPKc @ 2529 NONAME
- _ZNK7QObject8userDataEj @ 2530 NONAME
- _ZNK7QObject9receiversEPKc @ 2531 NONAME
- _ZNK7QRegExp10exactMatchERK7QString @ 2532 NONAME
- _ZNK7QRegExp11errorStringEv @ 2533 NONAME
- _ZNK7QRegExp11lastIndexInERK7QStringiNS_9CaretModeE @ 2534 NONAME
- _ZNK7QRegExp11numCapturesEv @ 2535 NONAME
- _ZNK7QRegExp13capturedTextsEv @ 2536 NONAME
- _ZNK7QRegExp13matchedLengthEv @ 2537 NONAME
- _ZNK7QRegExp13patternSyntaxEv @ 2538 NONAME
- _ZNK7QRegExp15caseSensitivityEv @ 2539 NONAME
- _ZNK7QRegExp3capEi @ 2540 NONAME
- _ZNK7QRegExp3posEi @ 2541 NONAME
- _ZNK7QRegExp7indexInERK7QStringiNS_9CaretModeE @ 2542 NONAME
- _ZNK7QRegExp7isEmptyEv @ 2543 NONAME
- _ZNK7QRegExp7isValidEv @ 2544 NONAME
- _ZNK7QRegExp7patternEv @ 2545 NONAME
- _ZNK7QRegExp9isMinimalEv @ 2546 NONAME
- _ZNK7QRegExpeqERKS_ @ 2547 NONAME
- _ZNK7QString10normalizedENS_17NormalizationFormE @ 2548 NONAME
- _ZNK7QString10normalizedENS_17NormalizationFormEN5QChar14UnicodeVersionE @ 2549 NONAME
- _ZNK7QString10simplifiedEv @ 2550 NONAME
- _ZNK7QString10startsWithERK13QLatin1StringN2Qt15CaseSensitivityE @ 2551 NONAME
- _ZNK7QString10startsWithERK5QCharN2Qt15CaseSensitivityE @ 2552 NONAME
- _ZNK7QString10startsWithERKS_N2Qt15CaseSensitivityE @ 2553 NONAME
- _ZNK7QString10toLongLongEPbi @ 2554 NONAME
- _ZNK7QString11lastIndexOfE5QChariN2Qt15CaseSensitivityE @ 2555 NONAME
- _ZNK7QString11lastIndexOfER7QRegExpi @ 2556 NONAME
- _ZNK7QString11lastIndexOfERK13QLatin1StringiN2Qt15CaseSensitivityE @ 2557 NONAME
- _ZNK7QString11lastIndexOfERK7QRegExpi @ 2558 NONAME
- _ZNK7QString11lastIndexOfERKS_iN2Qt15CaseSensitivityE @ 2559 NONAME
- _ZNK7QString11toLocal8BitEv @ 2560 NONAME
- _ZNK7QString11toULongLongEPbi @ 2561 NONAME
- _ZNK7QString12toCaseFoldedEv @ 2562 NONAME
- _ZNK7QString12toWCharArrayEPw @ 2563 NONAME
- _ZNK7QString13leftJustifiedEi5QCharb @ 2564 NONAME
- _ZNK7QString14rightJustifiedEi5QCharb @ 2565 NONAME
- _ZNK7QString16updatePropertiesEv @ 2566 NONAME
- _ZNK7QString18localeAwareCompareERKS_ @ 2567 NONAME
- _ZNK7QString3argE5QChariRKS0_ @ 2568 NONAME
- _ZNK7QString3argERKS_iRK5QChar @ 2569 NONAME
- _ZNK7QString3argEciRK5QChar @ 2570 NONAME
- _ZNK7QString3argEdiciRK5QChar @ 2571 NONAME
- _ZNK7QString3argExiiRK5QChar @ 2572 NONAME
- _ZNK7QString3argEyiiRK5QChar @ 2573 NONAME
- _ZNK7QString3midEii @ 2574 NONAME
- _ZNK7QString4leftEi @ 2575 NONAME
- _ZNK7QString5countE5QCharN2Qt15CaseSensitivityE @ 2576 NONAME
- _ZNK7QString5countERK7QRegExp @ 2577 NONAME
- _ZNK7QString5countERKS_N2Qt15CaseSensitivityE @ 2578 NONAME
- _ZNK7QString5rightEi @ 2579 NONAME
- _ZNK7QString5splitERK5QCharNS_13SplitBehaviorEN2Qt15CaseSensitivityE @ 2580 NONAME
- _ZNK7QString5splitERK7QRegExpNS_13SplitBehaviorE @ 2581 NONAME
- _ZNK7QString5splitERKS_NS_13SplitBehaviorEN2Qt15CaseSensitivityE @ 2582 NONAME
- _ZNK7QString5toIntEPbi @ 2583 NONAME
- _ZNK7QString5utf16Ev @ 2584 NONAME
- _ZNK7QString6midRefEii @ 2585 NONAME
- _ZNK7QString6toLongEPbi @ 2586 NONAME
- _ZNK7QString6toUIntEPbi @ 2587 NONAME
- _ZNK7QString6toUcs4Ev @ 2588 NONAME
- _ZNK7QString6toUtf8Ev @ 2589 NONAME
- _ZNK7QString7compareERK13QLatin1StringN2Qt15CaseSensitivityE @ 2590 NONAME
- _ZNK7QString7compareERKS_ @ 2591 NONAME
- _ZNK7QString7compareERKS_N2Qt15CaseSensitivityE @ 2592 NONAME
- _ZNK7QString7indexOfE5QChariN2Qt15CaseSensitivityE @ 2593 NONAME
- _ZNK7QString7indexOfER7QRegExpi @ 2594 NONAME
- _ZNK7QString7indexOfERK13QLatin1StringiN2Qt15CaseSensitivityE @ 2595 NONAME
- _ZNK7QString7indexOfERK7QRegExpi @ 2596 NONAME
- _ZNK7QString7indexOfERKS_iN2Qt15CaseSensitivityE @ 2597 NONAME
- _ZNK7QString7leftRefEi @ 2598 NONAME
- _ZNK7QString7sectionERK7QRegExpii6QFlagsINS_11SectionFlagEE @ 2599 NONAME
- _ZNK7QString7sectionERKS_ii6QFlagsINS_11SectionFlagEE @ 2600 NONAME
- _ZNK7QString7toAsciiEv @ 2601 NONAME
- _ZNK7QString7toFloatEPb @ 2602 NONAME
- _ZNK7QString7toLowerEv @ 2603 NONAME
- _ZNK7QString7toShortEPbi @ 2604 NONAME
- _ZNK7QString7toULongEPbi @ 2605 NONAME
- _ZNK7QString7toUpperEv @ 2606 NONAME
- _ZNK7QString7trimmedEv @ 2607 NONAME
- _ZNK7QString8endsWithERK13QLatin1StringN2Qt15CaseSensitivityE @ 2608 NONAME
- _ZNK7QString8endsWithERK5QCharN2Qt15CaseSensitivityE @ 2609 NONAME
- _ZNK7QString8endsWithERKS_N2Qt15CaseSensitivityE @ 2610 NONAME
- _ZNK7QString8multiArgEiPPKS_ @ 2611 NONAME
- _ZNK7QString8repeatedEi @ 2612 NONAME
- _ZNK7QString8rightRefEi @ 2613 NONAME
- _ZNK7QString8toDoubleEPb @ 2614 NONAME
- _ZNK7QString8toLatin1Ev @ 2615 NONAME
- _ZNK7QString8toUShortEPbi @ 2616 NONAME
- _ZNK7QStringeqERK13QLatin1String @ 2617 NONAME
- _ZNK7QStringeqERKS_ @ 2618 NONAME
- _ZNK7QStringgtERK13QLatin1String @ 2619 NONAME
- _ZNK7QStringltERK13QLatin1String @ 2620 NONAME
- _ZNK7QStringltERKS_ @ 2621 NONAME
- _ZNK7QThread10isFinishedEv @ 2622 NONAME
- _ZNK7QThread10metaObjectEv @ 2623 NONAME
- _ZNK7QThread8priorityEv @ 2624 NONAME
- _ZNK7QThread9isRunningEv @ 2625 NONAME
- _ZNK7QThread9stackSizeEv @ 2626 NONAME
- _ZNK8QLibrary10metaObjectEv @ 2627 NONAME
- _ZNK8QLibrary11errorStringEv @ 2628 NONAME
- _ZNK8QLibrary8fileNameEv @ 2629 NONAME
- _ZNK8QLibrary8isLoadedEv @ 2630 NONAME
- _ZNK8QLibrary9loadHintsEv @ 2631 NONAME
- _ZNK8QProcess10exitStatusEv @ 2632 NONAME
- _ZNK8QProcess10metaObjectEv @ 2633 NONAME
- _ZNK8QProcess11canReadLineEv @ 2634 NONAME
- _ZNK8QProcess11environmentEv @ 2635 NONAME
- _ZNK8QProcess11readChannelEv @ 2636 NONAME
- _ZNK8QProcess12bytesToWriteEv @ 2637 NONAME
- _ZNK8QProcess12isSequentialEv @ 2638 NONAME
- _ZNK8QProcess14bytesAvailableEv @ 2639 NONAME
- _ZNK8QProcess15readChannelModeEv @ 2640 NONAME
- _ZNK8QProcess16workingDirectoryEv @ 2641 NONAME
- _ZNK8QProcess18processChannelModeEv @ 2642 NONAME
- _ZNK8QProcess3pidEv @ 2643 NONAME
- _ZNK8QProcess5atEndEv @ 2644 NONAME
- _ZNK8QProcess5errorEv @ 2645 NONAME
- _ZNK8QProcess5stateEv @ 2646 NONAME
- _ZNK8QProcess8exitCodeEv @ 2647 NONAME
- _ZNK8QVariant10canConvertENS_4TypeE @ 2648 NONAME
- _ZNK8QVariant10toBitArrayEv @ 2649 NONAME
- _ZNK8QVariant10toDateTimeEv @ 2650 NONAME
- _ZNK8QVariant10toLongLongEPb @ 2651 NONAME
- _ZNK8QVariant11toByteArrayEv @ 2652 NONAME
- _ZNK8QVariant11toULongLongEPb @ 2653 NONAME
- _ZNK8QVariant12toStringListEv @ 2654 NONAME
- _ZNK8QVariant3cmpERKS_ @ 2655 NONAME
- _ZNK8QVariant4saveER11QDataStream @ 2656 NONAME
- _ZNK8QVariant4typeEv @ 2657 NONAME
- _ZNK8QVariant5toIntEPb @ 2658 NONAME
- _ZNK8QVariant5toMapEv @ 2659 NONAME
- _ZNK8QVariant5toUrlEv @ 2660 NONAME
- _ZNK8QVariant6isNullEv @ 2661 NONAME
- _ZNK8QVariant6toBoolEv @ 2662 NONAME
- _ZNK8QVariant6toCharEv @ 2663 NONAME
- _ZNK8QVariant6toDateEv @ 2664 NONAME
- _ZNK8QVariant6toHashEv @ 2665 NONAME
- _ZNK8QVariant6toLineEv @ 2666 NONAME
- _ZNK8QVariant6toListEv @ 2667 NONAME
- _ZNK8QVariant6toRectEv @ 2668 NONAME
- _ZNK8QVariant6toSizeEv @ 2669 NONAME
- _ZNK8QVariant6toTimeEv @ 2670 NONAME
- _ZNK8QVariant6toUIntEPb @ 2671 NONAME
- _ZNK8QVariant7toLineFEv @ 2672 NONAME
- _ZNK8QVariant7toPointEv @ 2673 NONAME
- _ZNK8QVariant7toRectFEv @ 2674 NONAME
- _ZNK8QVariant7toSizeFEv @ 2675 NONAME
- _ZNK8QVariant8toDoubleEPb @ 2676 NONAME
- _ZNK8QVariant8toLocaleEv @ 2677 NONAME
- _ZNK8QVariant8toPointFEv @ 2678 NONAME
- _ZNK8QVariant8toRegExpEv @ 2679 NONAME
- _ZNK8QVariant8toStringEv @ 2680 NONAME
- _ZNK8QVariant8typeNameEv @ 2681 NONAME
- _ZNK8QVariant8userTypeEv @ 2682 NONAME
- _ZNK8QVariant9constDataEv @ 2683 NONAME
- _ZNK9QBitArray5countEb @ 2684 NONAME
- _ZNK9QBitArraycoEv @ 2685 NONAME
- _ZNK9QConfFile10isWritableEv @ 2686 NONAME
- _ZNK9QConfFile12mergedKeyMapEv @ 2687 NONAME
- _ZNK9QDateTime10toTimeSpecEN2Qt8TimeSpecE @ 2688 NONAME
- _ZNK9QDateTime4dateEv @ 2689 NONAME
- _ZNK9QDateTime4timeEv @ 2690 NONAME
- _ZNK9QDateTime6daysToERKS_ @ 2691 NONAME
- _ZNK9QDateTime6isNullEv @ 2692 NONAME
- _ZNK9QDateTime6secsToERKS_ @ 2693 NONAME
- _ZNK9QDateTime7addDaysEi @ 2694 NONAME
- _ZNK9QDateTime7addSecsEi @ 2695 NONAME
- _ZNK9QDateTime7isValidEv @ 2696 NONAME
- _ZNK9QDateTime8addMSecsEx @ 2697 NONAME
- _ZNK9QDateTime8addYearsEi @ 2698 NONAME
- _ZNK9QDateTime8timeSpecEv @ 2699 NONAME
- _ZNK9QDateTime8toStringEN2Qt10DateFormatE @ 2700 NONAME
- _ZNK9QDateTime8toStringERK7QString @ 2701 NONAME
- _ZNK9QDateTime8toTime_tEv @ 2702 NONAME
- _ZNK9QDateTime9addMonthsEi @ 2703 NONAME
- _ZNK9QDateTime9utcOffsetEv @ 2704 NONAME
- _ZNK9QDateTimeeqERKS_ @ 2705 NONAME
- _ZNK9QDateTimeltERKS_ @ 2706 NONAME
- _ZNK9QFileInfo10bundleNameEv @ 2707 NONAME
- _ZNK9QFileInfo10isReadableEv @ 2708 NONAME
- _ZNK9QFileInfo10isRelativeEv @ 2709 NONAME
- _ZNK9QFileInfo10isWritableEv @ 2710 NONAME
- _ZNK9QFileInfo10permissionE6QFlagsIN5QFile10PermissionEE @ 2711 NONAME
- _ZNK9QFileInfo11absoluteDirEv @ 2712 NONAME
- _ZNK9QFileInfo11permissionsEv @ 2713 NONAME
- _ZNK9QFileInfo12absolutePathEv @ 2714 NONAME
- _ZNK9QFileInfo12isExecutableEv @ 2715 NONAME
- _ZNK9QFileInfo12lastModifiedEv @ 2716 NONAME
- _ZNK9QFileInfo13canonicalPathEv @ 2717 NONAME
- _ZNK9QFileInfo14completeSuffixEv @ 2718 NONAME
- _ZNK9QFileInfo16absoluteFilePathEv @ 2719 NONAME
- _ZNK9QFileInfo16completeBaseNameEv @ 2720 NONAME
- _ZNK9QFileInfo17canonicalFilePathEv @ 2721 NONAME
- _ZNK9QFileInfo3dirEv @ 2722 NONAME
- _ZNK9QFileInfo4pathEv @ 2723 NONAME
- _ZNK9QFileInfo4sizeEv @ 2724 NONAME
- _ZNK9QFileInfo5groupEv @ 2725 NONAME
- _ZNK9QFileInfo5isDirEv @ 2726 NONAME
- _ZNK9QFileInfo5ownerEv @ 2727 NONAME
- _ZNK9QFileInfo6existsEv @ 2728 NONAME
- _ZNK9QFileInfo6isFileEv @ 2729 NONAME
- _ZNK9QFileInfo6isRootEv @ 2730 NONAME
- _ZNK9QFileInfo6suffixEv @ 2731 NONAME
- _ZNK9QFileInfo7cachingEv @ 2732 NONAME
- _ZNK9QFileInfo7createdEv @ 2733 NONAME
- _ZNK9QFileInfo7groupIdEv @ 2734 NONAME
- _ZNK9QFileInfo7ownerIdEv @ 2735 NONAME
- _ZNK9QFileInfo8baseNameEv @ 2736 NONAME
- _ZNK9QFileInfo8fileNameEv @ 2737 NONAME
- _ZNK9QFileInfo8filePathEv @ 2738 NONAME
- _ZNK9QFileInfo8isBundleEv @ 2739 NONAME
- _ZNK9QFileInfo8isHiddenEv @ 2740 NONAME
- _ZNK9QFileInfo8lastReadEv @ 2741 NONAME
- _ZNK9QFileInfo8readLinkEv @ 2742 NONAME
- _ZNK9QFileInfo9isSymLinkEv @ 2743 NONAME
- _ZNK9QFileInfoeqERKS_ @ 2744 NONAME
- _ZNK9QIODevice10isReadableEv @ 2745 NONAME
- _ZNK9QIODevice10isWritableEv @ 2746 NONAME
- _ZNK9QIODevice10metaObjectEv @ 2747 NONAME
- _ZNK9QIODevice11canReadLineEv @ 2748 NONAME
- _ZNK9QIODevice11errorStringEv @ 2749 NONAME
- _ZNK9QIODevice12bytesToWriteEv @ 2750 NONAME
- _ZNK9QIODevice12isSequentialEv @ 2751 NONAME
- _ZNK9QIODevice14bytesAvailableEv @ 2752 NONAME
- _ZNK9QIODevice17isTextModeEnabledEv @ 2753 NONAME
- _ZNK9QIODevice3posEv @ 2754 NONAME
- _ZNK9QIODevice4sizeEv @ 2755 NONAME
- _ZNK9QIODevice5atEndEv @ 2756 NONAME
- _ZNK9QIODevice6isOpenEv @ 2757 NONAME
- _ZNK9QIODevice8openModeEv @ 2758 NONAME
- _ZNK9QMetaEnum10keyToValueEPKc @ 2759 NONAME
- _ZNK9QMetaEnum10valueToKeyEi @ 2760 NONAME
- _ZNK9QMetaEnum11keysToValueEPKc @ 2761 NONAME
- _ZNK9QMetaEnum11valueToKeysEi @ 2762 NONAME
- _ZNK9QMetaEnum3keyEi @ 2763 NONAME
- _ZNK9QMetaEnum4nameEv @ 2764 NONAME
- _ZNK9QMetaEnum5scopeEv @ 2765 NONAME
- _ZNK9QMetaEnum5valueEi @ 2766 NONAME
- _ZNK9QMetaEnum6isFlagEv @ 2767 NONAME
- _ZNK9QMetaEnum8keyCountEv @ 2768 NONAME
- _ZNK9QMimeData10metaObjectEv @ 2769 NONAME
- _ZNK9QMimeData12retrieveDataERK7QStringN8QVariant4TypeE @ 2770 NONAME
- _ZNK9QMimeData4dataERK7QString @ 2771 NONAME
- _ZNK9QMimeData4htmlEv @ 2772 NONAME
- _ZNK9QMimeData4textEv @ 2773 NONAME
- _ZNK9QMimeData4urlsEv @ 2774 NONAME
- _ZNK9QMimeData7formatsEv @ 2775 NONAME
- _ZNK9QMimeData7hasHtmlEv @ 2776 NONAME
- _ZNK9QMimeData7hasTextEv @ 2777 NONAME
- _ZNK9QMimeData7hasUrlsEv @ 2778 NONAME
- _ZNK9QMimeData8hasColorEv @ 2779 NONAME
- _ZNK9QMimeData8hasImageEv @ 2780 NONAME
- _ZNK9QMimeData9colorDataEv @ 2781 NONAME
- _ZNK9QMimeData9hasFormatERK7QString @ 2782 NONAME
- _ZNK9QMimeData9imageDataEv @ 2783 NONAME
- _ZNK9QResource12isCompressedEv @ 2784 NONAME
- _ZNK9QResource16absoluteFilePathEv @ 2785 NONAME
- _ZNK9QResource4dataEv @ 2786 NONAME
- _ZNK9QResource4sizeEv @ 2787 NONAME
- _ZNK9QResource5isDirEv @ 2788 NONAME
- _ZNK9QResource6localeEv @ 2789 NONAME
- _ZNK9QResource7isValidEv @ 2790 NONAME
- _ZNK9QResource8childrenEv @ 2791 NONAME
- _ZNK9QResource8fileNameEv @ 2792 NONAME
- _ZNK9QSettings10isWritableEv @ 2793 NONAME
- _ZNK9QSettings10metaObjectEv @ 2794 NONAME
- _ZNK9QSettings11childGroupsEv @ 2795 NONAME
- _ZNK9QSettings15applicationNameEv @ 2796 NONAME
- _ZNK9QSettings16fallbacksEnabledEv @ 2797 NONAME
- _ZNK9QSettings16organizationNameEv @ 2798 NONAME
- _ZNK9QSettings5groupEv @ 2799 NONAME
- _ZNK9QSettings5scopeEv @ 2800 NONAME
- _ZNK9QSettings5valueERK7QStringRK8QVariant @ 2801 NONAME
- _ZNK9QSettings6formatEv @ 2802 NONAME
- _ZNK9QSettings6statusEv @ 2803 NONAME
- _ZNK9QSettings7allKeysEv @ 2804 NONAME
- _ZNK9QSettings8containsERK7QString @ 2805 NONAME
- _ZNK9QSettings8fileNameEv @ 2806 NONAME
- _ZNK9QSettings8iniCodecEv @ 2807 NONAME
- _ZNK9QSettings9childKeysEv @ 2808 NONAME
- _ZNK9QTimeLine10curveShapeEv @ 2809 NONAME
- _ZNK9QTimeLine10metaObjectEv @ 2810 NONAME
- _ZNK9QTimeLine10startFrameEv @ 2811 NONAME
- _ZNK9QTimeLine11currentTimeEv @ 2812 NONAME
- _ZNK9QTimeLine12currentFrameEv @ 2813 NONAME
- _ZNK9QTimeLine12currentValueEv @ 2814 NONAME
- _ZNK9QTimeLine12frameForTimeEi @ 2815 NONAME
- _ZNK9QTimeLine12valueForTimeEi @ 2816 NONAME
- _ZNK9QTimeLine14updateIntervalEv @ 2817 NONAME
- _ZNK9QTimeLine5stateEv @ 2818 NONAME
- _ZNK9QTimeLine8durationEv @ 2819 NONAME
- _ZNK9QTimeLine8endFrameEv @ 2820 NONAME
- _ZNK9QTimeLine9directionEv @ 2821 NONAME
- _ZNK9QTimeLine9loopCountEv @ 2822 NONAME
- _ZTI10QBig5Codec @ 2823 NONAME ABSENT
- _ZTI10QEventLoop @ 2824 NONAME
- _ZTI10QSjisCodec @ 2825 NONAME ABSENT
- _ZTI10QTextCodec @ 2826 NONAME
- _ZTI10QUtf8Codec @ 2827 NONAME ABSENT
- _ZTI11QCP949Codec @ 2828 NONAME ABSENT
- _ZTI11QChildEvent @ 2829 NONAME
- _ZTI11QDataStream @ 2830 NONAME
- _ZTI11QEucJpCodec @ 2831 NONAME ABSENT
- _ZTI11QEucKrCodec @ 2832 NONAME ABSENT
- _ZTI11QIsciiCodec @ 2833 NONAME ABSENT
- _ZTI11QTextStream @ 2834 NONAME
- _ZTI11QThreadPool @ 2835 NONAME
- _ZTI11QTimerEvent @ 2836 NONAME
- _ZTI11QTranslator @ 2837 NONAME
- _ZTI11QTsciiCodec @ 2838 NONAME ABSENT
- _ZTI11QUtf16Codec @ 2839 NONAME ABSENT
- _ZTI11QUtf32Codec @ 2840 NONAME ABSENT
- _ZTI12QDirIterator @ 2841 NONAME
- _ZTI12QFilePrivate @ 2842 NONAME ABSENT
- _ZTI12QGb2312Codec @ 2843 NONAME ABSENT
- _ZTI12QLatin1Codec @ 2844 NONAME ABSENT
- _ZTI13QActiveObject @ 2845 NONAME ABSENT
- _ZTI13QFSFileEngine @ 2846 NONAME
- _ZTI13QFontLaoCodec @ 2847 NONAME
- _ZTI13QGb18030Codec @ 2848 NONAME ABSENT
- _ZTI13QLatin15Codec @ 2849 NONAME ABSENT
- _ZTI13QPluginLoader @ 2850 NONAME
- _ZTI13QSelectThread @ 2851 NONAME ABSENT
- _ZTI13QSharedMemory @ 2852 NONAME
- _ZTI13QSignalMapper @ 2853 NONAME
- _ZTI13QSystemLocale @ 2854 NONAME
- _ZTI13QUtf16BECodec @ 2855 NONAME ABSENT
- _ZTI13QUtf16LECodec @ 2856 NONAME ABSENT
- _ZTI13QUtf32BECodec @ 2857 NONAME ABSENT
- _ZTI13QUtf32LECodec @ 2858 NONAME ABSENT
- _ZTI14CProcessActive @ 2859 NONAME ABSENT
- _ZTI14QAdoptedThread @ 2860 NONAME ABSENT
- _ZTI14QFactoryLoader @ 2861 NONAME
- _ZTI14QJpUnicodeConv @ 2862 NONAME ABSENT
- _ZTI14QMetaCallEvent @ 2863 NONAME
- _ZTI14QObjectPrivate @ 2864 NONAME
- _ZTI14QTemporaryFile @ 2865 NONAME
- _ZTI14QThreadPrivate @ 2866 NONAME ABSENT
- _ZTI15QBig5hkscsCodec @ 2867 NONAME ABSENT
- _ZTI15QDateTimeParser @ 2868 NONAME
- _ZTI15QObjectUserData @ 2869 NONAME
- _ZTI15QProcessPrivate @ 2870 NONAME ABSENT
- _ZTI15QSocketNotifier @ 2871 NONAME
- _ZTI16QCoreApplication @ 2872 NONAME
- _ZTI16QIODevicePrivate @ 2873 NONAME
- _ZTI16QSettingsPrivate @ 2874 NONAME
- _ZTI16QSimpleTextCodec @ 2875 NONAME ABSENT
- _ZTI16QSingleShotTimer @ 2876 NONAME ABSENT
- _ZTI16QTextCodecPlugin @ 2877 NONAME
- _ZTI17QFactoryInterface @ 2878 NONAME
- _ZTI17QThreadPoolThread @ 2879 NONAME ABSENT
- _ZTI18CNotifyChangeEvent @ 2880 NONAME ABSENT
- _ZTI18CQtActiveScheduler @ 2881 NONAME
- _ZTI18QAbstractItemModel @ 2882 NONAME
- _ZTI18QAbstractListModel @ 2883 NONAME
- _ZTI18QFileSystemWatcher @ 2884 NONAME
- _ZTI18QJpUnicodeConv_Sun @ 2885 NONAME ABSENT
- _ZTI18QTimerActiveObject @ 2886 NONAME ABSENT
- _ZTI19QAbstractFileEngine @ 2887 NONAME
- _ZTI19QAbstractTableModel @ 2888 NONAME
- _ZTI19QResourceFileEngine @ 2889 NONAME ABSENT
- _ZTI19QSocketActiveObject @ 2890 NONAME ABSENT
- _ZTI19QWakeUpActiveObject @ 2891 NONAME ABSENT
- _ZTI20QCompleteDeferredAOs @ 2892 NONAME ABSENT
- _ZTI20QSharedMemoryPrivate @ 2893 NONAME
- _ZTI20QTemporaryFileEngine @ 2894 NONAME ABSENT
- _ZTI21QDeviceClosedNotifier @ 2895 NONAME ABSENT
- _ZTI21QFSFileEngineIterator @ 2896 NONAME ABSENT
- _ZTI21QObjectCleanupHandler @ 2897 NONAME
- _ZTI21QTemporaryFilePrivate @ 2898 NONAME ABSENT
- _ZTI23CProcessManagerMediator @ 2899 NONAME ABSENT
- _ZTI23QCoreApplicationPrivate @ 2900 NONAME
- _ZTI23QEventDispatcherSymbian @ 2901 NONAME
- _ZTI24QAbstractEventDispatcher @ 2902 NONAME
- _ZTI24QConfFileSettingsPrivate @ 2903 NONAME ABSENT
- _ZTI24QFileSystemWatcherEngine @ 2904 NONAME ABSENT
- _ZTI24QJpUnicodeConv_Microsoft @ 2905 NONAME ABSENT
- _ZTI24QXmlStreamEntityResolver @ 2906 NONAME
- _ZTI25QAbstractItemModelPrivate @ 2907 NONAME
- _ZTI26QAbstractFileEngineHandler @ 2908 NONAME
- _ZTI26QResourceFileEngineHandler @ 2909 NONAME ABSENT
- _ZTI26QTextCodecFactoryInterface @ 2910 NONAME
- _ZTI27QAbstractFileEngineIterator @ 2911 NONAME
- _ZTI27QDynamicPropertyChangeEvent @ 2912 NONAME
- _ZTI27QResourceFileEngineIterator @ 2913 NONAME ABSENT
- _ZTI28QJpUnicodeConv_Unicode_ASCII @ 2914 NONAME ABSENT
- _ZTI29QJpUnicodeConv_JISX0221_ASCII @ 2915 NONAME ABSENT
- _ZTI31QAbstractEventDispatcherPrivate @ 2916 NONAME
- _ZTI31QPollingFileSystemWatcherEngine @ 2917 NONAME ABSENT
- _ZTI31QSymbianFileSystemWatcherEngine @ 2918 NONAME ABSENT
- _ZTI32QJpUnicodeConv_JISX0221_JISX0201 @ 2919 NONAME ABSENT
- _ZTI5QFile @ 2920 NONAME
- _ZTI6QEvent @ 2921 NONAME
- _ZTI6QTimer @ 2922 NONAME
- _ZTI7QBuffer @ 2923 NONAME
- _ZTI7QObject @ 2924 NONAME
- _ZTI7QThread @ 2925 NONAME
- _ZTI8QLibrary @ 2926 NONAME
- _ZTI8QProcess @ 2927 NONAME
- _ZTI9QGbkCodec @ 2928 NONAME ABSENT
- _ZTI9QIODevice @ 2929 NONAME
- _ZTI9QJisCodec @ 2930 NONAME ABSENT
- _ZTI9QMimeData @ 2931 NONAME
- _ZTI9QSettings @ 2932 NONAME
- _ZTI9QTimeLine @ 2933 NONAME
- _ZTV10QBig5Codec @ 2934 NONAME ABSENT
- _ZTV10QEventLoop @ 2935 NONAME
- _ZTV10QSjisCodec @ 2936 NONAME ABSENT
- _ZTV10QTextCodec @ 2937 NONAME
- _ZTV10QUtf8Codec @ 2938 NONAME ABSENT
- _ZTV11QCP949Codec @ 2939 NONAME ABSENT
- _ZTV11QChildEvent @ 2940 NONAME
- _ZTV11QDataStream @ 2941 NONAME
- _ZTV11QEucJpCodec @ 2942 NONAME ABSENT
- _ZTV11QEucKrCodec @ 2943 NONAME ABSENT
- _ZTV11QIsciiCodec @ 2944 NONAME ABSENT
- _ZTV11QTextStream @ 2945 NONAME
- _ZTV11QThreadPool @ 2946 NONAME
- _ZTV11QTimerEvent @ 2947 NONAME
- _ZTV11QTranslator @ 2948 NONAME
- _ZTV11QTsciiCodec @ 2949 NONAME ABSENT
- _ZTV11QUtf16Codec @ 2950 NONAME ABSENT
- _ZTV11QUtf32Codec @ 2951 NONAME ABSENT
- _ZTV12QDirIterator @ 2952 NONAME
- _ZTV12QFilePrivate @ 2953 NONAME ABSENT
- _ZTV12QGb2312Codec @ 2954 NONAME ABSENT
- _ZTV12QLatin1Codec @ 2955 NONAME ABSENT
- _ZTV13QActiveObject @ 2956 NONAME ABSENT
- _ZTV13QFSFileEngine @ 2957 NONAME
- _ZTV13QFontLaoCodec @ 2958 NONAME
- _ZTV13QGb18030Codec @ 2959 NONAME ABSENT
- _ZTV13QLatin15Codec @ 2960 NONAME ABSENT
- _ZTV13QPluginLoader @ 2961 NONAME
- _ZTV13QSelectThread @ 2962 NONAME ABSENT
- _ZTV13QSharedMemory @ 2963 NONAME
- _ZTV13QSignalMapper @ 2964 NONAME
- _ZTV13QSystemLocale @ 2965 NONAME
- _ZTV13QUtf16BECodec @ 2966 NONAME ABSENT
- _ZTV13QUtf16LECodec @ 2967 NONAME ABSENT
- _ZTV13QUtf32BECodec @ 2968 NONAME ABSENT
- _ZTV13QUtf32LECodec @ 2969 NONAME ABSENT
- _ZTV14CProcessActive @ 2970 NONAME ABSENT
- _ZTV14QAdoptedThread @ 2971 NONAME ABSENT
- _ZTV14QFactoryLoader @ 2972 NONAME
- _ZTV14QJpUnicodeConv @ 2973 NONAME ABSENT
- _ZTV14QMetaCallEvent @ 2974 NONAME
- _ZTV14QObjectPrivate @ 2975 NONAME
- _ZTV14QTemporaryFile @ 2976 NONAME
- _ZTV14QThreadPrivate @ 2977 NONAME ABSENT
- _ZTV15QBig5hkscsCodec @ 2978 NONAME ABSENT
- _ZTV15QDateTimeParser @ 2979 NONAME
- _ZTV15QObjectUserData @ 2980 NONAME
- _ZTV15QProcessPrivate @ 2981 NONAME ABSENT
- _ZTV15QSocketNotifier @ 2982 NONAME
- _ZTV16QCoreApplication @ 2983 NONAME
- _ZTV16QIODevicePrivate @ 2984 NONAME
- _ZTV16QSettingsPrivate @ 2985 NONAME
- _ZTV16QSimpleTextCodec @ 2986 NONAME ABSENT
- _ZTV16QSingleShotTimer @ 2987 NONAME ABSENT
- _ZTV16QTextCodecPlugin @ 2988 NONAME
- _ZTV17QThreadPoolThread @ 2989 NONAME ABSENT
- _ZTV18CNotifyChangeEvent @ 2990 NONAME ABSENT
- _ZTV18CQtActiveScheduler @ 2991 NONAME
- _ZTV18QAbstractItemModel @ 2992 NONAME
- _ZTV18QAbstractListModel @ 2993 NONAME
- _ZTV18QFileSystemWatcher @ 2994 NONAME
- _ZTV18QJpUnicodeConv_Sun @ 2995 NONAME ABSENT
- _ZTV18QTimerActiveObject @ 2996 NONAME ABSENT
- _ZTV19QAbstractFileEngine @ 2997 NONAME
- _ZTV19QAbstractTableModel @ 2998 NONAME
- _ZTV19QResourceFileEngine @ 2999 NONAME ABSENT
- _ZTV19QSocketActiveObject @ 3000 NONAME ABSENT
- _ZTV19QWakeUpActiveObject @ 3001 NONAME ABSENT
- _ZTV20QCompleteDeferredAOs @ 3002 NONAME ABSENT
- _ZTV20QSharedMemoryPrivate @ 3003 NONAME
- _ZTV20QTemporaryFileEngine @ 3004 NONAME ABSENT
- _ZTV21QDeviceClosedNotifier @ 3005 NONAME ABSENT
- _ZTV21QFSFileEngineIterator @ 3006 NONAME ABSENT
- _ZTV21QObjectCleanupHandler @ 3007 NONAME
- _ZTV21QTemporaryFilePrivate @ 3008 NONAME ABSENT
- _ZTV23CProcessManagerMediator @ 3009 NONAME ABSENT
- _ZTV23QCoreApplicationPrivate @ 3010 NONAME
- _ZTV23QEventDispatcherSymbian @ 3011 NONAME
- _ZTV24QAbstractEventDispatcher @ 3012 NONAME
- _ZTV24QConfFileSettingsPrivate @ 3013 NONAME ABSENT
- _ZTV24QFileSystemWatcherEngine @ 3014 NONAME ABSENT
- _ZTV24QJpUnicodeConv_Microsoft @ 3015 NONAME ABSENT
- _ZTV24QXmlStreamEntityResolver @ 3016 NONAME
- _ZTV25QAbstractItemModelPrivate @ 3017 NONAME
- _ZTV26QAbstractFileEngineHandler @ 3018 NONAME
- _ZTV26QResourceFileEngineHandler @ 3019 NONAME ABSENT
- _ZTV27QAbstractFileEngineIterator @ 3020 NONAME
- _ZTV27QDynamicPropertyChangeEvent @ 3021 NONAME
- _ZTV27QResourceFileEngineIterator @ 3022 NONAME ABSENT
- _ZTV28QJpUnicodeConv_Unicode_ASCII @ 3023 NONAME ABSENT
- _ZTV29QJpUnicodeConv_JISX0221_ASCII @ 3024 NONAME ABSENT
- _ZTV31QAbstractEventDispatcherPrivate @ 3025 NONAME
- _ZTV31QPollingFileSystemWatcherEngine @ 3026 NONAME ABSENT
- _ZTV31QSymbianFileSystemWatcherEngine @ 3027 NONAME ABSENT
- _ZTV32QJpUnicodeConv_JISX0221_JISX0201 @ 3028 NONAME ABSENT
- _ZTV5QFile @ 3029 NONAME
- _ZTV6QEvent @ 3030 NONAME
- _ZTV6QTimer @ 3031 NONAME
- _ZTV7QBuffer @ 3032 NONAME
- _ZTV7QObject @ 3033 NONAME
- _ZTV7QThread @ 3034 NONAME
- _ZTV8QLibrary @ 3035 NONAME
- _ZTV8QProcess @ 3036 NONAME
- _ZTV9QGbkCodec @ 3037 NONAME ABSENT
- _ZTV9QIODevice @ 3038 NONAME
- _ZTV9QJisCodec @ 3039 NONAME ABSENT
- _ZTV9QMimeData @ 3040 NONAME
- _ZTV9QSettings @ 3041 NONAME
- _ZTV9QTimeLine @ 3042 NONAME
- _ZThn8_N16QTextCodecPlugin6createERK7QString @ 3043 NONAME
- _ZThn8_N16QTextCodecPluginD0Ev @ 3044 NONAME
- _ZThn8_N16QTextCodecPluginD1Ev @ 3045 NONAME
- _ZThn8_NK16QTextCodecPlugin4keysEv @ 3046 NONAME
- _ZanRK9QBitArrayS1_ @ 3047 NONAME
- _ZeoRK9QBitArrayS1_ @ 3048 NONAME
- _ZeqRK10QStringRefS1_ @ 3049 NONAME
- _ZeqRK13QLatin1StringRK10QStringRef @ 3050 NONAME
- _ZeqRK7QStringRK10QStringRef @ 3051 NONAME
- _ZeqRKN15QDateTimeParser11SectionNodeES2_ @ 3052 NONAME
- _Zls6QDebug6QFlagsIN4QDir6FilterEE @ 3053 NONAME
- _Zls6QDebug6QFlagsIN9QIODevice12OpenModeFlagEE @ 3054 NONAME
- _Zls6QDebugN8QVariant4TypeE @ 3055 NONAME
- _Zls6QDebugPK7QObject @ 3056 NONAME
- _Zls6QDebugRK11QModelIndex @ 3057 NONAME
- _Zls6QDebugRK21QPersistentModelIndex @ 3058 NONAME
- _Zls6QDebugRK4QDir @ 3059 NONAME
- _Zls6QDebugRK4QUrl @ 3060 NONAME
- _Zls6QDebugRK5QDate @ 3061 NONAME
- _Zls6QDebugRK5QLine @ 3062 NONAME
- _Zls6QDebugRK5QRect @ 3063 NONAME
- _Zls6QDebugRK5QSize @ 3064 NONAME
- _Zls6QDebugRK5QTime @ 3065 NONAME
- _Zls6QDebugRK6QLineF @ 3066 NONAME
- _Zls6QDebugRK6QPoint @ 3067 NONAME
- _Zls6QDebugRK6QRectF @ 3068 NONAME
- _Zls6QDebugRK6QSizeF @ 3069 NONAME
- _Zls6QDebugRK7QPointF @ 3070 NONAME
- _Zls6QDebugRK8QVariant @ 3071 NONAME
- _Zls6QDebugRK9QDateTime @ 3072 NONAME
- _ZlsR11QDataStreamN8QVariant4TypeE @ 3073 NONAME
- _ZlsR11QDataStreamRK10QByteArray @ 3074 NONAME
- _ZlsR11QDataStreamRK4QUrl @ 3075 NONAME
- _ZlsR11QDataStreamRK5QChar @ 3076 NONAME
- _ZlsR11QDataStreamRK5QDate @ 3077 NONAME
- _ZlsR11QDataStreamRK5QLine @ 3078 NONAME
- _ZlsR11QDataStreamRK5QRect @ 3079 NONAME
- _ZlsR11QDataStreamRK5QSize @ 3080 NONAME
- _ZlsR11QDataStreamRK5QTime @ 3081 NONAME
- _ZlsR11QDataStreamRK5QUuid @ 3082 NONAME
- _ZlsR11QDataStreamRK6QLineF @ 3083 NONAME
- _ZlsR11QDataStreamRK6QPoint @ 3084 NONAME
- _ZlsR11QDataStreamRK6QRectF @ 3085 NONAME
- _ZlsR11QDataStreamRK6QSizeF @ 3086 NONAME
- _ZlsR11QDataStreamRK7QLocale @ 3087 NONAME
- _ZlsR11QDataStreamRK7QPointF @ 3088 NONAME
- _ZlsR11QDataStreamRK7QRegExp @ 3089 NONAME
- _ZlsR11QDataStreamRK7QString @ 3090 NONAME
- _ZlsR11QDataStreamRK8QVariant @ 3091 NONAME
- _ZlsR11QDataStreamRK9QBitArray @ 3092 NONAME
- _ZlsR11QDataStreamRK9QDateTime @ 3093 NONAME
- _ZltRK10QStringRefS1_ @ 3094 NONAME
- _ZorRK9QBitArrayS1_ @ 3095 NONAME
- _ZrsR11QDataStreamR10QByteArray @ 3096 NONAME
- _ZrsR11QDataStreamR4QUrl @ 3097 NONAME
- _ZrsR11QDataStreamR5QChar @ 3098 NONAME
- _ZrsR11QDataStreamR5QDate @ 3099 NONAME
- _ZrsR11QDataStreamR5QLine @ 3100 NONAME
- _ZrsR11QDataStreamR5QRect @ 3101 NONAME
- _ZrsR11QDataStreamR5QSize @ 3102 NONAME
- _ZrsR11QDataStreamR5QTime @ 3103 NONAME
- _ZrsR11QDataStreamR5QUuid @ 3104 NONAME
- _ZrsR11QDataStreamR6QLineF @ 3105 NONAME
- _ZrsR11QDataStreamR6QPoint @ 3106 NONAME
- _ZrsR11QDataStreamR6QRectF @ 3107 NONAME
- _ZrsR11QDataStreamR6QSizeF @ 3108 NONAME
- _ZrsR11QDataStreamR7QLocale @ 3109 NONAME
- _ZrsR11QDataStreamR7QPointF @ 3110 NONAME
- _ZrsR11QDataStreamR7QRegExp @ 3111 NONAME
- _ZrsR11QDataStreamR7QString @ 3112 NONAME
- _ZrsR11QDataStreamR8QVariant @ 3113 NONAME
- _ZrsR11QDataStreamR9QBitArray @ 3114 NONAME
- _ZrsR11QDataStreamR9QDateTime @ 3115 NONAME
- _ZrsR11QDataStreamRN8QVariant4TypeE @ 3116 NONAME
- adler32 @ 3117 NONAME
- compress @ 3118 NONAME
- compress2 @ 3119 NONAME
- crc32 @ 3120 NONAME
- deflate @ 3121 NONAME
- deflateCopy @ 3122 NONAME
- deflateEnd @ 3123 NONAME
- deflateInit2_ @ 3124 NONAME
- deflateInit_ @ 3125 NONAME
- deflateParams @ 3126 NONAME
- deflateReset @ 3127 NONAME
- deflateSetDictionary @ 3128 NONAME
- get_crc_table @ 3129 NONAME
- gzclose @ 3130 NONAME
- gzdopen @ 3131 NONAME
- gzeof @ 3132 NONAME
- gzerror @ 3133 NONAME
- gzflush @ 3134 NONAME
- gzgetc @ 3135 NONAME
- gzgets @ 3136 NONAME
- gzopen @ 3137 NONAME
- gzprintf @ 3138 NONAME
- gzputc @ 3139 NONAME
- gzputs @ 3140 NONAME
- gzread @ 3141 NONAME
- gzrewind @ 3142 NONAME
- gzseek @ 3143 NONAME
- gzsetparams @ 3144 NONAME
- gztell @ 3145 NONAME
- gzwrite @ 3146 NONAME
- inflate @ 3147 NONAME
- inflateEnd @ 3148 NONAME
- inflateInit2_ @ 3149 NONAME
- inflateInit_ @ 3150 NONAME
- inflateReset @ 3151 NONAME
- inflateSetDictionary @ 3152 NONAME
- inflateSync @ 3153 NONAME
- inflateSyncPoint @ 3154 NONAME
- qDumpObjectData @ 3155 NONAME ABSENT
- qMetaTypeGuiHelper @ 3156 NONAME DATA 4
- q_atomic_lock @ 3157 NONAME DATA 1
- qt_addObject @ 3158 NONAME
- qt_global_mutexpool @ 3159 NONAME DATA 4
- qt_locale_initialized @ 3160 NONAME DATA 1
- qt_removeObject @ 3161 NONAME
- qt_signal_spy_callback_set @ 3162 NONAME DATA 16
- qt_startup_hook @ 3163 NONAME
- uncompress @ 3164 NONAME
- zError @ 3165 NONAME
- zlibVersion @ 3166 NONAME
- _Z11qt_nameprepP7QStringi @ 3167 NONAME
- _Z14qt_safe_selectiP6fd_setS0_S0_PK7timeval @ 3168 NONAME
- _Z16qt_TDesC2QStringRK7TDesC16 @ 3169 NONAME
- _Z18qt_check_std3rulesPK5QChari @ 3170 NONAME
- _Z23qt_symbian_throwIfErrori @ 3171 NONAME
- _Z24qcoreStateMachineHandlerv @ 3172 NONAME
- _Z26qt_symbian_exception2ErrorRKSt9exception @ 3173 NONAME
- _Z27qt_symbian_exception2LeaveLRKSt9exception @ 3174 NONAME
- _Z6qtTrIdPKci @ 3175 NONAME
- _ZN10QByteArrayC1EiN2Qt14InitializationE @ 3176 NONAME
- _ZN10QByteArrayC2EiN2Qt14InitializationE @ 3177 NONAME
- _ZN10QMutexPoolC1EN6QMutex13RecursionModeEi @ 3178 NONAME
- _ZN10QMutexPoolC2EN6QMutex13RecursionModeEi @ 3179 NONAME
- _ZN10QTextCodec15codecForUtfTextERK10QByteArray @ 3180 NONAME
- _ZN10QTextCodec15codecForUtfTextERK10QByteArrayPS_ @ 3181 NONAME
- _ZN11QFinalState11qt_metacallEN11QMetaObject4CallEiPPv @ 3182 NONAME
- _ZN11QFinalState11qt_metacastEPKc @ 3183 NONAME
- _ZN11QFinalState16staticMetaObjectE @ 3184 NONAME DATA 16
- _ZN11QFinalState5eventEP6QEvent @ 3185 NONAME
- _ZN11QFinalState6onExitEP6QEvent @ 3186 NONAME
- _ZN11QFinalState7onEntryEP6QEvent @ 3187 NONAME
- _ZN11QFinalStateC1EP6QState @ 3188 NONAME
- _ZN11QFinalStateC2EP6QState @ 3189 NONAME
- _ZN11QFinalStateD0Ev @ 3190 NONAME
- _ZN11QFinalStateD1Ev @ 3191 NONAME
- _ZN11QFinalStateD2Ev @ 3192 NONAME
- _ZN11QMetaObject11isConnectedEP7QObjecti @ 3193 NONAME ABSENT
- _ZN11QMetaObject8metacallEP7QObjectNS_4CallEiPPv @ 3194 NONAME
- _ZN12QEasingCurve12setAmplitudeEf @ 3195 NONAME
- _ZN12QEasingCurve12setOvershootEf @ 3196 NONAME
- _ZN12QEasingCurve13setCustomTypeEPFffE @ 3197 NONAME
- _ZN12QEasingCurve16staticMetaObjectE @ 3198 NONAME DATA 16
- _ZN12QEasingCurve7setTypeENS_4TypeE @ 3199 NONAME
- _ZN12QEasingCurve9setPeriodEf @ 3200 NONAME
- _ZN12QEasingCurveC1ENS_4TypeE @ 3201 NONAME
- _ZN12QEasingCurveC1ERKS_ @ 3202 NONAME
- _ZN12QEasingCurveC2ENS_4TypeE @ 3203 NONAME
- _ZN12QEasingCurveC2ERKS_ @ 3204 NONAME
- _ZN12QEasingCurveD1Ev @ 3205 NONAME
- _ZN12QEasingCurveD2Ev @ 3206 NONAME
- _ZN12QEasingCurveaSERKS_ @ 3207 NONAME
- _ZN12QSignalEventC1EP7QObjectiRK5QListI8QVariantE @ 3208 NONAME ABSENT
- _ZN12QSignalEventC2EP7QObjectiRK5QListI8QVariantE @ 3209 NONAME ABSENT
- _ZN12QSignalEventD0Ev @ 3210 NONAME ABSENT
- _ZN12QSignalEventD1Ev @ 3211 NONAME ABSENT
- _ZN12QSignalEventD2Ev @ 3212 NONAME ABSENT
- _ZN13QHistoryState11qt_metacallEN11QMetaObject4CallEiPPv @ 3213 NONAME
- _ZN13QHistoryState11qt_metacastEPKc @ 3214 NONAME
- _ZN13QHistoryState14setHistoryTypeENS_11HistoryTypeE @ 3215 NONAME
- _ZN13QHistoryState15setDefaultStateEP14QAbstractState @ 3216 NONAME
- _ZN13QHistoryState16staticMetaObjectE @ 3217 NONAME DATA 16
- _ZN13QHistoryState5eventEP6QEvent @ 3218 NONAME
- _ZN13QHistoryState6onExitEP6QEvent @ 3219 NONAME
- _ZN13QHistoryState7onEntryEP6QEvent @ 3220 NONAME
- _ZN13QHistoryStateC1ENS_11HistoryTypeEP6QState @ 3221 NONAME
- _ZN13QHistoryStateC1EP6QState @ 3222 NONAME
- _ZN13QHistoryStateC2ENS_11HistoryTypeEP6QState @ 3223 NONAME
- _ZN13QHistoryStateC2EP6QState @ 3224 NONAME
- _ZN13QHistoryStateD0Ev @ 3225 NONAME
- _ZN13QHistoryStateD1Ev @ 3226 NONAME
- _ZN13QHistoryStateD2Ev @ 3227 NONAME
- _ZN13QStateMachine10clearErrorEv @ 3228 NONAME
- _ZN13QStateMachine11eventFilterEP7QObjectP6QEvent @ 3229 NONAME
- _ZN13QStateMachine11qt_metacallEN11QMetaObject4CallEiPPv @ 3230 NONAME
- _ZN13QStateMachine11qt_metacastEPKc @ 3231 NONAME
- _ZN13QStateMachine11removeStateEP14QAbstractState @ 3232 NONAME
- _ZN13QStateMachine12endMicrostepEP6QEvent @ 3233 NONAME
- _ZN13QStateMachine14beginMicrostepEP6QEvent @ 3234 NONAME
- _ZN13QStateMachine16staticMetaObjectE @ 3235 NONAME DATA 16
- _ZN13QStateMachine17postInternalEventEP6QEvent @ 3236 NONAME ABSENT
- _ZN13QStateMachine19addDefaultAnimationEP18QAbstractAnimation @ 3237 NONAME
- _ZN13QStateMachine20endSelectTransitionsEP6QEvent @ 3238 NONAME
- _ZN13QStateMachine20setAnimationsEnabledEb @ 3239 NONAME
- _ZN13QStateMachine22beginSelectTransitionsEP6QEvent @ 3240 NONAME
- _ZN13QStateMachine22removeDefaultAnimationEP18QAbstractAnimation @ 3241 NONAME
- _ZN13QStateMachine22setGlobalRestorePolicyENS_13RestorePolicyE @ 3242 NONAME
- _ZN13QStateMachine4stopEv @ 3243 NONAME
- _ZN13QStateMachine5eventEP6QEvent @ 3244 NONAME
- _ZN13QStateMachine5startEv @ 3245 NONAME
- _ZN13QStateMachine6onExitEP6QEvent @ 3246 NONAME
- _ZN13QStateMachine7onEntryEP6QEvent @ 3247 NONAME
- _ZN13QStateMachine7startedEv @ 3248 NONAME
- _ZN13QStateMachine7stoppedEv @ 3249 NONAME
- _ZN13QStateMachine8addStateEP14QAbstractState @ 3250 NONAME
- _ZN13QStateMachine9postEventEP6QEventi @ 3251 NONAME ABSENT
- _ZN13QStateMachineC1EP7QObject @ 3252 NONAME
- _ZN13QStateMachineC1ER20QStateMachinePrivateP7QObject @ 3253 NONAME
- _ZN13QStateMachineC2EP7QObject @ 3254 NONAME
- _ZN13QStateMachineC2ER20QStateMachinePrivateP7QObject @ 3255 NONAME
- _ZN13QStateMachineD0Ev @ 3256 NONAME
- _ZN13QStateMachineD1Ev @ 3257 NONAME
- _ZN13QStateMachineD2Ev @ 3258 NONAME
- _ZN13QStatePrivate12emitFinishedEv @ 3259 NONAME
- _ZN13QStatePrivate12emitPolishedEv @ 3260 NONAME
- _ZN13QStatePrivateC1Ev @ 3261 NONAME
- _ZN13QStatePrivateC2Ev @ 3262 NONAME
- _ZN13QStatePrivateD0Ev @ 3263 NONAME
- _ZN13QStatePrivateD1Ev @ 3264 NONAME
- _ZN13QStatePrivateD2Ev @ 3265 NONAME
- _ZN13QUnifiedTimer8instanceEv @ 3266 NONAME
- _ZN13QWrappedEventC1EP7QObjectP6QEvent @ 3267 NONAME ABSENT
- _ZN13QWrappedEventC2EP7QObjectP6QEvent @ 3268 NONAME ABSENT
- _ZN13QWrappedEventD0Ev @ 3269 NONAME ABSENT
- _ZN13QWrappedEventD1Ev @ 3270 NONAME ABSENT
- _ZN13QWrappedEventD2Ev @ 3271 NONAME ABSENT
- _ZN14QAbstractState11qt_metacallEN11QMetaObject4CallEiPPv @ 3272 NONAME
- _ZN14QAbstractState11qt_metacastEPKc @ 3273 NONAME
- _ZN14QAbstractState16staticMetaObjectE @ 3274 NONAME DATA 16
- _ZN14QAbstractState5eventEP6QEvent @ 3275 NONAME
- _ZN14QAbstractState6exitedEv @ 3276 NONAME
- _ZN14QAbstractState7enteredEv @ 3277 NONAME
- _ZN14QAbstractStateC2EP6QState @ 3278 NONAME
- _ZN14QAbstractStateC2ER21QAbstractStatePrivateP6QState @ 3279 NONAME
- _ZN14QAbstractStateD0Ev @ 3280 NONAME
- _ZN14QAbstractStateD1Ev @ 3281 NONAME
- _ZN14QAbstractStateD2Ev @ 3282 NONAME
- _ZN15QAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 3283 NONAME
- _ZN15QAnimationGroup11qt_metacastEPKc @ 3284 NONAME
- _ZN15QAnimationGroup12addAnimationEP18QAbstractAnimation @ 3285 NONAME
- _ZN15QAnimationGroup15clearAnimationsEv @ 3286 NONAME
- _ZN15QAnimationGroup15removeAnimationEP18QAbstractAnimation @ 3287 NONAME
- _ZN15QAnimationGroup15takeAnimationAtEi @ 3288 NONAME
- _ZN15QAnimationGroup16staticMetaObjectE @ 3289 NONAME DATA 16
- _ZN15QAnimationGroup17insertAnimationAtEiP18QAbstractAnimation @ 3290 NONAME
- _ZN15QAnimationGroup5eventEP6QEvent @ 3291 NONAME
- _ZN15QAnimationGroupC2EP7QObject @ 3292 NONAME
- _ZN15QAnimationGroupC2ER22QAnimationGroupPrivateP7QObject @ 3293 NONAME
- _ZN15QAnimationGroupD0Ev @ 3294 NONAME
- _ZN15QAnimationGroupD1Ev @ 3295 NONAME
- _ZN15QAnimationGroupD2Ev @ 3296 NONAME
- _ZN15QPauseAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 3297 NONAME
- _ZN15QPauseAnimation11qt_metacastEPKc @ 3298 NONAME
- _ZN15QPauseAnimation11setDurationEi @ 3299 NONAME
- _ZN15QPauseAnimation16staticMetaObjectE @ 3300 NONAME DATA 16
- _ZN15QPauseAnimation17updateCurrentTimeEi @ 3301 NONAME
- _ZN15QPauseAnimation5eventEP6QEvent @ 3302 NONAME
- _ZN15QPauseAnimationC1EP7QObject @ 3303 NONAME
- _ZN15QPauseAnimationC1EiP7QObject @ 3304 NONAME
- _ZN15QPauseAnimationC2EP7QObject @ 3305 NONAME
- _ZN15QPauseAnimationC2EiP7QObject @ 3306 NONAME
- _ZN15QPauseAnimationD0Ev @ 3307 NONAME
- _ZN15QPauseAnimationD1Ev @ 3308 NONAME
- _ZN15QPauseAnimationD2Ev @ 3309 NONAME
- _ZN15QtSharedPointer20ExternalRefCountData16setQObjectSharedEPK7QObjectb @ 3310 NONAME
- _ZN15QtSharedPointer20ExternalRefCountData9getAndRefEPK7QObject @ 3311 NONAME
- _ZN15QtSharedPointer23internalSafetyCheckAdd2EPKvPVKv @ 3312 NONAME
- _ZN15QtSharedPointer26internalSafetyCheckRemove2EPKv @ 3313 NONAME
- _ZN15QtSharedPointer29internalSafetyCheckCleanCheckEv @ 3314 NONAME
- _ZN16QDeclarativeDataD0Ev @ 3315 NONAME
- _ZN16QDeclarativeDataD1Ev @ 3316 NONAME
- _ZN16QDeclarativeDataD2Ev @ 3317 NONAME
- _ZN16QEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 3318 NONAME
- _ZN16QEventTransition11qt_metacastEPKc @ 3319 NONAME
- _ZN16QEventTransition12onTransitionEP6QEvent @ 3320 NONAME
- _ZN16QEventTransition12setEventTypeEN6QEvent4TypeE @ 3321 NONAME
- _ZN16QEventTransition14setEventObjectEP7QObject @ 3322 NONAME ABSENT
- _ZN16QEventTransition16staticMetaObjectE @ 3323 NONAME DATA 16
- _ZN16QEventTransition5eventEP6QEvent @ 3324 NONAME
- _ZN16QEventTransition9eventTestEP6QEvent @ 3325 NONAME
- _ZN16QEventTransitionC1EP6QState @ 3326 NONAME
- _ZN16QEventTransitionC1EP7QObjectN6QEvent4TypeEP6QState @ 3327 NONAME
- _ZN16QEventTransitionC1ER23QEventTransitionPrivateP6QState @ 3328 NONAME
- _ZN16QEventTransitionC1ER23QEventTransitionPrivateP7QObjectN6QEvent4TypeEP6QState @ 3329 NONAME
- _ZN16QEventTransitionC2EP6QState @ 3330 NONAME
- _ZN16QEventTransitionC2EP7QObjectN6QEvent4TypeEP6QState @ 3331 NONAME
- _ZN16QEventTransitionC2ER23QEventTransitionPrivateP6QState @ 3332 NONAME
- _ZN16QEventTransitionC2ER23QEventTransitionPrivateP7QObjectN6QEvent4TypeEP6QState @ 3333 NONAME
- _ZN16QEventTransitionD0Ev @ 3334 NONAME
- _ZN16QEventTransitionD1Ev @ 3335 NONAME
- _ZN16QEventTransitionD2Ev @ 3336 NONAME
- _ZN17QSignalTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 3337 NONAME
- _ZN17QSignalTransition11qt_metacastEPKc @ 3338 NONAME
- _ZN17QSignalTransition12onTransitionEP6QEvent @ 3339 NONAME
- _ZN17QSignalTransition15setSenderObjectEP7QObject @ 3340 NONAME
- _ZN17QSignalTransition16staticMetaObjectE @ 3341 NONAME DATA 16
- _ZN17QSignalTransition5eventEP6QEvent @ 3342 NONAME
- _ZN17QSignalTransition9eventTestEP6QEvent @ 3343 NONAME
- _ZN17QSignalTransition9setSignalERK10QByteArray @ 3344 NONAME
- _ZN17QSignalTransitionC1EP6QState @ 3345 NONAME
- _ZN17QSignalTransitionC1EP7QObjectPKcP6QState @ 3346 NONAME
- _ZN17QSignalTransitionC2EP6QState @ 3347 NONAME
- _ZN17QSignalTransitionC2EP7QObjectPKcP6QState @ 3348 NONAME
- _ZN17QSignalTransitionD0Ev @ 3349 NONAME
- _ZN17QSignalTransitionD1Ev @ 3350 NONAME
- _ZN17QSignalTransitionD2Ev @ 3351 NONAME
- _ZN17QVariantAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 3352 NONAME
- _ZN17QVariantAnimation11qt_metacastEPKc @ 3353 NONAME
- _ZN17QVariantAnimation11setDurationEi @ 3354 NONAME
- _ZN17QVariantAnimation11setEndValueERK8QVariant @ 3355 NONAME
- _ZN17QVariantAnimation11updateStateEN18QAbstractAnimation5StateES1_ @ 3356 NONAME
- _ZN17QVariantAnimation12setKeyValuesERK7QVectorI5QPairIf8QVariantEE @ 3357 NONAME
- _ZN17QVariantAnimation12valueChangedERK8QVariant @ 3358 NONAME
- _ZN17QVariantAnimation13setKeyValueAtEfRK8QVariant @ 3359 NONAME
- _ZN17QVariantAnimation13setStartValueERK8QVariant @ 3360 NONAME
- _ZN17QVariantAnimation14setEasingCurveERK12QEasingCurve @ 3361 NONAME
- _ZN17QVariantAnimation16staticMetaObjectE @ 3362 NONAME DATA 16
- _ZN17QVariantAnimation17updateCurrentTimeEi @ 3363 NONAME
- _ZN17QVariantAnimation20registerInterpolatorEPF8QVariantPKvS2_fEi @ 3364 NONAME
- _ZN17QVariantAnimation5eventEP6QEvent @ 3365 NONAME
- _ZN17QVariantAnimationC2EP7QObject @ 3366 NONAME
- _ZN17QVariantAnimationC2ER24QVariantAnimationPrivateP7QObject @ 3367 NONAME
- _ZN17QVariantAnimationD0Ev @ 3368 NONAME
- _ZN17QVariantAnimationD1Ev @ 3369 NONAME
- _ZN17QVariantAnimationD2Ev @ 3370 NONAME
- _ZN18QAbstractAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 3371 NONAME
- _ZN18QAbstractAnimation11qt_metacastEPKc @ 3372 NONAME
- _ZN18QAbstractAnimation11updateStateENS_5StateES0_ @ 3373 NONAME
- _ZN18QAbstractAnimation12setDirectionENS_9DirectionE @ 3374 NONAME
- _ZN18QAbstractAnimation12setLoopCountEi @ 3375 NONAME
- _ZN18QAbstractAnimation12stateChangedENS_5StateES0_ @ 3376 NONAME
- _ZN18QAbstractAnimation14setCurrentTimeEi @ 3377 NONAME
- _ZN18QAbstractAnimation15updateDirectionENS_9DirectionE @ 3378 NONAME
- _ZN18QAbstractAnimation16directionChangedENS_9DirectionE @ 3379 NONAME
- _ZN18QAbstractAnimation16staticMetaObjectE @ 3380 NONAME DATA 16
- _ZN18QAbstractAnimation18currentLoopChangedEi @ 3381 NONAME
- _ZN18QAbstractAnimation4stopEv @ 3382 NONAME
- _ZN18QAbstractAnimation5eventEP6QEvent @ 3383 NONAME
- _ZN18QAbstractAnimation5pauseEv @ 3384 NONAME
- _ZN18QAbstractAnimation5startENS_14DeletionPolicyE @ 3385 NONAME
- _ZN18QAbstractAnimation6resumeEv @ 3386 NONAME
- _ZN18QAbstractAnimation8finishedEv @ 3387 NONAME
- _ZN18QAbstractAnimationC2EP7QObject @ 3388 NONAME
- _ZN18QAbstractAnimationC2ER25QAbstractAnimationPrivateP7QObject @ 3389 NONAME
- _ZN18QAbstractAnimationD0Ev @ 3390 NONAME
- _ZN18QAbstractAnimationD1Ev @ 3391 NONAME
- _ZN18QAbstractAnimationD2Ev @ 3392 NONAME
- _ZN18QAbstractItemModel12setRoleNamesERK5QHashIi10QByteArrayE @ 3393 NONAME
- _ZN18QPropertyAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 3394 NONAME
- _ZN18QPropertyAnimation11qt_metacastEPKc @ 3395 NONAME
- _ZN18QPropertyAnimation11updateStateEN18QAbstractAnimation5StateES1_ @ 3396 NONAME
- _ZN18QPropertyAnimation15setPropertyNameERK10QByteArray @ 3397 NONAME
- _ZN18QPropertyAnimation15setTargetObjectEP7QObject @ 3398 NONAME
- _ZN18QPropertyAnimation16staticMetaObjectE @ 3399 NONAME DATA 16
- _ZN18QPropertyAnimation18updateCurrentValueERK8QVariant @ 3400 NONAME
- _ZN18QPropertyAnimation5eventEP6QEvent @ 3401 NONAME
- _ZN18QPropertyAnimationC1EP7QObject @ 3402 NONAME
- _ZN18QPropertyAnimationC1EP7QObjectRK10QByteArrayS1_ @ 3403 NONAME
- _ZN18QPropertyAnimationC2EP7QObject @ 3404 NONAME
- _ZN18QPropertyAnimationC2EP7QObjectRK10QByteArrayS1_ @ 3405 NONAME
- _ZN18QPropertyAnimationD0Ev @ 3406 NONAME
- _ZN18QPropertyAnimationD1Ev @ 3407 NONAME
- _ZN18QPropertyAnimationD2Ev @ 3408 NONAME
- _ZN19QAbstractTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 3409 NONAME
- _ZN19QAbstractTransition11qt_metacastEPKc @ 3410 NONAME
- _ZN19QAbstractTransition12addAnimationEP18QAbstractAnimation @ 3411 NONAME
- _ZN19QAbstractTransition14setTargetStateEP14QAbstractState @ 3412 NONAME
- _ZN19QAbstractTransition15removeAnimationEP18QAbstractAnimation @ 3413 NONAME
- _ZN19QAbstractTransition15setTargetStatesERK5QListIP14QAbstractStateE @ 3414 NONAME
- _ZN19QAbstractTransition16staticMetaObjectE @ 3415 NONAME DATA 16
- _ZN19QAbstractTransition5eventEP6QEvent @ 3416 NONAME
- _ZN19QAbstractTransition9triggeredEv @ 3417 NONAME
- _ZN19QAbstractTransitionC2EP6QState @ 3418 NONAME
- _ZN19QAbstractTransitionC2ER26QAbstractTransitionPrivateP6QState @ 3419 NONAME
- _ZN19QAbstractTransitionD0Ev @ 3420 NONAME
- _ZN19QAbstractTransitionD1Ev @ 3421 NONAME
- _ZN19QAbstractTransitionD2Ev @ 3422 NONAME
- _ZN20QStateMachinePrivate10_q_processEv @ 3423 NONAME
- _ZN20QStateMachinePrivate10exitStatesEP6QEventRK5QListIP19QAbstractTransitionE @ 3424 NONAME
- _ZN20QStateMachinePrivate10isParallelEPK14QAbstractState @ 3425 NONAME
- _ZN20QStateMachinePrivate10startStateEv @ 3426 NONAME
- _ZN20QStateMachinePrivate11enterStatesEP6QEventRK5QListIP19QAbstractTransitionE @ 3427 NONAME
- _ZN20QStateMachinePrivate14findErrorStateEP14QAbstractState @ 3428 NONAME
- _ZN20QStateMachinePrivate14isDescendantOfEPK14QAbstractStateS2_ @ 3429 NONAME
- _ZN20QStateMachinePrivate15applyPropertiesERK5QListIP19QAbstractTransitionERKS0_IP14QAbstractStateESA_ @ 3430 NONAME
- _ZN20QStateMachinePrivate15properAncestorsEPK14QAbstractStatePK6QState @ 3431 NONAME
- _ZN20QStateMachinePrivate15scheduleProcessEv @ 3432 NONAME ABSENT
- _ZN20QStateMachinePrivate16addStatesToEnterEP14QAbstractStateP6QStateR4QSetIS1_ES6_ @ 3433 NONAME
- _ZN20QStateMachinePrivate16removeStartStateEv @ 3434 NONAME
- _ZN20QStateMachinePrivate17stateExitLessThanEP14QAbstractStateS1_ @ 3435 NONAME
- _ZN20QStateMachinePrivate18registerRestorableEP7QObjectRK10QByteArray @ 3436 NONAME
- _ZN20QStateMachinePrivate18stateEntryLessThanEP14QAbstractStateS1_ @ 3437 NONAME
- _ZN20QStateMachinePrivate19initializeAnimationEP18QAbstractAnimationRK19QPropertyAssignment @ 3438 NONAME
- _ZN20QStateMachinePrivate19registerTransitionsEP14QAbstractState @ 3439 NONAME
- _ZN20QStateMachinePrivate20_q_animationFinishedEv @ 3440 NONAME
- _ZN20QStateMachinePrivate20unregisterRestorableEP7QObjectRK10QByteArray @ 3441 NONAME
- _ZN20QStateMachinePrivate20unregisterTransitionEP19QAbstractTransition @ 3442 NONAME
- _ZN20QStateMachinePrivate22handleTransitionSignalEP7QObjectiPPv @ 3443 NONAME
- _ZN20QStateMachinePrivate23registerEventTransitionEP16QEventTransition @ 3444 NONAME
- _ZN20QStateMachinePrivate24executeTransitionContentEP6QEventRK5QListIP19QAbstractTransitionE @ 3445 NONAME
- _ZN20QStateMachinePrivate24registerSignalTransitionEP17QSignalTransition @ 3446 NONAME
- _ZN20QStateMachinePrivate24unregisterAllTransitionsEv @ 3447 NONAME
- _ZN20QStateMachinePrivate25unregisterEventTransitionEP16QEventTransition @ 3448 NONAME
- _ZN20QStateMachinePrivate26unregisterSignalTransitionEP17QSignalTransition @ 3449 NONAME
- _ZN20QStateMachinePrivate3getEP13QStateMachine @ 3450 NONAME
- _ZN20QStateMachinePrivate7handlerE @ 3451 NONAME DATA 4
- _ZN20QStateMachinePrivate7isFinalEPK14QAbstractState @ 3452 NONAME
- _ZN20QStateMachinePrivate8_q_startEv @ 3453 NONAME
- _ZN20QStateMachinePrivate8setErrorEN13QStateMachine5ErrorEP14QAbstractState @ 3454 NONAME
- _ZN20QStateMachinePrivate9goToStateEP14QAbstractState @ 3455 NONAME
- _ZN20QStateMachinePrivate9microstepEP6QEventRK5QListIP19QAbstractTransitionE @ 3456 NONAME
- _ZN20QStateMachinePrivateC1Ev @ 3457 NONAME
- _ZN20QStateMachinePrivateC2Ev @ 3458 NONAME
- _ZN20QStateMachinePrivateD0Ev @ 3459 NONAME
- _ZN20QStateMachinePrivateD1Ev @ 3460 NONAME
- _ZN20QStateMachinePrivateD2Ev @ 3461 NONAME
- _ZN23QEventTransitionPrivate10unregisterEv @ 3462 NONAME
- _ZN23QEventTransitionPrivate13maybeRegisterEv @ 3463 NONAME
- _ZN23QEventTransitionPrivate3getEP16QEventTransition @ 3464 NONAME
- _ZN23QEventTransitionPrivateC1Ev @ 3465 NONAME
- _ZN23QEventTransitionPrivateC2Ev @ 3466 NONAME
- _ZN23QParallelAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 3467 NONAME
- _ZN23QParallelAnimationGroup11qt_metacastEPKc @ 3468 NONAME
- _ZN23QParallelAnimationGroup11updateStateEN18QAbstractAnimation5StateES1_ @ 3469 NONAME
- _ZN23QParallelAnimationGroup15updateDirectionEN18QAbstractAnimation9DirectionE @ 3470 NONAME
- _ZN23QParallelAnimationGroup16staticMetaObjectE @ 3471 NONAME DATA 16
- _ZN23QParallelAnimationGroup17updateCurrentTimeEi @ 3472 NONAME
- _ZN23QParallelAnimationGroup5eventEP6QEvent @ 3473 NONAME
- _ZN23QParallelAnimationGroupC1EP7QObject @ 3474 NONAME
- _ZN23QParallelAnimationGroupC1ER30QParallelAnimationGroupPrivateP7QObject @ 3475 NONAME
- _ZN23QParallelAnimationGroupC2EP7QObject @ 3476 NONAME
- _ZN23QParallelAnimationGroupC2ER30QParallelAnimationGroupPrivateP7QObject @ 3477 NONAME
- _ZN23QParallelAnimationGroupD0Ev @ 3478 NONAME
- _ZN23QParallelAnimationGroupD1Ev @ 3479 NONAME
- _ZN23QParallelAnimationGroupD2Ev @ 3480 NONAME
- _ZN24QNonContiguousByteDevice11qt_metacallEN11QMetaObject4CallEiPPv @ 3481 NONAME
- _ZN24QNonContiguousByteDevice11qt_metacastEPKc @ 3482 NONAME
- _ZN24QNonContiguousByteDevice12disableResetEv @ 3483 NONAME
- _ZN24QNonContiguousByteDevice12readProgressExx @ 3484 NONAME
- _ZN24QNonContiguousByteDevice16staticMetaObjectE @ 3485 NONAME DATA 16
- _ZN24QNonContiguousByteDevice9readyReadEv @ 3486 NONAME
- _ZN24QNonContiguousByteDeviceC2Ev @ 3487 NONAME
- _ZN24QNonContiguousByteDeviceD0Ev @ 3488 NONAME
- _ZN24QNonContiguousByteDeviceD1Ev @ 3489 NONAME
- _ZN24QNonContiguousByteDeviceD2Ev @ 3490 NONAME
- _ZN24QVariantAnimationPrivate15getInterpolatorEi @ 3491 NONAME
- _ZN25QAbstractItemModelPrivate15variantLessThanERK8QVariantS2_ @ 3492 NONAME
- _ZN25QAbstractItemModelPrivate16defaultRoleNamesEv @ 3493 NONAME
- _ZN25QSequentialAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 3494 NONAME
- _ZN25QSequentialAnimationGroup11qt_metacastEPKc @ 3495 NONAME
- _ZN25QSequentialAnimationGroup11updateStateEN18QAbstractAnimation5StateES1_ @ 3496 NONAME
- _ZN25QSequentialAnimationGroup13insertPauseAtEii @ 3497 NONAME
- _ZN25QSequentialAnimationGroup15updateDirectionEN18QAbstractAnimation9DirectionE @ 3498 NONAME
- _ZN25QSequentialAnimationGroup16staticMetaObjectE @ 3499 NONAME DATA 16
- _ZN25QSequentialAnimationGroup17updateCurrentTimeEi @ 3500 NONAME
- _ZN25QSequentialAnimationGroup23currentAnimationChangedEP18QAbstractAnimation @ 3501 NONAME
- _ZN25QSequentialAnimationGroup5eventEP6QEvent @ 3502 NONAME
- _ZN25QSequentialAnimationGroup8addPauseEi @ 3503 NONAME
- _ZN25QSequentialAnimationGroupC1EP7QObject @ 3504 NONAME
- _ZN25QSequentialAnimationGroupC1ER32QSequentialAnimationGroupPrivateP7QObject @ 3505 NONAME
- _ZN25QSequentialAnimationGroupC2EP7QObject @ 3506 NONAME
- _ZN25QSequentialAnimationGroupC2ER32QSequentialAnimationGroupPrivateP7QObject @ 3507 NONAME
- _ZN25QSequentialAnimationGroupD0Ev @ 3508 NONAME
- _ZN25QSequentialAnimationGroupD1Ev @ 3509 NONAME
- _ZN25QSequentialAnimationGroupD2Ev @ 3510 NONAME
- _ZN26QAbstractTransitionPrivate13callEventTestEP6QEvent @ 3511 NONAME
- _ZN26QAbstractTransitionPrivate13emitTriggeredEv @ 3512 NONAME
- _ZN26QAbstractTransitionPrivate16callOnTransitionEP6QEvent @ 3513 NONAME
- _ZN26QAbstractTransitionPrivate3getEP19QAbstractTransition @ 3514 NONAME
- _ZN26QAbstractTransitionPrivateC1Ev @ 3515 NONAME
- _ZN26QAbstractTransitionPrivateC2Ev @ 3516 NONAME
- _ZN31QNonContiguousByteDeviceFactory4wrapEP24QNonContiguousByteDevice @ 3517 NONAME
- _ZN31QNonContiguousByteDeviceFactory6createEP10QByteArray @ 3518 NONAME
- _ZN31QNonContiguousByteDeviceFactory6createEP11QRingBuffer @ 3519 NONAME
- _ZN31QNonContiguousByteDeviceFactory6createEP9QIODevice @ 3520 NONAME
- _ZN6QEvent16staticMetaObjectE @ 3521 NONAME DATA 16
- _ZN6QState11qt_metacallEN11QMetaObject4CallEiPPv @ 3522 NONAME
- _ZN6QState11qt_metacastEPKc @ 3523 NONAME
- _ZN6QState12setChildModeENS_9ChildModeE @ 3524 NONAME
- _ZN6QState13addTransitionEP14QAbstractState @ 3525 NONAME
- _ZN6QState13addTransitionEP19QAbstractTransition @ 3526 NONAME
- _ZN6QState13addTransitionEP7QObjectPKcP14QAbstractState @ 3527 NONAME
- _ZN6QState13setErrorStateEP14QAbstractState @ 3528 NONAME
- _ZN6QState14assignPropertyEP7QObjectPKcRK8QVariant @ 3529 NONAME
- _ZN6QState15setInitialStateEP14QAbstractState @ 3530 NONAME
- _ZN6QState16removeTransitionEP19QAbstractTransition @ 3531 NONAME
- _ZN6QState16staticMetaObjectE @ 3532 NONAME DATA 16
- _ZN6QState5eventEP6QEvent @ 3533 NONAME
- _ZN6QState6onExitEP6QEvent @ 3534 NONAME
- _ZN6QState7onEntryEP6QEvent @ 3535 NONAME
- _ZN6QState8finishedEv @ 3536 NONAME
- _ZN6QState8polishedEv @ 3537 NONAME
- _ZN6QStateC1ENS_9ChildModeEPS_ @ 3538 NONAME
- _ZN6QStateC1EPS_ @ 3539 NONAME
- _ZN6QStateC1ER13QStatePrivatePS_ @ 3540 NONAME
- _ZN6QStateC2ENS_9ChildModeEPS_ @ 3541 NONAME
- _ZN6QStateC2EPS_ @ 3542 NONAME
- _ZN6QStateC2ER13QStatePrivatePS_ @ 3543 NONAME
- _ZN6QStateD0Ev @ 3544 NONAME
- _ZN6QStateD1Ev @ 3545 NONAME
- _ZN6QStateD2Ev @ 3546 NONAME
- _ZN7QStringC1EiN2Qt14InitializationE @ 3547 NONAME
- _ZN7QStringC2EiN2Qt14InitializationE @ 3548 NONAME
- _ZN8QProcess18setEnvironmentHashERK5QHashI7QStringS1_E @ 3549 NONAME ABSENT
- _ZN8QProcess21systemEnvironmentHashEv @ 3550 NONAME ABSENT
- _ZN9QConfFileD1Ev @ 3551 NONAME
- _ZN9QConfFileD2Ev @ 3552 NONAME
- _ZN9QTimeLine14setEasingCurveERK12QEasingCurve @ 3553 NONAME
- _ZNK11QFinalState10metaObjectEv @ 3554 NONAME
- _ZNK11QMetaMethod11methodIndexEv @ 3555 NONAME
- _ZNK12QEasingCurve10customTypeEv @ 3556 NONAME
- _ZNK12QEasingCurve16valueForProgressEf @ 3557 NONAME
- _ZNK12QEasingCurve4typeEv @ 3558 NONAME
- _ZNK12QEasingCurve6periodEv @ 3559 NONAME
- _ZNK12QEasingCurve9amplitudeEv @ 3560 NONAME
- _ZNK12QEasingCurve9overshootEv @ 3561 NONAME
- _ZNK12QEasingCurveeqERKS_ @ 3562 NONAME
- _ZNK13QHistoryState10metaObjectEv @ 3563 NONAME
- _ZNK13QHistoryState11historyTypeEv @ 3564 NONAME
- _ZNK13QHistoryState12defaultStateEv @ 3565 NONAME
- _ZNK13QMetaProperty10isConstantEv @ 3566 NONAME
- _ZNK13QMetaProperty13propertyIndexEv @ 3567 NONAME
- _ZNK13QMetaProperty7isFinalEv @ 3568 NONAME
- _ZNK13QStateMachine10metaObjectEv @ 3569 NONAME
- _ZNK13QStateMachine11errorStringEv @ 3570 NONAME
- _ZNK13QStateMachine13configurationEv @ 3571 NONAME
- _ZNK13QStateMachine17animationsEnabledEv @ 3572 NONAME
- _ZNK13QStateMachine17defaultAnimationsEv @ 3573 NONAME
- _ZNK13QStateMachine19globalRestorePolicyEv @ 3574 NONAME
- _ZNK13QStateMachine5errorEv @ 3575 NONAME
- _ZNK13QStateMachine9isRunningEv @ 3576 NONAME
- _ZNK13QStatePrivate11childStatesEv @ 3577 NONAME
- _ZNK13QStatePrivate11transitionsEv @ 3578 NONAME
- _ZNK13QStatePrivate13historyStatesEv @ 3579 NONAME
- _ZNK14QAbstractState10metaObjectEv @ 3580 NONAME
- _ZNK14QAbstractState11parentStateEv @ 3581 NONAME
- _ZNK14QAbstractState7machineEv @ 3582 NONAME
- _ZNK15QAnimationGroup10metaObjectEv @ 3583 NONAME
- _ZNK15QAnimationGroup11animationAtEi @ 3584 NONAME
- _ZNK15QAnimationGroup14animationCountEv @ 3585 NONAME
- _ZNK15QAnimationGroup16indexOfAnimationEP18QAbstractAnimation @ 3586 NONAME
- _ZNK15QPauseAnimation10metaObjectEv @ 3587 NONAME
- _ZNK15QPauseAnimation8durationEv @ 3588 NONAME
- _ZNK16QEventTransition10metaObjectEv @ 3589 NONAME
- _ZNK16QEventTransition11eventObjectEv @ 3590 NONAME ABSENT
- _ZNK16QEventTransition9eventTypeEv @ 3591 NONAME
- _ZNK17QSignalTransition10metaObjectEv @ 3592 NONAME
- _ZNK17QSignalTransition12senderObjectEv @ 3593 NONAME
- _ZNK17QSignalTransition6signalEv @ 3594 NONAME
- _ZNK17QVariantAnimation10keyValueAtEf @ 3595 NONAME
- _ZNK17QVariantAnimation10metaObjectEv @ 3596 NONAME
- _ZNK17QVariantAnimation10startValueEv @ 3597 NONAME
- _ZNK17QVariantAnimation11easingCurveEv @ 3598 NONAME
- _ZNK17QVariantAnimation12currentValueEv @ 3599 NONAME
- _ZNK17QVariantAnimation12interpolatedERK8QVariantS2_f @ 3600 NONAME
- _ZNK17QVariantAnimation8durationEv @ 3601 NONAME
- _ZNK17QVariantAnimation8endValueEv @ 3602 NONAME
- _ZNK17QVariantAnimation9keyValuesEv @ 3603 NONAME
- _ZNK18QAbstractAnimation10metaObjectEv @ 3604 NONAME
- _ZNK18QAbstractAnimation11currentLoopEv @ 3605 NONAME
- _ZNK18QAbstractAnimation11currentTimeEv @ 3606 NONAME
- _ZNK18QAbstractAnimation13totalDurationEv @ 3607 NONAME
- _ZNK18QAbstractAnimation5groupEv @ 3608 NONAME
- _ZNK18QAbstractAnimation5stateEv @ 3609 NONAME
- _ZNK18QAbstractAnimation9directionEv @ 3610 NONAME
- _ZNK18QAbstractAnimation9loopCountEv @ 3611 NONAME
- _ZNK18QAbstractItemModel9roleNamesEv @ 3612 NONAME
- _ZNK18QPropertyAnimation10metaObjectEv @ 3613 NONAME
- _ZNK18QPropertyAnimation12propertyNameEv @ 3614 NONAME
- _ZNK18QPropertyAnimation12targetObjectEv @ 3615 NONAME
- _ZNK19QAbstractTransition10animationsEv @ 3616 NONAME
- _ZNK19QAbstractTransition10metaObjectEv @ 3617 NONAME
- _ZNK19QAbstractTransition11sourceStateEv @ 3618 NONAME
- _ZNK19QAbstractTransition11targetStateEv @ 3619 NONAME
- _ZNK19QAbstractTransition12targetStatesEv @ 3620 NONAME
- _ZNK19QAbstractTransition7machineEv @ 3621 NONAME
- _ZNK20QStateMachinePrivate10isCompoundEPK14QAbstractState @ 3622 NONAME
- _ZNK20QStateMachinePrivate11isPreemptedEPK14QAbstractStateRK4QSetIP19QAbstractTransitionE @ 3623 NONAME
- _ZNK20QStateMachinePrivate13hasRestorableEP7QObjectRK10QByteArray @ 3624 NONAME
- _ZNK20QStateMachinePrivate14isInFinalStateEP14QAbstractState @ 3625 NONAME
- _ZNK20QStateMachinePrivate15restorableValueEP7QObjectRK10QByteArray @ 3626 NONAME
- _ZNK20QStateMachinePrivate17selectTransitionsEP6QEvent @ 3627 NONAME
- _ZNK20QStateMachinePrivate25restorablesToPropertyListERK5QHashI5QPairIP7QObject10QByteArrayE8QVariantE @ 3628 NONAME
- _ZNK20QStateMachinePrivate7findLCAERK5QListIP14QAbstractStateE @ 3629 NONAME
- _ZNK20QStateMachinePrivate8isAtomicEPK14QAbstractState @ 3630 NONAME
- _ZNK20QStateMachinePrivate9rootStateEv @ 3631 NONAME
- _ZNK23QParallelAnimationGroup10metaObjectEv @ 3632 NONAME
- _ZNK23QParallelAnimationGroup8durationEv @ 3633 NONAME
- _ZNK24QNonContiguousByteDevice10metaObjectEv @ 3634 NONAME
- _ZNK25QSequentialAnimationGroup10metaObjectEv @ 3635 NONAME
- _ZNK25QSequentialAnimationGroup16currentAnimationEv @ 3636 NONAME
- _ZNK25QSequentialAnimationGroup8durationEv @ 3637 NONAME
- _ZNK26QAbstractTransitionPrivate11sourceStateEv @ 3638 NONAME
- _ZNK26QAbstractTransitionPrivate7machineEv @ 3639 NONAME
- _ZNK6QState10errorStateEv @ 3640 NONAME
- _ZNK6QState10metaObjectEv @ 3641 NONAME
- _ZNK6QState12initialStateEv @ 3642 NONAME
- _ZNK6QState9childModeEv @ 3643 NONAME
- _ZNK7QPointF15manhattanLengthEv @ 3644 NONAME
- _ZNK8QProcess15environmentHashEv @ 3645 NONAME ABSENT
- _ZNK8QVariant6toRealEPb @ 3646 NONAME
- _ZNK8QVariant7toFloatEPb @ 3647 NONAME
- _ZNK9QTimeLine11easingCurveEv @ 3648 NONAME
- _ZTI11QFinalState @ 3649 NONAME
- _ZTI12QSignalEvent @ 3650 NONAME ABSENT
- _ZTI13QHistoryState @ 3651 NONAME
- _ZTI13QStateMachine @ 3652 NONAME
- _ZTI13QStatePrivate @ 3653 NONAME
- _ZTI13QWrappedEvent @ 3654 NONAME ABSENT
- _ZTI14QAbstractState @ 3655 NONAME
- _ZTI15QAnimationGroup @ 3656 NONAME
- _ZTI15QPauseAnimation @ 3657 NONAME
- _ZTI16QDeclarativeData @ 3658 NONAME
- _ZTI16QEventTransition @ 3659 NONAME
- _ZTI17QSignalTransition @ 3660 NONAME
- _ZTI17QVariantAnimation @ 3661 NONAME
- _ZTI18QAbstractAnimation @ 3662 NONAME
- _ZTI18QPropertyAnimation @ 3663 NONAME
- _ZTI19QAbstractTransition @ 3664 NONAME
- _ZTI20QStateMachinePrivate @ 3665 NONAME
- _ZTI23QEventTransitionPrivate @ 3666 NONAME
- _ZTI23QParallelAnimationGroup @ 3667 NONAME
- _ZTI24QNonContiguousByteDevice @ 3668 NONAME
- _ZTI25QSequentialAnimationGroup @ 3669 NONAME
- _ZTI26QAbstractTransitionPrivate @ 3670 NONAME
- _ZTI6QState @ 3671 NONAME
- _ZTV11QFinalState @ 3672 NONAME
- _ZTV12QSignalEvent @ 3673 NONAME ABSENT
- _ZTV13QHistoryState @ 3674 NONAME
- _ZTV13QStateMachine @ 3675 NONAME
- _ZTV13QStatePrivate @ 3676 NONAME
- _ZTV13QWrappedEvent @ 3677 NONAME ABSENT
- _ZTV14QAbstractState @ 3678 NONAME
- _ZTV15QAnimationGroup @ 3679 NONAME
- _ZTV15QPauseAnimation @ 3680 NONAME
- _ZTV16QDeclarativeData @ 3681 NONAME
- _ZTV16QEventTransition @ 3682 NONAME
- _ZTV17QSignalTransition @ 3683 NONAME
- _ZTV17QVariantAnimation @ 3684 NONAME
- _ZTV18QAbstractAnimation @ 3685 NONAME
- _ZTV18QPropertyAnimation @ 3686 NONAME
- _ZTV19QAbstractTransition @ 3687 NONAME
- _ZTV20QStateMachinePrivate @ 3688 NONAME
- _ZTV23QEventTransitionPrivate @ 3689 NONAME
- _ZTV23QParallelAnimationGroup @ 3690 NONAME
- _ZTV24QNonContiguousByteDevice @ 3691 NONAME
- _ZTV25QSequentialAnimationGroup @ 3692 NONAME
- _ZTV26QAbstractTransitionPrivate @ 3693 NONAME
- _ZTV6QState @ 3694 NONAME
- _Zls6QDebugRK12QEasingCurve @ 3695 NONAME
- _Z12qt_s60GetRFsv @ 3696 NONAME
- _Z21qt_regexp_toCanonicalRK7QStringN7QRegExp13PatternSyntaxE @ 3697 NONAME
- _ZN16QEventTransition14setEventSourceEP7QObject @ 3698 NONAME
- _ZN16QXmlStreamReader15readElementTextENS_24ReadElementTextBehaviourE @ 3699 NONAME
- _ZN16QXmlStreamReader18skipCurrentElementEv @ 3700 NONAME
- _ZN16QXmlStreamReader20readNextStartElementEv @ 3701 NONAME
- _ZN19QProcessEnvironment17systemEnvironmentEv @ 3702 NONAME
- _ZN19QProcessEnvironment5clearEv @ 3703 NONAME
- _ZN19QProcessEnvironment6insertERK7QStringS2_ @ 3704 NONAME
- _ZN19QProcessEnvironment6removeERK7QString @ 3705 NONAME
- _ZN19QProcessEnvironmentC1ERKS_ @ 3706 NONAME
- _ZN19QProcessEnvironmentC1Ev @ 3707 NONAME
- _ZN19QProcessEnvironmentC2ERKS_ @ 3708 NONAME
- _ZN19QProcessEnvironmentC2Ev @ 3709 NONAME
- _ZN19QProcessEnvironmentD1Ev @ 3710 NONAME
- _ZN19QProcessEnvironmentD2Ev @ 3711 NONAME
- _ZN19QProcessEnvironmentaSERKS_ @ 3712 NONAME
- _ZN8QProcess21setProcessEnvironmentERK19QProcessEnvironment @ 3713 NONAME
- _ZN8QVariantC1EiPKvj @ 3714 NONAME
- _ZN8QVariantC2EiPKvj @ 3715 NONAME
- _ZNK14QObjectPrivate11signalIndexEPKc @ 3716 NONAME
- _ZNK14QObjectPrivate17isSignalConnectedEi @ 3717 NONAME
- _ZNK16QEventTransition11eventSourceEv @ 3718 NONAME
- _ZNK19QProcessEnvironment12toStringListEv @ 3719 NONAME
- _ZNK19QProcessEnvironment5valueERK7QStringS2_ @ 3720 NONAME
- _ZNK19QProcessEnvironment7isEmptyEv @ 3721 NONAME
- _ZNK19QProcessEnvironment8containsERK7QString @ 3722 NONAME
- _ZNK19QProcessEnvironmenteqERKS_ @ 3723 NONAME
- _ZNK8QProcess18processEnvironmentEv @ 3724 NONAME
- _Z20qt_symbianLocaleNamei @ 3725 NONAME
- _ZN10QByteArray6insertEiPKci @ 3726 NONAME
- _ZN10QByteArray7prependEPKci @ 3727 NONAME
- _ZN10QEventLoop19getStaticMetaObjectEv @ 3728 NONAME
- _ZN11QFinalState19getStaticMetaObjectEv @ 3729 NONAME
- _ZN11QThreadPool19getStaticMetaObjectEv @ 3730 NONAME
- _ZN11QTranslator19getStaticMetaObjectEv @ 3731 NONAME
- _ZN12QEasingCurve19getStaticMetaObjectEv @ 3732 NONAME
- _ZN13QHistoryState19getStaticMetaObjectEv @ 3733 NONAME
- _ZN13QPluginLoader19getStaticMetaObjectEv @ 3734 NONAME
- _ZN13QSharedMemory19getStaticMetaObjectEv @ 3735 NONAME
- _ZN13QSignalMapper19getStaticMetaObjectEv @ 3736 NONAME
- _ZN13QStateMachine19getStaticMetaObjectEv @ 3737 NONAME
- _ZN14QAbstractState19getStaticMetaObjectEv @ 3738 NONAME
- _ZN14QFactoryLoader19getStaticMetaObjectEv @ 3739 NONAME
- _ZN14QTemporaryFile19getStaticMetaObjectEv @ 3740 NONAME
- _ZN15QAnimationGroup19getStaticMetaObjectEv @ 3741 NONAME
- _ZN15QPauseAnimation19getStaticMetaObjectEv @ 3742 NONAME
- _ZN15QSocketNotifier19getStaticMetaObjectEv @ 3743 NONAME
- _ZN16QCoreApplication19getStaticMetaObjectEv @ 3744 NONAME
- _ZN16QEventTransition19getStaticMetaObjectEv @ 3745 NONAME
- _ZN16QTextCodecPlugin19getStaticMetaObjectEv @ 3746 NONAME
- _ZN17QSignalTransition19getStaticMetaObjectEv @ 3747 NONAME
- _ZN17QVariantAnimation19getStaticMetaObjectEv @ 3748 NONAME
- _ZN18QAbstractAnimation19getStaticMetaObjectEv @ 3749 NONAME
- _ZN18QAbstractItemModel11endMoveRowsEv @ 3750 NONAME
- _ZN18QAbstractItemModel12columnsMovedERK11QModelIndexiiS2_i @ 3751 NONAME
- _ZN18QAbstractItemModel13beginMoveRowsERK11QModelIndexiiS2_i @ 3752 NONAME
- _ZN18QAbstractItemModel13endResetModelEv @ 3753 NONAME
- _ZN18QAbstractItemModel14endMoveColumnsEv @ 3754 NONAME
- _ZN18QAbstractItemModel15beginResetModelEv @ 3755 NONAME
- _ZN18QAbstractItemModel16beginMoveColumnsERK11QModelIndexiiS2_i @ 3756 NONAME
- _ZN18QAbstractItemModel18rowsAboutToBeMovedERK11QModelIndexiiS2_i @ 3757 NONAME
- _ZN18QAbstractItemModel19getStaticMetaObjectEv @ 3758 NONAME
- _ZN18QAbstractItemModel21columnsAboutToBeMovedERK11QModelIndexiiS2_i @ 3759 NONAME
- _ZN18QAbstractItemModel9rowsMovedERK11QModelIndexiiS2_i @ 3760 NONAME
- _ZN18QAbstractListModel19getStaticMetaObjectEv @ 3761 NONAME
- _ZN18QFileSystemWatcher19getStaticMetaObjectEv @ 3762 NONAME
- _ZN18QPropertyAnimation19getStaticMetaObjectEv @ 3763 NONAME
- _ZN19QAbstractTableModel19getStaticMetaObjectEv @ 3764 NONAME
- _ZN19QAbstractTransition19getStaticMetaObjectEv @ 3765 NONAME
- _ZN21QObjectCleanupHandler19getStaticMetaObjectEv @ 3766 NONAME
- _ZN23QParallelAnimationGroup19getStaticMetaObjectEv @ 3767 NONAME
- _ZN24QAbstractEventDispatcher19getStaticMetaObjectEv @ 3768 NONAME
- _ZN24QNonContiguousByteDevice19getStaticMetaObjectEv @ 3769 NONAME
- _ZN25QAbstractItemModelPrivate10itemsMovedERK11QModelIndexiiS2_iN2Qt11OrientationE @ 3770 NONAME
- _ZN25QAbstractItemModelPrivate19itemsAboutToBeMovedERK11QModelIndexiiS2_iN2Qt11OrientationE @ 3771 NONAME
- _ZN25QAbstractItemModelPrivate21movePersistentIndexesE7QVectorIP25QPersistentModelIndexDataEiRK11QModelIndexN2Qt11OrientationE @ 3772 NONAME
- _ZN25QAbstractItemModelPrivate9allowMoveERK11QModelIndexiiS2_iN2Qt11OrientationE @ 3773 NONAME
- _ZN25QSequentialAnimationGroup19getStaticMetaObjectEv @ 3774 NONAME
- _ZN5QFile19getStaticMetaObjectEv @ 3775 NONAME
- _ZN6QEvent19getStaticMetaObjectEv @ 3776 NONAME
- _ZN6QState19getStaticMetaObjectEv @ 3777 NONAME
- _ZN6QTimer19getStaticMetaObjectEv @ 3778 NONAME
- _ZN7QBuffer19getStaticMetaObjectEv @ 3779 NONAME
- _ZN7QLocale19getStaticMetaObjectEv @ 3780 NONAME
- _ZN7QObject19getStaticMetaObjectEv @ 3781 NONAME
- _ZN7QThread19getStaticMetaObjectEv @ 3782 NONAME
- _ZN8QLibrary19getStaticMetaObjectEv @ 3783 NONAME
- _ZN8QProcess19getStaticMetaObjectEv @ 3784 NONAME
- _ZN9QIODevice19getStaticMetaObjectEv @ 3785 NONAME
- _ZN9QListData7append2ERKS_ @ 3786 NONAME
- _ZN9QListData7detach3Ev @ 3787 NONAME
- _ZN9QMimeData19getStaticMetaObjectEv @ 3788 NONAME
- _ZN9QSettings19getStaticMetaObjectEv @ 3789 NONAME
- _ZN9QTimeLine19getStaticMetaObjectEv @ 3790 NONAME
- _ZTI13QUnifiedTimer @ 3791 NONAME ABSENT ; #<TI>#
- _ZTI14QProcessActive @ 3792 NONAME ABSENT ; #<TI>#
- _ZTI18QNotifyChangeEvent @ 3793 NONAME ABSENT ; #<TI>#
- _ZTI20QEasingCurveFunction @ 3794 NONAME ABSENT ; #<TI>#
- _ZTI21QFactoryLoaderPrivate @ 3795 NONAME ABSENT ; #<TI>#
- _ZTI21QSignalEventGenerator @ 3796 NONAME ABSENT ; #<TI>#
- _ZTI22QAnimationGroupPrivate @ 3797 NONAME ABSENT ; #<TI>#
- _ZTI23QProcessManagerMediator @ 3798 NONAME ABSENT ; #<TI>#
- _ZTI24QSignalTransitionPrivate @ 3799 NONAME ABSENT ; #<TI>#
- _ZTI27QByteDeviceWrappingIoDevice @ 3800 NONAME ABSENT ; #<TI>#
- _ZTI32QSequentialAnimationGroupPrivate @ 3801 NONAME ABSENT ; #<TI>#
- _ZTI34QNonContiguousByteDeviceBufferImpl @ 3802 NONAME ABSENT ; #<TI>#
- _ZTI36QNonContiguousByteDeviceIoDeviceImpl @ 3803 NONAME ABSENT ; #<TI>#
- _ZTI37QNonContiguousByteDeviceByteArrayImpl @ 3804 NONAME ABSENT ; #<TI>#
- _ZTI38QNonContiguousByteDeviceRingBufferImpl @ 3805 NONAME ABSENT ; #<TI>#
- _ZTV13QUnifiedTimer @ 3806 NONAME ABSENT ; #<VT>#
- _ZTV14QProcessActive @ 3807 NONAME ABSENT ; #<VT>#
- _ZTV18QNotifyChangeEvent @ 3808 NONAME ABSENT ; #<VT>#
- _ZTV20QEasingCurveFunction @ 3809 NONAME ABSENT ; #<VT>#
- _ZTV21QFactoryLoaderPrivate @ 3810 NONAME ABSENT ; #<VT>#
- _ZTV21QSignalEventGenerator @ 3811 NONAME ABSENT ; #<VT>#
- _ZTV22QAnimationGroupPrivate @ 3812 NONAME ABSENT ; #<VT>#
- _ZTV23QProcessManagerMediator @ 3813 NONAME ABSENT ; #<VT>#
- _ZTV24QSignalTransitionPrivate @ 3814 NONAME ABSENT ; #<VT>#
- _ZTV27QByteDeviceWrappingIoDevice @ 3815 NONAME ABSENT ; #<VT>#
- _ZTV32QSequentialAnimationGroupPrivate @ 3816 NONAME ABSENT ; #<VT>#
- _ZTV34QNonContiguousByteDeviceBufferImpl @ 3817 NONAME ABSENT ; #<VT>#
- _ZTV36QNonContiguousByteDeviceIoDeviceImpl @ 3818 NONAME ABSENT ; #<VT>#
- _ZTV37QNonContiguousByteDeviceByteArrayImpl @ 3819 NONAME ABSENT ; #<VT>#
- _ZTV38QNonContiguousByteDeviceRingBufferImpl @ 3820 NONAME ABSENT ; #<VT>#
- _Zls6QDebugRK8QMargins @ 3821 NONAME
- _ZN15QPauseAnimation17updateCurrentTimeEv @ 3822 NONAME ABSENT
- _ZN17QVariantAnimation17updateCurrentTimeEv @ 3823 NONAME ABSENT
- _ZN23QParallelAnimationGroup17updateCurrentTimeEv @ 3824 NONAME ABSENT
- _ZN25QSequentialAnimationGroup17updateCurrentTimeEv @ 3825 NONAME ABSENT
- _ZN11QDataStream25setFloatingPointPrecisionENS_22FloatingPointPrecisionE @ 3826 NONAME
- _ZN13QStateMachine16postDelayedEventEP6QEventi @ 3827 NONAME
- _ZN13QStateMachine18cancelDelayedEventEi @ 3828 NONAME
- _ZN13QStateMachine9postEventEP6QEventNS_13EventPriorityE @ 3829 NONAME
- _ZN20QStateMachinePrivate13processEventsENS_19EventProcessingModeE @ 3830 NONAME
- _ZN20QStateMachinePrivate19handleFilteredEventEP7QObjectP6QEvent @ 3831 NONAME
- _ZN20QStateMachinePrivate22cancelAllDelayedEventsEv @ 3832 NONAME
- _ZN4QUrl13fromUserInputERK7QString @ 3833 NONAME
- _ZNK11QDataStream22floatingPointPrecisionEv @ 3834 NONAME
- qt_sine_table @ 3835 NONAME DATA 1024
+ _Z14qt_safe_selectiP6fd_setS0_S0_PK7timeval @ 22 NONAME
+ _Z15lowercasedigitsR11QTextStream @ 23 NONAME
+ _Z15qAddPostRoutinePFvvE @ 24 NONAME
+ _Z15qInitResourceIOv @ 25 NONAME
+ _Z15qt_atomic_yieldPi @ 26 NONAME
+ _Z15qt_error_stringi @ 27 NONAME
+ _Z15uppercasedigitsR11QTextStream @ 28 NONAME
+ _Z16qt_QString2HBufCRK7QString @ 29 NONAME
+ _Z16qt_TDesC2QStringRK7TDesC16 @ 30 NONAME
+ _Z16qt_check_pointerPKci @ 31 NONAME
+ _Z17qt_message_output9QtMsgTypePKc @ 32 NONAME
+ _Z18qGetCharAttributesPKtjPK13HB_ScriptItemjP17HB_CharAttributes @ 33 NONAME
+ _Z18qInstallMsgHandlerPFv9QtMsgTypePKcE @ 34 NONAME
+ _Z18qRemovePostRoutinePFvvE @ 35 NONAME
+ _Z19qcoreVariantHandlerv @ 36 NONAME
+ _Z20qt_qFindChild_helperPK7QObjectRK7QStringRK11QMetaObject @ 37 NONAME
+ _Z20qt_symbianLocaleNamei @ 38 NONAME
+ _Z21qDeleteInEventHandlerP7QObject @ 39 NONAME
+ _Z21qRegisterResourceDataiPKhS0_S0_ @ 40 NONAME
+ _Z21qt_call_post_routinesv @ 41 NONAME
+ _Z21qt_regexp_toCanonicalRK7QStringN7QRegExp13PatternSyntaxE @ 42 NONAME
+ _Z23qUnregisterResourceDataiPKhS0_S0_ @ 43 NONAME
+ _Z23qt_qFindChildren_helperPK7QObjectRK7QStringPK7QRegExpRK11QMetaObjectP5QListIPvE @ 44 NONAME
+ _Z23qt_resolveS60PluginFunci @ 45 NONAME
+ _Z23qt_symbian_throwIfErrori @ 46 NONAME
+ _Z24qGlobalPostedEventsCountv @ 47 NONAME
+ _Z24qcoreStateMachineHandlerv @ 48 NONAME
+ _Z26qt_symbian_exception2ErrorRKSt9exception @ 49 NONAME
+ _Z27qt_symbian_exception2LeaveLRKSt9exception @ 50 NONAME
+ _Z2wsR11QTextStream @ 51 NONAME
+ _Z32qt_register_signal_spy_callbacksRK21QSignalSpyCallbackSet @ 52 NONAME
+ _Z33QBasicAtomicInt_testAndSetOrderedPViii @ 53 NONAME
+ _Z34QBasicAtomicInt_fetchAndAddOrderedPVii @ 54 NONAME
+ _Z36QBasicAtomicInt_fetchAndStoreOrderedPVii @ 55 NONAME
+ _Z37QBasicAtomicPointer_testAndSetOrderedPVPvS_S_ @ 56 NONAME
+ _Z37qRegisterStaticPluginInstanceFunctionPFP7QObjectvE @ 57 NONAME
+ _Z38QBasicAtomicPointer_fetchAndAddOrderedPVPvi @ 58 NONAME
+ _Z3binR11QTextStream @ 59 NONAME
+ _Z3bomR11QTextStream @ 60 NONAME
+ _Z3decR11QTextStream @ 61 NONAME
+ _Z3hexR11QTextStream @ 62 NONAME
+ _Z3octR11QTextStream @ 63 NONAME
+ _Z40QBasicAtomicPointer_fetchAndStoreOrderedPVPvS_ @ 64 NONAME
+ _Z4endlR11QTextStream @ 65 NONAME
+ _Z4leftR11QTextStream @ 66 NONAME
+ _Z4qInfv @ 67 NONAME
+ _Z5fixedR11QTextStream @ 68 NONAME
+ _Z5flushR11QTextStream @ 69 NONAME
+ _Z5qFreePv @ 70 NONAME
+ _Z5qHashRK10QByteArray @ 71 NONAME
+ _Z5qHashRK10QStringRef @ 72 NONAME
+ _Z5qHashRK7QString @ 73 NONAME
+ _Z5qHashRK9QBitArray @ 74 NONAME
+ _Z5qQNaNv @ 75 NONAME
+ _Z5qSNaNv @ 76 NONAME
+ _Z5qdtoadiiPiS_PPcS1_ @ 77 NONAME
+ _Z5qrandv @ 78 NONAME
+ _Z5resetR11QTextStream @ 79 NONAME
+ _Z5rightR11QTextStream @ 80 NONAME
+ _Z6centerR11QTextStream @ 81 NONAME
+ _Z6qDebugPKcz @ 82 NONAME
+ _Z6qFatalPKcz @ 83 NONAME
+ _Z6qIsInfd @ 84 NONAME
+ _Z6qIsInff @ 85 NONAME
+ _Z6qIsNaNd @ 86 NONAME
+ _Z6qIsNaNf @ 87 NONAME
+ _Z6qsrandj @ 88 NONAME
+ _Z6qtTrIdPKci @ 89 NONAME
+ _Z7qMallocj @ 90 NONAME
+ _Z7qMemSetPvij @ 91 NONAME
+ _Z7qgetenvPKc @ 92 NONAME
+ _Z7qputenvPKcRK10QByteArray @ 93 NONAME
+ _Z7qstrcmpPKcS0_ @ 94 NONAME
+ _Z7qstrcmpRK10QByteArrayPKc @ 95 NONAME
+ _Z7qstrcmpRK10QByteArrayS1_ @ 96 NONAME
+ _Z7qstrcpyPcPKc @ 97 NONAME
+ _Z7qstrdupPKc @ 98 NONAME
+ _Z7qstrtodPKcPS0_Pb @ 99 NONAME
+ _Z8qAppNamev @ 100 NONAME
+ _Z8qMemCopyPvPKvj @ 101 NONAME
+ _Z8qReallocPvj @ 102 NONAME
+ _Z8qVersionv @ 103 NONAME
+ _Z8qWarningPKcz @ 104 NONAME
+ _Z8qstricmpPKcS0_ @ 105 NONAME
+ _Z8qstrncpyPcPKcj @ 106 NONAME
+ _Z8showbaseR11QTextStream @ 107 NONAME
+ _Z9forcesignR11QTextStream @ 108 NONAME
+ _Z9qBadAllocv @ 109 NONAME
+ _Z9qChecksumPKcj @ 110 NONAME
+ _Z9qCompressPKhii @ 111 NONAME
+ _Z9qCriticalPKcz @ 112 NONAME
+ _Z9qIsFinited @ 113 NONAME
+ _Z9qIsFinitef @ 114 NONAME
+ _Z9qsnprintfPcjPKcz @ 115 NONAME
+ _Z9qstrnicmpPKcS0_j @ 116 NONAME
+ _Z9qt_assertPKcS0_i @ 117 NONAME
+ _ZN10QByteArray10fromBase64ERKS_ @ 118 NONAME
+ _ZN10QByteArray11fromRawDataEPKci @ 119 NONAME
+ _ZN10QByteArray11shared_nullE @ 120 NONAME DATA 20
+ _ZN10QByteArray12shared_emptyE @ 121 NONAME DATA 20
+ _ZN10QByteArray19fromPercentEncodingERKS_c @ 122 NONAME
+ _ZN10QByteArray4chopEi @ 123 NONAME
+ _ZN10QByteArray4fillEci @ 124 NONAME
+ _ZN10QByteArray5clearEv @ 125 NONAME
+ _ZN10QByteArray6appendEPKc @ 126 NONAME
+ _ZN10QByteArray6appendEPKci @ 127 NONAME
+ _ZN10QByteArray6appendERKS_ @ 128 NONAME
+ _ZN10QByteArray6appendEc @ 129 NONAME
+ _ZN10QByteArray6expandEi @ 130 NONAME
+ _ZN10QByteArray6insertEiPKc @ 131 NONAME
+ _ZN10QByteArray6insertEiPKci @ 132 NONAME
+ _ZN10QByteArray6insertEiRKS_ @ 133 NONAME
+ _ZN10QByteArray6insertEic @ 134 NONAME
+ _ZN10QByteArray6numberEdci @ 135 NONAME
+ _ZN10QByteArray6numberEii @ 136 NONAME
+ _ZN10QByteArray6numberEji @ 137 NONAME
+ _ZN10QByteArray6numberExi @ 138 NONAME
+ _ZN10QByteArray6numberEyi @ 139 NONAME
+ _ZN10QByteArray6removeEii @ 140 NONAME
+ _ZN10QByteArray6resizeEi @ 141 NONAME
+ _ZN10QByteArray6setNumEdci @ 142 NONAME
+ _ZN10QByteArray6setNumExi @ 143 NONAME
+ _ZN10QByteArray6setNumEyi @ 144 NONAME
+ _ZN10QByteArray7fromHexERKS_ @ 145 NONAME
+ _ZN10QByteArray7prependEPKc @ 146 NONAME
+ _ZN10QByteArray7prependEPKci @ 147 NONAME
+ _ZN10QByteArray7prependERKS_ @ 148 NONAME
+ _ZN10QByteArray7prependEc @ 149 NONAME
+ _ZN10QByteArray7reallocEi @ 150 NONAME
+ _ZN10QByteArray7replaceEPKcRKS_ @ 151 NONAME
+ _ZN10QByteArray7replaceEPKciS1_i @ 152 NONAME
+ _ZN10QByteArray7replaceERKS_S1_ @ 153 NONAME
+ _ZN10QByteArray7replaceEcRKS_ @ 154 NONAME
+ _ZN10QByteArray7replaceEcc @ 155 NONAME
+ _ZN10QByteArray7replaceEiiPKc @ 156 NONAME
+ _ZN10QByteArray7replaceEiiRKS_ @ 157 NONAME
+ _ZN10QByteArray8truncateEi @ 158 NONAME
+ _ZN10QByteArrayC1EPKc @ 159 NONAME
+ _ZN10QByteArrayC1EPKci @ 160 NONAME
+ _ZN10QByteArrayC1EiN2Qt14InitializationE @ 161 NONAME
+ _ZN10QByteArrayC1Eic @ 162 NONAME
+ _ZN10QByteArrayC2EPKc @ 163 NONAME
+ _ZN10QByteArrayC2EPKci @ 164 NONAME
+ _ZN10QByteArrayC2EiN2Qt14InitializationE @ 165 NONAME
+ _ZN10QByteArrayC2Eic @ 166 NONAME
+ _ZN10QByteArrayaSEPKc @ 167 NONAME
+ _ZN10QByteArrayaSERKS_ @ 168 NONAME
+ _ZN10QEventLoop11qt_metacallEN11QMetaObject4CallEiPPv @ 169 NONAME
+ _ZN10QEventLoop11qt_metacastEPKc @ 170 NONAME
+ _ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE @ 171 NONAME
+ _ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEEi @ 172 NONAME
+ _ZN10QEventLoop16staticMetaObjectE @ 173 NONAME DATA 16
+ _ZN10QEventLoop19getStaticMetaObjectEv @ 174 NONAME
+ _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE @ 175 NONAME
+ _ZN10QEventLoop4exitEi @ 176 NONAME
+ _ZN10QEventLoop4quitEv @ 177 NONAME
+ _ZN10QEventLoop6wakeUpEv @ 178 NONAME
+ _ZN10QEventLoopC1EP7QObject @ 179 NONAME
+ _ZN10QEventLoopC2EP7QObject @ 180 NONAME
+ _ZN10QEventLoopD0Ev @ 181 NONAME
+ _ZN10QEventLoopD1Ev @ 182 NONAME
+ _ZN10QEventLoopD2Ev @ 183 NONAME
+ _ZN10QMutexPool17globalInstanceGetEPKv @ 184 NONAME
+ _ZN10QMutexPool3getEPKv @ 185 NONAME
+ _ZN10QMutexPool8instanceEv @ 186 NONAME
+ _ZN10QMutexPoolC1EN6QMutex13RecursionModeEi @ 187 NONAME
+ _ZN10QMutexPoolC2EN6QMutex13RecursionModeEi @ 188 NONAME
+ _ZN10QMutexPoolD1Ev @ 189 NONAME
+ _ZN10QMutexPoolD2Ev @ 190 NONAME
+ _ZN10QSemaphore10tryAcquireEi @ 191 NONAME
+ _ZN10QSemaphore10tryAcquireEii @ 192 NONAME
+ _ZN10QSemaphore7acquireEi @ 193 NONAME
+ _ZN10QSemaphore7releaseEi @ 194 NONAME
+ _ZN10QSemaphoreC1Ei @ 195 NONAME
+ _ZN10QSemaphoreC2Ei @ 196 NONAME
+ _ZN10QSemaphoreD1Ev @ 197 NONAME
+ _ZN10QSemaphoreD2Ev @ 198 NONAME
+ _ZN10QTextCodec11codecForMibEi @ 199 NONAME
+ _ZN10QTextCodec12codecForHtmlERK10QByteArray @ 200 NONAME
+ _ZN10QTextCodec12codecForHtmlERK10QByteArrayPS_ @ 201 NONAME
+ _ZN10QTextCodec12codecForNameERK10QByteArray @ 202 NONAME
+ _ZN10QTextCodec13availableMibsEv @ 203 NONAME
+ _ZN10QTextCodec14ConverterStateD1Ev @ 204 NONAME
+ _ZN10QTextCodec14ConverterStateD2Ev @ 205 NONAME
+ _ZN10QTextCodec14codecForLocaleEv @ 206 NONAME
+ _ZN10QTextCodec15availableCodecsEv @ 207 NONAME
+ _ZN10QTextCodec15codecForUtfTextERK10QByteArray @ 208 NONAME
+ _ZN10QTextCodec15codecForUtfTextERK10QByteArrayPS_ @ 209 NONAME
+ _ZN10QTextCodec17setCodecForLocaleEPS_ @ 210 NONAME
+ _ZN10QTextCodec4cftrE @ 211 NONAME DATA 4
+ _ZN10QTextCodecC2Ev @ 212 NONAME
+ _ZN10QTextCodecD0Ev @ 213 NONAME
+ _ZN10QTextCodecD1Ev @ 214 NONAME
+ _ZN10QTextCodecD2Ev @ 215 NONAME
+ _ZN11QBasicTimer4stopEv @ 216 NONAME
+ _ZN11QBasicTimer5startEiP7QObject @ 217 NONAME
+ _ZN11QChildEventC1EN6QEvent4TypeEP7QObject @ 218 NONAME
+ _ZN11QChildEventC2EN6QEvent4TypeEP7QObject @ 219 NONAME
+ _ZN11QChildEventD0Ev @ 220 NONAME
+ _ZN11QChildEventD1Ev @ 221 NONAME
+ _ZN11QChildEventD2Ev @ 222 NONAME
+ _ZN11QDataStream10writeBytesEPKcj @ 223 NONAME
+ _ZN11QDataStream11readRawDataEPci @ 224 NONAME
+ _ZN11QDataStream11resetStatusEv @ 225 NONAME
+ _ZN11QDataStream11skipRawDataEi @ 226 NONAME
+ _ZN11QDataStream11unsetDeviceEv @ 227 NONAME
+ _ZN11QDataStream12setByteOrderENS_9ByteOrderE @ 228 NONAME
+ _ZN11QDataStream12writeRawDataEPKci @ 229 NONAME
+ _ZN11QDataStream25setFloatingPointPrecisionENS_22FloatingPointPrecisionE @ 230 NONAME
+ _ZN11QDataStream9readBytesERPcRj @ 231 NONAME
+ _ZN11QDataStream9setDeviceEP9QIODevice @ 232 NONAME
+ _ZN11QDataStream9setStatusENS_6StatusE @ 233 NONAME
+ _ZN11QDataStreamC1EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 234 NONAME
+ _ZN11QDataStreamC1EP9QIODevice @ 235 NONAME
+ _ZN11QDataStreamC1ERK10QByteArray @ 236 NONAME
+ _ZN11QDataStreamC1Ev @ 237 NONAME
+ _ZN11QDataStreamC2EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 238 NONAME
+ _ZN11QDataStreamC2EP9QIODevice @ 239 NONAME
+ _ZN11QDataStreamC2ERK10QByteArray @ 240 NONAME
+ _ZN11QDataStreamC2Ev @ 241 NONAME
+ _ZN11QDataStreamD0Ev @ 242 NONAME
+ _ZN11QDataStreamD1Ev @ 243 NONAME
+ _ZN11QDataStreamD2Ev @ 244 NONAME
+ _ZN11QDataStreamlsEPKc @ 245 NONAME
+ _ZN11QDataStreamlsEa @ 246 NONAME
+ _ZN11QDataStreamlsEb @ 247 NONAME
+ _ZN11QDataStreamlsEd @ 248 NONAME
+ _ZN11QDataStreamlsEf @ 249 NONAME
+ _ZN11QDataStreamlsEi @ 250 NONAME
+ _ZN11QDataStreamlsEs @ 251 NONAME
+ _ZN11QDataStreamlsEx @ 252 NONAME
+ _ZN11QDataStreamrsERPc @ 253 NONAME
+ _ZN11QDataStreamrsERa @ 254 NONAME
+ _ZN11QDataStreamrsERb @ 255 NONAME
+ _ZN11QDataStreamrsERd @ 256 NONAME
+ _ZN11QDataStreamrsERf @ 257 NONAME
+ _ZN11QDataStreamrsERi @ 258 NONAME
+ _ZN11QDataStreamrsERs @ 259 NONAME
+ _ZN11QDataStreamrsERx @ 260 NONAME
+ _ZN11QFinalState11qt_metacallEN11QMetaObject4CallEiPPv @ 261 NONAME
+ _ZN11QFinalState11qt_metacastEPKc @ 262 NONAME
+ _ZN11QFinalState16staticMetaObjectE @ 263 NONAME DATA 16
+ _ZN11QFinalState19getStaticMetaObjectEv @ 264 NONAME
+ _ZN11QFinalState5eventEP6QEvent @ 265 NONAME
+ _ZN11QFinalState6onExitEP6QEvent @ 266 NONAME
+ _ZN11QFinalState7onEntryEP6QEvent @ 267 NONAME
+ _ZN11QFinalStateC1EP6QState @ 268 NONAME
+ _ZN11QFinalStateC2EP6QState @ 269 NONAME
+ _ZN11QFinalStateD0Ev @ 270 NONAME
+ _ZN11QFinalStateD1Ev @ 271 NONAME
+ _ZN11QFinalStateD2Ev @ 272 NONAME
+ _ZN11QMetaObject10disconnectEPK7QObjectiS2_i @ 273 NONAME
+ _ZN11QMetaObject11changeGuardEPP7QObjectS1_ @ 274 NONAME
+ _ZN11QMetaObject11removeGuardEPP7QObject @ 275 NONAME
+ _ZN11QMetaObject12invokeMethodEP7QObjectPKcN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS7_S7_S7_S7_S7_S7_S7_S7_S7_ @ 276 NONAME
+ _ZN11QMetaObject14normalizedTypeEPKc @ 277 NONAME
+ _ZN11QMetaObject16checkConnectArgsEPKcS1_ @ 278 NONAME
+ _ZN11QMetaObject18connectSlotsByNameEP7QObject @ 279 NONAME
+ _ZN11QMetaObject19normalizedSignatureEPKc @ 280 NONAME
+ _ZN11QMetaObject7connectEPK7QObjectiS2_iiPi @ 281 NONAME
+ _ZN11QMetaObject8activateEP7QObjectPKS_iPPv @ 282 NONAME
+ _ZN11QMetaObject8activateEP7QObjectPKS_iiPPv @ 283 NONAME
+ _ZN11QMetaObject8activateEP7QObjectiPPv @ 284 NONAME
+ _ZN11QMetaObject8activateEP7QObjectiiPPv @ 285 NONAME
+ _ZN11QMetaObject8addGuardEPP7QObject @ 286 NONAME
+ _ZN11QMetaObject8metacallEP7QObjectNS_4CallEiPPv @ 287 NONAME
+ _ZN11QTextStream10setPadCharE5QChar @ 288 NONAME
+ _ZN11QTextStream11resetStatusEv @ 289 NONAME
+ _ZN11QTextStream13setFieldWidthEi @ 290 NONAME
+ _ZN11QTextStream14setIntegerBaseEi @ 291 NONAME
+ _ZN11QTextStream14setNumberFlagsE6QFlagsINS_10NumberFlagEE @ 292 NONAME
+ _ZN11QTextStream14skipWhiteSpaceEv @ 293 NONAME
+ _ZN11QTextStream17setFieldAlignmentENS_14FieldAlignmentE @ 294 NONAME
+ _ZN11QTextStream20setAutoDetectUnicodeEb @ 295 NONAME
+ _ZN11QTextStream21setRealNumberNotationENS_18RealNumberNotationE @ 296 NONAME
+ _ZN11QTextStream22setRealNumberPrecisionEi @ 297 NONAME
+ _ZN11QTextStream24setGenerateByteOrderMarkEb @ 298 NONAME
+ _ZN11QTextStream4readEx @ 299 NONAME
+ _ZN11QTextStream4seekEx @ 300 NONAME
+ _ZN11QTextStream5flushEv @ 301 NONAME
+ _ZN11QTextStream5resetEv @ 302 NONAME
+ _ZN11QTextStream7readAllEv @ 303 NONAME
+ _ZN11QTextStream8readLineEx @ 304 NONAME
+ _ZN11QTextStream8setCodecEP10QTextCodec @ 305 NONAME
+ _ZN11QTextStream8setCodecEPKc @ 306 NONAME
+ _ZN11QTextStream9setDeviceEP9QIODevice @ 307 NONAME
+ _ZN11QTextStream9setLocaleERK7QLocale @ 308 NONAME
+ _ZN11QTextStream9setStatusENS_6StatusE @ 309 NONAME
+ _ZN11QTextStream9setStringEP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 310 NONAME
+ _ZN11QTextStreamC1EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 311 NONAME
+ _ZN11QTextStreamC1EP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 312 NONAME
+ _ZN11QTextStreamC1EP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 313 NONAME
+ _ZN11QTextStreamC1EP9QIODevice @ 314 NONAME
+ _ZN11QTextStreamC1ERK10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 315 NONAME
+ _ZN11QTextStreamC1Ev @ 316 NONAME
+ _ZN11QTextStreamC2EP10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 317 NONAME
+ _ZN11QTextStreamC2EP7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 318 NONAME
+ _ZN11QTextStreamC2EP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 319 NONAME
+ _ZN11QTextStreamC2EP9QIODevice @ 320 NONAME
+ _ZN11QTextStreamC2ERK10QByteArray6QFlagsIN9QIODevice12OpenModeFlagEE @ 321 NONAME
+ _ZN11QTextStreamC2Ev @ 322 NONAME
+ _ZN11QTextStreamD0Ev @ 323 NONAME
+ _ZN11QTextStreamD1Ev @ 324 NONAME
+ _ZN11QTextStreamD2Ev @ 325 NONAME
+ _ZN11QTextStreamlsE5QBool @ 326 NONAME
+ _ZN11QTextStreamlsE5QChar @ 327 NONAME
+ _ZN11QTextStreamlsEPKc @ 328 NONAME
+ _ZN11QTextStreamlsEPKv @ 329 NONAME
+ _ZN11QTextStreamlsERK10QByteArray @ 330 NONAME
+ _ZN11QTextStreamlsERK7QString @ 331 NONAME
+ _ZN11QTextStreamlsEc @ 332 NONAME
+ _ZN11QTextStreamlsEd @ 333 NONAME
+ _ZN11QTextStreamlsEf @ 334 NONAME
+ _ZN11QTextStreamlsEi @ 335 NONAME
+ _ZN11QTextStreamlsEj @ 336 NONAME
+ _ZN11QTextStreamlsEl @ 337 NONAME
+ _ZN11QTextStreamlsEm @ 338 NONAME
+ _ZN11QTextStreamlsEs @ 339 NONAME
+ _ZN11QTextStreamlsEt @ 340 NONAME
+ _ZN11QTextStreamlsEx @ 341 NONAME
+ _ZN11QTextStreamlsEy @ 342 NONAME
+ _ZN11QTextStreamrsEPc @ 343 NONAME
+ _ZN11QTextStreamrsER10QByteArray @ 344 NONAME
+ _ZN11QTextStreamrsER5QChar @ 345 NONAME
+ _ZN11QTextStreamrsER7QString @ 346 NONAME
+ _ZN11QTextStreamrsERc @ 347 NONAME
+ _ZN11QTextStreamrsERd @ 348 NONAME
+ _ZN11QTextStreamrsERf @ 349 NONAME
+ _ZN11QTextStreamrsERi @ 350 NONAME
+ _ZN11QTextStreamrsERj @ 351 NONAME
+ _ZN11QTextStreamrsERl @ 352 NONAME
+ _ZN11QTextStreamrsERm @ 353 NONAME
+ _ZN11QTextStreamrsERs @ 354 NONAME
+ _ZN11QTextStreamrsERt @ 355 NONAME
+ _ZN11QTextStreamrsERx @ 356 NONAME
+ _ZN11QTextStreamrsERy @ 357 NONAME
+ _ZN11QThreadPool11qt_metacallEN11QMetaObject4CallEiPPv @ 358 NONAME
+ _ZN11QThreadPool11qt_metacastEPKc @ 359 NONAME
+ _ZN11QThreadPool11waitForDoneEv @ 360 NONAME
+ _ZN11QThreadPool13releaseThreadEv @ 361 NONAME
+ _ZN11QThreadPool13reserveThreadEv @ 362 NONAME
+ _ZN11QThreadPool14globalInstanceEv @ 363 NONAME
+ _ZN11QThreadPool16setExpiryTimeoutEi @ 364 NONAME
+ _ZN11QThreadPool16staticMetaObjectE @ 365 NONAME DATA 16
+ _ZN11QThreadPool17setMaxThreadCountEi @ 366 NONAME
+ _ZN11QThreadPool19getStaticMetaObjectEv @ 367 NONAME
+ _ZN11QThreadPool5startEP9QRunnablei @ 368 NONAME
+ _ZN11QThreadPool8tryStartEP9QRunnable @ 369 NONAME
+ _ZN11QThreadPoolC1EP7QObject @ 370 NONAME
+ _ZN11QThreadPoolC2EP7QObject @ 371 NONAME
+ _ZN11QThreadPoolD0Ev @ 372 NONAME
+ _ZN11QThreadPoolD1Ev @ 373 NONAME
+ _ZN11QThreadPoolD2Ev @ 374 NONAME
+ _ZN11QTimerEventC1Ei @ 375 NONAME
+ _ZN11QTimerEventC2Ei @ 376 NONAME
+ _ZN11QTimerEventD0Ev @ 377 NONAME
+ _ZN11QTimerEventD1Ev @ 378 NONAME
+ _ZN11QTimerEventD2Ev @ 379 NONAME
+ _ZN11QTranslator11qt_metacallEN11QMetaObject4CallEiPPv @ 380 NONAME
+ _ZN11QTranslator11qt_metacastEPKc @ 381 NONAME
+ _ZN11QTranslator16staticMetaObjectE @ 382 NONAME DATA 16
+ _ZN11QTranslator19getStaticMetaObjectEv @ 383 NONAME
+ _ZN11QTranslator4loadEPKhi @ 384 NONAME
+ _ZN11QTranslator4loadERK7QStringS2_S2_S2_ @ 385 NONAME
+ _ZN11QTranslatorC1EP7QObject @ 386 NONAME
+ _ZN11QTranslatorC2EP7QObject @ 387 NONAME
+ _ZN11QTranslatorD0Ev @ 388 NONAME
+ _ZN11QTranslatorD1Ev @ 389 NONAME
+ _ZN11QTranslatorD2Ev @ 390 NONAME
+ _ZN11QVectorData11shared_nullE @ 391 NONAME DATA 16
+ _ZN11QVectorData4growEiiib @ 392 NONAME
+ _ZN11QVectorData6mallocEiiiPS_ @ 393 NONAME
+ _ZN12QDirIterator4nextEv @ 394 NONAME
+ _ZN12QDirIteratorC1ERK4QDir6QFlagsINS_12IteratorFlagEE @ 395 NONAME
+ _ZN12QDirIteratorC1ERK7QString6QFlagsIN4QDir6FilterEES3_INS_12IteratorFlagEE @ 396 NONAME
+ _ZN12QDirIteratorC1ERK7QString6QFlagsINS_12IteratorFlagEE @ 397 NONAME
+ _ZN12QDirIteratorC1ERK7QStringRK11QStringList6QFlagsIN4QDir6FilterEES6_INS_12IteratorFlagEE @ 398 NONAME
+ _ZN12QDirIteratorC2ERK4QDir6QFlagsINS_12IteratorFlagEE @ 399 NONAME
+ _ZN12QDirIteratorC2ERK7QString6QFlagsIN4QDir6FilterEES3_INS_12IteratorFlagEE @ 400 NONAME
+ _ZN12QDirIteratorC2ERK7QString6QFlagsINS_12IteratorFlagEE @ 401 NONAME
+ _ZN12QDirIteratorC2ERK7QStringRK11QStringList6QFlagsIN4QDir6FilterEES6_INS_12IteratorFlagEE @ 402 NONAME
+ _ZN12QDirIteratorD0Ev @ 403 NONAME
+ _ZN12QDirIteratorD1Ev @ 404 NONAME
+ _ZN12QDirIteratorD2Ev @ 405 NONAME
+ _ZN12QEasingCurve12setAmplitudeEf @ 406 NONAME
+ _ZN12QEasingCurve12setOvershootEf @ 407 NONAME
+ _ZN12QEasingCurve13setCustomTypeEPFffE @ 408 NONAME
+ _ZN12QEasingCurve16staticMetaObjectE @ 409 NONAME DATA 16
+ _ZN12QEasingCurve19getStaticMetaObjectEv @ 410 NONAME
+ _ZN12QEasingCurve7setTypeENS_4TypeE @ 411 NONAME
+ _ZN12QEasingCurve9setPeriodEf @ 412 NONAME
+ _ZN12QEasingCurveC1ENS_4TypeE @ 413 NONAME
+ _ZN12QEasingCurveC1ERKS_ @ 414 NONAME
+ _ZN12QEasingCurveC2ENS_4TypeE @ 415 NONAME
+ _ZN12QEasingCurveC2ERKS_ @ 416 NONAME
+ _ZN12QEasingCurveD1Ev @ 417 NONAME
+ _ZN12QEasingCurveD2Ev @ 418 NONAME
+ _ZN12QEasingCurveaSERKS_ @ 419 NONAME
+ _ZN12QLibraryInfo16licensedProductsEv @ 420 NONAME
+ _ZN12QLibraryInfo8buildKeyEv @ 421 NONAME
+ _ZN12QLibraryInfo8licenseeEv @ 422 NONAME
+ _ZN12QLibraryInfo8locationENS_15LibraryLocationE @ 423 NONAME
+ _ZN12QLibraryInfoC1Ev @ 424 NONAME
+ _ZN12QLibraryInfoC2Ev @ 425 NONAME
+ _ZN12QTextDecoder9toUnicodeEP7QStringPKci @ 426 NONAME
+ _ZN12QTextDecoder9toUnicodeEPKci @ 427 NONAME
+ _ZN12QTextDecoder9toUnicodeERK10QByteArray @ 428 NONAME
+ _ZN12QTextDecoderD1Ev @ 429 NONAME
+ _ZN12QTextDecoderD2Ev @ 430 NONAME
+ _ZN12QTextEncoder11fromUnicodeEPK5QChari @ 431 NONAME
+ _ZN12QTextEncoder11fromUnicodeERK7QString @ 432 NONAME
+ _ZN12QTextEncoderD1Ev @ 433 NONAME
+ _ZN12QTextEncoderD2Ev @ 434 NONAME
+ _ZN13QFSFileEngine11currentPathERK7QString @ 435 NONAME
+ _ZN13QFSFileEngine11setFileNameERK7QString @ 436 NONAME
+ _ZN13QFSFileEngine12endEntryListEv @ 437 NONAME
+ _ZN13QFSFileEngine14beginEntryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 438 NONAME
+ _ZN13QFSFileEngine14setCurrentPathERK7QString @ 439 NONAME
+ _ZN13QFSFileEngine14setPermissionsEj @ 440 NONAME
+ _ZN13QFSFileEngine4copyERK7QString @ 441 NONAME
+ _ZN13QFSFileEngine4linkERK7QString @ 442 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 443 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEP7__sFILE @ 444 NONAME
+ _ZN13QFSFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEEi @ 445 NONAME
+ _ZN13QFSFileEngine4readEPcx @ 446 NONAME
+ _ZN13QFSFileEngine4seekEx @ 447 NONAME
+ _ZN13QFSFileEngine5closeEv @ 448 NONAME
+ _ZN13QFSFileEngine5flushEv @ 449 NONAME
+ _ZN13QFSFileEngine5writeEPKcx @ 450 NONAME
+ _ZN13QFSFileEngine6drivesEv @ 451 NONAME
+ _ZN13QFSFileEngine6removeEv @ 452 NONAME
+ _ZN13QFSFileEngine6renameERK7QString @ 453 NONAME
+ _ZN13QFSFileEngine7setSizeEx @ 454 NONAME
+ _ZN13QFSFileEngine8homePathEv @ 455 NONAME
+ _ZN13QFSFileEngine8readLineEPcx @ 456 NONAME
+ _ZN13QFSFileEngine8rootPathEv @ 457 NONAME
+ _ZN13QFSFileEngine8tempPathEv @ 458 NONAME
+ _ZN13QFSFileEngine9extensionEN19QAbstractFileEngine9ExtensionEPKNS0_15ExtensionOptionEPNS0_15ExtensionReturnE @ 459 NONAME
+ _ZN13QFSFileEngineC1ER20QFSFileEnginePrivate @ 460 NONAME
+ _ZN13QFSFileEngineC1ERK7QString @ 461 NONAME
+ _ZN13QFSFileEngineC1Ev @ 462 NONAME
+ _ZN13QFSFileEngineC2ER20QFSFileEnginePrivate @ 463 NONAME
+ _ZN13QFSFileEngineC2ERK7QString @ 464 NONAME
+ _ZN13QFSFileEngineC2Ev @ 465 NONAME
+ _ZN13QFSFileEngineD0Ev @ 466 NONAME
+ _ZN13QFSFileEngineD1Ev @ 467 NONAME
+ _ZN13QFSFileEngineD2Ev @ 468 NONAME
+ _ZN13QFontLaoCodecD0Ev @ 469 NONAME
+ _ZN13QFontLaoCodecD1Ev @ 470 NONAME
+ _ZN13QFontLaoCodecD2Ev @ 471 NONAME
+ _ZN13QHistoryState11qt_metacallEN11QMetaObject4CallEiPPv @ 472 NONAME
+ _ZN13QHistoryState11qt_metacastEPKc @ 473 NONAME
+ _ZN13QHistoryState14setHistoryTypeENS_11HistoryTypeE @ 474 NONAME
+ _ZN13QHistoryState15setDefaultStateEP14QAbstractState @ 475 NONAME
+ _ZN13QHistoryState16staticMetaObjectE @ 476 NONAME DATA 16
+ _ZN13QHistoryState19getStaticMetaObjectEv @ 477 NONAME
+ _ZN13QHistoryState5eventEP6QEvent @ 478 NONAME
+ _ZN13QHistoryState6onExitEP6QEvent @ 479 NONAME
+ _ZN13QHistoryState7onEntryEP6QEvent @ 480 NONAME
+ _ZN13QHistoryStateC1ENS_11HistoryTypeEP6QState @ 481 NONAME
+ _ZN13QHistoryStateC1EP6QState @ 482 NONAME
+ _ZN13QHistoryStateC2ENS_11HistoryTypeEP6QState @ 483 NONAME
+ _ZN13QHistoryStateC2EP6QState @ 484 NONAME
+ _ZN13QHistoryStateD0Ev @ 485 NONAME
+ _ZN13QHistoryStateD1Ev @ 486 NONAME
+ _ZN13QHistoryStateD2Ev @ 487 NONAME
+ _ZN13QMetaPropertyC1Ev @ 488 NONAME
+ _ZN13QMetaPropertyC2Ev @ 489 NONAME
+ _ZN13QPluginLoader11qt_metacallEN11QMetaObject4CallEiPPv @ 490 NONAME
+ _ZN13QPluginLoader11qt_metacastEPKc @ 491 NONAME
+ _ZN13QPluginLoader11setFileNameERK7QString @ 492 NONAME
+ _ZN13QPluginLoader12setLoadHintsE6QFlagsIN8QLibrary8LoadHintEE @ 493 NONAME
+ _ZN13QPluginLoader15staticInstancesEv @ 494 NONAME
+ _ZN13QPluginLoader16staticMetaObjectE @ 495 NONAME DATA 16
+ _ZN13QPluginLoader19getStaticMetaObjectEv @ 496 NONAME
+ _ZN13QPluginLoader4loadEv @ 497 NONAME
+ _ZN13QPluginLoader6unloadEv @ 498 NONAME
+ _ZN13QPluginLoader8instanceEv @ 499 NONAME
+ _ZN13QPluginLoaderC1EP7QObject @ 500 NONAME
+ _ZN13QPluginLoaderC1ERK7QStringP7QObject @ 501 NONAME
+ _ZN13QPluginLoaderC2EP7QObject @ 502 NONAME
+ _ZN13QPluginLoaderC2ERK7QStringP7QObject @ 503 NONAME
+ _ZN13QPluginLoaderD0Ev @ 504 NONAME
+ _ZN13QPluginLoaderD1Ev @ 505 NONAME
+ _ZN13QPluginLoaderD2Ev @ 506 NONAME
+ _ZN13QSharedMemory11qt_metacallEN11QMetaObject4CallEiPPv @ 507 NONAME
+ _ZN13QSharedMemory11qt_metacastEPKc @ 508 NONAME
+ _ZN13QSharedMemory16staticMetaObjectE @ 509 NONAME DATA 16
+ _ZN13QSharedMemory19getStaticMetaObjectEv @ 510 NONAME
+ _ZN13QSharedMemory4dataEv @ 511 NONAME
+ _ZN13QSharedMemory4lockEv @ 512 NONAME
+ _ZN13QSharedMemory6attachENS_10AccessModeE @ 513 NONAME
+ _ZN13QSharedMemory6createEiNS_10AccessModeE @ 514 NONAME
+ _ZN13QSharedMemory6detachEv @ 515 NONAME
+ _ZN13QSharedMemory6setKeyERK7QString @ 516 NONAME
+ _ZN13QSharedMemory6unlockEv @ 517 NONAME
+ _ZN13QSharedMemoryC1EP7QObject @ 518 NONAME
+ _ZN13QSharedMemoryC1ERK7QStringP7QObject @ 519 NONAME
+ _ZN13QSharedMemoryC2EP7QObject @ 520 NONAME
+ _ZN13QSharedMemoryC2ERK7QStringP7QObject @ 521 NONAME
+ _ZN13QSharedMemoryD0Ev @ 522 NONAME
+ _ZN13QSharedMemoryD1Ev @ 523 NONAME
+ _ZN13QSharedMemoryD2Ev @ 524 NONAME
+ _ZN13QSignalMapper10setMappingEP7QObjectP7QWidget @ 525 NONAME
+ _ZN13QSignalMapper10setMappingEP7QObjectRK7QString @ 526 NONAME
+ _ZN13QSignalMapper10setMappingEP7QObjectS1_ @ 527 NONAME
+ _ZN13QSignalMapper10setMappingEP7QObjecti @ 528 NONAME
+ _ZN13QSignalMapper11qt_metacallEN11QMetaObject4CallEiPPv @ 529 NONAME
+ _ZN13QSignalMapper11qt_metacastEPKc @ 530 NONAME
+ _ZN13QSignalMapper14removeMappingsEP7QObject @ 531 NONAME
+ _ZN13QSignalMapper16staticMetaObjectE @ 532 NONAME DATA 16
+ _ZN13QSignalMapper19getStaticMetaObjectEv @ 533 NONAME
+ _ZN13QSignalMapper3mapEP7QObject @ 534 NONAME
+ _ZN13QSignalMapper3mapEv @ 535 NONAME
+ _ZN13QSignalMapper6mappedEP7QObject @ 536 NONAME
+ _ZN13QSignalMapper6mappedEP7QWidget @ 537 NONAME
+ _ZN13QSignalMapper6mappedERK7QString @ 538 NONAME
+ _ZN13QSignalMapper6mappedEi @ 539 NONAME
+ _ZN13QSignalMapperC1EP7QObject @ 540 NONAME
+ _ZN13QSignalMapperC2EP7QObject @ 541 NONAME
+ _ZN13QSignalMapperD0Ev @ 542 NONAME
+ _ZN13QSignalMapperD1Ev @ 543 NONAME
+ _ZN13QSignalMapperD2Ev @ 544 NONAME
+ _ZN13QStateMachine10clearErrorEv @ 545 NONAME
+ _ZN13QStateMachine11eventFilterEP7QObjectP6QEvent @ 546 NONAME
+ _ZN13QStateMachine11qt_metacallEN11QMetaObject4CallEiPPv @ 547 NONAME
+ _ZN13QStateMachine11qt_metacastEPKc @ 548 NONAME
+ _ZN13QStateMachine11removeStateEP14QAbstractState @ 549 NONAME
+ _ZN13QStateMachine12endMicrostepEP6QEvent @ 550 NONAME
+ _ZN13QStateMachine14beginMicrostepEP6QEvent @ 551 NONAME
+ _ZN13QStateMachine16postDelayedEventEP6QEventi @ 552 NONAME
+ _ZN13QStateMachine16staticMetaObjectE @ 553 NONAME DATA 16
+ _ZN13QStateMachine18cancelDelayedEventEi @ 554 NONAME
+ _ZN13QStateMachine19addDefaultAnimationEP18QAbstractAnimation @ 555 NONAME
+ _ZN13QStateMachine19getStaticMetaObjectEv @ 556 NONAME
+ _ZN13QStateMachine20endSelectTransitionsEP6QEvent @ 557 NONAME
+ _ZN13QStateMachine20setAnimationsEnabledEb @ 558 NONAME
+ _ZN13QStateMachine22beginSelectTransitionsEP6QEvent @ 559 NONAME
+ _ZN13QStateMachine22removeDefaultAnimationEP18QAbstractAnimation @ 560 NONAME
+ _ZN13QStateMachine22setGlobalRestorePolicyENS_13RestorePolicyE @ 561 NONAME
+ _ZN13QStateMachine4stopEv @ 562 NONAME
+ _ZN13QStateMachine5eventEP6QEvent @ 563 NONAME
+ _ZN13QStateMachine5startEv @ 564 NONAME
+ _ZN13QStateMachine6onExitEP6QEvent @ 565 NONAME
+ _ZN13QStateMachine7onEntryEP6QEvent @ 566 NONAME
+ _ZN13QStateMachine7startedEv @ 567 NONAME
+ _ZN13QStateMachine7stoppedEv @ 568 NONAME
+ _ZN13QStateMachine8addStateEP14QAbstractState @ 569 NONAME
+ _ZN13QStateMachine9postEventEP6QEventNS_13EventPriorityE @ 570 NONAME
+ _ZN13QStateMachineC1EP7QObject @ 571 NONAME
+ _ZN13QStateMachineC1ER20QStateMachinePrivateP7QObject @ 572 NONAME
+ _ZN13QStateMachineC2EP7QObject @ 573 NONAME
+ _ZN13QStateMachineC2ER20QStateMachinePrivateP7QObject @ 574 NONAME
+ _ZN13QStateMachineD0Ev @ 575 NONAME
+ _ZN13QStateMachineD1Ev @ 576 NONAME
+ _ZN13QStateMachineD2Ev @ 577 NONAME
+ _ZN13QSystemLocaleC1Eb @ 578 NONAME
+ _ZN13QSystemLocaleC1Ev @ 579 NONAME
+ _ZN13QSystemLocaleC2Eb @ 580 NONAME
+ _ZN13QSystemLocaleC2Ev @ 581 NONAME
+ _ZN13QSystemLocaleD0Ev @ 582 NONAME
+ _ZN13QSystemLocaleD1Ev @ 583 NONAME
+ _ZN13QSystemLocaleD2Ev @ 584 NONAME
+ _ZN13QUnifiedTimer8instanceEv @ 585 NONAME
+ _ZN14QAbstractState11qt_metacallEN11QMetaObject4CallEiPPv @ 586 NONAME
+ _ZN14QAbstractState11qt_metacastEPKc @ 587 NONAME
+ _ZN14QAbstractState16staticMetaObjectE @ 588 NONAME DATA 16
+ _ZN14QAbstractState19getStaticMetaObjectEv @ 589 NONAME
+ _ZN14QAbstractState5eventEP6QEvent @ 590 NONAME
+ _ZN14QAbstractState6exitedEv @ 591 NONAME
+ _ZN14QAbstractState7enteredEv @ 592 NONAME
+ _ZN14QAbstractStateC2EP6QState @ 593 NONAME
+ _ZN14QAbstractStateC2ER21QAbstractStatePrivateP6QState @ 594 NONAME
+ _ZN14QAbstractStateD0Ev @ 595 NONAME
+ _ZN14QAbstractStateD1Ev @ 596 NONAME
+ _ZN14QAbstractStateD2Ev @ 597 NONAME
+ _ZN14QFactoryLoader10refreshAllEv @ 598 NONAME
+ _ZN14QFactoryLoader11qt_metacallEN11QMetaObject4CallEiPPv @ 599 NONAME
+ _ZN14QFactoryLoader11qt_metacastEPKc @ 600 NONAME
+ _ZN14QFactoryLoader16staticMetaObjectE @ 601 NONAME DATA 16
+ _ZN14QFactoryLoader19getStaticMetaObjectEv @ 602 NONAME
+ _ZN14QFactoryLoader6updateEv @ 603 NONAME
+ _ZN14QFactoryLoaderC1EPKcRK7QStringN2Qt15CaseSensitivityE @ 604 NONAME
+ _ZN14QFactoryLoaderC2EPKcRK7QStringN2Qt15CaseSensitivityE @ 605 NONAME
+ _ZN14QFactoryLoaderD0Ev @ 606 NONAME
+ _ZN14QFactoryLoaderD1Ev @ 607 NONAME
+ _ZN14QFactoryLoaderD2Ev @ 608 NONAME
+ _ZN14QLocalePrivate17bytearrayToDoubleEPKcPbS2_ @ 609 NONAME
+ _ZN14QLocalePrivate19bytearrayToLongLongEPKciPbS2_ @ 610 NONAME
+ _ZN14QLocalePrivate19updateSystemPrivateEv @ 611 NONAME
+ _ZN14QLocalePrivate22bytearrayToUnsLongLongEPKciPb @ 612 NONAME
+ _ZN14QMetaCallEvent13placeMetaCallEP7QObject @ 613 NONAME
+ _ZN14QMetaCallEventC1EiPK7QObjectiiPiPPvP10QSemaphore @ 614 NONAME
+ _ZN14QMetaCallEventC2EiPK7QObjectiiPiPPvP10QSemaphore @ 615 NONAME
+ _ZN14QMetaCallEventD0Ev @ 616 NONAME
+ _ZN14QMetaCallEventD1Ev @ 617 NONAME
+ _ZN14QMetaCallEventD2Ev @ 618 NONAME
+ _ZN14QObjectPrivate11clearGuardsEP7QObject @ 619 NONAME
+ _ZN14QObjectPrivate13addConnectionEiPNS_10ConnectionE @ 620 NONAME
+ _ZN14QObjectPrivate14deleteChildrenEv @ 621 NONAME
+ _ZN14QObjectPrivate14setDeleteWatchEPS_Pi @ 622 NONAME
+ _ZN14QObjectPrivate16resetDeleteWatchEPS_Pii @ 623 NONAME
+ _ZN14QObjectPrivate16setCurrentSenderEP7QObjectPNS_6SenderE @ 624 NONAME
+ _ZN14QObjectPrivate16setParent_helperEP7QObject @ 625 NONAME
+ _ZN14QObjectPrivate18resetCurrentSenderEP7QObjectPNS_6SenderES3_ @ 626 NONAME
+ _ZN14QObjectPrivate19_q_reregisterTimersEPv @ 627 NONAME
+ _ZN14QObjectPrivate19moveToThread_helperEv @ 628 NONAME
+ _ZN14QObjectPrivate20cleanConnectionListsEv @ 629 NONAME
+ _ZN14QObjectPrivate20setThreadData_helperEP11QThreadDataS1_ @ 630 NONAME
+ _ZN14QObjectPrivateC1Ei @ 631 NONAME
+ _ZN14QObjectPrivateC2Ei @ 632 NONAME
+ _ZN14QObjectPrivateD0Ev @ 633 NONAME
+ _ZN14QObjectPrivateD1Ev @ 634 NONAME
+ _ZN14QObjectPrivateD2Ev @ 635 NONAME
+ _ZN14QReadWriteLock11lockForReadEv @ 636 NONAME
+ _ZN14QReadWriteLock12lockForWriteEv @ 637 NONAME
+ _ZN14QReadWriteLock14tryLockForReadEi @ 638 NONAME
+ _ZN14QReadWriteLock14tryLockForReadEv @ 639 NONAME
+ _ZN14QReadWriteLock15tryLockForWriteEi @ 640 NONAME
+ _ZN14QReadWriteLock15tryLockForWriteEv @ 641 NONAME
+ _ZN14QReadWriteLock6unlockEv @ 642 NONAME
+ _ZN14QReadWriteLockC1ENS_13RecursionModeE @ 643 NONAME
+ _ZN14QReadWriteLockC1Ev @ 644 NONAME
+ _ZN14QReadWriteLockC2ENS_13RecursionModeE @ 645 NONAME
+ _ZN14QReadWriteLockC2Ev @ 646 NONAME
+ _ZN14QReadWriteLockD1Ev @ 647 NONAME
+ _ZN14QReadWriteLockD2Ev @ 648 NONAME
+ _ZN14QStringMatcher10setPatternERK7QString @ 649 NONAME
+ _ZN14QStringMatcher18setCaseSensitivityEN2Qt15CaseSensitivityE @ 650 NONAME
+ _ZN14QStringMatcherC1EPK5QChariN2Qt15CaseSensitivityE @ 651 NONAME
+ _ZN14QStringMatcherC1ERK7QStringN2Qt15CaseSensitivityE @ 652 NONAME
+ _ZN14QStringMatcherC1ERKS_ @ 653 NONAME
+ _ZN14QStringMatcherC1Ev @ 654 NONAME
+ _ZN14QStringMatcherC2EPK5QChariN2Qt15CaseSensitivityE @ 655 NONAME
+ _ZN14QStringMatcherC2ERK7QStringN2Qt15CaseSensitivityE @ 656 NONAME
+ _ZN14QStringMatcherC2ERKS_ @ 657 NONAME
+ _ZN14QStringMatcherC2Ev @ 658 NONAME
+ _ZN14QStringMatcherD1Ev @ 659 NONAME
+ _ZN14QStringMatcherD2Ev @ 660 NONAME
+ _ZN14QStringMatcheraSERKS_ @ 661 NONAME
+ _ZN14QTemporaryFile11qt_metacallEN11QMetaObject4CallEiPPv @ 662 NONAME
+ _ZN14QTemporaryFile11qt_metacastEPKc @ 663 NONAME
+ _ZN14QTemporaryFile13setAutoRemoveEb @ 664 NONAME
+ _ZN14QTemporaryFile15createLocalFileER5QFile @ 665 NONAME
+ _ZN14QTemporaryFile15setFileTemplateERK7QString @ 666 NONAME
+ _ZN14QTemporaryFile16staticMetaObjectE @ 667 NONAME DATA 16
+ _ZN14QTemporaryFile19getStaticMetaObjectEv @ 668 NONAME
+ _ZN14QTemporaryFile4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 669 NONAME
+ _ZN14QTemporaryFileC1EP7QObject @ 670 NONAME
+ _ZN14QTemporaryFileC1ERK7QString @ 671 NONAME
+ _ZN14QTemporaryFileC1ERK7QStringP7QObject @ 672 NONAME
+ _ZN14QTemporaryFileC1Ev @ 673 NONAME
+ _ZN14QTemporaryFileC2EP7QObject @ 674 NONAME
+ _ZN14QTemporaryFileC2ERK7QString @ 675 NONAME
+ _ZN14QTemporaryFileC2ERK7QStringP7QObject @ 676 NONAME
+ _ZN14QTemporaryFileC2Ev @ 677 NONAME
+ _ZN14QTemporaryFileD0Ev @ 678 NONAME
+ _ZN14QTemporaryFileD1Ev @ 679 NONAME
+ _ZN14QTemporaryFileD2Ev @ 680 NONAME
+ _ZN14QUnicodeTables10propertiesEj @ 681 NONAME
+ _ZN14QUnicodeTables10propertiesEt @ 682 NONAME
+ _ZN14QUnicodeTables14lineBreakClassEj @ 683 NONAME
+ _ZN14QUnicodeTables6scriptEj @ 684 NONAME
+ _ZN14QWaitCondition4waitEP14QReadWriteLockm @ 685 NONAME
+ _ZN14QWaitCondition4waitEP6QMutexm @ 686 NONAME
+ _ZN14QWaitCondition7wakeAllEv @ 687 NONAME
+ _ZN14QWaitCondition7wakeOneEv @ 688 NONAME
+ _ZN14QWaitConditionC1Ev @ 689 NONAME
+ _ZN14QWaitConditionC2Ev @ 690 NONAME
+ _ZN14QWaitConditionD1Ev @ 691 NONAME
+ _ZN14QWaitConditionD2Ev @ 692 NONAME
+ _ZN15QAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 693 NONAME
+ _ZN15QAnimationGroup11qt_metacastEPKc @ 694 NONAME
+ _ZN15QAnimationGroup12addAnimationEP18QAbstractAnimation @ 695 NONAME
+ _ZN15QAnimationGroup15clearAnimationsEv @ 696 NONAME
+ _ZN15QAnimationGroup15removeAnimationEP18QAbstractAnimation @ 697 NONAME
+ _ZN15QAnimationGroup15takeAnimationAtEi @ 698 NONAME
+ _ZN15QAnimationGroup16staticMetaObjectE @ 699 NONAME DATA 16
+ _ZN15QAnimationGroup17insertAnimationAtEiP18QAbstractAnimation @ 700 NONAME
+ _ZN15QAnimationGroup19getStaticMetaObjectEv @ 701 NONAME
+ _ZN15QAnimationGroup5eventEP6QEvent @ 702 NONAME
+ _ZN15QAnimationGroupC2EP7QObject @ 703 NONAME
+ _ZN15QAnimationGroupC2ER22QAnimationGroupPrivateP7QObject @ 704 NONAME
+ _ZN15QAnimationGroupD0Ev @ 705 NONAME
+ _ZN15QAnimationGroupD1Ev @ 706 NONAME
+ _ZN15QAnimationGroupD2Ev @ 707 NONAME
+ _ZN15QBasicAtomicInt20fetchAndStoreOrderedEi @ 708 NONAME
+ _ZN15QDateTimeParser11parseFormatERK7QString @ 709 NONAME
+ _ZN15QLinkedListData11shared_nullE @ 710 NONAME DATA 20
+ _ZN15QObjectUserDataD0Ev @ 711 NONAME
+ _ZN15QObjectUserDataD1Ev @ 712 NONAME
+ _ZN15QObjectUserDataD2Ev @ 713 NONAME
+ _ZN15QPauseAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 714 NONAME
+ _ZN15QPauseAnimation11qt_metacastEPKc @ 715 NONAME
+ _ZN15QPauseAnimation11setDurationEi @ 716 NONAME
+ _ZN15QPauseAnimation16staticMetaObjectE @ 717 NONAME DATA 16
+ _ZN15QPauseAnimation17updateCurrentTimeEi @ 718 NONAME
+ _ZN15QPauseAnimation19getStaticMetaObjectEv @ 719 NONAME
+ _ZN15QPauseAnimation5eventEP6QEvent @ 720 NONAME
+ _ZN15QPauseAnimationC1EP7QObject @ 721 NONAME
+ _ZN15QPauseAnimationC1EiP7QObject @ 722 NONAME
+ _ZN15QPauseAnimationC2EP7QObject @ 723 NONAME
+ _ZN15QPauseAnimationC2EiP7QObject @ 724 NONAME
+ _ZN15QPauseAnimationD0Ev @ 725 NONAME
+ _ZN15QPauseAnimationD1Ev @ 726 NONAME
+ _ZN15QPauseAnimationD2Ev @ 727 NONAME
+ _ZN15QSocketNotifier10setEnabledEb @ 728 NONAME
+ _ZN15QSocketNotifier11qt_metacallEN11QMetaObject4CallEiPPv @ 729 NONAME
+ _ZN15QSocketNotifier11qt_metacastEPKc @ 730 NONAME
+ _ZN15QSocketNotifier16staticMetaObjectE @ 731 NONAME DATA 16
+ _ZN15QSocketNotifier19getStaticMetaObjectEv @ 732 NONAME
+ _ZN15QSocketNotifier5eventEP6QEvent @ 733 NONAME
+ _ZN15QSocketNotifier9activatedEi @ 734 NONAME
+ _ZN15QSocketNotifierC1EiNS_4TypeEP7QObject @ 735 NONAME
+ _ZN15QSocketNotifierC2EiNS_4TypeEP7QObject @ 736 NONAME
+ _ZN15QSocketNotifierD0Ev @ 737 NONAME
+ _ZN15QSocketNotifierD1Ev @ 738 NONAME
+ _ZN15QSocketNotifierD2Ev @ 739 NONAME
+ _ZN15QtSharedPointer20ExternalRefCountData16setQObjectSharedEPK7QObjectb @ 740 NONAME
+ _ZN15QtSharedPointer20ExternalRefCountData9getAndRefEPK7QObject @ 741 NONAME
+ _ZN15QtSharedPointer22internalSafetyCheckAddEPVKv @ 742 NONAME
+ _ZN15QtSharedPointer23internalSafetyCheckAdd2EPKvPVKv @ 743 NONAME
+ _ZN15QtSharedPointer25internalSafetyCheckRemoveEPVKv @ 744 NONAME
+ _ZN15QtSharedPointer26internalSafetyCheckRemove2EPKv @ 745 NONAME
+ _ZN16QCoreApplication10startingUpEv @ 746 NONAME
+ _ZN16QCoreApplication10unixSignalEi @ 747 NONAME
+ _ZN16QCoreApplication11aboutToQuitEv @ 748 NONAME
+ _ZN16QCoreApplication11closingDownEv @ 749 NONAME
+ _ZN16QCoreApplication11filterEventEPvPl @ 750 NONAME
+ _ZN16QCoreApplication11qt_metacallEN11QMetaObject4CallEiPPv @ 751 NONAME
+ _ZN16QCoreApplication11qt_metacastEPKc @ 752 NONAME
+ _ZN16QCoreApplication12libraryPathsEv @ 753 NONAME
+ _ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb @ 754 NONAME
+ _ZN16QCoreApplication13compressEventEP6QEventP7QObjectP14QPostEventList @ 755 NONAME
+ _ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 756 NONAME
+ _ZN16QCoreApplication13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEEi @ 757 NONAME
+ _ZN16QCoreApplication13testAttributeEN2Qt20ApplicationAttributeE @ 758 NONAME
+ _ZN16QCoreApplication14addLibraryPathERK7QString @ 759 NONAME
+ _ZN16QCoreApplication14applicationPidEv @ 760 NONAME
+ _ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent @ 761 NONAME
+ _ZN16QCoreApplication14setEventFilterEPFbPvPlE @ 762 NONAME
+ _ZN16QCoreApplication15applicationNameEv @ 763 NONAME
+ _ZN16QCoreApplication15setLibraryPathsERK11QStringList @ 764 NONAME
+ _ZN16QCoreApplication16hasPendingEventsEv @ 765 NONAME
+ _ZN16QCoreApplication16organizationNameEv @ 766 NONAME
+ _ZN16QCoreApplication16removeTranslatorEP11QTranslator @ 767 NONAME
+ _ZN16QCoreApplication16sendPostedEventsEP7QObjecti @ 768 NONAME
+ _ZN16QCoreApplication16staticMetaObjectE @ 769 NONAME DATA 16
+ _ZN16QCoreApplication17installTranslatorEP11QTranslator @ 770 NONAME
+ _ZN16QCoreApplication17removeLibraryPathERK7QString @ 771 NONAME
+ _ZN16QCoreApplication18applicationDirPathEv @ 772 NONAME
+ _ZN16QCoreApplication18applicationVersionEv @ 773 NONAME
+ _ZN16QCoreApplication18organizationDomainEv @ 774 NONAME
+ _ZN16QCoreApplication18removePostedEventsEP7QObject @ 775 NONAME
+ _ZN16QCoreApplication18removePostedEventsEP7QObjecti @ 776 NONAME
+ _ZN16QCoreApplication18setApplicationNameERK7QString @ 777 NONAME
+ _ZN16QCoreApplication19applicationFilePathEv @ 778 NONAME
+ _ZN16QCoreApplication19getStaticMetaObjectEv @ 779 NONAME
+ _ZN16QCoreApplication19setOrganizationNameERK7QString @ 780 NONAME
+ _ZN16QCoreApplication21setApplicationVersionERK7QString @ 781 NONAME
+ _ZN16QCoreApplication21setOrganizationDomainERK7QString @ 782 NONAME
+ _ZN16QCoreApplication4argcEv @ 783 NONAME
+ _ZN16QCoreApplication4argvEv @ 784 NONAME
+ _ZN16QCoreApplication4execEv @ 785 NONAME
+ _ZN16QCoreApplication4exitEi @ 786 NONAME
+ _ZN16QCoreApplication4initEv @ 787 NONAME
+ _ZN16QCoreApplication4quitEv @ 788 NONAME
+ _ZN16QCoreApplication4selfE @ 789 NONAME DATA 4
+ _ZN16QCoreApplication5eventEP6QEvent @ 790 NONAME
+ _ZN16QCoreApplication5flushEv @ 791 NONAME
+ _ZN16QCoreApplication6notifyEP7QObjectP6QEvent @ 792 NONAME
+ _ZN16QCoreApplication9argumentsEv @ 793 NONAME
+ _ZN16QCoreApplication9postEventEP7QObjectP6QEvent @ 794 NONAME
+ _ZN16QCoreApplication9postEventEP7QObjectP6QEventi @ 795 NONAME
+ _ZN16QCoreApplication9translateEPKcS1_S1_NS_8EncodingE @ 796 NONAME
+ _ZN16QCoreApplication9translateEPKcS1_S1_NS_8EncodingEi @ 797 NONAME
+ _ZN16QCoreApplicationC1ER23QCoreApplicationPrivate @ 798 NONAME
+ _ZN16QCoreApplicationC1ERiPPc @ 799 NONAME
+ _ZN16QCoreApplicationC2ER23QCoreApplicationPrivate @ 800 NONAME
+ _ZN16QCoreApplicationC2ERiPPc @ 801 NONAME
+ _ZN16QCoreApplicationD0Ev @ 802 NONAME
+ _ZN16QCoreApplicationD1Ev @ 803 NONAME
+ _ZN16QCoreApplicationD2Ev @ 804 NONAME
+ _ZN16QDeclarativeDataD0Ev @ 805 NONAME
+ _ZN16QDeclarativeDataD1Ev @ 806 NONAME
+ _ZN16QDeclarativeDataD2Ev @ 807 NONAME
+ _ZN16QEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 808 NONAME
+ _ZN16QEventTransition11qt_metacastEPKc @ 809 NONAME
+ _ZN16QEventTransition12onTransitionEP6QEvent @ 810 NONAME
+ _ZN16QEventTransition12setEventTypeEN6QEvent4TypeE @ 811 NONAME
+ _ZN16QEventTransition14setEventSourceEP7QObject @ 812 NONAME
+ _ZN16QEventTransition16staticMetaObjectE @ 813 NONAME DATA 16
+ _ZN16QEventTransition19getStaticMetaObjectEv @ 814 NONAME
+ _ZN16QEventTransition5eventEP6QEvent @ 815 NONAME
+ _ZN16QEventTransition9eventTestEP6QEvent @ 816 NONAME
+ _ZN16QEventTransitionC1EP6QState @ 817 NONAME
+ _ZN16QEventTransitionC1EP7QObjectN6QEvent4TypeEP6QState @ 818 NONAME
+ _ZN16QEventTransitionC1ER23QEventTransitionPrivateP6QState @ 819 NONAME
+ _ZN16QEventTransitionC1ER23QEventTransitionPrivateP7QObjectN6QEvent4TypeEP6QState @ 820 NONAME
+ _ZN16QEventTransitionC2EP6QState @ 821 NONAME
+ _ZN16QEventTransitionC2EP7QObjectN6QEvent4TypeEP6QState @ 822 NONAME
+ _ZN16QEventTransitionC2ER23QEventTransitionPrivateP6QState @ 823 NONAME
+ _ZN16QEventTransitionC2ER23QEventTransitionPrivateP7QObjectN6QEvent4TypeEP6QState @ 824 NONAME
+ _ZN16QEventTransitionD0Ev @ 825 NONAME
+ _ZN16QEventTransitionD1Ev @ 826 NONAME
+ _ZN16QEventTransitionD2Ev @ 827 NONAME
+ _ZN16QIODevicePrivate13putCharHelperEc @ 828 NONAME
+ _ZN16QIODevicePrivateC1Ev @ 829 NONAME
+ _ZN16QIODevicePrivateC2Ev @ 830 NONAME
+ _ZN16QIODevicePrivateD0Ev @ 831 NONAME
+ _ZN16QIODevicePrivateD1Ev @ 832 NONAME
+ _ZN16QIODevicePrivateD2Ev @ 833 NONAME
+ _ZN16QSystemSemaphore6setKeyERK7QStringiNS_10AccessModeE @ 834 NONAME
+ _ZN16QSystemSemaphore7acquireEv @ 835 NONAME
+ _ZN16QSystemSemaphore7releaseEi @ 836 NONAME
+ _ZN16QSystemSemaphoreC1ERK7QStringiNS_10AccessModeE @ 837 NONAME
+ _ZN16QSystemSemaphoreC2ERK7QStringiNS_10AccessModeE @ 838 NONAME
+ _ZN16QSystemSemaphoreD1Ev @ 839 NONAME
+ _ZN16QSystemSemaphoreD2Ev @ 840 NONAME
+ _ZN16QTextCodecPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 841 NONAME
+ _ZN16QTextCodecPlugin11qt_metacastEPKc @ 842 NONAME
+ _ZN16QTextCodecPlugin16staticMetaObjectE @ 843 NONAME DATA 16
+ _ZN16QTextCodecPlugin19getStaticMetaObjectEv @ 844 NONAME
+ _ZN16QTextCodecPlugin6createERK7QString @ 845 NONAME
+ _ZN16QTextCodecPluginC2EP7QObject @ 846 NONAME
+ _ZN16QTextCodecPluginD0Ev @ 847 NONAME
+ _ZN16QTextCodecPluginD1Ev @ 848 NONAME
+ _ZN16QTextCodecPluginD2Ev @ 849 NONAME
+ _ZN16QXmlStreamReader10raiseErrorERK7QString @ 850 NONAME
+ _ZN16QXmlStreamReader15readElementTextENS_24ReadElementTextBehaviourE @ 851 NONAME
+ _ZN16QXmlStreamReader15readElementTextEv @ 852 NONAME
+ _ZN16QXmlStreamReader17setEntityResolverEP24QXmlStreamEntityResolver @ 853 NONAME
+ _ZN16QXmlStreamReader18skipCurrentElementEv @ 854 NONAME
+ _ZN16QXmlStreamReader20readNextStartElementEv @ 855 NONAME
+ _ZN16QXmlStreamReader22setNamespaceProcessingEb @ 856 NONAME
+ _ZN16QXmlStreamReader28addExtraNamespaceDeclarationERK30QXmlStreamNamespaceDeclaration @ 857 NONAME
+ _ZN16QXmlStreamReader29addExtraNamespaceDeclarationsERK7QVectorI30QXmlStreamNamespaceDeclarationE @ 858 NONAME
+ _ZN16QXmlStreamReader5clearEv @ 859 NONAME
+ _ZN16QXmlStreamReader7addDataEPKc @ 860 NONAME
+ _ZN16QXmlStreamReader7addDataERK10QByteArray @ 861 NONAME
+ _ZN16QXmlStreamReader7addDataERK7QString @ 862 NONAME
+ _ZN16QXmlStreamReader8readNextEv @ 863 NONAME
+ _ZN16QXmlStreamReader9setDeviceEP9QIODevice @ 864 NONAME
+ _ZN16QXmlStreamReaderC1EP9QIODevice @ 865 NONAME
+ _ZN16QXmlStreamReaderC1EPKc @ 866 NONAME
+ _ZN16QXmlStreamReaderC1ERK10QByteArray @ 867 NONAME
+ _ZN16QXmlStreamReaderC1ERK7QString @ 868 NONAME
+ _ZN16QXmlStreamReaderC1Ev @ 869 NONAME
+ _ZN16QXmlStreamReaderC2EP9QIODevice @ 870 NONAME
+ _ZN16QXmlStreamReaderC2EPKc @ 871 NONAME
+ _ZN16QXmlStreamReaderC2ERK10QByteArray @ 872 NONAME
+ _ZN16QXmlStreamReaderC2ERK7QString @ 873 NONAME
+ _ZN16QXmlStreamReaderC2Ev @ 874 NONAME
+ _ZN16QXmlStreamReaderD1Ev @ 875 NONAME
+ _ZN16QXmlStreamReaderD2Ev @ 876 NONAME
+ _ZN16QXmlStreamWriter10writeCDATAERK7QString @ 877 NONAME
+ _ZN16QXmlStreamWriter12writeCommentERK7QString @ 878 NONAME
+ _ZN16QXmlStreamWriter14writeAttributeERK19QXmlStreamAttribute @ 879 NONAME
+ _ZN16QXmlStreamWriter14writeAttributeERK7QStringS2_ @ 880 NONAME
+ _ZN16QXmlStreamWriter14writeAttributeERK7QStringS2_S2_ @ 881 NONAME
+ _ZN16QXmlStreamWriter14writeNamespaceERK7QStringS2_ @ 882 NONAME
+ _ZN16QXmlStreamWriter15writeAttributesERK20QXmlStreamAttributes @ 883 NONAME
+ _ZN16QXmlStreamWriter15writeCharactersERK7QString @ 884 NONAME
+ _ZN16QXmlStreamWriter15writeEndElementEv @ 885 NONAME
+ _ZN16QXmlStreamWriter16writeEndDocumentEv @ 886 NONAME
+ _ZN16QXmlStreamWriter16writeTextElementERK7QStringS2_ @ 887 NONAME
+ _ZN16QXmlStreamWriter16writeTextElementERK7QStringS2_S2_ @ 888 NONAME
+ _ZN16QXmlStreamWriter17setAutoFormattingEb @ 889 NONAME
+ _ZN16QXmlStreamWriter17writeCurrentTokenERK16QXmlStreamReader @ 890 NONAME
+ _ZN16QXmlStreamWriter17writeEmptyElementERK7QString @ 891 NONAME
+ _ZN16QXmlStreamWriter17writeEmptyElementERK7QStringS2_ @ 892 NONAME
+ _ZN16QXmlStreamWriter17writeStartElementERK7QString @ 893 NONAME
+ _ZN16QXmlStreamWriter17writeStartElementERK7QStringS2_ @ 894 NONAME
+ _ZN16QXmlStreamWriter18writeStartDocumentERK7QString @ 895 NONAME
+ _ZN16QXmlStreamWriter18writeStartDocumentERK7QStringb @ 896 NONAME
+ _ZN16QXmlStreamWriter18writeStartDocumentEv @ 897 NONAME
+ _ZN16QXmlStreamWriter20writeEntityReferenceERK7QString @ 898 NONAME
+ _ZN16QXmlStreamWriter21writeDefaultNamespaceERK7QString @ 899 NONAME
+ _ZN16QXmlStreamWriter23setAutoFormattingIndentEi @ 900 NONAME
+ _ZN16QXmlStreamWriter26writeProcessingInstructionERK7QStringS2_ @ 901 NONAME
+ _ZN16QXmlStreamWriter8setCodecEP10QTextCodec @ 902 NONAME
+ _ZN16QXmlStreamWriter8setCodecEPKc @ 903 NONAME
+ _ZN16QXmlStreamWriter8writeDTDERK7QString @ 904 NONAME
+ _ZN16QXmlStreamWriter9setDeviceEP9QIODevice @ 905 NONAME
+ _ZN16QXmlStreamWriterC1EP10QByteArray @ 906 NONAME
+ _ZN16QXmlStreamWriterC1EP7QString @ 907 NONAME
+ _ZN16QXmlStreamWriterC1EP9QIODevice @ 908 NONAME
+ _ZN16QXmlStreamWriterC1Ev @ 909 NONAME
+ _ZN16QXmlStreamWriterC2EP10QByteArray @ 910 NONAME
+ _ZN16QXmlStreamWriterC2EP7QString @ 911 NONAME
+ _ZN16QXmlStreamWriterC2EP9QIODevice @ 912 NONAME
+ _ZN16QXmlStreamWriterC2Ev @ 913 NONAME
+ _ZN16QXmlStreamWriterD1Ev @ 914 NONAME
+ _ZN16QXmlStreamWriterD2Ev @ 915 NONAME
+ _ZN17QByteArrayMatcher10setPatternERK10QByteArray @ 916 NONAME
+ _ZN17QByteArrayMatcherC1EPKci @ 917 NONAME
+ _ZN17QByteArrayMatcherC1ERK10QByteArray @ 918 NONAME
+ _ZN17QByteArrayMatcherC1ERKS_ @ 919 NONAME
+ _ZN17QByteArrayMatcherC1Ev @ 920 NONAME
+ _ZN17QByteArrayMatcherC2EPKci @ 921 NONAME
+ _ZN17QByteArrayMatcherC2ERK10QByteArray @ 922 NONAME
+ _ZN17QByteArrayMatcherC2ERKS_ @ 923 NONAME
+ _ZN17QByteArrayMatcherC2Ev @ 924 NONAME
+ _ZN17QByteArrayMatcherD1Ev @ 925 NONAME
+ _ZN17QByteArrayMatcherD2Ev @ 926 NONAME
+ _ZN17QByteArrayMatcheraSERKS_ @ 927 NONAME
+ _ZN17QSignalTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 928 NONAME
+ _ZN17QSignalTransition11qt_metacastEPKc @ 929 NONAME
+ _ZN17QSignalTransition12onTransitionEP6QEvent @ 930 NONAME
+ _ZN17QSignalTransition15setSenderObjectEP7QObject @ 931 NONAME
+ _ZN17QSignalTransition16staticMetaObjectE @ 932 NONAME DATA 16
+ _ZN17QSignalTransition19getStaticMetaObjectEv @ 933 NONAME
+ _ZN17QSignalTransition5eventEP6QEvent @ 934 NONAME
+ _ZN17QSignalTransition9eventTestEP6QEvent @ 935 NONAME
+ _ZN17QSignalTransition9setSignalERK10QByteArray @ 936 NONAME
+ _ZN17QSignalTransitionC1EP6QState @ 937 NONAME
+ _ZN17QSignalTransitionC1EP7QObjectPKcP6QState @ 938 NONAME
+ _ZN17QSignalTransitionC2EP6QState @ 939 NONAME
+ _ZN17QSignalTransitionC2EP7QObjectPKcP6QState @ 940 NONAME
+ _ZN17QSignalTransitionD0Ev @ 941 NONAME
+ _ZN17QSignalTransitionD1Ev @ 942 NONAME
+ _ZN17QSignalTransitionD2Ev @ 943 NONAME
+ _ZN17QVariantAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 944 NONAME
+ _ZN17QVariantAnimation11qt_metacastEPKc @ 945 NONAME
+ _ZN17QVariantAnimation11setDurationEi @ 946 NONAME
+ _ZN17QVariantAnimation11setEndValueERK8QVariant @ 947 NONAME
+ _ZN17QVariantAnimation11updateStateEN18QAbstractAnimation5StateES1_ @ 948 NONAME
+ _ZN17QVariantAnimation12setKeyValuesERK7QVectorI5QPairIf8QVariantEE @ 949 NONAME
+ _ZN17QVariantAnimation12valueChangedERK8QVariant @ 950 NONAME
+ _ZN17QVariantAnimation13setKeyValueAtEfRK8QVariant @ 951 NONAME
+ _ZN17QVariantAnimation13setStartValueERK8QVariant @ 952 NONAME
+ _ZN17QVariantAnimation14setEasingCurveERK12QEasingCurve @ 953 NONAME
+ _ZN17QVariantAnimation16staticMetaObjectE @ 954 NONAME DATA 16
+ _ZN17QVariantAnimation17updateCurrentTimeEi @ 955 NONAME
+ _ZN17QVariantAnimation19getStaticMetaObjectEv @ 956 NONAME
+ _ZN17QVariantAnimation20registerInterpolatorEPF8QVariantPKvS2_fEi @ 957 NONAME
+ _ZN17QVariantAnimation5eventEP6QEvent @ 958 NONAME
+ _ZN17QVariantAnimationC2EP7QObject @ 959 NONAME
+ _ZN17QVariantAnimationC2ER24QVariantAnimationPrivateP7QObject @ 960 NONAME
+ _ZN17QVariantAnimationD0Ev @ 961 NONAME
+ _ZN17QVariantAnimationD1Ev @ 962 NONAME
+ _ZN17QVariantAnimationD2Ev @ 963 NONAME
+ _ZN18QAbstractAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 964 NONAME
+ _ZN18QAbstractAnimation11qt_metacastEPKc @ 965 NONAME
+ _ZN18QAbstractAnimation11updateStateENS_5StateES0_ @ 966 NONAME
+ _ZN18QAbstractAnimation12setDirectionENS_9DirectionE @ 967 NONAME
+ _ZN18QAbstractAnimation12setLoopCountEi @ 968 NONAME
+ _ZN18QAbstractAnimation12stateChangedENS_5StateES0_ @ 969 NONAME
+ _ZN18QAbstractAnimation14setCurrentTimeEi @ 970 NONAME
+ _ZN18QAbstractAnimation15updateDirectionENS_9DirectionE @ 971 NONAME
+ _ZN18QAbstractAnimation16directionChangedENS_9DirectionE @ 972 NONAME
+ _ZN18QAbstractAnimation16staticMetaObjectE @ 973 NONAME DATA 16
+ _ZN18QAbstractAnimation18currentLoopChangedEi @ 974 NONAME
+ _ZN18QAbstractAnimation19getStaticMetaObjectEv @ 975 NONAME
+ _ZN18QAbstractAnimation4stopEv @ 976 NONAME
+ _ZN18QAbstractAnimation5eventEP6QEvent @ 977 NONAME
+ _ZN18QAbstractAnimation5pauseEv @ 978 NONAME
+ _ZN18QAbstractAnimation5startENS_14DeletionPolicyE @ 979 NONAME
+ _ZN18QAbstractAnimation6resumeEv @ 980 NONAME
+ _ZN18QAbstractAnimation8finishedEv @ 981 NONAME
+ _ZN18QAbstractAnimationC2EP7QObject @ 982 NONAME
+ _ZN18QAbstractAnimationC2ER25QAbstractAnimationPrivateP7QObject @ 983 NONAME
+ _ZN18QAbstractAnimationD0Ev @ 984 NONAME
+ _ZN18QAbstractAnimationD1Ev @ 985 NONAME
+ _ZN18QAbstractAnimationD2Ev @ 986 NONAME
+ _ZN18QAbstractItemModel10decodeDataEiiRK11QModelIndexR11QDataStream @ 987 NONAME
+ _ZN18QAbstractItemModel10insertRowsEiiRK11QModelIndex @ 988 NONAME
+ _ZN18QAbstractItemModel10modelResetEv @ 989 NONAME
+ _ZN18QAbstractItemModel10removeRowsEiiRK11QModelIndex @ 990 NONAME
+ _ZN18QAbstractItemModel11dataChangedERK11QModelIndexS2_ @ 991 NONAME
+ _ZN18QAbstractItemModel11endMoveRowsEv @ 992 NONAME
+ _ZN18QAbstractItemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 993 NONAME
+ _ZN18QAbstractItemModel11qt_metacastEPKc @ 994 NONAME
+ _ZN18QAbstractItemModel11rowsRemovedERK11QModelIndexii @ 995 NONAME
+ _ZN18QAbstractItemModel11setItemDataERK11QModelIndexRK4QMapIi8QVariantE @ 996 NONAME
+ _ZN18QAbstractItemModel12columnsMovedERK11QModelIndexiiS2_i @ 997 NONAME
+ _ZN18QAbstractItemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 998 NONAME
+ _ZN18QAbstractItemModel12rowsInsertedERK11QModelIndexii @ 999 NONAME
+ _ZN18QAbstractItemModel12setRoleNamesERK5QHashIi10QByteArrayE @ 1000 NONAME
+ _ZN18QAbstractItemModel13beginMoveRowsERK11QModelIndexiiS2_i @ 1001 NONAME
+ _ZN18QAbstractItemModel13endInsertRowsEv @ 1002 NONAME
+ _ZN18QAbstractItemModel13endRemoveRowsEv @ 1003 NONAME
+ _ZN18QAbstractItemModel13endResetModelEv @ 1004 NONAME
+ _ZN18QAbstractItemModel13insertColumnsEiiRK11QModelIndex @ 1005 NONAME
+ _ZN18QAbstractItemModel13layoutChangedEv @ 1006 NONAME
+ _ZN18QAbstractItemModel13removeColumnsEiiRK11QModelIndex @ 1007 NONAME
+ _ZN18QAbstractItemModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 1008 NONAME
+ _ZN18QAbstractItemModel14columnsRemovedERK11QModelIndexii @ 1009 NONAME
+ _ZN18QAbstractItemModel14endMoveColumnsEv @ 1010 NONAME
+ _ZN18QAbstractItemModel15beginInsertRowsERK11QModelIndexii @ 1011 NONAME
+ _ZN18QAbstractItemModel15beginRemoveRowsERK11QModelIndexii @ 1012 NONAME
+ _ZN18QAbstractItemModel15beginResetModelEv @ 1013 NONAME
+ _ZN18QAbstractItemModel15columnsInsertedERK11QModelIndexii @ 1014 NONAME
+ _ZN18QAbstractItemModel16beginMoveColumnsERK11QModelIndexiiS2_i @ 1015 NONAME
+ _ZN18QAbstractItemModel16endInsertColumnsEv @ 1016 NONAME
+ _ZN18QAbstractItemModel16endRemoveColumnsEv @ 1017 NONAME
+ _ZN18QAbstractItemModel16staticMetaObjectE @ 1018 NONAME DATA 16
+ _ZN18QAbstractItemModel17headerDataChangedEN2Qt11OrientationEii @ 1019 NONAME
+ _ZN18QAbstractItemModel18beginInsertColumnsERK11QModelIndexii @ 1020 NONAME
+ _ZN18QAbstractItemModel18beginRemoveColumnsERK11QModelIndexii @ 1021 NONAME
+ _ZN18QAbstractItemModel18rowsAboutToBeMovedERK11QModelIndexiiS2_i @ 1022 NONAME
+ _ZN18QAbstractItemModel19getStaticMetaObjectEv @ 1023 NONAME
+ _ZN18QAbstractItemModel19modelAboutToBeResetEv @ 1024 NONAME
+ _ZN18QAbstractItemModel20rowsAboutToBeRemovedERK11QModelIndexii @ 1025 NONAME
+ _ZN18QAbstractItemModel21changePersistentIndexERK11QModelIndexS2_ @ 1026 NONAME
+ _ZN18QAbstractItemModel21columnsAboutToBeMovedERK11QModelIndexiiS2_i @ 1027 NONAME
+ _ZN18QAbstractItemModel21rowsAboutToBeInsertedERK11QModelIndexii @ 1028 NONAME
+ _ZN18QAbstractItemModel22layoutAboutToBeChangedEv @ 1029 NONAME
+ _ZN18QAbstractItemModel23columnsAboutToBeRemovedERK11QModelIndexii @ 1030 NONAME
+ _ZN18QAbstractItemModel23setSupportedDragActionsE6QFlagsIN2Qt10DropActionEE @ 1031 NONAME
+ _ZN18QAbstractItemModel24columnsAboutToBeInsertedERK11QModelIndexii @ 1032 NONAME
+ _ZN18QAbstractItemModel25changePersistentIndexListERK5QListI11QModelIndexES4_ @ 1033 NONAME
+ _ZN18QAbstractItemModel4sortEiN2Qt9SortOrderE @ 1034 NONAME
+ _ZN18QAbstractItemModel5resetEv @ 1035 NONAME
+ _ZN18QAbstractItemModel6revertEv @ 1036 NONAME
+ _ZN18QAbstractItemModel6submitEv @ 1037 NONAME
+ _ZN18QAbstractItemModel7setDataERK11QModelIndexRK8QVarianti @ 1038 NONAME
+ _ZN18QAbstractItemModel9fetchMoreERK11QModelIndex @ 1039 NONAME
+ _ZN18QAbstractItemModel9rowsMovedERK11QModelIndexiiS2_i @ 1040 NONAME
+ _ZN18QAbstractItemModelC2EP7QObject @ 1041 NONAME
+ _ZN18QAbstractItemModelC2ER25QAbstractItemModelPrivateP7QObject @ 1042 NONAME
+ _ZN18QAbstractItemModelD0Ev @ 1043 NONAME
+ _ZN18QAbstractItemModelD1Ev @ 1044 NONAME
+ _ZN18QAbstractItemModelD2Ev @ 1045 NONAME
+ _ZN18QAbstractListModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1046 NONAME
+ _ZN18QAbstractListModel11qt_metacastEPKc @ 1047 NONAME
+ _ZN18QAbstractListModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 1048 NONAME
+ _ZN18QAbstractListModel16staticMetaObjectE @ 1049 NONAME DATA 16
+ _ZN18QAbstractListModel19getStaticMetaObjectEv @ 1050 NONAME
+ _ZN18QAbstractListModelC2EP7QObject @ 1051 NONAME
+ _ZN18QAbstractListModelC2ER25QAbstractItemModelPrivateP7QObject @ 1052 NONAME
+ _ZN18QAbstractListModelD0Ev @ 1053 NONAME
+ _ZN18QAbstractListModelD1Ev @ 1054 NONAME
+ _ZN18QAbstractListModelD2Ev @ 1055 NONAME
+ _ZN18QCryptographicHash4hashERK10QByteArrayNS_9AlgorithmE @ 1056 NONAME
+ _ZN18QCryptographicHash5resetEv @ 1057 NONAME
+ _ZN18QCryptographicHash7addDataEPKci @ 1058 NONAME
+ _ZN18QCryptographicHash7addDataERK10QByteArray @ 1059 NONAME
+ _ZN18QCryptographicHashC1ENS_9AlgorithmE @ 1060 NONAME
+ _ZN18QCryptographicHashC2ENS_9AlgorithmE @ 1061 NONAME
+ _ZN18QCryptographicHashD1Ev @ 1062 NONAME
+ _ZN18QCryptographicHashD2Ev @ 1063 NONAME
+ _ZN18QFileSystemWatcher10removePathERK7QString @ 1064 NONAME
+ _ZN18QFileSystemWatcher11fileChangedERK7QString @ 1065 NONAME
+ _ZN18QFileSystemWatcher11qt_metacallEN11QMetaObject4CallEiPPv @ 1066 NONAME
+ _ZN18QFileSystemWatcher11qt_metacastEPKc @ 1067 NONAME
+ _ZN18QFileSystemWatcher11removePathsERK11QStringList @ 1068 NONAME
+ _ZN18QFileSystemWatcher16directoryChangedERK7QString @ 1069 NONAME
+ _ZN18QFileSystemWatcher16staticMetaObjectE @ 1070 NONAME DATA 16
+ _ZN18QFileSystemWatcher19getStaticMetaObjectEv @ 1071 NONAME
+ _ZN18QFileSystemWatcher7addPathERK7QString @ 1072 NONAME
+ _ZN18QFileSystemWatcher8addPathsERK11QStringList @ 1073 NONAME
+ _ZN18QFileSystemWatcherC1EP7QObject @ 1074 NONAME
+ _ZN18QFileSystemWatcherC1ERK11QStringListP7QObject @ 1075 NONAME
+ _ZN18QFileSystemWatcherC2EP7QObject @ 1076 NONAME
+ _ZN18QFileSystemWatcherC2ERK11QStringListP7QObject @ 1077 NONAME
+ _ZN18QFileSystemWatcherD0Ev @ 1078 NONAME
+ _ZN18QFileSystemWatcherD1Ev @ 1079 NONAME
+ _ZN18QFileSystemWatcherD2Ev @ 1080 NONAME
+ _ZN18QPropertyAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 1081 NONAME
+ _ZN18QPropertyAnimation11qt_metacastEPKc @ 1082 NONAME
+ _ZN18QPropertyAnimation11updateStateEN18QAbstractAnimation5StateES1_ @ 1083 NONAME
+ _ZN18QPropertyAnimation15setPropertyNameERK10QByteArray @ 1084 NONAME
+ _ZN18QPropertyAnimation15setTargetObjectEP7QObject @ 1085 NONAME
+ _ZN18QPropertyAnimation16staticMetaObjectE @ 1086 NONAME DATA 16
+ _ZN18QPropertyAnimation18updateCurrentValueERK8QVariant @ 1087 NONAME
+ _ZN18QPropertyAnimation19getStaticMetaObjectEv @ 1088 NONAME
+ _ZN18QPropertyAnimation5eventEP6QEvent @ 1089 NONAME
+ _ZN18QPropertyAnimationC1EP7QObject @ 1090 NONAME
+ _ZN18QPropertyAnimationC1EP7QObjectRK10QByteArrayS1_ @ 1091 NONAME
+ _ZN18QPropertyAnimationC2EP7QObject @ 1092 NONAME
+ _ZN18QPropertyAnimationC2EP7QObjectRK10QByteArrayS1_ @ 1093 NONAME
+ _ZN18QPropertyAnimationD0Ev @ 1094 NONAME
+ _ZN18QPropertyAnimationD1Ev @ 1095 NONAME
+ _ZN18QPropertyAnimationD2Ev @ 1096 NONAME
+ _ZN18QThreadStorageData3setEPv @ 1097 NONAME
+ _ZN18QThreadStorageData6finishEPPv @ 1098 NONAME
+ _ZN18QThreadStorageDataC1EPFvPvE @ 1099 NONAME
+ _ZN18QThreadStorageDataC2EPFvPvE @ 1100 NONAME
+ _ZN18QThreadStorageDataD1Ev @ 1101 NONAME
+ _ZN18QThreadStorageDataD2Ev @ 1102 NONAME
+ _ZN19QAbstractFileEngine11setFileNameERK7QString @ 1103 NONAME
+ _ZN19QAbstractFileEngine12endEntryListEv @ 1104 NONAME
+ _ZN19QAbstractFileEngine14beginEntryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 1105 NONAME
+ _ZN19QAbstractFileEngine14setPermissionsEj @ 1106 NONAME
+ _ZN19QAbstractFileEngine3mapExxN5QFile14MemoryMapFlagsE @ 1107 NONAME
+ _ZN19QAbstractFileEngine4copyERK7QString @ 1108 NONAME
+ _ZN19QAbstractFileEngine4linkERK7QString @ 1109 NONAME
+ _ZN19QAbstractFileEngine4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1110 NONAME
+ _ZN19QAbstractFileEngine4readEPcx @ 1111 NONAME
+ _ZN19QAbstractFileEngine4seekEx @ 1112 NONAME
+ _ZN19QAbstractFileEngine5closeEv @ 1113 NONAME
+ _ZN19QAbstractFileEngine5flushEv @ 1114 NONAME
+ _ZN19QAbstractFileEngine5unmapEPh @ 1115 NONAME
+ _ZN19QAbstractFileEngine5writeEPKcx @ 1116 NONAME
+ _ZN19QAbstractFileEngine6createERK7QString @ 1117 NONAME
+ _ZN19QAbstractFileEngine6removeEv @ 1118 NONAME
+ _ZN19QAbstractFileEngine6renameERK7QString @ 1119 NONAME
+ _ZN19QAbstractFileEngine7setSizeEx @ 1120 NONAME
+ _ZN19QAbstractFileEngine8readLineEPcx @ 1121 NONAME
+ _ZN19QAbstractFileEngine8setErrorEN5QFile9FileErrorERK7QString @ 1122 NONAME
+ _ZN19QAbstractFileEngine9extensionENS_9ExtensionEPKNS_15ExtensionOptionEPNS_15ExtensionReturnE @ 1123 NONAME
+ _ZN19QAbstractFileEngineC1ER26QAbstractFileEnginePrivate @ 1124 NONAME
+ _ZN19QAbstractFileEngineC1Ev @ 1125 NONAME
+ _ZN19QAbstractFileEngineC2ER26QAbstractFileEnginePrivate @ 1126 NONAME
+ _ZN19QAbstractFileEngineC2Ev @ 1127 NONAME
+ _ZN19QAbstractFileEngineD0Ev @ 1128 NONAME
+ _ZN19QAbstractFileEngineD1Ev @ 1129 NONAME
+ _ZN19QAbstractFileEngineD2Ev @ 1130 NONAME
+ _ZN19QAbstractTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1131 NONAME
+ _ZN19QAbstractTableModel11qt_metacastEPKc @ 1132 NONAME
+ _ZN19QAbstractTableModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 1133 NONAME
+ _ZN19QAbstractTableModel16staticMetaObjectE @ 1134 NONAME DATA 16
+ _ZN19QAbstractTableModel19getStaticMetaObjectEv @ 1135 NONAME
+ _ZN19QAbstractTableModelC2EP7QObject @ 1136 NONAME
+ _ZN19QAbstractTableModelC2ER25QAbstractItemModelPrivateP7QObject @ 1137 NONAME
+ _ZN19QAbstractTableModelD0Ev @ 1138 NONAME
+ _ZN19QAbstractTableModelD1Ev @ 1139 NONAME
+ _ZN19QAbstractTableModelD2Ev @ 1140 NONAME
+ _ZN19QAbstractTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 1141 NONAME
+ _ZN19QAbstractTransition11qt_metacastEPKc @ 1142 NONAME
+ _ZN19QAbstractTransition12addAnimationEP18QAbstractAnimation @ 1143 NONAME
+ _ZN19QAbstractTransition14setTargetStateEP14QAbstractState @ 1144 NONAME
+ _ZN19QAbstractTransition15removeAnimationEP18QAbstractAnimation @ 1145 NONAME
+ _ZN19QAbstractTransition15setTargetStatesERK5QListIP14QAbstractStateE @ 1146 NONAME
+ _ZN19QAbstractTransition16staticMetaObjectE @ 1147 NONAME DATA 16
+ _ZN19QAbstractTransition19getStaticMetaObjectEv @ 1148 NONAME
+ _ZN19QAbstractTransition5eventEP6QEvent @ 1149 NONAME
+ _ZN19QAbstractTransition9triggeredEv @ 1150 NONAME
+ _ZN19QAbstractTransitionC2EP6QState @ 1151 NONAME
+ _ZN19QAbstractTransitionC2ER26QAbstractTransitionPrivateP6QState @ 1152 NONAME
+ _ZN19QAbstractTransitionD0Ev @ 1153 NONAME
+ _ZN19QAbstractTransitionD1Ev @ 1154 NONAME
+ _ZN19QAbstractTransitionD2Ev @ 1155 NONAME
+ _ZN19QProcessEnvironment17systemEnvironmentEv @ 1156 NONAME
+ _ZN19QProcessEnvironment5clearEv @ 1157 NONAME
+ _ZN19QProcessEnvironment6insertERK7QStringS2_ @ 1158 NONAME
+ _ZN19QProcessEnvironment6removeERK7QString @ 1159 NONAME
+ _ZN19QProcessEnvironmentC1ERKS_ @ 1160 NONAME
+ _ZN19QProcessEnvironmentC1Ev @ 1161 NONAME
+ _ZN19QProcessEnvironmentC2ERKS_ @ 1162 NONAME
+ _ZN19QProcessEnvironmentC2Ev @ 1163 NONAME
+ _ZN19QProcessEnvironmentD1Ev @ 1164 NONAME
+ _ZN19QProcessEnvironmentD2Ev @ 1165 NONAME
+ _ZN19QProcessEnvironmentaSERKS_ @ 1166 NONAME
+ _ZN19QTextBoundaryFinder11setPositionEi @ 1167 NONAME
+ _ZN19QTextBoundaryFinder14toNextBoundaryEv @ 1168 NONAME
+ _ZN19QTextBoundaryFinder18toPreviousBoundaryEv @ 1169 NONAME
+ _ZN19QTextBoundaryFinder5toEndEv @ 1170 NONAME
+ _ZN19QTextBoundaryFinder7toStartEv @ 1171 NONAME
+ _ZN19QTextBoundaryFinderC1ENS_12BoundaryTypeEPK5QChariPhi @ 1172 NONAME
+ _ZN19QTextBoundaryFinderC1ENS_12BoundaryTypeERK7QString @ 1173 NONAME
+ _ZN19QTextBoundaryFinderC1ERKS_ @ 1174 NONAME
+ _ZN19QTextBoundaryFinderC1Ev @ 1175 NONAME
+ _ZN19QTextBoundaryFinderC2ENS_12BoundaryTypeEPK5QChariPhi @ 1176 NONAME
+ _ZN19QTextBoundaryFinderC2ENS_12BoundaryTypeERK7QString @ 1177 NONAME
+ _ZN19QTextBoundaryFinderC2ERKS_ @ 1178 NONAME
+ _ZN19QTextBoundaryFinderC2Ev @ 1179 NONAME
+ _ZN19QTextBoundaryFinderD1Ev @ 1180 NONAME
+ _ZN19QTextBoundaryFinderD2Ev @ 1181 NONAME
+ _ZN19QTextBoundaryFinderaSERKS_ @ 1182 NONAME
+ _ZN19QXmlStreamAttributeC1ERK7QStringS2_ @ 1183 NONAME
+ _ZN19QXmlStreamAttributeC1ERK7QStringS2_S2_ @ 1184 NONAME
+ _ZN19QXmlStreamAttributeC1ERKS_ @ 1185 NONAME
+ _ZN19QXmlStreamAttributeC1Ev @ 1186 NONAME
+ _ZN19QXmlStreamAttributeC2ERK7QStringS2_ @ 1187 NONAME
+ _ZN19QXmlStreamAttributeC2ERK7QStringS2_S2_ @ 1188 NONAME
+ _ZN19QXmlStreamAttributeC2ERKS_ @ 1189 NONAME
+ _ZN19QXmlStreamAttributeC2Ev @ 1190 NONAME
+ _ZN19QXmlStreamAttributeD1Ev @ 1191 NONAME
+ _ZN19QXmlStreamAttributeD2Ev @ 1192 NONAME
+ _ZN19QXmlStreamAttributeaSERKS_ @ 1193 NONAME
+ _ZN20QStateMachinePrivate10_q_processEv @ 1194 NONAME
+ _ZN20QStateMachinePrivate10exitStatesEP6QEventRK5QListIP19QAbstractTransitionE @ 1195 NONAME
+ _ZN20QStateMachinePrivate10isParallelEPK14QAbstractState @ 1196 NONAME
+ _ZN20QStateMachinePrivate10startStateEv @ 1197 NONAME
+ _ZN20QStateMachinePrivate11enterStatesEP6QEventRK5QListIP19QAbstractTransitionE @ 1198 NONAME
+ _ZN20QStateMachinePrivate13processEventsENS_19EventProcessingModeE @ 1199 NONAME
+ _ZN20QStateMachinePrivate14findErrorStateEP14QAbstractState @ 1200 NONAME
+ _ZN20QStateMachinePrivate14isDescendantOfEPK14QAbstractStateS2_ @ 1201 NONAME
+ _ZN20QStateMachinePrivate15applyPropertiesERK5QListIP19QAbstractTransitionERKS0_IP14QAbstractStateESA_ @ 1202 NONAME
+ _ZN20QStateMachinePrivate15properAncestorsEPK14QAbstractStatePK6QState @ 1203 NONAME
+ _ZN20QStateMachinePrivate16addStatesToEnterEP14QAbstractStateP6QStateR4QSetIS1_ES6_ @ 1204 NONAME
+ _ZN20QStateMachinePrivate16removeStartStateEv @ 1205 NONAME
+ _ZN20QStateMachinePrivate17stateExitLessThanEP14QAbstractStateS1_ @ 1206 NONAME
+ _ZN20QStateMachinePrivate18registerRestorableEP7QObjectRK10QByteArray @ 1207 NONAME
+ _ZN20QStateMachinePrivate18stateEntryLessThanEP14QAbstractStateS1_ @ 1208 NONAME
+ _ZN20QStateMachinePrivate19handleFilteredEventEP7QObjectP6QEvent @ 1209 NONAME
+ _ZN20QStateMachinePrivate19initializeAnimationEP18QAbstractAnimationRK19QPropertyAssignment @ 1210 NONAME
+ _ZN20QStateMachinePrivate19registerTransitionsEP14QAbstractState @ 1211 NONAME
+ _ZN20QStateMachinePrivate20_q_animationFinishedEv @ 1212 NONAME
+ _ZN20QStateMachinePrivate20unregisterRestorableEP7QObjectRK10QByteArray @ 1213 NONAME
+ _ZN20QStateMachinePrivate20unregisterTransitionEP19QAbstractTransition @ 1214 NONAME
+ _ZN20QStateMachinePrivate22cancelAllDelayedEventsEv @ 1215 NONAME
+ _ZN20QStateMachinePrivate22handleTransitionSignalEP7QObjectiPPv @ 1216 NONAME
+ _ZN20QStateMachinePrivate23registerEventTransitionEP16QEventTransition @ 1217 NONAME
+ _ZN20QStateMachinePrivate24executeTransitionContentEP6QEventRK5QListIP19QAbstractTransitionE @ 1218 NONAME
+ _ZN20QStateMachinePrivate24registerSignalTransitionEP17QSignalTransition @ 1219 NONAME
+ _ZN20QStateMachinePrivate24unregisterAllTransitionsEv @ 1220 NONAME
+ _ZN20QStateMachinePrivate25unregisterEventTransitionEP16QEventTransition @ 1221 NONAME
+ _ZN20QStateMachinePrivate26unregisterSignalTransitionEP17QSignalTransition @ 1222 NONAME
+ _ZN20QStateMachinePrivate3getEP13QStateMachine @ 1223 NONAME
+ _ZN20QStateMachinePrivate7handlerE @ 1224 NONAME DATA 4
+ _ZN20QStateMachinePrivate7isFinalEPK14QAbstractState @ 1225 NONAME
+ _ZN20QStateMachinePrivate8_q_startEv @ 1226 NONAME
+ _ZN20QStateMachinePrivate8setErrorEN13QStateMachine5ErrorEP14QAbstractState @ 1227 NONAME
+ _ZN20QStateMachinePrivate9goToStateEP14QAbstractState @ 1228 NONAME
+ _ZN20QStateMachinePrivate9microstepEP6QEventRK5QListIP19QAbstractTransitionE @ 1229 NONAME
+ _ZN20QStateMachinePrivateC1Ev @ 1230 NONAME
+ _ZN20QStateMachinePrivateC2Ev @ 1231 NONAME
+ _ZN20QStateMachinePrivateD0Ev @ 1232 NONAME
+ _ZN20QStateMachinePrivateD1Ev @ 1233 NONAME
+ _ZN20QStateMachinePrivateD2Ev @ 1234 NONAME
+ _ZN20QXmlStreamAttributes6appendERK7QStringS2_ @ 1235 NONAME
+ _ZN20QXmlStreamAttributes6appendERK7QStringS2_S2_ @ 1236 NONAME
+ _ZN21QObjectCleanupHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 1237 NONAME
+ _ZN21QObjectCleanupHandler11qt_metacastEPKc @ 1238 NONAME
+ _ZN21QObjectCleanupHandler15objectDestroyedEP7QObject @ 1239 NONAME
+ _ZN21QObjectCleanupHandler16staticMetaObjectE @ 1240 NONAME DATA 16
+ _ZN21QObjectCleanupHandler19getStaticMetaObjectEv @ 1241 NONAME
+ _ZN21QObjectCleanupHandler3addEP7QObject @ 1242 NONAME
+ _ZN21QObjectCleanupHandler5clearEv @ 1243 NONAME
+ _ZN21QObjectCleanupHandler6removeEP7QObject @ 1244 NONAME
+ _ZN21QObjectCleanupHandlerC1Ev @ 1245 NONAME
+ _ZN21QObjectCleanupHandlerC2Ev @ 1246 NONAME
+ _ZN21QObjectCleanupHandlerD0Ev @ 1247 NONAME
+ _ZN21QObjectCleanupHandlerD1Ev @ 1248 NONAME
+ _ZN21QObjectCleanupHandlerD2Ev @ 1249 NONAME
+ _ZN21QPersistentModelIndexC1ERK11QModelIndex @ 1250 NONAME
+ _ZN21QPersistentModelIndexC1ERKS_ @ 1251 NONAME
+ _ZN21QPersistentModelIndexC1Ev @ 1252 NONAME
+ _ZN21QPersistentModelIndexC2ERK11QModelIndex @ 1253 NONAME
+ _ZN21QPersistentModelIndexC2ERKS_ @ 1254 NONAME
+ _ZN21QPersistentModelIndexC2Ev @ 1255 NONAME
+ _ZN21QPersistentModelIndexD1Ev @ 1256 NONAME
+ _ZN21QPersistentModelIndexD2Ev @ 1257 NONAME
+ _ZN21QPersistentModelIndexaSERK11QModelIndex @ 1258 NONAME
+ _ZN21QPersistentModelIndexaSERKS_ @ 1259 NONAME
+ _ZN23QCoreApplicationPrivate10mainThreadEv @ 1260 NONAME
+ _ZN23QCoreApplicationPrivate13checkInstanceEPKc @ 1261 NONAME
+ _ZN23QCoreApplicationPrivate13notify_helperEP7QObjectP6QEvent @ 1262 NONAME
+ _ZN23QCoreApplicationPrivate13theMainThreadE @ 1263 NONAME DATA 4
+ _ZN23QCoreApplicationPrivate14is_app_closingE @ 1264 NONAME DATA 1
+ _ZN23QCoreApplicationPrivate14is_app_runningE @ 1265 NONAME DATA 1
+ _ZN23QCoreApplicationPrivate15eventDispatcherE @ 1266 NONAME DATA 4
+ _ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData @ 1267 NONAME
+ _ZN23QCoreApplicationPrivate17removePostedEventEP6QEvent @ 1268 NONAME
+ _ZN23QCoreApplicationPrivate19checkReceiverThreadEP7QObject @ 1269 NONAME
+ _ZN23QCoreApplicationPrivate21createEventDispatcherEv @ 1270 NONAME
+ _ZN23QCoreApplicationPrivate21isTranslatorInstalledEP11QTranslator @ 1271 NONAME
+ _ZN23QCoreApplicationPrivate29sendThroughObjectEventFiltersEP7QObjectP6QEvent @ 1272 NONAME
+ _ZN23QCoreApplicationPrivate34sendThroughApplicationEventFiltersEP7QObjectP6QEvent @ 1273 NONAME
+ _ZN23QCoreApplicationPrivate35appendApplicationPathToLibraryPathsEv @ 1274 NONAME
+ _ZN23QCoreApplicationPrivate7attribsE @ 1275 NONAME DATA 4
+ _ZN23QCoreApplicationPrivateC1ERiPPc @ 1276 NONAME
+ _ZN23QCoreApplicationPrivateC2ERiPPc @ 1277 NONAME
+ _ZN23QCoreApplicationPrivateD0Ev @ 1278 NONAME
+ _ZN23QCoreApplicationPrivateD1Ev @ 1279 NONAME
+ _ZN23QCoreApplicationPrivateD2Ev @ 1280 NONAME
+ _ZN23QEventDispatcherSymbian10startingUpEv @ 1281 NONAME
+ _ZN23QEventDispatcherSymbian10timerFiredEi @ 1282 NONAME
+ _ZN23QEventDispatcherSymbian11closingDownEv @ 1283 NONAME
+ _ZN23QEventDispatcherSymbian11socketFiredEP19QSocketActiveObject @ 1284 NONAME
+ _ZN23QEventDispatcherSymbian13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 1285 NONAME
+ _ZN23QEventDispatcherSymbian13registerTimerEiiP7QObject @ 1286 NONAME
+ _ZN23QEventDispatcherSymbian15unregisterTimerEi @ 1287 NONAME
+ _ZN23QEventDispatcherSymbian15wakeUpWasCalledEv @ 1288 NONAME
+ _ZN23QEventDispatcherSymbian16hasPendingEventsEv @ 1289 NONAME
+ _ZN23QEventDispatcherSymbian16sendPostedEventsEv @ 1290 NONAME
+ _ZN23QEventDispatcherSymbian16unregisterTimersEP7QObject @ 1291 NONAME
+ _ZN23QEventDispatcherSymbian22registerSocketNotifierEP15QSocketNotifier @ 1292 NONAME
+ _ZN23QEventDispatcherSymbian24reactivateSocketNotifierEP15QSocketNotifier @ 1293 NONAME
+ _ZN23QEventDispatcherSymbian24sendDeferredSocketEventsEv @ 1294 NONAME
+ _ZN23QEventDispatcherSymbian24unregisterSocketNotifierEP15QSocketNotifier @ 1295 NONAME
+ _ZN23QEventDispatcherSymbian31reactivateDeferredActiveObjectsEv @ 1296 NONAME
+ _ZN23QEventDispatcherSymbian5flushEv @ 1297 NONAME
+ _ZN23QEventDispatcherSymbian6wakeUpEv @ 1298 NONAME
+ _ZN23QEventDispatcherSymbian9interruptEv @ 1299 NONAME
+ _ZN23QEventDispatcherSymbianC1EP7QObject @ 1300 NONAME
+ _ZN23QEventDispatcherSymbianC2EP7QObject @ 1301 NONAME
+ _ZN23QEventDispatcherSymbianD0Ev @ 1302 NONAME
+ _ZN23QEventDispatcherSymbianD1Ev @ 1303 NONAME
+ _ZN23QEventDispatcherSymbianD2Ev @ 1304 NONAME
+ _ZN23QEventTransitionPrivate10unregisterEv @ 1305 NONAME
+ _ZN23QEventTransitionPrivate13maybeRegisterEv @ 1306 NONAME
+ _ZN23QEventTransitionPrivate3getEP16QEventTransition @ 1307 NONAME
+ _ZN23QEventTransitionPrivateC1Ev @ 1308 NONAME
+ _ZN23QEventTransitionPrivateC2Ev @ 1309 NONAME
+ _ZN23QParallelAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1310 NONAME
+ _ZN23QParallelAnimationGroup11qt_metacastEPKc @ 1311 NONAME
+ _ZN23QParallelAnimationGroup11updateStateEN18QAbstractAnimation5StateES1_ @ 1312 NONAME
+ _ZN23QParallelAnimationGroup15updateDirectionEN18QAbstractAnimation9DirectionE @ 1313 NONAME
+ _ZN23QParallelAnimationGroup16staticMetaObjectE @ 1314 NONAME DATA 16
+ _ZN23QParallelAnimationGroup17updateCurrentTimeEi @ 1315 NONAME
+ _ZN23QParallelAnimationGroup19getStaticMetaObjectEv @ 1316 NONAME
+ _ZN23QParallelAnimationGroup5eventEP6QEvent @ 1317 NONAME
+ _ZN23QParallelAnimationGroupC1EP7QObject @ 1318 NONAME
+ _ZN23QParallelAnimationGroupC1ER30QParallelAnimationGroupPrivateP7QObject @ 1319 NONAME
+ _ZN23QParallelAnimationGroupC2EP7QObject @ 1320 NONAME
+ _ZN23QParallelAnimationGroupC2ER30QParallelAnimationGroupPrivateP7QObject @ 1321 NONAME
+ _ZN23QParallelAnimationGroupD0Ev @ 1322 NONAME
+ _ZN23QParallelAnimationGroupD1Ev @ 1323 NONAME
+ _ZN23QParallelAnimationGroupD2Ev @ 1324 NONAME
+ _ZN24QAbstractEventDispatcher10startingUpEv @ 1325 NONAME
+ _ZN24QAbstractEventDispatcher11closingDownEv @ 1326 NONAME
+ _ZN24QAbstractEventDispatcher11filterEventEPv @ 1327 NONAME
+ _ZN24QAbstractEventDispatcher11qt_metacallEN11QMetaObject4CallEiPPv @ 1328 NONAME
+ _ZN24QAbstractEventDispatcher11qt_metacastEPKc @ 1329 NONAME
+ _ZN24QAbstractEventDispatcher12aboutToBlockEv @ 1330 NONAME
+ _ZN24QAbstractEventDispatcher13registerTimerEiP7QObject @ 1331 NONAME
+ _ZN24QAbstractEventDispatcher14setEventFilterEPFbPvE @ 1332 NONAME
+ _ZN24QAbstractEventDispatcher16staticMetaObjectE @ 1333 NONAME DATA 16
+ _ZN24QAbstractEventDispatcher19getStaticMetaObjectEv @ 1334 NONAME
+ _ZN24QAbstractEventDispatcher5awakeEv @ 1335 NONAME
+ _ZN24QAbstractEventDispatcher8instanceEP7QThread @ 1336 NONAME
+ _ZN24QAbstractEventDispatcherC2EP7QObject @ 1337 NONAME
+ _ZN24QAbstractEventDispatcherC2ER31QAbstractEventDispatcherPrivateP7QObject @ 1338 NONAME
+ _ZN24QAbstractEventDispatcherD0Ev @ 1339 NONAME
+ _ZN24QAbstractEventDispatcherD1Ev @ 1340 NONAME
+ _ZN24QAbstractEventDispatcherD2Ev @ 1341 NONAME
+ _ZN24QNonContiguousByteDevice11qt_metacallEN11QMetaObject4CallEiPPv @ 1342 NONAME
+ _ZN24QNonContiguousByteDevice11qt_metacastEPKc @ 1343 NONAME
+ _ZN24QNonContiguousByteDevice12disableResetEv @ 1344 NONAME
+ _ZN24QNonContiguousByteDevice12readProgressExx @ 1345 NONAME
+ _ZN24QNonContiguousByteDevice16staticMetaObjectE @ 1346 NONAME DATA 16
+ _ZN24QNonContiguousByteDevice19getStaticMetaObjectEv @ 1347 NONAME
+ _ZN24QNonContiguousByteDevice9readyReadEv @ 1348 NONAME
+ _ZN24QNonContiguousByteDeviceC2Ev @ 1349 NONAME
+ _ZN24QNonContiguousByteDeviceD0Ev @ 1350 NONAME
+ _ZN24QNonContiguousByteDeviceD1Ev @ 1351 NONAME
+ _ZN24QNonContiguousByteDeviceD2Ev @ 1352 NONAME
+ _ZN24QVariantAnimationPrivate15getInterpolatorEi @ 1353 NONAME
+ _ZN24QXmlStreamEntityResolver13resolveEntityERK7QStringS2_ @ 1354 NONAME
+ _ZN24QXmlStreamEntityResolver23resolveUndeclaredEntityERK7QString @ 1355 NONAME
+ _ZN24QXmlStreamEntityResolverD0Ev @ 1356 NONAME
+ _ZN24QXmlStreamEntityResolverD1Ev @ 1357 NONAME
+ _ZN24QXmlStreamEntityResolverD2Ev @ 1358 NONAME
+ _ZN25QAbstractItemModelPrivate10itemsMovedERK11QModelIndexiiS2_iN2Qt11OrientationE @ 1359 NONAME
+ _ZN25QAbstractItemModelPrivate11rowsRemovedERK11QModelIndexii @ 1360 NONAME
+ _ZN25QAbstractItemModelPrivate12rowsInsertedERK11QModelIndexii @ 1361 NONAME
+ _ZN25QAbstractItemModelPrivate14columnsRemovedERK11QModelIndexii @ 1362 NONAME
+ _ZN25QAbstractItemModelPrivate15columnsInsertedERK11QModelIndexii @ 1363 NONAME
+ _ZN25QAbstractItemModelPrivate15variantLessThanERK8QVariantS2_ @ 1364 NONAME
+ _ZN25QAbstractItemModelPrivate16defaultRoleNamesEv @ 1365 NONAME
+ _ZN25QAbstractItemModelPrivate16staticEmptyModelEv @ 1366 NONAME
+ _ZN25QAbstractItemModelPrivate19itemsAboutToBeMovedERK11QModelIndexiiS2_iN2Qt11OrientationE @ 1367 NONAME
+ _ZN25QAbstractItemModelPrivate20rowsAboutToBeRemovedERK11QModelIndexii @ 1368 NONAME
+ _ZN25QAbstractItemModelPrivate21movePersistentIndexesE7QVectorIP25QPersistentModelIndexDataEiRK11QModelIndexN2Qt11OrientationE @ 1369 NONAME
+ _ZN25QAbstractItemModelPrivate21rowsAboutToBeInsertedERK11QModelIndexii @ 1370 NONAME
+ _ZN25QAbstractItemModelPrivate23columnsAboutToBeRemovedERK11QModelIndexii @ 1371 NONAME
+ _ZN25QAbstractItemModelPrivate24columnsAboutToBeInsertedERK11QModelIndexii @ 1372 NONAME
+ _ZN25QAbstractItemModelPrivate25removePersistentIndexDataEP25QPersistentModelIndexData @ 1373 NONAME
+ _ZN25QAbstractItemModelPrivate9allowMoveERK11QModelIndexiiS2_iN2Qt11OrientationE @ 1374 NONAME
+ _ZN25QSequentialAnimationGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1375 NONAME
+ _ZN25QSequentialAnimationGroup11qt_metacastEPKc @ 1376 NONAME
+ _ZN25QSequentialAnimationGroup11updateStateEN18QAbstractAnimation5StateES1_ @ 1377 NONAME
+ _ZN25QSequentialAnimationGroup13insertPauseAtEii @ 1378 NONAME
+ _ZN25QSequentialAnimationGroup15updateDirectionEN18QAbstractAnimation9DirectionE @ 1379 NONAME
+ _ZN25QSequentialAnimationGroup16staticMetaObjectE @ 1380 NONAME DATA 16
+ _ZN25QSequentialAnimationGroup17updateCurrentTimeEi @ 1381 NONAME
+ _ZN25QSequentialAnimationGroup19getStaticMetaObjectEv @ 1382 NONAME
+ _ZN25QSequentialAnimationGroup23currentAnimationChangedEP18QAbstractAnimation @ 1383 NONAME
+ _ZN25QSequentialAnimationGroup5eventEP6QEvent @ 1384 NONAME
+ _ZN25QSequentialAnimationGroup8addPauseEi @ 1385 NONAME
+ _ZN25QSequentialAnimationGroupC1EP7QObject @ 1386 NONAME
+ _ZN25QSequentialAnimationGroupC1ER32QSequentialAnimationGroupPrivateP7QObject @ 1387 NONAME
+ _ZN25QSequentialAnimationGroupC2EP7QObject @ 1388 NONAME
+ _ZN25QSequentialAnimationGroupC2ER32QSequentialAnimationGroupPrivateP7QObject @ 1389 NONAME
+ _ZN25QSequentialAnimationGroupD0Ev @ 1390 NONAME
+ _ZN25QSequentialAnimationGroupD1Ev @ 1391 NONAME
+ _ZN25QSequentialAnimationGroupD2Ev @ 1392 NONAME
+ _ZN26QAbstractFileEngineHandlerC2Ev @ 1393 NONAME
+ _ZN26QAbstractFileEngineHandlerD0Ev @ 1394 NONAME
+ _ZN26QAbstractFileEngineHandlerD1Ev @ 1395 NONAME
+ _ZN26QAbstractFileEngineHandlerD2Ev @ 1396 NONAME
+ _ZN26QAbstractTransitionPrivate13callEventTestEP6QEvent @ 1397 NONAME
+ _ZN26QAbstractTransitionPrivate13emitTriggeredEv @ 1398 NONAME
+ _ZN26QAbstractTransitionPrivate16callOnTransitionEP6QEvent @ 1399 NONAME
+ _ZN26QAbstractTransitionPrivate3getEP19QAbstractTransition @ 1400 NONAME
+ _ZN26QAbstractTransitionPrivateC1Ev @ 1401 NONAME
+ _ZN26QAbstractTransitionPrivateC2Ev @ 1402 NONAME
+ _ZN27QAbstractFileEngineIterator7setPathERK7QString @ 1403 NONAME
+ _ZN27QAbstractFileEngineIteratorC2E6QFlagsIN4QDir6FilterEERK11QStringList @ 1404 NONAME
+ _ZN27QAbstractFileEngineIteratorD0Ev @ 1405 NONAME
+ _ZN27QAbstractFileEngineIteratorD1Ev @ 1406 NONAME
+ _ZN27QAbstractFileEngineIteratorD2Ev @ 1407 NONAME
+ _ZN27QDynamicPropertyChangeEventC1ERK10QByteArray @ 1408 NONAME
+ _ZN27QDynamicPropertyChangeEventC2ERK10QByteArray @ 1409 NONAME
+ _ZN27QDynamicPropertyChangeEventD0Ev @ 1410 NONAME
+ _ZN27QDynamicPropertyChangeEventD1Ev @ 1411 NONAME
+ _ZN27QDynamicPropertyChangeEventD2Ev @ 1412 NONAME
+ _ZN27QXmlStreamEntityDeclarationC1ERKS_ @ 1413 NONAME
+ _ZN27QXmlStreamEntityDeclarationC1Ev @ 1414 NONAME
+ _ZN27QXmlStreamEntityDeclarationC2ERKS_ @ 1415 NONAME
+ _ZN27QXmlStreamEntityDeclarationC2Ev @ 1416 NONAME
+ _ZN27QXmlStreamEntityDeclarationD1Ev @ 1417 NONAME
+ _ZN27QXmlStreamEntityDeclarationD2Ev @ 1418 NONAME
+ _ZN27QXmlStreamEntityDeclarationaSERKS_ @ 1419 NONAME
+ _ZN29QXmlStreamNotationDeclarationC1ERKS_ @ 1420 NONAME
+ _ZN29QXmlStreamNotationDeclarationC1Ev @ 1421 NONAME
+ _ZN29QXmlStreamNotationDeclarationC2ERKS_ @ 1422 NONAME
+ _ZN29QXmlStreamNotationDeclarationC2Ev @ 1423 NONAME
+ _ZN29QXmlStreamNotationDeclarationD1Ev @ 1424 NONAME
+ _ZN29QXmlStreamNotationDeclarationD2Ev @ 1425 NONAME
+ _ZN29QXmlStreamNotationDeclarationaSERKS_ @ 1426 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC1ERK7QStringS2_ @ 1427 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC1ERKS_ @ 1428 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC1Ev @ 1429 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC2ERK7QStringS2_ @ 1430 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC2ERKS_ @ 1431 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationC2Ev @ 1432 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationD1Ev @ 1433 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationD2Ev @ 1434 NONAME
+ _ZN30QXmlStreamNamespaceDeclarationaSERKS_ @ 1435 NONAME
+ _ZN31QAbstractEventDispatcherPrivate14releaseTimerIdEi @ 1436 NONAME
+ _ZN31QAbstractEventDispatcherPrivate15allocateTimerIdEv @ 1437 NONAME
+ _ZN31QAbstractEventDispatcherPrivate4initEv @ 1438 NONAME
+ _ZN31QNonContiguousByteDeviceFactory4wrapEP24QNonContiguousByteDevice @ 1439 NONAME
+ _ZN31QNonContiguousByteDeviceFactory6createEP10QByteArray @ 1440 NONAME
+ _ZN31QNonContiguousByteDeviceFactory6createEP11QRingBuffer @ 1441 NONAME
+ _ZN31QNonContiguousByteDeviceFactory6createEP9QIODevice @ 1442 NONAME
+ _ZN4QDir10setCurrentERK7QString @ 1443 NONAME
+ _ZN4QDir10setSortingE6QFlagsINS_8SortFlagEE @ 1444 NONAME
+ _ZN4QDir11currentPathEv @ 1445 NONAME
+ _ZN4QDir11searchPathsERK7QString @ 1446 NONAME
+ _ZN4QDir12makeAbsoluteEv @ 1447 NONAME
+ _ZN4QDir13addSearchPathERK7QStringS2_ @ 1448 NONAME
+ _ZN4QDir14isRelativePathERK7QString @ 1449 NONAME
+ _ZN4QDir14setNameFiltersERK11QStringList @ 1450 NONAME
+ _ZN4QDir14setSearchPathsERK7QStringRK11QStringList @ 1451 NONAME
+ _ZN4QDir17convertSeparatorsERK7QString @ 1452 NONAME
+ _ZN4QDir18toNativeSeparatorsERK7QString @ 1453 NONAME
+ _ZN4QDir20fromNativeSeparatorsERK7QString @ 1454 NONAME
+ _ZN4QDir21addResourceSearchPathERK7QString @ 1455 NONAME
+ _ZN4QDir21nameFiltersFromStringERK7QString @ 1456 NONAME
+ _ZN4QDir2cdERK7QString @ 1457 NONAME
+ _ZN4QDir4cdUpEv @ 1458 NONAME
+ _ZN4QDir5matchERK11QStringListRK7QString @ 1459 NONAME
+ _ZN4QDir5matchERK7QStringS2_ @ 1460 NONAME
+ _ZN4QDir6drivesEv @ 1461 NONAME
+ _ZN4QDir6removeERK7QString @ 1462 NONAME
+ _ZN4QDir6renameERK7QStringS2_ @ 1463 NONAME
+ _ZN4QDir7setPathERK7QString @ 1464 NONAME
+ _ZN4QDir8homePathEv @ 1465 NONAME
+ _ZN4QDir8rootPathEv @ 1466 NONAME
+ _ZN4QDir8tempPathEv @ 1467 NONAME
+ _ZN4QDir9cleanPathERK7QString @ 1468 NONAME
+ _ZN4QDir9separatorEv @ 1469 NONAME
+ _ZN4QDir9setFilterE6QFlagsINS_6FilterEE @ 1470 NONAME
+ _ZN4QDirC1ERK7QString @ 1471 NONAME
+ _ZN4QDirC1ERK7QStringS2_6QFlagsINS_8SortFlagEES3_INS_6FilterEE @ 1472 NONAME
+ _ZN4QDirC1ERKS_ @ 1473 NONAME
+ _ZN4QDirC2ERK7QString @ 1474 NONAME
+ _ZN4QDirC2ERK7QStringS2_6QFlagsINS_8SortFlagEES3_INS_6FilterEE @ 1475 NONAME
+ _ZN4QDirC2ERKS_ @ 1476 NONAME
+ _ZN4QDirD1Ev @ 1477 NONAME
+ _ZN4QDirD2Ev @ 1478 NONAME
+ _ZN4QDiraSERK7QString @ 1479 NONAME
+ _ZN4QDiraSERKS_ @ 1480 NONAME
+ _ZN4QUrl10toPunycodeERK7QString @ 1481 NONAME
+ _ZN4QUrl11fromEncodedERK10QByteArray @ 1482 NONAME
+ _ZN4QUrl11fromEncodedERK10QByteArrayNS_11ParsingModeE @ 1483 NONAME
+ _ZN4QUrl11setFragmentERK7QString @ 1484 NONAME
+ _ZN4QUrl11setPasswordERK7QString @ 1485 NONAME
+ _ZN4QUrl11setUserInfoERK7QString @ 1486 NONAME
+ _ZN4QUrl11setUserNameERK7QString @ 1487 NONAME
+ _ZN4QUrl12addQueryItemERK7QStringS2_ @ 1488 NONAME
+ _ZN4QUrl12fromPunycodeERK10QByteArray @ 1489 NONAME
+ _ZN4QUrl12idnWhitelistEv @ 1490 NONAME
+ _ZN4QUrl12setAuthorityERK7QString @ 1491 NONAME
+ _ZN4QUrl13fromLocalFileERK7QString @ 1492 NONAME
+ _ZN4QUrl13fromUserInputERK7QString @ 1493 NONAME
+ _ZN4QUrl13setEncodedUrlERK10QByteArray @ 1494 NONAME
+ _ZN4QUrl13setEncodedUrlERK10QByteArrayNS_11ParsingModeE @ 1495 NONAME
+ _ZN4QUrl13setQueryItemsERK5QListI5QPairI7QStringS2_EE @ 1496 NONAME
+ _ZN4QUrl14setEncodedHostERK10QByteArray @ 1497 NONAME
+ _ZN4QUrl14setEncodedPathERK10QByteArray @ 1498 NONAME
+ _ZN4QUrl15removeQueryItemERK7QString @ 1499 NONAME
+ _ZN4QUrl15setEncodedQueryERK10QByteArray @ 1500 NONAME
+ _ZN4QUrl15setIdnWhitelistERK11QStringList @ 1501 NONAME
+ _ZN4QUrl17toPercentEncodingERK7QStringRK10QByteArrayS5_ @ 1502 NONAME
+ _ZN4QUrl18setEncodedFragmentERK10QByteArray @ 1503 NONAME
+ _ZN4QUrl18setEncodedPasswordERK10QByteArray @ 1504 NONAME
+ _ZN4QUrl18setEncodedUserNameERK10QByteArray @ 1505 NONAME
+ _ZN4QUrl18setQueryDelimitersEcc @ 1506 NONAME
+ _ZN4QUrl19addEncodedQueryItemERK10QByteArrayS2_ @ 1507 NONAME
+ _ZN4QUrl19fromPercentEncodingERK10QByteArray @ 1508 NONAME
+ _ZN4QUrl19removeAllQueryItemsERK7QString @ 1509 NONAME
+ _ZN4QUrl20setEncodedQueryItemsERK5QListI5QPairI10QByteArrayS2_EE @ 1510 NONAME
+ _ZN4QUrl22removeEncodedQueryItemERK10QByteArray @ 1511 NONAME
+ _ZN4QUrl26removeAllEncodedQueryItemsERK10QByteArray @ 1512 NONAME
+ _ZN4QUrl5clearEv @ 1513 NONAME
+ _ZN4QUrl5toAceERK7QString @ 1514 NONAME
+ _ZN4QUrl6detachEv @ 1515 NONAME
+ _ZN4QUrl6setUrlERK7QString @ 1516 NONAME
+ _ZN4QUrl6setUrlERK7QStringNS_11ParsingModeE @ 1517 NONAME
+ _ZN4QUrl7fromAceERK10QByteArray @ 1518 NONAME
+ _ZN4QUrl7setHostERK7QString @ 1519 NONAME
+ _ZN4QUrl7setPathERK7QString @ 1520 NONAME
+ _ZN4QUrl7setPortEi @ 1521 NONAME
+ _ZN4QUrl9setSchemeERK7QString @ 1522 NONAME
+ _ZN4QUrlC1ERK7QString @ 1523 NONAME
+ _ZN4QUrlC1ERK7QStringNS_11ParsingModeE @ 1524 NONAME
+ _ZN4QUrlC1ERKS_ @ 1525 NONAME
+ _ZN4QUrlC1Ev @ 1526 NONAME
+ _ZN4QUrlC2ERK7QString @ 1527 NONAME
+ _ZN4QUrlC2ERK7QStringNS_11ParsingModeE @ 1528 NONAME
+ _ZN4QUrlC2ERKS_ @ 1529 NONAME
+ _ZN4QUrlC2Ev @ 1530 NONAME
+ _ZN4QUrlD1Ev @ 1531 NONAME
+ _ZN4QUrlD2Ev @ 1532 NONAME
+ _ZN4QUrlaSERK7QString @ 1533 NONAME
+ _ZN4QUrlaSERKS_ @ 1534 NONAME
+ _ZN5QChar10digitValueEj @ 1535 NONAME
+ _ZN5QChar10digitValueEt @ 1536 NONAME
+ _ZN5QChar11toTitleCaseEj @ 1537 NONAME
+ _ZN5QChar11toTitleCaseEt @ 1538 NONAME
+ _ZN5QChar12mirroredCharEj @ 1539 NONAME
+ _ZN5QChar12mirroredCharEt @ 1540 NONAME
+ _ZN5QChar12toCaseFoldedEj @ 1541 NONAME
+ _ZN5QChar12toCaseFoldedEt @ 1542 NONAME
+ _ZN5QChar13decompositionEj @ 1543 NONAME
+ _ZN5QChar14combiningClassEj @ 1544 NONAME
+ _ZN5QChar14combiningClassEt @ 1545 NONAME
+ _ZN5QChar14unicodeVersionEj @ 1546 NONAME
+ _ZN5QChar14unicodeVersionEt @ 1547 NONAME
+ _ZN5QChar16decompositionTagEj @ 1548 NONAME
+ _ZN5QChar7joiningEj @ 1549 NONAME
+ _ZN5QChar7joiningEt @ 1550 NONAME
+ _ZN5QChar7toLowerEj @ 1551 NONAME
+ _ZN5QChar7toLowerEt @ 1552 NONAME
+ _ZN5QChar7toUpperEj @ 1553 NONAME
+ _ZN5QChar7toUpperEt @ 1554 NONAME
+ _ZN5QChar8categoryEj @ 1555 NONAME
+ _ZN5QChar8categoryEt @ 1556 NONAME
+ _ZN5QChar9directionEj @ 1557 NONAME
+ _ZN5QChar9directionEt @ 1558 NONAME
+ _ZN5QChar9fromAsciiEc @ 1559 NONAME
+ _ZN5QCharC1Ec @ 1560 NONAME
+ _ZN5QCharC1Eh @ 1561 NONAME
+ _ZN5QCharC2Ec @ 1562 NONAME
+ _ZN5QCharC2Eh @ 1563 NONAME
+ _ZN5QDate10fromStringERK7QStringN2Qt10DateFormatE @ 1564 NONAME
+ _ZN5QDate10fromStringERK7QStringS2_ @ 1565 NONAME
+ _ZN5QDate10isLeapYearEi @ 1566 NONAME
+ _ZN5QDate11currentDateEv @ 1567 NONAME
+ _ZN5QDate11longDayNameEi @ 1568 NONAME
+ _ZN5QDate11longDayNameEiNS_13MonthNameTypeE @ 1569 NONAME
+ _ZN5QDate12shortDayNameEi @ 1570 NONAME
+ _ZN5QDate12shortDayNameEiNS_13MonthNameTypeE @ 1571 NONAME
+ _ZN5QDate13longMonthNameEi @ 1572 NONAME
+ _ZN5QDate13longMonthNameEiNS_13MonthNameTypeE @ 1573 NONAME
+ _ZN5QDate14shortMonthNameEi @ 1574 NONAME
+ _ZN5QDate14shortMonthNameEiNS_13MonthNameTypeE @ 1575 NONAME
+ _ZN5QDate17gregorianToJulianEiii @ 1576 NONAME
+ _ZN5QDate17julianToGregorianEjRiS0_S0_ @ 1577 NONAME
+ _ZN5QDate6setYMDEiii @ 1578 NONAME
+ _ZN5QDate7getDateEPiS0_S0_ @ 1579 NONAME
+ _ZN5QDate7isValidEiii @ 1580 NONAME
+ _ZN5QDate7setDateEiii @ 1581 NONAME
+ _ZN5QDateC1Eiii @ 1582 NONAME
+ _ZN5QDateC2Eiii @ 1583 NONAME
+ _ZN5QFile10decodeNameERK10QByteArray @ 1584 NONAME
+ _ZN5QFile10encodeNameERK7QString @ 1585 NONAME
+ _ZN5QFile10unsetErrorEv @ 1586 NONAME
+ _ZN5QFile11permissionsERK7QString @ 1587 NONAME
+ _ZN5QFile11qt_metacallEN11QMetaObject4CallEiPPv @ 1588 NONAME
+ _ZN5QFile11qt_metacastEPKc @ 1589 NONAME
+ _ZN5QFile11setFileNameERK7QString @ 1590 NONAME
+ _ZN5QFile12readLineDataEPcx @ 1591 NONAME
+ _ZN5QFile14setPermissionsE6QFlagsINS_10PermissionEE @ 1592 NONAME
+ _ZN5QFile14setPermissionsERK7QString6QFlagsINS_10PermissionEE @ 1593 NONAME
+ _ZN5QFile16staticMetaObjectE @ 1594 NONAME DATA 16
+ _ZN5QFile19getStaticMetaObjectEv @ 1595 NONAME
+ _ZN5QFile19setDecodingFunctionEPF7QStringRK10QByteArrayE @ 1596 NONAME
+ _ZN5QFile19setEncodingFunctionEPF10QByteArrayRK7QStringE @ 1597 NONAME
+ _ZN5QFile3mapExxNS_14MemoryMapFlagsE @ 1598 NONAME
+ _ZN5QFile4copyERK7QString @ 1599 NONAME
+ _ZN5QFile4copyERK7QStringS2_ @ 1600 NONAME
+ _ZN5QFile4linkERK7QString @ 1601 NONAME
+ _ZN5QFile4linkERK7QStringS2_ @ 1602 NONAME
+ _ZN5QFile4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1603 NONAME
+ _ZN5QFile4openEP7__sFILE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1604 NONAME
+ _ZN5QFile4openEi6QFlagsIN9QIODevice12OpenModeFlagEE @ 1605 NONAME
+ _ZN5QFile4seekEx @ 1606 NONAME
+ _ZN5QFile5closeEv @ 1607 NONAME
+ _ZN5QFile5flushEv @ 1608 NONAME
+ _ZN5QFile5unmapEPh @ 1609 NONAME
+ _ZN5QFile6existsERK7QString @ 1610 NONAME
+ _ZN5QFile6removeERK7QString @ 1611 NONAME
+ _ZN5QFile6removeEv @ 1612 NONAME
+ _ZN5QFile6renameERK7QString @ 1613 NONAME
+ _ZN5QFile6renameERK7QStringS2_ @ 1614 NONAME
+ _ZN5QFile6resizeERK7QStringx @ 1615 NONAME
+ _ZN5QFile6resizeEx @ 1616 NONAME
+ _ZN5QFile8readDataEPcx @ 1617 NONAME
+ _ZN5QFile8readLinkERK7QString @ 1618 NONAME
+ _ZN5QFile9writeDataEPKcx @ 1619 NONAME
+ _ZN5QFileC1EP7QObject @ 1620 NONAME
+ _ZN5QFileC1ER12QFilePrivateP7QObject @ 1621 NONAME
+ _ZN5QFileC1ERK7QString @ 1622 NONAME
+ _ZN5QFileC1ERK7QStringP7QObject @ 1623 NONAME
+ _ZN5QFileC1Ev @ 1624 NONAME
+ _ZN5QFileC2EP7QObject @ 1625 NONAME
+ _ZN5QFileC2ER12QFilePrivateP7QObject @ 1626 NONAME
+ _ZN5QFileC2ERK7QString @ 1627 NONAME
+ _ZN5QFileC2ERK7QStringP7QObject @ 1628 NONAME
+ _ZN5QFileC2Ev @ 1629 NONAME
+ _ZN5QFileD0Ev @ 1630 NONAME
+ _ZN5QFileD1Ev @ 1631 NONAME
+ _ZN5QFileD2Ev @ 1632 NONAME
+ _ZN5QRect10moveCenterERK6QPoint @ 1633 NONAME
+ _ZN5QSize5scaleERKS_N2Qt15AspectRatioModeE @ 1634 NONAME
+ _ZN5QSize9transposeEv @ 1635 NONAME
+ _ZN5QTime10fromStringERK7QStringN2Qt10DateFormatE @ 1636 NONAME
+ _ZN5QTime10fromStringERK7QStringS2_ @ 1637 NONAME
+ _ZN5QTime11currentTimeEv @ 1638 NONAME
+ _ZN5QTime5startEv @ 1639 NONAME
+ _ZN5QTime6setHMSEiiii @ 1640 NONAME
+ _ZN5QTime7isValidEiiii @ 1641 NONAME
+ _ZN5QTime7restartEv @ 1642 NONAME
+ _ZN5QTimeC1Eiiii @ 1643 NONAME
+ _ZN5QTimeC2Eiiii @ 1644 NONAME
+ _ZN5QUuid10createUuidEv @ 1645 NONAME
+ _ZN5QUuidC1EPKc @ 1646 NONAME
+ _ZN5QUuidC1ERK7QString @ 1647 NONAME
+ _ZN5QUuidC2EPKc @ 1648 NONAME
+ _ZN5QUuidC2ERK7QString @ 1649 NONAME
+ _ZN6QEvent16staticMetaObjectE @ 1650 NONAME DATA 16
+ _ZN6QEvent17registerEventTypeEi @ 1651 NONAME
+ _ZN6QEvent19getStaticMetaObjectEv @ 1652 NONAME
+ _ZN6QEventC1ENS_4TypeE @ 1653 NONAME
+ _ZN6QEventC2ENS_4TypeE @ 1654 NONAME
+ _ZN6QEventD0Ev @ 1655 NONAME
+ _ZN6QEventD1Ev @ 1656 NONAME
+ _ZN6QEventD2Ev @ 1657 NONAME
+ _ZN6QHBufCC1EP7HBufC16 @ 1658 NONAME
+ _ZN6QHBufCC1ERK7QString @ 1659 NONAME
+ _ZN6QHBufCC1ERKS_ @ 1660 NONAME
+ _ZN6QHBufCC1Ev @ 1661 NONAME
+ _ZN6QHBufCC2EP7HBufC16 @ 1662 NONAME
+ _ZN6QHBufCC2ERK7QString @ 1663 NONAME
+ _ZN6QHBufCC2ERKS_ @ 1664 NONAME
+ _ZN6QHBufCC2Ev @ 1665 NONAME
+ _ZN6QHBufCD1Ev @ 1666 NONAME
+ _ZN6QHBufCD2Ev @ 1667 NONAME
+ _ZN6QLineF8setAngleEf @ 1668 NONAME
+ _ZN6QLineF9fromPolarEff @ 1669 NONAME
+ _ZN6QMutex4lockEv @ 1670 NONAME
+ _ZN6QMutex6unlockEv @ 1671 NONAME
+ _ZN6QMutex7tryLockEi @ 1672 NONAME
+ _ZN6QMutex7tryLockEv @ 1673 NONAME
+ _ZN6QMutexC1ENS_13RecursionModeE @ 1674 NONAME
+ _ZN6QMutexC2ENS_13RecursionModeE @ 1675 NONAME
+ _ZN6QMutexD1Ev @ 1676 NONAME
+ _ZN6QMutexD2Ev @ 1677 NONAME
+ _ZN6QSizeF5scaleERKS_N2Qt15AspectRatioModeE @ 1678 NONAME
+ _ZN6QSizeF9transposeEv @ 1679 NONAME
+ _ZN6QState11qt_metacallEN11QMetaObject4CallEiPPv @ 1680 NONAME
+ _ZN6QState11qt_metacastEPKc @ 1681 NONAME
+ _ZN6QState12setChildModeENS_9ChildModeE @ 1682 NONAME
+ _ZN6QState13addTransitionEP14QAbstractState @ 1683 NONAME
+ _ZN6QState13addTransitionEP19QAbstractTransition @ 1684 NONAME
+ _ZN6QState13addTransitionEP7QObjectPKcP14QAbstractState @ 1685 NONAME
+ _ZN6QState13setErrorStateEP14QAbstractState @ 1686 NONAME
+ _ZN6QState14assignPropertyEP7QObjectPKcRK8QVariant @ 1687 NONAME
+ _ZN6QState15setInitialStateEP14QAbstractState @ 1688 NONAME
+ _ZN6QState16removeTransitionEP19QAbstractTransition @ 1689 NONAME
+ _ZN6QState16staticMetaObjectE @ 1690 NONAME DATA 16
+ _ZN6QState19getStaticMetaObjectEv @ 1691 NONAME
+ _ZN6QState5eventEP6QEvent @ 1692 NONAME
+ _ZN6QState6onExitEP6QEvent @ 1693 NONAME
+ _ZN6QState7onEntryEP6QEvent @ 1694 NONAME
+ _ZN6QState8finishedEv @ 1695 NONAME
+ _ZN6QState8polishedEv @ 1696 NONAME
+ _ZN6QStateC1ENS_9ChildModeEPS_ @ 1697 NONAME
+ _ZN6QStateC1EPS_ @ 1698 NONAME
+ _ZN6QStateC1ER13QStatePrivatePS_ @ 1699 NONAME
+ _ZN6QStateC2ENS_9ChildModeEPS_ @ 1700 NONAME
+ _ZN6QStateC2EPS_ @ 1701 NONAME
+ _ZN6QStateC2ER13QStatePrivatePS_ @ 1702 NONAME
+ _ZN6QStateD0Ev @ 1703 NONAME
+ _ZN6QStateD1Ev @ 1704 NONAME
+ _ZN6QStateD2Ev @ 1705 NONAME
+ _ZN6QTimer10singleShotEiP7QObjectPKc @ 1706 NONAME
+ _ZN6QTimer10timerEventEP11QTimerEvent @ 1707 NONAME
+ _ZN6QTimer11qt_metacallEN11QMetaObject4CallEiPPv @ 1708 NONAME
+ _ZN6QTimer11qt_metacastEPKc @ 1709 NONAME
+ _ZN6QTimer11setIntervalEi @ 1710 NONAME
+ _ZN6QTimer16staticMetaObjectE @ 1711 NONAME DATA 16
+ _ZN6QTimer19getStaticMetaObjectEv @ 1712 NONAME
+ _ZN6QTimer4stopEv @ 1713 NONAME
+ _ZN6QTimer5startEi @ 1714 NONAME
+ _ZN6QTimer5startEv @ 1715 NONAME
+ _ZN6QTimer7timeoutEv @ 1716 NONAME
+ _ZN6QTimerC1EP7QObject @ 1717 NONAME
+ _ZN6QTimerC2EP7QObject @ 1718 NONAME
+ _ZN6QTimerD0Ev @ 1719 NONAME
+ _ZN6QTimerD1Ev @ 1720 NONAME
+ _ZN6QTimerD2Ev @ 1721 NONAME
+ _ZN7QBuffer11qt_metacallEN11QMetaObject4CallEiPPv @ 1722 NONAME
+ _ZN7QBuffer11qt_metacastEPKc @ 1723 NONAME
+ _ZN7QBuffer13connectNotifyEPKc @ 1724 NONAME
+ _ZN7QBuffer16disconnectNotifyEPKc @ 1725 NONAME
+ _ZN7QBuffer16staticMetaObjectE @ 1726 NONAME DATA 16
+ _ZN7QBuffer19getStaticMetaObjectEv @ 1727 NONAME
+ _ZN7QBuffer4openE6QFlagsIN9QIODevice12OpenModeFlagEE @ 1728 NONAME
+ _ZN7QBuffer4seekEx @ 1729 NONAME
+ _ZN7QBuffer5closeEv @ 1730 NONAME
+ _ZN7QBuffer6bufferEv @ 1731 NONAME
+ _ZN7QBuffer7setDataERK10QByteArray @ 1732 NONAME
+ _ZN7QBuffer8readDataEPcx @ 1733 NONAME
+ _ZN7QBuffer9setBufferEP10QByteArray @ 1734 NONAME
+ _ZN7QBuffer9writeDataEPKcx @ 1735 NONAME
+ _ZN7QBufferC1EP10QByteArrayP7QObject @ 1736 NONAME
+ _ZN7QBufferC1EP7QObject @ 1737 NONAME
+ _ZN7QBufferC2EP10QByteArrayP7QObject @ 1738 NONAME
+ _ZN7QBufferC2EP7QObject @ 1739 NONAME
+ _ZN7QBufferD0Ev @ 1740 NONAME
+ _ZN7QBufferD1Ev @ 1741 NONAME
+ _ZN7QBufferD2Ev @ 1742 NONAME
+ _ZN7QLocale10setDefaultERKS_ @ 1743 NONAME
+ _ZN7QLocale15countryToStringENS_7CountryE @ 1744 NONAME
+ _ZN7QLocale16languageToStringENS_8LanguageE @ 1745 NONAME
+ _ZN7QLocale16setNumberOptionsE6QFlagsINS_12NumberOptionEE @ 1746 NONAME
+ _ZN7QLocale16staticMetaObjectE @ 1747 NONAME DATA 16
+ _ZN7QLocale19getStaticMetaObjectEv @ 1748 NONAME
+ _ZN7QLocale20countriesForLanguageENS_8LanguageE @ 1749 NONAME
+ _ZN7QLocale6systemEv @ 1750 NONAME
+ _ZN7QLocaleC1ENS_8LanguageENS_7CountryE @ 1751 NONAME
+ _ZN7QLocaleC1ERK7QString @ 1752 NONAME
+ _ZN7QLocaleC1ERKS_ @ 1753 NONAME
+ _ZN7QLocaleC1Ev @ 1754 NONAME
+ _ZN7QLocaleC2ENS_8LanguageENS_7CountryE @ 1755 NONAME
+ _ZN7QLocaleC2ERK7QString @ 1756 NONAME
+ _ZN7QLocaleC2ERKS_ @ 1757 NONAME
+ _ZN7QLocaleC2Ev @ 1758 NONAME
+ _ZN7QLocaleaSERKS_ @ 1759 NONAME
+ _ZN7QObject10childEventEP11QChildEvent @ 1760 NONAME
+ _ZN7QObject10disconnectEPKS_PKcS1_S3_ @ 1761 NONAME
+ _ZN7QObject10startTimerEi @ 1762 NONAME
+ _ZN7QObject10timerEventEP11QTimerEvent @ 1763 NONAME
+ _ZN7QObject11customEventEP6QEvent @ 1764 NONAME
+ _ZN7QObject11deleteLaterEv @ 1765 NONAME
+ _ZN7QObject11eventFilterEPS_P6QEvent @ 1766 NONAME
+ _ZN7QObject11qt_metacallEN11QMetaObject4CallEiPPv @ 1767 NONAME
+ _ZN7QObject11qt_metacastEPKc @ 1768 NONAME
+ _ZN7QObject11setPropertyEPKcRK8QVariant @ 1769 NONAME
+ _ZN7QObject11setUserDataEjP15QObjectUserData @ 1770 NONAME
+ _ZN7QObject12blockSignalsEb @ 1771 NONAME
+ _ZN7QObject12moveToThreadEP7QThread @ 1772 NONAME
+ _ZN7QObject13connectNotifyEPKc @ 1773 NONAME
+ _ZN7QObject13setObjectNameERK7QString @ 1774 NONAME
+ _ZN7QObject14dumpObjectInfoEv @ 1775 NONAME
+ _ZN7QObject14dumpObjectTreeEv @ 1776 NONAME
+ _ZN7QObject16disconnectNotifyEPKc @ 1777 NONAME
+ _ZN7QObject16registerUserDataEv @ 1778 NONAME
+ _ZN7QObject16staticMetaObjectE @ 1779 NONAME DATA 16
+ _ZN7QObject17removeEventFilterEPS_ @ 1780 NONAME
+ _ZN7QObject18installEventFilterEPS_ @ 1781 NONAME
+ _ZN7QObject18staticQtMetaObjectE @ 1782 NONAME DATA 16
+ _ZN7QObject19getStaticMetaObjectEv @ 1783 NONAME
+ _ZN7QObject5eventEP6QEvent @ 1784 NONAME
+ _ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE @ 1785 NONAME
+ _ZN7QObject9destroyedEPS_ @ 1786 NONAME
+ _ZN7QObject9killTimerEi @ 1787 NONAME
+ _ZN7QObject9setParentEPS_ @ 1788 NONAME
+ _ZN7QObjectC1EPS_ @ 1789 NONAME
+ _ZN7QObjectC1ER14QObjectPrivatePS_ @ 1790 NONAME
+ _ZN7QObjectC2EPS_ @ 1791 NONAME
+ _ZN7QObjectC2ER14QObjectPrivatePS_ @ 1792 NONAME
+ _ZN7QObjectD0Ev @ 1793 NONAME
+ _ZN7QObjectD1Ev @ 1794 NONAME
+ _ZN7QObjectD2Ev @ 1795 NONAME
+ _ZN7QRegExp10setMinimalEb @ 1796 NONAME
+ _ZN7QRegExp10setPatternERK7QString @ 1797 NONAME
+ _ZN7QRegExp11errorStringEv @ 1798 NONAME
+ _ZN7QRegExp13capturedTextsEv @ 1799 NONAME
+ _ZN7QRegExp16setPatternSyntaxENS_13PatternSyntaxE @ 1800 NONAME
+ _ZN7QRegExp18setCaseSensitivityEN2Qt15CaseSensitivityE @ 1801 NONAME
+ _ZN7QRegExp3capEi @ 1802 NONAME
+ _ZN7QRegExp3posEi @ 1803 NONAME
+ _ZN7QRegExp6escapeERK7QString @ 1804 NONAME
+ _ZN7QRegExpC1ERK7QStringN2Qt15CaseSensitivityENS_13PatternSyntaxE @ 1805 NONAME
+ _ZN7QRegExpC1ERKS_ @ 1806 NONAME
+ _ZN7QRegExpC1Ev @ 1807 NONAME
+ _ZN7QRegExpC2ERK7QStringN2Qt15CaseSensitivityENS_13PatternSyntaxE @ 1808 NONAME
+ _ZN7QRegExpC2ERKS_ @ 1809 NONAME
+ _ZN7QRegExpC2Ev @ 1810 NONAME
+ _ZN7QRegExpD1Ev @ 1811 NONAME
+ _ZN7QRegExpD2Ev @ 1812 NONAME
+ _ZN7QRegExpaSERKS_ @ 1813 NONAME
+ _ZN7QString10fromLatin1EPKci @ 1814 NONAME
+ _ZN7QString10setUnicodeEPK5QChari @ 1815 NONAME
+ _ZN7QString11fromRawDataEPK5QChari @ 1816 NONAME
+ _ZN7QString11shared_nullE @ 1817 NONAME DATA 20
+ _ZN7QString12shared_emptyE @ 1818 NONAME DATA 20
+ _ZN7QString13fromLocal8BitEPKci @ 1819 NONAME
+ _ZN7QString14compare_helperEPK5QChari13QLatin1StringN2Qt15CaseSensitivityE @ 1820 NONAME
+ _ZN7QString14compare_helperEPK5QChariS2_iN2Qt15CaseSensitivityE @ 1821 NONAME
+ _ZN7QString14fromWCharArrayEPKwi @ 1822 NONAME
+ _ZN7QString14replace_helperEPjiiPK5QChari @ 1823 NONAME
+ _ZN7QString16codecForCStringsE @ 1824 NONAME DATA 4
+ _ZN7QString16fromAscii_helperEPKci @ 1825 NONAME
+ _ZN7QString17fromLatin1_helperEPKci @ 1826 NONAME
+ _ZN7QString25localeAwareCompare_helperEPK5QChariS2_i @ 1827 NONAME
+ _ZN7QString4chopEi @ 1828 NONAME
+ _ZN7QString4fillE5QChari @ 1829 NONAME
+ _ZN7QString4freeEPNS_4DataE @ 1830 NONAME
+ _ZN7QString4growEi @ 1831 NONAME
+ _ZN7QString4nullE @ 1832 NONAME DATA 1
+ _ZN7QString6appendE5QChar @ 1833 NONAME
+ _ZN7QString6appendERK10QStringRef @ 1834 NONAME
+ _ZN7QString6appendERK13QLatin1String @ 1835 NONAME
+ _ZN7QString6appendERKS_ @ 1836 NONAME
+ _ZN7QString6expandEi @ 1837 NONAME
+ _ZN7QString6insertEi5QChar @ 1838 NONAME
+ _ZN7QString6insertEiPK5QChari @ 1839 NONAME
+ _ZN7QString6insertEiRK13QLatin1String @ 1840 NONAME
+ _ZN7QString6numberEdci @ 1841 NONAME
+ _ZN7QString6numberEii @ 1842 NONAME
+ _ZN7QString6numberEji @ 1843 NONAME
+ _ZN7QString6numberEli @ 1844 NONAME
+ _ZN7QString6numberEmi @ 1845 NONAME
+ _ZN7QString6numberExi @ 1846 NONAME
+ _ZN7QString6numberEyi @ 1847 NONAME
+ _ZN7QString6removeE5QCharN2Qt15CaseSensitivityE @ 1848 NONAME
+ _ZN7QString6removeERKS_N2Qt15CaseSensitivityE @ 1849 NONAME
+ _ZN7QString6removeEii @ 1850 NONAME
+ _ZN7QString6resizeEi @ 1851 NONAME
+ _ZN7QString6setNumEdci @ 1852 NONAME
+ _ZN7QString6setNumExi @ 1853 NONAME
+ _ZN7QString6setNumEyi @ 1854 NONAME
+ _ZN7QString7reallocEi @ 1855 NONAME
+ _ZN7QString7reallocEv @ 1856 NONAME
+ _ZN7QString7replaceE5QCharRK13QLatin1StringN2Qt15CaseSensitivityE @ 1857 NONAME
+ _ZN7QString7replaceE5QCharRKS_N2Qt15CaseSensitivityE @ 1858 NONAME
+ _ZN7QString7replaceE5QCharS0_N2Qt15CaseSensitivityE @ 1859 NONAME
+ _ZN7QString7replaceEPK5QChariS2_iN2Qt15CaseSensitivityE @ 1860 NONAME
+ _ZN7QString7replaceERK13QLatin1StringRKS_N2Qt15CaseSensitivityE @ 1861 NONAME
+ _ZN7QString7replaceERK13QLatin1StringS2_N2Qt15CaseSensitivityE @ 1862 NONAME
+ _ZN7QString7replaceERK7QRegExpRKS_ @ 1863 NONAME
+ _ZN7QString7replaceERKS_RK13QLatin1StringN2Qt15CaseSensitivityE @ 1864 NONAME
+ _ZN7QString7replaceERKS_S1_N2Qt15CaseSensitivityE @ 1865 NONAME
+ _ZN7QString7replaceEii5QChar @ 1866 NONAME
+ _ZN7QString7replaceEiiPK5QChari @ 1867 NONAME
+ _ZN7QString7replaceEiiRKS_ @ 1868 NONAME
+ _ZN7QString7sprintfEPKcz @ 1869 NONAME
+ _ZN7QString8fromUcs4EPKji @ 1870 NONAME
+ _ZN7QString8fromUtf8EPKci @ 1871 NONAME
+ _ZN7QString8truncateEi @ 1872 NONAME
+ _ZN7QString8vsprintfEPKcSt9__va_list @ 1873 NONAME
+ _ZN7QString9fromAsciiEPKci @ 1874 NONAME
+ _ZN7QString9fromUtf16EPKti @ 1875 NONAME
+ _ZN7QStringC1E5QChar @ 1876 NONAME
+ _ZN7QStringC1EPK5QChari @ 1877 NONAME
+ _ZN7QStringC1Ei5QChar @ 1878 NONAME
+ _ZN7QStringC1EiN2Qt14InitializationE @ 1879 NONAME
+ _ZN7QStringC2E5QChar @ 1880 NONAME
+ _ZN7QStringC2EPK5QChari @ 1881 NONAME
+ _ZN7QStringC2Ei5QChar @ 1882 NONAME
+ _ZN7QStringC2EiN2Qt14InitializationE @ 1883 NONAME
+ _ZN7QStringaSE5QChar @ 1884 NONAME
+ _ZN7QStringaSERKS_ @ 1885 NONAME
+ _ZN7QThread10initializeEv @ 1886 NONAME
+ _ZN7QThread10terminatedEv @ 1887 NONAME
+ _ZN7QThread11qt_metacallEN11QMetaObject4CallEiPPv @ 1888 NONAME
+ _ZN7QThread11qt_metacastEPKc @ 1889 NONAME
+ _ZN7QThread11setPriorityENS_8PriorityE @ 1890 NONAME
+ _ZN7QThread12setStackSizeEj @ 1891 NONAME
+ _ZN7QThread13currentThreadEv @ 1892 NONAME
+ _ZN7QThread15currentThreadIdEv @ 1893 NONAME
+ _ZN7QThread16idealThreadCountEv @ 1894 NONAME
+ _ZN7QThread16staticMetaObjectE @ 1895 NONAME DATA 16
+ _ZN7QThread18yieldCurrentThreadEv @ 1896 NONAME
+ _ZN7QThread19getStaticMetaObjectEv @ 1897 NONAME
+ _ZN7QThread21setTerminationEnabledEb @ 1898 NONAME
+ _ZN7QThread3runEv @ 1899 NONAME
+ _ZN7QThread4execEv @ 1900 NONAME
+ _ZN7QThread4exitEi @ 1901 NONAME
+ _ZN7QThread4quitEv @ 1902 NONAME
+ _ZN7QThread4waitEm @ 1903 NONAME
+ _ZN7QThread5sleepEm @ 1904 NONAME
+ _ZN7QThread5startENS_8PriorityE @ 1905 NONAME
+ _ZN7QThread6msleepEm @ 1906 NONAME
+ _ZN7QThread6usleepEm @ 1907 NONAME
+ _ZN7QThread7cleanupEv @ 1908 NONAME
+ _ZN7QThread7startedEv @ 1909 NONAME
+ _ZN7QThread8finishedEv @ 1910 NONAME
+ _ZN7QThread9terminateEv @ 1911 NONAME
+ _ZN7QThreadC1EP7QObject @ 1912 NONAME
+ _ZN7QThreadC1ER14QThreadPrivateP7QObject @ 1913 NONAME
+ _ZN7QThreadC2EP7QObject @ 1914 NONAME
+ _ZN7QThreadC2ER14QThreadPrivateP7QObject @ 1915 NONAME
+ _ZN7QThreadD0Ev @ 1916 NONAME
+ _ZN7QThreadD1Ev @ 1917 NONAME
+ _ZN7QThreadD2Ev @ 1918 NONAME
+ _ZN8QLibrary11qt_metacallEN11QMetaObject4CallEiPPv @ 1919 NONAME
+ _ZN8QLibrary11qt_metacastEPKc @ 1920 NONAME
+ _ZN8QLibrary11setFileNameERK7QString @ 1921 NONAME
+ _ZN8QLibrary12setLoadHintsE6QFlagsINS_8LoadHintEE @ 1922 NONAME
+ _ZN8QLibrary16staticMetaObjectE @ 1923 NONAME DATA 16
+ _ZN8QLibrary19getStaticMetaObjectEv @ 1924 NONAME
+ _ZN8QLibrary21setFileNameAndVersionERK7QStringS2_ @ 1925 NONAME
+ _ZN8QLibrary21setFileNameAndVersionERK7QStringi @ 1926 NONAME
+ _ZN8QLibrary4loadEv @ 1927 NONAME
+ _ZN8QLibrary6unloadEv @ 1928 NONAME
+ _ZN8QLibrary7resolveEPKc @ 1929 NONAME
+ _ZN8QLibrary7resolveERK7QStringPKc @ 1930 NONAME
+ _ZN8QLibrary7resolveERK7QStringS2_PKc @ 1931 NONAME
+ _ZN8QLibrary7resolveERK7QStringiPKc @ 1932 NONAME
+ _ZN8QLibrary9isLibraryERK7QString @ 1933 NONAME
+ _ZN8QLibraryC1EP7QObject @ 1934 NONAME
+ _ZN8QLibraryC1ERK7QStringP7QObject @ 1935 NONAME
+ _ZN8QLibraryC1ERK7QStringS2_P7QObject @ 1936 NONAME
+ _ZN8QLibraryC1ERK7QStringiP7QObject @ 1937 NONAME
+ _ZN8QLibraryC2EP7QObject @ 1938 NONAME
+ _ZN8QLibraryC2ERK7QStringP7QObject @ 1939 NONAME
+ _ZN8QLibraryC2ERK7QStringS2_P7QObject @ 1940 NONAME
+ _ZN8QLibraryC2ERK7QStringiP7QObject @ 1941 NONAME
+ _ZN8QLibraryD0Ev @ 1942 NONAME
+ _ZN8QLibraryD1Ev @ 1943 NONAME
+ _ZN8QLibraryD2Ev @ 1944 NONAME
+ _ZN8QMapData10createDataEv @ 1945 NONAME
+ _ZN8QMapData11node_createEPPNS_4NodeEi @ 1946 NONAME
+ _ZN8QMapData11node_deleteEPPNS_4NodeEiS1_ @ 1947 NONAME
+ _ZN8QMapData11shared_nullE @ 1948 NONAME DATA 72
+ _ZN8QMapData16continueFreeDataEi @ 1949 NONAME
+ _ZN8QProcess11qt_metacallEN11QMetaObject4CallEiPPv @ 1950 NONAME
+ _ZN8QProcess11qt_metacastEPKc @ 1951 NONAME
+ _ZN8QProcess12stateChangedENS_12ProcessStateE @ 1952 NONAME
+ _ZN8QProcess13startDetachedERK7QString @ 1953 NONAME
+ _ZN8QProcess13startDetachedERK7QStringRK11QStringList @ 1954 NONAME
+ _ZN8QProcess13startDetachedERK7QStringRK11QStringListS2_Px @ 1955 NONAME
+ _ZN8QProcess14setEnvironmentERK11QStringList @ 1956 NONAME
+ _ZN8QProcess14setReadChannelENS_14ProcessChannelE @ 1957 NONAME
+ _ZN8QProcess14waitForStartedEi @ 1958 NONAME
+ _ZN8QProcess15setProcessStateENS_12ProcessStateE @ 1959 NONAME
+ _ZN8QProcess15waitForFinishedEi @ 1960 NONAME
+ _ZN8QProcess16closeReadChannelENS_14ProcessChannelE @ 1961 NONAME
+ _ZN8QProcess16staticMetaObjectE @ 1962 NONAME DATA 16
+ _ZN8QProcess16waitForReadyReadEi @ 1963 NONAME
+ _ZN8QProcess17closeWriteChannelEv @ 1964 NONAME
+ _ZN8QProcess17setupChildProcessEv @ 1965 NONAME
+ _ZN8QProcess17systemEnvironmentEv @ 1966 NONAME
+ _ZN8QProcess18setReadChannelModeENS_18ProcessChannelModeE @ 1967 NONAME
+ _ZN8QProcess19getStaticMetaObjectEv @ 1968 NONAME
+ _ZN8QProcess19setWorkingDirectoryERK7QString @ 1969 NONAME
+ _ZN8QProcess19waitForBytesWrittenEi @ 1970 NONAME
+ _ZN8QProcess20readAllStandardErrorEv @ 1971 NONAME
+ _ZN8QProcess20setStandardErrorFileERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1972 NONAME
+ _ZN8QProcess20setStandardInputFileERK7QString @ 1973 NONAME
+ _ZN8QProcess21readAllStandardOutputEv @ 1974 NONAME
+ _ZN8QProcess21setProcessChannelModeENS_18ProcessChannelModeE @ 1975 NONAME
+ _ZN8QProcess21setProcessEnvironmentERK19QProcessEnvironment @ 1976 NONAME
+ _ZN8QProcess21setStandardOutputFileERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1977 NONAME
+ _ZN8QProcess22readyReadStandardErrorEv @ 1978 NONAME
+ _ZN8QProcess23readyReadStandardOutputEv @ 1979 NONAME
+ _ZN8QProcess24setStandardOutputProcessEPS_ @ 1980 NONAME
+ _ZN8QProcess4killEv @ 1981 NONAME
+ _ZN8QProcess5closeEv @ 1982 NONAME
+ _ZN8QProcess5errorENS_12ProcessErrorE @ 1983 NONAME
+ _ZN8QProcess5startERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 1984 NONAME
+ _ZN8QProcess5startERK7QStringRK11QStringList6QFlagsIN9QIODevice12OpenModeFlagEE @ 1985 NONAME
+ _ZN8QProcess7executeERK7QString @ 1986 NONAME
+ _ZN8QProcess7executeERK7QStringRK11QStringList @ 1987 NONAME
+ _ZN8QProcess7startedEv @ 1988 NONAME
+ _ZN8QProcess8finishedEi @ 1989 NONAME
+ _ZN8QProcess8finishedEiNS_10ExitStatusE @ 1990 NONAME
+ _ZN8QProcess8readDataEPcx @ 1991 NONAME
+ _ZN8QProcess9terminateEv @ 1992 NONAME
+ _ZN8QProcess9writeDataEPKcx @ 1993 NONAME
+ _ZN8QProcessC1EP7QObject @ 1994 NONAME
+ _ZN8QProcessC2EP7QObject @ 1995 NONAME
+ _ZN8QProcessD0Ev @ 1996 NONAME
+ _ZN8QProcessD1Ev @ 1997 NONAME
+ _ZN8QProcessD2Ev @ 1998 NONAME
+ _ZN8QSysInfo10s60VersionEv @ 1999 NONAME
+ _ZN8QSysInfo14symbianVersionEv @ 2000 NONAME
+ _ZN8QVariant10nameToTypeEPKc @ 2001 NONAME
+ _ZN8QVariant10typeToNameENS_4TypeE @ 2002 NONAME
+ _ZN8QVariant4dataEv @ 2003 NONAME
+ _ZN8QVariant4loadER11QDataStream @ 2004 NONAME
+ _ZN8QVariant5clearEv @ 2005 NONAME
+ _ZN8QVariant6createEiPKv @ 2006 NONAME
+ _ZN8QVariant6detachEv @ 2007 NONAME
+ _ZN8QVariant7convertENS_4TypeE @ 2008 NONAME
+ _ZN8QVariant7handlerE @ 2009 NONAME DATA 4
+ _ZN8QVariantC1EN2Qt11GlobalColorE @ 2010 NONAME
+ _ZN8QVariantC1ENS_4TypeE @ 2011 NONAME
+ _ZN8QVariantC1EPKc @ 2012 NONAME
+ _ZN8QVariantC1ER11QDataStream @ 2013 NONAME
+ _ZN8QVariantC1ERK10QByteArray @ 2014 NONAME
+ _ZN8QVariantC1ERK11QStringList @ 2015 NONAME
+ _ZN8QVariantC1ERK13QLatin1String @ 2016 NONAME
+ _ZN8QVariantC1ERK4QMapI7QStringS_E @ 2017 NONAME
+ _ZN8QVariantC1ERK4QUrl @ 2018 NONAME
+ _ZN8QVariantC1ERK5QChar @ 2019 NONAME
+ _ZN8QVariantC1ERK5QDate @ 2020 NONAME
+ _ZN8QVariantC1ERK5QHashI7QStringS_E @ 2021 NONAME
+ _ZN8QVariantC1ERK5QLine @ 2022 NONAME
+ _ZN8QVariantC1ERK5QListIS_E @ 2023 NONAME
+ _ZN8QVariantC1ERK5QRect @ 2024 NONAME
+ _ZN8QVariantC1ERK5QSize @ 2025 NONAME
+ _ZN8QVariantC1ERK5QTime @ 2026 NONAME
+ _ZN8QVariantC1ERK6QLineF @ 2027 NONAME
+ _ZN8QVariantC1ERK6QPoint @ 2028 NONAME
+ _ZN8QVariantC1ERK6QRectF @ 2029 NONAME
+ _ZN8QVariantC1ERK6QSizeF @ 2030 NONAME
+ _ZN8QVariantC1ERK7QLocale @ 2031 NONAME
+ _ZN8QVariantC1ERK7QPointF @ 2032 NONAME
+ _ZN8QVariantC1ERK7QRegExp @ 2033 NONAME
+ _ZN8QVariantC1ERK7QString @ 2034 NONAME
+ _ZN8QVariantC1ERK9QBitArray @ 2035 NONAME
+ _ZN8QVariantC1ERK9QDateTime @ 2036 NONAME
+ _ZN8QVariantC1ERKS_ @ 2037 NONAME
+ _ZN8QVariantC1Eb @ 2038 NONAME
+ _ZN8QVariantC1Ed @ 2039 NONAME
+ _ZN8QVariantC1Ei @ 2040 NONAME
+ _ZN8QVariantC1EiPKv @ 2041 NONAME
+ _ZN8QVariantC1EiPKvj @ 2042 NONAME
+ _ZN8QVariantC1Ej @ 2043 NONAME
+ _ZN8QVariantC1Ex @ 2044 NONAME
+ _ZN8QVariantC1Ey @ 2045 NONAME
+ _ZN8QVariantC2EN2Qt11GlobalColorE @ 2046 NONAME
+ _ZN8QVariantC2ENS_4TypeE @ 2047 NONAME
+ _ZN8QVariantC2EPKc @ 2048 NONAME
+ _ZN8QVariantC2ER11QDataStream @ 2049 NONAME
+ _ZN8QVariantC2ERK10QByteArray @ 2050 NONAME
+ _ZN8QVariantC2ERK11QStringList @ 2051 NONAME
+ _ZN8QVariantC2ERK13QLatin1String @ 2052 NONAME
+ _ZN8QVariantC2ERK4QMapI7QStringS_E @ 2053 NONAME
+ _ZN8QVariantC2ERK4QUrl @ 2054 NONAME
+ _ZN8QVariantC2ERK5QChar @ 2055 NONAME
+ _ZN8QVariantC2ERK5QDate @ 2056 NONAME
+ _ZN8QVariantC2ERK5QHashI7QStringS_E @ 2057 NONAME
+ _ZN8QVariantC2ERK5QLine @ 2058 NONAME
+ _ZN8QVariantC2ERK5QListIS_E @ 2059 NONAME
+ _ZN8QVariantC2ERK5QRect @ 2060 NONAME
+ _ZN8QVariantC2ERK5QSize @ 2061 NONAME
+ _ZN8QVariantC2ERK5QTime @ 2062 NONAME
+ _ZN8QVariantC2ERK6QLineF @ 2063 NONAME
+ _ZN8QVariantC2ERK6QPoint @ 2064 NONAME
+ _ZN8QVariantC2ERK6QRectF @ 2065 NONAME
+ _ZN8QVariantC2ERK6QSizeF @ 2066 NONAME
+ _ZN8QVariantC2ERK7QLocale @ 2067 NONAME
+ _ZN8QVariantC2ERK7QPointF @ 2068 NONAME
+ _ZN8QVariantC2ERK7QRegExp @ 2069 NONAME
+ _ZN8QVariantC2ERK7QString @ 2070 NONAME
+ _ZN8QVariantC2ERK9QBitArray @ 2071 NONAME
+ _ZN8QVariantC2ERK9QDateTime @ 2072 NONAME
+ _ZN8QVariantC2ERKS_ @ 2073 NONAME
+ _ZN8QVariantC2Eb @ 2074 NONAME
+ _ZN8QVariantC2Ed @ 2075 NONAME
+ _ZN8QVariantC2Ei @ 2076 NONAME
+ _ZN8QVariantC2EiPKv @ 2077 NONAME
+ _ZN8QVariantC2EiPKvj @ 2078 NONAME
+ _ZN8QVariantC2Ej @ 2079 NONAME
+ _ZN8QVariantC2Ex @ 2080 NONAME
+ _ZN8QVariantC2Ey @ 2081 NONAME
+ _ZN8QVariantD1Ev @ 2082 NONAME
+ _ZN8QVariantD2Ev @ 2083 NONAME
+ _ZN8QVariantaSERKS_ @ 2084 NONAME
+ _ZN9QBitArray4fillEbii @ 2085 NONAME
+ _ZN9QBitArray6resizeEi @ 2086 NONAME
+ _ZN9QBitArrayC1Eib @ 2087 NONAME
+ _ZN9QBitArrayC2Eib @ 2088 NONAME
+ _ZN9QBitArrayaNERKS_ @ 2089 NONAME
+ _ZN9QBitArrayeOERKS_ @ 2090 NONAME
+ _ZN9QBitArrayoRERKS_ @ 2091 NONAME
+ _ZN9QDateTime10fromStringERK7QStringN2Qt10DateFormatE @ 2092 NONAME
+ _ZN9QDateTime10fromStringERK7QStringS2_ @ 2093 NONAME
+ _ZN9QDateTime10fromTime_tEj @ 2094 NONAME
+ _ZN9QDateTime11setTimeSpecEN2Qt8TimeSpecE @ 2095 NONAME
+ _ZN9QDateTime12setUtcOffsetEi @ 2096 NONAME
+ _ZN9QDateTime15currentDateTimeEv @ 2097 NONAME
+ _ZN9QDateTime6detachEv @ 2098 NONAME
+ _ZN9QDateTime7setDateERK5QDate @ 2099 NONAME
+ _ZN9QDateTime7setTimeERK5QTime @ 2100 NONAME
+ _ZN9QDateTime9setTime_tEj @ 2101 NONAME
+ _ZN9QDateTimeC1ERK5QDate @ 2102 NONAME
+ _ZN9QDateTimeC1ERK5QDateRK5QTimeN2Qt8TimeSpecE @ 2103 NONAME
+ _ZN9QDateTimeC1ERKS_ @ 2104 NONAME
+ _ZN9QDateTimeC1Ev @ 2105 NONAME
+ _ZN9QDateTimeC2ERK5QDate @ 2106 NONAME
+ _ZN9QDateTimeC2ERK5QDateRK5QTimeN2Qt8TimeSpecE @ 2107 NONAME
+ _ZN9QDateTimeC2ERKS_ @ 2108 NONAME
+ _ZN9QDateTimeC2Ev @ 2109 NONAME
+ _ZN9QDateTimeD1Ev @ 2110 NONAME
+ _ZN9QDateTimeD2Ev @ 2111 NONAME
+ _ZN9QDateTimeaSERKS_ @ 2112 NONAME
+ _ZN9QFileInfo10setCachingEb @ 2113 NONAME
+ _ZN9QFileInfo12makeAbsoluteEv @ 2114 NONAME
+ _ZN9QFileInfo6detachEv @ 2115 NONAME
+ _ZN9QFileInfo7refreshEv @ 2116 NONAME
+ _ZN9QFileInfo7setFileERK4QDirRK7QString @ 2117 NONAME
+ _ZN9QFileInfo7setFileERK5QFile @ 2118 NONAME
+ _ZN9QFileInfo7setFileERK7QString @ 2119 NONAME
+ _ZN9QFileInfoC1ERK4QDirRK7QString @ 2120 NONAME
+ _ZN9QFileInfoC1ERK5QFile @ 2121 NONAME
+ _ZN9QFileInfoC1ERK7QString @ 2122 NONAME
+ _ZN9QFileInfoC1ERKS_ @ 2123 NONAME
+ _ZN9QFileInfoC1Ev @ 2124 NONAME
+ _ZN9QFileInfoC2ERK4QDirRK7QString @ 2125 NONAME
+ _ZN9QFileInfoC2ERK5QFile @ 2126 NONAME
+ _ZN9QFileInfoC2ERK7QString @ 2127 NONAME
+ _ZN9QFileInfoC2ERKS_ @ 2128 NONAME
+ _ZN9QFileInfoC2Ev @ 2129 NONAME
+ _ZN9QFileInfoD1Ev @ 2130 NONAME
+ _ZN9QFileInfoD2Ev @ 2131 NONAME
+ _ZN9QFileInfoaSERKS_ @ 2132 NONAME
+ _ZN9QFileInfoeqERKS_ @ 2133 NONAME
+ _ZN9QHashData11free_helperEPFvPNS_4NodeEE @ 2134 NONAME
+ _ZN9QHashData11shared_nullE @ 2135 NONAME DATA 32
+ _ZN9QHashData12allocateNodeEv @ 2136 NONAME
+ _ZN9QHashData12previousNodeEPNS_4NodeE @ 2137 NONAME
+ _ZN9QHashData13detach_helperEPFvPNS_4NodeEPvEPFvS1_Ei @ 2138 NONAME
+ _ZN9QHashData13detach_helperEPFvPNS_4NodeEPvEi @ 2139 NONAME
+ _ZN9QHashData14destroyAndFreeEv @ 2140 NONAME
+ _ZN9QHashData6rehashEi @ 2141 NONAME
+ _ZN9QHashData8freeNodeEPv @ 2142 NONAME
+ _ZN9QHashData8nextNodeEPNS_4NodeE @ 2143 NONAME
+ _ZN9QIODevice11qt_metacallEN11QMetaObject4CallEiPPv @ 2144 NONAME
+ _ZN9QIODevice11qt_metacastEPKc @ 2145 NONAME
+ _ZN9QIODevice11setOpenModeE6QFlagsINS_12OpenModeFlagEE @ 2146 NONAME
+ _ZN9QIODevice12aboutToCloseEv @ 2147 NONAME
+ _ZN9QIODevice12bytesWrittenEx @ 2148 NONAME
+ _ZN9QIODevice12readLineDataEPcx @ 2149 NONAME
+ _ZN9QIODevice14setErrorStringERK7QString @ 2150 NONAME
+ _ZN9QIODevice16staticMetaObjectE @ 2151 NONAME DATA 16
+ _ZN9QIODevice16waitForReadyReadEi @ 2152 NONAME
+ _ZN9QIODevice18setTextModeEnabledEb @ 2153 NONAME
+ _ZN9QIODevice19getStaticMetaObjectEv @ 2154 NONAME
+ _ZN9QIODevice19readChannelFinishedEv @ 2155 NONAME
+ _ZN9QIODevice19waitForBytesWrittenEi @ 2156 NONAME
+ _ZN9QIODevice4openE6QFlagsINS_12OpenModeFlagEE @ 2157 NONAME
+ _ZN9QIODevice4peekEPcx @ 2158 NONAME
+ _ZN9QIODevice4peekEx @ 2159 NONAME
+ _ZN9QIODevice4readEPcx @ 2160 NONAME
+ _ZN9QIODevice4readEx @ 2161 NONAME
+ _ZN9QIODevice4seekEx @ 2162 NONAME
+ _ZN9QIODevice5closeEv @ 2163 NONAME
+ _ZN9QIODevice5resetEv @ 2164 NONAME
+ _ZN9QIODevice5writeEPKc @ 2165 NONAME
+ _ZN9QIODevice5writeEPKcx @ 2166 NONAME
+ _ZN9QIODevice7getCharEPc @ 2167 NONAME
+ _ZN9QIODevice7putCharEc @ 2168 NONAME
+ _ZN9QIODevice7readAllEv @ 2169 NONAME
+ _ZN9QIODevice8readLineEPcx @ 2170 NONAME
+ _ZN9QIODevice8readLineEx @ 2171 NONAME
+ _ZN9QIODevice9readyReadEv @ 2172 NONAME
+ _ZN9QIODevice9ungetCharEc @ 2173 NONAME
+ _ZN9QIODeviceC2EP7QObject @ 2174 NONAME
+ _ZN9QIODeviceC2ER16QIODevicePrivateP7QObject @ 2175 NONAME
+ _ZN9QIODeviceC2Ev @ 2176 NONAME
+ _ZN9QIODeviceD0Ev @ 2177 NONAME
+ _ZN9QIODeviceD1Ev @ 2178 NONAME
+ _ZN9QIODeviceD2Ev @ 2179 NONAME
+ _ZN9QInternal12callFunctionENS_16InternalFunctionEPPv @ 2180 NONAME
+ _ZN9QInternal16registerCallbackENS_8CallbackEPFbPPvE @ 2181 NONAME
+ _ZN9QInternal17activateCallbacksENS_8CallbackEPPv @ 2182 NONAME
+ _ZN9QInternal18unregisterCallbackENS_8CallbackEPFbPPvE @ 2183 NONAME
+ _ZN9QListData11shared_nullE @ 2184 NONAME DATA 24
+ _ZN9QListData4moveEii @ 2185 NONAME
+ _ZN9QListData5eraseEPPv @ 2186 NONAME
+ _ZN9QListData6appendERKS_ @ 2187 NONAME
+ _ZN9QListData6appendEv @ 2188 NONAME
+ _ZN9QListData6detachEv @ 2189 NONAME
+ _ZN9QListData6insertEi @ 2190 NONAME
+ _ZN9QListData6removeEi @ 2191 NONAME
+ _ZN9QListData6removeEii @ 2192 NONAME
+ _ZN9QListData7append2ERKS_ @ 2193 NONAME
+ _ZN9QListData7detach2Ev @ 2194 NONAME
+ _ZN9QListData7detach3Ev @ 2195 NONAME
+ _ZN9QListData7prependEv @ 2196 NONAME
+ _ZN9QListData7reallocEi @ 2197 NONAME
+ _ZN9QMetaType12isRegisteredEi @ 2198 NONAME
+ _ZN9QMetaType12registerTypeEPKcPFvPvEPFS2_PKvE @ 2199 NONAME
+ _ZN9QMetaType14unregisterTypeEPKc @ 2200 NONAME
+ _ZN9QMetaType23registerStreamOperatorsEPKcPFvR11QDataStreamPKvEPFvS3_PvE @ 2201 NONAME
+ _ZN9QMetaType4loadER11QDataStreamiPv @ 2202 NONAME
+ _ZN9QMetaType4saveER11QDataStreamiPKv @ 2203 NONAME
+ _ZN9QMetaType4typeEPKc @ 2204 NONAME
+ _ZN9QMetaType7destroyEiPv @ 2205 NONAME
+ _ZN9QMetaType8typeNameEi @ 2206 NONAME
+ _ZN9QMetaType9constructEiPKv @ 2207 NONAME
+ _ZN9QMimeData11qt_metacallEN11QMetaObject4CallEiPPv @ 2208 NONAME
+ _ZN9QMimeData11qt_metacastEPKc @ 2209 NONAME
+ _ZN9QMimeData12removeFormatERK7QString @ 2210 NONAME
+ _ZN9QMimeData12setColorDataERK8QVariant @ 2211 NONAME
+ _ZN9QMimeData12setImageDataERK8QVariant @ 2212 NONAME
+ _ZN9QMimeData16staticMetaObjectE @ 2213 NONAME DATA 16
+ _ZN9QMimeData19getStaticMetaObjectEv @ 2214 NONAME
+ _ZN9QMimeData5clearEv @ 2215 NONAME
+ _ZN9QMimeData7setDataERK7QStringRK10QByteArray @ 2216 NONAME
+ _ZN9QMimeData7setHtmlERK7QString @ 2217 NONAME
+ _ZN9QMimeData7setTextERK7QString @ 2218 NONAME
+ _ZN9QMimeData7setUrlsERK5QListI4QUrlE @ 2219 NONAME
+ _ZN9QMimeDataC1Ev @ 2220 NONAME
+ _ZN9QMimeDataC2Ev @ 2221 NONAME
+ _ZN9QMimeDataD0Ev @ 2222 NONAME
+ _ZN9QMimeDataD1Ev @ 2223 NONAME
+ _ZN9QMimeDataD2Ev @ 2224 NONAME
+ _ZN9QResource11searchPathsEv @ 2225 NONAME
+ _ZN9QResource11setFileNameERK7QString @ 2226 NONAME
+ _ZN9QResource13addSearchPathERK7QString @ 2227 NONAME
+ _ZN9QResource16registerResourceEPKhRK7QString @ 2228 NONAME
+ _ZN9QResource16registerResourceERK7QStringS2_ @ 2229 NONAME
+ _ZN9QResource18unregisterResourceEPKhRK7QString @ 2230 NONAME
+ _ZN9QResource18unregisterResourceERK7QStringS2_ @ 2231 NONAME
+ _ZN9QResource9setLocaleERK7QLocale @ 2232 NONAME
+ _ZN9QResourceC1ERK7QStringRK7QLocale @ 2233 NONAME
+ _ZN9QResourceC2ERK7QStringRK7QLocale @ 2234 NONAME
+ _ZN9QResourceD1Ev @ 2235 NONAME
+ _ZN9QResourceD2Ev @ 2236 NONAME
+ _ZN9QSettings10beginGroupERK7QString @ 2237 NONAME
+ _ZN9QSettings11qt_metacallEN11QMetaObject4CallEiPPv @ 2238 NONAME
+ _ZN9QSettings11qt_metacastEPKc @ 2239 NONAME
+ _ZN9QSettings11setIniCodecEP10QTextCodec @ 2240 NONAME
+ _ZN9QSettings11setIniCodecEPKc @ 2241 NONAME
+ _ZN9QSettings13defaultFormatEv @ 2242 NONAME
+ _ZN9QSettings13setArrayIndexEi @ 2243 NONAME
+ _ZN9QSettings14beginReadArrayERK7QString @ 2244 NONAME
+ _ZN9QSettings14registerFormatERK7QStringPFbR9QIODeviceR4QMapIS0_8QVariantEEPFbS4_RKS7_EN2Qt15CaseSensitivityE @ 2245 NONAME
+ _ZN9QSettings14setUserIniPathERK7QString @ 2246 NONAME
+ _ZN9QSettings15beginWriteArrayERK7QStringi @ 2247 NONAME
+ _ZN9QSettings16setDefaultFormatENS_6FormatE @ 2248 NONAME
+ _ZN9QSettings16setSystemIniPathERK7QString @ 2249 NONAME
+ _ZN9QSettings16staticMetaObjectE @ 2250 NONAME DATA 16
+ _ZN9QSettings19getStaticMetaObjectEv @ 2251 NONAME
+ _ZN9QSettings19setFallbacksEnabledEb @ 2252 NONAME
+ _ZN9QSettings4syncEv @ 2253 NONAME
+ _ZN9QSettings5clearEv @ 2254 NONAME
+ _ZN9QSettings5eventEP6QEvent @ 2255 NONAME
+ _ZN9QSettings6removeERK7QString @ 2256 NONAME
+ _ZN9QSettings7setPathENS_6FormatENS_5ScopeERK7QString @ 2257 NONAME
+ _ZN9QSettings8endArrayEv @ 2258 NONAME
+ _ZN9QSettings8endGroupEv @ 2259 NONAME
+ _ZN9QSettings8setValueERK7QStringRK8QVariant @ 2260 NONAME
+ _ZN9QSettingsC1ENS_5ScopeERK7QStringS3_P7QObject @ 2261 NONAME
+ _ZN9QSettingsC1ENS_6FormatENS_5ScopeERK7QStringS4_P7QObject @ 2262 NONAME
+ _ZN9QSettingsC1EP7QObject @ 2263 NONAME
+ _ZN9QSettingsC1ERK7QStringNS_6FormatEP7QObject @ 2264 NONAME
+ _ZN9QSettingsC1ERK7QStringS2_P7QObject @ 2265 NONAME
+ _ZN9QSettingsC2ENS_5ScopeERK7QStringS3_P7QObject @ 2266 NONAME
+ _ZN9QSettingsC2ENS_6FormatENS_5ScopeERK7QStringS4_P7QObject @ 2267 NONAME
+ _ZN9QSettingsC2EP7QObject @ 2268 NONAME
+ _ZN9QSettingsC2ERK7QStringNS_6FormatEP7QObject @ 2269 NONAME
+ _ZN9QSettingsC2ERK7QStringS2_P7QObject @ 2270 NONAME
+ _ZN9QSettingsD0Ev @ 2271 NONAME
+ _ZN9QSettingsD1Ev @ 2272 NONAME
+ _ZN9QSettingsD2Ev @ 2273 NONAME
+ _ZN9QTimeLine10timerEventEP11QTimerEvent @ 2274 NONAME
+ _ZN9QTimeLine11qt_metacallEN11QMetaObject4CallEiPPv @ 2275 NONAME
+ _ZN9QTimeLine11qt_metacastEPKc @ 2276 NONAME
+ _ZN9QTimeLine11setDurationEi @ 2277 NONAME
+ _ZN9QTimeLine11setEndFrameEi @ 2278 NONAME
+ _ZN9QTimeLine12frameChangedEi @ 2279 NONAME
+ _ZN9QTimeLine12setDirectionENS_9DirectionE @ 2280 NONAME
+ _ZN9QTimeLine12setLoopCountEi @ 2281 NONAME
+ _ZN9QTimeLine12stateChangedENS_5StateE @ 2282 NONAME
+ _ZN9QTimeLine12valueChangedEf @ 2283 NONAME
+ _ZN9QTimeLine13setCurveShapeENS_10CurveShapeE @ 2284 NONAME
+ _ZN9QTimeLine13setFrameRangeEii @ 2285 NONAME
+ _ZN9QTimeLine13setStartFrameEi @ 2286 NONAME
+ _ZN9QTimeLine14setCurrentTimeEi @ 2287 NONAME
+ _ZN9QTimeLine14setEasingCurveERK12QEasingCurve @ 2288 NONAME
+ _ZN9QTimeLine15toggleDirectionEv @ 2289 NONAME
+ _ZN9QTimeLine16staticMetaObjectE @ 2290 NONAME DATA 16
+ _ZN9QTimeLine17setUpdateIntervalEi @ 2291 NONAME
+ _ZN9QTimeLine19getStaticMetaObjectEv @ 2292 NONAME
+ _ZN9QTimeLine4stopEv @ 2293 NONAME
+ _ZN9QTimeLine5startEv @ 2294 NONAME
+ _ZN9QTimeLine6resumeEv @ 2295 NONAME
+ _ZN9QTimeLine8finishedEv @ 2296 NONAME
+ _ZN9QTimeLine9setPausedEb @ 2297 NONAME
+ _ZN9QTimeLineC1EiP7QObject @ 2298 NONAME
+ _ZN9QTimeLineC2EiP7QObject @ 2299 NONAME
+ _ZN9QTimeLineD0Ev @ 2300 NONAME
+ _ZN9QTimeLineD1Ev @ 2301 NONAME
+ _ZN9QTimeLineD2Ev @ 2302 NONAME
+ _ZN9QXmlUtils10isBaseCharE5QChar @ 2303 NONAME
+ _ZN9QXmlUtils10isExtenderE5QChar @ 2304 NONAME
+ _ZN9QXmlUtils10isNameCharE5QChar @ 2305 NONAME
+ _ZN9QXmlUtils10isPublicIDERK7QString @ 2306 NONAME
+ _ZN9QXmlUtils13isIdeographicE5QChar @ 2307 NONAME
+ _ZN9QXmlUtils13rangeContainsEPK13QXmlCharRangeS2_5QChar @ 2308 NONAME
+ _ZN9QXmlUtils15isCombiningCharE5QChar @ 2309 NONAME
+ _ZN9QXmlUtils6isCharE5QChar @ 2310 NONAME
+ _ZN9QXmlUtils7isDigitE5QChar @ 2311 NONAME
+ _ZN9QXmlUtils8isLetterE5QChar @ 2312 NONAME
+ _ZN9QXmlUtils8isNCNameERK10QStringRef @ 2313 NONAME
+ _ZN9QXmlUtils9isEncNameERK7QString @ 2314 NONAME
+ _ZN9QtPrivate16QStringList_joinEPK11QStringListRK7QString @ 2315 NONAME
+ _ZN9QtPrivate16QStringList_sortEP11QStringList @ 2316 NONAME
+ _ZN9QtPrivate18QStringList_filterEPK11QStringListRK7QRegExp @ 2317 NONAME
+ _ZN9QtPrivate18QStringList_filterEPK11QStringListRK7QStringN2Qt15CaseSensitivityE @ 2318 NONAME
+ _ZN9QtPrivate19QStringList_indexOfEPK11QStringListR7QRegExpi @ 2319 NONAME
+ _ZN9QtPrivate19QStringList_indexOfEPK11QStringListRK7QRegExpi @ 2320 NONAME
+ _ZN9QtPrivate20QStringList_containsEPK11QStringListRK7QStringN2Qt15CaseSensitivityE @ 2321 NONAME
+ _ZN9QtPrivate23QStringList_lastIndexOfEPK11QStringListR7QRegExpi @ 2322 NONAME
+ _ZN9QtPrivate23QStringList_lastIndexOfEPK11QStringListRK7QRegExpi @ 2323 NONAME
+ _ZN9QtPrivate28QStringList_removeDuplicatesEP11QStringList @ 2324 NONAME
+ _ZN9QtPrivate28QStringList_replaceInStringsEP11QStringListRK7QRegExpRK7QString @ 2325 NONAME
+ _ZN9QtPrivate28QStringList_replaceInStringsEP11QStringListRK7QStringS4_N2Qt15CaseSensitivityE @ 2326 NONAME
+ _ZNK10QByteArray10simplifiedEv @ 2327 NONAME
+ _ZNK10QByteArray10startsWithEPKc @ 2328 NONAME
+ _ZNK10QByteArray10startsWithERKS_ @ 2329 NONAME
+ _ZNK10QByteArray10startsWithEc @ 2330 NONAME
+ _ZNK10QByteArray10toLongLongEPbi @ 2331 NONAME
+ _ZNK10QByteArray11lastIndexOfEPKci @ 2332 NONAME
+ _ZNK10QByteArray11lastIndexOfERKS_i @ 2333 NONAME
+ _ZNK10QByteArray11lastIndexOfEci @ 2334 NONAME
+ _ZNK10QByteArray11toULongLongEPbi @ 2335 NONAME
+ _ZNK10QByteArray13leftJustifiedEicb @ 2336 NONAME
+ _ZNK10QByteArray13nulTerminatedEv @ 2337 NONAME
+ _ZNK10QByteArray14rightJustifiedEicb @ 2338 NONAME
+ _ZNK10QByteArray17toPercentEncodingERKS_S1_c @ 2339 NONAME
+ _ZNK10QByteArray3midEii @ 2340 NONAME
+ _ZNK10QByteArray4leftEi @ 2341 NONAME
+ _ZNK10QByteArray5countEPKc @ 2342 NONAME
+ _ZNK10QByteArray5countERKS_ @ 2343 NONAME
+ _ZNK10QByteArray5countEc @ 2344 NONAME
+ _ZNK10QByteArray5rightEi @ 2345 NONAME
+ _ZNK10QByteArray5splitEc @ 2346 NONAME
+ _ZNK10QByteArray5toHexEv @ 2347 NONAME
+ _ZNK10QByteArray5toIntEPbi @ 2348 NONAME
+ _ZNK10QByteArray6isNullEv @ 2349 NONAME
+ _ZNK10QByteArray6toLongEPbi @ 2350 NONAME
+ _ZNK10QByteArray6toUIntEPbi @ 2351 NONAME
+ _ZNK10QByteArray7indexOfEPKci @ 2352 NONAME
+ _ZNK10QByteArray7indexOfERKS_i @ 2353 NONAME
+ _ZNK10QByteArray7indexOfEci @ 2354 NONAME
+ _ZNK10QByteArray7toFloatEPb @ 2355 NONAME
+ _ZNK10QByteArray7toLowerEv @ 2356 NONAME
+ _ZNK10QByteArray7toShortEPbi @ 2357 NONAME
+ _ZNK10QByteArray7toULongEPbi @ 2358 NONAME
+ _ZNK10QByteArray7toUpperEv @ 2359 NONAME
+ _ZNK10QByteArray7trimmedEv @ 2360 NONAME
+ _ZNK10QByteArray8endsWithEPKc @ 2361 NONAME
+ _ZNK10QByteArray8endsWithERKS_ @ 2362 NONAME
+ _ZNK10QByteArray8endsWithEc @ 2363 NONAME
+ _ZNK10QByteArray8repeatedEi @ 2364 NONAME
+ _ZNK10QByteArray8toBase64Ev @ 2365 NONAME
+ _ZNK10QByteArray8toDoubleEPb @ 2366 NONAME
+ _ZNK10QByteArray8toUShortEPbi @ 2367 NONAME
+ _ZNK10QEventLoop10metaObjectEv @ 2368 NONAME
+ _ZNK10QEventLoop9isRunningEv @ 2369 NONAME
+ _ZNK10QSemaphore9availableEv @ 2370 NONAME
+ _ZNK10QStringRef8appendToEP7QString @ 2371 NONAME
+ _ZNK10QStringRef8toStringEv @ 2372 NONAME
+ _ZNK10QTextCodec11fromUnicodeERK7QString @ 2373 NONAME
+ _ZNK10QTextCodec11makeDecoderEv @ 2374 NONAME
+ _ZNK10QTextCodec11makeEncoderEv @ 2375 NONAME
+ _ZNK10QTextCodec7aliasesEv @ 2376 NONAME
+ _ZNK10QTextCodec9canEncodeE5QChar @ 2377 NONAME
+ _ZNK10QTextCodec9canEncodeERK7QString @ 2378 NONAME
+ _ZNK10QTextCodec9toUnicodeEPKc @ 2379 NONAME
+ _ZNK10QTextCodec9toUnicodeERK10QByteArray @ 2380 NONAME
+ _ZNK11QDataStream22floatingPointPrecisionEv @ 2381 NONAME
+ _ZNK11QDataStream5atEndEv @ 2382 NONAME
+ _ZNK11QDataStream6statusEv @ 2383 NONAME
+ _ZNK11QFinalState10metaObjectEv @ 2384 NONAME
+ _ZNK11QMetaMethod10attributesEv @ 2385 NONAME
+ _ZNK11QMetaMethod10methodTypeEv @ 2386 NONAME
+ _ZNK11QMetaMethod11methodIndexEv @ 2387 NONAME
+ _ZNK11QMetaMethod14parameterNamesEv @ 2388 NONAME
+ _ZNK11QMetaMethod14parameterTypesEv @ 2389 NONAME
+ _ZNK11QMetaMethod3tagEv @ 2390 NONAME
+ _ZNK11QMetaMethod6accessEv @ 2391 NONAME
+ _ZNK11QMetaMethod6invokeEP7QObjectN2Qt14ConnectionTypeE22QGenericReturnArgument16QGenericArgumentS5_S5_S5_S5_S5_S5_S5_S5_S5_ @ 2392 NONAME
+ _ZNK11QMetaMethod8typeNameEv @ 2393 NONAME
+ _ZNK11QMetaMethod9signatureEv @ 2394 NONAME
+ _ZNK11QMetaObject10enumeratorEi @ 2395 NONAME
+ _ZNK11QMetaObject11constructorEi @ 2396 NONAME
+ _ZNK11QMetaObject11indexOfSlotEPKc @ 2397 NONAME
+ _ZNK11QMetaObject11methodCountEv @ 2398 NONAME
+ _ZNK11QMetaObject11newInstanceE16QGenericArgumentS0_S0_S0_S0_S0_S0_S0_S0_S0_ @ 2399 NONAME
+ _ZNK11QMetaObject12methodOffsetEv @ 2400 NONAME
+ _ZNK11QMetaObject12userPropertyEv @ 2401 NONAME
+ _ZNK11QMetaObject13indexOfMethodEPKc @ 2402 NONAME
+ _ZNK11QMetaObject13indexOfSignalEPKc @ 2403 NONAME
+ _ZNK11QMetaObject13propertyCountEv @ 2404 NONAME
+ _ZNK11QMetaObject14classInfoCountEv @ 2405 NONAME
+ _ZNK11QMetaObject14propertyOffsetEv @ 2406 NONAME
+ _ZNK11QMetaObject15classInfoOffsetEv @ 2407 NONAME
+ _ZNK11QMetaObject15enumeratorCountEv @ 2408 NONAME
+ _ZNK11QMetaObject15indexOfPropertyEPKc @ 2409 NONAME
+ _ZNK11QMetaObject15static_metacallENS_4CallEiPPv @ 2410 NONAME
+ _ZNK11QMetaObject16constructorCountEv @ 2411 NONAME
+ _ZNK11QMetaObject16enumeratorOffsetEv @ 2412 NONAME
+ _ZNK11QMetaObject16indexOfClassInfoEPKc @ 2413 NONAME
+ _ZNK11QMetaObject17indexOfEnumeratorEPKc @ 2414 NONAME
+ _ZNK11QMetaObject18indexOfConstructorEPKc @ 2415 NONAME
+ _ZNK11QMetaObject2trEPKcS1_ @ 2416 NONAME
+ _ZNK11QMetaObject2trEPKcS1_i @ 2417 NONAME
+ _ZNK11QMetaObject4castEP7QObject @ 2418 NONAME
+ _ZNK11QMetaObject6methodEi @ 2419 NONAME
+ _ZNK11QMetaObject6trUtf8EPKcS1_ @ 2420 NONAME
+ _ZNK11QMetaObject6trUtf8EPKcS1_i @ 2421 NONAME
+ _ZNK11QMetaObject8propertyEi @ 2422 NONAME
+ _ZNK11QMetaObject9classInfoEi @ 2423 NONAME
+ _ZNK11QTextStream10fieldWidthEv @ 2424 NONAME
+ _ZNK11QTextStream11integerBaseEv @ 2425 NONAME
+ _ZNK11QTextStream11numberFlagsEv @ 2426 NONAME
+ _ZNK11QTextStream14fieldAlignmentEv @ 2427 NONAME
+ _ZNK11QTextStream17autoDetectUnicodeEv @ 2428 NONAME
+ _ZNK11QTextStream18realNumberNotationEv @ 2429 NONAME
+ _ZNK11QTextStream19realNumberPrecisionEv @ 2430 NONAME
+ _ZNK11QTextStream21generateByteOrderMarkEv @ 2431 NONAME
+ _ZNK11QTextStream3posEv @ 2432 NONAME
+ _ZNK11QTextStream5atEndEv @ 2433 NONAME
+ _ZNK11QTextStream5codecEv @ 2434 NONAME
+ _ZNK11QTextStream6deviceEv @ 2435 NONAME
+ _ZNK11QTextStream6localeEv @ 2436 NONAME
+ _ZNK11QTextStream6statusEv @ 2437 NONAME
+ _ZNK11QTextStream6stringEv @ 2438 NONAME
+ _ZNK11QTextStream7padCharEv @ 2439 NONAME
+ _ZNK11QThreadPool10metaObjectEv @ 2440 NONAME
+ _ZNK11QThreadPool13expiryTimeoutEv @ 2441 NONAME
+ _ZNK11QThreadPool14maxThreadCountEv @ 2442 NONAME
+ _ZNK11QThreadPool17activeThreadCountEv @ 2443 NONAME
+ _ZNK11QTranslator10metaObjectEv @ 2444 NONAME
+ _ZNK11QTranslator7isEmptyEv @ 2445 NONAME
+ _ZNK11QTranslator9translateEPKcS1_S1_ @ 2446 NONAME
+ _ZNK11QTranslator9translateEPKcS1_S1_i @ 2447 NONAME
+ _ZNK12QDirIterator4pathEv @ 2448 NONAME
+ _ZNK12QDirIterator7hasNextEv @ 2449 NONAME
+ _ZNK12QDirIterator8fileInfoEv @ 2450 NONAME
+ _ZNK12QDirIterator8fileNameEv @ 2451 NONAME
+ _ZNK12QDirIterator8filePathEv @ 2452 NONAME
+ _ZNK12QEasingCurve10customTypeEv @ 2453 NONAME
+ _ZNK12QEasingCurve16valueForProgressEf @ 2454 NONAME
+ _ZNK12QEasingCurve4typeEv @ 2455 NONAME
+ _ZNK12QEasingCurve6periodEv @ 2456 NONAME
+ _ZNK12QEasingCurve9amplitudeEv @ 2457 NONAME
+ _ZNK12QEasingCurve9overshootEv @ 2458 NONAME
+ _ZNK12QEasingCurveeqERKS_ @ 2459 NONAME
+ _ZNK12QTextDecoder10hasFailureEv @ 2460 NONAME
+ _ZNK12QTextEncoder10hasFailureEv @ 2461 NONAME
+ _ZNK13QFSFileEngine12isSequentialEv @ 2462 NONAME
+ _ZNK13QFSFileEngine13caseSensitiveEv @ 2463 NONAME
+ _ZNK13QFSFileEngine14isRelativePathEv @ 2464 NONAME
+ _ZNK13QFSFileEngine17supportsExtensionEN19QAbstractFileEngine9ExtensionE @ 2465 NONAME
+ _ZNK13QFSFileEngine3posEv @ 2466 NONAME
+ _ZNK13QFSFileEngine4sizeEv @ 2467 NONAME
+ _ZNK13QFSFileEngine5mkdirERK7QStringb @ 2468 NONAME
+ _ZNK13QFSFileEngine5ownerEN19QAbstractFileEngine9FileOwnerE @ 2469 NONAME
+ _ZNK13QFSFileEngine5rmdirERK7QStringb @ 2470 NONAME
+ _ZNK13QFSFileEngine6handleEv @ 2471 NONAME
+ _ZNK13QFSFileEngine7ownerIdEN19QAbstractFileEngine9FileOwnerE @ 2472 NONAME
+ _ZNK13QFSFileEngine8fileNameEN19QAbstractFileEngine8FileNameE @ 2473 NONAME
+ _ZNK13QFSFileEngine8fileTimeEN19QAbstractFileEngine8FileTimeE @ 2474 NONAME
+ _ZNK13QFSFileEngine9entryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 2475 NONAME
+ _ZNK13QFSFileEngine9fileFlagsE6QFlagsIN19QAbstractFileEngine8FileFlagEE @ 2476 NONAME
+ _ZNK13QFontLaoCodec16convertToUnicodeEPKciPN10QTextCodec14ConverterStateE @ 2477 NONAME
+ _ZNK13QFontLaoCodec18convertFromUnicodeEPK5QChariPN10QTextCodec14ConverterStateE @ 2478 NONAME
+ _ZNK13QFontLaoCodec4nameEv @ 2479 NONAME
+ _ZNK13QFontLaoCodec7mibEnumEv @ 2480 NONAME
+ _ZNK13QHistoryState10metaObjectEv @ 2481 NONAME
+ _ZNK13QHistoryState11historyTypeEv @ 2482 NONAME
+ _ZNK13QHistoryState12defaultStateEv @ 2483 NONAME
+ _ZNK13QMetaProperty10enumeratorEv @ 2484 NONAME
+ _ZNK13QMetaProperty10isConstantEv @ 2485 NONAME
+ _ZNK13QMetaProperty10isEditableEPK7QObject @ 2486 NONAME
+ _ZNK13QMetaProperty10isEnumTypeEv @ 2487 NONAME
+ _ZNK13QMetaProperty10isFlagTypeEv @ 2488 NONAME
+ _ZNK13QMetaProperty10isReadableEv @ 2489 NONAME
+ _ZNK13QMetaProperty10isWritableEv @ 2490 NONAME
+ _ZNK13QMetaProperty12hasStdCppSetEv @ 2491 NONAME
+ _ZNK13QMetaProperty12isDesignableEPK7QObject @ 2492 NONAME
+ _ZNK13QMetaProperty12isResettableEv @ 2493 NONAME
+ _ZNK13QMetaProperty12isScriptableEPK7QObject @ 2494 NONAME
+ _ZNK13QMetaProperty12notifySignalEv @ 2495 NONAME
+ _ZNK13QMetaProperty13propertyIndexEv @ 2496 NONAME
+ _ZNK13QMetaProperty15hasNotifySignalEv @ 2497 NONAME
+ _ZNK13QMetaProperty17notifySignalIndexEv @ 2498 NONAME
+ _ZNK13QMetaProperty4nameEv @ 2499 NONAME
+ _ZNK13QMetaProperty4readEPK7QObject @ 2500 NONAME
+ _ZNK13QMetaProperty4typeEv @ 2501 NONAME
+ _ZNK13QMetaProperty5resetEP7QObject @ 2502 NONAME
+ _ZNK13QMetaProperty5writeEP7QObjectRK8QVariant @ 2503 NONAME
+ _ZNK13QMetaProperty6isUserEPK7QObject @ 2504 NONAME
+ _ZNK13QMetaProperty7isFinalEv @ 2505 NONAME
+ _ZNK13QMetaProperty8isStoredEPK7QObject @ 2506 NONAME
+ _ZNK13QMetaProperty8typeNameEv @ 2507 NONAME
+ _ZNK13QMetaProperty8userTypeEv @ 2508 NONAME
+ _ZNK13QPluginLoader10metaObjectEv @ 2509 NONAME
+ _ZNK13QPluginLoader11errorStringEv @ 2510 NONAME
+ _ZNK13QPluginLoader8fileNameEv @ 2511 NONAME
+ _ZNK13QPluginLoader8isLoadedEv @ 2512 NONAME
+ _ZNK13QPluginLoader9loadHintsEv @ 2513 NONAME
+ _ZNK13QSharedMemory10isAttachedEv @ 2514 NONAME
+ _ZNK13QSharedMemory10metaObjectEv @ 2515 NONAME
+ _ZNK13QSharedMemory11errorStringEv @ 2516 NONAME
+ _ZNK13QSharedMemory3keyEv @ 2517 NONAME
+ _ZNK13QSharedMemory4dataEv @ 2518 NONAME
+ _ZNK13QSharedMemory4sizeEv @ 2519 NONAME
+ _ZNK13QSharedMemory5errorEv @ 2520 NONAME
+ _ZNK13QSharedMemory9constDataEv @ 2521 NONAME
+ _ZNK13QSignalMapper10metaObjectEv @ 2522 NONAME
+ _ZNK13QSignalMapper7mappingEP7QObject @ 2523 NONAME
+ _ZNK13QSignalMapper7mappingEP7QWidget @ 2524 NONAME
+ _ZNK13QSignalMapper7mappingERK7QString @ 2525 NONAME
+ _ZNK13QSignalMapper7mappingEi @ 2526 NONAME
+ _ZNK13QStateMachine10metaObjectEv @ 2527 NONAME
+ _ZNK13QStateMachine11errorStringEv @ 2528 NONAME
+ _ZNK13QStateMachine13configurationEv @ 2529 NONAME
+ _ZNK13QStateMachine17animationsEnabledEv @ 2530 NONAME
+ _ZNK13QStateMachine17defaultAnimationsEv @ 2531 NONAME
+ _ZNK13QStateMachine19globalRestorePolicyEv @ 2532 NONAME
+ _ZNK13QStateMachine5errorEv @ 2533 NONAME
+ _ZNK13QStateMachine9isRunningEv @ 2534 NONAME
+ _ZNK13QSystemLocale14fallbackLocaleEv @ 2535 NONAME
+ _ZNK13QSystemLocale5queryENS_9QueryTypeE8QVariant @ 2536 NONAME
+ _ZNK14QAbstractState10metaObjectEv @ 2537 NONAME
+ _ZNK14QAbstractState11parentStateEv @ 2538 NONAME
+ _ZNK14QAbstractState7machineEv @ 2539 NONAME
+ _ZNK14QFactoryLoader10metaObjectEv @ 2540 NONAME
+ _ZNK14QFactoryLoader4keysEv @ 2541 NONAME
+ _ZNK14QFactoryLoader8instanceERK7QString @ 2542 NONAME
+ _ZNK14QLocalePrivate13validateCharsERK7QStringNS_10NumberModeEP10QByteArrayi @ 2543 NONAME
+ _ZNK14QLocalePrivate14doubleToStringEdiNS_10DoubleFormEij @ 2544 NONAME
+ _ZNK14QLocalePrivate14stringToDoubleERK7QStringPbNS_18GroupSeparatorModeE @ 2545 NONAME
+ _ZNK14QLocalePrivate15numberToCLocaleERK7QStringNS_18GroupSeparatorModeEP15QVarLengthArrayIcLi256EE @ 2546 NONAME
+ _ZNK14QLocalePrivate16dateTimeToStringERK7QStringPK5QDatePK5QTimePK7QLocale @ 2547 NONAME
+ _ZNK14QLocalePrivate16longLongToStringExiiij @ 2548 NONAME
+ _ZNK14QLocalePrivate16stringToLongLongERK7QStringiPbNS_18GroupSeparatorModeE @ 2549 NONAME
+ _ZNK14QLocalePrivate17measurementSystemEv @ 2550 NONAME
+ _ZNK14QLocalePrivate19stringToUnsLongLongERK7QStringiPbNS_18GroupSeparatorModeE @ 2551 NONAME
+ _ZNK14QLocalePrivate19unsLongLongToStringEyiiij @ 2552 NONAME
+ _ZNK14QMetaClassInfo4nameEv @ 2553 NONAME
+ _ZNK14QMetaClassInfo5valueEv @ 2554 NONAME
+ _ZNK14QObjectPrivate10senderListEv @ 2555 NONAME
+ _ZNK14QObjectPrivate11signalIndexEPKc @ 2556 NONAME
+ _ZNK14QObjectPrivate12receiverListEPKc @ 2557 NONAME
+ _ZNK14QObjectPrivate17isSignalConnectedEi @ 2558 NONAME
+ _ZNK14QObjectPrivate8isSenderEPK7QObjectPKc @ 2559 NONAME
+ _ZNK14QStringMatcher7indexInEPK5QCharii @ 2560 NONAME
+ _ZNK14QStringMatcher7indexInERK7QStringi @ 2561 NONAME
+ _ZNK14QStringMatcher7patternEv @ 2562 NONAME
+ _ZNK14QTemporaryFile10autoRemoveEv @ 2563 NONAME
+ _ZNK14QTemporaryFile10fileEngineEv @ 2564 NONAME
+ _ZNK14QTemporaryFile10metaObjectEv @ 2565 NONAME
+ _ZNK14QTemporaryFile12fileTemplateEv @ 2566 NONAME
+ _ZNK14QTemporaryFile8fileNameEv @ 2567 NONAME
+ _ZNK15QAnimationGroup10metaObjectEv @ 2568 NONAME
+ _ZNK15QAnimationGroup11animationAtEi @ 2569 NONAME
+ _ZNK15QAnimationGroup14animationCountEv @ 2570 NONAME
+ _ZNK15QAnimationGroup16indexOfAnimationEP18QAbstractAnimation @ 2571 NONAME
+ _ZNK15QDateTimeParser10fromStringERK7QStringP5QDateP5QTime @ 2572 NONAME
+ _ZNK15QDateTimeParser10getMaximumEv @ 2573 NONAME
+ _ZNK15QDateTimeParser10getMinimumEv @ 2574 NONAME
+ _ZNK15QDateTimeParser10sectionPosERKNS_11SectionNodeE @ 2575 NONAME
+ _ZNK15QDateTimeParser10sectionPosEi @ 2576 NONAME
+ _ZNK15QDateTimeParser11absoluteMaxEiRK9QDateTime @ 2577 NONAME
+ _ZNK15QDateTimeParser11absoluteMinEi @ 2578 NONAME
+ _ZNK15QDateTimeParser11getAmPmTextENS_4AmPmENS_4CaseE @ 2579 NONAME
+ _ZNK15QDateTimeParser11sectionNameEi @ 2580 NONAME
+ _ZNK15QDateTimeParser11sectionNodeEi @ 2581 NONAME
+ _ZNK15QDateTimeParser11sectionSizeEi @ 2582 NONAME
+ _ZNK15QDateTimeParser11sectionTextERK7QStringii @ 2583 NONAME
+ _ZNK15QDateTimeParser11sectionTextEi @ 2584 NONAME
+ _ZNK15QDateTimeParser11sectionTypeEi @ 2585 NONAME
+ _ZNK15QDateTimeParser12parseSectionERK9QDateTimeiR7QStringRiiRNS_5StateEPi @ 2586 NONAME
+ _ZNK15QDateTimeParser13sectionFormatENS_7SectionEi @ 2587 NONAME
+ _ZNK15QDateTimeParser13sectionFormatEi @ 2588 NONAME
+ _ZNK15QDateTimeParser14potentialValueERK7QStringiiiRK9QDateTimei @ 2589 NONAME
+ _ZNK15QDateTimeParser14sectionMaxSizeENS_7SectionEi @ 2590 NONAME
+ _ZNK15QDateTimeParser14sectionMaxSizeEi @ 2591 NONAME
+ _ZNK15QDateTimeParser17skipToNextSectionEiRK9QDateTimeRK7QString @ 2592 NONAME
+ _ZNK15QDateTimeParser5parseER7QStringRiRK9QDateTimeb @ 2593 NONAME
+ _ZNK15QDateTimeParser7findDayERK7QStringiiPS0_Pi @ 2594 NONAME
+ _ZNK15QDateTimeParser8findAmPmER7QStringiPi @ 2595 NONAME
+ _ZNK15QDateTimeParser8getDigitERK9QDateTimei @ 2596 NONAME
+ _ZNK15QDateTimeParser8setDigitER9QDateTimeii @ 2597 NONAME
+ _ZNK15QDateTimeParser9fieldInfoEi @ 2598 NONAME
+ _ZNK15QDateTimeParser9findMonthERK7QStringiiPS0_Pi @ 2599 NONAME
+ _ZNK15QDateTimeParser9maxChangeEi @ 2600 NONAME
+ _ZNK15QDateTimeParser9stateNameEi @ 2601 NONAME
+ _ZNK15QPauseAnimation10metaObjectEv @ 2602 NONAME
+ _ZNK15QPauseAnimation8durationEv @ 2603 NONAME
+ _ZNK15QSocketNotifier10metaObjectEv @ 2604 NONAME
+ _ZNK16QCoreApplication10metaObjectEv @ 2605 NONAME
+ _ZNK16QEventTransition10metaObjectEv @ 2606 NONAME
+ _ZNK16QEventTransition11eventSourceEv @ 2607 NONAME
+ _ZNK16QEventTransition9eventTypeEv @ 2608 NONAME
+ _ZNK16QSystemSemaphore11errorStringEv @ 2609 NONAME
+ _ZNK16QSystemSemaphore3keyEv @ 2610 NONAME
+ _ZNK16QSystemSemaphore5errorEv @ 2611 NONAME
+ _ZNK16QTextCodecPlugin10metaObjectEv @ 2612 NONAME
+ _ZNK16QTextCodecPlugin4keysEv @ 2613 NONAME
+ _ZNK16QXmlStreamReader10attributesEv @ 2614 NONAME
+ _ZNK16QXmlStreamReader10lineNumberEv @ 2615 NONAME
+ _ZNK16QXmlStreamReader11dtdPublicIdEv @ 2616 NONAME
+ _ZNK16QXmlStreamReader11dtdSystemIdEv @ 2617 NONAME
+ _ZNK16QXmlStreamReader11errorStringEv @ 2618 NONAME
+ _ZNK16QXmlStreamReader11tokenStringEv @ 2619 NONAME
+ _ZNK16QXmlStreamReader12columnNumberEv @ 2620 NONAME
+ _ZNK16QXmlStreamReader12isWhitespaceEv @ 2621 NONAME
+ _ZNK16QXmlStreamReader12namespaceUriEv @ 2622 NONAME
+ _ZNK16QXmlStreamReader13qualifiedNameEv @ 2623 NONAME
+ _ZNK16QXmlStreamReader14entityResolverEv @ 2624 NONAME
+ _ZNK16QXmlStreamReader15characterOffsetEv @ 2625 NONAME
+ _ZNK16QXmlStreamReader15documentVersionEv @ 2626 NONAME
+ _ZNK16QXmlStreamReader16documentEncodingEv @ 2627 NONAME
+ _ZNK16QXmlStreamReader18entityDeclarationsEv @ 2628 NONAME
+ _ZNK16QXmlStreamReader19namespaceProcessingEv @ 2629 NONAME
+ _ZNK16QXmlStreamReader20isStandaloneDocumentEv @ 2630 NONAME
+ _ZNK16QXmlStreamReader20notationDeclarationsEv @ 2631 NONAME
+ _ZNK16QXmlStreamReader21namespaceDeclarationsEv @ 2632 NONAME
+ _ZNK16QXmlStreamReader25processingInstructionDataEv @ 2633 NONAME
+ _ZNK16QXmlStreamReader27processingInstructionTargetEv @ 2634 NONAME
+ _ZNK16QXmlStreamReader4nameEv @ 2635 NONAME
+ _ZNK16QXmlStreamReader4textEv @ 2636 NONAME
+ _ZNK16QXmlStreamReader5atEndEv @ 2637 NONAME
+ _ZNK16QXmlStreamReader5errorEv @ 2638 NONAME
+ _ZNK16QXmlStreamReader6deviceEv @ 2639 NONAME
+ _ZNK16QXmlStreamReader6prefixEv @ 2640 NONAME
+ _ZNK16QXmlStreamReader7dtdNameEv @ 2641 NONAME
+ _ZNK16QXmlStreamReader7isCDATAEv @ 2642 NONAME
+ _ZNK16QXmlStreamReader9tokenTypeEv @ 2643 NONAME
+ _ZNK16QXmlStreamWriter14autoFormattingEv @ 2644 NONAME
+ _ZNK16QXmlStreamWriter20autoFormattingIndentEv @ 2645 NONAME
+ _ZNK16QXmlStreamWriter5codecEv @ 2646 NONAME
+ _ZNK16QXmlStreamWriter6deviceEv @ 2647 NONAME
+ _ZNK17QByteArrayMatcher7indexInEPKcii @ 2648 NONAME
+ _ZNK17QByteArrayMatcher7indexInERK10QByteArrayi @ 2649 NONAME
+ _ZNK17QSignalTransition10metaObjectEv @ 2650 NONAME
+ _ZNK17QSignalTransition12senderObjectEv @ 2651 NONAME
+ _ZNK17QSignalTransition6signalEv @ 2652 NONAME
+ _ZNK17QVariantAnimation10keyValueAtEf @ 2653 NONAME
+ _ZNK17QVariantAnimation10metaObjectEv @ 2654 NONAME
+ _ZNK17QVariantAnimation10startValueEv @ 2655 NONAME
+ _ZNK17QVariantAnimation11easingCurveEv @ 2656 NONAME
+ _ZNK17QVariantAnimation12currentValueEv @ 2657 NONAME
+ _ZNK17QVariantAnimation12interpolatedERK8QVariantS2_f @ 2658 NONAME
+ _ZNK17QVariantAnimation8durationEv @ 2659 NONAME
+ _ZNK17QVariantAnimation8endValueEv @ 2660 NONAME
+ _ZNK17QVariantAnimation9keyValuesEv @ 2661 NONAME
+ _ZNK18CQtActiveScheduler5ErrorEi @ 2662 NONAME
+ _ZNK18QAbstractAnimation10metaObjectEv @ 2663 NONAME
+ _ZNK18QAbstractAnimation11currentLoopEv @ 2664 NONAME
+ _ZNK18QAbstractAnimation11currentTimeEv @ 2665 NONAME
+ _ZNK18QAbstractAnimation13totalDurationEv @ 2666 NONAME
+ _ZNK18QAbstractAnimation5groupEv @ 2667 NONAME
+ _ZNK18QAbstractAnimation5stateEv @ 2668 NONAME
+ _ZNK18QAbstractAnimation9directionEv @ 2669 NONAME
+ _ZNK18QAbstractAnimation9loopCountEv @ 2670 NONAME
+ _ZNK18QAbstractItemModel10encodeDataERK5QListI11QModelIndexER11QDataStream @ 2671 NONAME
+ _ZNK18QAbstractItemModel10headerDataEiN2Qt11OrientationEi @ 2672 NONAME
+ _ZNK18QAbstractItemModel10metaObjectEv @ 2673 NONAME
+ _ZNK18QAbstractItemModel11hasChildrenERK11QModelIndex @ 2674 NONAME
+ _ZNK18QAbstractItemModel12canFetchMoreERK11QModelIndex @ 2675 NONAME
+ _ZNK18QAbstractItemModel19persistentIndexListEv @ 2676 NONAME
+ _ZNK18QAbstractItemModel20supportedDragActionsEv @ 2677 NONAME
+ _ZNK18QAbstractItemModel20supportedDropActionsEv @ 2678 NONAME
+ _ZNK18QAbstractItemModel4spanERK11QModelIndex @ 2679 NONAME
+ _ZNK18QAbstractItemModel5buddyERK11QModelIndex @ 2680 NONAME
+ _ZNK18QAbstractItemModel5flagsERK11QModelIndex @ 2681 NONAME
+ _ZNK18QAbstractItemModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 2682 NONAME
+ _ZNK18QAbstractItemModel8hasIndexEiiRK11QModelIndex @ 2683 NONAME
+ _ZNK18QAbstractItemModel8itemDataERK11QModelIndex @ 2684 NONAME
+ _ZNK18QAbstractItemModel8mimeDataERK5QListI11QModelIndexE @ 2685 NONAME
+ _ZNK18QAbstractItemModel9mimeTypesEv @ 2686 NONAME
+ _ZNK18QAbstractItemModel9roleNamesEv @ 2687 NONAME
+ _ZNK18QAbstractListModel10metaObjectEv @ 2688 NONAME
+ _ZNK18QAbstractListModel11columnCountERK11QModelIndex @ 2689 NONAME
+ _ZNK18QAbstractListModel11hasChildrenERK11QModelIndex @ 2690 NONAME
+ _ZNK18QAbstractListModel5indexEiiRK11QModelIndex @ 2691 NONAME
+ _ZNK18QAbstractListModel6parentERK11QModelIndex @ 2692 NONAME
+ _ZNK18QCryptographicHash6resultEv @ 2693 NONAME
+ _ZNK18QFileSystemWatcher10metaObjectEv @ 2694 NONAME
+ _ZNK18QFileSystemWatcher11directoriesEv @ 2695 NONAME
+ _ZNK18QFileSystemWatcher5filesEv @ 2696 NONAME
+ _ZNK18QPropertyAnimation10metaObjectEv @ 2697 NONAME
+ _ZNK18QPropertyAnimation12propertyNameEv @ 2698 NONAME
+ _ZNK18QPropertyAnimation12targetObjectEv @ 2699 NONAME
+ _ZNK18QThreadStorageData3getEv @ 2700 NONAME
+ _ZNK19QAbstractFileEngine11errorStringEv @ 2701 NONAME
+ _ZNK19QAbstractFileEngine12isSequentialEv @ 2702 NONAME
+ _ZNK19QAbstractFileEngine13caseSensitiveEv @ 2703 NONAME
+ _ZNK19QAbstractFileEngine14isRelativePathEv @ 2704 NONAME
+ _ZNK19QAbstractFileEngine17supportsExtensionENS_9ExtensionE @ 2705 NONAME
+ _ZNK19QAbstractFileEngine3posEv @ 2706 NONAME
+ _ZNK19QAbstractFileEngine4sizeEv @ 2707 NONAME
+ _ZNK19QAbstractFileEngine5atEndEv @ 2708 NONAME
+ _ZNK19QAbstractFileEngine5errorEv @ 2709 NONAME
+ _ZNK19QAbstractFileEngine5mkdirERK7QStringb @ 2710 NONAME
+ _ZNK19QAbstractFileEngine5ownerENS_9FileOwnerE @ 2711 NONAME
+ _ZNK19QAbstractFileEngine5rmdirERK7QStringb @ 2712 NONAME
+ _ZNK19QAbstractFileEngine6handleEv @ 2713 NONAME
+ _ZNK19QAbstractFileEngine7ownerIdENS_9FileOwnerE @ 2714 NONAME
+ _ZNK19QAbstractFileEngine8fileNameENS_8FileNameE @ 2715 NONAME
+ _ZNK19QAbstractFileEngine8fileTimeENS_8FileTimeE @ 2716 NONAME
+ _ZNK19QAbstractFileEngine9entryListE6QFlagsIN4QDir6FilterEERK11QStringList @ 2717 NONAME
+ _ZNK19QAbstractFileEngine9fileFlagsE6QFlagsINS_8FileFlagEE @ 2718 NONAME
+ _ZNK19QAbstractTableModel10metaObjectEv @ 2719 NONAME
+ _ZNK19QAbstractTableModel11hasChildrenERK11QModelIndex @ 2720 NONAME
+ _ZNK19QAbstractTableModel5indexEiiRK11QModelIndex @ 2721 NONAME
+ _ZNK19QAbstractTableModel6parentERK11QModelIndex @ 2722 NONAME
+ _ZNK19QAbstractTransition10animationsEv @ 2723 NONAME
+ _ZNK19QAbstractTransition10metaObjectEv @ 2724 NONAME
+ _ZNK19QAbstractTransition11sourceStateEv @ 2725 NONAME
+ _ZNK19QAbstractTransition11targetStateEv @ 2726 NONAME
+ _ZNK19QAbstractTransition12targetStatesEv @ 2727 NONAME
+ _ZNK19QAbstractTransition7machineEv @ 2728 NONAME
+ _ZNK19QProcessEnvironment12toStringListEv @ 2729 NONAME
+ _ZNK19QProcessEnvironment5valueERK7QStringS2_ @ 2730 NONAME
+ _ZNK19QProcessEnvironment7isEmptyEv @ 2731 NONAME
+ _ZNK19QProcessEnvironment8containsERK7QString @ 2732 NONAME
+ _ZNK19QProcessEnvironmenteqERKS_ @ 2733 NONAME
+ _ZNK19QTextBoundaryFinder12isAtBoundaryEv @ 2734 NONAME
+ _ZNK19QTextBoundaryFinder15boundaryReasonsEv @ 2735 NONAME
+ _ZNK19QTextBoundaryFinder6stringEv @ 2736 NONAME
+ _ZNK19QTextBoundaryFinder8positionEv @ 2737 NONAME
+ _ZNK20QStateMachinePrivate10isCompoundEPK14QAbstractState @ 2738 NONAME
+ _ZNK20QStateMachinePrivate11isPreemptedEPK14QAbstractStateRK4QSetIP19QAbstractTransitionE @ 2739 NONAME
+ _ZNK20QStateMachinePrivate13hasRestorableEP7QObjectRK10QByteArray @ 2740 NONAME
+ _ZNK20QStateMachinePrivate14isInFinalStateEP14QAbstractState @ 2741 NONAME
+ _ZNK20QStateMachinePrivate15restorableValueEP7QObjectRK10QByteArray @ 2742 NONAME
+ _ZNK20QStateMachinePrivate17selectTransitionsEP6QEvent @ 2743 NONAME
+ _ZNK20QStateMachinePrivate25restorablesToPropertyListERK5QHashI5QPairIP7QObject10QByteArrayE8QVariantE @ 2744 NONAME
+ _ZNK20QStateMachinePrivate7findLCAERK5QListIP14QAbstractStateE @ 2745 NONAME
+ _ZNK20QStateMachinePrivate8isAtomicEPK14QAbstractState @ 2746 NONAME
+ _ZNK20QStateMachinePrivate9rootStateEv @ 2747 NONAME
+ _ZNK20QXmlStreamAttributes5valueERK13QLatin1String @ 2748 NONAME
+ _ZNK20QXmlStreamAttributes5valueERK13QLatin1StringS2_ @ 2749 NONAME
+ _ZNK20QXmlStreamAttributes5valueERK7QString @ 2750 NONAME
+ _ZNK20QXmlStreamAttributes5valueERK7QStringRK13QLatin1String @ 2751 NONAME
+ _ZNK20QXmlStreamAttributes5valueERK7QStringS2_ @ 2752 NONAME
+ _ZNK21QObjectCleanupHandler10metaObjectEv @ 2753 NONAME
+ _ZNK21QObjectCleanupHandler7isEmptyEv @ 2754 NONAME
+ _ZNK21QPersistentModelIndex10internalIdEv @ 2755 NONAME
+ _ZNK21QPersistentModelIndex15internalPointerEv @ 2756 NONAME
+ _ZNK21QPersistentModelIndex3rowEv @ 2757 NONAME
+ _ZNK21QPersistentModelIndex4dataEi @ 2758 NONAME
+ _ZNK21QPersistentModelIndex5childEii @ 2759 NONAME
+ _ZNK21QPersistentModelIndex5flagsEv @ 2760 NONAME
+ _ZNK21QPersistentModelIndex5modelEv @ 2761 NONAME
+ _ZNK21QPersistentModelIndex6columnEv @ 2762 NONAME
+ _ZNK21QPersistentModelIndex6parentEv @ 2763 NONAME
+ _ZNK21QPersistentModelIndex7isValidEv @ 2764 NONAME
+ _ZNK21QPersistentModelIndex7siblingEii @ 2765 NONAME
+ _ZNK21QPersistentModelIndexcvRK11QModelIndexEv @ 2766 NONAME
+ _ZNK21QPersistentModelIndexeqERK11QModelIndex @ 2767 NONAME
+ _ZNK21QPersistentModelIndexeqERKS_ @ 2768 NONAME
+ _ZNK21QPersistentModelIndexltERKS_ @ 2769 NONAME
+ _ZNK21QPersistentModelIndexneERK11QModelIndex @ 2770 NONAME
+ _ZNK23QCoreApplicationPrivate7appNameEv @ 2771 NONAME
+ _ZNK23QEventDispatcherSymbian16registeredTimersEP7QObject @ 2772 NONAME
+ _ZNK23QParallelAnimationGroup10metaObjectEv @ 2773 NONAME
+ _ZNK23QParallelAnimationGroup8durationEv @ 2774 NONAME
+ _ZNK24QAbstractEventDispatcher10metaObjectEv @ 2775 NONAME
+ _ZNK24QNonContiguousByteDevice10metaObjectEv @ 2776 NONAME
+ _ZNK25QSequentialAnimationGroup10metaObjectEv @ 2777 NONAME
+ _ZNK25QSequentialAnimationGroup16currentAnimationEv @ 2778 NONAME
+ _ZNK25QSequentialAnimationGroup8durationEv @ 2779 NONAME
+ _ZNK26QAbstractTransitionPrivate11sourceStateEv @ 2780 NONAME
+ _ZNK26QAbstractTransitionPrivate7machineEv @ 2781 NONAME
+ _ZNK27QAbstractFileEngineIterator11nameFiltersEv @ 2782 NONAME
+ _ZNK27QAbstractFileEngineIterator15currentFileInfoEv @ 2783 NONAME
+ _ZNK27QAbstractFileEngineIterator15currentFilePathEv @ 2784 NONAME
+ _ZNK27QAbstractFileEngineIterator4pathEv @ 2785 NONAME
+ _ZNK27QAbstractFileEngineIterator7filtersEv @ 2786 NONAME
+ _ZNK27QAbstractFileEngineIterator9entryInfoENS_13EntryInfoTypeE @ 2787 NONAME
+ _ZNK4QDir10isReadableEv @ 2788 NONAME
+ _ZNK4QDir10isRelativeEv @ 2789 NONAME
+ _ZNK4QDir11nameFiltersEv @ 2790 NONAME
+ _ZNK4QDir12absolutePathEv @ 2791 NONAME
+ _ZNK4QDir13canonicalPathEv @ 2792 NONAME
+ _ZNK4QDir13entryInfoListE6QFlagsINS_6FilterEES0_INS_8SortFlagEE @ 2793 NONAME
+ _ZNK4QDir13entryInfoListERK11QStringList6QFlagsINS_6FilterEES3_INS_8SortFlagEE @ 2794 NONAME
+ _ZNK4QDir16absoluteFilePathERK7QString @ 2795 NONAME
+ _ZNK4QDir16relativeFilePathERK7QString @ 2796 NONAME
+ _ZNK4QDir4pathEv @ 2797 NONAME
+ _ZNK4QDir5countEv @ 2798 NONAME
+ _ZNK4QDir5mkdirERK7QString @ 2799 NONAME
+ _ZNK4QDir5rmdirERK7QString @ 2800 NONAME
+ _ZNK4QDir6existsERK7QString @ 2801 NONAME
+ _ZNK4QDir6existsEv @ 2802 NONAME
+ _ZNK4QDir6filterEv @ 2803 NONAME
+ _ZNK4QDir6isRootEv @ 2804 NONAME
+ _ZNK4QDir6mkpathERK7QString @ 2805 NONAME
+ _ZNK4QDir6rmpathERK7QString @ 2806 NONAME
+ _ZNK4QDir7dirNameEv @ 2807 NONAME
+ _ZNK4QDir7refreshEv @ 2808 NONAME
+ _ZNK4QDir7sortingEv @ 2809 NONAME
+ _ZNK4QDir8filePathERK7QString @ 2810 NONAME
+ _ZNK4QDir9entryListE6QFlagsINS_6FilterEES0_INS_8SortFlagEE @ 2811 NONAME
+ _ZNK4QDir9entryListERK11QStringList6QFlagsINS_6FilterEES3_INS_8SortFlagEE @ 2812 NONAME
+ _ZNK4QDireqERKS_ @ 2813 NONAME
+ _ZNK4QDirixEi @ 2814 NONAME
+ _ZNK4QUrl10isDetachedEv @ 2815 NONAME
+ _ZNK4QUrl10isParentOfERKS_ @ 2816 NONAME
+ _ZNK4QUrl10isRelativeEv @ 2817 NONAME
+ _ZNK4QUrl10queryItemsEv @ 2818 NONAME
+ _ZNK4QUrl11encodedHostEv @ 2819 NONAME
+ _ZNK4QUrl11encodedPathEv @ 2820 NONAME
+ _ZNK4QUrl11errorStringEv @ 2821 NONAME
+ _ZNK4QUrl11hasFragmentEv @ 2822 NONAME
+ _ZNK4QUrl11toLocalFileEv @ 2823 NONAME
+ _ZNK4QUrl12encodedQueryEv @ 2824 NONAME
+ _ZNK4QUrl12hasQueryItemERK7QString @ 2825 NONAME
+ _ZNK4QUrl14queryItemValueERK7QString @ 2826 NONAME
+ _ZNK4QUrl15encodedFragmentEv @ 2827 NONAME
+ _ZNK4QUrl15encodedPasswordEv @ 2828 NONAME
+ _ZNK4QUrl15encodedUserNameEv @ 2829 NONAME
+ _ZNK4QUrl17encodedQueryItemsEv @ 2830 NONAME
+ _ZNK4QUrl18allQueryItemValuesERK7QString @ 2831 NONAME
+ _ZNK4QUrl18queryPairDelimiterEv @ 2832 NONAME
+ _ZNK4QUrl19hasEncodedQueryItemERK10QByteArray @ 2833 NONAME
+ _ZNK4QUrl19queryValueDelimiterEv @ 2834 NONAME
+ _ZNK4QUrl21encodedQueryItemValueERK10QByteArray @ 2835 NONAME
+ _ZNK4QUrl25allEncodedQueryItemValuesERK10QByteArray @ 2836 NONAME
+ _ZNK4QUrl4hostEv @ 2837 NONAME
+ _ZNK4QUrl4pathEv @ 2838 NONAME
+ _ZNK4QUrl4portEi @ 2839 NONAME
+ _ZNK4QUrl4portEv @ 2840 NONAME
+ _ZNK4QUrl6schemeEv @ 2841 NONAME
+ _ZNK4QUrl7isEmptyEv @ 2842 NONAME
+ _ZNK4QUrl7isValidEv @ 2843 NONAME
+ _ZNK4QUrl8fragmentEv @ 2844 NONAME
+ _ZNK4QUrl8hasQueryEv @ 2845 NONAME
+ _ZNK4QUrl8passwordEv @ 2846 NONAME
+ _ZNK4QUrl8resolvedERKS_ @ 2847 NONAME
+ _ZNK4QUrl8toStringE6QFlagsINS_16FormattingOptionEE @ 2848 NONAME
+ _ZNK4QUrl8userInfoEv @ 2849 NONAME
+ _ZNK4QUrl8userNameEv @ 2850 NONAME
+ _ZNK4QUrl9authorityEv @ 2851 NONAME
+ _ZNK4QUrl9toEncodedE6QFlagsINS_16FormattingOptionEE @ 2852 NONAME
+ _ZNK4QUrleqERKS_ @ 2853 NONAME
+ _ZNK4QUrlltERKS_ @ 2854 NONAME
+ _ZNK4QUrlneERKS_ @ 2855 NONAME
+ _ZNK5QChar10digitValueEv @ 2856 NONAME
+ _ZNK5QChar11hasMirroredEv @ 2857 NONAME
+ _ZNK5QChar11toTitleCaseEv @ 2858 NONAME
+ _ZNK5QChar12mirroredCharEv @ 2859 NONAME
+ _ZNK5QChar12toCaseFoldedEv @ 2860 NONAME
+ _ZNK5QChar13decompositionEv @ 2861 NONAME
+ _ZNK5QChar14combiningClassEv @ 2862 NONAME
+ _ZNK5QChar14unicodeVersionEv @ 2863 NONAME
+ _ZNK5QChar16decompositionTagEv @ 2864 NONAME
+ _ZNK5QChar16isLetterOrNumberEv @ 2865 NONAME
+ _ZNK5QChar6isMarkEv @ 2866 NONAME
+ _ZNK5QChar7isDigitEv @ 2867 NONAME
+ _ZNK5QChar7isPrintEv @ 2868 NONAME
+ _ZNK5QChar7isPunctEv @ 2869 NONAME
+ _ZNK5QChar7isSpaceEv @ 2870 NONAME
+ _ZNK5QChar7joiningEv @ 2871 NONAME
+ _ZNK5QChar7toAsciiEv @ 2872 NONAME
+ _ZNK5QChar7toLowerEv @ 2873 NONAME
+ _ZNK5QChar7toUpperEv @ 2874 NONAME
+ _ZNK5QChar8categoryEv @ 2875 NONAME
+ _ZNK5QChar8isLetterEv @ 2876 NONAME
+ _ZNK5QChar8isNumberEv @ 2877 NONAME
+ _ZNK5QChar8isSymbolEv @ 2878 NONAME
+ _ZNK5QChar9directionEv @ 2879 NONAME
+ _ZNK5QDate10daysInYearEv @ 2880 NONAME
+ _ZNK5QDate10weekNumberEPi @ 2881 NONAME
+ _ZNK5QDate11daysInMonthEv @ 2882 NONAME
+ _ZNK5QDate3dayEv @ 2883 NONAME
+ _ZNK5QDate4yearEv @ 2884 NONAME
+ _ZNK5QDate5monthEv @ 2885 NONAME
+ _ZNK5QDate6daysToERKS_ @ 2886 NONAME
+ _ZNK5QDate7addDaysEi @ 2887 NONAME
+ _ZNK5QDate7isValidEv @ 2888 NONAME
+ _ZNK5QDate8addYearsEi @ 2889 NONAME
+ _ZNK5QDate8toStringEN2Qt10DateFormatE @ 2890 NONAME
+ _ZNK5QDate8toStringERK7QString @ 2891 NONAME
+ _ZNK5QDate9addMonthsEi @ 2892 NONAME
+ _ZNK5QDate9dayOfWeekEv @ 2893 NONAME
+ _ZNK5QDate9dayOfYearEv @ 2894 NONAME
+ _ZNK5QFile10fileEngineEv @ 2895 NONAME
+ _ZNK5QFile10metaObjectEv @ 2896 NONAME
+ _ZNK5QFile11permissionsEv @ 2897 NONAME
+ _ZNK5QFile12isSequentialEv @ 2898 NONAME
+ _ZNK5QFile3posEv @ 2899 NONAME
+ _ZNK5QFile4sizeEv @ 2900 NONAME
+ _ZNK5QFile5atEndEv @ 2901 NONAME
+ _ZNK5QFile5errorEv @ 2902 NONAME
+ _ZNK5QFile6existsEv @ 2903 NONAME
+ _ZNK5QFile6handleEv @ 2904 NONAME
+ _ZNK5QFile8fileNameEv @ 2905 NONAME
+ _ZNK5QFile8readLinkEv @ 2906 NONAME
+ _ZNK5QRect10intersectsERKS_ @ 2907 NONAME
+ _ZNK5QRect10normalizedEv @ 2908 NONAME
+ _ZNK5QRect8containsERK6QPointb @ 2909 NONAME
+ _ZNK5QRect8containsERKS_b @ 2910 NONAME
+ _ZNK5QRectanERKS_ @ 2911 NONAME
+ _ZNK5QRectorERKS_ @ 2912 NONAME
+ _ZNK5QTime4hourEv @ 2913 NONAME
+ _ZNK5QTime4msecEv @ 2914 NONAME
+ _ZNK5QTime6minuteEv @ 2915 NONAME
+ _ZNK5QTime6secondEv @ 2916 NONAME
+ _ZNK5QTime6secsToERKS_ @ 2917 NONAME
+ _ZNK5QTime7addSecsEi @ 2918 NONAME
+ _ZNK5QTime7elapsedEv @ 2919 NONAME
+ _ZNK5QTime7isValidEv @ 2920 NONAME
+ _ZNK5QTime7msecsToERKS_ @ 2921 NONAME
+ _ZNK5QTime8addMSecsEi @ 2922 NONAME
+ _ZNK5QTime8toStringEN2Qt10DateFormatE @ 2923 NONAME
+ _ZNK5QTime8toStringERK7QString @ 2924 NONAME
+ _ZNK5QUuid6isNullEv @ 2925 NONAME
+ _ZNK5QUuid7variantEv @ 2926 NONAME
+ _ZNK5QUuid7versionEv @ 2927 NONAME
+ _ZNK5QUuid8toStringEv @ 2928 NONAME
+ _ZNK5QUuidgtERKS_ @ 2929 NONAME
+ _ZNK5QUuidltERKS_ @ 2930 NONAME
+ _ZNK6QLineF10unitVectorEv @ 2931 NONAME
+ _ZNK6QLineF5angleERKS_ @ 2932 NONAME
+ _ZNK6QLineF5angleEv @ 2933 NONAME
+ _ZNK6QLineF6isNullEv @ 2934 NONAME
+ _ZNK6QLineF6lengthEv @ 2935 NONAME
+ _ZNK6QLineF7angleToERKS_ @ 2936 NONAME
+ _ZNK6QLineF9intersectERKS_P7QPointF @ 2937 NONAME
+ _ZNK6QPoint15manhattanLengthEv @ 2938 NONAME
+ _ZNK6QRectF10intersectsERKS_ @ 2939 NONAME
+ _ZNK6QRectF10normalizedEv @ 2940 NONAME
+ _ZNK6QRectF13toAlignedRectEv @ 2941 NONAME
+ _ZNK6QRectF8containsERK7QPointF @ 2942 NONAME
+ _ZNK6QRectF8containsERKS_ @ 2943 NONAME
+ _ZNK6QRectFanERKS_ @ 2944 NONAME
+ _ZNK6QRectForERKS_ @ 2945 NONAME
+ _ZNK6QState10errorStateEv @ 2946 NONAME
+ _ZNK6QState10metaObjectEv @ 2947 NONAME
+ _ZNK6QState12initialStateEv @ 2948 NONAME
+ _ZNK6QState9childModeEv @ 2949 NONAME
+ _ZNK6QTimer10metaObjectEv @ 2950 NONAME
+ _ZNK7QBuffer10metaObjectEv @ 2951 NONAME
+ _ZNK7QBuffer11canReadLineEv @ 2952 NONAME
+ _ZNK7QBuffer3posEv @ 2953 NONAME
+ _ZNK7QBuffer4dataEv @ 2954 NONAME
+ _ZNK7QBuffer4sizeEv @ 2955 NONAME
+ _ZNK7QBuffer5atEndEv @ 2956 NONAME
+ _ZNK7QBuffer6bufferEv @ 2957 NONAME
+ _ZNK7QLocale10dateFormatENS_10FormatTypeE @ 2958 NONAME
+ _ZNK7QLocale10timeFormatENS_10FormatTypeE @ 2959 NONAME
+ _ZNK7QLocale10toDateTimeERK7QStringNS_10FormatTypeE @ 2960 NONAME
+ _ZNK7QLocale10toDateTimeERK7QStringS2_ @ 2961 NONAME
+ _ZNK7QLocale10toLongLongERK7QStringPbi @ 2962 NONAME
+ _ZNK7QLocale11exponentialEv @ 2963 NONAME
+ _ZNK7QLocale11toULongLongERK7QStringPbi @ 2964 NONAME
+ _ZNK7QLocale12decimalPointEv @ 2965 NONAME
+ _ZNK7QLocale12negativeSignEv @ 2966 NONAME
+ _ZNK7QLocale12positiveSignEv @ 2967 NONAME
+ _ZNK7QLocale13numberOptionsEv @ 2968 NONAME
+ _ZNK7QLocale14dateTimeFormatENS_10FormatTypeE @ 2969 NONAME
+ _ZNK7QLocale14groupSeparatorEv @ 2970 NONAME
+ _ZNK7QLocale17measurementSystemEv @ 2971 NONAME
+ _ZNK7QLocale17standaloneDayNameEiNS_10FormatTypeE @ 2972 NONAME
+ _ZNK7QLocale19standaloneMonthNameEiNS_10FormatTypeE @ 2973 NONAME
+ _ZNK7QLocale1dEv @ 2974 NONAME
+ _ZNK7QLocale4nameEv @ 2975 NONAME
+ _ZNK7QLocale5toIntERK7QStringPbi @ 2976 NONAME
+ _ZNK7QLocale6amTextEv @ 2977 NONAME
+ _ZNK7QLocale6pmTextEv @ 2978 NONAME
+ _ZNK7QLocale6toDateERK7QStringNS_10FormatTypeE @ 2979 NONAME
+ _ZNK7QLocale6toDateERK7QStringS2_ @ 2980 NONAME
+ _ZNK7QLocale6toTimeERK7QStringNS_10FormatTypeE @ 2981 NONAME
+ _ZNK7QLocale6toTimeERK7QStringS2_ @ 2982 NONAME
+ _ZNK7QLocale6toUIntERK7QStringPbi @ 2983 NONAME
+ _ZNK7QLocale7countryEv @ 2984 NONAME
+ _ZNK7QLocale7dayNameEiNS_10FormatTypeE @ 2985 NONAME
+ _ZNK7QLocale7percentEv @ 2986 NONAME
+ _ZNK7QLocale7toFloatERK7QStringPb @ 2987 NONAME
+ _ZNK7QLocale7toShortERK7QStringPbi @ 2988 NONAME
+ _ZNK7QLocale8languageEv @ 2989 NONAME
+ _ZNK7QLocale8toDoubleERK7QStringPb @ 2990 NONAME
+ _ZNK7QLocale8toStringERK5QDateNS_10FormatTypeE @ 2991 NONAME
+ _ZNK7QLocale8toStringERK5QDateRK7QString @ 2992 NONAME
+ _ZNK7QLocale8toStringERK5QTimeNS_10FormatTypeE @ 2993 NONAME
+ _ZNK7QLocale8toStringERK5QTimeRK7QString @ 2994 NONAME
+ _ZNK7QLocale8toStringERK9QDateTimeNS_10FormatTypeE @ 2995 NONAME
+ _ZNK7QLocale8toStringERK9QDateTimeRK7QString @ 2996 NONAME
+ _ZNK7QLocale8toStringEdci @ 2997 NONAME
+ _ZNK7QLocale8toStringEx @ 2998 NONAME
+ _ZNK7QLocale8toStringEy @ 2999 NONAME
+ _ZNK7QLocale8toUShortERK7QStringPbi @ 3000 NONAME
+ _ZNK7QLocale9monthNameEiNS_10FormatTypeE @ 3001 NONAME
+ _ZNK7QLocale9zeroDigitEv @ 3002 NONAME
+ _ZNK7QObject10metaObjectEv @ 3003 NONAME
+ _ZNK7QObject10objectNameEv @ 3004 NONAME
+ _ZNK7QObject20dynamicPropertyNamesEv @ 3005 NONAME
+ _ZNK7QObject6senderEv @ 3006 NONAME
+ _ZNK7QObject6threadEv @ 3007 NONAME
+ _ZNK7QObject8propertyEPKc @ 3008 NONAME
+ _ZNK7QObject8userDataEj @ 3009 NONAME
+ _ZNK7QObject9receiversEPKc @ 3010 NONAME
+ _ZNK7QPointF15manhattanLengthEv @ 3011 NONAME
+ _ZNK7QRegExp10exactMatchERK7QString @ 3012 NONAME
+ _ZNK7QRegExp11errorStringEv @ 3013 NONAME
+ _ZNK7QRegExp11lastIndexInERK7QStringiNS_9CaretModeE @ 3014 NONAME
+ _ZNK7QRegExp11numCapturesEv @ 3015 NONAME
+ _ZNK7QRegExp13capturedTextsEv @ 3016 NONAME
+ _ZNK7QRegExp13matchedLengthEv @ 3017 NONAME
+ _ZNK7QRegExp13patternSyntaxEv @ 3018 NONAME
+ _ZNK7QRegExp15caseSensitivityEv @ 3019 NONAME
+ _ZNK7QRegExp3capEi @ 3020 NONAME
+ _ZNK7QRegExp3posEi @ 3021 NONAME
+ _ZNK7QRegExp7indexInERK7QStringiNS_9CaretModeE @ 3022 NONAME
+ _ZNK7QRegExp7isEmptyEv @ 3023 NONAME
+ _ZNK7QRegExp7isValidEv @ 3024 NONAME
+ _ZNK7QRegExp7patternEv @ 3025 NONAME
+ _ZNK7QRegExp9isMinimalEv @ 3026 NONAME
+ _ZNK7QRegExpeqERKS_ @ 3027 NONAME
+ _ZNK7QString10normalizedENS_17NormalizationFormE @ 3028 NONAME
+ _ZNK7QString10normalizedENS_17NormalizationFormEN5QChar14UnicodeVersionE @ 3029 NONAME
+ _ZNK7QString10simplifiedEv @ 3030 NONAME
+ _ZNK7QString10startsWithERK13QLatin1StringN2Qt15CaseSensitivityE @ 3031 NONAME
+ _ZNK7QString10startsWithERK5QCharN2Qt15CaseSensitivityE @ 3032 NONAME
+ _ZNK7QString10startsWithERKS_N2Qt15CaseSensitivityE @ 3033 NONAME
+ _ZNK7QString10toLongLongEPbi @ 3034 NONAME
+ _ZNK7QString11lastIndexOfE5QChariN2Qt15CaseSensitivityE @ 3035 NONAME
+ _ZNK7QString11lastIndexOfER7QRegExpi @ 3036 NONAME
+ _ZNK7QString11lastIndexOfERK13QLatin1StringiN2Qt15CaseSensitivityE @ 3037 NONAME
+ _ZNK7QString11lastIndexOfERK7QRegExpi @ 3038 NONAME
+ _ZNK7QString11lastIndexOfERKS_iN2Qt15CaseSensitivityE @ 3039 NONAME
+ _ZNK7QString11toLocal8BitEv @ 3040 NONAME
+ _ZNK7QString11toULongLongEPbi @ 3041 NONAME
+ _ZNK7QString12toCaseFoldedEv @ 3042 NONAME
+ _ZNK7QString12toWCharArrayEPw @ 3043 NONAME
+ _ZNK7QString13leftJustifiedEi5QCharb @ 3044 NONAME
+ _ZNK7QString14rightJustifiedEi5QCharb @ 3045 NONAME
+ _ZNK7QString16updatePropertiesEv @ 3046 NONAME
+ _ZNK7QString18localeAwareCompareERKS_ @ 3047 NONAME
+ _ZNK7QString3argE5QChariRKS0_ @ 3048 NONAME
+ _ZNK7QString3argERKS_iRK5QChar @ 3049 NONAME
+ _ZNK7QString3argEciRK5QChar @ 3050 NONAME
+ _ZNK7QString3argEdiciRK5QChar @ 3051 NONAME
+ _ZNK7QString3argExiiRK5QChar @ 3052 NONAME
+ _ZNK7QString3argEyiiRK5QChar @ 3053 NONAME
+ _ZNK7QString3midEii @ 3054 NONAME
+ _ZNK7QString4leftEi @ 3055 NONAME
+ _ZNK7QString5countE5QCharN2Qt15CaseSensitivityE @ 3056 NONAME
+ _ZNK7QString5countERK7QRegExp @ 3057 NONAME
+ _ZNK7QString5countERKS_N2Qt15CaseSensitivityE @ 3058 NONAME
+ _ZNK7QString5rightEi @ 3059 NONAME
+ _ZNK7QString5splitERK5QCharNS_13SplitBehaviorEN2Qt15CaseSensitivityE @ 3060 NONAME
+ _ZNK7QString5splitERK7QRegExpNS_13SplitBehaviorE @ 3061 NONAME
+ _ZNK7QString5splitERKS_NS_13SplitBehaviorEN2Qt15CaseSensitivityE @ 3062 NONAME
+ _ZNK7QString5toIntEPbi @ 3063 NONAME
+ _ZNK7QString5utf16Ev @ 3064 NONAME
+ _ZNK7QString6midRefEii @ 3065 NONAME
+ _ZNK7QString6toLongEPbi @ 3066 NONAME
+ _ZNK7QString6toUIntEPbi @ 3067 NONAME
+ _ZNK7QString6toUcs4Ev @ 3068 NONAME
+ _ZNK7QString6toUtf8Ev @ 3069 NONAME
+ _ZNK7QString7compareERK13QLatin1StringN2Qt15CaseSensitivityE @ 3070 NONAME
+ _ZNK7QString7compareERKS_ @ 3071 NONAME
+ _ZNK7QString7compareERKS_N2Qt15CaseSensitivityE @ 3072 NONAME
+ _ZNK7QString7indexOfE5QChariN2Qt15CaseSensitivityE @ 3073 NONAME
+ _ZNK7QString7indexOfER7QRegExpi @ 3074 NONAME
+ _ZNK7QString7indexOfERK13QLatin1StringiN2Qt15CaseSensitivityE @ 3075 NONAME
+ _ZNK7QString7indexOfERK7QRegExpi @ 3076 NONAME
+ _ZNK7QString7indexOfERKS_iN2Qt15CaseSensitivityE @ 3077 NONAME
+ _ZNK7QString7leftRefEi @ 3078 NONAME
+ _ZNK7QString7sectionERK7QRegExpii6QFlagsINS_11SectionFlagEE @ 3079 NONAME
+ _ZNK7QString7sectionERKS_ii6QFlagsINS_11SectionFlagEE @ 3080 NONAME
+ _ZNK7QString7toAsciiEv @ 3081 NONAME
+ _ZNK7QString7toFloatEPb @ 3082 NONAME
+ _ZNK7QString7toLowerEv @ 3083 NONAME
+ _ZNK7QString7toShortEPbi @ 3084 NONAME
+ _ZNK7QString7toULongEPbi @ 3085 NONAME
+ _ZNK7QString7toUpperEv @ 3086 NONAME
+ _ZNK7QString7trimmedEv @ 3087 NONAME
+ _ZNK7QString8endsWithERK13QLatin1StringN2Qt15CaseSensitivityE @ 3088 NONAME
+ _ZNK7QString8endsWithERK5QCharN2Qt15CaseSensitivityE @ 3089 NONAME
+ _ZNK7QString8endsWithERKS_N2Qt15CaseSensitivityE @ 3090 NONAME
+ _ZNK7QString8multiArgEiPPKS_ @ 3091 NONAME
+ _ZNK7QString8repeatedEi @ 3092 NONAME
+ _ZNK7QString8rightRefEi @ 3093 NONAME
+ _ZNK7QString8toDoubleEPb @ 3094 NONAME
+ _ZNK7QString8toLatin1Ev @ 3095 NONAME
+ _ZNK7QString8toUShortEPbi @ 3096 NONAME
+ _ZNK7QStringeqERK13QLatin1String @ 3097 NONAME
+ _ZNK7QStringeqERKS_ @ 3098 NONAME
+ _ZNK7QStringgtERK13QLatin1String @ 3099 NONAME
+ _ZNK7QStringltERK13QLatin1String @ 3100 NONAME
+ _ZNK7QStringltERKS_ @ 3101 NONAME
+ _ZNK7QThread10isFinishedEv @ 3102 NONAME
+ _ZNK7QThread10metaObjectEv @ 3103 NONAME
+ _ZNK7QThread8priorityEv @ 3104 NONAME
+ _ZNK7QThread9isRunningEv @ 3105 NONAME
+ _ZNK7QThread9stackSizeEv @ 3106 NONAME
+ _ZNK8QLibrary10metaObjectEv @ 3107 NONAME
+ _ZNK8QLibrary11errorStringEv @ 3108 NONAME
+ _ZNK8QLibrary8fileNameEv @ 3109 NONAME
+ _ZNK8QLibrary8isLoadedEv @ 3110 NONAME
+ _ZNK8QLibrary9loadHintsEv @ 3111 NONAME
+ _ZNK8QProcess10exitStatusEv @ 3112 NONAME
+ _ZNK8QProcess10metaObjectEv @ 3113 NONAME
+ _ZNK8QProcess11canReadLineEv @ 3114 NONAME
+ _ZNK8QProcess11environmentEv @ 3115 NONAME
+ _ZNK8QProcess11readChannelEv @ 3116 NONAME
+ _ZNK8QProcess12bytesToWriteEv @ 3117 NONAME
+ _ZNK8QProcess12isSequentialEv @ 3118 NONAME
+ _ZNK8QProcess14bytesAvailableEv @ 3119 NONAME
+ _ZNK8QProcess15readChannelModeEv @ 3120 NONAME
+ _ZNK8QProcess16workingDirectoryEv @ 3121 NONAME
+ _ZNK8QProcess18processChannelModeEv @ 3122 NONAME
+ _ZNK8QProcess18processEnvironmentEv @ 3123 NONAME
+ _ZNK8QProcess3pidEv @ 3124 NONAME
+ _ZNK8QProcess5atEndEv @ 3125 NONAME
+ _ZNK8QProcess5errorEv @ 3126 NONAME
+ _ZNK8QProcess5stateEv @ 3127 NONAME
+ _ZNK8QProcess8exitCodeEv @ 3128 NONAME
+ _ZNK8QVariant10canConvertENS_4TypeE @ 3129 NONAME
+ _ZNK8QVariant10toBitArrayEv @ 3130 NONAME
+ _ZNK8QVariant10toDateTimeEv @ 3131 NONAME
+ _ZNK8QVariant10toLongLongEPb @ 3132 NONAME
+ _ZNK8QVariant11toByteArrayEv @ 3133 NONAME
+ _ZNK8QVariant11toULongLongEPb @ 3134 NONAME
+ _ZNK8QVariant12toStringListEv @ 3135 NONAME
+ _ZNK8QVariant3cmpERKS_ @ 3136 NONAME
+ _ZNK8QVariant4saveER11QDataStream @ 3137 NONAME
+ _ZNK8QVariant4typeEv @ 3138 NONAME
+ _ZNK8QVariant5toIntEPb @ 3139 NONAME
+ _ZNK8QVariant5toMapEv @ 3140 NONAME
+ _ZNK8QVariant5toUrlEv @ 3141 NONAME
+ _ZNK8QVariant6isNullEv @ 3142 NONAME
+ _ZNK8QVariant6toBoolEv @ 3143 NONAME
+ _ZNK8QVariant6toCharEv @ 3144 NONAME
+ _ZNK8QVariant6toDateEv @ 3145 NONAME
+ _ZNK8QVariant6toHashEv @ 3146 NONAME
+ _ZNK8QVariant6toLineEv @ 3147 NONAME
+ _ZNK8QVariant6toListEv @ 3148 NONAME
+ _ZNK8QVariant6toRealEPb @ 3149 NONAME
+ _ZNK8QVariant6toRectEv @ 3150 NONAME
+ _ZNK8QVariant6toSizeEv @ 3151 NONAME
+ _ZNK8QVariant6toTimeEv @ 3152 NONAME
+ _ZNK8QVariant6toUIntEPb @ 3153 NONAME
+ _ZNK8QVariant7toFloatEPb @ 3154 NONAME
+ _ZNK8QVariant7toLineFEv @ 3155 NONAME
+ _ZNK8QVariant7toPointEv @ 3156 NONAME
+ _ZNK8QVariant7toRectFEv @ 3157 NONAME
+ _ZNK8QVariant7toSizeFEv @ 3158 NONAME
+ _ZNK8QVariant8toDoubleEPb @ 3159 NONAME
+ _ZNK8QVariant8toLocaleEv @ 3160 NONAME
+ _ZNK8QVariant8toPointFEv @ 3161 NONAME
+ _ZNK8QVariant8toRegExpEv @ 3162 NONAME
+ _ZNK8QVariant8toStringEv @ 3163 NONAME
+ _ZNK8QVariant8typeNameEv @ 3164 NONAME
+ _ZNK8QVariant8userTypeEv @ 3165 NONAME
+ _ZNK8QVariant9constDataEv @ 3166 NONAME
+ _ZNK9QBitArray5countEb @ 3167 NONAME
+ _ZNK9QBitArraycoEv @ 3168 NONAME
+ _ZNK9QDateTime10toTimeSpecEN2Qt8TimeSpecE @ 3169 NONAME
+ _ZNK9QDateTime4dateEv @ 3170 NONAME
+ _ZNK9QDateTime4timeEv @ 3171 NONAME
+ _ZNK9QDateTime6daysToERKS_ @ 3172 NONAME
+ _ZNK9QDateTime6isNullEv @ 3173 NONAME
+ _ZNK9QDateTime6secsToERKS_ @ 3174 NONAME
+ _ZNK9QDateTime7addDaysEi @ 3175 NONAME
+ _ZNK9QDateTime7addSecsEi @ 3176 NONAME
+ _ZNK9QDateTime7isValidEv @ 3177 NONAME
+ _ZNK9QDateTime8addMSecsEx @ 3178 NONAME
+ _ZNK9QDateTime8addYearsEi @ 3179 NONAME
+ _ZNK9QDateTime8timeSpecEv @ 3180 NONAME
+ _ZNK9QDateTime8toStringEN2Qt10DateFormatE @ 3181 NONAME
+ _ZNK9QDateTime8toStringERK7QString @ 3182 NONAME
+ _ZNK9QDateTime8toTime_tEv @ 3183 NONAME
+ _ZNK9QDateTime9addMonthsEi @ 3184 NONAME
+ _ZNK9QDateTime9utcOffsetEv @ 3185 NONAME
+ _ZNK9QDateTimeeqERKS_ @ 3186 NONAME
+ _ZNK9QDateTimeltERKS_ @ 3187 NONAME
+ _ZNK9QFileInfo10bundleNameEv @ 3188 NONAME
+ _ZNK9QFileInfo10isReadableEv @ 3189 NONAME
+ _ZNK9QFileInfo10isRelativeEv @ 3190 NONAME
+ _ZNK9QFileInfo10isWritableEv @ 3191 NONAME
+ _ZNK9QFileInfo10permissionE6QFlagsIN5QFile10PermissionEE @ 3192 NONAME
+ _ZNK9QFileInfo11absoluteDirEv @ 3193 NONAME
+ _ZNK9QFileInfo11permissionsEv @ 3194 NONAME
+ _ZNK9QFileInfo12absolutePathEv @ 3195 NONAME
+ _ZNK9QFileInfo12isExecutableEv @ 3196 NONAME
+ _ZNK9QFileInfo12lastModifiedEv @ 3197 NONAME
+ _ZNK9QFileInfo13canonicalPathEv @ 3198 NONAME
+ _ZNK9QFileInfo14completeSuffixEv @ 3199 NONAME
+ _ZNK9QFileInfo16absoluteFilePathEv @ 3200 NONAME
+ _ZNK9QFileInfo16completeBaseNameEv @ 3201 NONAME
+ _ZNK9QFileInfo17canonicalFilePathEv @ 3202 NONAME
+ _ZNK9QFileInfo3dirEv @ 3203 NONAME
+ _ZNK9QFileInfo4pathEv @ 3204 NONAME
+ _ZNK9QFileInfo4sizeEv @ 3205 NONAME
+ _ZNK9QFileInfo5groupEv @ 3206 NONAME
+ _ZNK9QFileInfo5isDirEv @ 3207 NONAME
+ _ZNK9QFileInfo5ownerEv @ 3208 NONAME
+ _ZNK9QFileInfo6existsEv @ 3209 NONAME
+ _ZNK9QFileInfo6isFileEv @ 3210 NONAME
+ _ZNK9QFileInfo6isRootEv @ 3211 NONAME
+ _ZNK9QFileInfo6suffixEv @ 3212 NONAME
+ _ZNK9QFileInfo7cachingEv @ 3213 NONAME
+ _ZNK9QFileInfo7createdEv @ 3214 NONAME
+ _ZNK9QFileInfo7groupIdEv @ 3215 NONAME
+ _ZNK9QFileInfo7ownerIdEv @ 3216 NONAME
+ _ZNK9QFileInfo8baseNameEv @ 3217 NONAME
+ _ZNK9QFileInfo8fileNameEv @ 3218 NONAME
+ _ZNK9QFileInfo8filePathEv @ 3219 NONAME
+ _ZNK9QFileInfo8isBundleEv @ 3220 NONAME
+ _ZNK9QFileInfo8isHiddenEv @ 3221 NONAME
+ _ZNK9QFileInfo8lastReadEv @ 3222 NONAME
+ _ZNK9QFileInfo8readLinkEv @ 3223 NONAME
+ _ZNK9QFileInfo9isSymLinkEv @ 3224 NONAME
+ _ZNK9QFileInfoeqERKS_ @ 3225 NONAME
+ _ZNK9QIODevice10isReadableEv @ 3226 NONAME
+ _ZNK9QIODevice10isWritableEv @ 3227 NONAME
+ _ZNK9QIODevice10metaObjectEv @ 3228 NONAME
+ _ZNK9QIODevice11canReadLineEv @ 3229 NONAME
+ _ZNK9QIODevice11errorStringEv @ 3230 NONAME
+ _ZNK9QIODevice12bytesToWriteEv @ 3231 NONAME
+ _ZNK9QIODevice12isSequentialEv @ 3232 NONAME
+ _ZNK9QIODevice14bytesAvailableEv @ 3233 NONAME
+ _ZNK9QIODevice17isTextModeEnabledEv @ 3234 NONAME
+ _ZNK9QIODevice3posEv @ 3235 NONAME
+ _ZNK9QIODevice4sizeEv @ 3236 NONAME
+ _ZNK9QIODevice5atEndEv @ 3237 NONAME
+ _ZNK9QIODevice6isOpenEv @ 3238 NONAME
+ _ZNK9QIODevice8openModeEv @ 3239 NONAME
+ _ZNK9QMetaEnum10keyToValueEPKc @ 3240 NONAME
+ _ZNK9QMetaEnum10valueToKeyEi @ 3241 NONAME
+ _ZNK9QMetaEnum11keysToValueEPKc @ 3242 NONAME
+ _ZNK9QMetaEnum11valueToKeysEi @ 3243 NONAME
+ _ZNK9QMetaEnum3keyEi @ 3244 NONAME
+ _ZNK9QMetaEnum4nameEv @ 3245 NONAME
+ _ZNK9QMetaEnum5scopeEv @ 3246 NONAME
+ _ZNK9QMetaEnum5valueEi @ 3247 NONAME
+ _ZNK9QMetaEnum6isFlagEv @ 3248 NONAME
+ _ZNK9QMetaEnum8keyCountEv @ 3249 NONAME
+ _ZNK9QMimeData10metaObjectEv @ 3250 NONAME
+ _ZNK9QMimeData12retrieveDataERK7QStringN8QVariant4TypeE @ 3251 NONAME
+ _ZNK9QMimeData4dataERK7QString @ 3252 NONAME
+ _ZNK9QMimeData4htmlEv @ 3253 NONAME
+ _ZNK9QMimeData4textEv @ 3254 NONAME
+ _ZNK9QMimeData4urlsEv @ 3255 NONAME
+ _ZNK9QMimeData7formatsEv @ 3256 NONAME
+ _ZNK9QMimeData7hasHtmlEv @ 3257 NONAME
+ _ZNK9QMimeData7hasTextEv @ 3258 NONAME
+ _ZNK9QMimeData7hasUrlsEv @ 3259 NONAME
+ _ZNK9QMimeData8hasColorEv @ 3260 NONAME
+ _ZNK9QMimeData8hasImageEv @ 3261 NONAME
+ _ZNK9QMimeData9colorDataEv @ 3262 NONAME
+ _ZNK9QMimeData9hasFormatERK7QString @ 3263 NONAME
+ _ZNK9QMimeData9imageDataEv @ 3264 NONAME
+ _ZNK9QResource12isCompressedEv @ 3265 NONAME
+ _ZNK9QResource16absoluteFilePathEv @ 3266 NONAME
+ _ZNK9QResource4dataEv @ 3267 NONAME
+ _ZNK9QResource4sizeEv @ 3268 NONAME
+ _ZNK9QResource5isDirEv @ 3269 NONAME
+ _ZNK9QResource6localeEv @ 3270 NONAME
+ _ZNK9QResource7isValidEv @ 3271 NONAME
+ _ZNK9QResource8childrenEv @ 3272 NONAME
+ _ZNK9QResource8fileNameEv @ 3273 NONAME
+ _ZNK9QSettings10isWritableEv @ 3274 NONAME
+ _ZNK9QSettings10metaObjectEv @ 3275 NONAME
+ _ZNK9QSettings11childGroupsEv @ 3276 NONAME
+ _ZNK9QSettings15applicationNameEv @ 3277 NONAME
+ _ZNK9QSettings16fallbacksEnabledEv @ 3278 NONAME
+ _ZNK9QSettings16organizationNameEv @ 3279 NONAME
+ _ZNK9QSettings5groupEv @ 3280 NONAME
+ _ZNK9QSettings5scopeEv @ 3281 NONAME
+ _ZNK9QSettings5valueERK7QStringRK8QVariant @ 3282 NONAME
+ _ZNK9QSettings6formatEv @ 3283 NONAME
+ _ZNK9QSettings6statusEv @ 3284 NONAME
+ _ZNK9QSettings7allKeysEv @ 3285 NONAME
+ _ZNK9QSettings8containsERK7QString @ 3286 NONAME
+ _ZNK9QSettings8fileNameEv @ 3287 NONAME
+ _ZNK9QSettings8iniCodecEv @ 3288 NONAME
+ _ZNK9QSettings9childKeysEv @ 3289 NONAME
+ _ZNK9QTimeLine10curveShapeEv @ 3290 NONAME
+ _ZNK9QTimeLine10metaObjectEv @ 3291 NONAME
+ _ZNK9QTimeLine10startFrameEv @ 3292 NONAME
+ _ZNK9QTimeLine11currentTimeEv @ 3293 NONAME
+ _ZNK9QTimeLine11easingCurveEv @ 3294 NONAME
+ _ZNK9QTimeLine12currentFrameEv @ 3295 NONAME
+ _ZNK9QTimeLine12currentValueEv @ 3296 NONAME
+ _ZNK9QTimeLine12frameForTimeEi @ 3297 NONAME
+ _ZNK9QTimeLine12valueForTimeEi @ 3298 NONAME
+ _ZNK9QTimeLine14updateIntervalEv @ 3299 NONAME
+ _ZNK9QTimeLine5stateEv @ 3300 NONAME
+ _ZNK9QTimeLine8durationEv @ 3301 NONAME
+ _ZNK9QTimeLine8endFrameEv @ 3302 NONAME
+ _ZNK9QTimeLine9directionEv @ 3303 NONAME
+ _ZNK9QTimeLine9loopCountEv @ 3304 NONAME
+ _ZTI10QEventLoop @ 3305 NONAME
+ _ZTI10QTextCodec @ 3306 NONAME
+ _ZTI11QChildEvent @ 3307 NONAME
+ _ZTI11QDataStream @ 3308 NONAME
+ _ZTI11QFinalState @ 3309 NONAME
+ _ZTI11QTextStream @ 3310 NONAME
+ _ZTI11QThreadPool @ 3311 NONAME
+ _ZTI11QTimerEvent @ 3312 NONAME
+ _ZTI11QTranslator @ 3313 NONAME
+ _ZTI12QDirIterator @ 3314 NONAME
+ _ZTI13QFSFileEngine @ 3315 NONAME
+ _ZTI13QFontLaoCodec @ 3316 NONAME
+ _ZTI13QHistoryState @ 3317 NONAME
+ _ZTI13QPluginLoader @ 3318 NONAME
+ _ZTI13QSharedMemory @ 3319 NONAME
+ _ZTI13QSignalMapper @ 3320 NONAME
+ _ZTI13QStateMachine @ 3321 NONAME
+ _ZTI13QSystemLocale @ 3322 NONAME
+ _ZTI14QAbstractState @ 3323 NONAME
+ _ZTI14QFactoryLoader @ 3324 NONAME
+ _ZTI14QMetaCallEvent @ 3325 NONAME
+ _ZTI14QObjectPrivate @ 3326 NONAME
+ _ZTI14QTemporaryFile @ 3327 NONAME
+ _ZTI15QAnimationGroup @ 3328 NONAME
+ _ZTI15QDateTimeParser @ 3329 NONAME
+ _ZTI15QObjectUserData @ 3330 NONAME
+ _ZTI15QPauseAnimation @ 3331 NONAME
+ _ZTI15QSocketNotifier @ 3332 NONAME
+ _ZTI16QCoreApplication @ 3333 NONAME
+ _ZTI16QDeclarativeData @ 3334 NONAME
+ _ZTI16QEventTransition @ 3335 NONAME
+ _ZTI16QIODevicePrivate @ 3336 NONAME
+ _ZTI16QTextCodecPlugin @ 3337 NONAME
+ _ZTI17QFactoryInterface @ 3338 NONAME
+ _ZTI17QSignalTransition @ 3339 NONAME
+ _ZTI17QVariantAnimation @ 3340 NONAME
+ _ZTI18CQtActiveScheduler @ 3341 NONAME
+ _ZTI18QAbstractAnimation @ 3342 NONAME
+ _ZTI18QAbstractItemModel @ 3343 NONAME
+ _ZTI18QAbstractListModel @ 3344 NONAME
+ _ZTI18QFileSystemWatcher @ 3345 NONAME
+ _ZTI18QPropertyAnimation @ 3346 NONAME
+ _ZTI19QAbstractFileEngine @ 3347 NONAME
+ _ZTI19QAbstractTableModel @ 3348 NONAME
+ _ZTI19QAbstractTransition @ 3349 NONAME
+ _ZTI20QStateMachinePrivate @ 3350 NONAME
+ _ZTI21QObjectCleanupHandler @ 3351 NONAME
+ _ZTI23QCoreApplicationPrivate @ 3352 NONAME
+ _ZTI23QEventDispatcherSymbian @ 3353 NONAME
+ _ZTI23QEventTransitionPrivate @ 3354 NONAME
+ _ZTI23QParallelAnimationGroup @ 3355 NONAME
+ _ZTI24QAbstractEventDispatcher @ 3356 NONAME
+ _ZTI24QNonContiguousByteDevice @ 3357 NONAME
+ _ZTI24QXmlStreamEntityResolver @ 3358 NONAME
+ _ZTI25QAbstractItemModelPrivate @ 3359 NONAME
+ _ZTI25QSequentialAnimationGroup @ 3360 NONAME
+ _ZTI26QAbstractFileEngineHandler @ 3361 NONAME
+ _ZTI26QAbstractTransitionPrivate @ 3362 NONAME
+ _ZTI26QTextCodecFactoryInterface @ 3363 NONAME
+ _ZTI27QAbstractFileEngineIterator @ 3364 NONAME
+ _ZTI27QDynamicPropertyChangeEvent @ 3365 NONAME
+ _ZTI31QAbstractEventDispatcherPrivate @ 3366 NONAME
+ _ZTI5QFile @ 3367 NONAME
+ _ZTI6QEvent @ 3368 NONAME
+ _ZTI6QState @ 3369 NONAME
+ _ZTI6QTimer @ 3370 NONAME
+ _ZTI7QBuffer @ 3371 NONAME
+ _ZTI7QObject @ 3372 NONAME
+ _ZTI7QThread @ 3373 NONAME
+ _ZTI8QLibrary @ 3374 NONAME
+ _ZTI8QProcess @ 3375 NONAME
+ _ZTI9QIODevice @ 3376 NONAME
+ _ZTI9QMimeData @ 3377 NONAME
+ _ZTI9QSettings @ 3378 NONAME
+ _ZTI9QTimeLine @ 3379 NONAME
+ _ZTV10QEventLoop @ 3380 NONAME
+ _ZTV10QTextCodec @ 3381 NONAME
+ _ZTV11QChildEvent @ 3382 NONAME
+ _ZTV11QDataStream @ 3383 NONAME
+ _ZTV11QFinalState @ 3384 NONAME
+ _ZTV11QTextStream @ 3385 NONAME
+ _ZTV11QThreadPool @ 3386 NONAME
+ _ZTV11QTimerEvent @ 3387 NONAME
+ _ZTV11QTranslator @ 3388 NONAME
+ _ZTV12QDirIterator @ 3389 NONAME
+ _ZTV13QFSFileEngine @ 3390 NONAME
+ _ZTV13QFontLaoCodec @ 3391 NONAME
+ _ZTV13QHistoryState @ 3392 NONAME
+ _ZTV13QPluginLoader @ 3393 NONAME
+ _ZTV13QSharedMemory @ 3394 NONAME
+ _ZTV13QSignalMapper @ 3395 NONAME
+ _ZTV13QStateMachine @ 3396 NONAME
+ _ZTV13QSystemLocale @ 3397 NONAME
+ _ZTV14QAbstractState @ 3398 NONAME
+ _ZTV14QFactoryLoader @ 3399 NONAME
+ _ZTV14QMetaCallEvent @ 3400 NONAME
+ _ZTV14QObjectPrivate @ 3401 NONAME
+ _ZTV14QTemporaryFile @ 3402 NONAME
+ _ZTV15QAnimationGroup @ 3403 NONAME
+ _ZTV15QDateTimeParser @ 3404 NONAME
+ _ZTV15QObjectUserData @ 3405 NONAME
+ _ZTV15QPauseAnimation @ 3406 NONAME
+ _ZTV15QSocketNotifier @ 3407 NONAME
+ _ZTV16QCoreApplication @ 3408 NONAME
+ _ZTV16QDeclarativeData @ 3409 NONAME
+ _ZTV16QEventTransition @ 3410 NONAME
+ _ZTV16QIODevicePrivate @ 3411 NONAME
+ _ZTV16QTextCodecPlugin @ 3412 NONAME
+ _ZTV17QSignalTransition @ 3413 NONAME
+ _ZTV17QVariantAnimation @ 3414 NONAME
+ _ZTV18CQtActiveScheduler @ 3415 NONAME
+ _ZTV18QAbstractAnimation @ 3416 NONAME
+ _ZTV18QAbstractItemModel @ 3417 NONAME
+ _ZTV18QAbstractListModel @ 3418 NONAME
+ _ZTV18QFileSystemWatcher @ 3419 NONAME
+ _ZTV18QPropertyAnimation @ 3420 NONAME
+ _ZTV19QAbstractFileEngine @ 3421 NONAME
+ _ZTV19QAbstractTableModel @ 3422 NONAME
+ _ZTV19QAbstractTransition @ 3423 NONAME
+ _ZTV20QStateMachinePrivate @ 3424 NONAME
+ _ZTV21QObjectCleanupHandler @ 3425 NONAME
+ _ZTV23QCoreApplicationPrivate @ 3426 NONAME
+ _ZTV23QEventDispatcherSymbian @ 3427 NONAME
+ _ZTV23QEventTransitionPrivate @ 3428 NONAME
+ _ZTV23QParallelAnimationGroup @ 3429 NONAME
+ _ZTV24QAbstractEventDispatcher @ 3430 NONAME
+ _ZTV24QNonContiguousByteDevice @ 3431 NONAME
+ _ZTV24QXmlStreamEntityResolver @ 3432 NONAME
+ _ZTV25QAbstractItemModelPrivate @ 3433 NONAME
+ _ZTV25QSequentialAnimationGroup @ 3434 NONAME
+ _ZTV26QAbstractFileEngineHandler @ 3435 NONAME
+ _ZTV26QAbstractTransitionPrivate @ 3436 NONAME
+ _ZTV27QAbstractFileEngineIterator @ 3437 NONAME
+ _ZTV27QDynamicPropertyChangeEvent @ 3438 NONAME
+ _ZTV31QAbstractEventDispatcherPrivate @ 3439 NONAME
+ _ZTV5QFile @ 3440 NONAME
+ _ZTV6QEvent @ 3441 NONAME
+ _ZTV6QState @ 3442 NONAME
+ _ZTV6QTimer @ 3443 NONAME
+ _ZTV7QBuffer @ 3444 NONAME
+ _ZTV7QObject @ 3445 NONAME
+ _ZTV7QThread @ 3446 NONAME
+ _ZTV8QLibrary @ 3447 NONAME
+ _ZTV8QProcess @ 3448 NONAME
+ _ZTV9QIODevice @ 3449 NONAME
+ _ZTV9QMimeData @ 3450 NONAME
+ _ZTV9QSettings @ 3451 NONAME
+ _ZTV9QTimeLine @ 3452 NONAME
+ _ZThn8_N16QTextCodecPlugin6createERK7QString @ 3453 NONAME
+ _ZThn8_N16QTextCodecPluginD0Ev @ 3454 NONAME
+ _ZThn8_N16QTextCodecPluginD1Ev @ 3455 NONAME
+ _ZThn8_NK16QTextCodecPlugin4keysEv @ 3456 NONAME
+ _ZanRK9QBitArrayS1_ @ 3457 NONAME
+ _ZeoRK9QBitArrayS1_ @ 3458 NONAME
+ _ZeqRK10QStringRefS1_ @ 3459 NONAME
+ _ZeqRK13QLatin1StringRK10QStringRef @ 3460 NONAME
+ _ZeqRK7QStringRK10QStringRef @ 3461 NONAME
+ _ZeqRKN15QDateTimeParser11SectionNodeES2_ @ 3462 NONAME
+ _Zls6QDebug6QFlagsIN4QDir6FilterEE @ 3463 NONAME
+ _Zls6QDebug6QFlagsIN9QIODevice12OpenModeFlagEE @ 3464 NONAME
+ _Zls6QDebugN8QVariant4TypeE @ 3465 NONAME
+ _Zls6QDebugPK7QObject @ 3466 NONAME
+ _Zls6QDebugRK11QModelIndex @ 3467 NONAME
+ _Zls6QDebugRK12QEasingCurve @ 3468 NONAME
+ _Zls6QDebugRK21QPersistentModelIndex @ 3469 NONAME
+ _Zls6QDebugRK4QDir @ 3470 NONAME
+ _Zls6QDebugRK4QUrl @ 3471 NONAME
+ _Zls6QDebugRK5QDate @ 3472 NONAME
+ _Zls6QDebugRK5QLine @ 3473 NONAME
+ _Zls6QDebugRK5QRect @ 3474 NONAME
+ _Zls6QDebugRK5QSize @ 3475 NONAME
+ _Zls6QDebugRK5QTime @ 3476 NONAME
+ _Zls6QDebugRK6QLineF @ 3477 NONAME
+ _Zls6QDebugRK6QPoint @ 3478 NONAME
+ _Zls6QDebugRK6QRectF @ 3479 NONAME
+ _Zls6QDebugRK6QSizeF @ 3480 NONAME
+ _Zls6QDebugRK7QPointF @ 3481 NONAME
+ _Zls6QDebugRK8QMargins @ 3482 NONAME
+ _Zls6QDebugRK8QVariant @ 3483 NONAME
+ _Zls6QDebugRK9QDateTime @ 3484 NONAME
+ _ZlsR11QDataStreamN8QVariant4TypeE @ 3485 NONAME
+ _ZlsR11QDataStreamRK10QByteArray @ 3486 NONAME
+ _ZlsR11QDataStreamRK4QUrl @ 3487 NONAME
+ _ZlsR11QDataStreamRK5QChar @ 3488 NONAME
+ _ZlsR11QDataStreamRK5QDate @ 3489 NONAME
+ _ZlsR11QDataStreamRK5QLine @ 3490 NONAME
+ _ZlsR11QDataStreamRK5QRect @ 3491 NONAME
+ _ZlsR11QDataStreamRK5QSize @ 3492 NONAME
+ _ZlsR11QDataStreamRK5QTime @ 3493 NONAME
+ _ZlsR11QDataStreamRK5QUuid @ 3494 NONAME
+ _ZlsR11QDataStreamRK6QLineF @ 3495 NONAME
+ _ZlsR11QDataStreamRK6QPoint @ 3496 NONAME
+ _ZlsR11QDataStreamRK6QRectF @ 3497 NONAME
+ _ZlsR11QDataStreamRK6QSizeF @ 3498 NONAME
+ _ZlsR11QDataStreamRK7QLocale @ 3499 NONAME
+ _ZlsR11QDataStreamRK7QPointF @ 3500 NONAME
+ _ZlsR11QDataStreamRK7QRegExp @ 3501 NONAME
+ _ZlsR11QDataStreamRK7QString @ 3502 NONAME
+ _ZlsR11QDataStreamRK8QVariant @ 3503 NONAME
+ _ZlsR11QDataStreamRK9QBitArray @ 3504 NONAME
+ _ZlsR11QDataStreamRK9QDateTime @ 3505 NONAME
+ _ZltRK10QStringRefS1_ @ 3506 NONAME
+ _ZorRK9QBitArrayS1_ @ 3507 NONAME
+ _ZrsR11QDataStreamR10QByteArray @ 3508 NONAME
+ _ZrsR11QDataStreamR4QUrl @ 3509 NONAME
+ _ZrsR11QDataStreamR5QChar @ 3510 NONAME
+ _ZrsR11QDataStreamR5QDate @ 3511 NONAME
+ _ZrsR11QDataStreamR5QLine @ 3512 NONAME
+ _ZrsR11QDataStreamR5QRect @ 3513 NONAME
+ _ZrsR11QDataStreamR5QSize @ 3514 NONAME
+ _ZrsR11QDataStreamR5QTime @ 3515 NONAME
+ _ZrsR11QDataStreamR5QUuid @ 3516 NONAME
+ _ZrsR11QDataStreamR6QLineF @ 3517 NONAME
+ _ZrsR11QDataStreamR6QPoint @ 3518 NONAME
+ _ZrsR11QDataStreamR6QRectF @ 3519 NONAME
+ _ZrsR11QDataStreamR6QSizeF @ 3520 NONAME
+ _ZrsR11QDataStreamR7QLocale @ 3521 NONAME
+ _ZrsR11QDataStreamR7QPointF @ 3522 NONAME
+ _ZrsR11QDataStreamR7QRegExp @ 3523 NONAME
+ _ZrsR11QDataStreamR7QString @ 3524 NONAME
+ _ZrsR11QDataStreamR8QVariant @ 3525 NONAME
+ _ZrsR11QDataStreamR9QBitArray @ 3526 NONAME
+ _ZrsR11QDataStreamR9QDateTime @ 3527 NONAME
+ _ZrsR11QDataStreamRN8QVariant4TypeE @ 3528 NONAME
+ adler32 @ 3529 NONAME
+ compress @ 3530 NONAME
+ compress2 @ 3531 NONAME
+ crc32 @ 3532 NONAME
+ deflate @ 3533 NONAME
+ deflateCopy @ 3534 NONAME
+ deflateEnd @ 3535 NONAME
+ deflateInit2_ @ 3536 NONAME
+ deflateInit_ @ 3537 NONAME
+ deflateParams @ 3538 NONAME
+ deflateReset @ 3539 NONAME
+ deflateSetDictionary @ 3540 NONAME
+ get_crc_table @ 3541 NONAME
+ gzclose @ 3542 NONAME
+ gzdopen @ 3543 NONAME
+ gzeof @ 3544 NONAME
+ gzerror @ 3545 NONAME
+ gzflush @ 3546 NONAME
+ gzgetc @ 3547 NONAME
+ gzgets @ 3548 NONAME
+ gzopen @ 3549 NONAME
+ gzprintf @ 3550 NONAME
+ gzputc @ 3551 NONAME
+ gzputs @ 3552 NONAME
+ gzread @ 3553 NONAME
+ gzrewind @ 3554 NONAME
+ gzseek @ 3555 NONAME
+ gzsetparams @ 3556 NONAME
+ gztell @ 3557 NONAME
+ gzwrite @ 3558 NONAME
+ inflate @ 3559 NONAME
+ inflateEnd @ 3560 NONAME
+ inflateInit2_ @ 3561 NONAME
+ inflateInit_ @ 3562 NONAME
+ inflateReset @ 3563 NONAME
+ inflateSetDictionary @ 3564 NONAME
+ inflateSync @ 3565 NONAME
+ inflateSyncPoint @ 3566 NONAME
+ qMetaTypeGuiHelper @ 3567 NONAME DATA 4
+ q_atomic_lock @ 3568 NONAME DATA 1
+ qt_addObject @ 3569 NONAME
+ qt_global_mutexpool @ 3570 NONAME DATA 4
+ qt_locale_initialized @ 3571 NONAME DATA 1
+ qt_removeObject @ 3572 NONAME
+ qt_signal_spy_callback_set @ 3573 NONAME DATA 16
+ qt_sine_table @ 3574 NONAME DATA 1024
+ qt_startup_hook @ 3575 NONAME
+ uncompress @ 3576 NONAME
+ zError @ 3577 NONAME
+ zlibVersion @ 3578 NONAME
diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index 09ea6ab..1f4be7a 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -1,44 +1,44 @@
EXPORTS
_Z11qFadeEffectP7QWidgeti @ 1 NONAME
_Z11qt_image_idRK6QImage @ 2 NONAME
- _Z12qt_pixmap_idRK7QPixmap @ 3 NONAME
- _Z13qDrawWinPanelP8QPainterRK5QRectRK8QPalettebPK6QBrush @ 4 NONAME
- _Z13qDrawWinPanelP8QPainteriiiiRK8QPalettebPK6QBrush @ 5 NONAME
- _Z13qScrollEffectP7QWidgetji @ 6 NONAME
- _Z13qSmartMaxSizePK11QWidgetItem6QFlagsIN2Qt13AlignmentFlagEE @ 7 NONAME
- _Z13qSmartMaxSizePK7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 8 NONAME
- _Z13qSmartMaxSizeRK5QSizeS1_S1_RK11QSizePolicy6QFlagsIN2Qt13AlignmentFlagEE @ 9 NONAME
- _Z13qSmartMinSizePK11QWidgetItem @ 10 NONAME
- _Z13qSmartMinSizePK7QWidget @ 11 NONAME
- _Z13qSmartMinSizeRK5QSizeS1_S1_S1_RK11QSizePolicy @ 12 NONAME
- _Z13qSmartSpacingPK7QLayoutN6QStyle11PixelMetricE @ 13 NONAME
- _Z13qt_defaultDpiv @ 14 NONAME
- _Z14qDrawPlainRectP8QPainterRK5QRectRK6QColoriPK6QBrush @ 15 NONAME
- _Z14qDrawPlainRectP8QPainteriiiiRK6QColoriPK6QBrush @ 16 NONAME
- _Z14qDrawShadeLineP8QPainterRK6QPointS3_RK8QPalettebii @ 17 NONAME
- _Z14qDrawShadeLineP8QPainteriiiiRK8QPalettebii @ 18 NONAME
- _Z14qDrawShadeRectP8QPainterRK5QRectRK8QPalettebiiPK6QBrush @ 19 NONAME
- _Z14qDrawShadeRectP8QPainteriiiiRK8QPalettebiiPK6QBrush @ 20 NONAME
- _Z14qDrawWinButtonP8QPainterRK5QRectRK8QPalettebPK6QBrush @ 21 NONAME
- _Z14qDrawWinButtonP8QPainteriiiiRK8QPalettebPK6QBrush @ 22 NONAME
- _Z14qt_defaultDpiXv @ 23 NONAME
- _Z14qt_defaultDpiYv @ 24 NONAME
- _Z14qt_draw_helperP15QPainterPrivateRK12QPainterPathNS_13DrawOperationE @ 25 NONAME
- _Z15qDrawShadePanelP8QPainterRK5QRectRK8QPalettebiPK6QBrush @ 26 NONAME
- _Z15qDrawShadePanelP8QPainteriiiiRK8QPalettebiPK6QBrush @ 27 NONAME
- _Z15qt_qwidget_dataP7QWidget @ 28 NONAME
- _Z15qt_regionToPathRK7QRegion @ 29 NONAME
+ _Z12qDrawPixmapsP8QPainterPKN12QDrawPixmaps4DataEiRK7QPixmap6QFlagsINS1_11DrawingHintEE @ 3 NONAME
+ _Z12qt_pixmap_idRK7QPixmap @ 4 NONAME
+ _Z13qDrawWinPanelP8QPainterRK5QRectRK8QPalettebPK6QBrush @ 5 NONAME
+ _Z13qDrawWinPanelP8QPainteriiiiRK8QPalettebPK6QBrush @ 6 NONAME
+ _Z13qScrollEffectP7QWidgetji @ 7 NONAME
+ _Z13qSmartMaxSizePK11QWidgetItem6QFlagsIN2Qt13AlignmentFlagEE @ 8 NONAME
+ _Z13qSmartMaxSizePK7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 9 NONAME
+ _Z13qSmartMaxSizeRK5QSizeS1_S1_RK11QSizePolicy6QFlagsIN2Qt13AlignmentFlagEE @ 10 NONAME
+ _Z13qSmartMinSizePK11QWidgetItem @ 11 NONAME
+ _Z13qSmartMinSizePK7QWidget @ 12 NONAME
+ _Z13qSmartMinSizeRK5QSizeS1_S1_S1_RK11QSizePolicy @ 13 NONAME
+ _Z13qSmartSpacingPK7QLayoutN6QStyle11PixelMetricE @ 14 NONAME
+ _Z13qt_defaultDpiv @ 15 NONAME
+ _Z14qDrawPlainRectP8QPainterRK5QRectRK6QColoriPK6QBrush @ 16 NONAME
+ _Z14qDrawPlainRectP8QPainteriiiiRK6QColoriPK6QBrush @ 17 NONAME
+ _Z14qDrawShadeLineP8QPainterRK6QPointS3_RK8QPalettebii @ 18 NONAME
+ _Z14qDrawShadeLineP8QPainteriiiiRK8QPalettebii @ 19 NONAME
+ _Z14qDrawShadeRectP8QPainterRK5QRectRK8QPalettebiiPK6QBrush @ 20 NONAME
+ _Z14qDrawShadeRectP8QPainteriiiiRK8QPalettebiiPK6QBrush @ 21 NONAME
+ _Z14qDrawWinButtonP8QPainterRK5QRectRK8QPalettebPK6QBrush @ 22 NONAME
+ _Z14qDrawWinButtonP8QPainteriiiiRK8QPalettebPK6QBrush @ 23 NONAME
+ _Z14qt_defaultDpiXv @ 24 NONAME
+ _Z14qt_defaultDpiYv @ 25 NONAME
+ _Z14qt_draw_helperP15QPainterPrivateRK12QPainterPathNS_13DrawOperationE @ 26 NONAME
+ _Z15qDrawShadePanelP8QPainterRK5QRectRK8QPalettebiPK6QBrush @ 27 NONAME
+ _Z15qDrawShadePanelP8QPainteriiiiRK8QPalettebiPK6QBrush @ 28 NONAME
+ _Z15qt_qwidget_dataP7QWidget @ 29 NONAME
_Z16qt_imageForBrushib @ 30 NONAME
- _Z17qt_tryModalHelperP7QWidgetPS0_ @ 31 NONAME
- _Z17qt_widget_privateP7QWidget @ 32 NONAME
- _Z19qtVectorPathForPathRK12QPainterPath @ 33 NONAME
- _Z20qt_scaleForTransformRK10QTransformPf @ 34 NONAME
- _Z21qt_qsliderStyleOptionP7QSlider @ 35 NONAME
- _Z22qt_find_ellipse_coordsRK6QRectFffP7QPointFS3_ @ 36 NONAME
- _Z23qt_symbian_show_submenuP12CEikMenuPanei @ 37 NONAME ABSENT
- _Z24qt_qscrollbarStyleOptionP10QScrollBar @ 38 NONAME
- _Z24qt_symbian_show_toplevelP12CEikMenuPane @ 39 NONAME ABSENT
- _Z25qt_keymapper_possibleKeysP9QKeyEvent @ 40 NONAME ABSENT
+ _Z17qDrawBorderPixmapP8QPainterRK5QRectRK8QMarginsRK7QPixmapS3_S6_RK10QTileRules6QFlagsIN17QDrawBorderPixmap11DrawingHintEE @ 31 NONAME
+ _Z17qHasPixmapTextureRK6QBrush @ 32 NONAME
+ _Z17qt_tryModalHelperP7QWidgetPS0_ @ 33 NONAME
+ _Z17qt_widget_privateP7QWidget @ 34 NONAME
+ _Z19qtVectorPathForPathRK12QPainterPath @ 35 NONAME
+ _Z20qt_scaleForTransformRK10QTransformPf @ 36 NONAME
+ _Z21qt_qsliderStyleOptionP7QSlider @ 37 NONAME
+ _Z22qt_find_ellipse_coordsRK6QRectFffP7QPointFS3_ @ 38 NONAME
+ _Z24qt_qscrollbarStyleOptionP10QScrollBar @ 39 NONAME
+ _Z25qt_translateRawTouchEventP7QWidgetN11QTouchEvent10DeviceTypeERK5QListINS1_10TouchPointEE @ 40 NONAME
_Z29qt_set_sequence_auto_mnemonicb @ 41 NONAME
_Z9qGeomCalcR7QVectorI13QLayoutStructEiiiii @ 42 NONAME
_ZN10QBoxLayout10addSpacingEi @ 43 NONAME
@@ -60,13080 +60,11529 @@ EXPORTS
_ZN10QBoxLayout16setStretchFactorEP7QLayouti @ 59 NONAME
_ZN10QBoxLayout16setStretchFactorEP7QWidgeti @ 60 NONAME
_ZN10QBoxLayout16staticMetaObjectE @ 61 NONAME DATA 16
- _ZN10QBoxLayout6takeAtEi @ 62 NONAME
- _ZN10QBoxLayout7addItemEP11QLayoutItem @ 63 NONAME
- _ZN10QBoxLayout8addStrutEi @ 64 NONAME
- _ZN10QBoxLayout9addLayoutEP7QLayouti @ 65 NONAME
- _ZN10QBoxLayout9addWidgetEP7QWidgeti6QFlagsIN2Qt13AlignmentFlagEE @ 66 NONAME
- _ZN10QBoxLayoutC1ENS_9DirectionEP7QWidget @ 67 NONAME
- _ZN10QBoxLayoutC2ENS_9DirectionEP7QWidget @ 68 NONAME
- _ZN10QBoxLayoutD0Ev @ 69 NONAME
- _ZN10QBoxLayoutD1Ev @ 70 NONAME
- _ZN10QBoxLayoutD2Ev @ 71 NONAME
- _ZN10QClipboard11dataChangedEv @ 72 NONAME
- _ZN10QClipboard11emitChangedENS_4ModeE @ 73 NONAME
- _ZN10QClipboard11qt_metacallEN11QMetaObject4CallEiPPv @ 74 NONAME
- _ZN10QClipboard11qt_metacastEPKc @ 75 NONAME
- _ZN10QClipboard11setMimeDataEP9QMimeDataNS_4ModeE @ 76 NONAME
- _ZN10QClipboard13connectNotifyEPKc @ 77 NONAME
- _ZN10QClipboard14ownerDestroyedEv @ 78 NONAME
- _ZN10QClipboard16selectionChangedEv @ 79 NONAME
- _ZN10QClipboard16staticMetaObjectE @ 80 NONAME DATA 16
- _ZN10QClipboard17findBufferChangedEv @ 81 NONAME
- _ZN10QClipboard5clearENS_4ModeE @ 82 NONAME
- _ZN10QClipboard5eventEP6QEvent @ 83 NONAME
- _ZN10QClipboard7changedENS_4ModeE @ 84 NONAME
- _ZN10QClipboard7setTextERK7QStringNS_4ModeE @ 85 NONAME
- _ZN10QClipboard8setImageERK6QImageNS_4ModeE @ 86 NONAME
- _ZN10QClipboard9setPixmapERK7QPixmapNS_4ModeE @ 87 NONAME
- _ZN10QClipboardC1EP7QObject @ 88 NONAME
- _ZN10QClipboardC2EP7QObject @ 89 NONAME
- _ZN10QClipboardD0Ev @ 90 NONAME
- _ZN10QClipboardD1Ev @ 91 NONAME
- _ZN10QClipboardD2Ev @ 92 NONAME
- _ZN10QCompleter11eventFilterEP7QObjectP6QEvent @ 93 NONAME
- _ZN10QCompleter11highlightedERK11QModelIndex @ 94 NONAME
- _ZN10QCompleter11highlightedERK7QString @ 95 NONAME
- _ZN10QCompleter11qt_metacallEN11QMetaObject4CallEiPPv @ 96 NONAME
- _ZN10QCompleter11qt_metacastEPKc @ 97 NONAME
- _ZN10QCompleter13setCurrentRowEi @ 98 NONAME
- _ZN10QCompleter13setWrapAroundEb @ 99 NONAME
- _ZN10QCompleter15setModelSortingENS_12ModelSortingE @ 100 NONAME
- _ZN10QCompleter16staticMetaObjectE @ 101 NONAME DATA 16
- _ZN10QCompleter17setCompletionModeENS_14CompletionModeE @ 102 NONAME
- _ZN10QCompleter17setCompletionRoleEi @ 103 NONAME
- _ZN10QCompleter18setCaseSensitivityEN2Qt15CaseSensitivityE @ 104 NONAME
- _ZN10QCompleter19setCompletionColumnEi @ 105 NONAME
- _ZN10QCompleter19setCompletionPrefixERK7QString @ 106 NONAME
- _ZN10QCompleter5eventEP6QEvent @ 107 NONAME
- _ZN10QCompleter8completeERK5QRect @ 108 NONAME
- _ZN10QCompleter8setModelEP18QAbstractItemModel @ 109 NONAME
- _ZN10QCompleter8setPopupEP17QAbstractItemView @ 110 NONAME
- _ZN10QCompleter9activatedERK11QModelIndex @ 111 NONAME
- _ZN10QCompleter9activatedERK7QString @ 112 NONAME
- _ZN10QCompleter9setWidgetEP7QWidget @ 113 NONAME
- _ZN10QCompleterC1EP18QAbstractItemModelP7QObject @ 114 NONAME
- _ZN10QCompleterC1EP7QObject @ 115 NONAME
- _ZN10QCompleterC1ERK11QStringListP7QObject @ 116 NONAME
- _ZN10QCompleterC2EP18QAbstractItemModelP7QObject @ 117 NONAME
- _ZN10QCompleterC2EP7QObject @ 118 NONAME
- _ZN10QCompleterC2ERK11QStringListP7QObject @ 119 NONAME
- _ZN10QCompleterD0Ev @ 120 NONAME
- _ZN10QCompleterD1Ev @ 121 NONAME
- _ZN10QCompleterD2Ev @ 122 NONAME
- _ZN10QDropEvent13setDropActionEN2Qt10DropActionE @ 123 NONAME
- _ZN10QDropEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 124 NONAME
- _ZN10QDropEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 125 NONAME
- _ZN10QDropEventD0Ev @ 126 NONAME
- _ZN10QDropEventD1Ev @ 127 NONAME
- _ZN10QDropEventD2Ev @ 128 NONAME
- _ZN10QHelpEventC1EN6QEvent4TypeERK6QPointS4_ @ 129 NONAME
- _ZN10QHelpEventC2EN6QEvent4TypeERK6QPointS4_ @ 130 NONAME
- _ZN10QHelpEventD0Ev @ 131 NONAME
- _ZN10QHelpEventD1Ev @ 132 NONAME
- _ZN10QHelpEventD2Ev @ 133 NONAME
- _ZN10QHideEventC1Ev @ 134 NONAME
- _ZN10QHideEventC2Ev @ 135 NONAME
- _ZN10QHideEventD0Ev @ 136 NONAME
- _ZN10QHideEventD1Ev @ 137 NONAME
- _ZN10QHideEventD2Ev @ 138 NONAME
- _ZN10QLCDNumber10paintEventEP11QPaintEvent @ 139 NONAME
- _ZN10QLCDNumber10setBinModeEv @ 140 NONAME
- _ZN10QLCDNumber10setDecModeEv @ 141 NONAME
- _ZN10QLCDNumber10setHexModeEv @ 142 NONAME
- _ZN10QLCDNumber10setOctModeEv @ 143 NONAME
- _ZN10QLCDNumber11qt_metacallEN11QMetaObject4CallEiPPv @ 144 NONAME
- _ZN10QLCDNumber11qt_metacastEPKc @ 145 NONAME
- _ZN10QLCDNumber12setNumDigitsEi @ 146 NONAME
- _ZN10QLCDNumber15setSegmentStyleENS_12SegmentStyleE @ 147 NONAME
- _ZN10QLCDNumber16staticMetaObjectE @ 148 NONAME DATA 16
- _ZN10QLCDNumber20setSmallDecimalPointEb @ 149 NONAME
- _ZN10QLCDNumber5eventEP6QEvent @ 150 NONAME
- _ZN10QLCDNumber7displayERK7QString @ 151 NONAME
- _ZN10QLCDNumber7displayEd @ 152 NONAME
- _ZN10QLCDNumber7displayEi @ 153 NONAME
- _ZN10QLCDNumber7setModeENS_4ModeE @ 154 NONAME
- _ZN10QLCDNumber8overflowEv @ 155 NONAME
- _ZN10QLCDNumberC1EP7QWidget @ 156 NONAME
- _ZN10QLCDNumberC1EjP7QWidget @ 157 NONAME
- _ZN10QLCDNumberC2EP7QWidget @ 158 NONAME
- _ZN10QLCDNumberC2EjP7QWidget @ 159 NONAME
- _ZN10QLCDNumberD0Ev @ 160 NONAME
- _ZN10QLCDNumberD1Ev @ 161 NONAME
- _ZN10QLCDNumberD2Ev @ 162 NONAME
- _ZN10QMoveEventC1ERK6QPointS2_ @ 163 NONAME
- _ZN10QMoveEventC2ERK6QPointS2_ @ 164 NONAME
- _ZN10QMoveEventD0Ev @ 165 NONAME
- _ZN10QMoveEventD1Ev @ 166 NONAME
- _ZN10QMoveEventD2Ev @ 167 NONAME
- _ZN10QPictureIO10setPictureERK8QPicture @ 168 NONAME
- _ZN10QPictureIO10setQualityEi @ 169 NONAME
- _ZN10QPictureIO11setFileNameERK7QString @ 170 NONAME
- _ZN10QPictureIO11setIODeviceEP9QIODevice @ 171 NONAME
- _ZN10QPictureIO12inputFormatsEv @ 172 NONAME
- _ZN10QPictureIO13outputFormatsEv @ 173 NONAME
- _ZN10QPictureIO13pictureFormatEP9QIODevice @ 174 NONAME
- _ZN10QPictureIO13pictureFormatERK7QString @ 175 NONAME
- _ZN10QPictureIO13setParametersEPKc @ 176 NONAME
- _ZN10QPictureIO14setDescriptionERK7QString @ 177 NONAME
- _ZN10QPictureIO15defineIOHandlerEPKcS1_S1_PFvPS_ES4_ @ 178 NONAME
- _ZN10QPictureIO4initEv @ 179 NONAME
- _ZN10QPictureIO4readEv @ 180 NONAME
- _ZN10QPictureIO5writeEv @ 181 NONAME
- _ZN10QPictureIO8setGammaEf @ 182 NONAME
- _ZN10QPictureIO9setFormatEPKc @ 183 NONAME
- _ZN10QPictureIO9setStatusEi @ 184 NONAME
- _ZN10QPictureIOC1EP9QIODevicePKc @ 185 NONAME
- _ZN10QPictureIOC1ERK7QStringPKc @ 186 NONAME
- _ZN10QPictureIOC1Ev @ 187 NONAME
- _ZN10QPictureIOC2EP9QIODevicePKc @ 188 NONAME
- _ZN10QPictureIOC2ERK7QStringPKc @ 189 NONAME
- _ZN10QPictureIOC2Ev @ 190 NONAME
- _ZN10QPictureIOD1Ev @ 191 NONAME
- _ZN10QPictureIOD2Ev @ 192 NONAME
- _ZN10QScrollBar10paintEventEP11QPaintEvent @ 193 NONAME
- _ZN10QScrollBar11qt_metacallEN11QMetaObject4CallEiPPv @ 194 NONAME
- _ZN10QScrollBar11qt_metacastEPKc @ 195 NONAME
- _ZN10QScrollBar12sliderChangeEN15QAbstractSlider12SliderChangeE @ 196 NONAME
- _ZN10QScrollBar14mouseMoveEventEP11QMouseEvent @ 197 NONAME
- _ZN10QScrollBar15mousePressEventEP11QMouseEvent @ 198 NONAME
- _ZN10QScrollBar16contextMenuEventEP17QContextMenuEvent @ 199 NONAME
- _ZN10QScrollBar16staticMetaObjectE @ 200 NONAME DATA 16
- _ZN10QScrollBar17mouseReleaseEventEP11QMouseEvent @ 201 NONAME
- _ZN10QScrollBar5eventEP6QEvent @ 202 NONAME
- _ZN10QScrollBar9hideEventEP10QHideEvent @ 203 NONAME
- _ZN10QScrollBarC1EN2Qt11OrientationEP7QWidget @ 204 NONAME
- _ZN10QScrollBarC1EP7QWidget @ 205 NONAME
- _ZN10QScrollBarC2EN2Qt11OrientationEP7QWidget @ 206 NONAME
- _ZN10QScrollBarC2EP7QWidget @ 207 NONAME
- _ZN10QScrollBarD0Ev @ 208 NONAME
- _ZN10QScrollBarD1Ev @ 209 NONAME
- _ZN10QScrollBarD2Ev @ 210 NONAME
- _ZN10QShowEventC1Ev @ 211 NONAME
- _ZN10QShowEventC2Ev @ 212 NONAME
- _ZN10QShowEventD0Ev @ 213 NONAME
- _ZN10QShowEventD1Ev @ 214 NONAME
- _ZN10QShowEventD2Ev @ 215 NONAME
- _ZN10QStatusBar10hideOrShowEv @ 216 NONAME
- _ZN10QStatusBar10paintEventEP11QPaintEvent @ 217 NONAME
- _ZN10QStatusBar11qt_metacallEN11QMetaObject4CallEiPPv @ 218 NONAME
- _ZN10QStatusBar11qt_metacastEPKc @ 219 NONAME
- _ZN10QStatusBar11resizeEventEP12QResizeEvent @ 220 NONAME
- _ZN10QStatusBar11showMessageERK7QStringi @ 221 NONAME
- _ZN10QStatusBar12clearMessageEv @ 222 NONAME
- _ZN10QStatusBar12insertWidgetEiP7QWidgeti @ 223 NONAME
- _ZN10QStatusBar12removeWidgetEP7QWidget @ 224 NONAME
- _ZN10QStatusBar14messageChangedERK7QString @ 225 NONAME
- _ZN10QStatusBar16staticMetaObjectE @ 226 NONAME DATA 16
- _ZN10QStatusBar18addPermanentWidgetEP7QWidgeti @ 227 NONAME
- _ZN10QStatusBar18setSizeGripEnabledEb @ 228 NONAME
- _ZN10QStatusBar21insertPermanentWidgetEiP7QWidgeti @ 229 NONAME
- _ZN10QStatusBar5eventEP6QEvent @ 230 NONAME
- _ZN10QStatusBar8reformatEv @ 231 NONAME
- _ZN10QStatusBar9addWidgetEP7QWidgeti @ 232 NONAME
- _ZN10QStatusBar9showEventEP10QShowEvent @ 233 NONAME
- _ZN10QStatusBarC1EP7QWidget @ 234 NONAME
- _ZN10QStatusBarC2EP7QWidget @ 235 NONAME
- _ZN10QStatusBarD0Ev @ 236 NONAME
- _ZN10QStatusBarD1Ev @ 237 NONAME
- _ZN10QStatusBarD2Ev @ 238 NONAME
- _ZN10QTabWidget10paintEventEP11QPaintEvent @ 239 NONAME
- _ZN10QTabWidget10setMovableEb @ 240 NONAME
- _ZN10QTabWidget10setTabIconEiRK5QIcon @ 241 NONAME
- _ZN10QTabWidget10setTabTextEiRK7QString @ 242 NONAME
- _ZN10QTabWidget10tabRemovedEi @ 243 NONAME
- _ZN10QTabWidget11changeEventEP6QEvent @ 244 NONAME
- _ZN10QTabWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 245 NONAME
- _ZN10QTabWidget11qt_metacastEPKc @ 246 NONAME
- _ZN10QTabWidget11resizeEventEP12QResizeEvent @ 247 NONAME
- _ZN10QTabWidget11setIconSizeERK5QSize @ 248 NONAME
- _ZN10QTabWidget11setTabShapeENS_8TabShapeE @ 249 NONAME
- _ZN10QTabWidget11setUpLayoutEb @ 250 NONAME
- _ZN10QTabWidget11tabInsertedEi @ 251 NONAME
- _ZN10QTabWidget12setElideModeEN2Qt13TextElideModeE @ 252 NONAME
- _ZN10QTabWidget13keyPressEventEP9QKeyEvent @ 253 NONAME
- _ZN10QTabWidget13setTabEnabledEib @ 254 NONAME
- _ZN10QTabWidget13setTabToolTipEiRK7QString @ 255 NONAME
- _ZN10QTabWidget14currentChangedEi @ 256 NONAME
- _ZN10QTabWidget14setTabPositionENS_11TabPositionE @ 257 NONAME
- _ZN10QTabWidget15setCornerWidgetEP7QWidgetN2Qt6CornerE @ 258 NONAME
- _ZN10QTabWidget15setCurrentIndexEi @ 259 NONAME
- _ZN10QTabWidget15setDocumentModeEb @ 260 NONAME
- _ZN10QTabWidget15setTabWhatsThisEiRK7QString @ 261 NONAME
- _ZN10QTabWidget15setTabsClosableEb @ 262 NONAME
- _ZN10QTabWidget16setCurrentWidgetEP7QWidget @ 263 NONAME
- _ZN10QTabWidget16staticMetaObjectE @ 264 NONAME DATA 16
- _ZN10QTabWidget17tabCloseRequestedEi @ 265 NONAME
- _ZN10QTabWidget20setUsesScrollButtonsEb @ 266 NONAME
- _ZN10QTabWidget5clearEv @ 267 NONAME
- _ZN10QTabWidget5eventEP6QEvent @ 268 NONAME
- _ZN10QTabWidget6addTabEP7QWidgetRK5QIconRK7QString @ 269 NONAME
- _ZN10QTabWidget6addTabEP7QWidgetRK7QString @ 270 NONAME
- _ZN10QTabWidget9insertTabEiP7QWidgetRK5QIconRK7QString @ 271 NONAME
- _ZN10QTabWidget9insertTabEiP7QWidgetRK7QString @ 272 NONAME
- _ZN10QTabWidget9removeTabEi @ 273 NONAME
- _ZN10QTabWidget9setTabBarEP7QTabBar @ 274 NONAME
- _ZN10QTabWidget9showEventEP10QShowEvent @ 275 NONAME
- _ZN10QTabWidgetC1EP7QWidget @ 276 NONAME
- _ZN10QTabWidgetC2EP7QWidget @ 277 NONAME
- _ZN10QTabWidgetD0Ev @ 278 NONAME
- _ZN10QTabWidgetD1Ev @ 279 NONAME
- _ZN10QTabWidgetD2Ev @ 280 NONAME
- _ZN10QTableView10clearSpansEv @ 281 NONAME
- _ZN10QTableView10hideColumnEi @ 282 NONAME
- _ZN10QTableView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 283 NONAME
- _ZN10QTableView10paintEventEP11QPaintEvent @ 284 NONAME
- _ZN10QTableView10rowResizedEiii @ 285 NONAME
- _ZN10QTableView10showColumnEi @ 286 NONAME
- _ZN10QTableView10timerEventEP11QTimerEvent @ 287 NONAME
- _ZN10QTableView11columnMovedEiii @ 288 NONAME
- _ZN10QTableView11qt_metacallEN11QMetaObject4CallEiPPv @ 289 NONAME
- _ZN10QTableView11qt_metacastEPKc @ 290 NONAME
- _ZN10QTableView11setShowGridEb @ 291 NONAME
- _ZN10QTableView11setWordWrapEb @ 292 NONAME
- _ZN10QTableView12selectColumnEi @ 293 NONAME
- _ZN10QTableView12setGridStyleEN2Qt8PenStyleE @ 294 NONAME
- _ZN10QTableView12setRootIndexERK11QModelIndex @ 295 NONAME
- _ZN10QTableView12setRowHeightEii @ 296 NONAME
- _ZN10QTableView12setRowHiddenEib @ 297 NONAME
- _ZN10QTableView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 298 NONAME
- _ZN10QTableView12sortByColumnEi @ 299 NONAME
- _ZN10QTableView12sortByColumnEiN2Qt9SortOrderE @ 300 NONAME
- _ZN10QTableView13columnResizedEiii @ 301 NONAME
- _ZN10QTableView14currentChangedERK11QModelIndexS2_ @ 302 NONAME
- _ZN10QTableView14setColumnWidthEii @ 303 NONAME
- _ZN10QTableView15rowCountChangedEii @ 304 NONAME
- _ZN10QTableView15setColumnHiddenEib @ 305 NONAME
- _ZN10QTableView16scrollContentsByEii @ 306 NONAME
- _ZN10QTableView16selectionChangedERK14QItemSelectionS2_ @ 307 NONAME
- _ZN10QTableView16staticMetaObjectE @ 308 NONAME DATA 16
- _ZN10QTableView16updateGeometriesEv @ 309 NONAME
- _ZN10QTableView17setSelectionModelEP19QItemSelectionModel @ 310 NONAME
- _ZN10QTableView17setSortingEnabledEb @ 311 NONAME
- _ZN10QTableView17setVerticalHeaderEP11QHeaderView @ 312 NONAME
- _ZN10QTableView18columnCountChangedEii @ 313 NONAME
- _ZN10QTableView19resizeRowToContentsEi @ 314 NONAME
- _ZN10QTableView19setHorizontalHeaderEP11QHeaderView @ 315 NONAME
- _ZN10QTableView20resizeRowsToContentsEv @ 316 NONAME
- _ZN10QTableView22resizeColumnToContentsEi @ 317 NONAME
- _ZN10QTableView22setCornerButtonEnabledEb @ 318 NONAME
- _ZN10QTableView23resizeColumnsToContentsEv @ 319 NONAME
- _ZN10QTableView23verticalScrollbarActionEi @ 320 NONAME
- _ZN10QTableView25horizontalScrollbarActionEi @ 321 NONAME
- _ZN10QTableView7hideRowEi @ 322 NONAME
- _ZN10QTableView7setSpanEiiii @ 323 NONAME
- _ZN10QTableView7showRowEi @ 324 NONAME
- _ZN10QTableView8rowMovedEiii @ 325 NONAME
- _ZN10QTableView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 326 NONAME
- _ZN10QTableView8setModelEP18QAbstractItemModel @ 327 NONAME
- _ZN10QTableView9selectRowEi @ 328 NONAME
- _ZN10QTableViewC1EP7QWidget @ 329 NONAME
- _ZN10QTableViewC1ER17QTableViewPrivateP7QWidget @ 330 NONAME
- _ZN10QTableViewC2EP7QWidget @ 331 NONAME
- _ZN10QTableViewC2ER17QTableViewPrivateP7QWidget @ 332 NONAME
- _ZN10QTableViewD0Ev @ 333 NONAME
- _ZN10QTableViewD1Ev @ 334 NONAME
- _ZN10QTableViewD2Ev @ 335 NONAME
- _ZN10QTextBlock10setVisibleEb @ 336 NONAME
- _ZN10QTextBlock11clearLayoutEv @ 337 NONAME
- _ZN10QTextBlock11setRevisionEi @ 338 NONAME
- _ZN10QTextBlock11setUserDataEP18QTextBlockUserData @ 339 NONAME
- _ZN10QTextBlock12setLineCountEi @ 340 NONAME
- _ZN10QTextBlock12setUserStateEi @ 341 NONAME
- _ZN10QTextBlock8iteratormmEv @ 342 NONAME
- _ZN10QTextBlock8iteratorppEv @ 343 NONAME
- _ZN10QTextFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 344 NONAME
- _ZN10QTextFrame11qt_metacastEPKc @ 345 NONAME
- _ZN10QTextFrame13setLayoutDataEP20QTextFrameLayoutData @ 346 NONAME
- _ZN10QTextFrame16staticMetaObjectE @ 347 NONAME DATA 16
- _ZN10QTextFrame8iteratorC1EPS_iii @ 348 NONAME
- _ZN10QTextFrame8iteratorC1ERKS0_ @ 349 NONAME
- _ZN10QTextFrame8iteratorC1Ev @ 350 NONAME
- _ZN10QTextFrame8iteratorC2EPS_iii @ 351 NONAME
- _ZN10QTextFrame8iteratorC2ERKS0_ @ 352 NONAME
- _ZN10QTextFrame8iteratorC2Ev @ 353 NONAME
- _ZN10QTextFrame8iteratoraSERKS0_ @ 354 NONAME
- _ZN10QTextFrame8iteratormmEv @ 355 NONAME
- _ZN10QTextFrame8iteratorppEv @ 356 NONAME
- _ZN10QTextFrameC1EP13QTextDocument @ 357 NONAME
- _ZN10QTextFrameC1ER17QTextFramePrivateP13QTextDocument @ 358 NONAME
- _ZN10QTextFrameC2EP13QTextDocument @ 359 NONAME
- _ZN10QTextFrameC2ER17QTextFramePrivateP13QTextDocument @ 360 NONAME
- _ZN10QTextFrameD0Ev @ 361 NONAME
- _ZN10QTextFrameD1Ev @ 362 NONAME
- _ZN10QTextFrameD2Ev @ 363 NONAME
- _ZN10QTextTable10appendRowsEi @ 364 NONAME
- _ZN10QTextTable10insertRowsEii @ 365 NONAME
- _ZN10QTextTable10mergeCellsERK11QTextCursor @ 366 NONAME
- _ZN10QTextTable10mergeCellsEiiii @ 367 NONAME
- _ZN10QTextTable10removeRowsEii @ 368 NONAME
- _ZN10QTextTable11qt_metacallEN11QMetaObject4CallEiPPv @ 369 NONAME
- _ZN10QTextTable11qt_metacastEPKc @ 370 NONAME
- _ZN10QTextTable13appendColumnsEi @ 371 NONAME
- _ZN10QTextTable13insertColumnsEii @ 372 NONAME
- _ZN10QTextTable13removeColumnsEii @ 373 NONAME
- _ZN10QTextTable16staticMetaObjectE @ 374 NONAME DATA 16
- _ZN10QTextTable6resizeEii @ 375 NONAME
- _ZN10QTextTable9setFormatERK16QTextTableFormat @ 376 NONAME
- _ZN10QTextTable9splitCellEiiii @ 377 NONAME
- _ZN10QTextTableC1EP13QTextDocument @ 378 NONAME
- _ZN10QTextTableC2EP13QTextDocument @ 379 NONAME
- _ZN10QTextTableD0Ev @ 380 NONAME
- _ZN10QTextTableD1Ev @ 381 NONAME
- _ZN10QTextTableD2Ev @ 382 NONAME
- _ZN10QTransform10quadToQuadERK9QPolygonFS2_RS_ @ 383 NONAME
- _ZN10QTransform12quadToSquareERK9QPolygonFRS_ @ 384 NONAME
- _ZN10QTransform12squareToQuadERK9QPolygonFRS_ @ 385 NONAME
- _ZN10QTransform13fromTranslateEff @ 386 NONAME
- _ZN10QTransform13rotateRadiansEfN2Qt4AxisE @ 387 NONAME
- _ZN10QTransform5resetEv @ 388 NONAME
- _ZN10QTransform5scaleEff @ 389 NONAME
- _ZN10QTransform5shearEff @ 390 NONAME
- _ZN10QTransform6rotateEfN2Qt4AxisE @ 391 NONAME
- _ZN10QTransform9fromScaleEff @ 392 NONAME
- _ZN10QTransform9setMatrixEfffffffff @ 393 NONAME
- _ZN10QTransform9translateEff @ 394 NONAME
- _ZN10QTransformC1ERK7QMatrix @ 395 NONAME
- _ZN10QTransformC1Effffff @ 396 NONAME
- _ZN10QTransformC1Efffffffff @ 397 NONAME
- _ZN10QTransformC1Ev @ 398 NONAME
- _ZN10QTransformC2ERK7QMatrix @ 399 NONAME
- _ZN10QTransformC2Effffff @ 400 NONAME
- _ZN10QTransformC2Efffffffff @ 401 NONAME
- _ZN10QTransformC2Ev @ 402 NONAME
- _ZN10QTransformaSERKS_ @ 403 NONAME
- _ZN10QTransformmLERKS_ @ 404 NONAME
- _ZN10QUndoGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 405 NONAME
- _ZN10QUndoGroup11qt_metacastEPKc @ 406 NONAME
- _ZN10QUndoGroup11removeStackEP10QUndoStack @ 407 NONAME
- _ZN10QUndoGroup12cleanChangedEb @ 408 NONAME
- _ZN10QUndoGroup12indexChangedEi @ 409 NONAME
- _ZN10QUndoGroup14canRedoChangedEb @ 410 NONAME
- _ZN10QUndoGroup14canUndoChangedEb @ 411 NONAME
- _ZN10QUndoGroup14setActiveStackEP10QUndoStack @ 412 NONAME
- _ZN10QUndoGroup15redoTextChangedERK7QString @ 413 NONAME
- _ZN10QUndoGroup15undoTextChangedERK7QString @ 414 NONAME
- _ZN10QUndoGroup16staticMetaObjectE @ 415 NONAME DATA 16
- _ZN10QUndoGroup18activeStackChangedEP10QUndoStack @ 416 NONAME
- _ZN10QUndoGroup4redoEv @ 417 NONAME
- _ZN10QUndoGroup4undoEv @ 418 NONAME
- _ZN10QUndoGroup8addStackEP10QUndoStack @ 419 NONAME
- _ZN10QUndoGroupC1EP7QObject @ 420 NONAME
- _ZN10QUndoGroupC2EP7QObject @ 421 NONAME
- _ZN10QUndoGroupD0Ev @ 422 NONAME
- _ZN10QUndoGroupD1Ev @ 423 NONAME
- _ZN10QUndoGroupD2Ev @ 424 NONAME
- _ZN10QUndoStack10beginMacroERK7QString @ 425 NONAME
- _ZN10QUndoStack11qt_metacallEN11QMetaObject4CallEiPPv @ 426 NONAME
- _ZN10QUndoStack11qt_metacastEPKc @ 427 NONAME
- _ZN10QUndoStack12cleanChangedEb @ 428 NONAME
- _ZN10QUndoStack12indexChangedEi @ 429 NONAME
- _ZN10QUndoStack12setUndoLimitEi @ 430 NONAME
- _ZN10QUndoStack14canRedoChangedEb @ 431 NONAME
- _ZN10QUndoStack14canUndoChangedEb @ 432 NONAME
- _ZN10QUndoStack15redoTextChangedERK7QString @ 433 NONAME
- _ZN10QUndoStack15undoTextChangedERK7QString @ 434 NONAME
- _ZN10QUndoStack16staticMetaObjectE @ 435 NONAME DATA 16
- _ZN10QUndoStack4pushEP12QUndoCommand @ 436 NONAME
- _ZN10QUndoStack4redoEv @ 437 NONAME
- _ZN10QUndoStack4undoEv @ 438 NONAME
- _ZN10QUndoStack5clearEv @ 439 NONAME
- _ZN10QUndoStack8endMacroEv @ 440 NONAME
- _ZN10QUndoStack8setCleanEv @ 441 NONAME
- _ZN10QUndoStack8setIndexEi @ 442 NONAME
- _ZN10QUndoStack9setActiveEb @ 443 NONAME
- _ZN10QUndoStackC1EP7QObject @ 444 NONAME
- _ZN10QUndoStackC2EP7QObject @ 445 NONAME
- _ZN10QUndoStackD0Ev @ 446 NONAME
- _ZN10QUndoStackD1Ev @ 447 NONAME
- _ZN10QUndoStackD2Ev @ 448 NONAME
- _ZN10QValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 449 NONAME
- _ZN10QValidator11qt_metacastEPKc @ 450 NONAME
- _ZN10QValidator16staticMetaObjectE @ 451 NONAME DATA 16
- _ZN10QValidator9setLocaleERK7QLocale @ 452 NONAME
- _ZN10QValidatorC2EP7QObject @ 453 NONAME
- _ZN10QValidatorC2ER14QObjectPrivateP7QObject @ 454 NONAME
- _ZN10QValidatorC2ER17QValidatorPrivateP7QObject @ 455 NONAME
- _ZN10QValidatorD0Ev @ 456 NONAME
- _ZN10QValidatorD1Ev @ 457 NONAME
- _ZN10QValidatorD2Ev @ 458 NONAME
- _ZN10QWhatsThis12createActionEP7QObject @ 459 NONAME
- _ZN10QWhatsThis15inWhatsThisModeEv @ 460 NONAME
- _ZN10QWhatsThis18enterWhatsThisModeEv @ 461 NONAME
- _ZN10QWhatsThis18leaveWhatsThisModeEv @ 462 NONAME
- _ZN10QWhatsThis8hideTextEv @ 463 NONAME
- _ZN10QWhatsThis8showTextERK6QPointRK7QStringP7QWidget @ 464 NONAME
- _ZN10QWhatsThisC1Ev @ 465 NONAME
- _ZN10QWhatsThisC2Ev @ 466 NONAME
- _ZN10QWorkspace10childEventEP11QChildEvent @ 467 NONAME
- _ZN10QWorkspace10paintEventEP11QPaintEvent @ 468 NONAME
- _ZN10QWorkspace10wheelEventEP11QWheelEvent @ 469 NONAME
- _ZN10QWorkspace11changeEventEP6QEvent @ 470 NONAME
- _ZN10QWorkspace11eventFilterEP7QObjectP6QEvent @ 471 NONAME
- _ZN10QWorkspace11qt_metacallEN11QMetaObject4CallEiPPv @ 472 NONAME
- _ZN10QWorkspace11qt_metacastEPKc @ 473 NONAME
- _ZN10QWorkspace11resizeEventEP12QResizeEvent @ 474 NONAME
- _ZN10QWorkspace12arrangeIconsEv @ 475 NONAME
- _ZN10QWorkspace13setBackgroundERK6QBrush @ 476 NONAME
- _ZN10QWorkspace15closeAllWindowsEv @ 477 NONAME
- _ZN10QWorkspace15setActiveWindowEP7QWidget @ 478 NONAME
- _ZN10QWorkspace15windowActivatedEP7QWidget @ 479 NONAME
- _ZN10QWorkspace16staticMetaObjectE @ 480 NONAME DATA 16
- _ZN10QWorkspace17closeActiveWindowEv @ 481 NONAME
- _ZN10QWorkspace18activateNextWindowEv @ 482 NONAME
- _ZN10QWorkspace20setScrollBarsEnabledEb @ 483 NONAME
- _ZN10QWorkspace22activatePreviousWindowEv @ 484 NONAME
- _ZN10QWorkspace4tileEv @ 485 NONAME
- _ZN10QWorkspace5eventEP6QEvent @ 486 NONAME
- _ZN10QWorkspace7cascadeEv @ 487 NONAME
- _ZN10QWorkspace9addWindowEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 488 NONAME
- _ZN10QWorkspace9hideEventEP10QHideEvent @ 489 NONAME
- _ZN10QWorkspace9showEventEP10QShowEvent @ 490 NONAME
- _ZN10QWorkspaceC1EP7QWidget @ 491 NONAME
- _ZN10QWorkspaceC2EP7QWidget @ 492 NONAME
- _ZN10QWorkspaceD0Ev @ 493 NONAME
- _ZN10QWorkspaceD1Ev @ 494 NONAME
- _ZN10QWorkspaceD2Ev @ 495 NONAME
- _ZN10QZipReader5closeEv @ 496 NONAME
- _ZN10QZipReader8FileInfoC1ERKS0_ @ 497 NONAME
- _ZN10QZipReader8FileInfoC1Ev @ 498 NONAME
- _ZN10QZipReader8FileInfoC2ERKS0_ @ 499 NONAME
- _ZN10QZipReader8FileInfoC2Ev @ 500 NONAME
- _ZN10QZipReader8FileInfoD1Ev @ 501 NONAME
- _ZN10QZipReader8FileInfoD2Ev @ 502 NONAME
- _ZN10QZipReader8FileInfoaSERKS0_ @ 503 NONAME
- _ZN10QZipReaderC1EP9QIODevice @ 504 NONAME
- _ZN10QZipReaderC1ERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 505 NONAME
- _ZN10QZipReaderC2EP9QIODevice @ 506 NONAME
- _ZN10QZipReaderC2ERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 507 NONAME
- _ZN10QZipReaderD1Ev @ 508 NONAME
- _ZN10QZipReaderD2Ev @ 509 NONAME
- _ZN10QZipWriter10addSymLinkERK7QStringS2_ @ 510 NONAME
- _ZN10QZipWriter12addDirectoryERK7QString @ 511 NONAME
- _ZN10QZipWriter20setCompressionPolicyENS_17CompressionPolicyE @ 512 NONAME
- _ZN10QZipWriter22setCreationPermissionsE6QFlagsIN5QFile10PermissionEE @ 513 NONAME
- _ZN10QZipWriter5closeEv @ 514 NONAME
- _ZN10QZipWriter7addFileERK7QStringP9QIODevice @ 515 NONAME
- _ZN10QZipWriter7addFileERK7QStringRK10QByteArray @ 516 NONAME
- _ZN10QZipWriterC1EP9QIODevice @ 517 NONAME
- _ZN10QZipWriterC1ERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 518 NONAME
- _ZN10QZipWriterC2EP9QIODevice @ 519 NONAME
- _ZN10QZipWriterC2ERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 520 NONAME
- _ZN10QZipWriterD1Ev @ 521 NONAME
- _ZN10QZipWriterD2Ev @ 522 NONAME
- _ZN11QCloseEventC1Ev @ 523 NONAME
- _ZN11QCloseEventC2Ev @ 524 NONAME
- _ZN11QCloseEventD0Ev @ 525 NONAME
- _ZN11QCloseEventD1Ev @ 526 NONAME
- _ZN11QCloseEventD2Ev @ 527 NONAME
- _ZN11QColumnView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 528 NONAME
- _ZN11QColumnView11qt_metacallEN11QMetaObject4CallEiPPv @ 529 NONAME
- _ZN11QColumnView11qt_metacastEPKc @ 530 NONAME
- _ZN11QColumnView11resizeEventEP12QResizeEvent @ 531 NONAME
- _ZN11QColumnView12createColumnERK11QModelIndex @ 532 NONAME
- _ZN11QColumnView12setRootIndexERK11QModelIndex @ 533 NONAME
- _ZN11QColumnView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 534 NONAME
- _ZN11QColumnView14currentChangedERK11QModelIndexS2_ @ 535 NONAME
- _ZN11QColumnView15setColumnWidthsERK5QListIiE @ 536 NONAME
- _ZN11QColumnView16scrollContentsByEii @ 537 NONAME
- _ZN11QColumnView16setPreviewWidgetEP7QWidget @ 538 NONAME
- _ZN11QColumnView16staticMetaObjectE @ 539 NONAME DATA 16
- _ZN11QColumnView17setSelectionModelEP19QItemSelectionModel @ 540 NONAME
- _ZN11QColumnView19updatePreviewWidgetERK11QModelIndex @ 541 NONAME
- _ZN11QColumnView21setResizeGripsVisibleEb @ 542 NONAME
- _ZN11QColumnView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 543 NONAME
- _ZN11QColumnView8setModelEP18QAbstractItemModel @ 544 NONAME
- _ZN11QColumnView9selectAllEv @ 545 NONAME
- _ZN11QColumnViewC1EP7QWidget @ 546 NONAME
- _ZN11QColumnViewC1ER18QColumnViewPrivateP7QWidget @ 547 NONAME
- _ZN11QColumnViewC2EP7QWidget @ 548 NONAME
- _ZN11QColumnViewC2ER18QColumnViewPrivateP7QWidget @ 549 NONAME
- _ZN11QColumnViewD0Ev @ 550 NONAME
- _ZN11QColumnViewD1Ev @ 551 NONAME
- _ZN11QColumnViewD2Ev @ 552 NONAME
- _ZN11QDockWidget10closeEventEP11QCloseEvent @ 553 NONAME
- _ZN11QDockWidget10paintEventEP11QPaintEvent @ 554 NONAME
- _ZN11QDockWidget11changeEventEP6QEvent @ 555 NONAME
- _ZN11QDockWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 556 NONAME
- _ZN11QDockWidget11qt_metacastEPKc @ 557 NONAME
- _ZN11QDockWidget11setFeaturesE6QFlagsINS_17DockWidgetFeatureEE @ 558 NONAME
- _ZN11QDockWidget11setFloatingEb @ 559 NONAME
- _ZN11QDockWidget15featuresChangedE6QFlagsINS_17DockWidgetFeatureEE @ 560 NONAME
- _ZN11QDockWidget15setAllowedAreasE6QFlagsIN2Qt14DockWidgetAreaEE @ 561 NONAME
- _ZN11QDockWidget15topLevelChangedEb @ 562 NONAME
- _ZN11QDockWidget16staticMetaObjectE @ 563 NONAME DATA 16
- _ZN11QDockWidget17setTitleBarWidgetEP7QWidget @ 564 NONAME
- _ZN11QDockWidget17visibilityChangedEb @ 565 NONAME
- _ZN11QDockWidget19allowedAreasChangedE6QFlagsIN2Qt14DockWidgetAreaEE @ 566 NONAME
- _ZN11QDockWidget19dockLocationChangedEN2Qt14DockWidgetAreaE @ 567 NONAME
- _ZN11QDockWidget5eventEP6QEvent @ 568 NONAME
- _ZN11QDockWidget9setWidgetEP7QWidget @ 569 NONAME
- _ZN11QDockWidgetC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 570 NONAME
- _ZN11QDockWidgetC1ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 571 NONAME
- _ZN11QDockWidgetC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 572 NONAME
- _ZN11QDockWidgetC2ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 573 NONAME
- _ZN11QDockWidgetD0Ev @ 574 NONAME
- _ZN11QDockWidgetD1Ev @ 575 NONAME
- _ZN11QDockWidgetD2Ev @ 576 NONAME
- _ZN11QFileDialog10selectFileERK7QString @ 577 NONAME
- _ZN11QFileDialog10setFiltersERK11QStringList @ 578 NONAME
- _ZN11QFileDialog10setHistoryERK11QStringList @ 579 NONAME
- _ZN11QFileDialog10setOptionsE6QFlagsINS_6OptionEE @ 580 NONAME
- _ZN11QFileDialog10setVisibleEb @ 581 NONAME
- _ZN11QFileDialog11changeEventEP6QEvent @ 582 NONAME
- _ZN11QFileDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 583 NONAME
- _ZN11QFileDialog11qt_metacastEPKc @ 584 NONAME
- _ZN11QFileDialog11setFileModeENS_8FileModeE @ 585 NONAME
- _ZN11QFileDialog11setReadOnlyEb @ 586 NONAME
- _ZN11QFileDialog11setViewModeENS_8ViewModeE @ 587 NONAME
- _ZN11QFileDialog12fileSelectedERK7QString @ 588 NONAME
- _ZN11QFileDialog12restoreStateERK10QByteArray @ 589 NONAME
- _ZN11QFileDialog12selectFilterERK7QString @ 590 NONAME
- _ZN11QFileDialog12setDirectoryERK7QString @ 591 NONAME
- _ZN11QFileDialog12setLabelTextENS_11DialogLabelERK7QString @ 592 NONAME
- _ZN11QFileDialog13filesSelectedERK11QStringList @ 593 NONAME
- _ZN11QFileDialog13setAcceptModeENS_10AcceptModeE @ 594 NONAME
- _ZN11QFileDialog13setNameFilterERK7QString @ 595 NONAME
- _ZN11QFileDialog13setProxyModelEP19QAbstractProxyModel @ 596 NONAME
- _ZN11QFileDialog14currentChangedERK7QString @ 597 NONAME
- _ZN11QFileDialog14filterSelectedERK7QString @ 598 NONAME
- _ZN11QFileDialog14setNameFiltersERK11QStringList @ 599 NONAME
- _ZN11QFileDialog14setSidebarUrlsERK5QListI4QUrlE @ 600 NONAME
- _ZN11QFileDialog15getOpenFileNameEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 601 NONAME
- _ZN11QFileDialog15getSaveFileNameEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 602 NONAME
- _ZN11QFileDialog15setIconProviderEP17QFileIconProvider @ 603 NONAME
- _ZN11QFileDialog15setItemDelegateEP21QAbstractItemDelegate @ 604 NONAME
- _ZN11QFileDialog16directoryEnteredERK7QString @ 605 NONAME
- _ZN11QFileDialog16getOpenFileNamesEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 606 NONAME
- _ZN11QFileDialog16selectNameFilterERK7QString @ 607 NONAME
- _ZN11QFileDialog16setDefaultSuffixERK7QString @ 608 NONAME
- _ZN11QFileDialog16staticMetaObjectE @ 609 NONAME DATA 16
- _ZN11QFileDialog18setResolveSymlinksEb @ 610 NONAME
- _ZN11QFileDialog19setConfirmOverwriteEb @ 611 NONAME
- _ZN11QFileDialog20getExistingDirectoryEP7QWidgetRK7QStringS4_6QFlagsINS_6OptionEE @ 612 NONAME
- _ZN11QFileDialog27setNameFilterDetailsVisibleEb @ 613 NONAME
- _ZN11QFileDialog4doneEi @ 614 NONAME
- _ZN11QFileDialog4openEP7QObjectPKc @ 615 NONAME
- _ZN11QFileDialog6acceptEv @ 616 NONAME
- _ZN11QFileDialog9setFilterE6QFlagsIN4QDir6FilterEE @ 617 NONAME
- _ZN11QFileDialog9setFilterERK7QString @ 618 NONAME
- _ZN11QFileDialog9setOptionENS_6OptionEb @ 619 NONAME
- _ZN11QFileDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 620 NONAME
- _ZN11QFileDialogC1EP7QWidgetRK7QStringS4_S4_ @ 621 NONAME
- _ZN11QFileDialogC1ERK15QFileDialogArgs @ 622 NONAME
- _ZN11QFileDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 623 NONAME
- _ZN11QFileDialogC2EP7QWidgetRK7QStringS4_S4_ @ 624 NONAME
- _ZN11QFileDialogC2ERK15QFileDialogArgs @ 625 NONAME
- _ZN11QFileDialogD0Ev @ 626 NONAME
- _ZN11QFileDialogD1Ev @ 627 NONAME
- _ZN11QFileDialogD2Ev @ 628 NONAME
- _ZN11QFocusEvent6reasonEv @ 629 NONAME
- _ZN11QFocusEventC1EN6QEvent4TypeEN2Qt11FocusReasonE @ 630 NONAME
- _ZN11QFocusEventC2EN6QEvent4TypeEN2Qt11FocusReasonE @ 631 NONAME
- _ZN11QFocusEventD0Ev @ 632 NONAME
- _ZN11QFocusEventD1Ev @ 633 NONAME
- _ZN11QFocusEventD2Ev @ 634 NONAME
- _ZN11QFocusFrame10paintEventEP11QPaintEvent @ 635 NONAME
- _ZN11QFocusFrame11eventFilterEP7QObjectP6QEvent @ 636 NONAME
- _ZN11QFocusFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 637 NONAME
- _ZN11QFocusFrame11qt_metacastEPKc @ 638 NONAME
- _ZN11QFocusFrame16staticMetaObjectE @ 639 NONAME DATA 16
- _ZN11QFocusFrame5eventEP6QEvent @ 640 NONAME
- _ZN11QFocusFrame9setWidgetEP7QWidget @ 641 NONAME
- _ZN11QFocusFrameC1EP7QWidget @ 642 NONAME
- _ZN11QFocusFrameC2EP7QWidget @ 643 NONAME
- _ZN11QFocusFrameD0Ev @ 644 NONAME
- _ZN11QFocusFrameD1Ev @ 645 NONAME
- _ZN11QFocusFrameD2Ev @ 646 NONAME
- _ZN11QFontDialog10setOptionsE6QFlagsINS_16FontDialogOptionEE @ 647 NONAME
- _ZN11QFontDialog10setVisibleEb @ 648 NONAME
- _ZN11QFontDialog11changeEventEP6QEvent @ 649 NONAME
- _ZN11QFontDialog11eventFilterEP7QObjectP6QEvent @ 650 NONAME
- _ZN11QFontDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 651 NONAME
- _ZN11QFontDialog11qt_metacastEPKc @ 652 NONAME
- _ZN11QFontDialog12fontSelectedERK5QFont @ 653 NONAME
- _ZN11QFontDialog14setCurrentFontERK5QFont @ 654 NONAME
- _ZN11QFontDialog16staticMetaObjectE @ 655 NONAME DATA 16
- _ZN11QFontDialog18currentFontChangedERK5QFont @ 656 NONAME
- _ZN11QFontDialog4doneEi @ 657 NONAME
- _ZN11QFontDialog4openEP7QObjectPKc @ 658 NONAME
- _ZN11QFontDialog7getFontEPbP7QWidget @ 659 NONAME
- _ZN11QFontDialog7getFontEPbRK5QFontP7QWidget @ 660 NONAME
- _ZN11QFontDialog7getFontEPbRK5QFontP7QWidgetRK7QString @ 661 NONAME
- _ZN11QFontDialog7getFontEPbRK5QFontP7QWidgetRK7QString6QFlagsINS_16FontDialogOptionEE @ 662 NONAME
- _ZN11QFontDialog9setOptionENS_16FontDialogOptionEb @ 663 NONAME
- _ZN11QFontDialogC1EP7QWidget @ 664 NONAME
- _ZN11QFontDialogC1ERK5QFontP7QWidget @ 665 NONAME
- _ZN11QFontDialogC2EP7QWidget @ 666 NONAME
- _ZN11QFontDialogC2ERK5QFontP7QWidget @ 667 NONAME
- _ZN11QFontDialogD0Ev @ 668 NONAME
- _ZN11QFontDialogD1Ev @ 669 NONAME
- _ZN11QFontDialogD2Ev @ 670 NONAME
- _ZN11QFontEngine11boundingBoxEjRK10QTransform @ 671 NONAME
- _ZN11QFontEngine11grayPaletteEv @ 672 NONAME
- _ZN11QFontEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 673 NONAME ABSENT
- _ZN11QFontEngine11qt_metacastEPKc @ 674 NONAME ABSENT
- _ZN11QFontEngine13setGlyphCacheEN21QFontEngineGlyphCache4TypeEPS0_ @ 675 NONAME
- _ZN11QFontEngine13setGlyphCacheEPvP21QFontEngineGlyphCache @ 676 NONAME
- _ZN11QFontEngine15addGlyphsToPathEPjP11QFixedPointiP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 677 NONAME
- _ZN11QFontEngine16addOutlineToPathEffRK12QGlyphLayoutP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 678 NONAME
- _ZN11QFontEngine16alphaMapForGlyphEj @ 679 NONAME
- _ZN11QFontEngine16alphaMapForGlyphEjRK10QTransform @ 680 NONAME
- _ZN11QFontEngine16expireGlyphCacheEv @ 681 NONAME
- _ZN11QFontEngine16getUnscaledGlyphEjP12QPainterPathP15glyph_metrics_t @ 682 NONAME
- _ZN11QFontEngine16loadKerningPairsE6QFixed @ 683 NONAME
- _ZN11QFontEngine16staticMetaObjectE @ 684 NONAME DATA 16 ABSENT
- _ZN11QFontEngine16tightBoundingBoxERK12QGlyphLayout @ 685 NONAME
- _ZN11QFontEngine17getGlyphPositionsERK12QGlyphLayoutRK10QTransform6QFlagsIN9QTextItem10RenderFlagEER15QVarLengthArrayIjLi256EERSA_I11QFixedPointLi256EE @ 686 NONAME
- _ZN11QFontEngine17getPointInOutlineEjijPiS0_Pj @ 687 NONAME
- _ZN11QFontEngine19addBitmapFontToPathEffRK12QGlyphLayoutP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 688 NONAME
- _ZN11QFontEngine19alphaRGBMapForGlyphEjiRK10QTransform @ 689 NONAME
- _ZN11QFontEngine20removeGlyphFromCacheEj @ 690 NONAME
- _ZN11QFontEngine21getTrueTypeGlyphIndexEPKhj @ 691 NONAME
- _ZN11QFontEngine7getCMapEPKhjPbPi @ 692 NONAME
- _ZN11QFontEngineC2Ev @ 693 NONAME
- _ZN11QFontEngineD0Ev @ 694 NONAME
- _ZN11QFontEngineD1Ev @ 695 NONAME
- _ZN11QFontEngineD2Ev @ 696 NONAME
- _ZN11QFormLayout10invalidateEv @ 697 NONAME
- _ZN11QFormLayout10setSpacingEi @ 698 NONAME
- _ZN11QFormLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 699 NONAME
- _ZN11QFormLayout11qt_metacastEPKc @ 700 NONAME
- _ZN11QFormLayout11setGeometryERK5QRect @ 701 NONAME
- _ZN11QFormLayout16setFormAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 702 NONAME
- _ZN11QFormLayout16setRowWrapPolicyENS_13RowWrapPolicyE @ 703 NONAME
- _ZN11QFormLayout16staticMetaObjectE @ 704 NONAME DATA 16
- _ZN11QFormLayout17setLabelAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 705 NONAME
- _ZN11QFormLayout18resetFormAlignmentEv @ 706 NONAME
- _ZN11QFormLayout18resetRowWrapPolicyEv @ 707 NONAME
- _ZN11QFormLayout18setVerticalSpacingEi @ 708 NONAME
- _ZN11QFormLayout19resetLabelAlignmentEv @ 709 NONAME
- _ZN11QFormLayout20setFieldGrowthPolicyENS_17FieldGrowthPolicyE @ 710 NONAME
- _ZN11QFormLayout20setHorizontalSpacingEi @ 711 NONAME
- _ZN11QFormLayout22resetFieldGrowthPolicyEv @ 712 NONAME
- _ZN11QFormLayout6addRowEP7QLayout @ 713 NONAME
- _ZN11QFormLayout6addRowEP7QWidget @ 714 NONAME
- _ZN11QFormLayout6addRowEP7QWidgetP7QLayout @ 715 NONAME
- _ZN11QFormLayout6addRowEP7QWidgetS1_ @ 716 NONAME
- _ZN11QFormLayout6addRowERK7QStringP7QLayout @ 717 NONAME
- _ZN11QFormLayout6addRowERK7QStringP7QWidget @ 718 NONAME
- _ZN11QFormLayout6takeAtEi @ 719 NONAME
- _ZN11QFormLayout7addItemEP11QLayoutItem @ 720 NONAME
- _ZN11QFormLayout7setItemEiNS_8ItemRoleEP11QLayoutItem @ 721 NONAME
- _ZN11QFormLayout9insertRowEiP7QLayout @ 722 NONAME
- _ZN11QFormLayout9insertRowEiP7QWidget @ 723 NONAME
- _ZN11QFormLayout9insertRowEiP7QWidgetP7QLayout @ 724 NONAME
- _ZN11QFormLayout9insertRowEiP7QWidgetS1_ @ 725 NONAME
- _ZN11QFormLayout9insertRowEiRK7QStringP7QLayout @ 726 NONAME
- _ZN11QFormLayout9insertRowEiRK7QStringP7QWidget @ 727 NONAME
- _ZN11QFormLayout9setLayoutEiNS_8ItemRoleEP7QLayout @ 728 NONAME
- _ZN11QFormLayout9setWidgetEiNS_8ItemRoleEP7QWidget @ 729 NONAME
- _ZN11QFormLayoutC1EP7QWidget @ 730 NONAME
- _ZN11QFormLayoutC2EP7QWidget @ 731 NONAME
- _ZN11QFormLayoutD0Ev @ 732 NONAME
- _ZN11QFormLayoutD1Ev @ 733 NONAME
- _ZN11QFormLayoutD2Ev @ 734 NONAME
- _ZN11QGridLayout10invalidateEv @ 735 NONAME
- _ZN11QGridLayout10setSpacingEi @ 736 NONAME
- _ZN11QGridLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 737 NONAME
- _ZN11QGridLayout11qt_metacastEPKc @ 738 NONAME
- _ZN11QGridLayout11setGeometryERK5QRect @ 739 NONAME
- _ZN11QGridLayout13setRowStretchEii @ 740 NONAME
- _ZN11QGridLayout15getItemPositionEiPiS0_S0_S0_ @ 741 NONAME
- _ZN11QGridLayout15setOriginCornerEN2Qt6CornerE @ 742 NONAME
- _ZN11QGridLayout16setColumnStretchEii @ 743 NONAME
- _ZN11QGridLayout16staticMetaObjectE @ 744 NONAME DATA 16
- _ZN11QGridLayout18setVerticalSpacingEi @ 745 NONAME
- _ZN11QGridLayout19setRowMinimumHeightEii @ 746 NONAME
- _ZN11QGridLayout20setHorizontalSpacingEi @ 747 NONAME
- _ZN11QGridLayout21setColumnMinimumWidthEii @ 748 NONAME
- _ZN11QGridLayout21setDefaultPositioningEiN2Qt11OrientationE @ 749 NONAME
- _ZN11QGridLayout6takeAtEi @ 750 NONAME
- _ZN11QGridLayout7addItemEP11QLayoutItem @ 751 NONAME
- _ZN11QGridLayout7addItemEP11QLayoutItemiiii6QFlagsIN2Qt13AlignmentFlagEE @ 752 NONAME
- _ZN11QGridLayout9addLayoutEP7QLayoutii6QFlagsIN2Qt13AlignmentFlagEE @ 753 NONAME
- _ZN11QGridLayout9addLayoutEP7QLayoutiiii6QFlagsIN2Qt13AlignmentFlagEE @ 754 NONAME
- _ZN11QGridLayout9addWidgetEP7QWidgetii6QFlagsIN2Qt13AlignmentFlagEE @ 755 NONAME
- _ZN11QGridLayout9addWidgetEP7QWidgetiiii6QFlagsIN2Qt13AlignmentFlagEE @ 756 NONAME
- _ZN11QGridLayoutC1EP7QWidget @ 757 NONAME
- _ZN11QGridLayoutC1Ev @ 758 NONAME
- _ZN11QGridLayoutC2EP7QWidget @ 759 NONAME
- _ZN11QGridLayoutC2Ev @ 760 NONAME
- _ZN11QGridLayoutD0Ev @ 761 NONAME
- _ZN11QGridLayoutD1Ev @ 762 NONAME
- _ZN11QGridLayoutD2Ev @ 763 NONAME
- _ZN11QHBoxLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 764 NONAME
- _ZN11QHBoxLayout11qt_metacastEPKc @ 765 NONAME
- _ZN11QHBoxLayout16staticMetaObjectE @ 766 NONAME DATA 16
- _ZN11QHBoxLayoutC1EP7QWidget @ 767 NONAME
- _ZN11QHBoxLayoutC1Ev @ 768 NONAME
- _ZN11QHBoxLayoutC2EP7QWidget @ 769 NONAME
- _ZN11QHBoxLayoutC2Ev @ 770 NONAME
- _ZN11QHBoxLayoutD0Ev @ 771 NONAME
- _ZN11QHBoxLayoutD1Ev @ 772 NONAME
- _ZN11QHBoxLayoutD2Ev @ 773 NONAME
- _ZN11QHeaderView10initializeEv @ 774 NONAME
- _ZN11QHeaderView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 775 NONAME
- _ZN11QHeaderView10paintEventEP11QPaintEvent @ 776 NONAME
- _ZN11QHeaderView10setMovableEb @ 777 NONAME
- _ZN11QHeaderView11dataChangedERK11QModelIndexS2_ @ 778 NONAME
- _ZN11QHeaderView11moveSectionEii @ 779 NONAME
- _ZN11QHeaderView11qt_metacallEN11QMetaObject4CallEiPPv @ 780 NONAME
- _ZN11QHeaderView11qt_metacastEPKc @ 781 NONAME
- _ZN11QHeaderView12restoreStateERK10QByteArray @ 782 NONAME
- _ZN11QHeaderView12rowsInsertedERK11QModelIndexii @ 783 NONAME
- _ZN11QHeaderView12sectionMovedEiii @ 784 NONAME
- _ZN11QHeaderView12setClickableEb @ 785 NONAME
- _ZN11QHeaderView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 786 NONAME
- _ZN11QHeaderView12swapSectionsEii @ 787 NONAME
- _ZN11QHeaderView13doItemsLayoutEv @ 788 NONAME
- _ZN11QHeaderView13resizeSectionEii @ 789 NONAME
- _ZN11QHeaderView13setResizeModeENS_10ResizeModeE @ 790 NONAME
- _ZN11QHeaderView13setResizeModeEiNS_10ResizeModeE @ 791 NONAME
- _ZN11QHeaderView13updateSectionEi @ 792 NONAME
- _ZN11QHeaderView13viewportEventEP6QEvent @ 793 NONAME
- _ZN11QHeaderView14currentChangedERK11QModelIndexS2_ @ 794 NONAME
- _ZN11QHeaderView14mouseMoveEventEP11QMouseEvent @ 795 NONAME
- _ZN11QHeaderView14resizeSectionsENS_10ResizeModeE @ 796 NONAME
- _ZN11QHeaderView14resizeSectionsEv @ 797 NONAME
- _ZN11QHeaderView14sectionClickedEi @ 798 NONAME
- _ZN11QHeaderView14sectionEnteredEi @ 799 NONAME
- _ZN11QHeaderView14sectionPressedEi @ 800 NONAME
- _ZN11QHeaderView14sectionResizedEiii @ 801 NONAME
- _ZN11QHeaderView15mousePressEventEP11QMouseEvent @ 802 NONAME
- _ZN11QHeaderView16scrollContentsByEii @ 803 NONAME
- _ZN11QHeaderView16sectionsInsertedERK11QModelIndexii @ 804 NONAME
- _ZN11QHeaderView16setSectionHiddenEib @ 805 NONAME
- _ZN11QHeaderView16setSortIndicatorEiN2Qt9SortOrderE @ 806 NONAME
- _ZN11QHeaderView16staticMetaObjectE @ 807 NONAME DATA 16
- _ZN11QHeaderView16updateGeometriesEv @ 808 NONAME
- _ZN11QHeaderView17geometriesChangedEv @ 809 NONAME
- _ZN11QHeaderView17headerDataChangedEN2Qt11OrientationEii @ 810 NONAME
- _ZN11QHeaderView17mouseReleaseEventEP11QMouseEvent @ 811 NONAME
- _ZN11QHeaderView17sectionAutoResizeEiNS_10ResizeModeE @ 812 NONAME
- _ZN11QHeaderView18initializeSectionsEii @ 813 NONAME
- _ZN11QHeaderView18initializeSectionsEv @ 814 NONAME
- _ZN11QHeaderView19sectionCountChangedEii @ 815 NONAME
- _ZN11QHeaderView19setDefaultAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 816 NONAME
- _ZN11QHeaderView20sectionDoubleClickedEi @ 817 NONAME
- _ZN11QHeaderView20setHighlightSectionsEb @ 818 NONAME
- _ZN11QHeaderView20sortIndicatorChangedEiN2Qt9SortOrderE @ 819 NONAME
- _ZN11QHeaderView21mouseDoubleClickEventEP11QMouseEvent @ 820 NONAME
- _ZN11QHeaderView21setDefaultSectionSizeEi @ 821 NONAME
- _ZN11QHeaderView21setMinimumSectionSizeEi @ 822 NONAME
- _ZN11QHeaderView21setSortIndicatorShownEb @ 823 NONAME
- _ZN11QHeaderView21setStretchLastSectionEb @ 824 NONAME
- _ZN11QHeaderView22setOffsetToLastSectionEv @ 825 NONAME
- _ZN11QHeaderView24sectionsAboutToBeRemovedERK11QModelIndexii @ 826 NONAME
- _ZN11QHeaderView26sectionHandleDoubleClickedEi @ 827 NONAME
- _ZN11QHeaderView26setCascadingSectionResizesEb @ 828 NONAME
- _ZN11QHeaderView26setOffsetToSectionPositionEi @ 829 NONAME
- _ZN11QHeaderView5eventEP6QEvent @ 830 NONAME
- _ZN11QHeaderView5resetEv @ 831 NONAME
- _ZN11QHeaderView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 832 NONAME
- _ZN11QHeaderView8setModelEP18QAbstractItemModel @ 833 NONAME
- _ZN11QHeaderView9setOffsetEi @ 834 NONAME
- _ZN11QHeaderViewC1EN2Qt11OrientationEP7QWidget @ 835 NONAME
- _ZN11QHeaderViewC1ER18QHeaderViewPrivateN2Qt11OrientationEP7QWidget @ 836 NONAME
- _ZN11QHeaderViewC2EN2Qt11OrientationEP7QWidget @ 837 NONAME
- _ZN11QHeaderViewC2ER18QHeaderViewPrivateN2Qt11OrientationEP7QWidget @ 838 NONAME
- _ZN11QHeaderViewD0Ev @ 839 NONAME
- _ZN11QHeaderViewD1Ev @ 840 NONAME
- _ZN11QHeaderViewD2Ev @ 841 NONAME
- _ZN11QHoverEventC1EN6QEvent4TypeERK6QPointS4_ @ 842 NONAME
- _ZN11QHoverEventC2EN6QEvent4TypeERK6QPointS4_ @ 843 NONAME
- _ZN11QHoverEventD0Ev @ 844 NONAME
- _ZN11QHoverEventD1Ev @ 845 NONAME
- _ZN11QHoverEventD2Ev @ 846 NONAME
- _ZN11QIconEngine10actualSizeERK5QSizeN5QIcon4ModeENS3_5StateE @ 847 NONAME
- _ZN11QIconEngine6pixmapERK5QSizeN5QIcon4ModeENS3_5StateE @ 848 NONAME
- _ZN11QIconEngine7addFileERK7QStringRK5QSizeN5QIcon4ModeENS6_5StateE @ 849 NONAME
- _ZN11QIconEngine9addPixmapERK7QPixmapN5QIcon4ModeENS3_5StateE @ 850 NONAME
- _ZN11QIconEngineD0Ev @ 851 NONAME
- _ZN11QIconEngineD1Ev @ 852 NONAME
- _ZN11QIconEngineD2Ev @ 853 NONAME
- _ZN11QInputEventC1EN6QEvent4TypeE6QFlagsIN2Qt16KeyboardModifierEE @ 854 NONAME
- _ZN11QInputEventC2EN6QEvent4TypeE6QFlagsIN2Qt16KeyboardModifierEE @ 855 NONAME
- _ZN11QInputEventD0Ev @ 856 NONAME
- _ZN11QInputEventD1Ev @ 857 NONAME
- _ZN11QInputEventD2Ev @ 858 NONAME
- _ZN11QKeyEventExC1EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbtjjj @ 859 NONAME ABSENT
- _ZN11QKeyEventExC1ERKS_ @ 860 NONAME ABSENT
- _ZN11QKeyEventExC2EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbtjjj @ 861 NONAME ABSENT
- _ZN11QKeyEventExC2ERKS_ @ 862 NONAME ABSENT
- _ZN11QKeyEventExD0Ev @ 863 NONAME ABSENT
- _ZN11QKeyEventExD1Ev @ 864 NONAME ABSENT
- _ZN11QKeyEventExD2Ev @ 865 NONAME ABSENT
- _ZN11QLayoutItem10invalidateEv @ 866 NONAME
- _ZN11QLayoutItem10spacerItemEv @ 867 NONAME
- _ZN11QLayoutItem12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 868 NONAME
- _ZN11QLayoutItem6layoutEv @ 869 NONAME
- _ZN11QLayoutItem6widgetEv @ 870 NONAME
- _ZN11QLayoutItemD0Ev @ 871 NONAME
- _ZN11QLayoutItemD1Ev @ 872 NONAME
- _ZN11QLayoutItemD2Ev @ 873 NONAME
- _ZN11QListWidget10insertItemEiP15QListWidgetItem @ 874 NONAME
- _ZN11QListWidget10insertItemEiRK7QString @ 875 NONAME
- _ZN11QListWidget11insertItemsEiRK11QStringList @ 876 NONAME
- _ZN11QListWidget11itemChangedEP15QListWidgetItem @ 877 NONAME
- _ZN11QListWidget11itemClickedEP15QListWidgetItem @ 878 NONAME
- _ZN11QListWidget11itemEnteredEP15QListWidgetItem @ 879 NONAME
- _ZN11QListWidget11itemPressedEP15QListWidgetItem @ 880 NONAME
- _ZN11QListWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 881 NONAME
- _ZN11QListWidget11qt_metacastEPKc @ 882 NONAME
- _ZN11QListWidget12dropMimeDataEiPK9QMimeDataN2Qt10DropActionE @ 883 NONAME
- _ZN11QListWidget12scrollToItemEPK15QListWidgetItemN17QAbstractItemView10ScrollHintE @ 884 NONAME
- _ZN11QListWidget13itemActivatedEP15QListWidgetItem @ 885 NONAME
- _ZN11QListWidget13setCurrentRowEi @ 886 NONAME
- _ZN11QListWidget13setCurrentRowEi6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 887 NONAME
- _ZN11QListWidget13setItemHiddenEPK15QListWidgetItemb @ 888 NONAME
- _ZN11QListWidget13setItemWidgetEP15QListWidgetItemP7QWidget @ 889 NONAME
- _ZN11QListWidget14setCurrentItemEP15QListWidgetItem @ 890 NONAME
- _ZN11QListWidget14setCurrentItemEP15QListWidgetItem6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 891 NONAME
- _ZN11QListWidget15setItemSelectedEPK15QListWidgetItemb @ 892 NONAME
- _ZN11QListWidget16staticMetaObjectE @ 893 NONAME DATA 16
- _ZN11QListWidget17currentRowChangedEi @ 894 NONAME
- _ZN11QListWidget17itemDoubleClickedEP15QListWidgetItem @ 895 NONAME
- _ZN11QListWidget17setSortingEnabledEb @ 896 NONAME
- _ZN11QListWidget18currentItemChangedEP15QListWidgetItemS1_ @ 897 NONAME
- _ZN11QListWidget18currentTextChangedERK7QString @ 898 NONAME
- _ZN11QListWidget20itemSelectionChangedEv @ 899 NONAME
- _ZN11QListWidget20openPersistentEditorEP15QListWidgetItem @ 900 NONAME
- _ZN11QListWidget21closePersistentEditorEP15QListWidgetItem @ 901 NONAME
- _ZN11QListWidget5clearEv @ 902 NONAME
- _ZN11QListWidget5eventEP6QEvent @ 903 NONAME
- _ZN11QListWidget8editItemEP15QListWidgetItem @ 904 NONAME
- _ZN11QListWidget8setModelEP18QAbstractItemModel @ 905 NONAME
- _ZN11QListWidget8takeItemEi @ 906 NONAME
- _ZN11QListWidget9dropEventEP10QDropEvent @ 907 NONAME
- _ZN11QListWidget9sortItemsEN2Qt9SortOrderE @ 908 NONAME
- _ZN11QListWidgetC1EP7QWidget @ 909 NONAME
- _ZN11QListWidgetC2EP7QWidget @ 910 NONAME
- _ZN11QListWidgetD0Ev @ 911 NONAME
- _ZN11QListWidgetD1Ev @ 912 NONAME
- _ZN11QListWidgetD2Ev @ 913 NONAME
- _ZN11QMainWindow10addToolBarEN2Qt11ToolBarAreaEP8QToolBar @ 914 NONAME
- _ZN11QMainWindow10addToolBarEP8QToolBar @ 915 NONAME
- _ZN11QMainWindow10addToolBarERK7QString @ 916 NONAME
- _ZN11QMainWindow10setMenuBarEP8QMenuBar @ 917 NONAME
- _ZN11QMainWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 918 NONAME
- _ZN11QMainWindow11qt_metacastEPKc @ 919 NONAME
- _ZN11QMainWindow11setAnimatedEb @ 920 NONAME
- _ZN11QMainWindow11setIconSizeERK5QSize @ 921 NONAME
- _ZN11QMainWindow11setTabShapeEN10QTabWidget8TabShapeE @ 922 NONAME
- _ZN11QMainWindow12restoreStateERK10QByteArrayi @ 923 NONAME
- _ZN11QMainWindow12setStatusBarEP10QStatusBar @ 924 NONAME
- _ZN11QMainWindow13addDockWidgetEN2Qt14DockWidgetAreaEP11QDockWidget @ 925 NONAME
- _ZN11QMainWindow13addDockWidgetEN2Qt14DockWidgetAreaEP11QDockWidgetNS0_11OrientationE @ 926 NONAME
- _ZN11QMainWindow13insertToolBarEP8QToolBarS1_ @ 927 NONAME
- _ZN11QMainWindow13removeToolBarEP8QToolBar @ 928 NONAME
- _ZN11QMainWindow13setMenuWidgetEP7QWidget @ 929 NONAME
- _ZN11QMainWindow14setDockOptionsE6QFlagsINS_10DockOptionEE @ 930 NONAME
- _ZN11QMainWindow14setTabPositionE6QFlagsIN2Qt14DockWidgetAreaEEN10QTabWidget11TabPositionE @ 931 NONAME
- _ZN11QMainWindow15addToolBarBreakEN2Qt11ToolBarAreaE @ 932 NONAME
- _ZN11QMainWindow15createPopupMenuEv @ 933 NONAME
- _ZN11QMainWindow15iconSizeChangedERK5QSize @ 934 NONAME
- _ZN11QMainWindow15setDocumentModeEb @ 935 NONAME
- _ZN11QMainWindow15splitDockWidgetEP11QDockWidgetS1_N2Qt11OrientationE @ 936 NONAME
- _ZN11QMainWindow16contextMenuEventEP17QContextMenuEvent @ 937 NONAME
- _ZN11QMainWindow16removeDockWidgetEP11QDockWidget @ 938 NONAME
- _ZN11QMainWindow16setCentralWidgetEP7QWidget @ 939 NONAME
- _ZN11QMainWindow16staticMetaObjectE @ 940 NONAME DATA 16
- _ZN11QMainWindow16tabifyDockWidgetEP11QDockWidgetS1_ @ 941 NONAME
- _ZN11QMainWindow17restoreDockWidgetEP11QDockWidget @ 942 NONAME
- _ZN11QMainWindow18insertToolBarBreakEP8QToolBar @ 943 NONAME
- _ZN11QMainWindow18removeToolBarBreakEP8QToolBar @ 944 NONAME
- _ZN11QMainWindow18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 945 NONAME
- _ZN11QMainWindow21setDockNestingEnabledEb @ 946 NONAME
- _ZN11QMainWindow22toolButtonStyleChangedEN2Qt15ToolButtonStyleE @ 947 NONAME
- _ZN11QMainWindow30setUnifiedTitleAndToolBarOnMacEb @ 948 NONAME
- _ZN11QMainWindow5eventEP6QEvent @ 949 NONAME
- _ZN11QMainWindow9setCornerEN2Qt6CornerENS0_14DockWidgetAreaE @ 950 NONAME
- _ZN11QMainWindowC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 951 NONAME
- _ZN11QMainWindowC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 952 NONAME
- _ZN11QMainWindowD0Ev @ 953 NONAME
- _ZN11QMainWindowD1Ev @ 954 NONAME
- _ZN11QMainWindowD2Ev @ 955 NONAME
- _ZN11QMessageBox10closeEventEP11QCloseEvent @ 956 NONAME
- _ZN11QMessageBox11changeEventEP6QEvent @ 957 NONAME
- _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 958 NONAME
- _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 959 NONAME
- _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_iii @ 960 NONAME
- _ZN11QMessageBox11qt_metacallEN11QMetaObject4CallEiPPv @ 961 NONAME
- _ZN11QMessageBox11qt_metacastEPKc @ 962 NONAME
- _ZN11QMessageBox11resizeEventEP12QResizeEvent @ 963 NONAME
- _ZN11QMessageBox12removeButtonEP15QAbstractButton @ 964 NONAME
- _ZN11QMessageBox12standardIconENS_4IconE @ 965 NONAME
- _ZN11QMessageBox13buttonClickedEP15QAbstractButton @ 966 NONAME
- _ZN11QMessageBox13keyPressEventEP9QKeyEvent @ 967 NONAME
- _ZN11QMessageBox13setButtonTextEiRK7QString @ 968 NONAME
- _ZN11QMessageBox13setIconPixmapERK7QPixmap @ 969 NONAME
- _ZN11QMessageBox13setTextFormatEN2Qt10TextFormatE @ 970 NONAME
- _ZN11QMessageBox14setWindowTitleERK7QString @ 971 NONAME
- _ZN11QMessageBox15setDetailedTextERK7QString @ 972 NONAME
- _ZN11QMessageBox15setEscapeButtonENS_14StandardButtonE @ 973 NONAME
- _ZN11QMessageBox15setEscapeButtonEP15QAbstractButton @ 974 NONAME
- _ZN11QMessageBox16setDefaultButtonENS_14StandardButtonE @ 975 NONAME
- _ZN11QMessageBox16setDefaultButtonEP11QPushButton @ 976 NONAME
- _ZN11QMessageBox16staticMetaObjectE @ 977 NONAME DATA 16
- _ZN11QMessageBox17setWindowModalityEN2Qt14WindowModalityE @ 978 NONAME
- _ZN11QMessageBox18setInformativeTextERK7QString @ 979 NONAME
- _ZN11QMessageBox18setStandardButtonsE6QFlagsINS_14StandardButtonEE @ 980 NONAME
- _ZN11QMessageBox4openEP7QObjectPKc @ 981 NONAME
- _ZN11QMessageBox5aboutEP7QWidgetRK7QStringS4_ @ 982 NONAME
- _ZN11QMessageBox5eventEP6QEvent @ 983 NONAME
- _ZN11QMessageBox7aboutQtEP7QWidgetRK7QString @ 984 NONAME
- _ZN11QMessageBox7setIconENS_4IconE @ 985 NONAME
- _ZN11QMessageBox7setTextERK7QString @ 986 NONAME
- _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 987 NONAME
- _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 988 NONAME
- _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_iii @ 989 NONAME
- _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 990 NONAME
- _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 991 NONAME
- _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_iii @ 992 NONAME
- _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 993 NONAME
- _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 994 NONAME
- _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_iii @ 995 NONAME
- _ZN11QMessageBox9addButtonENS_14StandardButtonE @ 996 NONAME
- _ZN11QMessageBox9addButtonEP15QAbstractButtonNS_10ButtonRoleE @ 997 NONAME
- _ZN11QMessageBox9addButtonERK7QStringNS_10ButtonRoleE @ 998 NONAME
- _ZN11QMessageBox9showEventEP10QShowEvent @ 999 NONAME
- _ZN11QMessageBoxC1ENS_4IconERK7QStringS3_6QFlagsINS_14StandardButtonEEP7QWidgetS4_IN2Qt10WindowTypeEE @ 1000 NONAME
- _ZN11QMessageBoxC1EP7QWidget @ 1001 NONAME
- _ZN11QMessageBoxC1ERK7QStringS2_NS_4IconEiiiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1002 NONAME
- _ZN11QMessageBoxC2ENS_4IconERK7QStringS3_6QFlagsINS_14StandardButtonEEP7QWidgetS4_IN2Qt10WindowTypeEE @ 1003 NONAME
- _ZN11QMessageBoxC2EP7QWidget @ 1004 NONAME
- _ZN11QMessageBoxC2ERK7QStringS2_NS_4IconEiiiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1005 NONAME
- _ZN11QMessageBoxD0Ev @ 1006 NONAME
- _ZN11QMessageBoxD1Ev @ 1007 NONAME
- _ZN11QMessageBoxD2Ev @ 1008 NONAME
- _ZN11QMimeSourceD0Ev @ 1009 NONAME
- _ZN11QMimeSourceD1Ev @ 1010 NONAME
- _ZN11QMimeSourceD2Ev @ 1011 NONAME
- _ZN11QMouseEvent24createExtendedMouseEventEN6QEvent4TypeERK7QPointFRK6QPointN2Qt11MouseButtonE6QFlagsIS9_ESA_INS8_16KeyboardModifierEE @ 1012 NONAME
- _ZN11QMouseEventC1EN6QEvent4TypeERK6QPointN2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1013 NONAME
- _ZN11QMouseEventC1EN6QEvent4TypeERK6QPointS4_N2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1014 NONAME
- _ZN11QMouseEventC2EN6QEvent4TypeERK6QPointN2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1015 NONAME
- _ZN11QMouseEventC2EN6QEvent4TypeERK6QPointS4_N2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1016 NONAME
- _ZN11QMouseEventD0Ev @ 1017 NONAME
- _ZN11QMouseEventD1Ev @ 1018 NONAME
- _ZN11QMouseEventD2Ev @ 1019 NONAME
- _ZN11QPaintEventC1ERK5QRect @ 1020 NONAME
- _ZN11QPaintEventC1ERK7QRegion @ 1021 NONAME
- _ZN11QPaintEventC2ERK5QRect @ 1022 NONAME
- _ZN11QPaintEventC2ERK7QRegion @ 1023 NONAME
- _ZN11QPaintEventD0Ev @ 1024 NONAME
- _ZN11QPaintEventD1Ev @ 1025 NONAME
- _ZN11QPaintEventD2Ev @ 1026 NONAME
- _ZN11QPixmapData15setAlphaChannelERK7QPixmap @ 1027 NONAME
- _ZN11QPixmapData15setSerialNumberEi @ 1028 NONAME
- _ZN11QPixmapData4copyEPKS_RK5QRect @ 1029 NONAME
- _ZN11QPixmapData6bufferEv @ 1030 NONAME
- _ZN11QPixmapData7setMaskERK7QBitmap @ 1031 NONAME
- _ZN11QPixmapData8fromFileERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 1032 NONAME
- _ZN11QPixmapDataC2ENS_9PixelTypeEi @ 1033 NONAME
- _ZN11QPixmapDataD0Ev @ 1034 NONAME
- _ZN11QPixmapDataD1Ev @ 1035 NONAME
- _ZN11QPixmapDataD2Ev @ 1036 NONAME
- _ZN11QProxyModel10insertRowsEiiRK11QModelIndex @ 1037 NONAME
- _ZN11QProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1038 NONAME
- _ZN11QProxyModel11qt_metacastEPKc @ 1039 NONAME
- _ZN11QProxyModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 1040 NONAME
- _ZN11QProxyModel13insertColumnsEiiRK11QModelIndex @ 1041 NONAME
- _ZN11QProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 1042 NONAME
- _ZN11QProxyModel16staticMetaObjectE @ 1043 NONAME DATA 16
- _ZN11QProxyModel4sortEiN2Qt9SortOrderE @ 1044 NONAME
- _ZN11QProxyModel6revertEv @ 1045 NONAME
- _ZN11QProxyModel6submitEv @ 1046 NONAME
- _ZN11QProxyModel7setDataERK11QModelIndexRK8QVarianti @ 1047 NONAME
- _ZN11QProxyModel8setModelEP18QAbstractItemModel @ 1048 NONAME
- _ZN11QProxyModel9fetchMoreERK11QModelIndex @ 1049 NONAME
- _ZN11QProxyModelC1EP7QObject @ 1050 NONAME
- _ZN11QProxyModelC1ER18QProxyModelPrivateP7QObject @ 1051 NONAME
- _ZN11QProxyModelC2EP7QObject @ 1052 NONAME
- _ZN11QProxyModelC2ER18QProxyModelPrivateP7QObject @ 1053 NONAME
- _ZN11QProxyModelD0Ev @ 1054 NONAME
- _ZN11QProxyModelD1Ev @ 1055 NONAME
- _ZN11QProxyModelD2Ev @ 1056 NONAME
- _ZN11QPushButton10paintEventEP11QPaintEvent @ 1057 NONAME
- _ZN11QPushButton10setDefaultEb @ 1058 NONAME
- _ZN11QPushButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1059 NONAME
- _ZN11QPushButton11qt_metacastEPKc @ 1060 NONAME
- _ZN11QPushButton12focusInEventEP11QFocusEvent @ 1061 NONAME
- _ZN11QPushButton13focusOutEventEP11QFocusEvent @ 1062 NONAME
- _ZN11QPushButton13keyPressEventEP9QKeyEvent @ 1063 NONAME
- _ZN11QPushButton14setAutoDefaultEb @ 1064 NONAME
- _ZN11QPushButton16staticMetaObjectE @ 1065 NONAME DATA 16
- _ZN11QPushButton5eventEP6QEvent @ 1066 NONAME
- _ZN11QPushButton7setFlatEb @ 1067 NONAME
- _ZN11QPushButton7setMenuEP5QMenu @ 1068 NONAME
- _ZN11QPushButton8showMenuEv @ 1069 NONAME
- _ZN11QPushButtonC1EP7QWidget @ 1070 NONAME
- _ZN11QPushButtonC1ER18QPushButtonPrivateP7QWidget @ 1071 NONAME
- _ZN11QPushButtonC1ERK5QIconRK7QStringP7QWidget @ 1072 NONAME
- _ZN11QPushButtonC1ERK7QStringP7QWidget @ 1073 NONAME
- _ZN11QPushButtonC2EP7QWidget @ 1074 NONAME
- _ZN11QPushButtonC2ER18QPushButtonPrivateP7QWidget @ 1075 NONAME
- _ZN11QPushButtonC2ERK5QIconRK7QStringP7QWidget @ 1076 NONAME
- _ZN11QPushButtonC2ERK7QStringP7QWidget @ 1077 NONAME
- _ZN11QPushButtonD0Ev @ 1078 NONAME
- _ZN11QPushButtonD1Ev @ 1079 NONAME
- _ZN11QPushButtonD2Ev @ 1080 NONAME
- _ZN11QRubberBand10paintEventEP11QPaintEvent @ 1081 NONAME
- _ZN11QRubberBand11changeEventEP6QEvent @ 1082 NONAME
- _ZN11QRubberBand11qt_metacallEN11QMetaObject4CallEiPPv @ 1083 NONAME
- _ZN11QRubberBand11qt_metacastEPKc @ 1084 NONAME
- _ZN11QRubberBand11resizeEventEP12QResizeEvent @ 1085 NONAME
- _ZN11QRubberBand11setGeometryERK5QRect @ 1086 NONAME
- _ZN11QRubberBand16staticMetaObjectE @ 1087 NONAME DATA 16
- _ZN11QRubberBand5eventEP6QEvent @ 1088 NONAME
- _ZN11QRubberBand9moveEventEP10QMoveEvent @ 1089 NONAME
- _ZN11QRubberBand9showEventEP10QShowEvent @ 1090 NONAME
- _ZN11QRubberBandC1ENS_5ShapeEP7QWidget @ 1091 NONAME
- _ZN11QRubberBandC2ENS_5ShapeEP7QWidget @ 1092 NONAME
- _ZN11QRubberBandD0Ev @ 1093 NONAME
- _ZN11QRubberBandD1Ev @ 1094 NONAME
- _ZN11QRubberBandD2Ev @ 1095 NONAME
- _ZN11QScriptLine16setDefaultHeightEP11QTextEngine @ 1096 NONAME
- _ZN11QScrollArea10takeWidgetEv @ 1097 NONAME
- _ZN11QScrollArea11eventFilterEP7QObjectP6QEvent @ 1098 NONAME
- _ZN11QScrollArea11qt_metacallEN11QMetaObject4CallEiPPv @ 1099 NONAME
- _ZN11QScrollArea11qt_metacastEPKc @ 1100 NONAME
- _ZN11QScrollArea11resizeEventEP12QResizeEvent @ 1101 NONAME
- _ZN11QScrollArea12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 1102 NONAME
- _ZN11QScrollArea13ensureVisibleEiiii @ 1103 NONAME
- _ZN11QScrollArea16scrollContentsByEii @ 1104 NONAME
- _ZN11QScrollArea16staticMetaObjectE @ 1105 NONAME DATA 16
- _ZN11QScrollArea18focusNextPrevChildEb @ 1106 NONAME
- _ZN11QScrollArea18setWidgetResizableEb @ 1107 NONAME
- _ZN11QScrollArea19ensureWidgetVisibleEP7QWidgetii @ 1108 NONAME
- _ZN11QScrollArea5eventEP6QEvent @ 1109 NONAME
- _ZN11QScrollArea9setWidgetEP7QWidget @ 1110 NONAME
- _ZN11QScrollAreaC1EP7QWidget @ 1111 NONAME
- _ZN11QScrollAreaC1ER18QScrollAreaPrivateP7QWidget @ 1112 NONAME
- _ZN11QScrollAreaC2EP7QWidget @ 1113 NONAME
- _ZN11QScrollAreaC2ER18QScrollAreaPrivateP7QWidget @ 1114 NONAME
- _ZN11QScrollAreaD0Ev @ 1115 NONAME
- _ZN11QScrollAreaD1Ev @ 1116 NONAME
- _ZN11QScrollAreaD2Ev @ 1117 NONAME
- _ZN11QSizePolicy14setControlTypeENS_11ControlTypeE @ 1118 NONAME
- _ZN11QSizePolicy16staticMetaObjectE @ 1119 NONAME DATA 16
- _ZN11QSpacerItem10changeSizeEiiN11QSizePolicy6PolicyES1_ @ 1120 NONAME
- _ZN11QSpacerItem10spacerItemEv @ 1121 NONAME
- _ZN11QSpacerItem11setGeometryERK5QRect @ 1122 NONAME
- _ZN11QStrokerOps10strokePathERK12QPainterPathPvRK10QTransform @ 1123 NONAME
- _ZN11QStrokerOps13strokeEllipseERK6QRectFPvRK10QTransform @ 1124 NONAME
- _ZN11QStrokerOps13strokePolygonEPK7QPointFibPvRK10QTransform @ 1125 NONAME
- _ZN11QStrokerOps3endEv @ 1126 NONAME
- _ZN11QStrokerOps5beginEPv @ 1127 NONAME
- _ZN11QStrokerOpsC2Ev @ 1128 NONAME
- _ZN11QStrokerOpsD0Ev @ 1129 NONAME
- _ZN11QStrokerOpsD1Ev @ 1130 NONAME
- _ZN11QStrokerOpsD2Ev @ 1131 NONAME
- _ZN11QTextCursor10createListEN15QTextListFormat5StyleE @ 1132 NONAME
- _ZN11QTextCursor10createListERK15QTextListFormat @ 1133 NONAME
- _ZN11QTextCursor10deleteCharEv @ 1134 NONAME
- _ZN11QTextCursor10insertHtmlERK7QString @ 1135 NONAME
- _ZN11QTextCursor10insertListEN15QTextListFormat5StyleE @ 1136 NONAME
- _ZN11QTextCursor10insertListERK15QTextListFormat @ 1137 NONAME
- _ZN11QTextCursor10insertTextERK7QString @ 1138 NONAME
- _ZN11QTextCursor10insertTextERK7QStringRK15QTextCharFormat @ 1139 NONAME
- _ZN11QTextCursor11insertBlockERK16QTextBlockFormat @ 1140 NONAME
- _ZN11QTextCursor11insertBlockERK16QTextBlockFormatRK15QTextCharFormat @ 1141 NONAME
- _ZN11QTextCursor11insertBlockEv @ 1142 NONAME
- _ZN11QTextCursor11insertFrameERK16QTextFrameFormat @ 1143 NONAME
- _ZN11QTextCursor11insertImageERK16QTextImageFormat @ 1144 NONAME
- _ZN11QTextCursor11insertImageERK16QTextImageFormatN16QTextFrameFormat8PositionE @ 1145 NONAME
- _ZN11QTextCursor11insertImageERK6QImageRK7QString @ 1146 NONAME
- _ZN11QTextCursor11insertImageERK7QString @ 1147 NONAME
- _ZN11QTextCursor11insertTableEii @ 1148 NONAME
- _ZN11QTextCursor11insertTableEiiRK16QTextTableFormat @ 1149 NONAME
- _ZN11QTextCursor11setPositionEiNS_8MoveModeE @ 1150 NONAME
- _ZN11QTextCursor12endEditBlockEv @ 1151 NONAME
- _ZN11QTextCursor12movePositionENS_13MoveOperationENS_8MoveModeEi @ 1152 NONAME
- _ZN11QTextCursor13setCharFormatERK15QTextCharFormat @ 1153 NONAME
- _ZN11QTextCursor14beginEditBlockEv @ 1154 NONAME
- _ZN11QTextCursor14clearSelectionEv @ 1155 NONAME
- _ZN11QTextCursor14insertFragmentERK21QTextDocumentFragment @ 1156 NONAME
- _ZN11QTextCursor14setBlockFormatERK16QTextBlockFormat @ 1157 NONAME
- _ZN11QTextCursor15mergeCharFormatERK15QTextCharFormat @ 1158 NONAME
- _ZN11QTextCursor16mergeBlockFormatERK16QTextBlockFormat @ 1159 NONAME
- _ZN11QTextCursor18deletePreviousCharEv @ 1160 NONAME
- _ZN11QTextCursor18removeSelectedTextEv @ 1161 NONAME
- _ZN11QTextCursor18setBlockCharFormatERK15QTextCharFormat @ 1162 NONAME
- _ZN11QTextCursor19setVisualNavigationEb @ 1163 NONAME
- _ZN11QTextCursor20mergeBlockCharFormatERK15QTextCharFormat @ 1164 NONAME
- _ZN11QTextCursor21joinPreviousEditBlockEv @ 1165 NONAME
- _ZN11QTextCursor6selectENS_13SelectionTypeE @ 1166 NONAME
- _ZN11QTextCursorC1EP10QTextFrame @ 1167 NONAME
- _ZN11QTextCursorC1EP13QTextDocument @ 1168 NONAME
- _ZN11QTextCursorC1EP18QTextCursorPrivate @ 1169 NONAME
- _ZN11QTextCursorC1EP20QTextDocumentPrivatei @ 1170 NONAME
- _ZN11QTextCursorC1ERK10QTextBlock @ 1171 NONAME
- _ZN11QTextCursorC1ERKS_ @ 1172 NONAME
- _ZN11QTextCursorC1Ev @ 1173 NONAME
- _ZN11QTextCursorC2EP10QTextFrame @ 1174 NONAME
- _ZN11QTextCursorC2EP13QTextDocument @ 1175 NONAME
- _ZN11QTextCursorC2EP18QTextCursorPrivate @ 1176 NONAME
- _ZN11QTextCursorC2EP20QTextDocumentPrivatei @ 1177 NONAME
- _ZN11QTextCursorC2ERK10QTextBlock @ 1178 NONAME
- _ZN11QTextCursorC2ERKS_ @ 1179 NONAME
- _ZN11QTextCursorC2Ev @ 1180 NONAME
- _ZN11QTextCursorD1Ev @ 1181 NONAME
- _ZN11QTextCursorD2Ev @ 1182 NONAME
- _ZN11QTextCursoraSERKS_ @ 1183 NONAME
- _ZN11QTextEngine10freeMemoryEv @ 1184 NONAME
- _ZN11QTextEngine10invalidateEv @ 1185 NONAME
- _ZN11QTextEngine11bidiReorderEiPKhPi @ 1186 NONAME
- _ZN11QTextEngine13clearLineDataEv @ 1187 NONAME
- _ZN11QTextEngine22indexAdditionalFormatsEv @ 1188 NONAME
- _ZN11QTextEngine7justifyERK11QScriptLine @ 1189 NONAME
- _ZN11QTextEngine9shapeLineERK11QScriptLine @ 1190 NONAME
- _ZN11QTextEngineC1ERK7QStringRK5QFont @ 1191 NONAME
- _ZN11QTextEngineC1Ev @ 1192 NONAME
- _ZN11QTextEngineC2ERK7QStringRK5QFont @ 1193 NONAME
- _ZN11QTextEngineC2Ev @ 1194 NONAME
- _ZN11QTextEngineD1Ev @ 1195 NONAME
- _ZN11QTextEngineD2Ev @ 1196 NONAME
- _ZN11QTextFormat11setPropertyEiRK7QVectorI11QTextLengthE @ 1197 NONAME
- _ZN11QTextFormat11setPropertyEiRK8QVariant @ 1198 NONAME
- _ZN11QTextFormat13clearPropertyEi @ 1199 NONAME
- _ZN11QTextFormat14setObjectIndexEi @ 1200 NONAME
- _ZN11QTextFormat16staticMetaObjectE @ 1201 NONAME DATA 16
- _ZN11QTextFormat5mergeERKS_ @ 1202 NONAME
- _ZN11QTextFormatC1ERKS_ @ 1203 NONAME
- _ZN11QTextFormatC1Ei @ 1204 NONAME
- _ZN11QTextFormatC1Ev @ 1205 NONAME
- _ZN11QTextFormatC2ERKS_ @ 1206 NONAME
- _ZN11QTextFormatC2Ei @ 1207 NONAME
- _ZN11QTextFormatC2Ev @ 1208 NONAME
- _ZN11QTextFormatD1Ev @ 1209 NONAME
- _ZN11QTextFormatD2Ev @ 1210 NONAME
- _ZN11QTextFormataSERKS_ @ 1211 NONAME
- _ZN11QTextLayout10createLineEv @ 1212 NONAME
- _ZN11QTextLayout11beginLayoutEv @ 1213 NONAME
- _ZN11QTextLayout11clearLayoutEv @ 1214 NONAME
- _ZN11QTextLayout11setPositionERK7QPointF @ 1215 NONAME
- _ZN11QTextLayout13setTextOptionERK11QTextOption @ 1216 NONAME
- _ZN11QTextLayout14setPreeditAreaEiRK7QString @ 1217 NONAME
- _ZN11QTextLayout15setCacheEnabledEb @ 1218 NONAME
- _ZN11QTextLayout20setAdditionalFormatsERK5QListINS_11FormatRangeEE @ 1219 NONAME
- _ZN11QTextLayout22clearAdditionalFormatsEv @ 1220 NONAME
- _ZN11QTextLayout7setFontERK5QFont @ 1221 NONAME
- _ZN11QTextLayout7setTextERK7QString @ 1222 NONAME
- _ZN11QTextLayout8setFlagsEi @ 1223 NONAME
- _ZN11QTextLayout9endLayoutEv @ 1224 NONAME
- _ZN11QTextLayoutC1ERK10QTextBlock @ 1225 NONAME
- _ZN11QTextLayoutC1ERK7QString @ 1226 NONAME
- _ZN11QTextLayoutC1ERK7QStringRK5QFontP12QPaintDevice @ 1227 NONAME
- _ZN11QTextLayoutC1Ev @ 1228 NONAME
- _ZN11QTextLayoutC2ERK10QTextBlock @ 1229 NONAME
- _ZN11QTextLayoutC2ERK7QString @ 1230 NONAME
- _ZN11QTextLayoutC2ERK7QStringRK5QFontP12QPaintDevice @ 1231 NONAME
- _ZN11QTextLayoutC2Ev @ 1232 NONAME
- _ZN11QTextLayoutD1Ev @ 1233 NONAME
- _ZN11QTextLayoutD2Ev @ 1234 NONAME
- _ZN11QTextObject11qt_metacallEN11QMetaObject4CallEiPPv @ 1235 NONAME
- _ZN11QTextObject11qt_metacastEPKc @ 1236 NONAME
- _ZN11QTextObject16staticMetaObjectE @ 1237 NONAME DATA 16
- _ZN11QTextObject9setFormatERK11QTextFormat @ 1238 NONAME
- _ZN11QTextObjectC1EP13QTextDocument @ 1239 NONAME
- _ZN11QTextObjectC1ER18QTextObjectPrivateP13QTextDocument @ 1240 NONAME
- _ZN11QTextObjectC2EP13QTextDocument @ 1241 NONAME
- _ZN11QTextObjectC2ER18QTextObjectPrivateP13QTextDocument @ 1242 NONAME
- _ZN11QTextObjectD0Ev @ 1243 NONAME
- _ZN11QTextObjectD1Ev @ 1244 NONAME
- _ZN11QTextObjectD2Ev @ 1245 NONAME
- _ZN11QTextOption11setTabArrayE5QListIfE @ 1246 NONAME
- _ZN11QTextOption7setTabsE5QListINS_3TabEE @ 1247 NONAME
- _ZN11QTextOptionC1E6QFlagsIN2Qt13AlignmentFlagEE @ 1248 NONAME
- _ZN11QTextOptionC1ERKS_ @ 1249 NONAME
- _ZN11QTextOptionC1Ev @ 1250 NONAME
- _ZN11QTextOptionC2E6QFlagsIN2Qt13AlignmentFlagEE @ 1251 NONAME
- _ZN11QTextOptionC2ERKS_ @ 1252 NONAME
- _ZN11QTextOptionC2Ev @ 1253 NONAME
- _ZN11QTextOptionD1Ev @ 1254 NONAME
- _ZN11QTextOptionD2Ev @ 1255 NONAME
- _ZN11QTextOptionaSERKS_ @ 1256 NONAME
- _ZN11QToolButton10enterEventEP6QEvent @ 1257 NONAME
- _ZN11QToolButton10leaveEventEP6QEvent @ 1258 NONAME
- _ZN11QToolButton10paintEventEP11QPaintEvent @ 1259 NONAME
- _ZN11QToolButton10timerEventEP11QTimerEvent @ 1260 NONAME
- _ZN11QToolButton11actionEventEP12QActionEvent @ 1261 NONAME
- _ZN11QToolButton11changeEventEP6QEvent @ 1262 NONAME
- _ZN11QToolButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1263 NONAME
- _ZN11QToolButton11qt_metacastEPKc @ 1264 NONAME
- _ZN11QToolButton12setArrowTypeEN2Qt9ArrowTypeE @ 1265 NONAME
- _ZN11QToolButton12setAutoRaiseEb @ 1266 NONAME
- _ZN11QToolButton12setPopupModeENS_19ToolButtonPopupModeE @ 1267 NONAME
- _ZN11QToolButton14nextCheckStateEv @ 1268 NONAME
- _ZN11QToolButton15mousePressEventEP11QMouseEvent @ 1269 NONAME
- _ZN11QToolButton16setDefaultActionEP7QAction @ 1270 NONAME
- _ZN11QToolButton16staticMetaObjectE @ 1271 NONAME DATA 16
- _ZN11QToolButton17mouseReleaseEventEP11QMouseEvent @ 1272 NONAME
- _ZN11QToolButton18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 1273 NONAME
- _ZN11QToolButton5eventEP6QEvent @ 1274 NONAME
- _ZN11QToolButton7setMenuEP5QMenu @ 1275 NONAME
- _ZN11QToolButton8showMenuEv @ 1276 NONAME
- _ZN11QToolButton9triggeredEP7QAction @ 1277 NONAME
- _ZN11QToolButtonC1EP7QWidget @ 1278 NONAME
- _ZN11QToolButtonC1ER18QToolButtonPrivateP7QWidget @ 1279 NONAME
- _ZN11QToolButtonC2EP7QWidget @ 1280 NONAME
- _ZN11QToolButtonC2ER18QToolButtonPrivateP7QWidget @ 1281 NONAME
- _ZN11QToolButtonD0Ev @ 1282 NONAME
- _ZN11QToolButtonD1Ev @ 1283 NONAME
- _ZN11QToolButtonD2Ev @ 1284 NONAME
- _ZN11QTreeWidget10expandItemEPK15QTreeWidgetItem @ 1285 NONAME
- _ZN11QTreeWidget11itemChangedEP15QTreeWidgetItemi @ 1286 NONAME
- _ZN11QTreeWidget11itemClickedEP15QTreeWidgetItemi @ 1287 NONAME
- _ZN11QTreeWidget11itemEnteredEP15QTreeWidgetItemi @ 1288 NONAME
- _ZN11QTreeWidget11itemPressedEP15QTreeWidgetItemi @ 1289 NONAME
- _ZN11QTreeWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 1290 NONAME
- _ZN11QTreeWidget11qt_metacastEPKc @ 1291 NONAME
- _ZN11QTreeWidget12collapseItemEPK15QTreeWidgetItem @ 1292 NONAME
- _ZN11QTreeWidget12dropMimeDataEP15QTreeWidgetItemiPK9QMimeDataN2Qt10DropActionE @ 1293 NONAME
- _ZN11QTreeWidget12itemExpandedEP15QTreeWidgetItem @ 1294 NONAME
- _ZN11QTreeWidget12scrollToItemEPK15QTreeWidgetItemN17QAbstractItemView10ScrollHintE @ 1295 NONAME
- _ZN11QTreeWidget13itemActivatedEP15QTreeWidgetItemi @ 1296 NONAME
- _ZN11QTreeWidget13itemCollapsedEP15QTreeWidgetItem @ 1297 NONAME
- _ZN11QTreeWidget13setHeaderItemEP15QTreeWidgetItem @ 1298 NONAME
- _ZN11QTreeWidget13setItemHiddenEPK15QTreeWidgetItemb @ 1299 NONAME
- _ZN11QTreeWidget13setItemWidgetEP15QTreeWidgetItemiP7QWidget @ 1300 NONAME
- _ZN11QTreeWidget14setColumnCountEi @ 1301 NONAME
- _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItem @ 1302 NONAME
- _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItemi @ 1303 NONAME
- _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItemi6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 1304 NONAME
- _ZN11QTreeWidget15addTopLevelItemEP15QTreeWidgetItem @ 1305 NONAME
- _ZN11QTreeWidget15setHeaderLabelsERK11QStringList @ 1306 NONAME
- _ZN11QTreeWidget15setItemExpandedEPK15QTreeWidgetItemb @ 1307 NONAME
- _ZN11QTreeWidget15setItemSelectedEPK15QTreeWidgetItemb @ 1308 NONAME
- _ZN11QTreeWidget16addTopLevelItemsERK5QListIP15QTreeWidgetItemE @ 1309 NONAME
- _ZN11QTreeWidget16staticMetaObjectE @ 1310 NONAME DATA 16
- _ZN11QTreeWidget16takeTopLevelItemEi @ 1311 NONAME
- _ZN11QTreeWidget17itemDoubleClickedEP15QTreeWidgetItemi @ 1312 NONAME
- _ZN11QTreeWidget17setSelectionModelEP19QItemSelectionModel @ 1313 NONAME
- _ZN11QTreeWidget17setSortingEnabledEb @ 1314 NONAME
- _ZN11QTreeWidget18currentItemChangedEP15QTreeWidgetItemS1_ @ 1315 NONAME
- _ZN11QTreeWidget18insertTopLevelItemEiP15QTreeWidgetItem @ 1316 NONAME
- _ZN11QTreeWidget19indexOfTopLevelItemEP15QTreeWidgetItem @ 1317 NONAME
- _ZN11QTreeWidget19insertTopLevelItemsEiRK5QListIP15QTreeWidgetItemE @ 1318 NONAME
- _ZN11QTreeWidget20itemSelectionChangedEv @ 1319 NONAME
- _ZN11QTreeWidget20openPersistentEditorEP15QTreeWidgetItemi @ 1320 NONAME
- _ZN11QTreeWidget21closePersistentEditorEP15QTreeWidgetItemi @ 1321 NONAME
- _ZN11QTreeWidget25setFirstItemColumnSpannedEPK15QTreeWidgetItemb @ 1322 NONAME
- _ZN11QTreeWidget5clearEv @ 1323 NONAME
- _ZN11QTreeWidget5eventEP6QEvent @ 1324 NONAME
- _ZN11QTreeWidget8editItemEP15QTreeWidgetItemi @ 1325 NONAME
- _ZN11QTreeWidget8setModelEP18QAbstractItemModel @ 1326 NONAME
- _ZN11QTreeWidget9dropEventEP10QDropEvent @ 1327 NONAME
- _ZN11QTreeWidget9sortItemsEiN2Qt9SortOrderE @ 1328 NONAME
- _ZN11QTreeWidgetC1EP7QWidget @ 1329 NONAME
- _ZN11QTreeWidgetC2EP7QWidget @ 1330 NONAME
- _ZN11QTreeWidgetD0Ev @ 1331 NONAME
- _ZN11QTreeWidgetD1Ev @ 1332 NONAME
- _ZN11QTreeWidgetD2Ev @ 1333 NONAME
- _ZN11QVBoxLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 1334 NONAME
- _ZN11QVBoxLayout11qt_metacastEPKc @ 1335 NONAME
- _ZN11QVBoxLayout16staticMetaObjectE @ 1336 NONAME DATA 16
- _ZN11QVBoxLayoutC1EP7QWidget @ 1337 NONAME
- _ZN11QVBoxLayoutC1Ev @ 1338 NONAME
- _ZN11QVBoxLayoutC2EP7QWidget @ 1339 NONAME
- _ZN11QVBoxLayoutC2Ev @ 1340 NONAME
- _ZN11QVBoxLayoutD0Ev @ 1341 NONAME
- _ZN11QVBoxLayoutD1Ev @ 1342 NONAME
- _ZN11QVBoxLayoutD2Ev @ 1343 NONAME
- _ZN11QWheelEventC1ERK6QPointS2_i6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1344 NONAME
- _ZN11QWheelEventC1ERK6QPointi6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1345 NONAME
- _ZN11QWheelEventC2ERK6QPointS2_i6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1346 NONAME
- _ZN11QWheelEventC2ERK6QPointi6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1347 NONAME
- _ZN11QWheelEventD0Ev @ 1348 NONAME
- _ZN11QWheelEventD1Ev @ 1349 NONAME
- _ZN11QWheelEventD2Ev @ 1350 NONAME
- _ZN11QWidgetItem11setGeometryERK5QRect @ 1351 NONAME
- _ZN11QWidgetItem6widgetEv @ 1352 NONAME
- _ZN11QWingedEdge10removeEdgeEi @ 1353 NONAME
- _ZN11QWingedEdge13addBezierEdgeEPK7QBezierRK7QPointFS5_ffi @ 1354 NONAME
- _ZN11QWingedEdge13addBezierEdgeEPK7QBezieriiffi @ 1355 NONAME
- _ZN11QWingedEdge15intersectAndAddEv @ 1356 NONAME
- _ZN11QWingedEdge6insertERK11QPathVertex @ 1357 NONAME
- _ZN11QWingedEdge7addEdgeERK7QPointFS2_PK7QBezierff @ 1358 NONAME
- _ZN11QWingedEdge7addEdgeEiiPK7QBezierff @ 1359 NONAME
- _ZN11QWingedEdge8simplifyEv @ 1360 NONAME
- _ZN11QWingedEdgeC1ERK12QPainterPathS2_ @ 1361 NONAME
- _ZN11QWingedEdgeC1Ev @ 1362 NONAME
- _ZN11QWingedEdgeC2ERK12QPainterPathS2_ @ 1363 NONAME
- _ZN11QWingedEdgeC2Ev @ 1364 NONAME
- _ZN11QWizardPage11cleanupPageEv @ 1365 NONAME
- _ZN11QWizardPage11qt_metacallEN11QMetaObject4CallEiPPv @ 1366 NONAME
- _ZN11QWizardPage11qt_metacastEPKc @ 1367 NONAME
- _ZN11QWizardPage11setSubTitleERK7QString @ 1368 NONAME
- _ZN11QWizardPage12setFinalPageEb @ 1369 NONAME
- _ZN11QWizardPage12validatePageEv @ 1370 NONAME
- _ZN11QWizardPage13registerFieldERK7QStringP7QWidgetPKcS6_ @ 1371 NONAME
- _ZN11QWizardPage13setButtonTextEN7QWizard12WizardButtonERK7QString @ 1372 NONAME
- _ZN11QWizardPage13setCommitPageEb @ 1373 NONAME
- _ZN11QWizardPage14initializePageEv @ 1374 NONAME
- _ZN11QWizardPage15completeChangedEv @ 1375 NONAME
- _ZN11QWizardPage16staticMetaObjectE @ 1376 NONAME DATA 16
- _ZN11QWizardPage8setFieldERK7QStringRK8QVariant @ 1377 NONAME
- _ZN11QWizardPage8setTitleERK7QString @ 1378 NONAME
- _ZN11QWizardPage9setPixmapEN7QWizard12WizardPixmapERK7QPixmap @ 1379 NONAME
- _ZN11QWizardPageC1EP7QWidget @ 1380 NONAME
- _ZN11QWizardPageC2EP7QWidget @ 1381 NONAME
- _ZN12QActionEventC1EiP7QActionS1_ @ 1382 NONAME
- _ZN12QActionEventC2EiP7QActionS1_ @ 1383 NONAME
- _ZN12QActionEventD0Ev @ 1384 NONAME
- _ZN12QActionEventD1Ev @ 1385 NONAME
- _ZN12QActionEventD2Ev @ 1386 NONAME
- _ZN12QActionGroup10setEnabledEb @ 1387 NONAME
- _ZN12QActionGroup10setVisibleEb @ 1388 NONAME
- _ZN12QActionGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1389 NONAME
- _ZN12QActionGroup11qt_metacastEPKc @ 1390 NONAME
- _ZN12QActionGroup12removeActionEP7QAction @ 1391 NONAME
- _ZN12QActionGroup12setExclusiveEb @ 1392 NONAME
- _ZN12QActionGroup16staticMetaObjectE @ 1393 NONAME DATA 16
- _ZN12QActionGroup7hoveredEP7QAction @ 1394 NONAME
- _ZN12QActionGroup8selectedEP7QAction @ 1395 NONAME
- _ZN12QActionGroup9addActionEP7QAction @ 1396 NONAME
- _ZN12QActionGroup9addActionERK5QIconRK7QString @ 1397 NONAME
- _ZN12QActionGroup9addActionERK7QString @ 1398 NONAME
- _ZN12QActionGroup9triggeredEP7QAction @ 1399 NONAME
- _ZN12QActionGroupC1EP7QObject @ 1400 NONAME
- _ZN12QActionGroupC2EP7QObject @ 1401 NONAME
- _ZN12QActionGroupD0Ev @ 1402 NONAME
- _ZN12QActionGroupD1Ev @ 1403 NONAME
- _ZN12QActionGroupD2Ev @ 1404 NONAME
- _ZN12QApplication10allWidgetsEv @ 1405 NONAME
- _ZN12QApplication10commitDataER15QSessionManager @ 1406 NONAME
- _ZN12QApplication10setPaletteERK8QPalettePKc @ 1407 NONAME
- _ZN12QApplication10topLevelAtERK6QPoint @ 1408 NONAME
- _ZN12QApplication10windowIconEv @ 1409 NONAME
- _ZN12QApplication11focusWidgetEv @ 1410 NONAME
- _ZN12QApplication11fontMetricsEv @ 1411 NONAME
- _ZN12QApplication11globalStrutEv @ 1412 NONAME
- _ZN12QApplication11qt_metacallEN11QMetaObject4CallEiPPv @ 1413 NONAME
- _ZN12QApplication11qt_metacastEPKc @ 1414 NONAME
- _ZN12QApplication12activeWindowEv @ 1415 NONAME
- _ZN12QApplication12focusChangedEP7QWidgetS1_ @ 1416 NONAME
- _ZN12QApplication12mouseButtonsEv @ 1417 NONAME
- _ZN12QApplication12setColorSpecEi @ 1418 NONAME
- _ZN12QApplication13compressEventEP6QEventP7QObjectP14QPostEventList @ 1419 NONAME
- _ZN12QApplication13setStyleSheetERK7QString @ 1420 NONAME
- _ZN12QApplication13setWindowIconERK5QIcon @ 1421 NONAME
- _ZN12QApplication13startDragTimeEv @ 1422 NONAME
- _ZN12QApplication14s60EventFilterEP8TWsEvent @ 1423 NONAME
- _ZN12QApplication14setGlobalStrutERK5QSize @ 1424 NONAME
- _ZN12QApplication15closeAllWindowsEv @ 1425 NONAME
- _ZN12QApplication15cursorFlashTimeEv @ 1426 NONAME
- _ZN12QApplication15isEffectEnabledEN2Qt8UIEffectE @ 1427 NONAME
- _ZN12QApplication15layoutDirectionEv @ 1428 NONAME
- _ZN12QApplication15s60ProcessEventEP8TWsEvent @ 1429 NONAME
- _ZN12QApplication15setActiveWindowEP7QWidget @ 1430 NONAME
- _ZN12QApplication15setInputContextEP13QInputContext @ 1431 NONAME
- _ZN12QApplication15topLevelWidgetsEv @ 1432 NONAME
- _ZN12QApplication16lastWindowClosedEv @ 1433 NONAME
- _ZN12QApplication16saveStateRequestER15QSessionManager @ 1434 NONAME
- _ZN12QApplication16setEffectEnabledEN2Qt8UIEffectEb @ 1435 NONAME
- _ZN12QApplication16setStartDragTimeEi @ 1436 NONAME
- _ZN12QApplication16staticMetaObjectE @ 1437 NONAME DATA 16
- _ZN12QApplication16wheelScrollLinesEv @ 1438 NONAME
- _ZN12QApplication17activeModalWidgetEv @ 1439 NONAME
- _ZN12QApplication17activePopupWidgetEv @ 1440 NONAME
- _ZN12QApplication17commitDataRequestER15QSessionManager @ 1441 NONAME
- _ZN12QApplication17keyboardModifiersEv @ 1442 NONAME
- _ZN12QApplication17setAutoSipEnabledEb @ 1443 NONAME
- _ZN12QApplication17setGraphicsSystemERK7QString @ 1444 NONAME
- _ZN12QApplication17startDragDistanceEv @ 1445 NONAME
- _ZN12QApplication18setCursorFlashTimeEi @ 1446 NONAME
- _ZN12QApplication18setLayoutDirectionEN2Qt15LayoutDirectionE @ 1447 NONAME
- _ZN12QApplication19autoSipOnMouseFocusEv @ 1448 NONAME ABSENT
- _ZN12QApplication19doubleClickIntervalEv @ 1449 NONAME
- _ZN12QApplication19fontDatabaseChangedEv @ 1450 NONAME
- _ZN12QApplication19keyboardInputLocaleEv @ 1451 NONAME
- _ZN12QApplication19setWheelScrollLinesEi @ 1452 NONAME
- _ZN12QApplication20desktopSettingsAwareEv @ 1453 NONAME
- _ZN12QApplication20setStartDragDistanceEi @ 1454 NONAME
- _ZN12QApplication20symbianHandleCommandEi @ 1455 NONAME
- _ZN12QApplication21keyboardInputIntervalEv @ 1456 NONAME
- _ZN12QApplication21symbianResourceChangeEi @ 1457 NONAME
- _ZN12QApplication22keyboardInputDirectionEv @ 1458 NONAME
- _ZN12QApplication22quitOnLastWindowClosedEv @ 1459 NONAME
- _ZN12QApplication22setAutoSipOnMouseFocusEb @ 1460 NONAME ABSENT
- _ZN12QApplication22setDoubleClickIntervalEi @ 1461 NONAME
- _ZN12QApplication23keypadNavigationEnabledEv @ 1462 NONAME
- _ZN12QApplication23setDesktopSettingsAwareEb @ 1463 NONAME
- _ZN12QApplication24setKeyboardInputIntervalEi @ 1464 NONAME
- _ZN12QApplication25setQuitOnLastWindowClosedEb @ 1465 NONAME
- _ZN12QApplication26setKeypadNavigationEnabledEb @ 1466 NONAME
- _ZN12QApplication4beepEv @ 1467 NONAME
- _ZN12QApplication4execEv @ 1468 NONAME
- _ZN12QApplication4fontEPK7QWidget @ 1469 NONAME
- _ZN12QApplication4fontEPKc @ 1470 NONAME
- _ZN12QApplication4fontEv @ 1471 NONAME
- _ZN12QApplication4typeEv @ 1472 NONAME
- _ZN12QApplication5alertEP7QWidgeti @ 1473 NONAME
- _ZN12QApplication5eventEP6QEvent @ 1474 NONAME
- _ZN12QApplication5styleEv @ 1475 NONAME
- _ZN12QApplication5syncXEv @ 1476 NONAME
- _ZN12QApplication6notifyEP7QObjectP6QEvent @ 1477 NONAME
- _ZN12QApplication7aboutQtEv @ 1478 NONAME
- _ZN12QApplication7desktopEv @ 1479 NONAME
- _ZN12QApplication7paletteEPK7QWidget @ 1480 NONAME
- _ZN12QApplication7paletteEPKc @ 1481 NONAME
- _ZN12QApplication7paletteEv @ 1482 NONAME
- _ZN12QApplication7setFontERK5QFontPKc @ 1483 NONAME
- _ZN12QApplication8setStyleEP6QStyle @ 1484 NONAME
- _ZN12QApplication8setStyleERK7QString @ 1485 NONAME
- _ZN12QApplication8widgetAtERK6QPoint @ 1486 NONAME
- _ZN12QApplication9clipboardEv @ 1487 NONAME
- _ZN12QApplication9colorSpecEv @ 1488 NONAME
- _ZN12QApplication9saveStateER15QSessionManager @ 1489 NONAME
- _ZN12QApplicationC1ERiPPc @ 1490 NONAME
- _ZN12QApplicationC1ERiPPcNS_4TypeE @ 1491 NONAME
- _ZN12QApplicationC1ERiPPcNS_4TypeEi @ 1492 NONAME
- _ZN12QApplicationC1ERiPPcb @ 1493 NONAME
- _ZN12QApplicationC1ERiPPcbi @ 1494 NONAME
- _ZN12QApplicationC1ERiPPci @ 1495 NONAME
- _ZN12QApplicationC2ERiPPc @ 1496 NONAME
- _ZN12QApplicationC2ERiPPcNS_4TypeE @ 1497 NONAME
- _ZN12QApplicationC2ERiPPcNS_4TypeEi @ 1498 NONAME
- _ZN12QApplicationC2ERiPPcb @ 1499 NONAME
- _ZN12QApplicationC2ERiPPcbi @ 1500 NONAME
- _ZN12QApplicationC2ERiPPci @ 1501 NONAME
- _ZN12QApplicationD0Ev @ 1502 NONAME
- _ZN12QApplicationD1Ev @ 1503 NONAME
- _ZN12QApplicationD2Ev @ 1504 NONAME
- _ZN12QButtonGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1505 NONAME
- _ZN12QButtonGroup11qt_metacastEPKc @ 1506 NONAME
- _ZN12QButtonGroup12removeButtonEP15QAbstractButton @ 1507 NONAME
- _ZN12QButtonGroup12setExclusiveEb @ 1508 NONAME
- _ZN12QButtonGroup13buttonClickedEP15QAbstractButton @ 1509 NONAME
- _ZN12QButtonGroup13buttonClickedEi @ 1510 NONAME
- _ZN12QButtonGroup13buttonPressedEP15QAbstractButton @ 1511 NONAME
- _ZN12QButtonGroup13buttonPressedEi @ 1512 NONAME
- _ZN12QButtonGroup14buttonReleasedEP15QAbstractButton @ 1513 NONAME
- _ZN12QButtonGroup14buttonReleasedEi @ 1514 NONAME
- _ZN12QButtonGroup16staticMetaObjectE @ 1515 NONAME DATA 16
- _ZN12QButtonGroup5setIdEP15QAbstractButtoni @ 1516 NONAME
- _ZN12QButtonGroup9addButtonEP15QAbstractButton @ 1517 NONAME
- _ZN12QButtonGroup9addButtonEP15QAbstractButtoni @ 1518 NONAME
- _ZN12QButtonGroupC1EP7QObject @ 1519 NONAME
- _ZN12QButtonGroupC2EP7QObject @ 1520 NONAME
- _ZN12QButtonGroupD0Ev @ 1521 NONAME
- _ZN12QButtonGroupD1Ev @ 1522 NONAME
- _ZN12QButtonGroupD2Ev @ 1523 NONAME
- _ZN12QColorDialog10setOptionsE6QFlagsINS_17ColorDialogOptionEE @ 1524 NONAME
- _ZN12QColorDialog10setVisibleEb @ 1525 NONAME
- _ZN12QColorDialog11changeEventEP6QEvent @ 1526 NONAME
- _ZN12QColorDialog11customColorEi @ 1527 NONAME
- _ZN12QColorDialog11customCountEv @ 1528 NONAME
- _ZN12QColorDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 1529 NONAME
- _ZN12QColorDialog11qt_metacastEPKc @ 1530 NONAME
- _ZN12QColorDialog13colorSelectedERK6QColor @ 1531 NONAME
- _ZN12QColorDialog14setCustomColorEij @ 1532 NONAME
- _ZN12QColorDialog15setCurrentColorERK6QColor @ 1533 NONAME
- _ZN12QColorDialog16setStandardColorEij @ 1534 NONAME
- _ZN12QColorDialog16staticMetaObjectE @ 1535 NONAME DATA 16
- _ZN12QColorDialog19currentColorChangedERK6QColor @ 1536 NONAME
- _ZN12QColorDialog4doneEi @ 1537 NONAME
- _ZN12QColorDialog4openEP7QObjectPKc @ 1538 NONAME
- _ZN12QColorDialog7getRgbaEjPbP7QWidget @ 1539 NONAME
- _ZN12QColorDialog8getColorERK6QColorP7QWidget @ 1540 NONAME
- _ZN12QColorDialog8getColorERK6QColorP7QWidgetRK7QString6QFlagsINS_17ColorDialogOptionEE @ 1541 NONAME
- _ZN12QColorDialog9setOptionENS_17ColorDialogOptionEb @ 1542 NONAME
- _ZN12QColorDialogC1EP7QWidget @ 1543 NONAME
- _ZN12QColorDialogC1ERK6QColorP7QWidget @ 1544 NONAME
- _ZN12QColorDialogC2EP7QWidget @ 1545 NONAME
- _ZN12QColorDialogC2ERK6QColorP7QWidget @ 1546 NONAME
- _ZN12QColorDialogD0Ev @ 1547 NONAME
- _ZN12QColorDialogD1Ev @ 1548 NONAME
- _ZN12QColorDialogD2Ev @ 1549 NONAME
- _ZN12QCommonStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 1550 NONAME
- _ZN12QCommonStyle11qt_metacastEPKc @ 1551 NONAME
- _ZN12QCommonStyle16staticMetaObjectE @ 1552 NONAME DATA 16
- _ZN12QCommonStyle6polishEP12QApplication @ 1553 NONAME
- _ZN12QCommonStyle6polishEP7QWidget @ 1554 NONAME
- _ZN12QCommonStyle6polishER8QPalette @ 1555 NONAME
- _ZN12QCommonStyle8unpolishEP12QApplication @ 1556 NONAME
- _ZN12QCommonStyle8unpolishEP7QWidget @ 1557 NONAME
- _ZN12QCommonStyleC1ER19QCommonStylePrivate @ 1558 NONAME
- _ZN12QCommonStyleC1Ev @ 1559 NONAME
- _ZN12QCommonStyleC2ER19QCommonStylePrivate @ 1560 NONAME
- _ZN12QCommonStyleC2Ev @ 1561 NONAME
- _ZN12QCommonStyleD0Ev @ 1562 NONAME
- _ZN12QCommonStyleD1Ev @ 1563 NONAME
- _ZN12QCommonStyleD2Ev @ 1564 NONAME
- _ZN12QDashStroker15patternForStyleEN2Qt8PenStyleE @ 1565 NONAME
- _ZN12QDashStroker21processCurrentSubpathEv @ 1566 NONAME
- _ZN12QDashStrokerC1EP8QStroker @ 1567 NONAME
- _ZN12QDashStrokerC2EP8QStroker @ 1568 NONAME
- _ZN12QDragManager10timerEventEP11QTimerEvent @ 1569 NONAME ABSENT
- _ZN12QDragManager11eventFilterEP7QObjectP6QEvent @ 1570 NONAME ABSENT
- _ZN12QDragManager11qt_metacallEN11QMetaObject4CallEiPPv @ 1571 NONAME ABSENT
- _ZN12QDragManager11qt_metacastEPKc @ 1572 NONAME ABSENT
- _ZN12QDragManager12updateCursorEv @ 1573 NONAME ABSENT
- _ZN12QDragManager12updatePixmapEv @ 1574 NONAME ABSENT
- _ZN12QDragManager13currentTargetEv @ 1575 NONAME ABSENT
- _ZN12QDragManager16setCurrentTargetEP7QWidgetb @ 1576 NONAME ABSENT
- _ZN12QDragManager16staticMetaObjectE @ 1577 NONAME DATA 16 ABSENT
- _ZN12QDragManager4dragEP5QDrag @ 1578 NONAME ABSENT
- _ZN12QDragManager4dropEv @ 1579 NONAME ABSENT
- _ZN12QDragManager4moveERK6QPoint @ 1580 NONAME ABSENT
- _ZN12QDragManager4selfEv @ 1581 NONAME ABSENT
- _ZN12QDragManager6cancelEb @ 1582 NONAME ABSENT
- _ZN12QDragManager8instanceE @ 1583 NONAME DATA 4 ABSENT
- _ZN12QDragManagerC1Ev @ 1584 NONAME ABSENT
- _ZN12QDragManagerC2Ev @ 1585 NONAME ABSENT
- _ZN12QDragManagerD0Ev @ 1586 NONAME ABSENT
- _ZN12QDragManagerD1Ev @ 1587 NONAME ABSENT
- _ZN12QDragManagerD2Ev @ 1588 NONAME ABSENT
- _ZN12QFontMetricsC1ERK5QFont @ 1589 NONAME
- _ZN12QFontMetricsC1ERK5QFontP12QPaintDevice @ 1590 NONAME
- _ZN12QFontMetricsC1ERKS_ @ 1591 NONAME
- _ZN12QFontMetricsC2ERK5QFont @ 1592 NONAME
- _ZN12QFontMetricsC2ERK5QFontP12QPaintDevice @ 1593 NONAME
- _ZN12QFontMetricsC2ERKS_ @ 1594 NONAME
- _ZN12QFontMetricsD1Ev @ 1595 NONAME
- _ZN12QFontMetricsD2Ev @ 1596 NONAME
- _ZN12QFontMetricsaSERKS_ @ 1597 NONAME
- _ZN12QFontMetricseqERKS_ @ 1598 NONAME
- _ZN12QFontPrivate7resolveEjPKS_ @ 1599 NONAME
- _ZN12QFontPrivateC1ERKS_ @ 1600 NONAME
- _ZN12QFontPrivateC1Ev @ 1601 NONAME
- _ZN12QFontPrivateC2ERKS_ @ 1602 NONAME
- _ZN12QFontPrivateC2Ev @ 1603 NONAME
- _ZN12QFontPrivateD1Ev @ 1604 NONAME
- _ZN12QFontPrivateD2Ev @ 1605 NONAME
- _ZN12QImageReader10setQualityEi @ 1606 NONAME
- _ZN12QImageReader11imageFormatEP9QIODevice @ 1607 NONAME
- _ZN12QImageReader11imageFormatERK7QString @ 1608 NONAME
- _ZN12QImageReader11jumpToImageEi @ 1609 NONAME
- _ZN12QImageReader11setClipRectERK5QRect @ 1610 NONAME
- _ZN12QImageReader11setFileNameERK7QString @ 1611 NONAME
- _ZN12QImageReader13setScaledSizeERK5QSize @ 1612 NONAME
- _ZN12QImageReader15jumpToNextImageEv @ 1613 NONAME
- _ZN12QImageReader17setScaledClipRectERK5QRect @ 1614 NONAME
- _ZN12QImageReader18setBackgroundColorERK6QColor @ 1615 NONAME
- _ZN12QImageReader21supportedImageFormatsEv @ 1616 NONAME
- _ZN12QImageReader24setAutoDetectImageFormatEb @ 1617 NONAME
- _ZN12QImageReader4readEP6QImage @ 1618 NONAME
- _ZN12QImageReader4readEv @ 1619 NONAME
- _ZN12QImageReader9setDeviceEP9QIODevice @ 1620 NONAME
- _ZN12QImageReader9setFormatERK10QByteArray @ 1621 NONAME
- _ZN12QImageReaderC1EP9QIODeviceRK10QByteArray @ 1622 NONAME
- _ZN12QImageReaderC1ERK7QStringRK10QByteArray @ 1623 NONAME
- _ZN12QImageReaderC1Ev @ 1624 NONAME
- _ZN12QImageReaderC2EP9QIODeviceRK10QByteArray @ 1625 NONAME
- _ZN12QImageReaderC2ERK7QStringRK10QByteArray @ 1626 NONAME
- _ZN12QImageReaderC2Ev @ 1627 NONAME
- _ZN12QImageReaderD1Ev @ 1628 NONAME
- _ZN12QImageReaderD2Ev @ 1629 NONAME
- _ZN12QImageWriter10setQualityEi @ 1630 NONAME
- _ZN12QImageWriter11setFileNameERK7QString @ 1631 NONAME
- _ZN12QImageWriter14setCompressionEi @ 1632 NONAME
- _ZN12QImageWriter14setDescriptionERK7QString @ 1633 NONAME
- _ZN12QImageWriter21supportedImageFormatsEv @ 1634 NONAME
- _ZN12QImageWriter5writeERK6QImage @ 1635 NONAME
- _ZN12QImageWriter7setTextERK7QStringS2_ @ 1636 NONAME
- _ZN12QImageWriter8setGammaEf @ 1637 NONAME
- _ZN12QImageWriter9setDeviceEP9QIODevice @ 1638 NONAME
- _ZN12QImageWriter9setFormatERK10QByteArray @ 1639 NONAME
- _ZN12QImageWriterC1EP9QIODeviceRK10QByteArray @ 1640 NONAME
- _ZN12QImageWriterC1ERK7QStringRK10QByteArray @ 1641 NONAME
- _ZN12QImageWriterC1Ev @ 1642 NONAME
- _ZN12QImageWriterC2EP9QIODeviceRK10QByteArray @ 1643 NONAME
- _ZN12QImageWriterC2ERK7QStringRK10QByteArray @ 1644 NONAME
- _ZN12QImageWriterC2Ev @ 1645 NONAME
- _ZN12QImageWriterD1Ev @ 1646 NONAME
- _ZN12QImageWriterD2Ev @ 1647 NONAME
- _ZN12QInputDialog10getIntegerEP7QWidgetRK7QStringS4_iiiiPb6QFlagsIN2Qt10WindowTypeEE @ 1648 NONAME
- _ZN12QInputDialog10setIntStepEi @ 1649 NONAME
- _ZN12QInputDialog10setOptionsE6QFlagsINS_17InputDialogOptionEE @ 1650 NONAME
- _ZN12QInputDialog10setVisibleEb @ 1651 NONAME
- _ZN12QInputDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 1652 NONAME
- _ZN12QInputDialog11qt_metacastEPKc @ 1653 NONAME
- _ZN12QInputDialog11setIntRangeEii @ 1654 NONAME
- _ZN12QInputDialog11setIntValueEi @ 1655 NONAME
- _ZN12QInputDialog12setInputModeENS_9InputModeE @ 1656 NONAME
- _ZN12QInputDialog12setLabelTextERK7QString @ 1657 NONAME
- _ZN12QInputDialog12setTextValueERK7QString @ 1658 NONAME
- _ZN12QInputDialog13setIntMaximumEi @ 1659 NONAME
- _ZN12QInputDialog13setIntMinimumEi @ 1660 NONAME
- _ZN12QInputDialog14setDoubleRangeEdd @ 1661 NONAME
- _ZN12QInputDialog14setDoubleValueEd @ 1662 NONAME
- _ZN12QInputDialog15intValueChangedEi @ 1663 NONAME
- _ZN12QInputDialog15setOkButtonTextERK7QString @ 1664 NONAME
- _ZN12QInputDialog15setTextEchoModeEN9QLineEdit8EchoModeE @ 1665 NONAME
- _ZN12QInputDialog16intValueSelectedEi @ 1666 NONAME
- _ZN12QInputDialog16setComboBoxItemsERK11QStringList @ 1667 NONAME
- _ZN12QInputDialog16setDoubleMaximumEd @ 1668 NONAME
- _ZN12QInputDialog16setDoubleMinimumEd @ 1669 NONAME
- _ZN12QInputDialog16staticMetaObjectE @ 1670 NONAME DATA 16
- _ZN12QInputDialog16textValueChangedERK7QString @ 1671 NONAME
- _ZN12QInputDialog17setDoubleDecimalsEi @ 1672 NONAME
- _ZN12QInputDialog17textValueSelectedERK7QString @ 1673 NONAME
- _ZN12QInputDialog18doubleValueChangedEd @ 1674 NONAME
- _ZN12QInputDialog19doubleValueSelectedEd @ 1675 NONAME
- _ZN12QInputDialog19setCancelButtonTextERK7QString @ 1676 NONAME
- _ZN12QInputDialog19setComboBoxEditableEb @ 1677 NONAME
- _ZN12QInputDialog4doneEi @ 1678 NONAME
- _ZN12QInputDialog4openEP7QObjectPKc @ 1679 NONAME
- _ZN12QInputDialog6getIntEP7QWidgetRK7QStringS4_iiiiPb6QFlagsIN2Qt10WindowTypeEE @ 1680 NONAME
- _ZN12QInputDialog7getItemEP7QWidgetRK7QStringS4_RK11QStringListibPb6QFlagsIN2Qt10WindowTypeEE @ 1681 NONAME
- _ZN12QInputDialog7getTextEP7QWidgetRK7QStringS4_N9QLineEdit8EchoModeES4_Pb6QFlagsIN2Qt10WindowTypeEE @ 1682 NONAME
- _ZN12QInputDialog9getDoubleEP7QWidgetRK7QStringS4_dddiPb6QFlagsIN2Qt10WindowTypeEE @ 1683 NONAME
- _ZN12QInputDialog9setOptionENS_17InputDialogOptionEb @ 1684 NONAME
- _ZN12QInputDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1685 NONAME
- _ZN12QInputDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1686 NONAME
- _ZN12QInputDialogD0Ev @ 1687 NONAME
- _ZN12QInputDialogD1Ev @ 1688 NONAME
- _ZN12QInputDialogD2Ev @ 1689 NONAME
- _ZN12QKeySequence10fromStringERK7QStringNS_14SequenceFormatE @ 1690 NONAME
- _ZN12QKeySequence11keyBindingsENS_11StandardKeyE @ 1691 NONAME
- _ZN12QKeySequence12decodeStringERK7QString @ 1692 NONAME
- _ZN12QKeySequence12encodeStringEi @ 1693 NONAME
- _ZN12QKeySequence6assignERK7QString @ 1694 NONAME
- _ZN12QKeySequence6setKeyEii @ 1695 NONAME
- _ZN12QKeySequence8mnemonicERK7QString @ 1696 NONAME
- _ZN12QKeySequenceC1ENS_11StandardKeyE @ 1697 NONAME
- _ZN12QKeySequenceC1ERK7QString @ 1698 NONAME
- _ZN12QKeySequenceC1ERKS_ @ 1699 NONAME
- _ZN12QKeySequenceC1Eiiii @ 1700 NONAME
- _ZN12QKeySequenceC1Ev @ 1701 NONAME
- _ZN12QKeySequenceC2ENS_11StandardKeyE @ 1702 NONAME
- _ZN12QKeySequenceC2ERK7QString @ 1703 NONAME
- _ZN12QKeySequenceC2ERKS_ @ 1704 NONAME
- _ZN12QKeySequenceC2Eiiii @ 1705 NONAME
- _ZN12QKeySequenceC2Ev @ 1706 NONAME
- _ZN12QKeySequenceD1Ev @ 1707 NONAME
- _ZN12QKeySequenceD2Ev @ 1708 NONAME
- _ZN12QKeySequenceaSERKS_ @ 1709 NONAME
- _ZN12QNativeImage12systemFormatEv @ 1710 NONAME ABSENT
- _ZN12QNativeImageC1EiiN6QImage6FormatEbP7QWidget @ 1711 NONAME ABSENT
- _ZN12QNativeImageC2EiiN6QImage6FormatEbP7QWidget @ 1712 NONAME ABSENT
- _ZN12QNativeImageD1Ev @ 1713 NONAME ABSENT
- _ZN12QNativeImageD2Ev @ 1714 NONAME ABSENT
- _ZN12QPaintDeviceC2Ev @ 1715 NONAME
- _ZN12QPaintDeviceD0Ev @ 1716 NONAME
- _ZN12QPaintDeviceD1Ev @ 1717 NONAME
- _ZN12QPaintDeviceD2Ev @ 1718 NONAME
- _ZN12QPaintEngine10drawPointsEPK6QPointi @ 1719 NONAME
- _ZN12QPaintEngine10drawPointsEPK7QPointFi @ 1720 NONAME
- _ZN12QPaintEngine11drawEllipseERK5QRect @ 1721 NONAME
- _ZN12QPaintEngine11drawEllipseERK6QRectF @ 1722 NONAME
- _ZN12QPaintEngine11drawPolygonEPK6QPointiNS_15PolygonDrawModeE @ 1723 NONAME
- _ZN12QPaintEngine11drawPolygonEPK7QPointFiNS_15PolygonDrawModeE @ 1724 NONAME
- _ZN12QPaintEngine12drawTextItemERK7QPointFRK9QTextItem @ 1725 NONAME
- _ZN12QPaintEngine13setSystemClipERK7QRegion @ 1726 NONAME
- _ZN12QPaintEngine13setSystemRectERK5QRect @ 1727 NONAME
- _ZN12QPaintEngine14setPaintDeviceEP12QPaintDevice @ 1728 NONAME
- _ZN12QPaintEngine15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 1729 NONAME
- _ZN12QPaintEngine8drawPathERK12QPainterPath @ 1730 NONAME
- _ZN12QPaintEngine9drawImageERK6QRectFRK6QImageS2_6QFlagsIN2Qt19ImageConversionFlagEE @ 1731 NONAME
- _ZN12QPaintEngine9drawLinesEPK5QLinei @ 1732 NONAME
- _ZN12QPaintEngine9drawLinesEPK6QLineFi @ 1733 NONAME
- _ZN12QPaintEngine9drawRectsEPK5QRecti @ 1734 NONAME
- _ZN12QPaintEngine9drawRectsEPK6QRectFi @ 1735 NONAME
- _ZN12QPaintEngine9syncStateEv @ 1736 NONAME
- _ZN12QPaintEngineC2E6QFlagsINS_18PaintEngineFeatureEE @ 1737 NONAME
- _ZN12QPaintEngineC2ER19QPaintEnginePrivate6QFlagsINS_18PaintEngineFeatureEE @ 1738 NONAME
- _ZN12QPaintEngineD0Ev @ 1739 NONAME
- _ZN12QPaintEngineD1Ev @ 1740 NONAME
- _ZN12QPaintEngineD2Ev @ 1741 NONAME
- _ZN12QPainterPath10addEllipseERK6QRectF @ 1742 NONAME
- _ZN12QPainterPath10addPolygonERK9QPolygonF @ 1743 NONAME
- _ZN12QPainterPath11connectPathERKS_ @ 1744 NONAME
- _ZN12QPainterPath11setFillRuleEN2Qt8FillRuleE @ 1745 NONAME
- _ZN12QPainterPath12addRoundRectERK6QRectFii @ 1746 NONAME
- _ZN12QPainterPath12closeSubpathEv @ 1747 NONAME
- _ZN12QPainterPath13detach_helperEv @ 1748 NONAME
- _ZN12QPainterPath14addRoundedRectERK6QRectFffN2Qt8SizeModeE @ 1749 NONAME
- _ZN12QPainterPath17ensureData_helperEv @ 1750 NONAME
- _ZN12QPainterPath5arcToERK6QRectFff @ 1751 NONAME
- _ZN12QPainterPath6lineToERK7QPointF @ 1752 NONAME
- _ZN12QPainterPath6moveToERK7QPointF @ 1753 NONAME
- _ZN12QPainterPath6quadToERK7QPointFS2_ @ 1754 NONAME
- _ZN12QPainterPath7addPathERKS_ @ 1755 NONAME
- _ZN12QPainterPath7addRectERK6QRectF @ 1756 NONAME
- _ZN12QPainterPath7addTextERK7QPointFRK5QFontRK7QString @ 1757 NONAME
- _ZN12QPainterPath7cubicToERK7QPointFS2_S2_ @ 1758 NONAME
- _ZN12QPainterPath8setDirtyEb @ 1759 NONAME
- _ZN12QPainterPath9addRegionERK7QRegion @ 1760 NONAME
- _ZN12QPainterPath9arcMoveToERK6QRectFf @ 1761 NONAME
- _ZN12QPainterPathC1ERK7QPointF @ 1762 NONAME
- _ZN12QPainterPathC1ERKS_ @ 1763 NONAME
- _ZN12QPainterPathC1Ev @ 1764 NONAME
- _ZN12QPainterPathC2ERK7QPointF @ 1765 NONAME
- _ZN12QPainterPathC2ERKS_ @ 1766 NONAME
- _ZN12QPainterPathC2Ev @ 1767 NONAME
- _ZN12QPainterPathD1Ev @ 1768 NONAME
- _ZN12QPainterPathD2Ev @ 1769 NONAME
- _ZN12QPainterPathaNERKS_ @ 1770 NONAME
- _ZN12QPainterPathaSERKS_ @ 1771 NONAME
- _ZN12QPainterPathmIERKS_ @ 1772 NONAME
- _ZN12QPainterPathoRERKS_ @ 1773 NONAME
- _ZN12QPainterPathpLERKS_ @ 1774 NONAME
- _ZN12QPathClipper19handleCrossingEdgesER11QWingedEdgefNS_11ClipperModeE @ 1775 NONAME
- _ZN12QPathClipper4clipENS_9OperationE @ 1776 NONAME
- _ZN12QPathClipper6doClipER11QWingedEdgeNS_11ClipperModeE @ 1777 NONAME
- _ZN12QPathClipper8containsEv @ 1778 NONAME
- _ZN12QPathClipper9intersectEv @ 1779 NONAME
- _ZN12QPathClipperC1ERK12QPainterPathS2_ @ 1780 NONAME
- _ZN12QPathClipperC2ERK12QPainterPathS2_ @ 1781 NONAME
- _ZN12QPixmapCache10cacheLimitEv @ 1782 NONAME
- _ZN12QPixmapCache13setCacheLimitEi @ 1783 NONAME
- _ZN12QPixmapCache4findERK7QString @ 1784 NONAME
- _ZN12QPixmapCache4findERK7QStringR7QPixmap @ 1785 NONAME
- _ZN12QPixmapCache5clearEv @ 1786 NONAME
- _ZN12QPixmapCache6insertERK7QStringRK7QPixmap @ 1787 NONAME
- _ZN12QPixmapCache6removeERK7QString @ 1788 NONAME
- _ZN12QProgressBar10paintEventEP11QPaintEvent @ 1789 NONAME
- _ZN12QProgressBar10setMaximumEi @ 1790 NONAME
- _ZN12QProgressBar10setMinimumEi @ 1791 NONAME
- _ZN12QProgressBar11qt_metacallEN11QMetaObject4CallEiPPv @ 1792 NONAME
- _ZN12QProgressBar11qt_metacastEPKc @ 1793 NONAME
- _ZN12QProgressBar12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 1794 NONAME
- _ZN12QProgressBar12valueChangedEi @ 1795 NONAME
- _ZN12QProgressBar13textDirectionEv @ 1796 NONAME
- _ZN12QProgressBar14setOrientationEN2Qt11OrientationE @ 1797 NONAME
- _ZN12QProgressBar14setTextVisibleEb @ 1798 NONAME
- _ZN12QProgressBar16setTextDirectionENS_9DirectionE @ 1799 NONAME
- _ZN12QProgressBar16staticMetaObjectE @ 1800 NONAME DATA 16
- _ZN12QProgressBar18invertedAppearanceEv @ 1801 NONAME
- _ZN12QProgressBar21setInvertedAppearanceEb @ 1802 NONAME
- _ZN12QProgressBar5eventEP6QEvent @ 1803 NONAME
- _ZN12QProgressBar5resetEv @ 1804 NONAME
- _ZN12QProgressBar8setRangeEii @ 1805 NONAME
- _ZN12QProgressBar8setValueEi @ 1806 NONAME
- _ZN12QProgressBar9setFormatERK7QString @ 1807 NONAME
- _ZN12QProgressBarC1EP7QWidget @ 1808 NONAME
- _ZN12QProgressBarC2EP7QWidget @ 1809 NONAME
- _ZN12QRadioButton10paintEventEP11QPaintEvent @ 1810 NONAME
- _ZN12QRadioButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1811 NONAME
- _ZN12QRadioButton11qt_metacastEPKc @ 1812 NONAME
- _ZN12QRadioButton14mouseMoveEventEP11QMouseEvent @ 1813 NONAME
- _ZN12QRadioButton16staticMetaObjectE @ 1814 NONAME DATA 16
- _ZN12QRadioButton5eventEP6QEvent @ 1815 NONAME
- _ZN12QRadioButtonC1EP7QWidget @ 1816 NONAME
- _ZN12QRadioButtonC1ERK7QStringP7QWidget @ 1817 NONAME
- _ZN12QRadioButtonC2EP7QWidget @ 1818 NONAME
- _ZN12QRadioButtonC2ERK7QStringP7QWidget @ 1819 NONAME
- _ZN12QResizeEventC1ERK5QSizeS2_ @ 1820 NONAME
- _ZN12QResizeEventC2ERK5QSizeS2_ @ 1821 NONAME
- _ZN12QResizeEventD0Ev @ 1822 NONAME
- _ZN12QResizeEventD1Ev @ 1823 NONAME
- _ZN12QResizeEventD2Ev @ 1824 NONAME
- _ZN12QStyleOption4initEPK7QWidget @ 1825 NONAME
- _ZN12QStyleOptionC1ERKS_ @ 1826 NONAME
- _ZN12QStyleOptionC1Eii @ 1827 NONAME
- _ZN12QStyleOptionC2ERKS_ @ 1828 NONAME
- _ZN12QStyleOptionC2Eii @ 1829 NONAME
- _ZN12QStyleOptionD1Ev @ 1830 NONAME
- _ZN12QStyleOptionD2Ev @ 1831 NONAME
- _ZN12QStyleOptionaSERKS_ @ 1832 NONAME
- _ZN12QStylePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 1833 NONAME
- _ZN12QStylePlugin11qt_metacastEPKc @ 1834 NONAME
- _ZN12QStylePlugin16staticMetaObjectE @ 1835 NONAME DATA 16
- _ZN12QStylePluginC2EP7QObject @ 1836 NONAME
- _ZN12QStylePluginD0Ev @ 1837 NONAME
- _ZN12QStylePluginD1Ev @ 1838 NONAME
- _ZN12QStylePluginD2Ev @ 1839 NONAME
- _ZN12QTableWidget11cellChangedEii @ 1840 NONAME
- _ZN12QTableWidget11cellClickedEii @ 1841 NONAME
- _ZN12QTableWidget11cellEnteredEii @ 1842 NONAME
- _ZN12QTableWidget11cellPressedEii @ 1843 NONAME
- _ZN12QTableWidget11itemChangedEP16QTableWidgetItem @ 1844 NONAME
- _ZN12QTableWidget11itemClickedEP16QTableWidgetItem @ 1845 NONAME
- _ZN12QTableWidget11itemEnteredEP16QTableWidgetItem @ 1846 NONAME
- _ZN12QTableWidget11itemPressedEP16QTableWidgetItem @ 1847 NONAME
- _ZN12QTableWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 1848 NONAME
- _ZN12QTableWidget11qt_metacastEPKc @ 1849 NONAME
- _ZN12QTableWidget11setRowCountEi @ 1850 NONAME
- _ZN12QTableWidget12dropMimeDataEiiPK9QMimeDataN2Qt10DropActionE @ 1851 NONAME
- _ZN12QTableWidget12insertColumnEi @ 1852 NONAME
- _ZN12QTableWidget12removeColumnEi @ 1853 NONAME
- _ZN12QTableWidget12scrollToItemEPK16QTableWidgetItemN17QAbstractItemView10ScrollHintE @ 1854 NONAME
- _ZN12QTableWidget13cellActivatedEii @ 1855 NONAME
- _ZN12QTableWidget13clearContentsEv @ 1856 NONAME
- _ZN12QTableWidget13itemActivatedEP16QTableWidgetItem @ 1857 NONAME
- _ZN12QTableWidget13selectedItemsEv @ 1858 NONAME
- _ZN12QTableWidget13setCellWidgetEiiP7QWidget @ 1859 NONAME
- _ZN12QTableWidget14setColumnCountEi @ 1860 NONAME
- _ZN12QTableWidget14setCurrentCellEii @ 1861 NONAME
- _ZN12QTableWidget14setCurrentCellEii6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 1862 NONAME
- _ZN12QTableWidget14setCurrentItemEP16QTableWidgetItem @ 1863 NONAME
- _ZN12QTableWidget14setCurrentItemEP16QTableWidgetItem6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 1864 NONAME
- _ZN12QTableWidget15setItemSelectedEPK16QTableWidgetItemb @ 1865 NONAME
- _ZN12QTableWidget16setItemPrototypeEPK16QTableWidgetItem @ 1866 NONAME
- _ZN12QTableWidget16setRangeSelectedERK26QTableWidgetSelectionRangeb @ 1867 NONAME
- _ZN12QTableWidget16staticMetaObjectE @ 1868 NONAME DATA 16
- _ZN12QTableWidget17cellDoubleClickedEii @ 1869 NONAME
- _ZN12QTableWidget17itemDoubleClickedEP16QTableWidgetItem @ 1870 NONAME
- _ZN12QTableWidget17setSortingEnabledEb @ 1871 NONAME
- _ZN12QTableWidget18currentCellChangedEiiii @ 1872 NONAME
- _ZN12QTableWidget18currentItemChangedEP16QTableWidgetItemS1_ @ 1873 NONAME
- _ZN12QTableWidget20itemSelectionChangedEv @ 1874 NONAME
- _ZN12QTableWidget20openPersistentEditorEP16QTableWidgetItem @ 1875 NONAME
- _ZN12QTableWidget21closePersistentEditorEP16QTableWidgetItem @ 1876 NONAME
- _ZN12QTableWidget21setVerticalHeaderItemEiP16QTableWidgetItem @ 1877 NONAME
- _ZN12QTableWidget22takeVerticalHeaderItemEi @ 1878 NONAME
- _ZN12QTableWidget23setHorizontalHeaderItemEiP16QTableWidgetItem @ 1879 NONAME
- _ZN12QTableWidget23setVerticalHeaderLabelsERK11QStringList @ 1880 NONAME
- _ZN12QTableWidget24takeHorizontalHeaderItemEi @ 1881 NONAME
- _ZN12QTableWidget25setHorizontalHeaderLabelsERK11QStringList @ 1882 NONAME
- _ZN12QTableWidget5clearEv @ 1883 NONAME
- _ZN12QTableWidget5eventEP6QEvent @ 1884 NONAME
- _ZN12QTableWidget7setItemEiiP16QTableWidgetItem @ 1885 NONAME
- _ZN12QTableWidget8editItemEP16QTableWidgetItem @ 1886 NONAME
- _ZN12QTableWidget8setModelEP18QAbstractItemModel @ 1887 NONAME
- _ZN12QTableWidget8takeItemEii @ 1888 NONAME
- _ZN12QTableWidget9dropEventEP10QDropEvent @ 1889 NONAME
- _ZN12QTableWidget9insertRowEi @ 1890 NONAME
- _ZN12QTableWidget9removeRowEi @ 1891 NONAME
- _ZN12QTableWidget9sortItemsEiN2Qt9SortOrderE @ 1892 NONAME
- _ZN12QTableWidgetC1EP7QWidget @ 1893 NONAME
- _ZN12QTableWidgetC1EiiP7QWidget @ 1894 NONAME
- _ZN12QTableWidgetC2EP7QWidget @ 1895 NONAME
- _ZN12QTableWidgetC2EiiP7QWidget @ 1896 NONAME
- _ZN12QTableWidgetD0Ev @ 1897 NONAME
- _ZN12QTableWidgetD1Ev @ 1898 NONAME
- _ZN12QTableWidgetD2Ev @ 1899 NONAME
- _ZN12QTabletEventC1EN6QEvent4TypeERK6QPointS4_RK7QPointFiifiiffi6QFlagsIN2Qt16KeyboardModifierEEx @ 1900 NONAME
- _ZN12QTabletEventC2EN6QEvent4TypeERK6QPointS4_RK7QPointFiifiiffi6QFlagsIN2Qt16KeyboardModifierEEx @ 1901 NONAME
- _ZN12QTabletEventD0Ev @ 1902 NONAME
- _ZN12QTabletEventD1Ev @ 1903 NONAME
- _ZN12QTabletEventD2Ev @ 1904 NONAME
- _ZN12QTessellator10setWindingEb @ 1905 NONAME
- _ZN12QTessellator10tessellateEPK7QPointFi @ 1906 NONAME
- _ZN12QTessellator14tessellateRectERK7QPointFS2_f @ 1907 NONAME
- _ZN12QTessellator16tessellateConvexEPK7QPointFi @ 1908 NONAME
- _ZN12QTessellatorC2Ev @ 1909 NONAME
- _ZN12QTessellatorD0Ev @ 1910 NONAME
- _ZN12QTessellatorD1Ev @ 1911 NONAME
- _ZN12QTessellatorD2Ev @ 1912 NONAME
- _ZN12QTextBrowser10paintEventEP11QPaintEvent @ 1913 NONAME
- _ZN12QTextBrowser11highlightedERK4QUrl @ 1914 NONAME
- _ZN12QTextBrowser11highlightedERK7QString @ 1915 NONAME
- _ZN12QTextBrowser11qt_metacallEN11QMetaObject4CallEiPPv @ 1916 NONAME
- _ZN12QTextBrowser11qt_metacastEPKc @ 1917 NONAME
- _ZN12QTextBrowser12clearHistoryEv @ 1918 NONAME
- _ZN12QTextBrowser12loadResourceEiRK4QUrl @ 1919 NONAME
- _ZN12QTextBrowser12setOpenLinksEb @ 1920 NONAME
- _ZN12QTextBrowser13anchorClickedERK4QUrl @ 1921 NONAME
- _ZN12QTextBrowser13focusOutEventEP11QFocusEvent @ 1922 NONAME
- _ZN12QTextBrowser13keyPressEventEP9QKeyEvent @ 1923 NONAME
- _ZN12QTextBrowser13sourceChangedERK4QUrl @ 1924 NONAME
- _ZN12QTextBrowser14historyChangedEv @ 1925 NONAME
- _ZN12QTextBrowser14mouseMoveEventEP11QMouseEvent @ 1926 NONAME
- _ZN12QTextBrowser14setSearchPathsERK11QStringList @ 1927 NONAME
- _ZN12QTextBrowser15mousePressEventEP11QMouseEvent @ 1928 NONAME
- _ZN12QTextBrowser16forwardAvailableEb @ 1929 NONAME
- _ZN12QTextBrowser16staticMetaObjectE @ 1930 NONAME DATA 16
- _ZN12QTextBrowser17backwardAvailableEb @ 1931 NONAME
- _ZN12QTextBrowser17mouseReleaseEventEP11QMouseEvent @ 1932 NONAME
- _ZN12QTextBrowser18focusNextPrevChildEb @ 1933 NONAME
- _ZN12QTextBrowser20setOpenExternalLinksEb @ 1934 NONAME
- _ZN12QTextBrowser4homeEv @ 1935 NONAME
- _ZN12QTextBrowser5eventEP6QEvent @ 1936 NONAME
- _ZN12QTextBrowser6reloadEv @ 1937 NONAME
- _ZN12QTextBrowser7forwardEv @ 1938 NONAME
- _ZN12QTextBrowser8backwardEv @ 1939 NONAME
- _ZN12QTextBrowser9setSourceERK4QUrl @ 1940 NONAME
- _ZN12QTextBrowserC1EP7QWidget @ 1941 NONAME
- _ZN12QTextBrowserC2EP7QWidget @ 1942 NONAME
- _ZN12QTextBrowserD0Ev @ 1943 NONAME
- _ZN12QTextBrowserD1Ev @ 1944 NONAME
- _ZN12QTextBrowserD2Ev @ 1945 NONAME
- _ZN12QTextControl10adjustSizeEv @ 1946 NONAME
- _ZN12QTextControl10appendHtmlERK7QString @ 1947 NONAME
- _ZN12QTextControl10insertHtmlERK7QString @ 1948 NONAME
- _ZN12QTextControl10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 1949 NONAME
- _ZN12QTextControl10setPaletteERK8QPalette @ 1950 NONAME
- _ZN12QTextControl10timerEventEP11QTimerEvent @ 1951 NONAME
- _ZN12QTextControl11linkHoveredERK7QString @ 1952 NONAME
- _ZN12QTextControl11qt_metacallEN11QMetaObject4CallEiPPv @ 1953 NONAME
- _ZN12QTextControl11qt_metacastEPKc @ 1954 NONAME
- _ZN12QTextControl11setDocumentEP13QTextDocument @ 1955 NONAME
- _ZN12QTextControl11textChangedEv @ 1956 NONAME
- _ZN12QTextControl12drawContentsEP8QPainterRK6QRectFP7QWidget @ 1957 NONAME
- _ZN12QTextControl12loadResourceEiRK4QUrl @ 1958 NONAME
- _ZN12QTextControl12processEventEP6QEventRK7QMatrixP7QWidget @ 1959 NONAME
- _ZN12QTextControl12processEventEP6QEventRK7QPointFP7QWidget @ 1960 NONAME
- _ZN12QTextControl12setPlainTextERK7QString @ 1961 NONAME
- _ZN12QTextControl12setTextWidthEf @ 1962 NONAME
- _ZN12QTextControl13copyAvailableEb @ 1963 NONAME
- _ZN12QTextControl13linkActivatedERK7QString @ 1964 NONAME
- _ZN12QTextControl13redoAvailableEb @ 1965 NONAME
- _ZN12QTextControl13setTextCursorERK11QTextCursor @ 1966 NONAME
- _ZN12QTextControl13undoAvailableEb @ 1967 NONAME
- _ZN12QTextControl13updateRequestERK6QRectF @ 1968 NONAME
- _ZN12QTextControl14setCursorWidthEi @ 1969 NONAME
- _ZN12QTextControl15appendPlainTextERK7QString @ 1970 NONAME
- _ZN12QTextControl15insertPlainTextERK7QString @ 1971 NONAME
- _ZN12QTextControl16selectionChangedEv @ 1972 NONAME
- _ZN12QTextControl16setFocusToAnchorERK11QTextCursor @ 1973 NONAME
- _ZN12QTextControl16setOverwriteModeEb @ 1974 NONAME
- _ZN12QTextControl16staticMetaObjectE @ 1975 NONAME DATA 16
- _ZN12QTextControl17blockCountChangedEi @ 1976 NONAME
- _ZN12QTextControl17microFocusChangedEv @ 1977 NONAME
- _ZN12QTextControl17setAcceptRichTextEb @ 1978 NONAME
- _ZN12QTextControl17visibilityRequestERK6QRectF @ 1979 NONAME
- _ZN12QTextControl18findNextPrevAnchorERK11QTextCursorbRS0_ @ 1980 NONAME
- _ZN12QTextControl18insertFromMimeDataEPK9QMimeData @ 1981 NONAME
- _ZN12QTextControl18setExtraSelectionsERK5QListIN9QTextEdit14ExtraSelectionEE @ 1982 NONAME
- _ZN12QTextControl19documentSizeChangedERK6QSizeF @ 1983 NONAME
- _ZN12QTextControl19ensureCursorVisibleEv @ 1984 NONAME
- _ZN12QTextControl19modificationChangedEb @ 1985 NONAME
- _ZN12QTextControl20setCurrentCharFormatERK15QTextCharFormat @ 1986 NONAME
- _ZN12QTextControl20setOpenExternalLinksEb @ 1987 NONAME
- _ZN12QTextControl21cursorPositionChangedEv @ 1988 NONAME
- _ZN12QTextControl22mergeCurrentCharFormatERK15QTextCharFormat @ 1989 NONAME
- _ZN12QTextControl23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 1990 NONAME
- _ZN12QTextControl24currentCharFormatChangedERK15QTextCharFormat @ 1991 NONAME
- _ZN12QTextControl25createStandardContextMenuERK7QPointFP7QWidget @ 1992 NONAME
- _ZN12QTextControl25setCursorIsFocusIndicatorEb @ 1993 NONAME
- _ZN12QTextControl30setFocusToNextOrPreviousAnchorEb @ 1994 NONAME
- _ZN12QTextControl3cutEv @ 1995 NONAME
- _ZN12QTextControl4copyEv @ 1996 NONAME
- _ZN12QTextControl4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 1997 NONAME
- _ZN12QTextControl4redoEv @ 1998 NONAME
- _ZN12QTextControl4undoEv @ 1999 NONAME
- _ZN12QTextControl5clearEv @ 2000 NONAME
- _ZN12QTextControl5eventEP6QEvent @ 2001 NONAME
- _ZN12QTextControl5pasteEv @ 2002 NONAME
- _ZN12QTextControl6appendERK7QString @ 2003 NONAME
- _ZN12QTextControl7setHtmlERK7QString @ 2004 NONAME
- _ZN12QTextControl8setFocusEbN2Qt11FocusReasonE @ 2005 NONAME
- _ZN12QTextControl9selectAllEv @ 2006 NONAME
- _ZN12QTextControlC1EP13QTextDocumentP7QObject @ 2007 NONAME
- _ZN12QTextControlC1EP7QObject @ 2008 NONAME
- _ZN12QTextControlC1ERK7QStringP7QObject @ 2009 NONAME
- _ZN12QTextControlC2EP13QTextDocumentP7QObject @ 2010 NONAME
- _ZN12QTextControlC2EP7QObject @ 2011 NONAME
- _ZN12QTextControlC2ERK7QStringP7QObject @ 2012 NONAME
- _ZN12QTextControlD0Ev @ 2013 NONAME
- _ZN12QTextControlD1Ev @ 2014 NONAME
- _ZN12QTextControlD2Ev @ 2015 NONAME
- _ZN12QToolBarItemC1EP7QWidget @ 2016 NONAME ABSENT
- _ZN12QToolBarItemC2EP7QWidget @ 2017 NONAME ABSENT
- _ZN12QUndoCommand4redoEv @ 2018 NONAME
- _ZN12QUndoCommand4undoEv @ 2019 NONAME
- _ZN12QUndoCommand7setTextERK7QString @ 2020 NONAME
- _ZN12QUndoCommand9mergeWithEPKS_ @ 2021 NONAME
- _ZN12QUndoCommandC1EPS_ @ 2022 NONAME
- _ZN12QUndoCommandC1ERK7QStringPS_ @ 2023 NONAME
- _ZN12QUndoCommandC2EPS_ @ 2024 NONAME
- _ZN12QUndoCommandC2ERK7QStringPS_ @ 2025 NONAME
- _ZN12QUndoCommandD0Ev @ 2026 NONAME
- _ZN12QUndoCommandD1Ev @ 2027 NONAME
- _ZN12QUndoCommandD2Ev @ 2028 NONAME
- _ZN13QDateTimeEdit10paintEventEP11QPaintEvent @ 2029 NONAME
- _ZN13QDateTimeEdit10wheelEventEP11QWheelEvent @ 2030 NONAME
- _ZN13QDateTimeEdit11dateChangedERK5QDate @ 2031 NONAME
- _ZN13QDateTimeEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 2032 NONAME
- _ZN13QDateTimeEdit11qt_metacastEPKc @ 2033 NONAME
- _ZN13QDateTimeEdit11setDateTimeERK9QDateTime @ 2034 NONAME
- _ZN13QDateTimeEdit11setTimeSpecEN2Qt8TimeSpecE @ 2035 NONAME
- _ZN13QDateTimeEdit11timeChangedERK5QTime @ 2036 NONAME
- _ZN13QDateTimeEdit12focusInEventEP11QFocusEvent @ 2037 NONAME
- _ZN13QDateTimeEdit12setDateRangeERK5QDateS2_ @ 2038 NONAME
- _ZN13QDateTimeEdit12setTimeRangeERK5QTimeS2_ @ 2039 NONAME
- _ZN13QDateTimeEdit13keyPressEventEP9QKeyEvent @ 2040 NONAME
- _ZN13QDateTimeEdit14setMaximumDateERK5QDate @ 2041 NONAME
- _ZN13QDateTimeEdit14setMaximumTimeERK5QTime @ 2042 NONAME
- _ZN13QDateTimeEdit14setMinimumDateERK5QDate @ 2043 NONAME
- _ZN13QDateTimeEdit14setMinimumTimeERK5QTime @ 2044 NONAME
- _ZN13QDateTimeEdit15dateTimeChangedERK9QDateTime @ 2045 NONAME
- _ZN13QDateTimeEdit15mousePressEventEP11QMouseEvent @ 2046 NONAME
- _ZN13QDateTimeEdit16clearMaximumDateEv @ 2047 NONAME
- _ZN13QDateTimeEdit16clearMaximumTimeEv @ 2048 NONAME
- _ZN13QDateTimeEdit16clearMinimumDateEv @ 2049 NONAME
- _ZN13QDateTimeEdit16clearMinimumTimeEv @ 2050 NONAME
- _ZN13QDateTimeEdit16setCalendarPopupEb @ 2051 NONAME
- _ZN13QDateTimeEdit16setDateTimeRangeERK9QDateTimeS2_ @ 2052 NONAME
- _ZN13QDateTimeEdit16setDisplayFormatERK7QString @ 2053 NONAME
- _ZN13QDateTimeEdit16staticMetaObjectE @ 2054 NONAME DATA 16
- _ZN13QDateTimeEdit17setCalendarWidgetEP15QCalendarWidget @ 2055 NONAME
- _ZN13QDateTimeEdit17setCurrentSectionENS_7SectionE @ 2056 NONAME
- _ZN13QDateTimeEdit18focusNextPrevChildEb @ 2057 NONAME
- _ZN13QDateTimeEdit18setMaximumDateTimeERK9QDateTime @ 2058 NONAME
- _ZN13QDateTimeEdit18setMinimumDateTimeERK9QDateTime @ 2059 NONAME
- _ZN13QDateTimeEdit18setSelectedSectionENS_7SectionE @ 2060 NONAME
- _ZN13QDateTimeEdit20clearMaximumDateTimeEv @ 2061 NONAME
- _ZN13QDateTimeEdit20clearMinimumDateTimeEv @ 2062 NONAME
- _ZN13QDateTimeEdit22setCurrentSectionIndexEi @ 2063 NONAME
- _ZN13QDateTimeEdit5clearEv @ 2064 NONAME
- _ZN13QDateTimeEdit5eventEP6QEvent @ 2065 NONAME
- _ZN13QDateTimeEdit6stepByEi @ 2066 NONAME
- _ZN13QDateTimeEdit7setDateERK5QDate @ 2067 NONAME
- _ZN13QDateTimeEdit7setTimeERK5QTime @ 2068 NONAME
- _ZN13QDateTimeEditC1EP7QWidget @ 2069 NONAME
- _ZN13QDateTimeEditC1ERK5QDateP7QWidget @ 2070 NONAME
- _ZN13QDateTimeEditC1ERK5QTimeP7QWidget @ 2071 NONAME
- _ZN13QDateTimeEditC1ERK8QVariantNS0_4TypeEP7QWidget @ 2072 NONAME
- _ZN13QDateTimeEditC1ERK9QDateTimeP7QWidget @ 2073 NONAME
- _ZN13QDateTimeEditC2EP7QWidget @ 2074 NONAME
- _ZN13QDateTimeEditC2ERK5QDateP7QWidget @ 2075 NONAME
- _ZN13QDateTimeEditC2ERK5QTimeP7QWidget @ 2076 NONAME
- _ZN13QDateTimeEditC2ERK8QVariantNS0_4TypeEP7QWidget @ 2077 NONAME
- _ZN13QDateTimeEditC2ERK9QDateTimeP7QWidget @ 2078 NONAME
- _ZN13QErrorMessage11changeEventEP6QEvent @ 2079 NONAME
- _ZN13QErrorMessage11qt_metacallEN11QMetaObject4CallEiPPv @ 2080 NONAME
- _ZN13QErrorMessage11qt_metacastEPKc @ 2081 NONAME
- _ZN13QErrorMessage11showMessageERK7QString @ 2082 NONAME
- _ZN13QErrorMessage11showMessageERK7QStringS2_ @ 2083 NONAME
- _ZN13QErrorMessage16staticMetaObjectE @ 2084 NONAME DATA 16
- _ZN13QErrorMessage4doneEi @ 2085 NONAME
- _ZN13QErrorMessage9qtHandlerEv @ 2086 NONAME
- _ZN13QErrorMessageC1EP7QWidget @ 2087 NONAME
- _ZN13QErrorMessageC2EP7QWidget @ 2088 NONAME
- _ZN13QErrorMessageD0Ev @ 2089 NONAME
- _ZN13QErrorMessageD1Ev @ 2090 NONAME
- _ZN13QErrorMessageD2Ev @ 2091 NONAME
- _ZN13QFontComboBox11qt_metacallEN11QMetaObject4CallEiPPv @ 2092 NONAME
- _ZN13QFontComboBox11qt_metacastEPKc @ 2093 NONAME
- _ZN13QFontComboBox14setCurrentFontERK5QFont @ 2094 NONAME
- _ZN13QFontComboBox14setFontFiltersE6QFlagsINS_10FontFilterEE @ 2095 NONAME
- _ZN13QFontComboBox16setWritingSystemEN13QFontDatabase13WritingSystemE @ 2096 NONAME
- _ZN13QFontComboBox16staticMetaObjectE @ 2097 NONAME DATA 16
- _ZN13QFontComboBox18currentFontChangedERK5QFont @ 2098 NONAME
- _ZN13QFontComboBox5eventEP6QEvent @ 2099 NONAME
- _ZN13QFontComboBoxC1EP7QWidget @ 2100 NONAME
- _ZN13QFontComboBoxC2EP7QWidget @ 2101 NONAME
- _ZN13QFontComboBoxD0Ev @ 2102 NONAME
- _ZN13QFontComboBoxD1Ev @ 2103 NONAME
- _ZN13QFontComboBoxD2Ev @ 2104 NONAME
- _ZN13QFontDatabase10pointSizesERK7QStringS2_ @ 2105 NONAME
- _ZN13QFontDatabase11smoothSizesERK7QStringS2_ @ 2106 NONAME
- _ZN13QFontDatabase11styleStringERK5QFont @ 2107 NONAME
- _ZN13QFontDatabase11styleStringERK9QFontInfo @ 2108 NONAME
- _ZN13QFontDatabase13parseFontNameERK7QStringRS0_S3_ @ 2109 NONAME
- _ZN13QFontDatabase13standardSizesEv @ 2110 NONAME
- _ZN13QFontDatabase14createDatabaseEv @ 2111 NONAME
- _ZN13QFontDatabase16staticMetaObjectE @ 2112 NONAME DATA 16
- _ZN13QFontDatabase17writingSystemNameENS_13WritingSystemE @ 2113 NONAME
- _ZN13QFontDatabase18addApplicationFontERK7QString @ 2114 NONAME
- _ZN13QFontDatabase19writingSystemSampleENS_13WritingSystemE @ 2115 NONAME
- _ZN13QFontDatabase23applicationFontFamiliesEi @ 2116 NONAME
- _ZN13QFontDatabase26addApplicationFontFromDataERK10QByteArray @ 2117 NONAME
- _ZN13QFontDatabase29supportsThreadedFontRenderingEv @ 2118 NONAME
- _ZN13QFontDatabase4loadEPK12QFontPrivatei @ 2119 NONAME
- _ZN13QFontDatabase8findFontEiPK12QFontPrivateRK8QFontDef @ 2120 NONAME
- _ZN13QFontDatabaseC1Ev @ 2121 NONAME
- _ZN13QFontDatabaseC2Ev @ 2122 NONAME
- _ZN13QFontMetricsFC1ERK12QFontMetrics @ 2123 NONAME
- _ZN13QFontMetricsFC1ERK5QFont @ 2124 NONAME
- _ZN13QFontMetricsFC1ERK5QFontP12QPaintDevice @ 2125 NONAME
- _ZN13QFontMetricsFC1ERKS_ @ 2126 NONAME
- _ZN13QFontMetricsFC2ERK12QFontMetrics @ 2127 NONAME
- _ZN13QFontMetricsFC2ERK5QFont @ 2128 NONAME
- _ZN13QFontMetricsFC2ERK5QFontP12QPaintDevice @ 2129 NONAME
- _ZN13QFontMetricsFC2ERKS_ @ 2130 NONAME
- _ZN13QFontMetricsFD1Ev @ 2131 NONAME
- _ZN13QFontMetricsFD2Ev @ 2132 NONAME
- _ZN13QFontMetricsFaSERK12QFontMetrics @ 2133 NONAME
- _ZN13QFontMetricsFaSERKS_ @ 2134 NONAME
- _ZN13QFontMetricsFeqERKS_ @ 2135 NONAME
- _ZN13QFramePrivate16updateFrameWidthEv @ 2136 NONAME ABSENT
- _ZN13QFramePrivate23updateStyledFrameWidthsEv @ 2137 NONAME ABSENT
- _ZN13QFramePrivateC1Ev @ 2138 NONAME ABSENT
- _ZN13QFramePrivateC2Ev @ 2139 NONAME ABSENT
- _ZN13QGraphicsItem10addToIndexEv @ 2140 NONAME
- _ZN13QGraphicsItem10clearFocusEv @ 2141 NONAME
- _ZN13QGraphicsItem10itemChangeENS_18GraphicsItemChangeERK8QVariant @ 2142 NONAME
- _ZN13QGraphicsItem10sceneEventEP6QEvent @ 2143 NONAME
- _ZN13QGraphicsItem10setEnabledEb @ 2144 NONAME
- _ZN13QGraphicsItem10setOpacityEf @ 2145 NONAME
- _ZN13QGraphicsItem10setToolTipERK7QString @ 2146 NONAME
- _ZN13QGraphicsItem10setVisibleEb @ 2147 NONAME
- _ZN13QGraphicsItem10wheelEventEP24QGraphicsSceneWheelEvent @ 2148 NONAME
- _ZN13QGraphicsItem11resetMatrixEv @ 2149 NONAME
- _ZN13QGraphicsItem11setSelectedEb @ 2150 NONAME
- _ZN13QGraphicsItem11ungrabMouseEv @ 2151 NONAME
- _ZN13QGraphicsItem12focusInEventEP11QFocusEvent @ 2152 NONAME
- _ZN13QGraphicsItem12grabKeyboardEv @ 2153 NONAME
- _ZN13QGraphicsItem12setCacheModeENS_9CacheModeERK5QSize @ 2154 NONAME
- _ZN13QGraphicsItem12setExtensionENS_9ExtensionERK8QVariant @ 2155 NONAME
- _ZN13QGraphicsItem12setTransformERK10QTransformb @ 2156 NONAME
- _ZN13QGraphicsItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 2157 NONAME
- _ZN13QGraphicsItem13ensureVisibleERK6QRectFii @ 2158 NONAME
- _ZN13QGraphicsItem13focusOutEventEP11QFocusEvent @ 2159 NONAME
- _ZN13QGraphicsItem13keyPressEventEP9QKeyEvent @ 2160 NONAME
- _ZN13QGraphicsItem13setParentItemEPS_ @ 2161 NONAME
- _ZN13QGraphicsItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 2162 NONAME
- _ZN13QGraphicsItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 2163 NONAME
- _ZN13QGraphicsItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 2164 NONAME
- _ZN13QGraphicsItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 2165 NONAME
- _ZN13QGraphicsItem14resetTransformEv @ 2166 NONAME
- _ZN13QGraphicsItem14setAcceptDropsEb @ 2167 NONAME
- _ZN13QGraphicsItem14ungrabKeyboardEv @ 2168 NONAME
- _ZN13QGraphicsItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 2169 NONAME
- _ZN13QGraphicsItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 2170 NONAME
- _ZN13QGraphicsItem15keyReleaseEventEP9QKeyEvent @ 2171 NONAME
- _ZN13QGraphicsItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 2172 NONAME
- _ZN13QGraphicsItem15removeFromIndexEv @ 2173 NONAME
- _ZN13QGraphicsItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 2174 NONAME
- _ZN13QGraphicsItem16inputMethodEventEP17QInputMethodEvent @ 2175 NONAME
- _ZN13QGraphicsItem16sceneEventFilterEPS_P6QEvent @ 2176 NONAME
- _ZN13QGraphicsItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 2177 NONAME
- _ZN13QGraphicsItem20setAcceptHoverEventsEb @ 2178 NONAME
- _ZN13QGraphicsItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 2179 NONAME
- _ZN13QGraphicsItem21prepareGeometryChangeEv @ 2180 NONAME
- _ZN13QGraphicsItem21setAcceptsHoverEventsEb @ 2181 NONAME
- _ZN13QGraphicsItem21setHandlesChildEventsEb @ 2182 NONAME
- _ZN13QGraphicsItem22removeSceneEventFilterEPS_ @ 2183 NONAME
- _ZN13QGraphicsItem23installSceneEventFilterEPS_ @ 2184 NONAME
- _ZN13QGraphicsItem23setAcceptedMouseButtonsE6QFlagsIN2Qt11MouseButtonEE @ 2185 NONAME
- _ZN13QGraphicsItem28setBoundingRegionGranularityEf @ 2186 NONAME
- _ZN13QGraphicsItem5scaleEff @ 2187 NONAME
- _ZN13QGraphicsItem5shearEff @ 2188 NONAME
- _ZN13QGraphicsItem6rotateEf @ 2189 NONAME
- _ZN13QGraphicsItem6scrollEffRK6QRectF @ 2190 NONAME
- _ZN13QGraphicsItem6setPosERK7QPointF @ 2191 NONAME
- _ZN13QGraphicsItem6updateERK6QRectF @ 2192 NONAME
- _ZN13QGraphicsItem7advanceEi @ 2193 NONAME
- _ZN13QGraphicsItem7setDataEiRK8QVariant @ 2194 NONAME
- _ZN13QGraphicsItem7setFlagENS_16GraphicsItemFlagEb @ 2195 NONAME
- _ZN13QGraphicsItem8setFlagsE6QFlagsINS_16GraphicsItemFlagEE @ 2196 NONAME
- _ZN13QGraphicsItem8setFocusEN2Qt11FocusReasonE @ 2197 NONAME
- _ZN13QGraphicsItem8setGroupEP18QGraphicsItemGroup @ 2198 NONAME
- _ZN13QGraphicsItem9dropEventEP27QGraphicsSceneDragDropEvent @ 2199 NONAME
- _ZN13QGraphicsItem9grabMouseEv @ 2200 NONAME
- _ZN13QGraphicsItem9setMatrixERK7QMatrixb @ 2201 NONAME
- _ZN13QGraphicsItem9setZValueEf @ 2202 NONAME
- _ZN13QGraphicsItem9translateEff @ 2203 NONAME
- _ZN13QGraphicsItemC2EPS_P14QGraphicsScene @ 2204 NONAME
- _ZN13QGraphicsItemC2ER20QGraphicsItemPrivatePS_P14QGraphicsScene @ 2205 NONAME
- _ZN13QGraphicsItemD0Ev @ 2206 NONAME
- _ZN13QGraphicsItemD1Ev @ 2207 NONAME
- _ZN13QGraphicsItemD2Ev @ 2208 NONAME
- _ZN13QGraphicsView10paintEventEP11QPaintEvent @ 2209 NONAME
- _ZN13QGraphicsView10wheelEventEP11QWheelEvent @ 2210 NONAME
- _ZN13QGraphicsView11qt_metacallEN11QMetaObject4CallEiPPv @ 2211 NONAME
- _ZN13QGraphicsView11qt_metacastEPKc @ 2212 NONAME
- _ZN13QGraphicsView11resetMatrixEv @ 2213 NONAME
- _ZN13QGraphicsView11resizeEventEP12QResizeEvent @ 2214 NONAME
- _ZN13QGraphicsView11setDragModeENS_8DragModeE @ 2215 NONAME
- _ZN13QGraphicsView11updateSceneERK5QListI6QRectFE @ 2216 NONAME
- _ZN13QGraphicsView12focusInEventEP11QFocusEvent @ 2217 NONAME
- _ZN13QGraphicsView12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 2218 NONAME
- _ZN13QGraphicsView12setCacheModeE6QFlagsINS_13CacheModeFlagEE @ 2219 NONAME
- _ZN13QGraphicsView12setSceneRectERK6QRectF @ 2220 NONAME
- _ZN13QGraphicsView12setTransformERK10QTransformb @ 2221 NONAME
- _ZN13QGraphicsView13dragMoveEventEP14QDragMoveEvent @ 2222 NONAME
- _ZN13QGraphicsView13ensureVisibleEPK13QGraphicsItemii @ 2223 NONAME
- _ZN13QGraphicsView13ensureVisibleERK6QRectFii @ 2224 NONAME
- _ZN13QGraphicsView13focusOutEventEP11QFocusEvent @ 2225 NONAME
- _ZN13QGraphicsView13keyPressEventEP9QKeyEvent @ 2226 NONAME
- _ZN13QGraphicsView13setRenderHintEN8QPainter10RenderHintEb @ 2227 NONAME
- _ZN13QGraphicsView13setupViewportEP7QWidget @ 2228 NONAME
- _ZN13QGraphicsView13viewportEventEP6QEvent @ 2229 NONAME
- _ZN13QGraphicsView14dragEnterEventEP15QDragEnterEvent @ 2230 NONAME
- _ZN13QGraphicsView14dragLeaveEventEP15QDragLeaveEvent @ 2231 NONAME
- _ZN13QGraphicsView14drawBackgroundEP8QPainterRK6QRectF @ 2232 NONAME
- _ZN13QGraphicsView14drawForegroundEP8QPainterRK6QRectF @ 2233 NONAME
- _ZN13QGraphicsView14mouseMoveEventEP11QMouseEvent @ 2234 NONAME
- _ZN13QGraphicsView14resetTransformEv @ 2235 NONAME
- _ZN13QGraphicsView14setInteractiveEb @ 2236 NONAME
- _ZN13QGraphicsView14setRenderHintsE6QFlagsIN8QPainter10RenderHintEE @ 2237 NONAME
- _ZN13QGraphicsView15invalidateSceneERK6QRectF6QFlagsIN14QGraphicsScene10SceneLayerEE @ 2238 NONAME
- _ZN13QGraphicsView15keyReleaseEventEP9QKeyEvent @ 2239 NONAME
- _ZN13QGraphicsView15mousePressEventEP11QMouseEvent @ 2240 NONAME
- _ZN13QGraphicsView15setResizeAnchorENS_14ViewportAnchorE @ 2241 NONAME
- _ZN13QGraphicsView15updateSceneRectERK6QRectF @ 2242 NONAME
- _ZN13QGraphicsView16contextMenuEventEP17QContextMenuEvent @ 2243 NONAME
- _ZN13QGraphicsView16inputMethodEventEP17QInputMethodEvent @ 2244 NONAME
- _ZN13QGraphicsView16scrollContentsByEii @ 2245 NONAME
- _ZN13QGraphicsView16staticMetaObjectE @ 2246 NONAME DATA 16
- _ZN13QGraphicsView17mouseReleaseEventEP11QMouseEvent @ 2247 NONAME
- _ZN13QGraphicsView18focusNextPrevChildEb @ 2248 NONAME
- _ZN13QGraphicsView18resetCachedContentEv @ 2249 NONAME
- _ZN13QGraphicsView18setBackgroundBrushERK6QBrush @ 2250 NONAME
- _ZN13QGraphicsView18setForegroundBrushERK6QBrush @ 2251 NONAME
- _ZN13QGraphicsView19setOptimizationFlagENS_16OptimizationFlagEb @ 2252 NONAME
- _ZN13QGraphicsView20setOptimizationFlagsE6QFlagsINS_16OptimizationFlagEE @ 2253 NONAME
- _ZN13QGraphicsView21mouseDoubleClickEventEP11QMouseEvent @ 2254 NONAME
- _ZN13QGraphicsView21setViewportUpdateModeENS_18ViewportUpdateModeE @ 2255 NONAME
- _ZN13QGraphicsView23setTransformationAnchorENS_14ViewportAnchorE @ 2256 NONAME
- _ZN13QGraphicsView26setRubberBandSelectionModeEN2Qt17ItemSelectionModeE @ 2257 NONAME
- _ZN13QGraphicsView5eventEP6QEvent @ 2258 NONAME
- _ZN13QGraphicsView5scaleEff @ 2259 NONAME
- _ZN13QGraphicsView5shearEff @ 2260 NONAME
- _ZN13QGraphicsView6renderEP8QPainterRK6QRectFRK5QRectN2Qt15AspectRatioModeE @ 2261 NONAME
- _ZN13QGraphicsView6rotateEf @ 2262 NONAME
- _ZN13QGraphicsView8centerOnEPK13QGraphicsItem @ 2263 NONAME
- _ZN13QGraphicsView8centerOnERK7QPointF @ 2264 NONAME
- _ZN13QGraphicsView8setSceneEP14QGraphicsScene @ 2265 NONAME
- _ZN13QGraphicsView9drawItemsEP8QPainteriPP13QGraphicsItemPK24QStyleOptionGraphicsItem @ 2266 NONAME
- _ZN13QGraphicsView9dropEventEP10QDropEvent @ 2267 NONAME
- _ZN13QGraphicsView9fitInViewEPK13QGraphicsItemN2Qt15AspectRatioModeE @ 2268 NONAME
- _ZN13QGraphicsView9fitInViewERK6QRectFN2Qt15AspectRatioModeE @ 2269 NONAME
- _ZN13QGraphicsView9setMatrixERK7QMatrixb @ 2270 NONAME
- _ZN13QGraphicsView9showEventEP10QShowEvent @ 2271 NONAME
- _ZN13QGraphicsView9translateEff @ 2272 NONAME
- _ZN13QGraphicsViewC1EP14QGraphicsSceneP7QWidget @ 2273 NONAME
- _ZN13QGraphicsViewC1EP7QWidget @ 2274 NONAME
- _ZN13QGraphicsViewC1ER20QGraphicsViewPrivateP7QWidget @ 2275 NONAME
- _ZN13QGraphicsViewC2EP14QGraphicsSceneP7QWidget @ 2276 NONAME
- _ZN13QGraphicsViewC2EP7QWidget @ 2277 NONAME
- _ZN13QGraphicsViewC2ER20QGraphicsViewPrivateP7QWidget @ 2278 NONAME
- _ZN13QGraphicsViewD0Ev @ 2279 NONAME
- _ZN13QGraphicsViewD1Ev @ 2280 NONAME
- _ZN13QGraphicsViewD2Ev @ 2281 NONAME
- _ZN13QIconEngineV212virtual_hookEiPv @ 2282 NONAME
- _ZN13QIconEngineV214availableSizesEN5QIcon4ModeENS0_5StateE @ 2283 NONAME
- _ZN13QIconEngineV24readER11QDataStream @ 2284 NONAME
- _ZN13QInputContext11filterEventEPK6QEvent @ 2285 NONAME
- _ZN13QInputContext11qt_metacallEN11QMetaObject4CallEiPPv @ 2286 NONAME
- _ZN13QInputContext11qt_metacastEPKc @ 2287 NONAME
- _ZN13QInputContext12mouseHandlerEiP11QMouseEvent @ 2288 NONAME
- _ZN13QInputContext14s60FilterEventEP7QWidgetP8TWsEvent @ 2289 NONAME
- _ZN13QInputContext14setFocusWidgetEP7QWidget @ 2290 NONAME
- _ZN13QInputContext15widgetDestroyedEP7QWidget @ 2291 NONAME
- _ZN13QInputContext16staticMetaObjectE @ 2292 NONAME DATA 16
- _ZN13QInputContext6updateEv @ 2293 NONAME
- _ZN13QInputContext7actionsEv @ 2294 NONAME
- _ZN13QInputContext9sendEventERK17QInputMethodEvent @ 2295 NONAME
- _ZN13QInputContextC2EP7QObject @ 2296 NONAME
- _ZN13QInputContextD0Ev @ 2297 NONAME
- _ZN13QInputContextD1Ev @ 2298 NONAME
- _ZN13QInputContextD2Ev @ 2299 NONAME
- _ZN13QIntValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 2300 NONAME
- _ZN13QIntValidator11qt_metacastEPKc @ 2301 NONAME
- _ZN13QIntValidator16staticMetaObjectE @ 2302 NONAME DATA 16
- _ZN13QIntValidator6setTopEi @ 2303 NONAME
- _ZN13QIntValidator8setRangeEii @ 2304 NONAME
- _ZN13QIntValidator9setBottomEi @ 2305 NONAME
- _ZN13QIntValidatorC1EP7QObject @ 2306 NONAME
- _ZN13QIntValidatorC1EiiP7QObject @ 2307 NONAME
- _ZN13QIntValidatorC2EP7QObject @ 2308 NONAME
- _ZN13QIntValidatorC2EiiP7QObject @ 2309 NONAME
- _ZN13QIntValidatorD0Ev @ 2310 NONAME
- _ZN13QIntValidatorD1Ev @ 2311 NONAME
- _ZN13QIntValidatorD2Ev @ 2312 NONAME
- _ZN13QItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 2313 NONAME
- _ZN13QItemDelegate11eventFilterEP7QObjectP6QEvent @ 2314 NONAME
- _ZN13QItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 2315 NONAME
- _ZN13QItemDelegate11qt_metacastEPKc @ 2316 NONAME
- _ZN13QItemDelegate11setClippingEb @ 2317 NONAME
- _ZN13QItemDelegate16staticMetaObjectE @ 2318 NONAME DATA 16
- _ZN13QItemDelegate20setItemEditorFactoryEP18QItemEditorFactory @ 2319 NONAME
- _ZN13QItemDelegateC1EP7QObject @ 2320 NONAME
- _ZN13QItemDelegateC2EP7QObject @ 2321 NONAME
- _ZN13QItemDelegateD0Ev @ 2322 NONAME
- _ZN13QItemDelegateD1Ev @ 2323 NONAME
- _ZN13QItemDelegateD2Ev @ 2324 NONAME
- _ZN13QMdiSubWindow10childEventEP11QChildEvent @ 2325 NONAME
- _ZN13QMdiSubWindow10closeEventEP11QCloseEvent @ 2326 NONAME
- _ZN13QMdiSubWindow10leaveEventEP6QEvent @ 2327 NONAME
- _ZN13QMdiSubWindow10paintEventEP11QPaintEvent @ 2328 NONAME
- _ZN13QMdiSubWindow10showShadedEv @ 2329 NONAME
- _ZN13QMdiSubWindow10timerEventEP11QTimerEvent @ 2330 NONAME
- _ZN13QMdiSubWindow11changeEventEP6QEvent @ 2331 NONAME
- _ZN13QMdiSubWindow11eventFilterEP7QObjectP6QEvent @ 2332 NONAME
- _ZN13QMdiSubWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 2333 NONAME
- _ZN13QMdiSubWindow11qt_metacastEPKc @ 2334 NONAME
- _ZN13QMdiSubWindow11resizeEventEP12QResizeEvent @ 2335 NONAME
- _ZN13QMdiSubWindow12focusInEventEP11QFocusEvent @ 2336 NONAME
- _ZN13QMdiSubWindow13focusOutEventEP11QFocusEvent @ 2337 NONAME
- _ZN13QMdiSubWindow13keyPressEventEP9QKeyEvent @ 2338 NONAME
- _ZN13QMdiSubWindow13setSystemMenuEP5QMenu @ 2339 NONAME
- _ZN13QMdiSubWindow14mouseMoveEventEP11QMouseEvent @ 2340 NONAME
- _ZN13QMdiSubWindow14showSystemMenuEv @ 2341 NONAME
- _ZN13QMdiSubWindow15aboutToActivateEv @ 2342 NONAME
- _ZN13QMdiSubWindow15mousePressEventEP11QMouseEvent @ 2343 NONAME
- _ZN13QMdiSubWindow16contextMenuEventEP17QContextMenuEvent @ 2344 NONAME
- _ZN13QMdiSubWindow16staticMetaObjectE @ 2345 NONAME DATA 16
- _ZN13QMdiSubWindow17mouseReleaseEventEP11QMouseEvent @ 2346 NONAME
- _ZN13QMdiSubWindow18windowStateChangedE6QFlagsIN2Qt11WindowStateEES3_ @ 2347 NONAME
- _ZN13QMdiSubWindow19setKeyboardPageStepEi @ 2348 NONAME
- _ZN13QMdiSubWindow21mouseDoubleClickEventEP11QMouseEvent @ 2349 NONAME
- _ZN13QMdiSubWindow21setKeyboardSingleStepEi @ 2350 NONAME
- _ZN13QMdiSubWindow5eventEP6QEvent @ 2351 NONAME
- _ZN13QMdiSubWindow9hideEventEP10QHideEvent @ 2352 NONAME
- _ZN13QMdiSubWindow9moveEventEP10QMoveEvent @ 2353 NONAME
- _ZN13QMdiSubWindow9setOptionENS_15SubWindowOptionEb @ 2354 NONAME
- _ZN13QMdiSubWindow9setWidgetEP7QWidget @ 2355 NONAME
- _ZN13QMdiSubWindow9showEventEP10QShowEvent @ 2356 NONAME
- _ZN13QMdiSubWindowC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2357 NONAME
- _ZN13QMdiSubWindowC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2358 NONAME
- _ZN13QMdiSubWindowD0Ev @ 2359 NONAME
- _ZN13QMdiSubWindowD1Ev @ 2360 NONAME
- _ZN13QMdiSubWindowD2Ev @ 2361 NONAME
- _ZN13QMouseEventExC1EN6QEvent4TypeERK7QPointFRK6QPointN2Qt11MouseButtonE6QFlagsIS9_ESA_INS8_16KeyboardModifierEE @ 2362 NONAME ABSENT
- _ZN13QMouseEventExC2EN6QEvent4TypeERK7QPointFRK6QPointN2Qt11MouseButtonE6QFlagsIS9_ESA_INS8_16KeyboardModifierEE @ 2363 NONAME ABSENT
- _ZN13QMouseEventExD0Ev @ 2364 NONAME ABSENT
- _ZN13QMouseEventExD1Ev @ 2365 NONAME ABSENT
- _ZN13QMouseEventExD2Ev @ 2366 NONAME ABSENT
- _ZN13QPainterState4initEP8QPainter @ 2367 NONAME
- _ZN13QPainterStateC1EPKS_ @ 2368 NONAME
- _ZN13QPainterStateC1Ev @ 2369 NONAME
- _ZN13QPainterStateC2EPKS_ @ 2370 NONAME
- _ZN13QPainterStateC2Ev @ 2371 NONAME
- _ZN13QPainterStateD0Ev @ 2372 NONAME
- _ZN13QPainterStateD1Ev @ 2373 NONAME
- _ZN13QPainterStateD2Ev @ 2374 NONAME
- _ZN13QPixmapFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 2375 NONAME
- _ZN13QPixmapFilter11qt_metacastEPKc @ 2376 NONAME
- _ZN13QPixmapFilter16staticMetaObjectE @ 2377 NONAME DATA 16
- _ZN13QPixmapFilterC2ENS_10FilterTypeEP7QObject @ 2378 NONAME
- _ZN13QPixmapFilterC2ER20QPixmapFilterPrivateNS_10FilterTypeEP7QObject @ 2379 NONAME
- _ZN13QPixmapFilterD0Ev @ 2380 NONAME
- _ZN13QPixmapFilterD1Ev @ 2381 NONAME
- _ZN13QPixmapFilterD2Ev @ 2382 NONAME
- _ZN13QSplashScreen11qt_metacallEN11QMetaObject4CallEiPPv @ 2383 NONAME
- _ZN13QSplashScreen11qt_metacastEPKc @ 2384 NONAME
- _ZN13QSplashScreen11showMessageERK7QStringiRK6QColor @ 2385 NONAME
- _ZN13QSplashScreen12clearMessageEv @ 2386 NONAME
- _ZN13QSplashScreen12drawContentsEP8QPainter @ 2387 NONAME
- _ZN13QSplashScreen14messageChangedERK7QString @ 2388 NONAME
- _ZN13QSplashScreen15mousePressEventEP11QMouseEvent @ 2389 NONAME
- _ZN13QSplashScreen16staticMetaObjectE @ 2390 NONAME DATA 16
- _ZN13QSplashScreen5eventEP6QEvent @ 2391 NONAME
- _ZN13QSplashScreen6finishEP7QWidget @ 2392 NONAME
- _ZN13QSplashScreen7repaintEv @ 2393 NONAME
- _ZN13QSplashScreen9setPixmapERK7QPixmap @ 2394 NONAME
- _ZN13QSplashScreenC1EP7QWidgetRK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2395 NONAME
- _ZN13QSplashScreenC1ERK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2396 NONAME
- _ZN13QSplashScreenC2EP7QWidgetRK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2397 NONAME
- _ZN13QSplashScreenC2ERK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2398 NONAME
- _ZN13QSplashScreenD0Ev @ 2399 NONAME
- _ZN13QSplashScreenD1Ev @ 2400 NONAME
- _ZN13QSplashScreenD2Ev @ 2401 NONAME
- _ZN13QStandardItem10insertRowsEiRK5QListIPS_E @ 2402 NONAME
- _ZN13QStandardItem10insertRowsEii @ 2403 NONAME
- _ZN13QStandardItem10removeRowsEii @ 2404 NONAME
- _ZN13QStandardItem10setEnabledEb @ 2405 NONAME
- _ZN13QStandardItem10takeColumnEi @ 2406 NONAME
- _ZN13QStandardItem11setEditableEb @ 2407 NONAME
- _ZN13QStandardItem11setRowCountEi @ 2408 NONAME
- _ZN13QStandardItem11setTristateEb @ 2409 NONAME
- _ZN13QStandardItem12insertColumnEiRK5QListIPS_E @ 2410 NONAME
- _ZN13QStandardItem12removeColumnEi @ 2411 NONAME
- _ZN13QStandardItem12setCheckableEb @ 2412 NONAME
- _ZN13QStandardItem12sortChildrenEiN2Qt9SortOrderE @ 2413 NONAME
- _ZN13QStandardItem13insertColumnsEii @ 2414 NONAME
- _ZN13QStandardItem13removeColumnsEii @ 2415 NONAME
- _ZN13QStandardItem13setSelectableEb @ 2416 NONAME
- _ZN13QStandardItem14setColumnCountEi @ 2417 NONAME
- _ZN13QStandardItem14setDragEnabledEb @ 2418 NONAME
- _ZN13QStandardItem14setDropEnabledEb @ 2419 NONAME
- _ZN13QStandardItem15emitDataChangedEv @ 2420 NONAME
- _ZN13QStandardItem4readER11QDataStream @ 2421 NONAME
- _ZN13QStandardItem7setDataERK8QVarianti @ 2422 NONAME
- _ZN13QStandardItem7takeRowEi @ 2423 NONAME
- _ZN13QStandardItem8setChildEiiPS_ @ 2424 NONAME
- _ZN13QStandardItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 2425 NONAME
- _ZN13QStandardItem9insertRowEiRK5QListIPS_E @ 2426 NONAME
- _ZN13QStandardItem9removeRowEi @ 2427 NONAME
- _ZN13QStandardItem9takeChildEii @ 2428 NONAME
- _ZN13QStandardItemC1ER20QStandardItemPrivate @ 2429 NONAME
- _ZN13QStandardItemC1ERK5QIconRK7QString @ 2430 NONAME
- _ZN13QStandardItemC1ERK7QString @ 2431 NONAME
- _ZN13QStandardItemC1ERKS_ @ 2432 NONAME
- _ZN13QStandardItemC1Eii @ 2433 NONAME
- _ZN13QStandardItemC1Ev @ 2434 NONAME
- _ZN13QStandardItemC2ER20QStandardItemPrivate @ 2435 NONAME
- _ZN13QStandardItemC2ERK5QIconRK7QString @ 2436 NONAME
- _ZN13QStandardItemC2ERK7QString @ 2437 NONAME
- _ZN13QStandardItemC2ERKS_ @ 2438 NONAME
- _ZN13QStandardItemC2Eii @ 2439 NONAME
- _ZN13QStandardItemC2Ev @ 2440 NONAME
- _ZN13QStandardItemD0Ev @ 2441 NONAME
- _ZN13QStandardItemD1Ev @ 2442 NONAME
- _ZN13QStandardItemD2Ev @ 2443 NONAME
- _ZN13QStandardItemaSERKS_ @ 2444 NONAME
- _ZN13QStyleFactory4keysEv @ 2445 NONAME
- _ZN13QStyleFactory6createERK7QString @ 2446 NONAME
- _ZN13QTextDocument10adjustSizeEv @ 2447 NONAME
- _ZN13QTextDocument11addResourceEiRK4QUrlRK8QVariant @ 2448 NONAME
- _ZN13QTextDocument11qt_metacallEN11QMetaObject4CallEiPPv @ 2449 NONAME
- _ZN13QTextDocument11qt_metacastEPKc @ 2450 NONAME
- _ZN13QTextDocument11setModifiedEb @ 2451 NONAME
- _ZN13QTextDocument11setPageSizeERK6QSizeF @ 2452 NONAME
- _ZN13QTextDocument12createObjectERK11QTextFormat @ 2453 NONAME
- _ZN13QTextDocument12drawContentsEP8QPainterRK6QRectF @ 2454 NONAME
- _ZN13QTextDocument12loadResourceEiRK4QUrl @ 2455 NONAME
- _ZN13QTextDocument12setPlainTextERK7QString @ 2456 NONAME
- _ZN13QTextDocument12setTextWidthEf @ 2457 NONAME
- _ZN13QTextDocument13redoAvailableEb @ 2458 NONAME
- _ZN13QTextDocument13undoAvailableEb @ 2459 NONAME
- _ZN13QTextDocument14appendUndoItemEP17QAbstractUndoItem @ 2460 NONAME
- _ZN13QTextDocument14contentsChangeEiii @ 2461 NONAME
- _ZN13QTextDocument14setDefaultFontERK5QFont @ 2462 NONAME
- _ZN13QTextDocument14setIndentWidthEf @ 2463 NONAME
- _ZN13QTextDocument15contentsChangedEv @ 2464 NONAME
- _ZN13QTextDocument16staticMetaObjectE @ 2465 NONAME DATA 16
- _ZN13QTextDocument16undoCommandAddedEv @ 2466 NONAME
- _ZN13QTextDocument17blockCountChangedEi @ 2467 NONAME
- _ZN13QTextDocument17markContentsDirtyEii @ 2468 NONAME
- _ZN13QTextDocument17setDocumentLayoutEP27QAbstractTextDocumentLayout @ 2469 NONAME
- _ZN13QTextDocument17setDocumentMarginEf @ 2470 NONAME
- _ZN13QTextDocument18setMetaInformationENS_15MetaInformationERK7QString @ 2471 NONAME
- _ZN13QTextDocument18setUndoRedoEnabledEb @ 2472 NONAME
- _ZN13QTextDocument19modificationChangedEb @ 2473 NONAME
- _ZN13QTextDocument19setUseDesignMetricsEb @ 2474 NONAME
- _ZN13QTextDocument20setDefaultStyleSheetERK7QString @ 2475 NONAME
- _ZN13QTextDocument20setDefaultTextOptionERK11QTextOption @ 2476 NONAME
- _ZN13QTextDocument20setMaximumBlockCountEi @ 2477 NONAME
- _ZN13QTextDocument21cursorPositionChangedERK11QTextCursor @ 2478 NONAME
- _ZN13QTextDocument21documentLayoutChangedEv @ 2479 NONAME
- _ZN13QTextDocument4redoEP11QTextCursor @ 2480 NONAME
- _ZN13QTextDocument4redoEv @ 2481 NONAME
- _ZN13QTextDocument4undoEP11QTextCursor @ 2482 NONAME
- _ZN13QTextDocument4undoEv @ 2483 NONAME
- _ZN13QTextDocument5clearEv @ 2484 NONAME
- _ZN13QTextDocument7setHtmlERK7QString @ 2485 NONAME
- _ZN13QTextDocumentC1EP7QObject @ 2486 NONAME
- _ZN13QTextDocumentC1ER20QTextDocumentPrivateP7QObject @ 2487 NONAME
- _ZN13QTextDocumentC1ERK7QStringP7QObject @ 2488 NONAME
- _ZN13QTextDocumentC2EP7QObject @ 2489 NONAME
- _ZN13QTextDocumentC2ER20QTextDocumentPrivateP7QObject @ 2490 NONAME
- _ZN13QTextDocumentC2ERK7QStringP7QObject @ 2491 NONAME
- _ZN13QTextDocumentD0Ev @ 2492 NONAME
- _ZN13QTextDocumentD1Ev @ 2493 NONAME
- _ZN13QTextDocumentD2Ev @ 2494 NONAME
- _ZN13QWidgetAction11eventFilterEP7QObjectP6QEvent @ 2495 NONAME
- _ZN13QWidgetAction11qt_metacallEN11QMetaObject4CallEiPPv @ 2496 NONAME
- _ZN13QWidgetAction11qt_metacastEPKc @ 2497 NONAME
- _ZN13QWidgetAction12createWidgetEP7QWidget @ 2498 NONAME
- _ZN13QWidgetAction12deleteWidgetEP7QWidget @ 2499 NONAME
- _ZN13QWidgetAction13releaseWidgetEP7QWidget @ 2500 NONAME
- _ZN13QWidgetAction13requestWidgetEP7QWidget @ 2501 NONAME
- _ZN13QWidgetAction16setDefaultWidgetEP7QWidget @ 2502 NONAME
- _ZN13QWidgetAction16staticMetaObjectE @ 2503 NONAME DATA 16
- _ZN13QWidgetAction5eventEP6QEvent @ 2504 NONAME
- _ZN13QWidgetActionC1EP7QObject @ 2505 NONAME
- _ZN13QWidgetActionC2EP7QObject @ 2506 NONAME
- _ZN13QWidgetActionD0Ev @ 2507 NONAME
- _ZN13QWidgetActionD1Ev @ 2508 NONAME
- _ZN13QWidgetActionD2Ev @ 2509 NONAME
- _ZN13QWidgetItemV2C1EP7QWidget @ 2510 NONAME
- _ZN13QWidgetItemV2C2EP7QWidget @ 2511 NONAME
- _ZN13QWidgetItemV2D0Ev @ 2512 NONAME
- _ZN13QWidgetItemV2D1Ev @ 2513 NONAME
- _ZN13QWidgetItemV2D2Ev @ 2514 NONAME
- _ZN13QWindowsStyle10timerEventEP11QTimerEvent @ 2515 NONAME
- _ZN13QWindowsStyle11eventFilterEP7QObjectP6QEvent @ 2516 NONAME
- _ZN13QWindowsStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 2517 NONAME
- _ZN13QWindowsStyle11qt_metacastEPKc @ 2518 NONAME
- _ZN13QWindowsStyle16staticMetaObjectE @ 2519 NONAME DATA 16
- _ZN13QWindowsStyle6polishEP12QApplication @ 2520 NONAME
- _ZN13QWindowsStyle6polishEP7QWidget @ 2521 NONAME
- _ZN13QWindowsStyle6polishER8QPalette @ 2522 NONAME
- _ZN13QWindowsStyle8unpolishEP12QApplication @ 2523 NONAME
- _ZN13QWindowsStyle8unpolishEP7QWidget @ 2524 NONAME
- _ZN13QWindowsStyleC1ER20QWindowsStylePrivate @ 2525 NONAME
- _ZN13QWindowsStyleC1Ev @ 2526 NONAME
- _ZN13QWindowsStyleC2ER20QWindowsStylePrivate @ 2527 NONAME
- _ZN13QWindowsStyleC2Ev @ 2528 NONAME
- _ZN13QWindowsStyleD0Ev @ 2529 NONAME
- _ZN13QWindowsStyleD1Ev @ 2530 NONAME
- _ZN13QWindowsStyleD2Ev @ 2531 NONAME
- _ZN14QActionPrivate15sendDataChangedEv @ 2532 NONAME
- _ZN14QActionPrivate17redoGrabAlternateER12QShortcutMap @ 2533 NONAME
- _ZN14QActionPrivate18setShortcutEnabledEbR12QShortcutMap @ 2534 NONAME
- _ZN14QActionPrivate8redoGrabER12QShortcutMap @ 2535 NONAME
- _ZN14QActionPrivateC1Ev @ 2536 NONAME
- _ZN14QActionPrivateC2Ev @ 2537 NONAME
- _ZN14QActionPrivateD0Ev @ 2538 NONAME
- _ZN14QActionPrivateD1Ev @ 2539 NONAME
- _ZN14QActionPrivateD2Ev @ 2540 NONAME
- _ZN14QDesktopWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 2541 NONAME
- _ZN14QDesktopWidget11qt_metacastEPKc @ 2542 NONAME
- _ZN14QDesktopWidget11resizeEventEP12QResizeEvent @ 2543 NONAME
- _ZN14QDesktopWidget15workAreaResizedEi @ 2544 NONAME
- _ZN14QDesktopWidget16staticMetaObjectE @ 2545 NONAME DATA 16
- _ZN14QDesktopWidget6screenEi @ 2546 NONAME
- _ZN14QDesktopWidget7resizedEi @ 2547 NONAME
- _ZN14QDesktopWidgetC1Ev @ 2548 NONAME
- _ZN14QDesktopWidgetC2Ev @ 2549 NONAME
- _ZN14QDesktopWidgetD0Ev @ 2550 NONAME
- _ZN14QDesktopWidgetD1Ev @ 2551 NONAME
- _ZN14QDesktopWidgetD2Ev @ 2552 NONAME
- _ZN14QDoubleSpinBox10setMaximumEd @ 2553 NONAME
- _ZN14QDoubleSpinBox10setMinimumEd @ 2554 NONAME
- _ZN14QDoubleSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 2555 NONAME
- _ZN14QDoubleSpinBox11qt_metacastEPKc @ 2556 NONAME
- _ZN14QDoubleSpinBox11setDecimalsEi @ 2557 NONAME
- _ZN14QDoubleSpinBox12valueChangedERK7QString @ 2558 NONAME
- _ZN14QDoubleSpinBox12valueChangedEd @ 2559 NONAME
- _ZN14QDoubleSpinBox13setSingleStepEd @ 2560 NONAME
- _ZN14QDoubleSpinBox16staticMetaObjectE @ 2561 NONAME DATA 16
- _ZN14QDoubleSpinBox8setRangeEdd @ 2562 NONAME
- _ZN14QDoubleSpinBox8setValueEd @ 2563 NONAME
- _ZN14QDoubleSpinBox9setPrefixERK7QString @ 2564 NONAME
- _ZN14QDoubleSpinBox9setSuffixERK7QString @ 2565 NONAME
- _ZN14QDoubleSpinBoxC1EP7QWidget @ 2566 NONAME
- _ZN14QDoubleSpinBoxC2EP7QWidget @ 2567 NONAME
- _ZN14QDragMoveEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 2568 NONAME
- _ZN14QDragMoveEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 2569 NONAME
- _ZN14QDragMoveEventD0Ev @ 2570 NONAME
- _ZN14QDragMoveEventD1Ev @ 2571 NONAME
- _ZN14QDragMoveEventD2Ev @ 2572 NONAME
- _ZN14QFileOpenEventC1ERK7QString @ 2573 NONAME
- _ZN14QFileOpenEventC2ERK7QString @ 2574 NONAME
- _ZN14QFileOpenEventD0Ev @ 2575 NONAME
- _ZN14QFileOpenEventD1Ev @ 2576 NONAME
- _ZN14QFileOpenEventD2Ev @ 2577 NONAME
- _ZN14QGraphicsScene10addEllipseERK6QRectFRK4QPenRK6QBrush @ 2578 NONAME
- _ZN14QGraphicsScene10addPolygonERK9QPolygonFRK4QPenRK6QBrush @ 2579 NONAME
- _ZN14QGraphicsScene10clearFocusEv @ 2580 NONAME
- _ZN14QGraphicsScene10invalidateERK6QRectF6QFlagsINS_10SceneLayerEE @ 2581 NONAME
- _ZN14QGraphicsScene10removeItemEP13QGraphicsItem @ 2582 NONAME
- _ZN14QGraphicsScene10setPaletteERK8QPalette @ 2583 NONAME
- _ZN14QGraphicsScene10wheelEventEP24QGraphicsSceneWheelEvent @ 2584 NONAME
- _ZN14QGraphicsScene11eventFilterEP7QObjectP6QEvent @ 2585 NONAME
- _ZN14QGraphicsScene11itemUpdatedEP13QGraphicsItemRK6QRectF @ 2586 NONAME ABSENT
- _ZN14QGraphicsScene11qt_metacallEN11QMetaObject4CallEiPPv @ 2587 NONAME
- _ZN14QGraphicsScene11qt_metacastEPKc @ 2588 NONAME
- _ZN14QGraphicsScene12focusInEventEP11QFocusEvent @ 2589 NONAME
- _ZN14QGraphicsScene12setFocusItemEP13QGraphicsItemN2Qt11FocusReasonE @ 2590 NONAME
- _ZN14QGraphicsScene12setSceneRectERK6QRectF @ 2591 NONAME
- _ZN14QGraphicsScene13addSimpleTextERK7QStringRK5QFont @ 2592 NONAME
- _ZN14QGraphicsScene13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 2593 NONAME
- _ZN14QGraphicsScene13focusOutEventEP11QFocusEvent @ 2594 NONAME
- _ZN14QGraphicsScene13keyPressEventEP9QKeyEvent @ 2595 NONAME
- _ZN14QGraphicsScene14clearSelectionEv @ 2596 NONAME
- _ZN14QGraphicsScene14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 2597 NONAME
- _ZN14QGraphicsScene14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 2598 NONAME
- _ZN14QGraphicsScene14drawBackgroundEP8QPainterRK6QRectF @ 2599 NONAME
- _ZN14QGraphicsScene14drawForegroundEP8QPainterRK6QRectF @ 2600 NONAME
- _ZN14QGraphicsScene14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 2601 NONAME
- _ZN14QGraphicsScene14setStickyFocusEb @ 2602 NONAME
- _ZN14QGraphicsScene15createItemGroupERK5QListIP13QGraphicsItemE @ 2603 NONAME
- _ZN14QGraphicsScene15keyReleaseEventEP9QKeyEvent @ 2604 NONAME
- _ZN14QGraphicsScene15mousePressEventEP24QGraphicsSceneMouseEvent @ 2605 NONAME
- _ZN14QGraphicsScene15setActiveWindowEP15QGraphicsWidget @ 2606 NONAME
- _ZN14QGraphicsScene15setBspTreeDepthEi @ 2607 NONAME
- _ZN14QGraphicsScene16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 2608 NONAME
- _ZN14QGraphicsScene16destroyItemGroupEP18QGraphicsItemGroup @ 2609 NONAME
- _ZN14QGraphicsScene16inputMethodEventEP17QInputMethodEvent @ 2610 NONAME
- _ZN14QGraphicsScene16sceneRectChangedERK6QRectF @ 2611 NONAME
- _ZN14QGraphicsScene16selectionChangedEv @ 2612 NONAME
- _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPath @ 2613 NONAME
- _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathN2Qt17ItemSelectionModeE @ 2614 NONAME
- _ZN14QGraphicsScene16staticMetaObjectE @ 2615 NONAME DATA 16
- _ZN14QGraphicsScene17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 2616 NONAME
- _ZN14QGraphicsScene18focusNextPrevChildEb @ 2617 NONAME
- _ZN14QGraphicsScene18setBackgroundBrushERK6QBrush @ 2618 NONAME
- _ZN14QGraphicsScene18setForegroundBrushERK6QBrush @ 2619 NONAME
- _ZN14QGraphicsScene18setItemIndexMethodENS_15ItemIndexMethodE @ 2620 NONAME
- _ZN14QGraphicsScene19setSortCacheEnabledEb @ 2621 NONAME
- _ZN14QGraphicsScene21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 2622 NONAME
- _ZN14QGraphicsScene5clearEv @ 2623 NONAME
- _ZN14QGraphicsScene5eventEP6QEvent @ 2624 NONAME
- _ZN14QGraphicsScene6renderEP8QPainterRK6QRectFS4_N2Qt15AspectRatioModeE @ 2625 NONAME
- _ZN14QGraphicsScene6updateERK6QRectF @ 2626 NONAME
- _ZN14QGraphicsScene7addItemEP13QGraphicsItem @ 2627 NONAME
- _ZN14QGraphicsScene7addLineERK6QLineFRK4QPen @ 2628 NONAME
- _ZN14QGraphicsScene7addPathERK12QPainterPathRK4QPenRK6QBrush @ 2629 NONAME
- _ZN14QGraphicsScene7addRectERK6QRectFRK4QPenRK6QBrush @ 2630 NONAME
- _ZN14QGraphicsScene7addTextERK7QStringRK5QFont @ 2631 NONAME
- _ZN14QGraphicsScene7advanceEv @ 2632 NONAME
- _ZN14QGraphicsScene7changedERK5QListI6QRectFE @ 2633 NONAME
- _ZN14QGraphicsScene7setFontERK5QFont @ 2634 NONAME
- _ZN14QGraphicsScene8setFocusEN2Qt11FocusReasonE @ 2635 NONAME
- _ZN14QGraphicsScene8setStyleEP6QStyle @ 2636 NONAME
- _ZN14QGraphicsScene9addPixmapERK7QPixmap @ 2637 NONAME
- _ZN14QGraphicsScene9addWidgetEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2638 NONAME
- _ZN14QGraphicsScene9drawItemsEP8QPainteriPP13QGraphicsItemPK24QStyleOptionGraphicsItemP7QWidget @ 2639 NONAME
- _ZN14QGraphicsScene9dropEventEP27QGraphicsSceneDragDropEvent @ 2640 NONAME
- _ZN14QGraphicsScene9helpEventEP23QGraphicsSceneHelpEvent @ 2641 NONAME
- _ZN14QGraphicsSceneC1EP7QObject @ 2642 NONAME
- _ZN14QGraphicsSceneC1ERK6QRectFP7QObject @ 2643 NONAME
- _ZN14QGraphicsSceneC1EffffP7QObject @ 2644 NONAME
- _ZN14QGraphicsSceneC2EP7QObject @ 2645 NONAME
- _ZN14QGraphicsSceneC2ERK6QRectFP7QObject @ 2646 NONAME
- _ZN14QGraphicsSceneC2EffffP7QObject @ 2647 NONAME
- _ZN14QGraphicsSceneD0Ev @ 2648 NONAME
- _ZN14QGraphicsSceneD1Ev @ 2649 NONAME
- _ZN14QGraphicsSceneD2Ev @ 2650 NONAME
- _ZN14QIconDragEventC1Ev @ 2651 NONAME
- _ZN14QIconDragEventC2Ev @ 2652 NONAME
- _ZN14QIconDragEventD0Ev @ 2653 NONAME
- _ZN14QIconDragEventD1Ev @ 2654 NONAME
- _ZN14QIconDragEventD2Ev @ 2655 NONAME
- _ZN14QImageIOPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 2656 NONAME
- _ZN14QImageIOPlugin11qt_metacastEPKc @ 2657 NONAME
- _ZN14QImageIOPlugin16staticMetaObjectE @ 2658 NONAME DATA 16
- _ZN14QImageIOPluginC2EP7QObject @ 2659 NONAME
- _ZN14QImageIOPluginD0Ev @ 2660 NONAME
- _ZN14QImageIOPluginD1Ev @ 2661 NONAME
- _ZN14QImageIOPluginD2Ev @ 2662 NONAME
- _ZN14QItemSelection5mergeERKS_6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 2663 NONAME
- _ZN14QItemSelection5splitERK19QItemSelectionRangeS2_PS_ @ 2664 NONAME
- _ZN14QItemSelection6selectERK11QModelIndexS2_ @ 2665 NONAME
- _ZN14QItemSelectionC1ERK11QModelIndexS2_ @ 2666 NONAME
- _ZN14QItemSelectionC2ERK11QModelIndexS2_ @ 2667 NONAME
- _ZN14QLayoutPrivate16createSpacerItemEPK7QLayoutiiN11QSizePolicy6PolicyES4_ @ 2668 NONAME
- _ZN14QLayoutPrivate16createWidgetItemEPK7QLayoutP7QWidget @ 2669 NONAME
- _ZN14QLayoutPrivate20reparentChildWidgetsEP7QWidget @ 2670 NONAME
- _ZN14QLayoutPrivate23spacerItemFactoryMethodE @ 2671 NONAME DATA 4
- _ZN14QLayoutPrivate23widgetItemFactoryMethodE @ 2672 NONAME DATA 4
- _ZN14QLayoutPrivate8doResizeERK5QSize @ 2673 NONAME
- _ZN14QLayoutPrivateC1Ev @ 2674 NONAME
- _ZN14QLayoutPrivateC2Ev @ 2675 NONAME
- _ZN14QPaintEngineEx10drawPixmapERK7QPointFRK7QPixmap @ 2676 NONAME
- _ZN14QPaintEngineEx10drawPointsEPK6QPointi @ 2677 NONAME
- _ZN14QPaintEngineEx10drawPointsEPK7QPointFi @ 2678 NONAME
- _ZN14QPaintEngineEx11drawEllipseERK5QRect @ 2679 NONAME
- _ZN14QPaintEngineEx11drawEllipseERK6QRectF @ 2680 NONAME
- _ZN14QPaintEngineEx11drawPolygonEPK6QPointiN12QPaintEngine15PolygonDrawModeE @ 2681 NONAME
- _ZN14QPaintEngineEx11drawPolygonEPK7QPointFiN12QPaintEngine15PolygonDrawModeE @ 2682 NONAME
- _ZN14QPaintEngineEx11updateStateERK17QPaintEngineState @ 2683 NONAME
- _ZN14QPaintEngineEx15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 2684 NONAME
- _ZN14QPaintEngineEx4clipERK12QPainterPathN2Qt13ClipOperationE @ 2685 NONAME
- _ZN14QPaintEngineEx4clipERK5QRectN2Qt13ClipOperationE @ 2686 NONAME
- _ZN14QPaintEngineEx4clipERK7QRegionN2Qt13ClipOperationE @ 2687 NONAME
- _ZN14QPaintEngineEx4drawERK11QVectorPath @ 2688 NONAME
- _ZN14QPaintEngineEx6strokeERK11QVectorPathRK4QPen @ 2689 NONAME
- _ZN14QPaintEngineEx8drawPathERK12QPainterPath @ 2690 NONAME
- _ZN14QPaintEngineEx8fillRectERK6QRectFRK6QBrush @ 2691 NONAME
- _ZN14QPaintEngineEx8fillRectERK6QRectFRK6QColor @ 2692 NONAME
- _ZN14QPaintEngineEx8setStateEP13QPainterState @ 2693 NONAME
- _ZN14QPaintEngineEx9drawImageERK7QPointFRK6QImage @ 2694 NONAME
- _ZN14QPaintEngineEx9drawLinesEPK5QLinei @ 2695 NONAME
- _ZN14QPaintEngineEx9drawLinesEPK6QLineFi @ 2696 NONAME
- _ZN14QPaintEngineEx9drawRectsEPK5QRecti @ 2697 NONAME
- _ZN14QPaintEngineEx9drawRectsEPK6QRectFi @ 2698 NONAME
- _ZN14QPaintEngineExC2ER21QPaintEngineExPrivate @ 2699 NONAME
- _ZN14QPlainTextEdit10appendHtmlERK7QString @ 2700 NONAME
- _ZN14QPlainTextEdit10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 2701 NONAME
- _ZN14QPlainTextEdit10paintEventEP11QPaintEvent @ 2702 NONAME
- _ZN14QPlainTextEdit10timerEventEP11QTimerEvent @ 2703 NONAME
- _ZN14QPlainTextEdit10wheelEventEP11QWheelEvent @ 2704 NONAME
- _ZN14QPlainTextEdit11changeEventEP6QEvent @ 2705 NONAME
- _ZN14QPlainTextEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 2706 NONAME
- _ZN14QPlainTextEdit11qt_metacastEPKc @ 2707 NONAME
- _ZN14QPlainTextEdit11resizeEventEP12QResizeEvent @ 2708 NONAME
- _ZN14QPlainTextEdit11setDocumentEP13QTextDocument @ 2709 NONAME
- _ZN14QPlainTextEdit11setReadOnlyEb @ 2710 NONAME
- _ZN14QPlainTextEdit11textChangedEv @ 2711 NONAME
- _ZN14QPlainTextEdit12centerCursorEv @ 2712 NONAME
- _ZN14QPlainTextEdit12focusInEventEP11QFocusEvent @ 2713 NONAME
- _ZN14QPlainTextEdit12loadResourceEiRK4QUrl @ 2714 NONAME
- _ZN14QPlainTextEdit12setPlainTextERK7QString @ 2715 NONAME
- _ZN14QPlainTextEdit13copyAvailableEb @ 2716 NONAME
- _ZN14QPlainTextEdit13dragMoveEventEP14QDragMoveEvent @ 2717 NONAME
- _ZN14QPlainTextEdit13focusOutEventEP11QFocusEvent @ 2718 NONAME
- _ZN14QPlainTextEdit13keyPressEventEP9QKeyEvent @ 2719 NONAME
- _ZN14QPlainTextEdit13redoAvailableEb @ 2720 NONAME
- _ZN14QPlainTextEdit13setTextCursorERK11QTextCursor @ 2721 NONAME
- _ZN14QPlainTextEdit13undoAvailableEb @ 2722 NONAME
- _ZN14QPlainTextEdit13updateRequestERK5QRecti @ 2723 NONAME
- _ZN14QPlainTextEdit14dragEnterEventEP15QDragEnterEvent @ 2724 NONAME
- _ZN14QPlainTextEdit14dragLeaveEventEP15QDragLeaveEvent @ 2725 NONAME
- _ZN14QPlainTextEdit14mouseMoveEventEP11QMouseEvent @ 2726 NONAME
- _ZN14QPlainTextEdit14setCursorWidthEi @ 2727 NONAME
- _ZN14QPlainTextEdit15appendPlainTextERK7QString @ 2728 NONAME
- _ZN14QPlainTextEdit15insertPlainTextERK7QString @ 2729 NONAME
- _ZN14QPlainTextEdit15keyReleaseEventEP9QKeyEvent @ 2730 NONAME
- _ZN14QPlainTextEdit15mousePressEventEP11QMouseEvent @ 2731 NONAME
- _ZN14QPlainTextEdit15setLineWrapModeENS_12LineWrapModeE @ 2732 NONAME
- _ZN14QPlainTextEdit15setTabStopWidthEi @ 2733 NONAME
- _ZN14QPlainTextEdit15setWordWrapModeEN11QTextOption8WrapModeE @ 2734 NONAME
- _ZN14QPlainTextEdit16contextMenuEventEP17QContextMenuEvent @ 2735 NONAME
- _ZN14QPlainTextEdit16inputMethodEventEP17QInputMethodEvent @ 2736 NONAME
- _ZN14QPlainTextEdit16scrollContentsByEii @ 2737 NONAME
- _ZN14QPlainTextEdit16selectionChangedEv @ 2738 NONAME
- _ZN14QPlainTextEdit16setOverwriteModeEb @ 2739 NONAME
- _ZN14QPlainTextEdit16staticMetaObjectE @ 2740 NONAME DATA 16
- _ZN14QPlainTextEdit17blockCountChangedEi @ 2741 NONAME
- _ZN14QPlainTextEdit17mouseReleaseEventEP11QMouseEvent @ 2742 NONAME
- _ZN14QPlainTextEdit17setCenterOnScrollEb @ 2743 NONAME
- _ZN14QPlainTextEdit18focusNextPrevChildEb @ 2744 NONAME
- _ZN14QPlainTextEdit18insertFromMimeDataEPK9QMimeData @ 2745 NONAME
- _ZN14QPlainTextEdit18setExtraSelectionsERK5QListIN9QTextEdit14ExtraSelectionEE @ 2746 NONAME
- _ZN14QPlainTextEdit18setTabChangesFocusEb @ 2747 NONAME
- _ZN14QPlainTextEdit19ensureCursorVisibleEv @ 2748 NONAME
- _ZN14QPlainTextEdit19modificationChangedEb @ 2749 NONAME
- _ZN14QPlainTextEdit20setBackgroundVisibleEb @ 2750 NONAME
- _ZN14QPlainTextEdit20setCurrentCharFormatERK15QTextCharFormat @ 2751 NONAME
- _ZN14QPlainTextEdit21cursorPositionChangedEv @ 2752 NONAME
- _ZN14QPlainTextEdit21mouseDoubleClickEventEP11QMouseEvent @ 2753 NONAME
- _ZN14QPlainTextEdit22mergeCurrentCharFormatERK15QTextCharFormat @ 2754 NONAME
- _ZN14QPlainTextEdit23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 2755 NONAME
- _ZN14QPlainTextEdit25createStandardContextMenuEv @ 2756 NONAME
- _ZN14QPlainTextEdit3cutEv @ 2757 NONAME
- _ZN14QPlainTextEdit4copyEv @ 2758 NONAME
- _ZN14QPlainTextEdit4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 2759 NONAME
- _ZN14QPlainTextEdit4redoEv @ 2760 NONAME
- _ZN14QPlainTextEdit4undoEv @ 2761 NONAME
- _ZN14QPlainTextEdit5clearEv @ 2762 NONAME
- _ZN14QPlainTextEdit5eventEP6QEvent @ 2763 NONAME
- _ZN14QPlainTextEdit5pasteEv @ 2764 NONAME
- _ZN14QPlainTextEdit9dropEventEP10QDropEvent @ 2765 NONAME
- _ZN14QPlainTextEdit9selectAllEv @ 2766 NONAME
- _ZN14QPlainTextEdit9showEventEP10QShowEvent @ 2767 NONAME
- _ZN14QPlainTextEditC1EP7QWidget @ 2768 NONAME
- _ZN14QPlainTextEditC1ER21QPlainTextEditPrivateP7QWidget @ 2769 NONAME
- _ZN14QPlainTextEditC1ERK7QStringP7QWidget @ 2770 NONAME
- _ZN14QPlainTextEditC2EP7QWidget @ 2771 NONAME
- _ZN14QPlainTextEditC2ER21QPlainTextEditPrivateP7QWidget @ 2772 NONAME
- _ZN14QPlainTextEditC2ERK7QStringP7QWidget @ 2773 NONAME
- _ZN14QPlainTextEditD0Ev @ 2774 NONAME
- _ZN14QPlainTextEditD1Ev @ 2775 NONAME
- _ZN14QPlainTextEditD2Ev @ 2776 NONAME
- _ZN14QShortcutEventC1ERK12QKeySequenceib @ 2777 NONAME
- _ZN14QShortcutEventC2ERK12QKeySequenceib @ 2778 NONAME
- _ZN14QShortcutEventD0Ev @ 2779 NONAME
- _ZN14QShortcutEventD1Ev @ 2780 NONAME
- _ZN14QShortcutEventD2Ev @ 2781 NONAME
- _ZN14QStackedLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 2782 NONAME
- _ZN14QStackedLayout11qt_metacastEPKc @ 2783 NONAME
- _ZN14QStackedLayout11setGeometryERK5QRect @ 2784 NONAME
- _ZN14QStackedLayout12insertWidgetEiP7QWidget @ 2785 NONAME
- _ZN14QStackedLayout13widgetRemovedEi @ 2786 NONAME
- _ZN14QStackedLayout14currentChangedEi @ 2787 NONAME
- _ZN14QStackedLayout15setCurrentIndexEi @ 2788 NONAME
- _ZN14QStackedLayout15setStackingModeENS_12StackingModeE @ 2789 NONAME
- _ZN14QStackedLayout16setCurrentWidgetEP7QWidget @ 2790 NONAME
- _ZN14QStackedLayout16staticMetaObjectE @ 2791 NONAME DATA 16
- _ZN14QStackedLayout6takeAtEi @ 2792 NONAME
- _ZN14QStackedLayout7addItemEP11QLayoutItem @ 2793 NONAME
- _ZN14QStackedLayout9addWidgetEP7QWidget @ 2794 NONAME
- _ZN14QStackedLayoutC1EP7QLayout @ 2795 NONAME
- _ZN14QStackedLayoutC1EP7QWidget @ 2796 NONAME
- _ZN14QStackedLayoutC1Ev @ 2797 NONAME
- _ZN14QStackedLayoutC2EP7QLayout @ 2798 NONAME
- _ZN14QStackedLayoutC2EP7QWidget @ 2799 NONAME
- _ZN14QStackedLayoutC2Ev @ 2800 NONAME
- _ZN14QStackedLayoutD0Ev @ 2801 NONAME
- _ZN14QStackedLayoutD1Ev @ 2802 NONAME
- _ZN14QStackedLayoutD2Ev @ 2803 NONAME
- _ZN14QStackedWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 2804 NONAME
- _ZN14QStackedWidget11qt_metacastEPKc @ 2805 NONAME
- _ZN14QStackedWidget12insertWidgetEiP7QWidget @ 2806 NONAME
- _ZN14QStackedWidget12removeWidgetEP7QWidget @ 2807 NONAME
- _ZN14QStackedWidget13widgetRemovedEi @ 2808 NONAME
- _ZN14QStackedWidget14currentChangedEi @ 2809 NONAME
- _ZN14QStackedWidget15setCurrentIndexEi @ 2810 NONAME
- _ZN14QStackedWidget16setCurrentWidgetEP7QWidget @ 2811 NONAME
- _ZN14QStackedWidget16staticMetaObjectE @ 2812 NONAME DATA 16
- _ZN14QStackedWidget5eventEP6QEvent @ 2813 NONAME
- _ZN14QStackedWidget9addWidgetEP7QWidget @ 2814 NONAME
- _ZN14QStackedWidgetC1EP7QWidget @ 2815 NONAME
- _ZN14QStackedWidgetC2EP7QWidget @ 2816 NONAME
- _ZN14QStackedWidgetD0Ev @ 2817 NONAME
- _ZN14QStackedWidgetD1Ev @ 2818 NONAME
- _ZN14QStackedWidgetD2Ev @ 2819 NONAME
- _ZN14QTextOdfWriter10writeBlockER16QXmlStreamWriterRK10QTextBlock @ 2820 NONAME
- _ZN14QTextOdfWriter10writeFrameER16QXmlStreamWriterPK10QTextFrame @ 2821 NONAME
- _ZN14QTextOdfWriter8writeAllEv @ 2822 NONAME
- _ZN14QTextOdfWriterC1ERK13QTextDocumentP9QIODevice @ 2823 NONAME
- _ZN14QTextOdfWriterC2ERK13QTextDocumentP9QIODevice @ 2824 NONAME
- _ZN14QTextTableCell9setFormatERK15QTextCharFormat @ 2825 NONAME
- _ZN14QToolBarLayout10createItemEP7QAction @ 2826 NONAME ABSENT
- _ZN14QToolBarLayout10invalidateEv @ 2827 NONAME ABSENT
- _ZN14QToolBarLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 2828 NONAME ABSENT
- _ZN14QToolBarLayout11qt_metacastEPKc @ 2829 NONAME ABSENT
- _ZN14QToolBarLayout11setExpandedEb @ 2830 NONAME ABSENT
- _ZN14QToolBarLayout11setGeometryERK5QRect @ 2831 NONAME ABSENT
- _ZN14QToolBarLayout12insertActionEiP7QAction @ 2832 NONAME ABSENT
- _ZN14QToolBarLayout13layoutActionsERK5QSize @ 2833 NONAME ABSENT
- _ZN14QToolBarLayout15setUsePopupMenuEb @ 2834 NONAME ABSENT
- _ZN14QToolBarLayout16staticMetaObjectE @ 2835 NONAME DATA 16 ABSENT
- _ZN14QToolBarLayout17checkUsePopupMenuEv @ 2836 NONAME ABSENT
- _ZN14QToolBarLayout22updateMarginAndSpacingEv @ 2837 NONAME ABSENT
- _ZN14QToolBarLayout6takeAtEi @ 2838 NONAME ABSENT
- _ZN14QToolBarLayout7addItemEP11QLayoutItem @ 2839 NONAME ABSENT
- _ZN14QToolBarLayoutC1EP7QWidget @ 2840 NONAME ABSENT
- _ZN14QToolBarLayoutC2EP7QWidget @ 2841 NONAME ABSENT
- _ZN14QToolBarLayoutD0Ev @ 2842 NONAME ABSENT
- _ZN14QToolBarLayoutD1Ev @ 2843 NONAME ABSENT
- _ZN14QToolBarLayoutD2Ev @ 2844 NONAME ABSENT
- _ZN14QWidgetPrivate10create_sysEP11CCoeControlbb @ 2845 NONAME
- _ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore @ 2846 NONAME
- _ZN14QWidgetPrivate10scrollRectERK5QRectii @ 2847 NONAME
- _ZN14QWidgetPrivate10scroll_sysEii @ 2848 NONAME
- _ZN14QWidgetPrivate10scroll_sysEiiRK5QRect @ 2849 NONAME
- _ZN14QWidgetPrivate10updateFontERK5QFont @ 2850 NONAME
- _ZN14QWidgetPrivate11adjustFlagsER6QFlagsIN2Qt10WindowTypeEEP7QWidget @ 2851 NONAME
- _ZN14QWidgetPrivate11createExtraEv @ 2852 NONAME
- _ZN14QWidgetPrivate11createWinIdEP11CCoeControl @ 2853 NONAME
- _ZN14QWidgetPrivate11deleteExtraEv @ 2854 NONAME
- _ZN14QWidgetPrivate11hide_helperEv @ 2855 NONAME
- _ZN14QWidgetPrivate11pointToRectERK6QPointRK5QRect @ 2856 NONAME
- _ZN14QWidgetPrivate11repaint_sysERK7QRegion @ 2857 NONAME
- _ZN14QWidgetPrivate11resolveFontEv @ 2858 NONAME
- _ZN14QWidgetPrivate11setMask_sysERK7QRegion @ 2859 NONAME
- _ZN14QWidgetPrivate11show_helperEv @ 2860 NONAME
- _ZN14QWidgetPrivate12close_helperENS_9CloseModeE @ 2861 NONAME
- _ZN14QWidgetPrivate12hideChildrenEb @ 2862 NONAME
- _ZN14QWidgetPrivate12inheritStyleEv @ 2863 NONAME
- _ZN14QWidgetPrivate12maxInstancesE @ 2864 NONAME DATA 4
- _ZN14QWidgetPrivate12mouseGrabberE @ 2865 NONAME DATA 4
- _ZN14QWidgetPrivate12setFocus_sysEv @ 2866 NONAME
- _ZN14QWidgetPrivate12setModal_sysEv @ 2867 NONAME
- _ZN14QWidgetPrivate12showChildrenEb @ 2868 NONAME
- _ZN14QWidgetPrivate13createTLExtraEv @ 2869 NONAME
- _ZN14QWidgetPrivate13editingWidgetE @ 2870 NONAME DATA 4
- _ZN14QWidgetPrivate13render_helperEP8QPainterRK6QPointRK7QRegion6QFlagsIN7QWidget10RenderFlagEE @ 2871 NONAME
- _ZN14QWidgetPrivate13resolveLocaleEv @ 2872 NONAME
- _ZN14QWidgetPrivate13setParent_sysEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2873 NONAME
- _ZN14QWidgetPrivate13setWSGeometryEb @ 2874 NONAME ABSENT
- _ZN14QWidgetPrivate14createSysExtraEv @ 2875 NONAME
- _ZN14QWidgetPrivate14deleteSysExtraEv @ 2876 NONAME
- _ZN14QWidgetPrivate14resolvePaletteEv @ 2877 NONAME
- _ZN14QWidgetPrivate14scrollChildrenEii @ 2878 NONAME
- _ZN14QWidgetPrivate14show_recursiveEv @ 2879 NONAME
- _ZN14QWidgetPrivate14stackUnder_sysEP7QWidget @ 2880 NONAME
- _ZN14QWidgetPrivate14updateIsOpaqueEv @ 2881 NONAME
- _ZN14QWidgetPrivate15instanceCounterE @ 2882 NONAME DATA 4
- _ZN14QWidgetPrivate15keyboardGrabberE @ 2883 NONAME DATA 4
- _ZN14QWidgetPrivate15prepareToRenderERK7QRegion6QFlagsIN7QWidget10RenderFlagEE @ 2884 NONAME
- _ZN14QWidgetPrivate15setGeometry_sysEiiiib @ 2885 NONAME
- _ZN14QWidgetPrivate15setSoftKeys_sysERK5QListIP7QActionE @ 2886 NONAME ABSENT
- _ZN14QWidgetPrivate15setStyle_helperEP6QStylebb @ 2887 NONAME
- _ZN14QWidgetPrivate16createTLSysExtraEv @ 2888 NONAME
- _ZN14QWidgetPrivate16deleteTLSysExtraEv @ 2889 NONAME
- _ZN14QWidgetPrivate16invalidateBufferERK5QRect @ 2890 NONAME
- _ZN14QWidgetPrivate16invalidateBufferERK7QRegion @ 2891 NONAME
- _ZN14QWidgetPrivate16registerDropSiteEb @ 2892 NONAME
- _ZN14QWidgetPrivate16reparentChildrenEv @ 2893 NONAME
- _ZN14QWidgetPrivate16setLocale_helperERK7QLocaleb @ 2894 NONAME
- _ZN14QWidgetPrivate16syncBackingStoreERK7QRegion @ 2895 NONAME
- _ZN14QWidgetPrivate16syncBackingStoreEv @ 2896 NONAME
- _ZN14QWidgetPrivate16uncreatedWidgetsE @ 2897 NONAME DATA 4 ABSENT
- _ZN14QWidgetPrivate16updateFrameStrutEv @ 2898 NONAME
- _ZN14QWidgetPrivate17createRecursivelyEv @ 2899 NONAME
- _ZN14QWidgetPrivate17s60UpdateIsOpaqueEv @ 2900 NONAME
- _ZN14QWidgetPrivate17setEnabled_helperEb @ 2901 NONAME
- _ZN14QWidgetPrivate17setPalette_helperERK8QPalette @ 2902 NONAME
- _ZN14QWidgetPrivate17setWindowIcon_sysEb @ 2903 NONAME
- _ZN14QWidgetPrivate18_q_showIfNotHiddenEv @ 2904 NONAME
- _ZN14QWidgetPrivate18setConstraints_sysEv @ 2905 NONAME
- _ZN14QWidgetPrivate18setWindowTitle_sysERK7QString @ 2906 NONAME
- _ZN14QWidgetPrivate19updateIsTranslucentEv @ 2907 NONAME
- _ZN14QWidgetPrivate20reparentFocusWidgetsEP7QWidget @ 2908 NONAME
- _ZN14QWidgetPrivate20setDirtyOpaqueRegionEv @ 2909 NONAME
- _ZN14QWidgetPrivate20setLayoutItemMarginsEN6QStyle10SubElementEPK12QStyleOption @ 2910 NONAME
- _ZN14QWidgetPrivate20setLayoutItemMarginsEiiii @ 2911 NONAME
- _ZN14QWidgetPrivate20setWindowIcon_helperEv @ 2912 NONAME
- _ZN14QWidgetPrivate20setWindowOpacity_sysEf @ 2913 NONAME
- _ZN14QWidgetPrivate21setMaximumSize_helperERiS0_ @ 2914 NONAME
- _ZN14QWidgetPrivate21setMinimumSize_helperERiS0_ @ 2915 NONAME
- _ZN14QWidgetPrivate21setWindowIconText_sysERK7QString @ 2916 NONAME
- _ZN14QWidgetPrivate21setWindowTitle_helperERK7QString @ 2917 NONAME
- _ZN14QWidgetPrivate21updateGeometry_helperEb @ 2918 NONAME
- _ZN14QWidgetPrivate22paintSiblingsRecursiveEP12QPaintDeviceRK5QListIP7QObjectEiRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore @ 2919 NONAME
- _ZN14QWidgetPrivate22propagatePaletteChangeEv @ 2920 NONAME
- _ZN14QWidgetPrivate22resolveLayoutDirectionEv @ 2921 NONAME
- _ZN14QWidgetPrivate22updateSystemBackgroundEv @ 2922 NONAME
- _ZN14QWidgetPrivate23deactivateWidgetCleanupEv @ 2923 NONAME
- _ZN14QWidgetPrivate24setUpdatesEnabled_helperEb @ 2924 NONAME
- _ZN14QWidgetPrivate24setWindowFilePath_helperERK7QString @ 2925 NONAME
- _ZN14QWidgetPrivate24setWindowIconText_helperERK7QString @ 2926 NONAME
- _ZN14QWidgetPrivate25setLayoutDirection_helperEN2Qt15LayoutDirectionE @ 2927 NONAME
- _ZN14QWidgetPrivate26adjustQuitOnCloseAttributeEv @ 2928 NONAME
- _ZN14QWidgetPrivate26createDefaultWindowSurfaceEv @ 2929 NONAME
- _ZN14QWidgetPrivate26nearestGraphicsProxyWidgetEP7QWidget @ 2930 NONAME
- _ZN14QWidgetPrivate29invalidateBuffer_resizeHelperERK6QPointRK5QSize @ 2931 NONAME
- _ZN14QWidgetPrivate30createDefaultWindowSurface_sysEv @ 2932 NONAME
- _ZN14QWidgetPrivate30sendPendingMoveAndResizeEventsEbb @ 2933 NONAME
- _ZN14QWidgetPrivate31activateChildLayoutsRecursivelyEv @ 2934 NONAME
- _ZN14QWidgetPrivate4initEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2935 NONAME
- _ZN14QWidgetPrivate6mapperE @ 2936 NONAME DATA 4
- _ZN14QWidgetPrivate8hide_sysEv @ 2937 NONAME
- _ZN14QWidgetPrivate8moveRectERK5QRectii @ 2938 NONAME
- _ZN14QWidgetPrivate8setWinIdEP11CCoeControl @ 2939 NONAME
- _ZN14QWidgetPrivate8show_sysEv @ 2940 NONAME
- _ZN14QWidgetPrivate9lower_sysEv @ 2941 NONAME
- _ZN14QWidgetPrivate9raise_sysEv @ 2942 NONAME
- _ZN14QWidgetPrivate9setOpaqueEb @ 2943 NONAME
- _ZN14QWidgetPrivateC1Ei @ 2944 NONAME
- _ZN14QWidgetPrivateC2Ei @ 2945 NONAME
- _ZN14QWidgetPrivateD0Ev @ 2946 NONAME
- _ZN14QWidgetPrivateD1Ev @ 2947 NONAME
- _ZN14QWidgetPrivateD2Ev @ 2948 NONAME
- _ZN14QWindowSurface10beginPaintERK7QRegion @ 2949 NONAME
- _ZN14QWindowSurface11setGeometryERK5QRect @ 2950 NONAME
- _ZN14QWindowSurface17setStaticContentsERK7QRegion @ 2951 NONAME
- _ZN14QWindowSurface24setStaticContentsSupportEb @ 2952 NONAME
- _ZN14QWindowSurface6bufferEPK7QWidget @ 2953 NONAME
- _ZN14QWindowSurface6scrollERK7QRegionii @ 2954 NONAME
- _ZN14QWindowSurface8endPaintERK7QRegion @ 2955 NONAME
- _ZN14QWindowSurfaceC2EP7QWidget @ 2956 NONAME
- _ZN14QWindowSurfaceD0Ev @ 2957 NONAME
- _ZN14QWindowSurfaceD1Ev @ 2958 NONAME
- _ZN14QWindowSurfaceD2Ev @ 2959 NONAME
- _ZN15QAbstractButton10setCheckedEb @ 2960 NONAME
- _ZN15QAbstractButton10timerEventEP11QTimerEvent @ 2961 NONAME
- _ZN15QAbstractButton11changeEventEP6QEvent @ 2962 NONAME
- _ZN15QAbstractButton11qt_metacallEN11QMetaObject4CallEiPPv @ 2963 NONAME
- _ZN15QAbstractButton11qt_metacastEPKc @ 2964 NONAME
- _ZN15QAbstractButton11setIconSizeERK5QSize @ 2965 NONAME
- _ZN15QAbstractButton11setShortcutERK12QKeySequence @ 2966 NONAME
- _ZN15QAbstractButton12animateClickEi @ 2967 NONAME
- _ZN15QAbstractButton12focusInEventEP11QFocusEvent @ 2968 NONAME
- _ZN15QAbstractButton12setCheckableEb @ 2969 NONAME
- _ZN15QAbstractButton13checkStateSetEv @ 2970 NONAME
- _ZN15QAbstractButton13focusOutEventEP11QFocusEvent @ 2971 NONAME
- _ZN15QAbstractButton13keyPressEventEP9QKeyEvent @ 2972 NONAME
- _ZN15QAbstractButton13setAutoRepeatEb @ 2973 NONAME
- _ZN15QAbstractButton14mouseMoveEventEP11QMouseEvent @ 2974 NONAME
- _ZN15QAbstractButton14nextCheckStateEv @ 2975 NONAME
- _ZN15QAbstractButton15keyReleaseEventEP9QKeyEvent @ 2976 NONAME
- _ZN15QAbstractButton15mousePressEventEP11QMouseEvent @ 2977 NONAME
- _ZN15QAbstractButton16setAutoExclusiveEb @ 2978 NONAME
- _ZN15QAbstractButton16staticMetaObjectE @ 2979 NONAME DATA 16
- _ZN15QAbstractButton17mouseReleaseEventEP11QMouseEvent @ 2980 NONAME
- _ZN15QAbstractButton18setAutoRepeatDelayEi @ 2981 NONAME
- _ZN15QAbstractButton21setAutoRepeatIntervalEi @ 2982 NONAME
- _ZN15QAbstractButton5clickEv @ 2983 NONAME
- _ZN15QAbstractButton5eventEP6QEvent @ 2984 NONAME
- _ZN15QAbstractButton6toggleEv @ 2985 NONAME
- _ZN15QAbstractButton7clickedEb @ 2986 NONAME
- _ZN15QAbstractButton7pressedEv @ 2987 NONAME
- _ZN15QAbstractButton7setDownEb @ 2988 NONAME
- _ZN15QAbstractButton7setIconERK5QIcon @ 2989 NONAME
- _ZN15QAbstractButton7setTextERK7QString @ 2990 NONAME
- _ZN15QAbstractButton7toggledEb @ 2991 NONAME
- _ZN15QAbstractButton8releasedEv @ 2992 NONAME
- _ZN15QAbstractButtonC2EP7QWidget @ 2993 NONAME
- _ZN15QAbstractButtonC2ER22QAbstractButtonPrivateP7QWidget @ 2994 NONAME
- _ZN15QAbstractButtonD0Ev @ 2995 NONAME
- _ZN15QAbstractButtonD1Ev @ 2996 NONAME
- _ZN15QAbstractButtonD2Ev @ 2997 NONAME
- _ZN15QAbstractSlider10setMaximumEi @ 2998 NONAME
- _ZN15QAbstractSlider10setMinimumEi @ 2999 NONAME
- _ZN15QAbstractSlider10timerEventEP11QTimerEvent @ 3000 NONAME
- _ZN15QAbstractSlider10wheelEventEP11QWheelEvent @ 3001 NONAME
- _ZN15QAbstractSlider11changeEventEP6QEvent @ 3002 NONAME
- _ZN15QAbstractSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 3003 NONAME
- _ZN15QAbstractSlider11qt_metacastEPKc @ 3004 NONAME
- _ZN15QAbstractSlider11setPageStepEi @ 3005 NONAME
- _ZN15QAbstractSlider11setTrackingEb @ 3006 NONAME
- _ZN15QAbstractSlider11sliderMovedEi @ 3007 NONAME
- _ZN15QAbstractSlider12rangeChangedEii @ 3008 NONAME
- _ZN15QAbstractSlider12sliderChangeENS_12SliderChangeE @ 3009 NONAME
- _ZN15QAbstractSlider12valueChangedEi @ 3010 NONAME
- _ZN15QAbstractSlider13keyPressEventEP9QKeyEvent @ 3011 NONAME
- _ZN15QAbstractSlider13setSingleStepEi @ 3012 NONAME
- _ZN15QAbstractSlider13setSliderDownEb @ 3013 NONAME
- _ZN15QAbstractSlider13sliderPressedEv @ 3014 NONAME
- _ZN15QAbstractSlider13triggerActionENS_12SliderActionE @ 3015 NONAME
- _ZN15QAbstractSlider14setOrientationEN2Qt11OrientationE @ 3016 NONAME
- _ZN15QAbstractSlider14sliderReleasedEv @ 3017 NONAME
- _ZN15QAbstractSlider15actionTriggeredEi @ 3018 NONAME
- _ZN15QAbstractSlider15setRepeatActionENS_12SliderActionEii @ 3019 NONAME
- _ZN15QAbstractSlider16staticMetaObjectE @ 3020 NONAME DATA 16
- _ZN15QAbstractSlider17setSliderPositionEi @ 3021 NONAME
- _ZN15QAbstractSlider19setInvertedControlsEb @ 3022 NONAME
- _ZN15QAbstractSlider21setInvertedAppearanceEb @ 3023 NONAME
- _ZN15QAbstractSlider5eventEP6QEvent @ 3024 NONAME
- _ZN15QAbstractSlider8setRangeEii @ 3025 NONAME
- _ZN15QAbstractSlider8setValueEi @ 3026 NONAME
- _ZN15QAbstractSliderC1EP7QWidget @ 3027 NONAME
- _ZN15QAbstractSliderC1ER22QAbstractSliderPrivateP7QWidget @ 3028 NONAME
- _ZN15QAbstractSliderC2EP7QWidget @ 3029 NONAME
- _ZN15QAbstractSliderC2ER22QAbstractSliderPrivateP7QWidget @ 3030 NONAME
- _ZN15QAbstractSliderD0Ev @ 3031 NONAME
- _ZN15QAbstractSliderD1Ev @ 3032 NONAME
- _ZN15QAbstractSliderD2Ev @ 3033 NONAME
- _ZN15QCalendarWidget10updateCellERK5QDate @ 3034 NONAME
- _ZN15QCalendarWidget11eventFilterEP7QObjectP6QEvent @ 3035 NONAME
- _ZN15QCalendarWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3036 NONAME
- _ZN15QCalendarWidget11qt_metacastEPKc @ 3037 NONAME
- _ZN15QCalendarWidget11resizeEventEP12QResizeEvent @ 3038 NONAME
- _ZN15QCalendarWidget11updateCellsEv @ 3039 NONAME
- _ZN15QCalendarWidget12setDateRangeERK5QDateS2_ @ 3040 NONAME
- _ZN15QCalendarWidget12showNextYearEv @ 3041 NONAME
- _ZN15QCalendarWidget13keyPressEventEP9QKeyEvent @ 3042 NONAME
- _ZN15QCalendarWidget13showNextMonthEv @ 3043 NONAME
- _ZN15QCalendarWidget14setCurrentPageEii @ 3044 NONAME
- _ZN15QCalendarWidget14setGridVisibleEb @ 3045 NONAME
- _ZN15QCalendarWidget14setMaximumDateERK5QDate @ 3046 NONAME
- _ZN15QCalendarWidget14setMinimumDateERK5QDate @ 3047 NONAME
- _ZN15QCalendarWidget15mousePressEventEP11QMouseEvent @ 3048 NONAME
- _ZN15QCalendarWidget15setSelectedDateERK5QDate @ 3049 NONAME
- _ZN15QCalendarWidget16selectionChangedEv @ 3050 NONAME
- _ZN15QCalendarWidget16setHeaderVisibleEb @ 3051 NONAME
- _ZN15QCalendarWidget16setSelectionModeENS_13SelectionModeE @ 3052 NONAME
- _ZN15QCalendarWidget16showPreviousYearEv @ 3053 NONAME
- _ZN15QCalendarWidget16showSelectedDateEv @ 3054 NONAME
- _ZN15QCalendarWidget16staticMetaObjectE @ 3055 NONAME DATA 16
- _ZN15QCalendarWidget17setDateTextFormatERK5QDateRK15QTextCharFormat @ 3056 NONAME
- _ZN15QCalendarWidget17setFirstDayOfWeekEN2Qt9DayOfWeekE @ 3057 NONAME
- _ZN15QCalendarWidget17showPreviousMonthEv @ 3058 NONAME
- _ZN15QCalendarWidget18currentPageChangedEii @ 3059 NONAME
- _ZN15QCalendarWidget18setDateEditEnabledEb @ 3060 NONAME
- _ZN15QCalendarWidget19setHeaderTextFormatERK15QTextCharFormat @ 3061 NONAME
- _ZN15QCalendarWidget20setWeekdayTextFormatEN2Qt9DayOfWeekERK15QTextCharFormat @ 3062 NONAME
- _ZN15QCalendarWidget22setDateEditAcceptDelayEi @ 3063 NONAME
- _ZN15QCalendarWidget23setNavigationBarVisibleEb @ 3064 NONAME
- _ZN15QCalendarWidget23setVerticalHeaderFormatENS_20VerticalHeaderFormatE @ 3065 NONAME
- _ZN15QCalendarWidget25setHorizontalHeaderFormatENS_22HorizontalHeaderFormatE @ 3066 NONAME
- _ZN15QCalendarWidget5eventEP6QEvent @ 3067 NONAME
- _ZN15QCalendarWidget7clickedERK5QDate @ 3068 NONAME
- _ZN15QCalendarWidget9activatedERK5QDate @ 3069 NONAME
- _ZN15QCalendarWidget9showTodayEv @ 3070 NONAME
- _ZN15QCalendarWidgetC1EP7QWidget @ 3071 NONAME
- _ZN15QCalendarWidgetC2EP7QWidget @ 3072 NONAME
- _ZN15QCalendarWidgetD0Ev @ 3073 NONAME
- _ZN15QCalendarWidgetD1Ev @ 3074 NONAME
- _ZN15QCalendarWidgetD2Ev @ 3075 NONAME
- _ZN15QClipboardEventC1EP13QEventPrivate @ 3076 NONAME
- _ZN15QClipboardEventC2EP13QEventPrivate @ 3077 NONAME
- _ZN15QClipboardEventD0Ev @ 3078 NONAME
- _ZN15QClipboardEventD1Ev @ 3079 NONAME
- _ZN15QClipboardEventD2Ev @ 3080 NONAME
- _ZN15QColumnViewGrip10paintEventEP11QPaintEvent @ 3081 NONAME
- _ZN15QColumnViewGrip11qt_metacallEN11QMetaObject4CallEiPPv @ 3082 NONAME
- _ZN15QColumnViewGrip11qt_metacastEPKc @ 3083 NONAME
- _ZN15QColumnViewGrip14mouseMoveEventEP11QMouseEvent @ 3084 NONAME
- _ZN15QColumnViewGrip15mousePressEventEP11QMouseEvent @ 3085 NONAME
- _ZN15QColumnViewGrip16staticMetaObjectE @ 3086 NONAME DATA 16
- _ZN15QColumnViewGrip17mouseReleaseEventEP11QMouseEvent @ 3087 NONAME
- _ZN15QColumnViewGrip21mouseDoubleClickEventEP11QMouseEvent @ 3088 NONAME
- _ZN15QColumnViewGrip8moveGripEi @ 3089 NONAME
- _ZN15QColumnViewGrip9gripMovedEi @ 3090 NONAME
- _ZN15QColumnViewGripC1EP7QWidget @ 3091 NONAME
- _ZN15QColumnViewGripC1ER22QColumnViewGripPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3092 NONAME
- _ZN15QColumnViewGripC2EP7QWidget @ 3093 NONAME
- _ZN15QColumnViewGripC2ER22QColumnViewGripPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3094 NONAME
- _ZN15QColumnViewGripD0Ev @ 3095 NONAME
- _ZN15QColumnViewGripD1Ev @ 3096 NONAME
- _ZN15QColumnViewGripD2Ev @ 3097 NONAME
- _ZN15QDockAreaLayout12restoreStateER11QDataStreamRK5QListIP11QDockWidgetEb @ 3098 NONAME
- _ZN15QDockAreaLayout13addDockWidgetEN9QInternal12DockPositionEP11QDockWidgetN2Qt11OrientationE @ 3099 NONAME
- _ZN15QDockAreaLayout13separatorMoveE5QListIiERK6QPointS4_P7QVectorI13QLayoutStructE @ 3100 NONAME ABSENT
- _ZN15QDockAreaLayout15splitDockWidgetEP11QDockWidgetS1_N2Qt11OrientationE @ 3101 NONAME
- _ZN15QDockAreaLayout16tabifyDockWidgetEP11QDockWidgetS1_ @ 3102 NONAME
- _ZN15QDockAreaLayout17restoreDockWidgetEP11QDockWidget @ 3103 NONAME
- _ZN15QDockAreaLayout20deleteAllLayoutItemsEv @ 3104 NONAME
- _ZN15QDockAreaLayout4infoE5QListIiE @ 3105 NONAME ABSENT
- _ZN15QDockAreaLayout4infoEP7QWidget @ 3106 NONAME
- _ZN15QDockAreaLayout4itemE5QListIiE @ 3107 NONAME ABSENT
- _ZN15QDockAreaLayout4plugE5QListIiE @ 3108 NONAME ABSENT
- _ZN15QDockAreaLayout5applyEb @ 3109 NONAME
- _ZN15QDockAreaLayout5clearEv @ 3110 NONAME
- _ZN15QDockAreaLayout6removeE5QListIiE @ 3111 NONAME ABSENT
- _ZN15QDockAreaLayout6takeAtEPii @ 3112 NONAME
- _ZN15QDockAreaLayout6unplugE5QListIiE @ 3113 NONAME ABSENT
- _ZN15QDockAreaLayout7getGridEP7QVectorI13QLayoutStructES3_ @ 3114 NONAME
- _ZN15QDockAreaLayout7setGridEP7QVectorI13QLayoutStructES3_ @ 3115 NONAME
- _ZN15QDockAreaLayout8keepSizeEP11QDockWidget @ 3116 NONAME
- _ZN15QDockAreaLayout9fitLayoutEv @ 3117 NONAME
- _ZN15QDockAreaLayout9insertGapE5QListIiEP11QLayoutItem @ 3118 NONAME ABSENT
- _ZN15QDockAreaLayoutC1EP11QMainWindow @ 3119 NONAME
- _ZN15QDockAreaLayoutC2EP11QMainWindow @ 3120 NONAME
- _ZN15QDragEnterEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEE @ 3121 NONAME
- _ZN15QDragEnterEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEE @ 3122 NONAME
- _ZN15QDragEnterEventD0Ev @ 3123 NONAME
- _ZN15QDragEnterEventD1Ev @ 3124 NONAME
- _ZN15QDragEnterEventD2Ev @ 3125 NONAME
- _ZN15QDragLeaveEventC1Ev @ 3126 NONAME
- _ZN15QDragLeaveEventC2Ev @ 3127 NONAME
- _ZN15QDragLeaveEventD0Ev @ 3128 NONAME
- _ZN15QDragLeaveEventD1Ev @ 3129 NONAME
- _ZN15QDragLeaveEventD2Ev @ 3130 NONAME
- _ZN15QGraphicsLayout10invalidateEv @ 3131 NONAME
- _ZN15QGraphicsLayout11widgetEventEP6QEvent @ 3132 NONAME
- _ZN15QGraphicsLayout14updateGeometryEv @ 3133 NONAME
- _ZN15QGraphicsLayout18setContentsMarginsEffff @ 3134 NONAME
- _ZN15QGraphicsLayout8activateEv @ 3135 NONAME
- _ZN15QGraphicsLayoutC2EP19QGraphicsLayoutItem @ 3136 NONAME
- _ZN15QGraphicsLayoutC2ER22QGraphicsLayoutPrivateP19QGraphicsLayoutItem @ 3137 NONAME
- _ZN15QGraphicsLayoutD0Ev @ 3138 NONAME
- _ZN15QGraphicsLayoutD1Ev @ 3139 NONAME
- _ZN15QGraphicsLayoutD2Ev @ 3140 NONAME
- _ZN15QGraphicsSystem23createDefaultPixmapDataEN11QPixmapData9PixelTypeE @ 3141 NONAME
- _ZN15QGraphicsSystemD0Ev @ 3142 NONAME
- _ZN15QGraphicsSystemD1Ev @ 3143 NONAME
- _ZN15QGraphicsSystemD2Ev @ 3144 NONAME
- _ZN15QGraphicsWidget10addActionsE5QListIP7QActionE @ 3145 NONAME
- _ZN15QGraphicsWidget10adjustSizeEv @ 3146 NONAME
- _ZN15QGraphicsWidget10closeEventEP11QCloseEvent @ 3147 NONAME
- _ZN15QGraphicsWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 3148 NONAME
- _ZN15QGraphicsWidget10sceneEventEP6QEvent @ 3149 NONAME
- _ZN15QGraphicsWidget10setPaletteERK8QPalette @ 3150 NONAME
- _ZN15QGraphicsWidget11changeEventEP6QEvent @ 3151 NONAME
- _ZN15QGraphicsWidget11polishEventEv @ 3152 NONAME
- _ZN15QGraphicsWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3153 NONAME
- _ZN15QGraphicsWidget11qt_metacastEPKc @ 3154 NONAME
- _ZN15QGraphicsWidget11resizeEventEP25QGraphicsSceneResizeEvent @ 3155 NONAME
- _ZN15QGraphicsWidget11setGeometryERK6QRectF @ 3156 NONAME
- _ZN15QGraphicsWidget11setTabOrderEPS_S0_ @ 3157 NONAME
- _ZN15QGraphicsWidget12focusInEventEP11QFocusEvent @ 3158 NONAME
- _ZN15QGraphicsWidget12grabShortcutERK12QKeySequenceN2Qt15ShortcutContextE @ 3159 NONAME
- _ZN15QGraphicsWidget12insertActionEP7QActionS1_ @ 3160 NONAME
- _ZN15QGraphicsWidget12removeActionEP7QAction @ 3161 NONAME
- _ZN15QGraphicsWidget12setAttributeEN2Qt15WidgetAttributeEb @ 3162 NONAME
- _ZN15QGraphicsWidget13focusOutEventEP11QFocusEvent @ 3163 NONAME
- _ZN15QGraphicsWidget13insertActionsEP7QAction5QListIS1_E @ 3164 NONAME
- _ZN15QGraphicsWidget14grabMouseEventEP6QEvent @ 3165 NONAME
- _ZN15QGraphicsWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 3166 NONAME
- _ZN15QGraphicsWidget14propertyChangeERK7QStringRK8QVariant @ 3167 NONAME
- _ZN15QGraphicsWidget14setFocusPolicyEN2Qt11FocusPolicyE @ 3168 NONAME
- _ZN15QGraphicsWidget14setWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 3169 NONAME
- _ZN15QGraphicsWidget14setWindowTitleERK7QString @ 3170 NONAME
- _ZN15QGraphicsWidget14updateGeometryEv @ 3171 NONAME
- _ZN15QGraphicsWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 3172 NONAME
- _ZN15QGraphicsWidget15releaseShortcutEi @ 3173 NONAME
- _ZN15QGraphicsWidget16paintWindowFrameEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3174 NONAME
- _ZN15QGraphicsWidget16staticMetaObjectE @ 3175 NONAME DATA 16
- _ZN15QGraphicsWidget16ungrabMouseEventEP6QEvent @ 3176 NONAME
- _ZN15QGraphicsWidget16windowFrameEventEP6QEvent @ 3177 NONAME
- _ZN15QGraphicsWidget17grabKeyboardEventEP6QEvent @ 3178 NONAME
- _ZN15QGraphicsWidget18focusNextPrevChildEb @ 3179 NONAME
- _ZN15QGraphicsWidget18setContentsMarginsEffff @ 3180 NONAME
- _ZN15QGraphicsWidget18setLayoutDirectionEN2Qt15LayoutDirectionE @ 3181 NONAME
- _ZN15QGraphicsWidget18setShortcutEnabledEib @ 3182 NONAME
- _ZN15QGraphicsWidget19ungrabKeyboardEventEP6QEvent @ 3183 NONAME
- _ZN15QGraphicsWidget20unsetLayoutDirectionEv @ 3184 NONAME
- _ZN15QGraphicsWidget21setShortcutAutoRepeatEib @ 3185 NONAME
- _ZN15QGraphicsWidget21setWindowFrameMarginsEffff @ 3186 NONAME
- _ZN15QGraphicsWidget23unsetWindowFrameMarginsEv @ 3187 NONAME
- _ZN15QGraphicsWidget5closeEv @ 3188 NONAME
- _ZN15QGraphicsWidget5eventEP6QEvent @ 3189 NONAME
- _ZN15QGraphicsWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3190 NONAME
- _ZN15QGraphicsWidget6resizeERK6QSizeF @ 3191 NONAME
- _ZN15QGraphicsWidget7setFontERK5QFont @ 3192 NONAME
- _ZN15QGraphicsWidget8setStyleEP6QStyle @ 3193 NONAME
- _ZN15QGraphicsWidget9addActionEP7QAction @ 3194 NONAME
- _ZN15QGraphicsWidget9hideEventEP10QHideEvent @ 3195 NONAME
- _ZN15QGraphicsWidget9moveEventEP23QGraphicsSceneMoveEvent @ 3196 NONAME
- _ZN15QGraphicsWidget9setLayoutEP15QGraphicsLayout @ 3197 NONAME
- _ZN15QGraphicsWidget9showEventEP10QShowEvent @ 3198 NONAME
- _ZN15QGraphicsWidgetC1EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 3199 NONAME
- _ZN15QGraphicsWidgetC1ER22QGraphicsWidgetPrivateP13QGraphicsItemP14QGraphicsScene6QFlagsIN2Qt10WindowTypeEE @ 3200 NONAME
- _ZN15QGraphicsWidgetC2EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 3201 NONAME
- _ZN15QGraphicsWidgetC2ER22QGraphicsWidgetPrivateP13QGraphicsItemP14QGraphicsScene6QFlagsIN2Qt10WindowTypeEE @ 3202 NONAME
- _ZN15QGraphicsWidgetD0Ev @ 3203 NONAME
- _ZN15QGraphicsWidgetD1Ev @ 3204 NONAME
- _ZN15QGraphicsWidgetD2Ev @ 3205 NONAME
- _ZN15QImageIOHandler11jumpToImageEi @ 3206 NONAME
- _ZN15QImageIOHandler15jumpToNextImageEv @ 3207 NONAME
- _ZN15QImageIOHandler5writeERK6QImage @ 3208 NONAME
- _ZN15QImageIOHandler9setDeviceEP9QIODevice @ 3209 NONAME
- _ZN15QImageIOHandler9setFormatERK10QByteArray @ 3210 NONAME
- _ZN15QImageIOHandler9setOptionENS_11ImageOptionERK8QVariant @ 3211 NONAME
- _ZN15QImageIOHandlerC2ER22QImageIOHandlerPrivate @ 3212 NONAME
- _ZN15QImageIOHandlerC2Ev @ 3213 NONAME
- _ZN15QImageIOHandlerD0Ev @ 3214 NONAME
- _ZN15QImageIOHandlerD1Ev @ 3215 NONAME
- _ZN15QImageIOHandlerD2Ev @ 3216 NONAME
- _ZN15QLinearGradient12setFinalStopERK7QPointF @ 3217 NONAME
- _ZN15QLinearGradient8setStartERK7QPointF @ 3218 NONAME
- _ZN15QLinearGradientC1ERK7QPointFS2_ @ 3219 NONAME
- _ZN15QLinearGradientC1Effff @ 3220 NONAME
- _ZN15QLinearGradientC1Ev @ 3221 NONAME
- _ZN15QLinearGradientC2ERK7QPointFS2_ @ 3222 NONAME
- _ZN15QLinearGradientC2Effff @ 3223 NONAME
- _ZN15QLinearGradientC2Ev @ 3224 NONAME
- _ZN15QListWidgetItem4readER11QDataStream @ 3225 NONAME
- _ZN15QListWidgetItem7setDataEiRK8QVariant @ 3226 NONAME
- _ZN15QListWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3227 NONAME
- _ZN15QListWidgetItemC1EP11QListWidgeti @ 3228 NONAME
- _ZN15QListWidgetItemC1ERK5QIconRK7QStringP11QListWidgeti @ 3229 NONAME
- _ZN15QListWidgetItemC1ERK7QStringP11QListWidgeti @ 3230 NONAME
- _ZN15QListWidgetItemC1ERKS_ @ 3231 NONAME
- _ZN15QListWidgetItemC2EP11QListWidgeti @ 3232 NONAME
- _ZN15QListWidgetItemC2ERK5QIconRK7QStringP11QListWidgeti @ 3233 NONAME
- _ZN15QListWidgetItemC2ERK7QStringP11QListWidgeti @ 3234 NONAME
- _ZN15QListWidgetItemC2ERKS_ @ 3235 NONAME
- _ZN15QListWidgetItemD0Ev @ 3236 NONAME
- _ZN15QListWidgetItemD1Ev @ 3237 NONAME
- _ZN15QListWidgetItemD2Ev @ 3238 NONAME
- _ZN15QListWidgetItemaSERKS_ @ 3239 NONAME
- _ZN15QPicturePrivate11checkFormatEv @ 3240 NONAME ABSENT
- _ZN15QPicturePrivate11resetFormatEv @ 3241 NONAME ABSENT
- _ZN15QPicturePrivateC1Ev @ 3242 NONAME ABSENT
- _ZN15QPicturePrivateC2Ev @ 3243 NONAME ABSENT
- _ZN15QProgressDialog10closeEventEP11QCloseEvent @ 3244 NONAME
- _ZN15QProgressDialog10setMaximumEi @ 3245 NONAME
- _ZN15QProgressDialog10setMinimumEi @ 3246 NONAME
- _ZN15QProgressDialog11changeEventEP6QEvent @ 3247 NONAME
- _ZN15QProgressDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 3248 NONAME
- _ZN15QProgressDialog11qt_metacastEPKc @ 3249 NONAME
- _ZN15QProgressDialog11resizeEventEP12QResizeEvent @ 3250 NONAME
- _ZN15QProgressDialog12setAutoCloseEb @ 3251 NONAME
- _ZN15QProgressDialog12setAutoResetEb @ 3252 NONAME
- _ZN15QProgressDialog12setLabelTextERK7QString @ 3253 NONAME
- _ZN15QProgressDialog15setCancelButtonEP11QPushButton @ 3254 NONAME
- _ZN15QProgressDialog16staticMetaObjectE @ 3255 NONAME DATA 16
- _ZN15QProgressDialog18setMinimumDurationEi @ 3256 NONAME
- _ZN15QProgressDialog19setCancelButtonTextERK7QString @ 3257 NONAME
- _ZN15QProgressDialog4openEP7QObjectPKc @ 3258 NONAME
- _ZN15QProgressDialog5resetEv @ 3259 NONAME
- _ZN15QProgressDialog6cancelEv @ 3260 NONAME
- _ZN15QProgressDialog6setBarEP12QProgressBar @ 3261 NONAME
- _ZN15QProgressDialog8canceledEv @ 3262 NONAME
- _ZN15QProgressDialog8setLabelEP6QLabel @ 3263 NONAME
- _ZN15QProgressDialog8setRangeEii @ 3264 NONAME
- _ZN15QProgressDialog8setValueEi @ 3265 NONAME
- _ZN15QProgressDialog9forceShowEv @ 3266 NONAME
- _ZN15QProgressDialog9showEventEP10QShowEvent @ 3267 NONAME
- _ZN15QProgressDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3268 NONAME
- _ZN15QProgressDialogC1ERK7QStringS2_iiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3269 NONAME
- _ZN15QProgressDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3270 NONAME
- _ZN15QProgressDialogC2ERK7QStringS2_iiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3271 NONAME
- _ZN15QProgressDialogD0Ev @ 3272 NONAME
- _ZN15QProgressDialogD1Ev @ 3273 NONAME
- _ZN15QProgressDialogD2Ev @ 3274 NONAME
- _ZN15QRadialGradient13setFocalPointERK7QPointF @ 3275 NONAME
- _ZN15QRadialGradient9setCenterERK7QPointF @ 3276 NONAME
- _ZN15QRadialGradient9setRadiusEf @ 3277 NONAME
- _ZN15QRadialGradientC1ERK7QPointFf @ 3278 NONAME
- _ZN15QRadialGradientC1ERK7QPointFfS2_ @ 3279 NONAME
- _ZN15QRadialGradientC1Efff @ 3280 NONAME
- _ZN15QRadialGradientC1Efffff @ 3281 NONAME
- _ZN15QRadialGradientC1Ev @ 3282 NONAME
- _ZN15QRadialGradientC2ERK7QPointFf @ 3283 NONAME
- _ZN15QRadialGradientC2ERK7QPointFfS2_ @ 3284 NONAME
- _ZN15QRadialGradientC2Efff @ 3285 NONAME
- _ZN15QRadialGradientC2Efffff @ 3286 NONAME
- _ZN15QRadialGradientC2Ev @ 3287 NONAME
- _ZN15QSessionManager11qt_metacallEN11QMetaObject4CallEiPPv @ 3288 NONAME
- _ZN15QSessionManager11qt_metacastEPKc @ 3289 NONAME
- _ZN15QSessionManager16staticMetaObjectE @ 3290 NONAME DATA 16
- _ZN15QSessionManager17allowsInteractionEv @ 3291 NONAME
- _ZN15QSessionManager6cancelEv @ 3292 NONAME
- _ZN15QSessionManagerC1EP12QApplicationR7QStringS3_ @ 3293 NONAME
- _ZN15QSessionManagerC2EP12QApplicationR7QStringS3_ @ 3294 NONAME
- _ZN15QSessionManagerD0Ev @ 3295 NONAME
- _ZN15QSessionManagerD1Ev @ 3296 NONAME
- _ZN15QSessionManagerD2Ev @ 3297 NONAME
- _ZN15QSplitterHandle10paintEventEP11QPaintEvent @ 3298 NONAME
- _ZN15QSplitterHandle11qt_metacallEN11QMetaObject4CallEiPPv @ 3299 NONAME
- _ZN15QSplitterHandle11qt_metacastEPKc @ 3300 NONAME
- _ZN15QSplitterHandle12moveSplitterEi @ 3301 NONAME
- _ZN15QSplitterHandle14mouseMoveEventEP11QMouseEvent @ 3302 NONAME
- _ZN15QSplitterHandle14setOrientationEN2Qt11OrientationE @ 3303 NONAME
- _ZN15QSplitterHandle15mousePressEventEP11QMouseEvent @ 3304 NONAME
- _ZN15QSplitterHandle16staticMetaObjectE @ 3305 NONAME DATA 16
- _ZN15QSplitterHandle17mouseReleaseEventEP11QMouseEvent @ 3306 NONAME
- _ZN15QSplitterHandle20closestLegalPositionEi @ 3307 NONAME
- _ZN15QSplitterHandle5eventEP6QEvent @ 3308 NONAME
- _ZN15QSplitterHandleC1EN2Qt11OrientationEP9QSplitter @ 3309 NONAME
- _ZN15QSplitterHandleC2EN2Qt11OrientationEP9QSplitter @ 3310 NONAME
- _ZN15QStatusTipEventC1ERK7QString @ 3311 NONAME
- _ZN15QStatusTipEventC2ERK7QString @ 3312 NONAME
- _ZN15QStatusTipEventD0Ev @ 3313 NONAME
- _ZN15QStatusTipEventD1Ev @ 3314 NONAME
- _ZN15QStatusTipEventD2Ev @ 3315 NONAME
- _ZN15QStyleOptionTabC1Ei @ 3316 NONAME
- _ZN15QStyleOptionTabC1Ev @ 3317 NONAME
- _ZN15QStyleOptionTabC2Ei @ 3318 NONAME
- _ZN15QStyleOptionTabC2Ev @ 3319 NONAME
- _ZN15QTextBlockGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 3320 NONAME
- _ZN15QTextBlockGroup11qt_metacastEPKc @ 3321 NONAME
- _ZN15QTextBlockGroup12blockRemovedERK10QTextBlock @ 3322 NONAME
- _ZN15QTextBlockGroup13blockInsertedERK10QTextBlock @ 3323 NONAME
- _ZN15QTextBlockGroup16staticMetaObjectE @ 3324 NONAME DATA 16
- _ZN15QTextBlockGroup18blockFormatChangedERK10QTextBlock @ 3325 NONAME
- _ZN15QTextBlockGroupC1EP13QTextDocument @ 3326 NONAME
- _ZN15QTextBlockGroupC1ER22QTextBlockGroupPrivateP13QTextDocument @ 3327 NONAME
- _ZN15QTextBlockGroupC2EP13QTextDocument @ 3328 NONAME
- _ZN15QTextBlockGroupC2ER22QTextBlockGroupPrivateP13QTextDocument @ 3329 NONAME
- _ZN15QTextBlockGroupD0Ev @ 3330 NONAME
- _ZN15QTextBlockGroupD1Ev @ 3331 NONAME
- _ZN15QTextBlockGroupD2Ev @ 3332 NONAME
- _ZN15QTextCharFormat17setUnderlineStyleENS_14UnderlineStyleE @ 3333 NONAME
- _ZN15QTextCharFormat7setFontERK5QFont @ 3334 NONAME
- _ZN15QTextCharFormatC1ERK11QTextFormat @ 3335 NONAME
- _ZN15QTextCharFormatC1Ev @ 3336 NONAME
- _ZN15QTextCharFormatC2ERK11QTextFormat @ 3337 NONAME
- _ZN15QTextCharFormatC2Ev @ 3338 NONAME
- _ZN15QTextListFormatC1ERK11QTextFormat @ 3339 NONAME
- _ZN15QTextListFormatC1Ev @ 3340 NONAME
- _ZN15QTextListFormatC2ERK11QTextFormat @ 3341 NONAME
- _ZN15QTextListFormatC2Ev @ 3342 NONAME
- _ZN15QTreeWidgetItem11addChildrenERK5QListIPS_E @ 3343 NONAME
- _ZN15QTreeWidgetItem11insertChildEiPS_ @ 3344 NONAME
- _ZN15QTreeWidgetItem11itemChangedEv @ 3345 NONAME
- _ZN15QTreeWidgetItem11removeChildEPS_ @ 3346 NONAME
- _ZN15QTreeWidgetItem12sortChildrenEiN2Qt9SortOrderEb @ 3347 NONAME
- _ZN15QTreeWidgetItem12takeChildrenEv @ 3348 NONAME
- _ZN15QTreeWidgetItem14insertChildrenEiRK5QListIPS_E @ 3349 NONAME
- _ZN15QTreeWidgetItem15emitDataChangedEv @ 3350 NONAME
- _ZN15QTreeWidgetItem23setChildIndicatorPolicyENS_20ChildIndicatorPolicyE @ 3351 NONAME
- _ZN15QTreeWidgetItem4readER11QDataStream @ 3352 NONAME
- _ZN15QTreeWidgetItem7setDataEiiRK8QVariant @ 3353 NONAME
- _ZN15QTreeWidgetItem8addChildEPS_ @ 3354 NONAME
- _ZN15QTreeWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3355 NONAME
- _ZN15QTreeWidgetItem9takeChildEi @ 3356 NONAME
- _ZN15QTreeWidgetItemC1EP11QTreeWidgetPS_i @ 3357 NONAME
- _ZN15QTreeWidgetItemC1EP11QTreeWidgetRK11QStringListi @ 3358 NONAME
- _ZN15QTreeWidgetItemC1EP11QTreeWidgeti @ 3359 NONAME
- _ZN15QTreeWidgetItemC1EPS_RK11QStringListi @ 3360 NONAME
- _ZN15QTreeWidgetItemC1EPS_S0_i @ 3361 NONAME
- _ZN15QTreeWidgetItemC1EPS_i @ 3362 NONAME
- _ZN15QTreeWidgetItemC1ERK11QStringListi @ 3363 NONAME
- _ZN15QTreeWidgetItemC1ERKS_ @ 3364 NONAME
- _ZN15QTreeWidgetItemC1Ei @ 3365 NONAME
- _ZN15QTreeWidgetItemC2EP11QTreeWidgetPS_i @ 3366 NONAME
- _ZN15QTreeWidgetItemC2EP11QTreeWidgetRK11QStringListi @ 3367 NONAME
- _ZN15QTreeWidgetItemC2EP11QTreeWidgeti @ 3368 NONAME
- _ZN15QTreeWidgetItemC2EPS_RK11QStringListi @ 3369 NONAME
- _ZN15QTreeWidgetItemC2EPS_S0_i @ 3370 NONAME
- _ZN15QTreeWidgetItemC2EPS_i @ 3371 NONAME
- _ZN15QTreeWidgetItemC2ERK11QStringListi @ 3372 NONAME
- _ZN15QTreeWidgetItemC2ERKS_ @ 3373 NONAME
- _ZN15QTreeWidgetItemC2Ei @ 3374 NONAME
- _ZN15QTreeWidgetItemD0Ev @ 3375 NONAME
- _ZN15QTreeWidgetItemD1Ev @ 3376 NONAME
- _ZN15QTreeWidgetItemD2Ev @ 3377 NONAME
- _ZN15QTreeWidgetItemaSERKS_ @ 3378 NONAME
- _ZN16QAbstractSpinBox10closeEventEP11QCloseEvent @ 3379 NONAME
- _ZN16QAbstractSpinBox10paintEventEP11QPaintEvent @ 3380 NONAME
- _ZN16QAbstractSpinBox10timerEventEP11QTimerEvent @ 3381 NONAME
- _ZN16QAbstractSpinBox10wheelEventEP11QWheelEvent @ 3382 NONAME
- _ZN16QAbstractSpinBox11changeEventEP6QEvent @ 3383 NONAME
- _ZN16QAbstractSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 3384 NONAME
- _ZN16QAbstractSpinBox11qt_metacastEPKc @ 3385 NONAME
- _ZN16QAbstractSpinBox11resizeEventEP12QResizeEvent @ 3386 NONAME
- _ZN16QAbstractSpinBox11setLineEditEP9QLineEdit @ 3387 NONAME
- _ZN16QAbstractSpinBox11setReadOnlyEb @ 3388 NONAME
- _ZN16QAbstractSpinBox11setWrappingEb @ 3389 NONAME
- _ZN16QAbstractSpinBox12focusInEventEP11QFocusEvent @ 3390 NONAME
- _ZN16QAbstractSpinBox12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 3391 NONAME
- _ZN16QAbstractSpinBox13focusOutEventEP11QFocusEvent @ 3392 NONAME
- _ZN16QAbstractSpinBox13interpretTextEv @ 3393 NONAME
- _ZN16QAbstractSpinBox13keyPressEventEP9QKeyEvent @ 3394 NONAME
- _ZN16QAbstractSpinBox14mouseMoveEventEP11QMouseEvent @ 3395 NONAME
- _ZN16QAbstractSpinBox14setAcceleratedEb @ 3396 NONAME
- _ZN16QAbstractSpinBox15editingFinishedEv @ 3397 NONAME
- _ZN16QAbstractSpinBox15keyReleaseEventEP9QKeyEvent @ 3398 NONAME
- _ZN16QAbstractSpinBox15mousePressEventEP11QMouseEvent @ 3399 NONAME
- _ZN16QAbstractSpinBox16contextMenuEventEP17QContextMenuEvent @ 3400 NONAME
- _ZN16QAbstractSpinBox16setButtonSymbolsENS_13ButtonSymbolsE @ 3401 NONAME
- _ZN16QAbstractSpinBox16staticMetaObjectE @ 3402 NONAME DATA 16
- _ZN16QAbstractSpinBox17mouseReleaseEventEP11QMouseEvent @ 3403 NONAME
- _ZN16QAbstractSpinBox17setCorrectionModeENS_14CorrectionModeE @ 3404 NONAME
- _ZN16QAbstractSpinBox19setKeyboardTrackingEb @ 3405 NONAME
- _ZN16QAbstractSpinBox19setSpecialValueTextERK7QString @ 3406 NONAME
- _ZN16QAbstractSpinBox5clearEv @ 3407 NONAME
- _ZN16QAbstractSpinBox5eventEP6QEvent @ 3408 NONAME
- _ZN16QAbstractSpinBox6stepByEi @ 3409 NONAME
- _ZN16QAbstractSpinBox6stepUpEv @ 3410 NONAME
- _ZN16QAbstractSpinBox8setFrameEb @ 3411 NONAME
- _ZN16QAbstractSpinBox8stepDownEv @ 3412 NONAME
- _ZN16QAbstractSpinBox9hideEventEP10QHideEvent @ 3413 NONAME
- _ZN16QAbstractSpinBox9selectAllEv @ 3414 NONAME
- _ZN16QAbstractSpinBox9showEventEP10QShowEvent @ 3415 NONAME
- _ZN16QAbstractSpinBoxC1EP7QWidget @ 3416 NONAME
- _ZN16QAbstractSpinBoxC1ER23QAbstractSpinBoxPrivateP7QWidget @ 3417 NONAME
- _ZN16QAbstractSpinBoxC2EP7QWidget @ 3418 NONAME
- _ZN16QAbstractSpinBoxC2ER23QAbstractSpinBoxPrivateP7QWidget @ 3419 NONAME
- _ZN16QAbstractSpinBoxD0Ev @ 3420 NONAME
- _ZN16QAbstractSpinBoxD1Ev @ 3421 NONAME
- _ZN16QAbstractSpinBoxD2Ev @ 3422 NONAME
- _ZN16QConicalGradient8setAngleEf @ 3423 NONAME
- _ZN16QConicalGradient9setCenterERK7QPointF @ 3424 NONAME
- _ZN16QConicalGradientC1ERK7QPointFf @ 3425 NONAME
- _ZN16QConicalGradientC1Efff @ 3426 NONAME
- _ZN16QConicalGradientC1Ev @ 3427 NONAME
- _ZN16QConicalGradientC2ERK7QPointFf @ 3428 NONAME
- _ZN16QConicalGradientC2Efff @ 3429 NONAME
- _ZN16QConicalGradientC2Ev @ 3430 NONAME
- _ZN16QDesktopServices11displayNameENS_16StandardLocationE @ 3431 NONAME
- _ZN16QDesktopServices13setUrlHandlerERK7QStringP7QObjectPKc @ 3432 NONAME
- _ZN16QDesktopServices15storageLocationENS_16StandardLocationE @ 3433 NONAME
- _ZN16QDesktopServices15unsetUrlHandlerERK7QString @ 3434 NONAME
- _ZN16QDesktopServices7openUrlERK4QUrl @ 3435 NONAME
- _ZN16QDialogButtonBox11changeEventEP6QEvent @ 3436 NONAME
- _ZN16QDialogButtonBox11qt_metacallEN11QMetaObject4CallEiPPv @ 3437 NONAME
- _ZN16QDialogButtonBox11qt_metacastEPKc @ 3438 NONAME
- _ZN16QDialogButtonBox12removeButtonEP15QAbstractButton @ 3439 NONAME
- _ZN16QDialogButtonBox13helpRequestedEv @ 3440 NONAME
- _ZN16QDialogButtonBox14setOrientationEN2Qt11OrientationE @ 3441 NONAME
- _ZN16QDialogButtonBox16setCenterButtonsEb @ 3442 NONAME
- _ZN16QDialogButtonBox16staticMetaObjectE @ 3443 NONAME DATA 16
- _ZN16QDialogButtonBox18setStandardButtonsE6QFlagsINS_14StandardButtonEE @ 3444 NONAME
- _ZN16QDialogButtonBox5clearEv @ 3445 NONAME
- _ZN16QDialogButtonBox5eventEP6QEvent @ 3446 NONAME
- _ZN16QDialogButtonBox7clickedEP15QAbstractButton @ 3447 NONAME
- _ZN16QDialogButtonBox8acceptedEv @ 3448 NONAME
- _ZN16QDialogButtonBox8rejectedEv @ 3449 NONAME
- _ZN16QDialogButtonBox9addButtonENS_14StandardButtonE @ 3450 NONAME
- _ZN16QDialogButtonBox9addButtonEP15QAbstractButtonNS_10ButtonRoleE @ 3451 NONAME
- _ZN16QDialogButtonBox9addButtonERK7QStringNS_10ButtonRoleE @ 3452 NONAME
- _ZN16QDialogButtonBoxC1E6QFlagsINS_14StandardButtonEEN2Qt11OrientationEP7QWidget @ 3453 NONAME
- _ZN16QDialogButtonBoxC1EN2Qt11OrientationEP7QWidget @ 3454 NONAME
- _ZN16QDialogButtonBoxC1EP7QWidget @ 3455 NONAME
- _ZN16QDialogButtonBoxC2E6QFlagsINS_14StandardButtonEEN2Qt11OrientationEP7QWidget @ 3456 NONAME
- _ZN16QDialogButtonBoxC2EN2Qt11OrientationEP7QWidget @ 3457 NONAME
- _ZN16QDialogButtonBoxC2EP7QWidget @ 3458 NONAME
- _ZN16QDialogButtonBoxD0Ev @ 3459 NONAME
- _ZN16QDialogButtonBoxD1Ev @ 3460 NONAME
- _ZN16QDialogButtonBoxD2Ev @ 3461 NONAME
- _ZN16QDoubleValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 3462 NONAME
- _ZN16QDoubleValidator11qt_metacastEPKc @ 3463 NONAME
- _ZN16QDoubleValidator11setDecimalsEi @ 3464 NONAME
- _ZN16QDoubleValidator11setNotationENS_8NotationE @ 3465 NONAME
- _ZN16QDoubleValidator16staticMetaObjectE @ 3466 NONAME DATA 16
- _ZN16QDoubleValidator6setTopEd @ 3467 NONAME
- _ZN16QDoubleValidator8setRangeEddi @ 3468 NONAME
- _ZN16QDoubleValidator9setBottomEd @ 3469 NONAME
- _ZN16QDoubleValidatorC1EP7QObject @ 3470 NONAME
- _ZN16QDoubleValidatorC1EddiP7QObject @ 3471 NONAME
- _ZN16QDoubleValidatorC2EP7QObject @ 3472 NONAME
- _ZN16QDoubleValidatorC2EddiP7QObject @ 3473 NONAME
- _ZN16QDoubleValidatorD0Ev @ 3474 NONAME
- _ZN16QDoubleValidatorD1Ev @ 3475 NONAME
- _ZN16QDoubleValidatorD2Ev @ 3476 NONAME
- _ZN16QFileSystemModel10timerEventEP11QTimerEvent @ 3477 NONAME
- _ZN16QFileSystemModel11fileRenamedERK7QStringS2_S2_ @ 3478 NONAME
- _ZN16QFileSystemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 3479 NONAME
- _ZN16QFileSystemModel11qt_metacastEPKc @ 3480 NONAME
- _ZN16QFileSystemModel11setReadOnlyEb @ 3481 NONAME
- _ZN16QFileSystemModel11setRootPathERK7QString @ 3482 NONAME
- _ZN16QFileSystemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 3483 NONAME
- _ZN16QFileSystemModel14setNameFiltersERK11QStringList @ 3484 NONAME
- _ZN16QFileSystemModel15rootPathChangedERK7QString @ 3485 NONAME
- _ZN16QFileSystemModel15setIconProviderEP17QFileIconProvider @ 3486 NONAME
- _ZN16QFileSystemModel16staticMetaObjectE @ 3487 NONAME DATA 16
- _ZN16QFileSystemModel18setResolveSymlinksEb @ 3488 NONAME
- _ZN16QFileSystemModel21setNameFilterDisablesEb @ 3489 NONAME
- _ZN16QFileSystemModel4sortEiN2Qt9SortOrderE @ 3490 NONAME
- _ZN16QFileSystemModel5eventEP6QEvent @ 3491 NONAME
- _ZN16QFileSystemModel5mkdirERK11QModelIndexRK7QString @ 3492 NONAME
- _ZN16QFileSystemModel7setDataERK11QModelIndexRK8QVarianti @ 3493 NONAME
- _ZN16QFileSystemModel9fetchMoreERK11QModelIndex @ 3494 NONAME
- _ZN16QFileSystemModel9setFilterE6QFlagsIN4QDir6FilterEE @ 3495 NONAME
- _ZN16QFileSystemModelC1EP7QObject @ 3496 NONAME
- _ZN16QFileSystemModelC1ER23QFileSystemModelPrivateP7QObject @ 3497 NONAME
- _ZN16QFileSystemModelC2EP7QObject @ 3498 NONAME
- _ZN16QFileSystemModelC2ER23QFileSystemModelPrivateP7QObject @ 3499 NONAME
- _ZN16QFileSystemModelD0Ev @ 3500 NONAME
- _ZN16QFileSystemModelD1Ev @ 3501 NONAME
- _ZN16QFileSystemModelD2Ev @ 3502 NONAME
- _ZN16QFontEngineMulti11boundingBoxERK12QGlyphLayout @ 3503 NONAME ABSENT
- _ZN16QFontEngineMulti11boundingBoxEj @ 3504 NONAME ABSENT
- _ZN16QFontEngineMulti16addOutlineToPathEffRK12QGlyphLayoutP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 3505 NONAME ABSENT
- _ZN16QFontEngineMulti16alphaMapForGlyphEj @ 3506 NONAME ABSENT
- _ZN16QFontEngineMulti9canRenderEPK5QChari @ 3507 NONAME ABSENT
- _ZN16QFontEngineMultiC2Ei @ 3508 NONAME ABSENT
- _ZN16QFontEngineMultiD0Ev @ 3509 NONAME ABSENT
- _ZN16QFontEngineMultiD1Ev @ 3510 NONAME ABSENT
- _ZN16QFontEngineMultiD2Ev @ 3511 NONAME ABSENT
- _ZN16QPlaceHolderItemC1EP7QWidget @ 3512 NONAME
- _ZN16QPlaceHolderItemC2EP7QWidget @ 3513 NONAME
- _ZN16QRegExpValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 3514 NONAME
- _ZN16QRegExpValidator11qt_metacastEPKc @ 3515 NONAME
- _ZN16QRegExpValidator16staticMetaObjectE @ 3516 NONAME DATA 16
- _ZN16QRegExpValidator9setRegExpERK7QRegExp @ 3517 NONAME
- _ZN16QRegExpValidatorC1EP7QObject @ 3518 NONAME
- _ZN16QRegExpValidatorC1ERK7QRegExpP7QObject @ 3519 NONAME
- _ZN16QRegExpValidatorC2EP7QObject @ 3520 NONAME
- _ZN16QRegExpValidatorC2ERK7QRegExpP7QObject @ 3521 NONAME
- _ZN16QRegExpValidatorD0Ev @ 3522 NONAME
- _ZN16QRegExpValidatorD1Ev @ 3523 NONAME
- _ZN16QRegExpValidatorD2Ev @ 3524 NONAME
- _ZN16QStringListModel10insertRowsEiiRK11QModelIndex @ 3525 NONAME
- _ZN16QStringListModel10removeRowsEiiRK11QModelIndex @ 3526 NONAME
- _ZN16QStringListModel11qt_metacallEN11QMetaObject4CallEiPPv @ 3527 NONAME
- _ZN16QStringListModel11qt_metacastEPKc @ 3528 NONAME
- _ZN16QStringListModel13setStringListERK11QStringList @ 3529 NONAME
- _ZN16QStringListModel16staticMetaObjectE @ 3530 NONAME DATA 16
- _ZN16QStringListModel4sortEiN2Qt9SortOrderE @ 3531 NONAME
- _ZN16QStringListModel7setDataERK11QModelIndexRK8QVarianti @ 3532 NONAME
- _ZN16QStringListModelC1EP7QObject @ 3533 NONAME
- _ZN16QStringListModelC1ERK11QStringListP7QObject @ 3534 NONAME
- _ZN16QStringListModelC2EP7QObject @ 3535 NONAME
- _ZN16QStringListModelC2ERK11QStringListP7QObject @ 3536 NONAME
- _ZN16QStyleHintReturnC1Eii @ 3537 NONAME
- _ZN16QStyleHintReturnC2Eii @ 3538 NONAME
- _ZN16QStyleHintReturnD1Ev @ 3539 NONAME
- _ZN16QStyleHintReturnD2Ev @ 3540 NONAME
- _ZN16QStyleSheetStyle10setPaletteEP7QWidget @ 3541 NONAME
- _ZN16QStyleSheetStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 3542 NONAME
- _ZN16QStyleSheetStyle11qt_metacastEPKc @ 3543 NONAME
- _ZN16QStyleSheetStyle11setGeometryEP7QWidget @ 3544 NONAME
- _ZN16QStyleSheetStyle12focusPaletteEPK7QWidgetPK12QStyleOptionP8QPalette @ 3545 NONAME ABSENT
- _ZN16QStyleSheetStyle12numinstancesE @ 3546 NONAME DATA 4
- _ZN16QStyleSheetStyle12unsetPaletteEP7QWidget @ 3547 NONAME
- _ZN16QStyleSheetStyle13setPropertiesEP7QWidget @ 3548 NONAME
- _ZN16QStyleSheetStyle14isNaturalChildEPK7QWidget @ 3549 NONAME
- _ZN16QStyleSheetStyle15widgetDestroyedEP7QObject @ 3550 NONAME
- _ZN16QStyleSheetStyle16nativeFrameWidthEPK7QWidget @ 3551 NONAME
- _ZN16QStyleSheetStyle16resolveAlignmentEN2Qt15LayoutDirectionE6QFlagsINS0_13AlignmentFlagEE @ 3552 NONAME
- _ZN16QStyleSheetStyle16staticMetaObjectE @ 3553 NONAME DATA 16
- _ZN16QStyleSheetStyle5eventEP6QEvent @ 3554 NONAME
- _ZN16QStyleSheetStyle6polishEP12QApplication @ 3555 NONAME
- _ZN16QStyleSheetStyle6polishEP7QWidget @ 3556 NONAME
- _ZN16QStyleSheetStyle6polishER8QPalette @ 3557 NONAME
- _ZN16QStyleSheetStyle8repolishEP12QApplication @ 3558 NONAME
- _ZN16QStyleSheetStyle8repolishEP7QWidget @ 3559 NONAME
- _ZN16QStyleSheetStyle8unpolishEP12QApplication @ 3560 NONAME
- _ZN16QStyleSheetStyle8unpolishEP7QWidget @ 3561 NONAME
- _ZN16QStyleSheetStyleC1EP6QStyle @ 3562 NONAME
- _ZN16QStyleSheetStyleC2EP6QStyle @ 3563 NONAME
- _ZN16QStyleSheetStyleD0Ev @ 3564 NONAME
- _ZN16QStyleSheetStyleD1Ev @ 3565 NONAME
- _ZN16QStyleSheetStyleD2Ev @ 3566 NONAME
- _ZN16QTableWidgetItem4readER11QDataStream @ 3567 NONAME
- _ZN16QTableWidgetItem7setDataEiRK8QVariant @ 3568 NONAME
- _ZN16QTableWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3569 NONAME
- _ZN16QTableWidgetItemC1ERK5QIconRK7QStringi @ 3570 NONAME
- _ZN16QTableWidgetItemC1ERK7QStringi @ 3571 NONAME
- _ZN16QTableWidgetItemC1ERKS_ @ 3572 NONAME
- _ZN16QTableWidgetItemC1Ei @ 3573 NONAME
- _ZN16QTableWidgetItemC2ERK5QIconRK7QStringi @ 3574 NONAME
- _ZN16QTableWidgetItemC2ERK7QStringi @ 3575 NONAME
- _ZN16QTableWidgetItemC2ERKS_ @ 3576 NONAME
- _ZN16QTableWidgetItemC2Ei @ 3577 NONAME
- _ZN16QTableWidgetItemD0Ev @ 3578 NONAME
- _ZN16QTableWidgetItemD1Ev @ 3579 NONAME
- _ZN16QTableWidgetItemD2Ev @ 3580 NONAME
- _ZN16QTableWidgetItemaSERKS_ @ 3581 NONAME
- _ZN16QTextBlockFormat15setTabPositionsERK5QListIN11QTextOption3TabEE @ 3582 NONAME
- _ZN16QTextBlockFormatC1ERK11QTextFormat @ 3583 NONAME
- _ZN16QTextBlockFormatC1Ev @ 3584 NONAME
- _ZN16QTextBlockFormatC2ERK11QTextFormat @ 3585 NONAME
- _ZN16QTextBlockFormatC2Ev @ 3586 NONAME
- _ZN16QTextFrameFormat9setMarginEf @ 3587 NONAME
- _ZN16QTextFrameFormatC1ERK11QTextFormat @ 3588 NONAME
- _ZN16QTextFrameFormatC1Ev @ 3589 NONAME
- _ZN16QTextFrameFormatC2ERK11QTextFormat @ 3590 NONAME
- _ZN16QTextFrameFormatC2Ev @ 3591 NONAME
- _ZN16QTextImageFormatC1ERK11QTextFormat @ 3592 NONAME
- _ZN16QTextImageFormatC1Ev @ 3593 NONAME
- _ZN16QTextImageFormatC2ERK11QTextFormat @ 3594 NONAME
- _ZN16QTextImageFormatC2Ev @ 3595 NONAME
- _ZN16QTextTableFormatC1ERK11QTextFormat @ 3596 NONAME
- _ZN16QTextTableFormatC1Ev @ 3597 NONAME
- _ZN16QTextTableFormatC2ERK11QTextFormat @ 3598 NONAME
- _ZN16QTextTableFormatC2Ev @ 3599 NONAME
- _ZN17QAbstractItemView10commitDataEP7QWidget @ 3600 NONAME
- _ZN17QAbstractItemView10timerEventEP11QTimerEvent @ 3601 NONAME
- _ZN17QAbstractItemView11closeEditorEP7QWidgetN21QAbstractItemDelegate11EndEditHintE @ 3602 NONAME
- _ZN17QAbstractItemView11dataChangedERK11QModelIndexS2_ @ 3603 NONAME
- _ZN17QAbstractItemView11qt_metacallEN11QMetaObject4CallEiPPv @ 3604 NONAME
- _ZN17QAbstractItemView11qt_metacastEPKc @ 3605 NONAME
- _ZN17QAbstractItemView11resizeEventEP12QResizeEvent @ 3606 NONAME
- _ZN17QAbstractItemView11scrollToTopEv @ 3607 NONAME
- _ZN17QAbstractItemView11setIconSizeERK5QSize @ 3608 NONAME
- _ZN17QAbstractItemView12doAutoScrollEv @ 3609 NONAME
- _ZN17QAbstractItemView12focusInEventEP11QFocusEvent @ 3610 NONAME
- _ZN17QAbstractItemView12rowsInsertedERK11QModelIndexii @ 3611 NONAME
- _ZN17QAbstractItemView12setRootIndexERK11QModelIndex @ 3612 NONAME
- _ZN17QAbstractItemView13doItemsLayoutEv @ 3613 NONAME
- _ZN17QAbstractItemView13doubleClickedERK11QModelIndex @ 3614 NONAME
- _ZN17QAbstractItemView13dragMoveEventEP14QDragMoveEvent @ 3615 NONAME
- _ZN17QAbstractItemView13focusOutEventEP11QFocusEvent @ 3616 NONAME
- _ZN17QAbstractItemView13keyPressEventEP9QKeyEvent @ 3617 NONAME
- _ZN17QAbstractItemView13setAutoScrollEb @ 3618 NONAME
- _ZN17QAbstractItemView13viewportEventEP6QEvent @ 3619 NONAME
- _ZN17QAbstractItemView14clearSelectionEv @ 3620 NONAME
- _ZN17QAbstractItemView14currentChangedERK11QModelIndexS2_ @ 3621 NONAME
- _ZN17QAbstractItemView14dragEnterEventEP15QDragEnterEvent @ 3622 NONAME
- _ZN17QAbstractItemView14dragLeaveEventEP15QDragLeaveEvent @ 3623 NONAME
- _ZN17QAbstractItemView14keyboardSearchERK7QString @ 3624 NONAME
- _ZN17QAbstractItemView14mouseMoveEventEP11QMouseEvent @ 3625 NONAME
- _ZN17QAbstractItemView14scrollToBottomEv @ 3626 NONAME
- _ZN17QAbstractItemView14setDirtyRegionERK7QRegion @ 3627 NONAME
- _ZN17QAbstractItemView14setDragEnabledEb @ 3628 NONAME
- _ZN17QAbstractItemView14setIndexWidgetERK11QModelIndexP7QWidget @ 3629 NONAME
- _ZN17QAbstractItemView14stopAutoScrollEv @ 3630 NONAME
- _ZN17QAbstractItemView15editorDestroyedEP7QObject @ 3631 NONAME
- _ZN17QAbstractItemView15mousePressEventEP11QMouseEvent @ 3632 NONAME
- _ZN17QAbstractItemView15setCurrentIndexERK11QModelIndex @ 3633 NONAME
- _ZN17QAbstractItemView15setDragDropModeENS_12DragDropModeE @ 3634 NONAME
- _ZN17QAbstractItemView15setEditTriggersE6QFlagsINS_11EditTriggerEE @ 3635 NONAME
- _ZN17QAbstractItemView15setItemDelegateEP21QAbstractItemDelegate @ 3636 NONAME
- _ZN17QAbstractItemView15startAutoScrollEv @ 3637 NONAME
- _ZN17QAbstractItemView15viewportEnteredEv @ 3638 NONAME
- _ZN17QAbstractItemView16inputMethodEventEP17QInputMethodEvent @ 3639 NONAME
- _ZN17QAbstractItemView16selectionChangedERK14QItemSelectionS2_ @ 3640 NONAME
- _ZN17QAbstractItemView16setSelectionModeENS_13SelectionModeE @ 3641 NONAME
- _ZN17QAbstractItemView16setTextElideModeEN2Qt13TextElideModeE @ 3642 NONAME
- _ZN17QAbstractItemView16staticMetaObjectE @ 3643 NONAME DATA 16
- _ZN17QAbstractItemView16updateEditorDataEv @ 3644 NONAME
- _ZN17QAbstractItemView16updateGeometriesEv @ 3645 NONAME
- _ZN17QAbstractItemView17mouseReleaseEventEP11QMouseEvent @ 3646 NONAME
- _ZN17QAbstractItemView17scrollDirtyRegionEii @ 3647 NONAME
- _ZN17QAbstractItemView17setSelectionModelEP19QItemSelectionModel @ 3648 NONAME
- _ZN17QAbstractItemView18focusNextPrevChildEb @ 3649 NONAME
- _ZN17QAbstractItemView19setAutoScrollMarginEi @ 3650 NONAME
- _ZN17QAbstractItemView19setTabKeyNavigationEb @ 3651 NONAME
- _ZN17QAbstractItemView20openPersistentEditorERK11QModelIndex @ 3652 NONAME
- _ZN17QAbstractItemView20rowsAboutToBeRemovedERK11QModelIndexii @ 3653 NONAME
- _ZN17QAbstractItemView20setSelectionBehaviorENS_17SelectionBehaviorE @ 3654 NONAME
- _ZN17QAbstractItemView21closePersistentEditorERK11QModelIndex @ 3655 NONAME
- _ZN17QAbstractItemView21mouseDoubleClickEventEP11QMouseEvent @ 3656 NONAME
- _ZN17QAbstractItemView21setDropIndicatorShownEb @ 3657 NONAME
- _ZN17QAbstractItemView21setItemDelegateForRowEiP21QAbstractItemDelegate @ 3658 NONAME
- _ZN17QAbstractItemView21setVerticalScrollModeENS_10ScrollModeE @ 3659 NONAME
- _ZN17QAbstractItemView22updateEditorGeometriesEv @ 3660 NONAME
- _ZN17QAbstractItemView23setAlternatingRowColorsEb @ 3661 NONAME
- _ZN17QAbstractItemView23setHorizontalScrollModeENS_10ScrollModeE @ 3662 NONAME
- _ZN17QAbstractItemView23setVerticalStepsPerItemEi @ 3663 NONAME
- _ZN17QAbstractItemView23verticalScrollbarActionEi @ 3664 NONAME
- _ZN17QAbstractItemView24setDragDropOverwriteModeEb @ 3665 NONAME
- _ZN17QAbstractItemView24setItemDelegateForColumnEiP21QAbstractItemDelegate @ 3666 NONAME
- _ZN17QAbstractItemView25executeDelayedItemsLayoutEv @ 3667 NONAME
- _ZN17QAbstractItemView25horizontalScrollbarActionEi @ 3668 NONAME
- _ZN17QAbstractItemView25setHorizontalStepsPerItemEi @ 3669 NONAME
- _ZN17QAbstractItemView26scheduleDelayedItemsLayoutEv @ 3670 NONAME
- _ZN17QAbstractItemView29verticalScrollbarValueChangedEi @ 3671 NONAME
- _ZN17QAbstractItemView31horizontalScrollbarValueChangedEi @ 3672 NONAME
- _ZN17QAbstractItemView4editERK11QModelIndex @ 3673 NONAME
- _ZN17QAbstractItemView4editERK11QModelIndexNS_11EditTriggerEP6QEvent @ 3674 NONAME
- _ZN17QAbstractItemView5eventEP6QEvent @ 3675 NONAME
- _ZN17QAbstractItemView5resetEv @ 3676 NONAME
- _ZN17QAbstractItemView6updateERK11QModelIndex @ 3677 NONAME
- _ZN17QAbstractItemView7clickedERK11QModelIndex @ 3678 NONAME
- _ZN17QAbstractItemView7enteredERK11QModelIndex @ 3679 NONAME
- _ZN17QAbstractItemView7pressedERK11QModelIndex @ 3680 NONAME
- _ZN17QAbstractItemView8setModelEP18QAbstractItemModel @ 3681 NONAME
- _ZN17QAbstractItemView8setStateENS_5StateE @ 3682 NONAME
- _ZN17QAbstractItemView9activatedERK11QModelIndex @ 3683 NONAME
- _ZN17QAbstractItemView9dropEventEP10QDropEvent @ 3684 NONAME
- _ZN17QAbstractItemView9selectAllEv @ 3685 NONAME
- _ZN17QAbstractItemView9startDragE6QFlagsIN2Qt10DropActionEE @ 3686 NONAME
- _ZN17QAbstractItemViewC2EP7QWidget @ 3687 NONAME
- _ZN17QAbstractItemViewC2ER24QAbstractItemViewPrivateP7QWidget @ 3688 NONAME
- _ZN17QAbstractItemViewD0Ev @ 3689 NONAME
- _ZN17QAbstractItemViewD1Ev @ 3690 NONAME
- _ZN17QAbstractItemViewD2Ev @ 3691 NONAME
- _ZN17QContextMenuEventC1ENS_6ReasonERK6QPoint @ 3692 NONAME
- _ZN17QContextMenuEventC1ENS_6ReasonERK6QPointS3_ @ 3693 NONAME
- _ZN17QContextMenuEventC1ENS_6ReasonERK6QPointS3_6QFlagsIN2Qt16KeyboardModifierEE @ 3694 NONAME
- _ZN17QContextMenuEventC2ENS_6ReasonERK6QPoint @ 3695 NONAME
- _ZN17QContextMenuEventC2ENS_6ReasonERK6QPointS3_ @ 3696 NONAME
- _ZN17QContextMenuEventC2ENS_6ReasonERK6QPointS3_6QFlagsIN2Qt16KeyboardModifierEE @ 3697 NONAME
- _ZN17QContextMenuEventD0Ev @ 3698 NONAME
- _ZN17QContextMenuEventD1Ev @ 3699 NONAME
- _ZN17QContextMenuEventD2Ev @ 3700 NONAME
- _ZN17QDataWidgetMapper10addMappingEP7QWidgeti @ 3701 NONAME
- _ZN17QDataWidgetMapper10addMappingEP7QWidgetiRK10QByteArray @ 3702 NONAME
- _ZN17QDataWidgetMapper10toPreviousEv @ 3703 NONAME
- _ZN17QDataWidgetMapper11qt_metacallEN11QMetaObject4CallEiPPv @ 3704 NONAME
- _ZN17QDataWidgetMapper11qt_metacastEPKc @ 3705 NONAME
- _ZN17QDataWidgetMapper12clearMappingEv @ 3706 NONAME
- _ZN17QDataWidgetMapper12setRootIndexERK11QModelIndex @ 3707 NONAME
- _ZN17QDataWidgetMapper13removeMappingEP7QWidget @ 3708 NONAME
- _ZN17QDataWidgetMapper14setOrientationEN2Qt11OrientationE @ 3709 NONAME
- _ZN17QDataWidgetMapper15setCurrentIndexEi @ 3710 NONAME
- _ZN17QDataWidgetMapper15setItemDelegateEP21QAbstractItemDelegate @ 3711 NONAME
- _ZN17QDataWidgetMapper15setSubmitPolicyENS_12SubmitPolicyE @ 3712 NONAME
- _ZN17QDataWidgetMapper16staticMetaObjectE @ 3713 NONAME DATA 16
- _ZN17QDataWidgetMapper19currentIndexChangedEi @ 3714 NONAME
- _ZN17QDataWidgetMapper20setCurrentModelIndexERK11QModelIndex @ 3715 NONAME
- _ZN17QDataWidgetMapper6revertEv @ 3716 NONAME
- _ZN17QDataWidgetMapper6submitEv @ 3717 NONAME
- _ZN17QDataWidgetMapper6toLastEv @ 3718 NONAME
- _ZN17QDataWidgetMapper6toNextEv @ 3719 NONAME
- _ZN17QDataWidgetMapper7toFirstEv @ 3720 NONAME
- _ZN17QDataWidgetMapper8setModelEP18QAbstractItemModel @ 3721 NONAME
- _ZN17QDataWidgetMapperC1EP7QObject @ 3722 NONAME
- _ZN17QDataWidgetMapperC2EP7QObject @ 3723 NONAME
- _ZN17QDataWidgetMapperD0Ev @ 3724 NONAME
- _ZN17QDataWidgetMapperD1Ev @ 3725 NONAME
- _ZN17QDataWidgetMapperD2Ev @ 3726 NONAME
- _ZN17QDockWidgetLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 3727 NONAME
- _ZN17QDockWidgetLayout11qt_metacastEPKc @ 3728 NONAME
- _ZN17QDockWidgetLayout11setGeometryERK5QRect @ 3729 NONAME
- _ZN17QDockWidgetLayout16setWidgetForRoleENS_4RoleEP7QWidget @ 3730 NONAME
- _ZN17QDockWidgetLayout16staticMetaObjectE @ 3731 NONAME DATA 16
- _ZN17QDockWidgetLayout19setVerticalTitleBarEb @ 3732 NONAME
- _ZN17QDockWidgetLayout6takeAtEi @ 3733 NONAME
- _ZN17QDockWidgetLayout7addItemEP11QLayoutItem @ 3734 NONAME
- _ZN17QDockWidgetLayoutC1EP7QWidget @ 3735 NONAME
- _ZN17QDockWidgetLayoutC2EP7QWidget @ 3736 NONAME
- _ZN17QDockWidgetLayoutD0Ev @ 3737 NONAME
- _ZN17QDockWidgetLayoutD1Ev @ 3738 NONAME
- _ZN17QDockWidgetLayoutD2Ev @ 3739 NONAME
- _ZN17QFileIconProviderC1Ev @ 3740 NONAME
- _ZN17QFileIconProviderC2Ev @ 3741 NONAME
- _ZN17QFileIconProviderD0Ev @ 3742 NONAME
- _ZN17QFileIconProviderD1Ev @ 3743 NONAME
- _ZN17QFileIconProviderD2Ev @ 3744 NONAME
- _ZN17QFileInfoGatherer10removePathERK7QString @ 3745 NONAME
- _ZN17QFileInfoGatherer10updateFileERK7QString @ 3746 NONAME
- _ZN17QFileInfoGatherer11fetchedRootE @ 3747 NONAME DATA 1
- _ZN17QFileInfoGatherer11qt_metacallEN11QMetaObject4CallEiPPv @ 3748 NONAME
- _ZN17QFileInfoGatherer11qt_metacastEPKc @ 3749 NONAME
- _ZN17QFileInfoGatherer12getFileInfosERK7QStringRK11QStringList @ 3750 NONAME
- _ZN17QFileInfoGatherer15setIconProviderEP17QFileIconProvider @ 3751 NONAME
- _ZN17QFileInfoGatherer16staticMetaObjectE @ 3752 NONAME DATA 16
- _ZN17QFileInfoGatherer18setResolveSymlinksEb @ 3753 NONAME
- _ZN17QFileInfoGatherer24fetchExtendedInformationERK7QStringRK11QStringList @ 3754 NONAME
- _ZN17QFileInfoGatherer3runEv @ 3755 NONAME
- _ZN17QFileInfoGatherer4listERK7QString @ 3756 NONAME
- _ZN17QFileInfoGatherer5clearEv @ 3757 NONAME
- _ZN17QFileInfoGatherer5fetchERK9QFileInfoR5QTimeRbR5QListI5QPairI7QStringS0_EERKS8_ @ 3758 NONAME
- _ZN17QFileInfoGatherer7updatesERK7QStringRK5QListI5QPairIS0_9QFileInfoEE @ 3759 NONAME
- _ZN17QFileInfoGathererC1EP7QObject @ 3760 NONAME
- _ZN17QFileInfoGathererC2EP7QObject @ 3761 NONAME
- _ZN17QFileInfoGathererD0Ev @ 3762 NONAME
- _ZN17QFileInfoGathererD1Ev @ 3763 NONAME
- _ZN17QFileInfoGathererD2Ev @ 3764 NONAME
- _ZN17QGraphicsLineItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3765 NONAME
- _ZN17QGraphicsLineItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3766 NONAME
- _ZN17QGraphicsLineItem6setPenERK4QPen @ 3767 NONAME
- _ZN17QGraphicsLineItem7setLineERK6QLineF @ 3768 NONAME
- _ZN17QGraphicsLineItemC1EP13QGraphicsItemP14QGraphicsScene @ 3769 NONAME
- _ZN17QGraphicsLineItemC1ERK6QLineFP13QGraphicsItemP14QGraphicsScene @ 3770 NONAME
- _ZN17QGraphicsLineItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 3771 NONAME
- _ZN17QGraphicsLineItemC2EP13QGraphicsItemP14QGraphicsScene @ 3772 NONAME
- _ZN17QGraphicsLineItemC2ERK6QLineFP13QGraphicsItemP14QGraphicsScene @ 3773 NONAME
- _ZN17QGraphicsLineItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 3774 NONAME
- _ZN17QGraphicsLineItemD0Ev @ 3775 NONAME
- _ZN17QGraphicsLineItemD1Ev @ 3776 NONAME
- _ZN17QGraphicsLineItemD2Ev @ 3777 NONAME
- _ZN17QGraphicsPathItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3778 NONAME
- _ZN17QGraphicsPathItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3779 NONAME
- _ZN17QGraphicsPathItem7setPathERK12QPainterPath @ 3780 NONAME
- _ZN17QGraphicsPathItemC1EP13QGraphicsItemP14QGraphicsScene @ 3781 NONAME
- _ZN17QGraphicsPathItemC1ERK12QPainterPathP13QGraphicsItemP14QGraphicsScene @ 3782 NONAME
- _ZN17QGraphicsPathItemC2EP13QGraphicsItemP14QGraphicsScene @ 3783 NONAME
- _ZN17QGraphicsPathItemC2ERK12QPainterPathP13QGraphicsItemP14QGraphicsScene @ 3784 NONAME
- _ZN17QGraphicsPathItemD0Ev @ 3785 NONAME
- _ZN17QGraphicsPathItemD1Ev @ 3786 NONAME
- _ZN17QGraphicsPathItemD2Ev @ 3787 NONAME
- _ZN17QGraphicsRectItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3788 NONAME
- _ZN17QGraphicsRectItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3789 NONAME
- _ZN17QGraphicsRectItem7setRectERK6QRectF @ 3790 NONAME
- _ZN17QGraphicsRectItemC1EP13QGraphicsItemP14QGraphicsScene @ 3791 NONAME
- _ZN17QGraphicsRectItemC1ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 3792 NONAME
- _ZN17QGraphicsRectItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 3793 NONAME
- _ZN17QGraphicsRectItemC2EP13QGraphicsItemP14QGraphicsScene @ 3794 NONAME
- _ZN17QGraphicsRectItemC2ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 3795 NONAME
- _ZN17QGraphicsRectItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 3796 NONAME
- _ZN17QGraphicsRectItemD0Ev @ 3797 NONAME
- _ZN17QGraphicsRectItemD1Ev @ 3798 NONAME
- _ZN17QGraphicsRectItemD2Ev @ 3799 NONAME
- _ZN17QGraphicsTextItem10adjustSizeEv @ 3800 NONAME
- _ZN17QGraphicsTextItem10sceneEventEP6QEvent @ 3801 NONAME
- _ZN17QGraphicsTextItem11linkHoveredERK7QString @ 3802 NONAME
- _ZN17QGraphicsTextItem11qt_metacallEN11QMetaObject4CallEiPPv @ 3803 NONAME
- _ZN17QGraphicsTextItem11qt_metacastEPKc @ 3804 NONAME
- _ZN17QGraphicsTextItem11setDocumentEP13QTextDocument @ 3805 NONAME
- _ZN17QGraphicsTextItem12focusInEventEP11QFocusEvent @ 3806 NONAME
- _ZN17QGraphicsTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3807 NONAME
- _ZN17QGraphicsTextItem12setPlainTextERK7QString @ 3808 NONAME
- _ZN17QGraphicsTextItem12setTextWidthEf @ 3809 NONAME
- _ZN17QGraphicsTextItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 3810 NONAME
- _ZN17QGraphicsTextItem13focusOutEventEP11QFocusEvent @ 3811 NONAME
- _ZN17QGraphicsTextItem13keyPressEventEP9QKeyEvent @ 3812 NONAME
- _ZN17QGraphicsTextItem13linkActivatedERK7QString @ 3813 NONAME
- _ZN17QGraphicsTextItem13setTextCursorERK11QTextCursor @ 3814 NONAME
- _ZN17QGraphicsTextItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 3815 NONAME
- _ZN17QGraphicsTextItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 3816 NONAME
- _ZN17QGraphicsTextItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 3817 NONAME
- _ZN17QGraphicsTextItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 3818 NONAME
- _ZN17QGraphicsTextItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 3819 NONAME
- _ZN17QGraphicsTextItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 3820 NONAME
- _ZN17QGraphicsTextItem15keyReleaseEventEP9QKeyEvent @ 3821 NONAME
- _ZN17QGraphicsTextItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 3822 NONAME
- _ZN17QGraphicsTextItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 3823 NONAME
- _ZN17QGraphicsTextItem16inputMethodEventEP17QInputMethodEvent @ 3824 NONAME
- _ZN17QGraphicsTextItem16staticMetaObjectE @ 3825 NONAME DATA 16
- _ZN17QGraphicsTextItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 3826 NONAME
- _ZN17QGraphicsTextItem18setTabChangesFocusEb @ 3827 NONAME
- _ZN17QGraphicsTextItem19setDefaultTextColorERK6QColor @ 3828 NONAME
- _ZN17QGraphicsTextItem20setOpenExternalLinksEb @ 3829 NONAME
- _ZN17QGraphicsTextItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 3830 NONAME
- _ZN17QGraphicsTextItem23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 3831 NONAME
- _ZN17QGraphicsTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3832 NONAME
- _ZN17QGraphicsTextItem7setFontERK5QFont @ 3833 NONAME
- _ZN17QGraphicsTextItem7setHtmlERK7QString @ 3834 NONAME
- _ZN17QGraphicsTextItem9dropEventEP27QGraphicsSceneDragDropEvent @ 3835 NONAME
- _ZN17QGraphicsTextItemC1EP13QGraphicsItemP14QGraphicsScene @ 3836 NONAME
- _ZN17QGraphicsTextItemC1ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 3837 NONAME
- _ZN17QGraphicsTextItemC2EP13QGraphicsItemP14QGraphicsScene @ 3838 NONAME
- _ZN17QGraphicsTextItemC2ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 3839 NONAME
- _ZN17QGraphicsTextItemD0Ev @ 3840 NONAME
- _ZN17QGraphicsTextItemD1Ev @ 3841 NONAME
- _ZN17QGraphicsTextItemD2Ev @ 3842 NONAME
- _ZN17QIconEnginePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 3843 NONAME
- _ZN17QIconEnginePlugin11qt_metacastEPKc @ 3844 NONAME
- _ZN17QIconEnginePlugin16staticMetaObjectE @ 3845 NONAME DATA 16
- _ZN17QIconEnginePluginC2EP7QObject @ 3846 NONAME
- _ZN17QIconEnginePluginD0Ev @ 3847 NONAME
- _ZN17QIconEnginePluginD1Ev @ 3848 NONAME
- _ZN17QIconEnginePluginD2Ev @ 3849 NONAME
- _ZN17QInputMethodEvent15setCommitStringERK7QStringii @ 3850 NONAME
- _ZN17QInputMethodEventC1ERK7QStringRK5QListINS_9AttributeEE @ 3851 NONAME
- _ZN17QInputMethodEventC1ERKS_ @ 3852 NONAME
- _ZN17QInputMethodEventC1Ev @ 3853 NONAME
- _ZN17QInputMethodEventC2ERK7QStringRK5QListINS_9AttributeEE @ 3854 NONAME
- _ZN17QInputMethodEventC2ERKS_ @ 3855 NONAME
- _ZN17QInputMethodEventC2Ev @ 3856 NONAME
- _ZN17QMainWindowLayout10addToolBarEN2Qt11ToolBarAreaEP8QToolBarb @ 3857 NONAME
- _ZN17QMainWindowLayout10applyStateER22QMainWindowLayoutStateb @ 3858 NONAME
- _ZN17QMainWindowLayout10invalidateEv @ 3859 NONAME
- _ZN17QMainWindowLayout10tabChangedEv @ 3860 NONAME
- _ZN17QMainWindowLayout11moveToolBarEP8QToolBari @ 3861 NONAME
- _ZN17QMainWindowLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 3862 NONAME
- _ZN17QMainWindowLayout11qt_metacastEPKc @ 3863 NONAME
- _ZN17QMainWindowLayout11setGeometryERK5QRect @ 3864 NONAME
- _ZN17QMainWindowLayout11setTabShapeEN10QTabWidget8TabShapeE @ 3865 NONAME
- _ZN17QMainWindowLayout12restoreStateER11QDataStream @ 3866 NONAME
- _ZN17QMainWindowLayout12setStatusBarEP10QStatusBar @ 3867 NONAME
- _ZN17QMainWindowLayout13addDockWidgetEN2Qt14DockWidgetAreaEP11QDockWidgetNS0_11OrientationE @ 3868 NONAME
- _ZN17QMainWindowLayout13insertToolBarEP8QToolBarS1_ @ 3869 NONAME
- _ZN17QMainWindowLayout13removeToolBarEP8QToolBar @ 3870 NONAME
- _ZN17QMainWindowLayout13separatorMoveERK6QPoint @ 3871 NONAME
- _ZN17QMainWindowLayout14setDockOptionsE6QFlagsIN11QMainWindow10DockOptionEE @ 3872 NONAME
- _ZN17QMainWindowLayout14setTabPositionE6QFlagsIN2Qt14DockWidgetAreaEEN10QTabWidget11TabPositionE @ 3873 NONAME
- _ZN17QMainWindowLayout15addToolBarBreakEN2Qt11ToolBarAreaE @ 3874 NONAME
- _ZN17QMainWindowLayout15doSeparatorMoveEv @ 3875 NONAME ABSENT
- _ZN17QMainWindowLayout15setDocumentModeEb @ 3876 NONAME
- _ZN17QMainWindowLayout15splitDockWidgetEP11QDockWidgetS1_N2Qt11OrientationE @ 3877 NONAME
- _ZN17QMainWindowLayout16endSeparatorMoveERK6QPoint @ 3878 NONAME
- _ZN17QMainWindowLayout16setCentralWidgetEP7QWidget @ 3879 NONAME
- _ZN17QMainWindowLayout16staticMetaObjectE @ 3880 NONAME DATA 16
- _ZN17QMainWindowLayout16tabifyDockWidgetEP11QDockWidgetS1_ @ 3881 NONAME
- _ZN17QMainWindowLayout17animationFinishedEP7QWidget @ 3882 NONAME
- _ZN17QMainWindowLayout17restoreDockWidgetEP11QDockWidget @ 3883 NONAME
- _ZN17QMainWindowLayout18getSeparatorWidgetEv @ 3884 NONAME
- _ZN17QMainWindowLayout18insertToolBarBreakEP8QToolBar @ 3885 NONAME
- _ZN17QMainWindowLayout18removeToolBarBreakEP8QToolBar @ 3886 NONAME
- _ZN17QMainWindowLayout18startSeparatorMoveERK6QPoint @ 3887 NONAME
- _ZN17QMainWindowLayout18updateGapIndicatorEv @ 3888 NONAME
- _ZN17QMainWindowLayout18updateTabBarShapesEv @ 3889 NONAME
- _ZN17QMainWindowLayout21allAnimationsFinishedEv @ 3890 NONAME ABSENT
- _ZN17QMainWindowLayout21toggleToolBarsVisibleEv @ 3891 NONAME
- _ZN17QMainWindowLayout22setVerticalTabsEnabledEb @ 3892 NONAME
- _ZN17QMainWindowLayout4plugEP11QLayoutItem @ 3893 NONAME
- _ZN17QMainWindowLayout5hoverEP11QLayoutItemRK6QPoint @ 3894 NONAME
- _ZN17QMainWindowLayout5raiseEP11QDockWidget @ 3895 NONAME
- _ZN17QMainWindowLayout6revertEP11QLayoutItem @ 3896 NONAME
- _ZN17QMainWindowLayout6takeAtEi @ 3897 NONAME
- _ZN17QMainWindowLayout6unplugEP7QWidget @ 3898 NONAME
- _ZN17QMainWindowLayout7addItemEP11QLayoutItem @ 3899 NONAME
- _ZN17QMainWindowLayout7restoreEb @ 3900 NONAME
- _ZN17QMainWindowLayout8keepSizeEP11QDockWidget @ 3901 NONAME
- _ZN17QMainWindowLayout9getTabBarEv @ 3902 NONAME
- _ZN17QMainWindowLayout9setCornerEN2Qt6CornerENS0_14DockWidgetAreaE @ 3903 NONAME
- _ZN17QMainWindowLayoutC1EP11QMainWindow @ 3904 NONAME
- _ZN17QMainWindowLayoutC2EP11QMainWindow @ 3905 NONAME
- _ZN17QMainWindowLayoutD0Ev @ 3906 NONAME
- _ZN17QMainWindowLayoutD1Ev @ 3907 NONAME
- _ZN17QMainWindowLayoutD2Ev @ 3908 NONAME
- _ZN17QRasterPixmapData15setAlphaChannelERK7QPixmap @ 3909 NONAME
- _ZN17QRasterPixmapData4fillERK6QColor @ 3910 NONAME
- _ZN17QRasterPixmapData6bufferEv @ 3911 NONAME
- _ZN17QRasterPixmapData6resizeEii @ 3912 NONAME
- _ZN17QRasterPixmapData7setMaskERK7QBitmap @ 3913 NONAME
- _ZN17QRasterPixmapData9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 3914 NONAME
- _ZN17QRasterPixmapDataC1EN11QPixmapData9PixelTypeE @ 3915 NONAME
- _ZN17QRasterPixmapDataC2EN11QPixmapData9PixelTypeE @ 3916 NONAME
- _ZN17QRasterPixmapDataD0Ev @ 3917 NONAME
- _ZN17QRasterPixmapDataD1Ev @ 3918 NONAME
- _ZN17QRasterPixmapDataD2Ev @ 3919 NONAME
- _ZN17QStyleOptionFrameC1Ei @ 3920 NONAME
- _ZN17QStyleOptionFrameC1Ev @ 3921 NONAME
- _ZN17QStyleOptionFrameC2Ei @ 3922 NONAME
- _ZN17QStyleOptionFrameC2Ev @ 3923 NONAME
- _ZN17QStyleOptionTabV2C1ERK15QStyleOptionTab @ 3924 NONAME
- _ZN17QStyleOptionTabV2C1Ei @ 3925 NONAME
- _ZN17QStyleOptionTabV2C1Ev @ 3926 NONAME
- _ZN17QStyleOptionTabV2C2ERK15QStyleOptionTab @ 3927 NONAME
- _ZN17QStyleOptionTabV2C2Ei @ 3928 NONAME
- _ZN17QStyleOptionTabV2C2Ev @ 3929 NONAME
- _ZN17QStyleOptionTabV2aSERK15QStyleOptionTab @ 3930 NONAME
- _ZN17QStyleOptionTabV3C1ERK15QStyleOptionTab @ 3931 NONAME
- _ZN17QStyleOptionTabV3C1Ei @ 3932 NONAME
- _ZN17QStyleOptionTabV3C1Ev @ 3933 NONAME
- _ZN17QStyleOptionTabV3C2ERK15QStyleOptionTab @ 3934 NONAME
- _ZN17QStyleOptionTabV3C2Ei @ 3935 NONAME
- _ZN17QStyleOptionTabV3C2Ev @ 3936 NONAME
- _ZN17QStyleOptionTabV3aSERK15QStyleOptionTab @ 3937 NONAME
- _ZN17QTextImageHandler10drawObjectEP8QPainterRK6QRectFP13QTextDocumentiRK11QTextFormat @ 3938 NONAME ABSENT
- _ZN17QTextImageHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 3939 NONAME ABSENT
- _ZN17QTextImageHandler11qt_metacastEPKc @ 3940 NONAME ABSENT
- _ZN17QTextImageHandler13intrinsicSizeEP13QTextDocumentiRK11QTextFormat @ 3941 NONAME ABSENT
- _ZN17QTextImageHandler14externalLoaderE @ 3942 NONAME DATA 4
- _ZN17QTextImageHandler16staticMetaObjectE @ 3943 NONAME DATA 16 ABSENT
- _ZN17QTextImageHandlerC1EP7QObject @ 3944 NONAME ABSENT
- _ZN17QTextImageHandlerC2EP7QObject @ 3945 NONAME ABSENT
- _ZN17QTextInlineObject10setDescentEf @ 3946 NONAME
- _ZN17QTextInlineObject8setWidthEf @ 3947 NONAME
- _ZN17QTextInlineObject9setAscentEf @ 3948 NONAME
- _ZN18QColumnViewPrivate10_q_clickedERK11QModelIndex @ 3949 NONAME
- _ZN18QColumnViewPrivate10initializeEv @ 3950 NONAME
- _ZN18QColumnViewPrivate12_q_gripMovedEi @ 3951 NONAME
- _ZN18QColumnViewPrivate12closeColumnsERK11QModelIndexb @ 3952 NONAME
- _ZN18QColumnViewPrivate12createColumnERK11QModelIndexb @ 3953 NONAME
- _ZN18QColumnViewPrivate16setPreviewWidgetEP7QWidget @ 3954 NONAME
- _ZN18QColumnViewPrivate16updateScrollbarsEv @ 3955 NONAME
- _ZN18QColumnViewPrivate22_q_changeCurrentColumnEv @ 3956 NONAME
- _ZN18QColumnViewPrivate8doLayoutEv @ 3957 NONAME
- _ZN18QColumnViewPrivateC1Ev @ 3958 NONAME
- _ZN18QColumnViewPrivateC2Ev @ 3959 NONAME
- _ZN18QColumnViewPrivateD0Ev @ 3960 NONAME
- _ZN18QColumnViewPrivateD1Ev @ 3961 NONAME
- _ZN18QColumnViewPrivateD2Ev @ 3962 NONAME
- _ZN18QCommandLinkButton10paintEventEP11QPaintEvent @ 3963 NONAME
- _ZN18QCommandLinkButton11qt_metacallEN11QMetaObject4CallEiPPv @ 3964 NONAME
- _ZN18QCommandLinkButton11qt_metacastEPKc @ 3965 NONAME
- _ZN18QCommandLinkButton14setDescriptionERK7QString @ 3966 NONAME
- _ZN18QCommandLinkButton16staticMetaObjectE @ 3967 NONAME DATA 16
- _ZN18QCommandLinkButton5eventEP6QEvent @ 3968 NONAME
- _ZN18QCommandLinkButtonC1EP7QWidget @ 3969 NONAME
- _ZN18QCommandLinkButtonC1ERK7QStringP7QWidget @ 3970 NONAME
- _ZN18QCommandLinkButtonC1ERK7QStringS2_P7QWidget @ 3971 NONAME
- _ZN18QCommandLinkButtonC2EP7QWidget @ 3972 NONAME
- _ZN18QCommandLinkButtonC2ERK7QStringP7QWidget @ 3973 NONAME
- _ZN18QCommandLinkButtonC2ERK7QStringS2_P7QWidget @ 3974 NONAME
- _ZN18QDragResponseEventC1Eb @ 3975 NONAME
- _ZN18QDragResponseEventC2Eb @ 3976 NONAME
- _ZN18QDragResponseEventD0Ev @ 3977 NONAME
- _ZN18QDragResponseEventD1Ev @ 3978 NONAME
- _ZN18QDragResponseEventD2Ev @ 3979 NONAME
- _ZN18QFileDialogPrivate10_q_goToUrlERK4QUrl @ 3980 NONAME
- _ZN18QFileDialogPrivate13_q_showHeaderEP7QAction @ 3981 NONAME
- _ZN18QFileDialogPrivate13_q_showHiddenEv @ 3982 NONAME
- _ZN18QFileDialogPrivate13createWidgetsEv @ 3983 NONAME
- _ZN18QFileDialogPrivate14_q_fileRenamedERK7QStringS0_S0_ @ 3984 NONAME
- _ZN18QFileDialogPrivate14_q_pathChangedERK7QString @ 3985 NONAME
- _ZN18QFileDialogPrivate15_q_rowsInsertedERK11QModelIndex @ 3986 NONAME
- _ZN18QFileDialogPrivate15_q_showListViewEv @ 3987 NONAME
- _ZN18QFileDialogPrivate15removeDirectoryERK7QString @ 3988 NONAME
- _ZN18QFileDialogPrivate16_q_deleteCurrentEv @ 3989 NONAME
- _ZN18QFileDialogPrivate16_q_goToDirectoryERK7QString @ 3990 NONAME
- _ZN18QFileDialogPrivate16_q_renameCurrentEv @ 3991 NONAME
- _ZN18QFileDialogPrivate16_q_useNameFilterEi @ 3992 NONAME
- _ZN18QFileDialogPrivate16initialSelectionERK7QString @ 3993 NONAME
- _ZN18QFileDialogPrivate16workingDirectoryERK7QString @ 3994 NONAME
- _ZN18QFileDialogPrivate17_q_currentChangedERK11QModelIndex @ 3995 NONAME
- _ZN18QFileDialogPrivate17_q_enterDirectoryERK11QModelIndex @ 3996 NONAME
- _ZN18QFileDialogPrivate17_q_updateOkButtonEv @ 3997 NONAME
- _ZN18QFileDialogPrivate17canBeNativeDialogEv @ 3998 NONAME
- _ZN18QFileDialogPrivate17createMenuActionsEv @ 3999 NONAME
- _ZN18QFileDialogPrivate17createToolButtonsEv @ 4000 NONAME
- _ZN18QFileDialogPrivate17emitFilesSelectedERK11QStringList @ 4001 NONAME
- _ZN18QFileDialogPrivate18_q_createDirectoryEv @ 4002 NONAME
- _ZN18QFileDialogPrivate18_q_navigateForwardEv @ 4003 NONAME
- _ZN18QFileDialogPrivate18_q_showContextMenuERK6QPoint @ 4004 NONAME
- _ZN18QFileDialogPrivate18_q_showDetailsViewEv @ 4005 NONAME
- _ZN18QFileDialogPrivate18retranslateStringsEv @ 4006 NONAME
- _ZN18QFileDialogPrivate19_q_navigateBackwardEv @ 4007 NONAME
- _ZN18QFileDialogPrivate19_q_navigateToParentEv @ 4008 NONAME
- _ZN18QFileDialogPrivate19_q_selectionChangedEv @ 4009 NONAME
- _ZN18QFileDialogPrivate21itemViewKeyboardEventEP9QKeyEvent @ 4010 NONAME
- _ZN18QFileDialogPrivate22getEnvironmentVariableERK7QString @ 4011 NONAME
- _ZN18QFileDialogPrivate22retranslateWindowTitleEv @ 4012 NONAME
- _ZN18QFileDialogPrivate23_q_autoCompleteFileNameERK7QString @ 4013 NONAME
- _ZN18QFileDialogPrivate23setLastVisitedDirectoryERK7QString @ 4014 NONAME
- _ZN18QFileDialogPrivate4initERK7QStringS2_S2_ @ 4015 NONAME
- _ZN18QFileDialogPrivate9_q_goHomeEv @ 4016 NONAME
- _ZN18QFileDialogPrivateC1Ev @ 4017 NONAME
- _ZN18QFileDialogPrivateC2Ev @ 4018 NONAME
- _ZN18QFileDialogPrivateD0Ev @ 4019 NONAME
- _ZN18QFileDialogPrivateD1Ev @ 4020 NONAME
- _ZN18QFileDialogPrivateD2Ev @ 4021 NONAME
- _ZN18QGraphicsItemGroup10addToGroupEP13QGraphicsItem @ 4022 NONAME
- _ZN18QGraphicsItemGroup15removeFromGroupEP13QGraphicsItem @ 4023 NONAME
- _ZN18QGraphicsItemGroup5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4024 NONAME
- _ZN18QGraphicsItemGroupC1EP13QGraphicsItemP14QGraphicsScene @ 4025 NONAME
- _ZN18QGraphicsItemGroupC2EP13QGraphicsItemP14QGraphicsScene @ 4026 NONAME
- _ZN18QGraphicsItemGroupD0Ev @ 4027 NONAME
- _ZN18QGraphicsItemGroupD1Ev @ 4028 NONAME
- _ZN18QGraphicsItemGroupD2Ev @ 4029 NONAME
- _ZN18QItemEditorFactory14defaultFactoryEv @ 4030 NONAME
- _ZN18QItemEditorFactory14registerEditorEN8QVariant4TypeEP22QItemEditorCreatorBase @ 4031 NONAME
- _ZN18QItemEditorFactory17setDefaultFactoryEPS_ @ 4032 NONAME
- _ZN18QItemEditorFactoryD0Ev @ 4033 NONAME
- _ZN18QItemEditorFactoryD1Ev @ 4034 NONAME
- _ZN18QItemEditorFactoryD2Ev @ 4035 NONAME
- _ZN18QPixmapDataFactory8instanceEi @ 4036 NONAME ABSENT
- _ZN18QPixmapDataFactoryD0Ev @ 4037 NONAME ABSENT
- _ZN18QPixmapDataFactoryD1Ev @ 4038 NONAME ABSENT
- _ZN18QPixmapDataFactoryD2Ev @ 4039 NONAME ABSENT
- _ZN18QStandardItemModel10insertRowsEiiRK11QModelIndex @ 4040 NONAME
- _ZN18QStandardItemModel10removeRowsEiiRK11QModelIndex @ 4041 NONAME
- _ZN18QStandardItemModel10takeColumnEi @ 4042 NONAME
- _ZN18QStandardItemModel11itemChangedEP13QStandardItem @ 4043 NONAME
- _ZN18QStandardItemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4044 NONAME
- _ZN18QStandardItemModel11qt_metacastEPKc @ 4045 NONAME
- _ZN18QStandardItemModel11setItemDataERK11QModelIndexRK4QMapIi8QVariantE @ 4046 NONAME
- _ZN18QStandardItemModel11setRowCountEi @ 4047 NONAME
- _ZN18QStandardItemModel11setSortRoleEi @ 4048 NONAME
- _ZN18QStandardItemModel12appendColumnERK5QListIP13QStandardItemE @ 4049 NONAME
- _ZN18QStandardItemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 4050 NONAME
- _ZN18QStandardItemModel12insertColumnEiRK5QListIP13QStandardItemE @ 4051 NONAME
- _ZN18QStandardItemModel13insertColumnsEiiRK11QModelIndex @ 4052 NONAME
- _ZN18QStandardItemModel13removeColumnsEiiRK11QModelIndex @ 4053 NONAME
- _ZN18QStandardItemModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4054 NONAME
- _ZN18QStandardItemModel14setColumnCountEi @ 4055 NONAME
- _ZN18QStandardItemModel16setItemPrototypeEPK13QStandardItem @ 4056 NONAME
- _ZN18QStandardItemModel16staticMetaObjectE @ 4057 NONAME DATA 16
- _ZN18QStandardItemModel21setVerticalHeaderItemEiP13QStandardItem @ 4058 NONAME
- _ZN18QStandardItemModel22takeVerticalHeaderItemEi @ 4059 NONAME
- _ZN18QStandardItemModel23setHorizontalHeaderItemEiP13QStandardItem @ 4060 NONAME
- _ZN18QStandardItemModel23setVerticalHeaderLabelsERK11QStringList @ 4061 NONAME
- _ZN18QStandardItemModel24takeHorizontalHeaderItemEi @ 4062 NONAME
- _ZN18QStandardItemModel25setHorizontalHeaderLabelsERK11QStringList @ 4063 NONAME
- _ZN18QStandardItemModel4sortEiN2Qt9SortOrderE @ 4064 NONAME
- _ZN18QStandardItemModel5clearEv @ 4065 NONAME
- _ZN18QStandardItemModel7setDataERK11QModelIndexRK8QVarianti @ 4066 NONAME
- _ZN18QStandardItemModel7setItemEiiP13QStandardItem @ 4067 NONAME
- _ZN18QStandardItemModel7takeRowEi @ 4068 NONAME
- _ZN18QStandardItemModel8takeItemEii @ 4069 NONAME
- _ZN18QStandardItemModel9appendRowERK5QListIP13QStandardItemE @ 4070 NONAME
- _ZN18QStandardItemModel9insertRowEiRK5QListIP13QStandardItemE @ 4071 NONAME
- _ZN18QStandardItemModelC1EP7QObject @ 4072 NONAME
- _ZN18QStandardItemModelC1ER25QStandardItemModelPrivateP7QObject @ 4073 NONAME
- _ZN18QStandardItemModelC1EiiP7QObject @ 4074 NONAME
- _ZN18QStandardItemModelC2EP7QObject @ 4075 NONAME
- _ZN18QStandardItemModelC2ER25QStandardItemModelPrivateP7QObject @ 4076 NONAME
- _ZN18QStandardItemModelC2EiiP7QObject @ 4077 NONAME
- _ZN18QStandardItemModelD0Ev @ 4078 NONAME
- _ZN18QStandardItemModelD1Ev @ 4079 NONAME
- _ZN18QStandardItemModelD2Ev @ 4080 NONAME
- _ZN18QStyleOptionButtonC1Ei @ 4081 NONAME
- _ZN18QStyleOptionButtonC1Ev @ 4082 NONAME
- _ZN18QStyleOptionButtonC2Ei @ 4083 NONAME
- _ZN18QStyleOptionButtonC2Ev @ 4084 NONAME
- _ZN18QStyleOptionHeaderC1Ei @ 4085 NONAME
- _ZN18QStyleOptionHeaderC1Ev @ 4086 NONAME
- _ZN18QStyleOptionHeaderC2Ei @ 4087 NONAME
- _ZN18QStyleOptionHeaderC2Ev @ 4088 NONAME
- _ZN18QStyleOptionSliderC1Ei @ 4089 NONAME
- _ZN18QStyleOptionSliderC1Ev @ 4090 NONAME
- _ZN18QStyleOptionSliderC2Ei @ 4091 NONAME
- _ZN18QStyleOptionSliderC2Ev @ 4092 NONAME
- _ZN18QSyntaxHighlighter11qt_metacallEN11QMetaObject4CallEiPPv @ 4093 NONAME
- _ZN18QSyntaxHighlighter11qt_metacastEPKc @ 4094 NONAME
- _ZN18QSyntaxHighlighter11rehighlightEv @ 4095 NONAME
- _ZN18QSyntaxHighlighter11setDocumentEP13QTextDocument @ 4096 NONAME
- _ZN18QSyntaxHighlighter16staticMetaObjectE @ 4097 NONAME DATA 16
- _ZN18QSyntaxHighlighter20setCurrentBlockStateEi @ 4098 NONAME
- _ZN18QSyntaxHighlighter23setCurrentBlockUserDataEP18QTextBlockUserData @ 4099 NONAME
- _ZN18QSyntaxHighlighter9setFormatEiiRK15QTextCharFormat @ 4100 NONAME
- _ZN18QSyntaxHighlighter9setFormatEiiRK5QFont @ 4101 NONAME
- _ZN18QSyntaxHighlighter9setFormatEiiRK6QColor @ 4102 NONAME
- _ZN18QSyntaxHighlighterC2EP13QTextDocument @ 4103 NONAME
- _ZN18QSyntaxHighlighterC2EP7QObject @ 4104 NONAME
- _ZN18QSyntaxHighlighterC2EP9QTextEdit @ 4105 NONAME
- _ZN18QSyntaxHighlighterD0Ev @ 4106 NONAME
- _ZN18QSyntaxHighlighterD1Ev @ 4107 NONAME
- _ZN18QSyntaxHighlighterD2Ev @ 4108 NONAME
- _ZN18QTextBlockUserDataD0Ev @ 4109 NONAME
- _ZN18QTextBlockUserDataD1Ev @ 4110 NONAME
- _ZN18QTextBlockUserDataD2Ev @ 4111 NONAME
- _ZN18QTextureGlyphCache8populateERK12QTextItemIntRK15QVarLengthArrayIjLi256EERKS3_I11QFixedPointLi256EE @ 4112 NONAME
- _ZN19QAbstractProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4113 NONAME
- _ZN19QAbstractProxyModel11qt_metacastEPKc @ 4114 NONAME
- _ZN19QAbstractProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4115 NONAME
- _ZN19QAbstractProxyModel14setSourceModelEP18QAbstractItemModel @ 4116 NONAME
- _ZN19QAbstractProxyModel16staticMetaObjectE @ 4117 NONAME DATA 16
- _ZN19QAbstractProxyModel6revertEv @ 4118 NONAME
- _ZN19QAbstractProxyModel6submitEv @ 4119 NONAME
- _ZN19QAbstractProxyModel7setDataERK11QModelIndexRK8QVarianti @ 4120 NONAME
- _ZN19QAbstractProxyModelC2EP7QObject @ 4121 NONAME
- _ZN19QAbstractProxyModelC2ER26QAbstractProxyModelPrivateP7QObject @ 4122 NONAME
- _ZN19QAbstractProxyModelD0Ev @ 4123 NONAME
- _ZN19QAbstractProxyModelD1Ev @ 4124 NONAME
- _ZN19QAbstractProxyModelD2Ev @ 4125 NONAME
- _ZN19QAbstractScrollArea10paintEventEP11QPaintEvent @ 4126 NONAME
- _ZN19QAbstractScrollArea10wheelEventEP11QWheelEvent @ 4127 NONAME
- _ZN19QAbstractScrollArea11qt_metacallEN11QMetaObject4CallEiPPv @ 4128 NONAME
- _ZN19QAbstractScrollArea11qt_metacastEPKc @ 4129 NONAME
- _ZN19QAbstractScrollArea11resizeEventEP12QResizeEvent @ 4130 NONAME
- _ZN19QAbstractScrollArea11setViewportEP7QWidget @ 4131 NONAME
- _ZN19QAbstractScrollArea13dragMoveEventEP14QDragMoveEvent @ 4132 NONAME
- _ZN19QAbstractScrollArea13keyPressEventEP9QKeyEvent @ 4133 NONAME
- _ZN19QAbstractScrollArea13setupViewportEP7QWidget @ 4134 NONAME
- _ZN19QAbstractScrollArea13viewportEventEP6QEvent @ 4135 NONAME
- _ZN19QAbstractScrollArea14dragEnterEventEP15QDragEnterEvent @ 4136 NONAME
- _ZN19QAbstractScrollArea14dragLeaveEventEP15QDragLeaveEvent @ 4137 NONAME
- _ZN19QAbstractScrollArea14mouseMoveEventEP11QMouseEvent @ 4138 NONAME
- _ZN19QAbstractScrollArea15mousePressEventEP11QMouseEvent @ 4139 NONAME
- _ZN19QAbstractScrollArea15setCornerWidgetEP7QWidget @ 4140 NONAME
- _ZN19QAbstractScrollArea16contextMenuEventEP17QContextMenuEvent @ 4141 NONAME
- _ZN19QAbstractScrollArea16scrollBarWidgetsE6QFlagsIN2Qt13AlignmentFlagEE @ 4142 NONAME
- _ZN19QAbstractScrollArea16scrollContentsByEii @ 4143 NONAME
- _ZN19QAbstractScrollArea16staticMetaObjectE @ 4144 NONAME DATA 16
- _ZN19QAbstractScrollArea17mouseReleaseEventEP11QMouseEvent @ 4145 NONAME
- _ZN19QAbstractScrollArea18addScrollBarWidgetEP7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 4146 NONAME
- _ZN19QAbstractScrollArea18setViewportMarginsEiiii @ 4147 NONAME
- _ZN19QAbstractScrollArea20setVerticalScrollBarEP10QScrollBar @ 4148 NONAME
- _ZN19QAbstractScrollArea21mouseDoubleClickEventEP11QMouseEvent @ 4149 NONAME
- _ZN19QAbstractScrollArea22setHorizontalScrollBarEP10QScrollBar @ 4150 NONAME
- _ZN19QAbstractScrollArea26setVerticalScrollBarPolicyEN2Qt15ScrollBarPolicyE @ 4151 NONAME
- _ZN19QAbstractScrollArea28setHorizontalScrollBarPolicyEN2Qt15ScrollBarPolicyE @ 4152 NONAME
- _ZN19QAbstractScrollArea5eventEP6QEvent @ 4153 NONAME
- _ZN19QAbstractScrollArea9dropEventEP10QDropEvent @ 4154 NONAME
- _ZN19QAbstractScrollAreaC1EP7QWidget @ 4155 NONAME
- _ZN19QAbstractScrollAreaC1ER26QAbstractScrollAreaPrivateP7QWidget @ 4156 NONAME
- _ZN19QAbstractScrollAreaC2EP7QWidget @ 4157 NONAME
- _ZN19QAbstractScrollAreaC2ER26QAbstractScrollAreaPrivateP7QWidget @ 4158 NONAME
- _ZN19QAbstractScrollAreaD0Ev @ 4159 NONAME
- _ZN19QAbstractScrollAreaD1Ev @ 4160 NONAME
- _ZN19QAbstractScrollAreaD2Ev @ 4161 NONAME
- _ZN19QApplicationPrivate10animate_uiE @ 4162 NONAME DATA 1
- _ZN19QApplicationPrivate10closePopupEP7QWidget @ 4163 NONAME
- _ZN19QApplicationPrivate10enterModalEP7QWidget @ 4164 NONAME
- _ZN19QApplicationPrivate10initializeEv @ 4165 NONAME
- _ZN19QApplicationPrivate10leaveModalEP7QWidget @ 4166 NONAME
- _ZN19QApplicationPrivate10modalStateEv @ 4167 NONAME
- _ZN19QApplicationPrivate10styleSheetE @ 4168 NONAME DATA 4
- _ZN19QApplicationPrivate11main_widgetE @ 4169 NONAME DATA 4
- _ZN19QApplicationPrivate11widgetCountE @ 4170 NONAME DATA 1
- _ZN19QApplicationPrivate12animate_menuE @ 4171 NONAME DATA 1
- _ZN19QApplicationPrivate12fade_tooltipE @ 4172 NONAME DATA 1
- _ZN19QApplicationPrivate12focus_widgetE @ 4173 NONAME DATA 4
- _ZN19QApplicationPrivate12inputContextE @ 4174 NONAME DATA 4
- _ZN19QApplicationPrivate12oldEditFocusE @ 4175 NONAME DATA 4
- _ZN19QApplicationPrivate12popupWidgetsE @ 4176 NONAME DATA 4
- _ZN19QApplicationPrivate13active_windowE @ 4177 NONAME DATA 4
- _ZN19QApplicationPrivate13animate_comboE @ 4178 NONAME DATA 1
- _ZN19QApplicationPrivate13mouse_buttonsE @ 4179 NONAME DATA 4
- _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent @ 4180 NONAME
- _ZN19QApplicationPrivate13scanCodeCacheE @ 4181 NONAME DATA 4
- _ZN19QApplicationPrivate13setSystemFontERK5QFont @ 4182 NONAME
- _ZN19QApplicationPrivate13styleOverrideE @ 4183 NONAME DATA 4
- _ZN19QApplicationPrivate14autoSipEnabledE @ 4184 NONAME DATA 1
- _ZN19QApplicationPrivate14enterModal_sysEP7QWidget @ 4185 NONAME
- _ZN19QApplicationPrivate14leaveModal_sysEP7QWidget @ 4186 NONAME
- _ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_E @ 4187 NONAME ABSENT
- _ZN19QApplicationPrivate14setFocusWidgetEP7QWidgetN2Qt11FocusReasonE @ 4188 NONAME
- _ZN19QApplicationPrivate14shouldSetFocusEP7QWidgetN2Qt11FocusPolicyE @ 4189 NONAME
- _ZN19QApplicationPrivate14tryModalHelperEP7QWidgetPS1_ @ 4190 NONAME
- _ZN19QApplicationPrivate15animate_toolboxE @ 4191 NONAME DATA 1
- _ZN19QApplicationPrivate15animate_tooltipE @ 4192 NONAME DATA 1
- _ZN19QApplicationPrivate15currentPlatformEv @ 4193 NONAME
- _ZN19QApplicationPrivate15graphics_systemE @ 4194 NONAME DATA 4
- _ZN19QApplicationPrivate15process_cmdlineEv @ 4195 NONAME
- _ZN19QApplicationPrivate16isBlockedByModalEP7QWidget @ 4196 NONAME
- _ZN19QApplicationPrivate16keypadNavigationE @ 4197 NONAME DATA 1 ABSENT
- _ZN19QApplicationPrivate16modifier_buttonsE @ 4198 NONAME DATA 4
- _ZN19QApplicationPrivate16setSystemPaletteERK8QPalette @ 4199 NONAME
- _ZN19QApplicationPrivate17cursor_flash_timeE @ 4200 NONAME DATA 4
- _ZN19QApplicationPrivate17leaveAfterReleaseE @ 4201 NONAME DATA 4
- _ZN19QApplicationPrivate17pickMouseReceiverEP7QWidgetRK6QPointRS2_N6QEvent4TypeE6QFlagsIN2Qt11MouseButtonEES1_S1_ @ 4202 NONAME
- _ZN19QApplicationPrivate17setPalette_helperERK8QPalettePKcb @ 4203 NONAME
- _ZN19QApplicationPrivate18dispatchEnterLeaveEP7QWidgetS1_ @ 4204 NONAME
- _ZN19QApplicationPrivate18resolveS60ScanCodeEij @ 4205 NONAME
- _ZN19QApplicationPrivate18wheel_scroll_linesE @ 4206 NONAME DATA 4
- _ZN19QApplicationPrivate19app_compile_versionE @ 4207 NONAME DATA 4
- _ZN19QApplicationPrivate19hidden_focus_widgetE @ 4208 NONAME DATA 4
- _ZN19QApplicationPrivate19keyboard_input_timeE @ 4209 NONAME DATA 4
- _ZN19QApplicationPrivate20emitLastWindowClosedEv @ 4210 NONAME
- _ZN19QApplicationPrivate20graphics_system_nameE @ 4211 NONAME DATA 4
- _ZN19QApplicationPrivate21createEventDispatcherEv @ 4212 NONAME
- _ZN19QApplicationPrivate21obey_desktop_settingsE @ 4213 NONAME DATA 1
- _ZN19QApplicationPrivate22quitOnLastWindowClosedE @ 4214 NONAME DATA 1
- _ZN19QApplicationPrivate23auto_sip_on_mouse_focusE @ 4215 NONAME DATA 1 ABSENT
- _ZN19QApplicationPrivate23mouse_double_click_timeE @ 4216 NONAME DATA 4
- _ZN19QApplicationPrivate25focusNextPrevChild_helperEP7QWidgetb @ 4217 NONAME
- _ZN19QApplicationPrivate27initializeWidgetPaletteHashEv @ 4218 NONAME
- _ZN19QApplicationPrivate4selfE @ 4219 NONAME DATA 4
- _ZN19QApplicationPrivate7app_palE @ 4220 NONAME DATA 4
- _ZN19QApplicationPrivate7set_palE @ 4221 NONAME DATA 4
- _ZN19QApplicationPrivate7sys_palE @ 4222 NONAME DATA 4
- _ZN19QApplicationPrivate8app_fontE @ 4223 NONAME DATA 4
- _ZN19QApplicationPrivate8app_iconE @ 4224 NONAME DATA 4
- _ZN19QApplicationPrivate8set_fontE @ 4225 NONAME DATA 4
- _ZN19QApplicationPrivate8sys_fontE @ 4226 NONAME DATA 4
- _ZN19QApplicationPrivate9app_cspecE @ 4227 NONAME DATA 4
- _ZN19QApplicationPrivate9app_strutE @ 4228 NONAME DATA 8
- _ZN19QApplicationPrivate9app_styleE @ 4229 NONAME DATA 4
- _ZN19QApplicationPrivate9constructEv @ 4230 NONAME
- _ZN19QApplicationPrivate9fade_menuE @ 4231 NONAME DATA 1
- _ZN19QApplicationPrivate9openPopupEP7QWidget @ 4232 NONAME
- _ZN19QApplicationPrivateC1ERiPPcN12QApplication4TypeE @ 4233 NONAME
- _ZN19QApplicationPrivateC2ERiPPcN12QApplication4TypeE @ 4234 NONAME
- _ZN19QApplicationPrivateD0Ev @ 4235 NONAME
- _ZN19QApplicationPrivateD1Ev @ 4236 NONAME
- _ZN19QApplicationPrivateD2Ev @ 4237 NONAME
- _ZN19QCoeFepInputContext10Extension1ERi @ 4238 NONAME
- _ZN19QCoeFepInputContext10applyHintsE6QFlagsIN2Qt15InputMethodHintEE @ 4239 NONAME
- _ZN19QCoeFepInputContext11applyFormatEP5QListIN17QInputMethodEvent9AttributeEE @ 4240 NONAME
- _ZN19QCoeFepInputContext11filterEventEPK6QEvent @ 4241 NONAME
- _ZN19QCoeFepInputContext11qt_metacallEN11QMetaObject4CallEiPPv @ 4242 NONAME
- _ZN19QCoeFepInputContext11qt_metacastEPKc @ 4243 NONAME
- _ZN19QCoeFepInputContext11updateHintsEv @ 4244 NONAME ABSENT
- _ZN19QCoeFepInputContext12mouseHandlerEiP11QMouseEvent @ 4245 NONAME
- _ZN19QCoeFepInputContext14setFocusWidgetEP7QWidget @ 4246 NONAME
- _ZN19QCoeFepInputContext15MopSupplyObjectE8TTypeUid @ 4247 NONAME
- _ZN19QCoeFepInputContext15widgetDestroyedEP7QWidget @ 4248 NONAME
- _ZN19QCoeFepInputContext16staticMetaObjectE @ 4249 NONAME DATA 16
- _ZN19QCoeFepInputContext17inputCapabilitiesEv @ 4250 NONAME
- _ZN19QCoeFepInputContext19CancelFepInlineEditEv @ 4251 NONAME
- _ZN19QCoeFepInputContext19StartFepInlineEditLERK7TDesC16iiPK15MFormCustomDrawR29MFepInlineTextFormatRetrieverR39MFepPointerEventHandlerDuringInlineEdit @ 4252 NONAME
- _ZN19QCoeFepInputContext19commitCurrentStringEb @ 4253 NONAME
- _ZN19QCoeFepInputContext20UpdateFepInlineTextLERK7TDesC16i @ 4254 NONAME
- _ZN19QCoeFepInputContext22DoCommitFepInlineEditLEv @ 4255 NONAME
- _ZN19QCoeFepInputContext25SetCursorSelectionForFepLERK16TCursorSelection @ 4256 NONAME
- _ZN19QCoeFepInputContext29SetStateTransferingOwnershipLEPN33MCoeFepAwareTextEditor_Extension16CStateE4TUid @ 4257 NONAME
- _ZN19QCoeFepInputContext33SetInlineEditingCursorVisibilityLEi @ 4258 NONAME
- _ZN19QCoeFepInputContext5StateE4TUid @ 4259 NONAME
- _ZN19QCoeFepInputContext5resetEv @ 4260 NONAME
- _ZN19QCoeFepInputContext6updateEv @ 4261 NONAME
- _ZN19QCoeFepInputContext8languageEv @ 4262 NONAME
- _ZN19QCoeFepInputContextC1EP7QObject @ 4263 NONAME
- _ZN19QCoeFepInputContextC2EP7QObject @ 4264 NONAME
- _ZN19QCoeFepInputContextD0Ev @ 4265 NONAME
- _ZN19QCoeFepInputContextD1Ev @ 4266 NONAME
- _ZN19QCoeFepInputContextD2Ev @ 4267 NONAME
- _ZN19QDockAreaLayoutInfo12restoreStateER11QDataStreamR5QListIP11QDockWidgetEb @ 4268 NONAME
- _ZN19QDockAreaLayoutInfo13separatorMoveEiiP7QVectorI13QLayoutStructE @ 4269 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo13setCurrentTabEP7QWidget @ 4270 NONAME
- _ZN19QDockAreaLayoutInfo14setTabBarShapeEi @ 4271 NONAME
- _ZN19QDockAreaLayoutInfo15setCurrentTabIdEj @ 4272 NONAME
- _ZN19QDockAreaLayoutInfo20deleteAllLayoutItemsEv @ 4273 NONAME
- _ZN19QDockAreaLayoutInfo3tabEiP11QLayoutItem @ 4274 NONAME
- _ZN19QDockAreaLayoutInfo4infoE5QListIiE @ 4275 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo4infoEP7QWidget @ 4276 NONAME
- _ZN19QDockAreaLayoutInfo4itemE5QListIiE @ 4277 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo4plugE5QListIiE @ 4278 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo5applyEb @ 4279 NONAME
- _ZN19QDockAreaLayoutInfo5clearEv @ 4280 NONAME
- _ZN19QDockAreaLayoutInfo5splitEiN2Qt11OrientationEP11QLayoutItem @ 4281 NONAME
- _ZN19QDockAreaLayoutInfo6removeE5QListIiE @ 4282 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo6takeAtEPii @ 4283 NONAME
- _ZN19QDockAreaLayoutInfo6unnestEi @ 4284 NONAME
- _ZN19QDockAreaLayoutInfo6unplugE5QListIiE @ 4285 NONAME ABSENT
- _ZN19QDockAreaLayoutInfo8fitItemsEv @ 4286 NONAME
- _ZN19QDockAreaLayoutInfo9insertGapE5QListIiEP11QLayoutItem @ 4287 NONAME ABSENT
- _ZN19QDockAreaLayoutInfoC1EiN9QInternal12DockPositionEN2Qt11OrientationEiP11QMainWindow @ 4288 NONAME
- _ZN19QDockAreaLayoutInfoC1Ev @ 4289 NONAME
- _ZN19QDockAreaLayoutInfoC2EiN9QInternal12DockPositionEN2Qt11OrientationEiP11QMainWindow @ 4290 NONAME
- _ZN19QDockAreaLayoutInfoC2Ev @ 4291 NONAME
- _ZN19QEventDispatcherS6011qt_metacallEN11QMetaObject4CallEiPPv @ 4292 NONAME
- _ZN19QEventDispatcherS6011qt_metacastEPKc @ 4293 NONAME
- _ZN19QEventDispatcherS6013processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 4294 NONAME
- _ZN19QEventDispatcherS6014saveInputEventEP15QSymbianControlP7QWidgetP11QInputEvent @ 4295 NONAME
- _ZN19QEventDispatcherS6016hasPendingEventsEv @ 4296 NONAME
- _ZN19QEventDispatcherS6016staticMetaObjectE @ 4297 NONAME DATA 16
- _ZN19QEventDispatcherS6023sendDeferredInputEventsEv @ 4298 NONAME
- _ZN19QEventDispatcherS6026removeInputEventsForWidgetEP7QObject @ 4299 NONAME
- _ZN19QEventDispatcherS60C1EP7QObject @ 4300 NONAME
- _ZN19QEventDispatcherS60C2EP7QObject @ 4301 NONAME
- _ZN19QEventDispatcherS60D0Ev @ 4302 NONAME
- _ZN19QEventDispatcherS60D1Ev @ 4303 NONAME
- _ZN19QEventDispatcherS60D2Ev @ 4304 NONAME
- _ZN19QGraphicsGridLayout10invalidateEv @ 4305 NONAME
- _ZN19QGraphicsGridLayout10setSpacingEf @ 4306 NONAME
- _ZN19QGraphicsGridLayout11setGeometryERK6QRectF @ 4307 NONAME
- _ZN19QGraphicsGridLayout12setAlignmentEP19QGraphicsLayoutItem6QFlagsIN2Qt13AlignmentFlagEE @ 4308 NONAME
- _ZN19QGraphicsGridLayout13setRowSpacingEif @ 4309 NONAME
- _ZN19QGraphicsGridLayout15setRowAlignmentEi6QFlagsIN2Qt13AlignmentFlagEE @ 4310 NONAME
- _ZN19QGraphicsGridLayout16setColumnSpacingEif @ 4311 NONAME
- _ZN19QGraphicsGridLayout17setRowFixedHeightEif @ 4312 NONAME
- _ZN19QGraphicsGridLayout18setColumnAlignmentEi6QFlagsIN2Qt13AlignmentFlagEE @ 4313 NONAME
- _ZN19QGraphicsGridLayout18setVerticalSpacingEf @ 4314 NONAME
- _ZN19QGraphicsGridLayout19setColumnFixedWidthEif @ 4315 NONAME
- _ZN19QGraphicsGridLayout19setRowMaximumHeightEif @ 4316 NONAME
- _ZN19QGraphicsGridLayout19setRowMinimumHeightEif @ 4317 NONAME
- _ZN19QGraphicsGridLayout19setRowStretchFactorEii @ 4318 NONAME
- _ZN19QGraphicsGridLayout20setHorizontalSpacingEf @ 4319 NONAME
- _ZN19QGraphicsGridLayout21setColumnMaximumWidthEif @ 4320 NONAME
- _ZN19QGraphicsGridLayout21setColumnMinimumWidthEif @ 4321 NONAME
- _ZN19QGraphicsGridLayout21setRowPreferredHeightEif @ 4322 NONAME
- _ZN19QGraphicsGridLayout22setColumnStretchFactorEii @ 4323 NONAME
- _ZN19QGraphicsGridLayout23setColumnPreferredWidthEif @ 4324 NONAME
- _ZN19QGraphicsGridLayout7addItemEP19QGraphicsLayoutItemiiii6QFlagsIN2Qt13AlignmentFlagEE @ 4325 NONAME
- _ZN19QGraphicsGridLayout8removeAtEi @ 4326 NONAME
- _ZN19QGraphicsGridLayoutC1EP19QGraphicsLayoutItem @ 4327 NONAME
- _ZN19QGraphicsGridLayoutC2EP19QGraphicsLayoutItem @ 4328 NONAME
- _ZN19QGraphicsGridLayoutD0Ev @ 4329 NONAME
- _ZN19QGraphicsGridLayoutD1Ev @ 4330 NONAME
- _ZN19QGraphicsGridLayoutD2Ev @ 4331 NONAME
- _ZN19QGraphicsLayoutItem11setGeometryERK6QRectF @ 4332 NONAME
- _ZN19QGraphicsLayoutItem13setSizePolicyEN11QSizePolicy6PolicyES1_NS0_11ControlTypeE @ 4333 NONAME
- _ZN19QGraphicsLayoutItem13setSizePolicyERK11QSizePolicy @ 4334 NONAME
- _ZN19QGraphicsLayoutItem14setMaximumSizeERK6QSizeF @ 4335 NONAME
- _ZN19QGraphicsLayoutItem14setMinimumSizeERK6QSizeF @ 4336 NONAME
- _ZN19QGraphicsLayoutItem14updateGeometryEv @ 4337 NONAME
- _ZN19QGraphicsLayoutItem15setGraphicsItemEP13QGraphicsItem @ 4338 NONAME
- _ZN19QGraphicsLayoutItem15setMaximumWidthEf @ 4339 NONAME
- _ZN19QGraphicsLayoutItem15setMinimumWidthEf @ 4340 NONAME
- _ZN19QGraphicsLayoutItem16setMaximumHeightEf @ 4341 NONAME
- _ZN19QGraphicsLayoutItem16setMinimumHeightEf @ 4342 NONAME
- _ZN19QGraphicsLayoutItem16setOwnedByLayoutEb @ 4343 NONAME
- _ZN19QGraphicsLayoutItem16setPreferredSizeERK6QSizeF @ 4344 NONAME
- _ZN19QGraphicsLayoutItem17setPreferredWidthEf @ 4345 NONAME
- _ZN19QGraphicsLayoutItem18setPreferredHeightEf @ 4346 NONAME
- _ZN19QGraphicsLayoutItem19setParentLayoutItemEPS_ @ 4347 NONAME
- _ZN19QGraphicsLayoutItemC2EPS_b @ 4348 NONAME
- _ZN19QGraphicsLayoutItemC2ER26QGraphicsLayoutItemPrivate @ 4349 NONAME
- _ZN19QGraphicsLayoutItemD0Ev @ 4350 NONAME
- _ZN19QGraphicsLayoutItemD1Ev @ 4351 NONAME
- _ZN19QGraphicsLayoutItemD2Ev @ 4352 NONAME
- _ZN19QGraphicsPixmapItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4353 NONAME
- _ZN19QGraphicsPixmapItem12setShapeModeENS_9ShapeModeE @ 4354 NONAME
- _ZN19QGraphicsPixmapItem21setTransformationModeEN2Qt18TransformationModeE @ 4355 NONAME
- _ZN19QGraphicsPixmapItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4356 NONAME
- _ZN19QGraphicsPixmapItem9setOffsetERK7QPointF @ 4357 NONAME
- _ZN19QGraphicsPixmapItem9setPixmapERK7QPixmap @ 4358 NONAME
- _ZN19QGraphicsPixmapItemC1EP13QGraphicsItemP14QGraphicsScene @ 4359 NONAME
- _ZN19QGraphicsPixmapItemC1ERK7QPixmapP13QGraphicsItemP14QGraphicsScene @ 4360 NONAME
- _ZN19QGraphicsPixmapItemC2EP13QGraphicsItemP14QGraphicsScene @ 4361 NONAME
- _ZN19QGraphicsPixmapItemC2ERK7QPixmapP13QGraphicsItemP14QGraphicsScene @ 4362 NONAME
- _ZN19QGraphicsPixmapItemD0Ev @ 4363 NONAME
- _ZN19QGraphicsPixmapItemD1Ev @ 4364 NONAME
- _ZN19QGraphicsPixmapItemD2Ev @ 4365 NONAME
- _ZN19QGraphicsSceneEvent9setWidgetEP7QWidget @ 4366 NONAME
- _ZN19QGraphicsSceneEventC1EN6QEvent4TypeE @ 4367 NONAME
- _ZN19QGraphicsSceneEventC1ER26QGraphicsSceneEventPrivateN6QEvent4TypeE @ 4368 NONAME
- _ZN19QGraphicsSceneEventC2EN6QEvent4TypeE @ 4369 NONAME
- _ZN19QGraphicsSceneEventC2ER26QGraphicsSceneEventPrivateN6QEvent4TypeE @ 4370 NONAME
- _ZN19QGraphicsSceneEventD0Ev @ 4371 NONAME
- _ZN19QGraphicsSceneEventD1Ev @ 4372 NONAME
- _ZN19QGraphicsSceneEventD2Ev @ 4373 NONAME
- _ZN19QIconEnginePluginV211qt_metacallEN11QMetaObject4CallEiPPv @ 4374 NONAME
- _ZN19QIconEnginePluginV211qt_metacastEPKc @ 4375 NONAME
- _ZN19QIconEnginePluginV216staticMetaObjectE @ 4376 NONAME DATA 16
- _ZN19QIconEnginePluginV2C2EP7QObject @ 4377 NONAME
- _ZN19QIconEnginePluginV2D0Ev @ 4378 NONAME
- _ZN19QIconEnginePluginV2D1Ev @ 4379 NONAME
- _ZN19QIconEnginePluginV2D2Ev @ 4380 NONAME
- _ZN19QInputContextPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4381 NONAME
- _ZN19QInputContextPlugin11qt_metacastEPKc @ 4382 NONAME
- _ZN19QInputContextPlugin16staticMetaObjectE @ 4383 NONAME DATA 16
- _ZN19QInputContextPluginC2EP7QObject @ 4384 NONAME
- _ZN19QInputContextPluginD0Ev @ 4385 NONAME
- _ZN19QInputContextPluginD1Ev @ 4386 NONAME
- _ZN19QInputContextPluginD2Ev @ 4387 NONAME
- _ZN19QItemSelectionModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4388 NONAME
- _ZN19QItemSelectionModel11qt_metacastEPKc @ 4389 NONAME
- _ZN19QItemSelectionModel14clearSelectionEv @ 4390 NONAME
- _ZN19QItemSelectionModel14currentChangedERK11QModelIndexS2_ @ 4391 NONAME
- _ZN19QItemSelectionModel15setCurrentIndexERK11QModelIndex6QFlagsINS_13SelectionFlagEE @ 4392 NONAME
- _ZN19QItemSelectionModel16selectionChangedERK14QItemSelectionS2_ @ 4393 NONAME
- _ZN19QItemSelectionModel16staticMetaObjectE @ 4394 NONAME DATA 16
- _ZN19QItemSelectionModel17currentRowChangedERK11QModelIndexS2_ @ 4395 NONAME
- _ZN19QItemSelectionModel20currentColumnChangedERK11QModelIndexS2_ @ 4396 NONAME
- _ZN19QItemSelectionModel20emitSelectionChangedERK14QItemSelectionS2_ @ 4397 NONAME
- _ZN19QItemSelectionModel5clearEv @ 4398 NONAME
- _ZN19QItemSelectionModel5resetEv @ 4399 NONAME
- _ZN19QItemSelectionModel6selectERK11QModelIndex6QFlagsINS_13SelectionFlagEE @ 4400 NONAME
- _ZN19QItemSelectionModel6selectERK14QItemSelection6QFlagsINS_13SelectionFlagEE @ 4401 NONAME
- _ZN19QItemSelectionModelC1EP18QAbstractItemModel @ 4402 NONAME
- _ZN19QItemSelectionModelC1EP18QAbstractItemModelP7QObject @ 4403 NONAME
- _ZN19QItemSelectionModelC1ER26QItemSelectionModelPrivateP18QAbstractItemModel @ 4404 NONAME
- _ZN19QItemSelectionModelC2EP18QAbstractItemModel @ 4405 NONAME
- _ZN19QItemSelectionModelC2EP18QAbstractItemModelP7QObject @ 4406 NONAME
- _ZN19QItemSelectionModelC2ER26QItemSelectionModelPrivateP18QAbstractItemModel @ 4407 NONAME
- _ZN19QItemSelectionModelD0Ev @ 4408 NONAME
- _ZN19QItemSelectionModelD1Ev @ 4409 NONAME
- _ZN19QItemSelectionModelD2Ev @ 4410 NONAME
- _ZN19QKeySequencePrivate11keyBindingsE @ 4411 NONAME DATA 2256
- _ZN19QKeySequencePrivate12decodeStringERK7QStringN12QKeySequence14SequenceFormatE @ 4412 NONAME
- _ZN19QKeySequencePrivate12encodeStringEiN12QKeySequence14SequenceFormatE @ 4413 NONAME
- _ZN19QKeySequencePrivate19numberOfKeyBindingsE @ 4414 NONAME DATA 4
- _ZN19QPainterPathStroker11setCapStyleEN2Qt11PenCapStyleE @ 4415 NONAME
- _ZN19QPainterPathStroker12setJoinStyleEN2Qt12PenJoinStyleE @ 4416 NONAME
- _ZN19QPainterPathStroker13setDashOffsetEf @ 4417 NONAME
- _ZN19QPainterPathStroker13setMiterLimitEf @ 4418 NONAME
- _ZN19QPainterPathStroker14setDashPatternEN2Qt8PenStyleE @ 4419 NONAME
- _ZN19QPainterPathStroker14setDashPatternERK7QVectorIfE @ 4420 NONAME
- _ZN19QPainterPathStroker17setCurveThresholdEf @ 4421 NONAME
- _ZN19QPainterPathStroker8setWidthEf @ 4422 NONAME
- _ZN19QPainterPathStrokerC1Ev @ 4423 NONAME
- _ZN19QPainterPathStrokerC2Ev @ 4424 NONAME
- _ZN19QPainterPathStrokerD1Ev @ 4425 NONAME
- _ZN19QPainterPathStrokerD2Ev @ 4426 NONAME
- _ZN19QStyleOptionComplexC1Eii @ 4427 NONAME
- _ZN19QStyleOptionComplexC2Eii @ 4428 NONAME
- _ZN19QStyleOptionFrameV2C1ERK17QStyleOptionFrame @ 4429 NONAME
- _ZN19QStyleOptionFrameV2C1Ei @ 4430 NONAME
- _ZN19QStyleOptionFrameV2C1Ev @ 4431 NONAME
- _ZN19QStyleOptionFrameV2C2ERK17QStyleOptionFrame @ 4432 NONAME
- _ZN19QStyleOptionFrameV2C2Ei @ 4433 NONAME
- _ZN19QStyleOptionFrameV2C2Ev @ 4434 NONAME
- _ZN19QStyleOptionFrameV2aSERK17QStyleOptionFrame @ 4435 NONAME
- _ZN19QStyleOptionFrameV3C1ERK17QStyleOptionFrame @ 4436 NONAME
- _ZN19QStyleOptionFrameV3C1Ei @ 4437 NONAME
- _ZN19QStyleOptionFrameV3C1Ev @ 4438 NONAME
- _ZN19QStyleOptionFrameV3C2ERK17QStyleOptionFrame @ 4439 NONAME
- _ZN19QStyleOptionFrameV3C2Ei @ 4440 NONAME
- _ZN19QStyleOptionFrameV3C2Ev @ 4441 NONAME
- _ZN19QStyleOptionFrameV3aSERK17QStyleOptionFrame @ 4442 NONAME
- _ZN19QStyleOptionSpinBoxC1Ei @ 4443 NONAME
- _ZN19QStyleOptionSpinBoxC1Ev @ 4444 NONAME
- _ZN19QStyleOptionSpinBoxC2Ei @ 4445 NONAME
- _ZN19QStyleOptionSpinBoxC2Ev @ 4446 NONAME
- _ZN19QStyleOptionToolBarC1Ei @ 4447 NONAME
- _ZN19QStyleOptionToolBarC1Ev @ 4448 NONAME
- _ZN19QStyleOptionToolBarC2Ei @ 4449 NONAME
- _ZN19QStyleOptionToolBarC2Ev @ 4450 NONAME
- _ZN19QStyleOptionToolBoxC1Ei @ 4451 NONAME
- _ZN19QStyleOptionToolBoxC1Ev @ 4452 NONAME
- _ZN19QStyleOptionToolBoxC2Ei @ 4453 NONAME
- _ZN19QStyleOptionToolBoxC2Ev @ 4454 NONAME
- _ZN19QStyledItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 4455 NONAME
- _ZN19QStyledItemDelegate11eventFilterEP7QObjectP6QEvent @ 4456 NONAME
- _ZN19QStyledItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 4457 NONAME
- _ZN19QStyledItemDelegate11qt_metacastEPKc @ 4458 NONAME
- _ZN19QStyledItemDelegate16staticMetaObjectE @ 4459 NONAME DATA 16
- _ZN19QStyledItemDelegate20setItemEditorFactoryEP18QItemEditorFactory @ 4460 NONAME
- _ZN19QStyledItemDelegateC1EP7QObject @ 4461 NONAME
- _ZN19QStyledItemDelegateC2EP7QObject @ 4462 NONAME
- _ZN19QStyledItemDelegateD0Ev @ 4463 NONAME
- _ZN19QStyledItemDelegateD1Ev @ 4464 NONAME
- _ZN19QStyledItemDelegateD2Ev @ 4465 NONAME
- _ZN19QTextDocumentLayout10timerEventEP11QTimerEvent @ 4466 NONAME
- _ZN19QTextDocumentLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 4467 NONAME
- _ZN19QTextDocumentLayout11qt_metacastEPKc @ 4468 NONAME
- _ZN19QTextDocumentLayout11setViewportERK6QRectF @ 4469 NONAME
- _ZN19QTextDocumentLayout14ensureLayoutedEf @ 4470 NONAME
- _ZN19QTextDocumentLayout14layoutFinishedEv @ 4471 NONAME
- _ZN19QTextDocumentLayout14setCursorWidthEi @ 4472 NONAME
- _ZN19QTextDocumentLayout15documentChangedEiii @ 4473 NONAME
- _ZN19QTextDocumentLayout16drawInlineObjectEP8QPainterRK6QRectF17QTextInlineObjectiRK11QTextFormat @ 4474 NONAME
- _ZN19QTextDocumentLayout16staticMetaObjectE @ 4475 NONAME DATA 16
- _ZN19QTextDocumentLayout18resizeInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 4476 NONAME
- _ZN19QTextDocumentLayout19setFixedColumnWidthEi @ 4477 NONAME
- _ZN19QTextDocumentLayout20positionInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 4478 NONAME
- _ZN19QTextDocumentLayout4drawEP8QPainterRKN27QAbstractTextDocumentLayout12PaintContextE @ 4479 NONAME
- _ZN19QTextDocumentLayout8doLayoutEiii @ 4480 NONAME
- _ZN19QTextDocumentLayoutC1EP13QTextDocument @ 4481 NONAME
- _ZN19QTextDocumentLayoutC2EP13QTextDocument @ 4482 NONAME
- _ZN19QTextDocumentWriter11setFileNameERK7QString @ 4483 NONAME
- _ZN19QTextDocumentWriter24supportedDocumentFormatsEv @ 4484 NONAME
- _ZN19QTextDocumentWriter5writeEPK13QTextDocument @ 4485 NONAME
- _ZN19QTextDocumentWriter5writeERK21QTextDocumentFragment @ 4486 NONAME
- _ZN19QTextDocumentWriter8setCodecEP10QTextCodec @ 4487 NONAME
- _ZN19QTextDocumentWriter9setDeviceEP9QIODevice @ 4488 NONAME
- _ZN19QTextDocumentWriter9setFormatERK10QByteArray @ 4489 NONAME
- _ZN19QTextDocumentWriterC1EP9QIODeviceRK10QByteArray @ 4490 NONAME
- _ZN19QTextDocumentWriterC1ERK7QStringRK10QByteArray @ 4491 NONAME
- _ZN19QTextDocumentWriterC1Ev @ 4492 NONAME
- _ZN19QTextDocumentWriterC2EP9QIODeviceRK10QByteArray @ 4493 NONAME
- _ZN19QTextDocumentWriterC2ERK7QStringRK10QByteArray @ 4494 NONAME
- _ZN19QTextDocumentWriterC2Ev @ 4495 NONAME
- _ZN19QTextDocumentWriterD1Ev @ 4496 NONAME
- _ZN19QTextDocumentWriterD2Ev @ 4497 NONAME
- _ZN19QToolBarChangeEventC1Eb @ 4498 NONAME
- _ZN19QToolBarChangeEventC2Eb @ 4499 NONAME
- _ZN19QToolBarChangeEventD0Ev @ 4500 NONAME
- _ZN19QToolBarChangeEventD1Ev @ 4501 NONAME
- _ZN19QToolBarChangeEventD2Ev @ 4502 NONAME
- _ZN19QWidgetBackingStore10beginPaintER7QRegionP7QWidgetP14QWindowSurfaceP14BeginPaintInfob @ 4503 NONAME
- _ZN19QWidgetBackingStore11updateListsEP7QWidget @ 4504 NONAME
- _ZN19QWidgetBackingStore13releaseBufferEv @ 4505 NONAME
- _ZN19QWidgetBackingStore17markDirtyOnScreenERK7QRegionP7QWidgetRK6QPoint @ 4506 NONAME
- _ZN19QWidgetBackingStore17removeDirtyWidgetEP7QWidget @ 4507 NONAME
- _ZN19QWidgetBackingStore4syncEP7QWidgetRK7QRegion @ 4508 NONAME
- _ZN19QWidgetBackingStore4syncEv @ 4509 NONAME
- _ZN19QWidgetBackingStore5flushEP7QWidgetP14QWindowSurface @ 4510 NONAME
- _ZN19QWidgetBackingStore7bltRectERK5QRectiiP7QWidget @ 4511 NONAME
- _ZN19QWidgetBackingStore8endPaintERK7QRegionP14QWindowSurfaceP14BeginPaintInfo @ 4512 NONAME
- _ZN19QWidgetBackingStore9markDirtyERK5QRectP7QWidgetbb @ 4513 NONAME
- _ZN19QWidgetBackingStore9markDirtyERK7QRegionP7QWidgetbb @ 4514 NONAME
- _ZN19QWidgetBackingStoreC1EP7QWidget @ 4515 NONAME
- _ZN19QWidgetBackingStoreC2EP7QWidget @ 4516 NONAME
- _ZN19QWidgetBackingStoreD1Ev @ 4517 NONAME
- _ZN19QWidgetBackingStoreD2Ev @ 4518 NONAME
- _ZN20QGraphicsEllipseItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4519 NONAME
- _ZN20QGraphicsEllipseItem12setSpanAngleEi @ 4520 NONAME
- _ZN20QGraphicsEllipseItem13setStartAngleEi @ 4521 NONAME
- _ZN20QGraphicsEllipseItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4522 NONAME
- _ZN20QGraphicsEllipseItem7setRectERK6QRectF @ 4523 NONAME
- _ZN20QGraphicsEllipseItemC1EP13QGraphicsItemP14QGraphicsScene @ 4524 NONAME
- _ZN20QGraphicsEllipseItemC1ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 4525 NONAME
- _ZN20QGraphicsEllipseItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 4526 NONAME
- _ZN20QGraphicsEllipseItemC2EP13QGraphicsItemP14QGraphicsScene @ 4527 NONAME
- _ZN20QGraphicsEllipseItemC2ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 4528 NONAME
- _ZN20QGraphicsEllipseItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 4529 NONAME
- _ZN20QGraphicsEllipseItemD0Ev @ 4530 NONAME
- _ZN20QGraphicsEllipseItemD1Ev @ 4531 NONAME
- _ZN20QGraphicsEllipseItemD2Ev @ 4532 NONAME
- _ZN20QGraphicsItemPrivate12remapItemPosEP6QEventP13QGraphicsItem @ 4533 NONAME
- _ZN20QGraphicsItemPrivate12resolveDepthEi @ 4534 NONAME ABSENT
- _ZN20QGraphicsItemPrivate12setPosHelperERK7QPointF @ 4535 NONAME
- _ZN20QGraphicsItemPrivate12updateHelperERK6QRectFbb @ 4536 NONAME ABSENT
- _ZN20QGraphicsItemPrivate16fullUpdateHelperEbbb @ 4537 NONAME ABSENT
- _ZN20QGraphicsItemPrivate16setEnabledHelperEbbb @ 4538 NONAME
- _ZN20QGraphicsItemPrivate16setVisibleHelperEbbb @ 4539 NONAME
- _ZN20QGraphicsItemPrivate18setIsMemberOfGroupEb @ 4540 NONAME
- _ZN20QGraphicsItemPrivate18updateAncestorFlagEN13QGraphicsItem16GraphicsItemFlagENS_12AncestorFlagEbb @ 4541 NONAME
- _ZN20QGraphicsItemPrivate20removeExtraItemCacheEv @ 4542 NONAME
- _ZN20QGraphicsItemPrivate22updateEffectiveOpacityEv @ 4543 NONAME ABSENT
- _ZN20QGraphicsItemPrivate23resolveEffectiveOpacityEf @ 4544 NONAME ABSENT
- _ZN20QGraphicsItemPrivate25movableAncestorIsSelectedEPK13QGraphicsItem @ 4545 NONAME
- _ZN20QGraphicsItemPrivate29invalidateSceneTransformCacheEv @ 4546 NONAME ABSENT
- _ZN20QGraphicsItemPrivate33setEmptyCachedClipPathRecursivelyERK6QRectF @ 4547 NONAME
- _ZN20QGraphicsItemPrivate35invalidateCachedClipPathRecursivelyEbRK6QRectF @ 4548 NONAME
- _ZN20QGraphicsItemPrivate36updateCachedClipPathFromSetPosHelperERK7QPointF @ 4549 NONAME
- _ZN20QGraphicsPolygonItem10setPolygonERK9QPolygonF @ 4550 NONAME
- _ZN20QGraphicsPolygonItem11setFillRuleEN2Qt8FillRuleE @ 4551 NONAME
- _ZN20QGraphicsPolygonItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4552 NONAME
- _ZN20QGraphicsPolygonItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4553 NONAME
- _ZN20QGraphicsPolygonItemC1EP13QGraphicsItemP14QGraphicsScene @ 4554 NONAME
- _ZN20QGraphicsPolygonItemC1ERK9QPolygonFP13QGraphicsItemP14QGraphicsScene @ 4555 NONAME
- _ZN20QGraphicsPolygonItemC2EP13QGraphicsItemP14QGraphicsScene @ 4556 NONAME
- _ZN20QGraphicsPolygonItemC2ERK9QPolygonFP13QGraphicsItemP14QGraphicsScene @ 4557 NONAME
- _ZN20QGraphicsPolygonItemD0Ev @ 4558 NONAME
- _ZN20QGraphicsPolygonItemD1Ev @ 4559 NONAME
- _ZN20QGraphicsPolygonItemD2Ev @ 4560 NONAME
- _ZN20QGraphicsProxyWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 4561 NONAME
- _ZN20QGraphicsProxyWidget10wheelEventEP24QGraphicsSceneWheelEvent @ 4562 NONAME
- _ZN20QGraphicsProxyWidget11eventFilterEP7QObjectP6QEvent @ 4563 NONAME
- _ZN20QGraphicsProxyWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 4564 NONAME
- _ZN20QGraphicsProxyWidget11qt_metacastEPKc @ 4565 NONAME
- _ZN20QGraphicsProxyWidget11resizeEventEP25QGraphicsSceneResizeEvent @ 4566 NONAME
- _ZN20QGraphicsProxyWidget11setGeometryERK6QRectF @ 4567 NONAME
- _ZN20QGraphicsProxyWidget12focusInEventEP11QFocusEvent @ 4568 NONAME
- _ZN20QGraphicsProxyWidget13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 4569 NONAME
- _ZN20QGraphicsProxyWidget13focusOutEventEP11QFocusEvent @ 4570 NONAME
- _ZN20QGraphicsProxyWidget13keyPressEventEP9QKeyEvent @ 4571 NONAME
- _ZN20QGraphicsProxyWidget14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 4572 NONAME
- _ZN20QGraphicsProxyWidget14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 4573 NONAME
- _ZN20QGraphicsProxyWidget14grabMouseEventEP6QEvent @ 4574 NONAME
- _ZN20QGraphicsProxyWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 4575 NONAME
- _ZN20QGraphicsProxyWidget14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 4576 NONAME
- _ZN20QGraphicsProxyWidget14newProxyWidgetEPK7QWidget @ 4577 NONAME
- _ZN20QGraphicsProxyWidget15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 4578 NONAME
- _ZN20QGraphicsProxyWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 4579 NONAME
- _ZN20QGraphicsProxyWidget15keyReleaseEventEP9QKeyEvent @ 4580 NONAME
- _ZN20QGraphicsProxyWidget15mousePressEventEP24QGraphicsSceneMouseEvent @ 4581 NONAME
- _ZN20QGraphicsProxyWidget16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 4582 NONAME
- _ZN20QGraphicsProxyWidget16staticMetaObjectE @ 4583 NONAME DATA 16
- _ZN20QGraphicsProxyWidget16ungrabMouseEventEP6QEvent @ 4584 NONAME
- _ZN20QGraphicsProxyWidget17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 4585 NONAME
- _ZN20QGraphicsProxyWidget18focusNextPrevChildEb @ 4586 NONAME
- _ZN20QGraphicsProxyWidget21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 4587 NONAME
- _ZN20QGraphicsProxyWidget25createProxyForChildWidgetEP7QWidget @ 4588 NONAME
- _ZN20QGraphicsProxyWidget5eventEP6QEvent @ 4589 NONAME
- _ZN20QGraphicsProxyWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4590 NONAME
- _ZN20QGraphicsProxyWidget9dropEventEP27QGraphicsSceneDragDropEvent @ 4591 NONAME
- _ZN20QGraphicsProxyWidget9hideEventEP10QHideEvent @ 4592 NONAME
- _ZN20QGraphicsProxyWidget9setWidgetEP7QWidget @ 4593 NONAME
- _ZN20QGraphicsProxyWidget9showEventEP10QShowEvent @ 4594 NONAME
- _ZN20QGraphicsProxyWidgetC1EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 4595 NONAME
- _ZN20QGraphicsProxyWidgetC2EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 4596 NONAME
- _ZN20QGraphicsProxyWidgetD0Ev @ 4597 NONAME
- _ZN20QGraphicsProxyWidgetD1Ev @ 4598 NONAME
- _ZN20QGraphicsProxyWidgetD2Ev @ 4599 NONAME
- _ZN20QGraphicsViewPrivate10centerViewEN13QGraphicsView14ViewportAnchorE @ 4600 NONAME
- _ZN20QGraphicsViewPrivate10updateRectERK5QRect @ 4601 NONAME
- _ZN20QGraphicsViewPrivate11itemUpdatedEP13QGraphicsItemRK6QRectF @ 4602 NONAME ABSENT
- _ZN20QGraphicsViewPrivate11updateLaterEv @ 4603 NONAME ABSENT
- _ZN20QGraphicsViewPrivate12updateRegionERK7QRegion @ 4604 NONAME
- _ZN20QGraphicsViewPrivate12updateScrollEv @ 4605 NONAME
- _ZN20QGraphicsViewPrivate15storeMouseEventEP11QMouseEvent @ 4606 NONAME
- _ZN20QGraphicsViewPrivate18_q_updateLaterSlotEv @ 4607 NONAME ABSENT
- _ZN20QGraphicsViewPrivate18storeDragDropEventEPK27QGraphicsSceneDragDropEvent @ 4608 NONAME
- _ZN20QGraphicsViewPrivate20replayLastMouseEventEv @ 4609 NONAME
- _ZN20QGraphicsViewPrivate21freeStyleOptionsArrayEP24QStyleOptionGraphicsItem @ 4610 NONAME
- _ZN20QGraphicsViewPrivate21mouseMoveEventHandlerEP11QMouseEvent @ 4611 NONAME
- _ZN20QGraphicsViewPrivate21updateLastCenterPointEv @ 4612 NONAME
- _ZN20QGraphicsViewPrivate22allocStyleOptionsArrayEi @ 4613 NONAME
- _ZN20QGraphicsViewPrivate22recalculateContentSizeEv @ 4614 NONAME
- _ZN20QGraphicsViewPrivate26populateSceneDragDropEventEP27QGraphicsSceneDragDropEventP10QDropEvent @ 4615 NONAME
- _ZN20QGraphicsViewPrivate9updateAllEv @ 4616 NONAME ABSENT
- _ZN20QGraphicsViewPrivateC1Ev @ 4617 NONAME
- _ZN20QGraphicsViewPrivateC2Ev @ 4618 NONAME
- _ZN20QInputContextFactory11descriptionERK7QString @ 4619 NONAME
- _ZN20QInputContextFactory11displayNameERK7QString @ 4620 NONAME
- _ZN20QInputContextFactory4keysEv @ 4621 NONAME
- _ZN20QInputContextFactory6createERK7QStringP7QObject @ 4622 NONAME
- _ZN20QInputContextFactory9languagesERK7QString @ 4623 NONAME
- _ZN20QPictureFormatPlugin11loadPictureERK7QStringS2_P8QPicture @ 4624 NONAME
- _ZN20QPictureFormatPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4625 NONAME
- _ZN20QPictureFormatPlugin11qt_metacastEPKc @ 4626 NONAME
- _ZN20QPictureFormatPlugin11savePictureERK7QStringS2_RK8QPicture @ 4627 NONAME
- _ZN20QPictureFormatPlugin16staticMetaObjectE @ 4628 NONAME DATA 16
- _ZN20QPictureFormatPluginC2EP7QObject @ 4629 NONAME
- _ZN20QPictureFormatPluginD0Ev @ 4630 NONAME
- _ZN20QPictureFormatPluginD1Ev @ 4631 NONAME
- _ZN20QPictureFormatPluginD2Ev @ 4632 NONAME
- _ZN20QRasterWindowSurface10beginPaintERK7QRegion @ 4633 NONAME
- _ZN20QRasterWindowSurface11paintDeviceEv @ 4634 NONAME
- _ZN20QRasterWindowSurface11setGeometryERK5QRect @ 4635 NONAME
- _ZN20QRasterWindowSurface13prepareBufferEN6QImage6FormatEP7QWidget @ 4636 NONAME
- _ZN20QRasterWindowSurface5flushEP7QWidgetRK7QRegionRK6QPoint @ 4637 NONAME
- _ZN20QRasterWindowSurface6scrollERK7QRegionii @ 4638 NONAME
- _ZN20QRasterWindowSurfaceC1EP7QWidget @ 4639 NONAME
- _ZN20QRasterWindowSurfaceC2EP7QWidget @ 4640 NONAME
- _ZN20QRasterWindowSurfaceD0Ev @ 4641 NONAME
- _ZN20QRasterWindowSurfaceD1Ev @ 4642 NONAME
- _ZN20QRasterWindowSurfaceD2Ev @ 4643 NONAME
- _ZN20QStyleHintReturnMaskC1Ev @ 4644 NONAME
- _ZN20QStyleHintReturnMaskC2Ev @ 4645 NONAME
- _ZN20QStyleOptionComboBoxC1Ei @ 4646 NONAME
- _ZN20QStyleOptionComboBoxC1Ev @ 4647 NONAME
- _ZN20QStyleOptionComboBoxC2Ei @ 4648 NONAME
- _ZN20QStyleOptionComboBoxC2Ev @ 4649 NONAME
- _ZN20QStyleOptionGroupBoxC1Ei @ 4650 NONAME
- _ZN20QStyleOptionGroupBoxC1Ev @ 4651 NONAME
- _ZN20QStyleOptionGroupBoxC2Ei @ 4652 NONAME
- _ZN20QStyleOptionGroupBoxC2Ev @ 4653 NONAME
- _ZN20QStyleOptionMenuItemC1Ei @ 4654 NONAME
- _ZN20QStyleOptionMenuItemC1Ev @ 4655 NONAME
- _ZN20QStyleOptionMenuItemC2Ei @ 4656 NONAME
- _ZN20QStyleOptionMenuItemC2Ev @ 4657 NONAME
- _ZN20QStyleOptionSizeGripC1Ei @ 4658 NONAME
- _ZN20QStyleOptionSizeGripC1Ev @ 4659 NONAME
- _ZN20QStyleOptionSizeGripC2Ei @ 4660 NONAME
- _ZN20QStyleOptionSizeGripC2Ev @ 4661 NONAME
- _ZN20QStyleOptionTitleBarC1Ei @ 4662 NONAME
- _ZN20QStyleOptionTitleBarC1Ev @ 4663 NONAME
- _ZN20QStyleOptionTitleBarC2Ei @ 4664 NONAME
- _ZN20QStyleOptionTitleBarC2Ev @ 4665 NONAME
- _ZN20QStyleOptionViewItemC1Ei @ 4666 NONAME
- _ZN20QStyleOptionViewItemC1Ev @ 4667 NONAME
- _ZN20QStyleOptionViewItemC2Ei @ 4668 NONAME
- _ZN20QStyleOptionViewItemC2Ev @ 4669 NONAME
- _ZN20QTextDocumentPrivate10clearFrameEP10QTextFrame @ 4670 NONAME
- _ZN20QTextDocumentPrivate11insertBlockERK5QChariiiN16QTextUndoCommand9OperationE @ 4671 NONAME
- _ZN20QTextDocumentPrivate11insertBlockEiiiN16QTextUndoCommand9OperationE @ 4672 NONAME
- _ZN20QTextDocumentPrivate11insertFrameEiiRK16QTextFrameFormat @ 4673 NONAME
- _ZN20QTextDocumentPrivate11removeFrameEP10QTextFrame @ 4674 NONAME
- _ZN20QTextDocumentPrivate11scan_framesEiii @ 4675 NONAME
- _ZN20QTextDocumentPrivate11setModifiedEb @ 4676 NONAME
- _ZN20QTextDocumentPrivate12createObjectERK11QTextFormati @ 4677 NONAME
- _ZN20QTextDocumentPrivate12deleteObjectEP11QTextObject @ 4678 NONAME
- _ZN20QTextDocumentPrivate12endEditBlockEv @ 4679 NONAME
- _ZN20QTextDocumentPrivate12insert_blockEijiiN16QTextUndoCommand9OperationEi @ 4680 NONAME
- _ZN20QTextDocumentPrivate12insert_frameEP10QTextFrame @ 4681 NONAME
- _ZN20QTextDocumentPrivate12remove_blockEiPiiN16QTextUndoCommand9OperationE @ 4682 NONAME
- _ZN20QTextDocumentPrivate13insert_stringEijjiN16QTextUndoCommand9OperationE @ 4683 NONAME
- _ZN20QTextDocumentPrivate13remove_stringEijN16QTextUndoCommand9OperationE @ 4684 NONAME
- _ZN20QTextDocumentPrivate13setCharFormatEiiRK15QTextCharFormatNS_16FormatChangeModeE @ 4685 NONAME
- _ZN20QTextDocumentPrivate14appendUndoItemEP17QAbstractUndoItem @ 4686 NONAME
- _ZN20QTextDocumentPrivate14appendUndoItemERK16QTextUndoCommand @ 4687 NONAME
- _ZN20QTextDocumentPrivate14documentChangeEii @ 4688 NONAME
- _ZN20QTextDocumentPrivate14enableUndoRedoEb @ 4689 NONAME
- _ZN20QTextDocumentPrivate14setBlockFormatERK10QTextBlockS2_RK16QTextBlockFormatNS_16FormatChangeModeE @ 4690 NONAME
- _ZN20QTextDocumentPrivate15contentsChangedEv @ 4691 NONAME
- _ZN20QTextDocumentPrivate17aboutToRemoveCellEii @ 4692 NONAME
- _ZN20QTextDocumentPrivate17emitRedoAvailableEb @ 4693 NONAME
- _ZN20QTextDocumentPrivate17emitUndoAvailableEb @ 4694 NONAME
- _ZN20QTextDocumentPrivate17truncateUndoStackEv @ 4695 NONAME
- _ZN20QTextDocumentPrivate18changeObjectFormatEP11QTextObjecti @ 4696 NONAME
- _ZN20QTextDocumentPrivate18compressPieceTableEv @ 4697 NONAME
- _ZN20QTextDocumentPrivate20mergeCachedResourcesEPKS_ @ 4698 NONAME
- _ZN20QTextDocumentPrivate21joinPreviousEditBlockEv @ 4699 NONAME
- _ZN20QTextDocumentPrivate23ensureMaximumBlockCountEv @ 4700 NONAME
- _ZN20QTextDocumentPrivate31adjustDocumentChangesAndCursorsEiiN16QTextUndoCommand9OperationE @ 4701 NONAME
- _ZN20QTextDocumentPrivate4initEv @ 4702 NONAME
- _ZN20QTextDocumentPrivate4moveEiiiN16QTextUndoCommand9OperationE @ 4703 NONAME
- _ZN20QTextDocumentPrivate5clearEv @ 4704 NONAME
- _ZN20QTextDocumentPrivate5splitEi @ 4705 NONAME
- _ZN20QTextDocumentPrivate5uniteEj @ 4706 NONAME
- _ZN20QTextDocumentPrivate6insertEiRK7QStringi @ 4707 NONAME
- _ZN20QTextDocumentPrivate6insertEiiii @ 4708 NONAME
- _ZN20QTextDocumentPrivate6removeEiiN16QTextUndoCommand9OperationE @ 4709 NONAME
- _ZN20QTextDocumentPrivate8undoRedoEb @ 4710 NONAME
- _ZN20QTextDocumentPrivate9setLayoutEP27QAbstractTextDocumentLayout @ 4711 NONAME
- _ZN20QTextDocumentPrivateC1Ev @ 4712 NONAME
- _ZN20QTextDocumentPrivateC2Ev @ 4713 NONAME
- _ZN20QTextDocumentPrivateD0Ev @ 4714 NONAME
- _ZN20QTextDocumentPrivateD1Ev @ 4715 NONAME
- _ZN20QTextDocumentPrivateD2Ev @ 4716 NONAME
- _ZN20QTextFrameLayoutDataD0Ev @ 4717 NONAME
- _ZN20QTextFrameLayoutDataD1Ev @ 4718 NONAME
- _ZN20QTextFrameLayoutDataD2Ev @ 4719 NONAME
- _ZN20QTextTableCellFormatC1ERK11QTextFormat @ 4720 NONAME
- _ZN20QTextTableCellFormatC1Ev @ 4721 NONAME
- _ZN20QTextTableCellFormatC2ERK11QTextFormat @ 4722 NONAME
- _ZN20QTextTableCellFormatC2Ev @ 4723 NONAME
- _ZN20QWidgetResizeHandler11eventFilterEP7QObjectP6QEvent @ 4724 NONAME
- _ZN20QWidgetResizeHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 4725 NONAME
- _ZN20QWidgetResizeHandler11qt_metacastEPKc @ 4726 NONAME
- _ZN20QWidgetResizeHandler13keyPressEventEP9QKeyEvent @ 4727 NONAME
- _ZN20QWidgetResizeHandler14mouseMoveEventEP11QMouseEvent @ 4728 NONAME
- _ZN20QWidgetResizeHandler14setMouseCursorENS_13MousePositionE @ 4729 NONAME
- _ZN20QWidgetResizeHandler16staticMetaObjectE @ 4730 NONAME DATA 16
- _ZN20QWidgetResizeHandler6doMoveEv @ 4731 NONAME
- _ZN20QWidgetResizeHandler8activateEv @ 4732 NONAME
- _ZN20QWidgetResizeHandler8doResizeEv @ 4733 NONAME
- _ZN20QWidgetResizeHandler9setActiveENS_6ActionEb @ 4734 NONAME
- _ZN20QWidgetResizeHandlerC1EP7QWidgetS1_ @ 4735 NONAME
- _ZN20QWidgetResizeHandlerC2EP7QWidgetS1_ @ 4736 NONAME
- _ZN21QAbstractItemDelegate10commitDataEP7QWidget @ 4737 NONAME
- _ZN21QAbstractItemDelegate10elidedTextERK12QFontMetricsiN2Qt13TextElideModeERK7QString @ 4738 NONAME
- _ZN21QAbstractItemDelegate11closeEditorEP7QWidgetNS_11EndEditHintE @ 4739 NONAME
- _ZN21QAbstractItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 4740 NONAME
- _ZN21QAbstractItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 4741 NONAME
- _ZN21QAbstractItemDelegate11qt_metacastEPKc @ 4742 NONAME
- _ZN21QAbstractItemDelegate15sizeHintChangedERK11QModelIndex @ 4743 NONAME
- _ZN21QAbstractItemDelegate16staticMetaObjectE @ 4744 NONAME DATA 16
- _ZN21QAbstractItemDelegate9helpEventEP10QHelpEventP17QAbstractItemViewRK20QStyleOptionViewItemRK11QModelIndex @ 4745 NONAME
- _ZN21QAbstractItemDelegateC2EP7QObject @ 4746 NONAME
- _ZN21QAbstractItemDelegateC2ER14QObjectPrivateP7QObject @ 4747 NONAME
- _ZN21QAbstractItemDelegateD0Ev @ 4748 NONAME
- _ZN21QAbstractItemDelegateD1Ev @ 4749 NONAME
- _ZN21QAbstractItemDelegateD2Ev @ 4750 NONAME
- _ZN21QFontEngineGlyphCacheD0Ev @ 4751 NONAME ABSENT
- _ZN21QFontEngineGlyphCacheD1Ev @ 4752 NONAME ABSENT
- _ZN21QFontEngineGlyphCacheD2Ev @ 4753 NONAME ABSENT
- _ZN21QGraphicsLinearLayout10insertItemEiP19QGraphicsLayoutItem @ 4754 NONAME
- _ZN21QGraphicsLinearLayout10invalidateEv @ 4755 NONAME
- _ZN21QGraphicsLinearLayout10removeItemEP19QGraphicsLayoutItem @ 4756 NONAME
- _ZN21QGraphicsLinearLayout10setSpacingEf @ 4757 NONAME
- _ZN21QGraphicsLinearLayout11setGeometryERK6QRectF @ 4758 NONAME
- _ZN21QGraphicsLinearLayout12setAlignmentEP19QGraphicsLayoutItem6QFlagsIN2Qt13AlignmentFlagEE @ 4759 NONAME
- _ZN21QGraphicsLinearLayout13insertStretchEii @ 4760 NONAME
- _ZN21QGraphicsLinearLayout14setItemSpacingEif @ 4761 NONAME
- _ZN21QGraphicsLinearLayout14setOrientationEN2Qt11OrientationE @ 4762 NONAME
- _ZN21QGraphicsLinearLayout16setStretchFactorEP19QGraphicsLayoutItemi @ 4763 NONAME
- _ZN21QGraphicsLinearLayout8removeAtEi @ 4764 NONAME
- _ZN21QGraphicsLinearLayoutC1EN2Qt11OrientationEP19QGraphicsLayoutItem @ 4765 NONAME
- _ZN21QGraphicsLinearLayoutC1EP19QGraphicsLayoutItem @ 4766 NONAME
- _ZN21QGraphicsLinearLayoutC2EN2Qt11OrientationEP19QGraphicsLayoutItem @ 4767 NONAME
- _ZN21QGraphicsLinearLayoutC2EP19QGraphicsLayoutItem @ 4768 NONAME
- _ZN21QGraphicsLinearLayoutD0Ev @ 4769 NONAME
- _ZN21QGraphicsLinearLayoutD1Ev @ 4770 NONAME
- _ZN21QGraphicsLinearLayoutD2Ev @ 4771 NONAME
- _ZN21QGraphicsSystemPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4772 NONAME
- _ZN21QGraphicsSystemPlugin11qt_metacastEPKc @ 4773 NONAME
- _ZN21QGraphicsSystemPlugin16staticMetaObjectE @ 4774 NONAME DATA 16
- _ZN21QGraphicsSystemPluginC2EP7QObject @ 4775 NONAME
- _ZN21QGraphicsSystemPluginD0Ev @ 4776 NONAME
- _ZN21QGraphicsSystemPluginD1Ev @ 4777 NONAME
- _ZN21QGraphicsSystemPluginD2Ev @ 4778 NONAME
- _ZN21QPaintEngineExPrivateC1Ev @ 4779 NONAME
- _ZN21QPaintEngineExPrivateC2Ev @ 4780 NONAME
- _ZN21QPaintEngineExPrivateD0Ev @ 4781 NONAME
- _ZN21QPaintEngineExPrivateD1Ev @ 4782 NONAME
- _ZN21QPaintEngineExPrivateD2Ev @ 4783 NONAME
- _ZN21QPixmapColorizeFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 4784 NONAME
- _ZN21QPixmapColorizeFilter11qt_metacastEPKc @ 4785 NONAME
- _ZN21QPixmapColorizeFilter16staticMetaObjectE @ 4786 NONAME DATA 16
- _ZN21QPixmapColorizeFilter8setColorERK6QColor @ 4787 NONAME
- _ZN21QPixmapColorizeFilterC1EP7QObject @ 4788 NONAME
- _ZN21QPixmapColorizeFilterC2EP7QObject @ 4789 NONAME
- _ZN21QSortFilterProxyModel10insertRowsEiiRK11QModelIndex @ 4790 NONAME
- _ZN21QSortFilterProxyModel10invalidateEv @ 4791 NONAME
- _ZN21QSortFilterProxyModel10removeRowsEiiRK11QModelIndex @ 4792 NONAME
- _ZN21QSortFilterProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4793 NONAME
- _ZN21QSortFilterProxyModel11qt_metacastEPKc @ 4794 NONAME
- _ZN21QSortFilterProxyModel11setSortRoleEi @ 4795 NONAME
- _ZN21QSortFilterProxyModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 4796 NONAME
- _ZN21QSortFilterProxyModel13filterChangedEv @ 4797 NONAME
- _ZN21QSortFilterProxyModel13insertColumnsEiiRK11QModelIndex @ 4798 NONAME
- _ZN21QSortFilterProxyModel13removeColumnsEiiRK11QModelIndex @ 4799 NONAME
- _ZN21QSortFilterProxyModel13setFilterRoleEi @ 4800 NONAME
- _ZN21QSortFilterProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4801 NONAME
- _ZN21QSortFilterProxyModel14setSourceModelEP18QAbstractItemModel @ 4802 NONAME
- _ZN21QSortFilterProxyModel15setFilterRegExpERK7QRegExp @ 4803 NONAME
- _ZN21QSortFilterProxyModel15setFilterRegExpERK7QString @ 4804 NONAME
- _ZN21QSortFilterProxyModel16invalidateFilterEv @ 4805 NONAME
- _ZN21QSortFilterProxyModel16staticMetaObjectE @ 4806 NONAME DATA 16
- _ZN21QSortFilterProxyModel17setFilterWildcardERK7QString @ 4807 NONAME
- _ZN21QSortFilterProxyModel18setFilterKeyColumnEi @ 4808 NONAME
- _ZN21QSortFilterProxyModel18setSortLocaleAwareEb @ 4809 NONAME
- _ZN21QSortFilterProxyModel20setDynamicSortFilterEb @ 4810 NONAME
- _ZN21QSortFilterProxyModel20setFilterFixedStringERK7QString @ 4811 NONAME
- _ZN21QSortFilterProxyModel22setSortCaseSensitivityEN2Qt15CaseSensitivityE @ 4812 NONAME
- _ZN21QSortFilterProxyModel24setFilterCaseSensitivityEN2Qt15CaseSensitivityE @ 4813 NONAME
- _ZN21QSortFilterProxyModel4sortEiN2Qt9SortOrderE @ 4814 NONAME
- _ZN21QSortFilterProxyModel5clearEv @ 4815 NONAME
- _ZN21QSortFilterProxyModel7setDataERK11QModelIndexRK8QVarianti @ 4816 NONAME
- _ZN21QSortFilterProxyModel9fetchMoreERK11QModelIndex @ 4817 NONAME
- _ZN21QSortFilterProxyModelC1EP7QObject @ 4818 NONAME
- _ZN21QSortFilterProxyModelC2EP7QObject @ 4819 NONAME
- _ZN21QSortFilterProxyModelD0Ev @ 4820 NONAME
- _ZN21QSortFilterProxyModelD1Ev @ 4821 NONAME
- _ZN21QSortFilterProxyModelD2Ev @ 4822 NONAME
- _ZN21QStyleOptionFocusRectC1Ei @ 4823 NONAME
- _ZN21QStyleOptionFocusRectC1Ev @ 4824 NONAME
- _ZN21QStyleOptionFocusRectC2Ei @ 4825 NONAME
- _ZN21QStyleOptionFocusRectC2Ev @ 4826 NONAME
- _ZN21QStyleOptionToolBoxV2C1ERK19QStyleOptionToolBox @ 4827 NONAME
- _ZN21QStyleOptionToolBoxV2C1Ei @ 4828 NONAME
- _ZN21QStyleOptionToolBoxV2C1Ev @ 4829 NONAME
- _ZN21QStyleOptionToolBoxV2C2ERK19QStyleOptionToolBox @ 4830 NONAME
- _ZN21QStyleOptionToolBoxV2C2Ei @ 4831 NONAME
- _ZN21QStyleOptionToolBoxV2C2Ev @ 4832 NONAME
- _ZN21QStyleOptionToolBoxV2aSERK19QStyleOptionToolBox @ 4833 NONAME
- _ZN21QTextDocumentFragment13fromPlainTextERK7QString @ 4834 NONAME
- _ZN21QTextDocumentFragment8fromHtmlERK7QString @ 4835 NONAME
- _ZN21QTextDocumentFragment8fromHtmlERK7QStringPK13QTextDocument @ 4836 NONAME
- _ZN21QTextDocumentFragmentC1EPK13QTextDocument @ 4837 NONAME
- _ZN21QTextDocumentFragmentC1ERK11QTextCursor @ 4838 NONAME
- _ZN21QTextDocumentFragmentC1ERKS_ @ 4839 NONAME
- _ZN21QTextDocumentFragmentC1Ev @ 4840 NONAME
- _ZN21QTextDocumentFragmentC2EPK13QTextDocument @ 4841 NONAME
- _ZN21QTextDocumentFragmentC2ERK11QTextCursor @ 4842 NONAME
- _ZN21QTextDocumentFragmentC2ERKS_ @ 4843 NONAME
- _ZN21QTextDocumentFragmentC2Ev @ 4844 NONAME
- _ZN21QTextDocumentFragmentD1Ev @ 4845 NONAME
- _ZN21QTextDocumentFragmentD2Ev @ 4846 NONAME
- _ZN21QTextDocumentFragmentaSERKS_ @ 4847 NONAME
- _ZN21QTextFormatCollection14indexForFormatERK11QTextFormat @ 4848 NONAME
- _ZN21QTextFormatCollection14setDefaultFontERK5QFont @ 4849 NONAME
- _ZN21QTextFormatCollection15setObjectFormatEiRK11QTextFormat @ 4850 NONAME
- _ZN21QTextFormatCollection17createObjectIndexERK11QTextFormat @ 4851 NONAME
- _ZN21QTextFormatCollection20setObjectFormatIndexEii @ 4852 NONAME
- _ZN21QTextFormatCollectionC1ERKS_ @ 4853 NONAME
- _ZN21QTextFormatCollectionC2ERKS_ @ 4854 NONAME
- _ZN21QTextFormatCollectionD1Ev @ 4855 NONAME
- _ZN21QTextFormatCollectionD2Ev @ 4856 NONAME
- _ZN21QTextFormatCollectionaSERKS_ @ 4857 NONAME
- _ZN22QGraphicsItemAnimation10setScaleAtEfff @ 4858 NONAME
- _ZN22QGraphicsItemAnimation10setShearAtEfff @ 4859 NONAME
- _ZN22QGraphicsItemAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 4860 NONAME
- _ZN22QGraphicsItemAnimation11qt_metacastEPKc @ 4861 NONAME
- _ZN22QGraphicsItemAnimation11setTimeLineEP9QTimeLine @ 4862 NONAME
- _ZN22QGraphicsItemAnimation13setRotationAtEff @ 4863 NONAME
- _ZN22QGraphicsItemAnimation16setTranslationAtEfff @ 4864 NONAME
- _ZN22QGraphicsItemAnimation16staticMetaObjectE @ 4865 NONAME DATA 16
- _ZN22QGraphicsItemAnimation18afterAnimationStepEf @ 4866 NONAME
- _ZN22QGraphicsItemAnimation19beforeAnimationStepEf @ 4867 NONAME
- _ZN22QGraphicsItemAnimation5clearEv @ 4868 NONAME
- _ZN22QGraphicsItemAnimation5resetEv @ 4869 NONAME
- _ZN22QGraphicsItemAnimation7setItemEP13QGraphicsItem @ 4870 NONAME
- _ZN22QGraphicsItemAnimation7setStepEf @ 4871 NONAME
- _ZN22QGraphicsItemAnimation8setPosAtEfRK7QPointF @ 4872 NONAME
- _ZN22QGraphicsItemAnimationC1EP7QObject @ 4873 NONAME
- _ZN22QGraphicsItemAnimationC2EP7QObject @ 4874 NONAME
- _ZN22QGraphicsItemAnimationD0Ev @ 4875 NONAME
- _ZN22QGraphicsItemAnimationD1Ev @ 4876 NONAME
- _ZN22QGraphicsItemAnimationD2Ev @ 4877 NONAME
- _ZN22QGraphicsLayoutPrivate17activateRecursiveEP19QGraphicsLayoutItem @ 4878 NONAME
- _ZN22QGraphicsLayoutPrivate18addChildLayoutItemEP19QGraphicsLayoutItem @ 4879 NONAME
- _ZN22QGraphicsLayoutPrivate18reparentChildItemsEP13QGraphicsItem @ 4880 NONAME
- _ZN22QGraphicsSystemFactory4keysEv @ 4881 NONAME ABSENT
- _ZN22QGraphicsSystemFactory6createERK7QString @ 4882 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate10updateFontERK5QFont @ 4883 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate11resolveFontEj @ 4884 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate13updatePaletteERK8QPalette @ 4885 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate14resolvePaletteEj @ 4886 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate14setFocusWidgetEv @ 4887 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate14setFont_helperERK5QFont @ 4888 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate16clearFocusWidgetEv @ 4889 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate16setLayout_helperEP15QGraphicsLayout @ 4890 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate17adjustWindowFlagsEP6QFlagsIN2Qt10WindowTypeEE @ 4891 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate17setPalette_helperERK8QPalette @ 4892 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate20setLayoutItemMarginsEN6QStyle10SubElementEPK12QStyleOption @ 4893 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate20setLayoutItemMarginsEffff @ 4894 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate22resolveLayoutDirectionEv @ 4895 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate23initStyleOptionTitleBarEP20QStyleOptionTitleBar @ 4896 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate25setLayoutDirection_helperEN2Qt15LayoutDirectionE @ 4897 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate25windowFrameHoverMoveEventEP24QGraphicsSceneHoverEvent @ 4898 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate25windowFrameMouseMoveEventEP24QGraphicsSceneMouseEvent @ 4899 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate26windowFrameHoverLeaveEventEP24QGraphicsSceneHoverEvent @ 4900 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate26windowFrameMousePressEventEP24QGraphicsSceneMouseEvent @ 4901 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate28windowFrameMouseReleaseEventEP24QGraphicsSceneMouseEvent @ 4902 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate30fixFocusChainBeforeReparentingEP15QGraphicsWidgetP14QGraphicsScene @ 4903 NONAME ABSENT
- _ZN22QGraphicsWidgetPrivate4initEP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 4904 NONAME ABSENT
- _ZN22QStyleOptionDockWidgetC1Ei @ 4905 NONAME
- _ZN22QStyleOptionDockWidgetC1Ev @ 4906 NONAME
- _ZN22QStyleOptionDockWidgetC2Ei @ 4907 NONAME
- _ZN22QStyleOptionDockWidgetC2Ev @ 4908 NONAME
- _ZN22QStyleOptionQ3ListViewC1Ei @ 4909 NONAME
- _ZN22QStyleOptionQ3ListViewC1Ev @ 4910 NONAME
- _ZN22QStyleOptionQ3ListViewC2Ei @ 4911 NONAME
- _ZN22QStyleOptionQ3ListViewC2Ev @ 4912 NONAME
- _ZN22QStyleOptionRubberBandC1Ei @ 4913 NONAME
- _ZN22QStyleOptionRubberBandC1Ev @ 4914 NONAME
- _ZN22QStyleOptionRubberBandC2Ei @ 4915 NONAME
- _ZN22QStyleOptionRubberBandC2Ev @ 4916 NONAME
- _ZN22QStyleOptionTabBarBaseC1Ei @ 4917 NONAME
- _ZN22QStyleOptionTabBarBaseC1Ev @ 4918 NONAME
- _ZN22QStyleOptionTabBarBaseC2Ei @ 4919 NONAME
- _ZN22QStyleOptionTabBarBaseC2Ev @ 4920 NONAME
- _ZN22QStyleOptionToolButtonC1Ei @ 4921 NONAME
- _ZN22QStyleOptionToolButtonC1Ev @ 4922 NONAME
- _ZN22QStyleOptionToolButtonC2Ei @ 4923 NONAME
- _ZN22QStyleOptionToolButtonC2Ev @ 4924 NONAME
- _ZN22QStyleOptionViewItemV2C1ERK20QStyleOptionViewItem @ 4925 NONAME
- _ZN22QStyleOptionViewItemV2C1Ei @ 4926 NONAME
- _ZN22QStyleOptionViewItemV2C1Ev @ 4927 NONAME
- _ZN22QStyleOptionViewItemV2C2ERK20QStyleOptionViewItem @ 4928 NONAME
- _ZN22QStyleOptionViewItemV2C2Ei @ 4929 NONAME
- _ZN22QStyleOptionViewItemV2C2Ev @ 4930 NONAME
- _ZN22QStyleOptionViewItemV2aSERK20QStyleOptionViewItem @ 4931 NONAME
- _ZN22QStyleOptionViewItemV3C1ERK20QStyleOptionViewItem @ 4932 NONAME
- _ZN22QStyleOptionViewItemV3C1Ei @ 4933 NONAME
- _ZN22QStyleOptionViewItemV3C1Ev @ 4934 NONAME
- _ZN22QStyleOptionViewItemV3C2ERK20QStyleOptionViewItem @ 4935 NONAME
- _ZN22QStyleOptionViewItemV3C2Ei @ 4936 NONAME
- _ZN22QStyleOptionViewItemV3C2Ev @ 4937 NONAME
- _ZN22QStyleOptionViewItemV3aSERK20QStyleOptionViewItem @ 4938 NONAME
- _ZN22QStyleOptionViewItemV4C1ERK20QStyleOptionViewItem @ 4939 NONAME
- _ZN22QStyleOptionViewItemV4C1Ei @ 4940 NONAME
- _ZN22QStyleOptionViewItemV4C1Ev @ 4941 NONAME
- _ZN22QStyleOptionViewItemV4C2ERK20QStyleOptionViewItem @ 4942 NONAME
- _ZN22QStyleOptionViewItemV4C2Ei @ 4943 NONAME
- _ZN22QStyleOptionViewItemV4C2Ev @ 4944 NONAME
- _ZN22QStyleOptionViewItemV4aSERK20QStyleOptionViewItem @ 4945 NONAME
- _ZN22QWhatsThisClickedEventC1ERK7QString @ 4946 NONAME
- _ZN22QWhatsThisClickedEventC2ERK7QString @ 4947 NONAME
- _ZN22QWhatsThisClickedEventD0Ev @ 4948 NONAME
- _ZN22QWhatsThisClickedEventD1Ev @ 4949 NONAME
- _ZN22QWhatsThisClickedEventD2Ev @ 4950 NONAME
- _ZN23QFileSystemModelPrivate10removeNodeEPNS_15QFileSystemNodeERK7QString @ 4951 NONAME
- _ZN23QFileSystemModelPrivate12sortChildrenEiRK11QModelIndex @ 4952 NONAME
- _ZN23QFileSystemModelPrivate14naturalCompareERK7QStringS2_N2Qt15CaseSensitivityE @ 4953 NONAME
- _ZN23QFileSystemModelPrivate15_q_resolvedNameERK7QStringS2_ @ 4954 NONAME
- _ZN23QFileSystemModelPrivate15addVisibleFilesEPNS_15QFileSystemNodeERK11QStringList @ 4955 NONAME
- _ZN23QFileSystemModelPrivate17removeVisibleFileEPNS_15QFileSystemNodeEi @ 4956 NONAME
- _ZN23QFileSystemModelPrivate19_q_directoryChangedERK7QStringRK11QStringList @ 4957 NONAME
- _ZN23QFileSystemModelPrivate20_q_fileSystemChangedERK7QStringRK5QListI5QPairIS0_9QFileInfoEE @ 4958 NONAME
- _ZN23QFileSystemModelPrivate21_q_performDelayedSortEv @ 4959 NONAME
- _ZN23QFileSystemModelPrivate4initEv @ 4960 NONAME
- _ZN23QFileSystemModelPrivate4sizeEx @ 4961 NONAME
- _ZN23QFileSystemModelPrivate7addNodeEPNS_15QFileSystemNodeERK7QStringRK9QFileInfo @ 4962 NONAME
- _ZN23QGraphicsSceneHelpEvent11setScenePosERK7QPointF @ 4963 NONAME
- _ZN23QGraphicsSceneHelpEvent12setScreenPosERK6QPoint @ 4964 NONAME
- _ZN23QGraphicsSceneHelpEventC1EN6QEvent4TypeE @ 4965 NONAME
- _ZN23QGraphicsSceneHelpEventC2EN6QEvent4TypeE @ 4966 NONAME
- _ZN23QGraphicsSceneHelpEventD0Ev @ 4967 NONAME
- _ZN23QGraphicsSceneHelpEventD1Ev @ 4968 NONAME
- _ZN23QGraphicsSceneHelpEventD2Ev @ 4969 NONAME
- _ZN23QGraphicsSceneMoveEvent9setNewPosERK7QPointF @ 4970 NONAME
- _ZN23QGraphicsSceneMoveEvent9setOldPosERK7QPointF @ 4971 NONAME
- _ZN23QGraphicsSceneMoveEventC1Ev @ 4972 NONAME
- _ZN23QGraphicsSceneMoveEventC2Ev @ 4973 NONAME
- _ZN23QGraphicsSceneMoveEventD0Ev @ 4974 NONAME
- _ZN23QGraphicsSceneMoveEventD1Ev @ 4975 NONAME
- _ZN23QGraphicsSceneMoveEventD2Ev @ 4976 NONAME
- _ZN23QGraphicsSimpleTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4977 NONAME
- _ZN23QGraphicsSimpleTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4978 NONAME
- _ZN23QGraphicsSimpleTextItem7setFontERK5QFont @ 4979 NONAME
- _ZN23QGraphicsSimpleTextItem7setTextERK7QString @ 4980 NONAME
- _ZN23QGraphicsSimpleTextItemC1EP13QGraphicsItemP14QGraphicsScene @ 4981 NONAME
- _ZN23QGraphicsSimpleTextItemC1ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 4982 NONAME
- _ZN23QGraphicsSimpleTextItemC2EP13QGraphicsItemP14QGraphicsScene @ 4983 NONAME
- _ZN23QGraphicsSimpleTextItemC2ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 4984 NONAME
- _ZN23QGraphicsSimpleTextItemD0Ev @ 4985 NONAME
- _ZN23QGraphicsSimpleTextItemD1Ev @ 4986 NONAME
- _ZN23QGraphicsSimpleTextItemD2Ev @ 4987 NONAME
- _ZN23QImageTextureGlyphCache11fillTextureERKN18QTextureGlyphCache5CoordEj @ 4988 NONAME ABSENT
- _ZN23QImageTextureGlyphCache17createTextureDataEii @ 4989 NONAME ABSENT
- _ZN23QImageTextureGlyphCache17resizeTextureDataEii @ 4990 NONAME ABSENT
- _ZN23QPixmapDropShadowFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 4991 NONAME
- _ZN23QPixmapDropShadowFilter11qt_metacastEPKc @ 4992 NONAME
- _ZN23QPixmapDropShadowFilter13setBlurRadiusEf @ 4993 NONAME ABSENT
- _ZN23QPixmapDropShadowFilter16staticMetaObjectE @ 4994 NONAME DATA 16
- _ZN23QPixmapDropShadowFilter8setColorERK6QColor @ 4995 NONAME
- _ZN23QPixmapDropShadowFilter9setOffsetERK7QPointF @ 4996 NONAME
- _ZN23QPixmapDropShadowFilterC1EP7QObject @ 4997 NONAME
- _ZN23QPixmapDropShadowFilterC2EP7QObject @ 4998 NONAME
- _ZN23QPixmapDropShadowFilterD0Ev @ 4999 NONAME
- _ZN23QPixmapDropShadowFilterD1Ev @ 5000 NONAME
- _ZN23QPixmapDropShadowFilterD2Ev @ 5001 NONAME
- _ZN23QStyleHintReturnVariantC1Ev @ 5002 NONAME
- _ZN23QStyleHintReturnVariantC2Ev @ 5003 NONAME
- _ZN23QStyleOptionProgressBarC1Ei @ 5004 NONAME
- _ZN23QStyleOptionProgressBarC1Ev @ 5005 NONAME
- _ZN23QStyleOptionProgressBarC2Ei @ 5006 NONAME
- _ZN23QStyleOptionProgressBarC2Ev @ 5007 NONAME
- _ZN23QTreeWidgetItemIteratorC1EP11QTreeWidget6QFlagsINS_12IteratorFlagEE @ 5008 NONAME
- _ZN23QTreeWidgetItemIteratorC1EP15QTreeWidgetItem6QFlagsINS_12IteratorFlagEE @ 5009 NONAME
- _ZN23QTreeWidgetItemIteratorC1ERKS_ @ 5010 NONAME
- _ZN23QTreeWidgetItemIteratorC2EP11QTreeWidget6QFlagsINS_12IteratorFlagEE @ 5011 NONAME
- _ZN23QTreeWidgetItemIteratorC2EP15QTreeWidgetItem6QFlagsINS_12IteratorFlagEE @ 5012 NONAME
- _ZN23QTreeWidgetItemIteratorC2ERKS_ @ 5013 NONAME
- _ZN23QTreeWidgetItemIteratorD1Ev @ 5014 NONAME
- _ZN23QTreeWidgetItemIteratorD2Ev @ 5015 NONAME
- _ZN23QTreeWidgetItemIteratoraSERKS_ @ 5016 NONAME
- _ZN23QTreeWidgetItemIteratormmEv @ 5017 NONAME
- _ZN23QTreeWidgetItemIteratorppEv @ 5018 NONAME
- _ZN23QWindowStateChangeEventC1E6QFlagsIN2Qt11WindowStateEE @ 5019 NONAME
- _ZN23QWindowStateChangeEventC1E6QFlagsIN2Qt11WindowStateEEb @ 5020 NONAME
- _ZN23QWindowStateChangeEventC2E6QFlagsIN2Qt11WindowStateEE @ 5021 NONAME
- _ZN23QWindowStateChangeEventC2E6QFlagsIN2Qt11WindowStateEEb @ 5022 NONAME
- _ZN23QWindowStateChangeEventD0Ev @ 5023 NONAME
- _ZN23QWindowStateChangeEventD1Ev @ 5024 NONAME
- _ZN23QWindowStateChangeEventD2Ev @ 5025 NONAME
- _ZN24QAbstractItemViewPrivate10openEditorERK11QModelIndexP6QEvent @ 5026 NONAME
- _ZN24QAbstractItemViewPrivate12_q_fetchMoreEv @ 5027 NONAME ABSENT
- _ZN24QAbstractItemViewPrivate12removeEditorEP7QWidget @ 5028 NONAME
- _ZN24QAbstractItemViewPrivate13clearOrRemoveEv @ 5029 NONAME
- _ZN24QAbstractItemViewPrivate14_q_rowsRemovedERK11QModelIndexii @ 5030 NONAME
- _ZN24QAbstractItemViewPrivate16_q_layoutChangedEv @ 5031 NONAME
- _ZN24QAbstractItemViewPrivate16droppingOnItselfEP10QDropEventRK11QModelIndex @ 5032 NONAME
- _ZN24QAbstractItemViewPrivate16updateEditorDataERK11QModelIndexS2_ @ 5033 NONAME
- _ZN24QAbstractItemViewPrivate17_q_columnsRemovedERK11QModelIndexii @ 5034 NONAME
- _ZN24QAbstractItemViewPrivate17_q_modelDestroyedEv @ 5035 NONAME
- _ZN24QAbstractItemViewPrivate18_q_columnsInsertedERK11QModelIndexii @ 5036 NONAME
- _ZN24QAbstractItemViewPrivate20doDelayedItemsLayoutEi @ 5037 NONAME
- _ZN24QAbstractItemViewPrivate26_q_columnsAboutToBeRemovedERK11QModelIndexii @ 5038 NONAME
- _ZN24QAbstractItemViewPrivate26checkPersistentEditorFocusEv @ 5039 NONAME
- _ZN24QAbstractItemViewPrivate4initEv @ 5040 NONAME
- _ZN24QAbstractItemViewPrivate6dropOnEP10QDropEventPiS2_P11QModelIndex @ 5041 NONAME
- _ZN24QAbstractItemViewPrivate6editorERK11QModelIndexRK20QStyleOptionViewItem @ 5042 NONAME
- _ZN24QAbstractItemViewPrivate9addEditorERK11QModelIndexP7QWidgetb @ 5043 NONAME
- _ZN24QAbstractItemViewPrivate9selectAllE6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 5044 NONAME
- _ZN24QAbstractItemViewPrivateC1Ev @ 5045 NONAME
- _ZN24QAbstractItemViewPrivateC2Ev @ 5046 NONAME
- _ZN24QAbstractItemViewPrivateD0Ev @ 5047 NONAME
- _ZN24QAbstractItemViewPrivateD1Ev @ 5048 NONAME
- _ZN24QAbstractItemViewPrivateD2Ev @ 5049 NONAME
- _ZN24QComboBoxPrivateScroller11qt_metacallEN11QMetaObject4CallEiPPv @ 5050 NONAME
- _ZN24QComboBoxPrivateScroller11qt_metacastEPKc @ 5051 NONAME
- _ZN24QComboBoxPrivateScroller16staticMetaObjectE @ 5052 NONAME DATA 16
- _ZN24QComboBoxPrivateScroller8doScrollEi @ 5053 NONAME
- _ZN24QGraphicsSceneHoverEvent10setLastPosERK7QPointF @ 5054 NONAME
- _ZN24QGraphicsSceneHoverEvent11setScenePosERK7QPointF @ 5055 NONAME
- _ZN24QGraphicsSceneHoverEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5056 NONAME
- _ZN24QGraphicsSceneHoverEvent12setScreenPosERK6QPoint @ 5057 NONAME
- _ZN24QGraphicsSceneHoverEvent15setLastScenePosERK7QPointF @ 5058 NONAME
- _ZN24QGraphicsSceneHoverEvent16setLastScreenPosERK6QPoint @ 5059 NONAME
- _ZN24QGraphicsSceneHoverEvent6setPosERK7QPointF @ 5060 NONAME
- _ZN24QGraphicsSceneHoverEventC1EN6QEvent4TypeE @ 5061 NONAME
- _ZN24QGraphicsSceneHoverEventC2EN6QEvent4TypeE @ 5062 NONAME
- _ZN24QGraphicsSceneHoverEventD0Ev @ 5063 NONAME
- _ZN24QGraphicsSceneHoverEventD1Ev @ 5064 NONAME
- _ZN24QGraphicsSceneHoverEventD2Ev @ 5065 NONAME
- _ZN24QGraphicsSceneMouseEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5066 NONAME
- _ZN24QGraphicsSceneMouseEvent10setLastPosERK7QPointF @ 5067 NONAME
- _ZN24QGraphicsSceneMouseEvent11setScenePosERK7QPointF @ 5068 NONAME
- _ZN24QGraphicsSceneMouseEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5069 NONAME
- _ZN24QGraphicsSceneMouseEvent12setScreenPosERK6QPoint @ 5070 NONAME
- _ZN24QGraphicsSceneMouseEvent15setLastScenePosERK7QPointF @ 5071 NONAME
- _ZN24QGraphicsSceneMouseEvent16setButtonDownPosEN2Qt11MouseButtonERK7QPointF @ 5072 NONAME
- _ZN24QGraphicsSceneMouseEvent16setLastScreenPosERK6QPoint @ 5073 NONAME
- _ZN24QGraphicsSceneMouseEvent21setButtonDownScenePosEN2Qt11MouseButtonERK7QPointF @ 5074 NONAME
- _ZN24QGraphicsSceneMouseEvent22setButtonDownScreenPosEN2Qt11MouseButtonERK6QPoint @ 5075 NONAME
- _ZN24QGraphicsSceneMouseEvent6setPosERK7QPointF @ 5076 NONAME
- _ZN24QGraphicsSceneMouseEvent9setButtonEN2Qt11MouseButtonE @ 5077 NONAME
- _ZN24QGraphicsSceneMouseEventC1EN6QEvent4TypeE @ 5078 NONAME
- _ZN24QGraphicsSceneMouseEventC2EN6QEvent4TypeE @ 5079 NONAME
- _ZN24QGraphicsSceneMouseEventD0Ev @ 5080 NONAME
- _ZN24QGraphicsSceneMouseEventD1Ev @ 5081 NONAME
- _ZN24QGraphicsSceneMouseEventD2Ev @ 5082 NONAME
- _ZN24QGraphicsSceneWheelEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5083 NONAME
- _ZN24QGraphicsSceneWheelEvent11setScenePosERK7QPointF @ 5084 NONAME
- _ZN24QGraphicsSceneWheelEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5085 NONAME
- _ZN24QGraphicsSceneWheelEvent12setScreenPosERK6QPoint @ 5086 NONAME
- _ZN24QGraphicsSceneWheelEvent14setOrientationEN2Qt11OrientationE @ 5087 NONAME
- _ZN24QGraphicsSceneWheelEvent6setPosERK7QPointF @ 5088 NONAME
- _ZN24QGraphicsSceneWheelEvent8setDeltaEi @ 5089 NONAME
- _ZN24QGraphicsSceneWheelEventC1EN6QEvent4TypeE @ 5090 NONAME
- _ZN24QGraphicsSceneWheelEventC2EN6QEvent4TypeE @ 5091 NONAME
- _ZN24QGraphicsSceneWheelEventD0Ev @ 5092 NONAME
- _ZN24QGraphicsSceneWheelEventD1Ev @ 5093 NONAME
- _ZN24QGraphicsSceneWheelEventD2Ev @ 5094 NONAME
- _ZN24QPixmapConvolutionFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 5095 NONAME
- _ZN24QPixmapConvolutionFilter11qt_metacastEPKc @ 5096 NONAME
- _ZN24QPixmapConvolutionFilter16staticMetaObjectE @ 5097 NONAME DATA 16
- _ZN24QPixmapConvolutionFilter20setConvolutionKernelEPKfii @ 5098 NONAME
- _ZN24QPixmapConvolutionFilterC1EP7QObject @ 5099 NONAME
- _ZN24QPixmapConvolutionFilterC2EP7QObject @ 5100 NONAME
- _ZN24QPixmapConvolutionFilterD0Ev @ 5101 NONAME
- _ZN24QPixmapConvolutionFilterD1Ev @ 5102 NONAME
- _ZN24QPixmapConvolutionFilterD2Ev @ 5103 NONAME
- _ZN24QPlainTextDocumentLayout10blockWidthERK10QTextBlock @ 5104 NONAME
- _ZN24QPlainTextDocumentLayout11layoutBlockERK10QTextBlock @ 5105 NONAME
- _ZN24QPlainTextDocumentLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5106 NONAME
- _ZN24QPlainTextDocumentLayout11qt_metacastEPKc @ 5107 NONAME
- _ZN24QPlainTextDocumentLayout12setTextWidthEf @ 5108 NONAME
- _ZN24QPlainTextDocumentLayout13requestUpdateEv @ 5109 NONAME
- _ZN24QPlainTextDocumentLayout14setCursorWidthEi @ 5110 NONAME
- _ZN24QPlainTextDocumentLayout15documentChangedEiii @ 5111 NONAME
- _ZN24QPlainTextDocumentLayout16staticMetaObjectE @ 5112 NONAME DATA 16
- _ZN24QPlainTextDocumentLayout4drawEP8QPainterRKN27QAbstractTextDocumentLayout12PaintContextE @ 5113 NONAME
- _ZN24QPlainTextDocumentLayoutC1EP13QTextDocument @ 5114 NONAME
- _ZN24QPlainTextDocumentLayoutC2EP13QTextDocument @ 5115 NONAME
- _ZN24QPlainTextDocumentLayoutD0Ev @ 5116 NONAME
- _ZN24QPlainTextDocumentLayoutD1Ev @ 5117 NONAME
- _ZN24QPlainTextDocumentLayoutD2Ev @ 5118 NONAME
- _ZN24QStyleOptionDockWidgetV2C1ERK22QStyleOptionDockWidget @ 5119 NONAME
- _ZN24QStyleOptionDockWidgetV2C1Ei @ 5120 NONAME
- _ZN24QStyleOptionDockWidgetV2C1Ev @ 5121 NONAME
- _ZN24QStyleOptionDockWidgetV2C2ERK22QStyleOptionDockWidget @ 5122 NONAME
- _ZN24QStyleOptionDockWidgetV2C2Ei @ 5123 NONAME
- _ZN24QStyleOptionDockWidgetV2C2Ev @ 5124 NONAME
- _ZN24QStyleOptionDockWidgetV2aSERK22QStyleOptionDockWidget @ 5125 NONAME
- _ZN24QStyleOptionGraphicsItemC1Ei @ 5126 NONAME
- _ZN24QStyleOptionGraphicsItemC1Ev @ 5127 NONAME
- _ZN24QStyleOptionGraphicsItemC2Ei @ 5128 NONAME
- _ZN24QStyleOptionGraphicsItemC2Ev @ 5129 NONAME
- _ZN24QStyleOptionQ3DockWindowC1Ei @ 5130 NONAME
- _ZN24QStyleOptionQ3DockWindowC1Ev @ 5131 NONAME
- _ZN24QStyleOptionQ3DockWindowC2Ei @ 5132 NONAME
- _ZN24QStyleOptionQ3DockWindowC2Ev @ 5133 NONAME
- _ZN24QStyleOptionTabBarBaseV2C1ERK22QStyleOptionTabBarBase @ 5134 NONAME
- _ZN24QStyleOptionTabBarBaseV2C1Ei @ 5135 NONAME
- _ZN24QStyleOptionTabBarBaseV2C1Ev @ 5136 NONAME
- _ZN24QStyleOptionTabBarBaseV2C2ERK22QStyleOptionTabBarBase @ 5137 NONAME
- _ZN24QStyleOptionTabBarBaseV2C2Ei @ 5138 NONAME
- _ZN24QStyleOptionTabBarBaseV2C2Ev @ 5139 NONAME
- _ZN24QStyleOptionTabBarBaseV2aSERK22QStyleOptionTabBarBase @ 5140 NONAME
- _ZN25QComboBoxPrivateContainer10leaveEventEP6QEvent @ 5141 NONAME
- _ZN25QComboBoxPrivateContainer10timerEventEP11QTimerEvent @ 5142 NONAME
- _ZN25QComboBoxPrivateContainer11changeEventEP6QEvent @ 5143 NONAME
- _ZN25QComboBoxPrivateContainer11eventFilterEP7QObjectP6QEvent @ 5144 NONAME
- _ZN25QComboBoxPrivateContainer11qt_metacallEN11QMetaObject4CallEiPPv @ 5145 NONAME
- _ZN25QComboBoxPrivateContainer11qt_metacastEPKc @ 5146 NONAME
- _ZN25QComboBoxPrivateContainer11resetButtonEv @ 5147 NONAME
- _ZN25QComboBoxPrivateContainer11resizeEventEP12QResizeEvent @ 5148 NONAME
- _ZN25QComboBoxPrivateContainer11setItemViewEP17QAbstractItemView @ 5149 NONAME
- _ZN25QComboBoxPrivateContainer12itemSelectedERK11QModelIndex @ 5150 NONAME
- _ZN25QComboBoxPrivateContainer13viewDestroyedEv @ 5151 NONAME
- _ZN25QComboBoxPrivateContainer14scrollItemViewEi @ 5152 NONAME
- _ZN25QComboBoxPrivateContainer15mousePressEventEP11QMouseEvent @ 5153 NONAME
- _ZN25QComboBoxPrivateContainer15setCurrentIndexERK11QModelIndex @ 5154 NONAME
- _ZN25QComboBoxPrivateContainer15updateScrollersEv @ 5155 NONAME
- _ZN25QComboBoxPrivateContainer16staticMetaObjectE @ 5156 NONAME DATA 16
- _ZN25QComboBoxPrivateContainer17mouseReleaseEventEP11QMouseEvent @ 5157 NONAME
- _ZN25QComboBoxPrivateContainer21updateTopBottomMarginEv @ 5158 NONAME
- _ZN25QComboBoxPrivateContainer9hideEventEP10QHideEvent @ 5159 NONAME
- _ZN25QComboBoxPrivateContainer9showEventEP10QShowEvent @ 5160 NONAME
- _ZN25QComboBoxPrivateContainerC1EP17QAbstractItemViewP9QComboBox @ 5161 NONAME
- _ZN25QComboBoxPrivateContainerC2EP17QAbstractItemViewP9QComboBox @ 5162 NONAME
- _ZN25QGraphicsSceneResizeEvent10setNewSizeERK6QSizeF @ 5163 NONAME
- _ZN25QGraphicsSceneResizeEvent10setOldSizeERK6QSizeF @ 5164 NONAME
- _ZN25QGraphicsSceneResizeEventC1Ev @ 5165 NONAME
- _ZN25QGraphicsSceneResizeEventC2Ev @ 5166 NONAME
- _ZN25QGraphicsSceneResizeEventD0Ev @ 5167 NONAME
- _ZN25QGraphicsSceneResizeEventD1Ev @ 5168 NONAME
- _ZN25QGraphicsSceneResizeEventD2Ev @ 5169 NONAME
- _ZN25QStyleOptionProgressBarV2C1ERK23QStyleOptionProgressBar @ 5170 NONAME
- _ZN25QStyleOptionProgressBarV2C1ERKS_ @ 5171 NONAME
- _ZN25QStyleOptionProgressBarV2C1Ei @ 5172 NONAME
- _ZN25QStyleOptionProgressBarV2C1Ev @ 5173 NONAME
- _ZN25QStyleOptionProgressBarV2C2ERK23QStyleOptionProgressBar @ 5174 NONAME
- _ZN25QStyleOptionProgressBarV2C2ERKS_ @ 5175 NONAME
- _ZN25QStyleOptionProgressBarV2C2Ei @ 5176 NONAME
- _ZN25QStyleOptionProgressBarV2C2Ev @ 5177 NONAME
- _ZN25QStyleOptionProgressBarV2aSERK23QStyleOptionProgressBar @ 5178 NONAME
- _ZN26QAbstractGraphicsShapeItem6setPenERK4QPen @ 5179 NONAME
- _ZN26QAbstractGraphicsShapeItem8setBrushERK6QBrush @ 5180 NONAME
- _ZN26QAbstractGraphicsShapeItemC2EP13QGraphicsItemP14QGraphicsScene @ 5181 NONAME
- _ZN26QAbstractGraphicsShapeItemC2ER33QAbstractGraphicsShapeItemPrivateP13QGraphicsItemP14QGraphicsScene @ 5182 NONAME
- _ZN26QAbstractGraphicsShapeItemD0Ev @ 5183 NONAME
- _ZN26QAbstractGraphicsShapeItemD1Ev @ 5184 NONAME
- _ZN26QAbstractGraphicsShapeItemD2Ev @ 5185 NONAME
- _ZN26QAbstractScrollAreaPrivate14layoutChildrenEv @ 5186 NONAME
- _ZN26QAbstractScrollAreaPrivate16replaceScrollBarEP10QScrollBarN2Qt11OrientationE @ 5187 NONAME
- _ZN26QAbstractScrollAreaPrivate22scrollBarPolicyChangedEN2Qt11OrientationENS0_15ScrollBarPolicyE @ 5188 NONAME ABSENT
- _ZN26QAbstractScrollAreaPrivate23_q_showOrHideScrollBarsEv @ 5189 NONAME
- _ZN26QAbstractScrollAreaPrivate4initEv @ 5190 NONAME
- _ZN26QAbstractScrollAreaPrivate9_q_hslideEi @ 5191 NONAME
- _ZN26QAbstractScrollAreaPrivate9_q_vslideEi @ 5192 NONAME
- _ZN26QAbstractScrollAreaPrivateC1Ev @ 5193 NONAME
- _ZN26QAbstractScrollAreaPrivateC2Ev @ 5194 NONAME
- _ZN26QGraphicsLayoutItemPrivate4initEv @ 5195 NONAME
- _ZN26QGraphicsLayoutItemPrivateC1EP19QGraphicsLayoutItemb @ 5196 NONAME
- _ZN26QGraphicsLayoutItemPrivateC2EP19QGraphicsLayoutItemb @ 5197 NONAME
- _ZN26QStyleOptionQ3ListViewItemC1Ei @ 5198 NONAME
- _ZN26QStyleOptionQ3ListViewItemC1Ev @ 5199 NONAME
- _ZN26QStyleOptionQ3ListViewItemC2Ei @ 5200 NONAME
- _ZN26QStyleOptionQ3ListViewItemC2Ev @ 5201 NONAME
- _ZN26QStyleOptionTabWidgetFrameC1Ei @ 5202 NONAME
- _ZN26QStyleOptionTabWidgetFrameC1Ev @ 5203 NONAME
- _ZN26QStyleOptionTabWidgetFrameC2Ei @ 5204 NONAME
- _ZN26QStyleOptionTabWidgetFrameC2Ev @ 5205 NONAME
- _ZN26QTableWidgetSelectionRangeC1ERKS_ @ 5206 NONAME
- _ZN26QTableWidgetSelectionRangeC1Eiiii @ 5207 NONAME
- _ZN26QTableWidgetSelectionRangeC1Ev @ 5208 NONAME
- _ZN26QTableWidgetSelectionRangeC2ERKS_ @ 5209 NONAME
- _ZN26QTableWidgetSelectionRangeC2Eiiii @ 5210 NONAME
- _ZN26QTableWidgetSelectionRangeC2Ev @ 5211 NONAME
- _ZN26QTableWidgetSelectionRangeD1Ev @ 5212 NONAME
- _ZN26QTableWidgetSelectionRangeD2Ev @ 5213 NONAME
- _ZN27QAbstractTextDocumentLayout11formatIndexEi @ 5214 NONAME
- _ZN27QAbstractTextDocumentLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5215 NONAME
- _ZN27QAbstractTextDocumentLayout11qt_metacastEPKc @ 5216 NONAME
- _ZN27QAbstractTextDocumentLayout11updateBlockERK10QTextBlock @ 5217 NONAME
- _ZN27QAbstractTextDocumentLayout14setPaintDeviceEP12QPaintDevice @ 5218 NONAME
- _ZN27QAbstractTextDocumentLayout15registerHandlerEiP7QObject @ 5219 NONAME
- _ZN27QAbstractTextDocumentLayout16drawInlineObjectEP8QPainterRK6QRectF17QTextInlineObjectiRK11QTextFormat @ 5220 NONAME
- _ZN27QAbstractTextDocumentLayout16pageCountChangedEi @ 5221 NONAME
- _ZN27QAbstractTextDocumentLayout16staticMetaObjectE @ 5222 NONAME DATA 16
- _ZN27QAbstractTextDocumentLayout18resizeInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 5223 NONAME
- _ZN27QAbstractTextDocumentLayout19documentSizeChangedERK6QSizeF @ 5224 NONAME
- _ZN27QAbstractTextDocumentLayout20positionInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 5225 NONAME
- _ZN27QAbstractTextDocumentLayout6formatEi @ 5226 NONAME
- _ZN27QAbstractTextDocumentLayout6updateERK6QRectF @ 5227 NONAME
- _ZN27QAbstractTextDocumentLayoutC2EP13QTextDocument @ 5228 NONAME
- _ZN27QAbstractTextDocumentLayoutC2ER34QAbstractTextDocumentLayoutPrivateP13QTextDocument @ 5229 NONAME
- _ZN27QAbstractTextDocumentLayoutD0Ev @ 5230 NONAME
- _ZN27QAbstractTextDocumentLayoutD1Ev @ 5231 NONAME
- _ZN27QAbstractTextDocumentLayoutD2Ev @ 5232 NONAME
- _ZN27QGraphicsSceneDragDropEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5233 NONAME
- _ZN27QGraphicsSceneDragDropEvent11setMimeDataEPK9QMimeData @ 5234 NONAME
- _ZN27QGraphicsSceneDragDropEvent11setScenePosERK7QPointF @ 5235 NONAME
- _ZN27QGraphicsSceneDragDropEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5236 NONAME
- _ZN27QGraphicsSceneDragDropEvent12setScreenPosERK6QPoint @ 5237 NONAME
- _ZN27QGraphicsSceneDragDropEvent13setDropActionEN2Qt10DropActionE @ 5238 NONAME
- _ZN27QGraphicsSceneDragDropEvent17setProposedActionEN2Qt10DropActionE @ 5239 NONAME
- _ZN27QGraphicsSceneDragDropEvent18setPossibleActionsE6QFlagsIN2Qt10DropActionEE @ 5240 NONAME
- _ZN27QGraphicsSceneDragDropEvent20acceptProposedActionEv @ 5241 NONAME
- _ZN27QGraphicsSceneDragDropEvent6setPosERK7QPointF @ 5242 NONAME
- _ZN27QGraphicsSceneDragDropEvent9setSourceEP7QWidget @ 5243 NONAME
- _ZN27QGraphicsSceneDragDropEventC1EN6QEvent4TypeE @ 5244 NONAME
- _ZN27QGraphicsSceneDragDropEventC2EN6QEvent4TypeE @ 5245 NONAME
- _ZN27QGraphicsSceneDragDropEventD0Ev @ 5246 NONAME
- _ZN27QGraphicsSceneDragDropEventD1Ev @ 5247 NONAME
- _ZN27QGraphicsSceneDragDropEventD2Ev @ 5248 NONAME
- _ZN2Qt12codecForHtmlERK10QByteArray @ 5249 NONAME
- _ZN2Qt15mightBeRichTextERK7QString @ 5250 NONAME
- _ZN2Qt20convertFromPlainTextERK7QStringNS_14WhiteSpaceModeE @ 5251 NONAME
- _ZN2Qt6escapeERK7QString @ 5252 NONAME
- _ZN30QGraphicsSceneContextMenuEvent11setScenePosERK7QPointF @ 5253 NONAME
- _ZN30QGraphicsSceneContextMenuEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5254 NONAME
- _ZN30QGraphicsSceneContextMenuEvent12setScreenPosERK6QPoint @ 5255 NONAME
- _ZN30QGraphicsSceneContextMenuEvent6setPosERK7QPointF @ 5256 NONAME
- _ZN30QGraphicsSceneContextMenuEvent9setReasonENS_6ReasonE @ 5257 NONAME
- _ZN30QGraphicsSceneContextMenuEventC1EN6QEvent4TypeE @ 5258 NONAME
- _ZN30QGraphicsSceneContextMenuEventC2EN6QEvent4TypeE @ 5259 NONAME
- _ZN30QGraphicsSceneContextMenuEventD0Ev @ 5260 NONAME
- _ZN30QGraphicsSceneContextMenuEventD1Ev @ 5261 NONAME
- _ZN30QGraphicsSceneContextMenuEventD2Ev @ 5262 NONAME
- _ZN4QCss10StyleSheet12buildIndexesEN2Qt15CaseSensitivityE @ 5263 NONAME ABSENT
- _ZN4QCss13StyleSelector15selectorMatchesERKNS_8SelectorENS0_7NodePtrE @ 5264 NONAME
- _ZN4QCss13StyleSelector17styleRulesForNodeENS0_7NodePtrE @ 5265 NONAME
- _ZN4QCss13StyleSelector19declarationsForNodeENS0_7NodePtrEPKc @ 5266 NONAME
- _ZN4QCss13StyleSelector20basicSelectorMatchesERKNS_13BasicSelectorENS0_7NodePtrE @ 5267 NONAME
- _ZN4QCss13StyleSelector9matchRuleENS0_7NodePtrERKNS_9StyleRuleENS_16StyleSheetOriginEiP4QMapIjS2_E @ 5268 NONAME
- _ZN4QCss13StyleSelectorD0Ev @ 5269 NONAME
- _ZN4QCss13StyleSelectorD1Ev @ 5270 NONAME
- _ZN4QCss13StyleSelectorD2Ev @ 5271 NONAME
- _ZN4QCss14ValueExtractor10extractBoxEPiS1_S1_ @ 5272 NONAME
- _ZN4QCss14ValueExtractor10sizeValuesERKNS_11DeclarationEP5QSize @ 5273 NONAME
- _ZN4QCss14ValueExtractor11borderValueERKNS_11DeclarationEPiPNS_11BorderStyleEP6QBrush @ 5274 NONAME
- _ZN4QCss14ValueExtractor11extractFontEP5QFontPi @ 5275 NONAME
- _ZN4QCss14ValueExtractor11extractFontEv @ 5276 NONAME
- _ZN4QCss14ValueExtractor11lengthValueERKNS_11DeclarationE @ 5277 NONAME
- _ZN4QCss14ValueExtractor11lengthValueERKNS_5ValueE @ 5278 NONAME
- _ZN4QCss14ValueExtractor12extractImageEP5QIconP6QFlagsIN2Qt13AlignmentFlagEEP5QSize @ 5279 NONAME
- _ZN4QCss14ValueExtractor12lengthValuesERKNS_11DeclarationEPi @ 5280 NONAME
- _ZN4QCss14ValueExtractor13extractBorderEPiP6QBrushPNS_11BorderStyleEP5QSize @ 5281 NONAME
- _ZN4QCss14ValueExtractor14extractOutlineEPiP6QBrushPNS_11BorderStyleEP5QSizeS1_ @ 5282 NONAME
- _ZN4QCss14ValueExtractor14extractPaletteEP6QBrushS2_S2_S2_ @ 5283 NONAME
- _ZN4QCss14ValueExtractor15extractGeometryEPiS1_S1_S1_S1_S1_ @ 5284 NONAME
- _ZN4QCss14ValueExtractor15extractPositionEPiS1_S1_S1_PNS_6OriginEP6QFlagsIN2Qt13AlignmentFlagEEPNS_12PositionModeES8_ @ 5285 NONAME
- _ZN4QCss14ValueExtractor17extractBackgroundEP6QBrushP7QStringPNS_6RepeatEP6QFlagsIN2Qt13AlignmentFlagEEPNS_6OriginEPNS_10AttachmentESD_ @ 5286 NONAME
- _ZN4QCss14ValueExtractor20extractStyleFeaturesEv @ 5287 NONAME
- _ZN4QCss14ValueExtractor9sizeValueERKNS_11DeclarationE @ 5288 NONAME
- _ZN4QCss14ValueExtractorC1ERK7QVectorINS_11DeclarationEERK8QPalette @ 5289 NONAME
- _ZN4QCss14ValueExtractorC2ERK7QVectorINS_11DeclarationEERK8QPalette @ 5290 NONAME
- _ZN4QCss6Parser10lexemUntilENS_9TokenTypeE @ 5291 NONAME
- _ZN4QCss6Parser10parseClassEP7QString @ 5292 NONAME
- _ZN4QCss6Parser10parseMediaEPNS_9MediaRuleE @ 5293 NONAME
- _ZN4QCss6Parser11errorSymbolEv @ 5294 NONAME
- _ZN4QCss6Parser11parseAttribEPNS_17AttributeSelectorE @ 5295 NONAME
- _ZN4QCss6Parser11parseImportEPNS_10ImportRuleE @ 5296 NONAME
- _ZN4QCss6Parser11parseMediumEP11QStringList @ 5297 NONAME
- _ZN4QCss6Parser11parsePseudoEPNS_6PseudoE @ 5298 NONAME
- _ZN4QCss6Parser12parseRulesetEPNS_9StyleRuleE @ 5299 NONAME
- _ZN4QCss6Parser13parseFunctionEP7QStringS2_ @ 5300 NONAME
- _ZN4QCss6Parser13parseHexColorEP6QColor @ 5301 NONAME
- _ZN4QCss6Parser13parsePropertyEPNS_11DeclarationE @ 5302 NONAME
- _ZN4QCss6Parser13parseSelectorEPNS_8SelectorE @ 5303 NONAME
- _ZN4QCss6Parser15parseCombinatorEPNS_13BasicSelector8RelationE @ 5304 NONAME
- _ZN4QCss6Parser15parsePseudoPageEP7QString @ 5305 NONAME
- _ZN4QCss6Parser15testAndParseUriEP7QString @ 5306 NONAME
- _ZN4QCss6Parser16parseElementNameEP7QString @ 5307 NONAME
- _ZN4QCss6Parser17parseNextOperatorEPNS_5ValueE @ 5308 NONAME
- _ZN4QCss6Parser18testSimpleSelectorEv @ 5309 NONAME
- _ZN4QCss6Parser19parseSimpleSelectorEPNS_13BasicSelectorE @ 5310 NONAME
- _ZN4QCss6Parser20parseNextDeclarationEPNS_11DeclarationE @ 5311 NONAME
- _ZN4QCss6Parser20testTokenAndEndsWithENS_9TokenTypeERK13QLatin1String @ 5312 NONAME
- _ZN4QCss6Parser4initERK7QStringb @ 5313 NONAME
- _ZN4QCss6Parser4nextENS_9TokenTypeE @ 5314 NONAME
- _ZN4QCss6Parser4testENS_9TokenTypeE @ 5315 NONAME
- _ZN4QCss6Parser5parseEPNS_10StyleSheetEN2Qt15CaseSensitivityE @ 5316 NONAME
- _ZN4QCss6Parser5untilENS_9TokenTypeES1_ @ 5317 NONAME
- _ZN4QCss6Parser8testPrioEv @ 5318 NONAME
- _ZN4QCss6Parser8testTermEv @ 5319 NONAME
- _ZN4QCss6Parser9parseExprEP7QVectorINS_5ValueEE @ 5320 NONAME
- _ZN4QCss6Parser9parsePageEPNS_8PageRuleE @ 5321 NONAME
- _ZN4QCss6Parser9parsePrioEPNS_11DeclarationE @ 5322 NONAME
- _ZN4QCss6Parser9parseTermEPNS_5ValueE @ 5323 NONAME
- _ZN4QCss6ParserC1ERK7QStringb @ 5324 NONAME
- _ZN4QCss6ParserC1Ev @ 5325 NONAME
- _ZN4QCss6ParserC2ERK7QStringb @ 5326 NONAME
- _ZN4QCss6ParserC2Ev @ 5327 NONAME
- _ZN4QCss7Scanner10preprocessERK7QStringPb @ 5328 NONAME
- _ZN4QCss7Scanner4scanERK7QStringP7QVectorINS_6SymbolEE @ 5329 NONAME
- _ZN4QCss7Scanner9tokenNameENS_9TokenTypeE @ 5330 NONAME ABSENT
- _ZN4QPen10isDetachedEv @ 5331 NONAME
- _ZN4QPen11setCapStyleEN2Qt11PenCapStyleE @ 5332 NONAME
- _ZN4QPen11setCosmeticEb @ 5333 NONAME
- _ZN4QPen12setJoinStyleEN2Qt12PenJoinStyleE @ 5334 NONAME
- _ZN4QPen13setDashOffsetEf @ 5335 NONAME
- _ZN4QPen13setMiterLimitEf @ 5336 NONAME
- _ZN4QPen14setDashPatternERK7QVectorIfE @ 5337 NONAME
- _ZN4QPen6detachEv @ 5338 NONAME
- _ZN4QPen8setBrushERK6QBrush @ 5339 NONAME
- _ZN4QPen8setColorERK6QColor @ 5340 NONAME
- _ZN4QPen8setStyleEN2Qt8PenStyleE @ 5341 NONAME
- _ZN4QPen8setWidthEi @ 5342 NONAME
- _ZN4QPen9setWidthFEf @ 5343 NONAME
- _ZN4QPenC1EN2Qt8PenStyleE @ 5344 NONAME
- _ZN4QPenC1ERK6QBrushfN2Qt8PenStyleENS3_11PenCapStyleENS3_12PenJoinStyleE @ 5345 NONAME
- _ZN4QPenC1ERK6QColor @ 5346 NONAME
- _ZN4QPenC1ERKS_ @ 5347 NONAME
- _ZN4QPenC1Ev @ 5348 NONAME
- _ZN4QPenC2EN2Qt8PenStyleE @ 5349 NONAME
- _ZN4QPenC2ERK6QBrushfN2Qt8PenStyleENS3_11PenCapStyleENS3_12PenJoinStyleE @ 5350 NONAME
- _ZN4QPenC2ERK6QColor @ 5351 NONAME
- _ZN4QPenC2ERKS_ @ 5352 NONAME
- _ZN4QPenC2Ev @ 5353 NONAME
- _ZN4QPenD1Ev @ 5354 NONAME
- _ZN4QPenD2Ev @ 5355 NONAME
- _ZN4QPenaSERKS_ @ 5356 NONAME
- _ZN5QDial10paintEventEP11QPaintEvent @ 5357 NONAME
- _ZN5QDial11qt_metacallEN11QMetaObject4CallEiPPv @ 5358 NONAME
- _ZN5QDial11qt_metacastEPKc @ 5359 NONAME
- _ZN5QDial11resizeEventEP12QResizeEvent @ 5360 NONAME
- _ZN5QDial11setWrappingEb @ 5361 NONAME
- _ZN5QDial12sliderChangeEN15QAbstractSlider12SliderChangeE @ 5362 NONAME
- _ZN5QDial14mouseMoveEventEP11QMouseEvent @ 5363 NONAME
- _ZN5QDial14setNotchTargetEd @ 5364 NONAME
- _ZN5QDial15mousePressEventEP11QMouseEvent @ 5365 NONAME
- _ZN5QDial16staticMetaObjectE @ 5366 NONAME DATA 16
- _ZN5QDial17mouseReleaseEventEP11QMouseEvent @ 5367 NONAME
- _ZN5QDial17setNotchesVisibleEb @ 5368 NONAME
- _ZN5QDial5eventEP6QEvent @ 5369 NONAME
- _ZN5QDialC1EP7QWidget @ 5370 NONAME
- _ZN5QDialC2EP7QWidget @ 5371 NONAME
- _ZN5QDialD0Ev @ 5372 NONAME
- _ZN5QDialD1Ev @ 5373 NONAME
- _ZN5QDialD2Ev @ 5374 NONAME
- _ZN5QDrag10setHotSpotERK6QPoint @ 5375 NONAME
- _ZN5QDrag11qt_metacallEN11QMetaObject4CallEiPPv @ 5376 NONAME
- _ZN5QDrag11qt_metacastEPKc @ 5377 NONAME
- _ZN5QDrag11setMimeDataEP9QMimeData @ 5378 NONAME
- _ZN5QDrag13actionChangedEN2Qt10DropActionE @ 5379 NONAME
- _ZN5QDrag13setDragCursorERK7QPixmapN2Qt10DropActionE @ 5380 NONAME
- _ZN5QDrag13targetChangedEP7QWidget @ 5381 NONAME
- _ZN5QDrag16staticMetaObjectE @ 5382 NONAME DATA 16
- _ZN5QDrag4execE6QFlagsIN2Qt10DropActionEE @ 5383 NONAME
- _ZN5QDrag4execE6QFlagsIN2Qt10DropActionEES2_ @ 5384 NONAME
- _ZN5QDrag5startE6QFlagsIN2Qt10DropActionEE @ 5385 NONAME
- _ZN5QDrag9setPixmapERK7QPixmap @ 5386 NONAME
- _ZN5QDragC1EP7QWidget @ 5387 NONAME
- _ZN5QDragC2EP7QWidget @ 5388 NONAME
- _ZN5QDragD0Ev @ 5389 NONAME
- _ZN5QDragD1Ev @ 5390 NONAME
- _ZN5QDragD2Ev @ 5391 NONAME
- _ZN5QFont10fromStringERK7QString @ 5392 NONAME
- _ZN5QFont10setKerningEb @ 5393 NONAME
- _ZN5QFont10setRawModeEb @ 5394 NONAME
- _ZN5QFont10setStretchEi @ 5395 NONAME
- _ZN5QFont10substituteERK7QString @ 5396 NONAME
- _ZN5QFont11setOverlineEb @ 5397 NONAME
- _ZN5QFont11substitutesERK7QString @ 5398 NONAME
- _ZN5QFont12setPixelSizeEi @ 5399 NONAME
- _ZN5QFont12setPointSizeEi @ 5400 NONAME
- _ZN5QFont12setStrikeOutEb @ 5401 NONAME
- _ZN5QFont12setStyleHintENS_9StyleHintENS_13StyleStrategyE @ 5402 NONAME
- _ZN5QFont12setUnderlineEb @ 5403 NONAME
- _ZN5QFont13setFixedPitchEb @ 5404 NONAME
- _ZN5QFont13setPointSizeFEf @ 5405 NONAME
- _ZN5QFont13substitutionsEv @ 5406 NONAME
- _ZN5QFont14setWordSpacingEf @ 5407 NONAME
- _ZN5QFont15cacheStatisticsEv @ 5408 NONAME
- _ZN5QFont16setLetterSpacingENS_11SpacingTypeEf @ 5409 NONAME
- _ZN5QFont16setStyleStrategyENS_13StyleStrategyE @ 5410 NONAME
- _ZN5QFont16staticMetaObjectE @ 5411 NONAME DATA 16
- _ZN5QFont17setCapitalizationENS_14CapitalizationE @ 5412 NONAME
- _ZN5QFont18insertSubstitutionERK7QStringS2_ @ 5413 NONAME
- _ZN5QFont18removeSubstitutionERK7QString @ 5414 NONAME
- _ZN5QFont19insertSubstitutionsERK7QStringRK11QStringList @ 5415 NONAME
- _ZN5QFont6detachEv @ 5416 NONAME
- _ZN5QFont8setStyleENS_5StyleE @ 5417 NONAME
- _ZN5QFont9setFamilyERK7QString @ 5418 NONAME
- _ZN5QFont9setWeightEi @ 5419 NONAME
- _ZN5QFontC1EP12QFontPrivate @ 5420 NONAME
- _ZN5QFontC1ERK7QStringiib @ 5421 NONAME
- _ZN5QFontC1ERKS_ @ 5422 NONAME
- _ZN5QFontC1ERKS_P12QPaintDevice @ 5423 NONAME
- _ZN5QFontC1Ev @ 5424 NONAME
- _ZN5QFontC2EP12QFontPrivate @ 5425 NONAME
- _ZN5QFontC2ERK7QStringiib @ 5426 NONAME
- _ZN5QFontC2ERKS_ @ 5427 NONAME
- _ZN5QFontC2ERKS_P12QPaintDevice @ 5428 NONAME
- _ZN5QFontC2Ev @ 5429 NONAME
- _ZN5QFontD1Ev @ 5430 NONAME
- _ZN5QFontD2Ev @ 5431 NONAME
- _ZN5QFontaSERKS_ @ 5432 NONAME
- _ZN5QIcon6detachEv @ 5433 NONAME
- _ZN5QIcon7addFileERK7QStringRK5QSizeNS_4ModeENS_5StateE @ 5434 NONAME
- _ZN5QIcon9addPixmapERK7QPixmapNS_4ModeENS_5StateE @ 5435 NONAME
- _ZN5QIconC1EP11QIconEngine @ 5436 NONAME
- _ZN5QIconC1EP13QIconEngineV2 @ 5437 NONAME
- _ZN5QIconC1ERK7QPixmap @ 5438 NONAME
- _ZN5QIconC1ERK7QString @ 5439 NONAME
- _ZN5QIconC1ERKS_ @ 5440 NONAME
- _ZN5QIconC1Ev @ 5441 NONAME
- _ZN5QIconC2EP11QIconEngine @ 5442 NONAME
- _ZN5QIconC2EP13QIconEngineV2 @ 5443 NONAME
- _ZN5QIconC2ERK7QPixmap @ 5444 NONAME
- _ZN5QIconC2ERK7QString @ 5445 NONAME
- _ZN5QIconC2ERKS_ @ 5446 NONAME
- _ZN5QIconC2Ev @ 5447 NONAME
- _ZN5QIconD1Ev @ 5448 NONAME
- _ZN5QIconD2Ev @ 5449 NONAME
- _ZN5QIconaSERKS_ @ 5450 NONAME
- _ZN5QMenu10enterEventEP6QEvent @ 5451 NONAME
- _ZN5QMenu10insertMenuEP7QActionPS_ @ 5452 NONAME
- _ZN5QMenu10leaveEventEP6QEvent @ 5453 NONAME
- _ZN5QMenu10paintEventEP11QPaintEvent @ 5454 NONAME
- _ZN5QMenu10timerEventEP11QTimerEvent @ 5455 NONAME
- _ZN5QMenu10wheelEventEP11QWheelEvent @ 5456 NONAME
- _ZN5QMenu11aboutToHideEv @ 5457 NONAME
- _ZN5QMenu11aboutToShowEv @ 5458 NONAME
- _ZN5QMenu11actionEventEP12QActionEvent @ 5459 NONAME
- _ZN5QMenu11changeEventEP6QEvent @ 5460 NONAME
- _ZN5QMenu11qt_metacallEN11QMetaObject4CallEiPPv @ 5461 NONAME
- _ZN5QMenu11qt_metacastEPKc @ 5462 NONAME
- _ZN5QMenu12addSeparatorEv @ 5463 NONAME
- _ZN5QMenu13keyPressEventEP9QKeyEvent @ 5464 NONAME
- _ZN5QMenu14mouseMoveEventEP11QMouseEvent @ 5465 NONAME
- _ZN5QMenu14setNoReplayForEP7QWidget @ 5466 NONAME
- _ZN5QMenu15hideTearOffMenuEv @ 5467 NONAME
- _ZN5QMenu15insertSeparatorEP7QAction @ 5468 NONAME
- _ZN5QMenu15mousePressEventEP11QMouseEvent @ 5469 NONAME
- _ZN5QMenu15setActiveActionEP7QAction @ 5470 NONAME
- _ZN5QMenu16setDefaultActionEP7QAction @ 5471 NONAME
- _ZN5QMenu16staticMetaObjectE @ 5472 NONAME DATA 16
- _ZN5QMenu17mouseReleaseEventEP11QMouseEvent @ 5473 NONAME
- _ZN5QMenu17setTearOffEnabledEb @ 5474 NONAME
- _ZN5QMenu18focusNextPrevChildEb @ 5475 NONAME
- _ZN5QMenu20internalDelayedPopupEv @ 5476 NONAME
- _ZN5QMenu23internalSetSloppyActionEv @ 5477 NONAME
- _ZN5QMenu24setSeparatorsCollapsibleEb @ 5478 NONAME
- _ZN5QMenu4execE5QListIP7QActionERK6QPointS2_ @ 5479 NONAME
- _ZN5QMenu4execE5QListIP7QActionERK6QPointS2_P7QWidget @ 5480 NONAME
- _ZN5QMenu4execERK6QPointP7QAction @ 5481 NONAME
- _ZN5QMenu4execEv @ 5482 NONAME
- _ZN5QMenu5clearEv @ 5483 NONAME
- _ZN5QMenu5eventEP6QEvent @ 5484 NONAME
- _ZN5QMenu5popupERK6QPointP7QAction @ 5485 NONAME
- _ZN5QMenu7addMenuEPS_ @ 5486 NONAME
- _ZN5QMenu7addMenuERK5QIconRK7QString @ 5487 NONAME
- _ZN5QMenu7addMenuERK7QString @ 5488 NONAME
- _ZN5QMenu7hoveredEP7QAction @ 5489 NONAME
- _ZN5QMenu7setIconERK5QIcon @ 5490 NONAME
- _ZN5QMenu8setTitleERK7QString @ 5491 NONAME
- _ZN5QMenu9addActionERK5QIconRK7QString @ 5492 NONAME
- _ZN5QMenu9addActionERK5QIconRK7QStringPK7QObjectPKcRK12QKeySequence @ 5493 NONAME
- _ZN5QMenu9addActionERK7QString @ 5494 NONAME
- _ZN5QMenu9addActionERK7QStringPK7QObjectPKcRK12QKeySequence @ 5495 NONAME
- _ZN5QMenu9hideEventEP10QHideEvent @ 5496 NONAME
- _ZN5QMenu9triggeredEP7QAction @ 5497 NONAME
- _ZN5QMenuC1EP7QWidget @ 5498 NONAME
- _ZN5QMenuC1ER12QMenuPrivateP7QWidget @ 5499 NONAME
- _ZN5QMenuC1ERK7QStringP7QWidget @ 5500 NONAME
- _ZN5QMenuC2EP7QWidget @ 5501 NONAME
- _ZN5QMenuC2ER12QMenuPrivateP7QWidget @ 5502 NONAME
- _ZN5QMenuC2ERK7QStringP7QWidget @ 5503 NONAME
- _ZN5QMenuD0Ev @ 5504 NONAME
- _ZN5QMenuD1Ev @ 5505 NONAME
- _ZN5QMenuD2Ev @ 5506 NONAME
- _ZN6QBrush10setTextureERK7QPixmap @ 5507 NONAME
- _ZN6QBrush12setTransformERK10QTransform @ 5508 NONAME
- _ZN6QBrush15setTextureImageERK6QImage @ 5509 NONAME
- _ZN6QBrush4initERK6QColorN2Qt10BrushStyleE @ 5510 NONAME
- _ZN6QBrush6detachEN2Qt10BrushStyleE @ 5511 NONAME
- _ZN6QBrush7cleanUpEP10QBrushData @ 5512 NONAME
- _ZN6QBrush8setColorERK6QColor @ 5513 NONAME
- _ZN6QBrush8setStyleEN2Qt10BrushStyleE @ 5514 NONAME
- _ZN6QBrush9setMatrixERK7QMatrix @ 5515 NONAME
- _ZN6QBrushC1EN2Qt10BrushStyleE @ 5516 NONAME
- _ZN6QBrushC1EN2Qt11GlobalColorENS0_10BrushStyleE @ 5517 NONAME
- _ZN6QBrushC1EN2Qt11GlobalColorERK7QPixmap @ 5518 NONAME
- _ZN6QBrushC1ERK6QColorN2Qt10BrushStyleE @ 5519 NONAME
- _ZN6QBrushC1ERK6QColorRK7QPixmap @ 5520 NONAME
- _ZN6QBrushC1ERK6QImage @ 5521 NONAME
- _ZN6QBrushC1ERK7QPixmap @ 5522 NONAME
- _ZN6QBrushC1ERK9QGradient @ 5523 NONAME
- _ZN6QBrushC1ERKS_ @ 5524 NONAME
- _ZN6QBrushC1Ev @ 5525 NONAME
- _ZN6QBrushC2EN2Qt10BrushStyleE @ 5526 NONAME
- _ZN6QBrushC2EN2Qt11GlobalColorENS0_10BrushStyleE @ 5527 NONAME
- _ZN6QBrushC2EN2Qt11GlobalColorERK7QPixmap @ 5528 NONAME
- _ZN6QBrushC2ERK6QColorN2Qt10BrushStyleE @ 5529 NONAME
- _ZN6QBrushC2ERK6QColorRK7QPixmap @ 5530 NONAME
- _ZN6QBrushC2ERK6QImage @ 5531 NONAME
- _ZN6QBrushC2ERK7QPixmap @ 5532 NONAME
- _ZN6QBrushC2ERK9QGradient @ 5533 NONAME
- _ZN6QBrushC2ERKS_ @ 5534 NONAME
- _ZN6QBrushC2Ev @ 5535 NONAME
- _ZN6QBrushD1Ev @ 5536 NONAME
- _ZN6QBrushD2Ev @ 5537 NONAME
- _ZN6QBrushaSERKS_ @ 5538 NONAME
- _ZN6QColor10colorNamesEv @ 5539 NONAME
- _ZN6QColor10invalidateEv @ 5540 NONAME
- _ZN6QColor13setNamedColorERK7QString @ 5541 NONAME
- _ZN6QColor6setHsvEiiii @ 5542 NONAME
- _ZN6QColor6setRedEi @ 5543 NONAME
- _ZN6QColor6setRgbEiiii @ 5544 NONAME
- _ZN6QColor6setRgbEj @ 5545 NONAME
- _ZN6QColor7fromHsvEiiii @ 5546 NONAME
- _ZN6QColor7fromRgbEiiii @ 5547 NONAME
- _ZN6QColor7fromRgbEj @ 5548 NONAME
- _ZN6QColor7getCmykEPiS0_S0_S0_S0_ @ 5549 NONAME
- _ZN6QColor7setBlueEi @ 5550 NONAME
- _ZN6QColor7setCmykEiiiii @ 5551 NONAME
- _ZN6QColor7setHsvFEffff @ 5552 NONAME
- _ZN6QColor7setRedFEf @ 5553 NONAME
- _ZN6QColor7setRgbFEffff @ 5554 NONAME
- _ZN6QColor7setRgbaEj @ 5555 NONAME
- _ZN6QColor8fromCmykEiiiii @ 5556 NONAME
- _ZN6QColor8fromHsvFEffff @ 5557 NONAME
- _ZN6QColor8fromRgbFEffff @ 5558 NONAME
- _ZN6QColor8fromRgbaEj @ 5559 NONAME
- _ZN6QColor8getCmykFEPfS0_S0_S0_S0_ @ 5560 NONAME
- _ZN6QColor8setAlphaEi @ 5561 NONAME
- _ZN6QColor8setBlueFEf @ 5562 NONAME
- _ZN6QColor8setCmykFEfffff @ 5563 NONAME
- _ZN6QColor8setGreenEi @ 5564 NONAME
- _ZN6QColor9fromCmykFEfffff @ 5565 NONAME
- _ZN6QColor9setAlphaFEf @ 5566 NONAME
- _ZN6QColor9setGreenFEf @ 5567 NONAME
- _ZN6QColorC1EN2Qt11GlobalColorE @ 5568 NONAME
- _ZN6QColorC1ENS_4SpecE @ 5569 NONAME
- _ZN6QColorC1Ej @ 5570 NONAME
- _ZN6QColorC2EN2Qt11GlobalColorE @ 5571 NONAME
- _ZN6QColorC2ENS_4SpecE @ 5572 NONAME
- _ZN6QColorC2Ej @ 5573 NONAME
- _ZN6QColoraSEN2Qt11GlobalColorE @ 5574 NONAME
- _ZN6QColoraSERKS_ @ 5575 NONAME
- _ZN6QFrame10paintEventEP11QPaintEvent @ 5576 NONAME
- _ZN6QFrame11changeEventEP6QEvent @ 5577 NONAME
- _ZN6QFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 5578 NONAME
- _ZN6QFrame11qt_metacastEPKc @ 5579 NONAME
- _ZN6QFrame12setFrameRectERK5QRect @ 5580 NONAME
- _ZN6QFrame12setLineWidthEi @ 5581 NONAME
- _ZN6QFrame13setFrameShapeENS_5ShapeE @ 5582 NONAME
- _ZN6QFrame13setFrameStyleEi @ 5583 NONAME
- _ZN6QFrame14setFrameShadowENS_6ShadowE @ 5584 NONAME
- _ZN6QFrame15setMidLineWidthEi @ 5585 NONAME
- _ZN6QFrame16staticMetaObjectE @ 5586 NONAME DATA 16
- _ZN6QFrame5eventEP6QEvent @ 5587 NONAME
- _ZN6QFrame9drawFrameEP8QPainter @ 5588 NONAME
- _ZN6QFrameC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5589 NONAME
- _ZN6QFrameC1ER13QFramePrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5590 NONAME
- _ZN6QFrameC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5591 NONAME
- _ZN6QFrameC2ER13QFramePrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5592 NONAME
- _ZN6QFrameD0Ev @ 5593 NONAME
- _ZN6QFrameD1Ev @ 5594 NONAME
- _ZN6QFrameD2Ev @ 5595 NONAME
- _ZN6QImage10trueMatrixERK10QTransformii @ 5596 NONAME
- _ZN6QImage10trueMatrixERK7QMatrixii @ 5597 NONAME
- _ZN6QImage12invertPixelsENS_10InvertModeE @ 5598 NONAME
- _ZN6QImage12loadFromDataEPKhiPKc @ 5599 NONAME
- _ZN6QImage12setNumColorsEi @ 5600 NONAME
- _ZN6QImage13setColorTableE7QVectorIjE @ 5601 NONAME
- _ZN6QImage15setAlphaChannelERKS_ @ 5602 NONAME
- _ZN6QImage16setDotsPerMeterXEi @ 5603 NONAME
- _ZN6QImage16setDotsPerMeterYEi @ 5604 NONAME
- _ZN6QImage4bitsEv @ 5605 NONAME
- _ZN6QImage4fillEj @ 5606 NONAME
- _ZN6QImage4loadEP9QIODevicePKc @ 5607 NONAME
- _ZN6QImage4loadERK7QStringPKc @ 5608 NONAME
- _ZN6QImage6detachEv @ 5609 NONAME
- _ZN6QImage7setTextEPKcS1_RK7QString @ 5610 NONAME
- _ZN6QImage7setTextERK7QStringS2_ @ 5611 NONAME
- _ZN6QImage8fromDataEPKhiPKc @ 5612 NONAME
- _ZN6QImage8scanLineEi @ 5613 NONAME
- _ZN6QImage8setColorEij @ 5614 NONAME
- _ZN6QImage8setPixelEiij @ 5615 NONAME
- _ZN6QImage9setOffsetERK6QPoint @ 5616 NONAME
- _ZN6QImageC1EPKPKc @ 5617 NONAME
- _ZN6QImageC1EPKcS1_ @ 5618 NONAME
- _ZN6QImageC1EPKhiiNS_6FormatE @ 5619 NONAME
- _ZN6QImageC1EPKhiiiNS_6FormatE @ 5620 NONAME
- _ZN6QImageC1EPhiiNS_6FormatE @ 5621 NONAME
- _ZN6QImageC1EPhiiiNS_6FormatE @ 5622 NONAME
- _ZN6QImageC1ERK5QSizeNS_6FormatE @ 5623 NONAME
- _ZN6QImageC1ERK7QStringPKc @ 5624 NONAME
- _ZN6QImageC1ERKS_ @ 5625 NONAME
- _ZN6QImageC1EiiNS_6FormatE @ 5626 NONAME
- _ZN6QImageC1Ev @ 5627 NONAME
- _ZN6QImageC2EPKPKc @ 5628 NONAME
- _ZN6QImageC2EPKcS1_ @ 5629 NONAME
- _ZN6QImageC2EPKhiiNS_6FormatE @ 5630 NONAME
- _ZN6QImageC2EPKhiiiNS_6FormatE @ 5631 NONAME
- _ZN6QImageC2EPhiiNS_6FormatE @ 5632 NONAME
- _ZN6QImageC2EPhiiiNS_6FormatE @ 5633 NONAME
- _ZN6QImageC2ERK5QSizeNS_6FormatE @ 5634 NONAME
- _ZN6QImageC2ERK7QStringPKc @ 5635 NONAME
- _ZN6QImageC2ERKS_ @ 5636 NONAME
- _ZN6QImageC2EiiNS_6FormatE @ 5637 NONAME
- _ZN6QImageC2Ev @ 5638 NONAME
- _ZN6QImageD0Ev @ 5639 NONAME
- _ZN6QImageD1Ev @ 5640 NONAME
- _ZN6QImageD2Ev @ 5641 NONAME
- _ZN6QImageaSERKS_ @ 5642 NONAME
- _ZN6QLabel10paintEventEP11QPaintEvent @ 5643 NONAME
- _ZN6QLabel10setPictureERK8QPicture @ 5644 NONAME
- _ZN6QLabel11changeEventEP6QEvent @ 5645 NONAME
- _ZN6QLabel11linkHoveredERK7QString @ 5646 NONAME
- _ZN6QLabel11qt_metacallEN11QMetaObject4CallEiPPv @ 5647 NONAME
- _ZN6QLabel11qt_metacastEPKc @ 5648 NONAME
- _ZN6QLabel11setWordWrapEb @ 5649 NONAME
- _ZN6QLabel12focusInEventEP11QFocusEvent @ 5650 NONAME
- _ZN6QLabel12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 5651 NONAME
- _ZN6QLabel13focusOutEventEP11QFocusEvent @ 5652 NONAME
- _ZN6QLabel13keyPressEventEP9QKeyEvent @ 5653 NONAME
- _ZN6QLabel13linkActivatedERK7QString @ 5654 NONAME
- _ZN6QLabel13setTextFormatEN2Qt10TextFormatE @ 5655 NONAME
- _ZN6QLabel14mouseMoveEventEP11QMouseEvent @ 5656 NONAME
- _ZN6QLabel15mousePressEventEP11QMouseEvent @ 5657 NONAME
- _ZN6QLabel16contextMenuEventEP17QContextMenuEvent @ 5658 NONAME
- _ZN6QLabel16staticMetaObjectE @ 5659 NONAME DATA 16
- _ZN6QLabel17mouseReleaseEventEP11QMouseEvent @ 5660 NONAME
- _ZN6QLabel17setScaledContentsEb @ 5661 NONAME
- _ZN6QLabel18focusNextPrevChildEb @ 5662 NONAME
- _ZN6QLabel20setOpenExternalLinksEb @ 5663 NONAME
- _ZN6QLabel23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 5664 NONAME
- _ZN6QLabel5clearEv @ 5665 NONAME
- _ZN6QLabel5eventEP6QEvent @ 5666 NONAME
- _ZN6QLabel6setNumEd @ 5667 NONAME
- _ZN6QLabel6setNumEi @ 5668 NONAME
- _ZN6QLabel7setTextERK7QString @ 5669 NONAME
- _ZN6QLabel8setBuddyEP7QWidget @ 5670 NONAME
- _ZN6QLabel8setMovieEP6QMovie @ 5671 NONAME
- _ZN6QLabel9setIndentEi @ 5672 NONAME
- _ZN6QLabel9setMarginEi @ 5673 NONAME
- _ZN6QLabel9setPixmapERK7QPixmap @ 5674 NONAME
- _ZN6QLabelC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5675 NONAME
- _ZN6QLabelC1ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5676 NONAME
- _ZN6QLabelC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5677 NONAME
- _ZN6QLabelC2ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5678 NONAME
- _ZN6QLabelD0Ev @ 5679 NONAME
- _ZN6QLabelD1Ev @ 5680 NONAME
- _ZN6QLabelD2Ev @ 5681 NONAME
- _ZN6QMovie10scaledSizeEv @ 5682 NONAME
- _ZN6QMovie11jumpToFrameEi @ 5683 NONAME
- _ZN6QMovie11qt_metacallEN11QMetaObject4CallEiPPv @ 5684 NONAME
- _ZN6QMovie11qt_metacastEPKc @ 5685 NONAME
- _ZN6QMovie11setFileNameERK7QString @ 5686 NONAME
- _ZN6QMovie12frameChangedEi @ 5687 NONAME
- _ZN6QMovie12setCacheModeENS_9CacheModeE @ 5688 NONAME
- _ZN6QMovie12stateChangedENS_10MovieStateE @ 5689 NONAME
- _ZN6QMovie13setScaledSizeERK5QSize @ 5690 NONAME
- _ZN6QMovie15jumpToNextFrameEv @ 5691 NONAME
- _ZN6QMovie16staticMetaObjectE @ 5692 NONAME DATA 16
- _ZN6QMovie16supportedFormatsEv @ 5693 NONAME
- _ZN6QMovie18setBackgroundColorERK6QColor @ 5694 NONAME
- _ZN6QMovie4stopEv @ 5695 NONAME
- _ZN6QMovie5errorEN12QImageReader16ImageReaderErrorE @ 5696 NONAME
- _ZN6QMovie5startEv @ 5697 NONAME
- _ZN6QMovie7resizedERK5QSize @ 5698 NONAME
- _ZN6QMovie7startedEv @ 5699 NONAME
- _ZN6QMovie7updatedERK5QRect @ 5700 NONAME
- _ZN6QMovie8finishedEv @ 5701 NONAME
- _ZN6QMovie8setSpeedEi @ 5702 NONAME
- _ZN6QMovie9cacheModeEv @ 5703 NONAME
- _ZN6QMovie9setDeviceEP9QIODevice @ 5704 NONAME
- _ZN6QMovie9setFormatERK10QByteArray @ 5705 NONAME
- _ZN6QMovie9setPausedEb @ 5706 NONAME
- _ZN6QMovieC1EP7QObject @ 5707 NONAME
- _ZN6QMovieC1EP9QIODeviceRK10QByteArrayP7QObject @ 5708 NONAME
- _ZN6QMovieC1ERK7QStringRK10QByteArrayP7QObject @ 5709 NONAME
- _ZN6QMovieC2EP7QObject @ 5710 NONAME
- _ZN6QMovieC2EP9QIODeviceRK10QByteArrayP7QObject @ 5711 NONAME
- _ZN6QMovieC2ERK7QStringRK10QByteArrayP7QObject @ 5712 NONAME
- _ZN6QMovieD0Ev @ 5713 NONAME
- _ZN6QMovieD1Ev @ 5714 NONAME
- _ZN6QMovieD2Ev @ 5715 NONAME
- _ZN6QSound11isAvailableEv @ 5716 NONAME
- _ZN6QSound11qt_metacallEN11QMetaObject4CallEiPPv @ 5717 NONAME
- _ZN6QSound11qt_metacastEPKc @ 5718 NONAME
- _ZN6QSound16staticMetaObjectE @ 5719 NONAME DATA 16
- _ZN6QSound4playERK7QString @ 5720 NONAME
- _ZN6QSound4playEv @ 5721 NONAME
- _ZN6QSound4stopEv @ 5722 NONAME
- _ZN6QSound8setLoopsEi @ 5723 NONAME
- _ZN6QSoundC1ERK7QStringP7QObject @ 5724 NONAME
- _ZN6QSoundC2ERK7QStringP7QObject @ 5725 NONAME
- _ZN6QSoundD0Ev @ 5726 NONAME
- _ZN6QSoundD1Ev @ 5727 NONAME
- _ZN6QSoundD2Ev @ 5728 NONAME
- _ZN6QStyle10visualRectEN2Qt15LayoutDirectionERK5QRectS4_ @ 5729 NONAME
- _ZN6QStyle11alignedRectEN2Qt15LayoutDirectionE6QFlagsINS0_13AlignmentFlagEERK5QSizeRK5QRect @ 5730 NONAME
- _ZN6QStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 5731 NONAME
- _ZN6QStyle11qt_metacastEPKc @ 5732 NONAME
- _ZN6QStyle15visualAlignmentEN2Qt15LayoutDirectionE6QFlagsINS0_13AlignmentFlagEE @ 5733 NONAME
- _ZN6QStyle16staticMetaObjectE @ 5734 NONAME DATA 16
- _ZN6QStyle23sliderPositionFromValueEiiiib @ 5735 NONAME
- _ZN6QStyle23sliderValueFromPositionEiiiib @ 5736 NONAME
- _ZN6QStyle6polishEP12QApplication @ 5737 NONAME
- _ZN6QStyle6polishEP7QWidget @ 5738 NONAME
- _ZN6QStyle6polishER8QPalette @ 5739 NONAME
- _ZN6QStyle8unpolishEP12QApplication @ 5740 NONAME
- _ZN6QStyle8unpolishEP7QWidget @ 5741 NONAME
- _ZN6QStyle9visualPosEN2Qt15LayoutDirectionERK5QRectRK6QPoint @ 5742 NONAME
- _ZN6QStyleC2ER13QStylePrivate @ 5743 NONAME
- _ZN6QStyleC2Ev @ 5744 NONAME
- _ZN6QStyleD0Ev @ 5745 NONAME
- _ZN6QStyleD1Ev @ 5746 NONAME
- _ZN6QStyleD2Ev @ 5747 NONAME
- _ZN7QAction10setCheckedEb @ 5748 NONAME
- _ZN7QAction10setEnabledEb @ 5749 NONAME
- _ZN7QAction10setToolTipERK7QString @ 5750 NONAME
- _ZN7QAction10setVisibleEb @ 5751 NONAME
- _ZN7QAction11qt_metacallEN11QMetaObject4CallEiPPv @ 5752 NONAME
- _ZN7QAction11qt_metacastEPKc @ 5753 NONAME
- _ZN7QAction11setIconTextERK7QString @ 5754 NONAME
- _ZN7QAction11setMenuRoleENS_8MenuRoleE @ 5755 NONAME
- _ZN7QAction11setShortcutERK12QKeySequence @ 5756 NONAME
- _ZN7QAction12setCheckableEb @ 5757 NONAME
- _ZN7QAction12setSeparatorEb @ 5758 NONAME
- _ZN7QAction12setShortcutsEN12QKeySequence11StandardKeyE @ 5759 NONAME
- _ZN7QAction12setShortcutsERK5QListI12QKeySequenceE @ 5760 NONAME
- _ZN7QAction12setStatusTipERK7QString @ 5761 NONAME
- _ZN7QAction12setWhatsThisERK7QString @ 5762 NONAME
- _ZN7QAction13setAutoRepeatEb @ 5763 NONAME
- _ZN7QAction14setActionGroupEP12QActionGroup @ 5764 NONAME
- _ZN7QAction14setSoftKeyRoleENS_11SoftKeyRoleE @ 5765 NONAME
- _ZN7QAction14showStatusTextEP7QWidget @ 5766 NONAME
- _ZN7QAction16staticMetaObjectE @ 5767 NONAME DATA 16
- _ZN7QAction18setShortcutContextEN2Qt15ShortcutContextE @ 5768 NONAME
- _ZN7QAction20setIconVisibleInMenuEb @ 5769 NONAME
- _ZN7QAction5eventEP6QEvent @ 5770 NONAME
- _ZN7QAction6toggleEv @ 5771 NONAME
- _ZN7QAction7changedEv @ 5772 NONAME
- _ZN7QAction7hoveredEv @ 5773 NONAME
- _ZN7QAction7setDataERK8QVariant @ 5774 NONAME
- _ZN7QAction7setFontERK5QFont @ 5775 NONAME
- _ZN7QAction7setIconERK5QIcon @ 5776 NONAME
- _ZN7QAction7setMenuEP5QMenu @ 5777 NONAME
- _ZN7QAction7setTextERK7QString @ 5778 NONAME
- _ZN7QAction7toggledEb @ 5779 NONAME
- _ZN7QAction8activateENS_11ActionEventE @ 5780 NONAME
- _ZN7QAction9triggeredEb @ 5781 NONAME
- _ZN7QActionC1EP7QObject @ 5782 NONAME
- _ZN7QActionC1ER14QActionPrivateP7QObject @ 5783 NONAME
- _ZN7QActionC1ERK5QIconRK7QStringP7QObject @ 5784 NONAME
- _ZN7QActionC1ERK7QStringP7QObject @ 5785 NONAME
- _ZN7QActionC2EP7QObject @ 5786 NONAME
- _ZN7QActionC2ER14QActionPrivateP7QObject @ 5787 NONAME
- _ZN7QActionC2ERK5QIconRK7QStringP7QObject @ 5788 NONAME
- _ZN7QActionC2ERK7QStringP7QObject @ 5789 NONAME
- _ZN7QActionD0Ev @ 5790 NONAME
- _ZN7QActionD1Ev @ 5791 NONAME
- _ZN7QActionD2Ev @ 5792 NONAME
- _ZN7QBezier10fromPointsERK7QPointFS2_S2_S2_ @ 5793 NONAME
- _ZN7QBezier17findIntersectionsERKS_S1_ @ 5794 NONAME
- _ZN7QBezier17findIntersectionsERKS_S1_P7QVectorI5QPairIffEE @ 5795 NONAME
- _ZN7QBezier20splitAtIntersectionsERS_ @ 5796 NONAME
- _ZN7QBitmap8fromDataERK5QSizePKhN6QImage6FormatE @ 5797 NONAME
- _ZN7QBitmap9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 5798 NONAME
- _ZN7QBitmapC1ERK5QSize @ 5799 NONAME
- _ZN7QBitmapC1ERK7QPixmap @ 5800 NONAME
- _ZN7QBitmapC1ERK7QStringPKc @ 5801 NONAME
- _ZN7QBitmapC1Eii @ 5802 NONAME
- _ZN7QBitmapC1Ev @ 5803 NONAME
- _ZN7QBitmapC2ERK5QSize @ 5804 NONAME
- _ZN7QBitmapC2ERK7QPixmap @ 5805 NONAME
- _ZN7QBitmapC2ERK7QStringPKc @ 5806 NONAME
- _ZN7QBitmapC2Eii @ 5807 NONAME
- _ZN7QBitmapC2Ev @ 5808 NONAME
- _ZN7QBitmapD0Ev @ 5809 NONAME
- _ZN7QBitmapD1Ev @ 5810 NONAME
- _ZN7QBitmapD2Ev @ 5811 NONAME
- _ZN7QBitmapaSERK7QPixmap @ 5812 NONAME
- _ZN7QCursor3posEv @ 5813 NONAME
- _ZN7QCursor6setPosEii @ 5814 NONAME
- _ZN7QDialog10closeEventEP11QCloseEvent @ 5815 NONAME
- _ZN7QDialog10setVisibleEb @ 5816 NONAME
- _ZN7QDialog11eventFilterEP7QObjectP6QEvent @ 5817 NONAME
- _ZN7QDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 5818 NONAME
- _ZN7QDialog11qt_metacastEPKc @ 5819 NONAME
- _ZN7QDialog11resizeEventEP12QResizeEvent @ 5820 NONAME
- _ZN7QDialog12setExtensionEP7QWidget @ 5821 NONAME
- _ZN7QDialog13keyPressEventEP9QKeyEvent @ 5822 NONAME
- _ZN7QDialog13showExtensionEb @ 5823 NONAME
- _ZN7QDialog14adjustPositionEP7QWidget @ 5824 NONAME
- _ZN7QDialog14setOrientationEN2Qt11OrientationE @ 5825 NONAME
- _ZN7QDialog16contextMenuEventEP17QContextMenuEvent @ 5826 NONAME
- _ZN7QDialog16staticMetaObjectE @ 5827 NONAME DATA 16
- _ZN7QDialog18setSizeGripEnabledEb @ 5828 NONAME
- _ZN7QDialog4doneEi @ 5829 NONAME
- _ZN7QDialog4execEv @ 5830 NONAME
- _ZN7QDialog4openEv @ 5831 NONAME
- _ZN7QDialog6acceptEv @ 5832 NONAME
- _ZN7QDialog6rejectEv @ 5833 NONAME
- _ZN7QDialog8acceptedEv @ 5834 NONAME
- _ZN7QDialog8finishedEi @ 5835 NONAME
- _ZN7QDialog8rejectedEv @ 5836 NONAME
- _ZN7QDialog8setModalEb @ 5837 NONAME
- _ZN7QDialog9setResultEi @ 5838 NONAME
- _ZN7QDialog9showEventEP10QShowEvent @ 5839 NONAME
- _ZN7QDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5840 NONAME
- _ZN7QDialogC1ER14QDialogPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5841 NONAME
- _ZN7QDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5842 NONAME
- _ZN7QDialogC2ER14QDialogPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5843 NONAME
- _ZN7QDialogD0Ev @ 5844 NONAME
- _ZN7QDialogD1Ev @ 5845 NONAME
- _ZN7QDialogD2Ev @ 5846 NONAME
- _ZN7QLayout10childEventEP11QChildEvent @ 5847 NONAME
- _ZN7QLayout10invalidateEv @ 5848 NONAME
- _ZN7QLayout10removeItemEP11QLayoutItem @ 5849 NONAME
- _ZN7QLayout10setEnabledEb @ 5850 NONAME
- _ZN7QLayout10setMenuBarEP7QWidget @ 5851 NONAME
- _ZN7QLayout10setSpacingEi @ 5852 NONAME
- _ZN7QLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5853 NONAME
- _ZN7QLayout11qt_metacastEPKc @ 5854 NONAME
- _ZN7QLayout11setGeometryERK5QRect @ 5855 NONAME
- _ZN7QLayout11widgetEventEP6QEvent @ 5856 NONAME
- _ZN7QLayout12removeWidgetEP7QWidget @ 5857 NONAME
- _ZN7QLayout12setAlignmentEP7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 5858 NONAME
- _ZN7QLayout12setAlignmentEPS_6QFlagsIN2Qt13AlignmentFlagEE @ 5859 NONAME
- _ZN7QLayout14addChildLayoutEPS_ @ 5860 NONAME
- _ZN7QLayout14addChildWidgetEP7QWidget @ 5861 NONAME
- _ZN7QLayout16staticMetaObjectE @ 5862 NONAME DATA 16
- _ZN7QLayout17setSizeConstraintENS_14SizeConstraintE @ 5863 NONAME
- _ZN7QLayout18setContentsMarginsEiiii @ 5864 NONAME
- _ZN7QLayout21closestAcceptableSizeEPK7QWidgetRK5QSize @ 5865 NONAME
- _ZN7QLayout23activateRecursiveHelperEP11QLayoutItem @ 5866 NONAME
- _ZN7QLayout6layoutEv @ 5867 NONAME
- _ZN7QLayout6updateEv @ 5868 NONAME
- _ZN7QLayout8activateEv @ 5869 NONAME
- _ZN7QLayout9addWidgetEP7QWidget @ 5870 NONAME
- _ZN7QLayout9setMarginEi @ 5871 NONAME
- _ZN7QLayoutC2EP7QWidget @ 5872 NONAME
- _ZN7QLayoutC2ER14QLayoutPrivatePS_P7QWidget @ 5873 NONAME
- _ZN7QLayoutC2Ev @ 5874 NONAME
- _ZN7QLayoutD0Ev @ 5875 NONAME
- _ZN7QLayoutD1Ev @ 5876 NONAME
- _ZN7QLayoutD2Ev @ 5877 NONAME
- _ZN7QMatrix5resetEv @ 5878 NONAME
- _ZN7QMatrix5scaleEff @ 5879 NONAME
- _ZN7QMatrix5shearEff @ 5880 NONAME
- _ZN7QMatrix6rotateEf @ 5881 NONAME
- _ZN7QMatrix9setMatrixEffffff @ 5882 NONAME
- _ZN7QMatrix9translateEff @ 5883 NONAME
- _ZN7QMatrixC1ERKS_ @ 5884 NONAME
- _ZN7QMatrixC1Effffff @ 5885 NONAME
- _ZN7QMatrixC1Ev @ 5886 NONAME
- _ZN7QMatrixC2ERKS_ @ 5887 NONAME
- _ZN7QMatrixC2Effffff @ 5888 NONAME
- _ZN7QMatrixC2Ev @ 5889 NONAME
- _ZN7QMatrixaSERKS_ @ 5890 NONAME
- _ZN7QMatrixmLERKS_ @ 5891 NONAME
- _ZN7QPixmap10grabWidgetEP7QWidgetRK5QRect @ 5892 NONAME
- _ZN7QPixmap10grabWindowEP11CCoeControliiii @ 5893 NONAME
- _ZN7QPixmap10trueMatrixERK10QTransformii @ 5894 NONAME
- _ZN7QPixmap10trueMatrixERK7QMatrixii @ 5895 NONAME
- _ZN7QPixmap12defaultDepthEv @ 5896 NONAME
- _ZN7QPixmap12loadFromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 5897 NONAME
- _ZN7QPixmap15setAlphaChannelERKS_ @ 5898 NONAME
- _ZN7QPixmap21fromSymbianCFbsBitmapEP10CFbsBitmap @ 5899 NONAME
- _ZN7QPixmap4fillEPK7QWidgetRK6QPoint @ 5900 NONAME
- _ZN7QPixmap4fillERK6QColor @ 5901 NONAME
- _ZN7QPixmap4initEiiNS_4TypeE @ 5902 NONAME
- _ZN7QPixmap4initEiii @ 5903 NONAME
- _ZN7QPixmap4loadERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 5904 NONAME
- _ZN7QPixmap5derefEv @ 5905 NONAME
- _ZN7QPixmap6detachEv @ 5906 NONAME
- _ZN7QPixmap7setMaskERK7QBitmap @ 5907 NONAME
- _ZN7QPixmap9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 5908 NONAME
- _ZN7QPixmapC1EP11QPixmapData @ 5909 NONAME
- _ZN7QPixmapC1EPKPKc @ 5910 NONAME
- _ZN7QPixmapC1ERK5QSize @ 5911 NONAME
- _ZN7QPixmapC1ERK5QSizeNS_4TypeE @ 5912 NONAME
- _ZN7QPixmapC1ERK5QSizei @ 5913 NONAME
- _ZN7QPixmapC1ERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 5914 NONAME
- _ZN7QPixmapC1ERKS_ @ 5915 NONAME
- _ZN7QPixmapC1Eii @ 5916 NONAME
- _ZN7QPixmapC1Ev @ 5917 NONAME
- _ZN7QPixmapC2EP11QPixmapData @ 5918 NONAME
- _ZN7QPixmapC2EPKPKc @ 5919 NONAME
- _ZN7QPixmapC2ERK5QSize @ 5920 NONAME
- _ZN7QPixmapC2ERK5QSizeNS_4TypeE @ 5921 NONAME
- _ZN7QPixmapC2ERK5QSizei @ 5922 NONAME
- _ZN7QPixmapC2ERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 5923 NONAME
- _ZN7QPixmapC2ERKS_ @ 5924 NONAME
- _ZN7QPixmapC2Eii @ 5925 NONAME
- _ZN7QPixmapC2Ev @ 5926 NONAME
- _ZN7QPixmapD0Ev @ 5927 NONAME
- _ZN7QPixmapD1Ev @ 5928 NONAME
- _ZN7QPixmapD2Ev @ 5929 NONAME
- _ZN7QPixmapaSERKS_ @ 5930 NONAME
- _ZN7QRegion12shared_emptyE @ 5931 NONAME DATA 8
- _ZN7QRegion4execERK10QByteArrayiN11QDataStream9ByteOrderE @ 5932 NONAME
- _ZN7QRegion6detachEv @ 5933 NONAME
- _ZN7QRegion7cleanUpEPNS_11QRegionDataE @ 5934 NONAME
- _ZN7QRegion8setRectsEPK5QRecti @ 5935 NONAME
- _ZN7QRegion9translateEii @ 5936 NONAME
- _ZN7QRegionC1ERK5QRectNS_10RegionTypeE @ 5937 NONAME
- _ZN7QRegionC1ERK7QBitmap @ 5938 NONAME
- _ZN7QRegionC1ERK8QPolygonN2Qt8FillRuleE @ 5939 NONAME
- _ZN7QRegionC1ERKS_ @ 5940 NONAME
- _ZN7QRegionC1EiiiiNS_10RegionTypeE @ 5941 NONAME
- _ZN7QRegionC1Ev @ 5942 NONAME
- _ZN7QRegionC2ERK5QRectNS_10RegionTypeE @ 5943 NONAME
- _ZN7QRegionC2ERK7QBitmap @ 5944 NONAME
- _ZN7QRegionC2ERK8QPolygonN2Qt8FillRuleE @ 5945 NONAME
- _ZN7QRegionC2ERKS_ @ 5946 NONAME
- _ZN7QRegionC2EiiiiNS_10RegionTypeE @ 5947 NONAME
- _ZN7QRegionC2Ev @ 5948 NONAME
- _ZN7QRegionD1Ev @ 5949 NONAME
- _ZN7QRegionD2Ev @ 5950 NONAME
- _ZN7QRegionaNERK5QRect @ 5951 NONAME
- _ZN7QRegionaNERKS_ @ 5952 NONAME
- _ZN7QRegionaSERKS_ @ 5953 NONAME
- _ZN7QRegioneOERKS_ @ 5954 NONAME
- _ZN7QRegionmIERKS_ @ 5955 NONAME
- _ZN7QRegionoRERKS_ @ 5956 NONAME
- _ZN7QRegionpLERK5QRect @ 5957 NONAME
- _ZN7QRegionpLERKS_ @ 5958 NONAME
- _ZN7QSlider10paintEventEP11QPaintEvent @ 5959 NONAME
- _ZN7QSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 5960 NONAME
- _ZN7QSlider11qt_metacastEPKc @ 5961 NONAME
- _ZN7QSlider14mouseMoveEventEP11QMouseEvent @ 5962 NONAME
- _ZN7QSlider15mousePressEventEP11QMouseEvent @ 5963 NONAME
- _ZN7QSlider15setTickIntervalEi @ 5964 NONAME
- _ZN7QSlider15setTickPositionENS_12TickPositionE @ 5965 NONAME
- _ZN7QSlider16staticMetaObjectE @ 5966 NONAME DATA 16
- _ZN7QSlider17mouseReleaseEventEP11QMouseEvent @ 5967 NONAME
- _ZN7QSlider5eventEP6QEvent @ 5968 NONAME
- _ZN7QSliderC1EN2Qt11OrientationEP7QWidget @ 5969 NONAME
- _ZN7QSliderC1EP7QWidget @ 5970 NONAME
- _ZN7QSliderC2EN2Qt11OrientationEP7QWidget @ 5971 NONAME
- _ZN7QSliderC2EP7QWidget @ 5972 NONAME
- _ZN7QSliderD0Ev @ 5973 NONAME
- _ZN7QSliderD1Ev @ 5974 NONAME
- _ZN7QSliderD2Ev @ 5975 NONAME
- _ZN7QTabBar10paintEventEP11QPaintEvent @ 5976 NONAME
- _ZN7QTabBar10setMovableEb @ 5977 NONAME
- _ZN7QTabBar10setTabDataEiRK8QVariant @ 5978 NONAME
- _ZN7QTabBar10setTabIconEiRK5QIcon @ 5979 NONAME
- _ZN7QTabBar10setTabTextEiRK7QString @ 5980 NONAME
- _ZN7QTabBar10tabRemovedEi @ 5981 NONAME
- _ZN7QTabBar10wheelEventEP11QWheelEvent @ 5982 NONAME
- _ZN7QTabBar11changeEventEP6QEvent @ 5983 NONAME
- _ZN7QTabBar11qt_metacallEN11QMetaObject4CallEiPPv @ 5984 NONAME
- _ZN7QTabBar11qt_metacastEPKc @ 5985 NONAME
- _ZN7QTabBar11resizeEventEP12QResizeEvent @ 5986 NONAME
- _ZN7QTabBar11setDrawBaseEb @ 5987 NONAME
- _ZN7QTabBar11setIconSizeERK5QSize @ 5988 NONAME
- _ZN7QTabBar11tabInsertedEi @ 5989 NONAME
- _ZN7QTabBar12setElideModeEN2Qt13TextElideModeE @ 5990 NONAME
- _ZN7QTabBar12setExpandingEb @ 5991 NONAME
- _ZN7QTabBar12setTabButtonEiNS_14ButtonPositionEP7QWidget @ 5992 NONAME
- _ZN7QTabBar13keyPressEventEP9QKeyEvent @ 5993 NONAME
- _ZN7QTabBar13setTabEnabledEib @ 5994 NONAME
- _ZN7QTabBar13setTabToolTipEiRK7QString @ 5995 NONAME
- _ZN7QTabBar14currentChangedEi @ 5996 NONAME
- _ZN7QTabBar14mouseMoveEventEP11QMouseEvent @ 5997 NONAME
- _ZN7QTabBar15mousePressEventEP11QMouseEvent @ 5998 NONAME
- _ZN7QTabBar15setCurrentIndexEi @ 5999 NONAME
- _ZN7QTabBar15setDocumentModeEb @ 6000 NONAME
- _ZN7QTabBar15setTabTextColorEiRK6QColor @ 6001 NONAME
- _ZN7QTabBar15setTabWhatsThisEiRK7QString @ 6002 NONAME
- _ZN7QTabBar15setTabsClosableEb @ 6003 NONAME
- _ZN7QTabBar15tabLayoutChangeEv @ 6004 NONAME
- _ZN7QTabBar16staticMetaObjectE @ 6005 NONAME DATA 16
- _ZN7QTabBar17mouseReleaseEventEP11QMouseEvent @ 6006 NONAME
- _ZN7QTabBar17tabCloseRequestedEi @ 6007 NONAME
- _ZN7QTabBar20setUsesScrollButtonsEb @ 6008 NONAME
- _ZN7QTabBar28setSelectionBehaviorOnRemoveENS_17SelectionBehaviorE @ 6009 NONAME
- _ZN7QTabBar5eventEP6QEvent @ 6010 NONAME
- _ZN7QTabBar6addTabERK5QIconRK7QString @ 6011 NONAME
- _ZN7QTabBar6addTabERK7QString @ 6012 NONAME
- _ZN7QTabBar7moveTabEii @ 6013 NONAME
- _ZN7QTabBar8setShapeENS_5ShapeE @ 6014 NONAME
- _ZN7QTabBar8tabMovedEii @ 6015 NONAME
- _ZN7QTabBar9hideEventEP10QHideEvent @ 6016 NONAME
- _ZN7QTabBar9insertTabEiRK5QIconRK7QString @ 6017 NONAME
- _ZN7QTabBar9insertTabEiRK7QString @ 6018 NONAME
- _ZN7QTabBar9removeTabEi @ 6019 NONAME
- _ZN7QTabBar9showEventEP10QShowEvent @ 6020 NONAME
- _ZN7QTabBarC1EP7QWidget @ 6021 NONAME
- _ZN7QTabBarC2EP7QWidget @ 6022 NONAME
- _ZN7QTabBarD0Ev @ 6023 NONAME
- _ZN7QTabBarD1Ev @ 6024 NONAME
- _ZN7QTabBarD2Ev @ 6025 NONAME
- _ZN7QWidget10addActionsE5QListIP7QActionE @ 6026 NONAME
- _ZN7QWidget10adjustSizeEv @ 6027 NONAME
- _ZN7QWidget10clearFocusEv @ 6028 NONAME
- _ZN7QWidget10closeEventEP11QCloseEvent @ 6029 NONAME
- _ZN7QWidget10enterEventEP6QEvent @ 6030 NONAME
- _ZN7QWidget10fontChangeERK5QFont @ 6031 NONAME
- _ZN7QWidget10leaveEventEP6QEvent @ 6032 NONAME
- _ZN7QWidget10paintEventEP11QPaintEvent @ 6033 NONAME
- _ZN7QWidget10setEnabledEb @ 6034 NONAME
- _ZN7QWidget10setPaletteERK8QPalette @ 6035 NONAME
- _ZN7QWidget10setSoftKeyEP7QAction @ 6036 NONAME ABSENT
- _ZN7QWidget10setToolTipERK7QString @ 6037 NONAME
- _ZN7QWidget10setVisibleEb @ 6038 NONAME
- _ZN7QWidget10showNormalEv @ 6039 NONAME
- _ZN7QWidget10stackUnderEPS_ @ 6040 NONAME
- _ZN7QWidget10takeLayoutEv @ 6041 NONAME
- _ZN7QWidget10wheelEventEP11QWheelEvent @ 6042 NONAME
- _ZN7QWidget11actionEventEP12QActionEvent @ 6043 NONAME
- _ZN7QWidget11changeEventEP6QEvent @ 6044 NONAME
- _ZN7QWidget11createWinIdEv @ 6045 NONAME
- _ZN7QWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 6046 NONAME
- _ZN7QWidget11qt_metacastEPKc @ 6047 NONAME
- _ZN7QWidget11resizeEventEP12QResizeEvent @ 6048 NONAME
- _ZN7QWidget11setBaseSizeEii @ 6049 NONAME
- _ZN7QWidget11setDisabledEb @ 6050 NONAME
- _ZN7QWidget11setGeometryERK5QRect @ 6051 NONAME
- _ZN7QWidget11setSoftKeysERK5QListIP7QActionE @ 6052 NONAME ABSENT
- _ZN7QWidget11setTabOrderEPS_S0_ @ 6053 NONAME
- _ZN7QWidget11styleChangeER6QStyle @ 6054 NONAME
- _ZN7QWidget11tabletEventEP12QTabletEvent @ 6055 NONAME
- _ZN7QWidget11unsetLocaleEv @ 6056 NONAME
- _ZN7QWidget12focusInEventEP11QFocusEvent @ 6057 NONAME
- _ZN7QWidget12grabKeyboardEv @ 6058 NONAME
- _ZN7QWidget12grabShortcutERK12QKeySequenceN2Qt15ShortcutContextE @ 6059 NONAME
- _ZN7QWidget12inputContextEv @ 6060 NONAME
- _ZN7QWidget12insertActionEP7QActionS1_ @ 6061 NONAME
- _ZN7QWidget12mouseGrabberEv @ 6062 NONAME
- _ZN7QWidget12releaseMouseEv @ 6063 NONAME
- _ZN7QWidget12removeActionEP7QAction @ 6064 NONAME
- _ZN7QWidget12setAttributeEN2Qt15WidgetAttributeEb @ 6065 NONAME
- _ZN7QWidget12setEditFocusEb @ 6066 NONAME
- _ZN7QWidget12setFixedSizeERK5QSize @ 6067 NONAME
- _ZN7QWidget12setFixedSizeEii @ 6068 NONAME
- _ZN7QWidget12setStatusTipERK7QString @ 6069 NONAME
- _ZN7QWidget12setWhatsThisERK7QString @ 6070 NONAME
- _ZN7QWidget13dragMoveEventEP14QDragMoveEvent @ 6071 NONAME
- _ZN7QWidget13enabledChangeEb @ 6072 NONAME
- _ZN7QWidget13focusOutEventEP11QFocusEvent @ 6073 NONAME
- _ZN7QWidget13insertActionsEP7QAction5QListIS1_E @ 6074 NONAME
- _ZN7QWidget13keyPressEventEP9QKeyEvent @ 6075 NONAME
- _ZN7QWidget13paletteChangeERK8QPalette @ 6076 NONAME
- _ZN7QWidget13setFixedWidthEi @ 6077 NONAME
- _ZN7QWidget13setFocusProxyEPS_ @ 6078 NONAME
- _ZN7QWidget13setSizePolicyE11QSizePolicy @ 6079 NONAME
- _ZN7QWidget13setStyleSheetERK7QString @ 6080 NONAME
- _ZN7QWidget13setWindowIconERK5QIcon @ 6081 NONAME
- _ZN7QWidget13setWindowRoleERK7QString @ 6082 NONAME
- _ZN7QWidget13showMaximizedEv @ 6083 NONAME
- _ZN7QWidget13showMinimizedEv @ 6084 NONAME
- _ZN7QWidget14activateWindowEv @ 6085 NONAME
- _ZN7QWidget14dragEnterEventEP15QDragEnterEvent @ 6086 NONAME
- _ZN7QWidget14dragLeaveEventEP15QDragLeaveEvent @ 6087 NONAME
- _ZN7QWidget14languageChangeEv @ 6088 NONAME
- _ZN7QWidget14mouseMoveEventEP11QMouseEvent @ 6089 NONAME
- _ZN7QWidget14setAcceptDropsEb @ 6090 NONAME
- _ZN7QWidget14setFixedHeightEi @ 6091 NONAME
- _ZN7QWidget14setFocusPolicyEN2Qt11FocusPolicyE @ 6092 NONAME
- _ZN7QWidget14setMaximumSizeEii @ 6093 NONAME
- _ZN7QWidget14setMinimumSizeEii @ 6094 NONAME
- _ZN7QWidget14setWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 6095 NONAME
- _ZN7QWidget14setWindowStateE6QFlagsIN2Qt11WindowStateEE @ 6096 NONAME
- _ZN7QWidget14setWindowTitleERK7QString @ 6097 NONAME
- _ZN7QWidget14showFullScreenEv @ 6098 NONAME
- _ZN7QWidget14updateGeometryEv @ 6099 NONAME
- _ZN7QWidget15keyReleaseEventEP9QKeyEvent @ 6100 NONAME
- _ZN7QWidget15keyboardGrabberEv @ 6101 NONAME
- _ZN7QWidget15mousePressEventEP11QMouseEvent @ 6102 NONAME
- _ZN7QWidget15releaseKeyboardEv @ 6103 NONAME
- _ZN7QWidget15releaseShortcutEi @ 6104 NONAME
- _ZN7QWidget15restoreGeometryERK10QByteArray @ 6105 NONAME
- _ZN7QWidget15setInputContextEP13QInputContext @ 6106 NONAME
- _ZN7QWidget15setMaximumWidthEi @ 6107 NONAME
- _ZN7QWidget15setMinimumWidthEi @ 6108 NONAME
- _ZN7QWidget16contextMenuEventEP17QContextMenuEvent @ 6109 NONAME
- _ZN7QWidget16inputMethodEventEP17QInputMethodEvent @ 6110 NONAME
- _ZN7QWidget16setMaximumHeightEi @ 6111 NONAME
- _ZN7QWidget16setMinimumHeightEi @ 6112 NONAME
- _ZN7QWidget16setSizeIncrementEii @ 6113 NONAME
- _ZN7QWidget16setWindowOpacityEf @ 6114 NONAME
- _ZN7QWidget16setWindowSurfaceEP14QWindowSurface @ 6115 NONAME
- _ZN7QWidget16staticMetaObjectE @ 6116 NONAME DATA 16
- _ZN7QWidget16updateMicroFocusEv @ 6117 NONAME
- _ZN7QWidget17mouseReleaseEventEP11QMouseEvent @ 6118 NONAME
- _ZN7QWidget17resetInputContextEv @ 6119 NONAME
- _ZN7QWidget17setBackgroundRoleEN8QPalette9ColorRoleE @ 6120 NONAME
- _ZN7QWidget17setForegroundRoleEN8QPalette9ColorRoleE @ 6121 NONAME
- _ZN7QWidget17setUpdatesEnabledEb @ 6122 NONAME
- _ZN7QWidget17setWindowFilePathERK7QString @ 6123 NONAME
- _ZN7QWidget17setWindowIconTextERK7QString @ 6124 NONAME
- _ZN7QWidget17setWindowModalityEN2Qt14WindowModalityE @ 6125 NONAME
- _ZN7QWidget17setWindowModifiedEb @ 6126 NONAME
- _ZN7QWidget18focusNextPrevChildEb @ 6127 NONAME
- _ZN7QWidget18setContentsMarginsEiiii @ 6128 NONAME
- _ZN7QWidget18setLayoutDirectionEN2Qt15LayoutDirectionE @ 6129 NONAME
- _ZN7QWidget18setShortcutEnabledEib @ 6130 NONAME
- _ZN7QWidget19overrideWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 6131 NONAME
- _ZN7QWidget19overrideWindowStateE6QFlagsIN2Qt11WindowStateEE @ 6132 NONAME
- _ZN7QWidget19setInputMethodHintsE6QFlagsIN2Qt15InputMethodHintEE @ 6133 NONAME
- _ZN7QWidget20setContextMenuPolicyEN2Qt17ContextMenuPolicyE @ 6134 NONAME
- _ZN7QWidget20unsetLayoutDirectionEv @ 6135 NONAME
- _ZN7QWidget21mouseDoubleClickEventEP11QMouseEvent @ 6136 NONAME
- _ZN7QWidget21setAutoFillBackgroundEb @ 6137 NONAME
- _ZN7QWidget21setShortcutAutoRepeatEib @ 6138 NONAME
- _ZN7QWidget22windowActivationChangeEb @ 6139 NONAME
- _ZN7QWidget26customContextMenuRequestedERK6QPoint @ 6140 NONAME
- _ZN7QWidget4findEP11CCoeControl @ 6141 NONAME
- _ZN7QWidget4moveERK6QPoint @ 6142 NONAME
- _ZN7QWidget5closeEv @ 6143 NONAME
- _ZN7QWidget5eventEP6QEvent @ 6144 NONAME
- _ZN7QWidget5lowerEv @ 6145 NONAME
- _ZN7QWidget5raiseEv @ 6146 NONAME
- _ZN7QWidget6createEP11CCoeControlbb @ 6147 NONAME
- _ZN7QWidget6renderEP12QPaintDeviceRK6QPointRK7QRegion6QFlagsINS_10RenderFlagEE @ 6148 NONAME
- _ZN7QWidget6renderEP8QPainterRK6QPointRK7QRegion6QFlagsINS_10RenderFlagEE @ 6149 NONAME
- _ZN7QWidget6resizeERK5QSize @ 6150 NONAME
- _ZN7QWidget6scrollEii @ 6151 NONAME
- _ZN7QWidget6scrollEiiRK5QRect @ 6152 NONAME
- _ZN7QWidget6updateERK5QRect @ 6153 NONAME
- _ZN7QWidget6updateERK7QRegion @ 6154 NONAME
- _ZN7QWidget6updateEv @ 6155 NONAME
- _ZN7QWidget7destroyEbb @ 6156 NONAME
- _ZN7QWidget7repaintERK5QRect @ 6157 NONAME
- _ZN7QWidget7repaintERK7QRegion @ 6158 NONAME
- _ZN7QWidget7repaintEiiii @ 6159 NONAME
- _ZN7QWidget7repaintEv @ 6160 NONAME
- _ZN7QWidget7setFontERK5QFont @ 6161 NONAME
- _ZN7QWidget7setMaskERK7QBitmap @ 6162 NONAME
- _ZN7QWidget7setMaskERK7QRegion @ 6163 NONAME
- _ZN7QWidget8setFocusEN2Qt11FocusReasonE @ 6164 NONAME
- _ZN7QWidget8setStyleEP6QStyle @ 6165 NONAME
- _ZN7QWidget9addActionEP7QAction @ 6166 NONAME
- _ZN7QWidget9clearMaskEv @ 6167 NONAME
- _ZN7QWidget9dropEventEP10QDropEvent @ 6168 NONAME
- _ZN7QWidget9grabMouseEv @ 6169 NONAME
- _ZN7QWidget9hideEventEP10QHideEvent @ 6170 NONAME
- _ZN7QWidget9moveEventEP10QMoveEvent @ 6171 NONAME
- _ZN7QWidget9setLayoutEP7QLayout @ 6172 NONAME
- _ZN7QWidget9setLocaleERK7QLocale @ 6173 NONAME
- _ZN7QWidget9setParentEPS_ @ 6174 NONAME
- _ZN7QWidget9setParentEPS_6QFlagsIN2Qt10WindowTypeEE @ 6175 NONAME
- _ZN7QWidget9showEventEP10QShowEvent @ 6176 NONAME
- _ZN7QWidgetC1EPS_6QFlagsIN2Qt10WindowTypeEE @ 6177 NONAME
- _ZN7QWidgetC1ER14QWidgetPrivatePS_6QFlagsIN2Qt10WindowTypeEE @ 6178 NONAME
- _ZN7QWidgetC2EPS_6QFlagsIN2Qt10WindowTypeEE @ 6179 NONAME
- _ZN7QWidgetC2ER14QWidgetPrivatePS_6QFlagsIN2Qt10WindowTypeEE @ 6180 NONAME
- _ZN7QWidgetD0Ev @ 6181 NONAME
- _ZN7QWidgetD1Ev @ 6182 NONAME
- _ZN7QWidgetD2Ev @ 6183 NONAME
- _ZN7QWizard10paintEventEP11QPaintEvent @ 6184 NONAME
- _ZN7QWizard10removePageEi @ 6185 NONAME
- _ZN7QWizard10setOptionsE6QFlagsINS_12WizardOptionEE @ 6186 NONAME
- _ZN7QWizard10setStartIdEi @ 6187 NONAME
- _ZN7QWizard10setVisibleEb @ 6188 NONAME
- _ZN7QWizard11cleanupPageEi @ 6189 NONAME
- _ZN7QWizard11qt_metacallEN11QMetaObject4CallEiPPv @ 6190 NONAME
- _ZN7QWizard11qt_metacastEPKc @ 6191 NONAME
- _ZN7QWizard11resizeEventEP12QResizeEvent @ 6192 NONAME
- _ZN7QWizard13helpRequestedEv @ 6193 NONAME
- _ZN7QWizard13setButtonTextENS_12WizardButtonERK7QString @ 6194 NONAME
- _ZN7QWizard14initializePageEi @ 6195 NONAME
- _ZN7QWizard14setTitleFormatEN2Qt10TextFormatE @ 6196 NONAME
- _ZN7QWizard14setWizardStyleENS_11WizardStyleE @ 6197 NONAME
- _ZN7QWizard15setButtonLayoutERK5QListINS_12WizardButtonEE @ 6198 NONAME
- _ZN7QWizard16currentIdChangedEi @ 6199 NONAME
- _ZN7QWizard16staticMetaObjectE @ 6200 NONAME DATA 16
- _ZN7QWizard17setSubTitleFormatEN2Qt10TextFormatE @ 6201 NONAME
- _ZN7QWizard18setDefaultPropertyEPKcS1_S1_ @ 6202 NONAME
- _ZN7QWizard19customButtonClickedEi @ 6203 NONAME
- _ZN7QWizard19validateCurrentPageEv @ 6204 NONAME
- _ZN7QWizard4backEv @ 6205 NONAME
- _ZN7QWizard4doneEi @ 6206 NONAME
- _ZN7QWizard4nextEv @ 6207 NONAME
- _ZN7QWizard5eventEP6QEvent @ 6208 NONAME
- _ZN7QWizard7addPageEP11QWizardPage @ 6209 NONAME
- _ZN7QWizard7restartEv @ 6210 NONAME
- _ZN7QWizard7setPageEiP11QWizardPage @ 6211 NONAME
- _ZN7QWizard8setFieldERK7QStringRK8QVariant @ 6212 NONAME
- _ZN7QWizard9setButtonENS_12WizardButtonEP15QAbstractButton @ 6213 NONAME
- _ZN7QWizard9setOptionENS_12WizardOptionEb @ 6214 NONAME
- _ZN7QWizard9setPixmapENS_12WizardPixmapERK7QPixmap @ 6215 NONAME
- _ZN7QWizardC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6216 NONAME
- _ZN7QWizardC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6217 NONAME
- _ZN7QWizardD0Ev @ 6218 NONAME
- _ZN7QWizardD1Ev @ 6219 NONAME
- _ZN7QWizardD2Ev @ 6220 NONAME
- _ZN8QMdiArea10childEventEP11QChildEvent @ 6221 NONAME
- _ZN8QMdiArea10paintEventEP11QPaintEvent @ 6222 NONAME
- _ZN8QMdiArea10timerEventEP11QTimerEvent @ 6223 NONAME
- _ZN8QMdiArea11eventFilterEP7QObjectP6QEvent @ 6224 NONAME
- _ZN8QMdiArea11qt_metacallEN11QMetaObject4CallEiPPv @ 6225 NONAME
- _ZN8QMdiArea11qt_metacastEPKc @ 6226 NONAME
- _ZN8QMdiArea11resizeEventEP12QResizeEvent @ 6227 NONAME
- _ZN8QMdiArea11setTabShapeEN10QTabWidget8TabShapeE @ 6228 NONAME
- _ZN8QMdiArea11setViewModeENS_8ViewModeE @ 6229 NONAME
- _ZN8QMdiArea12addSubWindowEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6230 NONAME
- _ZN8QMdiArea13setBackgroundERK6QBrush @ 6231 NONAME
- _ZN8QMdiArea13setupViewportEP7QWidget @ 6232 NONAME
- _ZN8QMdiArea13viewportEventEP6QEvent @ 6233 NONAME
- _ZN8QMdiArea14setTabPositionEN10QTabWidget11TabPositionE @ 6234 NONAME
- _ZN8QMdiArea14tileSubWindowsEv @ 6235 NONAME
- _ZN8QMdiArea15removeSubWindowEP7QWidget @ 6236 NONAME
- _ZN8QMdiArea15setDocumentModeEb @ 6237 NONAME
- _ZN8QMdiArea16scrollContentsByEii @ 6238 NONAME
- _ZN8QMdiArea16staticMetaObjectE @ 6239 NONAME DATA 16
- _ZN8QMdiArea17cascadeSubWindowsEv @ 6240 NONAME
- _ZN8QMdiArea18closeAllSubWindowsEv @ 6241 NONAME
- _ZN8QMdiArea18setActivationOrderENS_11WindowOrderE @ 6242 NONAME
- _ZN8QMdiArea18setActiveSubWindowEP13QMdiSubWindow @ 6243 NONAME
- _ZN8QMdiArea18subWindowActivatedEP13QMdiSubWindow @ 6244 NONAME
- _ZN8QMdiArea20closeActiveSubWindowEv @ 6245 NONAME
- _ZN8QMdiArea21activateNextSubWindowEv @ 6246 NONAME
- _ZN8QMdiArea25activatePreviousSubWindowEv @ 6247 NONAME
- _ZN8QMdiArea5eventEP6QEvent @ 6248 NONAME
- _ZN8QMdiArea9setOptionENS_10AreaOptionEb @ 6249 NONAME
- _ZN8QMdiArea9showEventEP10QShowEvent @ 6250 NONAME
- _ZN8QMdiAreaC1EP7QWidget @ 6251 NONAME
- _ZN8QMdiAreaC2EP7QWidget @ 6252 NONAME
- _ZN8QMdiAreaD0Ev @ 6253 NONAME
- _ZN8QMdiAreaD1Ev @ 6254 NONAME
- _ZN8QMdiAreaD2Ev @ 6255 NONAME
- _ZN8QMenuBar10insertMenuEP7QActionP5QMenu @ 6256 NONAME
- _ZN8QMenuBar10leaveEventEP6QEvent @ 6257 NONAME
- _ZN8QMenuBar10paintEventEP11QPaintEvent @ 6258 NONAME
- _ZN8QMenuBar10setVisibleEb @ 6259 NONAME
- _ZN8QMenuBar10timerEventEP11QTimerEvent @ 6260 NONAME
- _ZN8QMenuBar11actionEventEP12QActionEvent @ 6261 NONAME
- _ZN8QMenuBar11changeEventEP6QEvent @ 6262 NONAME
- _ZN8QMenuBar11eventFilterEP7QObjectP6QEvent @ 6263 NONAME
- _ZN8QMenuBar11qt_metacallEN11QMetaObject4CallEiPPv @ 6264 NONAME
- _ZN8QMenuBar11qt_metacastEPKc @ 6265 NONAME
- _ZN8QMenuBar11resizeEventEP12QResizeEvent @ 6266 NONAME
- _ZN8QMenuBar12addSeparatorEv @ 6267 NONAME
- _ZN8QMenuBar12focusInEventEP11QFocusEvent @ 6268 NONAME
- _ZN8QMenuBar12setDefaultUpEb @ 6269 NONAME
- _ZN8QMenuBar13focusOutEventEP11QFocusEvent @ 6270 NONAME
- _ZN8QMenuBar13keyPressEventEP9QKeyEvent @ 6271 NONAME
- _ZN8QMenuBar14mouseMoveEventEP11QMouseEvent @ 6272 NONAME
- _ZN8QMenuBar15insertSeparatorEP7QAction @ 6273 NONAME
- _ZN8QMenuBar15mousePressEventEP11QMouseEvent @ 6274 NONAME
- _ZN8QMenuBar15setActiveActionEP7QAction @ 6275 NONAME
- _ZN8QMenuBar15setCornerWidgetEP7QWidgetN2Qt6CornerE @ 6276 NONAME
- _ZN8QMenuBar16staticMetaObjectE @ 6277 NONAME DATA 16
- _ZN8QMenuBar17mouseReleaseEventEP11QMouseEvent @ 6278 NONAME
- _ZN8QMenuBar5clearEv @ 6279 NONAME
- _ZN8QMenuBar5eventEP6QEvent @ 6280 NONAME
- _ZN8QMenuBar7addMenuEP5QMenu @ 6281 NONAME
- _ZN8QMenuBar7addMenuERK5QIconRK7QString @ 6282 NONAME
- _ZN8QMenuBar7addMenuERK7QString @ 6283 NONAME
- _ZN8QMenuBar7hoveredEP7QAction @ 6284 NONAME
- _ZN8QMenuBar9addActionERK7QString @ 6285 NONAME
- _ZN8QMenuBar9addActionERK7QStringPK7QObjectPKc @ 6286 NONAME
- _ZN8QMenuBar9triggeredEP7QAction @ 6287 NONAME
- _ZN8QMenuBarC1EP7QWidget @ 6288 NONAME
- _ZN8QMenuBarC2EP7QWidget @ 6289 NONAME
- _ZN8QMenuBarD0Ev @ 6290 NONAME
- _ZN8QMenuBarD1Ev @ 6291 NONAME
- _ZN8QMenuBarD2Ev @ 6292 NONAME
- _ZN8QPainter10drawPixmapERK6QRectFRK7QPixmapS2_ @ 6293 NONAME
- _ZN8QPainter10drawPixmapERK7QPointFRK7QPixmap @ 6294 NONAME
- _ZN8QPainter10drawPointsEPK6QPointi @ 6295 NONAME
- _ZN8QPainter10drawPointsEPK7QPointFi @ 6296 NONAME
- _ZN8QPainter10redirectedEPK12QPaintDeviceP6QPoint @ 6297 NONAME
- _ZN8QPainter10setOpacityEf @ 6298 NONAME
- _ZN8QPainter10strokePathERK12QPainterPathRK4QPen @ 6299 NONAME
- _ZN8QPainter11drawEllipseERK5QRect @ 6300 NONAME
- _ZN8QPainter11drawEllipseERK6QRectF @ 6301 NONAME
- _ZN8QPainter11drawPictureERK7QPointFRK8QPicture @ 6302 NONAME
- _ZN8QPainter11drawPolygonEPK6QPointiN2Qt8FillRuleE @ 6303 NONAME
- _ZN8QPainter11drawPolygonEPK7QPointFiN2Qt8FillRuleE @ 6304 NONAME
- _ZN8QPainter11resetMatrixEv @ 6305 NONAME
- _ZN8QPainter11setClipPathERK12QPainterPathN2Qt13ClipOperationE @ 6306 NONAME
- _ZN8QPainter11setClipRectERK5QRectN2Qt13ClipOperationE @ 6307 NONAME
- _ZN8QPainter11setClipRectERK6QRectFN2Qt13ClipOperationE @ 6308 NONAME
- _ZN8QPainter11setClippingEb @ 6309 NONAME
- _ZN8QPainter11setViewportERK5QRect @ 6310 NONAME
- _ZN8QPainter12boundingRectERK5QRectiRK7QString @ 6311 NONAME
- _ZN8QPainter12boundingRectERK6QRectFRK7QStringRK11QTextOption @ 6312 NONAME
- _ZN8QPainter12boundingRectERK6QRectFiRK7QString @ 6313 NONAME
- _ZN8QPainter12drawPolylineEPK6QPointi @ 6314 NONAME
- _ZN8QPainter12drawPolylineEPK7QPointFi @ 6315 NONAME
- _ZN8QPainter12drawTextItemERK7QPointFRK9QTextItem @ 6316 NONAME
- _ZN8QPainter12setTransformERK10QTransformb @ 6317 NONAME
- _ZN8QPainter13drawRoundRectERK6QRectFii @ 6318 NONAME
- _ZN8QPainter13setBackgroundERK6QBrush @ 6319 NONAME
- _ZN8QPainter13setClipRegionERK7QRegionN2Qt13ClipOperationE @ 6320 NONAME
- _ZN8QPainter13setRedirectedEPK12QPaintDevicePS0_RK6QPoint @ 6321 NONAME
- _ZN8QPainter13setRenderHintENS_10RenderHintEb @ 6322 NONAME
- _ZN8QPainter14resetTransformEv @ 6323 NONAME
- _ZN8QPainter14setBrushOriginERK7QPointF @ 6324 NONAME
- _ZN8QPainter14setRenderHintsE6QFlagsINS_10RenderHintEEb @ 6325 NONAME
- _ZN8QPainter14setWorldMatrixERK7QMatrixb @ 6326 NONAME
- _ZN8QPainter15drawRoundedRectERK6QRectFffN2Qt8SizeModeE @ 6327 NONAME
- _ZN8QPainter15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 6328 NONAME
- _ZN8QPainter16setMatrixEnabledEb @ 6329 NONAME
- _ZN8QPainter16staticMetaObjectE @ 6330 NONAME DATA 16
- _ZN8QPainter17drawConvexPolygonEPK6QPointi @ 6331 NONAME
- _ZN8QPainter17drawConvexPolygonEPK7QPointFi @ 6332 NONAME
- _ZN8QPainter17restoreRedirectedEPK12QPaintDevice @ 6333 NONAME
- _ZN8QPainter17setBackgroundModeEN2Qt6BGModeE @ 6334 NONAME
- _ZN8QPainter17setWorldTransformERK10QTransformb @ 6335 NONAME
- _ZN8QPainter18setCompositionModeENS_15CompositionModeE @ 6336 NONAME
- _ZN8QPainter18setLayoutDirectionEN2Qt15LayoutDirectionE @ 6337 NONAME
- _ZN8QPainter21setWorldMatrixEnabledEb @ 6338 NONAME
- _ZN8QPainter23setViewTransformEnabledEb @ 6339 NONAME
- _ZN8QPainter3endEv @ 6340 NONAME
- _ZN8QPainter4saveEv @ 6341 NONAME
- _ZN8QPainter5beginEP12QPaintDevice @ 6342 NONAME
- _ZN8QPainter5scaleEff @ 6343 NONAME
- _ZN8QPainter5shearEff @ 6344 NONAME
- _ZN8QPainter6rotateEf @ 6345 NONAME
- _ZN8QPainter6setPenEN2Qt8PenStyleE @ 6346 NONAME
- _ZN8QPainter6setPenERK4QPen @ 6347 NONAME
- _ZN8QPainter6setPenERK6QColor @ 6348 NONAME
- _ZN8QPainter7drawArcERK6QRectFii @ 6349 NONAME
- _ZN8QPainter7drawPieERK6QRectFii @ 6350 NONAME
- _ZN8QPainter7restoreEv @ 6351 NONAME
- _ZN8QPainter7setFontERK5QFont @ 6352 NONAME
- _ZN8QPainter8drawPathERK12QPainterPath @ 6353 NONAME
- _ZN8QPainter8drawTextERK5QRectiRK7QStringPS0_ @ 6354 NONAME
- _ZN8QPainter8drawTextERK6QRectFRK7QStringRK11QTextOption @ 6355 NONAME
- _ZN8QPainter8drawTextERK6QRectFiRK7QStringPS0_ @ 6356 NONAME
- _ZN8QPainter8drawTextERK7QPointFRK7QString @ 6357 NONAME
- _ZN8QPainter8drawTextERK7QPointFRK7QStringii @ 6358 NONAME
- _ZN8QPainter8fillPathERK12QPainterPathRK6QBrush @ 6359 NONAME
- _ZN8QPainter8fillRectERK5QRectRK6QBrush @ 6360 NONAME
- _ZN8QPainter8fillRectERK5QRectRK6QColor @ 6361 NONAME
- _ZN8QPainter8fillRectERK6QRectFRK6QBrush @ 6362 NONAME
- _ZN8QPainter8fillRectERK6QRectFRK6QColor @ 6363 NONAME
- _ZN8QPainter8initFromEPK7QWidget @ 6364 NONAME
- _ZN8QPainter8setBrushEN2Qt10BrushStyleE @ 6365 NONAME
- _ZN8QPainter8setBrushERK6QBrush @ 6366 NONAME
- _ZN8QPainter9drawChordERK6QRectFii @ 6367 NONAME
- _ZN8QPainter9drawImageERK6QRectFRK6QImageS2_6QFlagsIN2Qt19ImageConversionFlagEE @ 6368 NONAME
- _ZN8QPainter9drawImageERK7QPointFRK6QImage @ 6369 NONAME
- _ZN8QPainter9drawLinesEPK5QLinei @ 6370 NONAME
- _ZN8QPainter9drawLinesEPK6QLineFi @ 6371 NONAME
- _ZN8QPainter9drawLinesEPK6QPointi @ 6372 NONAME
- _ZN8QPainter9drawLinesEPK7QPointFi @ 6373 NONAME
- _ZN8QPainter9drawRectsEPK5QRecti @ 6374 NONAME
- _ZN8QPainter9drawRectsEPK6QRectFi @ 6375 NONAME
- _ZN8QPainter9eraseRectERK6QRectF @ 6376 NONAME
- _ZN8QPainter9setMatrixERK7QMatrixb @ 6377 NONAME
- _ZN8QPainter9setWindowERK5QRect @ 6378 NONAME
- _ZN8QPainter9translateERK7QPointF @ 6379 NONAME
- _ZN8QPainterC1EP12QPaintDevice @ 6380 NONAME
- _ZN8QPainterC1Ev @ 6381 NONAME
- _ZN8QPainterC2EP12QPaintDevice @ 6382 NONAME
- _ZN8QPainterC2Ev @ 6383 NONAME
- _ZN8QPainterD1Ev @ 6384 NONAME
- _ZN8QPainterD2Ev @ 6385 NONAME
- _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_ @ 6386 NONAME
- _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ @ 6387 NONAME
- _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ @ 6388 NONAME
- _ZN8QPalette16staticMetaObjectE @ 6389 NONAME DATA 16
- _ZN8QPalette4initEv @ 6390 NONAME
- _ZN8QPalette6detachEv @ 6391 NONAME
- _ZN8QPalette8setBrushENS_10ColorGroupENS_9ColorRoleERK6QBrush @ 6392 NONAME
- _ZN8QPaletteC1EN2Qt11GlobalColorE @ 6393 NONAME
- _ZN8QPaletteC1ERK6QBrushS2_S2_S2_S2_S2_S2_S2_S2_ @ 6394 NONAME
- _ZN8QPaletteC1ERK6QColor @ 6395 NONAME
- _ZN8QPaletteC1ERK6QColorS2_ @ 6396 NONAME
- _ZN8QPaletteC1ERK6QColorS2_S2_S2_S2_S2_S2_ @ 6397 NONAME
- _ZN8QPaletteC1ERKS_ @ 6398 NONAME
- _ZN8QPaletteC1Ev @ 6399 NONAME
- _ZN8QPaletteC2EN2Qt11GlobalColorE @ 6400 NONAME
- _ZN8QPaletteC2ERK6QBrushS2_S2_S2_S2_S2_S2_S2_S2_ @ 6401 NONAME
- _ZN8QPaletteC2ERK6QColor @ 6402 NONAME
- _ZN8QPaletteC2ERK6QColorS2_ @ 6403 NONAME
- _ZN8QPaletteC2ERK6QColorS2_S2_S2_S2_S2_S2_ @ 6404 NONAME
- _ZN8QPaletteC2ERKS_ @ 6405 NONAME
- _ZN8QPaletteC2Ev @ 6406 NONAME
- _ZN8QPaletteD1Ev @ 6407 NONAME
- _ZN8QPaletteD2Ev @ 6408 NONAME
- _ZN8QPaletteaSERKS_ @ 6409 NONAME
- _ZN8QPicture12inputFormatsEv @ 6410 NONAME
- _ZN8QPicture13detach_helperEv @ 6411 NONAME
- _ZN8QPicture13outputFormatsEv @ 6412 NONAME
- _ZN8QPicture13pictureFormatERK7QString @ 6413 NONAME
- _ZN8QPicture15inputFormatListEv @ 6414 NONAME
- _ZN8QPicture15setBoundingRectERK5QRect @ 6415 NONAME
- _ZN8QPicture16outputFormatListEv @ 6416 NONAME
- _ZN8QPicture4execEP8QPainterR11QDataStreami @ 6417 NONAME
- _ZN8QPicture4loadEP9QIODevicePKc @ 6418 NONAME
- _ZN8QPicture4loadERK7QStringPKc @ 6419 NONAME
- _ZN8QPicture4playEP8QPainter @ 6420 NONAME
- _ZN8QPicture4saveEP9QIODevicePKc @ 6421 NONAME
- _ZN8QPicture4saveERK7QStringPKc @ 6422 NONAME
- _ZN8QPicture6detachEv @ 6423 NONAME
- _ZN8QPicture7setDataEPKcj @ 6424 NONAME
- _ZN8QPictureC1ER15QPicturePrivate @ 6425 NONAME
- _ZN8QPictureC1ERKS_ @ 6426 NONAME
- _ZN8QPictureC1Ei @ 6427 NONAME
- _ZN8QPictureC2ER15QPicturePrivate @ 6428 NONAME
- _ZN8QPictureC2ERKS_ @ 6429 NONAME
- _ZN8QPictureC2Ei @ 6430 NONAME
- _ZN8QPictureD0Ev @ 6431 NONAME
- _ZN8QPictureD1Ev @ 6432 NONAME
- _ZN8QPictureD2Ev @ 6433 NONAME
- _ZN8QPictureaSERKS_ @ 6434 NONAME
- _ZN8QPolygon9putPointsEiiPKi @ 6435 NONAME
- _ZN8QPolygon9putPointsEiiRKS_i @ 6436 NONAME
- _ZN8QPolygon9putPointsEiiiiz @ 6437 NONAME
- _ZN8QPolygon9setPointsEiPKi @ 6438 NONAME
- _ZN8QPolygon9setPointsEiiiz @ 6439 NONAME
- _ZN8QPolygon9translateEii @ 6440 NONAME
- _ZN8QPolygonC1ERK5QRectb @ 6441 NONAME
- _ZN8QPolygonC1EiPKi @ 6442 NONAME
- _ZN8QPolygonC2ERK5QRectb @ 6443 NONAME
- _ZN8QPolygonC2EiPKi @ 6444 NONAME
- _ZN8QSidebar11qt_metacallEN11QMetaObject4CallEiPPv @ 6445 NONAME
- _ZN8QSidebar11qt_metacastEPKc @ 6446 NONAME
- _ZN8QSidebar11removeEntryEv @ 6447 NONAME
- _ZN8QSidebar12focusInEventEP11QFocusEvent @ 6448 NONAME
- _ZN8QSidebar14dragEnterEventEP15QDragEnterEvent @ 6449 NONAME
- _ZN8QSidebar15showContextMenuERK6QPoint @ 6450 NONAME
- _ZN8QSidebar16staticMetaObjectE @ 6451 NONAME DATA 16
- _ZN8QSidebar4initEP16QFileSystemModelRK5QListI4QUrlE @ 6452 NONAME
- _ZN8QSidebar5eventEP6QEvent @ 6453 NONAME
- _ZN8QSidebar7clickedERK11QModelIndex @ 6454 NONAME
- _ZN8QSidebar7goToUrlERK4QUrl @ 6455 NONAME
- _ZN8QSidebar9selectUrlERK4QUrl @ 6456 NONAME
- _ZN8QSidebarC1EP7QWidget @ 6457 NONAME
- _ZN8QSidebarC2EP7QWidget @ 6458 NONAME
- _ZN8QSidebarD0Ev @ 6459 NONAME
- _ZN8QSidebarD1Ev @ 6460 NONAME
- _ZN8QSidebarD2Ev @ 6461 NONAME
- _ZN8QSpinBox10setMaximumEi @ 6462 NONAME
- _ZN8QSpinBox10setMinimumEi @ 6463 NONAME
- _ZN8QSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6464 NONAME
- _ZN8QSpinBox11qt_metacastEPKc @ 6465 NONAME
- _ZN8QSpinBox12valueChangedERK7QString @ 6466 NONAME
- _ZN8QSpinBox12valueChangedEi @ 6467 NONAME
- _ZN8QSpinBox13setSingleStepEi @ 6468 NONAME
- _ZN8QSpinBox16staticMetaObjectE @ 6469 NONAME DATA 16
- _ZN8QSpinBox5eventEP6QEvent @ 6470 NONAME
- _ZN8QSpinBox8setRangeEii @ 6471 NONAME
- _ZN8QSpinBox8setValueEi @ 6472 NONAME
- _ZN8QSpinBox9setPrefixERK7QString @ 6473 NONAME
- _ZN8QSpinBox9setSuffixERK7QString @ 6474 NONAME
- _ZN8QSpinBoxC1EP7QWidget @ 6475 NONAME
- _ZN8QSpinBoxC2EP7QWidget @ 6476 NONAME
- _ZN8QStroker10joinPointsEffRK6QLineFNS_12LineJoinModeE @ 6477 NONAME
- _ZN8QStroker14capForJoinModeENS_12LineJoinModeE @ 6478 NONAME
- _ZN8QStroker14joinModeForCapEN2Qt11PenCapStyleE @ 6479 NONAME
- _ZN8QStroker15joinForJoinModeENS_12LineJoinModeE @ 6480 NONAME
- _ZN8QStroker15joinModeForJoinEN2Qt12PenJoinStyleE @ 6481 NONAME
- _ZN8QStroker21processCurrentSubpathEv @ 6482 NONAME
- _ZN8QStrokerC1Ev @ 6483 NONAME
- _ZN8QStrokerC2Ev @ 6484 NONAME
- _ZN8QStrokerD0Ev @ 6485 NONAME
- _ZN8QStrokerD1Ev @ 6486 NONAME
- _ZN8QStrokerD2Ev @ 6487 NONAME
- _ZN8QToolBar10childEventEP11QChildEvent @ 6488 NONAME
- _ZN8QToolBar10paintEventEP11QPaintEvent @ 6489 NONAME
- _ZN8QToolBar10setMovableEb @ 6490 NONAME
- _ZN8QToolBar11actionEventEP12QActionEvent @ 6491 NONAME
- _ZN8QToolBar11changeEventEP6QEvent @ 6492 NONAME
- _ZN8QToolBar11qt_metacallEN11QMetaObject4CallEiPPv @ 6493 NONAME
- _ZN8QToolBar11qt_metacastEPKc @ 6494 NONAME
- _ZN8QToolBar11resizeEventEP12QResizeEvent @ 6495 NONAME
- _ZN8QToolBar11setIconSizeERK5QSize @ 6496 NONAME
- _ZN8QToolBar12addSeparatorEv @ 6497 NONAME
- _ZN8QToolBar12insertWidgetEP7QActionP7QWidget @ 6498 NONAME
- _ZN8QToolBar12setFloatableEb @ 6499 NONAME
- _ZN8QToolBar14movableChangedEb @ 6500 NONAME
- _ZN8QToolBar14setOrientationEN2Qt11OrientationE @ 6501 NONAME
- _ZN8QToolBar15actionTriggeredEP7QAction @ 6502 NONAME
- _ZN8QToolBar15iconSizeChangedERK5QSize @ 6503 NONAME
- _ZN8QToolBar15insertSeparatorEP7QAction @ 6504 NONAME
- _ZN8QToolBar15setAllowedAreasE6QFlagsIN2Qt11ToolBarAreaEE @ 6505 NONAME
- _ZN8QToolBar16staticMetaObjectE @ 6506 NONAME DATA 16
- _ZN8QToolBar18orientationChangedEN2Qt11OrientationE @ 6507 NONAME
- _ZN8QToolBar18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 6508 NONAME
- _ZN8QToolBar19allowedAreasChangedE6QFlagsIN2Qt11ToolBarAreaEE @ 6509 NONAME
- _ZN8QToolBar22toolButtonStyleChangedEN2Qt15ToolButtonStyleE @ 6510 NONAME
- _ZN8QToolBar5clearEv @ 6511 NONAME
- _ZN8QToolBar5eventEP6QEvent @ 6512 NONAME
- _ZN8QToolBar9addActionERK5QIconRK7QString @ 6513 NONAME
- _ZN8QToolBar9addActionERK5QIconRK7QStringPK7QObjectPKc @ 6514 NONAME
- _ZN8QToolBar9addActionERK7QString @ 6515 NONAME
- _ZN8QToolBar9addActionERK7QStringPK7QObjectPKc @ 6516 NONAME
- _ZN8QToolBar9addWidgetEP7QWidget @ 6517 NONAME
- _ZN8QToolBarC1EP7QWidget @ 6518 NONAME
- _ZN8QToolBarC1ERK7QStringP7QWidget @ 6519 NONAME
- _ZN8QToolBarC2EP7QWidget @ 6520 NONAME
- _ZN8QToolBarC2ERK7QStringP7QWidget @ 6521 NONAME
- _ZN8QToolBarD0Ev @ 6522 NONAME
- _ZN8QToolBarD1Ev @ 6523 NONAME
- _ZN8QToolBarD2Ev @ 6524 NONAME
- _ZN8QToolBox10insertItemEiP7QWidgetRK5QIconRK7QString @ 6525 NONAME
- _ZN8QToolBox10removeItemEi @ 6526 NONAME
- _ZN8QToolBox11changeEventEP6QEvent @ 6527 NONAME
- _ZN8QToolBox11itemRemovedEi @ 6528 NONAME
- _ZN8QToolBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6529 NONAME
- _ZN8QToolBox11qt_metacastEPKc @ 6530 NONAME
- _ZN8QToolBox11setItemIconEiRK5QIcon @ 6531 NONAME
- _ZN8QToolBox11setItemTextEiRK7QString @ 6532 NONAME
- _ZN8QToolBox12itemInsertedEi @ 6533 NONAME
- _ZN8QToolBox14currentChangedEi @ 6534 NONAME
- _ZN8QToolBox14setItemEnabledEib @ 6535 NONAME
- _ZN8QToolBox14setItemToolTipEiRK7QString @ 6536 NONAME
- _ZN8QToolBox15setCurrentIndexEi @ 6537 NONAME
- _ZN8QToolBox16setCurrentWidgetEP7QWidget @ 6538 NONAME
- _ZN8QToolBox16staticMetaObjectE @ 6539 NONAME DATA 16
- _ZN8QToolBox5eventEP6QEvent @ 6540 NONAME
- _ZN8QToolBox9showEventEP10QShowEvent @ 6541 NONAME
- _ZN8QToolBoxC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6542 NONAME
- _ZN8QToolBoxC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6543 NONAME
- _ZN8QToolBoxD0Ev @ 6544 NONAME
- _ZN8QToolBoxD1Ev @ 6545 NONAME
- _ZN8QToolBoxD2Ev @ 6546 NONAME
- _ZN8QToolTip10setPaletteERK8QPalette @ 6547 NONAME
- _ZN8QToolTip4fontEv @ 6548 NONAME
- _ZN8QToolTip4textEv @ 6549 NONAME
- _ZN8QToolTip7paletteEv @ 6550 NONAME
- _ZN8QToolTip7setFontERK5QFont @ 6551 NONAME
- _ZN8QToolTip8showTextERK6QPointRK7QStringP7QWidget @ 6552 NONAME
- _ZN8QToolTip8showTextERK6QPointRK7QStringP7QWidgetRK5QRect @ 6553 NONAME
- _ZN8QToolTip9isVisibleEv @ 6554 NONAME
- _ZN9QCheckBox10paintEventEP11QPaintEvent @ 6555 NONAME
- _ZN9QCheckBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6556 NONAME
- _ZN9QCheckBox11qt_metacastEPKc @ 6557 NONAME
- _ZN9QCheckBox11setTristateEb @ 6558 NONAME
- _ZN9QCheckBox12stateChangedEi @ 6559 NONAME
- _ZN9QCheckBox13checkStateSetEv @ 6560 NONAME
- _ZN9QCheckBox13setCheckStateEN2Qt10CheckStateE @ 6561 NONAME
- _ZN9QCheckBox14mouseMoveEventEP11QMouseEvent @ 6562 NONAME
- _ZN9QCheckBox14nextCheckStateEv @ 6563 NONAME
- _ZN9QCheckBox16staticMetaObjectE @ 6564 NONAME DATA 16
- _ZN9QCheckBox5eventEP6QEvent @ 6565 NONAME
- _ZN9QCheckBoxC1EP7QWidget @ 6566 NONAME
- _ZN9QCheckBoxC1ERK7QStringP7QWidget @ 6567 NONAME
- _ZN9QCheckBoxC2EP7QWidget @ 6568 NONAME
- _ZN9QCheckBoxC2ERK7QStringP7QWidget @ 6569 NONAME
- _ZN9QColormap10initializeEv @ 6570 NONAME
- _ZN9QColormap7cleanupEv @ 6571 NONAME
- _ZN9QColormap8instanceEi @ 6572 NONAME
- _ZN9QColormapC1ERKS_ @ 6573 NONAME
- _ZN9QColormapC1Ev @ 6574 NONAME
- _ZN9QColormapC2ERKS_ @ 6575 NONAME
- _ZN9QColormapC2Ev @ 6576 NONAME
- _ZN9QColormapD1Ev @ 6577 NONAME
- _ZN9QColormapD2Ev @ 6578 NONAME
- _ZN9QColormapaSERKS_ @ 6579 NONAME
- _ZN9QComboBox10insertItemEiRK5QIconRK7QStringRK8QVariant @ 6580 NONAME
- _ZN9QComboBox10paintEventEP11QPaintEvent @ 6581 NONAME
- _ZN9QComboBox10removeItemEi @ 6582 NONAME
- _ZN9QComboBox10wheelEventEP11QWheelEvent @ 6583 NONAME
- _ZN9QComboBox11changeEventEP6QEvent @ 6584 NONAME
- _ZN9QComboBox11highlightedERK7QString @ 6585 NONAME
- _ZN9QComboBox11highlightedEi @ 6586 NONAME
- _ZN9QComboBox11insertItemsEiRK11QStringList @ 6587 NONAME
- _ZN9QComboBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6588 NONAME
- _ZN9QComboBox11qt_metacastEPKc @ 6589 NONAME
- _ZN9QComboBox11resizeEventEP12QResizeEvent @ 6590 NONAME
- _ZN9QComboBox11setEditTextERK7QString @ 6591 NONAME
- _ZN9QComboBox11setEditableEb @ 6592 NONAME
- _ZN9QComboBox11setIconSizeERK5QSize @ 6593 NONAME
- _ZN9QComboBox11setItemDataEiRK8QVarianti @ 6594 NONAME
- _ZN9QComboBox11setItemIconEiRK5QIcon @ 6595 NONAME
- _ZN9QComboBox11setItemTextEiRK7QString @ 6596 NONAME
- _ZN9QComboBox11setLineEditEP9QLineEdit @ 6597 NONAME
- _ZN9QComboBox11setMaxCountEi @ 6598 NONAME
- _ZN9QComboBox12focusInEventEP11QFocusEvent @ 6599 NONAME
- _ZN9QComboBox12setCompleterEP10QCompleter @ 6600 NONAME
- _ZN9QComboBox12setValidatorEPK10QValidator @ 6601 NONAME
- _ZN9QComboBox13clearEditTextEv @ 6602 NONAME
- _ZN9QComboBox13focusOutEventEP11QFocusEvent @ 6603 NONAME
- _ZN9QComboBox13keyPressEventEP9QKeyEvent @ 6604 NONAME
- _ZN9QComboBox14setModelColumnEi @ 6605 NONAME
- _ZN9QComboBox15editTextChangedERK7QString @ 6606 NONAME
- _ZN9QComboBox15insertSeparatorEi @ 6607 NONAME
- _ZN9QComboBox15keyReleaseEventEP9QKeyEvent @ 6608 NONAME
- _ZN9QComboBox15mousePressEventEP11QMouseEvent @ 6609 NONAME
- _ZN9QComboBox15setCurrentIndexEi @ 6610 NONAME
- _ZN9QComboBox15setInsertPolicyENS_12InsertPolicyE @ 6611 NONAME
- _ZN9QComboBox15setItemDelegateEP21QAbstractItemDelegate @ 6612 NONAME
- _ZN9QComboBox16contextMenuEventEP17QContextMenuEvent @ 6613 NONAME
- _ZN9QComboBox16inputMethodEventEP17QInputMethodEvent @ 6614 NONAME
- _ZN9QComboBox16staticMetaObjectE @ 6615 NONAME DATA 16
- _ZN9QComboBox17mouseReleaseEventEP11QMouseEvent @ 6616 NONAME
- _ZN9QComboBox17setAutoCompletionEb @ 6617 NONAME
- _ZN9QComboBox17setRootModelIndexERK11QModelIndex @ 6618 NONAME
- _ZN9QComboBox18setMaxVisibleItemsEi @ 6619 NONAME
- _ZN9QComboBox19currentIndexChangedERK7QString @ 6620 NONAME
- _ZN9QComboBox19currentIndexChangedEi @ 6621 NONAME
- _ZN9QComboBox19setSizeAdjustPolicyENS_16SizeAdjustPolicyE @ 6622 NONAME
- _ZN9QComboBox20setDuplicatesEnabledEb @ 6623 NONAME
- _ZN9QComboBox24setMinimumContentsLengthEi @ 6624 NONAME
- _ZN9QComboBox32setAutoCompletionCaseSensitivityEN2Qt15CaseSensitivityE @ 6625 NONAME
- _ZN9QComboBox5clearEv @ 6626 NONAME
- _ZN9QComboBox5eventEP6QEvent @ 6627 NONAME
- _ZN9QComboBox7setViewEP17QAbstractItemView @ 6628 NONAME
- _ZN9QComboBox8setFrameEb @ 6629 NONAME
- _ZN9QComboBox8setModelEP18QAbstractItemModel @ 6630 NONAME
- _ZN9QComboBox9activatedERK7QString @ 6631 NONAME
- _ZN9QComboBox9activatedEi @ 6632 NONAME
- _ZN9QComboBox9hideEventEP10QHideEvent @ 6633 NONAME
- _ZN9QComboBox9hidePopupEv @ 6634 NONAME
- _ZN9QComboBox9showEventEP10QShowEvent @ 6635 NONAME
- _ZN9QComboBox9showPopupEv @ 6636 NONAME
- _ZN9QComboBoxC1EP7QWidget @ 6637 NONAME
- _ZN9QComboBoxC1ER16QComboBoxPrivateP7QWidget @ 6638 NONAME
- _ZN9QComboBoxC2EP7QWidget @ 6639 NONAME
- _ZN9QComboBoxC2ER16QComboBoxPrivateP7QWidget @ 6640 NONAME
- _ZN9QComboBoxD0Ev @ 6641 NONAME
- _ZN9QComboBoxD1Ev @ 6642 NONAME
- _ZN9QComboBoxD2Ev @ 6643 NONAME
- _ZN9QDateEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 6644 NONAME
- _ZN9QDateEdit11qt_metacastEPKc @ 6645 NONAME
- _ZN9QDateEdit16staticMetaObjectE @ 6646 NONAME DATA 16
- _ZN9QDateEditC1EP7QWidget @ 6647 NONAME
- _ZN9QDateEditC1ERK5QDateP7QWidget @ 6648 NONAME
- _ZN9QDateEditC2EP7QWidget @ 6649 NONAME
- _ZN9QDateEditC2ERK5QDateP7QWidget @ 6650 NONAME
- _ZN9QDirModel10setSortingE6QFlagsIN4QDir8SortFlagEE @ 6651 NONAME
- _ZN9QDirModel11qt_metacallEN11QMetaObject4CallEiPPv @ 6652 NONAME
- _ZN9QDirModel11qt_metacastEPKc @ 6653 NONAME
- _ZN9QDirModel11setReadOnlyEb @ 6654 NONAME
- _ZN9QDirModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 6655 NONAME
- _ZN9QDirModel14setNameFiltersERK11QStringList @ 6656 NONAME
- _ZN9QDirModel15setIconProviderEP17QFileIconProvider @ 6657 NONAME
- _ZN9QDirModel16staticMetaObjectE @ 6658 NONAME DATA 16
- _ZN9QDirModel17setLazyChildCountEb @ 6659 NONAME
- _ZN9QDirModel18setResolveSymlinksEb @ 6660 NONAME
- _ZN9QDirModel4sortEiN2Qt9SortOrderE @ 6661 NONAME
- _ZN9QDirModel5mkdirERK11QModelIndexRK7QString @ 6662 NONAME
- _ZN9QDirModel5rmdirERK11QModelIndex @ 6663 NONAME
- _ZN9QDirModel6removeERK11QModelIndex @ 6664 NONAME
- _ZN9QDirModel7refreshERK11QModelIndex @ 6665 NONAME
- _ZN9QDirModel7setDataERK11QModelIndexRK8QVarianti @ 6666 NONAME
- _ZN9QDirModel9setFilterE6QFlagsIN4QDir6FilterEE @ 6667 NONAME
- _ZN9QDirModelC1EP7QObject @ 6668 NONAME
- _ZN9QDirModelC1ER16QDirModelPrivateP7QObject @ 6669 NONAME
- _ZN9QDirModelC1ERK11QStringList6QFlagsIN4QDir6FilterEES3_INS4_8SortFlagEEP7QObject @ 6670 NONAME
- _ZN9QDirModelC2EP7QObject @ 6671 NONAME
- _ZN9QDirModelC2ER16QDirModelPrivateP7QObject @ 6672 NONAME
- _ZN9QDirModelC2ERK11QStringList6QFlagsIN4QDir6FilterEES3_INS4_8SortFlagEEP7QObject @ 6673 NONAME
- _ZN9QDirModelD0Ev @ 6674 NONAME
- _ZN9QDirModelD1Ev @ 6675 NONAME
- _ZN9QDirModelD2Ev @ 6676 NONAME
- _ZN9QFontInfoC1ERK5QFont @ 6677 NONAME
- _ZN9QFontInfoC1ERKS_ @ 6678 NONAME
- _ZN9QFontInfoC2ERK5QFont @ 6679 NONAME
- _ZN9QFontInfoC2ERKS_ @ 6680 NONAME
- _ZN9QFontInfoD1Ev @ 6681 NONAME
- _ZN9QFontInfoD2Ev @ 6682 NONAME
- _ZN9QFontInfoaSERKS_ @ 6683 NONAME
- _ZN9QGradient10setColorAtEfRK6QColor @ 6684 NONAME
- _ZN9QGradient16staticMetaObjectE @ 6685 NONAME DATA 16
- _ZN9QGradient17setCoordinateModeENS_14CoordinateModeE @ 6686 NONAME
- _ZN9QGradient20setInterpolationModeENS_17InterpolationModeE @ 6687 NONAME
- _ZN9QGradient8setStopsERK7QVectorI5QPairIf6QColorEE @ 6688 NONAME
- _ZN9QGradientC1Ev @ 6689 NONAME
- _ZN9QGradientC2Ev @ 6690 NONAME
- _ZN9QGradienteqERKS_ @ 6691 NONAME
- _ZN9QGroupBox10childEventEP11QChildEvent @ 6692 NONAME
- _ZN9QGroupBox10paintEventEP11QPaintEvent @ 6693 NONAME
- _ZN9QGroupBox10setCheckedEb @ 6694 NONAME
- _ZN9QGroupBox11changeEventEP6QEvent @ 6695 NONAME
- _ZN9QGroupBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6696 NONAME
- _ZN9QGroupBox11qt_metacastEPKc @ 6697 NONAME
- _ZN9QGroupBox11resizeEventEP12QResizeEvent @ 6698 NONAME
- _ZN9QGroupBox12focusInEventEP11QFocusEvent @ 6699 NONAME
- _ZN9QGroupBox12setAlignmentEi @ 6700 NONAME
- _ZN9QGroupBox12setCheckableEb @ 6701 NONAME
- _ZN9QGroupBox14mouseMoveEventEP11QMouseEvent @ 6702 NONAME
- _ZN9QGroupBox15mousePressEventEP11QMouseEvent @ 6703 NONAME
- _ZN9QGroupBox16staticMetaObjectE @ 6704 NONAME DATA 16
- _ZN9QGroupBox17mouseReleaseEventEP11QMouseEvent @ 6705 NONAME
- _ZN9QGroupBox5eventEP6QEvent @ 6706 NONAME
- _ZN9QGroupBox7clickedEb @ 6707 NONAME
- _ZN9QGroupBox7setFlatEb @ 6708 NONAME
- _ZN9QGroupBox7toggledEb @ 6709 NONAME
- _ZN9QGroupBox8setTitleERK7QString @ 6710 NONAME
- _ZN9QGroupBoxC1EP7QWidget @ 6711 NONAME
- _ZN9QGroupBoxC1ERK7QStringP7QWidget @ 6712 NONAME
- _ZN9QGroupBoxC2EP7QWidget @ 6713 NONAME
- _ZN9QGroupBoxC2ERK7QStringP7QWidget @ 6714 NONAME
- _ZN9QGroupBoxD0Ev @ 6715 NONAME
- _ZN9QGroupBoxD1Ev @ 6716 NONAME
- _ZN9QGroupBoxD2Ev @ 6717 NONAME
- _ZN9QKeyEvent22createExtendedKeyEventEN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEEjjjRK7QStringbt @ 6718 NONAME
- _ZN9QKeyEventC1EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbt @ 6719 NONAME
- _ZN9QKeyEventC2EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbt @ 6720 NONAME
- _ZN9QKeyEventD0Ev @ 6721 NONAME
- _ZN9QKeyEventD1Ev @ 6722 NONAME
- _ZN9QKeyEventD2Ev @ 6723 NONAME
- _ZN9QLineEdit10paintEventEP11QPaintEvent @ 6724 NONAME
- _ZN9QLineEdit10textEditedERK7QString @ 6725 NONAME
- _ZN9QLineEdit11changeEventEP6QEvent @ 6726 NONAME
- _ZN9QLineEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 6727 NONAME
- _ZN9QLineEdit11qt_metacastEPKc @ 6728 NONAME
- _ZN9QLineEdit11setEchoModeENS_8EchoModeE @ 6729 NONAME
- _ZN9QLineEdit11setModifiedEb @ 6730 NONAME
- _ZN9QLineEdit11setReadOnlyEb @ 6731 NONAME
- _ZN9QLineEdit11textChangedERK7QString @ 6732 NONAME
- _ZN9QLineEdit12focusInEventEP11QFocusEvent @ 6733 NONAME
- _ZN9QLineEdit12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 6734 NONAME
- _ZN9QLineEdit12setCompleterEP10QCompleter @ 6735 NONAME
- _ZN9QLineEdit12setInputMaskERK7QString @ 6736 NONAME
- _ZN9QLineEdit12setMaxLengthEi @ 6737 NONAME
- _ZN9QLineEdit12setSelectionEii @ 6738 NONAME
- _ZN9QLineEdit12setValidatorEPK10QValidator @ 6739 NONAME
- _ZN9QLineEdit13cursorForwardEbi @ 6740 NONAME
- _ZN9QLineEdit13dragMoveEventEP14QDragMoveEvent @ 6741 NONAME
- _ZN9QLineEdit13focusOutEventEP11QFocusEvent @ 6742 NONAME
- _ZN9QLineEdit13keyPressEventEP9QKeyEvent @ 6743 NONAME
- _ZN9QLineEdit13returnPressedEv @ 6744 NONAME
- _ZN9QLineEdit14cursorBackwardEbi @ 6745 NONAME
- _ZN9QLineEdit14dragEnterEventEP15QDragEnterEvent @ 6746 NONAME
- _ZN9QLineEdit14dragLeaveEventEP15QDragLeaveEvent @ 6747 NONAME
- _ZN9QLineEdit14mouseMoveEventEP11QMouseEvent @ 6748 NONAME
- _ZN9QLineEdit14setDragEnabledEb @ 6749 NONAME
- _ZN9QLineEdit14setTextMarginsEiiii @ 6750 NONAME
- _ZN9QLineEdit15editingFinishedEv @ 6751 NONAME
- _ZN9QLineEdit15mousePressEventEP11QMouseEvent @ 6752 NONAME
- _ZN9QLineEdit16contextMenuEventEP17QContextMenuEvent @ 6753 NONAME
- _ZN9QLineEdit16cursorPositionAtERK6QPoint @ 6754 NONAME
- _ZN9QLineEdit16inputMethodEventEP17QInputMethodEvent @ 6755 NONAME
- _ZN9QLineEdit16selectionChangedEv @ 6756 NONAME
- _ZN9QLineEdit16staticMetaObjectE @ 6757 NONAME DATA 16
- _ZN9QLineEdit17cursorWordForwardEb @ 6758 NONAME
- _ZN9QLineEdit17mouseReleaseEventEP11QMouseEvent @ 6759 NONAME
- _ZN9QLineEdit17setCursorPositionEi @ 6760 NONAME
- _ZN9QLineEdit18cursorWordBackwardEb @ 6761 NONAME
- _ZN9QLineEdit21cursorPositionChangedEii @ 6762 NONAME
- _ZN9QLineEdit21mouseDoubleClickEventEP11QMouseEvent @ 6763 NONAME
- _ZN9QLineEdit25createStandardContextMenuEv @ 6764 NONAME
- _ZN9QLineEdit3cutEv @ 6765 NONAME
- _ZN9QLineEdit3delEv @ 6766 NONAME
- _ZN9QLineEdit3endEb @ 6767 NONAME
- _ZN9QLineEdit4homeEb @ 6768 NONAME
- _ZN9QLineEdit4redoEv @ 6769 NONAME
- _ZN9QLineEdit4undoEv @ 6770 NONAME
- _ZN9QLineEdit5clearEv @ 6771 NONAME
- _ZN9QLineEdit5eventEP6QEvent @ 6772 NONAME
- _ZN9QLineEdit5pasteEv @ 6773 NONAME
- _ZN9QLineEdit6insertERK7QString @ 6774 NONAME
- _ZN9QLineEdit7setTextERK7QString @ 6775 NONAME
- _ZN9QLineEdit8deselectEv @ 6776 NONAME
- _ZN9QLineEdit8setFrameEb @ 6777 NONAME
- _ZN9QLineEdit9backspaceEv @ 6778 NONAME
- _ZN9QLineEdit9dropEventEP10QDropEvent @ 6779 NONAME
- _ZN9QLineEdit9selectAllEv @ 6780 NONAME
- _ZN9QLineEditC1EP7QWidget @ 6781 NONAME
- _ZN9QLineEditC1ERK7QStringP7QWidget @ 6782 NONAME
- _ZN9QLineEditC2EP7QWidget @ 6783 NONAME
- _ZN9QLineEditC2ERK7QStringP7QWidget @ 6784 NONAME
- _ZN9QLineEditD0Ev @ 6785 NONAME
- _ZN9QLineEditD1Ev @ 6786 NONAME
- _ZN9QLineEditD2Ev @ 6787 NONAME
- _ZN9QListView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 6788 NONAME
- _ZN9QListView10paintEventEP11QPaintEvent @ 6789 NONAME
- _ZN9QListView10setSpacingEi @ 6790 NONAME
- _ZN9QListView10timerEventEP11QTimerEvent @ 6791 NONAME
- _ZN9QListView11dataChangedERK11QModelIndexS2_ @ 6792 NONAME
- _ZN9QListView11qt_metacallEN11QMetaObject4CallEiPPv @ 6793 NONAME
- _ZN9QListView11qt_metacastEPKc @ 6794 NONAME
- _ZN9QListView11resizeEventEP12QResizeEvent @ 6795 NONAME
- _ZN9QListView11setGridSizeERK5QSize @ 6796 NONAME
- _ZN9QListView11setMovementENS_8MovementE @ 6797 NONAME
- _ZN9QListView11setViewModeENS_8ViewModeE @ 6798 NONAME
- _ZN9QListView11setWordWrapEb @ 6799 NONAME
- _ZN9QListView11setWrappingEb @ 6800 NONAME
- _ZN9QListView12indexesMovedERK5QListI11QModelIndexE @ 6801 NONAME
- _ZN9QListView12internalDragE6QFlagsIN2Qt10DropActionEE @ 6802 NONAME
- _ZN9QListView12internalDropEP10QDropEvent @ 6803 NONAME
- _ZN9QListView12rowsInsertedERK11QModelIndexii @ 6804 NONAME
- _ZN9QListView12setBatchSizeEi @ 6805 NONAME
- _ZN9QListView12setRootIndexERK11QModelIndex @ 6806 NONAME
- _ZN9QListView12setRowHiddenEib @ 6807 NONAME
- _ZN9QListView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 6808 NONAME
- _ZN9QListView13doItemsLayoutEv @ 6809 NONAME
- _ZN9QListView13dragMoveEventEP14QDragMoveEvent @ 6810 NONAME
- _ZN9QListView13setLayoutModeENS_10LayoutModeE @ 6811 NONAME
- _ZN9QListView13setResizeModeENS_10ResizeModeE @ 6812 NONAME
- _ZN9QListView14currentChangedERK11QModelIndexS2_ @ 6813 NONAME
- _ZN9QListView14dragLeaveEventEP15QDragLeaveEvent @ 6814 NONAME
- _ZN9QListView14mouseMoveEventEP11QMouseEvent @ 6815 NONAME
- _ZN9QListView14resizeContentsEii @ 6816 NONAME
- _ZN9QListView14setModelColumnEi @ 6817 NONAME
- _ZN9QListView16scrollContentsByEii @ 6818 NONAME
- _ZN9QListView16selectionChangedERK14QItemSelectionS2_ @ 6819 NONAME
- _ZN9QListView16staticMetaObjectE @ 6820 NONAME DATA 16
- _ZN9QListView16updateGeometriesEv @ 6821 NONAME
- _ZN9QListView17mouseReleaseEventEP11QMouseEvent @ 6822 NONAME
- _ZN9QListView18clearPropertyFlagsEv @ 6823 NONAME
- _ZN9QListView19setPositionForIndexERK6QPointRK11QModelIndex @ 6824 NONAME
- _ZN9QListView19setUniformItemSizesEb @ 6825 NONAME
- _ZN9QListView20rowsAboutToBeRemovedERK11QModelIndexii @ 6826 NONAME
- _ZN9QListView23setSelectionRectVisibleEb @ 6827 NONAME
- _ZN9QListView5eventEP6QEvent @ 6828 NONAME
- _ZN9QListView5resetEv @ 6829 NONAME
- _ZN9QListView7setFlowENS_4FlowE @ 6830 NONAME
- _ZN9QListView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 6831 NONAME
- _ZN9QListView9dropEventEP10QDropEvent @ 6832 NONAME
- _ZN9QListView9startDragE6QFlagsIN2Qt10DropActionEE @ 6833 NONAME
- _ZN9QListViewC1EP7QWidget @ 6834 NONAME
- _ZN9QListViewC1ER16QListViewPrivateP7QWidget @ 6835 NONAME
- _ZN9QListViewC2EP7QWidget @ 6836 NONAME
- _ZN9QListViewC2ER16QListViewPrivateP7QWidget @ 6837 NONAME
- _ZN9QListViewD0Ev @ 6838 NONAME
- _ZN9QListViewD1Ev @ 6839 NONAME
- _ZN9QListViewD2Ev @ 6840 NONAME
- _ZN9QPolygonF9translateERK7QPointF @ 6841 NONAME
- _ZN9QPolygonFC1ERK6QRectF @ 6842 NONAME
- _ZN9QPolygonFC1ERK8QPolygon @ 6843 NONAME
- _ZN9QPolygonFC2ERK6QRectF @ 6844 NONAME
- _ZN9QPolygonFC2ERK8QPolygon @ 6845 NONAME
- _ZN9QS60Style11qt_metacallEN11QMetaObject4CallEiPPv @ 6846 NONAME
- _ZN9QS60Style11qt_metacastEPKc @ 6847 NONAME
- _ZN9QS60Style16handleSkinChangeEv @ 6848 NONAME ABSENT
- _ZN9QS60Style16setStylePropertyEPKcRK8QVariant @ 6849 NONAME
- _ZN9QS60Style16staticMetaObjectE @ 6850 NONAME DATA 16
- _ZN9QS60Style32handleDynamicLayoutVariantSwitchEv @ 6851 NONAME ABSENT
- _ZN9QS60Style6polishEP12QApplication @ 6852 NONAME
- _ZN9QS60Style6polishEP7QWidget @ 6853 NONAME
- _ZN9QS60Style8unpolishEP12QApplication @ 6854 NONAME
- _ZN9QS60Style8unpolishEP7QWidget @ 6855 NONAME
- _ZN9QS60StyleC1Ev @ 6856 NONAME
- _ZN9QS60StyleC2Ev @ 6857 NONAME
- _ZN9QS60StyleD0Ev @ 6858 NONAME
- _ZN9QS60StyleD1Ev @ 6859 NONAME
- _ZN9QS60StyleD2Ev @ 6860 NONAME
- _ZN9QShortcut10setContextEN2Qt15ShortcutContextE @ 6861 NONAME
- _ZN9QShortcut10setEnabledEb @ 6862 NONAME
- _ZN9QShortcut11qt_metacallEN11QMetaObject4CallEiPPv @ 6863 NONAME
- _ZN9QShortcut11qt_metacastEPKc @ 6864 NONAME
- _ZN9QShortcut12setWhatsThisERK7QString @ 6865 NONAME
- _ZN9QShortcut13setAutoRepeatEb @ 6866 NONAME
- _ZN9QShortcut16staticMetaObjectE @ 6867 NONAME DATA 16
- _ZN9QShortcut20activatedAmbiguouslyEv @ 6868 NONAME
- _ZN9QShortcut5eventEP6QEvent @ 6869 NONAME
- _ZN9QShortcut6setKeyERK12QKeySequence @ 6870 NONAME
- _ZN9QShortcut7contextEv @ 6871 NONAME
- _ZN9QShortcut9activatedEv @ 6872 NONAME
- _ZN9QShortcutC1EP7QWidget @ 6873 NONAME
- _ZN9QShortcutC1ERK12QKeySequenceP7QWidgetPKcS6_N2Qt15ShortcutContextE @ 6874 NONAME
- _ZN9QShortcutC2EP7QWidget @ 6875 NONAME
- _ZN9QShortcutC2ERK12QKeySequenceP7QWidgetPKcS6_N2Qt15ShortcutContextE @ 6876 NONAME
- _ZN9QShortcutD0Ev @ 6877 NONAME
- _ZN9QShortcutD1Ev @ 6878 NONAME
- _ZN9QShortcutD2Ev @ 6879 NONAME
- _ZN9QSizeGrip10paintEventEP11QPaintEvent @ 6880 NONAME
- _ZN9QSizeGrip10setVisibleEb @ 6881 NONAME
- _ZN9QSizeGrip11eventFilterEP7QObjectP6QEvent @ 6882 NONAME
- _ZN9QSizeGrip11qt_metacallEN11QMetaObject4CallEiPPv @ 6883 NONAME
- _ZN9QSizeGrip11qt_metacastEPKc @ 6884 NONAME
- _ZN9QSizeGrip14mouseMoveEventEP11QMouseEvent @ 6885 NONAME
- _ZN9QSizeGrip15mousePressEventEP11QMouseEvent @ 6886 NONAME
- _ZN9QSizeGrip16staticMetaObjectE @ 6887 NONAME DATA 16
- _ZN9QSizeGrip17mouseReleaseEventEP11QMouseEvent @ 6888 NONAME
- _ZN9QSizeGrip5eventEP6QEvent @ 6889 NONAME
- _ZN9QSizeGrip9hideEventEP10QHideEvent @ 6890 NONAME
- _ZN9QSizeGrip9moveEventEP10QMoveEvent @ 6891 NONAME
- _ZN9QSizeGrip9showEventEP10QShowEvent @ 6892 NONAME
- _ZN9QSizeGripC1EP7QWidget @ 6893 NONAME
- _ZN9QSizeGripC2EP7QWidget @ 6894 NONAME
- _ZN9QSizeGripD0Ev @ 6895 NONAME
- _ZN9QSizeGripD1Ev @ 6896 NONAME
- _ZN9QSizeGripD2Ev @ 6897 NONAME
- _ZN9QSplitter10childEventEP11QChildEvent @ 6898 NONAME
- _ZN9QSplitter11changeEventEP6QEvent @ 6899 NONAME
- _ZN9QSplitter11qt_metacallEN11QMetaObject4CallEiPPv @ 6900 NONAME
- _ZN9QSplitter11qt_metacastEPKc @ 6901 NONAME
- _ZN9QSplitter11resizeEventEP12QResizeEvent @ 6902 NONAME
- _ZN9QSplitter12createHandleEv @ 6903 NONAME
- _ZN9QSplitter12insertWidgetEiP7QWidget @ 6904 NONAME
- _ZN9QSplitter12moveSplitterEii @ 6905 NONAME
- _ZN9QSplitter12restoreStateERK10QByteArray @ 6906 NONAME
- _ZN9QSplitter13setRubberBandEi @ 6907 NONAME
- _ZN9QSplitter13splitterMovedEii @ 6908 NONAME
- _ZN9QSplitter14setCollapsibleEib @ 6909 NONAME
- _ZN9QSplitter14setHandleWidthEi @ 6910 NONAME
- _ZN9QSplitter14setOrientationEN2Qt11OrientationE @ 6911 NONAME
- _ZN9QSplitter15setOpaqueResizeEb @ 6912 NONAME
- _ZN9QSplitter16setStretchFactorEii @ 6913 NONAME
- _ZN9QSplitter16staticMetaObjectE @ 6914 NONAME DATA 16
- _ZN9QSplitter20closestLegalPositionEii @ 6915 NONAME
- _ZN9QSplitter22setChildrenCollapsibleEb @ 6916 NONAME
- _ZN9QSplitter5eventEP6QEvent @ 6917 NONAME
- _ZN9QSplitter7refreshEv @ 6918 NONAME
- _ZN9QSplitter8setSizesERK5QListIiE @ 6919 NONAME
- _ZN9QSplitter9addWidgetEP7QWidget @ 6920 NONAME
- _ZN9QSplitterC1EN2Qt11OrientationEP7QWidget @ 6921 NONAME
- _ZN9QSplitterC1EP7QWidget @ 6922 NONAME
- _ZN9QSplitterC2EN2Qt11OrientationEP7QWidget @ 6923 NONAME
- _ZN9QSplitterC2EP7QWidget @ 6924 NONAME
- _ZN9QSplitterD0Ev @ 6925 NONAME
- _ZN9QSplitterD1Ev @ 6926 NONAME
- _ZN9QSplitterD2Ev @ 6927 NONAME
- _ZN9QTextEdit10insertHtmlERK7QString @ 6928 NONAME
- _ZN9QTextEdit10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 6929 NONAME
- _ZN9QTextEdit10paintEventEP11QPaintEvent @ 6930 NONAME
- _ZN9QTextEdit10timerEventEP11QTimerEvent @ 6931 NONAME
- _ZN9QTextEdit10wheelEventEP11QWheelEvent @ 6932 NONAME
- _ZN9QTextEdit11changeEventEP6QEvent @ 6933 NONAME
- _ZN9QTextEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 6934 NONAME
- _ZN9QTextEdit11qt_metacastEPKc @ 6935 NONAME
- _ZN9QTextEdit11resizeEventEP12QResizeEvent @ 6936 NONAME
- _ZN9QTextEdit11setDocumentEP13QTextDocument @ 6937 NONAME
- _ZN9QTextEdit11setReadOnlyEb @ 6938 NONAME
- _ZN9QTextEdit11textChangedEv @ 6939 NONAME
- _ZN9QTextEdit12focusInEventEP11QFocusEvent @ 6940 NONAME
- _ZN9QTextEdit12loadResourceEiRK4QUrl @ 6941 NONAME
- _ZN9QTextEdit12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 6942 NONAME
- _ZN9QTextEdit12setPlainTextERK7QString @ 6943 NONAME
- _ZN9QTextEdit12setTextColorERK6QColor @ 6944 NONAME
- _ZN9QTextEdit13copyAvailableEb @ 6945 NONAME
- _ZN9QTextEdit13dragMoveEventEP14QDragMoveEvent @ 6946 NONAME
- _ZN9QTextEdit13focusOutEventEP11QFocusEvent @ 6947 NONAME
- _ZN9QTextEdit13keyPressEventEP9QKeyEvent @ 6948 NONAME
- _ZN9QTextEdit13redoAvailableEb @ 6949 NONAME
- _ZN9QTextEdit13setFontFamilyERK7QString @ 6950 NONAME
- _ZN9QTextEdit13setFontItalicEb @ 6951 NONAME
- _ZN9QTextEdit13setFontWeightEi @ 6952 NONAME
- _ZN9QTextEdit13setTextCursorERK11QTextCursor @ 6953 NONAME
- _ZN9QTextEdit13undoAvailableEb @ 6954 NONAME
- _ZN9QTextEdit14dragEnterEventEP15QDragEnterEvent @ 6955 NONAME
- _ZN9QTextEdit14dragLeaveEventEP15QDragLeaveEvent @ 6956 NONAME
- _ZN9QTextEdit14mouseMoveEventEP11QMouseEvent @ 6957 NONAME
- _ZN9QTextEdit14scrollToAnchorERK7QString @ 6958 NONAME
- _ZN9QTextEdit14setCurrentFontERK5QFont @ 6959 NONAME
- _ZN9QTextEdit14setCursorWidthEi @ 6960 NONAME
- _ZN9QTextEdit15insertPlainTextERK7QString @ 6961 NONAME
- _ZN9QTextEdit15keyReleaseEventEP9QKeyEvent @ 6962 NONAME
- _ZN9QTextEdit15mousePressEventEP11QMouseEvent @ 6963 NONAME
- _ZN9QTextEdit15setLineWrapModeENS_12LineWrapModeE @ 6964 NONAME
- _ZN9QTextEdit15setTabStopWidthEi @ 6965 NONAME
- _ZN9QTextEdit15setWordWrapModeEN11QTextOption8WrapModeE @ 6966 NONAME
- _ZN9QTextEdit16contextMenuEventEP17QContextMenuEvent @ 6967 NONAME
- _ZN9QTextEdit16inputMethodEventEP17QInputMethodEvent @ 6968 NONAME
- _ZN9QTextEdit16scrollContentsByEii @ 6969 NONAME
- _ZN9QTextEdit16selectionChangedEv @ 6970 NONAME
- _ZN9QTextEdit16setFontPointSizeEf @ 6971 NONAME
- _ZN9QTextEdit16setFontUnderlineEb @ 6972 NONAME
- _ZN9QTextEdit16setOverwriteModeEb @ 6973 NONAME
- _ZN9QTextEdit16staticMetaObjectE @ 6974 NONAME DATA 16
- _ZN9QTextEdit17mouseReleaseEventEP11QMouseEvent @ 6975 NONAME
- _ZN9QTextEdit17setAcceptRichTextEb @ 6976 NONAME
- _ZN9QTextEdit17setAutoFormattingE6QFlagsINS_18AutoFormattingFlagEE @ 6977 NONAME
- _ZN9QTextEdit18focusNextPrevChildEb @ 6978 NONAME
- _ZN9QTextEdit18insertFromMimeDataEPK9QMimeData @ 6979 NONAME
- _ZN9QTextEdit18setExtraSelectionsERK5QListINS_14ExtraSelectionEE @ 6980 NONAME
- _ZN9QTextEdit18setTabChangesFocusEb @ 6981 NONAME
- _ZN9QTextEdit19ensureCursorVisibleEv @ 6982 NONAME
- _ZN9QTextEdit20setCurrentCharFormatERK15QTextCharFormat @ 6983 NONAME
- _ZN9QTextEdit21cursorPositionChangedEv @ 6984 NONAME
- _ZN9QTextEdit21mouseDoubleClickEventEP11QMouseEvent @ 6985 NONAME
- _ZN9QTextEdit22mergeCurrentCharFormatERK15QTextCharFormat @ 6986 NONAME
- _ZN9QTextEdit22setTextBackgroundColorERK6QColor @ 6987 NONAME
- _ZN9QTextEdit23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 6988 NONAME
- _ZN9QTextEdit24currentCharFormatChangedERK15QTextCharFormat @ 6989 NONAME
- _ZN9QTextEdit24setLineWrapColumnOrWidthEi @ 6990 NONAME
- _ZN9QTextEdit25createStandardContextMenuERK6QPoint @ 6991 NONAME
- _ZN9QTextEdit25createStandardContextMenuEv @ 6992 NONAME
- _ZN9QTextEdit3cutEv @ 6993 NONAME
- _ZN9QTextEdit4copyEv @ 6994 NONAME
- _ZN9QTextEdit4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 6995 NONAME
- _ZN9QTextEdit4redoEv @ 6996 NONAME
- _ZN9QTextEdit4undoEv @ 6997 NONAME
- _ZN9QTextEdit5clearEv @ 6998 NONAME
- _ZN9QTextEdit5eventEP6QEvent @ 6999 NONAME
- _ZN9QTextEdit5pasteEv @ 7000 NONAME
- _ZN9QTextEdit6appendERK7QString @ 7001 NONAME
- _ZN9QTextEdit6zoomInEi @ 7002 NONAME
- _ZN9QTextEdit7setHtmlERK7QString @ 7003 NONAME
- _ZN9QTextEdit7setTextERK7QString @ 7004 NONAME
- _ZN9QTextEdit7zoomOutEi @ 7005 NONAME
- _ZN9QTextEdit9dropEventEP10QDropEvent @ 7006 NONAME
- _ZN9QTextEdit9selectAllEv @ 7007 NONAME
- _ZN9QTextEdit9showEventEP10QShowEvent @ 7008 NONAME
- _ZN9QTextEditC1EP7QWidget @ 7009 NONAME
- _ZN9QTextEditC1ER16QTextEditPrivateP7QWidget @ 7010 NONAME
- _ZN9QTextEditC1ERK7QStringP7QWidget @ 7011 NONAME
- _ZN9QTextEditC2EP7QWidget @ 7012 NONAME
- _ZN9QTextEditC2ER16QTextEditPrivateP7QWidget @ 7013 NONAME
- _ZN9QTextEditC2ERK7QStringP7QWidget @ 7014 NONAME
- _ZN9QTextEditD0Ev @ 7015 NONAME
- _ZN9QTextEditD1Ev @ 7016 NONAME
- _ZN9QTextEditD2Ev @ 7017 NONAME
- _ZN9QTextLine11setPositionERK7QPointF @ 7018 NONAME
- _ZN9QTextLine12setLineWidthEf @ 7019 NONAME
- _ZN9QTextLine13layout_helperEi @ 7020 NONAME
- _ZN9QTextLine13setNumColumnsEi @ 7021 NONAME
- _ZN9QTextLine13setNumColumnsEif @ 7022 NONAME
- _ZN9QTextList10removeItemEi @ 7023 NONAME
- _ZN9QTextList11qt_metacallEN11QMetaObject4CallEiPPv @ 7024 NONAME
- _ZN9QTextList11qt_metacastEPKc @ 7025 NONAME
- _ZN9QTextList16staticMetaObjectE @ 7026 NONAME DATA 16
- _ZN9QTextList3addERK10QTextBlock @ 7027 NONAME
- _ZN9QTextList6removeERK10QTextBlock @ 7028 NONAME
- _ZN9QTextListC1EP13QTextDocument @ 7029 NONAME
- _ZN9QTextListC2EP13QTextDocument @ 7030 NONAME
- _ZN9QTextListD0Ev @ 7031 NONAME
- _ZN9QTextListD1Ev @ 7032 NONAME
- _ZN9QTextListD2Ev @ 7033 NONAME
- _ZN9QTimeEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 7034 NONAME
- _ZN9QTimeEdit11qt_metacastEPKc @ 7035 NONAME
- _ZN9QTimeEdit16staticMetaObjectE @ 7036 NONAME DATA 16
- _ZN9QTimeEditC1EP7QWidget @ 7037 NONAME
- _ZN9QTimeEditC1ERK5QTimeP7QWidget @ 7038 NONAME
- _ZN9QTimeEditC2EP7QWidget @ 7039 NONAME
- _ZN9QTimeEditC2ERK5QTimeP7QWidget @ 7040 NONAME
- _ZN9QTreeView10hideColumnEi @ 7041 NONAME
- _ZN9QTreeView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 7042 NONAME
- _ZN9QTreeView10paintEventEP11QPaintEvent @ 7043 NONAME
- _ZN9QTreeView10showColumnEi @ 7044 NONAME
- _ZN9QTreeView10timerEventEP11QTimerEvent @ 7045 NONAME
- _ZN9QTreeView11collapseAllEv @ 7046 NONAME
- _ZN9QTreeView11columnMovedEv @ 7047 NONAME
- _ZN9QTreeView11dataChangedERK11QModelIndexS2_ @ 7048 NONAME
- _ZN9QTreeView11qt_metacallEN11QMetaObject4CallEiPPv @ 7049 NONAME
- _ZN9QTreeView11qt_metacastEPKc @ 7050 NONAME
- _ZN9QTreeView11rowsRemovedERK11QModelIndexii @ 7051 NONAME
- _ZN9QTreeView11setAnimatedEb @ 7052 NONAME
- _ZN9QTreeView11setExpandedERK11QModelIndexb @ 7053 NONAME
- _ZN9QTreeView11setWordWrapEb @ 7054 NONAME
- _ZN9QTreeView12rowsInsertedERK11QModelIndexii @ 7055 NONAME
- _ZN9QTreeView12setRootIndexERK11QModelIndex @ 7056 NONAME
- _ZN9QTreeView12setRowHiddenEiRK11QModelIndexb @ 7057 NONAME
- _ZN9QTreeView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 7058 NONAME
- _ZN9QTreeView12sortByColumnEi @ 7059 NONAME
- _ZN9QTreeView12sortByColumnEiN2Qt9SortOrderE @ 7060 NONAME
- _ZN9QTreeView13columnResizedEiii @ 7061 NONAME
- _ZN9QTreeView13doItemsLayoutEv @ 7062 NONAME
- _ZN9QTreeView13dragMoveEventEP14QDragMoveEvent @ 7063 NONAME
- _ZN9QTreeView13expandToDepthEi @ 7064 NONAME
- _ZN9QTreeView13keyPressEventEP9QKeyEvent @ 7065 NONAME
- _ZN9QTreeView13viewportEventEP6QEvent @ 7066 NONAME
- _ZN9QTreeView14currentChangedERK11QModelIndexS2_ @ 7067 NONAME
- _ZN9QTreeView14keyboardSearchERK7QString @ 7068 NONAME
- _ZN9QTreeView14mouseMoveEventEP11QMouseEvent @ 7069 NONAME
- _ZN9QTreeView14setColumnWidthEii @ 7070 NONAME
- _ZN9QTreeView14setIndentationEi @ 7071 NONAME
- _ZN9QTreeView15mousePressEventEP11QMouseEvent @ 7072 NONAME
- _ZN9QTreeView15setColumnHiddenEib @ 7073 NONAME
- _ZN9QTreeView15setHeaderHiddenEb @ 7074 NONAME
- _ZN9QTreeView16scrollContentsByEii @ 7075 NONAME
- _ZN9QTreeView16selectionChangedERK14QItemSelectionS2_ @ 7076 NONAME
- _ZN9QTreeView16staticMetaObjectE @ 7077 NONAME DATA 16
- _ZN9QTreeView16updateGeometriesEv @ 7078 NONAME
- _ZN9QTreeView17mouseReleaseEventEP11QMouseEvent @ 7079 NONAME
- _ZN9QTreeView17setSelectionModelEP19QItemSelectionModel @ 7080 NONAME
- _ZN9QTreeView17setSortingEnabledEb @ 7081 NONAME
- _ZN9QTreeView18columnCountChangedEii @ 7082 NONAME
- _ZN9QTreeView18setAutoExpandDelayEi @ 7083 NONAME
- _ZN9QTreeView18setItemsExpandableEb @ 7084 NONAME
- _ZN9QTreeView18setRootIsDecoratedEb @ 7085 NONAME
- _ZN9QTreeView20rowsAboutToBeRemovedERK11QModelIndexii @ 7086 NONAME
- _ZN9QTreeView20setUniformRowHeightsEb @ 7087 NONAME
- _ZN9QTreeView21mouseDoubleClickEventEP11QMouseEvent @ 7088 NONAME
- _ZN9QTreeView21setFirstColumnSpannedEiRK11QModelIndexb @ 7089 NONAME
- _ZN9QTreeView22resizeColumnToContentsEi @ 7090 NONAME
- _ZN9QTreeView22setAllColumnsShowFocusEb @ 7091 NONAME
- _ZN9QTreeView23setExpandsOnDoubleClickEb @ 7092 NONAME
- _ZN9QTreeView25horizontalScrollbarActionEi @ 7093 NONAME
- _ZN9QTreeView5resetEv @ 7094 NONAME
- _ZN9QTreeView6expandERK11QModelIndex @ 7095 NONAME
- _ZN9QTreeView8collapseERK11QModelIndex @ 7096 NONAME
- _ZN9QTreeView8expandedERK11QModelIndex @ 7097 NONAME
- _ZN9QTreeView8reexpandEv @ 7098 NONAME
- _ZN9QTreeView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 7099 NONAME
- _ZN9QTreeView8setModelEP18QAbstractItemModel @ 7100 NONAME
- _ZN9QTreeView9collapsedERK11QModelIndex @ 7101 NONAME
- _ZN9QTreeView9expandAllEv @ 7102 NONAME
- _ZN9QTreeView9selectAllEv @ 7103 NONAME
- _ZN9QTreeView9setHeaderEP11QHeaderView @ 7104 NONAME
- _ZN9QTreeViewC1EP7QWidget @ 7105 NONAME
- _ZN9QTreeViewC1ER16QTreeViewPrivateP7QWidget @ 7106 NONAME
- _ZN9QTreeViewC2EP7QWidget @ 7107 NONAME
- _ZN9QTreeViewC2ER16QTreeViewPrivateP7QWidget @ 7108 NONAME
- _ZN9QTreeViewD0Ev @ 7109 NONAME
- _ZN9QTreeViewD1Ev @ 7110 NONAME
- _ZN9QTreeViewD2Ev @ 7111 NONAME
- _ZN9QUndoView11qt_metacallEN11QMetaObject4CallEiPPv @ 7112 NONAME
- _ZN9QUndoView11qt_metacastEPKc @ 7113 NONAME
- _ZN9QUndoView12setCleanIconERK5QIcon @ 7114 NONAME
- _ZN9QUndoView13setEmptyLabelERK7QString @ 7115 NONAME
- _ZN9QUndoView16staticMetaObjectE @ 7116 NONAME DATA 16
- _ZN9QUndoView8setGroupEP10QUndoGroup @ 7117 NONAME
- _ZN9QUndoView8setStackEP10QUndoStack @ 7118 NONAME
- _ZN9QUndoViewC1EP10QUndoGroupP7QWidget @ 7119 NONAME
- _ZN9QUndoViewC1EP10QUndoStackP7QWidget @ 7120 NONAME
- _ZN9QUndoViewC1EP7QWidget @ 7121 NONAME
- _ZN9QUndoViewC2EP10QUndoGroupP7QWidget @ 7122 NONAME
- _ZN9QUndoViewC2EP10QUndoStackP7QWidget @ 7123 NONAME
- _ZN9QUndoViewC2EP7QWidget @ 7124 NONAME
- _ZN9QUndoViewD0Ev @ 7125 NONAME
- _ZN9QUndoViewD1Ev @ 7126 NONAME
- _ZN9QUndoViewD2Ev @ 7127 NONAME
- _ZN9QUrlModel11dataChangedERK11QModelIndexS2_ @ 7128 NONAME
- _ZN9QUrlModel11qt_metacallEN11QMetaObject4CallEiPPv @ 7129 NONAME
- _ZN9QUrlModel11qt_metacastEPKc @ 7130 NONAME
- _ZN9QUrlModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 7131 NONAME
- _ZN9QUrlModel13layoutChangedEv @ 7132 NONAME
- _ZN9QUrlModel16staticMetaObjectE @ 7133 NONAME DATA 16
- _ZN9QUrlModel18setFileSystemModelEP16QFileSystemModel @ 7134 NONAME
- _ZN9QUrlModel6setUrlERK11QModelIndexRK4QUrlS2_ @ 7135 NONAME
- _ZN9QUrlModel7addUrlsERK5QListI4QUrlEib @ 7136 NONAME
- _ZN9QUrlModel7canDropEP15QDragEnterEvent @ 7137 NONAME
- _ZN9QUrlModel7changedERK7QString @ 7138 NONAME
- _ZN9QUrlModel7setDataERK11QModelIndexRK8QVarianti @ 7139 NONAME
- _ZN9QUrlModel7setUrlsERK5QListI4QUrlE @ 7140 NONAME
- _ZN9QUrlModelC1EP7QObject @ 7141 NONAME
- _ZN9QUrlModelC2EP7QObject @ 7142 NONAME
- _ZNK10QBoxLayout10metaObjectEv @ 7143 NONAME
- _ZNK10QBoxLayout11maximumSizeEv @ 7144 NONAME
- _ZNK10QBoxLayout11minimumSizeEv @ 7145 NONAME
- _ZNK10QBoxLayout14heightForWidthEi @ 7146 NONAME
- _ZNK10QBoxLayout17hasHeightForWidthEv @ 7147 NONAME
- _ZNK10QBoxLayout19expandingDirectionsEv @ 7148 NONAME
- _ZNK10QBoxLayout21minimumHeightForWidthEi @ 7149 NONAME
- _ZNK10QBoxLayout5countEv @ 7150 NONAME
- _ZNK10QBoxLayout6itemAtEi @ 7151 NONAME
- _ZNK10QBoxLayout7spacingEv @ 7152 NONAME
- _ZNK10QBoxLayout7stretchEi @ 7153 NONAME
- _ZNK10QBoxLayout8sizeHintEv @ 7154 NONAME
- _ZNK10QBoxLayout9directionEv @ 7155 NONAME
- _ZNK10QClipboard10metaObjectEv @ 7156 NONAME
- _ZNK10QClipboard12supportsModeENS_4ModeE @ 7157 NONAME
- _ZNK10QClipboard13ownsClipboardEv @ 7158 NONAME
- _ZNK10QClipboard13ownsSelectionEv @ 7159 NONAME
- _ZNK10QClipboard14ownsFindBufferEv @ 7160 NONAME
- _ZNK10QClipboard17supportsSelectionEv @ 7161 NONAME
- _ZNK10QClipboard18supportsFindBufferEv @ 7162 NONAME
- _ZNK10QClipboard4textENS_4ModeE @ 7163 NONAME
- _ZNK10QClipboard4textER7QStringNS_4ModeE @ 7164 NONAME
- _ZNK10QClipboard5imageENS_4ModeE @ 7165 NONAME
- _ZNK10QClipboard6pixmapENS_4ModeE @ 7166 NONAME
- _ZNK10QClipboard8mimeDataENS_4ModeE @ 7167 NONAME
- _ZNK10QClipboard8ownsModeENS_4ModeE @ 7168 NONAME
- _ZNK10QCompleter10currentRowEv @ 7169 NONAME
- _ZNK10QCompleter10metaObjectEv @ 7170 NONAME
- _ZNK10QCompleter10wrapAroundEv @ 7171 NONAME
- _ZNK10QCompleter12currentIndexEv @ 7172 NONAME
- _ZNK10QCompleter12modelSortingEv @ 7173 NONAME
- _ZNK10QCompleter13pathFromIndexERK11QModelIndex @ 7174 NONAME
- _ZNK10QCompleter14completionModeEv @ 7175 NONAME
- _ZNK10QCompleter14completionRoleEv @ 7176 NONAME
- _ZNK10QCompleter15caseSensitivityEv @ 7177 NONAME
- _ZNK10QCompleter15completionCountEv @ 7178 NONAME
- _ZNK10QCompleter15completionModelEv @ 7179 NONAME
- _ZNK10QCompleter16completionColumnEv @ 7180 NONAME
- _ZNK10QCompleter16completionPrefixEv @ 7181 NONAME
- _ZNK10QCompleter17currentCompletionEv @ 7182 NONAME
- _ZNK10QCompleter5modelEv @ 7183 NONAME
- _ZNK10QCompleter5popupEv @ 7184 NONAME
- _ZNK10QCompleter6widgetEv @ 7185 NONAME
- _ZNK10QCompleter9splitPathERK7QString @ 7186 NONAME
- _ZNK10QDropEvent11encodedDataEPKc @ 7187 NONAME
- _ZNK10QDropEvent6formatEi @ 7188 NONAME
- _ZNK10QDropEvent6sourceEv @ 7189 NONAME
- _ZNK10QDropEvent8providesEPKc @ 7190 NONAME
- _ZNK10QLCDNumber10metaObjectEv @ 7191 NONAME
- _ZNK10QLCDNumber12segmentStyleEv @ 7192 NONAME
- _ZNK10QLCDNumber13checkOverflowEd @ 7193 NONAME
- _ZNK10QLCDNumber13checkOverflowEi @ 7194 NONAME
- _ZNK10QLCDNumber17smallDecimalPointEv @ 7195 NONAME
- _ZNK10QLCDNumber4modeEv @ 7196 NONAME
- _ZNK10QLCDNumber5valueEv @ 7197 NONAME
- _ZNK10QLCDNumber8intValueEv @ 7198 NONAME
- _ZNK10QLCDNumber8sizeHintEv @ 7199 NONAME
- _ZNK10QLCDNumber9numDigitsEv @ 7200 NONAME
- _ZNK10QPictureIO10parametersEv @ 7201 NONAME
- _ZNK10QPictureIO11descriptionEv @ 7202 NONAME
- _ZNK10QPictureIO5gammaEv @ 7203 NONAME
- _ZNK10QPictureIO6formatEv @ 7204 NONAME
- _ZNK10QPictureIO6statusEv @ 7205 NONAME
- _ZNK10QPictureIO7pictureEv @ 7206 NONAME
- _ZNK10QPictureIO7qualityEv @ 7207 NONAME
- _ZNK10QPictureIO8fileNameEv @ 7208 NONAME
- _ZNK10QPictureIO8ioDeviceEv @ 7209 NONAME
- _ZNK10QScrollBar10metaObjectEv @ 7210 NONAME
- _ZNK10QScrollBar15initStyleOptionEP18QStyleOptionSlider @ 7211 NONAME
- _ZNK10QScrollBar8sizeHintEv @ 7212 NONAME
- _ZNK10QStatusBar10metaObjectEv @ 7213 NONAME
- _ZNK10QStatusBar14currentMessageEv @ 7214 NONAME
- _ZNK10QStatusBar17isSizeGripEnabledEv @ 7215 NONAME
- _ZNK10QTabWidget10metaObjectEv @ 7216 NONAME
- _ZNK10QTabWidget10tabToolTipEi @ 7217 NONAME
- _ZNK10QTabWidget11tabPositionEv @ 7218 NONAME
- _ZNK10QTabWidget12cornerWidgetEN2Qt6CornerE @ 7219 NONAME
- _ZNK10QTabWidget12currentIndexEv @ 7220 NONAME
- _ZNK10QTabWidget12documentModeEv @ 7221 NONAME
- _ZNK10QTabWidget12isTabEnabledEi @ 7222 NONAME
- _ZNK10QTabWidget12tabWhatsThisEi @ 7223 NONAME
- _ZNK10QTabWidget12tabsClosableEv @ 7224 NONAME
- _ZNK10QTabWidget13currentWidgetEv @ 7225 NONAME
- _ZNK10QTabWidget15initStyleOptionEP26QStyleOptionTabWidgetFrame @ 7226 NONAME
- _ZNK10QTabWidget15minimumSizeHintEv @ 7227 NONAME
- _ZNK10QTabWidget17usesScrollButtonsEv @ 7228 NONAME
- _ZNK10QTabWidget5countEv @ 7229 NONAME
- _ZNK10QTabWidget6tabBarEv @ 7230 NONAME
- _ZNK10QTabWidget6widgetEi @ 7231 NONAME
- _ZNK10QTabWidget7indexOfEP7QWidget @ 7232 NONAME
- _ZNK10QTabWidget7tabIconEi @ 7233 NONAME
- _ZNK10QTabWidget7tabTextEi @ 7234 NONAME
- _ZNK10QTabWidget8iconSizeEv @ 7235 NONAME
- _ZNK10QTabWidget8sizeHintEv @ 7236 NONAME
- _ZNK10QTabWidget8tabShapeEv @ 7237 NONAME
- _ZNK10QTabWidget9elideModeEv @ 7238 NONAME
- _ZNK10QTabWidget9isMovableEv @ 7239 NONAME
- _ZNK10QTableView10columnSpanEii @ 7240 NONAME
- _ZNK10QTableView10metaObjectEv @ 7241 NONAME
- _ZNK10QTableView10visualRectERK11QModelIndex @ 7242 NONAME
- _ZNK10QTableView11columnWidthEi @ 7243 NONAME
- _ZNK10QTableView11isRowHiddenEi @ 7244 NONAME
- _ZNK10QTableView11viewOptionsEv @ 7245 NONAME
- _ZNK10QTableView11visualIndexERK11QModelIndex @ 7246 NONAME
- _ZNK10QTableView13isIndexHiddenERK11QModelIndex @ 7247 NONAME
- _ZNK10QTableView14isColumnHiddenEi @ 7248 NONAME
- _ZNK10QTableView14sizeHintForRowEi @ 7249 NONAME
- _ZNK10QTableView14verticalHeaderEv @ 7250 NONAME
- _ZNK10QTableView14verticalOffsetEv @ 7251 NONAME
- _ZNK10QTableView15selectedIndexesEv @ 7252 NONAME
- _ZNK10QTableView16horizontalHeaderEv @ 7253 NONAME
- _ZNK10QTableView16horizontalOffsetEv @ 7254 NONAME
- _ZNK10QTableView16isSortingEnabledEv @ 7255 NONAME
- _ZNK10QTableView17sizeHintForColumnEi @ 7256 NONAME
- _ZNK10QTableView19rowViewportPositionEi @ 7257 NONAME
- _ZNK10QTableView21isCornerButtonEnabledEv @ 7258 NONAME
- _ZNK10QTableView22columnViewportPositionEi @ 7259 NONAME
- _ZNK10QTableView24visualRegionForSelectionERK14QItemSelection @ 7260 NONAME
- _ZNK10QTableView5rowAtEi @ 7261 NONAME
- _ZNK10QTableView7indexAtERK6QPoint @ 7262 NONAME
- _ZNK10QTableView7rowSpanEii @ 7263 NONAME
- _ZNK10QTableView8columnAtEi @ 7264 NONAME
- _ZNK10QTableView8showGridEv @ 7265 NONAME
- _ZNK10QTableView8wordWrapEv @ 7266 NONAME
- _ZNK10QTableView9gridStyleEv @ 7267 NONAME
- _ZNK10QTableView9rowHeightEi @ 7268 NONAME
- _ZNK10QTextBlock10charFormatEv @ 7269 NONAME
- _ZNK10QTextBlock11blockFormatEv @ 7270 NONAME
- _ZNK10QTextBlock11blockNumberEv @ 7271 NONAME
- _ZNK10QTextBlock15charFormatIndexEv @ 7272 NONAME
- _ZNK10QTextBlock15firstLineNumberEv @ 7273 NONAME
- _ZNK10QTextBlock16blockFormatIndexEv @ 7274 NONAME
- _ZNK10QTextBlock3endEv @ 7275 NONAME
- _ZNK10QTextBlock4nextEv @ 7276 NONAME
- _ZNK10QTextBlock4textEv @ 7277 NONAME
- _ZNK10QTextBlock5beginEv @ 7278 NONAME
- _ZNK10QTextBlock6layoutEv @ 7279 NONAME
- _ZNK10QTextBlock6lengthEv @ 7280 NONAME
- _ZNK10QTextBlock8containsEi @ 7281 NONAME
- _ZNK10QTextBlock8documentEv @ 7282 NONAME
- _ZNK10QTextBlock8iterator8fragmentEv @ 7283 NONAME
- _ZNK10QTextBlock8positionEv @ 7284 NONAME
- _ZNK10QTextBlock8previousEv @ 7285 NONAME
- _ZNK10QTextBlock8revisionEv @ 7286 NONAME
- _ZNK10QTextBlock8textListEv @ 7287 NONAME
- _ZNK10QTextBlock8userDataEv @ 7288 NONAME
- _ZNK10QTextBlock9isVisibleEv @ 7289 NONAME
- _ZNK10QTextBlock9lineCountEv @ 7290 NONAME
- _ZNK10QTextBlock9userStateEv @ 7291 NONAME
- _ZNK10QTextFrame10layoutDataEv @ 7292 NONAME
- _ZNK10QTextFrame10metaObjectEv @ 7293 NONAME
- _ZNK10QTextFrame11childFramesEv @ 7294 NONAME
- _ZNK10QTextFrame11parentFrameEv @ 7295 NONAME
- _ZNK10QTextFrame12lastPositionEv @ 7296 NONAME
- _ZNK10QTextFrame13firstPositionEv @ 7297 NONAME
- _ZNK10QTextFrame18lastCursorPositionEv @ 7298 NONAME
- _ZNK10QTextFrame19firstCursorPositionEv @ 7299 NONAME
- _ZNK10QTextFrame3endEv @ 7300 NONAME
- _ZNK10QTextFrame5beginEv @ 7301 NONAME
- _ZNK10QTextFrame8iterator12currentBlockEv @ 7302 NONAME
- _ZNK10QTextFrame8iterator12currentFrameEv @ 7303 NONAME
- _ZNK10QTextTable10metaObjectEv @ 7304 NONAME
- _ZNK10QTextTable4rowsEv @ 7305 NONAME
- _ZNK10QTextTable6cellAtERK11QTextCursor @ 7306 NONAME
- _ZNK10QTextTable6cellAtEi @ 7307 NONAME
- _ZNK10QTextTable6cellAtEii @ 7308 NONAME
- _ZNK10QTextTable6rowEndERK11QTextCursor @ 7309 NONAME
- _ZNK10QTextTable7columnsEv @ 7310 NONAME
- _ZNK10QTextTable8rowStartERK11QTextCursor @ 7311 NONAME
- _ZNK10QTransform10transposedEv @ 7312 NONAME
- _ZNK10QTransform12mapToPolygonERK5QRect @ 7313 NONAME
- _ZNK10QTransform3mapERK12QPainterPath @ 7314 NONAME
- _ZNK10QTransform3mapERK5QLine @ 7315 NONAME
- _ZNK10QTransform3mapERK6QLineF @ 7316 NONAME
- _ZNK10QTransform3mapERK6QPoint @ 7317 NONAME
- _ZNK10QTransform3mapERK7QPointF @ 7318 NONAME
- _ZNK10QTransform3mapERK7QRegion @ 7319 NONAME
- _ZNK10QTransform3mapERK8QPolygon @ 7320 NONAME
- _ZNK10QTransform3mapERK9QPolygonF @ 7321 NONAME
- _ZNK10QTransform3mapEffPfS0_ @ 7322 NONAME
- _ZNK10QTransform3mapEiiPiS0_ @ 7323 NONAME
- _ZNK10QTransform4typeEv @ 7324 NONAME
- _ZNK10QTransform7adjointEv @ 7325 NONAME
- _ZNK10QTransform7mapRectERK5QRect @ 7326 NONAME
- _ZNK10QTransform7mapRectERK6QRectF @ 7327 NONAME
- _ZNK10QTransform8invertedEPb @ 7328 NONAME
- _ZNK10QTransform8toAffineEv @ 7329 NONAME
- _ZNK10QTransformcv8QVariantEv @ 7330 NONAME
- _ZNK10QTransformeqERKS_ @ 7331 NONAME
- _ZNK10QTransformmlERKS_ @ 7332 NONAME
- _ZNK10QTransformneERKS_ @ 7333 NONAME
- _ZNK10QUndoGroup10metaObjectEv @ 7334 NONAME
- _ZNK10QUndoGroup11activeStackEv @ 7335 NONAME
- _ZNK10QUndoGroup16createRedoActionEP7QObjectRK7QString @ 7336 NONAME
- _ZNK10QUndoGroup16createUndoActionEP7QObjectRK7QString @ 7337 NONAME
- _ZNK10QUndoGroup6stacksEv @ 7338 NONAME
- _ZNK10QUndoGroup7canRedoEv @ 7339 NONAME
- _ZNK10QUndoGroup7canUndoEv @ 7340 NONAME
- _ZNK10QUndoGroup7isCleanEv @ 7341 NONAME
- _ZNK10QUndoGroup8redoTextEv @ 7342 NONAME
- _ZNK10QUndoGroup8undoTextEv @ 7343 NONAME
- _ZNK10QUndoStack10cleanIndexEv @ 7344 NONAME
- _ZNK10QUndoStack10metaObjectEv @ 7345 NONAME
- _ZNK10QUndoStack16createRedoActionEP7QObjectRK7QString @ 7346 NONAME
- _ZNK10QUndoStack16createUndoActionEP7QObjectRK7QString @ 7347 NONAME
- _ZNK10QUndoStack4textEi @ 7348 NONAME
- _ZNK10QUndoStack5countEv @ 7349 NONAME
- _ZNK10QUndoStack5indexEv @ 7350 NONAME
- _ZNK10QUndoStack7canRedoEv @ 7351 NONAME
- _ZNK10QUndoStack7canUndoEv @ 7352 NONAME
- _ZNK10QUndoStack7commandEi @ 7353 NONAME
- _ZNK10QUndoStack7isCleanEv @ 7354 NONAME
- _ZNK10QUndoStack8isActiveEv @ 7355 NONAME
- _ZNK10QUndoStack8redoTextEv @ 7356 NONAME
- _ZNK10QUndoStack8undoTextEv @ 7357 NONAME
- _ZNK10QUndoStack9undoLimitEv @ 7358 NONAME
- _ZNK10QValidator10metaObjectEv @ 7359 NONAME
- _ZNK10QValidator5fixupER7QString @ 7360 NONAME
- _ZNK10QValidator6localeEv @ 7361 NONAME
- _ZNK10QWorkspace10backgroundEv @ 7362 NONAME
- _ZNK10QWorkspace10metaObjectEv @ 7363 NONAME
- _ZNK10QWorkspace10windowListENS_11WindowOrderE @ 7364 NONAME
- _ZNK10QWorkspace12activeWindowEv @ 7365 NONAME
- _ZNK10QWorkspace17scrollBarsEnabledEv @ 7366 NONAME
- _ZNK10QWorkspace8sizeHintEv @ 7367 NONAME
- _ZNK10QZipReader10extractAllERK7QString @ 7368 NONAME
- _ZNK10QZipReader10isReadableEv @ 7369 NONAME
- _ZNK10QZipReader11entryInfoAtEi @ 7370 NONAME
- _ZNK10QZipReader12fileInfoListEv @ 7371 NONAME
- _ZNK10QZipReader5countEv @ 7372 NONAME
- _ZNK10QZipReader6existsEv @ 7373 NONAME
- _ZNK10QZipReader6statusEv @ 7374 NONAME
- _ZNK10QZipReader8fileDataERK7QString @ 7375 NONAME
- _ZNK10QZipWriter10isWritableEv @ 7376 NONAME
- _ZNK10QZipWriter17compressionPolicyEv @ 7377 NONAME
- _ZNK10QZipWriter19creationPermissionsEv @ 7378 NONAME
- _ZNK10QZipWriter6existsEv @ 7379 NONAME
- _ZNK10QZipWriter6statusEv @ 7380 NONAME
- _ZNK11QColumnView10metaObjectEv @ 7381 NONAME
- _ZNK11QColumnView10visualRectERK11QModelIndex @ 7382 NONAME
- _ZNK11QColumnView12columnWidthsEv @ 7383 NONAME
- _ZNK11QColumnView13isIndexHiddenERK11QModelIndex @ 7384 NONAME
- _ZNK11QColumnView13previewWidgetEv @ 7385 NONAME
- _ZNK11QColumnView14verticalOffsetEv @ 7386 NONAME
- _ZNK11QColumnView16horizontalOffsetEv @ 7387 NONAME
- _ZNK11QColumnView16initializeColumnEP17QAbstractItemView @ 7388 NONAME
- _ZNK11QColumnView18resizeGripsVisibleEv @ 7389 NONAME
- _ZNK11QColumnView24visualRegionForSelectionERK14QItemSelection @ 7390 NONAME
- _ZNK11QColumnView7indexAtERK6QPoint @ 7391 NONAME
- _ZNK11QColumnView8sizeHintEv @ 7392 NONAME
- _ZNK11QDockWidget10metaObjectEv @ 7393 NONAME
- _ZNK11QDockWidget12allowedAreasEv @ 7394 NONAME
- _ZNK11QDockWidget14titleBarWidgetEv @ 7395 NONAME
- _ZNK11QDockWidget15initStyleOptionEP22QStyleOptionDockWidget @ 7396 NONAME
- _ZNK11QDockWidget16toggleViewActionEv @ 7397 NONAME
- _ZNK11QDockWidget6widgetEv @ 7398 NONAME
- _ZNK11QDockWidget8featuresEv @ 7399 NONAME
- _ZNK11QFileDialog10acceptModeEv @ 7400 NONAME
- _ZNK11QFileDialog10isReadOnlyEv @ 7401 NONAME
- _ZNK11QFileDialog10metaObjectEv @ 7402 NONAME
- _ZNK11QFileDialog10proxyModelEv @ 7403 NONAME
- _ZNK11QFileDialog10testOptionENS_6OptionE @ 7404 NONAME
- _ZNK11QFileDialog11nameFiltersEv @ 7405 NONAME
- _ZNK11QFileDialog11sidebarUrlsEv @ 7406 NONAME
- _ZNK11QFileDialog12iconProviderEv @ 7407 NONAME
- _ZNK11QFileDialog12itemDelegateEv @ 7408 NONAME
- _ZNK11QFileDialog13defaultSuffixEv @ 7409 NONAME
- _ZNK11QFileDialog13selectedFilesEv @ 7410 NONAME
- _ZNK11QFileDialog14selectedFilterEv @ 7411 NONAME
- _ZNK11QFileDialog15resolveSymlinksEv @ 7412 NONAME
- _ZNK11QFileDialog16confirmOverwriteEv @ 7413 NONAME
- _ZNK11QFileDialog18selectedNameFilterEv @ 7414 NONAME
- _ZNK11QFileDialog26isNameFilterDetailsVisibleEv @ 7415 NONAME
- _ZNK11QFileDialog6filterEv @ 7416 NONAME
- _ZNK11QFileDialog7filtersEv @ 7417 NONAME
- _ZNK11QFileDialog7historyEv @ 7418 NONAME
- _ZNK11QFileDialog7optionsEv @ 7419 NONAME
- _ZNK11QFileDialog8fileModeEv @ 7420 NONAME
- _ZNK11QFileDialog8viewModeEv @ 7421 NONAME
- _ZNK11QFileDialog9directoryEv @ 7422 NONAME
- _ZNK11QFileDialog9labelTextENS_11DialogLabelE @ 7423 NONAME
- _ZNK11QFileDialog9saveStateEv @ 7424 NONAME
- _ZNK11QFocusEvent6reasonEv @ 7425 NONAME
- _ZNK11QFocusFrame10metaObjectEv @ 7426 NONAME
- _ZNK11QFocusFrame15initStyleOptionEP12QStyleOption @ 7427 NONAME
- _ZNK11QFocusFrame6widgetEv @ 7428 NONAME
- _ZNK11QFontDialog10metaObjectEv @ 7429 NONAME
- _ZNK11QFontDialog10testOptionENS_16FontDialogOptionE @ 7430 NONAME
- _ZNK11QFontDialog11currentFontEv @ 7431 NONAME
- _ZNK11QFontDialog12selectedFontEv @ 7432 NONAME
- _ZNK11QFontDialog7optionsEv @ 7433 NONAME
- _ZNK11QFontEngine10glyphCacheEN21QFontEngineGlyphCache4TypeERK10QTransform @ 7434 NONAME
- _ZNK11QFontEngine10glyphCacheEPvRK10QTransform @ 7435 NONAME
- _ZNK11QFontEngine10glyphCountEv @ 7436 NONAME
- _ZNK11QFontEngine10metaObjectEv @ 7437 NONAME ABSENT
- _ZNK11QFontEngine10propertiesEv @ 7438 NONAME
- _ZNK11QFontEngine12getSfntTableEj @ 7439 NONAME
- _ZNK11QFontEngine12harfbuzzFaceEv @ 7440 NONAME
- _ZNK11QFontEngine12harfbuzzFontEv @ 7441 NONAME
- _ZNK11QFontEngine13lineThicknessEv @ 7442 NONAME
- _ZNK11QFontEngine16averageCharWidthEv @ 7443 NONAME
- _ZNK11QFontEngine17underlinePositionEv @ 7444 NONAME
- _ZNK11QFontEngine7xHeightEv @ 7445 NONAME
- _ZNK11QFontEngine9doKerningEP12QGlyphLayout6QFlagsIN11QTextEngine10ShaperFlagEE @ 7446 NONAME
- _ZNK11QFormLayout10metaObjectEv @ 7447 NONAME
- _ZNK11QFormLayout11minimumSizeEv @ 7448 NONAME
- _ZNK11QFormLayout13formAlignmentEv @ 7449 NONAME
- _ZNK11QFormLayout13labelForFieldEP7QLayout @ 7450 NONAME
- _ZNK11QFormLayout13labelForFieldEP7QWidget @ 7451 NONAME
- _ZNK11QFormLayout13rowWrapPolicyEv @ 7452 NONAME
- _ZNK11QFormLayout14heightForWidthEi @ 7453 NONAME
- _ZNK11QFormLayout14labelAlignmentEv @ 7454 NONAME
- _ZNK11QFormLayout15getItemPositionEiPiPNS_8ItemRoleE @ 7455 NONAME
- _ZNK11QFormLayout15verticalSpacingEv @ 7456 NONAME
- _ZNK11QFormLayout17fieldGrowthPolicyEv @ 7457 NONAME
- _ZNK11QFormLayout17getLayoutPositionEP7QLayoutPiPNS_8ItemRoleE @ 7458 NONAME
- _ZNK11QFormLayout17getWidgetPositionEP7QWidgetPiPNS_8ItemRoleE @ 7459 NONAME
- _ZNK11QFormLayout17hasHeightForWidthEv @ 7460 NONAME
- _ZNK11QFormLayout17horizontalSpacingEv @ 7461 NONAME
- _ZNK11QFormLayout19expandingDirectionsEv @ 7462 NONAME
- _ZNK11QFormLayout5countEv @ 7463 NONAME
- _ZNK11QFormLayout6itemAtEi @ 7464 NONAME
- _ZNK11QFormLayout6itemAtEiNS_8ItemRoleE @ 7465 NONAME
- _ZNK11QFormLayout7spacingEv @ 7466 NONAME
- _ZNK11QFormLayout8rowCountEv @ 7467 NONAME
- _ZNK11QFormLayout8sizeHintEv @ 7468 NONAME
- _ZNK11QGridLayout10metaObjectEv @ 7469 NONAME
- _ZNK11QGridLayout10rowStretchEi @ 7470 NONAME
- _ZNK11QGridLayout11columnCountEv @ 7471 NONAME
- _ZNK11QGridLayout11maximumSizeEv @ 7472 NONAME
- _ZNK11QGridLayout11minimumSizeEv @ 7473 NONAME
- _ZNK11QGridLayout12originCornerEv @ 7474 NONAME
- _ZNK11QGridLayout13columnStretchEi @ 7475 NONAME
- _ZNK11QGridLayout14heightForWidthEi @ 7476 NONAME
- _ZNK11QGridLayout14itemAtPositionEii @ 7477 NONAME
- _ZNK11QGridLayout15verticalSpacingEv @ 7478 NONAME
- _ZNK11QGridLayout16rowMinimumHeightEi @ 7479 NONAME
- _ZNK11QGridLayout17hasHeightForWidthEv @ 7480 NONAME
- _ZNK11QGridLayout17horizontalSpacingEv @ 7481 NONAME
- _ZNK11QGridLayout18columnMinimumWidthEi @ 7482 NONAME
- _ZNK11QGridLayout19expandingDirectionsEv @ 7483 NONAME
- _ZNK11QGridLayout21minimumHeightForWidthEi @ 7484 NONAME
- _ZNK11QGridLayout5countEv @ 7485 NONAME
- _ZNK11QGridLayout6itemAtEi @ 7486 NONAME
- _ZNK11QGridLayout7spacingEv @ 7487 NONAME
- _ZNK11QGridLayout8cellRectEii @ 7488 NONAME
- _ZNK11QGridLayout8rowCountEv @ 7489 NONAME
- _ZNK11QGridLayout8sizeHintEv @ 7490 NONAME
- _ZNK11QHBoxLayout10metaObjectEv @ 7491 NONAME
- _ZNK11QHeaderView10metaObjectEv @ 7492 NONAME
- _ZNK11QHeaderView10resizeModeEi @ 7493 NONAME
- _ZNK11QHeaderView10visualRectERK11QModelIndex @ 7494 NONAME
- _ZNK11QHeaderView11isClickableEv @ 7495 NONAME
- _ZNK11QHeaderView11orientationEv @ 7496 NONAME
- _ZNK11QHeaderView11sectionSizeEi @ 7497 NONAME
- _ZNK11QHeaderView11visualIndexEi @ 7498 NONAME
- _ZNK11QHeaderView12logicalIndexEi @ 7499 NONAME
- _ZNK11QHeaderView12paintSectionEP8QPainterRK5QRecti @ 7500 NONAME
- _ZNK11QHeaderView13isIndexHiddenERK11QModelIndex @ 7501 NONAME
- _ZNK11QHeaderView13sectionsMovedEv @ 7502 NONAME
- _ZNK11QHeaderView13visualIndexAtEi @ 7503 NONAME
- _ZNK11QHeaderView14logicalIndexAtEi @ 7504 NONAME
- _ZNK11QHeaderView14sectionsHiddenEv @ 7505 NONAME
- _ZNK11QHeaderView14verticalOffsetEv @ 7506 NONAME
- _ZNK11QHeaderView15initStyleOptionEP18QStyleOptionHeader @ 7507 NONAME
- _ZNK11QHeaderView15isSectionHiddenEi @ 7508 NONAME
- _ZNK11QHeaderView15sectionPositionEi @ 7509 NONAME
- _ZNK11QHeaderView15sectionSizeHintEi @ 7510 NONAME
- _ZNK11QHeaderView16defaultAlignmentEv @ 7511 NONAME
- _ZNK11QHeaderView16horizontalOffsetEv @ 7512 NONAME
- _ZNK11QHeaderView17highlightSectionsEv @ 7513 NONAME
- _ZNK11QHeaderView18defaultSectionSizeEv @ 7514 NONAME
- _ZNK11QHeaderView18hiddenSectionCountEv @ 7515 NONAME
- _ZNK11QHeaderView18minimumSectionSizeEv @ 7516 NONAME
- _ZNK11QHeaderView18sortIndicatorOrderEv @ 7517 NONAME
- _ZNK11QHeaderView18stretchLastSectionEv @ 7518 NONAME
- _ZNK11QHeaderView19stretchSectionCountEv @ 7519 NONAME
- _ZNK11QHeaderView20isSortIndicatorShownEv @ 7520 NONAME
- _ZNK11QHeaderView20sortIndicatorSectionEv @ 7521 NONAME
- _ZNK11QHeaderView23cascadingSectionResizesEv @ 7522 NONAME
- _ZNK11QHeaderView23sectionSizeFromContentsEi @ 7523 NONAME
- _ZNK11QHeaderView23sectionViewportPositionEi @ 7524 NONAME
- _ZNK11QHeaderView24visualRegionForSelectionERK14QItemSelection @ 7525 NONAME
- _ZNK11QHeaderView5countEv @ 7526 NONAME
- _ZNK11QHeaderView6lengthEv @ 7527 NONAME
- _ZNK11QHeaderView6offsetEv @ 7528 NONAME
- _ZNK11QHeaderView7indexAtERK6QPoint @ 7529 NONAME
- _ZNK11QHeaderView8sizeHintEv @ 7530 NONAME
- _ZNK11QHeaderView9isMovableEv @ 7531 NONAME
- _ZNK11QHeaderView9saveStateEv @ 7532 NONAME
- _ZNK11QLayoutItem12controlTypesEv @ 7533 NONAME
- _ZNK11QLayoutItem14heightForWidthEi @ 7534 NONAME
- _ZNK11QLayoutItem17hasHeightForWidthEv @ 7535 NONAME
- _ZNK11QLayoutItem21minimumHeightForWidthEi @ 7536 NONAME
- _ZNK11QListWidget10currentRowEv @ 7537 NONAME
- _ZNK11QListWidget10itemWidgetEP15QListWidgetItem @ 7538 NONAME
- _ZNK11QListWidget10metaObjectEv @ 7539 NONAME
- _ZNK11QListWidget11currentItemEv @ 7540 NONAME
- _ZNK11QListWidget12isItemHiddenEPK15QListWidgetItem @ 7541 NONAME
- _ZNK11QListWidget13indexFromItemEP15QListWidgetItem @ 7542 NONAME
- _ZNK11QListWidget13itemFromIndexERK11QModelIndex @ 7543 NONAME
- _ZNK11QListWidget13selectedItemsEv @ 7544 NONAME
- _ZNK11QListWidget14isItemSelectedEPK15QListWidgetItem @ 7545 NONAME
- _ZNK11QListWidget14visualItemRectEPK15QListWidgetItem @ 7546 NONAME
- _ZNK11QListWidget16isSortingEnabledEv @ 7547 NONAME
- _ZNK11QListWidget20supportedDropActionsEv @ 7548 NONAME
- _ZNK11QListWidget3rowEPK15QListWidgetItem @ 7549 NONAME
- _ZNK11QListWidget4itemEi @ 7550 NONAME
- _ZNK11QListWidget5countEv @ 7551 NONAME
- _ZNK11QListWidget5itemsEPK9QMimeData @ 7552 NONAME
- _ZNK11QListWidget6itemAtERK6QPoint @ 7553 NONAME
- _ZNK11QListWidget8mimeDataE5QListIP15QListWidgetItemE @ 7554 NONAME
- _ZNK11QListWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEE @ 7555 NONAME
- _ZNK11QListWidget9mimeTypesEv @ 7556 NONAME
- _ZNK11QListWidget9sortOrderEv @ 7557 NONAME
- _ZNK11QMainWindow10isAnimatedEv @ 7558 NONAME
- _ZNK11QMainWindow10menuWidgetEv @ 7559 NONAME
- _ZNK11QMainWindow10metaObjectEv @ 7560 NONAME
- _ZNK11QMainWindow11dockOptionsEv @ 7561 NONAME
- _ZNK11QMainWindow11isSeparatorERK6QPoint @ 7562 NONAME
- _ZNK11QMainWindow11tabPositionEN2Qt14DockWidgetAreaE @ 7563 NONAME
- _ZNK11QMainWindow11toolBarAreaEP8QToolBar @ 7564 NONAME
- _ZNK11QMainWindow12documentModeEv @ 7565 NONAME
- _ZNK11QMainWindow12toolBarBreakEP8QToolBar @ 7566 NONAME
- _ZNK11QMainWindow13centralWidgetEv @ 7567 NONAME
- _ZNK11QMainWindow14dockWidgetAreaEP11QDockWidget @ 7568 NONAME
- _ZNK11QMainWindow15toolButtonStyleEv @ 7569 NONAME
- _ZNK11QMainWindow19tabifiedDockWidgetsEP11QDockWidget @ 7570 NONAME
- _ZNK11QMainWindow20isDockNestingEnabledEv @ 7571 NONAME
- _ZNK11QMainWindow27unifiedTitleAndToolBarOnMacEv @ 7572 NONAME
- _ZNK11QMainWindow6cornerEN2Qt6CornerE @ 7573 NONAME
- _ZNK11QMainWindow7menuBarEv @ 7574 NONAME
- _ZNK11QMainWindow8iconSizeEv @ 7575 NONAME
- _ZNK11QMainWindow8tabShapeEv @ 7576 NONAME
- _ZNK11QMainWindow9saveStateEi @ 7577 NONAME
- _ZNK11QMainWindow9statusBarEv @ 7578 NONAME
- _ZNK11QMessageBox10buttonRoleEP15QAbstractButton @ 7579 NONAME
- _ZNK11QMessageBox10buttonTextEi @ 7580 NONAME
- _ZNK11QMessageBox10iconPixmapEv @ 7581 NONAME
- _ZNK11QMessageBox10metaObjectEv @ 7582 NONAME
- _ZNK11QMessageBox10textFormatEv @ 7583 NONAME
- _ZNK11QMessageBox12detailedTextEv @ 7584 NONAME
- _ZNK11QMessageBox12escapeButtonEv @ 7585 NONAME
- _ZNK11QMessageBox13clickedButtonEv @ 7586 NONAME
- _ZNK11QMessageBox13defaultButtonEv @ 7587 NONAME
- _ZNK11QMessageBox14standardButtonEP15QAbstractButton @ 7588 NONAME
- _ZNK11QMessageBox15informativeTextEv @ 7589 NONAME
- _ZNK11QMessageBox15standardButtonsEv @ 7590 NONAME
- _ZNK11QMessageBox4iconEv @ 7591 NONAME
- _ZNK11QMessageBox4textEv @ 7592 NONAME
- _ZNK11QMessageBox6buttonENS_14StandardButtonE @ 7593 NONAME
- _ZNK11QMessageBox7buttonsEv @ 7594 NONAME
- _ZNK11QMessageBox8sizeHintEv @ 7595 NONAME
- _ZNK11QMimeSource8providesEPKc @ 7596 NONAME
- _ZNK11QMouseEvent4posFEv @ 7597 NONAME
- _ZNK11QPixmapData11transformedERK10QTransformN2Qt18TransformationModeE @ 7598 NONAME
- _ZNK11QPixmapData12alphaChannelEv @ 7599 NONAME
- _ZNK11QPixmapData4maskEv @ 7600 NONAME
- _ZNK11QProxyModel10headerDataEiN2Qt11OrientationEi @ 7601 NONAME
- _ZNK11QProxyModel10metaObjectEv @ 7602 NONAME
- _ZNK11QProxyModel11columnCountERK11QModelIndex @ 7603 NONAME
- _ZNK11QProxyModel11hasChildrenERK11QModelIndex @ 7604 NONAME
- _ZNK11QProxyModel13setProxyModelERK11QModelIndex @ 7605 NONAME
- _ZNK11QProxyModel14connectToModelEPK18QAbstractItemModel @ 7606 NONAME
- _ZNK11QProxyModel14setSourceModelERK11QModelIndex @ 7607 NONAME
- _ZNK11QProxyModel19disconnectFromModelEPK18QAbstractItemModel @ 7608 NONAME
- _ZNK11QProxyModel20supportedDropActionsEv @ 7609 NONAME
- _ZNK11QProxyModel4dataERK11QModelIndexi @ 7610 NONAME
- _ZNK11QProxyModel4spanERK11QModelIndex @ 7611 NONAME
- _ZNK11QProxyModel5flagsERK11QModelIndex @ 7612 NONAME
- _ZNK11QProxyModel5indexEiiRK11QModelIndex @ 7613 NONAME
- _ZNK11QProxyModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 7614 NONAME
- _ZNK11QProxyModel5modelEv @ 7615 NONAME
- _ZNK11QProxyModel6parentERK11QModelIndex @ 7616 NONAME
- _ZNK11QProxyModel8mimeDataERK5QListI11QModelIndexE @ 7617 NONAME
- _ZNK11QProxyModel8rowCountERK11QModelIndex @ 7618 NONAME
- _ZNK11QProxyModel9mimeTypesEv @ 7619 NONAME
- _ZNK11QPushButton10metaObjectEv @ 7620 NONAME
- _ZNK11QPushButton11autoDefaultEv @ 7621 NONAME
- _ZNK11QPushButton15initStyleOptionEP18QStyleOptionButton @ 7622 NONAME
- _ZNK11QPushButton15minimumSizeHintEv @ 7623 NONAME
- _ZNK11QPushButton4menuEv @ 7624 NONAME
- _ZNK11QPushButton6isFlatEv @ 7625 NONAME
- _ZNK11QPushButton8sizeHintEv @ 7626 NONAME
- _ZNK11QPushButton9isDefaultEv @ 7627 NONAME
- _ZNK11QRubberBand10metaObjectEv @ 7628 NONAME
- _ZNK11QRubberBand15initStyleOptionEP22QStyleOptionRubberBand @ 7629 NONAME
- _ZNK11QRubberBand5shapeEv @ 7630 NONAME
- _ZNK11QScrollArea10metaObjectEv @ 7631 NONAME
- _ZNK11QScrollArea15widgetResizableEv @ 7632 NONAME
- _ZNK11QScrollArea6widgetEv @ 7633 NONAME
- _ZNK11QScrollArea8sizeHintEv @ 7634 NONAME
- _ZNK11QScrollArea9alignmentEv @ 7635 NONAME
- _ZNK11QSizePolicy11controlTypeEv @ 7636 NONAME
- _ZNK11QSizePolicycv8QVariantEv @ 7637 NONAME
- _ZNK11QSpacerItem11maximumSizeEv @ 7638 NONAME
- _ZNK11QSpacerItem11minimumSizeEv @ 7639 NONAME
- _ZNK11QSpacerItem19expandingDirectionsEv @ 7640 NONAME
- _ZNK11QSpacerItem7isEmptyEv @ 7641 NONAME
- _ZNK11QSpacerItem8geometryEv @ 7642 NONAME
- _ZNK11QSpacerItem8sizeHintEv @ 7643 NONAME
- _ZNK11QTextCursor10atBlockEndEv @ 7644 NONAME
- _ZNK11QTextCursor10charFormatEv @ 7645 NONAME
- _ZNK11QTextCursor11blockFormatEv @ 7646 NONAME
- _ZNK11QTextCursor11blockNumberEv @ 7647 NONAME
- _ZNK11QTextCursor11currentListEv @ 7648 NONAME
- _ZNK11QTextCursor12atBlockStartEv @ 7649 NONAME
- _ZNK11QTextCursor12columnNumberEv @ 7650 NONAME
- _ZNK11QTextCursor12currentFrameEv @ 7651 NONAME
- _ZNK11QTextCursor12currentTableEv @ 7652 NONAME
- _ZNK11QTextCursor12hasSelectionEv @ 7653 NONAME
- _ZNK11QTextCursor12selectedTextEv @ 7654 NONAME
- _ZNK11QTextCursor12selectionEndEv @ 7655 NONAME
- _ZNK11QTextCursor14selectionStartEv @ 7656 NONAME
- _ZNK11QTextCursor15blockCharFormatEv @ 7657 NONAME
- _ZNK11QTextCursor16visualNavigationEv @ 7658 NONAME
- _ZNK11QTextCursor18selectedTableCellsEPiS0_S0_S0_ @ 7659 NONAME
- _ZNK11QTextCursor19hasComplexSelectionEv @ 7660 NONAME
- _ZNK11QTextCursor5atEndEv @ 7661 NONAME
- _ZNK11QTextCursor5blockEv @ 7662 NONAME
- _ZNK11QTextCursor6anchorEv @ 7663 NONAME
- _ZNK11QTextCursor6isNullEv @ 7664 NONAME
- _ZNK11QTextCursor7atStartEv @ 7665 NONAME
- _ZNK11QTextCursor8documentEv @ 7666 NONAME
- _ZNK11QTextCursor8isCopyOfERKS_ @ 7667 NONAME
- _ZNK11QTextCursor8positionEv @ 7668 NONAME
- _ZNK11QTextCursor9selectionEv @ 7669 NONAME
- _ZNK11QTextCursoreqERKS_ @ 7670 NONAME
- _ZNK11QTextCursorgeERKS_ @ 7671 NONAME
- _ZNK11QTextCursorgtERKS_ @ 7672 NONAME
- _ZNK11QTextCursorleERKS_ @ 7673 NONAME
- _ZNK11QTextCursorltERKS_ @ 7674 NONAME
- _ZNK11QTextCursorneERKS_ @ 7675 NONAME
- _ZNK11QTextEngine10attributesEv @ 7676 NONAME
- _ZNK11QTextEngine10elidedTextEN2Qt13TextElideModeERK6QFixedi @ 7677 NONAME
- _ZNK11QTextEngine10fontEngineERK11QScriptItemP6QFixedS4_ @ 7678 NONAME
- _ZNK11QTextEngine11boundingBoxEii @ 7679 NONAME
- _ZNK11QTextEngine11formatIndexEPK11QScriptItem @ 7680 NONAME
- _ZNK11QTextEngine11setBoundaryEi @ 7681 NONAME
- _ZNK11QTextEngine15atWordSeparatorEi @ 7682 NONAME
- _ZNK11QTextEngine16tightBoundingBoxEii @ 7683 NONAME
- _ZNK11QTextEngine17calculateTabWidthEi6QFixed @ 7684 NONAME
- _ZNK11QTextEngine21addRequiredBoundariesEv @ 7685 NONAME
- _ZNK11QTextEngine21shapeTextWithHarfbuzzEi @ 7686 NONAME
- _ZNK11QTextEngine24resolveAdditionalFormatsEv @ 7687 NONAME
- _ZNK11QTextEngine4fontERK11QScriptItem @ 7688 NONAME
- _ZNK11QTextEngine5shapeEi @ 7689 NONAME
- _ZNK11QTextEngine5widthEii @ 7690 NONAME
- _ZNK11QTextEngine6formatEPK11QScriptItem @ 7691 NONAME
- _ZNK11QTextEngine7atSpaceEi @ 7692 NONAME
- _ZNK11QTextEngine7itemizeEv @ 7693 NONAME
- _ZNK11QTextEngine8findItemEi @ 7694 NONAME
- _ZNK11QTextEngine8validateEv @ 7695 NONAME
- _ZNK11QTextEngine9shapeTextEi @ 7696 NONAME
- _ZNK11QTextEngine9splitItemEii @ 7697 NONAME
- _ZNK11QTextFormat10propertiesEv @ 7698 NONAME
- _ZNK11QTextFormat11hasPropertyEi @ 7699 NONAME
- _ZNK11QTextFormat11intPropertyEi @ 7700 NONAME
- _ZNK11QTextFormat11objectIndexEv @ 7701 NONAME
- _ZNK11QTextFormat11penPropertyEi @ 7702 NONAME
- _ZNK11QTextFormat12boolPropertyEi @ 7703 NONAME
- _ZNK11QTextFormat12toCharFormatEv @ 7704 NONAME
- _ZNK11QTextFormat12toListFormatEv @ 7705 NONAME
- _ZNK11QTextFormat13brushPropertyEi @ 7706 NONAME
- _ZNK11QTextFormat13colorPropertyEi @ 7707 NONAME
- _ZNK11QTextFormat13propertyCountEv @ 7708 NONAME
- _ZNK11QTextFormat13toBlockFormatEv @ 7709 NONAME
- _ZNK11QTextFormat13toFrameFormatEv @ 7710 NONAME
- _ZNK11QTextFormat13toImageFormatEv @ 7711 NONAME
- _ZNK11QTextFormat13toTableFormatEv @ 7712 NONAME
- _ZNK11QTextFormat14doublePropertyEi @ 7713 NONAME
- _ZNK11QTextFormat14lengthPropertyEi @ 7714 NONAME
- _ZNK11QTextFormat14stringPropertyEi @ 7715 NONAME
- _ZNK11QTextFormat17toTableCellFormatEv @ 7716 NONAME
- _ZNK11QTextFormat20lengthVectorPropertyEi @ 7717 NONAME
- _ZNK11QTextFormat4typeEv @ 7718 NONAME
- _ZNK11QTextFormat8propertyEi @ 7719 NONAME
- _ZNK11QTextFormatcv8QVariantEv @ 7720 NONAME
- _ZNK11QTextFormateqERKS_ @ 7721 NONAME
- _ZNK11QTextLayout10drawCursorEP8QPainterRK7QPointFi @ 7722 NONAME
- _ZNK11QTextLayout10drawCursorEP8QPainterRK7QPointFii @ 7723 NONAME
- _ZNK11QTextLayout10textOptionEv @ 7724 NONAME
- _ZNK11QTextLayout12boundingRectEv @ 7725 NONAME
- _ZNK11QTextLayout12cacheEnabledEv @ 7726 NONAME
- _ZNK11QTextLayout12maximumWidthEv @ 7727 NONAME
- _ZNK11QTextLayout12minimumWidthEv @ 7728 NONAME
- _ZNK11QTextLayout15preeditAreaTextEv @ 7729 NONAME
- _ZNK11QTextLayout17additionalFormatsEv @ 7730 NONAME
- _ZNK11QTextLayout18nextCursorPositionEiNS_10CursorModeE @ 7731 NONAME
- _ZNK11QTextLayout19lineForTextPositionEi @ 7732 NONAME
- _ZNK11QTextLayout19preeditAreaPositionEv @ 7733 NONAME
- _ZNK11QTextLayout21isValidCursorPositionEi @ 7734 NONAME
- _ZNK11QTextLayout22previousCursorPositionEiNS_10CursorModeE @ 7735 NONAME
- _ZNK11QTextLayout4drawEP8QPainterRK7QPointFRK7QVectorINS_11FormatRangeEERK6QRectF @ 7736 NONAME
- _ZNK11QTextLayout4fontEv @ 7737 NONAME
- _ZNK11QTextLayout4textEv @ 7738 NONAME
- _ZNK11QTextLayout6lineAtEi @ 7739 NONAME
- _ZNK11QTextLayout8positionEv @ 7740 NONAME
- _ZNK11QTextLayout9lineCountEv @ 7741 NONAME
- _ZNK11QTextLengthcv8QVariantEv @ 7742 NONAME
- _ZNK11QTextObject10metaObjectEv @ 7743 NONAME
- _ZNK11QTextObject11formatIndexEv @ 7744 NONAME
- _ZNK11QTextObject11objectIndexEv @ 7745 NONAME
- _ZNK11QTextObject6formatEv @ 7746 NONAME
- _ZNK11QTextObject8documentEv @ 7747 NONAME
- _ZNK11QTextObject9docHandleEv @ 7748 NONAME
- _ZNK11QTextOption4tabsEv @ 7749 NONAME
- _ZNK11QTextOption8tabArrayEv @ 7750 NONAME
- _ZNK11QToolButton10metaObjectEv @ 7751 NONAME
- _ZNK11QToolButton13defaultActionEv @ 7752 NONAME
- _ZNK11QToolButton15initStyleOptionEP22QStyleOptionToolButton @ 7753 NONAME
- _ZNK11QToolButton15minimumSizeHintEv @ 7754 NONAME
- _ZNK11QToolButton15toolButtonStyleEv @ 7755 NONAME
- _ZNK11QToolButton4menuEv @ 7756 NONAME
- _ZNK11QToolButton8sizeHintEv @ 7757 NONAME
- _ZNK11QToolButton9arrowTypeEv @ 7758 NONAME
- _ZNK11QToolButton9autoRaiseEv @ 7759 NONAME
- _ZNK11QToolButton9hitButtonERK6QPoint @ 7760 NONAME
- _ZNK11QToolButton9popupModeEv @ 7761 NONAME
- _ZNK11QTreeWidget10headerItemEv @ 7762 NONAME
- _ZNK11QTreeWidget10itemWidgetEP15QTreeWidgetItemi @ 7763 NONAME
- _ZNK11QTreeWidget10metaObjectEv @ 7764 NONAME
- _ZNK11QTreeWidget10sortColumnEv @ 7765 NONAME
- _ZNK11QTreeWidget11columnCountEv @ 7766 NONAME
- _ZNK11QTreeWidget11currentItemEv @ 7767 NONAME
- _ZNK11QTreeWidget12isItemHiddenEPK15QTreeWidgetItem @ 7768 NONAME
- _ZNK11QTreeWidget12topLevelItemEi @ 7769 NONAME
- _ZNK11QTreeWidget13currentColumnEv @ 7770 NONAME
- _ZNK11QTreeWidget13indexFromItemEP15QTreeWidgetItemi @ 7771 NONAME
- _ZNK11QTreeWidget13itemFromIndexERK11QModelIndex @ 7772 NONAME
- _ZNK11QTreeWidget13selectedItemsEv @ 7773 NONAME
- _ZNK11QTreeWidget14isItemExpandedEPK15QTreeWidgetItem @ 7774 NONAME
- _ZNK11QTreeWidget14isItemSelectedEPK15QTreeWidgetItem @ 7775 NONAME
- _ZNK11QTreeWidget14visualItemRectEPK15QTreeWidgetItem @ 7776 NONAME
- _ZNK11QTreeWidget16isSortingEnabledEv @ 7777 NONAME
- _ZNK11QTreeWidget17invisibleRootItemEv @ 7778 NONAME
- _ZNK11QTreeWidget17topLevelItemCountEv @ 7779 NONAME
- _ZNK11QTreeWidget19indexOfTopLevelItemEP15QTreeWidgetItem @ 7780 NONAME
- _ZNK11QTreeWidget20supportedDropActionsEv @ 7781 NONAME
- _ZNK11QTreeWidget24isFirstItemColumnSpannedEPK15QTreeWidgetItem @ 7782 NONAME
- _ZNK11QTreeWidget5itemsEPK9QMimeData @ 7783 NONAME
- _ZNK11QTreeWidget6itemAtERK6QPoint @ 7784 NONAME
- _ZNK11QTreeWidget8mimeDataE5QListIP15QTreeWidgetItemE @ 7785 NONAME
- _ZNK11QTreeWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEEi @ 7786 NONAME
- _ZNK11QTreeWidget9itemAboveEPK15QTreeWidgetItem @ 7787 NONAME
- _ZNK11QTreeWidget9itemBelowEPK15QTreeWidgetItem @ 7788 NONAME
- _ZNK11QTreeWidget9mimeTypesEv @ 7789 NONAME
- _ZNK11QVBoxLayout10metaObjectEv @ 7790 NONAME
- _ZNK11QVectorPath16controlPointRectEv @ 7791 NONAME
- _ZNK11QWidgetItem11maximumSizeEv @ 7792 NONAME
- _ZNK11QWidgetItem11minimumSizeEv @ 7793 NONAME
- _ZNK11QWidgetItem14heightForWidthEi @ 7794 NONAME
- _ZNK11QWidgetItem17hasHeightForWidthEv @ 7795 NONAME
- _ZNK11QWidgetItem19expandingDirectionsEv @ 7796 NONAME
- _ZNK11QWidgetItem7isEmptyEv @ 7797 NONAME
- _ZNK11QWidgetItem8geometryEv @ 7798 NONAME
- _ZNK11QWidgetItem8sizeHintEv @ 7799 NONAME
- _ZNK11QWingedEdge16findInsertStatusEii @ 7800 NONAME
- _ZNK11QWingedEdge4nextERKNS_15TraversalStatusE @ 7801 NONAME
- _ZNK11QWingedEdge5deltaEiii @ 7802 NONAME
- _ZNK11QWingedEdge6toPathEv @ 7803 NONAME
- _ZNK11QWingedEdge8isInsideEff @ 7804 NONAME
- _ZNK11QWizardPage10buttonTextEN7QWizard12WizardButtonE @ 7805 NONAME
- _ZNK11QWizardPage10isCompleteEv @ 7806 NONAME
- _ZNK11QWizardPage10metaObjectEv @ 7807 NONAME
- _ZNK11QWizardPage11isFinalPageEv @ 7808 NONAME
- _ZNK11QWizardPage12isCommitPageEv @ 7809 NONAME
- _ZNK11QWizardPage5fieldERK7QString @ 7810 NONAME
- _ZNK11QWizardPage5titleEv @ 7811 NONAME
- _ZNK11QWizardPage6nextIdEv @ 7812 NONAME
- _ZNK11QWizardPage6pixmapEN7QWizard12WizardPixmapE @ 7813 NONAME
- _ZNK11QWizardPage6wizardEv @ 7814 NONAME
- _ZNK11QWizardPage8subTitleEv @ 7815 NONAME
- _ZNK12QActionGroup10metaObjectEv @ 7816 NONAME
- _ZNK12QActionGroup11isExclusiveEv @ 7817 NONAME
- _ZNK12QActionGroup13checkedActionEv @ 7818 NONAME
- _ZNK12QActionGroup7actionsEv @ 7819 NONAME
- _ZNK12QActionGroup9isEnabledEv @ 7820 NONAME
- _ZNK12QActionGroup9isVisibleEv @ 7821 NONAME
- _ZNK12QApplication10metaObjectEv @ 7822 NONAME
- _ZNK12QApplication10sessionKeyEv @ 7823 NONAME
- _ZNK12QApplication10styleSheetEv @ 7824 NONAME
- _ZNK12QApplication12inputContextEv @ 7825 NONAME
- _ZNK12QApplication14autoSipEnabledEv @ 7826 NONAME
- _ZNK12QApplication17isSessionRestoredEv @ 7827 NONAME
- _ZNK12QApplication9sessionIdEv @ 7828 NONAME
- _ZNK12QButtonGroup10metaObjectEv @ 7829 NONAME
- _ZNK12QButtonGroup13checkedButtonEv @ 7830 NONAME
- _ZNK12QButtonGroup2idEP15QAbstractButton @ 7831 NONAME
- _ZNK12QButtonGroup6buttonEi @ 7832 NONAME
- _ZNK12QButtonGroup7buttonsEv @ 7833 NONAME
- _ZNK12QButtonGroup9checkedIdEv @ 7834 NONAME
- _ZNK12QButtonGroup9exclusiveEv @ 7835 NONAME
- _ZNK12QColorDialog10metaObjectEv @ 7836 NONAME
- _ZNK12QColorDialog10testOptionENS_17ColorDialogOptionE @ 7837 NONAME
- _ZNK12QColorDialog12currentColorEv @ 7838 NONAME
- _ZNK12QColorDialog13selectedColorEv @ 7839 NONAME
- _ZNK12QColorDialog7optionsEv @ 7840 NONAME
- _ZNK12QCommonStyle10metaObjectEv @ 7841 NONAME
- _ZNK12QCommonStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 7842 NONAME
- _ZNK12QCommonStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 7843 NONAME
- _ZNK12QCommonStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 7844 NONAME
- _ZNK12QCommonStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 7845 NONAME
- _ZNK12QCommonStyle14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 7846 NONAME
- _ZNK12QCommonStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 7847 NONAME
- _ZNK12QCommonStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 7848 NONAME
- _ZNK12QCommonStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 7849 NONAME
- _ZNK12QCommonStyle19generatedIconPixmapEN5QIcon4ModeERK7QPixmapPK12QStyleOption @ 7850 NONAME
- _ZNK12QCommonStyle21hitTestComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexRK6QPointPK7QWidget @ 7851 NONAME
- _ZNK12QCommonStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 7852 NONAME
- _ZNK12QCommonStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 7853 NONAME
- _ZNK12QDragManager10dragCursorEN2Qt10DropActionE @ 7854 NONAME ABSENT
- _ZNK12QDragManager10metaObjectEv @ 7855 NONAME ABSENT
- _ZNK12QDragManager13defaultActionE6QFlagsIN2Qt10DropActionEES0_INS1_16KeyboardModifierEE @ 7856 NONAME ABSENT
- _ZNK12QDragManager20hasCustomDragCursorsEv @ 7857 NONAME ABSENT
- _ZNK12QFontMetrics10elidedTextERK7QStringN2Qt13TextElideModeEii @ 7858 NONAME
- _ZNK12QFontMetrics11leftBearingE5QChar @ 7859 NONAME
- _ZNK12QFontMetrics11lineSpacingEv @ 7860 NONAME
- _ZNK12QFontMetrics11overlinePosEv @ 7861 NONAME
- _ZNK12QFontMetrics12boundingRectE5QChar @ 7862 NONAME
- _ZNK12QFontMetrics12boundingRectERK5QRectiRK7QStringiPi @ 7863 NONAME
- _ZNK12QFontMetrics12boundingRectERK7QString @ 7864 NONAME
- _ZNK12QFontMetrics12rightBearingE5QChar @ 7865 NONAME
- _ZNK12QFontMetrics12strikeOutPosEv @ 7866 NONAME
- _ZNK12QFontMetrics12underlinePosEv @ 7867 NONAME
- _ZNK12QFontMetrics14minLeftBearingEv @ 7868 NONAME
- _ZNK12QFontMetrics15minRightBearingEv @ 7869 NONAME
- _ZNK12QFontMetrics16averageCharWidthEv @ 7870 NONAME
- _ZNK12QFontMetrics17tightBoundingRectERK7QString @ 7871 NONAME
- _ZNK12QFontMetrics4sizeEiRK7QStringiPi @ 7872 NONAME
- _ZNK12QFontMetrics5widthE5QChar @ 7873 NONAME
- _ZNK12QFontMetrics5widthERK7QStringi @ 7874 NONAME
- _ZNK12QFontMetrics6ascentEv @ 7875 NONAME
- _ZNK12QFontMetrics6heightEv @ 7876 NONAME
- _ZNK12QFontMetrics6inFontE5QChar @ 7877 NONAME
- _ZNK12QFontMetrics7descentEv @ 7878 NONAME
- _ZNK12QFontMetrics7leadingEv @ 7879 NONAME
- _ZNK12QFontMetrics7xHeightEv @ 7880 NONAME
- _ZNK12QFontMetrics8maxWidthEv @ 7881 NONAME
- _ZNK12QFontMetrics9charWidthERK7QStringi @ 7882 NONAME
- _ZNK12QFontMetrics9lineWidthEv @ 7883 NONAME
- _ZNK12QFontMetricseqERKS_ @ 7884 NONAME
- _ZNK12QFontPrivate15engineForScriptEi @ 7885 NONAME
- _ZNK12QFontPrivate20smallCapsFontPrivateEv @ 7886 NONAME
- _ZNK12QFontPrivate26alterCharForCapitalizationER5QChar @ 7887 NONAME
- _ZNK12QImageReader10imageCountEv @ 7888 NONAME
- _ZNK12QImageReader10scaledSizeEv @ 7889 NONAME
- _ZNK12QImageReader11errorStringEv @ 7890 NONAME
- _ZNK12QImageReader11imageFormatEv @ 7891 NONAME
- _ZNK12QImageReader14nextImageDelayEv @ 7892 NONAME
- _ZNK12QImageReader14scaledClipRectEv @ 7893 NONAME
- _ZNK12QImageReader14supportsOptionEN15QImageIOHandler11ImageOptionE @ 7894 NONAME
- _ZNK12QImageReader15backgroundColorEv @ 7895 NONAME
- _ZNK12QImageReader16currentImageRectEv @ 7896 NONAME
- _ZNK12QImageReader17supportsAnimationEv @ 7897 NONAME
- _ZNK12QImageReader18currentImageNumberEv @ 7898 NONAME
- _ZNK12QImageReader21autoDetectImageFormatEv @ 7899 NONAME
- _ZNK12QImageReader4sizeEv @ 7900 NONAME
- _ZNK12QImageReader4textERK7QString @ 7901 NONAME
- _ZNK12QImageReader5errorEv @ 7902 NONAME
- _ZNK12QImageReader6deviceEv @ 7903 NONAME
- _ZNK12QImageReader6formatEv @ 7904 NONAME
- _ZNK12QImageReader7canReadEv @ 7905 NONAME
- _ZNK12QImageReader7qualityEv @ 7906 NONAME
- _ZNK12QImageReader8clipRectEv @ 7907 NONAME
- _ZNK12QImageReader8fileNameEv @ 7908 NONAME
- _ZNK12QImageReader8textKeysEv @ 7909 NONAME
- _ZNK12QImageReader9loopCountEv @ 7910 NONAME
- _ZNK12QImageWriter11compressionEv @ 7911 NONAME
- _ZNK12QImageWriter11descriptionEv @ 7912 NONAME
- _ZNK12QImageWriter11errorStringEv @ 7913 NONAME
- _ZNK12QImageWriter14supportsOptionEN15QImageIOHandler11ImageOptionE @ 7914 NONAME
- _ZNK12QImageWriter5errorEv @ 7915 NONAME
- _ZNK12QImageWriter5gammaEv @ 7916 NONAME
- _ZNK12QImageWriter6deviceEv @ 7917 NONAME
- _ZNK12QImageWriter6formatEv @ 7918 NONAME
- _ZNK12QImageWriter7qualityEv @ 7919 NONAME
- _ZNK12QImageWriter8canWriteEv @ 7920 NONAME
- _ZNK12QImageWriter8fileNameEv @ 7921 NONAME
- _ZNK12QInputDialog10intMaximumEv @ 7922 NONAME
- _ZNK12QInputDialog10intMinimumEv @ 7923 NONAME
- _ZNK12QInputDialog10metaObjectEv @ 7924 NONAME
- _ZNK12QInputDialog10testOptionENS_17InputDialogOptionE @ 7925 NONAME
- _ZNK12QInputDialog11doubleValueEv @ 7926 NONAME
- _ZNK12QInputDialog12okButtonTextEv @ 7927 NONAME
- _ZNK12QInputDialog12textEchoModeEv @ 7928 NONAME
- _ZNK12QInputDialog13comboBoxItemsEv @ 7929 NONAME
- _ZNK12QInputDialog13doubleMaximumEv @ 7930 NONAME
- _ZNK12QInputDialog13doubleMinimumEv @ 7931 NONAME
- _ZNK12QInputDialog14doubleDecimalsEv @ 7932 NONAME
- _ZNK12QInputDialog15minimumSizeHintEv @ 7933 NONAME
- _ZNK12QInputDialog16cancelButtonTextEv @ 7934 NONAME
- _ZNK12QInputDialog18isComboBoxEditableEv @ 7935 NONAME
- _ZNK12QInputDialog7intStepEv @ 7936 NONAME
- _ZNK12QInputDialog7optionsEv @ 7937 NONAME
- _ZNK12QInputDialog8intValueEv @ 7938 NONAME
- _ZNK12QInputDialog8sizeHintEv @ 7939 NONAME
- _ZNK12QInputDialog9inputModeEv @ 7940 NONAME
- _ZNK12QInputDialog9labelTextEv @ 7941 NONAME
- _ZNK12QInputDialog9textValueEv @ 7942 NONAME
- _ZNK12QKeySequence10isDetachedEv @ 7943 NONAME
- _ZNK12QKeySequence5countEv @ 7944 NONAME
- _ZNK12QKeySequence7isEmptyEv @ 7945 NONAME
- _ZNK12QKeySequence7matchesERKS_ @ 7946 NONAME
- _ZNK12QKeySequence8toStringENS_14SequenceFormatE @ 7947 NONAME
- _ZNK12QKeySequencecv7QStringEv @ 7948 NONAME
- _ZNK12QKeySequencecv8QVariantEv @ 7949 NONAME
- _ZNK12QKeySequencecviEv @ 7950 NONAME
- _ZNK12QKeySequenceeqERKS_ @ 7951 NONAME
- _ZNK12QKeySequenceixEj @ 7952 NONAME
- _ZNK12QKeySequenceltERKS_ @ 7953 NONAME
- _ZNK12QPaintDevice6metricENS_17PaintDeviceMetricE @ 7954 NONAME
- _ZNK12QPaintEngine10systemClipEv @ 7955 NONAME
- _ZNK12QPaintEngine10systemRectEv @ 7956 NONAME
- _ZNK12QPaintEngine11paintDeviceEv @ 7957 NONAME
- _ZNK12QPaintEngine16coordinateOffsetEv @ 7958 NONAME
- _ZNK12QPaintEngine7painterEv @ 7959 NONAME
- _ZNK12QPainterPath10intersectsERK6QRectF @ 7960 NONAME
- _ZNK12QPainterPath10intersectsERKS_ @ 7961 NONAME
- _ZNK12QPainterPath10simplifiedEv @ 7962 NONAME
- _ZNK12QPainterPath10subtractedERKS_ @ 7963 NONAME
- _ZNK12QPainterPath10toReversedEv @ 7964 NONAME
- _ZNK12QPainterPath11intersectedERKS_ @ 7965 NONAME
- _ZNK12QPainterPath12boundingRectEv @ 7966 NONAME
- _ZNK12QPainterPath13toFillPolygonERK10QTransform @ 7967 NONAME
- _ZNK12QPainterPath13toFillPolygonERK7QMatrix @ 7968 NONAME
- _ZNK12QPainterPath14angleAtPercentEf @ 7969 NONAME
- _ZNK12QPainterPath14pointAtPercentEf @ 7970 NONAME
- _ZNK12QPainterPath14slopeAtPercentEf @ 7971 NONAME
- _ZNK12QPainterPath14toFillPolygonsERK10QTransform @ 7972 NONAME
- _ZNK12QPainterPath14toFillPolygonsERK7QMatrix @ 7973 NONAME
- _ZNK12QPainterPath15currentPositionEv @ 7974 NONAME
- _ZNK12QPainterPath15percentAtLengthEf @ 7975 NONAME
- _ZNK12QPainterPath16controlPointRectEv @ 7976 NONAME
- _ZNK12QPainterPath17toSubpathPolygonsERK10QTransform @ 7977 NONAME
- _ZNK12QPainterPath17toSubpathPolygonsERK7QMatrix @ 7978 NONAME
- _ZNK12QPainterPath18subtractedInvertedERKS_ @ 7979 NONAME
- _ZNK12QPainterPath19computeBoundingRectEv @ 7980 NONAME
- _ZNK12QPainterPath23computeControlPointRectEv @ 7981 NONAME
- _ZNK12QPainterPath6lengthEv @ 7982 NONAME
- _ZNK12QPainterPath6unitedERKS_ @ 7983 NONAME
- _ZNK12QPainterPath8containsERK6QRectF @ 7984 NONAME
- _ZNK12QPainterPath8containsERK7QPointF @ 7985 NONAME
- _ZNK12QPainterPath8containsERKS_ @ 7986 NONAME
- _ZNK12QPainterPath8fillRuleEv @ 7987 NONAME
- _ZNK12QPainterPathanERKS_ @ 7988 NONAME
- _ZNK12QPainterPatheqERKS_ @ 7989 NONAME
- _ZNK12QPainterPathmiERKS_ @ 7990 NONAME
- _ZNK12QPainterPathneERKS_ @ 7991 NONAME
- _ZNK12QPainterPathorERKS_ @ 7992 NONAME
- _ZNK12QPainterPathplERKS_ @ 7993 NONAME
- _ZNK12QProgressBar10metaObjectEv @ 7994 NONAME
- _ZNK12QProgressBar11orientationEv @ 7995 NONAME
- _ZNK12QProgressBar13isTextVisibleEv @ 7996 NONAME
- _ZNK12QProgressBar15initStyleOptionEP23QStyleOptionProgressBar @ 7997 NONAME
- _ZNK12QProgressBar15minimumSizeHintEv @ 7998 NONAME
- _ZNK12QProgressBar4textEv @ 7999 NONAME
- _ZNK12QProgressBar5valueEv @ 8000 NONAME
- _ZNK12QProgressBar6formatEv @ 8001 NONAME
- _ZNK12QProgressBar7maximumEv @ 8002 NONAME
- _ZNK12QProgressBar7minimumEv @ 8003 NONAME
- _ZNK12QProgressBar8sizeHintEv @ 8004 NONAME
- _ZNK12QProgressBar9alignmentEv @ 8005 NONAME
- _ZNK12QRadioButton10metaObjectEv @ 8006 NONAME
- _ZNK12QRadioButton15initStyleOptionEP18QStyleOptionButton @ 8007 NONAME
- _ZNK12QRadioButton8sizeHintEv @ 8008 NONAME
- _ZNK12QRadioButton9hitButtonERK6QPoint @ 8009 NONAME
- _ZNK12QStylePlugin10metaObjectEv @ 8010 NONAME
- _ZNK12QTableWidget10cellWidgetEii @ 8011 NONAME
- _ZNK12QTableWidget10currentRowEv @ 8012 NONAME
- _ZNK12QTableWidget10metaObjectEv @ 8013 NONAME
- _ZNK12QTableWidget11columnCountEv @ 8014 NONAME
- _ZNK12QTableWidget11currentItemEv @ 8015 NONAME
- _ZNK12QTableWidget12visualColumnEi @ 8016 NONAME
- _ZNK12QTableWidget13currentColumnEv @ 8017 NONAME
- _ZNK12QTableWidget13indexFromItemEP16QTableWidgetItem @ 8018 NONAME
- _ZNK12QTableWidget13itemFromIndexERK11QModelIndex @ 8019 NONAME
- _ZNK12QTableWidget13itemPrototypeEv @ 8020 NONAME
- _ZNK12QTableWidget14isItemSelectedEPK16QTableWidgetItem @ 8021 NONAME
- _ZNK12QTableWidget14selectedRangesEv @ 8022 NONAME
- _ZNK12QTableWidget14visualItemRectEPK16QTableWidgetItem @ 8023 NONAME
- _ZNK12QTableWidget16isSortingEnabledEv @ 8024 NONAME
- _ZNK12QTableWidget18verticalHeaderItemEi @ 8025 NONAME
- _ZNK12QTableWidget20horizontalHeaderItemEi @ 8026 NONAME
- _ZNK12QTableWidget20supportedDropActionsEv @ 8027 NONAME
- _ZNK12QTableWidget3rowEPK16QTableWidgetItem @ 8028 NONAME
- _ZNK12QTableWidget4itemEii @ 8029 NONAME
- _ZNK12QTableWidget5itemsEPK9QMimeData @ 8030 NONAME
- _ZNK12QTableWidget6columnEPK16QTableWidgetItem @ 8031 NONAME
- _ZNK12QTableWidget6itemAtERK6QPoint @ 8032 NONAME
- _ZNK12QTableWidget8mimeDataE5QListIP16QTableWidgetItemE @ 8033 NONAME
- _ZNK12QTableWidget8rowCountEv @ 8034 NONAME
- _ZNK12QTableWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEE @ 8035 NONAME
- _ZNK12QTableWidget9mimeTypesEv @ 8036 NONAME
- _ZNK12QTableWidget9visualRowEi @ 8037 NONAME
- _ZNK12QTextBrowser10historyUrlEi @ 8038 NONAME
- _ZNK12QTextBrowser10metaObjectEv @ 8039 NONAME
- _ZNK12QTextBrowser11searchPathsEv @ 8040 NONAME
- _ZNK12QTextBrowser12historyTitleEi @ 8041 NONAME
- _ZNK12QTextBrowser17openExternalLinksEv @ 8042 NONAME
- _ZNK12QTextBrowser18isForwardAvailableEv @ 8043 NONAME
- _ZNK12QTextBrowser19forwardHistoryCountEv @ 8044 NONAME
- _ZNK12QTextBrowser19isBackwardAvailableEv @ 8045 NONAME
- _ZNK12QTextBrowser20backwardHistoryCountEv @ 8046 NONAME
- _ZNK12QTextBrowser6sourceEv @ 8047 NONAME
- _ZNK12QTextBrowser9openLinksEv @ 8048 NONAME
- _ZNK12QTextControl10cursorRectERK11QTextCursor @ 8049 NONAME
- _ZNK12QTextControl10cursorRectEv @ 8050 NONAME
- _ZNK12QTextControl10metaObjectEv @ 8051 NONAME
- _ZNK12QTextControl10textCursorEv @ 8052 NONAME
- _ZNK12QTextControl11cursorWidthEv @ 8053 NONAME
- _ZNK12QTextControl13overwriteModeEv @ 8054 NONAME
- _ZNK12QTextControl13selectionRectERK11QTextCursor @ 8055 NONAME
- _ZNK12QTextControl13selectionRectEv @ 8056 NONAME
- _ZNK12QTextControl14acceptRichTextEv @ 8057 NONAME
- _ZNK12QTextControl14anchorAtCursorEv @ 8058 NONAME
- _ZNK12QTextControl14anchorPositionERK7QString @ 8059 NONAME
- _ZNK12QTextControl15extraSelectionsEv @ 8060 NONAME
- _ZNK12QTextControl15getPaintContextEP7QWidget @ 8061 NONAME
- _ZNK12QTextControl16inputMethodQueryEN2Qt16InputMethodQueryE @ 8062 NONAME
- _ZNK12QTextControl17blockBoundingRectERK10QTextBlock @ 8063 NONAME
- _ZNK12QTextControl17currentCharFormatEv @ 8064 NONAME
- _ZNK12QTextControl17cursorForPositionERK7QPointF @ 8065 NONAME
- _ZNK12QTextControl17openExternalLinksEv @ 8066 NONAME
- _ZNK12QTextControl20textInteractionFlagsEv @ 8067 NONAME
- _ZNK12QTextControl21canInsertFromMimeDataEPK9QMimeData @ 8068 NONAME
- _ZNK12QTextControl22cursorIsFocusIndicatorEv @ 8069 NONAME
- _ZNK12QTextControl27createMimeDataFromSelectionEv @ 8070 NONAME
- _ZNK12QTextControl4sizeEv @ 8071 NONAME
- _ZNK12QTextControl7hitTestERK7QPointFN2Qt15HitTestAccuracyE @ 8072 NONAME
- _ZNK12QTextControl7paletteEv @ 8073 NONAME
- _ZNK12QTextControl8anchorAtERK7QPointF @ 8074 NONAME
- _ZNK12QTextControl8canPasteEv @ 8075 NONAME
- _ZNK12QTextControl8documentEv @ 8076 NONAME
- _ZNK12QTextControl9textWidthEv @ 8077 NONAME
- _ZNK12QToolBarItem7isEmptyEv @ 8078 NONAME ABSENT
- _ZNK12QUndoCommand10childCountEv @ 8079 NONAME
- _ZNK12QUndoCommand2idEv @ 8080 NONAME
- _ZNK12QUndoCommand4textEv @ 8081 NONAME
- _ZNK12QUndoCommand5childEi @ 8082 NONAME
- _ZNK13QDateTimeEdit10metaObjectEv @ 8083 NONAME
- _ZNK13QDateTimeEdit11maximumDateEv @ 8084 NONAME
- _ZNK13QDateTimeEdit11maximumTimeEv @ 8085 NONAME
- _ZNK13QDateTimeEdit11minimumDateEv @ 8086 NONAME
- _ZNK13QDateTimeEdit11minimumTimeEv @ 8087 NONAME
- _ZNK13QDateTimeEdit11sectionTextENS_7SectionE @ 8088 NONAME
- _ZNK13QDateTimeEdit11stepEnabledEv @ 8089 NONAME
- _ZNK13QDateTimeEdit12sectionCountEv @ 8090 NONAME
- _ZNK13QDateTimeEdit13calendarPopupEv @ 8091 NONAME
- _ZNK13QDateTimeEdit13displayFormatEv @ 8092 NONAME
- _ZNK13QDateTimeEdit14calendarWidgetEv @ 8093 NONAME
- _ZNK13QDateTimeEdit14currentSectionEv @ 8094 NONAME
- _ZNK13QDateTimeEdit15initStyleOptionEP19QStyleOptionSpinBox @ 8095 NONAME
- _ZNK13QDateTimeEdit15maximumDateTimeEv @ 8096 NONAME
- _ZNK13QDateTimeEdit15minimumDateTimeEv @ 8097 NONAME
- _ZNK13QDateTimeEdit16dateTimeFromTextERK7QString @ 8098 NONAME
- _ZNK13QDateTimeEdit16textFromDateTimeERK9QDateTime @ 8099 NONAME
- _ZNK13QDateTimeEdit17displayedSectionsEv @ 8100 NONAME
- _ZNK13QDateTimeEdit19currentSectionIndexEv @ 8101 NONAME
- _ZNK13QDateTimeEdit4dateEv @ 8102 NONAME
- _ZNK13QDateTimeEdit4timeEv @ 8103 NONAME
- _ZNK13QDateTimeEdit5fixupER7QString @ 8104 NONAME
- _ZNK13QDateTimeEdit8dateTimeEv @ 8105 NONAME
- _ZNK13QDateTimeEdit8sizeHintEv @ 8106 NONAME
- _ZNK13QDateTimeEdit8timeSpecEv @ 8107 NONAME
- _ZNK13QDateTimeEdit8validateER7QStringRi @ 8108 NONAME
- _ZNK13QDateTimeEdit9sectionAtEi @ 8109 NONAME
- _ZNK13QErrorMessage10metaObjectEv @ 8110 NONAME
- _ZNK13QFontComboBox10metaObjectEv @ 8111 NONAME
- _ZNK13QFontComboBox11currentFontEv @ 8112 NONAME
- _ZNK13QFontComboBox11fontFiltersEv @ 8113 NONAME
- _ZNK13QFontComboBox13writingSystemEv @ 8114 NONAME
- _ZNK13QFontComboBox8sizeHintEv @ 8115 NONAME
- _ZNK13QFontDatabase10isScalableERK7QStringS2_ @ 8116 NONAME
- _ZNK13QFontDatabase12isFixedPitchERK7QStringS2_ @ 8117 NONAME
- _ZNK13QFontDatabase14writingSystemsERK7QString @ 8118 NONAME
- _ZNK13QFontDatabase14writingSystemsEv @ 8119 NONAME
- _ZNK13QFontDatabase16isBitmapScalableERK7QStringS2_ @ 8120 NONAME
- _ZNK13QFontDatabase18isSmoothlyScalableERK7QStringS2_ @ 8121 NONAME
- _ZNK13QFontDatabase4boldERK7QStringS2_ @ 8122 NONAME
- _ZNK13QFontDatabase4fontERK7QStringS2_i @ 8123 NONAME
- _ZNK13QFontDatabase6italicERK7QStringS2_ @ 8124 NONAME
- _ZNK13QFontDatabase6stylesERK7QString @ 8125 NONAME
- _ZNK13QFontDatabase6weightERK7QStringS2_ @ 8126 NONAME
- _ZNK13QFontDatabase8familiesENS_13WritingSystemE @ 8127 NONAME
- _ZNK13QFontMetricsF10elidedTextERK7QStringN2Qt13TextElideModeEfi @ 8128 NONAME
- _ZNK13QFontMetricsF11leftBearingE5QChar @ 8129 NONAME
- _ZNK13QFontMetricsF11lineSpacingEv @ 8130 NONAME
- _ZNK13QFontMetricsF11overlinePosEv @ 8131 NONAME
- _ZNK13QFontMetricsF12boundingRectE5QChar @ 8132 NONAME
- _ZNK13QFontMetricsF12boundingRectERK6QRectFiRK7QStringiPi @ 8133 NONAME
- _ZNK13QFontMetricsF12boundingRectERK7QString @ 8134 NONAME
- _ZNK13QFontMetricsF12rightBearingE5QChar @ 8135 NONAME
- _ZNK13QFontMetricsF12strikeOutPosEv @ 8136 NONAME
- _ZNK13QFontMetricsF12underlinePosEv @ 8137 NONAME
- _ZNK13QFontMetricsF14minLeftBearingEv @ 8138 NONAME
- _ZNK13QFontMetricsF15minRightBearingEv @ 8139 NONAME
- _ZNK13QFontMetricsF16averageCharWidthEv @ 8140 NONAME
- _ZNK13QFontMetricsF17tightBoundingRectERK7QString @ 8141 NONAME
- _ZNK13QFontMetricsF4sizeEiRK7QStringiPi @ 8142 NONAME
- _ZNK13QFontMetricsF5widthE5QChar @ 8143 NONAME
- _ZNK13QFontMetricsF5widthERK7QString @ 8144 NONAME
- _ZNK13QFontMetricsF6ascentEv @ 8145 NONAME
- _ZNK13QFontMetricsF6heightEv @ 8146 NONAME
- _ZNK13QFontMetricsF6inFontE5QChar @ 8147 NONAME
- _ZNK13QFontMetricsF7descentEv @ 8148 NONAME
- _ZNK13QFontMetricsF7leadingEv @ 8149 NONAME
- _ZNK13QFontMetricsF7xHeightEv @ 8150 NONAME
- _ZNK13QFontMetricsF8maxWidthEv @ 8151 NONAME
- _ZNK13QFontMetricsF9lineWidthEv @ 8152 NONAME
- _ZNK13QFontMetricsFeqERKS_ @ 8153 NONAME
- _ZNK13QGraphicsItem10childItemsEv @ 8154 NONAME
- _ZNK13QGraphicsItem10isObscuredERK6QRectF @ 8155 NONAME
- _ZNK13QGraphicsItem10isObscuredEv @ 8156 NONAME
- _ZNK13QGraphicsItem10isSelectedEv @ 8157 NONAME
- _ZNK13QGraphicsItem10mapToSceneERK12QPainterPath @ 8158 NONAME
- _ZNK13QGraphicsItem10mapToSceneERK6QRectF @ 8159 NONAME
- _ZNK13QGraphicsItem10mapToSceneERK7QPointF @ 8160 NONAME
- _ZNK13QGraphicsItem10mapToSceneERK9QPolygonF @ 8161 NONAME
- _ZNK13QGraphicsItem10opaqueAreaEv @ 8162 NONAME
- _ZNK13QGraphicsItem10parentItemEv @ 8163 NONAME
- _ZNK13QGraphicsItem11acceptDropsEv @ 8164 NONAME
- _ZNK13QGraphicsItem11isVisibleToEPKS_ @ 8165 NONAME
- _ZNK13QGraphicsItem11mapFromItemEPKS_RK12QPainterPath @ 8166 NONAME
- _ZNK13QGraphicsItem11mapFromItemEPKS_RK6QRectF @ 8167 NONAME
- _ZNK13QGraphicsItem11mapFromItemEPKS_RK7QPointF @ 8168 NONAME
- _ZNK13QGraphicsItem11mapFromItemEPKS_RK9QPolygonF @ 8169 NONAME
- _ZNK13QGraphicsItem11mapToParentERK12QPainterPath @ 8170 NONAME
- _ZNK13QGraphicsItem11mapToParentERK6QRectF @ 8171 NONAME
- _ZNK13QGraphicsItem11mapToParentERK7QPointF @ 8172 NONAME
- _ZNK13QGraphicsItem11mapToParentERK9QPolygonF @ 8173 NONAME
- _ZNK13QGraphicsItem11sceneMatrixEv @ 8174 NONAME
- _ZNK13QGraphicsItem12isAncestorOfEPKS_ @ 8175 NONAME
- _ZNK13QGraphicsItem12isObscuredByEPKS_ @ 8176 NONAME
- _ZNK13QGraphicsItem12isUnderMouseEv @ 8177 NONAME
- _ZNK13QGraphicsItem12mapFromSceneERK12QPainterPath @ 8178 NONAME
- _ZNK13QGraphicsItem12mapFromSceneERK6QRectF @ 8179 NONAME
- _ZNK13QGraphicsItem12mapFromSceneERK7QPointF @ 8180 NONAME
- _ZNK13QGraphicsItem12mapFromSceneERK9QPolygonF @ 8181 NONAME
- _ZNK13QGraphicsItem12parentWidgetEv @ 8182 NONAME
- _ZNK13QGraphicsItem12topLevelItemEv @ 8183 NONAME
- _ZNK13QGraphicsItem13itemTransformEPKS_Pb @ 8184 NONAME
- _ZNK13QGraphicsItem13mapFromParentERK12QPainterPath @ 8185 NONAME
- _ZNK13QGraphicsItem13mapFromParentERK6QRectF @ 8186 NONAME
- _ZNK13QGraphicsItem13mapFromParentERK7QPointF @ 8187 NONAME
- _ZNK13QGraphicsItem13mapFromParentERK9QPolygonF @ 8188 NONAME
- _ZNK13QGraphicsItem13mapRectToItemEPKS_RK6QRectF @ 8189 NONAME
- _ZNK13QGraphicsItem14boundingRegionERK10QTransform @ 8190 NONAME
- _ZNK13QGraphicsItem14collidingItemsEN2Qt17ItemSelectionModeE @ 8191 NONAME
- _ZNK13QGraphicsItem14mapRectToSceneERK6QRectF @ 8192 NONAME
- _ZNK13QGraphicsItem14sceneTransformEv @ 8193 NONAME
- _ZNK13QGraphicsItem14topLevelWidgetEv @ 8194 NONAME
- _ZNK13QGraphicsItem15deviceTransformERK10QTransform @ 8195 NONAME
- _ZNK13QGraphicsItem15mapRectFromItemEPKS_RK6QRectF @ 8196 NONAME
- _ZNK13QGraphicsItem15mapRectToParentERK6QRectF @ 8197 NONAME
- _ZNK13QGraphicsItem16collidesWithItemEPKS_N2Qt17ItemSelectionModeE @ 8198 NONAME
- _ZNK13QGraphicsItem16collidesWithPathERK12QPainterPathN2Qt17ItemSelectionModeE @ 8199 NONAME
- _ZNK13QGraphicsItem16effectiveOpacityEv @ 8200 NONAME
- _ZNK13QGraphicsItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 8201 NONAME
- _ZNK13QGraphicsItem16mapRectFromSceneERK6QRectF @ 8202 NONAME
- _ZNK13QGraphicsItem17acceptHoverEventsEv @ 8203 NONAME
- _ZNK13QGraphicsItem17mapRectFromParentERK6QRectF @ 8204 NONAME
- _ZNK13QGraphicsItem17sceneBoundingRectEv @ 8205 NONAME
- _ZNK13QGraphicsItem17supportsExtensionENS_9ExtensionE @ 8206 NONAME
- _ZNK13QGraphicsItem18acceptsHoverEventsEv @ 8207 NONAME
- _ZNK13QGraphicsItem18commonAncestorItemEPKS_ @ 8208 NONAME
- _ZNK13QGraphicsItem18handlesChildEventsEv @ 8209 NONAME
- _ZNK13QGraphicsItem20acceptedMouseButtonsEv @ 8210 NONAME
- _ZNK13QGraphicsItem20childrenBoundingRectEv @ 8211 NONAME
- _ZNK13QGraphicsItem25boundingRegionGranularityEv @ 8212 NONAME
- _ZNK13QGraphicsItem3posEv @ 8213 NONAME
- _ZNK13QGraphicsItem4dataEi @ 8214 NONAME
- _ZNK13QGraphicsItem4typeEv @ 8215 NONAME
- _ZNK13QGraphicsItem5flagsEv @ 8216 NONAME
- _ZNK13QGraphicsItem5groupEv @ 8217 NONAME
- _ZNK13QGraphicsItem5sceneEv @ 8218 NONAME
- _ZNK13QGraphicsItem5shapeEv @ 8219 NONAME
- _ZNK13QGraphicsItem6matrixEv @ 8220 NONAME
- _ZNK13QGraphicsItem6windowEv @ 8221 NONAME
- _ZNK13QGraphicsItem6zValueEv @ 8222 NONAME
- _ZNK13QGraphicsItem7opacityEv @ 8223 NONAME
- _ZNK13QGraphicsItem7toolTipEv @ 8224 NONAME
- _ZNK13QGraphicsItem8childrenEv @ 8225 NONAME
- _ZNK13QGraphicsItem8clipPathEv @ 8226 NONAME
- _ZNK13QGraphicsItem8containsERK7QPointF @ 8227 NONAME
- _ZNK13QGraphicsItem8hasFocusEv @ 8228 NONAME
- _ZNK13QGraphicsItem8isWidgetEv @ 8229 NONAME
- _ZNK13QGraphicsItem8isWindowEv @ 8230 NONAME
- _ZNK13QGraphicsItem8scenePosEv @ 8231 NONAME
- _ZNK13QGraphicsItem9cacheModeEv @ 8232 NONAME
- _ZNK13QGraphicsItem9extensionERK8QVariant @ 8233 NONAME
- _ZNK13QGraphicsItem9isClippedEv @ 8234 NONAME
- _ZNK13QGraphicsItem9isEnabledEv @ 8235 NONAME
- _ZNK13QGraphicsItem9isVisibleEv @ 8236 NONAME
- _ZNK13QGraphicsItem9mapToItemEPKS_RK12QPainterPath @ 8237 NONAME
- _ZNK13QGraphicsItem9mapToItemEPKS_RK6QRectF @ 8238 NONAME
- _ZNK13QGraphicsItem9mapToItemEPKS_RK7QPointF @ 8239 NONAME
- _ZNK13QGraphicsItem9mapToItemEPKS_RK9QPolygonF @ 8240 NONAME
- _ZNK13QGraphicsItem9transformEv @ 8241 NONAME
- _ZNK13QGraphicsView10mapToSceneERK12QPainterPath @ 8242 NONAME
- _ZNK13QGraphicsView10mapToSceneERK5QRect @ 8243 NONAME
- _ZNK13QGraphicsView10mapToSceneERK6QPoint @ 8244 NONAME
- _ZNK13QGraphicsView10mapToSceneERK8QPolygon @ 8245 NONAME
- _ZNK13QGraphicsView10metaObjectEv @ 8246 NONAME
- _ZNK13QGraphicsView11renderHintsEv @ 8247 NONAME
- _ZNK13QGraphicsView12mapFromSceneERK12QPainterPath @ 8248 NONAME
- _ZNK13QGraphicsView12mapFromSceneERK6QRectF @ 8249 NONAME
- _ZNK13QGraphicsView12mapFromSceneERK7QPointF @ 8250 NONAME
- _ZNK13QGraphicsView12mapFromSceneERK9QPolygonF @ 8251 NONAME
- _ZNK13QGraphicsView12resizeAnchorEv @ 8252 NONAME
- _ZNK13QGraphicsView13isInteractiveEv @ 8253 NONAME
- _ZNK13QGraphicsView15backgroundBrushEv @ 8254 NONAME
- _ZNK13QGraphicsView15foregroundBrushEv @ 8255 NONAME
- _ZNK13QGraphicsView16inputMethodQueryEN2Qt16InputMethodQueryE @ 8256 NONAME
- _ZNK13QGraphicsView17optimizationFlagsEv @ 8257 NONAME
- _ZNK13QGraphicsView17viewportTransformEv @ 8258 NONAME
- _ZNK13QGraphicsView18viewportUpdateModeEv @ 8259 NONAME
- _ZNK13QGraphicsView20transformationAnchorEv @ 8260 NONAME
- _ZNK13QGraphicsView23rubberBandSelectionModeEv @ 8261 NONAME
- _ZNK13QGraphicsView5itemsERK12QPainterPathN2Qt17ItemSelectionModeE @ 8262 NONAME
- _ZNK13QGraphicsView5itemsERK5QRectN2Qt17ItemSelectionModeE @ 8263 NONAME
- _ZNK13QGraphicsView5itemsERK6QPoint @ 8264 NONAME
- _ZNK13QGraphicsView5itemsERK8QPolygonN2Qt17ItemSelectionModeE @ 8265 NONAME
- _ZNK13QGraphicsView5itemsEv @ 8266 NONAME
- _ZNK13QGraphicsView5sceneEv @ 8267 NONAME
- _ZNK13QGraphicsView6itemAtERK6QPoint @ 8268 NONAME
- _ZNK13QGraphicsView6matrixEv @ 8269 NONAME
- _ZNK13QGraphicsView8dragModeEv @ 8270 NONAME
- _ZNK13QGraphicsView8sizeHintEv @ 8271 NONAME
- _ZNK13QGraphicsView9alignmentEv @ 8272 NONAME
- _ZNK13QGraphicsView9cacheModeEv @ 8273 NONAME
- _ZNK13QGraphicsView9sceneRectEv @ 8274 NONAME
- _ZNK13QGraphicsView9transformEv @ 8275 NONAME
- _ZNK13QIconEngineV23keyEv @ 8276 NONAME
- _ZNK13QIconEngineV25cloneEv @ 8277 NONAME
- _ZNK13QIconEngineV25writeER11QDataStream @ 8278 NONAME
- _ZNK13QInputContext10metaObjectEv @ 8279 NONAME
- _ZNK13QInputContext11focusWidgetEv @ 8280 NONAME
- _ZNK13QInputContext14standardFormatENS_14StandardFormatE @ 8281 NONAME
- _ZNK13QInputContext4fontEv @ 8282 NONAME
- _ZNK13QIntValidator10metaObjectEv @ 8283 NONAME
- _ZNK13QIntValidator8validateER7QStringRi @ 8284 NONAME
- _ZNK13QItemDelegate10decorationERK20QStyleOptionViewItemRK8QVariant @ 8285 NONAME
- _ZNK13QItemDelegate10metaObjectEv @ 8286 NONAME
- _ZNK13QItemDelegate10setOptionsERK11QModelIndexRK20QStyleOptionViewItem @ 8287 NONAME
- _ZNK13QItemDelegate11drawDisplayEP8QPainterRK20QStyleOptionViewItemRK5QRectRK7QString @ 8288 NONAME
- _ZNK13QItemDelegate11hasClippingEv @ 8289 NONAME
- _ZNK13QItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 8290 NONAME
- _ZNK13QItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 8291 NONAME
- _ZNK13QItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 8292 NONAME
- _ZNK13QItemDelegate13textRectangleEP8QPainterRK5QRectRK5QFontRK7QString @ 8293 NONAME
- _ZNK13QItemDelegate14drawBackgroundEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 8294 NONAME
- _ZNK13QItemDelegate14drawDecorationEP8QPainterRK20QStyleOptionViewItemRK5QRectRK7QPixmap @ 8295 NONAME
- _ZNK13QItemDelegate17itemEditorFactoryEv @ 8296 NONAME
- _ZNK13QItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 8297 NONAME
- _ZNK13QItemDelegate4rectERK20QStyleOptionViewItemRK11QModelIndexi @ 8298 NONAME
- _ZNK13QItemDelegate5checkERK20QStyleOptionViewItemRK5QRectRK8QVariant @ 8299 NONAME
- _ZNK13QItemDelegate5paintEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 8300 NONAME
- _ZNK13QItemDelegate8doLayoutERK20QStyleOptionViewItemP5QRectS4_S4_b @ 8301 NONAME
- _ZNK13QItemDelegate8selectedERK7QPixmapRK8QPaletteb @ 8302 NONAME
- _ZNK13QItemDelegate8sizeHintERK20QStyleOptionViewItemRK11QModelIndex @ 8303 NONAME
- _ZNK13QItemDelegate9drawCheckEP8QPainterRK20QStyleOptionViewItemRK5QRectN2Qt10CheckStateE @ 8304 NONAME
- _ZNK13QItemDelegate9drawFocusEP8QPainterRK20QStyleOptionViewItemRK5QRect @ 8305 NONAME
- _ZNK13QMdiSubWindow10metaObjectEv @ 8306 NONAME
- _ZNK13QMdiSubWindow10systemMenuEv @ 8307 NONAME
- _ZNK13QMdiSubWindow10testOptionENS_15SubWindowOptionE @ 8308 NONAME
- _ZNK13QMdiSubWindow15minimumSizeHintEv @ 8309 NONAME
- _ZNK13QMdiSubWindow16keyboardPageStepEv @ 8310 NONAME
- _ZNK13QMdiSubWindow18keyboardSingleStepEv @ 8311 NONAME
- _ZNK13QMdiSubWindow22maximizedButtonsWidgetEv @ 8312 NONAME
- _ZNK13QMdiSubWindow29maximizedSystemMenuIconWidgetEv @ 8313 NONAME
- _ZNK13QMdiSubWindow6widgetEv @ 8314 NONAME
- _ZNK13QMdiSubWindow7mdiAreaEv @ 8315 NONAME
- _ZNK13QMdiSubWindow8isShadedEv @ 8316 NONAME
- _ZNK13QMdiSubWindow8sizeHintEv @ 8317 NONAME
- _ZNK13QPixmapFilter10metaObjectEv @ 8318 NONAME
- _ZNK13QPixmapFilter15boundingRectForERK6QRectF @ 8319 NONAME
- _ZNK13QPixmapFilter4typeEv @ 8320 NONAME
- _ZNK13QSplashScreen10metaObjectEv @ 8321 NONAME
- _ZNK13QSplashScreen6pixmapEv @ 8322 NONAME
- _ZNK13QStandardItem11columnCountEv @ 8323 NONAME
- _ZNK13QStandardItem11hasChildrenEv @ 8324 NONAME
- _ZNK13QStandardItem3rowEv @ 8325 NONAME
- _ZNK13QStandardItem4dataEi @ 8326 NONAME
- _ZNK13QStandardItem4typeEv @ 8327 NONAME
- _ZNK13QStandardItem5childEii @ 8328 NONAME
- _ZNK13QStandardItem5cloneEv @ 8329 NONAME
- _ZNK13QStandardItem5flagsEv @ 8330 NONAME
- _ZNK13QStandardItem5indexEv @ 8331 NONAME
- _ZNK13QStandardItem5modelEv @ 8332 NONAME
- _ZNK13QStandardItem5writeER11QDataStream @ 8333 NONAME
- _ZNK13QStandardItem6columnEv @ 8334 NONAME
- _ZNK13QStandardItem6parentEv @ 8335 NONAME
- _ZNK13QStandardItem8rowCountEv @ 8336 NONAME
- _ZNK13QStandardItemltERKS_ @ 8337 NONAME
- _ZNK13QTextDocument10allFormatsEv @ 8338 NONAME
- _ZNK13QTextDocument10blockCountEv @ 8339 NONAME
- _ZNK13QTextDocument10firstBlockEv @ 8340 NONAME
- _ZNK13QTextDocument10idealWidthEv @ 8341 NONAME
- _ZNK13QTextDocument10isModifiedEv @ 8342 NONAME
- _ZNK13QTextDocument10metaObjectEv @ 8343 NONAME
- _ZNK13QTextDocument11characterAtEi @ 8344 NONAME
- _ZNK13QTextDocument11defaultFontEv @ 8345 NONAME
- _ZNK13QTextDocument11indentWidthEv @ 8346 NONAME
- _ZNK13QTextDocument11toPlainTextEv @ 8347 NONAME
- _ZNK13QTextDocument14characterCountEv @ 8348 NONAME
- _ZNK13QTextDocument14documentLayoutEv @ 8349 NONAME
- _ZNK13QTextDocument14documentMarginEv @ 8350 NONAME
- _ZNK13QTextDocument15isRedoAvailableEv @ 8351 NONAME
- _ZNK13QTextDocument15isUndoAvailableEv @ 8352 NONAME
- _ZNK13QTextDocument15metaInformationENS_15MetaInformationE @ 8353 NONAME
- _ZNK13QTextDocument15objectForFormatERK11QTextFormat @ 8354 NONAME
- _ZNK13QTextDocument16useDesignMetricsEv @ 8355 NONAME
- _ZNK13QTextDocument17defaultStyleSheetEv @ 8356 NONAME
- _ZNK13QTextDocument17defaultTextOptionEv @ 8357 NONAME
- _ZNK13QTextDocument17findBlockByNumberEi @ 8358 NONAME
- _ZNK13QTextDocument17isUndoRedoEnabledEv @ 8359 NONAME
- _ZNK13QTextDocument17maximumBlockCountEv @ 8360 NONAME
- _ZNK13QTextDocument21findBlockByLineNumberEi @ 8361 NONAME
- _ZNK13QTextDocument3endEv @ 8362 NONAME
- _ZNK13QTextDocument4findERK7QRegExpRK11QTextCursor6QFlagsINS_8FindFlagEE @ 8363 NONAME
- _ZNK13QTextDocument4findERK7QRegExpi6QFlagsINS_8FindFlagEE @ 8364 NONAME
- _ZNK13QTextDocument4findERK7QStringRK11QTextCursor6QFlagsINS_8FindFlagEE @ 8365 NONAME
- _ZNK13QTextDocument4findERK7QStringi6QFlagsINS_8FindFlagEE @ 8366 NONAME
- _ZNK13QTextDocument4sizeEv @ 8367 NONAME
- _ZNK13QTextDocument5beginEv @ 8368 NONAME
- _ZNK13QTextDocument5cloneEP7QObject @ 8369 NONAME
- _ZNK13QTextDocument6objectEi @ 8370 NONAME
- _ZNK13QTextDocument6toHtmlERK10QByteArray @ 8371 NONAME
- _ZNK13QTextDocument7frameAtEi @ 8372 NONAME
- _ZNK13QTextDocument7isEmptyEv @ 8373 NONAME
- _ZNK13QTextDocument8pageSizeEv @ 8374 NONAME
- _ZNK13QTextDocument8resourceEiRK4QUrl @ 8375 NONAME
- _ZNK13QTextDocument8revisionEv @ 8376 NONAME
- _ZNK13QTextDocument9docHandleEv @ 8377 NONAME
- _ZNK13QTextDocument9findBlockEi @ 8378 NONAME
- _ZNK13QTextDocument9lastBlockEv @ 8379 NONAME
- _ZNK13QTextDocument9lineCountEv @ 8380 NONAME
- _ZNK13QTextDocument9pageCountEv @ 8381 NONAME
- _ZNK13QTextDocument9rootFrameEv @ 8382 NONAME
- _ZNK13QTextDocument9textWidthEv @ 8383 NONAME
- _ZNK13QTextFragment10charFormatEv @ 8384 NONAME
- _ZNK13QTextFragment15charFormatIndexEv @ 8385 NONAME
- _ZNK13QTextFragment4textEv @ 8386 NONAME
- _ZNK13QTextFragment6lengthEv @ 8387 NONAME
- _ZNK13QTextFragment8containsEi @ 8388 NONAME
- _ZNK13QTextFragment8positionEv @ 8389 NONAME
- _ZNK13QWidgetAction10metaObjectEv @ 8390 NONAME
- _ZNK13QWidgetAction13defaultWidgetEv @ 8391 NONAME
- _ZNK13QWidgetAction14createdWidgetsEv @ 8392 NONAME
- _ZNK13QWidgetItemV211maximumSizeEv @ 8393 NONAME
- _ZNK13QWidgetItemV211minimumSizeEv @ 8394 NONAME
- _ZNK13QWidgetItemV214heightForWidthEi @ 8395 NONAME
- _ZNK13QWidgetItemV222updateCacheIfNecessaryEv @ 8396 NONAME
- _ZNK13QWidgetItemV28sizeHintEv @ 8397 NONAME
- _ZNK13QWindowsStyle10metaObjectEv @ 8398 NONAME
- _ZNK13QWindowsStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8399 NONAME
- _ZNK13QWindowsStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 8400 NONAME
- _ZNK13QWindowsStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8401 NONAME
- _ZNK13QWindowsStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8402 NONAME
- _ZNK13QWindowsStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 8403 NONAME
- _ZNK13QWindowsStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 8404 NONAME
- _ZNK13QWindowsStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 8405 NONAME
- _ZNK13QWindowsStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8406 NONAME
- _ZNK13QWindowsStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 8407 NONAME
- _ZNK14QDesktopWidget10metaObjectEv @ 8408 NONAME
- _ZNK14QDesktopWidget10numScreensEv @ 8409 NONAME
- _ZNK14QDesktopWidget12screenNumberEPK7QWidget @ 8410 NONAME
- _ZNK14QDesktopWidget12screenNumberERK6QPoint @ 8411 NONAME
- _ZNK14QDesktopWidget13primaryScreenEv @ 8412 NONAME
- _ZNK14QDesktopWidget14screenGeometryEi @ 8413 NONAME
- _ZNK14QDesktopWidget16isVirtualDesktopEv @ 8414 NONAME
- _ZNK14QDesktopWidget17availableGeometryEi @ 8415 NONAME
- _ZNK14QDoubleSpinBox10metaObjectEv @ 8416 NONAME
- _ZNK14QDoubleSpinBox10singleStepEv @ 8417 NONAME
- _ZNK14QDoubleSpinBox13textFromValueEd @ 8418 NONAME
- _ZNK14QDoubleSpinBox13valueFromTextERK7QString @ 8419 NONAME
- _ZNK14QDoubleSpinBox5fixupER7QString @ 8420 NONAME
- _ZNK14QDoubleSpinBox5valueEv @ 8421 NONAME
- _ZNK14QDoubleSpinBox6prefixEv @ 8422 NONAME
- _ZNK14QDoubleSpinBox6suffixEv @ 8423 NONAME
- _ZNK14QDoubleSpinBox7maximumEv @ 8424 NONAME
- _ZNK14QDoubleSpinBox7minimumEv @ 8425 NONAME
- _ZNK14QDoubleSpinBox8decimalsEv @ 8426 NONAME
- _ZNK14QDoubleSpinBox8validateER7QStringRi @ 8427 NONAME
- _ZNK14QDoubleSpinBox9cleanTextEv @ 8428 NONAME
- _ZNK14QGraphicsScene10metaObjectEv @ 8429 NONAME
- _ZNK14QGraphicsScene11stickyFocusEv @ 8430 NONAME
- _ZNK14QGraphicsScene12activeWindowEv @ 8431 NONAME
- _ZNK14QGraphicsScene12bspTreeDepthEv @ 8432 NONAME
- _ZNK14QGraphicsScene13selectedItemsEv @ 8433 NONAME
- _ZNK14QGraphicsScene13selectionAreaEv @ 8434 NONAME
- _ZNK14QGraphicsScene14collidingItemsEPK13QGraphicsItemN2Qt17ItemSelectionModeE @ 8435 NONAME
- _ZNK14QGraphicsScene15backgroundBrushEv @ 8436 NONAME
- _ZNK14QGraphicsScene15foregroundBrushEv @ 8437 NONAME
- _ZNK14QGraphicsScene15itemIndexMethodEv @ 8438 NONAME
- _ZNK14QGraphicsScene16inputMethodQueryEN2Qt16InputMethodQueryE @ 8439 NONAME
- _ZNK14QGraphicsScene16mouseGrabberItemEv @ 8440 NONAME
- _ZNK14QGraphicsScene17itemsBoundingRectEv @ 8441 NONAME
- _ZNK14QGraphicsScene18isSortCacheEnabledEv @ 8442 NONAME
- _ZNK14QGraphicsScene4fontEv @ 8443 NONAME
- _ZNK14QGraphicsScene5itemsERK12QPainterPathN2Qt17ItemSelectionModeE @ 8444 NONAME
- _ZNK14QGraphicsScene5itemsERK6QRectFN2Qt17ItemSelectionModeE @ 8445 NONAME
- _ZNK14QGraphicsScene5itemsERK7QPointF @ 8446 NONAME
- _ZNK14QGraphicsScene5itemsERK9QPolygonFN2Qt17ItemSelectionModeE @ 8447 NONAME
- _ZNK14QGraphicsScene5itemsEv @ 8448 NONAME
- _ZNK14QGraphicsScene5styleEv @ 8449 NONAME
- _ZNK14QGraphicsScene5viewsEv @ 8450 NONAME
- _ZNK14QGraphicsScene6itemAtERK7QPointF @ 8451 NONAME
- _ZNK14QGraphicsScene7paletteEv @ 8452 NONAME
- _ZNK14QGraphicsScene8hasFocusEv @ 8453 NONAME
- _ZNK14QGraphicsScene9focusItemEv @ 8454 NONAME
- _ZNK14QGraphicsScene9sceneRectEv @ 8455 NONAME
- _ZNK14QImageIOPlugin10metaObjectEv @ 8456 NONAME
- _ZNK14QItemSelection7indexesEv @ 8457 NONAME
- _ZNK14QItemSelection8containsERK11QModelIndex @ 8458 NONAME
- _ZNK14QLayoutPrivate9getMarginEPiiN6QStyle11PixelMetricE @ 8459 NONAME
- _ZNK14QPaintEngineEx11createStateEP13QPainterState @ 8460 NONAME
- _ZNK14QPlainTextEdit10blockCountEv @ 8461 NONAME
- _ZNK14QPlainTextEdit10cursorRectERK11QTextCursor @ 8462 NONAME
- _ZNK14QPlainTextEdit10cursorRectEv @ 8463 NONAME
- _ZNK14QPlainTextEdit10isReadOnlyEv @ 8464 NONAME
- _ZNK14QPlainTextEdit10metaObjectEv @ 8465 NONAME
- _ZNK14QPlainTextEdit10textCursorEv @ 8466 NONAME
- _ZNK14QPlainTextEdit11cursorWidthEv @ 8467 NONAME
- _ZNK14QPlainTextEdit12lineWrapModeEv @ 8468 NONAME
- _ZNK14QPlainTextEdit12tabStopWidthEv @ 8469 NONAME
- _ZNK14QPlainTextEdit12wordWrapModeEv @ 8470 NONAME
- _ZNK14QPlainTextEdit13contentOffsetEv @ 8471 NONAME
- _ZNK14QPlainTextEdit13overwriteModeEv @ 8472 NONAME
- _ZNK14QPlainTextEdit14centerOnScrollEv @ 8473 NONAME
- _ZNK14QPlainTextEdit15extraSelectionsEv @ 8474 NONAME
- _ZNK14QPlainTextEdit15getPaintContextEv @ 8475 NONAME
- _ZNK14QPlainTextEdit15tabChangesFocusEv @ 8476 NONAME
- _ZNK14QPlainTextEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 8477 NONAME
- _ZNK14QPlainTextEdit17backgroundVisibleEv @ 8478 NONAME
- _ZNK14QPlainTextEdit17blockBoundingRectERK10QTextBlock @ 8479 NONAME
- _ZNK14QPlainTextEdit17currentCharFormatEv @ 8480 NONAME
- _ZNK14QPlainTextEdit17cursorForPositionERK6QPoint @ 8481 NONAME
- _ZNK14QPlainTextEdit17firstVisibleBlockEv @ 8482 NONAME
- _ZNK14QPlainTextEdit20textInteractionFlagsEv @ 8483 NONAME
- _ZNK14QPlainTextEdit21blockBoundingGeometryERK10QTextBlock @ 8484 NONAME
- _ZNK14QPlainTextEdit21canInsertFromMimeDataEPK9QMimeData @ 8485 NONAME
- _ZNK14QPlainTextEdit27createMimeDataFromSelectionEv @ 8486 NONAME
- _ZNK14QPlainTextEdit8canPasteEv @ 8487 NONAME
- _ZNK14QPlainTextEdit8documentEv @ 8488 NONAME
- _ZNK14QStackedLayout10metaObjectEv @ 8489 NONAME
- _ZNK14QStackedLayout11minimumSizeEv @ 8490 NONAME
- _ZNK14QStackedLayout12currentIndexEv @ 8491 NONAME
- _ZNK14QStackedLayout12stackingModeEv @ 8492 NONAME
- _ZNK14QStackedLayout13currentWidgetEv @ 8493 NONAME
- _ZNK14QStackedLayout5countEv @ 8494 NONAME
- _ZNK14QStackedLayout6itemAtEi @ 8495 NONAME
- _ZNK14QStackedLayout6widgetEi @ 8496 NONAME
- _ZNK14QStackedLayout8sizeHintEv @ 8497 NONAME
- _ZNK14QStackedWidget10metaObjectEv @ 8498 NONAME
- _ZNK14QStackedWidget12currentIndexEv @ 8499 NONAME
- _ZNK14QStackedWidget13currentWidgetEv @ 8500 NONAME
- _ZNK14QStackedWidget5countEv @ 8501 NONAME
- _ZNK14QStackedWidget6widgetEi @ 8502 NONAME
- _ZNK14QStackedWidget7indexOfEP7QWidget @ 8503 NONAME
- _ZNK14QTextOdfWriter12writeFormatsER16QXmlStreamWriter4QSetIiE @ 8504 NONAME
- _ZNK14QTextOdfWriter15writeListFormatER16QXmlStreamWriter15QTextListFormati @ 8505 NONAME
- _ZNK14QTextOdfWriter16writeBlockFormatER16QXmlStreamWriter16QTextBlockFormati @ 8506 NONAME
- _ZNK14QTextOdfWriter16writeFrameFormatER16QXmlStreamWriter16QTextFrameFormati @ 8507 NONAME
- _ZNK14QTextOdfWriter20writeCharacterFormatER16QXmlStreamWriter15QTextCharFormati @ 8508 NONAME
- _ZNK14QTextOdfWriter20writeInlineCharacterER16QXmlStreamWriterRK13QTextFragment @ 8509 NONAME
- _ZNK14QTextOdfWriter20writeTableCellFormatER16QXmlStreamWriter20QTextTableCellFormati @ 8510 NONAME
- _ZNK14QTextTableCell10columnSpanEv @ 8511 NONAME
- _ZNK14QTextTableCell12lastPositionEv @ 8512 NONAME
- _ZNK14QTextTableCell13firstPositionEv @ 8513 NONAME
- _ZNK14QTextTableCell18lastCursorPositionEv @ 8514 NONAME
- _ZNK14QTextTableCell19firstCursorPositionEv @ 8515 NONAME
- _ZNK14QTextTableCell20tableCellFormatIndexEv @ 8516 NONAME
- _ZNK14QTextTableCell3endEv @ 8517 NONAME
- _ZNK14QTextTableCell3rowEv @ 8518 NONAME
- _ZNK14QTextTableCell5beginEv @ 8519 NONAME
- _ZNK14QTextTableCell6columnEv @ 8520 NONAME
- _ZNK14QTextTableCell6formatEv @ 8521 NONAME
- _ZNK14QTextTableCell7rowSpanEv @ 8522 NONAME
- _ZNK14QToolBarLayout10handleRectEv @ 8523 NONAME ABSENT
- _ZNK14QToolBarLayout10metaObjectEv @ 8524 NONAME ABSENT
- _ZNK14QToolBarLayout11minimumSizeEv @ 8525 NONAME ABSENT
- _ZNK14QToolBarLayout12expandedSizeERK5QSize @ 8526 NONAME ABSENT
- _ZNK14QToolBarLayout13hasExpandFlagEv @ 8527 NONAME ABSENT
- _ZNK14QToolBarLayout15updateGeomArrayEv @ 8528 NONAME ABSENT
- _ZNK14QToolBarLayout19expandingDirectionsEv @ 8529 NONAME ABSENT
- _ZNK14QToolBarLayout5countEv @ 8530 NONAME ABSENT
- _ZNK14QToolBarLayout6itemAtEi @ 8531 NONAME ABSENT
- _ZNK14QToolBarLayout7indexOfEP7QAction @ 8532 NONAME ABSENT
- _ZNK14QToolBarLayout7isEmptyEv @ 8533 NONAME ABSENT
- _ZNK14QToolBarLayout7movableEv @ 8534 NONAME ABSENT
- _ZNK14QToolBarLayout8sizeHintEv @ 8535 NONAME ABSENT
- _ZNK14QWidgetPrivate10clipRegionEv @ 8536 NONAME
- _ZNK14QWidgetPrivate10frameStrutEv @ 8537 NONAME
- _ZNK14QWidgetPrivate12adjustedSizeEv @ 8538 NONAME
- _ZNK14QWidgetPrivate12inputContextEv @ 8539 NONAME
- _ZNK14QWidgetPrivate12isOverlappedERK5QRect @ 8540 NONAME
- _ZNK14QWidgetPrivate13hasBackgroundEv @ 8541 NONAME ABSENT
- _ZNK14QWidgetPrivate13isAboutToShowEv @ 8542 NONAME
- _ZNK14QWidgetPrivate13paintOnScreenEv @ 8543 NONAME
- _ZNK14QWidgetPrivate14childAt_helperERK6QPointb @ 8544 NONAME
- _ZNK14QWidgetPrivate15getOpaqueRegionEv @ 8545 NONAME
- _ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegionRK6QPointi @ 8546 NONAME ABSENT
- _ZNK14QWidgetPrivate17getOpaqueChildrenEv @ 8547 NONAME
- _ZNK14QWidgetPrivate17naturalWidgetFontEj @ 8548 NONAME
- _ZNK14QWidgetPrivate19clipToEffectiveMaskER7QRegion @ 8549 NONAME
- _ZNK14QWidgetPrivate20getLayoutItemMarginsEPiS0_S0_S0_ @ 8550 NONAME
- _ZNK14QWidgetPrivate20naturalWidgetPaletteEj @ 8551 NONAME
- _ZNK14QWidgetPrivate21isBackgroundInheritedEv @ 8552 NONAME ABSENT
- _ZNK14QWidgetPrivate22fromOrToLayoutItemRectERK5QRecti @ 8553 NONAME ABSENT
- _ZNK14QWidgetPrivate22subtractOpaqueChildrenER7QRegionRK5QRect @ 8554 NONAME
- _ZNK14QWidgetPrivate22subtractOpaqueSiblingsER7QRegionPbb @ 8555 NONAME
- _ZNK14QWidgetPrivate8clipRectEv @ 8556 NONAME
- _ZNK14QWindowSurface10grabWidgetEPK7QWidgetRK5QRect @ 8557 NONAME
- _ZNK14QWindowSurface14staticContentsEv @ 8558 NONAME
- _ZNK14QWindowSurface17hasStaticContentsEv @ 8559 NONAME
- _ZNK14QWindowSurface24hasStaticContentsSupportEv @ 8560 NONAME
- _ZNK14QWindowSurface6offsetEPK7QWidget @ 8561 NONAME
- _ZNK14QWindowSurface6windowEv @ 8562 NONAME
- _ZNK14QWindowSurface8geometryEv @ 8563 NONAME
- _ZNK15QAbstractButton10autoRepeatEv @ 8564 NONAME
- _ZNK15QAbstractButton10metaObjectEv @ 8565 NONAME
- _ZNK15QAbstractButton11isCheckableEv @ 8566 NONAME
- _ZNK15QAbstractButton13autoExclusiveEv @ 8567 NONAME
- _ZNK15QAbstractButton15autoRepeatDelayEv @ 8568 NONAME
- _ZNK15QAbstractButton18autoRepeatIntervalEv @ 8569 NONAME
- _ZNK15QAbstractButton4iconEv @ 8570 NONAME
- _ZNK15QAbstractButton4textEv @ 8571 NONAME
- _ZNK15QAbstractButton5groupEv @ 8572 NONAME
- _ZNK15QAbstractButton6isDownEv @ 8573 NONAME
- _ZNK15QAbstractButton8iconSizeEv @ 8574 NONAME
- _ZNK15QAbstractButton8shortcutEv @ 8575 NONAME
- _ZNK15QAbstractButton9hitButtonERK6QPoint @ 8576 NONAME
- _ZNK15QAbstractButton9isCheckedEv @ 8577 NONAME
- _ZNK15QAbstractSlider10metaObjectEv @ 8578 NONAME
- _ZNK15QAbstractSlider10singleStepEv @ 8579 NONAME
- _ZNK15QAbstractSlider11hasTrackingEv @ 8580 NONAME
- _ZNK15QAbstractSlider11orientationEv @ 8581 NONAME
- _ZNK15QAbstractSlider12isSliderDownEv @ 8582 NONAME
- _ZNK15QAbstractSlider12repeatActionEv @ 8583 NONAME
- _ZNK15QAbstractSlider14sliderPositionEv @ 8584 NONAME
- _ZNK15QAbstractSlider16invertedControlsEv @ 8585 NONAME
- _ZNK15QAbstractSlider18invertedAppearanceEv @ 8586 NONAME
- _ZNK15QAbstractSlider5valueEv @ 8587 NONAME
- _ZNK15QAbstractSlider7maximumEv @ 8588 NONAME
- _ZNK15QAbstractSlider7minimumEv @ 8589 NONAME
- _ZNK15QAbstractSlider8pageStepEv @ 8590 NONAME
- _ZNK15QCalendarWidget10metaObjectEv @ 8591 NONAME
- _ZNK15QCalendarWidget10monthShownEv @ 8592 NONAME
- _ZNK15QCalendarWidget11maximumDateEv @ 8593 NONAME
- _ZNK15QCalendarWidget11minimumDateEv @ 8594 NONAME
- _ZNK15QCalendarWidget12selectedDateEv @ 8595 NONAME
- _ZNK15QCalendarWidget13isGridVisibleEv @ 8596 NONAME
- _ZNK15QCalendarWidget13selectionModeEv @ 8597 NONAME
- _ZNK15QCalendarWidget14dateTextFormatERK5QDate @ 8598 NONAME
- _ZNK15QCalendarWidget14dateTextFormatEv @ 8599 NONAME
- _ZNK15QCalendarWidget14firstDayOfWeekEv @ 8600 NONAME
- _ZNK15QCalendarWidget15isHeaderVisibleEv @ 8601 NONAME
- _ZNK15QCalendarWidget15minimumSizeHintEv @ 8602 NONAME
- _ZNK15QCalendarWidget16headerTextFormatEv @ 8603 NONAME
- _ZNK15QCalendarWidget17isDateEditEnabledEv @ 8604 NONAME
- _ZNK15QCalendarWidget17weekdayTextFormatEN2Qt9DayOfWeekE @ 8605 NONAME
- _ZNK15QCalendarWidget19dateEditAcceptDelayEv @ 8606 NONAME
- _ZNK15QCalendarWidget20verticalHeaderFormatEv @ 8607 NONAME
- _ZNK15QCalendarWidget22horizontalHeaderFormatEv @ 8608 NONAME
- _ZNK15QCalendarWidget8sizeHintEv @ 8609 NONAME
- _ZNK15QCalendarWidget9paintCellEP8QPainterRK5QRectRK5QDate @ 8610 NONAME
- _ZNK15QCalendarWidget9yearShownEv @ 8611 NONAME
- _ZNK15QColumnViewGrip10metaObjectEv @ 8612 NONAME
- _ZNK15QDockAreaLayout11minimumSizeEv @ 8613 NONAME
- _ZNK15QDockAreaLayout11usedTabBarsEv @ 8614 NONAME
- _ZNK15QDockAreaLayout13findSeparatorERK6QPoint @ 8615 NONAME
- _ZNK15QDockAreaLayout13separatorRectE5QListIiE @ 8616 NONAME ABSENT
- _ZNK15QDockAreaLayout13separatorRectEi @ 8617 NONAME
- _ZNK15QDockAreaLayout15paintSeparatorsEP8QPainterP7QWidgetRK7QRegionRK6QPoint @ 8618 NONAME
- _ZNK15QDockAreaLayout15separatorRegionEv @ 8619 NONAME
- _ZNK15QDockAreaLayout18indexOfPlaceHolderERK7QString @ 8620 NONAME
- _ZNK15QDockAreaLayout20usedSeparatorWidgetsEv @ 8621 NONAME
- _ZNK15QDockAreaLayout22updateSeparatorWidgetsEv @ 8622 NONAME
- _ZNK15QDockAreaLayout4infoE5QListIiE @ 8623 NONAME ABSENT
- _ZNK15QDockAreaLayout6itemAtEPii @ 8624 NONAME
- _ZNK15QDockAreaLayout7gapRectE5QListIiE @ 8625 NONAME ABSENT
- _ZNK15QDockAreaLayout7indexOfEP7QWidget @ 8626 NONAME
- _ZNK15QDockAreaLayout7isValidEv @ 8627 NONAME
- _ZNK15QDockAreaLayout8gapIndexERK6QPoint @ 8628 NONAME
- _ZNK15QDockAreaLayout8itemRectE5QListIiE @ 8629 NONAME ABSENT
- _ZNK15QDockAreaLayout8sizeHintEv @ 8630 NONAME
- _ZNK15QDockAreaLayout9saveStateER11QDataStream @ 8631 NONAME
- _ZNK15QGraphicsLayout11isActivatedEv @ 8632 NONAME
- _ZNK15QGraphicsLayout18getContentsMarginsEPfS0_S0_S0_ @ 8633 NONAME
- _ZNK15QGraphicsWidget10metaObjectEv @ 8634 NONAME
- _ZNK15QGraphicsWidget10windowTypeEv @ 8635 NONAME
- _ZNK15QGraphicsWidget11focusPolicyEv @ 8636 NONAME
- _ZNK15QGraphicsWidget11focusWidgetEv @ 8637 NONAME
- _ZNK15QGraphicsWidget11windowFlagsEv @ 8638 NONAME
- _ZNK15QGraphicsWidget11windowTitleEv @ 8639 NONAME
- _ZNK15QGraphicsWidget12boundingRectEv @ 8640 NONAME
- _ZNK15QGraphicsWidget13testAttributeEN2Qt15WidgetAttributeE @ 8641 NONAME
- _ZNK15QGraphicsWidget14isActiveWindowEv @ 8642 NONAME
- _ZNK15QGraphicsWidget15initStyleOptionEP12QStyleOption @ 8643 NONAME
- _ZNK15QGraphicsWidget15layoutDirectionEv @ 8644 NONAME
- _ZNK15QGraphicsWidget15windowFrameRectEv @ 8645 NONAME
- _ZNK15QGraphicsWidget18getContentsMarginsEPfS0_S0_S0_ @ 8646 NONAME
- _ZNK15QGraphicsWidget19windowFrameGeometryEv @ 8647 NONAME
- _ZNK15QGraphicsWidget20windowFrameSectionAtERK7QPointF @ 8648 NONAME
- _ZNK15QGraphicsWidget21getWindowFrameMarginsEPfS0_S0_S0_ @ 8649 NONAME
- _ZNK15QGraphicsWidget4fontEv @ 8650 NONAME
- _ZNK15QGraphicsWidget4sizeEv @ 8651 NONAME
- _ZNK15QGraphicsWidget4typeEv @ 8652 NONAME
- _ZNK15QGraphicsWidget5shapeEv @ 8653 NONAME
- _ZNK15QGraphicsWidget5styleEv @ 8654 NONAME
- _ZNK15QGraphicsWidget6layoutEv @ 8655 NONAME
- _ZNK15QGraphicsWidget7actionsEv @ 8656 NONAME
- _ZNK15QGraphicsWidget7paletteEv @ 8657 NONAME
- _ZNK15QGraphicsWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 8658 NONAME
- _ZNK15QImageIOHandler10imageCountEv @ 8659 NONAME
- _ZNK15QImageIOHandler14nextImageDelayEv @ 8660 NONAME
- _ZNK15QImageIOHandler14supportsOptionENS_11ImageOptionE @ 8661 NONAME
- _ZNK15QImageIOHandler16currentImageRectEv @ 8662 NONAME
- _ZNK15QImageIOHandler18currentImageNumberEv @ 8663 NONAME
- _ZNK15QImageIOHandler4nameEv @ 8664 NONAME
- _ZNK15QImageIOHandler6deviceEv @ 8665 NONAME
- _ZNK15QImageIOHandler6formatEv @ 8666 NONAME
- _ZNK15QImageIOHandler6optionENS_11ImageOptionE @ 8667 NONAME
- _ZNK15QImageIOHandler9loopCountEv @ 8668 NONAME
- _ZNK15QImageIOHandler9setFormatERK10QByteArray @ 8669 NONAME
- _ZNK15QLinearGradient5startEv @ 8670 NONAME
- _ZNK15QLinearGradient9finalStopEv @ 8671 NONAME
- _ZNK15QListWidgetItem4dataEi @ 8672 NONAME
- _ZNK15QListWidgetItem5cloneEv @ 8673 NONAME
- _ZNK15QListWidgetItem5writeER11QDataStream @ 8674 NONAME
- _ZNK15QListWidgetItemltERKS_ @ 8675 NONAME
- _ZNK15QProgressDialog10metaObjectEv @ 8676 NONAME
- _ZNK15QProgressDialog11wasCanceledEv @ 8677 NONAME
- _ZNK15QProgressDialog15minimumDurationEv @ 8678 NONAME
- _ZNK15QProgressDialog5valueEv @ 8679 NONAME
- _ZNK15QProgressDialog7maximumEv @ 8680 NONAME
- _ZNK15QProgressDialog7minimumEv @ 8681 NONAME
- _ZNK15QProgressDialog8sizeHintEv @ 8682 NONAME
- _ZNK15QProgressDialog9autoCloseEv @ 8683 NONAME
- _ZNK15QProgressDialog9autoResetEv @ 8684 NONAME
- _ZNK15QProgressDialog9labelTextEv @ 8685 NONAME
- _ZNK15QRadialGradient10focalPointEv @ 8686 NONAME
- _ZNK15QRadialGradient6centerEv @ 8687 NONAME
- _ZNK15QRadialGradient6radiusEv @ 8688 NONAME
- _ZNK15QSessionManager10metaObjectEv @ 8689 NONAME
- _ZNK15QSplitterHandle10metaObjectEv @ 8690 NONAME
- _ZNK15QSplitterHandle11orientationEv @ 8691 NONAME
- _ZNK15QSplitterHandle12opaqueResizeEv @ 8692 NONAME
- _ZNK15QSplitterHandle8sizeHintEv @ 8693 NONAME
- _ZNK15QSplitterHandle8splitterEv @ 8694 NONAME
- _ZNK15QTextBlockGroup10metaObjectEv @ 8695 NONAME
- _ZNK15QTextBlockGroup9blockListEv @ 8696 NONAME
- _ZNK15QTextCharFormat10anchorNameEv @ 8697 NONAME
- _ZNK15QTextCharFormat11anchorNamesEv @ 8698 NONAME
- _ZNK15QTextCharFormat13fontUnderlineEv @ 8699 NONAME
- _ZNK15QTextCharFormat4fontEv @ 8700 NONAME
- _ZNK15QTreeWidgetItem18childrenCheckStateEi @ 8701 NONAME
- _ZNK15QTreeWidgetItem18executePendingSortEv @ 8702 NONAME
- _ZNK15QTreeWidgetItem20childIndicatorPolicyEv @ 8703 NONAME
- _ZNK15QTreeWidgetItem4dataEii @ 8704 NONAME
- _ZNK15QTreeWidgetItem5cloneEv @ 8705 NONAME
- _ZNK15QTreeWidgetItem5flagsEv @ 8706 NONAME
- _ZNK15QTreeWidgetItem5writeER11QDataStream @ 8707 NONAME
- _ZNK15QTreeWidgetItemltERKS_ @ 8708 NONAME
- _ZNK16QAbstractSpinBox10isReadOnlyEv @ 8709 NONAME
- _ZNK16QAbstractSpinBox10metaObjectEv @ 8710 NONAME
- _ZNK16QAbstractSpinBox11stepEnabledEv @ 8711 NONAME
- _ZNK16QAbstractSpinBox13buttonSymbolsEv @ 8712 NONAME
- _ZNK16QAbstractSpinBox13isAcceleratedEv @ 8713 NONAME
- _ZNK16QAbstractSpinBox14correctionModeEv @ 8714 NONAME
- _ZNK16QAbstractSpinBox15initStyleOptionEP19QStyleOptionSpinBox @ 8715 NONAME
- _ZNK16QAbstractSpinBox15minimumSizeHintEv @ 8716 NONAME
- _ZNK16QAbstractSpinBox16inputMethodQueryEN2Qt16InputMethodQueryE @ 8717 NONAME
- _ZNK16QAbstractSpinBox16keyboardTrackingEv @ 8718 NONAME
- _ZNK16QAbstractSpinBox16specialValueTextEv @ 8719 NONAME
- _ZNK16QAbstractSpinBox18hasAcceptableInputEv @ 8720 NONAME
- _ZNK16QAbstractSpinBox4textEv @ 8721 NONAME
- _ZNK16QAbstractSpinBox5fixupER7QString @ 8722 NONAME
- _ZNK16QAbstractSpinBox8hasFrameEv @ 8723 NONAME
- _ZNK16QAbstractSpinBox8lineEditEv @ 8724 NONAME
- _ZNK16QAbstractSpinBox8sizeHintEv @ 8725 NONAME
- _ZNK16QAbstractSpinBox8validateER7QStringRi @ 8726 NONAME
- _ZNK16QAbstractSpinBox8wrappingEv @ 8727 NONAME
- _ZNK16QAbstractSpinBox9alignmentEv @ 8728 NONAME
- _ZNK16QConicalGradient5angleEv @ 8729 NONAME
- _ZNK16QConicalGradient6centerEv @ 8730 NONAME
- _ZNK16QDialogButtonBox10buttonRoleEP15QAbstractButton @ 8731 NONAME
- _ZNK16QDialogButtonBox10metaObjectEv @ 8732 NONAME
- _ZNK16QDialogButtonBox11orientationEv @ 8733 NONAME
- _ZNK16QDialogButtonBox13centerButtonsEv @ 8734 NONAME
- _ZNK16QDialogButtonBox14standardButtonEP15QAbstractButton @ 8735 NONAME
- _ZNK16QDialogButtonBox15standardButtonsEv @ 8736 NONAME
- _ZNK16QDialogButtonBox6buttonENS_14StandardButtonE @ 8737 NONAME
- _ZNK16QDialogButtonBox7buttonsEv @ 8738 NONAME
- _ZNK16QDoubleValidator10metaObjectEv @ 8739 NONAME
- _ZNK16QDoubleValidator8notationEv @ 8740 NONAME
- _ZNK16QDoubleValidator8validateER7QStringRi @ 8741 NONAME
- _ZNK16QFileSystemModel10headerDataEiN2Qt11OrientationEi @ 8742 NONAME
- _ZNK16QFileSystemModel10isReadOnlyEv @ 8743 NONAME
- _ZNK16QFileSystemModel10metaObjectEv @ 8744 NONAME
- _ZNK16QFileSystemModel10myComputerEi @ 8745 NONAME
- _ZNK16QFileSystemModel11columnCountERK11QModelIndex @ 8746 NONAME
- _ZNK16QFileSystemModel11hasChildrenERK11QModelIndex @ 8747 NONAME
- _ZNK16QFileSystemModel11nameFiltersEv @ 8748 NONAME
- _ZNK16QFileSystemModel11permissionsERK11QModelIndex @ 8749 NONAME
- _ZNK16QFileSystemModel12canFetchMoreERK11QModelIndex @ 8750 NONAME
- _ZNK16QFileSystemModel12iconProviderEv @ 8751 NONAME
- _ZNK16QFileSystemModel12lastModifiedERK11QModelIndex @ 8752 NONAME
- _ZNK16QFileSystemModel13rootDirectoryEv @ 8753 NONAME
- _ZNK16QFileSystemModel15resolveSymlinksEv @ 8754 NONAME
- _ZNK16QFileSystemModel18nameFilterDisablesEv @ 8755 NONAME
- _ZNK16QFileSystemModel20supportedDropActionsEv @ 8756 NONAME
- _ZNK16QFileSystemModel4dataERK11QModelIndexi @ 8757 NONAME
- _ZNK16QFileSystemModel4sizeERK11QModelIndex @ 8758 NONAME
- _ZNK16QFileSystemModel4typeERK11QModelIndex @ 8759 NONAME
- _ZNK16QFileSystemModel5flagsERK11QModelIndex @ 8760 NONAME
- _ZNK16QFileSystemModel5indexERK7QStringi @ 8761 NONAME
- _ZNK16QFileSystemModel5indexEiiRK11QModelIndex @ 8762 NONAME
- _ZNK16QFileSystemModel5isDirERK11QModelIndex @ 8763 NONAME
- _ZNK16QFileSystemModel6filterEv @ 8764 NONAME
- _ZNK16QFileSystemModel6parentERK11QModelIndex @ 8765 NONAME
- _ZNK16QFileSystemModel6removeERK11QModelIndex @ 8766 NONAME
- _ZNK16QFileSystemModel8filePathERK11QModelIndex @ 8767 NONAME
- _ZNK16QFileSystemModel8mimeDataERK5QListI11QModelIndexE @ 8768 NONAME
- _ZNK16QFileSystemModel8rootPathEv @ 8769 NONAME
- _ZNK16QFileSystemModel8rowCountERK11QModelIndex @ 8770 NONAME
- _ZNK16QFileSystemModel9mimeTypesEv @ 8771 NONAME
- _ZNK16QFontEngineMulti12maxCharWidthEv @ 8772 NONAME ABSENT
- _ZNK16QFontEngineMulti12stringToCMapEPK5QChariP12QGlyphLayoutPi6QFlagsIN11QTextEngine10ShaperFlagEE @ 8773 NONAME ABSENT
- _ZNK16QFontEngineMulti13lineThicknessEv @ 8774 NONAME ABSENT
- _ZNK16QFontEngineMulti14minLeftBearingEv @ 8775 NONAME ABSENT
- _ZNK16QFontEngineMulti14recalcAdvancesEP12QGlyphLayout6QFlagsIN11QTextEngine10ShaperFlagEE @ 8776 NONAME ABSENT
- _ZNK16QFontEngineMulti15minRightBearingEv @ 8777 NONAME ABSENT
- _ZNK16QFontEngineMulti16averageCharWidthEv @ 8778 NONAME ABSENT
- _ZNK16QFontEngineMulti17underlinePositionEv @ 8779 NONAME ABSENT
- _ZNK16QFontEngineMulti6ascentEv @ 8780 NONAME ABSENT
- _ZNK16QFontEngineMulti6engineEi @ 8781 NONAME ABSENT
- _ZNK16QFontEngineMulti7descentEv @ 8782 NONAME ABSENT
- _ZNK16QFontEngineMulti7leadingEv @ 8783 NONAME ABSENT
- _ZNK16QFontEngineMulti7xHeightEv @ 8784 NONAME ABSENT
- _ZNK16QFontEngineMulti9doKerningEP12QGlyphLayout6QFlagsIN11QTextEngine10ShaperFlagEE @ 8785 NONAME ABSENT
- _ZNK16QRegExpValidator10metaObjectEv @ 8786 NONAME
- _ZNK16QRegExpValidator8validateER7QStringRi @ 8787 NONAME
- _ZNK16QStringListModel10metaObjectEv @ 8788 NONAME
- _ZNK16QStringListModel10stringListEv @ 8789 NONAME
- _ZNK16QStringListModel20supportedDropActionsEv @ 8790 NONAME
- _ZNK16QStringListModel4dataERK11QModelIndexi @ 8791 NONAME
- _ZNK16QStringListModel5flagsERK11QModelIndex @ 8792 NONAME
- _ZNK16QStringListModel8rowCountERK11QModelIndex @ 8793 NONAME
- _ZNK16QStyleSheetStyle10initWidgetEPK7QWidget @ 8794 NONAME
- _ZNK16QStyleSheetStyle10metaObjectEv @ 8795 NONAME
- _ZNK16QStyleSheetStyle10renderRuleEPK7QWidgetPK12QStyleOptioni @ 8796 NONAME
- _ZNK16QStyleSheetStyle10renderRuleEPK7QWidgetiy @ 8797 NONAME
- _ZNK16QStyleSheetStyle10styleRulesEPK7QWidget @ 8798 NONAME
- _ZNK16QStyleSheetStyle11defaultSizeEPK7QWidget5QSizeRK5QRecti @ 8799 NONAME
- _ZNK16QStyleSheetStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8800 NONAME
- _ZNK16QStyleSheetStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 8801 NONAME
- _ZNK16QStyleSheetStyle12drawItemTextEP8QPainterRK5QRectiRK8QPalettebRK7QStringNS5_9ColorRoleE @ 8802 NONAME
- _ZNK16QStyleSheetStyle12hasStyleRuleEPK7QWidgeti @ 8803 NONAME
- _ZNK16QStyleSheetStyle12itemTextRectERK12QFontMetricsRK5QRectibRK7QString @ 8804 NONAME
- _ZNK16QStyleSheetStyle12positionRectEPK7QWidgetRK11QRenderRuleS5_iRK5QRectN2Qt15LayoutDirectionE @ 8805 NONAME
- _ZNK16QStyleSheetStyle12positionRectEPK7QWidgetRK11QRenderRuleiRK5QRectN2Qt15LayoutDirectionE @ 8806 NONAME
- _ZNK16QStyleSheetStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8807 NONAME
- _ZNK16QStyleSheetStyle13layoutSpacingEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 8808 NONAME
- _ZNK16QStyleSheetStyle14drawItemPixmapEP8QPainterRK5QRectiRK7QPixmap @ 8809 NONAME
- _ZNK16QStyleSheetStyle14itemPixmapRectERK5QRectiRK7QPixmap @ 8810 NONAME
- _ZNK16QStyleSheetStyle14saveWidgetFontEP7QWidgetRK5QFont @ 8811 NONAME
- _ZNK16QStyleSheetStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8812 NONAME
- _ZNK16QStyleSheetStyle14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 8813 NONAME
- _ZNK16QStyleSheetStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 8814 NONAME
- _ZNK16QStyleSheetStyle14titleBarLayoutEPK7QWidgetPK20QStyleOptionTitleBar @ 8815 NONAME
- _ZNK16QStyleSheetStyle15clearWidgetFontEP7QWidget @ 8816 NONAME
- _ZNK16QStyleSheetStyle15standardPaletteEv @ 8817 NONAME
- _ZNK16QStyleSheetStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 8818 NONAME
- _ZNK16QStyleSheetStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 8819 NONAME
- _ZNK16QStyleSheetStyle19generatedIconPixmapEN5QIcon4ModeERK7QPixmapPK12QStyleOption @ 8820 NONAME
- _ZNK16QStyleSheetStyle20getDefaultStyleSheetEv @ 8821 NONAME
- _ZNK16QStyleSheetStyle20updateStyleSheetFontEP7QWidget @ 8822 NONAME
- _ZNK16QStyleSheetStyle21hitTestComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexRK6QPointPK7QWidget @ 8823 NONAME
- _ZNK16QStyleSheetStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8824 NONAME
- _ZNK16QStyleSheetStyle27layoutSpacingImplementationEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 8825 NONAME
- _ZNK16QStyleSheetStyle9baseStyleEv @ 8826 NONAME
- _ZNK16QStyleSheetStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 8827 NONAME
- _ZNK16QTableWidgetItem4dataEi @ 8828 NONAME
- _ZNK16QTableWidgetItem5cloneEv @ 8829 NONAME
- _ZNK16QTableWidgetItem5writeER11QDataStream @ 8830 NONAME
- _ZNK16QTableWidgetItemltERKS_ @ 8831 NONAME
- _ZNK16QTextBlockFormat12tabPositionsEv @ 8832 NONAME
- _ZNK16QTextFrameFormat10leftMarginEv @ 8833 NONAME
- _ZNK16QTextFrameFormat11rightMarginEv @ 8834 NONAME
- _ZNK16QTextFrameFormat12bottomMarginEv @ 8835 NONAME
- _ZNK16QTextFrameFormat9topMarginEv @ 8836 NONAME
- _ZNK17QAbstractItemView10metaObjectEv @ 8837 NONAME
- _ZNK17QAbstractItemView11dragEnabledEv @ 8838 NONAME
- _ZNK17QAbstractItemView11indexWidgetERK11QModelIndex @ 8839 NONAME
- _ZNK17QAbstractItemView11viewOptionsEv @ 8840 NONAME
- _ZNK17QAbstractItemView12currentIndexEv @ 8841 NONAME
- _ZNK17QAbstractItemView12dragDropModeEv @ 8842 NONAME
- _ZNK17QAbstractItemView12editTriggersEv @ 8843 NONAME
- _ZNK17QAbstractItemView12itemDelegateERK11QModelIndex @ 8844 NONAME
- _ZNK17QAbstractItemView12itemDelegateEv @ 8845 NONAME
- _ZNK17QAbstractItemView13hasAutoScrollEv @ 8846 NONAME
- _ZNK17QAbstractItemView13selectionModeEv @ 8847 NONAME
- _ZNK17QAbstractItemView13textElideModeEv @ 8848 NONAME
- _ZNK17QAbstractItemView14selectionModelEv @ 8849 NONAME
- _ZNK17QAbstractItemView14sizeHintForRowEi @ 8850 NONAME
- _ZNK17QAbstractItemView15selectedIndexesEv @ 8851 NONAME
- _ZNK17QAbstractItemView16autoScrollMarginEv @ 8852 NONAME
- _ZNK17QAbstractItemView16inputMethodQueryEN2Qt16InputMethodQueryE @ 8853 NONAME
- _ZNK17QAbstractItemView16selectionCommandERK11QModelIndexPK6QEvent @ 8854 NONAME
- _ZNK17QAbstractItemView16sizeHintForIndexERK11QModelIndex @ 8855 NONAME
- _ZNK17QAbstractItemView16tabKeyNavigationEv @ 8856 NONAME
- _ZNK17QAbstractItemView17dirtyRegionOffsetEv @ 8857 NONAME
- _ZNK17QAbstractItemView17selectionBehaviorEv @ 8858 NONAME
- _ZNK17QAbstractItemView17showDropIndicatorEv @ 8859 NONAME
- _ZNK17QAbstractItemView17sizeHintForColumnEi @ 8860 NONAME
- _ZNK17QAbstractItemView18itemDelegateForRowEi @ 8861 NONAME
- _ZNK17QAbstractItemView18verticalScrollModeEv @ 8862 NONAME
- _ZNK17QAbstractItemView20alternatingRowColorsEv @ 8863 NONAME
- _ZNK17QAbstractItemView20horizontalScrollModeEv @ 8864 NONAME
- _ZNK17QAbstractItemView20verticalStepsPerItemEv @ 8865 NONAME
- _ZNK17QAbstractItemView21dragDropOverwriteModeEv @ 8866 NONAME
- _ZNK17QAbstractItemView21dropIndicatorPositionEv @ 8867 NONAME
- _ZNK17QAbstractItemView21itemDelegateForColumnEi @ 8868 NONAME
- _ZNK17QAbstractItemView22horizontalStepsPerItemEv @ 8869 NONAME
- _ZNK17QAbstractItemView5modelEv @ 8870 NONAME
- _ZNK17QAbstractItemView5stateEv @ 8871 NONAME
- _ZNK17QAbstractItemView8iconSizeEv @ 8872 NONAME
- _ZNK17QAbstractItemView9rootIndexEv @ 8873 NONAME
- _ZNK17QDataWidgetMapper10metaObjectEv @ 8874 NONAME
- _ZNK17QDataWidgetMapper11orientationEv @ 8875 NONAME
- _ZNK17QDataWidgetMapper12currentIndexEv @ 8876 NONAME
- _ZNK17QDataWidgetMapper12itemDelegateEv @ 8877 NONAME
- _ZNK17QDataWidgetMapper12submitPolicyEv @ 8878 NONAME
- _ZNK17QDataWidgetMapper13mappedSectionEP7QWidget @ 8879 NONAME
- _ZNK17QDataWidgetMapper14mappedWidgetAtEi @ 8880 NONAME
- _ZNK17QDataWidgetMapper18mappedPropertyNameEP7QWidget @ 8881 NONAME
- _ZNK17QDataWidgetMapper5modelEv @ 8882 NONAME
- _ZNK17QDataWidgetMapper9rootIndexEv @ 8883 NONAME
- _ZNK17QDockWidgetLayout10metaObjectEv @ 8884 NONAME
- _ZNK17QDockWidgetLayout11itemForRoleENS_4RoleE @ 8885 NONAME
- _ZNK17QDockWidgetLayout11maximumSizeEv @ 8886 NONAME
- _ZNK17QDockWidgetLayout11minimumSizeEv @ 8887 NONAME
- _ZNK17QDockWidgetLayout11titleHeightEv @ 8888 NONAME
- _ZNK17QDockWidgetLayout13widgetForRoleENS_4RoleE @ 8889 NONAME
- _ZNK17QDockWidgetLayout15sizeFromContentERK5QSizeb @ 8890 NONAME
- _ZNK17QDockWidgetLayout16nativeWindowDecoEb @ 8891 NONAME
- _ZNK17QDockWidgetLayout16nativeWindowDecoEv @ 8892 NONAME
- _ZNK17QDockWidgetLayout17minimumTitleWidthEv @ 8893 NONAME
- _ZNK17QDockWidgetLayout5countEv @ 8894 NONAME
- _ZNK17QDockWidgetLayout6itemAtEi @ 8895 NONAME
- _ZNK17QDockWidgetLayout8sizeHintEv @ 8896 NONAME
- _ZNK17QFileIconProvider4iconENS_8IconTypeE @ 8897 NONAME
- _ZNK17QFileIconProvider4iconERK9QFileInfo @ 8898 NONAME
- _ZNK17QFileIconProvider4typeERK9QFileInfo @ 8899 NONAME
- _ZNK17QFileInfoGatherer10metaObjectEv @ 8900 NONAME
- _ZNK17QFileInfoGatherer12iconProviderEv @ 8901 NONAME
- _ZNK17QFileInfoGatherer12nameResolvedERK7QStringS2_ @ 8902 NONAME
- _ZNK17QFileInfoGatherer14newListOfFilesERK7QStringRK11QStringList @ 8903 NONAME
- _ZNK17QFileInfoGatherer15resolveSymlinksEv @ 8904 NONAME
- _ZNK17QFileInfoGatherer18translateDriveNameERK9QFileInfo @ 8905 NONAME
- _ZNK17QFileInfoGatherer20translatePermissionsERK9QFileInfo @ 8906 NONAME
- _ZNK17QFileInfoGatherer7getInfoERK9QFileInfo @ 8907 NONAME
- _ZNK17QGraphicsLineItem10opaqueAreaEv @ 8908 NONAME
- _ZNK17QGraphicsLineItem12boundingRectEv @ 8909 NONAME
- _ZNK17QGraphicsLineItem12isObscuredByEPK13QGraphicsItem @ 8910 NONAME
- _ZNK17QGraphicsLineItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 8911 NONAME
- _ZNK17QGraphicsLineItem3penEv @ 8912 NONAME
- _ZNK17QGraphicsLineItem4lineEv @ 8913 NONAME
- _ZNK17QGraphicsLineItem4typeEv @ 8914 NONAME
- _ZNK17QGraphicsLineItem5shapeEv @ 8915 NONAME
- _ZNK17QGraphicsLineItem8containsERK7QPointF @ 8916 NONAME
- _ZNK17QGraphicsLineItem9extensionERK8QVariant @ 8917 NONAME
- _ZNK17QGraphicsPathItem10opaqueAreaEv @ 8918 NONAME
- _ZNK17QGraphicsPathItem12boundingRectEv @ 8919 NONAME
- _ZNK17QGraphicsPathItem12isObscuredByEPK13QGraphicsItem @ 8920 NONAME
- _ZNK17QGraphicsPathItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 8921 NONAME
- _ZNK17QGraphicsPathItem4pathEv @ 8922 NONAME
- _ZNK17QGraphicsPathItem4typeEv @ 8923 NONAME
- _ZNK17QGraphicsPathItem5shapeEv @ 8924 NONAME
- _ZNK17QGraphicsPathItem8containsERK7QPointF @ 8925 NONAME
- _ZNK17QGraphicsPathItem9extensionERK8QVariant @ 8926 NONAME
- _ZNK17QGraphicsRectItem10opaqueAreaEv @ 8927 NONAME
- _ZNK17QGraphicsRectItem12boundingRectEv @ 8928 NONAME
- _ZNK17QGraphicsRectItem12isObscuredByEPK13QGraphicsItem @ 8929 NONAME
- _ZNK17QGraphicsRectItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 8930 NONAME
- _ZNK17QGraphicsRectItem4rectEv @ 8931 NONAME
- _ZNK17QGraphicsRectItem4typeEv @ 8932 NONAME
- _ZNK17QGraphicsRectItem5shapeEv @ 8933 NONAME
- _ZNK17QGraphicsRectItem8containsERK7QPointF @ 8934 NONAME
- _ZNK17QGraphicsRectItem9extensionERK8QVariant @ 8935 NONAME
- _ZNK17QGraphicsTextItem10metaObjectEv @ 8936 NONAME
- _ZNK17QGraphicsTextItem10opaqueAreaEv @ 8937 NONAME
- _ZNK17QGraphicsTextItem10textCursorEv @ 8938 NONAME
- _ZNK17QGraphicsTextItem11toPlainTextEv @ 8939 NONAME
- _ZNK17QGraphicsTextItem12boundingRectEv @ 8940 NONAME
- _ZNK17QGraphicsTextItem12isObscuredByEPK13QGraphicsItem @ 8941 NONAME
- _ZNK17QGraphicsTextItem15tabChangesFocusEv @ 8942 NONAME
- _ZNK17QGraphicsTextItem16defaultTextColorEv @ 8943 NONAME
- _ZNK17QGraphicsTextItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 8944 NONAME
- _ZNK17QGraphicsTextItem17openExternalLinksEv @ 8945 NONAME
- _ZNK17QGraphicsTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 8946 NONAME
- _ZNK17QGraphicsTextItem20textInteractionFlagsEv @ 8947 NONAME
- _ZNK17QGraphicsTextItem4fontEv @ 8948 NONAME
- _ZNK17QGraphicsTextItem4typeEv @ 8949 NONAME
- _ZNK17QGraphicsTextItem5shapeEv @ 8950 NONAME
- _ZNK17QGraphicsTextItem6toHtmlEv @ 8951 NONAME
- _ZNK17QGraphicsTextItem8containsERK7QPointF @ 8952 NONAME
- _ZNK17QGraphicsTextItem8documentEv @ 8953 NONAME
- _ZNK17QGraphicsTextItem9extensionERK8QVariant @ 8954 NONAME
- _ZNK17QGraphicsTextItem9textWidthEv @ 8955 NONAME
- _ZNK17QIconEnginePlugin10metaObjectEv @ 8956 NONAME
- _ZNK17QMainWindowLayout10metaObjectEv @ 8957 NONAME
- _ZNK17QMainWindowLayout11minimumSizeEv @ 8958 NONAME
- _ZNK17QMainWindowLayout11tabPositionEN2Qt14DockWidgetAreaE @ 8959 NONAME
- _ZNK17QMainWindowLayout11toolBarAreaEP8QToolBar @ 8960 NONAME
- _ZNK17QMainWindowLayout12documentModeEv @ 8961 NONAME
- _ZNK17QMainWindowLayout12toolBarBreakEP8QToolBar @ 8962 NONAME
- _ZNK17QMainWindowLayout13centralWidgetEv @ 8963 NONAME
- _ZNK17QMainWindowLayout13usesHIToolBarEP8QToolBar @ 8964 NONAME
- _ZNK17QMainWindowLayout14dockWidgetAreaEP11QDockWidget @ 8965 NONAME
- _ZNK17QMainWindowLayout18getStyleOptionInfoEP19QStyleOptionToolBarP8QToolBar @ 8966 NONAME
- _ZNK17QMainWindowLayout5countEv @ 8967 NONAME
- _ZNK17QMainWindowLayout6cornerEN2Qt6CornerE @ 8968 NONAME
- _ZNK17QMainWindowLayout6itemAtEi @ 8969 NONAME
- _ZNK17QMainWindowLayout8sizeHintEv @ 8970 NONAME
- _ZNK17QMainWindowLayout8tabShapeEv @ 8971 NONAME
- _ZNK17QMainWindowLayout9saveStateER11QDataStream @ 8972 NONAME
- _ZNK17QMainWindowLayout9statusBarEv @ 8973 NONAME
- _ZNK17QPaintEngineState10clipRegionEv @ 8974 NONAME
- _ZNK17QPaintEngineState11brushOriginEv @ 8975 NONAME
- _ZNK17QPaintEngineState11renderHintsEv @ 8976 NONAME
- _ZNK17QPaintEngineState13clipOperationEv @ 8977 NONAME
- _ZNK17QPaintEngineState13isClipEnabledEv @ 8978 NONAME
- _ZNK17QPaintEngineState14backgroundModeEv @ 8979 NONAME
- _ZNK17QPaintEngineState15backgroundBrushEv @ 8980 NONAME
- _ZNK17QPaintEngineState15compositionModeEv @ 8981 NONAME
- _ZNK17QPaintEngineState17penNeedsResolvingEv @ 8982 NONAME
- _ZNK17QPaintEngineState19brushNeedsResolvingEv @ 8983 NONAME
- _ZNK17QPaintEngineState3penEv @ 8984 NONAME
- _ZNK17QPaintEngineState4fontEv @ 8985 NONAME
- _ZNK17QPaintEngineState5brushEv @ 8986 NONAME
- _ZNK17QPaintEngineState6matrixEv @ 8987 NONAME
- _ZNK17QPaintEngineState7opacityEv @ 8988 NONAME
- _ZNK17QPaintEngineState7painterEv @ 8989 NONAME
- _ZNK17QPaintEngineState8clipPathEv @ 8990 NONAME
- _ZNK17QPaintEngineState9transformEv @ 8991 NONAME
- _ZNK17QRasterPixmapData11paintEngineEv @ 8992 NONAME
- _ZNK17QRasterPixmapData15hasAlphaChannelEv @ 8993 NONAME
- _ZNK17QRasterPixmapData6metricEN12QPaintDevice17PaintDeviceMetricE @ 8994 NONAME
- _ZNK17QRasterPixmapData7toImageEv @ 8995 NONAME
- _ZNK17QTextImageHandler10metaObjectEv @ 8996 NONAME ABSENT
- _ZNK17QTextInlineObject11formatIndexEv @ 8997 NONAME
- _ZNK17QTextInlineObject12textPositionEv @ 8998 NONAME
- _ZNK17QTextInlineObject13textDirectionEv @ 8999 NONAME
- _ZNK17QTextInlineObject4rectEv @ 9000 NONAME
- _ZNK17QTextInlineObject5widthEv @ 9001 NONAME
- _ZNK17QTextInlineObject6ascentEv @ 9002 NONAME
- _ZNK17QTextInlineObject6formatEv @ 9003 NONAME
- _ZNK17QTextInlineObject6heightEv @ 9004 NONAME
- _ZNK17QTextInlineObject7descentEv @ 9005 NONAME
- _ZNK18QCommandLinkButton10metaObjectEv @ 9006 NONAME
- _ZNK18QCommandLinkButton11descriptionEv @ 9007 NONAME
- _ZNK18QCommandLinkButton14heightForWidthEi @ 9008 NONAME
- _ZNK18QCommandLinkButton15minimumSizeHintEv @ 9009 NONAME
- _ZNK18QCommandLinkButton8sizeHintEv @ 9010 NONAME
- _ZNK18QFileDialogPrivate10typedFilesEv @ 9011 NONAME
- _ZNK18QFileDialogPrivate11currentViewEv @ 9012 NONAME
- _ZNK18QFileDialogPrivate23addDefaultSuffixToFilesE11QStringList @ 9013 NONAME
- _ZNK18QFileDialogPrivate8lineEditEv @ 9014 NONAME
- _ZNK18QGraphicsItemGroup10opaqueAreaEv @ 9015 NONAME
- _ZNK18QGraphicsItemGroup12boundingRectEv @ 9016 NONAME
- _ZNK18QGraphicsItemGroup12isObscuredByEPK13QGraphicsItem @ 9017 NONAME
- _ZNK18QGraphicsItemGroup4typeEv @ 9018 NONAME
- _ZNK18QItemEditorFactory12createEditorEN8QVariant4TypeEP7QWidget @ 9019 NONAME
- _ZNK18QItemEditorFactory17valuePropertyNameEN8QVariant4TypeE @ 9020 NONAME
- _ZNK18QStandardItemModel10headerDataEiN2Qt11OrientationEi @ 9021 NONAME
- _ZNK18QStandardItemModel10metaObjectEv @ 9022 NONAME
- _ZNK18QStandardItemModel11columnCountERK11QModelIndex @ 9023 NONAME
- _ZNK18QStandardItemModel11hasChildrenERK11QModelIndex @ 9024 NONAME
- _ZNK18QStandardItemModel13indexFromItemEPK13QStandardItem @ 9025 NONAME
- _ZNK18QStandardItemModel13itemFromIndexERK11QModelIndex @ 9026 NONAME
- _ZNK18QStandardItemModel13itemPrototypeEv @ 9027 NONAME
- _ZNK18QStandardItemModel17invisibleRootItemEv @ 9028 NONAME
- _ZNK18QStandardItemModel18verticalHeaderItemEi @ 9029 NONAME
- _ZNK18QStandardItemModel20horizontalHeaderItemEi @ 9030 NONAME
- _ZNK18QStandardItemModel20supportedDropActionsEv @ 9031 NONAME
- _ZNK18QStandardItemModel4dataERK11QModelIndexi @ 9032 NONAME
- _ZNK18QStandardItemModel4itemEii @ 9033 NONAME
- _ZNK18QStandardItemModel5flagsERK11QModelIndex @ 9034 NONAME
- _ZNK18QStandardItemModel5indexEiiRK11QModelIndex @ 9035 NONAME
- _ZNK18QStandardItemModel6parentERK11QModelIndex @ 9036 NONAME
- _ZNK18QStandardItemModel8itemDataERK11QModelIndex @ 9037 NONAME
- _ZNK18QStandardItemModel8mimeDataERK5QListI11QModelIndexE @ 9038 NONAME
- _ZNK18QStandardItemModel8rowCountERK11QModelIndex @ 9039 NONAME
- _ZNK18QStandardItemModel8sortRoleEv @ 9040 NONAME
- _ZNK18QStandardItemModel9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEEi @ 9041 NONAME
- _ZNK18QStandardItemModel9mimeTypesEv @ 9042 NONAME
- _ZNK18QSyntaxHighlighter10metaObjectEv @ 9043 NONAME
- _ZNK18QSyntaxHighlighter12currentBlockEv @ 9044 NONAME
- _ZNK18QSyntaxHighlighter17currentBlockStateEv @ 9045 NONAME
- _ZNK18QSyntaxHighlighter18previousBlockStateEv @ 9046 NONAME
- _ZNK18QSyntaxHighlighter20currentBlockUserDataEv @ 9047 NONAME
- _ZNK18QSyntaxHighlighter6formatEi @ 9048 NONAME
- _ZNK18QSyntaxHighlighter8documentEv @ 9049 NONAME
- _ZNK19QAbstractProxyModel10headerDataEiN2Qt11OrientationEi @ 9050 NONAME
- _ZNK19QAbstractProxyModel10metaObjectEv @ 9051 NONAME
- _ZNK19QAbstractProxyModel11sourceModelEv @ 9052 NONAME
- _ZNK19QAbstractProxyModel20mapSelectionToSourceERK14QItemSelection @ 9053 NONAME
- _ZNK19QAbstractProxyModel22mapSelectionFromSourceERK14QItemSelection @ 9054 NONAME
- _ZNK19QAbstractProxyModel4dataERK11QModelIndexi @ 9055 NONAME
- _ZNK19QAbstractProxyModel5flagsERK11QModelIndex @ 9056 NONAME
- _ZNK19QAbstractProxyModel8itemDataERK11QModelIndex @ 9057 NONAME
- _ZNK19QAbstractScrollArea10metaObjectEv @ 9058 NONAME
- _ZNK19QAbstractScrollArea12cornerWidgetEv @ 9059 NONAME
- _ZNK19QAbstractScrollArea15minimumSizeHintEv @ 9060 NONAME
- _ZNK19QAbstractScrollArea17verticalScrollBarEv @ 9061 NONAME
- _ZNK19QAbstractScrollArea19horizontalScrollBarEv @ 9062 NONAME
- _ZNK19QAbstractScrollArea19maximumViewportSizeEv @ 9063 NONAME
- _ZNK19QAbstractScrollArea23verticalScrollBarPolicyEv @ 9064 NONAME
- _ZNK19QAbstractScrollArea25horizontalScrollBarPolicyEv @ 9065 NONAME
- _ZNK19QAbstractScrollArea8sizeHintEv @ 9066 NONAME
- _ZNK19QAbstractScrollArea8viewportEv @ 9067 NONAME
- _ZNK19QApplicationPrivate11inPopupModeEv @ 9068 NONAME
- _ZNK19QApplicationPrivate7appNameEv @ 9069 NONAME
- _ZNK19QCoeFepInputContext10metaObjectEv @ 9070 NONAME
- _ZNK19QCoeFepInputContext15GetFormatForFepER11TCharFormati @ 9071 NONAME
- _ZNK19QCoeFepInputContext20DocumentLengthForFepEv @ 9072 NONAME
- _ZNK19QCoeFepInputContext22GetEditorContentForFepER6TDes16ii @ 9073 NONAME
- _ZNK19QCoeFepInputContext24GetCursorSelectionForFepER16TCursorSelection @ 9074 NONAME
- _ZNK19QCoeFepInputContext27DocumentMaximumLengthForFepEv @ 9075 NONAME
- _ZNK19QCoeFepInputContext27GetScreenCoordinatesForFepLER6TPointRiS2_i @ 9076 NONAME
- _ZNK19QDockAreaLayoutInfo11maximumSizeEv @ 9077 NONAME
- _ZNK19QDockAreaLayoutInfo11minimumSizeEv @ 9078 NONAME
- _ZNK19QDockAreaLayoutInfo11usedTabBarsEv @ 9079 NONAME
- _ZNK19QDockAreaLayoutInfo12currentTabIdEv @ 9080 NONAME
- _ZNK19QDockAreaLayoutInfo12updateTabBarEv @ 9081 NONAME
- _ZNK19QDockAreaLayoutInfo13findSeparatorERK6QPoint @ 9082 NONAME
- _ZNK19QDockAreaLayoutInfo13separatorRectE5QListIiE @ 9083 NONAME ABSENT
- _ZNK19QDockAreaLayoutInfo13separatorRectEi @ 9084 NONAME
- _ZNK19QDockAreaLayoutInfo14tabBarSizeHintEv @ 9085 NONAME
- _ZNK19QDockAreaLayoutInfo14tabContentRectEv @ 9086 NONAME
- _ZNK19QDockAreaLayoutInfo15paintSeparatorsEP8QPainterP7QWidgetRK7QRegionRK6QPoint @ 9087 NONAME
- _ZNK19QDockAreaLayoutInfo15separatorRegionEv @ 9088 NONAME
- _ZNK19QDockAreaLayoutInfo16mainWindowLayoutEv @ 9089 NONAME
- _ZNK19QDockAreaLayoutInfo17tabBarMinimumSizeEv @ 9090 NONAME
- _ZNK19QDockAreaLayoutInfo18indexOfPlaceHolderERK7QString @ 9091 NONAME
- _ZNK19QDockAreaLayoutInfo20usedSeparatorWidgetsEv @ 9092 NONAME
- _ZNK19QDockAreaLayoutInfo22updateSeparatorWidgetsEv @ 9093 NONAME
- _ZNK19QDockAreaLayoutInfo4nextEi @ 9094 NONAME
- _ZNK19QDockAreaLayoutInfo4prevEi @ 9095 NONAME
- _ZNK19QDockAreaLayoutInfo4sizeEv @ 9096 NONAME
- _ZNK19QDockAreaLayoutInfo6itemAtEPii @ 9097 NONAME
- _ZNK19QDockAreaLayoutInfo7indexOfEP7QWidget @ 9098 NONAME
- _ZNK19QDockAreaLayoutInfo7isEmptyEv @ 9099 NONAME
- _ZNK19QDockAreaLayoutInfo8gapIndexERK6QPointbNS_7TabModeE @ 9100 NONAME
- _ZNK19QDockAreaLayoutInfo8itemRectE5QListIiE @ 9101 NONAME ABSENT
- _ZNK19QDockAreaLayoutInfo8itemRectEi @ 9102 NONAME
- _ZNK19QDockAreaLayoutInfo8sizeHintEv @ 9103 NONAME
- _ZNK19QDockAreaLayoutInfo9expansiveEN2Qt11OrientationE @ 9104 NONAME
- _ZNK19QDockAreaLayoutInfo9saveStateER11QDataStream @ 9105 NONAME
- _ZNK19QEventDispatcherS6010metaObjectEv @ 9106 NONAME
- _ZNK19QGraphicsGridLayout10rowSpacingEi @ 9107 NONAME
- _ZNK19QGraphicsGridLayout11columnCountEv @ 9108 NONAME
- _ZNK19QGraphicsGridLayout12rowAlignmentEi @ 9109 NONAME
- _ZNK19QGraphicsGridLayout13columnSpacingEi @ 9110 NONAME
- _ZNK19QGraphicsGridLayout15columnAlignmentEi @ 9111 NONAME
- _ZNK19QGraphicsGridLayout15verticalSpacingEv @ 9112 NONAME
- _ZNK19QGraphicsGridLayout16rowMaximumHeightEi @ 9113 NONAME
- _ZNK19QGraphicsGridLayout16rowMinimumHeightEi @ 9114 NONAME
- _ZNK19QGraphicsGridLayout16rowStretchFactorEi @ 9115 NONAME
- _ZNK19QGraphicsGridLayout17horizontalSpacingEv @ 9116 NONAME
- _ZNK19QGraphicsGridLayout18columnMaximumWidthEi @ 9117 NONAME
- _ZNK19QGraphicsGridLayout18columnMinimumWidthEi @ 9118 NONAME
- _ZNK19QGraphicsGridLayout18rowPreferredHeightEi @ 9119 NONAME
- _ZNK19QGraphicsGridLayout19columnStretchFactorEi @ 9120 NONAME
- _ZNK19QGraphicsGridLayout20columnPreferredWidthEi @ 9121 NONAME
- _ZNK19QGraphicsGridLayout5countEv @ 9122 NONAME
- _ZNK19QGraphicsGridLayout6itemAtEi @ 9123 NONAME
- _ZNK19QGraphicsGridLayout6itemAtEii @ 9124 NONAME
- _ZNK19QGraphicsGridLayout8rowCountEv @ 9125 NONAME
- _ZNK19QGraphicsGridLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9126 NONAME
- _ZNK19QGraphicsGridLayout9alignmentEP19QGraphicsLayoutItem @ 9127 NONAME
- _ZNK19QGraphicsLayoutItem10sizePolicyEv @ 9128 NONAME
- _ZNK19QGraphicsLayoutItem11maximumSizeEv @ 9129 NONAME
- _ZNK19QGraphicsLayoutItem11minimumSizeEv @ 9130 NONAME
- _ZNK19QGraphicsLayoutItem12contentsRectEv @ 9131 NONAME
- _ZNK19QGraphicsLayoutItem12graphicsItemEv @ 9132 NONAME
- _ZNK19QGraphicsLayoutItem13ownedByLayoutEv @ 9133 NONAME
- _ZNK19QGraphicsLayoutItem13preferredSizeEv @ 9134 NONAME
- _ZNK19QGraphicsLayoutItem16parentLayoutItemEv @ 9135 NONAME
- _ZNK19QGraphicsLayoutItem17effectiveSizeHintEN2Qt8SizeHintERK6QSizeF @ 9136 NONAME
- _ZNK19QGraphicsLayoutItem18getContentsMarginsEPfS0_S0_S0_ @ 9137 NONAME
- _ZNK19QGraphicsLayoutItem8geometryEv @ 9138 NONAME
- _ZNK19QGraphicsLayoutItem8isLayoutEv @ 9139 NONAME
- _ZNK19QGraphicsPixmapItem10opaqueAreaEv @ 9140 NONAME
- _ZNK19QGraphicsPixmapItem12boundingRectEv @ 9141 NONAME
- _ZNK19QGraphicsPixmapItem12isObscuredByEPK13QGraphicsItem @ 9142 NONAME
- _ZNK19QGraphicsPixmapItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9143 NONAME
- _ZNK19QGraphicsPixmapItem18transformationModeEv @ 9144 NONAME
- _ZNK19QGraphicsPixmapItem4typeEv @ 9145 NONAME
- _ZNK19QGraphicsPixmapItem5shapeEv @ 9146 NONAME
- _ZNK19QGraphicsPixmapItem6offsetEv @ 9147 NONAME
- _ZNK19QGraphicsPixmapItem6pixmapEv @ 9148 NONAME
- _ZNK19QGraphicsPixmapItem8containsERK7QPointF @ 9149 NONAME
- _ZNK19QGraphicsPixmapItem9extensionERK8QVariant @ 9150 NONAME
- _ZNK19QGraphicsPixmapItem9shapeModeEv @ 9151 NONAME
- _ZNK19QGraphicsSceneEvent6widgetEv @ 9152 NONAME
- _ZNK19QIconEnginePluginV210metaObjectEv @ 9153 NONAME
- _ZNK19QInputContextPlugin10metaObjectEv @ 9154 NONAME
- _ZNK19QItemSelectionModel10isSelectedERK11QModelIndex @ 9155 NONAME
- _ZNK19QItemSelectionModel10metaObjectEv @ 9156 NONAME
- _ZNK19QItemSelectionModel12currentIndexEv @ 9157 NONAME
- _ZNK19QItemSelectionModel12hasSelectionEv @ 9158 NONAME
- _ZNK19QItemSelectionModel12selectedRowsEi @ 9159 NONAME
- _ZNK19QItemSelectionModel13isRowSelectedEiRK11QModelIndex @ 9160 NONAME
- _ZNK19QItemSelectionModel15selectedColumnsEi @ 9161 NONAME
- _ZNK19QItemSelectionModel15selectedIndexesEv @ 9162 NONAME
- _ZNK19QItemSelectionModel16isColumnSelectedEiRK11QModelIndex @ 9163 NONAME
- _ZNK19QItemSelectionModel22rowIntersectsSelectionEiRK11QModelIndex @ 9164 NONAME
- _ZNK19QItemSelectionModel25columnIntersectsSelectionEiRK11QModelIndex @ 9165 NONAME
- _ZNK19QItemSelectionModel5modelEv @ 9166 NONAME
- _ZNK19QItemSelectionModel9selectionEv @ 9167 NONAME
- _ZNK19QItemSelectionRange10intersectsERKS_ @ 9168 NONAME
- _ZNK19QItemSelectionRange7indexesEv @ 9169 NONAME
- _ZNK19QItemSelectionRange9intersectERKS_ @ 9170 NONAME
- _ZNK19QPainterPathStroker10dashOffsetEv @ 9171 NONAME
- _ZNK19QPainterPathStroker10miterLimitEv @ 9172 NONAME
- _ZNK19QPainterPathStroker11dashPatternEv @ 9173 NONAME
- _ZNK19QPainterPathStroker12createStrokeERK12QPainterPath @ 9174 NONAME
- _ZNK19QPainterPathStroker14curveThresholdEv @ 9175 NONAME
- _ZNK19QPainterPathStroker5widthEv @ 9176 NONAME
- _ZNK19QPainterPathStroker8capStyleEv @ 9177 NONAME
- _ZNK19QPainterPathStroker9joinStyleEv @ 9178 NONAME
- _ZNK19QStyledItemDelegate10metaObjectEv @ 9179 NONAME
- _ZNK19QStyledItemDelegate11displayTextERK8QVariantRK7QLocale @ 9180 NONAME
- _ZNK19QStyledItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9181 NONAME
- _ZNK19QStyledItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 9182 NONAME
- _ZNK19QStyledItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 9183 NONAME
- _ZNK19QStyledItemDelegate15initStyleOptionEP20QStyleOptionViewItemRK11QModelIndex @ 9184 NONAME
- _ZNK19QStyledItemDelegate17itemEditorFactoryEv @ 9185 NONAME
- _ZNK19QStyledItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9186 NONAME
- _ZNK19QStyledItemDelegate5paintEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 9187 NONAME
- _ZNK19QStyledItemDelegate8sizeHintERK20QStyleOptionViewItemRK11QModelIndex @ 9188 NONAME
- _ZNK19QTextDocumentLayout10idealWidthEv @ 9189 NONAME
- _ZNK19QTextDocumentLayout10metaObjectEv @ 9190 NONAME
- _ZNK19QTextDocumentLayout11cursorWidthEv @ 9191 NONAME
- _ZNK19QTextDocumentLayout12documentSizeEv @ 9192 NONAME
- _ZNK19QTextDocumentLayout12layoutStatusEv @ 9193 NONAME
- _ZNK19QTextDocumentLayout16dynamicPageCountEv @ 9194 NONAME
- _ZNK19QTextDocumentLayout17blockBoundingRectERK10QTextBlock @ 9195 NONAME
- _ZNK19QTextDocumentLayout17frameBoundingRectEP10QTextFrame @ 9196 NONAME
- _ZNK19QTextDocumentLayout19contentHasAlignmentEv @ 9197 NONAME
- _ZNK19QTextDocumentLayout19dynamicDocumentSizeEv @ 9198 NONAME
- _ZNK19QTextDocumentLayout7hitTestERK7QPointFN2Qt15HitTestAccuracyE @ 9199 NONAME
- _ZNK19QTextDocumentLayout9pageCountEv @ 9200 NONAME
- _ZNK19QTextDocumentWriter5codecEv @ 9201 NONAME
- _ZNK19QTextDocumentWriter6deviceEv @ 9202 NONAME
- _ZNK19QTextDocumentWriter6formatEv @ 9203 NONAME
- _ZNK19QTextDocumentWriter8fileNameEv @ 9204 NONAME
- _ZNK19QWidgetBackingStore11dirtyRegionEP7QWidget @ 9205 NONAME
- _ZNK19QWidgetBackingStore14staticContentsEP7QWidgetRK5QRect @ 9206 NONAME
- _ZNK20QGraphicsEllipseItem10opaqueAreaEv @ 9207 NONAME
- _ZNK20QGraphicsEllipseItem10startAngleEv @ 9208 NONAME
- _ZNK20QGraphicsEllipseItem12boundingRectEv @ 9209 NONAME
- _ZNK20QGraphicsEllipseItem12isObscuredByEPK13QGraphicsItem @ 9210 NONAME
- _ZNK20QGraphicsEllipseItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9211 NONAME
- _ZNK20QGraphicsEllipseItem4rectEv @ 9212 NONAME
- _ZNK20QGraphicsEllipseItem4typeEv @ 9213 NONAME
- _ZNK20QGraphicsEllipseItem5shapeEv @ 9214 NONAME
- _ZNK20QGraphicsEllipseItem8containsERK7QPointF @ 9215 NONAME
- _ZNK20QGraphicsEllipseItem9extensionERK8QVariant @ 9216 NONAME
- _ZNK20QGraphicsEllipseItem9spanAngleEv @ 9217 NONAME
- _ZNK20QGraphicsItemPrivate13isProxyWidgetEv @ 9218 NONAME
- _ZNK20QGraphicsItemPrivate14extraItemCacheEv @ 9219 NONAME
- _ZNK20QGraphicsItemPrivate19genericMapFromSceneERK7QPointFPK7QWidget @ 9220 NONAME
- _ZNK20QGraphicsItemPrivate20discardUpdateRequestEbbbb @ 9221 NONAME
- _ZNK20QGraphicsItemPrivate21itemIsUntransformableEv @ 9222 NONAME ABSENT
- _ZNK20QGraphicsItemPrivate22inputMethodQueryHelperEN2Qt16InputMethodQueryE @ 9223 NONAME
- _ZNK20QGraphicsPolygonItem10opaqueAreaEv @ 9224 NONAME
- _ZNK20QGraphicsPolygonItem12boundingRectEv @ 9225 NONAME
- _ZNK20QGraphicsPolygonItem12isObscuredByEPK13QGraphicsItem @ 9226 NONAME
- _ZNK20QGraphicsPolygonItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9227 NONAME
- _ZNK20QGraphicsPolygonItem4typeEv @ 9228 NONAME
- _ZNK20QGraphicsPolygonItem5shapeEv @ 9229 NONAME
- _ZNK20QGraphicsPolygonItem7polygonEv @ 9230 NONAME
- _ZNK20QGraphicsPolygonItem8containsERK7QPointF @ 9231 NONAME
- _ZNK20QGraphicsPolygonItem8fillRuleEv @ 9232 NONAME
- _ZNK20QGraphicsPolygonItem9extensionERK8QVariant @ 9233 NONAME
- _ZNK20QGraphicsProxyWidget10metaObjectEv @ 9234 NONAME
- _ZNK20QGraphicsProxyWidget13subWidgetRectEPK7QWidget @ 9235 NONAME
- _ZNK20QGraphicsProxyWidget4typeEv @ 9236 NONAME
- _ZNK20QGraphicsProxyWidget6widgetEv @ 9237 NONAME
- _ZNK20QGraphicsProxyWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9238 NONAME
- _ZNK20QGraphicsViewPrivate11itemsInAreaERK12QPainterPathN2Qt17ItemSelectionModeENS3_9SortOrderE @ 9239 NONAME ABSENT
- _ZNK20QGraphicsViewPrivate13mapToViewRectEPK13QGraphicsItemRK6QRectF @ 9240 NONAME
- _ZNK20QGraphicsViewPrivate14verticalScrollEv @ 9241 NONAME
- _ZNK20QGraphicsViewPrivate15mapToViewRegionEPK13QGraphicsItemRK6QRectF @ 9242 NONAME
- _ZNK20QGraphicsViewPrivate16horizontalScrollEv @ 9243 NONAME
- _ZNK20QGraphicsViewPrivate16rubberBandRegionEPK7QWidgetRK5QRect @ 9244 NONAME
- _ZNK20QGraphicsViewPrivate20generateStyleOptionsERK5QListIP13QGraphicsItemEPS2_P24QStyleOptionGraphicsItemRK10QTransformbRK7QRegion @ 9245 NONAME ABSENT
- _ZNK20QGraphicsViewPrivate9findItemsERK7QRegionPb @ 9246 NONAME ABSENT
- _ZNK20QPictureFormatPlugin10metaObjectEv @ 9247 NONAME
- _ZNK20QTextDocumentPrivate14objectForIndexEi @ 9248 NONAME
- _ZNK20QTextDocumentPrivate15objectForFormatERK11QTextFormat @ 9249 NONAME
- _ZNK20QTextDocumentPrivate15objectForFormatEi @ 9250 NONAME
- _ZNK20QTextDocumentPrivate18nextCursorPositionEiN11QTextLayout10CursorModeE @ 9251 NONAME
- _ZNK20QTextDocumentPrivate20blockCharFormatIndexEi @ 9252 NONAME
- _ZNK20QTextDocumentPrivate22previousCursorPositionEiN11QTextLayout10CursorModeE @ 9253 NONAME
- _ZNK20QTextDocumentPrivate7frameAtEi @ 9254 NONAME
- _ZNK20QTextDocumentPrivate9plainTextEv @ 9255 NONAME
- _ZNK20QTextDocumentPrivate9rootFrameEv @ 9256 NONAME
- _ZNK20QWidgetResizeHandler10metaObjectEv @ 9257 NONAME
- _ZNK20QWidgetResizeHandler8isActiveENS_6ActionE @ 9258 NONAME
- _ZNK21QAbstractItemDelegate10metaObjectEv @ 9259 NONAME
- _ZNK21QAbstractItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9260 NONAME
- _ZNK21QAbstractItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 9261 NONAME
- _ZNK21QAbstractItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 9262 NONAME
- _ZNK21QAbstractItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9263 NONAME
- _ZNK21QGraphicsLinearLayout11itemSpacingEi @ 9264 NONAME
- _ZNK21QGraphicsLinearLayout11orientationEv @ 9265 NONAME
- _ZNK21QGraphicsLinearLayout13stretchFactorEP19QGraphicsLayoutItem @ 9266 NONAME
- _ZNK21QGraphicsLinearLayout5countEv @ 9267 NONAME
- _ZNK21QGraphicsLinearLayout6itemAtEi @ 9268 NONAME
- _ZNK21QGraphicsLinearLayout7spacingEv @ 9269 NONAME
- _ZNK21QGraphicsLinearLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9270 NONAME
- _ZNK21QGraphicsLinearLayout9alignmentEP19QGraphicsLayoutItem @ 9271 NONAME
- _ZNK21QGraphicsSystemPlugin10metaObjectEv @ 9272 NONAME
- _ZNK21QPixmapColorizeFilter10metaObjectEv @ 9273 NONAME
- _ZNK21QPixmapColorizeFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9274 NONAME
- _ZNK21QPixmapColorizeFilter5colorEv @ 9275 NONAME
- _ZNK21QSortFilterProxyModel10filterRoleEv @ 9276 NONAME
- _ZNK21QSortFilterProxyModel10headerDataEiN2Qt11OrientationEi @ 9277 NONAME
- _ZNK21QSortFilterProxyModel10metaObjectEv @ 9278 NONAME
- _ZNK21QSortFilterProxyModel10sortColumnEv @ 9279 NONAME
- _ZNK21QSortFilterProxyModel11columnCountERK11QModelIndex @ 9280 NONAME
- _ZNK21QSortFilterProxyModel11hasChildrenERK11QModelIndex @ 9281 NONAME
- _ZNK21QSortFilterProxyModel11mapToSourceERK11QModelIndex @ 9282 NONAME
- _ZNK21QSortFilterProxyModel12canFetchMoreERK11QModelIndex @ 9283 NONAME
- _ZNK21QSortFilterProxyModel12filterRegExpEv @ 9284 NONAME
- _ZNK21QSortFilterProxyModel13mapFromSourceERK11QModelIndex @ 9285 NONAME
- _ZNK21QSortFilterProxyModel15filterKeyColumnEv @ 9286 NONAME
- _ZNK21QSortFilterProxyModel16filterAcceptsRowEiRK11QModelIndex @ 9287 NONAME
- _ZNK21QSortFilterProxyModel17dynamicSortFilterEv @ 9288 NONAME
- _ZNK21QSortFilterProxyModel17isSortLocaleAwareEv @ 9289 NONAME
- _ZNK21QSortFilterProxyModel19filterAcceptsColumnEiRK11QModelIndex @ 9290 NONAME
- _ZNK21QSortFilterProxyModel19sortCaseSensitivityEv @ 9291 NONAME
- _ZNK21QSortFilterProxyModel20mapSelectionToSourceERK14QItemSelection @ 9292 NONAME
- _ZNK21QSortFilterProxyModel20supportedDropActionsEv @ 9293 NONAME
- _ZNK21QSortFilterProxyModel21filterCaseSensitivityEv @ 9294 NONAME
- _ZNK21QSortFilterProxyModel22mapSelectionFromSourceERK14QItemSelection @ 9295 NONAME
- _ZNK21QSortFilterProxyModel4dataERK11QModelIndexi @ 9296 NONAME
- _ZNK21QSortFilterProxyModel4spanERK11QModelIndex @ 9297 NONAME
- _ZNK21QSortFilterProxyModel5buddyERK11QModelIndex @ 9298 NONAME
- _ZNK21QSortFilterProxyModel5flagsERK11QModelIndex @ 9299 NONAME
- _ZNK21QSortFilterProxyModel5indexEiiRK11QModelIndex @ 9300 NONAME
- _ZNK21QSortFilterProxyModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 9301 NONAME
- _ZNK21QSortFilterProxyModel6parentERK11QModelIndex @ 9302 NONAME
- _ZNK21QSortFilterProxyModel8lessThanERK11QModelIndexS2_ @ 9303 NONAME
- _ZNK21QSortFilterProxyModel8mimeDataERK5QListI11QModelIndexE @ 9304 NONAME
- _ZNK21QSortFilterProxyModel8rowCountERK11QModelIndex @ 9305 NONAME
- _ZNK21QSortFilterProxyModel8sortRoleEv @ 9306 NONAME
- _ZNK21QSortFilterProxyModel9mimeTypesEv @ 9307 NONAME
- _ZNK21QSortFilterProxyModel9sortOrderEv @ 9308 NONAME
- _ZNK21QTextDocumentFragment11toPlainTextEv @ 9309 NONAME
- _ZNK21QTextDocumentFragment6toHtmlERK10QByteArray @ 9310 NONAME
- _ZNK21QTextDocumentFragment6toHtmlEv @ 9311 NONAME
- _ZNK21QTextDocumentFragment7isEmptyEv @ 9312 NONAME
- _ZNK21QTextFormatCollection12objectFormatEi @ 9313 NONAME
- _ZNK21QTextFormatCollection15hasFormatCachedERK11QTextFormat @ 9314 NONAME
- _ZNK21QTextFormatCollection17objectFormatIndexEi @ 9315 NONAME
- _ZNK21QTextFormatCollection6formatEi @ 9316 NONAME
- _ZNK22QGraphicsItemAnimation10metaObjectEv @ 9317 NONAME
- _ZNK22QGraphicsItemAnimation10rotationAtEf @ 9318 NONAME
- _ZNK22QGraphicsItemAnimation12rotationListEv @ 9319 NONAME
- _ZNK22QGraphicsItemAnimation14xTranslationAtEf @ 9320 NONAME
- _ZNK22QGraphicsItemAnimation14yTranslationAtEf @ 9321 NONAME
- _ZNK22QGraphicsItemAnimation15translationListEv @ 9322 NONAME
- _ZNK22QGraphicsItemAnimation15verticalScaleAtEf @ 9323 NONAME
- _ZNK22QGraphicsItemAnimation15verticalShearAtEf @ 9324 NONAME
- _ZNK22QGraphicsItemAnimation17horizontalScaleAtEf @ 9325 NONAME
- _ZNK22QGraphicsItemAnimation17horizontalShearAtEf @ 9326 NONAME
- _ZNK22QGraphicsItemAnimation4itemEv @ 9327 NONAME
- _ZNK22QGraphicsItemAnimation5posAtEf @ 9328 NONAME
- _ZNK22QGraphicsItemAnimation7posListEv @ 9329 NONAME
- _ZNK22QGraphicsItemAnimation8matrixAtEf @ 9330 NONAME
- _ZNK22QGraphicsItemAnimation8timeLineEv @ 9331 NONAME
- _ZNK22QGraphicsItemAnimation9scaleListEv @ 9332 NONAME
- _ZNK22QGraphicsItemAnimation9shearListEv @ 9333 NONAME
- _ZNK22QGraphicsLayoutPrivate15visualDirectionEv @ 9334 NONAME
- _ZNK22QGraphicsLayoutPrivate9getMarginEPffN6QStyle11PixelMetricE @ 9335 NONAME
- _ZNK22QGraphicsWidgetPrivate13hasDecorationEv @ 9336 NONAME ABSENT
- _ZNK22QGraphicsWidgetPrivate14titleBarHeightERK20QStyleOptionTitleBar @ 9337 NONAME ABSENT
- _ZNK22QGraphicsWidgetPrivate17naturalWidgetFontEv @ 9338 NONAME ABSENT
- _ZNK22QGraphicsWidgetPrivate20getLayoutItemMarginsEPfS0_S0_S0_ @ 9339 NONAME ABSENT
- _ZNK22QGraphicsWidgetPrivate20naturalWidgetPaletteEv @ 9340 NONAME ABSENT
- _ZNK23QFileSystemModelPrivate15passNameFiltersEPKNS_15QFileSystemNodeE @ 9341 NONAME
- _ZNK23QFileSystemModelPrivate18filtersAcceptsNodeEPKNS_15QFileSystemNodeE @ 9342 NONAME
- _ZNK23QFileSystemModelPrivate4iconERK11QModelIndex @ 9343 NONAME
- _ZNK23QFileSystemModelPrivate4nameERK11QModelIndex @ 9344 NONAME
- _ZNK23QFileSystemModelPrivate4nodeERK11QModelIndex @ 9345 NONAME
- _ZNK23QFileSystemModelPrivate4nodeERK7QStringb @ 9346 NONAME
- _ZNK23QFileSystemModelPrivate4sizeERK11QModelIndex @ 9347 NONAME
- _ZNK23QFileSystemModelPrivate4timeERK11QModelIndex @ 9348 NONAME
- _ZNK23QFileSystemModelPrivate4typeERK11QModelIndex @ 9349 NONAME
- _ZNK23QFileSystemModelPrivate5indexEPKNS_15QFileSystemNodeE @ 9350 NONAME
- _ZNK23QFileSystemModelPrivate8filePathERK11QModelIndex @ 9351 NONAME
- _ZNK23QGraphicsSceneHelpEvent8scenePosEv @ 9352 NONAME
- _ZNK23QGraphicsSceneHelpEvent9screenPosEv @ 9353 NONAME
- _ZNK23QGraphicsSceneMoveEvent6newPosEv @ 9354 NONAME
- _ZNK23QGraphicsSceneMoveEvent6oldPosEv @ 9355 NONAME
- _ZNK23QGraphicsSimpleTextItem10opaqueAreaEv @ 9356 NONAME
- _ZNK23QGraphicsSimpleTextItem12boundingRectEv @ 9357 NONAME
- _ZNK23QGraphicsSimpleTextItem12isObscuredByEPK13QGraphicsItem @ 9358 NONAME
- _ZNK23QGraphicsSimpleTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9359 NONAME
- _ZNK23QGraphicsSimpleTextItem4fontEv @ 9360 NONAME
- _ZNK23QGraphicsSimpleTextItem4textEv @ 9361 NONAME
- _ZNK23QGraphicsSimpleTextItem4typeEv @ 9362 NONAME
- _ZNK23QGraphicsSimpleTextItem5shapeEv @ 9363 NONAME
- _ZNK23QGraphicsSimpleTextItem8containsERK7QPointF @ 9364 NONAME
- _ZNK23QGraphicsSimpleTextItem9extensionERK8QVariant @ 9365 NONAME
- _ZNK23QImageTextureGlyphCache11glyphMarginEv @ 9366 NONAME ABSENT
- _ZNK23QPixmapDropShadowFilter10blurRadiusEv @ 9367 NONAME
- _ZNK23QPixmapDropShadowFilter10metaObjectEv @ 9368 NONAME
- _ZNK23QPixmapDropShadowFilter15boundingRectForERK6QRectF @ 9369 NONAME
- _ZNK23QPixmapDropShadowFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9370 NONAME
- _ZNK23QPixmapDropShadowFilter5colorEv @ 9371 NONAME
- _ZNK23QPixmapDropShadowFilter6offsetEv @ 9372 NONAME
- _ZNK23QTreeWidgetItemIterator12matchesFlagsEPK15QTreeWidgetItem @ 9373 NONAME
- _ZNK23QWindowStateChangeEvent10isOverrideEv @ 9374 NONAME
- _ZNK24QAbstractItemViewPrivate10shouldEditEN17QAbstractItemView11EditTriggerERK11QModelIndex @ 9375 NONAME
- _ZNK24QAbstractItemViewPrivate13viewOptionsV4Ev @ 9376 NONAME
- _ZNK24QAbstractItemViewPrivate14editorForIndexERK11QModelIndex @ 9377 NONAME
- _ZNK24QAbstractItemViewPrivate14indexForEditorEP7QWidget @ 9378 NONAME
- _ZNK24QAbstractItemViewPrivate14renderToPixmapERK5QListI11QModelIndexEP5QRect @ 9379 NONAME
- _ZNK24QAbstractItemViewPrivate16shouldAutoScrollERK6QPoint @ 9380 NONAME
- _ZNK24QAbstractItemViewPrivate17sendDelegateEventERK11QModelIndexP6QEvent @ 9381 NONAME
- _ZNK24QAbstractItemViewPrivate18shouldForwardEventEN17QAbstractItemView11EditTriggerEPK6QEvent @ 9382 NONAME
- _ZNK24QAbstractItemViewPrivate21multiSelectionCommandERK11QModelIndexPK6QEvent @ 9383 NONAME
- _ZNK24QAbstractItemViewPrivate24extendedSelectionCommandERK11QModelIndexPK6QEvent @ 9384 NONAME
- _ZNK24QAbstractItemViewPrivate24selectedDraggableIndexesEv @ 9385 NONAME
- _ZNK24QAbstractItemViewPrivate26contiguousSelectionCommandERK11QModelIndexPK6QEvent @ 9386 NONAME
- _ZNK24QAbstractItemViewPrivate27interruptDelayedItemsLayoutEv @ 9387 NONAME
- _ZNK24QAbstractItemViewPrivate8positionERK6QPointRK5QRectRK11QModelIndex @ 9388 NONAME
- _ZNK24QComboBoxPrivateScroller10metaObjectEv @ 9389 NONAME
- _ZNK24QGraphicsSceneHoverEvent12lastScenePosEv @ 9390 NONAME
- _ZNK24QGraphicsSceneHoverEvent13lastScreenPosEv @ 9391 NONAME
- _ZNK24QGraphicsSceneHoverEvent3posEv @ 9392 NONAME
- _ZNK24QGraphicsSceneHoverEvent7lastPosEv @ 9393 NONAME
- _ZNK24QGraphicsSceneHoverEvent8scenePosEv @ 9394 NONAME
- _ZNK24QGraphicsSceneHoverEvent9modifiersEv @ 9395 NONAME
- _ZNK24QGraphicsSceneHoverEvent9screenPosEv @ 9396 NONAME
- _ZNK24QGraphicsSceneMouseEvent12lastScenePosEv @ 9397 NONAME
- _ZNK24QGraphicsSceneMouseEvent13buttonDownPosEN2Qt11MouseButtonE @ 9398 NONAME
- _ZNK24QGraphicsSceneMouseEvent13lastScreenPosEv @ 9399 NONAME
- _ZNK24QGraphicsSceneMouseEvent18buttonDownScenePosEN2Qt11MouseButtonE @ 9400 NONAME
- _ZNK24QGraphicsSceneMouseEvent19buttonDownScreenPosEN2Qt11MouseButtonE @ 9401 NONAME
- _ZNK24QGraphicsSceneMouseEvent3posEv @ 9402 NONAME
- _ZNK24QGraphicsSceneMouseEvent6buttonEv @ 9403 NONAME
- _ZNK24QGraphicsSceneMouseEvent7buttonsEv @ 9404 NONAME
- _ZNK24QGraphicsSceneMouseEvent7lastPosEv @ 9405 NONAME
- _ZNK24QGraphicsSceneMouseEvent8scenePosEv @ 9406 NONAME
- _ZNK24QGraphicsSceneMouseEvent9modifiersEv @ 9407 NONAME
- _ZNK24QGraphicsSceneMouseEvent9screenPosEv @ 9408 NONAME
- _ZNK24QGraphicsSceneWheelEvent11orientationEv @ 9409 NONAME
- _ZNK24QGraphicsSceneWheelEvent3posEv @ 9410 NONAME
- _ZNK24QGraphicsSceneWheelEvent5deltaEv @ 9411 NONAME
- _ZNK24QGraphicsSceneWheelEvent7buttonsEv @ 9412 NONAME
- _ZNK24QGraphicsSceneWheelEvent8scenePosEv @ 9413 NONAME
- _ZNK24QGraphicsSceneWheelEvent9modifiersEv @ 9414 NONAME
- _ZNK24QGraphicsSceneWheelEvent9screenPosEv @ 9415 NONAME
- _ZNK24QPixmapConvolutionFilter10metaObjectEv @ 9416 NONAME
- _ZNK24QPixmapConvolutionFilter15boundingRectForERK6QRectF @ 9417 NONAME
- _ZNK24QPixmapConvolutionFilter17convolutionKernelEv @ 9418 NONAME
- _ZNK24QPixmapConvolutionFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9419 NONAME
- _ZNK24QPixmapConvolutionFilter4rowsEv @ 9420 NONAME
- _ZNK24QPixmapConvolutionFilter7columnsEv @ 9421 NONAME
- _ZNK24QPlainTextDocumentLayout10metaObjectEv @ 9422 NONAME
- _ZNK24QPlainTextDocumentLayout11cursorWidthEv @ 9423 NONAME
- _ZNK24QPlainTextDocumentLayout12documentSizeEv @ 9424 NONAME
- _ZNK24QPlainTextDocumentLayout17blockBoundingRectERK10QTextBlock @ 9425 NONAME
- _ZNK24QPlainTextDocumentLayout17ensureBlockLayoutERK10QTextBlock @ 9426 NONAME
- _ZNK24QPlainTextDocumentLayout17frameBoundingRectEP10QTextFrame @ 9427 NONAME
- _ZNK24QPlainTextDocumentLayout4privEv @ 9428 NONAME
- _ZNK24QPlainTextDocumentLayout7hitTestERK7QPointFN2Qt15HitTestAccuracyE @ 9429 NONAME
- _ZNK24QPlainTextDocumentLayout9pageCountEv @ 9430 NONAME
- _ZNK24QPlainTextDocumentLayout9textWidthEv @ 9431 NONAME
- _ZNK25QComboBoxPrivateContainer10metaObjectEv @ 9432 NONAME
- _ZNK25QComboBoxPrivateContainer16comboStyleOptionEv @ 9433 NONAME
- _ZNK25QComboBoxPrivateContainer7spacingEv @ 9434 NONAME
- _ZNK25QComboBoxPrivateContainer8itemViewEv @ 9435 NONAME
- _ZNK25QGraphicsSceneResizeEvent7newSizeEv @ 9436 NONAME
- _ZNK25QGraphicsSceneResizeEvent7oldSizeEv @ 9437 NONAME
- _ZNK26QAbstractGraphicsShapeItem10opaqueAreaEv @ 9438 NONAME
- _ZNK26QAbstractGraphicsShapeItem12isObscuredByEPK13QGraphicsItem @ 9439 NONAME
- _ZNK26QAbstractGraphicsShapeItem3penEv @ 9440 NONAME
- _ZNK26QAbstractGraphicsShapeItem5brushEv @ 9441 NONAME
- _ZNK26QAbstractScrollAreaPrivate14contentsOffsetEv @ 9442 NONAME
- _ZNK26QGraphicsLayoutItemPrivate10parentItemEv @ 9443 NONAME
- _ZNK26QGraphicsLayoutItemPrivate18effectiveSizeHintsERK6QSizeF @ 9444 NONAME
- _ZNK27QAbstractTextDocumentLayout10metaObjectEv @ 9445 NONAME
- _ZNK27QAbstractTextDocumentLayout11paintDeviceEv @ 9446 NONAME
- _ZNK27QAbstractTextDocumentLayout16handlerForObjectEi @ 9447 NONAME
- _ZNK27QAbstractTextDocumentLayout8anchorAtERK7QPointF @ 9448 NONAME
- _ZNK27QAbstractTextDocumentLayout8documentEv @ 9449 NONAME
- _ZNK27QGraphicsSceneDragDropEvent10dropActionEv @ 9450 NONAME
- _ZNK27QGraphicsSceneDragDropEvent14proposedActionEv @ 9451 NONAME
- _ZNK27QGraphicsSceneDragDropEvent15possibleActionsEv @ 9452 NONAME
- _ZNK27QGraphicsSceneDragDropEvent3posEv @ 9453 NONAME
- _ZNK27QGraphicsSceneDragDropEvent6sourceEv @ 9454 NONAME
- _ZNK27QGraphicsSceneDragDropEvent7buttonsEv @ 9455 NONAME
- _ZNK27QGraphicsSceneDragDropEvent8mimeDataEv @ 9456 NONAME
- _ZNK27QGraphicsSceneDragDropEvent8scenePosEv @ 9457 NONAME
- _ZNK27QGraphicsSceneDragDropEvent9modifiersEv @ 9458 NONAME
- _ZNK27QGraphicsSceneDragDropEvent9screenPosEv @ 9459 NONAME
- _ZNK30QGraphicsSceneContextMenuEvent3posEv @ 9460 NONAME
- _ZNK30QGraphicsSceneContextMenuEvent6reasonEv @ 9461 NONAME
- _ZNK30QGraphicsSceneContextMenuEvent8scenePosEv @ 9462 NONAME
- _ZNK30QGraphicsSceneContextMenuEvent9modifiersEv @ 9463 NONAME
- _ZNK30QGraphicsSceneContextMenuEvent9screenPosEv @ 9464 NONAME
- _ZNK4QCss11Declaration10brushValueERK8QPalette @ 9465 NONAME
- _ZNK4QCss11Declaration10colorValueERK8QPalette @ 9466 NONAME
- _ZNK4QCss11Declaration10styleValueEv @ 9467 NONAME
- _ZNK4QCss11Declaration11brushValuesEP6QBrushRK8QPalette @ 9468 NONAME
- _ZNK4QCss11Declaration11colorValuesEP6QColorRK8QPalette @ 9469 NONAME
- _ZNK4QCss11Declaration11originValueEv @ 9470 NONAME
- _ZNK4QCss11Declaration11repeatValueEv @ 9471 NONAME
- _ZNK4QCss11Declaration11styleValuesEPNS_11BorderStyleE @ 9472 NONAME
- _ZNK4QCss11Declaration13positionValueEv @ 9473 NONAME
- _ZNK4QCss11Declaration14alignmentValueEv @ 9474 NONAME
- _ZNK4QCss11Declaration15attachmentValueEv @ 9475 NONAME
- _ZNK4QCss11Declaration16borderImageValueEP7QStringPiPNS_8TileModeES5_ @ 9476 NONAME
- _ZNK4QCss11Declaration18styleFeaturesValueEv @ 9477 NONAME
- _ZNK4QCss11Declaration8intValueEPiPKc @ 9478 NONAME
- _ZNK4QCss11Declaration8uriValueEv @ 9479 NONAME
- _ZNK4QCss11Declaration9iconValueEv @ 9480 NONAME
- _ZNK4QCss11Declaration9realValueEPfPKc @ 9481 NONAME
- _ZNK4QCss11Declaration9rectValueEv @ 9482 NONAME
- _ZNK4QCss11Declaration9sizeValueEv @ 9483 NONAME
- _ZNK4QCss13StyleSelector14nodeNameEqualsENS0_7NodePtrERK7QString @ 9484 NONAME
- _ZNK4QCss13StyleSelector7nodeIdsENS0_7NodePtrE @ 9485 NONAME
- _ZNK4QCss5Value8toStringEv @ 9486 NONAME
- _ZNK4QCss6Parser13unquotedLexemEv @ 9487 NONAME
- _ZNK4QCss6Symbol5lexemEv @ 9488 NONAME
- _ZNK4QCss8Selector11pseudoClassEPy @ 9489 NONAME
- _ZNK4QCss8Selector11specificityEv @ 9490 NONAME
- _ZNK4QCss8Selector13pseudoElementEv @ 9491 NONAME
- _ZNK4QPen10dashOffsetEv @ 9492 NONAME
- _ZNK4QPen10isCosmeticEv @ 9493 NONAME
- _ZNK4QPen10miterLimitEv @ 9494 NONAME
- _ZNK4QPen11dashPatternEv @ 9495 NONAME
- _ZNK4QPen5brushEv @ 9496 NONAME
- _ZNK4QPen5colorEv @ 9497 NONAME
- _ZNK4QPen5styleEv @ 9498 NONAME
- _ZNK4QPen5widthEv @ 9499 NONAME
- _ZNK4QPen6widthFEv @ 9500 NONAME
- _ZNK4QPen7isSolidEv @ 9501 NONAME
- _ZNK4QPen8capStyleEv @ 9502 NONAME
- _ZNK4QPen9joinStyleEv @ 9503 NONAME
- _ZNK4QPencv8QVariantEv @ 9504 NONAME
- _ZNK4QPeneqERKS_ @ 9505 NONAME
- _ZNK5QDial10metaObjectEv @ 9506 NONAME
- _ZNK5QDial11notchTargetEv @ 9507 NONAME
- _ZNK5QDial14notchesVisibleEv @ 9508 NONAME
- _ZNK5QDial15initStyleOptionEP18QStyleOptionSlider @ 9509 NONAME
- _ZNK5QDial15minimumSizeHintEv @ 9510 NONAME
- _ZNK5QDial8sizeHintEv @ 9511 NONAME
- _ZNK5QDial8wrappingEv @ 9512 NONAME
- _ZNK5QDial9notchSizeEv @ 9513 NONAME
- _ZNK5QDrag10metaObjectEv @ 9514 NONAME
- _ZNK5QDrag6pixmapEv @ 9515 NONAME
- _ZNK5QDrag6sourceEv @ 9516 NONAME
- _ZNK5QDrag6targetEv @ 9517 NONAME
- _ZNK5QDrag7hotSpotEv @ 9518 NONAME
- _ZNK5QDrag8mimeDataEv @ 9519 NONAME
- _ZNK5QFont10exactMatchEv @ 9520 NONAME
- _ZNK5QFont10fixedPitchEv @ 9521 NONAME
- _ZNK5QFont10pointSizeFEv @ 9522 NONAME
- _ZNK5QFont11wordSpacingEv @ 9523 NONAME
- _ZNK5QFont13defaultFamilyEv @ 9524 NONAME
- _ZNK5QFont13letterSpacingEv @ 9525 NONAME
- _ZNK5QFont13styleStrategyEv @ 9526 NONAME
- _ZNK5QFont14capitalizationEv @ 9527 NONAME
- _ZNK5QFont16lastResortFamilyEv @ 9528 NONAME
- _ZNK5QFont17letterSpacingTypeEv @ 9529 NONAME
- _ZNK5QFont3keyEv @ 9530 NONAME
- _ZNK5QFont5styleEv @ 9531 NONAME
- _ZNK5QFont6familyEv @ 9532 NONAME
- _ZNK5QFont6weightEv @ 9533 NONAME
- _ZNK5QFont7kerningEv @ 9534 NONAME
- _ZNK5QFont7rawModeEv @ 9535 NONAME
- _ZNK5QFont7resolveERKS_ @ 9536 NONAME
- _ZNK5QFont7stretchEv @ 9537 NONAME
- _ZNK5QFont8isCopyOfERKS_ @ 9538 NONAME
- _ZNK5QFont8overlineEv @ 9539 NONAME
- _ZNK5QFont8toStringEv @ 9540 NONAME
- _ZNK5QFont9pixelSizeEv @ 9541 NONAME
- _ZNK5QFont9pointSizeEv @ 9542 NONAME
- _ZNK5QFont9strikeOutEv @ 9543 NONAME
- _ZNK5QFont9styleHintEv @ 9544 NONAME
- _ZNK5QFont9underlineEv @ 9545 NONAME
- _ZNK5QFontcv8QVariantEv @ 9546 NONAME
- _ZNK5QFonteqERKS_ @ 9547 NONAME
- _ZNK5QFontltERKS_ @ 9548 NONAME
- _ZNK5QFontneERKS_ @ 9549 NONAME
- _ZNK5QIcon10actualSizeERK5QSizeNS_4ModeENS_5StateE @ 9550 NONAME
- _ZNK5QIcon10isDetachedEv @ 9551 NONAME
- _ZNK5QIcon12serialNumberEv @ 9552 NONAME
- _ZNK5QIcon14availableSizesENS_4ModeENS_5StateE @ 9553 NONAME
- _ZNK5QIcon5paintEP8QPainterRK5QRect6QFlagsIN2Qt13AlignmentFlagEENS_4ModeENS_5StateE @ 9554 NONAME
- _ZNK5QIcon6isNullEv @ 9555 NONAME
- _ZNK5QIcon6pixmapERK5QSizeNS_4ModeENS_5StateE @ 9556 NONAME
- _ZNK5QIcon8cacheKeyEv @ 9557 NONAME
- _ZNK5QIconcv8QVariantEv @ 9558 NONAME
- _ZNK5QMenu10menuActionEv @ 9559 NONAME
- _ZNK5QMenu10metaObjectEv @ 9560 NONAME
- _ZNK5QMenu11columnCountEv @ 9561 NONAME
- _ZNK5QMenu12activeActionEv @ 9562 NONAME
- _ZNK5QMenu13defaultActionEv @ 9563 NONAME
- _ZNK5QMenu14actionGeometryEP7QAction @ 9564 NONAME
- _ZNK5QMenu15initStyleOptionEP20QStyleOptionMenuItemPK7QAction @ 9565 NONAME
- _ZNK5QMenu16isTearOffEnabledEv @ 9566 NONAME
- _ZNK5QMenu20isTearOffMenuVisibleEv @ 9567 NONAME
- _ZNK5QMenu21separatorsCollapsibleEv @ 9568 NONAME
- _ZNK5QMenu4iconEv @ 9569 NONAME
- _ZNK5QMenu5titleEv @ 9570 NONAME
- _ZNK5QMenu7isEmptyEv @ 9571 NONAME
- _ZNK5QMenu8actionAtERK6QPoint @ 9572 NONAME
- _ZNK5QMenu8sizeHintEv @ 9573 NONAME
- _ZNK6QBrush12textureImageEv @ 9574 NONAME
- _ZNK6QBrush7textureEv @ 9575 NONAME
- _ZNK6QBrush8gradientEv @ 9576 NONAME
- _ZNK6QBrush8isOpaqueEv @ 9577 NONAME
- _ZNK6QBrushcv8QVariantEv @ 9578 NONAME
- _ZNK6QBrusheqERKS_ @ 9579 NONAME
- _ZNK6QColor10saturationEv @ 9580 NONAME
- _ZNK6QColor11saturationFEv @ 9581 NONAME
- _ZNK6QColor3hueEv @ 9582 NONAME
- _ZNK6QColor3redEv @ 9583 NONAME
- _ZNK6QColor3rgbEv @ 9584 NONAME
- _ZNK6QColor4blueEv @ 9585 NONAME
- _ZNK6QColor4cyanEv @ 9586 NONAME
- _ZNK6QColor4darkEi @ 9587 NONAME
- _ZNK6QColor4hueFEv @ 9588 NONAME
- _ZNK6QColor4nameEv @ 9589 NONAME
- _ZNK6QColor4redFEv @ 9590 NONAME
- _ZNK6QColor4rgbaEv @ 9591 NONAME
- _ZNK6QColor5alphaEv @ 9592 NONAME
- _ZNK6QColor5blackEv @ 9593 NONAME
- _ZNK6QColor5blueFEv @ 9594 NONAME
- _ZNK6QColor5cyanFEv @ 9595 NONAME
- _ZNK6QColor5greenEv @ 9596 NONAME
- _ZNK6QColor5lightEi @ 9597 NONAME
- _ZNK6QColor5toHsvEv @ 9598 NONAME
- _ZNK6QColor5toRgbEv @ 9599 NONAME
- _ZNK6QColor5valueEv @ 9600 NONAME
- _ZNK6QColor6alphaFEv @ 9601 NONAME
- _ZNK6QColor6blackFEv @ 9602 NONAME
- _ZNK6QColor6getHsvEPiS0_S0_S0_ @ 9603 NONAME
- _ZNK6QColor6getRgbEPiS0_S0_S0_ @ 9604 NONAME
- _ZNK6QColor6greenFEv @ 9605 NONAME
- _ZNK6QColor6toCmykEv @ 9606 NONAME
- _ZNK6QColor6valueFEv @ 9607 NONAME
- _ZNK6QColor6yellowEv @ 9608 NONAME
- _ZNK6QColor7getHsvFEPfS0_S0_S0_ @ 9609 NONAME
- _ZNK6QColor7getRgbFEPfS0_S0_S0_ @ 9610 NONAME
- _ZNK6QColor7magentaEv @ 9611 NONAME
- _ZNK6QColor7yellowFEv @ 9612 NONAME
- _ZNK6QColor8magentaFEv @ 9613 NONAME
- _ZNK6QColor9convertToENS_4SpecE @ 9614 NONAME
- _ZNK6QColorcv8QVariantEv @ 9615 NONAME
- _ZNK6QColoreqERKS_ @ 9616 NONAME
- _ZNK6QColorneERKS_ @ 9617 NONAME
- _ZNK6QFrame10frameShapeEv @ 9618 NONAME
- _ZNK6QFrame10frameStyleEv @ 9619 NONAME
- _ZNK6QFrame10frameWidthEv @ 9620 NONAME
- _ZNK6QFrame10metaObjectEv @ 9621 NONAME
- _ZNK6QFrame11frameShadowEv @ 9622 NONAME
- _ZNK6QFrame12midLineWidthEv @ 9623 NONAME
- _ZNK6QFrame8sizeHintEv @ 9624 NONAME
- _ZNK6QFrame9frameRectEv @ 9625 NONAME
- _ZNK6QFrame9lineWidthEv @ 9626 NONAME
- _ZNK6QImage10colorTableEv @ 9627 NONAME
- _ZNK6QImage10isDetachedEv @ 9628 NONAME
- _ZNK6QImage10pixelIndexEii @ 9629 NONAME
- _ZNK6QImage10rgbSwappedEv @ 9630 NONAME
- _ZNK6QImage11isGrayscaleEv @ 9631 NONAME
- _ZNK6QImage11paintEngineEv @ 9632 NONAME
- _ZNK6QImage11transformedERK10QTransformN2Qt18TransformationModeE @ 9633 NONAME
- _ZNK6QImage11transformedERK7QMatrixN2Qt18TransformationModeE @ 9634 NONAME
- _ZNK6QImage12alphaChannelEv @ 9635 NONAME
- _ZNK6QImage12bytesPerLineEv @ 9636 NONAME
- _ZNK6QImage12serialNumberEv @ 9637 NONAME
- _ZNK6QImage13dotsPerMeterXEv @ 9638 NONAME
- _ZNK6QImage13dotsPerMeterYEv @ 9639 NONAME
- _ZNK6QImage13scaledToWidthEiN2Qt18TransformationModeE @ 9640 NONAME
- _ZNK6QImage13textLanguagesEv @ 9641 NONAME
- _ZNK6QImage14scaledToHeightEiN2Qt18TransformationModeE @ 9642 NONAME
- _ZNK6QImage15convertToFormatENS_6FormatE6QFlagsIN2Qt19ImageConversionFlagEE @ 9643 NONAME
- _ZNK6QImage15convertToFormatENS_6FormatERK7QVectorIjE6QFlagsIN2Qt19ImageConversionFlagEE @ 9644 NONAME
- _ZNK6QImage15createAlphaMaskE6QFlagsIN2Qt19ImageConversionFlagEE @ 9645 NONAME
- _ZNK6QImage15hasAlphaChannelEv @ 9646 NONAME
- _ZNK6QImage19createHeuristicMaskEb @ 9647 NONAME
- _ZNK6QImage19createMaskFromColorEjN2Qt8MaskModeE @ 9648 NONAME
- _ZNK6QImage4bitsEv @ 9649 NONAME
- _ZNK6QImage4copyERK5QRect @ 9650 NONAME
- _ZNK6QImage4rectEv @ 9651 NONAME
- _ZNK6QImage4saveEP9QIODevicePKci @ 9652 NONAME
- _ZNK6QImage4saveERK7QStringPKci @ 9653 NONAME
- _ZNK6QImage4sizeEv @ 9654 NONAME
- _ZNK6QImage4textEPKcS1_ @ 9655 NONAME
- _ZNK6QImage4textERK17QImageTextKeyLang @ 9656 NONAME
- _ZNK6QImage4textERK7QString @ 9657 NONAME
- _ZNK6QImage5colorEi @ 9658 NONAME
- _ZNK6QImage5depthEv @ 9659 NONAME
- _ZNK6QImage5pixelEii @ 9660 NONAME
- _ZNK6QImage5validEii @ 9661 NONAME
- _ZNK6QImage5widthEv @ 9662 NONAME
- _ZNK6QImage6formatEv @ 9663 NONAME
- _ZNK6QImage6heightEv @ 9664 NONAME
- _ZNK6QImage6isNullEv @ 9665 NONAME
- _ZNK6QImage6metricEN12QPaintDevice17PaintDeviceMetricE @ 9666 NONAME
- _ZNK6QImage6offsetEv @ 9667 NONAME
- _ZNK6QImage6scaledERK5QSizeN2Qt15AspectRatioModeENS3_18TransformationModeE @ 9668 NONAME
- _ZNK6QImage7allGrayEv @ 9669 NONAME
- _ZNK6QImage7devTypeEv @ 9670 NONAME
- _ZNK6QImage8cacheKeyEv @ 9671 NONAME
- _ZNK6QImage8mirroredEbb @ 9672 NONAME
- _ZNK6QImage8numBytesEv @ 9673 NONAME
- _ZNK6QImage8scanLineEi @ 9674 NONAME
- _ZNK6QImage8textKeysEv @ 9675 NONAME
- _ZNK6QImage8textListEv @ 9676 NONAME
- _ZNK6QImage9numColorsEv @ 9677 NONAME
- _ZNK6QImagecv8QVariantEv @ 9678 NONAME
- _ZNK6QImageeqERKS_ @ 9679 NONAME
- _ZNK6QImageneERKS_ @ 9680 NONAME
- _ZNK6QLabel10metaObjectEv @ 9681 NONAME
- _ZNK6QLabel10textFormatEv @ 9682 NONAME
- _ZNK6QLabel14heightForWidthEi @ 9683 NONAME
- _ZNK6QLabel15minimumSizeHintEv @ 9684 NONAME
- _ZNK6QLabel17hasScaledContentsEv @ 9685 NONAME
- _ZNK6QLabel17openExternalLinksEv @ 9686 NONAME
- _ZNK6QLabel20textInteractionFlagsEv @ 9687 NONAME
- _ZNK6QLabel4textEv @ 9688 NONAME
- _ZNK6QLabel5buddyEv @ 9689 NONAME
- _ZNK6QLabel5movieEv @ 9690 NONAME
- _ZNK6QLabel6indentEv @ 9691 NONAME
- _ZNK6QLabel6marginEv @ 9692 NONAME
- _ZNK6QLabel6pixmapEv @ 9693 NONAME
- _ZNK6QLabel7pictureEv @ 9694 NONAME
- _ZNK6QLabel8sizeHintEv @ 9695 NONAME
- _ZNK6QLabel8wordWrapEv @ 9696 NONAME
- _ZNK6QLabel9alignmentEv @ 9697 NONAME
- _ZNK6QMovie10frameCountEv @ 9698 NONAME
- _ZNK6QMovie10metaObjectEv @ 9699 NONAME
- _ZNK6QMovie12currentImageEv @ 9700 NONAME
- _ZNK6QMovie13currentPixmapEv @ 9701 NONAME
- _ZNK6QMovie14nextFrameDelayEv @ 9702 NONAME
- _ZNK6QMovie15backgroundColorEv @ 9703 NONAME
- _ZNK6QMovie18currentFrameNumberEv @ 9704 NONAME
- _ZNK6QMovie5speedEv @ 9705 NONAME
- _ZNK6QMovie5stateEv @ 9706 NONAME
- _ZNK6QMovie6deviceEv @ 9707 NONAME
- _ZNK6QMovie6formatEv @ 9708 NONAME
- _ZNK6QMovie7isValidEv @ 9709 NONAME
- _ZNK6QMovie8fileNameEv @ 9710 NONAME
- _ZNK6QMovie9cacheModeEv @ 9711 NONAME
- _ZNK6QMovie9frameRectEv @ 9712 NONAME
- _ZNK6QMovie9loopCountEv @ 9713 NONAME
- _ZNK6QSound10isFinishedEv @ 9714 NONAME
- _ZNK6QSound10metaObjectEv @ 9715 NONAME
- _ZNK6QSound14loopsRemainingEv @ 9716 NONAME
- _ZNK6QSound5loopsEv @ 9717 NONAME
- _ZNK6QSound8fileNameEv @ 9718 NONAME
- _ZNK6QStyle10metaObjectEv @ 9719 NONAME
- _ZNK6QStyle12drawItemTextEP8QPainterRK5QRectiRK8QPalettebRK7QStringNS5_9ColorRoleE @ 9720 NONAME
- _ZNK6QStyle12itemTextRectERK12QFontMetricsRK5QRectibRK7QString @ 9721 NONAME
- _ZNK6QStyle12standardIconENS_14StandardPixmapEPK12QStyleOptionPK7QWidget @ 9722 NONAME
- _ZNK6QStyle13layoutSpacingEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 9723 NONAME
- _ZNK6QStyle14drawItemPixmapEP8QPainterRK5QRectiRK7QPixmap @ 9724 NONAME
- _ZNK6QStyle14itemPixmapRectERK5QRectiRK7QPixmap @ 9725 NONAME
- _ZNK6QStyle15standardPaletteEv @ 9726 NONAME
- _ZNK6QStyle21combinedLayoutSpacingE6QFlagsIN11QSizePolicy11ControlTypeEES3_N2Qt11OrientationEP12QStyleOptionP7QWidget @ 9727 NONAME
- _ZNK6QStyle26standardIconImplementationENS_14StandardPixmapEPK12QStyleOptionPK7QWidget @ 9728 NONAME
- _ZNK6QStyle27layoutSpacingImplementationEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 9729 NONAME
- _ZNK7QAction10autoRepeatEv @ 9730 NONAME
- _ZNK7QAction10metaObjectEv @ 9731 NONAME
- _ZNK7QAction11actionGroupEv @ 9732 NONAME
- _ZNK7QAction11isCheckableEv @ 9733 NONAME
- _ZNK7QAction11isSeparatorEv @ 9734 NONAME
- _ZNK7QAction11softKeyRoleEv @ 9735 NONAME
- _ZNK7QAction12parentWidgetEv @ 9736 NONAME
- _ZNK7QAction15shortcutContextEv @ 9737 NONAME
- _ZNK7QAction17associatedWidgetsEv @ 9738 NONAME
- _ZNK7QAction19isIconVisibleInMenuEv @ 9739 NONAME
- _ZNK7QAction25associatedGraphicsWidgetsEv @ 9740 NONAME
- _ZNK7QAction4dataEv @ 9741 NONAME
- _ZNK7QAction4fontEv @ 9742 NONAME
- _ZNK7QAction4iconEv @ 9743 NONAME
- _ZNK7QAction4menuEv @ 9744 NONAME
- _ZNK7QAction4textEv @ 9745 NONAME
- _ZNK7QAction7toolTipEv @ 9746 NONAME
- _ZNK7QAction8iconTextEv @ 9747 NONAME
- _ZNK7QAction8menuRoleEv @ 9748 NONAME
- _ZNK7QAction8shortcutEv @ 9749 NONAME
- _ZNK7QAction9isCheckedEv @ 9750 NONAME
- _ZNK7QAction9isEnabledEv @ 9751 NONAME
- _ZNK7QAction9isVisibleEv @ 9752 NONAME
- _ZNK7QAction9shortcutsEv @ 9753 NONAME
- _ZNK7QAction9statusTipEv @ 9754 NONAME
- _ZNK7QAction9whatsThisEv @ 9755 NONAME
- _ZNK7QBezier10addIfCloseEPff @ 9756 NONAME
- _ZNK7QBezier12addToPolygonEP9QPolygonF @ 9757 NONAME
- _ZNK7QBezier16bezierOnIntervalEff @ 9758 NONAME
- _ZNK7QBezier17addToPolygonMixedEP9QPolygonF @ 9759 NONAME
- _ZNK7QBezier17stationaryYPointsERfS0_ @ 9760 NONAME
- _ZNK7QBezier21addToPolygonIterativeEP9QPolygonF @ 9761 NONAME
- _ZNK7QBezier5tForYEfff @ 9762 NONAME
- _ZNK7QBezier6boundsEv @ 9763 NONAME
- _ZNK7QBezier6lengthEf @ 9764 NONAME
- _ZNK7QBezier7shiftedEPS_iff @ 9765 NONAME
- _ZNK7QBezier9tAtLengthEf @ 9766 NONAME
- _ZNK7QBezier9toPolygonEv @ 9767 NONAME
- _ZNK7QBitmap11transformedERK10QTransform @ 9768 NONAME
- _ZNK7QBitmap11transformedERK7QMatrix @ 9769 NONAME
- _ZNK7QBitmapcv8QVariantEv @ 9770 NONAME
- _ZNK7QDialog10metaObjectEv @ 9771 NONAME
- _ZNK7QDialog11orientationEv @ 9772 NONAME
- _ZNK7QDialog15minimumSizeHintEv @ 9773 NONAME
- _ZNK7QDialog17isSizeGripEnabledEv @ 9774 NONAME
- _ZNK7QDialog6resultEv @ 9775 NONAME
- _ZNK7QDialog8sizeHintEv @ 9776 NONAME
- _ZNK7QDialog9extensionEv @ 9777 NONAME
- _ZNK7QLayout10metaObjectEv @ 9778 NONAME
- _ZNK7QLayout11maximumSizeEv @ 9779 NONAME
- _ZNK7QLayout11minimumSizeEv @ 9780 NONAME
- _ZNK7QLayout12contentsRectEv @ 9781 NONAME
- _ZNK7QLayout12parentWidgetEv @ 9782 NONAME
- _ZNK7QLayout13alignmentRectERK5QRect @ 9783 NONAME
- _ZNK7QLayout13totalSizeHintEv @ 9784 NONAME
- _ZNK7QLayout14sizeConstraintEv @ 9785 NONAME
- _ZNK7QLayout16totalMaximumSizeEv @ 9786 NONAME
- _ZNK7QLayout16totalMinimumSizeEv @ 9787 NONAME
- _ZNK7QLayout18getContentsMarginsEPiS0_S0_S0_ @ 9788 NONAME
- _ZNK7QLayout19expandingDirectionsEv @ 9789 NONAME
- _ZNK7QLayout19totalHeightForWidthEi @ 9790 NONAME
- _ZNK7QLayout6marginEv @ 9791 NONAME
- _ZNK7QLayout7indexOfEP7QWidget @ 9792 NONAME
- _ZNK7QLayout7isEmptyEv @ 9793 NONAME
- _ZNK7QLayout7menuBarEv @ 9794 NONAME
- _ZNK7QLayout7spacingEv @ 9795 NONAME
- _ZNK7QLayout8geometryEv @ 9796 NONAME
- _ZNK7QLayout9isEnabledEv @ 9797 NONAME
- _ZNK7QMatrix12mapToPolygonERK5QRect @ 9798 NONAME
- _ZNK7QMatrix3mapERK12QPainterPath @ 9799 NONAME
- _ZNK7QMatrix3mapERK5QLine @ 9800 NONAME
- _ZNK7QMatrix3mapERK6QLineF @ 9801 NONAME
- _ZNK7QMatrix3mapERK6QPoint @ 9802 NONAME
- _ZNK7QMatrix3mapERK7QPointF @ 9803 NONAME
- _ZNK7QMatrix3mapERK7QRegion @ 9804 NONAME
- _ZNK7QMatrix3mapERK8QPolygon @ 9805 NONAME
- _ZNK7QMatrix3mapERK9QPolygonF @ 9806 NONAME
- _ZNK7QMatrix3mapEffPfS0_ @ 9807 NONAME
- _ZNK7QMatrix3mapEiiPiS0_ @ 9808 NONAME
- _ZNK7QMatrix7mapRectERK5QRect @ 9809 NONAME
- _ZNK7QMatrix7mapRectERK6QRectF @ 9810 NONAME
- _ZNK7QMatrix8invertedEPb @ 9811 NONAME
- _ZNK7QMatrixcv8QVariantEv @ 9812 NONAME
- _ZNK7QMatrixeqERKS_ @ 9813 NONAME
- _ZNK7QMatrixmlERKS_ @ 9814 NONAME
- _ZNK7QMatrixneERKS_ @ 9815 NONAME
- _ZNK7QPixmap10isDetachedEv @ 9816 NONAME
- _ZNK7QPixmap10pixmapDataEv @ 9817 NONAME
- _ZNK7QPixmap11paintEngineEv @ 9818 NONAME
- _ZNK7QPixmap11transformedERK10QTransformN2Qt18TransformationModeE @ 9819 NONAME
- _ZNK7QPixmap11transformedERK7QMatrixN2Qt18TransformationModeE @ 9820 NONAME
- _ZNK7QPixmap12alphaChannelEv @ 9821 NONAME
- _ZNK7QPixmap12serialNumberEv @ 9822 NONAME
- _ZNK7QPixmap13scaledToWidthEiN2Qt18TransformationModeE @ 9823 NONAME
- _ZNK7QPixmap14scaledToHeightEiN2Qt18TransformationModeE @ 9824 NONAME
- _ZNK7QPixmap15hasAlphaChannelEv @ 9825 NONAME
- _ZNK7QPixmap19createHeuristicMaskEb @ 9826 NONAME
- _ZNK7QPixmap19createMaskFromColorERK6QColor @ 9827 NONAME
- _ZNK7QPixmap19createMaskFromColorERK6QColorN2Qt8MaskModeE @ 9828 NONAME
- _ZNK7QPixmap19toSymbianCFbsBitmapEv @ 9829 NONAME
- _ZNK7QPixmap4copyERK5QRect @ 9830 NONAME
- _ZNK7QPixmap4maskEv @ 9831 NONAME
- _ZNK7QPixmap4rectEv @ 9832 NONAME
- _ZNK7QPixmap4saveEP9QIODevicePKci @ 9833 NONAME
- _ZNK7QPixmap4saveERK7QStringPKci @ 9834 NONAME
- _ZNK7QPixmap4sizeEv @ 9835 NONAME
- _ZNK7QPixmap5depthEv @ 9836 NONAME
- _ZNK7QPixmap5widthEv @ 9837 NONAME
- _ZNK7QPixmap6heightEv @ 9838 NONAME
- _ZNK7QPixmap6isNullEv @ 9839 NONAME
- _ZNK7QPixmap6metricEN12QPaintDevice17PaintDeviceMetricE @ 9840 NONAME
- _ZNK7QPixmap6scaledERK5QSizeN2Qt15AspectRatioModeENS3_18TransformationModeE @ 9841 NONAME
- _ZNK7QPixmap7devTypeEv @ 9842 NONAME
- _ZNK7QPixmap7toImageEv @ 9843 NONAME
- _ZNK7QPixmap8cacheKeyEv @ 9844 NONAME
- _ZNK7QPixmap8hasAlphaEv @ 9845 NONAME
- _ZNK7QPixmap9doImageIOEP12QImageWriteri @ 9846 NONAME
- _ZNK7QPixmap9isQBitmapEv @ 9847 NONAME
- _ZNK7QPixmapcv8QVariantEv @ 9848 NONAME
- _ZNK7QRegion10intersectsERK5QRect @ 9849 NONAME
- _ZNK7QRegion10intersectsERKS_ @ 9850 NONAME
- _ZNK7QRegion10translatedEii @ 9851 NONAME
- _ZNK7QRegion12boundingRectEv @ 9852 NONAME
- _ZNK7QRegion3eorERKS_ @ 9853 NONAME
- _ZNK7QRegion4copyEv @ 9854 NONAME
- _ZNK7QRegion5rectsEv @ 9855 NONAME
- _ZNK7QRegion5uniteERK5QRect @ 9856 NONAME
- _ZNK7QRegion5uniteERKS_ @ 9857 NONAME
- _ZNK7QRegion7isEmptyEv @ 9858 NONAME
- _ZNK7QRegion8containsERK5QRect @ 9859 NONAME
- _ZNK7QRegion8containsERK6QPoint @ 9860 NONAME
- _ZNK7QRegion8numRectsEv @ 9861 NONAME
- _ZNK7QRegion8subtractERKS_ @ 9862 NONAME
- _ZNK7QRegion9intersectERK5QRect @ 9863 NONAME
- _ZNK7QRegion9intersectERKS_ @ 9864 NONAME
- _ZNK7QRegionanERK5QRect @ 9865 NONAME
- _ZNK7QRegionanERKS_ @ 9866 NONAME
- _ZNK7QRegioncv8QVariantEv @ 9867 NONAME
- _ZNK7QRegioneoERKS_ @ 9868 NONAME
- _ZNK7QRegioneqERKS_ @ 9869 NONAME
- _ZNK7QRegionmiERKS_ @ 9870 NONAME
- _ZNK7QRegionorERKS_ @ 9871 NONAME
- _ZNK7QRegionplERK5QRect @ 9872 NONAME
- _ZNK7QRegionplERKS_ @ 9873 NONAME
- _ZNK7QSlider10metaObjectEv @ 9874 NONAME
- _ZNK7QSlider12tickIntervalEv @ 9875 NONAME
- _ZNK7QSlider12tickPositionEv @ 9876 NONAME
- _ZNK7QSlider15initStyleOptionEP18QStyleOptionSlider @ 9877 NONAME
- _ZNK7QSlider15minimumSizeHintEv @ 9878 NONAME
- _ZNK7QSlider8sizeHintEv @ 9879 NONAME
- _ZNK7QTabBar10metaObjectEv @ 9880 NONAME
- _ZNK7QTabBar10tabToolTipEi @ 9881 NONAME
- _ZNK7QTabBar11tabSizeHintEi @ 9882 NONAME
- _ZNK7QTabBar12currentIndexEv @ 9883 NONAME
- _ZNK7QTabBar12documentModeEv @ 9884 NONAME
- _ZNK7QTabBar12isTabEnabledEi @ 9885 NONAME
- _ZNK7QTabBar12tabTextColorEi @ 9886 NONAME
- _ZNK7QTabBar12tabWhatsThisEi @ 9887 NONAME
- _ZNK7QTabBar12tabsClosableEv @ 9888 NONAME
- _ZNK7QTabBar15initStyleOptionEP15QStyleOptionTabi @ 9889 NONAME
- _ZNK7QTabBar15minimumSizeHintEv @ 9890 NONAME
- _ZNK7QTabBar17usesScrollButtonsEv @ 9891 NONAME
- _ZNK7QTabBar25selectionBehaviorOnRemoveEv @ 9892 NONAME
- _ZNK7QTabBar5countEv @ 9893 NONAME
- _ZNK7QTabBar5shapeEv @ 9894 NONAME
- _ZNK7QTabBar5tabAtERK6QPoint @ 9895 NONAME
- _ZNK7QTabBar7tabDataEi @ 9896 NONAME
- _ZNK7QTabBar7tabIconEi @ 9897 NONAME
- _ZNK7QTabBar7tabRectEi @ 9898 NONAME
- _ZNK7QTabBar7tabTextEi @ 9899 NONAME
- _ZNK7QTabBar8drawBaseEv @ 9900 NONAME
- _ZNK7QTabBar8iconSizeEv @ 9901 NONAME
- _ZNK7QTabBar8sizeHintEv @ 9902 NONAME
- _ZNK7QTabBar9elideModeEv @ 9903 NONAME
- _ZNK7QTabBar9expandingEv @ 9904 NONAME
- _ZNK7QTabBar9isMovableEv @ 9905 NONAME
- _ZNK7QTabBar9tabButtonEiNS_14ButtonPositionE @ 9906 NONAME
- _ZNK7QWidget10focusProxyEv @ 9907 NONAME
- _ZNK7QWidget10metaObjectEv @ 9908 NONAME
- _ZNK7QWidget10sizePolicyEv @ 9909 NONAME
- _ZNK7QWidget10styleSheetEv @ 9910 NONAME
- _ZNK7QWidget10windowIconEv @ 9911 NONAME
- _ZNK7QWidget10windowRoleEv @ 9912 NONAME
- _ZNK7QWidget11acceptDropsEv @ 9913 NONAME
- _ZNK7QWidget11focusPolicyEv @ 9914 NONAME
- _ZNK7QWidget11focusWidgetEv @ 9915 NONAME
- _ZNK7QWidget11isEnabledToEPS_ @ 9916 NONAME
- _ZNK7QWidget11isMaximizedEv @ 9917 NONAME
- _ZNK7QWidget11isMinimizedEv @ 9918 NONAME
- _ZNK7QWidget11isVisibleToEPS_ @ 9919 NONAME
- _ZNK7QWidget11mapToGlobalERK6QPoint @ 9920 NONAME
- _ZNK7QWidget11mapToParentERK6QPoint @ 9921 NONAME
- _ZNK7QWidget11maximumSizeEv @ 9922 NONAME
- _ZNK7QWidget11minimumSizeEv @ 9923 NONAME
- _ZNK7QWidget11paintEngineEv @ 9924 NONAME
- _ZNK7QWidget11windowStateEv @ 9925 NONAME
- _ZNK7QWidget11windowTitleEv @ 9926 NONAME
- _ZNK7QWidget12childrenRectEv @ 9927 NONAME
- _ZNK7QWidget12contentsRectEv @ 9928 NONAME
- _ZNK7QWidget12hasEditFocusEv @ 9929 NONAME
- _ZNK7QWidget12isAncestorOfEPKS_ @ 9930 NONAME
- _ZNK7QWidget12isFullScreenEv @ 9931 NONAME
- _ZNK7QWidget12saveGeometryEv @ 9932 NONAME
- _ZNK7QWidget13frameGeometryEv @ 9933 NONAME
- _ZNK7QWidget13mapFromGlobalERK6QPoint @ 9934 NONAME
- _ZNK7QWidget13mapFromParentERK6QPoint @ 9935 NONAME
- _ZNK7QWidget13sizeIncrementEv @ 9936 NONAME
- _ZNK7QWidget13visibleRegionEv @ 9937 NONAME
- _ZNK7QWidget13windowOpacityEv @ 9938 NONAME
- _ZNK7QWidget13windowSurfaceEv @ 9939 NONAME
- _ZNK7QWidget14backgroundRoleEv @ 9940 NONAME
- _ZNK7QWidget14childrenRegionEv @ 9941 NONAME
- _ZNK7QWidget14effectiveWinIdEv @ 9942 NONAME
- _ZNK7QWidget14ensurePolishedEv @ 9943 NONAME
- _ZNK7QWidget14foregroundRoleEv @ 9944 NONAME
- _ZNK7QWidget14heightForWidthEi @ 9945 NONAME
- _ZNK7QWidget14isActiveWindowEv @ 9946 NONAME
- _ZNK7QWidget14normalGeometryEv @ 9947 NONAME
- _ZNK7QWidget14windowFilePathEv @ 9948 NONAME
- _ZNK7QWidget14windowIconTextEv @ 9949 NONAME
- _ZNK7QWidget14windowModalityEv @ 9950 NONAME
- _ZNK7QWidget15layoutDirectionEv @ 9951 NONAME
- _ZNK7QWidget15minimumSizeHintEv @ 9952 NONAME
- _ZNK7QWidget16inputMethodHintsEv @ 9953 NONAME
- _ZNK7QWidget16inputMethodQueryEN2Qt16InputMethodQueryE @ 9954 NONAME
- _ZNK7QWidget16isWindowModifiedEv @ 9955 NONAME
- _ZNK7QWidget16nextInFocusChainEv @ 9956 NONAME
- _ZNK7QWidget17contextMenuPolicyEv @ 9957 NONAME
- _ZNK7QWidget18autoFillBackgroundEv @ 9958 NONAME
- _ZNK7QWidget18getContentsMarginsEPiS0_S0_S0_ @ 9959 NONAME
- _ZNK7QWidget18nativeParentWidgetEv @ 9960 NONAME
- _ZNK7QWidget19graphicsProxyWidgetEv @ 9961 NONAME
- _ZNK7QWidget1xEv @ 9962 NONAME
- _ZNK7QWidget1yEv @ 9963 NONAME
- _ZNK7QWidget20testAttribute_helperEN2Qt15WidgetAttributeE @ 9964 NONAME
- _ZNK7QWidget3posEv @ 9965 NONAME
- _ZNK7QWidget4maskEv @ 9966 NONAME
- _ZNK7QWidget5mapToEPS_RK6QPoint @ 9967 NONAME
- _ZNK7QWidget5styleEv @ 9968 NONAME
- _ZNK7QWidget5winIdEv @ 9969 NONAME
- _ZNK7QWidget6handleEv @ 9970 NONAME
- _ZNK7QWidget6layoutEv @ 9971 NONAME
- _ZNK7QWidget6localeEv @ 9972 NONAME
- _ZNK7QWidget6metricEN12QPaintDevice17PaintDeviceMetricE @ 9973 NONAME
- _ZNK7QWidget6windowEv @ 9974 NONAME
- _ZNK7QWidget7actionsEv @ 9975 NONAME
- _ZNK7QWidget7childAtERK6QPoint @ 9976 NONAME
- _ZNK7QWidget7devTypeEv @ 9977 NONAME
- _ZNK7QWidget7mapFromEPS_RK6QPoint @ 9978 NONAME
- _ZNK7QWidget7paletteEv @ 9979 NONAME
- _ZNK7QWidget7toolTipEv @ 9980 NONAME
- _ZNK7QWidget8baseSizeEv @ 9981 NONAME
- _ZNK7QWidget8hasFocusEv @ 9982 NONAME
- _ZNK7QWidget8sizeHintEv @ 9983 NONAME
- _ZNK7QWidget8softKeysEv @ 9984 NONAME ABSENT
- _ZNK7QWidget9frameSizeEv @ 9985 NONAME
- _ZNK7QWidget9statusTipEv @ 9986 NONAME
- _ZNK7QWidget9whatsThisEv @ 9987 NONAME
- _ZNK7QWizard10buttonTextENS_12WizardButtonE @ 9988 NONAME
- _ZNK7QWizard10metaObjectEv @ 9989 NONAME
- _ZNK7QWizard10testOptionENS_12WizardOptionE @ 9990 NONAME
- _ZNK7QWizard11currentPageEv @ 9991 NONAME
- _ZNK7QWizard11titleFormatEv @ 9992 NONAME
- _ZNK7QWizard11wizardStyleEv @ 9993 NONAME
- _ZNK7QWizard12visitedPagesEv @ 9994 NONAME
- _ZNK7QWizard14hasVisitedPageEi @ 9995 NONAME
- _ZNK7QWizard14subTitleFormatEv @ 9996 NONAME
- _ZNK7QWizard4pageEi @ 9997 NONAME
- _ZNK7QWizard5fieldERK7QString @ 9998 NONAME
- _ZNK7QWizard6buttonENS_12WizardButtonE @ 9999 NONAME
- _ZNK7QWizard6nextIdEv @ 10000 NONAME
- _ZNK7QWizard6pixmapENS_12WizardPixmapE @ 10001 NONAME
- _ZNK7QWizard7optionsEv @ 10002 NONAME
- _ZNK7QWizard7pageIdsEv @ 10003 NONAME
- _ZNK7QWizard7startIdEv @ 10004 NONAME
- _ZNK7QWizard8sizeHintEv @ 10005 NONAME
- _ZNK7QWizard9currentIdEv @ 10006 NONAME
- _ZNK8QMdiArea10backgroundEv @ 10007 NONAME
- _ZNK8QMdiArea10metaObjectEv @ 10008 NONAME
- _ZNK8QMdiArea10testOptionENS_10AreaOptionE @ 10009 NONAME
- _ZNK8QMdiArea11tabPositionEv @ 10010 NONAME
- _ZNK8QMdiArea12documentModeEv @ 10011 NONAME
- _ZNK8QMdiArea13subWindowListENS_11WindowOrderE @ 10012 NONAME
- _ZNK8QMdiArea15activationOrderEv @ 10013 NONAME
- _ZNK8QMdiArea15activeSubWindowEv @ 10014 NONAME
- _ZNK8QMdiArea15minimumSizeHintEv @ 10015 NONAME
- _ZNK8QMdiArea16currentSubWindowEv @ 10016 NONAME
- _ZNK8QMdiArea8sizeHintEv @ 10017 NONAME
- _ZNK8QMdiArea8tabShapeEv @ 10018 NONAME
- _ZNK8QMdiArea8viewModeEv @ 10019 NONAME
- _ZNK8QMenuBar10metaObjectEv @ 10020 NONAME
- _ZNK8QMenuBar11isDefaultUpEv @ 10021 NONAME
- _ZNK8QMenuBar12activeActionEv @ 10022 NONAME
- _ZNK8QMenuBar12cornerWidgetEN2Qt6CornerE @ 10023 NONAME
- _ZNK8QMenuBar14actionGeometryEP7QAction @ 10024 NONAME
- _ZNK8QMenuBar14heightForWidthEi @ 10025 NONAME
- _ZNK8QMenuBar15initStyleOptionEP20QStyleOptionMenuItemPK7QAction @ 10026 NONAME
- _ZNK8QMenuBar15minimumSizeHintEv @ 10027 NONAME
- _ZNK8QMenuBar8actionAtERK6QPoint @ 10028 NONAME
- _ZNK8QMenuBar8sizeHintEv @ 10029 NONAME
- _ZNK8QPainter10backgroundEv @ 10030 NONAME
- _ZNK8QPainter10clipRegionEv @ 10031 NONAME
- _ZNK8QPainter11brushOriginEv @ 10032 NONAME
- _ZNK8QPainter11fontMetricsEv @ 10033 NONAME
- _ZNK8QPainter11hasClippingEv @ 10034 NONAME
- _ZNK8QPainter11paintEngineEv @ 10035 NONAME
- _ZNK8QPainter11renderHintsEv @ 10036 NONAME
- _ZNK8QPainter11worldMatrixEv @ 10037 NONAME
- _ZNK8QPainter12deviceMatrixEv @ 10038 NONAME
- _ZNK8QPainter13matrixEnabledEv @ 10039 NONAME
- _ZNK8QPainter14backgroundModeEv @ 10040 NONAME
- _ZNK8QPainter14combinedMatrixEv @ 10041 NONAME
- _ZNK8QPainter14worldTransformEv @ 10042 NONAME
- _ZNK8QPainter15compositionModeEv @ 10043 NONAME
- _ZNK8QPainter15deviceTransformEv @ 10044 NONAME
- _ZNK8QPainter15layoutDirectionEv @ 10045 NONAME
- _ZNK8QPainter17combinedTransformEv @ 10046 NONAME
- _ZNK8QPainter18worldMatrixEnabledEv @ 10047 NONAME
- _ZNK8QPainter20viewTransformEnabledEv @ 10048 NONAME
- _ZNK8QPainter3penEv @ 10049 NONAME
- _ZNK8QPainter4fontEv @ 10050 NONAME
- _ZNK8QPainter5brushEv @ 10051 NONAME
- _ZNK8QPainter6deviceEv @ 10052 NONAME
- _ZNK8QPainter6matrixEv @ 10053 NONAME
- _ZNK8QPainter6windowEv @ 10054 NONAME
- _ZNK8QPainter7opacityEv @ 10055 NONAME
- _ZNK8QPainter8clipPathEv @ 10056 NONAME
- _ZNK8QPainter8fontInfoEv @ 10057 NONAME
- _ZNK8QPainter8isActiveEv @ 10058 NONAME
- _ZNK8QPainter8viewportEv @ 10059 NONAME
- _ZNK8QPainter9transformEv @ 10060 NONAME
- _ZNK8QPalette10isBrushSetENS_10ColorGroupENS_9ColorRoleE @ 10061 NONAME
- _ZNK8QPalette12serialNumberEv @ 10062 NONAME
- _ZNK8QPalette5brushENS_10ColorGroupENS_9ColorRoleE @ 10063 NONAME
- _ZNK8QPalette7isEqualENS_10ColorGroupES0_ @ 10064 NONAME
- _ZNK8QPalette7resolveERKS_ @ 10065 NONAME
- _ZNK8QPalette8cacheKeyEv @ 10066 NONAME
- _ZNK8QPalette8isCopyOfERKS_ @ 10067 NONAME
- _ZNK8QPalettecv8QVariantEv @ 10068 NONAME
- _ZNK8QPaletteeqERKS_ @ 10069 NONAME
- _ZNK8QPicture10isDetachedEv @ 10070 NONAME
- _ZNK8QPicture11paintEngineEv @ 10071 NONAME
- _ZNK8QPicture12boundingRectEv @ 10072 NONAME
- _ZNK8QPicture4dataEv @ 10073 NONAME
- _ZNK8QPicture4sizeEv @ 10074 NONAME
- _ZNK8QPicture6isNullEv @ 10075 NONAME
- _ZNK8QPicture6metricEN12QPaintDevice17PaintDeviceMetricE @ 10076 NONAME
- _ZNK8QPicture7devTypeEv @ 10077 NONAME
- _ZNK8QPolygon10subtractedERKS_ @ 10078 NONAME
- _ZNK8QPolygon11intersectedERKS_ @ 10079 NONAME
- _ZNK8QPolygon12boundingRectEv @ 10080 NONAME
- _ZNK8QPolygon13containsPointERK6QPointN2Qt8FillRuleE @ 10081 NONAME
- _ZNK8QPolygon5pointEiPiS0_ @ 10082 NONAME
- _ZNK8QPolygon6unitedERKS_ @ 10083 NONAME
- _ZNK8QPolygoncv8QVariantEv @ 10084 NONAME
- _ZNK8QSidebar10metaObjectEv @ 10085 NONAME
- _ZNK8QSidebar8sizeHintEv @ 10086 NONAME
- _ZNK8QSpinBox10metaObjectEv @ 10087 NONAME
- _ZNK8QSpinBox10singleStepEv @ 10088 NONAME
- _ZNK8QSpinBox13textFromValueEi @ 10089 NONAME
- _ZNK8QSpinBox13valueFromTextERK7QString @ 10090 NONAME
- _ZNK8QSpinBox5fixupER7QString @ 10091 NONAME
- _ZNK8QSpinBox5valueEv @ 10092 NONAME
- _ZNK8QSpinBox6prefixEv @ 10093 NONAME
- _ZNK8QSpinBox6suffixEv @ 10094 NONAME
- _ZNK8QSpinBox7maximumEv @ 10095 NONAME
- _ZNK8QSpinBox7minimumEv @ 10096 NONAME
- _ZNK8QSpinBox8validateER7QStringRi @ 10097 NONAME
- _ZNK8QSpinBox9cleanTextEv @ 10098 NONAME
- _ZNK8QToolBar10isFloatingEv @ 10099 NONAME
- _ZNK8QToolBar10metaObjectEv @ 10100 NONAME
- _ZNK8QToolBar11isFloatableEv @ 10101 NONAME
- _ZNK8QToolBar11orientationEv @ 10102 NONAME
- _ZNK8QToolBar12allowedAreasEv @ 10103 NONAME
- _ZNK8QToolBar14actionGeometryEP7QAction @ 10104 NONAME
- _ZNK8QToolBar15initStyleOptionEP19QStyleOptionToolBar @ 10105 NONAME
- _ZNK8QToolBar15toolButtonStyleEv @ 10106 NONAME
- _ZNK8QToolBar15widgetForActionEP7QAction @ 10107 NONAME
- _ZNK8QToolBar16toggleViewActionEv @ 10108 NONAME
- _ZNK8QToolBar8actionAtERK6QPoint @ 10109 NONAME
- _ZNK8QToolBar8iconSizeEv @ 10110 NONAME
- _ZNK8QToolBar9isMovableEv @ 10111 NONAME
- _ZNK8QToolBox10metaObjectEv @ 10112 NONAME
- _ZNK8QToolBox11itemToolTipEi @ 10113 NONAME
- _ZNK8QToolBox12currentIndexEv @ 10114 NONAME
- _ZNK8QToolBox13currentWidgetEv @ 10115 NONAME
- _ZNK8QToolBox13isItemEnabledEi @ 10116 NONAME
- _ZNK8QToolBox5countEv @ 10117 NONAME
- _ZNK8QToolBox6widgetEi @ 10118 NONAME
- _ZNK8QToolBox7indexOfEP7QWidget @ 10119 NONAME
- _ZNK8QToolBox8itemIconEi @ 10120 NONAME
- _ZNK8QToolBox8itemTextEi @ 10121 NONAME
- _ZNK9QCheckBox10checkStateEv @ 10122 NONAME
- _ZNK9QCheckBox10isTristateEv @ 10123 NONAME
- _ZNK9QCheckBox10metaObjectEv @ 10124 NONAME
- _ZNK9QCheckBox15initStyleOptionEP18QStyleOptionButton @ 10125 NONAME
- _ZNK9QCheckBox8sizeHintEv @ 10126 NONAME
- _ZNK9QCheckBox9hitButtonERK6QPoint @ 10127 NONAME
- _ZNK9QColormap4modeEv @ 10128 NONAME
- _ZNK9QColormap4sizeEv @ 10129 NONAME
- _ZNK9QColormap5depthEv @ 10130 NONAME
- _ZNK9QColormap5pixelERK6QColor @ 10131 NONAME
- _ZNK9QColormap7colorAtEj @ 10132 NONAME
- _ZNK9QColormap8colormapEv @ 10133 NONAME
- _ZNK9QComboBox10isEditableEv @ 10134 NONAME
- _ZNK9QComboBox10metaObjectEv @ 10135 NONAME
- _ZNK9QComboBox11currentTextEv @ 10136 NONAME
- _ZNK9QComboBox11modelColumnEv @ 10137 NONAME
- _ZNK9QComboBox12currentIndexEv @ 10138 NONAME
- _ZNK9QComboBox12insertPolicyEv @ 10139 NONAME
- _ZNK9QComboBox12itemDelegateEv @ 10140 NONAME
- _ZNK9QComboBox14autoCompletionEv @ 10141 NONAME
- _ZNK9QComboBox14rootModelIndexEv @ 10142 NONAME
- _ZNK9QComboBox15initStyleOptionEP20QStyleOptionComboBox @ 10143 NONAME
- _ZNK9QComboBox15maxVisibleItemsEv @ 10144 NONAME
- _ZNK9QComboBox15minimumSizeHintEv @ 10145 NONAME
- _ZNK9QComboBox16inputMethodQueryEN2Qt16InputMethodQueryE @ 10146 NONAME
- _ZNK9QComboBox16sizeAdjustPolicyEv @ 10147 NONAME
- _ZNK9QComboBox17duplicatesEnabledEv @ 10148 NONAME
- _ZNK9QComboBox21minimumContentsLengthEv @ 10149 NONAME
- _ZNK9QComboBox29autoCompletionCaseSensitivityEv @ 10150 NONAME
- _ZNK9QComboBox4viewEv @ 10151 NONAME
- _ZNK9QComboBox5countEv @ 10152 NONAME
- _ZNK9QComboBox5modelEv @ 10153 NONAME
- _ZNK9QComboBox8findDataERK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 10154 NONAME
- _ZNK9QComboBox8hasFrameEv @ 10155 NONAME
- _ZNK9QComboBox8iconSizeEv @ 10156 NONAME
- _ZNK9QComboBox8itemDataEii @ 10157 NONAME
- _ZNK9QComboBox8itemIconEi @ 10158 NONAME
- _ZNK9QComboBox8itemTextEi @ 10159 NONAME
- _ZNK9QComboBox8lineEditEv @ 10160 NONAME
- _ZNK9QComboBox8maxCountEv @ 10161 NONAME
- _ZNK9QComboBox8sizeHintEv @ 10162 NONAME
- _ZNK9QComboBox9completerEv @ 10163 NONAME
- _ZNK9QComboBox9validatorEv @ 10164 NONAME
- _ZNK9QDateEdit10metaObjectEv @ 10165 NONAME
- _ZNK9QDirModel10headerDataEiN2Qt11OrientationEi @ 10166 NONAME
- _ZNK9QDirModel10isReadOnlyEv @ 10167 NONAME
- _ZNK9QDirModel10metaObjectEv @ 10168 NONAME
- _ZNK9QDirModel11columnCountERK11QModelIndex @ 10169 NONAME
- _ZNK9QDirModel11hasChildrenERK11QModelIndex @ 10170 NONAME
- _ZNK9QDirModel11nameFiltersEv @ 10171 NONAME
- _ZNK9QDirModel12iconProviderEv @ 10172 NONAME
- _ZNK9QDirModel14lazyChildCountEv @ 10173 NONAME
- _ZNK9QDirModel15resolveSymlinksEv @ 10174 NONAME
- _ZNK9QDirModel20supportedDropActionsEv @ 10175 NONAME
- _ZNK9QDirModel4dataERK11QModelIndexi @ 10176 NONAME
- _ZNK9QDirModel5flagsERK11QModelIndex @ 10177 NONAME
- _ZNK9QDirModel5indexERK7QStringi @ 10178 NONAME
- _ZNK9QDirModel5indexEiiRK11QModelIndex @ 10179 NONAME
- _ZNK9QDirModel5isDirERK11QModelIndex @ 10180 NONAME
- _ZNK9QDirModel6filterEv @ 10181 NONAME
- _ZNK9QDirModel6parentERK11QModelIndex @ 10182 NONAME
- _ZNK9QDirModel7sortingEv @ 10183 NONAME
- _ZNK9QDirModel8fileIconERK11QModelIndex @ 10184 NONAME
- _ZNK9QDirModel8fileInfoERK11QModelIndex @ 10185 NONAME
- _ZNK9QDirModel8fileNameERK11QModelIndex @ 10186 NONAME
- _ZNK9QDirModel8filePathERK11QModelIndex @ 10187 NONAME
- _ZNK9QDirModel8mimeDataERK5QListI11QModelIndexE @ 10188 NONAME
- _ZNK9QDirModel8rowCountERK11QModelIndex @ 10189 NONAME
- _ZNK9QDirModel9mimeTypesEv @ 10190 NONAME
- _ZNK9QFontInfo10exactMatchEv @ 10191 NONAME
- _ZNK9QFontInfo10fixedPitchEv @ 10192 NONAME
- _ZNK9QFontInfo10pointSizeFEv @ 10193 NONAME
- _ZNK9QFontInfo5styleEv @ 10194 NONAME
- _ZNK9QFontInfo6familyEv @ 10195 NONAME
- _ZNK9QFontInfo6italicEv @ 10196 NONAME
- _ZNK9QFontInfo6weightEv @ 10197 NONAME
- _ZNK9QFontInfo7rawModeEv @ 10198 NONAME
- _ZNK9QFontInfo8overlineEv @ 10199 NONAME
- _ZNK9QFontInfo9pixelSizeEv @ 10200 NONAME
- _ZNK9QFontInfo9pointSizeEv @ 10201 NONAME
- _ZNK9QFontInfo9strikeOutEv @ 10202 NONAME
- _ZNK9QFontInfo9styleHintEv @ 10203 NONAME
- _ZNK9QFontInfo9underlineEv @ 10204 NONAME
- _ZNK9QGradient14coordinateModeEv @ 10205 NONAME
- _ZNK9QGradient17interpolationModeEv @ 10206 NONAME
- _ZNK9QGradient5stopsEv @ 10207 NONAME
- _ZNK9QGradienteqERKS_ @ 10208 NONAME
- _ZNK9QGroupBox10metaObjectEv @ 10209 NONAME
- _ZNK9QGroupBox11isCheckableEv @ 10210 NONAME
- _ZNK9QGroupBox15initStyleOptionEP20QStyleOptionGroupBox @ 10211 NONAME
- _ZNK9QGroupBox15minimumSizeHintEv @ 10212 NONAME
- _ZNK9QGroupBox5titleEv @ 10213 NONAME
- _ZNK9QGroupBox6isFlatEv @ 10214 NONAME
- _ZNK9QGroupBox9alignmentEv @ 10215 NONAME
- _ZNK9QGroupBox9isCheckedEv @ 10216 NONAME
- _ZNK9QKeyEvent14nativeScanCodeEv @ 10217 NONAME
- _ZNK9QKeyEvent15nativeModifiersEv @ 10218 NONAME
- _ZNK9QKeyEvent16nativeVirtualKeyEv @ 10219 NONAME
- _ZNK9QKeyEvent7matchesEN12QKeySequence11StandardKeyE @ 10220 NONAME
- _ZNK9QKeyEvent9modifiersEv @ 10221 NONAME
- _ZNK9QLineEdit10cursorRectEv @ 10222 NONAME
- _ZNK9QLineEdit10isModifiedEv @ 10223 NONAME
- _ZNK9QLineEdit10isReadOnlyEv @ 10224 NONAME
- _ZNK9QLineEdit10metaObjectEv @ 10225 NONAME
- _ZNK9QLineEdit11displayTextEv @ 10226 NONAME
- _ZNK9QLineEdit11dragEnabledEv @ 10227 NONAME
- _ZNK9QLineEdit12selectedTextEv @ 10228 NONAME
- _ZNK9QLineEdit14cursorPositionEv @ 10229 NONAME
- _ZNK9QLineEdit14getTextMarginsEPiS0_S0_S0_ @ 10230 NONAME
- _ZNK9QLineEdit14selectionStartEv @ 10231 NONAME
- _ZNK9QLineEdit15hasSelectedTextEv @ 10232 NONAME
- _ZNK9QLineEdit15initStyleOptionEP17QStyleOptionFrame @ 10233 NONAME
- _ZNK9QLineEdit15isRedoAvailableEv @ 10234 NONAME
- _ZNK9QLineEdit15isUndoAvailableEv @ 10235 NONAME
- _ZNK9QLineEdit15minimumSizeHintEv @ 10236 NONAME
- _ZNK9QLineEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 10237 NONAME
- _ZNK9QLineEdit18hasAcceptableInputEv @ 10238 NONAME
- _ZNK9QLineEdit4copyEv @ 10239 NONAME
- _ZNK9QLineEdit4textEv @ 10240 NONAME
- _ZNK9QLineEdit8echoModeEv @ 10241 NONAME
- _ZNK9QLineEdit8hasFrameEv @ 10242 NONAME
- _ZNK9QLineEdit8sizeHintEv @ 10243 NONAME
- _ZNK9QLineEdit9alignmentEv @ 10244 NONAME
- _ZNK9QLineEdit9completerEv @ 10245 NONAME
- _ZNK9QLineEdit9inputMaskEv @ 10246 NONAME
- _ZNK9QLineEdit9maxLengthEv @ 10247 NONAME
- _ZNK9QLineEdit9validatorEv @ 10248 NONAME
- _ZNK9QListView10isWrappingEv @ 10249 NONAME
- _ZNK9QListView10layoutModeEv @ 10250 NONAME
- _ZNK9QListView10metaObjectEv @ 10251 NONAME
- _ZNK9QListView10resizeModeEv @ 10252 NONAME
- _ZNK9QListView10visualRectERK11QModelIndex @ 10253 NONAME
- _ZNK9QListView11isRowHiddenEi @ 10254 NONAME
- _ZNK9QListView11modelColumnEv @ 10255 NONAME
- _ZNK9QListView11viewOptionsEv @ 10256 NONAME
- _ZNK9QListView11visualIndexERK11QModelIndex @ 10257 NONAME
- _ZNK9QListView12contentsSizeEv @ 10258 NONAME
- _ZNK9QListView12rectForIndexERK11QModelIndex @ 10259 NONAME
- _ZNK9QListView13isIndexHiddenERK11QModelIndex @ 10260 NONAME
- _ZNK9QListView14verticalOffsetEv @ 10261 NONAME
- _ZNK9QListView15selectedIndexesEv @ 10262 NONAME
- _ZNK9QListView16horizontalOffsetEv @ 10263 NONAME
- _ZNK9QListView16uniformItemSizesEv @ 10264 NONAME
- _ZNK9QListView22isSelectionRectVisibleEv @ 10265 NONAME
- _ZNK9QListView24visualRegionForSelectionERK14QItemSelection @ 10266 NONAME
- _ZNK9QListView4flowEv @ 10267 NONAME
- _ZNK9QListView7indexAtERK6QPoint @ 10268 NONAME
- _ZNK9QListView7spacingEv @ 10269 NONAME
- _ZNK9QListView8gridSizeEv @ 10270 NONAME
- _ZNK9QListView8movementEv @ 10271 NONAME
- _ZNK9QListView8viewModeEv @ 10272 NONAME
- _ZNK9QListView8wordWrapEv @ 10273 NONAME
- _ZNK9QListView9batchSizeEv @ 10274 NONAME
- _ZNK9QPolygonF10subtractedERKS_ @ 10275 NONAME
- _ZNK9QPolygonF11intersectedERKS_ @ 10276 NONAME
- _ZNK9QPolygonF12boundingRectEv @ 10277 NONAME
- _ZNK9QPolygonF13containsPointERK7QPointFN2Qt8FillRuleE @ 10278 NONAME
- _ZNK9QPolygonF6unitedERKS_ @ 10279 NONAME
- _ZNK9QPolygonF9toPolygonEv @ 10280 NONAME
- _ZNK9QS60Style10metaObjectEv @ 10281 NONAME
- _ZNK9QS60Style11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10282 NONAME
- _ZNK9QS60Style11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 10283 NONAME
- _ZNK9QS60Style13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10284 NONAME
- _ZNK9QS60Style13stylePropertyEPKc @ 10285 NONAME
- _ZNK9QS60Style14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 10286 NONAME
- _ZNK9QS60Style14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 10287 NONAME
- _ZNK9QS60Style16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 10288 NONAME
- _ZNK9QS60Style18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 10289 NONAME
- _ZNK9QS60Style26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 10290 NONAME
- _ZNK9QS60Style9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 10291 NONAME
- _ZNK9QShortcut10autoRepeatEv @ 10292 NONAME
- _ZNK9QShortcut10metaObjectEv @ 10293 NONAME
- _ZNK9QShortcut2idEv @ 10294 NONAME
- _ZNK9QShortcut3keyEv @ 10295 NONAME
- _ZNK9QShortcut9isEnabledEv @ 10296 NONAME
- _ZNK9QShortcut9whatsThisEv @ 10297 NONAME
- _ZNK9QSizeGrip10metaObjectEv @ 10298 NONAME
- _ZNK9QSizeGrip8sizeHintEv @ 10299 NONAME
- _ZNK9QSplitter10metaObjectEv @ 10300 NONAME
- _ZNK9QSplitter11handleWidthEv @ 10301 NONAME
- _ZNK9QSplitter11orientationEv @ 10302 NONAME
- _ZNK9QSplitter12opaqueResizeEv @ 10303 NONAME
- _ZNK9QSplitter13isCollapsibleEi @ 10304 NONAME
- _ZNK9QSplitter15minimumSizeHintEv @ 10305 NONAME
- _ZNK9QSplitter19childrenCollapsibleEv @ 10306 NONAME
- _ZNK9QSplitter5countEv @ 10307 NONAME
- _ZNK9QSplitter5sizesEv @ 10308 NONAME
- _ZNK9QSplitter6handleEi @ 10309 NONAME
- _ZNK9QSplitter6widgetEi @ 10310 NONAME
- _ZNK9QSplitter7indexOfEP7QWidget @ 10311 NONAME
- _ZNK9QSplitter8getRangeEiPiS0_ @ 10312 NONAME
- _ZNK9QSplitter8sizeHintEv @ 10313 NONAME
- _ZNK9QSplitter9saveStateEv @ 10314 NONAME
- _ZNK9QTextEdit10cursorRectERK11QTextCursor @ 10315 NONAME
- _ZNK9QTextEdit10cursorRectEv @ 10316 NONAME
- _ZNK9QTextEdit10fontFamilyEv @ 10317 NONAME
- _ZNK9QTextEdit10fontItalicEv @ 10318 NONAME
- _ZNK9QTextEdit10fontWeightEv @ 10319 NONAME
- _ZNK9QTextEdit10isReadOnlyEv @ 10320 NONAME
- _ZNK9QTextEdit10metaObjectEv @ 10321 NONAME
- _ZNK9QTextEdit10textCursorEv @ 10322 NONAME
- _ZNK9QTextEdit11currentFontEv @ 10323 NONAME
- _ZNK9QTextEdit11cursorWidthEv @ 10324 NONAME
- _ZNK9QTextEdit12lineWrapModeEv @ 10325 NONAME
- _ZNK9QTextEdit12tabStopWidthEv @ 10326 NONAME
- _ZNK9QTextEdit12wordWrapModeEv @ 10327 NONAME
- _ZNK9QTextEdit13fontPointSizeEv @ 10328 NONAME
- _ZNK9QTextEdit13fontUnderlineEv @ 10329 NONAME
- _ZNK9QTextEdit13overwriteModeEv @ 10330 NONAME
- _ZNK9QTextEdit14acceptRichTextEv @ 10331 NONAME
- _ZNK9QTextEdit14autoFormattingEv @ 10332 NONAME
- _ZNK9QTextEdit15extraSelectionsEv @ 10333 NONAME
- _ZNK9QTextEdit15tabChangesFocusEv @ 10334 NONAME
- _ZNK9QTextEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 10335 NONAME
- _ZNK9QTextEdit17currentCharFormatEv @ 10336 NONAME
- _ZNK9QTextEdit17cursorForPositionERK6QPoint @ 10337 NONAME
- _ZNK9QTextEdit19textBackgroundColorEv @ 10338 NONAME
- _ZNK9QTextEdit20textInteractionFlagsEv @ 10339 NONAME
- _ZNK9QTextEdit21canInsertFromMimeDataEPK9QMimeData @ 10340 NONAME
- _ZNK9QTextEdit21lineWrapColumnOrWidthEv @ 10341 NONAME
- _ZNK9QTextEdit27createMimeDataFromSelectionEv @ 10342 NONAME
- _ZNK9QTextEdit8anchorAtERK6QPoint @ 10343 NONAME
- _ZNK9QTextEdit8canPasteEv @ 10344 NONAME
- _ZNK9QTextEdit8documentEv @ 10345 NONAME
- _ZNK9QTextEdit9alignmentEv @ 10346 NONAME
- _ZNK9QTextEdit9textColorEv @ 10347 NONAME
- _ZNK9QTextItem11renderFlagsEv @ 10348 NONAME
- _ZNK9QTextItem4fontEv @ 10349 NONAME
- _ZNK9QTextItem4textEv @ 10350 NONAME
- _ZNK9QTextItem5widthEv @ 10351 NONAME
- _ZNK9QTextItem6ascentEv @ 10352 NONAME
- _ZNK9QTextItem7descentEv @ 10353 NONAME
- _ZNK9QTextLine10textLengthEv @ 10354 NONAME
- _ZNK9QTextLine15naturalTextRectEv @ 10355 NONAME
- _ZNK9QTextLine16naturalTextWidthEv @ 10356 NONAME
- _ZNK9QTextLine1xEv @ 10357 NONAME
- _ZNK9QTextLine1yEv @ 10358 NONAME
- _ZNK9QTextLine4drawEP8QPainterRK7QPointFPKN11QTextLayout11FormatRangeE @ 10359 NONAME
- _ZNK9QTextLine4rectEv @ 10360 NONAME
- _ZNK9QTextLine5widthEv @ 10361 NONAME
- _ZNK9QTextLine6ascentEv @ 10362 NONAME
- _ZNK9QTextLine6heightEv @ 10363 NONAME
- _ZNK9QTextLine7descentEv @ 10364 NONAME
- _ZNK9QTextLine8positionEv @ 10365 NONAME
- _ZNK9QTextLine9cursorToXEPiNS_4EdgeE @ 10366 NONAME
- _ZNK9QTextLine9textStartEv @ 10367 NONAME
- _ZNK9QTextLine9xToCursorEfNS_14CursorPositionE @ 10368 NONAME
- _ZNK9QTextList10itemNumberERK10QTextBlock @ 10369 NONAME
- _ZNK9QTextList10metaObjectEv @ 10370 NONAME
- _ZNK9QTextList4itemEi @ 10371 NONAME
- _ZNK9QTextList5countEv @ 10372 NONAME
- _ZNK9QTextList8itemTextERK10QTextBlock @ 10373 NONAME
- _ZNK9QTimeEdit10metaObjectEv @ 10374 NONAME
- _ZNK9QTreeView10indexAboveERK11QModelIndex @ 10375 NONAME
- _ZNK9QTreeView10indexBelowERK11QModelIndex @ 10376 NONAME
- _ZNK9QTreeView10isAnimatedEv @ 10377 NONAME
- _ZNK9QTreeView10isExpandedERK11QModelIndex @ 10378 NONAME
- _ZNK9QTreeView10metaObjectEv @ 10379 NONAME
- _ZNK9QTreeView10visualRectERK11QModelIndex @ 10380 NONAME
- _ZNK9QTreeView11columnWidthEi @ 10381 NONAME
- _ZNK9QTreeView11indentationEv @ 10382 NONAME
- _ZNK9QTreeView11isRowHiddenEiRK11QModelIndex @ 10383 NONAME
- _ZNK9QTreeView11visualIndexERK11QModelIndex @ 10384 NONAME
- _ZNK9QTreeView12drawBranchesEP8QPainterRK5QRectRK11QModelIndex @ 10385 NONAME
- _ZNK9QTreeView13isIndexHiddenERK11QModelIndex @ 10386 NONAME
- _ZNK9QTreeView14isColumnHiddenEi @ 10387 NONAME
- _ZNK9QTreeView14isHeaderHiddenEv @ 10388 NONAME
- _ZNK9QTreeView14verticalOffsetEv @ 10389 NONAME
- _ZNK9QTreeView15autoExpandDelayEv @ 10390 NONAME
- _ZNK9QTreeView15itemsExpandableEv @ 10391 NONAME
- _ZNK9QTreeView15rootIsDecoratedEv @ 10392 NONAME
- _ZNK9QTreeView15selectedIndexesEv @ 10393 NONAME
- _ZNK9QTreeView16horizontalOffsetEv @ 10394 NONAME
- _ZNK9QTreeView16indexRowSizeHintERK11QModelIndex @ 10395 NONAME
- _ZNK9QTreeView16isSortingEnabledEv @ 10396 NONAME
- _ZNK9QTreeView17sizeHintForColumnEi @ 10397 NONAME
- _ZNK9QTreeView17uniformRowHeightsEv @ 10398 NONAME
- _ZNK9QTreeView19allColumnsShowFocusEv @ 10399 NONAME
- _ZNK9QTreeView20expandsOnDoubleClickEv @ 10400 NONAME
- _ZNK9QTreeView20isFirstColumnSpannedEiRK11QModelIndex @ 10401 NONAME
- _ZNK9QTreeView22columnViewportPositionEi @ 10402 NONAME
- _ZNK9QTreeView24visualRegionForSelectionERK14QItemSelection @ 10403 NONAME
- _ZNK9QTreeView6headerEv @ 10404 NONAME
- _ZNK9QTreeView7drawRowEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 10405 NONAME
- _ZNK9QTreeView7indexAtERK6QPoint @ 10406 NONAME
- _ZNK9QTreeView8columnAtEi @ 10407 NONAME
- _ZNK9QTreeView8drawTreeEP8QPainterRK7QRegion @ 10408 NONAME
- _ZNK9QTreeView8wordWrapEv @ 10409 NONAME
- _ZNK9QTreeView9rowHeightERK11QModelIndex @ 10410 NONAME
- _ZNK9QUndoView10emptyLabelEv @ 10411 NONAME
- _ZNK9QUndoView10metaObjectEv @ 10412 NONAME
- _ZNK9QUndoView5groupEv @ 10413 NONAME
- _ZNK9QUndoView5stackEv @ 10414 NONAME
- _ZNK9QUndoView9cleanIconEv @ 10415 NONAME
- _ZNK9QUrlModel10metaObjectEv @ 10416 NONAME
- _ZNK9QUrlModel4urlsEv @ 10417 NONAME
- _ZNK9QUrlModel5flagsERK11QModelIndex @ 10418 NONAME
- _ZNK9QUrlModel8mimeDataERK5QListI11QModelIndexE @ 10419 NONAME
- _ZNK9QUrlModel9mimeTypesEv @ 10420 NONAME
- _ZTI10QBoxLayout @ 10421 NONAME
- _ZTI10QClipboard @ 10422 NONAME
- _ZTI10QColorWell @ 10423 NONAME ABSENT
- _ZTI10QCompleter @ 10424 NONAME
- _ZTI10QDropEvent @ 10425 NONAME
- _ZTI10QFontCache @ 10426 NONAME ABSENT
- _ZTI10QHelpEvent @ 10427 NONAME
- _ZTI10QHideEvent @ 10428 NONAME
- _ZTI10QKeyMapper @ 10429 NONAME ABSENT
- _ZTI10QLCDNumber @ 10430 NONAME
- _ZTI10QListModel @ 10431 NONAME ABSENT
- _ZTI10QMoveEvent @ 10432 NONAME
- _ZTI10QScrollBar @ 10433 NONAME
- _ZTI10QShowEvent @ 10434 NONAME
- _ZTI10QStatusBar @ 10435 NONAME
- _ZTI10QTabWidget @ 10436 NONAME
- _ZTI10QTableView @ 10437 NONAME
- _ZTI10QTextFrame @ 10438 NONAME
- _ZTI10QTextTable @ 10439 NONAME
- _ZTI10QTreeModel @ 10440 NONAME ABSENT
- _ZTI10QUndoGroup @ 10441 NONAME
- _ZTI10QUndoModel @ 10442 NONAME ABSENT
- _ZTI10QUndoStack @ 10443 NONAME
- _ZTI10QValidator @ 10444 NONAME
- _ZTI10QWellArray @ 10445 NONAME ABSENT
- _ZTI10QWhatsThat @ 10446 NONAME ABSENT
- _ZTI10QWorkspace @ 10447 NONAME
- _ZTI11CloseButton @ 10448 NONAME ABSENT
- _ZTI11QBmpHandler @ 10449 NONAME ABSENT
- _ZTI11QCloseEvent @ 10450 NONAME
- _ZTI11QColumnView @ 10451 NONAME
- _ZTI11QDockWidget @ 10452 NONAME
- _ZTI11QFileDialog @ 10453 NONAME
- _ZTI11QFocusEvent @ 10454 NONAME
- _ZTI11QFocusFrame @ 10455 NONAME
- _ZTI11QFontDialog @ 10456 NONAME
- _ZTI11QFontEngine @ 10457 NONAME
- _ZTI11QFormLayout @ 10458 NONAME
- _ZTI11QGridLayout @ 10459 NONAME
- _ZTI11QHBoxLayout @ 10460 NONAME
- _ZTI11QHeaderView @ 10461 NONAME
- _ZTI11QHoverEvent @ 10462 NONAME
- _ZTI11QIconEngine @ 10463 NONAME
- _ZTI11QInputEvent @ 10464 NONAME
- _ZTI11QKeyEventEx @ 10465 NONAME ABSENT
- _ZTI11QLayoutItem @ 10466 NONAME
- _ZTI11QListWidget @ 10467 NONAME
- _ZTI11QMDIControl @ 10468 NONAME ABSENT
- _ZTI11QMainWindow @ 10469 NONAME
- _ZTI11QMessageBox @ 10470 NONAME
- _ZTI11QMimeSource @ 10471 NONAME
- _ZTI11QMouseEvent @ 10472 NONAME
- _ZTI11QPaintEvent @ 10473 NONAME
- _ZTI11QPixmapData @ 10474 NONAME
- _ZTI11QPngHandler @ 10475 NONAME ABSENT
- _ZTI11QPpmHandler @ 10476 NONAME ABSENT
- _ZTI11QProxyModel @ 10477 NONAME
- _ZTI11QPushButton @ 10478 NONAME
- _ZTI11QRollEffect @ 10479 NONAME ABSENT
- _ZTI11QRubberBand @ 10480 NONAME
- _ZTI11QScrollArea @ 10481 NONAME
- _ZTI11QSpacerItem @ 10482 NONAME
- _ZTI11QStrokerOps @ 10483 NONAME
- _ZTI11QTableModel @ 10484 NONAME ABSENT
- _ZTI11QTextObject @ 10485 NONAME
- _ZTI11QToolButton @ 10486 NONAME
- _ZTI11QTreeWidget @ 10487 NONAME
- _ZTI11QUndoAction @ 10488 NONAME ABSENT
- _ZTI11QVBoxLayout @ 10489 NONAME
- _ZTI11QWheelEvent @ 10490 NONAME
- _ZTI11QWidgetItem @ 10491 NONAME
- _ZTI11QWizardPage @ 10492 NONAME
- _ZTI11QXbmHandler @ 10493 NONAME ABSENT
- _ZTI11QXpmHandler @ 10494 NONAME ABSENT
- _ZTI12QActionEvent @ 10495 NONAME
- _ZTI12QActionGroup @ 10496 NONAME
- _ZTI12QAlphaWidget @ 10497 NONAME ABSENT
- _ZTI12QApplication @ 10498 NONAME
- _ZTI12QAuBucketS60 @ 10499 NONAME ABSENT
- _ZTI12QButtonGroup @ 10500 NONAME
- _ZTI12QColorDialog @ 10501 NONAME
- _ZTI12QColorPicker @ 10502 NONAME ABSENT
- _ZTI12QColorShower @ 10503 NONAME ABSENT
- _ZTI12QCommonStyle @ 10504 NONAME
- _ZTI12QDashStroker @ 10505 NONAME
- _ZTI12QDragManager @ 10506 NONAME ABSENT
- _ZTI12QFSCompleter @ 10507 NONAME ABSENT
- _ZTI12QInputDialog @ 10508 NONAME
- _ZTI12QMenuPrivate @ 10509 NONAME ABSENT
- _ZTI12QPaintDevice @ 10510 NONAME
- _ZTI12QPaintEngine @ 10511 NONAME
- _ZTI12QProgressBar @ 10512 NONAME
- _ZTI12QRadioButton @ 10513 NONAME
- _ZTI12QResizeEvent @ 10514 NONAME
- _ZTI12QStylePlugin @ 10515 NONAME
- _ZTI12QTableWidget @ 10516 NONAME
- _ZTI12QTabletEvent @ 10517 NONAME
- _ZTI12QTessellator @ 10518 NONAME
- _ZTI12QTextBrowser @ 10519 NONAME
- _ZTI12QTextControl @ 10520 NONAME
- _ZTI12QToolBarItem @ 10521 NONAME ABSENT
- _ZTI12QTornOffMenu @ 10522 NONAME ABSENT
- _ZTI12QUndoCommand @ 10523 NONAME
- _ZTI13QCalendarView @ 10524 NONAME ABSENT
- _ZTI13QDateTimeEdit @ 10525 NONAME
- _ZTI13QErrorMessage @ 10526 NONAME
- _ZTI13QFontComboBox @ 10527 NONAME
- _ZTI13QFontListView @ 10528 NONAME ABSENT
- _ZTI13QFramePrivate @ 10529 NONAME ABSENT
- _ZTI13QGraphicsItem @ 10530 NONAME
- _ZTI13QGraphicsView @ 10531 NONAME
- _ZTI13QIconEngineV2 @ 10532 NONAME
- _ZTI13QInputContext @ 10533 NONAME
- _ZTI13QIntValidator @ 10534 NONAME
- _ZTI13QItemDelegate @ 10535 NONAME
- _ZTI13QLongTapTimer @ 10536 NONAME ABSENT
- _ZTI13QMdiSubWindow @ 10537 NONAME
- _ZTI13QMouseEventEx @ 10538 NONAME ABSENT
- _ZTI13QPainterState @ 10539 NONAME
- _ZTI13QPixmapFilter @ 10540 NONAME
- _ZTI13QSplashScreen @ 10541 NONAME
- _ZTI13QStandardItem @ 10542 NONAME
- _ZTI13QTextDocument @ 10543 NONAME
- _ZTI13QWidgetAction @ 10544 NONAME
- _ZTI13QWidgetItemV2 @ 10545 NONAME
- _ZTI13QWindowsStyle @ 10546 NONAME
- _ZTI13QWizardHeader @ 10547 NONAME ABSENT
- _ZTI14QActionPrivate @ 10548 NONAME
- _ZTI14QCalendarModel @ 10549 NONAME ABSENT
- _ZTI14QCalendarPopup @ 10550 NONAME ABSENT
- _ZTI14QDesktopWidget @ 10551 NONAME
- _ZTI14QDoubleSpinBox @ 10552 NONAME
- _ZTI14QDragMoveEvent @ 10553 NONAME
- _ZTI14QFileOpenEvent @ 10554 NONAME
- _ZTI14QFontEngineBox @ 10555 NONAME ABSENT
- _ZTI14QFontEngineS60 @ 10556 NONAME ABSENT
- _ZTI14QGraphicsScene @ 10557 NONAME
- _ZTI14QIconDragEvent @ 10558 NONAME
- _ZTI14QImageIOPlugin @ 10559 NONAME
- _ZTI14QLayoutPrivate @ 10560 NONAME
- _ZTI14QMdiAreaTabBar @ 10561 NONAME ABSENT
- _ZTI14QPaintEngineEx @ 10562 NONAME
- _ZTI14QPlainTextEdit @ 10563 NONAME
- _ZTI14QShortcutEvent @ 10564 NONAME
- _ZTI14QStackedLayout @ 10565 NONAME
- _ZTI14QStackedWidget @ 10566 NONAME
- _ZTI14QToolBarLayout @ 10567 NONAME ABSENT
- _ZTI14QToolBoxButton @ 10568 NONAME ABSENT
- _ZTI14QWidgetPrivate @ 10569 NONAME
- _ZTI14QWindowSurface @ 10570 NONAME
- _ZTI15QAbstractButton @ 10571 NONAME
- _ZTI15QAbstractSlider @ 10572 NONAME
- _ZTI15QCalendarWidget @ 10573 NONAME
- _ZTI15QClipboardEvent @ 10574 NONAME
- _ZTI15QColorShowLabel @ 10575 NONAME ABSENT
- _ZTI15QColumnViewGrip @ 10576 NONAME
- _ZTI15QDockWidgetItem @ 10577 NONAME ABSENT
- _ZTI15QDragEnterEvent @ 10578 NONAME
- _ZTI15QDragLeaveEvent @ 10579 NONAME
- _ZTI15QGraphicsLayout @ 10580 NONAME
- _ZTI15QGraphicsSystem @ 10581 NONAME
- _ZTI15QGraphicsWidget @ 10582 NONAME
- _ZTI15QImageIOHandler @ 10583 NONAME
- _ZTI15QListWidgetItem @ 10584 NONAME
- _ZTI15QMdiAreaPrivate @ 10585 NONAME ABSENT
- _ZTI15QProgressDialog @ 10586 NONAME
- _ZTI15QSessionManager @ 10587 NONAME
- _ZTI15QSpinBoxPrivate @ 10588 NONAME ABSENT
- _ZTI15QSplitterHandle @ 10589 NONAME
- _ZTI15QStatusTipEvent @ 10590 NONAME
- _ZTI15QSymbianControl @ 10591 NONAME ABSENT
- _ZTI15QTextBlockGroup @ 10592 NONAME
- _ZTI15QTreeWidgetItem @ 10593 NONAME
- _ZTI15QWidgetAnimator @ 10594 NONAME ABSENT
- _ZTI15QWorkspaceChild @ 10595 NONAME ABSENT
- _ZTI16QAbstractSpinBox @ 10596 NONAME
- _ZTI16QBooleanComboBox @ 10597 NONAME ABSENT
- _ZTI16QCompletionModel @ 10598 NONAME ABSENT
- _ZTI16QDialogButtonBox @ 10599 NONAME
- _ZTI16QDoubleValidator @ 10600 NONAME
- _ZTI16QFileSystemModel @ 10601 NONAME
- _ZTI16QFontEngineMulti @ 10602 NONAME ABSENT
- _ZTI16QListViewPrivate @ 10603 NONAME ABSENT
- _ZTI16QMimeDataWrapper @ 10604 NONAME ABSENT
- _ZTI16QRegExpValidator @ 10605 NONAME
- _ZTI16QSideBarDelegate @ 10606 NONAME ABSENT
- _ZTI16QStringListModel @ 10607 NONAME
- _ZTI16QStyleSheetStyle @ 10608 NONAME
- _ZTI16QTableWidgetItem @ 10609 NONAME
- _ZTI16QWhatsThisAction @ 10610 NONAME ABSENT
- _ZTI17QAbstractItemView @ 10611 NONAME
- _ZTI17QBoxLayoutPrivate @ 10612 NONAME ABSENT
- _ZTI17QCalendarDelegate @ 10613 NONAME ABSENT
- _ZTI17QComboBoxDelegate @ 10614 NONAME ABSENT
- _ZTI17QComboBoxListView @ 10615 NONAME ABSENT
- _ZTI17QContextMenuEvent @ 10616 NONAME
- _ZTI17QDataWidgetMapper @ 10617 NONAME
- _ZTI17QDockWidgetLayout @ 10618 NONAME
- _ZTI17QFileIconProvider @ 10619 NONAME
- _ZTI17QFileInfoGatherer @ 10620 NONAME
- _ZTI17QGraphicsLineItem @ 10621 NONAME
- _ZTI17QGraphicsPathItem @ 10622 NONAME
- _ZTI17QGraphicsRectItem @ 10623 NONAME
- _ZTI17QGraphicsTextItem @ 10624 NONAME
- _ZTI17QIconEnginePlugin @ 10625 NONAME
- _ZTI17QInputMethodEvent @ 10626 NONAME
- _ZTI17QInternalMimeData @ 10627 NONAME ABSENT
- _ZTI17QKeyMapperPrivate @ 10628 NONAME ABSENT
- _ZTI17QMainWindowLayout @ 10629 NONAME
- _ZTI17QMainWindowTabBar @ 10630 NONAME ABSENT
- _ZTI17QMenuBarExtension @ 10631 NONAME ABSENT
- _ZTI17QPaintEngineState @ 10632 NONAME
- _ZTI17QPixmapIconEngine @ 10633 NONAME ABSENT
- _ZTI17QRasterPixmapData @ 10634 NONAME
- _ZTI17QS60WindowSurface @ 10635 NONAME ABSENT
- _ZTI17QSpinBoxValidator @ 10636 NONAME ABSENT
- _ZTI17QTabWidgetPrivate @ 10637 NONAME ABSENT
- _ZTI17QTextEditMimeData @ 10638 NONAME ABSENT
- _ZTI17QTextFramePrivate @ 10639 NONAME ABSENT
- _ZTI17QTextImageHandler @ 10640 NONAME ABSENT
- _ZTI17QTextTablePrivate @ 10641 NONAME ABSENT
- _ZTI17QToolBarExtension @ 10642 NONAME
- _ZTI17QToolBarSeparator @ 10643 NONAME ABSENT
- _ZTI17QUpdateLaterEvent @ 10644 NONAME ABSENT
- _ZTI17QWhatsThisPrivate @ 10645 NONAME ABSENT
- _ZTI18QColumnViewPrivate @ 10646 NONAME
- _ZTI18QComboMenuDelegate @ 10647 NONAME ABSENT
- _ZTI18QCommandLinkButton @ 10648 NONAME
- _ZTI18QDragResponseEvent @ 10649 NONAME
- _ZTI18QExpandingLineEdit @ 10650 NONAME ABSENT
- _ZTI18QFileDialogPrivate @ 10651 NONAME
- _ZTI18QGraphicsItemGroup @ 10652 NONAME
- _ZTI18QItemEditorFactory @ 10653 NONAME
- _ZTI18QMimeSourceWrapper @ 10654 NONAME ABSENT
- _ZTI18QPixmapDataFactory @ 10655 NONAME ABSENT
- _ZTI18QPrevNextCalButton @ 10656 NONAME ABSENT
- _ZTI18QRasterPaintEngine @ 10657 NONAME ABSENT
- _ZTI18QSortedModelEngine @ 10658 NONAME ABSENT
- _ZTI18QStandardItemModel @ 10659 NONAME
- _ZTI18QSyntaxHighlighter @ 10660 NONAME
- _ZTI18QTableCornerButton @ 10661 NONAME ABSENT
- _ZTI18QTextBlockUserData @ 10662 NONAME
- _ZTI18QTextureGlyphCache @ 10663 NONAME
- _ZTI18QWorkspaceTitleBar @ 10664 NONAME ABSENT
- _ZTI19QAbstractProxyModel @ 10665 NONAME
- _ZTI19QAbstractScrollArea @ 10666 NONAME
- _ZTI19QApplicationPrivate @ 10667 NONAME
- _ZTI19QCoeFepInputContext @ 10668 NONAME
- _ZTI19QColumnViewDelegate @ 10669 NONAME ABSENT
- _ZTI19QEventDispatcherS60 @ 10670 NONAME
- _ZTI19QFileDialogComboBox @ 10671 NONAME ABSENT
- _ZTI19QFileDialogLineEdit @ 10672 NONAME ABSENT
- _ZTI19QFileDialogListView @ 10673 NONAME ABSENT
- _ZTI19QFileDialogTreeView @ 10674 NONAME ABSENT
- _ZTI19QFontEngineMultiS60 @ 10675 NONAME ABSENT
- _ZTI19QFontFamilyDelegate @ 10676 NONAME ABSENT
- _ZTI19QGraphicsGridLayout @ 10677 NONAME
- _ZTI19QGraphicsLayoutItem @ 10678 NONAME
- _ZTI19QGraphicsPixmapItem @ 10679 NONAME
- _ZTI19QGraphicsSceneEvent @ 10680 NONAME
- _ZTI19QIconEnginePluginV2 @ 10681 NONAME
- _ZTI19QInputContextPlugin @ 10682 NONAME
- _ZTI19QInputDialogSpinBox @ 10683 NONAME ABSENT
- _ZTI19QItemSelectionModel @ 10684 NONAME
- _ZTI19QListWidgetMimeData @ 10685 NONAME ABSENT
- _ZTI19QPicturePaintEngine @ 10686 NONAME ABSENT
- _ZTI19QStyledItemDelegate @ 10687 NONAME
- _ZTI19QTextBrowserPrivate @ 10688 NONAME ABSENT
- _ZTI19QTextDocumentLayout @ 10689 NONAME
- _ZTI19QToolBarChangeEvent @ 10690 NONAME
- _ZTI20QDateTimeEditPrivate @ 10691 NONAME ABSENT
- _ZTI20QGraphicsEllipseItem @ 10692 NONAME
- _ZTI20QGraphicsItemPrivate @ 10693 NONAME
- _ZTI20QGraphicsPolygonItem @ 10694 NONAME
- _ZTI20QGraphicsProxyWidget @ 10695 NONAME
- _ZTI20QGraphicsViewPrivate @ 10696 NONAME
- _ZTI20QPictureFormatPlugin @ 10697 NONAME
- _ZTI20QRasterWindowSurface @ 10698 NONAME
- _ZTI20QStandardItemPrivate @ 10699 NONAME ABSENT
- _ZTI20QTableWidgetMimeData @ 10700 NONAME ABSENT
- _ZTI20QTextDocumentPrivate @ 10701 NONAME
- _ZTI20QTextFrameLayoutData @ 10702 NONAME
- _ZTI20QTextObjectInterface @ 10703 NONAME
- _ZTI20QUnsortedModelEngine @ 10704 NONAME ABSENT
- _ZTI20QWidgetResizeHandler @ 10705 NONAME
- _ZTI21QAbstractItemDelegate @ 10706 NONAME
- _ZTI21QCalendarDayValidator @ 10707 NONAME ABSENT
- _ZTI21QColorLuminancePicker @ 10708 NONAME ABSENT
- _ZTI21QDesktopWidgetPrivate @ 10709 NONAME ABSENT
- _ZTI21QDoubleSpinBoxPrivate @ 10710 NONAME ABSENT
- _ZTI21QEmulationPaintEngine @ 10711 NONAME ABSENT
- _ZTI21QErrorMessageTextView @ 10712 NONAME ABSENT
- _ZTI21QFontEngineGlyphCache @ 10713 NONAME ABSENT
- _ZTI21QGraphicsLinearLayout @ 10714 NONAME
- _ZTI21QGraphicsSystemPlugin @ 10715 NONAME
- _ZTI21QPaintEngineExPrivate @ 10716 NONAME
- _ZTI21QPixmapColorizeFilter @ 10717 NONAME
- _ZTI21QPlainTextEditControl @ 10718 NONAME ABSENT
- _ZTI21QRasterGraphicsSystem @ 10719 NONAME ABSENT
- _ZTI21QSortFilterProxyModel @ 10720 NONAME
- _ZTI22QAbstractSliderPrivate @ 10721 NONAME ABSENT
- _ZTI22QCalendarTextNavigator @ 10722 NONAME ABSENT
- _ZTI22QCalendarYearValidator @ 10723 NONAME ABSENT
- _ZTI22QDockWidgetTitleButton @ 10724 NONAME ABSENT
- _ZTI22QGraphicsItemAnimation @ 10725 NONAME
- _ZTI22QGraphicsLayoutPrivate @ 10726 NONAME
- _ZTI22QGraphicsWidgetPrivate @ 10727 NONAME ABSENT
- _ZTI22QImageIOHandlerPrivate @ 10728 NONAME ABSENT
- _ZTI22QStyleFactoryInterface @ 10729 NONAME
- _ZTI22QTextHtmlStyleSelector @ 10730 NONAME ABSENT
- _ZTI22QWhatsThisClickedEvent @ 10731 NONAME
- _ZTI23QAbstractSpinBoxPrivate @ 10732 NONAME ABSENT
- _ZTI23QActionToKeyEventMapper @ 10733 NONAME ABSENT
- _ZTI23QCalendarMonthValidator @ 10734 NONAME ABSENT
- _ZTI23QFileSystemModelPrivate @ 10735 NONAME
- _ZTI23QGraphicsSceneHelpEvent @ 10736 NONAME
- _ZTI23QGraphicsSceneMoveEvent @ 10737 NONAME
- _ZTI23QGraphicsSimpleTextItem @ 10738 NONAME
- _ZTI23QImageTextureGlyphCache @ 10739 NONAME ABSENT
- _ZTI23QOpenUrlHandlerRegistry @ 10740 NONAME ABSENT
- _ZTI23QPictureFormatInterface @ 10741 NONAME
- _ZTI23QPixmapDropShadowFilter @ 10742 NONAME
- _ZTI23QRasterPaintEngineState @ 10743 NONAME ABSENT
- _ZTI23QWindowStateChangeEvent @ 10744 NONAME
- _ZTI24QAbstractItemViewPrivate @ 10745 NONAME
- _ZTI24QComboBoxPrivateScroller @ 10746 NONAME
- _ZTI24QGraphicsSceneHoverEvent @ 10747 NONAME
- _ZTI24QGraphicsSceneMouseEvent @ 10748 NONAME
- _ZTI24QGraphicsSceneWheelEvent @ 10749 NONAME
- _ZTI24QPixmapConvolutionFilter @ 10750 NONAME
- _ZTI24QPlainTextDocumentLayout @ 10751 NONAME
- _ZTI24QSimplePixmapDataFactory @ 10752 NONAME ABSENT
- _ZTI25QAbstractScrollAreaFilter @ 10753 NONAME ABSENT
- _ZTI25QComboBoxPrivateContainer @ 10754 NONAME
- _ZTI25QDefaultItemEditorFactory @ 10755 NONAME ABSENT
- _ZTI25QGraphicsSceneResizeEvent @ 10756 NONAME
- _ZTI25QInputDialogDoubleSpinBox @ 10757 NONAME ABSENT
- _ZTI25QRasterPaintEnginePrivate @ 10758 NONAME ABSENT
- _ZTI25QStandardItemModelPrivate @ 10759 NONAME ABSENT
- _ZTI26QAbstractGraphicsShapeItem @ 10760 NONAME
- _ZTI26QAbstractProxyModelPrivate @ 10761 NONAME ABSENT
- _ZTI26QAbstractScrollAreaPrivate @ 10762 NONAME
- _ZTI26QGraphicsLayoutItemPrivate @ 10763 NONAME
- _ZTI27QAbstractTextDocumentLayout @ 10764 NONAME
- _ZTI27QGraphicsProxyWidgetPrivate @ 10765 NONAME ABSENT
- _ZTI27QGraphicsSceneDragDropEvent @ 10766 NONAME
- _ZTI27QIconEngineFactoryInterface @ 10767 NONAME
- _ZTI28QSortFilterProxyModelPrivate @ 10768 NONAME ABSENT
- _ZTI28QUnicodeControlCharacterMenu @ 10769 NONAME ABSENT
- _ZTI29QIconEngineFactoryInterfaceV2 @ 10770 NONAME
- _ZTI29QInputContextFactoryInterface @ 10771 NONAME
- _ZTI30QGraphicsSceneContextMenuEvent @ 10772 NONAME
- _ZTI31QGraphicsSystemFactoryInterface @ 10773 NONAME ABSENT
- _ZTI31QImageIOHandlerFactoryInterface @ 10774 NONAME
- _ZTI35QFontDatabaseS60StoreImplementation @ 10775 NONAME ABSENT
- _ZTI5QDial @ 10776 NONAME
- _ZTI5QDrag @ 10777 NONAME
- _ZTI5QMenu @ 10778 NONAME
- _ZTI6QFrame @ 10779 NONAME
- _ZTI6QImage @ 10780 NONAME
- _ZTI6QLabel @ 10781 NONAME
- _ZTI6QMovie @ 10782 NONAME
- _ZTI6QSound @ 10783 NONAME
- _ZTI6QStyle @ 10784 NONAME
- _ZTI7QAction @ 10785 NONAME
- _ZTI7QBitmap @ 10786 NONAME
- _ZTI7QDialog @ 10787 NONAME
- _ZTI7QLayout @ 10788 NONAME
- _ZTI7QPixmap @ 10789 NONAME
- _ZTI7QSlider @ 10790 NONAME
- _ZTI7QTabBar @ 10791 NONAME
- _ZTI7QWidget @ 10792 NONAME
- _ZTI7QWizard @ 10793 NONAME
- _ZTI8QMdiArea @ 10794 NONAME
- _ZTI8QMenuBar @ 10795 NONAME
- _ZTI8QPMCache @ 10796 NONAME ABSENT
- _ZTI8QPicture @ 10797 NONAME
- _ZTI8QS60Beep @ 10798 NONAME ABSENT
- _ZTI8QSidebar @ 10799 NONAME
- _ZTI8QSpinBox @ 10800 NONAME
- _ZTI8QStroker @ 10801 NONAME
- _ZTI8QToolBar @ 10802 NONAME
- _ZTI8QToolBox @ 10803 NONAME
- _ZTI9QAuBucket @ 10804 NONAME ABSENT
- _ZTI9QAuServer @ 10805 NONAME ABSENT
- _ZTI9QCheckBox @ 10806 NONAME
- _ZTI9QComboBox @ 10807 NONAME
- _ZTI9QDateEdit @ 10808 NONAME
- _ZTI9QDirModel @ 10809 NONAME
- _ZTI9QDropData @ 10810 NONAME ABSENT
- _ZTI9QGroupBox @ 10811 NONAME
- _ZTI9QKeyEvent @ 10812 NONAME
- _ZTI9QLineEdit @ 10813 NONAME
- _ZTI9QListView @ 10814 NONAME
- _ZTI9QS60Style @ 10815 NONAME
- _ZTI9QShortcut @ 10816 NONAME
- _ZTI9QSizeGrip @ 10817 NONAME
- _ZTI9QSplitter @ 10818 NONAME
- _ZTI9QTextEdit @ 10819 NONAME
- _ZTI9QTextList @ 10820 NONAME
- _ZTI9QTimeEdit @ 10821 NONAME
- _ZTI9QTipLabel @ 10822 NONAME ABSENT
- _ZTI9QTreeView @ 10823 NONAME
- _ZTI9QUndoView @ 10824 NONAME
- _ZTI9QUrlModel @ 10825 NONAME
- _ZTIN4QCss13StyleSelectorE @ 10826 NONAME
- _ZTIN4QMdi12ControlLabelE @ 10827 NONAME ABSENT
- _ZTIN4QMdi12RegularTilerE @ 10828 NONAME ABSENT
- _ZTIN4QMdi14SimpleCascaderE @ 10829 NONAME ABSENT
- _ZTIN4QMdi16ControlContainerE @ 10830 NONAME ABSENT
- _ZTIN4QMdi16ControllerWidgetE @ 10831 NONAME ABSENT
- _ZTIN4QMdi16MinOverlapPlacerE @ 10832 NONAME ABSENT
- _ZTIN4QMdi9IconTilerE @ 10833 NONAME ABSENT
- _ZTV10QBoxLayout @ 10834 NONAME
- _ZTV10QClipboard @ 10835 NONAME
- _ZTV10QColorWell @ 10836 NONAME ABSENT
- _ZTV10QCompleter @ 10837 NONAME
- _ZTV10QDropEvent @ 10838 NONAME
- _ZTV10QFontCache @ 10839 NONAME ABSENT
- _ZTV10QHelpEvent @ 10840 NONAME
- _ZTV10QHideEvent @ 10841 NONAME
- _ZTV10QKeyMapper @ 10842 NONAME ABSENT
- _ZTV10QLCDNumber @ 10843 NONAME
- _ZTV10QListModel @ 10844 NONAME ABSENT
- _ZTV10QMoveEvent @ 10845 NONAME
- _ZTV10QScrollBar @ 10846 NONAME
- _ZTV10QShowEvent @ 10847 NONAME
- _ZTV10QStatusBar @ 10848 NONAME
- _ZTV10QTabWidget @ 10849 NONAME
- _ZTV10QTableView @ 10850 NONAME
- _ZTV10QTextFrame @ 10851 NONAME
- _ZTV10QTextTable @ 10852 NONAME
- _ZTV10QTreeModel @ 10853 NONAME ABSENT
- _ZTV10QUndoGroup @ 10854 NONAME
- _ZTV10QUndoModel @ 10855 NONAME ABSENT
- _ZTV10QUndoStack @ 10856 NONAME
- _ZTV10QValidator @ 10857 NONAME
- _ZTV10QWellArray @ 10858 NONAME ABSENT
- _ZTV10QWhatsThat @ 10859 NONAME ABSENT
- _ZTV10QWorkspace @ 10860 NONAME
- _ZTV11CloseButton @ 10861 NONAME ABSENT
- _ZTV11QBmpHandler @ 10862 NONAME ABSENT
- _ZTV11QCloseEvent @ 10863 NONAME
- _ZTV11QColumnView @ 10864 NONAME
- _ZTV11QDockWidget @ 10865 NONAME
- _ZTV11QFileDialog @ 10866 NONAME
- _ZTV11QFocusEvent @ 10867 NONAME
- _ZTV11QFocusFrame @ 10868 NONAME
- _ZTV11QFontDialog @ 10869 NONAME
- _ZTV11QFontEngine @ 10870 NONAME
- _ZTV11QFormLayout @ 10871 NONAME
- _ZTV11QGridLayout @ 10872 NONAME
- _ZTV11QHBoxLayout @ 10873 NONAME
- _ZTV11QHeaderView @ 10874 NONAME
- _ZTV11QHoverEvent @ 10875 NONAME
- _ZTV11QIconEngine @ 10876 NONAME
- _ZTV11QInputEvent @ 10877 NONAME
- _ZTV11QKeyEventEx @ 10878 NONAME ABSENT
- _ZTV11QLayoutItem @ 10879 NONAME
- _ZTV11QListWidget @ 10880 NONAME
- _ZTV11QMDIControl @ 10881 NONAME ABSENT
- _ZTV11QMainWindow @ 10882 NONAME
- _ZTV11QMessageBox @ 10883 NONAME
- _ZTV11QMimeSource @ 10884 NONAME
- _ZTV11QMouseEvent @ 10885 NONAME
- _ZTV11QPaintEvent @ 10886 NONAME
- _ZTV11QPixmapData @ 10887 NONAME
- _ZTV11QPngHandler @ 10888 NONAME ABSENT
- _ZTV11QPpmHandler @ 10889 NONAME ABSENT
- _ZTV11QProxyModel @ 10890 NONAME
- _ZTV11QPushButton @ 10891 NONAME
- _ZTV11QRollEffect @ 10892 NONAME ABSENT
- _ZTV11QRubberBand @ 10893 NONAME
- _ZTV11QScrollArea @ 10894 NONAME
- _ZTV11QSpacerItem @ 10895 NONAME
- _ZTV11QStrokerOps @ 10896 NONAME
- _ZTV11QTableModel @ 10897 NONAME ABSENT
- _ZTV11QTextObject @ 10898 NONAME
- _ZTV11QToolButton @ 10899 NONAME
- _ZTV11QTreeWidget @ 10900 NONAME
- _ZTV11QUndoAction @ 10901 NONAME ABSENT
- _ZTV11QVBoxLayout @ 10902 NONAME
- _ZTV11QWheelEvent @ 10903 NONAME
- _ZTV11QWidgetItem @ 10904 NONAME
- _ZTV11QWizardPage @ 10905 NONAME
- _ZTV11QXbmHandler @ 10906 NONAME ABSENT
- _ZTV11QXpmHandler @ 10907 NONAME ABSENT
- _ZTV12QActionEvent @ 10908 NONAME
- _ZTV12QActionGroup @ 10909 NONAME
- _ZTV12QAlphaWidget @ 10910 NONAME ABSENT
- _ZTV12QApplication @ 10911 NONAME
- _ZTV12QAuBucketS60 @ 10912 NONAME ABSENT
- _ZTV12QButtonGroup @ 10913 NONAME
- _ZTV12QColorDialog @ 10914 NONAME
- _ZTV12QColorPicker @ 10915 NONAME ABSENT
- _ZTV12QColorShower @ 10916 NONAME ABSENT
- _ZTV12QCommonStyle @ 10917 NONAME
- _ZTV12QDashStroker @ 10918 NONAME
- _ZTV12QDragManager @ 10919 NONAME ABSENT
- _ZTV12QFSCompleter @ 10920 NONAME ABSENT
- _ZTV12QInputDialog @ 10921 NONAME
- _ZTV12QMenuPrivate @ 10922 NONAME ABSENT
- _ZTV12QPaintDevice @ 10923 NONAME
- _ZTV12QPaintEngine @ 10924 NONAME
- _ZTV12QProgressBar @ 10925 NONAME
- _ZTV12QRadioButton @ 10926 NONAME
- _ZTV12QResizeEvent @ 10927 NONAME
- _ZTV12QStylePlugin @ 10928 NONAME
- _ZTV12QTableWidget @ 10929 NONAME
- _ZTV12QTabletEvent @ 10930 NONAME
- _ZTV12QTessellator @ 10931 NONAME
- _ZTV12QTextBrowser @ 10932 NONAME
- _ZTV12QTextControl @ 10933 NONAME
- _ZTV12QToolBarItem @ 10934 NONAME ABSENT
- _ZTV12QTornOffMenu @ 10935 NONAME ABSENT
- _ZTV12QUndoCommand @ 10936 NONAME
- _ZTV13QCalendarView @ 10937 NONAME ABSENT
- _ZTV13QDateTimeEdit @ 10938 NONAME
- _ZTV13QErrorMessage @ 10939 NONAME
- _ZTV13QFontComboBox @ 10940 NONAME
- _ZTV13QFontListView @ 10941 NONAME ABSENT
- _ZTV13QFramePrivate @ 10942 NONAME ABSENT
- _ZTV13QGraphicsItem @ 10943 NONAME
- _ZTV13QGraphicsView @ 10944 NONAME
- _ZTV13QIconEngineV2 @ 10945 NONAME
- _ZTV13QInputContext @ 10946 NONAME
- _ZTV13QIntValidator @ 10947 NONAME
- _ZTV13QItemDelegate @ 10948 NONAME
- _ZTV13QLongTapTimer @ 10949 NONAME ABSENT
- _ZTV13QMdiSubWindow @ 10950 NONAME
- _ZTV13QMouseEventEx @ 10951 NONAME ABSENT
- _ZTV13QPainterState @ 10952 NONAME
- _ZTV13QPixmapFilter @ 10953 NONAME
- _ZTV13QSplashScreen @ 10954 NONAME
- _ZTV13QStandardItem @ 10955 NONAME
- _ZTV13QTextDocument @ 10956 NONAME
- _ZTV13QWidgetAction @ 10957 NONAME
- _ZTV13QWidgetItemV2 @ 10958 NONAME
- _ZTV13QWindowsStyle @ 10959 NONAME
- _ZTV13QWizardHeader @ 10960 NONAME ABSENT
- _ZTV14QActionPrivate @ 10961 NONAME
- _ZTV14QCalendarModel @ 10962 NONAME ABSENT
- _ZTV14QCalendarPopup @ 10963 NONAME ABSENT
- _ZTV14QDesktopWidget @ 10964 NONAME
- _ZTV14QDoubleSpinBox @ 10965 NONAME
- _ZTV14QDragMoveEvent @ 10966 NONAME
- _ZTV14QFileOpenEvent @ 10967 NONAME
- _ZTV14QFontEngineBox @ 10968 NONAME ABSENT
- _ZTV14QFontEngineS60 @ 10969 NONAME ABSENT
- _ZTV14QGraphicsScene @ 10970 NONAME
- _ZTV14QIconDragEvent @ 10971 NONAME
- _ZTV14QImageIOPlugin @ 10972 NONAME
- _ZTV14QLayoutPrivate @ 10973 NONAME
- _ZTV14QMdiAreaTabBar @ 10974 NONAME ABSENT
- _ZTV14QPaintEngineEx @ 10975 NONAME
- _ZTV14QPlainTextEdit @ 10976 NONAME
- _ZTV14QShortcutEvent @ 10977 NONAME
- _ZTV14QStackedLayout @ 10978 NONAME
- _ZTV14QStackedWidget @ 10979 NONAME
- _ZTV14QToolBarLayout @ 10980 NONAME ABSENT
- _ZTV14QToolBoxButton @ 10981 NONAME ABSENT
- _ZTV14QWidgetPrivate @ 10982 NONAME
- _ZTV14QWindowSurface @ 10983 NONAME
- _ZTV15QAbstractButton @ 10984 NONAME
- _ZTV15QAbstractSlider @ 10985 NONAME
- _ZTV15QCalendarWidget @ 10986 NONAME
- _ZTV15QClipboardEvent @ 10987 NONAME
- _ZTV15QColorShowLabel @ 10988 NONAME ABSENT
- _ZTV15QColumnViewGrip @ 10989 NONAME
- _ZTV15QDockWidgetItem @ 10990 NONAME ABSENT
- _ZTV15QDragEnterEvent @ 10991 NONAME
- _ZTV15QDragLeaveEvent @ 10992 NONAME
- _ZTV15QGraphicsLayout @ 10993 NONAME
- _ZTV15QGraphicsWidget @ 10994 NONAME
- _ZTV15QImageIOHandler @ 10995 NONAME
- _ZTV15QListWidgetItem @ 10996 NONAME
- _ZTV15QMdiAreaPrivate @ 10997 NONAME ABSENT
- _ZTV15QProgressDialog @ 10998 NONAME
- _ZTV15QSessionManager @ 10999 NONAME
- _ZTV15QSpinBoxPrivate @ 11000 NONAME ABSENT
- _ZTV15QSplitterHandle @ 11001 NONAME
- _ZTV15QStatusTipEvent @ 11002 NONAME
- _ZTV15QSymbianControl @ 11003 NONAME ABSENT
- _ZTV15QTextBlockGroup @ 11004 NONAME
- _ZTV15QTreeWidgetItem @ 11005 NONAME
- _ZTV15QWidgetAnimator @ 11006 NONAME ABSENT
- _ZTV15QWorkspaceChild @ 11007 NONAME ABSENT
- _ZTV16QAbstractSpinBox @ 11008 NONAME
- _ZTV16QBooleanComboBox @ 11009 NONAME ABSENT
- _ZTV16QCompletionModel @ 11010 NONAME ABSENT
- _ZTV16QDialogButtonBox @ 11011 NONAME
- _ZTV16QDoubleValidator @ 11012 NONAME
- _ZTV16QFileSystemModel @ 11013 NONAME
- _ZTV16QFontEngineMulti @ 11014 NONAME ABSENT
- _ZTV16QListViewPrivate @ 11015 NONAME ABSENT
- _ZTV16QMimeDataWrapper @ 11016 NONAME ABSENT
- _ZTV16QRegExpValidator @ 11017 NONAME
- _ZTV16QSideBarDelegate @ 11018 NONAME ABSENT
- _ZTV16QStringListModel @ 11019 NONAME
- _ZTV16QStyleSheetStyle @ 11020 NONAME
- _ZTV16QTableWidgetItem @ 11021 NONAME
- _ZTV16QWhatsThisAction @ 11022 NONAME ABSENT
- _ZTV17QAbstractItemView @ 11023 NONAME
- _ZTV17QBoxLayoutPrivate @ 11024 NONAME ABSENT
- _ZTV17QCalendarDelegate @ 11025 NONAME ABSENT
- _ZTV17QComboBoxDelegate @ 11026 NONAME ABSENT
- _ZTV17QComboBoxListView @ 11027 NONAME ABSENT
- _ZTV17QContextMenuEvent @ 11028 NONAME
- _ZTV17QDataWidgetMapper @ 11029 NONAME
- _ZTV17QDockWidgetLayout @ 11030 NONAME
- _ZTV17QFileIconProvider @ 11031 NONAME
- _ZTV17QFileInfoGatherer @ 11032 NONAME
- _ZTV17QGraphicsLineItem @ 11033 NONAME
- _ZTV17QGraphicsPathItem @ 11034 NONAME
- _ZTV17QGraphicsRectItem @ 11035 NONAME
- _ZTV17QGraphicsTextItem @ 11036 NONAME
- _ZTV17QIconEnginePlugin @ 11037 NONAME
- _ZTV17QInputMethodEvent @ 11038 NONAME
- _ZTV17QInternalMimeData @ 11039 NONAME ABSENT
- _ZTV17QKeyMapperPrivate @ 11040 NONAME ABSENT
- _ZTV17QMainWindowLayout @ 11041 NONAME
- _ZTV17QMainWindowTabBar @ 11042 NONAME ABSENT
- _ZTV17QMenuBarExtension @ 11043 NONAME ABSENT
- _ZTV17QPixmapIconEngine @ 11044 NONAME ABSENT
- _ZTV17QRasterPixmapData @ 11045 NONAME
- _ZTV17QS60WindowSurface @ 11046 NONAME ABSENT
- _ZTV17QSpinBoxValidator @ 11047 NONAME ABSENT
- _ZTV17QTabWidgetPrivate @ 11048 NONAME ABSENT
- _ZTV17QTextEditMimeData @ 11049 NONAME ABSENT
- _ZTV17QTextFramePrivate @ 11050 NONAME ABSENT
- _ZTV17QTextImageHandler @ 11051 NONAME ABSENT
- _ZTV17QTextTablePrivate @ 11052 NONAME ABSENT
- _ZTV17QToolBarExtension @ 11053 NONAME
- _ZTV17QToolBarSeparator @ 11054 NONAME ABSENT
- _ZTV17QUpdateLaterEvent @ 11055 NONAME ABSENT
- _ZTV17QWhatsThisPrivate @ 11056 NONAME ABSENT
- _ZTV18QColumnViewPrivate @ 11057 NONAME
- _ZTV18QComboMenuDelegate @ 11058 NONAME ABSENT
- _ZTV18QCommandLinkButton @ 11059 NONAME
- _ZTV18QDragResponseEvent @ 11060 NONAME
- _ZTV18QExpandingLineEdit @ 11061 NONAME ABSENT
- _ZTV18QFileDialogPrivate @ 11062 NONAME
- _ZTV18QGraphicsItemGroup @ 11063 NONAME
- _ZTV18QItemEditorFactory @ 11064 NONAME
- _ZTV18QMimeSourceWrapper @ 11065 NONAME ABSENT
- _ZTV18QPixmapDataFactory @ 11066 NONAME ABSENT
- _ZTV18QPrevNextCalButton @ 11067 NONAME ABSENT
- _ZTV18QRasterPaintEngine @ 11068 NONAME ABSENT
- _ZTV18QSortedModelEngine @ 11069 NONAME ABSENT
- _ZTV18QStandardItemModel @ 11070 NONAME
- _ZTV18QSyntaxHighlighter @ 11071 NONAME
- _ZTV18QTableCornerButton @ 11072 NONAME ABSENT
- _ZTV18QTextBlockUserData @ 11073 NONAME
- _ZTV18QTextureGlyphCache @ 11074 NONAME
- _ZTV18QWorkspaceTitleBar @ 11075 NONAME ABSENT
- _ZTV19QAbstractProxyModel @ 11076 NONAME
- _ZTV19QAbstractScrollArea @ 11077 NONAME
- _ZTV19QApplicationPrivate @ 11078 NONAME
- _ZTV19QCoeFepInputContext @ 11079 NONAME
- _ZTV19QColumnViewDelegate @ 11080 NONAME ABSENT
- _ZTV19QEventDispatcherS60 @ 11081 NONAME
- _ZTV19QFileDialogComboBox @ 11082 NONAME ABSENT
- _ZTV19QFileDialogLineEdit @ 11083 NONAME ABSENT
- _ZTV19QFileDialogListView @ 11084 NONAME ABSENT
- _ZTV19QFileDialogTreeView @ 11085 NONAME ABSENT
- _ZTV19QFontEngineMultiS60 @ 11086 NONAME ABSENT
- _ZTV19QFontFamilyDelegate @ 11087 NONAME ABSENT
- _ZTV19QGraphicsGridLayout @ 11088 NONAME
- _ZTV19QGraphicsLayoutItem @ 11089 NONAME
- _ZTV19QGraphicsPixmapItem @ 11090 NONAME
- _ZTV19QGraphicsSceneEvent @ 11091 NONAME
- _ZTV19QIconEnginePluginV2 @ 11092 NONAME
- _ZTV19QInputContextPlugin @ 11093 NONAME
- _ZTV19QInputDialogSpinBox @ 11094 NONAME ABSENT
- _ZTV19QItemSelectionModel @ 11095 NONAME
- _ZTV19QListWidgetMimeData @ 11096 NONAME ABSENT
- _ZTV19QPicturePaintEngine @ 11097 NONAME ABSENT
- _ZTV19QStyledItemDelegate @ 11098 NONAME
- _ZTV19QTextBrowserPrivate @ 11099 NONAME ABSENT
- _ZTV19QTextDocumentLayout @ 11100 NONAME
- _ZTV19QToolBarChangeEvent @ 11101 NONAME
- _ZTV20QDateTimeEditPrivate @ 11102 NONAME ABSENT
- _ZTV20QGraphicsEllipseItem @ 11103 NONAME
- _ZTV20QGraphicsItemPrivate @ 11104 NONAME
- _ZTV20QGraphicsPolygonItem @ 11105 NONAME
- _ZTV20QGraphicsProxyWidget @ 11106 NONAME
- _ZTV20QGraphicsViewPrivate @ 11107 NONAME
- _ZTV20QPictureFormatPlugin @ 11108 NONAME
- _ZTV20QRasterWindowSurface @ 11109 NONAME
- _ZTV20QStandardItemPrivate @ 11110 NONAME ABSENT
- _ZTV20QTableWidgetMimeData @ 11111 NONAME ABSENT
- _ZTV20QTextDocumentPrivate @ 11112 NONAME
- _ZTV20QTextFrameLayoutData @ 11113 NONAME
- _ZTV20QUnsortedModelEngine @ 11114 NONAME ABSENT
- _ZTV20QWidgetResizeHandler @ 11115 NONAME
- _ZTV21QAbstractItemDelegate @ 11116 NONAME
- _ZTV21QCalendarDayValidator @ 11117 NONAME ABSENT
- _ZTV21QColorLuminancePicker @ 11118 NONAME ABSENT
- _ZTV21QDesktopWidgetPrivate @ 11119 NONAME ABSENT
- _ZTV21QDoubleSpinBoxPrivate @ 11120 NONAME ABSENT
- _ZTV21QEmulationPaintEngine @ 11121 NONAME ABSENT
- _ZTV21QErrorMessageTextView @ 11122 NONAME ABSENT
- _ZTV21QFontEngineGlyphCache @ 11123 NONAME ABSENT
- _ZTV21QGraphicsLinearLayout @ 11124 NONAME
- _ZTV21QGraphicsSystemPlugin @ 11125 NONAME
- _ZTV21QPaintEngineExPrivate @ 11126 NONAME
- _ZTV21QPixmapColorizeFilter @ 11127 NONAME
- _ZTV21QPlainTextEditControl @ 11128 NONAME ABSENT
- _ZTV21QRasterGraphicsSystem @ 11129 NONAME ABSENT
- _ZTV21QSortFilterProxyModel @ 11130 NONAME
- _ZTV22QAbstractSliderPrivate @ 11131 NONAME ABSENT
- _ZTV22QCalendarTextNavigator @ 11132 NONAME ABSENT
- _ZTV22QCalendarYearValidator @ 11133 NONAME ABSENT
- _ZTV22QDockWidgetTitleButton @ 11134 NONAME ABSENT
- _ZTV22QGraphicsItemAnimation @ 11135 NONAME
- _ZTV22QGraphicsLayoutPrivate @ 11136 NONAME
- _ZTV22QGraphicsWidgetPrivate @ 11137 NONAME ABSENT
- _ZTV22QImageIOHandlerPrivate @ 11138 NONAME ABSENT
- _ZTV22QTextHtmlStyleSelector @ 11139 NONAME ABSENT
- _ZTV22QWhatsThisClickedEvent @ 11140 NONAME
- _ZTV23QAbstractSpinBoxPrivate @ 11141 NONAME ABSENT
- _ZTV23QActionToKeyEventMapper @ 11142 NONAME ABSENT
- _ZTV23QCalendarMonthValidator @ 11143 NONAME ABSENT
- _ZTV23QFileSystemModelPrivate @ 11144 NONAME
- _ZTV23QGraphicsSceneHelpEvent @ 11145 NONAME
- _ZTV23QGraphicsSceneMoveEvent @ 11146 NONAME
- _ZTV23QGraphicsSimpleTextItem @ 11147 NONAME
- _ZTV23QImageTextureGlyphCache @ 11148 NONAME ABSENT
- _ZTV23QOpenUrlHandlerRegistry @ 11149 NONAME ABSENT
- _ZTV23QPixmapDropShadowFilter @ 11150 NONAME
- _ZTV23QRasterPaintEngineState @ 11151 NONAME ABSENT
- _ZTV23QWindowStateChangeEvent @ 11152 NONAME
- _ZTV24QAbstractItemViewPrivate @ 11153 NONAME
- _ZTV24QComboBoxPrivateScroller @ 11154 NONAME
- _ZTV24QGraphicsSceneHoverEvent @ 11155 NONAME
- _ZTV24QGraphicsSceneMouseEvent @ 11156 NONAME
- _ZTV24QGraphicsSceneWheelEvent @ 11157 NONAME
- _ZTV24QPixmapConvolutionFilter @ 11158 NONAME
- _ZTV24QPlainTextDocumentLayout @ 11159 NONAME
- _ZTV24QSimplePixmapDataFactory @ 11160 NONAME ABSENT
- _ZTV25QAbstractScrollAreaFilter @ 11161 NONAME ABSENT
- _ZTV25QComboBoxPrivateContainer @ 11162 NONAME
- _ZTV25QDefaultItemEditorFactory @ 11163 NONAME ABSENT
- _ZTV25QGraphicsSceneResizeEvent @ 11164 NONAME
- _ZTV25QInputDialogDoubleSpinBox @ 11165 NONAME ABSENT
- _ZTV25QRasterPaintEnginePrivate @ 11166 NONAME ABSENT
- _ZTV25QStandardItemModelPrivate @ 11167 NONAME ABSENT
- _ZTV26QAbstractGraphicsShapeItem @ 11168 NONAME
- _ZTV26QAbstractProxyModelPrivate @ 11169 NONAME ABSENT
- _ZTV26QAbstractScrollAreaPrivate @ 11170 NONAME
- _ZTV26QGraphicsLayoutItemPrivate @ 11171 NONAME
- _ZTV27QAbstractTextDocumentLayout @ 11172 NONAME
- _ZTV27QGraphicsProxyWidgetPrivate @ 11173 NONAME ABSENT
- _ZTV27QGraphicsSceneDragDropEvent @ 11174 NONAME
- _ZTV28QSortFilterProxyModelPrivate @ 11175 NONAME ABSENT
- _ZTV28QUnicodeControlCharacterMenu @ 11176 NONAME ABSENT
- _ZTV30QGraphicsSceneContextMenuEvent @ 11177 NONAME
- _ZTV35QFontDatabaseS60StoreImplementation @ 11178 NONAME ABSENT
- _ZTV5QDial @ 11179 NONAME
- _ZTV5QDrag @ 11180 NONAME
- _ZTV5QMenu @ 11181 NONAME
- _ZTV6QFrame @ 11182 NONAME
- _ZTV6QImage @ 11183 NONAME
- _ZTV6QLabel @ 11184 NONAME
- _ZTV6QMovie @ 11185 NONAME
- _ZTV6QSound @ 11186 NONAME
- _ZTV6QStyle @ 11187 NONAME
- _ZTV7QAction @ 11188 NONAME
- _ZTV7QBitmap @ 11189 NONAME
- _ZTV7QDialog @ 11190 NONAME
- _ZTV7QLayout @ 11191 NONAME
- _ZTV7QPixmap @ 11192 NONAME
- _ZTV7QSlider @ 11193 NONAME
- _ZTV7QTabBar @ 11194 NONAME
- _ZTV7QWidget @ 11195 NONAME
- _ZTV7QWizard @ 11196 NONAME
- _ZTV8QMdiArea @ 11197 NONAME
- _ZTV8QMenuBar @ 11198 NONAME
- _ZTV8QPMCache @ 11199 NONAME ABSENT
- _ZTV8QPicture @ 11200 NONAME
- _ZTV8QS60Beep @ 11201 NONAME ABSENT
- _ZTV8QSidebar @ 11202 NONAME
- _ZTV8QSpinBox @ 11203 NONAME
- _ZTV8QStroker @ 11204 NONAME
- _ZTV8QToolBar @ 11205 NONAME
- _ZTV8QToolBox @ 11206 NONAME
- _ZTV9QAuBucket @ 11207 NONAME ABSENT
- _ZTV9QAuServer @ 11208 NONAME ABSENT
- _ZTV9QCheckBox @ 11209 NONAME
- _ZTV9QComboBox @ 11210 NONAME
- _ZTV9QDateEdit @ 11211 NONAME
- _ZTV9QDirModel @ 11212 NONAME
- _ZTV9QDropData @ 11213 NONAME ABSENT
- _ZTV9QGroupBox @ 11214 NONAME
- _ZTV9QKeyEvent @ 11215 NONAME
- _ZTV9QLineEdit @ 11216 NONAME
- _ZTV9QListView @ 11217 NONAME
- _ZTV9QS60Style @ 11218 NONAME
- _ZTV9QShortcut @ 11219 NONAME
- _ZTV9QSizeGrip @ 11220 NONAME
- _ZTV9QSplitter @ 11221 NONAME
- _ZTV9QTextEdit @ 11222 NONAME
- _ZTV9QTextList @ 11223 NONAME
- _ZTV9QTimeEdit @ 11224 NONAME
- _ZTV9QTipLabel @ 11225 NONAME ABSENT
- _ZTV9QTreeView @ 11226 NONAME
- _ZTV9QUndoView @ 11227 NONAME
- _ZTV9QUrlModel @ 11228 NONAME
- _ZTVN4QCss13StyleSelectorE @ 11229 NONAME
- _ZTVN4QMdi12ControlLabelE @ 11230 NONAME ABSENT
- _ZTVN4QMdi12RegularTilerE @ 11231 NONAME ABSENT
- _ZTVN4QMdi14SimpleCascaderE @ 11232 NONAME ABSENT
- _ZTVN4QMdi16ControlContainerE @ 11233 NONAME ABSENT
- _ZTVN4QMdi16ControllerWidgetE @ 11234 NONAME ABSENT
- _ZTVN4QMdi16MinOverlapPlacerE @ 11235 NONAME ABSENT
- _ZTVN4QMdi9IconTilerE @ 11236 NONAME ABSENT
- _ZThn12_N10QDropEventD0Ev @ 11237 NONAME
- _ZThn12_N10QDropEventD1Ev @ 11238 NONAME
- _ZThn12_N14QDragMoveEventD0Ev @ 11239 NONAME
- _ZThn12_N14QDragMoveEventD1Ev @ 11240 NONAME
- _ZThn12_N15QDragEnterEventD0Ev @ 11241 NONAME
- _ZThn12_N15QDragEnterEventD1Ev @ 11242 NONAME
- _ZThn12_N19QCoeFepInputContext29SetStateTransferingOwnershipLEPN33MCoeFepAwareTextEditor_Extension16CStateE4TUid @ 11243 NONAME
- _ZThn12_N19QCoeFepInputContext5StateE4TUid @ 11244 NONAME
- _ZThn12_NK10QDropEvent11encodedDataEPKc @ 11245 NONAME
- _ZThn12_NK10QDropEvent6formatEi @ 11246 NONAME
- _ZThn12_NK10QDropEvent8providesEPKc @ 11247 NONAME
- _ZThn16_N15QGraphicsWidget11setGeometryERK6QRectF @ 11248 NONAME
- _ZThn16_N15QGraphicsWidget14updateGeometryEv @ 11249 NONAME
- _ZThn16_N15QGraphicsWidgetD0Ev @ 11250 NONAME
- _ZThn16_N15QGraphicsWidgetD1Ev @ 11251 NONAME
- _ZThn16_N19QCoeFepInputContext15MopSupplyObjectE8TTypeUid @ 11252 NONAME
- _ZThn16_N20QGraphicsProxyWidget11setGeometryERK6QRectF @ 11253 NONAME
- _ZThn16_N20QGraphicsProxyWidgetD0Ev @ 11254 NONAME
- _ZThn16_N20QGraphicsProxyWidgetD1Ev @ 11255 NONAME
- _ZThn16_NK15QGraphicsWidget18getContentsMarginsEPfS0_S0_S0_ @ 11256 NONAME
- _ZThn16_NK15QGraphicsWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 11257 NONAME
- _ZThn16_NK20QGraphicsProxyWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 11258 NONAME
- _ZThn8_N10QBoxLayout10invalidateEv @ 11259 NONAME
- _ZThn8_N10QBoxLayout11setGeometryERK5QRect @ 11260 NONAME
- _ZThn8_N10QBoxLayoutD0Ev @ 11261 NONAME
- _ZThn8_N10QBoxLayoutD1Ev @ 11262 NONAME
- _ZThn8_N10QLCDNumberD0Ev @ 11263 NONAME
- _ZThn8_N10QLCDNumberD1Ev @ 11264 NONAME
- _ZThn8_N10QScrollBarD0Ev @ 11265 NONAME
- _ZThn8_N10QScrollBarD1Ev @ 11266 NONAME
- _ZThn8_N10QStatusBarD0Ev @ 11267 NONAME
- _ZThn8_N10QStatusBarD1Ev @ 11268 NONAME
- _ZThn8_N10QTabWidgetD0Ev @ 11269 NONAME
- _ZThn8_N10QTabWidgetD1Ev @ 11270 NONAME
- _ZThn8_N10QTableViewD0Ev @ 11271 NONAME
- _ZThn8_N10QTableViewD1Ev @ 11272 NONAME
- _ZThn8_N10QWorkspaceD0Ev @ 11273 NONAME
- _ZThn8_N10QWorkspaceD1Ev @ 11274 NONAME
- _ZThn8_N11QColumnViewD0Ev @ 11275 NONAME
- _ZThn8_N11QColumnViewD1Ev @ 11276 NONAME
- _ZThn8_N11QDockWidgetD0Ev @ 11277 NONAME
- _ZThn8_N11QDockWidgetD1Ev @ 11278 NONAME
- _ZThn8_N11QFileDialogD0Ev @ 11279 NONAME
- _ZThn8_N11QFileDialogD1Ev @ 11280 NONAME
- _ZThn8_N11QFocusFrameD0Ev @ 11281 NONAME
- _ZThn8_N11QFocusFrameD1Ev @ 11282 NONAME
- _ZThn8_N11QFontDialogD0Ev @ 11283 NONAME
- _ZThn8_N11QFontDialogD1Ev @ 11284 NONAME
- _ZThn8_N11QFormLayout10invalidateEv @ 11285 NONAME
- _ZThn8_N11QFormLayout11setGeometryERK5QRect @ 11286 NONAME
- _ZThn8_N11QFormLayoutD0Ev @ 11287 NONAME
- _ZThn8_N11QFormLayoutD1Ev @ 11288 NONAME
- _ZThn8_N11QGridLayout10invalidateEv @ 11289 NONAME
- _ZThn8_N11QGridLayout11setGeometryERK5QRect @ 11290 NONAME
- _ZThn8_N11QGridLayoutD0Ev @ 11291 NONAME
- _ZThn8_N11QGridLayoutD1Ev @ 11292 NONAME
- _ZThn8_N11QHBoxLayoutD0Ev @ 11293 NONAME
- _ZThn8_N11QHBoxLayoutD1Ev @ 11294 NONAME
- _ZThn8_N11QHeaderViewD0Ev @ 11295 NONAME
- _ZThn8_N11QHeaderViewD1Ev @ 11296 NONAME
- _ZThn8_N11QListWidgetD0Ev @ 11297 NONAME
- _ZThn8_N11QListWidgetD1Ev @ 11298 NONAME
- _ZThn8_N11QMainWindowD0Ev @ 11299 NONAME
- _ZThn8_N11QMainWindowD1Ev @ 11300 NONAME
- _ZThn8_N11QMessageBoxD0Ev @ 11301 NONAME
- _ZThn8_N11QMessageBoxD1Ev @ 11302 NONAME
- _ZThn8_N11QPushButtonD0Ev @ 11303 NONAME
- _ZThn8_N11QPushButtonD1Ev @ 11304 NONAME
- _ZThn8_N11QRubberBandD0Ev @ 11305 NONAME
- _ZThn8_N11QRubberBandD1Ev @ 11306 NONAME
- _ZThn8_N11QScrollAreaD0Ev @ 11307 NONAME
- _ZThn8_N11QScrollAreaD1Ev @ 11308 NONAME
- _ZThn8_N11QToolButtonD0Ev @ 11309 NONAME
- _ZThn8_N11QToolButtonD1Ev @ 11310 NONAME
- _ZThn8_N11QTreeWidgetD0Ev @ 11311 NONAME
- _ZThn8_N11QTreeWidgetD1Ev @ 11312 NONAME
- _ZThn8_N11QVBoxLayoutD0Ev @ 11313 NONAME
- _ZThn8_N11QVBoxLayoutD1Ev @ 11314 NONAME
- _ZThn8_N12QColorDialogD0Ev @ 11315 NONAME
- _ZThn8_N12QColorDialogD1Ev @ 11316 NONAME
- _ZThn8_N12QInputDialogD0Ev @ 11317 NONAME
- _ZThn8_N12QInputDialogD1Ev @ 11318 NONAME
- _ZThn8_N12QStylePluginD0Ev @ 11319 NONAME
- _ZThn8_N12QStylePluginD1Ev @ 11320 NONAME
- _ZThn8_N12QTableWidgetD0Ev @ 11321 NONAME
- _ZThn8_N12QTableWidgetD1Ev @ 11322 NONAME
- _ZThn8_N12QTextBrowserD0Ev @ 11323 NONAME
- _ZThn8_N12QTextBrowserD1Ev @ 11324 NONAME
- _ZThn8_N13QErrorMessageD0Ev @ 11325 NONAME
- _ZThn8_N13QErrorMessageD1Ev @ 11326 NONAME
- _ZThn8_N13QFontComboBoxD0Ev @ 11327 NONAME
- _ZThn8_N13QFontComboBoxD1Ev @ 11328 NONAME
- _ZThn8_N13QGraphicsViewD0Ev @ 11329 NONAME
- _ZThn8_N13QGraphicsViewD1Ev @ 11330 NONAME
- _ZThn8_N13QMdiSubWindowD0Ev @ 11331 NONAME
- _ZThn8_N13QMdiSubWindowD1Ev @ 11332 NONAME
- _ZThn8_N13QSplashScreenD0Ev @ 11333 NONAME
- _ZThn8_N13QSplashScreenD1Ev @ 11334 NONAME
- _ZThn8_N14QDesktopWidgetD0Ev @ 11335 NONAME
- _ZThn8_N14QDesktopWidgetD1Ev @ 11336 NONAME
- _ZThn8_N14QImageIOPluginD0Ev @ 11337 NONAME
- _ZThn8_N14QImageIOPluginD1Ev @ 11338 NONAME
- _ZThn8_N14QPlainTextEditD0Ev @ 11339 NONAME
- _ZThn8_N14QPlainTextEditD1Ev @ 11340 NONAME
- _ZThn8_N14QStackedLayout11setGeometryERK5QRect @ 11341 NONAME
- _ZThn8_N14QStackedLayoutD0Ev @ 11342 NONAME
- _ZThn8_N14QStackedLayoutD1Ev @ 11343 NONAME
- _ZThn8_N14QStackedWidgetD0Ev @ 11344 NONAME
- _ZThn8_N14QStackedWidgetD1Ev @ 11345 NONAME
- _ZThn8_N14QToolBarLayout10invalidateEv @ 11346 NONAME ABSENT
- _ZThn8_N14QToolBarLayout11setGeometryERK5QRect @ 11347 NONAME ABSENT
- _ZThn8_N14QToolBarLayoutD0Ev @ 11348 NONAME ABSENT
- _ZThn8_N14QToolBarLayoutD1Ev @ 11349 NONAME ABSENT
- _ZThn8_N15QAbstractButtonD0Ev @ 11350 NONAME
- _ZThn8_N15QAbstractButtonD1Ev @ 11351 NONAME
- _ZThn8_N15QAbstractSliderD0Ev @ 11352 NONAME
- _ZThn8_N15QAbstractSliderD1Ev @ 11353 NONAME
- _ZThn8_N15QCalendarWidgetD0Ev @ 11354 NONAME
- _ZThn8_N15QCalendarWidgetD1Ev @ 11355 NONAME
- _ZThn8_N15QColumnViewGripD0Ev @ 11356 NONAME
- _ZThn8_N15QColumnViewGripD1Ev @ 11357 NONAME
- _ZThn8_N15QGraphicsWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 11358 NONAME
- _ZThn8_N15QGraphicsWidget10sceneEventEP6QEvent @ 11359 NONAME
- _ZThn8_N15QGraphicsWidget12focusInEventEP11QFocusEvent @ 11360 NONAME
- _ZThn8_N15QGraphicsWidget13focusOutEventEP11QFocusEvent @ 11361 NONAME
- _ZThn8_N15QGraphicsWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11362 NONAME
- _ZThn8_N15QGraphicsWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11363 NONAME
- _ZThn8_N15QGraphicsWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11364 NONAME
- _ZThn8_N15QGraphicsWidgetD0Ev @ 11365 NONAME
- _ZThn8_N15QGraphicsWidgetD1Ev @ 11366 NONAME
- _ZThn8_N15QProgressDialogD0Ev @ 11367 NONAME
- _ZThn8_N15QProgressDialogD1Ev @ 11368 NONAME
- _ZThn8_N16QAbstractSpinBoxD0Ev @ 11369 NONAME
- _ZThn8_N16QAbstractSpinBoxD1Ev @ 11370 NONAME
- _ZThn8_N16QDialogButtonBoxD0Ev @ 11371 NONAME
- _ZThn8_N16QDialogButtonBoxD1Ev @ 11372 NONAME
- _ZThn8_N17QAbstractItemViewD0Ev @ 11373 NONAME
- _ZThn8_N17QAbstractItemViewD1Ev @ 11374 NONAME
- _ZThn8_N17QDockWidgetLayout11setGeometryERK5QRect @ 11375 NONAME
- _ZThn8_N17QDockWidgetLayoutD0Ev @ 11376 NONAME
- _ZThn8_N17QDockWidgetLayoutD1Ev @ 11377 NONAME
- _ZThn8_N17QGraphicsTextItem10sceneEventEP6QEvent @ 11378 NONAME
- _ZThn8_N17QGraphicsTextItem12focusInEventEP11QFocusEvent @ 11379 NONAME
- _ZThn8_N17QGraphicsTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 11380 NONAME
- _ZThn8_N17QGraphicsTextItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 11381 NONAME
- _ZThn8_N17QGraphicsTextItem13focusOutEventEP11QFocusEvent @ 11382 NONAME
- _ZThn8_N17QGraphicsTextItem13keyPressEventEP9QKeyEvent @ 11383 NONAME
- _ZThn8_N17QGraphicsTextItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 11384 NONAME
- _ZThn8_N17QGraphicsTextItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 11385 NONAME
- _ZThn8_N17QGraphicsTextItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11386 NONAME
- _ZThn8_N17QGraphicsTextItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 11387 NONAME
- _ZThn8_N17QGraphicsTextItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 11388 NONAME
- _ZThn8_N17QGraphicsTextItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11389 NONAME
- _ZThn8_N17QGraphicsTextItem15keyReleaseEventEP9QKeyEvent @ 11390 NONAME
- _ZThn8_N17QGraphicsTextItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 11391 NONAME
- _ZThn8_N17QGraphicsTextItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 11392 NONAME
- _ZThn8_N17QGraphicsTextItem16inputMethodEventEP17QInputMethodEvent @ 11393 NONAME
- _ZThn8_N17QGraphicsTextItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 11394 NONAME
- _ZThn8_N17QGraphicsTextItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 11395 NONAME
- _ZThn8_N17QGraphicsTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11396 NONAME
- _ZThn8_N17QGraphicsTextItem9dropEventEP27QGraphicsSceneDragDropEvent @ 11397 NONAME
- _ZThn8_N17QGraphicsTextItemD0Ev @ 11398 NONAME
- _ZThn8_N17QGraphicsTextItemD1Ev @ 11399 NONAME
- _ZThn8_N17QIconEnginePluginD0Ev @ 11400 NONAME
- _ZThn8_N17QIconEnginePluginD1Ev @ 11401 NONAME
- _ZThn8_N17QMainWindowLayout10invalidateEv @ 11402 NONAME
- _ZThn8_N17QMainWindowLayout11setGeometryERK5QRect @ 11403 NONAME
- _ZThn8_N17QMainWindowLayoutD0Ev @ 11404 NONAME
- _ZThn8_N17QMainWindowLayoutD1Ev @ 11405 NONAME
- _ZThn8_N17QTextImageHandler10drawObjectEP8QPainterRK6QRectFP13QTextDocumentiRK11QTextFormat @ 11406 NONAME ABSENT
- _ZThn8_N17QTextImageHandler13intrinsicSizeEP13QTextDocumentiRK11QTextFormat @ 11407 NONAME ABSENT
- _ZThn8_N19QAbstractScrollAreaD0Ev @ 11408 NONAME
- _ZThn8_N19QAbstractScrollAreaD1Ev @ 11409 NONAME
- _ZThn8_N19QCoeFepInputContext10Extension1ERi @ 11410 NONAME
- _ZThn8_N19QCoeFepInputContext19CancelFepInlineEditEv @ 11411 NONAME
- _ZThn8_N19QCoeFepInputContext19StartFepInlineEditLERK7TDesC16iiPK15MFormCustomDrawR29MFepInlineTextFormatRetrieverR39MFepPointerEventHandlerDuringInlineEdit @ 11412 NONAME
- _ZThn8_N19QCoeFepInputContext20UpdateFepInlineTextLERK7TDesC16i @ 11413 NONAME
- _ZThn8_N19QCoeFepInputContext22DoCommitFepInlineEditLEv @ 11414 NONAME
- _ZThn8_N19QCoeFepInputContext25SetCursorSelectionForFepLERK16TCursorSelection @ 11415 NONAME
- _ZThn8_N19QCoeFepInputContext33SetInlineEditingCursorVisibilityLEi @ 11416 NONAME
- _ZThn8_N19QIconEnginePluginV2D0Ev @ 11417 NONAME
- _ZThn8_N19QIconEnginePluginV2D1Ev @ 11418 NONAME
- _ZThn8_N19QInputContextPluginD0Ev @ 11419 NONAME
- _ZThn8_N19QInputContextPluginD1Ev @ 11420 NONAME
- _ZThn8_N20QGraphicsProxyWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 11421 NONAME
- _ZThn8_N20QGraphicsProxyWidget10wheelEventEP24QGraphicsSceneWheelEvent @ 11422 NONAME
- _ZThn8_N20QGraphicsProxyWidget12focusInEventEP11QFocusEvent @ 11423 NONAME
- _ZThn8_N20QGraphicsProxyWidget13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 11424 NONAME
- _ZThn8_N20QGraphicsProxyWidget13focusOutEventEP11QFocusEvent @ 11425 NONAME
- _ZThn8_N20QGraphicsProxyWidget13keyPressEventEP9QKeyEvent @ 11426 NONAME
- _ZThn8_N20QGraphicsProxyWidget14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 11427 NONAME
- _ZThn8_N20QGraphicsProxyWidget14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 11428 NONAME
- _ZThn8_N20QGraphicsProxyWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11429 NONAME
- _ZThn8_N20QGraphicsProxyWidget14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 11430 NONAME
- _ZThn8_N20QGraphicsProxyWidget15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 11431 NONAME
- _ZThn8_N20QGraphicsProxyWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11432 NONAME
- _ZThn8_N20QGraphicsProxyWidget15keyReleaseEventEP9QKeyEvent @ 11433 NONAME
- _ZThn8_N20QGraphicsProxyWidget15mousePressEventEP24QGraphicsSceneMouseEvent @ 11434 NONAME
- _ZThn8_N20QGraphicsProxyWidget16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 11435 NONAME
- _ZThn8_N20QGraphicsProxyWidget17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 11436 NONAME
- _ZThn8_N20QGraphicsProxyWidget21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 11437 NONAME
- _ZThn8_N20QGraphicsProxyWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11438 NONAME
- _ZThn8_N20QGraphicsProxyWidget9dropEventEP27QGraphicsSceneDragDropEvent @ 11439 NONAME
- _ZThn8_N20QGraphicsProxyWidgetD0Ev @ 11440 NONAME
- _ZThn8_N20QGraphicsProxyWidgetD1Ev @ 11441 NONAME
- _ZThn8_N20QPictureFormatPlugin11loadPictureERK7QStringS2_P8QPicture @ 11442 NONAME
- _ZThn8_N20QPictureFormatPlugin11savePictureERK7QStringS2_RK8QPicture @ 11443 NONAME
- _ZThn8_N20QPictureFormatPluginD0Ev @ 11444 NONAME
- _ZThn8_N20QPictureFormatPluginD1Ev @ 11445 NONAME
- _ZThn8_N21QGraphicsSystemPluginD0Ev @ 11446 NONAME
- _ZThn8_N21QGraphicsSystemPluginD1Ev @ 11447 NONAME
- _ZThn8_N5QDialD0Ev @ 11448 NONAME
- _ZThn8_N5QDialD1Ev @ 11449 NONAME
- _ZThn8_N5QMenuD0Ev @ 11450 NONAME
- _ZThn8_N5QMenuD1Ev @ 11451 NONAME
- _ZThn8_N6QFrameD0Ev @ 11452 NONAME
- _ZThn8_N6QFrameD1Ev @ 11453 NONAME
- _ZThn8_N6QLabelD0Ev @ 11454 NONAME
- _ZThn8_N6QLabelD1Ev @ 11455 NONAME
- _ZThn8_N7QDialogD0Ev @ 11456 NONAME
- _ZThn8_N7QDialogD1Ev @ 11457 NONAME
- _ZThn8_N7QLayout10invalidateEv @ 11458 NONAME
- _ZThn8_N7QLayout11setGeometryERK5QRect @ 11459 NONAME
- _ZThn8_N7QLayout6layoutEv @ 11460 NONAME
- _ZThn8_N7QLayoutD0Ev @ 11461 NONAME
- _ZThn8_N7QLayoutD1Ev @ 11462 NONAME
- _ZThn8_N7QSliderD0Ev @ 11463 NONAME
- _ZThn8_N7QSliderD1Ev @ 11464 NONAME
- _ZThn8_N7QTabBarD0Ev @ 11465 NONAME
- _ZThn8_N7QTabBarD1Ev @ 11466 NONAME
- _ZThn8_N7QWidgetD0Ev @ 11467 NONAME
- _ZThn8_N7QWidgetD1Ev @ 11468 NONAME
- _ZThn8_N7QWizardD0Ev @ 11469 NONAME
- _ZThn8_N7QWizardD1Ev @ 11470 NONAME
- _ZThn8_N8QMdiAreaD0Ev @ 11471 NONAME
- _ZThn8_N8QMdiAreaD1Ev @ 11472 NONAME
- _ZThn8_N8QMenuBarD0Ev @ 11473 NONAME
- _ZThn8_N8QMenuBarD1Ev @ 11474 NONAME
- _ZThn8_N8QSidebarD0Ev @ 11475 NONAME
- _ZThn8_N8QSidebarD1Ev @ 11476 NONAME
- _ZThn8_N8QToolBarD0Ev @ 11477 NONAME
- _ZThn8_N8QToolBarD1Ev @ 11478 NONAME
- _ZThn8_N8QToolBoxD0Ev @ 11479 NONAME
- _ZThn8_N8QToolBoxD1Ev @ 11480 NONAME
- _ZThn8_N9QComboBoxD0Ev @ 11481 NONAME
- _ZThn8_N9QComboBoxD1Ev @ 11482 NONAME
- _ZThn8_N9QGroupBoxD0Ev @ 11483 NONAME
- _ZThn8_N9QGroupBoxD1Ev @ 11484 NONAME
- _ZThn8_N9QLineEditD0Ev @ 11485 NONAME
- _ZThn8_N9QLineEditD1Ev @ 11486 NONAME
- _ZThn8_N9QListViewD0Ev @ 11487 NONAME
- _ZThn8_N9QListViewD1Ev @ 11488 NONAME
- _ZThn8_N9QSizeGripD0Ev @ 11489 NONAME
- _ZThn8_N9QSizeGripD1Ev @ 11490 NONAME
- _ZThn8_N9QSplitterD0Ev @ 11491 NONAME
- _ZThn8_N9QSplitterD1Ev @ 11492 NONAME
- _ZThn8_N9QTextEditD0Ev @ 11493 NONAME
- _ZThn8_N9QTextEditD1Ev @ 11494 NONAME
- _ZThn8_N9QTreeViewD0Ev @ 11495 NONAME
- _ZThn8_N9QTreeViewD1Ev @ 11496 NONAME
- _ZThn8_N9QUndoViewD0Ev @ 11497 NONAME
- _ZThn8_N9QUndoViewD1Ev @ 11498 NONAME
- _ZThn8_NK10QBoxLayout11maximumSizeEv @ 11499 NONAME
- _ZThn8_NK10QBoxLayout11minimumSizeEv @ 11500 NONAME
- _ZThn8_NK10QBoxLayout14heightForWidthEi @ 11501 NONAME
- _ZThn8_NK10QBoxLayout17hasHeightForWidthEv @ 11502 NONAME
- _ZThn8_NK10QBoxLayout19expandingDirectionsEv @ 11503 NONAME
- _ZThn8_NK10QBoxLayout21minimumHeightForWidthEi @ 11504 NONAME
- _ZThn8_NK10QBoxLayout8sizeHintEv @ 11505 NONAME
- _ZThn8_NK11QFormLayout11minimumSizeEv @ 11506 NONAME
- _ZThn8_NK11QFormLayout14heightForWidthEi @ 11507 NONAME
- _ZThn8_NK11QFormLayout17hasHeightForWidthEv @ 11508 NONAME
- _ZThn8_NK11QFormLayout19expandingDirectionsEv @ 11509 NONAME
- _ZThn8_NK11QFormLayout8sizeHintEv @ 11510 NONAME
- _ZThn8_NK11QGridLayout11maximumSizeEv @ 11511 NONAME
- _ZThn8_NK11QGridLayout11minimumSizeEv @ 11512 NONAME
- _ZThn8_NK11QGridLayout14heightForWidthEi @ 11513 NONAME
- _ZThn8_NK11QGridLayout17hasHeightForWidthEv @ 11514 NONAME
- _ZThn8_NK11QGridLayout19expandingDirectionsEv @ 11515 NONAME
- _ZThn8_NK11QGridLayout21minimumHeightForWidthEi @ 11516 NONAME
- _ZThn8_NK11QGridLayout8sizeHintEv @ 11517 NONAME
- _ZThn8_NK14QStackedLayout11minimumSizeEv @ 11518 NONAME
- _ZThn8_NK14QStackedLayout8sizeHintEv @ 11519 NONAME
- _ZThn8_NK14QToolBarLayout11minimumSizeEv @ 11520 NONAME ABSENT
- _ZThn8_NK14QToolBarLayout19expandingDirectionsEv @ 11521 NONAME ABSENT
- _ZThn8_NK14QToolBarLayout7isEmptyEv @ 11522 NONAME ABSENT
- _ZThn8_NK14QToolBarLayout8sizeHintEv @ 11523 NONAME ABSENT
- _ZThn8_NK15QGraphicsWidget12boundingRectEv @ 11524 NONAME
- _ZThn8_NK15QGraphicsWidget4typeEv @ 11525 NONAME
- _ZThn8_NK15QGraphicsWidget5shapeEv @ 11526 NONAME
- _ZThn8_NK17QDockWidgetLayout11maximumSizeEv @ 11527 NONAME
- _ZThn8_NK17QDockWidgetLayout11minimumSizeEv @ 11528 NONAME
- _ZThn8_NK17QDockWidgetLayout8sizeHintEv @ 11529 NONAME
- _ZThn8_NK17QGraphicsTextItem10opaqueAreaEv @ 11530 NONAME
- _ZThn8_NK17QGraphicsTextItem12boundingRectEv @ 11531 NONAME
- _ZThn8_NK17QGraphicsTextItem12isObscuredByEPK13QGraphicsItem @ 11532 NONAME
- _ZThn8_NK17QGraphicsTextItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 11533 NONAME
- _ZThn8_NK17QGraphicsTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 11534 NONAME
- _ZThn8_NK17QGraphicsTextItem4typeEv @ 11535 NONAME
- _ZThn8_NK17QGraphicsTextItem5shapeEv @ 11536 NONAME
- _ZThn8_NK17QGraphicsTextItem8containsERK7QPointF @ 11537 NONAME
- _ZThn8_NK17QGraphicsTextItem9extensionERK8QVariant @ 11538 NONAME
- _ZThn8_NK17QMainWindowLayout11minimumSizeEv @ 11539 NONAME
- _ZThn8_NK17QMainWindowLayout8sizeHintEv @ 11540 NONAME
- _ZThn8_NK19QCoeFepInputContext15GetFormatForFepER11TCharFormati @ 11541 NONAME
- _ZThn8_NK19QCoeFepInputContext20DocumentLengthForFepEv @ 11542 NONAME
- _ZThn8_NK19QCoeFepInputContext22GetEditorContentForFepER6TDes16ii @ 11543 NONAME
- _ZThn8_NK19QCoeFepInputContext24GetCursorSelectionForFepER16TCursorSelection @ 11544 NONAME
- _ZThn8_NK19QCoeFepInputContext27DocumentMaximumLengthForFepEv @ 11545 NONAME
- _ZThn8_NK19QCoeFepInputContext27GetScreenCoordinatesForFepLER6TPointRiS2_i @ 11546 NONAME
- _ZThn8_NK20QGraphicsProxyWidget4typeEv @ 11547 NONAME
- _ZThn8_NK7QLayout11maximumSizeEv @ 11548 NONAME
- _ZThn8_NK7QLayout11minimumSizeEv @ 11549 NONAME
- _ZThn8_NK7QLayout19expandingDirectionsEv @ 11550 NONAME
- _ZThn8_NK7QLayout7isEmptyEv @ 11551 NONAME
- _ZThn8_NK7QLayout8geometryEv @ 11552 NONAME
- _ZThn8_NK7QWidget11paintEngineEv @ 11553 NONAME
- _ZThn8_NK7QWidget6metricEN12QPaintDevice17PaintDeviceMetricE @ 11554 NONAME
- _ZThn8_NK7QWidget7devTypeEv @ 11555 NONAME
- _Zls6QDebug6QFlagsIN13QGraphicsItem16GraphicsItemFlagEE @ 11556 NONAME
- _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE @ 11557 NONAME
- _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE @ 11558 NONAME
- _Zls6QDebugP13QGraphicsItem @ 11559 NONAME
- _Zls6QDebugPK6QEvent @ 11560 NONAME
- _Zls6QDebugRK10QTransform @ 11561 NONAME
- _Zls6QDebugRK12QKeySequence @ 11562 NONAME
- _Zls6QDebugRK12QPainterPath @ 11563 NONAME
- _Zls6QDebugRK19QItemSelectionRange @ 11564 NONAME
- _Zls6QDebugRK4QPen @ 11565 NONAME
- _Zls6QDebugRK5QFont @ 11566 NONAME
- _Zls6QDebugRK6QBrush @ 11567 NONAME
- _Zls6QDebugRK6QColor @ 11568 NONAME
- _Zls6QDebugRK7QMatrix @ 11569 NONAME
- _Zls6QDebugRK7QRegion @ 11570 NONAME
- _Zls6QDebugRK8QPolygon @ 11571 NONAME
- _Zls6QDebugRK9QPolygonF @ 11572 NONAME
- _ZlsR11QDataStreamRK10QTransform @ 11573 NONAME
- _ZlsR11QDataStreamRK11QSizePolicy @ 11574 NONAME
- _ZlsR11QDataStreamRK11QTextFormat @ 11575 NONAME
- _ZlsR11QDataStreamRK11QTextLength @ 11576 NONAME
- _ZlsR11QDataStreamRK12QKeySequence @ 11577 NONAME
- _ZlsR11QDataStreamRK12QPainterPath @ 11578 NONAME
- _ZlsR11QDataStreamRK13QStandardItem @ 11579 NONAME
- _ZlsR11QDataStreamRK15QListWidgetItem @ 11580 NONAME
- _ZlsR11QDataStreamRK15QTreeWidgetItem @ 11581 NONAME
- _ZlsR11QDataStreamRK16QTableWidgetItem @ 11582 NONAME
- _ZlsR11QDataStreamRK4QPen @ 11583 NONAME
- _ZlsR11QDataStreamRK5QFont @ 11584 NONAME
- _ZlsR11QDataStreamRK5QIcon @ 11585 NONAME
- _ZlsR11QDataStreamRK6QBrush @ 11586 NONAME
- _ZlsR11QDataStreamRK6QColor @ 11587 NONAME
- _ZlsR11QDataStreamRK6QImage @ 11588 NONAME
- _ZlsR11QDataStreamRK7QMatrix @ 11589 NONAME
- _ZlsR11QDataStreamRK7QPixmap @ 11590 NONAME
- _ZlsR11QDataStreamRK7QRegion @ 11591 NONAME
- _ZlsR11QDataStreamRK8QPalette @ 11592 NONAME
- _ZlsR11QDataStreamRK8QPicture @ 11593 NONAME
- _ZlsR11QDataStreamRK8QPolygon @ 11594 NONAME
- _ZlsR11QDataStreamRK9QPolygonF @ 11595 NONAME
- _ZlsR11QTextStreamRK9QSplitter @ 11596 NONAME
- _ZlsR6QDebugRK11QVectorPath @ 11597 NONAME
- _ZmlRK12QPainterPathRK7QMatrix @ 11598 NONAME
- _ZrsR11QDataStreamR10QTransform @ 11599 NONAME
- _ZrsR11QDataStreamR11QSizePolicy @ 11600 NONAME
- _ZrsR11QDataStreamR11QTextFormat @ 11601 NONAME
- _ZrsR11QDataStreamR11QTextLength @ 11602 NONAME
- _ZrsR11QDataStreamR12QKeySequence @ 11603 NONAME
- _ZrsR11QDataStreamR12QPainterPath @ 11604 NONAME
- _ZrsR11QDataStreamR13QStandardItem @ 11605 NONAME
- _ZrsR11QDataStreamR15QListWidgetItem @ 11606 NONAME
- _ZrsR11QDataStreamR15QTreeWidgetItem @ 11607 NONAME
- _ZrsR11QDataStreamR16QTableWidgetItem @ 11608 NONAME
- _ZrsR11QDataStreamR4QPen @ 11609 NONAME
- _ZrsR11QDataStreamR5QFont @ 11610 NONAME
- _ZrsR11QDataStreamR5QIcon @ 11611 NONAME
- _ZrsR11QDataStreamR6QBrush @ 11612 NONAME
- _ZrsR11QDataStreamR6QColor @ 11613 NONAME
- _ZrsR11QDataStreamR6QImage @ 11614 NONAME
- _ZrsR11QDataStreamR7QMatrix @ 11615 NONAME
- _ZrsR11QDataStreamR7QPixmap @ 11616 NONAME
- _ZrsR11QDataStreamR7QRegion @ 11617 NONAME
- _ZrsR11QDataStreamR8QPalette @ 11618 NONAME
- _ZrsR11QDataStreamR8QPicture @ 11619 NONAME
- _ZrsR11QDataStreamR8QPolygon @ 11620 NONAME
- _ZrsR11QDataStreamR9QPolygonF @ 11621 NONAME
- _ZrsR11QTextStreamR9QSplitter @ 11622 NONAME
- qt_enable_test_font @ 11623 NONAME DATA 1 ABSENT
- qt_filedialog_existing_directory_hook @ 11624 NONAME DATA 4
- qt_filedialog_open_filename_hook @ 11625 NONAME DATA 4
- qt_filedialog_open_filenames_hook @ 11626 NONAME DATA 4
- qt_filedialog_save_filename_hook @ 11627 NONAME DATA 4
- qt_image_cleanup_hook @ 11628 NONAME DATA 4
- qt_image_cleanup_hook_64 @ 11629 NONAME DATA 4
- qt_pixmap_cleanup_hook @ 11630 NONAME DATA 4
- qt_pixmap_cleanup_hook_64 @ 11631 NONAME DATA 4
- qt_tab_all_widgets @ 11632 NONAME DATA 1
- _Z17qDrawBorderPixmapP8QPainterRK5QRectRK8QMarginsRK7QPixmapS3_S6_RK10QTileRules @ 11633 NONAME ABSENT
- _Z17qHasPixmapTextureRK6QBrush @ 11634 NONAME
- _Z22qt_setQtEnableTestFontb @ 11635 NONAME
- _Z25qt_translateRawTouchEventP7QWidgetN11QTouchEvent10DeviceTypeERK5QListINS1_10TouchPointEE @ 11636 NONAME
- _ZN10QCompleter18setMaxVisibleItemsEi @ 11637 NONAME
- _ZN10QMatrix4x411perspectiveEffff @ 11638 NONAME
- _ZN10QMatrix4x415flipCoordinatesEv @ 11639 NONAME
- _ZN10QMatrix4x416inferSpecialTypeEv @ 11640 NONAME
- _ZN10QMatrix4x45orthoERK5QRect @ 11641 NONAME
- _ZN10QMatrix4x45orthoERK6QRectF @ 11642 NONAME
- _ZN10QMatrix4x45orthoEffffff @ 11643 NONAME
- _ZN10QMatrix4x45scaleERK9QVector3D @ 11644 NONAME
- _ZN10QMatrix4x45scaleEf @ 11645 NONAME
- _ZN10QMatrix4x45scaleEff @ 11646 NONAME
- _ZN10QMatrix4x45scaleEfff @ 11647 NONAME
- _ZN10QMatrix4x46lookAtERK9QVector3DS2_S2_ @ 11648 NONAME
- _ZN10QMatrix4x46rotateERK11QQuaternion @ 11649 NONAME
- _ZN10QMatrix4x46rotateEfRK9QVector3D @ 11650 NONAME
- _ZN10QMatrix4x46rotateEffff @ 11651 NONAME
- _ZN10QMatrix4x47frustumEffffff @ 11652 NONAME
- _ZN10QMatrix4x49translateERK9QVector3D @ 11653 NONAME
- _ZN10QMatrix4x49translateEff @ 11654 NONAME
- _ZN10QMatrix4x49translateEfff @ 11655 NONAME
- _ZN10QMatrix4x4C1EPKf @ 11656 NONAME
- _ZN10QMatrix4x4C1EPKfii @ 11657 NONAME
- _ZN10QMatrix4x4C1ERK10QTransform @ 11658 NONAME
- _ZN10QMatrix4x4C1ERK7QMatrix @ 11659 NONAME
- _ZN10QMatrix4x4C2EPKf @ 11660 NONAME
- _ZN10QMatrix4x4C2EPKfii @ 11661 NONAME
- _ZN10QMatrix4x4C2ERK10QTransform @ 11662 NONAME
- _ZN10QMatrix4x4C2ERK7QMatrix @ 11663 NONAME
- _ZN10QMatrix4x4dVEf @ 11664 NONAME
- _ZN11QColumnView12rowsInsertedERK11QModelIndexii @ 11665 NONAME
- _ZN11QPanGesture11eventFilterEP7QObjectP6QEvent @ 11666 NONAME
- _ZN11QPanGesture11filterEventEP6QEvent @ 11667 NONAME
- _ZN11QPanGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 11668 NONAME
- _ZN11QPanGesture11qt_metacastEPKc @ 11669 NONAME
- _ZN11QPanGesture16staticMetaObjectE @ 11670 NONAME DATA 16
- _ZN11QPanGesture5eventEP6QEvent @ 11671 NONAME
- _ZN11QPanGesture5resetEv @ 11672 NONAME
- _ZN11QPanGestureC1EP7QWidget @ 11673 NONAME ABSENT
- _ZN11QPanGestureC2EP7QWidget @ 11674 NONAME ABSENT
- _ZN11QPixmapData6scrollEiiRK5QRect @ 11675 NONAME
- _ZN11QProxyStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 11676 NONAME
- _ZN11QProxyStyle11qt_metacastEPKc @ 11677 NONAME
- _ZN11QProxyStyle12setBaseStyleEP6QStyle @ 11678 NONAME
- _ZN11QProxyStyle16staticMetaObjectE @ 11679 NONAME DATA 16
- _ZN11QProxyStyle5eventEP6QEvent @ 11680 NONAME
- _ZN11QProxyStyle6polishEP12QApplication @ 11681 NONAME
- _ZN11QProxyStyle6polishEP7QWidget @ 11682 NONAME
- _ZN11QProxyStyle6polishER8QPalette @ 11683 NONAME
- _ZN11QProxyStyle8unpolishEP12QApplication @ 11684 NONAME
- _ZN11QProxyStyle8unpolishEP7QWidget @ 11685 NONAME
- _ZN11QProxyStyleC1EP6QStyle @ 11686 NONAME
- _ZN11QProxyStyleC2EP6QStyle @ 11687 NONAME
- _ZN11QProxyStyleD0Ev @ 11688 NONAME
- _ZN11QProxyStyleD1Ev @ 11689 NONAME
- _ZN11QProxyStyleD2Ev @ 11690 NONAME
- _ZN11QQuaternion16fromAxisAndAngleERK9QVector3Df @ 11691 NONAME
- _ZN11QQuaternion16fromAxisAndAngleEffff @ 11692 NONAME
- _ZN11QQuaternion5nlerpERKS_S1_f @ 11693 NONAME
- _ZN11QQuaternion5slerpERKS_S1_f @ 11694 NONAME
- _ZN11QQuaternion9normalizeEv @ 11695 NONAME
- _ZN11QTouchEvent10TouchPoint10setLastPosERK7QPointF @ 11696 NONAME
- _ZN11QTouchEvent10TouchPoint11setPressureEf @ 11697 NONAME
- _ZN11QTouchEvent10TouchPoint11setScenePosERK7QPointF @ 11698 NONAME
- _ZN11QTouchEvent10TouchPoint11setStartPosERK7QPointF @ 11699 NONAME
- _ZN11QTouchEvent10TouchPoint12setSceneRectERK6QRectF @ 11700 NONAME
- _ZN11QTouchEvent10TouchPoint12setScreenPosERK7QPointF @ 11701 NONAME
- _ZN11QTouchEvent10TouchPoint13setScreenRectERK6QRectF @ 11702 NONAME
- _ZN11QTouchEvent10TouchPoint15setLastScenePosERK7QPointF @ 11703 NONAME
- _ZN11QTouchEvent10TouchPoint16setLastScreenPosERK7QPointF @ 11704 NONAME
- _ZN11QTouchEvent10TouchPoint16setNormalizedPosERK7QPointF @ 11705 NONAME
- _ZN11QTouchEvent10TouchPoint16setStartScenePosERK7QPointF @ 11706 NONAME
- _ZN11QTouchEvent10TouchPoint17setStartScreenPosERK7QPointF @ 11707 NONAME
- _ZN11QTouchEvent10TouchPoint20setLastNormalizedPosERK7QPointF @ 11708 NONAME
- _ZN11QTouchEvent10TouchPoint21setStartNormalizedPosERK7QPointF @ 11709 NONAME
- _ZN11QTouchEvent10TouchPoint5setIdEi @ 11710 NONAME
- _ZN11QTouchEvent10TouchPoint6setPosERK7QPointF @ 11711 NONAME
- _ZN11QTouchEvent10TouchPoint7setRectERK6QRectF @ 11712 NONAME
- _ZN11QTouchEvent10TouchPoint8setStateE6QFlagsIN2Qt15TouchPointStateEE @ 11713 NONAME
- _ZN11QTouchEvent10TouchPointC1ERKS0_ @ 11714 NONAME
- _ZN11QTouchEvent10TouchPointC1Ei @ 11715 NONAME
- _ZN11QTouchEvent10TouchPointC2ERKS0_ @ 11716 NONAME
- _ZN11QTouchEvent10TouchPointC2Ei @ 11717 NONAME
- _ZN11QTouchEvent10TouchPointD1Ev @ 11718 NONAME
- _ZN11QTouchEvent10TouchPointD2Ev @ 11719 NONAME
- _ZN11QTouchEvent10TouchPointaSERKS0_ @ 11720 NONAME
- _ZN11QTouchEventC1EN6QEvent4TypeENS_10DeviceTypeE6QFlagsIN2Qt16KeyboardModifierEES3_INS4_15TouchPointStateEERK5QListINS_10TouchPointEE @ 11721 NONAME
- _ZN11QTouchEventC2EN6QEvent4TypeENS_10DeviceTypeE6QFlagsIN2Qt16KeyboardModifierEES3_INS4_15TouchPointStateEERK5QListINS_10TouchPointEE @ 11722 NONAME
- _ZN11QTouchEventD0Ev @ 11723 NONAME
- _ZN11QTouchEventD1Ev @ 11724 NONAME
- _ZN11QTouchEventD2Ev @ 11725 NONAME
- _ZN12QLineControl10addCommandERKNS_7CommandE @ 11726 NONAME
- _ZN12QLineControl10moveCursorEib @ 11727 NONAME
- _ZN12QLineControl10textEditedERK7QString @ 11728 NONAME
- _ZN12QLineControl10timerEventEP11QTimerEvent @ 11729 NONAME
- _ZN12QLineControl11qt_metacallEN11QMetaObject4CallEiPPv @ 11730 NONAME
- _ZN12QLineControl11qt_metacastEPKc @ 11731 NONAME
- _ZN12QLineControl11textChangedERK7QString @ 11732 NONAME
- _ZN12QLineControl12finishChangeEibb @ 11733 NONAME
- _ZN12QLineControl12internalRedoEv @ 11734 NONAME
- _ZN12QLineControl12internalUndoEi @ 11735 NONAME
- _ZN12QLineControl12processEventEP6QEvent @ 11736 NONAME
- _ZN12QLineControl12setSelectionEii @ 11737 NONAME
- _ZN12QLineControl12updateNeededERK5QRect @ 11738 NONAME
- _ZN12QLineControl14internalDeleteEb @ 11739 NONAME
- _ZN12QLineControl14internalInsertERK7QString @ 11740 NONAME
- _ZN12QLineControl14parseInputMaskERK7QString @ 11741 NONAME
- _ZN12QLineControl15editFocusChangeEb @ 11742 NONAME
- _ZN12QLineControl15editingFinishedEv @ 11743 NONAME
- _ZN12QLineControl15internalSetTextERK7QStringib @ 11744 NONAME
- _ZN12QLineControl15processKeyEventEP9QKeyEvent @ 11745 NONAME
- _ZN12QLineControl15selectWordAtPosEi @ 11746 NONAME
- _ZN12QLineControl16selectionChangedEv @ 11747 NONAME
- _ZN12QLineControl16staticMetaObjectE @ 11748 NONAME DATA 16
- _ZN12QLineControl17_q_deleteSelectedEv @ 11749 NONAME
- _ZN12QLineControl17processMouseEventEP11QMouseEvent @ 11750 NONAME
- _ZN12QLineControl17resetInputContextEv @ 11751 NONAME
- _ZN12QLineControl17updateDisplayTextEv @ 11752 NONAME
- _ZN12QLineControl18displayTextChangedERK7QString @ 11753 NONAME
- _ZN12QLineControl18removeSelectedTextEv @ 11754 NONAME
- _ZN12QLineControl19_q_clipboardChangedEv @ 11755 NONAME
- _ZN12QLineControl20advanceToEnabledItemEi @ 11756 NONAME
- _ZN12QLineControl20setCursorBlinkPeriodEi @ 11757 NONAME
- _ZN12QLineControl21cursorPositionChangedEii @ 11758 NONAME
- _ZN12QLineControl23processInputMethodEventEP17QInputMethodEvent @ 11759 NONAME
- _ZN12QLineControl25emitCursorPositionChangedEv @ 11760 NONAME
- _ZN12QLineControl25updatePasswordEchoEditingEb @ 11761 NONAME
- _ZN12QLineControl3delEv @ 11762 NONAME
- _ZN12QLineControl4drawEP8QPainterRK6QPointRK5QRecti @ 11763 NONAME
- _ZN12QLineControl4initERK7QString @ 11764 NONAME
- _ZN12QLineControl5clearEv @ 11765 NONAME
- _ZN12QLineControl5fixupEv @ 11766 NONAME
- _ZN12QLineControl5pasteEv @ 11767 NONAME
- _ZN12QLineControl6insertERK7QString @ 11768 NONAME
- _ZN12QLineControl8acceptedEv @ 11769 NONAME
- _ZN12QLineControl8completeEi @ 11770 NONAME
- _ZN12QLineControl9backspaceEv @ 11771 NONAME
- _ZN12QPainterPath9translateEff @ 11772 NONAME
- _ZN12QPixmapCache3KeyC1ERKS0_ @ 11773 NONAME
- _ZN12QPixmapCache3KeyC1Ev @ 11774 NONAME
- _ZN12QPixmapCache3KeyC2ERKS0_ @ 11775 NONAME
- _ZN12QPixmapCache3KeyC2Ev @ 11776 NONAME
- _ZN12QPixmapCache3KeyD1Ev @ 11777 NONAME
- _ZN12QPixmapCache3KeyD2Ev @ 11778 NONAME
- _ZN12QPixmapCache3KeyaSERKS0_ @ 11779 NONAME
- _ZN12QPixmapCache4findERK7QStringP7QPixmap @ 11780 NONAME
- _ZN12QPixmapCache4findERKNS_3KeyEP7QPixmap @ 11781 NONAME
- _ZN12QPixmapCache6insertERK7QPixmap @ 11782 NONAME
- _ZN12QPixmapCache6removeERKNS_3KeyE @ 11783 NONAME
- _ZN12QPixmapCache7replaceERKNS_3KeyERK7QPixmap @ 11784 NONAME
- _ZN13QFontDatabase21removeApplicationFontEi @ 11785 NONAME
- _ZN13QGraphicsItem11setRotationEf @ 11786 NONAME
- _ZN13QGraphicsItem13setFocusProxyEPS_ @ 11787 NONAME
- _ZN13QGraphicsItem16toGraphicsObjectEv @ 11788 NONAME
- _ZN13QGraphicsItem18setTransformationsERK5QListIP18QGraphicsTransformE @ 11789 NONAME
- _ZN13QGraphicsItem19setInputMethodHintsE6QFlagsIN2Qt15InputMethodHintEE @ 11790 NONAME
- _ZN13QGraphicsItem20setAcceptTouchEventsEb @ 11791 NONAME
- _ZN13QGraphicsItem21setFiltersChildEventsEb @ 11792 NONAME
- _ZN13QGraphicsItem23setTransformOriginPointERK7QPointF @ 11793 NONAME
- _ZN13QGraphicsItem4setXEf @ 11794 NONAME
- _ZN13QGraphicsItem4setYEf @ 11795 NONAME
- _ZN13QGraphicsItem8setScaleEf @ 11796 NONAME
- _ZN13QPinchGesture11eventFilterEP7QObjectP6QEvent @ 11797 NONAME
- _ZN13QPinchGesture11filterEventEP6QEvent @ 11798 NONAME
- _ZN13QPinchGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 11799 NONAME
- _ZN13QPinchGesture11qt_metacastEPKc @ 11800 NONAME
- _ZN13QPinchGesture16staticMetaObjectE @ 11801 NONAME DATA 16
- _ZN13QPinchGesture5eventEP6QEvent @ 11802 NONAME
- _ZN13QPinchGesture5resetEv @ 11803 NONAME
- _ZN13QPinchGestureC1EP7QWidget @ 11804 NONAME ABSENT
- _ZN13QPinchGestureC2EP7QWidget @ 11805 NONAME ABSENT
- _ZN14QDesktopWidget18screenCountChangedEi @ 11806 NONAME
- _ZN14QGraphicsScale11qt_metacallEN11QMetaObject4CallEiPPv @ 11807 NONAME
- _ZN14QGraphicsScale11qt_metacastEPKc @ 11808 NONAME
- _ZN14QGraphicsScale12scaleChangedEv @ 11809 NONAME
- _ZN14QGraphicsScale13originChangedEv @ 11810 NONAME
- _ZN14QGraphicsScale16staticMetaObjectE @ 11811 NONAME DATA 16
- _ZN14QGraphicsScale9setOriginERK7QPointF @ 11812 NONAME ABSENT
- _ZN14QGraphicsScale9setXScaleEf @ 11813 NONAME
- _ZN14QGraphicsScale9setYScaleEf @ 11814 NONAME
- _ZN14QGraphicsScaleC1EP7QObject @ 11815 NONAME
- _ZN14QGraphicsScaleC2EP7QObject @ 11816 NONAME
- _ZN14QGraphicsScaleD0Ev @ 11817 NONAME
- _ZN14QGraphicsScaleD1Ev @ 11818 NONAME
- _ZN14QGraphicsScaleD2Ev @ 11819 NONAME
- _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathN2Qt17ItemSelectionModeERK10QTransform @ 11820 NONAME
- _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathRK10QTransform @ 11821 NONAME
- _ZN14QGraphicsScene9sendEventEP13QGraphicsItemP6QEvent @ 11822 NONAME
- _ZN14QPaintEngineExC2Ev @ 11823 NONAME
- _ZN14QWidgetPrivate10allWidgetsE @ 11824 NONAME DATA 4
- _ZN14QWidgetPrivate13setWSGeometryEbRK5QRect @ 11825 NONAME
- _ZN14QWidgetPrivate33handleSymbianDeferredFocusChangedEv @ 11826 NONAME ABSENT
- _ZN15QDockAreaLayout13separatorMoveERK5QListIiERK6QPointS6_ @ 11827 NONAME
- _ZN15QDockAreaLayout4infoERK5QListIiE @ 11828 NONAME
- _ZN15QDockAreaLayout4itemERK5QListIiE @ 11829 NONAME
- _ZN15QDockAreaLayout4plugERK5QListIiE @ 11830 NONAME
- _ZN15QDockAreaLayout6removeERK5QListIiE @ 11831 NONAME
- _ZN15QDockAreaLayout6unplugERK5QListIiE @ 11832 NONAME
- _ZN15QDockAreaLayout9insertGapERK5QListIiEP11QLayoutItem @ 11833 NONAME
- _ZN15QGraphicsObject11qt_metacallEN11QMetaObject4CallEiPPv @ 11834 NONAME
- _ZN15QGraphicsObject11qt_metacastEPKc @ 11835 NONAME
- _ZN15QGraphicsObject12scaleChangedEv @ 11836 NONAME
- _ZN15QGraphicsObject13parentChangedEv @ 11837 NONAME
- _ZN15QGraphicsObject14enabledChangedEv @ 11838 NONAME
- _ZN15QGraphicsObject14opacityChangedEv @ 11839 NONAME
- _ZN15QGraphicsObject14visibleChangedEv @ 11840 NONAME
- _ZN15QGraphicsObject15rotationChangedEv @ 11841 NONAME
- _ZN15QGraphicsObject16staticMetaObjectE @ 11842 NONAME DATA 16
- _ZN15QGraphicsObject8xChangedEv @ 11843 NONAME
- _ZN15QGraphicsObject8yChangedEv @ 11844 NONAME
- _ZN15QGraphicsObject8zChangedEv @ 11845 NONAME
- _ZN15QGraphicsObjectC2EP13QGraphicsItem @ 11846 NONAME
- _ZN15QGraphicsObjectC2ER20QGraphicsItemPrivateP13QGraphicsItemP14QGraphicsScene @ 11847 NONAME
- _ZN16QStyleSheetStyle17styleSheetPaletteEPK7QWidgetPK12QStyleOptionP8QPalette @ 11848 NONAME
- _ZN17QGraphicsRotation11axisChangedEv @ 11849 NONAME
- _ZN17QGraphicsRotation11qt_metacallEN11QMetaObject4CallEiPPv @ 11850 NONAME
- _ZN17QGraphicsRotation11qt_metacastEPKc @ 11851 NONAME
- _ZN17QGraphicsRotation12angleChangedEv @ 11852 NONAME
- _ZN17QGraphicsRotation13originChangedEv @ 11853 NONAME
- _ZN17QGraphicsRotation16staticMetaObjectE @ 11854 NONAME DATA 16
- _ZN17QGraphicsRotation7setAxisEN2Qt4AxisE @ 11855 NONAME
- _ZN17QGraphicsRotation7setAxisERK9QVector3D @ 11856 NONAME
- _ZN17QGraphicsRotation8setAngleEf @ 11857 NONAME
- _ZN17QGraphicsRotation9setOriginERK7QPointF @ 11858 NONAME ABSENT
- _ZN17QGraphicsRotationC1EP7QObject @ 11859 NONAME
- _ZN17QGraphicsRotationC2EP7QObject @ 11860 NONAME
- _ZN17QGraphicsRotationD0Ev @ 11861 NONAME
- _ZN17QGraphicsRotationD1Ev @ 11862 NONAME
- _ZN17QGraphicsRotationD2Ev @ 11863 NONAME
- _ZN17QMainWindowLayout10timerEventEP11QTimerEvent @ 11864 NONAME
- _ZN17QRasterPixmapData6scrollEiiRK5QRect @ 11865 NONAME
- _ZN18QColumnViewPrivate18_q_columnsInsertedERK11QModelIndexii @ 11866 NONAME
- _ZN18QColumnViewPrivate19checkColumnCreationERK11QModelIndex @ 11867 NONAME
- _ZN18QGraphicsTransform11qt_metacallEN11QMetaObject4CallEiPPv @ 11868 NONAME
- _ZN18QGraphicsTransform11qt_metacastEPKc @ 11869 NONAME
- _ZN18QGraphicsTransform16staticMetaObjectE @ 11870 NONAME DATA 16
- _ZN18QGraphicsTransform6updateEv @ 11871 NONAME
- _ZN18QGraphicsTransformC2EP7QObject @ 11872 NONAME
- _ZN18QGraphicsTransformC2ER25QGraphicsTransformPrivateP7QObject @ 11873 NONAME
- _ZN18QGraphicsTransformD0Ev @ 11874 NONAME
- _ZN18QGraphicsTransformD1Ev @ 11875 NONAME
- _ZN18QGraphicsTransformD2Ev @ 11876 NONAME
- _ZN18QSyntaxHighlighter16rehighlightBlockERK10QTextBlock @ 11877 NONAME
- _ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb @ 11878 NONAME
- _ZN19QApplicationPrivate15desktopStyleKeyEv @ 11879 NONAME
- _ZN19QApplicationPrivate17cleanupMultitouchEv @ 11880 NONAME
- _ZN19QApplicationPrivate20initializeMultitouchEv @ 11881 NONAME
- _ZN19QApplicationPrivate21cleanupMultitouch_sysEv @ 11882 NONAME
- _ZN19QApplicationPrivate22translateRawTouchEventEP7QWidgetN11QTouchEvent10DeviceTypeERK5QListINS2_10TouchPointEE @ 11883 NONAME
- _ZN19QApplicationPrivate23findClosestTouchPointIdERK7QPointF @ 11884 NONAME
- _ZN19QApplicationPrivate24initializeMultitouch_sysEv @ 11885 NONAME
- _ZN19QApplicationPrivate26updateTouchPointsForWidgetEP7QWidgetP11QTouchEvent @ 11886 NONAME
- _ZN19QApplicationPrivate31giveFocusAccordingToFocusPolicyEP7QWidgetN2Qt11FocusPolicyENS2_11FocusReasonE @ 11887 NONAME
- _ZN19QCoeFepInputContext11updateHintsEb @ 11888 NONAME
- _ZN19QCoeFepInputContext21ReportAknEdStateEventEN19MAknEdStateObserver19EAknEdwinStateEventE @ 11889 NONAME
- _ZN19QCoeFepInputContext29queueInputCapabilitiesChangedEv @ 11890 NONAME
- _ZN19QCoeFepInputContext30ensureInputCapabilitiesChangedEv @ 11891 NONAME
- _ZN19QDockAreaLayoutInfo13separatorMoveEii @ 11892 NONAME
- _ZN19QDockAreaLayoutInfo4infoERK5QListIiE @ 11893 NONAME
- _ZN19QDockAreaLayoutInfo4itemERK5QListIiE @ 11894 NONAME
- _ZN19QDockAreaLayoutInfo4plugERK5QListIiE @ 11895 NONAME
- _ZN19QDockAreaLayoutInfo6removeERK5QListIiE @ 11896 NONAME
- _ZN19QDockAreaLayoutInfo6unplugERK5QListIiE @ 11897 NONAME
- _ZN19QDockAreaLayoutInfo9insertGapERK5QListIiEP11QLayoutItem @ 11898 NONAME
- _ZN19QGraphicsSceneIndex10deleteItemEP13QGraphicsItem @ 11899 NONAME
- _ZN19QGraphicsSceneIndex10itemChangeEPK13QGraphicsItemNS0_18GraphicsItemChangeERK8QVariant @ 11900 NONAME
- _ZN19QGraphicsSceneIndex11qt_metacallEN11QMetaObject4CallEiPPv @ 11901 NONAME
- _ZN19QGraphicsSceneIndex11qt_metacastEPKc @ 11902 NONAME
- _ZN19QGraphicsSceneIndex15updateSceneRectERK6QRectF @ 11903 NONAME
- _ZN19QGraphicsSceneIndex16staticMetaObjectE @ 11904 NONAME DATA 16
- _ZN19QGraphicsSceneIndex25prepareBoundingRectChangeEPK13QGraphicsItem @ 11905 NONAME
- _ZN19QGraphicsSceneIndex5clearEv @ 11906 NONAME
- _ZN19QGraphicsSceneIndexC2EP14QGraphicsScene @ 11907 NONAME
- _ZN19QGraphicsSceneIndexC2ER26QGraphicsSceneIndexPrivateP14QGraphicsScene @ 11908 NONAME
- _ZN19QGraphicsSceneIndexD0Ev @ 11909 NONAME
- _ZN19QGraphicsSceneIndexD1Ev @ 11910 NONAME
- _ZN19QGraphicsSceneIndexD2Ev @ 11911 NONAME
- _ZN19QKeyEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 11912 NONAME
- _ZN19QKeyEventTransition11qt_metacastEPKc @ 11913 NONAME
- _ZN19QKeyEventTransition12onTransitionEP6QEvent @ 11914 NONAME
- _ZN19QKeyEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 11915 NONAME
- _ZN19QKeyEventTransition16staticMetaObjectE @ 11916 NONAME DATA 16
- _ZN19QKeyEventTransition6setKeyEi @ 11917 NONAME
- _ZN19QKeyEventTransition9eventTestEP6QEvent @ 11918 NONAME
- _ZN19QKeyEventTransitionC1EP6QState @ 11919 NONAME
- _ZN19QKeyEventTransitionC1EP7QObjectN6QEvent4TypeEiP6QState @ 11920 NONAME
- _ZN19QKeyEventTransitionC2EP6QState @ 11921 NONAME
- _ZN19QKeyEventTransitionC2EP7QObjectN6QEvent4TypeEiP6QState @ 11922 NONAME
- _ZN19QKeyEventTransitionD0Ev @ 11923 NONAME
- _ZN19QKeyEventTransitionD1Ev @ 11924 NONAME
- _ZN19QKeyEventTransitionD2Ev @ 11925 NONAME
- _ZN20QGraphicsItemPrivate11removeChildEP13QGraphicsItem @ 11926 NONAME
- _ZN20QGraphicsItemPrivate11setSubFocusEv @ 11927 NONAME ABSENT
- _ZN20QGraphicsItemPrivate13clearSubFocusEv @ 11928 NONAME ABSENT
- _ZN20QGraphicsItemPrivate15resetFocusProxyEv @ 11929 NONAME
- _ZN20QGraphicsItemPrivate18setTransformHelperERK10QTransform @ 11930 NONAME
- _ZN20QGraphicsItemPrivate19setParentItemHelperEP13QGraphicsItem @ 11931 NONAME
- _ZN20QGraphicsItemPrivate20ensureSceneTransformEv @ 11932 NONAME ABSENT
- _ZN20QGraphicsItemPrivate23appendGraphicsTransformEP18QGraphicsTransform @ 11933 NONAME
- _ZN20QGraphicsItemPrivate26childrenBoundingRectHelperEP10QTransformP6QRectF @ 11934 NONAME
- _ZN20QGraphicsItemPrivate29ensureSceneTransformRecursiveEPP13QGraphicsItem @ 11935 NONAME
- _ZN20QGraphicsItemPrivate30updateSceneTransformFromParentEv @ 11936 NONAME
- _ZN20QGraphicsItemPrivate8addChildEP13QGraphicsItem @ 11937 NONAME
- _ZN20QGraphicsViewPrivate19translateTouchEventEPS_P11QTouchEvent @ 11938 NONAME
- _ZN20QGraphicsViewPrivate21processPendingUpdatesEv @ 11939 NONAME
- _ZN20QGraphicsViewPrivate28updateInputMethodSensitivityEv @ 11940 NONAME
- _ZN20QTextDocumentPrivate10finishEditEv @ 11941 NONAME
- _ZN21QMouseEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 11942 NONAME
- _ZN21QMouseEventTransition11qt_metacastEPKc @ 11943 NONAME
- _ZN21QMouseEventTransition12onTransitionEP6QEvent @ 11944 NONAME
- _ZN21QMouseEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 11945 NONAME
- _ZN21QMouseEventTransition16staticMetaObjectE @ 11946 NONAME DATA 16
- _ZN21QMouseEventTransition7setPathERK12QPainterPath @ 11947 NONAME
- _ZN21QMouseEventTransition9eventTestEP6QEvent @ 11948 NONAME
- _ZN21QMouseEventTransition9setButtonEN2Qt11MouseButtonE @ 11949 NONAME
- _ZN21QMouseEventTransitionC1EP6QState @ 11950 NONAME
- _ZN21QMouseEventTransitionC1EP7QObjectN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 11951 NONAME
- _ZN21QMouseEventTransitionC2EP6QState @ 11952 NONAME
- _ZN21QMouseEventTransitionC2EP7QObjectN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 11953 NONAME
- _ZN21QMouseEventTransitionD0Ev @ 11954 NONAME
- _ZN21QMouseEventTransitionD1Ev @ 11955 NONAME
- _ZN21QMouseEventTransitionD2Ev @ 11956 NONAME
- _ZN21QPaintEngineExPrivate20replayClipOperationsEv @ 11957 NONAME
- _ZN24QAbstractItemViewPrivate14checkMouseMoveERK21QPersistentModelIndex @ 11958 NONAME
- _ZN24QAbstractItemViewPrivate9fetchMoreEv @ 11959 NONAME
- _ZN24QBasicKeyEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 11960 NONAME
- _ZN24QBasicKeyEventTransition11qt_metacastEPKc @ 11961 NONAME
- _ZN24QBasicKeyEventTransition12onTransitionEP6QEvent @ 11962 NONAME
- _ZN24QBasicKeyEventTransition12setEventTypeEN6QEvent4TypeE @ 11963 NONAME
- _ZN24QBasicKeyEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 11964 NONAME
- _ZN24QBasicKeyEventTransition16staticMetaObjectE @ 11965 NONAME DATA 16
- _ZN24QBasicKeyEventTransition6setKeyEi @ 11966 NONAME
- _ZN24QBasicKeyEventTransition9eventTestEP6QEvent @ 11967 NONAME
- _ZN24QBasicKeyEventTransitionC1EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEEP6QState @ 11968 NONAME
- _ZN24QBasicKeyEventTransitionC1EN6QEvent4TypeEiP6QState @ 11969 NONAME
- _ZN24QBasicKeyEventTransitionC1EP6QState @ 11970 NONAME
- _ZN24QBasicKeyEventTransitionC2EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEEP6QState @ 11971 NONAME
- _ZN24QBasicKeyEventTransitionC2EN6QEvent4TypeEiP6QState @ 11972 NONAME
- _ZN24QBasicKeyEventTransitionC2EP6QState @ 11973 NONAME
- _ZN24QBasicKeyEventTransitionD0Ev @ 11974 NONAME
- _ZN24QBasicKeyEventTransitionD1Ev @ 11975 NONAME
- _ZN24QBasicKeyEventTransitionD2Ev @ 11976 NONAME
- _ZN24QImagePixmapCleanupHooks12addImageHookEPFvxE @ 11977 NONAME
- _ZN24QImagePixmapCleanupHooks13addPixmapHookEPFvP7QPixmapE @ 11978 NONAME
- _ZN24QImagePixmapCleanupHooks15removeImageHookEPFvxE @ 11979 NONAME
- _ZN24QImagePixmapCleanupHooks16removePixmapHookEPFvP7QPixmapE @ 11980 NONAME
- _ZN24QImagePixmapCleanupHooks17executeImageHooksEx @ 11981 NONAME
- _ZN24QImagePixmapCleanupHooks18executePixmapHooksEP7QPixmap @ 11982 NONAME
- _ZN24QImagePixmapCleanupHooks8instanceEv @ 11983 NONAME
- _ZN24QImagePixmapCleanupHooksC1Ev @ 11984 NONAME
- _ZN24QImagePixmapCleanupHooksC2Ev @ 11985 NONAME
- _ZN24QStyleOptionGraphicsItem26levelOfDetailFromTransformERK10QTransform @ 11986 NONAME
- _ZN25QGraphicsSceneLinearIndex11qt_metacallEN11QMetaObject4CallEiPPv @ 11987 NONAME
- _ZN25QGraphicsSceneLinearIndex11qt_metacastEPKc @ 11988 NONAME
- _ZN25QGraphicsSceneLinearIndex16staticMetaObjectE @ 11989 NONAME DATA 16
- _ZN26QAbstractScrollAreaPrivate19_q_gestureTriggeredEv @ 11990 NONAME ABSENT
- _ZN26QBasicMouseEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 11991 NONAME
- _ZN26QBasicMouseEventTransition11qt_metacastEPKc @ 11992 NONAME
- _ZN26QBasicMouseEventTransition12onTransitionEP6QEvent @ 11993 NONAME
- _ZN26QBasicMouseEventTransition12setEventTypeEN6QEvent4TypeE @ 11994 NONAME
- _ZN26QBasicMouseEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 11995 NONAME
- _ZN26QBasicMouseEventTransition16staticMetaObjectE @ 11996 NONAME DATA 16
- _ZN26QBasicMouseEventTransition7setPathERK12QPainterPath @ 11997 NONAME
- _ZN26QBasicMouseEventTransition9eventTestEP6QEvent @ 11998 NONAME
- _ZN26QBasicMouseEventTransition9setButtonEN2Qt11MouseButtonE @ 11999 NONAME
- _ZN26QBasicMouseEventTransitionC1EN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 12000 NONAME
- _ZN26QBasicMouseEventTransitionC1EP6QState @ 12001 NONAME
- _ZN26QBasicMouseEventTransitionC2EN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 12002 NONAME
- _ZN26QBasicMouseEventTransitionC2EP6QState @ 12003 NONAME
- _ZN26QBasicMouseEventTransitionD0Ev @ 12004 NONAME
- _ZN26QBasicMouseEventTransitionD1Ev @ 12005 NONAME
- _ZN26QBasicMouseEventTransitionD2Ev @ 12006 NONAME
- _ZN26QGraphicsLayoutItemPrivate16setSizeComponentEN2Qt8SizeHintENS_13SizeComponentEf @ 12007 NONAME
- _ZN26QGraphicsLayoutItemPrivate19ensureUserSizeHintsEv @ 12008 NONAME
- _ZN26QGraphicsLayoutItemPrivate7setSizeEN2Qt8SizeHintERK6QSizeF @ 12009 NONAME
- _ZN26QGraphicsLayoutItemPrivateD0Ev @ 12010 NONAME
- _ZN26QGraphicsLayoutItemPrivateD1Ev @ 12011 NONAME
- _ZN26QGraphicsLayoutItemPrivateD2Ev @ 12012 NONAME
- _ZN26QGraphicsSceneBspTreeIndex10itemChangeEPK13QGraphicsItemNS0_18GraphicsItemChangeERK8QVariant @ 12013 NONAME
- _ZN26QGraphicsSceneBspTreeIndex10removeItemEP13QGraphicsItem @ 12014 NONAME
- _ZN26QGraphicsSceneBspTreeIndex11qt_metacallEN11QMetaObject4CallEiPPv @ 12015 NONAME
- _ZN26QGraphicsSceneBspTreeIndex11qt_metacastEPKc @ 12016 NONAME
- _ZN26QGraphicsSceneBspTreeIndex12bspTreeDepthEv @ 12017 NONAME
- _ZN26QGraphicsSceneBspTreeIndex15setBspTreeDepthEi @ 12018 NONAME
- _ZN26QGraphicsSceneBspTreeIndex15updateSceneRectERK6QRectF @ 12019 NONAME
- _ZN26QGraphicsSceneBspTreeIndex16staticMetaObjectE @ 12020 NONAME DATA 16
- _ZN26QGraphicsSceneBspTreeIndex25prepareBoundingRectChangeEPK13QGraphicsItem @ 12021 NONAME
- _ZN26QGraphicsSceneBspTreeIndex5clearEv @ 12022 NONAME
- _ZN26QGraphicsSceneBspTreeIndex5eventEP6QEvent @ 12023 NONAME
- _ZN26QGraphicsSceneBspTreeIndex7addItemEP13QGraphicsItem @ 12024 NONAME
- _ZN26QGraphicsSceneBspTreeIndexC1EP14QGraphicsScene @ 12025 NONAME
- _ZN26QGraphicsSceneBspTreeIndexC2EP14QGraphicsScene @ 12026 NONAME
- _ZN26QGraphicsSceneBspTreeIndexD0Ev @ 12027 NONAME
- _ZN26QGraphicsSceneBspTreeIndexD1Ev @ 12028 NONAME
- _ZN26QGraphicsSceneBspTreeIndexD2Ev @ 12029 NONAME
- _ZN5QIcon12hasThemeIconERK7QString @ 12030 NONAME
- _ZN5QIcon12setThemeNameERK7QString @ 12031 NONAME
- _ZN5QIcon16themeSearchPathsEv @ 12032 NONAME
- _ZN5QIcon19setThemeSearchPathsERK11QStringList @ 12033 NONAME
- _ZN5QIcon9fromThemeERK7QStringRKS_ @ 12034 NONAME
- _ZN5QIcon9themeNameEv @ 12035 NONAME
- _ZN6QStyle8setProxyEPS_ @ 12036 NONAME
- _ZN7QAction11setPriorityENS_8PriorityE @ 12037 NONAME
- _ZN7QPixmap6scrollEiiRK5QRectP7QRegion @ 12038 NONAME
- _ZN8QGesture11eventFilterEP7QObjectP6QEvent @ 12039 NONAME
- _ZN8QGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 12040 NONAME
- _ZN8QGesture11qt_metacastEPKc @ 12041 NONAME
- _ZN8QGesture11updateStateEN2Qt12GestureStateE @ 12042 NONAME
- _ZN8QGesture15setGraphicsItemEP13QGraphicsItem @ 12043 NONAME
- _ZN8QGesture16staticMetaObjectE @ 12044 NONAME DATA 16
- _ZN8QGesture5resetEv @ 12045 NONAME
- _ZN8QGesture7startedEv @ 12046 NONAME
- _ZN8QGesture8finishedEv @ 12047 NONAME
- _ZN8QGesture8canceledEv @ 12048 NONAME
- _ZN8QGesture9triggeredEv @ 12049 NONAME
- _ZN8QGestureC2EP7QObject @ 12050 NONAME ABSENT
- _ZN8QGestureC2ER15QGesturePrivateP7QObject @ 12051 NONAME ABSENT
- _ZN8QGestureD0Ev @ 12052 NONAME
- _ZN8QGestureD1Ev @ 12053 NONAME
- _ZN8QGestureD2Ev @ 12054 NONAME
- _ZN8QMenuBar16setNativeMenuBarEb @ 12055 NONAME
- _ZN9QVector2D10dotProductERKS_S1_ @ 12056 NONAME
- _ZN9QVector2D9normalizeEv @ 12057 NONAME
- _ZN9QVector2DC1ERK9QVector3D @ 12058 NONAME
- _ZN9QVector2DC1ERK9QVector4D @ 12059 NONAME
- _ZN9QVector2DC2ERK9QVector3D @ 12060 NONAME
- _ZN9QVector2DC2ERK9QVector4D @ 12061 NONAME
- _ZN9QVector3D10dotProductERKS_S1_ @ 12062 NONAME
- _ZN9QVector3D12crossProductERKS_S1_ @ 12063 NONAME
- _ZN9QVector3D6normalERKS_S1_ @ 12064 NONAME
- _ZN9QVector3D6normalERKS_S1_S1_ @ 12065 NONAME
- _ZN9QVector3D9normalizeEv @ 12066 NONAME
- _ZN9QVector3DC1ERK9QVector2D @ 12067 NONAME
- _ZN9QVector3DC1ERK9QVector2Df @ 12068 NONAME
- _ZN9QVector3DC1ERK9QVector4D @ 12069 NONAME
- _ZN9QVector3DC2ERK9QVector2D @ 12070 NONAME
- _ZN9QVector3DC2ERK9QVector2Df @ 12071 NONAME
- _ZN9QVector3DC2ERK9QVector4D @ 12072 NONAME
- _ZN9QVector4D10dotProductERKS_S1_ @ 12073 NONAME
- _ZN9QVector4D9normalizeEv @ 12074 NONAME
- _ZN9QVector4DC1ERK9QVector2D @ 12075 NONAME
- _ZN9QVector4DC1ERK9QVector2Dff @ 12076 NONAME
- _ZN9QVector4DC1ERK9QVector3D @ 12077 NONAME
- _ZN9QVector4DC1ERK9QVector3Df @ 12078 NONAME
- _ZN9QVector4DC2ERK9QVector2D @ 12079 NONAME
- _ZN9QVector4DC2ERK9QVector2Dff @ 12080 NONAME
- _ZN9QVector4DC2ERK9QVector3D @ 12081 NONAME
- _ZN9QVector4DC2ERK9QVector3Df @ 12082 NONAME
- _ZNK10QCompleter15maxVisibleItemsEv @ 12083 NONAME
- _ZNK10QMatrix4x410transposedEv @ 12084 NONAME
- _ZNK10QMatrix4x411determinantEv @ 12085 NONAME
- _ZNK10QMatrix4x411toTransformEv @ 12086 NONAME ABSENT
- _ZNK10QMatrix4x412normalMatrixEv @ 12087 NONAME
- _ZNK10QMatrix4x412toValueArrayEPf @ 12088 NONAME
- _ZNK10QMatrix4x418extractTranslationEv @ 12089 NONAME
- _ZNK10QMatrix4x418orthonormalInverseEv @ 12090 NONAME
- _ZNK10QMatrix4x419extractAxisRotationERfR9QVector3D @ 12091 NONAME
- _ZNK10QMatrix4x47mapRectERK5QRect @ 12092 NONAME
- _ZNK10QMatrix4x47mapRectERK6QRectF @ 12093 NONAME
- _ZNK10QMatrix4x48invertedEPb @ 12094 NONAME
- _ZNK10QMatrix4x48toAffineEv @ 12095 NONAME
- _ZNK11QPanGesture10lastOffsetEv @ 12096 NONAME
- _ZNK11QPanGesture10metaObjectEv @ 12097 NONAME
- _ZNK11QPanGesture11totalOffsetEv @ 12098 NONAME
- _ZNK11QProxyStyle10metaObjectEv @ 12099 NONAME
- _ZNK11QProxyStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 12100 NONAME
- _ZNK11QProxyStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 12101 NONAME
- _ZNK11QProxyStyle12drawItemTextEP8QPainterRK5QRectiRK8QPalettebRK7QStringNS5_9ColorRoleE @ 12102 NONAME
- _ZNK11QProxyStyle12itemTextRectERK12QFontMetricsRK5QRectibRK7QString @ 12103 NONAME
- _ZNK11QProxyStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 12104 NONAME
- _ZNK11QProxyStyle14drawItemPixmapEP8QPainterRK5QRectiRK7QPixmap @ 12105 NONAME
- _ZNK11QProxyStyle14itemPixmapRectERK5QRectiRK7QPixmap @ 12106 NONAME
- _ZNK11QProxyStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 12107 NONAME
- _ZNK11QProxyStyle14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 12108 NONAME
- _ZNK11QProxyStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 12109 NONAME
- _ZNK11QProxyStyle15standardPaletteEv @ 12110 NONAME
- _ZNK11QProxyStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 12111 NONAME
- _ZNK11QProxyStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 12112 NONAME
- _ZNK11QProxyStyle19generatedIconPixmapEN5QIcon4ModeERK7QPixmapPK12QStyleOption @ 12113 NONAME
- _ZNK11QProxyStyle21hitTestComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexRK6QPointPK7QWidget @ 12114 NONAME
- _ZNK11QProxyStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 12115 NONAME
- _ZNK11QProxyStyle27layoutSpacingImplementationEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 12116 NONAME
- _ZNK11QProxyStyle9baseStyleEv @ 12117 NONAME
- _ZNK11QProxyStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 12118 NONAME
- _ZNK11QQuaternion10normalizedEv @ 12119 NONAME
- _ZNK11QQuaternion12rotateVectorERK9QVector3D @ 12120 NONAME
- _ZNK11QQuaternion13lengthSquaredEv @ 12121 NONAME
- _ZNK11QQuaternion6lengthEv @ 12122 NONAME
- _ZNK11QTouchEvent10TouchPoint10screenRectEv @ 12123 NONAME
- _ZNK11QTouchEvent10TouchPoint12lastScenePosEv @ 12124 NONAME
- _ZNK11QTouchEvent10TouchPoint13lastScreenPosEv @ 12125 NONAME
- _ZNK11QTouchEvent10TouchPoint13normalizedPosEv @ 12126 NONAME
- _ZNK11QTouchEvent10TouchPoint13startScenePosEv @ 12127 NONAME
- _ZNK11QTouchEvent10TouchPoint14startScreenPosEv @ 12128 NONAME
- _ZNK11QTouchEvent10TouchPoint17lastNormalizedPosEv @ 12129 NONAME
- _ZNK11QTouchEvent10TouchPoint18startNormalizedPosEv @ 12130 NONAME
- _ZNK11QTouchEvent10TouchPoint2idEv @ 12131 NONAME
- _ZNK11QTouchEvent10TouchPoint3posEv @ 12132 NONAME
- _ZNK11QTouchEvent10TouchPoint4rectEv @ 12133 NONAME
- _ZNK11QTouchEvent10TouchPoint5stateEv @ 12134 NONAME
- _ZNK11QTouchEvent10TouchPoint7lastPosEv @ 12135 NONAME
- _ZNK11QTouchEvent10TouchPoint8pressureEv @ 12136 NONAME
- _ZNK11QTouchEvent10TouchPoint8scenePosEv @ 12137 NONAME
- _ZNK11QTouchEvent10TouchPoint8startPosEv @ 12138 NONAME
- _ZNK11QTouchEvent10TouchPoint9isPrimaryEv @ 12139 NONAME
- _ZNK11QTouchEvent10TouchPoint9sceneRectEv @ 12140 NONAME
- _ZNK11QTouchEvent10TouchPoint9screenPosEv @ 12141 NONAME
- _ZNK11QVectorPath20convertToPainterPathEv @ 12142 NONAME ABSENT
- _ZNK12QLineControl10cursorRectEv @ 12143 NONAME
- _ZNK12QLineControl10findInMaskEibb5QChar @ 12144 NONAME
- _ZNK12QLineControl10maskStringEjRK7QStringb @ 12145 NONAME
- _ZNK12QLineControl10metaObjectEv @ 12146 NONAME
- _ZNK12QLineControl11clearStringEjj @ 12147 NONAME
- _ZNK12QLineControl11stripStringERK7QString @ 12148 NONAME
- _ZNK12QLineControl12isValidInputE5QCharS0_ @ 12149 NONAME
- _ZNK12QLineControl18hasAcceptableInputERK7QString @ 12150 NONAME
- _ZNK12QLineControl4copyEN10QClipboard4ModeE @ 12151 NONAME
- _ZNK12QLineControl6xToPosEiN9QTextLine14CursorPositionE @ 12152 NONAME
- _ZNK12QPainterPath10translatedEff @ 12153 NONAME
- _ZNK12QPixmapCache3KeyeqERKS0_ @ 12154 NONAME
- _ZNK13QGraphicsItem10focusProxyEv @ 12155 NONAME
- _ZNK13QGraphicsItem12parentObjectEv @ 12156 NONAME
- _ZNK13QGraphicsItem15transformationsEv @ 12157 NONAME
- _ZNK13QGraphicsItem16inputMethodHintsEv @ 12158 NONAME
- _ZNK13QGraphicsItem16toGraphicsObjectEv @ 12159 NONAME
- _ZNK13QGraphicsItem17acceptTouchEventsEv @ 12160 NONAME
- _ZNK13QGraphicsItem18filtersChildEventsEv @ 12161 NONAME
- _ZNK13QGraphicsItem20transformOriginPointEv @ 12162 NONAME
- _ZNK13QGraphicsItem5scaleEv @ 12163 NONAME
- _ZNK13QGraphicsItem8rotationEv @ 12164 NONAME
- _ZNK13QGraphicsItem9focusItemEv @ 12165 NONAME
- _ZNK13QGraphicsView13isTransformedEv @ 12166 NONAME
- _ZNK13QPinchGesture10metaObjectEv @ 12167 NONAME
- _ZNK13QPinchGesture11centerPointEv @ 12168 NONAME
- _ZNK13QPinchGesture11scaleFactorEv @ 12169 NONAME
- _ZNK13QPinchGesture13rotationAngleEv @ 12170 NONAME
- _ZNK13QPinchGesture15lastCenterPointEv @ 12171 NONAME
- _ZNK13QPinchGesture15lastScaleFactorEv @ 12172 NONAME
- _ZNK13QPinchGesture16startCenterPointEv @ 12173 NONAME
- _ZNK13QPinchGesture17lastRotationAngleEv @ 12174 NONAME
- _ZNK14QGraphicsScale10metaObjectEv @ 12175 NONAME
- _ZNK14QGraphicsScale6originEv @ 12176 NONAME
- _ZNK14QGraphicsScale6xScaleEv @ 12177 NONAME
- _ZNK14QGraphicsScale6yScaleEv @ 12178 NONAME
- _ZNK14QGraphicsScale7applyToEP10QTransform @ 12179 NONAME ABSENT
- _ZNK14QGraphicsScene5itemsEN2Qt9SortOrderE @ 12180 NONAME
- _ZNK14QGraphicsScene5itemsERK12QPainterPathN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12181 NONAME
- _ZNK14QGraphicsScene5itemsERK6QRectFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12182 NONAME
- _ZNK14QGraphicsScene5itemsERK7QPointFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12183 NONAME
- _ZNK14QGraphicsScene5itemsERK9QPolygonFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12184 NONAME
- _ZNK14QGraphicsScene6itemAtERK7QPointFRK10QTransform @ 12185 NONAME
- _ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegioni @ 12186 NONAME
- _ZNK15QDockAreaLayout13separatorRectERK5QListIiE @ 12187 NONAME
- _ZNK15QDockAreaLayout4infoERK5QListIiE @ 12188 NONAME
- _ZNK15QDockAreaLayout7gapRectERK5QListIiE @ 12189 NONAME
- _ZNK15QDockAreaLayout8itemRectERK5QListIiE @ 12190 NONAME
- _ZNK15QGraphicsObject10metaObjectEv @ 12191 NONAME
- _ZNK17QGraphicsRotation10metaObjectEv @ 12192 NONAME
- _ZNK17QGraphicsRotation4axisEv @ 12193 NONAME
- _ZNK17QGraphicsRotation5angleEv @ 12194 NONAME
- _ZNK17QGraphicsRotation6originEv @ 12195 NONAME
- _ZNK17QGraphicsRotation7applyToEP10QTransform @ 12196 NONAME ABSENT
- _ZNK18QGraphicsTransform10metaObjectEv @ 12197 NONAME
- _ZNK18QGraphicsTransform9transformEv @ 12198 NONAME ABSENT
- _ZNK18QTextureGlyphCache18textureMapForGlyphEj @ 12199 NONAME
- _ZNK19QDockAreaLayoutInfo12hasFixedSizeEv @ 12200 NONAME
- _ZNK19QDockAreaLayoutInfo13separatorRectERK5QListIiE @ 12201 NONAME
- _ZNK19QDockAreaLayoutInfo8itemRectERK5QListIiE @ 12202 NONAME
- _ZNK19QGraphicsSceneIndex10metaObjectEv @ 12203 NONAME
- _ZNK19QGraphicsSceneIndex13estimateItemsERK7QPointFN2Qt9SortOrderE @ 12204 NONAME
- _ZNK19QGraphicsSceneIndex21estimateTopLevelItemsERK6QRectFN2Qt9SortOrderE @ 12205 NONAME
- _ZNK19QGraphicsSceneIndex5itemsERK12QPainterPathN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12206 NONAME
- _ZNK19QGraphicsSceneIndex5itemsERK6QRectFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12207 NONAME
- _ZNK19QGraphicsSceneIndex5itemsERK7QPointFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12208 NONAME
- _ZNK19QGraphicsSceneIndex5itemsERK9QPolygonFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 12209 NONAME
- _ZNK19QGraphicsSceneIndex5sceneEv @ 12210 NONAME
- _ZNK19QKeyEventTransition10metaObjectEv @ 12211 NONAME
- _ZNK19QKeyEventTransition13modifiersMaskEv @ 12212 NONAME
- _ZNK19QKeyEventTransition3keyEv @ 12213 NONAME
- _ZNK20QGraphicsItemPrivate15initStyleOptionEP24QStyleOptionGraphicsItemRK10QTransformRK7QRegionb @ 12214 NONAME
- _ZNK20QGraphicsItemPrivate19maybeExtraItemCacheEv @ 12215 NONAME
- _ZNK20QGraphicsItemPrivate24combineTransformToParentEP10QTransformPKS0_ @ 12216 NONAME
- _ZNK20QGraphicsItemPrivate26combineTransformFromParentEP10QTransformPKS0_ @ 12217 NONAME
- _ZNK20QGraphicsViewPrivate10mapToSceneERK6QRectF @ 12218 NONAME
- _ZNK20QGraphicsViewPrivate10mapToSceneERK7QPointF @ 12219 NONAME
- _ZNK20QGraphicsViewPrivate9findItemsERK7QRegionPbRK10QTransform @ 12220 NONAME
- _ZNK21QMouseEventTransition10metaObjectEv @ 12221 NONAME
- _ZNK21QMouseEventTransition13modifiersMaskEv @ 12222 NONAME
- _ZNK21QMouseEventTransition4pathEv @ 12223 NONAME
- _ZNK21QMouseEventTransition6buttonEv @ 12224 NONAME
- _ZNK21QPaintEngineExPrivate17hasClipOperationsEv @ 12225 NONAME
- _ZNK24QAbstractItemViewPrivate19draggablePaintPairsERK5QListI11QModelIndexEP5QRect @ 12226 NONAME
- _ZNK24QBasicKeyEventTransition10metaObjectEv @ 12227 NONAME
- _ZNK24QBasicKeyEventTransition13modifiersMaskEv @ 12228 NONAME
- _ZNK24QBasicKeyEventTransition3keyEv @ 12229 NONAME
- _ZNK24QBasicKeyEventTransition9eventTypeEv @ 12230 NONAME
- _ZNK25QGraphicsSceneLinearIndex10metaObjectEv @ 12231 NONAME
- _ZNK26QBasicMouseEventTransition10metaObjectEv @ 12232 NONAME
- _ZNK26QBasicMouseEventTransition13modifiersMaskEv @ 12233 NONAME
- _ZNK26QBasicMouseEventTransition4pathEv @ 12234 NONAME
- _ZNK26QBasicMouseEventTransition6buttonEv @ 12235 NONAME
- _ZNK26QBasicMouseEventTransition9eventTypeEv @ 12236 NONAME
- _ZNK26QGraphicsSceneBspTreeIndex10metaObjectEv @ 12237 NONAME
- _ZNK26QGraphicsSceneBspTreeIndex13estimateItemsERK6QRectFN2Qt9SortOrderE @ 12238 NONAME
- _ZNK26QGraphicsSceneBspTreeIndex21estimateTopLevelItemsERK6QRectFN2Qt9SortOrderE @ 12239 NONAME
- _ZNK26QGraphicsSceneBspTreeIndex5itemsEN2Qt9SortOrderE @ 12240 NONAME
- _ZNK6QStyle5proxyEv @ 12241 NONAME
- _ZNK7QAction8priorityEv @ 12242 NONAME
- _ZNK7QWidget20previousInFocusChainEv @ 12243 NONAME
- _ZNK8QGesture10metaObjectEv @ 12244 NONAME
- _ZNK8QGesture12graphicsItemEv @ 12245 NONAME
- _ZNK8QGesture5stateEv @ 12246 NONAME
- _ZNK8QMenuBar15isNativeMenuBarEv @ 12247 NONAME
- _ZNK8QPolygon10translatedEii @ 12248 NONAME
- _ZNK9QPolygonF10translatedERK7QPointF @ 12249 NONAME
- _ZNK9QVector2D10normalizedEv @ 12250 NONAME
- _ZNK9QVector2D10toVector3DEv @ 12251 NONAME
- _ZNK9QVector2D10toVector4DEv @ 12252 NONAME
- _ZNK9QVector2D13lengthSquaredEv @ 12253 NONAME
- _ZNK9QVector2D6lengthEv @ 12254 NONAME
- _ZNK9QVector3D10normalizedEv @ 12255 NONAME
- _ZNK9QVector3D10toVector2DEv @ 12256 NONAME
- _ZNK9QVector3D10toVector4DEv @ 12257 NONAME
- _ZNK9QVector3D13lengthSquaredEv @ 12258 NONAME
- _ZNK9QVector3D14distanceToLineERKS_S1_ @ 12259 NONAME
- _ZNK9QVector3D15distanceToPlaneERKS_S1_ @ 12260 NONAME
- _ZNK9QVector3D15distanceToPlaneERKS_S1_S1_ @ 12261 NONAME
- _ZNK9QVector3D6lengthEv @ 12262 NONAME
- _ZNK9QVector4D10normalizedEv @ 12263 NONAME
- _ZNK9QVector4D10toVector2DEv @ 12264 NONAME
- _ZNK9QVector4D10toVector3DEv @ 12265 NONAME
- _ZNK9QVector4D13lengthSquaredEv @ 12266 NONAME
- _ZNK9QVector4D16toVector2DAffineEv @ 12267 NONAME
- _ZNK9QVector4D16toVector3DAffineEv @ 12268 NONAME
- _ZNK9QVector4D6lengthEv @ 12269 NONAME
- _ZTI11QPanGesture @ 12270 NONAME
- _ZTI11QProxyStyle @ 12271 NONAME
- _ZTI11QTouchEvent @ 12272 NONAME
- _ZTI12QLineControl @ 12273 NONAME
- _ZTI13QPinchGesture @ 12274 NONAME
- _ZTI14QGraphicsScale @ 12275 NONAME
- _ZTI15QGraphicsObject @ 12276 NONAME
- _ZTI17QGraphicsRotation @ 12277 NONAME
- _ZTI18QGraphicsTransform @ 12278 NONAME
- _ZTI19QGraphicsSceneIndex @ 12279 NONAME
- _ZTI19QKeyEventTransition @ 12280 NONAME
- _ZTI21QMouseEventTransition @ 12281 NONAME
- _ZTI24QBasicKeyEventTransition @ 12282 NONAME
- _ZTI25QGraphicsSceneLinearIndex @ 12283 NONAME
- _ZTI26QBasicMouseEventTransition @ 12284 NONAME
- _ZTI26QGraphicsSceneBspTreeIndex @ 12285 NONAME
- _ZTI8QGesture @ 12286 NONAME
- _ZTV11QPanGesture @ 12287 NONAME
- _ZTV11QProxyStyle @ 12288 NONAME
- _ZTV11QTouchEvent @ 12289 NONAME
- _ZTV12QLineControl @ 12290 NONAME
- _ZTV13QPinchGesture @ 12291 NONAME
- _ZTV14QGraphicsScale @ 12292 NONAME
- _ZTV15QGraphicsObject @ 12293 NONAME
- _ZTV17QGraphicsRotation @ 12294 NONAME
- _ZTV18QGraphicsTransform @ 12295 NONAME
- _ZTV19QGraphicsSceneIndex @ 12296 NONAME
- _ZTV19QKeyEventTransition @ 12297 NONAME
- _ZTV21QMouseEventTransition @ 12298 NONAME
- _ZTV24QBasicKeyEventTransition @ 12299 NONAME
- _ZTV25QGraphicsSceneLinearIndex @ 12300 NONAME
- _ZTV26QBasicMouseEventTransition @ 12301 NONAME
- _ZTV26QGraphicsSceneBspTreeIndex @ 12302 NONAME
- _ZTV8QGesture @ 12303 NONAME
- _ZdvRK10QMatrix4x4f @ 12304 NONAME
- _Zls6QDebugRK10QMatrix4x4 @ 12305 NONAME
- _Zls6QDebugRK11QQuaternion @ 12306 NONAME
- _Zls6QDebugRK9QVector2D @ 12307 NONAME
- _Zls6QDebugRK9QVector3D @ 12308 NONAME
- _Zls6QDebugRK9QVector4D @ 12309 NONAME
- _ZlsR11QDataStreamRK10QMatrix4x4 @ 12310 NONAME
- _ZlsR11QDataStreamRK11QQuaternion @ 12311 NONAME
- _ZlsR11QDataStreamRK9QVector2D @ 12312 NONAME
- _ZlsR11QDataStreamRK9QVector3D @ 12313 NONAME
- _ZlsR11QDataStreamRK9QVector4D @ 12314 NONAME
- _ZrsR11QDataStreamR10QMatrix4x4 @ 12315 NONAME
- _ZrsR11QDataStreamR11QQuaternion @ 12316 NONAME
- _ZrsR11QDataStreamR9QVector2D @ 12317 NONAME
- _ZrsR11QDataStreamR9QVector3D @ 12318 NONAME
- _ZrsR11QDataStreamR9QVector4D @ 12319 NONAME
- _ZN11QPanGestureC1EP7QWidgetP7QObject @ 12320 NONAME
- _ZN11QPanGestureC2EP7QWidgetP7QObject @ 12321 NONAME
- _ZN13QGraphicsItem17setGraphicsEffectEP15QGraphicsEffect @ 12322 NONAME
- _ZN13QPinchGestureC1EP7QWidgetP7QObject @ 12323 NONAME
- _ZN13QPinchGestureC2EP7QWidgetP7QObject @ 12324 NONAME
- _ZN14QGraphicsScale9setOriginERK9QVector3D @ 12325 NONAME
- _ZN14QGraphicsScale9setZScaleEf @ 12326 NONAME
- _ZN15QGraphicsEffect10setEnabledEb @ 12327 NONAME
- _ZN15QGraphicsEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12328 NONAME
- _ZN15QGraphicsEffect11qt_metacastEPKc @ 12329 NONAME
- _ZN15QGraphicsEffect13sourceChangedE6QFlagsINS_10ChangeFlagEE @ 12330 NONAME
- _ZN15QGraphicsEffect14enabledChangedEb @ 12331 NONAME
- _ZN15QGraphicsEffect16staticMetaObjectE @ 12332 NONAME DATA 16
- _ZN15QGraphicsEffect18updateBoundingRectEv @ 12333 NONAME
- _ZN15QGraphicsEffectC2EP7QObject @ 12334 NONAME
- _ZN15QGraphicsEffectC2ER22QGraphicsEffectPrivateP7QObject @ 12335 NONAME
- _ZN15QGraphicsEffectD0Ev @ 12336 NONAME
- _ZN15QGraphicsEffectD1Ev @ 12337 NONAME
- _ZN15QGraphicsEffectD2Ev @ 12338 NONAME
- _ZN17QGraphicsRotation9setOriginERK9QVector3D @ 12339 NONAME
- _ZN17QPixmapBlurFilter10setQualityEN2Qt18TransformationModeE @ 12340 NONAME ABSENT
- _ZN17QPixmapBlurFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 12341 NONAME
- _ZN17QPixmapBlurFilter11qt_metacastEPKc @ 12342 NONAME
- _ZN17QPixmapBlurFilter16staticMetaObjectE @ 12343 NONAME DATA 16
- _ZN17QPixmapBlurFilter9setRadiusEi @ 12344 NONAME
- _ZN17QPixmapBlurFilterC1EP7QObject @ 12345 NONAME
- _ZN17QPixmapBlurFilterC2EP7QObject @ 12346 NONAME
- _ZN17QPixmapBlurFilterD0Ev @ 12347 NONAME
- _ZN17QPixmapBlurFilterD1Ev @ 12348 NONAME
- _ZN17QPixmapBlurFilterD2Ev @ 12349 NONAME
- _ZN19QGraphicsBlurEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12350 NONAME
- _ZN19QGraphicsBlurEffect11qt_metacastEPKc @ 12351 NONAME
- _ZN19QGraphicsBlurEffect13setBlurRadiusEi @ 12352 NONAME
- _ZN19QGraphicsBlurEffect16staticMetaObjectE @ 12353 NONAME DATA 16
- _ZN19QGraphicsBlurEffect17blurRadiusChangedEi @ 12354 NONAME
- _ZN19QGraphicsBlurEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12355 NONAME
- _ZN19QGraphicsBlurEffectC1EP7QObject @ 12356 NONAME
- _ZN19QGraphicsBlurEffectC2EP7QObject @ 12357 NONAME
- _ZN19QGraphicsBlurEffectD0Ev @ 12358 NONAME
- _ZN19QGraphicsBlurEffectD1Ev @ 12359 NONAME
- _ZN19QGraphicsBlurEffectD2Ev @ 12360 NONAME
- _ZN20QGraphicsItemPrivate12resolveDepthEv @ 12361 NONAME
- _ZN20QGraphicsItemPrivate26invalidateDepthRecursivelyEv @ 12362 NONAME
- _ZN21QGraphicsAnchorLayout10invalidateEv @ 12363 NONAME
- _ZN21QGraphicsAnchorLayout10setSpacingEf @ 12364 NONAME
- _ZN21QGraphicsAnchorLayout11setGeometryERK6QRectF @ 12365 NONAME
- _ZN21QGraphicsAnchorLayout12removeAnchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 12366 NONAME ABSENT
- _ZN21QGraphicsAnchorLayout16addCornerAnchorsEP19QGraphicsLayoutItemN2Qt6CornerES1_S3_ @ 12367 NONAME
- _ZN21QGraphicsAnchorLayout16setAnchorSpacingEPK19QGraphicsLayoutItemN2Qt11AnchorPointES2_S4_f @ 12368 NONAME ABSENT
- _ZN21QGraphicsAnchorLayout18setVerticalSpacingEf @ 12369 NONAME
- _ZN21QGraphicsAnchorLayout18unsetAnchorSpacingEPK19QGraphicsLayoutItemN2Qt11AnchorPointES2_S4_ @ 12370 NONAME ABSENT
- _ZN21QGraphicsAnchorLayout20setHorizontalSpacingEf @ 12371 NONAME
- _ZN21QGraphicsAnchorLayout8removeAtEi @ 12372 NONAME
- _ZN21QGraphicsAnchorLayout9addAnchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 12373 NONAME
- _ZN21QGraphicsAnchorLayoutC1EP19QGraphicsLayoutItem @ 12374 NONAME
- _ZN21QGraphicsAnchorLayoutC2EP19QGraphicsLayoutItem @ 12375 NONAME
- _ZN21QGraphicsAnchorLayoutD0Ev @ 12376 NONAME
- _ZN21QGraphicsAnchorLayoutD1Ev @ 12377 NONAME
- _ZN21QGraphicsAnchorLayoutD2Ev @ 12378 NONAME
- _ZN21QGraphicsEffectSource11qt_metacallEN11QMetaObject4CallEiPPv @ 12379 NONAME
- _ZN21QGraphicsEffectSource11qt_metacastEPKc @ 12380 NONAME
- _ZN21QGraphicsEffectSource16staticMetaObjectE @ 12381 NONAME DATA 16
- _ZN21QGraphicsEffectSource4drawEP8QPainter @ 12382 NONAME
- _ZN21QGraphicsEffectSource6updateEv @ 12383 NONAME
- _ZN21QGraphicsEffectSourceC1ER28QGraphicsEffectSourcePrivateP7QObject @ 12384 NONAME
- _ZN21QGraphicsEffectSourceC2ER28QGraphicsEffectSourcePrivateP7QObject @ 12385 NONAME
- _ZN21QGraphicsEffectSourceD0Ev @ 12386 NONAME
- _ZN21QGraphicsEffectSourceD1Ev @ 12387 NONAME
- _ZN21QGraphicsEffectSourceD2Ev @ 12388 NONAME
- _ZN23QGraphicsColorizeEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12389 NONAME
- _ZN23QGraphicsColorizeEffect11qt_metacastEPKc @ 12390 NONAME
- _ZN23QGraphicsColorizeEffect12colorChangedERK6QColor @ 12391 NONAME
- _ZN23QGraphicsColorizeEffect16staticMetaObjectE @ 12392 NONAME DATA 16
- _ZN23QGraphicsColorizeEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12393 NONAME
- _ZN23QGraphicsColorizeEffect8setColorERK6QColor @ 12394 NONAME
- _ZN23QGraphicsColorizeEffectC1EP7QObject @ 12395 NONAME
- _ZN23QGraphicsColorizeEffectC2EP7QObject @ 12396 NONAME
- _ZN23QGraphicsColorizeEffectD0Ev @ 12397 NONAME
- _ZN23QGraphicsColorizeEffectD1Ev @ 12398 NONAME
- _ZN23QGraphicsColorizeEffectD2Ev @ 12399 NONAME
- _ZN23QGraphicsPixelizeEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12400 NONAME
- _ZN23QGraphicsPixelizeEffect11qt_metacastEPKc @ 12401 NONAME
- _ZN23QGraphicsPixelizeEffect12setPixelSizeEi @ 12402 NONAME
- _ZN23QGraphicsPixelizeEffect16pixelSizeChangedEi @ 12403 NONAME
- _ZN23QGraphicsPixelizeEffect16staticMetaObjectE @ 12404 NONAME DATA 16
- _ZN23QGraphicsPixelizeEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12405 NONAME
- _ZN23QGraphicsPixelizeEffectC1EP7QObject @ 12406 NONAME
- _ZN23QGraphicsPixelizeEffectC2EP7QObject @ 12407 NONAME
- _ZN23QGraphicsPixelizeEffectD0Ev @ 12408 NONAME
- _ZN23QGraphicsPixelizeEffectD1Ev @ 12409 NONAME
- _ZN23QGraphicsPixelizeEffectD2Ev @ 12410 NONAME
- _ZN23QPixmapDropShadowFilter13setBlurRadiusEi @ 12411 NONAME
- _ZN24QGraphicsGrayscaleEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12412 NONAME
- _ZN24QGraphicsGrayscaleEffect11qt_metacastEPKc @ 12413 NONAME
- _ZN24QGraphicsGrayscaleEffect16staticMetaObjectE @ 12414 NONAME DATA 16
- _ZN24QGraphicsGrayscaleEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12415 NONAME
- _ZN24QGraphicsGrayscaleEffectC1EP7QObject @ 12416 NONAME
- _ZN24QGraphicsGrayscaleEffectC2EP7QObject @ 12417 NONAME
- _ZN24QGraphicsGrayscaleEffectD0Ev @ 12418 NONAME
- _ZN24QGraphicsGrayscaleEffectD1Ev @ 12419 NONAME
- _ZN24QGraphicsGrayscaleEffectD2Ev @ 12420 NONAME
- _ZN25QGraphicsDropShadowEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12421 NONAME
- _ZN25QGraphicsDropShadowEffect11qt_metacastEPKc @ 12422 NONAME
- _ZN25QGraphicsDropShadowEffect12colorChangedERK6QColor @ 12423 NONAME
- _ZN25QGraphicsDropShadowEffect13offsetChangedERK7QPointF @ 12424 NONAME
- _ZN25QGraphicsDropShadowEffect13setBlurRadiusEi @ 12425 NONAME
- _ZN25QGraphicsDropShadowEffect16staticMetaObjectE @ 12426 NONAME DATA 16
- _ZN25QGraphicsDropShadowEffect17blurRadiusChangedEi @ 12427 NONAME
- _ZN25QGraphicsDropShadowEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12428 NONAME
- _ZN25QGraphicsDropShadowEffect8setColorERK6QColor @ 12429 NONAME
- _ZN25QGraphicsDropShadowEffect9setOffsetERK7QPointF @ 12430 NONAME
- _ZN25QGraphicsDropShadowEffectC1EP7QObject @ 12431 NONAME
- _ZN25QGraphicsDropShadowEffectC2EP7QObject @ 12432 NONAME
- _ZN25QGraphicsDropShadowEffectD0Ev @ 12433 NONAME
- _ZN25QGraphicsDropShadowEffectD1Ev @ 12434 NONAME
- _ZN25QGraphicsDropShadowEffectD2Ev @ 12435 NONAME
- _ZN7QWidget17setGraphicsEffectEP15QGraphicsEffect @ 12436 NONAME
- _ZN8QGesture16setGestureTargetEP7QObject @ 12437 NONAME
- _ZN8QGestureC2EP7QObjectS1_ @ 12438 NONAME
- _ZN8QGestureC2ER15QGesturePrivateP7QObjectS3_ @ 12439 NONAME
- _ZNK10QMatrix4x411toTransformEf @ 12440 NONAME
- _ZNK10QMatrix4x4cv8QVariantEv @ 12441 NONAME
- _ZNK11QQuaternioncv8QVariantEv @ 12442 NONAME
- _ZNK13QGraphicsItem14graphicsEffectEv @ 12443 NONAME
- _ZNK14QGraphicsScale6zScaleEv @ 12444 NONAME
- _ZNK14QGraphicsScale7applyToEP10QMatrix4x4 @ 12445 NONAME
- _ZNK15QGraphicsEffect10metaObjectEv @ 12446 NONAME
- _ZNK15QGraphicsEffect12boundingRectEv @ 12447 NONAME
- _ZNK15QGraphicsEffect15boundingRectForERK6QRectF @ 12448 NONAME
- _ZNK15QGraphicsEffect6sourceEv @ 12449 NONAME
- _ZNK15QGraphicsEffect9isEnabledEv @ 12450 NONAME
- _ZNK17QGraphicsRotation7applyToEP10QMatrix4x4 @ 12451 NONAME
- _ZNK17QPixmapBlurFilter10metaObjectEv @ 12452 NONAME
- _ZNK17QPixmapBlurFilter15boundingRectForERK6QRectF @ 12453 NONAME
- _ZNK17QPixmapBlurFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 12454 NONAME
- _ZNK17QPixmapBlurFilter6radiusEv @ 12455 NONAME
- _ZNK17QPixmapBlurFilter7qualityEv @ 12456 NONAME ABSENT
- _ZNK19QGraphicsBlurEffect10blurRadiusEv @ 12457 NONAME
- _ZNK19QGraphicsBlurEffect10metaObjectEv @ 12458 NONAME
- _ZNK19QGraphicsBlurEffect15boundingRectForERK6QRectF @ 12459 NONAME
- _ZNK20QGraphicsItemPrivate21effectiveBoundingRectEv @ 12460 NONAME
- _ZNK20QGraphicsItemPrivate26sceneEffectiveBoundingRectEv @ 12461 NONAME
- _ZNK20QGraphicsItemPrivate5depthEv @ 12462 NONAME
- _ZNK21QGraphicsAnchorLayout13anchorSpacingEPK19QGraphicsLayoutItemN2Qt11AnchorPointES2_S4_ @ 12463 NONAME ABSENT
- _ZNK21QGraphicsAnchorLayout15verticalSpacingEv @ 12464 NONAME
- _ZNK21QGraphicsAnchorLayout17horizontalSpacingEv @ 12465 NONAME
- _ZNK21QGraphicsAnchorLayout5countEv @ 12466 NONAME
- _ZNK21QGraphicsAnchorLayout6itemAtEi @ 12467 NONAME
- _ZNK21QGraphicsAnchorLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 12468 NONAME
- _ZNK21QGraphicsEffectSource10deviceRectEv @ 12469 NONAME
- _ZNK21QGraphicsEffectSource10metaObjectEv @ 12470 NONAME
- _ZNK21QGraphicsEffectSource11styleOptionEv @ 12471 NONAME
- _ZNK21QGraphicsEffectSource12boundingRectEN2Qt16CoordinateSystemE @ 12472 NONAME
- _ZNK21QGraphicsEffectSource12graphicsItemEv @ 12473 NONAME
- _ZNK21QGraphicsEffectSource6pixmapEN2Qt16CoordinateSystemEP6QPoint @ 12474 NONAME
- _ZNK21QGraphicsEffectSource6widgetEv @ 12475 NONAME
- _ZNK21QGraphicsEffectSource8isPixmapEv @ 12476 NONAME
- _ZNK23QGraphicsColorizeEffect10metaObjectEv @ 12477 NONAME
- _ZNK23QGraphicsColorizeEffect5colorEv @ 12478 NONAME
- _ZNK23QGraphicsPixelizeEffect10metaObjectEv @ 12479 NONAME
- _ZNK23QGraphicsPixelizeEffect9pixelSizeEv @ 12480 NONAME
- _ZNK24QGraphicsGrayscaleEffect10metaObjectEv @ 12481 NONAME
- _ZNK25QGraphicsDropShadowEffect10blurRadiusEv @ 12482 NONAME
- _ZNK25QGraphicsDropShadowEffect10metaObjectEv @ 12483 NONAME
- _ZNK25QGraphicsDropShadowEffect15boundingRectForERK6QRectF @ 12484 NONAME
- _ZNK25QGraphicsDropShadowEffect5colorEv @ 12485 NONAME
- _ZNK25QGraphicsDropShadowEffect6offsetEv @ 12486 NONAME
- _ZNK7QWidget14graphicsEffectEv @ 12487 NONAME
- _ZNK8QGesture13gestureTargetEv @ 12488 NONAME
- _ZNK9QVector2Dcv8QVariantEv @ 12489 NONAME
- _ZNK9QVector3Dcv8QVariantEv @ 12490 NONAME
- _ZNK9QVector4Dcv8QVariantEv @ 12491 NONAME
- _ZTI15QGraphicsEffect @ 12492 NONAME
- _ZTI17QPixmapBlurFilter @ 12493 NONAME
- _ZTI19QGraphicsBlurEffect @ 12494 NONAME
- _ZTI21QGraphicsAnchorLayout @ 12495 NONAME
- _ZTI21QGraphicsEffectSource @ 12496 NONAME
- _ZTI22QGraphicsEffectPrivate @ 12497 NONAME
- _ZTI23QGraphicsColorizeEffect @ 12498 NONAME
- _ZTI23QGraphicsPixelizeEffect @ 12499 NONAME
- _ZTI24QGraphicsGrayscaleEffect @ 12500 NONAME
- _ZTI25QGraphicsDropShadowEffect @ 12501 NONAME
- _ZTV15QGraphicsEffect @ 12502 NONAME
- _ZTV17QPixmapBlurFilter @ 12503 NONAME
- _ZTV19QGraphicsBlurEffect @ 12504 NONAME
- _ZTV21QGraphicsAnchorLayout @ 12505 NONAME
- _ZTV21QGraphicsEffectSource @ 12506 NONAME
- _ZTV22QGraphicsEffectPrivate @ 12507 NONAME
- _ZTV23QGraphicsColorizeEffect @ 12508 NONAME
- _ZTV23QGraphicsPixelizeEffect @ 12509 NONAME
- _ZTV24QGraphicsGrayscaleEffect @ 12510 NONAME
- _ZTV25QGraphicsDropShadowEffect @ 12511 NONAME
- _ZN10QBoxLayout19getStaticMetaObjectEv @ 12512 NONAME
- _ZN10QClipboard19getStaticMetaObjectEv @ 12513 NONAME
- _ZN10QCompleter19getStaticMetaObjectEv @ 12514 NONAME
- _ZN10QLCDNumber19getStaticMetaObjectEv @ 12515 NONAME
- _ZN10QScrollBar19getStaticMetaObjectEv @ 12516 NONAME
- _ZN10QStatusBar19getStaticMetaObjectEv @ 12517 NONAME
- _ZN10QTabWidget19getStaticMetaObjectEv @ 12518 NONAME
- _ZN10QTableView19getStaticMetaObjectEv @ 12519 NONAME
- _ZN10QTextFrame19getStaticMetaObjectEv @ 12520 NONAME
- _ZN10QTextTable19getStaticMetaObjectEv @ 12521 NONAME
- _ZN10QUndoGroup19getStaticMetaObjectEv @ 12522 NONAME
- _ZN10QUndoStack19getStaticMetaObjectEv @ 12523 NONAME
- _ZN10QValidator19getStaticMetaObjectEv @ 12524 NONAME
- _ZN10QWorkspace19getStaticMetaObjectEv @ 12525 NONAME
- _ZN11QColumnView19getStaticMetaObjectEv @ 12526 NONAME
- _ZN11QDockWidget19getStaticMetaObjectEv @ 12527 NONAME
- _ZN11QFileDialog19getStaticMetaObjectEv @ 12528 NONAME
- _ZN11QFocusFrame19getStaticMetaObjectEv @ 12529 NONAME
- _ZN11QFontDialog19getStaticMetaObjectEv @ 12530 NONAME
- _ZN11QFormLayout19getStaticMetaObjectEv @ 12531 NONAME
- _ZN11QGridLayout19getStaticMetaObjectEv @ 12532 NONAME
- _ZN11QHBoxLayout19getStaticMetaObjectEv @ 12533 NONAME
- _ZN11QHeaderView19getStaticMetaObjectEv @ 12534 NONAME
- _ZN11QListWidget19getStaticMetaObjectEv @ 12535 NONAME
- _ZN11QMainWindow19getStaticMetaObjectEv @ 12536 NONAME
- _ZN11QMessageBox19getStaticMetaObjectEv @ 12537 NONAME
- _ZN11QPanGesture19getStaticMetaObjectEv @ 12538 NONAME
- _ZN11QPixmapData8fromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 12539 NONAME
- _ZN11QProxyModel19getStaticMetaObjectEv @ 12540 NONAME
- _ZN11QProxyStyle19getStaticMetaObjectEv @ 12541 NONAME
- _ZN11QPushButton19getStaticMetaObjectEv @ 12542 NONAME
- _ZN11QRubberBand19getStaticMetaObjectEv @ 12543 NONAME
- _ZN11QScrollArea19getStaticMetaObjectEv @ 12544 NONAME
- _ZN11QSizePolicy19getStaticMetaObjectEv @ 12545 NONAME
- _ZN11QTextFormat19getStaticMetaObjectEv @ 12546 NONAME
- _ZN11QTextObject19getStaticMetaObjectEv @ 12547 NONAME
- _ZN11QToolButton19getStaticMetaObjectEv @ 12548 NONAME
- _ZN11QTreeWidget19getStaticMetaObjectEv @ 12549 NONAME
- _ZN11QVBoxLayout19getStaticMetaObjectEv @ 12550 NONAME
- _ZN11QWizardPage19getStaticMetaObjectEv @ 12551 NONAME
- _ZN12QActionGroup19getStaticMetaObjectEv @ 12552 NONAME
- _ZN12QApplication14navigationModeEv @ 12553 NONAME
- _ZN12QApplication14overrideCursorEv @ 12554 NONAME
- _ZN12QApplication17setNavigationModeEN2Qt14NavigationModeE @ 12555 NONAME
- _ZN12QApplication17setOverrideCursorERK7QCursor @ 12556 NONAME
- _ZN12QApplication19getStaticMetaObjectEv @ 12557 NONAME
- _ZN12QApplication20changeOverrideCursorERK7QCursor @ 12558 NONAME
- _ZN12QApplication21restoreOverrideCursorEv @ 12559 NONAME
- _ZN12QButtonGroup19getStaticMetaObjectEv @ 12560 NONAME
- _ZN12QColorDialog19getStaticMetaObjectEv @ 12561 NONAME
- _ZN12QCommonStyle19getStaticMetaObjectEv @ 12562 NONAME
- _ZN12QImageReader26setDecideFormatFromContentEb @ 12563 NONAME
- _ZN12QInputDialog19getStaticMetaObjectEv @ 12564 NONAME
- _ZN12QLineControl19getStaticMetaObjectEv @ 12565 NONAME
- _ZN12QPaintBuffer13beginNewFrameEv @ 12566 NONAME
- _ZN12QPaintBuffer15setBoundingRectERK6QRectF @ 12567 NONAME
- _ZN12QPaintBufferC1ERKS_ @ 12568 NONAME
- _ZN12QPaintBufferC1Ev @ 12569 NONAME
- _ZN12QPaintBufferC2ERKS_ @ 12570 NONAME
- _ZN12QPaintBufferC2Ev @ 12571 NONAME
- _ZN12QPaintBufferD0Ev @ 12572 NONAME
- _ZN12QPaintBufferD1Ev @ 12573 NONAME
- _ZN12QPaintBufferD2Ev @ 12574 NONAME
- _ZN12QPaintBufferaSERKS_ @ 12575 NONAME
- _ZN12QProgressBar19getStaticMetaObjectEv @ 12576 NONAME
- _ZN12QRadioButton19getStaticMetaObjectEv @ 12577 NONAME
- _ZN12QStylePlugin19getStaticMetaObjectEv @ 12578 NONAME
- _ZN12QTableWidget19getStaticMetaObjectEv @ 12579 NONAME
- _ZN12QTextBrowser19getStaticMetaObjectEv @ 12580 NONAME
- _ZN12QTextControl19getStaticMetaObjectEv @ 12581 NONAME
- _ZN13QDateTimeEdit19getStaticMetaObjectEv @ 12582 NONAME
- _ZN13QErrorMessage19getStaticMetaObjectEv @ 12583 NONAME
- _ZN13QFontComboBox19getStaticMetaObjectEv @ 12584 NONAME
- _ZN13QFontDatabase19getStaticMetaObjectEv @ 12585 NONAME
- _ZN13QGraphicsItem11unsetCursorEv @ 12586 NONAME
- _ZN13QGraphicsItem9setActiveEb @ 12587 NONAME
- _ZN13QGraphicsItem9setCursorERK7QCursor @ 12588 NONAME
- _ZN13QGraphicsView19getStaticMetaObjectEv @ 12589 NONAME
- _ZN13QInputContext19getStaticMetaObjectEv @ 12590 NONAME
- _ZN13QIntValidator19getStaticMetaObjectEv @ 12591 NONAME
- _ZN13QItemDelegate19getStaticMetaObjectEv @ 12592 NONAME
- _ZN13QMdiSubWindow19getStaticMetaObjectEv @ 12593 NONAME
- _ZN13QPinchGesture19getStaticMetaObjectEv @ 12594 NONAME
- _ZN13QPixmapFilter19getStaticMetaObjectEv @ 12595 NONAME
- _ZN13QSplashScreen19getStaticMetaObjectEv @ 12596 NONAME
- _ZN13QSwipeGesture11eventFilterEP7QObjectP6QEvent @ 12597 NONAME
- _ZN13QSwipeGesture11filterEventEP6QEvent @ 12598 NONAME
- _ZN13QSwipeGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 12599 NONAME
- _ZN13QSwipeGesture11qt_metacastEPKc @ 12600 NONAME
- _ZN13QSwipeGesture16staticMetaObjectE @ 12601 NONAME DATA 16
- _ZN13QSwipeGesture19getStaticMetaObjectEv @ 12602 NONAME
- _ZN13QSwipeGesture5resetEv @ 12603 NONAME
- _ZN13QSwipeGestureC1EP7QWidgetP7QObject @ 12604 NONAME
- _ZN13QSwipeGestureC2EP7QWidgetP7QObject @ 12605 NONAME
- _ZN13QTextDocument19getStaticMetaObjectEv @ 12606 NONAME
- _ZN13QWidgetAction19getStaticMetaObjectEv @ 12607 NONAME
- _ZN13QWindowsStyle19getStaticMetaObjectEv @ 12608 NONAME
- _ZN14QDesktopWidget19getStaticMetaObjectEv @ 12609 NONAME
- _ZN14QDoubleSpinBox19getStaticMetaObjectEv @ 12610 NONAME
- _ZN14QGraphicsScale19getStaticMetaObjectEv @ 12611 NONAME
- _ZN14QGraphicsScene14setActivePanelEP13QGraphicsItem @ 12612 NONAME
- _ZN14QGraphicsScene19getStaticMetaObjectEv @ 12613 NONAME
- _ZN14QImageIOPlugin19getStaticMetaObjectEv @ 12614 NONAME
- _ZN14QPlainTextEdit19getStaticMetaObjectEv @ 12615 NONAME
- _ZN14QStackedLayout19getStaticMetaObjectEv @ 12616 NONAME
- _ZN14QStackedWidget19getStaticMetaObjectEv @ 12617 NONAME
- _ZN14QWidgetPrivate13setCursor_sysERK7QCursor @ 12618 NONAME
- _ZN14QWidgetPrivate15unsetCursor_sysEv @ 12619 NONAME
- _ZN15QAbstractButton19getStaticMetaObjectEv @ 12620 NONAME
- _ZN15QAbstractSlider19getStaticMetaObjectEv @ 12621 NONAME
- _ZN15QCalendarWidget19getStaticMetaObjectEv @ 12622 NONAME
- _ZN15QColumnViewGrip19getStaticMetaObjectEv @ 12623 NONAME
- _ZN15QGraphicsAnchor10setSpacingEf @ 12624 NONAME
- _ZN15QGraphicsAnchor11qt_metacallEN11QMetaObject4CallEiPPv @ 12625 NONAME
- _ZN15QGraphicsAnchor11qt_metacastEPKc @ 12626 NONAME
- _ZN15QGraphicsAnchor12unsetSpacingEv @ 12627 NONAME
- _ZN15QGraphicsAnchor16staticMetaObjectE @ 12628 NONAME DATA 16
- _ZN15QGraphicsAnchor19getStaticMetaObjectEv @ 12629 NONAME
- _ZN15QGraphicsAnchorC1EP21QGraphicsAnchorLayout @ 12630 NONAME
- _ZN15QGraphicsAnchorC2EP21QGraphicsAnchorLayout @ 12631 NONAME
- _ZN15QGraphicsAnchorD0Ev @ 12632 NONAME
- _ZN15QGraphicsAnchorD1Ev @ 12633 NONAME
- _ZN15QGraphicsAnchorD2Ev @ 12634 NONAME
- _ZN15QGraphicsEffect19getStaticMetaObjectEv @ 12635 NONAME
- _ZN15QGraphicsEffect6updateEv @ 12636 NONAME
- _ZN15QGraphicsObject19getStaticMetaObjectEv @ 12637 NONAME
- _ZN15QGraphicsWidget19getStaticMetaObjectEv @ 12638 NONAME
- _ZN15QProgressDialog19getStaticMetaObjectEv @ 12639 NONAME
- _ZN15QSessionManager19getStaticMetaObjectEv @ 12640 NONAME
- _ZN15QSplitterHandle19getStaticMetaObjectEv @ 12641 NONAME
- _ZN15QTextBlockGroup19getStaticMetaObjectEv @ 12642 NONAME
- _ZN16QAbstractSpinBox19getStaticMetaObjectEv @ 12643 NONAME
- _ZN16QDialogButtonBox19getStaticMetaObjectEv @ 12644 NONAME
- _ZN16QDoubleValidator19getStaticMetaObjectEv @ 12645 NONAME
- _ZN16QFileSystemModel19getStaticMetaObjectEv @ 12646 NONAME
- _ZN16QPainterReplayer14setupTransformEP8QPainter @ 12647 NONAME
- _ZN16QPainterReplayer4drawERK12QPaintBufferP8QPainteri @ 12648 NONAME
- _ZN16QPainterReplayer7processERK19QPaintBufferCommand @ 12649 NONAME
- _ZN16QRegExpValidator19getStaticMetaObjectEv @ 12650 NONAME
- _ZN16QStringListModel19getStaticMetaObjectEv @ 12651 NONAME
- _ZN16QStyleSheetStyle19getStaticMetaObjectEv @ 12652 NONAME
- _ZN17QAbstractItemView19getStaticMetaObjectEv @ 12653 NONAME
- _ZN17QDataWidgetMapper19getStaticMetaObjectEv @ 12654 NONAME
- _ZN17QDockWidgetLayout19getStaticMetaObjectEv @ 12655 NONAME
- _ZN17QFileInfoGatherer19getStaticMetaObjectEv @ 12656 NONAME
- _ZN17QGraphicsRotation19getStaticMetaObjectEv @ 12657 NONAME
- _ZN17QGraphicsTextItem19getStaticMetaObjectEv @ 12658 NONAME
- _ZN17QIconEnginePlugin19getStaticMetaObjectEv @ 12659 NONAME
- _ZN17QMainWindowLayout19getStaticMetaObjectEv @ 12660 NONAME
- _ZN17QPixmapBlurFilter19getStaticMetaObjectEv @ 12661 NONAME
- _ZN18QCommandLinkButton19getStaticMetaObjectEv @ 12662 NONAME
- _ZN18QGraphicsTransform19getStaticMetaObjectEv @ 12663 NONAME
- _ZN18QStandardItemModel19getStaticMetaObjectEv @ 12664 NONAME
- _ZN18QSyntaxHighlighter19getStaticMetaObjectEv @ 12665 NONAME
- _ZN19QAbstractProxyModel19getStaticMetaObjectEv @ 12666 NONAME
- _ZN19QAbstractScrollArea19getStaticMetaObjectEv @ 12667 NONAME
- _ZN19QApplicationPrivate14navigationModeE @ 12668 NONAME DATA 4
- _ZN19QApplicationPrivate17setNavigationModeEN2Qt14NavigationModeE @ 12669 NONAME
- _ZN19QCoeFepInputContext19getStaticMetaObjectEv @ 12670 NONAME
- _ZN19QEventDispatcherS6019getStaticMetaObjectEv @ 12671 NONAME
- _ZN19QGraphicsBlurEffect19getStaticMetaObjectEv @ 12672 NONAME
- _ZN19QGraphicsSceneIndex19getStaticMetaObjectEv @ 12673 NONAME
- _ZN19QIconEnginePluginV219getStaticMetaObjectEv @ 12674 NONAME
- _ZN19QInputContextPlugin19getStaticMetaObjectEv @ 12675 NONAME
- _ZN19QItemSelectionModel19getStaticMetaObjectEv @ 12676 NONAME
- _ZN19QKeyEventTransition19getStaticMetaObjectEv @ 12677 NONAME
- _ZN19QStyledItemDelegate19getStaticMetaObjectEv @ 12678 NONAME
- _ZN19QTextDocumentLayout19getStaticMetaObjectEv @ 12679 NONAME
- _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItem @ 12680 NONAME
- _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItem @ 12681 NONAME
- _ZN20QGraphicsItemPrivate14setFocusHelperEN2Qt11FocusReasonEb @ 12682 NONAME
- _ZN20QGraphicsItemPrivate18subFocusItemChangeEv @ 12683 NONAME
- _ZN20QGraphicsProxyWidget19getStaticMetaObjectEv @ 12684 NONAME
- _ZN20QGraphicsViewPrivate20_q_setViewportCursorERK7QCursor @ 12685 NONAME
- _ZN20QGraphicsViewPrivate22_q_unsetViewportCursorEv @ 12686 NONAME
- _ZN20QPaintBufferResource11qt_metacallEN11QMetaObject4CallEiPPv @ 12687 NONAME
- _ZN20QPaintBufferResource11qt_metacastEPKc @ 12688 NONAME
- _ZN20QPaintBufferResource16staticMetaObjectE @ 12689 NONAME DATA 16
- _ZN20QPaintBufferResource19getStaticMetaObjectEv @ 12690 NONAME
- _ZN20QPaintBufferResource5valueEPK19QPaintBufferPrivate @ 12691 NONAME
- _ZN20QPaintBufferResource6insertEPK19QPaintBufferPrivatePv @ 12692 NONAME
- _ZN20QPaintBufferResource6removeEPK19QPaintBufferPrivate @ 12693 NONAME
- _ZN20QPaintBufferResourceC1EPFvPvEP7QObject @ 12694 NONAME
- _ZN20QPaintBufferResourceC2EPFvPvEP7QObject @ 12695 NONAME
- _ZN20QPaintBufferResourceD0Ev @ 12696 NONAME
- _ZN20QPaintBufferResourceD1Ev @ 12697 NONAME
- _ZN20QPaintBufferResourceD2Ev @ 12698 NONAME
- _ZN20QPictureFormatPlugin19getStaticMetaObjectEv @ 12699 NONAME
- _ZN20QWidgetResizeHandler19getStaticMetaObjectEv @ 12700 NONAME
- _ZN21QAbstractItemDelegate19getStaticMetaObjectEv @ 12701 NONAME
- _ZN21QGraphicsAnchorLayout10addAnchorsEP19QGraphicsLayoutItemS1_6QFlagsIN2Qt11OrientationEE @ 12702 NONAME
- _ZN21QGraphicsAnchorLayout6anchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 12703 NONAME
- _ZN21QGraphicsEffectSource19getStaticMetaObjectEv @ 12704 NONAME
- _ZN21QGraphicsSystemPlugin19getStaticMetaObjectEv @ 12705 NONAME
- _ZN21QMouseEventTransition19getStaticMetaObjectEv @ 12706 NONAME
- _ZN21QPixmapColorizeFilter11setStrengthEf @ 12707 NONAME
- _ZN21QPixmapColorizeFilter19getStaticMetaObjectEv @ 12708 NONAME
- _ZN21QSortFilterProxyModel19getStaticMetaObjectEv @ 12709 NONAME
- _ZN22QGraphicsItemAnimation19getStaticMetaObjectEv @ 12710 NONAME
- _ZN22QGraphicsOpacityEffect10setOpacityEf @ 12711 NONAME
- _ZN22QGraphicsOpacityEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 12712 NONAME
- _ZN22QGraphicsOpacityEffect11qt_metacastEPKc @ 12713 NONAME
- _ZN22QGraphicsOpacityEffect14opacityChangedEf @ 12714 NONAME
- _ZN22QGraphicsOpacityEffect14setOpacityMaskERK6QBrush @ 12715 NONAME
- _ZN22QGraphicsOpacityEffect16staticMetaObjectE @ 12716 NONAME DATA 16
- _ZN22QGraphicsOpacityEffect18opacityMaskChangedERK6QBrush @ 12717 NONAME
- _ZN22QGraphicsOpacityEffect19getStaticMetaObjectEv @ 12718 NONAME
- _ZN22QGraphicsOpacityEffect4drawEP8QPainterP21QGraphicsEffectSource @ 12719 NONAME
- _ZN22QGraphicsOpacityEffectC1EP7QObject @ 12720 NONAME
- _ZN22QGraphicsOpacityEffectC2EP7QObject @ 12721 NONAME
- _ZN22QGraphicsOpacityEffectD0Ev @ 12722 NONAME
- _ZN22QGraphicsOpacityEffectD1Ev @ 12723 NONAME
- _ZN22QGraphicsOpacityEffectD2Ev @ 12724 NONAME
- _ZN22QPaintEngineExReplayer7processERK19QPaintBufferCommand @ 12725 NONAME
- _ZN23QGraphicsColorizeEffect11setStrengthEf @ 12726 NONAME
- _ZN23QGraphicsColorizeEffect15strengthChangedEf @ 12727 NONAME
- _ZN23QGraphicsColorizeEffect19getStaticMetaObjectEv @ 12728 NONAME
- _ZN23QGraphicsPixelizeEffect19getStaticMetaObjectEv @ 12729 NONAME
- _ZN23QPaintBufferSignalProxy11qt_metacallEN11QMetaObject4CallEiPPv @ 12730 NONAME
- _ZN23QPaintBufferSignalProxy11qt_metacastEPKc @ 12731 NONAME
- _ZN23QPaintBufferSignalProxy14aboutToDestroyEPK19QPaintBufferPrivate @ 12732 NONAME
- _ZN23QPaintBufferSignalProxy16staticMetaObjectE @ 12733 NONAME DATA 16
- _ZN23QPaintBufferSignalProxy19getStaticMetaObjectEv @ 12734 NONAME
- _ZN23QPaintBufferSignalProxy8instanceEv @ 12735 NONAME
- _ZN23QPixmapDropShadowFilter19getStaticMetaObjectEv @ 12736 NONAME
- _ZN24QBasicKeyEventTransition19getStaticMetaObjectEv @ 12737 NONAME
- _ZN24QComboBoxPrivateScroller19getStaticMetaObjectEv @ 12738 NONAME
- _ZN24QGraphicsGrayscaleEffect11setStrengthEf @ 12739 NONAME
- _ZN24QGraphicsGrayscaleEffect15strengthChangedEf @ 12740 NONAME
- _ZN24QGraphicsGrayscaleEffect19getStaticMetaObjectEv @ 12741 NONAME
- _ZN24QPixmapConvolutionFilter19getStaticMetaObjectEv @ 12742 NONAME
- _ZN24QPlainTextDocumentLayout19getStaticMetaObjectEv @ 12743 NONAME
- _ZN25QComboBoxPrivateContainer19getStaticMetaObjectEv @ 12744 NONAME
- _ZN25QGraphicsDropShadowEffect19getStaticMetaObjectEv @ 12745 NONAME
- _ZN25QGraphicsSceneLinearIndex19getStaticMetaObjectEv @ 12746 NONAME
- _ZN26QBasicMouseEventTransition19getStaticMetaObjectEv @ 12747 NONAME
- _ZN26QGraphicsSceneBspTreeIndex19getStaticMetaObjectEv @ 12748 NONAME
- _ZN27QAbstractTextDocumentLayout19getStaticMetaObjectEv @ 12749 NONAME
- _ZN5QDial19getStaticMetaObjectEv @ 12750 NONAME
- _ZN5QDrag19getStaticMetaObjectEv @ 12751 NONAME
- _ZN5QFont19getStaticMetaObjectEv @ 12752 NONAME
- _ZN5QMenu19getStaticMetaObjectEv @ 12753 NONAME
- _ZN6QColor6setHslEiiii @ 12754 NONAME
- _ZN6QColor7fromHslEiiii @ 12755 NONAME
- _ZN6QColor7setHslFEffff @ 12756 NONAME
- _ZN6QColor8fromHslFEffff @ 12757 NONAME
- _ZN6QFrame19getStaticMetaObjectEv @ 12758 NONAME
- _ZN6QLabel19getStaticMetaObjectEv @ 12759 NONAME
- _ZN6QMovie19getStaticMetaObjectEv @ 12760 NONAME
- _ZN6QSound19getStaticMetaObjectEv @ 12761 NONAME
- _ZN6QStyle19getStaticMetaObjectEv @ 12762 NONAME
- _ZN7QAction19getStaticMetaObjectEv @ 12763 NONAME
- _ZN7QCursor8setShapeEN2Qt11CursorShapeE @ 12764 NONAME
- _ZN7QCursorC1EN2Qt11CursorShapeE @ 12765 NONAME
- _ZN7QCursorC1ERK7QBitmapS2_ii @ 12766 NONAME
- _ZN7QCursorC1ERK7QPixmapii @ 12767 NONAME
- _ZN7QCursorC1ERKS_ @ 12768 NONAME
- _ZN7QCursorC1Ev @ 12769 NONAME
- _ZN7QCursorC2EN2Qt11CursorShapeE @ 12770 NONAME
- _ZN7QCursorC2ERK7QBitmapS2_ii @ 12771 NONAME
- _ZN7QCursorC2ERK7QPixmapii @ 12772 NONAME
- _ZN7QCursorC2ERKS_ @ 12773 NONAME
- _ZN7QCursorC2Ev @ 12774 NONAME
- _ZN7QCursorD1Ev @ 12775 NONAME
- _ZN7QCursorD2Ev @ 12776 NONAME
- _ZN7QCursoraSERKS_ @ 12777 NONAME
- _ZN7QDialog19getStaticMetaObjectEv @ 12778 NONAME
- _ZN7QLayout19getStaticMetaObjectEv @ 12779 NONAME
- _ZN7QSlider19getStaticMetaObjectEv @ 12780 NONAME
- _ZN7QTabBar19getStaticMetaObjectEv @ 12781 NONAME
- _ZN7QWidget11unsetCursorEv @ 12782 NONAME
- _ZN7QWidget18setContentsMarginsERK8QMargins @ 12783 NONAME
- _ZN7QWidget19getStaticMetaObjectEv @ 12784 NONAME
- _ZN7QWidget9grabMouseERK7QCursor @ 12785 NONAME
- _ZN7QWidget9setCursorERK7QCursor @ 12786 NONAME
- _ZN7QWizard19getStaticMetaObjectEv @ 12787 NONAME
- _ZN8QGesture19getStaticMetaObjectEv @ 12788 NONAME
- _ZN8QMdiArea19getStaticMetaObjectEv @ 12789 NONAME
- _ZN8QMenuBar19getStaticMetaObjectEv @ 12790 NONAME
- _ZN8QPainter17endNativePaintingEv @ 12791 NONAME
- _ZN8QPainter19beginNativePaintingEv @ 12792 NONAME
- _ZN8QPainter19getStaticMetaObjectEv @ 12793 NONAME
- _ZN8QPalette19getStaticMetaObjectEv @ 12794 NONAME
- _ZN8QSidebar19getStaticMetaObjectEv @ 12795 NONAME
- _ZN8QSpinBox19getStaticMetaObjectEv @ 12796 NONAME
- _ZN8QToolBar19getStaticMetaObjectEv @ 12797 NONAME
- _ZN8QToolBox19getStaticMetaObjectEv @ 12798 NONAME
- _ZN9QCheckBox19getStaticMetaObjectEv @ 12799 NONAME
- _ZN9QComboBox19getStaticMetaObjectEv @ 12800 NONAME
- _ZN9QDateEdit19getStaticMetaObjectEv @ 12801 NONAME
- _ZN9QDirModel19getStaticMetaObjectEv @ 12802 NONAME
- _ZN9QGradient19getStaticMetaObjectEv @ 12803 NONAME
- _ZN9QGroupBox19getStaticMetaObjectEv @ 12804 NONAME
- _ZN9QLineEdit19getStaticMetaObjectEv @ 12805 NONAME
- _ZN9QListView19getStaticMetaObjectEv @ 12806 NONAME
- _ZN9QS60Style19getStaticMetaObjectEv @ 12807 NONAME
- _ZN9QS60Style5eventEP6QEvent @ 12808 NONAME
- _ZN9QShortcut19getStaticMetaObjectEv @ 12809 NONAME
- _ZN9QSizeGrip19getStaticMetaObjectEv @ 12810 NONAME
- _ZN9QSplitter19getStaticMetaObjectEv @ 12811 NONAME
- _ZN9QTextEdit19getStaticMetaObjectEv @ 12812 NONAME
- _ZN9QTextList19getStaticMetaObjectEv @ 12813 NONAME
- _ZN9QTimeEdit19getStaticMetaObjectEv @ 12814 NONAME
- _ZN9QTreeView19getStaticMetaObjectEv @ 12815 NONAME
- _ZN9QUndoView19getStaticMetaObjectEv @ 12816 NONAME
- _ZN9QUrlModel19getStaticMetaObjectEv @ 12817 NONAME
- _ZNK11QPanGesture6offsetEv @ 12818 NONAME
- _ZNK12QImageReader23decideFormatFromContentEv @ 12819 NONAME
- _ZNK12QPaintBuffer11paintEngineEv @ 12820 NONAME
- _ZNK12QPaintBuffer12boundingRectEv @ 12821 NONAME
- _ZNK12QPaintBuffer4drawEP8QPainteri @ 12822 NONAME
- _ZNK12QPaintBuffer6metricEN12QPaintDevice17PaintDeviceMetricE @ 12823 NONAME
- _ZNK12QPaintBuffer7devTypeEv @ 12824 NONAME
- _ZNK12QPaintBuffer7isEmptyEv @ 12825 NONAME
- _ZNK12QPaintBuffer9numFramesEv @ 12826 NONAME
- _ZNK13QGraphicsItem14focusScopeItemEv @ 12827 NONAME
- _ZNK13QGraphicsItem5panelEv @ 12828 NONAME
- _ZNK13QGraphicsItem6cursorEv @ 12829 NONAME
- _ZNK13QGraphicsItem7isPanelEv @ 12830 NONAME
- _ZNK13QGraphicsItem8isActiveEv @ 12831 NONAME
- _ZNK13QGraphicsItem9hasCursorEv @ 12832 NONAME
- _ZNK13QPinchGesture11whatChangedEv @ 12833 NONAME
- _ZNK13QPinchGesture16totalScaleFactorEv @ 12834 NONAME
- _ZNK13QPinchGesture18totalRotationAngleEv @ 12835 NONAME
- _ZNK13QSwipeGesture10metaObjectEv @ 12836 NONAME
- _ZNK13QSwipeGesture10swipeAngleEv @ 12837 NONAME
- _ZNK13QSwipeGesture17verticalDirectionEv @ 12838 NONAME
- _ZNK13QSwipeGesture19horizontalDirectionEv @ 12839 NONAME
- _ZNK14QGraphicsScene11activePanelEv @ 12840 NONAME
- _ZNK14QGraphicsScene8isActiveEv @ 12841 NONAME
- _ZNK15QGraphicsAnchor10metaObjectEv @ 12842 NONAME
- _ZNK15QGraphicsAnchor7spacingEv @ 12843 NONAME
- _ZNK20QPaintBufferResource10metaObjectEv @ 12844 NONAME
- _ZNK21QPixmapColorizeFilter8strengthEv @ 12845 NONAME
- _ZNK22QGraphicsOpacityEffect10metaObjectEv @ 12846 NONAME
- _ZNK22QGraphicsOpacityEffect11opacityMaskEv @ 12847 NONAME
- _ZNK22QGraphicsOpacityEffect7opacityEv @ 12848 NONAME
- _ZNK23QGraphicsColorizeEffect8strengthEv @ 12849 NONAME
- _ZNK23QPaintBufferSignalProxy10metaObjectEv @ 12850 NONAME
- _ZNK24QGraphicsGrayscaleEffect8strengthEv @ 12851 NONAME
- _ZNK6QColor10lightnessFEv @ 12852 NONAME
- _ZNK6QColor13hslSaturationEv @ 12853 NONAME
- _ZNK6QColor13hsvSaturationEv @ 12854 NONAME
- _ZNK6QColor14hslSaturationFEv @ 12855 NONAME
- _ZNK6QColor14hsvSaturationFEv @ 12856 NONAME
- _ZNK6QColor5toHslEv @ 12857 NONAME
- _ZNK6QColor6getHslEPiS0_S0_S0_ @ 12858 NONAME
- _ZNK6QColor6hslHueEv @ 12859 NONAME
- _ZNK6QColor6hsvHueEv @ 12860 NONAME
- _ZNK6QColor7getHslFEPfS0_S0_S0_ @ 12861 NONAME
- _ZNK6QColor7hslHueFEv @ 12862 NONAME
- _ZNK6QColor7hsvHueFEv @ 12863 NONAME
- _ZNK6QColor9lightnessEv @ 12864 NONAME
- _ZNK7QCursor4maskEv @ 12865 NONAME
- _ZNK7QCursor5shapeEv @ 12866 NONAME
- _ZNK7QCursor6bitmapEv @ 12867 NONAME
- _ZNK7QCursor6handleEv @ 12868 NONAME
- _ZNK7QCursor6pixmapEv @ 12869 NONAME
- _ZNK7QCursor7hotSpotEv @ 12870 NONAME
- _ZNK7QCursorcv8QVariantEv @ 12871 NONAME
- _ZNK7QWidget15contentsMarginsEv @ 12872 NONAME
- _ZNK7QWidget6cursorEv @ 12873 NONAME
- _ZTI10AnchorData @ 12874 NONAME ABSENT ; #<TI>#
- _ZTI11PixmapEntry @ 12875 NONAME ABSENT ; #<TI>#
- _ZTI12QPaintBuffer @ 12876 NONAME ; #<TI>#
- _ZTI13QS60MainAppUi @ 12877 NONAME ; #<TI>#
- _ZTI13QSwipeGesture @ 12878 NONAME ; #<TI>#
- _ZTI13ScalableEntry @ 12879 NONAME ABSENT ; #<TI>#
- _ZTI15QGesturePrivate @ 12880 NONAME ABSENT ; #<TI>#
- _ZTI15QGraphicsAnchor @ 12881 NONAME ; #<TI>#
- _ZTI16QPainterReplayer @ 12882 NONAME ; #<TI>#
- _ZTI16QS60MainDocument @ 12883 NONAME ; #<TI>#
- _ZTI16QTreeViewPrivate @ 12884 NONAME ABSENT ; #<TI>#
- _ZTI17QIconLoaderEngine @ 12885 NONAME ABSENT ; #<TI>#
- _ZTI17QIconModeViewBase @ 12886 NONAME ABSENT ; #<TI>#
- _ZTI17QListModeViewBase @ 12887 NONAME ABSENT ; #<TI>#
- _ZTI18ParallelAnchorData @ 12888 NONAME ABSENT ; #<TI>#
- _ZTI18QHeaderViewPrivate @ 12889 NONAME ABSENT ; #<TI>#
- _ZTI18QPaintBufferEngine @ 12890 NONAME ABSENT ; #<TI>#
- _ZTI18QPanGesturePrivate @ 12891 NONAME ABSENT ; #<TI>#
- _ZTI19QCommonListViewBase @ 12892 NONAME ABSENT ; #<TI>#
- _ZTI19QS60MainApplication @ 12893 NONAME ; #<TI>#
- _ZTI20QPaintBufferResource @ 12894 NONAME ; #<TI>#
- _ZTI20QPinchGesturePrivate @ 12895 NONAME ABSENT ; #<TI>#
- _ZTI20QSwipeGesturePrivate @ 12896 NONAME ABSENT ; #<TI>#
- _ZTI20SequentialAnchorData @ 12897 NONAME ABSENT ; #<TI>#
- _ZTI22QGraphicsAnchorPrivate @ 12898 NONAME ABSENT ; #<TI>#
- _ZTI22QGraphicsOpacityEffect @ 12899 NONAME ; #<TI>#
- _ZTI22QPaintEngineExReplayer @ 12900 NONAME ; #<TI>#
- _ZTI23QPaintBufferSignalProxy @ 12901 NONAME ; #<TI>#
- _ZTI26QGraphicsSceneIndexPrivate @ 12902 NONAME ABSENT ; #<TI>#
- _ZTI26QWidgetEffectSourcePrivate @ 12903 NONAME ABSENT ; #<TI>#
- _ZTI32QGraphicsItemEffectSourcePrivate @ 12904 NONAME ABSENT ; #<TI>#
- _ZTI8QSimplex @ 12905 NONAME ABSENT ; #<TI>#
- _ZTV10AnchorData @ 12906 NONAME ABSENT ; #<VT>#
- _ZTV11PixmapEntry @ 12907 NONAME ABSENT ; #<VT>#
- _ZTV12QPaintBuffer @ 12908 NONAME ; #<VT>#
- _ZTV13QS60MainAppUi @ 12909 NONAME ; #<VT>#
- _ZTV13QSwipeGesture @ 12910 NONAME ; #<VT>#
- _ZTV13ScalableEntry @ 12911 NONAME ABSENT ; #<VT>#
- _ZTV15QGesturePrivate @ 12912 NONAME ABSENT ; #<VT>#
- _ZTV15QGraphicsAnchor @ 12913 NONAME ; #<VT>#
- _ZTV16QPainterReplayer @ 12914 NONAME ; #<VT>#
- _ZTV16QS60MainDocument @ 12915 NONAME ; #<VT>#
- _ZTV16QTreeViewPrivate @ 12916 NONAME ABSENT ; #<VT>#
- _ZTV17QIconLoaderEngine @ 12917 NONAME ABSENT ; #<VT>#
- _ZTV17QIconModeViewBase @ 12918 NONAME ABSENT ; #<VT>#
- _ZTV17QListModeViewBase @ 12919 NONAME ABSENT ; #<VT>#
- _ZTV18ParallelAnchorData @ 12920 NONAME ABSENT ; #<VT>#
- _ZTV18QHeaderViewPrivate @ 12921 NONAME ABSENT ; #<VT>#
- _ZTV18QPaintBufferEngine @ 12922 NONAME ABSENT ; #<VT>#
- _ZTV18QPanGesturePrivate @ 12923 NONAME ABSENT ; #<VT>#
- _ZTV19QCommonListViewBase @ 12924 NONAME ABSENT ; #<VT>#
- _ZTV19QS60MainApplication @ 12925 NONAME ; #<VT>#
- _ZTV20QPaintBufferResource @ 12926 NONAME ; #<VT>#
- _ZTV20QPinchGesturePrivate @ 12927 NONAME ABSENT ; #<VT>#
- _ZTV20QSwipeGesturePrivate @ 12928 NONAME ABSENT ; #<VT>#
- _ZTV20SequentialAnchorData @ 12929 NONAME ABSENT ; #<VT>#
- _ZTV22QGraphicsAnchorPrivate @ 12930 NONAME ABSENT ; #<VT>#
- _ZTV22QGraphicsOpacityEffect @ 12931 NONAME ; #<VT>#
- _ZTV22QPaintEngineExReplayer @ 12932 NONAME ; #<VT>#
- _ZTV23QPaintBufferSignalProxy @ 12933 NONAME ; #<VT>#
- _ZTV26QGraphicsSceneIndexPrivate @ 12934 NONAME ABSENT ; #<VT>#
- _ZTV26QWidgetEffectSourcePrivate @ 12935 NONAME ABSENT ; #<VT>#
- _ZTV32QGraphicsItemEffectSourcePrivate @ 12936 NONAME ABSENT ; #<VT>#
- _ZTV8QSimplex @ 12937 NONAME ABSENT ; #<VT>#
- _ZlsR11QDataStreamRK12QPaintBuffer @ 12938 NONAME
- _ZlsR11QDataStreamRK7QCursor @ 12939 NONAME
- _ZrsR11QDataStreamR12QPaintBuffer @ 12940 NONAME
- _ZrsR11QDataStreamR7QCursor @ 12941 NONAME
- _ZN11QPixmapData12toNativeTypeENS_10NativeTypeE @ 12942 NONAME
- _ZN11QPixmapData14fromNativeTypeEPvNS_10NativeTypeE @ 12943 NONAME
- _ZN12QApplicationC1EPFP15CApaApplicationvERiPPc @ 12944 NONAME
- _ZN12QApplicationC1EPFP15CApaApplicationvERiPPci @ 12945 NONAME
- _ZN12QApplicationC2EPFP15CApaApplicationvERiPPc @ 12946 NONAME
- _ZN12QApplicationC2EPFP15CApaApplicationvERiPPci @ 12947 NONAME
- _ZN13QS60MainAppUi10ConstructLEv @ 12948 NONAME
- _ZN13QS60MainAppUi12RestoreMenuLEP11CCoeControliN16MEikMenuObserver9TMenuTypeE @ 12949 NONAME
- _ZN13QS60MainAppUi14HandleCommandLEi @ 12950 NONAME
- _ZN13QS60MainAppUi14HandleWsEventLERK8TWsEventP11CCoeControl @ 12951 NONAME
- _ZN13QS60MainAppUi15DynInitMenuBarLEiP11CEikMenuBar @ 12952 NONAME
- _ZN13QS60MainAppUi16DynInitMenuPaneLEiP12CEikMenuPane @ 12953 NONAME
- _ZN13QS60MainAppUi21HandleResourceChangeLEi @ 12954 NONAME
- _ZN13QS60MainAppUi26HandleStatusPaneSizeChangeEv @ 12955 NONAME
- _ZN13QS60MainAppUiC1Ev @ 12956 NONAME
- _ZN13QS60MainAppUiC2Ev @ 12957 NONAME
- _ZN13QS60MainAppUiD0Ev @ 12958 NONAME
- _ZN13QS60MainAppUiD1Ev @ 12959 NONAME
- _ZN13QS60MainAppUiD2Ev @ 12960 NONAME
- _ZN14QPaintEngineEx15drawRoundedRectERK6QRectFffN2Qt8SizeModeE @ 12961 NONAME
- _ZN14QWidgetPrivate19navigateToDirectionENS_9DirectionE @ 12962 NONAME
- _ZN14QWidgetPrivate19registerTouchWindowEv @ 12963 NONAME
- _ZN14QWidgetPrivate27widgetInNavigationDirectionENS_9DirectionE @ 12964 NONAME
- _ZN15QGraphicsLayout18addChildLayoutItemEP19QGraphicsLayoutItem @ 12965 NONAME
- _ZN15QSoftKeyManager11qt_metacallEN11QMetaObject4CallEiPPv @ 12966 NONAME
- _ZN15QSoftKeyManager11qt_metacastEPKc @ 12967 NONAME
- _ZN15QSoftKeyManager12createActionENS_15StandardSoftKeyEP7QWidget @ 12968 NONAME
- _ZN15QSoftKeyManager12sendKeyEventEv @ 12969 NONAME
- _ZN15QSoftKeyManager13handleCommandEi @ 12970 NONAME
- _ZN15QSoftKeyManager14updateSoftKeysEv @ 12971 NONAME
- _ZN15QSoftKeyManager16staticMetaObjectE @ 12972 NONAME DATA 16
- _ZN15QSoftKeyManager17createKeyedActionENS_15StandardSoftKeyEN2Qt3KeyEP7QWidget @ 12973 NONAME
- _ZN15QSoftKeyManager19getStaticMetaObjectEv @ 12974 NONAME
- _ZN15QSoftKeyManager19standardSoftKeyTextENS_15StandardSoftKeyE @ 12975 NONAME
- _ZN15QSoftKeyManager5eventEP6QEvent @ 12976 NONAME
- _ZN15QSoftKeyManager8instanceEv @ 12977 NONAME
- _ZN15QSoftKeyManagerC1Ev @ 12978 NONAME
- _ZN15QSoftKeyManagerC2Ev @ 12979 NONAME
- _ZN16QS60MainDocument12CreateAppUiLEv @ 12980 NONAME
- _ZN16QS60MainDocumentC1ER15CEikApplication @ 12981 NONAME
- _ZN16QS60MainDocumentC2ER15CEikApplication @ 12982 NONAME
- _ZN16QS60MainDocumentD0Ev @ 12983 NONAME
- _ZN16QS60MainDocumentD1Ev @ 12984 NONAME
- _ZN16QS60MainDocumentD2Ev @ 12985 NONAME
- _ZN17QPixmapBlurFilter11setBlurHintENS_8BlurHintE @ 12986 NONAME ABSENT
- _ZN19QGraphicsBlurEffect11setBlurHintENS_8BlurHintE @ 12987 NONAME ABSENT
- _ZN19QGraphicsBlurEffect15blurHintChangedENS_8BlurHintE @ 12988 NONAME ABSENT
- _ZN19QS60MainApplication15CreateDocumentLEv @ 12989 NONAME
- _ZN19QS60MainApplicationC1Ev @ 12990 NONAME
- _ZN19QS60MainApplicationC2Ev @ 12991 NONAME
- _ZN19QS60MainApplicationD0Ev @ 12992 NONAME
- _ZN19QS60MainApplicationD1Ev @ 12993 NONAME
- _ZN19QS60MainApplicationD2Ev @ 12994 NONAME
- _ZN7QDialog19s60AdjustedPositionEv @ 12995 NONAME
- _ZN7QDialog5eventEP6QEvent @ 12996 NONAME
- _ZN7QPixmap19fromSymbianRSgImageEP8RSgImage @ 12997 NONAME
- _ZNK15QSoftKeyManager10metaObjectEv @ 12998 NONAME
- _ZNK17QPixmapBlurFilter8blurHintEv @ 12999 NONAME
- _ZNK19QGraphicsBlurEffect8blurHintEv @ 13000 NONAME
- _ZNK19QS60MainApplication16ResourceFileNameEv @ 13001 NONAME
- _ZNK19QS60MainApplication9AppDllUidEv @ 13002 NONAME
- _ZNK21QGraphicsAnchorLayout12hasConflictsEv @ 13003 NONAME ABSENT
- _ZNK7QPixmap17toSymbianRSgImageEv @ 13004 NONAME
- _ZTI15QSoftKeyManager @ 13005 NONAME
- _ZTV15QSoftKeyManager @ 13006 NONAME
- _ZThn24_N13QS60MainAppUi12RestoreMenuLEP11CCoeControliN16MEikMenuObserver9TMenuTypeE @ 13007 NONAME
- _ZThn24_N13QS60MainAppUi15DynInitMenuBarLEiP11CEikMenuBar @ 13008 NONAME
- _ZThn24_N13QS60MainAppUi16DynInitMenuPaneLEiP12CEikMenuPane @ 13009 NONAME
- _ZThn88_N13QS60MainAppUi26HandleStatusPaneSizeChangeEv @ 13010 NONAME
- _Z12qDrawPixmapsP8QPainterPKN12QDrawPixmaps4DataEiRK7QPixmap6QFlagsINS1_11DrawingHintEE @ 13011 NONAME
- _Z17qDrawBorderPixmapP8QPainterRK5QRectRK8QMarginsRK7QPixmapS3_S6_RK10QTileRules6QFlagsIN17QDrawBorderPixmap11DrawingHintEE @ 13012 NONAME
- _ZN10QImageData6createEPhiiiN6QImage6FormatEb @ 13013 NONAME
- _ZN10QImageData6createERK5QSizeN6QImage6FormatEi @ 13014 NONAME
- _ZN10QImageDataC1Ev @ 13015 NONAME
- _ZN10QImageDataC2Ev @ 13016 NONAME
- _ZN10QImageDataD1Ev @ 13017 NONAME
- _ZN10QImageDataD2Ev @ 13018 NONAME
- _ZN13QGraphicsItem11stackBeforeEPKS_ @ 13019 NONAME
- _ZN13QGraphicsItem16setPanelModalityENS_13PanelModalityE @ 13020 NONAME
- _ZN14QPaintEngineEx11drawPixmapsEPKN12QDrawPixmaps4DataEiRK7QPixmap6QFlagsINS0_11DrawingHintEE @ 13021 NONAME
- _ZN14QWidgetPrivate21activateSymbianWindowEv @ 13022 NONAME
- _ZN17QAbstractItemView20setDefaultDropActionEN2Qt10DropActionE @ 13023 NONAME
- _ZN17QPixmapBlurFilter11setBlurHintEN2Qt10RenderHintE @ 13024 NONAME
- _ZN19QApplicationPrivate16load_testabilityE @ 13025 NONAME DATA 1
- _ZN19QGraphicsBlurEffect11setBlurHintEN2Qt10RenderHintE @ 13026 NONAME
- _ZN19QGraphicsBlurEffect15blurHintChangedEN2Qt10RenderHintE @ 13027 NONAME
- _ZN20QGraphicsBloomEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 13028 NONAME
- _ZN20QGraphicsBloomEffect11qt_metacastEPKc @ 13029 NONAME
- _ZN20QGraphicsBloomEffect11setBlurHintEN2Qt10RenderHintE @ 13030 NONAME
- _ZN20QGraphicsBloomEffect11setStrengthEf @ 13031 NONAME
- _ZN20QGraphicsBloomEffect13setBlurRadiusEi @ 13032 NONAME
- _ZN20QGraphicsBloomEffect13setBrightnessEi @ 13033 NONAME
- _ZN20QGraphicsBloomEffect15blurHintChangedEN2Qt10RenderHintE @ 13034 NONAME
- _ZN20QGraphicsBloomEffect15strengthChangedEf @ 13035 NONAME
- _ZN20QGraphicsBloomEffect16staticMetaObjectE @ 13036 NONAME DATA 16
- _ZN20QGraphicsBloomEffect17blurRadiusChangedEi @ 13037 NONAME
- _ZN20QGraphicsBloomEffect17brightnessChangedEi @ 13038 NONAME
- _ZN20QGraphicsBloomEffect19getStaticMetaObjectEv @ 13039 NONAME
- _ZN20QGraphicsBloomEffect4drawEP8QPainterP21QGraphicsEffectSource @ 13040 NONAME
- _ZN20QGraphicsBloomEffectC1EP7QObject @ 13041 NONAME
- _ZN20QGraphicsBloomEffectC2EP7QObject @ 13042 NONAME
- _ZN20QGraphicsBloomEffectD0Ev @ 13043 NONAME
- _ZN20QGraphicsBloomEffectD1Ev @ 13044 NONAME
- _ZN20QGraphicsBloomEffectD2Ev @ 13045 NONAME
- _ZN20QGraphicsItemPrivate28ensureSequentialSiblingIndexEv @ 13046 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate11solveMinMaxE5QListIP18QSimplexConstraintE9GraphPathPfS5_ @ 13047 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate12oppositeEdgeEN2Qt11AnchorPointE @ 13048 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate12removeAnchorEP12AnchorVertexS1_ @ 13049 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate12removeVertexEP19QGraphicsLayoutItemN2Qt11AnchorPointE @ 13050 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate13getGraphPartsENS_11OrientationE @ 13051 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate13removeAnchorsEP19QGraphicsLayoutItem @ 13052 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate13setAnchorSizeEP10AnchorDataPKf @ 13053 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate13simplifyGraphENS_11OrientationE @ 13054 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate14solvePreferredE5QListIP18QSimplexConstraintE @ 13055 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate15calculateGraphsENS_11OrientationE @ 13056 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate15calculateGraphsEv @ 13057 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate15createItemEdgesEP19QGraphicsLayoutItem @ 13058 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate15edgeOrientationEN2Qt11AnchorPointE @ 13059 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate15interpolateEdgeEP12AnchorVertexP10AnchorDataNS_11OrientationE @ 13060 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate16addAnchor_helperEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_P10AnchorData @ 13061 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate17addInternalVertexEP19QGraphicsLayoutItemN2Qt11AnchorPointE @ 13062 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate17createLayoutEdgesEv @ 13063 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate17deleteLayoutEdgesEv @ 13064 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate18setItemsGeometriesERK6QRectF @ 13065 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate19createCenterAnchorsEP19QGraphicsLayoutItemN2Qt11AnchorPointE @ 13066 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate19removeAnchor_helperEP12AnchorVertexS1_ @ 13067 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate19removeCenterAnchorsEP19QGraphicsLayoutItemN2Qt11AnchorPointEb @ 13068 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate20constraintsFromPathsENS_11OrientationE @ 13069 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate20correctEdgeDirectionERP19QGraphicsLayoutItemRN2Qt11AnchorPointES2_S5_ @ 13070 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate20removeInternalVertexEP19QGraphicsLayoutItemN2Qt11AnchorPointE @ 13071 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate22restoreSimplifiedGraphENS_11OrientationE @ 13072 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate22simplifyGraphIterationENS_11OrientationE @ 13073 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate23removeCenterConstraintsEP19QGraphicsLayoutItemNS_11OrientationE @ 13074 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate23setupEdgesInterpolationENS_11OrientationE @ 13075 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate24calculateVertexPositionsENS_11OrientationE @ 13076 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate24constraintsFromSizeHintsERK5QListIP10AnchorDataE @ 13077 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate24interpolateParallelEdgesEP12AnchorVertexP18ParallelAnchorDataNS_11OrientationE @ 13078 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate26interpolateSequentialEdgesEP12AnchorVertexP20SequentialAnchorDataNS_11OrientationE @ 13079 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate27setAnchorSizeHintsFromItemsENS_11OrientationE @ 13080 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate9addAnchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_Pf @ 13081 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate9findPathsENS_11OrientationE @ 13082 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate9getAnchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 13083 NONAME
- _ZN28QGraphicsAnchorLayoutPrivateC1Ev @ 13084 NONAME
- _ZN28QGraphicsAnchorLayoutPrivateC2Ev @ 13085 NONAME
- _ZNK10QImageData19checkForAlphaPixelsEv @ 13086 NONAME
- _ZNK10QImageData9doImageIOEPK6QImageP12QImageWriteri @ 13087 NONAME
- _ZNK13QGraphicsItem13panelModalityEv @ 13088 NONAME
- _ZNK13QGraphicsItem21isBlockedByModalPanelEPPS_ @ 13089 NONAME
- _ZNK17QAbstractItemView17defaultDropActionEv @ 13090 NONAME
- _ZNK20QGraphicsBloomEffect10blurRadiusEv @ 13091 NONAME
- _ZNK20QGraphicsBloomEffect10brightnessEv @ 13092 NONAME
- _ZNK20QGraphicsBloomEffect10metaObjectEv @ 13093 NONAME
- _ZNK20QGraphicsBloomEffect15boundingRectForERK6QRectF @ 13094 NONAME
- _ZNK20QGraphicsBloomEffect8blurHintEv @ 13095 NONAME
- _ZNK20QGraphicsBloomEffect8strengthEv @ 13096 NONAME
- _ZNK28QGraphicsAnchorLayoutPrivate10anchorSizeEPK10AnchorDataPfS3_S3_ @ 13097 NONAME
- _ZNK28QGraphicsAnchorLayoutPrivate12hasConflictsEv @ 13098 NONAME
- _ZNK28QGraphicsAnchorLayoutPrivate16effectiveSpacingENS_11OrientationE @ 13099 NONAME
- _ZTI20QGraphicsBloomEffect @ 13100 NONAME
- _ZTI28QGraphicsAnchorLayoutPrivate @ 13101 NONAME
- _ZTV20QGraphicsBloomEffect @ 13102 NONAME
- _ZTV28QGraphicsAnchorLayoutPrivate @ 13103 NONAME
- _ZN17QToolBarExtension10paintEventEP11QPaintEvent @ 13104 NONAME
- _ZN17QToolBarExtension11qt_metacallEN11QMetaObject4CallEiPPv @ 13105 NONAME
- _ZN17QToolBarExtension11qt_metacastEPKc @ 13106 NONAME
- _ZN17QToolBarExtension14setOrientationEN2Qt11OrientationE @ 13107 NONAME
- _ZN17QToolBarExtension16staticMetaObjectE @ 13108 NONAME DATA 16
- _ZN17QToolBarExtension19getStaticMetaObjectEv @ 13109 NONAME
- _ZN17QToolBarExtensionC1EP7QWidget @ 13110 NONAME
- _ZN17QToolBarExtensionC2EP7QWidget @ 13111 NONAME
- _ZN18QGuiPlatformPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 13112 NONAME
- _ZN18QGuiPlatformPlugin11qt_metacastEPKc @ 13113 NONAME
- _ZN18QGuiPlatformPlugin12platformHintENS_12PlatformHintE @ 13114 NONAME
- _ZN18QGuiPlatformPlugin14fileSystemIconERK9QFileInfo @ 13115 NONAME
- _ZN18QGuiPlatformPlugin16staticMetaObjectE @ 13116 NONAME DATA 16
- _ZN18QGuiPlatformPlugin19getStaticMetaObjectEv @ 13117 NONAME
- _ZN18QGuiPlatformPlugin19systemIconThemeNameEv @ 13118 NONAME
- _ZN18QGuiPlatformPlugin20iconThemeSearchPathsEv @ 13119 NONAME
- _ZN18QGuiPlatformPlugin7paletteEv @ 13120 NONAME
- _ZN18QGuiPlatformPlugin9styleNameEv @ 13121 NONAME
- _ZN18QGuiPlatformPluginC1EP7QObject @ 13122 NONAME
- _ZN18QGuiPlatformPluginC2EP7QObject @ 13123 NONAME
- _ZN18QGuiPlatformPluginD0Ev @ 13124 NONAME
- _ZN18QGuiPlatformPluginD1Ev @ 13125 NONAME
- _ZN18QGuiPlatformPluginD2Ev @ 13126 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate14solveExpandingE5QListIP18QSimplexConstraintE @ 13127 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate21identifyNonFloatItemsE4QSetIP10AnchorDataENS_11OrientationE @ 13128 NONAME
- _ZN28QGraphicsAnchorLayoutPrivate28identifyNonFloatItems_helperEPK10AnchorDataNS_11OrientationE @ 13129 NONAME
- _ZNK17QToolBarExtension10metaObjectEv @ 13130 NONAME
- _ZNK17QToolBarExtension8sizeHintEv @ 13131 NONAME
- _ZNK18QGuiPlatformPlugin10metaObjectEv @ 13132 NONAME
- _ZTI18QGuiPlatformPlugin @ 13133 NONAME
- _ZTI27QGuiPlatformPluginInterface @ 13134 NONAME
- _ZTV18QGuiPlatformPlugin @ 13135 NONAME
- _ZThn8_N18QGuiPlatformPluginD0Ev @ 13136 NONAME
- _ZThn8_N18QGuiPlatformPluginD1Ev @ 13137 NONAME
+ _ZN10QBoxLayout19getStaticMetaObjectEv @ 62 NONAME
+ _ZN10QBoxLayout6takeAtEi @ 63 NONAME
+ _ZN10QBoxLayout7addItemEP11QLayoutItem @ 64 NONAME
+ _ZN10QBoxLayout8addStrutEi @ 65 NONAME
+ _ZN10QBoxLayout9addLayoutEP7QLayouti @ 66 NONAME
+ _ZN10QBoxLayout9addWidgetEP7QWidgeti6QFlagsIN2Qt13AlignmentFlagEE @ 67 NONAME
+ _ZN10QBoxLayoutC1ENS_9DirectionEP7QWidget @ 68 NONAME
+ _ZN10QBoxLayoutC2ENS_9DirectionEP7QWidget @ 69 NONAME
+ _ZN10QBoxLayoutD0Ev @ 70 NONAME
+ _ZN10QBoxLayoutD1Ev @ 71 NONAME
+ _ZN10QBoxLayoutD2Ev @ 72 NONAME
+ _ZN10QClipboard11dataChangedEv @ 73 NONAME
+ _ZN10QClipboard11emitChangedENS_4ModeE @ 74 NONAME
+ _ZN10QClipboard11qt_metacallEN11QMetaObject4CallEiPPv @ 75 NONAME
+ _ZN10QClipboard11qt_metacastEPKc @ 76 NONAME
+ _ZN10QClipboard11setMimeDataEP9QMimeDataNS_4ModeE @ 77 NONAME
+ _ZN10QClipboard13connectNotifyEPKc @ 78 NONAME
+ _ZN10QClipboard14ownerDestroyedEv @ 79 NONAME
+ _ZN10QClipboard16selectionChangedEv @ 80 NONAME
+ _ZN10QClipboard16staticMetaObjectE @ 81 NONAME DATA 16
+ _ZN10QClipboard17findBufferChangedEv @ 82 NONAME
+ _ZN10QClipboard19getStaticMetaObjectEv @ 83 NONAME
+ _ZN10QClipboard5clearENS_4ModeE @ 84 NONAME
+ _ZN10QClipboard5eventEP6QEvent @ 85 NONAME
+ _ZN10QClipboard7changedENS_4ModeE @ 86 NONAME
+ _ZN10QClipboard7setTextERK7QStringNS_4ModeE @ 87 NONAME
+ _ZN10QClipboard8setImageERK6QImageNS_4ModeE @ 88 NONAME
+ _ZN10QClipboard9setPixmapERK7QPixmapNS_4ModeE @ 89 NONAME
+ _ZN10QClipboardC1EP7QObject @ 90 NONAME
+ _ZN10QClipboardC2EP7QObject @ 91 NONAME
+ _ZN10QClipboardD0Ev @ 92 NONAME
+ _ZN10QClipboardD1Ev @ 93 NONAME
+ _ZN10QClipboardD2Ev @ 94 NONAME
+ _ZN10QCompleter11eventFilterEP7QObjectP6QEvent @ 95 NONAME
+ _ZN10QCompleter11highlightedERK11QModelIndex @ 96 NONAME
+ _ZN10QCompleter11highlightedERK7QString @ 97 NONAME
+ _ZN10QCompleter11qt_metacallEN11QMetaObject4CallEiPPv @ 98 NONAME
+ _ZN10QCompleter11qt_metacastEPKc @ 99 NONAME
+ _ZN10QCompleter13setCurrentRowEi @ 100 NONAME
+ _ZN10QCompleter13setWrapAroundEb @ 101 NONAME
+ _ZN10QCompleter15setModelSortingENS_12ModelSortingE @ 102 NONAME
+ _ZN10QCompleter16staticMetaObjectE @ 103 NONAME DATA 16
+ _ZN10QCompleter17setCompletionModeENS_14CompletionModeE @ 104 NONAME
+ _ZN10QCompleter17setCompletionRoleEi @ 105 NONAME
+ _ZN10QCompleter18setCaseSensitivityEN2Qt15CaseSensitivityE @ 106 NONAME
+ _ZN10QCompleter18setMaxVisibleItemsEi @ 107 NONAME
+ _ZN10QCompleter19getStaticMetaObjectEv @ 108 NONAME
+ _ZN10QCompleter19setCompletionColumnEi @ 109 NONAME
+ _ZN10QCompleter19setCompletionPrefixERK7QString @ 110 NONAME
+ _ZN10QCompleter5eventEP6QEvent @ 111 NONAME
+ _ZN10QCompleter8completeERK5QRect @ 112 NONAME
+ _ZN10QCompleter8setModelEP18QAbstractItemModel @ 113 NONAME
+ _ZN10QCompleter8setPopupEP17QAbstractItemView @ 114 NONAME
+ _ZN10QCompleter9activatedERK11QModelIndex @ 115 NONAME
+ _ZN10QCompleter9activatedERK7QString @ 116 NONAME
+ _ZN10QCompleter9setWidgetEP7QWidget @ 117 NONAME
+ _ZN10QCompleterC1EP18QAbstractItemModelP7QObject @ 118 NONAME
+ _ZN10QCompleterC1EP7QObject @ 119 NONAME
+ _ZN10QCompleterC1ERK11QStringListP7QObject @ 120 NONAME
+ _ZN10QCompleterC2EP18QAbstractItemModelP7QObject @ 121 NONAME
+ _ZN10QCompleterC2EP7QObject @ 122 NONAME
+ _ZN10QCompleterC2ERK11QStringListP7QObject @ 123 NONAME
+ _ZN10QCompleterD0Ev @ 124 NONAME
+ _ZN10QCompleterD1Ev @ 125 NONAME
+ _ZN10QCompleterD2Ev @ 126 NONAME
+ _ZN10QDropEvent13setDropActionEN2Qt10DropActionE @ 127 NONAME
+ _ZN10QDropEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 128 NONAME
+ _ZN10QDropEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 129 NONAME
+ _ZN10QDropEventD0Ev @ 130 NONAME
+ _ZN10QDropEventD1Ev @ 131 NONAME
+ _ZN10QDropEventD2Ev @ 132 NONAME
+ _ZN10QHelpEventC1EN6QEvent4TypeERK6QPointS4_ @ 133 NONAME
+ _ZN10QHelpEventC2EN6QEvent4TypeERK6QPointS4_ @ 134 NONAME
+ _ZN10QHelpEventD0Ev @ 135 NONAME
+ _ZN10QHelpEventD1Ev @ 136 NONAME
+ _ZN10QHelpEventD2Ev @ 137 NONAME
+ _ZN10QHideEventC1Ev @ 138 NONAME
+ _ZN10QHideEventC2Ev @ 139 NONAME
+ _ZN10QHideEventD0Ev @ 140 NONAME
+ _ZN10QHideEventD1Ev @ 141 NONAME
+ _ZN10QHideEventD2Ev @ 142 NONAME
+ _ZN10QImageData6createEPhiiiN6QImage6FormatEb @ 143 NONAME
+ _ZN10QImageData6createERK5QSizeN6QImage6FormatEi @ 144 NONAME
+ _ZN10QImageDataC1Ev @ 145 NONAME
+ _ZN10QImageDataC2Ev @ 146 NONAME
+ _ZN10QImageDataD1Ev @ 147 NONAME
+ _ZN10QImageDataD2Ev @ 148 NONAME
+ _ZN10QLCDNumber10paintEventEP11QPaintEvent @ 149 NONAME
+ _ZN10QLCDNumber10setBinModeEv @ 150 NONAME
+ _ZN10QLCDNumber10setDecModeEv @ 151 NONAME
+ _ZN10QLCDNumber10setHexModeEv @ 152 NONAME
+ _ZN10QLCDNumber10setOctModeEv @ 153 NONAME
+ _ZN10QLCDNumber11qt_metacallEN11QMetaObject4CallEiPPv @ 154 NONAME
+ _ZN10QLCDNumber11qt_metacastEPKc @ 155 NONAME
+ _ZN10QLCDNumber12setNumDigitsEi @ 156 NONAME
+ _ZN10QLCDNumber15setSegmentStyleENS_12SegmentStyleE @ 157 NONAME
+ _ZN10QLCDNumber16staticMetaObjectE @ 158 NONAME DATA 16
+ _ZN10QLCDNumber19getStaticMetaObjectEv @ 159 NONAME
+ _ZN10QLCDNumber20setSmallDecimalPointEb @ 160 NONAME
+ _ZN10QLCDNumber5eventEP6QEvent @ 161 NONAME
+ _ZN10QLCDNumber7displayERK7QString @ 162 NONAME
+ _ZN10QLCDNumber7displayEd @ 163 NONAME
+ _ZN10QLCDNumber7displayEi @ 164 NONAME
+ _ZN10QLCDNumber7setModeENS_4ModeE @ 165 NONAME
+ _ZN10QLCDNumber8overflowEv @ 166 NONAME
+ _ZN10QLCDNumberC1EP7QWidget @ 167 NONAME
+ _ZN10QLCDNumberC1EjP7QWidget @ 168 NONAME
+ _ZN10QLCDNumberC2EP7QWidget @ 169 NONAME
+ _ZN10QLCDNumberC2EjP7QWidget @ 170 NONAME
+ _ZN10QLCDNumberD0Ev @ 171 NONAME
+ _ZN10QLCDNumberD1Ev @ 172 NONAME
+ _ZN10QLCDNumberD2Ev @ 173 NONAME
+ _ZN10QMatrix4x411perspectiveEffff @ 174 NONAME
+ _ZN10QMatrix4x415flipCoordinatesEv @ 175 NONAME
+ _ZN10QMatrix4x416inferSpecialTypeEv @ 176 NONAME
+ _ZN10QMatrix4x45orthoERK5QRect @ 177 NONAME
+ _ZN10QMatrix4x45orthoERK6QRectF @ 178 NONAME
+ _ZN10QMatrix4x45orthoEffffff @ 179 NONAME
+ _ZN10QMatrix4x45scaleERK9QVector3D @ 180 NONAME
+ _ZN10QMatrix4x45scaleEf @ 181 NONAME
+ _ZN10QMatrix4x45scaleEff @ 182 NONAME
+ _ZN10QMatrix4x45scaleEfff @ 183 NONAME
+ _ZN10QMatrix4x46lookAtERK9QVector3DS2_S2_ @ 184 NONAME
+ _ZN10QMatrix4x46rotateERK11QQuaternion @ 185 NONAME
+ _ZN10QMatrix4x46rotateEfRK9QVector3D @ 186 NONAME
+ _ZN10QMatrix4x46rotateEffff @ 187 NONAME
+ _ZN10QMatrix4x47frustumEffffff @ 188 NONAME
+ _ZN10QMatrix4x49translateERK9QVector3D @ 189 NONAME
+ _ZN10QMatrix4x49translateEff @ 190 NONAME
+ _ZN10QMatrix4x49translateEfff @ 191 NONAME
+ _ZN10QMatrix4x4C1EPKf @ 192 NONAME
+ _ZN10QMatrix4x4C1EPKfii @ 193 NONAME
+ _ZN10QMatrix4x4C1ERK10QTransform @ 194 NONAME
+ _ZN10QMatrix4x4C1ERK7QMatrix @ 195 NONAME
+ _ZN10QMatrix4x4C2EPKf @ 196 NONAME
+ _ZN10QMatrix4x4C2EPKfii @ 197 NONAME
+ _ZN10QMatrix4x4C2ERK10QTransform @ 198 NONAME
+ _ZN10QMatrix4x4C2ERK7QMatrix @ 199 NONAME
+ _ZN10QMatrix4x4dVEf @ 200 NONAME
+ _ZN10QMoveEventC1ERK6QPointS2_ @ 201 NONAME
+ _ZN10QMoveEventC2ERK6QPointS2_ @ 202 NONAME
+ _ZN10QMoveEventD0Ev @ 203 NONAME
+ _ZN10QMoveEventD1Ev @ 204 NONAME
+ _ZN10QMoveEventD2Ev @ 205 NONAME
+ _ZN10QPictureIO10setPictureERK8QPicture @ 206 NONAME
+ _ZN10QPictureIO10setQualityEi @ 207 NONAME
+ _ZN10QPictureIO11setFileNameERK7QString @ 208 NONAME
+ _ZN10QPictureIO11setIODeviceEP9QIODevice @ 209 NONAME
+ _ZN10QPictureIO12inputFormatsEv @ 210 NONAME
+ _ZN10QPictureIO13outputFormatsEv @ 211 NONAME
+ _ZN10QPictureIO13pictureFormatEP9QIODevice @ 212 NONAME
+ _ZN10QPictureIO13pictureFormatERK7QString @ 213 NONAME
+ _ZN10QPictureIO13setParametersEPKc @ 214 NONAME
+ _ZN10QPictureIO14setDescriptionERK7QString @ 215 NONAME
+ _ZN10QPictureIO15defineIOHandlerEPKcS1_S1_PFvPS_ES4_ @ 216 NONAME
+ _ZN10QPictureIO4initEv @ 217 NONAME
+ _ZN10QPictureIO4readEv @ 218 NONAME
+ _ZN10QPictureIO5writeEv @ 219 NONAME
+ _ZN10QPictureIO8setGammaEf @ 220 NONAME
+ _ZN10QPictureIO9setFormatEPKc @ 221 NONAME
+ _ZN10QPictureIO9setStatusEi @ 222 NONAME
+ _ZN10QPictureIOC1EP9QIODevicePKc @ 223 NONAME
+ _ZN10QPictureIOC1ERK7QStringPKc @ 224 NONAME
+ _ZN10QPictureIOC1Ev @ 225 NONAME
+ _ZN10QPictureIOC2EP9QIODevicePKc @ 226 NONAME
+ _ZN10QPictureIOC2ERK7QStringPKc @ 227 NONAME
+ _ZN10QPictureIOC2Ev @ 228 NONAME
+ _ZN10QPictureIOD1Ev @ 229 NONAME
+ _ZN10QPictureIOD2Ev @ 230 NONAME
+ _ZN10QScrollBar10paintEventEP11QPaintEvent @ 231 NONAME
+ _ZN10QScrollBar11qt_metacallEN11QMetaObject4CallEiPPv @ 232 NONAME
+ _ZN10QScrollBar11qt_metacastEPKc @ 233 NONAME
+ _ZN10QScrollBar12sliderChangeEN15QAbstractSlider12SliderChangeE @ 234 NONAME
+ _ZN10QScrollBar14mouseMoveEventEP11QMouseEvent @ 235 NONAME
+ _ZN10QScrollBar15mousePressEventEP11QMouseEvent @ 236 NONAME
+ _ZN10QScrollBar16contextMenuEventEP17QContextMenuEvent @ 237 NONAME
+ _ZN10QScrollBar16staticMetaObjectE @ 238 NONAME DATA 16
+ _ZN10QScrollBar17mouseReleaseEventEP11QMouseEvent @ 239 NONAME
+ _ZN10QScrollBar19getStaticMetaObjectEv @ 240 NONAME
+ _ZN10QScrollBar5eventEP6QEvent @ 241 NONAME
+ _ZN10QScrollBar9hideEventEP10QHideEvent @ 242 NONAME
+ _ZN10QScrollBarC1EN2Qt11OrientationEP7QWidget @ 243 NONAME
+ _ZN10QScrollBarC1EP7QWidget @ 244 NONAME
+ _ZN10QScrollBarC2EN2Qt11OrientationEP7QWidget @ 245 NONAME
+ _ZN10QScrollBarC2EP7QWidget @ 246 NONAME
+ _ZN10QScrollBarD0Ev @ 247 NONAME
+ _ZN10QScrollBarD1Ev @ 248 NONAME
+ _ZN10QScrollBarD2Ev @ 249 NONAME
+ _ZN10QShowEventC1Ev @ 250 NONAME
+ _ZN10QShowEventC2Ev @ 251 NONAME
+ _ZN10QShowEventD0Ev @ 252 NONAME
+ _ZN10QShowEventD1Ev @ 253 NONAME
+ _ZN10QShowEventD2Ev @ 254 NONAME
+ _ZN10QStatusBar10hideOrShowEv @ 255 NONAME
+ _ZN10QStatusBar10paintEventEP11QPaintEvent @ 256 NONAME
+ _ZN10QStatusBar11qt_metacallEN11QMetaObject4CallEiPPv @ 257 NONAME
+ _ZN10QStatusBar11qt_metacastEPKc @ 258 NONAME
+ _ZN10QStatusBar11resizeEventEP12QResizeEvent @ 259 NONAME
+ _ZN10QStatusBar11showMessageERK7QStringi @ 260 NONAME
+ _ZN10QStatusBar12clearMessageEv @ 261 NONAME
+ _ZN10QStatusBar12insertWidgetEiP7QWidgeti @ 262 NONAME
+ _ZN10QStatusBar12removeWidgetEP7QWidget @ 263 NONAME
+ _ZN10QStatusBar14messageChangedERK7QString @ 264 NONAME
+ _ZN10QStatusBar16staticMetaObjectE @ 265 NONAME DATA 16
+ _ZN10QStatusBar18addPermanentWidgetEP7QWidgeti @ 266 NONAME
+ _ZN10QStatusBar18setSizeGripEnabledEb @ 267 NONAME
+ _ZN10QStatusBar19getStaticMetaObjectEv @ 268 NONAME
+ _ZN10QStatusBar21insertPermanentWidgetEiP7QWidgeti @ 269 NONAME
+ _ZN10QStatusBar5eventEP6QEvent @ 270 NONAME
+ _ZN10QStatusBar8reformatEv @ 271 NONAME
+ _ZN10QStatusBar9addWidgetEP7QWidgeti @ 272 NONAME
+ _ZN10QStatusBar9showEventEP10QShowEvent @ 273 NONAME
+ _ZN10QStatusBarC1EP7QWidget @ 274 NONAME
+ _ZN10QStatusBarC2EP7QWidget @ 275 NONAME
+ _ZN10QStatusBarD0Ev @ 276 NONAME
+ _ZN10QStatusBarD1Ev @ 277 NONAME
+ _ZN10QStatusBarD2Ev @ 278 NONAME
+ _ZN10QTabWidget10paintEventEP11QPaintEvent @ 279 NONAME
+ _ZN10QTabWidget10setMovableEb @ 280 NONAME
+ _ZN10QTabWidget10setTabIconEiRK5QIcon @ 281 NONAME
+ _ZN10QTabWidget10setTabTextEiRK7QString @ 282 NONAME
+ _ZN10QTabWidget10tabRemovedEi @ 283 NONAME
+ _ZN10QTabWidget11changeEventEP6QEvent @ 284 NONAME
+ _ZN10QTabWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 285 NONAME
+ _ZN10QTabWidget11qt_metacastEPKc @ 286 NONAME
+ _ZN10QTabWidget11resizeEventEP12QResizeEvent @ 287 NONAME
+ _ZN10QTabWidget11setIconSizeERK5QSize @ 288 NONAME
+ _ZN10QTabWidget11setTabShapeENS_8TabShapeE @ 289 NONAME
+ _ZN10QTabWidget11setUpLayoutEb @ 290 NONAME
+ _ZN10QTabWidget11tabInsertedEi @ 291 NONAME
+ _ZN10QTabWidget12setElideModeEN2Qt13TextElideModeE @ 292 NONAME
+ _ZN10QTabWidget13keyPressEventEP9QKeyEvent @ 293 NONAME
+ _ZN10QTabWidget13setTabEnabledEib @ 294 NONAME
+ _ZN10QTabWidget13setTabToolTipEiRK7QString @ 295 NONAME
+ _ZN10QTabWidget14currentChangedEi @ 296 NONAME
+ _ZN10QTabWidget14setTabPositionENS_11TabPositionE @ 297 NONAME
+ _ZN10QTabWidget15setCornerWidgetEP7QWidgetN2Qt6CornerE @ 298 NONAME
+ _ZN10QTabWidget15setCurrentIndexEi @ 299 NONAME
+ _ZN10QTabWidget15setDocumentModeEb @ 300 NONAME
+ _ZN10QTabWidget15setTabWhatsThisEiRK7QString @ 301 NONAME
+ _ZN10QTabWidget15setTabsClosableEb @ 302 NONAME
+ _ZN10QTabWidget16setCurrentWidgetEP7QWidget @ 303 NONAME
+ _ZN10QTabWidget16staticMetaObjectE @ 304 NONAME DATA 16
+ _ZN10QTabWidget17tabCloseRequestedEi @ 305 NONAME
+ _ZN10QTabWidget19getStaticMetaObjectEv @ 306 NONAME
+ _ZN10QTabWidget20setUsesScrollButtonsEb @ 307 NONAME
+ _ZN10QTabWidget5clearEv @ 308 NONAME
+ _ZN10QTabWidget5eventEP6QEvent @ 309 NONAME
+ _ZN10QTabWidget6addTabEP7QWidgetRK5QIconRK7QString @ 310 NONAME
+ _ZN10QTabWidget6addTabEP7QWidgetRK7QString @ 311 NONAME
+ _ZN10QTabWidget9insertTabEiP7QWidgetRK5QIconRK7QString @ 312 NONAME
+ _ZN10QTabWidget9insertTabEiP7QWidgetRK7QString @ 313 NONAME
+ _ZN10QTabWidget9removeTabEi @ 314 NONAME
+ _ZN10QTabWidget9setTabBarEP7QTabBar @ 315 NONAME
+ _ZN10QTabWidget9showEventEP10QShowEvent @ 316 NONAME
+ _ZN10QTabWidgetC1EP7QWidget @ 317 NONAME
+ _ZN10QTabWidgetC2EP7QWidget @ 318 NONAME
+ _ZN10QTabWidgetD0Ev @ 319 NONAME
+ _ZN10QTabWidgetD1Ev @ 320 NONAME
+ _ZN10QTabWidgetD2Ev @ 321 NONAME
+ _ZN10QTableView10clearSpansEv @ 322 NONAME
+ _ZN10QTableView10hideColumnEi @ 323 NONAME
+ _ZN10QTableView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 324 NONAME
+ _ZN10QTableView10paintEventEP11QPaintEvent @ 325 NONAME
+ _ZN10QTableView10rowResizedEiii @ 326 NONAME
+ _ZN10QTableView10showColumnEi @ 327 NONAME
+ _ZN10QTableView10timerEventEP11QTimerEvent @ 328 NONAME
+ _ZN10QTableView11columnMovedEiii @ 329 NONAME
+ _ZN10QTableView11qt_metacallEN11QMetaObject4CallEiPPv @ 330 NONAME
+ _ZN10QTableView11qt_metacastEPKc @ 331 NONAME
+ _ZN10QTableView11setShowGridEb @ 332 NONAME
+ _ZN10QTableView11setWordWrapEb @ 333 NONAME
+ _ZN10QTableView12selectColumnEi @ 334 NONAME
+ _ZN10QTableView12setGridStyleEN2Qt8PenStyleE @ 335 NONAME
+ _ZN10QTableView12setRootIndexERK11QModelIndex @ 336 NONAME
+ _ZN10QTableView12setRowHeightEii @ 337 NONAME
+ _ZN10QTableView12setRowHiddenEib @ 338 NONAME
+ _ZN10QTableView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 339 NONAME
+ _ZN10QTableView12sortByColumnEi @ 340 NONAME
+ _ZN10QTableView12sortByColumnEiN2Qt9SortOrderE @ 341 NONAME
+ _ZN10QTableView13columnResizedEiii @ 342 NONAME
+ _ZN10QTableView14currentChangedERK11QModelIndexS2_ @ 343 NONAME
+ _ZN10QTableView14setColumnWidthEii @ 344 NONAME
+ _ZN10QTableView15rowCountChangedEii @ 345 NONAME
+ _ZN10QTableView15setColumnHiddenEib @ 346 NONAME
+ _ZN10QTableView16scrollContentsByEii @ 347 NONAME
+ _ZN10QTableView16selectionChangedERK14QItemSelectionS2_ @ 348 NONAME
+ _ZN10QTableView16staticMetaObjectE @ 349 NONAME DATA 16
+ _ZN10QTableView16updateGeometriesEv @ 350 NONAME
+ _ZN10QTableView17setSelectionModelEP19QItemSelectionModel @ 351 NONAME
+ _ZN10QTableView17setSortingEnabledEb @ 352 NONAME
+ _ZN10QTableView17setVerticalHeaderEP11QHeaderView @ 353 NONAME
+ _ZN10QTableView18columnCountChangedEii @ 354 NONAME
+ _ZN10QTableView19getStaticMetaObjectEv @ 355 NONAME
+ _ZN10QTableView19resizeRowToContentsEi @ 356 NONAME
+ _ZN10QTableView19setHorizontalHeaderEP11QHeaderView @ 357 NONAME
+ _ZN10QTableView20resizeRowsToContentsEv @ 358 NONAME
+ _ZN10QTableView22resizeColumnToContentsEi @ 359 NONAME
+ _ZN10QTableView22setCornerButtonEnabledEb @ 360 NONAME
+ _ZN10QTableView23resizeColumnsToContentsEv @ 361 NONAME
+ _ZN10QTableView23verticalScrollbarActionEi @ 362 NONAME
+ _ZN10QTableView25horizontalScrollbarActionEi @ 363 NONAME
+ _ZN10QTableView7hideRowEi @ 364 NONAME
+ _ZN10QTableView7setSpanEiiii @ 365 NONAME
+ _ZN10QTableView7showRowEi @ 366 NONAME
+ _ZN10QTableView8rowMovedEiii @ 367 NONAME
+ _ZN10QTableView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 368 NONAME
+ _ZN10QTableView8setModelEP18QAbstractItemModel @ 369 NONAME
+ _ZN10QTableView9selectRowEi @ 370 NONAME
+ _ZN10QTableViewC1EP7QWidget @ 371 NONAME
+ _ZN10QTableViewC1ER17QTableViewPrivateP7QWidget @ 372 NONAME
+ _ZN10QTableViewC2EP7QWidget @ 373 NONAME
+ _ZN10QTableViewC2ER17QTableViewPrivateP7QWidget @ 374 NONAME
+ _ZN10QTableViewD0Ev @ 375 NONAME
+ _ZN10QTableViewD1Ev @ 376 NONAME
+ _ZN10QTableViewD2Ev @ 377 NONAME
+ _ZN10QTextBlock10setVisibleEb @ 378 NONAME
+ _ZN10QTextBlock11clearLayoutEv @ 379 NONAME
+ _ZN10QTextBlock11setRevisionEi @ 380 NONAME
+ _ZN10QTextBlock11setUserDataEP18QTextBlockUserData @ 381 NONAME
+ _ZN10QTextBlock12setLineCountEi @ 382 NONAME
+ _ZN10QTextBlock12setUserStateEi @ 383 NONAME
+ _ZN10QTextBlock8iteratormmEv @ 384 NONAME
+ _ZN10QTextBlock8iteratorppEv @ 385 NONAME
+ _ZN10QTextFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 386 NONAME
+ _ZN10QTextFrame11qt_metacastEPKc @ 387 NONAME
+ _ZN10QTextFrame13setLayoutDataEP20QTextFrameLayoutData @ 388 NONAME
+ _ZN10QTextFrame16staticMetaObjectE @ 389 NONAME DATA 16
+ _ZN10QTextFrame19getStaticMetaObjectEv @ 390 NONAME
+ _ZN10QTextFrame8iteratorC1EPS_iii @ 391 NONAME
+ _ZN10QTextFrame8iteratorC1ERKS0_ @ 392 NONAME
+ _ZN10QTextFrame8iteratorC1Ev @ 393 NONAME
+ _ZN10QTextFrame8iteratorC2EPS_iii @ 394 NONAME
+ _ZN10QTextFrame8iteratorC2ERKS0_ @ 395 NONAME
+ _ZN10QTextFrame8iteratorC2Ev @ 396 NONAME
+ _ZN10QTextFrame8iteratoraSERKS0_ @ 397 NONAME
+ _ZN10QTextFrame8iteratormmEv @ 398 NONAME
+ _ZN10QTextFrame8iteratorppEv @ 399 NONAME
+ _ZN10QTextFrameC1EP13QTextDocument @ 400 NONAME
+ _ZN10QTextFrameC1ER17QTextFramePrivateP13QTextDocument @ 401 NONAME
+ _ZN10QTextFrameC2EP13QTextDocument @ 402 NONAME
+ _ZN10QTextFrameC2ER17QTextFramePrivateP13QTextDocument @ 403 NONAME
+ _ZN10QTextFrameD0Ev @ 404 NONAME
+ _ZN10QTextFrameD1Ev @ 405 NONAME
+ _ZN10QTextFrameD2Ev @ 406 NONAME
+ _ZN10QTextTable10appendRowsEi @ 407 NONAME
+ _ZN10QTextTable10insertRowsEii @ 408 NONAME
+ _ZN10QTextTable10mergeCellsERK11QTextCursor @ 409 NONAME
+ _ZN10QTextTable10mergeCellsEiiii @ 410 NONAME
+ _ZN10QTextTable10removeRowsEii @ 411 NONAME
+ _ZN10QTextTable11qt_metacallEN11QMetaObject4CallEiPPv @ 412 NONAME
+ _ZN10QTextTable11qt_metacastEPKc @ 413 NONAME
+ _ZN10QTextTable13appendColumnsEi @ 414 NONAME
+ _ZN10QTextTable13insertColumnsEii @ 415 NONAME
+ _ZN10QTextTable13removeColumnsEii @ 416 NONAME
+ _ZN10QTextTable16staticMetaObjectE @ 417 NONAME DATA 16
+ _ZN10QTextTable19getStaticMetaObjectEv @ 418 NONAME
+ _ZN10QTextTable6resizeEii @ 419 NONAME
+ _ZN10QTextTable9setFormatERK16QTextTableFormat @ 420 NONAME
+ _ZN10QTextTable9splitCellEiiii @ 421 NONAME
+ _ZN10QTextTableC1EP13QTextDocument @ 422 NONAME
+ _ZN10QTextTableC2EP13QTextDocument @ 423 NONAME
+ _ZN10QTextTableD0Ev @ 424 NONAME
+ _ZN10QTextTableD1Ev @ 425 NONAME
+ _ZN10QTextTableD2Ev @ 426 NONAME
+ _ZN10QTransform10quadToQuadERK9QPolygonFS2_RS_ @ 427 NONAME
+ _ZN10QTransform12quadToSquareERK9QPolygonFRS_ @ 428 NONAME
+ _ZN10QTransform12squareToQuadERK9QPolygonFRS_ @ 429 NONAME
+ _ZN10QTransform13fromTranslateEff @ 430 NONAME
+ _ZN10QTransform13rotateRadiansEfN2Qt4AxisE @ 431 NONAME
+ _ZN10QTransform5resetEv @ 432 NONAME
+ _ZN10QTransform5scaleEff @ 433 NONAME
+ _ZN10QTransform5shearEff @ 434 NONAME
+ _ZN10QTransform6rotateEfN2Qt4AxisE @ 435 NONAME
+ _ZN10QTransform9fromScaleEff @ 436 NONAME
+ _ZN10QTransform9setMatrixEfffffffff @ 437 NONAME
+ _ZN10QTransform9translateEff @ 438 NONAME
+ _ZN10QTransformC1ERK7QMatrix @ 439 NONAME
+ _ZN10QTransformC1Effffff @ 440 NONAME
+ _ZN10QTransformC1Efffffffff @ 441 NONAME
+ _ZN10QTransformC1Ev @ 442 NONAME
+ _ZN10QTransformC2ERK7QMatrix @ 443 NONAME
+ _ZN10QTransformC2Effffff @ 444 NONAME
+ _ZN10QTransformC2Efffffffff @ 445 NONAME
+ _ZN10QTransformC2Ev @ 446 NONAME
+ _ZN10QTransformaSERKS_ @ 447 NONAME
+ _ZN10QTransformmLERKS_ @ 448 NONAME
+ _ZN10QUndoGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 449 NONAME
+ _ZN10QUndoGroup11qt_metacastEPKc @ 450 NONAME
+ _ZN10QUndoGroup11removeStackEP10QUndoStack @ 451 NONAME
+ _ZN10QUndoGroup12cleanChangedEb @ 452 NONAME
+ _ZN10QUndoGroup12indexChangedEi @ 453 NONAME
+ _ZN10QUndoGroup14canRedoChangedEb @ 454 NONAME
+ _ZN10QUndoGroup14canUndoChangedEb @ 455 NONAME
+ _ZN10QUndoGroup14setActiveStackEP10QUndoStack @ 456 NONAME
+ _ZN10QUndoGroup15redoTextChangedERK7QString @ 457 NONAME
+ _ZN10QUndoGroup15undoTextChangedERK7QString @ 458 NONAME
+ _ZN10QUndoGroup16staticMetaObjectE @ 459 NONAME DATA 16
+ _ZN10QUndoGroup18activeStackChangedEP10QUndoStack @ 460 NONAME
+ _ZN10QUndoGroup19getStaticMetaObjectEv @ 461 NONAME
+ _ZN10QUndoGroup4redoEv @ 462 NONAME
+ _ZN10QUndoGroup4undoEv @ 463 NONAME
+ _ZN10QUndoGroup8addStackEP10QUndoStack @ 464 NONAME
+ _ZN10QUndoGroupC1EP7QObject @ 465 NONAME
+ _ZN10QUndoGroupC2EP7QObject @ 466 NONAME
+ _ZN10QUndoGroupD0Ev @ 467 NONAME
+ _ZN10QUndoGroupD1Ev @ 468 NONAME
+ _ZN10QUndoGroupD2Ev @ 469 NONAME
+ _ZN10QUndoStack10beginMacroERK7QString @ 470 NONAME
+ _ZN10QUndoStack11qt_metacallEN11QMetaObject4CallEiPPv @ 471 NONAME
+ _ZN10QUndoStack11qt_metacastEPKc @ 472 NONAME
+ _ZN10QUndoStack12cleanChangedEb @ 473 NONAME
+ _ZN10QUndoStack12indexChangedEi @ 474 NONAME
+ _ZN10QUndoStack12setUndoLimitEi @ 475 NONAME
+ _ZN10QUndoStack14canRedoChangedEb @ 476 NONAME
+ _ZN10QUndoStack14canUndoChangedEb @ 477 NONAME
+ _ZN10QUndoStack15redoTextChangedERK7QString @ 478 NONAME
+ _ZN10QUndoStack15undoTextChangedERK7QString @ 479 NONAME
+ _ZN10QUndoStack16staticMetaObjectE @ 480 NONAME DATA 16
+ _ZN10QUndoStack19getStaticMetaObjectEv @ 481 NONAME
+ _ZN10QUndoStack4pushEP12QUndoCommand @ 482 NONAME
+ _ZN10QUndoStack4redoEv @ 483 NONAME
+ _ZN10QUndoStack4undoEv @ 484 NONAME
+ _ZN10QUndoStack5clearEv @ 485 NONAME
+ _ZN10QUndoStack8endMacroEv @ 486 NONAME
+ _ZN10QUndoStack8setCleanEv @ 487 NONAME
+ _ZN10QUndoStack8setIndexEi @ 488 NONAME
+ _ZN10QUndoStack9setActiveEb @ 489 NONAME
+ _ZN10QUndoStackC1EP7QObject @ 490 NONAME
+ _ZN10QUndoStackC2EP7QObject @ 491 NONAME
+ _ZN10QUndoStackD0Ev @ 492 NONAME
+ _ZN10QUndoStackD1Ev @ 493 NONAME
+ _ZN10QUndoStackD2Ev @ 494 NONAME
+ _ZN10QValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 495 NONAME
+ _ZN10QValidator11qt_metacastEPKc @ 496 NONAME
+ _ZN10QValidator16staticMetaObjectE @ 497 NONAME DATA 16
+ _ZN10QValidator19getStaticMetaObjectEv @ 498 NONAME
+ _ZN10QValidator9setLocaleERK7QLocale @ 499 NONAME
+ _ZN10QValidatorC2EP7QObject @ 500 NONAME
+ _ZN10QValidatorC2ER14QObjectPrivateP7QObject @ 501 NONAME
+ _ZN10QValidatorC2ER17QValidatorPrivateP7QObject @ 502 NONAME
+ _ZN10QValidatorD0Ev @ 503 NONAME
+ _ZN10QValidatorD1Ev @ 504 NONAME
+ _ZN10QValidatorD2Ev @ 505 NONAME
+ _ZN10QWhatsThis12createActionEP7QObject @ 506 NONAME
+ _ZN10QWhatsThis15inWhatsThisModeEv @ 507 NONAME
+ _ZN10QWhatsThis18enterWhatsThisModeEv @ 508 NONAME
+ _ZN10QWhatsThis18leaveWhatsThisModeEv @ 509 NONAME
+ _ZN10QWhatsThis8hideTextEv @ 510 NONAME
+ _ZN10QWhatsThis8showTextERK6QPointRK7QStringP7QWidget @ 511 NONAME
+ _ZN10QWhatsThisC1Ev @ 512 NONAME
+ _ZN10QWhatsThisC2Ev @ 513 NONAME
+ _ZN10QWorkspace10childEventEP11QChildEvent @ 514 NONAME
+ _ZN10QWorkspace10paintEventEP11QPaintEvent @ 515 NONAME
+ _ZN10QWorkspace10wheelEventEP11QWheelEvent @ 516 NONAME
+ _ZN10QWorkspace11changeEventEP6QEvent @ 517 NONAME
+ _ZN10QWorkspace11eventFilterEP7QObjectP6QEvent @ 518 NONAME
+ _ZN10QWorkspace11qt_metacallEN11QMetaObject4CallEiPPv @ 519 NONAME
+ _ZN10QWorkspace11qt_metacastEPKc @ 520 NONAME
+ _ZN10QWorkspace11resizeEventEP12QResizeEvent @ 521 NONAME
+ _ZN10QWorkspace12arrangeIconsEv @ 522 NONAME
+ _ZN10QWorkspace13setBackgroundERK6QBrush @ 523 NONAME
+ _ZN10QWorkspace15closeAllWindowsEv @ 524 NONAME
+ _ZN10QWorkspace15setActiveWindowEP7QWidget @ 525 NONAME
+ _ZN10QWorkspace15windowActivatedEP7QWidget @ 526 NONAME
+ _ZN10QWorkspace16staticMetaObjectE @ 527 NONAME DATA 16
+ _ZN10QWorkspace17closeActiveWindowEv @ 528 NONAME
+ _ZN10QWorkspace18activateNextWindowEv @ 529 NONAME
+ _ZN10QWorkspace19getStaticMetaObjectEv @ 530 NONAME
+ _ZN10QWorkspace20setScrollBarsEnabledEb @ 531 NONAME
+ _ZN10QWorkspace22activatePreviousWindowEv @ 532 NONAME
+ _ZN10QWorkspace4tileEv @ 533 NONAME
+ _ZN10QWorkspace5eventEP6QEvent @ 534 NONAME
+ _ZN10QWorkspace7cascadeEv @ 535 NONAME
+ _ZN10QWorkspace9addWindowEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 536 NONAME
+ _ZN10QWorkspace9hideEventEP10QHideEvent @ 537 NONAME
+ _ZN10QWorkspace9showEventEP10QShowEvent @ 538 NONAME
+ _ZN10QWorkspaceC1EP7QWidget @ 539 NONAME
+ _ZN10QWorkspaceC2EP7QWidget @ 540 NONAME
+ _ZN10QWorkspaceD0Ev @ 541 NONAME
+ _ZN10QWorkspaceD1Ev @ 542 NONAME
+ _ZN10QWorkspaceD2Ev @ 543 NONAME
+ _ZN11QCloseEventC1Ev @ 544 NONAME
+ _ZN11QCloseEventC2Ev @ 545 NONAME
+ _ZN11QCloseEventD0Ev @ 546 NONAME
+ _ZN11QCloseEventD1Ev @ 547 NONAME
+ _ZN11QCloseEventD2Ev @ 548 NONAME
+ _ZN11QColumnView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 549 NONAME
+ _ZN11QColumnView11qt_metacallEN11QMetaObject4CallEiPPv @ 550 NONAME
+ _ZN11QColumnView11qt_metacastEPKc @ 551 NONAME
+ _ZN11QColumnView11resizeEventEP12QResizeEvent @ 552 NONAME
+ _ZN11QColumnView12createColumnERK11QModelIndex @ 553 NONAME
+ _ZN11QColumnView12rowsInsertedERK11QModelIndexii @ 554 NONAME
+ _ZN11QColumnView12setRootIndexERK11QModelIndex @ 555 NONAME
+ _ZN11QColumnView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 556 NONAME
+ _ZN11QColumnView14currentChangedERK11QModelIndexS2_ @ 557 NONAME
+ _ZN11QColumnView15setColumnWidthsERK5QListIiE @ 558 NONAME
+ _ZN11QColumnView16scrollContentsByEii @ 559 NONAME
+ _ZN11QColumnView16setPreviewWidgetEP7QWidget @ 560 NONAME
+ _ZN11QColumnView16staticMetaObjectE @ 561 NONAME DATA 16
+ _ZN11QColumnView17setSelectionModelEP19QItemSelectionModel @ 562 NONAME
+ _ZN11QColumnView19getStaticMetaObjectEv @ 563 NONAME
+ _ZN11QColumnView19updatePreviewWidgetERK11QModelIndex @ 564 NONAME
+ _ZN11QColumnView21setResizeGripsVisibleEb @ 565 NONAME
+ _ZN11QColumnView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 566 NONAME
+ _ZN11QColumnView8setModelEP18QAbstractItemModel @ 567 NONAME
+ _ZN11QColumnView9selectAllEv @ 568 NONAME
+ _ZN11QColumnViewC1EP7QWidget @ 569 NONAME
+ _ZN11QColumnViewC1ER18QColumnViewPrivateP7QWidget @ 570 NONAME
+ _ZN11QColumnViewC2EP7QWidget @ 571 NONAME
+ _ZN11QColumnViewC2ER18QColumnViewPrivateP7QWidget @ 572 NONAME
+ _ZN11QColumnViewD0Ev @ 573 NONAME
+ _ZN11QColumnViewD1Ev @ 574 NONAME
+ _ZN11QColumnViewD2Ev @ 575 NONAME
+ _ZN11QDockWidget10closeEventEP11QCloseEvent @ 576 NONAME
+ _ZN11QDockWidget10paintEventEP11QPaintEvent @ 577 NONAME
+ _ZN11QDockWidget11changeEventEP6QEvent @ 578 NONAME
+ _ZN11QDockWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 579 NONAME
+ _ZN11QDockWidget11qt_metacastEPKc @ 580 NONAME
+ _ZN11QDockWidget11setFeaturesE6QFlagsINS_17DockWidgetFeatureEE @ 581 NONAME
+ _ZN11QDockWidget11setFloatingEb @ 582 NONAME
+ _ZN11QDockWidget15featuresChangedE6QFlagsINS_17DockWidgetFeatureEE @ 583 NONAME
+ _ZN11QDockWidget15setAllowedAreasE6QFlagsIN2Qt14DockWidgetAreaEE @ 584 NONAME
+ _ZN11QDockWidget15topLevelChangedEb @ 585 NONAME
+ _ZN11QDockWidget16staticMetaObjectE @ 586 NONAME DATA 16
+ _ZN11QDockWidget17setTitleBarWidgetEP7QWidget @ 587 NONAME
+ _ZN11QDockWidget17visibilityChangedEb @ 588 NONAME
+ _ZN11QDockWidget19allowedAreasChangedE6QFlagsIN2Qt14DockWidgetAreaEE @ 589 NONAME
+ _ZN11QDockWidget19dockLocationChangedEN2Qt14DockWidgetAreaE @ 590 NONAME
+ _ZN11QDockWidget19getStaticMetaObjectEv @ 591 NONAME
+ _ZN11QDockWidget5eventEP6QEvent @ 592 NONAME
+ _ZN11QDockWidget9setWidgetEP7QWidget @ 593 NONAME
+ _ZN11QDockWidgetC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 594 NONAME
+ _ZN11QDockWidgetC1ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 595 NONAME
+ _ZN11QDockWidgetC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 596 NONAME
+ _ZN11QDockWidgetC2ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 597 NONAME
+ _ZN11QDockWidgetD0Ev @ 598 NONAME
+ _ZN11QDockWidgetD1Ev @ 599 NONAME
+ _ZN11QDockWidgetD2Ev @ 600 NONAME
+ _ZN11QFileDialog10selectFileERK7QString @ 601 NONAME
+ _ZN11QFileDialog10setFiltersERK11QStringList @ 602 NONAME
+ _ZN11QFileDialog10setHistoryERK11QStringList @ 603 NONAME
+ _ZN11QFileDialog10setOptionsE6QFlagsINS_6OptionEE @ 604 NONAME
+ _ZN11QFileDialog10setVisibleEb @ 605 NONAME
+ _ZN11QFileDialog11changeEventEP6QEvent @ 606 NONAME
+ _ZN11QFileDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 607 NONAME
+ _ZN11QFileDialog11qt_metacastEPKc @ 608 NONAME
+ _ZN11QFileDialog11setFileModeENS_8FileModeE @ 609 NONAME
+ _ZN11QFileDialog11setReadOnlyEb @ 610 NONAME
+ _ZN11QFileDialog11setViewModeENS_8ViewModeE @ 611 NONAME
+ _ZN11QFileDialog12fileSelectedERK7QString @ 612 NONAME
+ _ZN11QFileDialog12restoreStateERK10QByteArray @ 613 NONAME
+ _ZN11QFileDialog12selectFilterERK7QString @ 614 NONAME
+ _ZN11QFileDialog12setDirectoryERK7QString @ 615 NONAME
+ _ZN11QFileDialog12setLabelTextENS_11DialogLabelERK7QString @ 616 NONAME
+ _ZN11QFileDialog13filesSelectedERK11QStringList @ 617 NONAME
+ _ZN11QFileDialog13setAcceptModeENS_10AcceptModeE @ 618 NONAME
+ _ZN11QFileDialog13setNameFilterERK7QString @ 619 NONAME
+ _ZN11QFileDialog13setProxyModelEP19QAbstractProxyModel @ 620 NONAME
+ _ZN11QFileDialog14currentChangedERK7QString @ 621 NONAME
+ _ZN11QFileDialog14filterSelectedERK7QString @ 622 NONAME
+ _ZN11QFileDialog14setNameFiltersERK11QStringList @ 623 NONAME
+ _ZN11QFileDialog14setSidebarUrlsERK5QListI4QUrlE @ 624 NONAME
+ _ZN11QFileDialog15getOpenFileNameEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 625 NONAME
+ _ZN11QFileDialog15getSaveFileNameEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 626 NONAME
+ _ZN11QFileDialog15setIconProviderEP17QFileIconProvider @ 627 NONAME
+ _ZN11QFileDialog15setItemDelegateEP21QAbstractItemDelegate @ 628 NONAME
+ _ZN11QFileDialog16directoryEnteredERK7QString @ 629 NONAME
+ _ZN11QFileDialog16getOpenFileNamesEP7QWidgetRK7QStringS4_S4_PS2_6QFlagsINS_6OptionEE @ 630 NONAME
+ _ZN11QFileDialog16selectNameFilterERK7QString @ 631 NONAME
+ _ZN11QFileDialog16setDefaultSuffixERK7QString @ 632 NONAME
+ _ZN11QFileDialog16staticMetaObjectE @ 633 NONAME DATA 16
+ _ZN11QFileDialog18setResolveSymlinksEb @ 634 NONAME
+ _ZN11QFileDialog19getStaticMetaObjectEv @ 635 NONAME
+ _ZN11QFileDialog19setConfirmOverwriteEb @ 636 NONAME
+ _ZN11QFileDialog20getExistingDirectoryEP7QWidgetRK7QStringS4_6QFlagsINS_6OptionEE @ 637 NONAME
+ _ZN11QFileDialog27setNameFilterDetailsVisibleEb @ 638 NONAME
+ _ZN11QFileDialog4doneEi @ 639 NONAME
+ _ZN11QFileDialog4openEP7QObjectPKc @ 640 NONAME
+ _ZN11QFileDialog6acceptEv @ 641 NONAME
+ _ZN11QFileDialog9setFilterE6QFlagsIN4QDir6FilterEE @ 642 NONAME
+ _ZN11QFileDialog9setFilterERK7QString @ 643 NONAME
+ _ZN11QFileDialog9setOptionENS_6OptionEb @ 644 NONAME
+ _ZN11QFileDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 645 NONAME
+ _ZN11QFileDialogC1EP7QWidgetRK7QStringS4_S4_ @ 646 NONAME
+ _ZN11QFileDialogC1ERK15QFileDialogArgs @ 647 NONAME
+ _ZN11QFileDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 648 NONAME
+ _ZN11QFileDialogC2EP7QWidgetRK7QStringS4_S4_ @ 649 NONAME
+ _ZN11QFileDialogC2ERK15QFileDialogArgs @ 650 NONAME
+ _ZN11QFileDialogD0Ev @ 651 NONAME
+ _ZN11QFileDialogD1Ev @ 652 NONAME
+ _ZN11QFileDialogD2Ev @ 653 NONAME
+ _ZN11QFocusEvent6reasonEv @ 654 NONAME
+ _ZN11QFocusEventC1EN6QEvent4TypeEN2Qt11FocusReasonE @ 655 NONAME
+ _ZN11QFocusEventC2EN6QEvent4TypeEN2Qt11FocusReasonE @ 656 NONAME
+ _ZN11QFocusEventD0Ev @ 657 NONAME
+ _ZN11QFocusEventD1Ev @ 658 NONAME
+ _ZN11QFocusEventD2Ev @ 659 NONAME
+ _ZN11QFocusFrame10paintEventEP11QPaintEvent @ 660 NONAME
+ _ZN11QFocusFrame11eventFilterEP7QObjectP6QEvent @ 661 NONAME
+ _ZN11QFocusFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 662 NONAME
+ _ZN11QFocusFrame11qt_metacastEPKc @ 663 NONAME
+ _ZN11QFocusFrame16staticMetaObjectE @ 664 NONAME DATA 16
+ _ZN11QFocusFrame19getStaticMetaObjectEv @ 665 NONAME
+ _ZN11QFocusFrame5eventEP6QEvent @ 666 NONAME
+ _ZN11QFocusFrame9setWidgetEP7QWidget @ 667 NONAME
+ _ZN11QFocusFrameC1EP7QWidget @ 668 NONAME
+ _ZN11QFocusFrameC2EP7QWidget @ 669 NONAME
+ _ZN11QFocusFrameD0Ev @ 670 NONAME
+ _ZN11QFocusFrameD1Ev @ 671 NONAME
+ _ZN11QFocusFrameD2Ev @ 672 NONAME
+ _ZN11QFontDialog10setOptionsE6QFlagsINS_16FontDialogOptionEE @ 673 NONAME
+ _ZN11QFontDialog10setVisibleEb @ 674 NONAME
+ _ZN11QFontDialog11changeEventEP6QEvent @ 675 NONAME
+ _ZN11QFontDialog11eventFilterEP7QObjectP6QEvent @ 676 NONAME
+ _ZN11QFontDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 677 NONAME
+ _ZN11QFontDialog11qt_metacastEPKc @ 678 NONAME
+ _ZN11QFontDialog12fontSelectedERK5QFont @ 679 NONAME
+ _ZN11QFontDialog14setCurrentFontERK5QFont @ 680 NONAME
+ _ZN11QFontDialog16staticMetaObjectE @ 681 NONAME DATA 16
+ _ZN11QFontDialog18currentFontChangedERK5QFont @ 682 NONAME
+ _ZN11QFontDialog19getStaticMetaObjectEv @ 683 NONAME
+ _ZN11QFontDialog4doneEi @ 684 NONAME
+ _ZN11QFontDialog4openEP7QObjectPKc @ 685 NONAME
+ _ZN11QFontDialog7getFontEPbP7QWidget @ 686 NONAME
+ _ZN11QFontDialog7getFontEPbRK5QFontP7QWidget @ 687 NONAME
+ _ZN11QFontDialog7getFontEPbRK5QFontP7QWidgetRK7QString @ 688 NONAME
+ _ZN11QFontDialog7getFontEPbRK5QFontP7QWidgetRK7QString6QFlagsINS_16FontDialogOptionEE @ 689 NONAME
+ _ZN11QFontDialog9setOptionENS_16FontDialogOptionEb @ 690 NONAME
+ _ZN11QFontDialogC1EP7QWidget @ 691 NONAME
+ _ZN11QFontDialogC1ERK5QFontP7QWidget @ 692 NONAME
+ _ZN11QFontDialogC2EP7QWidget @ 693 NONAME
+ _ZN11QFontDialogC2ERK5QFontP7QWidget @ 694 NONAME
+ _ZN11QFontDialogD0Ev @ 695 NONAME
+ _ZN11QFontDialogD1Ev @ 696 NONAME
+ _ZN11QFontDialogD2Ev @ 697 NONAME
+ _ZN11QFontEngine11boundingBoxEjRK10QTransform @ 698 NONAME
+ _ZN11QFontEngine11grayPaletteEv @ 699 NONAME
+ _ZN11QFontEngine13setGlyphCacheEN21QFontEngineGlyphCache4TypeEPS0_ @ 700 NONAME
+ _ZN11QFontEngine13setGlyphCacheEPvP21QFontEngineGlyphCache @ 701 NONAME
+ _ZN11QFontEngine15addGlyphsToPathEPjP11QFixedPointiP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 702 NONAME
+ _ZN11QFontEngine16addOutlineToPathEffRK12QGlyphLayoutP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 703 NONAME
+ _ZN11QFontEngine16alphaMapForGlyphEj @ 704 NONAME
+ _ZN11QFontEngine16alphaMapForGlyphEjRK10QTransform @ 705 NONAME
+ _ZN11QFontEngine16expireGlyphCacheEv @ 706 NONAME
+ _ZN11QFontEngine16getUnscaledGlyphEjP12QPainterPathP15glyph_metrics_t @ 707 NONAME
+ _ZN11QFontEngine16loadKerningPairsE6QFixed @ 708 NONAME
+ _ZN11QFontEngine16tightBoundingBoxERK12QGlyphLayout @ 709 NONAME
+ _ZN11QFontEngine17getGlyphPositionsERK12QGlyphLayoutRK10QTransform6QFlagsIN9QTextItem10RenderFlagEER15QVarLengthArrayIjLi256EERSA_I11QFixedPointLi256EE @ 710 NONAME
+ _ZN11QFontEngine17getPointInOutlineEjijPiS0_Pj @ 711 NONAME
+ _ZN11QFontEngine19addBitmapFontToPathEffRK12QGlyphLayoutP12QPainterPath6QFlagsIN9QTextItem10RenderFlagEE @ 712 NONAME
+ _ZN11QFontEngine19alphaRGBMapForGlyphEjiRK10QTransform @ 713 NONAME
+ _ZN11QFontEngine20removeGlyphFromCacheEj @ 714 NONAME
+ _ZN11QFontEngine21getTrueTypeGlyphIndexEPKhj @ 715 NONAME
+ _ZN11QFontEngine7getCMapEPKhjPbPi @ 716 NONAME
+ _ZN11QFontEngineC2Ev @ 717 NONAME
+ _ZN11QFontEngineD0Ev @ 718 NONAME
+ _ZN11QFontEngineD1Ev @ 719 NONAME
+ _ZN11QFontEngineD2Ev @ 720 NONAME
+ _ZN11QFormLayout10invalidateEv @ 721 NONAME
+ _ZN11QFormLayout10setSpacingEi @ 722 NONAME
+ _ZN11QFormLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 723 NONAME
+ _ZN11QFormLayout11qt_metacastEPKc @ 724 NONAME
+ _ZN11QFormLayout11setGeometryERK5QRect @ 725 NONAME
+ _ZN11QFormLayout16setFormAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 726 NONAME
+ _ZN11QFormLayout16setRowWrapPolicyENS_13RowWrapPolicyE @ 727 NONAME
+ _ZN11QFormLayout16staticMetaObjectE @ 728 NONAME DATA 16
+ _ZN11QFormLayout17setLabelAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 729 NONAME
+ _ZN11QFormLayout18resetFormAlignmentEv @ 730 NONAME
+ _ZN11QFormLayout18resetRowWrapPolicyEv @ 731 NONAME
+ _ZN11QFormLayout18setVerticalSpacingEi @ 732 NONAME
+ _ZN11QFormLayout19getStaticMetaObjectEv @ 733 NONAME
+ _ZN11QFormLayout19resetLabelAlignmentEv @ 734 NONAME
+ _ZN11QFormLayout20setFieldGrowthPolicyENS_17FieldGrowthPolicyE @ 735 NONAME
+ _ZN11QFormLayout20setHorizontalSpacingEi @ 736 NONAME
+ _ZN11QFormLayout22resetFieldGrowthPolicyEv @ 737 NONAME
+ _ZN11QFormLayout6addRowEP7QLayout @ 738 NONAME
+ _ZN11QFormLayout6addRowEP7QWidget @ 739 NONAME
+ _ZN11QFormLayout6addRowEP7QWidgetP7QLayout @ 740 NONAME
+ _ZN11QFormLayout6addRowEP7QWidgetS1_ @ 741 NONAME
+ _ZN11QFormLayout6addRowERK7QStringP7QLayout @ 742 NONAME
+ _ZN11QFormLayout6addRowERK7QStringP7QWidget @ 743 NONAME
+ _ZN11QFormLayout6takeAtEi @ 744 NONAME
+ _ZN11QFormLayout7addItemEP11QLayoutItem @ 745 NONAME
+ _ZN11QFormLayout7setItemEiNS_8ItemRoleEP11QLayoutItem @ 746 NONAME
+ _ZN11QFormLayout9insertRowEiP7QLayout @ 747 NONAME
+ _ZN11QFormLayout9insertRowEiP7QWidget @ 748 NONAME
+ _ZN11QFormLayout9insertRowEiP7QWidgetP7QLayout @ 749 NONAME
+ _ZN11QFormLayout9insertRowEiP7QWidgetS1_ @ 750 NONAME
+ _ZN11QFormLayout9insertRowEiRK7QStringP7QLayout @ 751 NONAME
+ _ZN11QFormLayout9insertRowEiRK7QStringP7QWidget @ 752 NONAME
+ _ZN11QFormLayout9setLayoutEiNS_8ItemRoleEP7QLayout @ 753 NONAME
+ _ZN11QFormLayout9setWidgetEiNS_8ItemRoleEP7QWidget @ 754 NONAME
+ _ZN11QFormLayoutC1EP7QWidget @ 755 NONAME
+ _ZN11QFormLayoutC2EP7QWidget @ 756 NONAME
+ _ZN11QFormLayoutD0Ev @ 757 NONAME
+ _ZN11QFormLayoutD1Ev @ 758 NONAME
+ _ZN11QFormLayoutD2Ev @ 759 NONAME
+ _ZN11QGridLayout10invalidateEv @ 760 NONAME
+ _ZN11QGridLayout10setSpacingEi @ 761 NONAME
+ _ZN11QGridLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 762 NONAME
+ _ZN11QGridLayout11qt_metacastEPKc @ 763 NONAME
+ _ZN11QGridLayout11setGeometryERK5QRect @ 764 NONAME
+ _ZN11QGridLayout13setRowStretchEii @ 765 NONAME
+ _ZN11QGridLayout15getItemPositionEiPiS0_S0_S0_ @ 766 NONAME
+ _ZN11QGridLayout15setOriginCornerEN2Qt6CornerE @ 767 NONAME
+ _ZN11QGridLayout16setColumnStretchEii @ 768 NONAME
+ _ZN11QGridLayout16staticMetaObjectE @ 769 NONAME DATA 16
+ _ZN11QGridLayout18setVerticalSpacingEi @ 770 NONAME
+ _ZN11QGridLayout19getStaticMetaObjectEv @ 771 NONAME
+ _ZN11QGridLayout19setRowMinimumHeightEii @ 772 NONAME
+ _ZN11QGridLayout20setHorizontalSpacingEi @ 773 NONAME
+ _ZN11QGridLayout21setColumnMinimumWidthEii @ 774 NONAME
+ _ZN11QGridLayout21setDefaultPositioningEiN2Qt11OrientationE @ 775 NONAME
+ _ZN11QGridLayout6takeAtEi @ 776 NONAME
+ _ZN11QGridLayout7addItemEP11QLayoutItem @ 777 NONAME
+ _ZN11QGridLayout7addItemEP11QLayoutItemiiii6QFlagsIN2Qt13AlignmentFlagEE @ 778 NONAME
+ _ZN11QGridLayout9addLayoutEP7QLayoutii6QFlagsIN2Qt13AlignmentFlagEE @ 779 NONAME
+ _ZN11QGridLayout9addLayoutEP7QLayoutiiii6QFlagsIN2Qt13AlignmentFlagEE @ 780 NONAME
+ _ZN11QGridLayout9addWidgetEP7QWidgetii6QFlagsIN2Qt13AlignmentFlagEE @ 781 NONAME
+ _ZN11QGridLayout9addWidgetEP7QWidgetiiii6QFlagsIN2Qt13AlignmentFlagEE @ 782 NONAME
+ _ZN11QGridLayoutC1EP7QWidget @ 783 NONAME
+ _ZN11QGridLayoutC1Ev @ 784 NONAME
+ _ZN11QGridLayoutC2EP7QWidget @ 785 NONAME
+ _ZN11QGridLayoutC2Ev @ 786 NONAME
+ _ZN11QGridLayoutD0Ev @ 787 NONAME
+ _ZN11QGridLayoutD1Ev @ 788 NONAME
+ _ZN11QGridLayoutD2Ev @ 789 NONAME
+ _ZN11QHBoxLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 790 NONAME
+ _ZN11QHBoxLayout11qt_metacastEPKc @ 791 NONAME
+ _ZN11QHBoxLayout16staticMetaObjectE @ 792 NONAME DATA 16
+ _ZN11QHBoxLayout19getStaticMetaObjectEv @ 793 NONAME
+ _ZN11QHBoxLayoutC1EP7QWidget @ 794 NONAME
+ _ZN11QHBoxLayoutC1Ev @ 795 NONAME
+ _ZN11QHBoxLayoutC2EP7QWidget @ 796 NONAME
+ _ZN11QHBoxLayoutC2Ev @ 797 NONAME
+ _ZN11QHBoxLayoutD0Ev @ 798 NONAME
+ _ZN11QHBoxLayoutD1Ev @ 799 NONAME
+ _ZN11QHBoxLayoutD2Ev @ 800 NONAME
+ _ZN11QHeaderView10initializeEv @ 801 NONAME
+ _ZN11QHeaderView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 802 NONAME
+ _ZN11QHeaderView10paintEventEP11QPaintEvent @ 803 NONAME
+ _ZN11QHeaderView10setMovableEb @ 804 NONAME
+ _ZN11QHeaderView11dataChangedERK11QModelIndexS2_ @ 805 NONAME
+ _ZN11QHeaderView11moveSectionEii @ 806 NONAME
+ _ZN11QHeaderView11qt_metacallEN11QMetaObject4CallEiPPv @ 807 NONAME
+ _ZN11QHeaderView11qt_metacastEPKc @ 808 NONAME
+ _ZN11QHeaderView12restoreStateERK10QByteArray @ 809 NONAME
+ _ZN11QHeaderView12rowsInsertedERK11QModelIndexii @ 810 NONAME
+ _ZN11QHeaderView12sectionMovedEiii @ 811 NONAME
+ _ZN11QHeaderView12setClickableEb @ 812 NONAME
+ _ZN11QHeaderView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 813 NONAME
+ _ZN11QHeaderView12swapSectionsEii @ 814 NONAME
+ _ZN11QHeaderView13doItemsLayoutEv @ 815 NONAME
+ _ZN11QHeaderView13resizeSectionEii @ 816 NONAME
+ _ZN11QHeaderView13setResizeModeENS_10ResizeModeE @ 817 NONAME
+ _ZN11QHeaderView13setResizeModeEiNS_10ResizeModeE @ 818 NONAME
+ _ZN11QHeaderView13updateSectionEi @ 819 NONAME
+ _ZN11QHeaderView13viewportEventEP6QEvent @ 820 NONAME
+ _ZN11QHeaderView14currentChangedERK11QModelIndexS2_ @ 821 NONAME
+ _ZN11QHeaderView14mouseMoveEventEP11QMouseEvent @ 822 NONAME
+ _ZN11QHeaderView14resizeSectionsENS_10ResizeModeE @ 823 NONAME
+ _ZN11QHeaderView14resizeSectionsEv @ 824 NONAME
+ _ZN11QHeaderView14sectionClickedEi @ 825 NONAME
+ _ZN11QHeaderView14sectionEnteredEi @ 826 NONAME
+ _ZN11QHeaderView14sectionPressedEi @ 827 NONAME
+ _ZN11QHeaderView14sectionResizedEiii @ 828 NONAME
+ _ZN11QHeaderView15mousePressEventEP11QMouseEvent @ 829 NONAME
+ _ZN11QHeaderView16scrollContentsByEii @ 830 NONAME
+ _ZN11QHeaderView16sectionsInsertedERK11QModelIndexii @ 831 NONAME
+ _ZN11QHeaderView16setSectionHiddenEib @ 832 NONAME
+ _ZN11QHeaderView16setSortIndicatorEiN2Qt9SortOrderE @ 833 NONAME
+ _ZN11QHeaderView16staticMetaObjectE @ 834 NONAME DATA 16
+ _ZN11QHeaderView16updateGeometriesEv @ 835 NONAME
+ _ZN11QHeaderView17geometriesChangedEv @ 836 NONAME
+ _ZN11QHeaderView17headerDataChangedEN2Qt11OrientationEii @ 837 NONAME
+ _ZN11QHeaderView17mouseReleaseEventEP11QMouseEvent @ 838 NONAME
+ _ZN11QHeaderView17sectionAutoResizeEiNS_10ResizeModeE @ 839 NONAME
+ _ZN11QHeaderView18initializeSectionsEii @ 840 NONAME
+ _ZN11QHeaderView18initializeSectionsEv @ 841 NONAME
+ _ZN11QHeaderView19getStaticMetaObjectEv @ 842 NONAME
+ _ZN11QHeaderView19sectionCountChangedEii @ 843 NONAME
+ _ZN11QHeaderView19setDefaultAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 844 NONAME
+ _ZN11QHeaderView20sectionDoubleClickedEi @ 845 NONAME
+ _ZN11QHeaderView20setHighlightSectionsEb @ 846 NONAME
+ _ZN11QHeaderView20sortIndicatorChangedEiN2Qt9SortOrderE @ 847 NONAME
+ _ZN11QHeaderView21mouseDoubleClickEventEP11QMouseEvent @ 848 NONAME
+ _ZN11QHeaderView21setDefaultSectionSizeEi @ 849 NONAME
+ _ZN11QHeaderView21setMinimumSectionSizeEi @ 850 NONAME
+ _ZN11QHeaderView21setSortIndicatorShownEb @ 851 NONAME
+ _ZN11QHeaderView21setStretchLastSectionEb @ 852 NONAME
+ _ZN11QHeaderView22setOffsetToLastSectionEv @ 853 NONAME
+ _ZN11QHeaderView24sectionsAboutToBeRemovedERK11QModelIndexii @ 854 NONAME
+ _ZN11QHeaderView26sectionHandleDoubleClickedEi @ 855 NONAME
+ _ZN11QHeaderView26setCascadingSectionResizesEb @ 856 NONAME
+ _ZN11QHeaderView26setOffsetToSectionPositionEi @ 857 NONAME
+ _ZN11QHeaderView5eventEP6QEvent @ 858 NONAME
+ _ZN11QHeaderView5resetEv @ 859 NONAME
+ _ZN11QHeaderView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 860 NONAME
+ _ZN11QHeaderView8setModelEP18QAbstractItemModel @ 861 NONAME
+ _ZN11QHeaderView9setOffsetEi @ 862 NONAME
+ _ZN11QHeaderViewC1EN2Qt11OrientationEP7QWidget @ 863 NONAME
+ _ZN11QHeaderViewC1ER18QHeaderViewPrivateN2Qt11OrientationEP7QWidget @ 864 NONAME
+ _ZN11QHeaderViewC2EN2Qt11OrientationEP7QWidget @ 865 NONAME
+ _ZN11QHeaderViewC2ER18QHeaderViewPrivateN2Qt11OrientationEP7QWidget @ 866 NONAME
+ _ZN11QHeaderViewD0Ev @ 867 NONAME
+ _ZN11QHeaderViewD1Ev @ 868 NONAME
+ _ZN11QHeaderViewD2Ev @ 869 NONAME
+ _ZN11QHoverEventC1EN6QEvent4TypeERK6QPointS4_ @ 870 NONAME
+ _ZN11QHoverEventC2EN6QEvent4TypeERK6QPointS4_ @ 871 NONAME
+ _ZN11QHoverEventD0Ev @ 872 NONAME
+ _ZN11QHoverEventD1Ev @ 873 NONAME
+ _ZN11QHoverEventD2Ev @ 874 NONAME
+ _ZN11QIconEngine10actualSizeERK5QSizeN5QIcon4ModeENS3_5StateE @ 875 NONAME
+ _ZN11QIconEngine6pixmapERK5QSizeN5QIcon4ModeENS3_5StateE @ 876 NONAME
+ _ZN11QIconEngine7addFileERK7QStringRK5QSizeN5QIcon4ModeENS6_5StateE @ 877 NONAME
+ _ZN11QIconEngine9addPixmapERK7QPixmapN5QIcon4ModeENS3_5StateE @ 878 NONAME
+ _ZN11QIconEngineD0Ev @ 879 NONAME
+ _ZN11QIconEngineD1Ev @ 880 NONAME
+ _ZN11QIconEngineD2Ev @ 881 NONAME
+ _ZN11QInputEventC1EN6QEvent4TypeE6QFlagsIN2Qt16KeyboardModifierEE @ 882 NONAME
+ _ZN11QInputEventC2EN6QEvent4TypeE6QFlagsIN2Qt16KeyboardModifierEE @ 883 NONAME
+ _ZN11QInputEventD0Ev @ 884 NONAME
+ _ZN11QInputEventD1Ev @ 885 NONAME
+ _ZN11QInputEventD2Ev @ 886 NONAME
+ _ZN11QLayoutItem10invalidateEv @ 887 NONAME
+ _ZN11QLayoutItem10spacerItemEv @ 888 NONAME
+ _ZN11QLayoutItem12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 889 NONAME
+ _ZN11QLayoutItem6layoutEv @ 890 NONAME
+ _ZN11QLayoutItem6widgetEv @ 891 NONAME
+ _ZN11QLayoutItemD0Ev @ 892 NONAME
+ _ZN11QLayoutItemD1Ev @ 893 NONAME
+ _ZN11QLayoutItemD2Ev @ 894 NONAME
+ _ZN11QListWidget10insertItemEiP15QListWidgetItem @ 895 NONAME
+ _ZN11QListWidget10insertItemEiRK7QString @ 896 NONAME
+ _ZN11QListWidget11insertItemsEiRK11QStringList @ 897 NONAME
+ _ZN11QListWidget11itemChangedEP15QListWidgetItem @ 898 NONAME
+ _ZN11QListWidget11itemClickedEP15QListWidgetItem @ 899 NONAME
+ _ZN11QListWidget11itemEnteredEP15QListWidgetItem @ 900 NONAME
+ _ZN11QListWidget11itemPressedEP15QListWidgetItem @ 901 NONAME
+ _ZN11QListWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 902 NONAME
+ _ZN11QListWidget11qt_metacastEPKc @ 903 NONAME
+ _ZN11QListWidget12dropMimeDataEiPK9QMimeDataN2Qt10DropActionE @ 904 NONAME
+ _ZN11QListWidget12scrollToItemEPK15QListWidgetItemN17QAbstractItemView10ScrollHintE @ 905 NONAME
+ _ZN11QListWidget13itemActivatedEP15QListWidgetItem @ 906 NONAME
+ _ZN11QListWidget13setCurrentRowEi @ 907 NONAME
+ _ZN11QListWidget13setCurrentRowEi6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 908 NONAME
+ _ZN11QListWidget13setItemHiddenEPK15QListWidgetItemb @ 909 NONAME
+ _ZN11QListWidget13setItemWidgetEP15QListWidgetItemP7QWidget @ 910 NONAME
+ _ZN11QListWidget14setCurrentItemEP15QListWidgetItem @ 911 NONAME
+ _ZN11QListWidget14setCurrentItemEP15QListWidgetItem6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 912 NONAME
+ _ZN11QListWidget15setItemSelectedEPK15QListWidgetItemb @ 913 NONAME
+ _ZN11QListWidget16staticMetaObjectE @ 914 NONAME DATA 16
+ _ZN11QListWidget17currentRowChangedEi @ 915 NONAME
+ _ZN11QListWidget17itemDoubleClickedEP15QListWidgetItem @ 916 NONAME
+ _ZN11QListWidget17setSortingEnabledEb @ 917 NONAME
+ _ZN11QListWidget18currentItemChangedEP15QListWidgetItemS1_ @ 918 NONAME
+ _ZN11QListWidget18currentTextChangedERK7QString @ 919 NONAME
+ _ZN11QListWidget19getStaticMetaObjectEv @ 920 NONAME
+ _ZN11QListWidget20itemSelectionChangedEv @ 921 NONAME
+ _ZN11QListWidget20openPersistentEditorEP15QListWidgetItem @ 922 NONAME
+ _ZN11QListWidget21closePersistentEditorEP15QListWidgetItem @ 923 NONAME
+ _ZN11QListWidget5clearEv @ 924 NONAME
+ _ZN11QListWidget5eventEP6QEvent @ 925 NONAME
+ _ZN11QListWidget8editItemEP15QListWidgetItem @ 926 NONAME
+ _ZN11QListWidget8setModelEP18QAbstractItemModel @ 927 NONAME
+ _ZN11QListWidget8takeItemEi @ 928 NONAME
+ _ZN11QListWidget9dropEventEP10QDropEvent @ 929 NONAME
+ _ZN11QListWidget9sortItemsEN2Qt9SortOrderE @ 930 NONAME
+ _ZN11QListWidgetC1EP7QWidget @ 931 NONAME
+ _ZN11QListWidgetC2EP7QWidget @ 932 NONAME
+ _ZN11QListWidgetD0Ev @ 933 NONAME
+ _ZN11QListWidgetD1Ev @ 934 NONAME
+ _ZN11QListWidgetD2Ev @ 935 NONAME
+ _ZN11QMainWindow10addToolBarEN2Qt11ToolBarAreaEP8QToolBar @ 936 NONAME
+ _ZN11QMainWindow10addToolBarEP8QToolBar @ 937 NONAME
+ _ZN11QMainWindow10addToolBarERK7QString @ 938 NONAME
+ _ZN11QMainWindow10setMenuBarEP8QMenuBar @ 939 NONAME
+ _ZN11QMainWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 940 NONAME
+ _ZN11QMainWindow11qt_metacastEPKc @ 941 NONAME
+ _ZN11QMainWindow11setAnimatedEb @ 942 NONAME
+ _ZN11QMainWindow11setIconSizeERK5QSize @ 943 NONAME
+ _ZN11QMainWindow11setTabShapeEN10QTabWidget8TabShapeE @ 944 NONAME
+ _ZN11QMainWindow12restoreStateERK10QByteArrayi @ 945 NONAME
+ _ZN11QMainWindow12setStatusBarEP10QStatusBar @ 946 NONAME
+ _ZN11QMainWindow13addDockWidgetEN2Qt14DockWidgetAreaEP11QDockWidget @ 947 NONAME
+ _ZN11QMainWindow13addDockWidgetEN2Qt14DockWidgetAreaEP11QDockWidgetNS0_11OrientationE @ 948 NONAME
+ _ZN11QMainWindow13insertToolBarEP8QToolBarS1_ @ 949 NONAME
+ _ZN11QMainWindow13removeToolBarEP8QToolBar @ 950 NONAME
+ _ZN11QMainWindow13setMenuWidgetEP7QWidget @ 951 NONAME
+ _ZN11QMainWindow14setDockOptionsE6QFlagsINS_10DockOptionEE @ 952 NONAME
+ _ZN11QMainWindow14setTabPositionE6QFlagsIN2Qt14DockWidgetAreaEEN10QTabWidget11TabPositionE @ 953 NONAME
+ _ZN11QMainWindow15addToolBarBreakEN2Qt11ToolBarAreaE @ 954 NONAME
+ _ZN11QMainWindow15createPopupMenuEv @ 955 NONAME
+ _ZN11QMainWindow15iconSizeChangedERK5QSize @ 956 NONAME
+ _ZN11QMainWindow15setDocumentModeEb @ 957 NONAME
+ _ZN11QMainWindow15splitDockWidgetEP11QDockWidgetS1_N2Qt11OrientationE @ 958 NONAME
+ _ZN11QMainWindow16contextMenuEventEP17QContextMenuEvent @ 959 NONAME
+ _ZN11QMainWindow16removeDockWidgetEP11QDockWidget @ 960 NONAME
+ _ZN11QMainWindow16setCentralWidgetEP7QWidget @ 961 NONAME
+ _ZN11QMainWindow16staticMetaObjectE @ 962 NONAME DATA 16
+ _ZN11QMainWindow16tabifyDockWidgetEP11QDockWidgetS1_ @ 963 NONAME
+ _ZN11QMainWindow17restoreDockWidgetEP11QDockWidget @ 964 NONAME
+ _ZN11QMainWindow18insertToolBarBreakEP8QToolBar @ 965 NONAME
+ _ZN11QMainWindow18removeToolBarBreakEP8QToolBar @ 966 NONAME
+ _ZN11QMainWindow18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 967 NONAME
+ _ZN11QMainWindow19getStaticMetaObjectEv @ 968 NONAME
+ _ZN11QMainWindow21setDockNestingEnabledEb @ 969 NONAME
+ _ZN11QMainWindow22toolButtonStyleChangedEN2Qt15ToolButtonStyleE @ 970 NONAME
+ _ZN11QMainWindow30setUnifiedTitleAndToolBarOnMacEb @ 971 NONAME
+ _ZN11QMainWindow5eventEP6QEvent @ 972 NONAME
+ _ZN11QMainWindow9setCornerEN2Qt6CornerENS0_14DockWidgetAreaE @ 973 NONAME
+ _ZN11QMainWindowC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 974 NONAME
+ _ZN11QMainWindowC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 975 NONAME
+ _ZN11QMainWindowD0Ev @ 976 NONAME
+ _ZN11QMainWindowD1Ev @ 977 NONAME
+ _ZN11QMainWindowD2Ev @ 978 NONAME
+ _ZN11QMessageBox10closeEventEP11QCloseEvent @ 979 NONAME
+ _ZN11QMessageBox11changeEventEP6QEvent @ 980 NONAME
+ _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 981 NONAME
+ _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 982 NONAME
+ _ZN11QMessageBox11informationEP7QWidgetRK7QStringS4_iii @ 983 NONAME
+ _ZN11QMessageBox11qt_metacallEN11QMetaObject4CallEiPPv @ 984 NONAME
+ _ZN11QMessageBox11qt_metacastEPKc @ 985 NONAME
+ _ZN11QMessageBox11resizeEventEP12QResizeEvent @ 986 NONAME
+ _ZN11QMessageBox12removeButtonEP15QAbstractButton @ 987 NONAME
+ _ZN11QMessageBox12standardIconENS_4IconE @ 988 NONAME
+ _ZN11QMessageBox13buttonClickedEP15QAbstractButton @ 989 NONAME
+ _ZN11QMessageBox13keyPressEventEP9QKeyEvent @ 990 NONAME
+ _ZN11QMessageBox13setButtonTextEiRK7QString @ 991 NONAME
+ _ZN11QMessageBox13setIconPixmapERK7QPixmap @ 992 NONAME
+ _ZN11QMessageBox13setTextFormatEN2Qt10TextFormatE @ 993 NONAME
+ _ZN11QMessageBox14setWindowTitleERK7QString @ 994 NONAME
+ _ZN11QMessageBox15setDetailedTextERK7QString @ 995 NONAME
+ _ZN11QMessageBox15setEscapeButtonENS_14StandardButtonE @ 996 NONAME
+ _ZN11QMessageBox15setEscapeButtonEP15QAbstractButton @ 997 NONAME
+ _ZN11QMessageBox16setDefaultButtonENS_14StandardButtonE @ 998 NONAME
+ _ZN11QMessageBox16setDefaultButtonEP11QPushButton @ 999 NONAME
+ _ZN11QMessageBox16staticMetaObjectE @ 1000 NONAME DATA 16
+ _ZN11QMessageBox17setWindowModalityEN2Qt14WindowModalityE @ 1001 NONAME
+ _ZN11QMessageBox18setInformativeTextERK7QString @ 1002 NONAME
+ _ZN11QMessageBox18setStandardButtonsE6QFlagsINS_14StandardButtonEE @ 1003 NONAME
+ _ZN11QMessageBox19getStaticMetaObjectEv @ 1004 NONAME
+ _ZN11QMessageBox4openEP7QObjectPKc @ 1005 NONAME
+ _ZN11QMessageBox5aboutEP7QWidgetRK7QStringS4_ @ 1006 NONAME
+ _ZN11QMessageBox5eventEP6QEvent @ 1007 NONAME
+ _ZN11QMessageBox7aboutQtEP7QWidgetRK7QString @ 1008 NONAME
+ _ZN11QMessageBox7setIconENS_4IconE @ 1009 NONAME
+ _ZN11QMessageBox7setTextERK7QString @ 1010 NONAME
+ _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 1011 NONAME
+ _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 1012 NONAME
+ _ZN11QMessageBox7warningEP7QWidgetRK7QStringS4_iii @ 1013 NONAME
+ _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 1014 NONAME
+ _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 1015 NONAME
+ _ZN11QMessageBox8criticalEP7QWidgetRK7QStringS4_iii @ 1016 NONAME
+ _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_6QFlagsINS_14StandardButtonEES6_ @ 1017 NONAME
+ _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_S4_S4_S4_ii @ 1018 NONAME
+ _ZN11QMessageBox8questionEP7QWidgetRK7QStringS4_iii @ 1019 NONAME
+ _ZN11QMessageBox9addButtonENS_14StandardButtonE @ 1020 NONAME
+ _ZN11QMessageBox9addButtonEP15QAbstractButtonNS_10ButtonRoleE @ 1021 NONAME
+ _ZN11QMessageBox9addButtonERK7QStringNS_10ButtonRoleE @ 1022 NONAME
+ _ZN11QMessageBox9showEventEP10QShowEvent @ 1023 NONAME
+ _ZN11QMessageBoxC1ENS_4IconERK7QStringS3_6QFlagsINS_14StandardButtonEEP7QWidgetS4_IN2Qt10WindowTypeEE @ 1024 NONAME
+ _ZN11QMessageBoxC1EP7QWidget @ 1025 NONAME
+ _ZN11QMessageBoxC1ERK7QStringS2_NS_4IconEiiiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1026 NONAME
+ _ZN11QMessageBoxC2ENS_4IconERK7QStringS3_6QFlagsINS_14StandardButtonEEP7QWidgetS4_IN2Qt10WindowTypeEE @ 1027 NONAME
+ _ZN11QMessageBoxC2EP7QWidget @ 1028 NONAME
+ _ZN11QMessageBoxC2ERK7QStringS2_NS_4IconEiiiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1029 NONAME
+ _ZN11QMessageBoxD0Ev @ 1030 NONAME
+ _ZN11QMessageBoxD1Ev @ 1031 NONAME
+ _ZN11QMessageBoxD2Ev @ 1032 NONAME
+ _ZN11QMimeSourceD0Ev @ 1033 NONAME
+ _ZN11QMimeSourceD1Ev @ 1034 NONAME
+ _ZN11QMimeSourceD2Ev @ 1035 NONAME
+ _ZN11QMouseEvent24createExtendedMouseEventEN6QEvent4TypeERK7QPointFRK6QPointN2Qt11MouseButtonE6QFlagsIS9_ESA_INS8_16KeyboardModifierEE @ 1036 NONAME
+ _ZN11QMouseEventC1EN6QEvent4TypeERK6QPointN2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1037 NONAME
+ _ZN11QMouseEventC1EN6QEvent4TypeERK6QPointS4_N2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1038 NONAME
+ _ZN11QMouseEventC2EN6QEvent4TypeERK6QPointN2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1039 NONAME
+ _ZN11QMouseEventC2EN6QEvent4TypeERK6QPointS4_N2Qt11MouseButtonE6QFlagsIS6_ES7_INS5_16KeyboardModifierEE @ 1040 NONAME
+ _ZN11QMouseEventD0Ev @ 1041 NONAME
+ _ZN11QMouseEventD1Ev @ 1042 NONAME
+ _ZN11QMouseEventD2Ev @ 1043 NONAME
+ _ZN11QPaintEventC1ERK5QRect @ 1044 NONAME
+ _ZN11QPaintEventC1ERK7QRegion @ 1045 NONAME
+ _ZN11QPaintEventC2ERK5QRect @ 1046 NONAME
+ _ZN11QPaintEventC2ERK7QRegion @ 1047 NONAME
+ _ZN11QPaintEventD0Ev @ 1048 NONAME
+ _ZN11QPaintEventD1Ev @ 1049 NONAME
+ _ZN11QPaintEventD2Ev @ 1050 NONAME
+ _ZN11QPanGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 1051 NONAME
+ _ZN11QPanGesture11qt_metacastEPKc @ 1052 NONAME
+ _ZN11QPanGesture13setLastOffsetERK6QSizeF @ 1053 NONAME
+ _ZN11QPanGesture14setTotalOffsetERK6QSizeF @ 1054 NONAME
+ _ZN11QPanGesture15setAccelerationEf @ 1055 NONAME
+ _ZN11QPanGesture16staticMetaObjectE @ 1056 NONAME DATA 16
+ _ZN11QPanGesture19getStaticMetaObjectEv @ 1057 NONAME
+ _ZN11QPanGesture9setOffsetERK6QSizeF @ 1058 NONAME
+ _ZN11QPanGestureC1EP7QObject @ 1059 NONAME
+ _ZN11QPanGestureC2EP7QObject @ 1060 NONAME
+ _ZN11QPixmapData12toNativeTypeENS_10NativeTypeE @ 1061 NONAME
+ _ZN11QPixmapData14fromNativeTypeEPvNS_10NativeTypeE @ 1062 NONAME
+ _ZN11QPixmapData15setAlphaChannelERK7QPixmap @ 1063 NONAME
+ _ZN11QPixmapData15setSerialNumberEi @ 1064 NONAME
+ _ZN11QPixmapData4copyEPKS_RK5QRect @ 1065 NONAME
+ _ZN11QPixmapData6bufferEv @ 1066 NONAME
+ _ZN11QPixmapData6scrollEiiRK5QRect @ 1067 NONAME
+ _ZN11QPixmapData7setMaskERK7QBitmap @ 1068 NONAME
+ _ZN11QPixmapData8fromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 1069 NONAME
+ _ZN11QPixmapData8fromFileERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 1070 NONAME
+ _ZN11QPixmapDataC2ENS_9PixelTypeEi @ 1071 NONAME
+ _ZN11QPixmapDataD0Ev @ 1072 NONAME
+ _ZN11QPixmapDataD1Ev @ 1073 NONAME
+ _ZN11QPixmapDataD2Ev @ 1074 NONAME
+ _ZN11QProxyModel10insertRowsEiiRK11QModelIndex @ 1075 NONAME
+ _ZN11QProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1076 NONAME
+ _ZN11QProxyModel11qt_metacastEPKc @ 1077 NONAME
+ _ZN11QProxyModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 1078 NONAME
+ _ZN11QProxyModel13insertColumnsEiiRK11QModelIndex @ 1079 NONAME
+ _ZN11QProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 1080 NONAME
+ _ZN11QProxyModel16staticMetaObjectE @ 1081 NONAME DATA 16
+ _ZN11QProxyModel19getStaticMetaObjectEv @ 1082 NONAME
+ _ZN11QProxyModel4sortEiN2Qt9SortOrderE @ 1083 NONAME
+ _ZN11QProxyModel6revertEv @ 1084 NONAME
+ _ZN11QProxyModel6submitEv @ 1085 NONAME
+ _ZN11QProxyModel7setDataERK11QModelIndexRK8QVarianti @ 1086 NONAME
+ _ZN11QProxyModel8setModelEP18QAbstractItemModel @ 1087 NONAME
+ _ZN11QProxyModel9fetchMoreERK11QModelIndex @ 1088 NONAME
+ _ZN11QProxyModelC1EP7QObject @ 1089 NONAME
+ _ZN11QProxyModelC1ER18QProxyModelPrivateP7QObject @ 1090 NONAME
+ _ZN11QProxyModelC2EP7QObject @ 1091 NONAME
+ _ZN11QProxyModelC2ER18QProxyModelPrivateP7QObject @ 1092 NONAME
+ _ZN11QProxyModelD0Ev @ 1093 NONAME
+ _ZN11QProxyModelD1Ev @ 1094 NONAME
+ _ZN11QProxyModelD2Ev @ 1095 NONAME
+ _ZN11QProxyStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 1096 NONAME
+ _ZN11QProxyStyle11qt_metacastEPKc @ 1097 NONAME
+ _ZN11QProxyStyle12setBaseStyleEP6QStyle @ 1098 NONAME
+ _ZN11QProxyStyle16staticMetaObjectE @ 1099 NONAME DATA 16
+ _ZN11QProxyStyle19getStaticMetaObjectEv @ 1100 NONAME
+ _ZN11QProxyStyle5eventEP6QEvent @ 1101 NONAME
+ _ZN11QProxyStyle6polishEP12QApplication @ 1102 NONAME
+ _ZN11QProxyStyle6polishEP7QWidget @ 1103 NONAME
+ _ZN11QProxyStyle6polishER8QPalette @ 1104 NONAME
+ _ZN11QProxyStyle8unpolishEP12QApplication @ 1105 NONAME
+ _ZN11QProxyStyle8unpolishEP7QWidget @ 1106 NONAME
+ _ZN11QProxyStyleC1EP6QStyle @ 1107 NONAME
+ _ZN11QProxyStyleC2EP6QStyle @ 1108 NONAME
+ _ZN11QProxyStyleD0Ev @ 1109 NONAME
+ _ZN11QProxyStyleD1Ev @ 1110 NONAME
+ _ZN11QProxyStyleD2Ev @ 1111 NONAME
+ _ZN11QPushButton10paintEventEP11QPaintEvent @ 1112 NONAME
+ _ZN11QPushButton10setDefaultEb @ 1113 NONAME
+ _ZN11QPushButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1114 NONAME
+ _ZN11QPushButton11qt_metacastEPKc @ 1115 NONAME
+ _ZN11QPushButton12focusInEventEP11QFocusEvent @ 1116 NONAME
+ _ZN11QPushButton13focusOutEventEP11QFocusEvent @ 1117 NONAME
+ _ZN11QPushButton13keyPressEventEP9QKeyEvent @ 1118 NONAME
+ _ZN11QPushButton14setAutoDefaultEb @ 1119 NONAME
+ _ZN11QPushButton16staticMetaObjectE @ 1120 NONAME DATA 16
+ _ZN11QPushButton19getStaticMetaObjectEv @ 1121 NONAME
+ _ZN11QPushButton5eventEP6QEvent @ 1122 NONAME
+ _ZN11QPushButton7setFlatEb @ 1123 NONAME
+ _ZN11QPushButton7setMenuEP5QMenu @ 1124 NONAME
+ _ZN11QPushButton8showMenuEv @ 1125 NONAME
+ _ZN11QPushButtonC1EP7QWidget @ 1126 NONAME
+ _ZN11QPushButtonC1ER18QPushButtonPrivateP7QWidget @ 1127 NONAME
+ _ZN11QPushButtonC1ERK5QIconRK7QStringP7QWidget @ 1128 NONAME
+ _ZN11QPushButtonC1ERK7QStringP7QWidget @ 1129 NONAME
+ _ZN11QPushButtonC2EP7QWidget @ 1130 NONAME
+ _ZN11QPushButtonC2ER18QPushButtonPrivateP7QWidget @ 1131 NONAME
+ _ZN11QPushButtonC2ERK5QIconRK7QStringP7QWidget @ 1132 NONAME
+ _ZN11QPushButtonC2ERK7QStringP7QWidget @ 1133 NONAME
+ _ZN11QPushButtonD0Ev @ 1134 NONAME
+ _ZN11QPushButtonD1Ev @ 1135 NONAME
+ _ZN11QPushButtonD2Ev @ 1136 NONAME
+ _ZN11QQuaternion16fromAxisAndAngleERK9QVector3Df @ 1137 NONAME
+ _ZN11QQuaternion16fromAxisAndAngleEffff @ 1138 NONAME
+ _ZN11QQuaternion5nlerpERKS_S1_f @ 1139 NONAME
+ _ZN11QQuaternion5slerpERKS_S1_f @ 1140 NONAME
+ _ZN11QQuaternion9normalizeEv @ 1141 NONAME
+ _ZN11QRubberBand10paintEventEP11QPaintEvent @ 1142 NONAME
+ _ZN11QRubberBand11changeEventEP6QEvent @ 1143 NONAME
+ _ZN11QRubberBand11qt_metacallEN11QMetaObject4CallEiPPv @ 1144 NONAME
+ _ZN11QRubberBand11qt_metacastEPKc @ 1145 NONAME
+ _ZN11QRubberBand11resizeEventEP12QResizeEvent @ 1146 NONAME
+ _ZN11QRubberBand11setGeometryERK5QRect @ 1147 NONAME
+ _ZN11QRubberBand16staticMetaObjectE @ 1148 NONAME DATA 16
+ _ZN11QRubberBand19getStaticMetaObjectEv @ 1149 NONAME
+ _ZN11QRubberBand5eventEP6QEvent @ 1150 NONAME
+ _ZN11QRubberBand9moveEventEP10QMoveEvent @ 1151 NONAME
+ _ZN11QRubberBand9showEventEP10QShowEvent @ 1152 NONAME
+ _ZN11QRubberBandC1ENS_5ShapeEP7QWidget @ 1153 NONAME
+ _ZN11QRubberBandC2ENS_5ShapeEP7QWidget @ 1154 NONAME
+ _ZN11QRubberBandD0Ev @ 1155 NONAME
+ _ZN11QRubberBandD1Ev @ 1156 NONAME
+ _ZN11QRubberBandD2Ev @ 1157 NONAME
+ _ZN11QScrollArea10takeWidgetEv @ 1158 NONAME
+ _ZN11QScrollArea11eventFilterEP7QObjectP6QEvent @ 1159 NONAME
+ _ZN11QScrollArea11qt_metacallEN11QMetaObject4CallEiPPv @ 1160 NONAME
+ _ZN11QScrollArea11qt_metacastEPKc @ 1161 NONAME
+ _ZN11QScrollArea11resizeEventEP12QResizeEvent @ 1162 NONAME
+ _ZN11QScrollArea12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 1163 NONAME
+ _ZN11QScrollArea13ensureVisibleEiiii @ 1164 NONAME
+ _ZN11QScrollArea16scrollContentsByEii @ 1165 NONAME
+ _ZN11QScrollArea16staticMetaObjectE @ 1166 NONAME DATA 16
+ _ZN11QScrollArea18focusNextPrevChildEb @ 1167 NONAME
+ _ZN11QScrollArea18setWidgetResizableEb @ 1168 NONAME
+ _ZN11QScrollArea19ensureWidgetVisibleEP7QWidgetii @ 1169 NONAME
+ _ZN11QScrollArea19getStaticMetaObjectEv @ 1170 NONAME
+ _ZN11QScrollArea5eventEP6QEvent @ 1171 NONAME
+ _ZN11QScrollArea9setWidgetEP7QWidget @ 1172 NONAME
+ _ZN11QScrollAreaC1EP7QWidget @ 1173 NONAME
+ _ZN11QScrollAreaC1ER18QScrollAreaPrivateP7QWidget @ 1174 NONAME
+ _ZN11QScrollAreaC2EP7QWidget @ 1175 NONAME
+ _ZN11QScrollAreaC2ER18QScrollAreaPrivateP7QWidget @ 1176 NONAME
+ _ZN11QScrollAreaD0Ev @ 1177 NONAME
+ _ZN11QScrollAreaD1Ev @ 1178 NONAME
+ _ZN11QScrollAreaD2Ev @ 1179 NONAME
+ _ZN11QSizePolicy14setControlTypeENS_11ControlTypeE @ 1180 NONAME
+ _ZN11QSizePolicy16staticMetaObjectE @ 1181 NONAME DATA 16
+ _ZN11QSizePolicy19getStaticMetaObjectEv @ 1182 NONAME
+ _ZN11QSpacerItem10changeSizeEiiN11QSizePolicy6PolicyES1_ @ 1183 NONAME
+ _ZN11QSpacerItem10spacerItemEv @ 1184 NONAME
+ _ZN11QSpacerItem11setGeometryERK5QRect @ 1185 NONAME
+ _ZN11QStrokerOps10strokePathERK12QPainterPathPvRK10QTransform @ 1186 NONAME
+ _ZN11QStrokerOps13strokeEllipseERK6QRectFPvRK10QTransform @ 1187 NONAME
+ _ZN11QStrokerOps13strokePolygonEPK7QPointFibPvRK10QTransform @ 1188 NONAME
+ _ZN11QStrokerOps3endEv @ 1189 NONAME
+ _ZN11QStrokerOps5beginEPv @ 1190 NONAME
+ _ZN11QStrokerOpsC2Ev @ 1191 NONAME
+ _ZN11QStrokerOpsD0Ev @ 1192 NONAME
+ _ZN11QStrokerOpsD1Ev @ 1193 NONAME
+ _ZN11QStrokerOpsD2Ev @ 1194 NONAME
+ _ZN11QTextCursor10createListEN15QTextListFormat5StyleE @ 1195 NONAME
+ _ZN11QTextCursor10createListERK15QTextListFormat @ 1196 NONAME
+ _ZN11QTextCursor10deleteCharEv @ 1197 NONAME
+ _ZN11QTextCursor10insertHtmlERK7QString @ 1198 NONAME
+ _ZN11QTextCursor10insertListEN15QTextListFormat5StyleE @ 1199 NONAME
+ _ZN11QTextCursor10insertListERK15QTextListFormat @ 1200 NONAME
+ _ZN11QTextCursor10insertTextERK7QString @ 1201 NONAME
+ _ZN11QTextCursor10insertTextERK7QStringRK15QTextCharFormat @ 1202 NONAME
+ _ZN11QTextCursor11insertBlockERK16QTextBlockFormat @ 1203 NONAME
+ _ZN11QTextCursor11insertBlockERK16QTextBlockFormatRK15QTextCharFormat @ 1204 NONAME
+ _ZN11QTextCursor11insertBlockEv @ 1205 NONAME
+ _ZN11QTextCursor11insertFrameERK16QTextFrameFormat @ 1206 NONAME
+ _ZN11QTextCursor11insertImageERK16QTextImageFormat @ 1207 NONAME
+ _ZN11QTextCursor11insertImageERK16QTextImageFormatN16QTextFrameFormat8PositionE @ 1208 NONAME
+ _ZN11QTextCursor11insertImageERK6QImageRK7QString @ 1209 NONAME
+ _ZN11QTextCursor11insertImageERK7QString @ 1210 NONAME
+ _ZN11QTextCursor11insertTableEii @ 1211 NONAME
+ _ZN11QTextCursor11insertTableEiiRK16QTextTableFormat @ 1212 NONAME
+ _ZN11QTextCursor11setPositionEiNS_8MoveModeE @ 1213 NONAME
+ _ZN11QTextCursor12endEditBlockEv @ 1214 NONAME
+ _ZN11QTextCursor12movePositionENS_13MoveOperationENS_8MoveModeEi @ 1215 NONAME
+ _ZN11QTextCursor13setCharFormatERK15QTextCharFormat @ 1216 NONAME
+ _ZN11QTextCursor14beginEditBlockEv @ 1217 NONAME
+ _ZN11QTextCursor14clearSelectionEv @ 1218 NONAME
+ _ZN11QTextCursor14insertFragmentERK21QTextDocumentFragment @ 1219 NONAME
+ _ZN11QTextCursor14setBlockFormatERK16QTextBlockFormat @ 1220 NONAME
+ _ZN11QTextCursor15mergeCharFormatERK15QTextCharFormat @ 1221 NONAME
+ _ZN11QTextCursor16mergeBlockFormatERK16QTextBlockFormat @ 1222 NONAME
+ _ZN11QTextCursor18deletePreviousCharEv @ 1223 NONAME
+ _ZN11QTextCursor18removeSelectedTextEv @ 1224 NONAME
+ _ZN11QTextCursor18setBlockCharFormatERK15QTextCharFormat @ 1225 NONAME
+ _ZN11QTextCursor19setVisualNavigationEb @ 1226 NONAME
+ _ZN11QTextCursor20mergeBlockCharFormatERK15QTextCharFormat @ 1227 NONAME
+ _ZN11QTextCursor21joinPreviousEditBlockEv @ 1228 NONAME
+ _ZN11QTextCursor6selectENS_13SelectionTypeE @ 1229 NONAME
+ _ZN11QTextCursorC1EP10QTextFrame @ 1230 NONAME
+ _ZN11QTextCursorC1EP13QTextDocument @ 1231 NONAME
+ _ZN11QTextCursorC1EP18QTextCursorPrivate @ 1232 NONAME
+ _ZN11QTextCursorC1EP20QTextDocumentPrivatei @ 1233 NONAME
+ _ZN11QTextCursorC1ERK10QTextBlock @ 1234 NONAME
+ _ZN11QTextCursorC1ERKS_ @ 1235 NONAME
+ _ZN11QTextCursorC1Ev @ 1236 NONAME
+ _ZN11QTextCursorC2EP10QTextFrame @ 1237 NONAME
+ _ZN11QTextCursorC2EP13QTextDocument @ 1238 NONAME
+ _ZN11QTextCursorC2EP18QTextCursorPrivate @ 1239 NONAME
+ _ZN11QTextCursorC2EP20QTextDocumentPrivatei @ 1240 NONAME
+ _ZN11QTextCursorC2ERK10QTextBlock @ 1241 NONAME
+ _ZN11QTextCursorC2ERKS_ @ 1242 NONAME
+ _ZN11QTextCursorC2Ev @ 1243 NONAME
+ _ZN11QTextCursorD1Ev @ 1244 NONAME
+ _ZN11QTextCursorD2Ev @ 1245 NONAME
+ _ZN11QTextCursoraSERKS_ @ 1246 NONAME
+ _ZN11QTextEngine10freeMemoryEv @ 1247 NONAME
+ _ZN11QTextEngine10invalidateEv @ 1248 NONAME
+ _ZN11QTextEngine11bidiReorderEiPKhPi @ 1249 NONAME
+ _ZN11QTextEngine13clearLineDataEv @ 1250 NONAME
+ _ZN11QTextEngine22indexAdditionalFormatsEv @ 1251 NONAME
+ _ZN11QTextEngine7justifyERK11QScriptLine @ 1252 NONAME
+ _ZN11QTextEngine9shapeLineERK11QScriptLine @ 1253 NONAME
+ _ZN11QTextEngineC1ERK7QStringRK5QFont @ 1254 NONAME
+ _ZN11QTextEngineC1Ev @ 1255 NONAME
+ _ZN11QTextEngineC2ERK7QStringRK5QFont @ 1256 NONAME
+ _ZN11QTextEngineC2Ev @ 1257 NONAME
+ _ZN11QTextEngineD1Ev @ 1258 NONAME
+ _ZN11QTextEngineD2Ev @ 1259 NONAME
+ _ZN11QTextFormat11setPropertyEiRK7QVectorI11QTextLengthE @ 1260 NONAME
+ _ZN11QTextFormat11setPropertyEiRK8QVariant @ 1261 NONAME
+ _ZN11QTextFormat13clearPropertyEi @ 1262 NONAME
+ _ZN11QTextFormat14setObjectIndexEi @ 1263 NONAME
+ _ZN11QTextFormat16staticMetaObjectE @ 1264 NONAME DATA 16
+ _ZN11QTextFormat19getStaticMetaObjectEv @ 1265 NONAME
+ _ZN11QTextFormat5mergeERKS_ @ 1266 NONAME
+ _ZN11QTextFormatC1ERKS_ @ 1267 NONAME
+ _ZN11QTextFormatC1Ei @ 1268 NONAME
+ _ZN11QTextFormatC1Ev @ 1269 NONAME
+ _ZN11QTextFormatC2ERKS_ @ 1270 NONAME
+ _ZN11QTextFormatC2Ei @ 1271 NONAME
+ _ZN11QTextFormatC2Ev @ 1272 NONAME
+ _ZN11QTextFormatD1Ev @ 1273 NONAME
+ _ZN11QTextFormatD2Ev @ 1274 NONAME
+ _ZN11QTextFormataSERKS_ @ 1275 NONAME
+ _ZN11QTextLayout10createLineEv @ 1276 NONAME
+ _ZN11QTextLayout11beginLayoutEv @ 1277 NONAME
+ _ZN11QTextLayout11clearLayoutEv @ 1278 NONAME
+ _ZN11QTextLayout11setPositionERK7QPointF @ 1279 NONAME
+ _ZN11QTextLayout13setTextOptionERK11QTextOption @ 1280 NONAME
+ _ZN11QTextLayout14setPreeditAreaEiRK7QString @ 1281 NONAME
+ _ZN11QTextLayout15setCacheEnabledEb @ 1282 NONAME
+ _ZN11QTextLayout20setAdditionalFormatsERK5QListINS_11FormatRangeEE @ 1283 NONAME
+ _ZN11QTextLayout22clearAdditionalFormatsEv @ 1284 NONAME
+ _ZN11QTextLayout7setFontERK5QFont @ 1285 NONAME
+ _ZN11QTextLayout7setTextERK7QString @ 1286 NONAME
+ _ZN11QTextLayout8setFlagsEi @ 1287 NONAME
+ _ZN11QTextLayout9endLayoutEv @ 1288 NONAME
+ _ZN11QTextLayoutC1ERK10QTextBlock @ 1289 NONAME
+ _ZN11QTextLayoutC1ERK7QString @ 1290 NONAME
+ _ZN11QTextLayoutC1ERK7QStringRK5QFontP12QPaintDevice @ 1291 NONAME
+ _ZN11QTextLayoutC1Ev @ 1292 NONAME
+ _ZN11QTextLayoutC2ERK10QTextBlock @ 1293 NONAME
+ _ZN11QTextLayoutC2ERK7QString @ 1294 NONAME
+ _ZN11QTextLayoutC2ERK7QStringRK5QFontP12QPaintDevice @ 1295 NONAME
+ _ZN11QTextLayoutC2Ev @ 1296 NONAME
+ _ZN11QTextLayoutD1Ev @ 1297 NONAME
+ _ZN11QTextLayoutD2Ev @ 1298 NONAME
+ _ZN11QTextObject11qt_metacallEN11QMetaObject4CallEiPPv @ 1299 NONAME
+ _ZN11QTextObject11qt_metacastEPKc @ 1300 NONAME
+ _ZN11QTextObject16staticMetaObjectE @ 1301 NONAME DATA 16
+ _ZN11QTextObject19getStaticMetaObjectEv @ 1302 NONAME
+ _ZN11QTextObject9setFormatERK11QTextFormat @ 1303 NONAME
+ _ZN11QTextObjectC1EP13QTextDocument @ 1304 NONAME
+ _ZN11QTextObjectC1ER18QTextObjectPrivateP13QTextDocument @ 1305 NONAME
+ _ZN11QTextObjectC2EP13QTextDocument @ 1306 NONAME
+ _ZN11QTextObjectC2ER18QTextObjectPrivateP13QTextDocument @ 1307 NONAME
+ _ZN11QTextObjectD0Ev @ 1308 NONAME
+ _ZN11QTextObjectD1Ev @ 1309 NONAME
+ _ZN11QTextObjectD2Ev @ 1310 NONAME
+ _ZN11QTextOption11setTabArrayE5QListIfE @ 1311 NONAME
+ _ZN11QTextOption7setTabsE5QListINS_3TabEE @ 1312 NONAME
+ _ZN11QTextOptionC1E6QFlagsIN2Qt13AlignmentFlagEE @ 1313 NONAME
+ _ZN11QTextOptionC1ERKS_ @ 1314 NONAME
+ _ZN11QTextOptionC1Ev @ 1315 NONAME
+ _ZN11QTextOptionC2E6QFlagsIN2Qt13AlignmentFlagEE @ 1316 NONAME
+ _ZN11QTextOptionC2ERKS_ @ 1317 NONAME
+ _ZN11QTextOptionC2Ev @ 1318 NONAME
+ _ZN11QTextOptionD1Ev @ 1319 NONAME
+ _ZN11QTextOptionD2Ev @ 1320 NONAME
+ _ZN11QTextOptionaSERKS_ @ 1321 NONAME
+ _ZN11QToolButton10enterEventEP6QEvent @ 1322 NONAME
+ _ZN11QToolButton10leaveEventEP6QEvent @ 1323 NONAME
+ _ZN11QToolButton10paintEventEP11QPaintEvent @ 1324 NONAME
+ _ZN11QToolButton10timerEventEP11QTimerEvent @ 1325 NONAME
+ _ZN11QToolButton11actionEventEP12QActionEvent @ 1326 NONAME
+ _ZN11QToolButton11changeEventEP6QEvent @ 1327 NONAME
+ _ZN11QToolButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1328 NONAME
+ _ZN11QToolButton11qt_metacastEPKc @ 1329 NONAME
+ _ZN11QToolButton12setArrowTypeEN2Qt9ArrowTypeE @ 1330 NONAME
+ _ZN11QToolButton12setAutoRaiseEb @ 1331 NONAME
+ _ZN11QToolButton12setPopupModeENS_19ToolButtonPopupModeE @ 1332 NONAME
+ _ZN11QToolButton14nextCheckStateEv @ 1333 NONAME
+ _ZN11QToolButton15mousePressEventEP11QMouseEvent @ 1334 NONAME
+ _ZN11QToolButton16setDefaultActionEP7QAction @ 1335 NONAME
+ _ZN11QToolButton16staticMetaObjectE @ 1336 NONAME DATA 16
+ _ZN11QToolButton17mouseReleaseEventEP11QMouseEvent @ 1337 NONAME
+ _ZN11QToolButton18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 1338 NONAME
+ _ZN11QToolButton19getStaticMetaObjectEv @ 1339 NONAME
+ _ZN11QToolButton5eventEP6QEvent @ 1340 NONAME
+ _ZN11QToolButton7setMenuEP5QMenu @ 1341 NONAME
+ _ZN11QToolButton8showMenuEv @ 1342 NONAME
+ _ZN11QToolButton9triggeredEP7QAction @ 1343 NONAME
+ _ZN11QToolButtonC1EP7QWidget @ 1344 NONAME
+ _ZN11QToolButtonC1ER18QToolButtonPrivateP7QWidget @ 1345 NONAME
+ _ZN11QToolButtonC2EP7QWidget @ 1346 NONAME
+ _ZN11QToolButtonC2ER18QToolButtonPrivateP7QWidget @ 1347 NONAME
+ _ZN11QToolButtonD0Ev @ 1348 NONAME
+ _ZN11QToolButtonD1Ev @ 1349 NONAME
+ _ZN11QToolButtonD2Ev @ 1350 NONAME
+ _ZN11QTouchEvent10TouchPoint10setLastPosERK7QPointF @ 1351 NONAME
+ _ZN11QTouchEvent10TouchPoint11setPressureEf @ 1352 NONAME
+ _ZN11QTouchEvent10TouchPoint11setScenePosERK7QPointF @ 1353 NONAME
+ _ZN11QTouchEvent10TouchPoint11setStartPosERK7QPointF @ 1354 NONAME
+ _ZN11QTouchEvent10TouchPoint12setSceneRectERK6QRectF @ 1355 NONAME
+ _ZN11QTouchEvent10TouchPoint12setScreenPosERK7QPointF @ 1356 NONAME
+ _ZN11QTouchEvent10TouchPoint13setScreenRectERK6QRectF @ 1357 NONAME
+ _ZN11QTouchEvent10TouchPoint15setLastScenePosERK7QPointF @ 1358 NONAME
+ _ZN11QTouchEvent10TouchPoint16setLastScreenPosERK7QPointF @ 1359 NONAME
+ _ZN11QTouchEvent10TouchPoint16setNormalizedPosERK7QPointF @ 1360 NONAME
+ _ZN11QTouchEvent10TouchPoint16setStartScenePosERK7QPointF @ 1361 NONAME
+ _ZN11QTouchEvent10TouchPoint17setStartScreenPosERK7QPointF @ 1362 NONAME
+ _ZN11QTouchEvent10TouchPoint20setLastNormalizedPosERK7QPointF @ 1363 NONAME
+ _ZN11QTouchEvent10TouchPoint21setStartNormalizedPosERK7QPointF @ 1364 NONAME
+ _ZN11QTouchEvent10TouchPoint5setIdEi @ 1365 NONAME
+ _ZN11QTouchEvent10TouchPoint6setPosERK7QPointF @ 1366 NONAME
+ _ZN11QTouchEvent10TouchPoint7setRectERK6QRectF @ 1367 NONAME
+ _ZN11QTouchEvent10TouchPoint8setStateE6QFlagsIN2Qt15TouchPointStateEE @ 1368 NONAME
+ _ZN11QTouchEvent10TouchPointC1ERKS0_ @ 1369 NONAME
+ _ZN11QTouchEvent10TouchPointC1Ei @ 1370 NONAME
+ _ZN11QTouchEvent10TouchPointC2ERKS0_ @ 1371 NONAME
+ _ZN11QTouchEvent10TouchPointC2Ei @ 1372 NONAME
+ _ZN11QTouchEvent10TouchPointD1Ev @ 1373 NONAME
+ _ZN11QTouchEvent10TouchPointD2Ev @ 1374 NONAME
+ _ZN11QTouchEvent10TouchPointaSERKS0_ @ 1375 NONAME
+ _ZN11QTouchEventC1EN6QEvent4TypeENS_10DeviceTypeE6QFlagsIN2Qt16KeyboardModifierEES3_INS4_15TouchPointStateEERK5QListINS_10TouchPointEE @ 1376 NONAME
+ _ZN11QTouchEventC2EN6QEvent4TypeENS_10DeviceTypeE6QFlagsIN2Qt16KeyboardModifierEES3_INS4_15TouchPointStateEERK5QListINS_10TouchPointEE @ 1377 NONAME
+ _ZN11QTouchEventD0Ev @ 1378 NONAME
+ _ZN11QTouchEventD1Ev @ 1379 NONAME
+ _ZN11QTouchEventD2Ev @ 1380 NONAME
+ _ZN11QTreeWidget10expandItemEPK15QTreeWidgetItem @ 1381 NONAME
+ _ZN11QTreeWidget11itemChangedEP15QTreeWidgetItemi @ 1382 NONAME
+ _ZN11QTreeWidget11itemClickedEP15QTreeWidgetItemi @ 1383 NONAME
+ _ZN11QTreeWidget11itemEnteredEP15QTreeWidgetItemi @ 1384 NONAME
+ _ZN11QTreeWidget11itemPressedEP15QTreeWidgetItemi @ 1385 NONAME
+ _ZN11QTreeWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 1386 NONAME
+ _ZN11QTreeWidget11qt_metacastEPKc @ 1387 NONAME
+ _ZN11QTreeWidget12collapseItemEPK15QTreeWidgetItem @ 1388 NONAME
+ _ZN11QTreeWidget12dropMimeDataEP15QTreeWidgetItemiPK9QMimeDataN2Qt10DropActionE @ 1389 NONAME
+ _ZN11QTreeWidget12itemExpandedEP15QTreeWidgetItem @ 1390 NONAME
+ _ZN11QTreeWidget12scrollToItemEPK15QTreeWidgetItemN17QAbstractItemView10ScrollHintE @ 1391 NONAME
+ _ZN11QTreeWidget13itemActivatedEP15QTreeWidgetItemi @ 1392 NONAME
+ _ZN11QTreeWidget13itemCollapsedEP15QTreeWidgetItem @ 1393 NONAME
+ _ZN11QTreeWidget13setHeaderItemEP15QTreeWidgetItem @ 1394 NONAME
+ _ZN11QTreeWidget13setItemHiddenEPK15QTreeWidgetItemb @ 1395 NONAME
+ _ZN11QTreeWidget13setItemWidgetEP15QTreeWidgetItemiP7QWidget @ 1396 NONAME
+ _ZN11QTreeWidget14setColumnCountEi @ 1397 NONAME
+ _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItem @ 1398 NONAME
+ _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItemi @ 1399 NONAME
+ _ZN11QTreeWidget14setCurrentItemEP15QTreeWidgetItemi6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 1400 NONAME
+ _ZN11QTreeWidget15addTopLevelItemEP15QTreeWidgetItem @ 1401 NONAME
+ _ZN11QTreeWidget15setHeaderLabelsERK11QStringList @ 1402 NONAME
+ _ZN11QTreeWidget15setItemExpandedEPK15QTreeWidgetItemb @ 1403 NONAME
+ _ZN11QTreeWidget15setItemSelectedEPK15QTreeWidgetItemb @ 1404 NONAME
+ _ZN11QTreeWidget16addTopLevelItemsERK5QListIP15QTreeWidgetItemE @ 1405 NONAME
+ _ZN11QTreeWidget16staticMetaObjectE @ 1406 NONAME DATA 16
+ _ZN11QTreeWidget16takeTopLevelItemEi @ 1407 NONAME
+ _ZN11QTreeWidget17itemDoubleClickedEP15QTreeWidgetItemi @ 1408 NONAME
+ _ZN11QTreeWidget17setSelectionModelEP19QItemSelectionModel @ 1409 NONAME
+ _ZN11QTreeWidget17setSortingEnabledEb @ 1410 NONAME
+ _ZN11QTreeWidget18currentItemChangedEP15QTreeWidgetItemS1_ @ 1411 NONAME
+ _ZN11QTreeWidget18insertTopLevelItemEiP15QTreeWidgetItem @ 1412 NONAME
+ _ZN11QTreeWidget19getStaticMetaObjectEv @ 1413 NONAME
+ _ZN11QTreeWidget19indexOfTopLevelItemEP15QTreeWidgetItem @ 1414 NONAME
+ _ZN11QTreeWidget19insertTopLevelItemsEiRK5QListIP15QTreeWidgetItemE @ 1415 NONAME
+ _ZN11QTreeWidget20itemSelectionChangedEv @ 1416 NONAME
+ _ZN11QTreeWidget20openPersistentEditorEP15QTreeWidgetItemi @ 1417 NONAME
+ _ZN11QTreeWidget21closePersistentEditorEP15QTreeWidgetItemi @ 1418 NONAME
+ _ZN11QTreeWidget25setFirstItemColumnSpannedEPK15QTreeWidgetItemb @ 1419 NONAME
+ _ZN11QTreeWidget5clearEv @ 1420 NONAME
+ _ZN11QTreeWidget5eventEP6QEvent @ 1421 NONAME
+ _ZN11QTreeWidget8editItemEP15QTreeWidgetItemi @ 1422 NONAME
+ _ZN11QTreeWidget8setModelEP18QAbstractItemModel @ 1423 NONAME
+ _ZN11QTreeWidget9dropEventEP10QDropEvent @ 1424 NONAME
+ _ZN11QTreeWidget9sortItemsEiN2Qt9SortOrderE @ 1425 NONAME
+ _ZN11QTreeWidgetC1EP7QWidget @ 1426 NONAME
+ _ZN11QTreeWidgetC2EP7QWidget @ 1427 NONAME
+ _ZN11QTreeWidgetD0Ev @ 1428 NONAME
+ _ZN11QTreeWidgetD1Ev @ 1429 NONAME
+ _ZN11QTreeWidgetD2Ev @ 1430 NONAME
+ _ZN11QVBoxLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 1431 NONAME
+ _ZN11QVBoxLayout11qt_metacastEPKc @ 1432 NONAME
+ _ZN11QVBoxLayout16staticMetaObjectE @ 1433 NONAME DATA 16
+ _ZN11QVBoxLayout19getStaticMetaObjectEv @ 1434 NONAME
+ _ZN11QVBoxLayoutC1EP7QWidget @ 1435 NONAME
+ _ZN11QVBoxLayoutC1Ev @ 1436 NONAME
+ _ZN11QVBoxLayoutC2EP7QWidget @ 1437 NONAME
+ _ZN11QVBoxLayoutC2Ev @ 1438 NONAME
+ _ZN11QVBoxLayoutD0Ev @ 1439 NONAME
+ _ZN11QVBoxLayoutD1Ev @ 1440 NONAME
+ _ZN11QVBoxLayoutD2Ev @ 1441 NONAME
+ _ZN11QWheelEventC1ERK6QPointS2_i6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1442 NONAME
+ _ZN11QWheelEventC1ERK6QPointi6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1443 NONAME
+ _ZN11QWheelEventC2ERK6QPointS2_i6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1444 NONAME
+ _ZN11QWheelEventC2ERK6QPointi6QFlagsIN2Qt11MouseButtonEES3_INS4_16KeyboardModifierEENS4_11OrientationE @ 1445 NONAME
+ _ZN11QWheelEventD0Ev @ 1446 NONAME
+ _ZN11QWheelEventD1Ev @ 1447 NONAME
+ _ZN11QWheelEventD2Ev @ 1448 NONAME
+ _ZN11QWidgetItem11setGeometryERK5QRect @ 1449 NONAME
+ _ZN11QWidgetItem6widgetEv @ 1450 NONAME
+ _ZN11QWizardPage11cleanupPageEv @ 1451 NONAME
+ _ZN11QWizardPage11qt_metacallEN11QMetaObject4CallEiPPv @ 1452 NONAME
+ _ZN11QWizardPage11qt_metacastEPKc @ 1453 NONAME
+ _ZN11QWizardPage11setSubTitleERK7QString @ 1454 NONAME
+ _ZN11QWizardPage12setFinalPageEb @ 1455 NONAME
+ _ZN11QWizardPage12validatePageEv @ 1456 NONAME
+ _ZN11QWizardPage13registerFieldERK7QStringP7QWidgetPKcS6_ @ 1457 NONAME
+ _ZN11QWizardPage13setButtonTextEN7QWizard12WizardButtonERK7QString @ 1458 NONAME
+ _ZN11QWizardPage13setCommitPageEb @ 1459 NONAME
+ _ZN11QWizardPage14initializePageEv @ 1460 NONAME
+ _ZN11QWizardPage15completeChangedEv @ 1461 NONAME
+ _ZN11QWizardPage16staticMetaObjectE @ 1462 NONAME DATA 16
+ _ZN11QWizardPage19getStaticMetaObjectEv @ 1463 NONAME
+ _ZN11QWizardPage8setFieldERK7QStringRK8QVariant @ 1464 NONAME
+ _ZN11QWizardPage8setTitleERK7QString @ 1465 NONAME
+ _ZN11QWizardPage9setPixmapEN7QWizard12WizardPixmapERK7QPixmap @ 1466 NONAME
+ _ZN11QWizardPageC1EP7QWidget @ 1467 NONAME
+ _ZN11QWizardPageC2EP7QWidget @ 1468 NONAME
+ _ZN12QActionEventC1EiP7QActionS1_ @ 1469 NONAME
+ _ZN12QActionEventC2EiP7QActionS1_ @ 1470 NONAME
+ _ZN12QActionEventD0Ev @ 1471 NONAME
+ _ZN12QActionEventD1Ev @ 1472 NONAME
+ _ZN12QActionEventD2Ev @ 1473 NONAME
+ _ZN12QActionGroup10setEnabledEb @ 1474 NONAME
+ _ZN12QActionGroup10setVisibleEb @ 1475 NONAME
+ _ZN12QActionGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1476 NONAME
+ _ZN12QActionGroup11qt_metacastEPKc @ 1477 NONAME
+ _ZN12QActionGroup12removeActionEP7QAction @ 1478 NONAME
+ _ZN12QActionGroup12setExclusiveEb @ 1479 NONAME
+ _ZN12QActionGroup16staticMetaObjectE @ 1480 NONAME DATA 16
+ _ZN12QActionGroup19getStaticMetaObjectEv @ 1481 NONAME
+ _ZN12QActionGroup7hoveredEP7QAction @ 1482 NONAME
+ _ZN12QActionGroup8selectedEP7QAction @ 1483 NONAME
+ _ZN12QActionGroup9addActionEP7QAction @ 1484 NONAME
+ _ZN12QActionGroup9addActionERK5QIconRK7QString @ 1485 NONAME
+ _ZN12QActionGroup9addActionERK7QString @ 1486 NONAME
+ _ZN12QActionGroup9triggeredEP7QAction @ 1487 NONAME
+ _ZN12QActionGroupC1EP7QObject @ 1488 NONAME
+ _ZN12QActionGroupC2EP7QObject @ 1489 NONAME
+ _ZN12QActionGroupD0Ev @ 1490 NONAME
+ _ZN12QActionGroupD1Ev @ 1491 NONAME
+ _ZN12QActionGroupD2Ev @ 1492 NONAME
+ _ZN12QApplication10allWidgetsEv @ 1493 NONAME
+ _ZN12QApplication10commitDataER15QSessionManager @ 1494 NONAME
+ _ZN12QApplication10setPaletteERK8QPalettePKc @ 1495 NONAME
+ _ZN12QApplication10topLevelAtERK6QPoint @ 1496 NONAME
+ _ZN12QApplication10windowIconEv @ 1497 NONAME
+ _ZN12QApplication11focusWidgetEv @ 1498 NONAME
+ _ZN12QApplication11fontMetricsEv @ 1499 NONAME
+ _ZN12QApplication11globalStrutEv @ 1500 NONAME
+ _ZN12QApplication11qt_metacallEN11QMetaObject4CallEiPPv @ 1501 NONAME
+ _ZN12QApplication11qt_metacastEPKc @ 1502 NONAME
+ _ZN12QApplication12activeWindowEv @ 1503 NONAME
+ _ZN12QApplication12focusChangedEP7QWidgetS1_ @ 1504 NONAME
+ _ZN12QApplication12mouseButtonsEv @ 1505 NONAME
+ _ZN12QApplication12setColorSpecEi @ 1506 NONAME
+ _ZN12QApplication13compressEventEP6QEventP7QObjectP14QPostEventList @ 1507 NONAME
+ _ZN12QApplication13setStyleSheetERK7QString @ 1508 NONAME
+ _ZN12QApplication13setWindowIconERK5QIcon @ 1509 NONAME
+ _ZN12QApplication13startDragTimeEv @ 1510 NONAME
+ _ZN12QApplication14navigationModeEv @ 1511 NONAME
+ _ZN12QApplication14overrideCursorEv @ 1512 NONAME
+ _ZN12QApplication14s60EventFilterEP8TWsEvent @ 1513 NONAME
+ _ZN12QApplication14setGlobalStrutERK5QSize @ 1514 NONAME
+ _ZN12QApplication15closeAllWindowsEv @ 1515 NONAME
+ _ZN12QApplication15cursorFlashTimeEv @ 1516 NONAME
+ _ZN12QApplication15isEffectEnabledEN2Qt8UIEffectE @ 1517 NONAME
+ _ZN12QApplication15layoutDirectionEv @ 1518 NONAME
+ _ZN12QApplication15s60ProcessEventEP8TWsEvent @ 1519 NONAME
+ _ZN12QApplication15setActiveWindowEP7QWidget @ 1520 NONAME
+ _ZN12QApplication15setInputContextEP13QInputContext @ 1521 NONAME
+ _ZN12QApplication15topLevelWidgetsEv @ 1522 NONAME
+ _ZN12QApplication16lastWindowClosedEv @ 1523 NONAME
+ _ZN12QApplication16saveStateRequestER15QSessionManager @ 1524 NONAME
+ _ZN12QApplication16setEffectEnabledEN2Qt8UIEffectEb @ 1525 NONAME
+ _ZN12QApplication16setStartDragTimeEi @ 1526 NONAME
+ _ZN12QApplication16staticMetaObjectE @ 1527 NONAME DATA 16
+ _ZN12QApplication16wheelScrollLinesEv @ 1528 NONAME
+ _ZN12QApplication17activeModalWidgetEv @ 1529 NONAME
+ _ZN12QApplication17activePopupWidgetEv @ 1530 NONAME
+ _ZN12QApplication17commitDataRequestER15QSessionManager @ 1531 NONAME
+ _ZN12QApplication17keyboardModifiersEv @ 1532 NONAME
+ _ZN12QApplication17setAutoSipEnabledEb @ 1533 NONAME
+ _ZN12QApplication17setGraphicsSystemERK7QString @ 1534 NONAME
+ _ZN12QApplication17setNavigationModeEN2Qt14NavigationModeE @ 1535 NONAME
+ _ZN12QApplication17setOverrideCursorERK7QCursor @ 1536 NONAME
+ _ZN12QApplication17startDragDistanceEv @ 1537 NONAME
+ _ZN12QApplication18setCursorFlashTimeEi @ 1538 NONAME
+ _ZN12QApplication18setLayoutDirectionEN2Qt15LayoutDirectionE @ 1539 NONAME
+ _ZN12QApplication19doubleClickIntervalEv @ 1540 NONAME
+ _ZN12QApplication19fontDatabaseChangedEv @ 1541 NONAME
+ _ZN12QApplication19getStaticMetaObjectEv @ 1542 NONAME
+ _ZN12QApplication19keyboardInputLocaleEv @ 1543 NONAME
+ _ZN12QApplication19setWheelScrollLinesEi @ 1544 NONAME
+ _ZN12QApplication20changeOverrideCursorERK7QCursor @ 1545 NONAME
+ _ZN12QApplication20desktopSettingsAwareEv @ 1546 NONAME
+ _ZN12QApplication20setStartDragDistanceEi @ 1547 NONAME
+ _ZN12QApplication20symbianHandleCommandEi @ 1548 NONAME
+ _ZN12QApplication21keyboardInputIntervalEv @ 1549 NONAME
+ _ZN12QApplication21restoreOverrideCursorEv @ 1550 NONAME
+ _ZN12QApplication21symbianResourceChangeEi @ 1551 NONAME
+ _ZN12QApplication22keyboardInputDirectionEv @ 1552 NONAME
+ _ZN12QApplication22quitOnLastWindowClosedEv @ 1553 NONAME
+ _ZN12QApplication22setDoubleClickIntervalEi @ 1554 NONAME
+ _ZN12QApplication23keypadNavigationEnabledEv @ 1555 NONAME
+ _ZN12QApplication23setDesktopSettingsAwareEb @ 1556 NONAME
+ _ZN12QApplication24setKeyboardInputIntervalEi @ 1557 NONAME
+ _ZN12QApplication25registerGestureRecognizerEP18QGestureRecognizer @ 1558 NONAME
+ _ZN12QApplication25setQuitOnLastWindowClosedEb @ 1559 NONAME
+ _ZN12QApplication26setKeypadNavigationEnabledEb @ 1560 NONAME
+ _ZN12QApplication27unregisterGestureRecognizerEN2Qt11GestureTypeE @ 1561 NONAME
+ _ZN12QApplication4beepEv @ 1562 NONAME
+ _ZN12QApplication4execEv @ 1563 NONAME
+ _ZN12QApplication4fontEPK7QWidget @ 1564 NONAME
+ _ZN12QApplication4fontEPKc @ 1565 NONAME
+ _ZN12QApplication4fontEv @ 1566 NONAME
+ _ZN12QApplication4typeEv @ 1567 NONAME
+ _ZN12QApplication5alertEP7QWidgeti @ 1568 NONAME
+ _ZN12QApplication5eventEP6QEvent @ 1569 NONAME
+ _ZN12QApplication5styleEv @ 1570 NONAME
+ _ZN12QApplication5syncXEv @ 1571 NONAME
+ _ZN12QApplication6notifyEP7QObjectP6QEvent @ 1572 NONAME
+ _ZN12QApplication7aboutQtEv @ 1573 NONAME
+ _ZN12QApplication7desktopEv @ 1574 NONAME
+ _ZN12QApplication7paletteEPK7QWidget @ 1575 NONAME
+ _ZN12QApplication7paletteEPKc @ 1576 NONAME
+ _ZN12QApplication7paletteEv @ 1577 NONAME
+ _ZN12QApplication7setFontERK5QFontPKc @ 1578 NONAME
+ _ZN12QApplication8setStyleEP6QStyle @ 1579 NONAME
+ _ZN12QApplication8setStyleERK7QString @ 1580 NONAME
+ _ZN12QApplication8widgetAtERK6QPoint @ 1581 NONAME
+ _ZN12QApplication9clipboardEv @ 1582 NONAME
+ _ZN12QApplication9colorSpecEv @ 1583 NONAME
+ _ZN12QApplication9saveStateER15QSessionManager @ 1584 NONAME
+ _ZN12QApplicationC1EPFP15CApaApplicationvERiPPc @ 1585 NONAME
+ _ZN12QApplicationC1EPFP15CApaApplicationvERiPPci @ 1586 NONAME
+ _ZN12QApplicationC1ERiPPc @ 1587 NONAME
+ _ZN12QApplicationC1ERiPPcNS_4TypeE @ 1588 NONAME
+ _ZN12QApplicationC1ERiPPcNS_4TypeEi @ 1589 NONAME
+ _ZN12QApplicationC1ERiPPcb @ 1590 NONAME
+ _ZN12QApplicationC1ERiPPcbi @ 1591 NONAME
+ _ZN12QApplicationC1ERiPPci @ 1592 NONAME
+ _ZN12QApplicationC2EPFP15CApaApplicationvERiPPc @ 1593 NONAME
+ _ZN12QApplicationC2EPFP15CApaApplicationvERiPPci @ 1594 NONAME
+ _ZN12QApplicationC2ERiPPc @ 1595 NONAME
+ _ZN12QApplicationC2ERiPPcNS_4TypeE @ 1596 NONAME
+ _ZN12QApplicationC2ERiPPcNS_4TypeEi @ 1597 NONAME
+ _ZN12QApplicationC2ERiPPcb @ 1598 NONAME
+ _ZN12QApplicationC2ERiPPcbi @ 1599 NONAME
+ _ZN12QApplicationC2ERiPPci @ 1600 NONAME
+ _ZN12QApplicationD0Ev @ 1601 NONAME
+ _ZN12QApplicationD1Ev @ 1602 NONAME
+ _ZN12QApplicationD2Ev @ 1603 NONAME
+ _ZN12QButtonGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 1604 NONAME
+ _ZN12QButtonGroup11qt_metacastEPKc @ 1605 NONAME
+ _ZN12QButtonGroup12removeButtonEP15QAbstractButton @ 1606 NONAME
+ _ZN12QButtonGroup12setExclusiveEb @ 1607 NONAME
+ _ZN12QButtonGroup13buttonClickedEP15QAbstractButton @ 1608 NONAME
+ _ZN12QButtonGroup13buttonClickedEi @ 1609 NONAME
+ _ZN12QButtonGroup13buttonPressedEP15QAbstractButton @ 1610 NONAME
+ _ZN12QButtonGroup13buttonPressedEi @ 1611 NONAME
+ _ZN12QButtonGroup14buttonReleasedEP15QAbstractButton @ 1612 NONAME
+ _ZN12QButtonGroup14buttonReleasedEi @ 1613 NONAME
+ _ZN12QButtonGroup16staticMetaObjectE @ 1614 NONAME DATA 16
+ _ZN12QButtonGroup19getStaticMetaObjectEv @ 1615 NONAME
+ _ZN12QButtonGroup5setIdEP15QAbstractButtoni @ 1616 NONAME
+ _ZN12QButtonGroup9addButtonEP15QAbstractButton @ 1617 NONAME
+ _ZN12QButtonGroup9addButtonEP15QAbstractButtoni @ 1618 NONAME
+ _ZN12QButtonGroupC1EP7QObject @ 1619 NONAME
+ _ZN12QButtonGroupC2EP7QObject @ 1620 NONAME
+ _ZN12QButtonGroupD0Ev @ 1621 NONAME
+ _ZN12QButtonGroupD1Ev @ 1622 NONAME
+ _ZN12QButtonGroupD2Ev @ 1623 NONAME
+ _ZN12QColorDialog10setOptionsE6QFlagsINS_17ColorDialogOptionEE @ 1624 NONAME
+ _ZN12QColorDialog10setVisibleEb @ 1625 NONAME
+ _ZN12QColorDialog11changeEventEP6QEvent @ 1626 NONAME
+ _ZN12QColorDialog11customColorEi @ 1627 NONAME
+ _ZN12QColorDialog11customCountEv @ 1628 NONAME
+ _ZN12QColorDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 1629 NONAME
+ _ZN12QColorDialog11qt_metacastEPKc @ 1630 NONAME
+ _ZN12QColorDialog13colorSelectedERK6QColor @ 1631 NONAME
+ _ZN12QColorDialog14setCustomColorEij @ 1632 NONAME
+ _ZN12QColorDialog15setCurrentColorERK6QColor @ 1633 NONAME
+ _ZN12QColorDialog16setStandardColorEij @ 1634 NONAME
+ _ZN12QColorDialog16staticMetaObjectE @ 1635 NONAME DATA 16
+ _ZN12QColorDialog19currentColorChangedERK6QColor @ 1636 NONAME
+ _ZN12QColorDialog19getStaticMetaObjectEv @ 1637 NONAME
+ _ZN12QColorDialog4doneEi @ 1638 NONAME
+ _ZN12QColorDialog4openEP7QObjectPKc @ 1639 NONAME
+ _ZN12QColorDialog7getRgbaEjPbP7QWidget @ 1640 NONAME
+ _ZN12QColorDialog8getColorERK6QColorP7QWidget @ 1641 NONAME
+ _ZN12QColorDialog8getColorERK6QColorP7QWidgetRK7QString6QFlagsINS_17ColorDialogOptionEE @ 1642 NONAME
+ _ZN12QColorDialog9setOptionENS_17ColorDialogOptionEb @ 1643 NONAME
+ _ZN12QColorDialogC1EP7QWidget @ 1644 NONAME
+ _ZN12QColorDialogC1ERK6QColorP7QWidget @ 1645 NONAME
+ _ZN12QColorDialogC2EP7QWidget @ 1646 NONAME
+ _ZN12QColorDialogC2ERK6QColorP7QWidget @ 1647 NONAME
+ _ZN12QColorDialogD0Ev @ 1648 NONAME
+ _ZN12QColorDialogD1Ev @ 1649 NONAME
+ _ZN12QColorDialogD2Ev @ 1650 NONAME
+ _ZN12QCommonStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 1651 NONAME
+ _ZN12QCommonStyle11qt_metacastEPKc @ 1652 NONAME
+ _ZN12QCommonStyle16staticMetaObjectE @ 1653 NONAME DATA 16
+ _ZN12QCommonStyle19getStaticMetaObjectEv @ 1654 NONAME
+ _ZN12QCommonStyle6polishEP12QApplication @ 1655 NONAME
+ _ZN12QCommonStyle6polishEP7QWidget @ 1656 NONAME
+ _ZN12QCommonStyle6polishER8QPalette @ 1657 NONAME
+ _ZN12QCommonStyle8unpolishEP12QApplication @ 1658 NONAME
+ _ZN12QCommonStyle8unpolishEP7QWidget @ 1659 NONAME
+ _ZN12QCommonStyleC1ER19QCommonStylePrivate @ 1660 NONAME
+ _ZN12QCommonStyleC1Ev @ 1661 NONAME
+ _ZN12QCommonStyleC2ER19QCommonStylePrivate @ 1662 NONAME
+ _ZN12QCommonStyleC2Ev @ 1663 NONAME
+ _ZN12QCommonStyleD0Ev @ 1664 NONAME
+ _ZN12QCommonStyleD1Ev @ 1665 NONAME
+ _ZN12QCommonStyleD2Ev @ 1666 NONAME
+ _ZN12QDashStroker15patternForStyleEN2Qt8PenStyleE @ 1667 NONAME
+ _ZN12QDashStroker21processCurrentSubpathEv @ 1668 NONAME
+ _ZN12QDashStrokerC1EP8QStroker @ 1669 NONAME
+ _ZN12QDashStrokerC2EP8QStroker @ 1670 NONAME
+ _ZN12QFontMetricsC1ERK5QFont @ 1671 NONAME
+ _ZN12QFontMetricsC1ERK5QFontP12QPaintDevice @ 1672 NONAME
+ _ZN12QFontMetricsC1ERKS_ @ 1673 NONAME
+ _ZN12QFontMetricsC2ERK5QFont @ 1674 NONAME
+ _ZN12QFontMetricsC2ERK5QFontP12QPaintDevice @ 1675 NONAME
+ _ZN12QFontMetricsC2ERKS_ @ 1676 NONAME
+ _ZN12QFontMetricsD1Ev @ 1677 NONAME
+ _ZN12QFontMetricsD2Ev @ 1678 NONAME
+ _ZN12QFontMetricsaSERKS_ @ 1679 NONAME
+ _ZN12QFontMetricseqERKS_ @ 1680 NONAME
+ _ZN12QFontPrivate7resolveEjPKS_ @ 1681 NONAME
+ _ZN12QFontPrivateC1ERKS_ @ 1682 NONAME
+ _ZN12QFontPrivateC1Ev @ 1683 NONAME
+ _ZN12QFontPrivateC2ERKS_ @ 1684 NONAME
+ _ZN12QFontPrivateC2Ev @ 1685 NONAME
+ _ZN12QFontPrivateD1Ev @ 1686 NONAME
+ _ZN12QFontPrivateD2Ev @ 1687 NONAME
+ _ZN12QImageReader10setQualityEi @ 1688 NONAME
+ _ZN12QImageReader11imageFormatEP9QIODevice @ 1689 NONAME
+ _ZN12QImageReader11imageFormatERK7QString @ 1690 NONAME
+ _ZN12QImageReader11jumpToImageEi @ 1691 NONAME
+ _ZN12QImageReader11setClipRectERK5QRect @ 1692 NONAME
+ _ZN12QImageReader11setFileNameERK7QString @ 1693 NONAME
+ _ZN12QImageReader13setScaledSizeERK5QSize @ 1694 NONAME
+ _ZN12QImageReader15jumpToNextImageEv @ 1695 NONAME
+ _ZN12QImageReader17setScaledClipRectERK5QRect @ 1696 NONAME
+ _ZN12QImageReader18setBackgroundColorERK6QColor @ 1697 NONAME
+ _ZN12QImageReader21supportedImageFormatsEv @ 1698 NONAME
+ _ZN12QImageReader24setAutoDetectImageFormatEb @ 1699 NONAME
+ _ZN12QImageReader26setDecideFormatFromContentEb @ 1700 NONAME
+ _ZN12QImageReader4readEP6QImage @ 1701 NONAME
+ _ZN12QImageReader4readEv @ 1702 NONAME
+ _ZN12QImageReader9setDeviceEP9QIODevice @ 1703 NONAME
+ _ZN12QImageReader9setFormatERK10QByteArray @ 1704 NONAME
+ _ZN12QImageReaderC1EP9QIODeviceRK10QByteArray @ 1705 NONAME
+ _ZN12QImageReaderC1ERK7QStringRK10QByteArray @ 1706 NONAME
+ _ZN12QImageReaderC1Ev @ 1707 NONAME
+ _ZN12QImageReaderC2EP9QIODeviceRK10QByteArray @ 1708 NONAME
+ _ZN12QImageReaderC2ERK7QStringRK10QByteArray @ 1709 NONAME
+ _ZN12QImageReaderC2Ev @ 1710 NONAME
+ _ZN12QImageReaderD1Ev @ 1711 NONAME
+ _ZN12QImageReaderD2Ev @ 1712 NONAME
+ _ZN12QImageWriter10setQualityEi @ 1713 NONAME
+ _ZN12QImageWriter11setFileNameERK7QString @ 1714 NONAME
+ _ZN12QImageWriter14setCompressionEi @ 1715 NONAME
+ _ZN12QImageWriter14setDescriptionERK7QString @ 1716 NONAME
+ _ZN12QImageWriter21supportedImageFormatsEv @ 1717 NONAME
+ _ZN12QImageWriter5writeERK6QImage @ 1718 NONAME
+ _ZN12QImageWriter7setTextERK7QStringS2_ @ 1719 NONAME
+ _ZN12QImageWriter8setGammaEf @ 1720 NONAME
+ _ZN12QImageWriter9setDeviceEP9QIODevice @ 1721 NONAME
+ _ZN12QImageWriter9setFormatERK10QByteArray @ 1722 NONAME
+ _ZN12QImageWriterC1EP9QIODeviceRK10QByteArray @ 1723 NONAME
+ _ZN12QImageWriterC1ERK7QStringRK10QByteArray @ 1724 NONAME
+ _ZN12QImageWriterC1Ev @ 1725 NONAME
+ _ZN12QImageWriterC2EP9QIODeviceRK10QByteArray @ 1726 NONAME
+ _ZN12QImageWriterC2ERK7QStringRK10QByteArray @ 1727 NONAME
+ _ZN12QImageWriterC2Ev @ 1728 NONAME
+ _ZN12QImageWriterD1Ev @ 1729 NONAME
+ _ZN12QImageWriterD2Ev @ 1730 NONAME
+ _ZN12QInputDialog10getIntegerEP7QWidgetRK7QStringS4_iiiiPb6QFlagsIN2Qt10WindowTypeEE @ 1731 NONAME
+ _ZN12QInputDialog10setIntStepEi @ 1732 NONAME
+ _ZN12QInputDialog10setOptionsE6QFlagsINS_17InputDialogOptionEE @ 1733 NONAME
+ _ZN12QInputDialog10setVisibleEb @ 1734 NONAME
+ _ZN12QInputDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 1735 NONAME
+ _ZN12QInputDialog11qt_metacastEPKc @ 1736 NONAME
+ _ZN12QInputDialog11setIntRangeEii @ 1737 NONAME
+ _ZN12QInputDialog11setIntValueEi @ 1738 NONAME
+ _ZN12QInputDialog12setInputModeENS_9InputModeE @ 1739 NONAME
+ _ZN12QInputDialog12setLabelTextERK7QString @ 1740 NONAME
+ _ZN12QInputDialog12setTextValueERK7QString @ 1741 NONAME
+ _ZN12QInputDialog13setIntMaximumEi @ 1742 NONAME
+ _ZN12QInputDialog13setIntMinimumEi @ 1743 NONAME
+ _ZN12QInputDialog14setDoubleRangeEdd @ 1744 NONAME
+ _ZN12QInputDialog14setDoubleValueEd @ 1745 NONAME
+ _ZN12QInputDialog15intValueChangedEi @ 1746 NONAME
+ _ZN12QInputDialog15setOkButtonTextERK7QString @ 1747 NONAME
+ _ZN12QInputDialog15setTextEchoModeEN9QLineEdit8EchoModeE @ 1748 NONAME
+ _ZN12QInputDialog16intValueSelectedEi @ 1749 NONAME
+ _ZN12QInputDialog16setComboBoxItemsERK11QStringList @ 1750 NONAME
+ _ZN12QInputDialog16setDoubleMaximumEd @ 1751 NONAME
+ _ZN12QInputDialog16setDoubleMinimumEd @ 1752 NONAME
+ _ZN12QInputDialog16staticMetaObjectE @ 1753 NONAME DATA 16
+ _ZN12QInputDialog16textValueChangedERK7QString @ 1754 NONAME
+ _ZN12QInputDialog17setDoubleDecimalsEi @ 1755 NONAME
+ _ZN12QInputDialog17textValueSelectedERK7QString @ 1756 NONAME
+ _ZN12QInputDialog18doubleValueChangedEd @ 1757 NONAME
+ _ZN12QInputDialog19doubleValueSelectedEd @ 1758 NONAME
+ _ZN12QInputDialog19getStaticMetaObjectEv @ 1759 NONAME
+ _ZN12QInputDialog19setCancelButtonTextERK7QString @ 1760 NONAME
+ _ZN12QInputDialog19setComboBoxEditableEb @ 1761 NONAME
+ _ZN12QInputDialog4doneEi @ 1762 NONAME
+ _ZN12QInputDialog4openEP7QObjectPKc @ 1763 NONAME
+ _ZN12QInputDialog6getIntEP7QWidgetRK7QStringS4_iiiiPb6QFlagsIN2Qt10WindowTypeEE @ 1764 NONAME
+ _ZN12QInputDialog7getItemEP7QWidgetRK7QStringS4_RK11QStringListibPb6QFlagsIN2Qt10WindowTypeEE @ 1765 NONAME
+ _ZN12QInputDialog7getTextEP7QWidgetRK7QStringS4_N9QLineEdit8EchoModeES4_Pb6QFlagsIN2Qt10WindowTypeEE @ 1766 NONAME
+ _ZN12QInputDialog9getDoubleEP7QWidgetRK7QStringS4_dddiPb6QFlagsIN2Qt10WindowTypeEE @ 1767 NONAME
+ _ZN12QInputDialog9setOptionENS_17InputDialogOptionEb @ 1768 NONAME
+ _ZN12QInputDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1769 NONAME
+ _ZN12QInputDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 1770 NONAME
+ _ZN12QInputDialogD0Ev @ 1771 NONAME
+ _ZN12QInputDialogD1Ev @ 1772 NONAME
+ _ZN12QInputDialogD2Ev @ 1773 NONAME
+ _ZN12QKeySequence10fromStringERK7QStringNS_14SequenceFormatE @ 1774 NONAME
+ _ZN12QKeySequence11keyBindingsENS_11StandardKeyE @ 1775 NONAME
+ _ZN12QKeySequence12decodeStringERK7QString @ 1776 NONAME
+ _ZN12QKeySequence12encodeStringEi @ 1777 NONAME
+ _ZN12QKeySequence6assignERK7QString @ 1778 NONAME
+ _ZN12QKeySequence6setKeyEii @ 1779 NONAME
+ _ZN12QKeySequence8mnemonicERK7QString @ 1780 NONAME
+ _ZN12QKeySequenceC1ENS_11StandardKeyE @ 1781 NONAME
+ _ZN12QKeySequenceC1ERK7QString @ 1782 NONAME
+ _ZN12QKeySequenceC1ERKS_ @ 1783 NONAME
+ _ZN12QKeySequenceC1Eiiii @ 1784 NONAME
+ _ZN12QKeySequenceC1Ev @ 1785 NONAME
+ _ZN12QKeySequenceC2ENS_11StandardKeyE @ 1786 NONAME
+ _ZN12QKeySequenceC2ERK7QString @ 1787 NONAME
+ _ZN12QKeySequenceC2ERKS_ @ 1788 NONAME
+ _ZN12QKeySequenceC2Eiiii @ 1789 NONAME
+ _ZN12QKeySequenceC2Ev @ 1790 NONAME
+ _ZN12QKeySequenceD1Ev @ 1791 NONAME
+ _ZN12QKeySequenceD2Ev @ 1792 NONAME
+ _ZN12QKeySequenceaSERKS_ @ 1793 NONAME
+ _ZN12QLineControl10addCommandERKNS_7CommandE @ 1794 NONAME
+ _ZN12QLineControl10moveCursorEib @ 1795 NONAME
+ _ZN12QLineControl10textEditedERK7QString @ 1796 NONAME
+ _ZN12QLineControl10timerEventEP11QTimerEvent @ 1797 NONAME
+ _ZN12QLineControl11qt_metacallEN11QMetaObject4CallEiPPv @ 1798 NONAME
+ _ZN12QLineControl11qt_metacastEPKc @ 1799 NONAME
+ _ZN12QLineControl11textChangedERK7QString @ 1800 NONAME
+ _ZN12QLineControl12finishChangeEibb @ 1801 NONAME
+ _ZN12QLineControl12internalRedoEv @ 1802 NONAME
+ _ZN12QLineControl12internalUndoEi @ 1803 NONAME
+ _ZN12QLineControl12processEventEP6QEvent @ 1804 NONAME
+ _ZN12QLineControl12setSelectionEii @ 1805 NONAME
+ _ZN12QLineControl12updateNeededERK5QRect @ 1806 NONAME
+ _ZN12QLineControl14internalDeleteEb @ 1807 NONAME
+ _ZN12QLineControl14internalInsertERK7QString @ 1808 NONAME
+ _ZN12QLineControl14parseInputMaskERK7QString @ 1809 NONAME
+ _ZN12QLineControl15editFocusChangeEb @ 1810 NONAME
+ _ZN12QLineControl15editingFinishedEv @ 1811 NONAME
+ _ZN12QLineControl15internalSetTextERK7QStringib @ 1812 NONAME
+ _ZN12QLineControl15processKeyEventEP9QKeyEvent @ 1813 NONAME
+ _ZN12QLineControl15selectWordAtPosEi @ 1814 NONAME
+ _ZN12QLineControl16selectionChangedEv @ 1815 NONAME
+ _ZN12QLineControl16staticMetaObjectE @ 1816 NONAME DATA 16
+ _ZN12QLineControl17_q_deleteSelectedEv @ 1817 NONAME
+ _ZN12QLineControl17processMouseEventEP11QMouseEvent @ 1818 NONAME
+ _ZN12QLineControl17resetInputContextEv @ 1819 NONAME
+ _ZN12QLineControl17updateDisplayTextEv @ 1820 NONAME
+ _ZN12QLineControl18displayTextChangedERK7QString @ 1821 NONAME
+ _ZN12QLineControl18removeSelectedTextEv @ 1822 NONAME
+ _ZN12QLineControl19_q_clipboardChangedEv @ 1823 NONAME
+ _ZN12QLineControl19getStaticMetaObjectEv @ 1824 NONAME
+ _ZN12QLineControl20advanceToEnabledItemEi @ 1825 NONAME
+ _ZN12QLineControl20setCursorBlinkPeriodEi @ 1826 NONAME
+ _ZN12QLineControl21cursorPositionChangedEii @ 1827 NONAME
+ _ZN12QLineControl23processInputMethodEventEP17QInputMethodEvent @ 1828 NONAME
+ _ZN12QLineControl25emitCursorPositionChangedEv @ 1829 NONAME
+ _ZN12QLineControl25updatePasswordEchoEditingEb @ 1830 NONAME
+ _ZN12QLineControl3delEv @ 1831 NONAME
+ _ZN12QLineControl4drawEP8QPainterRK6QPointRK5QRecti @ 1832 NONAME
+ _ZN12QLineControl4initERK7QString @ 1833 NONAME
+ _ZN12QLineControl5clearEv @ 1834 NONAME
+ _ZN12QLineControl5fixupEv @ 1835 NONAME
+ _ZN12QLineControl5pasteEv @ 1836 NONAME
+ _ZN12QLineControl6insertERK7QString @ 1837 NONAME
+ _ZN12QLineControl8acceptedEv @ 1838 NONAME
+ _ZN12QLineControl8completeEi @ 1839 NONAME
+ _ZN12QLineControl9backspaceEv @ 1840 NONAME
+ _ZN12QPaintBuffer13beginNewFrameEv @ 1841 NONAME
+ _ZN12QPaintBuffer15setBoundingRectERK6QRectF @ 1842 NONAME
+ _ZN12QPaintBufferC1ERKS_ @ 1843 NONAME
+ _ZN12QPaintBufferC1Ev @ 1844 NONAME
+ _ZN12QPaintBufferC2ERKS_ @ 1845 NONAME
+ _ZN12QPaintBufferC2Ev @ 1846 NONAME
+ _ZN12QPaintBufferD0Ev @ 1847 NONAME
+ _ZN12QPaintBufferD1Ev @ 1848 NONAME
+ _ZN12QPaintBufferD2Ev @ 1849 NONAME
+ _ZN12QPaintBufferaSERKS_ @ 1850 NONAME
+ _ZN12QPaintDeviceC2Ev @ 1851 NONAME
+ _ZN12QPaintDeviceD0Ev @ 1852 NONAME
+ _ZN12QPaintDeviceD1Ev @ 1853 NONAME
+ _ZN12QPaintDeviceD2Ev @ 1854 NONAME
+ _ZN12QPaintEngine10drawPointsEPK6QPointi @ 1855 NONAME
+ _ZN12QPaintEngine10drawPointsEPK7QPointFi @ 1856 NONAME
+ _ZN12QPaintEngine11drawEllipseERK5QRect @ 1857 NONAME
+ _ZN12QPaintEngine11drawEllipseERK6QRectF @ 1858 NONAME
+ _ZN12QPaintEngine11drawPolygonEPK6QPointiNS_15PolygonDrawModeE @ 1859 NONAME
+ _ZN12QPaintEngine11drawPolygonEPK7QPointFiNS_15PolygonDrawModeE @ 1860 NONAME
+ _ZN12QPaintEngine12drawTextItemERK7QPointFRK9QTextItem @ 1861 NONAME
+ _ZN12QPaintEngine13setSystemClipERK7QRegion @ 1862 NONAME
+ _ZN12QPaintEngine13setSystemRectERK5QRect @ 1863 NONAME
+ _ZN12QPaintEngine14setPaintDeviceEP12QPaintDevice @ 1864 NONAME
+ _ZN12QPaintEngine15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 1865 NONAME
+ _ZN12QPaintEngine8drawPathERK12QPainterPath @ 1866 NONAME
+ _ZN12QPaintEngine9drawImageERK6QRectFRK6QImageS2_6QFlagsIN2Qt19ImageConversionFlagEE @ 1867 NONAME
+ _ZN12QPaintEngine9drawLinesEPK5QLinei @ 1868 NONAME
+ _ZN12QPaintEngine9drawLinesEPK6QLineFi @ 1869 NONAME
+ _ZN12QPaintEngine9drawRectsEPK5QRecti @ 1870 NONAME
+ _ZN12QPaintEngine9drawRectsEPK6QRectFi @ 1871 NONAME
+ _ZN12QPaintEngine9syncStateEv @ 1872 NONAME
+ _ZN12QPaintEngineC2E6QFlagsINS_18PaintEngineFeatureEE @ 1873 NONAME
+ _ZN12QPaintEngineC2ER19QPaintEnginePrivate6QFlagsINS_18PaintEngineFeatureEE @ 1874 NONAME
+ _ZN12QPaintEngineD0Ev @ 1875 NONAME
+ _ZN12QPaintEngineD1Ev @ 1876 NONAME
+ _ZN12QPaintEngineD2Ev @ 1877 NONAME
+ _ZN12QPainterPath10addEllipseERK6QRectF @ 1878 NONAME
+ _ZN12QPainterPath10addPolygonERK9QPolygonF @ 1879 NONAME
+ _ZN12QPainterPath11connectPathERKS_ @ 1880 NONAME
+ _ZN12QPainterPath11setFillRuleEN2Qt8FillRuleE @ 1881 NONAME
+ _ZN12QPainterPath12addRoundRectERK6QRectFii @ 1882 NONAME
+ _ZN12QPainterPath12closeSubpathEv @ 1883 NONAME
+ _ZN12QPainterPath13detach_helperEv @ 1884 NONAME
+ _ZN12QPainterPath14addRoundedRectERK6QRectFffN2Qt8SizeModeE @ 1885 NONAME
+ _ZN12QPainterPath17ensureData_helperEv @ 1886 NONAME
+ _ZN12QPainterPath5arcToERK6QRectFff @ 1887 NONAME
+ _ZN12QPainterPath6lineToERK7QPointF @ 1888 NONAME
+ _ZN12QPainterPath6moveToERK7QPointF @ 1889 NONAME
+ _ZN12QPainterPath6quadToERK7QPointFS2_ @ 1890 NONAME
+ _ZN12QPainterPath7addPathERKS_ @ 1891 NONAME
+ _ZN12QPainterPath7addRectERK6QRectF @ 1892 NONAME
+ _ZN12QPainterPath7addTextERK7QPointFRK5QFontRK7QString @ 1893 NONAME
+ _ZN12QPainterPath7cubicToERK7QPointFS2_S2_ @ 1894 NONAME
+ _ZN12QPainterPath8setDirtyEb @ 1895 NONAME
+ _ZN12QPainterPath9addRegionERK7QRegion @ 1896 NONAME
+ _ZN12QPainterPath9arcMoveToERK6QRectFf @ 1897 NONAME
+ _ZN12QPainterPath9translateEff @ 1898 NONAME
+ _ZN12QPainterPathC1ERK7QPointF @ 1899 NONAME
+ _ZN12QPainterPathC1ERKS_ @ 1900 NONAME
+ _ZN12QPainterPathC1Ev @ 1901 NONAME
+ _ZN12QPainterPathC2ERK7QPointF @ 1902 NONAME
+ _ZN12QPainterPathC2ERKS_ @ 1903 NONAME
+ _ZN12QPainterPathC2Ev @ 1904 NONAME
+ _ZN12QPainterPathD1Ev @ 1905 NONAME
+ _ZN12QPainterPathD2Ev @ 1906 NONAME
+ _ZN12QPainterPathaNERKS_ @ 1907 NONAME
+ _ZN12QPainterPathaSERKS_ @ 1908 NONAME
+ _ZN12QPainterPathmIERKS_ @ 1909 NONAME
+ _ZN12QPainterPathoRERKS_ @ 1910 NONAME
+ _ZN12QPainterPathpLERKS_ @ 1911 NONAME
+ _ZN12QPixmapCache10cacheLimitEv @ 1912 NONAME
+ _ZN12QPixmapCache13setCacheLimitEi @ 1913 NONAME
+ _ZN12QPixmapCache3KeyC1ERKS0_ @ 1914 NONAME
+ _ZN12QPixmapCache3KeyC1Ev @ 1915 NONAME
+ _ZN12QPixmapCache3KeyC2ERKS0_ @ 1916 NONAME
+ _ZN12QPixmapCache3KeyC2Ev @ 1917 NONAME
+ _ZN12QPixmapCache3KeyD1Ev @ 1918 NONAME
+ _ZN12QPixmapCache3KeyD2Ev @ 1919 NONAME
+ _ZN12QPixmapCache3KeyaSERKS0_ @ 1920 NONAME
+ _ZN12QPixmapCache4findERK7QString @ 1921 NONAME
+ _ZN12QPixmapCache4findERK7QStringP7QPixmap @ 1922 NONAME
+ _ZN12QPixmapCache4findERK7QStringR7QPixmap @ 1923 NONAME
+ _ZN12QPixmapCache4findERKNS_3KeyEP7QPixmap @ 1924 NONAME
+ _ZN12QPixmapCache5clearEv @ 1925 NONAME
+ _ZN12QPixmapCache6insertERK7QPixmap @ 1926 NONAME
+ _ZN12QPixmapCache6insertERK7QStringRK7QPixmap @ 1927 NONAME
+ _ZN12QPixmapCache6removeERK7QString @ 1928 NONAME
+ _ZN12QPixmapCache6removeERKNS_3KeyE @ 1929 NONAME
+ _ZN12QPixmapCache7replaceERKNS_3KeyERK7QPixmap @ 1930 NONAME
+ _ZN12QProgressBar10paintEventEP11QPaintEvent @ 1931 NONAME
+ _ZN12QProgressBar10setMaximumEi @ 1932 NONAME
+ _ZN12QProgressBar10setMinimumEi @ 1933 NONAME
+ _ZN12QProgressBar11qt_metacallEN11QMetaObject4CallEiPPv @ 1934 NONAME
+ _ZN12QProgressBar11qt_metacastEPKc @ 1935 NONAME
+ _ZN12QProgressBar12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 1936 NONAME
+ _ZN12QProgressBar12valueChangedEi @ 1937 NONAME
+ _ZN12QProgressBar13textDirectionEv @ 1938 NONAME
+ _ZN12QProgressBar14setOrientationEN2Qt11OrientationE @ 1939 NONAME
+ _ZN12QProgressBar14setTextVisibleEb @ 1940 NONAME
+ _ZN12QProgressBar16setTextDirectionENS_9DirectionE @ 1941 NONAME
+ _ZN12QProgressBar16staticMetaObjectE @ 1942 NONAME DATA 16
+ _ZN12QProgressBar18invertedAppearanceEv @ 1943 NONAME
+ _ZN12QProgressBar19getStaticMetaObjectEv @ 1944 NONAME
+ _ZN12QProgressBar21setInvertedAppearanceEb @ 1945 NONAME
+ _ZN12QProgressBar5eventEP6QEvent @ 1946 NONAME
+ _ZN12QProgressBar5resetEv @ 1947 NONAME
+ _ZN12QProgressBar8setRangeEii @ 1948 NONAME
+ _ZN12QProgressBar8setValueEi @ 1949 NONAME
+ _ZN12QProgressBar9setFormatERK7QString @ 1950 NONAME
+ _ZN12QProgressBarC1EP7QWidget @ 1951 NONAME
+ _ZN12QProgressBarC2EP7QWidget @ 1952 NONAME
+ _ZN12QRadioButton10paintEventEP11QPaintEvent @ 1953 NONAME
+ _ZN12QRadioButton11qt_metacallEN11QMetaObject4CallEiPPv @ 1954 NONAME
+ _ZN12QRadioButton11qt_metacastEPKc @ 1955 NONAME
+ _ZN12QRadioButton14mouseMoveEventEP11QMouseEvent @ 1956 NONAME
+ _ZN12QRadioButton16staticMetaObjectE @ 1957 NONAME DATA 16
+ _ZN12QRadioButton19getStaticMetaObjectEv @ 1958 NONAME
+ _ZN12QRadioButton5eventEP6QEvent @ 1959 NONAME
+ _ZN12QRadioButtonC1EP7QWidget @ 1960 NONAME
+ _ZN12QRadioButtonC1ERK7QStringP7QWidget @ 1961 NONAME
+ _ZN12QRadioButtonC2EP7QWidget @ 1962 NONAME
+ _ZN12QRadioButtonC2ERK7QStringP7QWidget @ 1963 NONAME
+ _ZN12QResizeEventC1ERK5QSizeS2_ @ 1964 NONAME
+ _ZN12QResizeEventC2ERK5QSizeS2_ @ 1965 NONAME
+ _ZN12QResizeEventD0Ev @ 1966 NONAME
+ _ZN12QResizeEventD1Ev @ 1967 NONAME
+ _ZN12QResizeEventD2Ev @ 1968 NONAME
+ _ZN12QStyleOption4initEPK7QWidget @ 1969 NONAME
+ _ZN12QStyleOptionC1ERKS_ @ 1970 NONAME
+ _ZN12QStyleOptionC1Eii @ 1971 NONAME
+ _ZN12QStyleOptionC2ERKS_ @ 1972 NONAME
+ _ZN12QStyleOptionC2Eii @ 1973 NONAME
+ _ZN12QStyleOptionD1Ev @ 1974 NONAME
+ _ZN12QStyleOptionD2Ev @ 1975 NONAME
+ _ZN12QStyleOptionaSERKS_ @ 1976 NONAME
+ _ZN12QStylePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 1977 NONAME
+ _ZN12QStylePlugin11qt_metacastEPKc @ 1978 NONAME
+ _ZN12QStylePlugin16staticMetaObjectE @ 1979 NONAME DATA 16
+ _ZN12QStylePlugin19getStaticMetaObjectEv @ 1980 NONAME
+ _ZN12QStylePluginC2EP7QObject @ 1981 NONAME
+ _ZN12QStylePluginD0Ev @ 1982 NONAME
+ _ZN12QStylePluginD1Ev @ 1983 NONAME
+ _ZN12QStylePluginD2Ev @ 1984 NONAME
+ _ZN12QTableWidget11cellChangedEii @ 1985 NONAME
+ _ZN12QTableWidget11cellClickedEii @ 1986 NONAME
+ _ZN12QTableWidget11cellEnteredEii @ 1987 NONAME
+ _ZN12QTableWidget11cellPressedEii @ 1988 NONAME
+ _ZN12QTableWidget11itemChangedEP16QTableWidgetItem @ 1989 NONAME
+ _ZN12QTableWidget11itemClickedEP16QTableWidgetItem @ 1990 NONAME
+ _ZN12QTableWidget11itemEnteredEP16QTableWidgetItem @ 1991 NONAME
+ _ZN12QTableWidget11itemPressedEP16QTableWidgetItem @ 1992 NONAME
+ _ZN12QTableWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 1993 NONAME
+ _ZN12QTableWidget11qt_metacastEPKc @ 1994 NONAME
+ _ZN12QTableWidget11setRowCountEi @ 1995 NONAME
+ _ZN12QTableWidget12dropMimeDataEiiPK9QMimeDataN2Qt10DropActionE @ 1996 NONAME
+ _ZN12QTableWidget12insertColumnEi @ 1997 NONAME
+ _ZN12QTableWidget12removeColumnEi @ 1998 NONAME
+ _ZN12QTableWidget12scrollToItemEPK16QTableWidgetItemN17QAbstractItemView10ScrollHintE @ 1999 NONAME
+ _ZN12QTableWidget13cellActivatedEii @ 2000 NONAME
+ _ZN12QTableWidget13clearContentsEv @ 2001 NONAME
+ _ZN12QTableWidget13itemActivatedEP16QTableWidgetItem @ 2002 NONAME
+ _ZN12QTableWidget13selectedItemsEv @ 2003 NONAME
+ _ZN12QTableWidget13setCellWidgetEiiP7QWidget @ 2004 NONAME
+ _ZN12QTableWidget14setColumnCountEi @ 2005 NONAME
+ _ZN12QTableWidget14setCurrentCellEii @ 2006 NONAME
+ _ZN12QTableWidget14setCurrentCellEii6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 2007 NONAME
+ _ZN12QTableWidget14setCurrentItemEP16QTableWidgetItem @ 2008 NONAME
+ _ZN12QTableWidget14setCurrentItemEP16QTableWidgetItem6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 2009 NONAME
+ _ZN12QTableWidget15setItemSelectedEPK16QTableWidgetItemb @ 2010 NONAME
+ _ZN12QTableWidget16setItemPrototypeEPK16QTableWidgetItem @ 2011 NONAME
+ _ZN12QTableWidget16setRangeSelectedERK26QTableWidgetSelectionRangeb @ 2012 NONAME
+ _ZN12QTableWidget16staticMetaObjectE @ 2013 NONAME DATA 16
+ _ZN12QTableWidget17cellDoubleClickedEii @ 2014 NONAME
+ _ZN12QTableWidget17itemDoubleClickedEP16QTableWidgetItem @ 2015 NONAME
+ _ZN12QTableWidget17setSortingEnabledEb @ 2016 NONAME
+ _ZN12QTableWidget18currentCellChangedEiiii @ 2017 NONAME
+ _ZN12QTableWidget18currentItemChangedEP16QTableWidgetItemS1_ @ 2018 NONAME
+ _ZN12QTableWidget19getStaticMetaObjectEv @ 2019 NONAME
+ _ZN12QTableWidget20itemSelectionChangedEv @ 2020 NONAME
+ _ZN12QTableWidget20openPersistentEditorEP16QTableWidgetItem @ 2021 NONAME
+ _ZN12QTableWidget21closePersistentEditorEP16QTableWidgetItem @ 2022 NONAME
+ _ZN12QTableWidget21setVerticalHeaderItemEiP16QTableWidgetItem @ 2023 NONAME
+ _ZN12QTableWidget22takeVerticalHeaderItemEi @ 2024 NONAME
+ _ZN12QTableWidget23setHorizontalHeaderItemEiP16QTableWidgetItem @ 2025 NONAME
+ _ZN12QTableWidget23setVerticalHeaderLabelsERK11QStringList @ 2026 NONAME
+ _ZN12QTableWidget24takeHorizontalHeaderItemEi @ 2027 NONAME
+ _ZN12QTableWidget25setHorizontalHeaderLabelsERK11QStringList @ 2028 NONAME
+ _ZN12QTableWidget5clearEv @ 2029 NONAME
+ _ZN12QTableWidget5eventEP6QEvent @ 2030 NONAME
+ _ZN12QTableWidget7setItemEiiP16QTableWidgetItem @ 2031 NONAME
+ _ZN12QTableWidget8editItemEP16QTableWidgetItem @ 2032 NONAME
+ _ZN12QTableWidget8setModelEP18QAbstractItemModel @ 2033 NONAME
+ _ZN12QTableWidget8takeItemEii @ 2034 NONAME
+ _ZN12QTableWidget9dropEventEP10QDropEvent @ 2035 NONAME
+ _ZN12QTableWidget9insertRowEi @ 2036 NONAME
+ _ZN12QTableWidget9removeRowEi @ 2037 NONAME
+ _ZN12QTableWidget9sortItemsEiN2Qt9SortOrderE @ 2038 NONAME
+ _ZN12QTableWidgetC1EP7QWidget @ 2039 NONAME
+ _ZN12QTableWidgetC1EiiP7QWidget @ 2040 NONAME
+ _ZN12QTableWidgetC2EP7QWidget @ 2041 NONAME
+ _ZN12QTableWidgetC2EiiP7QWidget @ 2042 NONAME
+ _ZN12QTableWidgetD0Ev @ 2043 NONAME
+ _ZN12QTableWidgetD1Ev @ 2044 NONAME
+ _ZN12QTableWidgetD2Ev @ 2045 NONAME
+ _ZN12QTabletEventC1EN6QEvent4TypeERK6QPointS4_RK7QPointFiifiiffi6QFlagsIN2Qt16KeyboardModifierEEx @ 2046 NONAME
+ _ZN12QTabletEventC2EN6QEvent4TypeERK6QPointS4_RK7QPointFiifiiffi6QFlagsIN2Qt16KeyboardModifierEEx @ 2047 NONAME
+ _ZN12QTabletEventD0Ev @ 2048 NONAME
+ _ZN12QTabletEventD1Ev @ 2049 NONAME
+ _ZN12QTabletEventD2Ev @ 2050 NONAME
+ _ZN12QTessellator10setWindingEb @ 2051 NONAME
+ _ZN12QTessellator10tessellateEPK7QPointFi @ 2052 NONAME
+ _ZN12QTessellator14tessellateRectERK7QPointFS2_f @ 2053 NONAME
+ _ZN12QTessellator16tessellateConvexEPK7QPointFi @ 2054 NONAME
+ _ZN12QTessellatorC2Ev @ 2055 NONAME
+ _ZN12QTessellatorD0Ev @ 2056 NONAME
+ _ZN12QTessellatorD1Ev @ 2057 NONAME
+ _ZN12QTessellatorD2Ev @ 2058 NONAME
+ _ZN12QTextBrowser10paintEventEP11QPaintEvent @ 2059 NONAME
+ _ZN12QTextBrowser11highlightedERK4QUrl @ 2060 NONAME
+ _ZN12QTextBrowser11highlightedERK7QString @ 2061 NONAME
+ _ZN12QTextBrowser11qt_metacallEN11QMetaObject4CallEiPPv @ 2062 NONAME
+ _ZN12QTextBrowser11qt_metacastEPKc @ 2063 NONAME
+ _ZN12QTextBrowser12clearHistoryEv @ 2064 NONAME
+ _ZN12QTextBrowser12loadResourceEiRK4QUrl @ 2065 NONAME
+ _ZN12QTextBrowser12setOpenLinksEb @ 2066 NONAME
+ _ZN12QTextBrowser13anchorClickedERK4QUrl @ 2067 NONAME
+ _ZN12QTextBrowser13focusOutEventEP11QFocusEvent @ 2068 NONAME
+ _ZN12QTextBrowser13keyPressEventEP9QKeyEvent @ 2069 NONAME
+ _ZN12QTextBrowser13sourceChangedERK4QUrl @ 2070 NONAME
+ _ZN12QTextBrowser14historyChangedEv @ 2071 NONAME
+ _ZN12QTextBrowser14mouseMoveEventEP11QMouseEvent @ 2072 NONAME
+ _ZN12QTextBrowser14setSearchPathsERK11QStringList @ 2073 NONAME
+ _ZN12QTextBrowser15mousePressEventEP11QMouseEvent @ 2074 NONAME
+ _ZN12QTextBrowser16forwardAvailableEb @ 2075 NONAME
+ _ZN12QTextBrowser16staticMetaObjectE @ 2076 NONAME DATA 16
+ _ZN12QTextBrowser17backwardAvailableEb @ 2077 NONAME
+ _ZN12QTextBrowser17mouseReleaseEventEP11QMouseEvent @ 2078 NONAME
+ _ZN12QTextBrowser18focusNextPrevChildEb @ 2079 NONAME
+ _ZN12QTextBrowser19getStaticMetaObjectEv @ 2080 NONAME
+ _ZN12QTextBrowser20setOpenExternalLinksEb @ 2081 NONAME
+ _ZN12QTextBrowser4homeEv @ 2082 NONAME
+ _ZN12QTextBrowser5eventEP6QEvent @ 2083 NONAME
+ _ZN12QTextBrowser6reloadEv @ 2084 NONAME
+ _ZN12QTextBrowser7forwardEv @ 2085 NONAME
+ _ZN12QTextBrowser8backwardEv @ 2086 NONAME
+ _ZN12QTextBrowser9setSourceERK4QUrl @ 2087 NONAME
+ _ZN12QTextBrowserC1EP7QWidget @ 2088 NONAME
+ _ZN12QTextBrowserC2EP7QWidget @ 2089 NONAME
+ _ZN12QTextBrowserD0Ev @ 2090 NONAME
+ _ZN12QTextBrowserD1Ev @ 2091 NONAME
+ _ZN12QTextBrowserD2Ev @ 2092 NONAME
+ _ZN12QTextControl10adjustSizeEv @ 2093 NONAME
+ _ZN12QTextControl10appendHtmlERK7QString @ 2094 NONAME
+ _ZN12QTextControl10insertHtmlERK7QString @ 2095 NONAME
+ _ZN12QTextControl10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 2096 NONAME
+ _ZN12QTextControl10setPaletteERK8QPalette @ 2097 NONAME
+ _ZN12QTextControl10timerEventEP11QTimerEvent @ 2098 NONAME
+ _ZN12QTextControl11linkHoveredERK7QString @ 2099 NONAME
+ _ZN12QTextControl11qt_metacallEN11QMetaObject4CallEiPPv @ 2100 NONAME
+ _ZN12QTextControl11qt_metacastEPKc @ 2101 NONAME
+ _ZN12QTextControl11setDocumentEP13QTextDocument @ 2102 NONAME
+ _ZN12QTextControl11textChangedEv @ 2103 NONAME
+ _ZN12QTextControl12drawContentsEP8QPainterRK6QRectFP7QWidget @ 2104 NONAME
+ _ZN12QTextControl12loadResourceEiRK4QUrl @ 2105 NONAME
+ _ZN12QTextControl12processEventEP6QEventRK7QMatrixP7QWidget @ 2106 NONAME
+ _ZN12QTextControl12processEventEP6QEventRK7QPointFP7QWidget @ 2107 NONAME
+ _ZN12QTextControl12setPlainTextERK7QString @ 2108 NONAME
+ _ZN12QTextControl12setTextWidthEf @ 2109 NONAME
+ _ZN12QTextControl13copyAvailableEb @ 2110 NONAME
+ _ZN12QTextControl13linkActivatedERK7QString @ 2111 NONAME
+ _ZN12QTextControl13redoAvailableEb @ 2112 NONAME
+ _ZN12QTextControl13setTextCursorERK11QTextCursor @ 2113 NONAME
+ _ZN12QTextControl13undoAvailableEb @ 2114 NONAME
+ _ZN12QTextControl13updateRequestERK6QRectF @ 2115 NONAME
+ _ZN12QTextControl14setCursorWidthEi @ 2116 NONAME
+ _ZN12QTextControl15appendPlainTextERK7QString @ 2117 NONAME
+ _ZN12QTextControl15insertPlainTextERK7QString @ 2118 NONAME
+ _ZN12QTextControl16selectionChangedEv @ 2119 NONAME
+ _ZN12QTextControl16setFocusToAnchorERK11QTextCursor @ 2120 NONAME
+ _ZN12QTextControl16setOverwriteModeEb @ 2121 NONAME
+ _ZN12QTextControl16staticMetaObjectE @ 2122 NONAME DATA 16
+ _ZN12QTextControl17blockCountChangedEi @ 2123 NONAME
+ _ZN12QTextControl17microFocusChangedEv @ 2124 NONAME
+ _ZN12QTextControl17setAcceptRichTextEb @ 2125 NONAME
+ _ZN12QTextControl17visibilityRequestERK6QRectF @ 2126 NONAME
+ _ZN12QTextControl18findNextPrevAnchorERK11QTextCursorbRS0_ @ 2127 NONAME
+ _ZN12QTextControl18insertFromMimeDataEPK9QMimeData @ 2128 NONAME
+ _ZN12QTextControl18setExtraSelectionsERK5QListIN9QTextEdit14ExtraSelectionEE @ 2129 NONAME
+ _ZN12QTextControl19documentSizeChangedERK6QSizeF @ 2130 NONAME
+ _ZN12QTextControl19ensureCursorVisibleEv @ 2131 NONAME
+ _ZN12QTextControl19getStaticMetaObjectEv @ 2132 NONAME
+ _ZN12QTextControl19modificationChangedEb @ 2133 NONAME
+ _ZN12QTextControl20setCurrentCharFormatERK15QTextCharFormat @ 2134 NONAME
+ _ZN12QTextControl20setOpenExternalLinksEb @ 2135 NONAME
+ _ZN12QTextControl21cursorPositionChangedEv @ 2136 NONAME
+ _ZN12QTextControl22mergeCurrentCharFormatERK15QTextCharFormat @ 2137 NONAME
+ _ZN12QTextControl23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 2138 NONAME
+ _ZN12QTextControl24currentCharFormatChangedERK15QTextCharFormat @ 2139 NONAME
+ _ZN12QTextControl25createStandardContextMenuERK7QPointFP7QWidget @ 2140 NONAME
+ _ZN12QTextControl25setCursorIsFocusIndicatorEb @ 2141 NONAME
+ _ZN12QTextControl30setFocusToNextOrPreviousAnchorEb @ 2142 NONAME
+ _ZN12QTextControl3cutEv @ 2143 NONAME
+ _ZN12QTextControl4copyEv @ 2144 NONAME
+ _ZN12QTextControl4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 2145 NONAME
+ _ZN12QTextControl4redoEv @ 2146 NONAME
+ _ZN12QTextControl4undoEv @ 2147 NONAME
+ _ZN12QTextControl5clearEv @ 2148 NONAME
+ _ZN12QTextControl5eventEP6QEvent @ 2149 NONAME
+ _ZN12QTextControl5pasteEv @ 2150 NONAME
+ _ZN12QTextControl6appendERK7QString @ 2151 NONAME
+ _ZN12QTextControl7setHtmlERK7QString @ 2152 NONAME
+ _ZN12QTextControl8setFocusEbN2Qt11FocusReasonE @ 2153 NONAME
+ _ZN12QTextControl9selectAllEv @ 2154 NONAME
+ _ZN12QTextControlC1EP13QTextDocumentP7QObject @ 2155 NONAME
+ _ZN12QTextControlC1EP7QObject @ 2156 NONAME
+ _ZN12QTextControlC1ERK7QStringP7QObject @ 2157 NONAME
+ _ZN12QTextControlC2EP13QTextDocumentP7QObject @ 2158 NONAME
+ _ZN12QTextControlC2EP7QObject @ 2159 NONAME
+ _ZN12QTextControlC2ERK7QStringP7QObject @ 2160 NONAME
+ _ZN12QTextControlD0Ev @ 2161 NONAME
+ _ZN12QTextControlD1Ev @ 2162 NONAME
+ _ZN12QTextControlD2Ev @ 2163 NONAME
+ _ZN12QUndoCommand4redoEv @ 2164 NONAME
+ _ZN12QUndoCommand4undoEv @ 2165 NONAME
+ _ZN12QUndoCommand7setTextERK7QString @ 2166 NONAME
+ _ZN12QUndoCommand9mergeWithEPKS_ @ 2167 NONAME
+ _ZN12QUndoCommandC1EPS_ @ 2168 NONAME
+ _ZN12QUndoCommandC1ERK7QStringPS_ @ 2169 NONAME
+ _ZN12QUndoCommandC2EPS_ @ 2170 NONAME
+ _ZN12QUndoCommandC2ERK7QStringPS_ @ 2171 NONAME
+ _ZN12QUndoCommandD0Ev @ 2172 NONAME
+ _ZN12QUndoCommandD1Ev @ 2173 NONAME
+ _ZN12QUndoCommandD2Ev @ 2174 NONAME
+ _ZN13QDateTimeEdit10paintEventEP11QPaintEvent @ 2175 NONAME
+ _ZN13QDateTimeEdit10wheelEventEP11QWheelEvent @ 2176 NONAME
+ _ZN13QDateTimeEdit11dateChangedERK5QDate @ 2177 NONAME
+ _ZN13QDateTimeEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 2178 NONAME
+ _ZN13QDateTimeEdit11qt_metacastEPKc @ 2179 NONAME
+ _ZN13QDateTimeEdit11setDateTimeERK9QDateTime @ 2180 NONAME
+ _ZN13QDateTimeEdit11setTimeSpecEN2Qt8TimeSpecE @ 2181 NONAME
+ _ZN13QDateTimeEdit11timeChangedERK5QTime @ 2182 NONAME
+ _ZN13QDateTimeEdit12focusInEventEP11QFocusEvent @ 2183 NONAME
+ _ZN13QDateTimeEdit12setDateRangeERK5QDateS2_ @ 2184 NONAME
+ _ZN13QDateTimeEdit12setTimeRangeERK5QTimeS2_ @ 2185 NONAME
+ _ZN13QDateTimeEdit13keyPressEventEP9QKeyEvent @ 2186 NONAME
+ _ZN13QDateTimeEdit14setMaximumDateERK5QDate @ 2187 NONAME
+ _ZN13QDateTimeEdit14setMaximumTimeERK5QTime @ 2188 NONAME
+ _ZN13QDateTimeEdit14setMinimumDateERK5QDate @ 2189 NONAME
+ _ZN13QDateTimeEdit14setMinimumTimeERK5QTime @ 2190 NONAME
+ _ZN13QDateTimeEdit15dateTimeChangedERK9QDateTime @ 2191 NONAME
+ _ZN13QDateTimeEdit15mousePressEventEP11QMouseEvent @ 2192 NONAME
+ _ZN13QDateTimeEdit16clearMaximumDateEv @ 2193 NONAME
+ _ZN13QDateTimeEdit16clearMaximumTimeEv @ 2194 NONAME
+ _ZN13QDateTimeEdit16clearMinimumDateEv @ 2195 NONAME
+ _ZN13QDateTimeEdit16clearMinimumTimeEv @ 2196 NONAME
+ _ZN13QDateTimeEdit16setCalendarPopupEb @ 2197 NONAME
+ _ZN13QDateTimeEdit16setDateTimeRangeERK9QDateTimeS2_ @ 2198 NONAME
+ _ZN13QDateTimeEdit16setDisplayFormatERK7QString @ 2199 NONAME
+ _ZN13QDateTimeEdit16staticMetaObjectE @ 2200 NONAME DATA 16
+ _ZN13QDateTimeEdit17setCalendarWidgetEP15QCalendarWidget @ 2201 NONAME
+ _ZN13QDateTimeEdit17setCurrentSectionENS_7SectionE @ 2202 NONAME
+ _ZN13QDateTimeEdit18focusNextPrevChildEb @ 2203 NONAME
+ _ZN13QDateTimeEdit18setMaximumDateTimeERK9QDateTime @ 2204 NONAME
+ _ZN13QDateTimeEdit18setMinimumDateTimeERK9QDateTime @ 2205 NONAME
+ _ZN13QDateTimeEdit18setSelectedSectionENS_7SectionE @ 2206 NONAME
+ _ZN13QDateTimeEdit19getStaticMetaObjectEv @ 2207 NONAME
+ _ZN13QDateTimeEdit20clearMaximumDateTimeEv @ 2208 NONAME
+ _ZN13QDateTimeEdit20clearMinimumDateTimeEv @ 2209 NONAME
+ _ZN13QDateTimeEdit22setCurrentSectionIndexEi @ 2210 NONAME
+ _ZN13QDateTimeEdit5clearEv @ 2211 NONAME
+ _ZN13QDateTimeEdit5eventEP6QEvent @ 2212 NONAME
+ _ZN13QDateTimeEdit6stepByEi @ 2213 NONAME
+ _ZN13QDateTimeEdit7setDateERK5QDate @ 2214 NONAME
+ _ZN13QDateTimeEdit7setTimeERK5QTime @ 2215 NONAME
+ _ZN13QDateTimeEditC1EP7QWidget @ 2216 NONAME
+ _ZN13QDateTimeEditC1ERK5QDateP7QWidget @ 2217 NONAME
+ _ZN13QDateTimeEditC1ERK5QTimeP7QWidget @ 2218 NONAME
+ _ZN13QDateTimeEditC1ERK8QVariantNS0_4TypeEP7QWidget @ 2219 NONAME
+ _ZN13QDateTimeEditC1ERK9QDateTimeP7QWidget @ 2220 NONAME
+ _ZN13QDateTimeEditC2EP7QWidget @ 2221 NONAME
+ _ZN13QDateTimeEditC2ERK5QDateP7QWidget @ 2222 NONAME
+ _ZN13QDateTimeEditC2ERK5QTimeP7QWidget @ 2223 NONAME
+ _ZN13QDateTimeEditC2ERK8QVariantNS0_4TypeEP7QWidget @ 2224 NONAME
+ _ZN13QDateTimeEditC2ERK9QDateTimeP7QWidget @ 2225 NONAME
+ _ZN13QErrorMessage11changeEventEP6QEvent @ 2226 NONAME
+ _ZN13QErrorMessage11qt_metacallEN11QMetaObject4CallEiPPv @ 2227 NONAME
+ _ZN13QErrorMessage11qt_metacastEPKc @ 2228 NONAME
+ _ZN13QErrorMessage11showMessageERK7QString @ 2229 NONAME
+ _ZN13QErrorMessage11showMessageERK7QStringS2_ @ 2230 NONAME
+ _ZN13QErrorMessage16staticMetaObjectE @ 2231 NONAME DATA 16
+ _ZN13QErrorMessage19getStaticMetaObjectEv @ 2232 NONAME
+ _ZN13QErrorMessage4doneEi @ 2233 NONAME
+ _ZN13QErrorMessage9qtHandlerEv @ 2234 NONAME
+ _ZN13QErrorMessageC1EP7QWidget @ 2235 NONAME
+ _ZN13QErrorMessageC2EP7QWidget @ 2236 NONAME
+ _ZN13QErrorMessageD0Ev @ 2237 NONAME
+ _ZN13QErrorMessageD1Ev @ 2238 NONAME
+ _ZN13QErrorMessageD2Ev @ 2239 NONAME
+ _ZN13QFontComboBox11qt_metacallEN11QMetaObject4CallEiPPv @ 2240 NONAME
+ _ZN13QFontComboBox11qt_metacastEPKc @ 2241 NONAME
+ _ZN13QFontComboBox14setCurrentFontERK5QFont @ 2242 NONAME
+ _ZN13QFontComboBox14setFontFiltersE6QFlagsINS_10FontFilterEE @ 2243 NONAME
+ _ZN13QFontComboBox16setWritingSystemEN13QFontDatabase13WritingSystemE @ 2244 NONAME
+ _ZN13QFontComboBox16staticMetaObjectE @ 2245 NONAME DATA 16
+ _ZN13QFontComboBox18currentFontChangedERK5QFont @ 2246 NONAME
+ _ZN13QFontComboBox19getStaticMetaObjectEv @ 2247 NONAME
+ _ZN13QFontComboBox5eventEP6QEvent @ 2248 NONAME
+ _ZN13QFontComboBoxC1EP7QWidget @ 2249 NONAME
+ _ZN13QFontComboBoxC2EP7QWidget @ 2250 NONAME
+ _ZN13QFontComboBoxD0Ev @ 2251 NONAME
+ _ZN13QFontComboBoxD1Ev @ 2252 NONAME
+ _ZN13QFontComboBoxD2Ev @ 2253 NONAME
+ _ZN13QFontDatabase10pointSizesERK7QStringS2_ @ 2254 NONAME
+ _ZN13QFontDatabase11smoothSizesERK7QStringS2_ @ 2255 NONAME
+ _ZN13QFontDatabase11styleStringERK5QFont @ 2256 NONAME
+ _ZN13QFontDatabase11styleStringERK9QFontInfo @ 2257 NONAME
+ _ZN13QFontDatabase13parseFontNameERK7QStringRS0_S3_ @ 2258 NONAME
+ _ZN13QFontDatabase13standardSizesEv @ 2259 NONAME
+ _ZN13QFontDatabase14createDatabaseEv @ 2260 NONAME
+ _ZN13QFontDatabase16staticMetaObjectE @ 2261 NONAME DATA 16
+ _ZN13QFontDatabase17writingSystemNameENS_13WritingSystemE @ 2262 NONAME
+ _ZN13QFontDatabase18addApplicationFontERK7QString @ 2263 NONAME
+ _ZN13QFontDatabase19getStaticMetaObjectEv @ 2264 NONAME
+ _ZN13QFontDatabase19writingSystemSampleENS_13WritingSystemE @ 2265 NONAME
+ _ZN13QFontDatabase21removeApplicationFontEi @ 2266 NONAME
+ _ZN13QFontDatabase23applicationFontFamiliesEi @ 2267 NONAME
+ _ZN13QFontDatabase26addApplicationFontFromDataERK10QByteArray @ 2268 NONAME
+ _ZN13QFontDatabase29supportsThreadedFontRenderingEv @ 2269 NONAME
+ _ZN13QFontDatabase4loadEPK12QFontPrivatei @ 2270 NONAME
+ _ZN13QFontDatabase8findFontEiPK12QFontPrivateRK8QFontDef @ 2271 NONAME
+ _ZN13QFontDatabaseC1Ev @ 2272 NONAME
+ _ZN13QFontDatabaseC2Ev @ 2273 NONAME
+ _ZN13QFontMetricsFC1ERK12QFontMetrics @ 2274 NONAME
+ _ZN13QFontMetricsFC1ERK5QFont @ 2275 NONAME
+ _ZN13QFontMetricsFC1ERK5QFontP12QPaintDevice @ 2276 NONAME
+ _ZN13QFontMetricsFC1ERKS_ @ 2277 NONAME
+ _ZN13QFontMetricsFC2ERK12QFontMetrics @ 2278 NONAME
+ _ZN13QFontMetricsFC2ERK5QFont @ 2279 NONAME
+ _ZN13QFontMetricsFC2ERK5QFontP12QPaintDevice @ 2280 NONAME
+ _ZN13QFontMetricsFC2ERKS_ @ 2281 NONAME
+ _ZN13QFontMetricsFD1Ev @ 2282 NONAME
+ _ZN13QFontMetricsFD2Ev @ 2283 NONAME
+ _ZN13QFontMetricsFaSERK12QFontMetrics @ 2284 NONAME
+ _ZN13QFontMetricsFaSERKS_ @ 2285 NONAME
+ _ZN13QFontMetricsFeqERKS_ @ 2286 NONAME
+ _ZN13QGestureEvent11setAcceptedEP8QGestureb @ 2287 NONAME
+ _ZN13QGestureEvent6acceptEP8QGesture @ 2288 NONAME
+ _ZN13QGestureEvent6ignoreEP8QGesture @ 2289 NONAME
+ _ZN13QGestureEvent7gestureEN2Qt11GestureTypeE @ 2290 NONAME ABSENT
+ _ZN13QGestureEventC1ERK5QListIP8QGestureE @ 2291 NONAME
+ _ZN13QGestureEventC2ERK5QListIP8QGestureE @ 2292 NONAME
+ _ZN13QGraphicsItem10addToIndexEv @ 2293 NONAME
+ _ZN13QGraphicsItem10clearFocusEv @ 2294 NONAME
+ _ZN13QGraphicsItem10itemChangeENS_18GraphicsItemChangeERK8QVariant @ 2295 NONAME
+ _ZN13QGraphicsItem10sceneEventEP6QEvent @ 2296 NONAME
+ _ZN13QGraphicsItem10setEnabledEb @ 2297 NONAME
+ _ZN13QGraphicsItem10setOpacityEf @ 2298 NONAME
+ _ZN13QGraphicsItem10setToolTipERK7QString @ 2299 NONAME
+ _ZN13QGraphicsItem10setVisibleEb @ 2300 NONAME
+ _ZN13QGraphicsItem10wheelEventEP24QGraphicsSceneWheelEvent @ 2301 NONAME
+ _ZN13QGraphicsItem11resetMatrixEv @ 2302 NONAME
+ _ZN13QGraphicsItem11setRotationEf @ 2303 NONAME
+ _ZN13QGraphicsItem11setSelectedEb @ 2304 NONAME
+ _ZN13QGraphicsItem11stackBeforeEPKS_ @ 2305 NONAME
+ _ZN13QGraphicsItem11ungrabMouseEv @ 2306 NONAME
+ _ZN13QGraphicsItem11unsetCursorEv @ 2307 NONAME
+ _ZN13QGraphicsItem12focusInEventEP11QFocusEvent @ 2308 NONAME
+ _ZN13QGraphicsItem12grabKeyboardEv @ 2309 NONAME
+ _ZN13QGraphicsItem12setCacheModeENS_9CacheModeERK5QSize @ 2310 NONAME
+ _ZN13QGraphicsItem12setExtensionENS_9ExtensionERK8QVariant @ 2311 NONAME
+ _ZN13QGraphicsItem12setTransformERK10QTransformb @ 2312 NONAME
+ _ZN13QGraphicsItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 2313 NONAME
+ _ZN13QGraphicsItem13ensureVisibleERK6QRectFii @ 2314 NONAME
+ _ZN13QGraphicsItem13focusOutEventEP11QFocusEvent @ 2315 NONAME
+ _ZN13QGraphicsItem13keyPressEventEP9QKeyEvent @ 2316 NONAME
+ _ZN13QGraphicsItem13setFocusProxyEPS_ @ 2317 NONAME
+ _ZN13QGraphicsItem13setParentItemEPS_ @ 2318 NONAME
+ _ZN13QGraphicsItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 2319 NONAME
+ _ZN13QGraphicsItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 2320 NONAME
+ _ZN13QGraphicsItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 2321 NONAME
+ _ZN13QGraphicsItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 2322 NONAME
+ _ZN13QGraphicsItem14resetTransformEv @ 2323 NONAME
+ _ZN13QGraphicsItem14setAcceptDropsEb @ 2324 NONAME
+ _ZN13QGraphicsItem14ungrabKeyboardEv @ 2325 NONAME
+ _ZN13QGraphicsItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 2326 NONAME
+ _ZN13QGraphicsItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 2327 NONAME
+ _ZN13QGraphicsItem15keyReleaseEventEP9QKeyEvent @ 2328 NONAME
+ _ZN13QGraphicsItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 2329 NONAME
+ _ZN13QGraphicsItem15removeFromIndexEv @ 2330 NONAME
+ _ZN13QGraphicsItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 2331 NONAME
+ _ZN13QGraphicsItem16inputMethodEventEP17QInputMethodEvent @ 2332 NONAME
+ _ZN13QGraphicsItem16sceneEventFilterEPS_P6QEvent @ 2333 NONAME
+ _ZN13QGraphicsItem16setPanelModalityENS_13PanelModalityE @ 2334 NONAME
+ _ZN13QGraphicsItem16toGraphicsObjectEv @ 2335 NONAME
+ _ZN13QGraphicsItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 2336 NONAME
+ _ZN13QGraphicsItem17setGraphicsEffectEP15QGraphicsEffect @ 2337 NONAME
+ _ZN13QGraphicsItem18setTransformationsERK5QListIP18QGraphicsTransformE @ 2338 NONAME
+ _ZN13QGraphicsItem19setInputMethodHintsE6QFlagsIN2Qt15InputMethodHintEE @ 2339 NONAME
+ _ZN13QGraphicsItem20setAcceptHoverEventsEb @ 2340 NONAME
+ _ZN13QGraphicsItem20setAcceptTouchEventsEb @ 2341 NONAME
+ _ZN13QGraphicsItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 2342 NONAME
+ _ZN13QGraphicsItem21prepareGeometryChangeEv @ 2343 NONAME
+ _ZN13QGraphicsItem21setAcceptsHoverEventsEb @ 2344 NONAME
+ _ZN13QGraphicsItem21setFiltersChildEventsEb @ 2345 NONAME
+ _ZN13QGraphicsItem21setHandlesChildEventsEb @ 2346 NONAME
+ _ZN13QGraphicsItem22removeSceneEventFilterEPS_ @ 2347 NONAME
+ _ZN13QGraphicsItem23installSceneEventFilterEPS_ @ 2348 NONAME
+ _ZN13QGraphicsItem23setAcceptedMouseButtonsE6QFlagsIN2Qt11MouseButtonEE @ 2349 NONAME
+ _ZN13QGraphicsItem23setTransformOriginPointERK7QPointF @ 2350 NONAME
+ _ZN13QGraphicsItem28setBoundingRegionGranularityEf @ 2351 NONAME
+ _ZN13QGraphicsItem4setXEf @ 2352 NONAME
+ _ZN13QGraphicsItem4setYEf @ 2353 NONAME
+ _ZN13QGraphicsItem5scaleEff @ 2354 NONAME
+ _ZN13QGraphicsItem5shearEff @ 2355 NONAME
+ _ZN13QGraphicsItem6rotateEf @ 2356 NONAME
+ _ZN13QGraphicsItem6scrollEffRK6QRectF @ 2357 NONAME
+ _ZN13QGraphicsItem6setPosERK7QPointF @ 2358 NONAME
+ _ZN13QGraphicsItem6updateERK6QRectF @ 2359 NONAME
+ _ZN13QGraphicsItem7advanceEi @ 2360 NONAME
+ _ZN13QGraphicsItem7setDataEiRK8QVariant @ 2361 NONAME
+ _ZN13QGraphicsItem7setFlagENS_16GraphicsItemFlagEb @ 2362 NONAME
+ _ZN13QGraphicsItem8setFlagsE6QFlagsINS_16GraphicsItemFlagEE @ 2363 NONAME
+ _ZN13QGraphicsItem8setFocusEN2Qt11FocusReasonE @ 2364 NONAME
+ _ZN13QGraphicsItem8setGroupEP18QGraphicsItemGroup @ 2365 NONAME
+ _ZN13QGraphicsItem8setScaleEf @ 2366 NONAME
+ _ZN13QGraphicsItem9dropEventEP27QGraphicsSceneDragDropEvent @ 2367 NONAME
+ _ZN13QGraphicsItem9grabMouseEv @ 2368 NONAME
+ _ZN13QGraphicsItem9setActiveEb @ 2369 NONAME
+ _ZN13QGraphicsItem9setCursorERK7QCursor @ 2370 NONAME
+ _ZN13QGraphicsItem9setMatrixERK7QMatrixb @ 2371 NONAME
+ _ZN13QGraphicsItem9setZValueEf @ 2372 NONAME
+ _ZN13QGraphicsItem9translateEff @ 2373 NONAME
+ _ZN13QGraphicsItemC2EPS_P14QGraphicsScene @ 2374 NONAME
+ _ZN13QGraphicsItemC2ER20QGraphicsItemPrivatePS_P14QGraphicsScene @ 2375 NONAME
+ _ZN13QGraphicsItemD0Ev @ 2376 NONAME
+ _ZN13QGraphicsItemD1Ev @ 2377 NONAME
+ _ZN13QGraphicsItemD2Ev @ 2378 NONAME
+ _ZN13QGraphicsView10paintEventEP11QPaintEvent @ 2379 NONAME
+ _ZN13QGraphicsView10wheelEventEP11QWheelEvent @ 2380 NONAME
+ _ZN13QGraphicsView11qt_metacallEN11QMetaObject4CallEiPPv @ 2381 NONAME
+ _ZN13QGraphicsView11qt_metacastEPKc @ 2382 NONAME
+ _ZN13QGraphicsView11resetMatrixEv @ 2383 NONAME
+ _ZN13QGraphicsView11resizeEventEP12QResizeEvent @ 2384 NONAME
+ _ZN13QGraphicsView11setDragModeENS_8DragModeE @ 2385 NONAME
+ _ZN13QGraphicsView11updateSceneERK5QListI6QRectFE @ 2386 NONAME
+ _ZN13QGraphicsView12focusInEventEP11QFocusEvent @ 2387 NONAME
+ _ZN13QGraphicsView12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 2388 NONAME
+ _ZN13QGraphicsView12setCacheModeE6QFlagsINS_13CacheModeFlagEE @ 2389 NONAME
+ _ZN13QGraphicsView12setSceneRectERK6QRectF @ 2390 NONAME
+ _ZN13QGraphicsView12setTransformERK10QTransformb @ 2391 NONAME
+ _ZN13QGraphicsView13dragMoveEventEP14QDragMoveEvent @ 2392 NONAME
+ _ZN13QGraphicsView13ensureVisibleEPK13QGraphicsItemii @ 2393 NONAME
+ _ZN13QGraphicsView13ensureVisibleERK6QRectFii @ 2394 NONAME
+ _ZN13QGraphicsView13focusOutEventEP11QFocusEvent @ 2395 NONAME
+ _ZN13QGraphicsView13keyPressEventEP9QKeyEvent @ 2396 NONAME
+ _ZN13QGraphicsView13setRenderHintEN8QPainter10RenderHintEb @ 2397 NONAME
+ _ZN13QGraphicsView13setupViewportEP7QWidget @ 2398 NONAME
+ _ZN13QGraphicsView13viewportEventEP6QEvent @ 2399 NONAME
+ _ZN13QGraphicsView14dragEnterEventEP15QDragEnterEvent @ 2400 NONAME
+ _ZN13QGraphicsView14dragLeaveEventEP15QDragLeaveEvent @ 2401 NONAME
+ _ZN13QGraphicsView14drawBackgroundEP8QPainterRK6QRectF @ 2402 NONAME
+ _ZN13QGraphicsView14drawForegroundEP8QPainterRK6QRectF @ 2403 NONAME
+ _ZN13QGraphicsView14mouseMoveEventEP11QMouseEvent @ 2404 NONAME
+ _ZN13QGraphicsView14resetTransformEv @ 2405 NONAME
+ _ZN13QGraphicsView14setInteractiveEb @ 2406 NONAME
+ _ZN13QGraphicsView14setRenderHintsE6QFlagsIN8QPainter10RenderHintEE @ 2407 NONAME
+ _ZN13QGraphicsView15invalidateSceneERK6QRectF6QFlagsIN14QGraphicsScene10SceneLayerEE @ 2408 NONAME
+ _ZN13QGraphicsView15keyReleaseEventEP9QKeyEvent @ 2409 NONAME
+ _ZN13QGraphicsView15mousePressEventEP11QMouseEvent @ 2410 NONAME
+ _ZN13QGraphicsView15setResizeAnchorENS_14ViewportAnchorE @ 2411 NONAME
+ _ZN13QGraphicsView15updateSceneRectERK6QRectF @ 2412 NONAME
+ _ZN13QGraphicsView16contextMenuEventEP17QContextMenuEvent @ 2413 NONAME
+ _ZN13QGraphicsView16inputMethodEventEP17QInputMethodEvent @ 2414 NONAME
+ _ZN13QGraphicsView16scrollContentsByEii @ 2415 NONAME
+ _ZN13QGraphicsView16staticMetaObjectE @ 2416 NONAME DATA 16
+ _ZN13QGraphicsView17mouseReleaseEventEP11QMouseEvent @ 2417 NONAME
+ _ZN13QGraphicsView18focusNextPrevChildEb @ 2418 NONAME
+ _ZN13QGraphicsView18resetCachedContentEv @ 2419 NONAME
+ _ZN13QGraphicsView18setBackgroundBrushERK6QBrush @ 2420 NONAME
+ _ZN13QGraphicsView18setForegroundBrushERK6QBrush @ 2421 NONAME
+ _ZN13QGraphicsView19getStaticMetaObjectEv @ 2422 NONAME
+ _ZN13QGraphicsView19setOptimizationFlagENS_16OptimizationFlagEb @ 2423 NONAME
+ _ZN13QGraphicsView20setOptimizationFlagsE6QFlagsINS_16OptimizationFlagEE @ 2424 NONAME
+ _ZN13QGraphicsView21mouseDoubleClickEventEP11QMouseEvent @ 2425 NONAME
+ _ZN13QGraphicsView21setViewportUpdateModeENS_18ViewportUpdateModeE @ 2426 NONAME
+ _ZN13QGraphicsView23setTransformationAnchorENS_14ViewportAnchorE @ 2427 NONAME
+ _ZN13QGraphicsView26setRubberBandSelectionModeEN2Qt17ItemSelectionModeE @ 2428 NONAME
+ _ZN13QGraphicsView5eventEP6QEvent @ 2429 NONAME
+ _ZN13QGraphicsView5scaleEff @ 2430 NONAME
+ _ZN13QGraphicsView5shearEff @ 2431 NONAME
+ _ZN13QGraphicsView6renderEP8QPainterRK6QRectFRK5QRectN2Qt15AspectRatioModeE @ 2432 NONAME
+ _ZN13QGraphicsView6rotateEf @ 2433 NONAME
+ _ZN13QGraphicsView8centerOnEPK13QGraphicsItem @ 2434 NONAME
+ _ZN13QGraphicsView8centerOnERK7QPointF @ 2435 NONAME
+ _ZN13QGraphicsView8setSceneEP14QGraphicsScene @ 2436 NONAME
+ _ZN13QGraphicsView9drawItemsEP8QPainteriPP13QGraphicsItemPK24QStyleOptionGraphicsItem @ 2437 NONAME
+ _ZN13QGraphicsView9dropEventEP10QDropEvent @ 2438 NONAME
+ _ZN13QGraphicsView9fitInViewEPK13QGraphicsItemN2Qt15AspectRatioModeE @ 2439 NONAME
+ _ZN13QGraphicsView9fitInViewERK6QRectFN2Qt15AspectRatioModeE @ 2440 NONAME
+ _ZN13QGraphicsView9setMatrixERK7QMatrixb @ 2441 NONAME
+ _ZN13QGraphicsView9showEventEP10QShowEvent @ 2442 NONAME
+ _ZN13QGraphicsView9translateEff @ 2443 NONAME
+ _ZN13QGraphicsViewC1EP14QGraphicsSceneP7QWidget @ 2444 NONAME
+ _ZN13QGraphicsViewC1EP7QWidget @ 2445 NONAME
+ _ZN13QGraphicsViewC1ER20QGraphicsViewPrivateP7QWidget @ 2446 NONAME
+ _ZN13QGraphicsViewC2EP14QGraphicsSceneP7QWidget @ 2447 NONAME
+ _ZN13QGraphicsViewC2EP7QWidget @ 2448 NONAME
+ _ZN13QGraphicsViewC2ER20QGraphicsViewPrivateP7QWidget @ 2449 NONAME
+ _ZN13QGraphicsViewD0Ev @ 2450 NONAME
+ _ZN13QGraphicsViewD1Ev @ 2451 NONAME
+ _ZN13QGraphicsViewD2Ev @ 2452 NONAME
+ _ZN13QIconEngineV212virtual_hookEiPv @ 2453 NONAME
+ _ZN13QIconEngineV214availableSizesEN5QIcon4ModeENS0_5StateE @ 2454 NONAME
+ _ZN13QIconEngineV24readER11QDataStream @ 2455 NONAME
+ _ZN13QInputContext11filterEventEPK6QEvent @ 2456 NONAME
+ _ZN13QInputContext11qt_metacallEN11QMetaObject4CallEiPPv @ 2457 NONAME
+ _ZN13QInputContext11qt_metacastEPKc @ 2458 NONAME
+ _ZN13QInputContext12mouseHandlerEiP11QMouseEvent @ 2459 NONAME
+ _ZN13QInputContext14s60FilterEventEP7QWidgetP8TWsEvent @ 2460 NONAME
+ _ZN13QInputContext14setFocusWidgetEP7QWidget @ 2461 NONAME
+ _ZN13QInputContext15widgetDestroyedEP7QWidget @ 2462 NONAME
+ _ZN13QInputContext16staticMetaObjectE @ 2463 NONAME DATA 16
+ _ZN13QInputContext19getStaticMetaObjectEv @ 2464 NONAME
+ _ZN13QInputContext6updateEv @ 2465 NONAME
+ _ZN13QInputContext7actionsEv @ 2466 NONAME
+ _ZN13QInputContext9sendEventERK17QInputMethodEvent @ 2467 NONAME
+ _ZN13QInputContextC2EP7QObject @ 2468 NONAME
+ _ZN13QInputContextD0Ev @ 2469 NONAME
+ _ZN13QInputContextD1Ev @ 2470 NONAME
+ _ZN13QInputContextD2Ev @ 2471 NONAME
+ _ZN13QIntValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 2472 NONAME
+ _ZN13QIntValidator11qt_metacastEPKc @ 2473 NONAME
+ _ZN13QIntValidator16staticMetaObjectE @ 2474 NONAME DATA 16
+ _ZN13QIntValidator19getStaticMetaObjectEv @ 2475 NONAME
+ _ZN13QIntValidator6setTopEi @ 2476 NONAME
+ _ZN13QIntValidator8setRangeEii @ 2477 NONAME
+ _ZN13QIntValidator9setBottomEi @ 2478 NONAME
+ _ZN13QIntValidatorC1EP7QObject @ 2479 NONAME
+ _ZN13QIntValidatorC1EiiP7QObject @ 2480 NONAME
+ _ZN13QIntValidatorC2EP7QObject @ 2481 NONAME
+ _ZN13QIntValidatorC2EiiP7QObject @ 2482 NONAME
+ _ZN13QIntValidatorD0Ev @ 2483 NONAME
+ _ZN13QIntValidatorD1Ev @ 2484 NONAME
+ _ZN13QIntValidatorD2Ev @ 2485 NONAME
+ _ZN13QItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 2486 NONAME
+ _ZN13QItemDelegate11eventFilterEP7QObjectP6QEvent @ 2487 NONAME
+ _ZN13QItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 2488 NONAME
+ _ZN13QItemDelegate11qt_metacastEPKc @ 2489 NONAME
+ _ZN13QItemDelegate11setClippingEb @ 2490 NONAME
+ _ZN13QItemDelegate16staticMetaObjectE @ 2491 NONAME DATA 16
+ _ZN13QItemDelegate19getStaticMetaObjectEv @ 2492 NONAME
+ _ZN13QItemDelegate20setItemEditorFactoryEP18QItemEditorFactory @ 2493 NONAME
+ _ZN13QItemDelegateC1EP7QObject @ 2494 NONAME
+ _ZN13QItemDelegateC2EP7QObject @ 2495 NONAME
+ _ZN13QItemDelegateD0Ev @ 2496 NONAME
+ _ZN13QItemDelegateD1Ev @ 2497 NONAME
+ _ZN13QItemDelegateD2Ev @ 2498 NONAME
+ _ZN13QMdiSubWindow10childEventEP11QChildEvent @ 2499 NONAME
+ _ZN13QMdiSubWindow10closeEventEP11QCloseEvent @ 2500 NONAME
+ _ZN13QMdiSubWindow10leaveEventEP6QEvent @ 2501 NONAME
+ _ZN13QMdiSubWindow10paintEventEP11QPaintEvent @ 2502 NONAME
+ _ZN13QMdiSubWindow10showShadedEv @ 2503 NONAME
+ _ZN13QMdiSubWindow10timerEventEP11QTimerEvent @ 2504 NONAME
+ _ZN13QMdiSubWindow11changeEventEP6QEvent @ 2505 NONAME
+ _ZN13QMdiSubWindow11eventFilterEP7QObjectP6QEvent @ 2506 NONAME
+ _ZN13QMdiSubWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 2507 NONAME
+ _ZN13QMdiSubWindow11qt_metacastEPKc @ 2508 NONAME
+ _ZN13QMdiSubWindow11resizeEventEP12QResizeEvent @ 2509 NONAME
+ _ZN13QMdiSubWindow12focusInEventEP11QFocusEvent @ 2510 NONAME
+ _ZN13QMdiSubWindow13focusOutEventEP11QFocusEvent @ 2511 NONAME
+ _ZN13QMdiSubWindow13keyPressEventEP9QKeyEvent @ 2512 NONAME
+ _ZN13QMdiSubWindow13setSystemMenuEP5QMenu @ 2513 NONAME
+ _ZN13QMdiSubWindow14mouseMoveEventEP11QMouseEvent @ 2514 NONAME
+ _ZN13QMdiSubWindow14showSystemMenuEv @ 2515 NONAME
+ _ZN13QMdiSubWindow15aboutToActivateEv @ 2516 NONAME
+ _ZN13QMdiSubWindow15mousePressEventEP11QMouseEvent @ 2517 NONAME
+ _ZN13QMdiSubWindow16contextMenuEventEP17QContextMenuEvent @ 2518 NONAME
+ _ZN13QMdiSubWindow16staticMetaObjectE @ 2519 NONAME DATA 16
+ _ZN13QMdiSubWindow17mouseReleaseEventEP11QMouseEvent @ 2520 NONAME
+ _ZN13QMdiSubWindow18windowStateChangedE6QFlagsIN2Qt11WindowStateEES3_ @ 2521 NONAME
+ _ZN13QMdiSubWindow19getStaticMetaObjectEv @ 2522 NONAME
+ _ZN13QMdiSubWindow19setKeyboardPageStepEi @ 2523 NONAME
+ _ZN13QMdiSubWindow21mouseDoubleClickEventEP11QMouseEvent @ 2524 NONAME
+ _ZN13QMdiSubWindow21setKeyboardSingleStepEi @ 2525 NONAME
+ _ZN13QMdiSubWindow5eventEP6QEvent @ 2526 NONAME
+ _ZN13QMdiSubWindow9hideEventEP10QHideEvent @ 2527 NONAME
+ _ZN13QMdiSubWindow9moveEventEP10QMoveEvent @ 2528 NONAME
+ _ZN13QMdiSubWindow9setOptionENS_15SubWindowOptionEb @ 2529 NONAME
+ _ZN13QMdiSubWindow9setWidgetEP7QWidget @ 2530 NONAME
+ _ZN13QMdiSubWindow9showEventEP10QShowEvent @ 2531 NONAME
+ _ZN13QMdiSubWindowC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2532 NONAME
+ _ZN13QMdiSubWindowC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2533 NONAME
+ _ZN13QMdiSubWindowD0Ev @ 2534 NONAME
+ _ZN13QMdiSubWindowD1Ev @ 2535 NONAME
+ _ZN13QMdiSubWindowD2Ev @ 2536 NONAME
+ _ZN13QPainterState4initEP8QPainter @ 2537 NONAME
+ _ZN13QPainterStateC1EPKS_ @ 2538 NONAME
+ _ZN13QPainterStateC1Ev @ 2539 NONAME
+ _ZN13QPainterStateC2EPKS_ @ 2540 NONAME
+ _ZN13QPainterStateC2Ev @ 2541 NONAME
+ _ZN13QPainterStateD0Ev @ 2542 NONAME
+ _ZN13QPainterStateD1Ev @ 2543 NONAME
+ _ZN13QPainterStateD2Ev @ 2544 NONAME
+ _ZN13QPinchGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 2545 NONAME
+ _ZN13QPinchGesture11qt_metacastEPKc @ 2546 NONAME
+ _ZN13QPinchGesture14setCenterPointERK7QPointF @ 2547 NONAME
+ _ZN13QPinchGesture14setScaleFactorEf @ 2548 NONAME
+ _ZN13QPinchGesture14setWhatChangedE6QFlagsINS_10WhatChangeEE @ 2549 NONAME
+ _ZN13QPinchGesture16setRotationAngleEf @ 2550 NONAME
+ _ZN13QPinchGesture16staticMetaObjectE @ 2551 NONAME DATA 16
+ _ZN13QPinchGesture18setLastCenterPointERK7QPointF @ 2552 NONAME
+ _ZN13QPinchGesture18setLastScaleFactorEf @ 2553 NONAME
+ _ZN13QPinchGesture19getStaticMetaObjectEv @ 2554 NONAME
+ _ZN13QPinchGesture19setStartCenterPointERK7QPointF @ 2555 NONAME
+ _ZN13QPinchGesture19setTotalScaleFactorEf @ 2556 NONAME
+ _ZN13QPinchGesture20setLastRotationAngleEf @ 2557 NONAME
+ _ZN13QPinchGesture21setTotalRotationAngleEf @ 2558 NONAME
+ _ZN13QPinchGestureC1EP7QObject @ 2559 NONAME
+ _ZN13QPinchGestureC2EP7QObject @ 2560 NONAME
+ _ZN13QPixmapFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 2561 NONAME
+ _ZN13QPixmapFilter11qt_metacastEPKc @ 2562 NONAME
+ _ZN13QPixmapFilter16staticMetaObjectE @ 2563 NONAME DATA 16
+ _ZN13QPixmapFilter19getStaticMetaObjectEv @ 2564 NONAME
+ _ZN13QPixmapFilterC2ENS_10FilterTypeEP7QObject @ 2565 NONAME
+ _ZN13QPixmapFilterC2ER20QPixmapFilterPrivateNS_10FilterTypeEP7QObject @ 2566 NONAME
+ _ZN13QPixmapFilterD0Ev @ 2567 NONAME
+ _ZN13QPixmapFilterD1Ev @ 2568 NONAME
+ _ZN13QPixmapFilterD2Ev @ 2569 NONAME
+ _ZN13QS60MainAppUi10ConstructLEv @ 2570 NONAME
+ _ZN13QS60MainAppUi12RestoreMenuLEP11CCoeControliN16MEikMenuObserver9TMenuTypeE @ 2571 NONAME
+ _ZN13QS60MainAppUi14HandleCommandLEi @ 2572 NONAME
+ _ZN13QS60MainAppUi14HandleWsEventLERK8TWsEventP11CCoeControl @ 2573 NONAME
+ _ZN13QS60MainAppUi15DynInitMenuBarLEiP11CEikMenuBar @ 2574 NONAME
+ _ZN13QS60MainAppUi16DynInitMenuPaneLEiP12CEikMenuPane @ 2575 NONAME
+ _ZN13QS60MainAppUi21HandleResourceChangeLEi @ 2576 NONAME
+ _ZN13QS60MainAppUi26HandleStatusPaneSizeChangeEv @ 2577 NONAME
+ _ZN13QS60MainAppUiC1Ev @ 2578 NONAME
+ _ZN13QS60MainAppUiC2Ev @ 2579 NONAME
+ _ZN13QS60MainAppUiD0Ev @ 2580 NONAME
+ _ZN13QS60MainAppUiD1Ev @ 2581 NONAME
+ _ZN13QS60MainAppUiD2Ev @ 2582 NONAME
+ _ZN13QSplashScreen11qt_metacallEN11QMetaObject4CallEiPPv @ 2583 NONAME
+ _ZN13QSplashScreen11qt_metacastEPKc @ 2584 NONAME
+ _ZN13QSplashScreen11showMessageERK7QStringiRK6QColor @ 2585 NONAME
+ _ZN13QSplashScreen12clearMessageEv @ 2586 NONAME
+ _ZN13QSplashScreen12drawContentsEP8QPainter @ 2587 NONAME
+ _ZN13QSplashScreen14messageChangedERK7QString @ 2588 NONAME
+ _ZN13QSplashScreen15mousePressEventEP11QMouseEvent @ 2589 NONAME
+ _ZN13QSplashScreen16staticMetaObjectE @ 2590 NONAME DATA 16
+ _ZN13QSplashScreen19getStaticMetaObjectEv @ 2591 NONAME
+ _ZN13QSplashScreen5eventEP6QEvent @ 2592 NONAME
+ _ZN13QSplashScreen6finishEP7QWidget @ 2593 NONAME
+ _ZN13QSplashScreen7repaintEv @ 2594 NONAME
+ _ZN13QSplashScreen9setPixmapERK7QPixmap @ 2595 NONAME
+ _ZN13QSplashScreenC1EP7QWidgetRK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2596 NONAME
+ _ZN13QSplashScreenC1ERK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2597 NONAME
+ _ZN13QSplashScreenC2EP7QWidgetRK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2598 NONAME
+ _ZN13QSplashScreenC2ERK7QPixmap6QFlagsIN2Qt10WindowTypeEE @ 2599 NONAME
+ _ZN13QSplashScreenD0Ev @ 2600 NONAME
+ _ZN13QSplashScreenD1Ev @ 2601 NONAME
+ _ZN13QSplashScreenD2Ev @ 2602 NONAME
+ _ZN13QStandardItem10insertRowsEiRK5QListIPS_E @ 2603 NONAME
+ _ZN13QStandardItem10insertRowsEii @ 2604 NONAME
+ _ZN13QStandardItem10removeRowsEii @ 2605 NONAME
+ _ZN13QStandardItem10setEnabledEb @ 2606 NONAME
+ _ZN13QStandardItem10takeColumnEi @ 2607 NONAME
+ _ZN13QStandardItem11setEditableEb @ 2608 NONAME
+ _ZN13QStandardItem11setRowCountEi @ 2609 NONAME
+ _ZN13QStandardItem11setTristateEb @ 2610 NONAME
+ _ZN13QStandardItem12insertColumnEiRK5QListIPS_E @ 2611 NONAME
+ _ZN13QStandardItem12removeColumnEi @ 2612 NONAME
+ _ZN13QStandardItem12setCheckableEb @ 2613 NONAME
+ _ZN13QStandardItem12sortChildrenEiN2Qt9SortOrderE @ 2614 NONAME
+ _ZN13QStandardItem13insertColumnsEii @ 2615 NONAME
+ _ZN13QStandardItem13removeColumnsEii @ 2616 NONAME
+ _ZN13QStandardItem13setSelectableEb @ 2617 NONAME
+ _ZN13QStandardItem14setColumnCountEi @ 2618 NONAME
+ _ZN13QStandardItem14setDragEnabledEb @ 2619 NONAME
+ _ZN13QStandardItem14setDropEnabledEb @ 2620 NONAME
+ _ZN13QStandardItem15emitDataChangedEv @ 2621 NONAME
+ _ZN13QStandardItem4readER11QDataStream @ 2622 NONAME
+ _ZN13QStandardItem7setDataERK8QVarianti @ 2623 NONAME
+ _ZN13QStandardItem7takeRowEi @ 2624 NONAME
+ _ZN13QStandardItem8setChildEiiPS_ @ 2625 NONAME
+ _ZN13QStandardItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 2626 NONAME
+ _ZN13QStandardItem9insertRowEiRK5QListIPS_E @ 2627 NONAME
+ _ZN13QStandardItem9removeRowEi @ 2628 NONAME
+ _ZN13QStandardItem9takeChildEii @ 2629 NONAME
+ _ZN13QStandardItemC1ER20QStandardItemPrivate @ 2630 NONAME
+ _ZN13QStandardItemC1ERK5QIconRK7QString @ 2631 NONAME
+ _ZN13QStandardItemC1ERK7QString @ 2632 NONAME
+ _ZN13QStandardItemC1ERKS_ @ 2633 NONAME
+ _ZN13QStandardItemC1Eii @ 2634 NONAME
+ _ZN13QStandardItemC1Ev @ 2635 NONAME
+ _ZN13QStandardItemC2ER20QStandardItemPrivate @ 2636 NONAME
+ _ZN13QStandardItemC2ERK5QIconRK7QString @ 2637 NONAME
+ _ZN13QStandardItemC2ERK7QString @ 2638 NONAME
+ _ZN13QStandardItemC2ERKS_ @ 2639 NONAME
+ _ZN13QStandardItemC2Eii @ 2640 NONAME
+ _ZN13QStandardItemC2Ev @ 2641 NONAME
+ _ZN13QStandardItemD0Ev @ 2642 NONAME
+ _ZN13QStandardItemD1Ev @ 2643 NONAME
+ _ZN13QStandardItemD2Ev @ 2644 NONAME
+ _ZN13QStandardItemaSERKS_ @ 2645 NONAME
+ _ZN13QStyleFactory4keysEv @ 2646 NONAME
+ _ZN13QStyleFactory6createERK7QString @ 2647 NONAME
+ _ZN13QSwipeGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 2648 NONAME
+ _ZN13QSwipeGesture11qt_metacastEPKc @ 2649 NONAME
+ _ZN13QSwipeGesture13setSwipeAngleEf @ 2650 NONAME
+ _ZN13QSwipeGesture16staticMetaObjectE @ 2651 NONAME DATA 16
+ _ZN13QSwipeGesture19getStaticMetaObjectEv @ 2652 NONAME
+ _ZN13QSwipeGesture20setVerticalDirectionENS_14SwipeDirectionE @ 2653 NONAME ABSENT
+ _ZN13QSwipeGesture22setHorizontalDirectionENS_14SwipeDirectionE @ 2654 NONAME ABSENT
+ _ZN13QSwipeGestureC1EP7QObject @ 2655 NONAME
+ _ZN13QSwipeGestureC2EP7QObject @ 2656 NONAME
+ _ZN13QTextDocument10adjustSizeEv @ 2657 NONAME
+ _ZN13QTextDocument11addResourceEiRK4QUrlRK8QVariant @ 2658 NONAME
+ _ZN13QTextDocument11qt_metacallEN11QMetaObject4CallEiPPv @ 2659 NONAME
+ _ZN13QTextDocument11qt_metacastEPKc @ 2660 NONAME
+ _ZN13QTextDocument11setModifiedEb @ 2661 NONAME
+ _ZN13QTextDocument11setPageSizeERK6QSizeF @ 2662 NONAME
+ _ZN13QTextDocument12createObjectERK11QTextFormat @ 2663 NONAME
+ _ZN13QTextDocument12drawContentsEP8QPainterRK6QRectF @ 2664 NONAME
+ _ZN13QTextDocument12loadResourceEiRK4QUrl @ 2665 NONAME
+ _ZN13QTextDocument12setPlainTextERK7QString @ 2666 NONAME
+ _ZN13QTextDocument12setTextWidthEf @ 2667 NONAME
+ _ZN13QTextDocument13redoAvailableEb @ 2668 NONAME
+ _ZN13QTextDocument13undoAvailableEb @ 2669 NONAME
+ _ZN13QTextDocument14appendUndoItemEP17QAbstractUndoItem @ 2670 NONAME
+ _ZN13QTextDocument14contentsChangeEiii @ 2671 NONAME
+ _ZN13QTextDocument14setDefaultFontERK5QFont @ 2672 NONAME
+ _ZN13QTextDocument14setIndentWidthEf @ 2673 NONAME
+ _ZN13QTextDocument15contentsChangedEv @ 2674 NONAME
+ _ZN13QTextDocument16staticMetaObjectE @ 2675 NONAME DATA 16
+ _ZN13QTextDocument16undoCommandAddedEv @ 2676 NONAME
+ _ZN13QTextDocument17blockCountChangedEi @ 2677 NONAME
+ _ZN13QTextDocument17markContentsDirtyEii @ 2678 NONAME
+ _ZN13QTextDocument17setDocumentLayoutEP27QAbstractTextDocumentLayout @ 2679 NONAME
+ _ZN13QTextDocument17setDocumentMarginEf @ 2680 NONAME
+ _ZN13QTextDocument18setMetaInformationENS_15MetaInformationERK7QString @ 2681 NONAME
+ _ZN13QTextDocument18setUndoRedoEnabledEb @ 2682 NONAME
+ _ZN13QTextDocument19getStaticMetaObjectEv @ 2683 NONAME
+ _ZN13QTextDocument19modificationChangedEb @ 2684 NONAME
+ _ZN13QTextDocument19setUseDesignMetricsEb @ 2685 NONAME
+ _ZN13QTextDocument20setDefaultStyleSheetERK7QString @ 2686 NONAME
+ _ZN13QTextDocument20setDefaultTextOptionERK11QTextOption @ 2687 NONAME
+ _ZN13QTextDocument20setMaximumBlockCountEi @ 2688 NONAME
+ _ZN13QTextDocument21cursorPositionChangedERK11QTextCursor @ 2689 NONAME
+ _ZN13QTextDocument21documentLayoutChangedEv @ 2690 NONAME
+ _ZN13QTextDocument4redoEP11QTextCursor @ 2691 NONAME
+ _ZN13QTextDocument4redoEv @ 2692 NONAME
+ _ZN13QTextDocument4undoEP11QTextCursor @ 2693 NONAME
+ _ZN13QTextDocument4undoEv @ 2694 NONAME
+ _ZN13QTextDocument5clearEv @ 2695 NONAME
+ _ZN13QTextDocument7setHtmlERK7QString @ 2696 NONAME
+ _ZN13QTextDocumentC1EP7QObject @ 2697 NONAME
+ _ZN13QTextDocumentC1ER20QTextDocumentPrivateP7QObject @ 2698 NONAME
+ _ZN13QTextDocumentC1ERK7QStringP7QObject @ 2699 NONAME
+ _ZN13QTextDocumentC2EP7QObject @ 2700 NONAME
+ _ZN13QTextDocumentC2ER20QTextDocumentPrivateP7QObject @ 2701 NONAME
+ _ZN13QTextDocumentC2ERK7QStringP7QObject @ 2702 NONAME
+ _ZN13QTextDocumentD0Ev @ 2703 NONAME
+ _ZN13QTextDocumentD1Ev @ 2704 NONAME
+ _ZN13QTextDocumentD2Ev @ 2705 NONAME
+ _ZN13QWidgetAction11eventFilterEP7QObjectP6QEvent @ 2706 NONAME
+ _ZN13QWidgetAction11qt_metacallEN11QMetaObject4CallEiPPv @ 2707 NONAME
+ _ZN13QWidgetAction11qt_metacastEPKc @ 2708 NONAME
+ _ZN13QWidgetAction12createWidgetEP7QWidget @ 2709 NONAME
+ _ZN13QWidgetAction12deleteWidgetEP7QWidget @ 2710 NONAME
+ _ZN13QWidgetAction13releaseWidgetEP7QWidget @ 2711 NONAME
+ _ZN13QWidgetAction13requestWidgetEP7QWidget @ 2712 NONAME
+ _ZN13QWidgetAction16setDefaultWidgetEP7QWidget @ 2713 NONAME
+ _ZN13QWidgetAction16staticMetaObjectE @ 2714 NONAME DATA 16
+ _ZN13QWidgetAction19getStaticMetaObjectEv @ 2715 NONAME
+ _ZN13QWidgetAction5eventEP6QEvent @ 2716 NONAME
+ _ZN13QWidgetActionC1EP7QObject @ 2717 NONAME
+ _ZN13QWidgetActionC2EP7QObject @ 2718 NONAME
+ _ZN13QWidgetActionD0Ev @ 2719 NONAME
+ _ZN13QWidgetActionD1Ev @ 2720 NONAME
+ _ZN13QWidgetActionD2Ev @ 2721 NONAME
+ _ZN13QWidgetItemV2C1EP7QWidget @ 2722 NONAME
+ _ZN13QWidgetItemV2C2EP7QWidget @ 2723 NONAME
+ _ZN13QWidgetItemV2D0Ev @ 2724 NONAME
+ _ZN13QWidgetItemV2D1Ev @ 2725 NONAME
+ _ZN13QWidgetItemV2D2Ev @ 2726 NONAME
+ _ZN13QWindowsStyle10timerEventEP11QTimerEvent @ 2727 NONAME
+ _ZN13QWindowsStyle11eventFilterEP7QObjectP6QEvent @ 2728 NONAME
+ _ZN13QWindowsStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 2729 NONAME
+ _ZN13QWindowsStyle11qt_metacastEPKc @ 2730 NONAME
+ _ZN13QWindowsStyle16staticMetaObjectE @ 2731 NONAME DATA 16
+ _ZN13QWindowsStyle19getStaticMetaObjectEv @ 2732 NONAME
+ _ZN13QWindowsStyle6polishEP12QApplication @ 2733 NONAME
+ _ZN13QWindowsStyle6polishEP7QWidget @ 2734 NONAME
+ _ZN13QWindowsStyle6polishER8QPalette @ 2735 NONAME
+ _ZN13QWindowsStyle8unpolishEP12QApplication @ 2736 NONAME
+ _ZN13QWindowsStyle8unpolishEP7QWidget @ 2737 NONAME
+ _ZN13QWindowsStyleC1ER20QWindowsStylePrivate @ 2738 NONAME
+ _ZN13QWindowsStyleC1Ev @ 2739 NONAME
+ _ZN13QWindowsStyleC2ER20QWindowsStylePrivate @ 2740 NONAME
+ _ZN13QWindowsStyleC2Ev @ 2741 NONAME
+ _ZN13QWindowsStyleD0Ev @ 2742 NONAME
+ _ZN13QWindowsStyleD1Ev @ 2743 NONAME
+ _ZN13QWindowsStyleD2Ev @ 2744 NONAME
+ _ZN14QDesktopWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 2745 NONAME
+ _ZN14QDesktopWidget11qt_metacastEPKc @ 2746 NONAME
+ _ZN14QDesktopWidget11resizeEventEP12QResizeEvent @ 2747 NONAME
+ _ZN14QDesktopWidget15workAreaResizedEi @ 2748 NONAME
+ _ZN14QDesktopWidget16staticMetaObjectE @ 2749 NONAME DATA 16
+ _ZN14QDesktopWidget18screenCountChangedEi @ 2750 NONAME
+ _ZN14QDesktopWidget19getStaticMetaObjectEv @ 2751 NONAME
+ _ZN14QDesktopWidget6screenEi @ 2752 NONAME
+ _ZN14QDesktopWidget7resizedEi @ 2753 NONAME
+ _ZN14QDesktopWidgetC1Ev @ 2754 NONAME
+ _ZN14QDesktopWidgetC2Ev @ 2755 NONAME
+ _ZN14QDesktopWidgetD0Ev @ 2756 NONAME
+ _ZN14QDesktopWidgetD1Ev @ 2757 NONAME
+ _ZN14QDesktopWidgetD2Ev @ 2758 NONAME
+ _ZN14QDoubleSpinBox10setMaximumEd @ 2759 NONAME
+ _ZN14QDoubleSpinBox10setMinimumEd @ 2760 NONAME
+ _ZN14QDoubleSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 2761 NONAME
+ _ZN14QDoubleSpinBox11qt_metacastEPKc @ 2762 NONAME
+ _ZN14QDoubleSpinBox11setDecimalsEi @ 2763 NONAME
+ _ZN14QDoubleSpinBox12valueChangedERK7QString @ 2764 NONAME
+ _ZN14QDoubleSpinBox12valueChangedEd @ 2765 NONAME
+ _ZN14QDoubleSpinBox13setSingleStepEd @ 2766 NONAME
+ _ZN14QDoubleSpinBox16staticMetaObjectE @ 2767 NONAME DATA 16
+ _ZN14QDoubleSpinBox19getStaticMetaObjectEv @ 2768 NONAME
+ _ZN14QDoubleSpinBox8setRangeEdd @ 2769 NONAME
+ _ZN14QDoubleSpinBox8setValueEd @ 2770 NONAME
+ _ZN14QDoubleSpinBox9setPrefixERK7QString @ 2771 NONAME
+ _ZN14QDoubleSpinBox9setSuffixERK7QString @ 2772 NONAME
+ _ZN14QDoubleSpinBoxC1EP7QWidget @ 2773 NONAME
+ _ZN14QDoubleSpinBoxC2EP7QWidget @ 2774 NONAME
+ _ZN14QDragMoveEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 2775 NONAME
+ _ZN14QDragMoveEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEEN6QEvent4TypeE @ 2776 NONAME
+ _ZN14QDragMoveEventD0Ev @ 2777 NONAME
+ _ZN14QDragMoveEventD1Ev @ 2778 NONAME
+ _ZN14QDragMoveEventD2Ev @ 2779 NONAME
+ _ZN14QFileOpenEventC1ERK7QString @ 2780 NONAME
+ _ZN14QFileOpenEventC2ERK7QString @ 2781 NONAME
+ _ZN14QFileOpenEventD0Ev @ 2782 NONAME
+ _ZN14QFileOpenEventD1Ev @ 2783 NONAME
+ _ZN14QFileOpenEventD2Ev @ 2784 NONAME
+ _ZN14QGraphicsScale11qt_metacallEN11QMetaObject4CallEiPPv @ 2785 NONAME
+ _ZN14QGraphicsScale11qt_metacastEPKc @ 2786 NONAME
+ _ZN14QGraphicsScale12scaleChangedEv @ 2787 NONAME
+ _ZN14QGraphicsScale13originChangedEv @ 2788 NONAME
+ _ZN14QGraphicsScale16staticMetaObjectE @ 2789 NONAME DATA 16
+ _ZN14QGraphicsScale19getStaticMetaObjectEv @ 2790 NONAME
+ _ZN14QGraphicsScale9setOriginERK9QVector3D @ 2791 NONAME
+ _ZN14QGraphicsScale9setXScaleEf @ 2792 NONAME
+ _ZN14QGraphicsScale9setYScaleEf @ 2793 NONAME
+ _ZN14QGraphicsScale9setZScaleEf @ 2794 NONAME
+ _ZN14QGraphicsScaleC1EP7QObject @ 2795 NONAME
+ _ZN14QGraphicsScaleC2EP7QObject @ 2796 NONAME
+ _ZN14QGraphicsScaleD0Ev @ 2797 NONAME
+ _ZN14QGraphicsScaleD1Ev @ 2798 NONAME
+ _ZN14QGraphicsScaleD2Ev @ 2799 NONAME
+ _ZN14QGraphicsScene10addEllipseERK6QRectFRK4QPenRK6QBrush @ 2800 NONAME
+ _ZN14QGraphicsScene10addPolygonERK9QPolygonFRK4QPenRK6QBrush @ 2801 NONAME
+ _ZN14QGraphicsScene10clearFocusEv @ 2802 NONAME
+ _ZN14QGraphicsScene10invalidateERK6QRectF6QFlagsINS_10SceneLayerEE @ 2803 NONAME
+ _ZN14QGraphicsScene10removeItemEP13QGraphicsItem @ 2804 NONAME
+ _ZN14QGraphicsScene10setPaletteERK8QPalette @ 2805 NONAME
+ _ZN14QGraphicsScene10wheelEventEP24QGraphicsSceneWheelEvent @ 2806 NONAME
+ _ZN14QGraphicsScene11eventFilterEP7QObjectP6QEvent @ 2807 NONAME
+ _ZN14QGraphicsScene11qt_metacallEN11QMetaObject4CallEiPPv @ 2808 NONAME
+ _ZN14QGraphicsScene11qt_metacastEPKc @ 2809 NONAME
+ _ZN14QGraphicsScene12focusInEventEP11QFocusEvent @ 2810 NONAME
+ _ZN14QGraphicsScene12setFocusItemEP13QGraphicsItemN2Qt11FocusReasonE @ 2811 NONAME
+ _ZN14QGraphicsScene12setSceneRectERK6QRectF @ 2812 NONAME
+ _ZN14QGraphicsScene13addSimpleTextERK7QStringRK5QFont @ 2813 NONAME
+ _ZN14QGraphicsScene13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 2814 NONAME
+ _ZN14QGraphicsScene13focusOutEventEP11QFocusEvent @ 2815 NONAME
+ _ZN14QGraphicsScene13keyPressEventEP9QKeyEvent @ 2816 NONAME
+ _ZN14QGraphicsScene14clearSelectionEv @ 2817 NONAME
+ _ZN14QGraphicsScene14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 2818 NONAME
+ _ZN14QGraphicsScene14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 2819 NONAME
+ _ZN14QGraphicsScene14drawBackgroundEP8QPainterRK6QRectF @ 2820 NONAME
+ _ZN14QGraphicsScene14drawForegroundEP8QPainterRK6QRectF @ 2821 NONAME
+ _ZN14QGraphicsScene14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 2822 NONAME
+ _ZN14QGraphicsScene14setActivePanelEP13QGraphicsItem @ 2823 NONAME
+ _ZN14QGraphicsScene14setStickyFocusEb @ 2824 NONAME
+ _ZN14QGraphicsScene15createItemGroupERK5QListIP13QGraphicsItemE @ 2825 NONAME
+ _ZN14QGraphicsScene15keyReleaseEventEP9QKeyEvent @ 2826 NONAME
+ _ZN14QGraphicsScene15mousePressEventEP24QGraphicsSceneMouseEvent @ 2827 NONAME
+ _ZN14QGraphicsScene15setActiveWindowEP15QGraphicsWidget @ 2828 NONAME
+ _ZN14QGraphicsScene15setBspTreeDepthEi @ 2829 NONAME
+ _ZN14QGraphicsScene16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 2830 NONAME
+ _ZN14QGraphicsScene16destroyItemGroupEP18QGraphicsItemGroup @ 2831 NONAME
+ _ZN14QGraphicsScene16inputMethodEventEP17QInputMethodEvent @ 2832 NONAME
+ _ZN14QGraphicsScene16sceneRectChangedERK6QRectF @ 2833 NONAME
+ _ZN14QGraphicsScene16selectionChangedEv @ 2834 NONAME
+ _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPath @ 2835 NONAME
+ _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathN2Qt17ItemSelectionModeE @ 2836 NONAME
+ _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathN2Qt17ItemSelectionModeERK10QTransform @ 2837 NONAME
+ _ZN14QGraphicsScene16setSelectionAreaERK12QPainterPathRK10QTransform @ 2838 NONAME
+ _ZN14QGraphicsScene16staticMetaObjectE @ 2839 NONAME DATA 16
+ _ZN14QGraphicsScene17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 2840 NONAME
+ _ZN14QGraphicsScene18focusNextPrevChildEb @ 2841 NONAME
+ _ZN14QGraphicsScene18setBackgroundBrushERK6QBrush @ 2842 NONAME
+ _ZN14QGraphicsScene18setForegroundBrushERK6QBrush @ 2843 NONAME
+ _ZN14QGraphicsScene18setItemIndexMethodENS_15ItemIndexMethodE @ 2844 NONAME
+ _ZN14QGraphicsScene19getStaticMetaObjectEv @ 2845 NONAME
+ _ZN14QGraphicsScene19setSortCacheEnabledEb @ 2846 NONAME
+ _ZN14QGraphicsScene21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 2847 NONAME
+ _ZN14QGraphicsScene5clearEv @ 2848 NONAME
+ _ZN14QGraphicsScene5eventEP6QEvent @ 2849 NONAME
+ _ZN14QGraphicsScene6renderEP8QPainterRK6QRectFS4_N2Qt15AspectRatioModeE @ 2850 NONAME
+ _ZN14QGraphicsScene6updateERK6QRectF @ 2851 NONAME
+ _ZN14QGraphicsScene7addItemEP13QGraphicsItem @ 2852 NONAME
+ _ZN14QGraphicsScene7addLineERK6QLineFRK4QPen @ 2853 NONAME
+ _ZN14QGraphicsScene7addPathERK12QPainterPathRK4QPenRK6QBrush @ 2854 NONAME
+ _ZN14QGraphicsScene7addRectERK6QRectFRK4QPenRK6QBrush @ 2855 NONAME
+ _ZN14QGraphicsScene7addTextERK7QStringRK5QFont @ 2856 NONAME
+ _ZN14QGraphicsScene7advanceEv @ 2857 NONAME
+ _ZN14QGraphicsScene7changedERK5QListI6QRectFE @ 2858 NONAME
+ _ZN14QGraphicsScene7setFontERK5QFont @ 2859 NONAME
+ _ZN14QGraphicsScene8setFocusEN2Qt11FocusReasonE @ 2860 NONAME
+ _ZN14QGraphicsScene8setStyleEP6QStyle @ 2861 NONAME
+ _ZN14QGraphicsScene9addPixmapERK7QPixmap @ 2862 NONAME
+ _ZN14QGraphicsScene9addWidgetEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 2863 NONAME
+ _ZN14QGraphicsScene9drawItemsEP8QPainteriPP13QGraphicsItemPK24QStyleOptionGraphicsItemP7QWidget @ 2864 NONAME
+ _ZN14QGraphicsScene9dropEventEP27QGraphicsSceneDragDropEvent @ 2865 NONAME
+ _ZN14QGraphicsScene9helpEventEP23QGraphicsSceneHelpEvent @ 2866 NONAME
+ _ZN14QGraphicsScene9sendEventEP13QGraphicsItemP6QEvent @ 2867 NONAME
+ _ZN14QGraphicsSceneC1EP7QObject @ 2868 NONAME
+ _ZN14QGraphicsSceneC1ERK6QRectFP7QObject @ 2869 NONAME
+ _ZN14QGraphicsSceneC1EffffP7QObject @ 2870 NONAME
+ _ZN14QGraphicsSceneC2EP7QObject @ 2871 NONAME
+ _ZN14QGraphicsSceneC2ERK6QRectFP7QObject @ 2872 NONAME
+ _ZN14QGraphicsSceneC2EffffP7QObject @ 2873 NONAME
+ _ZN14QGraphicsSceneD0Ev @ 2874 NONAME
+ _ZN14QGraphicsSceneD1Ev @ 2875 NONAME
+ _ZN14QGraphicsSceneD2Ev @ 2876 NONAME
+ _ZN14QIconDragEventC1Ev @ 2877 NONAME
+ _ZN14QIconDragEventC2Ev @ 2878 NONAME
+ _ZN14QIconDragEventD0Ev @ 2879 NONAME
+ _ZN14QIconDragEventD1Ev @ 2880 NONAME
+ _ZN14QIconDragEventD2Ev @ 2881 NONAME
+ _ZN14QImageIOPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 2882 NONAME
+ _ZN14QImageIOPlugin11qt_metacastEPKc @ 2883 NONAME
+ _ZN14QImageIOPlugin16staticMetaObjectE @ 2884 NONAME DATA 16
+ _ZN14QImageIOPlugin19getStaticMetaObjectEv @ 2885 NONAME
+ _ZN14QImageIOPluginC2EP7QObject @ 2886 NONAME
+ _ZN14QImageIOPluginD0Ev @ 2887 NONAME
+ _ZN14QImageIOPluginD1Ev @ 2888 NONAME
+ _ZN14QImageIOPluginD2Ev @ 2889 NONAME
+ _ZN14QItemSelection5mergeERKS_6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 2890 NONAME
+ _ZN14QItemSelection5splitERK19QItemSelectionRangeS2_PS_ @ 2891 NONAME
+ _ZN14QItemSelection6selectERK11QModelIndexS2_ @ 2892 NONAME
+ _ZN14QItemSelectionC1ERK11QModelIndexS2_ @ 2893 NONAME
+ _ZN14QItemSelectionC2ERK11QModelIndexS2_ @ 2894 NONAME
+ _ZN14QLayoutPrivate16createSpacerItemEPK7QLayoutiiN11QSizePolicy6PolicyES4_ @ 2895 NONAME
+ _ZN14QLayoutPrivate16createWidgetItemEPK7QLayoutP7QWidget @ 2896 NONAME
+ _ZN14QLayoutPrivate20reparentChildWidgetsEP7QWidget @ 2897 NONAME
+ _ZN14QLayoutPrivate23spacerItemFactoryMethodE @ 2898 NONAME DATA 4
+ _ZN14QLayoutPrivate23widgetItemFactoryMethodE @ 2899 NONAME DATA 4
+ _ZN14QLayoutPrivate8doResizeERK5QSize @ 2900 NONAME
+ _ZN14QLayoutPrivateC1Ev @ 2901 NONAME
+ _ZN14QLayoutPrivateC2Ev @ 2902 NONAME
+ _ZN14QPaintEngineEx10drawPixmapERK7QPointFRK7QPixmap @ 2903 NONAME
+ _ZN14QPaintEngineEx10drawPointsEPK6QPointi @ 2904 NONAME
+ _ZN14QPaintEngineEx10drawPointsEPK7QPointFi @ 2905 NONAME
+ _ZN14QPaintEngineEx11drawEllipseERK5QRect @ 2906 NONAME
+ _ZN14QPaintEngineEx11drawEllipseERK6QRectF @ 2907 NONAME
+ _ZN14QPaintEngineEx11drawPixmapsEPKN12QDrawPixmaps4DataEiRK7QPixmap6QFlagsINS0_11DrawingHintEE @ 2908 NONAME
+ _ZN14QPaintEngineEx11drawPolygonEPK6QPointiN12QPaintEngine15PolygonDrawModeE @ 2909 NONAME
+ _ZN14QPaintEngineEx11drawPolygonEPK7QPointFiN12QPaintEngine15PolygonDrawModeE @ 2910 NONAME
+ _ZN14QPaintEngineEx11updateStateERK17QPaintEngineState @ 2911 NONAME
+ _ZN14QPaintEngineEx15drawRoundedRectERK6QRectFffN2Qt8SizeModeE @ 2912 NONAME
+ _ZN14QPaintEngineEx15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 2913 NONAME
+ _ZN14QPaintEngineEx4clipERK12QPainterPathN2Qt13ClipOperationE @ 2914 NONAME
+ _ZN14QPaintEngineEx4clipERK5QRectN2Qt13ClipOperationE @ 2915 NONAME
+ _ZN14QPaintEngineEx4clipERK7QRegionN2Qt13ClipOperationE @ 2916 NONAME
+ _ZN14QPaintEngineEx4drawERK11QVectorPath @ 2917 NONAME
+ _ZN14QPaintEngineEx6strokeERK11QVectorPathRK4QPen @ 2918 NONAME
+ _ZN14QPaintEngineEx8drawPathERK12QPainterPath @ 2919 NONAME
+ _ZN14QPaintEngineEx8fillRectERK6QRectFRK6QBrush @ 2920 NONAME
+ _ZN14QPaintEngineEx8fillRectERK6QRectFRK6QColor @ 2921 NONAME
+ _ZN14QPaintEngineEx8setStateEP13QPainterState @ 2922 NONAME
+ _ZN14QPaintEngineEx9drawImageERK7QPointFRK6QImage @ 2923 NONAME
+ _ZN14QPaintEngineEx9drawLinesEPK5QLinei @ 2924 NONAME
+ _ZN14QPaintEngineEx9drawLinesEPK6QLineFi @ 2925 NONAME
+ _ZN14QPaintEngineEx9drawRectsEPK5QRecti @ 2926 NONAME
+ _ZN14QPaintEngineEx9drawRectsEPK6QRectFi @ 2927 NONAME
+ _ZN14QPaintEngineExC2ER21QPaintEngineExPrivate @ 2928 NONAME
+ _ZN14QPaintEngineExC2Ev @ 2929 NONAME
+ _ZN14QPlainTextEdit10appendHtmlERK7QString @ 2930 NONAME
+ _ZN14QPlainTextEdit10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 2931 NONAME
+ _ZN14QPlainTextEdit10paintEventEP11QPaintEvent @ 2932 NONAME
+ _ZN14QPlainTextEdit10timerEventEP11QTimerEvent @ 2933 NONAME
+ _ZN14QPlainTextEdit10wheelEventEP11QWheelEvent @ 2934 NONAME
+ _ZN14QPlainTextEdit11changeEventEP6QEvent @ 2935 NONAME
+ _ZN14QPlainTextEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 2936 NONAME
+ _ZN14QPlainTextEdit11qt_metacastEPKc @ 2937 NONAME
+ _ZN14QPlainTextEdit11resizeEventEP12QResizeEvent @ 2938 NONAME
+ _ZN14QPlainTextEdit11setDocumentEP13QTextDocument @ 2939 NONAME
+ _ZN14QPlainTextEdit11setReadOnlyEb @ 2940 NONAME
+ _ZN14QPlainTextEdit11textChangedEv @ 2941 NONAME
+ _ZN14QPlainTextEdit12centerCursorEv @ 2942 NONAME
+ _ZN14QPlainTextEdit12focusInEventEP11QFocusEvent @ 2943 NONAME
+ _ZN14QPlainTextEdit12loadResourceEiRK4QUrl @ 2944 NONAME
+ _ZN14QPlainTextEdit12setPlainTextERK7QString @ 2945 NONAME
+ _ZN14QPlainTextEdit13copyAvailableEb @ 2946 NONAME
+ _ZN14QPlainTextEdit13dragMoveEventEP14QDragMoveEvent @ 2947 NONAME
+ _ZN14QPlainTextEdit13focusOutEventEP11QFocusEvent @ 2948 NONAME
+ _ZN14QPlainTextEdit13keyPressEventEP9QKeyEvent @ 2949 NONAME
+ _ZN14QPlainTextEdit13redoAvailableEb @ 2950 NONAME
+ _ZN14QPlainTextEdit13setTextCursorERK11QTextCursor @ 2951 NONAME
+ _ZN14QPlainTextEdit13undoAvailableEb @ 2952 NONAME
+ _ZN14QPlainTextEdit13updateRequestERK5QRecti @ 2953 NONAME
+ _ZN14QPlainTextEdit14dragEnterEventEP15QDragEnterEvent @ 2954 NONAME
+ _ZN14QPlainTextEdit14dragLeaveEventEP15QDragLeaveEvent @ 2955 NONAME
+ _ZN14QPlainTextEdit14mouseMoveEventEP11QMouseEvent @ 2956 NONAME
+ _ZN14QPlainTextEdit14setCursorWidthEi @ 2957 NONAME
+ _ZN14QPlainTextEdit15appendPlainTextERK7QString @ 2958 NONAME
+ _ZN14QPlainTextEdit15insertPlainTextERK7QString @ 2959 NONAME
+ _ZN14QPlainTextEdit15keyReleaseEventEP9QKeyEvent @ 2960 NONAME
+ _ZN14QPlainTextEdit15mousePressEventEP11QMouseEvent @ 2961 NONAME
+ _ZN14QPlainTextEdit15setLineWrapModeENS_12LineWrapModeE @ 2962 NONAME
+ _ZN14QPlainTextEdit15setTabStopWidthEi @ 2963 NONAME
+ _ZN14QPlainTextEdit15setWordWrapModeEN11QTextOption8WrapModeE @ 2964 NONAME
+ _ZN14QPlainTextEdit16contextMenuEventEP17QContextMenuEvent @ 2965 NONAME
+ _ZN14QPlainTextEdit16inputMethodEventEP17QInputMethodEvent @ 2966 NONAME
+ _ZN14QPlainTextEdit16scrollContentsByEii @ 2967 NONAME
+ _ZN14QPlainTextEdit16selectionChangedEv @ 2968 NONAME
+ _ZN14QPlainTextEdit16setOverwriteModeEb @ 2969 NONAME
+ _ZN14QPlainTextEdit16staticMetaObjectE @ 2970 NONAME DATA 16
+ _ZN14QPlainTextEdit17blockCountChangedEi @ 2971 NONAME
+ _ZN14QPlainTextEdit17mouseReleaseEventEP11QMouseEvent @ 2972 NONAME
+ _ZN14QPlainTextEdit17setCenterOnScrollEb @ 2973 NONAME
+ _ZN14QPlainTextEdit18focusNextPrevChildEb @ 2974 NONAME
+ _ZN14QPlainTextEdit18insertFromMimeDataEPK9QMimeData @ 2975 NONAME
+ _ZN14QPlainTextEdit18setExtraSelectionsERK5QListIN9QTextEdit14ExtraSelectionEE @ 2976 NONAME
+ _ZN14QPlainTextEdit18setTabChangesFocusEb @ 2977 NONAME
+ _ZN14QPlainTextEdit19ensureCursorVisibleEv @ 2978 NONAME
+ _ZN14QPlainTextEdit19getStaticMetaObjectEv @ 2979 NONAME
+ _ZN14QPlainTextEdit19modificationChangedEb @ 2980 NONAME
+ _ZN14QPlainTextEdit20setBackgroundVisibleEb @ 2981 NONAME
+ _ZN14QPlainTextEdit20setCurrentCharFormatERK15QTextCharFormat @ 2982 NONAME
+ _ZN14QPlainTextEdit21cursorPositionChangedEv @ 2983 NONAME
+ _ZN14QPlainTextEdit21mouseDoubleClickEventEP11QMouseEvent @ 2984 NONAME
+ _ZN14QPlainTextEdit22mergeCurrentCharFormatERK15QTextCharFormat @ 2985 NONAME
+ _ZN14QPlainTextEdit23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 2986 NONAME
+ _ZN14QPlainTextEdit25createStandardContextMenuEv @ 2987 NONAME
+ _ZN14QPlainTextEdit3cutEv @ 2988 NONAME
+ _ZN14QPlainTextEdit4copyEv @ 2989 NONAME
+ _ZN14QPlainTextEdit4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 2990 NONAME
+ _ZN14QPlainTextEdit4redoEv @ 2991 NONAME
+ _ZN14QPlainTextEdit4undoEv @ 2992 NONAME
+ _ZN14QPlainTextEdit5clearEv @ 2993 NONAME
+ _ZN14QPlainTextEdit5eventEP6QEvent @ 2994 NONAME
+ _ZN14QPlainTextEdit5pasteEv @ 2995 NONAME
+ _ZN14QPlainTextEdit9dropEventEP10QDropEvent @ 2996 NONAME
+ _ZN14QPlainTextEdit9selectAllEv @ 2997 NONAME
+ _ZN14QPlainTextEdit9showEventEP10QShowEvent @ 2998 NONAME
+ _ZN14QPlainTextEditC1EP7QWidget @ 2999 NONAME
+ _ZN14QPlainTextEditC1ER21QPlainTextEditPrivateP7QWidget @ 3000 NONAME
+ _ZN14QPlainTextEditC1ERK7QStringP7QWidget @ 3001 NONAME
+ _ZN14QPlainTextEditC2EP7QWidget @ 3002 NONAME
+ _ZN14QPlainTextEditC2ER21QPlainTextEditPrivateP7QWidget @ 3003 NONAME
+ _ZN14QPlainTextEditC2ERK7QStringP7QWidget @ 3004 NONAME
+ _ZN14QPlainTextEditD0Ev @ 3005 NONAME
+ _ZN14QPlainTextEditD1Ev @ 3006 NONAME
+ _ZN14QPlainTextEditD2Ev @ 3007 NONAME
+ _ZN14QShortcutEventC1ERK12QKeySequenceib @ 3008 NONAME
+ _ZN14QShortcutEventC2ERK12QKeySequenceib @ 3009 NONAME
+ _ZN14QShortcutEventD0Ev @ 3010 NONAME
+ _ZN14QShortcutEventD1Ev @ 3011 NONAME
+ _ZN14QShortcutEventD2Ev @ 3012 NONAME
+ _ZN14QStackedLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 3013 NONAME
+ _ZN14QStackedLayout11qt_metacastEPKc @ 3014 NONAME
+ _ZN14QStackedLayout11setGeometryERK5QRect @ 3015 NONAME
+ _ZN14QStackedLayout12insertWidgetEiP7QWidget @ 3016 NONAME
+ _ZN14QStackedLayout13widgetRemovedEi @ 3017 NONAME
+ _ZN14QStackedLayout14currentChangedEi @ 3018 NONAME
+ _ZN14QStackedLayout15setCurrentIndexEi @ 3019 NONAME
+ _ZN14QStackedLayout15setStackingModeENS_12StackingModeE @ 3020 NONAME
+ _ZN14QStackedLayout16setCurrentWidgetEP7QWidget @ 3021 NONAME
+ _ZN14QStackedLayout16staticMetaObjectE @ 3022 NONAME DATA 16
+ _ZN14QStackedLayout19getStaticMetaObjectEv @ 3023 NONAME
+ _ZN14QStackedLayout6takeAtEi @ 3024 NONAME
+ _ZN14QStackedLayout7addItemEP11QLayoutItem @ 3025 NONAME
+ _ZN14QStackedLayout9addWidgetEP7QWidget @ 3026 NONAME
+ _ZN14QStackedLayoutC1EP7QLayout @ 3027 NONAME
+ _ZN14QStackedLayoutC1EP7QWidget @ 3028 NONAME
+ _ZN14QStackedLayoutC1Ev @ 3029 NONAME
+ _ZN14QStackedLayoutC2EP7QLayout @ 3030 NONAME
+ _ZN14QStackedLayoutC2EP7QWidget @ 3031 NONAME
+ _ZN14QStackedLayoutC2Ev @ 3032 NONAME
+ _ZN14QStackedLayoutD0Ev @ 3033 NONAME
+ _ZN14QStackedLayoutD1Ev @ 3034 NONAME
+ _ZN14QStackedLayoutD2Ev @ 3035 NONAME
+ _ZN14QStackedWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3036 NONAME
+ _ZN14QStackedWidget11qt_metacastEPKc @ 3037 NONAME
+ _ZN14QStackedWidget12insertWidgetEiP7QWidget @ 3038 NONAME
+ _ZN14QStackedWidget12removeWidgetEP7QWidget @ 3039 NONAME
+ _ZN14QStackedWidget13widgetRemovedEi @ 3040 NONAME
+ _ZN14QStackedWidget14currentChangedEi @ 3041 NONAME
+ _ZN14QStackedWidget15setCurrentIndexEi @ 3042 NONAME
+ _ZN14QStackedWidget16setCurrentWidgetEP7QWidget @ 3043 NONAME
+ _ZN14QStackedWidget16staticMetaObjectE @ 3044 NONAME DATA 16
+ _ZN14QStackedWidget19getStaticMetaObjectEv @ 3045 NONAME
+ _ZN14QStackedWidget5eventEP6QEvent @ 3046 NONAME
+ _ZN14QStackedWidget9addWidgetEP7QWidget @ 3047 NONAME
+ _ZN14QStackedWidgetC1EP7QWidget @ 3048 NONAME
+ _ZN14QStackedWidgetC2EP7QWidget @ 3049 NONAME
+ _ZN14QStackedWidgetD0Ev @ 3050 NONAME
+ _ZN14QStackedWidgetD1Ev @ 3051 NONAME
+ _ZN14QStackedWidgetD2Ev @ 3052 NONAME
+ _ZN14QTextTableCell9setFormatERK15QTextCharFormat @ 3053 NONAME
+ _ZN14QWidgetPrivate10allWidgetsE @ 3054 NONAME DATA 4
+ _ZN14QWidgetPrivate10create_sysEP11CCoeControlbb @ 3055 NONAME
+ _ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore @ 3056 NONAME
+ _ZN14QWidgetPrivate10scrollRectERK5QRectii @ 3057 NONAME
+ _ZN14QWidgetPrivate10scroll_sysEii @ 3058 NONAME
+ _ZN14QWidgetPrivate10scroll_sysEiiRK5QRect @ 3059 NONAME
+ _ZN14QWidgetPrivate10updateFontERK5QFont @ 3060 NONAME
+ _ZN14QWidgetPrivate11adjustFlagsER6QFlagsIN2Qt10WindowTypeEEP7QWidget @ 3061 NONAME
+ _ZN14QWidgetPrivate11createExtraEv @ 3062 NONAME
+ _ZN14QWidgetPrivate11createWinIdEP11CCoeControl @ 3063 NONAME
+ _ZN14QWidgetPrivate11deleteExtraEv @ 3064 NONAME
+ _ZN14QWidgetPrivate11hide_helperEv @ 3065 NONAME
+ _ZN14QWidgetPrivate11pointToRectERK6QPointRK5QRect @ 3066 NONAME
+ _ZN14QWidgetPrivate11repaint_sysERK7QRegion @ 3067 NONAME
+ _ZN14QWidgetPrivate11resolveFontEv @ 3068 NONAME
+ _ZN14QWidgetPrivate11setMask_sysERK7QRegion @ 3069 NONAME
+ _ZN14QWidgetPrivate11show_helperEv @ 3070 NONAME
+ _ZN14QWidgetPrivate12close_helperENS_9CloseModeE @ 3071 NONAME
+ _ZN14QWidgetPrivate12hideChildrenEb @ 3072 NONAME
+ _ZN14QWidgetPrivate12inheritStyleEv @ 3073 NONAME
+ _ZN14QWidgetPrivate12maxInstancesE @ 3074 NONAME DATA 4
+ _ZN14QWidgetPrivate12mouseGrabberE @ 3075 NONAME DATA 4
+ _ZN14QWidgetPrivate12setFocus_sysEv @ 3076 NONAME
+ _ZN14QWidgetPrivate12setModal_sysEv @ 3077 NONAME
+ _ZN14QWidgetPrivate12showChildrenEb @ 3078 NONAME
+ _ZN14QWidgetPrivate13createTLExtraEv @ 3079 NONAME
+ _ZN14QWidgetPrivate13editingWidgetE @ 3080 NONAME DATA 4
+ _ZN14QWidgetPrivate13render_helperEP8QPainterRK6QPointRK7QRegion6QFlagsIN7QWidget10RenderFlagEE @ 3081 NONAME
+ _ZN14QWidgetPrivate13resolveLocaleEv @ 3082 NONAME
+ _ZN14QWidgetPrivate13setCursor_sysERK7QCursor @ 3083 NONAME
+ _ZN14QWidgetPrivate13setParent_sysEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3084 NONAME
+ _ZN14QWidgetPrivate13setWSGeometryEbRK5QRect @ 3085 NONAME
+ _ZN14QWidgetPrivate14createSysExtraEv @ 3086 NONAME
+ _ZN14QWidgetPrivate14deleteSysExtraEv @ 3087 NONAME
+ _ZN14QWidgetPrivate14resolvePaletteEv @ 3088 NONAME
+ _ZN14QWidgetPrivate14scrollChildrenEii @ 3089 NONAME
+ _ZN14QWidgetPrivate14show_recursiveEv @ 3090 NONAME
+ _ZN14QWidgetPrivate14stackUnder_sysEP7QWidget @ 3091 NONAME
+ _ZN14QWidgetPrivate14updateIsOpaqueEv @ 3092 NONAME
+ _ZN14QWidgetPrivate15instanceCounterE @ 3093 NONAME DATA 4
+ _ZN14QWidgetPrivate15keyboardGrabberE @ 3094 NONAME DATA 4
+ _ZN14QWidgetPrivate15prepareToRenderERK7QRegion6QFlagsIN7QWidget10RenderFlagEE @ 3095 NONAME
+ _ZN14QWidgetPrivate15setGeometry_sysEiiiib @ 3096 NONAME
+ _ZN14QWidgetPrivate15setStyle_helperEP6QStylebb @ 3097 NONAME
+ _ZN14QWidgetPrivate15unsetCursor_sysEv @ 3098 NONAME
+ _ZN14QWidgetPrivate16createTLSysExtraEv @ 3099 NONAME
+ _ZN14QWidgetPrivate16deleteTLSysExtraEv @ 3100 NONAME
+ _ZN14QWidgetPrivate16invalidateBufferERK5QRect @ 3101 NONAME
+ _ZN14QWidgetPrivate16invalidateBufferERK7QRegion @ 3102 NONAME
+ _ZN14QWidgetPrivate16registerDropSiteEb @ 3103 NONAME
+ _ZN14QWidgetPrivate16reparentChildrenEv @ 3104 NONAME
+ _ZN14QWidgetPrivate16setLocale_helperERK7QLocaleb @ 3105 NONAME
+ _ZN14QWidgetPrivate16syncBackingStoreERK7QRegion @ 3106 NONAME
+ _ZN14QWidgetPrivate16syncBackingStoreEv @ 3107 NONAME
+ _ZN14QWidgetPrivate16updateFrameStrutEv @ 3108 NONAME
+ _ZN14QWidgetPrivate17createRecursivelyEv @ 3109 NONAME
+ _ZN14QWidgetPrivate17s60UpdateIsOpaqueEv @ 3110 NONAME
+ _ZN14QWidgetPrivate17setEnabled_helperEb @ 3111 NONAME
+ _ZN14QWidgetPrivate17setPalette_helperERK8QPalette @ 3112 NONAME
+ _ZN14QWidgetPrivate17setWindowIcon_sysEb @ 3113 NONAME
+ _ZN14QWidgetPrivate18_q_showIfNotHiddenEv @ 3114 NONAME
+ _ZN14QWidgetPrivate18setConstraints_sysEv @ 3115 NONAME
+ _ZN14QWidgetPrivate18setWindowTitle_sysERK7QString @ 3116 NONAME
+ _ZN14QWidgetPrivate19navigateToDirectionENS_9DirectionE @ 3117 NONAME
+ _ZN14QWidgetPrivate19registerTouchWindowEv @ 3118 NONAME
+ _ZN14QWidgetPrivate19updateIsTranslucentEv @ 3119 NONAME
+ _ZN14QWidgetPrivate20reparentFocusWidgetsEP7QWidget @ 3120 NONAME
+ _ZN14QWidgetPrivate20setDirtyOpaqueRegionEv @ 3121 NONAME
+ _ZN14QWidgetPrivate20setLayoutItemMarginsEN6QStyle10SubElementEPK12QStyleOption @ 3122 NONAME
+ _ZN14QWidgetPrivate20setLayoutItemMarginsEiiii @ 3123 NONAME
+ _ZN14QWidgetPrivate20setWindowIcon_helperEv @ 3124 NONAME
+ _ZN14QWidgetPrivate20setWindowOpacity_sysEf @ 3125 NONAME
+ _ZN14QWidgetPrivate21activateSymbianWindowEv @ 3126 NONAME ABSENT
+ _ZN14QWidgetPrivate21setMaximumSize_helperERiS0_ @ 3127 NONAME
+ _ZN14QWidgetPrivate21setMinimumSize_helperERiS0_ @ 3128 NONAME
+ _ZN14QWidgetPrivate21setWindowIconText_sysERK7QString @ 3129 NONAME
+ _ZN14QWidgetPrivate21setWindowTitle_helperERK7QString @ 3130 NONAME
+ _ZN14QWidgetPrivate21updateGeometry_helperEb @ 3131 NONAME
+ _ZN14QWidgetPrivate22paintSiblingsRecursiveEP12QPaintDeviceRK5QListIP7QObjectEiRK7QRegionRK6QPointiP8QPainterP19QWidgetBackingStore @ 3132 NONAME
+ _ZN14QWidgetPrivate22propagatePaletteChangeEv @ 3133 NONAME
+ _ZN14QWidgetPrivate22resolveLayoutDirectionEv @ 3134 NONAME
+ _ZN14QWidgetPrivate22updateSystemBackgroundEv @ 3135 NONAME
+ _ZN14QWidgetPrivate23deactivateWidgetCleanupEv @ 3136 NONAME
+ _ZN14QWidgetPrivate24setUpdatesEnabled_helperEb @ 3137 NONAME
+ _ZN14QWidgetPrivate24setWindowFilePath_helperERK7QString @ 3138 NONAME
+ _ZN14QWidgetPrivate24setWindowIconText_helperERK7QString @ 3139 NONAME
+ _ZN14QWidgetPrivate25setLayoutDirection_helperEN2Qt15LayoutDirectionE @ 3140 NONAME
+ _ZN14QWidgetPrivate26adjustQuitOnCloseAttributeEv @ 3141 NONAME
+ _ZN14QWidgetPrivate26createDefaultWindowSurfaceEv @ 3142 NONAME
+ _ZN14QWidgetPrivate26nearestGraphicsProxyWidgetEP7QWidget @ 3143 NONAME
+ _ZN14QWidgetPrivate27widgetInNavigationDirectionENS_9DirectionE @ 3144 NONAME
+ _ZN14QWidgetPrivate29invalidateBuffer_resizeHelperERK6QPointRK5QSize @ 3145 NONAME
+ _ZN14QWidgetPrivate30createDefaultWindowSurface_sysEv @ 3146 NONAME
+ _ZN14QWidgetPrivate30sendPendingMoveAndResizeEventsEbb @ 3147 NONAME
+ _ZN14QWidgetPrivate31activateChildLayoutsRecursivelyEv @ 3148 NONAME
+ _ZN14QWidgetPrivate4initEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3149 NONAME
+ _ZN14QWidgetPrivate6mapperE @ 3150 NONAME DATA 4
+ _ZN14QWidgetPrivate8hide_sysEv @ 3151 NONAME
+ _ZN14QWidgetPrivate8moveRectERK5QRectii @ 3152 NONAME
+ _ZN14QWidgetPrivate8setWinIdEP11CCoeControl @ 3153 NONAME
+ _ZN14QWidgetPrivate8show_sysEv @ 3154 NONAME
+ _ZN14QWidgetPrivate9lower_sysEv @ 3155 NONAME
+ _ZN14QWidgetPrivate9raise_sysEv @ 3156 NONAME
+ _ZN14QWidgetPrivate9setOpaqueEb @ 3157 NONAME
+ _ZN14QWidgetPrivateC1Ei @ 3158 NONAME
+ _ZN14QWidgetPrivateC2Ei @ 3159 NONAME
+ _ZN14QWidgetPrivateD0Ev @ 3160 NONAME
+ _ZN14QWidgetPrivateD1Ev @ 3161 NONAME
+ _ZN14QWidgetPrivateD2Ev @ 3162 NONAME
+ _ZN14QWindowSurface10beginPaintERK7QRegion @ 3163 NONAME
+ _ZN14QWindowSurface11setGeometryERK5QRect @ 3164 NONAME
+ _ZN14QWindowSurface17setStaticContentsERK7QRegion @ 3165 NONAME
+ _ZN14QWindowSurface24setStaticContentsSupportEb @ 3166 NONAME
+ _ZN14QWindowSurface6bufferEPK7QWidget @ 3167 NONAME
+ _ZN14QWindowSurface6scrollERK7QRegionii @ 3168 NONAME
+ _ZN14QWindowSurface8endPaintERK7QRegion @ 3169 NONAME
+ _ZN14QWindowSurfaceC2EP7QWidget @ 3170 NONAME
+ _ZN14QWindowSurfaceD0Ev @ 3171 NONAME
+ _ZN14QWindowSurfaceD1Ev @ 3172 NONAME
+ _ZN14QWindowSurfaceD2Ev @ 3173 NONAME
+ _ZN15QAbstractButton10setCheckedEb @ 3174 NONAME
+ _ZN15QAbstractButton10timerEventEP11QTimerEvent @ 3175 NONAME
+ _ZN15QAbstractButton11changeEventEP6QEvent @ 3176 NONAME
+ _ZN15QAbstractButton11qt_metacallEN11QMetaObject4CallEiPPv @ 3177 NONAME
+ _ZN15QAbstractButton11qt_metacastEPKc @ 3178 NONAME
+ _ZN15QAbstractButton11setIconSizeERK5QSize @ 3179 NONAME
+ _ZN15QAbstractButton11setShortcutERK12QKeySequence @ 3180 NONAME
+ _ZN15QAbstractButton12animateClickEi @ 3181 NONAME
+ _ZN15QAbstractButton12focusInEventEP11QFocusEvent @ 3182 NONAME
+ _ZN15QAbstractButton12setCheckableEb @ 3183 NONAME
+ _ZN15QAbstractButton13checkStateSetEv @ 3184 NONAME
+ _ZN15QAbstractButton13focusOutEventEP11QFocusEvent @ 3185 NONAME
+ _ZN15QAbstractButton13keyPressEventEP9QKeyEvent @ 3186 NONAME
+ _ZN15QAbstractButton13setAutoRepeatEb @ 3187 NONAME
+ _ZN15QAbstractButton14mouseMoveEventEP11QMouseEvent @ 3188 NONAME
+ _ZN15QAbstractButton14nextCheckStateEv @ 3189 NONAME
+ _ZN15QAbstractButton15keyReleaseEventEP9QKeyEvent @ 3190 NONAME
+ _ZN15QAbstractButton15mousePressEventEP11QMouseEvent @ 3191 NONAME
+ _ZN15QAbstractButton16setAutoExclusiveEb @ 3192 NONAME
+ _ZN15QAbstractButton16staticMetaObjectE @ 3193 NONAME DATA 16
+ _ZN15QAbstractButton17mouseReleaseEventEP11QMouseEvent @ 3194 NONAME
+ _ZN15QAbstractButton18setAutoRepeatDelayEi @ 3195 NONAME
+ _ZN15QAbstractButton19getStaticMetaObjectEv @ 3196 NONAME
+ _ZN15QAbstractButton21setAutoRepeatIntervalEi @ 3197 NONAME
+ _ZN15QAbstractButton5clickEv @ 3198 NONAME
+ _ZN15QAbstractButton5eventEP6QEvent @ 3199 NONAME
+ _ZN15QAbstractButton6toggleEv @ 3200 NONAME
+ _ZN15QAbstractButton7clickedEb @ 3201 NONAME
+ _ZN15QAbstractButton7pressedEv @ 3202 NONAME
+ _ZN15QAbstractButton7setDownEb @ 3203 NONAME
+ _ZN15QAbstractButton7setIconERK5QIcon @ 3204 NONAME
+ _ZN15QAbstractButton7setTextERK7QString @ 3205 NONAME
+ _ZN15QAbstractButton7toggledEb @ 3206 NONAME
+ _ZN15QAbstractButton8releasedEv @ 3207 NONAME
+ _ZN15QAbstractButtonC2EP7QWidget @ 3208 NONAME
+ _ZN15QAbstractButtonC2ER22QAbstractButtonPrivateP7QWidget @ 3209 NONAME
+ _ZN15QAbstractButtonD0Ev @ 3210 NONAME
+ _ZN15QAbstractButtonD1Ev @ 3211 NONAME
+ _ZN15QAbstractButtonD2Ev @ 3212 NONAME
+ _ZN15QAbstractSlider10setMaximumEi @ 3213 NONAME
+ _ZN15QAbstractSlider10setMinimumEi @ 3214 NONAME
+ _ZN15QAbstractSlider10timerEventEP11QTimerEvent @ 3215 NONAME
+ _ZN15QAbstractSlider10wheelEventEP11QWheelEvent @ 3216 NONAME
+ _ZN15QAbstractSlider11changeEventEP6QEvent @ 3217 NONAME
+ _ZN15QAbstractSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 3218 NONAME
+ _ZN15QAbstractSlider11qt_metacastEPKc @ 3219 NONAME
+ _ZN15QAbstractSlider11setPageStepEi @ 3220 NONAME
+ _ZN15QAbstractSlider11setTrackingEb @ 3221 NONAME
+ _ZN15QAbstractSlider11sliderMovedEi @ 3222 NONAME
+ _ZN15QAbstractSlider12rangeChangedEii @ 3223 NONAME
+ _ZN15QAbstractSlider12sliderChangeENS_12SliderChangeE @ 3224 NONAME
+ _ZN15QAbstractSlider12valueChangedEi @ 3225 NONAME
+ _ZN15QAbstractSlider13keyPressEventEP9QKeyEvent @ 3226 NONAME
+ _ZN15QAbstractSlider13setSingleStepEi @ 3227 NONAME
+ _ZN15QAbstractSlider13setSliderDownEb @ 3228 NONAME
+ _ZN15QAbstractSlider13sliderPressedEv @ 3229 NONAME
+ _ZN15QAbstractSlider13triggerActionENS_12SliderActionE @ 3230 NONAME
+ _ZN15QAbstractSlider14setOrientationEN2Qt11OrientationE @ 3231 NONAME
+ _ZN15QAbstractSlider14sliderReleasedEv @ 3232 NONAME
+ _ZN15QAbstractSlider15actionTriggeredEi @ 3233 NONAME
+ _ZN15QAbstractSlider15setRepeatActionENS_12SliderActionEii @ 3234 NONAME
+ _ZN15QAbstractSlider16staticMetaObjectE @ 3235 NONAME DATA 16
+ _ZN15QAbstractSlider17setSliderPositionEi @ 3236 NONAME
+ _ZN15QAbstractSlider19getStaticMetaObjectEv @ 3237 NONAME
+ _ZN15QAbstractSlider19setInvertedControlsEb @ 3238 NONAME
+ _ZN15QAbstractSlider21setInvertedAppearanceEb @ 3239 NONAME
+ _ZN15QAbstractSlider5eventEP6QEvent @ 3240 NONAME
+ _ZN15QAbstractSlider8setRangeEii @ 3241 NONAME
+ _ZN15QAbstractSlider8setValueEi @ 3242 NONAME
+ _ZN15QAbstractSliderC1EP7QWidget @ 3243 NONAME
+ _ZN15QAbstractSliderC1ER22QAbstractSliderPrivateP7QWidget @ 3244 NONAME
+ _ZN15QAbstractSliderC2EP7QWidget @ 3245 NONAME
+ _ZN15QAbstractSliderC2ER22QAbstractSliderPrivateP7QWidget @ 3246 NONAME
+ _ZN15QAbstractSliderD0Ev @ 3247 NONAME
+ _ZN15QAbstractSliderD1Ev @ 3248 NONAME
+ _ZN15QAbstractSliderD2Ev @ 3249 NONAME
+ _ZN15QCalendarWidget10updateCellERK5QDate @ 3250 NONAME
+ _ZN15QCalendarWidget11eventFilterEP7QObjectP6QEvent @ 3251 NONAME
+ _ZN15QCalendarWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3252 NONAME
+ _ZN15QCalendarWidget11qt_metacastEPKc @ 3253 NONAME
+ _ZN15QCalendarWidget11resizeEventEP12QResizeEvent @ 3254 NONAME
+ _ZN15QCalendarWidget11updateCellsEv @ 3255 NONAME
+ _ZN15QCalendarWidget12setDateRangeERK5QDateS2_ @ 3256 NONAME
+ _ZN15QCalendarWidget12showNextYearEv @ 3257 NONAME
+ _ZN15QCalendarWidget13keyPressEventEP9QKeyEvent @ 3258 NONAME
+ _ZN15QCalendarWidget13showNextMonthEv @ 3259 NONAME
+ _ZN15QCalendarWidget14setCurrentPageEii @ 3260 NONAME
+ _ZN15QCalendarWidget14setGridVisibleEb @ 3261 NONAME
+ _ZN15QCalendarWidget14setMaximumDateERK5QDate @ 3262 NONAME
+ _ZN15QCalendarWidget14setMinimumDateERK5QDate @ 3263 NONAME
+ _ZN15QCalendarWidget15mousePressEventEP11QMouseEvent @ 3264 NONAME
+ _ZN15QCalendarWidget15setSelectedDateERK5QDate @ 3265 NONAME
+ _ZN15QCalendarWidget16selectionChangedEv @ 3266 NONAME
+ _ZN15QCalendarWidget16setHeaderVisibleEb @ 3267 NONAME
+ _ZN15QCalendarWidget16setSelectionModeENS_13SelectionModeE @ 3268 NONAME
+ _ZN15QCalendarWidget16showPreviousYearEv @ 3269 NONAME
+ _ZN15QCalendarWidget16showSelectedDateEv @ 3270 NONAME
+ _ZN15QCalendarWidget16staticMetaObjectE @ 3271 NONAME DATA 16
+ _ZN15QCalendarWidget17setDateTextFormatERK5QDateRK15QTextCharFormat @ 3272 NONAME
+ _ZN15QCalendarWidget17setFirstDayOfWeekEN2Qt9DayOfWeekE @ 3273 NONAME
+ _ZN15QCalendarWidget17showPreviousMonthEv @ 3274 NONAME
+ _ZN15QCalendarWidget18currentPageChangedEii @ 3275 NONAME
+ _ZN15QCalendarWidget18setDateEditEnabledEb @ 3276 NONAME
+ _ZN15QCalendarWidget19getStaticMetaObjectEv @ 3277 NONAME
+ _ZN15QCalendarWidget19setHeaderTextFormatERK15QTextCharFormat @ 3278 NONAME
+ _ZN15QCalendarWidget20setWeekdayTextFormatEN2Qt9DayOfWeekERK15QTextCharFormat @ 3279 NONAME
+ _ZN15QCalendarWidget22setDateEditAcceptDelayEi @ 3280 NONAME
+ _ZN15QCalendarWidget23setNavigationBarVisibleEb @ 3281 NONAME
+ _ZN15QCalendarWidget23setVerticalHeaderFormatENS_20VerticalHeaderFormatE @ 3282 NONAME
+ _ZN15QCalendarWidget25setHorizontalHeaderFormatENS_22HorizontalHeaderFormatE @ 3283 NONAME
+ _ZN15QCalendarWidget5eventEP6QEvent @ 3284 NONAME
+ _ZN15QCalendarWidget7clickedERK5QDate @ 3285 NONAME
+ _ZN15QCalendarWidget9activatedERK5QDate @ 3286 NONAME
+ _ZN15QCalendarWidget9showTodayEv @ 3287 NONAME
+ _ZN15QCalendarWidgetC1EP7QWidget @ 3288 NONAME
+ _ZN15QCalendarWidgetC2EP7QWidget @ 3289 NONAME
+ _ZN15QCalendarWidgetD0Ev @ 3290 NONAME
+ _ZN15QCalendarWidgetD1Ev @ 3291 NONAME
+ _ZN15QCalendarWidgetD2Ev @ 3292 NONAME
+ _ZN15QClipboardEventC1EP13QEventPrivate @ 3293 NONAME
+ _ZN15QClipboardEventC2EP13QEventPrivate @ 3294 NONAME
+ _ZN15QClipboardEventD0Ev @ 3295 NONAME
+ _ZN15QClipboardEventD1Ev @ 3296 NONAME
+ _ZN15QClipboardEventD2Ev @ 3297 NONAME
+ _ZN15QDragEnterEventC1ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEE @ 3298 NONAME
+ _ZN15QDragEnterEventC2ERK6QPoint6QFlagsIN2Qt10DropActionEEPK9QMimeDataS3_INS4_11MouseButtonEES3_INS4_16KeyboardModifierEE @ 3299 NONAME
+ _ZN15QDragEnterEventD0Ev @ 3300 NONAME
+ _ZN15QDragEnterEventD1Ev @ 3301 NONAME
+ _ZN15QDragEnterEventD2Ev @ 3302 NONAME
+ _ZN15QDragLeaveEventC1Ev @ 3303 NONAME
+ _ZN15QDragLeaveEventC2Ev @ 3304 NONAME
+ _ZN15QDragLeaveEventD0Ev @ 3305 NONAME
+ _ZN15QDragLeaveEventD1Ev @ 3306 NONAME
+ _ZN15QDragLeaveEventD2Ev @ 3307 NONAME
+ _ZN15QGraphicsAnchor10setSpacingEf @ 3308 NONAME
+ _ZN15QGraphicsAnchor11qt_metacallEN11QMetaObject4CallEiPPv @ 3309 NONAME
+ _ZN15QGraphicsAnchor11qt_metacastEPKc @ 3310 NONAME
+ _ZN15QGraphicsAnchor12unsetSpacingEv @ 3311 NONAME
+ _ZN15QGraphicsAnchor16staticMetaObjectE @ 3312 NONAME DATA 16
+ _ZN15QGraphicsAnchor19getStaticMetaObjectEv @ 3313 NONAME
+ _ZN15QGraphicsAnchorC1EP21QGraphicsAnchorLayout @ 3314 NONAME
+ _ZN15QGraphicsAnchorC2EP21QGraphicsAnchorLayout @ 3315 NONAME
+ _ZN15QGraphicsAnchorD0Ev @ 3316 NONAME
+ _ZN15QGraphicsAnchorD1Ev @ 3317 NONAME
+ _ZN15QGraphicsAnchorD2Ev @ 3318 NONAME
+ _ZN15QGraphicsEffect10setEnabledEb @ 3319 NONAME
+ _ZN15QGraphicsEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 3320 NONAME
+ _ZN15QGraphicsEffect11qt_metacastEPKc @ 3321 NONAME
+ _ZN15QGraphicsEffect13sourceChangedE6QFlagsINS_10ChangeFlagEE @ 3322 NONAME
+ _ZN15QGraphicsEffect14enabledChangedEb @ 3323 NONAME
+ _ZN15QGraphicsEffect16staticMetaObjectE @ 3324 NONAME DATA 16
+ _ZN15QGraphicsEffect18updateBoundingRectEv @ 3325 NONAME
+ _ZN15QGraphicsEffect19getStaticMetaObjectEv @ 3326 NONAME
+ _ZN15QGraphicsEffect6updateEv @ 3327 NONAME
+ _ZN15QGraphicsEffectC2EP7QObject @ 3328 NONAME
+ _ZN15QGraphicsEffectC2ER22QGraphicsEffectPrivateP7QObject @ 3329 NONAME
+ _ZN15QGraphicsEffectD0Ev @ 3330 NONAME
+ _ZN15QGraphicsEffectD1Ev @ 3331 NONAME
+ _ZN15QGraphicsEffectD2Ev @ 3332 NONAME
+ _ZN15QGraphicsLayout10invalidateEv @ 3333 NONAME
+ _ZN15QGraphicsLayout11widgetEventEP6QEvent @ 3334 NONAME
+ _ZN15QGraphicsLayout14updateGeometryEv @ 3335 NONAME
+ _ZN15QGraphicsLayout18addChildLayoutItemEP19QGraphicsLayoutItem @ 3336 NONAME
+ _ZN15QGraphicsLayout18setContentsMarginsEffff @ 3337 NONAME
+ _ZN15QGraphicsLayout8activateEv @ 3338 NONAME
+ _ZN15QGraphicsLayoutC2EP19QGraphicsLayoutItem @ 3339 NONAME
+ _ZN15QGraphicsLayoutC2ER22QGraphicsLayoutPrivateP19QGraphicsLayoutItem @ 3340 NONAME
+ _ZN15QGraphicsLayoutD0Ev @ 3341 NONAME
+ _ZN15QGraphicsLayoutD1Ev @ 3342 NONAME
+ _ZN15QGraphicsLayoutD2Ev @ 3343 NONAME
+ _ZN15QGraphicsObject11grabGestureEN2Qt11GestureTypeENS0_14GestureContextE @ 3344 NONAME
+ _ZN15QGraphicsObject11qt_metacallEN11QMetaObject4CallEiPPv @ 3345 NONAME
+ _ZN15QGraphicsObject11qt_metacastEPKc @ 3346 NONAME
+ _ZN15QGraphicsObject12scaleChangedEv @ 3347 NONAME
+ _ZN15QGraphicsObject13parentChangedEv @ 3348 NONAME
+ _ZN15QGraphicsObject14enabledChangedEv @ 3349 NONAME
+ _ZN15QGraphicsObject14opacityChangedEv @ 3350 NONAME
+ _ZN15QGraphicsObject14visibleChangedEv @ 3351 NONAME
+ _ZN15QGraphicsObject15rotationChangedEv @ 3352 NONAME
+ _ZN15QGraphicsObject16staticMetaObjectE @ 3353 NONAME DATA 16
+ _ZN15QGraphicsObject19getStaticMetaObjectEv @ 3354 NONAME
+ _ZN15QGraphicsObject8xChangedEv @ 3355 NONAME
+ _ZN15QGraphicsObject8yChangedEv @ 3356 NONAME
+ _ZN15QGraphicsObject8zChangedEv @ 3357 NONAME
+ _ZN15QGraphicsObjectC2EP13QGraphicsItem @ 3358 NONAME
+ _ZN15QGraphicsObjectC2ER20QGraphicsItemPrivateP13QGraphicsItemP14QGraphicsScene @ 3359 NONAME
+ _ZN15QGraphicsSystem23createDefaultPixmapDataEN11QPixmapData9PixelTypeE @ 3360 NONAME
+ _ZN15QGraphicsSystemD0Ev @ 3361 NONAME
+ _ZN15QGraphicsSystemD1Ev @ 3362 NONAME
+ _ZN15QGraphicsSystemD2Ev @ 3363 NONAME
+ _ZN15QGraphicsWidget10addActionsE5QListIP7QActionE @ 3364 NONAME
+ _ZN15QGraphicsWidget10adjustSizeEv @ 3365 NONAME
+ _ZN15QGraphicsWidget10closeEventEP11QCloseEvent @ 3366 NONAME
+ _ZN15QGraphicsWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 3367 NONAME
+ _ZN15QGraphicsWidget10sceneEventEP6QEvent @ 3368 NONAME
+ _ZN15QGraphicsWidget10setPaletteERK8QPalette @ 3369 NONAME
+ _ZN15QGraphicsWidget11changeEventEP6QEvent @ 3370 NONAME
+ _ZN15QGraphicsWidget11polishEventEv @ 3371 NONAME
+ _ZN15QGraphicsWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3372 NONAME
+ _ZN15QGraphicsWidget11qt_metacastEPKc @ 3373 NONAME
+ _ZN15QGraphicsWidget11resizeEventEP25QGraphicsSceneResizeEvent @ 3374 NONAME
+ _ZN15QGraphicsWidget11setGeometryERK6QRectF @ 3375 NONAME
+ _ZN15QGraphicsWidget11setTabOrderEPS_S0_ @ 3376 NONAME
+ _ZN15QGraphicsWidget12focusInEventEP11QFocusEvent @ 3377 NONAME
+ _ZN15QGraphicsWidget12grabShortcutERK12QKeySequenceN2Qt15ShortcutContextE @ 3378 NONAME
+ _ZN15QGraphicsWidget12insertActionEP7QActionS1_ @ 3379 NONAME
+ _ZN15QGraphicsWidget12removeActionEP7QAction @ 3380 NONAME
+ _ZN15QGraphicsWidget12setAttributeEN2Qt15WidgetAttributeEb @ 3381 NONAME
+ _ZN15QGraphicsWidget13focusOutEventEP11QFocusEvent @ 3382 NONAME
+ _ZN15QGraphicsWidget13insertActionsEP7QAction5QListIS1_E @ 3383 NONAME
+ _ZN15QGraphicsWidget14grabMouseEventEP6QEvent @ 3384 NONAME
+ _ZN15QGraphicsWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 3385 NONAME
+ _ZN15QGraphicsWidget14propertyChangeERK7QStringRK8QVariant @ 3386 NONAME
+ _ZN15QGraphicsWidget14setFocusPolicyEN2Qt11FocusPolicyE @ 3387 NONAME
+ _ZN15QGraphicsWidget14setWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 3388 NONAME
+ _ZN15QGraphicsWidget14setWindowTitleERK7QString @ 3389 NONAME
+ _ZN15QGraphicsWidget14updateGeometryEv @ 3390 NONAME
+ _ZN15QGraphicsWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 3391 NONAME
+ _ZN15QGraphicsWidget15releaseShortcutEi @ 3392 NONAME
+ _ZN15QGraphicsWidget16paintWindowFrameEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3393 NONAME
+ _ZN15QGraphicsWidget16staticMetaObjectE @ 3394 NONAME DATA 16
+ _ZN15QGraphicsWidget16ungrabMouseEventEP6QEvent @ 3395 NONAME
+ _ZN15QGraphicsWidget16windowFrameEventEP6QEvent @ 3396 NONAME
+ _ZN15QGraphicsWidget17grabKeyboardEventEP6QEvent @ 3397 NONAME
+ _ZN15QGraphicsWidget18focusNextPrevChildEb @ 3398 NONAME
+ _ZN15QGraphicsWidget18setContentsMarginsEffff @ 3399 NONAME
+ _ZN15QGraphicsWidget18setLayoutDirectionEN2Qt15LayoutDirectionE @ 3400 NONAME
+ _ZN15QGraphicsWidget18setShortcutEnabledEib @ 3401 NONAME
+ _ZN15QGraphicsWidget19getStaticMetaObjectEv @ 3402 NONAME
+ _ZN15QGraphicsWidget19ungrabKeyboardEventEP6QEvent @ 3403 NONAME
+ _ZN15QGraphicsWidget20unsetLayoutDirectionEv @ 3404 NONAME
+ _ZN15QGraphicsWidget21setShortcutAutoRepeatEib @ 3405 NONAME
+ _ZN15QGraphicsWidget21setWindowFrameMarginsEffff @ 3406 NONAME
+ _ZN15QGraphicsWidget23unsetWindowFrameMarginsEv @ 3407 NONAME
+ _ZN15QGraphicsWidget5closeEv @ 3408 NONAME
+ _ZN15QGraphicsWidget5eventEP6QEvent @ 3409 NONAME
+ _ZN15QGraphicsWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3410 NONAME
+ _ZN15QGraphicsWidget6resizeERK6QSizeF @ 3411 NONAME
+ _ZN15QGraphicsWidget7setFontERK5QFont @ 3412 NONAME
+ _ZN15QGraphicsWidget8setStyleEP6QStyle @ 3413 NONAME
+ _ZN15QGraphicsWidget9addActionEP7QAction @ 3414 NONAME
+ _ZN15QGraphicsWidget9hideEventEP10QHideEvent @ 3415 NONAME
+ _ZN15QGraphicsWidget9moveEventEP23QGraphicsSceneMoveEvent @ 3416 NONAME
+ _ZN15QGraphicsWidget9setLayoutEP15QGraphicsLayout @ 3417 NONAME
+ _ZN15QGraphicsWidget9showEventEP10QShowEvent @ 3418 NONAME
+ _ZN15QGraphicsWidgetC1EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 3419 NONAME
+ _ZN15QGraphicsWidgetC1ER22QGraphicsWidgetPrivateP13QGraphicsItemP14QGraphicsScene6QFlagsIN2Qt10WindowTypeEE @ 3420 NONAME
+ _ZN15QGraphicsWidgetC2EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 3421 NONAME
+ _ZN15QGraphicsWidgetC2ER22QGraphicsWidgetPrivateP13QGraphicsItemP14QGraphicsScene6QFlagsIN2Qt10WindowTypeEE @ 3422 NONAME
+ _ZN15QGraphicsWidgetD0Ev @ 3423 NONAME
+ _ZN15QGraphicsWidgetD1Ev @ 3424 NONAME
+ _ZN15QGraphicsWidgetD2Ev @ 3425 NONAME
+ _ZN15QImageIOHandler11jumpToImageEi @ 3426 NONAME
+ _ZN15QImageIOHandler15jumpToNextImageEv @ 3427 NONAME
+ _ZN15QImageIOHandler5writeERK6QImage @ 3428 NONAME
+ _ZN15QImageIOHandler9setDeviceEP9QIODevice @ 3429 NONAME
+ _ZN15QImageIOHandler9setFormatERK10QByteArray @ 3430 NONAME
+ _ZN15QImageIOHandler9setOptionENS_11ImageOptionERK8QVariant @ 3431 NONAME
+ _ZN15QImageIOHandlerC2ER22QImageIOHandlerPrivate @ 3432 NONAME
+ _ZN15QImageIOHandlerC2Ev @ 3433 NONAME
+ _ZN15QImageIOHandlerD0Ev @ 3434 NONAME
+ _ZN15QImageIOHandlerD1Ev @ 3435 NONAME
+ _ZN15QImageIOHandlerD2Ev @ 3436 NONAME
+ _ZN15QLinearGradient12setFinalStopERK7QPointF @ 3437 NONAME
+ _ZN15QLinearGradient8setStartERK7QPointF @ 3438 NONAME
+ _ZN15QLinearGradientC1ERK7QPointFS2_ @ 3439 NONAME
+ _ZN15QLinearGradientC1Effff @ 3440 NONAME
+ _ZN15QLinearGradientC1Ev @ 3441 NONAME
+ _ZN15QLinearGradientC2ERK7QPointFS2_ @ 3442 NONAME
+ _ZN15QLinearGradientC2Effff @ 3443 NONAME
+ _ZN15QLinearGradientC2Ev @ 3444 NONAME
+ _ZN15QListWidgetItem4readER11QDataStream @ 3445 NONAME
+ _ZN15QListWidgetItem7setDataEiRK8QVariant @ 3446 NONAME
+ _ZN15QListWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3447 NONAME
+ _ZN15QListWidgetItemC1EP11QListWidgeti @ 3448 NONAME
+ _ZN15QListWidgetItemC1ERK5QIconRK7QStringP11QListWidgeti @ 3449 NONAME
+ _ZN15QListWidgetItemC1ERK7QStringP11QListWidgeti @ 3450 NONAME
+ _ZN15QListWidgetItemC1ERKS_ @ 3451 NONAME
+ _ZN15QListWidgetItemC2EP11QListWidgeti @ 3452 NONAME
+ _ZN15QListWidgetItemC2ERK5QIconRK7QStringP11QListWidgeti @ 3453 NONAME
+ _ZN15QListWidgetItemC2ERK7QStringP11QListWidgeti @ 3454 NONAME
+ _ZN15QListWidgetItemC2ERKS_ @ 3455 NONAME
+ _ZN15QListWidgetItemD0Ev @ 3456 NONAME
+ _ZN15QListWidgetItemD1Ev @ 3457 NONAME
+ _ZN15QListWidgetItemD2Ev @ 3458 NONAME
+ _ZN15QListWidgetItemaSERKS_ @ 3459 NONAME
+ _ZN15QProgressDialog10closeEventEP11QCloseEvent @ 3460 NONAME
+ _ZN15QProgressDialog10setMaximumEi @ 3461 NONAME
+ _ZN15QProgressDialog10setMinimumEi @ 3462 NONAME
+ _ZN15QProgressDialog11changeEventEP6QEvent @ 3463 NONAME
+ _ZN15QProgressDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 3464 NONAME
+ _ZN15QProgressDialog11qt_metacastEPKc @ 3465 NONAME
+ _ZN15QProgressDialog11resizeEventEP12QResizeEvent @ 3466 NONAME
+ _ZN15QProgressDialog12setAutoCloseEb @ 3467 NONAME
+ _ZN15QProgressDialog12setAutoResetEb @ 3468 NONAME
+ _ZN15QProgressDialog12setLabelTextERK7QString @ 3469 NONAME
+ _ZN15QProgressDialog15setCancelButtonEP11QPushButton @ 3470 NONAME
+ _ZN15QProgressDialog16staticMetaObjectE @ 3471 NONAME DATA 16
+ _ZN15QProgressDialog18setMinimumDurationEi @ 3472 NONAME
+ _ZN15QProgressDialog19getStaticMetaObjectEv @ 3473 NONAME
+ _ZN15QProgressDialog19setCancelButtonTextERK7QString @ 3474 NONAME
+ _ZN15QProgressDialog4openEP7QObjectPKc @ 3475 NONAME
+ _ZN15QProgressDialog5resetEv @ 3476 NONAME
+ _ZN15QProgressDialog6cancelEv @ 3477 NONAME
+ _ZN15QProgressDialog6setBarEP12QProgressBar @ 3478 NONAME
+ _ZN15QProgressDialog8canceledEv @ 3479 NONAME
+ _ZN15QProgressDialog8setLabelEP6QLabel @ 3480 NONAME
+ _ZN15QProgressDialog8setRangeEii @ 3481 NONAME
+ _ZN15QProgressDialog8setValueEi @ 3482 NONAME
+ _ZN15QProgressDialog9forceShowEv @ 3483 NONAME
+ _ZN15QProgressDialog9showEventEP10QShowEvent @ 3484 NONAME
+ _ZN15QProgressDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3485 NONAME
+ _ZN15QProgressDialogC1ERK7QStringS2_iiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3486 NONAME
+ _ZN15QProgressDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3487 NONAME
+ _ZN15QProgressDialogC2ERK7QStringS2_iiP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 3488 NONAME
+ _ZN15QProgressDialogD0Ev @ 3489 NONAME
+ _ZN15QProgressDialogD1Ev @ 3490 NONAME
+ _ZN15QProgressDialogD2Ev @ 3491 NONAME
+ _ZN15QRadialGradient13setFocalPointERK7QPointF @ 3492 NONAME
+ _ZN15QRadialGradient9setCenterERK7QPointF @ 3493 NONAME
+ _ZN15QRadialGradient9setRadiusEf @ 3494 NONAME
+ _ZN15QRadialGradientC1ERK7QPointFf @ 3495 NONAME
+ _ZN15QRadialGradientC1ERK7QPointFfS2_ @ 3496 NONAME
+ _ZN15QRadialGradientC1Efff @ 3497 NONAME
+ _ZN15QRadialGradientC1Efffff @ 3498 NONAME
+ _ZN15QRadialGradientC1Ev @ 3499 NONAME
+ _ZN15QRadialGradientC2ERK7QPointFf @ 3500 NONAME
+ _ZN15QRadialGradientC2ERK7QPointFfS2_ @ 3501 NONAME
+ _ZN15QRadialGradientC2Efff @ 3502 NONAME
+ _ZN15QRadialGradientC2Efffff @ 3503 NONAME
+ _ZN15QRadialGradientC2Ev @ 3504 NONAME
+ _ZN15QSessionManager11qt_metacallEN11QMetaObject4CallEiPPv @ 3505 NONAME
+ _ZN15QSessionManager11qt_metacastEPKc @ 3506 NONAME
+ _ZN15QSessionManager16staticMetaObjectE @ 3507 NONAME DATA 16
+ _ZN15QSessionManager17allowsInteractionEv @ 3508 NONAME
+ _ZN15QSessionManager19getStaticMetaObjectEv @ 3509 NONAME
+ _ZN15QSessionManager6cancelEv @ 3510 NONAME
+ _ZN15QSessionManagerC1EP12QApplicationR7QStringS3_ @ 3511 NONAME
+ _ZN15QSessionManagerC2EP12QApplicationR7QStringS3_ @ 3512 NONAME
+ _ZN15QSessionManagerD0Ev @ 3513 NONAME
+ _ZN15QSessionManagerD1Ev @ 3514 NONAME
+ _ZN15QSessionManagerD2Ev @ 3515 NONAME
+ _ZN15QSplitterHandle10paintEventEP11QPaintEvent @ 3516 NONAME
+ _ZN15QSplitterHandle11qt_metacallEN11QMetaObject4CallEiPPv @ 3517 NONAME
+ _ZN15QSplitterHandle11qt_metacastEPKc @ 3518 NONAME
+ _ZN15QSplitterHandle12moveSplitterEi @ 3519 NONAME
+ _ZN15QSplitterHandle14mouseMoveEventEP11QMouseEvent @ 3520 NONAME
+ _ZN15QSplitterHandle14setOrientationEN2Qt11OrientationE @ 3521 NONAME
+ _ZN15QSplitterHandle15mousePressEventEP11QMouseEvent @ 3522 NONAME
+ _ZN15QSplitterHandle16staticMetaObjectE @ 3523 NONAME DATA 16
+ _ZN15QSplitterHandle17mouseReleaseEventEP11QMouseEvent @ 3524 NONAME
+ _ZN15QSplitterHandle19getStaticMetaObjectEv @ 3525 NONAME
+ _ZN15QSplitterHandle20closestLegalPositionEi @ 3526 NONAME
+ _ZN15QSplitterHandle5eventEP6QEvent @ 3527 NONAME
+ _ZN15QSplitterHandleC1EN2Qt11OrientationEP9QSplitter @ 3528 NONAME
+ _ZN15QSplitterHandleC2EN2Qt11OrientationEP9QSplitter @ 3529 NONAME
+ _ZN15QStatusTipEventC1ERK7QString @ 3530 NONAME
+ _ZN15QStatusTipEventC2ERK7QString @ 3531 NONAME
+ _ZN15QStatusTipEventD0Ev @ 3532 NONAME
+ _ZN15QStatusTipEventD1Ev @ 3533 NONAME
+ _ZN15QStatusTipEventD2Ev @ 3534 NONAME
+ _ZN15QStyleOptionTabC1Ei @ 3535 NONAME
+ _ZN15QStyleOptionTabC1Ev @ 3536 NONAME
+ _ZN15QStyleOptionTabC2Ei @ 3537 NONAME
+ _ZN15QStyleOptionTabC2Ev @ 3538 NONAME
+ _ZN15QTextBlockGroup11qt_metacallEN11QMetaObject4CallEiPPv @ 3539 NONAME
+ _ZN15QTextBlockGroup11qt_metacastEPKc @ 3540 NONAME
+ _ZN15QTextBlockGroup12blockRemovedERK10QTextBlock @ 3541 NONAME
+ _ZN15QTextBlockGroup13blockInsertedERK10QTextBlock @ 3542 NONAME
+ _ZN15QTextBlockGroup16staticMetaObjectE @ 3543 NONAME DATA 16
+ _ZN15QTextBlockGroup18blockFormatChangedERK10QTextBlock @ 3544 NONAME
+ _ZN15QTextBlockGroup19getStaticMetaObjectEv @ 3545 NONAME
+ _ZN15QTextBlockGroupC1EP13QTextDocument @ 3546 NONAME
+ _ZN15QTextBlockGroupC1ER22QTextBlockGroupPrivateP13QTextDocument @ 3547 NONAME
+ _ZN15QTextBlockGroupC2EP13QTextDocument @ 3548 NONAME
+ _ZN15QTextBlockGroupC2ER22QTextBlockGroupPrivateP13QTextDocument @ 3549 NONAME
+ _ZN15QTextBlockGroupD0Ev @ 3550 NONAME
+ _ZN15QTextBlockGroupD1Ev @ 3551 NONAME
+ _ZN15QTextBlockGroupD2Ev @ 3552 NONAME
+ _ZN15QTextCharFormat17setUnderlineStyleENS_14UnderlineStyleE @ 3553 NONAME
+ _ZN15QTextCharFormat7setFontERK5QFont @ 3554 NONAME
+ _ZN15QTextCharFormatC1ERK11QTextFormat @ 3555 NONAME
+ _ZN15QTextCharFormatC1Ev @ 3556 NONAME
+ _ZN15QTextCharFormatC2ERK11QTextFormat @ 3557 NONAME
+ _ZN15QTextCharFormatC2Ev @ 3558 NONAME
+ _ZN15QTextListFormatC1ERK11QTextFormat @ 3559 NONAME
+ _ZN15QTextListFormatC1Ev @ 3560 NONAME
+ _ZN15QTextListFormatC2ERK11QTextFormat @ 3561 NONAME
+ _ZN15QTextListFormatC2Ev @ 3562 NONAME
+ _ZN15QTreeWidgetItem11addChildrenERK5QListIPS_E @ 3563 NONAME
+ _ZN15QTreeWidgetItem11insertChildEiPS_ @ 3564 NONAME
+ _ZN15QTreeWidgetItem11itemChangedEv @ 3565 NONAME
+ _ZN15QTreeWidgetItem11removeChildEPS_ @ 3566 NONAME
+ _ZN15QTreeWidgetItem12sortChildrenEiN2Qt9SortOrderEb @ 3567 NONAME
+ _ZN15QTreeWidgetItem12takeChildrenEv @ 3568 NONAME
+ _ZN15QTreeWidgetItem14insertChildrenEiRK5QListIPS_E @ 3569 NONAME
+ _ZN15QTreeWidgetItem15emitDataChangedEv @ 3570 NONAME
+ _ZN15QTreeWidgetItem23setChildIndicatorPolicyENS_20ChildIndicatorPolicyE @ 3571 NONAME
+ _ZN15QTreeWidgetItem4readER11QDataStream @ 3572 NONAME
+ _ZN15QTreeWidgetItem7setDataEiiRK8QVariant @ 3573 NONAME
+ _ZN15QTreeWidgetItem8addChildEPS_ @ 3574 NONAME
+ _ZN15QTreeWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3575 NONAME
+ _ZN15QTreeWidgetItem9takeChildEi @ 3576 NONAME
+ _ZN15QTreeWidgetItemC1EP11QTreeWidgetPS_i @ 3577 NONAME
+ _ZN15QTreeWidgetItemC1EP11QTreeWidgetRK11QStringListi @ 3578 NONAME
+ _ZN15QTreeWidgetItemC1EP11QTreeWidgeti @ 3579 NONAME
+ _ZN15QTreeWidgetItemC1EPS_RK11QStringListi @ 3580 NONAME
+ _ZN15QTreeWidgetItemC1EPS_S0_i @ 3581 NONAME
+ _ZN15QTreeWidgetItemC1EPS_i @ 3582 NONAME
+ _ZN15QTreeWidgetItemC1ERK11QStringListi @ 3583 NONAME
+ _ZN15QTreeWidgetItemC1ERKS_ @ 3584 NONAME
+ _ZN15QTreeWidgetItemC1Ei @ 3585 NONAME
+ _ZN15QTreeWidgetItemC2EP11QTreeWidgetPS_i @ 3586 NONAME
+ _ZN15QTreeWidgetItemC2EP11QTreeWidgetRK11QStringListi @ 3587 NONAME
+ _ZN15QTreeWidgetItemC2EP11QTreeWidgeti @ 3588 NONAME
+ _ZN15QTreeWidgetItemC2EPS_RK11QStringListi @ 3589 NONAME
+ _ZN15QTreeWidgetItemC2EPS_S0_i @ 3590 NONAME
+ _ZN15QTreeWidgetItemC2EPS_i @ 3591 NONAME
+ _ZN15QTreeWidgetItemC2ERK11QStringListi @ 3592 NONAME
+ _ZN15QTreeWidgetItemC2ERKS_ @ 3593 NONAME
+ _ZN15QTreeWidgetItemC2Ei @ 3594 NONAME
+ _ZN15QTreeWidgetItemD0Ev @ 3595 NONAME
+ _ZN15QTreeWidgetItemD1Ev @ 3596 NONAME
+ _ZN15QTreeWidgetItemD2Ev @ 3597 NONAME
+ _ZN15QTreeWidgetItemaSERKS_ @ 3598 NONAME
+ _ZN16QAbstractSpinBox10closeEventEP11QCloseEvent @ 3599 NONAME
+ _ZN16QAbstractSpinBox10paintEventEP11QPaintEvent @ 3600 NONAME
+ _ZN16QAbstractSpinBox10timerEventEP11QTimerEvent @ 3601 NONAME
+ _ZN16QAbstractSpinBox10wheelEventEP11QWheelEvent @ 3602 NONAME
+ _ZN16QAbstractSpinBox11changeEventEP6QEvent @ 3603 NONAME
+ _ZN16QAbstractSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 3604 NONAME
+ _ZN16QAbstractSpinBox11qt_metacastEPKc @ 3605 NONAME
+ _ZN16QAbstractSpinBox11resizeEventEP12QResizeEvent @ 3606 NONAME
+ _ZN16QAbstractSpinBox11setLineEditEP9QLineEdit @ 3607 NONAME
+ _ZN16QAbstractSpinBox11setReadOnlyEb @ 3608 NONAME
+ _ZN16QAbstractSpinBox11setWrappingEb @ 3609 NONAME
+ _ZN16QAbstractSpinBox12focusInEventEP11QFocusEvent @ 3610 NONAME
+ _ZN16QAbstractSpinBox12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 3611 NONAME
+ _ZN16QAbstractSpinBox13focusOutEventEP11QFocusEvent @ 3612 NONAME
+ _ZN16QAbstractSpinBox13interpretTextEv @ 3613 NONAME
+ _ZN16QAbstractSpinBox13keyPressEventEP9QKeyEvent @ 3614 NONAME
+ _ZN16QAbstractSpinBox14mouseMoveEventEP11QMouseEvent @ 3615 NONAME
+ _ZN16QAbstractSpinBox14setAcceleratedEb @ 3616 NONAME
+ _ZN16QAbstractSpinBox15editingFinishedEv @ 3617 NONAME
+ _ZN16QAbstractSpinBox15keyReleaseEventEP9QKeyEvent @ 3618 NONAME
+ _ZN16QAbstractSpinBox15mousePressEventEP11QMouseEvent @ 3619 NONAME
+ _ZN16QAbstractSpinBox16contextMenuEventEP17QContextMenuEvent @ 3620 NONAME
+ _ZN16QAbstractSpinBox16setButtonSymbolsENS_13ButtonSymbolsE @ 3621 NONAME
+ _ZN16QAbstractSpinBox16staticMetaObjectE @ 3622 NONAME DATA 16
+ _ZN16QAbstractSpinBox17mouseReleaseEventEP11QMouseEvent @ 3623 NONAME
+ _ZN16QAbstractSpinBox17setCorrectionModeENS_14CorrectionModeE @ 3624 NONAME
+ _ZN16QAbstractSpinBox19getStaticMetaObjectEv @ 3625 NONAME
+ _ZN16QAbstractSpinBox19setKeyboardTrackingEb @ 3626 NONAME
+ _ZN16QAbstractSpinBox19setSpecialValueTextERK7QString @ 3627 NONAME
+ _ZN16QAbstractSpinBox5clearEv @ 3628 NONAME
+ _ZN16QAbstractSpinBox5eventEP6QEvent @ 3629 NONAME
+ _ZN16QAbstractSpinBox6stepByEi @ 3630 NONAME
+ _ZN16QAbstractSpinBox6stepUpEv @ 3631 NONAME
+ _ZN16QAbstractSpinBox8setFrameEb @ 3632 NONAME
+ _ZN16QAbstractSpinBox8stepDownEv @ 3633 NONAME
+ _ZN16QAbstractSpinBox9hideEventEP10QHideEvent @ 3634 NONAME
+ _ZN16QAbstractSpinBox9selectAllEv @ 3635 NONAME
+ _ZN16QAbstractSpinBox9showEventEP10QShowEvent @ 3636 NONAME
+ _ZN16QAbstractSpinBoxC1EP7QWidget @ 3637 NONAME
+ _ZN16QAbstractSpinBoxC1ER23QAbstractSpinBoxPrivateP7QWidget @ 3638 NONAME
+ _ZN16QAbstractSpinBoxC2EP7QWidget @ 3639 NONAME
+ _ZN16QAbstractSpinBoxC2ER23QAbstractSpinBoxPrivateP7QWidget @ 3640 NONAME
+ _ZN16QAbstractSpinBoxD0Ev @ 3641 NONAME
+ _ZN16QAbstractSpinBoxD1Ev @ 3642 NONAME
+ _ZN16QAbstractSpinBoxD2Ev @ 3643 NONAME
+ _ZN16QConicalGradient8setAngleEf @ 3644 NONAME
+ _ZN16QConicalGradient9setCenterERK7QPointF @ 3645 NONAME
+ _ZN16QConicalGradientC1ERK7QPointFf @ 3646 NONAME
+ _ZN16QConicalGradientC1Efff @ 3647 NONAME
+ _ZN16QConicalGradientC1Ev @ 3648 NONAME
+ _ZN16QConicalGradientC2ERK7QPointFf @ 3649 NONAME
+ _ZN16QConicalGradientC2Efff @ 3650 NONAME
+ _ZN16QConicalGradientC2Ev @ 3651 NONAME
+ _ZN16QDesktopServices11displayNameENS_16StandardLocationE @ 3652 NONAME
+ _ZN16QDesktopServices13setUrlHandlerERK7QStringP7QObjectPKc @ 3653 NONAME
+ _ZN16QDesktopServices15storageLocationENS_16StandardLocationE @ 3654 NONAME
+ _ZN16QDesktopServices15unsetUrlHandlerERK7QString @ 3655 NONAME
+ _ZN16QDesktopServices7openUrlERK4QUrl @ 3656 NONAME
+ _ZN16QDialogButtonBox11changeEventEP6QEvent @ 3657 NONAME
+ _ZN16QDialogButtonBox11qt_metacallEN11QMetaObject4CallEiPPv @ 3658 NONAME
+ _ZN16QDialogButtonBox11qt_metacastEPKc @ 3659 NONAME
+ _ZN16QDialogButtonBox12removeButtonEP15QAbstractButton @ 3660 NONAME
+ _ZN16QDialogButtonBox13helpRequestedEv @ 3661 NONAME
+ _ZN16QDialogButtonBox14setOrientationEN2Qt11OrientationE @ 3662 NONAME
+ _ZN16QDialogButtonBox16setCenterButtonsEb @ 3663 NONAME
+ _ZN16QDialogButtonBox16staticMetaObjectE @ 3664 NONAME DATA 16
+ _ZN16QDialogButtonBox18setStandardButtonsE6QFlagsINS_14StandardButtonEE @ 3665 NONAME
+ _ZN16QDialogButtonBox19getStaticMetaObjectEv @ 3666 NONAME
+ _ZN16QDialogButtonBox5clearEv @ 3667 NONAME
+ _ZN16QDialogButtonBox5eventEP6QEvent @ 3668 NONAME
+ _ZN16QDialogButtonBox7clickedEP15QAbstractButton @ 3669 NONAME
+ _ZN16QDialogButtonBox8acceptedEv @ 3670 NONAME
+ _ZN16QDialogButtonBox8rejectedEv @ 3671 NONAME
+ _ZN16QDialogButtonBox9addButtonENS_14StandardButtonE @ 3672 NONAME
+ _ZN16QDialogButtonBox9addButtonEP15QAbstractButtonNS_10ButtonRoleE @ 3673 NONAME
+ _ZN16QDialogButtonBox9addButtonERK7QStringNS_10ButtonRoleE @ 3674 NONAME
+ _ZN16QDialogButtonBoxC1E6QFlagsINS_14StandardButtonEEN2Qt11OrientationEP7QWidget @ 3675 NONAME
+ _ZN16QDialogButtonBoxC1EN2Qt11OrientationEP7QWidget @ 3676 NONAME
+ _ZN16QDialogButtonBoxC1EP7QWidget @ 3677 NONAME
+ _ZN16QDialogButtonBoxC2E6QFlagsINS_14StandardButtonEEN2Qt11OrientationEP7QWidget @ 3678 NONAME
+ _ZN16QDialogButtonBoxC2EN2Qt11OrientationEP7QWidget @ 3679 NONAME
+ _ZN16QDialogButtonBoxC2EP7QWidget @ 3680 NONAME
+ _ZN16QDialogButtonBoxD0Ev @ 3681 NONAME
+ _ZN16QDialogButtonBoxD1Ev @ 3682 NONAME
+ _ZN16QDialogButtonBoxD2Ev @ 3683 NONAME
+ _ZN16QDoubleValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 3684 NONAME
+ _ZN16QDoubleValidator11qt_metacastEPKc @ 3685 NONAME
+ _ZN16QDoubleValidator11setDecimalsEi @ 3686 NONAME
+ _ZN16QDoubleValidator11setNotationENS_8NotationE @ 3687 NONAME
+ _ZN16QDoubleValidator16staticMetaObjectE @ 3688 NONAME DATA 16
+ _ZN16QDoubleValidator19getStaticMetaObjectEv @ 3689 NONAME
+ _ZN16QDoubleValidator6setTopEd @ 3690 NONAME
+ _ZN16QDoubleValidator8setRangeEddi @ 3691 NONAME
+ _ZN16QDoubleValidator9setBottomEd @ 3692 NONAME
+ _ZN16QDoubleValidatorC1EP7QObject @ 3693 NONAME
+ _ZN16QDoubleValidatorC1EddiP7QObject @ 3694 NONAME
+ _ZN16QDoubleValidatorC2EP7QObject @ 3695 NONAME
+ _ZN16QDoubleValidatorC2EddiP7QObject @ 3696 NONAME
+ _ZN16QDoubleValidatorD0Ev @ 3697 NONAME
+ _ZN16QDoubleValidatorD1Ev @ 3698 NONAME
+ _ZN16QDoubleValidatorD2Ev @ 3699 NONAME
+ _ZN16QFileSystemModel10timerEventEP11QTimerEvent @ 3700 NONAME
+ _ZN16QFileSystemModel11fileRenamedERK7QStringS2_S2_ @ 3701 NONAME
+ _ZN16QFileSystemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 3702 NONAME
+ _ZN16QFileSystemModel11qt_metacastEPKc @ 3703 NONAME
+ _ZN16QFileSystemModel11setReadOnlyEb @ 3704 NONAME
+ _ZN16QFileSystemModel11setRootPathERK7QString @ 3705 NONAME
+ _ZN16QFileSystemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 3706 NONAME
+ _ZN16QFileSystemModel14setNameFiltersERK11QStringList @ 3707 NONAME
+ _ZN16QFileSystemModel15rootPathChangedERK7QString @ 3708 NONAME
+ _ZN16QFileSystemModel15setIconProviderEP17QFileIconProvider @ 3709 NONAME
+ _ZN16QFileSystemModel16staticMetaObjectE @ 3710 NONAME DATA 16
+ _ZN16QFileSystemModel18setResolveSymlinksEb @ 3711 NONAME
+ _ZN16QFileSystemModel19getStaticMetaObjectEv @ 3712 NONAME
+ _ZN16QFileSystemModel21setNameFilterDisablesEb @ 3713 NONAME
+ _ZN16QFileSystemModel4sortEiN2Qt9SortOrderE @ 3714 NONAME
+ _ZN16QFileSystemModel5eventEP6QEvent @ 3715 NONAME
+ _ZN16QFileSystemModel5mkdirERK11QModelIndexRK7QString @ 3716 NONAME
+ _ZN16QFileSystemModel7setDataERK11QModelIndexRK8QVarianti @ 3717 NONAME
+ _ZN16QFileSystemModel9fetchMoreERK11QModelIndex @ 3718 NONAME
+ _ZN16QFileSystemModel9setFilterE6QFlagsIN4QDir6FilterEE @ 3719 NONAME
+ _ZN16QFileSystemModelC1EP7QObject @ 3720 NONAME
+ _ZN16QFileSystemModelC1ER23QFileSystemModelPrivateP7QObject @ 3721 NONAME
+ _ZN16QFileSystemModelC2EP7QObject @ 3722 NONAME
+ _ZN16QFileSystemModelC2ER23QFileSystemModelPrivateP7QObject @ 3723 NONAME
+ _ZN16QFileSystemModelD0Ev @ 3724 NONAME
+ _ZN16QFileSystemModelD1Ev @ 3725 NONAME
+ _ZN16QFileSystemModelD2Ev @ 3726 NONAME
+ _ZN16QPainterReplayer14setupTransformEP8QPainter @ 3727 NONAME
+ _ZN16QPainterReplayer4drawERK12QPaintBufferP8QPainteri @ 3728 NONAME
+ _ZN16QPainterReplayer7processERK19QPaintBufferCommand @ 3729 NONAME
+ _ZN16QRegExpValidator11qt_metacallEN11QMetaObject4CallEiPPv @ 3730 NONAME
+ _ZN16QRegExpValidator11qt_metacastEPKc @ 3731 NONAME
+ _ZN16QRegExpValidator16staticMetaObjectE @ 3732 NONAME DATA 16
+ _ZN16QRegExpValidator19getStaticMetaObjectEv @ 3733 NONAME
+ _ZN16QRegExpValidator9setRegExpERK7QRegExp @ 3734 NONAME
+ _ZN16QRegExpValidatorC1EP7QObject @ 3735 NONAME
+ _ZN16QRegExpValidatorC1ERK7QRegExpP7QObject @ 3736 NONAME
+ _ZN16QRegExpValidatorC2EP7QObject @ 3737 NONAME
+ _ZN16QRegExpValidatorC2ERK7QRegExpP7QObject @ 3738 NONAME
+ _ZN16QRegExpValidatorD0Ev @ 3739 NONAME
+ _ZN16QRegExpValidatorD1Ev @ 3740 NONAME
+ _ZN16QRegExpValidatorD2Ev @ 3741 NONAME
+ _ZN16QS60MainDocument12CreateAppUiLEv @ 3742 NONAME
+ _ZN16QS60MainDocumentC1ER15CEikApplication @ 3743 NONAME
+ _ZN16QS60MainDocumentC2ER15CEikApplication @ 3744 NONAME
+ _ZN16QS60MainDocumentD0Ev @ 3745 NONAME
+ _ZN16QS60MainDocumentD1Ev @ 3746 NONAME
+ _ZN16QS60MainDocumentD2Ev @ 3747 NONAME
+ _ZN16QStringListModel10insertRowsEiiRK11QModelIndex @ 3748 NONAME
+ _ZN16QStringListModel10removeRowsEiiRK11QModelIndex @ 3749 NONAME
+ _ZN16QStringListModel11qt_metacallEN11QMetaObject4CallEiPPv @ 3750 NONAME
+ _ZN16QStringListModel11qt_metacastEPKc @ 3751 NONAME
+ _ZN16QStringListModel13setStringListERK11QStringList @ 3752 NONAME
+ _ZN16QStringListModel16staticMetaObjectE @ 3753 NONAME DATA 16
+ _ZN16QStringListModel19getStaticMetaObjectEv @ 3754 NONAME
+ _ZN16QStringListModel4sortEiN2Qt9SortOrderE @ 3755 NONAME
+ _ZN16QStringListModel7setDataERK11QModelIndexRK8QVarianti @ 3756 NONAME
+ _ZN16QStringListModelC1EP7QObject @ 3757 NONAME
+ _ZN16QStringListModelC1ERK11QStringListP7QObject @ 3758 NONAME
+ _ZN16QStringListModelC2EP7QObject @ 3759 NONAME
+ _ZN16QStringListModelC2ERK11QStringListP7QObject @ 3760 NONAME
+ _ZN16QStyleHintReturnC1Eii @ 3761 NONAME
+ _ZN16QStyleHintReturnC2Eii @ 3762 NONAME
+ _ZN16QStyleHintReturnD1Ev @ 3763 NONAME
+ _ZN16QStyleHintReturnD2Ev @ 3764 NONAME
+ _ZN16QTableWidgetItem4readER11QDataStream @ 3765 NONAME
+ _ZN16QTableWidgetItem7setDataEiRK8QVariant @ 3766 NONAME
+ _ZN16QTableWidgetItem8setFlagsE6QFlagsIN2Qt8ItemFlagEE @ 3767 NONAME
+ _ZN16QTableWidgetItemC1ERK5QIconRK7QStringi @ 3768 NONAME
+ _ZN16QTableWidgetItemC1ERK7QStringi @ 3769 NONAME
+ _ZN16QTableWidgetItemC1ERKS_ @ 3770 NONAME
+ _ZN16QTableWidgetItemC1Ei @ 3771 NONAME
+ _ZN16QTableWidgetItemC2ERK5QIconRK7QStringi @ 3772 NONAME
+ _ZN16QTableWidgetItemC2ERK7QStringi @ 3773 NONAME
+ _ZN16QTableWidgetItemC2ERKS_ @ 3774 NONAME
+ _ZN16QTableWidgetItemC2Ei @ 3775 NONAME
+ _ZN16QTableWidgetItemD0Ev @ 3776 NONAME
+ _ZN16QTableWidgetItemD1Ev @ 3777 NONAME
+ _ZN16QTableWidgetItemD2Ev @ 3778 NONAME
+ _ZN16QTableWidgetItemaSERKS_ @ 3779 NONAME
+ _ZN16QTextBlockFormat15setTabPositionsERK5QListIN11QTextOption3TabEE @ 3780 NONAME
+ _ZN16QTextBlockFormatC1ERK11QTextFormat @ 3781 NONAME
+ _ZN16QTextBlockFormatC1Ev @ 3782 NONAME
+ _ZN16QTextBlockFormatC2ERK11QTextFormat @ 3783 NONAME
+ _ZN16QTextBlockFormatC2Ev @ 3784 NONAME
+ _ZN16QTextFrameFormat9setMarginEf @ 3785 NONAME
+ _ZN16QTextFrameFormatC1ERK11QTextFormat @ 3786 NONAME
+ _ZN16QTextFrameFormatC1Ev @ 3787 NONAME
+ _ZN16QTextFrameFormatC2ERK11QTextFormat @ 3788 NONAME
+ _ZN16QTextFrameFormatC2Ev @ 3789 NONAME
+ _ZN16QTextImageFormatC1ERK11QTextFormat @ 3790 NONAME
+ _ZN16QTextImageFormatC1Ev @ 3791 NONAME
+ _ZN16QTextImageFormatC2ERK11QTextFormat @ 3792 NONAME
+ _ZN16QTextImageFormatC2Ev @ 3793 NONAME
+ _ZN16QTextTableFormatC1ERK11QTextFormat @ 3794 NONAME
+ _ZN16QTextTableFormatC1Ev @ 3795 NONAME
+ _ZN16QTextTableFormatC2ERK11QTextFormat @ 3796 NONAME
+ _ZN16QTextTableFormatC2Ev @ 3797 NONAME
+ _ZN17QAbstractItemView10commitDataEP7QWidget @ 3798 NONAME
+ _ZN17QAbstractItemView10timerEventEP11QTimerEvent @ 3799 NONAME
+ _ZN17QAbstractItemView11closeEditorEP7QWidgetN21QAbstractItemDelegate11EndEditHintE @ 3800 NONAME
+ _ZN17QAbstractItemView11dataChangedERK11QModelIndexS2_ @ 3801 NONAME
+ _ZN17QAbstractItemView11qt_metacallEN11QMetaObject4CallEiPPv @ 3802 NONAME
+ _ZN17QAbstractItemView11qt_metacastEPKc @ 3803 NONAME
+ _ZN17QAbstractItemView11resizeEventEP12QResizeEvent @ 3804 NONAME
+ _ZN17QAbstractItemView11scrollToTopEv @ 3805 NONAME
+ _ZN17QAbstractItemView11setIconSizeERK5QSize @ 3806 NONAME
+ _ZN17QAbstractItemView12doAutoScrollEv @ 3807 NONAME
+ _ZN17QAbstractItemView12focusInEventEP11QFocusEvent @ 3808 NONAME
+ _ZN17QAbstractItemView12rowsInsertedERK11QModelIndexii @ 3809 NONAME
+ _ZN17QAbstractItemView12setRootIndexERK11QModelIndex @ 3810 NONAME
+ _ZN17QAbstractItemView13doItemsLayoutEv @ 3811 NONAME
+ _ZN17QAbstractItemView13doubleClickedERK11QModelIndex @ 3812 NONAME
+ _ZN17QAbstractItemView13dragMoveEventEP14QDragMoveEvent @ 3813 NONAME
+ _ZN17QAbstractItemView13focusOutEventEP11QFocusEvent @ 3814 NONAME
+ _ZN17QAbstractItemView13keyPressEventEP9QKeyEvent @ 3815 NONAME
+ _ZN17QAbstractItemView13setAutoScrollEb @ 3816 NONAME
+ _ZN17QAbstractItemView13viewportEventEP6QEvent @ 3817 NONAME
+ _ZN17QAbstractItemView14clearSelectionEv @ 3818 NONAME
+ _ZN17QAbstractItemView14currentChangedERK11QModelIndexS2_ @ 3819 NONAME
+ _ZN17QAbstractItemView14dragEnterEventEP15QDragEnterEvent @ 3820 NONAME
+ _ZN17QAbstractItemView14dragLeaveEventEP15QDragLeaveEvent @ 3821 NONAME
+ _ZN17QAbstractItemView14keyboardSearchERK7QString @ 3822 NONAME
+ _ZN17QAbstractItemView14mouseMoveEventEP11QMouseEvent @ 3823 NONAME
+ _ZN17QAbstractItemView14scrollToBottomEv @ 3824 NONAME
+ _ZN17QAbstractItemView14setDirtyRegionERK7QRegion @ 3825 NONAME
+ _ZN17QAbstractItemView14setDragEnabledEb @ 3826 NONAME
+ _ZN17QAbstractItemView14setIndexWidgetERK11QModelIndexP7QWidget @ 3827 NONAME
+ _ZN17QAbstractItemView14stopAutoScrollEv @ 3828 NONAME
+ _ZN17QAbstractItemView15editorDestroyedEP7QObject @ 3829 NONAME
+ _ZN17QAbstractItemView15mousePressEventEP11QMouseEvent @ 3830 NONAME
+ _ZN17QAbstractItemView15setCurrentIndexERK11QModelIndex @ 3831 NONAME
+ _ZN17QAbstractItemView15setDragDropModeENS_12DragDropModeE @ 3832 NONAME
+ _ZN17QAbstractItemView15setEditTriggersE6QFlagsINS_11EditTriggerEE @ 3833 NONAME
+ _ZN17QAbstractItemView15setItemDelegateEP21QAbstractItemDelegate @ 3834 NONAME
+ _ZN17QAbstractItemView15startAutoScrollEv @ 3835 NONAME
+ _ZN17QAbstractItemView15viewportEnteredEv @ 3836 NONAME
+ _ZN17QAbstractItemView16inputMethodEventEP17QInputMethodEvent @ 3837 NONAME
+ _ZN17QAbstractItemView16selectionChangedERK14QItemSelectionS2_ @ 3838 NONAME
+ _ZN17QAbstractItemView16setSelectionModeENS_13SelectionModeE @ 3839 NONAME
+ _ZN17QAbstractItemView16setTextElideModeEN2Qt13TextElideModeE @ 3840 NONAME
+ _ZN17QAbstractItemView16staticMetaObjectE @ 3841 NONAME DATA 16
+ _ZN17QAbstractItemView16updateEditorDataEv @ 3842 NONAME
+ _ZN17QAbstractItemView16updateGeometriesEv @ 3843 NONAME
+ _ZN17QAbstractItemView17mouseReleaseEventEP11QMouseEvent @ 3844 NONAME
+ _ZN17QAbstractItemView17scrollDirtyRegionEii @ 3845 NONAME
+ _ZN17QAbstractItemView17setSelectionModelEP19QItemSelectionModel @ 3846 NONAME
+ _ZN17QAbstractItemView18focusNextPrevChildEb @ 3847 NONAME
+ _ZN17QAbstractItemView19getStaticMetaObjectEv @ 3848 NONAME
+ _ZN17QAbstractItemView19setAutoScrollMarginEi @ 3849 NONAME
+ _ZN17QAbstractItemView19setTabKeyNavigationEb @ 3850 NONAME
+ _ZN17QAbstractItemView20openPersistentEditorERK11QModelIndex @ 3851 NONAME
+ _ZN17QAbstractItemView20rowsAboutToBeRemovedERK11QModelIndexii @ 3852 NONAME
+ _ZN17QAbstractItemView20setDefaultDropActionEN2Qt10DropActionE @ 3853 NONAME
+ _ZN17QAbstractItemView20setSelectionBehaviorENS_17SelectionBehaviorE @ 3854 NONAME
+ _ZN17QAbstractItemView21closePersistentEditorERK11QModelIndex @ 3855 NONAME
+ _ZN17QAbstractItemView21mouseDoubleClickEventEP11QMouseEvent @ 3856 NONAME
+ _ZN17QAbstractItemView21setDropIndicatorShownEb @ 3857 NONAME
+ _ZN17QAbstractItemView21setItemDelegateForRowEiP21QAbstractItemDelegate @ 3858 NONAME
+ _ZN17QAbstractItemView21setVerticalScrollModeENS_10ScrollModeE @ 3859 NONAME
+ _ZN17QAbstractItemView22updateEditorGeometriesEv @ 3860 NONAME
+ _ZN17QAbstractItemView23setAlternatingRowColorsEb @ 3861 NONAME
+ _ZN17QAbstractItemView23setHorizontalScrollModeENS_10ScrollModeE @ 3862 NONAME
+ _ZN17QAbstractItemView23setVerticalStepsPerItemEi @ 3863 NONAME
+ _ZN17QAbstractItemView23verticalScrollbarActionEi @ 3864 NONAME
+ _ZN17QAbstractItemView24setDragDropOverwriteModeEb @ 3865 NONAME
+ _ZN17QAbstractItemView24setItemDelegateForColumnEiP21QAbstractItemDelegate @ 3866 NONAME
+ _ZN17QAbstractItemView25executeDelayedItemsLayoutEv @ 3867 NONAME
+ _ZN17QAbstractItemView25horizontalScrollbarActionEi @ 3868 NONAME
+ _ZN17QAbstractItemView25setHorizontalStepsPerItemEi @ 3869 NONAME
+ _ZN17QAbstractItemView26scheduleDelayedItemsLayoutEv @ 3870 NONAME
+ _ZN17QAbstractItemView29verticalScrollbarValueChangedEi @ 3871 NONAME
+ _ZN17QAbstractItemView31horizontalScrollbarValueChangedEi @ 3872 NONAME
+ _ZN17QAbstractItemView4editERK11QModelIndex @ 3873 NONAME
+ _ZN17QAbstractItemView4editERK11QModelIndexNS_11EditTriggerEP6QEvent @ 3874 NONAME
+ _ZN17QAbstractItemView5eventEP6QEvent @ 3875 NONAME
+ _ZN17QAbstractItemView5resetEv @ 3876 NONAME
+ _ZN17QAbstractItemView6updateERK11QModelIndex @ 3877 NONAME
+ _ZN17QAbstractItemView7clickedERK11QModelIndex @ 3878 NONAME
+ _ZN17QAbstractItemView7enteredERK11QModelIndex @ 3879 NONAME
+ _ZN17QAbstractItemView7pressedERK11QModelIndex @ 3880 NONAME
+ _ZN17QAbstractItemView8setModelEP18QAbstractItemModel @ 3881 NONAME
+ _ZN17QAbstractItemView8setStateENS_5StateE @ 3882 NONAME
+ _ZN17QAbstractItemView9activatedERK11QModelIndex @ 3883 NONAME
+ _ZN17QAbstractItemView9dropEventEP10QDropEvent @ 3884 NONAME
+ _ZN17QAbstractItemView9selectAllEv @ 3885 NONAME
+ _ZN17QAbstractItemView9startDragE6QFlagsIN2Qt10DropActionEE @ 3886 NONAME
+ _ZN17QAbstractItemViewC2EP7QWidget @ 3887 NONAME
+ _ZN17QAbstractItemViewC2ER24QAbstractItemViewPrivateP7QWidget @ 3888 NONAME
+ _ZN17QAbstractItemViewD0Ev @ 3889 NONAME
+ _ZN17QAbstractItemViewD1Ev @ 3890 NONAME
+ _ZN17QAbstractItemViewD2Ev @ 3891 NONAME
+ _ZN17QContextMenuEventC1ENS_6ReasonERK6QPoint @ 3892 NONAME
+ _ZN17QContextMenuEventC1ENS_6ReasonERK6QPointS3_ @ 3893 NONAME
+ _ZN17QContextMenuEventC1ENS_6ReasonERK6QPointS3_6QFlagsIN2Qt16KeyboardModifierEE @ 3894 NONAME
+ _ZN17QContextMenuEventC2ENS_6ReasonERK6QPoint @ 3895 NONAME
+ _ZN17QContextMenuEventC2ENS_6ReasonERK6QPointS3_ @ 3896 NONAME
+ _ZN17QContextMenuEventC2ENS_6ReasonERK6QPointS3_6QFlagsIN2Qt16KeyboardModifierEE @ 3897 NONAME
+ _ZN17QContextMenuEventD0Ev @ 3898 NONAME
+ _ZN17QContextMenuEventD1Ev @ 3899 NONAME
+ _ZN17QContextMenuEventD2Ev @ 3900 NONAME
+ _ZN17QDataWidgetMapper10addMappingEP7QWidgeti @ 3901 NONAME
+ _ZN17QDataWidgetMapper10addMappingEP7QWidgetiRK10QByteArray @ 3902 NONAME
+ _ZN17QDataWidgetMapper10toPreviousEv @ 3903 NONAME
+ _ZN17QDataWidgetMapper11qt_metacallEN11QMetaObject4CallEiPPv @ 3904 NONAME
+ _ZN17QDataWidgetMapper11qt_metacastEPKc @ 3905 NONAME
+ _ZN17QDataWidgetMapper12clearMappingEv @ 3906 NONAME
+ _ZN17QDataWidgetMapper12setRootIndexERK11QModelIndex @ 3907 NONAME
+ _ZN17QDataWidgetMapper13removeMappingEP7QWidget @ 3908 NONAME
+ _ZN17QDataWidgetMapper14setOrientationEN2Qt11OrientationE @ 3909 NONAME
+ _ZN17QDataWidgetMapper15setCurrentIndexEi @ 3910 NONAME
+ _ZN17QDataWidgetMapper15setItemDelegateEP21QAbstractItemDelegate @ 3911 NONAME
+ _ZN17QDataWidgetMapper15setSubmitPolicyENS_12SubmitPolicyE @ 3912 NONAME
+ _ZN17QDataWidgetMapper16staticMetaObjectE @ 3913 NONAME DATA 16
+ _ZN17QDataWidgetMapper19currentIndexChangedEi @ 3914 NONAME
+ _ZN17QDataWidgetMapper19getStaticMetaObjectEv @ 3915 NONAME
+ _ZN17QDataWidgetMapper20setCurrentModelIndexERK11QModelIndex @ 3916 NONAME
+ _ZN17QDataWidgetMapper6revertEv @ 3917 NONAME
+ _ZN17QDataWidgetMapper6submitEv @ 3918 NONAME
+ _ZN17QDataWidgetMapper6toLastEv @ 3919 NONAME
+ _ZN17QDataWidgetMapper6toNextEv @ 3920 NONAME
+ _ZN17QDataWidgetMapper7toFirstEv @ 3921 NONAME
+ _ZN17QDataWidgetMapper8setModelEP18QAbstractItemModel @ 3922 NONAME
+ _ZN17QDataWidgetMapperC1EP7QObject @ 3923 NONAME
+ _ZN17QDataWidgetMapperC2EP7QObject @ 3924 NONAME
+ _ZN17QDataWidgetMapperD0Ev @ 3925 NONAME
+ _ZN17QDataWidgetMapperD1Ev @ 3926 NONAME
+ _ZN17QDataWidgetMapperD2Ev @ 3927 NONAME
+ _ZN17QDockWidgetLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 3928 NONAME
+ _ZN17QDockWidgetLayout11qt_metacastEPKc @ 3929 NONAME
+ _ZN17QDockWidgetLayout11setGeometryERK5QRect @ 3930 NONAME
+ _ZN17QDockWidgetLayout16setWidgetForRoleENS_4RoleEP7QWidget @ 3931 NONAME
+ _ZN17QDockWidgetLayout16staticMetaObjectE @ 3932 NONAME DATA 16
+ _ZN17QDockWidgetLayout19getStaticMetaObjectEv @ 3933 NONAME
+ _ZN17QDockWidgetLayout19setVerticalTitleBarEb @ 3934 NONAME
+ _ZN17QDockWidgetLayout6takeAtEi @ 3935 NONAME
+ _ZN17QDockWidgetLayout7addItemEP11QLayoutItem @ 3936 NONAME
+ _ZN17QDockWidgetLayoutC1EP7QWidget @ 3937 NONAME
+ _ZN17QDockWidgetLayoutC2EP7QWidget @ 3938 NONAME
+ _ZN17QDockWidgetLayoutD0Ev @ 3939 NONAME
+ _ZN17QDockWidgetLayoutD1Ev @ 3940 NONAME
+ _ZN17QDockWidgetLayoutD2Ev @ 3941 NONAME
+ _ZN17QFileIconProviderC1Ev @ 3942 NONAME
+ _ZN17QFileIconProviderC2Ev @ 3943 NONAME
+ _ZN17QFileIconProviderD0Ev @ 3944 NONAME
+ _ZN17QFileIconProviderD1Ev @ 3945 NONAME
+ _ZN17QFileIconProviderD2Ev @ 3946 NONAME
+ _ZN17QGraphicsLineItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3947 NONAME
+ _ZN17QGraphicsLineItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3948 NONAME
+ _ZN17QGraphicsLineItem6setPenERK4QPen @ 3949 NONAME
+ _ZN17QGraphicsLineItem7setLineERK6QLineF @ 3950 NONAME
+ _ZN17QGraphicsLineItemC1EP13QGraphicsItemP14QGraphicsScene @ 3951 NONAME
+ _ZN17QGraphicsLineItemC1ERK6QLineFP13QGraphicsItemP14QGraphicsScene @ 3952 NONAME
+ _ZN17QGraphicsLineItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 3953 NONAME
+ _ZN17QGraphicsLineItemC2EP13QGraphicsItemP14QGraphicsScene @ 3954 NONAME
+ _ZN17QGraphicsLineItemC2ERK6QLineFP13QGraphicsItemP14QGraphicsScene @ 3955 NONAME
+ _ZN17QGraphicsLineItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 3956 NONAME
+ _ZN17QGraphicsLineItemD0Ev @ 3957 NONAME
+ _ZN17QGraphicsLineItemD1Ev @ 3958 NONAME
+ _ZN17QGraphicsLineItemD2Ev @ 3959 NONAME
+ _ZN17QGraphicsPathItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3960 NONAME
+ _ZN17QGraphicsPathItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3961 NONAME
+ _ZN17QGraphicsPathItem7setPathERK12QPainterPath @ 3962 NONAME
+ _ZN17QGraphicsPathItemC1EP13QGraphicsItemP14QGraphicsScene @ 3963 NONAME
+ _ZN17QGraphicsPathItemC1ERK12QPainterPathP13QGraphicsItemP14QGraphicsScene @ 3964 NONAME
+ _ZN17QGraphicsPathItemC2EP13QGraphicsItemP14QGraphicsScene @ 3965 NONAME
+ _ZN17QGraphicsPathItemC2ERK12QPainterPathP13QGraphicsItemP14QGraphicsScene @ 3966 NONAME
+ _ZN17QGraphicsPathItemD0Ev @ 3967 NONAME
+ _ZN17QGraphicsPathItemD1Ev @ 3968 NONAME
+ _ZN17QGraphicsPathItemD2Ev @ 3969 NONAME
+ _ZN17QGraphicsRectItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 3970 NONAME
+ _ZN17QGraphicsRectItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 3971 NONAME
+ _ZN17QGraphicsRectItem7setRectERK6QRectF @ 3972 NONAME
+ _ZN17QGraphicsRectItemC1EP13QGraphicsItemP14QGraphicsScene @ 3973 NONAME
+ _ZN17QGraphicsRectItemC1ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 3974 NONAME
+ _ZN17QGraphicsRectItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 3975 NONAME
+ _ZN17QGraphicsRectItemC2EP13QGraphicsItemP14QGraphicsScene @ 3976 NONAME
+ _ZN17QGraphicsRectItemC2ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 3977 NONAME
+ _ZN17QGraphicsRectItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 3978 NONAME
+ _ZN17QGraphicsRectItemD0Ev @ 3979 NONAME
+ _ZN17QGraphicsRectItemD1Ev @ 3980 NONAME
+ _ZN17QGraphicsRectItemD2Ev @ 3981 NONAME
+ _ZN17QGraphicsRotation11axisChangedEv @ 3982 NONAME
+ _ZN17QGraphicsRotation11qt_metacallEN11QMetaObject4CallEiPPv @ 3983 NONAME
+ _ZN17QGraphicsRotation11qt_metacastEPKc @ 3984 NONAME
+ _ZN17QGraphicsRotation12angleChangedEv @ 3985 NONAME
+ _ZN17QGraphicsRotation13originChangedEv @ 3986 NONAME
+ _ZN17QGraphicsRotation16staticMetaObjectE @ 3987 NONAME DATA 16
+ _ZN17QGraphicsRotation19getStaticMetaObjectEv @ 3988 NONAME
+ _ZN17QGraphicsRotation7setAxisEN2Qt4AxisE @ 3989 NONAME
+ _ZN17QGraphicsRotation7setAxisERK9QVector3D @ 3990 NONAME
+ _ZN17QGraphicsRotation8setAngleEf @ 3991 NONAME
+ _ZN17QGraphicsRotation9setOriginERK9QVector3D @ 3992 NONAME
+ _ZN17QGraphicsRotationC1EP7QObject @ 3993 NONAME
+ _ZN17QGraphicsRotationC2EP7QObject @ 3994 NONAME
+ _ZN17QGraphicsRotationD0Ev @ 3995 NONAME
+ _ZN17QGraphicsRotationD1Ev @ 3996 NONAME
+ _ZN17QGraphicsRotationD2Ev @ 3997 NONAME
+ _ZN17QGraphicsTextItem10adjustSizeEv @ 3998 NONAME
+ _ZN17QGraphicsTextItem10sceneEventEP6QEvent @ 3999 NONAME
+ _ZN17QGraphicsTextItem11linkHoveredERK7QString @ 4000 NONAME
+ _ZN17QGraphicsTextItem11qt_metacallEN11QMetaObject4CallEiPPv @ 4001 NONAME
+ _ZN17QGraphicsTextItem11qt_metacastEPKc @ 4002 NONAME
+ _ZN17QGraphicsTextItem11setDocumentEP13QTextDocument @ 4003 NONAME
+ _ZN17QGraphicsTextItem12focusInEventEP11QFocusEvent @ 4004 NONAME
+ _ZN17QGraphicsTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4005 NONAME
+ _ZN17QGraphicsTextItem12setPlainTextERK7QString @ 4006 NONAME
+ _ZN17QGraphicsTextItem12setTextWidthEf @ 4007 NONAME
+ _ZN17QGraphicsTextItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 4008 NONAME
+ _ZN17QGraphicsTextItem13focusOutEventEP11QFocusEvent @ 4009 NONAME
+ _ZN17QGraphicsTextItem13keyPressEventEP9QKeyEvent @ 4010 NONAME
+ _ZN17QGraphicsTextItem13linkActivatedERK7QString @ 4011 NONAME
+ _ZN17QGraphicsTextItem13setTextCursorERK11QTextCursor @ 4012 NONAME
+ _ZN17QGraphicsTextItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 4013 NONAME
+ _ZN17QGraphicsTextItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 4014 NONAME
+ _ZN17QGraphicsTextItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 4015 NONAME
+ _ZN17QGraphicsTextItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 4016 NONAME
+ _ZN17QGraphicsTextItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 4017 NONAME
+ _ZN17QGraphicsTextItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 4018 NONAME
+ _ZN17QGraphicsTextItem15keyReleaseEventEP9QKeyEvent @ 4019 NONAME
+ _ZN17QGraphicsTextItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 4020 NONAME
+ _ZN17QGraphicsTextItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 4021 NONAME
+ _ZN17QGraphicsTextItem16inputMethodEventEP17QInputMethodEvent @ 4022 NONAME
+ _ZN17QGraphicsTextItem16staticMetaObjectE @ 4023 NONAME DATA 16
+ _ZN17QGraphicsTextItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 4024 NONAME
+ _ZN17QGraphicsTextItem18setTabChangesFocusEb @ 4025 NONAME
+ _ZN17QGraphicsTextItem19getStaticMetaObjectEv @ 4026 NONAME
+ _ZN17QGraphicsTextItem19setDefaultTextColorERK6QColor @ 4027 NONAME
+ _ZN17QGraphicsTextItem20setOpenExternalLinksEb @ 4028 NONAME
+ _ZN17QGraphicsTextItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 4029 NONAME
+ _ZN17QGraphicsTextItem23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 4030 NONAME
+ _ZN17QGraphicsTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4031 NONAME
+ _ZN17QGraphicsTextItem7setFontERK5QFont @ 4032 NONAME
+ _ZN17QGraphicsTextItem7setHtmlERK7QString @ 4033 NONAME
+ _ZN17QGraphicsTextItem9dropEventEP27QGraphicsSceneDragDropEvent @ 4034 NONAME
+ _ZN17QGraphicsTextItemC1EP13QGraphicsItemP14QGraphicsScene @ 4035 NONAME
+ _ZN17QGraphicsTextItemC1ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 4036 NONAME
+ _ZN17QGraphicsTextItemC2EP13QGraphicsItemP14QGraphicsScene @ 4037 NONAME
+ _ZN17QGraphicsTextItemC2ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 4038 NONAME
+ _ZN17QGraphicsTextItemD0Ev @ 4039 NONAME
+ _ZN17QGraphicsTextItemD1Ev @ 4040 NONAME
+ _ZN17QGraphicsTextItemD2Ev @ 4041 NONAME
+ _ZN17QIconEnginePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4042 NONAME
+ _ZN17QIconEnginePlugin11qt_metacastEPKc @ 4043 NONAME
+ _ZN17QIconEnginePlugin16staticMetaObjectE @ 4044 NONAME DATA 16
+ _ZN17QIconEnginePlugin19getStaticMetaObjectEv @ 4045 NONAME
+ _ZN17QIconEnginePluginC2EP7QObject @ 4046 NONAME
+ _ZN17QIconEnginePluginD0Ev @ 4047 NONAME
+ _ZN17QIconEnginePluginD1Ev @ 4048 NONAME
+ _ZN17QIconEnginePluginD2Ev @ 4049 NONAME
+ _ZN17QInputMethodEvent15setCommitStringERK7QStringii @ 4050 NONAME
+ _ZN17QInputMethodEventC1ERK7QStringRK5QListINS_9AttributeEE @ 4051 NONAME
+ _ZN17QInputMethodEventC1ERKS_ @ 4052 NONAME
+ _ZN17QInputMethodEventC1Ev @ 4053 NONAME
+ _ZN17QInputMethodEventC2ERK7QStringRK5QListINS_9AttributeEE @ 4054 NONAME
+ _ZN17QInputMethodEventC2ERKS_ @ 4055 NONAME
+ _ZN17QInputMethodEventC2Ev @ 4056 NONAME
+ _ZN17QPixmapBlurFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 4057 NONAME
+ _ZN17QPixmapBlurFilter11qt_metacastEPKc @ 4058 NONAME
+ _ZN17QPixmapBlurFilter11setBlurHintEN2Qt10RenderHintE @ 4059 NONAME
+ _ZN17QPixmapBlurFilter16staticMetaObjectE @ 4060 NONAME DATA 16
+ _ZN17QPixmapBlurFilter19getStaticMetaObjectEv @ 4061 NONAME
+ _ZN17QPixmapBlurFilter9setRadiusEi @ 4062 NONAME
+ _ZN17QPixmapBlurFilterC1EP7QObject @ 4063 NONAME
+ _ZN17QPixmapBlurFilterC2EP7QObject @ 4064 NONAME
+ _ZN17QPixmapBlurFilterD0Ev @ 4065 NONAME
+ _ZN17QPixmapBlurFilterD1Ev @ 4066 NONAME
+ _ZN17QPixmapBlurFilterD2Ev @ 4067 NONAME
+ _ZN17QRasterPixmapData15setAlphaChannelERK7QPixmap @ 4068 NONAME
+ _ZN17QRasterPixmapData4fillERK6QColor @ 4069 NONAME
+ _ZN17QRasterPixmapData6bufferEv @ 4070 NONAME
+ _ZN17QRasterPixmapData6resizeEii @ 4071 NONAME
+ _ZN17QRasterPixmapData6scrollEiiRK5QRect @ 4072 NONAME
+ _ZN17QRasterPixmapData7setMaskERK7QBitmap @ 4073 NONAME
+ _ZN17QRasterPixmapData9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 4074 NONAME
+ _ZN17QRasterPixmapDataC1EN11QPixmapData9PixelTypeE @ 4075 NONAME
+ _ZN17QRasterPixmapDataC2EN11QPixmapData9PixelTypeE @ 4076 NONAME
+ _ZN17QRasterPixmapDataD0Ev @ 4077 NONAME
+ _ZN17QRasterPixmapDataD1Ev @ 4078 NONAME
+ _ZN17QRasterPixmapDataD2Ev @ 4079 NONAME
+ _ZN17QStyleOptionFrameC1Ei @ 4080 NONAME
+ _ZN17QStyleOptionFrameC1Ev @ 4081 NONAME
+ _ZN17QStyleOptionFrameC2Ei @ 4082 NONAME
+ _ZN17QStyleOptionFrameC2Ev @ 4083 NONAME
+ _ZN17QStyleOptionTabV2C1ERK15QStyleOptionTab @ 4084 NONAME
+ _ZN17QStyleOptionTabV2C1Ei @ 4085 NONAME
+ _ZN17QStyleOptionTabV2C1Ev @ 4086 NONAME
+ _ZN17QStyleOptionTabV2C2ERK15QStyleOptionTab @ 4087 NONAME
+ _ZN17QStyleOptionTabV2C2Ei @ 4088 NONAME
+ _ZN17QStyleOptionTabV2C2Ev @ 4089 NONAME
+ _ZN17QStyleOptionTabV2aSERK15QStyleOptionTab @ 4090 NONAME
+ _ZN17QStyleOptionTabV3C1ERK15QStyleOptionTab @ 4091 NONAME
+ _ZN17QStyleOptionTabV3C1Ei @ 4092 NONAME
+ _ZN17QStyleOptionTabV3C1Ev @ 4093 NONAME
+ _ZN17QStyleOptionTabV3C2ERK15QStyleOptionTab @ 4094 NONAME
+ _ZN17QStyleOptionTabV3C2Ei @ 4095 NONAME
+ _ZN17QStyleOptionTabV3C2Ev @ 4096 NONAME
+ _ZN17QStyleOptionTabV3aSERK15QStyleOptionTab @ 4097 NONAME
+ _ZN17QTextImageHandler14externalLoaderE @ 4098 NONAME DATA 4
+ _ZN17QTextInlineObject10setDescentEf @ 4099 NONAME
+ _ZN17QTextInlineObject8setWidthEf @ 4100 NONAME
+ _ZN17QTextInlineObject9setAscentEf @ 4101 NONAME
+ _ZN18QCommandLinkButton10paintEventEP11QPaintEvent @ 4102 NONAME
+ _ZN18QCommandLinkButton11qt_metacallEN11QMetaObject4CallEiPPv @ 4103 NONAME
+ _ZN18QCommandLinkButton11qt_metacastEPKc @ 4104 NONAME
+ _ZN18QCommandLinkButton14setDescriptionERK7QString @ 4105 NONAME
+ _ZN18QCommandLinkButton16staticMetaObjectE @ 4106 NONAME DATA 16
+ _ZN18QCommandLinkButton19getStaticMetaObjectEv @ 4107 NONAME
+ _ZN18QCommandLinkButton5eventEP6QEvent @ 4108 NONAME
+ _ZN18QCommandLinkButtonC1EP7QWidget @ 4109 NONAME
+ _ZN18QCommandLinkButtonC1ERK7QStringP7QWidget @ 4110 NONAME
+ _ZN18QCommandLinkButtonC1ERK7QStringS2_P7QWidget @ 4111 NONAME
+ _ZN18QCommandLinkButtonC2EP7QWidget @ 4112 NONAME
+ _ZN18QCommandLinkButtonC2ERK7QStringP7QWidget @ 4113 NONAME
+ _ZN18QCommandLinkButtonC2ERK7QStringS2_P7QWidget @ 4114 NONAME
+ _ZN18QDragResponseEventC1Eb @ 4115 NONAME
+ _ZN18QDragResponseEventC2Eb @ 4116 NONAME
+ _ZN18QDragResponseEventD0Ev @ 4117 NONAME
+ _ZN18QDragResponseEventD1Ev @ 4118 NONAME
+ _ZN18QDragResponseEventD2Ev @ 4119 NONAME
+ _ZN18QGestureRecognizer13createGestureEP7QObject @ 4120 NONAME
+ _ZN18QGestureRecognizer5resetEP8QGesture @ 4121 NONAME
+ _ZN18QGestureRecognizerC2Ev @ 4122 NONAME
+ _ZN18QGestureRecognizerD0Ev @ 4123 NONAME
+ _ZN18QGestureRecognizerD1Ev @ 4124 NONAME
+ _ZN18QGestureRecognizerD2Ev @ 4125 NONAME
+ _ZN18QGraphicsItemGroup10addToGroupEP13QGraphicsItem @ 4126 NONAME
+ _ZN18QGraphicsItemGroup15removeFromGroupEP13QGraphicsItem @ 4127 NONAME
+ _ZN18QGraphicsItemGroup5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4128 NONAME
+ _ZN18QGraphicsItemGroupC1EP13QGraphicsItemP14QGraphicsScene @ 4129 NONAME
+ _ZN18QGraphicsItemGroupC2EP13QGraphicsItemP14QGraphicsScene @ 4130 NONAME
+ _ZN18QGraphicsItemGroupD0Ev @ 4131 NONAME
+ _ZN18QGraphicsItemGroupD1Ev @ 4132 NONAME
+ _ZN18QGraphicsItemGroupD2Ev @ 4133 NONAME
+ _ZN18QGraphicsTransform11qt_metacallEN11QMetaObject4CallEiPPv @ 4134 NONAME
+ _ZN18QGraphicsTransform11qt_metacastEPKc @ 4135 NONAME
+ _ZN18QGraphicsTransform16staticMetaObjectE @ 4136 NONAME DATA 16
+ _ZN18QGraphicsTransform19getStaticMetaObjectEv @ 4137 NONAME
+ _ZN18QGraphicsTransform6updateEv @ 4138 NONAME
+ _ZN18QGraphicsTransformC2EP7QObject @ 4139 NONAME
+ _ZN18QGraphicsTransformC2ER25QGraphicsTransformPrivateP7QObject @ 4140 NONAME
+ _ZN18QGraphicsTransformD0Ev @ 4141 NONAME
+ _ZN18QGraphicsTransformD1Ev @ 4142 NONAME
+ _ZN18QGraphicsTransformD2Ev @ 4143 NONAME
+ _ZN18QItemEditorFactory14defaultFactoryEv @ 4144 NONAME
+ _ZN18QItemEditorFactory14registerEditorEN8QVariant4TypeEP22QItemEditorCreatorBase @ 4145 NONAME
+ _ZN18QItemEditorFactory17setDefaultFactoryEPS_ @ 4146 NONAME
+ _ZN18QItemEditorFactoryD0Ev @ 4147 NONAME
+ _ZN18QItemEditorFactoryD1Ev @ 4148 NONAME
+ _ZN18QItemEditorFactoryD2Ev @ 4149 NONAME
+ _ZN18QStandardItemModel10insertRowsEiiRK11QModelIndex @ 4150 NONAME
+ _ZN18QStandardItemModel10removeRowsEiiRK11QModelIndex @ 4151 NONAME
+ _ZN18QStandardItemModel10takeColumnEi @ 4152 NONAME
+ _ZN18QStandardItemModel11itemChangedEP13QStandardItem @ 4153 NONAME
+ _ZN18QStandardItemModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4154 NONAME
+ _ZN18QStandardItemModel11qt_metacastEPKc @ 4155 NONAME
+ _ZN18QStandardItemModel11setItemDataERK11QModelIndexRK4QMapIi8QVariantE @ 4156 NONAME
+ _ZN18QStandardItemModel11setRowCountEi @ 4157 NONAME
+ _ZN18QStandardItemModel11setSortRoleEi @ 4158 NONAME
+ _ZN18QStandardItemModel12appendColumnERK5QListIP13QStandardItemE @ 4159 NONAME
+ _ZN18QStandardItemModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 4160 NONAME
+ _ZN18QStandardItemModel12insertColumnEiRK5QListIP13QStandardItemE @ 4161 NONAME
+ _ZN18QStandardItemModel13insertColumnsEiiRK11QModelIndex @ 4162 NONAME
+ _ZN18QStandardItemModel13removeColumnsEiiRK11QModelIndex @ 4163 NONAME
+ _ZN18QStandardItemModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4164 NONAME
+ _ZN18QStandardItemModel14setColumnCountEi @ 4165 NONAME
+ _ZN18QStandardItemModel16setItemPrototypeEPK13QStandardItem @ 4166 NONAME
+ _ZN18QStandardItemModel16staticMetaObjectE @ 4167 NONAME DATA 16
+ _ZN18QStandardItemModel19getStaticMetaObjectEv @ 4168 NONAME
+ _ZN18QStandardItemModel21setVerticalHeaderItemEiP13QStandardItem @ 4169 NONAME
+ _ZN18QStandardItemModel22takeVerticalHeaderItemEi @ 4170 NONAME
+ _ZN18QStandardItemModel23setHorizontalHeaderItemEiP13QStandardItem @ 4171 NONAME
+ _ZN18QStandardItemModel23setVerticalHeaderLabelsERK11QStringList @ 4172 NONAME
+ _ZN18QStandardItemModel24takeHorizontalHeaderItemEi @ 4173 NONAME
+ _ZN18QStandardItemModel25setHorizontalHeaderLabelsERK11QStringList @ 4174 NONAME
+ _ZN18QStandardItemModel4sortEiN2Qt9SortOrderE @ 4175 NONAME
+ _ZN18QStandardItemModel5clearEv @ 4176 NONAME
+ _ZN18QStandardItemModel7setDataERK11QModelIndexRK8QVarianti @ 4177 NONAME
+ _ZN18QStandardItemModel7setItemEiiP13QStandardItem @ 4178 NONAME
+ _ZN18QStandardItemModel7takeRowEi @ 4179 NONAME
+ _ZN18QStandardItemModel8takeItemEii @ 4180 NONAME
+ _ZN18QStandardItemModel9appendRowERK5QListIP13QStandardItemE @ 4181 NONAME
+ _ZN18QStandardItemModel9insertRowEiRK5QListIP13QStandardItemE @ 4182 NONAME
+ _ZN18QStandardItemModelC1EP7QObject @ 4183 NONAME
+ _ZN18QStandardItemModelC1ER25QStandardItemModelPrivateP7QObject @ 4184 NONAME
+ _ZN18QStandardItemModelC1EiiP7QObject @ 4185 NONAME
+ _ZN18QStandardItemModelC2EP7QObject @ 4186 NONAME
+ _ZN18QStandardItemModelC2ER25QStandardItemModelPrivateP7QObject @ 4187 NONAME
+ _ZN18QStandardItemModelC2EiiP7QObject @ 4188 NONAME
+ _ZN18QStandardItemModelD0Ev @ 4189 NONAME
+ _ZN18QStandardItemModelD1Ev @ 4190 NONAME
+ _ZN18QStandardItemModelD2Ev @ 4191 NONAME
+ _ZN18QStyleOptionButtonC1Ei @ 4192 NONAME
+ _ZN18QStyleOptionButtonC1Ev @ 4193 NONAME
+ _ZN18QStyleOptionButtonC2Ei @ 4194 NONAME
+ _ZN18QStyleOptionButtonC2Ev @ 4195 NONAME
+ _ZN18QStyleOptionHeaderC1Ei @ 4196 NONAME
+ _ZN18QStyleOptionHeaderC1Ev @ 4197 NONAME
+ _ZN18QStyleOptionHeaderC2Ei @ 4198 NONAME
+ _ZN18QStyleOptionHeaderC2Ev @ 4199 NONAME
+ _ZN18QStyleOptionSliderC1Ei @ 4200 NONAME
+ _ZN18QStyleOptionSliderC1Ev @ 4201 NONAME
+ _ZN18QStyleOptionSliderC2Ei @ 4202 NONAME
+ _ZN18QStyleOptionSliderC2Ev @ 4203 NONAME
+ _ZN18QSyntaxHighlighter11qt_metacallEN11QMetaObject4CallEiPPv @ 4204 NONAME
+ _ZN18QSyntaxHighlighter11qt_metacastEPKc @ 4205 NONAME
+ _ZN18QSyntaxHighlighter11rehighlightEv @ 4206 NONAME
+ _ZN18QSyntaxHighlighter11setDocumentEP13QTextDocument @ 4207 NONAME
+ _ZN18QSyntaxHighlighter16rehighlightBlockERK10QTextBlock @ 4208 NONAME
+ _ZN18QSyntaxHighlighter16staticMetaObjectE @ 4209 NONAME DATA 16
+ _ZN18QSyntaxHighlighter19getStaticMetaObjectEv @ 4210 NONAME
+ _ZN18QSyntaxHighlighter20setCurrentBlockStateEi @ 4211 NONAME
+ _ZN18QSyntaxHighlighter23setCurrentBlockUserDataEP18QTextBlockUserData @ 4212 NONAME
+ _ZN18QSyntaxHighlighter9setFormatEiiRK15QTextCharFormat @ 4213 NONAME
+ _ZN18QSyntaxHighlighter9setFormatEiiRK5QFont @ 4214 NONAME
+ _ZN18QSyntaxHighlighter9setFormatEiiRK6QColor @ 4215 NONAME
+ _ZN18QSyntaxHighlighterC2EP13QTextDocument @ 4216 NONAME
+ _ZN18QSyntaxHighlighterC2EP7QObject @ 4217 NONAME
+ _ZN18QSyntaxHighlighterC2EP9QTextEdit @ 4218 NONAME
+ _ZN18QSyntaxHighlighterD0Ev @ 4219 NONAME
+ _ZN18QSyntaxHighlighterD1Ev @ 4220 NONAME
+ _ZN18QSyntaxHighlighterD2Ev @ 4221 NONAME
+ _ZN18QTextBlockUserDataD0Ev @ 4222 NONAME
+ _ZN18QTextBlockUserDataD1Ev @ 4223 NONAME
+ _ZN18QTextBlockUserDataD2Ev @ 4224 NONAME
+ _ZN18QTextureGlyphCache8populateERK12QTextItemIntRK15QVarLengthArrayIjLi256EERKS3_I11QFixedPointLi256EE @ 4225 NONAME
+ _ZN19QAbstractProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4226 NONAME
+ _ZN19QAbstractProxyModel11qt_metacastEPKc @ 4227 NONAME
+ _ZN19QAbstractProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4228 NONAME
+ _ZN19QAbstractProxyModel14setSourceModelEP18QAbstractItemModel @ 4229 NONAME
+ _ZN19QAbstractProxyModel16staticMetaObjectE @ 4230 NONAME DATA 16
+ _ZN19QAbstractProxyModel19getStaticMetaObjectEv @ 4231 NONAME
+ _ZN19QAbstractProxyModel6revertEv @ 4232 NONAME
+ _ZN19QAbstractProxyModel6submitEv @ 4233 NONAME
+ _ZN19QAbstractProxyModel7setDataERK11QModelIndexRK8QVarianti @ 4234 NONAME
+ _ZN19QAbstractProxyModelC2EP7QObject @ 4235 NONAME
+ _ZN19QAbstractProxyModelC2ER26QAbstractProxyModelPrivateP7QObject @ 4236 NONAME
+ _ZN19QAbstractProxyModelD0Ev @ 4237 NONAME
+ _ZN19QAbstractProxyModelD1Ev @ 4238 NONAME
+ _ZN19QAbstractProxyModelD2Ev @ 4239 NONAME
+ _ZN19QAbstractScrollArea10paintEventEP11QPaintEvent @ 4240 NONAME
+ _ZN19QAbstractScrollArea10wheelEventEP11QWheelEvent @ 4241 NONAME
+ _ZN19QAbstractScrollArea11qt_metacallEN11QMetaObject4CallEiPPv @ 4242 NONAME
+ _ZN19QAbstractScrollArea11qt_metacastEPKc @ 4243 NONAME
+ _ZN19QAbstractScrollArea11resizeEventEP12QResizeEvent @ 4244 NONAME
+ _ZN19QAbstractScrollArea11setViewportEP7QWidget @ 4245 NONAME
+ _ZN19QAbstractScrollArea13dragMoveEventEP14QDragMoveEvent @ 4246 NONAME
+ _ZN19QAbstractScrollArea13keyPressEventEP9QKeyEvent @ 4247 NONAME
+ _ZN19QAbstractScrollArea13setupViewportEP7QWidget @ 4248 NONAME
+ _ZN19QAbstractScrollArea13viewportEventEP6QEvent @ 4249 NONAME
+ _ZN19QAbstractScrollArea14dragEnterEventEP15QDragEnterEvent @ 4250 NONAME
+ _ZN19QAbstractScrollArea14dragLeaveEventEP15QDragLeaveEvent @ 4251 NONAME
+ _ZN19QAbstractScrollArea14mouseMoveEventEP11QMouseEvent @ 4252 NONAME
+ _ZN19QAbstractScrollArea15mousePressEventEP11QMouseEvent @ 4253 NONAME
+ _ZN19QAbstractScrollArea15setCornerWidgetEP7QWidget @ 4254 NONAME
+ _ZN19QAbstractScrollArea16contextMenuEventEP17QContextMenuEvent @ 4255 NONAME
+ _ZN19QAbstractScrollArea16scrollBarWidgetsE6QFlagsIN2Qt13AlignmentFlagEE @ 4256 NONAME
+ _ZN19QAbstractScrollArea16scrollContentsByEii @ 4257 NONAME
+ _ZN19QAbstractScrollArea16staticMetaObjectE @ 4258 NONAME DATA 16
+ _ZN19QAbstractScrollArea17mouseReleaseEventEP11QMouseEvent @ 4259 NONAME
+ _ZN19QAbstractScrollArea18addScrollBarWidgetEP7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 4260 NONAME
+ _ZN19QAbstractScrollArea18setViewportMarginsEiiii @ 4261 NONAME
+ _ZN19QAbstractScrollArea19getStaticMetaObjectEv @ 4262 NONAME
+ _ZN19QAbstractScrollArea20setVerticalScrollBarEP10QScrollBar @ 4263 NONAME
+ _ZN19QAbstractScrollArea21mouseDoubleClickEventEP11QMouseEvent @ 4264 NONAME
+ _ZN19QAbstractScrollArea22setHorizontalScrollBarEP10QScrollBar @ 4265 NONAME
+ _ZN19QAbstractScrollArea26setVerticalScrollBarPolicyEN2Qt15ScrollBarPolicyE @ 4266 NONAME
+ _ZN19QAbstractScrollArea28setHorizontalScrollBarPolicyEN2Qt15ScrollBarPolicyE @ 4267 NONAME
+ _ZN19QAbstractScrollArea5eventEP6QEvent @ 4268 NONAME
+ _ZN19QAbstractScrollArea9dropEventEP10QDropEvent @ 4269 NONAME
+ _ZN19QAbstractScrollAreaC1EP7QWidget @ 4270 NONAME
+ _ZN19QAbstractScrollAreaC1ER26QAbstractScrollAreaPrivateP7QWidget @ 4271 NONAME
+ _ZN19QAbstractScrollAreaC2EP7QWidget @ 4272 NONAME
+ _ZN19QAbstractScrollAreaC2ER26QAbstractScrollAreaPrivateP7QWidget @ 4273 NONAME
+ _ZN19QAbstractScrollAreaD0Ev @ 4274 NONAME
+ _ZN19QAbstractScrollAreaD1Ev @ 4275 NONAME
+ _ZN19QAbstractScrollAreaD2Ev @ 4276 NONAME
+ _ZN19QApplicationPrivate10animate_uiE @ 4277 NONAME DATA 1
+ _ZN19QApplicationPrivate10closePopupEP7QWidget @ 4278 NONAME
+ _ZN19QApplicationPrivate10enterModalEP7QWidget @ 4279 NONAME
+ _ZN19QApplicationPrivate10initializeEv @ 4280 NONAME
+ _ZN19QApplicationPrivate10leaveModalEP7QWidget @ 4281 NONAME
+ _ZN19QApplicationPrivate10modalStateEv @ 4282 NONAME
+ _ZN19QApplicationPrivate10styleSheetE @ 4283 NONAME DATA 4
+ _ZN19QApplicationPrivate11main_widgetE @ 4284 NONAME DATA 4
+ _ZN19QApplicationPrivate11widgetCountE @ 4285 NONAME DATA 1
+ _ZN19QApplicationPrivate12animate_menuE @ 4286 NONAME DATA 1
+ _ZN19QApplicationPrivate12fade_tooltipE @ 4287 NONAME DATA 1
+ _ZN19QApplicationPrivate12focus_widgetE @ 4288 NONAME DATA 4
+ _ZN19QApplicationPrivate12inputContextE @ 4289 NONAME DATA 4
+ _ZN19QApplicationPrivate12oldEditFocusE @ 4290 NONAME DATA 4
+ _ZN19QApplicationPrivate12popupWidgetsE @ 4291 NONAME DATA 4
+ _ZN19QApplicationPrivate13active_windowE @ 4292 NONAME DATA 4
+ _ZN19QApplicationPrivate13animate_comboE @ 4293 NONAME DATA 1
+ _ZN19QApplicationPrivate13mouse_buttonsE @ 4294 NONAME DATA 4
+ _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent @ 4295 NONAME
+ _ZN19QApplicationPrivate13scanCodeCacheE @ 4296 NONAME DATA 4
+ _ZN19QApplicationPrivate13setSystemFontERK5QFont @ 4297 NONAME
+ _ZN19QApplicationPrivate13styleOverrideE @ 4298 NONAME DATA 4
+ _ZN19QApplicationPrivate14autoSipEnabledE @ 4299 NONAME DATA 1
+ _ZN19QApplicationPrivate14enterModal_sysEP7QWidget @ 4300 NONAME
+ _ZN19QApplicationPrivate14leaveModal_sysEP7QWidget @ 4301 NONAME
+ _ZN19QApplicationPrivate14navigationModeE @ 4302 NONAME DATA 4
+ _ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb @ 4303 NONAME
+ _ZN19QApplicationPrivate14setFocusWidgetEP7QWidgetN2Qt11FocusReasonE @ 4304 NONAME
+ _ZN19QApplicationPrivate14shouldSetFocusEP7QWidgetN2Qt11FocusPolicyE @ 4305 NONAME
+ _ZN19QApplicationPrivate14tryModalHelperEP7QWidgetPS1_ @ 4306 NONAME
+ _ZN19QApplicationPrivate15animate_toolboxE @ 4307 NONAME DATA 1
+ _ZN19QApplicationPrivate15animate_tooltipE @ 4308 NONAME DATA 1
+ _ZN19QApplicationPrivate15currentPlatformEv @ 4309 NONAME
+ _ZN19QApplicationPrivate15desktopStyleKeyEv @ 4310 NONAME
+ _ZN19QApplicationPrivate15graphics_systemE @ 4311 NONAME DATA 4
+ _ZN19QApplicationPrivate15process_cmdlineEv @ 4312 NONAME
+ _ZN19QApplicationPrivate16isBlockedByModalEP7QWidget @ 4313 NONAME
+ _ZN19QApplicationPrivate16load_testabilityE @ 4314 NONAME DATA 1
+ _ZN19QApplicationPrivate16modifier_buttonsE @ 4315 NONAME DATA 4
+ _ZN19QApplicationPrivate16setSystemPaletteERK8QPalette @ 4316 NONAME
+ _ZN19QApplicationPrivate17cleanupMultitouchEv @ 4317 NONAME
+ _ZN19QApplicationPrivate17cursor_flash_timeE @ 4318 NONAME DATA 4
+ _ZN19QApplicationPrivate17leaveAfterReleaseE @ 4319 NONAME DATA 4
+ _ZN19QApplicationPrivate17pickMouseReceiverEP7QWidgetRK6QPointRS2_N6QEvent4TypeE6QFlagsIN2Qt11MouseButtonEES1_S1_ @ 4320 NONAME
+ _ZN19QApplicationPrivate17setNavigationModeEN2Qt14NavigationModeE @ 4321 NONAME
+ _ZN19QApplicationPrivate17setPalette_helperERK8QPalettePKcb @ 4322 NONAME
+ _ZN19QApplicationPrivate18dispatchEnterLeaveEP7QWidgetS1_ @ 4323 NONAME
+ _ZN19QApplicationPrivate18resolveS60ScanCodeEij @ 4324 NONAME
+ _ZN19QApplicationPrivate18wheel_scroll_linesE @ 4325 NONAME DATA 4
+ _ZN19QApplicationPrivate19app_compile_versionE @ 4326 NONAME DATA 4
+ _ZN19QApplicationPrivate19hidden_focus_widgetE @ 4327 NONAME DATA 4
+ _ZN19QApplicationPrivate19keyboard_input_timeE @ 4328 NONAME DATA 4
+ _ZN19QApplicationPrivate20emitLastWindowClosedEv @ 4329 NONAME
+ _ZN19QApplicationPrivate20graphics_system_nameE @ 4330 NONAME DATA 4
+ _ZN19QApplicationPrivate20initializeMultitouchEv @ 4331 NONAME
+ _ZN19QApplicationPrivate21cleanupMultitouch_sysEv @ 4332 NONAME
+ _ZN19QApplicationPrivate21createEventDispatcherEv @ 4333 NONAME
+ _ZN19QApplicationPrivate21obey_desktop_settingsE @ 4334 NONAME DATA 1
+ _ZN19QApplicationPrivate22quitOnLastWindowClosedE @ 4335 NONAME DATA 1
+ _ZN19QApplicationPrivate22translateRawTouchEventEP7QWidgetN11QTouchEvent10DeviceTypeERK5QListINS2_10TouchPointEE @ 4336 NONAME
+ _ZN19QApplicationPrivate23findClosestTouchPointIdERK7QPointF @ 4337 NONAME
+ _ZN19QApplicationPrivate23mouse_double_click_timeE @ 4338 NONAME DATA 4
+ _ZN19QApplicationPrivate24initializeMultitouch_sysEv @ 4339 NONAME
+ _ZN19QApplicationPrivate25focusNextPrevChild_helperEP7QWidgetb @ 4340 NONAME
+ _ZN19QApplicationPrivate26updateTouchPointsForWidgetEP7QWidgetP11QTouchEvent @ 4341 NONAME
+ _ZN19QApplicationPrivate27initializeWidgetPaletteHashEv @ 4342 NONAME
+ _ZN19QApplicationPrivate31giveFocusAccordingToFocusPolicyEP7QWidgetN2Qt11FocusPolicyENS2_11FocusReasonE @ 4343 NONAME
+ _ZN19QApplicationPrivate4selfE @ 4344 NONAME DATA 4
+ _ZN19QApplicationPrivate7app_palE @ 4345 NONAME DATA 4
+ _ZN19QApplicationPrivate7set_palE @ 4346 NONAME DATA 4
+ _ZN19QApplicationPrivate7sys_palE @ 4347 NONAME DATA 4
+ _ZN19QApplicationPrivate8app_fontE @ 4348 NONAME DATA 4
+ _ZN19QApplicationPrivate8app_iconE @ 4349 NONAME DATA 4
+ _ZN19QApplicationPrivate8set_fontE @ 4350 NONAME DATA 4
+ _ZN19QApplicationPrivate8sys_fontE @ 4351 NONAME DATA 4
+ _ZN19QApplicationPrivate9app_cspecE @ 4352 NONAME DATA 4
+ _ZN19QApplicationPrivate9app_strutE @ 4353 NONAME DATA 8
+ _ZN19QApplicationPrivate9app_styleE @ 4354 NONAME DATA 4
+ _ZN19QApplicationPrivate9constructEv @ 4355 NONAME
+ _ZN19QApplicationPrivate9fade_menuE @ 4356 NONAME DATA 1
+ _ZN19QApplicationPrivate9openPopupEP7QWidget @ 4357 NONAME
+ _ZN19QApplicationPrivateC1ERiPPcN12QApplication4TypeE @ 4358 NONAME
+ _ZN19QApplicationPrivateC2ERiPPcN12QApplication4TypeE @ 4359 NONAME
+ _ZN19QApplicationPrivateD0Ev @ 4360 NONAME
+ _ZN19QApplicationPrivateD1Ev @ 4361 NONAME
+ _ZN19QApplicationPrivateD2Ev @ 4362 NONAME
+ _ZN19QCoeFepInputContext10Extension1ERi @ 4363 NONAME
+ _ZN19QCoeFepInputContext10applyHintsE6QFlagsIN2Qt15InputMethodHintEE @ 4364 NONAME
+ _ZN19QCoeFepInputContext11applyFormatEP5QListIN17QInputMethodEvent9AttributeEE @ 4365 NONAME
+ _ZN19QCoeFepInputContext11filterEventEPK6QEvent @ 4366 NONAME
+ _ZN19QCoeFepInputContext11qt_metacallEN11QMetaObject4CallEiPPv @ 4367 NONAME
+ _ZN19QCoeFepInputContext11qt_metacastEPKc @ 4368 NONAME
+ _ZN19QCoeFepInputContext11updateHintsEb @ 4369 NONAME
+ _ZN19QCoeFepInputContext12mouseHandlerEiP11QMouseEvent @ 4370 NONAME
+ _ZN19QCoeFepInputContext14setFocusWidgetEP7QWidget @ 4371 NONAME
+ _ZN19QCoeFepInputContext15MopSupplyObjectE8TTypeUid @ 4372 NONAME
+ _ZN19QCoeFepInputContext15widgetDestroyedEP7QWidget @ 4373 NONAME
+ _ZN19QCoeFepInputContext16staticMetaObjectE @ 4374 NONAME DATA 16
+ _ZN19QCoeFepInputContext17inputCapabilitiesEv @ 4375 NONAME
+ _ZN19QCoeFepInputContext19CancelFepInlineEditEv @ 4376 NONAME
+ _ZN19QCoeFepInputContext19StartFepInlineEditLERK7TDesC16iiPK15MFormCustomDrawR29MFepInlineTextFormatRetrieverR39MFepPointerEventHandlerDuringInlineEdit @ 4377 NONAME
+ _ZN19QCoeFepInputContext19commitCurrentStringEb @ 4378 NONAME
+ _ZN19QCoeFepInputContext19getStaticMetaObjectEv @ 4379 NONAME
+ _ZN19QCoeFepInputContext20UpdateFepInlineTextLERK7TDesC16i @ 4380 NONAME
+ _ZN19QCoeFepInputContext21ReportAknEdStateEventEN19MAknEdStateObserver19EAknEdwinStateEventE @ 4381 NONAME
+ _ZN19QCoeFepInputContext22DoCommitFepInlineEditLEv @ 4382 NONAME
+ _ZN19QCoeFepInputContext25SetCursorSelectionForFepLERK16TCursorSelection @ 4383 NONAME
+ _ZN19QCoeFepInputContext29SetStateTransferingOwnershipLEPN33MCoeFepAwareTextEditor_Extension16CStateE4TUid @ 4384 NONAME
+ _ZN19QCoeFepInputContext29queueInputCapabilitiesChangedEv @ 4385 NONAME
+ _ZN19QCoeFepInputContext30ensureInputCapabilitiesChangedEv @ 4386 NONAME
+ _ZN19QCoeFepInputContext33SetInlineEditingCursorVisibilityLEi @ 4387 NONAME
+ _ZN19QCoeFepInputContext5StateE4TUid @ 4388 NONAME
+ _ZN19QCoeFepInputContext5resetEv @ 4389 NONAME
+ _ZN19QCoeFepInputContext6updateEv @ 4390 NONAME
+ _ZN19QCoeFepInputContext8languageEv @ 4391 NONAME
+ _ZN19QCoeFepInputContextC1EP7QObject @ 4392 NONAME
+ _ZN19QCoeFepInputContextC2EP7QObject @ 4393 NONAME
+ _ZN19QCoeFepInputContextD0Ev @ 4394 NONAME
+ _ZN19QCoeFepInputContextD1Ev @ 4395 NONAME
+ _ZN19QCoeFepInputContextD2Ev @ 4396 NONAME
+ _ZN19QEventDispatcherS6011qt_metacallEN11QMetaObject4CallEiPPv @ 4397 NONAME
+ _ZN19QEventDispatcherS6011qt_metacastEPKc @ 4398 NONAME
+ _ZN19QEventDispatcherS6013processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE @ 4399 NONAME
+ _ZN19QEventDispatcherS6014saveInputEventEP15QSymbianControlP7QWidgetP11QInputEvent @ 4400 NONAME
+ _ZN19QEventDispatcherS6016hasPendingEventsEv @ 4401 NONAME
+ _ZN19QEventDispatcherS6016staticMetaObjectE @ 4402 NONAME DATA 16
+ _ZN19QEventDispatcherS6019getStaticMetaObjectEv @ 4403 NONAME
+ _ZN19QEventDispatcherS6023sendDeferredInputEventsEv @ 4404 NONAME
+ _ZN19QEventDispatcherS6026removeInputEventsForWidgetEP7QObject @ 4405 NONAME
+ _ZN19QEventDispatcherS60C1EP7QObject @ 4406 NONAME
+ _ZN19QEventDispatcherS60C2EP7QObject @ 4407 NONAME
+ _ZN19QEventDispatcherS60D0Ev @ 4408 NONAME
+ _ZN19QEventDispatcherS60D1Ev @ 4409 NONAME
+ _ZN19QEventDispatcherS60D2Ev @ 4410 NONAME
+ _ZN19QGraphicsBlurEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 4411 NONAME
+ _ZN19QGraphicsBlurEffect11qt_metacastEPKc @ 4412 NONAME
+ _ZN19QGraphicsBlurEffect11setBlurHintEN2Qt10RenderHintE @ 4413 NONAME
+ _ZN19QGraphicsBlurEffect13setBlurRadiusEi @ 4414 NONAME
+ _ZN19QGraphicsBlurEffect15blurHintChangedEN2Qt10RenderHintE @ 4415 NONAME
+ _ZN19QGraphicsBlurEffect16staticMetaObjectE @ 4416 NONAME DATA 16
+ _ZN19QGraphicsBlurEffect17blurRadiusChangedEi @ 4417 NONAME
+ _ZN19QGraphicsBlurEffect19getStaticMetaObjectEv @ 4418 NONAME
+ _ZN19QGraphicsBlurEffect4drawEP8QPainterP21QGraphicsEffectSource @ 4419 NONAME
+ _ZN19QGraphicsBlurEffectC1EP7QObject @ 4420 NONAME
+ _ZN19QGraphicsBlurEffectC2EP7QObject @ 4421 NONAME
+ _ZN19QGraphicsBlurEffectD0Ev @ 4422 NONAME
+ _ZN19QGraphicsBlurEffectD1Ev @ 4423 NONAME
+ _ZN19QGraphicsBlurEffectD2Ev @ 4424 NONAME
+ _ZN19QGraphicsGridLayout10invalidateEv @ 4425 NONAME
+ _ZN19QGraphicsGridLayout10setSpacingEf @ 4426 NONAME
+ _ZN19QGraphicsGridLayout11setGeometryERK6QRectF @ 4427 NONAME
+ _ZN19QGraphicsGridLayout12setAlignmentEP19QGraphicsLayoutItem6QFlagsIN2Qt13AlignmentFlagEE @ 4428 NONAME
+ _ZN19QGraphicsGridLayout13setRowSpacingEif @ 4429 NONAME
+ _ZN19QGraphicsGridLayout15setRowAlignmentEi6QFlagsIN2Qt13AlignmentFlagEE @ 4430 NONAME
+ _ZN19QGraphicsGridLayout16setColumnSpacingEif @ 4431 NONAME
+ _ZN19QGraphicsGridLayout17setRowFixedHeightEif @ 4432 NONAME
+ _ZN19QGraphicsGridLayout18setColumnAlignmentEi6QFlagsIN2Qt13AlignmentFlagEE @ 4433 NONAME
+ _ZN19QGraphicsGridLayout18setVerticalSpacingEf @ 4434 NONAME
+ _ZN19QGraphicsGridLayout19setColumnFixedWidthEif @ 4435 NONAME
+ _ZN19QGraphicsGridLayout19setRowMaximumHeightEif @ 4436 NONAME
+ _ZN19QGraphicsGridLayout19setRowMinimumHeightEif @ 4437 NONAME
+ _ZN19QGraphicsGridLayout19setRowStretchFactorEii @ 4438 NONAME
+ _ZN19QGraphicsGridLayout20setHorizontalSpacingEf @ 4439 NONAME
+ _ZN19QGraphicsGridLayout21setColumnMaximumWidthEif @ 4440 NONAME
+ _ZN19QGraphicsGridLayout21setColumnMinimumWidthEif @ 4441 NONAME
+ _ZN19QGraphicsGridLayout21setRowPreferredHeightEif @ 4442 NONAME
+ _ZN19QGraphicsGridLayout22setColumnStretchFactorEii @ 4443 NONAME
+ _ZN19QGraphicsGridLayout23setColumnPreferredWidthEif @ 4444 NONAME
+ _ZN19QGraphicsGridLayout7addItemEP19QGraphicsLayoutItemiiii6QFlagsIN2Qt13AlignmentFlagEE @ 4445 NONAME
+ _ZN19QGraphicsGridLayout8removeAtEi @ 4446 NONAME
+ _ZN19QGraphicsGridLayoutC1EP19QGraphicsLayoutItem @ 4447 NONAME
+ _ZN19QGraphicsGridLayoutC2EP19QGraphicsLayoutItem @ 4448 NONAME
+ _ZN19QGraphicsGridLayoutD0Ev @ 4449 NONAME
+ _ZN19QGraphicsGridLayoutD1Ev @ 4450 NONAME
+ _ZN19QGraphicsGridLayoutD2Ev @ 4451 NONAME
+ _ZN19QGraphicsLayoutItem11setGeometryERK6QRectF @ 4452 NONAME
+ _ZN19QGraphicsLayoutItem13setSizePolicyEN11QSizePolicy6PolicyES1_NS0_11ControlTypeE @ 4453 NONAME
+ _ZN19QGraphicsLayoutItem13setSizePolicyERK11QSizePolicy @ 4454 NONAME
+ _ZN19QGraphicsLayoutItem14setMaximumSizeERK6QSizeF @ 4455 NONAME
+ _ZN19QGraphicsLayoutItem14setMinimumSizeERK6QSizeF @ 4456 NONAME
+ _ZN19QGraphicsLayoutItem14updateGeometryEv @ 4457 NONAME
+ _ZN19QGraphicsLayoutItem15setGraphicsItemEP13QGraphicsItem @ 4458 NONAME
+ _ZN19QGraphicsLayoutItem15setMaximumWidthEf @ 4459 NONAME
+ _ZN19QGraphicsLayoutItem15setMinimumWidthEf @ 4460 NONAME
+ _ZN19QGraphicsLayoutItem16setMaximumHeightEf @ 4461 NONAME
+ _ZN19QGraphicsLayoutItem16setMinimumHeightEf @ 4462 NONAME
+ _ZN19QGraphicsLayoutItem16setOwnedByLayoutEb @ 4463 NONAME
+ _ZN19QGraphicsLayoutItem16setPreferredSizeERK6QSizeF @ 4464 NONAME
+ _ZN19QGraphicsLayoutItem17setPreferredWidthEf @ 4465 NONAME
+ _ZN19QGraphicsLayoutItem18setPreferredHeightEf @ 4466 NONAME
+ _ZN19QGraphicsLayoutItem19setParentLayoutItemEPS_ @ 4467 NONAME
+ _ZN19QGraphicsLayoutItemC2EPS_b @ 4468 NONAME
+ _ZN19QGraphicsLayoutItemC2ER26QGraphicsLayoutItemPrivate @ 4469 NONAME
+ _ZN19QGraphicsLayoutItemD0Ev @ 4470 NONAME
+ _ZN19QGraphicsLayoutItemD1Ev @ 4471 NONAME
+ _ZN19QGraphicsLayoutItemD2Ev @ 4472 NONAME
+ _ZN19QGraphicsPixmapItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4473 NONAME
+ _ZN19QGraphicsPixmapItem12setShapeModeENS_9ShapeModeE @ 4474 NONAME
+ _ZN19QGraphicsPixmapItem21setTransformationModeEN2Qt18TransformationModeE @ 4475 NONAME
+ _ZN19QGraphicsPixmapItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4476 NONAME
+ _ZN19QGraphicsPixmapItem9setOffsetERK7QPointF @ 4477 NONAME
+ _ZN19QGraphicsPixmapItem9setPixmapERK7QPixmap @ 4478 NONAME
+ _ZN19QGraphicsPixmapItemC1EP13QGraphicsItemP14QGraphicsScene @ 4479 NONAME
+ _ZN19QGraphicsPixmapItemC1ERK7QPixmapP13QGraphicsItemP14QGraphicsScene @ 4480 NONAME
+ _ZN19QGraphicsPixmapItemC2EP13QGraphicsItemP14QGraphicsScene @ 4481 NONAME
+ _ZN19QGraphicsPixmapItemC2ERK7QPixmapP13QGraphicsItemP14QGraphicsScene @ 4482 NONAME
+ _ZN19QGraphicsPixmapItemD0Ev @ 4483 NONAME
+ _ZN19QGraphicsPixmapItemD1Ev @ 4484 NONAME
+ _ZN19QGraphicsPixmapItemD2Ev @ 4485 NONAME
+ _ZN19QGraphicsSceneEvent9setWidgetEP7QWidget @ 4486 NONAME
+ _ZN19QGraphicsSceneEventC1EN6QEvent4TypeE @ 4487 NONAME
+ _ZN19QGraphicsSceneEventC1ER26QGraphicsSceneEventPrivateN6QEvent4TypeE @ 4488 NONAME
+ _ZN19QGraphicsSceneEventC2EN6QEvent4TypeE @ 4489 NONAME
+ _ZN19QGraphicsSceneEventC2ER26QGraphicsSceneEventPrivateN6QEvent4TypeE @ 4490 NONAME
+ _ZN19QGraphicsSceneEventD0Ev @ 4491 NONAME
+ _ZN19QGraphicsSceneEventD1Ev @ 4492 NONAME
+ _ZN19QGraphicsSceneEventD2Ev @ 4493 NONAME
+ _ZN19QIconEnginePluginV211qt_metacallEN11QMetaObject4CallEiPPv @ 4494 NONAME
+ _ZN19QIconEnginePluginV211qt_metacastEPKc @ 4495 NONAME
+ _ZN19QIconEnginePluginV216staticMetaObjectE @ 4496 NONAME DATA 16
+ _ZN19QIconEnginePluginV219getStaticMetaObjectEv @ 4497 NONAME
+ _ZN19QIconEnginePluginV2C2EP7QObject @ 4498 NONAME
+ _ZN19QIconEnginePluginV2D0Ev @ 4499 NONAME
+ _ZN19QIconEnginePluginV2D1Ev @ 4500 NONAME
+ _ZN19QIconEnginePluginV2D2Ev @ 4501 NONAME
+ _ZN19QInputContextPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4502 NONAME
+ _ZN19QInputContextPlugin11qt_metacastEPKc @ 4503 NONAME
+ _ZN19QInputContextPlugin16staticMetaObjectE @ 4504 NONAME DATA 16
+ _ZN19QInputContextPlugin19getStaticMetaObjectEv @ 4505 NONAME
+ _ZN19QInputContextPluginC2EP7QObject @ 4506 NONAME
+ _ZN19QInputContextPluginD0Ev @ 4507 NONAME
+ _ZN19QInputContextPluginD1Ev @ 4508 NONAME
+ _ZN19QInputContextPluginD2Ev @ 4509 NONAME
+ _ZN19QItemSelectionModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4510 NONAME
+ _ZN19QItemSelectionModel11qt_metacastEPKc @ 4511 NONAME
+ _ZN19QItemSelectionModel14clearSelectionEv @ 4512 NONAME
+ _ZN19QItemSelectionModel14currentChangedERK11QModelIndexS2_ @ 4513 NONAME
+ _ZN19QItemSelectionModel15setCurrentIndexERK11QModelIndex6QFlagsINS_13SelectionFlagEE @ 4514 NONAME
+ _ZN19QItemSelectionModel16selectionChangedERK14QItemSelectionS2_ @ 4515 NONAME
+ _ZN19QItemSelectionModel16staticMetaObjectE @ 4516 NONAME DATA 16
+ _ZN19QItemSelectionModel17currentRowChangedERK11QModelIndexS2_ @ 4517 NONAME
+ _ZN19QItemSelectionModel19getStaticMetaObjectEv @ 4518 NONAME
+ _ZN19QItemSelectionModel20currentColumnChangedERK11QModelIndexS2_ @ 4519 NONAME
+ _ZN19QItemSelectionModel20emitSelectionChangedERK14QItemSelectionS2_ @ 4520 NONAME
+ _ZN19QItemSelectionModel5clearEv @ 4521 NONAME
+ _ZN19QItemSelectionModel5resetEv @ 4522 NONAME
+ _ZN19QItemSelectionModel6selectERK11QModelIndex6QFlagsINS_13SelectionFlagEE @ 4523 NONAME
+ _ZN19QItemSelectionModel6selectERK14QItemSelection6QFlagsINS_13SelectionFlagEE @ 4524 NONAME
+ _ZN19QItemSelectionModelC1EP18QAbstractItemModel @ 4525 NONAME
+ _ZN19QItemSelectionModelC1EP18QAbstractItemModelP7QObject @ 4526 NONAME
+ _ZN19QItemSelectionModelC1ER26QItemSelectionModelPrivateP18QAbstractItemModel @ 4527 NONAME
+ _ZN19QItemSelectionModelC2EP18QAbstractItemModel @ 4528 NONAME
+ _ZN19QItemSelectionModelC2EP18QAbstractItemModelP7QObject @ 4529 NONAME
+ _ZN19QItemSelectionModelC2ER26QItemSelectionModelPrivateP18QAbstractItemModel @ 4530 NONAME
+ _ZN19QItemSelectionModelD0Ev @ 4531 NONAME
+ _ZN19QItemSelectionModelD1Ev @ 4532 NONAME
+ _ZN19QItemSelectionModelD2Ev @ 4533 NONAME
+ _ZN19QKeyEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 4534 NONAME
+ _ZN19QKeyEventTransition11qt_metacastEPKc @ 4535 NONAME
+ _ZN19QKeyEventTransition12onTransitionEP6QEvent @ 4536 NONAME
+ _ZN19QKeyEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 4537 NONAME
+ _ZN19QKeyEventTransition16staticMetaObjectE @ 4538 NONAME DATA 16
+ _ZN19QKeyEventTransition19getStaticMetaObjectEv @ 4539 NONAME
+ _ZN19QKeyEventTransition6setKeyEi @ 4540 NONAME
+ _ZN19QKeyEventTransition9eventTestEP6QEvent @ 4541 NONAME
+ _ZN19QKeyEventTransitionC1EP6QState @ 4542 NONAME
+ _ZN19QKeyEventTransitionC1EP7QObjectN6QEvent4TypeEiP6QState @ 4543 NONAME
+ _ZN19QKeyEventTransitionC2EP6QState @ 4544 NONAME
+ _ZN19QKeyEventTransitionC2EP7QObjectN6QEvent4TypeEiP6QState @ 4545 NONAME
+ _ZN19QKeyEventTransitionD0Ev @ 4546 NONAME
+ _ZN19QKeyEventTransitionD1Ev @ 4547 NONAME
+ _ZN19QKeyEventTransitionD2Ev @ 4548 NONAME
+ _ZN19QPainterPathStroker11setCapStyleEN2Qt11PenCapStyleE @ 4549 NONAME
+ _ZN19QPainterPathStroker12setJoinStyleEN2Qt12PenJoinStyleE @ 4550 NONAME
+ _ZN19QPainterPathStroker13setDashOffsetEf @ 4551 NONAME
+ _ZN19QPainterPathStroker13setMiterLimitEf @ 4552 NONAME
+ _ZN19QPainterPathStroker14setDashPatternEN2Qt8PenStyleE @ 4553 NONAME
+ _ZN19QPainterPathStroker14setDashPatternERK7QVectorIfE @ 4554 NONAME
+ _ZN19QPainterPathStroker17setCurveThresholdEf @ 4555 NONAME
+ _ZN19QPainterPathStroker8setWidthEf @ 4556 NONAME
+ _ZN19QPainterPathStrokerC1Ev @ 4557 NONAME
+ _ZN19QPainterPathStrokerC2Ev @ 4558 NONAME
+ _ZN19QPainterPathStrokerD1Ev @ 4559 NONAME
+ _ZN19QPainterPathStrokerD2Ev @ 4560 NONAME
+ _ZN19QS60MainApplication15CreateDocumentLEv @ 4561 NONAME
+ _ZN19QS60MainApplicationC1Ev @ 4562 NONAME
+ _ZN19QS60MainApplicationC2Ev @ 4563 NONAME
+ _ZN19QS60MainApplicationD0Ev @ 4564 NONAME
+ _ZN19QS60MainApplicationD1Ev @ 4565 NONAME
+ _ZN19QS60MainApplicationD2Ev @ 4566 NONAME
+ _ZN19QStyleOptionComplexC1Eii @ 4567 NONAME
+ _ZN19QStyleOptionComplexC2Eii @ 4568 NONAME
+ _ZN19QStyleOptionFrameV2C1ERK17QStyleOptionFrame @ 4569 NONAME
+ _ZN19QStyleOptionFrameV2C1Ei @ 4570 NONAME
+ _ZN19QStyleOptionFrameV2C1Ev @ 4571 NONAME
+ _ZN19QStyleOptionFrameV2C2ERK17QStyleOptionFrame @ 4572 NONAME
+ _ZN19QStyleOptionFrameV2C2Ei @ 4573 NONAME
+ _ZN19QStyleOptionFrameV2C2Ev @ 4574 NONAME
+ _ZN19QStyleOptionFrameV2aSERK17QStyleOptionFrame @ 4575 NONAME
+ _ZN19QStyleOptionFrameV3C1ERK17QStyleOptionFrame @ 4576 NONAME
+ _ZN19QStyleOptionFrameV3C1Ei @ 4577 NONAME
+ _ZN19QStyleOptionFrameV3C1Ev @ 4578 NONAME
+ _ZN19QStyleOptionFrameV3C2ERK17QStyleOptionFrame @ 4579 NONAME
+ _ZN19QStyleOptionFrameV3C2Ei @ 4580 NONAME
+ _ZN19QStyleOptionFrameV3C2Ev @ 4581 NONAME
+ _ZN19QStyleOptionFrameV3aSERK17QStyleOptionFrame @ 4582 NONAME
+ _ZN19QStyleOptionSpinBoxC1Ei @ 4583 NONAME
+ _ZN19QStyleOptionSpinBoxC1Ev @ 4584 NONAME
+ _ZN19QStyleOptionSpinBoxC2Ei @ 4585 NONAME
+ _ZN19QStyleOptionSpinBoxC2Ev @ 4586 NONAME
+ _ZN19QStyleOptionToolBarC1Ei @ 4587 NONAME
+ _ZN19QStyleOptionToolBarC1Ev @ 4588 NONAME
+ _ZN19QStyleOptionToolBarC2Ei @ 4589 NONAME
+ _ZN19QStyleOptionToolBarC2Ev @ 4590 NONAME
+ _ZN19QStyleOptionToolBoxC1Ei @ 4591 NONAME
+ _ZN19QStyleOptionToolBoxC1Ev @ 4592 NONAME
+ _ZN19QStyleOptionToolBoxC2Ei @ 4593 NONAME
+ _ZN19QStyleOptionToolBoxC2Ev @ 4594 NONAME
+ _ZN19QStyledItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 4595 NONAME
+ _ZN19QStyledItemDelegate11eventFilterEP7QObjectP6QEvent @ 4596 NONAME
+ _ZN19QStyledItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 4597 NONAME
+ _ZN19QStyledItemDelegate11qt_metacastEPKc @ 4598 NONAME
+ _ZN19QStyledItemDelegate16staticMetaObjectE @ 4599 NONAME DATA 16
+ _ZN19QStyledItemDelegate19getStaticMetaObjectEv @ 4600 NONAME
+ _ZN19QStyledItemDelegate20setItemEditorFactoryEP18QItemEditorFactory @ 4601 NONAME
+ _ZN19QStyledItemDelegateC1EP7QObject @ 4602 NONAME
+ _ZN19QStyledItemDelegateC2EP7QObject @ 4603 NONAME
+ _ZN19QStyledItemDelegateD0Ev @ 4604 NONAME
+ _ZN19QStyledItemDelegateD1Ev @ 4605 NONAME
+ _ZN19QStyledItemDelegateD2Ev @ 4606 NONAME
+ _ZN19QTextDocumentWriter11setFileNameERK7QString @ 4607 NONAME
+ _ZN19QTextDocumentWriter24supportedDocumentFormatsEv @ 4608 NONAME
+ _ZN19QTextDocumentWriter5writeEPK13QTextDocument @ 4609 NONAME
+ _ZN19QTextDocumentWriter5writeERK21QTextDocumentFragment @ 4610 NONAME
+ _ZN19QTextDocumentWriter8setCodecEP10QTextCodec @ 4611 NONAME
+ _ZN19QTextDocumentWriter9setDeviceEP9QIODevice @ 4612 NONAME
+ _ZN19QTextDocumentWriter9setFormatERK10QByteArray @ 4613 NONAME
+ _ZN19QTextDocumentWriterC1EP9QIODeviceRK10QByteArray @ 4614 NONAME
+ _ZN19QTextDocumentWriterC1ERK7QStringRK10QByteArray @ 4615 NONAME
+ _ZN19QTextDocumentWriterC1Ev @ 4616 NONAME
+ _ZN19QTextDocumentWriterC2EP9QIODeviceRK10QByteArray @ 4617 NONAME
+ _ZN19QTextDocumentWriterC2ERK7QStringRK10QByteArray @ 4618 NONAME
+ _ZN19QTextDocumentWriterC2Ev @ 4619 NONAME
+ _ZN19QTextDocumentWriterD1Ev @ 4620 NONAME
+ _ZN19QTextDocumentWriterD2Ev @ 4621 NONAME
+ _ZN19QToolBarChangeEventC1Eb @ 4622 NONAME
+ _ZN19QToolBarChangeEventC2Eb @ 4623 NONAME
+ _ZN19QToolBarChangeEventD0Ev @ 4624 NONAME
+ _ZN19QToolBarChangeEventD1Ev @ 4625 NONAME
+ _ZN19QToolBarChangeEventD2Ev @ 4626 NONAME
+ _ZN20QGraphicsBloomEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 4627 NONAME
+ _ZN20QGraphicsBloomEffect11qt_metacastEPKc @ 4628 NONAME
+ _ZN20QGraphicsBloomEffect11setBlurHintEN2Qt10RenderHintE @ 4629 NONAME
+ _ZN20QGraphicsBloomEffect11setStrengthEf @ 4630 NONAME
+ _ZN20QGraphicsBloomEffect13setBlurRadiusEi @ 4631 NONAME
+ _ZN20QGraphicsBloomEffect13setBrightnessEi @ 4632 NONAME
+ _ZN20QGraphicsBloomEffect15blurHintChangedEN2Qt10RenderHintE @ 4633 NONAME
+ _ZN20QGraphicsBloomEffect15strengthChangedEf @ 4634 NONAME
+ _ZN20QGraphicsBloomEffect16staticMetaObjectE @ 4635 NONAME DATA 16
+ _ZN20QGraphicsBloomEffect17blurRadiusChangedEi @ 4636 NONAME
+ _ZN20QGraphicsBloomEffect17brightnessChangedEi @ 4637 NONAME
+ _ZN20QGraphicsBloomEffect19getStaticMetaObjectEv @ 4638 NONAME
+ _ZN20QGraphicsBloomEffect4drawEP8QPainterP21QGraphicsEffectSource @ 4639 NONAME
+ _ZN20QGraphicsBloomEffectC1EP7QObject @ 4640 NONAME
+ _ZN20QGraphicsBloomEffectC2EP7QObject @ 4641 NONAME
+ _ZN20QGraphicsBloomEffectD0Ev @ 4642 NONAME
+ _ZN20QGraphicsBloomEffectD1Ev @ 4643 NONAME
+ _ZN20QGraphicsBloomEffectD2Ev @ 4644 NONAME
+ _ZN20QGraphicsEllipseItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4645 NONAME
+ _ZN20QGraphicsEllipseItem12setSpanAngleEi @ 4646 NONAME
+ _ZN20QGraphicsEllipseItem13setStartAngleEi @ 4647 NONAME
+ _ZN20QGraphicsEllipseItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4648 NONAME
+ _ZN20QGraphicsEllipseItem7setRectERK6QRectF @ 4649 NONAME
+ _ZN20QGraphicsEllipseItemC1EP13QGraphicsItemP14QGraphicsScene @ 4650 NONAME
+ _ZN20QGraphicsEllipseItemC1ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 4651 NONAME
+ _ZN20QGraphicsEllipseItemC1EffffP13QGraphicsItemP14QGraphicsScene @ 4652 NONAME
+ _ZN20QGraphicsEllipseItemC2EP13QGraphicsItemP14QGraphicsScene @ 4653 NONAME
+ _ZN20QGraphicsEllipseItemC2ERK6QRectFP13QGraphicsItemP14QGraphicsScene @ 4654 NONAME
+ _ZN20QGraphicsEllipseItemC2EffffP13QGraphicsItemP14QGraphicsScene @ 4655 NONAME
+ _ZN20QGraphicsEllipseItemD0Ev @ 4656 NONAME
+ _ZN20QGraphicsEllipseItemD1Ev @ 4657 NONAME
+ _ZN20QGraphicsEllipseItemD2Ev @ 4658 NONAME
+ _ZN20QGraphicsItemPrivate11removeChildEP13QGraphicsItem @ 4659 NONAME
+ _ZN20QGraphicsItemPrivate11setSubFocusEP13QGraphicsItem @ 4660 NONAME
+ _ZN20QGraphicsItemPrivate12remapItemPosEP6QEventP13QGraphicsItem @ 4661 NONAME
+ _ZN20QGraphicsItemPrivate12resolveDepthEv @ 4662 NONAME
+ _ZN20QGraphicsItemPrivate12setPosHelperERK7QPointF @ 4663 NONAME
+ _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItem @ 4664 NONAME
+ _ZN20QGraphicsItemPrivate14setFocusHelperEN2Qt11FocusReasonEb @ 4665 NONAME
+ _ZN20QGraphicsItemPrivate15resetFocusProxyEv @ 4666 NONAME
+ _ZN20QGraphicsItemPrivate16setEnabledHelperEbbb @ 4667 NONAME
+ _ZN20QGraphicsItemPrivate16setVisibleHelperEbbb @ 4668 NONAME
+ _ZN20QGraphicsItemPrivate18setIsMemberOfGroupEb @ 4669 NONAME
+ _ZN20QGraphicsItemPrivate18setTransformHelperERK10QTransform @ 4670 NONAME
+ _ZN20QGraphicsItemPrivate18subFocusItemChangeEv @ 4671 NONAME
+ _ZN20QGraphicsItemPrivate18updateAncestorFlagEN13QGraphicsItem16GraphicsItemFlagENS_12AncestorFlagEbb @ 4672 NONAME
+ _ZN20QGraphicsItemPrivate19setParentItemHelperEP13QGraphicsItem @ 4673 NONAME
+ _ZN20QGraphicsItemPrivate20removeExtraItemCacheEv @ 4674 NONAME
+ _ZN20QGraphicsItemPrivate23appendGraphicsTransformEP18QGraphicsTransform @ 4675 NONAME
+ _ZN20QGraphicsItemPrivate25movableAncestorIsSelectedEPK13QGraphicsItem @ 4676 NONAME
+ _ZN20QGraphicsItemPrivate26childrenBoundingRectHelperEP10QTransformP6QRectF @ 4677 NONAME
+ _ZN20QGraphicsItemPrivate26invalidateDepthRecursivelyEv @ 4678 NONAME
+ _ZN20QGraphicsItemPrivate28ensureSequentialSiblingIndexEv @ 4679 NONAME
+ _ZN20QGraphicsItemPrivate29ensureSceneTransformRecursiveEPP13QGraphicsItem @ 4680 NONAME
+ _ZN20QGraphicsItemPrivate30updateSceneTransformFromParentEv @ 4681 NONAME
+ _ZN20QGraphicsItemPrivate33setEmptyCachedClipPathRecursivelyERK6QRectF @ 4682 NONAME
+ _ZN20QGraphicsItemPrivate35invalidateCachedClipPathRecursivelyEbRK6QRectF @ 4683 NONAME
+ _ZN20QGraphicsItemPrivate36updateCachedClipPathFromSetPosHelperERK7QPointF @ 4684 NONAME
+ _ZN20QGraphicsItemPrivate8addChildEP13QGraphicsItem @ 4685 NONAME
+ _ZN20QGraphicsPolygonItem10setPolygonERK9QPolygonF @ 4686 NONAME
+ _ZN20QGraphicsPolygonItem11setFillRuleEN2Qt8FillRuleE @ 4687 NONAME
+ _ZN20QGraphicsPolygonItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 4688 NONAME
+ _ZN20QGraphicsPolygonItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4689 NONAME
+ _ZN20QGraphicsPolygonItemC1EP13QGraphicsItemP14QGraphicsScene @ 4690 NONAME
+ _ZN20QGraphicsPolygonItemC1ERK9QPolygonFP13QGraphicsItemP14QGraphicsScene @ 4691 NONAME
+ _ZN20QGraphicsPolygonItemC2EP13QGraphicsItemP14QGraphicsScene @ 4692 NONAME
+ _ZN20QGraphicsPolygonItemC2ERK9QPolygonFP13QGraphicsItemP14QGraphicsScene @ 4693 NONAME
+ _ZN20QGraphicsPolygonItemD0Ev @ 4694 NONAME
+ _ZN20QGraphicsPolygonItemD1Ev @ 4695 NONAME
+ _ZN20QGraphicsPolygonItemD2Ev @ 4696 NONAME
+ _ZN20QGraphicsProxyWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 4697 NONAME
+ _ZN20QGraphicsProxyWidget10wheelEventEP24QGraphicsSceneWheelEvent @ 4698 NONAME
+ _ZN20QGraphicsProxyWidget11eventFilterEP7QObjectP6QEvent @ 4699 NONAME
+ _ZN20QGraphicsProxyWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 4700 NONAME
+ _ZN20QGraphicsProxyWidget11qt_metacastEPKc @ 4701 NONAME
+ _ZN20QGraphicsProxyWidget11resizeEventEP25QGraphicsSceneResizeEvent @ 4702 NONAME
+ _ZN20QGraphicsProxyWidget11setGeometryERK6QRectF @ 4703 NONAME
+ _ZN20QGraphicsProxyWidget12focusInEventEP11QFocusEvent @ 4704 NONAME
+ _ZN20QGraphicsProxyWidget13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 4705 NONAME
+ _ZN20QGraphicsProxyWidget13focusOutEventEP11QFocusEvent @ 4706 NONAME
+ _ZN20QGraphicsProxyWidget13keyPressEventEP9QKeyEvent @ 4707 NONAME
+ _ZN20QGraphicsProxyWidget14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 4708 NONAME
+ _ZN20QGraphicsProxyWidget14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 4709 NONAME
+ _ZN20QGraphicsProxyWidget14grabMouseEventEP6QEvent @ 4710 NONAME
+ _ZN20QGraphicsProxyWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 4711 NONAME
+ _ZN20QGraphicsProxyWidget14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 4712 NONAME
+ _ZN20QGraphicsProxyWidget14newProxyWidgetEPK7QWidget @ 4713 NONAME
+ _ZN20QGraphicsProxyWidget15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 4714 NONAME
+ _ZN20QGraphicsProxyWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 4715 NONAME
+ _ZN20QGraphicsProxyWidget15keyReleaseEventEP9QKeyEvent @ 4716 NONAME
+ _ZN20QGraphicsProxyWidget15mousePressEventEP24QGraphicsSceneMouseEvent @ 4717 NONAME
+ _ZN20QGraphicsProxyWidget16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 4718 NONAME
+ _ZN20QGraphicsProxyWidget16staticMetaObjectE @ 4719 NONAME DATA 16
+ _ZN20QGraphicsProxyWidget16ungrabMouseEventEP6QEvent @ 4720 NONAME
+ _ZN20QGraphicsProxyWidget17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 4721 NONAME
+ _ZN20QGraphicsProxyWidget18focusNextPrevChildEb @ 4722 NONAME
+ _ZN20QGraphicsProxyWidget19getStaticMetaObjectEv @ 4723 NONAME
+ _ZN20QGraphicsProxyWidget21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 4724 NONAME
+ _ZN20QGraphicsProxyWidget25createProxyForChildWidgetEP7QWidget @ 4725 NONAME
+ _ZN20QGraphicsProxyWidget5eventEP6QEvent @ 4726 NONAME
+ _ZN20QGraphicsProxyWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 4727 NONAME
+ _ZN20QGraphicsProxyWidget9dropEventEP27QGraphicsSceneDragDropEvent @ 4728 NONAME
+ _ZN20QGraphicsProxyWidget9hideEventEP10QHideEvent @ 4729 NONAME
+ _ZN20QGraphicsProxyWidget9setWidgetEP7QWidget @ 4730 NONAME
+ _ZN20QGraphicsProxyWidget9showEventEP10QShowEvent @ 4731 NONAME
+ _ZN20QGraphicsProxyWidgetC1EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 4732 NONAME
+ _ZN20QGraphicsProxyWidgetC2EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 4733 NONAME
+ _ZN20QGraphicsProxyWidgetD0Ev @ 4734 NONAME
+ _ZN20QGraphicsProxyWidgetD1Ev @ 4735 NONAME
+ _ZN20QGraphicsProxyWidgetD2Ev @ 4736 NONAME
+ _ZN20QInputContextFactory11descriptionERK7QString @ 4737 NONAME
+ _ZN20QInputContextFactory11displayNameERK7QString @ 4738 NONAME
+ _ZN20QInputContextFactory4keysEv @ 4739 NONAME
+ _ZN20QInputContextFactory6createERK7QStringP7QObject @ 4740 NONAME
+ _ZN20QInputContextFactory9languagesERK7QString @ 4741 NONAME
+ _ZN20QPaintBufferResource11qt_metacallEN11QMetaObject4CallEiPPv @ 4742 NONAME
+ _ZN20QPaintBufferResource11qt_metacastEPKc @ 4743 NONAME
+ _ZN20QPaintBufferResource16staticMetaObjectE @ 4744 NONAME DATA 16
+ _ZN20QPaintBufferResource19getStaticMetaObjectEv @ 4745 NONAME
+ _ZN20QPaintBufferResource5valueEPK19QPaintBufferPrivate @ 4746 NONAME
+ _ZN20QPaintBufferResource6insertEPK19QPaintBufferPrivatePv @ 4747 NONAME
+ _ZN20QPaintBufferResource6removeEPK19QPaintBufferPrivate @ 4748 NONAME
+ _ZN20QPaintBufferResourceC1EPFvPvEP7QObject @ 4749 NONAME
+ _ZN20QPaintBufferResourceC2EPFvPvEP7QObject @ 4750 NONAME
+ _ZN20QPaintBufferResourceD0Ev @ 4751 NONAME
+ _ZN20QPaintBufferResourceD1Ev @ 4752 NONAME
+ _ZN20QPaintBufferResourceD2Ev @ 4753 NONAME
+ _ZN20QPictureFormatPlugin11loadPictureERK7QStringS2_P8QPicture @ 4754 NONAME
+ _ZN20QPictureFormatPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4755 NONAME
+ _ZN20QPictureFormatPlugin11qt_metacastEPKc @ 4756 NONAME
+ _ZN20QPictureFormatPlugin11savePictureERK7QStringS2_RK8QPicture @ 4757 NONAME
+ _ZN20QPictureFormatPlugin16staticMetaObjectE @ 4758 NONAME DATA 16
+ _ZN20QPictureFormatPlugin19getStaticMetaObjectEv @ 4759 NONAME
+ _ZN20QPictureFormatPluginC2EP7QObject @ 4760 NONAME
+ _ZN20QPictureFormatPluginD0Ev @ 4761 NONAME
+ _ZN20QPictureFormatPluginD1Ev @ 4762 NONAME
+ _ZN20QPictureFormatPluginD2Ev @ 4763 NONAME
+ _ZN20QRasterWindowSurface10beginPaintERK7QRegion @ 4764 NONAME
+ _ZN20QRasterWindowSurface11paintDeviceEv @ 4765 NONAME
+ _ZN20QRasterWindowSurface11setGeometryERK5QRect @ 4766 NONAME
+ _ZN20QRasterWindowSurface13prepareBufferEN6QImage6FormatEP7QWidget @ 4767 NONAME
+ _ZN20QRasterWindowSurface5flushEP7QWidgetRK7QRegionRK6QPoint @ 4768 NONAME
+ _ZN20QRasterWindowSurface6scrollERK7QRegionii @ 4769 NONAME
+ _ZN20QRasterWindowSurfaceC1EP7QWidget @ 4770 NONAME
+ _ZN20QRasterWindowSurfaceC2EP7QWidget @ 4771 NONAME
+ _ZN20QRasterWindowSurfaceD0Ev @ 4772 NONAME
+ _ZN20QRasterWindowSurfaceD1Ev @ 4773 NONAME
+ _ZN20QRasterWindowSurfaceD2Ev @ 4774 NONAME
+ _ZN20QStyleHintReturnMaskC1Ev @ 4775 NONAME
+ _ZN20QStyleHintReturnMaskC2Ev @ 4776 NONAME
+ _ZN20QStyleOptionComboBoxC1Ei @ 4777 NONAME
+ _ZN20QStyleOptionComboBoxC1Ev @ 4778 NONAME
+ _ZN20QStyleOptionComboBoxC2Ei @ 4779 NONAME
+ _ZN20QStyleOptionComboBoxC2Ev @ 4780 NONAME
+ _ZN20QStyleOptionGroupBoxC1Ei @ 4781 NONAME
+ _ZN20QStyleOptionGroupBoxC1Ev @ 4782 NONAME
+ _ZN20QStyleOptionGroupBoxC2Ei @ 4783 NONAME
+ _ZN20QStyleOptionGroupBoxC2Ev @ 4784 NONAME
+ _ZN20QStyleOptionMenuItemC1Ei @ 4785 NONAME
+ _ZN20QStyleOptionMenuItemC1Ev @ 4786 NONAME
+ _ZN20QStyleOptionMenuItemC2Ei @ 4787 NONAME
+ _ZN20QStyleOptionMenuItemC2Ev @ 4788 NONAME
+ _ZN20QStyleOptionSizeGripC1Ei @ 4789 NONAME
+ _ZN20QStyleOptionSizeGripC1Ev @ 4790 NONAME
+ _ZN20QStyleOptionSizeGripC2Ei @ 4791 NONAME
+ _ZN20QStyleOptionSizeGripC2Ev @ 4792 NONAME
+ _ZN20QStyleOptionTitleBarC1Ei @ 4793 NONAME
+ _ZN20QStyleOptionTitleBarC1Ev @ 4794 NONAME
+ _ZN20QStyleOptionTitleBarC2Ei @ 4795 NONAME
+ _ZN20QStyleOptionTitleBarC2Ev @ 4796 NONAME
+ _ZN20QStyleOptionViewItemC1Ei @ 4797 NONAME
+ _ZN20QStyleOptionViewItemC1Ev @ 4798 NONAME
+ _ZN20QStyleOptionViewItemC2Ei @ 4799 NONAME
+ _ZN20QStyleOptionViewItemC2Ev @ 4800 NONAME
+ _ZN20QTextFrameLayoutDataD0Ev @ 4801 NONAME
+ _ZN20QTextFrameLayoutDataD1Ev @ 4802 NONAME
+ _ZN20QTextFrameLayoutDataD2Ev @ 4803 NONAME
+ _ZN20QTextTableCellFormatC1ERK11QTextFormat @ 4804 NONAME
+ _ZN20QTextTableCellFormatC1Ev @ 4805 NONAME
+ _ZN20QTextTableCellFormatC2ERK11QTextFormat @ 4806 NONAME
+ _ZN20QTextTableCellFormatC2Ev @ 4807 NONAME
+ _ZN20QWidgetResizeHandler11eventFilterEP7QObjectP6QEvent @ 4808 NONAME
+ _ZN20QWidgetResizeHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 4809 NONAME
+ _ZN20QWidgetResizeHandler11qt_metacastEPKc @ 4810 NONAME
+ _ZN20QWidgetResizeHandler13keyPressEventEP9QKeyEvent @ 4811 NONAME
+ _ZN20QWidgetResizeHandler14mouseMoveEventEP11QMouseEvent @ 4812 NONAME
+ _ZN20QWidgetResizeHandler14setMouseCursorENS_13MousePositionE @ 4813 NONAME
+ _ZN20QWidgetResizeHandler16staticMetaObjectE @ 4814 NONAME DATA 16
+ _ZN20QWidgetResizeHandler19getStaticMetaObjectEv @ 4815 NONAME
+ _ZN20QWidgetResizeHandler6doMoveEv @ 4816 NONAME
+ _ZN20QWidgetResizeHandler8activateEv @ 4817 NONAME
+ _ZN20QWidgetResizeHandler8doResizeEv @ 4818 NONAME
+ _ZN20QWidgetResizeHandler9setActiveENS_6ActionEb @ 4819 NONAME
+ _ZN20QWidgetResizeHandlerC1EP7QWidgetS1_ @ 4820 NONAME
+ _ZN20QWidgetResizeHandlerC2EP7QWidgetS1_ @ 4821 NONAME
+ _ZN21QAbstractItemDelegate10commitDataEP7QWidget @ 4822 NONAME
+ _ZN21QAbstractItemDelegate10elidedTextERK12QFontMetricsiN2Qt13TextElideModeERK7QString @ 4823 NONAME
+ _ZN21QAbstractItemDelegate11closeEditorEP7QWidgetNS_11EndEditHintE @ 4824 NONAME
+ _ZN21QAbstractItemDelegate11editorEventEP6QEventP18QAbstractItemModelRK20QStyleOptionViewItemRK11QModelIndex @ 4825 NONAME
+ _ZN21QAbstractItemDelegate11qt_metacallEN11QMetaObject4CallEiPPv @ 4826 NONAME
+ _ZN21QAbstractItemDelegate11qt_metacastEPKc @ 4827 NONAME
+ _ZN21QAbstractItemDelegate15sizeHintChangedERK11QModelIndex @ 4828 NONAME
+ _ZN21QAbstractItemDelegate16staticMetaObjectE @ 4829 NONAME DATA 16
+ _ZN21QAbstractItemDelegate19getStaticMetaObjectEv @ 4830 NONAME
+ _ZN21QAbstractItemDelegate9helpEventEP10QHelpEventP17QAbstractItemViewRK20QStyleOptionViewItemRK11QModelIndex @ 4831 NONAME
+ _ZN21QAbstractItemDelegateC2EP7QObject @ 4832 NONAME
+ _ZN21QAbstractItemDelegateC2ER14QObjectPrivateP7QObject @ 4833 NONAME
+ _ZN21QAbstractItemDelegateD0Ev @ 4834 NONAME
+ _ZN21QAbstractItemDelegateD1Ev @ 4835 NONAME
+ _ZN21QAbstractItemDelegateD2Ev @ 4836 NONAME
+ _ZN21QGraphicsAnchorLayout10addAnchorsEP19QGraphicsLayoutItemS1_6QFlagsIN2Qt11OrientationEE @ 4837 NONAME
+ _ZN21QGraphicsAnchorLayout10invalidateEv @ 4838 NONAME
+ _ZN21QGraphicsAnchorLayout10setSpacingEf @ 4839 NONAME
+ _ZN21QGraphicsAnchorLayout11setGeometryERK6QRectF @ 4840 NONAME
+ _ZN21QGraphicsAnchorLayout16addCornerAnchorsEP19QGraphicsLayoutItemN2Qt6CornerES1_S3_ @ 4841 NONAME
+ _ZN21QGraphicsAnchorLayout18setVerticalSpacingEf @ 4842 NONAME
+ _ZN21QGraphicsAnchorLayout20setHorizontalSpacingEf @ 4843 NONAME
+ _ZN21QGraphicsAnchorLayout6anchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 4844 NONAME
+ _ZN21QGraphicsAnchorLayout8removeAtEi @ 4845 NONAME
+ _ZN21QGraphicsAnchorLayout9addAnchorEP19QGraphicsLayoutItemN2Qt11AnchorPointES1_S3_ @ 4846 NONAME
+ _ZN21QGraphicsAnchorLayoutC1EP19QGraphicsLayoutItem @ 4847 NONAME
+ _ZN21QGraphicsAnchorLayoutC2EP19QGraphicsLayoutItem @ 4848 NONAME
+ _ZN21QGraphicsAnchorLayoutD0Ev @ 4849 NONAME
+ _ZN21QGraphicsAnchorLayoutD1Ev @ 4850 NONAME
+ _ZN21QGraphicsAnchorLayoutD2Ev @ 4851 NONAME
+ _ZN21QGraphicsEffectSource11qt_metacallEN11QMetaObject4CallEiPPv @ 4852 NONAME
+ _ZN21QGraphicsEffectSource11qt_metacastEPKc @ 4853 NONAME
+ _ZN21QGraphicsEffectSource16staticMetaObjectE @ 4854 NONAME DATA 16
+ _ZN21QGraphicsEffectSource19getStaticMetaObjectEv @ 4855 NONAME
+ _ZN21QGraphicsEffectSource4drawEP8QPainter @ 4856 NONAME
+ _ZN21QGraphicsEffectSource6updateEv @ 4857 NONAME
+ _ZN21QGraphicsEffectSourceC1ER28QGraphicsEffectSourcePrivateP7QObject @ 4858 NONAME
+ _ZN21QGraphicsEffectSourceC2ER28QGraphicsEffectSourcePrivateP7QObject @ 4859 NONAME
+ _ZN21QGraphicsEffectSourceD0Ev @ 4860 NONAME
+ _ZN21QGraphicsEffectSourceD1Ev @ 4861 NONAME
+ _ZN21QGraphicsEffectSourceD2Ev @ 4862 NONAME
+ _ZN21QGraphicsLinearLayout10insertItemEiP19QGraphicsLayoutItem @ 4863 NONAME
+ _ZN21QGraphicsLinearLayout10invalidateEv @ 4864 NONAME
+ _ZN21QGraphicsLinearLayout10removeItemEP19QGraphicsLayoutItem @ 4865 NONAME
+ _ZN21QGraphicsLinearLayout10setSpacingEf @ 4866 NONAME
+ _ZN21QGraphicsLinearLayout11setGeometryERK6QRectF @ 4867 NONAME
+ _ZN21QGraphicsLinearLayout12setAlignmentEP19QGraphicsLayoutItem6QFlagsIN2Qt13AlignmentFlagEE @ 4868 NONAME
+ _ZN21QGraphicsLinearLayout13insertStretchEii @ 4869 NONAME
+ _ZN21QGraphicsLinearLayout14setItemSpacingEif @ 4870 NONAME
+ _ZN21QGraphicsLinearLayout14setOrientationEN2Qt11OrientationE @ 4871 NONAME
+ _ZN21QGraphicsLinearLayout16setStretchFactorEP19QGraphicsLayoutItemi @ 4872 NONAME
+ _ZN21QGraphicsLinearLayout8removeAtEi @ 4873 NONAME
+ _ZN21QGraphicsLinearLayoutC1EN2Qt11OrientationEP19QGraphicsLayoutItem @ 4874 NONAME
+ _ZN21QGraphicsLinearLayoutC1EP19QGraphicsLayoutItem @ 4875 NONAME
+ _ZN21QGraphicsLinearLayoutC2EN2Qt11OrientationEP19QGraphicsLayoutItem @ 4876 NONAME
+ _ZN21QGraphicsLinearLayoutC2EP19QGraphicsLayoutItem @ 4877 NONAME
+ _ZN21QGraphicsLinearLayoutD0Ev @ 4878 NONAME
+ _ZN21QGraphicsLinearLayoutD1Ev @ 4879 NONAME
+ _ZN21QGraphicsLinearLayoutD2Ev @ 4880 NONAME
+ _ZN21QGraphicsSystemPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 4881 NONAME
+ _ZN21QGraphicsSystemPlugin11qt_metacastEPKc @ 4882 NONAME
+ _ZN21QGraphicsSystemPlugin16staticMetaObjectE @ 4883 NONAME DATA 16
+ _ZN21QGraphicsSystemPlugin19getStaticMetaObjectEv @ 4884 NONAME
+ _ZN21QGraphicsSystemPluginC2EP7QObject @ 4885 NONAME
+ _ZN21QGraphicsSystemPluginD0Ev @ 4886 NONAME
+ _ZN21QGraphicsSystemPluginD1Ev @ 4887 NONAME
+ _ZN21QGraphicsSystemPluginD2Ev @ 4888 NONAME
+ _ZN21QMouseEventTransition11qt_metacallEN11QMetaObject4CallEiPPv @ 4889 NONAME
+ _ZN21QMouseEventTransition11qt_metacastEPKc @ 4890 NONAME
+ _ZN21QMouseEventTransition12onTransitionEP6QEvent @ 4891 NONAME
+ _ZN21QMouseEventTransition16setModifiersMaskE6QFlagsIN2Qt16KeyboardModifierEE @ 4892 NONAME
+ _ZN21QMouseEventTransition16staticMetaObjectE @ 4893 NONAME DATA 16
+ _ZN21QMouseEventTransition19getStaticMetaObjectEv @ 4894 NONAME
+ _ZN21QMouseEventTransition7setPathERK12QPainterPath @ 4895 NONAME
+ _ZN21QMouseEventTransition9eventTestEP6QEvent @ 4896 NONAME
+ _ZN21QMouseEventTransition9setButtonEN2Qt11MouseButtonE @ 4897 NONAME
+ _ZN21QMouseEventTransitionC1EP6QState @ 4898 NONAME
+ _ZN21QMouseEventTransitionC1EP7QObjectN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 4899 NONAME
+ _ZN21QMouseEventTransitionC2EP6QState @ 4900 NONAME
+ _ZN21QMouseEventTransitionC2EP7QObjectN6QEvent4TypeEN2Qt11MouseButtonEP6QState @ 4901 NONAME
+ _ZN21QMouseEventTransitionD0Ev @ 4902 NONAME
+ _ZN21QMouseEventTransitionD1Ev @ 4903 NONAME
+ _ZN21QMouseEventTransitionD2Ev @ 4904 NONAME
+ _ZN21QPaintEngineExPrivate20replayClipOperationsEv @ 4905 NONAME
+ _ZN21QPaintEngineExPrivateC1Ev @ 4906 NONAME
+ _ZN21QPaintEngineExPrivateC2Ev @ 4907 NONAME
+ _ZN21QPaintEngineExPrivateD0Ev @ 4908 NONAME
+ _ZN21QPaintEngineExPrivateD1Ev @ 4909 NONAME
+ _ZN21QPaintEngineExPrivateD2Ev @ 4910 NONAME
+ _ZN21QPixmapColorizeFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 4911 NONAME
+ _ZN21QPixmapColorizeFilter11qt_metacastEPKc @ 4912 NONAME
+ _ZN21QPixmapColorizeFilter11setStrengthEf @ 4913 NONAME
+ _ZN21QPixmapColorizeFilter16staticMetaObjectE @ 4914 NONAME DATA 16
+ _ZN21QPixmapColorizeFilter19getStaticMetaObjectEv @ 4915 NONAME
+ _ZN21QPixmapColorizeFilter8setColorERK6QColor @ 4916 NONAME
+ _ZN21QPixmapColorizeFilterC1EP7QObject @ 4917 NONAME
+ _ZN21QPixmapColorizeFilterC2EP7QObject @ 4918 NONAME
+ _ZN21QSortFilterProxyModel10insertRowsEiiRK11QModelIndex @ 4919 NONAME
+ _ZN21QSortFilterProxyModel10invalidateEv @ 4920 NONAME
+ _ZN21QSortFilterProxyModel10removeRowsEiiRK11QModelIndex @ 4921 NONAME
+ _ZN21QSortFilterProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 4922 NONAME
+ _ZN21QSortFilterProxyModel11qt_metacastEPKc @ 4923 NONAME
+ _ZN21QSortFilterProxyModel11setSortRoleEi @ 4924 NONAME
+ _ZN21QSortFilterProxyModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 4925 NONAME
+ _ZN21QSortFilterProxyModel13filterChangedEv @ 4926 NONAME
+ _ZN21QSortFilterProxyModel13insertColumnsEiiRK11QModelIndex @ 4927 NONAME
+ _ZN21QSortFilterProxyModel13removeColumnsEiiRK11QModelIndex @ 4928 NONAME
+ _ZN21QSortFilterProxyModel13setFilterRoleEi @ 4929 NONAME
+ _ZN21QSortFilterProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 4930 NONAME
+ _ZN21QSortFilterProxyModel14setSourceModelEP18QAbstractItemModel @ 4931 NONAME
+ _ZN21QSortFilterProxyModel15setFilterRegExpERK7QRegExp @ 4932 NONAME
+ _ZN21QSortFilterProxyModel15setFilterRegExpERK7QString @ 4933 NONAME
+ _ZN21QSortFilterProxyModel16invalidateFilterEv @ 4934 NONAME
+ _ZN21QSortFilterProxyModel16staticMetaObjectE @ 4935 NONAME DATA 16
+ _ZN21QSortFilterProxyModel17setFilterWildcardERK7QString @ 4936 NONAME
+ _ZN21QSortFilterProxyModel18setFilterKeyColumnEi @ 4937 NONAME
+ _ZN21QSortFilterProxyModel18setSortLocaleAwareEb @ 4938 NONAME
+ _ZN21QSortFilterProxyModel19getStaticMetaObjectEv @ 4939 NONAME
+ _ZN21QSortFilterProxyModel20setDynamicSortFilterEb @ 4940 NONAME
+ _ZN21QSortFilterProxyModel20setFilterFixedStringERK7QString @ 4941 NONAME
+ _ZN21QSortFilterProxyModel22setSortCaseSensitivityEN2Qt15CaseSensitivityE @ 4942 NONAME
+ _ZN21QSortFilterProxyModel24setFilterCaseSensitivityEN2Qt15CaseSensitivityE @ 4943 NONAME
+ _ZN21QSortFilterProxyModel4sortEiN2Qt9SortOrderE @ 4944 NONAME
+ _ZN21QSortFilterProxyModel5clearEv @ 4945 NONAME
+ _ZN21QSortFilterProxyModel7setDataERK11QModelIndexRK8QVarianti @ 4946 NONAME
+ _ZN21QSortFilterProxyModel9fetchMoreERK11QModelIndex @ 4947 NONAME
+ _ZN21QSortFilterProxyModelC1EP7QObject @ 4948 NONAME
+ _ZN21QSortFilterProxyModelC2EP7QObject @ 4949 NONAME
+ _ZN21QSortFilterProxyModelD0Ev @ 4950 NONAME
+ _ZN21QSortFilterProxyModelD1Ev @ 4951 NONAME
+ _ZN21QSortFilterProxyModelD2Ev @ 4952 NONAME
+ _ZN21QStyleOptionFocusRectC1Ei @ 4953 NONAME
+ _ZN21QStyleOptionFocusRectC1Ev @ 4954 NONAME
+ _ZN21QStyleOptionFocusRectC2Ei @ 4955 NONAME
+ _ZN21QStyleOptionFocusRectC2Ev @ 4956 NONAME
+ _ZN21QStyleOptionToolBoxV2C1ERK19QStyleOptionToolBox @ 4957 NONAME
+ _ZN21QStyleOptionToolBoxV2C1Ei @ 4958 NONAME
+ _ZN21QStyleOptionToolBoxV2C1Ev @ 4959 NONAME
+ _ZN21QStyleOptionToolBoxV2C2ERK19QStyleOptionToolBox @ 4960 NONAME
+ _ZN21QStyleOptionToolBoxV2C2Ei @ 4961 NONAME
+ _ZN21QStyleOptionToolBoxV2C2Ev @ 4962 NONAME
+ _ZN21QStyleOptionToolBoxV2aSERK19QStyleOptionToolBox @ 4963 NONAME
+ _ZN21QTextDocumentFragment13fromPlainTextERK7QString @ 4964 NONAME
+ _ZN21QTextDocumentFragment8fromHtmlERK7QString @ 4965 NONAME
+ _ZN21QTextDocumentFragment8fromHtmlERK7QStringPK13QTextDocument @ 4966 NONAME
+ _ZN21QTextDocumentFragmentC1EPK13QTextDocument @ 4967 NONAME
+ _ZN21QTextDocumentFragmentC1ERK11QTextCursor @ 4968 NONAME
+ _ZN21QTextDocumentFragmentC1ERKS_ @ 4969 NONAME
+ _ZN21QTextDocumentFragmentC1Ev @ 4970 NONAME
+ _ZN21QTextDocumentFragmentC2EPK13QTextDocument @ 4971 NONAME
+ _ZN21QTextDocumentFragmentC2ERK11QTextCursor @ 4972 NONAME
+ _ZN21QTextDocumentFragmentC2ERKS_ @ 4973 NONAME
+ _ZN21QTextDocumentFragmentC2Ev @ 4974 NONAME
+ _ZN21QTextDocumentFragmentD1Ev @ 4975 NONAME
+ _ZN21QTextDocumentFragmentD2Ev @ 4976 NONAME
+ _ZN21QTextDocumentFragmentaSERKS_ @ 4977 NONAME
+ _ZN21QTextFormatCollection14indexForFormatERK11QTextFormat @ 4978 NONAME
+ _ZN21QTextFormatCollection14setDefaultFontERK5QFont @ 4979 NONAME
+ _ZN21QTextFormatCollection15setObjectFormatEiRK11QTextFormat @ 4980 NONAME
+ _ZN21QTextFormatCollection17createObjectIndexERK11QTextFormat @ 4981 NONAME
+ _ZN21QTextFormatCollection20setObjectFormatIndexEii @ 4982 NONAME
+ _ZN21QTextFormatCollectionC1ERKS_ @ 4983 NONAME
+ _ZN21QTextFormatCollectionC2ERKS_ @ 4984 NONAME
+ _ZN21QTextFormatCollectionD1Ev @ 4985 NONAME
+ _ZN21QTextFormatCollectionD2Ev @ 4986 NONAME
+ _ZN21QTextFormatCollectionaSERKS_ @ 4987 NONAME
+ _ZN22QGraphicsItemAnimation10setScaleAtEfff @ 4988 NONAME
+ _ZN22QGraphicsItemAnimation10setShearAtEfff @ 4989 NONAME
+ _ZN22QGraphicsItemAnimation11qt_metacallEN11QMetaObject4CallEiPPv @ 4990 NONAME
+ _ZN22QGraphicsItemAnimation11qt_metacastEPKc @ 4991 NONAME
+ _ZN22QGraphicsItemAnimation11setTimeLineEP9QTimeLine @ 4992 NONAME
+ _ZN22QGraphicsItemAnimation13setRotationAtEff @ 4993 NONAME
+ _ZN22QGraphicsItemAnimation16setTranslationAtEfff @ 4994 NONAME
+ _ZN22QGraphicsItemAnimation16staticMetaObjectE @ 4995 NONAME DATA 16
+ _ZN22QGraphicsItemAnimation18afterAnimationStepEf @ 4996 NONAME
+ _ZN22QGraphicsItemAnimation19beforeAnimationStepEf @ 4997 NONAME
+ _ZN22QGraphicsItemAnimation19getStaticMetaObjectEv @ 4998 NONAME
+ _ZN22QGraphicsItemAnimation5clearEv @ 4999 NONAME
+ _ZN22QGraphicsItemAnimation5resetEv @ 5000 NONAME
+ _ZN22QGraphicsItemAnimation7setItemEP13QGraphicsItem @ 5001 NONAME
+ _ZN22QGraphicsItemAnimation7setStepEf @ 5002 NONAME
+ _ZN22QGraphicsItemAnimation8setPosAtEfRK7QPointF @ 5003 NONAME
+ _ZN22QGraphicsItemAnimationC1EP7QObject @ 5004 NONAME
+ _ZN22QGraphicsItemAnimationC2EP7QObject @ 5005 NONAME
+ _ZN22QGraphicsItemAnimationD0Ev @ 5006 NONAME
+ _ZN22QGraphicsItemAnimationD1Ev @ 5007 NONAME
+ _ZN22QGraphicsItemAnimationD2Ev @ 5008 NONAME
+ _ZN22QGraphicsOpacityEffect10setOpacityEf @ 5009 NONAME
+ _ZN22QGraphicsOpacityEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 5010 NONAME
+ _ZN22QGraphicsOpacityEffect11qt_metacastEPKc @ 5011 NONAME
+ _ZN22QGraphicsOpacityEffect14opacityChangedEf @ 5012 NONAME
+ _ZN22QGraphicsOpacityEffect14setOpacityMaskERK6QBrush @ 5013 NONAME
+ _ZN22QGraphicsOpacityEffect16staticMetaObjectE @ 5014 NONAME DATA 16
+ _ZN22QGraphicsOpacityEffect18opacityMaskChangedERK6QBrush @ 5015 NONAME
+ _ZN22QGraphicsOpacityEffect19getStaticMetaObjectEv @ 5016 NONAME
+ _ZN22QGraphicsOpacityEffect4drawEP8QPainterP21QGraphicsEffectSource @ 5017 NONAME
+ _ZN22QGraphicsOpacityEffectC1EP7QObject @ 5018 NONAME
+ _ZN22QGraphicsOpacityEffectC2EP7QObject @ 5019 NONAME
+ _ZN22QGraphicsOpacityEffectD0Ev @ 5020 NONAME
+ _ZN22QGraphicsOpacityEffectD1Ev @ 5021 NONAME
+ _ZN22QGraphicsOpacityEffectD2Ev @ 5022 NONAME
+ _ZN22QPaintEngineExReplayer7processERK19QPaintBufferCommand @ 5023 NONAME
+ _ZN22QStyleOptionDockWidgetC1Ei @ 5024 NONAME
+ _ZN22QStyleOptionDockWidgetC1Ev @ 5025 NONAME
+ _ZN22QStyleOptionDockWidgetC2Ei @ 5026 NONAME
+ _ZN22QStyleOptionDockWidgetC2Ev @ 5027 NONAME
+ _ZN22QStyleOptionQ3ListViewC1Ei @ 5028 NONAME
+ _ZN22QStyleOptionQ3ListViewC1Ev @ 5029 NONAME
+ _ZN22QStyleOptionQ3ListViewC2Ei @ 5030 NONAME
+ _ZN22QStyleOptionQ3ListViewC2Ev @ 5031 NONAME
+ _ZN22QStyleOptionRubberBandC1Ei @ 5032 NONAME
+ _ZN22QStyleOptionRubberBandC1Ev @ 5033 NONAME
+ _ZN22QStyleOptionRubberBandC2Ei @ 5034 NONAME
+ _ZN22QStyleOptionRubberBandC2Ev @ 5035 NONAME
+ _ZN22QStyleOptionTabBarBaseC1Ei @ 5036 NONAME
+ _ZN22QStyleOptionTabBarBaseC1Ev @ 5037 NONAME
+ _ZN22QStyleOptionTabBarBaseC2Ei @ 5038 NONAME
+ _ZN22QStyleOptionTabBarBaseC2Ev @ 5039 NONAME
+ _ZN22QStyleOptionToolButtonC1Ei @ 5040 NONAME
+ _ZN22QStyleOptionToolButtonC1Ev @ 5041 NONAME
+ _ZN22QStyleOptionToolButtonC2Ei @ 5042 NONAME
+ _ZN22QStyleOptionToolButtonC2Ev @ 5043 NONAME
+ _ZN22QStyleOptionViewItemV2C1ERK20QStyleOptionViewItem @ 5044 NONAME
+ _ZN22QStyleOptionViewItemV2C1Ei @ 5045 NONAME
+ _ZN22QStyleOptionViewItemV2C1Ev @ 5046 NONAME
+ _ZN22QStyleOptionViewItemV2C2ERK20QStyleOptionViewItem @ 5047 NONAME
+ _ZN22QStyleOptionViewItemV2C2Ei @ 5048 NONAME
+ _ZN22QStyleOptionViewItemV2C2Ev @ 5049 NONAME
+ _ZN22QStyleOptionViewItemV2aSERK20QStyleOptionViewItem @ 5050 NONAME
+ _ZN22QStyleOptionViewItemV3C1ERK20QStyleOptionViewItem @ 5051 NONAME
+ _ZN22QStyleOptionViewItemV3C1Ei @ 5052 NONAME
+ _ZN22QStyleOptionViewItemV3C1Ev @ 5053 NONAME
+ _ZN22QStyleOptionViewItemV3C2ERK20QStyleOptionViewItem @ 5054 NONAME
+ _ZN22QStyleOptionViewItemV3C2Ei @ 5055 NONAME
+ _ZN22QStyleOptionViewItemV3C2Ev @ 5056 NONAME
+ _ZN22QStyleOptionViewItemV3aSERK20QStyleOptionViewItem @ 5057 NONAME
+ _ZN22QStyleOptionViewItemV4C1ERK20QStyleOptionViewItem @ 5058 NONAME
+ _ZN22QStyleOptionViewItemV4C1Ei @ 5059 NONAME
+ _ZN22QStyleOptionViewItemV4C1Ev @ 5060 NONAME
+ _ZN22QStyleOptionViewItemV4C2ERK20QStyleOptionViewItem @ 5061 NONAME
+ _ZN22QStyleOptionViewItemV4C2Ei @ 5062 NONAME
+ _ZN22QStyleOptionViewItemV4C2Ev @ 5063 NONAME
+ _ZN22QStyleOptionViewItemV4aSERK20QStyleOptionViewItem @ 5064 NONAME
+ _ZN22QWhatsThisClickedEventC1ERK7QString @ 5065 NONAME
+ _ZN22QWhatsThisClickedEventC2ERK7QString @ 5066 NONAME
+ _ZN22QWhatsThisClickedEventD0Ev @ 5067 NONAME
+ _ZN22QWhatsThisClickedEventD1Ev @ 5068 NONAME
+ _ZN22QWhatsThisClickedEventD2Ev @ 5069 NONAME
+ _ZN23QGraphicsColorizeEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 5070 NONAME
+ _ZN23QGraphicsColorizeEffect11qt_metacastEPKc @ 5071 NONAME
+ _ZN23QGraphicsColorizeEffect11setStrengthEf @ 5072 NONAME
+ _ZN23QGraphicsColorizeEffect12colorChangedERK6QColor @ 5073 NONAME
+ _ZN23QGraphicsColorizeEffect15strengthChangedEf @ 5074 NONAME
+ _ZN23QGraphicsColorizeEffect16staticMetaObjectE @ 5075 NONAME DATA 16
+ _ZN23QGraphicsColorizeEffect19getStaticMetaObjectEv @ 5076 NONAME
+ _ZN23QGraphicsColorizeEffect4drawEP8QPainterP21QGraphicsEffectSource @ 5077 NONAME
+ _ZN23QGraphicsColorizeEffect8setColorERK6QColor @ 5078 NONAME
+ _ZN23QGraphicsColorizeEffectC1EP7QObject @ 5079 NONAME
+ _ZN23QGraphicsColorizeEffectC2EP7QObject @ 5080 NONAME
+ _ZN23QGraphicsColorizeEffectD0Ev @ 5081 NONAME
+ _ZN23QGraphicsColorizeEffectD1Ev @ 5082 NONAME
+ _ZN23QGraphicsColorizeEffectD2Ev @ 5083 NONAME
+ _ZN23QGraphicsPixelizeEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 5084 NONAME
+ _ZN23QGraphicsPixelizeEffect11qt_metacastEPKc @ 5085 NONAME
+ _ZN23QGraphicsPixelizeEffect12setPixelSizeEi @ 5086 NONAME
+ _ZN23QGraphicsPixelizeEffect16pixelSizeChangedEi @ 5087 NONAME
+ _ZN23QGraphicsPixelizeEffect16staticMetaObjectE @ 5088 NONAME DATA 16
+ _ZN23QGraphicsPixelizeEffect19getStaticMetaObjectEv @ 5089 NONAME
+ _ZN23QGraphicsPixelizeEffect4drawEP8QPainterP21QGraphicsEffectSource @ 5090 NONAME
+ _ZN23QGraphicsPixelizeEffectC1EP7QObject @ 5091 NONAME
+ _ZN23QGraphicsPixelizeEffectC2EP7QObject @ 5092 NONAME
+ _ZN23QGraphicsPixelizeEffectD0Ev @ 5093 NONAME
+ _ZN23QGraphicsPixelizeEffectD1Ev @ 5094 NONAME
+ _ZN23QGraphicsPixelizeEffectD2Ev @ 5095 NONAME
+ _ZN23QGraphicsSceneHelpEvent11setScenePosERK7QPointF @ 5096 NONAME
+ _ZN23QGraphicsSceneHelpEvent12setScreenPosERK6QPoint @ 5097 NONAME
+ _ZN23QGraphicsSceneHelpEventC1EN6QEvent4TypeE @ 5098 NONAME
+ _ZN23QGraphicsSceneHelpEventC2EN6QEvent4TypeE @ 5099 NONAME
+ _ZN23QGraphicsSceneHelpEventD0Ev @ 5100 NONAME
+ _ZN23QGraphicsSceneHelpEventD1Ev @ 5101 NONAME
+ _ZN23QGraphicsSceneHelpEventD2Ev @ 5102 NONAME
+ _ZN23QGraphicsSceneMoveEvent9setNewPosERK7QPointF @ 5103 NONAME
+ _ZN23QGraphicsSceneMoveEvent9setOldPosERK7QPointF @ 5104 NONAME
+ _ZN23QGraphicsSceneMoveEventC1Ev @ 5105 NONAME
+ _ZN23QGraphicsSceneMoveEventC2Ev @ 5106 NONAME
+ _ZN23QGraphicsSceneMoveEventD0Ev @ 5107 NONAME
+ _ZN23QGraphicsSceneMoveEventD1Ev @ 5108 NONAME
+ _ZN23QGraphicsSceneMoveEventD2Ev @ 5109 NONAME
+ _ZN23QGraphicsSimpleTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 5110 NONAME
+ _ZN23QGraphicsSimpleTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 5111 NONAME
+ _ZN23QGraphicsSimpleTextItem7setFontERK5QFont @ 5112 NONAME
+ _ZN23QGraphicsSimpleTextItem7setTextERK7QString @ 5113 NONAME
+ _ZN23QGraphicsSimpleTextItemC1EP13QGraphicsItemP14QGraphicsScene @ 5114 NONAME
+ _ZN23QGraphicsSimpleTextItemC1ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 5115 NONAME
+ _ZN23QGraphicsSimpleTextItemC2EP13QGraphicsItemP14QGraphicsScene @ 5116 NONAME
+ _ZN23QGraphicsSimpleTextItemC2ERK7QStringP13QGraphicsItemP14QGraphicsScene @ 5117 NONAME
+ _ZN23QGraphicsSimpleTextItemD0Ev @ 5118 NONAME
+ _ZN23QGraphicsSimpleTextItemD1Ev @ 5119 NONAME
+ _ZN23QGraphicsSimpleTextItemD2Ev @ 5120 NONAME
+ _ZN23QPaintBufferSignalProxy11qt_metacallEN11QMetaObject4CallEiPPv @ 5121 NONAME
+ _ZN23QPaintBufferSignalProxy11qt_metacastEPKc @ 5122 NONAME
+ _ZN23QPaintBufferSignalProxy14aboutToDestroyEPK19QPaintBufferPrivate @ 5123 NONAME
+ _ZN23QPaintBufferSignalProxy16staticMetaObjectE @ 5124 NONAME DATA 16
+ _ZN23QPaintBufferSignalProxy19getStaticMetaObjectEv @ 5125 NONAME
+ _ZN23QPaintBufferSignalProxy8instanceEv @ 5126 NONAME
+ _ZN23QPixmapDropShadowFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 5127 NONAME
+ _ZN23QPixmapDropShadowFilter11qt_metacastEPKc @ 5128 NONAME
+ _ZN23QPixmapDropShadowFilter13setBlurRadiusEi @ 5129 NONAME
+ _ZN23QPixmapDropShadowFilter16staticMetaObjectE @ 5130 NONAME DATA 16
+ _ZN23QPixmapDropShadowFilter19getStaticMetaObjectEv @ 5131 NONAME
+ _ZN23QPixmapDropShadowFilter8setColorERK6QColor @ 5132 NONAME
+ _ZN23QPixmapDropShadowFilter9setOffsetERK7QPointF @ 5133 NONAME
+ _ZN23QPixmapDropShadowFilterC1EP7QObject @ 5134 NONAME
+ _ZN23QPixmapDropShadowFilterC2EP7QObject @ 5135 NONAME
+ _ZN23QPixmapDropShadowFilterD0Ev @ 5136 NONAME
+ _ZN23QPixmapDropShadowFilterD1Ev @ 5137 NONAME
+ _ZN23QPixmapDropShadowFilterD2Ev @ 5138 NONAME
+ _ZN23QStyleHintReturnVariantC1Ev @ 5139 NONAME
+ _ZN23QStyleHintReturnVariantC2Ev @ 5140 NONAME
+ _ZN23QStyleOptionProgressBarC1Ei @ 5141 NONAME
+ _ZN23QStyleOptionProgressBarC1Ev @ 5142 NONAME
+ _ZN23QStyleOptionProgressBarC2Ei @ 5143 NONAME
+ _ZN23QStyleOptionProgressBarC2Ev @ 5144 NONAME
+ _ZN23QTreeWidgetItemIteratorC1EP11QTreeWidget6QFlagsINS_12IteratorFlagEE @ 5145 NONAME
+ _ZN23QTreeWidgetItemIteratorC1EP15QTreeWidgetItem6QFlagsINS_12IteratorFlagEE @ 5146 NONAME
+ _ZN23QTreeWidgetItemIteratorC1ERKS_ @ 5147 NONAME
+ _ZN23QTreeWidgetItemIteratorC2EP11QTreeWidget6QFlagsINS_12IteratorFlagEE @ 5148 NONAME
+ _ZN23QTreeWidgetItemIteratorC2EP15QTreeWidgetItem6QFlagsINS_12IteratorFlagEE @ 5149 NONAME
+ _ZN23QTreeWidgetItemIteratorC2ERKS_ @ 5150 NONAME
+ _ZN23QTreeWidgetItemIteratorD1Ev @ 5151 NONAME
+ _ZN23QTreeWidgetItemIteratorD2Ev @ 5152 NONAME
+ _ZN23QTreeWidgetItemIteratoraSERKS_ @ 5153 NONAME
+ _ZN23QTreeWidgetItemIteratormmEv @ 5154 NONAME
+ _ZN23QTreeWidgetItemIteratorppEv @ 5155 NONAME
+ _ZN23QWindowStateChangeEventC1E6QFlagsIN2Qt11WindowStateEE @ 5156 NONAME
+ _ZN23QWindowStateChangeEventC1E6QFlagsIN2Qt11WindowStateEEb @ 5157 NONAME
+ _ZN23QWindowStateChangeEventC2E6QFlagsIN2Qt11WindowStateEE @ 5158 NONAME
+ _ZN23QWindowStateChangeEventC2E6QFlagsIN2Qt11WindowStateEEb @ 5159 NONAME
+ _ZN23QWindowStateChangeEventD0Ev @ 5160 NONAME
+ _ZN23QWindowStateChangeEventD1Ev @ 5161 NONAME
+ _ZN23QWindowStateChangeEventD2Ev @ 5162 NONAME
+ _ZN24QGraphicsGrayscaleEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 5163 NONAME
+ _ZN24QGraphicsGrayscaleEffect11qt_metacastEPKc @ 5164 NONAME
+ _ZN24QGraphicsGrayscaleEffect11setStrengthEf @ 5165 NONAME
+ _ZN24QGraphicsGrayscaleEffect15strengthChangedEf @ 5166 NONAME
+ _ZN24QGraphicsGrayscaleEffect16staticMetaObjectE @ 5167 NONAME DATA 16
+ _ZN24QGraphicsGrayscaleEffect19getStaticMetaObjectEv @ 5168 NONAME
+ _ZN24QGraphicsGrayscaleEffect4drawEP8QPainterP21QGraphicsEffectSource @ 5169 NONAME
+ _ZN24QGraphicsGrayscaleEffectC1EP7QObject @ 5170 NONAME
+ _ZN24QGraphicsGrayscaleEffectC2EP7QObject @ 5171 NONAME
+ _ZN24QGraphicsGrayscaleEffectD0Ev @ 5172 NONAME
+ _ZN24QGraphicsGrayscaleEffectD1Ev @ 5173 NONAME
+ _ZN24QGraphicsGrayscaleEffectD2Ev @ 5174 NONAME
+ _ZN24QGraphicsSceneHoverEvent10setLastPosERK7QPointF @ 5175 NONAME
+ _ZN24QGraphicsSceneHoverEvent11setScenePosERK7QPointF @ 5176 NONAME
+ _ZN24QGraphicsSceneHoverEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5177 NONAME
+ _ZN24QGraphicsSceneHoverEvent12setScreenPosERK6QPoint @ 5178 NONAME
+ _ZN24QGraphicsSceneHoverEvent15setLastScenePosERK7QPointF @ 5179 NONAME
+ _ZN24QGraphicsSceneHoverEvent16setLastScreenPosERK6QPoint @ 5180 NONAME
+ _ZN24QGraphicsSceneHoverEvent6setPosERK7QPointF @ 5181 NONAME
+ _ZN24QGraphicsSceneHoverEventC1EN6QEvent4TypeE @ 5182 NONAME
+ _ZN24QGraphicsSceneHoverEventC2EN6QEvent4TypeE @ 5183 NONAME
+ _ZN24QGraphicsSceneHoverEventD0Ev @ 5184 NONAME
+ _ZN24QGraphicsSceneHoverEventD1Ev @ 5185 NONAME
+ _ZN24QGraphicsSceneHoverEventD2Ev @ 5186 NONAME
+ _ZN24QGraphicsSceneMouseEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5187 NONAME
+ _ZN24QGraphicsSceneMouseEvent10setLastPosERK7QPointF @ 5188 NONAME
+ _ZN24QGraphicsSceneMouseEvent11setScenePosERK7QPointF @ 5189 NONAME
+ _ZN24QGraphicsSceneMouseEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5190 NONAME
+ _ZN24QGraphicsSceneMouseEvent12setScreenPosERK6QPoint @ 5191 NONAME
+ _ZN24QGraphicsSceneMouseEvent15setLastScenePosERK7QPointF @ 5192 NONAME
+ _ZN24QGraphicsSceneMouseEvent16setButtonDownPosEN2Qt11MouseButtonERK7QPointF @ 5193 NONAME
+ _ZN24QGraphicsSceneMouseEvent16setLastScreenPosERK6QPoint @ 5194 NONAME
+ _ZN24QGraphicsSceneMouseEvent21setButtonDownScenePosEN2Qt11MouseButtonERK7QPointF @ 5195 NONAME
+ _ZN24QGraphicsSceneMouseEvent22setButtonDownScreenPosEN2Qt11MouseButtonERK6QPoint @ 5196 NONAME
+ _ZN24QGraphicsSceneMouseEvent6setPosERK7QPointF @ 5197 NONAME
+ _ZN24QGraphicsSceneMouseEvent9setButtonEN2Qt11MouseButtonE @ 5198 NONAME
+ _ZN24QGraphicsSceneMouseEventC1EN6QEvent4TypeE @ 5199 NONAME
+ _ZN24QGraphicsSceneMouseEventC2EN6QEvent4TypeE @ 5200 NONAME
+ _ZN24QGraphicsSceneMouseEventD0Ev @ 5201 NONAME
+ _ZN24QGraphicsSceneMouseEventD1Ev @ 5202 NONAME
+ _ZN24QGraphicsSceneMouseEventD2Ev @ 5203 NONAME
+ _ZN24QGraphicsSceneWheelEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5204 NONAME
+ _ZN24QGraphicsSceneWheelEvent11setScenePosERK7QPointF @ 5205 NONAME
+ _ZN24QGraphicsSceneWheelEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5206 NONAME
+ _ZN24QGraphicsSceneWheelEvent12setScreenPosERK6QPoint @ 5207 NONAME
+ _ZN24QGraphicsSceneWheelEvent14setOrientationEN2Qt11OrientationE @ 5208 NONAME
+ _ZN24QGraphicsSceneWheelEvent6setPosERK7QPointF @ 5209 NONAME
+ _ZN24QGraphicsSceneWheelEvent8setDeltaEi @ 5210 NONAME
+ _ZN24QGraphicsSceneWheelEventC1EN6QEvent4TypeE @ 5211 NONAME
+ _ZN24QGraphicsSceneWheelEventC2EN6QEvent4TypeE @ 5212 NONAME
+ _ZN24QGraphicsSceneWheelEventD0Ev @ 5213 NONAME
+ _ZN24QGraphicsSceneWheelEventD1Ev @ 5214 NONAME
+ _ZN24QGraphicsSceneWheelEventD2Ev @ 5215 NONAME
+ _ZN24QImagePixmapCleanupHooks12addImageHookEPFvxE @ 5216 NONAME
+ _ZN24QImagePixmapCleanupHooks13addPixmapHookEPFvP7QPixmapE @ 5217 NONAME
+ _ZN24QImagePixmapCleanupHooks15removeImageHookEPFvxE @ 5218 NONAME
+ _ZN24QImagePixmapCleanupHooks16removePixmapHookEPFvP7QPixmapE @ 5219 NONAME
+ _ZN24QImagePixmapCleanupHooks17executeImageHooksEx @ 5220 NONAME
+ _ZN24QImagePixmapCleanupHooks18executePixmapHooksEP7QPixmap @ 5221 NONAME
+ _ZN24QImagePixmapCleanupHooks8instanceEv @ 5222 NONAME
+ _ZN24QImagePixmapCleanupHooksC1Ev @ 5223 NONAME
+ _ZN24QImagePixmapCleanupHooksC2Ev @ 5224 NONAME
+ _ZN24QPixmapConvolutionFilter11qt_metacallEN11QMetaObject4CallEiPPv @ 5225 NONAME
+ _ZN24QPixmapConvolutionFilter11qt_metacastEPKc @ 5226 NONAME
+ _ZN24QPixmapConvolutionFilter16staticMetaObjectE @ 5227 NONAME DATA 16
+ _ZN24QPixmapConvolutionFilter19getStaticMetaObjectEv @ 5228 NONAME
+ _ZN24QPixmapConvolutionFilter20setConvolutionKernelEPKfii @ 5229 NONAME
+ _ZN24QPixmapConvolutionFilterC1EP7QObject @ 5230 NONAME
+ _ZN24QPixmapConvolutionFilterC2EP7QObject @ 5231 NONAME
+ _ZN24QPixmapConvolutionFilterD0Ev @ 5232 NONAME
+ _ZN24QPixmapConvolutionFilterD1Ev @ 5233 NONAME
+ _ZN24QPixmapConvolutionFilterD2Ev @ 5234 NONAME
+ _ZN24QPlainTextDocumentLayout10blockWidthERK10QTextBlock @ 5235 NONAME
+ _ZN24QPlainTextDocumentLayout11layoutBlockERK10QTextBlock @ 5236 NONAME
+ _ZN24QPlainTextDocumentLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5237 NONAME
+ _ZN24QPlainTextDocumentLayout11qt_metacastEPKc @ 5238 NONAME
+ _ZN24QPlainTextDocumentLayout12setTextWidthEf @ 5239 NONAME
+ _ZN24QPlainTextDocumentLayout13requestUpdateEv @ 5240 NONAME
+ _ZN24QPlainTextDocumentLayout14setCursorWidthEi @ 5241 NONAME
+ _ZN24QPlainTextDocumentLayout15documentChangedEiii @ 5242 NONAME
+ _ZN24QPlainTextDocumentLayout16staticMetaObjectE @ 5243 NONAME DATA 16
+ _ZN24QPlainTextDocumentLayout19getStaticMetaObjectEv @ 5244 NONAME
+ _ZN24QPlainTextDocumentLayout4drawEP8QPainterRKN27QAbstractTextDocumentLayout12PaintContextE @ 5245 NONAME
+ _ZN24QPlainTextDocumentLayoutC1EP13QTextDocument @ 5246 NONAME
+ _ZN24QPlainTextDocumentLayoutC2EP13QTextDocument @ 5247 NONAME
+ _ZN24QPlainTextDocumentLayoutD0Ev @ 5248 NONAME
+ _ZN24QPlainTextDocumentLayoutD1Ev @ 5249 NONAME
+ _ZN24QPlainTextDocumentLayoutD2Ev @ 5250 NONAME
+ _ZN24QStyleOptionDockWidgetV2C1ERK22QStyleOptionDockWidget @ 5251 NONAME
+ _ZN24QStyleOptionDockWidgetV2C1Ei @ 5252 NONAME
+ _ZN24QStyleOptionDockWidgetV2C1Ev @ 5253 NONAME
+ _ZN24QStyleOptionDockWidgetV2C2ERK22QStyleOptionDockWidget @ 5254 NONAME
+ _ZN24QStyleOptionDockWidgetV2C2Ei @ 5255 NONAME
+ _ZN24QStyleOptionDockWidgetV2C2Ev @ 5256 NONAME
+ _ZN24QStyleOptionDockWidgetV2aSERK22QStyleOptionDockWidget @ 5257 NONAME
+ _ZN24QStyleOptionGraphicsItem26levelOfDetailFromTransformERK10QTransform @ 5258 NONAME
+ _ZN24QStyleOptionGraphicsItemC1Ei @ 5259 NONAME
+ _ZN24QStyleOptionGraphicsItemC1Ev @ 5260 NONAME
+ _ZN24QStyleOptionGraphicsItemC2Ei @ 5261 NONAME
+ _ZN24QStyleOptionGraphicsItemC2Ev @ 5262 NONAME
+ _ZN24QStyleOptionQ3DockWindowC1Ei @ 5263 NONAME
+ _ZN24QStyleOptionQ3DockWindowC1Ev @ 5264 NONAME
+ _ZN24QStyleOptionQ3DockWindowC2Ei @ 5265 NONAME
+ _ZN24QStyleOptionQ3DockWindowC2Ev @ 5266 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C1ERK22QStyleOptionTabBarBase @ 5267 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C1Ei @ 5268 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C1Ev @ 5269 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C2ERK22QStyleOptionTabBarBase @ 5270 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C2Ei @ 5271 NONAME
+ _ZN24QStyleOptionTabBarBaseV2C2Ev @ 5272 NONAME
+ _ZN24QStyleOptionTabBarBaseV2aSERK22QStyleOptionTabBarBase @ 5273 NONAME
+ _ZN25QGraphicsDropShadowEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 5274 NONAME
+ _ZN25QGraphicsDropShadowEffect11qt_metacastEPKc @ 5275 NONAME
+ _ZN25QGraphicsDropShadowEffect12colorChangedERK6QColor @ 5276 NONAME
+ _ZN25QGraphicsDropShadowEffect13offsetChangedERK7QPointF @ 5277 NONAME
+ _ZN25QGraphicsDropShadowEffect13setBlurRadiusEi @ 5278 NONAME
+ _ZN25QGraphicsDropShadowEffect16staticMetaObjectE @ 5279 NONAME DATA 16
+ _ZN25QGraphicsDropShadowEffect17blurRadiusChangedEi @ 5280 NONAME
+ _ZN25QGraphicsDropShadowEffect19getStaticMetaObjectEv @ 5281 NONAME
+ _ZN25QGraphicsDropShadowEffect4drawEP8QPainterP21QGraphicsEffectSource @ 5282 NONAME
+ _ZN25QGraphicsDropShadowEffect8setColorERK6QColor @ 5283 NONAME
+ _ZN25QGraphicsDropShadowEffect9setOffsetERK7QPointF @ 5284 NONAME
+ _ZN25QGraphicsDropShadowEffectC1EP7QObject @ 5285 NONAME
+ _ZN25QGraphicsDropShadowEffectC2EP7QObject @ 5286 NONAME
+ _ZN25QGraphicsDropShadowEffectD0Ev @ 5287 NONAME
+ _ZN25QGraphicsDropShadowEffectD1Ev @ 5288 NONAME
+ _ZN25QGraphicsDropShadowEffectD2Ev @ 5289 NONAME
+ _ZN25QGraphicsSceneResizeEvent10setNewSizeERK6QSizeF @ 5290 NONAME
+ _ZN25QGraphicsSceneResizeEvent10setOldSizeERK6QSizeF @ 5291 NONAME
+ _ZN25QGraphicsSceneResizeEventC1Ev @ 5292 NONAME
+ _ZN25QGraphicsSceneResizeEventC2Ev @ 5293 NONAME
+ _ZN25QGraphicsSceneResizeEventD0Ev @ 5294 NONAME
+ _ZN25QGraphicsSceneResizeEventD1Ev @ 5295 NONAME
+ _ZN25QGraphicsSceneResizeEventD2Ev @ 5296 NONAME
+ _ZN25QStyleOptionProgressBarV2C1ERK23QStyleOptionProgressBar @ 5297 NONAME
+ _ZN25QStyleOptionProgressBarV2C1ERKS_ @ 5298 NONAME
+ _ZN25QStyleOptionProgressBarV2C1Ei @ 5299 NONAME
+ _ZN25QStyleOptionProgressBarV2C1Ev @ 5300 NONAME
+ _ZN25QStyleOptionProgressBarV2C2ERK23QStyleOptionProgressBar @ 5301 NONAME
+ _ZN25QStyleOptionProgressBarV2C2ERKS_ @ 5302 NONAME
+ _ZN25QStyleOptionProgressBarV2C2Ei @ 5303 NONAME
+ _ZN25QStyleOptionProgressBarV2C2Ev @ 5304 NONAME
+ _ZN25QStyleOptionProgressBarV2aSERK23QStyleOptionProgressBar @ 5305 NONAME
+ _ZN26QAbstractGraphicsShapeItem6setPenERK4QPen @ 5306 NONAME
+ _ZN26QAbstractGraphicsShapeItem8setBrushERK6QBrush @ 5307 NONAME
+ _ZN26QAbstractGraphicsShapeItemC2EP13QGraphicsItemP14QGraphicsScene @ 5308 NONAME
+ _ZN26QAbstractGraphicsShapeItemC2ER33QAbstractGraphicsShapeItemPrivateP13QGraphicsItemP14QGraphicsScene @ 5309 NONAME
+ _ZN26QAbstractGraphicsShapeItemD0Ev @ 5310 NONAME
+ _ZN26QAbstractGraphicsShapeItemD1Ev @ 5311 NONAME
+ _ZN26QAbstractGraphicsShapeItemD2Ev @ 5312 NONAME
+ _ZN26QStyleOptionQ3ListViewItemC1Ei @ 5313 NONAME
+ _ZN26QStyleOptionQ3ListViewItemC1Ev @ 5314 NONAME
+ _ZN26QStyleOptionQ3ListViewItemC2Ei @ 5315 NONAME
+ _ZN26QStyleOptionQ3ListViewItemC2Ev @ 5316 NONAME
+ _ZN26QStyleOptionTabWidgetFrameC1Ei @ 5317 NONAME
+ _ZN26QStyleOptionTabWidgetFrameC1Ev @ 5318 NONAME
+ _ZN26QStyleOptionTabWidgetFrameC2Ei @ 5319 NONAME
+ _ZN26QStyleOptionTabWidgetFrameC2Ev @ 5320 NONAME
+ _ZN26QTableWidgetSelectionRangeC1ERKS_ @ 5321 NONAME
+ _ZN26QTableWidgetSelectionRangeC1Eiiii @ 5322 NONAME
+ _ZN26QTableWidgetSelectionRangeC1Ev @ 5323 NONAME
+ _ZN26QTableWidgetSelectionRangeC2ERKS_ @ 5324 NONAME
+ _ZN26QTableWidgetSelectionRangeC2Eiiii @ 5325 NONAME
+ _ZN26QTableWidgetSelectionRangeC2Ev @ 5326 NONAME
+ _ZN26QTableWidgetSelectionRangeD1Ev @ 5327 NONAME
+ _ZN26QTableWidgetSelectionRangeD2Ev @ 5328 NONAME
+ _ZN27QAbstractTextDocumentLayout11formatIndexEi @ 5329 NONAME
+ _ZN27QAbstractTextDocumentLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5330 NONAME
+ _ZN27QAbstractTextDocumentLayout11qt_metacastEPKc @ 5331 NONAME
+ _ZN27QAbstractTextDocumentLayout11updateBlockERK10QTextBlock @ 5332 NONAME
+ _ZN27QAbstractTextDocumentLayout14setPaintDeviceEP12QPaintDevice @ 5333 NONAME
+ _ZN27QAbstractTextDocumentLayout15registerHandlerEiP7QObject @ 5334 NONAME
+ _ZN27QAbstractTextDocumentLayout16drawInlineObjectEP8QPainterRK6QRectF17QTextInlineObjectiRK11QTextFormat @ 5335 NONAME
+ _ZN27QAbstractTextDocumentLayout16pageCountChangedEi @ 5336 NONAME
+ _ZN27QAbstractTextDocumentLayout16staticMetaObjectE @ 5337 NONAME DATA 16
+ _ZN27QAbstractTextDocumentLayout18resizeInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 5338 NONAME
+ _ZN27QAbstractTextDocumentLayout19documentSizeChangedERK6QSizeF @ 5339 NONAME
+ _ZN27QAbstractTextDocumentLayout19getStaticMetaObjectEv @ 5340 NONAME
+ _ZN27QAbstractTextDocumentLayout20positionInlineObjectE17QTextInlineObjectiRK11QTextFormat @ 5341 NONAME
+ _ZN27QAbstractTextDocumentLayout6formatEi @ 5342 NONAME
+ _ZN27QAbstractTextDocumentLayout6updateERK6QRectF @ 5343 NONAME
+ _ZN27QAbstractTextDocumentLayoutC2EP13QTextDocument @ 5344 NONAME
+ _ZN27QAbstractTextDocumentLayoutC2ER34QAbstractTextDocumentLayoutPrivateP13QTextDocument @ 5345 NONAME
+ _ZN27QAbstractTextDocumentLayoutD0Ev @ 5346 NONAME
+ _ZN27QAbstractTextDocumentLayoutD1Ev @ 5347 NONAME
+ _ZN27QAbstractTextDocumentLayoutD2Ev @ 5348 NONAME
+ _ZN27QGraphicsSceneDragDropEvent10setButtonsE6QFlagsIN2Qt11MouseButtonEE @ 5349 NONAME
+ _ZN27QGraphicsSceneDragDropEvent11setMimeDataEPK9QMimeData @ 5350 NONAME
+ _ZN27QGraphicsSceneDragDropEvent11setScenePosERK7QPointF @ 5351 NONAME
+ _ZN27QGraphicsSceneDragDropEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5352 NONAME
+ _ZN27QGraphicsSceneDragDropEvent12setScreenPosERK6QPoint @ 5353 NONAME
+ _ZN27QGraphicsSceneDragDropEvent13setDropActionEN2Qt10DropActionE @ 5354 NONAME
+ _ZN27QGraphicsSceneDragDropEvent17setProposedActionEN2Qt10DropActionE @ 5355 NONAME
+ _ZN27QGraphicsSceneDragDropEvent18setPossibleActionsE6QFlagsIN2Qt10DropActionEE @ 5356 NONAME
+ _ZN27QGraphicsSceneDragDropEvent20acceptProposedActionEv @ 5357 NONAME
+ _ZN27QGraphicsSceneDragDropEvent6setPosERK7QPointF @ 5358 NONAME
+ _ZN27QGraphicsSceneDragDropEvent9setSourceEP7QWidget @ 5359 NONAME
+ _ZN27QGraphicsSceneDragDropEventC1EN6QEvent4TypeE @ 5360 NONAME
+ _ZN27QGraphicsSceneDragDropEventC2EN6QEvent4TypeE @ 5361 NONAME
+ _ZN27QGraphicsSceneDragDropEventD0Ev @ 5362 NONAME
+ _ZN27QGraphicsSceneDragDropEventD1Ev @ 5363 NONAME
+ _ZN27QGraphicsSceneDragDropEventD2Ev @ 5364 NONAME
+ _ZN2Qt12codecForHtmlERK10QByteArray @ 5365 NONAME
+ _ZN2Qt15mightBeRichTextERK7QString @ 5366 NONAME
+ _ZN2Qt20convertFromPlainTextERK7QStringNS_14WhiteSpaceModeE @ 5367 NONAME
+ _ZN2Qt6escapeERK7QString @ 5368 NONAME
+ _ZN30QGraphicsSceneContextMenuEvent11setScenePosERK7QPointF @ 5369 NONAME
+ _ZN30QGraphicsSceneContextMenuEvent12setModifiersE6QFlagsIN2Qt16KeyboardModifierEE @ 5370 NONAME
+ _ZN30QGraphicsSceneContextMenuEvent12setScreenPosERK6QPoint @ 5371 NONAME
+ _ZN30QGraphicsSceneContextMenuEvent6setPosERK7QPointF @ 5372 NONAME
+ _ZN30QGraphicsSceneContextMenuEvent9setReasonENS_6ReasonE @ 5373 NONAME
+ _ZN30QGraphicsSceneContextMenuEventC1EN6QEvent4TypeE @ 5374 NONAME
+ _ZN30QGraphicsSceneContextMenuEventC2EN6QEvent4TypeE @ 5375 NONAME
+ _ZN30QGraphicsSceneContextMenuEventD0Ev @ 5376 NONAME
+ _ZN30QGraphicsSceneContextMenuEventD1Ev @ 5377 NONAME
+ _ZN30QGraphicsSceneContextMenuEventD2Ev @ 5378 NONAME
+ _ZN4QCss13StyleSelector15selectorMatchesERKNS_8SelectorENS0_7NodePtrE @ 5379 NONAME
+ _ZN4QCss13StyleSelector17styleRulesForNodeENS0_7NodePtrE @ 5380 NONAME
+ _ZN4QCss13StyleSelector19declarationsForNodeENS0_7NodePtrEPKc @ 5381 NONAME
+ _ZN4QCss13StyleSelector20basicSelectorMatchesERKNS_13BasicSelectorENS0_7NodePtrE @ 5382 NONAME
+ _ZN4QCss13StyleSelector9matchRuleENS0_7NodePtrERKNS_9StyleRuleENS_16StyleSheetOriginEiP4QMapIjS2_E @ 5383 NONAME
+ _ZN4QCss13StyleSelectorD0Ev @ 5384 NONAME
+ _ZN4QCss13StyleSelectorD1Ev @ 5385 NONAME
+ _ZN4QCss13StyleSelectorD2Ev @ 5386 NONAME
+ _ZN4QCss6Parser10lexemUntilENS_9TokenTypeE @ 5387 NONAME
+ _ZN4QCss6Parser10parseClassEP7QString @ 5388 NONAME
+ _ZN4QCss6Parser10parseMediaEPNS_9MediaRuleE @ 5389 NONAME
+ _ZN4QCss6Parser11errorSymbolEv @ 5390 NONAME
+ _ZN4QCss6Parser11parseAttribEPNS_17AttributeSelectorE @ 5391 NONAME
+ _ZN4QCss6Parser11parseImportEPNS_10ImportRuleE @ 5392 NONAME
+ _ZN4QCss6Parser11parseMediumEP11QStringList @ 5393 NONAME
+ _ZN4QCss6Parser11parsePseudoEPNS_6PseudoE @ 5394 NONAME
+ _ZN4QCss6Parser12parseRulesetEPNS_9StyleRuleE @ 5395 NONAME
+ _ZN4QCss6Parser13parseFunctionEP7QStringS2_ @ 5396 NONAME
+ _ZN4QCss6Parser13parseHexColorEP6QColor @ 5397 NONAME
+ _ZN4QCss6Parser13parsePropertyEPNS_11DeclarationE @ 5398 NONAME
+ _ZN4QCss6Parser13parseSelectorEPNS_8SelectorE @ 5399 NONAME
+ _ZN4QCss6Parser15parseCombinatorEPNS_13BasicSelector8RelationE @ 5400 NONAME
+ _ZN4QCss6Parser15parsePseudoPageEP7QString @ 5401 NONAME
+ _ZN4QCss6Parser15testAndParseUriEP7QString @ 5402 NONAME
+ _ZN4QCss6Parser16parseElementNameEP7QString @ 5403 NONAME
+ _ZN4QCss6Parser17parseNextOperatorEPNS_5ValueE @ 5404 NONAME
+ _ZN4QCss6Parser18testSimpleSelectorEv @ 5405 NONAME
+ _ZN4QCss6Parser19parseSimpleSelectorEPNS_13BasicSelectorE @ 5406 NONAME
+ _ZN4QCss6Parser20parseNextDeclarationEPNS_11DeclarationE @ 5407 NONAME
+ _ZN4QCss6Parser20testTokenAndEndsWithENS_9TokenTypeERK13QLatin1String @ 5408 NONAME
+ _ZN4QCss6Parser4initERK7QStringb @ 5409 NONAME
+ _ZN4QCss6Parser4nextENS_9TokenTypeE @ 5410 NONAME
+ _ZN4QCss6Parser4testENS_9TokenTypeE @ 5411 NONAME
+ _ZN4QCss6Parser5parseEPNS_10StyleSheetEN2Qt15CaseSensitivityE @ 5412 NONAME
+ _ZN4QCss6Parser5untilENS_9TokenTypeES1_ @ 5413 NONAME
+ _ZN4QCss6Parser8testPrioEv @ 5414 NONAME
+ _ZN4QCss6Parser8testTermEv @ 5415 NONAME
+ _ZN4QCss6Parser9parseExprEP7QVectorINS_5ValueEE @ 5416 NONAME
+ _ZN4QCss6Parser9parsePageEPNS_8PageRuleE @ 5417 NONAME
+ _ZN4QCss6Parser9parsePrioEPNS_11DeclarationE @ 5418 NONAME
+ _ZN4QCss6Parser9parseTermEPNS_5ValueE @ 5419 NONAME
+ _ZN4QCss6ParserC1ERK7QStringb @ 5420 NONAME
+ _ZN4QCss6ParserC1Ev @ 5421 NONAME
+ _ZN4QCss6ParserC2ERK7QStringb @ 5422 NONAME
+ _ZN4QCss6ParserC2Ev @ 5423 NONAME
+ _ZN4QPen10isDetachedEv @ 5424 NONAME
+ _ZN4QPen11setCapStyleEN2Qt11PenCapStyleE @ 5425 NONAME
+ _ZN4QPen11setCosmeticEb @ 5426 NONAME
+ _ZN4QPen12setJoinStyleEN2Qt12PenJoinStyleE @ 5427 NONAME
+ _ZN4QPen13setDashOffsetEf @ 5428 NONAME
+ _ZN4QPen13setMiterLimitEf @ 5429 NONAME
+ _ZN4QPen14setDashPatternERK7QVectorIfE @ 5430 NONAME
+ _ZN4QPen6detachEv @ 5431 NONAME
+ _ZN4QPen8setBrushERK6QBrush @ 5432 NONAME
+ _ZN4QPen8setColorERK6QColor @ 5433 NONAME
+ _ZN4QPen8setStyleEN2Qt8PenStyleE @ 5434 NONAME
+ _ZN4QPen8setWidthEi @ 5435 NONAME
+ _ZN4QPen9setWidthFEf @ 5436 NONAME
+ _ZN4QPenC1EN2Qt8PenStyleE @ 5437 NONAME
+ _ZN4QPenC1ERK6QBrushfN2Qt8PenStyleENS3_11PenCapStyleENS3_12PenJoinStyleE @ 5438 NONAME
+ _ZN4QPenC1ERK6QColor @ 5439 NONAME
+ _ZN4QPenC1ERKS_ @ 5440 NONAME
+ _ZN4QPenC1Ev @ 5441 NONAME
+ _ZN4QPenC2EN2Qt8PenStyleE @ 5442 NONAME
+ _ZN4QPenC2ERK6QBrushfN2Qt8PenStyleENS3_11PenCapStyleENS3_12PenJoinStyleE @ 5443 NONAME
+ _ZN4QPenC2ERK6QColor @ 5444 NONAME
+ _ZN4QPenC2ERKS_ @ 5445 NONAME
+ _ZN4QPenC2Ev @ 5446 NONAME
+ _ZN4QPenD1Ev @ 5447 NONAME
+ _ZN4QPenD2Ev @ 5448 NONAME
+ _ZN4QPenaSERKS_ @ 5449 NONAME
+ _ZN5QDial10paintEventEP11QPaintEvent @ 5450 NONAME
+ _ZN5QDial11qt_metacallEN11QMetaObject4CallEiPPv @ 5451 NONAME
+ _ZN5QDial11qt_metacastEPKc @ 5452 NONAME
+ _ZN5QDial11resizeEventEP12QResizeEvent @ 5453 NONAME
+ _ZN5QDial11setWrappingEb @ 5454 NONAME
+ _ZN5QDial12sliderChangeEN15QAbstractSlider12SliderChangeE @ 5455 NONAME
+ _ZN5QDial14mouseMoveEventEP11QMouseEvent @ 5456 NONAME
+ _ZN5QDial14setNotchTargetEd @ 5457 NONAME
+ _ZN5QDial15mousePressEventEP11QMouseEvent @ 5458 NONAME
+ _ZN5QDial16staticMetaObjectE @ 5459 NONAME DATA 16
+ _ZN5QDial17mouseReleaseEventEP11QMouseEvent @ 5460 NONAME
+ _ZN5QDial17setNotchesVisibleEb @ 5461 NONAME
+ _ZN5QDial19getStaticMetaObjectEv @ 5462 NONAME
+ _ZN5QDial5eventEP6QEvent @ 5463 NONAME
+ _ZN5QDialC1EP7QWidget @ 5464 NONAME
+ _ZN5QDialC2EP7QWidget @ 5465 NONAME
+ _ZN5QDialD0Ev @ 5466 NONAME
+ _ZN5QDialD1Ev @ 5467 NONAME
+ _ZN5QDialD2Ev @ 5468 NONAME
+ _ZN5QDrag10setHotSpotERK6QPoint @ 5469 NONAME
+ _ZN5QDrag11qt_metacallEN11QMetaObject4CallEiPPv @ 5470 NONAME
+ _ZN5QDrag11qt_metacastEPKc @ 5471 NONAME
+ _ZN5QDrag11setMimeDataEP9QMimeData @ 5472 NONAME
+ _ZN5QDrag13actionChangedEN2Qt10DropActionE @ 5473 NONAME
+ _ZN5QDrag13setDragCursorERK7QPixmapN2Qt10DropActionE @ 5474 NONAME
+ _ZN5QDrag13targetChangedEP7QWidget @ 5475 NONAME
+ _ZN5QDrag16staticMetaObjectE @ 5476 NONAME DATA 16
+ _ZN5QDrag19getStaticMetaObjectEv @ 5477 NONAME
+ _ZN5QDrag4execE6QFlagsIN2Qt10DropActionEE @ 5478 NONAME
+ _ZN5QDrag4execE6QFlagsIN2Qt10DropActionEES2_ @ 5479 NONAME
+ _ZN5QDrag5startE6QFlagsIN2Qt10DropActionEE @ 5480 NONAME
+ _ZN5QDrag9setPixmapERK7QPixmap @ 5481 NONAME
+ _ZN5QDragC1EP7QWidget @ 5482 NONAME
+ _ZN5QDragC2EP7QWidget @ 5483 NONAME
+ _ZN5QDragD0Ev @ 5484 NONAME
+ _ZN5QDragD1Ev @ 5485 NONAME
+ _ZN5QDragD2Ev @ 5486 NONAME
+ _ZN5QFont10fromStringERK7QString @ 5487 NONAME
+ _ZN5QFont10setKerningEb @ 5488 NONAME
+ _ZN5QFont10setRawModeEb @ 5489 NONAME
+ _ZN5QFont10setStretchEi @ 5490 NONAME
+ _ZN5QFont10substituteERK7QString @ 5491 NONAME
+ _ZN5QFont11setOverlineEb @ 5492 NONAME
+ _ZN5QFont11substitutesERK7QString @ 5493 NONAME
+ _ZN5QFont12setPixelSizeEi @ 5494 NONAME
+ _ZN5QFont12setPointSizeEi @ 5495 NONAME
+ _ZN5QFont12setStrikeOutEb @ 5496 NONAME
+ _ZN5QFont12setStyleHintENS_9StyleHintENS_13StyleStrategyE @ 5497 NONAME
+ _ZN5QFont12setUnderlineEb @ 5498 NONAME
+ _ZN5QFont13setFixedPitchEb @ 5499 NONAME
+ _ZN5QFont13setPointSizeFEf @ 5500 NONAME
+ _ZN5QFont13substitutionsEv @ 5501 NONAME
+ _ZN5QFont14setWordSpacingEf @ 5502 NONAME
+ _ZN5QFont15cacheStatisticsEv @ 5503 NONAME
+ _ZN5QFont16setLetterSpacingENS_11SpacingTypeEf @ 5504 NONAME
+ _ZN5QFont16setStyleStrategyENS_13StyleStrategyE @ 5505 NONAME
+ _ZN5QFont16staticMetaObjectE @ 5506 NONAME DATA 16
+ _ZN5QFont17setCapitalizationENS_14CapitalizationE @ 5507 NONAME
+ _ZN5QFont18insertSubstitutionERK7QStringS2_ @ 5508 NONAME
+ _ZN5QFont18removeSubstitutionERK7QString @ 5509 NONAME
+ _ZN5QFont19getStaticMetaObjectEv @ 5510 NONAME
+ _ZN5QFont19insertSubstitutionsERK7QStringRK11QStringList @ 5511 NONAME
+ _ZN5QFont6detachEv @ 5512 NONAME
+ _ZN5QFont8setStyleENS_5StyleE @ 5513 NONAME
+ _ZN5QFont9setFamilyERK7QString @ 5514 NONAME
+ _ZN5QFont9setWeightEi @ 5515 NONAME
+ _ZN5QFontC1EP12QFontPrivate @ 5516 NONAME
+ _ZN5QFontC1ERK7QStringiib @ 5517 NONAME
+ _ZN5QFontC1ERKS_ @ 5518 NONAME
+ _ZN5QFontC1ERKS_P12QPaintDevice @ 5519 NONAME
+ _ZN5QFontC1Ev @ 5520 NONAME
+ _ZN5QFontC2EP12QFontPrivate @ 5521 NONAME
+ _ZN5QFontC2ERK7QStringiib @ 5522 NONAME
+ _ZN5QFontC2ERKS_ @ 5523 NONAME
+ _ZN5QFontC2ERKS_P12QPaintDevice @ 5524 NONAME
+ _ZN5QFontC2Ev @ 5525 NONAME
+ _ZN5QFontD1Ev @ 5526 NONAME
+ _ZN5QFontD2Ev @ 5527 NONAME
+ _ZN5QFontaSERKS_ @ 5528 NONAME
+ _ZN5QIcon12hasThemeIconERK7QString @ 5529 NONAME
+ _ZN5QIcon12setThemeNameERK7QString @ 5530 NONAME
+ _ZN5QIcon16themeSearchPathsEv @ 5531 NONAME
+ _ZN5QIcon19setThemeSearchPathsERK11QStringList @ 5532 NONAME
+ _ZN5QIcon6detachEv @ 5533 NONAME
+ _ZN5QIcon7addFileERK7QStringRK5QSizeNS_4ModeENS_5StateE @ 5534 NONAME
+ _ZN5QIcon9addPixmapERK7QPixmapNS_4ModeENS_5StateE @ 5535 NONAME
+ _ZN5QIcon9fromThemeERK7QStringRKS_ @ 5536 NONAME
+ _ZN5QIcon9themeNameEv @ 5537 NONAME
+ _ZN5QIconC1EP11QIconEngine @ 5538 NONAME
+ _ZN5QIconC1EP13QIconEngineV2 @ 5539 NONAME
+ _ZN5QIconC1ERK7QPixmap @ 5540 NONAME
+ _ZN5QIconC1ERK7QString @ 5541 NONAME
+ _ZN5QIconC1ERKS_ @ 5542 NONAME
+ _ZN5QIconC1Ev @ 5543 NONAME
+ _ZN5QIconC2EP11QIconEngine @ 5544 NONAME
+ _ZN5QIconC2EP13QIconEngineV2 @ 5545 NONAME
+ _ZN5QIconC2ERK7QPixmap @ 5546 NONAME
+ _ZN5QIconC2ERK7QString @ 5547 NONAME
+ _ZN5QIconC2ERKS_ @ 5548 NONAME
+ _ZN5QIconC2Ev @ 5549 NONAME
+ _ZN5QIconD1Ev @ 5550 NONAME
+ _ZN5QIconD2Ev @ 5551 NONAME
+ _ZN5QIconaSERKS_ @ 5552 NONAME
+ _ZN5QMenu10enterEventEP6QEvent @ 5553 NONAME
+ _ZN5QMenu10insertMenuEP7QActionPS_ @ 5554 NONAME
+ _ZN5QMenu10leaveEventEP6QEvent @ 5555 NONAME
+ _ZN5QMenu10paintEventEP11QPaintEvent @ 5556 NONAME
+ _ZN5QMenu10timerEventEP11QTimerEvent @ 5557 NONAME
+ _ZN5QMenu10wheelEventEP11QWheelEvent @ 5558 NONAME
+ _ZN5QMenu11aboutToHideEv @ 5559 NONAME
+ _ZN5QMenu11aboutToShowEv @ 5560 NONAME
+ _ZN5QMenu11actionEventEP12QActionEvent @ 5561 NONAME
+ _ZN5QMenu11changeEventEP6QEvent @ 5562 NONAME
+ _ZN5QMenu11qt_metacallEN11QMetaObject4CallEiPPv @ 5563 NONAME
+ _ZN5QMenu11qt_metacastEPKc @ 5564 NONAME
+ _ZN5QMenu12addSeparatorEv @ 5565 NONAME
+ _ZN5QMenu13keyPressEventEP9QKeyEvent @ 5566 NONAME
+ _ZN5QMenu14mouseMoveEventEP11QMouseEvent @ 5567 NONAME
+ _ZN5QMenu14setNoReplayForEP7QWidget @ 5568 NONAME
+ _ZN5QMenu15hideTearOffMenuEv @ 5569 NONAME
+ _ZN5QMenu15insertSeparatorEP7QAction @ 5570 NONAME
+ _ZN5QMenu15mousePressEventEP11QMouseEvent @ 5571 NONAME
+ _ZN5QMenu15setActiveActionEP7QAction @ 5572 NONAME
+ _ZN5QMenu16setDefaultActionEP7QAction @ 5573 NONAME
+ _ZN5QMenu16staticMetaObjectE @ 5574 NONAME DATA 16
+ _ZN5QMenu17mouseReleaseEventEP11QMouseEvent @ 5575 NONAME
+ _ZN5QMenu17setTearOffEnabledEb @ 5576 NONAME
+ _ZN5QMenu18focusNextPrevChildEb @ 5577 NONAME
+ _ZN5QMenu19getStaticMetaObjectEv @ 5578 NONAME
+ _ZN5QMenu20internalDelayedPopupEv @ 5579 NONAME
+ _ZN5QMenu23internalSetSloppyActionEv @ 5580 NONAME
+ _ZN5QMenu24setSeparatorsCollapsibleEb @ 5581 NONAME
+ _ZN5QMenu4execE5QListIP7QActionERK6QPointS2_ @ 5582 NONAME
+ _ZN5QMenu4execE5QListIP7QActionERK6QPointS2_P7QWidget @ 5583 NONAME
+ _ZN5QMenu4execERK6QPointP7QAction @ 5584 NONAME
+ _ZN5QMenu4execEv @ 5585 NONAME
+ _ZN5QMenu5clearEv @ 5586 NONAME
+ _ZN5QMenu5eventEP6QEvent @ 5587 NONAME
+ _ZN5QMenu5popupERK6QPointP7QAction @ 5588 NONAME
+ _ZN5QMenu7addMenuEPS_ @ 5589 NONAME
+ _ZN5QMenu7addMenuERK5QIconRK7QString @ 5590 NONAME
+ _ZN5QMenu7addMenuERK7QString @ 5591 NONAME
+ _ZN5QMenu7hoveredEP7QAction @ 5592 NONAME
+ _ZN5QMenu7setIconERK5QIcon @ 5593 NONAME
+ _ZN5QMenu8setTitleERK7QString @ 5594 NONAME
+ _ZN5QMenu9addActionERK5QIconRK7QString @ 5595 NONAME
+ _ZN5QMenu9addActionERK5QIconRK7QStringPK7QObjectPKcRK12QKeySequence @ 5596 NONAME
+ _ZN5QMenu9addActionERK7QString @ 5597 NONAME
+ _ZN5QMenu9addActionERK7QStringPK7QObjectPKcRK12QKeySequence @ 5598 NONAME
+ _ZN5QMenu9hideEventEP10QHideEvent @ 5599 NONAME
+ _ZN5QMenu9triggeredEP7QAction @ 5600 NONAME
+ _ZN5QMenuC1EP7QWidget @ 5601 NONAME
+ _ZN5QMenuC1ER12QMenuPrivateP7QWidget @ 5602 NONAME
+ _ZN5QMenuC1ERK7QStringP7QWidget @ 5603 NONAME
+ _ZN5QMenuC2EP7QWidget @ 5604 NONAME
+ _ZN5QMenuC2ER12QMenuPrivateP7QWidget @ 5605 NONAME
+ _ZN5QMenuC2ERK7QStringP7QWidget @ 5606 NONAME
+ _ZN5QMenuD0Ev @ 5607 NONAME
+ _ZN5QMenuD1Ev @ 5608 NONAME
+ _ZN5QMenuD2Ev @ 5609 NONAME
+ _ZN6QBrush10setTextureERK7QPixmap @ 5610 NONAME
+ _ZN6QBrush12setTransformERK10QTransform @ 5611 NONAME
+ _ZN6QBrush15setTextureImageERK6QImage @ 5612 NONAME
+ _ZN6QBrush4initERK6QColorN2Qt10BrushStyleE @ 5613 NONAME
+ _ZN6QBrush6detachEN2Qt10BrushStyleE @ 5614 NONAME
+ _ZN6QBrush7cleanUpEP10QBrushData @ 5615 NONAME
+ _ZN6QBrush8setColorERK6QColor @ 5616 NONAME
+ _ZN6QBrush8setStyleEN2Qt10BrushStyleE @ 5617 NONAME
+ _ZN6QBrush9setMatrixERK7QMatrix @ 5618 NONAME
+ _ZN6QBrushC1EN2Qt10BrushStyleE @ 5619 NONAME
+ _ZN6QBrushC1EN2Qt11GlobalColorENS0_10BrushStyleE @ 5620 NONAME
+ _ZN6QBrushC1EN2Qt11GlobalColorERK7QPixmap @ 5621 NONAME
+ _ZN6QBrushC1ERK6QColorN2Qt10BrushStyleE @ 5622 NONAME
+ _ZN6QBrushC1ERK6QColorRK7QPixmap @ 5623 NONAME
+ _ZN6QBrushC1ERK6QImage @ 5624 NONAME
+ _ZN6QBrushC1ERK7QPixmap @ 5625 NONAME
+ _ZN6QBrushC1ERK9QGradient @ 5626 NONAME
+ _ZN6QBrushC1ERKS_ @ 5627 NONAME
+ _ZN6QBrushC1Ev @ 5628 NONAME
+ _ZN6QBrushC2EN2Qt10BrushStyleE @ 5629 NONAME
+ _ZN6QBrushC2EN2Qt11GlobalColorENS0_10BrushStyleE @ 5630 NONAME
+ _ZN6QBrushC2EN2Qt11GlobalColorERK7QPixmap @ 5631 NONAME
+ _ZN6QBrushC2ERK6QColorN2Qt10BrushStyleE @ 5632 NONAME
+ _ZN6QBrushC2ERK6QColorRK7QPixmap @ 5633 NONAME
+ _ZN6QBrushC2ERK6QImage @ 5634 NONAME
+ _ZN6QBrushC2ERK7QPixmap @ 5635 NONAME
+ _ZN6QBrushC2ERK9QGradient @ 5636 NONAME
+ _ZN6QBrushC2ERKS_ @ 5637 NONAME
+ _ZN6QBrushC2Ev @ 5638 NONAME
+ _ZN6QBrushD1Ev @ 5639 NONAME
+ _ZN6QBrushD2Ev @ 5640 NONAME
+ _ZN6QBrushaSERKS_ @ 5641 NONAME
+ _ZN6QColor10colorNamesEv @ 5642 NONAME
+ _ZN6QColor10invalidateEv @ 5643 NONAME
+ _ZN6QColor13setNamedColorERK7QString @ 5644 NONAME
+ _ZN6QColor6setHslEiiii @ 5645 NONAME
+ _ZN6QColor6setHsvEiiii @ 5646 NONAME
+ _ZN6QColor6setRedEi @ 5647 NONAME
+ _ZN6QColor6setRgbEiiii @ 5648 NONAME
+ _ZN6QColor6setRgbEj @ 5649 NONAME
+ _ZN6QColor7fromHslEiiii @ 5650 NONAME
+ _ZN6QColor7fromHsvEiiii @ 5651 NONAME
+ _ZN6QColor7fromRgbEiiii @ 5652 NONAME
+ _ZN6QColor7fromRgbEj @ 5653 NONAME
+ _ZN6QColor7getCmykEPiS0_S0_S0_S0_ @ 5654 NONAME
+ _ZN6QColor7setBlueEi @ 5655 NONAME
+ _ZN6QColor7setCmykEiiiii @ 5656 NONAME
+ _ZN6QColor7setHslFEffff @ 5657 NONAME
+ _ZN6QColor7setHsvFEffff @ 5658 NONAME
+ _ZN6QColor7setRedFEf @ 5659 NONAME
+ _ZN6QColor7setRgbFEffff @ 5660 NONAME
+ _ZN6QColor7setRgbaEj @ 5661 NONAME
+ _ZN6QColor8fromCmykEiiiii @ 5662 NONAME
+ _ZN6QColor8fromHslFEffff @ 5663 NONAME
+ _ZN6QColor8fromHsvFEffff @ 5664 NONAME
+ _ZN6QColor8fromRgbFEffff @ 5665 NONAME
+ _ZN6QColor8fromRgbaEj @ 5666 NONAME
+ _ZN6QColor8getCmykFEPfS0_S0_S0_S0_ @ 5667 NONAME
+ _ZN6QColor8setAlphaEi @ 5668 NONAME
+ _ZN6QColor8setBlueFEf @ 5669 NONAME
+ _ZN6QColor8setCmykFEfffff @ 5670 NONAME
+ _ZN6QColor8setGreenEi @ 5671 NONAME
+ _ZN6QColor9fromCmykFEfffff @ 5672 NONAME
+ _ZN6QColor9setAlphaFEf @ 5673 NONAME
+ _ZN6QColor9setGreenFEf @ 5674 NONAME
+ _ZN6QColorC1EN2Qt11GlobalColorE @ 5675 NONAME
+ _ZN6QColorC1ENS_4SpecE @ 5676 NONAME
+ _ZN6QColorC1Ej @ 5677 NONAME
+ _ZN6QColorC2EN2Qt11GlobalColorE @ 5678 NONAME
+ _ZN6QColorC2ENS_4SpecE @ 5679 NONAME
+ _ZN6QColorC2Ej @ 5680 NONAME
+ _ZN6QColoraSEN2Qt11GlobalColorE @ 5681 NONAME
+ _ZN6QColoraSERKS_ @ 5682 NONAME
+ _ZN6QFrame10paintEventEP11QPaintEvent @ 5683 NONAME
+ _ZN6QFrame11changeEventEP6QEvent @ 5684 NONAME
+ _ZN6QFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 5685 NONAME
+ _ZN6QFrame11qt_metacastEPKc @ 5686 NONAME
+ _ZN6QFrame12setFrameRectERK5QRect @ 5687 NONAME
+ _ZN6QFrame12setLineWidthEi @ 5688 NONAME
+ _ZN6QFrame13setFrameShapeENS_5ShapeE @ 5689 NONAME
+ _ZN6QFrame13setFrameStyleEi @ 5690 NONAME
+ _ZN6QFrame14setFrameShadowENS_6ShadowE @ 5691 NONAME
+ _ZN6QFrame15setMidLineWidthEi @ 5692 NONAME
+ _ZN6QFrame16staticMetaObjectE @ 5693 NONAME DATA 16
+ _ZN6QFrame19getStaticMetaObjectEv @ 5694 NONAME
+ _ZN6QFrame5eventEP6QEvent @ 5695 NONAME
+ _ZN6QFrame9drawFrameEP8QPainter @ 5696 NONAME
+ _ZN6QFrameC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5697 NONAME
+ _ZN6QFrameC1ER13QFramePrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5698 NONAME
+ _ZN6QFrameC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5699 NONAME
+ _ZN6QFrameC2ER13QFramePrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5700 NONAME
+ _ZN6QFrameD0Ev @ 5701 NONAME
+ _ZN6QFrameD1Ev @ 5702 NONAME
+ _ZN6QFrameD2Ev @ 5703 NONAME
+ _ZN6QImage10trueMatrixERK10QTransformii @ 5704 NONAME
+ _ZN6QImage10trueMatrixERK7QMatrixii @ 5705 NONAME
+ _ZN6QImage12invertPixelsENS_10InvertModeE @ 5706 NONAME
+ _ZN6QImage12loadFromDataEPKhiPKc @ 5707 NONAME
+ _ZN6QImage12setNumColorsEi @ 5708 NONAME
+ _ZN6QImage13setColorTableE7QVectorIjE @ 5709 NONAME
+ _ZN6QImage15setAlphaChannelERKS_ @ 5710 NONAME
+ _ZN6QImage16setDotsPerMeterXEi @ 5711 NONAME
+ _ZN6QImage16setDotsPerMeterYEi @ 5712 NONAME
+ _ZN6QImage4bitsEv @ 5713 NONAME
+ _ZN6QImage4fillEj @ 5714 NONAME
+ _ZN6QImage4loadEP9QIODevicePKc @ 5715 NONAME
+ _ZN6QImage4loadERK7QStringPKc @ 5716 NONAME
+ _ZN6QImage6detachEv @ 5717 NONAME
+ _ZN6QImage7setTextEPKcS1_RK7QString @ 5718 NONAME
+ _ZN6QImage7setTextERK7QStringS2_ @ 5719 NONAME
+ _ZN6QImage8fromDataEPKhiPKc @ 5720 NONAME
+ _ZN6QImage8scanLineEi @ 5721 NONAME
+ _ZN6QImage8setColorEij @ 5722 NONAME
+ _ZN6QImage8setPixelEiij @ 5723 NONAME
+ _ZN6QImage9setOffsetERK6QPoint @ 5724 NONAME
+ _ZN6QImageC1EPKPKc @ 5725 NONAME
+ _ZN6QImageC1EPKcS1_ @ 5726 NONAME
+ _ZN6QImageC1EPKhiiNS_6FormatE @ 5727 NONAME
+ _ZN6QImageC1EPKhiiiNS_6FormatE @ 5728 NONAME
+ _ZN6QImageC1EPhiiNS_6FormatE @ 5729 NONAME
+ _ZN6QImageC1EPhiiiNS_6FormatE @ 5730 NONAME
+ _ZN6QImageC1ERK5QSizeNS_6FormatE @ 5731 NONAME
+ _ZN6QImageC1ERK7QStringPKc @ 5732 NONAME
+ _ZN6QImageC1ERKS_ @ 5733 NONAME
+ _ZN6QImageC1EiiNS_6FormatE @ 5734 NONAME
+ _ZN6QImageC1Ev @ 5735 NONAME
+ _ZN6QImageC2EPKPKc @ 5736 NONAME
+ _ZN6QImageC2EPKcS1_ @ 5737 NONAME
+ _ZN6QImageC2EPKhiiNS_6FormatE @ 5738 NONAME
+ _ZN6QImageC2EPKhiiiNS_6FormatE @ 5739 NONAME
+ _ZN6QImageC2EPhiiNS_6FormatE @ 5740 NONAME
+ _ZN6QImageC2EPhiiiNS_6FormatE @ 5741 NONAME
+ _ZN6QImageC2ERK5QSizeNS_6FormatE @ 5742 NONAME
+ _ZN6QImageC2ERK7QStringPKc @ 5743 NONAME
+ _ZN6QImageC2ERKS_ @ 5744 NONAME
+ _ZN6QImageC2EiiNS_6FormatE @ 5745 NONAME
+ _ZN6QImageC2Ev @ 5746 NONAME
+ _ZN6QImageD0Ev @ 5747 NONAME
+ _ZN6QImageD1Ev @ 5748 NONAME
+ _ZN6QImageD2Ev @ 5749 NONAME
+ _ZN6QImageaSERKS_ @ 5750 NONAME
+ _ZN6QLabel10paintEventEP11QPaintEvent @ 5751 NONAME
+ _ZN6QLabel10setPictureERK8QPicture @ 5752 NONAME
+ _ZN6QLabel11changeEventEP6QEvent @ 5753 NONAME
+ _ZN6QLabel11linkHoveredERK7QString @ 5754 NONAME
+ _ZN6QLabel11qt_metacallEN11QMetaObject4CallEiPPv @ 5755 NONAME
+ _ZN6QLabel11qt_metacastEPKc @ 5756 NONAME
+ _ZN6QLabel11setWordWrapEb @ 5757 NONAME
+ _ZN6QLabel12focusInEventEP11QFocusEvent @ 5758 NONAME
+ _ZN6QLabel12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 5759 NONAME
+ _ZN6QLabel13focusOutEventEP11QFocusEvent @ 5760 NONAME
+ _ZN6QLabel13keyPressEventEP9QKeyEvent @ 5761 NONAME
+ _ZN6QLabel13linkActivatedERK7QString @ 5762 NONAME
+ _ZN6QLabel13setTextFormatEN2Qt10TextFormatE @ 5763 NONAME
+ _ZN6QLabel14mouseMoveEventEP11QMouseEvent @ 5764 NONAME
+ _ZN6QLabel15mousePressEventEP11QMouseEvent @ 5765 NONAME
+ _ZN6QLabel16contextMenuEventEP17QContextMenuEvent @ 5766 NONAME
+ _ZN6QLabel16staticMetaObjectE @ 5767 NONAME DATA 16
+ _ZN6QLabel17mouseReleaseEventEP11QMouseEvent @ 5768 NONAME
+ _ZN6QLabel17setScaledContentsEb @ 5769 NONAME
+ _ZN6QLabel18focusNextPrevChildEb @ 5770 NONAME
+ _ZN6QLabel19getStaticMetaObjectEv @ 5771 NONAME
+ _ZN6QLabel20setOpenExternalLinksEb @ 5772 NONAME
+ _ZN6QLabel23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 5773 NONAME
+ _ZN6QLabel5clearEv @ 5774 NONAME
+ _ZN6QLabel5eventEP6QEvent @ 5775 NONAME
+ _ZN6QLabel6setNumEd @ 5776 NONAME
+ _ZN6QLabel6setNumEi @ 5777 NONAME
+ _ZN6QLabel7setTextERK7QString @ 5778 NONAME
+ _ZN6QLabel8setBuddyEP7QWidget @ 5779 NONAME
+ _ZN6QLabel8setMovieEP6QMovie @ 5780 NONAME
+ _ZN6QLabel9setIndentEi @ 5781 NONAME
+ _ZN6QLabel9setMarginEi @ 5782 NONAME
+ _ZN6QLabel9setPixmapERK7QPixmap @ 5783 NONAME
+ _ZN6QLabelC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5784 NONAME
+ _ZN6QLabelC1ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5785 NONAME
+ _ZN6QLabelC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5786 NONAME
+ _ZN6QLabelC2ERK7QStringP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5787 NONAME
+ _ZN6QLabelD0Ev @ 5788 NONAME
+ _ZN6QLabelD1Ev @ 5789 NONAME
+ _ZN6QLabelD2Ev @ 5790 NONAME
+ _ZN6QMovie10scaledSizeEv @ 5791 NONAME
+ _ZN6QMovie11jumpToFrameEi @ 5792 NONAME
+ _ZN6QMovie11qt_metacallEN11QMetaObject4CallEiPPv @ 5793 NONAME
+ _ZN6QMovie11qt_metacastEPKc @ 5794 NONAME
+ _ZN6QMovie11setFileNameERK7QString @ 5795 NONAME
+ _ZN6QMovie12frameChangedEi @ 5796 NONAME
+ _ZN6QMovie12setCacheModeENS_9CacheModeE @ 5797 NONAME
+ _ZN6QMovie12stateChangedENS_10MovieStateE @ 5798 NONAME
+ _ZN6QMovie13setScaledSizeERK5QSize @ 5799 NONAME
+ _ZN6QMovie15jumpToNextFrameEv @ 5800 NONAME
+ _ZN6QMovie16staticMetaObjectE @ 5801 NONAME DATA 16
+ _ZN6QMovie16supportedFormatsEv @ 5802 NONAME
+ _ZN6QMovie18setBackgroundColorERK6QColor @ 5803 NONAME
+ _ZN6QMovie19getStaticMetaObjectEv @ 5804 NONAME
+ _ZN6QMovie4stopEv @ 5805 NONAME
+ _ZN6QMovie5errorEN12QImageReader16ImageReaderErrorE @ 5806 NONAME
+ _ZN6QMovie5startEv @ 5807 NONAME
+ _ZN6QMovie7resizedERK5QSize @ 5808 NONAME
+ _ZN6QMovie7startedEv @ 5809 NONAME
+ _ZN6QMovie7updatedERK5QRect @ 5810 NONAME
+ _ZN6QMovie8finishedEv @ 5811 NONAME
+ _ZN6QMovie8setSpeedEi @ 5812 NONAME
+ _ZN6QMovie9cacheModeEv @ 5813 NONAME
+ _ZN6QMovie9setDeviceEP9QIODevice @ 5814 NONAME
+ _ZN6QMovie9setFormatERK10QByteArray @ 5815 NONAME
+ _ZN6QMovie9setPausedEb @ 5816 NONAME
+ _ZN6QMovieC1EP7QObject @ 5817 NONAME
+ _ZN6QMovieC1EP9QIODeviceRK10QByteArrayP7QObject @ 5818 NONAME
+ _ZN6QMovieC1ERK7QStringRK10QByteArrayP7QObject @ 5819 NONAME
+ _ZN6QMovieC2EP7QObject @ 5820 NONAME
+ _ZN6QMovieC2EP9QIODeviceRK10QByteArrayP7QObject @ 5821 NONAME
+ _ZN6QMovieC2ERK7QStringRK10QByteArrayP7QObject @ 5822 NONAME
+ _ZN6QMovieD0Ev @ 5823 NONAME
+ _ZN6QMovieD1Ev @ 5824 NONAME
+ _ZN6QMovieD2Ev @ 5825 NONAME
+ _ZN6QSound11isAvailableEv @ 5826 NONAME
+ _ZN6QSound11qt_metacallEN11QMetaObject4CallEiPPv @ 5827 NONAME
+ _ZN6QSound11qt_metacastEPKc @ 5828 NONAME
+ _ZN6QSound16staticMetaObjectE @ 5829 NONAME DATA 16
+ _ZN6QSound19getStaticMetaObjectEv @ 5830 NONAME
+ _ZN6QSound4playERK7QString @ 5831 NONAME
+ _ZN6QSound4playEv @ 5832 NONAME
+ _ZN6QSound4stopEv @ 5833 NONAME
+ _ZN6QSound8setLoopsEi @ 5834 NONAME
+ _ZN6QSoundC1ERK7QStringP7QObject @ 5835 NONAME
+ _ZN6QSoundC2ERK7QStringP7QObject @ 5836 NONAME
+ _ZN6QSoundD0Ev @ 5837 NONAME
+ _ZN6QSoundD1Ev @ 5838 NONAME
+ _ZN6QSoundD2Ev @ 5839 NONAME
+ _ZN6QStyle10visualRectEN2Qt15LayoutDirectionERK5QRectS4_ @ 5840 NONAME
+ _ZN6QStyle11alignedRectEN2Qt15LayoutDirectionE6QFlagsINS0_13AlignmentFlagEERK5QSizeRK5QRect @ 5841 NONAME
+ _ZN6QStyle11qt_metacallEN11QMetaObject4CallEiPPv @ 5842 NONAME
+ _ZN6QStyle11qt_metacastEPKc @ 5843 NONAME
+ _ZN6QStyle15visualAlignmentEN2Qt15LayoutDirectionE6QFlagsINS0_13AlignmentFlagEE @ 5844 NONAME
+ _ZN6QStyle16staticMetaObjectE @ 5845 NONAME DATA 16
+ _ZN6QStyle19getStaticMetaObjectEv @ 5846 NONAME
+ _ZN6QStyle23sliderPositionFromValueEiiiib @ 5847 NONAME
+ _ZN6QStyle23sliderValueFromPositionEiiiib @ 5848 NONAME
+ _ZN6QStyle6polishEP12QApplication @ 5849 NONAME
+ _ZN6QStyle6polishEP7QWidget @ 5850 NONAME
+ _ZN6QStyle6polishER8QPalette @ 5851 NONAME
+ _ZN6QStyle8setProxyEPS_ @ 5852 NONAME
+ _ZN6QStyle8unpolishEP12QApplication @ 5853 NONAME
+ _ZN6QStyle8unpolishEP7QWidget @ 5854 NONAME
+ _ZN6QStyle9visualPosEN2Qt15LayoutDirectionERK5QRectRK6QPoint @ 5855 NONAME
+ _ZN6QStyleC2ER13QStylePrivate @ 5856 NONAME
+ _ZN6QStyleC2Ev @ 5857 NONAME
+ _ZN6QStyleD0Ev @ 5858 NONAME
+ _ZN6QStyleD1Ev @ 5859 NONAME
+ _ZN6QStyleD2Ev @ 5860 NONAME
+ _ZN7QAction10setCheckedEb @ 5861 NONAME
+ _ZN7QAction10setEnabledEb @ 5862 NONAME
+ _ZN7QAction10setToolTipERK7QString @ 5863 NONAME
+ _ZN7QAction10setVisibleEb @ 5864 NONAME
+ _ZN7QAction11qt_metacallEN11QMetaObject4CallEiPPv @ 5865 NONAME
+ _ZN7QAction11qt_metacastEPKc @ 5866 NONAME
+ _ZN7QAction11setIconTextERK7QString @ 5867 NONAME
+ _ZN7QAction11setMenuRoleENS_8MenuRoleE @ 5868 NONAME
+ _ZN7QAction11setPriorityENS_8PriorityE @ 5869 NONAME
+ _ZN7QAction11setShortcutERK12QKeySequence @ 5870 NONAME
+ _ZN7QAction12setCheckableEb @ 5871 NONAME
+ _ZN7QAction12setSeparatorEb @ 5872 NONAME
+ _ZN7QAction12setShortcutsEN12QKeySequence11StandardKeyE @ 5873 NONAME
+ _ZN7QAction12setShortcutsERK5QListI12QKeySequenceE @ 5874 NONAME
+ _ZN7QAction12setStatusTipERK7QString @ 5875 NONAME
+ _ZN7QAction12setWhatsThisERK7QString @ 5876 NONAME
+ _ZN7QAction13setAutoRepeatEb @ 5877 NONAME
+ _ZN7QAction14setActionGroupEP12QActionGroup @ 5878 NONAME
+ _ZN7QAction14setSoftKeyRoleENS_11SoftKeyRoleE @ 5879 NONAME
+ _ZN7QAction14showStatusTextEP7QWidget @ 5880 NONAME
+ _ZN7QAction16staticMetaObjectE @ 5881 NONAME DATA 16
+ _ZN7QAction18setShortcutContextEN2Qt15ShortcutContextE @ 5882 NONAME
+ _ZN7QAction19getStaticMetaObjectEv @ 5883 NONAME
+ _ZN7QAction20setIconVisibleInMenuEb @ 5884 NONAME
+ _ZN7QAction5eventEP6QEvent @ 5885 NONAME
+ _ZN7QAction6toggleEv @ 5886 NONAME
+ _ZN7QAction7changedEv @ 5887 NONAME
+ _ZN7QAction7hoveredEv @ 5888 NONAME
+ _ZN7QAction7setDataERK8QVariant @ 5889 NONAME
+ _ZN7QAction7setFontERK5QFont @ 5890 NONAME
+ _ZN7QAction7setIconERK5QIcon @ 5891 NONAME
+ _ZN7QAction7setMenuEP5QMenu @ 5892 NONAME
+ _ZN7QAction7setTextERK7QString @ 5893 NONAME
+ _ZN7QAction7toggledEb @ 5894 NONAME
+ _ZN7QAction8activateENS_11ActionEventE @ 5895 NONAME
+ _ZN7QAction9triggeredEb @ 5896 NONAME
+ _ZN7QActionC1EP7QObject @ 5897 NONAME
+ _ZN7QActionC1ER14QActionPrivateP7QObject @ 5898 NONAME
+ _ZN7QActionC1ERK5QIconRK7QStringP7QObject @ 5899 NONAME
+ _ZN7QActionC1ERK7QStringP7QObject @ 5900 NONAME
+ _ZN7QActionC2EP7QObject @ 5901 NONAME
+ _ZN7QActionC2ER14QActionPrivateP7QObject @ 5902 NONAME
+ _ZN7QActionC2ERK5QIconRK7QStringP7QObject @ 5903 NONAME
+ _ZN7QActionC2ERK7QStringP7QObject @ 5904 NONAME
+ _ZN7QActionD0Ev @ 5905 NONAME
+ _ZN7QActionD1Ev @ 5906 NONAME
+ _ZN7QActionD2Ev @ 5907 NONAME
+ _ZN7QBezier10fromPointsERK7QPointFS2_S2_S2_ @ 5908 NONAME
+ _ZN7QBezier17findIntersectionsERKS_S1_ @ 5909 NONAME
+ _ZN7QBezier17findIntersectionsERKS_S1_P7QVectorI5QPairIffEE @ 5910 NONAME
+ _ZN7QBezier20splitAtIntersectionsERS_ @ 5911 NONAME
+ _ZN7QBitmap8fromDataERK5QSizePKhN6QImage6FormatE @ 5912 NONAME
+ _ZN7QBitmap9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 5913 NONAME
+ _ZN7QBitmapC1ERK5QSize @ 5914 NONAME
+ _ZN7QBitmapC1ERK7QPixmap @ 5915 NONAME
+ _ZN7QBitmapC1ERK7QStringPKc @ 5916 NONAME
+ _ZN7QBitmapC1Eii @ 5917 NONAME
+ _ZN7QBitmapC1Ev @ 5918 NONAME
+ _ZN7QBitmapC2ERK5QSize @ 5919 NONAME
+ _ZN7QBitmapC2ERK7QPixmap @ 5920 NONAME
+ _ZN7QBitmapC2ERK7QStringPKc @ 5921 NONAME
+ _ZN7QBitmapC2Eii @ 5922 NONAME
+ _ZN7QBitmapC2Ev @ 5923 NONAME
+ _ZN7QBitmapD0Ev @ 5924 NONAME
+ _ZN7QBitmapD1Ev @ 5925 NONAME
+ _ZN7QBitmapD2Ev @ 5926 NONAME
+ _ZN7QBitmapaSERK7QPixmap @ 5927 NONAME
+ _ZN7QCursor3posEv @ 5928 NONAME
+ _ZN7QCursor6setPosEii @ 5929 NONAME
+ _ZN7QCursor8setShapeEN2Qt11CursorShapeE @ 5930 NONAME
+ _ZN7QCursorC1EN2Qt11CursorShapeE @ 5931 NONAME
+ _ZN7QCursorC1ERK7QBitmapS2_ii @ 5932 NONAME
+ _ZN7QCursorC1ERK7QPixmapii @ 5933 NONAME
+ _ZN7QCursorC1ERKS_ @ 5934 NONAME
+ _ZN7QCursorC1Ev @ 5935 NONAME
+ _ZN7QCursorC2EN2Qt11CursorShapeE @ 5936 NONAME
+ _ZN7QCursorC2ERK7QBitmapS2_ii @ 5937 NONAME
+ _ZN7QCursorC2ERK7QPixmapii @ 5938 NONAME
+ _ZN7QCursorC2ERKS_ @ 5939 NONAME
+ _ZN7QCursorC2Ev @ 5940 NONAME
+ _ZN7QCursorD1Ev @ 5941 NONAME
+ _ZN7QCursorD2Ev @ 5942 NONAME
+ _ZN7QCursoraSERKS_ @ 5943 NONAME
+ _ZN7QDialog10closeEventEP11QCloseEvent @ 5944 NONAME
+ _ZN7QDialog10setVisibleEb @ 5945 NONAME
+ _ZN7QDialog11eventFilterEP7QObjectP6QEvent @ 5946 NONAME
+ _ZN7QDialog11qt_metacallEN11QMetaObject4CallEiPPv @ 5947 NONAME
+ _ZN7QDialog11qt_metacastEPKc @ 5948 NONAME
+ _ZN7QDialog11resizeEventEP12QResizeEvent @ 5949 NONAME
+ _ZN7QDialog12setExtensionEP7QWidget @ 5950 NONAME
+ _ZN7QDialog13keyPressEventEP9QKeyEvent @ 5951 NONAME
+ _ZN7QDialog13showExtensionEb @ 5952 NONAME
+ _ZN7QDialog14adjustPositionEP7QWidget @ 5953 NONAME
+ _ZN7QDialog14setOrientationEN2Qt11OrientationE @ 5954 NONAME
+ _ZN7QDialog16contextMenuEventEP17QContextMenuEvent @ 5955 NONAME
+ _ZN7QDialog16staticMetaObjectE @ 5956 NONAME DATA 16
+ _ZN7QDialog18setSizeGripEnabledEb @ 5957 NONAME
+ _ZN7QDialog19getStaticMetaObjectEv @ 5958 NONAME
+ _ZN7QDialog19s60AdjustedPositionEv @ 5959 NONAME
+ _ZN7QDialog4doneEi @ 5960 NONAME
+ _ZN7QDialog4execEv @ 5961 NONAME
+ _ZN7QDialog4openEv @ 5962 NONAME
+ _ZN7QDialog5eventEP6QEvent @ 5963 NONAME
+ _ZN7QDialog6acceptEv @ 5964 NONAME
+ _ZN7QDialog6rejectEv @ 5965 NONAME
+ _ZN7QDialog8acceptedEv @ 5966 NONAME
+ _ZN7QDialog8finishedEi @ 5967 NONAME
+ _ZN7QDialog8rejectedEv @ 5968 NONAME
+ _ZN7QDialog8setModalEb @ 5969 NONAME
+ _ZN7QDialog9setResultEi @ 5970 NONAME
+ _ZN7QDialog9showEventEP10QShowEvent @ 5971 NONAME
+ _ZN7QDialogC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5972 NONAME
+ _ZN7QDialogC1ER14QDialogPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5973 NONAME
+ _ZN7QDialogC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5974 NONAME
+ _ZN7QDialogC2ER14QDialogPrivateP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 5975 NONAME
+ _ZN7QDialogD0Ev @ 5976 NONAME
+ _ZN7QDialogD1Ev @ 5977 NONAME
+ _ZN7QDialogD2Ev @ 5978 NONAME
+ _ZN7QLayout10childEventEP11QChildEvent @ 5979 NONAME
+ _ZN7QLayout10invalidateEv @ 5980 NONAME
+ _ZN7QLayout10removeItemEP11QLayoutItem @ 5981 NONAME
+ _ZN7QLayout10setEnabledEb @ 5982 NONAME
+ _ZN7QLayout10setMenuBarEP7QWidget @ 5983 NONAME
+ _ZN7QLayout10setSpacingEi @ 5984 NONAME
+ _ZN7QLayout11qt_metacallEN11QMetaObject4CallEiPPv @ 5985 NONAME
+ _ZN7QLayout11qt_metacastEPKc @ 5986 NONAME
+ _ZN7QLayout11setGeometryERK5QRect @ 5987 NONAME
+ _ZN7QLayout11widgetEventEP6QEvent @ 5988 NONAME
+ _ZN7QLayout12removeWidgetEP7QWidget @ 5989 NONAME
+ _ZN7QLayout12setAlignmentEP7QWidget6QFlagsIN2Qt13AlignmentFlagEE @ 5990 NONAME
+ _ZN7QLayout12setAlignmentEPS_6QFlagsIN2Qt13AlignmentFlagEE @ 5991 NONAME
+ _ZN7QLayout14addChildLayoutEPS_ @ 5992 NONAME
+ _ZN7QLayout14addChildWidgetEP7QWidget @ 5993 NONAME
+ _ZN7QLayout16staticMetaObjectE @ 5994 NONAME DATA 16
+ _ZN7QLayout17setSizeConstraintENS_14SizeConstraintE @ 5995 NONAME
+ _ZN7QLayout18setContentsMarginsEiiii @ 5996 NONAME
+ _ZN7QLayout19getStaticMetaObjectEv @ 5997 NONAME
+ _ZN7QLayout21closestAcceptableSizeEPK7QWidgetRK5QSize @ 5998 NONAME
+ _ZN7QLayout23activateRecursiveHelperEP11QLayoutItem @ 5999 NONAME
+ _ZN7QLayout6layoutEv @ 6000 NONAME
+ _ZN7QLayout6updateEv @ 6001 NONAME
+ _ZN7QLayout8activateEv @ 6002 NONAME
+ _ZN7QLayout9addWidgetEP7QWidget @ 6003 NONAME
+ _ZN7QLayout9setMarginEi @ 6004 NONAME
+ _ZN7QLayoutC2EP7QWidget @ 6005 NONAME
+ _ZN7QLayoutC2ER14QLayoutPrivatePS_P7QWidget @ 6006 NONAME
+ _ZN7QLayoutC2Ev @ 6007 NONAME
+ _ZN7QLayoutD0Ev @ 6008 NONAME
+ _ZN7QLayoutD1Ev @ 6009 NONAME
+ _ZN7QLayoutD2Ev @ 6010 NONAME
+ _ZN7QMatrix5resetEv @ 6011 NONAME
+ _ZN7QMatrix5scaleEff @ 6012 NONAME
+ _ZN7QMatrix5shearEff @ 6013 NONAME
+ _ZN7QMatrix6rotateEf @ 6014 NONAME
+ _ZN7QMatrix9setMatrixEffffff @ 6015 NONAME
+ _ZN7QMatrix9translateEff @ 6016 NONAME
+ _ZN7QMatrixC1ERKS_ @ 6017 NONAME
+ _ZN7QMatrixC1Effffff @ 6018 NONAME
+ _ZN7QMatrixC1Ev @ 6019 NONAME
+ _ZN7QMatrixC2ERKS_ @ 6020 NONAME
+ _ZN7QMatrixC2Effffff @ 6021 NONAME
+ _ZN7QMatrixC2Ev @ 6022 NONAME
+ _ZN7QMatrixaSERKS_ @ 6023 NONAME
+ _ZN7QMatrixmLERKS_ @ 6024 NONAME
+ _ZN7QPixmap10grabWidgetEP7QWidgetRK5QRect @ 6025 NONAME
+ _ZN7QPixmap10grabWindowEP11CCoeControliiii @ 6026 NONAME
+ _ZN7QPixmap10trueMatrixERK10QTransformii @ 6027 NONAME
+ _ZN7QPixmap10trueMatrixERK7QMatrixii @ 6028 NONAME
+ _ZN7QPixmap12defaultDepthEv @ 6029 NONAME
+ _ZN7QPixmap12loadFromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 6030 NONAME
+ _ZN7QPixmap15setAlphaChannelERKS_ @ 6031 NONAME
+ _ZN7QPixmap19fromSymbianRSgImageEP8RSgImage @ 6032 NONAME
+ _ZN7QPixmap21fromSymbianCFbsBitmapEP10CFbsBitmap @ 6033 NONAME
+ _ZN7QPixmap4fillEPK7QWidgetRK6QPoint @ 6034 NONAME
+ _ZN7QPixmap4fillERK6QColor @ 6035 NONAME
+ _ZN7QPixmap4initEiiNS_4TypeE @ 6036 NONAME
+ _ZN7QPixmap4initEiii @ 6037 NONAME
+ _ZN7QPixmap4loadERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 6038 NONAME
+ _ZN7QPixmap5derefEv @ 6039 NONAME
+ _ZN7QPixmap6detachEv @ 6040 NONAME
+ _ZN7QPixmap6scrollEiiRK5QRectP7QRegion @ 6041 NONAME
+ _ZN7QPixmap7setMaskERK7QBitmap @ 6042 NONAME
+ _ZN7QPixmap9fromImageERK6QImage6QFlagsIN2Qt19ImageConversionFlagEE @ 6043 NONAME
+ _ZN7QPixmapC1EP11QPixmapData @ 6044 NONAME
+ _ZN7QPixmapC1EPKPKc @ 6045 NONAME
+ _ZN7QPixmapC1ERK5QSize @ 6046 NONAME
+ _ZN7QPixmapC1ERK5QSizeNS_4TypeE @ 6047 NONAME
+ _ZN7QPixmapC1ERK5QSizei @ 6048 NONAME
+ _ZN7QPixmapC1ERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 6049 NONAME
+ _ZN7QPixmapC1ERKS_ @ 6050 NONAME
+ _ZN7QPixmapC1Eii @ 6051 NONAME
+ _ZN7QPixmapC1Ev @ 6052 NONAME
+ _ZN7QPixmapC2EP11QPixmapData @ 6053 NONAME
+ _ZN7QPixmapC2EPKPKc @ 6054 NONAME
+ _ZN7QPixmapC2ERK5QSize @ 6055 NONAME
+ _ZN7QPixmapC2ERK5QSizeNS_4TypeE @ 6056 NONAME
+ _ZN7QPixmapC2ERK5QSizei @ 6057 NONAME
+ _ZN7QPixmapC2ERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 6058 NONAME
+ _ZN7QPixmapC2ERKS_ @ 6059 NONAME
+ _ZN7QPixmapC2Eii @ 6060 NONAME
+ _ZN7QPixmapC2Ev @ 6061 NONAME
+ _ZN7QPixmapD0Ev @ 6062 NONAME
+ _ZN7QPixmapD1Ev @ 6063 NONAME
+ _ZN7QPixmapD2Ev @ 6064 NONAME
+ _ZN7QPixmapaSERKS_ @ 6065 NONAME
+ _ZN7QRegion12shared_emptyE @ 6066 NONAME DATA 8
+ _ZN7QRegion4execERK10QByteArrayiN11QDataStream9ByteOrderE @ 6067 NONAME
+ _ZN7QRegion6detachEv @ 6068 NONAME
+ _ZN7QRegion7cleanUpEPNS_11QRegionDataE @ 6069 NONAME
+ _ZN7QRegion8setRectsEPK5QRecti @ 6070 NONAME
+ _ZN7QRegion9translateEii @ 6071 NONAME
+ _ZN7QRegionC1ERK5QRectNS_10RegionTypeE @ 6072 NONAME
+ _ZN7QRegionC1ERK7QBitmap @ 6073 NONAME
+ _ZN7QRegionC1ERK8QPolygonN2Qt8FillRuleE @ 6074 NONAME
+ _ZN7QRegionC1ERKS_ @ 6075 NONAME
+ _ZN7QRegionC1EiiiiNS_10RegionTypeE @ 6076 NONAME
+ _ZN7QRegionC1Ev @ 6077 NONAME
+ _ZN7QRegionC2ERK5QRectNS_10RegionTypeE @ 6078 NONAME
+ _ZN7QRegionC2ERK7QBitmap @ 6079 NONAME
+ _ZN7QRegionC2ERK8QPolygonN2Qt8FillRuleE @ 6080 NONAME
+ _ZN7QRegionC2ERKS_ @ 6081 NONAME
+ _ZN7QRegionC2EiiiiNS_10RegionTypeE @ 6082 NONAME
+ _ZN7QRegionC2Ev @ 6083 NONAME
+ _ZN7QRegionD1Ev @ 6084 NONAME
+ _ZN7QRegionD2Ev @ 6085 NONAME
+ _ZN7QRegionaNERK5QRect @ 6086 NONAME
+ _ZN7QRegionaNERKS_ @ 6087 NONAME
+ _ZN7QRegionaSERKS_ @ 6088 NONAME
+ _ZN7QRegioneOERKS_ @ 6089 NONAME
+ _ZN7QRegionmIERKS_ @ 6090 NONAME
+ _ZN7QRegionoRERKS_ @ 6091 NONAME
+ _ZN7QRegionpLERK5QRect @ 6092 NONAME
+ _ZN7QRegionpLERKS_ @ 6093 NONAME
+ _ZN7QSlider10paintEventEP11QPaintEvent @ 6094 NONAME
+ _ZN7QSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 6095 NONAME
+ _ZN7QSlider11qt_metacastEPKc @ 6096 NONAME
+ _ZN7QSlider14mouseMoveEventEP11QMouseEvent @ 6097 NONAME
+ _ZN7QSlider15mousePressEventEP11QMouseEvent @ 6098 NONAME
+ _ZN7QSlider15setTickIntervalEi @ 6099 NONAME
+ _ZN7QSlider15setTickPositionENS_12TickPositionE @ 6100 NONAME
+ _ZN7QSlider16staticMetaObjectE @ 6101 NONAME DATA 16
+ _ZN7QSlider17mouseReleaseEventEP11QMouseEvent @ 6102 NONAME
+ _ZN7QSlider19getStaticMetaObjectEv @ 6103 NONAME
+ _ZN7QSlider5eventEP6QEvent @ 6104 NONAME
+ _ZN7QSliderC1EN2Qt11OrientationEP7QWidget @ 6105 NONAME
+ _ZN7QSliderC1EP7QWidget @ 6106 NONAME
+ _ZN7QSliderC2EN2Qt11OrientationEP7QWidget @ 6107 NONAME
+ _ZN7QSliderC2EP7QWidget @ 6108 NONAME
+ _ZN7QSliderD0Ev @ 6109 NONAME
+ _ZN7QSliderD1Ev @ 6110 NONAME
+ _ZN7QSliderD2Ev @ 6111 NONAME
+ _ZN7QTabBar10paintEventEP11QPaintEvent @ 6112 NONAME
+ _ZN7QTabBar10setMovableEb @ 6113 NONAME
+ _ZN7QTabBar10setTabDataEiRK8QVariant @ 6114 NONAME
+ _ZN7QTabBar10setTabIconEiRK5QIcon @ 6115 NONAME
+ _ZN7QTabBar10setTabTextEiRK7QString @ 6116 NONAME
+ _ZN7QTabBar10tabRemovedEi @ 6117 NONAME
+ _ZN7QTabBar10wheelEventEP11QWheelEvent @ 6118 NONAME
+ _ZN7QTabBar11changeEventEP6QEvent @ 6119 NONAME
+ _ZN7QTabBar11qt_metacallEN11QMetaObject4CallEiPPv @ 6120 NONAME
+ _ZN7QTabBar11qt_metacastEPKc @ 6121 NONAME
+ _ZN7QTabBar11resizeEventEP12QResizeEvent @ 6122 NONAME
+ _ZN7QTabBar11setDrawBaseEb @ 6123 NONAME
+ _ZN7QTabBar11setIconSizeERK5QSize @ 6124 NONAME
+ _ZN7QTabBar11tabInsertedEi @ 6125 NONAME
+ _ZN7QTabBar12setElideModeEN2Qt13TextElideModeE @ 6126 NONAME
+ _ZN7QTabBar12setExpandingEb @ 6127 NONAME
+ _ZN7QTabBar12setTabButtonEiNS_14ButtonPositionEP7QWidget @ 6128 NONAME
+ _ZN7QTabBar13keyPressEventEP9QKeyEvent @ 6129 NONAME
+ _ZN7QTabBar13setTabEnabledEib @ 6130 NONAME
+ _ZN7QTabBar13setTabToolTipEiRK7QString @ 6131 NONAME
+ _ZN7QTabBar14currentChangedEi @ 6132 NONAME
+ _ZN7QTabBar14mouseMoveEventEP11QMouseEvent @ 6133 NONAME
+ _ZN7QTabBar15mousePressEventEP11QMouseEvent @ 6134 NONAME
+ _ZN7QTabBar15setCurrentIndexEi @ 6135 NONAME
+ _ZN7QTabBar15setDocumentModeEb @ 6136 NONAME
+ _ZN7QTabBar15setTabTextColorEiRK6QColor @ 6137 NONAME
+ _ZN7QTabBar15setTabWhatsThisEiRK7QString @ 6138 NONAME
+ _ZN7QTabBar15setTabsClosableEb @ 6139 NONAME
+ _ZN7QTabBar15tabLayoutChangeEv @ 6140 NONAME
+ _ZN7QTabBar16staticMetaObjectE @ 6141 NONAME DATA 16
+ _ZN7QTabBar17mouseReleaseEventEP11QMouseEvent @ 6142 NONAME
+ _ZN7QTabBar17tabCloseRequestedEi @ 6143 NONAME
+ _ZN7QTabBar19getStaticMetaObjectEv @ 6144 NONAME
+ _ZN7QTabBar20setUsesScrollButtonsEb @ 6145 NONAME
+ _ZN7QTabBar28setSelectionBehaviorOnRemoveENS_17SelectionBehaviorE @ 6146 NONAME
+ _ZN7QTabBar5eventEP6QEvent @ 6147 NONAME
+ _ZN7QTabBar6addTabERK5QIconRK7QString @ 6148 NONAME
+ _ZN7QTabBar6addTabERK7QString @ 6149 NONAME
+ _ZN7QTabBar7moveTabEii @ 6150 NONAME
+ _ZN7QTabBar8setShapeENS_5ShapeE @ 6151 NONAME
+ _ZN7QTabBar8tabMovedEii @ 6152 NONAME
+ _ZN7QTabBar9hideEventEP10QHideEvent @ 6153 NONAME
+ _ZN7QTabBar9insertTabEiRK5QIconRK7QString @ 6154 NONAME
+ _ZN7QTabBar9insertTabEiRK7QString @ 6155 NONAME
+ _ZN7QTabBar9removeTabEi @ 6156 NONAME
+ _ZN7QTabBar9showEventEP10QShowEvent @ 6157 NONAME
+ _ZN7QTabBarC1EP7QWidget @ 6158 NONAME
+ _ZN7QTabBarC2EP7QWidget @ 6159 NONAME
+ _ZN7QTabBarD0Ev @ 6160 NONAME
+ _ZN7QTabBarD1Ev @ 6161 NONAME
+ _ZN7QTabBarD2Ev @ 6162 NONAME
+ _ZN7QWidget10addActionsE5QListIP7QActionE @ 6163 NONAME
+ _ZN7QWidget10adjustSizeEv @ 6164 NONAME
+ _ZN7QWidget10clearFocusEv @ 6165 NONAME
+ _ZN7QWidget10closeEventEP11QCloseEvent @ 6166 NONAME
+ _ZN7QWidget10enterEventEP6QEvent @ 6167 NONAME
+ _ZN7QWidget10fontChangeERK5QFont @ 6168 NONAME
+ _ZN7QWidget10leaveEventEP6QEvent @ 6169 NONAME
+ _ZN7QWidget10paintEventEP11QPaintEvent @ 6170 NONAME
+ _ZN7QWidget10setEnabledEb @ 6171 NONAME
+ _ZN7QWidget10setPaletteERK8QPalette @ 6172 NONAME
+ _ZN7QWidget10setToolTipERK7QString @ 6173 NONAME
+ _ZN7QWidget10setVisibleEb @ 6174 NONAME
+ _ZN7QWidget10showNormalEv @ 6175 NONAME
+ _ZN7QWidget10stackUnderEPS_ @ 6176 NONAME
+ _ZN7QWidget10takeLayoutEv @ 6177 NONAME
+ _ZN7QWidget10wheelEventEP11QWheelEvent @ 6178 NONAME
+ _ZN7QWidget11actionEventEP12QActionEvent @ 6179 NONAME
+ _ZN7QWidget11changeEventEP6QEvent @ 6180 NONAME
+ _ZN7QWidget11createWinIdEv @ 6181 NONAME
+ _ZN7QWidget11grabGestureEN2Qt11GestureTypeENS0_14GestureContextE @ 6182 NONAME
+ _ZN7QWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 6183 NONAME
+ _ZN7QWidget11qt_metacastEPKc @ 6184 NONAME
+ _ZN7QWidget11resizeEventEP12QResizeEvent @ 6185 NONAME
+ _ZN7QWidget11setBaseSizeEii @ 6186 NONAME
+ _ZN7QWidget11setDisabledEb @ 6187 NONAME
+ _ZN7QWidget11setGeometryERK5QRect @ 6188 NONAME
+ _ZN7QWidget11setTabOrderEPS_S0_ @ 6189 NONAME
+ _ZN7QWidget11styleChangeER6QStyle @ 6190 NONAME
+ _ZN7QWidget11tabletEventEP12QTabletEvent @ 6191 NONAME
+ _ZN7QWidget11unsetCursorEv @ 6192 NONAME
+ _ZN7QWidget11unsetLocaleEv @ 6193 NONAME
+ _ZN7QWidget12focusInEventEP11QFocusEvent @ 6194 NONAME
+ _ZN7QWidget12grabKeyboardEv @ 6195 NONAME
+ _ZN7QWidget12grabShortcutERK12QKeySequenceN2Qt15ShortcutContextE @ 6196 NONAME
+ _ZN7QWidget12inputContextEv @ 6197 NONAME
+ _ZN7QWidget12insertActionEP7QActionS1_ @ 6198 NONAME
+ _ZN7QWidget12mouseGrabberEv @ 6199 NONAME
+ _ZN7QWidget12releaseMouseEv @ 6200 NONAME
+ _ZN7QWidget12removeActionEP7QAction @ 6201 NONAME
+ _ZN7QWidget12setAttributeEN2Qt15WidgetAttributeEb @ 6202 NONAME
+ _ZN7QWidget12setEditFocusEb @ 6203 NONAME
+ _ZN7QWidget12setFixedSizeERK5QSize @ 6204 NONAME
+ _ZN7QWidget12setFixedSizeEii @ 6205 NONAME
+ _ZN7QWidget12setStatusTipERK7QString @ 6206 NONAME
+ _ZN7QWidget12setWhatsThisERK7QString @ 6207 NONAME
+ _ZN7QWidget13dragMoveEventEP14QDragMoveEvent @ 6208 NONAME
+ _ZN7QWidget13enabledChangeEb @ 6209 NONAME
+ _ZN7QWidget13focusOutEventEP11QFocusEvent @ 6210 NONAME
+ _ZN7QWidget13insertActionsEP7QAction5QListIS1_E @ 6211 NONAME
+ _ZN7QWidget13keyPressEventEP9QKeyEvent @ 6212 NONAME
+ _ZN7QWidget13paletteChangeERK8QPalette @ 6213 NONAME
+ _ZN7QWidget13setFixedWidthEi @ 6214 NONAME
+ _ZN7QWidget13setFocusProxyEPS_ @ 6215 NONAME
+ _ZN7QWidget13setSizePolicyE11QSizePolicy @ 6216 NONAME
+ _ZN7QWidget13setStyleSheetERK7QString @ 6217 NONAME
+ _ZN7QWidget13setWindowIconERK5QIcon @ 6218 NONAME
+ _ZN7QWidget13setWindowRoleERK7QString @ 6219 NONAME
+ _ZN7QWidget13showMaximizedEv @ 6220 NONAME
+ _ZN7QWidget13showMinimizedEv @ 6221 NONAME
+ _ZN7QWidget14activateWindowEv @ 6222 NONAME
+ _ZN7QWidget14dragEnterEventEP15QDragEnterEvent @ 6223 NONAME
+ _ZN7QWidget14dragLeaveEventEP15QDragLeaveEvent @ 6224 NONAME
+ _ZN7QWidget14languageChangeEv @ 6225 NONAME
+ _ZN7QWidget14mouseMoveEventEP11QMouseEvent @ 6226 NONAME
+ _ZN7QWidget14setAcceptDropsEb @ 6227 NONAME
+ _ZN7QWidget14setFixedHeightEi @ 6228 NONAME
+ _ZN7QWidget14setFocusPolicyEN2Qt11FocusPolicyE @ 6229 NONAME
+ _ZN7QWidget14setMaximumSizeEii @ 6230 NONAME
+ _ZN7QWidget14setMinimumSizeEii @ 6231 NONAME
+ _ZN7QWidget14setWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 6232 NONAME
+ _ZN7QWidget14setWindowStateE6QFlagsIN2Qt11WindowStateEE @ 6233 NONAME
+ _ZN7QWidget14setWindowTitleERK7QString @ 6234 NONAME
+ _ZN7QWidget14showFullScreenEv @ 6235 NONAME
+ _ZN7QWidget14updateGeometryEv @ 6236 NONAME
+ _ZN7QWidget15keyReleaseEventEP9QKeyEvent @ 6237 NONAME
+ _ZN7QWidget15keyboardGrabberEv @ 6238 NONAME
+ _ZN7QWidget15mousePressEventEP11QMouseEvent @ 6239 NONAME
+ _ZN7QWidget15releaseKeyboardEv @ 6240 NONAME
+ _ZN7QWidget15releaseShortcutEi @ 6241 NONAME
+ _ZN7QWidget15restoreGeometryERK10QByteArray @ 6242 NONAME
+ _ZN7QWidget15setInputContextEP13QInputContext @ 6243 NONAME
+ _ZN7QWidget15setMaximumWidthEi @ 6244 NONAME
+ _ZN7QWidget15setMinimumWidthEi @ 6245 NONAME
+ _ZN7QWidget16contextMenuEventEP17QContextMenuEvent @ 6246 NONAME
+ _ZN7QWidget16inputMethodEventEP17QInputMethodEvent @ 6247 NONAME
+ _ZN7QWidget16setMaximumHeightEi @ 6248 NONAME
+ _ZN7QWidget16setMinimumHeightEi @ 6249 NONAME
+ _ZN7QWidget16setSizeIncrementEii @ 6250 NONAME
+ _ZN7QWidget16setWindowOpacityEf @ 6251 NONAME
+ _ZN7QWidget16setWindowSurfaceEP14QWindowSurface @ 6252 NONAME
+ _ZN7QWidget16staticMetaObjectE @ 6253 NONAME DATA 16
+ _ZN7QWidget16updateMicroFocusEv @ 6254 NONAME
+ _ZN7QWidget17mouseReleaseEventEP11QMouseEvent @ 6255 NONAME
+ _ZN7QWidget17resetInputContextEv @ 6256 NONAME
+ _ZN7QWidget17setBackgroundRoleEN8QPalette9ColorRoleE @ 6257 NONAME
+ _ZN7QWidget17setForegroundRoleEN8QPalette9ColorRoleE @ 6258 NONAME
+ _ZN7QWidget17setGraphicsEffectEP15QGraphicsEffect @ 6259 NONAME
+ _ZN7QWidget17setUpdatesEnabledEb @ 6260 NONAME
+ _ZN7QWidget17setWindowFilePathERK7QString @ 6261 NONAME
+ _ZN7QWidget17setWindowIconTextERK7QString @ 6262 NONAME
+ _ZN7QWidget17setWindowModalityEN2Qt14WindowModalityE @ 6263 NONAME
+ _ZN7QWidget17setWindowModifiedEb @ 6264 NONAME
+ _ZN7QWidget18focusNextPrevChildEb @ 6265 NONAME
+ _ZN7QWidget18setContentsMarginsERK8QMargins @ 6266 NONAME
+ _ZN7QWidget18setContentsMarginsEiiii @ 6267 NONAME
+ _ZN7QWidget18setLayoutDirectionEN2Qt15LayoutDirectionE @ 6268 NONAME
+ _ZN7QWidget18setShortcutEnabledEib @ 6269 NONAME
+ _ZN7QWidget19getStaticMetaObjectEv @ 6270 NONAME
+ _ZN7QWidget19overrideWindowFlagsE6QFlagsIN2Qt10WindowTypeEE @ 6271 NONAME
+ _ZN7QWidget19overrideWindowStateE6QFlagsIN2Qt11WindowStateEE @ 6272 NONAME
+ _ZN7QWidget19setInputMethodHintsE6QFlagsIN2Qt15InputMethodHintEE @ 6273 NONAME
+ _ZN7QWidget20setContextMenuPolicyEN2Qt17ContextMenuPolicyE @ 6274 NONAME
+ _ZN7QWidget20unsetLayoutDirectionEv @ 6275 NONAME
+ _ZN7QWidget21mouseDoubleClickEventEP11QMouseEvent @ 6276 NONAME
+ _ZN7QWidget21setAutoFillBackgroundEb @ 6277 NONAME
+ _ZN7QWidget21setShortcutAutoRepeatEib @ 6278 NONAME
+ _ZN7QWidget22windowActivationChangeEb @ 6279 NONAME
+ _ZN7QWidget26customContextMenuRequestedERK6QPoint @ 6280 NONAME
+ _ZN7QWidget4findEP11CCoeControl @ 6281 NONAME
+ _ZN7QWidget4moveERK6QPoint @ 6282 NONAME
+ _ZN7QWidget5closeEv @ 6283 NONAME
+ _ZN7QWidget5eventEP6QEvent @ 6284 NONAME
+ _ZN7QWidget5lowerEv @ 6285 NONAME
+ _ZN7QWidget5raiseEv @ 6286 NONAME
+ _ZN7QWidget6createEP11CCoeControlbb @ 6287 NONAME
+ _ZN7QWidget6renderEP12QPaintDeviceRK6QPointRK7QRegion6QFlagsINS_10RenderFlagEE @ 6288 NONAME
+ _ZN7QWidget6renderEP8QPainterRK6QPointRK7QRegion6QFlagsINS_10RenderFlagEE @ 6289 NONAME
+ _ZN7QWidget6resizeERK5QSize @ 6290 NONAME
+ _ZN7QWidget6scrollEii @ 6291 NONAME
+ _ZN7QWidget6scrollEiiRK5QRect @ 6292 NONAME
+ _ZN7QWidget6updateERK5QRect @ 6293 NONAME
+ _ZN7QWidget6updateERK7QRegion @ 6294 NONAME
+ _ZN7QWidget6updateEv @ 6295 NONAME
+ _ZN7QWidget7destroyEbb @ 6296 NONAME
+ _ZN7QWidget7repaintERK5QRect @ 6297 NONAME
+ _ZN7QWidget7repaintERK7QRegion @ 6298 NONAME
+ _ZN7QWidget7repaintEiiii @ 6299 NONAME
+ _ZN7QWidget7repaintEv @ 6300 NONAME
+ _ZN7QWidget7setFontERK5QFont @ 6301 NONAME
+ _ZN7QWidget7setMaskERK7QBitmap @ 6302 NONAME
+ _ZN7QWidget7setMaskERK7QRegion @ 6303 NONAME
+ _ZN7QWidget8setFocusEN2Qt11FocusReasonE @ 6304 NONAME
+ _ZN7QWidget8setStyleEP6QStyle @ 6305 NONAME
+ _ZN7QWidget9addActionEP7QAction @ 6306 NONAME
+ _ZN7QWidget9clearMaskEv @ 6307 NONAME
+ _ZN7QWidget9dropEventEP10QDropEvent @ 6308 NONAME
+ _ZN7QWidget9grabMouseERK7QCursor @ 6309 NONAME
+ _ZN7QWidget9grabMouseEv @ 6310 NONAME
+ _ZN7QWidget9hideEventEP10QHideEvent @ 6311 NONAME
+ _ZN7QWidget9moveEventEP10QMoveEvent @ 6312 NONAME
+ _ZN7QWidget9setCursorERK7QCursor @ 6313 NONAME
+ _ZN7QWidget9setLayoutEP7QLayout @ 6314 NONAME
+ _ZN7QWidget9setLocaleERK7QLocale @ 6315 NONAME
+ _ZN7QWidget9setParentEPS_ @ 6316 NONAME
+ _ZN7QWidget9setParentEPS_6QFlagsIN2Qt10WindowTypeEE @ 6317 NONAME
+ _ZN7QWidget9showEventEP10QShowEvent @ 6318 NONAME
+ _ZN7QWidgetC1EPS_6QFlagsIN2Qt10WindowTypeEE @ 6319 NONAME
+ _ZN7QWidgetC1ER14QWidgetPrivatePS_6QFlagsIN2Qt10WindowTypeEE @ 6320 NONAME
+ _ZN7QWidgetC2EPS_6QFlagsIN2Qt10WindowTypeEE @ 6321 NONAME
+ _ZN7QWidgetC2ER14QWidgetPrivatePS_6QFlagsIN2Qt10WindowTypeEE @ 6322 NONAME
+ _ZN7QWidgetD0Ev @ 6323 NONAME
+ _ZN7QWidgetD1Ev @ 6324 NONAME
+ _ZN7QWidgetD2Ev @ 6325 NONAME
+ _ZN7QWizard10paintEventEP11QPaintEvent @ 6326 NONAME
+ _ZN7QWizard10removePageEi @ 6327 NONAME
+ _ZN7QWizard10setOptionsE6QFlagsINS_12WizardOptionEE @ 6328 NONAME
+ _ZN7QWizard10setStartIdEi @ 6329 NONAME
+ _ZN7QWizard10setVisibleEb @ 6330 NONAME
+ _ZN7QWizard11cleanupPageEi @ 6331 NONAME
+ _ZN7QWizard11qt_metacallEN11QMetaObject4CallEiPPv @ 6332 NONAME
+ _ZN7QWizard11qt_metacastEPKc @ 6333 NONAME
+ _ZN7QWizard11resizeEventEP12QResizeEvent @ 6334 NONAME
+ _ZN7QWizard13helpRequestedEv @ 6335 NONAME
+ _ZN7QWizard13setButtonTextENS_12WizardButtonERK7QString @ 6336 NONAME
+ _ZN7QWizard14initializePageEi @ 6337 NONAME
+ _ZN7QWizard14setTitleFormatEN2Qt10TextFormatE @ 6338 NONAME
+ _ZN7QWizard14setWizardStyleENS_11WizardStyleE @ 6339 NONAME
+ _ZN7QWizard15setButtonLayoutERK5QListINS_12WizardButtonEE @ 6340 NONAME
+ _ZN7QWizard16currentIdChangedEi @ 6341 NONAME
+ _ZN7QWizard16staticMetaObjectE @ 6342 NONAME DATA 16
+ _ZN7QWizard17setSubTitleFormatEN2Qt10TextFormatE @ 6343 NONAME
+ _ZN7QWizard18setDefaultPropertyEPKcS1_S1_ @ 6344 NONAME
+ _ZN7QWizard19customButtonClickedEi @ 6345 NONAME
+ _ZN7QWizard19getStaticMetaObjectEv @ 6346 NONAME
+ _ZN7QWizard19validateCurrentPageEv @ 6347 NONAME
+ _ZN7QWizard4backEv @ 6348 NONAME
+ _ZN7QWizard4doneEi @ 6349 NONAME
+ _ZN7QWizard4nextEv @ 6350 NONAME
+ _ZN7QWizard5eventEP6QEvent @ 6351 NONAME
+ _ZN7QWizard7addPageEP11QWizardPage @ 6352 NONAME
+ _ZN7QWizard7restartEv @ 6353 NONAME
+ _ZN7QWizard7setPageEiP11QWizardPage @ 6354 NONAME
+ _ZN7QWizard8setFieldERK7QStringRK8QVariant @ 6355 NONAME
+ _ZN7QWizard9setButtonENS_12WizardButtonEP15QAbstractButton @ 6356 NONAME
+ _ZN7QWizard9setOptionENS_12WizardOptionEb @ 6357 NONAME
+ _ZN7QWizard9setPixmapENS_12WizardPixmapERK7QPixmap @ 6358 NONAME
+ _ZN7QWizardC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6359 NONAME
+ _ZN7QWizardC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6360 NONAME
+ _ZN7QWizardD0Ev @ 6361 NONAME
+ _ZN7QWizardD1Ev @ 6362 NONAME
+ _ZN7QWizardD2Ev @ 6363 NONAME
+ _ZN8QGesture10setHotSpotERK7QPointF @ 6364 NONAME
+ _ZN8QGesture11qt_metacallEN11QMetaObject4CallEiPPv @ 6365 NONAME
+ _ZN8QGesture11qt_metacastEPKc @ 6366 NONAME
+ _ZN8QGesture12unsetHotSpotEv @ 6367 NONAME
+ _ZN8QGesture15setTargetObjectEP7QObject @ 6368 NONAME
+ _ZN8QGesture16staticMetaObjectE @ 6369 NONAME DATA 16
+ _ZN8QGesture19getStaticMetaObjectEv @ 6370 NONAME
+ _ZN8QGestureC1EN2Qt11GestureTypeEP7QObject @ 6371 NONAME ABSENT
+ _ZN8QGestureC1EP7QObject @ 6372 NONAME
+ _ZN8QGestureC1ER15QGesturePrivateN2Qt11GestureTypeEP7QObject @ 6373 NONAME ABSENT
+ _ZN8QGestureC2EN2Qt11GestureTypeEP7QObject @ 6374 NONAME ABSENT
+ _ZN8QGestureC2EP7QObject @ 6375 NONAME
+ _ZN8QGestureC2ER15QGesturePrivateN2Qt11GestureTypeEP7QObject @ 6376 NONAME ABSENT
+ _ZN8QGestureD0Ev @ 6377 NONAME
+ _ZN8QGestureD1Ev @ 6378 NONAME
+ _ZN8QGestureD2Ev @ 6379 NONAME
+ _ZN8QMdiArea10childEventEP11QChildEvent @ 6380 NONAME
+ _ZN8QMdiArea10paintEventEP11QPaintEvent @ 6381 NONAME
+ _ZN8QMdiArea10timerEventEP11QTimerEvent @ 6382 NONAME
+ _ZN8QMdiArea11eventFilterEP7QObjectP6QEvent @ 6383 NONAME
+ _ZN8QMdiArea11qt_metacallEN11QMetaObject4CallEiPPv @ 6384 NONAME
+ _ZN8QMdiArea11qt_metacastEPKc @ 6385 NONAME
+ _ZN8QMdiArea11resizeEventEP12QResizeEvent @ 6386 NONAME
+ _ZN8QMdiArea11setTabShapeEN10QTabWidget8TabShapeE @ 6387 NONAME
+ _ZN8QMdiArea11setViewModeENS_8ViewModeE @ 6388 NONAME
+ _ZN8QMdiArea12addSubWindowEP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6389 NONAME
+ _ZN8QMdiArea13setBackgroundERK6QBrush @ 6390 NONAME
+ _ZN8QMdiArea13setupViewportEP7QWidget @ 6391 NONAME
+ _ZN8QMdiArea13viewportEventEP6QEvent @ 6392 NONAME
+ _ZN8QMdiArea14setTabPositionEN10QTabWidget11TabPositionE @ 6393 NONAME
+ _ZN8QMdiArea14tileSubWindowsEv @ 6394 NONAME
+ _ZN8QMdiArea15removeSubWindowEP7QWidget @ 6395 NONAME
+ _ZN8QMdiArea15setDocumentModeEb @ 6396 NONAME
+ _ZN8QMdiArea16scrollContentsByEii @ 6397 NONAME
+ _ZN8QMdiArea16staticMetaObjectE @ 6398 NONAME DATA 16
+ _ZN8QMdiArea17cascadeSubWindowsEv @ 6399 NONAME
+ _ZN8QMdiArea18closeAllSubWindowsEv @ 6400 NONAME
+ _ZN8QMdiArea18setActivationOrderENS_11WindowOrderE @ 6401 NONAME
+ _ZN8QMdiArea18setActiveSubWindowEP13QMdiSubWindow @ 6402 NONAME
+ _ZN8QMdiArea18subWindowActivatedEP13QMdiSubWindow @ 6403 NONAME
+ _ZN8QMdiArea19getStaticMetaObjectEv @ 6404 NONAME
+ _ZN8QMdiArea20closeActiveSubWindowEv @ 6405 NONAME
+ _ZN8QMdiArea21activateNextSubWindowEv @ 6406 NONAME
+ _ZN8QMdiArea25activatePreviousSubWindowEv @ 6407 NONAME
+ _ZN8QMdiArea5eventEP6QEvent @ 6408 NONAME
+ _ZN8QMdiArea9setOptionENS_10AreaOptionEb @ 6409 NONAME
+ _ZN8QMdiArea9showEventEP10QShowEvent @ 6410 NONAME
+ _ZN8QMdiAreaC1EP7QWidget @ 6411 NONAME
+ _ZN8QMdiAreaC2EP7QWidget @ 6412 NONAME
+ _ZN8QMdiAreaD0Ev @ 6413 NONAME
+ _ZN8QMdiAreaD1Ev @ 6414 NONAME
+ _ZN8QMdiAreaD2Ev @ 6415 NONAME
+ _ZN8QMenuBar10insertMenuEP7QActionP5QMenu @ 6416 NONAME
+ _ZN8QMenuBar10leaveEventEP6QEvent @ 6417 NONAME
+ _ZN8QMenuBar10paintEventEP11QPaintEvent @ 6418 NONAME
+ _ZN8QMenuBar10setVisibleEb @ 6419 NONAME
+ _ZN8QMenuBar10timerEventEP11QTimerEvent @ 6420 NONAME
+ _ZN8QMenuBar11actionEventEP12QActionEvent @ 6421 NONAME
+ _ZN8QMenuBar11changeEventEP6QEvent @ 6422 NONAME
+ _ZN8QMenuBar11eventFilterEP7QObjectP6QEvent @ 6423 NONAME
+ _ZN8QMenuBar11qt_metacallEN11QMetaObject4CallEiPPv @ 6424 NONAME
+ _ZN8QMenuBar11qt_metacastEPKc @ 6425 NONAME
+ _ZN8QMenuBar11resizeEventEP12QResizeEvent @ 6426 NONAME
+ _ZN8QMenuBar12addSeparatorEv @ 6427 NONAME
+ _ZN8QMenuBar12focusInEventEP11QFocusEvent @ 6428 NONAME
+ _ZN8QMenuBar12setDefaultUpEb @ 6429 NONAME
+ _ZN8QMenuBar13focusOutEventEP11QFocusEvent @ 6430 NONAME
+ _ZN8QMenuBar13keyPressEventEP9QKeyEvent @ 6431 NONAME
+ _ZN8QMenuBar14mouseMoveEventEP11QMouseEvent @ 6432 NONAME
+ _ZN8QMenuBar15insertSeparatorEP7QAction @ 6433 NONAME
+ _ZN8QMenuBar15mousePressEventEP11QMouseEvent @ 6434 NONAME
+ _ZN8QMenuBar15setActiveActionEP7QAction @ 6435 NONAME
+ _ZN8QMenuBar15setCornerWidgetEP7QWidgetN2Qt6CornerE @ 6436 NONAME
+ _ZN8QMenuBar16setNativeMenuBarEb @ 6437 NONAME
+ _ZN8QMenuBar16staticMetaObjectE @ 6438 NONAME DATA 16
+ _ZN8QMenuBar17mouseReleaseEventEP11QMouseEvent @ 6439 NONAME
+ _ZN8QMenuBar19getStaticMetaObjectEv @ 6440 NONAME
+ _ZN8QMenuBar5clearEv @ 6441 NONAME
+ _ZN8QMenuBar5eventEP6QEvent @ 6442 NONAME
+ _ZN8QMenuBar7addMenuEP5QMenu @ 6443 NONAME
+ _ZN8QMenuBar7addMenuERK5QIconRK7QString @ 6444 NONAME
+ _ZN8QMenuBar7addMenuERK7QString @ 6445 NONAME
+ _ZN8QMenuBar7hoveredEP7QAction @ 6446 NONAME
+ _ZN8QMenuBar9addActionERK7QString @ 6447 NONAME
+ _ZN8QMenuBar9addActionERK7QStringPK7QObjectPKc @ 6448 NONAME
+ _ZN8QMenuBar9triggeredEP7QAction @ 6449 NONAME
+ _ZN8QMenuBarC1EP7QWidget @ 6450 NONAME
+ _ZN8QMenuBarC2EP7QWidget @ 6451 NONAME
+ _ZN8QMenuBarD0Ev @ 6452 NONAME
+ _ZN8QMenuBarD1Ev @ 6453 NONAME
+ _ZN8QMenuBarD2Ev @ 6454 NONAME
+ _ZN8QPainter10drawPixmapERK6QRectFRK7QPixmapS2_ @ 6455 NONAME
+ _ZN8QPainter10drawPixmapERK7QPointFRK7QPixmap @ 6456 NONAME
+ _ZN8QPainter10drawPointsEPK6QPointi @ 6457 NONAME
+ _ZN8QPainter10drawPointsEPK7QPointFi @ 6458 NONAME
+ _ZN8QPainter10redirectedEPK12QPaintDeviceP6QPoint @ 6459 NONAME
+ _ZN8QPainter10setOpacityEf @ 6460 NONAME
+ _ZN8QPainter10strokePathERK12QPainterPathRK4QPen @ 6461 NONAME
+ _ZN8QPainter11drawEllipseERK5QRect @ 6462 NONAME
+ _ZN8QPainter11drawEllipseERK6QRectF @ 6463 NONAME
+ _ZN8QPainter11drawPictureERK7QPointFRK8QPicture @ 6464 NONAME
+ _ZN8QPainter11drawPolygonEPK6QPointiN2Qt8FillRuleE @ 6465 NONAME
+ _ZN8QPainter11drawPolygonEPK7QPointFiN2Qt8FillRuleE @ 6466 NONAME
+ _ZN8QPainter11resetMatrixEv @ 6467 NONAME
+ _ZN8QPainter11setClipPathERK12QPainterPathN2Qt13ClipOperationE @ 6468 NONAME
+ _ZN8QPainter11setClipRectERK5QRectN2Qt13ClipOperationE @ 6469 NONAME
+ _ZN8QPainter11setClipRectERK6QRectFN2Qt13ClipOperationE @ 6470 NONAME
+ _ZN8QPainter11setClippingEb @ 6471 NONAME
+ _ZN8QPainter11setViewportERK5QRect @ 6472 NONAME
+ _ZN8QPainter12boundingRectERK5QRectiRK7QString @ 6473 NONAME
+ _ZN8QPainter12boundingRectERK6QRectFRK7QStringRK11QTextOption @ 6474 NONAME
+ _ZN8QPainter12boundingRectERK6QRectFiRK7QString @ 6475 NONAME
+ _ZN8QPainter12drawPolylineEPK6QPointi @ 6476 NONAME
+ _ZN8QPainter12drawPolylineEPK7QPointFi @ 6477 NONAME
+ _ZN8QPainter12drawTextItemERK7QPointFRK9QTextItem @ 6478 NONAME
+ _ZN8QPainter12setTransformERK10QTransformb @ 6479 NONAME
+ _ZN8QPainter13drawRoundRectERK6QRectFii @ 6480 NONAME
+ _ZN8QPainter13setBackgroundERK6QBrush @ 6481 NONAME
+ _ZN8QPainter13setClipRegionERK7QRegionN2Qt13ClipOperationE @ 6482 NONAME
+ _ZN8QPainter13setRedirectedEPK12QPaintDevicePS0_RK6QPoint @ 6483 NONAME
+ _ZN8QPainter13setRenderHintENS_10RenderHintEb @ 6484 NONAME
+ _ZN8QPainter14resetTransformEv @ 6485 NONAME
+ _ZN8QPainter14setBrushOriginERK7QPointF @ 6486 NONAME
+ _ZN8QPainter14setRenderHintsE6QFlagsINS_10RenderHintEEb @ 6487 NONAME
+ _ZN8QPainter14setWorldMatrixERK7QMatrixb @ 6488 NONAME
+ _ZN8QPainter15drawRoundedRectERK6QRectFffN2Qt8SizeModeE @ 6489 NONAME
+ _ZN8QPainter15drawTiledPixmapERK6QRectFRK7QPixmapRK7QPointF @ 6490 NONAME
+ _ZN8QPainter16setMatrixEnabledEb @ 6491 NONAME
+ _ZN8QPainter16staticMetaObjectE @ 6492 NONAME DATA 16
+ _ZN8QPainter17drawConvexPolygonEPK6QPointi @ 6493 NONAME
+ _ZN8QPainter17drawConvexPolygonEPK7QPointFi @ 6494 NONAME
+ _ZN8QPainter17endNativePaintingEv @ 6495 NONAME
+ _ZN8QPainter17restoreRedirectedEPK12QPaintDevice @ 6496 NONAME
+ _ZN8QPainter17setBackgroundModeEN2Qt6BGModeE @ 6497 NONAME
+ _ZN8QPainter17setWorldTransformERK10QTransformb @ 6498 NONAME
+ _ZN8QPainter18setCompositionModeENS_15CompositionModeE @ 6499 NONAME
+ _ZN8QPainter18setLayoutDirectionEN2Qt15LayoutDirectionE @ 6500 NONAME
+ _ZN8QPainter19beginNativePaintingEv @ 6501 NONAME
+ _ZN8QPainter19getStaticMetaObjectEv @ 6502 NONAME
+ _ZN8QPainter21setWorldMatrixEnabledEb @ 6503 NONAME
+ _ZN8QPainter23setViewTransformEnabledEb @ 6504 NONAME
+ _ZN8QPainter3endEv @ 6505 NONAME
+ _ZN8QPainter4saveEv @ 6506 NONAME
+ _ZN8QPainter5beginEP12QPaintDevice @ 6507 NONAME
+ _ZN8QPainter5scaleEff @ 6508 NONAME
+ _ZN8QPainter5shearEff @ 6509 NONAME
+ _ZN8QPainter6rotateEf @ 6510 NONAME
+ _ZN8QPainter6setPenEN2Qt8PenStyleE @ 6511 NONAME
+ _ZN8QPainter6setPenERK4QPen @ 6512 NONAME
+ _ZN8QPainter6setPenERK6QColor @ 6513 NONAME
+ _ZN8QPainter7drawArcERK6QRectFii @ 6514 NONAME
+ _ZN8QPainter7drawPieERK6QRectFii @ 6515 NONAME
+ _ZN8QPainter7restoreEv @ 6516 NONAME
+ _ZN8QPainter7setFontERK5QFont @ 6517 NONAME
+ _ZN8QPainter8drawPathERK12QPainterPath @ 6518 NONAME
+ _ZN8QPainter8drawTextERK5QRectiRK7QStringPS0_ @ 6519 NONAME
+ _ZN8QPainter8drawTextERK6QRectFRK7QStringRK11QTextOption @ 6520 NONAME
+ _ZN8QPainter8drawTextERK6QRectFiRK7QStringPS0_ @ 6521 NONAME
+ _ZN8QPainter8drawTextERK7QPointFRK7QString @ 6522 NONAME
+ _ZN8QPainter8drawTextERK7QPointFRK7QStringii @ 6523 NONAME
+ _ZN8QPainter8fillPathERK12QPainterPathRK6QBrush @ 6524 NONAME
+ _ZN8QPainter8fillRectERK5QRectRK6QBrush @ 6525 NONAME
+ _ZN8QPainter8fillRectERK5QRectRK6QColor @ 6526 NONAME
+ _ZN8QPainter8fillRectERK6QRectFRK6QBrush @ 6527 NONAME
+ _ZN8QPainter8fillRectERK6QRectFRK6QColor @ 6528 NONAME
+ _ZN8QPainter8initFromEPK7QWidget @ 6529 NONAME
+ _ZN8QPainter8setBrushEN2Qt10BrushStyleE @ 6530 NONAME
+ _ZN8QPainter8setBrushERK6QBrush @ 6531 NONAME
+ _ZN8QPainter9drawChordERK6QRectFii @ 6532 NONAME
+ _ZN8QPainter9drawImageERK6QRectFRK6QImageS2_6QFlagsIN2Qt19ImageConversionFlagEE @ 6533 NONAME
+ _ZN8QPainter9drawImageERK7QPointFRK6QImage @ 6534 NONAME
+ _ZN8QPainter9drawLinesEPK5QLinei @ 6535 NONAME
+ _ZN8QPainter9drawLinesEPK6QLineFi @ 6536 NONAME
+ _ZN8QPainter9drawLinesEPK6QPointi @ 6537 NONAME
+ _ZN8QPainter9drawLinesEPK7QPointFi @ 6538 NONAME
+ _ZN8QPainter9drawRectsEPK5QRecti @ 6539 NONAME
+ _ZN8QPainter9drawRectsEPK6QRectFi @ 6540 NONAME
+ _ZN8QPainter9eraseRectERK6QRectF @ 6541 NONAME
+ _ZN8QPainter9setMatrixERK7QMatrixb @ 6542 NONAME
+ _ZN8QPainter9setWindowERK5QRect @ 6543 NONAME
+ _ZN8QPainter9translateERK7QPointF @ 6544 NONAME
+ _ZN8QPainterC1EP12QPaintDevice @ 6545 NONAME
+ _ZN8QPainterC1Ev @ 6546 NONAME
+ _ZN8QPainterC2EP12QPaintDevice @ 6547 NONAME
+ _ZN8QPainterC2Ev @ 6548 NONAME
+ _ZN8QPainterD1Ev @ 6549 NONAME
+ _ZN8QPainterD2Ev @ 6550 NONAME
+ _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_ @ 6551 NONAME
+ _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ @ 6552 NONAME
+ _ZN8QPalette13setColorGroupENS_10ColorGroupERK6QBrushS3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_S3_ @ 6553 NONAME
+ _ZN8QPalette16staticMetaObjectE @ 6554 NONAME DATA 16
+ _ZN8QPalette19getStaticMetaObjectEv @ 6555 NONAME
+ _ZN8QPalette4initEv @ 6556 NONAME
+ _ZN8QPalette6detachEv @ 6557 NONAME
+ _ZN8QPalette8setBrushENS_10ColorGroupENS_9ColorRoleERK6QBrush @ 6558 NONAME
+ _ZN8QPaletteC1EN2Qt11GlobalColorE @ 6559 NONAME
+ _ZN8QPaletteC1ERK6QBrushS2_S2_S2_S2_S2_S2_S2_S2_ @ 6560 NONAME
+ _ZN8QPaletteC1ERK6QColor @ 6561 NONAME
+ _ZN8QPaletteC1ERK6QColorS2_ @ 6562 NONAME
+ _ZN8QPaletteC1ERK6QColorS2_S2_S2_S2_S2_S2_ @ 6563 NONAME
+ _ZN8QPaletteC1ERKS_ @ 6564 NONAME
+ _ZN8QPaletteC1Ev @ 6565 NONAME
+ _ZN8QPaletteC2EN2Qt11GlobalColorE @ 6566 NONAME
+ _ZN8QPaletteC2ERK6QBrushS2_S2_S2_S2_S2_S2_S2_S2_ @ 6567 NONAME
+ _ZN8QPaletteC2ERK6QColor @ 6568 NONAME
+ _ZN8QPaletteC2ERK6QColorS2_ @ 6569 NONAME
+ _ZN8QPaletteC2ERK6QColorS2_S2_S2_S2_S2_S2_ @ 6570 NONAME
+ _ZN8QPaletteC2ERKS_ @ 6571 NONAME
+ _ZN8QPaletteC2Ev @ 6572 NONAME
+ _ZN8QPaletteD1Ev @ 6573 NONAME
+ _ZN8QPaletteD2Ev @ 6574 NONAME
+ _ZN8QPaletteaSERKS_ @ 6575 NONAME
+ _ZN8QPicture12inputFormatsEv @ 6576 NONAME
+ _ZN8QPicture13detach_helperEv @ 6577 NONAME
+ _ZN8QPicture13outputFormatsEv @ 6578 NONAME
+ _ZN8QPicture13pictureFormatERK7QString @ 6579 NONAME
+ _ZN8QPicture15inputFormatListEv @ 6580 NONAME
+ _ZN8QPicture15setBoundingRectERK5QRect @ 6581 NONAME
+ _ZN8QPicture16outputFormatListEv @ 6582 NONAME
+ _ZN8QPicture4execEP8QPainterR11QDataStreami @ 6583 NONAME
+ _ZN8QPicture4loadEP9QIODevicePKc @ 6584 NONAME
+ _ZN8QPicture4loadERK7QStringPKc @ 6585 NONAME
+ _ZN8QPicture4playEP8QPainter @ 6586 NONAME
+ _ZN8QPicture4saveEP9QIODevicePKc @ 6587 NONAME
+ _ZN8QPicture4saveERK7QStringPKc @ 6588 NONAME
+ _ZN8QPicture6detachEv @ 6589 NONAME
+ _ZN8QPicture7setDataEPKcj @ 6590 NONAME
+ _ZN8QPictureC1ER15QPicturePrivate @ 6591 NONAME
+ _ZN8QPictureC1ERKS_ @ 6592 NONAME
+ _ZN8QPictureC1Ei @ 6593 NONAME
+ _ZN8QPictureC2ER15QPicturePrivate @ 6594 NONAME
+ _ZN8QPictureC2ERKS_ @ 6595 NONAME
+ _ZN8QPictureC2Ei @ 6596 NONAME
+ _ZN8QPictureD0Ev @ 6597 NONAME
+ _ZN8QPictureD1Ev @ 6598 NONAME
+ _ZN8QPictureD2Ev @ 6599 NONAME
+ _ZN8QPictureaSERKS_ @ 6600 NONAME
+ _ZN8QPolygon9putPointsEiiPKi @ 6601 NONAME
+ _ZN8QPolygon9putPointsEiiRKS_i @ 6602 NONAME
+ _ZN8QPolygon9putPointsEiiiiz @ 6603 NONAME
+ _ZN8QPolygon9setPointsEiPKi @ 6604 NONAME
+ _ZN8QPolygon9setPointsEiiiz @ 6605 NONAME
+ _ZN8QPolygon9translateEii @ 6606 NONAME
+ _ZN8QPolygonC1ERK5QRectb @ 6607 NONAME
+ _ZN8QPolygonC1EiPKi @ 6608 NONAME
+ _ZN8QPolygonC2ERK5QRectb @ 6609 NONAME
+ _ZN8QPolygonC2EiPKi @ 6610 NONAME
+ _ZN8QSpinBox10setMaximumEi @ 6611 NONAME
+ _ZN8QSpinBox10setMinimumEi @ 6612 NONAME
+ _ZN8QSpinBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6613 NONAME
+ _ZN8QSpinBox11qt_metacastEPKc @ 6614 NONAME
+ _ZN8QSpinBox12valueChangedERK7QString @ 6615 NONAME
+ _ZN8QSpinBox12valueChangedEi @ 6616 NONAME
+ _ZN8QSpinBox13setSingleStepEi @ 6617 NONAME
+ _ZN8QSpinBox16staticMetaObjectE @ 6618 NONAME DATA 16
+ _ZN8QSpinBox19getStaticMetaObjectEv @ 6619 NONAME
+ _ZN8QSpinBox5eventEP6QEvent @ 6620 NONAME
+ _ZN8QSpinBox8setRangeEii @ 6621 NONAME
+ _ZN8QSpinBox8setValueEi @ 6622 NONAME
+ _ZN8QSpinBox9setPrefixERK7QString @ 6623 NONAME
+ _ZN8QSpinBox9setSuffixERK7QString @ 6624 NONAME
+ _ZN8QSpinBoxC1EP7QWidget @ 6625 NONAME
+ _ZN8QSpinBoxC2EP7QWidget @ 6626 NONAME
+ _ZN8QStroker10joinPointsEffRK6QLineFNS_12LineJoinModeE @ 6627 NONAME
+ _ZN8QStroker14capForJoinModeENS_12LineJoinModeE @ 6628 NONAME
+ _ZN8QStroker14joinModeForCapEN2Qt11PenCapStyleE @ 6629 NONAME
+ _ZN8QStroker15joinForJoinModeENS_12LineJoinModeE @ 6630 NONAME
+ _ZN8QStroker15joinModeForJoinEN2Qt12PenJoinStyleE @ 6631 NONAME
+ _ZN8QStroker21processCurrentSubpathEv @ 6632 NONAME
+ _ZN8QStrokerC1Ev @ 6633 NONAME
+ _ZN8QStrokerC2Ev @ 6634 NONAME
+ _ZN8QStrokerD0Ev @ 6635 NONAME
+ _ZN8QStrokerD1Ev @ 6636 NONAME
+ _ZN8QStrokerD2Ev @ 6637 NONAME
+ _ZN8QToolBar10childEventEP11QChildEvent @ 6638 NONAME
+ _ZN8QToolBar10paintEventEP11QPaintEvent @ 6639 NONAME
+ _ZN8QToolBar10setMovableEb @ 6640 NONAME
+ _ZN8QToolBar11actionEventEP12QActionEvent @ 6641 NONAME
+ _ZN8QToolBar11changeEventEP6QEvent @ 6642 NONAME
+ _ZN8QToolBar11qt_metacallEN11QMetaObject4CallEiPPv @ 6643 NONAME
+ _ZN8QToolBar11qt_metacastEPKc @ 6644 NONAME
+ _ZN8QToolBar11resizeEventEP12QResizeEvent @ 6645 NONAME
+ _ZN8QToolBar11setIconSizeERK5QSize @ 6646 NONAME
+ _ZN8QToolBar12addSeparatorEv @ 6647 NONAME
+ _ZN8QToolBar12insertWidgetEP7QActionP7QWidget @ 6648 NONAME
+ _ZN8QToolBar12setFloatableEb @ 6649 NONAME
+ _ZN8QToolBar14movableChangedEb @ 6650 NONAME
+ _ZN8QToolBar14setOrientationEN2Qt11OrientationE @ 6651 NONAME
+ _ZN8QToolBar15actionTriggeredEP7QAction @ 6652 NONAME
+ _ZN8QToolBar15iconSizeChangedERK5QSize @ 6653 NONAME
+ _ZN8QToolBar15insertSeparatorEP7QAction @ 6654 NONAME
+ _ZN8QToolBar15setAllowedAreasE6QFlagsIN2Qt11ToolBarAreaEE @ 6655 NONAME
+ _ZN8QToolBar16staticMetaObjectE @ 6656 NONAME DATA 16
+ _ZN8QToolBar18orientationChangedEN2Qt11OrientationE @ 6657 NONAME
+ _ZN8QToolBar18setToolButtonStyleEN2Qt15ToolButtonStyleE @ 6658 NONAME
+ _ZN8QToolBar19allowedAreasChangedE6QFlagsIN2Qt11ToolBarAreaEE @ 6659 NONAME
+ _ZN8QToolBar19getStaticMetaObjectEv @ 6660 NONAME
+ _ZN8QToolBar22toolButtonStyleChangedEN2Qt15ToolButtonStyleE @ 6661 NONAME
+ _ZN8QToolBar5clearEv @ 6662 NONAME
+ _ZN8QToolBar5eventEP6QEvent @ 6663 NONAME
+ _ZN8QToolBar9addActionERK5QIconRK7QString @ 6664 NONAME
+ _ZN8QToolBar9addActionERK5QIconRK7QStringPK7QObjectPKc @ 6665 NONAME
+ _ZN8QToolBar9addActionERK7QString @ 6666 NONAME
+ _ZN8QToolBar9addActionERK7QStringPK7QObjectPKc @ 6667 NONAME
+ _ZN8QToolBar9addWidgetEP7QWidget @ 6668 NONAME
+ _ZN8QToolBarC1EP7QWidget @ 6669 NONAME
+ _ZN8QToolBarC1ERK7QStringP7QWidget @ 6670 NONAME
+ _ZN8QToolBarC2EP7QWidget @ 6671 NONAME
+ _ZN8QToolBarC2ERK7QStringP7QWidget @ 6672 NONAME
+ _ZN8QToolBarD0Ev @ 6673 NONAME
+ _ZN8QToolBarD1Ev @ 6674 NONAME
+ _ZN8QToolBarD2Ev @ 6675 NONAME
+ _ZN8QToolBox10insertItemEiP7QWidgetRK5QIconRK7QString @ 6676 NONAME
+ _ZN8QToolBox10removeItemEi @ 6677 NONAME
+ _ZN8QToolBox11changeEventEP6QEvent @ 6678 NONAME
+ _ZN8QToolBox11itemRemovedEi @ 6679 NONAME
+ _ZN8QToolBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6680 NONAME
+ _ZN8QToolBox11qt_metacastEPKc @ 6681 NONAME
+ _ZN8QToolBox11setItemIconEiRK5QIcon @ 6682 NONAME
+ _ZN8QToolBox11setItemTextEiRK7QString @ 6683 NONAME
+ _ZN8QToolBox12itemInsertedEi @ 6684 NONAME
+ _ZN8QToolBox14currentChangedEi @ 6685 NONAME
+ _ZN8QToolBox14setItemEnabledEib @ 6686 NONAME
+ _ZN8QToolBox14setItemToolTipEiRK7QString @ 6687 NONAME
+ _ZN8QToolBox15setCurrentIndexEi @ 6688 NONAME
+ _ZN8QToolBox16setCurrentWidgetEP7QWidget @ 6689 NONAME
+ _ZN8QToolBox16staticMetaObjectE @ 6690 NONAME DATA 16
+ _ZN8QToolBox19getStaticMetaObjectEv @ 6691 NONAME
+ _ZN8QToolBox5eventEP6QEvent @ 6692 NONAME
+ _ZN8QToolBox9showEventEP10QShowEvent @ 6693 NONAME
+ _ZN8QToolBoxC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6694 NONAME
+ _ZN8QToolBoxC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE @ 6695 NONAME
+ _ZN8QToolBoxD0Ev @ 6696 NONAME
+ _ZN8QToolBoxD1Ev @ 6697 NONAME
+ _ZN8QToolBoxD2Ev @ 6698 NONAME
+ _ZN8QToolTip10setPaletteERK8QPalette @ 6699 NONAME
+ _ZN8QToolTip4fontEv @ 6700 NONAME
+ _ZN8QToolTip4textEv @ 6701 NONAME
+ _ZN8QToolTip7paletteEv @ 6702 NONAME
+ _ZN8QToolTip7setFontERK5QFont @ 6703 NONAME
+ _ZN8QToolTip8showTextERK6QPointRK7QStringP7QWidget @ 6704 NONAME
+ _ZN8QToolTip8showTextERK6QPointRK7QStringP7QWidgetRK5QRect @ 6705 NONAME
+ _ZN8QToolTip9isVisibleEv @ 6706 NONAME
+ _ZN9QCheckBox10paintEventEP11QPaintEvent @ 6707 NONAME
+ _ZN9QCheckBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6708 NONAME
+ _ZN9QCheckBox11qt_metacastEPKc @ 6709 NONAME
+ _ZN9QCheckBox11setTristateEb @ 6710 NONAME
+ _ZN9QCheckBox12stateChangedEi @ 6711 NONAME
+ _ZN9QCheckBox13checkStateSetEv @ 6712 NONAME
+ _ZN9QCheckBox13setCheckStateEN2Qt10CheckStateE @ 6713 NONAME
+ _ZN9QCheckBox14mouseMoveEventEP11QMouseEvent @ 6714 NONAME
+ _ZN9QCheckBox14nextCheckStateEv @ 6715 NONAME
+ _ZN9QCheckBox16staticMetaObjectE @ 6716 NONAME DATA 16
+ _ZN9QCheckBox19getStaticMetaObjectEv @ 6717 NONAME
+ _ZN9QCheckBox5eventEP6QEvent @ 6718 NONAME
+ _ZN9QCheckBoxC1EP7QWidget @ 6719 NONAME
+ _ZN9QCheckBoxC1ERK7QStringP7QWidget @ 6720 NONAME
+ _ZN9QCheckBoxC2EP7QWidget @ 6721 NONAME
+ _ZN9QCheckBoxC2ERK7QStringP7QWidget @ 6722 NONAME
+ _ZN9QColormap10initializeEv @ 6723 NONAME
+ _ZN9QColormap7cleanupEv @ 6724 NONAME
+ _ZN9QColormap8instanceEi @ 6725 NONAME
+ _ZN9QColormapC1ERKS_ @ 6726 NONAME
+ _ZN9QColormapC1Ev @ 6727 NONAME
+ _ZN9QColormapC2ERKS_ @ 6728 NONAME
+ _ZN9QColormapC2Ev @ 6729 NONAME
+ _ZN9QColormapD1Ev @ 6730 NONAME
+ _ZN9QColormapD2Ev @ 6731 NONAME
+ _ZN9QColormapaSERKS_ @ 6732 NONAME
+ _ZN9QComboBox10insertItemEiRK5QIconRK7QStringRK8QVariant @ 6733 NONAME
+ _ZN9QComboBox10paintEventEP11QPaintEvent @ 6734 NONAME
+ _ZN9QComboBox10removeItemEi @ 6735 NONAME
+ _ZN9QComboBox10wheelEventEP11QWheelEvent @ 6736 NONAME
+ _ZN9QComboBox11changeEventEP6QEvent @ 6737 NONAME
+ _ZN9QComboBox11highlightedERK7QString @ 6738 NONAME
+ _ZN9QComboBox11highlightedEi @ 6739 NONAME
+ _ZN9QComboBox11insertItemsEiRK11QStringList @ 6740 NONAME
+ _ZN9QComboBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6741 NONAME
+ _ZN9QComboBox11qt_metacastEPKc @ 6742 NONAME
+ _ZN9QComboBox11resizeEventEP12QResizeEvent @ 6743 NONAME
+ _ZN9QComboBox11setEditTextERK7QString @ 6744 NONAME
+ _ZN9QComboBox11setEditableEb @ 6745 NONAME
+ _ZN9QComboBox11setIconSizeERK5QSize @ 6746 NONAME
+ _ZN9QComboBox11setItemDataEiRK8QVarianti @ 6747 NONAME
+ _ZN9QComboBox11setItemIconEiRK5QIcon @ 6748 NONAME
+ _ZN9QComboBox11setItemTextEiRK7QString @ 6749 NONAME
+ _ZN9QComboBox11setLineEditEP9QLineEdit @ 6750 NONAME
+ _ZN9QComboBox11setMaxCountEi @ 6751 NONAME
+ _ZN9QComboBox12focusInEventEP11QFocusEvent @ 6752 NONAME
+ _ZN9QComboBox12setCompleterEP10QCompleter @ 6753 NONAME
+ _ZN9QComboBox12setValidatorEPK10QValidator @ 6754 NONAME
+ _ZN9QComboBox13clearEditTextEv @ 6755 NONAME
+ _ZN9QComboBox13focusOutEventEP11QFocusEvent @ 6756 NONAME
+ _ZN9QComboBox13keyPressEventEP9QKeyEvent @ 6757 NONAME
+ _ZN9QComboBox14setModelColumnEi @ 6758 NONAME
+ _ZN9QComboBox15editTextChangedERK7QString @ 6759 NONAME
+ _ZN9QComboBox15insertSeparatorEi @ 6760 NONAME
+ _ZN9QComboBox15keyReleaseEventEP9QKeyEvent @ 6761 NONAME
+ _ZN9QComboBox15mousePressEventEP11QMouseEvent @ 6762 NONAME
+ _ZN9QComboBox15setCurrentIndexEi @ 6763 NONAME
+ _ZN9QComboBox15setInsertPolicyENS_12InsertPolicyE @ 6764 NONAME
+ _ZN9QComboBox15setItemDelegateEP21QAbstractItemDelegate @ 6765 NONAME
+ _ZN9QComboBox16contextMenuEventEP17QContextMenuEvent @ 6766 NONAME
+ _ZN9QComboBox16inputMethodEventEP17QInputMethodEvent @ 6767 NONAME
+ _ZN9QComboBox16staticMetaObjectE @ 6768 NONAME DATA 16
+ _ZN9QComboBox17mouseReleaseEventEP11QMouseEvent @ 6769 NONAME
+ _ZN9QComboBox17setAutoCompletionEb @ 6770 NONAME
+ _ZN9QComboBox17setRootModelIndexERK11QModelIndex @ 6771 NONAME
+ _ZN9QComboBox18setMaxVisibleItemsEi @ 6772 NONAME
+ _ZN9QComboBox19currentIndexChangedERK7QString @ 6773 NONAME
+ _ZN9QComboBox19currentIndexChangedEi @ 6774 NONAME
+ _ZN9QComboBox19getStaticMetaObjectEv @ 6775 NONAME
+ _ZN9QComboBox19setSizeAdjustPolicyENS_16SizeAdjustPolicyE @ 6776 NONAME
+ _ZN9QComboBox20setDuplicatesEnabledEb @ 6777 NONAME
+ _ZN9QComboBox24setMinimumContentsLengthEi @ 6778 NONAME
+ _ZN9QComboBox32setAutoCompletionCaseSensitivityEN2Qt15CaseSensitivityE @ 6779 NONAME
+ _ZN9QComboBox5clearEv @ 6780 NONAME
+ _ZN9QComboBox5eventEP6QEvent @ 6781 NONAME
+ _ZN9QComboBox7setViewEP17QAbstractItemView @ 6782 NONAME
+ _ZN9QComboBox8setFrameEb @ 6783 NONAME
+ _ZN9QComboBox8setModelEP18QAbstractItemModel @ 6784 NONAME
+ _ZN9QComboBox9activatedERK7QString @ 6785 NONAME
+ _ZN9QComboBox9activatedEi @ 6786 NONAME
+ _ZN9QComboBox9hideEventEP10QHideEvent @ 6787 NONAME
+ _ZN9QComboBox9hidePopupEv @ 6788 NONAME
+ _ZN9QComboBox9showEventEP10QShowEvent @ 6789 NONAME
+ _ZN9QComboBox9showPopupEv @ 6790 NONAME
+ _ZN9QComboBoxC1EP7QWidget @ 6791 NONAME
+ _ZN9QComboBoxC1ER16QComboBoxPrivateP7QWidget @ 6792 NONAME
+ _ZN9QComboBoxC2EP7QWidget @ 6793 NONAME
+ _ZN9QComboBoxC2ER16QComboBoxPrivateP7QWidget @ 6794 NONAME
+ _ZN9QComboBoxD0Ev @ 6795 NONAME
+ _ZN9QComboBoxD1Ev @ 6796 NONAME
+ _ZN9QComboBoxD2Ev @ 6797 NONAME
+ _ZN9QDateEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 6798 NONAME
+ _ZN9QDateEdit11qt_metacastEPKc @ 6799 NONAME
+ _ZN9QDateEdit16staticMetaObjectE @ 6800 NONAME DATA 16
+ _ZN9QDateEdit19getStaticMetaObjectEv @ 6801 NONAME
+ _ZN9QDateEditC1EP7QWidget @ 6802 NONAME
+ _ZN9QDateEditC1ERK5QDateP7QWidget @ 6803 NONAME
+ _ZN9QDateEditC2EP7QWidget @ 6804 NONAME
+ _ZN9QDateEditC2ERK5QDateP7QWidget @ 6805 NONAME
+ _ZN9QDirModel10setSortingE6QFlagsIN4QDir8SortFlagEE @ 6806 NONAME
+ _ZN9QDirModel11qt_metacallEN11QMetaObject4CallEiPPv @ 6807 NONAME
+ _ZN9QDirModel11qt_metacastEPKc @ 6808 NONAME
+ _ZN9QDirModel11setReadOnlyEb @ 6809 NONAME
+ _ZN9QDirModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 6810 NONAME
+ _ZN9QDirModel14setNameFiltersERK11QStringList @ 6811 NONAME
+ _ZN9QDirModel15setIconProviderEP17QFileIconProvider @ 6812 NONAME
+ _ZN9QDirModel16staticMetaObjectE @ 6813 NONAME DATA 16
+ _ZN9QDirModel17setLazyChildCountEb @ 6814 NONAME
+ _ZN9QDirModel18setResolveSymlinksEb @ 6815 NONAME
+ _ZN9QDirModel19getStaticMetaObjectEv @ 6816 NONAME
+ _ZN9QDirModel4sortEiN2Qt9SortOrderE @ 6817 NONAME
+ _ZN9QDirModel5mkdirERK11QModelIndexRK7QString @ 6818 NONAME
+ _ZN9QDirModel5rmdirERK11QModelIndex @ 6819 NONAME
+ _ZN9QDirModel6removeERK11QModelIndex @ 6820 NONAME
+ _ZN9QDirModel7refreshERK11QModelIndex @ 6821 NONAME
+ _ZN9QDirModel7setDataERK11QModelIndexRK8QVarianti @ 6822 NONAME
+ _ZN9QDirModel9setFilterE6QFlagsIN4QDir6FilterEE @ 6823 NONAME
+ _ZN9QDirModelC1EP7QObject @ 6824 NONAME
+ _ZN9QDirModelC1ER16QDirModelPrivateP7QObject @ 6825 NONAME
+ _ZN9QDirModelC1ERK11QStringList6QFlagsIN4QDir6FilterEES3_INS4_8SortFlagEEP7QObject @ 6826 NONAME
+ _ZN9QDirModelC2EP7QObject @ 6827 NONAME
+ _ZN9QDirModelC2ER16QDirModelPrivateP7QObject @ 6828 NONAME
+ _ZN9QDirModelC2ERK11QStringList6QFlagsIN4QDir6FilterEES3_INS4_8SortFlagEEP7QObject @ 6829 NONAME
+ _ZN9QDirModelD0Ev @ 6830 NONAME
+ _ZN9QDirModelD1Ev @ 6831 NONAME
+ _ZN9QDirModelD2Ev @ 6832 NONAME
+ _ZN9QFontInfoC1ERK5QFont @ 6833 NONAME
+ _ZN9QFontInfoC1ERKS_ @ 6834 NONAME
+ _ZN9QFontInfoC2ERK5QFont @ 6835 NONAME
+ _ZN9QFontInfoC2ERKS_ @ 6836 NONAME
+ _ZN9QFontInfoD1Ev @ 6837 NONAME
+ _ZN9QFontInfoD2Ev @ 6838 NONAME
+ _ZN9QFontInfoaSERKS_ @ 6839 NONAME
+ _ZN9QGradient10setColorAtEfRK6QColor @ 6840 NONAME
+ _ZN9QGradient16staticMetaObjectE @ 6841 NONAME DATA 16
+ _ZN9QGradient17setCoordinateModeENS_14CoordinateModeE @ 6842 NONAME
+ _ZN9QGradient19getStaticMetaObjectEv @ 6843 NONAME
+ _ZN9QGradient20setInterpolationModeENS_17InterpolationModeE @ 6844 NONAME
+ _ZN9QGradient8setStopsERK7QVectorI5QPairIf6QColorEE @ 6845 NONAME
+ _ZN9QGradientC1Ev @ 6846 NONAME
+ _ZN9QGradientC2Ev @ 6847 NONAME
+ _ZN9QGradienteqERKS_ @ 6848 NONAME
+ _ZN9QGroupBox10childEventEP11QChildEvent @ 6849 NONAME
+ _ZN9QGroupBox10paintEventEP11QPaintEvent @ 6850 NONAME
+ _ZN9QGroupBox10setCheckedEb @ 6851 NONAME
+ _ZN9QGroupBox11changeEventEP6QEvent @ 6852 NONAME
+ _ZN9QGroupBox11qt_metacallEN11QMetaObject4CallEiPPv @ 6853 NONAME
+ _ZN9QGroupBox11qt_metacastEPKc @ 6854 NONAME
+ _ZN9QGroupBox11resizeEventEP12QResizeEvent @ 6855 NONAME
+ _ZN9QGroupBox12focusInEventEP11QFocusEvent @ 6856 NONAME
+ _ZN9QGroupBox12setAlignmentEi @ 6857 NONAME
+ _ZN9QGroupBox12setCheckableEb @ 6858 NONAME
+ _ZN9QGroupBox14mouseMoveEventEP11QMouseEvent @ 6859 NONAME
+ _ZN9QGroupBox15mousePressEventEP11QMouseEvent @ 6860 NONAME
+ _ZN9QGroupBox16staticMetaObjectE @ 6861 NONAME DATA 16
+ _ZN9QGroupBox17mouseReleaseEventEP11QMouseEvent @ 6862 NONAME
+ _ZN9QGroupBox19getStaticMetaObjectEv @ 6863 NONAME
+ _ZN9QGroupBox5eventEP6QEvent @ 6864 NONAME
+ _ZN9QGroupBox7clickedEb @ 6865 NONAME
+ _ZN9QGroupBox7setFlatEb @ 6866 NONAME
+ _ZN9QGroupBox7toggledEb @ 6867 NONAME
+ _ZN9QGroupBox8setTitleERK7QString @ 6868 NONAME
+ _ZN9QGroupBoxC1EP7QWidget @ 6869 NONAME
+ _ZN9QGroupBoxC1ERK7QStringP7QWidget @ 6870 NONAME
+ _ZN9QGroupBoxC2EP7QWidget @ 6871 NONAME
+ _ZN9QGroupBoxC2ERK7QStringP7QWidget @ 6872 NONAME
+ _ZN9QGroupBoxD0Ev @ 6873 NONAME
+ _ZN9QGroupBoxD1Ev @ 6874 NONAME
+ _ZN9QGroupBoxD2Ev @ 6875 NONAME
+ _ZN9QKeyEvent22createExtendedKeyEventEN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEEjjjRK7QStringbt @ 6876 NONAME
+ _ZN9QKeyEventC1EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbt @ 6877 NONAME
+ _ZN9QKeyEventC2EN6QEvent4TypeEi6QFlagsIN2Qt16KeyboardModifierEERK7QStringbt @ 6878 NONAME
+ _ZN9QKeyEventD0Ev @ 6879 NONAME
+ _ZN9QKeyEventD1Ev @ 6880 NONAME
+ _ZN9QKeyEventD2Ev @ 6881 NONAME
+ _ZN9QLineEdit10paintEventEP11QPaintEvent @ 6882 NONAME
+ _ZN9QLineEdit10textEditedERK7QString @ 6883 NONAME
+ _ZN9QLineEdit11changeEventEP6QEvent @ 6884 NONAME
+ _ZN9QLineEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 6885 NONAME
+ _ZN9QLineEdit11qt_metacastEPKc @ 6886 NONAME
+ _ZN9QLineEdit11setEchoModeENS_8EchoModeE @ 6887 NONAME
+ _ZN9QLineEdit11setModifiedEb @ 6888 NONAME
+ _ZN9QLineEdit11setReadOnlyEb @ 6889 NONAME
+ _ZN9QLineEdit11textChangedERK7QString @ 6890 NONAME
+ _ZN9QLineEdit12focusInEventEP11QFocusEvent @ 6891 NONAME
+ _ZN9QLineEdit12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 6892 NONAME
+ _ZN9QLineEdit12setCompleterEP10QCompleter @ 6893 NONAME
+ _ZN9QLineEdit12setInputMaskERK7QString @ 6894 NONAME
+ _ZN9QLineEdit12setMaxLengthEi @ 6895 NONAME
+ _ZN9QLineEdit12setSelectionEii @ 6896 NONAME
+ _ZN9QLineEdit12setValidatorEPK10QValidator @ 6897 NONAME
+ _ZN9QLineEdit13cursorForwardEbi @ 6898 NONAME
+ _ZN9QLineEdit13dragMoveEventEP14QDragMoveEvent @ 6899 NONAME
+ _ZN9QLineEdit13focusOutEventEP11QFocusEvent @ 6900 NONAME
+ _ZN9QLineEdit13keyPressEventEP9QKeyEvent @ 6901 NONAME
+ _ZN9QLineEdit13returnPressedEv @ 6902 NONAME
+ _ZN9QLineEdit14cursorBackwardEbi @ 6903 NONAME
+ _ZN9QLineEdit14dragEnterEventEP15QDragEnterEvent @ 6904 NONAME
+ _ZN9QLineEdit14dragLeaveEventEP15QDragLeaveEvent @ 6905 NONAME
+ _ZN9QLineEdit14mouseMoveEventEP11QMouseEvent @ 6906 NONAME
+ _ZN9QLineEdit14setDragEnabledEb @ 6907 NONAME
+ _ZN9QLineEdit14setTextMarginsEiiii @ 6908 NONAME
+ _ZN9QLineEdit15editingFinishedEv @ 6909 NONAME
+ _ZN9QLineEdit15mousePressEventEP11QMouseEvent @ 6910 NONAME
+ _ZN9QLineEdit16contextMenuEventEP17QContextMenuEvent @ 6911 NONAME
+ _ZN9QLineEdit16cursorPositionAtERK6QPoint @ 6912 NONAME
+ _ZN9QLineEdit16inputMethodEventEP17QInputMethodEvent @ 6913 NONAME
+ _ZN9QLineEdit16selectionChangedEv @ 6914 NONAME
+ _ZN9QLineEdit16staticMetaObjectE @ 6915 NONAME DATA 16
+ _ZN9QLineEdit17cursorWordForwardEb @ 6916 NONAME
+ _ZN9QLineEdit17mouseReleaseEventEP11QMouseEvent @ 6917 NONAME
+ _ZN9QLineEdit17setCursorPositionEi @ 6918 NONAME
+ _ZN9QLineEdit18cursorWordBackwardEb @ 6919 NONAME
+ _ZN9QLineEdit19getStaticMetaObjectEv @ 6920 NONAME
+ _ZN9QLineEdit21cursorPositionChangedEii @ 6921 NONAME
+ _ZN9QLineEdit21mouseDoubleClickEventEP11QMouseEvent @ 6922 NONAME
+ _ZN9QLineEdit25createStandardContextMenuEv @ 6923 NONAME
+ _ZN9QLineEdit3cutEv @ 6924 NONAME
+ _ZN9QLineEdit3delEv @ 6925 NONAME
+ _ZN9QLineEdit3endEb @ 6926 NONAME
+ _ZN9QLineEdit4homeEb @ 6927 NONAME
+ _ZN9QLineEdit4redoEv @ 6928 NONAME
+ _ZN9QLineEdit4undoEv @ 6929 NONAME
+ _ZN9QLineEdit5clearEv @ 6930 NONAME
+ _ZN9QLineEdit5eventEP6QEvent @ 6931 NONAME
+ _ZN9QLineEdit5pasteEv @ 6932 NONAME
+ _ZN9QLineEdit6insertERK7QString @ 6933 NONAME
+ _ZN9QLineEdit7setTextERK7QString @ 6934 NONAME
+ _ZN9QLineEdit8deselectEv @ 6935 NONAME
+ _ZN9QLineEdit8setFrameEb @ 6936 NONAME
+ _ZN9QLineEdit9backspaceEv @ 6937 NONAME
+ _ZN9QLineEdit9dropEventEP10QDropEvent @ 6938 NONAME
+ _ZN9QLineEdit9selectAllEv @ 6939 NONAME
+ _ZN9QLineEditC1EP7QWidget @ 6940 NONAME
+ _ZN9QLineEditC1ERK7QStringP7QWidget @ 6941 NONAME
+ _ZN9QLineEditC2EP7QWidget @ 6942 NONAME
+ _ZN9QLineEditC2ERK7QStringP7QWidget @ 6943 NONAME
+ _ZN9QLineEditD0Ev @ 6944 NONAME
+ _ZN9QLineEditD1Ev @ 6945 NONAME
+ _ZN9QLineEditD2Ev @ 6946 NONAME
+ _ZN9QListView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 6947 NONAME
+ _ZN9QListView10paintEventEP11QPaintEvent @ 6948 NONAME
+ _ZN9QListView10setSpacingEi @ 6949 NONAME
+ _ZN9QListView10timerEventEP11QTimerEvent @ 6950 NONAME
+ _ZN9QListView11dataChangedERK11QModelIndexS2_ @ 6951 NONAME
+ _ZN9QListView11qt_metacallEN11QMetaObject4CallEiPPv @ 6952 NONAME
+ _ZN9QListView11qt_metacastEPKc @ 6953 NONAME
+ _ZN9QListView11resizeEventEP12QResizeEvent @ 6954 NONAME
+ _ZN9QListView11setGridSizeERK5QSize @ 6955 NONAME
+ _ZN9QListView11setMovementENS_8MovementE @ 6956 NONAME
+ _ZN9QListView11setViewModeENS_8ViewModeE @ 6957 NONAME
+ _ZN9QListView11setWordWrapEb @ 6958 NONAME
+ _ZN9QListView11setWrappingEb @ 6959 NONAME
+ _ZN9QListView12indexesMovedERK5QListI11QModelIndexE @ 6960 NONAME
+ _ZN9QListView12internalDragE6QFlagsIN2Qt10DropActionEE @ 6961 NONAME
+ _ZN9QListView12internalDropEP10QDropEvent @ 6962 NONAME
+ _ZN9QListView12rowsInsertedERK11QModelIndexii @ 6963 NONAME
+ _ZN9QListView12setBatchSizeEi @ 6964 NONAME
+ _ZN9QListView12setRootIndexERK11QModelIndex @ 6965 NONAME
+ _ZN9QListView12setRowHiddenEib @ 6966 NONAME
+ _ZN9QListView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 6967 NONAME
+ _ZN9QListView13doItemsLayoutEv @ 6968 NONAME
+ _ZN9QListView13dragMoveEventEP14QDragMoveEvent @ 6969 NONAME
+ _ZN9QListView13setLayoutModeENS_10LayoutModeE @ 6970 NONAME
+ _ZN9QListView13setResizeModeENS_10ResizeModeE @ 6971 NONAME
+ _ZN9QListView14currentChangedERK11QModelIndexS2_ @ 6972 NONAME
+ _ZN9QListView14dragLeaveEventEP15QDragLeaveEvent @ 6973 NONAME
+ _ZN9QListView14mouseMoveEventEP11QMouseEvent @ 6974 NONAME
+ _ZN9QListView14resizeContentsEii @ 6975 NONAME
+ _ZN9QListView14setModelColumnEi @ 6976 NONAME
+ _ZN9QListView16scrollContentsByEii @ 6977 NONAME
+ _ZN9QListView16selectionChangedERK14QItemSelectionS2_ @ 6978 NONAME
+ _ZN9QListView16staticMetaObjectE @ 6979 NONAME DATA 16
+ _ZN9QListView16updateGeometriesEv @ 6980 NONAME
+ _ZN9QListView17mouseReleaseEventEP11QMouseEvent @ 6981 NONAME
+ _ZN9QListView18clearPropertyFlagsEv @ 6982 NONAME
+ _ZN9QListView19getStaticMetaObjectEv @ 6983 NONAME
+ _ZN9QListView19setPositionForIndexERK6QPointRK11QModelIndex @ 6984 NONAME
+ _ZN9QListView19setUniformItemSizesEb @ 6985 NONAME
+ _ZN9QListView20rowsAboutToBeRemovedERK11QModelIndexii @ 6986 NONAME
+ _ZN9QListView23setSelectionRectVisibleEb @ 6987 NONAME
+ _ZN9QListView5eventEP6QEvent @ 6988 NONAME
+ _ZN9QListView5resetEv @ 6989 NONAME
+ _ZN9QListView7setFlowENS_4FlowE @ 6990 NONAME
+ _ZN9QListView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 6991 NONAME
+ _ZN9QListView9dropEventEP10QDropEvent @ 6992 NONAME
+ _ZN9QListView9startDragE6QFlagsIN2Qt10DropActionEE @ 6993 NONAME
+ _ZN9QListViewC1EP7QWidget @ 6994 NONAME
+ _ZN9QListViewC1ER16QListViewPrivateP7QWidget @ 6995 NONAME
+ _ZN9QListViewC2EP7QWidget @ 6996 NONAME
+ _ZN9QListViewC2ER16QListViewPrivateP7QWidget @ 6997 NONAME
+ _ZN9QListViewD0Ev @ 6998 NONAME
+ _ZN9QListViewD1Ev @ 6999 NONAME
+ _ZN9QListViewD2Ev @ 7000 NONAME
+ _ZN9QPolygonF9translateERK7QPointF @ 7001 NONAME
+ _ZN9QPolygonFC1ERK6QRectF @ 7002 NONAME
+ _ZN9QPolygonFC1ERK8QPolygon @ 7003 NONAME
+ _ZN9QPolygonFC2ERK6QRectF @ 7004 NONAME
+ _ZN9QPolygonFC2ERK8QPolygon @ 7005 NONAME
+ _ZN9QS60Style11qt_metacallEN11QMetaObject4CallEiPPv @ 7006 NONAME
+ _ZN9QS60Style11qt_metacastEPKc @ 7007 NONAME
+ _ZN9QS60Style16setStylePropertyEPKcRK8QVariant @ 7008 NONAME
+ _ZN9QS60Style16staticMetaObjectE @ 7009 NONAME DATA 16
+ _ZN9QS60Style19getStaticMetaObjectEv @ 7010 NONAME
+ _ZN9QS60Style5eventEP6QEvent @ 7011 NONAME
+ _ZN9QS60Style6polishEP12QApplication @ 7012 NONAME
+ _ZN9QS60Style6polishEP7QWidget @ 7013 NONAME
+ _ZN9QS60Style8unpolishEP12QApplication @ 7014 NONAME
+ _ZN9QS60Style8unpolishEP7QWidget @ 7015 NONAME
+ _ZN9QS60StyleC1Ev @ 7016 NONAME
+ _ZN9QS60StyleC2Ev @ 7017 NONAME
+ _ZN9QS60StyleD0Ev @ 7018 NONAME
+ _ZN9QS60StyleD1Ev @ 7019 NONAME
+ _ZN9QS60StyleD2Ev @ 7020 NONAME
+ _ZN9QShortcut10setContextEN2Qt15ShortcutContextE @ 7021 NONAME
+ _ZN9QShortcut10setEnabledEb @ 7022 NONAME
+ _ZN9QShortcut11qt_metacallEN11QMetaObject4CallEiPPv @ 7023 NONAME
+ _ZN9QShortcut11qt_metacastEPKc @ 7024 NONAME
+ _ZN9QShortcut12setWhatsThisERK7QString @ 7025 NONAME
+ _ZN9QShortcut13setAutoRepeatEb @ 7026 NONAME
+ _ZN9QShortcut16staticMetaObjectE @ 7027 NONAME DATA 16
+ _ZN9QShortcut19getStaticMetaObjectEv @ 7028 NONAME
+ _ZN9QShortcut20activatedAmbiguouslyEv @ 7029 NONAME
+ _ZN9QShortcut5eventEP6QEvent @ 7030 NONAME
+ _ZN9QShortcut6setKeyERK12QKeySequence @ 7031 NONAME
+ _ZN9QShortcut7contextEv @ 7032 NONAME
+ _ZN9QShortcut9activatedEv @ 7033 NONAME
+ _ZN9QShortcutC1EP7QWidget @ 7034 NONAME
+ _ZN9QShortcutC1ERK12QKeySequenceP7QWidgetPKcS6_N2Qt15ShortcutContextE @ 7035 NONAME
+ _ZN9QShortcutC2EP7QWidget @ 7036 NONAME
+ _ZN9QShortcutC2ERK12QKeySequenceP7QWidgetPKcS6_N2Qt15ShortcutContextE @ 7037 NONAME
+ _ZN9QShortcutD0Ev @ 7038 NONAME
+ _ZN9QShortcutD1Ev @ 7039 NONAME
+ _ZN9QShortcutD2Ev @ 7040 NONAME
+ _ZN9QSizeGrip10paintEventEP11QPaintEvent @ 7041 NONAME
+ _ZN9QSizeGrip10setVisibleEb @ 7042 NONAME
+ _ZN9QSizeGrip11eventFilterEP7QObjectP6QEvent @ 7043 NONAME
+ _ZN9QSizeGrip11qt_metacallEN11QMetaObject4CallEiPPv @ 7044 NONAME
+ _ZN9QSizeGrip11qt_metacastEPKc @ 7045 NONAME
+ _ZN9QSizeGrip14mouseMoveEventEP11QMouseEvent @ 7046 NONAME
+ _ZN9QSizeGrip15mousePressEventEP11QMouseEvent @ 7047 NONAME
+ _ZN9QSizeGrip16staticMetaObjectE @ 7048 NONAME DATA 16
+ _ZN9QSizeGrip17mouseReleaseEventEP11QMouseEvent @ 7049 NONAME
+ _ZN9QSizeGrip19getStaticMetaObjectEv @ 7050 NONAME
+ _ZN9QSizeGrip5eventEP6QEvent @ 7051 NONAME
+ _ZN9QSizeGrip9hideEventEP10QHideEvent @ 7052 NONAME
+ _ZN9QSizeGrip9moveEventEP10QMoveEvent @ 7053 NONAME
+ _ZN9QSizeGrip9showEventEP10QShowEvent @ 7054 NONAME
+ _ZN9QSizeGripC1EP7QWidget @ 7055 NONAME
+ _ZN9QSizeGripC2EP7QWidget @ 7056 NONAME
+ _ZN9QSizeGripD0Ev @ 7057 NONAME
+ _ZN9QSizeGripD1Ev @ 7058 NONAME
+ _ZN9QSizeGripD2Ev @ 7059 NONAME
+ _ZN9QSplitter10childEventEP11QChildEvent @ 7060 NONAME
+ _ZN9QSplitter11changeEventEP6QEvent @ 7061 NONAME
+ _ZN9QSplitter11qt_metacallEN11QMetaObject4CallEiPPv @ 7062 NONAME
+ _ZN9QSplitter11qt_metacastEPKc @ 7063 NONAME
+ _ZN9QSplitter11resizeEventEP12QResizeEvent @ 7064 NONAME
+ _ZN9QSplitter12createHandleEv @ 7065 NONAME
+ _ZN9QSplitter12insertWidgetEiP7QWidget @ 7066 NONAME
+ _ZN9QSplitter12moveSplitterEii @ 7067 NONAME
+ _ZN9QSplitter12restoreStateERK10QByteArray @ 7068 NONAME
+ _ZN9QSplitter13setRubberBandEi @ 7069 NONAME
+ _ZN9QSplitter13splitterMovedEii @ 7070 NONAME
+ _ZN9QSplitter14setCollapsibleEib @ 7071 NONAME
+ _ZN9QSplitter14setHandleWidthEi @ 7072 NONAME
+ _ZN9QSplitter14setOrientationEN2Qt11OrientationE @ 7073 NONAME
+ _ZN9QSplitter15setOpaqueResizeEb @ 7074 NONAME
+ _ZN9QSplitter16setStretchFactorEii @ 7075 NONAME
+ _ZN9QSplitter16staticMetaObjectE @ 7076 NONAME DATA 16
+ _ZN9QSplitter19getStaticMetaObjectEv @ 7077 NONAME
+ _ZN9QSplitter20closestLegalPositionEii @ 7078 NONAME
+ _ZN9QSplitter22setChildrenCollapsibleEb @ 7079 NONAME
+ _ZN9QSplitter5eventEP6QEvent @ 7080 NONAME
+ _ZN9QSplitter7refreshEv @ 7081 NONAME
+ _ZN9QSplitter8setSizesERK5QListIiE @ 7082 NONAME
+ _ZN9QSplitter9addWidgetEP7QWidget @ 7083 NONAME
+ _ZN9QSplitterC1EN2Qt11OrientationEP7QWidget @ 7084 NONAME
+ _ZN9QSplitterC1EP7QWidget @ 7085 NONAME
+ _ZN9QSplitterC2EN2Qt11OrientationEP7QWidget @ 7086 NONAME
+ _ZN9QSplitterC2EP7QWidget @ 7087 NONAME
+ _ZN9QSplitterD0Ev @ 7088 NONAME
+ _ZN9QSplitterD1Ev @ 7089 NONAME
+ _ZN9QSplitterD2Ev @ 7090 NONAME
+ _ZN9QTextEdit10insertHtmlERK7QString @ 7091 NONAME
+ _ZN9QTextEdit10moveCursorEN11QTextCursor13MoveOperationENS0_8MoveModeE @ 7092 NONAME
+ _ZN9QTextEdit10paintEventEP11QPaintEvent @ 7093 NONAME
+ _ZN9QTextEdit10timerEventEP11QTimerEvent @ 7094 NONAME
+ _ZN9QTextEdit10wheelEventEP11QWheelEvent @ 7095 NONAME
+ _ZN9QTextEdit11changeEventEP6QEvent @ 7096 NONAME
+ _ZN9QTextEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 7097 NONAME
+ _ZN9QTextEdit11qt_metacastEPKc @ 7098 NONAME
+ _ZN9QTextEdit11resizeEventEP12QResizeEvent @ 7099 NONAME
+ _ZN9QTextEdit11setDocumentEP13QTextDocument @ 7100 NONAME
+ _ZN9QTextEdit11setReadOnlyEb @ 7101 NONAME
+ _ZN9QTextEdit11textChangedEv @ 7102 NONAME
+ _ZN9QTextEdit12focusInEventEP11QFocusEvent @ 7103 NONAME
+ _ZN9QTextEdit12loadResourceEiRK4QUrl @ 7104 NONAME
+ _ZN9QTextEdit12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE @ 7105 NONAME
+ _ZN9QTextEdit12setPlainTextERK7QString @ 7106 NONAME
+ _ZN9QTextEdit12setTextColorERK6QColor @ 7107 NONAME
+ _ZN9QTextEdit13copyAvailableEb @ 7108 NONAME
+ _ZN9QTextEdit13dragMoveEventEP14QDragMoveEvent @ 7109 NONAME
+ _ZN9QTextEdit13focusOutEventEP11QFocusEvent @ 7110 NONAME
+ _ZN9QTextEdit13keyPressEventEP9QKeyEvent @ 7111 NONAME
+ _ZN9QTextEdit13redoAvailableEb @ 7112 NONAME
+ _ZN9QTextEdit13setFontFamilyERK7QString @ 7113 NONAME
+ _ZN9QTextEdit13setFontItalicEb @ 7114 NONAME
+ _ZN9QTextEdit13setFontWeightEi @ 7115 NONAME
+ _ZN9QTextEdit13setTextCursorERK11QTextCursor @ 7116 NONAME
+ _ZN9QTextEdit13undoAvailableEb @ 7117 NONAME
+ _ZN9QTextEdit14dragEnterEventEP15QDragEnterEvent @ 7118 NONAME
+ _ZN9QTextEdit14dragLeaveEventEP15QDragLeaveEvent @ 7119 NONAME
+ _ZN9QTextEdit14mouseMoveEventEP11QMouseEvent @ 7120 NONAME
+ _ZN9QTextEdit14scrollToAnchorERK7QString @ 7121 NONAME
+ _ZN9QTextEdit14setCurrentFontERK5QFont @ 7122 NONAME
+ _ZN9QTextEdit14setCursorWidthEi @ 7123 NONAME
+ _ZN9QTextEdit15insertPlainTextERK7QString @ 7124 NONAME
+ _ZN9QTextEdit15keyReleaseEventEP9QKeyEvent @ 7125 NONAME
+ _ZN9QTextEdit15mousePressEventEP11QMouseEvent @ 7126 NONAME
+ _ZN9QTextEdit15setLineWrapModeENS_12LineWrapModeE @ 7127 NONAME
+ _ZN9QTextEdit15setTabStopWidthEi @ 7128 NONAME
+ _ZN9QTextEdit15setWordWrapModeEN11QTextOption8WrapModeE @ 7129 NONAME
+ _ZN9QTextEdit16contextMenuEventEP17QContextMenuEvent @ 7130 NONAME
+ _ZN9QTextEdit16inputMethodEventEP17QInputMethodEvent @ 7131 NONAME
+ _ZN9QTextEdit16scrollContentsByEii @ 7132 NONAME
+ _ZN9QTextEdit16selectionChangedEv @ 7133 NONAME
+ _ZN9QTextEdit16setFontPointSizeEf @ 7134 NONAME
+ _ZN9QTextEdit16setFontUnderlineEb @ 7135 NONAME
+ _ZN9QTextEdit16setOverwriteModeEb @ 7136 NONAME
+ _ZN9QTextEdit16staticMetaObjectE @ 7137 NONAME DATA 16
+ _ZN9QTextEdit17mouseReleaseEventEP11QMouseEvent @ 7138 NONAME
+ _ZN9QTextEdit17setAcceptRichTextEb @ 7139 NONAME
+ _ZN9QTextEdit17setAutoFormattingE6QFlagsINS_18AutoFormattingFlagEE @ 7140 NONAME
+ _ZN9QTextEdit18focusNextPrevChildEb @ 7141 NONAME
+ _ZN9QTextEdit18insertFromMimeDataEPK9QMimeData @ 7142 NONAME
+ _ZN9QTextEdit18setExtraSelectionsERK5QListINS_14ExtraSelectionEE @ 7143 NONAME
+ _ZN9QTextEdit18setTabChangesFocusEb @ 7144 NONAME
+ _ZN9QTextEdit19ensureCursorVisibleEv @ 7145 NONAME
+ _ZN9QTextEdit19getStaticMetaObjectEv @ 7146 NONAME
+ _ZN9QTextEdit20setCurrentCharFormatERK15QTextCharFormat @ 7147 NONAME
+ _ZN9QTextEdit21cursorPositionChangedEv @ 7148 NONAME
+ _ZN9QTextEdit21mouseDoubleClickEventEP11QMouseEvent @ 7149 NONAME
+ _ZN9QTextEdit22mergeCurrentCharFormatERK15QTextCharFormat @ 7150 NONAME
+ _ZN9QTextEdit22setTextBackgroundColorERK6QColor @ 7151 NONAME
+ _ZN9QTextEdit23setTextInteractionFlagsE6QFlagsIN2Qt19TextInteractionFlagEE @ 7152 NONAME
+ _ZN9QTextEdit24currentCharFormatChangedERK15QTextCharFormat @ 7153 NONAME
+ _ZN9QTextEdit24setLineWrapColumnOrWidthEi @ 7154 NONAME
+ _ZN9QTextEdit25createStandardContextMenuERK6QPoint @ 7155 NONAME
+ _ZN9QTextEdit25createStandardContextMenuEv @ 7156 NONAME
+ _ZN9QTextEdit3cutEv @ 7157 NONAME
+ _ZN9QTextEdit4copyEv @ 7158 NONAME
+ _ZN9QTextEdit4findERK7QString6QFlagsIN13QTextDocument8FindFlagEE @ 7159 NONAME
+ _ZN9QTextEdit4redoEv @ 7160 NONAME
+ _ZN9QTextEdit4undoEv @ 7161 NONAME
+ _ZN9QTextEdit5clearEv @ 7162 NONAME
+ _ZN9QTextEdit5eventEP6QEvent @ 7163 NONAME
+ _ZN9QTextEdit5pasteEv @ 7164 NONAME
+ _ZN9QTextEdit6appendERK7QString @ 7165 NONAME
+ _ZN9QTextEdit6zoomInEi @ 7166 NONAME
+ _ZN9QTextEdit7setHtmlERK7QString @ 7167 NONAME
+ _ZN9QTextEdit7setTextERK7QString @ 7168 NONAME
+ _ZN9QTextEdit7zoomOutEi @ 7169 NONAME
+ _ZN9QTextEdit9dropEventEP10QDropEvent @ 7170 NONAME
+ _ZN9QTextEdit9selectAllEv @ 7171 NONAME
+ _ZN9QTextEdit9showEventEP10QShowEvent @ 7172 NONAME
+ _ZN9QTextEditC1EP7QWidget @ 7173 NONAME
+ _ZN9QTextEditC1ER16QTextEditPrivateP7QWidget @ 7174 NONAME
+ _ZN9QTextEditC1ERK7QStringP7QWidget @ 7175 NONAME
+ _ZN9QTextEditC2EP7QWidget @ 7176 NONAME
+ _ZN9QTextEditC2ER16QTextEditPrivateP7QWidget @ 7177 NONAME
+ _ZN9QTextEditC2ERK7QStringP7QWidget @ 7178 NONAME
+ _ZN9QTextEditD0Ev @ 7179 NONAME
+ _ZN9QTextEditD1Ev @ 7180 NONAME
+ _ZN9QTextEditD2Ev @ 7181 NONAME
+ _ZN9QTextLine11setPositionERK7QPointF @ 7182 NONAME
+ _ZN9QTextLine12setLineWidthEf @ 7183 NONAME
+ _ZN9QTextLine13layout_helperEi @ 7184 NONAME
+ _ZN9QTextLine13setNumColumnsEi @ 7185 NONAME
+ _ZN9QTextLine13setNumColumnsEif @ 7186 NONAME
+ _ZN9QTextList10removeItemEi @ 7187 NONAME
+ _ZN9QTextList11qt_metacallEN11QMetaObject4CallEiPPv @ 7188 NONAME
+ _ZN9QTextList11qt_metacastEPKc @ 7189 NONAME
+ _ZN9QTextList16staticMetaObjectE @ 7190 NONAME DATA 16
+ _ZN9QTextList19getStaticMetaObjectEv @ 7191 NONAME
+ _ZN9QTextList3addERK10QTextBlock @ 7192 NONAME
+ _ZN9QTextList6removeERK10QTextBlock @ 7193 NONAME
+ _ZN9QTextListC1EP13QTextDocument @ 7194 NONAME
+ _ZN9QTextListC2EP13QTextDocument @ 7195 NONAME
+ _ZN9QTextListD0Ev @ 7196 NONAME
+ _ZN9QTextListD1Ev @ 7197 NONAME
+ _ZN9QTextListD2Ev @ 7198 NONAME
+ _ZN9QTimeEdit11qt_metacallEN11QMetaObject4CallEiPPv @ 7199 NONAME
+ _ZN9QTimeEdit11qt_metacastEPKc @ 7200 NONAME
+ _ZN9QTimeEdit16staticMetaObjectE @ 7201 NONAME DATA 16
+ _ZN9QTimeEdit19getStaticMetaObjectEv @ 7202 NONAME
+ _ZN9QTimeEditC1EP7QWidget @ 7203 NONAME
+ _ZN9QTimeEditC1ERK5QTimeP7QWidget @ 7204 NONAME
+ _ZN9QTimeEditC2EP7QWidget @ 7205 NONAME
+ _ZN9QTimeEditC2ERK5QTimeP7QWidget @ 7206 NONAME
+ _ZN9QTreeView10hideColumnEi @ 7207 NONAME
+ _ZN9QTreeView10moveCursorEN17QAbstractItemView12CursorActionE6QFlagsIN2Qt16KeyboardModifierEE @ 7208 NONAME
+ _ZN9QTreeView10paintEventEP11QPaintEvent @ 7209 NONAME
+ _ZN9QTreeView10showColumnEi @ 7210 NONAME
+ _ZN9QTreeView10timerEventEP11QTimerEvent @ 7211 NONAME
+ _ZN9QTreeView11collapseAllEv @ 7212 NONAME
+ _ZN9QTreeView11columnMovedEv @ 7213 NONAME
+ _ZN9QTreeView11dataChangedERK11QModelIndexS2_ @ 7214 NONAME
+ _ZN9QTreeView11qt_metacallEN11QMetaObject4CallEiPPv @ 7215 NONAME
+ _ZN9QTreeView11qt_metacastEPKc @ 7216 NONAME
+ _ZN9QTreeView11rowsRemovedERK11QModelIndexii @ 7217 NONAME
+ _ZN9QTreeView11setAnimatedEb @ 7218 NONAME
+ _ZN9QTreeView11setExpandedERK11QModelIndexb @ 7219 NONAME
+ _ZN9QTreeView11setWordWrapEb @ 7220 NONAME
+ _ZN9QTreeView12rowsInsertedERK11QModelIndexii @ 7221 NONAME
+ _ZN9QTreeView12setRootIndexERK11QModelIndex @ 7222 NONAME
+ _ZN9QTreeView12setRowHiddenEiRK11QModelIndexb @ 7223 NONAME
+ _ZN9QTreeView12setSelectionERK5QRect6QFlagsIN19QItemSelectionModel13SelectionFlagEE @ 7224 NONAME
+ _ZN9QTreeView12sortByColumnEi @ 7225 NONAME
+ _ZN9QTreeView12sortByColumnEiN2Qt9SortOrderE @ 7226 NONAME
+ _ZN9QTreeView13columnResizedEiii @ 7227 NONAME
+ _ZN9QTreeView13doItemsLayoutEv @ 7228 NONAME
+ _ZN9QTreeView13dragMoveEventEP14QDragMoveEvent @ 7229 NONAME
+ _ZN9QTreeView13expandToDepthEi @ 7230 NONAME
+ _ZN9QTreeView13keyPressEventEP9QKeyEvent @ 7231 NONAME
+ _ZN9QTreeView13viewportEventEP6QEvent @ 7232 NONAME
+ _ZN9QTreeView14currentChangedERK11QModelIndexS2_ @ 7233 NONAME
+ _ZN9QTreeView14keyboardSearchERK7QString @ 7234 NONAME
+ _ZN9QTreeView14mouseMoveEventEP11QMouseEvent @ 7235 NONAME
+ _ZN9QTreeView14setColumnWidthEii @ 7236 NONAME
+ _ZN9QTreeView14setIndentationEi @ 7237 NONAME
+ _ZN9QTreeView15mousePressEventEP11QMouseEvent @ 7238 NONAME
+ _ZN9QTreeView15setColumnHiddenEib @ 7239 NONAME
+ _ZN9QTreeView15setHeaderHiddenEb @ 7240 NONAME
+ _ZN9QTreeView16scrollContentsByEii @ 7241 NONAME
+ _ZN9QTreeView16selectionChangedERK14QItemSelectionS2_ @ 7242 NONAME
+ _ZN9QTreeView16staticMetaObjectE @ 7243 NONAME DATA 16
+ _ZN9QTreeView16updateGeometriesEv @ 7244 NONAME
+ _ZN9QTreeView17mouseReleaseEventEP11QMouseEvent @ 7245 NONAME
+ _ZN9QTreeView17setSelectionModelEP19QItemSelectionModel @ 7246 NONAME
+ _ZN9QTreeView17setSortingEnabledEb @ 7247 NONAME
+ _ZN9QTreeView18columnCountChangedEii @ 7248 NONAME
+ _ZN9QTreeView18setAutoExpandDelayEi @ 7249 NONAME
+ _ZN9QTreeView18setItemsExpandableEb @ 7250 NONAME
+ _ZN9QTreeView18setRootIsDecoratedEb @ 7251 NONAME
+ _ZN9QTreeView19getStaticMetaObjectEv @ 7252 NONAME
+ _ZN9QTreeView20rowsAboutToBeRemovedERK11QModelIndexii @ 7253 NONAME
+ _ZN9QTreeView20setUniformRowHeightsEb @ 7254 NONAME
+ _ZN9QTreeView21mouseDoubleClickEventEP11QMouseEvent @ 7255 NONAME
+ _ZN9QTreeView21setFirstColumnSpannedEiRK11QModelIndexb @ 7256 NONAME
+ _ZN9QTreeView22resizeColumnToContentsEi @ 7257 NONAME
+ _ZN9QTreeView22setAllColumnsShowFocusEb @ 7258 NONAME
+ _ZN9QTreeView23setExpandsOnDoubleClickEb @ 7259 NONAME
+ _ZN9QTreeView25horizontalScrollbarActionEi @ 7260 NONAME
+ _ZN9QTreeView5resetEv @ 7261 NONAME
+ _ZN9QTreeView6expandERK11QModelIndex @ 7262 NONAME
+ _ZN9QTreeView8collapseERK11QModelIndex @ 7263 NONAME
+ _ZN9QTreeView8expandedERK11QModelIndex @ 7264 NONAME
+ _ZN9QTreeView8reexpandEv @ 7265 NONAME
+ _ZN9QTreeView8scrollToERK11QModelIndexN17QAbstractItemView10ScrollHintE @ 7266 NONAME
+ _ZN9QTreeView8setModelEP18QAbstractItemModel @ 7267 NONAME
+ _ZN9QTreeView9collapsedERK11QModelIndex @ 7268 NONAME
+ _ZN9QTreeView9expandAllEv @ 7269 NONAME
+ _ZN9QTreeView9selectAllEv @ 7270 NONAME
+ _ZN9QTreeView9setHeaderEP11QHeaderView @ 7271 NONAME
+ _ZN9QTreeViewC1EP7QWidget @ 7272 NONAME
+ _ZN9QTreeViewC1ER16QTreeViewPrivateP7QWidget @ 7273 NONAME
+ _ZN9QTreeViewC2EP7QWidget @ 7274 NONAME
+ _ZN9QTreeViewC2ER16QTreeViewPrivateP7QWidget @ 7275 NONAME
+ _ZN9QTreeViewD0Ev @ 7276 NONAME
+ _ZN9QTreeViewD1Ev @ 7277 NONAME
+ _ZN9QTreeViewD2Ev @ 7278 NONAME
+ _ZN9QUndoView11qt_metacallEN11QMetaObject4CallEiPPv @ 7279 NONAME
+ _ZN9QUndoView11qt_metacastEPKc @ 7280 NONAME
+ _ZN9QUndoView12setCleanIconERK5QIcon @ 7281 NONAME
+ _ZN9QUndoView13setEmptyLabelERK7QString @ 7282 NONAME
+ _ZN9QUndoView16staticMetaObjectE @ 7283 NONAME DATA 16
+ _ZN9QUndoView19getStaticMetaObjectEv @ 7284 NONAME
+ _ZN9QUndoView8setGroupEP10QUndoGroup @ 7285 NONAME
+ _ZN9QUndoView8setStackEP10QUndoStack @ 7286 NONAME
+ _ZN9QUndoViewC1EP10QUndoGroupP7QWidget @ 7287 NONAME
+ _ZN9QUndoViewC1EP10QUndoStackP7QWidget @ 7288 NONAME
+ _ZN9QUndoViewC1EP7QWidget @ 7289 NONAME
+ _ZN9QUndoViewC2EP10QUndoGroupP7QWidget @ 7290 NONAME
+ _ZN9QUndoViewC2EP10QUndoStackP7QWidget @ 7291 NONAME
+ _ZN9QUndoViewC2EP7QWidget @ 7292 NONAME
+ _ZN9QUndoViewD0Ev @ 7293 NONAME
+ _ZN9QUndoViewD1Ev @ 7294 NONAME
+ _ZN9QUndoViewD2Ev @ 7295 NONAME
+ _ZN9QVector2D10dotProductERKS_S1_ @ 7296 NONAME
+ _ZN9QVector2D9normalizeEv @ 7297 NONAME
+ _ZN9QVector2DC1ERK9QVector3D @ 7298 NONAME
+ _ZN9QVector2DC1ERK9QVector4D @ 7299 NONAME
+ _ZN9QVector2DC2ERK9QVector3D @ 7300 NONAME
+ _ZN9QVector2DC2ERK9QVector4D @ 7301 NONAME
+ _ZN9QVector3D10dotProductERKS_S1_ @ 7302 NONAME
+ _ZN9QVector3D12crossProductERKS_S1_ @ 7303 NONAME
+ _ZN9QVector3D6normalERKS_S1_ @ 7304 NONAME
+ _ZN9QVector3D6normalERKS_S1_S1_ @ 7305 NONAME
+ _ZN9QVector3D9normalizeEv @ 7306 NONAME
+ _ZN9QVector3DC1ERK9QVector2D @ 7307 NONAME
+ _ZN9QVector3DC1ERK9QVector2Df @ 7308 NONAME
+ _ZN9QVector3DC1ERK9QVector4D @ 7309 NONAME
+ _ZN9QVector3DC2ERK9QVector2D @ 7310 NONAME
+ _ZN9QVector3DC2ERK9QVector2Df @ 7311 NONAME
+ _ZN9QVector3DC2ERK9QVector4D @ 7312 NONAME
+ _ZN9QVector4D10dotProductERKS_S1_ @ 7313 NONAME
+ _ZN9QVector4D9normalizeEv @ 7314 NONAME
+ _ZN9QVector4DC1ERK9QVector2D @ 7315 NONAME
+ _ZN9QVector4DC1ERK9QVector2Dff @ 7316 NONAME
+ _ZN9QVector4DC1ERK9QVector3D @ 7317 NONAME
+ _ZN9QVector4DC1ERK9QVector3Df @ 7318 NONAME
+ _ZN9QVector4DC2ERK9QVector2D @ 7319 NONAME
+ _ZN9QVector4DC2ERK9QVector2Dff @ 7320 NONAME
+ _ZN9QVector4DC2ERK9QVector3D @ 7321 NONAME
+ _ZN9QVector4DC2ERK9QVector3Df @ 7322 NONAME
+ _ZNK10QBoxLayout10metaObjectEv @ 7323 NONAME
+ _ZNK10QBoxLayout11maximumSizeEv @ 7324 NONAME
+ _ZNK10QBoxLayout11minimumSizeEv @ 7325 NONAME
+ _ZNK10QBoxLayout14heightForWidthEi @ 7326 NONAME
+ _ZNK10QBoxLayout17hasHeightForWidthEv @ 7327 NONAME
+ _ZNK10QBoxLayout19expandingDirectionsEv @ 7328 NONAME
+ _ZNK10QBoxLayout21minimumHeightForWidthEi @ 7329 NONAME
+ _ZNK10QBoxLayout5countEv @ 7330 NONAME
+ _ZNK10QBoxLayout6itemAtEi @ 7331 NONAME
+ _ZNK10QBoxLayout7spacingEv @ 7332 NONAME
+ _ZNK10QBoxLayout7stretchEi @ 7333 NONAME
+ _ZNK10QBoxLayout8sizeHintEv @ 7334 NONAME
+ _ZNK10QBoxLayout9directionEv @ 7335 NONAME
+ _ZNK10QClipboard10metaObjectEv @ 7336 NONAME
+ _ZNK10QClipboard12supportsModeENS_4ModeE @ 7337 NONAME
+ _ZNK10QClipboard13ownsClipboardEv @ 7338 NONAME
+ _ZNK10QClipboard13ownsSelectionEv @ 7339 NONAME
+ _ZNK10QClipboard14ownsFindBufferEv @ 7340 NONAME
+ _ZNK10QClipboard17supportsSelectionEv @ 7341 NONAME
+ _ZNK10QClipboard18supportsFindBufferEv @ 7342 NONAME
+ _ZNK10QClipboard4textENS_4ModeE @ 7343 NONAME
+ _ZNK10QClipboard4textER7QStringNS_4ModeE @ 7344 NONAME
+ _ZNK10QClipboard5imageENS_4ModeE @ 7345 NONAME
+ _ZNK10QClipboard6pixmapENS_4ModeE @ 7346 NONAME
+ _ZNK10QClipboard8mimeDataENS_4ModeE @ 7347 NONAME
+ _ZNK10QClipboard8ownsModeENS_4ModeE @ 7348 NONAME
+ _ZNK10QCompleter10currentRowEv @ 7349 NONAME
+ _ZNK10QCompleter10metaObjectEv @ 7350 NONAME
+ _ZNK10QCompleter10wrapAroundEv @ 7351 NONAME
+ _ZNK10QCompleter12currentIndexEv @ 7352 NONAME
+ _ZNK10QCompleter12modelSortingEv @ 7353 NONAME
+ _ZNK10QCompleter13pathFromIndexERK11QModelIndex @ 7354 NONAME
+ _ZNK10QCompleter14completionModeEv @ 7355 NONAME
+ _ZNK10QCompleter14completionRoleEv @ 7356 NONAME
+ _ZNK10QCompleter15caseSensitivityEv @ 7357 NONAME
+ _ZNK10QCompleter15completionCountEv @ 7358 NONAME
+ _ZNK10QCompleter15completionModelEv @ 7359 NONAME
+ _ZNK10QCompleter15maxVisibleItemsEv @ 7360 NONAME
+ _ZNK10QCompleter16completionColumnEv @ 7361 NONAME
+ _ZNK10QCompleter16completionPrefixEv @ 7362 NONAME
+ _ZNK10QCompleter17currentCompletionEv @ 7363 NONAME
+ _ZNK10QCompleter5modelEv @ 7364 NONAME
+ _ZNK10QCompleter5popupEv @ 7365 NONAME
+ _ZNK10QCompleter6widgetEv @ 7366 NONAME
+ _ZNK10QCompleter9splitPathERK7QString @ 7367 NONAME
+ _ZNK10QDropEvent11encodedDataEPKc @ 7368 NONAME
+ _ZNK10QDropEvent6formatEi @ 7369 NONAME
+ _ZNK10QDropEvent6sourceEv @ 7370 NONAME
+ _ZNK10QDropEvent8providesEPKc @ 7371 NONAME
+ _ZNK10QImageData19checkForAlphaPixelsEv @ 7372 NONAME
+ _ZNK10QImageData9doImageIOEPK6QImageP12QImageWriteri @ 7373 NONAME
+ _ZNK10QLCDNumber10metaObjectEv @ 7374 NONAME
+ _ZNK10QLCDNumber12segmentStyleEv @ 7375 NONAME
+ _ZNK10QLCDNumber13checkOverflowEd @ 7376 NONAME
+ _ZNK10QLCDNumber13checkOverflowEi @ 7377 NONAME
+ _ZNK10QLCDNumber17smallDecimalPointEv @ 7378 NONAME
+ _ZNK10QLCDNumber4modeEv @ 7379 NONAME
+ _ZNK10QLCDNumber5valueEv @ 7380 NONAME
+ _ZNK10QLCDNumber8intValueEv @ 7381 NONAME
+ _ZNK10QLCDNumber8sizeHintEv @ 7382 NONAME
+ _ZNK10QLCDNumber9numDigitsEv @ 7383 NONAME
+ _ZNK10QMatrix4x410transposedEv @ 7384 NONAME
+ _ZNK10QMatrix4x411determinantEv @ 7385 NONAME
+ _ZNK10QMatrix4x411toTransformEf @ 7386 NONAME
+ _ZNK10QMatrix4x412normalMatrixEv @ 7387 NONAME
+ _ZNK10QMatrix4x412toValueArrayEPf @ 7388 NONAME
+ _ZNK10QMatrix4x418extractTranslationEv @ 7389 NONAME
+ _ZNK10QMatrix4x418orthonormalInverseEv @ 7390 NONAME
+ _ZNK10QMatrix4x419extractAxisRotationERfR9QVector3D @ 7391 NONAME
+ _ZNK10QMatrix4x47mapRectERK5QRect @ 7392 NONAME
+ _ZNK10QMatrix4x47mapRectERK6QRectF @ 7393 NONAME
+ _ZNK10QMatrix4x48invertedEPb @ 7394 NONAME
+ _ZNK10QMatrix4x48toAffineEv @ 7395 NONAME
+ _ZNK10QMatrix4x4cv8QVariantEv @ 7396 NONAME
+ _ZNK10QPictureIO10parametersEv @ 7397 NONAME
+ _ZNK10QPictureIO11descriptionEv @ 7398 NONAME
+ _ZNK10QPictureIO5gammaEv @ 7399 NONAME
+ _ZNK10QPictureIO6formatEv @ 7400 NONAME
+ _ZNK10QPictureIO6statusEv @ 7401 NONAME
+ _ZNK10QPictureIO7pictureEv @ 7402 NONAME
+ _ZNK10QPictureIO7qualityEv @ 7403 NONAME
+ _ZNK10QPictureIO8fileNameEv @ 7404 NONAME
+ _ZNK10QPictureIO8ioDeviceEv @ 7405 NONAME
+ _ZNK10QScrollBar10metaObjectEv @ 7406 NONAME
+ _ZNK10QScrollBar15initStyleOptionEP18QStyleOptionSlider @ 7407 NONAME
+ _ZNK10QScrollBar8sizeHintEv @ 7408 NONAME
+ _ZNK10QStatusBar10metaObjectEv @ 7409 NONAME
+ _ZNK10QStatusBar14currentMessageEv @ 7410 NONAME
+ _ZNK10QStatusBar17isSizeGripEnabledEv @ 7411 NONAME
+ _ZNK10QTabWidget10metaObjectEv @ 7412 NONAME
+ _ZNK10QTabWidget10tabToolTipEi @ 7413 NONAME
+ _ZNK10QTabWidget11tabPositionEv @ 7414 NONAME
+ _ZNK10QTabWidget12cornerWidgetEN2Qt6CornerE @ 7415 NONAME
+ _ZNK10QTabWidget12currentIndexEv @ 7416 NONAME
+ _ZNK10QTabWidget12documentModeEv @ 7417 NONAME
+ _ZNK10QTabWidget12isTabEnabledEi @ 7418 NONAME
+ _ZNK10QTabWidget12tabWhatsThisEi @ 7419 NONAME
+ _ZNK10QTabWidget12tabsClosableEv @ 7420 NONAME
+ _ZNK10QTabWidget13currentWidgetEv @ 7421 NONAME
+ _ZNK10QTabWidget15initStyleOptionEP26QStyleOptionTabWidgetFrame @ 7422 NONAME
+ _ZNK10QTabWidget15minimumSizeHintEv @ 7423 NONAME
+ _ZNK10QTabWidget17usesScrollButtonsEv @ 7424 NONAME
+ _ZNK10QTabWidget5countEv @ 7425 NONAME
+ _ZNK10QTabWidget6tabBarEv @ 7426 NONAME
+ _ZNK10QTabWidget6widgetEi @ 7427 NONAME
+ _ZNK10QTabWidget7indexOfEP7QWidget @ 7428 NONAME
+ _ZNK10QTabWidget7tabIconEi @ 7429 NONAME
+ _ZNK10QTabWidget7tabTextEi @ 7430 NONAME
+ _ZNK10QTabWidget8iconSizeEv @ 7431 NONAME
+ _ZNK10QTabWidget8sizeHintEv @ 7432 NONAME
+ _ZNK10QTabWidget8tabShapeEv @ 7433 NONAME
+ _ZNK10QTabWidget9elideModeEv @ 7434 NONAME
+ _ZNK10QTabWidget9isMovableEv @ 7435 NONAME
+ _ZNK10QTableView10columnSpanEii @ 7436 NONAME
+ _ZNK10QTableView10metaObjectEv @ 7437 NONAME
+ _ZNK10QTableView10visualRectERK11QModelIndex @ 7438 NONAME
+ _ZNK10QTableView11columnWidthEi @ 7439 NONAME
+ _ZNK10QTableView11isRowHiddenEi @ 7440 NONAME
+ _ZNK10QTableView11viewOptionsEv @ 7441 NONAME
+ _ZNK10QTableView11visualIndexERK11QModelIndex @ 7442 NONAME
+ _ZNK10QTableView13isIndexHiddenERK11QModelIndex @ 7443 NONAME
+ _ZNK10QTableView14isColumnHiddenEi @ 7444 NONAME
+ _ZNK10QTableView14sizeHintForRowEi @ 7445 NONAME
+ _ZNK10QTableView14verticalHeaderEv @ 7446 NONAME
+ _ZNK10QTableView14verticalOffsetEv @ 7447 NONAME
+ _ZNK10QTableView15selectedIndexesEv @ 7448 NONAME
+ _ZNK10QTableView16horizontalHeaderEv @ 7449 NONAME
+ _ZNK10QTableView16horizontalOffsetEv @ 7450 NONAME
+ _ZNK10QTableView16isSortingEnabledEv @ 7451 NONAME
+ _ZNK10QTableView17sizeHintForColumnEi @ 7452 NONAME
+ _ZNK10QTableView19rowViewportPositionEi @ 7453 NONAME
+ _ZNK10QTableView21isCornerButtonEnabledEv @ 7454 NONAME
+ _ZNK10QTableView22columnViewportPositionEi @ 7455 NONAME
+ _ZNK10QTableView24visualRegionForSelectionERK14QItemSelection @ 7456 NONAME
+ _ZNK10QTableView5rowAtEi @ 7457 NONAME
+ _ZNK10QTableView7indexAtERK6QPoint @ 7458 NONAME
+ _ZNK10QTableView7rowSpanEii @ 7459 NONAME
+ _ZNK10QTableView8columnAtEi @ 7460 NONAME
+ _ZNK10QTableView8showGridEv @ 7461 NONAME
+ _ZNK10QTableView8wordWrapEv @ 7462 NONAME
+ _ZNK10QTableView9gridStyleEv @ 7463 NONAME
+ _ZNK10QTableView9rowHeightEi @ 7464 NONAME
+ _ZNK10QTextBlock10charFormatEv @ 7465 NONAME
+ _ZNK10QTextBlock11blockFormatEv @ 7466 NONAME
+ _ZNK10QTextBlock11blockNumberEv @ 7467 NONAME
+ _ZNK10QTextBlock15charFormatIndexEv @ 7468 NONAME
+ _ZNK10QTextBlock15firstLineNumberEv @ 7469 NONAME
+ _ZNK10QTextBlock16blockFormatIndexEv @ 7470 NONAME
+ _ZNK10QTextBlock3endEv @ 7471 NONAME
+ _ZNK10QTextBlock4nextEv @ 7472 NONAME
+ _ZNK10QTextBlock4textEv @ 7473 NONAME
+ _ZNK10QTextBlock5beginEv @ 7474 NONAME
+ _ZNK10QTextBlock6layoutEv @ 7475 NONAME
+ _ZNK10QTextBlock6lengthEv @ 7476 NONAME
+ _ZNK10QTextBlock8containsEi @ 7477 NONAME
+ _ZNK10QTextBlock8documentEv @ 7478 NONAME
+ _ZNK10QTextBlock8iterator8fragmentEv @ 7479 NONAME
+ _ZNK10QTextBlock8positionEv @ 7480 NONAME
+ _ZNK10QTextBlock8previousEv @ 7481 NONAME
+ _ZNK10QTextBlock8revisionEv @ 7482 NONAME
+ _ZNK10QTextBlock8textListEv @ 7483 NONAME
+ _ZNK10QTextBlock8userDataEv @ 7484 NONAME
+ _ZNK10QTextBlock9isVisibleEv @ 7485 NONAME
+ _ZNK10QTextBlock9lineCountEv @ 7486 NONAME
+ _ZNK10QTextBlock9userStateEv @ 7487 NONAME
+ _ZNK10QTextFrame10layoutDataEv @ 7488 NONAME
+ _ZNK10QTextFrame10metaObjectEv @ 7489 NONAME
+ _ZNK10QTextFrame11childFramesEv @ 7490 NONAME
+ _ZNK10QTextFrame11parentFrameEv @ 7491 NONAME
+ _ZNK10QTextFrame12lastPositionEv @ 7492 NONAME
+ _ZNK10QTextFrame13firstPositionEv @ 7493 NONAME
+ _ZNK10QTextFrame18lastCursorPositionEv @ 7494 NONAME
+ _ZNK10QTextFrame19firstCursorPositionEv @ 7495 NONAME
+ _ZNK10QTextFrame3endEv @ 7496 NONAME
+ _ZNK10QTextFrame5beginEv @ 7497 NONAME
+ _ZNK10QTextFrame8iterator12currentBlockEv @ 7498 NONAME
+ _ZNK10QTextFrame8iterator12currentFrameEv @ 7499 NONAME
+ _ZNK10QTextTable10metaObjectEv @ 7500 NONAME
+ _ZNK10QTextTable4rowsEv @ 7501 NONAME
+ _ZNK10QTextTable6cellAtERK11QTextCursor @ 7502 NONAME
+ _ZNK10QTextTable6cellAtEi @ 7503 NONAME
+ _ZNK10QTextTable6cellAtEii @ 7504 NONAME
+ _ZNK10QTextTable6rowEndERK11QTextCursor @ 7505 NONAME
+ _ZNK10QTextTable7columnsEv @ 7506 NONAME
+ _ZNK10QTextTable8rowStartERK11QTextCursor @ 7507 NONAME
+ _ZNK10QTransform10transposedEv @ 7508 NONAME
+ _ZNK10QTransform12mapToPolygonERK5QRect @ 7509 NONAME
+ _ZNK10QTransform3mapERK12QPainterPath @ 7510 NONAME
+ _ZNK10QTransform3mapERK5QLine @ 7511 NONAME
+ _ZNK10QTransform3mapERK6QLineF @ 7512 NONAME
+ _ZNK10QTransform3mapERK6QPoint @ 7513 NONAME
+ _ZNK10QTransform3mapERK7QPointF @ 7514 NONAME
+ _ZNK10QTransform3mapERK7QRegion @ 7515 NONAME
+ _ZNK10QTransform3mapERK8QPolygon @ 7516 NONAME
+ _ZNK10QTransform3mapERK9QPolygonF @ 7517 NONAME
+ _ZNK10QTransform3mapEffPfS0_ @ 7518 NONAME
+ _ZNK10QTransform3mapEiiPiS0_ @ 7519 NONAME
+ _ZNK10QTransform4typeEv @ 7520 NONAME
+ _ZNK10QTransform7adjointEv @ 7521 NONAME
+ _ZNK10QTransform7mapRectERK5QRect @ 7522 NONAME
+ _ZNK10QTransform7mapRectERK6QRectF @ 7523 NONAME
+ _ZNK10QTransform8invertedEPb @ 7524 NONAME
+ _ZNK10QTransform8toAffineEv @ 7525 NONAME
+ _ZNK10QTransformcv8QVariantEv @ 7526 NONAME
+ _ZNK10QTransformeqERKS_ @ 7527 NONAME
+ _ZNK10QTransformmlERKS_ @ 7528 NONAME
+ _ZNK10QTransformneERKS_ @ 7529 NONAME
+ _ZNK10QUndoGroup10metaObjectEv @ 7530 NONAME
+ _ZNK10QUndoGroup11activeStackEv @ 7531 NONAME
+ _ZNK10QUndoGroup16createRedoActionEP7QObjectRK7QString @ 7532 NONAME
+ _ZNK10QUndoGroup16createUndoActionEP7QObjectRK7QString @ 7533 NONAME
+ _ZNK10QUndoGroup6stacksEv @ 7534 NONAME
+ _ZNK10QUndoGroup7canRedoEv @ 7535 NONAME
+ _ZNK10QUndoGroup7canUndoEv @ 7536 NONAME
+ _ZNK10QUndoGroup7isCleanEv @ 7537 NONAME
+ _ZNK10QUndoGroup8redoTextEv @ 7538 NONAME
+ _ZNK10QUndoGroup8undoTextEv @ 7539 NONAME
+ _ZNK10QUndoStack10cleanIndexEv @ 7540 NONAME
+ _ZNK10QUndoStack10metaObjectEv @ 7541 NONAME
+ _ZNK10QUndoStack16createRedoActionEP7QObjectRK7QString @ 7542 NONAME
+ _ZNK10QUndoStack16createUndoActionEP7QObjectRK7QString @ 7543 NONAME
+ _ZNK10QUndoStack4textEi @ 7544 NONAME
+ _ZNK10QUndoStack5countEv @ 7545 NONAME
+ _ZNK10QUndoStack5indexEv @ 7546 NONAME
+ _ZNK10QUndoStack7canRedoEv @ 7547 NONAME
+ _ZNK10QUndoStack7canUndoEv @ 7548 NONAME
+ _ZNK10QUndoStack7commandEi @ 7549 NONAME
+ _ZNK10QUndoStack7isCleanEv @ 7550 NONAME
+ _ZNK10QUndoStack8isActiveEv @ 7551 NONAME
+ _ZNK10QUndoStack8redoTextEv @ 7552 NONAME
+ _ZNK10QUndoStack8undoTextEv @ 7553 NONAME
+ _ZNK10QUndoStack9undoLimitEv @ 7554 NONAME
+ _ZNK10QValidator10metaObjectEv @ 7555 NONAME
+ _ZNK10QValidator5fixupER7QString @ 7556 NONAME
+ _ZNK10QValidator6localeEv @ 7557 NONAME
+ _ZNK10QWorkspace10backgroundEv @ 7558 NONAME
+ _ZNK10QWorkspace10metaObjectEv @ 7559 NONAME
+ _ZNK10QWorkspace10windowListENS_11WindowOrderE @ 7560 NONAME
+ _ZNK10QWorkspace12activeWindowEv @ 7561 NONAME
+ _ZNK10QWorkspace17scrollBarsEnabledEv @ 7562 NONAME
+ _ZNK10QWorkspace8sizeHintEv @ 7563 NONAME
+ _ZNK11QColumnView10metaObjectEv @ 7564 NONAME
+ _ZNK11QColumnView10visualRectERK11QModelIndex @ 7565 NONAME
+ _ZNK11QColumnView12columnWidthsEv @ 7566 NONAME
+ _ZNK11QColumnView13isIndexHiddenERK11QModelIndex @ 7567 NONAME
+ _ZNK11QColumnView13previewWidgetEv @ 7568 NONAME
+ _ZNK11QColumnView14verticalOffsetEv @ 7569 NONAME
+ _ZNK11QColumnView16horizontalOffsetEv @ 7570 NONAME
+ _ZNK11QColumnView16initializeColumnEP17QAbstractItemView @ 7571 NONAME
+ _ZNK11QColumnView18resizeGripsVisibleEv @ 7572 NONAME
+ _ZNK11QColumnView24visualRegionForSelectionERK14QItemSelection @ 7573 NONAME
+ _ZNK11QColumnView7indexAtERK6QPoint @ 7574 NONAME
+ _ZNK11QColumnView8sizeHintEv @ 7575 NONAME
+ _ZNK11QDockWidget10metaObjectEv @ 7576 NONAME
+ _ZNK11QDockWidget12allowedAreasEv @ 7577 NONAME
+ _ZNK11QDockWidget14titleBarWidgetEv @ 7578 NONAME
+ _ZNK11QDockWidget15initStyleOptionEP22QStyleOptionDockWidget @ 7579 NONAME
+ _ZNK11QDockWidget16toggleViewActionEv @ 7580 NONAME
+ _ZNK11QDockWidget6widgetEv @ 7581 NONAME
+ _ZNK11QDockWidget8featuresEv @ 7582 NONAME
+ _ZNK11QFileDialog10acceptModeEv @ 7583 NONAME
+ _ZNK11QFileDialog10isReadOnlyEv @ 7584 NONAME
+ _ZNK11QFileDialog10metaObjectEv @ 7585 NONAME
+ _ZNK11QFileDialog10proxyModelEv @ 7586 NONAME
+ _ZNK11QFileDialog10testOptionENS_6OptionE @ 7587 NONAME
+ _ZNK11QFileDialog11nameFiltersEv @ 7588 NONAME
+ _ZNK11QFileDialog11sidebarUrlsEv @ 7589 NONAME
+ _ZNK11QFileDialog12iconProviderEv @ 7590 NONAME
+ _ZNK11QFileDialog12itemDelegateEv @ 7591 NONAME
+ _ZNK11QFileDialog13defaultSuffixEv @ 7592 NONAME
+ _ZNK11QFileDialog13selectedFilesEv @ 7593 NONAME
+ _ZNK11QFileDialog14selectedFilterEv @ 7594 NONAME
+ _ZNK11QFileDialog15resolveSymlinksEv @ 7595 NONAME
+ _ZNK11QFileDialog16confirmOverwriteEv @ 7596 NONAME
+ _ZNK11QFileDialog18selectedNameFilterEv @ 7597 NONAME
+ _ZNK11QFileDialog26isNameFilterDetailsVisibleEv @ 7598 NONAME
+ _ZNK11QFileDialog6filterEv @ 7599 NONAME
+ _ZNK11QFileDialog7filtersEv @ 7600 NONAME
+ _ZNK11QFileDialog7historyEv @ 7601 NONAME
+ _ZNK11QFileDialog7optionsEv @ 7602 NONAME
+ _ZNK11QFileDialog8fileModeEv @ 7603 NONAME
+ _ZNK11QFileDialog8viewModeEv @ 7604 NONAME
+ _ZNK11QFileDialog9directoryEv @ 7605 NONAME
+ _ZNK11QFileDialog9labelTextENS_11DialogLabelE @ 7606 NONAME
+ _ZNK11QFileDialog9saveStateEv @ 7607 NONAME
+ _ZNK11QFocusEvent6reasonEv @ 7608 NONAME
+ _ZNK11QFocusFrame10metaObjectEv @ 7609 NONAME
+ _ZNK11QFocusFrame15initStyleOptionEP12QStyleOption @ 7610 NONAME
+ _ZNK11QFocusFrame6widgetEv @ 7611 NONAME
+ _ZNK11QFontDialog10metaObjectEv @ 7612 NONAME
+ _ZNK11QFontDialog10testOptionENS_16FontDialogOptionE @ 7613 NONAME
+ _ZNK11QFontDialog11currentFontEv @ 7614 NONAME
+ _ZNK11QFontDialog12selectedFontEv @ 7615 NONAME
+ _ZNK11QFontDialog7optionsEv @ 7616 NONAME
+ _ZNK11QFontEngine10glyphCacheEN21QFontEngineGlyphCache4TypeERK10QTransform @ 7617 NONAME
+ _ZNK11QFontEngine10glyphCacheEPvRK10QTransform @ 7618 NONAME
+ _ZNK11QFontEngine10glyphCountEv @ 7619 NONAME
+ _ZNK11QFontEngine10propertiesEv @ 7620 NONAME
+ _ZNK11QFontEngine12getSfntTableEj @ 7621 NONAME
+ _ZNK11QFontEngine12harfbuzzFaceEv @ 7622 NONAME
+ _ZNK11QFontEngine12harfbuzzFontEv @ 7623 NONAME
+ _ZNK11QFontEngine13lineThicknessEv @ 7624 NONAME
+ _ZNK11QFontEngine16averageCharWidthEv @ 7625 NONAME
+ _ZNK11QFontEngine17underlinePositionEv @ 7626 NONAME
+ _ZNK11QFontEngine7xHeightEv @ 7627 NONAME
+ _ZNK11QFontEngine9doKerningEP12QGlyphLayout6QFlagsIN11QTextEngine10ShaperFlagEE @ 7628 NONAME
+ _ZNK11QFormLayout10metaObjectEv @ 7629 NONAME
+ _ZNK11QFormLayout11minimumSizeEv @ 7630 NONAME
+ _ZNK11QFormLayout13formAlignmentEv @ 7631 NONAME
+ _ZNK11QFormLayout13labelForFieldEP7QLayout @ 7632 NONAME
+ _ZNK11QFormLayout13labelForFieldEP7QWidget @ 7633 NONAME
+ _ZNK11QFormLayout13rowWrapPolicyEv @ 7634 NONAME
+ _ZNK11QFormLayout14heightForWidthEi @ 7635 NONAME
+ _ZNK11QFormLayout14labelAlignmentEv @ 7636 NONAME
+ _ZNK11QFormLayout15getItemPositionEiPiPNS_8ItemRoleE @ 7637 NONAME
+ _ZNK11QFormLayout15verticalSpacingEv @ 7638 NONAME
+ _ZNK11QFormLayout17fieldGrowthPolicyEv @ 7639 NONAME
+ _ZNK11QFormLayout17getLayoutPositionEP7QLayoutPiPNS_8ItemRoleE @ 7640 NONAME
+ _ZNK11QFormLayout17getWidgetPositionEP7QWidgetPiPNS_8ItemRoleE @ 7641 NONAME
+ _ZNK11QFormLayout17hasHeightForWidthEv @ 7642 NONAME
+ _ZNK11QFormLayout17horizontalSpacingEv @ 7643 NONAME
+ _ZNK11QFormLayout19expandingDirectionsEv @ 7644 NONAME
+ _ZNK11QFormLayout5countEv @ 7645 NONAME
+ _ZNK11QFormLayout6itemAtEi @ 7646 NONAME
+ _ZNK11QFormLayout6itemAtEiNS_8ItemRoleE @ 7647 NONAME
+ _ZNK11QFormLayout7spacingEv @ 7648 NONAME
+ _ZNK11QFormLayout8rowCountEv @ 7649 NONAME
+ _ZNK11QFormLayout8sizeHintEv @ 7650 NONAME
+ _ZNK11QGridLayout10metaObjectEv @ 7651 NONAME
+ _ZNK11QGridLayout10rowStretchEi @ 7652 NONAME
+ _ZNK11QGridLayout11columnCountEv @ 7653 NONAME
+ _ZNK11QGridLayout11maximumSizeEv @ 7654 NONAME
+ _ZNK11QGridLayout11minimumSizeEv @ 7655 NONAME
+ _ZNK11QGridLayout12originCornerEv @ 7656 NONAME
+ _ZNK11QGridLayout13columnStretchEi @ 7657 NONAME
+ _ZNK11QGridLayout14heightForWidthEi @ 7658 NONAME
+ _ZNK11QGridLayout14itemAtPositionEii @ 7659 NONAME
+ _ZNK11QGridLayout15verticalSpacingEv @ 7660 NONAME
+ _ZNK11QGridLayout16rowMinimumHeightEi @ 7661 NONAME
+ _ZNK11QGridLayout17hasHeightForWidthEv @ 7662 NONAME
+ _ZNK11QGridLayout17horizontalSpacingEv @ 7663 NONAME
+ _ZNK11QGridLayout18columnMinimumWidthEi @ 7664 NONAME
+ _ZNK11QGridLayout19expandingDirectionsEv @ 7665 NONAME
+ _ZNK11QGridLayout21minimumHeightForWidthEi @ 7666 NONAME
+ _ZNK11QGridLayout5countEv @ 7667 NONAME
+ _ZNK11QGridLayout6itemAtEi @ 7668 NONAME
+ _ZNK11QGridLayout7spacingEv @ 7669 NONAME
+ _ZNK11QGridLayout8cellRectEii @ 7670 NONAME
+ _ZNK11QGridLayout8rowCountEv @ 7671 NONAME
+ _ZNK11QGridLayout8sizeHintEv @ 7672 NONAME
+ _ZNK11QHBoxLayout10metaObjectEv @ 7673 NONAME
+ _ZNK11QHeaderView10metaObjectEv @ 7674 NONAME
+ _ZNK11QHeaderView10resizeModeEi @ 7675 NONAME
+ _ZNK11QHeaderView10visualRectERK11QModelIndex @ 7676 NONAME
+ _ZNK11QHeaderView11isClickableEv @ 7677 NONAME
+ _ZNK11QHeaderView11orientationEv @ 7678 NONAME
+ _ZNK11QHeaderView11sectionSizeEi @ 7679 NONAME
+ _ZNK11QHeaderView11visualIndexEi @ 7680 NONAME
+ _ZNK11QHeaderView12logicalIndexEi @ 7681 NONAME
+ _ZNK11QHeaderView12paintSectionEP8QPainterRK5QRecti @ 7682 NONAME
+ _ZNK11QHeaderView13isIndexHiddenERK11QModelIndex @ 7683 NONAME
+ _ZNK11QHeaderView13sectionsMovedEv @ 7684 NONAME
+ _ZNK11QHeaderView13visualIndexAtEi @ 7685 NONAME
+ _ZNK11QHeaderView14logicalIndexAtEi @ 7686 NONAME
+ _ZNK11QHeaderView14sectionsHiddenEv @ 7687 NONAME
+ _ZNK11QHeaderView14verticalOffsetEv @ 7688 NONAME
+ _ZNK11QHeaderView15initStyleOptionEP18QStyleOptionHeader @ 7689 NONAME
+ _ZNK11QHeaderView15isSectionHiddenEi @ 7690 NONAME
+ _ZNK11QHeaderView15sectionPositionEi @ 7691 NONAME
+ _ZNK11QHeaderView15sectionSizeHintEi @ 7692 NONAME
+ _ZNK11QHeaderView16defaultAlignmentEv @ 7693 NONAME
+ _ZNK11QHeaderView16horizontalOffsetEv @ 7694 NONAME
+ _ZNK11QHeaderView17highlightSectionsEv @ 7695 NONAME
+ _ZNK11QHeaderView18defaultSectionSizeEv @ 7696 NONAME
+ _ZNK11QHeaderView18hiddenSectionCountEv @ 7697 NONAME
+ _ZNK11QHeaderView18minimumSectionSizeEv @ 7698 NONAME
+ _ZNK11QHeaderView18sortIndicatorOrderEv @ 7699 NONAME
+ _ZNK11QHeaderView18stretchLastSectionEv @ 7700 NONAME
+ _ZNK11QHeaderView19stretchSectionCountEv @ 7701 NONAME
+ _ZNK11QHeaderView20isSortIndicatorShownEv @ 7702 NONAME
+ _ZNK11QHeaderView20sortIndicatorSectionEv @ 7703 NONAME
+ _ZNK11QHeaderView23cascadingSectionResizesEv @ 7704 NONAME
+ _ZNK11QHeaderView23sectionSizeFromContentsEi @ 7705 NONAME
+ _ZNK11QHeaderView23sectionViewportPositionEi @ 7706 NONAME
+ _ZNK11QHeaderView24visualRegionForSelectionERK14QItemSelection @ 7707 NONAME
+ _ZNK11QHeaderView5countEv @ 7708 NONAME
+ _ZNK11QHeaderView6lengthEv @ 7709 NONAME
+ _ZNK11QHeaderView6offsetEv @ 7710 NONAME
+ _ZNK11QHeaderView7indexAtERK6QPoint @ 7711 NONAME
+ _ZNK11QHeaderView8sizeHintEv @ 7712 NONAME
+ _ZNK11QHeaderView9isMovableEv @ 7713 NONAME
+ _ZNK11QHeaderView9saveStateEv @ 7714 NONAME
+ _ZNK11QLayoutItem12controlTypesEv @ 7715 NONAME
+ _ZNK11QLayoutItem14heightForWidthEi @ 7716 NONAME
+ _ZNK11QLayoutItem17hasHeightForWidthEv @ 7717 NONAME
+ _ZNK11QLayoutItem21minimumHeightForWidthEi @ 7718 NONAME
+ _ZNK11QListWidget10currentRowEv @ 7719 NONAME
+ _ZNK11QListWidget10itemWidgetEP15QListWidgetItem @ 7720 NONAME
+ _ZNK11QListWidget10metaObjectEv @ 7721 NONAME
+ _ZNK11QListWidget11currentItemEv @ 7722 NONAME
+ _ZNK11QListWidget12isItemHiddenEPK15QListWidgetItem @ 7723 NONAME
+ _ZNK11QListWidget13indexFromItemEP15QListWidgetItem @ 7724 NONAME
+ _ZNK11QListWidget13itemFromIndexERK11QModelIndex @ 7725 NONAME
+ _ZNK11QListWidget13selectedItemsEv @ 7726 NONAME
+ _ZNK11QListWidget14isItemSelectedEPK15QListWidgetItem @ 7727 NONAME
+ _ZNK11QListWidget14visualItemRectEPK15QListWidgetItem @ 7728 NONAME
+ _ZNK11QListWidget16isSortingEnabledEv @ 7729 NONAME
+ _ZNK11QListWidget20supportedDropActionsEv @ 7730 NONAME
+ _ZNK11QListWidget3rowEPK15QListWidgetItem @ 7731 NONAME
+ _ZNK11QListWidget4itemEi @ 7732 NONAME
+ _ZNK11QListWidget5countEv @ 7733 NONAME
+ _ZNK11QListWidget5itemsEPK9QMimeData @ 7734 NONAME
+ _ZNK11QListWidget6itemAtERK6QPoint @ 7735 NONAME
+ _ZNK11QListWidget8mimeDataE5QListIP15QListWidgetItemE @ 7736 NONAME
+ _ZNK11QListWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEE @ 7737 NONAME
+ _ZNK11QListWidget9mimeTypesEv @ 7738 NONAME
+ _ZNK11QListWidget9sortOrderEv @ 7739 NONAME
+ _ZNK11QMainWindow10isAnimatedEv @ 7740 NONAME
+ _ZNK11QMainWindow10menuWidgetEv @ 7741 NONAME
+ _ZNK11QMainWindow10metaObjectEv @ 7742 NONAME
+ _ZNK11QMainWindow11dockOptionsEv @ 7743 NONAME
+ _ZNK11QMainWindow11isSeparatorERK6QPoint @ 7744 NONAME
+ _ZNK11QMainWindow11tabPositionEN2Qt14DockWidgetAreaE @ 7745 NONAME
+ _ZNK11QMainWindow11toolBarAreaEP8QToolBar @ 7746 NONAME
+ _ZNK11QMainWindow12documentModeEv @ 7747 NONAME
+ _ZNK11QMainWindow12toolBarBreakEP8QToolBar @ 7748 NONAME
+ _ZNK11QMainWindow13centralWidgetEv @ 7749 NONAME
+ _ZNK11QMainWindow14dockWidgetAreaEP11QDockWidget @ 7750 NONAME
+ _ZNK11QMainWindow15toolButtonStyleEv @ 7751 NONAME
+ _ZNK11QMainWindow19tabifiedDockWidgetsEP11QDockWidget @ 7752 NONAME
+ _ZNK11QMainWindow20isDockNestingEnabledEv @ 7753 NONAME
+ _ZNK11QMainWindow27unifiedTitleAndToolBarOnMacEv @ 7754 NONAME
+ _ZNK11QMainWindow6cornerEN2Qt6CornerE @ 7755 NONAME
+ _ZNK11QMainWindow7menuBarEv @ 7756 NONAME
+ _ZNK11QMainWindow8iconSizeEv @ 7757 NONAME
+ _ZNK11QMainWindow8tabShapeEv @ 7758 NONAME
+ _ZNK11QMainWindow9saveStateEi @ 7759 NONAME
+ _ZNK11QMainWindow9statusBarEv @ 7760 NONAME
+ _ZNK11QMessageBox10buttonRoleEP15QAbstractButton @ 7761 NONAME
+ _ZNK11QMessageBox10buttonTextEi @ 7762 NONAME
+ _ZNK11QMessageBox10iconPixmapEv @ 7763 NONAME
+ _ZNK11QMessageBox10metaObjectEv @ 7764 NONAME
+ _ZNK11QMessageBox10textFormatEv @ 7765 NONAME
+ _ZNK11QMessageBox12detailedTextEv @ 7766 NONAME
+ _ZNK11QMessageBox12escapeButtonEv @ 7767 NONAME
+ _ZNK11QMessageBox13clickedButtonEv @ 7768 NONAME
+ _ZNK11QMessageBox13defaultButtonEv @ 7769 NONAME
+ _ZNK11QMessageBox14standardButtonEP15QAbstractButton @ 7770 NONAME
+ _ZNK11QMessageBox15informativeTextEv @ 7771 NONAME
+ _ZNK11QMessageBox15standardButtonsEv @ 7772 NONAME
+ _ZNK11QMessageBox4iconEv @ 7773 NONAME
+ _ZNK11QMessageBox4textEv @ 7774 NONAME
+ _ZNK11QMessageBox6buttonENS_14StandardButtonE @ 7775 NONAME
+ _ZNK11QMessageBox7buttonsEv @ 7776 NONAME
+ _ZNK11QMessageBox8sizeHintEv @ 7777 NONAME
+ _ZNK11QMimeSource8providesEPKc @ 7778 NONAME
+ _ZNK11QMouseEvent4posFEv @ 7779 NONAME
+ _ZNK11QPanGesture10lastOffsetEv @ 7780 NONAME
+ _ZNK11QPanGesture10metaObjectEv @ 7781 NONAME
+ _ZNK11QPanGesture11totalOffsetEv @ 7782 NONAME
+ _ZNK11QPanGesture12accelerationEv @ 7783 NONAME
+ _ZNK11QPanGesture6offsetEv @ 7784 NONAME
+ _ZNK11QPixmapData11transformedERK10QTransformN2Qt18TransformationModeE @ 7785 NONAME
+ _ZNK11QPixmapData12alphaChannelEv @ 7786 NONAME
+ _ZNK11QPixmapData4maskEv @ 7787 NONAME
+ _ZNK11QProxyModel10headerDataEiN2Qt11OrientationEi @ 7788 NONAME
+ _ZNK11QProxyModel10metaObjectEv @ 7789 NONAME
+ _ZNK11QProxyModel11columnCountERK11QModelIndex @ 7790 NONAME
+ _ZNK11QProxyModel11hasChildrenERK11QModelIndex @ 7791 NONAME
+ _ZNK11QProxyModel13setProxyModelERK11QModelIndex @ 7792 NONAME
+ _ZNK11QProxyModel14connectToModelEPK18QAbstractItemModel @ 7793 NONAME
+ _ZNK11QProxyModel14setSourceModelERK11QModelIndex @ 7794 NONAME
+ _ZNK11QProxyModel19disconnectFromModelEPK18QAbstractItemModel @ 7795 NONAME
+ _ZNK11QProxyModel20supportedDropActionsEv @ 7796 NONAME
+ _ZNK11QProxyModel4dataERK11QModelIndexi @ 7797 NONAME
+ _ZNK11QProxyModel4spanERK11QModelIndex @ 7798 NONAME
+ _ZNK11QProxyModel5flagsERK11QModelIndex @ 7799 NONAME
+ _ZNK11QProxyModel5indexEiiRK11QModelIndex @ 7800 NONAME
+ _ZNK11QProxyModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 7801 NONAME
+ _ZNK11QProxyModel5modelEv @ 7802 NONAME
+ _ZNK11QProxyModel6parentERK11QModelIndex @ 7803 NONAME
+ _ZNK11QProxyModel8mimeDataERK5QListI11QModelIndexE @ 7804 NONAME
+ _ZNK11QProxyModel8rowCountERK11QModelIndex @ 7805 NONAME
+ _ZNK11QProxyModel9mimeTypesEv @ 7806 NONAME
+ _ZNK11QProxyStyle10metaObjectEv @ 7807 NONAME
+ _ZNK11QProxyStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 7808 NONAME
+ _ZNK11QProxyStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 7809 NONAME
+ _ZNK11QProxyStyle12drawItemTextEP8QPainterRK5QRectiRK8QPalettebRK7QStringNS5_9ColorRoleE @ 7810 NONAME
+ _ZNK11QProxyStyle12itemTextRectERK12QFontMetricsRK5QRectibRK7QString @ 7811 NONAME
+ _ZNK11QProxyStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 7812 NONAME
+ _ZNK11QProxyStyle14drawItemPixmapEP8QPainterRK5QRectiRK7QPixmap @ 7813 NONAME
+ _ZNK11QProxyStyle14itemPixmapRectERK5QRectiRK7QPixmap @ 7814 NONAME
+ _ZNK11QProxyStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 7815 NONAME
+ _ZNK11QProxyStyle14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 7816 NONAME
+ _ZNK11QProxyStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 7817 NONAME
+ _ZNK11QProxyStyle15standardPaletteEv @ 7818 NONAME
+ _ZNK11QProxyStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 7819 NONAME
+ _ZNK11QProxyStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 7820 NONAME
+ _ZNK11QProxyStyle19generatedIconPixmapEN5QIcon4ModeERK7QPixmapPK12QStyleOption @ 7821 NONAME
+ _ZNK11QProxyStyle21hitTestComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexRK6QPointPK7QWidget @ 7822 NONAME
+ _ZNK11QProxyStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 7823 NONAME
+ _ZNK11QProxyStyle27layoutSpacingImplementationEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 7824 NONAME
+ _ZNK11QProxyStyle9baseStyleEv @ 7825 NONAME
+ _ZNK11QProxyStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 7826 NONAME
+ _ZNK11QPushButton10metaObjectEv @ 7827 NONAME
+ _ZNK11QPushButton11autoDefaultEv @ 7828 NONAME
+ _ZNK11QPushButton15initStyleOptionEP18QStyleOptionButton @ 7829 NONAME
+ _ZNK11QPushButton15minimumSizeHintEv @ 7830 NONAME
+ _ZNK11QPushButton4menuEv @ 7831 NONAME
+ _ZNK11QPushButton6isFlatEv @ 7832 NONAME
+ _ZNK11QPushButton8sizeHintEv @ 7833 NONAME
+ _ZNK11QPushButton9isDefaultEv @ 7834 NONAME
+ _ZNK11QQuaternion10normalizedEv @ 7835 NONAME
+ _ZNK11QQuaternion12rotateVectorERK9QVector3D @ 7836 NONAME
+ _ZNK11QQuaternion13lengthSquaredEv @ 7837 NONAME
+ _ZNK11QQuaternion6lengthEv @ 7838 NONAME
+ _ZNK11QQuaternioncv8QVariantEv @ 7839 NONAME
+ _ZNK11QRubberBand10metaObjectEv @ 7840 NONAME
+ _ZNK11QRubberBand15initStyleOptionEP22QStyleOptionRubberBand @ 7841 NONAME
+ _ZNK11QRubberBand5shapeEv @ 7842 NONAME
+ _ZNK11QScrollArea10metaObjectEv @ 7843 NONAME
+ _ZNK11QScrollArea15widgetResizableEv @ 7844 NONAME
+ _ZNK11QScrollArea6widgetEv @ 7845 NONAME
+ _ZNK11QScrollArea8sizeHintEv @ 7846 NONAME
+ _ZNK11QScrollArea9alignmentEv @ 7847 NONAME
+ _ZNK11QSizePolicy11controlTypeEv @ 7848 NONAME
+ _ZNK11QSizePolicycv8QVariantEv @ 7849 NONAME
+ _ZNK11QSpacerItem11maximumSizeEv @ 7850 NONAME
+ _ZNK11QSpacerItem11minimumSizeEv @ 7851 NONAME
+ _ZNK11QSpacerItem19expandingDirectionsEv @ 7852 NONAME
+ _ZNK11QSpacerItem7isEmptyEv @ 7853 NONAME
+ _ZNK11QSpacerItem8geometryEv @ 7854 NONAME
+ _ZNK11QSpacerItem8sizeHintEv @ 7855 NONAME
+ _ZNK11QTextCursor10atBlockEndEv @ 7856 NONAME
+ _ZNK11QTextCursor10charFormatEv @ 7857 NONAME
+ _ZNK11QTextCursor11blockFormatEv @ 7858 NONAME
+ _ZNK11QTextCursor11blockNumberEv @ 7859 NONAME
+ _ZNK11QTextCursor11currentListEv @ 7860 NONAME
+ _ZNK11QTextCursor12atBlockStartEv @ 7861 NONAME
+ _ZNK11QTextCursor12columnNumberEv @ 7862 NONAME
+ _ZNK11QTextCursor12currentFrameEv @ 7863 NONAME
+ _ZNK11QTextCursor12currentTableEv @ 7864 NONAME
+ _ZNK11QTextCursor12hasSelectionEv @ 7865 NONAME
+ _ZNK11QTextCursor12selectedTextEv @ 7866 NONAME
+ _ZNK11QTextCursor12selectionEndEv @ 7867 NONAME
+ _ZNK11QTextCursor14selectionStartEv @ 7868 NONAME
+ _ZNK11QTextCursor15blockCharFormatEv @ 7869 NONAME
+ _ZNK11QTextCursor16visualNavigationEv @ 7870 NONAME
+ _ZNK11QTextCursor18selectedTableCellsEPiS0_S0_S0_ @ 7871 NONAME
+ _ZNK11QTextCursor19hasComplexSelectionEv @ 7872 NONAME
+ _ZNK11QTextCursor5atEndEv @ 7873 NONAME
+ _ZNK11QTextCursor5blockEv @ 7874 NONAME
+ _ZNK11QTextCursor6anchorEv @ 7875 NONAME
+ _ZNK11QTextCursor6isNullEv @ 7876 NONAME
+ _ZNK11QTextCursor7atStartEv @ 7877 NONAME
+ _ZNK11QTextCursor8documentEv @ 7878 NONAME
+ _ZNK11QTextCursor8isCopyOfERKS_ @ 7879 NONAME
+ _ZNK11QTextCursor8positionEv @ 7880 NONAME
+ _ZNK11QTextCursor9selectionEv @ 7881 NONAME
+ _ZNK11QTextCursoreqERKS_ @ 7882 NONAME
+ _ZNK11QTextCursorgeERKS_ @ 7883 NONAME
+ _ZNK11QTextCursorgtERKS_ @ 7884 NONAME
+ _ZNK11QTextCursorleERKS_ @ 7885 NONAME
+ _ZNK11QTextCursorltERKS_ @ 7886 NONAME
+ _ZNK11QTextCursorneERKS_ @ 7887 NONAME
+ _ZNK11QTextEngine10attributesEv @ 7888 NONAME
+ _ZNK11QTextEngine10elidedTextEN2Qt13TextElideModeERK6QFixedi @ 7889 NONAME
+ _ZNK11QTextEngine10fontEngineERK11QScriptItemP6QFixedS4_ @ 7890 NONAME
+ _ZNK11QTextEngine11boundingBoxEii @ 7891 NONAME
+ _ZNK11QTextEngine11formatIndexEPK11QScriptItem @ 7892 NONAME
+ _ZNK11QTextEngine11setBoundaryEi @ 7893 NONAME
+ _ZNK11QTextEngine15atWordSeparatorEi @ 7894 NONAME
+ _ZNK11QTextEngine16tightBoundingBoxEii @ 7895 NONAME
+ _ZNK11QTextEngine17calculateTabWidthEi6QFixed @ 7896 NONAME
+ _ZNK11QTextEngine21addRequiredBoundariesEv @ 7897 NONAME
+ _ZNK11QTextEngine21shapeTextWithHarfbuzzEi @ 7898 NONAME
+ _ZNK11QTextEngine24resolveAdditionalFormatsEv @ 7899 NONAME
+ _ZNK11QTextEngine4fontERK11QScriptItem @ 7900 NONAME
+ _ZNK11QTextEngine5shapeEi @ 7901 NONAME
+ _ZNK11QTextEngine5widthEii @ 7902 NONAME
+ _ZNK11QTextEngine6formatEPK11QScriptItem @ 7903 NONAME
+ _ZNK11QTextEngine7atSpaceEi @ 7904 NONAME
+ _ZNK11QTextEngine7itemizeEv @ 7905 NONAME
+ _ZNK11QTextEngine8findItemEi @ 7906 NONAME
+ _ZNK11QTextEngine8validateEv @ 7907 NONAME
+ _ZNK11QTextEngine9shapeTextEi @ 7908 NONAME
+ _ZNK11QTextEngine9splitItemEii @ 7909 NONAME
+ _ZNK11QTextFormat10propertiesEv @ 7910 NONAME
+ _ZNK11QTextFormat11hasPropertyEi @ 7911 NONAME
+ _ZNK11QTextFormat11intPropertyEi @ 7912 NONAME
+ _ZNK11QTextFormat11objectIndexEv @ 7913 NONAME
+ _ZNK11QTextFormat11penPropertyEi @ 7914 NONAME
+ _ZNK11QTextFormat12boolPropertyEi @ 7915 NONAME
+ _ZNK11QTextFormat12toCharFormatEv @ 7916 NONAME
+ _ZNK11QTextFormat12toListFormatEv @ 7917 NONAME
+ _ZNK11QTextFormat13brushPropertyEi @ 7918 NONAME
+ _ZNK11QTextFormat13colorPropertyEi @ 7919 NONAME
+ _ZNK11QTextFormat13propertyCountEv @ 7920 NONAME
+ _ZNK11QTextFormat13toBlockFormatEv @ 7921 NONAME
+ _ZNK11QTextFormat13toFrameFormatEv @ 7922 NONAME
+ _ZNK11QTextFormat13toImageFormatEv @ 7923 NONAME
+ _ZNK11QTextFormat13toTableFormatEv @ 7924 NONAME
+ _ZNK11QTextFormat14doublePropertyEi @ 7925 NONAME
+ _ZNK11QTextFormat14lengthPropertyEi @ 7926 NONAME
+ _ZNK11QTextFormat14stringPropertyEi @ 7927 NONAME
+ _ZNK11QTextFormat17toTableCellFormatEv @ 7928 NONAME
+ _ZNK11QTextFormat20lengthVectorPropertyEi @ 7929 NONAME
+ _ZNK11QTextFormat4typeEv @ 7930 NONAME
+ _ZNK11QTextFormat8propertyEi @ 7931 NONAME
+ _ZNK11QTextFormatcv8QVariantEv @ 7932 NONAME
+ _ZNK11QTextFormateqERKS_ @ 7933 NONAME
+ _ZNK11QTextLayout10drawCursorEP8QPainterRK7QPointFi @ 7934 NONAME
+ _ZNK11QTextLayout10drawCursorEP8QPainterRK7QPointFii @ 7935 NONAME
+ _ZNK11QTextLayout10textOptionEv @ 7936 NONAME
+ _ZNK11QTextLayout12boundingRectEv @ 7937 NONAME
+ _ZNK11QTextLayout12cacheEnabledEv @ 7938 NONAME
+ _ZNK11QTextLayout12maximumWidthEv @ 7939 NONAME
+ _ZNK11QTextLayout12minimumWidthEv @ 7940 NONAME
+ _ZNK11QTextLayout15preeditAreaTextEv @ 7941 NONAME
+ _ZNK11QTextLayout17additionalFormatsEv @ 7942 NONAME
+ _ZNK11QTextLayout18nextCursorPositionEiNS_10CursorModeE @ 7943 NONAME
+ _ZNK11QTextLayout19lineForTextPositionEi @ 7944 NONAME
+ _ZNK11QTextLayout19preeditAreaPositionEv @ 7945 NONAME
+ _ZNK11QTextLayout21isValidCursorPositionEi @ 7946 NONAME
+ _ZNK11QTextLayout22previousCursorPositionEiNS_10CursorModeE @ 7947 NONAME
+ _ZNK11QTextLayout4drawEP8QPainterRK7QPointFRK7QVectorINS_11FormatRangeEERK6QRectF @ 7948 NONAME
+ _ZNK11QTextLayout4fontEv @ 7949 NONAME
+ _ZNK11QTextLayout4textEv @ 7950 NONAME
+ _ZNK11QTextLayout6lineAtEi @ 7951 NONAME
+ _ZNK11QTextLayout8positionEv @ 7952 NONAME
+ _ZNK11QTextLayout9lineCountEv @ 7953 NONAME
+ _ZNK11QTextLengthcv8QVariantEv @ 7954 NONAME
+ _ZNK11QTextObject10metaObjectEv @ 7955 NONAME
+ _ZNK11QTextObject11formatIndexEv @ 7956 NONAME
+ _ZNK11QTextObject11objectIndexEv @ 7957 NONAME
+ _ZNK11QTextObject6formatEv @ 7958 NONAME
+ _ZNK11QTextObject8documentEv @ 7959 NONAME
+ _ZNK11QTextObject9docHandleEv @ 7960 NONAME
+ _ZNK11QTextOption4tabsEv @ 7961 NONAME
+ _ZNK11QTextOption8tabArrayEv @ 7962 NONAME
+ _ZNK11QToolButton10metaObjectEv @ 7963 NONAME
+ _ZNK11QToolButton13defaultActionEv @ 7964 NONAME
+ _ZNK11QToolButton15initStyleOptionEP22QStyleOptionToolButton @ 7965 NONAME
+ _ZNK11QToolButton15minimumSizeHintEv @ 7966 NONAME
+ _ZNK11QToolButton15toolButtonStyleEv @ 7967 NONAME
+ _ZNK11QToolButton4menuEv @ 7968 NONAME
+ _ZNK11QToolButton8sizeHintEv @ 7969 NONAME
+ _ZNK11QToolButton9arrowTypeEv @ 7970 NONAME
+ _ZNK11QToolButton9autoRaiseEv @ 7971 NONAME
+ _ZNK11QToolButton9hitButtonERK6QPoint @ 7972 NONAME
+ _ZNK11QToolButton9popupModeEv @ 7973 NONAME
+ _ZNK11QTouchEvent10TouchPoint10screenRectEv @ 7974 NONAME
+ _ZNK11QTouchEvent10TouchPoint12lastScenePosEv @ 7975 NONAME
+ _ZNK11QTouchEvent10TouchPoint13lastScreenPosEv @ 7976 NONAME
+ _ZNK11QTouchEvent10TouchPoint13normalizedPosEv @ 7977 NONAME
+ _ZNK11QTouchEvent10TouchPoint13startScenePosEv @ 7978 NONAME
+ _ZNK11QTouchEvent10TouchPoint14startScreenPosEv @ 7979 NONAME
+ _ZNK11QTouchEvent10TouchPoint17lastNormalizedPosEv @ 7980 NONAME
+ _ZNK11QTouchEvent10TouchPoint18startNormalizedPosEv @ 7981 NONAME
+ _ZNK11QTouchEvent10TouchPoint2idEv @ 7982 NONAME
+ _ZNK11QTouchEvent10TouchPoint3posEv @ 7983 NONAME
+ _ZNK11QTouchEvent10TouchPoint4rectEv @ 7984 NONAME
+ _ZNK11QTouchEvent10TouchPoint5stateEv @ 7985 NONAME
+ _ZNK11QTouchEvent10TouchPoint7lastPosEv @ 7986 NONAME
+ _ZNK11QTouchEvent10TouchPoint8pressureEv @ 7987 NONAME
+ _ZNK11QTouchEvent10TouchPoint8scenePosEv @ 7988 NONAME
+ _ZNK11QTouchEvent10TouchPoint8startPosEv @ 7989 NONAME
+ _ZNK11QTouchEvent10TouchPoint9isPrimaryEv @ 7990 NONAME
+ _ZNK11QTouchEvent10TouchPoint9sceneRectEv @ 7991 NONAME
+ _ZNK11QTouchEvent10TouchPoint9screenPosEv @ 7992 NONAME
+ _ZNK11QTreeWidget10headerItemEv @ 7993 NONAME
+ _ZNK11QTreeWidget10itemWidgetEP15QTreeWidgetItemi @ 7994 NONAME
+ _ZNK11QTreeWidget10metaObjectEv @ 7995 NONAME
+ _ZNK11QTreeWidget10sortColumnEv @ 7996 NONAME
+ _ZNK11QTreeWidget11columnCountEv @ 7997 NONAME
+ _ZNK11QTreeWidget11currentItemEv @ 7998 NONAME
+ _ZNK11QTreeWidget12isItemHiddenEPK15QTreeWidgetItem @ 7999 NONAME
+ _ZNK11QTreeWidget12topLevelItemEi @ 8000 NONAME
+ _ZNK11QTreeWidget13currentColumnEv @ 8001 NONAME
+ _ZNK11QTreeWidget13indexFromItemEP15QTreeWidgetItemi @ 8002 NONAME
+ _ZNK11QTreeWidget13itemFromIndexERK11QModelIndex @ 8003 NONAME
+ _ZNK11QTreeWidget13selectedItemsEv @ 8004 NONAME
+ _ZNK11QTreeWidget14isItemExpandedEPK15QTreeWidgetItem @ 8005 NONAME
+ _ZNK11QTreeWidget14isItemSelectedEPK15QTreeWidgetItem @ 8006 NONAME
+ _ZNK11QTreeWidget14visualItemRectEPK15QTreeWidgetItem @ 8007 NONAME
+ _ZNK11QTreeWidget16isSortingEnabledEv @ 8008 NONAME
+ _ZNK11QTreeWidget17invisibleRootItemEv @ 8009 NONAME
+ _ZNK11QTreeWidget17topLevelItemCountEv @ 8010 NONAME
+ _ZNK11QTreeWidget19indexOfTopLevelItemEP15QTreeWidgetItem @ 8011 NONAME
+ _ZNK11QTreeWidget20supportedDropActionsEv @ 8012 NONAME
+ _ZNK11QTreeWidget24isFirstItemColumnSpannedEPK15QTreeWidgetItem @ 8013 NONAME
+ _ZNK11QTreeWidget5itemsEPK9QMimeData @ 8014 NONAME
+ _ZNK11QTreeWidget6itemAtERK6QPoint @ 8015 NONAME
+ _ZNK11QTreeWidget8mimeDataE5QListIP15QTreeWidgetItemE @ 8016 NONAME
+ _ZNK11QTreeWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEEi @ 8017 NONAME
+ _ZNK11QTreeWidget9itemAboveEPK15QTreeWidgetItem @ 8018 NONAME
+ _ZNK11QTreeWidget9itemBelowEPK15QTreeWidgetItem @ 8019 NONAME
+ _ZNK11QTreeWidget9mimeTypesEv @ 8020 NONAME
+ _ZNK11QVBoxLayout10metaObjectEv @ 8021 NONAME
+ _ZNK11QVectorPath16controlPointRectEv @ 8022 NONAME
+ _ZNK11QWidgetItem11maximumSizeEv @ 8023 NONAME
+ _ZNK11QWidgetItem11minimumSizeEv @ 8024 NONAME
+ _ZNK11QWidgetItem14heightForWidthEi @ 8025 NONAME
+ _ZNK11QWidgetItem17hasHeightForWidthEv @ 8026 NONAME
+ _ZNK11QWidgetItem19expandingDirectionsEv @ 8027 NONAME
+ _ZNK11QWidgetItem7isEmptyEv @ 8028 NONAME
+ _ZNK11QWidgetItem8geometryEv @ 8029 NONAME
+ _ZNK11QWidgetItem8sizeHintEv @ 8030 NONAME
+ _ZNK11QWizardPage10buttonTextEN7QWizard12WizardButtonE @ 8031 NONAME
+ _ZNK11QWizardPage10isCompleteEv @ 8032 NONAME
+ _ZNK11QWizardPage10metaObjectEv @ 8033 NONAME
+ _ZNK11QWizardPage11isFinalPageEv @ 8034 NONAME
+ _ZNK11QWizardPage12isCommitPageEv @ 8035 NONAME
+ _ZNK11QWizardPage5fieldERK7QString @ 8036 NONAME
+ _ZNK11QWizardPage5titleEv @ 8037 NONAME
+ _ZNK11QWizardPage6nextIdEv @ 8038 NONAME
+ _ZNK11QWizardPage6pixmapEN7QWizard12WizardPixmapE @ 8039 NONAME
+ _ZNK11QWizardPage6wizardEv @ 8040 NONAME
+ _ZNK11QWizardPage8subTitleEv @ 8041 NONAME
+ _ZNK12QActionGroup10metaObjectEv @ 8042 NONAME
+ _ZNK12QActionGroup11isExclusiveEv @ 8043 NONAME
+ _ZNK12QActionGroup13checkedActionEv @ 8044 NONAME
+ _ZNK12QActionGroup7actionsEv @ 8045 NONAME
+ _ZNK12QActionGroup9isEnabledEv @ 8046 NONAME
+ _ZNK12QActionGroup9isVisibleEv @ 8047 NONAME
+ _ZNK12QApplication10metaObjectEv @ 8048 NONAME
+ _ZNK12QApplication10sessionKeyEv @ 8049 NONAME
+ _ZNK12QApplication10styleSheetEv @ 8050 NONAME
+ _ZNK12QApplication12inputContextEv @ 8051 NONAME
+ _ZNK12QApplication14autoSipEnabledEv @ 8052 NONAME
+ _ZNK12QApplication17isSessionRestoredEv @ 8053 NONAME
+ _ZNK12QApplication9sessionIdEv @ 8054 NONAME
+ _ZNK12QButtonGroup10metaObjectEv @ 8055 NONAME
+ _ZNK12QButtonGroup13checkedButtonEv @ 8056 NONAME
+ _ZNK12QButtonGroup2idEP15QAbstractButton @ 8057 NONAME
+ _ZNK12QButtonGroup6buttonEi @ 8058 NONAME
+ _ZNK12QButtonGroup7buttonsEv @ 8059 NONAME
+ _ZNK12QButtonGroup9checkedIdEv @ 8060 NONAME
+ _ZNK12QButtonGroup9exclusiveEv @ 8061 NONAME
+ _ZNK12QColorDialog10metaObjectEv @ 8062 NONAME
+ _ZNK12QColorDialog10testOptionENS_17ColorDialogOptionE @ 8063 NONAME
+ _ZNK12QColorDialog12currentColorEv @ 8064 NONAME
+ _ZNK12QColorDialog13selectedColorEv @ 8065 NONAME
+ _ZNK12QColorDialog7optionsEv @ 8066 NONAME
+ _ZNK12QCommonStyle10metaObjectEv @ 8067 NONAME
+ _ZNK12QCommonStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8068 NONAME
+ _ZNK12QCommonStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 8069 NONAME
+ _ZNK12QCommonStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8070 NONAME
+ _ZNK12QCommonStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8071 NONAME
+ _ZNK12QCommonStyle14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 8072 NONAME
+ _ZNK12QCommonStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 8073 NONAME
+ _ZNK12QCommonStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 8074 NONAME
+ _ZNK12QCommonStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 8075 NONAME
+ _ZNK12QCommonStyle19generatedIconPixmapEN5QIcon4ModeERK7QPixmapPK12QStyleOption @ 8076 NONAME
+ _ZNK12QCommonStyle21hitTestComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexRK6QPointPK7QWidget @ 8077 NONAME
+ _ZNK12QCommonStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8078 NONAME
+ _ZNK12QCommonStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 8079 NONAME
+ _ZNK12QFontMetrics10elidedTextERK7QStringN2Qt13TextElideModeEii @ 8080 NONAME
+ _ZNK12QFontMetrics11leftBearingE5QChar @ 8081 NONAME
+ _ZNK12QFontMetrics11lineSpacingEv @ 8082 NONAME
+ _ZNK12QFontMetrics11overlinePosEv @ 8083 NONAME
+ _ZNK12QFontMetrics12boundingRectE5QChar @ 8084 NONAME
+ _ZNK12QFontMetrics12boundingRectERK5QRectiRK7QStringiPi @ 8085 NONAME
+ _ZNK12QFontMetrics12boundingRectERK7QString @ 8086 NONAME
+ _ZNK12QFontMetrics12rightBearingE5QChar @ 8087 NONAME
+ _ZNK12QFontMetrics12strikeOutPosEv @ 8088 NONAME
+ _ZNK12QFontMetrics12underlinePosEv @ 8089 NONAME
+ _ZNK12QFontMetrics14minLeftBearingEv @ 8090 NONAME
+ _ZNK12QFontMetrics15minRightBearingEv @ 8091 NONAME
+ _ZNK12QFontMetrics16averageCharWidthEv @ 8092 NONAME
+ _ZNK12QFontMetrics17tightBoundingRectERK7QString @ 8093 NONAME
+ _ZNK12QFontMetrics4sizeEiRK7QStringiPi @ 8094 NONAME
+ _ZNK12QFontMetrics5widthE5QChar @ 8095 NONAME
+ _ZNK12QFontMetrics5widthERK7QStringi @ 8096 NONAME
+ _ZNK12QFontMetrics6ascentEv @ 8097 NONAME
+ _ZNK12QFontMetrics6heightEv @ 8098 NONAME
+ _ZNK12QFontMetrics6inFontE5QChar @ 8099 NONAME
+ _ZNK12QFontMetrics7descentEv @ 8100 NONAME
+ _ZNK12QFontMetrics7leadingEv @ 8101 NONAME
+ _ZNK12QFontMetrics7xHeightEv @ 8102 NONAME
+ _ZNK12QFontMetrics8maxWidthEv @ 8103 NONAME
+ _ZNK12QFontMetrics9charWidthERK7QStringi @ 8104 NONAME
+ _ZNK12QFontMetrics9lineWidthEv @ 8105 NONAME
+ _ZNK12QFontMetricseqERKS_ @ 8106 NONAME
+ _ZNK12QFontPrivate15engineForScriptEi @ 8107 NONAME
+ _ZNK12QFontPrivate20smallCapsFontPrivateEv @ 8108 NONAME
+ _ZNK12QFontPrivate26alterCharForCapitalizationER5QChar @ 8109 NONAME
+ _ZNK12QImageReader10imageCountEv @ 8110 NONAME
+ _ZNK12QImageReader10scaledSizeEv @ 8111 NONAME
+ _ZNK12QImageReader11errorStringEv @ 8112 NONAME
+ _ZNK12QImageReader11imageFormatEv @ 8113 NONAME
+ _ZNK12QImageReader14nextImageDelayEv @ 8114 NONAME
+ _ZNK12QImageReader14scaledClipRectEv @ 8115 NONAME
+ _ZNK12QImageReader14supportsOptionEN15QImageIOHandler11ImageOptionE @ 8116 NONAME
+ _ZNK12QImageReader15backgroundColorEv @ 8117 NONAME
+ _ZNK12QImageReader16currentImageRectEv @ 8118 NONAME
+ _ZNK12QImageReader17supportsAnimationEv @ 8119 NONAME
+ _ZNK12QImageReader18currentImageNumberEv @ 8120 NONAME
+ _ZNK12QImageReader21autoDetectImageFormatEv @ 8121 NONAME
+ _ZNK12QImageReader23decideFormatFromContentEv @ 8122 NONAME
+ _ZNK12QImageReader4sizeEv @ 8123 NONAME
+ _ZNK12QImageReader4textERK7QString @ 8124 NONAME
+ _ZNK12QImageReader5errorEv @ 8125 NONAME
+ _ZNK12QImageReader6deviceEv @ 8126 NONAME
+ _ZNK12QImageReader6formatEv @ 8127 NONAME
+ _ZNK12QImageReader7canReadEv @ 8128 NONAME
+ _ZNK12QImageReader7qualityEv @ 8129 NONAME
+ _ZNK12QImageReader8clipRectEv @ 8130 NONAME
+ _ZNK12QImageReader8fileNameEv @ 8131 NONAME
+ _ZNK12QImageReader8textKeysEv @ 8132 NONAME
+ _ZNK12QImageReader9loopCountEv @ 8133 NONAME
+ _ZNK12QImageWriter11compressionEv @ 8134 NONAME
+ _ZNK12QImageWriter11descriptionEv @ 8135 NONAME
+ _ZNK12QImageWriter11errorStringEv @ 8136 NONAME
+ _ZNK12QImageWriter14supportsOptionEN15QImageIOHandler11ImageOptionE @ 8137 NONAME
+ _ZNK12QImageWriter5errorEv @ 8138 NONAME
+ _ZNK12QImageWriter5gammaEv @ 8139 NONAME
+ _ZNK12QImageWriter6deviceEv @ 8140 NONAME
+ _ZNK12QImageWriter6formatEv @ 8141 NONAME
+ _ZNK12QImageWriter7qualityEv @ 8142 NONAME
+ _ZNK12QImageWriter8canWriteEv @ 8143 NONAME
+ _ZNK12QImageWriter8fileNameEv @ 8144 NONAME
+ _ZNK12QInputDialog10intMaximumEv @ 8145 NONAME
+ _ZNK12QInputDialog10intMinimumEv @ 8146 NONAME
+ _ZNK12QInputDialog10metaObjectEv @ 8147 NONAME
+ _ZNK12QInputDialog10testOptionENS_17InputDialogOptionE @ 8148 NONAME
+ _ZNK12QInputDialog11doubleValueEv @ 8149 NONAME
+ _ZNK12QInputDialog12okButtonTextEv @ 8150 NONAME
+ _ZNK12QInputDialog12textEchoModeEv @ 8151 NONAME
+ _ZNK12QInputDialog13comboBoxItemsEv @ 8152 NONAME
+ _ZNK12QInputDialog13doubleMaximumEv @ 8153 NONAME
+ _ZNK12QInputDialog13doubleMinimumEv @ 8154 NONAME
+ _ZNK12QInputDialog14doubleDecimalsEv @ 8155 NONAME
+ _ZNK12QInputDialog15minimumSizeHintEv @ 8156 NONAME
+ _ZNK12QInputDialog16cancelButtonTextEv @ 8157 NONAME
+ _ZNK12QInputDialog18isComboBoxEditableEv @ 8158 NONAME
+ _ZNK12QInputDialog7intStepEv @ 8159 NONAME
+ _ZNK12QInputDialog7optionsEv @ 8160 NONAME
+ _ZNK12QInputDialog8intValueEv @ 8161 NONAME
+ _ZNK12QInputDialog8sizeHintEv @ 8162 NONAME
+ _ZNK12QInputDialog9inputModeEv @ 8163 NONAME
+ _ZNK12QInputDialog9labelTextEv @ 8164 NONAME
+ _ZNK12QInputDialog9textValueEv @ 8165 NONAME
+ _ZNK12QKeySequence10isDetachedEv @ 8166 NONAME
+ _ZNK12QKeySequence5countEv @ 8167 NONAME
+ _ZNK12QKeySequence7isEmptyEv @ 8168 NONAME
+ _ZNK12QKeySequence7matchesERKS_ @ 8169 NONAME
+ _ZNK12QKeySequence8toStringENS_14SequenceFormatE @ 8170 NONAME
+ _ZNK12QKeySequencecv7QStringEv @ 8171 NONAME
+ _ZNK12QKeySequencecv8QVariantEv @ 8172 NONAME
+ _ZNK12QKeySequencecviEv @ 8173 NONAME
+ _ZNK12QKeySequenceeqERKS_ @ 8174 NONAME
+ _ZNK12QKeySequenceixEj @ 8175 NONAME
+ _ZNK12QKeySequenceltERKS_ @ 8176 NONAME
+ _ZNK12QLineControl10cursorRectEv @ 8177 NONAME
+ _ZNK12QLineControl10findInMaskEibb5QChar @ 8178 NONAME
+ _ZNK12QLineControl10maskStringEjRK7QStringb @ 8179 NONAME
+ _ZNK12QLineControl10metaObjectEv @ 8180 NONAME
+ _ZNK12QLineControl11clearStringEjj @ 8181 NONAME
+ _ZNK12QLineControl11stripStringERK7QString @ 8182 NONAME
+ _ZNK12QLineControl12isValidInputE5QCharS0_ @ 8183 NONAME
+ _ZNK12QLineControl18hasAcceptableInputERK7QString @ 8184 NONAME
+ _ZNK12QLineControl4copyEN10QClipboard4ModeE @ 8185 NONAME
+ _ZNK12QLineControl6xToPosEiN9QTextLine14CursorPositionE @ 8186 NONAME
+ _ZNK12QPaintBuffer11paintEngineEv @ 8187 NONAME
+ _ZNK12QPaintBuffer12boundingRectEv @ 8188 NONAME
+ _ZNK12QPaintBuffer4drawEP8QPainteri @ 8189 NONAME
+ _ZNK12QPaintBuffer6metricEN12QPaintDevice17PaintDeviceMetricE @ 8190 NONAME
+ _ZNK12QPaintBuffer7devTypeEv @ 8191 NONAME
+ _ZNK12QPaintBuffer7isEmptyEv @ 8192 NONAME
+ _ZNK12QPaintBuffer9numFramesEv @ 8193 NONAME
+ _ZNK12QPaintDevice6metricENS_17PaintDeviceMetricE @ 8194 NONAME
+ _ZNK12QPaintEngine10systemClipEv @ 8195 NONAME
+ _ZNK12QPaintEngine10systemRectEv @ 8196 NONAME
+ _ZNK12QPaintEngine11paintDeviceEv @ 8197 NONAME
+ _ZNK12QPaintEngine16coordinateOffsetEv @ 8198 NONAME
+ _ZNK12QPaintEngine7painterEv @ 8199 NONAME
+ _ZNK12QPainterPath10intersectsERK6QRectF @ 8200 NONAME
+ _ZNK12QPainterPath10intersectsERKS_ @ 8201 NONAME
+ _ZNK12QPainterPath10simplifiedEv @ 8202 NONAME
+ _ZNK12QPainterPath10subtractedERKS_ @ 8203 NONAME
+ _ZNK12QPainterPath10toReversedEv @ 8204 NONAME
+ _ZNK12QPainterPath10translatedEff @ 8205 NONAME
+ _ZNK12QPainterPath11intersectedERKS_ @ 8206 NONAME
+ _ZNK12QPainterPath12boundingRectEv @ 8207 NONAME
+ _ZNK12QPainterPath13toFillPolygonERK10QTransform @ 8208 NONAME
+ _ZNK12QPainterPath13toFillPolygonERK7QMatrix @ 8209 NONAME
+ _ZNK12QPainterPath14angleAtPercentEf @ 8210 NONAME
+ _ZNK12QPainterPath14pointAtPercentEf @ 8211 NONAME
+ _ZNK12QPainterPath14slopeAtPercentEf @ 8212 NONAME
+ _ZNK12QPainterPath14toFillPolygonsERK10QTransform @ 8213 NONAME
+ _ZNK12QPainterPath14toFillPolygonsERK7QMatrix @ 8214 NONAME
+ _ZNK12QPainterPath15currentPositionEv @ 8215 NONAME
+ _ZNK12QPainterPath15percentAtLengthEf @ 8216 NONAME
+ _ZNK12QPainterPath16controlPointRectEv @ 8217 NONAME
+ _ZNK12QPainterPath17toSubpathPolygonsERK10QTransform @ 8218 NONAME
+ _ZNK12QPainterPath17toSubpathPolygonsERK7QMatrix @ 8219 NONAME
+ _ZNK12QPainterPath18subtractedInvertedERKS_ @ 8220 NONAME
+ _ZNK12QPainterPath19computeBoundingRectEv @ 8221 NONAME
+ _ZNK12QPainterPath23computeControlPointRectEv @ 8222 NONAME
+ _ZNK12QPainterPath6lengthEv @ 8223 NONAME
+ _ZNK12QPainterPath6unitedERKS_ @ 8224 NONAME
+ _ZNK12QPainterPath8containsERK6QRectF @ 8225 NONAME
+ _ZNK12QPainterPath8containsERK7QPointF @ 8226 NONAME
+ _ZNK12QPainterPath8containsERKS_ @ 8227 NONAME
+ _ZNK12QPainterPath8fillRuleEv @ 8228 NONAME
+ _ZNK12QPainterPathanERKS_ @ 8229 NONAME
+ _ZNK12QPainterPatheqERKS_ @ 8230 NONAME
+ _ZNK12QPainterPathmiERKS_ @ 8231 NONAME
+ _ZNK12QPainterPathneERKS_ @ 8232 NONAME
+ _ZNK12QPainterPathorERKS_ @ 8233 NONAME
+ _ZNK12QPainterPathplERKS_ @ 8234 NONAME
+ _ZNK12QPixmapCache3KeyeqERKS0_ @ 8235 NONAME
+ _ZNK12QProgressBar10metaObjectEv @ 8236 NONAME
+ _ZNK12QProgressBar11orientationEv @ 8237 NONAME
+ _ZNK12QProgressBar13isTextVisibleEv @ 8238 NONAME
+ _ZNK12QProgressBar15initStyleOptionEP23QStyleOptionProgressBar @ 8239 NONAME
+ _ZNK12QProgressBar15minimumSizeHintEv @ 8240 NONAME
+ _ZNK12QProgressBar4textEv @ 8241 NONAME
+ _ZNK12QProgressBar5valueEv @ 8242 NONAME
+ _ZNK12QProgressBar6formatEv @ 8243 NONAME
+ _ZNK12QProgressBar7maximumEv @ 8244 NONAME
+ _ZNK12QProgressBar7minimumEv @ 8245 NONAME
+ _ZNK12QProgressBar8sizeHintEv @ 8246 NONAME
+ _ZNK12QProgressBar9alignmentEv @ 8247 NONAME
+ _ZNK12QRadioButton10metaObjectEv @ 8248 NONAME
+ _ZNK12QRadioButton15initStyleOptionEP18QStyleOptionButton @ 8249 NONAME
+ _ZNK12QRadioButton8sizeHintEv @ 8250 NONAME
+ _ZNK12QRadioButton9hitButtonERK6QPoint @ 8251 NONAME
+ _ZNK12QStylePlugin10metaObjectEv @ 8252 NONAME
+ _ZNK12QTableWidget10cellWidgetEii @ 8253 NONAME
+ _ZNK12QTableWidget10currentRowEv @ 8254 NONAME
+ _ZNK12QTableWidget10metaObjectEv @ 8255 NONAME
+ _ZNK12QTableWidget11columnCountEv @ 8256 NONAME
+ _ZNK12QTableWidget11currentItemEv @ 8257 NONAME
+ _ZNK12QTableWidget12visualColumnEi @ 8258 NONAME
+ _ZNK12QTableWidget13currentColumnEv @ 8259 NONAME
+ _ZNK12QTableWidget13indexFromItemEP16QTableWidgetItem @ 8260 NONAME
+ _ZNK12QTableWidget13itemFromIndexERK11QModelIndex @ 8261 NONAME
+ _ZNK12QTableWidget13itemPrototypeEv @ 8262 NONAME
+ _ZNK12QTableWidget14isItemSelectedEPK16QTableWidgetItem @ 8263 NONAME
+ _ZNK12QTableWidget14selectedRangesEv @ 8264 NONAME
+ _ZNK12QTableWidget14visualItemRectEPK16QTableWidgetItem @ 8265 NONAME
+ _ZNK12QTableWidget16isSortingEnabledEv @ 8266 NONAME
+ _ZNK12QTableWidget18verticalHeaderItemEi @ 8267 NONAME
+ _ZNK12QTableWidget20horizontalHeaderItemEi @ 8268 NONAME
+ _ZNK12QTableWidget20supportedDropActionsEv @ 8269 NONAME
+ _ZNK12QTableWidget3rowEPK16QTableWidgetItem @ 8270 NONAME
+ _ZNK12QTableWidget4itemEii @ 8271 NONAME
+ _ZNK12QTableWidget5itemsEPK9QMimeData @ 8272 NONAME
+ _ZNK12QTableWidget6columnEPK16QTableWidgetItem @ 8273 NONAME
+ _ZNK12QTableWidget6itemAtERK6QPoint @ 8274 NONAME
+ _ZNK12QTableWidget8mimeDataE5QListIP16QTableWidgetItemE @ 8275 NONAME
+ _ZNK12QTableWidget8rowCountEv @ 8276 NONAME
+ _ZNK12QTableWidget9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEE @ 8277 NONAME
+ _ZNK12QTableWidget9mimeTypesEv @ 8278 NONAME
+ _ZNK12QTableWidget9visualRowEi @ 8279 NONAME
+ _ZNK12QTextBrowser10historyUrlEi @ 8280 NONAME
+ _ZNK12QTextBrowser10metaObjectEv @ 8281 NONAME
+ _ZNK12QTextBrowser11searchPathsEv @ 8282 NONAME
+ _ZNK12QTextBrowser12historyTitleEi @ 8283 NONAME
+ _ZNK12QTextBrowser17openExternalLinksEv @ 8284 NONAME
+ _ZNK12QTextBrowser18isForwardAvailableEv @ 8285 NONAME
+ _ZNK12QTextBrowser19forwardHistoryCountEv @ 8286 NONAME
+ _ZNK12QTextBrowser19isBackwardAvailableEv @ 8287 NONAME
+ _ZNK12QTextBrowser20backwardHistoryCountEv @ 8288 NONAME
+ _ZNK12QTextBrowser6sourceEv @ 8289 NONAME
+ _ZNK12QTextBrowser9openLinksEv @ 8290 NONAME
+ _ZNK12QTextControl10cursorRectERK11QTextCursor @ 8291 NONAME
+ _ZNK12QTextControl10cursorRectEv @ 8292 NONAME
+ _ZNK12QTextControl10metaObjectEv @ 8293 NONAME
+ _ZNK12QTextControl10textCursorEv @ 8294 NONAME
+ _ZNK12QTextControl11cursorWidthEv @ 8295 NONAME
+ _ZNK12QTextControl13overwriteModeEv @ 8296 NONAME
+ _ZNK12QTextControl13selectionRectERK11QTextCursor @ 8297 NONAME
+ _ZNK12QTextControl13selectionRectEv @ 8298 NONAME
+ _ZNK12QTextControl14acceptRichTextEv @ 8299 NONAME
+ _ZNK12QTextControl14anchorAtCursorEv @ 8300 NONAME
+ _ZNK12QTextControl14anchorPositionERK7QString @ 8301 NONAME
+ _ZNK12QTextControl15extraSelectionsEv @ 8302 NONAME
+ _ZNK12QTextControl15getPaintContextEP7QWidget @ 8303 NONAME
+ _ZNK12QTextControl16inputMethodQueryEN2Qt16InputMethodQueryE @ 8304 NONAME
+ _ZNK12QTextControl17blockBoundingRectERK10QTextBlock @ 8305 NONAME
+ _ZNK12QTextControl17currentCharFormatEv @ 8306 NONAME
+ _ZNK12QTextControl17cursorForPositionERK7QPointF @ 8307 NONAME
+ _ZNK12QTextControl17openExternalLinksEv @ 8308 NONAME
+ _ZNK12QTextControl20textInteractionFlagsEv @ 8309 NONAME
+ _ZNK12QTextControl21canInsertFromMimeDataEPK9QMimeData @ 8310 NONAME
+ _ZNK12QTextControl22cursorIsFocusIndicatorEv @ 8311 NONAME
+ _ZNK12QTextControl27createMimeDataFromSelectionEv @ 8312 NONAME
+ _ZNK12QTextControl4sizeEv @ 8313 NONAME
+ _ZNK12QTextControl7hitTestERK7QPointFN2Qt15HitTestAccuracyE @ 8314 NONAME
+ _ZNK12QTextControl7paletteEv @ 8315 NONAME
+ _ZNK12QTextControl8anchorAtERK7QPointF @ 8316 NONAME
+ _ZNK12QTextControl8canPasteEv @ 8317 NONAME
+ _ZNK12QTextControl8documentEv @ 8318 NONAME
+ _ZNK12QTextControl9textWidthEv @ 8319 NONAME
+ _ZNK12QUndoCommand10childCountEv @ 8320 NONAME
+ _ZNK12QUndoCommand2idEv @ 8321 NONAME
+ _ZNK12QUndoCommand4textEv @ 8322 NONAME
+ _ZNK12QUndoCommand5childEi @ 8323 NONAME
+ _ZNK13QDateTimeEdit10metaObjectEv @ 8324 NONAME
+ _ZNK13QDateTimeEdit11maximumDateEv @ 8325 NONAME
+ _ZNK13QDateTimeEdit11maximumTimeEv @ 8326 NONAME
+ _ZNK13QDateTimeEdit11minimumDateEv @ 8327 NONAME
+ _ZNK13QDateTimeEdit11minimumTimeEv @ 8328 NONAME
+ _ZNK13QDateTimeEdit11sectionTextENS_7SectionE @ 8329 NONAME
+ _ZNK13QDateTimeEdit11stepEnabledEv @ 8330 NONAME
+ _ZNK13QDateTimeEdit12sectionCountEv @ 8331 NONAME
+ _ZNK13QDateTimeEdit13calendarPopupEv @ 8332 NONAME
+ _ZNK13QDateTimeEdit13displayFormatEv @ 8333 NONAME
+ _ZNK13QDateTimeEdit14calendarWidgetEv @ 8334 NONAME
+ _ZNK13QDateTimeEdit14currentSectionEv @ 8335 NONAME
+ _ZNK13QDateTimeEdit15initStyleOptionEP19QStyleOptionSpinBox @ 8336 NONAME
+ _ZNK13QDateTimeEdit15maximumDateTimeEv @ 8337 NONAME
+ _ZNK13QDateTimeEdit15minimumDateTimeEv @ 8338 NONAME
+ _ZNK13QDateTimeEdit16dateTimeFromTextERK7QString @ 8339 NONAME
+ _ZNK13QDateTimeEdit16textFromDateTimeERK9QDateTime @ 8340 NONAME
+ _ZNK13QDateTimeEdit17displayedSectionsEv @ 8341 NONAME
+ _ZNK13QDateTimeEdit19currentSectionIndexEv @ 8342 NONAME
+ _ZNK13QDateTimeEdit4dateEv @ 8343 NONAME
+ _ZNK13QDateTimeEdit4timeEv @ 8344 NONAME
+ _ZNK13QDateTimeEdit5fixupER7QString @ 8345 NONAME
+ _ZNK13QDateTimeEdit8dateTimeEv @ 8346 NONAME
+ _ZNK13QDateTimeEdit8sizeHintEv @ 8347 NONAME
+ _ZNK13QDateTimeEdit8timeSpecEv @ 8348 NONAME
+ _ZNK13QDateTimeEdit8validateER7QStringRi @ 8349 NONAME
+ _ZNK13QDateTimeEdit9sectionAtEi @ 8350 NONAME
+ _ZNK13QErrorMessage10metaObjectEv @ 8351 NONAME
+ _ZNK13QFontComboBox10metaObjectEv @ 8352 NONAME
+ _ZNK13QFontComboBox11currentFontEv @ 8353 NONAME
+ _ZNK13QFontComboBox11fontFiltersEv @ 8354 NONAME
+ _ZNK13QFontComboBox13writingSystemEv @ 8355 NONAME
+ _ZNK13QFontComboBox8sizeHintEv @ 8356 NONAME
+ _ZNK13QFontDatabase10isScalableERK7QStringS2_ @ 8357 NONAME
+ _ZNK13QFontDatabase12isFixedPitchERK7QStringS2_ @ 8358 NONAME
+ _ZNK13QFontDatabase14writingSystemsERK7QString @ 8359 NONAME
+ _ZNK13QFontDatabase14writingSystemsEv @ 8360 NONAME
+ _ZNK13QFontDatabase16isBitmapScalableERK7QStringS2_ @ 8361 NONAME
+ _ZNK13QFontDatabase18isSmoothlyScalableERK7QStringS2_ @ 8362 NONAME
+ _ZNK13QFontDatabase4boldERK7QStringS2_ @ 8363 NONAME
+ _ZNK13QFontDatabase4fontERK7QStringS2_i @ 8364 NONAME
+ _ZNK13QFontDatabase6italicERK7QStringS2_ @ 8365 NONAME
+ _ZNK13QFontDatabase6stylesERK7QString @ 8366 NONAME
+ _ZNK13QFontDatabase6weightERK7QStringS2_ @ 8367 NONAME
+ _ZNK13QFontDatabase8familiesENS_13WritingSystemE @ 8368 NONAME
+ _ZNK13QFontMetricsF10elidedTextERK7QStringN2Qt13TextElideModeEfi @ 8369 NONAME
+ _ZNK13QFontMetricsF11leftBearingE5QChar @ 8370 NONAME
+ _ZNK13QFontMetricsF11lineSpacingEv @ 8371 NONAME
+ _ZNK13QFontMetricsF11overlinePosEv @ 8372 NONAME
+ _ZNK13QFontMetricsF12boundingRectE5QChar @ 8373 NONAME
+ _ZNK13QFontMetricsF12boundingRectERK6QRectFiRK7QStringiPi @ 8374 NONAME
+ _ZNK13QFontMetricsF12boundingRectERK7QString @ 8375 NONAME
+ _ZNK13QFontMetricsF12rightBearingE5QChar @ 8376 NONAME
+ _ZNK13QFontMetricsF12strikeOutPosEv @ 8377 NONAME
+ _ZNK13QFontMetricsF12underlinePosEv @ 8378 NONAME
+ _ZNK13QFontMetricsF14minLeftBearingEv @ 8379 NONAME
+ _ZNK13QFontMetricsF15minRightBearingEv @ 8380 NONAME
+ _ZNK13QFontMetricsF16averageCharWidthEv @ 8381 NONAME
+ _ZNK13QFontMetricsF17tightBoundingRectERK7QString @ 8382 NONAME
+ _ZNK13QFontMetricsF4sizeEiRK7QStringiPi @ 8383 NONAME
+ _ZNK13QFontMetricsF5widthE5QChar @ 8384 NONAME
+ _ZNK13QFontMetricsF5widthERK7QString @ 8385 NONAME
+ _ZNK13QFontMetricsF6ascentEv @ 8386 NONAME
+ _ZNK13QFontMetricsF6heightEv @ 8387 NONAME
+ _ZNK13QFontMetricsF6inFontE5QChar @ 8388 NONAME
+ _ZNK13QFontMetricsF7descentEv @ 8389 NONAME
+ _ZNK13QFontMetricsF7leadingEv @ 8390 NONAME
+ _ZNK13QFontMetricsF7xHeightEv @ 8391 NONAME
+ _ZNK13QFontMetricsF8maxWidthEv @ 8392 NONAME
+ _ZNK13QFontMetricsF9lineWidthEv @ 8393 NONAME
+ _ZNK13QFontMetricsFeqERKS_ @ 8394 NONAME
+ _ZNK13QGestureEvent10isAcceptedEP8QGesture @ 8395 NONAME
+ _ZNK13QGestureEvent11allGesturesEv @ 8396 NONAME
+ _ZNK13QGestureEvent14activeGesturesEv @ 8397 NONAME
+ _ZNK13QGestureEvent16canceledGesturesEv @ 8398 NONAME
+ _ZNK13QGraphicsItem10childItemsEv @ 8399 NONAME
+ _ZNK13QGraphicsItem10focusProxyEv @ 8400 NONAME
+ _ZNK13QGraphicsItem10isObscuredERK6QRectF @ 8401 NONAME
+ _ZNK13QGraphicsItem10isObscuredEv @ 8402 NONAME
+ _ZNK13QGraphicsItem10isSelectedEv @ 8403 NONAME
+ _ZNK13QGraphicsItem10mapToSceneERK12QPainterPath @ 8404 NONAME
+ _ZNK13QGraphicsItem10mapToSceneERK6QRectF @ 8405 NONAME
+ _ZNK13QGraphicsItem10mapToSceneERK7QPointF @ 8406 NONAME
+ _ZNK13QGraphicsItem10mapToSceneERK9QPolygonF @ 8407 NONAME
+ _ZNK13QGraphicsItem10opaqueAreaEv @ 8408 NONAME
+ _ZNK13QGraphicsItem10parentItemEv @ 8409 NONAME
+ _ZNK13QGraphicsItem11acceptDropsEv @ 8410 NONAME
+ _ZNK13QGraphicsItem11isVisibleToEPKS_ @ 8411 NONAME
+ _ZNK13QGraphicsItem11mapFromItemEPKS_RK12QPainterPath @ 8412 NONAME
+ _ZNK13QGraphicsItem11mapFromItemEPKS_RK6QRectF @ 8413 NONAME
+ _ZNK13QGraphicsItem11mapFromItemEPKS_RK7QPointF @ 8414 NONAME
+ _ZNK13QGraphicsItem11mapFromItemEPKS_RK9QPolygonF @ 8415 NONAME
+ _ZNK13QGraphicsItem11mapToParentERK12QPainterPath @ 8416 NONAME
+ _ZNK13QGraphicsItem11mapToParentERK6QRectF @ 8417 NONAME
+ _ZNK13QGraphicsItem11mapToParentERK7QPointF @ 8418 NONAME
+ _ZNK13QGraphicsItem11mapToParentERK9QPolygonF @ 8419 NONAME
+ _ZNK13QGraphicsItem11sceneMatrixEv @ 8420 NONAME
+ _ZNK13QGraphicsItem12isAncestorOfEPKS_ @ 8421 NONAME
+ _ZNK13QGraphicsItem12isObscuredByEPKS_ @ 8422 NONAME
+ _ZNK13QGraphicsItem12isUnderMouseEv @ 8423 NONAME
+ _ZNK13QGraphicsItem12mapFromSceneERK12QPainterPath @ 8424 NONAME
+ _ZNK13QGraphicsItem12mapFromSceneERK6QRectF @ 8425 NONAME
+ _ZNK13QGraphicsItem12mapFromSceneERK7QPointF @ 8426 NONAME
+ _ZNK13QGraphicsItem12mapFromSceneERK9QPolygonF @ 8427 NONAME
+ _ZNK13QGraphicsItem12parentObjectEv @ 8428 NONAME
+ _ZNK13QGraphicsItem12parentWidgetEv @ 8429 NONAME
+ _ZNK13QGraphicsItem12topLevelItemEv @ 8430 NONAME
+ _ZNK13QGraphicsItem13itemTransformEPKS_Pb @ 8431 NONAME
+ _ZNK13QGraphicsItem13mapFromParentERK12QPainterPath @ 8432 NONAME
+ _ZNK13QGraphicsItem13mapFromParentERK6QRectF @ 8433 NONAME
+ _ZNK13QGraphicsItem13mapFromParentERK7QPointF @ 8434 NONAME
+ _ZNK13QGraphicsItem13mapFromParentERK9QPolygonF @ 8435 NONAME
+ _ZNK13QGraphicsItem13mapRectToItemEPKS_RK6QRectF @ 8436 NONAME
+ _ZNK13QGraphicsItem13panelModalityEv @ 8437 NONAME
+ _ZNK13QGraphicsItem14boundingRegionERK10QTransform @ 8438 NONAME
+ _ZNK13QGraphicsItem14collidingItemsEN2Qt17ItemSelectionModeE @ 8439 NONAME
+ _ZNK13QGraphicsItem14focusScopeItemEv @ 8440 NONAME
+ _ZNK13QGraphicsItem14graphicsEffectEv @ 8441 NONAME
+ _ZNK13QGraphicsItem14mapRectToSceneERK6QRectF @ 8442 NONAME
+ _ZNK13QGraphicsItem14sceneTransformEv @ 8443 NONAME
+ _ZNK13QGraphicsItem14topLevelWidgetEv @ 8444 NONAME
+ _ZNK13QGraphicsItem15deviceTransformERK10QTransform @ 8445 NONAME
+ _ZNK13QGraphicsItem15mapRectFromItemEPKS_RK6QRectF @ 8446 NONAME
+ _ZNK13QGraphicsItem15mapRectToParentERK6QRectF @ 8447 NONAME
+ _ZNK13QGraphicsItem15transformationsEv @ 8448 NONAME
+ _ZNK13QGraphicsItem16collidesWithItemEPKS_N2Qt17ItemSelectionModeE @ 8449 NONAME
+ _ZNK13QGraphicsItem16collidesWithPathERK12QPainterPathN2Qt17ItemSelectionModeE @ 8450 NONAME
+ _ZNK13QGraphicsItem16effectiveOpacityEv @ 8451 NONAME
+ _ZNK13QGraphicsItem16inputMethodHintsEv @ 8452 NONAME
+ _ZNK13QGraphicsItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 8453 NONAME
+ _ZNK13QGraphicsItem16mapRectFromSceneERK6QRectF @ 8454 NONAME
+ _ZNK13QGraphicsItem16toGraphicsObjectEv @ 8455 NONAME
+ _ZNK13QGraphicsItem17acceptHoverEventsEv @ 8456 NONAME
+ _ZNK13QGraphicsItem17acceptTouchEventsEv @ 8457 NONAME
+ _ZNK13QGraphicsItem17mapRectFromParentERK6QRectF @ 8458 NONAME
+ _ZNK13QGraphicsItem17sceneBoundingRectEv @ 8459 NONAME
+ _ZNK13QGraphicsItem17supportsExtensionENS_9ExtensionE @ 8460 NONAME
+ _ZNK13QGraphicsItem18acceptsHoverEventsEv @ 8461 NONAME
+ _ZNK13QGraphicsItem18commonAncestorItemEPKS_ @ 8462 NONAME
+ _ZNK13QGraphicsItem18filtersChildEventsEv @ 8463 NONAME
+ _ZNK13QGraphicsItem18handlesChildEventsEv @ 8464 NONAME
+ _ZNK13QGraphicsItem20acceptedMouseButtonsEv @ 8465 NONAME
+ _ZNK13QGraphicsItem20childrenBoundingRectEv @ 8466 NONAME
+ _ZNK13QGraphicsItem20transformOriginPointEv @ 8467 NONAME
+ _ZNK13QGraphicsItem21isBlockedByModalPanelEPPS_ @ 8468 NONAME
+ _ZNK13QGraphicsItem25boundingRegionGranularityEv @ 8469 NONAME
+ _ZNK13QGraphicsItem3posEv @ 8470 NONAME
+ _ZNK13QGraphicsItem4dataEi @ 8471 NONAME
+ _ZNK13QGraphicsItem4typeEv @ 8472 NONAME
+ _ZNK13QGraphicsItem5flagsEv @ 8473 NONAME
+ _ZNK13QGraphicsItem5groupEv @ 8474 NONAME
+ _ZNK13QGraphicsItem5panelEv @ 8475 NONAME
+ _ZNK13QGraphicsItem5scaleEv @ 8476 NONAME
+ _ZNK13QGraphicsItem5sceneEv @ 8477 NONAME
+ _ZNK13QGraphicsItem5shapeEv @ 8478 NONAME
+ _ZNK13QGraphicsItem6cursorEv @ 8479 NONAME
+ _ZNK13QGraphicsItem6matrixEv @ 8480 NONAME
+ _ZNK13QGraphicsItem6windowEv @ 8481 NONAME
+ _ZNK13QGraphicsItem6zValueEv @ 8482 NONAME
+ _ZNK13QGraphicsItem7isPanelEv @ 8483 NONAME
+ _ZNK13QGraphicsItem7opacityEv @ 8484 NONAME
+ _ZNK13QGraphicsItem7toolTipEv @ 8485 NONAME
+ _ZNK13QGraphicsItem8childrenEv @ 8486 NONAME
+ _ZNK13QGraphicsItem8clipPathEv @ 8487 NONAME
+ _ZNK13QGraphicsItem8containsERK7QPointF @ 8488 NONAME
+ _ZNK13QGraphicsItem8hasFocusEv @ 8489 NONAME
+ _ZNK13QGraphicsItem8isActiveEv @ 8490 NONAME
+ _ZNK13QGraphicsItem8isWidgetEv @ 8491 NONAME
+ _ZNK13QGraphicsItem8isWindowEv @ 8492 NONAME
+ _ZNK13QGraphicsItem8rotationEv @ 8493 NONAME
+ _ZNK13QGraphicsItem8scenePosEv @ 8494 NONAME
+ _ZNK13QGraphicsItem9cacheModeEv @ 8495 NONAME
+ _ZNK13QGraphicsItem9extensionERK8QVariant @ 8496 NONAME
+ _ZNK13QGraphicsItem9focusItemEv @ 8497 NONAME
+ _ZNK13QGraphicsItem9hasCursorEv @ 8498 NONAME
+ _ZNK13QGraphicsItem9isClippedEv @ 8499 NONAME
+ _ZNK13QGraphicsItem9isEnabledEv @ 8500 NONAME
+ _ZNK13QGraphicsItem9isVisibleEv @ 8501 NONAME
+ _ZNK13QGraphicsItem9mapToItemEPKS_RK12QPainterPath @ 8502 NONAME
+ _ZNK13QGraphicsItem9mapToItemEPKS_RK6QRectF @ 8503 NONAME
+ _ZNK13QGraphicsItem9mapToItemEPKS_RK7QPointF @ 8504 NONAME
+ _ZNK13QGraphicsItem9mapToItemEPKS_RK9QPolygonF @ 8505 NONAME
+ _ZNK13QGraphicsItem9transformEv @ 8506 NONAME
+ _ZNK13QGraphicsView10mapToSceneERK12QPainterPath @ 8507 NONAME
+ _ZNK13QGraphicsView10mapToSceneERK5QRect @ 8508 NONAME
+ _ZNK13QGraphicsView10mapToSceneERK6QPoint @ 8509 NONAME
+ _ZNK13QGraphicsView10mapToSceneERK8QPolygon @ 8510 NONAME
+ _ZNK13QGraphicsView10metaObjectEv @ 8511 NONAME
+ _ZNK13QGraphicsView11renderHintsEv @ 8512 NONAME
+ _ZNK13QGraphicsView12mapFromSceneERK12QPainterPath @ 8513 NONAME
+ _ZNK13QGraphicsView12mapFromSceneERK6QRectF @ 8514 NONAME
+ _ZNK13QGraphicsView12mapFromSceneERK7QPointF @ 8515 NONAME
+ _ZNK13QGraphicsView12mapFromSceneERK9QPolygonF @ 8516 NONAME
+ _ZNK13QGraphicsView12resizeAnchorEv @ 8517 NONAME
+ _ZNK13QGraphicsView13isInteractiveEv @ 8518 NONAME
+ _ZNK13QGraphicsView13isTransformedEv @ 8519 NONAME
+ _ZNK13QGraphicsView15backgroundBrushEv @ 8520 NONAME
+ _ZNK13QGraphicsView15foregroundBrushEv @ 8521 NONAME
+ _ZNK13QGraphicsView16inputMethodQueryEN2Qt16InputMethodQueryE @ 8522 NONAME
+ _ZNK13QGraphicsView17optimizationFlagsEv @ 8523 NONAME
+ _ZNK13QGraphicsView17viewportTransformEv @ 8524 NONAME
+ _ZNK13QGraphicsView18viewportUpdateModeEv @ 8525 NONAME
+ _ZNK13QGraphicsView20transformationAnchorEv @ 8526 NONAME
+ _ZNK13QGraphicsView23rubberBandSelectionModeEv @ 8527 NONAME
+ _ZNK13QGraphicsView5itemsERK12QPainterPathN2Qt17ItemSelectionModeE @ 8528 NONAME
+ _ZNK13QGraphicsView5itemsERK5QRectN2Qt17ItemSelectionModeE @ 8529 NONAME
+ _ZNK13QGraphicsView5itemsERK6QPoint @ 8530 NONAME
+ _ZNK13QGraphicsView5itemsERK8QPolygonN2Qt17ItemSelectionModeE @ 8531 NONAME
+ _ZNK13QGraphicsView5itemsEv @ 8532 NONAME
+ _ZNK13QGraphicsView5sceneEv @ 8533 NONAME
+ _ZNK13QGraphicsView6itemAtERK6QPoint @ 8534 NONAME
+ _ZNK13QGraphicsView6matrixEv @ 8535 NONAME
+ _ZNK13QGraphicsView8dragModeEv @ 8536 NONAME
+ _ZNK13QGraphicsView8sizeHintEv @ 8537 NONAME
+ _ZNK13QGraphicsView9alignmentEv @ 8538 NONAME
+ _ZNK13QGraphicsView9cacheModeEv @ 8539 NONAME
+ _ZNK13QGraphicsView9sceneRectEv @ 8540 NONAME
+ _ZNK13QGraphicsView9transformEv @ 8541 NONAME
+ _ZNK13QIconEngineV23keyEv @ 8542 NONAME
+ _ZNK13QIconEngineV25cloneEv @ 8543 NONAME
+ _ZNK13QIconEngineV25writeER11QDataStream @ 8544 NONAME
+ _ZNK13QInputContext10metaObjectEv @ 8545 NONAME
+ _ZNK13QInputContext11focusWidgetEv @ 8546 NONAME
+ _ZNK13QInputContext14standardFormatENS_14StandardFormatE @ 8547 NONAME
+ _ZNK13QInputContext4fontEv @ 8548 NONAME
+ _ZNK13QIntValidator10metaObjectEv @ 8549 NONAME
+ _ZNK13QIntValidator8validateER7QStringRi @ 8550 NONAME
+ _ZNK13QItemDelegate10decorationERK20QStyleOptionViewItemRK8QVariant @ 8551 NONAME
+ _ZNK13QItemDelegate10metaObjectEv @ 8552 NONAME
+ _ZNK13QItemDelegate10setOptionsERK11QModelIndexRK20QStyleOptionViewItem @ 8553 NONAME
+ _ZNK13QItemDelegate11drawDisplayEP8QPainterRK20QStyleOptionViewItemRK5QRectRK7QString @ 8554 NONAME
+ _ZNK13QItemDelegate11hasClippingEv @ 8555 NONAME
+ _ZNK13QItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 8556 NONAME
+ _ZNK13QItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 8557 NONAME
+ _ZNK13QItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 8558 NONAME
+ _ZNK13QItemDelegate13textRectangleEP8QPainterRK5QRectRK5QFontRK7QString @ 8559 NONAME
+ _ZNK13QItemDelegate14drawBackgroundEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 8560 NONAME
+ _ZNK13QItemDelegate14drawDecorationEP8QPainterRK20QStyleOptionViewItemRK5QRectRK7QPixmap @ 8561 NONAME
+ _ZNK13QItemDelegate17itemEditorFactoryEv @ 8562 NONAME
+ _ZNK13QItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 8563 NONAME
+ _ZNK13QItemDelegate4rectERK20QStyleOptionViewItemRK11QModelIndexi @ 8564 NONAME
+ _ZNK13QItemDelegate5checkERK20QStyleOptionViewItemRK5QRectRK8QVariant @ 8565 NONAME
+ _ZNK13QItemDelegate5paintEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 8566 NONAME
+ _ZNK13QItemDelegate8doLayoutERK20QStyleOptionViewItemP5QRectS4_S4_b @ 8567 NONAME
+ _ZNK13QItemDelegate8selectedERK7QPixmapRK8QPaletteb @ 8568 NONAME
+ _ZNK13QItemDelegate8sizeHintERK20QStyleOptionViewItemRK11QModelIndex @ 8569 NONAME
+ _ZNK13QItemDelegate9drawCheckEP8QPainterRK20QStyleOptionViewItemRK5QRectN2Qt10CheckStateE @ 8570 NONAME
+ _ZNK13QItemDelegate9drawFocusEP8QPainterRK20QStyleOptionViewItemRK5QRect @ 8571 NONAME
+ _ZNK13QMdiSubWindow10metaObjectEv @ 8572 NONAME
+ _ZNK13QMdiSubWindow10systemMenuEv @ 8573 NONAME
+ _ZNK13QMdiSubWindow10testOptionENS_15SubWindowOptionE @ 8574 NONAME
+ _ZNK13QMdiSubWindow15minimumSizeHintEv @ 8575 NONAME
+ _ZNK13QMdiSubWindow16keyboardPageStepEv @ 8576 NONAME
+ _ZNK13QMdiSubWindow18keyboardSingleStepEv @ 8577 NONAME
+ _ZNK13QMdiSubWindow22maximizedButtonsWidgetEv @ 8578 NONAME
+ _ZNK13QMdiSubWindow29maximizedSystemMenuIconWidgetEv @ 8579 NONAME
+ _ZNK13QMdiSubWindow6widgetEv @ 8580 NONAME
+ _ZNK13QMdiSubWindow7mdiAreaEv @ 8581 NONAME
+ _ZNK13QMdiSubWindow8isShadedEv @ 8582 NONAME
+ _ZNK13QMdiSubWindow8sizeHintEv @ 8583 NONAME
+ _ZNK13QPinchGesture10metaObjectEv @ 8584 NONAME
+ _ZNK13QPinchGesture11centerPointEv @ 8585 NONAME
+ _ZNK13QPinchGesture11scaleFactorEv @ 8586 NONAME
+ _ZNK13QPinchGesture11whatChangedEv @ 8587 NONAME
+ _ZNK13QPinchGesture13rotationAngleEv @ 8588 NONAME
+ _ZNK13QPinchGesture15lastCenterPointEv @ 8589 NONAME
+ _ZNK13QPinchGesture15lastScaleFactorEv @ 8590 NONAME
+ _ZNK13QPinchGesture16startCenterPointEv @ 8591 NONAME
+ _ZNK13QPinchGesture16totalScaleFactorEv @ 8592 NONAME
+ _ZNK13QPinchGesture17lastRotationAngleEv @ 8593 NONAME
+ _ZNK13QPinchGesture18totalRotationAngleEv @ 8594 NONAME
+ _ZNK13QPixmapFilter10metaObjectEv @ 8595 NONAME
+ _ZNK13QPixmapFilter15boundingRectForERK6QRectF @ 8596 NONAME
+ _ZNK13QPixmapFilter4typeEv @ 8597 NONAME
+ _ZNK13QSplashScreen10metaObjectEv @ 8598 NONAME
+ _ZNK13QSplashScreen6pixmapEv @ 8599 NONAME
+ _ZNK13QStandardItem11columnCountEv @ 8600 NONAME
+ _ZNK13QStandardItem11hasChildrenEv @ 8601 NONAME
+ _ZNK13QStandardItem3rowEv @ 8602 NONAME
+ _ZNK13QStandardItem4dataEi @ 8603 NONAME
+ _ZNK13QStandardItem4typeEv @ 8604 NONAME
+ _ZNK13QStandardItem5childEii @ 8605 NONAME
+ _ZNK13QStandardItem5cloneEv @ 8606 NONAME
+ _ZNK13QStandardItem5flagsEv @ 8607 NONAME
+ _ZNK13QStandardItem5indexEv @ 8608 NONAME
+ _ZNK13QStandardItem5modelEv @ 8609 NONAME
+ _ZNK13QStandardItem5writeER11QDataStream @ 8610 NONAME
+ _ZNK13QStandardItem6columnEv @ 8611 NONAME
+ _ZNK13QStandardItem6parentEv @ 8612 NONAME
+ _ZNK13QStandardItem8rowCountEv @ 8613 NONAME
+ _ZNK13QStandardItemltERKS_ @ 8614 NONAME
+ _ZNK13QSwipeGesture10metaObjectEv @ 8615 NONAME
+ _ZNK13QSwipeGesture10swipeAngleEv @ 8616 NONAME
+ _ZNK13QSwipeGesture17verticalDirectionEv @ 8617 NONAME
+ _ZNK13QSwipeGesture19horizontalDirectionEv @ 8618 NONAME
+ _ZNK13QTextDocument10allFormatsEv @ 8619 NONAME
+ _ZNK13QTextDocument10blockCountEv @ 8620 NONAME
+ _ZNK13QTextDocument10firstBlockEv @ 8621 NONAME
+ _ZNK13QTextDocument10idealWidthEv @ 8622 NONAME
+ _ZNK13QTextDocument10isModifiedEv @ 8623 NONAME
+ _ZNK13QTextDocument10metaObjectEv @ 8624 NONAME
+ _ZNK13QTextDocument11characterAtEi @ 8625 NONAME
+ _ZNK13QTextDocument11defaultFontEv @ 8626 NONAME
+ _ZNK13QTextDocument11indentWidthEv @ 8627 NONAME
+ _ZNK13QTextDocument11toPlainTextEv @ 8628 NONAME
+ _ZNK13QTextDocument14characterCountEv @ 8629 NONAME
+ _ZNK13QTextDocument14documentLayoutEv @ 8630 NONAME
+ _ZNK13QTextDocument14documentMarginEv @ 8631 NONAME
+ _ZNK13QTextDocument15isRedoAvailableEv @ 8632 NONAME
+ _ZNK13QTextDocument15isUndoAvailableEv @ 8633 NONAME
+ _ZNK13QTextDocument15metaInformationENS_15MetaInformationE @ 8634 NONAME
+ _ZNK13QTextDocument15objectForFormatERK11QTextFormat @ 8635 NONAME
+ _ZNK13QTextDocument16useDesignMetricsEv @ 8636 NONAME
+ _ZNK13QTextDocument17defaultStyleSheetEv @ 8637 NONAME
+ _ZNK13QTextDocument17defaultTextOptionEv @ 8638 NONAME
+ _ZNK13QTextDocument17findBlockByNumberEi @ 8639 NONAME
+ _ZNK13QTextDocument17isUndoRedoEnabledEv @ 8640 NONAME
+ _ZNK13QTextDocument17maximumBlockCountEv @ 8641 NONAME
+ _ZNK13QTextDocument21findBlockByLineNumberEi @ 8642 NONAME
+ _ZNK13QTextDocument3endEv @ 8643 NONAME
+ _ZNK13QTextDocument4findERK7QRegExpRK11QTextCursor6QFlagsINS_8FindFlagEE @ 8644 NONAME
+ _ZNK13QTextDocument4findERK7QRegExpi6QFlagsINS_8FindFlagEE @ 8645 NONAME
+ _ZNK13QTextDocument4findERK7QStringRK11QTextCursor6QFlagsINS_8FindFlagEE @ 8646 NONAME
+ _ZNK13QTextDocument4findERK7QStringi6QFlagsINS_8FindFlagEE @ 8647 NONAME
+ _ZNK13QTextDocument4sizeEv @ 8648 NONAME
+ _ZNK13QTextDocument5beginEv @ 8649 NONAME
+ _ZNK13QTextDocument5cloneEP7QObject @ 8650 NONAME
+ _ZNK13QTextDocument6objectEi @ 8651 NONAME
+ _ZNK13QTextDocument6toHtmlERK10QByteArray @ 8652 NONAME
+ _ZNK13QTextDocument7frameAtEi @ 8653 NONAME
+ _ZNK13QTextDocument7isEmptyEv @ 8654 NONAME
+ _ZNK13QTextDocument8pageSizeEv @ 8655 NONAME
+ _ZNK13QTextDocument8resourceEiRK4QUrl @ 8656 NONAME
+ _ZNK13QTextDocument8revisionEv @ 8657 NONAME
+ _ZNK13QTextDocument9docHandleEv @ 8658 NONAME
+ _ZNK13QTextDocument9findBlockEi @ 8659 NONAME
+ _ZNK13QTextDocument9lastBlockEv @ 8660 NONAME
+ _ZNK13QTextDocument9lineCountEv @ 8661 NONAME
+ _ZNK13QTextDocument9pageCountEv @ 8662 NONAME
+ _ZNK13QTextDocument9rootFrameEv @ 8663 NONAME
+ _ZNK13QTextDocument9textWidthEv @ 8664 NONAME
+ _ZNK13QTextFragment10charFormatEv @ 8665 NONAME
+ _ZNK13QTextFragment15charFormatIndexEv @ 8666 NONAME
+ _ZNK13QTextFragment4textEv @ 8667 NONAME
+ _ZNK13QTextFragment6lengthEv @ 8668 NONAME
+ _ZNK13QTextFragment8containsEi @ 8669 NONAME
+ _ZNK13QTextFragment8positionEv @ 8670 NONAME
+ _ZNK13QWidgetAction10metaObjectEv @ 8671 NONAME
+ _ZNK13QWidgetAction13defaultWidgetEv @ 8672 NONAME
+ _ZNK13QWidgetAction14createdWidgetsEv @ 8673 NONAME
+ _ZNK13QWidgetItemV211maximumSizeEv @ 8674 NONAME
+ _ZNK13QWidgetItemV211minimumSizeEv @ 8675 NONAME
+ _ZNK13QWidgetItemV214heightForWidthEi @ 8676 NONAME
+ _ZNK13QWidgetItemV222updateCacheIfNecessaryEv @ 8677 NONAME
+ _ZNK13QWidgetItemV28sizeHintEv @ 8678 NONAME
+ _ZNK13QWindowsStyle10metaObjectEv @ 8679 NONAME
+ _ZNK13QWindowsStyle11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8680 NONAME
+ _ZNK13QWindowsStyle11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 8681 NONAME
+ _ZNK13QWindowsStyle13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 8682 NONAME
+ _ZNK13QWindowsStyle14standardPixmapEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8683 NONAME
+ _ZNK13QWindowsStyle14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 8684 NONAME
+ _ZNK13QWindowsStyle16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 8685 NONAME
+ _ZNK13QWindowsStyle18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 8686 NONAME
+ _ZNK13QWindowsStyle26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 8687 NONAME
+ _ZNK13QWindowsStyle9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 8688 NONAME
+ _ZNK14QDesktopWidget10metaObjectEv @ 8689 NONAME
+ _ZNK14QDesktopWidget10numScreensEv @ 8690 NONAME
+ _ZNK14QDesktopWidget12screenNumberEPK7QWidget @ 8691 NONAME
+ _ZNK14QDesktopWidget12screenNumberERK6QPoint @ 8692 NONAME
+ _ZNK14QDesktopWidget13primaryScreenEv @ 8693 NONAME
+ _ZNK14QDesktopWidget14screenGeometryEi @ 8694 NONAME
+ _ZNK14QDesktopWidget16isVirtualDesktopEv @ 8695 NONAME
+ _ZNK14QDesktopWidget17availableGeometryEi @ 8696 NONAME
+ _ZNK14QDoubleSpinBox10metaObjectEv @ 8697 NONAME
+ _ZNK14QDoubleSpinBox10singleStepEv @ 8698 NONAME
+ _ZNK14QDoubleSpinBox13textFromValueEd @ 8699 NONAME
+ _ZNK14QDoubleSpinBox13valueFromTextERK7QString @ 8700 NONAME
+ _ZNK14QDoubleSpinBox5fixupER7QString @ 8701 NONAME
+ _ZNK14QDoubleSpinBox5valueEv @ 8702 NONAME
+ _ZNK14QDoubleSpinBox6prefixEv @ 8703 NONAME
+ _ZNK14QDoubleSpinBox6suffixEv @ 8704 NONAME
+ _ZNK14QDoubleSpinBox7maximumEv @ 8705 NONAME
+ _ZNK14QDoubleSpinBox7minimumEv @ 8706 NONAME
+ _ZNK14QDoubleSpinBox8decimalsEv @ 8707 NONAME
+ _ZNK14QDoubleSpinBox8validateER7QStringRi @ 8708 NONAME
+ _ZNK14QDoubleSpinBox9cleanTextEv @ 8709 NONAME
+ _ZNK14QGraphicsScale10metaObjectEv @ 8710 NONAME
+ _ZNK14QGraphicsScale6originEv @ 8711 NONAME
+ _ZNK14QGraphicsScale6xScaleEv @ 8712 NONAME
+ _ZNK14QGraphicsScale6yScaleEv @ 8713 NONAME
+ _ZNK14QGraphicsScale6zScaleEv @ 8714 NONAME
+ _ZNK14QGraphicsScale7applyToEP10QMatrix4x4 @ 8715 NONAME
+ _ZNK14QGraphicsScene10metaObjectEv @ 8716 NONAME
+ _ZNK14QGraphicsScene11activePanelEv @ 8717 NONAME
+ _ZNK14QGraphicsScene11stickyFocusEv @ 8718 NONAME
+ _ZNK14QGraphicsScene12activeWindowEv @ 8719 NONAME
+ _ZNK14QGraphicsScene12bspTreeDepthEv @ 8720 NONAME
+ _ZNK14QGraphicsScene13selectedItemsEv @ 8721 NONAME
+ _ZNK14QGraphicsScene13selectionAreaEv @ 8722 NONAME
+ _ZNK14QGraphicsScene14collidingItemsEPK13QGraphicsItemN2Qt17ItemSelectionModeE @ 8723 NONAME
+ _ZNK14QGraphicsScene15backgroundBrushEv @ 8724 NONAME
+ _ZNK14QGraphicsScene15foregroundBrushEv @ 8725 NONAME
+ _ZNK14QGraphicsScene15itemIndexMethodEv @ 8726 NONAME
+ _ZNK14QGraphicsScene16inputMethodQueryEN2Qt16InputMethodQueryE @ 8727 NONAME
+ _ZNK14QGraphicsScene16mouseGrabberItemEv @ 8728 NONAME
+ _ZNK14QGraphicsScene17itemsBoundingRectEv @ 8729 NONAME
+ _ZNK14QGraphicsScene18isSortCacheEnabledEv @ 8730 NONAME
+ _ZNK14QGraphicsScene4fontEv @ 8731 NONAME
+ _ZNK14QGraphicsScene5itemsEN2Qt9SortOrderE @ 8732 NONAME
+ _ZNK14QGraphicsScene5itemsERK12QPainterPathN2Qt17ItemSelectionModeE @ 8733 NONAME
+ _ZNK14QGraphicsScene5itemsERK12QPainterPathN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 8734 NONAME
+ _ZNK14QGraphicsScene5itemsERK6QRectFN2Qt17ItemSelectionModeE @ 8735 NONAME
+ _ZNK14QGraphicsScene5itemsERK6QRectFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 8736 NONAME
+ _ZNK14QGraphicsScene5itemsERK7QPointF @ 8737 NONAME
+ _ZNK14QGraphicsScene5itemsERK7QPointFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 8738 NONAME
+ _ZNK14QGraphicsScene5itemsERK9QPolygonFN2Qt17ItemSelectionModeE @ 8739 NONAME
+ _ZNK14QGraphicsScene5itemsERK9QPolygonFN2Qt17ItemSelectionModeENS3_9SortOrderERK10QTransform @ 8740 NONAME
+ _ZNK14QGraphicsScene5itemsEv @ 8741 NONAME
+ _ZNK14QGraphicsScene5styleEv @ 8742 NONAME
+ _ZNK14QGraphicsScene5viewsEv @ 8743 NONAME
+ _ZNK14QGraphicsScene6itemAtERK7QPointF @ 8744 NONAME
+ _ZNK14QGraphicsScene6itemAtERK7QPointFRK10QTransform @ 8745 NONAME
+ _ZNK14QGraphicsScene7paletteEv @ 8746 NONAME
+ _ZNK14QGraphicsScene8hasFocusEv @ 8747 NONAME
+ _ZNK14QGraphicsScene8isActiveEv @ 8748 NONAME
+ _ZNK14QGraphicsScene9focusItemEv @ 8749 NONAME
+ _ZNK14QGraphicsScene9sceneRectEv @ 8750 NONAME
+ _ZNK14QImageIOPlugin10metaObjectEv @ 8751 NONAME
+ _ZNK14QItemSelection7indexesEv @ 8752 NONAME
+ _ZNK14QItemSelection8containsERK11QModelIndex @ 8753 NONAME
+ _ZNK14QLayoutPrivate9getMarginEPiiN6QStyle11PixelMetricE @ 8754 NONAME
+ _ZNK14QPaintEngineEx11createStateEP13QPainterState @ 8755 NONAME
+ _ZNK14QPlainTextEdit10blockCountEv @ 8756 NONAME
+ _ZNK14QPlainTextEdit10cursorRectERK11QTextCursor @ 8757 NONAME
+ _ZNK14QPlainTextEdit10cursorRectEv @ 8758 NONAME
+ _ZNK14QPlainTextEdit10isReadOnlyEv @ 8759 NONAME
+ _ZNK14QPlainTextEdit10metaObjectEv @ 8760 NONAME
+ _ZNK14QPlainTextEdit10textCursorEv @ 8761 NONAME
+ _ZNK14QPlainTextEdit11cursorWidthEv @ 8762 NONAME
+ _ZNK14QPlainTextEdit12lineWrapModeEv @ 8763 NONAME
+ _ZNK14QPlainTextEdit12tabStopWidthEv @ 8764 NONAME
+ _ZNK14QPlainTextEdit12wordWrapModeEv @ 8765 NONAME
+ _ZNK14QPlainTextEdit13contentOffsetEv @ 8766 NONAME
+ _ZNK14QPlainTextEdit13overwriteModeEv @ 8767 NONAME
+ _ZNK14QPlainTextEdit14centerOnScrollEv @ 8768 NONAME
+ _ZNK14QPlainTextEdit15extraSelectionsEv @ 8769 NONAME
+ _ZNK14QPlainTextEdit15getPaintContextEv @ 8770 NONAME
+ _ZNK14QPlainTextEdit15tabChangesFocusEv @ 8771 NONAME
+ _ZNK14QPlainTextEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 8772 NONAME
+ _ZNK14QPlainTextEdit17backgroundVisibleEv @ 8773 NONAME
+ _ZNK14QPlainTextEdit17blockBoundingRectERK10QTextBlock @ 8774 NONAME
+ _ZNK14QPlainTextEdit17currentCharFormatEv @ 8775 NONAME
+ _ZNK14QPlainTextEdit17cursorForPositionERK6QPoint @ 8776 NONAME
+ _ZNK14QPlainTextEdit17firstVisibleBlockEv @ 8777 NONAME
+ _ZNK14QPlainTextEdit20textInteractionFlagsEv @ 8778 NONAME
+ _ZNK14QPlainTextEdit21blockBoundingGeometryERK10QTextBlock @ 8779 NONAME
+ _ZNK14QPlainTextEdit21canInsertFromMimeDataEPK9QMimeData @ 8780 NONAME
+ _ZNK14QPlainTextEdit27createMimeDataFromSelectionEv @ 8781 NONAME
+ _ZNK14QPlainTextEdit8canPasteEv @ 8782 NONAME
+ _ZNK14QPlainTextEdit8documentEv @ 8783 NONAME
+ _ZNK14QStackedLayout10metaObjectEv @ 8784 NONAME
+ _ZNK14QStackedLayout11minimumSizeEv @ 8785 NONAME
+ _ZNK14QStackedLayout12currentIndexEv @ 8786 NONAME
+ _ZNK14QStackedLayout12stackingModeEv @ 8787 NONAME
+ _ZNK14QStackedLayout13currentWidgetEv @ 8788 NONAME
+ _ZNK14QStackedLayout5countEv @ 8789 NONAME
+ _ZNK14QStackedLayout6itemAtEi @ 8790 NONAME
+ _ZNK14QStackedLayout6widgetEi @ 8791 NONAME
+ _ZNK14QStackedLayout8sizeHintEv @ 8792 NONAME
+ _ZNK14QStackedWidget10metaObjectEv @ 8793 NONAME
+ _ZNK14QStackedWidget12currentIndexEv @ 8794 NONAME
+ _ZNK14QStackedWidget13currentWidgetEv @ 8795 NONAME
+ _ZNK14QStackedWidget5countEv @ 8796 NONAME
+ _ZNK14QStackedWidget6widgetEi @ 8797 NONAME
+ _ZNK14QStackedWidget7indexOfEP7QWidget @ 8798 NONAME
+ _ZNK14QTextTableCell10columnSpanEv @ 8799 NONAME
+ _ZNK14QTextTableCell12lastPositionEv @ 8800 NONAME
+ _ZNK14QTextTableCell13firstPositionEv @ 8801 NONAME
+ _ZNK14QTextTableCell18lastCursorPositionEv @ 8802 NONAME
+ _ZNK14QTextTableCell19firstCursorPositionEv @ 8803 NONAME
+ _ZNK14QTextTableCell20tableCellFormatIndexEv @ 8804 NONAME
+ _ZNK14QTextTableCell3endEv @ 8805 NONAME
+ _ZNK14QTextTableCell3rowEv @ 8806 NONAME
+ _ZNK14QTextTableCell5beginEv @ 8807 NONAME
+ _ZNK14QTextTableCell6columnEv @ 8808 NONAME
+ _ZNK14QTextTableCell6formatEv @ 8809 NONAME
+ _ZNK14QTextTableCell7rowSpanEv @ 8810 NONAME
+ _ZNK14QWidgetPrivate10clipRegionEv @ 8811 NONAME
+ _ZNK14QWidgetPrivate10frameStrutEv @ 8812 NONAME
+ _ZNK14QWidgetPrivate12adjustedSizeEv @ 8813 NONAME
+ _ZNK14QWidgetPrivate12inputContextEv @ 8814 NONAME
+ _ZNK14QWidgetPrivate12isOverlappedERK5QRect @ 8815 NONAME
+ _ZNK14QWidgetPrivate13isAboutToShowEv @ 8816 NONAME
+ _ZNK14QWidgetPrivate13paintOnScreenEv @ 8817 NONAME
+ _ZNK14QWidgetPrivate14childAt_helperERK6QPointb @ 8818 NONAME
+ _ZNK14QWidgetPrivate15getOpaqueRegionEv @ 8819 NONAME
+ _ZNK14QWidgetPrivate15paintBackgroundEP8QPainterRK7QRegioni @ 8820 NONAME
+ _ZNK14QWidgetPrivate17getOpaqueChildrenEv @ 8821 NONAME
+ _ZNK14QWidgetPrivate17naturalWidgetFontEj @ 8822 NONAME
+ _ZNK14QWidgetPrivate19clipToEffectiveMaskER7QRegion @ 8823 NONAME
+ _ZNK14QWidgetPrivate20getLayoutItemMarginsEPiS0_S0_S0_ @ 8824 NONAME
+ _ZNK14QWidgetPrivate20naturalWidgetPaletteEj @ 8825 NONAME
+ _ZNK14QWidgetPrivate22subtractOpaqueChildrenER7QRegionRK5QRect @ 8826 NONAME
+ _ZNK14QWidgetPrivate22subtractOpaqueSiblingsER7QRegionPbb @ 8827 NONAME
+ _ZNK14QWidgetPrivate8clipRectEv @ 8828 NONAME
+ _ZNK14QWindowSurface10grabWidgetEPK7QWidgetRK5QRect @ 8829 NONAME
+ _ZNK14QWindowSurface14staticContentsEv @ 8830 NONAME
+ _ZNK14QWindowSurface17hasStaticContentsEv @ 8831 NONAME
+ _ZNK14QWindowSurface24hasStaticContentsSupportEv @ 8832 NONAME
+ _ZNK14QWindowSurface6offsetEPK7QWidget @ 8833 NONAME
+ _ZNK14QWindowSurface6windowEv @ 8834 NONAME
+ _ZNK14QWindowSurface8geometryEv @ 8835 NONAME
+ _ZNK15QAbstractButton10autoRepeatEv @ 8836 NONAME
+ _ZNK15QAbstractButton10metaObjectEv @ 8837 NONAME
+ _ZNK15QAbstractButton11isCheckableEv @ 8838 NONAME
+ _ZNK15QAbstractButton13autoExclusiveEv @ 8839 NONAME
+ _ZNK15QAbstractButton15autoRepeatDelayEv @ 8840 NONAME
+ _ZNK15QAbstractButton18autoRepeatIntervalEv @ 8841 NONAME
+ _ZNK15QAbstractButton4iconEv @ 8842 NONAME
+ _ZNK15QAbstractButton4textEv @ 8843 NONAME
+ _ZNK15QAbstractButton5groupEv @ 8844 NONAME
+ _ZNK15QAbstractButton6isDownEv @ 8845 NONAME
+ _ZNK15QAbstractButton8iconSizeEv @ 8846 NONAME
+ _ZNK15QAbstractButton8shortcutEv @ 8847 NONAME
+ _ZNK15QAbstractButton9hitButtonERK6QPoint @ 8848 NONAME
+ _ZNK15QAbstractButton9isCheckedEv @ 8849 NONAME
+ _ZNK15QAbstractSlider10metaObjectEv @ 8850 NONAME
+ _ZNK15QAbstractSlider10singleStepEv @ 8851 NONAME
+ _ZNK15QAbstractSlider11hasTrackingEv @ 8852 NONAME
+ _ZNK15QAbstractSlider11orientationEv @ 8853 NONAME
+ _ZNK15QAbstractSlider12isSliderDownEv @ 8854 NONAME
+ _ZNK15QAbstractSlider12repeatActionEv @ 8855 NONAME
+ _ZNK15QAbstractSlider14sliderPositionEv @ 8856 NONAME
+ _ZNK15QAbstractSlider16invertedControlsEv @ 8857 NONAME
+ _ZNK15QAbstractSlider18invertedAppearanceEv @ 8858 NONAME
+ _ZNK15QAbstractSlider5valueEv @ 8859 NONAME
+ _ZNK15QAbstractSlider7maximumEv @ 8860 NONAME
+ _ZNK15QAbstractSlider7minimumEv @ 8861 NONAME
+ _ZNK15QAbstractSlider8pageStepEv @ 8862 NONAME
+ _ZNK15QCalendarWidget10metaObjectEv @ 8863 NONAME
+ _ZNK15QCalendarWidget10monthShownEv @ 8864 NONAME
+ _ZNK15QCalendarWidget11maximumDateEv @ 8865 NONAME
+ _ZNK15QCalendarWidget11minimumDateEv @ 8866 NONAME
+ _ZNK15QCalendarWidget12selectedDateEv @ 8867 NONAME
+ _ZNK15QCalendarWidget13isGridVisibleEv @ 8868 NONAME
+ _ZNK15QCalendarWidget13selectionModeEv @ 8869 NONAME
+ _ZNK15QCalendarWidget14dateTextFormatERK5QDate @ 8870 NONAME
+ _ZNK15QCalendarWidget14dateTextFormatEv @ 8871 NONAME
+ _ZNK15QCalendarWidget14firstDayOfWeekEv @ 8872 NONAME
+ _ZNK15QCalendarWidget15isHeaderVisibleEv @ 8873 NONAME
+ _ZNK15QCalendarWidget15minimumSizeHintEv @ 8874 NONAME
+ _ZNK15QCalendarWidget16headerTextFormatEv @ 8875 NONAME
+ _ZNK15QCalendarWidget17isDateEditEnabledEv @ 8876 NONAME
+ _ZNK15QCalendarWidget17weekdayTextFormatEN2Qt9DayOfWeekE @ 8877 NONAME
+ _ZNK15QCalendarWidget19dateEditAcceptDelayEv @ 8878 NONAME
+ _ZNK15QCalendarWidget20verticalHeaderFormatEv @ 8879 NONAME
+ _ZNK15QCalendarWidget22horizontalHeaderFormatEv @ 8880 NONAME
+ _ZNK15QCalendarWidget8sizeHintEv @ 8881 NONAME
+ _ZNK15QCalendarWidget9paintCellEP8QPainterRK5QRectRK5QDate @ 8882 NONAME
+ _ZNK15QCalendarWidget9yearShownEv @ 8883 NONAME
+ _ZNK15QGraphicsAnchor10metaObjectEv @ 8884 NONAME
+ _ZNK15QGraphicsAnchor7spacingEv @ 8885 NONAME
+ _ZNK15QGraphicsEffect10metaObjectEv @ 8886 NONAME
+ _ZNK15QGraphicsEffect12boundingRectEv @ 8887 NONAME
+ _ZNK15QGraphicsEffect15boundingRectForERK6QRectF @ 8888 NONAME
+ _ZNK15QGraphicsEffect6sourceEv @ 8889 NONAME
+ _ZNK15QGraphicsEffect9isEnabledEv @ 8890 NONAME
+ _ZNK15QGraphicsLayout11isActivatedEv @ 8891 NONAME
+ _ZNK15QGraphicsLayout18getContentsMarginsEPfS0_S0_S0_ @ 8892 NONAME
+ _ZNK15QGraphicsObject10metaObjectEv @ 8893 NONAME
+ _ZNK15QGraphicsWidget10metaObjectEv @ 8894 NONAME
+ _ZNK15QGraphicsWidget10windowTypeEv @ 8895 NONAME
+ _ZNK15QGraphicsWidget11focusPolicyEv @ 8896 NONAME
+ _ZNK15QGraphicsWidget11focusWidgetEv @ 8897 NONAME
+ _ZNK15QGraphicsWidget11windowFlagsEv @ 8898 NONAME
+ _ZNK15QGraphicsWidget11windowTitleEv @ 8899 NONAME
+ _ZNK15QGraphicsWidget12boundingRectEv @ 8900 NONAME
+ _ZNK15QGraphicsWidget13testAttributeEN2Qt15WidgetAttributeE @ 8901 NONAME
+ _ZNK15QGraphicsWidget14isActiveWindowEv @ 8902 NONAME
+ _ZNK15QGraphicsWidget15initStyleOptionEP12QStyleOption @ 8903 NONAME
+ _ZNK15QGraphicsWidget15layoutDirectionEv @ 8904 NONAME
+ _ZNK15QGraphicsWidget15windowFrameRectEv @ 8905 NONAME
+ _ZNK15QGraphicsWidget18getContentsMarginsEPfS0_S0_S0_ @ 8906 NONAME
+ _ZNK15QGraphicsWidget19windowFrameGeometryEv @ 8907 NONAME
+ _ZNK15QGraphicsWidget20windowFrameSectionAtERK7QPointF @ 8908 NONAME
+ _ZNK15QGraphicsWidget21getWindowFrameMarginsEPfS0_S0_S0_ @ 8909 NONAME
+ _ZNK15QGraphicsWidget4fontEv @ 8910 NONAME
+ _ZNK15QGraphicsWidget4sizeEv @ 8911 NONAME
+ _ZNK15QGraphicsWidget4typeEv @ 8912 NONAME
+ _ZNK15QGraphicsWidget5shapeEv @ 8913 NONAME
+ _ZNK15QGraphicsWidget5styleEv @ 8914 NONAME
+ _ZNK15QGraphicsWidget6layoutEv @ 8915 NONAME
+ _ZNK15QGraphicsWidget7actionsEv @ 8916 NONAME
+ _ZNK15QGraphicsWidget7paletteEv @ 8917 NONAME
+ _ZNK15QGraphicsWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 8918 NONAME
+ _ZNK15QImageIOHandler10imageCountEv @ 8919 NONAME
+ _ZNK15QImageIOHandler14nextImageDelayEv @ 8920 NONAME
+ _ZNK15QImageIOHandler14supportsOptionENS_11ImageOptionE @ 8921 NONAME
+ _ZNK15QImageIOHandler16currentImageRectEv @ 8922 NONAME
+ _ZNK15QImageIOHandler18currentImageNumberEv @ 8923 NONAME
+ _ZNK15QImageIOHandler4nameEv @ 8924 NONAME
+ _ZNK15QImageIOHandler6deviceEv @ 8925 NONAME
+ _ZNK15QImageIOHandler6formatEv @ 8926 NONAME
+ _ZNK15QImageIOHandler6optionENS_11ImageOptionE @ 8927 NONAME
+ _ZNK15QImageIOHandler9loopCountEv @ 8928 NONAME
+ _ZNK15QImageIOHandler9setFormatERK10QByteArray @ 8929 NONAME
+ _ZNK15QLinearGradient5startEv @ 8930 NONAME
+ _ZNK15QLinearGradient9finalStopEv @ 8931 NONAME
+ _ZNK15QListWidgetItem4dataEi @ 8932 NONAME
+ _ZNK15QListWidgetItem5cloneEv @ 8933 NONAME
+ _ZNK15QListWidgetItem5writeER11QDataStream @ 8934 NONAME
+ _ZNK15QListWidgetItemltERKS_ @ 8935 NONAME
+ _ZNK15QProgressDialog10metaObjectEv @ 8936 NONAME
+ _ZNK15QProgressDialog11wasCanceledEv @ 8937 NONAME
+ _ZNK15QProgressDialog15minimumDurationEv @ 8938 NONAME
+ _ZNK15QProgressDialog5valueEv @ 8939 NONAME
+ _ZNK15QProgressDialog7maximumEv @ 8940 NONAME
+ _ZNK15QProgressDialog7minimumEv @ 8941 NONAME
+ _ZNK15QProgressDialog8sizeHintEv @ 8942 NONAME
+ _ZNK15QProgressDialog9autoCloseEv @ 8943 NONAME
+ _ZNK15QProgressDialog9autoResetEv @ 8944 NONAME
+ _ZNK15QProgressDialog9labelTextEv @ 8945 NONAME
+ _ZNK15QRadialGradient10focalPointEv @ 8946 NONAME
+ _ZNK15QRadialGradient6centerEv @ 8947 NONAME
+ _ZNK15QRadialGradient6radiusEv @ 8948 NONAME
+ _ZNK15QSessionManager10metaObjectEv @ 8949 NONAME
+ _ZNK15QSplitterHandle10metaObjectEv @ 8950 NONAME
+ _ZNK15QSplitterHandle11orientationEv @ 8951 NONAME
+ _ZNK15QSplitterHandle12opaqueResizeEv @ 8952 NONAME
+ _ZNK15QSplitterHandle8sizeHintEv @ 8953 NONAME
+ _ZNK15QSplitterHandle8splitterEv @ 8954 NONAME
+ _ZNK15QTextBlockGroup10metaObjectEv @ 8955 NONAME
+ _ZNK15QTextBlockGroup9blockListEv @ 8956 NONAME
+ _ZNK15QTextCharFormat10anchorNameEv @ 8957 NONAME
+ _ZNK15QTextCharFormat11anchorNamesEv @ 8958 NONAME
+ _ZNK15QTextCharFormat13fontUnderlineEv @ 8959 NONAME
+ _ZNK15QTextCharFormat4fontEv @ 8960 NONAME
+ _ZNK15QTreeWidgetItem18childrenCheckStateEi @ 8961 NONAME
+ _ZNK15QTreeWidgetItem18executePendingSortEv @ 8962 NONAME
+ _ZNK15QTreeWidgetItem20childIndicatorPolicyEv @ 8963 NONAME
+ _ZNK15QTreeWidgetItem4dataEii @ 8964 NONAME
+ _ZNK15QTreeWidgetItem5cloneEv @ 8965 NONAME
+ _ZNK15QTreeWidgetItem5flagsEv @ 8966 NONAME
+ _ZNK15QTreeWidgetItem5writeER11QDataStream @ 8967 NONAME
+ _ZNK15QTreeWidgetItemltERKS_ @ 8968 NONAME
+ _ZNK16QAbstractSpinBox10isReadOnlyEv @ 8969 NONAME
+ _ZNK16QAbstractSpinBox10metaObjectEv @ 8970 NONAME
+ _ZNK16QAbstractSpinBox11stepEnabledEv @ 8971 NONAME
+ _ZNK16QAbstractSpinBox13buttonSymbolsEv @ 8972 NONAME
+ _ZNK16QAbstractSpinBox13isAcceleratedEv @ 8973 NONAME
+ _ZNK16QAbstractSpinBox14correctionModeEv @ 8974 NONAME
+ _ZNK16QAbstractSpinBox15initStyleOptionEP19QStyleOptionSpinBox @ 8975 NONAME
+ _ZNK16QAbstractSpinBox15minimumSizeHintEv @ 8976 NONAME
+ _ZNK16QAbstractSpinBox16inputMethodQueryEN2Qt16InputMethodQueryE @ 8977 NONAME
+ _ZNK16QAbstractSpinBox16keyboardTrackingEv @ 8978 NONAME
+ _ZNK16QAbstractSpinBox16specialValueTextEv @ 8979 NONAME
+ _ZNK16QAbstractSpinBox18hasAcceptableInputEv @ 8980 NONAME
+ _ZNK16QAbstractSpinBox4textEv @ 8981 NONAME
+ _ZNK16QAbstractSpinBox5fixupER7QString @ 8982 NONAME
+ _ZNK16QAbstractSpinBox8hasFrameEv @ 8983 NONAME
+ _ZNK16QAbstractSpinBox8lineEditEv @ 8984 NONAME
+ _ZNK16QAbstractSpinBox8sizeHintEv @ 8985 NONAME
+ _ZNK16QAbstractSpinBox8validateER7QStringRi @ 8986 NONAME
+ _ZNK16QAbstractSpinBox8wrappingEv @ 8987 NONAME
+ _ZNK16QAbstractSpinBox9alignmentEv @ 8988 NONAME
+ _ZNK16QConicalGradient5angleEv @ 8989 NONAME
+ _ZNK16QConicalGradient6centerEv @ 8990 NONAME
+ _ZNK16QDialogButtonBox10buttonRoleEP15QAbstractButton @ 8991 NONAME
+ _ZNK16QDialogButtonBox10metaObjectEv @ 8992 NONAME
+ _ZNK16QDialogButtonBox11orientationEv @ 8993 NONAME
+ _ZNK16QDialogButtonBox13centerButtonsEv @ 8994 NONAME
+ _ZNK16QDialogButtonBox14standardButtonEP15QAbstractButton @ 8995 NONAME
+ _ZNK16QDialogButtonBox15standardButtonsEv @ 8996 NONAME
+ _ZNK16QDialogButtonBox6buttonENS_14StandardButtonE @ 8997 NONAME
+ _ZNK16QDialogButtonBox7buttonsEv @ 8998 NONAME
+ _ZNK16QDoubleValidator10metaObjectEv @ 8999 NONAME
+ _ZNK16QDoubleValidator8notationEv @ 9000 NONAME
+ _ZNK16QDoubleValidator8validateER7QStringRi @ 9001 NONAME
+ _ZNK16QFileSystemModel10headerDataEiN2Qt11OrientationEi @ 9002 NONAME
+ _ZNK16QFileSystemModel10isReadOnlyEv @ 9003 NONAME
+ _ZNK16QFileSystemModel10metaObjectEv @ 9004 NONAME
+ _ZNK16QFileSystemModel10myComputerEi @ 9005 NONAME
+ _ZNK16QFileSystemModel11columnCountERK11QModelIndex @ 9006 NONAME
+ _ZNK16QFileSystemModel11hasChildrenERK11QModelIndex @ 9007 NONAME
+ _ZNK16QFileSystemModel11nameFiltersEv @ 9008 NONAME
+ _ZNK16QFileSystemModel11permissionsERK11QModelIndex @ 9009 NONAME
+ _ZNK16QFileSystemModel12canFetchMoreERK11QModelIndex @ 9010 NONAME
+ _ZNK16QFileSystemModel12iconProviderEv @ 9011 NONAME
+ _ZNK16QFileSystemModel12lastModifiedERK11QModelIndex @ 9012 NONAME
+ _ZNK16QFileSystemModel13rootDirectoryEv @ 9013 NONAME
+ _ZNK16QFileSystemModel15resolveSymlinksEv @ 9014 NONAME
+ _ZNK16QFileSystemModel18nameFilterDisablesEv @ 9015 NONAME
+ _ZNK16QFileSystemModel20supportedDropActionsEv @ 9016 NONAME
+ _ZNK16QFileSystemModel4dataERK11QModelIndexi @ 9017 NONAME
+ _ZNK16QFileSystemModel4sizeERK11QModelIndex @ 9018 NONAME
+ _ZNK16QFileSystemModel4typeERK11QModelIndex @ 9019 NONAME
+ _ZNK16QFileSystemModel5flagsERK11QModelIndex @ 9020 NONAME
+ _ZNK16QFileSystemModel5indexERK7QStringi @ 9021 NONAME
+ _ZNK16QFileSystemModel5indexEiiRK11QModelIndex @ 9022 NONAME
+ _ZNK16QFileSystemModel5isDirERK11QModelIndex @ 9023 NONAME
+ _ZNK16QFileSystemModel6filterEv @ 9024 NONAME
+ _ZNK16QFileSystemModel6parentERK11QModelIndex @ 9025 NONAME
+ _ZNK16QFileSystemModel6removeERK11QModelIndex @ 9026 NONAME
+ _ZNK16QFileSystemModel8filePathERK11QModelIndex @ 9027 NONAME
+ _ZNK16QFileSystemModel8mimeDataERK5QListI11QModelIndexE @ 9028 NONAME
+ _ZNK16QFileSystemModel8rootPathEv @ 9029 NONAME
+ _ZNK16QFileSystemModel8rowCountERK11QModelIndex @ 9030 NONAME
+ _ZNK16QFileSystemModel9mimeTypesEv @ 9031 NONAME
+ _ZNK16QRegExpValidator10metaObjectEv @ 9032 NONAME
+ _ZNK16QRegExpValidator8validateER7QStringRi @ 9033 NONAME
+ _ZNK16QStringListModel10metaObjectEv @ 9034 NONAME
+ _ZNK16QStringListModel10stringListEv @ 9035 NONAME
+ _ZNK16QStringListModel20supportedDropActionsEv @ 9036 NONAME
+ _ZNK16QStringListModel4dataERK11QModelIndexi @ 9037 NONAME
+ _ZNK16QStringListModel5flagsERK11QModelIndex @ 9038 NONAME
+ _ZNK16QStringListModel8rowCountERK11QModelIndex @ 9039 NONAME
+ _ZNK16QTableWidgetItem4dataEi @ 9040 NONAME
+ _ZNK16QTableWidgetItem5cloneEv @ 9041 NONAME
+ _ZNK16QTableWidgetItem5writeER11QDataStream @ 9042 NONAME
+ _ZNK16QTableWidgetItemltERKS_ @ 9043 NONAME
+ _ZNK16QTextBlockFormat12tabPositionsEv @ 9044 NONAME
+ _ZNK16QTextFrameFormat10leftMarginEv @ 9045 NONAME
+ _ZNK16QTextFrameFormat11rightMarginEv @ 9046 NONAME
+ _ZNK16QTextFrameFormat12bottomMarginEv @ 9047 NONAME
+ _ZNK16QTextFrameFormat9topMarginEv @ 9048 NONAME
+ _ZNK17QAbstractItemView10metaObjectEv @ 9049 NONAME
+ _ZNK17QAbstractItemView11dragEnabledEv @ 9050 NONAME
+ _ZNK17QAbstractItemView11indexWidgetERK11QModelIndex @ 9051 NONAME
+ _ZNK17QAbstractItemView11viewOptionsEv @ 9052 NONAME
+ _ZNK17QAbstractItemView12currentIndexEv @ 9053 NONAME
+ _ZNK17QAbstractItemView12dragDropModeEv @ 9054 NONAME
+ _ZNK17QAbstractItemView12editTriggersEv @ 9055 NONAME
+ _ZNK17QAbstractItemView12itemDelegateERK11QModelIndex @ 9056 NONAME
+ _ZNK17QAbstractItemView12itemDelegateEv @ 9057 NONAME
+ _ZNK17QAbstractItemView13hasAutoScrollEv @ 9058 NONAME
+ _ZNK17QAbstractItemView13selectionModeEv @ 9059 NONAME
+ _ZNK17QAbstractItemView13textElideModeEv @ 9060 NONAME
+ _ZNK17QAbstractItemView14selectionModelEv @ 9061 NONAME
+ _ZNK17QAbstractItemView14sizeHintForRowEi @ 9062 NONAME
+ _ZNK17QAbstractItemView15selectedIndexesEv @ 9063 NONAME
+ _ZNK17QAbstractItemView16autoScrollMarginEv @ 9064 NONAME
+ _ZNK17QAbstractItemView16inputMethodQueryEN2Qt16InputMethodQueryE @ 9065 NONAME
+ _ZNK17QAbstractItemView16selectionCommandERK11QModelIndexPK6QEvent @ 9066 NONAME
+ _ZNK17QAbstractItemView16sizeHintForIndexERK11QModelIndex @ 9067 NONAME
+ _ZNK17QAbstractItemView16tabKeyNavigationEv @ 9068 NONAME
+ _ZNK17QAbstractItemView17defaultDropActionEv @ 9069 NONAME
+ _ZNK17QAbstractItemView17dirtyRegionOffsetEv @ 9070 NONAME
+ _ZNK17QAbstractItemView17selectionBehaviorEv @ 9071 NONAME
+ _ZNK17QAbstractItemView17showDropIndicatorEv @ 9072 NONAME
+ _ZNK17QAbstractItemView17sizeHintForColumnEi @ 9073 NONAME
+ _ZNK17QAbstractItemView18itemDelegateForRowEi @ 9074 NONAME
+ _ZNK17QAbstractItemView18verticalScrollModeEv @ 9075 NONAME
+ _ZNK17QAbstractItemView20alternatingRowColorsEv @ 9076 NONAME
+ _ZNK17QAbstractItemView20horizontalScrollModeEv @ 9077 NONAME
+ _ZNK17QAbstractItemView20verticalStepsPerItemEv @ 9078 NONAME
+ _ZNK17QAbstractItemView21dragDropOverwriteModeEv @ 9079 NONAME
+ _ZNK17QAbstractItemView21dropIndicatorPositionEv @ 9080 NONAME
+ _ZNK17QAbstractItemView21itemDelegateForColumnEi @ 9081 NONAME
+ _ZNK17QAbstractItemView22horizontalStepsPerItemEv @ 9082 NONAME
+ _ZNK17QAbstractItemView5modelEv @ 9083 NONAME
+ _ZNK17QAbstractItemView5stateEv @ 9084 NONAME
+ _ZNK17QAbstractItemView8iconSizeEv @ 9085 NONAME
+ _ZNK17QAbstractItemView9rootIndexEv @ 9086 NONAME
+ _ZNK17QDataWidgetMapper10metaObjectEv @ 9087 NONAME
+ _ZNK17QDataWidgetMapper11orientationEv @ 9088 NONAME
+ _ZNK17QDataWidgetMapper12currentIndexEv @ 9089 NONAME
+ _ZNK17QDataWidgetMapper12itemDelegateEv @ 9090 NONAME
+ _ZNK17QDataWidgetMapper12submitPolicyEv @ 9091 NONAME
+ _ZNK17QDataWidgetMapper13mappedSectionEP7QWidget @ 9092 NONAME
+ _ZNK17QDataWidgetMapper14mappedWidgetAtEi @ 9093 NONAME
+ _ZNK17QDataWidgetMapper18mappedPropertyNameEP7QWidget @ 9094 NONAME
+ _ZNK17QDataWidgetMapper5modelEv @ 9095 NONAME
+ _ZNK17QDataWidgetMapper9rootIndexEv @ 9096 NONAME
+ _ZNK17QDockWidgetLayout10metaObjectEv @ 9097 NONAME
+ _ZNK17QDockWidgetLayout11itemForRoleENS_4RoleE @ 9098 NONAME
+ _ZNK17QDockWidgetLayout11maximumSizeEv @ 9099 NONAME
+ _ZNK17QDockWidgetLayout11minimumSizeEv @ 9100 NONAME
+ _ZNK17QDockWidgetLayout11titleHeightEv @ 9101 NONAME
+ _ZNK17QDockWidgetLayout13widgetForRoleENS_4RoleE @ 9102 NONAME
+ _ZNK17QDockWidgetLayout15sizeFromContentERK5QSizeb @ 9103 NONAME
+ _ZNK17QDockWidgetLayout16nativeWindowDecoEb @ 9104 NONAME
+ _ZNK17QDockWidgetLayout16nativeWindowDecoEv @ 9105 NONAME
+ _ZNK17QDockWidgetLayout17minimumTitleWidthEv @ 9106 NONAME
+ _ZNK17QDockWidgetLayout5countEv @ 9107 NONAME
+ _ZNK17QDockWidgetLayout6itemAtEi @ 9108 NONAME
+ _ZNK17QDockWidgetLayout8sizeHintEv @ 9109 NONAME
+ _ZNK17QFileIconProvider4iconENS_8IconTypeE @ 9110 NONAME
+ _ZNK17QFileIconProvider4iconERK9QFileInfo @ 9111 NONAME
+ _ZNK17QFileIconProvider4typeERK9QFileInfo @ 9112 NONAME
+ _ZNK17QGraphicsLineItem10opaqueAreaEv @ 9113 NONAME
+ _ZNK17QGraphicsLineItem12boundingRectEv @ 9114 NONAME
+ _ZNK17QGraphicsLineItem12isObscuredByEPK13QGraphicsItem @ 9115 NONAME
+ _ZNK17QGraphicsLineItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9116 NONAME
+ _ZNK17QGraphicsLineItem3penEv @ 9117 NONAME
+ _ZNK17QGraphicsLineItem4lineEv @ 9118 NONAME
+ _ZNK17QGraphicsLineItem4typeEv @ 9119 NONAME
+ _ZNK17QGraphicsLineItem5shapeEv @ 9120 NONAME
+ _ZNK17QGraphicsLineItem8containsERK7QPointF @ 9121 NONAME
+ _ZNK17QGraphicsLineItem9extensionERK8QVariant @ 9122 NONAME
+ _ZNK17QGraphicsPathItem10opaqueAreaEv @ 9123 NONAME
+ _ZNK17QGraphicsPathItem12boundingRectEv @ 9124 NONAME
+ _ZNK17QGraphicsPathItem12isObscuredByEPK13QGraphicsItem @ 9125 NONAME
+ _ZNK17QGraphicsPathItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9126 NONAME
+ _ZNK17QGraphicsPathItem4pathEv @ 9127 NONAME
+ _ZNK17QGraphicsPathItem4typeEv @ 9128 NONAME
+ _ZNK17QGraphicsPathItem5shapeEv @ 9129 NONAME
+ _ZNK17QGraphicsPathItem8containsERK7QPointF @ 9130 NONAME
+ _ZNK17QGraphicsPathItem9extensionERK8QVariant @ 9131 NONAME
+ _ZNK17QGraphicsRectItem10opaqueAreaEv @ 9132 NONAME
+ _ZNK17QGraphicsRectItem12boundingRectEv @ 9133 NONAME
+ _ZNK17QGraphicsRectItem12isObscuredByEPK13QGraphicsItem @ 9134 NONAME
+ _ZNK17QGraphicsRectItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9135 NONAME
+ _ZNK17QGraphicsRectItem4rectEv @ 9136 NONAME
+ _ZNK17QGraphicsRectItem4typeEv @ 9137 NONAME
+ _ZNK17QGraphicsRectItem5shapeEv @ 9138 NONAME
+ _ZNK17QGraphicsRectItem8containsERK7QPointF @ 9139 NONAME
+ _ZNK17QGraphicsRectItem9extensionERK8QVariant @ 9140 NONAME
+ _ZNK17QGraphicsRotation10metaObjectEv @ 9141 NONAME
+ _ZNK17QGraphicsRotation4axisEv @ 9142 NONAME
+ _ZNK17QGraphicsRotation5angleEv @ 9143 NONAME
+ _ZNK17QGraphicsRotation6originEv @ 9144 NONAME
+ _ZNK17QGraphicsRotation7applyToEP10QMatrix4x4 @ 9145 NONAME
+ _ZNK17QGraphicsTextItem10metaObjectEv @ 9146 NONAME
+ _ZNK17QGraphicsTextItem10opaqueAreaEv @ 9147 NONAME
+ _ZNK17QGraphicsTextItem10textCursorEv @ 9148 NONAME
+ _ZNK17QGraphicsTextItem11toPlainTextEv @ 9149 NONAME
+ _ZNK17QGraphicsTextItem12boundingRectEv @ 9150 NONAME
+ _ZNK17QGraphicsTextItem12isObscuredByEPK13QGraphicsItem @ 9151 NONAME
+ _ZNK17QGraphicsTextItem15tabChangesFocusEv @ 9152 NONAME
+ _ZNK17QGraphicsTextItem16defaultTextColorEv @ 9153 NONAME
+ _ZNK17QGraphicsTextItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 9154 NONAME
+ _ZNK17QGraphicsTextItem17openExternalLinksEv @ 9155 NONAME
+ _ZNK17QGraphicsTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9156 NONAME
+ _ZNK17QGraphicsTextItem20textInteractionFlagsEv @ 9157 NONAME
+ _ZNK17QGraphicsTextItem4fontEv @ 9158 NONAME
+ _ZNK17QGraphicsTextItem4typeEv @ 9159 NONAME
+ _ZNK17QGraphicsTextItem5shapeEv @ 9160 NONAME
+ _ZNK17QGraphicsTextItem6toHtmlEv @ 9161 NONAME
+ _ZNK17QGraphicsTextItem8containsERK7QPointF @ 9162 NONAME
+ _ZNK17QGraphicsTextItem8documentEv @ 9163 NONAME
+ _ZNK17QGraphicsTextItem9extensionERK8QVariant @ 9164 NONAME
+ _ZNK17QGraphicsTextItem9textWidthEv @ 9165 NONAME
+ _ZNK17QIconEnginePlugin10metaObjectEv @ 9166 NONAME
+ _ZNK17QPaintEngineState10clipRegionEv @ 9167 NONAME
+ _ZNK17QPaintEngineState11brushOriginEv @ 9168 NONAME
+ _ZNK17QPaintEngineState11renderHintsEv @ 9169 NONAME
+ _ZNK17QPaintEngineState13clipOperationEv @ 9170 NONAME
+ _ZNK17QPaintEngineState13isClipEnabledEv @ 9171 NONAME
+ _ZNK17QPaintEngineState14backgroundModeEv @ 9172 NONAME
+ _ZNK17QPaintEngineState15backgroundBrushEv @ 9173 NONAME
+ _ZNK17QPaintEngineState15compositionModeEv @ 9174 NONAME
+ _ZNK17QPaintEngineState17penNeedsResolvingEv @ 9175 NONAME
+ _ZNK17QPaintEngineState19brushNeedsResolvingEv @ 9176 NONAME
+ _ZNK17QPaintEngineState3penEv @ 9177 NONAME
+ _ZNK17QPaintEngineState4fontEv @ 9178 NONAME
+ _ZNK17QPaintEngineState5brushEv @ 9179 NONAME
+ _ZNK17QPaintEngineState6matrixEv @ 9180 NONAME
+ _ZNK17QPaintEngineState7opacityEv @ 9181 NONAME
+ _ZNK17QPaintEngineState7painterEv @ 9182 NONAME
+ _ZNK17QPaintEngineState8clipPathEv @ 9183 NONAME
+ _ZNK17QPaintEngineState9transformEv @ 9184 NONAME
+ _ZNK17QPixmapBlurFilter10metaObjectEv @ 9185 NONAME
+ _ZNK17QPixmapBlurFilter15boundingRectForERK6QRectF @ 9186 NONAME
+ _ZNK17QPixmapBlurFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9187 NONAME
+ _ZNK17QPixmapBlurFilter6radiusEv @ 9188 NONAME
+ _ZNK17QPixmapBlurFilter8blurHintEv @ 9189 NONAME
+ _ZNK17QRasterPixmapData11paintEngineEv @ 9190 NONAME
+ _ZNK17QRasterPixmapData15hasAlphaChannelEv @ 9191 NONAME
+ _ZNK17QRasterPixmapData6metricEN12QPaintDevice17PaintDeviceMetricE @ 9192 NONAME
+ _ZNK17QRasterPixmapData7toImageEv @ 9193 NONAME
+ _ZNK17QTextInlineObject11formatIndexEv @ 9194 NONAME
+ _ZNK17QTextInlineObject12textPositionEv @ 9195 NONAME
+ _ZNK17QTextInlineObject13textDirectionEv @ 9196 NONAME
+ _ZNK17QTextInlineObject4rectEv @ 9197 NONAME
+ _ZNK17QTextInlineObject5widthEv @ 9198 NONAME
+ _ZNK17QTextInlineObject6ascentEv @ 9199 NONAME
+ _ZNK17QTextInlineObject6formatEv @ 9200 NONAME
+ _ZNK17QTextInlineObject6heightEv @ 9201 NONAME
+ _ZNK17QTextInlineObject7descentEv @ 9202 NONAME
+ _ZNK18QCommandLinkButton10metaObjectEv @ 9203 NONAME
+ _ZNK18QCommandLinkButton11descriptionEv @ 9204 NONAME
+ _ZNK18QCommandLinkButton14heightForWidthEi @ 9205 NONAME
+ _ZNK18QCommandLinkButton15minimumSizeHintEv @ 9206 NONAME
+ _ZNK18QCommandLinkButton8sizeHintEv @ 9207 NONAME
+ _ZNK18QGraphicsItemGroup10opaqueAreaEv @ 9208 NONAME
+ _ZNK18QGraphicsItemGroup12boundingRectEv @ 9209 NONAME
+ _ZNK18QGraphicsItemGroup12isObscuredByEPK13QGraphicsItem @ 9210 NONAME
+ _ZNK18QGraphicsItemGroup4typeEv @ 9211 NONAME
+ _ZNK18QGraphicsTransform10metaObjectEv @ 9212 NONAME
+ _ZNK18QItemEditorFactory12createEditorEN8QVariant4TypeEP7QWidget @ 9213 NONAME
+ _ZNK18QItemEditorFactory17valuePropertyNameEN8QVariant4TypeE @ 9214 NONAME
+ _ZNK18QStandardItemModel10headerDataEiN2Qt11OrientationEi @ 9215 NONAME
+ _ZNK18QStandardItemModel10metaObjectEv @ 9216 NONAME
+ _ZNK18QStandardItemModel11columnCountERK11QModelIndex @ 9217 NONAME
+ _ZNK18QStandardItemModel11hasChildrenERK11QModelIndex @ 9218 NONAME
+ _ZNK18QStandardItemModel13indexFromItemEPK13QStandardItem @ 9219 NONAME
+ _ZNK18QStandardItemModel13itemFromIndexERK11QModelIndex @ 9220 NONAME
+ _ZNK18QStandardItemModel13itemPrototypeEv @ 9221 NONAME
+ _ZNK18QStandardItemModel17invisibleRootItemEv @ 9222 NONAME
+ _ZNK18QStandardItemModel18verticalHeaderItemEi @ 9223 NONAME
+ _ZNK18QStandardItemModel20horizontalHeaderItemEi @ 9224 NONAME
+ _ZNK18QStandardItemModel20supportedDropActionsEv @ 9225 NONAME
+ _ZNK18QStandardItemModel4dataERK11QModelIndexi @ 9226 NONAME
+ _ZNK18QStandardItemModel4itemEii @ 9227 NONAME
+ _ZNK18QStandardItemModel5flagsERK11QModelIndex @ 9228 NONAME
+ _ZNK18QStandardItemModel5indexEiiRK11QModelIndex @ 9229 NONAME
+ _ZNK18QStandardItemModel6parentERK11QModelIndex @ 9230 NONAME
+ _ZNK18QStandardItemModel8itemDataERK11QModelIndex @ 9231 NONAME
+ _ZNK18QStandardItemModel8mimeDataERK5QListI11QModelIndexE @ 9232 NONAME
+ _ZNK18QStandardItemModel8rowCountERK11QModelIndex @ 9233 NONAME
+ _ZNK18QStandardItemModel8sortRoleEv @ 9234 NONAME
+ _ZNK18QStandardItemModel9findItemsERK7QString6QFlagsIN2Qt9MatchFlagEEi @ 9235 NONAME
+ _ZNK18QStandardItemModel9mimeTypesEv @ 9236 NONAME
+ _ZNK18QSyntaxHighlighter10metaObjectEv @ 9237 NONAME
+ _ZNK18QSyntaxHighlighter12currentBlockEv @ 9238 NONAME
+ _ZNK18QSyntaxHighlighter17currentBlockStateEv @ 9239 NONAME
+ _ZNK18QSyntaxHighlighter18previousBlockStateEv @ 9240 NONAME
+ _ZNK18QSyntaxHighlighter20currentBlockUserDataEv @ 9241 NONAME
+ _ZNK18QSyntaxHighlighter6formatEi @ 9242 NONAME
+ _ZNK18QSyntaxHighlighter8documentEv @ 9243 NONAME
+ _ZNK18QTextureGlyphCache18textureMapForGlyphEj @ 9244 NONAME
+ _ZNK19QAbstractProxyModel10headerDataEiN2Qt11OrientationEi @ 9245 NONAME
+ _ZNK19QAbstractProxyModel10metaObjectEv @ 9246 NONAME
+ _ZNK19QAbstractProxyModel11sourceModelEv @ 9247 NONAME
+ _ZNK19QAbstractProxyModel20mapSelectionToSourceERK14QItemSelection @ 9248 NONAME
+ _ZNK19QAbstractProxyModel22mapSelectionFromSourceERK14QItemSelection @ 9249 NONAME
+ _ZNK19QAbstractProxyModel4dataERK11QModelIndexi @ 9250 NONAME
+ _ZNK19QAbstractProxyModel5flagsERK11QModelIndex @ 9251 NONAME
+ _ZNK19QAbstractProxyModel8itemDataERK11QModelIndex @ 9252 NONAME
+ _ZNK19QAbstractScrollArea10metaObjectEv @ 9253 NONAME
+ _ZNK19QAbstractScrollArea12cornerWidgetEv @ 9254 NONAME
+ _ZNK19QAbstractScrollArea15minimumSizeHintEv @ 9255 NONAME
+ _ZNK19QAbstractScrollArea17verticalScrollBarEv @ 9256 NONAME
+ _ZNK19QAbstractScrollArea19horizontalScrollBarEv @ 9257 NONAME
+ _ZNK19QAbstractScrollArea19maximumViewportSizeEv @ 9258 NONAME
+ _ZNK19QAbstractScrollArea23verticalScrollBarPolicyEv @ 9259 NONAME
+ _ZNK19QAbstractScrollArea25horizontalScrollBarPolicyEv @ 9260 NONAME
+ _ZNK19QAbstractScrollArea8sizeHintEv @ 9261 NONAME
+ _ZNK19QAbstractScrollArea8viewportEv @ 9262 NONAME
+ _ZNK19QApplicationPrivate11inPopupModeEv @ 9263 NONAME
+ _ZNK19QApplicationPrivate7appNameEv @ 9264 NONAME
+ _ZNK19QCoeFepInputContext10metaObjectEv @ 9265 NONAME
+ _ZNK19QCoeFepInputContext15GetFormatForFepER11TCharFormati @ 9266 NONAME
+ _ZNK19QCoeFepInputContext20DocumentLengthForFepEv @ 9267 NONAME
+ _ZNK19QCoeFepInputContext22GetEditorContentForFepER6TDes16ii @ 9268 NONAME
+ _ZNK19QCoeFepInputContext24GetCursorSelectionForFepER16TCursorSelection @ 9269 NONAME
+ _ZNK19QCoeFepInputContext27DocumentMaximumLengthForFepEv @ 9270 NONAME
+ _ZNK19QCoeFepInputContext27GetScreenCoordinatesForFepLER6TPointRiS2_i @ 9271 NONAME
+ _ZNK19QEventDispatcherS6010metaObjectEv @ 9272 NONAME
+ _ZNK19QGraphicsBlurEffect10blurRadiusEv @ 9273 NONAME
+ _ZNK19QGraphicsBlurEffect10metaObjectEv @ 9274 NONAME
+ _ZNK19QGraphicsBlurEffect15boundingRectForERK6QRectF @ 9275 NONAME
+ _ZNK19QGraphicsBlurEffect8blurHintEv @ 9276 NONAME
+ _ZNK19QGraphicsGridLayout10rowSpacingEi @ 9277 NONAME
+ _ZNK19QGraphicsGridLayout11columnCountEv @ 9278 NONAME
+ _ZNK19QGraphicsGridLayout12rowAlignmentEi @ 9279 NONAME
+ _ZNK19QGraphicsGridLayout13columnSpacingEi @ 9280 NONAME
+ _ZNK19QGraphicsGridLayout15columnAlignmentEi @ 9281 NONAME
+ _ZNK19QGraphicsGridLayout15verticalSpacingEv @ 9282 NONAME
+ _ZNK19QGraphicsGridLayout16rowMaximumHeightEi @ 9283 NONAME
+ _ZNK19QGraphicsGridLayout16rowMinimumHeightEi @ 9284 NONAME
+ _ZNK19QGraphicsGridLayout16rowStretchFactorEi @ 9285 NONAME
+ _ZNK19QGraphicsGridLayout17horizontalSpacingEv @ 9286 NONAME
+ _ZNK19QGraphicsGridLayout18columnMaximumWidthEi @ 9287 NONAME
+ _ZNK19QGraphicsGridLayout18columnMinimumWidthEi @ 9288 NONAME
+ _ZNK19QGraphicsGridLayout18rowPreferredHeightEi @ 9289 NONAME
+ _ZNK19QGraphicsGridLayout19columnStretchFactorEi @ 9290 NONAME
+ _ZNK19QGraphicsGridLayout20columnPreferredWidthEi @ 9291 NONAME
+ _ZNK19QGraphicsGridLayout5countEv @ 9292 NONAME
+ _ZNK19QGraphicsGridLayout6itemAtEi @ 9293 NONAME
+ _ZNK19QGraphicsGridLayout6itemAtEii @ 9294 NONAME
+ _ZNK19QGraphicsGridLayout8rowCountEv @ 9295 NONAME
+ _ZNK19QGraphicsGridLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9296 NONAME
+ _ZNK19QGraphicsGridLayout9alignmentEP19QGraphicsLayoutItem @ 9297 NONAME
+ _ZNK19QGraphicsLayoutItem10sizePolicyEv @ 9298 NONAME
+ _ZNK19QGraphicsLayoutItem11maximumSizeEv @ 9299 NONAME
+ _ZNK19QGraphicsLayoutItem11minimumSizeEv @ 9300 NONAME
+ _ZNK19QGraphicsLayoutItem12contentsRectEv @ 9301 NONAME
+ _ZNK19QGraphicsLayoutItem12graphicsItemEv @ 9302 NONAME
+ _ZNK19QGraphicsLayoutItem13ownedByLayoutEv @ 9303 NONAME
+ _ZNK19QGraphicsLayoutItem13preferredSizeEv @ 9304 NONAME
+ _ZNK19QGraphicsLayoutItem16parentLayoutItemEv @ 9305 NONAME
+ _ZNK19QGraphicsLayoutItem17effectiveSizeHintEN2Qt8SizeHintERK6QSizeF @ 9306 NONAME
+ _ZNK19QGraphicsLayoutItem18getContentsMarginsEPfS0_S0_S0_ @ 9307 NONAME
+ _ZNK19QGraphicsLayoutItem8geometryEv @ 9308 NONAME
+ _ZNK19QGraphicsLayoutItem8isLayoutEv @ 9309 NONAME
+ _ZNK19QGraphicsPixmapItem10opaqueAreaEv @ 9310 NONAME
+ _ZNK19QGraphicsPixmapItem12boundingRectEv @ 9311 NONAME
+ _ZNK19QGraphicsPixmapItem12isObscuredByEPK13QGraphicsItem @ 9312 NONAME
+ _ZNK19QGraphicsPixmapItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9313 NONAME
+ _ZNK19QGraphicsPixmapItem18transformationModeEv @ 9314 NONAME
+ _ZNK19QGraphicsPixmapItem4typeEv @ 9315 NONAME
+ _ZNK19QGraphicsPixmapItem5shapeEv @ 9316 NONAME
+ _ZNK19QGraphicsPixmapItem6offsetEv @ 9317 NONAME
+ _ZNK19QGraphicsPixmapItem6pixmapEv @ 9318 NONAME
+ _ZNK19QGraphicsPixmapItem8containsERK7QPointF @ 9319 NONAME
+ _ZNK19QGraphicsPixmapItem9extensionERK8QVariant @ 9320 NONAME
+ _ZNK19QGraphicsPixmapItem9shapeModeEv @ 9321 NONAME
+ _ZNK19QGraphicsSceneEvent6widgetEv @ 9322 NONAME
+ _ZNK19QIconEnginePluginV210metaObjectEv @ 9323 NONAME
+ _ZNK19QInputContextPlugin10metaObjectEv @ 9324 NONAME
+ _ZNK19QItemSelectionModel10isSelectedERK11QModelIndex @ 9325 NONAME
+ _ZNK19QItemSelectionModel10metaObjectEv @ 9326 NONAME
+ _ZNK19QItemSelectionModel12currentIndexEv @ 9327 NONAME
+ _ZNK19QItemSelectionModel12hasSelectionEv @ 9328 NONAME
+ _ZNK19QItemSelectionModel12selectedRowsEi @ 9329 NONAME
+ _ZNK19QItemSelectionModel13isRowSelectedEiRK11QModelIndex @ 9330 NONAME
+ _ZNK19QItemSelectionModel15selectedColumnsEi @ 9331 NONAME
+ _ZNK19QItemSelectionModel15selectedIndexesEv @ 9332 NONAME
+ _ZNK19QItemSelectionModel16isColumnSelectedEiRK11QModelIndex @ 9333 NONAME
+ _ZNK19QItemSelectionModel22rowIntersectsSelectionEiRK11QModelIndex @ 9334 NONAME
+ _ZNK19QItemSelectionModel25columnIntersectsSelectionEiRK11QModelIndex @ 9335 NONAME
+ _ZNK19QItemSelectionModel5modelEv @ 9336 NONAME
+ _ZNK19QItemSelectionModel9selectionEv @ 9337 NONAME
+ _ZNK19QItemSelectionRange10intersectsERKS_ @ 9338 NONAME
+ _ZNK19QItemSelectionRange7indexesEv @ 9339 NONAME
+ _ZNK19QItemSelectionRange9intersectERKS_ @ 9340 NONAME
+ _ZNK19QKeyEventTransition10metaObjectEv @ 9341 NONAME
+ _ZNK19QKeyEventTransition13modifiersMaskEv @ 9342 NONAME
+ _ZNK19QKeyEventTransition3keyEv @ 9343 NONAME
+ _ZNK19QPainterPathStroker10dashOffsetEv @ 9344 NONAME
+ _ZNK19QPainterPathStroker10miterLimitEv @ 9345 NONAME
+ _ZNK19QPainterPathStroker11dashPatternEv @ 9346 NONAME
+ _ZNK19QPainterPathStroker12createStrokeERK12QPainterPath @ 9347 NONAME
+ _ZNK19QPainterPathStroker14curveThresholdEv @ 9348 NONAME
+ _ZNK19QPainterPathStroker5widthEv @ 9349 NONAME
+ _ZNK19QPainterPathStroker8capStyleEv @ 9350 NONAME
+ _ZNK19QPainterPathStroker9joinStyleEv @ 9351 NONAME
+ _ZNK19QS60MainApplication16ResourceFileNameEv @ 9352 NONAME
+ _ZNK19QS60MainApplication9AppDllUidEv @ 9353 NONAME
+ _ZNK19QStyledItemDelegate10metaObjectEv @ 9354 NONAME
+ _ZNK19QStyledItemDelegate11displayTextERK8QVariantRK7QLocale @ 9355 NONAME
+ _ZNK19QStyledItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9356 NONAME
+ _ZNK19QStyledItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 9357 NONAME
+ _ZNK19QStyledItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 9358 NONAME
+ _ZNK19QStyledItemDelegate15initStyleOptionEP20QStyleOptionViewItemRK11QModelIndex @ 9359 NONAME
+ _ZNK19QStyledItemDelegate17itemEditorFactoryEv @ 9360 NONAME
+ _ZNK19QStyledItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9361 NONAME
+ _ZNK19QStyledItemDelegate5paintEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 9362 NONAME
+ _ZNK19QStyledItemDelegate8sizeHintERK20QStyleOptionViewItemRK11QModelIndex @ 9363 NONAME
+ _ZNK19QTextDocumentWriter5codecEv @ 9364 NONAME
+ _ZNK19QTextDocumentWriter6deviceEv @ 9365 NONAME
+ _ZNK19QTextDocumentWriter6formatEv @ 9366 NONAME
+ _ZNK19QTextDocumentWriter8fileNameEv @ 9367 NONAME
+ _ZNK20QGraphicsBloomEffect10blurRadiusEv @ 9368 NONAME
+ _ZNK20QGraphicsBloomEffect10brightnessEv @ 9369 NONAME
+ _ZNK20QGraphicsBloomEffect10metaObjectEv @ 9370 NONAME
+ _ZNK20QGraphicsBloomEffect15boundingRectForERK6QRectF @ 9371 NONAME
+ _ZNK20QGraphicsBloomEffect8blurHintEv @ 9372 NONAME
+ _ZNK20QGraphicsBloomEffect8strengthEv @ 9373 NONAME
+ _ZNK20QGraphicsEllipseItem10opaqueAreaEv @ 9374 NONAME
+ _ZNK20QGraphicsEllipseItem10startAngleEv @ 9375 NONAME
+ _ZNK20QGraphicsEllipseItem12boundingRectEv @ 9376 NONAME
+ _ZNK20QGraphicsEllipseItem12isObscuredByEPK13QGraphicsItem @ 9377 NONAME
+ _ZNK20QGraphicsEllipseItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9378 NONAME
+ _ZNK20QGraphicsEllipseItem4rectEv @ 9379 NONAME
+ _ZNK20QGraphicsEllipseItem4typeEv @ 9380 NONAME
+ _ZNK20QGraphicsEllipseItem5shapeEv @ 9381 NONAME
+ _ZNK20QGraphicsEllipseItem8containsERK7QPointF @ 9382 NONAME
+ _ZNK20QGraphicsEllipseItem9extensionERK8QVariant @ 9383 NONAME
+ _ZNK20QGraphicsEllipseItem9spanAngleEv @ 9384 NONAME
+ _ZNK20QGraphicsItemPrivate13isProxyWidgetEv @ 9385 NONAME
+ _ZNK20QGraphicsItemPrivate14extraItemCacheEv @ 9386 NONAME
+ _ZNK20QGraphicsItemPrivate15initStyleOptionEP24QStyleOptionGraphicsItemRK10QTransformRK7QRegionb @ 9387 NONAME
+ _ZNK20QGraphicsItemPrivate19genericMapFromSceneERK7QPointFPK7QWidget @ 9388 NONAME
+ _ZNK20QGraphicsItemPrivate19maybeExtraItemCacheEv @ 9389 NONAME
+ _ZNK20QGraphicsItemPrivate20discardUpdateRequestEbbbb @ 9390 NONAME
+ _ZNK20QGraphicsItemPrivate21effectiveBoundingRectEv @ 9391 NONAME
+ _ZNK20QGraphicsItemPrivate22inputMethodQueryHelperEN2Qt16InputMethodQueryE @ 9392 NONAME
+ _ZNK20QGraphicsItemPrivate24combineTransformToParentEP10QTransformPKS0_ @ 9393 NONAME
+ _ZNK20QGraphicsItemPrivate26combineTransformFromParentEP10QTransformPKS0_ @ 9394 NONAME
+ _ZNK20QGraphicsItemPrivate26sceneEffectiveBoundingRectEv @ 9395 NONAME
+ _ZNK20QGraphicsItemPrivate5depthEv @ 9396 NONAME
+ _ZNK20QGraphicsPolygonItem10opaqueAreaEv @ 9397 NONAME
+ _ZNK20QGraphicsPolygonItem12boundingRectEv @ 9398 NONAME
+ _ZNK20QGraphicsPolygonItem12isObscuredByEPK13QGraphicsItem @ 9399 NONAME
+ _ZNK20QGraphicsPolygonItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9400 NONAME
+ _ZNK20QGraphicsPolygonItem4typeEv @ 9401 NONAME
+ _ZNK20QGraphicsPolygonItem5shapeEv @ 9402 NONAME
+ _ZNK20QGraphicsPolygonItem7polygonEv @ 9403 NONAME
+ _ZNK20QGraphicsPolygonItem8containsERK7QPointF @ 9404 NONAME
+ _ZNK20QGraphicsPolygonItem8fillRuleEv @ 9405 NONAME
+ _ZNK20QGraphicsPolygonItem9extensionERK8QVariant @ 9406 NONAME
+ _ZNK20QGraphicsProxyWidget10metaObjectEv @ 9407 NONAME
+ _ZNK20QGraphicsProxyWidget13subWidgetRectEPK7QWidget @ 9408 NONAME
+ _ZNK20QGraphicsProxyWidget4typeEv @ 9409 NONAME
+ _ZNK20QGraphicsProxyWidget6widgetEv @ 9410 NONAME
+ _ZNK20QGraphicsProxyWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9411 NONAME
+ _ZNK20QPaintBufferResource10metaObjectEv @ 9412 NONAME
+ _ZNK20QPictureFormatPlugin10metaObjectEv @ 9413 NONAME
+ _ZNK20QWidgetResizeHandler10metaObjectEv @ 9414 NONAME
+ _ZNK20QWidgetResizeHandler8isActiveENS_6ActionE @ 9415 NONAME
+ _ZNK21QAbstractItemDelegate10metaObjectEv @ 9416 NONAME
+ _ZNK21QAbstractItemDelegate12createEditorEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9417 NONAME
+ _ZNK21QAbstractItemDelegate12setModelDataEP7QWidgetP18QAbstractItemModelRK11QModelIndex @ 9418 NONAME
+ _ZNK21QAbstractItemDelegate13setEditorDataEP7QWidgetRK11QModelIndex @ 9419 NONAME
+ _ZNK21QAbstractItemDelegate20updateEditorGeometryEP7QWidgetRK20QStyleOptionViewItemRK11QModelIndex @ 9420 NONAME
+ _ZNK21QGraphicsAnchorLayout15verticalSpacingEv @ 9421 NONAME
+ _ZNK21QGraphicsAnchorLayout17horizontalSpacingEv @ 9422 NONAME
+ _ZNK21QGraphicsAnchorLayout5countEv @ 9423 NONAME
+ _ZNK21QGraphicsAnchorLayout6itemAtEi @ 9424 NONAME
+ _ZNK21QGraphicsAnchorLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9425 NONAME
+ _ZNK21QGraphicsEffectSource10deviceRectEv @ 9426 NONAME
+ _ZNK21QGraphicsEffectSource10metaObjectEv @ 9427 NONAME
+ _ZNK21QGraphicsEffectSource11styleOptionEv @ 9428 NONAME
+ _ZNK21QGraphicsEffectSource12boundingRectEN2Qt16CoordinateSystemE @ 9429 NONAME
+ _ZNK21QGraphicsEffectSource12graphicsItemEv @ 9430 NONAME
+ _ZNK21QGraphicsEffectSource6pixmapEN2Qt16CoordinateSystemEP6QPoint @ 9431 NONAME
+ _ZNK21QGraphicsEffectSource6widgetEv @ 9432 NONAME
+ _ZNK21QGraphicsEffectSource8isPixmapEv @ 9433 NONAME
+ _ZNK21QGraphicsLinearLayout11itemSpacingEi @ 9434 NONAME
+ _ZNK21QGraphicsLinearLayout11orientationEv @ 9435 NONAME
+ _ZNK21QGraphicsLinearLayout13stretchFactorEP19QGraphicsLayoutItem @ 9436 NONAME
+ _ZNK21QGraphicsLinearLayout5countEv @ 9437 NONAME
+ _ZNK21QGraphicsLinearLayout6itemAtEi @ 9438 NONAME
+ _ZNK21QGraphicsLinearLayout7spacingEv @ 9439 NONAME
+ _ZNK21QGraphicsLinearLayout8sizeHintEN2Qt8SizeHintERK6QSizeF @ 9440 NONAME
+ _ZNK21QGraphicsLinearLayout9alignmentEP19QGraphicsLayoutItem @ 9441 NONAME
+ _ZNK21QGraphicsSystemPlugin10metaObjectEv @ 9442 NONAME
+ _ZNK21QMouseEventTransition10metaObjectEv @ 9443 NONAME
+ _ZNK21QMouseEventTransition13modifiersMaskEv @ 9444 NONAME
+ _ZNK21QMouseEventTransition4pathEv @ 9445 NONAME
+ _ZNK21QMouseEventTransition6buttonEv @ 9446 NONAME
+ _ZNK21QPaintEngineExPrivate17hasClipOperationsEv @ 9447 NONAME
+ _ZNK21QPixmapColorizeFilter10metaObjectEv @ 9448 NONAME
+ _ZNK21QPixmapColorizeFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9449 NONAME
+ _ZNK21QPixmapColorizeFilter5colorEv @ 9450 NONAME
+ _ZNK21QPixmapColorizeFilter8strengthEv @ 9451 NONAME
+ _ZNK21QSortFilterProxyModel10filterRoleEv @ 9452 NONAME
+ _ZNK21QSortFilterProxyModel10headerDataEiN2Qt11OrientationEi @ 9453 NONAME
+ _ZNK21QSortFilterProxyModel10metaObjectEv @ 9454 NONAME
+ _ZNK21QSortFilterProxyModel10sortColumnEv @ 9455 NONAME
+ _ZNK21QSortFilterProxyModel11columnCountERK11QModelIndex @ 9456 NONAME
+ _ZNK21QSortFilterProxyModel11hasChildrenERK11QModelIndex @ 9457 NONAME
+ _ZNK21QSortFilterProxyModel11mapToSourceERK11QModelIndex @ 9458 NONAME
+ _ZNK21QSortFilterProxyModel12canFetchMoreERK11QModelIndex @ 9459 NONAME
+ _ZNK21QSortFilterProxyModel12filterRegExpEv @ 9460 NONAME
+ _ZNK21QSortFilterProxyModel13mapFromSourceERK11QModelIndex @ 9461 NONAME
+ _ZNK21QSortFilterProxyModel15filterKeyColumnEv @ 9462 NONAME
+ _ZNK21QSortFilterProxyModel16filterAcceptsRowEiRK11QModelIndex @ 9463 NONAME
+ _ZNK21QSortFilterProxyModel17dynamicSortFilterEv @ 9464 NONAME
+ _ZNK21QSortFilterProxyModel17isSortLocaleAwareEv @ 9465 NONAME
+ _ZNK21QSortFilterProxyModel19filterAcceptsColumnEiRK11QModelIndex @ 9466 NONAME
+ _ZNK21QSortFilterProxyModel19sortCaseSensitivityEv @ 9467 NONAME
+ _ZNK21QSortFilterProxyModel20mapSelectionToSourceERK14QItemSelection @ 9468 NONAME
+ _ZNK21QSortFilterProxyModel20supportedDropActionsEv @ 9469 NONAME
+ _ZNK21QSortFilterProxyModel21filterCaseSensitivityEv @ 9470 NONAME
+ _ZNK21QSortFilterProxyModel22mapSelectionFromSourceERK14QItemSelection @ 9471 NONAME
+ _ZNK21QSortFilterProxyModel4dataERK11QModelIndexi @ 9472 NONAME
+ _ZNK21QSortFilterProxyModel4spanERK11QModelIndex @ 9473 NONAME
+ _ZNK21QSortFilterProxyModel5buddyERK11QModelIndex @ 9474 NONAME
+ _ZNK21QSortFilterProxyModel5flagsERK11QModelIndex @ 9475 NONAME
+ _ZNK21QSortFilterProxyModel5indexEiiRK11QModelIndex @ 9476 NONAME
+ _ZNK21QSortFilterProxyModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 9477 NONAME
+ _ZNK21QSortFilterProxyModel6parentERK11QModelIndex @ 9478 NONAME
+ _ZNK21QSortFilterProxyModel8lessThanERK11QModelIndexS2_ @ 9479 NONAME
+ _ZNK21QSortFilterProxyModel8mimeDataERK5QListI11QModelIndexE @ 9480 NONAME
+ _ZNK21QSortFilterProxyModel8rowCountERK11QModelIndex @ 9481 NONAME
+ _ZNK21QSortFilterProxyModel8sortRoleEv @ 9482 NONAME
+ _ZNK21QSortFilterProxyModel9mimeTypesEv @ 9483 NONAME
+ _ZNK21QSortFilterProxyModel9sortOrderEv @ 9484 NONAME
+ _ZNK21QTextDocumentFragment11toPlainTextEv @ 9485 NONAME
+ _ZNK21QTextDocumentFragment6toHtmlERK10QByteArray @ 9486 NONAME
+ _ZNK21QTextDocumentFragment6toHtmlEv @ 9487 NONAME
+ _ZNK21QTextDocumentFragment7isEmptyEv @ 9488 NONAME
+ _ZNK21QTextFormatCollection12objectFormatEi @ 9489 NONAME
+ _ZNK21QTextFormatCollection15hasFormatCachedERK11QTextFormat @ 9490 NONAME
+ _ZNK21QTextFormatCollection17objectFormatIndexEi @ 9491 NONAME
+ _ZNK21QTextFormatCollection6formatEi @ 9492 NONAME
+ _ZNK22QGraphicsItemAnimation10metaObjectEv @ 9493 NONAME
+ _ZNK22QGraphicsItemAnimation10rotationAtEf @ 9494 NONAME
+ _ZNK22QGraphicsItemAnimation12rotationListEv @ 9495 NONAME
+ _ZNK22QGraphicsItemAnimation14xTranslationAtEf @ 9496 NONAME
+ _ZNK22QGraphicsItemAnimation14yTranslationAtEf @ 9497 NONAME
+ _ZNK22QGraphicsItemAnimation15translationListEv @ 9498 NONAME
+ _ZNK22QGraphicsItemAnimation15verticalScaleAtEf @ 9499 NONAME
+ _ZNK22QGraphicsItemAnimation15verticalShearAtEf @ 9500 NONAME
+ _ZNK22QGraphicsItemAnimation17horizontalScaleAtEf @ 9501 NONAME
+ _ZNK22QGraphicsItemAnimation17horizontalShearAtEf @ 9502 NONAME
+ _ZNK22QGraphicsItemAnimation4itemEv @ 9503 NONAME
+ _ZNK22QGraphicsItemAnimation5posAtEf @ 9504 NONAME
+ _ZNK22QGraphicsItemAnimation7posListEv @ 9505 NONAME
+ _ZNK22QGraphicsItemAnimation8matrixAtEf @ 9506 NONAME
+ _ZNK22QGraphicsItemAnimation8timeLineEv @ 9507 NONAME
+ _ZNK22QGraphicsItemAnimation9scaleListEv @ 9508 NONAME
+ _ZNK22QGraphicsItemAnimation9shearListEv @ 9509 NONAME
+ _ZNK22QGraphicsOpacityEffect10metaObjectEv @ 9510 NONAME
+ _ZNK22QGraphicsOpacityEffect11opacityMaskEv @ 9511 NONAME
+ _ZNK22QGraphicsOpacityEffect7opacityEv @ 9512 NONAME
+ _ZNK23QGraphicsColorizeEffect10metaObjectEv @ 9513 NONAME
+ _ZNK23QGraphicsColorizeEffect5colorEv @ 9514 NONAME
+ _ZNK23QGraphicsColorizeEffect8strengthEv @ 9515 NONAME
+ _ZNK23QGraphicsPixelizeEffect10metaObjectEv @ 9516 NONAME
+ _ZNK23QGraphicsPixelizeEffect9pixelSizeEv @ 9517 NONAME
+ _ZNK23QGraphicsSceneHelpEvent8scenePosEv @ 9518 NONAME
+ _ZNK23QGraphicsSceneHelpEvent9screenPosEv @ 9519 NONAME
+ _ZNK23QGraphicsSceneMoveEvent6newPosEv @ 9520 NONAME
+ _ZNK23QGraphicsSceneMoveEvent6oldPosEv @ 9521 NONAME
+ _ZNK23QGraphicsSimpleTextItem10opaqueAreaEv @ 9522 NONAME
+ _ZNK23QGraphicsSimpleTextItem12boundingRectEv @ 9523 NONAME
+ _ZNK23QGraphicsSimpleTextItem12isObscuredByEPK13QGraphicsItem @ 9524 NONAME
+ _ZNK23QGraphicsSimpleTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 9525 NONAME
+ _ZNK23QGraphicsSimpleTextItem4fontEv @ 9526 NONAME
+ _ZNK23QGraphicsSimpleTextItem4textEv @ 9527 NONAME
+ _ZNK23QGraphicsSimpleTextItem4typeEv @ 9528 NONAME
+ _ZNK23QGraphicsSimpleTextItem5shapeEv @ 9529 NONAME
+ _ZNK23QGraphicsSimpleTextItem8containsERK7QPointF @ 9530 NONAME
+ _ZNK23QGraphicsSimpleTextItem9extensionERK8QVariant @ 9531 NONAME
+ _ZNK23QPaintBufferSignalProxy10metaObjectEv @ 9532 NONAME
+ _ZNK23QPixmapDropShadowFilter10blurRadiusEv @ 9533 NONAME
+ _ZNK23QPixmapDropShadowFilter10metaObjectEv @ 9534 NONAME
+ _ZNK23QPixmapDropShadowFilter15boundingRectForERK6QRectF @ 9535 NONAME
+ _ZNK23QPixmapDropShadowFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9536 NONAME
+ _ZNK23QPixmapDropShadowFilter5colorEv @ 9537 NONAME
+ _ZNK23QPixmapDropShadowFilter6offsetEv @ 9538 NONAME
+ _ZNK23QTreeWidgetItemIterator12matchesFlagsEPK15QTreeWidgetItem @ 9539 NONAME
+ _ZNK23QWindowStateChangeEvent10isOverrideEv @ 9540 NONAME
+ _ZNK24QGraphicsGrayscaleEffect10metaObjectEv @ 9541 NONAME
+ _ZNK24QGraphicsGrayscaleEffect8strengthEv @ 9542 NONAME
+ _ZNK24QGraphicsSceneHoverEvent12lastScenePosEv @ 9543 NONAME
+ _ZNK24QGraphicsSceneHoverEvent13lastScreenPosEv @ 9544 NONAME
+ _ZNK24QGraphicsSceneHoverEvent3posEv @ 9545 NONAME
+ _ZNK24QGraphicsSceneHoverEvent7lastPosEv @ 9546 NONAME
+ _ZNK24QGraphicsSceneHoverEvent8scenePosEv @ 9547 NONAME
+ _ZNK24QGraphicsSceneHoverEvent9modifiersEv @ 9548 NONAME
+ _ZNK24QGraphicsSceneHoverEvent9screenPosEv @ 9549 NONAME
+ _ZNK24QGraphicsSceneMouseEvent12lastScenePosEv @ 9550 NONAME
+ _ZNK24QGraphicsSceneMouseEvent13buttonDownPosEN2Qt11MouseButtonE @ 9551 NONAME
+ _ZNK24QGraphicsSceneMouseEvent13lastScreenPosEv @ 9552 NONAME
+ _ZNK24QGraphicsSceneMouseEvent18buttonDownScenePosEN2Qt11MouseButtonE @ 9553 NONAME
+ _ZNK24QGraphicsSceneMouseEvent19buttonDownScreenPosEN2Qt11MouseButtonE @ 9554 NONAME
+ _ZNK24QGraphicsSceneMouseEvent3posEv @ 9555 NONAME
+ _ZNK24QGraphicsSceneMouseEvent6buttonEv @ 9556 NONAME
+ _ZNK24QGraphicsSceneMouseEvent7buttonsEv @ 9557 NONAME
+ _ZNK24QGraphicsSceneMouseEvent7lastPosEv @ 9558 NONAME
+ _ZNK24QGraphicsSceneMouseEvent8scenePosEv @ 9559 NONAME
+ _ZNK24QGraphicsSceneMouseEvent9modifiersEv @ 9560 NONAME
+ _ZNK24QGraphicsSceneMouseEvent9screenPosEv @ 9561 NONAME
+ _ZNK24QGraphicsSceneWheelEvent11orientationEv @ 9562 NONAME
+ _ZNK24QGraphicsSceneWheelEvent3posEv @ 9563 NONAME
+ _ZNK24QGraphicsSceneWheelEvent5deltaEv @ 9564 NONAME
+ _ZNK24QGraphicsSceneWheelEvent7buttonsEv @ 9565 NONAME
+ _ZNK24QGraphicsSceneWheelEvent8scenePosEv @ 9566 NONAME
+ _ZNK24QGraphicsSceneWheelEvent9modifiersEv @ 9567 NONAME
+ _ZNK24QGraphicsSceneWheelEvent9screenPosEv @ 9568 NONAME
+ _ZNK24QPixmapConvolutionFilter10metaObjectEv @ 9569 NONAME
+ _ZNK24QPixmapConvolutionFilter15boundingRectForERK6QRectF @ 9570 NONAME
+ _ZNK24QPixmapConvolutionFilter17convolutionKernelEv @ 9571 NONAME
+ _ZNK24QPixmapConvolutionFilter4drawEP8QPainterRK7QPointFRK7QPixmapRK6QRectF @ 9572 NONAME
+ _ZNK24QPixmapConvolutionFilter4rowsEv @ 9573 NONAME
+ _ZNK24QPixmapConvolutionFilter7columnsEv @ 9574 NONAME
+ _ZNK24QPlainTextDocumentLayout10metaObjectEv @ 9575 NONAME
+ _ZNK24QPlainTextDocumentLayout11cursorWidthEv @ 9576 NONAME
+ _ZNK24QPlainTextDocumentLayout12documentSizeEv @ 9577 NONAME
+ _ZNK24QPlainTextDocumentLayout17blockBoundingRectERK10QTextBlock @ 9578 NONAME
+ _ZNK24QPlainTextDocumentLayout17ensureBlockLayoutERK10QTextBlock @ 9579 NONAME
+ _ZNK24QPlainTextDocumentLayout17frameBoundingRectEP10QTextFrame @ 9580 NONAME
+ _ZNK24QPlainTextDocumentLayout4privEv @ 9581 NONAME
+ _ZNK24QPlainTextDocumentLayout7hitTestERK7QPointFN2Qt15HitTestAccuracyE @ 9582 NONAME
+ _ZNK24QPlainTextDocumentLayout9pageCountEv @ 9583 NONAME
+ _ZNK24QPlainTextDocumentLayout9textWidthEv @ 9584 NONAME
+ _ZNK25QGraphicsDropShadowEffect10blurRadiusEv @ 9585 NONAME
+ _ZNK25QGraphicsDropShadowEffect10metaObjectEv @ 9586 NONAME
+ _ZNK25QGraphicsDropShadowEffect15boundingRectForERK6QRectF @ 9587 NONAME
+ _ZNK25QGraphicsDropShadowEffect5colorEv @ 9588 NONAME
+ _ZNK25QGraphicsDropShadowEffect6offsetEv @ 9589 NONAME
+ _ZNK25QGraphicsSceneResizeEvent7newSizeEv @ 9590 NONAME
+ _ZNK25QGraphicsSceneResizeEvent7oldSizeEv @ 9591 NONAME
+ _ZNK26QAbstractGraphicsShapeItem10opaqueAreaEv @ 9592 NONAME
+ _ZNK26QAbstractGraphicsShapeItem12isObscuredByEPK13QGraphicsItem @ 9593 NONAME
+ _ZNK26QAbstractGraphicsShapeItem3penEv @ 9594 NONAME
+ _ZNK26QAbstractGraphicsShapeItem5brushEv @ 9595 NONAME
+ _ZNK27QAbstractTextDocumentLayout10metaObjectEv @ 9596 NONAME
+ _ZNK27QAbstractTextDocumentLayout11paintDeviceEv @ 9597 NONAME
+ _ZNK27QAbstractTextDocumentLayout16handlerForObjectEi @ 9598 NONAME
+ _ZNK27QAbstractTextDocumentLayout8anchorAtERK7QPointF @ 9599 NONAME
+ _ZNK27QAbstractTextDocumentLayout8documentEv @ 9600 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent10dropActionEv @ 9601 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent14proposedActionEv @ 9602 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent15possibleActionsEv @ 9603 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent3posEv @ 9604 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent6sourceEv @ 9605 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent7buttonsEv @ 9606 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent8mimeDataEv @ 9607 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent8scenePosEv @ 9608 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent9modifiersEv @ 9609 NONAME
+ _ZNK27QGraphicsSceneDragDropEvent9screenPosEv @ 9610 NONAME
+ _ZNK30QGraphicsSceneContextMenuEvent3posEv @ 9611 NONAME
+ _ZNK30QGraphicsSceneContextMenuEvent6reasonEv @ 9612 NONAME
+ _ZNK30QGraphicsSceneContextMenuEvent8scenePosEv @ 9613 NONAME
+ _ZNK30QGraphicsSceneContextMenuEvent9modifiersEv @ 9614 NONAME
+ _ZNK30QGraphicsSceneContextMenuEvent9screenPosEv @ 9615 NONAME
+ _ZNK4QCss13StyleSelector14nodeNameEqualsENS0_7NodePtrERK7QString @ 9616 NONAME
+ _ZNK4QCss13StyleSelector7nodeIdsENS0_7NodePtrE @ 9617 NONAME
+ _ZNK4QCss5Value8toStringEv @ 9618 NONAME
+ _ZNK4QCss6Parser13unquotedLexemEv @ 9619 NONAME
+ _ZNK4QCss6Symbol5lexemEv @ 9620 NONAME
+ _ZNK4QPen10dashOffsetEv @ 9621 NONAME
+ _ZNK4QPen10isCosmeticEv @ 9622 NONAME
+ _ZNK4QPen10miterLimitEv @ 9623 NONAME
+ _ZNK4QPen11dashPatternEv @ 9624 NONAME
+ _ZNK4QPen5brushEv @ 9625 NONAME
+ _ZNK4QPen5colorEv @ 9626 NONAME
+ _ZNK4QPen5styleEv @ 9627 NONAME
+ _ZNK4QPen5widthEv @ 9628 NONAME
+ _ZNK4QPen6widthFEv @ 9629 NONAME
+ _ZNK4QPen7isSolidEv @ 9630 NONAME
+ _ZNK4QPen8capStyleEv @ 9631 NONAME
+ _ZNK4QPen9joinStyleEv @ 9632 NONAME
+ _ZNK4QPencv8QVariantEv @ 9633 NONAME
+ _ZNK4QPeneqERKS_ @ 9634 NONAME
+ _ZNK5QDial10metaObjectEv @ 9635 NONAME
+ _ZNK5QDial11notchTargetEv @ 9636 NONAME
+ _ZNK5QDial14notchesVisibleEv @ 9637 NONAME
+ _ZNK5QDial15initStyleOptionEP18QStyleOptionSlider @ 9638 NONAME
+ _ZNK5QDial15minimumSizeHintEv @ 9639 NONAME
+ _ZNK5QDial8sizeHintEv @ 9640 NONAME
+ _ZNK5QDial8wrappingEv @ 9641 NONAME
+ _ZNK5QDial9notchSizeEv @ 9642 NONAME
+ _ZNK5QDrag10metaObjectEv @ 9643 NONAME
+ _ZNK5QDrag6pixmapEv @ 9644 NONAME
+ _ZNK5QDrag6sourceEv @ 9645 NONAME
+ _ZNK5QDrag6targetEv @ 9646 NONAME
+ _ZNK5QDrag7hotSpotEv @ 9647 NONAME
+ _ZNK5QDrag8mimeDataEv @ 9648 NONAME
+ _ZNK5QFont10exactMatchEv @ 9649 NONAME
+ _ZNK5QFont10fixedPitchEv @ 9650 NONAME
+ _ZNK5QFont10pointSizeFEv @ 9651 NONAME
+ _ZNK5QFont11wordSpacingEv @ 9652 NONAME
+ _ZNK5QFont13defaultFamilyEv @ 9653 NONAME
+ _ZNK5QFont13letterSpacingEv @ 9654 NONAME
+ _ZNK5QFont13styleStrategyEv @ 9655 NONAME
+ _ZNK5QFont14capitalizationEv @ 9656 NONAME
+ _ZNK5QFont16lastResortFamilyEv @ 9657 NONAME
+ _ZNK5QFont17letterSpacingTypeEv @ 9658 NONAME
+ _ZNK5QFont3keyEv @ 9659 NONAME
+ _ZNK5QFont5styleEv @ 9660 NONAME
+ _ZNK5QFont6familyEv @ 9661 NONAME
+ _ZNK5QFont6weightEv @ 9662 NONAME
+ _ZNK5QFont7kerningEv @ 9663 NONAME
+ _ZNK5QFont7rawModeEv @ 9664 NONAME
+ _ZNK5QFont7resolveERKS_ @ 9665 NONAME
+ _ZNK5QFont7stretchEv @ 9666 NONAME
+ _ZNK5QFont8isCopyOfERKS_ @ 9667 NONAME
+ _ZNK5QFont8overlineEv @ 9668 NONAME
+ _ZNK5QFont8toStringEv @ 9669 NONAME
+ _ZNK5QFont9pixelSizeEv @ 9670 NONAME
+ _ZNK5QFont9pointSizeEv @ 9671 NONAME
+ _ZNK5QFont9strikeOutEv @ 9672 NONAME
+ _ZNK5QFont9styleHintEv @ 9673 NONAME
+ _ZNK5QFont9underlineEv @ 9674 NONAME
+ _ZNK5QFontcv8QVariantEv @ 9675 NONAME
+ _ZNK5QFonteqERKS_ @ 9676 NONAME
+ _ZNK5QFontltERKS_ @ 9677 NONAME
+ _ZNK5QFontneERKS_ @ 9678 NONAME
+ _ZNK5QIcon10actualSizeERK5QSizeNS_4ModeENS_5StateE @ 9679 NONAME
+ _ZNK5QIcon10isDetachedEv @ 9680 NONAME
+ _ZNK5QIcon12serialNumberEv @ 9681 NONAME
+ _ZNK5QIcon14availableSizesENS_4ModeENS_5StateE @ 9682 NONAME
+ _ZNK5QIcon5paintEP8QPainterRK5QRect6QFlagsIN2Qt13AlignmentFlagEENS_4ModeENS_5StateE @ 9683 NONAME
+ _ZNK5QIcon6isNullEv @ 9684 NONAME
+ _ZNK5QIcon6pixmapERK5QSizeNS_4ModeENS_5StateE @ 9685 NONAME
+ _ZNK5QIcon8cacheKeyEv @ 9686 NONAME
+ _ZNK5QIconcv8QVariantEv @ 9687 NONAME
+ _ZNK5QMenu10menuActionEv @ 9688 NONAME
+ _ZNK5QMenu10metaObjectEv @ 9689 NONAME
+ _ZNK5QMenu11columnCountEv @ 9690 NONAME
+ _ZNK5QMenu12activeActionEv @ 9691 NONAME
+ _ZNK5QMenu13defaultActionEv @ 9692 NONAME
+ _ZNK5QMenu14actionGeometryEP7QAction @ 9693 NONAME
+ _ZNK5QMenu15initStyleOptionEP20QStyleOptionMenuItemPK7QAction @ 9694 NONAME
+ _ZNK5QMenu16isTearOffEnabledEv @ 9695 NONAME
+ _ZNK5QMenu20isTearOffMenuVisibleEv @ 9696 NONAME
+ _ZNK5QMenu21separatorsCollapsibleEv @ 9697 NONAME
+ _ZNK5QMenu4iconEv @ 9698 NONAME
+ _ZNK5QMenu5titleEv @ 9699 NONAME
+ _ZNK5QMenu7isEmptyEv @ 9700 NONAME
+ _ZNK5QMenu8actionAtERK6QPoint @ 9701 NONAME
+ _ZNK5QMenu8sizeHintEv @ 9702 NONAME
+ _ZNK6QBrush12textureImageEv @ 9703 NONAME
+ _ZNK6QBrush7textureEv @ 9704 NONAME
+ _ZNK6QBrush8gradientEv @ 9705 NONAME
+ _ZNK6QBrush8isOpaqueEv @ 9706 NONAME
+ _ZNK6QBrushcv8QVariantEv @ 9707 NONAME
+ _ZNK6QBrusheqERKS_ @ 9708 NONAME
+ _ZNK6QColor10lightnessFEv @ 9709 NONAME
+ _ZNK6QColor10saturationEv @ 9710 NONAME
+ _ZNK6QColor11saturationFEv @ 9711 NONAME
+ _ZNK6QColor13hslSaturationEv @ 9712 NONAME
+ _ZNK6QColor13hsvSaturationEv @ 9713 NONAME
+ _ZNK6QColor14hslSaturationFEv @ 9714 NONAME
+ _ZNK6QColor14hsvSaturationFEv @ 9715 NONAME
+ _ZNK6QColor3hueEv @ 9716 NONAME
+ _ZNK6QColor3redEv @ 9717 NONAME
+ _ZNK6QColor3rgbEv @ 9718 NONAME
+ _ZNK6QColor4blueEv @ 9719 NONAME
+ _ZNK6QColor4cyanEv @ 9720 NONAME
+ _ZNK6QColor4darkEi @ 9721 NONAME
+ _ZNK6QColor4hueFEv @ 9722 NONAME
+ _ZNK6QColor4nameEv @ 9723 NONAME
+ _ZNK6QColor4redFEv @ 9724 NONAME
+ _ZNK6QColor4rgbaEv @ 9725 NONAME
+ _ZNK6QColor5alphaEv @ 9726 NONAME
+ _ZNK6QColor5blackEv @ 9727 NONAME
+ _ZNK6QColor5blueFEv @ 9728 NONAME
+ _ZNK6QColor5cyanFEv @ 9729 NONAME
+ _ZNK6QColor5greenEv @ 9730 NONAME
+ _ZNK6QColor5lightEi @ 9731 NONAME
+ _ZNK6QColor5toHslEv @ 9732 NONAME
+ _ZNK6QColor5toHsvEv @ 9733 NONAME
+ _ZNK6QColor5toRgbEv @ 9734 NONAME
+ _ZNK6QColor5valueEv @ 9735 NONAME
+ _ZNK6QColor6alphaFEv @ 9736 NONAME
+ _ZNK6QColor6blackFEv @ 9737 NONAME
+ _ZNK6QColor6getHslEPiS0_S0_S0_ @ 9738 NONAME
+ _ZNK6QColor6getHsvEPiS0_S0_S0_ @ 9739 NONAME
+ _ZNK6QColor6getRgbEPiS0_S0_S0_ @ 9740 NONAME
+ _ZNK6QColor6greenFEv @ 9741 NONAME
+ _ZNK6QColor6hslHueEv @ 9742 NONAME
+ _ZNK6QColor6hsvHueEv @ 9743 NONAME
+ _ZNK6QColor6toCmykEv @ 9744 NONAME
+ _ZNK6QColor6valueFEv @ 9745 NONAME
+ _ZNK6QColor6yellowEv @ 9746 NONAME
+ _ZNK6QColor7getHslFEPfS0_S0_S0_ @ 9747 NONAME
+ _ZNK6QColor7getHsvFEPfS0_S0_S0_ @ 9748 NONAME
+ _ZNK6QColor7getRgbFEPfS0_S0_S0_ @ 9749 NONAME
+ _ZNK6QColor7hslHueFEv @ 9750 NONAME
+ _ZNK6QColor7hsvHueFEv @ 9751 NONAME
+ _ZNK6QColor7magentaEv @ 9752 NONAME
+ _ZNK6QColor7yellowFEv @ 9753 NONAME
+ _ZNK6QColor8magentaFEv @ 9754 NONAME
+ _ZNK6QColor9convertToENS_4SpecE @ 9755 NONAME
+ _ZNK6QColor9lightnessEv @ 9756 NONAME
+ _ZNK6QColorcv8QVariantEv @ 9757 NONAME
+ _ZNK6QColoreqERKS_ @ 9758 NONAME
+ _ZNK6QColorneERKS_ @ 9759 NONAME
+ _ZNK6QFrame10frameShapeEv @ 9760 NONAME
+ _ZNK6QFrame10frameStyleEv @ 9761 NONAME
+ _ZNK6QFrame10frameWidthEv @ 9762 NONAME
+ _ZNK6QFrame10metaObjectEv @ 9763 NONAME
+ _ZNK6QFrame11frameShadowEv @ 9764 NONAME
+ _ZNK6QFrame12midLineWidthEv @ 9765 NONAME
+ _ZNK6QFrame8sizeHintEv @ 9766 NONAME
+ _ZNK6QFrame9frameRectEv @ 9767 NONAME
+ _ZNK6QFrame9lineWidthEv @ 9768 NONAME
+ _ZNK6QImage10colorTableEv @ 9769 NONAME
+ _ZNK6QImage10isDetachedEv @ 9770 NONAME
+ _ZNK6QImage10pixelIndexEii @ 9771 NONAME
+ _ZNK6QImage10rgbSwappedEv @ 9772 NONAME
+ _ZNK6QImage11isGrayscaleEv @ 9773 NONAME
+ _ZNK6QImage11paintEngineEv @ 9774 NONAME
+ _ZNK6QImage11transformedERK10QTransformN2Qt18TransformationModeE @ 9775 NONAME
+ _ZNK6QImage11transformedERK7QMatrixN2Qt18TransformationModeE @ 9776 NONAME
+ _ZNK6QImage12alphaChannelEv @ 9777 NONAME
+ _ZNK6QImage12bytesPerLineEv @ 9778 NONAME
+ _ZNK6QImage12serialNumberEv @ 9779 NONAME
+ _ZNK6QImage13dotsPerMeterXEv @ 9780 NONAME
+ _ZNK6QImage13dotsPerMeterYEv @ 9781 NONAME
+ _ZNK6QImage13scaledToWidthEiN2Qt18TransformationModeE @ 9782 NONAME
+ _ZNK6QImage13textLanguagesEv @ 9783 NONAME
+ _ZNK6QImage14scaledToHeightEiN2Qt18TransformationModeE @ 9784 NONAME
+ _ZNK6QImage15convertToFormatENS_6FormatE6QFlagsIN2Qt19ImageConversionFlagEE @ 9785 NONAME
+ _ZNK6QImage15convertToFormatENS_6FormatERK7QVectorIjE6QFlagsIN2Qt19ImageConversionFlagEE @ 9786 NONAME
+ _ZNK6QImage15createAlphaMaskE6QFlagsIN2Qt19ImageConversionFlagEE @ 9787 NONAME
+ _ZNK6QImage15hasAlphaChannelEv @ 9788 NONAME
+ _ZNK6QImage19createHeuristicMaskEb @ 9789 NONAME
+ _ZNK6QImage19createMaskFromColorEjN2Qt8MaskModeE @ 9790 NONAME
+ _ZNK6QImage4bitsEv @ 9791 NONAME
+ _ZNK6QImage4copyERK5QRect @ 9792 NONAME
+ _ZNK6QImage4rectEv @ 9793 NONAME
+ _ZNK6QImage4saveEP9QIODevicePKci @ 9794 NONAME
+ _ZNK6QImage4saveERK7QStringPKci @ 9795 NONAME
+ _ZNK6QImage4sizeEv @ 9796 NONAME
+ _ZNK6QImage4textEPKcS1_ @ 9797 NONAME
+ _ZNK6QImage4textERK17QImageTextKeyLang @ 9798 NONAME
+ _ZNK6QImage4textERK7QString @ 9799 NONAME
+ _ZNK6QImage5colorEi @ 9800 NONAME
+ _ZNK6QImage5depthEv @ 9801 NONAME
+ _ZNK6QImage5pixelEii @ 9802 NONAME
+ _ZNK6QImage5validEii @ 9803 NONAME
+ _ZNK6QImage5widthEv @ 9804 NONAME
+ _ZNK6QImage6formatEv @ 9805 NONAME
+ _ZNK6QImage6heightEv @ 9806 NONAME
+ _ZNK6QImage6isNullEv @ 9807 NONAME
+ _ZNK6QImage6metricEN12QPaintDevice17PaintDeviceMetricE @ 9808 NONAME
+ _ZNK6QImage6offsetEv @ 9809 NONAME
+ _ZNK6QImage6scaledERK5QSizeN2Qt15AspectRatioModeENS3_18TransformationModeE @ 9810 NONAME
+ _ZNK6QImage7allGrayEv @ 9811 NONAME
+ _ZNK6QImage7devTypeEv @ 9812 NONAME
+ _ZNK6QImage8cacheKeyEv @ 9813 NONAME
+ _ZNK6QImage8mirroredEbb @ 9814 NONAME
+ _ZNK6QImage8numBytesEv @ 9815 NONAME
+ _ZNK6QImage8scanLineEi @ 9816 NONAME
+ _ZNK6QImage8textKeysEv @ 9817 NONAME
+ _ZNK6QImage8textListEv @ 9818 NONAME
+ _ZNK6QImage9numColorsEv @ 9819 NONAME
+ _ZNK6QImagecv8QVariantEv @ 9820 NONAME
+ _ZNK6QImageeqERKS_ @ 9821 NONAME
+ _ZNK6QImageneERKS_ @ 9822 NONAME
+ _ZNK6QLabel10metaObjectEv @ 9823 NONAME
+ _ZNK6QLabel10textFormatEv @ 9824 NONAME
+ _ZNK6QLabel14heightForWidthEi @ 9825 NONAME
+ _ZNK6QLabel15minimumSizeHintEv @ 9826 NONAME
+ _ZNK6QLabel17hasScaledContentsEv @ 9827 NONAME
+ _ZNK6QLabel17openExternalLinksEv @ 9828 NONAME
+ _ZNK6QLabel20textInteractionFlagsEv @ 9829 NONAME
+ _ZNK6QLabel4textEv @ 9830 NONAME
+ _ZNK6QLabel5buddyEv @ 9831 NONAME
+ _ZNK6QLabel5movieEv @ 9832 NONAME
+ _ZNK6QLabel6indentEv @ 9833 NONAME
+ _ZNK6QLabel6marginEv @ 9834 NONAME
+ _ZNK6QLabel6pixmapEv @ 9835 NONAME
+ _ZNK6QLabel7pictureEv @ 9836 NONAME
+ _ZNK6QLabel8sizeHintEv @ 9837 NONAME
+ _ZNK6QLabel8wordWrapEv @ 9838 NONAME
+ _ZNK6QLabel9alignmentEv @ 9839 NONAME
+ _ZNK6QMovie10frameCountEv @ 9840 NONAME
+ _ZNK6QMovie10metaObjectEv @ 9841 NONAME
+ _ZNK6QMovie12currentImageEv @ 9842 NONAME
+ _ZNK6QMovie13currentPixmapEv @ 9843 NONAME
+ _ZNK6QMovie14nextFrameDelayEv @ 9844 NONAME
+ _ZNK6QMovie15backgroundColorEv @ 9845 NONAME
+ _ZNK6QMovie18currentFrameNumberEv @ 9846 NONAME
+ _ZNK6QMovie5speedEv @ 9847 NONAME
+ _ZNK6QMovie5stateEv @ 9848 NONAME
+ _ZNK6QMovie6deviceEv @ 9849 NONAME
+ _ZNK6QMovie6formatEv @ 9850 NONAME
+ _ZNK6QMovie7isValidEv @ 9851 NONAME
+ _ZNK6QMovie8fileNameEv @ 9852 NONAME
+ _ZNK6QMovie9cacheModeEv @ 9853 NONAME
+ _ZNK6QMovie9frameRectEv @ 9854 NONAME
+ _ZNK6QMovie9loopCountEv @ 9855 NONAME
+ _ZNK6QSound10isFinishedEv @ 9856 NONAME
+ _ZNK6QSound10metaObjectEv @ 9857 NONAME
+ _ZNK6QSound14loopsRemainingEv @ 9858 NONAME
+ _ZNK6QSound5loopsEv @ 9859 NONAME
+ _ZNK6QSound8fileNameEv @ 9860 NONAME
+ _ZNK6QStyle10metaObjectEv @ 9861 NONAME
+ _ZNK6QStyle12drawItemTextEP8QPainterRK5QRectiRK8QPalettebRK7QStringNS5_9ColorRoleE @ 9862 NONAME
+ _ZNK6QStyle12itemTextRectERK12QFontMetricsRK5QRectibRK7QString @ 9863 NONAME
+ _ZNK6QStyle12standardIconENS_14StandardPixmapEPK12QStyleOptionPK7QWidget @ 9864 NONAME
+ _ZNK6QStyle13layoutSpacingEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 9865 NONAME
+ _ZNK6QStyle14drawItemPixmapEP8QPainterRK5QRectiRK7QPixmap @ 9866 NONAME
+ _ZNK6QStyle14itemPixmapRectERK5QRectiRK7QPixmap @ 9867 NONAME
+ _ZNK6QStyle15standardPaletteEv @ 9868 NONAME
+ _ZNK6QStyle21combinedLayoutSpacingE6QFlagsIN11QSizePolicy11ControlTypeEES3_N2Qt11OrientationEP12QStyleOptionP7QWidget @ 9869 NONAME
+ _ZNK6QStyle26standardIconImplementationENS_14StandardPixmapEPK12QStyleOptionPK7QWidget @ 9870 NONAME
+ _ZNK6QStyle27layoutSpacingImplementationEN11QSizePolicy11ControlTypeES1_N2Qt11OrientationEPK12QStyleOptionPK7QWidget @ 9871 NONAME
+ _ZNK6QStyle5proxyEv @ 9872 NONAME
+ _ZNK7QAction10autoRepeatEv @ 9873 NONAME
+ _ZNK7QAction10metaObjectEv @ 9874 NONAME
+ _ZNK7QAction11actionGroupEv @ 9875 NONAME
+ _ZNK7QAction11isCheckableEv @ 9876 NONAME
+ _ZNK7QAction11isSeparatorEv @ 9877 NONAME
+ _ZNK7QAction11softKeyRoleEv @ 9878 NONAME
+ _ZNK7QAction12parentWidgetEv @ 9879 NONAME
+ _ZNK7QAction15shortcutContextEv @ 9880 NONAME
+ _ZNK7QAction17associatedWidgetsEv @ 9881 NONAME
+ _ZNK7QAction19isIconVisibleInMenuEv @ 9882 NONAME
+ _ZNK7QAction25associatedGraphicsWidgetsEv @ 9883 NONAME
+ _ZNK7QAction4dataEv @ 9884 NONAME
+ _ZNK7QAction4fontEv @ 9885 NONAME
+ _ZNK7QAction4iconEv @ 9886 NONAME
+ _ZNK7QAction4menuEv @ 9887 NONAME
+ _ZNK7QAction4textEv @ 9888 NONAME
+ _ZNK7QAction7toolTipEv @ 9889 NONAME
+ _ZNK7QAction8iconTextEv @ 9890 NONAME
+ _ZNK7QAction8menuRoleEv @ 9891 NONAME
+ _ZNK7QAction8priorityEv @ 9892 NONAME
+ _ZNK7QAction8shortcutEv @ 9893 NONAME
+ _ZNK7QAction9isCheckedEv @ 9894 NONAME
+ _ZNK7QAction9isEnabledEv @ 9895 NONAME
+ _ZNK7QAction9isVisibleEv @ 9896 NONAME
+ _ZNK7QAction9shortcutsEv @ 9897 NONAME
+ _ZNK7QAction9statusTipEv @ 9898 NONAME
+ _ZNK7QAction9whatsThisEv @ 9899 NONAME
+ _ZNK7QBezier10addIfCloseEPff @ 9900 NONAME
+ _ZNK7QBezier12addToPolygonEP9QPolygonF @ 9901 NONAME
+ _ZNK7QBezier16bezierOnIntervalEff @ 9902 NONAME
+ _ZNK7QBezier17addToPolygonMixedEP9QPolygonF @ 9903 NONAME
+ _ZNK7QBezier17stationaryYPointsERfS0_ @ 9904 NONAME
+ _ZNK7QBezier21addToPolygonIterativeEP9QPolygonF @ 9905 NONAME
+ _ZNK7QBezier5tForYEfff @ 9906 NONAME
+ _ZNK7QBezier6boundsEv @ 9907 NONAME
+ _ZNK7QBezier6lengthEf @ 9908 NONAME
+ _ZNK7QBezier7shiftedEPS_iff @ 9909 NONAME
+ _ZNK7QBezier9tAtLengthEf @ 9910 NONAME
+ _ZNK7QBezier9toPolygonEv @ 9911 NONAME
+ _ZNK7QBitmap11transformedERK10QTransform @ 9912 NONAME
+ _ZNK7QBitmap11transformedERK7QMatrix @ 9913 NONAME
+ _ZNK7QBitmapcv8QVariantEv @ 9914 NONAME
+ _ZNK7QCursor4maskEv @ 9915 NONAME
+ _ZNK7QCursor5shapeEv @ 9916 NONAME
+ _ZNK7QCursor6bitmapEv @ 9917 NONAME
+ _ZNK7QCursor6handleEv @ 9918 NONAME
+ _ZNK7QCursor6pixmapEv @ 9919 NONAME
+ _ZNK7QCursor7hotSpotEv @ 9920 NONAME
+ _ZNK7QCursorcv8QVariantEv @ 9921 NONAME
+ _ZNK7QDialog10metaObjectEv @ 9922 NONAME
+ _ZNK7QDialog11orientationEv @ 9923 NONAME
+ _ZNK7QDialog15minimumSizeHintEv @ 9924 NONAME
+ _ZNK7QDialog17isSizeGripEnabledEv @ 9925 NONAME
+ _ZNK7QDialog6resultEv @ 9926 NONAME
+ _ZNK7QDialog8sizeHintEv @ 9927 NONAME
+ _ZNK7QDialog9extensionEv @ 9928 NONAME
+ _ZNK7QLayout10metaObjectEv @ 9929 NONAME
+ _ZNK7QLayout11maximumSizeEv @ 9930 NONAME
+ _ZNK7QLayout11minimumSizeEv @ 9931 NONAME
+ _ZNK7QLayout12contentsRectEv @ 9932 NONAME
+ _ZNK7QLayout12parentWidgetEv @ 9933 NONAME
+ _ZNK7QLayout13alignmentRectERK5QRect @ 9934 NONAME
+ _ZNK7QLayout13totalSizeHintEv @ 9935 NONAME
+ _ZNK7QLayout14sizeConstraintEv @ 9936 NONAME
+ _ZNK7QLayout16totalMaximumSizeEv @ 9937 NONAME
+ _ZNK7QLayout16totalMinimumSizeEv @ 9938 NONAME
+ _ZNK7QLayout18getContentsMarginsEPiS0_S0_S0_ @ 9939 NONAME
+ _ZNK7QLayout19expandingDirectionsEv @ 9940 NONAME
+ _ZNK7QLayout19totalHeightForWidthEi @ 9941 NONAME
+ _ZNK7QLayout6marginEv @ 9942 NONAME
+ _ZNK7QLayout7indexOfEP7QWidget @ 9943 NONAME
+ _ZNK7QLayout7isEmptyEv @ 9944 NONAME
+ _ZNK7QLayout7menuBarEv @ 9945 NONAME
+ _ZNK7QLayout7spacingEv @ 9946 NONAME
+ _ZNK7QLayout8geometryEv @ 9947 NONAME
+ _ZNK7QLayout9isEnabledEv @ 9948 NONAME
+ _ZNK7QMatrix12mapToPolygonERK5QRect @ 9949 NONAME
+ _ZNK7QMatrix3mapERK12QPainterPath @ 9950 NONAME
+ _ZNK7QMatrix3mapERK5QLine @ 9951 NONAME
+ _ZNK7QMatrix3mapERK6QLineF @ 9952 NONAME
+ _ZNK7QMatrix3mapERK6QPoint @ 9953 NONAME
+ _ZNK7QMatrix3mapERK7QPointF @ 9954 NONAME
+ _ZNK7QMatrix3mapERK7QRegion @ 9955 NONAME
+ _ZNK7QMatrix3mapERK8QPolygon @ 9956 NONAME
+ _ZNK7QMatrix3mapERK9QPolygonF @ 9957 NONAME
+ _ZNK7QMatrix3mapEffPfS0_ @ 9958 NONAME
+ _ZNK7QMatrix3mapEiiPiS0_ @ 9959 NONAME
+ _ZNK7QMatrix7mapRectERK5QRect @ 9960 NONAME
+ _ZNK7QMatrix7mapRectERK6QRectF @ 9961 NONAME
+ _ZNK7QMatrix8invertedEPb @ 9962 NONAME
+ _ZNK7QMatrixcv8QVariantEv @ 9963 NONAME
+ _ZNK7QMatrixeqERKS_ @ 9964 NONAME
+ _ZNK7QMatrixmlERKS_ @ 9965 NONAME
+ _ZNK7QMatrixneERKS_ @ 9966 NONAME
+ _ZNK7QPixmap10isDetachedEv @ 9967 NONAME
+ _ZNK7QPixmap10pixmapDataEv @ 9968 NONAME
+ _ZNK7QPixmap11paintEngineEv @ 9969 NONAME
+ _ZNK7QPixmap11transformedERK10QTransformN2Qt18TransformationModeE @ 9970 NONAME
+ _ZNK7QPixmap11transformedERK7QMatrixN2Qt18TransformationModeE @ 9971 NONAME
+ _ZNK7QPixmap12alphaChannelEv @ 9972 NONAME
+ _ZNK7QPixmap12serialNumberEv @ 9973 NONAME
+ _ZNK7QPixmap13scaledToWidthEiN2Qt18TransformationModeE @ 9974 NONAME
+ _ZNK7QPixmap14scaledToHeightEiN2Qt18TransformationModeE @ 9975 NONAME
+ _ZNK7QPixmap15hasAlphaChannelEv @ 9976 NONAME
+ _ZNK7QPixmap17toSymbianRSgImageEv @ 9977 NONAME
+ _ZNK7QPixmap19createHeuristicMaskEb @ 9978 NONAME
+ _ZNK7QPixmap19createMaskFromColorERK6QColor @ 9979 NONAME
+ _ZNK7QPixmap19createMaskFromColorERK6QColorN2Qt8MaskModeE @ 9980 NONAME
+ _ZNK7QPixmap19toSymbianCFbsBitmapEv @ 9981 NONAME
+ _ZNK7QPixmap4copyERK5QRect @ 9982 NONAME
+ _ZNK7QPixmap4maskEv @ 9983 NONAME
+ _ZNK7QPixmap4rectEv @ 9984 NONAME
+ _ZNK7QPixmap4saveEP9QIODevicePKci @ 9985 NONAME
+ _ZNK7QPixmap4saveERK7QStringPKci @ 9986 NONAME
+ _ZNK7QPixmap4sizeEv @ 9987 NONAME
+ _ZNK7QPixmap5depthEv @ 9988 NONAME
+ _ZNK7QPixmap5widthEv @ 9989 NONAME
+ _ZNK7QPixmap6heightEv @ 9990 NONAME
+ _ZNK7QPixmap6isNullEv @ 9991 NONAME
+ _ZNK7QPixmap6metricEN12QPaintDevice17PaintDeviceMetricE @ 9992 NONAME
+ _ZNK7QPixmap6scaledERK5QSizeN2Qt15AspectRatioModeENS3_18TransformationModeE @ 9993 NONAME
+ _ZNK7QPixmap7devTypeEv @ 9994 NONAME
+ _ZNK7QPixmap7toImageEv @ 9995 NONAME
+ _ZNK7QPixmap8cacheKeyEv @ 9996 NONAME
+ _ZNK7QPixmap8hasAlphaEv @ 9997 NONAME
+ _ZNK7QPixmap9doImageIOEP12QImageWriteri @ 9998 NONAME
+ _ZNK7QPixmap9isQBitmapEv @ 9999 NONAME
+ _ZNK7QPixmapcv8QVariantEv @ 10000 NONAME
+ _ZNK7QRegion10intersectsERK5QRect @ 10001 NONAME
+ _ZNK7QRegion10intersectsERKS_ @ 10002 NONAME
+ _ZNK7QRegion10translatedEii @ 10003 NONAME
+ _ZNK7QRegion12boundingRectEv @ 10004 NONAME
+ _ZNK7QRegion3eorERKS_ @ 10005 NONAME
+ _ZNK7QRegion4copyEv @ 10006 NONAME
+ _ZNK7QRegion5rectsEv @ 10007 NONAME
+ _ZNK7QRegion5uniteERK5QRect @ 10008 NONAME
+ _ZNK7QRegion5uniteERKS_ @ 10009 NONAME
+ _ZNK7QRegion7isEmptyEv @ 10010 NONAME
+ _ZNK7QRegion8containsERK5QRect @ 10011 NONAME
+ _ZNK7QRegion8containsERK6QPoint @ 10012 NONAME
+ _ZNK7QRegion8numRectsEv @ 10013 NONAME
+ _ZNK7QRegion8subtractERKS_ @ 10014 NONAME
+ _ZNK7QRegion9intersectERK5QRect @ 10015 NONAME
+ _ZNK7QRegion9intersectERKS_ @ 10016 NONAME
+ _ZNK7QRegionanERK5QRect @ 10017 NONAME
+ _ZNK7QRegionanERKS_ @ 10018 NONAME
+ _ZNK7QRegioncv8QVariantEv @ 10019 NONAME
+ _ZNK7QRegioneoERKS_ @ 10020 NONAME
+ _ZNK7QRegioneqERKS_ @ 10021 NONAME
+ _ZNK7QRegionmiERKS_ @ 10022 NONAME
+ _ZNK7QRegionorERKS_ @ 10023 NONAME
+ _ZNK7QRegionplERK5QRect @ 10024 NONAME
+ _ZNK7QRegionplERKS_ @ 10025 NONAME
+ _ZNK7QSlider10metaObjectEv @ 10026 NONAME
+ _ZNK7QSlider12tickIntervalEv @ 10027 NONAME
+ _ZNK7QSlider12tickPositionEv @ 10028 NONAME
+ _ZNK7QSlider15initStyleOptionEP18QStyleOptionSlider @ 10029 NONAME
+ _ZNK7QSlider15minimumSizeHintEv @ 10030 NONAME
+ _ZNK7QSlider8sizeHintEv @ 10031 NONAME
+ _ZNK7QTabBar10metaObjectEv @ 10032 NONAME
+ _ZNK7QTabBar10tabToolTipEi @ 10033 NONAME
+ _ZNK7QTabBar11tabSizeHintEi @ 10034 NONAME
+ _ZNK7QTabBar12currentIndexEv @ 10035 NONAME
+ _ZNK7QTabBar12documentModeEv @ 10036 NONAME
+ _ZNK7QTabBar12isTabEnabledEi @ 10037 NONAME
+ _ZNK7QTabBar12tabTextColorEi @ 10038 NONAME
+ _ZNK7QTabBar12tabWhatsThisEi @ 10039 NONAME
+ _ZNK7QTabBar12tabsClosableEv @ 10040 NONAME
+ _ZNK7QTabBar15initStyleOptionEP15QStyleOptionTabi @ 10041 NONAME
+ _ZNK7QTabBar15minimumSizeHintEv @ 10042 NONAME
+ _ZNK7QTabBar17usesScrollButtonsEv @ 10043 NONAME
+ _ZNK7QTabBar25selectionBehaviorOnRemoveEv @ 10044 NONAME
+ _ZNK7QTabBar5countEv @ 10045 NONAME
+ _ZNK7QTabBar5shapeEv @ 10046 NONAME
+ _ZNK7QTabBar5tabAtERK6QPoint @ 10047 NONAME
+ _ZNK7QTabBar7tabDataEi @ 10048 NONAME
+ _ZNK7QTabBar7tabIconEi @ 10049 NONAME
+ _ZNK7QTabBar7tabRectEi @ 10050 NONAME
+ _ZNK7QTabBar7tabTextEi @ 10051 NONAME
+ _ZNK7QTabBar8drawBaseEv @ 10052 NONAME
+ _ZNK7QTabBar8iconSizeEv @ 10053 NONAME
+ _ZNK7QTabBar8sizeHintEv @ 10054 NONAME
+ _ZNK7QTabBar9elideModeEv @ 10055 NONAME
+ _ZNK7QTabBar9expandingEv @ 10056 NONAME
+ _ZNK7QTabBar9isMovableEv @ 10057 NONAME
+ _ZNK7QTabBar9tabButtonEiNS_14ButtonPositionE @ 10058 NONAME
+ _ZNK7QWidget10focusProxyEv @ 10059 NONAME
+ _ZNK7QWidget10metaObjectEv @ 10060 NONAME
+ _ZNK7QWidget10sizePolicyEv @ 10061 NONAME
+ _ZNK7QWidget10styleSheetEv @ 10062 NONAME
+ _ZNK7QWidget10windowIconEv @ 10063 NONAME
+ _ZNK7QWidget10windowRoleEv @ 10064 NONAME
+ _ZNK7QWidget11acceptDropsEv @ 10065 NONAME
+ _ZNK7QWidget11focusPolicyEv @ 10066 NONAME
+ _ZNK7QWidget11focusWidgetEv @ 10067 NONAME
+ _ZNK7QWidget11isEnabledToEPS_ @ 10068 NONAME
+ _ZNK7QWidget11isMaximizedEv @ 10069 NONAME
+ _ZNK7QWidget11isMinimizedEv @ 10070 NONAME
+ _ZNK7QWidget11isVisibleToEPS_ @ 10071 NONAME
+ _ZNK7QWidget11mapToGlobalERK6QPoint @ 10072 NONAME
+ _ZNK7QWidget11mapToParentERK6QPoint @ 10073 NONAME
+ _ZNK7QWidget11maximumSizeEv @ 10074 NONAME
+ _ZNK7QWidget11minimumSizeEv @ 10075 NONAME
+ _ZNK7QWidget11paintEngineEv @ 10076 NONAME
+ _ZNK7QWidget11windowStateEv @ 10077 NONAME
+ _ZNK7QWidget11windowTitleEv @ 10078 NONAME
+ _ZNK7QWidget12childrenRectEv @ 10079 NONAME
+ _ZNK7QWidget12contentsRectEv @ 10080 NONAME
+ _ZNK7QWidget12hasEditFocusEv @ 10081 NONAME
+ _ZNK7QWidget12isAncestorOfEPKS_ @ 10082 NONAME
+ _ZNK7QWidget12isFullScreenEv @ 10083 NONAME
+ _ZNK7QWidget12saveGeometryEv @ 10084 NONAME
+ _ZNK7QWidget13frameGeometryEv @ 10085 NONAME
+ _ZNK7QWidget13mapFromGlobalERK6QPoint @ 10086 NONAME
+ _ZNK7QWidget13mapFromParentERK6QPoint @ 10087 NONAME
+ _ZNK7QWidget13sizeIncrementEv @ 10088 NONAME
+ _ZNK7QWidget13visibleRegionEv @ 10089 NONAME
+ _ZNK7QWidget13windowOpacityEv @ 10090 NONAME
+ _ZNK7QWidget13windowSurfaceEv @ 10091 NONAME
+ _ZNK7QWidget14backgroundRoleEv @ 10092 NONAME
+ _ZNK7QWidget14childrenRegionEv @ 10093 NONAME
+ _ZNK7QWidget14effectiveWinIdEv @ 10094 NONAME
+ _ZNK7QWidget14ensurePolishedEv @ 10095 NONAME
+ _ZNK7QWidget14foregroundRoleEv @ 10096 NONAME
+ _ZNK7QWidget14graphicsEffectEv @ 10097 NONAME
+ _ZNK7QWidget14heightForWidthEi @ 10098 NONAME
+ _ZNK7QWidget14isActiveWindowEv @ 10099 NONAME
+ _ZNK7QWidget14normalGeometryEv @ 10100 NONAME
+ _ZNK7QWidget14windowFilePathEv @ 10101 NONAME
+ _ZNK7QWidget14windowIconTextEv @ 10102 NONAME
+ _ZNK7QWidget14windowModalityEv @ 10103 NONAME
+ _ZNK7QWidget15contentsMarginsEv @ 10104 NONAME
+ _ZNK7QWidget15layoutDirectionEv @ 10105 NONAME
+ _ZNK7QWidget15minimumSizeHintEv @ 10106 NONAME
+ _ZNK7QWidget16inputMethodHintsEv @ 10107 NONAME
+ _ZNK7QWidget16inputMethodQueryEN2Qt16InputMethodQueryE @ 10108 NONAME
+ _ZNK7QWidget16isWindowModifiedEv @ 10109 NONAME
+ _ZNK7QWidget16nextInFocusChainEv @ 10110 NONAME
+ _ZNK7QWidget17contextMenuPolicyEv @ 10111 NONAME
+ _ZNK7QWidget18autoFillBackgroundEv @ 10112 NONAME
+ _ZNK7QWidget18getContentsMarginsEPiS0_S0_S0_ @ 10113 NONAME
+ _ZNK7QWidget18nativeParentWidgetEv @ 10114 NONAME
+ _ZNK7QWidget19graphicsProxyWidgetEv @ 10115 NONAME
+ _ZNK7QWidget1xEv @ 10116 NONAME
+ _ZNK7QWidget1yEv @ 10117 NONAME
+ _ZNK7QWidget20previousInFocusChainEv @ 10118 NONAME
+ _ZNK7QWidget20testAttribute_helperEN2Qt15WidgetAttributeE @ 10119 NONAME
+ _ZNK7QWidget3posEv @ 10120 NONAME
+ _ZNK7QWidget4maskEv @ 10121 NONAME
+ _ZNK7QWidget5mapToEPS_RK6QPoint @ 10122 NONAME
+ _ZNK7QWidget5styleEv @ 10123 NONAME
+ _ZNK7QWidget5winIdEv @ 10124 NONAME
+ _ZNK7QWidget6cursorEv @ 10125 NONAME
+ _ZNK7QWidget6handleEv @ 10126 NONAME
+ _ZNK7QWidget6layoutEv @ 10127 NONAME
+ _ZNK7QWidget6localeEv @ 10128 NONAME
+ _ZNK7QWidget6metricEN12QPaintDevice17PaintDeviceMetricE @ 10129 NONAME
+ _ZNK7QWidget6windowEv @ 10130 NONAME
+ _ZNK7QWidget7actionsEv @ 10131 NONAME
+ _ZNK7QWidget7childAtERK6QPoint @ 10132 NONAME
+ _ZNK7QWidget7devTypeEv @ 10133 NONAME
+ _ZNK7QWidget7mapFromEPS_RK6QPoint @ 10134 NONAME
+ _ZNK7QWidget7paletteEv @ 10135 NONAME
+ _ZNK7QWidget7toolTipEv @ 10136 NONAME
+ _ZNK7QWidget8baseSizeEv @ 10137 NONAME
+ _ZNK7QWidget8hasFocusEv @ 10138 NONAME
+ _ZNK7QWidget8sizeHintEv @ 10139 NONAME
+ _ZNK7QWidget9frameSizeEv @ 10140 NONAME
+ _ZNK7QWidget9statusTipEv @ 10141 NONAME
+ _ZNK7QWidget9whatsThisEv @ 10142 NONAME
+ _ZNK7QWizard10buttonTextENS_12WizardButtonE @ 10143 NONAME
+ _ZNK7QWizard10metaObjectEv @ 10144 NONAME
+ _ZNK7QWizard10testOptionENS_12WizardOptionE @ 10145 NONAME
+ _ZNK7QWizard11currentPageEv @ 10146 NONAME
+ _ZNK7QWizard11titleFormatEv @ 10147 NONAME
+ _ZNK7QWizard11wizardStyleEv @ 10148 NONAME
+ _ZNK7QWizard12visitedPagesEv @ 10149 NONAME
+ _ZNK7QWizard14hasVisitedPageEi @ 10150 NONAME
+ _ZNK7QWizard14subTitleFormatEv @ 10151 NONAME
+ _ZNK7QWizard4pageEi @ 10152 NONAME
+ _ZNK7QWizard5fieldERK7QString @ 10153 NONAME
+ _ZNK7QWizard6buttonENS_12WizardButtonE @ 10154 NONAME
+ _ZNK7QWizard6nextIdEv @ 10155 NONAME
+ _ZNK7QWizard6pixmapENS_12WizardPixmapE @ 10156 NONAME
+ _ZNK7QWizard7optionsEv @ 10157 NONAME
+ _ZNK7QWizard7pageIdsEv @ 10158 NONAME
+ _ZNK7QWizard7startIdEv @ 10159 NONAME
+ _ZNK7QWizard8sizeHintEv @ 10160 NONAME
+ _ZNK7QWizard9currentIdEv @ 10161 NONAME
+ _ZNK8QGesture10hasHotSpotEv @ 10162 NONAME
+ _ZNK8QGesture10metaObjectEv @ 10163 NONAME
+ _ZNK8QGesture11gestureTypeEv @ 10164 NONAME
+ _ZNK8QGesture12targetObjectEv @ 10165 NONAME
+ _ZNK8QGesture5stateEv @ 10166 NONAME
+ _ZNK8QGesture7hotSpotEv @ 10167 NONAME
+ _ZNK8QMdiArea10backgroundEv @ 10168 NONAME
+ _ZNK8QMdiArea10metaObjectEv @ 10169 NONAME
+ _ZNK8QMdiArea10testOptionENS_10AreaOptionE @ 10170 NONAME
+ _ZNK8QMdiArea11tabPositionEv @ 10171 NONAME
+ _ZNK8QMdiArea12documentModeEv @ 10172 NONAME
+ _ZNK8QMdiArea13subWindowListENS_11WindowOrderE @ 10173 NONAME
+ _ZNK8QMdiArea15activationOrderEv @ 10174 NONAME
+ _ZNK8QMdiArea15activeSubWindowEv @ 10175 NONAME
+ _ZNK8QMdiArea15minimumSizeHintEv @ 10176 NONAME
+ _ZNK8QMdiArea16currentSubWindowEv @ 10177 NONAME
+ _ZNK8QMdiArea8sizeHintEv @ 10178 NONAME
+ _ZNK8QMdiArea8tabShapeEv @ 10179 NONAME
+ _ZNK8QMdiArea8viewModeEv @ 10180 NONAME
+ _ZNK8QMenuBar10metaObjectEv @ 10181 NONAME
+ _ZNK8QMenuBar11isDefaultUpEv @ 10182 NONAME
+ _ZNK8QMenuBar12activeActionEv @ 10183 NONAME
+ _ZNK8QMenuBar12cornerWidgetEN2Qt6CornerE @ 10184 NONAME
+ _ZNK8QMenuBar14actionGeometryEP7QAction @ 10185 NONAME
+ _ZNK8QMenuBar14heightForWidthEi @ 10186 NONAME
+ _ZNK8QMenuBar15initStyleOptionEP20QStyleOptionMenuItemPK7QAction @ 10187 NONAME
+ _ZNK8QMenuBar15isNativeMenuBarEv @ 10188 NONAME
+ _ZNK8QMenuBar15minimumSizeHintEv @ 10189 NONAME
+ _ZNK8QMenuBar8actionAtERK6QPoint @ 10190 NONAME
+ _ZNK8QMenuBar8sizeHintEv @ 10191 NONAME
+ _ZNK8QPainter10backgroundEv @ 10192 NONAME
+ _ZNK8QPainter10clipRegionEv @ 10193 NONAME
+ _ZNK8QPainter11brushOriginEv @ 10194 NONAME
+ _ZNK8QPainter11fontMetricsEv @ 10195 NONAME
+ _ZNK8QPainter11hasClippingEv @ 10196 NONAME
+ _ZNK8QPainter11paintEngineEv @ 10197 NONAME
+ _ZNK8QPainter11renderHintsEv @ 10198 NONAME
+ _ZNK8QPainter11worldMatrixEv @ 10199 NONAME
+ _ZNK8QPainter12deviceMatrixEv @ 10200 NONAME
+ _ZNK8QPainter13matrixEnabledEv @ 10201 NONAME
+ _ZNK8QPainter14backgroundModeEv @ 10202 NONAME
+ _ZNK8QPainter14combinedMatrixEv @ 10203 NONAME
+ _ZNK8QPainter14worldTransformEv @ 10204 NONAME
+ _ZNK8QPainter15compositionModeEv @ 10205 NONAME
+ _ZNK8QPainter15deviceTransformEv @ 10206 NONAME
+ _ZNK8QPainter15layoutDirectionEv @ 10207 NONAME
+ _ZNK8QPainter17combinedTransformEv @ 10208 NONAME
+ _ZNK8QPainter18worldMatrixEnabledEv @ 10209 NONAME
+ _ZNK8QPainter20viewTransformEnabledEv @ 10210 NONAME
+ _ZNK8QPainter3penEv @ 10211 NONAME
+ _ZNK8QPainter4fontEv @ 10212 NONAME
+ _ZNK8QPainter5brushEv @ 10213 NONAME
+ _ZNK8QPainter6deviceEv @ 10214 NONAME
+ _ZNK8QPainter6matrixEv @ 10215 NONAME
+ _ZNK8QPainter6windowEv @ 10216 NONAME
+ _ZNK8QPainter7opacityEv @ 10217 NONAME
+ _ZNK8QPainter8clipPathEv @ 10218 NONAME
+ _ZNK8QPainter8fontInfoEv @ 10219 NONAME
+ _ZNK8QPainter8isActiveEv @ 10220 NONAME
+ _ZNK8QPainter8viewportEv @ 10221 NONAME
+ _ZNK8QPainter9transformEv @ 10222 NONAME
+ _ZNK8QPalette10isBrushSetENS_10ColorGroupENS_9ColorRoleE @ 10223 NONAME
+ _ZNK8QPalette12serialNumberEv @ 10224 NONAME
+ _ZNK8QPalette5brushENS_10ColorGroupENS_9ColorRoleE @ 10225 NONAME
+ _ZNK8QPalette7isEqualENS_10ColorGroupES0_ @ 10226 NONAME
+ _ZNK8QPalette7resolveERKS_ @ 10227 NONAME
+ _ZNK8QPalette8cacheKeyEv @ 10228 NONAME
+ _ZNK8QPalette8isCopyOfERKS_ @ 10229 NONAME
+ _ZNK8QPalettecv8QVariantEv @ 10230 NONAME
+ _ZNK8QPaletteeqERKS_ @ 10231 NONAME
+ _ZNK8QPicture10isDetachedEv @ 10232 NONAME
+ _ZNK8QPicture11paintEngineEv @ 10233 NONAME
+ _ZNK8QPicture12boundingRectEv @ 10234 NONAME
+ _ZNK8QPicture4dataEv @ 10235 NONAME
+ _ZNK8QPicture4sizeEv @ 10236 NONAME
+ _ZNK8QPicture6isNullEv @ 10237 NONAME
+ _ZNK8QPicture6metricEN12QPaintDevice17PaintDeviceMetricE @ 10238 NONAME
+ _ZNK8QPicture7devTypeEv @ 10239 NONAME
+ _ZNK8QPolygon10subtractedERKS_ @ 10240 NONAME
+ _ZNK8QPolygon10translatedEii @ 10241 NONAME
+ _ZNK8QPolygon11intersectedERKS_ @ 10242 NONAME
+ _ZNK8QPolygon12boundingRectEv @ 10243 NONAME
+ _ZNK8QPolygon13containsPointERK6QPointN2Qt8FillRuleE @ 10244 NONAME
+ _ZNK8QPolygon5pointEiPiS0_ @ 10245 NONAME
+ _ZNK8QPolygon6unitedERKS_ @ 10246 NONAME
+ _ZNK8QPolygoncv8QVariantEv @ 10247 NONAME
+ _ZNK8QSpinBox10metaObjectEv @ 10248 NONAME
+ _ZNK8QSpinBox10singleStepEv @ 10249 NONAME
+ _ZNK8QSpinBox13textFromValueEi @ 10250 NONAME
+ _ZNK8QSpinBox13valueFromTextERK7QString @ 10251 NONAME
+ _ZNK8QSpinBox5fixupER7QString @ 10252 NONAME
+ _ZNK8QSpinBox5valueEv @ 10253 NONAME
+ _ZNK8QSpinBox6prefixEv @ 10254 NONAME
+ _ZNK8QSpinBox6suffixEv @ 10255 NONAME
+ _ZNK8QSpinBox7maximumEv @ 10256 NONAME
+ _ZNK8QSpinBox7minimumEv @ 10257 NONAME
+ _ZNK8QSpinBox8validateER7QStringRi @ 10258 NONAME
+ _ZNK8QSpinBox9cleanTextEv @ 10259 NONAME
+ _ZNK8QToolBar10isFloatingEv @ 10260 NONAME
+ _ZNK8QToolBar10metaObjectEv @ 10261 NONAME
+ _ZNK8QToolBar11isFloatableEv @ 10262 NONAME
+ _ZNK8QToolBar11orientationEv @ 10263 NONAME
+ _ZNK8QToolBar12allowedAreasEv @ 10264 NONAME
+ _ZNK8QToolBar14actionGeometryEP7QAction @ 10265 NONAME
+ _ZNK8QToolBar15initStyleOptionEP19QStyleOptionToolBar @ 10266 NONAME
+ _ZNK8QToolBar15toolButtonStyleEv @ 10267 NONAME
+ _ZNK8QToolBar15widgetForActionEP7QAction @ 10268 NONAME
+ _ZNK8QToolBar16toggleViewActionEv @ 10269 NONAME
+ _ZNK8QToolBar8actionAtERK6QPoint @ 10270 NONAME
+ _ZNK8QToolBar8iconSizeEv @ 10271 NONAME
+ _ZNK8QToolBar9isMovableEv @ 10272 NONAME
+ _ZNK8QToolBox10metaObjectEv @ 10273 NONAME
+ _ZNK8QToolBox11itemToolTipEi @ 10274 NONAME
+ _ZNK8QToolBox12currentIndexEv @ 10275 NONAME
+ _ZNK8QToolBox13currentWidgetEv @ 10276 NONAME
+ _ZNK8QToolBox13isItemEnabledEi @ 10277 NONAME
+ _ZNK8QToolBox5countEv @ 10278 NONAME
+ _ZNK8QToolBox6widgetEi @ 10279 NONAME
+ _ZNK8QToolBox7indexOfEP7QWidget @ 10280 NONAME
+ _ZNK8QToolBox8itemIconEi @ 10281 NONAME
+ _ZNK8QToolBox8itemTextEi @ 10282 NONAME
+ _ZNK9QCheckBox10checkStateEv @ 10283 NONAME
+ _ZNK9QCheckBox10isTristateEv @ 10284 NONAME
+ _ZNK9QCheckBox10metaObjectEv @ 10285 NONAME
+ _ZNK9QCheckBox15initStyleOptionEP18QStyleOptionButton @ 10286 NONAME
+ _ZNK9QCheckBox8sizeHintEv @ 10287 NONAME
+ _ZNK9QCheckBox9hitButtonERK6QPoint @ 10288 NONAME
+ _ZNK9QColormap4modeEv @ 10289 NONAME
+ _ZNK9QColormap4sizeEv @ 10290 NONAME
+ _ZNK9QColormap5depthEv @ 10291 NONAME
+ _ZNK9QColormap5pixelERK6QColor @ 10292 NONAME
+ _ZNK9QColormap7colorAtEj @ 10293 NONAME
+ _ZNK9QColormap8colormapEv @ 10294 NONAME
+ _ZNK9QComboBox10isEditableEv @ 10295 NONAME
+ _ZNK9QComboBox10metaObjectEv @ 10296 NONAME
+ _ZNK9QComboBox11currentTextEv @ 10297 NONAME
+ _ZNK9QComboBox11modelColumnEv @ 10298 NONAME
+ _ZNK9QComboBox12currentIndexEv @ 10299 NONAME
+ _ZNK9QComboBox12insertPolicyEv @ 10300 NONAME
+ _ZNK9QComboBox12itemDelegateEv @ 10301 NONAME
+ _ZNK9QComboBox14autoCompletionEv @ 10302 NONAME
+ _ZNK9QComboBox14rootModelIndexEv @ 10303 NONAME
+ _ZNK9QComboBox15initStyleOptionEP20QStyleOptionComboBox @ 10304 NONAME
+ _ZNK9QComboBox15maxVisibleItemsEv @ 10305 NONAME
+ _ZNK9QComboBox15minimumSizeHintEv @ 10306 NONAME
+ _ZNK9QComboBox16inputMethodQueryEN2Qt16InputMethodQueryE @ 10307 NONAME
+ _ZNK9QComboBox16sizeAdjustPolicyEv @ 10308 NONAME
+ _ZNK9QComboBox17duplicatesEnabledEv @ 10309 NONAME
+ _ZNK9QComboBox21minimumContentsLengthEv @ 10310 NONAME
+ _ZNK9QComboBox29autoCompletionCaseSensitivityEv @ 10311 NONAME
+ _ZNK9QComboBox4viewEv @ 10312 NONAME
+ _ZNK9QComboBox5countEv @ 10313 NONAME
+ _ZNK9QComboBox5modelEv @ 10314 NONAME
+ _ZNK9QComboBox8findDataERK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 10315 NONAME
+ _ZNK9QComboBox8hasFrameEv @ 10316 NONAME
+ _ZNK9QComboBox8iconSizeEv @ 10317 NONAME
+ _ZNK9QComboBox8itemDataEii @ 10318 NONAME
+ _ZNK9QComboBox8itemIconEi @ 10319 NONAME
+ _ZNK9QComboBox8itemTextEi @ 10320 NONAME
+ _ZNK9QComboBox8lineEditEv @ 10321 NONAME
+ _ZNK9QComboBox8maxCountEv @ 10322 NONAME
+ _ZNK9QComboBox8sizeHintEv @ 10323 NONAME
+ _ZNK9QComboBox9completerEv @ 10324 NONAME
+ _ZNK9QComboBox9validatorEv @ 10325 NONAME
+ _ZNK9QDateEdit10metaObjectEv @ 10326 NONAME
+ _ZNK9QDirModel10headerDataEiN2Qt11OrientationEi @ 10327 NONAME
+ _ZNK9QDirModel10isReadOnlyEv @ 10328 NONAME
+ _ZNK9QDirModel10metaObjectEv @ 10329 NONAME
+ _ZNK9QDirModel11columnCountERK11QModelIndex @ 10330 NONAME
+ _ZNK9QDirModel11hasChildrenERK11QModelIndex @ 10331 NONAME
+ _ZNK9QDirModel11nameFiltersEv @ 10332 NONAME
+ _ZNK9QDirModel12iconProviderEv @ 10333 NONAME
+ _ZNK9QDirModel14lazyChildCountEv @ 10334 NONAME
+ _ZNK9QDirModel15resolveSymlinksEv @ 10335 NONAME
+ _ZNK9QDirModel20supportedDropActionsEv @ 10336 NONAME
+ _ZNK9QDirModel4dataERK11QModelIndexi @ 10337 NONAME
+ _ZNK9QDirModel5flagsERK11QModelIndex @ 10338 NONAME
+ _ZNK9QDirModel5indexERK7QStringi @ 10339 NONAME
+ _ZNK9QDirModel5indexEiiRK11QModelIndex @ 10340 NONAME
+ _ZNK9QDirModel5isDirERK11QModelIndex @ 10341 NONAME
+ _ZNK9QDirModel6filterEv @ 10342 NONAME
+ _ZNK9QDirModel6parentERK11QModelIndex @ 10343 NONAME
+ _ZNK9QDirModel7sortingEv @ 10344 NONAME
+ _ZNK9QDirModel8fileIconERK11QModelIndex @ 10345 NONAME
+ _ZNK9QDirModel8fileInfoERK11QModelIndex @ 10346 NONAME
+ _ZNK9QDirModel8fileNameERK11QModelIndex @ 10347 NONAME
+ _ZNK9QDirModel8filePathERK11QModelIndex @ 10348 NONAME
+ _ZNK9QDirModel8mimeDataERK5QListI11QModelIndexE @ 10349 NONAME
+ _ZNK9QDirModel8rowCountERK11QModelIndex @ 10350 NONAME
+ _ZNK9QDirModel9mimeTypesEv @ 10351 NONAME
+ _ZNK9QFontInfo10exactMatchEv @ 10352 NONAME
+ _ZNK9QFontInfo10fixedPitchEv @ 10353 NONAME
+ _ZNK9QFontInfo10pointSizeFEv @ 10354 NONAME
+ _ZNK9QFontInfo5styleEv @ 10355 NONAME
+ _ZNK9QFontInfo6familyEv @ 10356 NONAME
+ _ZNK9QFontInfo6italicEv @ 10357 NONAME
+ _ZNK9QFontInfo6weightEv @ 10358 NONAME
+ _ZNK9QFontInfo7rawModeEv @ 10359 NONAME
+ _ZNK9QFontInfo8overlineEv @ 10360 NONAME
+ _ZNK9QFontInfo9pixelSizeEv @ 10361 NONAME
+ _ZNK9QFontInfo9pointSizeEv @ 10362 NONAME
+ _ZNK9QFontInfo9strikeOutEv @ 10363 NONAME
+ _ZNK9QFontInfo9styleHintEv @ 10364 NONAME
+ _ZNK9QFontInfo9underlineEv @ 10365 NONAME
+ _ZNK9QGradient14coordinateModeEv @ 10366 NONAME
+ _ZNK9QGradient17interpolationModeEv @ 10367 NONAME
+ _ZNK9QGradient5stopsEv @ 10368 NONAME
+ _ZNK9QGradienteqERKS_ @ 10369 NONAME
+ _ZNK9QGroupBox10metaObjectEv @ 10370 NONAME
+ _ZNK9QGroupBox11isCheckableEv @ 10371 NONAME
+ _ZNK9QGroupBox15initStyleOptionEP20QStyleOptionGroupBox @ 10372 NONAME
+ _ZNK9QGroupBox15minimumSizeHintEv @ 10373 NONAME
+ _ZNK9QGroupBox5titleEv @ 10374 NONAME
+ _ZNK9QGroupBox6isFlatEv @ 10375 NONAME
+ _ZNK9QGroupBox9alignmentEv @ 10376 NONAME
+ _ZNK9QGroupBox9isCheckedEv @ 10377 NONAME
+ _ZNK9QKeyEvent14nativeScanCodeEv @ 10378 NONAME
+ _ZNK9QKeyEvent15nativeModifiersEv @ 10379 NONAME
+ _ZNK9QKeyEvent16nativeVirtualKeyEv @ 10380 NONAME
+ _ZNK9QKeyEvent7matchesEN12QKeySequence11StandardKeyE @ 10381 NONAME
+ _ZNK9QKeyEvent9modifiersEv @ 10382 NONAME
+ _ZNK9QLineEdit10cursorRectEv @ 10383 NONAME
+ _ZNK9QLineEdit10isModifiedEv @ 10384 NONAME
+ _ZNK9QLineEdit10isReadOnlyEv @ 10385 NONAME
+ _ZNK9QLineEdit10metaObjectEv @ 10386 NONAME
+ _ZNK9QLineEdit11displayTextEv @ 10387 NONAME
+ _ZNK9QLineEdit11dragEnabledEv @ 10388 NONAME
+ _ZNK9QLineEdit12selectedTextEv @ 10389 NONAME
+ _ZNK9QLineEdit14cursorPositionEv @ 10390 NONAME
+ _ZNK9QLineEdit14getTextMarginsEPiS0_S0_S0_ @ 10391 NONAME
+ _ZNK9QLineEdit14selectionStartEv @ 10392 NONAME
+ _ZNK9QLineEdit15hasSelectedTextEv @ 10393 NONAME
+ _ZNK9QLineEdit15initStyleOptionEP17QStyleOptionFrame @ 10394 NONAME
+ _ZNK9QLineEdit15isRedoAvailableEv @ 10395 NONAME
+ _ZNK9QLineEdit15isUndoAvailableEv @ 10396 NONAME
+ _ZNK9QLineEdit15minimumSizeHintEv @ 10397 NONAME
+ _ZNK9QLineEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 10398 NONAME
+ _ZNK9QLineEdit18hasAcceptableInputEv @ 10399 NONAME
+ _ZNK9QLineEdit4copyEv @ 10400 NONAME
+ _ZNK9QLineEdit4textEv @ 10401 NONAME
+ _ZNK9QLineEdit8echoModeEv @ 10402 NONAME
+ _ZNK9QLineEdit8hasFrameEv @ 10403 NONAME
+ _ZNK9QLineEdit8sizeHintEv @ 10404 NONAME
+ _ZNK9QLineEdit9alignmentEv @ 10405 NONAME
+ _ZNK9QLineEdit9completerEv @ 10406 NONAME
+ _ZNK9QLineEdit9inputMaskEv @ 10407 NONAME
+ _ZNK9QLineEdit9maxLengthEv @ 10408 NONAME
+ _ZNK9QLineEdit9validatorEv @ 10409 NONAME
+ _ZNK9QListView10isWrappingEv @ 10410 NONAME
+ _ZNK9QListView10layoutModeEv @ 10411 NONAME
+ _ZNK9QListView10metaObjectEv @ 10412 NONAME
+ _ZNK9QListView10resizeModeEv @ 10413 NONAME
+ _ZNK9QListView10visualRectERK11QModelIndex @ 10414 NONAME
+ _ZNK9QListView11isRowHiddenEi @ 10415 NONAME
+ _ZNK9QListView11modelColumnEv @ 10416 NONAME
+ _ZNK9QListView11viewOptionsEv @ 10417 NONAME
+ _ZNK9QListView11visualIndexERK11QModelIndex @ 10418 NONAME
+ _ZNK9QListView12contentsSizeEv @ 10419 NONAME
+ _ZNK9QListView12rectForIndexERK11QModelIndex @ 10420 NONAME
+ _ZNK9QListView13isIndexHiddenERK11QModelIndex @ 10421 NONAME
+ _ZNK9QListView14verticalOffsetEv @ 10422 NONAME
+ _ZNK9QListView15selectedIndexesEv @ 10423 NONAME
+ _ZNK9QListView16horizontalOffsetEv @ 10424 NONAME
+ _ZNK9QListView16uniformItemSizesEv @ 10425 NONAME
+ _ZNK9QListView22isSelectionRectVisibleEv @ 10426 NONAME
+ _ZNK9QListView24visualRegionForSelectionERK14QItemSelection @ 10427 NONAME
+ _ZNK9QListView4flowEv @ 10428 NONAME
+ _ZNK9QListView7indexAtERK6QPoint @ 10429 NONAME
+ _ZNK9QListView7spacingEv @ 10430 NONAME
+ _ZNK9QListView8gridSizeEv @ 10431 NONAME
+ _ZNK9QListView8movementEv @ 10432 NONAME
+ _ZNK9QListView8viewModeEv @ 10433 NONAME
+ _ZNK9QListView8wordWrapEv @ 10434 NONAME
+ _ZNK9QListView9batchSizeEv @ 10435 NONAME
+ _ZNK9QPolygonF10subtractedERKS_ @ 10436 NONAME
+ _ZNK9QPolygonF10translatedERK7QPointF @ 10437 NONAME
+ _ZNK9QPolygonF11intersectedERKS_ @ 10438 NONAME
+ _ZNK9QPolygonF12boundingRectEv @ 10439 NONAME
+ _ZNK9QPolygonF13containsPointERK7QPointFN2Qt8FillRuleE @ 10440 NONAME
+ _ZNK9QPolygonF6unitedERKS_ @ 10441 NONAME
+ _ZNK9QPolygonF9toPolygonEv @ 10442 NONAME
+ _ZNK9QS60Style10metaObjectEv @ 10443 NONAME
+ _ZNK9QS60Style11drawControlEN6QStyle14ControlElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10444 NONAME
+ _ZNK9QS60Style11pixelMetricEN6QStyle11PixelMetricEPK12QStyleOptionPK7QWidget @ 10445 NONAME
+ _ZNK9QS60Style13drawPrimitiveEN6QStyle16PrimitiveElementEPK12QStyleOptionP8QPainterPK7QWidget @ 10446 NONAME
+ _ZNK9QS60Style13stylePropertyEPKc @ 10447 NONAME
+ _ZNK9QS60Style14subControlRectEN6QStyle14ComplexControlEPK19QStyleOptionComplexNS0_10SubControlEPK7QWidget @ 10448 NONAME
+ _ZNK9QS60Style14subElementRectEN6QStyle10SubElementEPK12QStyleOptionPK7QWidget @ 10449 NONAME
+ _ZNK9QS60Style16sizeFromContentsEN6QStyle12ContentsTypeEPK12QStyleOptionRK5QSizePK7QWidget @ 10450 NONAME
+ _ZNK9QS60Style18drawComplexControlEN6QStyle14ComplexControlEPK19QStyleOptionComplexP8QPainterPK7QWidget @ 10451 NONAME
+ _ZNK9QS60Style26standardIconImplementationEN6QStyle14StandardPixmapEPK12QStyleOptionPK7QWidget @ 10452 NONAME
+ _ZNK9QS60Style9styleHintEN6QStyle9StyleHintEPK12QStyleOptionPK7QWidgetP16QStyleHintReturn @ 10453 NONAME
+ _ZNK9QShortcut10autoRepeatEv @ 10454 NONAME
+ _ZNK9QShortcut10metaObjectEv @ 10455 NONAME
+ _ZNK9QShortcut2idEv @ 10456 NONAME
+ _ZNK9QShortcut3keyEv @ 10457 NONAME
+ _ZNK9QShortcut9isEnabledEv @ 10458 NONAME
+ _ZNK9QShortcut9whatsThisEv @ 10459 NONAME
+ _ZNK9QSizeGrip10metaObjectEv @ 10460 NONAME
+ _ZNK9QSizeGrip8sizeHintEv @ 10461 NONAME
+ _ZNK9QSplitter10metaObjectEv @ 10462 NONAME
+ _ZNK9QSplitter11handleWidthEv @ 10463 NONAME
+ _ZNK9QSplitter11orientationEv @ 10464 NONAME
+ _ZNK9QSplitter12opaqueResizeEv @ 10465 NONAME
+ _ZNK9QSplitter13isCollapsibleEi @ 10466 NONAME
+ _ZNK9QSplitter15minimumSizeHintEv @ 10467 NONAME
+ _ZNK9QSplitter19childrenCollapsibleEv @ 10468 NONAME
+ _ZNK9QSplitter5countEv @ 10469 NONAME
+ _ZNK9QSplitter5sizesEv @ 10470 NONAME
+ _ZNK9QSplitter6handleEi @ 10471 NONAME
+ _ZNK9QSplitter6widgetEi @ 10472 NONAME
+ _ZNK9QSplitter7indexOfEP7QWidget @ 10473 NONAME
+ _ZNK9QSplitter8getRangeEiPiS0_ @ 10474 NONAME
+ _ZNK9QSplitter8sizeHintEv @ 10475 NONAME
+ _ZNK9QSplitter9saveStateEv @ 10476 NONAME
+ _ZNK9QTextEdit10cursorRectERK11QTextCursor @ 10477 NONAME
+ _ZNK9QTextEdit10cursorRectEv @ 10478 NONAME
+ _ZNK9QTextEdit10fontFamilyEv @ 10479 NONAME
+ _ZNK9QTextEdit10fontItalicEv @ 10480 NONAME
+ _ZNK9QTextEdit10fontWeightEv @ 10481 NONAME
+ _ZNK9QTextEdit10isReadOnlyEv @ 10482 NONAME
+ _ZNK9QTextEdit10metaObjectEv @ 10483 NONAME
+ _ZNK9QTextEdit10textCursorEv @ 10484 NONAME
+ _ZNK9QTextEdit11currentFontEv @ 10485 NONAME
+ _ZNK9QTextEdit11cursorWidthEv @ 10486 NONAME
+ _ZNK9QTextEdit12lineWrapModeEv @ 10487 NONAME
+ _ZNK9QTextEdit12tabStopWidthEv @ 10488 NONAME
+ _ZNK9QTextEdit12wordWrapModeEv @ 10489 NONAME
+ _ZNK9QTextEdit13fontPointSizeEv @ 10490 NONAME
+ _ZNK9QTextEdit13fontUnderlineEv @ 10491 NONAME
+ _ZNK9QTextEdit13overwriteModeEv @ 10492 NONAME
+ _ZNK9QTextEdit14acceptRichTextEv @ 10493 NONAME
+ _ZNK9QTextEdit14autoFormattingEv @ 10494 NONAME
+ _ZNK9QTextEdit15extraSelectionsEv @ 10495 NONAME
+ _ZNK9QTextEdit15tabChangesFocusEv @ 10496 NONAME
+ _ZNK9QTextEdit16inputMethodQueryEN2Qt16InputMethodQueryE @ 10497 NONAME
+ _ZNK9QTextEdit17currentCharFormatEv @ 10498 NONAME
+ _ZNK9QTextEdit17cursorForPositionERK6QPoint @ 10499 NONAME
+ _ZNK9QTextEdit19textBackgroundColorEv @ 10500 NONAME
+ _ZNK9QTextEdit20textInteractionFlagsEv @ 10501 NONAME
+ _ZNK9QTextEdit21canInsertFromMimeDataEPK9QMimeData @ 10502 NONAME
+ _ZNK9QTextEdit21lineWrapColumnOrWidthEv @ 10503 NONAME
+ _ZNK9QTextEdit27createMimeDataFromSelectionEv @ 10504 NONAME
+ _ZNK9QTextEdit8anchorAtERK6QPoint @ 10505 NONAME
+ _ZNK9QTextEdit8canPasteEv @ 10506 NONAME
+ _ZNK9QTextEdit8documentEv @ 10507 NONAME
+ _ZNK9QTextEdit9alignmentEv @ 10508 NONAME
+ _ZNK9QTextEdit9textColorEv @ 10509 NONAME
+ _ZNK9QTextItem11renderFlagsEv @ 10510 NONAME
+ _ZNK9QTextItem4fontEv @ 10511 NONAME
+ _ZNK9QTextItem4textEv @ 10512 NONAME
+ _ZNK9QTextItem5widthEv @ 10513 NONAME
+ _ZNK9QTextItem6ascentEv @ 10514 NONAME
+ _ZNK9QTextItem7descentEv @ 10515 NONAME
+ _ZNK9QTextLine10textLengthEv @ 10516 NONAME
+ _ZNK9QTextLine15naturalTextRectEv @ 10517 NONAME
+ _ZNK9QTextLine16naturalTextWidthEv @ 10518 NONAME
+ _ZNK9QTextLine1xEv @ 10519 NONAME
+ _ZNK9QTextLine1yEv @ 10520 NONAME
+ _ZNK9QTextLine4drawEP8QPainterRK7QPointFPKN11QTextLayout11FormatRangeE @ 10521 NONAME
+ _ZNK9QTextLine4rectEv @ 10522 NONAME
+ _ZNK9QTextLine5widthEv @ 10523 NONAME
+ _ZNK9QTextLine6ascentEv @ 10524 NONAME
+ _ZNK9QTextLine6heightEv @ 10525 NONAME
+ _ZNK9QTextLine7descentEv @ 10526 NONAME
+ _ZNK9QTextLine8positionEv @ 10527 NONAME
+ _ZNK9QTextLine9cursorToXEPiNS_4EdgeE @ 10528 NONAME
+ _ZNK9QTextLine9textStartEv @ 10529 NONAME
+ _ZNK9QTextLine9xToCursorEfNS_14CursorPositionE @ 10530 NONAME
+ _ZNK9QTextList10itemNumberERK10QTextBlock @ 10531 NONAME
+ _ZNK9QTextList10metaObjectEv @ 10532 NONAME
+ _ZNK9QTextList4itemEi @ 10533 NONAME
+ _ZNK9QTextList5countEv @ 10534 NONAME
+ _ZNK9QTextList8itemTextERK10QTextBlock @ 10535 NONAME
+ _ZNK9QTimeEdit10metaObjectEv @ 10536 NONAME
+ _ZNK9QTreeView10indexAboveERK11QModelIndex @ 10537 NONAME
+ _ZNK9QTreeView10indexBelowERK11QModelIndex @ 10538 NONAME
+ _ZNK9QTreeView10isAnimatedEv @ 10539 NONAME
+ _ZNK9QTreeView10isExpandedERK11QModelIndex @ 10540 NONAME
+ _ZNK9QTreeView10metaObjectEv @ 10541 NONAME
+ _ZNK9QTreeView10visualRectERK11QModelIndex @ 10542 NONAME
+ _ZNK9QTreeView11columnWidthEi @ 10543 NONAME
+ _ZNK9QTreeView11indentationEv @ 10544 NONAME
+ _ZNK9QTreeView11isRowHiddenEiRK11QModelIndex @ 10545 NONAME
+ _ZNK9QTreeView11visualIndexERK11QModelIndex @ 10546 NONAME
+ _ZNK9QTreeView12drawBranchesEP8QPainterRK5QRectRK11QModelIndex @ 10547 NONAME
+ _ZNK9QTreeView13isIndexHiddenERK11QModelIndex @ 10548 NONAME
+ _ZNK9QTreeView14isColumnHiddenEi @ 10549 NONAME
+ _ZNK9QTreeView14isHeaderHiddenEv @ 10550 NONAME
+ _ZNK9QTreeView14verticalOffsetEv @ 10551 NONAME
+ _ZNK9QTreeView15autoExpandDelayEv @ 10552 NONAME
+ _ZNK9QTreeView15itemsExpandableEv @ 10553 NONAME
+ _ZNK9QTreeView15rootIsDecoratedEv @ 10554 NONAME
+ _ZNK9QTreeView15selectedIndexesEv @ 10555 NONAME
+ _ZNK9QTreeView16horizontalOffsetEv @ 10556 NONAME
+ _ZNK9QTreeView16indexRowSizeHintERK11QModelIndex @ 10557 NONAME
+ _ZNK9QTreeView16isSortingEnabledEv @ 10558 NONAME
+ _ZNK9QTreeView17sizeHintForColumnEi @ 10559 NONAME
+ _ZNK9QTreeView17uniformRowHeightsEv @ 10560 NONAME
+ _ZNK9QTreeView19allColumnsShowFocusEv @ 10561 NONAME
+ _ZNK9QTreeView20expandsOnDoubleClickEv @ 10562 NONAME
+ _ZNK9QTreeView20isFirstColumnSpannedEiRK11QModelIndex @ 10563 NONAME
+ _ZNK9QTreeView22columnViewportPositionEi @ 10564 NONAME
+ _ZNK9QTreeView24visualRegionForSelectionERK14QItemSelection @ 10565 NONAME
+ _ZNK9QTreeView6headerEv @ 10566 NONAME
+ _ZNK9QTreeView7drawRowEP8QPainterRK20QStyleOptionViewItemRK11QModelIndex @ 10567 NONAME
+ _ZNK9QTreeView7indexAtERK6QPoint @ 10568 NONAME
+ _ZNK9QTreeView8columnAtEi @ 10569 NONAME
+ _ZNK9QTreeView8drawTreeEP8QPainterRK7QRegion @ 10570 NONAME
+ _ZNK9QTreeView8wordWrapEv @ 10571 NONAME
+ _ZNK9QTreeView9rowHeightERK11QModelIndex @ 10572 NONAME
+ _ZNK9QUndoView10emptyLabelEv @ 10573 NONAME
+ _ZNK9QUndoView10metaObjectEv @ 10574 NONAME
+ _ZNK9QUndoView5groupEv @ 10575 NONAME
+ _ZNK9QUndoView5stackEv @ 10576 NONAME
+ _ZNK9QUndoView9cleanIconEv @ 10577 NONAME
+ _ZNK9QVector2D10normalizedEv @ 10578 NONAME
+ _ZNK9QVector2D10toVector3DEv @ 10579 NONAME
+ _ZNK9QVector2D10toVector4DEv @ 10580 NONAME
+ _ZNK9QVector2D13lengthSquaredEv @ 10581 NONAME
+ _ZNK9QVector2D6lengthEv @ 10582 NONAME
+ _ZNK9QVector2Dcv8QVariantEv @ 10583 NONAME
+ _ZNK9QVector3D10normalizedEv @ 10584 NONAME
+ _ZNK9QVector3D10toVector2DEv @ 10585 NONAME
+ _ZNK9QVector3D10toVector4DEv @ 10586 NONAME
+ _ZNK9QVector3D13lengthSquaredEv @ 10587 NONAME
+ _ZNK9QVector3D14distanceToLineERKS_S1_ @ 10588 NONAME
+ _ZNK9QVector3D15distanceToPlaneERKS_S1_ @ 10589 NONAME
+ _ZNK9QVector3D15distanceToPlaneERKS_S1_S1_ @ 10590 NONAME
+ _ZNK9QVector3D6lengthEv @ 10591 NONAME
+ _ZNK9QVector3Dcv8QVariantEv @ 10592 NONAME
+ _ZNK9QVector4D10normalizedEv @ 10593 NONAME
+ _ZNK9QVector4D10toVector2DEv @ 10594 NONAME
+ _ZNK9QVector4D10toVector3DEv @ 10595 NONAME
+ _ZNK9QVector4D13lengthSquaredEv @ 10596 NONAME
+ _ZNK9QVector4D16toVector2DAffineEv @ 10597 NONAME
+ _ZNK9QVector4D16toVector3DAffineEv @ 10598 NONAME
+ _ZNK9QVector4D6lengthEv @ 10599 NONAME
+ _ZNK9QVector4Dcv8QVariantEv @ 10600 NONAME
+ _ZTI10QBoxLayout @ 10601 NONAME
+ _ZTI10QClipboard @ 10602 NONAME
+ _ZTI10QCompleter @ 10603 NONAME
+ _ZTI10QDropEvent @ 10604 NONAME
+ _ZTI10QHelpEvent @ 10605 NONAME
+ _ZTI10QHideEvent @ 10606 NONAME
+ _ZTI10QLCDNumber @ 10607 NONAME
+ _ZTI10QMoveEvent @ 10608 NONAME
+ _ZTI10QScrollBar @ 10609 NONAME
+ _ZTI10QShowEvent @ 10610 NONAME
+ _ZTI10QStatusBar @ 10611 NONAME
+ _ZTI10QTabWidget @ 10612 NONAME
+ _ZTI10QTableView @ 10613 NONAME
+ _ZTI10QTextFrame @ 10614 NONAME
+ _ZTI10QTextTable @ 10615 NONAME
+ _ZTI10QUndoGroup @ 10616 NONAME
+ _ZTI10QUndoStack @ 10617 NONAME
+ _ZTI10QValidator @ 10618 NONAME
+ _ZTI10QWorkspace @ 10619 NONAME
+ _ZTI11QCloseEvent @ 10620 NONAME
+ _ZTI11QColumnView @ 10621 NONAME
+ _ZTI11QDockWidget @ 10622 NONAME
+ _ZTI11QFileDialog @ 10623 NONAME
+ _ZTI11QFocusEvent @ 10624 NONAME
+ _ZTI11QFocusFrame @ 10625 NONAME
+ _ZTI11QFontDialog @ 10626 NONAME
+ _ZTI11QFontEngine @ 10627 NONAME
+ _ZTI11QFormLayout @ 10628 NONAME
+ _ZTI11QGridLayout @ 10629 NONAME
+ _ZTI11QHBoxLayout @ 10630 NONAME
+ _ZTI11QHeaderView @ 10631 NONAME
+ _ZTI11QHoverEvent @ 10632 NONAME
+ _ZTI11QIconEngine @ 10633 NONAME
+ _ZTI11QInputEvent @ 10634 NONAME
+ _ZTI11QLayoutItem @ 10635 NONAME
+ _ZTI11QListWidget @ 10636 NONAME
+ _ZTI11QMainWindow @ 10637 NONAME
+ _ZTI11QMessageBox @ 10638 NONAME
+ _ZTI11QMimeSource @ 10639 NONAME
+ _ZTI11QMouseEvent @ 10640 NONAME
+ _ZTI11QPaintEvent @ 10641 NONAME
+ _ZTI11QPanGesture @ 10642 NONAME
+ _ZTI11QPixmapData @ 10643 NONAME
+ _ZTI11QProxyModel @ 10644 NONAME
+ _ZTI11QProxyStyle @ 10645 NONAME
+ _ZTI11QPushButton @ 10646 NONAME
+ _ZTI11QRubberBand @ 10647 NONAME
+ _ZTI11QScrollArea @ 10648 NONAME
+ _ZTI11QSpacerItem @ 10649 NONAME
+ _ZTI11QStrokerOps @ 10650 NONAME
+ _ZTI11QTextObject @ 10651 NONAME
+ _ZTI11QToolButton @ 10652 NONAME
+ _ZTI11QTouchEvent @ 10653 NONAME
+ _ZTI11QTreeWidget @ 10654 NONAME
+ _ZTI11QVBoxLayout @ 10655 NONAME
+ _ZTI11QWheelEvent @ 10656 NONAME
+ _ZTI11QWidgetItem @ 10657 NONAME
+ _ZTI11QWizardPage @ 10658 NONAME
+ _ZTI12QActionEvent @ 10659 NONAME
+ _ZTI12QActionGroup @ 10660 NONAME
+ _ZTI12QApplication @ 10661 NONAME
+ _ZTI12QButtonGroup @ 10662 NONAME
+ _ZTI12QColorDialog @ 10663 NONAME
+ _ZTI12QCommonStyle @ 10664 NONAME
+ _ZTI12QDashStroker @ 10665 NONAME
+ _ZTI12QInputDialog @ 10666 NONAME
+ _ZTI12QLineControl @ 10667 NONAME
+ _ZTI12QPaintBuffer @ 10668 NONAME
+ _ZTI12QPaintDevice @ 10669 NONAME
+ _ZTI12QPaintEngine @ 10670 NONAME
+ _ZTI12QProgressBar @ 10671 NONAME
+ _ZTI12QRadioButton @ 10672 NONAME
+ _ZTI12QResizeEvent @ 10673 NONAME
+ _ZTI12QStylePlugin @ 10674 NONAME
+ _ZTI12QTableWidget @ 10675 NONAME
+ _ZTI12QTabletEvent @ 10676 NONAME
+ _ZTI12QTessellator @ 10677 NONAME
+ _ZTI12QTextBrowser @ 10678 NONAME
+ _ZTI12QTextControl @ 10679 NONAME
+ _ZTI12QUndoCommand @ 10680 NONAME
+ _ZTI13QDateTimeEdit @ 10681 NONAME
+ _ZTI13QErrorMessage @ 10682 NONAME
+ _ZTI13QFontComboBox @ 10683 NONAME
+ _ZTI13QGestureEvent @ 10684 NONAME
+ _ZTI13QGraphicsItem @ 10685 NONAME
+ _ZTI13QGraphicsView @ 10686 NONAME
+ _ZTI13QIconEngineV2 @ 10687 NONAME
+ _ZTI13QInputContext @ 10688 NONAME
+ _ZTI13QIntValidator @ 10689 NONAME
+ _ZTI13QItemDelegate @ 10690 NONAME
+ _ZTI13QMdiSubWindow @ 10691 NONAME
+ _ZTI13QPainterState @ 10692 NONAME
+ _ZTI13QPinchGesture @ 10693 NONAME
+ _ZTI13QPixmapFilter @ 10694 NONAME
+ _ZTI13QS60MainAppUi @ 10695 NONAME
+ _ZTI13QSplashScreen @ 10696 NONAME
+ _ZTI13QStandardItem @ 10697 NONAME
+ _ZTI13QSwipeGesture @ 10698 NONAME
+ _ZTI13QTextDocument @ 10699 NONAME
+ _ZTI13QWidgetAction @ 10700 NONAME
+ _ZTI13QWidgetItemV2 @ 10701 NONAME
+ _ZTI13QWindowsStyle @ 10702 NONAME
+ _ZTI14QDesktopWidget @ 10703 NONAME
+ _ZTI14QDoubleSpinBox @ 10704 NONAME
+ _ZTI14QDragMoveEvent @ 10705 NONAME
+ _ZTI14QFileOpenEvent @ 10706 NONAME
+ _ZTI14QGraphicsScale @ 10707 NONAME
+ _ZTI14QGraphicsScene @ 10708 NONAME
+ _ZTI14QIconDragEvent @ 10709 NONAME
+ _ZTI14QImageIOPlugin @ 10710 NONAME
+ _ZTI14QLayoutPrivate @ 10711 NONAME
+ _ZTI14QPaintEngineEx @ 10712 NONAME
+ _ZTI14QPlainTextEdit @ 10713 NONAME
+ _ZTI14QShortcutEvent @ 10714 NONAME
+ _ZTI14QStackedLayout @ 10715 NONAME
+ _ZTI14QStackedWidget @ 10716 NONAME
+ _ZTI14QWidgetPrivate @ 10717 NONAME
+ _ZTI14QWindowSurface @ 10718 NONAME
+ _ZTI15QAbstractButton @ 10719 NONAME
+ _ZTI15QAbstractSlider @ 10720 NONAME
+ _ZTI15QCalendarWidget @ 10721 NONAME
+ _ZTI15QClipboardEvent @ 10722 NONAME
+ _ZTI15QDragEnterEvent @ 10723 NONAME
+ _ZTI15QDragLeaveEvent @ 10724 NONAME
+ _ZTI15QGraphicsAnchor @ 10725 NONAME
+ _ZTI15QGraphicsEffect @ 10726 NONAME
+ _ZTI15QGraphicsLayout @ 10727 NONAME
+ _ZTI15QGraphicsObject @ 10728 NONAME
+ _ZTI15QGraphicsSystem @ 10729 NONAME
+ _ZTI15QGraphicsWidget @ 10730 NONAME
+ _ZTI15QImageIOHandler @ 10731 NONAME
+ _ZTI15QListWidgetItem @ 10732 NONAME
+ _ZTI15QProgressDialog @ 10733 NONAME
+ _ZTI15QSessionManager @ 10734 NONAME
+ _ZTI15QSplitterHandle @ 10735 NONAME
+ _ZTI15QStatusTipEvent @ 10736 NONAME
+ _ZTI15QTextBlockGroup @ 10737 NONAME
+ _ZTI15QTreeWidgetItem @ 10738 NONAME
+ _ZTI16QAbstractSpinBox @ 10739 NONAME
+ _ZTI16QDialogButtonBox @ 10740 NONAME
+ _ZTI16QDoubleValidator @ 10741 NONAME
+ _ZTI16QFileSystemModel @ 10742 NONAME
+ _ZTI16QPainterReplayer @ 10743 NONAME
+ _ZTI16QRegExpValidator @ 10744 NONAME
+ _ZTI16QS60MainDocument @ 10745 NONAME
+ _ZTI16QStringListModel @ 10746 NONAME
+ _ZTI16QTableWidgetItem @ 10747 NONAME
+ _ZTI17QAbstractItemView @ 10748 NONAME
+ _ZTI17QContextMenuEvent @ 10749 NONAME
+ _ZTI17QDataWidgetMapper @ 10750 NONAME
+ _ZTI17QDockWidgetLayout @ 10751 NONAME
+ _ZTI17QFileIconProvider @ 10752 NONAME
+ _ZTI17QGraphicsLineItem @ 10753 NONAME
+ _ZTI17QGraphicsPathItem @ 10754 NONAME
+ _ZTI17QGraphicsRectItem @ 10755 NONAME
+ _ZTI17QGraphicsRotation @ 10756 NONAME
+ _ZTI17QGraphicsTextItem @ 10757 NONAME
+ _ZTI17QIconEnginePlugin @ 10758 NONAME
+ _ZTI17QInputMethodEvent @ 10759 NONAME
+ _ZTI17QPaintEngineState @ 10760 NONAME
+ _ZTI17QPixmapBlurFilter @ 10761 NONAME
+ _ZTI17QRasterPixmapData @ 10762 NONAME
+ _ZTI18QCommandLinkButton @ 10763 NONAME
+ _ZTI18QDragResponseEvent @ 10764 NONAME
+ _ZTI18QGestureRecognizer @ 10765 NONAME
+ _ZTI18QGraphicsItemGroup @ 10766 NONAME
+ _ZTI18QGraphicsTransform @ 10767 NONAME
+ _ZTI18QItemEditorFactory @ 10768 NONAME
+ _ZTI18QStandardItemModel @ 10769 NONAME
+ _ZTI18QSyntaxHighlighter @ 10770 NONAME
+ _ZTI18QTextBlockUserData @ 10771 NONAME
+ _ZTI18QTextureGlyphCache @ 10772 NONAME
+ _ZTI19QAbstractProxyModel @ 10773 NONAME
+ _ZTI19QAbstractScrollArea @ 10774 NONAME
+ _ZTI19QApplicationPrivate @ 10775 NONAME
+ _ZTI19QCoeFepInputContext @ 10776 NONAME
+ _ZTI19QEventDispatcherS60 @ 10777 NONAME
+ _ZTI19QGraphicsBlurEffect @ 10778 NONAME
+ _ZTI19QGraphicsGridLayout @ 10779 NONAME
+ _ZTI19QGraphicsLayoutItem @ 10780 NONAME
+ _ZTI19QGraphicsPixmapItem @ 10781 NONAME
+ _ZTI19QGraphicsSceneEvent @ 10782 NONAME
+ _ZTI19QIconEnginePluginV2 @ 10783 NONAME
+ _ZTI19QInputContextPlugin @ 10784 NONAME
+ _ZTI19QItemSelectionModel @ 10785 NONAME
+ _ZTI19QKeyEventTransition @ 10786 NONAME
+ _ZTI19QS60MainApplication @ 10787 NONAME
+ _ZTI19QStyledItemDelegate @ 10788 NONAME
+ _ZTI19QToolBarChangeEvent @ 10789 NONAME
+ _ZTI20QGraphicsBloomEffect @ 10790 NONAME
+ _ZTI20QGraphicsEllipseItem @ 10791 NONAME
+ _ZTI20QGraphicsItemPrivate @ 10792 NONAME
+ _ZTI20QGraphicsPolygonItem @ 10793 NONAME
+ _ZTI20QGraphicsProxyWidget @ 10794 NONAME
+ _ZTI20QPaintBufferResource @ 10795 NONAME
+ _ZTI20QPictureFormatPlugin @ 10796 NONAME
+ _ZTI20QRasterWindowSurface @ 10797 NONAME
+ _ZTI20QTextFrameLayoutData @ 10798 NONAME
+ _ZTI20QTextObjectInterface @ 10799 NONAME
+ _ZTI20QWidgetResizeHandler @ 10800 NONAME
+ _ZTI21QAbstractItemDelegate @ 10801 NONAME
+ _ZTI21QGraphicsAnchorLayout @ 10802 NONAME
+ _ZTI21QGraphicsEffectSource @ 10803 NONAME
+ _ZTI21QGraphicsLinearLayout @ 10804 NONAME
+ _ZTI21QGraphicsSystemPlugin @ 10805 NONAME
+ _ZTI21QMouseEventTransition @ 10806 NONAME
+ _ZTI21QPaintEngineExPrivate @ 10807 NONAME
+ _ZTI21QPixmapColorizeFilter @ 10808 NONAME
+ _ZTI21QSortFilterProxyModel @ 10809 NONAME
+ _ZTI22QGraphicsEffectPrivate @ 10810 NONAME
+ _ZTI22QGraphicsItemAnimation @ 10811 NONAME
+ _ZTI22QGraphicsOpacityEffect @ 10812 NONAME
+ _ZTI22QPaintEngineExReplayer @ 10813 NONAME
+ _ZTI22QStyleFactoryInterface @ 10814 NONAME
+ _ZTI22QWhatsThisClickedEvent @ 10815 NONAME
+ _ZTI23QGraphicsColorizeEffect @ 10816 NONAME
+ _ZTI23QGraphicsPixelizeEffect @ 10817 NONAME
+ _ZTI23QGraphicsSceneHelpEvent @ 10818 NONAME
+ _ZTI23QGraphicsSceneMoveEvent @ 10819 NONAME
+ _ZTI23QGraphicsSimpleTextItem @ 10820 NONAME
+ _ZTI23QPaintBufferSignalProxy @ 10821 NONAME
+ _ZTI23QPictureFormatInterface @ 10822 NONAME
+ _ZTI23QPixmapDropShadowFilter @ 10823 NONAME
+ _ZTI23QWindowStateChangeEvent @ 10824 NONAME
+ _ZTI24QGraphicsGrayscaleEffect @ 10825 NONAME
+ _ZTI24QGraphicsSceneHoverEvent @ 10826 NONAME
+ _ZTI24QGraphicsSceneMouseEvent @ 10827 NONAME
+ _ZTI24QGraphicsSceneWheelEvent @ 10828 NONAME
+ _ZTI24QPixmapConvolutionFilter @ 10829 NONAME
+ _ZTI24QPlainTextDocumentLayout @ 10830 NONAME
+ _ZTI25QGraphicsDropShadowEffect @ 10831 NONAME
+ _ZTI25QGraphicsSceneResizeEvent @ 10832 NONAME
+ _ZTI26QAbstractGraphicsShapeItem @ 10833 NONAME
+ _ZTI27QAbstractTextDocumentLayout @ 10834 NONAME
+ _ZTI27QGraphicsSceneDragDropEvent @ 10835 NONAME
+ _ZTI27QIconEngineFactoryInterface @ 10836 NONAME
+ _ZTI29QIconEngineFactoryInterfaceV2 @ 10837 NONAME
+ _ZTI29QInputContextFactoryInterface @ 10838 NONAME
+ _ZTI30QGraphicsSceneContextMenuEvent @ 10839 NONAME
+ _ZTI31QImageIOHandlerFactoryInterface @ 10840 NONAME
+ _ZTI5QDial @ 10841 NONAME
+ _ZTI5QDrag @ 10842 NONAME
+ _ZTI5QMenu @ 10843 NONAME
+ _ZTI6QFrame @ 10844 NONAME
+ _ZTI6QImage @ 10845 NONAME
+ _ZTI6QLabel @ 10846 NONAME
+ _ZTI6QMovie @ 10847 NONAME
+ _ZTI6QSound @ 10848 NONAME
+ _ZTI6QStyle @ 10849 NONAME
+ _ZTI7QAction @ 10850 NONAME
+ _ZTI7QBitmap @ 10851 NONAME
+ _ZTI7QDialog @ 10852 NONAME
+ _ZTI7QLayout @ 10853 NONAME
+ _ZTI7QPixmap @ 10854 NONAME
+ _ZTI7QSlider @ 10855 NONAME
+ _ZTI7QTabBar @ 10856 NONAME
+ _ZTI7QWidget @ 10857 NONAME
+ _ZTI7QWizard @ 10858 NONAME
+ _ZTI8QGesture @ 10859 NONAME
+ _ZTI8QMdiArea @ 10860 NONAME
+ _ZTI8QMenuBar @ 10861 NONAME
+ _ZTI8QPicture @ 10862 NONAME
+ _ZTI8QSpinBox @ 10863 NONAME
+ _ZTI8QStroker @ 10864 NONAME
+ _ZTI8QToolBar @ 10865 NONAME
+ _ZTI8QToolBox @ 10866 NONAME
+ _ZTI9QCheckBox @ 10867 NONAME
+ _ZTI9QComboBox @ 10868 NONAME
+ _ZTI9QDateEdit @ 10869 NONAME
+ _ZTI9QDirModel @ 10870 NONAME
+ _ZTI9QGroupBox @ 10871 NONAME
+ _ZTI9QKeyEvent @ 10872 NONAME
+ _ZTI9QLineEdit @ 10873 NONAME
+ _ZTI9QListView @ 10874 NONAME
+ _ZTI9QS60Style @ 10875 NONAME
+ _ZTI9QShortcut @ 10876 NONAME
+ _ZTI9QSizeGrip @ 10877 NONAME
+ _ZTI9QSplitter @ 10878 NONAME
+ _ZTI9QTextEdit @ 10879 NONAME
+ _ZTI9QTextList @ 10880 NONAME
+ _ZTI9QTimeEdit @ 10881 NONAME
+ _ZTI9QTreeView @ 10882 NONAME
+ _ZTI9QUndoView @ 10883 NONAME
+ _ZTIN4QCss13StyleSelectorE @ 10884 NONAME
+ _ZTV10QBoxLayout @ 10885 NONAME
+ _ZTV10QClipboard @ 10886 NONAME
+ _ZTV10QCompleter @ 10887 NONAME
+ _ZTV10QDropEvent @ 10888 NONAME
+ _ZTV10QHelpEvent @ 10889 NONAME
+ _ZTV10QHideEvent @ 10890 NONAME
+ _ZTV10QLCDNumber @ 10891 NONAME
+ _ZTV10QMoveEvent @ 10892 NONAME
+ _ZTV10QScrollBar @ 10893 NONAME
+ _ZTV10QShowEvent @ 10894 NONAME
+ _ZTV10QStatusBar @ 10895 NONAME
+ _ZTV10QTabWidget @ 10896 NONAME
+ _ZTV10QTableView @ 10897 NONAME
+ _ZTV10QTextFrame @ 10898 NONAME
+ _ZTV10QTextTable @ 10899 NONAME
+ _ZTV10QUndoGroup @ 10900 NONAME
+ _ZTV10QUndoStack @ 10901 NONAME
+ _ZTV10QValidator @ 10902 NONAME
+ _ZTV10QWorkspace @ 10903 NONAME
+ _ZTV11QCloseEvent @ 10904 NONAME
+ _ZTV11QColumnView @ 10905 NONAME
+ _ZTV11QDockWidget @ 10906 NONAME
+ _ZTV11QFileDialog @ 10907 NONAME
+ _ZTV11QFocusEvent @ 10908 NONAME
+ _ZTV11QFocusFrame @ 10909 NONAME
+ _ZTV11QFontDialog @ 10910 NONAME
+ _ZTV11QFontEngine @ 10911 NONAME
+ _ZTV11QFormLayout @ 10912 NONAME
+ _ZTV11QGridLayout @ 10913 NONAME
+ _ZTV11QHBoxLayout @ 10914 NONAME
+ _ZTV11QHeaderView @ 10915 NONAME
+ _ZTV11QHoverEvent @ 10916 NONAME
+ _ZTV11QIconEngine @ 10917 NONAME
+ _ZTV11QInputEvent @ 10918 NONAME
+ _ZTV11QLayoutItem @ 10919 NONAME
+ _ZTV11QListWidget @ 10920 NONAME
+ _ZTV11QMainWindow @ 10921 NONAME
+ _ZTV11QMessageBox @ 10922 NONAME
+ _ZTV11QMimeSource @ 10923 NONAME
+ _ZTV11QMouseEvent @ 10924 NONAME
+ _ZTV11QPaintEvent @ 10925 NONAME
+ _ZTV11QPanGesture @ 10926 NONAME
+ _ZTV11QPixmapData @ 10927 NONAME
+ _ZTV11QProxyModel @ 10928 NONAME
+ _ZTV11QProxyStyle @ 10929 NONAME
+ _ZTV11QPushButton @ 10930 NONAME
+ _ZTV11QRubberBand @ 10931 NONAME
+ _ZTV11QScrollArea @ 10932 NONAME
+ _ZTV11QSpacerItem @ 10933 NONAME
+ _ZTV11QStrokerOps @ 10934 NONAME
+ _ZTV11QTextObject @ 10935 NONAME
+ _ZTV11QToolButton @ 10936 NONAME
+ _ZTV11QTouchEvent @ 10937 NONAME
+ _ZTV11QTreeWidget @ 10938 NONAME
+ _ZTV11QVBoxLayout @ 10939 NONAME
+ _ZTV11QWheelEvent @ 10940 NONAME
+ _ZTV11QWidgetItem @ 10941 NONAME
+ _ZTV11QWizardPage @ 10942 NONAME
+ _ZTV12QActionEvent @ 10943 NONAME
+ _ZTV12QActionGroup @ 10944 NONAME
+ _ZTV12QApplication @ 10945 NONAME
+ _ZTV12QButtonGroup @ 10946 NONAME
+ _ZTV12QColorDialog @ 10947 NONAME
+ _ZTV12QCommonStyle @ 10948 NONAME
+ _ZTV12QDashStroker @ 10949 NONAME
+ _ZTV12QInputDialog @ 10950 NONAME
+ _ZTV12QLineControl @ 10951 NONAME
+ _ZTV12QPaintBuffer @ 10952 NONAME
+ _ZTV12QPaintDevice @ 10953 NONAME
+ _ZTV12QPaintEngine @ 10954 NONAME
+ _ZTV12QProgressBar @ 10955 NONAME
+ _ZTV12QRadioButton @ 10956 NONAME
+ _ZTV12QResizeEvent @ 10957 NONAME
+ _ZTV12QStylePlugin @ 10958 NONAME
+ _ZTV12QTableWidget @ 10959 NONAME
+ _ZTV12QTabletEvent @ 10960 NONAME
+ _ZTV12QTessellator @ 10961 NONAME
+ _ZTV12QTextBrowser @ 10962 NONAME
+ _ZTV12QTextControl @ 10963 NONAME
+ _ZTV12QUndoCommand @ 10964 NONAME
+ _ZTV13QDateTimeEdit @ 10965 NONAME
+ _ZTV13QErrorMessage @ 10966 NONAME
+ _ZTV13QFontComboBox @ 10967 NONAME
+ _ZTV13QGestureEvent @ 10968 NONAME
+ _ZTV13QGraphicsItem @ 10969 NONAME
+ _ZTV13QGraphicsView @ 10970 NONAME
+ _ZTV13QIconEngineV2 @ 10971 NONAME
+ _ZTV13QInputContext @ 10972 NONAME
+ _ZTV13QIntValidator @ 10973 NONAME
+ _ZTV13QItemDelegate @ 10974 NONAME
+ _ZTV13QMdiSubWindow @ 10975 NONAME
+ _ZTV13QPainterState @ 10976 NONAME
+ _ZTV13QPinchGesture @ 10977 NONAME
+ _ZTV13QPixmapFilter @ 10978 NONAME
+ _ZTV13QS60MainAppUi @ 10979 NONAME
+ _ZTV13QSplashScreen @ 10980 NONAME
+ _ZTV13QStandardItem @ 10981 NONAME
+ _ZTV13QSwipeGesture @ 10982 NONAME
+ _ZTV13QTextDocument @ 10983 NONAME
+ _ZTV13QWidgetAction @ 10984 NONAME
+ _ZTV13QWidgetItemV2 @ 10985 NONAME
+ _ZTV13QWindowsStyle @ 10986 NONAME
+ _ZTV14QDesktopWidget @ 10987 NONAME
+ _ZTV14QDoubleSpinBox @ 10988 NONAME
+ _ZTV14QDragMoveEvent @ 10989 NONAME
+ _ZTV14QFileOpenEvent @ 10990 NONAME
+ _ZTV14QGraphicsScale @ 10991 NONAME
+ _ZTV14QGraphicsScene @ 10992 NONAME
+ _ZTV14QIconDragEvent @ 10993 NONAME
+ _ZTV14QImageIOPlugin @ 10994 NONAME
+ _ZTV14QLayoutPrivate @ 10995 NONAME
+ _ZTV14QPaintEngineEx @ 10996 NONAME
+ _ZTV14QPlainTextEdit @ 10997 NONAME
+ _ZTV14QShortcutEvent @ 10998 NONAME
+ _ZTV14QStackedLayout @ 10999 NONAME
+ _ZTV14QStackedWidget @ 11000 NONAME
+ _ZTV14QWidgetPrivate @ 11001 NONAME
+ _ZTV14QWindowSurface @ 11002 NONAME
+ _ZTV15QAbstractButton @ 11003 NONAME
+ _ZTV15QAbstractSlider @ 11004 NONAME
+ _ZTV15QCalendarWidget @ 11005 NONAME
+ _ZTV15QClipboardEvent @ 11006 NONAME
+ _ZTV15QDragEnterEvent @ 11007 NONAME
+ _ZTV15QDragLeaveEvent @ 11008 NONAME
+ _ZTV15QGraphicsAnchor @ 11009 NONAME
+ _ZTV15QGraphicsEffect @ 11010 NONAME
+ _ZTV15QGraphicsLayout @ 11011 NONAME
+ _ZTV15QGraphicsObject @ 11012 NONAME
+ _ZTV15QGraphicsWidget @ 11013 NONAME
+ _ZTV15QImageIOHandler @ 11014 NONAME
+ _ZTV15QListWidgetItem @ 11015 NONAME
+ _ZTV15QProgressDialog @ 11016 NONAME
+ _ZTV15QSessionManager @ 11017 NONAME
+ _ZTV15QSplitterHandle @ 11018 NONAME
+ _ZTV15QStatusTipEvent @ 11019 NONAME
+ _ZTV15QTextBlockGroup @ 11020 NONAME
+ _ZTV15QTreeWidgetItem @ 11021 NONAME
+ _ZTV16QAbstractSpinBox @ 11022 NONAME
+ _ZTV16QDialogButtonBox @ 11023 NONAME
+ _ZTV16QDoubleValidator @ 11024 NONAME
+ _ZTV16QFileSystemModel @ 11025 NONAME
+ _ZTV16QPainterReplayer @ 11026 NONAME
+ _ZTV16QRegExpValidator @ 11027 NONAME
+ _ZTV16QS60MainDocument @ 11028 NONAME
+ _ZTV16QStringListModel @ 11029 NONAME
+ _ZTV16QTableWidgetItem @ 11030 NONAME
+ _ZTV17QAbstractItemView @ 11031 NONAME
+ _ZTV17QContextMenuEvent @ 11032 NONAME
+ _ZTV17QDataWidgetMapper @ 11033 NONAME
+ _ZTV17QDockWidgetLayout @ 11034 NONAME
+ _ZTV17QFileIconProvider @ 11035 NONAME
+ _ZTV17QGraphicsLineItem @ 11036 NONAME
+ _ZTV17QGraphicsPathItem @ 11037 NONAME
+ _ZTV17QGraphicsRectItem @ 11038 NONAME
+ _ZTV17QGraphicsRotation @ 11039 NONAME
+ _ZTV17QGraphicsTextItem @ 11040 NONAME
+ _ZTV17QIconEnginePlugin @ 11041 NONAME
+ _ZTV17QInputMethodEvent @ 11042 NONAME
+ _ZTV17QPixmapBlurFilter @ 11043 NONAME
+ _ZTV17QRasterPixmapData @ 11044 NONAME
+ _ZTV18QCommandLinkButton @ 11045 NONAME
+ _ZTV18QDragResponseEvent @ 11046 NONAME
+ _ZTV18QGestureRecognizer @ 11047 NONAME
+ _ZTV18QGraphicsItemGroup @ 11048 NONAME
+ _ZTV18QGraphicsTransform @ 11049 NONAME
+ _ZTV18QItemEditorFactory @ 11050 NONAME
+ _ZTV18QStandardItemModel @ 11051 NONAME
+ _ZTV18QSyntaxHighlighter @ 11052 NONAME
+ _ZTV18QTextBlockUserData @ 11053 NONAME
+ _ZTV18QTextureGlyphCache @ 11054 NONAME
+ _ZTV19QAbstractProxyModel @ 11055 NONAME
+ _ZTV19QAbstractScrollArea @ 11056 NONAME
+ _ZTV19QApplicationPrivate @ 11057 NONAME
+ _ZTV19QCoeFepInputContext @ 11058 NONAME
+ _ZTV19QEventDispatcherS60 @ 11059 NONAME
+ _ZTV19QGraphicsBlurEffect @ 11060 NONAME
+ _ZTV19QGraphicsGridLayout @ 11061 NONAME
+ _ZTV19QGraphicsLayoutItem @ 11062 NONAME
+ _ZTV19QGraphicsPixmapItem @ 11063 NONAME
+ _ZTV19QGraphicsSceneEvent @ 11064 NONAME
+ _ZTV19QIconEnginePluginV2 @ 11065 NONAME
+ _ZTV19QInputContextPlugin @ 11066 NONAME
+ _ZTV19QItemSelectionModel @ 11067 NONAME
+ _ZTV19QKeyEventTransition @ 11068 NONAME
+ _ZTV19QS60MainApplication @ 11069 NONAME
+ _ZTV19QStyledItemDelegate @ 11070 NONAME
+ _ZTV19QToolBarChangeEvent @ 11071 NONAME
+ _ZTV20QGraphicsBloomEffect @ 11072 NONAME
+ _ZTV20QGraphicsEllipseItem @ 11073 NONAME
+ _ZTV20QGraphicsItemPrivate @ 11074 NONAME
+ _ZTV20QGraphicsPolygonItem @ 11075 NONAME
+ _ZTV20QGraphicsProxyWidget @ 11076 NONAME
+ _ZTV20QPaintBufferResource @ 11077 NONAME
+ _ZTV20QPictureFormatPlugin @ 11078 NONAME
+ _ZTV20QRasterWindowSurface @ 11079 NONAME
+ _ZTV20QTextFrameLayoutData @ 11080 NONAME
+ _ZTV20QWidgetResizeHandler @ 11081 NONAME
+ _ZTV21QAbstractItemDelegate @ 11082 NONAME
+ _ZTV21QGraphicsAnchorLayout @ 11083 NONAME
+ _ZTV21QGraphicsEffectSource @ 11084 NONAME
+ _ZTV21QGraphicsLinearLayout @ 11085 NONAME
+ _ZTV21QGraphicsSystemPlugin @ 11086 NONAME
+ _ZTV21QMouseEventTransition @ 11087 NONAME
+ _ZTV21QPaintEngineExPrivate @ 11088 NONAME
+ _ZTV21QPixmapColorizeFilter @ 11089 NONAME
+ _ZTV21QSortFilterProxyModel @ 11090 NONAME
+ _ZTV22QGraphicsEffectPrivate @ 11091 NONAME
+ _ZTV22QGraphicsItemAnimation @ 11092 NONAME
+ _ZTV22QGraphicsOpacityEffect @ 11093 NONAME
+ _ZTV22QPaintEngineExReplayer @ 11094 NONAME
+ _ZTV22QWhatsThisClickedEvent @ 11095 NONAME
+ _ZTV23QGraphicsColorizeEffect @ 11096 NONAME
+ _ZTV23QGraphicsPixelizeEffect @ 11097 NONAME
+ _ZTV23QGraphicsSceneHelpEvent @ 11098 NONAME
+ _ZTV23QGraphicsSceneMoveEvent @ 11099 NONAME
+ _ZTV23QGraphicsSimpleTextItem @ 11100 NONAME
+ _ZTV23QPaintBufferSignalProxy @ 11101 NONAME
+ _ZTV23QPixmapDropShadowFilter @ 11102 NONAME
+ _ZTV23QWindowStateChangeEvent @ 11103 NONAME
+ _ZTV24QGraphicsGrayscaleEffect @ 11104 NONAME
+ _ZTV24QGraphicsSceneHoverEvent @ 11105 NONAME
+ _ZTV24QGraphicsSceneMouseEvent @ 11106 NONAME
+ _ZTV24QGraphicsSceneWheelEvent @ 11107 NONAME
+ _ZTV24QPixmapConvolutionFilter @ 11108 NONAME
+ _ZTV24QPlainTextDocumentLayout @ 11109 NONAME
+ _ZTV25QGraphicsDropShadowEffect @ 11110 NONAME
+ _ZTV25QGraphicsSceneResizeEvent @ 11111 NONAME
+ _ZTV26QAbstractGraphicsShapeItem @ 11112 NONAME
+ _ZTV27QAbstractTextDocumentLayout @ 11113 NONAME
+ _ZTV27QGraphicsSceneDragDropEvent @ 11114 NONAME
+ _ZTV30QGraphicsSceneContextMenuEvent @ 11115 NONAME
+ _ZTV5QDial @ 11116 NONAME
+ _ZTV5QDrag @ 11117 NONAME
+ _ZTV5QMenu @ 11118 NONAME
+ _ZTV6QFrame @ 11119 NONAME
+ _ZTV6QImage @ 11120 NONAME
+ _ZTV6QLabel @ 11121 NONAME
+ _ZTV6QMovie @ 11122 NONAME
+ _ZTV6QSound @ 11123 NONAME
+ _ZTV6QStyle @ 11124 NONAME
+ _ZTV7QAction @ 11125 NONAME
+ _ZTV7QBitmap @ 11126 NONAME
+ _ZTV7QDialog @ 11127 NONAME
+ _ZTV7QLayout @ 11128 NONAME
+ _ZTV7QPixmap @ 11129 NONAME
+ _ZTV7QSlider @ 11130 NONAME
+ _ZTV7QTabBar @ 11131 NONAME
+ _ZTV7QWidget @ 11132 NONAME
+ _ZTV7QWizard @ 11133 NONAME
+ _ZTV8QGesture @ 11134 NONAME
+ _ZTV8QMdiArea @ 11135 NONAME
+ _ZTV8QMenuBar @ 11136 NONAME
+ _ZTV8QPicture @ 11137 NONAME
+ _ZTV8QSpinBox @ 11138 NONAME
+ _ZTV8QStroker @ 11139 NONAME
+ _ZTV8QToolBar @ 11140 NONAME
+ _ZTV8QToolBox @ 11141 NONAME
+ _ZTV9QCheckBox @ 11142 NONAME
+ _ZTV9QComboBox @ 11143 NONAME
+ _ZTV9QDateEdit @ 11144 NONAME
+ _ZTV9QDirModel @ 11145 NONAME
+ _ZTV9QGroupBox @ 11146 NONAME
+ _ZTV9QKeyEvent @ 11147 NONAME
+ _ZTV9QLineEdit @ 11148 NONAME
+ _ZTV9QListView @ 11149 NONAME
+ _ZTV9QS60Style @ 11150 NONAME
+ _ZTV9QShortcut @ 11151 NONAME
+ _ZTV9QSizeGrip @ 11152 NONAME
+ _ZTV9QSplitter @ 11153 NONAME
+ _ZTV9QTextEdit @ 11154 NONAME
+ _ZTV9QTextList @ 11155 NONAME
+ _ZTV9QTimeEdit @ 11156 NONAME
+ _ZTV9QTreeView @ 11157 NONAME
+ _ZTV9QUndoView @ 11158 NONAME
+ _ZTVN4QCss13StyleSelectorE @ 11159 NONAME
+ _ZThn12_N10QDropEventD0Ev @ 11160 NONAME
+ _ZThn12_N10QDropEventD1Ev @ 11161 NONAME
+ _ZThn12_N14QDragMoveEventD0Ev @ 11162 NONAME
+ _ZThn12_N14QDragMoveEventD1Ev @ 11163 NONAME
+ _ZThn12_N15QDragEnterEventD0Ev @ 11164 NONAME
+ _ZThn12_N15QDragEnterEventD1Ev @ 11165 NONAME
+ _ZThn12_N19QCoeFepInputContext29SetStateTransferingOwnershipLEPN33MCoeFepAwareTextEditor_Extension16CStateE4TUid @ 11166 NONAME
+ _ZThn12_N19QCoeFepInputContext5StateE4TUid @ 11167 NONAME
+ _ZThn12_NK10QDropEvent11encodedDataEPKc @ 11168 NONAME
+ _ZThn12_NK10QDropEvent6formatEi @ 11169 NONAME
+ _ZThn12_NK10QDropEvent8providesEPKc @ 11170 NONAME
+ _ZThn16_N15QGraphicsWidget11setGeometryERK6QRectF @ 11171 NONAME
+ _ZThn16_N15QGraphicsWidget14updateGeometryEv @ 11172 NONAME
+ _ZThn16_N15QGraphicsWidgetD0Ev @ 11173 NONAME
+ _ZThn16_N15QGraphicsWidgetD1Ev @ 11174 NONAME
+ _ZThn16_N19QCoeFepInputContext15MopSupplyObjectE8TTypeUid @ 11175 NONAME
+ _ZThn16_N20QGraphicsProxyWidget11setGeometryERK6QRectF @ 11176 NONAME
+ _ZThn16_N20QGraphicsProxyWidgetD0Ev @ 11177 NONAME
+ _ZThn16_N20QGraphicsProxyWidgetD1Ev @ 11178 NONAME
+ _ZThn16_NK15QGraphicsWidget18getContentsMarginsEPfS0_S0_S0_ @ 11179 NONAME
+ _ZThn16_NK15QGraphicsWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 11180 NONAME
+ _ZThn16_NK20QGraphicsProxyWidget8sizeHintEN2Qt8SizeHintERK6QSizeF @ 11181 NONAME
+ _ZThn24_N13QS60MainAppUi12RestoreMenuLEP11CCoeControliN16MEikMenuObserver9TMenuTypeE @ 11182 NONAME
+ _ZThn24_N13QS60MainAppUi15DynInitMenuBarLEiP11CEikMenuBar @ 11183 NONAME
+ _ZThn24_N13QS60MainAppUi16DynInitMenuPaneLEiP12CEikMenuPane @ 11184 NONAME
+ _ZThn88_N13QS60MainAppUi26HandleStatusPaneSizeChangeEv @ 11185 NONAME
+ _ZThn8_N10QBoxLayout10invalidateEv @ 11186 NONAME
+ _ZThn8_N10QBoxLayout11setGeometryERK5QRect @ 11187 NONAME
+ _ZThn8_N10QBoxLayoutD0Ev @ 11188 NONAME
+ _ZThn8_N10QBoxLayoutD1Ev @ 11189 NONAME
+ _ZThn8_N10QLCDNumberD0Ev @ 11190 NONAME
+ _ZThn8_N10QLCDNumberD1Ev @ 11191 NONAME
+ _ZThn8_N10QScrollBarD0Ev @ 11192 NONAME
+ _ZThn8_N10QScrollBarD1Ev @ 11193 NONAME
+ _ZThn8_N10QStatusBarD0Ev @ 11194 NONAME
+ _ZThn8_N10QStatusBarD1Ev @ 11195 NONAME
+ _ZThn8_N10QTabWidgetD0Ev @ 11196 NONAME
+ _ZThn8_N10QTabWidgetD1Ev @ 11197 NONAME
+ _ZThn8_N10QTableViewD0Ev @ 11198 NONAME
+ _ZThn8_N10QTableViewD1Ev @ 11199 NONAME
+ _ZThn8_N10QWorkspaceD0Ev @ 11200 NONAME
+ _ZThn8_N10QWorkspaceD1Ev @ 11201 NONAME
+ _ZThn8_N11QColumnViewD0Ev @ 11202 NONAME
+ _ZThn8_N11QColumnViewD1Ev @ 11203 NONAME
+ _ZThn8_N11QDockWidgetD0Ev @ 11204 NONAME
+ _ZThn8_N11QDockWidgetD1Ev @ 11205 NONAME
+ _ZThn8_N11QFileDialogD0Ev @ 11206 NONAME
+ _ZThn8_N11QFileDialogD1Ev @ 11207 NONAME
+ _ZThn8_N11QFocusFrameD0Ev @ 11208 NONAME
+ _ZThn8_N11QFocusFrameD1Ev @ 11209 NONAME
+ _ZThn8_N11QFontDialogD0Ev @ 11210 NONAME
+ _ZThn8_N11QFontDialogD1Ev @ 11211 NONAME
+ _ZThn8_N11QFormLayout10invalidateEv @ 11212 NONAME
+ _ZThn8_N11QFormLayout11setGeometryERK5QRect @ 11213 NONAME
+ _ZThn8_N11QFormLayoutD0Ev @ 11214 NONAME
+ _ZThn8_N11QFormLayoutD1Ev @ 11215 NONAME
+ _ZThn8_N11QGridLayout10invalidateEv @ 11216 NONAME
+ _ZThn8_N11QGridLayout11setGeometryERK5QRect @ 11217 NONAME
+ _ZThn8_N11QGridLayoutD0Ev @ 11218 NONAME
+ _ZThn8_N11QGridLayoutD1Ev @ 11219 NONAME
+ _ZThn8_N11QHBoxLayoutD0Ev @ 11220 NONAME
+ _ZThn8_N11QHBoxLayoutD1Ev @ 11221 NONAME
+ _ZThn8_N11QHeaderViewD0Ev @ 11222 NONAME
+ _ZThn8_N11QHeaderViewD1Ev @ 11223 NONAME
+ _ZThn8_N11QListWidgetD0Ev @ 11224 NONAME
+ _ZThn8_N11QListWidgetD1Ev @ 11225 NONAME
+ _ZThn8_N11QMainWindowD0Ev @ 11226 NONAME
+ _ZThn8_N11QMainWindowD1Ev @ 11227 NONAME
+ _ZThn8_N11QMessageBoxD0Ev @ 11228 NONAME
+ _ZThn8_N11QMessageBoxD1Ev @ 11229 NONAME
+ _ZThn8_N11QPushButtonD0Ev @ 11230 NONAME
+ _ZThn8_N11QPushButtonD1Ev @ 11231 NONAME
+ _ZThn8_N11QRubberBandD0Ev @ 11232 NONAME
+ _ZThn8_N11QRubberBandD1Ev @ 11233 NONAME
+ _ZThn8_N11QScrollAreaD0Ev @ 11234 NONAME
+ _ZThn8_N11QScrollAreaD1Ev @ 11235 NONAME
+ _ZThn8_N11QToolButtonD0Ev @ 11236 NONAME
+ _ZThn8_N11QToolButtonD1Ev @ 11237 NONAME
+ _ZThn8_N11QTreeWidgetD0Ev @ 11238 NONAME
+ _ZThn8_N11QTreeWidgetD1Ev @ 11239 NONAME
+ _ZThn8_N11QVBoxLayoutD0Ev @ 11240 NONAME
+ _ZThn8_N11QVBoxLayoutD1Ev @ 11241 NONAME
+ _ZThn8_N12QColorDialogD0Ev @ 11242 NONAME
+ _ZThn8_N12QColorDialogD1Ev @ 11243 NONAME
+ _ZThn8_N12QInputDialogD0Ev @ 11244 NONAME
+ _ZThn8_N12QInputDialogD1Ev @ 11245 NONAME
+ _ZThn8_N12QStylePluginD0Ev @ 11246 NONAME
+ _ZThn8_N12QStylePluginD1Ev @ 11247 NONAME
+ _ZThn8_N12QTableWidgetD0Ev @ 11248 NONAME
+ _ZThn8_N12QTableWidgetD1Ev @ 11249 NONAME
+ _ZThn8_N12QTextBrowserD0Ev @ 11250 NONAME
+ _ZThn8_N12QTextBrowserD1Ev @ 11251 NONAME
+ _ZThn8_N13QErrorMessageD0Ev @ 11252 NONAME
+ _ZThn8_N13QErrorMessageD1Ev @ 11253 NONAME
+ _ZThn8_N13QFontComboBoxD0Ev @ 11254 NONAME
+ _ZThn8_N13QFontComboBoxD1Ev @ 11255 NONAME
+ _ZThn8_N13QGraphicsViewD0Ev @ 11256 NONAME
+ _ZThn8_N13QGraphicsViewD1Ev @ 11257 NONAME
+ _ZThn8_N13QMdiSubWindowD0Ev @ 11258 NONAME
+ _ZThn8_N13QMdiSubWindowD1Ev @ 11259 NONAME
+ _ZThn8_N13QSplashScreenD0Ev @ 11260 NONAME
+ _ZThn8_N13QSplashScreenD1Ev @ 11261 NONAME
+ _ZThn8_N14QDesktopWidgetD0Ev @ 11262 NONAME
+ _ZThn8_N14QDesktopWidgetD1Ev @ 11263 NONAME
+ _ZThn8_N14QImageIOPluginD0Ev @ 11264 NONAME
+ _ZThn8_N14QImageIOPluginD1Ev @ 11265 NONAME
+ _ZThn8_N14QPlainTextEditD0Ev @ 11266 NONAME
+ _ZThn8_N14QPlainTextEditD1Ev @ 11267 NONAME
+ _ZThn8_N14QStackedLayout11setGeometryERK5QRect @ 11268 NONAME
+ _ZThn8_N14QStackedLayoutD0Ev @ 11269 NONAME
+ _ZThn8_N14QStackedLayoutD1Ev @ 11270 NONAME
+ _ZThn8_N14QStackedWidgetD0Ev @ 11271 NONAME
+ _ZThn8_N14QStackedWidgetD1Ev @ 11272 NONAME
+ _ZThn8_N15QAbstractButtonD0Ev @ 11273 NONAME
+ _ZThn8_N15QAbstractButtonD1Ev @ 11274 NONAME
+ _ZThn8_N15QAbstractSliderD0Ev @ 11275 NONAME
+ _ZThn8_N15QAbstractSliderD1Ev @ 11276 NONAME
+ _ZThn8_N15QCalendarWidgetD0Ev @ 11277 NONAME
+ _ZThn8_N15QCalendarWidgetD1Ev @ 11278 NONAME
+ _ZThn8_N15QGraphicsWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 11279 NONAME
+ _ZThn8_N15QGraphicsWidget10sceneEventEP6QEvent @ 11280 NONAME
+ _ZThn8_N15QGraphicsWidget12focusInEventEP11QFocusEvent @ 11281 NONAME
+ _ZThn8_N15QGraphicsWidget13focusOutEventEP11QFocusEvent @ 11282 NONAME
+ _ZThn8_N15QGraphicsWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11283 NONAME
+ _ZThn8_N15QGraphicsWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11284 NONAME
+ _ZThn8_N15QGraphicsWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11285 NONAME
+ _ZThn8_N15QGraphicsWidgetD0Ev @ 11286 NONAME
+ _ZThn8_N15QGraphicsWidgetD1Ev @ 11287 NONAME
+ _ZThn8_N15QProgressDialogD0Ev @ 11288 NONAME
+ _ZThn8_N15QProgressDialogD1Ev @ 11289 NONAME
+ _ZThn8_N16QAbstractSpinBoxD0Ev @ 11290 NONAME
+ _ZThn8_N16QAbstractSpinBoxD1Ev @ 11291 NONAME
+ _ZThn8_N16QDialogButtonBoxD0Ev @ 11292 NONAME
+ _ZThn8_N16QDialogButtonBoxD1Ev @ 11293 NONAME
+ _ZThn8_N17QAbstractItemViewD0Ev @ 11294 NONAME
+ _ZThn8_N17QAbstractItemViewD1Ev @ 11295 NONAME
+ _ZThn8_N17QDockWidgetLayout11setGeometryERK5QRect @ 11296 NONAME
+ _ZThn8_N17QDockWidgetLayoutD0Ev @ 11297 NONAME
+ _ZThn8_N17QDockWidgetLayoutD1Ev @ 11298 NONAME
+ _ZThn8_N17QGraphicsTextItem10sceneEventEP6QEvent @ 11299 NONAME
+ _ZThn8_N17QGraphicsTextItem12focusInEventEP11QFocusEvent @ 11300 NONAME
+ _ZThn8_N17QGraphicsTextItem12setExtensionEN13QGraphicsItem9ExtensionERK8QVariant @ 11301 NONAME
+ _ZThn8_N17QGraphicsTextItem13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 11302 NONAME
+ _ZThn8_N17QGraphicsTextItem13focusOutEventEP11QFocusEvent @ 11303 NONAME
+ _ZThn8_N17QGraphicsTextItem13keyPressEventEP9QKeyEvent @ 11304 NONAME
+ _ZThn8_N17QGraphicsTextItem14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 11305 NONAME
+ _ZThn8_N17QGraphicsTextItem14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 11306 NONAME
+ _ZThn8_N17QGraphicsTextItem14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11307 NONAME
+ _ZThn8_N17QGraphicsTextItem14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 11308 NONAME
+ _ZThn8_N17QGraphicsTextItem15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 11309 NONAME
+ _ZThn8_N17QGraphicsTextItem15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11310 NONAME
+ _ZThn8_N17QGraphicsTextItem15keyReleaseEventEP9QKeyEvent @ 11311 NONAME
+ _ZThn8_N17QGraphicsTextItem15mousePressEventEP24QGraphicsSceneMouseEvent @ 11312 NONAME
+ _ZThn8_N17QGraphicsTextItem16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 11313 NONAME
+ _ZThn8_N17QGraphicsTextItem16inputMethodEventEP17QInputMethodEvent @ 11314 NONAME
+ _ZThn8_N17QGraphicsTextItem17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 11315 NONAME
+ _ZThn8_N17QGraphicsTextItem21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 11316 NONAME
+ _ZThn8_N17QGraphicsTextItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11317 NONAME
+ _ZThn8_N17QGraphicsTextItem9dropEventEP27QGraphicsSceneDragDropEvent @ 11318 NONAME
+ _ZThn8_N17QGraphicsTextItemD0Ev @ 11319 NONAME
+ _ZThn8_N17QGraphicsTextItemD1Ev @ 11320 NONAME
+ _ZThn8_N17QIconEnginePluginD0Ev @ 11321 NONAME
+ _ZThn8_N17QIconEnginePluginD1Ev @ 11322 NONAME
+ _ZThn8_N19QAbstractScrollAreaD0Ev @ 11323 NONAME
+ _ZThn8_N19QAbstractScrollAreaD1Ev @ 11324 NONAME
+ _ZThn8_N19QCoeFepInputContext10Extension1ERi @ 11325 NONAME
+ _ZThn8_N19QCoeFepInputContext19CancelFepInlineEditEv @ 11326 NONAME
+ _ZThn8_N19QCoeFepInputContext19StartFepInlineEditLERK7TDesC16iiPK15MFormCustomDrawR29MFepInlineTextFormatRetrieverR39MFepPointerEventHandlerDuringInlineEdit @ 11327 NONAME
+ _ZThn8_N19QCoeFepInputContext20UpdateFepInlineTextLERK7TDesC16i @ 11328 NONAME
+ _ZThn8_N19QCoeFepInputContext22DoCommitFepInlineEditLEv @ 11329 NONAME
+ _ZThn8_N19QCoeFepInputContext25SetCursorSelectionForFepLERK16TCursorSelection @ 11330 NONAME
+ _ZThn8_N19QCoeFepInputContext33SetInlineEditingCursorVisibilityLEi @ 11331 NONAME
+ _ZThn8_N19QIconEnginePluginV2D0Ev @ 11332 NONAME
+ _ZThn8_N19QIconEnginePluginV2D1Ev @ 11333 NONAME
+ _ZThn8_N19QInputContextPluginD0Ev @ 11334 NONAME
+ _ZThn8_N19QInputContextPluginD1Ev @ 11335 NONAME
+ _ZThn8_N20QGraphicsProxyWidget10itemChangeEN13QGraphicsItem18GraphicsItemChangeERK8QVariant @ 11336 NONAME
+ _ZThn8_N20QGraphicsProxyWidget10wheelEventEP24QGraphicsSceneWheelEvent @ 11337 NONAME
+ _ZThn8_N20QGraphicsProxyWidget12focusInEventEP11QFocusEvent @ 11338 NONAME
+ _ZThn8_N20QGraphicsProxyWidget13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 11339 NONAME
+ _ZThn8_N20QGraphicsProxyWidget13focusOutEventEP11QFocusEvent @ 11340 NONAME
+ _ZThn8_N20QGraphicsProxyWidget13keyPressEventEP9QKeyEvent @ 11341 NONAME
+ _ZThn8_N20QGraphicsProxyWidget14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 11342 NONAME
+ _ZThn8_N20QGraphicsProxyWidget14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 11343 NONAME
+ _ZThn8_N20QGraphicsProxyWidget14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 11344 NONAME
+ _ZThn8_N20QGraphicsProxyWidget14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 11345 NONAME
+ _ZThn8_N20QGraphicsProxyWidget15hoverEnterEventEP24QGraphicsSceneHoverEvent @ 11346 NONAME
+ _ZThn8_N20QGraphicsProxyWidget15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 11347 NONAME
+ _ZThn8_N20QGraphicsProxyWidget15keyReleaseEventEP9QKeyEvent @ 11348 NONAME
+ _ZThn8_N20QGraphicsProxyWidget15mousePressEventEP24QGraphicsSceneMouseEvent @ 11349 NONAME
+ _ZThn8_N20QGraphicsProxyWidget16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 11350 NONAME
+ _ZThn8_N20QGraphicsProxyWidget17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 11351 NONAME
+ _ZThn8_N20QGraphicsProxyWidget21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 11352 NONAME
+ _ZThn8_N20QGraphicsProxyWidget5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 11353 NONAME
+ _ZThn8_N20QGraphicsProxyWidget9dropEventEP27QGraphicsSceneDragDropEvent @ 11354 NONAME
+ _ZThn8_N20QGraphicsProxyWidgetD0Ev @ 11355 NONAME
+ _ZThn8_N20QGraphicsProxyWidgetD1Ev @ 11356 NONAME
+ _ZThn8_N20QPictureFormatPlugin11loadPictureERK7QStringS2_P8QPicture @ 11357 NONAME
+ _ZThn8_N20QPictureFormatPlugin11savePictureERK7QStringS2_RK8QPicture @ 11358 NONAME
+ _ZThn8_N20QPictureFormatPluginD0Ev @ 11359 NONAME
+ _ZThn8_N20QPictureFormatPluginD1Ev @ 11360 NONAME
+ _ZThn8_N21QGraphicsSystemPluginD0Ev @ 11361 NONAME
+ _ZThn8_N21QGraphicsSystemPluginD1Ev @ 11362 NONAME
+ _ZThn8_N5QDialD0Ev @ 11363 NONAME
+ _ZThn8_N5QDialD1Ev @ 11364 NONAME
+ _ZThn8_N5QMenuD0Ev @ 11365 NONAME
+ _ZThn8_N5QMenuD1Ev @ 11366 NONAME
+ _ZThn8_N6QFrameD0Ev @ 11367 NONAME
+ _ZThn8_N6QFrameD1Ev @ 11368 NONAME
+ _ZThn8_N6QLabelD0Ev @ 11369 NONAME
+ _ZThn8_N6QLabelD1Ev @ 11370 NONAME
+ _ZThn8_N7QDialogD0Ev @ 11371 NONAME
+ _ZThn8_N7QDialogD1Ev @ 11372 NONAME
+ _ZThn8_N7QLayout10invalidateEv @ 11373 NONAME
+ _ZThn8_N7QLayout11setGeometryERK5QRect @ 11374 NONAME
+ _ZThn8_N7QLayout6layoutEv @ 11375 NONAME
+ _ZThn8_N7QLayoutD0Ev @ 11376 NONAME
+ _ZThn8_N7QLayoutD1Ev @ 11377 NONAME
+ _ZThn8_N7QSliderD0Ev @ 11378 NONAME
+ _ZThn8_N7QSliderD1Ev @ 11379 NONAME
+ _ZThn8_N7QTabBarD0Ev @ 11380 NONAME
+ _ZThn8_N7QTabBarD1Ev @ 11381 NONAME
+ _ZThn8_N7QWidgetD0Ev @ 11382 NONAME
+ _ZThn8_N7QWidgetD1Ev @ 11383 NONAME
+ _ZThn8_N7QWizardD0Ev @ 11384 NONAME
+ _ZThn8_N7QWizardD1Ev @ 11385 NONAME
+ _ZThn8_N8QMdiAreaD0Ev @ 11386 NONAME
+ _ZThn8_N8QMdiAreaD1Ev @ 11387 NONAME
+ _ZThn8_N8QMenuBarD0Ev @ 11388 NONAME
+ _ZThn8_N8QMenuBarD1Ev @ 11389 NONAME
+ _ZThn8_N8QToolBarD0Ev @ 11390 NONAME
+ _ZThn8_N8QToolBarD1Ev @ 11391 NONAME
+ _ZThn8_N8QToolBoxD0Ev @ 11392 NONAME
+ _ZThn8_N8QToolBoxD1Ev @ 11393 NONAME
+ _ZThn8_N9QComboBoxD0Ev @ 11394 NONAME
+ _ZThn8_N9QComboBoxD1Ev @ 11395 NONAME
+ _ZThn8_N9QGroupBoxD0Ev @ 11396 NONAME
+ _ZThn8_N9QGroupBoxD1Ev @ 11397 NONAME
+ _ZThn8_N9QLineEditD0Ev @ 11398 NONAME
+ _ZThn8_N9QLineEditD1Ev @ 11399 NONAME
+ _ZThn8_N9QListViewD0Ev @ 11400 NONAME
+ _ZThn8_N9QListViewD1Ev @ 11401 NONAME
+ _ZThn8_N9QSizeGripD0Ev @ 11402 NONAME
+ _ZThn8_N9QSizeGripD1Ev @ 11403 NONAME
+ _ZThn8_N9QSplitterD0Ev @ 11404 NONAME
+ _ZThn8_N9QSplitterD1Ev @ 11405 NONAME
+ _ZThn8_N9QTextEditD0Ev @ 11406 NONAME
+ _ZThn8_N9QTextEditD1Ev @ 11407 NONAME
+ _ZThn8_N9QTreeViewD0Ev @ 11408 NONAME
+ _ZThn8_N9QTreeViewD1Ev @ 11409 NONAME
+ _ZThn8_N9QUndoViewD0Ev @ 11410 NONAME
+ _ZThn8_N9QUndoViewD1Ev @ 11411 NONAME
+ _ZThn8_NK10QBoxLayout11maximumSizeEv @ 11412 NONAME
+ _ZThn8_NK10QBoxLayout11minimumSizeEv @ 11413 NONAME
+ _ZThn8_NK10QBoxLayout14heightForWidthEi @ 11414 NONAME
+ _ZThn8_NK10QBoxLayout17hasHeightForWidthEv @ 11415 NONAME
+ _ZThn8_NK10QBoxLayout19expandingDirectionsEv @ 11416 NONAME
+ _ZThn8_NK10QBoxLayout21minimumHeightForWidthEi @ 11417 NONAME
+ _ZThn8_NK10QBoxLayout8sizeHintEv @ 11418 NONAME
+ _ZThn8_NK11QFormLayout11minimumSizeEv @ 11419 NONAME
+ _ZThn8_NK11QFormLayout14heightForWidthEi @ 11420 NONAME
+ _ZThn8_NK11QFormLayout17hasHeightForWidthEv @ 11421 NONAME
+ _ZThn8_NK11QFormLayout19expandingDirectionsEv @ 11422 NONAME
+ _ZThn8_NK11QFormLayout8sizeHintEv @ 11423 NONAME
+ _ZThn8_NK11QGridLayout11maximumSizeEv @ 11424 NONAME
+ _ZThn8_NK11QGridLayout11minimumSizeEv @ 11425 NONAME
+ _ZThn8_NK11QGridLayout14heightForWidthEi @ 11426 NONAME
+ _ZThn8_NK11QGridLayout17hasHeightForWidthEv @ 11427 NONAME
+ _ZThn8_NK11QGridLayout19expandingDirectionsEv @ 11428 NONAME
+ _ZThn8_NK11QGridLayout21minimumHeightForWidthEi @ 11429 NONAME
+ _ZThn8_NK11QGridLayout8sizeHintEv @ 11430 NONAME
+ _ZThn8_NK14QStackedLayout11minimumSizeEv @ 11431 NONAME
+ _ZThn8_NK14QStackedLayout8sizeHintEv @ 11432 NONAME
+ _ZThn8_NK15QGraphicsWidget12boundingRectEv @ 11433 NONAME
+ _ZThn8_NK15QGraphicsWidget4typeEv @ 11434 NONAME
+ _ZThn8_NK15QGraphicsWidget5shapeEv @ 11435 NONAME
+ _ZThn8_NK17QDockWidgetLayout11maximumSizeEv @ 11436 NONAME
+ _ZThn8_NK17QDockWidgetLayout11minimumSizeEv @ 11437 NONAME
+ _ZThn8_NK17QDockWidgetLayout8sizeHintEv @ 11438 NONAME
+ _ZThn8_NK17QGraphicsTextItem10opaqueAreaEv @ 11439 NONAME
+ _ZThn8_NK17QGraphicsTextItem12boundingRectEv @ 11440 NONAME
+ _ZThn8_NK17QGraphicsTextItem12isObscuredByEPK13QGraphicsItem @ 11441 NONAME
+ _ZThn8_NK17QGraphicsTextItem16inputMethodQueryEN2Qt16InputMethodQueryE @ 11442 NONAME
+ _ZThn8_NK17QGraphicsTextItem17supportsExtensionEN13QGraphicsItem9ExtensionE @ 11443 NONAME
+ _ZThn8_NK17QGraphicsTextItem4typeEv @ 11444 NONAME
+ _ZThn8_NK17QGraphicsTextItem5shapeEv @ 11445 NONAME
+ _ZThn8_NK17QGraphicsTextItem8containsERK7QPointF @ 11446 NONAME
+ _ZThn8_NK17QGraphicsTextItem9extensionERK8QVariant @ 11447 NONAME
+ _ZThn8_NK19QCoeFepInputContext15GetFormatForFepER11TCharFormati @ 11448 NONAME
+ _ZThn8_NK19QCoeFepInputContext20DocumentLengthForFepEv @ 11449 NONAME
+ _ZThn8_NK19QCoeFepInputContext22GetEditorContentForFepER6TDes16ii @ 11450 NONAME
+ _ZThn8_NK19QCoeFepInputContext24GetCursorSelectionForFepER16TCursorSelection @ 11451 NONAME
+ _ZThn8_NK19QCoeFepInputContext27DocumentMaximumLengthForFepEv @ 11452 NONAME
+ _ZThn8_NK19QCoeFepInputContext27GetScreenCoordinatesForFepLER6TPointRiS2_i @ 11453 NONAME
+ _ZThn8_NK20QGraphicsProxyWidget4typeEv @ 11454 NONAME
+ _ZThn8_NK7QLayout11maximumSizeEv @ 11455 NONAME
+ _ZThn8_NK7QLayout11minimumSizeEv @ 11456 NONAME
+ _ZThn8_NK7QLayout19expandingDirectionsEv @ 11457 NONAME
+ _ZThn8_NK7QLayout7isEmptyEv @ 11458 NONAME
+ _ZThn8_NK7QLayout8geometryEv @ 11459 NONAME
+ _ZThn8_NK7QWidget11paintEngineEv @ 11460 NONAME
+ _ZThn8_NK7QWidget6metricEN12QPaintDevice17PaintDeviceMetricE @ 11461 NONAME
+ _ZThn8_NK7QWidget7devTypeEv @ 11462 NONAME
+ _ZdvRK10QMatrix4x4f @ 11463 NONAME
+ _Zls6QDebug6QFlagsIN13QGraphicsItem16GraphicsItemFlagEE @ 11464 NONAME
+ _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE @ 11465 NONAME
+ _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE @ 11466 NONAME
+ _Zls6QDebugP13QGraphicsItem @ 11467 NONAME
+ _Zls6QDebugPK6QEvent @ 11468 NONAME
+ _Zls6QDebugRK10QMatrix4x4 @ 11469 NONAME
+ _Zls6QDebugRK10QTransform @ 11470 NONAME
+ _Zls6QDebugRK11QQuaternion @ 11471 NONAME
+ _Zls6QDebugRK12QKeySequence @ 11472 NONAME
+ _Zls6QDebugRK12QPainterPath @ 11473 NONAME
+ _Zls6QDebugRK19QItemSelectionRange @ 11474 NONAME
+ _Zls6QDebugRK4QPen @ 11475 NONAME
+ _Zls6QDebugRK5QFont @ 11476 NONAME
+ _Zls6QDebugRK6QBrush @ 11477 NONAME
+ _Zls6QDebugRK6QColor @ 11478 NONAME
+ _Zls6QDebugRK7QMatrix @ 11479 NONAME
+ _Zls6QDebugRK7QRegion @ 11480 NONAME
+ _Zls6QDebugRK8QPolygon @ 11481 NONAME
+ _Zls6QDebugRK9QPolygonF @ 11482 NONAME
+ _Zls6QDebugRK9QVector2D @ 11483 NONAME
+ _Zls6QDebugRK9QVector3D @ 11484 NONAME
+ _Zls6QDebugRK9QVector4D @ 11485 NONAME
+ _ZlsR11QDataStreamRK10QMatrix4x4 @ 11486 NONAME
+ _ZlsR11QDataStreamRK10QTransform @ 11487 NONAME
+ _ZlsR11QDataStreamRK11QQuaternion @ 11488 NONAME
+ _ZlsR11QDataStreamRK11QSizePolicy @ 11489 NONAME
+ _ZlsR11QDataStreamRK11QTextFormat @ 11490 NONAME
+ _ZlsR11QDataStreamRK11QTextLength @ 11491 NONAME
+ _ZlsR11QDataStreamRK12QKeySequence @ 11492 NONAME
+ _ZlsR11QDataStreamRK12QPaintBuffer @ 11493 NONAME
+ _ZlsR11QDataStreamRK12QPainterPath @ 11494 NONAME
+ _ZlsR11QDataStreamRK13QStandardItem @ 11495 NONAME
+ _ZlsR11QDataStreamRK15QListWidgetItem @ 11496 NONAME
+ _ZlsR11QDataStreamRK15QTreeWidgetItem @ 11497 NONAME
+ _ZlsR11QDataStreamRK16QTableWidgetItem @ 11498 NONAME
+ _ZlsR11QDataStreamRK4QPen @ 11499 NONAME
+ _ZlsR11QDataStreamRK5QFont @ 11500 NONAME
+ _ZlsR11QDataStreamRK5QIcon @ 11501 NONAME
+ _ZlsR11QDataStreamRK6QBrush @ 11502 NONAME
+ _ZlsR11QDataStreamRK6QColor @ 11503 NONAME
+ _ZlsR11QDataStreamRK6QImage @ 11504 NONAME
+ _ZlsR11QDataStreamRK7QCursor @ 11505 NONAME
+ _ZlsR11QDataStreamRK7QMatrix @ 11506 NONAME
+ _ZlsR11QDataStreamRK7QPixmap @ 11507 NONAME
+ _ZlsR11QDataStreamRK7QRegion @ 11508 NONAME
+ _ZlsR11QDataStreamRK8QPalette @ 11509 NONAME
+ _ZlsR11QDataStreamRK8QPicture @ 11510 NONAME
+ _ZlsR11QDataStreamRK8QPolygon @ 11511 NONAME
+ _ZlsR11QDataStreamRK9QPolygonF @ 11512 NONAME
+ _ZlsR11QDataStreamRK9QVector2D @ 11513 NONAME
+ _ZlsR11QDataStreamRK9QVector3D @ 11514 NONAME
+ _ZlsR11QDataStreamRK9QVector4D @ 11515 NONAME
+ _ZlsR11QTextStreamRK9QSplitter @ 11516 NONAME
+ _ZlsR6QDebugRK11QVectorPath @ 11517 NONAME
+ _ZmlRK12QPainterPathRK7QMatrix @ 11518 NONAME
+ _ZrsR11QDataStreamR10QMatrix4x4 @ 11519 NONAME
+ _ZrsR11QDataStreamR10QTransform @ 11520 NONAME
+ _ZrsR11QDataStreamR11QQuaternion @ 11521 NONAME
+ _ZrsR11QDataStreamR11QSizePolicy @ 11522 NONAME
+ _ZrsR11QDataStreamR11QTextFormat @ 11523 NONAME
+ _ZrsR11QDataStreamR11QTextLength @ 11524 NONAME
+ _ZrsR11QDataStreamR12QKeySequence @ 11525 NONAME
+ _ZrsR11QDataStreamR12QPaintBuffer @ 11526 NONAME
+ _ZrsR11QDataStreamR12QPainterPath @ 11527 NONAME
+ _ZrsR11QDataStreamR13QStandardItem @ 11528 NONAME
+ _ZrsR11QDataStreamR15QListWidgetItem @ 11529 NONAME
+ _ZrsR11QDataStreamR15QTreeWidgetItem @ 11530 NONAME
+ _ZrsR11QDataStreamR16QTableWidgetItem @ 11531 NONAME
+ _ZrsR11QDataStreamR4QPen @ 11532 NONAME
+ _ZrsR11QDataStreamR5QFont @ 11533 NONAME
+ _ZrsR11QDataStreamR5QIcon @ 11534 NONAME
+ _ZrsR11QDataStreamR6QBrush @ 11535 NONAME
+ _ZrsR11QDataStreamR6QColor @ 11536 NONAME
+ _ZrsR11QDataStreamR6QImage @ 11537 NONAME
+ _ZrsR11QDataStreamR7QCursor @ 11538 NONAME
+ _ZrsR11QDataStreamR7QMatrix @ 11539 NONAME
+ _ZrsR11QDataStreamR7QPixmap @ 11540 NONAME
+ _ZrsR11QDataStreamR7QRegion @ 11541 NONAME
+ _ZrsR11QDataStreamR8QPalette @ 11542 NONAME
+ _ZrsR11QDataStreamR8QPicture @ 11543 NONAME
+ _ZrsR11QDataStreamR8QPolygon @ 11544 NONAME
+ _ZrsR11QDataStreamR9QPolygonF @ 11545 NONAME
+ _ZrsR11QDataStreamR9QVector2D @ 11546 NONAME
+ _ZrsR11QDataStreamR9QVector3D @ 11547 NONAME
+ _ZrsR11QDataStreamR9QVector4D @ 11548 NONAME
+ _ZrsR11QTextStreamR9QSplitter @ 11549 NONAME
+ qt_filedialog_existing_directory_hook @ 11550 NONAME DATA 4
+ qt_filedialog_open_filename_hook @ 11551 NONAME DATA 4
+ qt_filedialog_open_filenames_hook @ 11552 NONAME DATA 4
+ qt_filedialog_save_filename_hook @ 11553 NONAME DATA 4
+ qt_image_cleanup_hook @ 11554 NONAME DATA 4
+ qt_image_cleanup_hook_64 @ 11555 NONAME DATA 4
+ qt_pixmap_cleanup_hook @ 11556 NONAME DATA 4
+ qt_pixmap_cleanup_hook_64 @ 11557 NONAME DATA 4
+ qt_tab_all_widgets @ 11558 NONAME DATA 1
+ _ZN18QGuiPlatformPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 11559 NONAME
+ _ZN18QGuiPlatformPlugin11qt_metacastEPKc @ 11560 NONAME
+ _ZN18QGuiPlatformPlugin12platformHintENS_12PlatformHintE @ 11561 NONAME
+ _ZN18QGuiPlatformPlugin14fileSystemIconERK9QFileInfo @ 11562 NONAME
+ _ZN18QGuiPlatformPlugin16staticMetaObjectE @ 11563 NONAME DATA 16
+ _ZN18QGuiPlatformPlugin19getStaticMetaObjectEv @ 11564 NONAME
+ _ZN18QGuiPlatformPlugin19systemIconThemeNameEv @ 11565 NONAME
+ _ZN18QGuiPlatformPlugin20iconThemeSearchPathsEv @ 11566 NONAME
+ _ZN18QGuiPlatformPlugin7paletteEv @ 11567 NONAME
+ _ZN18QGuiPlatformPlugin9styleNameEv @ 11568 NONAME
+ _ZN18QGuiPlatformPluginC1EP7QObject @ 11569 NONAME
+ _ZN18QGuiPlatformPluginC2EP7QObject @ 11570 NONAME
+ _ZN18QGuiPlatformPluginD0Ev @ 11571 NONAME
+ _ZN18QGuiPlatformPluginD1Ev @ 11572 NONAME
+ _ZN18QGuiPlatformPluginD2Ev @ 11573 NONAME
+ _ZN8QGestureC1ER15QGesturePrivateP7QObject @ 11574 NONAME
+ _ZN8QGestureC2ER15QGesturePrivateP7QObject @ 11575 NONAME
+ _ZNK13QGestureEvent7gestureEN2Qt11GestureTypeE @ 11576 NONAME
+ _ZNK18QGuiPlatformPlugin10metaObjectEv @ 11577 NONAME
+ _ZTI18QGuiPlatformPlugin @ 11578 NONAME
+ _ZTI27QGuiPlatformPluginInterface @ 11579 NONAME
+ _ZTV18QGuiPlatformPlugin @ 11580 NONAME
+ _ZThn8_N18QGuiPlatformPluginD0Ev @ 11581 NONAME
+ _ZThn8_N18QGuiPlatformPluginD1Ev @ 11582 NONAME
+ _Z22qt_paint_device_metricPK12QPaintDeviceNS_17PaintDeviceMetricE @ 11583 NONAME
+ _ZN14QWidgetPrivate17_q_delayedDestroyEP11CCoeControl @ 11584 NONAME
+ _ZN14QWidgetPrivate21activateSymbianWindowEP11CCoeControl @ 11585 NONAME
+ _ZNK17QRasterPixmapData26createCompatiblePixmapDataEv @ 11586 NONAME
diff --git a/src/s60installs/eabi/QtMultimediau.def b/src/s60installs/eabi/QtMultimediau.def
index fb89c0b..30f921c 100644
--- a/src/s60installs/eabi/QtMultimediau.def
+++ b/src/s60installs/eabi/QtMultimediau.def
@@ -5,303 +5,276 @@ EXPORTS
_ZN11QAudioInput13setBufferSizeEi @ 4 NONAME
_ZN11QAudioInput16staticMetaObjectE @ 5 NONAME DATA 16
_ZN11QAudioInput17setNotifyIntervalEi @ 6 NONAME
- _ZN11QAudioInput4stopEv @ 7 NONAME
- _ZN11QAudioInput5resetEv @ 8 NONAME
- _ZN11QAudioInput5startEP9QIODevice @ 9 NONAME
- _ZN11QAudioInput6notifyEv @ 10 NONAME
- _ZN11QAudioInput6resumeEv @ 11 NONAME
- _ZN11QAudioInput7suspendEv @ 12 NONAME
- _ZN11QAudioInputC1ERK12QAudioFormatP7QObject @ 13 NONAME
- _ZN11QAudioInputC1ERK14QAudioDeviceIdRK12QAudioFormatP7QObject @ 14 NONAME ABSENT
- _ZN11QAudioInputC2ERK12QAudioFormatP7QObject @ 15 NONAME
- _ZN11QAudioInputC2ERK14QAudioDeviceIdRK12QAudioFormatP7QObject @ 16 NONAME ABSENT
- _ZN11QAudioInputD0Ev @ 17 NONAME
- _ZN11QAudioInputD1Ev @ 18 NONAME
- _ZN11QAudioInputD2Ev @ 19 NONAME
- _ZN12QAudioFormat11setChannelsEi @ 20 NONAME
- _ZN12QAudioFormat12setByteOrderENS_6EndianE @ 21 NONAME
- _ZN12QAudioFormat12setFrequencyEi @ 22 NONAME
- _ZN12QAudioFormat13setSampleSizeEi @ 23 NONAME
- _ZN12QAudioFormat13setSampleTypeENS_10SampleTypeE @ 24 NONAME
- _ZN12QAudioFormat8setCodecE7QString @ 25 NONAME ABSENT
- _ZN12QAudioFormatC1ERKS_ @ 26 NONAME
- _ZN12QAudioFormatC1Ev @ 27 NONAME
- _ZN12QAudioFormatC2ERKS_ @ 28 NONAME
- _ZN12QAudioFormatC2Ev @ 29 NONAME
- _ZN12QAudioFormatD1Ev @ 30 NONAME
- _ZN12QAudioFormatD2Ev @ 31 NONAME
- _ZN12QAudioFormataSERKS_ @ 32 NONAME
- _ZN12QAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 33 NONAME
- _ZN12QAudioOutput11qt_metacastEPKc @ 34 NONAME
- _ZN12QAudioOutput12stateChangedEN6QAudio5StateE @ 35 NONAME
- _ZN12QAudioOutput13setBufferSizeEi @ 36 NONAME
- _ZN12QAudioOutput16staticMetaObjectE @ 37 NONAME DATA 16
- _ZN12QAudioOutput17setNotifyIntervalEi @ 38 NONAME
- _ZN12QAudioOutput4stopEv @ 39 NONAME
- _ZN12QAudioOutput5resetEv @ 40 NONAME
- _ZN12QAudioOutput5startEP9QIODevice @ 41 NONAME
- _ZN12QAudioOutput6notifyEv @ 42 NONAME
- _ZN12QAudioOutput6resumeEv @ 43 NONAME
- _ZN12QAudioOutput7suspendEv @ 44 NONAME
- _ZN12QAudioOutputC1ERK12QAudioFormatP7QObject @ 45 NONAME
- _ZN12QAudioOutputC1ERK14QAudioDeviceIdRK12QAudioFormatP7QObject @ 46 NONAME ABSENT
- _ZN12QAudioOutputC2ERK12QAudioFormatP7QObject @ 47 NONAME
- _ZN12QAudioOutputC2ERK14QAudioDeviceIdRK12QAudioFormatP7QObject @ 48 NONAME ABSENT
- _ZN12QAudioOutputD0Ev @ 49 NONAME
- _ZN12QAudioOutputD1Ev @ 50 NONAME
- _ZN12QAudioOutputD2Ev @ 51 NONAME
- _ZN14QAudioDeviceIdC1EP21QAudioDeviceIdPrivate @ 52 NONAME ABSENT
- _ZN14QAudioDeviceIdC1ERKS_ @ 53 NONAME ABSENT
- _ZN14QAudioDeviceIdC1Ev @ 54 NONAME ABSENT
- _ZN14QAudioDeviceIdC2EP21QAudioDeviceIdPrivate @ 55 NONAME ABSENT
- _ZN14QAudioDeviceIdC2ERKS_ @ 56 NONAME ABSENT
- _ZN14QAudioDeviceIdC2Ev @ 57 NONAME ABSENT
- _ZN14QAudioDeviceIdD1Ev @ 58 NONAME ABSENT
- _ZN14QAudioDeviceIdD2Ev @ 59 NONAME ABSENT
- _ZN14QAudioDeviceIdaSERKS_ @ 60 NONAME ABSENT
- _ZN16QAudioDeviceInfo10deviceListEN6QAudio4ModeE @ 61 NONAME
- _ZN16QAudioDeviceInfo11qt_metacallEN11QMetaObject4CallEiPPv @ 62 NONAME ABSENT
- _ZN16QAudioDeviceInfo11qt_metacastEPKc @ 63 NONAME ABSENT
- _ZN16QAudioDeviceInfo16staticMetaObjectE @ 64 NONAME DATA 16 ABSENT
- _ZN16QAudioDeviceInfo18defaultInputDeviceEv @ 65 NONAME
- _ZN16QAudioDeviceInfo19defaultOutputDeviceEv @ 66 NONAME
- _ZN16QAudioDeviceInfoC1ERK14QAudioDeviceIdP7QObject @ 67 NONAME ABSENT
- _ZN16QAudioDeviceInfoC2ERK14QAudioDeviceIdP7QObject @ 68 NONAME ABSENT
- _ZN16QAudioDeviceInfoD0Ev @ 69 NONAME ABSENT
- _ZN16QAudioDeviceInfoD1Ev @ 70 NONAME
- _ZN16QAudioDeviceInfoD2Ev @ 71 NONAME
- _ZN18QAudioEnginePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 72 NONAME
- _ZN18QAudioEnginePlugin11qt_metacastEPKc @ 73 NONAME
- _ZN18QAudioEnginePlugin16staticMetaObjectE @ 74 NONAME DATA 16
- _ZN18QAudioEnginePluginC2EP7QObject @ 75 NONAME
- _ZN18QAudioEnginePluginD0Ev @ 76 NONAME
- _ZN18QAudioEnginePluginD1Ev @ 77 NONAME
- _ZN18QAudioEnginePluginD2Ev @ 78 NONAME
- _ZN19QAbstractAudioInput11qt_metacallEN11QMetaObject4CallEiPPv @ 79 NONAME
- _ZN19QAbstractAudioInput11qt_metacastEPKc @ 80 NONAME
- _ZN19QAbstractAudioInput12stateChangedEN6QAudio5StateE @ 81 NONAME
- _ZN19QAbstractAudioInput16staticMetaObjectE @ 82 NONAME DATA 16
- _ZN19QAbstractAudioInput6notifyEv @ 83 NONAME
- _ZN20QAbstractAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 84 NONAME
- _ZN20QAbstractAudioOutput11qt_metacastEPKc @ 85 NONAME
- _ZN20QAbstractAudioOutput12stateChangedEN6QAudio5StateE @ 86 NONAME
- _ZN20QAbstractAudioOutput16staticMetaObjectE @ 87 NONAME DATA 16
- _ZN20QAbstractAudioOutput6notifyEv @ 88 NONAME
- _ZN24QAbstractAudioDeviceInfo11qt_metacallEN11QMetaObject4CallEiPPv @ 89 NONAME
- _ZN24QAbstractAudioDeviceInfo11qt_metacastEPKc @ 90 NONAME
- _ZN24QAbstractAudioDeviceInfo16staticMetaObjectE @ 91 NONAME DATA 16
- _ZNK11QAudioInput10bufferSizeEv @ 92 NONAME
- _ZNK11QAudioInput10bytesReadyEv @ 93 NONAME
- _ZNK11QAudioInput10metaObjectEv @ 94 NONAME
- _ZNK11QAudioInput10periodSizeEv @ 95 NONAME
- _ZNK11QAudioInput14notifyIntervalEv @ 96 NONAME
- _ZNK11QAudioInput5clockEv @ 97 NONAME
- _ZNK11QAudioInput5errorEv @ 98 NONAME
- _ZNK11QAudioInput5stateEv @ 99 NONAME
- _ZNK11QAudioInput6formatEv @ 100 NONAME
- _ZNK11QAudioInput9totalTimeEv @ 101 NONAME
- _ZNK12QAudioFormat10sampleSizeEv @ 102 NONAME
- _ZNK12QAudioFormat10sampleTypeEv @ 103 NONAME
- _ZNK12QAudioFormat5codecEv @ 104 NONAME
- _ZNK12QAudioFormat6isNullEv @ 105 NONAME
- _ZNK12QAudioFormat8channelsEv @ 106 NONAME
- _ZNK12QAudioFormat9byteOrderEv @ 107 NONAME
- _ZNK12QAudioFormat9frequencyEv @ 108 NONAME
- _ZNK12QAudioFormateqERKS_ @ 109 NONAME
- _ZNK12QAudioFormatneERKS_ @ 110 NONAME
- _ZNK12QAudioOutput10bufferSizeEv @ 111 NONAME
- _ZNK12QAudioOutput10metaObjectEv @ 112 NONAME
- _ZNK12QAudioOutput10periodSizeEv @ 113 NONAME
- _ZNK12QAudioOutput14notifyIntervalEv @ 114 NONAME
- _ZNK12QAudioOutput5clockEv @ 115 NONAME
- _ZNK12QAudioOutput5errorEv @ 116 NONAME
- _ZNK12QAudioOutput5stateEv @ 117 NONAME
- _ZNK12QAudioOutput6formatEv @ 118 NONAME
- _ZNK12QAudioOutput9bytesFreeEv @ 119 NONAME
- _ZNK12QAudioOutput9totalTimeEv @ 120 NONAME
- _ZNK14QAudioDeviceId6isNullEv @ 121 NONAME ABSENT
- _ZNK14QAudioDeviceIdeqERKS_ @ 122 NONAME ABSENT
- _ZNK14QAudioDeviceIdneERKS_ @ 123 NONAME ABSENT
- _ZNK16QAudioDeviceInfo10deviceNameEv @ 124 NONAME
- _ZNK16QAudioDeviceInfo10metaObjectEv @ 125 NONAME ABSENT
- _ZNK16QAudioDeviceInfo13nearestFormatERK12QAudioFormat @ 126 NONAME
- _ZNK16QAudioDeviceInfo15preferredFormatEv @ 127 NONAME
- _ZNK16QAudioDeviceInfo15supportedCodecsEv @ 128 NONAME
- _ZNK16QAudioDeviceInfo17isFormatSupportedERK12QAudioFormat @ 129 NONAME
- _ZNK16QAudioDeviceInfo17supportedChannelsEv @ 130 NONAME
- _ZNK16QAudioDeviceInfo19supportedByteOrdersEv @ 131 NONAME
- _ZNK16QAudioDeviceInfo20supportedFrequenciesEv @ 132 NONAME
- _ZNK16QAudioDeviceInfo20supportedSampleSizesEv @ 133 NONAME
- _ZNK16QAudioDeviceInfo20supportedSampleTypesEv @ 134 NONAME
- _ZNK18QAudioEnginePlugin10metaObjectEv @ 135 NONAME
- _ZNK19QAbstractAudioInput10metaObjectEv @ 136 NONAME
- _ZNK20QAbstractAudioOutput10metaObjectEv @ 137 NONAME
- _ZNK24QAbstractAudioDeviceInfo10metaObjectEv @ 138 NONAME
- _ZTI11QAudioInput @ 139 NONAME
- _ZTI12QAudioOutput @ 140 NONAME
- _ZTI16QAudioDeviceInfo @ 141 NONAME ABSENT
- _ZTI18QAudioEnginePlugin @ 142 NONAME
- _ZTI19QAbstractAudioInput @ 143 NONAME
- _ZTI20QAbstractAudioOutput @ 144 NONAME
- _ZTI24QAbstractAudioDeviceInfo @ 145 NONAME
- _ZTI28QAudioEngineFactoryInterface @ 146 NONAME
- _ZTV11QAudioInput @ 147 NONAME
- _ZTV12QAudioOutput @ 148 NONAME
- _ZTV16QAudioDeviceInfo @ 149 NONAME ABSENT
- _ZTV18QAudioEnginePlugin @ 150 NONAME
- _ZTV19QAbstractAudioInput @ 151 NONAME
- _ZTV20QAbstractAudioOutput @ 152 NONAME
- _ZTV24QAbstractAudioDeviceInfo @ 153 NONAME
- _ZThn8_N18QAudioEnginePluginD0Ev @ 154 NONAME
- _ZThn8_N18QAudioEnginePluginD1Ev @ 155 NONAME
- _ZlsR11QDataStreamRK14QAudioDeviceId @ 156 NONAME ABSENT
- _ZrsR11QDataStreamR14QAudioDeviceId @ 157 NONAME ABSENT
- _ZN11QAudioInput19getStaticMetaObjectEv @ 158 NONAME
- _ZN11QVideoFrame10setEndTimeEx @ 159 NONAME
- _ZN11QVideoFrame12setFieldTypeENS_9FieldTypeE @ 160 NONAME
- _ZN11QVideoFrame12setStartTimeEx @ 161 NONAME
- _ZN11QVideoFrame21equivalentImageFormatENS_11PixelFormatE @ 162 NONAME
- _ZN11QVideoFrame21equivalentPixelFormatEN6QImage6FormatE @ 163 NONAME
- _ZN11QVideoFrame3mapEN20QAbstractVideoBuffer7MapModeE @ 164 NONAME
- _ZN11QVideoFrame4bitsEv @ 165 NONAME
- _ZN11QVideoFrame5unmapEv @ 166 NONAME
- _ZN11QVideoFrameC1EP20QAbstractVideoBufferRK5QSizeNS_11PixelFormatE @ 167 NONAME
- _ZN11QVideoFrameC1ERK6QImage @ 168 NONAME
- _ZN11QVideoFrameC1ERKS_ @ 169 NONAME
- _ZN11QVideoFrameC1EiRK5QSizeiNS_11PixelFormatE @ 170 NONAME
- _ZN11QVideoFrameC1Ev @ 171 NONAME
- _ZN11QVideoFrameC2EP20QAbstractVideoBufferRK5QSizeNS_11PixelFormatE @ 172 NONAME
- _ZN11QVideoFrameC2ERK6QImage @ 173 NONAME
- _ZN11QVideoFrameC2ERKS_ @ 174 NONAME
- _ZN11QVideoFrameC2EiRK5QSizeiNS_11PixelFormatE @ 175 NONAME
- _ZN11QVideoFrameC2Ev @ 176 NONAME
- _ZN11QVideoFrameD1Ev @ 177 NONAME
- _ZN11QVideoFrameD2Ev @ 178 NONAME
- _ZN11QVideoFrameaSERKS_ @ 179 NONAME
- _ZN12QAudioOutput19getStaticMetaObjectEv @ 180 NONAME
- _ZN16QAudioDeviceInfo19getStaticMetaObjectEv @ 181 NONAME ABSENT
- _ZN17QImageVideoBuffer3mapEN20QAbstractVideoBuffer7MapModeEPiS2_ @ 182 NONAME
- _ZN17QImageVideoBuffer5unmapEv @ 183 NONAME
- _ZN17QImageVideoBufferC1ERK6QImage @ 184 NONAME
- _ZN17QImageVideoBufferC2ERK6QImage @ 185 NONAME
- _ZN17QImageVideoBufferD0Ev @ 186 NONAME
- _ZN17QImageVideoBufferD1Ev @ 187 NONAME
- _ZN17QImageVideoBufferD2Ev @ 188 NONAME
- _ZN18QAudioEnginePlugin19getStaticMetaObjectEv @ 189 NONAME
- _ZN18QMemoryVideoBuffer3mapEN20QAbstractVideoBuffer7MapModeEPiS2_ @ 190 NONAME
- _ZN18QMemoryVideoBuffer5unmapEv @ 191 NONAME
- _ZN18QMemoryVideoBufferC1ERK10QByteArrayi @ 192 NONAME
- _ZN18QMemoryVideoBufferC2ERK10QByteArrayi @ 193 NONAME
- _ZN18QMemoryVideoBufferD0Ev @ 194 NONAME
- _ZN18QMemoryVideoBufferD1Ev @ 195 NONAME
- _ZN18QMemoryVideoBufferD2Ev @ 196 NONAME
- _ZN19QAbstractAudioInput19getStaticMetaObjectEv @ 197 NONAME
- _ZN19QVideoSurfaceFormat11setPropertyEPKcRK8QVariant @ 198 NONAME
- _ZN19QVideoSurfaceFormat11setViewportERK5QRect @ 199 NONAME
- _ZN19QVideoSurfaceFormat12setFrameRateERK5QPairIiiE @ 200 NONAME
- _ZN19QVideoSurfaceFormat12setFrameRateEii @ 201 NONAME
- _ZN19QVideoSurfaceFormat12setFrameSizeERK5QSizeNS_12ViewportModeE @ 202 NONAME
- _ZN19QVideoSurfaceFormat12setFrameSizeEiiNS_12ViewportModeE @ 203 NONAME
- _ZN19QVideoSurfaceFormat16setYuvColorSpaceENS_13YuvColorSpaceE @ 204 NONAME
- _ZN19QVideoSurfaceFormat19setPixelAspectRatioERK5QSize @ 205 NONAME
- _ZN19QVideoSurfaceFormat19setPixelAspectRatioEii @ 206 NONAME
- _ZN19QVideoSurfaceFormat20setScanLineDirectionENS_9DirectionE @ 207 NONAME
- _ZN19QVideoSurfaceFormatC1ERK5QSizeN11QVideoFrame11PixelFormatEN20QAbstractVideoBuffer10HandleTypeE @ 208 NONAME
- _ZN19QVideoSurfaceFormatC1ERKS_ @ 209 NONAME
- _ZN19QVideoSurfaceFormatC1Ev @ 210 NONAME
- _ZN19QVideoSurfaceFormatC2ERK5QSizeN11QVideoFrame11PixelFormatEN20QAbstractVideoBuffer10HandleTypeE @ 211 NONAME
- _ZN19QVideoSurfaceFormatC2ERKS_ @ 212 NONAME
- _ZN19QVideoSurfaceFormatC2Ev @ 213 NONAME
- _ZN19QVideoSurfaceFormatD1Ev @ 214 NONAME
- _ZN19QVideoSurfaceFormatD2Ev @ 215 NONAME
- _ZN19QVideoSurfaceFormataSERKS_ @ 216 NONAME
- _ZN20QAbstractAudioOutput19getStaticMetaObjectEv @ 217 NONAME
- _ZN20QAbstractVideoBufferC2ENS_10HandleTypeE @ 218 NONAME
- _ZN20QAbstractVideoBufferC2ER27QAbstractVideoBufferPrivateNS_10HandleTypeE @ 219 NONAME
- _ZN20QAbstractVideoBufferD0Ev @ 220 NONAME
- _ZN20QAbstractVideoBufferD1Ev @ 221 NONAME
- _ZN20QAbstractVideoBufferD2Ev @ 222 NONAME
- _ZN21QAbstractVideoSurface11qt_metacallEN11QMetaObject4CallEiPPv @ 223 NONAME
- _ZN21QAbstractVideoSurface11qt_metacastEPKc @ 224 NONAME
- _ZN21QAbstractVideoSurface14startedChangedEb @ 225 NONAME
- _ZN21QAbstractVideoSurface16staticMetaObjectE @ 226 NONAME DATA 16
- _ZN21QAbstractVideoSurface19getStaticMetaObjectEv @ 227 NONAME
- _ZN21QAbstractVideoSurface20surfaceFormatChangedERK19QVideoSurfaceFormat @ 228 NONAME
- _ZN21QAbstractVideoSurface23supportedFormatsChangedEv @ 229 NONAME
- _ZN21QAbstractVideoSurface4stopEv @ 230 NONAME
- _ZN21QAbstractVideoSurface5startERK19QVideoSurfaceFormat @ 231 NONAME
- _ZN21QAbstractVideoSurface8setErrorENS_5ErrorE @ 232 NONAME
- _ZN21QAbstractVideoSurfaceC2EP7QObject @ 233 NONAME
- _ZN21QAbstractVideoSurfaceC2ER28QAbstractVideoSurfacePrivateP7QObject @ 234 NONAME
- _ZN21QAbstractVideoSurfaceD0Ev @ 235 NONAME
- _ZN21QAbstractVideoSurfaceD1Ev @ 236 NONAME
- _ZN21QAbstractVideoSurfaceD2Ev @ 237 NONAME
- _ZN24QAbstractAudioDeviceInfo19getStaticMetaObjectEv @ 238 NONAME
- _ZNK11QVideoFrame10handleTypeEv @ 239 NONAME
- _ZNK11QVideoFrame10isReadableEv @ 240 NONAME
- _ZNK11QVideoFrame10isWritableEv @ 241 NONAME
- _ZNK11QVideoFrame11pixelFormatEv @ 242 NONAME
- _ZNK11QVideoFrame12bytesPerLineEv @ 243 NONAME
- _ZNK11QVideoFrame4bitsEv @ 244 NONAME
- _ZNK11QVideoFrame4sizeEv @ 245 NONAME
- _ZNK11QVideoFrame5widthEv @ 246 NONAME
- _ZNK11QVideoFrame6handleEv @ 247 NONAME
- _ZNK11QVideoFrame6heightEv @ 248 NONAME
- _ZNK11QVideoFrame7endTimeEv @ 249 NONAME
- _ZNK11QVideoFrame7isValidEv @ 250 NONAME
- _ZNK11QVideoFrame7mapModeEv @ 251 NONAME
- _ZNK11QVideoFrame8isMappedEv @ 252 NONAME
- _ZNK11QVideoFrame8numBytesEv @ 253 NONAME
- _ZNK11QVideoFrame9fieldTypeEv @ 254 NONAME
- _ZNK11QVideoFrame9startTimeEv @ 255 NONAME
- _ZNK17QImageVideoBuffer7mapModeEv @ 256 NONAME
- _ZNK18QMemoryVideoBuffer7mapModeEv @ 257 NONAME
- _ZNK19QVideoSurfaceFormat10frameWidthEv @ 258 NONAME
- _ZNK19QVideoSurfaceFormat10handleTypeEv @ 259 NONAME
- _ZNK19QVideoSurfaceFormat11frameHeightEv @ 260 NONAME
- _ZNK19QVideoSurfaceFormat11pixelFormatEv @ 261 NONAME
- _ZNK19QVideoSurfaceFormat13propertyNamesEv @ 262 NONAME
- _ZNK19QVideoSurfaceFormat13yuvColorSpaceEv @ 263 NONAME
- _ZNK19QVideoSurfaceFormat16pixelAspectRatioEv @ 264 NONAME
- _ZNK19QVideoSurfaceFormat17scanLineDirectionEv @ 265 NONAME
- _ZNK19QVideoSurfaceFormat7isValidEv @ 266 NONAME
- _ZNK19QVideoSurfaceFormat8propertyEPKc @ 267 NONAME
- _ZNK19QVideoSurfaceFormat8sizeHintEv @ 268 NONAME
- _ZNK19QVideoSurfaceFormat8viewportEv @ 269 NONAME
- _ZNK19QVideoSurfaceFormat9frameRateEv @ 270 NONAME
- _ZNK19QVideoSurfaceFormat9frameSizeEv @ 271 NONAME
- _ZNK19QVideoSurfaceFormateqERKS_ @ 272 NONAME
- _ZNK19QVideoSurfaceFormatneERKS_ @ 273 NONAME
- _ZNK20QAbstractVideoBuffer10handleTypeEv @ 274 NONAME
- _ZNK20QAbstractVideoBuffer6handleEv @ 275 NONAME
- _ZNK21QAbstractVideoSurface10metaObjectEv @ 276 NONAME
- _ZNK21QAbstractVideoSurface13surfaceFormatEv @ 277 NONAME
- _ZNK21QAbstractVideoSurface17isFormatSupportedERK19QVideoSurfaceFormatPS0_ @ 278 NONAME
- _ZNK21QAbstractVideoSurface5errorEv @ 279 NONAME
- _ZNK21QAbstractVideoSurface9isStartedEv @ 280 NONAME
- _ZTI17QImageVideoBuffer @ 281 NONAME ; #<TI>#
- _ZTI18QMemoryVideoBuffer @ 282 NONAME ; #<TI>#
- _ZTI20QAbstractVideoBuffer @ 283 NONAME ; #<TI>#
- _ZTI21QAbstractVideoSurface @ 284 NONAME ; #<TI>#
- _ZTV17QImageVideoBuffer @ 285 NONAME ; #<VT>#
- _ZTV18QMemoryVideoBuffer @ 286 NONAME ; #<VT>#
- _ZTV20QAbstractVideoBuffer @ 287 NONAME ; #<VT>#
- _ZTV21QAbstractVideoSurface @ 288 NONAME ; #<VT>#
- _Zls6QDebugRK19QVideoSurfaceFormat @ 289 NONAME
- _ZN11QAudioInputC1ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 290 NONAME
- _ZN11QAudioInputC2ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 291 NONAME
- _ZN12QAudioFormat8setCodecERK7QString @ 292 NONAME
- _ZN12QAudioOutputC1ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 293 NONAME
- _ZN12QAudioOutputC2ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 294 NONAME
- _ZN16QAudioDeviceInfoC1ERK7QStringRK10QByteArrayN6QAudio4ModeE @ 295 NONAME
- _ZN16QAudioDeviceInfoC1ERKS_ @ 296 NONAME
- _ZN16QAudioDeviceInfoC1Ev @ 297 NONAME
- _ZN16QAudioDeviceInfoC2ERK7QStringRK10QByteArrayN6QAudio4ModeE @ 298 NONAME
- _ZN16QAudioDeviceInfoC2ERKS_ @ 299 NONAME
- _ZN16QAudioDeviceInfoC2Ev @ 300 NONAME
- _ZN16QAudioDeviceInfoaSERKS_ @ 301 NONAME
- _ZNK16QAudioDeviceInfo4modeEv @ 302 NONAME
- _ZNK16QAudioDeviceInfo5realmEv @ 303 NONAME
- _ZNK16QAudioDeviceInfo6handleEv @ 304 NONAME
- _ZNK16QAudioDeviceInfo6isNullEv @ 305 NONAME
+ _ZN11QAudioInput19getStaticMetaObjectEv @ 7 NONAME
+ _ZN11QAudioInput4stopEv @ 8 NONAME
+ _ZN11QAudioInput5resetEv @ 9 NONAME
+ _ZN11QAudioInput5startEP9QIODevice @ 10 NONAME
+ _ZN11QAudioInput6notifyEv @ 11 NONAME
+ _ZN11QAudioInput6resumeEv @ 12 NONAME
+ _ZN11QAudioInput7suspendEv @ 13 NONAME
+ _ZN11QAudioInputC1ERK12QAudioFormatP7QObject @ 14 NONAME
+ _ZN11QAudioInputC1ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 15 NONAME
+ _ZN11QAudioInputC2ERK12QAudioFormatP7QObject @ 16 NONAME
+ _ZN11QAudioInputC2ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 17 NONAME
+ _ZN11QAudioInputD0Ev @ 18 NONAME
+ _ZN11QAudioInputD1Ev @ 19 NONAME
+ _ZN11QAudioInputD2Ev @ 20 NONAME
+ _ZN11QVideoFrame10setEndTimeEx @ 21 NONAME
+ _ZN11QVideoFrame12setFieldTypeENS_9FieldTypeE @ 22 NONAME
+ _ZN11QVideoFrame12setStartTimeEx @ 23 NONAME
+ _ZN11QVideoFrame21equivalentImageFormatENS_11PixelFormatE @ 24 NONAME
+ _ZN11QVideoFrame21equivalentPixelFormatEN6QImage6FormatE @ 25 NONAME
+ _ZN11QVideoFrame3mapEN20QAbstractVideoBuffer7MapModeE @ 26 NONAME
+ _ZN11QVideoFrame4bitsEv @ 27 NONAME
+ _ZN11QVideoFrame5unmapEv @ 28 NONAME
+ _ZN11QVideoFrameC1EP20QAbstractVideoBufferRK5QSizeNS_11PixelFormatE @ 29 NONAME
+ _ZN11QVideoFrameC1ERK6QImage @ 30 NONAME
+ _ZN11QVideoFrameC1ERKS_ @ 31 NONAME
+ _ZN11QVideoFrameC1EiRK5QSizeiNS_11PixelFormatE @ 32 NONAME
+ _ZN11QVideoFrameC1Ev @ 33 NONAME
+ _ZN11QVideoFrameC2EP20QAbstractVideoBufferRK5QSizeNS_11PixelFormatE @ 34 NONAME
+ _ZN11QVideoFrameC2ERK6QImage @ 35 NONAME
+ _ZN11QVideoFrameC2ERKS_ @ 36 NONAME
+ _ZN11QVideoFrameC2EiRK5QSizeiNS_11PixelFormatE @ 37 NONAME
+ _ZN11QVideoFrameC2Ev @ 38 NONAME
+ _ZN11QVideoFrameD1Ev @ 39 NONAME
+ _ZN11QVideoFrameD2Ev @ 40 NONAME
+ _ZN11QVideoFrameaSERKS_ @ 41 NONAME
+ _ZN12QAudioFormat11setChannelsEi @ 42 NONAME
+ _ZN12QAudioFormat12setByteOrderENS_6EndianE @ 43 NONAME
+ _ZN12QAudioFormat12setFrequencyEi @ 44 NONAME
+ _ZN12QAudioFormat13setSampleSizeEi @ 45 NONAME
+ _ZN12QAudioFormat13setSampleTypeENS_10SampleTypeE @ 46 NONAME
+ _ZN12QAudioFormat8setCodecERK7QString @ 47 NONAME
+ _ZN12QAudioFormatC1ERKS_ @ 48 NONAME
+ _ZN12QAudioFormatC1Ev @ 49 NONAME
+ _ZN12QAudioFormatC2ERKS_ @ 50 NONAME
+ _ZN12QAudioFormatC2Ev @ 51 NONAME
+ _ZN12QAudioFormatD1Ev @ 52 NONAME
+ _ZN12QAudioFormatD2Ev @ 53 NONAME
+ _ZN12QAudioFormataSERKS_ @ 54 NONAME
+ _ZN12QAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 55 NONAME
+ _ZN12QAudioOutput11qt_metacastEPKc @ 56 NONAME
+ _ZN12QAudioOutput12stateChangedEN6QAudio5StateE @ 57 NONAME
+ _ZN12QAudioOutput13setBufferSizeEi @ 58 NONAME
+ _ZN12QAudioOutput16staticMetaObjectE @ 59 NONAME DATA 16
+ _ZN12QAudioOutput17setNotifyIntervalEi @ 60 NONAME
+ _ZN12QAudioOutput19getStaticMetaObjectEv @ 61 NONAME
+ _ZN12QAudioOutput4stopEv @ 62 NONAME
+ _ZN12QAudioOutput5resetEv @ 63 NONAME
+ _ZN12QAudioOutput5startEP9QIODevice @ 64 NONAME
+ _ZN12QAudioOutput6notifyEv @ 65 NONAME
+ _ZN12QAudioOutput6resumeEv @ 66 NONAME
+ _ZN12QAudioOutput7suspendEv @ 67 NONAME
+ _ZN12QAudioOutputC1ERK12QAudioFormatP7QObject @ 68 NONAME
+ _ZN12QAudioOutputC1ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 69 NONAME
+ _ZN12QAudioOutputC2ERK12QAudioFormatP7QObject @ 70 NONAME
+ _ZN12QAudioOutputC2ERK16QAudioDeviceInfoRK12QAudioFormatP7QObject @ 71 NONAME
+ _ZN12QAudioOutputD0Ev @ 72 NONAME
+ _ZN12QAudioOutputD1Ev @ 73 NONAME
+ _ZN12QAudioOutputD2Ev @ 74 NONAME
+ _ZN16QAudioDeviceInfo10deviceListEN6QAudio4ModeE @ 75 NONAME
+ _ZN16QAudioDeviceInfo18defaultInputDeviceEv @ 76 NONAME
+ _ZN16QAudioDeviceInfo19defaultOutputDeviceEv @ 77 NONAME
+ _ZN16QAudioDeviceInfoC1ERK7QStringRK10QByteArrayN6QAudio4ModeE @ 78 NONAME
+ _ZN16QAudioDeviceInfoC1ERKS_ @ 79 NONAME
+ _ZN16QAudioDeviceInfoC1Ev @ 80 NONAME
+ _ZN16QAudioDeviceInfoC2ERK7QStringRK10QByteArrayN6QAudio4ModeE @ 81 NONAME
+ _ZN16QAudioDeviceInfoC2ERKS_ @ 82 NONAME
+ _ZN16QAudioDeviceInfoC2Ev @ 83 NONAME
+ _ZN16QAudioDeviceInfoD1Ev @ 84 NONAME
+ _ZN16QAudioDeviceInfoD2Ev @ 85 NONAME
+ _ZN16QAudioDeviceInfoaSERKS_ @ 86 NONAME
+ _ZN17QImageVideoBuffer3mapEN20QAbstractVideoBuffer7MapModeEPiS2_ @ 87 NONAME
+ _ZN17QImageVideoBuffer5unmapEv @ 88 NONAME
+ _ZN17QImageVideoBufferC1ERK6QImage @ 89 NONAME
+ _ZN17QImageVideoBufferC2ERK6QImage @ 90 NONAME
+ _ZN17QImageVideoBufferD0Ev @ 91 NONAME
+ _ZN17QImageVideoBufferD1Ev @ 92 NONAME
+ _ZN17QImageVideoBufferD2Ev @ 93 NONAME
+ _ZN18QAudioEnginePlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 94 NONAME
+ _ZN18QAudioEnginePlugin11qt_metacastEPKc @ 95 NONAME
+ _ZN18QAudioEnginePlugin16staticMetaObjectE @ 96 NONAME DATA 16
+ _ZN18QAudioEnginePlugin19getStaticMetaObjectEv @ 97 NONAME
+ _ZN18QAudioEnginePluginC2EP7QObject @ 98 NONAME
+ _ZN18QAudioEnginePluginD0Ev @ 99 NONAME
+ _ZN18QAudioEnginePluginD1Ev @ 100 NONAME
+ _ZN18QAudioEnginePluginD2Ev @ 101 NONAME
+ _ZN18QMemoryVideoBuffer3mapEN20QAbstractVideoBuffer7MapModeEPiS2_ @ 102 NONAME
+ _ZN18QMemoryVideoBuffer5unmapEv @ 103 NONAME
+ _ZN18QMemoryVideoBufferC1ERK10QByteArrayi @ 104 NONAME
+ _ZN18QMemoryVideoBufferC2ERK10QByteArrayi @ 105 NONAME
+ _ZN18QMemoryVideoBufferD0Ev @ 106 NONAME
+ _ZN18QMemoryVideoBufferD1Ev @ 107 NONAME
+ _ZN18QMemoryVideoBufferD2Ev @ 108 NONAME
+ _ZN19QAbstractAudioInput11qt_metacallEN11QMetaObject4CallEiPPv @ 109 NONAME
+ _ZN19QAbstractAudioInput11qt_metacastEPKc @ 110 NONAME
+ _ZN19QAbstractAudioInput12stateChangedEN6QAudio5StateE @ 111 NONAME
+ _ZN19QAbstractAudioInput16staticMetaObjectE @ 112 NONAME DATA 16
+ _ZN19QAbstractAudioInput19getStaticMetaObjectEv @ 113 NONAME
+ _ZN19QAbstractAudioInput6notifyEv @ 114 NONAME
+ _ZN19QVideoSurfaceFormat11setPropertyEPKcRK8QVariant @ 115 NONAME
+ _ZN19QVideoSurfaceFormat11setViewportERK5QRect @ 116 NONAME
+ _ZN19QVideoSurfaceFormat12setFrameRateERK5QPairIiiE @ 117 NONAME ABSENT
+ _ZN19QVideoSurfaceFormat12setFrameRateEii @ 118 NONAME ABSENT
+ _ZN19QVideoSurfaceFormat12setFrameSizeERK5QSizeNS_12ViewportModeE @ 119 NONAME
+ _ZN19QVideoSurfaceFormat12setFrameSizeEiiNS_12ViewportModeE @ 120 NONAME
+ _ZN19QVideoSurfaceFormat16setYuvColorSpaceENS_13YuvColorSpaceE @ 121 NONAME
+ _ZN19QVideoSurfaceFormat19setPixelAspectRatioERK5QSize @ 122 NONAME
+ _ZN19QVideoSurfaceFormat19setPixelAspectRatioEii @ 123 NONAME
+ _ZN19QVideoSurfaceFormat20setScanLineDirectionENS_9DirectionE @ 124 NONAME
+ _ZN19QVideoSurfaceFormatC1ERK5QSizeN11QVideoFrame11PixelFormatEN20QAbstractVideoBuffer10HandleTypeE @ 125 NONAME
+ _ZN19QVideoSurfaceFormatC1ERKS_ @ 126 NONAME
+ _ZN19QVideoSurfaceFormatC1Ev @ 127 NONAME
+ _ZN19QVideoSurfaceFormatC2ERK5QSizeN11QVideoFrame11PixelFormatEN20QAbstractVideoBuffer10HandleTypeE @ 128 NONAME
+ _ZN19QVideoSurfaceFormatC2ERKS_ @ 129 NONAME
+ _ZN19QVideoSurfaceFormatC2Ev @ 130 NONAME
+ _ZN19QVideoSurfaceFormatD1Ev @ 131 NONAME
+ _ZN19QVideoSurfaceFormatD2Ev @ 132 NONAME
+ _ZN19QVideoSurfaceFormataSERKS_ @ 133 NONAME
+ _ZN20QAbstractAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 134 NONAME
+ _ZN20QAbstractAudioOutput11qt_metacastEPKc @ 135 NONAME
+ _ZN20QAbstractAudioOutput12stateChangedEN6QAudio5StateE @ 136 NONAME
+ _ZN20QAbstractAudioOutput16staticMetaObjectE @ 137 NONAME DATA 16
+ _ZN20QAbstractAudioOutput19getStaticMetaObjectEv @ 138 NONAME
+ _ZN20QAbstractAudioOutput6notifyEv @ 139 NONAME
+ _ZN20QAbstractVideoBufferC2ENS_10HandleTypeE @ 140 NONAME
+ _ZN20QAbstractVideoBufferC2ER27QAbstractVideoBufferPrivateNS_10HandleTypeE @ 141 NONAME
+ _ZN20QAbstractVideoBufferD0Ev @ 142 NONAME
+ _ZN20QAbstractVideoBufferD1Ev @ 143 NONAME
+ _ZN20QAbstractVideoBufferD2Ev @ 144 NONAME
+ _ZN21QAbstractVideoSurface11qt_metacallEN11QMetaObject4CallEiPPv @ 145 NONAME
+ _ZN21QAbstractVideoSurface11qt_metacastEPKc @ 146 NONAME
+ _ZN21QAbstractVideoSurface14startedChangedEb @ 147 NONAME
+ _ZN21QAbstractVideoSurface16staticMetaObjectE @ 148 NONAME DATA 16
+ _ZN21QAbstractVideoSurface19getStaticMetaObjectEv @ 149 NONAME
+ _ZN21QAbstractVideoSurface20surfaceFormatChangedERK19QVideoSurfaceFormat @ 150 NONAME
+ _ZN21QAbstractVideoSurface23supportedFormatsChangedEv @ 151 NONAME
+ _ZN21QAbstractVideoSurface4stopEv @ 152 NONAME
+ _ZN21QAbstractVideoSurface5startERK19QVideoSurfaceFormat @ 153 NONAME
+ _ZN21QAbstractVideoSurface8setErrorENS_5ErrorE @ 154 NONAME
+ _ZN21QAbstractVideoSurfaceC2EP7QObject @ 155 NONAME
+ _ZN21QAbstractVideoSurfaceC2ER28QAbstractVideoSurfacePrivateP7QObject @ 156 NONAME
+ _ZN21QAbstractVideoSurfaceD0Ev @ 157 NONAME
+ _ZN21QAbstractVideoSurfaceD1Ev @ 158 NONAME
+ _ZN21QAbstractVideoSurfaceD2Ev @ 159 NONAME
+ _ZN24QAbstractAudioDeviceInfo11qt_metacallEN11QMetaObject4CallEiPPv @ 160 NONAME
+ _ZN24QAbstractAudioDeviceInfo11qt_metacastEPKc @ 161 NONAME
+ _ZN24QAbstractAudioDeviceInfo16staticMetaObjectE @ 162 NONAME DATA 16
+ _ZN24QAbstractAudioDeviceInfo19getStaticMetaObjectEv @ 163 NONAME
+ _ZNK11QAudioInput10bufferSizeEv @ 164 NONAME
+ _ZNK11QAudioInput10bytesReadyEv @ 165 NONAME
+ _ZNK11QAudioInput10metaObjectEv @ 166 NONAME
+ _ZNK11QAudioInput10periodSizeEv @ 167 NONAME
+ _ZNK11QAudioInput14notifyIntervalEv @ 168 NONAME
+ _ZNK11QAudioInput5clockEv @ 169 NONAME
+ _ZNK11QAudioInput5errorEv @ 170 NONAME
+ _ZNK11QAudioInput5stateEv @ 171 NONAME
+ _ZNK11QAudioInput6formatEv @ 172 NONAME
+ _ZNK11QAudioInput9totalTimeEv @ 173 NONAME
+ _ZNK11QVideoFrame10handleTypeEv @ 174 NONAME
+ _ZNK11QVideoFrame10isReadableEv @ 175 NONAME
+ _ZNK11QVideoFrame10isWritableEv @ 176 NONAME
+ _ZNK11QVideoFrame11pixelFormatEv @ 177 NONAME
+ _ZNK11QVideoFrame12bytesPerLineEv @ 178 NONAME
+ _ZNK11QVideoFrame4bitsEv @ 179 NONAME
+ _ZNK11QVideoFrame4sizeEv @ 180 NONAME
+ _ZNK11QVideoFrame5widthEv @ 181 NONAME
+ _ZNK11QVideoFrame6handleEv @ 182 NONAME
+ _ZNK11QVideoFrame6heightEv @ 183 NONAME
+ _ZNK11QVideoFrame7endTimeEv @ 184 NONAME
+ _ZNK11QVideoFrame7isValidEv @ 185 NONAME
+ _ZNK11QVideoFrame7mapModeEv @ 186 NONAME
+ _ZNK11QVideoFrame8isMappedEv @ 187 NONAME
+ _ZNK11QVideoFrame8numBytesEv @ 188 NONAME
+ _ZNK11QVideoFrame9fieldTypeEv @ 189 NONAME
+ _ZNK11QVideoFrame9startTimeEv @ 190 NONAME
+ _ZNK12QAudioFormat10sampleSizeEv @ 191 NONAME
+ _ZNK12QAudioFormat10sampleTypeEv @ 192 NONAME
+ _ZNK12QAudioFormat5codecEv @ 193 NONAME
+ _ZNK12QAudioFormat6isNullEv @ 194 NONAME
+ _ZNK12QAudioFormat8channelsEv @ 195 NONAME
+ _ZNK12QAudioFormat9byteOrderEv @ 196 NONAME
+ _ZNK12QAudioFormat9frequencyEv @ 197 NONAME
+ _ZNK12QAudioFormateqERKS_ @ 198 NONAME
+ _ZNK12QAudioFormatneERKS_ @ 199 NONAME
+ _ZNK12QAudioOutput10bufferSizeEv @ 200 NONAME
+ _ZNK12QAudioOutput10metaObjectEv @ 201 NONAME
+ _ZNK12QAudioOutput10periodSizeEv @ 202 NONAME
+ _ZNK12QAudioOutput14notifyIntervalEv @ 203 NONAME
+ _ZNK12QAudioOutput5clockEv @ 204 NONAME
+ _ZNK12QAudioOutput5errorEv @ 205 NONAME
+ _ZNK12QAudioOutput5stateEv @ 206 NONAME
+ _ZNK12QAudioOutput6formatEv @ 207 NONAME
+ _ZNK12QAudioOutput9bytesFreeEv @ 208 NONAME
+ _ZNK12QAudioOutput9totalTimeEv @ 209 NONAME
+ _ZNK16QAudioDeviceInfo10deviceNameEv @ 210 NONAME
+ _ZNK16QAudioDeviceInfo13nearestFormatERK12QAudioFormat @ 211 NONAME
+ _ZNK16QAudioDeviceInfo15preferredFormatEv @ 212 NONAME
+ _ZNK16QAudioDeviceInfo15supportedCodecsEv @ 213 NONAME
+ _ZNK16QAudioDeviceInfo17isFormatSupportedERK12QAudioFormat @ 214 NONAME
+ _ZNK16QAudioDeviceInfo17supportedChannelsEv @ 215 NONAME
+ _ZNK16QAudioDeviceInfo19supportedByteOrdersEv @ 216 NONAME
+ _ZNK16QAudioDeviceInfo20supportedFrequenciesEv @ 217 NONAME
+ _ZNK16QAudioDeviceInfo20supportedSampleSizesEv @ 218 NONAME
+ _ZNK16QAudioDeviceInfo20supportedSampleTypesEv @ 219 NONAME
+ _ZNK16QAudioDeviceInfo4modeEv @ 220 NONAME
+ _ZNK16QAudioDeviceInfo5realmEv @ 221 NONAME
+ _ZNK16QAudioDeviceInfo6handleEv @ 222 NONAME
+ _ZNK16QAudioDeviceInfo6isNullEv @ 223 NONAME
+ _ZNK17QImageVideoBuffer7mapModeEv @ 224 NONAME
+ _ZNK18QAudioEnginePlugin10metaObjectEv @ 225 NONAME
+ _ZNK18QMemoryVideoBuffer7mapModeEv @ 226 NONAME
+ _ZNK19QAbstractAudioInput10metaObjectEv @ 227 NONAME
+ _ZNK19QVideoSurfaceFormat10frameWidthEv @ 228 NONAME
+ _ZNK19QVideoSurfaceFormat10handleTypeEv @ 229 NONAME
+ _ZNK19QVideoSurfaceFormat11frameHeightEv @ 230 NONAME
+ _ZNK19QVideoSurfaceFormat11pixelFormatEv @ 231 NONAME
+ _ZNK19QVideoSurfaceFormat13propertyNamesEv @ 232 NONAME
+ _ZNK19QVideoSurfaceFormat13yuvColorSpaceEv @ 233 NONAME
+ _ZNK19QVideoSurfaceFormat16pixelAspectRatioEv @ 234 NONAME
+ _ZNK19QVideoSurfaceFormat17scanLineDirectionEv @ 235 NONAME
+ _ZNK19QVideoSurfaceFormat7isValidEv @ 236 NONAME
+ _ZNK19QVideoSurfaceFormat8propertyEPKc @ 237 NONAME
+ _ZNK19QVideoSurfaceFormat8sizeHintEv @ 238 NONAME
+ _ZNK19QVideoSurfaceFormat8viewportEv @ 239 NONAME
+ _ZNK19QVideoSurfaceFormat9frameRateEv @ 240 NONAME
+ _ZNK19QVideoSurfaceFormat9frameSizeEv @ 241 NONAME
+ _ZNK19QVideoSurfaceFormateqERKS_ @ 242 NONAME
+ _ZNK19QVideoSurfaceFormatneERKS_ @ 243 NONAME
+ _ZNK20QAbstractAudioOutput10metaObjectEv @ 244 NONAME
+ _ZNK20QAbstractVideoBuffer10handleTypeEv @ 245 NONAME
+ _ZNK20QAbstractVideoBuffer6handleEv @ 246 NONAME
+ _ZNK21QAbstractVideoSurface10metaObjectEv @ 247 NONAME
+ _ZNK21QAbstractVideoSurface13surfaceFormatEv @ 248 NONAME
+ _ZNK21QAbstractVideoSurface17isFormatSupportedERK19QVideoSurfaceFormatPS0_ @ 249 NONAME
+ _ZNK21QAbstractVideoSurface5errorEv @ 250 NONAME
+ _ZNK21QAbstractVideoSurface9isStartedEv @ 251 NONAME
+ _ZNK24QAbstractAudioDeviceInfo10metaObjectEv @ 252 NONAME
+ _ZTI11QAudioInput @ 253 NONAME
+ _ZTI12QAudioOutput @ 254 NONAME
+ _ZTI17QImageVideoBuffer @ 255 NONAME
+ _ZTI18QAudioEnginePlugin @ 256 NONAME
+ _ZTI18QMemoryVideoBuffer @ 257 NONAME
+ _ZTI19QAbstractAudioInput @ 258 NONAME
+ _ZTI20QAbstractAudioOutput @ 259 NONAME
+ _ZTI20QAbstractVideoBuffer @ 260 NONAME
+ _ZTI21QAbstractVideoSurface @ 261 NONAME
+ _ZTI24QAbstractAudioDeviceInfo @ 262 NONAME
+ _ZTI28QAudioEngineFactoryInterface @ 263 NONAME
+ _ZTV11QAudioInput @ 264 NONAME
+ _ZTV12QAudioOutput @ 265 NONAME
+ _ZTV17QImageVideoBuffer @ 266 NONAME
+ _ZTV18QAudioEnginePlugin @ 267 NONAME
+ _ZTV18QMemoryVideoBuffer @ 268 NONAME
+ _ZTV19QAbstractAudioInput @ 269 NONAME
+ _ZTV20QAbstractAudioOutput @ 270 NONAME
+ _ZTV20QAbstractVideoBuffer @ 271 NONAME
+ _ZTV21QAbstractVideoSurface @ 272 NONAME
+ _ZTV24QAbstractAudioDeviceInfo @ 273 NONAME
+ _ZThn8_N18QAudioEnginePluginD0Ev @ 274 NONAME
+ _ZThn8_N18QAudioEnginePluginD1Ev @ 275 NONAME
+ _Zls6QDebugRK19QVideoSurfaceFormat @ 276 NONAME
+ _ZTV28QAudioEngineFactoryInterface @ 277 NONAME ABSENT
+ _ZN19QVideoSurfaceFormat12setFrameRateEf @ 278 NONAME
diff --git a/src/s60installs/eabi/QtNetworku.def b/src/s60installs/eabi/QtNetworku.def
index ab4562c..cde0325 100644
--- a/src/s60installs/eabi/QtNetworku.def
+++ b/src/s60installs/eabi/QtNetworku.def
@@ -19,1379 +19,977 @@ EXPORTS
_ZN10QSslSocket13setPrivateKeyERK7QSslKey @ 18 NONAME
_ZN10QSslSocket13setPrivateKeyERK7QStringN4QSsl12KeyAlgorithmENS3_14EncodingFormatERK10QByteArray @ 19 NONAME
_ZN10QSslSocket14defaultCiphersEv @ 20 NONAME
- _ZN10QSslSocket15ignoreSslErrorsEv @ 21 NONAME
- _ZN10QSslSocket15peerVerifyErrorERK9QSslError @ 22 NONAME
- _ZN10QSslSocket16addCaCertificateERK15QSslCertificate @ 23 NONAME
- _ZN10QSslSocket16staticMetaObjectE @ 24 NONAME DATA 16
- _ZN10QSslSocket16supportedCiphersEv @ 25 NONAME
- _ZN10QSslSocket16waitForConnectedEi @ 26 NONAME
- _ZN10QSslSocket16waitForEncryptedEi @ 27 NONAME
- _ZN10QSslSocket16waitForReadyReadEi @ 28 NONAME
- _ZN10QSslSocket17addCaCertificatesERK5QListI15QSslCertificateE @ 29 NONAME
- _ZN10QSslSocket17addCaCertificatesERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 30 NONAME
- _ZN10QSslSocket17setCaCertificatesERK5QListI15QSslCertificateE @ 31 NONAME
- _ZN10QSslSocket17setDefaultCiphersERK5QListI10QSslCipherE @ 32 NONAME
- _ZN10QSslSocket17setPeerVerifyModeENS_14PeerVerifyModeE @ 33 NONAME
- _ZN10QSslSocket17setReadBufferSizeEx @ 34 NONAME
- _ZN10QSslSocket18setPeerVerifyDepthEi @ 35 NONAME
- _ZN10QSslSocket19setLocalCertificateERK15QSslCertificate @ 36 NONAME
- _ZN10QSslSocket19setLocalCertificateERK7QStringN4QSsl14EncodingFormatE @ 37 NONAME
- _ZN10QSslSocket19setSocketDescriptorEiN15QAbstractSocket11SocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 38 NONAME
- _ZN10QSslSocket19setSslConfigurationERK17QSslConfiguration @ 39 NONAME
- _ZN10QSslSocket19waitForBytesWrittenEi @ 40 NONAME
- _ZN10QSslSocket19waitForDisconnectedEi @ 41 NONAME
- _ZN10QSslSocket20systemCaCertificatesEv @ 42 NONAME
- _ZN10QSslSocket21defaultCaCertificatesEv @ 43 NONAME
- _ZN10QSslSocket21encryptedBytesWrittenEx @ 44 NONAME
- _ZN10QSslSocket21startClientEncryptionEv @ 45 NONAME
- _ZN10QSslSocket21startServerEncryptionEv @ 46 NONAME
- _ZN10QSslSocket22connectToHostEncryptedERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 47 NONAME
- _ZN10QSslSocket23addDefaultCaCertificateERK15QSslCertificate @ 48 NONAME
- _ZN10QSslSocket24addDefaultCaCertificatesERK5QListI15QSslCertificateE @ 49 NONAME
- _ZN10QSslSocket24addDefaultCaCertificatesERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 50 NONAME
- _ZN10QSslSocket24setDefaultCaCertificatesERK5QListI15QSslCertificateE @ 51 NONAME
- _ZN10QSslSocket27connectToHostImplementationERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 52 NONAME
- _ZN10QSslSocket32disconnectFromHostImplementationEv @ 53 NONAME
- _ZN10QSslSocket5abortEv @ 54 NONAME
- _ZN10QSslSocket5closeEv @ 55 NONAME
- _ZN10QSslSocket5flushEv @ 56 NONAME
- _ZN10QSslSocket8readDataEPcx @ 57 NONAME
- _ZN10QSslSocket9encryptedEv @ 58 NONAME
- _ZN10QSslSocket9sslErrorsERK5QListI9QSslErrorE @ 59 NONAME
- _ZN10QSslSocket9writeDataEPKcx @ 60 NONAME
- _ZN10QSslSocketC1EP7QObject @ 61 NONAME
- _ZN10QSslSocketC2EP7QObject @ 62 NONAME
- _ZN10QSslSocketD0Ev @ 63 NONAME
- _ZN10QSslSocketD1Ev @ 64 NONAME
- _ZN10QSslSocketD2Ev @ 65 NONAME
- _ZN10QTcpServer11qt_metacallEN11QMetaObject4CallEiPPv @ 66 NONAME
- _ZN10QTcpServer11qt_metacastEPKc @ 67 NONAME
- _ZN10QTcpServer13newConnectionEv @ 68 NONAME
- _ZN10QTcpServer16staticMetaObjectE @ 69 NONAME DATA 16
- _ZN10QTcpServer18incomingConnectionEi @ 70 NONAME
- _ZN10QTcpServer19setSocketDescriptorEi @ 71 NONAME
- _ZN10QTcpServer20waitForNewConnectionEiPb @ 72 NONAME
- _ZN10QTcpServer21nextPendingConnectionEv @ 73 NONAME
- _ZN10QTcpServer24setMaxPendingConnectionsEi @ 74 NONAME
- _ZN10QTcpServer5closeEv @ 75 NONAME
- _ZN10QTcpServer6listenERK12QHostAddresst @ 76 NONAME
- _ZN10QTcpServer8setProxyERK13QNetworkProxy @ 77 NONAME
- _ZN10QTcpServerC1EP7QObject @ 78 NONAME
- _ZN10QTcpServerC2EP7QObject @ 79 NONAME
- _ZN10QTcpServerD0Ev @ 80 NONAME
- _ZN10QTcpServerD1Ev @ 81 NONAME
- _ZN10QTcpServerD2Ev @ 82 NONAME
- _ZN10QTcpSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 83 NONAME
- _ZN10QTcpSocket11qt_metacastEPKc @ 84 NONAME
- _ZN10QTcpSocket16staticMetaObjectE @ 85 NONAME DATA 16
- _ZN10QTcpSocketC1EP7QObject @ 86 NONAME
- _ZN10QTcpSocketC1ER17QTcpSocketPrivateP7QObject @ 87 NONAME
- _ZN10QTcpSocketC2EP7QObject @ 88 NONAME
- _ZN10QTcpSocketC2ER17QTcpSocketPrivateP7QObject @ 89 NONAME
- _ZN10QTcpSocketD0Ev @ 90 NONAME
- _ZN10QTcpSocketD1Ev @ 91 NONAME
- _ZN10QTcpSocketD2Ev @ 92 NONAME
- _ZN10QUdpSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 93 NONAME
- _ZN10QUdpSocket11qt_metacastEPKc @ 94 NONAME
- _ZN10QUdpSocket12readDatagramEPcxP12QHostAddressPt @ 95 NONAME
- _ZN10QUdpSocket13writeDatagramEPKcxRK12QHostAddresst @ 96 NONAME
- _ZN10QUdpSocket16staticMetaObjectE @ 97 NONAME DATA 16
- _ZN10QUdpSocket4bindERK12QHostAddresst @ 98 NONAME
- _ZN10QUdpSocket4bindERK12QHostAddresst6QFlagsINS_8BindFlagEE @ 99 NONAME
- _ZN10QUdpSocket4bindEt @ 100 NONAME
- _ZN10QUdpSocket4bindEt6QFlagsINS_8BindFlagEE @ 101 NONAME
- _ZN10QUdpSocketC1EP7QObject @ 102 NONAME
- _ZN10QUdpSocketC2EP7QObject @ 103 NONAME
- _ZN10QUdpSocketD0Ev @ 104 NONAME
- _ZN10QUdpSocketD1Ev @ 105 NONAME
- _ZN10QUdpSocketD2Ev @ 106 NONAME
- _ZN11QHttpHeader11removeValueERK7QString @ 107 NONAME
- _ZN11QHttpHeader14setContentTypeERK7QString @ 108 NONAME
- _ZN11QHttpHeader15removeAllValuesERK7QString @ 109 NONAME
- _ZN11QHttpHeader16setContentLengthEi @ 110 NONAME
- _ZN11QHttpHeader5parseERK7QString @ 111 NONAME
- _ZN11QHttpHeader8addValueERK7QStringS2_ @ 112 NONAME
- _ZN11QHttpHeader8setValidEb @ 113 NONAME
- _ZN11QHttpHeader8setValueERK7QStringS2_ @ 114 NONAME
- _ZN11QHttpHeader9parseLineERK7QStringi @ 115 NONAME
- _ZN11QHttpHeader9setValuesERK5QListI5QPairI7QStringS2_EE @ 116 NONAME
- _ZN11QHttpHeaderC2ER18QHttpHeaderPrivateRK7QString @ 117 NONAME
- _ZN11QHttpHeaderC2ER18QHttpHeaderPrivateRKS_ @ 118 NONAME
- _ZN11QHttpHeaderC2ERK7QString @ 119 NONAME
- _ZN11QHttpHeaderC2ERKS_ @ 120 NONAME
- _ZN11QHttpHeaderC2Ev @ 121 NONAME
- _ZN11QHttpHeaderD0Ev @ 122 NONAME
- _ZN11QHttpHeaderD1Ev @ 123 NONAME
- _ZN11QHttpHeaderD2Ev @ 124 NONAME
- _ZN11QHttpHeaderaSERKS_ @ 125 NONAME
- _ZN12QHostAddress10setAddressEPK8sockaddr @ 126 NONAME
- _ZN12QHostAddress10setAddressEPh @ 127 NONAME
- _ZN12QHostAddress10setAddressERK12QIPv6Address @ 128 NONAME
- _ZN12QHostAddress10setAddressERK7QString @ 129 NONAME
- _ZN12QHostAddress10setAddressEj @ 130 NONAME
- _ZN12QHostAddress10setScopeIdERK7QString @ 131 NONAME
- _ZN12QHostAddress11parseSubnetERK7QString @ 132 NONAME
- _ZN12QHostAddress5clearEv @ 133 NONAME
- _ZN12QHostAddressC1ENS_14SpecialAddressE @ 134 NONAME
- _ZN12QHostAddressC1EPK8sockaddr @ 135 NONAME
- _ZN12QHostAddressC1EPh @ 136 NONAME
- _ZN12QHostAddressC1ERK12QIPv6Address @ 137 NONAME
- _ZN12QHostAddressC1ERK7QString @ 138 NONAME
- _ZN12QHostAddressC1ERKS_ @ 139 NONAME
- _ZN12QHostAddressC1Ej @ 140 NONAME
- _ZN12QHostAddressC1Ev @ 141 NONAME
- _ZN12QHostAddressC2ENS_14SpecialAddressE @ 142 NONAME
- _ZN12QHostAddressC2EPK8sockaddr @ 143 NONAME
- _ZN12QHostAddressC2EPh @ 144 NONAME
- _ZN12QHostAddressC2ERK12QIPv6Address @ 145 NONAME
- _ZN12QHostAddressC2ERK7QString @ 146 NONAME
- _ZN12QHostAddressC2ERKS_ @ 147 NONAME
- _ZN12QHostAddressC2Ej @ 148 NONAME
- _ZN12QHostAddressC2Ev @ 149 NONAME
- _ZN12QHostAddressD1Ev @ 150 NONAME
- _ZN12QHostAddressD2Ev @ 151 NONAME
- _ZN12QHostAddressaSERK7QString @ 152 NONAME
- _ZN12QHostAddressaSERKS_ @ 153 NONAME
- _ZN12QLocalServer11qt_metacallEN11QMetaObject4CallEiPPv @ 154 NONAME
- _ZN12QLocalServer11qt_metacastEPKc @ 155 NONAME
- _ZN12QLocalServer12removeServerERK7QString @ 156 NONAME
- _ZN12QLocalServer13newConnectionEv @ 157 NONAME
- _ZN12QLocalServer16staticMetaObjectE @ 158 NONAME DATA 16
- _ZN12QLocalServer18incomingConnectionEj @ 159 NONAME
- _ZN12QLocalServer20waitForNewConnectionEiPb @ 160 NONAME
- _ZN12QLocalServer21nextPendingConnectionEv @ 161 NONAME
- _ZN12QLocalServer24setMaxPendingConnectionsEi @ 162 NONAME
- _ZN12QLocalServer5closeEv @ 163 NONAME
- _ZN12QLocalServer6listenERK7QString @ 164 NONAME
- _ZN12QLocalServerC1EP7QObject @ 165 NONAME
- _ZN12QLocalServerC2EP7QObject @ 166 NONAME
- _ZN12QLocalServerD0Ev @ 167 NONAME
- _ZN12QLocalServerD1Ev @ 168 NONAME
- _ZN12QLocalServerD2Ev @ 169 NONAME
- _ZN12QLocalSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 170 NONAME
- _ZN12QLocalSocket11qt_metacastEPKc @ 171 NONAME
- _ZN12QLocalSocket12disconnectedEv @ 172 NONAME
- _ZN12QLocalSocket12stateChangedENS_16LocalSocketStateE @ 173 NONAME
- _ZN12QLocalSocket15connectToServerERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 174 NONAME
- _ZN12QLocalSocket16staticMetaObjectE @ 175 NONAME DATA 16
- _ZN12QLocalSocket16waitForConnectedEi @ 176 NONAME
- _ZN12QLocalSocket16waitForReadyReadEi @ 177 NONAME
- _ZN12QLocalSocket17setReadBufferSizeEx @ 178 NONAME
- _ZN12QLocalSocket19setSocketDescriptorEjNS_16LocalSocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 179 NONAME
- _ZN12QLocalSocket19waitForBytesWrittenEi @ 180 NONAME
- _ZN12QLocalSocket19waitForDisconnectedEi @ 181 NONAME
- _ZN12QLocalSocket20disconnectFromServerEv @ 182 NONAME
- _ZN12QLocalSocket5abortEv @ 183 NONAME
- _ZN12QLocalSocket5closeEv @ 184 NONAME
- _ZN12QLocalSocket5errorENS_16LocalSocketErrorE @ 185 NONAME
- _ZN12QLocalSocket5flushEv @ 186 NONAME
- _ZN12QLocalSocket8readDataEPcx @ 187 NONAME
- _ZN12QLocalSocket9connectedEv @ 188 NONAME
- _ZN12QLocalSocket9writeDataEPKcx @ 189 NONAME
- _ZN12QLocalSocketC1EP7QObject @ 190 NONAME
- _ZN12QLocalSocketC2EP7QObject @ 191 NONAME
- _ZN12QLocalSocketD0Ev @ 192 NONAME
- _ZN12QLocalSocketD1Ev @ 193 NONAME
- _ZN12QLocalSocketD2Ev @ 194 NONAME
- _ZN13QNetworkProxy11setHostNameERK7QString @ 195 NONAME
- _ZN13QNetworkProxy11setPasswordERK7QString @ 196 NONAME
- _ZN13QNetworkProxy15setCapabilitiesE6QFlagsINS_10CapabilityEE @ 197 NONAME
- _ZN13QNetworkProxy16applicationProxyEv @ 198 NONAME
- _ZN13QNetworkProxy19setApplicationProxyERKS_ @ 199 NONAME
- _ZN13QNetworkProxy7setPortEt @ 200 NONAME
- _ZN13QNetworkProxy7setTypeENS_9ProxyTypeE @ 201 NONAME
- _ZN13QNetworkProxy7setUserERK7QString @ 202 NONAME
- _ZN13QNetworkProxyC1ENS_9ProxyTypeERK7QStringtS3_S3_ @ 203 NONAME
- _ZN13QNetworkProxyC1ERKS_ @ 204 NONAME
- _ZN13QNetworkProxyC1Ev @ 205 NONAME
- _ZN13QNetworkProxyC2ENS_9ProxyTypeERK7QStringtS3_S3_ @ 206 NONAME
- _ZN13QNetworkProxyC2ERKS_ @ 207 NONAME
- _ZN13QNetworkProxyC2Ev @ 208 NONAME
- _ZN13QNetworkProxyD1Ev @ 209 NONAME
- _ZN13QNetworkProxyD2Ev @ 210 NONAME
- _ZN13QNetworkProxyaSERKS_ @ 211 NONAME
- _ZN13QNetworkReply10setRequestERK15QNetworkRequest @ 212 NONAME
- _ZN13QNetworkReply11qt_metacallEN11QMetaObject4CallEiPPv @ 213 NONAME
- _ZN13QNetworkReply11qt_metacastEPKc @ 214 NONAME
- _ZN13QNetworkReply12setAttributeEN15QNetworkRequest9AttributeERK8QVariant @ 215 NONAME
- _ZN13QNetworkReply12setOperationEN21QNetworkAccessManager9OperationE @ 216 NONAME
- _ZN13QNetworkReply12setRawHeaderERK10QByteArrayS2_ @ 217 NONAME
- _ZN13QNetworkReply14uploadProgressExx @ 218 NONAME
- _ZN13QNetworkReply15ignoreSslErrorsEv @ 219 NONAME
- _ZN13QNetworkReply15metaDataChangedEv @ 220 NONAME
- _ZN13QNetworkReply16downloadProgressExx @ 221 NONAME
- _ZN13QNetworkReply16staticMetaObjectE @ 222 NONAME DATA 16
- _ZN13QNetworkReply17setReadBufferSizeEx @ 223 NONAME
- _ZN13QNetworkReply19setSslConfigurationERK17QSslConfiguration @ 224 NONAME
- _ZN13QNetworkReply5closeEv @ 225 NONAME
- _ZN13QNetworkReply5errorENS_12NetworkErrorE @ 226 NONAME
- _ZN13QNetworkReply6setUrlERK4QUrl @ 227 NONAME
- _ZN13QNetworkReply8finishedEv @ 228 NONAME
- _ZN13QNetworkReply8setErrorENS_12NetworkErrorERK7QString @ 229 NONAME
- _ZN13QNetworkReply9setHeaderEN15QNetworkRequest12KnownHeadersERK8QVariant @ 230 NONAME
- _ZN13QNetworkReply9sslErrorsERK5QListI9QSslErrorE @ 231 NONAME
- _ZN13QNetworkReply9writeDataEPKcx @ 232 NONAME
- _ZN13QNetworkReplyC2EP7QObject @ 233 NONAME
- _ZN13QNetworkReplyC2ER20QNetworkReplyPrivateP7QObject @ 234 NONAME
- _ZN13QNetworkReplyD0Ev @ 235 NONAME
- _ZN13QNetworkReplyD1Ev @ 236 NONAME
- _ZN13QNetworkReplyD2Ev @ 237 NONAME
- _ZN14QAuthenticator11setPasswordERK7QString @ 238 NONAME
- _ZN14QAuthenticator6detachEv @ 239 NONAME
- _ZN14QAuthenticator7setUserERK7QString @ 240 NONAME
- _ZN14QAuthenticatorC1ERKS_ @ 241 NONAME
- _ZN14QAuthenticatorC1Ev @ 242 NONAME
- _ZN14QAuthenticatorC2ERKS_ @ 243 NONAME
- _ZN14QAuthenticatorC2Ev @ 244 NONAME
- _ZN14QAuthenticatorD1Ev @ 245 NONAME
- _ZN14QAuthenticatorD2Ev @ 246 NONAME
- _ZN14QAuthenticatoraSERKS_ @ 247 NONAME
- _ZN14QNetworkCookie11setHttpOnlyEb @ 248 NONAME
- _ZN14QNetworkCookie12parseCookiesERK10QByteArray @ 249 NONAME
- _ZN14QNetworkCookie17setExpirationDateERK9QDateTime @ 250 NONAME
- _ZN14QNetworkCookie7setNameERK10QByteArray @ 251 NONAME
- _ZN14QNetworkCookie7setPathERK7QString @ 252 NONAME
- _ZN14QNetworkCookie8setValueERK10QByteArray @ 253 NONAME
- _ZN14QNetworkCookie9setDomainERK7QString @ 254 NONAME
- _ZN14QNetworkCookie9setSecureEb @ 255 NONAME
- _ZN14QNetworkCookieC1ERK10QByteArray @ 256 NONAME ABSENT
- _ZN14QNetworkCookieC1ERK10QByteArrayS2_ @ 257 NONAME
- _ZN14QNetworkCookieC1ERKS_ @ 258 NONAME
- _ZN14QNetworkCookieC1Ev @ 259 NONAME ABSENT
- _ZN14QNetworkCookieC2ERK10QByteArray @ 260 NONAME ABSENT
- _ZN14QNetworkCookieC2ERK10QByteArrayS2_ @ 261 NONAME
- _ZN14QNetworkCookieC2ERKS_ @ 262 NONAME
- _ZN14QNetworkCookieC2Ev @ 263 NONAME ABSENT
- _ZN14QNetworkCookieD1Ev @ 264 NONAME
- _ZN14QNetworkCookieD2Ev @ 265 NONAME
- _ZN14QNetworkCookieaSERKS_ @ 266 NONAME
- _ZN15QAbstractSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 267 NONAME
- _ZN15QAbstractSocket11qt_metacastEPKc @ 268 NONAME
- _ZN15QAbstractSocket11setPeerNameERK7QString @ 269 NONAME
- _ZN15QAbstractSocket11setPeerPortEt @ 270 NONAME
- _ZN15QAbstractSocket12disconnectedEv @ 271 NONAME
- _ZN15QAbstractSocket12readLineDataEPcx @ 272 NONAME
- _ZN15QAbstractSocket12setLocalPortEt @ 273 NONAME
- _ZN15QAbstractSocket12stateChangedENS_11SocketStateE @ 274 NONAME
- _ZN15QAbstractSocket13connectToHostERK12QHostAddresst6QFlagsIN9QIODevice12OpenModeFlagEE @ 275 NONAME
- _ZN15QAbstractSocket13connectToHostERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 276 NONAME
- _ZN15QAbstractSocket14setPeerAddressERK12QHostAddress @ 277 NONAME
- _ZN15QAbstractSocket14setSocketErrorENS_11SocketErrorE @ 278 NONAME
- _ZN15QAbstractSocket14setSocketStateENS_11SocketStateE @ 279 NONAME
- _ZN15QAbstractSocket15setLocalAddressERK12QHostAddress @ 280 NONAME
- _ZN15QAbstractSocket16staticMetaObjectE @ 281 NONAME DATA 16
- _ZN15QAbstractSocket16waitForConnectedEi @ 282 NONAME
- _ZN15QAbstractSocket16waitForReadyReadEi @ 283 NONAME
- _ZN15QAbstractSocket17setReadBufferSizeEx @ 284 NONAME
- _ZN15QAbstractSocket18disconnectFromHostEv @ 285 NONAME
- _ZN15QAbstractSocket19setSocketDescriptorEiNS_11SocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 286 NONAME
- _ZN15QAbstractSocket19waitForBytesWrittenEi @ 287 NONAME
- _ZN15QAbstractSocket19waitForDisconnectedEi @ 288 NONAME
- _ZN15QAbstractSocket27connectToHostImplementationERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 289 NONAME
- _ZN15QAbstractSocket27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 290 NONAME
- _ZN15QAbstractSocket32disconnectFromHostImplementationEv @ 291 NONAME
- _ZN15QAbstractSocket5abortEv @ 292 NONAME
- _ZN15QAbstractSocket5closeEv @ 293 NONAME
- _ZN15QAbstractSocket5errorENS_11SocketErrorE @ 294 NONAME
- _ZN15QAbstractSocket5flushEv @ 295 NONAME
- _ZN15QAbstractSocket8readDataEPcx @ 296 NONAME
- _ZN15QAbstractSocket8setProxyERK13QNetworkProxy @ 297 NONAME
- _ZN15QAbstractSocket9connectedEv @ 298 NONAME
- _ZN15QAbstractSocket9hostFoundEv @ 299 NONAME
- _ZN15QAbstractSocket9writeDataEPKcx @ 300 NONAME
- _ZN15QAbstractSocketC1ENS_10SocketTypeEP7QObject @ 301 NONAME
- _ZN15QAbstractSocketC1ENS_10SocketTypeER22QAbstractSocketPrivateP7QObject @ 302 NONAME
- _ZN15QAbstractSocketC2ENS_10SocketTypeEP7QObject @ 303 NONAME
- _ZN15QAbstractSocketC2ENS_10SocketTypeER22QAbstractSocketPrivateP7QObject @ 304 NONAME
- _ZN15QAbstractSocketD0Ev @ 305 NONAME
- _ZN15QAbstractSocketD1Ev @ 306 NONAME
- _ZN15QAbstractSocketD2Ev @ 307 NONAME
- _ZN15QNetworkRequest12setAttributeENS_9AttributeERK8QVariant @ 308 NONAME
- _ZN15QNetworkRequest12setRawHeaderERK10QByteArrayS2_ @ 309 NONAME
- _ZN15QNetworkRequest19setSslConfigurationERK17QSslConfiguration @ 310 NONAME
- _ZN15QNetworkRequest6setUrlERK4QUrl @ 311 NONAME
- _ZN15QNetworkRequest9setHeaderENS_12KnownHeadersERK8QVariant @ 312 NONAME
- _ZN15QNetworkRequestC1ERK4QUrl @ 313 NONAME
- _ZN15QNetworkRequestC1ERKS_ @ 314 NONAME
- _ZN15QNetworkRequestC1Ev @ 315 NONAME ABSENT
- _ZN15QNetworkRequestC2ERK4QUrl @ 316 NONAME
- _ZN15QNetworkRequestC2ERKS_ @ 317 NONAME
- _ZN15QNetworkRequestC2Ev @ 318 NONAME ABSENT
- _ZN15QNetworkRequestD1Ev @ 319 NONAME
- _ZN15QNetworkRequestD2Ev @ 320 NONAME
- _ZN15QNetworkRequestaSERKS_ @ 321 NONAME
- _ZN15QSslCertificate10fromDeviceEP9QIODeviceN4QSsl14EncodingFormatE @ 322 NONAME
- _ZN15QSslCertificate5clearEv @ 323 NONAME
- _ZN15QSslCertificate8fromDataERK10QByteArrayN4QSsl14EncodingFormatE @ 324 NONAME
- _ZN15QSslCertificate8fromPathERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 325 NONAME
- _ZN15QSslCertificateC1EP9QIODeviceN4QSsl14EncodingFormatE @ 326 NONAME
- _ZN15QSslCertificateC1ERK10QByteArrayN4QSsl14EncodingFormatE @ 327 NONAME
- _ZN15QSslCertificateC1ERKS_ @ 328 NONAME
- _ZN15QSslCertificateC2EP9QIODeviceN4QSsl14EncodingFormatE @ 329 NONAME
- _ZN15QSslCertificateC2ERK10QByteArrayN4QSsl14EncodingFormatE @ 330 NONAME
- _ZN15QSslCertificateC2ERKS_ @ 331 NONAME
- _ZN15QSslCertificateD1Ev @ 332 NONAME
- _ZN15QSslCertificateD2Ev @ 333 NONAME
- _ZN15QSslCertificateaSERKS_ @ 334 NONAME
- _ZN17QHttpNetworkReply10setRequestERK19QHttpNetworkRequest @ 335 NONAME
- _ZN17QHttpNetworkReply11parseHeaderERK10QByteArray @ 336 NONAME
- _ZN17QHttpNetworkReply11qt_metacallEN11QMetaObject4CallEiPPv @ 337 NONAME
- _ZN17QHttpNetworkReply11qt_metacastEPKc @ 338 NONAME
- _ZN17QHttpNetworkReply13headerChangedEv @ 339 NONAME
- _ZN17QHttpNetworkReply13setStatusCodeEi @ 340 NONAME
- _ZN17QHttpNetworkReply14setErrorStringERK7QString @ 341 NONAME
- _ZN17QHttpNetworkReply14setHeaderFieldERK10QByteArrayS2_ @ 342 NONAME
- _ZN17QHttpNetworkReply15ignoreSslErrorsEv @ 343 NONAME
- _ZN17QHttpNetworkReply16dataReadProgressEii @ 344 NONAME
- _ZN17QHttpNetworkReply16dataSendProgressEii @ 345 NONAME ABSENT
- _ZN17QHttpNetworkReply16setContentLengthEx @ 346 NONAME
- _ZN17QHttpNetworkReply16staticMetaObjectE @ 347 NONAME DATA 16
- _ZN17QHttpNetworkReply17finishedWithErrorEN13QNetworkReply12NetworkErrorERK7QString @ 348 NONAME
- _ZN17QHttpNetworkReply19setSslConfigurationERK17QSslConfiguration @ 349 NONAME
- _ZN17QHttpNetworkReply4readEx @ 350 NONAME ABSENT
- _ZN17QHttpNetworkReply6setUrlERK4QUrl @ 351 NONAME
- _ZN17QHttpNetworkReply8finishedEv @ 352 NONAME
- _ZN17QHttpNetworkReply9readyReadEv @ 353 NONAME
- _ZN17QHttpNetworkReply9sslErrorsERK5QListI9QSslErrorE @ 354 NONAME
- _ZN17QHttpNetworkReplyC1ERK4QUrlP7QObject @ 355 NONAME
- _ZN17QHttpNetworkReplyC2ERK4QUrlP7QObject @ 356 NONAME
- _ZN17QHttpNetworkReplyD0Ev @ 357 NONAME
- _ZN17QHttpNetworkReplyD1Ev @ 358 NONAME
- _ZN17QHttpNetworkReplyD2Ev @ 359 NONAME
- _ZN17QHttpSocketEngine10initializeEN15QAbstractSocket10SocketTypeENS0_20NetworkLayerProtocolE @ 360 NONAME
- _ZN17QHttpSocketEngine10initializeEiN15QAbstractSocket11SocketStateE @ 361 NONAME
- _ZN17QHttpSocketEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 362 NONAME
- _ZN17QHttpSocketEngine11qt_metacastEPKc @ 363 NONAME
- _ZN17QHttpSocketEngine11waitForReadEiPb @ 364 NONAME
- _ZN17QHttpSocketEngine12readDatagramEPcxP12QHostAddressPt @ 365 NONAME
- _ZN17QHttpSocketEngine12waitForWriteEiPb @ 366 NONAME
- _ZN17QHttpSocketEngine13connectToHostERK12QHostAddresst @ 367 NONAME
- _ZN17QHttpSocketEngine13writeDatagramEPKcxRK12QHostAddresst @ 368 NONAME
- _ZN17QHttpSocketEngine15connectInternalEv @ 369 NONAME
- _ZN17QHttpSocketEngine15slotSocketErrorEN15QAbstractSocket11SocketErrorE @ 370 NONAME
- _ZN17QHttpSocketEngine16staticMetaObjectE @ 371 NONAME DATA 16
- _ZN17QHttpSocketEngine18waitForReadOrWriteEPbS0_bbiS0_ @ 372 NONAME
- _ZN17QHttpSocketEngine19connectToHostByNameERK7QStringt @ 373 NONAME
- _ZN17QHttpSocketEngine19slotSocketConnectedEv @ 374 NONAME
- _ZN17QHttpSocketEngine20emitReadNotificationEv @ 375 NONAME
- _ZN17QHttpSocketEngine21emitWriteNotificationEv @ 376 NONAME
- _ZN17QHttpSocketEngine22slotSocketBytesWrittenEv @ 377 NONAME
- _ZN17QHttpSocketEngine22slotSocketDisconnectedEv @ 378 NONAME
- _ZN17QHttpSocketEngine22slotSocketStateChangedEN15QAbstractSocket11SocketStateE @ 379 NONAME
- _ZN17QHttpSocketEngine26emitConnectionNotificationEv @ 380 NONAME
- _ZN17QHttpSocketEngine26setReadNotificationEnabledEb @ 381 NONAME
- _ZN17QHttpSocketEngine26slotSocketReadNotificationEv @ 382 NONAME
- _ZN17QHttpSocketEngine27emitPendingReadNotificationEv @ 383 NONAME
- _ZN17QHttpSocketEngine27setWriteNotificationEnabledEb @ 384 NONAME
- _ZN17QHttpSocketEngine28emitPendingWriteNotificationEv @ 385 NONAME
- _ZN17QHttpSocketEngine31setExceptionNotificationEnabledEb @ 386 NONAME
- _ZN17QHttpSocketEngine33emitPendingConnectionNotificationEv @ 387 NONAME
- _ZN17QHttpSocketEngine4bindERK12QHostAddresst @ 388 NONAME
- _ZN17QHttpSocketEngine4readEPcx @ 389 NONAME
- _ZN17QHttpSocketEngine5closeEv @ 390 NONAME
- _ZN17QHttpSocketEngine5writeEPKcx @ 391 NONAME
- _ZN17QHttpSocketEngine6acceptEv @ 392 NONAME
- _ZN17QHttpSocketEngine6listenEv @ 393 NONAME
- _ZN17QHttpSocketEngine8setProxyERK13QNetworkProxy @ 394 NONAME
- _ZN17QHttpSocketEngine9setOptionEN21QAbstractSocketEngine12SocketOptionEi @ 395 NONAME
- _ZN17QHttpSocketEngineC1EP7QObject @ 396 NONAME
- _ZN17QHttpSocketEngineC2EP7QObject @ 397 NONAME
- _ZN17QHttpSocketEngineD0Ev @ 398 NONAME
- _ZN17QHttpSocketEngineD1Ev @ 399 NONAME
- _ZN17QHttpSocketEngineD2Ev @ 400 NONAME
- _ZN17QNetworkCookieJar11qt_metacallEN11QMetaObject4CallEiPPv @ 401 NONAME
- _ZN17QNetworkCookieJar11qt_metacastEPKc @ 402 NONAME
- _ZN17QNetworkCookieJar13setAllCookiesERK5QListI14QNetworkCookieE @ 403 NONAME
- _ZN17QNetworkCookieJar16staticMetaObjectE @ 404 NONAME DATA 16
- _ZN17QNetworkCookieJar17setCookiesFromUrlERK5QListI14QNetworkCookieERK4QUrl @ 405 NONAME
- _ZN17QNetworkCookieJarC1EP7QObject @ 406 NONAME
- _ZN17QNetworkCookieJarC2EP7QObject @ 407 NONAME
- _ZN17QNetworkCookieJarD0Ev @ 408 NONAME
- _ZN17QNetworkCookieJarD1Ev @ 409 NONAME
- _ZN17QNetworkCookieJarD2Ev @ 410 NONAME
- _ZN17QNetworkDiskCache11qt_metacallEN11QMetaObject4CallEiPPv @ 411 NONAME
- _ZN17QNetworkDiskCache11qt_metacastEPKc @ 412 NONAME
- _ZN17QNetworkDiskCache14updateMetaDataERK21QNetworkCacheMetaData @ 413 NONAME
- _ZN17QNetworkDiskCache16staticMetaObjectE @ 414 NONAME DATA 16
- _ZN17QNetworkDiskCache17setCacheDirectoryERK7QString @ 415 NONAME
- _ZN17QNetworkDiskCache19setMaximumCacheSizeEx @ 416 NONAME
- _ZN17QNetworkDiskCache4dataERK4QUrl @ 417 NONAME
- _ZN17QNetworkDiskCache5clearEv @ 418 NONAME
- _ZN17QNetworkDiskCache6expireEv @ 419 NONAME
- _ZN17QNetworkDiskCache6insertEP9QIODevice @ 420 NONAME
- _ZN17QNetworkDiskCache6removeERK4QUrl @ 421 NONAME
- _ZN17QNetworkDiskCache7prepareERK21QNetworkCacheMetaData @ 422 NONAME
- _ZN17QNetworkDiskCache8metaDataERK4QUrl @ 423 NONAME
- _ZN17QNetworkDiskCacheC1EP7QObject @ 424 NONAME
- _ZN17QNetworkDiskCacheC2EP7QObject @ 425 NONAME
- _ZN17QNetworkDiskCacheD0Ev @ 426 NONAME
- _ZN17QNetworkDiskCacheD1Ev @ 427 NONAME
- _ZN17QNetworkDiskCacheD2Ev @ 428 NONAME
- _ZN17QNetworkInterface12allAddressesEv @ 429 NONAME
- _ZN17QNetworkInterface13allInterfacesEv @ 430 NONAME
- _ZN17QNetworkInterface17interfaceFromNameERK7QString @ 431 NONAME
- _ZN17QNetworkInterface18interfaceFromIndexEi @ 432 NONAME
- _ZN17QNetworkInterfaceC1ERKS_ @ 433 NONAME
- _ZN17QNetworkInterfaceC1Ev @ 434 NONAME
- _ZN17QNetworkInterfaceC2ERKS_ @ 435 NONAME
- _ZN17QNetworkInterfaceC2Ev @ 436 NONAME
- _ZN17QNetworkInterfaceD1Ev @ 437 NONAME
- _ZN17QNetworkInterfaceD2Ev @ 438 NONAME
- _ZN17QNetworkInterfaceaSERKS_ @ 439 NONAME
- _ZN17QSslConfiguration10setCiphersERK5QListI10QSslCipherE @ 440 NONAME
- _ZN17QSslConfiguration11setProtocolEN4QSsl11SslProtocolE @ 441 NONAME
- _ZN17QSslConfiguration13setPrivateKeyERK7QSslKey @ 442 NONAME
- _ZN17QSslConfiguration17setCaCertificatesERK5QListI15QSslCertificateE @ 443 NONAME
- _ZN17QSslConfiguration17setPeerVerifyModeEN10QSslSocket14PeerVerifyModeE @ 444 NONAME
- _ZN17QSslConfiguration18setPeerVerifyDepthEi @ 445 NONAME
- _ZN17QSslConfiguration19setLocalCertificateERK15QSslCertificate @ 446 NONAME
- _ZN17QSslConfiguration20defaultConfigurationEv @ 447 NONAME
- _ZN17QSslConfiguration23setDefaultConfigurationERKS_ @ 448 NONAME
- _ZN17QSslConfigurationC1ERKS_ @ 449 NONAME
- _ZN17QSslConfigurationC1Ev @ 450 NONAME
- _ZN17QSslConfigurationC2ERKS_ @ 451 NONAME
- _ZN17QSslConfigurationC2Ev @ 452 NONAME
- _ZN17QSslConfigurationD1Ev @ 453 NONAME
- _ZN17QSslConfigurationD2Ev @ 454 NONAME
- _ZN17QSslConfigurationaSERKS_ @ 455 NONAME
- _ZN18QHttpRequestHeader10setRequestERK7QStringS2_ii @ 456 NONAME
- _ZN18QHttpRequestHeader9parseLineERK7QStringi @ 457 NONAME
- _ZN18QHttpRequestHeaderC1ERK7QString @ 458 NONAME
- _ZN18QHttpRequestHeaderC1ERK7QStringS2_ii @ 459 NONAME
- _ZN18QHttpRequestHeaderC1ERKS_ @ 460 NONAME
- _ZN18QHttpRequestHeaderC1Ev @ 461 NONAME
- _ZN18QHttpRequestHeaderC2ERK7QString @ 462 NONAME
- _ZN18QHttpRequestHeaderC2ERK7QStringS2_ii @ 463 NONAME
- _ZN18QHttpRequestHeaderC2ERKS_ @ 464 NONAME
- _ZN18QHttpRequestHeaderC2Ev @ 465 NONAME
- _ZN18QHttpRequestHeaderaSERKS_ @ 466 NONAME
- _ZN18QNetworkProxyQuery11setPeerPortEi @ 467 NONAME
- _ZN18QNetworkProxyQuery12setLocalPortEi @ 468 NONAME
- _ZN18QNetworkProxyQuery12setQueryTypeENS_9QueryTypeE @ 469 NONAME
- _ZN18QNetworkProxyQuery14setProtocolTagERK7QString @ 470 NONAME
- _ZN18QNetworkProxyQuery15setPeerHostNameERK7QString @ 471 NONAME
- _ZN18QNetworkProxyQuery6setUrlERK4QUrl @ 472 NONAME
- _ZN18QNetworkProxyQueryC1ERK4QUrlNS_9QueryTypeE @ 473 NONAME
- _ZN18QNetworkProxyQueryC1ERK7QStringiS2_NS_9QueryTypeE @ 474 NONAME
- _ZN18QNetworkProxyQueryC1ERKS_ @ 475 NONAME
- _ZN18QNetworkProxyQueryC1EtRK7QStringNS_9QueryTypeE @ 476 NONAME
- _ZN18QNetworkProxyQueryC1Ev @ 477 NONAME
- _ZN18QNetworkProxyQueryC2ERK4QUrlNS_9QueryTypeE @ 478 NONAME
- _ZN18QNetworkProxyQueryC2ERK7QStringiS2_NS_9QueryTypeE @ 479 NONAME
- _ZN18QNetworkProxyQueryC2ERKS_ @ 480 NONAME
- _ZN18QNetworkProxyQueryC2EtRK7QStringNS_9QueryTypeE @ 481 NONAME
- _ZN18QNetworkProxyQueryC2Ev @ 482 NONAME
- _ZN18QNetworkProxyQueryD1Ev @ 483 NONAME
- _ZN18QNetworkProxyQueryD2Ev @ 484 NONAME
- _ZN18QNetworkProxyQueryaSERKS_ @ 485 NONAME
- _ZN19QHttpNetworkRequest11setPriorityENS_8PriorityE @ 486 NONAME
- _ZN19QHttpNetworkRequest12setOperationENS_9OperationE @ 487 NONAME
- _ZN19QHttpNetworkRequest14setHeaderFieldERK10QByteArrayS2_ @ 488 NONAME
- _ZN19QHttpNetworkRequest16setContentLengthEx @ 489 NONAME
- _ZN19QHttpNetworkRequest6setUrlERK4QUrl @ 490 NONAME
- _ZN19QHttpNetworkRequest7setDataEP9QIODevice @ 491 NONAME ABSENT
- _ZN19QHttpNetworkRequestC1ERK4QUrlNS_9OperationENS_8PriorityE @ 492 NONAME
- _ZN19QHttpNetworkRequestC1ERKS_ @ 493 NONAME
- _ZN19QHttpNetworkRequestC2ERK4QUrlNS_9OperationENS_8PriorityE @ 494 NONAME
- _ZN19QHttpNetworkRequestC2ERKS_ @ 495 NONAME
- _ZN19QHttpNetworkRequestD0Ev @ 496 NONAME
- _ZN19QHttpNetworkRequestD1Ev @ 497 NONAME
- _ZN19QHttpNetworkRequestD2Ev @ 498 NONAME
- _ZN19QHttpNetworkRequestaSERKS_ @ 499 NONAME
- _ZN19QHttpResponseHeader13setStatusLineEiRK7QStringii @ 500 NONAME
- _ZN19QHttpResponseHeader9parseLineERK7QStringi @ 501 NONAME
- _ZN19QHttpResponseHeaderC1ERK7QString @ 502 NONAME
- _ZN19QHttpResponseHeaderC1ERKS_ @ 503 NONAME
- _ZN19QHttpResponseHeaderC1EiRK7QStringii @ 504 NONAME
- _ZN19QHttpResponseHeaderC1Ev @ 505 NONAME
- _ZN19QHttpResponseHeaderC2ERK7QString @ 506 NONAME
- _ZN19QHttpResponseHeaderC2ERKS_ @ 507 NONAME
- _ZN19QHttpResponseHeaderC2EiRK7QStringii @ 508 NONAME
- _ZN19QHttpResponseHeaderC2Ev @ 509 NONAME
- _ZN19QHttpResponseHeaderaSERKS_ @ 510 NONAME
- _ZN19QNativeSocketEngine10initializeEN15QAbstractSocket10SocketTypeENS0_20NetworkLayerProtocolE @ 511 NONAME
- _ZN19QNativeSocketEngine10initializeEiN15QAbstractSocket11SocketStateE @ 512 NONAME
- _ZN19QNativeSocketEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 513 NONAME
- _ZN19QNativeSocketEngine11qt_metacastEPKc @ 514 NONAME
- _ZN19QNativeSocketEngine11waitForReadEiPb @ 515 NONAME
- _ZN19QNativeSocketEngine12readDatagramEPcxP12QHostAddressPt @ 516 NONAME
- _ZN19QNativeSocketEngine12waitForWriteEiPb @ 517 NONAME
- _ZN19QNativeSocketEngine13connectToHostERK12QHostAddresst @ 518 NONAME
- _ZN19QNativeSocketEngine13writeDatagramEPKcxRK12QHostAddresst @ 519 NONAME
- _ZN19QNativeSocketEngine16staticMetaObjectE @ 520 NONAME DATA 16
- _ZN19QNativeSocketEngine17setSendBufferSizeEx @ 521 NONAME
- _ZN19QNativeSocketEngine18waitForReadOrWriteEPbS0_bbiS0_ @ 522 NONAME
- _ZN19QNativeSocketEngine19connectToHostByNameERK7QStringt @ 523 NONAME
- _ZN19QNativeSocketEngine20setReceiveBufferSizeEx @ 524 NONAME
- _ZN19QNativeSocketEngine22connectionNotificationEv @ 525 NONAME
- _ZN19QNativeSocketEngine26setReadNotificationEnabledEb @ 526 NONAME
- _ZN19QNativeSocketEngine27setWriteNotificationEnabledEb @ 527 NONAME
- _ZN19QNativeSocketEngine31setExceptionNotificationEnabledEb @ 528 NONAME
- _ZN19QNativeSocketEngine4bindERK12QHostAddresst @ 529 NONAME
- _ZN19QNativeSocketEngine4readEPcx @ 530 NONAME
- _ZN19QNativeSocketEngine5closeEv @ 531 NONAME
- _ZN19QNativeSocketEngine5writeEPKcx @ 532 NONAME
- _ZN19QNativeSocketEngine6acceptEv @ 533 NONAME
- _ZN19QNativeSocketEngine6listenEv @ 534 NONAME
- _ZN19QNativeSocketEngine9setOptionEN21QAbstractSocketEngine12SocketOptionEi @ 535 NONAME
- _ZN19QNativeSocketEngineC1EP7QObject @ 536 NONAME
- _ZN19QNativeSocketEngineC2EP7QObject @ 537 NONAME
- _ZN19QNativeSocketEngineD0Ev @ 538 NONAME
- _ZN19QNativeSocketEngineD1Ev @ 539 NONAME
- _ZN19QNativeSocketEngineD2Ev @ 540 NONAME
- _ZN19QSocks5SocketEngine10initializeEN15QAbstractSocket10SocketTypeENS0_20NetworkLayerProtocolE @ 541 NONAME
- _ZN19QSocks5SocketEngine10initializeEiN15QAbstractSocket11SocketStateE @ 542 NONAME
- _ZN19QSocks5SocketEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 543 NONAME
- _ZN19QSocks5SocketEngine11qt_metacastEPKc @ 544 NONAME
- _ZN19QSocks5SocketEngine11waitForReadEiPb @ 545 NONAME
- _ZN19QSocks5SocketEngine12readDatagramEPcxP12QHostAddressPt @ 546 NONAME
- _ZN19QSocks5SocketEngine12waitForWriteEiPb @ 547 NONAME
- _ZN19QSocks5SocketEngine13connectToHostERK12QHostAddresst @ 548 NONAME
- _ZN19QSocks5SocketEngine13writeDatagramEPKcxRK12QHostAddresst @ 549 NONAME
- _ZN19QSocks5SocketEngine15connectInternalEv @ 550 NONAME
- _ZN19QSocks5SocketEngine16staticMetaObjectE @ 551 NONAME DATA 16
- _ZN19QSocks5SocketEngine18waitForReadOrWriteEPbS0_bbiS0_ @ 552 NONAME
- _ZN19QSocks5SocketEngine19connectToHostByNameERK7QStringt @ 553 NONAME
- _ZN19QSocks5SocketEngine26setReadNotificationEnabledEb @ 554 NONAME
- _ZN19QSocks5SocketEngine27setWriteNotificationEnabledEb @ 555 NONAME
- _ZN19QSocks5SocketEngine31setExceptionNotificationEnabledEb @ 556 NONAME
- _ZN19QSocks5SocketEngine4bindERK12QHostAddresst @ 557 NONAME
- _ZN19QSocks5SocketEngine4readEPcx @ 558 NONAME
- _ZN19QSocks5SocketEngine5closeEv @ 559 NONAME
- _ZN19QSocks5SocketEngine5writeEPKcx @ 560 NONAME
- _ZN19QSocks5SocketEngine6acceptEv @ 561 NONAME
- _ZN19QSocks5SocketEngine6listenEv @ 562 NONAME
- _ZN19QSocks5SocketEngine8setProxyERK13QNetworkProxy @ 563 NONAME
- _ZN19QSocks5SocketEngine9setOptionEN21QAbstractSocketEngine12SocketOptionEi @ 564 NONAME
- _ZN19QSocks5SocketEngineC1EP7QObject @ 565 NONAME
- _ZN19QSocks5SocketEngineC2EP7QObject @ 566 NONAME
- _ZN19QSocks5SocketEngineD0Ev @ 567 NONAME
- _ZN19QSocks5SocketEngineD1Ev @ 568 NONAME
- _ZN19QSocks5SocketEngineD2Ev @ 569 NONAME
- _ZN20QNetworkAddressEntry10setNetmaskERK12QHostAddress @ 570 NONAME
- _ZN20QNetworkAddressEntry12setBroadcastERK12QHostAddress @ 571 NONAME
- _ZN20QNetworkAddressEntry15setPrefixLengthEi @ 572 NONAME
- _ZN20QNetworkAddressEntry5setIpERK12QHostAddress @ 573 NONAME
- _ZN20QNetworkAddressEntryC1ERKS_ @ 574 NONAME
- _ZN20QNetworkAddressEntryC1Ev @ 575 NONAME
- _ZN20QNetworkAddressEntryC2ERKS_ @ 576 NONAME
- _ZN20QNetworkAddressEntryC2Ev @ 577 NONAME
- _ZN20QNetworkAddressEntryD1Ev @ 578 NONAME
- _ZN20QNetworkAddressEntryD2Ev @ 579 NONAME
- _ZN20QNetworkAddressEntryaSERKS_ @ 580 NONAME
- _ZN20QNetworkProxyFactory13proxyForQueryERK18QNetworkProxyQuery @ 581 NONAME
- _ZN20QNetworkProxyFactory19systemProxyForQueryERK18QNetworkProxyQuery @ 582 NONAME
- _ZN20QNetworkProxyFactory26setApplicationProxyFactoryEPS_ @ 583 NONAME
- _ZN20QNetworkProxyFactoryC2Ev @ 584 NONAME
- _ZN20QNetworkProxyFactoryD0Ev @ 585 NONAME
- _ZN20QNetworkProxyFactoryD1Ev @ 586 NONAME
- _ZN20QNetworkProxyFactoryD2Ev @ 587 NONAME
- _ZN20QSocketEngineHandlerC2Ev @ 588 NONAME
- _ZN20QSocketEngineHandlerD0Ev @ 589 NONAME
- _ZN20QSocketEngineHandlerD1Ev @ 590 NONAME
- _ZN20QSocketEngineHandlerD2Ev @ 591 NONAME
- _ZN21QAbstractNetworkCache11qt_metacallEN11QMetaObject4CallEiPPv @ 592 NONAME
- _ZN21QAbstractNetworkCache11qt_metacastEPKc @ 593 NONAME
- _ZN21QAbstractNetworkCache16staticMetaObjectE @ 594 NONAME DATA 16
- _ZN21QAbstractNetworkCacheC2EP7QObject @ 595 NONAME
- _ZN21QAbstractNetworkCacheC2ER28QAbstractNetworkCachePrivateP7QObject @ 596 NONAME
- _ZN21QAbstractNetworkCacheD0Ev @ 597 NONAME
- _ZN21QAbstractNetworkCacheD1Ev @ 598 NONAME
- _ZN21QAbstractNetworkCacheD2Ev @ 599 NONAME
- _ZN21QAbstractSocketEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 600 NONAME
- _ZN21QAbstractSocketEngine11qt_metacastEPKc @ 601 NONAME
- _ZN21QAbstractSocketEngine11setPeerPortEt @ 602 NONAME
- _ZN21QAbstractSocketEngine11setProtocolEN15QAbstractSocket20NetworkLayerProtocolE @ 603 NONAME
- _ZN21QAbstractSocketEngine11setReceiverEP29QAbstractSocketEngineReceiver @ 604 NONAME
- _ZN21QAbstractSocketEngine12setLocalPortEt @ 605 NONAME
- _ZN21QAbstractSocketEngine13setSocketTypeEN15QAbstractSocket10SocketTypeE @ 606 NONAME
- _ZN21QAbstractSocketEngine14setPeerAddressERK12QHostAddress @ 607 NONAME
- _ZN21QAbstractSocketEngine15setLocalAddressERK12QHostAddress @ 608 NONAME
- _ZN21QAbstractSocketEngine16readNotificationEv @ 609 NONAME
- _ZN21QAbstractSocketEngine16staticMetaObjectE @ 610 NONAME DATA 16
- _ZN21QAbstractSocketEngine17writeNotificationEv @ 611 NONAME
- _ZN21QAbstractSocketEngine18createSocketEngineEN15QAbstractSocket10SocketTypeERK13QNetworkProxyP7QObject @ 612 NONAME
- _ZN21QAbstractSocketEngine18createSocketEngineEiP7QObject @ 613 NONAME
- _ZN21QAbstractSocketEngine21exceptionNotificationEv @ 614 NONAME
- _ZN21QAbstractSocketEngine22connectionNotificationEv @ 615 NONAME
- _ZN21QAbstractSocketEngine27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 616 NONAME
- _ZN21QAbstractSocketEngine8setStateEN15QAbstractSocket11SocketStateE @ 617 NONAME
- _ZN21QAbstractSocketEngineC2EP7QObject @ 618 NONAME
- _ZN21QAbstractSocketEngineC2ER28QAbstractSocketEnginePrivateP7QObject @ 619 NONAME
- _ZN21QNetworkAccessManager11qt_metacallEN11QMetaObject4CallEiPPv @ 620 NONAME
- _ZN21QNetworkAccessManager11qt_metacastEPKc @ 621 NONAME
- _ZN21QNetworkAccessManager12setCookieJarEP17QNetworkCookieJar @ 622 NONAME
- _ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice @ 623 NONAME
- _ZN21QNetworkAccessManager15setProxyFactoryEP20QNetworkProxyFactory @ 624 NONAME
- _ZN21QNetworkAccessManager16staticMetaObjectE @ 625 NONAME DATA 16
- _ZN21QNetworkAccessManager22authenticationRequiredEP13QNetworkReplyP14QAuthenticator @ 626 NONAME
- _ZN21QNetworkAccessManager27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 627 NONAME
- _ZN21QNetworkAccessManager3getERK15QNetworkRequest @ 628 NONAME
- _ZN21QNetworkAccessManager3putERK15QNetworkRequestP9QIODevice @ 629 NONAME
- _ZN21QNetworkAccessManager3putERK15QNetworkRequestRK10QByteArray @ 630 NONAME
- _ZN21QNetworkAccessManager4headERK15QNetworkRequest @ 631 NONAME
- _ZN21QNetworkAccessManager4postERK15QNetworkRequestP9QIODevice @ 632 NONAME
- _ZN21QNetworkAccessManager4postERK15QNetworkRequestRK10QByteArray @ 633 NONAME
- _ZN21QNetworkAccessManager8finishedEP13QNetworkReply @ 634 NONAME
- _ZN21QNetworkAccessManager8setCacheEP21QAbstractNetworkCache @ 635 NONAME
- _ZN21QNetworkAccessManager8setProxyERK13QNetworkProxy @ 636 NONAME
- _ZN21QNetworkAccessManager9sslErrorsEP13QNetworkReplyRK5QListI9QSslErrorE @ 637 NONAME
- _ZN21QNetworkAccessManagerC1EP7QObject @ 638 NONAME
- _ZN21QNetworkAccessManagerC2EP7QObject @ 639 NONAME
- _ZN21QNetworkAccessManagerD0Ev @ 640 NONAME
- _ZN21QNetworkAccessManagerD1Ev @ 641 NONAME
- _ZN21QNetworkAccessManagerD2Ev @ 642 NONAME
- _ZN21QNetworkCacheMetaData13setAttributesERK5QHashIN15QNetworkRequest9AttributeE8QVariantE @ 643 NONAME
- _ZN21QNetworkCacheMetaData13setRawHeadersERK5QListI5QPairI10QByteArrayS2_EE @ 644 NONAME
- _ZN21QNetworkCacheMetaData13setSaveToDiskEb @ 645 NONAME
- _ZN21QNetworkCacheMetaData15setLastModifiedERK9QDateTime @ 646 NONAME
- _ZN21QNetworkCacheMetaData17setExpirationDateERK9QDateTime @ 647 NONAME
- _ZN21QNetworkCacheMetaData6setUrlERK4QUrl @ 648 NONAME
- _ZN21QNetworkCacheMetaDataC1ERKS_ @ 649 NONAME
- _ZN21QNetworkCacheMetaDataC1Ev @ 650 NONAME
- _ZN21QNetworkCacheMetaDataC2ERKS_ @ 651 NONAME
- _ZN21QNetworkCacheMetaDataC2Ev @ 652 NONAME
- _ZN21QNetworkCacheMetaDataD1Ev @ 653 NONAME
- _ZN21QNetworkCacheMetaDataD2Ev @ 654 NONAME
- _ZN21QNetworkCacheMetaDataaSERKS_ @ 655 NONAME
- _ZN22QHttpNetworkConnection11qt_metacallEN11QMetaObject4CallEiPPv @ 656 NONAME
- _ZN22QHttpNetworkConnection11qt_metacastEPKc @ 657 NONAME
- _ZN22QHttpNetworkConnection11sendRequestERK19QHttpNetworkRequest @ 658 NONAME
- _ZN22QHttpNetworkConnection13setCacheProxyERK13QNetworkProxy @ 659 NONAME
- _ZN22QHttpNetworkConnection15ignoreSslErrorsEi @ 660 NONAME
- _ZN22QHttpNetworkConnection16enableEncryptionEv @ 661 NONAME
- _ZN22QHttpNetworkConnection16staticMetaObjectE @ 662 NONAME DATA 16
- _ZN22QHttpNetworkConnection17setAuthenticationERK7QStringP14QAuthenticator @ 663 NONAME
- _ZN22QHttpNetworkConnection19setSslConfigurationERK17QSslConfiguration @ 664 NONAME
- _ZN22QHttpNetworkConnection19setTransparentProxyERK13QNetworkProxy @ 665 NONAME
- _ZN22QHttpNetworkConnection22authenticationRequiredERK19QHttpNetworkRequestP14QAuthenticatorPKS_ @ 666 NONAME
- _ZN22QHttpNetworkConnection22setProxyAuthenticationEP14QAuthenticator @ 667 NONAME
- _ZN22QHttpNetworkConnection27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticatorPKS_ @ 668 NONAME
- _ZN22QHttpNetworkConnection5errorEN13QNetworkReply12NetworkErrorERK7QString @ 669 NONAME
- _ZN22QHttpNetworkConnection9sslErrorsERK5QListI9QSslErrorE @ 670 NONAME
- _ZN22QHttpNetworkConnectionC1ERK7QStringtbP7QObject @ 671 NONAME
- _ZN22QHttpNetworkConnectionC2ERK7QStringtbP7QObject @ 672 NONAME
- _ZN22QHttpNetworkConnectionD0Ev @ 673 NONAME
- _ZN22QHttpNetworkConnectionD1Ev @ 674 NONAME
- _ZN22QHttpNetworkConnectionD2Ev @ 675 NONAME
- _ZN24QHttpSocketEngineHandler18createSocketEngineEN15QAbstractSocket10SocketTypeERK13QNetworkProxyP7QObject @ 676 NONAME
- _ZN24QHttpSocketEngineHandler18createSocketEngineEiP7QObject @ 677 NONAME
- _ZN26QSocks5SocketEngineHandler18createSocketEngineEN15QAbstractSocket10SocketTypeERK13QNetworkProxyP7QObject @ 678 NONAME
- _ZN26QSocks5SocketEngineHandler18createSocketEngineEiP7QObject @ 679 NONAME
- _ZN28QNetworkAccessManagerPrivate10clearCacheEP21QNetworkAccessManager @ 680 NONAME
- _ZN4QFtp10rawCommandERK7QString @ 681 NONAME
- _ZN4QFtp11qt_metacallEN11QMetaObject4CallEiPPv @ 682 NONAME
- _ZN4QFtp11qt_metacastEPKc @ 683 NONAME
- _ZN4QFtp12stateChangedEi @ 684 NONAME
- _ZN4QFtp13connectToHostERK7QStringt @ 685 NONAME
- _ZN4QFtp14commandStartedEi @ 686 NONAME
- _ZN4QFtp15commandFinishedEib @ 687 NONAME
- _ZN4QFtp15rawCommandReplyEiRK7QString @ 688 NONAME
- _ZN4QFtp15setTransferModeENS_12TransferModeE @ 689 NONAME
- _ZN4QFtp16staticMetaObjectE @ 690 NONAME DATA 16
- _ZN4QFtp20clearPendingCommandsEv @ 691 NONAME
- _ZN4QFtp20dataTransferProgressExx @ 692 NONAME
- _ZN4QFtp2cdERK7QString @ 693 NONAME
- _ZN4QFtp3getERK7QStringP9QIODeviceNS_12TransferTypeE @ 694 NONAME
- _ZN4QFtp3putEP9QIODeviceRK7QStringNS_12TransferTypeE @ 695 NONAME
- _ZN4QFtp3putERK10QByteArrayRK7QStringNS_12TransferTypeE @ 696 NONAME
- _ZN4QFtp4doneEb @ 697 NONAME
- _ZN4QFtp4listERK7QString @ 698 NONAME
- _ZN4QFtp4readEPcx @ 699 NONAME
- _ZN4QFtp5abortEv @ 700 NONAME
- _ZN4QFtp5closeEv @ 701 NONAME
- _ZN4QFtp5loginERK7QStringS2_ @ 702 NONAME
- _ZN4QFtp5mkdirERK7QString @ 703 NONAME
- _ZN4QFtp5rmdirERK7QString @ 704 NONAME
- _ZN4QFtp6removeERK7QString @ 705 NONAME
- _ZN4QFtp6renameERK7QStringS2_ @ 706 NONAME
- _ZN4QFtp7readAllEv @ 707 NONAME
- _ZN4QFtp8listInfoERK8QUrlInfo @ 708 NONAME
- _ZN4QFtp8setProxyERK7QStringt @ 709 NONAME
- _ZN4QFtp9readyReadEv @ 710 NONAME
- _ZN4QFtpC1EP7QObject @ 711 NONAME
- _ZN4QFtpC2EP7QObject @ 712 NONAME
- _ZN4QFtpD0Ev @ 713 NONAME
- _ZN4QFtpD1Ev @ 714 NONAME
- _ZN4QFtpD2Ev @ 715 NONAME
- _ZN5QHttp11qt_metacallEN11QMetaObject4CallEiPPv @ 716 NONAME
- _ZN5QHttp11qt_metacastEPKc @ 717 NONAME
- _ZN5QHttp12stateChangedEi @ 718 NONAME
- _ZN5QHttp14requestStartedEi @ 719 NONAME
- _ZN5QHttp15closeConnectionEv @ 720 NONAME
- _ZN5QHttp15ignoreSslErrorsEv @ 721 NONAME
- _ZN5QHttp15requestFinishedEib @ 722 NONAME
- _ZN5QHttp16dataReadProgressEii @ 723 NONAME
- _ZN5QHttp16dataSendProgressEii @ 724 NONAME
- _ZN5QHttp16staticMetaObjectE @ 725 NONAME DATA 16
- _ZN5QHttp20clearPendingRequestsEv @ 726 NONAME
- _ZN5QHttp22authenticationRequiredERK7QStringtP14QAuthenticator @ 727 NONAME
- _ZN5QHttp22responseHeaderReceivedERK19QHttpResponseHeader @ 728 NONAME
- _ZN5QHttp27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 729 NONAME
- _ZN5QHttp3getERK7QStringP9QIODevice @ 730 NONAME
- _ZN5QHttp4doneEb @ 731 NONAME
- _ZN5QHttp4headERK7QString @ 732 NONAME
- _ZN5QHttp4postERK7QStringP9QIODeviceS4_ @ 733 NONAME
- _ZN5QHttp4postERK7QStringRK10QByteArrayP9QIODevice @ 734 NONAME
- _ZN5QHttp4readEPcx @ 735 NONAME
- _ZN5QHttp5abortEv @ 736 NONAME
- _ZN5QHttp5closeEv @ 737 NONAME
- _ZN5QHttp7readAllEv @ 738 NONAME
- _ZN5QHttp7requestERK18QHttpRequestHeaderP9QIODeviceS4_ @ 739 NONAME
- _ZN5QHttp7requestERK18QHttpRequestHeaderRK10QByteArrayP9QIODevice @ 740 NONAME
- _ZN5QHttp7setHostERK7QStringNS_14ConnectionModeEt @ 741 NONAME
- _ZN5QHttp7setHostERK7QStringt @ 742 NONAME
- _ZN5QHttp7setUserERK7QStringS2_ @ 743 NONAME
- _ZN5QHttp8setProxyERK13QNetworkProxy @ 744 NONAME
- _ZN5QHttp8setProxyERK7QStringiS2_S2_ @ 745 NONAME
- _ZN5QHttp9readyReadERK19QHttpResponseHeader @ 746 NONAME
- _ZN5QHttp9setSocketEP10QTcpSocket @ 747 NONAME
- _ZN5QHttp9sslErrorsERK5QListI9QSslErrorE @ 748 NONAME
- _ZN5QHttpC1EP7QObject @ 749 NONAME
- _ZN5QHttpC1ERK7QStringNS_14ConnectionModeEtP7QObject @ 750 NONAME
- _ZN5QHttpC1ERK7QStringtP7QObject @ 751 NONAME
- _ZN5QHttpC2EP7QObject @ 752 NONAME
- _ZN5QHttpC2ERK7QStringNS_14ConnectionModeEtP7QObject @ 753 NONAME
- _ZN5QHttpC2ERK7QStringtP7QObject @ 754 NONAME
- _ZN5QHttpD0Ev @ 755 NONAME
- _ZN5QHttpD1Ev @ 756 NONAME
- _ZN5QHttpD2Ev @ 757 NONAME
- _ZN7QSslKey5clearEv @ 758 NONAME
- _ZN7QSslKeyC1EP9QIODeviceN4QSsl12KeyAlgorithmENS2_14EncodingFormatENS2_7KeyTypeERK10QByteArray @ 759 NONAME
- _ZN7QSslKeyC1ERK10QByteArrayN4QSsl12KeyAlgorithmENS3_14EncodingFormatENS3_7KeyTypeES2_ @ 760 NONAME
- _ZN7QSslKeyC1ERKS_ @ 761 NONAME
- _ZN7QSslKeyC1Ev @ 762 NONAME
- _ZN7QSslKeyC2EP9QIODeviceN4QSsl12KeyAlgorithmENS2_14EncodingFormatENS2_7KeyTypeERK10QByteArray @ 763 NONAME
- _ZN7QSslKeyC2ERK10QByteArrayN4QSsl12KeyAlgorithmENS3_14EncodingFormatENS3_7KeyTypeES2_ @ 764 NONAME
- _ZN7QSslKeyC2ERKS_ @ 765 NONAME
- _ZN7QSslKeyC2Ev @ 766 NONAME
- _ZN7QSslKeyD1Ev @ 767 NONAME
- _ZN7QSslKeyD2Ev @ 768 NONAME
- _ZN7QSslKeyaSERKS_ @ 769 NONAME
- _ZN8QUrlInfo10setSymLinkEb @ 770 NONAME
- _ZN8QUrlInfo11greaterThanERKS_S1_i @ 771 NONAME
- _ZN8QUrlInfo11setLastReadERK9QDateTime @ 772 NONAME
- _ZN8QUrlInfo11setReadableEb @ 773 NONAME
- _ZN8QUrlInfo11setWritableEb @ 774 NONAME
- _ZN8QUrlInfo14setPermissionsEi @ 775 NONAME
- _ZN8QUrlInfo15setLastModifiedERK9QDateTime @ 776 NONAME
- _ZN8QUrlInfo5equalERKS_S1_i @ 777 NONAME
- _ZN8QUrlInfo6setDirEb @ 778 NONAME
- _ZN8QUrlInfo7setFileEb @ 779 NONAME
- _ZN8QUrlInfo7setNameERK7QString @ 780 NONAME
- _ZN8QUrlInfo7setSizeEx @ 781 NONAME
- _ZN8QUrlInfo8lessThanERKS_S1_i @ 782 NONAME
- _ZN8QUrlInfo8setGroupERK7QString @ 783 NONAME
- _ZN8QUrlInfo8setOwnerERK7QString @ 784 NONAME
- _ZN8QUrlInfoC1ERK4QUrliRK7QStringS5_xRK9QDateTimeS8_bbbbbb @ 785 NONAME
- _ZN8QUrlInfoC1ERK7QStringiS2_S2_xRK9QDateTimeS5_bbbbbb @ 786 NONAME
- _ZN8QUrlInfoC1ERKS_ @ 787 NONAME
- _ZN8QUrlInfoC1Ev @ 788 NONAME
- _ZN8QUrlInfoC2ERK4QUrliRK7QStringS5_xRK9QDateTimeS8_bbbbbb @ 789 NONAME
- _ZN8QUrlInfoC2ERK7QStringiS2_S2_xRK9QDateTimeS5_bbbbbb @ 790 NONAME
- _ZN8QUrlInfoC2ERKS_ @ 791 NONAME
- _ZN8QUrlInfoC2Ev @ 792 NONAME
- _ZN8QUrlInfoD0Ev @ 793 NONAME
- _ZN8QUrlInfoD1Ev @ 794 NONAME
- _ZN8QUrlInfoD2Ev @ 795 NONAME
- _ZN8QUrlInfoaSERKS_ @ 796 NONAME
- _ZN9QHostInfo10lookupHostERK7QStringP7QObjectPKc @ 797 NONAME
- _ZN9QHostInfo11setHostNameERK7QString @ 798 NONAME
- _ZN9QHostInfo11setLookupIdEi @ 799 NONAME
- _ZN9QHostInfo12setAddressesERK5QListI12QHostAddressE @ 800 NONAME
- _ZN9QHostInfo13localHostNameEv @ 801 NONAME
- _ZN9QHostInfo14setErrorStringERK7QString @ 802 NONAME
- _ZN9QHostInfo15abortHostLookupEi @ 803 NONAME
- _ZN9QHostInfo15localDomainNameEv @ 804 NONAME
- _ZN9QHostInfo8fromNameERK7QString @ 805 NONAME
- _ZN9QHostInfo8setErrorENS_13HostInfoErrorE @ 806 NONAME
- _ZN9QHostInfoC1ERKS_ @ 807 NONAME
- _ZN9QHostInfoC1Ei @ 808 NONAME
- _ZN9QHostInfoC2ERKS_ @ 809 NONAME
- _ZN9QHostInfoC2Ei @ 810 NONAME
- _ZN9QHostInfoD1Ev @ 811 NONAME
- _ZN9QHostInfoD2Ev @ 812 NONAME
- _ZN9QHostInfoaSERKS_ @ 813 NONAME
- _ZN9QSslErrorC1ENS_8SslErrorE @ 814 NONAME
- _ZN9QSslErrorC1ENS_8SslErrorERK15QSslCertificate @ 815 NONAME
- _ZN9QSslErrorC1ERKS_ @ 816 NONAME
- _ZN9QSslErrorC1Ev @ 817 NONAME
- _ZN9QSslErrorC2ENS_8SslErrorE @ 818 NONAME
- _ZN9QSslErrorC2ENS_8SslErrorERK15QSslCertificate @ 819 NONAME
- _ZN9QSslErrorC2ERKS_ @ 820 NONAME
- _ZN9QSslErrorC2Ev @ 821 NONAME
- _ZN9QSslErrorD1Ev @ 822 NONAME
- _ZN9QSslErrorD2Ev @ 823 NONAME
- _ZN9QSslErroraSERKS_ @ 824 NONAME
- _ZNK10QSslCipher13supportedBitsEv @ 825 NONAME
- _ZNK10QSslCipher14protocolStringEv @ 826 NONAME
- _ZNK10QSslCipher16encryptionMethodEv @ 827 NONAME
- _ZNK10QSslCipher17keyExchangeMethodEv @ 828 NONAME
- _ZNK10QSslCipher20authenticationMethodEv @ 829 NONAME
- _ZNK10QSslCipher4nameEv @ 830 NONAME
- _ZNK10QSslCipher6isNullEv @ 831 NONAME
- _ZNK10QSslCipher8protocolEv @ 832 NONAME
- _ZNK10QSslCipher8usedBitsEv @ 833 NONAME
- _ZNK10QSslCiphereqERKS_ @ 834 NONAME
- _ZNK10QSslSocket10metaObjectEv @ 835 NONAME
- _ZNK10QSslSocket10privateKeyEv @ 836 NONAME
- _ZNK10QSslSocket11canReadLineEv @ 837 NONAME
- _ZNK10QSslSocket11isEncryptedEv @ 838 NONAME
- _ZNK10QSslSocket12bytesToWriteEv @ 839 NONAME
- _ZNK10QSslSocket13sessionCipherEv @ 840 NONAME
- _ZNK10QSslSocket14bytesAvailableEv @ 841 NONAME
- _ZNK10QSslSocket14caCertificatesEv @ 842 NONAME
- _ZNK10QSslSocket14peerVerifyModeEv @ 843 NONAME
- _ZNK10QSslSocket15peerCertificateEv @ 844 NONAME
- _ZNK10QSslSocket15peerVerifyDepthEv @ 845 NONAME
- _ZNK10QSslSocket16localCertificateEv @ 846 NONAME
- _ZNK10QSslSocket16sslConfigurationEv @ 847 NONAME
- _ZNK10QSslSocket20peerCertificateChainEv @ 848 NONAME
- _ZNK10QSslSocket21encryptedBytesToWriteEv @ 849 NONAME
- _ZNK10QSslSocket23encryptedBytesAvailableEv @ 850 NONAME
- _ZNK10QSslSocket4modeEv @ 851 NONAME
- _ZNK10QSslSocket5atEndEv @ 852 NONAME
- _ZNK10QSslSocket7ciphersEv @ 853 NONAME
- _ZNK10QSslSocket8protocolEv @ 854 NONAME
- _ZNK10QSslSocket9sslErrorsEv @ 855 NONAME
- _ZNK10QTcpServer10metaObjectEv @ 856 NONAME
- _ZNK10QTcpServer10serverPortEv @ 857 NONAME
- _ZNK10QTcpServer11errorStringEv @ 858 NONAME
- _ZNK10QTcpServer11isListeningEv @ 859 NONAME
- _ZNK10QTcpServer11serverErrorEv @ 860 NONAME
- _ZNK10QTcpServer13serverAddressEv @ 861 NONAME
- _ZNK10QTcpServer16socketDescriptorEv @ 862 NONAME
- _ZNK10QTcpServer21hasPendingConnectionsEv @ 863 NONAME
- _ZNK10QTcpServer21maxPendingConnectionsEv @ 864 NONAME
- _ZNK10QTcpServer5proxyEv @ 865 NONAME
- _ZNK10QTcpSocket10metaObjectEv @ 866 NONAME
- _ZNK10QUdpSocket10metaObjectEv @ 867 NONAME
- _ZNK10QUdpSocket19hasPendingDatagramsEv @ 868 NONAME
- _ZNK10QUdpSocket19pendingDatagramSizeEv @ 869 NONAME
- _ZNK11QHttpHeader11contentTypeEv @ 870 NONAME
- _ZNK11QHttpHeader13contentLengthEv @ 871 NONAME
- _ZNK11QHttpHeader14hasContentTypeEv @ 872 NONAME
- _ZNK11QHttpHeader16hasContentLengthEv @ 873 NONAME
- _ZNK11QHttpHeader4keysEv @ 874 NONAME
- _ZNK11QHttpHeader5valueERK7QString @ 875 NONAME
- _ZNK11QHttpHeader6hasKeyERK7QString @ 876 NONAME
- _ZNK11QHttpHeader6valuesEv @ 877 NONAME
- _ZNK11QHttpHeader7isValidEv @ 878 NONAME
- _ZNK11QHttpHeader8toStringEv @ 879 NONAME
- _ZNK11QHttpHeader9allValuesERK7QString @ 880 NONAME
- _ZNK12QHostAddress10isInSubnetERK5QPairIS_iE @ 881 NONAME
- _ZNK12QHostAddress10isInSubnetERKS_i @ 882 NONAME
- _ZNK12QHostAddress13toIPv4AddressEv @ 883 NONAME
- _ZNK12QHostAddress13toIPv6AddressEv @ 884 NONAME
- _ZNK12QHostAddress6isNullEv @ 885 NONAME
- _ZNK12QHostAddress7scopeIdEv @ 886 NONAME
- _ZNK12QHostAddress8protocolEv @ 887 NONAME
- _ZNK12QHostAddress8toStringEv @ 888 NONAME
- _ZNK12QHostAddresseqENS_14SpecialAddressE @ 889 NONAME
- _ZNK12QHostAddresseqERKS_ @ 890 NONAME
- _ZNK12QLocalServer10metaObjectEv @ 891 NONAME
- _ZNK12QLocalServer10serverNameEv @ 892 NONAME
- _ZNK12QLocalServer11errorStringEv @ 893 NONAME
- _ZNK12QLocalServer11isListeningEv @ 894 NONAME
- _ZNK12QLocalServer11serverErrorEv @ 895 NONAME
- _ZNK12QLocalServer14fullServerNameEv @ 896 NONAME
- _ZNK12QLocalServer21hasPendingConnectionsEv @ 897 NONAME
- _ZNK12QLocalServer21maxPendingConnectionsEv @ 898 NONAME
- _ZNK12QLocalSocket10metaObjectEv @ 899 NONAME
- _ZNK12QLocalSocket10serverNameEv @ 900 NONAME
- _ZNK12QLocalSocket11canReadLineEv @ 901 NONAME
- _ZNK12QLocalSocket12bytesToWriteEv @ 902 NONAME
- _ZNK12QLocalSocket12isSequentialEv @ 903 NONAME
- _ZNK12QLocalSocket14bytesAvailableEv @ 904 NONAME
- _ZNK12QLocalSocket14fullServerNameEv @ 905 NONAME
- _ZNK12QLocalSocket14readBufferSizeEv @ 906 NONAME
- _ZNK12QLocalSocket16socketDescriptorEv @ 907 NONAME
- _ZNK12QLocalSocket5errorEv @ 908 NONAME
- _ZNK12QLocalSocket5stateEv @ 909 NONAME
- _ZNK12QLocalSocket7isValidEv @ 910 NONAME
- _ZNK13QNetworkProxy12capabilitiesEv @ 911 NONAME
- _ZNK13QNetworkProxy14isCachingProxyEv @ 912 NONAME
- _ZNK13QNetworkProxy18isTransparentProxyEv @ 913 NONAME
- _ZNK13QNetworkProxy4portEv @ 914 NONAME
- _ZNK13QNetworkProxy4typeEv @ 915 NONAME
- _ZNK13QNetworkProxy4userEv @ 916 NONAME
- _ZNK13QNetworkProxy8hostNameEv @ 917 NONAME
- _ZNK13QNetworkProxy8passwordEv @ 918 NONAME
- _ZNK13QNetworkProxyeqERKS_ @ 919 NONAME
- _ZNK13QNetworkReply10metaObjectEv @ 920 NONAME
- _ZNK13QNetworkReply12hasRawHeaderERK10QByteArray @ 921 NONAME
- _ZNK13QNetworkReply12isSequentialEv @ 922 NONAME
- _ZNK13QNetworkReply13rawHeaderListEv @ 923 NONAME
- _ZNK13QNetworkReply14readBufferSizeEv @ 924 NONAME
- _ZNK13QNetworkReply16sslConfigurationEv @ 925 NONAME
- _ZNK13QNetworkReply3urlEv @ 926 NONAME
- _ZNK13QNetworkReply5errorEv @ 927 NONAME
- _ZNK13QNetworkReply6headerEN15QNetworkRequest12KnownHeadersE @ 928 NONAME
- _ZNK13QNetworkReply7managerEv @ 929 NONAME
- _ZNK13QNetworkReply7requestEv @ 930 NONAME
- _ZNK13QNetworkReply9attributeEN15QNetworkRequest9AttributeE @ 931 NONAME
- _ZNK13QNetworkReply9operationEv @ 932 NONAME
- _ZNK13QNetworkReply9rawHeaderERK10QByteArray @ 933 NONAME
- _ZNK14QAuthenticator4userEv @ 934 NONAME
- _ZNK14QAuthenticator5realmEv @ 935 NONAME
- _ZNK14QAuthenticator6isNullEv @ 936 NONAME
- _ZNK14QAuthenticator8passwordEv @ 937 NONAME
- _ZNK14QAuthenticatoreqERKS_ @ 938 NONAME
- _ZNK14QNetworkCookie10isHttpOnlyEv @ 939 NONAME
- _ZNK14QNetworkCookie14expirationDateEv @ 940 NONAME
- _ZNK14QNetworkCookie15isSessionCookieEv @ 941 NONAME
- _ZNK14QNetworkCookie4nameEv @ 942 NONAME
- _ZNK14QNetworkCookie4pathEv @ 943 NONAME
- _ZNK14QNetworkCookie5valueEv @ 944 NONAME
- _ZNK14QNetworkCookie6domainEv @ 945 NONAME
- _ZNK14QNetworkCookie8isSecureEv @ 946 NONAME
- _ZNK14QNetworkCookie9toRawFormENS_7RawFormE @ 947 NONAME
- _ZNK14QNetworkCookieeqERKS_ @ 948 NONAME
- _ZNK15QAbstractSocket10metaObjectEv @ 949 NONAME
- _ZNK15QAbstractSocket10socketTypeEv @ 950 NONAME
- _ZNK15QAbstractSocket11canReadLineEv @ 951 NONAME
- _ZNK15QAbstractSocket11peerAddressEv @ 952 NONAME
- _ZNK15QAbstractSocket12bytesToWriteEv @ 953 NONAME
- _ZNK15QAbstractSocket12isSequentialEv @ 954 NONAME
- _ZNK15QAbstractSocket12localAddressEv @ 955 NONAME
- _ZNK15QAbstractSocket14bytesAvailableEv @ 956 NONAME
- _ZNK15QAbstractSocket14readBufferSizeEv @ 957 NONAME
- _ZNK15QAbstractSocket16socketDescriptorEv @ 958 NONAME
- _ZNK15QAbstractSocket5atEndEv @ 959 NONAME
- _ZNK15QAbstractSocket5errorEv @ 960 NONAME
- _ZNK15QAbstractSocket5proxyEv @ 961 NONAME
- _ZNK15QAbstractSocket5stateEv @ 962 NONAME
- _ZNK15QAbstractSocket7isValidEv @ 963 NONAME
- _ZNK15QAbstractSocket8peerNameEv @ 964 NONAME
- _ZNK15QAbstractSocket8peerPortEv @ 965 NONAME
- _ZNK15QAbstractSocket9localPortEv @ 966 NONAME
- _ZNK15QNetworkRequest12hasRawHeaderERK10QByteArray @ 967 NONAME
- _ZNK15QNetworkRequest13rawHeaderListEv @ 968 NONAME
- _ZNK15QNetworkRequest16sslConfigurationEv @ 969 NONAME
- _ZNK15QNetworkRequest3urlEv @ 970 NONAME
- _ZNK15QNetworkRequest6headerENS_12KnownHeadersE @ 971 NONAME
- _ZNK15QNetworkRequest9attributeENS_9AttributeERK8QVariant @ 972 NONAME
- _ZNK15QNetworkRequest9rawHeaderERK10QByteArray @ 973 NONAME
- _ZNK15QNetworkRequesteqERKS_ @ 974 NONAME
- _ZNK15QSslCertificate10expiryDateEv @ 975 NONAME
- _ZNK15QSslCertificate10issuerInfoENS_11SubjectInfoE @ 976 NONAME
- _ZNK15QSslCertificate10issuerInfoERK10QByteArray @ 977 NONAME
- _ZNK15QSslCertificate11subjectInfoENS_11SubjectInfoE @ 978 NONAME
- _ZNK15QSslCertificate11subjectInfoERK10QByteArray @ 979 NONAME
- _ZNK15QSslCertificate12serialNumberEv @ 980 NONAME
- _ZNK15QSslCertificate13effectiveDateEv @ 981 NONAME
- _ZNK15QSslCertificate21alternateSubjectNamesEv @ 982 NONAME
- _ZNK15QSslCertificate5toDerEv @ 983 NONAME
- _ZNK15QSslCertificate5toPemEv @ 984 NONAME
- _ZNK15QSslCertificate6digestEN18QCryptographicHash9AlgorithmE @ 985 NONAME
- _ZNK15QSslCertificate6handleEv @ 986 NONAME
- _ZNK15QSslCertificate6isNullEv @ 987 NONAME
- _ZNK15QSslCertificate7isValidEv @ 988 NONAME
- _ZNK15QSslCertificate7versionEv @ 989 NONAME
- _ZNK15QSslCertificate9publicKeyEv @ 990 NONAME
- _ZNK15QSslCertificateeqERKS_ @ 991 NONAME
- _ZNK17QHttpNetworkReply10isFinishedEv @ 992 NONAME
- _ZNK17QHttpNetworkReply10metaObjectEv @ 993 NONAME
- _ZNK17QHttpNetworkReply10statusCodeEv @ 994 NONAME
- _ZNK17QHttpNetworkReply11errorStringEv @ 995 NONAME
- _ZNK17QHttpNetworkReply11headerFieldERK10QByteArrayS2_ @ 996 NONAME
- _ZNK17QHttpNetworkReply12majorVersionEv @ 997 NONAME
- _ZNK17QHttpNetworkReply12minorVersionEv @ 998 NONAME
- _ZNK17QHttpNetworkReply12reasonPhraseEv @ 999 NONAME
- _ZNK17QHttpNetworkReply13contentLengthEv @ 1000 NONAME
- _ZNK17QHttpNetworkReply14bytesAvailableEv @ 1001 NONAME
- _ZNK17QHttpNetworkReply16sslConfigurationEv @ 1002 NONAME
- _ZNK17QHttpNetworkReply3urlEv @ 1003 NONAME
- _ZNK17QHttpNetworkReply6headerEv @ 1004 NONAME
- _ZNK17QHttpNetworkReply7requestEv @ 1005 NONAME
- _ZNK17QHttpSocketEngine10metaObjectEv @ 1006 NONAME
- _ZNK17QHttpSocketEngine14bytesAvailableEv @ 1007 NONAME
- _ZNK17QHttpSocketEngine16socketDescriptorEv @ 1008 NONAME
- _ZNK17QHttpSocketEngine19hasPendingDatagramsEv @ 1009 NONAME
- _ZNK17QHttpSocketEngine19pendingDatagramSizeEv @ 1010 NONAME
- _ZNK17QHttpSocketEngine25isReadNotificationEnabledEv @ 1011 NONAME
- _ZNK17QHttpSocketEngine26isWriteNotificationEnabledEv @ 1012 NONAME
- _ZNK17QHttpSocketEngine30isExceptionNotificationEnabledEv @ 1013 NONAME
- _ZNK17QHttpSocketEngine6optionEN21QAbstractSocketEngine12SocketOptionE @ 1014 NONAME
- _ZNK17QHttpSocketEngine7isValidEv @ 1015 NONAME
- _ZNK17QNetworkCookieJar10allCookiesEv @ 1016 NONAME
- _ZNK17QNetworkCookieJar10metaObjectEv @ 1017 NONAME
- _ZNK17QNetworkCookieJar13cookiesForUrlERK4QUrl @ 1018 NONAME
- _ZNK17QNetworkDiskCache10metaObjectEv @ 1019 NONAME
- _ZNK17QNetworkDiskCache12fileMetaDataERK7QString @ 1020 NONAME
- _ZNK17QNetworkDiskCache14cacheDirectoryEv @ 1021 NONAME
- _ZNK17QNetworkDiskCache16maximumCacheSizeEv @ 1022 NONAME
- _ZNK17QNetworkDiskCache9cacheSizeEv @ 1023 NONAME
- _ZNK17QNetworkInterface14addressEntriesEv @ 1024 NONAME
- _ZNK17QNetworkInterface15hardwareAddressEv @ 1025 NONAME
- _ZNK17QNetworkInterface17humanReadableNameEv @ 1026 NONAME
- _ZNK17QNetworkInterface4nameEv @ 1027 NONAME
- _ZNK17QNetworkInterface5flagsEv @ 1028 NONAME
- _ZNK17QNetworkInterface5indexEv @ 1029 NONAME
- _ZNK17QNetworkInterface7isValidEv @ 1030 NONAME
- _ZNK17QSslConfiguration10privateKeyEv @ 1031 NONAME
- _ZNK17QSslConfiguration13sessionCipherEv @ 1032 NONAME
- _ZNK17QSslConfiguration14caCertificatesEv @ 1033 NONAME
- _ZNK17QSslConfiguration14peerVerifyModeEv @ 1034 NONAME
- _ZNK17QSslConfiguration15peerCertificateEv @ 1035 NONAME
- _ZNK17QSslConfiguration15peerVerifyDepthEv @ 1036 NONAME
- _ZNK17QSslConfiguration16localCertificateEv @ 1037 NONAME
- _ZNK17QSslConfiguration20peerCertificateChainEv @ 1038 NONAME
- _ZNK17QSslConfiguration6isNullEv @ 1039 NONAME
- _ZNK17QSslConfiguration7ciphersEv @ 1040 NONAME
- _ZNK17QSslConfiguration8protocolEv @ 1041 NONAME
- _ZNK17QSslConfigurationeqERKS_ @ 1042 NONAME
- _ZNK18QHttpRequestHeader12majorVersionEv @ 1043 NONAME
- _ZNK18QHttpRequestHeader12minorVersionEv @ 1044 NONAME
- _ZNK18QHttpRequestHeader4pathEv @ 1045 NONAME
- _ZNK18QHttpRequestHeader6methodEv @ 1046 NONAME
- _ZNK18QHttpRequestHeader8toStringEv @ 1047 NONAME
- _ZNK18QNetworkProxyQuery11protocolTagEv @ 1048 NONAME
- _ZNK18QNetworkProxyQuery12peerHostNameEv @ 1049 NONAME
- _ZNK18QNetworkProxyQuery3urlEv @ 1050 NONAME
- _ZNK18QNetworkProxyQuery8peerPortEv @ 1051 NONAME
- _ZNK18QNetworkProxyQuery9localPortEv @ 1052 NONAME
- _ZNK18QNetworkProxyQuery9queryTypeEv @ 1053 NONAME
- _ZNK18QNetworkProxyQueryeqERKS_ @ 1054 NONAME
- _ZNK19QHttpNetworkRequest11headerFieldERK10QByteArrayS2_ @ 1055 NONAME
- _ZNK19QHttpNetworkRequest12majorVersionEv @ 1056 NONAME
- _ZNK19QHttpNetworkRequest12minorVersionEv @ 1057 NONAME
- _ZNK19QHttpNetworkRequest13contentLengthEv @ 1058 NONAME
- _ZNK19QHttpNetworkRequest3urlEv @ 1059 NONAME
- _ZNK19QHttpNetworkRequest4dataEv @ 1060 NONAME ABSENT
- _ZNK19QHttpNetworkRequest6headerEv @ 1061 NONAME
- _ZNK19QHttpNetworkRequest8priorityEv @ 1062 NONAME
- _ZNK19QHttpNetworkRequest9operationEv @ 1063 NONAME
- _ZNK19QHttpNetworkRequesteqERKS_ @ 1064 NONAME
- _ZNK19QHttpResponseHeader10statusCodeEv @ 1065 NONAME
- _ZNK19QHttpResponseHeader12majorVersionEv @ 1066 NONAME
- _ZNK19QHttpResponseHeader12minorVersionEv @ 1067 NONAME
- _ZNK19QHttpResponseHeader12reasonPhraseEv @ 1068 NONAME
- _ZNK19QHttpResponseHeader8toStringEv @ 1069 NONAME
- _ZNK19QNativeSocketEngine10metaObjectEv @ 1070 NONAME
- _ZNK19QNativeSocketEngine14bytesAvailableEv @ 1071 NONAME
- _ZNK19QNativeSocketEngine14sendBufferSizeEv @ 1072 NONAME
- _ZNK19QNativeSocketEngine16socketDescriptorEv @ 1073 NONAME
- _ZNK19QNativeSocketEngine17receiveBufferSizeEv @ 1074 NONAME
- _ZNK19QNativeSocketEngine19hasPendingDatagramsEv @ 1075 NONAME
- _ZNK19QNativeSocketEngine19pendingDatagramSizeEv @ 1076 NONAME
- _ZNK19QNativeSocketEngine25isReadNotificationEnabledEv @ 1077 NONAME
- _ZNK19QNativeSocketEngine26isWriteNotificationEnabledEv @ 1078 NONAME
- _ZNK19QNativeSocketEngine30isExceptionNotificationEnabledEv @ 1079 NONAME
- _ZNK19QNativeSocketEngine6optionEN21QAbstractSocketEngine12SocketOptionE @ 1080 NONAME
- _ZNK19QNativeSocketEngine7isValidEv @ 1081 NONAME
- _ZNK19QSocks5SocketEngine10metaObjectEv @ 1082 NONAME
- _ZNK19QSocks5SocketEngine14bytesAvailableEv @ 1083 NONAME
- _ZNK19QSocks5SocketEngine16socketDescriptorEv @ 1084 NONAME
- _ZNK19QSocks5SocketEngine19hasPendingDatagramsEv @ 1085 NONAME
- _ZNK19QSocks5SocketEngine19pendingDatagramSizeEv @ 1086 NONAME
- _ZNK19QSocks5SocketEngine25isReadNotificationEnabledEv @ 1087 NONAME
- _ZNK19QSocks5SocketEngine26isWriteNotificationEnabledEv @ 1088 NONAME
- _ZNK19QSocks5SocketEngine30isExceptionNotificationEnabledEv @ 1089 NONAME
- _ZNK19QSocks5SocketEngine6optionEN21QAbstractSocketEngine12SocketOptionE @ 1090 NONAME
- _ZNK19QSocks5SocketEngine7isValidEv @ 1091 NONAME
- _ZNK20QNetworkAddressEntry12prefixLengthEv @ 1092 NONAME
- _ZNK20QNetworkAddressEntry2ipEv @ 1093 NONAME
- _ZNK20QNetworkAddressEntry7netmaskEv @ 1094 NONAME
- _ZNK20QNetworkAddressEntry9broadcastEv @ 1095 NONAME
- _ZNK20QNetworkAddressEntryeqERKS_ @ 1096 NONAME
- _ZNK21QAbstractNetworkCache10metaObjectEv @ 1097 NONAME
- _ZNK21QAbstractSocketEngine10metaObjectEv @ 1098 NONAME
- _ZNK21QAbstractSocketEngine10socketTypeEv @ 1099 NONAME
- _ZNK21QAbstractSocketEngine11errorStringEv @ 1100 NONAME
- _ZNK21QAbstractSocketEngine11peerAddressEv @ 1101 NONAME
- _ZNK21QAbstractSocketEngine12localAddressEv @ 1102 NONAME
- _ZNK21QAbstractSocketEngine5errorEv @ 1103 NONAME
- _ZNK21QAbstractSocketEngine5stateEv @ 1104 NONAME
- _ZNK21QAbstractSocketEngine8peerPortEv @ 1105 NONAME
- _ZNK21QAbstractSocketEngine8protocolEv @ 1106 NONAME
- _ZNK21QAbstractSocketEngine8setErrorEN15QAbstractSocket11SocketErrorERK7QString @ 1107 NONAME
- _ZNK21QAbstractSocketEngine9localPortEv @ 1108 NONAME
- _ZNK21QNetworkAccessManager10metaObjectEv @ 1109 NONAME
- _ZNK21QNetworkAccessManager12proxyFactoryEv @ 1110 NONAME
- _ZNK21QNetworkAccessManager5cacheEv @ 1111 NONAME
- _ZNK21QNetworkAccessManager5proxyEv @ 1112 NONAME
- _ZNK21QNetworkAccessManager9cookieJarEv @ 1113 NONAME
- _ZNK21QNetworkCacheMetaData10attributesEv @ 1114 NONAME
- _ZNK21QNetworkCacheMetaData10rawHeadersEv @ 1115 NONAME
- _ZNK21QNetworkCacheMetaData10saveToDiskEv @ 1116 NONAME
- _ZNK21QNetworkCacheMetaData12lastModifiedEv @ 1117 NONAME
- _ZNK21QNetworkCacheMetaData14expirationDateEv @ 1118 NONAME
- _ZNK21QNetworkCacheMetaData3urlEv @ 1119 NONAME
- _ZNK21QNetworkCacheMetaData7isValidEv @ 1120 NONAME
- _ZNK21QNetworkCacheMetaDataeqERKS_ @ 1121 NONAME
- _ZNK22QHttpNetworkConnection10cacheProxyEv @ 1122 NONAME
- _ZNK22QHttpNetworkConnection10metaObjectEv @ 1123 NONAME
- _ZNK22QHttpNetworkConnection11isEncryptedEv @ 1124 NONAME
- _ZNK22QHttpNetworkConnection16transparentProxyEv @ 1125 NONAME
- _ZNK22QHttpNetworkConnection4portEv @ 1126 NONAME
- _ZNK22QHttpNetworkConnection8hostNameEv @ 1127 NONAME
- _ZNK4QFtp10metaObjectEv @ 1128 NONAME
- _ZNK4QFtp11errorStringEv @ 1129 NONAME
- _ZNK4QFtp13currentDeviceEv @ 1130 NONAME
- _ZNK4QFtp14bytesAvailableEv @ 1131 NONAME
- _ZNK4QFtp14currentCommandEv @ 1132 NONAME
- _ZNK4QFtp18hasPendingCommandsEv @ 1133 NONAME
- _ZNK4QFtp5errorEv @ 1134 NONAME
- _ZNK4QFtp5stateEv @ 1135 NONAME
- _ZNK4QFtp9currentIdEv @ 1136 NONAME
- _ZNK5QHttp10metaObjectEv @ 1137 NONAME
- _ZNK5QHttp11errorStringEv @ 1138 NONAME
- _ZNK5QHttp12lastResponseEv @ 1139 NONAME
- _ZNK5QHttp14bytesAvailableEv @ 1140 NONAME
- _ZNK5QHttp14currentRequestEv @ 1141 NONAME
- _ZNK5QHttp18hasPendingRequestsEv @ 1142 NONAME
- _ZNK5QHttp19currentSourceDeviceEv @ 1143 NONAME
- _ZNK5QHttp24currentDestinationDeviceEv @ 1144 NONAME
- _ZNK5QHttp5errorEv @ 1145 NONAME
- _ZNK5QHttp5stateEv @ 1146 NONAME
- _ZNK5QHttp9currentIdEv @ 1147 NONAME
- _ZNK7QSslKey4typeEv @ 1148 NONAME
- _ZNK7QSslKey5toDerERK10QByteArray @ 1149 NONAME
- _ZNK7QSslKey5toPemERK10QByteArray @ 1150 NONAME
- _ZNK7QSslKey6handleEv @ 1151 NONAME
- _ZNK7QSslKey6isNullEv @ 1152 NONAME
- _ZNK7QSslKey6lengthEv @ 1153 NONAME
- _ZNK7QSslKey9algorithmEv @ 1154 NONAME
- _ZNK7QSslKeyeqERKS_ @ 1155 NONAME
- _ZNK8QUrlInfo10isReadableEv @ 1156 NONAME
- _ZNK8QUrlInfo10isWritableEv @ 1157 NONAME
- _ZNK8QUrlInfo11permissionsEv @ 1158 NONAME
- _ZNK8QUrlInfo12isExecutableEv @ 1159 NONAME
- _ZNK8QUrlInfo12lastModifiedEv @ 1160 NONAME
- _ZNK8QUrlInfo4nameEv @ 1161 NONAME
- _ZNK8QUrlInfo4sizeEv @ 1162 NONAME
- _ZNK8QUrlInfo5groupEv @ 1163 NONAME
- _ZNK8QUrlInfo5isDirEv @ 1164 NONAME
- _ZNK8QUrlInfo5ownerEv @ 1165 NONAME
- _ZNK8QUrlInfo6isFileEv @ 1166 NONAME
- _ZNK8QUrlInfo7isValidEv @ 1167 NONAME
- _ZNK8QUrlInfo8lastReadEv @ 1168 NONAME
- _ZNK8QUrlInfo9isSymLinkEv @ 1169 NONAME
- _ZNK8QUrlInfoeqERKS_ @ 1170 NONAME
- _ZNK9QHostInfo11errorStringEv @ 1171 NONAME
- _ZNK9QHostInfo5errorEv @ 1172 NONAME
- _ZNK9QHostInfo8hostNameEv @ 1173 NONAME
- _ZNK9QHostInfo8lookupIdEv @ 1174 NONAME
- _ZNK9QHostInfo9addressesEv @ 1175 NONAME
- _ZNK9QSslError11certificateEv @ 1176 NONAME
- _ZNK9QSslError11errorStringEv @ 1177 NONAME
- _ZNK9QSslError5errorEv @ 1178 NONAME
- _ZNK9QSslErroreqERKS_ @ 1179 NONAME
- _ZTI10QSslSocket @ 1180 NONAME
- _ZTI10QTcpServer @ 1181 NONAME
- _ZTI10QTcpSocket @ 1182 NONAME
- _ZTI10QUdpSocket @ 1183 NONAME
- _ZTI11QHttpHeader @ 1184 NONAME
- _ZTI12QHttpRequest @ 1185 NONAME ABSENT
- _ZTI12QLocalServer @ 1186 NONAME
- _ZTI12QLocalSocket @ 1187 NONAME
- _ZTI13QNetworkReply @ 1188 NONAME
- _ZTI13QReadNotifier @ 1189 NONAME ABSENT
- _ZTI14QHostInfoAgent @ 1190 NONAME ABSENT
- _ZTI14QWriteNotifier @ 1191 NONAME ABSENT
- _ZTI15QAbstractSocket @ 1192 NONAME
- _ZTI15QHostInfoResult @ 1193 NONAME ABSENT
- _ZTI15QHttpPGHRequest @ 1194 NONAME ABSENT
- _ZTI16QSocks5BindStore @ 1195 NONAME ABSENT
- _ZTI17QHttpCloseRequest @ 1196 NONAME ABSENT
- _ZTI17QHttpNetworkReply @ 1197 NONAME
- _ZTI17QHttpSocketEngine @ 1198 NONAME
- _ZTI17QNetworkCookieJar @ 1199 NONAME
- _ZTI17QNetworkDiskCache @ 1200 NONAME
- _ZTI17QNetworkReplyImpl @ 1201 NONAME ABSENT
- _ZTI17QSslSocketPrivate @ 1202 NONAME ABSENT
- _ZTI17QTcpServerPrivate @ 1203 NONAME ABSENT
- _ZTI18QExceptionNotifier @ 1204 NONAME ABSENT
- _ZTI18QHttpNetworkHeader @ 1205 NONAME
- _ZTI18QHttpNormalRequest @ 1206 NONAME ABSENT
- _ZTI18QHttpRequestHeader @ 1207 NONAME
- _ZTI19QHttpNetworkRequest @ 1208 NONAME
- _ZTI19QHttpResponseHeader @ 1209 NONAME
- _ZTI19QHttpSetHostRequest @ 1210 NONAME ABSENT
- _ZTI19QHttpSetUserRequest @ 1211 NONAME ABSENT
- _ZTI19QNativeSocketEngine @ 1212 NONAME
- _ZTI19QNetworkAccessCache @ 1213 NONAME ABSENT
- _ZTI19QSocks5SocketEngine @ 1214 NONAME
- _ZTI20QNetworkProxyFactory @ 1215 NONAME
- _ZTI20QSocketEngineHandler @ 1216 NONAME
- _ZTI20QSocks5Authenticator @ 1217 NONAME ABSENT
- _ZTI21QAbstractNetworkCache @ 1218 NONAME
- _ZTI21QAbstractSocketEngine @ 1219 NONAME
- _ZTI21QHttpSetSocketRequest @ 1220 NONAME ABSENT
- _ZTI21QNetworkAccessBackend @ 1221 NONAME ABSENT
- _ZTI21QNetworkAccessManager @ 1222 NONAME
- _ZTI22QAbstractSocketPrivate @ 1223 NONAME ABSENT
- _ZTI22QHttpNetworkConnection @ 1224 NONAME
- _ZTI24QHttpNetworkReplyPrivate @ 1225 NONAME ABSENT
- _ZTI24QHttpSocketEngineHandler @ 1226 NONAME
- _ZTI24QHttpSocketEnginePrivate @ 1227 NONAME ABSENT
- _ZTI24QNetworkAccessFtpBackend @ 1228 NONAME ABSENT
- _ZTI24QSslSocketBackendPrivate @ 1229 NONAME ABSENT
- _ZTI25QNetworkAccessDataBackend @ 1230 NONAME ABSENT
- _ZTI25QNetworkAccessFileBackend @ 1231 NONAME ABSENT
- _ZTI25QNetworkAccessHttpBackend @ 1232 NONAME ABSENT
- _ZTI26QNativeSocketEnginePrivate @ 1233 NONAME ABSENT
- _ZTI26QNetworkAccessCacheBackend @ 1234 NONAME ABSENT
- _ZTI26QSocks5SocketEngineHandler @ 1235 NONAME
- _ZTI26QSocks5SocketEnginePrivate @ 1236 NONAME ABSENT
- _ZTI28QNetworkAccessBackendFactory @ 1237 NONAME ABSENT
- _ZTI28QSocks5PasswordAuthenticator @ 1238 NONAME ABSENT
- _ZTI29QHttpNetworkConnectionPrivate @ 1239 NONAME ABSENT
- _ZTI30QNetworkAccessDebugPipeBackend @ 1240 NONAME ABSENT
- _ZTI31QNetworkAccessFtpBackendFactory @ 1241 NONAME ABSENT
- _ZTI32QNetworkAccessDataBackendFactory @ 1242 NONAME ABSENT
- _ZTI32QNetworkAccessFileBackendFactory @ 1243 NONAME ABSENT
- _ZTI32QNetworkAccessHttpBackendFactory @ 1244 NONAME ABSENT
- _ZTI37QNetworkAccessDebugPipeBackendFactory @ 1245 NONAME ABSENT
- _ZTI4QFtp @ 1246 NONAME
- _ZTI5QHttp @ 1247 NONAME
- _ZTI6QFtpPI @ 1248 NONAME ABSENT
- _ZTI7QFtpDTP @ 1249 NONAME ABSENT
- _ZTI8QUrlInfo @ 1250 NONAME
- _ZTIN19QNetworkAccessCache15CacheableObjectE @ 1251 NONAME ABSENT
- _ZTV10QSslSocket @ 1252 NONAME
- _ZTV10QTcpServer @ 1253 NONAME
- _ZTV10QTcpSocket @ 1254 NONAME
- _ZTV10QUdpSocket @ 1255 NONAME
- _ZTV11QHttpHeader @ 1256 NONAME
- _ZTV12QHttpRequest @ 1257 NONAME ABSENT
- _ZTV12QLocalServer @ 1258 NONAME
- _ZTV12QLocalSocket @ 1259 NONAME
- _ZTV13QNetworkReply @ 1260 NONAME
- _ZTV13QReadNotifier @ 1261 NONAME ABSENT
- _ZTV14QHostInfoAgent @ 1262 NONAME ABSENT
- _ZTV14QWriteNotifier @ 1263 NONAME ABSENT
- _ZTV15QAbstractSocket @ 1264 NONAME
- _ZTV15QHostInfoResult @ 1265 NONAME ABSENT
- _ZTV15QHttpPGHRequest @ 1266 NONAME ABSENT
- _ZTV16QSocks5BindStore @ 1267 NONAME ABSENT
- _ZTV17QHttpCloseRequest @ 1268 NONAME ABSENT
- _ZTV17QHttpNetworkReply @ 1269 NONAME
- _ZTV17QHttpSocketEngine @ 1270 NONAME
- _ZTV17QNetworkCookieJar @ 1271 NONAME
- _ZTV17QNetworkDiskCache @ 1272 NONAME
- _ZTV17QNetworkReplyImpl @ 1273 NONAME ABSENT
- _ZTV17QSslSocketPrivate @ 1274 NONAME ABSENT
- _ZTV17QTcpServerPrivate @ 1275 NONAME ABSENT
- _ZTV18QExceptionNotifier @ 1276 NONAME ABSENT
- _ZTV18QHttpNormalRequest @ 1277 NONAME ABSENT
- _ZTV18QHttpRequestHeader @ 1278 NONAME
- _ZTV19QHttpNetworkRequest @ 1279 NONAME
- _ZTV19QHttpResponseHeader @ 1280 NONAME
- _ZTV19QHttpSetHostRequest @ 1281 NONAME ABSENT
- _ZTV19QHttpSetUserRequest @ 1282 NONAME ABSENT
- _ZTV19QNativeSocketEngine @ 1283 NONAME
- _ZTV19QNetworkAccessCache @ 1284 NONAME ABSENT
- _ZTV19QSocks5SocketEngine @ 1285 NONAME
- _ZTV20QNetworkProxyFactory @ 1286 NONAME
- _ZTV20QSocketEngineHandler @ 1287 NONAME
- _ZTV20QSocks5Authenticator @ 1288 NONAME ABSENT
- _ZTV21QAbstractNetworkCache @ 1289 NONAME
- _ZTV21QAbstractSocketEngine @ 1290 NONAME
- _ZTV21QHttpSetSocketRequest @ 1291 NONAME ABSENT
- _ZTV21QNetworkAccessBackend @ 1292 NONAME ABSENT
- _ZTV21QNetworkAccessManager @ 1293 NONAME
- _ZTV22QAbstractSocketPrivate @ 1294 NONAME ABSENT
- _ZTV22QHttpNetworkConnection @ 1295 NONAME
- _ZTV24QHttpNetworkReplyPrivate @ 1296 NONAME ABSENT
- _ZTV24QHttpSocketEngineHandler @ 1297 NONAME
- _ZTV24QHttpSocketEnginePrivate @ 1298 NONAME ABSENT
- _ZTV24QNetworkAccessFtpBackend @ 1299 NONAME ABSENT
- _ZTV24QSslSocketBackendPrivate @ 1300 NONAME ABSENT
- _ZTV25QNetworkAccessDataBackend @ 1301 NONAME ABSENT
- _ZTV25QNetworkAccessFileBackend @ 1302 NONAME ABSENT
- _ZTV25QNetworkAccessHttpBackend @ 1303 NONAME ABSENT
- _ZTV26QNativeSocketEnginePrivate @ 1304 NONAME ABSENT
- _ZTV26QNetworkAccessCacheBackend @ 1305 NONAME ABSENT
- _ZTV26QSocks5SocketEngineHandler @ 1306 NONAME
- _ZTV26QSocks5SocketEnginePrivate @ 1307 NONAME ABSENT
- _ZTV28QNetworkAccessBackendFactory @ 1308 NONAME ABSENT
- _ZTV28QSocks5PasswordAuthenticator @ 1309 NONAME ABSENT
- _ZTV29QHttpNetworkConnectionPrivate @ 1310 NONAME ABSENT
- _ZTV30QNetworkAccessDebugPipeBackend @ 1311 NONAME ABSENT
- _ZTV31QNetworkAccessFtpBackendFactory @ 1312 NONAME ABSENT
- _ZTV32QNetworkAccessDataBackendFactory @ 1313 NONAME ABSENT
- _ZTV32QNetworkAccessFileBackendFactory @ 1314 NONAME ABSENT
- _ZTV32QNetworkAccessHttpBackendFactory @ 1315 NONAME ABSENT
- _ZTV37QNetworkAccessDebugPipeBackendFactory @ 1316 NONAME ABSENT
- _ZTV4QFtp @ 1317 NONAME
- _ZTV5QHttp @ 1318 NONAME
- _ZTV6QFtpPI @ 1319 NONAME ABSENT
- _ZTV7QFtpDTP @ 1320 NONAME ABSENT
- _ZTV8QUrlInfo @ 1321 NONAME
- _ZTVN19QNetworkAccessCache15CacheableObjectE @ 1322 NONAME ABSENT
- _ZThn8_N17QHttpNetworkReply14setHeaderFieldERK10QByteArrayS2_ @ 1323 NONAME
- _ZThn8_N17QHttpNetworkReply16setContentLengthEx @ 1324 NONAME
- _ZThn8_N17QHttpNetworkReply6setUrlERK4QUrl @ 1325 NONAME
- _ZThn8_N17QHttpNetworkReplyD0Ev @ 1326 NONAME
- _ZThn8_N17QHttpNetworkReplyD1Ev @ 1327 NONAME
- _ZThn8_NK17QHttpNetworkReply11headerFieldERK10QByteArrayS2_ @ 1328 NONAME
- _ZThn8_NK17QHttpNetworkReply12majorVersionEv @ 1329 NONAME
- _ZThn8_NK17QHttpNetworkReply12minorVersionEv @ 1330 NONAME
- _ZThn8_NK17QHttpNetworkReply13contentLengthEv @ 1331 NONAME
- _ZThn8_NK17QHttpNetworkReply3urlEv @ 1332 NONAME
- _ZThn8_NK17QHttpNetworkReply6headerEv @ 1333 NONAME
- _Zls6QDebugN12QLocalSocket16LocalSocketErrorE @ 1334 NONAME
- _Zls6QDebugN12QLocalSocket16LocalSocketStateE @ 1335 NONAME
- _Zls6QDebugN15QAbstractSocket11SocketErrorE @ 1336 NONAME
- _Zls6QDebugN15QAbstractSocket11SocketStateE @ 1337 NONAME
- _Zls6QDebugN15QSslCertificate11SubjectInfoE @ 1338 NONAME
- _Zls6QDebugRK10QSslCipher @ 1339 NONAME
- _Zls6QDebugRK12QHostAddress @ 1340 NONAME
- _Zls6QDebugRK14QNetworkCookie @ 1341 NONAME
- _Zls6QDebugRK15QSslCertificate @ 1342 NONAME
- _Zls6QDebugRK17QNetworkInterface @ 1343 NONAME
- _Zls6QDebugRK7QSslKey @ 1344 NONAME
- _Zls6QDebugRK9QSslError @ 1345 NONAME
- _Zls6QDebugRKN9QSslError8SslErrorE @ 1346 NONAME
- _ZlsR11QDataStreamRK12QHostAddress @ 1347 NONAME
- _ZlsR11QDataStreamRK21QNetworkCacheMetaData @ 1348 NONAME
- _ZrsR11QDataStreamR12QHostAddress @ 1349 NONAME
- _ZrsR11QDataStreamR21QNetworkCacheMetaData @ 1350 NONAME
- _ZN10QSslSocket15ignoreSslErrorsERK5QListI9QSslErrorE @ 1351 NONAME
- _ZN10QSslSocket22connectToHostEncryptedERK7QStringtS2_6QFlagsIN9QIODevice12OpenModeFlagEE @ 1352 NONAME
- _ZN13QNetworkReply15ignoreSslErrorsERK5QListI9QSslErrorE @ 1353 NONAME
- _ZN15QAbstractSocket12socketOptionENS_12SocketOptionE @ 1354 NONAME
- _ZN15QAbstractSocket15setSocketOptionENS_12SocketOptionERK8QVariant @ 1355 NONAME
- _ZN17QHttpNetworkReply15ignoreSslErrorsERK5QListI9QSslErrorE @ 1356 NONAME
- _ZN17QHttpNetworkReply16dataSendProgressExx @ 1357 NONAME
- _ZN17QHttpNetworkReply7readAnyEv @ 1358 NONAME
- _ZN19QHttpNetworkRequest19setUploadByteDeviceEP24QNonContiguousByteDevice @ 1359 NONAME
- _ZN21QNetworkAccessManager14deleteResourceERK15QNetworkRequest @ 1360 NONAME
- _ZN22QHttpNetworkConnection15ignoreSslErrorsERK5QListI9QSslErrorEi @ 1361 NONAME
- _ZNK13QNetworkReply10isFinishedEv @ 1362 NONAME
- _ZNK13QNetworkReply9isRunningEv @ 1363 NONAME
- _ZNK17QHttpNetworkReply23bytesAvailableNextBlockEv @ 1364 NONAME
- _ZNK19QHttpNetworkRequest16uploadByteDeviceEv @ 1365 NONAME
- _ZN10QSslSocket19getStaticMetaObjectEv @ 1366 NONAME
- _ZN10QTcpServer19getStaticMetaObjectEv @ 1367 NONAME
- _ZN10QTcpSocket19getStaticMetaObjectEv @ 1368 NONAME
- _ZN10QUdpSocket19getStaticMetaObjectEv @ 1369 NONAME
- _ZN12QLocalServer19getStaticMetaObjectEv @ 1370 NONAME
- _ZN12QLocalSocket19getStaticMetaObjectEv @ 1371 NONAME
- _ZN13QNetworkReply19getStaticMetaObjectEv @ 1372 NONAME
- _ZN15QAbstractSocket19getStaticMetaObjectEv @ 1373 NONAME
- _ZN17QHttpNetworkReply19getStaticMetaObjectEv @ 1374 NONAME
- _ZN17QHttpSocketEngine19getStaticMetaObjectEv @ 1375 NONAME
- _ZN17QNetworkCookieJar19getStaticMetaObjectEv @ 1376 NONAME
- _ZN17QNetworkDiskCache19getStaticMetaObjectEv @ 1377 NONAME
- _ZN19QHttpNetworkRequest20setPipeliningAllowedEb @ 1378 NONAME
- _ZN19QNativeSocketEngine19getStaticMetaObjectEv @ 1379 NONAME
- _ZN19QSocks5SocketEngine19getStaticMetaObjectEv @ 1380 NONAME
- _ZN20QNetworkProxyFactory25setUseSystemConfigurationEb @ 1381 NONAME
- _ZN21QAbstractNetworkCache19getStaticMetaObjectEv @ 1382 NONAME
- _ZN21QAbstractSocketEngine19getStaticMetaObjectEv @ 1383 NONAME
- _ZN21QNetworkAccessManager19getStaticMetaObjectEv @ 1384 NONAME
- _ZN22QHttpNetworkConnection19getStaticMetaObjectEv @ 1385 NONAME
- _ZN22QHttpNetworkConnectionC1EtRK7QStringtbP7QObject @ 1386 NONAME
- _ZN22QHttpNetworkConnectionC2EtRK7QStringtbP7QObject @ 1387 NONAME
- _ZN4QFtp19getStaticMetaObjectEv @ 1388 NONAME
- _ZN5QHttp19getStaticMetaObjectEv @ 1389 NONAME
- _ZNK17QHttpNetworkReply16isPipeliningUsedEv @ 1390 NONAME
- _ZNK19QHttpNetworkRequest19isPipeliningAllowedEv @ 1391 NONAME
- _ZTI24QNetworkReplyImplPrivate @ 1392 NONAME ABSENT; #<TI>#
- _ZTI29QHttpNetworkConnectionChannel @ 1393 NONAME ABSENT; #<TI>#
- _ZTV24QNetworkReplyImplPrivate @ 1394 NONAME ABSENT; #<VT>#
- _ZTV29QHttpNetworkConnectionChannel @ 1395 NONAME ABSENT; #<VT>#
-
+ _ZN10QSslSocket15ignoreSslErrorsERK5QListI9QSslErrorE @ 21 NONAME
+ _ZN10QSslSocket15ignoreSslErrorsEv @ 22 NONAME
+ _ZN10QSslSocket15peerVerifyErrorERK9QSslError @ 23 NONAME
+ _ZN10QSslSocket16addCaCertificateERK15QSslCertificate @ 24 NONAME
+ _ZN10QSslSocket16staticMetaObjectE @ 25 NONAME DATA 16
+ _ZN10QSslSocket16supportedCiphersEv @ 26 NONAME
+ _ZN10QSslSocket16waitForConnectedEi @ 27 NONAME
+ _ZN10QSslSocket16waitForEncryptedEi @ 28 NONAME
+ _ZN10QSslSocket16waitForReadyReadEi @ 29 NONAME
+ _ZN10QSslSocket17addCaCertificatesERK5QListI15QSslCertificateE @ 30 NONAME
+ _ZN10QSslSocket17addCaCertificatesERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 31 NONAME
+ _ZN10QSslSocket17setCaCertificatesERK5QListI15QSslCertificateE @ 32 NONAME
+ _ZN10QSslSocket17setDefaultCiphersERK5QListI10QSslCipherE @ 33 NONAME
+ _ZN10QSslSocket17setPeerVerifyModeENS_14PeerVerifyModeE @ 34 NONAME
+ _ZN10QSslSocket17setReadBufferSizeEx @ 35 NONAME
+ _ZN10QSslSocket18setPeerVerifyDepthEi @ 36 NONAME
+ _ZN10QSslSocket19getStaticMetaObjectEv @ 37 NONAME
+ _ZN10QSslSocket19setLocalCertificateERK15QSslCertificate @ 38 NONAME
+ _ZN10QSslSocket19setLocalCertificateERK7QStringN4QSsl14EncodingFormatE @ 39 NONAME
+ _ZN10QSslSocket19setSocketDescriptorEiN15QAbstractSocket11SocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 40 NONAME
+ _ZN10QSslSocket19setSslConfigurationERK17QSslConfiguration @ 41 NONAME
+ _ZN10QSslSocket19waitForBytesWrittenEi @ 42 NONAME
+ _ZN10QSslSocket19waitForDisconnectedEi @ 43 NONAME
+ _ZN10QSslSocket20systemCaCertificatesEv @ 44 NONAME
+ _ZN10QSslSocket21defaultCaCertificatesEv @ 45 NONAME
+ _ZN10QSslSocket21encryptedBytesWrittenEx @ 46 NONAME
+ _ZN10QSslSocket21startClientEncryptionEv @ 47 NONAME
+ _ZN10QSslSocket21startServerEncryptionEv @ 48 NONAME
+ _ZN10QSslSocket22connectToHostEncryptedERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 49 NONAME
+ _ZN10QSslSocket22connectToHostEncryptedERK7QStringtS2_6QFlagsIN9QIODevice12OpenModeFlagEE @ 50 NONAME
+ _ZN10QSslSocket23addDefaultCaCertificateERK15QSslCertificate @ 51 NONAME
+ _ZN10QSslSocket24addDefaultCaCertificatesERK5QListI15QSslCertificateE @ 52 NONAME
+ _ZN10QSslSocket24addDefaultCaCertificatesERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 53 NONAME
+ _ZN10QSslSocket24setDefaultCaCertificatesERK5QListI15QSslCertificateE @ 54 NONAME
+ _ZN10QSslSocket27connectToHostImplementationERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 55 NONAME
+ _ZN10QSslSocket32disconnectFromHostImplementationEv @ 56 NONAME
+ _ZN10QSslSocket5abortEv @ 57 NONAME
+ _ZN10QSslSocket5closeEv @ 58 NONAME
+ _ZN10QSslSocket5flushEv @ 59 NONAME
+ _ZN10QSslSocket8readDataEPcx @ 60 NONAME
+ _ZN10QSslSocket9encryptedEv @ 61 NONAME
+ _ZN10QSslSocket9sslErrorsERK5QListI9QSslErrorE @ 62 NONAME
+ _ZN10QSslSocket9writeDataEPKcx @ 63 NONAME
+ _ZN10QSslSocketC1EP7QObject @ 64 NONAME
+ _ZN10QSslSocketC2EP7QObject @ 65 NONAME
+ _ZN10QSslSocketD0Ev @ 66 NONAME
+ _ZN10QSslSocketD1Ev @ 67 NONAME
+ _ZN10QSslSocketD2Ev @ 68 NONAME
+ _ZN10QTcpServer11qt_metacallEN11QMetaObject4CallEiPPv @ 69 NONAME
+ _ZN10QTcpServer11qt_metacastEPKc @ 70 NONAME
+ _ZN10QTcpServer13newConnectionEv @ 71 NONAME
+ _ZN10QTcpServer16staticMetaObjectE @ 72 NONAME DATA 16
+ _ZN10QTcpServer18incomingConnectionEi @ 73 NONAME
+ _ZN10QTcpServer19getStaticMetaObjectEv @ 74 NONAME
+ _ZN10QTcpServer19setSocketDescriptorEi @ 75 NONAME
+ _ZN10QTcpServer20waitForNewConnectionEiPb @ 76 NONAME
+ _ZN10QTcpServer21nextPendingConnectionEv @ 77 NONAME
+ _ZN10QTcpServer24setMaxPendingConnectionsEi @ 78 NONAME
+ _ZN10QTcpServer5closeEv @ 79 NONAME
+ _ZN10QTcpServer6listenERK12QHostAddresst @ 80 NONAME
+ _ZN10QTcpServer8setProxyERK13QNetworkProxy @ 81 NONAME
+ _ZN10QTcpServerC1EP7QObject @ 82 NONAME
+ _ZN10QTcpServerC2EP7QObject @ 83 NONAME
+ _ZN10QTcpServerD0Ev @ 84 NONAME
+ _ZN10QTcpServerD1Ev @ 85 NONAME
+ _ZN10QTcpServerD2Ev @ 86 NONAME
+ _ZN10QTcpSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 87 NONAME
+ _ZN10QTcpSocket11qt_metacastEPKc @ 88 NONAME
+ _ZN10QTcpSocket16staticMetaObjectE @ 89 NONAME DATA 16
+ _ZN10QTcpSocket19getStaticMetaObjectEv @ 90 NONAME
+ _ZN10QTcpSocketC1EP7QObject @ 91 NONAME
+ _ZN10QTcpSocketC1ER17QTcpSocketPrivateP7QObject @ 92 NONAME
+ _ZN10QTcpSocketC2EP7QObject @ 93 NONAME
+ _ZN10QTcpSocketC2ER17QTcpSocketPrivateP7QObject @ 94 NONAME
+ _ZN10QTcpSocketD0Ev @ 95 NONAME
+ _ZN10QTcpSocketD1Ev @ 96 NONAME
+ _ZN10QTcpSocketD2Ev @ 97 NONAME
+ _ZN10QUdpSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 98 NONAME
+ _ZN10QUdpSocket11qt_metacastEPKc @ 99 NONAME
+ _ZN10QUdpSocket12readDatagramEPcxP12QHostAddressPt @ 100 NONAME
+ _ZN10QUdpSocket13writeDatagramEPKcxRK12QHostAddresst @ 101 NONAME
+ _ZN10QUdpSocket16staticMetaObjectE @ 102 NONAME DATA 16
+ _ZN10QUdpSocket19getStaticMetaObjectEv @ 103 NONAME
+ _ZN10QUdpSocket4bindERK12QHostAddresst @ 104 NONAME
+ _ZN10QUdpSocket4bindERK12QHostAddresst6QFlagsINS_8BindFlagEE @ 105 NONAME
+ _ZN10QUdpSocket4bindEt @ 106 NONAME
+ _ZN10QUdpSocket4bindEt6QFlagsINS_8BindFlagEE @ 107 NONAME
+ _ZN10QUdpSocketC1EP7QObject @ 108 NONAME
+ _ZN10QUdpSocketC2EP7QObject @ 109 NONAME
+ _ZN10QUdpSocketD0Ev @ 110 NONAME
+ _ZN10QUdpSocketD1Ev @ 111 NONAME
+ _ZN10QUdpSocketD2Ev @ 112 NONAME
+ _ZN11QHttpHeader11removeValueERK7QString @ 113 NONAME
+ _ZN11QHttpHeader14setContentTypeERK7QString @ 114 NONAME
+ _ZN11QHttpHeader15removeAllValuesERK7QString @ 115 NONAME
+ _ZN11QHttpHeader16setContentLengthEi @ 116 NONAME
+ _ZN11QHttpHeader5parseERK7QString @ 117 NONAME
+ _ZN11QHttpHeader8addValueERK7QStringS2_ @ 118 NONAME
+ _ZN11QHttpHeader8setValidEb @ 119 NONAME
+ _ZN11QHttpHeader8setValueERK7QStringS2_ @ 120 NONAME
+ _ZN11QHttpHeader9parseLineERK7QStringi @ 121 NONAME
+ _ZN11QHttpHeader9setValuesERK5QListI5QPairI7QStringS2_EE @ 122 NONAME
+ _ZN11QHttpHeaderC2ER18QHttpHeaderPrivateRK7QString @ 123 NONAME
+ _ZN11QHttpHeaderC2ER18QHttpHeaderPrivateRKS_ @ 124 NONAME
+ _ZN11QHttpHeaderC2ERK7QString @ 125 NONAME
+ _ZN11QHttpHeaderC2ERKS_ @ 126 NONAME
+ _ZN11QHttpHeaderC2Ev @ 127 NONAME
+ _ZN11QHttpHeaderD0Ev @ 128 NONAME
+ _ZN11QHttpHeaderD1Ev @ 129 NONAME
+ _ZN11QHttpHeaderD2Ev @ 130 NONAME
+ _ZN11QHttpHeaderaSERKS_ @ 131 NONAME
+ _ZN12QHostAddress10setAddressEPK8sockaddr @ 132 NONAME
+ _ZN12QHostAddress10setAddressEPh @ 133 NONAME
+ _ZN12QHostAddress10setAddressERK12QIPv6Address @ 134 NONAME
+ _ZN12QHostAddress10setAddressERK7QString @ 135 NONAME
+ _ZN12QHostAddress10setAddressEj @ 136 NONAME
+ _ZN12QHostAddress10setScopeIdERK7QString @ 137 NONAME
+ _ZN12QHostAddress11parseSubnetERK7QString @ 138 NONAME
+ _ZN12QHostAddress5clearEv @ 139 NONAME
+ _ZN12QHostAddressC1ENS_14SpecialAddressE @ 140 NONAME
+ _ZN12QHostAddressC1EPK8sockaddr @ 141 NONAME
+ _ZN12QHostAddressC1EPh @ 142 NONAME
+ _ZN12QHostAddressC1ERK12QIPv6Address @ 143 NONAME
+ _ZN12QHostAddressC1ERK7QString @ 144 NONAME
+ _ZN12QHostAddressC1ERKS_ @ 145 NONAME
+ _ZN12QHostAddressC1Ej @ 146 NONAME
+ _ZN12QHostAddressC1Ev @ 147 NONAME
+ _ZN12QHostAddressC2ENS_14SpecialAddressE @ 148 NONAME
+ _ZN12QHostAddressC2EPK8sockaddr @ 149 NONAME
+ _ZN12QHostAddressC2EPh @ 150 NONAME
+ _ZN12QHostAddressC2ERK12QIPv6Address @ 151 NONAME
+ _ZN12QHostAddressC2ERK7QString @ 152 NONAME
+ _ZN12QHostAddressC2ERKS_ @ 153 NONAME
+ _ZN12QHostAddressC2Ej @ 154 NONAME
+ _ZN12QHostAddressC2Ev @ 155 NONAME
+ _ZN12QHostAddressD1Ev @ 156 NONAME
+ _ZN12QHostAddressD2Ev @ 157 NONAME
+ _ZN12QHostAddressaSERK7QString @ 158 NONAME
+ _ZN12QHostAddressaSERKS_ @ 159 NONAME
+ _ZN12QLocalServer11qt_metacallEN11QMetaObject4CallEiPPv @ 160 NONAME
+ _ZN12QLocalServer11qt_metacastEPKc @ 161 NONAME
+ _ZN12QLocalServer12removeServerERK7QString @ 162 NONAME
+ _ZN12QLocalServer13newConnectionEv @ 163 NONAME
+ _ZN12QLocalServer16staticMetaObjectE @ 164 NONAME DATA 16
+ _ZN12QLocalServer18incomingConnectionEj @ 165 NONAME
+ _ZN12QLocalServer19getStaticMetaObjectEv @ 166 NONAME
+ _ZN12QLocalServer20waitForNewConnectionEiPb @ 167 NONAME
+ _ZN12QLocalServer21nextPendingConnectionEv @ 168 NONAME
+ _ZN12QLocalServer24setMaxPendingConnectionsEi @ 169 NONAME
+ _ZN12QLocalServer5closeEv @ 170 NONAME
+ _ZN12QLocalServer6listenERK7QString @ 171 NONAME
+ _ZN12QLocalServerC1EP7QObject @ 172 NONAME
+ _ZN12QLocalServerC2EP7QObject @ 173 NONAME
+ _ZN12QLocalServerD0Ev @ 174 NONAME
+ _ZN12QLocalServerD1Ev @ 175 NONAME
+ _ZN12QLocalServerD2Ev @ 176 NONAME
+ _ZN12QLocalSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 177 NONAME
+ _ZN12QLocalSocket11qt_metacastEPKc @ 178 NONAME
+ _ZN12QLocalSocket12disconnectedEv @ 179 NONAME
+ _ZN12QLocalSocket12stateChangedENS_16LocalSocketStateE @ 180 NONAME
+ _ZN12QLocalSocket15connectToServerERK7QString6QFlagsIN9QIODevice12OpenModeFlagEE @ 181 NONAME
+ _ZN12QLocalSocket16staticMetaObjectE @ 182 NONAME DATA 16
+ _ZN12QLocalSocket16waitForConnectedEi @ 183 NONAME
+ _ZN12QLocalSocket16waitForReadyReadEi @ 184 NONAME
+ _ZN12QLocalSocket17setReadBufferSizeEx @ 185 NONAME
+ _ZN12QLocalSocket19getStaticMetaObjectEv @ 186 NONAME
+ _ZN12QLocalSocket19setSocketDescriptorEjNS_16LocalSocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 187 NONAME
+ _ZN12QLocalSocket19waitForBytesWrittenEi @ 188 NONAME
+ _ZN12QLocalSocket19waitForDisconnectedEi @ 189 NONAME
+ _ZN12QLocalSocket20disconnectFromServerEv @ 190 NONAME
+ _ZN12QLocalSocket5abortEv @ 191 NONAME
+ _ZN12QLocalSocket5closeEv @ 192 NONAME
+ _ZN12QLocalSocket5errorENS_16LocalSocketErrorE @ 193 NONAME
+ _ZN12QLocalSocket5flushEv @ 194 NONAME
+ _ZN12QLocalSocket8readDataEPcx @ 195 NONAME
+ _ZN12QLocalSocket9connectedEv @ 196 NONAME
+ _ZN12QLocalSocket9writeDataEPKcx @ 197 NONAME
+ _ZN12QLocalSocketC1EP7QObject @ 198 NONAME
+ _ZN12QLocalSocketC2EP7QObject @ 199 NONAME
+ _ZN12QLocalSocketD0Ev @ 200 NONAME
+ _ZN12QLocalSocketD1Ev @ 201 NONAME
+ _ZN12QLocalSocketD2Ev @ 202 NONAME
+ _ZN13QNetworkProxy11setHostNameERK7QString @ 203 NONAME
+ _ZN13QNetworkProxy11setPasswordERK7QString @ 204 NONAME
+ _ZN13QNetworkProxy15setCapabilitiesE6QFlagsINS_10CapabilityEE @ 205 NONAME
+ _ZN13QNetworkProxy16applicationProxyEv @ 206 NONAME
+ _ZN13QNetworkProxy19setApplicationProxyERKS_ @ 207 NONAME
+ _ZN13QNetworkProxy7setPortEt @ 208 NONAME
+ _ZN13QNetworkProxy7setTypeENS_9ProxyTypeE @ 209 NONAME
+ _ZN13QNetworkProxy7setUserERK7QString @ 210 NONAME
+ _ZN13QNetworkProxyC1ENS_9ProxyTypeERK7QStringtS3_S3_ @ 211 NONAME
+ _ZN13QNetworkProxyC1ERKS_ @ 212 NONAME
+ _ZN13QNetworkProxyC1Ev @ 213 NONAME
+ _ZN13QNetworkProxyC2ENS_9ProxyTypeERK7QStringtS3_S3_ @ 214 NONAME
+ _ZN13QNetworkProxyC2ERKS_ @ 215 NONAME
+ _ZN13QNetworkProxyC2Ev @ 216 NONAME
+ _ZN13QNetworkProxyD1Ev @ 217 NONAME
+ _ZN13QNetworkProxyD2Ev @ 218 NONAME
+ _ZN13QNetworkProxyaSERKS_ @ 219 NONAME
+ _ZN13QNetworkReply10setRequestERK15QNetworkRequest @ 220 NONAME
+ _ZN13QNetworkReply11qt_metacallEN11QMetaObject4CallEiPPv @ 221 NONAME
+ _ZN13QNetworkReply11qt_metacastEPKc @ 222 NONAME
+ _ZN13QNetworkReply12setAttributeEN15QNetworkRequest9AttributeERK8QVariant @ 223 NONAME
+ _ZN13QNetworkReply12setOperationEN21QNetworkAccessManager9OperationE @ 224 NONAME
+ _ZN13QNetworkReply12setRawHeaderERK10QByteArrayS2_ @ 225 NONAME
+ _ZN13QNetworkReply14uploadProgressExx @ 226 NONAME
+ _ZN13QNetworkReply15ignoreSslErrorsERK5QListI9QSslErrorE @ 227 NONAME
+ _ZN13QNetworkReply15ignoreSslErrorsEv @ 228 NONAME
+ _ZN13QNetworkReply15metaDataChangedEv @ 229 NONAME
+ _ZN13QNetworkReply16downloadProgressExx @ 230 NONAME
+ _ZN13QNetworkReply16staticMetaObjectE @ 231 NONAME DATA 16
+ _ZN13QNetworkReply17setReadBufferSizeEx @ 232 NONAME
+ _ZN13QNetworkReply19getStaticMetaObjectEv @ 233 NONAME
+ _ZN13QNetworkReply19setSslConfigurationERK17QSslConfiguration @ 234 NONAME
+ _ZN13QNetworkReply5closeEv @ 235 NONAME
+ _ZN13QNetworkReply5errorENS_12NetworkErrorE @ 236 NONAME
+ _ZN13QNetworkReply6setUrlERK4QUrl @ 237 NONAME
+ _ZN13QNetworkReply8finishedEv @ 238 NONAME
+ _ZN13QNetworkReply8setErrorENS_12NetworkErrorERK7QString @ 239 NONAME
+ _ZN13QNetworkReply9setHeaderEN15QNetworkRequest12KnownHeadersERK8QVariant @ 240 NONAME
+ _ZN13QNetworkReply9sslErrorsERK5QListI9QSslErrorE @ 241 NONAME
+ _ZN13QNetworkReply9writeDataEPKcx @ 242 NONAME
+ _ZN13QNetworkReplyC2EP7QObject @ 243 NONAME
+ _ZN13QNetworkReplyC2ER20QNetworkReplyPrivateP7QObject @ 244 NONAME
+ _ZN13QNetworkReplyD0Ev @ 245 NONAME
+ _ZN13QNetworkReplyD1Ev @ 246 NONAME
+ _ZN13QNetworkReplyD2Ev @ 247 NONAME
+ _ZN14QAuthenticator11setPasswordERK7QString @ 248 NONAME
+ _ZN14QAuthenticator6detachEv @ 249 NONAME
+ _ZN14QAuthenticator7setUserERK7QString @ 250 NONAME
+ _ZN14QAuthenticatorC1ERKS_ @ 251 NONAME
+ _ZN14QAuthenticatorC1Ev @ 252 NONAME
+ _ZN14QAuthenticatorC2ERKS_ @ 253 NONAME
+ _ZN14QAuthenticatorC2Ev @ 254 NONAME
+ _ZN14QAuthenticatorD1Ev @ 255 NONAME
+ _ZN14QAuthenticatorD2Ev @ 256 NONAME
+ _ZN14QAuthenticatoraSERKS_ @ 257 NONAME
+ _ZN14QNetworkCookie11setHttpOnlyEb @ 258 NONAME
+ _ZN14QNetworkCookie12parseCookiesERK10QByteArray @ 259 NONAME
+ _ZN14QNetworkCookie17setExpirationDateERK9QDateTime @ 260 NONAME
+ _ZN14QNetworkCookie7setNameERK10QByteArray @ 261 NONAME
+ _ZN14QNetworkCookie7setPathERK7QString @ 262 NONAME
+ _ZN14QNetworkCookie8setValueERK10QByteArray @ 263 NONAME
+ _ZN14QNetworkCookie9setDomainERK7QString @ 264 NONAME
+ _ZN14QNetworkCookie9setSecureEb @ 265 NONAME
+ _ZN14QNetworkCookieC1ERK10QByteArrayS2_ @ 266 NONAME
+ _ZN14QNetworkCookieC1ERKS_ @ 267 NONAME
+ _ZN14QNetworkCookieC2ERK10QByteArrayS2_ @ 268 NONAME
+ _ZN14QNetworkCookieC2ERKS_ @ 269 NONAME
+ _ZN14QNetworkCookieD1Ev @ 270 NONAME
+ _ZN14QNetworkCookieD2Ev @ 271 NONAME
+ _ZN14QNetworkCookieaSERKS_ @ 272 NONAME
+ _ZN15QAbstractSocket11qt_metacallEN11QMetaObject4CallEiPPv @ 273 NONAME
+ _ZN15QAbstractSocket11qt_metacastEPKc @ 274 NONAME
+ _ZN15QAbstractSocket11setPeerNameERK7QString @ 275 NONAME
+ _ZN15QAbstractSocket11setPeerPortEt @ 276 NONAME
+ _ZN15QAbstractSocket12disconnectedEv @ 277 NONAME
+ _ZN15QAbstractSocket12readLineDataEPcx @ 278 NONAME
+ _ZN15QAbstractSocket12setLocalPortEt @ 279 NONAME
+ _ZN15QAbstractSocket12socketOptionENS_12SocketOptionE @ 280 NONAME
+ _ZN15QAbstractSocket12stateChangedENS_11SocketStateE @ 281 NONAME
+ _ZN15QAbstractSocket13connectToHostERK12QHostAddresst6QFlagsIN9QIODevice12OpenModeFlagEE @ 282 NONAME
+ _ZN15QAbstractSocket13connectToHostERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 283 NONAME
+ _ZN15QAbstractSocket14setPeerAddressERK12QHostAddress @ 284 NONAME
+ _ZN15QAbstractSocket14setSocketErrorENS_11SocketErrorE @ 285 NONAME
+ _ZN15QAbstractSocket14setSocketStateENS_11SocketStateE @ 286 NONAME
+ _ZN15QAbstractSocket15setLocalAddressERK12QHostAddress @ 287 NONAME
+ _ZN15QAbstractSocket15setSocketOptionENS_12SocketOptionERK8QVariant @ 288 NONAME
+ _ZN15QAbstractSocket16staticMetaObjectE @ 289 NONAME DATA 16
+ _ZN15QAbstractSocket16waitForConnectedEi @ 290 NONAME
+ _ZN15QAbstractSocket16waitForReadyReadEi @ 291 NONAME
+ _ZN15QAbstractSocket17setReadBufferSizeEx @ 292 NONAME
+ _ZN15QAbstractSocket18disconnectFromHostEv @ 293 NONAME
+ _ZN15QAbstractSocket19getStaticMetaObjectEv @ 294 NONAME
+ _ZN15QAbstractSocket19setSocketDescriptorEiNS_11SocketStateE6QFlagsIN9QIODevice12OpenModeFlagEE @ 295 NONAME
+ _ZN15QAbstractSocket19waitForBytesWrittenEi @ 296 NONAME
+ _ZN15QAbstractSocket19waitForDisconnectedEi @ 297 NONAME
+ _ZN15QAbstractSocket27connectToHostImplementationERK7QStringt6QFlagsIN9QIODevice12OpenModeFlagEE @ 298 NONAME
+ _ZN15QAbstractSocket27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 299 NONAME
+ _ZN15QAbstractSocket32disconnectFromHostImplementationEv @ 300 NONAME
+ _ZN15QAbstractSocket5abortEv @ 301 NONAME
+ _ZN15QAbstractSocket5closeEv @ 302 NONAME
+ _ZN15QAbstractSocket5errorENS_11SocketErrorE @ 303 NONAME
+ _ZN15QAbstractSocket5flushEv @ 304 NONAME
+ _ZN15QAbstractSocket8readDataEPcx @ 305 NONAME
+ _ZN15QAbstractSocket8setProxyERK13QNetworkProxy @ 306 NONAME
+ _ZN15QAbstractSocket9connectedEv @ 307 NONAME
+ _ZN15QAbstractSocket9hostFoundEv @ 308 NONAME
+ _ZN15QAbstractSocket9writeDataEPKcx @ 309 NONAME
+ _ZN15QAbstractSocketC1ENS_10SocketTypeEP7QObject @ 310 NONAME
+ _ZN15QAbstractSocketC1ENS_10SocketTypeER22QAbstractSocketPrivateP7QObject @ 311 NONAME
+ _ZN15QAbstractSocketC2ENS_10SocketTypeEP7QObject @ 312 NONAME
+ _ZN15QAbstractSocketC2ENS_10SocketTypeER22QAbstractSocketPrivateP7QObject @ 313 NONAME
+ _ZN15QAbstractSocketD0Ev @ 314 NONAME
+ _ZN15QAbstractSocketD1Ev @ 315 NONAME
+ _ZN15QAbstractSocketD2Ev @ 316 NONAME
+ _ZN15QNetworkRequest12setAttributeENS_9AttributeERK8QVariant @ 317 NONAME
+ _ZN15QNetworkRequest12setRawHeaderERK10QByteArrayS2_ @ 318 NONAME
+ _ZN15QNetworkRequest19setSslConfigurationERK17QSslConfiguration @ 319 NONAME
+ _ZN15QNetworkRequest6setUrlERK4QUrl @ 320 NONAME
+ _ZN15QNetworkRequest9setHeaderENS_12KnownHeadersERK8QVariant @ 321 NONAME
+ _ZN15QNetworkRequestC1ERK4QUrl @ 322 NONAME
+ _ZN15QNetworkRequestC1ERKS_ @ 323 NONAME
+ _ZN15QNetworkRequestC2ERK4QUrl @ 324 NONAME
+ _ZN15QNetworkRequestC2ERKS_ @ 325 NONAME
+ _ZN15QNetworkRequestD1Ev @ 326 NONAME
+ _ZN15QNetworkRequestD2Ev @ 327 NONAME
+ _ZN15QNetworkRequestaSERKS_ @ 328 NONAME
+ _ZN15QSslCertificate10fromDeviceEP9QIODeviceN4QSsl14EncodingFormatE @ 329 NONAME
+ _ZN15QSslCertificate5clearEv @ 330 NONAME
+ _ZN15QSslCertificate8fromDataERK10QByteArrayN4QSsl14EncodingFormatE @ 331 NONAME
+ _ZN15QSslCertificate8fromPathERK7QStringN4QSsl14EncodingFormatEN7QRegExp13PatternSyntaxE @ 332 NONAME
+ _ZN15QSslCertificateC1EP9QIODeviceN4QSsl14EncodingFormatE @ 333 NONAME
+ _ZN15QSslCertificateC1ERK10QByteArrayN4QSsl14EncodingFormatE @ 334 NONAME
+ _ZN15QSslCertificateC1ERKS_ @ 335 NONAME
+ _ZN15QSslCertificateC2EP9QIODeviceN4QSsl14EncodingFormatE @ 336 NONAME
+ _ZN15QSslCertificateC2ERK10QByteArrayN4QSsl14EncodingFormatE @ 337 NONAME
+ _ZN15QSslCertificateC2ERKS_ @ 338 NONAME
+ _ZN15QSslCertificateD1Ev @ 339 NONAME
+ _ZN15QSslCertificateD2Ev @ 340 NONAME
+ _ZN15QSslCertificateaSERKS_ @ 341 NONAME
+ _ZN17QNetworkCookieJar11qt_metacallEN11QMetaObject4CallEiPPv @ 342 NONAME
+ _ZN17QNetworkCookieJar11qt_metacastEPKc @ 343 NONAME
+ _ZN17QNetworkCookieJar13setAllCookiesERK5QListI14QNetworkCookieE @ 344 NONAME
+ _ZN17QNetworkCookieJar16staticMetaObjectE @ 345 NONAME DATA 16
+ _ZN17QNetworkCookieJar17setCookiesFromUrlERK5QListI14QNetworkCookieERK4QUrl @ 346 NONAME
+ _ZN17QNetworkCookieJar19getStaticMetaObjectEv @ 347 NONAME
+ _ZN17QNetworkCookieJarC1EP7QObject @ 348 NONAME
+ _ZN17QNetworkCookieJarC2EP7QObject @ 349 NONAME
+ _ZN17QNetworkCookieJarD0Ev @ 350 NONAME
+ _ZN17QNetworkCookieJarD1Ev @ 351 NONAME
+ _ZN17QNetworkCookieJarD2Ev @ 352 NONAME
+ _ZN17QNetworkDiskCache11qt_metacallEN11QMetaObject4CallEiPPv @ 353 NONAME
+ _ZN17QNetworkDiskCache11qt_metacastEPKc @ 354 NONAME
+ _ZN17QNetworkDiskCache14updateMetaDataERK21QNetworkCacheMetaData @ 355 NONAME
+ _ZN17QNetworkDiskCache16staticMetaObjectE @ 356 NONAME DATA 16
+ _ZN17QNetworkDiskCache17setCacheDirectoryERK7QString @ 357 NONAME
+ _ZN17QNetworkDiskCache19getStaticMetaObjectEv @ 358 NONAME
+ _ZN17QNetworkDiskCache19setMaximumCacheSizeEx @ 359 NONAME
+ _ZN17QNetworkDiskCache4dataERK4QUrl @ 360 NONAME
+ _ZN17QNetworkDiskCache5clearEv @ 361 NONAME
+ _ZN17QNetworkDiskCache6expireEv @ 362 NONAME
+ _ZN17QNetworkDiskCache6insertEP9QIODevice @ 363 NONAME
+ _ZN17QNetworkDiskCache6removeERK4QUrl @ 364 NONAME
+ _ZN17QNetworkDiskCache7prepareERK21QNetworkCacheMetaData @ 365 NONAME
+ _ZN17QNetworkDiskCache8metaDataERK4QUrl @ 366 NONAME
+ _ZN17QNetworkDiskCacheC1EP7QObject @ 367 NONAME
+ _ZN17QNetworkDiskCacheC2EP7QObject @ 368 NONAME
+ _ZN17QNetworkDiskCacheD0Ev @ 369 NONAME
+ _ZN17QNetworkDiskCacheD1Ev @ 370 NONAME
+ _ZN17QNetworkDiskCacheD2Ev @ 371 NONAME
+ _ZN17QNetworkInterface12allAddressesEv @ 372 NONAME
+ _ZN17QNetworkInterface13allInterfacesEv @ 373 NONAME
+ _ZN17QNetworkInterface17interfaceFromNameERK7QString @ 374 NONAME
+ _ZN17QNetworkInterface18interfaceFromIndexEi @ 375 NONAME
+ _ZN17QNetworkInterfaceC1ERKS_ @ 376 NONAME
+ _ZN17QNetworkInterfaceC1Ev @ 377 NONAME
+ _ZN17QNetworkInterfaceC2ERKS_ @ 378 NONAME
+ _ZN17QNetworkInterfaceC2Ev @ 379 NONAME
+ _ZN17QNetworkInterfaceD1Ev @ 380 NONAME
+ _ZN17QNetworkInterfaceD2Ev @ 381 NONAME
+ _ZN17QNetworkInterfaceaSERKS_ @ 382 NONAME
+ _ZN17QSslConfiguration10setCiphersERK5QListI10QSslCipherE @ 383 NONAME
+ _ZN17QSslConfiguration11setProtocolEN4QSsl11SslProtocolE @ 384 NONAME
+ _ZN17QSslConfiguration13setPrivateKeyERK7QSslKey @ 385 NONAME
+ _ZN17QSslConfiguration17setCaCertificatesERK5QListI15QSslCertificateE @ 386 NONAME
+ _ZN17QSslConfiguration17setPeerVerifyModeEN10QSslSocket14PeerVerifyModeE @ 387 NONAME
+ _ZN17QSslConfiguration18setPeerVerifyDepthEi @ 388 NONAME
+ _ZN17QSslConfiguration19setLocalCertificateERK15QSslCertificate @ 389 NONAME
+ _ZN17QSslConfiguration20defaultConfigurationEv @ 390 NONAME
+ _ZN17QSslConfiguration23setDefaultConfigurationERKS_ @ 391 NONAME
+ _ZN17QSslConfigurationC1ERKS_ @ 392 NONAME
+ _ZN17QSslConfigurationC1Ev @ 393 NONAME
+ _ZN17QSslConfigurationC2ERKS_ @ 394 NONAME
+ _ZN17QSslConfigurationC2Ev @ 395 NONAME
+ _ZN17QSslConfigurationD1Ev @ 396 NONAME
+ _ZN17QSslConfigurationD2Ev @ 397 NONAME
+ _ZN17QSslConfigurationaSERKS_ @ 398 NONAME
+ _ZN18QHttpRequestHeader10setRequestERK7QStringS2_ii @ 399 NONAME
+ _ZN18QHttpRequestHeader9parseLineERK7QStringi @ 400 NONAME
+ _ZN18QHttpRequestHeaderC1ERK7QString @ 401 NONAME
+ _ZN18QHttpRequestHeaderC1ERK7QStringS2_ii @ 402 NONAME
+ _ZN18QHttpRequestHeaderC1ERKS_ @ 403 NONAME
+ _ZN18QHttpRequestHeaderC1Ev @ 404 NONAME
+ _ZN18QHttpRequestHeaderC2ERK7QString @ 405 NONAME
+ _ZN18QHttpRequestHeaderC2ERK7QStringS2_ii @ 406 NONAME
+ _ZN18QHttpRequestHeaderC2ERKS_ @ 407 NONAME
+ _ZN18QHttpRequestHeaderC2Ev @ 408 NONAME
+ _ZN18QHttpRequestHeaderaSERKS_ @ 409 NONAME
+ _ZN18QNetworkProxyQuery11setPeerPortEi @ 410 NONAME
+ _ZN18QNetworkProxyQuery12setLocalPortEi @ 411 NONAME
+ _ZN18QNetworkProxyQuery12setQueryTypeENS_9QueryTypeE @ 412 NONAME
+ _ZN18QNetworkProxyQuery14setProtocolTagERK7QString @ 413 NONAME
+ _ZN18QNetworkProxyQuery15setPeerHostNameERK7QString @ 414 NONAME
+ _ZN18QNetworkProxyQuery6setUrlERK4QUrl @ 415 NONAME
+ _ZN18QNetworkProxyQueryC1ERK4QUrlNS_9QueryTypeE @ 416 NONAME
+ _ZN18QNetworkProxyQueryC1ERK7QStringiS2_NS_9QueryTypeE @ 417 NONAME
+ _ZN18QNetworkProxyQueryC1ERKS_ @ 418 NONAME
+ _ZN18QNetworkProxyQueryC1EtRK7QStringNS_9QueryTypeE @ 419 NONAME
+ _ZN18QNetworkProxyQueryC1Ev @ 420 NONAME
+ _ZN18QNetworkProxyQueryC2ERK4QUrlNS_9QueryTypeE @ 421 NONAME
+ _ZN18QNetworkProxyQueryC2ERK7QStringiS2_NS_9QueryTypeE @ 422 NONAME
+ _ZN18QNetworkProxyQueryC2ERKS_ @ 423 NONAME
+ _ZN18QNetworkProxyQueryC2EtRK7QStringNS_9QueryTypeE @ 424 NONAME
+ _ZN18QNetworkProxyQueryC2Ev @ 425 NONAME
+ _ZN18QNetworkProxyQueryD1Ev @ 426 NONAME
+ _ZN18QNetworkProxyQueryD2Ev @ 427 NONAME
+ _ZN18QNetworkProxyQueryaSERKS_ @ 428 NONAME
+ _ZN19QHttpResponseHeader13setStatusLineEiRK7QStringii @ 429 NONAME
+ _ZN19QHttpResponseHeader9parseLineERK7QStringi @ 430 NONAME
+ _ZN19QHttpResponseHeaderC1ERK7QString @ 431 NONAME
+ _ZN19QHttpResponseHeaderC1ERKS_ @ 432 NONAME
+ _ZN19QHttpResponseHeaderC1EiRK7QStringii @ 433 NONAME
+ _ZN19QHttpResponseHeaderC1Ev @ 434 NONAME
+ _ZN19QHttpResponseHeaderC2ERK7QString @ 435 NONAME
+ _ZN19QHttpResponseHeaderC2ERKS_ @ 436 NONAME
+ _ZN19QHttpResponseHeaderC2EiRK7QStringii @ 437 NONAME
+ _ZN19QHttpResponseHeaderC2Ev @ 438 NONAME
+ _ZN19QHttpResponseHeaderaSERKS_ @ 439 NONAME
+ _ZN20QNetworkAddressEntry10setNetmaskERK12QHostAddress @ 440 NONAME
+ _ZN20QNetworkAddressEntry12setBroadcastERK12QHostAddress @ 441 NONAME
+ _ZN20QNetworkAddressEntry15setPrefixLengthEi @ 442 NONAME
+ _ZN20QNetworkAddressEntry5setIpERK12QHostAddress @ 443 NONAME
+ _ZN20QNetworkAddressEntryC1ERKS_ @ 444 NONAME
+ _ZN20QNetworkAddressEntryC1Ev @ 445 NONAME
+ _ZN20QNetworkAddressEntryC2ERKS_ @ 446 NONAME
+ _ZN20QNetworkAddressEntryC2Ev @ 447 NONAME
+ _ZN20QNetworkAddressEntryD1Ev @ 448 NONAME
+ _ZN20QNetworkAddressEntryD2Ev @ 449 NONAME
+ _ZN20QNetworkAddressEntryaSERKS_ @ 450 NONAME
+ _ZN20QNetworkProxyFactory13proxyForQueryERK18QNetworkProxyQuery @ 451 NONAME
+ _ZN20QNetworkProxyFactory19systemProxyForQueryERK18QNetworkProxyQuery @ 452 NONAME
+ _ZN20QNetworkProxyFactory25setUseSystemConfigurationEb @ 453 NONAME
+ _ZN20QNetworkProxyFactory26setApplicationProxyFactoryEPS_ @ 454 NONAME
+ _ZN20QNetworkProxyFactoryC2Ev @ 455 NONAME
+ _ZN20QNetworkProxyFactoryD0Ev @ 456 NONAME
+ _ZN20QNetworkProxyFactoryD1Ev @ 457 NONAME
+ _ZN20QNetworkProxyFactoryD2Ev @ 458 NONAME
+ _ZN21QAbstractNetworkCache11qt_metacallEN11QMetaObject4CallEiPPv @ 459 NONAME
+ _ZN21QAbstractNetworkCache11qt_metacastEPKc @ 460 NONAME
+ _ZN21QAbstractNetworkCache16staticMetaObjectE @ 461 NONAME DATA 16
+ _ZN21QAbstractNetworkCache19getStaticMetaObjectEv @ 462 NONAME
+ _ZN21QAbstractNetworkCacheC2EP7QObject @ 463 NONAME
+ _ZN21QAbstractNetworkCacheC2ER28QAbstractNetworkCachePrivateP7QObject @ 464 NONAME
+ _ZN21QAbstractNetworkCacheD0Ev @ 465 NONAME
+ _ZN21QAbstractNetworkCacheD1Ev @ 466 NONAME
+ _ZN21QAbstractNetworkCacheD2Ev @ 467 NONAME
+ _ZN21QNetworkAccessManager11qt_metacallEN11QMetaObject4CallEiPPv @ 468 NONAME
+ _ZN21QNetworkAccessManager11qt_metacastEPKc @ 469 NONAME
+ _ZN21QNetworkAccessManager12setCookieJarEP17QNetworkCookieJar @ 470 NONAME
+ _ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice @ 471 NONAME
+ _ZN21QNetworkAccessManager14deleteResourceERK15QNetworkRequest @ 472 NONAME
+ _ZN21QNetworkAccessManager15setProxyFactoryEP20QNetworkProxyFactory @ 473 NONAME
+ _ZN21QNetworkAccessManager16staticMetaObjectE @ 474 NONAME DATA 16
+ _ZN21QNetworkAccessManager19getStaticMetaObjectEv @ 475 NONAME
+ _ZN21QNetworkAccessManager22authenticationRequiredEP13QNetworkReplyP14QAuthenticator @ 476 NONAME
+ _ZN21QNetworkAccessManager27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 477 NONAME
+ _ZN21QNetworkAccessManager3getERK15QNetworkRequest @ 478 NONAME
+ _ZN21QNetworkAccessManager3putERK15QNetworkRequestP9QIODevice @ 479 NONAME
+ _ZN21QNetworkAccessManager3putERK15QNetworkRequestRK10QByteArray @ 480 NONAME
+ _ZN21QNetworkAccessManager4headERK15QNetworkRequest @ 481 NONAME
+ _ZN21QNetworkAccessManager4postERK15QNetworkRequestP9QIODevice @ 482 NONAME
+ _ZN21QNetworkAccessManager4postERK15QNetworkRequestRK10QByteArray @ 483 NONAME
+ _ZN21QNetworkAccessManager8finishedEP13QNetworkReply @ 484 NONAME
+ _ZN21QNetworkAccessManager8setCacheEP21QAbstractNetworkCache @ 485 NONAME
+ _ZN21QNetworkAccessManager8setProxyERK13QNetworkProxy @ 486 NONAME
+ _ZN21QNetworkAccessManager9sslErrorsEP13QNetworkReplyRK5QListI9QSslErrorE @ 487 NONAME
+ _ZN21QNetworkAccessManagerC1EP7QObject @ 488 NONAME
+ _ZN21QNetworkAccessManagerC2EP7QObject @ 489 NONAME
+ _ZN21QNetworkAccessManagerD0Ev @ 490 NONAME
+ _ZN21QNetworkAccessManagerD1Ev @ 491 NONAME
+ _ZN21QNetworkAccessManagerD2Ev @ 492 NONAME
+ _ZN21QNetworkCacheMetaData13setAttributesERK5QHashIN15QNetworkRequest9AttributeE8QVariantE @ 493 NONAME
+ _ZN21QNetworkCacheMetaData13setRawHeadersERK5QListI5QPairI10QByteArrayS2_EE @ 494 NONAME
+ _ZN21QNetworkCacheMetaData13setSaveToDiskEb @ 495 NONAME
+ _ZN21QNetworkCacheMetaData15setLastModifiedERK9QDateTime @ 496 NONAME
+ _ZN21QNetworkCacheMetaData17setExpirationDateERK9QDateTime @ 497 NONAME
+ _ZN21QNetworkCacheMetaData6setUrlERK4QUrl @ 498 NONAME
+ _ZN21QNetworkCacheMetaDataC1ERKS_ @ 499 NONAME
+ _ZN21QNetworkCacheMetaDataC1Ev @ 500 NONAME
+ _ZN21QNetworkCacheMetaDataC2ERKS_ @ 501 NONAME
+ _ZN21QNetworkCacheMetaDataC2Ev @ 502 NONAME
+ _ZN21QNetworkCacheMetaDataD1Ev @ 503 NONAME
+ _ZN21QNetworkCacheMetaDataD2Ev @ 504 NONAME
+ _ZN21QNetworkCacheMetaDataaSERKS_ @ 505 NONAME
+ _ZN4QFtp10rawCommandERK7QString @ 506 NONAME
+ _ZN4QFtp11qt_metacallEN11QMetaObject4CallEiPPv @ 507 NONAME
+ _ZN4QFtp11qt_metacastEPKc @ 508 NONAME
+ _ZN4QFtp12stateChangedEi @ 509 NONAME
+ _ZN4QFtp13connectToHostERK7QStringt @ 510 NONAME
+ _ZN4QFtp14commandStartedEi @ 511 NONAME
+ _ZN4QFtp15commandFinishedEib @ 512 NONAME
+ _ZN4QFtp15rawCommandReplyEiRK7QString @ 513 NONAME
+ _ZN4QFtp15setTransferModeENS_12TransferModeE @ 514 NONAME
+ _ZN4QFtp16staticMetaObjectE @ 515 NONAME DATA 16
+ _ZN4QFtp19getStaticMetaObjectEv @ 516 NONAME
+ _ZN4QFtp20clearPendingCommandsEv @ 517 NONAME
+ _ZN4QFtp20dataTransferProgressExx @ 518 NONAME
+ _ZN4QFtp2cdERK7QString @ 519 NONAME
+ _ZN4QFtp3getERK7QStringP9QIODeviceNS_12TransferTypeE @ 520 NONAME
+ _ZN4QFtp3putEP9QIODeviceRK7QStringNS_12TransferTypeE @ 521 NONAME
+ _ZN4QFtp3putERK10QByteArrayRK7QStringNS_12TransferTypeE @ 522 NONAME
+ _ZN4QFtp4doneEb @ 523 NONAME
+ _ZN4QFtp4listERK7QString @ 524 NONAME
+ _ZN4QFtp4readEPcx @ 525 NONAME
+ _ZN4QFtp5abortEv @ 526 NONAME
+ _ZN4QFtp5closeEv @ 527 NONAME
+ _ZN4QFtp5loginERK7QStringS2_ @ 528 NONAME
+ _ZN4QFtp5mkdirERK7QString @ 529 NONAME
+ _ZN4QFtp5rmdirERK7QString @ 530 NONAME
+ _ZN4QFtp6removeERK7QString @ 531 NONAME
+ _ZN4QFtp6renameERK7QStringS2_ @ 532 NONAME
+ _ZN4QFtp7readAllEv @ 533 NONAME
+ _ZN4QFtp8listInfoERK8QUrlInfo @ 534 NONAME
+ _ZN4QFtp8setProxyERK7QStringt @ 535 NONAME
+ _ZN4QFtp9readyReadEv @ 536 NONAME
+ _ZN4QFtpC1EP7QObject @ 537 NONAME
+ _ZN4QFtpC2EP7QObject @ 538 NONAME
+ _ZN4QFtpD0Ev @ 539 NONAME
+ _ZN4QFtpD1Ev @ 540 NONAME
+ _ZN4QFtpD2Ev @ 541 NONAME
+ _ZN5QHttp11qt_metacallEN11QMetaObject4CallEiPPv @ 542 NONAME
+ _ZN5QHttp11qt_metacastEPKc @ 543 NONAME
+ _ZN5QHttp12stateChangedEi @ 544 NONAME
+ _ZN5QHttp14requestStartedEi @ 545 NONAME
+ _ZN5QHttp15closeConnectionEv @ 546 NONAME
+ _ZN5QHttp15ignoreSslErrorsEv @ 547 NONAME
+ _ZN5QHttp15requestFinishedEib @ 548 NONAME
+ _ZN5QHttp16dataReadProgressEii @ 549 NONAME
+ _ZN5QHttp16dataSendProgressEii @ 550 NONAME
+ _ZN5QHttp16staticMetaObjectE @ 551 NONAME DATA 16
+ _ZN5QHttp19getStaticMetaObjectEv @ 552 NONAME
+ _ZN5QHttp20clearPendingRequestsEv @ 553 NONAME
+ _ZN5QHttp22authenticationRequiredERK7QStringtP14QAuthenticator @ 554 NONAME
+ _ZN5QHttp22responseHeaderReceivedERK19QHttpResponseHeader @ 555 NONAME
+ _ZN5QHttp27proxyAuthenticationRequiredERK13QNetworkProxyP14QAuthenticator @ 556 NONAME
+ _ZN5QHttp3getERK7QStringP9QIODevice @ 557 NONAME
+ _ZN5QHttp4doneEb @ 558 NONAME
+ _ZN5QHttp4headERK7QString @ 559 NONAME
+ _ZN5QHttp4postERK7QStringP9QIODeviceS4_ @ 560 NONAME
+ _ZN5QHttp4postERK7QStringRK10QByteArrayP9QIODevice @ 561 NONAME
+ _ZN5QHttp4readEPcx @ 562 NONAME
+ _ZN5QHttp5abortEv @ 563 NONAME
+ _ZN5QHttp5closeEv @ 564 NONAME
+ _ZN5QHttp7readAllEv @ 565 NONAME
+ _ZN5QHttp7requestERK18QHttpRequestHeaderP9QIODeviceS4_ @ 566 NONAME
+ _ZN5QHttp7requestERK18QHttpRequestHeaderRK10QByteArrayP9QIODevice @ 567 NONAME
+ _ZN5QHttp7setHostERK7QStringNS_14ConnectionModeEt @ 568 NONAME
+ _ZN5QHttp7setHostERK7QStringt @ 569 NONAME
+ _ZN5QHttp7setUserERK7QStringS2_ @ 570 NONAME
+ _ZN5QHttp8setProxyERK13QNetworkProxy @ 571 NONAME
+ _ZN5QHttp8setProxyERK7QStringiS2_S2_ @ 572 NONAME
+ _ZN5QHttp9readyReadERK19QHttpResponseHeader @ 573 NONAME
+ _ZN5QHttp9setSocketEP10QTcpSocket @ 574 NONAME
+ _ZN5QHttp9sslErrorsERK5QListI9QSslErrorE @ 575 NONAME
+ _ZN5QHttpC1EP7QObject @ 576 NONAME
+ _ZN5QHttpC1ERK7QStringNS_14ConnectionModeEtP7QObject @ 577 NONAME
+ _ZN5QHttpC1ERK7QStringtP7QObject @ 578 NONAME
+ _ZN5QHttpC2EP7QObject @ 579 NONAME
+ _ZN5QHttpC2ERK7QStringNS_14ConnectionModeEtP7QObject @ 580 NONAME
+ _ZN5QHttpC2ERK7QStringtP7QObject @ 581 NONAME
+ _ZN5QHttpD0Ev @ 582 NONAME
+ _ZN5QHttpD1Ev @ 583 NONAME
+ _ZN5QHttpD2Ev @ 584 NONAME
+ _ZN7QSslKey5clearEv @ 585 NONAME
+ _ZN7QSslKeyC1EP9QIODeviceN4QSsl12KeyAlgorithmENS2_14EncodingFormatENS2_7KeyTypeERK10QByteArray @ 586 NONAME
+ _ZN7QSslKeyC1ERK10QByteArrayN4QSsl12KeyAlgorithmENS3_14EncodingFormatENS3_7KeyTypeES2_ @ 587 NONAME
+ _ZN7QSslKeyC1ERKS_ @ 588 NONAME
+ _ZN7QSslKeyC1Ev @ 589 NONAME
+ _ZN7QSslKeyC2EP9QIODeviceN4QSsl12KeyAlgorithmENS2_14EncodingFormatENS2_7KeyTypeERK10QByteArray @ 590 NONAME
+ _ZN7QSslKeyC2ERK10QByteArrayN4QSsl12KeyAlgorithmENS3_14EncodingFormatENS3_7KeyTypeES2_ @ 591 NONAME
+ _ZN7QSslKeyC2ERKS_ @ 592 NONAME
+ _ZN7QSslKeyC2Ev @ 593 NONAME
+ _ZN7QSslKeyD1Ev @ 594 NONAME
+ _ZN7QSslKeyD2Ev @ 595 NONAME
+ _ZN7QSslKeyaSERKS_ @ 596 NONAME
+ _ZN8QUrlInfo10setSymLinkEb @ 597 NONAME
+ _ZN8QUrlInfo11greaterThanERKS_S1_i @ 598 NONAME
+ _ZN8QUrlInfo11setLastReadERK9QDateTime @ 599 NONAME
+ _ZN8QUrlInfo11setReadableEb @ 600 NONAME
+ _ZN8QUrlInfo11setWritableEb @ 601 NONAME
+ _ZN8QUrlInfo14setPermissionsEi @ 602 NONAME
+ _ZN8QUrlInfo15setLastModifiedERK9QDateTime @ 603 NONAME
+ _ZN8QUrlInfo5equalERKS_S1_i @ 604 NONAME
+ _ZN8QUrlInfo6setDirEb @ 605 NONAME
+ _ZN8QUrlInfo7setFileEb @ 606 NONAME
+ _ZN8QUrlInfo7setNameERK7QString @ 607 NONAME
+ _ZN8QUrlInfo7setSizeEx @ 608 NONAME
+ _ZN8QUrlInfo8lessThanERKS_S1_i @ 609 NONAME
+ _ZN8QUrlInfo8setGroupERK7QString @ 610 NONAME
+ _ZN8QUrlInfo8setOwnerERK7QString @ 611 NONAME
+ _ZN8QUrlInfoC1ERK4QUrliRK7QStringS5_xRK9QDateTimeS8_bbbbbb @ 612 NONAME
+ _ZN8QUrlInfoC1ERK7QStringiS2_S2_xRK9QDateTimeS5_bbbbbb @ 613 NONAME
+ _ZN8QUrlInfoC1ERKS_ @ 614 NONAME
+ _ZN8QUrlInfoC1Ev @ 615 NONAME
+ _ZN8QUrlInfoC2ERK4QUrliRK7QStringS5_xRK9QDateTimeS8_bbbbbb @ 616 NONAME
+ _ZN8QUrlInfoC2ERK7QStringiS2_S2_xRK9QDateTimeS5_bbbbbb @ 617 NONAME
+ _ZN8QUrlInfoC2ERKS_ @ 618 NONAME
+ _ZN8QUrlInfoC2Ev @ 619 NONAME
+ _ZN8QUrlInfoD0Ev @ 620 NONAME
+ _ZN8QUrlInfoD1Ev @ 621 NONAME
+ _ZN8QUrlInfoD2Ev @ 622 NONAME
+ _ZN8QUrlInfoaSERKS_ @ 623 NONAME
+ _ZN9QHostInfo10lookupHostERK7QStringP7QObjectPKc @ 624 NONAME
+ _ZN9QHostInfo11setHostNameERK7QString @ 625 NONAME
+ _ZN9QHostInfo11setLookupIdEi @ 626 NONAME
+ _ZN9QHostInfo12setAddressesERK5QListI12QHostAddressE @ 627 NONAME
+ _ZN9QHostInfo13localHostNameEv @ 628 NONAME
+ _ZN9QHostInfo14setErrorStringERK7QString @ 629 NONAME
+ _ZN9QHostInfo15abortHostLookupEi @ 630 NONAME
+ _ZN9QHostInfo15localDomainNameEv @ 631 NONAME
+ _ZN9QHostInfo8fromNameERK7QString @ 632 NONAME
+ _ZN9QHostInfo8setErrorENS_13HostInfoErrorE @ 633 NONAME
+ _ZN9QHostInfoC1ERKS_ @ 634 NONAME
+ _ZN9QHostInfoC1Ei @ 635 NONAME
+ _ZN9QHostInfoC2ERKS_ @ 636 NONAME
+ _ZN9QHostInfoC2Ei @ 637 NONAME
+ _ZN9QHostInfoD1Ev @ 638 NONAME
+ _ZN9QHostInfoD2Ev @ 639 NONAME
+ _ZN9QHostInfoaSERKS_ @ 640 NONAME
+ _ZN9QSslErrorC1ENS_8SslErrorE @ 641 NONAME
+ _ZN9QSslErrorC1ENS_8SslErrorERK15QSslCertificate @ 642 NONAME
+ _ZN9QSslErrorC1ERKS_ @ 643 NONAME
+ _ZN9QSslErrorC1Ev @ 644 NONAME
+ _ZN9QSslErrorC2ENS_8SslErrorE @ 645 NONAME
+ _ZN9QSslErrorC2ENS_8SslErrorERK15QSslCertificate @ 646 NONAME
+ _ZN9QSslErrorC2ERKS_ @ 647 NONAME
+ _ZN9QSslErrorC2Ev @ 648 NONAME
+ _ZN9QSslErrorD1Ev @ 649 NONAME
+ _ZN9QSslErrorD2Ev @ 650 NONAME
+ _ZN9QSslErroraSERKS_ @ 651 NONAME
+ _ZNK10QSslCipher13supportedBitsEv @ 652 NONAME
+ _ZNK10QSslCipher14protocolStringEv @ 653 NONAME
+ _ZNK10QSslCipher16encryptionMethodEv @ 654 NONAME
+ _ZNK10QSslCipher17keyExchangeMethodEv @ 655 NONAME
+ _ZNK10QSslCipher20authenticationMethodEv @ 656 NONAME
+ _ZNK10QSslCipher4nameEv @ 657 NONAME
+ _ZNK10QSslCipher6isNullEv @ 658 NONAME
+ _ZNK10QSslCipher8protocolEv @ 659 NONAME
+ _ZNK10QSslCipher8usedBitsEv @ 660 NONAME
+ _ZNK10QSslCiphereqERKS_ @ 661 NONAME
+ _ZNK10QSslSocket10metaObjectEv @ 662 NONAME
+ _ZNK10QSslSocket10privateKeyEv @ 663 NONAME
+ _ZNK10QSslSocket11canReadLineEv @ 664 NONAME
+ _ZNK10QSslSocket11isEncryptedEv @ 665 NONAME
+ _ZNK10QSslSocket12bytesToWriteEv @ 666 NONAME
+ _ZNK10QSslSocket13sessionCipherEv @ 667 NONAME
+ _ZNK10QSslSocket14bytesAvailableEv @ 668 NONAME
+ _ZNK10QSslSocket14caCertificatesEv @ 669 NONAME
+ _ZNK10QSslSocket14peerVerifyModeEv @ 670 NONAME
+ _ZNK10QSslSocket15peerCertificateEv @ 671 NONAME
+ _ZNK10QSslSocket15peerVerifyDepthEv @ 672 NONAME
+ _ZNK10QSslSocket16localCertificateEv @ 673 NONAME
+ _ZNK10QSslSocket16sslConfigurationEv @ 674 NONAME
+ _ZNK10QSslSocket20peerCertificateChainEv @ 675 NONAME
+ _ZNK10QSslSocket21encryptedBytesToWriteEv @ 676 NONAME
+ _ZNK10QSslSocket23encryptedBytesAvailableEv @ 677 NONAME
+ _ZNK10QSslSocket4modeEv @ 678 NONAME
+ _ZNK10QSslSocket5atEndEv @ 679 NONAME
+ _ZNK10QSslSocket7ciphersEv @ 680 NONAME
+ _ZNK10QSslSocket8protocolEv @ 681 NONAME
+ _ZNK10QSslSocket9sslErrorsEv @ 682 NONAME
+ _ZNK10QTcpServer10metaObjectEv @ 683 NONAME
+ _ZNK10QTcpServer10serverPortEv @ 684 NONAME
+ _ZNK10QTcpServer11errorStringEv @ 685 NONAME
+ _ZNK10QTcpServer11isListeningEv @ 686 NONAME
+ _ZNK10QTcpServer11serverErrorEv @ 687 NONAME
+ _ZNK10QTcpServer13serverAddressEv @ 688 NONAME
+ _ZNK10QTcpServer16socketDescriptorEv @ 689 NONAME
+ _ZNK10QTcpServer21hasPendingConnectionsEv @ 690 NONAME
+ _ZNK10QTcpServer21maxPendingConnectionsEv @ 691 NONAME
+ _ZNK10QTcpServer5proxyEv @ 692 NONAME
+ _ZNK10QTcpSocket10metaObjectEv @ 693 NONAME
+ _ZNK10QUdpSocket10metaObjectEv @ 694 NONAME
+ _ZNK10QUdpSocket19hasPendingDatagramsEv @ 695 NONAME
+ _ZNK10QUdpSocket19pendingDatagramSizeEv @ 696 NONAME
+ _ZNK11QHttpHeader11contentTypeEv @ 697 NONAME
+ _ZNK11QHttpHeader13contentLengthEv @ 698 NONAME
+ _ZNK11QHttpHeader14hasContentTypeEv @ 699 NONAME
+ _ZNK11QHttpHeader16hasContentLengthEv @ 700 NONAME
+ _ZNK11QHttpHeader4keysEv @ 701 NONAME
+ _ZNK11QHttpHeader5valueERK7QString @ 702 NONAME
+ _ZNK11QHttpHeader6hasKeyERK7QString @ 703 NONAME
+ _ZNK11QHttpHeader6valuesEv @ 704 NONAME
+ _ZNK11QHttpHeader7isValidEv @ 705 NONAME
+ _ZNK11QHttpHeader8toStringEv @ 706 NONAME
+ _ZNK11QHttpHeader9allValuesERK7QString @ 707 NONAME
+ _ZNK12QHostAddress10isInSubnetERK5QPairIS_iE @ 708 NONAME
+ _ZNK12QHostAddress10isInSubnetERKS_i @ 709 NONAME
+ _ZNK12QHostAddress13toIPv4AddressEv @ 710 NONAME
+ _ZNK12QHostAddress13toIPv6AddressEv @ 711 NONAME
+ _ZNK12QHostAddress6isNullEv @ 712 NONAME
+ _ZNK12QHostAddress7scopeIdEv @ 713 NONAME
+ _ZNK12QHostAddress8protocolEv @ 714 NONAME
+ _ZNK12QHostAddress8toStringEv @ 715 NONAME
+ _ZNK12QHostAddresseqENS_14SpecialAddressE @ 716 NONAME
+ _ZNK12QHostAddresseqERKS_ @ 717 NONAME
+ _ZNK12QLocalServer10metaObjectEv @ 718 NONAME
+ _ZNK12QLocalServer10serverNameEv @ 719 NONAME
+ _ZNK12QLocalServer11errorStringEv @ 720 NONAME
+ _ZNK12QLocalServer11isListeningEv @ 721 NONAME
+ _ZNK12QLocalServer11serverErrorEv @ 722 NONAME
+ _ZNK12QLocalServer14fullServerNameEv @ 723 NONAME
+ _ZNK12QLocalServer21hasPendingConnectionsEv @ 724 NONAME
+ _ZNK12QLocalServer21maxPendingConnectionsEv @ 725 NONAME
+ _ZNK12QLocalSocket10metaObjectEv @ 726 NONAME
+ _ZNK12QLocalSocket10serverNameEv @ 727 NONAME
+ _ZNK12QLocalSocket11canReadLineEv @ 728 NONAME
+ _ZNK12QLocalSocket12bytesToWriteEv @ 729 NONAME
+ _ZNK12QLocalSocket12isSequentialEv @ 730 NONAME
+ _ZNK12QLocalSocket14bytesAvailableEv @ 731 NONAME
+ _ZNK12QLocalSocket14fullServerNameEv @ 732 NONAME
+ _ZNK12QLocalSocket14readBufferSizeEv @ 733 NONAME
+ _ZNK12QLocalSocket16socketDescriptorEv @ 734 NONAME
+ _ZNK12QLocalSocket5errorEv @ 735 NONAME
+ _ZNK12QLocalSocket5stateEv @ 736 NONAME
+ _ZNK12QLocalSocket7isValidEv @ 737 NONAME
+ _ZNK13QNetworkProxy12capabilitiesEv @ 738 NONAME
+ _ZNK13QNetworkProxy14isCachingProxyEv @ 739 NONAME
+ _ZNK13QNetworkProxy18isTransparentProxyEv @ 740 NONAME
+ _ZNK13QNetworkProxy4portEv @ 741 NONAME
+ _ZNK13QNetworkProxy4typeEv @ 742 NONAME
+ _ZNK13QNetworkProxy4userEv @ 743 NONAME
+ _ZNK13QNetworkProxy8hostNameEv @ 744 NONAME
+ _ZNK13QNetworkProxy8passwordEv @ 745 NONAME
+ _ZNK13QNetworkProxyeqERKS_ @ 746 NONAME
+ _ZNK13QNetworkReply10isFinishedEv @ 747 NONAME
+ _ZNK13QNetworkReply10metaObjectEv @ 748 NONAME
+ _ZNK13QNetworkReply12hasRawHeaderERK10QByteArray @ 749 NONAME
+ _ZNK13QNetworkReply12isSequentialEv @ 750 NONAME
+ _ZNK13QNetworkReply13rawHeaderListEv @ 751 NONAME
+ _ZNK13QNetworkReply14readBufferSizeEv @ 752 NONAME
+ _ZNK13QNetworkReply16sslConfigurationEv @ 753 NONAME
+ _ZNK13QNetworkReply3urlEv @ 754 NONAME
+ _ZNK13QNetworkReply5errorEv @ 755 NONAME
+ _ZNK13QNetworkReply6headerEN15QNetworkRequest12KnownHeadersE @ 756 NONAME
+ _ZNK13QNetworkReply7managerEv @ 757 NONAME
+ _ZNK13QNetworkReply7requestEv @ 758 NONAME
+ _ZNK13QNetworkReply9attributeEN15QNetworkRequest9AttributeE @ 759 NONAME
+ _ZNK13QNetworkReply9isRunningEv @ 760 NONAME
+ _ZNK13QNetworkReply9operationEv @ 761 NONAME
+ _ZNK13QNetworkReply9rawHeaderERK10QByteArray @ 762 NONAME
+ _ZNK14QAuthenticator4userEv @ 763 NONAME
+ _ZNK14QAuthenticator5realmEv @ 764 NONAME
+ _ZNK14QAuthenticator6isNullEv @ 765 NONAME
+ _ZNK14QAuthenticator8passwordEv @ 766 NONAME
+ _ZNK14QAuthenticatoreqERKS_ @ 767 NONAME
+ _ZNK14QNetworkCookie10isHttpOnlyEv @ 768 NONAME
+ _ZNK14QNetworkCookie14expirationDateEv @ 769 NONAME
+ _ZNK14QNetworkCookie15isSessionCookieEv @ 770 NONAME
+ _ZNK14QNetworkCookie4nameEv @ 771 NONAME
+ _ZNK14QNetworkCookie4pathEv @ 772 NONAME
+ _ZNK14QNetworkCookie5valueEv @ 773 NONAME
+ _ZNK14QNetworkCookie6domainEv @ 774 NONAME
+ _ZNK14QNetworkCookie8isSecureEv @ 775 NONAME
+ _ZNK14QNetworkCookie9toRawFormENS_7RawFormE @ 776 NONAME
+ _ZNK14QNetworkCookieeqERKS_ @ 777 NONAME
+ _ZNK15QAbstractSocket10metaObjectEv @ 778 NONAME
+ _ZNK15QAbstractSocket10socketTypeEv @ 779 NONAME
+ _ZNK15QAbstractSocket11canReadLineEv @ 780 NONAME
+ _ZNK15QAbstractSocket11peerAddressEv @ 781 NONAME
+ _ZNK15QAbstractSocket12bytesToWriteEv @ 782 NONAME
+ _ZNK15QAbstractSocket12isSequentialEv @ 783 NONAME
+ _ZNK15QAbstractSocket12localAddressEv @ 784 NONAME
+ _ZNK15QAbstractSocket14bytesAvailableEv @ 785 NONAME
+ _ZNK15QAbstractSocket14readBufferSizeEv @ 786 NONAME
+ _ZNK15QAbstractSocket16socketDescriptorEv @ 787 NONAME
+ _ZNK15QAbstractSocket5atEndEv @ 788 NONAME
+ _ZNK15QAbstractSocket5errorEv @ 789 NONAME
+ _ZNK15QAbstractSocket5proxyEv @ 790 NONAME
+ _ZNK15QAbstractSocket5stateEv @ 791 NONAME
+ _ZNK15QAbstractSocket7isValidEv @ 792 NONAME
+ _ZNK15QAbstractSocket8peerNameEv @ 793 NONAME
+ _ZNK15QAbstractSocket8peerPortEv @ 794 NONAME
+ _ZNK15QAbstractSocket9localPortEv @ 795 NONAME
+ _ZNK15QNetworkRequest12hasRawHeaderERK10QByteArray @ 796 NONAME
+ _ZNK15QNetworkRequest13rawHeaderListEv @ 797 NONAME
+ _ZNK15QNetworkRequest16sslConfigurationEv @ 798 NONAME
+ _ZNK15QNetworkRequest3urlEv @ 799 NONAME
+ _ZNK15QNetworkRequest6headerENS_12KnownHeadersE @ 800 NONAME
+ _ZNK15QNetworkRequest9attributeENS_9AttributeERK8QVariant @ 801 NONAME
+ _ZNK15QNetworkRequest9rawHeaderERK10QByteArray @ 802 NONAME
+ _ZNK15QNetworkRequesteqERKS_ @ 803 NONAME
+ _ZNK15QSslCertificate10expiryDateEv @ 804 NONAME
+ _ZNK15QSslCertificate10issuerInfoENS_11SubjectInfoE @ 805 NONAME
+ _ZNK15QSslCertificate10issuerInfoERK10QByteArray @ 806 NONAME
+ _ZNK15QSslCertificate11subjectInfoENS_11SubjectInfoE @ 807 NONAME
+ _ZNK15QSslCertificate11subjectInfoERK10QByteArray @ 808 NONAME
+ _ZNK15QSslCertificate12serialNumberEv @ 809 NONAME
+ _ZNK15QSslCertificate13effectiveDateEv @ 810 NONAME
+ _ZNK15QSslCertificate21alternateSubjectNamesEv @ 811 NONAME
+ _ZNK15QSslCertificate5toDerEv @ 812 NONAME
+ _ZNK15QSslCertificate5toPemEv @ 813 NONAME
+ _ZNK15QSslCertificate6digestEN18QCryptographicHash9AlgorithmE @ 814 NONAME
+ _ZNK15QSslCertificate6handleEv @ 815 NONAME
+ _ZNK15QSslCertificate6isNullEv @ 816 NONAME
+ _ZNK15QSslCertificate7isValidEv @ 817 NONAME
+ _ZNK15QSslCertificate7versionEv @ 818 NONAME
+ _ZNK15QSslCertificate9publicKeyEv @ 819 NONAME
+ _ZNK15QSslCertificateeqERKS_ @ 820 NONAME
+ _ZNK17QNetworkCookieJar10allCookiesEv @ 821 NONAME
+ _ZNK17QNetworkCookieJar10metaObjectEv @ 822 NONAME
+ _ZNK17QNetworkCookieJar13cookiesForUrlERK4QUrl @ 823 NONAME
+ _ZNK17QNetworkDiskCache10metaObjectEv @ 824 NONAME
+ _ZNK17QNetworkDiskCache12fileMetaDataERK7QString @ 825 NONAME
+ _ZNK17QNetworkDiskCache14cacheDirectoryEv @ 826 NONAME
+ _ZNK17QNetworkDiskCache16maximumCacheSizeEv @ 827 NONAME
+ _ZNK17QNetworkDiskCache9cacheSizeEv @ 828 NONAME
+ _ZNK17QNetworkInterface14addressEntriesEv @ 829 NONAME
+ _ZNK17QNetworkInterface15hardwareAddressEv @ 830 NONAME
+ _ZNK17QNetworkInterface17humanReadableNameEv @ 831 NONAME
+ _ZNK17QNetworkInterface4nameEv @ 832 NONAME
+ _ZNK17QNetworkInterface5flagsEv @ 833 NONAME
+ _ZNK17QNetworkInterface5indexEv @ 834 NONAME
+ _ZNK17QNetworkInterface7isValidEv @ 835 NONAME
+ _ZNK17QSslConfiguration10privateKeyEv @ 836 NONAME
+ _ZNK17QSslConfiguration13sessionCipherEv @ 837 NONAME
+ _ZNK17QSslConfiguration14caCertificatesEv @ 838 NONAME
+ _ZNK17QSslConfiguration14peerVerifyModeEv @ 839 NONAME
+ _ZNK17QSslConfiguration15peerCertificateEv @ 840 NONAME
+ _ZNK17QSslConfiguration15peerVerifyDepthEv @ 841 NONAME
+ _ZNK17QSslConfiguration16localCertificateEv @ 842 NONAME
+ _ZNK17QSslConfiguration20peerCertificateChainEv @ 843 NONAME
+ _ZNK17QSslConfiguration6isNullEv @ 844 NONAME
+ _ZNK17QSslConfiguration7ciphersEv @ 845 NONAME
+ _ZNK17QSslConfiguration8protocolEv @ 846 NONAME
+ _ZNK17QSslConfigurationeqERKS_ @ 847 NONAME
+ _ZNK18QHttpRequestHeader12majorVersionEv @ 848 NONAME
+ _ZNK18QHttpRequestHeader12minorVersionEv @ 849 NONAME
+ _ZNK18QHttpRequestHeader4pathEv @ 850 NONAME
+ _ZNK18QHttpRequestHeader6methodEv @ 851 NONAME
+ _ZNK18QHttpRequestHeader8toStringEv @ 852 NONAME
+ _ZNK18QNetworkProxyQuery11protocolTagEv @ 853 NONAME
+ _ZNK18QNetworkProxyQuery12peerHostNameEv @ 854 NONAME
+ _ZNK18QNetworkProxyQuery3urlEv @ 855 NONAME
+ _ZNK18QNetworkProxyQuery8peerPortEv @ 856 NONAME
+ _ZNK18QNetworkProxyQuery9localPortEv @ 857 NONAME
+ _ZNK18QNetworkProxyQuery9queryTypeEv @ 858 NONAME
+ _ZNK18QNetworkProxyQueryeqERKS_ @ 859 NONAME
+ _ZNK19QHttpResponseHeader10statusCodeEv @ 860 NONAME
+ _ZNK19QHttpResponseHeader12majorVersionEv @ 861 NONAME
+ _ZNK19QHttpResponseHeader12minorVersionEv @ 862 NONAME
+ _ZNK19QHttpResponseHeader12reasonPhraseEv @ 863 NONAME
+ _ZNK19QHttpResponseHeader8toStringEv @ 864 NONAME
+ _ZNK20QNetworkAddressEntry12prefixLengthEv @ 865 NONAME
+ _ZNK20QNetworkAddressEntry2ipEv @ 866 NONAME
+ _ZNK20QNetworkAddressEntry7netmaskEv @ 867 NONAME
+ _ZNK20QNetworkAddressEntry9broadcastEv @ 868 NONAME
+ _ZNK20QNetworkAddressEntryeqERKS_ @ 869 NONAME
+ _ZNK21QAbstractNetworkCache10metaObjectEv @ 870 NONAME
+ _ZNK21QNetworkAccessManager10metaObjectEv @ 871 NONAME
+ _ZNK21QNetworkAccessManager12proxyFactoryEv @ 872 NONAME
+ _ZNK21QNetworkAccessManager5cacheEv @ 873 NONAME
+ _ZNK21QNetworkAccessManager5proxyEv @ 874 NONAME
+ _ZNK21QNetworkAccessManager9cookieJarEv @ 875 NONAME
+ _ZNK21QNetworkCacheMetaData10attributesEv @ 876 NONAME
+ _ZNK21QNetworkCacheMetaData10rawHeadersEv @ 877 NONAME
+ _ZNK21QNetworkCacheMetaData10saveToDiskEv @ 878 NONAME
+ _ZNK21QNetworkCacheMetaData12lastModifiedEv @ 879 NONAME
+ _ZNK21QNetworkCacheMetaData14expirationDateEv @ 880 NONAME
+ _ZNK21QNetworkCacheMetaData3urlEv @ 881 NONAME
+ _ZNK21QNetworkCacheMetaData7isValidEv @ 882 NONAME
+ _ZNK21QNetworkCacheMetaDataeqERKS_ @ 883 NONAME
+ _ZNK4QFtp10metaObjectEv @ 884 NONAME
+ _ZNK4QFtp11errorStringEv @ 885 NONAME
+ _ZNK4QFtp13currentDeviceEv @ 886 NONAME
+ _ZNK4QFtp14bytesAvailableEv @ 887 NONAME
+ _ZNK4QFtp14currentCommandEv @ 888 NONAME
+ _ZNK4QFtp18hasPendingCommandsEv @ 889 NONAME
+ _ZNK4QFtp5errorEv @ 890 NONAME
+ _ZNK4QFtp5stateEv @ 891 NONAME
+ _ZNK4QFtp9currentIdEv @ 892 NONAME
+ _ZNK5QHttp10metaObjectEv @ 893 NONAME
+ _ZNK5QHttp11errorStringEv @ 894 NONAME
+ _ZNK5QHttp12lastResponseEv @ 895 NONAME
+ _ZNK5QHttp14bytesAvailableEv @ 896 NONAME
+ _ZNK5QHttp14currentRequestEv @ 897 NONAME
+ _ZNK5QHttp18hasPendingRequestsEv @ 898 NONAME
+ _ZNK5QHttp19currentSourceDeviceEv @ 899 NONAME
+ _ZNK5QHttp24currentDestinationDeviceEv @ 900 NONAME
+ _ZNK5QHttp5errorEv @ 901 NONAME
+ _ZNK5QHttp5stateEv @ 902 NONAME
+ _ZNK5QHttp9currentIdEv @ 903 NONAME
+ _ZNK7QSslKey4typeEv @ 904 NONAME
+ _ZNK7QSslKey5toDerERK10QByteArray @ 905 NONAME
+ _ZNK7QSslKey5toPemERK10QByteArray @ 906 NONAME
+ _ZNK7QSslKey6handleEv @ 907 NONAME
+ _ZNK7QSslKey6isNullEv @ 908 NONAME
+ _ZNK7QSslKey6lengthEv @ 909 NONAME
+ _ZNK7QSslKey9algorithmEv @ 910 NONAME
+ _ZNK7QSslKeyeqERKS_ @ 911 NONAME
+ _ZNK8QUrlInfo10isReadableEv @ 912 NONAME
+ _ZNK8QUrlInfo10isWritableEv @ 913 NONAME
+ _ZNK8QUrlInfo11permissionsEv @ 914 NONAME
+ _ZNK8QUrlInfo12isExecutableEv @ 915 NONAME
+ _ZNK8QUrlInfo12lastModifiedEv @ 916 NONAME
+ _ZNK8QUrlInfo4nameEv @ 917 NONAME
+ _ZNK8QUrlInfo4sizeEv @ 918 NONAME
+ _ZNK8QUrlInfo5groupEv @ 919 NONAME
+ _ZNK8QUrlInfo5isDirEv @ 920 NONAME
+ _ZNK8QUrlInfo5ownerEv @ 921 NONAME
+ _ZNK8QUrlInfo6isFileEv @ 922 NONAME
+ _ZNK8QUrlInfo7isValidEv @ 923 NONAME
+ _ZNK8QUrlInfo8lastReadEv @ 924 NONAME
+ _ZNK8QUrlInfo9isSymLinkEv @ 925 NONAME
+ _ZNK8QUrlInfoeqERKS_ @ 926 NONAME
+ _ZNK9QHostInfo11errorStringEv @ 927 NONAME
+ _ZNK9QHostInfo5errorEv @ 928 NONAME
+ _ZNK9QHostInfo8hostNameEv @ 929 NONAME
+ _ZNK9QHostInfo8lookupIdEv @ 930 NONAME
+ _ZNK9QHostInfo9addressesEv @ 931 NONAME
+ _ZNK9QSslError11certificateEv @ 932 NONAME
+ _ZNK9QSslError11errorStringEv @ 933 NONAME
+ _ZNK9QSslError5errorEv @ 934 NONAME
+ _ZNK9QSslErroreqERKS_ @ 935 NONAME
+ _ZTI10QSslSocket @ 936 NONAME
+ _ZTI10QTcpServer @ 937 NONAME
+ _ZTI10QTcpSocket @ 938 NONAME
+ _ZTI10QUdpSocket @ 939 NONAME
+ _ZTI11QHttpHeader @ 940 NONAME
+ _ZTI12QLocalServer @ 941 NONAME
+ _ZTI12QLocalSocket @ 942 NONAME
+ _ZTI13QNetworkReply @ 943 NONAME
+ _ZTI15QAbstractSocket @ 944 NONAME
+ _ZTI17QNetworkCookieJar @ 945 NONAME
+ _ZTI17QNetworkDiskCache @ 946 NONAME
+ _ZTI18QHttpRequestHeader @ 947 NONAME
+ _ZTI19QHttpResponseHeader @ 948 NONAME
+ _ZTI20QNetworkProxyFactory @ 949 NONAME
+ _ZTI21QAbstractNetworkCache @ 950 NONAME
+ _ZTI21QNetworkAccessManager @ 951 NONAME
+ _ZTI4QFtp @ 952 NONAME
+ _ZTI5QHttp @ 953 NONAME
+ _ZTI8QUrlInfo @ 954 NONAME
+ _ZTV10QSslSocket @ 955 NONAME
+ _ZTV10QTcpServer @ 956 NONAME
+ _ZTV10QTcpSocket @ 957 NONAME
+ _ZTV10QUdpSocket @ 958 NONAME
+ _ZTV11QHttpHeader @ 959 NONAME
+ _ZTV12QLocalServer @ 960 NONAME
+ _ZTV12QLocalSocket @ 961 NONAME
+ _ZTV13QNetworkReply @ 962 NONAME
+ _ZTV15QAbstractSocket @ 963 NONAME
+ _ZTV17QNetworkCookieJar @ 964 NONAME
+ _ZTV17QNetworkDiskCache @ 965 NONAME
+ _ZTV18QHttpRequestHeader @ 966 NONAME
+ _ZTV19QHttpResponseHeader @ 967 NONAME
+ _ZTV20QNetworkProxyFactory @ 968 NONAME
+ _ZTV21QAbstractNetworkCache @ 969 NONAME
+ _ZTV21QNetworkAccessManager @ 970 NONAME
+ _ZTV4QFtp @ 971 NONAME
+ _ZTV5QHttp @ 972 NONAME
+ _ZTV8QUrlInfo @ 973 NONAME
+ _Zls6QDebugN12QLocalSocket16LocalSocketErrorE @ 974 NONAME
+ _Zls6QDebugN12QLocalSocket16LocalSocketStateE @ 975 NONAME
+ _Zls6QDebugN15QAbstractSocket11SocketErrorE @ 976 NONAME
+ _Zls6QDebugN15QAbstractSocket11SocketStateE @ 977 NONAME
+ _Zls6QDebugN15QSslCertificate11SubjectInfoE @ 978 NONAME
+ _Zls6QDebugRK10QSslCipher @ 979 NONAME
+ _Zls6QDebugRK12QHostAddress @ 980 NONAME
+ _Zls6QDebugRK14QNetworkCookie @ 981 NONAME
+ _Zls6QDebugRK15QSslCertificate @ 982 NONAME
+ _Zls6QDebugRK17QNetworkInterface @ 983 NONAME
+ _Zls6QDebugRK7QSslKey @ 984 NONAME
+ _Zls6QDebugRK9QSslError @ 985 NONAME
+ _Zls6QDebugRKN9QSslError8SslErrorE @ 986 NONAME
+ _ZlsR11QDataStreamRK12QHostAddress @ 987 NONAME
+ _ZlsR11QDataStreamRK21QNetworkCacheMetaData @ 988 NONAME
+ _ZrsR11QDataStreamR12QHostAddress @ 989 NONAME
+ _ZrsR11QDataStreamR21QNetworkCacheMetaData @ 990 NONAME
+ _ZN15QNetworkRequest20setOriginatingObjectEP7QObject @ 991 NONAME
+ _ZNK15QNetworkRequest17originatingObjectEv @ 992 NONAME
+ _ZN10QSslSocket12socketOptionEN15QAbstractSocket12SocketOptionE @ 993 NONAME
+ _ZN10QSslSocket15setSocketOptionEN15QAbstractSocket12SocketOptionERK8QVariant @ 994 NONAME
diff --git a/src/s60installs/eabi/QtScriptu.def b/src/s60installs/eabi/QtScriptu.def
index 1205c04..1592664 100644
--- a/src/s60installs/eabi/QtScriptu.def
+++ b/src/s60installs/eabi/QtScriptu.def
@@ -1,43 +1,43 @@
EXPORTS
_Z14qScriptConnectP7QObjectPKcRK12QScriptValueS5_ @ 1 NONAME
- _Z14qt_scriptToXmlRK7QStringi @ 2 NONAME ABSENT
- _Z17qScriptDisconnectP7QObjectPKcRK12QScriptValueS5_ @ 3 NONAME
- _ZN11QScriptableC1Ev @ 4 NONAME
- _ZN11QScriptableC2Ev @ 5 NONAME
- _ZN11QScriptableD1Ev @ 6 NONAME
- _ZN11QScriptableD2Ev @ 7 NONAME
- _ZN12QScriptClass11newIteratorERK12QScriptValue @ 8 NONAME
- _ZN12QScriptClass11setPropertyER12QScriptValueRK13QScriptStringjRKS0_ @ 9 NONAME
- _ZN12QScriptClass13propertyFlagsERK12QScriptValueRK13QScriptStringj @ 10 NONAME
- _ZN12QScriptClass13queryPropertyERK12QScriptValueRK13QScriptString6QFlagsINS_9QueryFlagEEPj @ 11 NONAME
- _ZN12QScriptClass8propertyERK12QScriptValueRK13QScriptStringj @ 12 NONAME
- _ZN12QScriptClass9extensionENS_9ExtensionERK8QVariant @ 13 NONAME
- _ZN12QScriptClassC1EP13QScriptEngine @ 14 NONAME
- _ZN12QScriptClassC1EP13QScriptEngineR19QScriptClassPrivate @ 15 NONAME
- _ZN12QScriptClassC2EP13QScriptEngine @ 16 NONAME
- _ZN12QScriptClassC2EP13QScriptEngineR19QScriptClassPrivate @ 17 NONAME
- _ZN12QScriptClassD0Ev @ 18 NONAME
- _ZN12QScriptClassD1Ev @ 19 NONAME
- _ZN12QScriptClassD2Ev @ 20 NONAME
- _ZN12QScriptValue11setPropertyERK13QScriptStringRKS_RK6QFlagsINS_12PropertyFlagEE @ 21 NONAME
- _ZN12QScriptValue11setPropertyERK7QStringRKS_RK6QFlagsINS_12PropertyFlagEE @ 22 NONAME
- _ZN12QScriptValue11setPropertyEjRKS_RK6QFlagsINS_12PropertyFlagEE @ 23 NONAME
- _ZN12QScriptValue12setPrototypeERKS_ @ 24 NONAME
- _ZN12QScriptValue14setScriptClassEP12QScriptClass @ 25 NONAME
- _ZN12QScriptValue4callERKS_RK5QListIS_E @ 26 NONAME
- _ZN12QScriptValue4callERKS_S1_ @ 27 NONAME
- _ZN12QScriptValue7setDataERKS_ @ 28 NONAME
- _ZN12QScriptValue8setScopeERKS_ @ 29 NONAME
- _ZN12QScriptValue9constructERK5QListIS_E @ 30 NONAME
- _ZN12QScriptValue9constructERKS_ @ 31 NONAME
- _ZN12QScriptValueC1ENS_12SpecialValueE @ 32 NONAME
- _ZN12QScriptValueC1EP13QScriptEngineNS_12SpecialValueE @ 33 NONAME
- _ZN12QScriptValueC1EP13QScriptEnginePKc @ 34 NONAME
- _ZN12QScriptValueC1EP13QScriptEngineRK7QString @ 35 NONAME
- _ZN12QScriptValueC1EP13QScriptEngineb @ 36 NONAME
- _ZN12QScriptValueC1EP13QScriptEngined @ 37 NONAME
- _ZN12QScriptValueC1EP13QScriptEnginei @ 38 NONAME
- _ZN12QScriptValueC1EP13QScriptEnginej @ 39 NONAME
+ _Z17qScriptDisconnectP7QObjectPKcRK12QScriptValueS5_ @ 2 NONAME
+ _ZN11QScriptableC1Ev @ 3 NONAME
+ _ZN11QScriptableC2Ev @ 4 NONAME
+ _ZN11QScriptableD1Ev @ 5 NONAME
+ _ZN11QScriptableD2Ev @ 6 NONAME
+ _ZN12QScriptClass11newIteratorERK12QScriptValue @ 7 NONAME
+ _ZN12QScriptClass11setPropertyER12QScriptValueRK13QScriptStringjRKS0_ @ 8 NONAME
+ _ZN12QScriptClass13propertyFlagsERK12QScriptValueRK13QScriptStringj @ 9 NONAME
+ _ZN12QScriptClass13queryPropertyERK12QScriptValueRK13QScriptString6QFlagsINS_9QueryFlagEEPj @ 10 NONAME
+ _ZN12QScriptClass8propertyERK12QScriptValueRK13QScriptStringj @ 11 NONAME
+ _ZN12QScriptClass9extensionENS_9ExtensionERK8QVariant @ 12 NONAME
+ _ZN12QScriptClassC1EP13QScriptEngine @ 13 NONAME
+ _ZN12QScriptClassC1EP13QScriptEngineR19QScriptClassPrivate @ 14 NONAME
+ _ZN12QScriptClassC2EP13QScriptEngine @ 15 NONAME
+ _ZN12QScriptClassC2EP13QScriptEngineR19QScriptClassPrivate @ 16 NONAME
+ _ZN12QScriptClassD0Ev @ 17 NONAME
+ _ZN12QScriptClassD1Ev @ 18 NONAME
+ _ZN12QScriptClassD2Ev @ 19 NONAME
+ _ZN12QScriptValue11setPropertyERK13QScriptStringRKS_RK6QFlagsINS_12PropertyFlagEE @ 20 NONAME
+ _ZN12QScriptValue11setPropertyERK7QStringRKS_RK6QFlagsINS_12PropertyFlagEE @ 21 NONAME
+ _ZN12QScriptValue11setPropertyEjRKS_RK6QFlagsINS_12PropertyFlagEE @ 22 NONAME
+ _ZN12QScriptValue12setPrototypeERKS_ @ 23 NONAME
+ _ZN12QScriptValue14setScriptClassEP12QScriptClass @ 24 NONAME
+ _ZN12QScriptValue4callERKS_RK5QListIS_E @ 25 NONAME
+ _ZN12QScriptValue4callERKS_S1_ @ 26 NONAME
+ _ZN12QScriptValue7setDataERKS_ @ 27 NONAME
+ _ZN12QScriptValue8setScopeERKS_ @ 28 NONAME
+ _ZN12QScriptValue9constructERK5QListIS_E @ 29 NONAME
+ _ZN12QScriptValue9constructERKS_ @ 30 NONAME
+ _ZN12QScriptValueC1ENS_12SpecialValueE @ 31 NONAME
+ _ZN12QScriptValueC1EP13QScriptEngineNS_12SpecialValueE @ 32 NONAME
+ _ZN12QScriptValueC1EP13QScriptEnginePKc @ 33 NONAME
+ _ZN12QScriptValueC1EP13QScriptEngineRK7QString @ 34 NONAME
+ _ZN12QScriptValueC1EP13QScriptEngineb @ 35 NONAME
+ _ZN12QScriptValueC1EP13QScriptEngined @ 36 NONAME
+ _ZN12QScriptValueC1EP13QScriptEnginei @ 37 NONAME
+ _ZN12QScriptValueC1EP13QScriptEnginej @ 38 NONAME
+ _ZN12QScriptValueC1EP19QScriptValuePrivate @ 39 NONAME
_ZN12QScriptValueC1EPKc @ 40 NONAME
_ZN12QScriptValueC1ERK13QLatin1String @ 41 NONAME
_ZN12QScriptValueC1ERK7QString @ 42 NONAME
@@ -55,550 +55,291 @@ EXPORTS
_ZN12QScriptValueC2EP13QScriptEngined @ 54 NONAME
_ZN12QScriptValueC2EP13QScriptEnginei @ 55 NONAME
_ZN12QScriptValueC2EP13QScriptEnginej @ 56 NONAME
- _ZN12QScriptValueC2EPKc @ 57 NONAME
- _ZN12QScriptValueC2ERK13QLatin1String @ 58 NONAME
- _ZN12QScriptValueC2ERK7QString @ 59 NONAME
- _ZN12QScriptValueC2ERKS_ @ 60 NONAME
- _ZN12QScriptValueC2Eb @ 61 NONAME
- _ZN12QScriptValueC2Ed @ 62 NONAME
- _ZN12QScriptValueC2Ei @ 63 NONAME
- _ZN12QScriptValueC2Ej @ 64 NONAME
- _ZN12QScriptValueC2Ev @ 65 NONAME
- _ZN12QScriptValueD1Ev @ 66 NONAME
- _ZN12QScriptValueD2Ev @ 67 NONAME
- _ZN12QScriptValueaSERKS_ @ 68 NONAME
- _ZN13QScriptEngine10newQObjectEP7QObjectNS_14ValueOwnershipERK6QFlagsINS_17QObjectWrapOptionEE @ 69 NONAME
- _ZN13QScriptEngine10newQObjectERK12QScriptValueP7QObjectNS_14ValueOwnershipERK6QFlagsINS_17QObjectWrapOptionEE @ 70 NONAME
- _ZN13QScriptEngine10newVariantERK12QScriptValueRK8QVariant @ 71 NONAME
- _ZN13QScriptEngine10newVariantERK8QVariant @ 72 NONAME
- _ZN13QScriptEngine10popContextEv @ 73 NONAME
- _ZN13QScriptEngine11checkSyntaxERK7QString @ 74 NONAME
- _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_ERKS0_i @ 75 NONAME
- _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_Ei @ 76 NONAME
- _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_PvES4_ @ 77 NONAME
- _ZN13QScriptEngine11pushContextEv @ 78 NONAME
- _ZN13QScriptEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 79 NONAME
- _ZN13QScriptEngine11qt_metacastEPKc @ 80 NONAME
- _ZN13QScriptEngine14collectGarbageEv @ 81 NONAME
- _ZN13QScriptEngine14newQMetaObjectEPK11QMetaObjectRK12QScriptValue @ 82 NONAME
- _ZN13QScriptEngine14toStringHandleERK7QString @ 83 NONAME
- _ZN13QScriptEngine14undefinedValueEv @ 84 NONAME
- _ZN13QScriptEngine15abortEvaluationERK12QScriptValue @ 85 NONAME
- _ZN13QScriptEngine15clearExceptionsEv @ 86 NONAME
- _ZN13QScriptEngine15importExtensionERK7QString @ 87 NONAME
- _ZN13QScriptEngine15setGlobalObjectERK12QScriptValue @ 88 NONAME
- _ZN13QScriptEngine16staticMetaObjectE @ 89 NONAME DATA 16
- _ZN13QScriptEngine18registerCustomTypeEiPF12QScriptValuePS_PKvEPFvRKS0_PvES7_ @ 90 NONAME
- _ZN13QScriptEngine19newActivationObjectEv @ 91 NONAME
- _ZN13QScriptEngine19setDefaultPrototypeEiRK12QScriptValue @ 92 NONAME
- _ZN13QScriptEngine22signalHandlerExceptionERK12QScriptValue @ 93 NONAME
- _ZN13QScriptEngine24setProcessEventsIntervalEi @ 94 NONAME
- _ZN13QScriptEngine26installTranslatorFunctionsERK12QScriptValue @ 95 NONAME
- _ZN13QScriptEngine6createEiPKv @ 96 NONAME
- _ZN13QScriptEngine7convertERK12QScriptValueiPv @ 97 NONAME
- _ZN13QScriptEngine7newDateERK9QDateTime @ 98 NONAME
- _ZN13QScriptEngine7newDateEd @ 99 NONAME
- _ZN13QScriptEngine8evaluateERK7QStringS2_i @ 100 NONAME
- _ZN13QScriptEngine8newArrayEj @ 101 NONAME
- _ZN13QScriptEngine8setAgentEP18QScriptEngineAgent @ 102 NONAME
- _ZN13QScriptEngine8toObjectERK12QScriptValue @ 103 NONAME
- _ZN13QScriptEngine9convertV2ERK12QScriptValueiPv @ 104 NONAME
- _ZN13QScriptEngine9newObjectEP12QScriptClassRK12QScriptValue @ 105 NONAME
- _ZN13QScriptEngine9newObjectEv @ 106 NONAME
- _ZN13QScriptEngine9newRegExpERK7QRegExp @ 107 NONAME
- _ZN13QScriptEngine9newRegExpERK7QStringS2_ @ 108 NONAME
- _ZN13QScriptEngine9nullValueEv @ 109 NONAME
- _ZN13QScriptEngineC1EP7QObject @ 110 NONAME
- _ZN13QScriptEngineC1ER20QScriptEnginePrivateP7QObject @ 111 NONAME
- _ZN13QScriptEngineC1Ev @ 112 NONAME
- _ZN13QScriptEngineC2EP7QObject @ 113 NONAME
- _ZN13QScriptEngineC2ER20QScriptEnginePrivateP7QObject @ 114 NONAME
- _ZN13QScriptEngineC2Ev @ 115 NONAME
- _ZN13QScriptEngineD0Ev @ 116 NONAME
- _ZN13QScriptEngineD1Ev @ 117 NONAME
- _ZN13QScriptEngineD2Ev @ 118 NONAME
- _ZN13QScriptStringC1ERKS_ @ 119 NONAME
- _ZN13QScriptStringC1Ev @ 120 NONAME
- _ZN13QScriptStringC2ERKS_ @ 121 NONAME
- _ZN13QScriptStringC2Ev @ 122 NONAME
- _ZN13QScriptStringD1Ev @ 123 NONAME
- _ZN13QScriptStringD2Ev @ 124 NONAME
- _ZN13QScriptStringaSERKS_ @ 125 NONAME
- _ZN14QScriptContext10throwErrorENS_5ErrorERK7QString @ 126 NONAME
- _ZN14QScriptContext10throwErrorERK7QString @ 127 NONAME
- _ZN14QScriptContext10throwValueERK12QScriptValue @ 128 NONAME
- _ZN14QScriptContext13setThisObjectERK12QScriptValue @ 129 NONAME
- _ZN14QScriptContext14setReturnValueERK12QScriptValue @ 130 NONAME
- _ZN14QScriptContext19setActivationObjectERK12QScriptValue @ 131 NONAME
- _ZN14QScriptContext8popScopeEv @ 132 NONAME
- _ZN14QScriptContext9pushScopeERK12QScriptValue @ 133 NONAME
- _ZN14QScriptContextC1Ev @ 134 NONAME
- _ZN14QScriptContextC2Ev @ 135 NONAME
- _ZN14QScriptContextD1Ev @ 136 NONAME
- _ZN14QScriptContextD2Ev @ 137 NONAME
- _ZN18QScriptContextInfoC1EPK14QScriptContext @ 138 NONAME
- _ZN18QScriptContextInfoC1ERKS_ @ 139 NONAME
- _ZN18QScriptContextInfoC1Ev @ 140 NONAME
- _ZN18QScriptContextInfoC2EPK14QScriptContext @ 141 NONAME
- _ZN18QScriptContextInfoC2ERKS_ @ 142 NONAME
- _ZN18QScriptContextInfoC2Ev @ 143 NONAME
- _ZN18QScriptContextInfoD1Ev @ 144 NONAME
- _ZN18QScriptContextInfoD2Ev @ 145 NONAME
- _ZN18QScriptContextInfoaSERKS_ @ 146 NONAME
- _ZN18QScriptEngineAgent10contextPopEv @ 147 NONAME
- _ZN18QScriptEngineAgent10scriptLoadExRK7QStringS2_i @ 148 NONAME
- _ZN18QScriptEngineAgent11contextPushEv @ 149 NONAME
- _ZN18QScriptEngineAgent12functionExitExRK12QScriptValue @ 150 NONAME
- _ZN18QScriptEngineAgent12scriptUnloadEx @ 151 NONAME
- _ZN18QScriptEngineAgent13functionEntryEx @ 152 NONAME
- _ZN18QScriptEngineAgent14exceptionCatchExRK12QScriptValue @ 153 NONAME
- _ZN18QScriptEngineAgent14exceptionThrowExRK12QScriptValueb @ 154 NONAME
- _ZN18QScriptEngineAgent14positionChangeExii @ 155 NONAME
- _ZN18QScriptEngineAgent9extensionENS_9ExtensionERK8QVariant @ 156 NONAME
- _ZN18QScriptEngineAgentC1EP13QScriptEngine @ 157 NONAME
- _ZN18QScriptEngineAgentC1ER25QScriptEngineAgentPrivateP13QScriptEngine @ 158 NONAME
- _ZN18QScriptEngineAgentC2EP13QScriptEngine @ 159 NONAME
- _ZN18QScriptEngineAgentC2ER25QScriptEngineAgentPrivateP13QScriptEngine @ 160 NONAME
- _ZN18QScriptEngineAgentD0Ev @ 161 NONAME
- _ZN18QScriptEngineAgentD1Ev @ 162 NONAME
- _ZN18QScriptEngineAgentD2Ev @ 163 NONAME
- _ZN20QScriptValueIterator4nextEv @ 164 NONAME
- _ZN20QScriptValueIterator6removeEv @ 165 NONAME
- _ZN20QScriptValueIterator6toBackEv @ 166 NONAME
- _ZN20QScriptValueIterator7toFrontEv @ 167 NONAME
- _ZN20QScriptValueIterator8previousEv @ 168 NONAME
- _ZN20QScriptValueIterator8setValueERK12QScriptValue @ 169 NONAME
- _ZN20QScriptValueIteratorC1ERK12QScriptValue @ 170 NONAME
- _ZN20QScriptValueIteratorC2ERK12QScriptValue @ 171 NONAME
- _ZN20QScriptValueIteratorD1Ev @ 172 NONAME
- _ZN20QScriptValueIteratorD2Ev @ 173 NONAME
- _ZN20QScriptValueIteratoraSER12QScriptValue @ 174 NONAME
- _ZN22QScriptExtensionPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 175 NONAME
- _ZN22QScriptExtensionPlugin11qt_metacastEPKc @ 176 NONAME
- _ZN22QScriptExtensionPlugin16staticMetaObjectE @ 177 NONAME DATA 16
- _ZN22QScriptExtensionPluginC2EP7QObject @ 178 NONAME
- _ZN22QScriptExtensionPluginD0Ev @ 179 NONAME
- _ZN22QScriptExtensionPluginD1Ev @ 180 NONAME
- _ZN22QScriptExtensionPluginD2Ev @ 181 NONAME
- _ZN24QScriptSyntaxCheckResultC1EP31QScriptSyntaxCheckResultPrivate @ 182 NONAME
- _ZN24QScriptSyntaxCheckResultC1ERKS_ @ 183 NONAME
- _ZN24QScriptSyntaxCheckResultC1Ev @ 184 NONAME
- _ZN24QScriptSyntaxCheckResultC2EP31QScriptSyntaxCheckResultPrivate @ 185 NONAME
- _ZN24QScriptSyntaxCheckResultC2ERKS_ @ 186 NONAME
- _ZN24QScriptSyntaxCheckResultC2Ev @ 187 NONAME
- _ZN24QScriptSyntaxCheckResultD1Ev @ 188 NONAME
- _ZN24QScriptSyntaxCheckResultD2Ev @ 189 NONAME
- _ZN24QScriptSyntaxCheckResultaSERKS_ @ 190 NONAME
- _ZN25QScriptEngineAgentPrivateC1Ev @ 191 NONAME ABSENT
- _ZN25QScriptEngineAgentPrivateC2Ev @ 192 NONAME ABSENT
- _ZN25QScriptEngineAgentPrivateD0Ev @ 193 NONAME ABSENT
- _ZN25QScriptEngineAgentPrivateD1Ev @ 194 NONAME ABSENT
- _ZN25QScriptEngineAgentPrivateD2Ev @ 195 NONAME ABSENT
- _ZN28QScriptClassPropertyIteratorC2ERK12QScriptValue @ 196 NONAME
- _ZN28QScriptClassPropertyIteratorC2ERK12QScriptValueR35QScriptClassPropertyIteratorPrivate @ 197 NONAME
- _ZN28QScriptClassPropertyIteratorD0Ev @ 198 NONAME
- _ZN28QScriptClassPropertyIteratorD1Ev @ 199 NONAME
- _ZN28QScriptClassPropertyIteratorD2Ev @ 200 NONAME
- _ZNK11QScriptable10thisObjectEv @ 201 NONAME
- _ZNK11QScriptable13argumentCountEv @ 202 NONAME
- _ZNK11QScriptable6engineEv @ 203 NONAME
- _ZNK11QScriptable7contextEv @ 204 NONAME
- _ZNK11QScriptable8argumentEi @ 205 NONAME
- _ZNK12QScriptClass17supportsExtensionENS_9ExtensionE @ 206 NONAME
- _ZNK12QScriptClass4nameEv @ 207 NONAME
- _ZNK12QScriptClass6engineEv @ 208 NONAME
- _ZNK12QScriptClass9prototypeEv @ 209 NONAME
- _ZNK12QScriptValue10instanceOfERKS_ @ 210 NONAME
- _ZNK12QScriptValue10isFunctionEv @ 211 NONAME
- _ZNK12QScriptValue10toDateTimeEv @ 212 NONAME
- _ZNK12QScriptValue11isUndefinedEv @ 213 NONAME
- _ZNK12QScriptValue11scriptClassEv @ 214 NONAME
- _ZNK12QScriptValue13isQMetaObjectEv @ 215 NONAME
- _ZNK12QScriptValue13propertyFlagsERK13QScriptStringRK6QFlagsINS_11ResolveFlagEE @ 216 NONAME
- _ZNK12QScriptValue13propertyFlagsERK7QStringRK6QFlagsINS_11ResolveFlagEE @ 217 NONAME
- _ZNK12QScriptValue13toQMetaObjectEv @ 218 NONAME
- _ZNK12QScriptValue14strictlyEqualsERKS_ @ 219 NONAME
- _ZNK12QScriptValue4dataEv @ 220 NONAME
- _ZNK12QScriptValue5scopeEv @ 221 NONAME
- _ZNK12QScriptValue6engineEv @ 222 NONAME
- _ZNK12QScriptValue6equalsERKS_ @ 223 NONAME
- _ZNK12QScriptValue6isBoolEv @ 224 NONAME
- _ZNK12QScriptValue6isDateEv @ 225 NONAME
- _ZNK12QScriptValue6isNullEv @ 226 NONAME
- _ZNK12QScriptValue6toBoolEv @ 227 NONAME
- _ZNK12QScriptValue7isArrayEv @ 228 NONAME
- _ZNK12QScriptValue7isErrorEv @ 229 NONAME
- _ZNK12QScriptValue7isValidEv @ 230 NONAME
- _ZNK12QScriptValue7toInt32Ev @ 231 NONAME
- _ZNK12QScriptValue8isNumberEv @ 232 NONAME
- _ZNK12QScriptValue8isObjectEv @ 233 NONAME
- _ZNK12QScriptValue8isRegExpEv @ 234 NONAME
- _ZNK12QScriptValue8isStringEv @ 235 NONAME
- _ZNK12QScriptValue8lessThanERKS_ @ 236 NONAME
- _ZNK12QScriptValue8objectIdEv @ 237 NONAME
- _ZNK12QScriptValue8propertyERK13QScriptStringRK6QFlagsINS_11ResolveFlagEE @ 238 NONAME
- _ZNK12QScriptValue8propertyERK7QStringRK6QFlagsINS_11ResolveFlagEE @ 239 NONAME
- _ZNK12QScriptValue8propertyEjRK6QFlagsINS_11ResolveFlagEE @ 240 NONAME
- _ZNK12QScriptValue8toNumberEv @ 241 NONAME
- _ZNK12QScriptValue8toObjectEv @ 242 NONAME
- _ZNK12QScriptValue8toRegExpEv @ 243 NONAME
- _ZNK12QScriptValue8toStringEv @ 244 NONAME
- _ZNK12QScriptValue8toUInt16Ev @ 245 NONAME
- _ZNK12QScriptValue8toUInt32Ev @ 246 NONAME
- _ZNK12QScriptValue9isBooleanEv @ 247 NONAME
- _ZNK12QScriptValue9isQObjectEv @ 248 NONAME
- _ZNK12QScriptValue9isVariantEv @ 249 NONAME
- _ZNK12QScriptValue9prototypeEv @ 250 NONAME
- _ZNK12QScriptValue9toBooleanEv @ 251 NONAME
- _ZNK12QScriptValue9toIntegerEv @ 252 NONAME
- _ZNK12QScriptValue9toQObjectEv @ 253 NONAME
- _ZNK12QScriptValue9toVariantEv @ 254 NONAME
- _ZNK13QScriptEngine10metaObjectEv @ 255 NONAME
- _ZNK13QScriptEngine10objectByIdEx @ 256 NONAME
- _ZNK13QScriptEngine11canEvaluateERK7QString @ 257 NONAME
- _ZNK13QScriptEngine12globalObjectEv @ 258 NONAME
- _ZNK13QScriptEngine12isEvaluatingEv @ 259 NONAME
- _ZNK13QScriptEngine14currentContextEv @ 260 NONAME
- _ZNK13QScriptEngine16defaultPrototypeEi @ 261 NONAME
- _ZNK13QScriptEngine17uncaughtExceptionEv @ 262 NONAME
- _ZNK13QScriptEngine18importedExtensionsEv @ 263 NONAME
- _ZNK13QScriptEngine19availableExtensionsEv @ 264 NONAME
- _ZNK13QScriptEngine20hasUncaughtExceptionEv @ 265 NONAME
- _ZNK13QScriptEngine21processEventsIntervalEv @ 266 NONAME
- _ZNK13QScriptEngine26uncaughtExceptionBacktraceEv @ 267 NONAME
- _ZNK13QScriptEngine27uncaughtExceptionLineNumberEv @ 268 NONAME
- _ZNK13QScriptEngine5agentEv @ 269 NONAME
- _ZNK13QScriptString7isValidEv @ 270 NONAME
- _ZNK13QScriptString8toStringEv @ 271 NONAME
- _ZNK13QScriptStringcv7QStringEv @ 272 NONAME
- _ZNK13QScriptStringeqERKS_ @ 273 NONAME
- _ZNK13QScriptStringneERKS_ @ 274 NONAME
- _ZNK14QScriptContext10scopeChainEv @ 275 NONAME
- _ZNK14QScriptContext10thisObjectEv @ 276 NONAME
- _ZNK14QScriptContext11returnValueEv @ 277 NONAME
- _ZNK14QScriptContext13argumentCountEv @ 278 NONAME
- _ZNK14QScriptContext13parentContextEv @ 279 NONAME
- _ZNK14QScriptContext15argumentsObjectEv @ 280 NONAME
- _ZNK14QScriptContext16activationObjectEv @ 281 NONAME
- _ZNK14QScriptContext21isCalledAsConstructorEv @ 282 NONAME
- _ZNK14QScriptContext5stateEv @ 283 NONAME
- _ZNK14QScriptContext6calleeEv @ 284 NONAME
- _ZNK14QScriptContext6engineEv @ 285 NONAME
- _ZNK14QScriptContext8argumentEi @ 286 NONAME
- _ZNK14QScriptContext8toStringEv @ 287 NONAME
- _ZNK14QScriptContext9backtraceEv @ 288 NONAME
- _ZNK18QScriptContextInfo10lineNumberEv @ 289 NONAME
- _ZNK18QScriptContextInfo12columnNumberEv @ 290 NONAME
- _ZNK18QScriptContextInfo12functionNameEv @ 291 NONAME
- _ZNK18QScriptContextInfo12functionTypeEv @ 292 NONAME
- _ZNK18QScriptContextInfo17functionMetaIndexEv @ 293 NONAME
- _ZNK18QScriptContextInfo21functionEndLineNumberEv @ 294 NONAME
- _ZNK18QScriptContextInfo22functionParameterNamesEv @ 295 NONAME
- _ZNK18QScriptContextInfo23functionStartLineNumberEv @ 296 NONAME
- _ZNK18QScriptContextInfo6isNullEv @ 297 NONAME
- _ZNK18QScriptContextInfo8fileNameEv @ 298 NONAME
- _ZNK18QScriptContextInfo8scriptIdEv @ 299 NONAME
- _ZNK18QScriptContextInfoeqERKS_ @ 300 NONAME
- _ZNK18QScriptContextInfoneERKS_ @ 301 NONAME
- _ZNK18QScriptEngineAgent17supportsExtensionENS_9ExtensionE @ 302 NONAME
- _ZNK18QScriptEngineAgent6engineEv @ 303 NONAME
- _ZNK20QScriptValueIterator10scriptNameEv @ 304 NONAME
- _ZNK20QScriptValueIterator11hasPreviousEv @ 305 NONAME
- _ZNK20QScriptValueIterator4nameEv @ 306 NONAME
- _ZNK20QScriptValueIterator5flagsEv @ 307 NONAME
- _ZNK20QScriptValueIterator5valueEv @ 308 NONAME
- _ZNK20QScriptValueIterator7hasNextEv @ 309 NONAME
- _ZNK22QScriptExtensionPlugin10metaObjectEv @ 310 NONAME
- _ZNK22QScriptExtensionPlugin12setupPackageERK7QStringP13QScriptEngine @ 311 NONAME
- _ZNK24QScriptSyntaxCheckResult12errorMessageEv @ 312 NONAME
- _ZNK24QScriptSyntaxCheckResult15errorLineNumberEv @ 313 NONAME
- _ZNK24QScriptSyntaxCheckResult17errorColumnNumberEv @ 314 NONAME
- _ZNK24QScriptSyntaxCheckResult5stateEv @ 315 NONAME
- _ZNK28QScriptClassPropertyIterator2idEv @ 316 NONAME
- _ZNK28QScriptClassPropertyIterator5flagsEv @ 317 NONAME
- _ZNK28QScriptClassPropertyIterator6objectEv @ 318 NONAME
- _ZTI12QScriptClass @ 319 NONAME
- _ZTI13QScriptEngine @ 320 NONAME
- _ZTI15QScriptFunction @ 321 NONAME ABSENT
- _ZTI16QScriptClassData @ 322 NONAME ABSENT
- _ZTI18QScriptEngineAgent @ 323 NONAME
- _ZTI19QScriptClassPrivate @ 324 NONAME ABSENT
- _ZTI20QScriptEnginePrivate @ 325 NONAME ABSENT
- _ZTI22QScriptCustomClassData @ 326 NONAME ABSENT
- _ZTI22QScriptExtensionPlugin @ 327 NONAME
- _ZTI24QScriptClassDataIterator @ 328 NONAME ABSENT
- _ZTI25QScriptEngineAgentPrivate @ 329 NONAME
- _ZTI25QScriptExtensionInterface @ 330 NONAME
- _ZTI28QScriptClassPropertyIterator @ 331 NONAME
- _ZTI30QScriptCustomClassDataIterator @ 332 NONAME ABSENT
- _ZTI35QScriptClassPropertyIteratorPrivate @ 333 NONAME ABSENT
- _ZTIN7QScript10C2FunctionE @ 334 NONAME ABSENT
- _ZTIN7QScript10C3FunctionE @ 335 NONAME ABSENT
- _ZTIN7QScript10ExtQObject8InstanceE @ 336 NONAME ABSENT
- _ZTIN7QScript10ExtQObjectE @ 337 NONAME ABSENT
- _ZTIN7QScript10QtFunctionE @ 338 NONAME ABSENT
- _ZTIN7QScript12PrettyPrettyE @ 339 NONAME ABSENT
- _ZTIN7QScript12XmlGeneratorE @ 340 NONAME ABSENT
- _ZTIN7QScript14ExtQMetaObject8InstanceE @ 341 NONAME ABSENT
- _ZTIN7QScript14ExtQMetaObjectE @ 342 NONAME ABSENT
- _ZTIN7QScript14ScriptFunctionE @ 343 NONAME ABSENT
- _ZTIN7QScript16QObjectPrototypeE @ 344 NONAME ABSENT
- _ZTIN7QScript18ArgumentsClassDataE @ 345 NONAME ABSENT
- _ZTIN7QScript18ExtQMetaObjectDataE @ 346 NONAME ABSENT
- _ZTIN7QScript18QtPropertyFunctionE @ 347 NONAME ABSENT
- _ZTIN7QScript22ExtQObjectDataIteratorE @ 348 NONAME ABSENT
- _ZTIN7QScript24QObjectConnectionManagerE @ 349 NONAME ABSENT
- _ZTIN7QScript26ArgumentsClassDataIteratorE @ 350 NONAME ABSENT
- _ZTIN7QScript3AST10CaseClauseE @ 351 NONAME ABSENT
- _ZTIN7QScript3AST10ExpressionE @ 352 NONAME ABSENT
- _ZTIN7QScript3AST11CaseClausesE @ 353 NONAME ABSENT
- _ZTIN7QScript3AST11ElementListE @ 354 NONAME ABSENT
- _ZTIN7QScript3AST11IfStatementE @ 355 NONAME ABSENT
- _ZTIN7QScript3AST11TrueLiteralE @ 356 NONAME ABSENT
- _ZTIN7QScript3AST12ArgumentListE @ 357 NONAME ABSENT
- _ZTIN7QScript3AST12ArrayLiteralE @ 358 NONAME ABSENT
- _ZTIN7QScript3AST12FalseLiteralE @ 359 NONAME ABSENT
- _ZTIN7QScript3AST12ForStatementE @ 360 NONAME ABSENT
- _ZTIN7QScript3AST12FunctionBodyE @ 361 NONAME ABSENT
- _ZTIN7QScript3AST12TryStatementE @ 362 NONAME ABSENT
- _ZTIN7QScript3AST13DefaultClauseE @ 363 NONAME ABSENT
- _ZTIN7QScript3AST13NewExpressionE @ 364 NONAME ABSENT
- _ZTIN7QScript3AST13NotExpressionE @ 365 NONAME ABSENT
- _ZTIN7QScript3AST13ObjectLiteralE @ 366 NONAME ABSENT
- _ZTIN7QScript3AST13RegExpLiteralE @ 367 NONAME ABSENT
- _ZTIN7QScript3AST13StatementListE @ 368 NONAME ABSENT
- _ZTIN7QScript3AST13StringLiteralE @ 369 NONAME ABSENT
- _ZTIN7QScript3AST13WithStatementE @ 370 NONAME ABSENT
- _ZTIN7QScript3AST14BreakStatementE @ 371 NONAME ABSENT
- _ZTIN7QScript3AST14CallExpressionE @ 372 NONAME ABSENT
- _ZTIN7QScript3AST14EmptyStatementE @ 373 NONAME ABSENT
- _ZTIN7QScript3AST14ExpressionNodeE @ 374 NONAME ABSENT
- _ZTIN7QScript3AST14NullExpressionE @ 375 NONAME ABSENT
- _ZTIN7QScript3AST14NumericLiteralE @ 376 NONAME ABSENT
- _ZTIN7QScript3AST14SourceElementsE @ 377 NONAME ABSENT
- _ZTIN7QScript3AST14ThisExpressionE @ 378 NONAME ABSENT
- _ZTIN7QScript3AST14ThrowStatementE @ 379 NONAME ABSENT
- _ZTIN7QScript3AST14VoidExpressionE @ 380 NONAME ABSENT
- _ZTIN7QScript3AST14WhileStatementE @ 381 NONAME ABSENT
- _ZTIN7QScript3AST15ReturnStatementE @ 382 NONAME ABSENT
- _ZTIN7QScript3AST15SwitchStatementE @ 383 NONAME ABSENT
- _ZTIN7QScript3AST15TildeExpressionE @ 384 NONAME ABSENT
- _ZTIN7QScript3AST16BinaryExpressionE @ 385 NONAME ABSENT
- _ZTIN7QScript3AST16DeleteExpressionE @ 386 NONAME ABSENT
- _ZTIN7QScript3AST16DoWhileStatementE @ 387 NONAME ABSENT
- _ZTIN7QScript3AST16ForEachStatementE @ 388 NONAME ABSENT
- _ZTIN7QScript3AST16TypeOfExpressionE @ 389 NONAME ABSENT
- _ZTIN7QScript3AST17ContinueStatementE @ 390 NONAME ABSENT
- _ZTIN7QScript3AST17DebuggerStatementE @ 391 NONAME ABSENT
- _ZTIN7QScript3AST17LabelledStatementE @ 392 NONAME ABSENT
- _ZTIN7QScript3AST17LocalForStatementE @ 393 NONAME ABSENT
- _ZTIN7QScript3AST17VariableStatementE @ 394 NONAME ABSENT
- _ZTIN7QScript3AST18FunctionExpressionE @ 395 NONAME ABSENT
- _ZTIN7QScript3AST19ExpressionStatementE @ 396 NONAME ABSENT
- _ZTIN7QScript3AST19FormalParameterListE @ 397 NONAME ABSENT
- _ZTIN7QScript3AST19FunctionDeclarationE @ 398 NONAME ABSENT
- _ZTIN7QScript3AST19NewMemberExpressionE @ 399 NONAME ABSENT
- _ZTIN7QScript3AST19UnaryPlusExpressionE @ 400 NONAME ABSENT
- _ZTIN7QScript3AST19VariableDeclarationE @ 401 NONAME ABSENT
- _ZTIN7QScript3AST20IdentifierExpressionE @ 402 NONAME ABSENT
- _ZTIN7QScript3AST20UnaryMinusExpressionE @ 403 NONAME ABSENT
- _ZTIN7QScript3AST21ArrayMemberExpressionE @ 404 NONAME ABSENT
- _ZTIN7QScript3AST21ConditionalExpressionE @ 405 NONAME ABSENT
- _ZTIN7QScript3AST21FieldMemberExpressionE @ 406 NONAME ABSENT
- _ZTIN7QScript3AST21FunctionSourceElementE @ 407 NONAME ABSENT
- _ZTIN7QScript3AST21LocalForEachStatementE @ 408 NONAME ABSENT
- _ZTIN7QScript3AST22IdentifierPropertyNameE @ 409 NONAME ABSENT
- _ZTIN7QScript3AST22PreDecrementExpressionE @ 410 NONAME ABSENT
- _ZTIN7QScript3AST22PreIncrementExpressionE @ 411 NONAME ABSENT
- _ZTIN7QScript3AST22StatementSourceElementE @ 412 NONAME ABSENT
- _ZTIN7QScript3AST23PostDecrementExpressionE @ 413 NONAME ABSENT
- _ZTIN7QScript3AST23PostIncrementExpressionE @ 414 NONAME ABSENT
- _ZTIN7QScript3AST23VariableDeclarationListE @ 415 NONAME ABSENT
- _ZTIN7QScript3AST24PropertyNameAndValueListE @ 416 NONAME ABSENT
- _ZTIN7QScript3AST25StringLiteralPropertyNameE @ 417 NONAME ABSENT
- _ZTIN7QScript3AST26NumericLiteralPropertyNameE @ 418 NONAME ABSENT
- _ZTIN7QScript3AST4NodeE @ 419 NONAME ABSENT
- _ZTIN7QScript3AST5BlockE @ 420 NONAME ABSENT
- _ZTIN7QScript3AST5CatchE @ 421 NONAME ABSENT
- _ZTIN7QScript3AST7ElisionE @ 422 NONAME ABSENT
- _ZTIN7QScript3AST7FinallyE @ 423 NONAME ABSENT
- _ZTIN7QScript3AST7ProgramE @ 424 NONAME ABSENT
- _ZTIN7QScript3AST7VisitorE @ 425 NONAME ABSENT
- _ZTIN7QScript3AST9CaseBlockE @ 426 NONAME ABSENT
- _ZTIN7QScript3AST9StatementE @ 427 NONAME ABSENT
- _ZTIN7QScript3Ext11Enumeration8InstanceE @ 428 NONAME ABSENT
- _ZTIN7QScript3Ext11EnumerationE @ 429 NONAME ABSENT
- _ZTIN7QScript3Ext20EnumerationClassDataE @ 430 NONAME ABSENT
- _ZTIN7QScript3Ext7VariantE @ 431 NONAME ABSENT
- _ZTIN7QScript4Ecma14ArrayClassDataE @ 432 NONAME ABSENT
- _ZTIN7QScript4Ecma15StringClassDataE @ 433 NONAME ABSENT
- _ZTIN7QScript4Ecma17FunctionClassDataE @ 434 NONAME ABSENT
- _ZTIN7QScript4Ecma22ArrayClassDataIteratorE @ 435 NONAME ABSENT
- _ZTIN7QScript4Ecma23StringClassDataIteratorE @ 436 NONAME ABSENT
- _ZTIN7QScript4Ecma4CoreE @ 437 NONAME ABSENT
- _ZTIN7QScript4Ecma4DateE @ 438 NONAME ABSENT
- _ZTIN7QScript4Ecma4MathE @ 439 NONAME ABSENT
- _ZTIN7QScript4Ecma5ArrayE @ 440 NONAME ABSENT
- _ZTIN7QScript4Ecma5ErrorE @ 441 NONAME ABSENT
- _ZTIN7QScript4Ecma6GlobalE @ 442 NONAME ABSENT
- _ZTIN7QScript4Ecma6NumberE @ 443 NONAME ABSENT
- _ZTIN7QScript4Ecma6ObjectE @ 444 NONAME ABSENT
- _ZTIN7QScript4Ecma6RegExpE @ 445 NONAME ABSENT
- _ZTIN7QScript4Ecma6StringE @ 446 NONAME ABSENT
- _ZTIN7QScript4Ecma7BooleanE @ 447 NONAME ABSENT
- _ZTIN7QScript4Ecma8FunctionE @ 448 NONAME ABSENT
- _ZTIN7QScript8CompilerE @ 449 NONAME ABSENT
- _ZTIN7QScript8NodePoolE @ 450 NONAME ABSENT
- _ZTIN7QScript9CFunctionE @ 451 NONAME ABSENT
- _ZTV12QScriptClass @ 452 NONAME
- _ZTV13QScriptEngine @ 453 NONAME
- _ZTV15QScriptFunction @ 454 NONAME ABSENT
- _ZTV16QScriptClassData @ 455 NONAME ABSENT
- _ZTV18QScriptEngineAgent @ 456 NONAME
- _ZTV19QScriptClassPrivate @ 457 NONAME ABSENT
- _ZTV20QScriptEnginePrivate @ 458 NONAME ABSENT
- _ZTV22QScriptCustomClassData @ 459 NONAME ABSENT
- _ZTV22QScriptExtensionPlugin @ 460 NONAME
- _ZTV24QScriptClassDataIterator @ 461 NONAME ABSENT
- _ZTV25QScriptEngineAgentPrivate @ 462 NONAME
- _ZTV28QScriptClassPropertyIterator @ 463 NONAME
- _ZTV30QScriptCustomClassDataIterator @ 464 NONAME ABSENT
- _ZTV35QScriptClassPropertyIteratorPrivate @ 465 NONAME ABSENT
- _ZTVN7QScript10C2FunctionE @ 466 NONAME ABSENT
- _ZTVN7QScript10C3FunctionE @ 467 NONAME ABSENT
- _ZTVN7QScript10ExtQObject8InstanceE @ 468 NONAME ABSENT
- _ZTVN7QScript10ExtQObjectE @ 469 NONAME ABSENT
- _ZTVN7QScript10QtFunctionE @ 470 NONAME ABSENT
- _ZTVN7QScript12PrettyPrettyE @ 471 NONAME ABSENT
- _ZTVN7QScript12XmlGeneratorE @ 472 NONAME ABSENT
- _ZTVN7QScript14ExtQMetaObject8InstanceE @ 473 NONAME ABSENT
- _ZTVN7QScript14ExtQMetaObjectE @ 474 NONAME ABSENT
- _ZTVN7QScript14ScriptFunctionE @ 475 NONAME ABSENT
- _ZTVN7QScript16QObjectPrototypeE @ 476 NONAME ABSENT
- _ZTVN7QScript18ArgumentsClassDataE @ 477 NONAME ABSENT
- _ZTVN7QScript18ExtQMetaObjectDataE @ 478 NONAME ABSENT
- _ZTVN7QScript18QtPropertyFunctionE @ 479 NONAME ABSENT
- _ZTVN7QScript22ExtQObjectDataIteratorE @ 480 NONAME ABSENT
- _ZTVN7QScript24QObjectConnectionManagerE @ 481 NONAME ABSENT
- _ZTVN7QScript26ArgumentsClassDataIteratorE @ 482 NONAME ABSENT
- _ZTVN7QScript3AST10CaseClauseE @ 483 NONAME ABSENT
- _ZTVN7QScript3AST10ExpressionE @ 484 NONAME ABSENT
- _ZTVN7QScript3AST11CaseClausesE @ 485 NONAME ABSENT
- _ZTVN7QScript3AST11ElementListE @ 486 NONAME ABSENT
- _ZTVN7QScript3AST11IfStatementE @ 487 NONAME ABSENT
- _ZTVN7QScript3AST11TrueLiteralE @ 488 NONAME ABSENT
- _ZTVN7QScript3AST12ArgumentListE @ 489 NONAME ABSENT
- _ZTVN7QScript3AST12ArrayLiteralE @ 490 NONAME ABSENT
- _ZTVN7QScript3AST12FalseLiteralE @ 491 NONAME ABSENT
- _ZTVN7QScript3AST12ForStatementE @ 492 NONAME ABSENT
- _ZTVN7QScript3AST12FunctionBodyE @ 493 NONAME ABSENT
- _ZTVN7QScript3AST12TryStatementE @ 494 NONAME ABSENT
- _ZTVN7QScript3AST13DefaultClauseE @ 495 NONAME ABSENT
- _ZTVN7QScript3AST13NewExpressionE @ 496 NONAME ABSENT
- _ZTVN7QScript3AST13NotExpressionE @ 497 NONAME ABSENT
- _ZTVN7QScript3AST13ObjectLiteralE @ 498 NONAME ABSENT
- _ZTVN7QScript3AST13RegExpLiteralE @ 499 NONAME ABSENT
- _ZTVN7QScript3AST13StatementListE @ 500 NONAME ABSENT
- _ZTVN7QScript3AST13StringLiteralE @ 501 NONAME ABSENT
- _ZTVN7QScript3AST13WithStatementE @ 502 NONAME ABSENT
- _ZTVN7QScript3AST14BreakStatementE @ 503 NONAME ABSENT
- _ZTVN7QScript3AST14CallExpressionE @ 504 NONAME ABSENT
- _ZTVN7QScript3AST14EmptyStatementE @ 505 NONAME ABSENT
- _ZTVN7QScript3AST14ExpressionNodeE @ 506 NONAME ABSENT
- _ZTVN7QScript3AST14NullExpressionE @ 507 NONAME ABSENT
- _ZTVN7QScript3AST14NumericLiteralE @ 508 NONAME ABSENT
- _ZTVN7QScript3AST14SourceElementsE @ 509 NONAME ABSENT
- _ZTVN7QScript3AST14ThisExpressionE @ 510 NONAME ABSENT
- _ZTVN7QScript3AST14ThrowStatementE @ 511 NONAME ABSENT
- _ZTVN7QScript3AST14VoidExpressionE @ 512 NONAME ABSENT
- _ZTVN7QScript3AST14WhileStatementE @ 513 NONAME ABSENT
- _ZTVN7QScript3AST15ReturnStatementE @ 514 NONAME ABSENT
- _ZTVN7QScript3AST15SwitchStatementE @ 515 NONAME ABSENT
- _ZTVN7QScript3AST15TildeExpressionE @ 516 NONAME ABSENT
- _ZTVN7QScript3AST16BinaryExpressionE @ 517 NONAME ABSENT
- _ZTVN7QScript3AST16DeleteExpressionE @ 518 NONAME ABSENT
- _ZTVN7QScript3AST16DoWhileStatementE @ 519 NONAME ABSENT
- _ZTVN7QScript3AST16ForEachStatementE @ 520 NONAME ABSENT
- _ZTVN7QScript3AST16TypeOfExpressionE @ 521 NONAME ABSENT
- _ZTVN7QScript3AST17ContinueStatementE @ 522 NONAME ABSENT
- _ZTVN7QScript3AST17DebuggerStatementE @ 523 NONAME ABSENT
- _ZTVN7QScript3AST17LabelledStatementE @ 524 NONAME ABSENT
- _ZTVN7QScript3AST17LocalForStatementE @ 525 NONAME ABSENT
- _ZTVN7QScript3AST17VariableStatementE @ 526 NONAME ABSENT
- _ZTVN7QScript3AST18FunctionExpressionE @ 527 NONAME ABSENT
- _ZTVN7QScript3AST19ExpressionStatementE @ 528 NONAME ABSENT
- _ZTVN7QScript3AST19FormalParameterListE @ 529 NONAME ABSENT
- _ZTVN7QScript3AST19FunctionDeclarationE @ 530 NONAME ABSENT
- _ZTVN7QScript3AST19NewMemberExpressionE @ 531 NONAME ABSENT
- _ZTVN7QScript3AST19UnaryPlusExpressionE @ 532 NONAME ABSENT
- _ZTVN7QScript3AST19VariableDeclarationE @ 533 NONAME ABSENT
- _ZTVN7QScript3AST20IdentifierExpressionE @ 534 NONAME ABSENT
- _ZTVN7QScript3AST20UnaryMinusExpressionE @ 535 NONAME ABSENT
- _ZTVN7QScript3AST21ArrayMemberExpressionE @ 536 NONAME ABSENT
- _ZTVN7QScript3AST21ConditionalExpressionE @ 537 NONAME ABSENT
- _ZTVN7QScript3AST21FieldMemberExpressionE @ 538 NONAME ABSENT
- _ZTVN7QScript3AST21FunctionSourceElementE @ 539 NONAME ABSENT
- _ZTVN7QScript3AST21LocalForEachStatementE @ 540 NONAME ABSENT
- _ZTVN7QScript3AST22IdentifierPropertyNameE @ 541 NONAME ABSENT
- _ZTVN7QScript3AST22PreDecrementExpressionE @ 542 NONAME ABSENT
- _ZTVN7QScript3AST22PreIncrementExpressionE @ 543 NONAME ABSENT
- _ZTVN7QScript3AST22StatementSourceElementE @ 544 NONAME ABSENT
- _ZTVN7QScript3AST23PostDecrementExpressionE @ 545 NONAME ABSENT
- _ZTVN7QScript3AST23PostIncrementExpressionE @ 546 NONAME ABSENT
- _ZTVN7QScript3AST23VariableDeclarationListE @ 547 NONAME ABSENT
- _ZTVN7QScript3AST24PropertyNameAndValueListE @ 548 NONAME ABSENT
- _ZTVN7QScript3AST25StringLiteralPropertyNameE @ 549 NONAME ABSENT
- _ZTVN7QScript3AST26NumericLiteralPropertyNameE @ 550 NONAME ABSENT
- _ZTVN7QScript3AST4NodeE @ 551 NONAME ABSENT
- _ZTVN7QScript3AST5BlockE @ 552 NONAME ABSENT
- _ZTVN7QScript3AST5CatchE @ 553 NONAME ABSENT
- _ZTVN7QScript3AST7ElisionE @ 554 NONAME ABSENT
- _ZTVN7QScript3AST7FinallyE @ 555 NONAME ABSENT
- _ZTVN7QScript3AST7ProgramE @ 556 NONAME ABSENT
- _ZTVN7QScript3AST7VisitorE @ 557 NONAME ABSENT
- _ZTVN7QScript3AST9CaseBlockE @ 558 NONAME ABSENT
- _ZTVN7QScript3AST9StatementE @ 559 NONAME ABSENT
- _ZTVN7QScript3Ext11Enumeration8InstanceE @ 560 NONAME ABSENT
- _ZTVN7QScript3Ext11EnumerationE @ 561 NONAME ABSENT
- _ZTVN7QScript3Ext20EnumerationClassDataE @ 562 NONAME ABSENT
- _ZTVN7QScript3Ext7VariantE @ 563 NONAME ABSENT
- _ZTVN7QScript4Ecma14ArrayClassDataE @ 564 NONAME ABSENT
- _ZTVN7QScript4Ecma15StringClassDataE @ 565 NONAME ABSENT
- _ZTVN7QScript4Ecma17FunctionClassDataE @ 566 NONAME ABSENT
- _ZTVN7QScript4Ecma22ArrayClassDataIteratorE @ 567 NONAME ABSENT
- _ZTVN7QScript4Ecma23StringClassDataIteratorE @ 568 NONAME ABSENT
- _ZTVN7QScript4Ecma4CoreE @ 569 NONAME ABSENT
- _ZTVN7QScript4Ecma4DateE @ 570 NONAME ABSENT
- _ZTVN7QScript4Ecma4MathE @ 571 NONAME ABSENT
- _ZTVN7QScript4Ecma5ArrayE @ 572 NONAME ABSENT
- _ZTVN7QScript4Ecma5ErrorE @ 573 NONAME ABSENT
- _ZTVN7QScript4Ecma6GlobalE @ 574 NONAME ABSENT
- _ZTVN7QScript4Ecma6NumberE @ 575 NONAME ABSENT
- _ZTVN7QScript4Ecma6ObjectE @ 576 NONAME ABSENT
- _ZTVN7QScript4Ecma6RegExpE @ 577 NONAME ABSENT
- _ZTVN7QScript4Ecma6StringE @ 578 NONAME ABSENT
- _ZTVN7QScript4Ecma7BooleanE @ 579 NONAME ABSENT
- _ZTVN7QScript4Ecma8FunctionE @ 580 NONAME ABSENT
- _ZTVN7QScript8CompilerE @ 581 NONAME ABSENT
- _ZTVN7QScript8NodePoolE @ 582 NONAME ABSENT
- _ZTVN7QScript9CFunctionE @ 583 NONAME ABSENT
- _ZThn8_N22QScriptExtensionPluginD0Ev @ 584 NONAME
- _ZThn8_N22QScriptExtensionPluginD1Ev @ 585 NONAME
- _ZlsR11QDataStreamRK18QScriptContextInfo @ 586 NONAME
- _ZrsR11QDataStreamR18QScriptContextInfo @ 587 NONAME
- _Z22qt_script_isJITEnabledv @ 588 NONAME
- _ZN12QScriptValueC1EP19QScriptValuePrivate @ 589 NONAME
- _ZN12QScriptValueC2EP19QScriptValuePrivate @ 590 NONAME
- _ZN13QScriptEngine19getStaticMetaObjectEv @ 591 NONAME
- _ZN22QScriptExtensionPlugin19getStaticMetaObjectEv @ 592 NONAME
- _ZN25QScriptEngineAgentPrivate11atStatementERKN5QTJSC17DebuggerCallFrameEiii @ 593 NONAME
- _ZN25QScriptEngineAgentPrivate11returnEventERKN5QTJSC17DebuggerCallFrameEii @ 594 NONAME
- _ZN25QScriptEngineAgentPrivate12evaluateStopERKN5QTJSC7JSValueEi @ 595 NONAME
- _ZN25QScriptEngineAgentPrivate12functionExitERKN5QTJSC7JSValueEi @ 596 NONAME
- _ZN25QScriptEngineAgentPrivate14exceptionCatchERKN5QTJSC17DebuggerCallFrameEi @ 597 NONAME
- _ZN25QScriptEngineAgentPrivate14exceptionThrowERKN5QTJSC17DebuggerCallFrameEib @ 598 NONAME
- _ZN25QScriptEngineAgentPrivate18didReachBreakpointERKN5QTJSC17DebuggerCallFrameEiii @ 599 NONAME
- _ZN25QScriptEngineAgentPrivate6attachEv @ 600 NONAME
- _ZN25QScriptEngineAgentPrivate6detachEv @ 601 NONAME
- _Z5qHashRK13QScriptString @ 602 NONAME
+ _ZN12QScriptValueC2EP19QScriptValuePrivate @ 57 NONAME
+ _ZN12QScriptValueC2EPKc @ 58 NONAME
+ _ZN12QScriptValueC2ERK13QLatin1String @ 59 NONAME
+ _ZN12QScriptValueC2ERK7QString @ 60 NONAME
+ _ZN12QScriptValueC2ERKS_ @ 61 NONAME
+ _ZN12QScriptValueC2Eb @ 62 NONAME
+ _ZN12QScriptValueC2Ed @ 63 NONAME
+ _ZN12QScriptValueC2Ei @ 64 NONAME
+ _ZN12QScriptValueC2Ej @ 65 NONAME
+ _ZN12QScriptValueC2Ev @ 66 NONAME
+ _ZN12QScriptValueD1Ev @ 67 NONAME
+ _ZN12QScriptValueD2Ev @ 68 NONAME
+ _ZN12QScriptValueaSERKS_ @ 69 NONAME
+ _ZN13QScriptEngine10newQObjectEP7QObjectNS_14ValueOwnershipERK6QFlagsINS_17QObjectWrapOptionEE @ 70 NONAME
+ _ZN13QScriptEngine10newQObjectERK12QScriptValueP7QObjectNS_14ValueOwnershipERK6QFlagsINS_17QObjectWrapOptionEE @ 71 NONAME
+ _ZN13QScriptEngine10newVariantERK12QScriptValueRK8QVariant @ 72 NONAME
+ _ZN13QScriptEngine10newVariantERK8QVariant @ 73 NONAME
+ _ZN13QScriptEngine10popContextEv @ 74 NONAME
+ _ZN13QScriptEngine11checkSyntaxERK7QString @ 75 NONAME
+ _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_ERKS0_i @ 76 NONAME
+ _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_Ei @ 77 NONAME
+ _ZN13QScriptEngine11newFunctionEPF12QScriptValueP14QScriptContextPS_PvES4_ @ 78 NONAME
+ _ZN13QScriptEngine11pushContextEv @ 79 NONAME
+ _ZN13QScriptEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 80 NONAME
+ _ZN13QScriptEngine11qt_metacastEPKc @ 81 NONAME
+ _ZN13QScriptEngine14collectGarbageEv @ 82 NONAME
+ _ZN13QScriptEngine14newQMetaObjectEPK11QMetaObjectRK12QScriptValue @ 83 NONAME
+ _ZN13QScriptEngine14toStringHandleERK7QString @ 84 NONAME
+ _ZN13QScriptEngine14undefinedValueEv @ 85 NONAME
+ _ZN13QScriptEngine15abortEvaluationERK12QScriptValue @ 86 NONAME
+ _ZN13QScriptEngine15clearExceptionsEv @ 87 NONAME
+ _ZN13QScriptEngine15importExtensionERK7QString @ 88 NONAME
+ _ZN13QScriptEngine15setGlobalObjectERK12QScriptValue @ 89 NONAME
+ _ZN13QScriptEngine16staticMetaObjectE @ 90 NONAME DATA 16
+ _ZN13QScriptEngine18registerCustomTypeEiPF12QScriptValuePS_PKvEPFvRKS0_PvES7_ @ 91 NONAME
+ _ZN13QScriptEngine19getStaticMetaObjectEv @ 92 NONAME
+ _ZN13QScriptEngine19newActivationObjectEv @ 93 NONAME
+ _ZN13QScriptEngine19setDefaultPrototypeEiRK12QScriptValue @ 94 NONAME
+ _ZN13QScriptEngine22signalHandlerExceptionERK12QScriptValue @ 95 NONAME
+ _ZN13QScriptEngine24setProcessEventsIntervalEi @ 96 NONAME
+ _ZN13QScriptEngine26installTranslatorFunctionsERK12QScriptValue @ 97 NONAME
+ _ZN13QScriptEngine6createEiPKv @ 98 NONAME
+ _ZN13QScriptEngine7convertERK12QScriptValueiPv @ 99 NONAME
+ _ZN13QScriptEngine7newDateERK9QDateTime @ 100 NONAME
+ _ZN13QScriptEngine7newDateEd @ 101 NONAME
+ _ZN13QScriptEngine8evaluateERK7QStringS2_i @ 102 NONAME
+ _ZN13QScriptEngine8newArrayEj @ 103 NONAME
+ _ZN13QScriptEngine8setAgentEP18QScriptEngineAgent @ 104 NONAME
+ _ZN13QScriptEngine8toObjectERK12QScriptValue @ 105 NONAME
+ _ZN13QScriptEngine9convertV2ERK12QScriptValueiPv @ 106 NONAME
+ _ZN13QScriptEngine9newObjectEP12QScriptClassRK12QScriptValue @ 107 NONAME
+ _ZN13QScriptEngine9newObjectEv @ 108 NONAME
+ _ZN13QScriptEngine9newRegExpERK7QRegExp @ 109 NONAME
+ _ZN13QScriptEngine9newRegExpERK7QStringS2_ @ 110 NONAME
+ _ZN13QScriptEngine9nullValueEv @ 111 NONAME
+ _ZN13QScriptEngineC1EP7QObject @ 112 NONAME
+ _ZN13QScriptEngineC1ER20QScriptEnginePrivateP7QObject @ 113 NONAME
+ _ZN13QScriptEngineC1Ev @ 114 NONAME
+ _ZN13QScriptEngineC2EP7QObject @ 115 NONAME
+ _ZN13QScriptEngineC2ER20QScriptEnginePrivateP7QObject @ 116 NONAME
+ _ZN13QScriptEngineC2Ev @ 117 NONAME
+ _ZN13QScriptEngineD0Ev @ 118 NONAME
+ _ZN13QScriptEngineD1Ev @ 119 NONAME
+ _ZN13QScriptEngineD2Ev @ 120 NONAME
+ _ZN13QScriptStringC1ERKS_ @ 121 NONAME
+ _ZN13QScriptStringC1Ev @ 122 NONAME
+ _ZN13QScriptStringC2ERKS_ @ 123 NONAME
+ _ZN13QScriptStringC2Ev @ 124 NONAME
+ _ZN13QScriptStringD1Ev @ 125 NONAME
+ _ZN13QScriptStringD2Ev @ 126 NONAME
+ _ZN13QScriptStringaSERKS_ @ 127 NONAME
+ _ZN14QScriptContext10throwErrorENS_5ErrorERK7QString @ 128 NONAME
+ _ZN14QScriptContext10throwErrorERK7QString @ 129 NONAME
+ _ZN14QScriptContext10throwValueERK12QScriptValue @ 130 NONAME
+ _ZN14QScriptContext13setThisObjectERK12QScriptValue @ 131 NONAME
+ _ZN14QScriptContext14setReturnValueERK12QScriptValue @ 132 NONAME
+ _ZN14QScriptContext19setActivationObjectERK12QScriptValue @ 133 NONAME
+ _ZN14QScriptContext8popScopeEv @ 134 NONAME
+ _ZN14QScriptContext9pushScopeERK12QScriptValue @ 135 NONAME
+ _ZN14QScriptContextC1Ev @ 136 NONAME
+ _ZN14QScriptContextC2Ev @ 137 NONAME
+ _ZN14QScriptContextD1Ev @ 138 NONAME
+ _ZN14QScriptContextD2Ev @ 139 NONAME
+ _ZN18QScriptContextInfoC1EPK14QScriptContext @ 140 NONAME
+ _ZN18QScriptContextInfoC1ERKS_ @ 141 NONAME
+ _ZN18QScriptContextInfoC1Ev @ 142 NONAME
+ _ZN18QScriptContextInfoC2EPK14QScriptContext @ 143 NONAME
+ _ZN18QScriptContextInfoC2ERKS_ @ 144 NONAME
+ _ZN18QScriptContextInfoC2Ev @ 145 NONAME
+ _ZN18QScriptContextInfoD1Ev @ 146 NONAME
+ _ZN18QScriptContextInfoD2Ev @ 147 NONAME
+ _ZN18QScriptContextInfoaSERKS_ @ 148 NONAME
+ _ZN18QScriptEngineAgent10contextPopEv @ 149 NONAME
+ _ZN18QScriptEngineAgent10scriptLoadExRK7QStringS2_i @ 150 NONAME
+ _ZN18QScriptEngineAgent11contextPushEv @ 151 NONAME
+ _ZN18QScriptEngineAgent12functionExitExRK12QScriptValue @ 152 NONAME
+ _ZN18QScriptEngineAgent12scriptUnloadEx @ 153 NONAME
+ _ZN18QScriptEngineAgent13functionEntryEx @ 154 NONAME
+ _ZN18QScriptEngineAgent14exceptionCatchExRK12QScriptValue @ 155 NONAME
+ _ZN18QScriptEngineAgent14exceptionThrowExRK12QScriptValueb @ 156 NONAME
+ _ZN18QScriptEngineAgent14positionChangeExii @ 157 NONAME
+ _ZN18QScriptEngineAgent9extensionENS_9ExtensionERK8QVariant @ 158 NONAME
+ _ZN18QScriptEngineAgentC1EP13QScriptEngine @ 159 NONAME
+ _ZN18QScriptEngineAgentC1ER25QScriptEngineAgentPrivateP13QScriptEngine @ 160 NONAME
+ _ZN18QScriptEngineAgentC2EP13QScriptEngine @ 161 NONAME
+ _ZN18QScriptEngineAgentC2ER25QScriptEngineAgentPrivateP13QScriptEngine @ 162 NONAME
+ _ZN18QScriptEngineAgentD0Ev @ 163 NONAME
+ _ZN18QScriptEngineAgentD1Ev @ 164 NONAME
+ _ZN18QScriptEngineAgentD2Ev @ 165 NONAME
+ _ZN20QScriptValueIterator4nextEv @ 166 NONAME
+ _ZN20QScriptValueIterator6removeEv @ 167 NONAME
+ _ZN20QScriptValueIterator6toBackEv @ 168 NONAME
+ _ZN20QScriptValueIterator7toFrontEv @ 169 NONAME
+ _ZN20QScriptValueIterator8previousEv @ 170 NONAME
+ _ZN20QScriptValueIterator8setValueERK12QScriptValue @ 171 NONAME
+ _ZN20QScriptValueIteratorC1ERK12QScriptValue @ 172 NONAME
+ _ZN20QScriptValueIteratorC2ERK12QScriptValue @ 173 NONAME
+ _ZN20QScriptValueIteratorD1Ev @ 174 NONAME
+ _ZN20QScriptValueIteratorD2Ev @ 175 NONAME
+ _ZN20QScriptValueIteratoraSER12QScriptValue @ 176 NONAME
+ _ZN22QScriptExtensionPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 177 NONAME
+ _ZN22QScriptExtensionPlugin11qt_metacastEPKc @ 178 NONAME
+ _ZN22QScriptExtensionPlugin16staticMetaObjectE @ 179 NONAME DATA 16
+ _ZN22QScriptExtensionPlugin19getStaticMetaObjectEv @ 180 NONAME
+ _ZN22QScriptExtensionPluginC2EP7QObject @ 181 NONAME
+ _ZN22QScriptExtensionPluginD0Ev @ 182 NONAME
+ _ZN22QScriptExtensionPluginD1Ev @ 183 NONAME
+ _ZN22QScriptExtensionPluginD2Ev @ 184 NONAME
+ _ZN24QScriptSyntaxCheckResultC1EP31QScriptSyntaxCheckResultPrivate @ 185 NONAME
+ _ZN24QScriptSyntaxCheckResultC1ERKS_ @ 186 NONAME
+ _ZN24QScriptSyntaxCheckResultC1Ev @ 187 NONAME
+ _ZN24QScriptSyntaxCheckResultC2EP31QScriptSyntaxCheckResultPrivate @ 188 NONAME
+ _ZN24QScriptSyntaxCheckResultC2ERKS_ @ 189 NONAME
+ _ZN24QScriptSyntaxCheckResultC2Ev @ 190 NONAME
+ _ZN24QScriptSyntaxCheckResultD1Ev @ 191 NONAME
+ _ZN24QScriptSyntaxCheckResultD2Ev @ 192 NONAME
+ _ZN24QScriptSyntaxCheckResultaSERKS_ @ 193 NONAME
+ _ZN25QScriptEngineAgentPrivate11atStatementERKN5QTJSC17DebuggerCallFrameEiii @ 194 NONAME
+ _ZN25QScriptEngineAgentPrivate11returnEventERKN5QTJSC17DebuggerCallFrameEii @ 195 NONAME
+ _ZN25QScriptEngineAgentPrivate12evaluateStopERKN5QTJSC7JSValueEi @ 196 NONAME
+ _ZN25QScriptEngineAgentPrivate12functionExitERKN5QTJSC7JSValueEi @ 197 NONAME
+ _ZN25QScriptEngineAgentPrivate14exceptionCatchERKN5QTJSC17DebuggerCallFrameEi @ 198 NONAME
+ _ZN25QScriptEngineAgentPrivate14exceptionThrowERKN5QTJSC17DebuggerCallFrameEib @ 199 NONAME
+ _ZN25QScriptEngineAgentPrivate18didReachBreakpointERKN5QTJSC17DebuggerCallFrameEiii @ 200 NONAME
+ _ZN25QScriptEngineAgentPrivate6attachEv @ 201 NONAME
+ _ZN25QScriptEngineAgentPrivate6detachEv @ 202 NONAME
+ _ZN28QScriptClassPropertyIteratorC2ERK12QScriptValue @ 203 NONAME
+ _ZN28QScriptClassPropertyIteratorC2ERK12QScriptValueR35QScriptClassPropertyIteratorPrivate @ 204 NONAME
+ _ZN28QScriptClassPropertyIteratorD0Ev @ 205 NONAME
+ _ZN28QScriptClassPropertyIteratorD1Ev @ 206 NONAME
+ _ZN28QScriptClassPropertyIteratorD2Ev @ 207 NONAME
+ _ZNK11QScriptable10thisObjectEv @ 208 NONAME
+ _ZNK11QScriptable13argumentCountEv @ 209 NONAME
+ _ZNK11QScriptable6engineEv @ 210 NONAME
+ _ZNK11QScriptable7contextEv @ 211 NONAME
+ _ZNK11QScriptable8argumentEi @ 212 NONAME
+ _ZNK12QScriptClass17supportsExtensionENS_9ExtensionE @ 213 NONAME
+ _ZNK12QScriptClass4nameEv @ 214 NONAME
+ _ZNK12QScriptClass6engineEv @ 215 NONAME
+ _ZNK12QScriptClass9prototypeEv @ 216 NONAME
+ _ZNK12QScriptValue10instanceOfERKS_ @ 217 NONAME
+ _ZNK12QScriptValue10isFunctionEv @ 218 NONAME
+ _ZNK12QScriptValue10toDateTimeEv @ 219 NONAME
+ _ZNK12QScriptValue11isUndefinedEv @ 220 NONAME
+ _ZNK12QScriptValue11scriptClassEv @ 221 NONAME
+ _ZNK12QScriptValue13isQMetaObjectEv @ 222 NONAME
+ _ZNK12QScriptValue13propertyFlagsERK13QScriptStringRK6QFlagsINS_11ResolveFlagEE @ 223 NONAME
+ _ZNK12QScriptValue13propertyFlagsERK7QStringRK6QFlagsINS_11ResolveFlagEE @ 224 NONAME
+ _ZNK12QScriptValue13toQMetaObjectEv @ 225 NONAME
+ _ZNK12QScriptValue14strictlyEqualsERKS_ @ 226 NONAME
+ _ZNK12QScriptValue4dataEv @ 227 NONAME
+ _ZNK12QScriptValue5scopeEv @ 228 NONAME
+ _ZNK12QScriptValue6engineEv @ 229 NONAME
+ _ZNK12QScriptValue6equalsERKS_ @ 230 NONAME
+ _ZNK12QScriptValue6isBoolEv @ 231 NONAME
+ _ZNK12QScriptValue6isDateEv @ 232 NONAME
+ _ZNK12QScriptValue6isNullEv @ 233 NONAME
+ _ZNK12QScriptValue6toBoolEv @ 234 NONAME
+ _ZNK12QScriptValue7isArrayEv @ 235 NONAME
+ _ZNK12QScriptValue7isErrorEv @ 236 NONAME
+ _ZNK12QScriptValue7isValidEv @ 237 NONAME
+ _ZNK12QScriptValue7toInt32Ev @ 238 NONAME
+ _ZNK12QScriptValue8isNumberEv @ 239 NONAME
+ _ZNK12QScriptValue8isObjectEv @ 240 NONAME
+ _ZNK12QScriptValue8isRegExpEv @ 241 NONAME
+ _ZNK12QScriptValue8isStringEv @ 242 NONAME
+ _ZNK12QScriptValue8lessThanERKS_ @ 243 NONAME
+ _ZNK12QScriptValue8objectIdEv @ 244 NONAME
+ _ZNK12QScriptValue8propertyERK13QScriptStringRK6QFlagsINS_11ResolveFlagEE @ 245 NONAME
+ _ZNK12QScriptValue8propertyERK7QStringRK6QFlagsINS_11ResolveFlagEE @ 246 NONAME
+ _ZNK12QScriptValue8propertyEjRK6QFlagsINS_11ResolveFlagEE @ 247 NONAME
+ _ZNK12QScriptValue8toNumberEv @ 248 NONAME
+ _ZNK12QScriptValue8toObjectEv @ 249 NONAME
+ _ZNK12QScriptValue8toRegExpEv @ 250 NONAME
+ _ZNK12QScriptValue8toStringEv @ 251 NONAME
+ _ZNK12QScriptValue8toUInt16Ev @ 252 NONAME
+ _ZNK12QScriptValue8toUInt32Ev @ 253 NONAME
+ _ZNK12QScriptValue9isBooleanEv @ 254 NONAME
+ _ZNK12QScriptValue9isQObjectEv @ 255 NONAME
+ _ZNK12QScriptValue9isVariantEv @ 256 NONAME
+ _ZNK12QScriptValue9prototypeEv @ 257 NONAME
+ _ZNK12QScriptValue9toBooleanEv @ 258 NONAME
+ _ZNK12QScriptValue9toIntegerEv @ 259 NONAME
+ _ZNK12QScriptValue9toQObjectEv @ 260 NONAME
+ _ZNK12QScriptValue9toVariantEv @ 261 NONAME
+ _ZNK13QScriptEngine10metaObjectEv @ 262 NONAME
+ _ZNK13QScriptEngine10objectByIdEx @ 263 NONAME
+ _ZNK13QScriptEngine11canEvaluateERK7QString @ 264 NONAME
+ _ZNK13QScriptEngine12globalObjectEv @ 265 NONAME
+ _ZNK13QScriptEngine12isEvaluatingEv @ 266 NONAME
+ _ZNK13QScriptEngine14currentContextEv @ 267 NONAME
+ _ZNK13QScriptEngine16defaultPrototypeEi @ 268 NONAME
+ _ZNK13QScriptEngine17uncaughtExceptionEv @ 269 NONAME
+ _ZNK13QScriptEngine18importedExtensionsEv @ 270 NONAME
+ _ZNK13QScriptEngine19availableExtensionsEv @ 271 NONAME
+ _ZNK13QScriptEngine20hasUncaughtExceptionEv @ 272 NONAME
+ _ZNK13QScriptEngine21processEventsIntervalEv @ 273 NONAME
+ _ZNK13QScriptEngine26uncaughtExceptionBacktraceEv @ 274 NONAME
+ _ZNK13QScriptEngine27uncaughtExceptionLineNumberEv @ 275 NONAME
+ _ZNK13QScriptEngine5agentEv @ 276 NONAME
+ _ZNK13QScriptString7isValidEv @ 277 NONAME
+ _ZNK13QScriptString8toStringEv @ 278 NONAME
+ _ZNK13QScriptStringcv7QStringEv @ 279 NONAME
+ _ZNK13QScriptStringeqERKS_ @ 280 NONAME
+ _ZNK13QScriptStringneERKS_ @ 281 NONAME
+ _ZNK14QScriptContext10scopeChainEv @ 282 NONAME
+ _ZNK14QScriptContext10thisObjectEv @ 283 NONAME
+ _ZNK14QScriptContext11returnValueEv @ 284 NONAME
+ _ZNK14QScriptContext13argumentCountEv @ 285 NONAME
+ _ZNK14QScriptContext13parentContextEv @ 286 NONAME
+ _ZNK14QScriptContext15argumentsObjectEv @ 287 NONAME
+ _ZNK14QScriptContext16activationObjectEv @ 288 NONAME
+ _ZNK14QScriptContext21isCalledAsConstructorEv @ 289 NONAME
+ _ZNK14QScriptContext5stateEv @ 290 NONAME
+ _ZNK14QScriptContext6calleeEv @ 291 NONAME
+ _ZNK14QScriptContext6engineEv @ 292 NONAME
+ _ZNK14QScriptContext8argumentEi @ 293 NONAME
+ _ZNK14QScriptContext8toStringEv @ 294 NONAME
+ _ZNK14QScriptContext9backtraceEv @ 295 NONAME
+ _ZNK18QScriptContextInfo10lineNumberEv @ 296 NONAME
+ _ZNK18QScriptContextInfo12columnNumberEv @ 297 NONAME
+ _ZNK18QScriptContextInfo12functionNameEv @ 298 NONAME
+ _ZNK18QScriptContextInfo12functionTypeEv @ 299 NONAME
+ _ZNK18QScriptContextInfo17functionMetaIndexEv @ 300 NONAME
+ _ZNK18QScriptContextInfo21functionEndLineNumberEv @ 301 NONAME
+ _ZNK18QScriptContextInfo22functionParameterNamesEv @ 302 NONAME
+ _ZNK18QScriptContextInfo23functionStartLineNumberEv @ 303 NONAME
+ _ZNK18QScriptContextInfo6isNullEv @ 304 NONAME
+ _ZNK18QScriptContextInfo8fileNameEv @ 305 NONAME
+ _ZNK18QScriptContextInfo8scriptIdEv @ 306 NONAME
+ _ZNK18QScriptContextInfoeqERKS_ @ 307 NONAME
+ _ZNK18QScriptContextInfoneERKS_ @ 308 NONAME
+ _ZNK18QScriptEngineAgent17supportsExtensionENS_9ExtensionE @ 309 NONAME
+ _ZNK18QScriptEngineAgent6engineEv @ 310 NONAME
+ _ZNK20QScriptValueIterator10scriptNameEv @ 311 NONAME
+ _ZNK20QScriptValueIterator11hasPreviousEv @ 312 NONAME
+ _ZNK20QScriptValueIterator4nameEv @ 313 NONAME
+ _ZNK20QScriptValueIterator5flagsEv @ 314 NONAME
+ _ZNK20QScriptValueIterator5valueEv @ 315 NONAME
+ _ZNK20QScriptValueIterator7hasNextEv @ 316 NONAME
+ _ZNK22QScriptExtensionPlugin10metaObjectEv @ 317 NONAME
+ _ZNK22QScriptExtensionPlugin12setupPackageERK7QStringP13QScriptEngine @ 318 NONAME
+ _ZNK24QScriptSyntaxCheckResult12errorMessageEv @ 319 NONAME
+ _ZNK24QScriptSyntaxCheckResult15errorLineNumberEv @ 320 NONAME
+ _ZNK24QScriptSyntaxCheckResult17errorColumnNumberEv @ 321 NONAME
+ _ZNK24QScriptSyntaxCheckResult5stateEv @ 322 NONAME
+ _ZNK28QScriptClassPropertyIterator2idEv @ 323 NONAME
+ _ZNK28QScriptClassPropertyIterator5flagsEv @ 324 NONAME
+ _ZNK28QScriptClassPropertyIterator6objectEv @ 325 NONAME
+ _ZTI12QScriptClass @ 326 NONAME
+ _ZTI13QScriptEngine @ 327 NONAME
+ _ZTI18QScriptEngineAgent @ 328 NONAME
+ _ZTI22QScriptExtensionPlugin @ 329 NONAME
+ _ZTI25QScriptEngineAgentPrivate @ 330 NONAME
+ _ZTI25QScriptExtensionInterface @ 331 NONAME
+ _ZTI28QScriptClassPropertyIterator @ 332 NONAME
+ _ZTV12QScriptClass @ 333 NONAME
+ _ZTV13QScriptEngine @ 334 NONAME
+ _ZTV18QScriptEngineAgent @ 335 NONAME
+ _ZTV22QScriptExtensionPlugin @ 336 NONAME
+ _ZTV25QScriptEngineAgentPrivate @ 337 NONAME
+ _ZTV28QScriptClassPropertyIterator @ 338 NONAME
+ _ZThn8_N22QScriptExtensionPluginD0Ev @ 339 NONAME
+ _ZThn8_N22QScriptExtensionPluginD1Ev @ 340 NONAME
+ _ZlsR11QDataStreamRK18QScriptContextInfo @ 341 NONAME
+ _ZrsR11QDataStreamR18QScriptContextInfo @ 342 NONAME
+ _Z5qHashRK13QScriptString @ 343 NONAME
diff --git a/src/s60installs/eabi/QtSqlu.def b/src/s60installs/eabi/QtSqlu.def
index 4d4791a..1510374 100644
--- a/src/s60installs/eabi/QtSqlu.def
+++ b/src/s60installs/eabi/QtSqlu.def
@@ -7,476 +7,462 @@ EXPORTS
_ZN10QSqlDriver16beginTransactionEv @ 6 NONAME
_ZN10QSqlDriver16staticMetaObjectE @ 7 NONAME DATA 16
_ZN10QSqlDriver17commitTransactionEv @ 8 NONAME
- _ZN10QSqlDriver19rollbackTransactionEv @ 9 NONAME
- _ZN10QSqlDriver23subscribeToNotificationERK7QString @ 10 NONAME
- _ZN10QSqlDriver27unsubscribeFromNotificationERK7QString @ 11 NONAME
- _ZN10QSqlDriver37subscribeToNotificationImplementationERK7QString @ 12 NONAME
- _ZN10QSqlDriver41unsubscribeFromNotificationImplementationERK7QString @ 13 NONAME
- _ZN10QSqlDriver7setOpenEb @ 14 NONAME
- _ZN10QSqlDriverC2EP7QObject @ 15 NONAME
- _ZN10QSqlDriverD0Ev @ 16 NONAME
- _ZN10QSqlDriverD1Ev @ 17 NONAME
- _ZN10QSqlDriverD2Ev @ 18 NONAME
- _ZN10QSqlRecord11clearValuesEv @ 19 NONAME
- _ZN10QSqlRecord12setGeneratedERK7QStringb @ 20 NONAME
- _ZN10QSqlRecord12setGeneratedEib @ 21 NONAME
- _ZN10QSqlRecord5clearEv @ 22 NONAME
- _ZN10QSqlRecord6appendERK9QSqlField @ 23 NONAME
- _ZN10QSqlRecord6detachEv @ 24 NONAME
- _ZN10QSqlRecord6insertEiRK9QSqlField @ 25 NONAME
- _ZN10QSqlRecord6removeEi @ 26 NONAME
- _ZN10QSqlRecord7replaceEiRK9QSqlField @ 27 NONAME
- _ZN10QSqlRecord7setNullERK7QString @ 28 NONAME
- _ZN10QSqlRecord7setNullEi @ 29 NONAME
- _ZN10QSqlRecord8setValueERK7QStringRK8QVariant @ 30 NONAME
- _ZN10QSqlRecord8setValueEiRK8QVariant @ 31 NONAME
- _ZN10QSqlRecordC1ERKS_ @ 32 NONAME
- _ZN10QSqlRecordC1Ev @ 33 NONAME
- _ZN10QSqlRecordC2ERKS_ @ 34 NONAME
- _ZN10QSqlRecordC2Ev @ 35 NONAME
- _ZN10QSqlRecordD1Ev @ 36 NONAME
- _ZN10QSqlRecordD2Ev @ 37 NONAME
- _ZN10QSqlRecordaSERKS_ @ 38 NONAME
- _ZN10QSqlResult10nextResultEv @ 39 NONAME
- _ZN10QSqlResult11savePrepareERK7QString @ 40 NONAME
- _ZN10QSqlResult12addBindValueERK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 41 NONAME
- _ZN10QSqlResult12setLastErrorERK9QSqlError @ 42 NONAME
- _ZN10QSqlResult12virtual_hookEiPv @ 43 NONAME
- _ZN10QSqlResult13fetchPreviousEv @ 44 NONAME
- _ZN10QSqlResult14resetBindCountEv @ 45 NONAME
- _ZN10QSqlResult14setForwardOnlyEb @ 46 NONAME
- _ZN10QSqlResult19detachFromResultSetEv @ 47 NONAME
- _ZN10QSqlResult27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 48 NONAME
- _ZN10QSqlResult4execEv @ 49 NONAME
- _ZN10QSqlResult5clearEv @ 50 NONAME
- _ZN10QSqlResult5setAtEi @ 51 NONAME
- _ZN10QSqlResult7prepareERK7QString @ 52 NONAME
- _ZN10QSqlResult8setQueryERK7QString @ 53 NONAME
- _ZN10QSqlResult9bindValueERK7QStringRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 54 NONAME
- _ZN10QSqlResult9bindValueEiRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 55 NONAME
- _ZN10QSqlResult9execBatchEb @ 56 NONAME
- _ZN10QSqlResult9fetchNextEv @ 57 NONAME
- _ZN10QSqlResult9setActiveEb @ 58 NONAME
- _ZN10QSqlResult9setSelectEb @ 59 NONAME
- _ZN10QSqlResultC2EPK10QSqlDriver @ 60 NONAME
- _ZN10QSqlResultD0Ev @ 61 NONAME
- _ZN10QSqlResultD1Ev @ 62 NONAME
- _ZN10QSqlResultD2Ev @ 63 NONAME
- _ZN12QSqlDatabase11addDatabaseEP10QSqlDriverRK7QString @ 64 NONAME
- _ZN12QSqlDatabase11addDatabaseERK7QStringS2_ @ 65 NONAME
- _ZN12QSqlDatabase11setHostNameERK7QString @ 66 NONAME
- _ZN12QSqlDatabase11setPasswordERK7QString @ 67 NONAME
- _ZN12QSqlDatabase11setUserNameERK7QString @ 68 NONAME
- _ZN12QSqlDatabase11transactionEv @ 69 NONAME
- _ZN12QSqlDatabase13cloneDatabaseERKS_RK7QString @ 70 NONAME
- _ZN12QSqlDatabase14removeDatabaseERK7QString @ 71 NONAME
- _ZN12QSqlDatabase15connectionNamesEv @ 72 NONAME
- _ZN12QSqlDatabase15setDatabaseNameERK7QString @ 73 NONAME
- _ZN12QSqlDatabase17defaultConnectionE @ 74 NONAME DATA 4
- _ZN12QSqlDatabase17isDriverAvailableERK7QString @ 75 NONAME
- _ZN12QSqlDatabase17registerSqlDriverERK7QStringP21QSqlDriverCreatorBase @ 76 NONAME
- _ZN12QSqlDatabase17setConnectOptionsERK7QString @ 77 NONAME
- _ZN12QSqlDatabase4openERK7QStringS2_ @ 78 NONAME
- _ZN12QSqlDatabase4openEv @ 79 NONAME
- _ZN12QSqlDatabase5closeEv @ 80 NONAME
- _ZN12QSqlDatabase6commitEv @ 81 NONAME
- _ZN12QSqlDatabase7driversEv @ 82 NONAME
- _ZN12QSqlDatabase7setPortEi @ 83 NONAME
- _ZN12QSqlDatabase8containsERK7QString @ 84 NONAME
- _ZN12QSqlDatabase8databaseERK7QStringb @ 85 NONAME
- _ZN12QSqlDatabase8rollbackEv @ 86 NONAME
- _ZN12QSqlDatabaseC1EP10QSqlDriver @ 87 NONAME
- _ZN12QSqlDatabaseC1ERK7QString @ 88 NONAME
- _ZN12QSqlDatabaseC1ERKS_ @ 89 NONAME
- _ZN12QSqlDatabaseC1Ev @ 90 NONAME
- _ZN12QSqlDatabaseC2EP10QSqlDriver @ 91 NONAME
- _ZN12QSqlDatabaseC2ERK7QString @ 92 NONAME
- _ZN12QSqlDatabaseC2ERKS_ @ 93 NONAME
- _ZN12QSqlDatabaseC2Ev @ 94 NONAME
- _ZN12QSqlDatabaseD1Ev @ 95 NONAME
- _ZN12QSqlDatabaseD2Ev @ 96 NONAME
- _ZN12QSqlDatabaseaSERKS_ @ 97 NONAME
- _ZN13QSQLiteDriver11qt_metacallEN11QMetaObject4CallEiPPv @ 98 NONAME
- _ZN13QSQLiteDriver11qt_metacastEPKc @ 99 NONAME
- _ZN13QSQLiteDriver16beginTransactionEv @ 100 NONAME
- _ZN13QSQLiteDriver16staticMetaObjectE @ 101 NONAME DATA 16
- _ZN13QSQLiteDriver17commitTransactionEv @ 102 NONAME
- _ZN13QSQLiteDriver19rollbackTransactionEv @ 103 NONAME
- _ZN13QSQLiteDriver4openERK7QStringS2_S2_S2_iS2_ @ 104 NONAME
- _ZN13QSQLiteDriver5closeEv @ 105 NONAME
- _ZN13QSQLiteDriverC1EP7QObject @ 106 NONAME
- _ZN13QSQLiteDriverC1EP7sqlite3P7QObject @ 107 NONAME
- _ZN13QSQLiteDriverC2EP7QObject @ 108 NONAME
- _ZN13QSQLiteDriverC2EP7sqlite3P7QObject @ 109 NONAME
- _ZN13QSQLiteDriverD0Ev @ 110 NONAME
- _ZN13QSQLiteDriverD1Ev @ 111 NONAME
- _ZN13QSQLiteDriverD2Ev @ 112 NONAME
- _ZN14QSqlQueryModel11qt_metacallEN11QMetaObject4CallEiPPv @ 113 NONAME
- _ZN14QSqlQueryModel11qt_metacastEPKc @ 114 NONAME
- _ZN14QSqlQueryModel11queryChangeEv @ 115 NONAME
- _ZN14QSqlQueryModel12setLastErrorERK9QSqlError @ 116 NONAME
- _ZN14QSqlQueryModel13insertColumnsEiiRK11QModelIndex @ 117 NONAME
- _ZN14QSqlQueryModel13removeColumnsEiiRK11QModelIndex @ 118 NONAME
- _ZN14QSqlQueryModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 119 NONAME
- _ZN14QSqlQueryModel16staticMetaObjectE @ 120 NONAME DATA 16
- _ZN14QSqlQueryModel5clearEv @ 121 NONAME
- _ZN14QSqlQueryModel8setQueryERK7QStringRK12QSqlDatabase @ 122 NONAME
- _ZN14QSqlQueryModel8setQueryERK9QSqlQuery @ 123 NONAME
- _ZN14QSqlQueryModel9fetchMoreERK11QModelIndex @ 124 NONAME
- _ZN14QSqlQueryModelC1EP7QObject @ 125 NONAME
- _ZN14QSqlQueryModelC1ER21QSqlQueryModelPrivateP7QObject @ 126 NONAME
- _ZN14QSqlQueryModelC2EP7QObject @ 127 NONAME
- _ZN14QSqlQueryModelC2ER21QSqlQueryModelPrivateP7QObject @ 128 NONAME
- _ZN14QSqlQueryModelD0Ev @ 129 NONAME
- _ZN14QSqlQueryModelD1Ev @ 130 NONAME
- _ZN14QSqlQueryModelD2Ev @ 131 NONAME
- _ZN14QSqlTableModel10insertRowsEiiRK11QModelIndex @ 132 NONAME
- _ZN14QSqlTableModel10removeRowsEiiRK11QModelIndex @ 133 NONAME
- _ZN14QSqlTableModel11primeInsertEiR10QSqlRecord @ 134 NONAME
- _ZN14QSqlTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 135 NONAME
- _ZN14QSqlTableModel11qt_metacastEPKc @ 136 NONAME
- _ZN14QSqlTableModel12beforeDeleteEi @ 137 NONAME
- _ZN14QSqlTableModel12beforeInsertER10QSqlRecord @ 138 NONAME
- _ZN14QSqlTableModel12beforeUpdateEiR10QSqlRecord @ 139 NONAME
- _ZN14QSqlTableModel12insertRecordEiRK10QSqlRecord @ 140 NONAME
- _ZN14QSqlTableModel13removeColumnsEiiRK11QModelIndex @ 141 NONAME
- _ZN14QSqlTableModel13setPrimaryKeyERK9QSqlIndex @ 142 NONAME
- _ZN14QSqlTableModel15setEditStrategyENS_12EditStrategyE @ 143 NONAME
- _ZN14QSqlTableModel16staticMetaObjectE @ 144 NONAME DATA 16
- _ZN14QSqlTableModel16updateRowInTableEiRK10QSqlRecord @ 145 NONAME
- _ZN14QSqlTableModel18deleteRowFromTableEi @ 146 NONAME
- _ZN14QSqlTableModel18insertRowIntoTableERK10QSqlRecord @ 147 NONAME
- _ZN14QSqlTableModel4sortEiN2Qt9SortOrderE @ 148 NONAME
- _ZN14QSqlTableModel5clearEv @ 149 NONAME
- _ZN14QSqlTableModel6revertEv @ 150 NONAME
- _ZN14QSqlTableModel6selectEv @ 151 NONAME
- _ZN14QSqlTableModel6submitEv @ 152 NONAME
- _ZN14QSqlTableModel7setDataERK11QModelIndexRK8QVarianti @ 153 NONAME
- _ZN14QSqlTableModel7setSortEiN2Qt9SortOrderE @ 154 NONAME
- _ZN14QSqlTableModel8setQueryERK9QSqlQuery @ 155 NONAME
- _ZN14QSqlTableModel8setTableERK7QString @ 156 NONAME
- _ZN14QSqlTableModel9revertAllEv @ 157 NONAME
- _ZN14QSqlTableModel9revertRowEi @ 158 NONAME
- _ZN14QSqlTableModel9setFilterERK7QString @ 159 NONAME
- _ZN14QSqlTableModel9setRecordEiRK10QSqlRecord @ 160 NONAME
- _ZN14QSqlTableModel9submitAllEv @ 161 NONAME
- _ZN14QSqlTableModelC1EP7QObject12QSqlDatabase @ 162 NONAME
- _ZN14QSqlTableModelC1ER21QSqlTableModelPrivateP7QObject12QSqlDatabase @ 163 NONAME
- _ZN14QSqlTableModelC2EP7QObject12QSqlDatabase @ 164 NONAME
- _ZN14QSqlTableModelC2ER21QSqlTableModelPrivateP7QObject12QSqlDatabase @ 165 NONAME
- _ZN14QSqlTableModelD0Ev @ 166 NONAME
- _ZN14QSqlTableModelD1Ev @ 167 NONAME
- _ZN14QSqlTableModelD2Ev @ 168 NONAME
- _ZN16QSqlCachedResult10fetchFirstEv @ 169 NONAME
- _ZN16QSqlCachedResult11clearValuesEv @ 170 NONAME
- _ZN16QSqlCachedResult13fetchPreviousEv @ 171 NONAME
- _ZN16QSqlCachedResult4dataEi @ 172 NONAME
- _ZN16QSqlCachedResult4initEi @ 173 NONAME
- _ZN16QSqlCachedResult5cacheEv @ 174 NONAME
- _ZN16QSqlCachedResult5fetchEi @ 175 NONAME
- _ZN16QSqlCachedResult6isNullEi @ 176 NONAME
- _ZN16QSqlCachedResult7cleanupEv @ 177 NONAME
- _ZN16QSqlCachedResult9cacheNextEv @ 178 NONAME
- _ZN16QSqlCachedResult9fetchLastEv @ 179 NONAME
- _ZN16QSqlCachedResult9fetchNextEv @ 180 NONAME
- _ZN16QSqlCachedResultC2EPK10QSqlDriver @ 181 NONAME
- _ZN16QSqlCachedResultD0Ev @ 182 NONAME
- _ZN16QSqlCachedResultD1Ev @ 183 NONAME
- _ZN16QSqlCachedResultD2Ev @ 184 NONAME
- _ZN16QSqlDriverPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 185 NONAME
- _ZN16QSqlDriverPlugin11qt_metacastEPKc @ 186 NONAME
- _ZN16QSqlDriverPlugin16staticMetaObjectE @ 187 NONAME DATA 16
- _ZN16QSqlDriverPluginC2EP7QObject @ 188 NONAME
- _ZN16QSqlDriverPluginD0Ev @ 189 NONAME
- _ZN16QSqlDriverPluginD1Ev @ 190 NONAME
- _ZN16QSqlDriverPluginD2Ev @ 191 NONAME
- _ZN24QSqlRelationalTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 192 NONAME
- _ZN24QSqlRelationalTableModel11qt_metacastEPKc @ 193 NONAME
- _ZN24QSqlRelationalTableModel11setRelationEiRK12QSqlRelation @ 194 NONAME
- _ZN24QSqlRelationalTableModel13removeColumnsEiiRK11QModelIndex @ 195 NONAME
- _ZN24QSqlRelationalTableModel16staticMetaObjectE @ 196 NONAME DATA 16
- _ZN24QSqlRelationalTableModel16updateRowInTableEiRK10QSqlRecord @ 197 NONAME
- _ZN24QSqlRelationalTableModel18insertRowIntoTableERK10QSqlRecord @ 198 NONAME
- _ZN24QSqlRelationalTableModel5clearEv @ 199 NONAME
- _ZN24QSqlRelationalTableModel6selectEv @ 200 NONAME
- _ZN24QSqlRelationalTableModel7setDataERK11QModelIndexRK8QVarianti @ 201 NONAME
- _ZN24QSqlRelationalTableModel8setTableERK7QString @ 202 NONAME
- _ZN24QSqlRelationalTableModel9revertRowEi @ 203 NONAME
- _ZN24QSqlRelationalTableModelC1EP7QObject12QSqlDatabase @ 204 NONAME
- _ZN24QSqlRelationalTableModelC2EP7QObject12QSqlDatabase @ 205 NONAME
- _ZN24QSqlRelationalTableModelD0Ev @ 206 NONAME
- _ZN24QSqlRelationalTableModelD1Ev @ 207 NONAME
- _ZN24QSqlRelationalTableModelD2Ev @ 208 NONAME
- _ZN9QSqlError13setDriverTextERK7QString @ 209 NONAME
- _ZN9QSqlError15setDatabaseTextERK7QString @ 210 NONAME
- _ZN9QSqlError7setTypeENS_9ErrorTypeE @ 211 NONAME
- _ZN9QSqlError9setNumberEi @ 212 NONAME
- _ZN9QSqlErrorC1ERK7QStringS2_NS_9ErrorTypeEi @ 213 NONAME
- _ZN9QSqlErrorC1ERKS_ @ 214 NONAME
- _ZN9QSqlErrorC2ERK7QStringS2_NS_9ErrorTypeEi @ 215 NONAME
- _ZN9QSqlErrorC2ERKS_ @ 216 NONAME
- _ZN9QSqlErrorD1Ev @ 217 NONAME
- _ZN9QSqlErrorD2Ev @ 218 NONAME
- _ZN9QSqlErroraSERKS_ @ 219 NONAME
- _ZN9QSqlField10setSqlTypeEi @ 220 NONAME
- _ZN9QSqlField11setReadOnlyEb @ 221 NONAME
- _ZN9QSqlField12setAutoValueEb @ 222 NONAME
- _ZN9QSqlField12setGeneratedEb @ 223 NONAME
- _ZN9QSqlField12setPrecisionEi @ 224 NONAME
- _ZN9QSqlField15setDefaultValueERK8QVariant @ 225 NONAME
- _ZN9QSqlField17setRequiredStatusENS_14RequiredStatusE @ 226 NONAME
- _ZN9QSqlField5clearEv @ 227 NONAME
- _ZN9QSqlField6detachEv @ 228 NONAME
- _ZN9QSqlField7setNameERK7QString @ 229 NONAME
- _ZN9QSqlField7setTypeEN8QVariant4TypeE @ 230 NONAME
- _ZN9QSqlField8setValueERK8QVariant @ 231 NONAME
- _ZN9QSqlField9setLengthEi @ 232 NONAME
- _ZN9QSqlFieldC1ERK7QString @ 233 NONAME ABSENT
- _ZN9QSqlFieldC1ERK7QStringN8QVariant4TypeE @ 234 NONAME
- _ZN9QSqlFieldC1ERKS_ @ 235 NONAME
- _ZN9QSqlFieldC1Ev @ 236 NONAME ABSENT
- _ZN9QSqlFieldC2ERK7QString @ 237 NONAME ABSENT
- _ZN9QSqlFieldC2ERK7QStringN8QVariant4TypeE @ 238 NONAME
- _ZN9QSqlFieldC2ERKS_ @ 239 NONAME
- _ZN9QSqlFieldC2Ev @ 240 NONAME ABSENT
- _ZN9QSqlFieldD1Ev @ 241 NONAME
- _ZN9QSqlFieldD2Ev @ 242 NONAME
- _ZN9QSqlFieldaSERKS_ @ 243 NONAME
- _ZN9QSqlIndex13setCursorNameERK7QString @ 244 NONAME
- _ZN9QSqlIndex13setDescendingEib @ 245 NONAME
- _ZN9QSqlIndex6appendERK9QSqlField @ 246 NONAME
- _ZN9QSqlIndex6appendERK9QSqlFieldb @ 247 NONAME
- _ZN9QSqlIndex7setNameERK7QString @ 248 NONAME
- _ZN9QSqlIndexC1ERK7QStringS2_ @ 249 NONAME
- _ZN9QSqlIndexC1ERKS_ @ 250 NONAME
- _ZN9QSqlIndexC2ERK7QStringS2_ @ 251 NONAME
- _ZN9QSqlIndexC2ERKS_ @ 252 NONAME
- _ZN9QSqlIndexD1Ev @ 253 NONAME
- _ZN9QSqlIndexD2Ev @ 254 NONAME
- _ZN9QSqlIndexaSERKS_ @ 255 NONAME
- _ZN9QSqlQuery10nextResultEv @ 256 NONAME
- _ZN9QSqlQuery12addBindValueERK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 257 NONAME
- _ZN9QSqlQuery14setForwardOnlyEb @ 258 NONAME
- _ZN9QSqlQuery27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 259 NONAME
- _ZN9QSqlQuery4execERK7QString @ 260 NONAME
- _ZN9QSqlQuery4execEv @ 261 NONAME
- _ZN9QSqlQuery4lastEv @ 262 NONAME
- _ZN9QSqlQuery4nextEv @ 263 NONAME
- _ZN9QSqlQuery4seekEib @ 264 NONAME
- _ZN9QSqlQuery5clearEv @ 265 NONAME
- _ZN9QSqlQuery5firstEv @ 266 NONAME
- _ZN9QSqlQuery6finishEv @ 267 NONAME
- _ZN9QSqlQuery7prepareERK7QString @ 268 NONAME
- _ZN9QSqlQuery8previousEv @ 269 NONAME
- _ZN9QSqlQuery9bindValueERK7QStringRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 270 NONAME
- _ZN9QSqlQuery9bindValueEiRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 271 NONAME
- _ZN9QSqlQuery9execBatchENS_18BatchExecutionModeE @ 272 NONAME
- _ZN9QSqlQueryC1E12QSqlDatabase @ 273 NONAME
- _ZN9QSqlQueryC1EP10QSqlResult @ 274 NONAME
- _ZN9QSqlQueryC1ERK7QString12QSqlDatabase @ 275 NONAME
- _ZN9QSqlQueryC1ERKS_ @ 276 NONAME
- _ZN9QSqlQueryC2E12QSqlDatabase @ 277 NONAME
- _ZN9QSqlQueryC2EP10QSqlResult @ 278 NONAME
- _ZN9QSqlQueryC2ERK7QString12QSqlDatabase @ 279 NONAME
- _ZN9QSqlQueryC2ERKS_ @ 280 NONAME
- _ZN9QSqlQueryD1Ev @ 281 NONAME
- _ZN9QSqlQueryD2Ev @ 282 NONAME
- _ZN9QSqlQueryaSERKS_ @ 283 NONAME
- _ZNK10QSqlDriver10metaObjectEv @ 284 NONAME
- _ZNK10QSqlDriver11formatValueERK9QSqlFieldb @ 285 NONAME
- _ZNK10QSqlDriver11isOpenErrorEv @ 286 NONAME
- _ZNK10QSqlDriver12primaryIndexERK7QString @ 287 NONAME
- _ZNK10QSqlDriver12sqlStatementENS_13StatementTypeERK7QStringRK10QSqlRecordb @ 288 NONAME
- _ZNK10QSqlDriver15stripDelimitersERK7QStringNS_14IdentifierTypeE @ 289 NONAME
- _ZNK10QSqlDriver16escapeIdentifierERK7QStringNS_14IdentifierTypeE @ 290 NONAME
- _ZNK10QSqlDriver19isIdentifierEscapedERK7QStringNS_14IdentifierTypeE @ 291 NONAME
- _ZNK10QSqlDriver25subscribedToNotificationsEv @ 292 NONAME
- _ZNK10QSqlDriver29stripDelimitersImplementationERK7QStringNS_14IdentifierTypeE @ 293 NONAME
- _ZNK10QSqlDriver33isIdentifierEscapedImplementationERK7QStringNS_14IdentifierTypeE @ 294 NONAME
- _ZNK10QSqlDriver39subscribedToNotificationsImplementationEv @ 295 NONAME
- _ZNK10QSqlDriver6handleEv @ 296 NONAME
- _ZNK10QSqlDriver6isOpenEv @ 297 NONAME
- _ZNK10QSqlDriver6recordERK7QString @ 298 NONAME
- _ZNK10QSqlDriver6tablesEN4QSql9TableTypeE @ 299 NONAME
- _ZNK10QSqlDriver9lastErrorEv @ 300 NONAME
- _ZNK10QSqlRecord11isGeneratedERK7QString @ 301 NONAME
- _ZNK10QSqlRecord11isGeneratedEi @ 302 NONAME
- _ZNK10QSqlRecord5countEv @ 303 NONAME
- _ZNK10QSqlRecord5fieldERK7QString @ 304 NONAME
- _ZNK10QSqlRecord5fieldEi @ 305 NONAME
- _ZNK10QSqlRecord5valueERK7QString @ 306 NONAME
- _ZNK10QSqlRecord5valueEi @ 307 NONAME
- _ZNK10QSqlRecord6isNullERK7QString @ 308 NONAME
- _ZNK10QSqlRecord6isNullEi @ 309 NONAME
- _ZNK10QSqlRecord7indexOfERK7QString @ 310 NONAME
- _ZNK10QSqlRecord7isEmptyEv @ 311 NONAME
- _ZNK10QSqlRecord8containsERK7QString @ 312 NONAME
- _ZNK10QSqlRecord9fieldNameEi @ 313 NONAME
- _ZNK10QSqlRecordeqERKS_ @ 314 NONAME
- _ZNK10QSqlResult10boundValueERK7QString @ 315 NONAME
- _ZNK10QSqlResult10boundValueEi @ 316 NONAME
- _ZNK10QSqlResult11boundValuesEv @ 317 NONAME
- _ZNK10QSqlResult12hasOutValuesEv @ 318 NONAME
- _ZNK10QSqlResult12lastInsertIdEv @ 319 NONAME
- _ZNK10QSqlResult13bindValueTypeERK7QString @ 320 NONAME
- _ZNK10QSqlResult13bindValueTypeEi @ 321 NONAME
- _ZNK10QSqlResult13bindingSyntaxEv @ 322 NONAME
- _ZNK10QSqlResult13executedQueryEv @ 323 NONAME
- _ZNK10QSqlResult13isForwardOnlyEv @ 324 NONAME
- _ZNK10QSqlResult14boundValueNameEi @ 325 NONAME
- _ZNK10QSqlResult15boundValueCountEv @ 326 NONAME
- _ZNK10QSqlResult2atEv @ 327 NONAME
- _ZNK10QSqlResult6driverEv @ 328 NONAME
- _ZNK10QSqlResult6handleEv @ 329 NONAME
- _ZNK10QSqlResult6recordEv @ 330 NONAME
- _ZNK10QSqlResult7isValidEv @ 331 NONAME
- _ZNK10QSqlResult8isActiveEv @ 332 NONAME
- _ZNK10QSqlResult8isSelectEv @ 333 NONAME
- _ZNK10QSqlResult9lastErrorEv @ 334 NONAME
- _ZNK10QSqlResult9lastQueryEv @ 335 NONAME
- _ZNK12QSqlDatabase10driverNameEv @ 336 NONAME
- _ZNK12QSqlDatabase11isOpenErrorEv @ 337 NONAME
- _ZNK12QSqlDatabase12databaseNameEv @ 338 NONAME
- _ZNK12QSqlDatabase12primaryIndexERK7QString @ 339 NONAME
- _ZNK12QSqlDatabase14connectOptionsEv @ 340 NONAME
- _ZNK12QSqlDatabase14connectionNameEv @ 341 NONAME
- _ZNK12QSqlDatabase4execERK7QString @ 342 NONAME
- _ZNK12QSqlDatabase4portEv @ 343 NONAME
- _ZNK12QSqlDatabase6driverEv @ 344 NONAME
- _ZNK12QSqlDatabase6isOpenEv @ 345 NONAME
- _ZNK12QSqlDatabase6recordERK7QString @ 346 NONAME
- _ZNK12QSqlDatabase6tablesEN4QSql9TableTypeE @ 347 NONAME
- _ZNK12QSqlDatabase7isValidEv @ 348 NONAME
- _ZNK12QSqlDatabase8hostNameEv @ 349 NONAME
- _ZNK12QSqlDatabase8passwordEv @ 350 NONAME
- _ZNK12QSqlDatabase8userNameEv @ 351 NONAME
- _ZNK12QSqlDatabase9lastErrorEv @ 352 NONAME
- _ZNK13QSQLiteDriver10hasFeatureEN10QSqlDriver13DriverFeatureE @ 353 NONAME
- _ZNK13QSQLiteDriver10metaObjectEv @ 354 NONAME
- _ZNK13QSQLiteDriver12createResultEv @ 355 NONAME
- _ZNK13QSQLiteDriver12primaryIndexERK7QString @ 356 NONAME
- _ZNK13QSQLiteDriver16escapeIdentifierERK7QStringN10QSqlDriver14IdentifierTypeE @ 357 NONAME
- _ZNK13QSQLiteDriver6handleEv @ 358 NONAME
- _ZNK13QSQLiteDriver6recordERK7QString @ 359 NONAME
- _ZNK13QSQLiteDriver6tablesEN4QSql9TableTypeE @ 360 NONAME
- _ZNK14QSqlQueryModel10headerDataEiN2Qt11OrientationEi @ 361 NONAME
- _ZNK14QSqlQueryModel10metaObjectEv @ 362 NONAME
- _ZNK14QSqlQueryModel11columnCountERK11QModelIndex @ 363 NONAME
- _ZNK14QSqlQueryModel12canFetchMoreERK11QModelIndex @ 364 NONAME
- _ZNK14QSqlQueryModel12indexInQueryERK11QModelIndex @ 365 NONAME
- _ZNK14QSqlQueryModel4dataERK11QModelIndexi @ 366 NONAME
- _ZNK14QSqlQueryModel5queryEv @ 367 NONAME
- _ZNK14QSqlQueryModel6recordEi @ 368 NONAME
- _ZNK14QSqlQueryModel6recordEv @ 369 NONAME
- _ZNK14QSqlQueryModel8rowCountERK11QModelIndex @ 370 NONAME
- _ZNK14QSqlQueryModel9lastErrorEv @ 371 NONAME
- _ZNK14QSqlTableModel10fieldIndexERK7QString @ 372 NONAME
- _ZNK14QSqlTableModel10headerDataEiN2Qt11OrientationEi @ 373 NONAME
- _ZNK14QSqlTableModel10metaObjectEv @ 374 NONAME
- _ZNK14QSqlTableModel10primaryKeyEv @ 375 NONAME
- _ZNK14QSqlTableModel12editStrategyEv @ 376 NONAME
- _ZNK14QSqlTableModel12indexInQueryERK11QModelIndex @ 377 NONAME
- _ZNK14QSqlTableModel13orderByClauseEv @ 378 NONAME
- _ZNK14QSqlTableModel15selectStatementEv @ 379 NONAME
- _ZNK14QSqlTableModel4dataERK11QModelIndexi @ 380 NONAME
- _ZNK14QSqlTableModel5flagsERK11QModelIndex @ 381 NONAME
- _ZNK14QSqlTableModel6filterEv @ 382 NONAME
- _ZNK14QSqlTableModel7isDirtyERK11QModelIndex @ 383 NONAME
- _ZNK14QSqlTableModel8databaseEv @ 384 NONAME
- _ZNK14QSqlTableModel8rowCountERK11QModelIndex @ 385 NONAME
- _ZNK14QSqlTableModel9tableNameEv @ 386 NONAME
- _ZNK16QSqlCachedResult8colCountEv @ 387 NONAME
- _ZNK16QSqlDriverPlugin10metaObjectEv @ 388 NONAME
- _ZNK24QSqlRelationalTableModel10metaObjectEv @ 389 NONAME
- _ZNK24QSqlRelationalTableModel13orderByClauseEv @ 390 NONAME
- _ZNK24QSqlRelationalTableModel13relationModelEi @ 391 NONAME
- _ZNK24QSqlRelationalTableModel15selectStatementEv @ 392 NONAME
- _ZNK24QSqlRelationalTableModel4dataERK11QModelIndexi @ 393 NONAME
- _ZNK24QSqlRelationalTableModel8relationEi @ 394 NONAME
- _ZNK9QSqlError10driverTextEv @ 395 NONAME
- _ZNK9QSqlError12databaseTextEv @ 396 NONAME
- _ZNK9QSqlError4textEv @ 397 NONAME
- _ZNK9QSqlError4typeEv @ 398 NONAME
- _ZNK9QSqlError6numberEv @ 399 NONAME
- _ZNK9QSqlError7isValidEv @ 400 NONAME
- _ZNK9QSqlField10isReadOnlyEv @ 401 NONAME
- _ZNK9QSqlField11isAutoValueEv @ 402 NONAME
- _ZNK9QSqlField11isGeneratedEv @ 403 NONAME
- _ZNK9QSqlField12defaultValueEv @ 404 NONAME
- _ZNK9QSqlField14requiredStatusEv @ 405 NONAME
- _ZNK9QSqlField4nameEv @ 406 NONAME
- _ZNK9QSqlField4typeEv @ 407 NONAME
- _ZNK9QSqlField6isNullEv @ 408 NONAME
- _ZNK9QSqlField6lengthEv @ 409 NONAME
- _ZNK9QSqlField6typeIDEv @ 410 NONAME
- _ZNK9QSqlField7isValidEv @ 411 NONAME
- _ZNK9QSqlField9precisionEv @ 412 NONAME
- _ZNK9QSqlFieldeqERKS_ @ 413 NONAME
- _ZNK9QSqlIndex11createFieldEiRK7QStringb @ 414 NONAME
- _ZNK9QSqlIndex12isDescendingEi @ 415 NONAME
- _ZNK9QSqlQuery10boundValueERK7QString @ 416 NONAME
- _ZNK9QSqlQuery10boundValueEi @ 417 NONAME
- _ZNK9QSqlQuery11boundValuesEv @ 418 NONAME
- _ZNK9QSqlQuery12lastInsertIdEv @ 419 NONAME
- _ZNK9QSqlQuery13executedQueryEv @ 420 NONAME
- _ZNK9QSqlQuery13isForwardOnlyEv @ 421 NONAME
- _ZNK9QSqlQuery15numRowsAffectedEv @ 422 NONAME
- _ZNK9QSqlQuery24numericalPrecisionPolicyEv @ 423 NONAME
- _ZNK9QSqlQuery2atEv @ 424 NONAME
- _ZNK9QSqlQuery4sizeEv @ 425 NONAME
- _ZNK9QSqlQuery5valueEi @ 426 NONAME
- _ZNK9QSqlQuery6driverEv @ 427 NONAME
- _ZNK9QSqlQuery6isNullEi @ 428 NONAME
- _ZNK9QSqlQuery6recordEv @ 429 NONAME
- _ZNK9QSqlQuery6resultEv @ 430 NONAME
- _ZNK9QSqlQuery7isValidEv @ 431 NONAME
- _ZNK9QSqlQuery8isActiveEv @ 432 NONAME
- _ZNK9QSqlQuery8isSelectEv @ 433 NONAME
- _ZNK9QSqlQuery9lastErrorEv @ 434 NONAME
- _ZNK9QSqlQuery9lastQueryEv @ 435 NONAME
- _ZTI10QSqlDriver @ 436 NONAME
- _ZTI10QSqlResult @ 437 NONAME
- _ZTI13QSQLiteDriver @ 438 NONAME
- _ZTI13QSQLiteResult @ 439 NONAME ABSENT
- _ZTI14QSqlQueryModel @ 440 NONAME
- _ZTI14QSqlTableModel @ 441 NONAME
- _ZTI16QSqlCachedResult @ 442 NONAME
- _ZTI16QSqlDriverPlugin @ 443 NONAME
- _ZTI17QSqlDriverPrivate @ 444 NONAME ABSENT
- _ZTI21QSqlQueryModelPrivate @ 445 NONAME ABSENT
- _ZTI21QSqlTableModelPrivate @ 446 NONAME ABSENT
- _ZTI24QSqlRelationalTableModel @ 447 NONAME
- _ZTI26QSqlDriverFactoryInterface @ 448 NONAME
- _ZTI31QSqlRelationalTableModelPrivate @ 449 NONAME ABSENT
- _ZTV10QSqlDriver @ 450 NONAME
- _ZTV10QSqlResult @ 451 NONAME
- _ZTV13QSQLiteDriver @ 452 NONAME
- _ZTV13QSQLiteResult @ 453 NONAME ABSENT
- _ZTV14QSqlQueryModel @ 454 NONAME
- _ZTV14QSqlTableModel @ 455 NONAME
- _ZTV16QSqlCachedResult @ 456 NONAME
- _ZTV16QSqlDriverPlugin @ 457 NONAME
- _ZTV17QSqlDriverPrivate @ 458 NONAME ABSENT
- _ZTV21QSqlQueryModelPrivate @ 459 NONAME ABSENT
- _ZTV21QSqlTableModelPrivate @ 460 NONAME ABSENT
- _ZTV24QSqlRelationalTableModel @ 461 NONAME
- _ZTV31QSqlRelationalTableModelPrivate @ 462 NONAME ABSENT
- _ZThn8_N16QSqlDriverPluginD0Ev @ 463 NONAME
- _ZThn8_N16QSqlDriverPluginD1Ev @ 464 NONAME
- _Zls6QDebugRK10QSqlRecord @ 465 NONAME
- _Zls6QDebugRK12QSqlDatabase @ 466 NONAME
- _Zls6QDebugRK9QSqlError @ 467 NONAME
- _Zls6QDebugRK9QSqlField @ 468 NONAME
- _ZN10QSqlDriver27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 469 NONAME
- _ZN12QSqlDatabase27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 470 NONAME
- _ZN16QSqlCachedResult12virtual_hookEiPv @ 471 NONAME
- _ZNK10QSqlDriver24numericalPrecisionPolicyEv @ 472 NONAME
- _ZNK10QSqlResult24numericalPrecisionPolicyEv @ 473 NONAME
- _ZNK12QSqlDatabase24numericalPrecisionPolicyEv @ 474 NONAME
- _ZN10QSqlDriver19getStaticMetaObjectEv @ 475 NONAME
- _ZN13QSQLiteDriver19getStaticMetaObjectEv @ 476 NONAME
- _ZN14QSqlQueryModel19getStaticMetaObjectEv @ 477 NONAME
- _ZN14QSqlTableModel19getStaticMetaObjectEv @ 478 NONAME
- _ZN16QSqlDriverPlugin19getStaticMetaObjectEv @ 479 NONAME
- _ZN24QSqlRelationalTableModel19getStaticMetaObjectEv @ 480 NONAME
+ _ZN10QSqlDriver19getStaticMetaObjectEv @ 9 NONAME
+ _ZN10QSqlDriver19rollbackTransactionEv @ 10 NONAME
+ _ZN10QSqlDriver23subscribeToNotificationERK7QString @ 11 NONAME
+ _ZN10QSqlDriver27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 12 NONAME
+ _ZN10QSqlDriver27unsubscribeFromNotificationERK7QString @ 13 NONAME
+ _ZN10QSqlDriver37subscribeToNotificationImplementationERK7QString @ 14 NONAME
+ _ZN10QSqlDriver41unsubscribeFromNotificationImplementationERK7QString @ 15 NONAME
+ _ZN10QSqlDriver7setOpenEb @ 16 NONAME
+ _ZN10QSqlDriverC2EP7QObject @ 17 NONAME
+ _ZN10QSqlDriverD0Ev @ 18 NONAME
+ _ZN10QSqlDriverD1Ev @ 19 NONAME
+ _ZN10QSqlDriverD2Ev @ 20 NONAME
+ _ZN10QSqlRecord11clearValuesEv @ 21 NONAME
+ _ZN10QSqlRecord12setGeneratedERK7QStringb @ 22 NONAME
+ _ZN10QSqlRecord12setGeneratedEib @ 23 NONAME
+ _ZN10QSqlRecord5clearEv @ 24 NONAME
+ _ZN10QSqlRecord6appendERK9QSqlField @ 25 NONAME
+ _ZN10QSqlRecord6detachEv @ 26 NONAME
+ _ZN10QSqlRecord6insertEiRK9QSqlField @ 27 NONAME
+ _ZN10QSqlRecord6removeEi @ 28 NONAME
+ _ZN10QSqlRecord7replaceEiRK9QSqlField @ 29 NONAME
+ _ZN10QSqlRecord7setNullERK7QString @ 30 NONAME
+ _ZN10QSqlRecord7setNullEi @ 31 NONAME
+ _ZN10QSqlRecord8setValueERK7QStringRK8QVariant @ 32 NONAME
+ _ZN10QSqlRecord8setValueEiRK8QVariant @ 33 NONAME
+ _ZN10QSqlRecordC1ERKS_ @ 34 NONAME
+ _ZN10QSqlRecordC1Ev @ 35 NONAME
+ _ZN10QSqlRecordC2ERKS_ @ 36 NONAME
+ _ZN10QSqlRecordC2Ev @ 37 NONAME
+ _ZN10QSqlRecordD1Ev @ 38 NONAME
+ _ZN10QSqlRecordD2Ev @ 39 NONAME
+ _ZN10QSqlRecordaSERKS_ @ 40 NONAME
+ _ZN10QSqlResult10nextResultEv @ 41 NONAME
+ _ZN10QSqlResult11savePrepareERK7QString @ 42 NONAME
+ _ZN10QSqlResult12addBindValueERK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 43 NONAME
+ _ZN10QSqlResult12setLastErrorERK9QSqlError @ 44 NONAME
+ _ZN10QSqlResult12virtual_hookEiPv @ 45 NONAME
+ _ZN10QSqlResult13fetchPreviousEv @ 46 NONAME
+ _ZN10QSqlResult14resetBindCountEv @ 47 NONAME
+ _ZN10QSqlResult14setForwardOnlyEb @ 48 NONAME
+ _ZN10QSqlResult19detachFromResultSetEv @ 49 NONAME
+ _ZN10QSqlResult27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 50 NONAME
+ _ZN10QSqlResult4execEv @ 51 NONAME
+ _ZN10QSqlResult5clearEv @ 52 NONAME
+ _ZN10QSqlResult5setAtEi @ 53 NONAME
+ _ZN10QSqlResult7prepareERK7QString @ 54 NONAME
+ _ZN10QSqlResult8setQueryERK7QString @ 55 NONAME
+ _ZN10QSqlResult9bindValueERK7QStringRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 56 NONAME
+ _ZN10QSqlResult9bindValueEiRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 57 NONAME
+ _ZN10QSqlResult9execBatchEb @ 58 NONAME
+ _ZN10QSqlResult9fetchNextEv @ 59 NONAME
+ _ZN10QSqlResult9setActiveEb @ 60 NONAME
+ _ZN10QSqlResult9setSelectEb @ 61 NONAME
+ _ZN10QSqlResultC2EPK10QSqlDriver @ 62 NONAME
+ _ZN10QSqlResultD0Ev @ 63 NONAME
+ _ZN10QSqlResultD1Ev @ 64 NONAME
+ _ZN10QSqlResultD2Ev @ 65 NONAME
+ _ZN12QSqlDatabase11addDatabaseEP10QSqlDriverRK7QString @ 66 NONAME
+ _ZN12QSqlDatabase11addDatabaseERK7QStringS2_ @ 67 NONAME
+ _ZN12QSqlDatabase11setHostNameERK7QString @ 68 NONAME
+ _ZN12QSqlDatabase11setPasswordERK7QString @ 69 NONAME
+ _ZN12QSqlDatabase11setUserNameERK7QString @ 70 NONAME
+ _ZN12QSqlDatabase11transactionEv @ 71 NONAME
+ _ZN12QSqlDatabase13cloneDatabaseERKS_RK7QString @ 72 NONAME
+ _ZN12QSqlDatabase14removeDatabaseERK7QString @ 73 NONAME
+ _ZN12QSqlDatabase15connectionNamesEv @ 74 NONAME
+ _ZN12QSqlDatabase15setDatabaseNameERK7QString @ 75 NONAME
+ _ZN12QSqlDatabase17defaultConnectionE @ 76 NONAME DATA 4
+ _ZN12QSqlDatabase17isDriverAvailableERK7QString @ 77 NONAME
+ _ZN12QSqlDatabase17registerSqlDriverERK7QStringP21QSqlDriverCreatorBase @ 78 NONAME
+ _ZN12QSqlDatabase17setConnectOptionsERK7QString @ 79 NONAME
+ _ZN12QSqlDatabase27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 80 NONAME
+ _ZN12QSqlDatabase4openERK7QStringS2_ @ 81 NONAME
+ _ZN12QSqlDatabase4openEv @ 82 NONAME
+ _ZN12QSqlDatabase5closeEv @ 83 NONAME
+ _ZN12QSqlDatabase6commitEv @ 84 NONAME
+ _ZN12QSqlDatabase7driversEv @ 85 NONAME
+ _ZN12QSqlDatabase7setPortEi @ 86 NONAME
+ _ZN12QSqlDatabase8containsERK7QString @ 87 NONAME
+ _ZN12QSqlDatabase8databaseERK7QStringb @ 88 NONAME
+ _ZN12QSqlDatabase8rollbackEv @ 89 NONAME
+ _ZN12QSqlDatabaseC1EP10QSqlDriver @ 90 NONAME
+ _ZN12QSqlDatabaseC1ERK7QString @ 91 NONAME
+ _ZN12QSqlDatabaseC1ERKS_ @ 92 NONAME
+ _ZN12QSqlDatabaseC1Ev @ 93 NONAME
+ _ZN12QSqlDatabaseC2EP10QSqlDriver @ 94 NONAME
+ _ZN12QSqlDatabaseC2ERK7QString @ 95 NONAME
+ _ZN12QSqlDatabaseC2ERKS_ @ 96 NONAME
+ _ZN12QSqlDatabaseC2Ev @ 97 NONAME
+ _ZN12QSqlDatabaseD1Ev @ 98 NONAME
+ _ZN12QSqlDatabaseD2Ev @ 99 NONAME
+ _ZN12QSqlDatabaseaSERKS_ @ 100 NONAME
+ _ZN13QSQLiteDriver11qt_metacallEN11QMetaObject4CallEiPPv @ 101 NONAME
+ _ZN13QSQLiteDriver11qt_metacastEPKc @ 102 NONAME
+ _ZN13QSQLiteDriver16beginTransactionEv @ 103 NONAME
+ _ZN13QSQLiteDriver16staticMetaObjectE @ 104 NONAME DATA 16
+ _ZN13QSQLiteDriver17commitTransactionEv @ 105 NONAME
+ _ZN13QSQLiteDriver19getStaticMetaObjectEv @ 106 NONAME
+ _ZN13QSQLiteDriver19rollbackTransactionEv @ 107 NONAME
+ _ZN13QSQLiteDriver4openERK7QStringS2_S2_S2_iS2_ @ 108 NONAME
+ _ZN13QSQLiteDriver5closeEv @ 109 NONAME
+ _ZN13QSQLiteDriverC1EP7QObject @ 110 NONAME
+ _ZN13QSQLiteDriverC1EP7sqlite3P7QObject @ 111 NONAME
+ _ZN13QSQLiteDriverC2EP7QObject @ 112 NONAME
+ _ZN13QSQLiteDriverC2EP7sqlite3P7QObject @ 113 NONAME
+ _ZN13QSQLiteDriverD0Ev @ 114 NONAME
+ _ZN13QSQLiteDriverD1Ev @ 115 NONAME
+ _ZN13QSQLiteDriverD2Ev @ 116 NONAME
+ _ZN14QSqlQueryModel11qt_metacallEN11QMetaObject4CallEiPPv @ 117 NONAME
+ _ZN14QSqlQueryModel11qt_metacastEPKc @ 118 NONAME
+ _ZN14QSqlQueryModel11queryChangeEv @ 119 NONAME
+ _ZN14QSqlQueryModel12setLastErrorERK9QSqlError @ 120 NONAME
+ _ZN14QSqlQueryModel13insertColumnsEiiRK11QModelIndex @ 121 NONAME
+ _ZN14QSqlQueryModel13removeColumnsEiiRK11QModelIndex @ 122 NONAME
+ _ZN14QSqlQueryModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 123 NONAME
+ _ZN14QSqlQueryModel16staticMetaObjectE @ 124 NONAME DATA 16
+ _ZN14QSqlQueryModel19getStaticMetaObjectEv @ 125 NONAME
+ _ZN14QSqlQueryModel5clearEv @ 126 NONAME
+ _ZN14QSqlQueryModel8setQueryERK7QStringRK12QSqlDatabase @ 127 NONAME
+ _ZN14QSqlQueryModel8setQueryERK9QSqlQuery @ 128 NONAME
+ _ZN14QSqlQueryModel9fetchMoreERK11QModelIndex @ 129 NONAME
+ _ZN14QSqlQueryModelC1EP7QObject @ 130 NONAME
+ _ZN14QSqlQueryModelC1ER21QSqlQueryModelPrivateP7QObject @ 131 NONAME
+ _ZN14QSqlQueryModelC2EP7QObject @ 132 NONAME
+ _ZN14QSqlQueryModelC2ER21QSqlQueryModelPrivateP7QObject @ 133 NONAME
+ _ZN14QSqlQueryModelD0Ev @ 134 NONAME
+ _ZN14QSqlQueryModelD1Ev @ 135 NONAME
+ _ZN14QSqlQueryModelD2Ev @ 136 NONAME
+ _ZN14QSqlTableModel10insertRowsEiiRK11QModelIndex @ 137 NONAME
+ _ZN14QSqlTableModel10removeRowsEiiRK11QModelIndex @ 138 NONAME
+ _ZN14QSqlTableModel11primeInsertEiR10QSqlRecord @ 139 NONAME
+ _ZN14QSqlTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 140 NONAME
+ _ZN14QSqlTableModel11qt_metacastEPKc @ 141 NONAME
+ _ZN14QSqlTableModel12beforeDeleteEi @ 142 NONAME
+ _ZN14QSqlTableModel12beforeInsertER10QSqlRecord @ 143 NONAME
+ _ZN14QSqlTableModel12beforeUpdateEiR10QSqlRecord @ 144 NONAME
+ _ZN14QSqlTableModel12insertRecordEiRK10QSqlRecord @ 145 NONAME
+ _ZN14QSqlTableModel13removeColumnsEiiRK11QModelIndex @ 146 NONAME
+ _ZN14QSqlTableModel13setPrimaryKeyERK9QSqlIndex @ 147 NONAME
+ _ZN14QSqlTableModel15setEditStrategyENS_12EditStrategyE @ 148 NONAME
+ _ZN14QSqlTableModel16staticMetaObjectE @ 149 NONAME DATA 16
+ _ZN14QSqlTableModel16updateRowInTableEiRK10QSqlRecord @ 150 NONAME
+ _ZN14QSqlTableModel18deleteRowFromTableEi @ 151 NONAME
+ _ZN14QSqlTableModel18insertRowIntoTableERK10QSqlRecord @ 152 NONAME
+ _ZN14QSqlTableModel19getStaticMetaObjectEv @ 153 NONAME
+ _ZN14QSqlTableModel4sortEiN2Qt9SortOrderE @ 154 NONAME
+ _ZN14QSqlTableModel5clearEv @ 155 NONAME
+ _ZN14QSqlTableModel6revertEv @ 156 NONAME
+ _ZN14QSqlTableModel6selectEv @ 157 NONAME
+ _ZN14QSqlTableModel6submitEv @ 158 NONAME
+ _ZN14QSqlTableModel7setDataERK11QModelIndexRK8QVarianti @ 159 NONAME
+ _ZN14QSqlTableModel7setSortEiN2Qt9SortOrderE @ 160 NONAME
+ _ZN14QSqlTableModel8setQueryERK9QSqlQuery @ 161 NONAME
+ _ZN14QSqlTableModel8setTableERK7QString @ 162 NONAME
+ _ZN14QSqlTableModel9revertAllEv @ 163 NONAME
+ _ZN14QSqlTableModel9revertRowEi @ 164 NONAME
+ _ZN14QSqlTableModel9setFilterERK7QString @ 165 NONAME
+ _ZN14QSqlTableModel9setRecordEiRK10QSqlRecord @ 166 NONAME
+ _ZN14QSqlTableModel9submitAllEv @ 167 NONAME
+ _ZN14QSqlTableModelC1EP7QObject12QSqlDatabase @ 168 NONAME
+ _ZN14QSqlTableModelC1ER21QSqlTableModelPrivateP7QObject12QSqlDatabase @ 169 NONAME
+ _ZN14QSqlTableModelC2EP7QObject12QSqlDatabase @ 170 NONAME
+ _ZN14QSqlTableModelC2ER21QSqlTableModelPrivateP7QObject12QSqlDatabase @ 171 NONAME
+ _ZN14QSqlTableModelD0Ev @ 172 NONAME
+ _ZN14QSqlTableModelD1Ev @ 173 NONAME
+ _ZN14QSqlTableModelD2Ev @ 174 NONAME
+ _ZN16QSqlCachedResult10fetchFirstEv @ 175 NONAME
+ _ZN16QSqlCachedResult11clearValuesEv @ 176 NONAME
+ _ZN16QSqlCachedResult12virtual_hookEiPv @ 177 NONAME
+ _ZN16QSqlCachedResult13fetchPreviousEv @ 178 NONAME
+ _ZN16QSqlCachedResult4dataEi @ 179 NONAME
+ _ZN16QSqlCachedResult4initEi @ 180 NONAME
+ _ZN16QSqlCachedResult5cacheEv @ 181 NONAME
+ _ZN16QSqlCachedResult5fetchEi @ 182 NONAME
+ _ZN16QSqlCachedResult6isNullEi @ 183 NONAME
+ _ZN16QSqlCachedResult7cleanupEv @ 184 NONAME
+ _ZN16QSqlCachedResult9cacheNextEv @ 185 NONAME
+ _ZN16QSqlCachedResult9fetchLastEv @ 186 NONAME
+ _ZN16QSqlCachedResult9fetchNextEv @ 187 NONAME
+ _ZN16QSqlCachedResultC2EPK10QSqlDriver @ 188 NONAME
+ _ZN16QSqlCachedResultD0Ev @ 189 NONAME
+ _ZN16QSqlCachedResultD1Ev @ 190 NONAME
+ _ZN16QSqlCachedResultD2Ev @ 191 NONAME
+ _ZN16QSqlDriverPlugin11qt_metacallEN11QMetaObject4CallEiPPv @ 192 NONAME
+ _ZN16QSqlDriverPlugin11qt_metacastEPKc @ 193 NONAME
+ _ZN16QSqlDriverPlugin16staticMetaObjectE @ 194 NONAME DATA 16
+ _ZN16QSqlDriverPlugin19getStaticMetaObjectEv @ 195 NONAME
+ _ZN16QSqlDriverPluginC2EP7QObject @ 196 NONAME
+ _ZN16QSqlDriverPluginD0Ev @ 197 NONAME
+ _ZN16QSqlDriverPluginD1Ev @ 198 NONAME
+ _ZN16QSqlDriverPluginD2Ev @ 199 NONAME
+ _ZN24QSqlRelationalTableModel11qt_metacallEN11QMetaObject4CallEiPPv @ 200 NONAME
+ _ZN24QSqlRelationalTableModel11qt_metacastEPKc @ 201 NONAME
+ _ZN24QSqlRelationalTableModel11setRelationEiRK12QSqlRelation @ 202 NONAME
+ _ZN24QSqlRelationalTableModel13removeColumnsEiiRK11QModelIndex @ 203 NONAME
+ _ZN24QSqlRelationalTableModel16staticMetaObjectE @ 204 NONAME DATA 16
+ _ZN24QSqlRelationalTableModel16updateRowInTableEiRK10QSqlRecord @ 205 NONAME
+ _ZN24QSqlRelationalTableModel18insertRowIntoTableERK10QSqlRecord @ 206 NONAME
+ _ZN24QSqlRelationalTableModel19getStaticMetaObjectEv @ 207 NONAME
+ _ZN24QSqlRelationalTableModel5clearEv @ 208 NONAME
+ _ZN24QSqlRelationalTableModel6selectEv @ 209 NONAME
+ _ZN24QSqlRelationalTableModel7setDataERK11QModelIndexRK8QVarianti @ 210 NONAME
+ _ZN24QSqlRelationalTableModel8setTableERK7QString @ 211 NONAME
+ _ZN24QSqlRelationalTableModel9revertRowEi @ 212 NONAME
+ _ZN24QSqlRelationalTableModelC1EP7QObject12QSqlDatabase @ 213 NONAME
+ _ZN24QSqlRelationalTableModelC2EP7QObject12QSqlDatabase @ 214 NONAME
+ _ZN24QSqlRelationalTableModelD0Ev @ 215 NONAME
+ _ZN24QSqlRelationalTableModelD1Ev @ 216 NONAME
+ _ZN24QSqlRelationalTableModelD2Ev @ 217 NONAME
+ _ZN9QSqlError13setDriverTextERK7QString @ 218 NONAME
+ _ZN9QSqlError15setDatabaseTextERK7QString @ 219 NONAME
+ _ZN9QSqlError7setTypeENS_9ErrorTypeE @ 220 NONAME
+ _ZN9QSqlError9setNumberEi @ 221 NONAME
+ _ZN9QSqlErrorC1ERK7QStringS2_NS_9ErrorTypeEi @ 222 NONAME
+ _ZN9QSqlErrorC1ERKS_ @ 223 NONAME
+ _ZN9QSqlErrorC2ERK7QStringS2_NS_9ErrorTypeEi @ 224 NONAME
+ _ZN9QSqlErrorC2ERKS_ @ 225 NONAME
+ _ZN9QSqlErrorD1Ev @ 226 NONAME
+ _ZN9QSqlErrorD2Ev @ 227 NONAME
+ _ZN9QSqlErroraSERKS_ @ 228 NONAME
+ _ZN9QSqlField10setSqlTypeEi @ 229 NONAME
+ _ZN9QSqlField11setReadOnlyEb @ 230 NONAME
+ _ZN9QSqlField12setAutoValueEb @ 231 NONAME
+ _ZN9QSqlField12setGeneratedEb @ 232 NONAME
+ _ZN9QSqlField12setPrecisionEi @ 233 NONAME
+ _ZN9QSqlField15setDefaultValueERK8QVariant @ 234 NONAME
+ _ZN9QSqlField17setRequiredStatusENS_14RequiredStatusE @ 235 NONAME
+ _ZN9QSqlField5clearEv @ 236 NONAME
+ _ZN9QSqlField6detachEv @ 237 NONAME
+ _ZN9QSqlField7setNameERK7QString @ 238 NONAME
+ _ZN9QSqlField7setTypeEN8QVariant4TypeE @ 239 NONAME
+ _ZN9QSqlField8setValueERK8QVariant @ 240 NONAME
+ _ZN9QSqlField9setLengthEi @ 241 NONAME
+ _ZN9QSqlFieldC1ERK7QStringN8QVariant4TypeE @ 242 NONAME
+ _ZN9QSqlFieldC1ERKS_ @ 243 NONAME
+ _ZN9QSqlFieldC2ERK7QStringN8QVariant4TypeE @ 244 NONAME
+ _ZN9QSqlFieldC2ERKS_ @ 245 NONAME
+ _ZN9QSqlFieldD1Ev @ 246 NONAME
+ _ZN9QSqlFieldD2Ev @ 247 NONAME
+ _ZN9QSqlFieldaSERKS_ @ 248 NONAME
+ _ZN9QSqlIndex13setCursorNameERK7QString @ 249 NONAME
+ _ZN9QSqlIndex13setDescendingEib @ 250 NONAME
+ _ZN9QSqlIndex6appendERK9QSqlField @ 251 NONAME
+ _ZN9QSqlIndex6appendERK9QSqlFieldb @ 252 NONAME
+ _ZN9QSqlIndex7setNameERK7QString @ 253 NONAME
+ _ZN9QSqlIndexC1ERK7QStringS2_ @ 254 NONAME
+ _ZN9QSqlIndexC1ERKS_ @ 255 NONAME
+ _ZN9QSqlIndexC2ERK7QStringS2_ @ 256 NONAME
+ _ZN9QSqlIndexC2ERKS_ @ 257 NONAME
+ _ZN9QSqlIndexD1Ev @ 258 NONAME
+ _ZN9QSqlIndexD2Ev @ 259 NONAME
+ _ZN9QSqlIndexaSERKS_ @ 260 NONAME
+ _ZN9QSqlQuery10nextResultEv @ 261 NONAME
+ _ZN9QSqlQuery12addBindValueERK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 262 NONAME
+ _ZN9QSqlQuery14setForwardOnlyEb @ 263 NONAME
+ _ZN9QSqlQuery27setNumericalPrecisionPolicyEN4QSql24NumericalPrecisionPolicyE @ 264 NONAME
+ _ZN9QSqlQuery4execERK7QString @ 265 NONAME
+ _ZN9QSqlQuery4execEv @ 266 NONAME
+ _ZN9QSqlQuery4lastEv @ 267 NONAME
+ _ZN9QSqlQuery4nextEv @ 268 NONAME
+ _ZN9QSqlQuery4seekEib @ 269 NONAME
+ _ZN9QSqlQuery5clearEv @ 270 NONAME
+ _ZN9QSqlQuery5firstEv @ 271 NONAME
+ _ZN9QSqlQuery6finishEv @ 272 NONAME
+ _ZN9QSqlQuery7prepareERK7QString @ 273 NONAME
+ _ZN9QSqlQuery8previousEv @ 274 NONAME
+ _ZN9QSqlQuery9bindValueERK7QStringRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 275 NONAME
+ _ZN9QSqlQuery9bindValueEiRK8QVariant6QFlagsIN4QSql13ParamTypeFlagEE @ 276 NONAME
+ _ZN9QSqlQuery9execBatchENS_18BatchExecutionModeE @ 277 NONAME
+ _ZN9QSqlQueryC1E12QSqlDatabase @ 278 NONAME
+ _ZN9QSqlQueryC1EP10QSqlResult @ 279 NONAME
+ _ZN9QSqlQueryC1ERK7QString12QSqlDatabase @ 280 NONAME
+ _ZN9QSqlQueryC1ERKS_ @ 281 NONAME
+ _ZN9QSqlQueryC2E12QSqlDatabase @ 282 NONAME
+ _ZN9QSqlQueryC2EP10QSqlResult @ 283 NONAME
+ _ZN9QSqlQueryC2ERK7QString12QSqlDatabase @ 284 NONAME
+ _ZN9QSqlQueryC2ERKS_ @ 285 NONAME
+ _ZN9QSqlQueryD1Ev @ 286 NONAME
+ _ZN9QSqlQueryD2Ev @ 287 NONAME
+ _ZN9QSqlQueryaSERKS_ @ 288 NONAME
+ _ZNK10QSqlDriver10metaObjectEv @ 289 NONAME
+ _ZNK10QSqlDriver11formatValueERK9QSqlFieldb @ 290 NONAME
+ _ZNK10QSqlDriver11isOpenErrorEv @ 291 NONAME
+ _ZNK10QSqlDriver12primaryIndexERK7QString @ 292 NONAME
+ _ZNK10QSqlDriver12sqlStatementENS_13StatementTypeERK7QStringRK10QSqlRecordb @ 293 NONAME
+ _ZNK10QSqlDriver15stripDelimitersERK7QStringNS_14IdentifierTypeE @ 294 NONAME
+ _ZNK10QSqlDriver16escapeIdentifierERK7QStringNS_14IdentifierTypeE @ 295 NONAME
+ _ZNK10QSqlDriver19isIdentifierEscapedERK7QStringNS_14IdentifierTypeE @ 296 NONAME
+ _ZNK10QSqlDriver24numericalPrecisionPolicyEv @ 297 NONAME
+ _ZNK10QSqlDriver25subscribedToNotificationsEv @ 298 NONAME
+ _ZNK10QSqlDriver29stripDelimitersImplementationERK7QStringNS_14IdentifierTypeE @ 299 NONAME
+ _ZNK10QSqlDriver33isIdentifierEscapedImplementationERK7QStringNS_14IdentifierTypeE @ 300 NONAME
+ _ZNK10QSqlDriver39subscribedToNotificationsImplementationEv @ 301 NONAME
+ _ZNK10QSqlDriver6handleEv @ 302 NONAME
+ _ZNK10QSqlDriver6isOpenEv @ 303 NONAME
+ _ZNK10QSqlDriver6recordERK7QString @ 304 NONAME
+ _ZNK10QSqlDriver6tablesEN4QSql9TableTypeE @ 305 NONAME
+ _ZNK10QSqlDriver9lastErrorEv @ 306 NONAME
+ _ZNK10QSqlRecord11isGeneratedERK7QString @ 307 NONAME
+ _ZNK10QSqlRecord11isGeneratedEi @ 308 NONAME
+ _ZNK10QSqlRecord5countEv @ 309 NONAME
+ _ZNK10QSqlRecord5fieldERK7QString @ 310 NONAME
+ _ZNK10QSqlRecord5fieldEi @ 311 NONAME
+ _ZNK10QSqlRecord5valueERK7QString @ 312 NONAME
+ _ZNK10QSqlRecord5valueEi @ 313 NONAME
+ _ZNK10QSqlRecord6isNullERK7QString @ 314 NONAME
+ _ZNK10QSqlRecord6isNullEi @ 315 NONAME
+ _ZNK10QSqlRecord7indexOfERK7QString @ 316 NONAME
+ _ZNK10QSqlRecord7isEmptyEv @ 317 NONAME
+ _ZNK10QSqlRecord8containsERK7QString @ 318 NONAME
+ _ZNK10QSqlRecord9fieldNameEi @ 319 NONAME
+ _ZNK10QSqlRecordeqERKS_ @ 320 NONAME
+ _ZNK10QSqlResult10boundValueERK7QString @ 321 NONAME
+ _ZNK10QSqlResult10boundValueEi @ 322 NONAME
+ _ZNK10QSqlResult11boundValuesEv @ 323 NONAME
+ _ZNK10QSqlResult12hasOutValuesEv @ 324 NONAME
+ _ZNK10QSqlResult12lastInsertIdEv @ 325 NONAME
+ _ZNK10QSqlResult13bindValueTypeERK7QString @ 326 NONAME
+ _ZNK10QSqlResult13bindValueTypeEi @ 327 NONAME
+ _ZNK10QSqlResult13bindingSyntaxEv @ 328 NONAME
+ _ZNK10QSqlResult13executedQueryEv @ 329 NONAME
+ _ZNK10QSqlResult13isForwardOnlyEv @ 330 NONAME
+ _ZNK10QSqlResult14boundValueNameEi @ 331 NONAME
+ _ZNK10QSqlResult15boundValueCountEv @ 332 NONAME
+ _ZNK10QSqlResult24numericalPrecisionPolicyEv @ 333 NONAME
+ _ZNK10QSqlResult2atEv @ 334 NONAME
+ _ZNK10QSqlResult6driverEv @ 335 NONAME
+ _ZNK10QSqlResult6handleEv @ 336 NONAME
+ _ZNK10QSqlResult6recordEv @ 337 NONAME
+ _ZNK10QSqlResult7isValidEv @ 338 NONAME
+ _ZNK10QSqlResult8isActiveEv @ 339 NONAME
+ _ZNK10QSqlResult8isSelectEv @ 340 NONAME
+ _ZNK10QSqlResult9lastErrorEv @ 341 NONAME
+ _ZNK10QSqlResult9lastQueryEv @ 342 NONAME
+ _ZNK12QSqlDatabase10driverNameEv @ 343 NONAME
+ _ZNK12QSqlDatabase11isOpenErrorEv @ 344 NONAME
+ _ZNK12QSqlDatabase12databaseNameEv @ 345 NONAME
+ _ZNK12QSqlDatabase12primaryIndexERK7QString @ 346 NONAME
+ _ZNK12QSqlDatabase14connectOptionsEv @ 347 NONAME
+ _ZNK12QSqlDatabase14connectionNameEv @ 348 NONAME
+ _ZNK12QSqlDatabase24numericalPrecisionPolicyEv @ 349 NONAME
+ _ZNK12QSqlDatabase4execERK7QString @ 350 NONAME
+ _ZNK12QSqlDatabase4portEv @ 351 NONAME
+ _ZNK12QSqlDatabase6driverEv @ 352 NONAME
+ _ZNK12QSqlDatabase6isOpenEv @ 353 NONAME
+ _ZNK12QSqlDatabase6recordERK7QString @ 354 NONAME
+ _ZNK12QSqlDatabase6tablesEN4QSql9TableTypeE @ 355 NONAME
+ _ZNK12QSqlDatabase7isValidEv @ 356 NONAME
+ _ZNK12QSqlDatabase8hostNameEv @ 357 NONAME
+ _ZNK12QSqlDatabase8passwordEv @ 358 NONAME
+ _ZNK12QSqlDatabase8userNameEv @ 359 NONAME
+ _ZNK12QSqlDatabase9lastErrorEv @ 360 NONAME
+ _ZNK13QSQLiteDriver10hasFeatureEN10QSqlDriver13DriverFeatureE @ 361 NONAME
+ _ZNK13QSQLiteDriver10metaObjectEv @ 362 NONAME
+ _ZNK13QSQLiteDriver12createResultEv @ 363 NONAME
+ _ZNK13QSQLiteDriver12primaryIndexERK7QString @ 364 NONAME
+ _ZNK13QSQLiteDriver16escapeIdentifierERK7QStringN10QSqlDriver14IdentifierTypeE @ 365 NONAME
+ _ZNK13QSQLiteDriver6handleEv @ 366 NONAME
+ _ZNK13QSQLiteDriver6recordERK7QString @ 367 NONAME
+ _ZNK13QSQLiteDriver6tablesEN4QSql9TableTypeE @ 368 NONAME
+ _ZNK14QSqlQueryModel10headerDataEiN2Qt11OrientationEi @ 369 NONAME
+ _ZNK14QSqlQueryModel10metaObjectEv @ 370 NONAME
+ _ZNK14QSqlQueryModel11columnCountERK11QModelIndex @ 371 NONAME
+ _ZNK14QSqlQueryModel12canFetchMoreERK11QModelIndex @ 372 NONAME
+ _ZNK14QSqlQueryModel12indexInQueryERK11QModelIndex @ 373 NONAME
+ _ZNK14QSqlQueryModel4dataERK11QModelIndexi @ 374 NONAME
+ _ZNK14QSqlQueryModel5queryEv @ 375 NONAME
+ _ZNK14QSqlQueryModel6recordEi @ 376 NONAME
+ _ZNK14QSqlQueryModel6recordEv @ 377 NONAME
+ _ZNK14QSqlQueryModel8rowCountERK11QModelIndex @ 378 NONAME
+ _ZNK14QSqlQueryModel9lastErrorEv @ 379 NONAME
+ _ZNK14QSqlTableModel10fieldIndexERK7QString @ 380 NONAME
+ _ZNK14QSqlTableModel10headerDataEiN2Qt11OrientationEi @ 381 NONAME
+ _ZNK14QSqlTableModel10metaObjectEv @ 382 NONAME
+ _ZNK14QSqlTableModel10primaryKeyEv @ 383 NONAME
+ _ZNK14QSqlTableModel12editStrategyEv @ 384 NONAME
+ _ZNK14QSqlTableModel12indexInQueryERK11QModelIndex @ 385 NONAME
+ _ZNK14QSqlTableModel13orderByClauseEv @ 386 NONAME
+ _ZNK14QSqlTableModel15selectStatementEv @ 387 NONAME
+ _ZNK14QSqlTableModel4dataERK11QModelIndexi @ 388 NONAME
+ _ZNK14QSqlTableModel5flagsERK11QModelIndex @ 389 NONAME
+ _ZNK14QSqlTableModel6filterEv @ 390 NONAME
+ _ZNK14QSqlTableModel7isDirtyERK11QModelIndex @ 391 NONAME
+ _ZNK14QSqlTableModel8databaseEv @ 392 NONAME
+ _ZNK14QSqlTableModel8rowCountERK11QModelIndex @ 393 NONAME
+ _ZNK14QSqlTableModel9tableNameEv @ 394 NONAME
+ _ZNK16QSqlCachedResult8colCountEv @ 395 NONAME
+ _ZNK16QSqlDriverPlugin10metaObjectEv @ 396 NONAME
+ _ZNK24QSqlRelationalTableModel10metaObjectEv @ 397 NONAME
+ _ZNK24QSqlRelationalTableModel13orderByClauseEv @ 398 NONAME
+ _ZNK24QSqlRelationalTableModel13relationModelEi @ 399 NONAME
+ _ZNK24QSqlRelationalTableModel15selectStatementEv @ 400 NONAME
+ _ZNK24QSqlRelationalTableModel4dataERK11QModelIndexi @ 401 NONAME
+ _ZNK24QSqlRelationalTableModel8relationEi @ 402 NONAME
+ _ZNK9QSqlError10driverTextEv @ 403 NONAME
+ _ZNK9QSqlError12databaseTextEv @ 404 NONAME
+ _ZNK9QSqlError4textEv @ 405 NONAME
+ _ZNK9QSqlError4typeEv @ 406 NONAME
+ _ZNK9QSqlError6numberEv @ 407 NONAME
+ _ZNK9QSqlError7isValidEv @ 408 NONAME
+ _ZNK9QSqlField10isReadOnlyEv @ 409 NONAME
+ _ZNK9QSqlField11isAutoValueEv @ 410 NONAME
+ _ZNK9QSqlField11isGeneratedEv @ 411 NONAME
+ _ZNK9QSqlField12defaultValueEv @ 412 NONAME
+ _ZNK9QSqlField14requiredStatusEv @ 413 NONAME
+ _ZNK9QSqlField4nameEv @ 414 NONAME
+ _ZNK9QSqlField4typeEv @ 415 NONAME
+ _ZNK9QSqlField6isNullEv @ 416 NONAME
+ _ZNK9QSqlField6lengthEv @ 417 NONAME
+ _ZNK9QSqlField6typeIDEv @ 418 NONAME
+ _ZNK9QSqlField7isValidEv @ 419 NONAME
+ _ZNK9QSqlField9precisionEv @ 420 NONAME
+ _ZNK9QSqlFieldeqERKS_ @ 421 NONAME
+ _ZNK9QSqlIndex11createFieldEiRK7QStringb @ 422 NONAME
+ _ZNK9QSqlIndex12isDescendingEi @ 423 NONAME
+ _ZNK9QSqlQuery10boundValueERK7QString @ 424 NONAME
+ _ZNK9QSqlQuery10boundValueEi @ 425 NONAME
+ _ZNK9QSqlQuery11boundValuesEv @ 426 NONAME
+ _ZNK9QSqlQuery12lastInsertIdEv @ 427 NONAME
+ _ZNK9QSqlQuery13executedQueryEv @ 428 NONAME
+ _ZNK9QSqlQuery13isForwardOnlyEv @ 429 NONAME
+ _ZNK9QSqlQuery15numRowsAffectedEv @ 430 NONAME
+ _ZNK9QSqlQuery24numericalPrecisionPolicyEv @ 431 NONAME
+ _ZNK9QSqlQuery2atEv @ 432 NONAME
+ _ZNK9QSqlQuery4sizeEv @ 433 NONAME
+ _ZNK9QSqlQuery5valueEi @ 434 NONAME
+ _ZNK9QSqlQuery6driverEv @ 435 NONAME
+ _ZNK9QSqlQuery6isNullEi @ 436 NONAME
+ _ZNK9QSqlQuery6recordEv @ 437 NONAME
+ _ZNK9QSqlQuery6resultEv @ 438 NONAME
+ _ZNK9QSqlQuery7isValidEv @ 439 NONAME
+ _ZNK9QSqlQuery8isActiveEv @ 440 NONAME
+ _ZNK9QSqlQuery8isSelectEv @ 441 NONAME
+ _ZNK9QSqlQuery9lastErrorEv @ 442 NONAME
+ _ZNK9QSqlQuery9lastQueryEv @ 443 NONAME
+ _ZTI10QSqlDriver @ 444 NONAME
+ _ZTI10QSqlResult @ 445 NONAME
+ _ZTI13QSQLiteDriver @ 446 NONAME
+ _ZTI14QSqlQueryModel @ 447 NONAME
+ _ZTI14QSqlTableModel @ 448 NONAME
+ _ZTI16QSqlCachedResult @ 449 NONAME
+ _ZTI16QSqlDriverPlugin @ 450 NONAME
+ _ZTI24QSqlRelationalTableModel @ 451 NONAME
+ _ZTI26QSqlDriverFactoryInterface @ 452 NONAME
+ _ZTV10QSqlDriver @ 453 NONAME
+ _ZTV10QSqlResult @ 454 NONAME
+ _ZTV13QSQLiteDriver @ 455 NONAME
+ _ZTV14QSqlQueryModel @ 456 NONAME
+ _ZTV14QSqlTableModel @ 457 NONAME
+ _ZTV16QSqlCachedResult @ 458 NONAME
+ _ZTV16QSqlDriverPlugin @ 459 NONAME
+ _ZTV24QSqlRelationalTableModel @ 460 NONAME
+ _ZThn8_N16QSqlDriverPluginD0Ev @ 461 NONAME
+ _ZThn8_N16QSqlDriverPluginD1Ev @ 462 NONAME
+ _Zls6QDebugRK10QSqlRecord @ 463 NONAME
+ _Zls6QDebugRK12QSqlDatabase @ 464 NONAME
+ _Zls6QDebugRK9QSqlError @ 465 NONAME
+ _Zls6QDebugRK9QSqlField @ 466 NONAME
diff --git a/src/s60installs/eabi/QtSvgu.def b/src/s60installs/eabi/QtSvgu.def
index 838b68c..ccc029d 100644
--- a/src/s60installs/eabi/QtSvgu.def
+++ b/src/s60installs/eabi/QtSvgu.def
@@ -1,9 +1,9 @@
EXPORTS
- _Z22qt_inflateGZipDataFromP9QIODevice @ 1 NONAME
- _ZN10QSvgWidget10paintEventEP11QPaintEvent @ 2 NONAME
- _ZN10QSvgWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME
- _ZN10QSvgWidget11qt_metacastEPKc @ 4 NONAME
- _ZN10QSvgWidget16staticMetaObjectE @ 5 NONAME DATA 16
+ _ZN10QSvgWidget10paintEventEP11QPaintEvent @ 1 NONAME
+ _ZN10QSvgWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME
+ _ZN10QSvgWidget11qt_metacastEPKc @ 3 NONAME
+ _ZN10QSvgWidget16staticMetaObjectE @ 4 NONAME DATA 16
+ _ZN10QSvgWidget19getStaticMetaObjectEv @ 5 NONAME
_ZN10QSvgWidget4loadERK10QByteArray @ 6 NONAME
_ZN10QSvgWidget4loadERK7QString @ 7 NONAME
_ZN10QSvgWidgetC1EP7QWidget @ 8 NONAME
@@ -21,194 +21,127 @@ EXPORTS
_ZN12QSvgRenderer15setCurrentFrameEi @ 20 NONAME
_ZN12QSvgRenderer16staticMetaObjectE @ 21 NONAME DATA 16
_ZN12QSvgRenderer18setFramesPerSecondEi @ 22 NONAME
- _ZN12QSvgRenderer4loadEP16QXmlStreamReader @ 23 NONAME
- _ZN12QSvgRenderer4loadERK10QByteArray @ 24 NONAME
- _ZN12QSvgRenderer4loadERK7QString @ 25 NONAME
- _ZN12QSvgRenderer6renderEP8QPainter @ 26 NONAME
- _ZN12QSvgRenderer6renderEP8QPainterRK6QRectF @ 27 NONAME
- _ZN12QSvgRenderer6renderEP8QPainterRK7QStringRK6QRectF @ 28 NONAME
- _ZN12QSvgRendererC1EP16QXmlStreamReaderP7QObject @ 29 NONAME
- _ZN12QSvgRendererC1EP7QObject @ 30 NONAME
- _ZN12QSvgRendererC1ERK10QByteArrayP7QObject @ 31 NONAME
- _ZN12QSvgRendererC1ERK7QStringP7QObject @ 32 NONAME
- _ZN12QSvgRendererC2EP16QXmlStreamReaderP7QObject @ 33 NONAME
- _ZN12QSvgRendererC2EP7QObject @ 34 NONAME
- _ZN12QSvgRendererC2ERK10QByteArrayP7QObject @ 35 NONAME
- _ZN12QSvgRendererC2ERK7QStringP7QObject @ 36 NONAME
- _ZN12QSvgRendererD0Ev @ 37 NONAME
- _ZN12QSvgRendererD1Ev @ 38 NONAME
- _ZN12QSvgRendererD2Ev @ 39 NONAME
- _ZN13QSvgGenerator10setViewBoxERK5QRect @ 40 NONAME
- _ZN13QSvgGenerator10setViewBoxERK6QRectF @ 41 NONAME
- _ZN13QSvgGenerator11setFileNameERK7QString @ 42 NONAME
- _ZN13QSvgGenerator13setResolutionEi @ 43 NONAME
- _ZN13QSvgGenerator14setDescriptionERK7QString @ 44 NONAME
- _ZN13QSvgGenerator15setOutputDeviceEP9QIODevice @ 45 NONAME
- _ZN13QSvgGenerator7setSizeERK5QSize @ 46 NONAME
- _ZN13QSvgGenerator8setTitleERK7QString @ 47 NONAME
- _ZN13QSvgGeneratorC1Ev @ 48 NONAME
- _ZN13QSvgGeneratorC2Ev @ 49 NONAME
- _ZN13QSvgGeneratorD0Ev @ 50 NONAME
- _ZN13QSvgGeneratorD1Ev @ 51 NONAME
- _ZN13QSvgGeneratorD2Ev @ 52 NONAME
- _ZN16QGraphicsSvgItem11qt_metacallEN11QMetaObject4CallEiPPv @ 53 NONAME
- _ZN16QGraphicsSvgItem11qt_metacastEPKc @ 54 NONAME
- _ZN16QGraphicsSvgItem12setElementIdERK7QString @ 55 NONAME
- _ZN16QGraphicsSvgItem16staticMetaObjectE @ 56 NONAME DATA 16
- _ZN16QGraphicsSvgItem17setCachingEnabledEb @ 57 NONAME
- _ZN16QGraphicsSvgItem17setSharedRendererEP12QSvgRenderer @ 58 NONAME
- _ZN16QGraphicsSvgItem19setMaximumCacheSizeERK5QSize @ 59 NONAME
- _ZN16QGraphicsSvgItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 60 NONAME
- _ZN16QGraphicsSvgItemC1EP13QGraphicsItem @ 61 NONAME
- _ZN16QGraphicsSvgItemC1ERK7QStringP13QGraphicsItem @ 62 NONAME
- _ZN16QGraphicsSvgItemC2EP13QGraphicsItem @ 63 NONAME
- _ZN16QGraphicsSvgItemC2ERK7QStringP13QGraphicsItem @ 64 NONAME
- _ZN16QSvgTinyDocument10addSvgFontEP8QSvgFont @ 65 NONAME
- _ZN16QSvgTinyDocument10setViewBoxERK6QRectF @ 66 NONAME
- _ZN16QSvgTinyDocument11setAnimatedEb @ 67 NONAME
- _ZN16QSvgTinyDocument15setCurrentFrameEi @ 68 NONAME
- _ZN16QSvgTinyDocument16restartAnimationEv @ 69 NONAME
- _ZN16QSvgTinyDocument17mapSourceToTargetEP8QPainterRK6QRectFS4_ @ 70 NONAME
- _ZN16QSvgTinyDocument18setFramesPerSecondEi @ 71 NONAME
- _ZN16QSvgTinyDocument4drawEP8QPainter @ 72 NONAME
- _ZN16QSvgTinyDocument4drawEP8QPainterR15QSvgExtraStates @ 73 NONAME
- _ZN16QSvgTinyDocument4drawEP8QPainterRK6QRectF @ 74 NONAME
- _ZN16QSvgTinyDocument4drawEP8QPainterRK7QStringRK6QRectF @ 75 NONAME
- _ZN16QSvgTinyDocument4loadEP16QXmlStreamReader @ 76 NONAME
- _ZN16QSvgTinyDocument4loadERK10QByteArray @ 77 NONAME
- _ZN16QSvgTinyDocument4loadERK7QString @ 78 NONAME
- _ZN16QSvgTinyDocument8setWidthEib @ 79 NONAME
- _ZN16QSvgTinyDocument9setHeightEib @ 80 NONAME
- _ZN16QSvgTinyDocumentC1Ev @ 81 NONAME
- _ZN16QSvgTinyDocumentC2Ev @ 82 NONAME
- _ZN16QSvgTinyDocumentD0Ev @ 83 NONAME
- _ZN16QSvgTinyDocumentD1Ev @ 84 NONAME
- _ZN16QSvgTinyDocumentD2Ev @ 85 NONAME
- _ZNK10QSvgWidget10metaObjectEv @ 86 NONAME
- _ZNK10QSvgWidget8rendererEv @ 87 NONAME
- _ZNK10QSvgWidget8sizeHintEv @ 88 NONAME
- _ZNK12QSvgRenderer10metaObjectEv @ 89 NONAME
- _ZNK12QSvgRenderer11defaultSizeEv @ 90 NONAME
- _ZNK12QSvgRenderer12currentFrameEv @ 91 NONAME
- _ZNK12QSvgRenderer13elementExistsERK7QString @ 92 NONAME
- _ZNK12QSvgRenderer15boundsOnElementERK7QString @ 93 NONAME
- _ZNK12QSvgRenderer15framesPerSecondEv @ 94 NONAME
- _ZNK12QSvgRenderer16matrixForElementERK7QString @ 95 NONAME
- _ZNK12QSvgRenderer17animationDurationEv @ 96 NONAME
- _ZNK12QSvgRenderer7isValidEv @ 97 NONAME
- _ZNK12QSvgRenderer7viewBoxEv @ 98 NONAME
- _ZNK12QSvgRenderer8animatedEv @ 99 NONAME
- _ZNK12QSvgRenderer8viewBoxFEv @ 100 NONAME
- _ZNK13QSvgGenerator10resolutionEv @ 101 NONAME
- _ZNK13QSvgGenerator11descriptionEv @ 102 NONAME
- _ZNK13QSvgGenerator11paintEngineEv @ 103 NONAME
- _ZNK13QSvgGenerator12outputDeviceEv @ 104 NONAME
- _ZNK13QSvgGenerator4sizeEv @ 105 NONAME
- _ZNK13QSvgGenerator5titleEv @ 106 NONAME
- _ZNK13QSvgGenerator6metricEN12QPaintDevice17PaintDeviceMetricE @ 107 NONAME
- _ZNK13QSvgGenerator7viewBoxEv @ 108 NONAME
- _ZNK13QSvgGenerator8fileNameEv @ 109 NONAME
- _ZNK13QSvgGenerator8viewBoxFEv @ 110 NONAME
- _ZNK16QGraphicsSvgItem10metaObjectEv @ 111 NONAME
- _ZNK16QGraphicsSvgItem12boundingRectEv @ 112 NONAME
- _ZNK16QGraphicsSvgItem16isCachingEnabledEv @ 113 NONAME
- _ZNK16QGraphicsSvgItem16maximumCacheSizeEv @ 114 NONAME
- _ZNK16QGraphicsSvgItem4typeEv @ 115 NONAME
- _ZNK16QGraphicsSvgItem8rendererEv @ 116 NONAME
- _ZNK16QGraphicsSvgItem9elementIdEv @ 117 NONAME
- _ZNK16QSvgTinyDocument12currentFrameEv @ 118 NONAME
- _ZNK16QSvgTinyDocument13elementExistsERK7QString @ 119 NONAME
- _ZNK16QSvgTinyDocument15boundsOnElementERK7QString @ 120 NONAME
- _ZNK16QSvgTinyDocument16matrixForElementERK7QString @ 121 NONAME
- _ZNK16QSvgTinyDocument4typeEv @ 122 NONAME
- _ZNK16QSvgTinyDocument7svgFontERK7QString @ 123 NONAME
- _ZNK16QSvgTinyDocument8animatedEv @ 124 NONAME
- _ZTI10QSvgCircle @ 125 NONAME ABSENT
- _ZTI10QSvgSwitch @ 126 NONAME ABSENT
- _ZTI10QSvgWidget @ 127 NONAME
- _ZTI11QSvgEllipse @ 128 NONAME ABSENT
- _ZTI11QSvgPolygon @ 129 NONAME ABSENT
- _ZTI12QSvgPolyline @ 130 NONAME ABSENT
- _ZTI12QSvgRenderer @ 131 NONAME
- _ZTI13QSvgAnimation @ 132 NONAME ABSENT
- _ZTI13QSvgFillStyle @ 133 NONAME ABSENT
- _ZTI13QSvgFontStyle @ 134 NONAME ABSENT
- _ZTI13QSvgGenerator @ 135 NONAME
- _ZTI15QSvgCompOpStyle @ 136 NONAME ABSENT
- _ZTI15QSvgPaintEngine @ 137 NONAME ABSENT
- _ZTI15QSvgStrokeStyle @ 138 NONAME ABSENT
- _ZTI16QGraphicsSvgItem @ 139 NONAME
- _ZTI16QSvgAnimateColor @ 140 NONAME ABSENT
- _ZTI16QSvgOpacityStyle @ 141 NONAME ABSENT
- _ZTI16QSvgQualityStyle @ 142 NONAME ABSENT
- _ZTI16QSvgTinyDocument @ 143 NONAME
- _ZTI17QSvgGradientStyle @ 144 NONAME ABSENT
- _ZTI17QSvgStructureNode @ 145 NONAME ABSENT
- _ZTI17QSvgStyleProperty @ 146 NONAME ABSENT
- _ZTI18QSvgTransformStyle @ 147 NONAME ABSENT
- _ZTI19QSvgSolidColorStyle @ 148 NONAME ABSENT
- _ZTI20QSvgAnimateTransform @ 149 NONAME ABSENT
- _ZTI21QSvgViewportFillStyle @ 150 NONAME ABSENT
- _ZTI5QSvgG @ 151 NONAME ABSENT
- _ZTI7QSvgArc @ 152 NONAME ABSENT
- _ZTI7QSvgUse @ 153 NONAME ABSENT
- _ZTI8QSvgDefs @ 154 NONAME ABSENT
- _ZTI8QSvgLine @ 155 NONAME ABSENT
- _ZTI8QSvgNode @ 156 NONAME ABSENT
- _ZTI8QSvgPath @ 157 NONAME ABSENT
- _ZTI8QSvgRect @ 158 NONAME ABSENT
- _ZTI8QSvgText @ 159 NONAME ABSENT
- _ZTI9QSvgImage @ 160 NONAME ABSENT
- _ZTI9QSvgVideo @ 161 NONAME ABSENT
- _ZTV10QSvgCircle @ 162 NONAME ABSENT
- _ZTV10QSvgSwitch @ 163 NONAME ABSENT
- _ZTV10QSvgWidget @ 164 NONAME
- _ZTV11QSvgEllipse @ 165 NONAME ABSENT
- _ZTV11QSvgPolygon @ 166 NONAME ABSENT
- _ZTV12QSvgPolyline @ 167 NONAME ABSENT
- _ZTV12QSvgRenderer @ 168 NONAME
- _ZTV13QSvgAnimation @ 169 NONAME ABSENT
- _ZTV13QSvgFillStyle @ 170 NONAME ABSENT
- _ZTV13QSvgFontStyle @ 171 NONAME ABSENT
- _ZTV13QSvgGenerator @ 172 NONAME
- _ZTV15QSvgCompOpStyle @ 173 NONAME ABSENT
- _ZTV15QSvgPaintEngine @ 174 NONAME ABSENT
- _ZTV15QSvgStrokeStyle @ 175 NONAME ABSENT
- _ZTV16QGraphicsSvgItem @ 176 NONAME
- _ZTV16QSvgAnimateColor @ 177 NONAME ABSENT
- _ZTV16QSvgOpacityStyle @ 178 NONAME ABSENT
- _ZTV16QSvgQualityStyle @ 179 NONAME ABSENT
- _ZTV16QSvgTinyDocument @ 180 NONAME
- _ZTV17QSvgGradientStyle @ 181 NONAME ABSENT
- _ZTV17QSvgStructureNode @ 182 NONAME ABSENT
- _ZTV17QSvgStyleProperty @ 183 NONAME ABSENT
- _ZTV18QSvgTransformStyle @ 184 NONAME ABSENT
- _ZTV19QSvgSolidColorStyle @ 185 NONAME ABSENT
- _ZTV20QSvgAnimateTransform @ 186 NONAME ABSENT
- _ZTV21QSvgViewportFillStyle @ 187 NONAME ABSENT
- _ZTV5QSvgG @ 188 NONAME ABSENT
- _ZTV7QSvgArc @ 189 NONAME ABSENT
- _ZTV7QSvgUse @ 190 NONAME ABSENT
- _ZTV8QSvgDefs @ 191 NONAME ABSENT
- _ZTV8QSvgLine @ 192 NONAME ABSENT
- _ZTV8QSvgNode @ 193 NONAME ABSENT
- _ZTV8QSvgPath @ 194 NONAME ABSENT
- _ZTV8QSvgRect @ 195 NONAME ABSENT
- _ZTV8QSvgText @ 196 NONAME ABSENT
- _ZTV9QSvgImage @ 197 NONAME ABSENT
- _ZTV9QSvgVideo @ 198 NONAME ABSENT
- _ZThn8_N10QSvgWidgetD0Ev @ 199 NONAME
- _ZThn8_N10QSvgWidgetD1Ev @ 200 NONAME
- _ZThn8_N16QGraphicsSvgItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 201 NONAME
- _ZThn8_NK16QGraphicsSvgItem12boundingRectEv @ 202 NONAME
- _ZThn8_NK16QGraphicsSvgItem4typeEv @ 203 NONAME
- _ZN10QSvgWidget19getStaticMetaObjectEv @ 204 NONAME
- _ZN12QSvgRenderer19getStaticMetaObjectEv @ 205 NONAME
- _ZN16QGraphicsSvgItem19getStaticMetaObjectEv @ 206 NONAME
- _ZN16QSvgTinyDocument12addNamedNodeERK7QStringP8QSvgNode @ 207 NONAME
- _ZN16QSvgTinyDocument13addNamedStyleERK7QStringP21QSvgFillStyleProperty @ 208 NONAME
- _ZNK16QSvgTinyDocument10namedStyleERK7QString @ 209 NONAME
- _ZNK16QSvgTinyDocument9namedNodeERK7QString @ 210 NONAME
- _ZTI21QSvgFillStyleProperty @ 211 NONAME ABSENT; #<TI>#
- _ZTV21QSvgFillStyleProperty @ 212 NONAME ABSENT; #<VT>#
+ _ZN12QSvgRenderer19getStaticMetaObjectEv @ 23 NONAME
+ _ZN12QSvgRenderer4loadEP16QXmlStreamReader @ 24 NONAME
+ _ZN12QSvgRenderer4loadERK10QByteArray @ 25 NONAME
+ _ZN12QSvgRenderer4loadERK7QString @ 26 NONAME
+ _ZN12QSvgRenderer6renderEP8QPainter @ 27 NONAME
+ _ZN12QSvgRenderer6renderEP8QPainterRK6QRectF @ 28 NONAME
+ _ZN12QSvgRenderer6renderEP8QPainterRK7QStringRK6QRectF @ 29 NONAME
+ _ZN12QSvgRendererC1EP16QXmlStreamReaderP7QObject @ 30 NONAME
+ _ZN12QSvgRendererC1EP7QObject @ 31 NONAME
+ _ZN12QSvgRendererC1ERK10QByteArrayP7QObject @ 32 NONAME
+ _ZN12QSvgRendererC1ERK7QStringP7QObject @ 33 NONAME
+ _ZN12QSvgRendererC2EP16QXmlStreamReaderP7QObject @ 34 NONAME
+ _ZN12QSvgRendererC2EP7QObject @ 35 NONAME
+ _ZN12QSvgRendererC2ERK10QByteArrayP7QObject @ 36 NONAME
+ _ZN12QSvgRendererC2ERK7QStringP7QObject @ 37 NONAME
+ _ZN12QSvgRendererD0Ev @ 38 NONAME
+ _ZN12QSvgRendererD1Ev @ 39 NONAME
+ _ZN12QSvgRendererD2Ev @ 40 NONAME
+ _ZN13QSvgGenerator10setViewBoxERK5QRect @ 41 NONAME
+ _ZN13QSvgGenerator10setViewBoxERK6QRectF @ 42 NONAME
+ _ZN13QSvgGenerator11setFileNameERK7QString @ 43 NONAME
+ _ZN13QSvgGenerator13setResolutionEi @ 44 NONAME
+ _ZN13QSvgGenerator14setDescriptionERK7QString @ 45 NONAME
+ _ZN13QSvgGenerator15setOutputDeviceEP9QIODevice @ 46 NONAME
+ _ZN13QSvgGenerator7setSizeERK5QSize @ 47 NONAME
+ _ZN13QSvgGenerator8setTitleERK7QString @ 48 NONAME
+ _ZN13QSvgGeneratorC1Ev @ 49 NONAME
+ _ZN13QSvgGeneratorC2Ev @ 50 NONAME
+ _ZN13QSvgGeneratorD0Ev @ 51 NONAME
+ _ZN13QSvgGeneratorD1Ev @ 52 NONAME
+ _ZN13QSvgGeneratorD2Ev @ 53 NONAME
+ _ZN16QGraphicsSvgItem11qt_metacallEN11QMetaObject4CallEiPPv @ 54 NONAME
+ _ZN16QGraphicsSvgItem11qt_metacastEPKc @ 55 NONAME
+ _ZN16QGraphicsSvgItem12setElementIdERK7QString @ 56 NONAME
+ _ZN16QGraphicsSvgItem16staticMetaObjectE @ 57 NONAME DATA 16
+ _ZN16QGraphicsSvgItem17setCachingEnabledEb @ 58 NONAME
+ _ZN16QGraphicsSvgItem17setSharedRendererEP12QSvgRenderer @ 59 NONAME
+ _ZN16QGraphicsSvgItem19getStaticMetaObjectEv @ 60 NONAME
+ _ZN16QGraphicsSvgItem19setMaximumCacheSizeERK5QSize @ 61 NONAME
+ _ZN16QGraphicsSvgItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 62 NONAME
+ _ZN16QGraphicsSvgItemC1EP13QGraphicsItem @ 63 NONAME
+ _ZN16QGraphicsSvgItemC1ERK7QStringP13QGraphicsItem @ 64 NONAME
+ _ZN16QGraphicsSvgItemC2EP13QGraphicsItem @ 65 NONAME
+ _ZN16QGraphicsSvgItemC2ERK7QStringP13QGraphicsItem @ 66 NONAME
+ _ZN16QSvgTinyDocument10addSvgFontEP8QSvgFont @ 67 NONAME
+ _ZN16QSvgTinyDocument10setViewBoxERK6QRectF @ 68 NONAME
+ _ZN16QSvgTinyDocument11setAnimatedEb @ 69 NONAME
+ _ZN16QSvgTinyDocument12addNamedNodeERK7QStringP8QSvgNode @ 70 NONAME
+ _ZN16QSvgTinyDocument13addNamedStyleERK7QStringP21QSvgFillStyleProperty @ 71 NONAME
+ _ZN16QSvgTinyDocument15setCurrentFrameEi @ 72 NONAME
+ _ZN16QSvgTinyDocument16restartAnimationEv @ 73 NONAME
+ _ZN16QSvgTinyDocument17mapSourceToTargetEP8QPainterRK6QRectFS4_ @ 74 NONAME
+ _ZN16QSvgTinyDocument18setFramesPerSecondEi @ 75 NONAME
+ _ZN16QSvgTinyDocument4drawEP8QPainter @ 76 NONAME
+ _ZN16QSvgTinyDocument4drawEP8QPainterR15QSvgExtraStates @ 77 NONAME
+ _ZN16QSvgTinyDocument4drawEP8QPainterRK6QRectF @ 78 NONAME
+ _ZN16QSvgTinyDocument4drawEP8QPainterRK7QStringRK6QRectF @ 79 NONAME
+ _ZN16QSvgTinyDocument4loadEP16QXmlStreamReader @ 80 NONAME
+ _ZN16QSvgTinyDocument4loadERK10QByteArray @ 81 NONAME
+ _ZN16QSvgTinyDocument4loadERK7QString @ 82 NONAME
+ _ZN16QSvgTinyDocument8setWidthEib @ 83 NONAME
+ _ZN16QSvgTinyDocument9setHeightEib @ 84 NONAME
+ _ZN16QSvgTinyDocumentC1Ev @ 85 NONAME
+ _ZN16QSvgTinyDocumentC2Ev @ 86 NONAME
+ _ZN16QSvgTinyDocumentD0Ev @ 87 NONAME
+ _ZN16QSvgTinyDocumentD1Ev @ 88 NONAME
+ _ZN16QSvgTinyDocumentD2Ev @ 89 NONAME
+ _ZNK10QSvgWidget10metaObjectEv @ 90 NONAME
+ _ZNK10QSvgWidget8rendererEv @ 91 NONAME
+ _ZNK10QSvgWidget8sizeHintEv @ 92 NONAME
+ _ZNK12QSvgRenderer10metaObjectEv @ 93 NONAME
+ _ZNK12QSvgRenderer11defaultSizeEv @ 94 NONAME
+ _ZNK12QSvgRenderer12currentFrameEv @ 95 NONAME
+ _ZNK12QSvgRenderer13elementExistsERK7QString @ 96 NONAME
+ _ZNK12QSvgRenderer15boundsOnElementERK7QString @ 97 NONAME
+ _ZNK12QSvgRenderer15framesPerSecondEv @ 98 NONAME
+ _ZNK12QSvgRenderer16matrixForElementERK7QString @ 99 NONAME
+ _ZNK12QSvgRenderer17animationDurationEv @ 100 NONAME
+ _ZNK12QSvgRenderer7isValidEv @ 101 NONAME
+ _ZNK12QSvgRenderer7viewBoxEv @ 102 NONAME
+ _ZNK12QSvgRenderer8animatedEv @ 103 NONAME
+ _ZNK12QSvgRenderer8viewBoxFEv @ 104 NONAME
+ _ZNK13QSvgGenerator10resolutionEv @ 105 NONAME
+ _ZNK13QSvgGenerator11descriptionEv @ 106 NONAME
+ _ZNK13QSvgGenerator11paintEngineEv @ 107 NONAME
+ _ZNK13QSvgGenerator12outputDeviceEv @ 108 NONAME
+ _ZNK13QSvgGenerator4sizeEv @ 109 NONAME
+ _ZNK13QSvgGenerator5titleEv @ 110 NONAME
+ _ZNK13QSvgGenerator6metricEN12QPaintDevice17PaintDeviceMetricE @ 111 NONAME
+ _ZNK13QSvgGenerator7viewBoxEv @ 112 NONAME
+ _ZNK13QSvgGenerator8fileNameEv @ 113 NONAME
+ _ZNK13QSvgGenerator8viewBoxFEv @ 114 NONAME
+ _ZNK16QGraphicsSvgItem10metaObjectEv @ 115 NONAME
+ _ZNK16QGraphicsSvgItem12boundingRectEv @ 116 NONAME
+ _ZNK16QGraphicsSvgItem16isCachingEnabledEv @ 117 NONAME
+ _ZNK16QGraphicsSvgItem16maximumCacheSizeEv @ 118 NONAME
+ _ZNK16QGraphicsSvgItem4typeEv @ 119 NONAME
+ _ZNK16QGraphicsSvgItem8rendererEv @ 120 NONAME
+ _ZNK16QGraphicsSvgItem9elementIdEv @ 121 NONAME
+ _ZNK16QSvgTinyDocument10namedStyleERK7QString @ 122 NONAME
+ _ZNK16QSvgTinyDocument12currentFrameEv @ 123 NONAME
+ _ZNK16QSvgTinyDocument13elementExistsERK7QString @ 124 NONAME
+ _ZNK16QSvgTinyDocument15boundsOnElementERK7QString @ 125 NONAME
+ _ZNK16QSvgTinyDocument16matrixForElementERK7QString @ 126 NONAME
+ _ZNK16QSvgTinyDocument4typeEv @ 127 NONAME
+ _ZNK16QSvgTinyDocument7svgFontERK7QString @ 128 NONAME
+ _ZNK16QSvgTinyDocument8animatedEv @ 129 NONAME
+ _ZNK16QSvgTinyDocument9namedNodeERK7QString @ 130 NONAME
+ _ZTI10QSvgWidget @ 131 NONAME
+ _ZTI12QSvgRenderer @ 132 NONAME
+ _ZTI13QSvgGenerator @ 133 NONAME
+ _ZTI16QGraphicsSvgItem @ 134 NONAME
+ _ZTI16QSvgTinyDocument @ 135 NONAME
+ _ZTV10QSvgWidget @ 136 NONAME
+ _ZTV12QSvgRenderer @ 137 NONAME
+ _ZTV13QSvgGenerator @ 138 NONAME
+ _ZTV16QGraphicsSvgItem @ 139 NONAME
+ _ZTV16QSvgTinyDocument @ 140 NONAME
+ _ZThn8_N10QSvgWidgetD0Ev @ 141 NONAME
+ _ZThn8_N10QSvgWidgetD1Ev @ 142 NONAME
+ _ZThn8_N16QGraphicsSvgItem5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 143 NONAME
+ _ZThn8_NK16QGraphicsSvgItem12boundingRectEv @ 144 NONAME
+ _ZThn8_NK16QGraphicsSvgItem4typeEv @ 145 NONAME
diff --git a/src/s60installs/eabi/QtTestu.def b/src/s60installs/eabi/QtTestu.def
index 56f84ec..b66ffc1 100644
--- a/src/s60installs/eabi/QtTestu.def
+++ b/src/s60installs/eabi/QtTestu.def
@@ -2,103 +2,71 @@ EXPORTS
_ZN14QTestEventLoop11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME
_ZN14QTestEventLoop11qt_metacastEPKc @ 2 NONAME
_ZN14QTestEventLoop16staticMetaObjectE @ 3 NONAME DATA 16
- _ZN5QTest10asciiToKeyEc @ 4 NONAME
- _ZN5QTest10keyToAsciiEN2Qt3KeyE @ 5 NONAME
- _ZN5QTest10testObjectEv @ 6 NONAME
- _ZN5QTest11qExpectFailEPKcS1_NS_12TestFailModeES1_i @ 7 NONAME
- _ZN5QTest11qGlobalDataEPKci @ 8 NONAME
- _ZN5QTest11qt_snprintfEPciPKcz @ 9 NONAME
- _ZN5QTest12qElementDataEPKci @ 10 NONAME
- _ZN5QTest13ignoreMessageE9QtMsgTypePKc @ 11 NONAME
- _ZN5QTest14compare_helperEbPKcPcS2_S1_S1_S1_i @ 12 NONAME
- _ZN5QTest14compare_helperEbPKcS1_i @ 13 NONAME
- _ZN5QTest14currentDataTagEv @ 14 NONAME
- _ZN5QTest15defaultKeyDelayEv @ 15 NONAME
- _ZN5QTest17addColumnInternalEiPKc @ 16 NONAME
- _ZN5QTest17currentTestFailedEv @ 17 NONAME
- _ZN5QTest17defaultKeyVerboseEv @ 18 NONAME
- _ZN5QTest17defaultMouseDelayEv @ 19 NONAME
- _ZN5QTest19currentTestFunctionEv @ 20 NONAME
- _ZN5QTest19toHexRepresentationEPKci @ 21 NONAME
- _ZN5QTest21compare_string_helperEPKcS1_S1_S1_S1_i @ 22 NONAME
- _ZN5QTest23endBenchmarkMeasurementEv @ 23 NONAME
- _ZN5QTest25beginBenchmarkMeasurementEv @ 24 NONAME
- _ZN5QTest29QBenchmarkIterationController4nextEv @ 25 NONAME
- _ZN5QTest29QBenchmarkIterationController6isDoneEv @ 26 NONAME
- _ZN5QTest29QBenchmarkIterationControllerC1Ev @ 27 NONAME
- _ZN5QTest29QBenchmarkIterationControllerC2Ev @ 28 NONAME
- _ZN5QTest29QBenchmarkIterationControllerD1Ev @ 29 NONAME
- _ZN5QTest29QBenchmarkIterationControllerD2Ev @ 30 NONAME
- _ZN5QTest5qDataEPKci @ 31 NONAME
- _ZN5QTest5qExecEP7QObjectRK11QStringList @ 32 NONAME
- _ZN5QTest5qExecEP7QObjectiPPc @ 33 NONAME
- _ZN5QTest5qFailEPKcS1_i @ 34 NONAME
- _ZN5QTest5qSkipEPKcNS_8SkipModeES1_i @ 35 NONAME
- _ZN5QTest5qWarnEPKc @ 36 NONAME
- _ZN5QTest6newRowEPKc @ 37 NONAME
- _ZN5QTest6qSleepEi @ 38 NONAME
- _ZN5QTest7qVerifyEbPKcS1_S1_i @ 39 NONAME
- _ZN5QTest8qCompareIdEEbRKT_S3_PKcS5_S5_i @ 40 NONAME
- _ZN5QTest8qCompareIfEEbRKT_S3_PKcS5_S5_i @ 41 NONAME
- _ZN5QTest8toStringEPKc @ 42 NONAME
- _ZN5QTest8toStringEPKv @ 43 NONAME
- _ZN5QTest8toStringIbEEPcRKT_ @ 44 NONAME
- _ZN5QTest8toStringIcEEPcRKT_ @ 45 NONAME
- _ZN5QTest8toStringIdEEPcRKT_ @ 46 NONAME
- _ZN5QTest8toStringIfEEPcRKT_ @ 47 NONAME
- _ZN5QTest8toStringIiEEPcRKT_ @ 48 NONAME
- _ZN5QTest8toStringIjEEPcRKT_ @ 49 NONAME
- _ZN5QTest8toStringIlEEPcRKT_ @ 50 NONAME
- _ZN5QTest8toStringImEEPcRKT_ @ 51 NONAME
- _ZN5QTest8toStringIsEEPcRKT_ @ 52 NONAME
- _ZN5QTest8toStringItEEPcRKT_ @ 53 NONAME
- _ZN5QTest8toStringIxEEPcRKT_ @ 54 NONAME
- _ZN5QTest8toStringIyEEPcRKT_ @ 55 NONAME
- _ZN9QTestData6appendEiPKv @ 56 NONAME
- _ZN9QTestDataC1EPKcP10QTestTable @ 57 NONAME
- _ZN9QTestDataC2EPKcP10QTestTable @ 58 NONAME
- _ZN9QTestDataD1Ev @ 59 NONAME
- _ZN9QTestDataD2Ev @ 60 NONAME
- _ZNK14QTestEventLoop10metaObjectEv @ 61 NONAME
- _ZNK9QTestData4dataEi @ 62 NONAME
- _ZNK9QTestData6parentEv @ 63 NONAME
- _ZNK9QTestData7dataTagEv @ 64 NONAME
- _ZNK9QTestData9dataCountEv @ 65 NONAME
- _ZTI14QTestEventLoop @ 66 NONAME
- _ZTI14QXmlTestLogger @ 67 NONAME ABSENT
- _ZTI15QBenchmarkEvent @ 68 NONAME ABSENT
- _ZTI16QPlainTestLogger @ 69 NONAME ABSENT
- _ZTI19QAbstractTestLogger @ 70 NONAME ABSENT
- _ZTI22QBenchmarkTickMeasurer @ 71 NONAME ABSENT
- _ZTI22QBenchmarkTimeMeasurer @ 72 NONAME ABSENT
- _ZTV14QTestEventLoop @ 73 NONAME
- _ZTV14QXmlTestLogger @ 74 NONAME ABSENT
- _ZTV15QBenchmarkEvent @ 75 NONAME ABSENT
- _ZTV16QPlainTestLogger @ 76 NONAME ABSENT
- _ZTV19QAbstractTestLogger @ 77 NONAME ABSENT
- _ZTV22QBenchmarkTickMeasurer @ 78 NONAME ABSENT
- _ZTV22QBenchmarkTimeMeasurer @ 79 NONAME ABSENT
- _ZN5QTest29QBenchmarkIterationControllerC1ENS0_7RunModeE @ 80 NONAME
- _ZN5QTest29QBenchmarkIterationControllerC2ENS0_7RunModeE @ 81 NONAME
- _ZN14QTestEventLoop19getStaticMetaObjectEv @ 82 NONAME
- _ZTI11QTestLogger @ 83 NONAME ABSENT ; #<TI>#
- _ZTI12QTestElement @ 84 NONAME ABSENT; #<TI>#
- _ZTI13QTestCoreListI12QTestElementE @ 85 NONAME ABSENT; #<TI>#
- _ZTI13QTestCoreListI21QTestElementAttributeE @ 86 NONAME ABSENT; #<TI>#
- _ZTI16QTestCoreElementI12QTestElementE @ 87 NONAME ABSENT; #<TI>#
- _ZTI16QTestXmlStreamer @ 88 NONAME ABSENT; #<TI>#
- _ZTI18QTestBasicStreamer @ 89 NONAME ABSENT; #<TI>#
- _ZTI18QTestXunitStreamer @ 90 NONAME ABSENT; #<TI>#
- _ZTI21QTestElementAttribute @ 91 NONAME ABSENT; #<TI>#
- _ZTI21QTestLightXmlStreamer @ 92 NONAME ABSENT; #<TI>#
- _ZTV11QTestLogger @ 93 NONAME ABSENT; #<VT>#
- _ZTV12QTestElement @ 94 NONAME ABSENT; #<VT>#
- _ZTV13QTestCoreListI12QTestElementE @ 95 NONAME ABSENT; #<VT>#
- _ZTV13QTestCoreListI21QTestElementAttributeE @ 96 NONAME ABSENT; #<VT>#
- _ZTV16QTestCoreElementI12QTestElementE @ 97 NONAME ABSENT; #<VT>#
- _ZTV16QTestXmlStreamer @ 98 NONAME ABSENT; #<VT>#
- _ZTV18QTestBasicStreamer @ 99 NONAME ABSENT; #<VT>#
- _ZTV18QTestXunitStreamer @ 100 NONAME ABSENT; #<VT>#
- _ZTV21QTestElementAttribute @ 101 NONAME ABSENT; #<VT>#
- _ZTV21QTestLightXmlStreamer @ 102 NONAME ABSENT; #<VT>#
+ _ZN14QTestEventLoop19getStaticMetaObjectEv @ 4 NONAME
+ _ZN5QTest10asciiToKeyEc @ 5 NONAME
+ _ZN5QTest10keyToAsciiEN2Qt3KeyE @ 6 NONAME
+ _ZN5QTest10testObjectEv @ 7 NONAME
+ _ZN5QTest11qExpectFailEPKcS1_NS_12TestFailModeES1_i @ 8 NONAME
+ _ZN5QTest11qGlobalDataEPKci @ 9 NONAME
+ _ZN5QTest11qt_snprintfEPciPKcz @ 10 NONAME
+ _ZN5QTest12qElementDataEPKci @ 11 NONAME
+ _ZN5QTest13ignoreMessageE9QtMsgTypePKc @ 12 NONAME
+ _ZN5QTest14compare_helperEbPKcPcS2_S1_S1_S1_i @ 13 NONAME
+ _ZN5QTest14compare_helperEbPKcS1_i @ 14 NONAME
+ _ZN5QTest14currentDataTagEv @ 15 NONAME
+ _ZN5QTest15defaultKeyDelayEv @ 16 NONAME
+ _ZN5QTest17addColumnInternalEiPKc @ 17 NONAME
+ _ZN5QTest17currentTestFailedEv @ 18 NONAME
+ _ZN5QTest17defaultKeyVerboseEv @ 19 NONAME
+ _ZN5QTest17defaultMouseDelayEv @ 20 NONAME
+ _ZN5QTest19currentTestFunctionEv @ 21 NONAME
+ _ZN5QTest19toHexRepresentationEPKci @ 22 NONAME
+ _ZN5QTest21compare_string_helperEPKcS1_S1_S1_S1_i @ 23 NONAME
+ _ZN5QTest23endBenchmarkMeasurementEv @ 24 NONAME
+ _ZN5QTest25beginBenchmarkMeasurementEv @ 25 NONAME
+ _ZN5QTest29QBenchmarkIterationController4nextEv @ 26 NONAME
+ _ZN5QTest29QBenchmarkIterationController6isDoneEv @ 27 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerC1ENS0_7RunModeE @ 28 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerC1Ev @ 29 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerC2ENS0_7RunModeE @ 30 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerC2Ev @ 31 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerD1Ev @ 32 NONAME
+ _ZN5QTest29QBenchmarkIterationControllerD2Ev @ 33 NONAME
+ _ZN5QTest5qDataEPKci @ 34 NONAME
+ _ZN5QTest5qExecEP7QObjectRK11QStringList @ 35 NONAME
+ _ZN5QTest5qExecEP7QObjectiPPc @ 36 NONAME
+ _ZN5QTest5qFailEPKcS1_i @ 37 NONAME
+ _ZN5QTest5qSkipEPKcNS_8SkipModeES1_i @ 38 NONAME
+ _ZN5QTest5qWarnEPKc @ 39 NONAME
+ _ZN5QTest6newRowEPKc @ 40 NONAME
+ _ZN5QTest6qSleepEi @ 41 NONAME
+ _ZN5QTest7qVerifyEbPKcS1_S1_i @ 42 NONAME
+ _ZN5QTest8qCompareIdEEbRKT_S3_PKcS5_S5_i @ 43 NONAME
+ _ZN5QTest8qCompareIfEEbRKT_S3_PKcS5_S5_i @ 44 NONAME
+ _ZN5QTest8toStringEPKc @ 45 NONAME
+ _ZN5QTest8toStringEPKv @ 46 NONAME
+ _ZN5QTest8toStringIbEEPcRKT_ @ 47 NONAME
+ _ZN5QTest8toStringIcEEPcRKT_ @ 48 NONAME
+ _ZN5QTest8toStringIdEEPcRKT_ @ 49 NONAME
+ _ZN5QTest8toStringIfEEPcRKT_ @ 50 NONAME
+ _ZN5QTest8toStringIiEEPcRKT_ @ 51 NONAME
+ _ZN5QTest8toStringIjEEPcRKT_ @ 52 NONAME
+ _ZN5QTest8toStringIlEEPcRKT_ @ 53 NONAME
+ _ZN5QTest8toStringImEEPcRKT_ @ 54 NONAME
+ _ZN5QTest8toStringIsEEPcRKT_ @ 55 NONAME
+ _ZN5QTest8toStringItEEPcRKT_ @ 56 NONAME
+ _ZN5QTest8toStringIxEEPcRKT_ @ 57 NONAME
+ _ZN5QTest8toStringIyEEPcRKT_ @ 58 NONAME
+ _ZN9QTestData6appendEiPKv @ 59 NONAME
+ _ZN9QTestDataC1EPKcP10QTestTable @ 60 NONAME
+ _ZN9QTestDataC2EPKcP10QTestTable @ 61 NONAME
+ _ZN9QTestDataD1Ev @ 62 NONAME
+ _ZN9QTestDataD2Ev @ 63 NONAME
+ _ZNK14QTestEventLoop10metaObjectEv @ 64 NONAME
+ _ZNK9QTestData4dataEi @ 65 NONAME
+ _ZNK9QTestData6parentEv @ 66 NONAME
+ _ZNK9QTestData7dataTagEv @ 67 NONAME
+ _ZNK9QTestData9dataCountEv @ 68 NONAME
+ _ZTI14QTestEventLoop @ 69 NONAME
+ _ZTV14QTestEventLoop @ 70 NONAME
diff --git a/src/s60installs/eabi/QtWebKitu.def b/src/s60installs/eabi/QtWebKitu.def
new file mode 100644
index 0000000..31a82bc
--- /dev/null
+++ b/src/s60installs/eabi/QtWebKitu.def
@@ -0,0 +1,652 @@
+EXPORTS
+ _Z10qt_drt_runb @ 1 NONAME
+ _Z14qWebKitVersionv @ 2 NONAME
+ _Z19qWebKitMajorVersionv @ 3 NONAME
+ _Z19qWebKitMinorVersionv @ 4 NONAME
+ _Z20qt_dump_frame_loaderb @ 5 NONAME
+ _Z20qt_webpage_groupNameP8QWebPage @ 6 NONAME
+ _Z21qt_drt_clearFrameNameP9QWebFrame @ 7 NONAME
+ _Z21qt_drt_pauseAnimationP9QWebFrameRK7QStringdS3_ @ 8 NONAME
+ _Z23qt_webpage_setGroupNameP8QWebPageRK7QString @ 9 NONAME
+ _Z25qt_dump_editing_callbacksb @ 10 NONAME
+ _Z27qt_dump_set_accepts_editingb @ 11 NONAME
+ _Z29qt_drt_javaScriptObjectsCountv @ 12 NONAME
+ _Z31qt_drt_garbageCollector_collectv @ 13 NONAME
+ _Z31qt_drt_numberOfActiveAnimationsP9QWebFrame @ 14 NONAME
+ _Z31qt_dump_resource_load_callbacksb @ 15 NONAME
+ _Z32qt_drt_pauseTransitionOfPropertyP9QWebFrameRK7QStringdS3_ @ 16 NONAME
+ _Z33qt_drt_overwritePluginDirectoriesv @ 17 NONAME
+ _Z36qt_drt_setJavaScriptProfilingEnabledP9QWebFrameb @ 18 NONAME
+ _Z48qt_drt_garbageCollector_collectOnAlternateThreadb @ 19 NONAME
+ _ZN11QWebElement11encloseWithERK7QString @ 20 NONAME
+ _ZN11QWebElement11encloseWithERKS_ @ 21 NONAME
+ _ZN11QWebElement11removeClassERK7QString @ 22 NONAME
+ _ZN11QWebElement11setInnerXmlERK7QString @ 23 NONAME
+ _ZN11QWebElement11setOuterXmlERK7QString @ 24 NONAME
+ _ZN11QWebElement11toggleClassERK7QString @ 25 NONAME
+ _ZN11QWebElement12appendInsideERK7QString @ 26 NONAME
+ _ZN11QWebElement12appendInsideERKS_ @ 27 NONAME
+ _ZN11QWebElement12setAttributeERK7QStringS2_ @ 28 NONAME
+ _ZN11QWebElement12setPlainTextERK7QString @ 29 NONAME
+ _ZN11QWebElement13appendOutsideERK7QString @ 30 NONAME
+ _ZN11QWebElement13appendOutsideERKS_ @ 31 NONAME
+ _ZN11QWebElement13prependInsideERK7QString @ 32 NONAME
+ _ZN11QWebElement13prependInsideERKS_ @ 33 NONAME
+ _ZN11QWebElement14prependOutsideERK7QString @ 34 NONAME
+ _ZN11QWebElement14prependOutsideERKS_ @ 35 NONAME
+ _ZN11QWebElement14removeChildrenEv @ 36 NONAME
+ _ZN11QWebElement14setAttributeNSERK7QStringS2_S2_ @ 37 NONAME
+ _ZN11QWebElement15removeAttributeERK7QString @ 38 NONAME
+ _ZN11QWebElement16enclosingElementEPN7WebCore4NodeE @ 39 NONAME
+ _ZN11QWebElement16setStylePropertyERK7QStringS2_ @ 40 NONAME
+ _ZN11QWebElement16takeFromDocumentEv @ 41 NONAME
+ _ZN11QWebElement17removeAttributeNSERK7QStringS2_ @ 42 NONAME
+ _ZN11QWebElement18evaluateJavaScriptERK7QString @ 43 NONAME
+ _ZN11QWebElement18removeFromDocumentEv @ 44 NONAME
+ _ZN11QWebElement19encloseContentsWithERK7QString @ 45 NONAME
+ _ZN11QWebElement19encloseContentsWithERKS_ @ 46 NONAME
+ _ZN11QWebElement7replaceERK7QString @ 47 NONAME
+ _ZN11QWebElement7replaceERKS_ @ 48 NONAME
+ _ZN11QWebElement8addClassERK7QString @ 49 NONAME
+ _ZN11QWebElement8setFocusEv @ 50 NONAME
+ _ZN11QWebElementC1EPN7WebCore4NodeE @ 51 NONAME
+ _ZN11QWebElementC1EPN7WebCore7ElementE @ 52 NONAME
+ _ZN11QWebElementC1ERKS_ @ 53 NONAME
+ _ZN11QWebElementC1Ev @ 54 NONAME
+ _ZN11QWebElementC2EPN7WebCore4NodeE @ 55 NONAME
+ _ZN11QWebElementC2EPN7WebCore7ElementE @ 56 NONAME
+ _ZN11QWebElementC2ERKS_ @ 57 NONAME
+ _ZN11QWebElementC2Ev @ 58 NONAME
+ _ZN11QWebElementD1Ev @ 59 NONAME
+ _ZN11QWebElementD2Ev @ 60 NONAME
+ _ZN11QWebElementaSERKS_ @ 61 NONAME
+ _ZN11QWebHistory12restoreStateERK10QByteArray @ 62 NONAME
+ _ZN11QWebHistory19setMaximumItemCountEi @ 63 NONAME
+ _ZN11QWebHistory4backEv @ 64 NONAME
+ _ZN11QWebHistory5clearEv @ 65 NONAME
+ _ZN11QWebHistory7forwardEv @ 66 NONAME
+ _ZN11QWebHistory8goToItemERK15QWebHistoryItem @ 67 NONAME
+ _ZN11QWebHistoryC1Ev @ 68 NONAME
+ _ZN11QWebHistoryC2Ev @ 69 NONAME
+ _ZN11QWebHistoryD1Ev @ 70 NONAME
+ _ZN11QWebHistoryD2Ev @ 71 NONAME
+ _ZN12QWebDatabase14removeDatabaseERKS_ @ 72 NONAME
+ _ZN12QWebDatabase18removeAllDatabasesEv @ 73 NONAME
+ _ZN12QWebDatabaseC1EP19QWebDatabasePrivate @ 74 NONAME
+ _ZN12QWebDatabaseC1ERKS_ @ 75 NONAME
+ _ZN12QWebDatabaseC2EP19QWebDatabasePrivate @ 76 NONAME
+ _ZN12QWebDatabaseC2ERKS_ @ 77 NONAME
+ _ZN12QWebDatabaseD1Ev @ 78 NONAME
+ _ZN12QWebDatabaseD2Ev @ 79 NONAME
+ _ZN12QWebDatabaseaSERKS_ @ 80 NONAME
+ _ZN12QWebSettings10iconForUrlERK4QUrl @ 81 NONAME
+ _ZN12QWebSettings10webGraphicENS_10WebGraphicE @ 82 NONAME
+ _ZN12QWebSettings11setFontSizeENS_8FontSizeEi @ 83 NONAME
+ _ZN12QWebSettings12setAttributeENS_12WebAttributeEb @ 84 NONAME
+ _ZN12QWebSettings13resetFontSizeENS_8FontSizeE @ 85 NONAME
+ _ZN12QWebSettings13setFontFamilyENS_10FontFamilyERK7QString @ 86 NONAME
+ _ZN12QWebSettings13setWebGraphicENS_10WebGraphicERK7QPixmap @ 87 NONAME
+ _ZN12QWebSettings14globalSettingsEv @ 88 NONAME
+ _ZN12QWebSettings14pluginDatabaseEv @ 89 NONAME
+ _ZN12QWebSettings14resetAttributeENS_12WebAttributeE @ 90 NONAME
+ _ZN12QWebSettings15resetFontFamilyENS_10FontFamilyE @ 91 NONAME
+ _ZN12QWebSettings16iconDatabasePathEv @ 92 NONAME
+ _ZN12QWebSettings17clearIconDatabaseEv @ 93 NONAME
+ _ZN12QWebSettings17clearMemoryCachesEv @ 94 NONAME
+ _ZN12QWebSettings18offlineStoragePathEv @ 95 NONAME
+ _ZN12QWebSettings19maximumPagesInCacheEv @ 96 NONAME
+ _ZN12QWebSettings19setIconDatabasePathERK7QString @ 97 NONAME
+ _ZN12QWebSettings19setLocalStoragePathERK7QString @ 98 NONAME
+ _ZN12QWebSettings20setUserStyleSheetUrlERK4QUrl @ 99 NONAME
+ _ZN12QWebSettings21setOfflineStoragePathERK7QString @ 100 NONAME
+ _ZN12QWebSettings22setDefaultTextEncodingERK7QString @ 101 NONAME
+ _ZN12QWebSettings22setMaximumPagesInCacheEi @ 102 NONAME
+ _ZN12QWebSettings23enablePersistentStorageERK7QString @ 103 NONAME
+ _ZN12QWebSettings24setObjectCacheCapacitiesEiii @ 104 NONAME
+ _ZN12QWebSettings26offlineStorageDefaultQuotaEv @ 105 NONAME
+ _ZN12QWebSettings29setOfflineStorageDefaultQuotaEx @ 106 NONAME
+ _ZN12QWebSettings30offlineWebApplicationCachePathEv @ 107 NONAME
+ _ZN12QWebSettings31offlineWebApplicationCacheQuotaEv @ 108 NONAME
+ _ZN12QWebSettings33setOfflineWebApplicationCachePathERK7QString @ 109 NONAME
+ _ZN12QWebSettings34setOfflineWebApplicationCacheQuotaEx @ 110 NONAME
+ _ZN12QWebSettingsC1EPN7WebCore8SettingsE @ 111 NONAME
+ _ZN12QWebSettingsC1Ev @ 112 NONAME
+ _ZN12QWebSettingsC2EPN7WebCore8SettingsE @ 113 NONAME
+ _ZN12QWebSettingsC2Ev @ 114 NONAME
+ _ZN12QWebSettingsD1Ev @ 115 NONAME
+ _ZN12QWebSettingsD2Ev @ 116 NONAME
+ _ZN13QWebInspector11qt_metacallEN11QMetaObject4CallEiPPv @ 117 NONAME
+ _ZN13QWebInspector11qt_metacastEPKc @ 118 NONAME
+ _ZN13QWebInspector11resizeEventEP12QResizeEvent @ 119 NONAME
+ _ZN13QWebInspector16staticMetaObjectE @ 120 NONAME DATA 16
+ _ZN13QWebInspector18windowTitleChangedERK7QString @ 121 NONAME
+ _ZN13QWebInspector19getStaticMetaObjectEv @ 122 NONAME
+ _ZN13QWebInspector5eventEP6QEvent @ 123 NONAME
+ _ZN13QWebInspector7setPageEP8QWebPage @ 124 NONAME
+ _ZN13QWebInspector9hideEventEP10QHideEvent @ 125 NONAME
+ _ZN13QWebInspector9showEventEP10QShowEvent @ 126 NONAME
+ _ZN13QWebInspectorC1EP7QWidget @ 127 NONAME
+ _ZN13QWebInspectorC2EP7QWidget @ 128 NONAME
+ _ZN13QWebInspectorD0Ev @ 129 NONAME
+ _ZN13QWebInspectorD1Ev @ 130 NONAME
+ _ZN13QWebInspectorD2Ev @ 131 NONAME
+ _ZN14QWebPluginInfo10setEnabledEb @ 132 NONAME
+ _ZN14QWebPluginInfoC1EPN7WebCore13PluginPackageE @ 133 NONAME
+ _ZN14QWebPluginInfoC1ERKS_ @ 134 NONAME
+ _ZN14QWebPluginInfoC1Ev @ 135 NONAME
+ _ZN14QWebPluginInfoC2EPN7WebCore13PluginPackageE @ 136 NONAME
+ _ZN14QWebPluginInfoC2ERKS_ @ 137 NONAME
+ _ZN14QWebPluginInfoC2Ev @ 138 NONAME
+ _ZN14QWebPluginInfoD1Ev @ 139 NONAME
+ _ZN14QWebPluginInfoD2Ev @ 140 NONAME
+ _ZN14QWebPluginInfoaSERKS_ @ 141 NONAME
+ _ZN15QWebHistoryItem11setUserDataERK8QVariant @ 142 NONAME
+ _ZN15QWebHistoryItemC1EP22QWebHistoryItemPrivate @ 143 NONAME
+ _ZN15QWebHistoryItemC1ERKS_ @ 144 NONAME
+ _ZN15QWebHistoryItemC2EP22QWebHistoryItemPrivate @ 145 NONAME
+ _ZN15QWebHistoryItemC2ERKS_ @ 146 NONAME
+ _ZN15QWebHistoryItemD1Ev @ 147 NONAME
+ _ZN15QWebHistoryItemD2Ev @ 148 NONAME
+ _ZN15QWebHistoryItemaSERKS_ @ 149 NONAME
+ _ZN16QGraphicsWebView10loadFailedEv @ 150 NONAME
+ _ZN16QGraphicsWebView10sceneEventEP6QEvent @ 151 NONAME
+ _ZN16QGraphicsWebView10setContentERK10QByteArrayRK7QStringRK4QUrl @ 152 NONAME
+ _ZN16QGraphicsWebView10urlChangedERK4QUrl @ 153 NONAME
+ _ZN16QGraphicsWebView10wheelEventEP24QGraphicsSceneWheelEvent @ 154 NONAME
+ _ZN16QGraphicsWebView11iconChangedEv @ 155 NONAME
+ _ZN16QGraphicsWebView11loadStartedEv @ 156 NONAME
+ _ZN16QGraphicsWebView11qt_metacallEN11QMetaObject4CallEiPPv @ 157 NONAME
+ _ZN16QGraphicsWebView11qt_metacastEPKc @ 158 NONAME
+ _ZN16QGraphicsWebView11setGeometryERK6QRectF @ 159 NONAME
+ _ZN16QGraphicsWebView12focusInEventEP11QFocusEvent @ 160 NONAME
+ _ZN16QGraphicsWebView12loadFinishedEv @ 161 NONAME
+ _ZN16QGraphicsWebView12titleChangedERK7QString @ 162 NONAME
+ _ZN16QGraphicsWebView13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 163 NONAME
+ _ZN16QGraphicsWebView13focusOutEventEP11QFocusEvent @ 164 NONAME
+ _ZN16QGraphicsWebView13keyPressEventEP9QKeyEvent @ 165 NONAME
+ _ZN16QGraphicsWebView13setZoomFactorEf @ 166 NONAME
+ _ZN16QGraphicsWebView13statusChangedEv @ 167 NONAME
+ _ZN16QGraphicsWebView14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 168 NONAME
+ _ZN16QGraphicsWebView14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 169 NONAME
+ _ZN16QGraphicsWebView14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 170 NONAME
+ _ZN16QGraphicsWebView14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 171 NONAME
+ _ZN16QGraphicsWebView14setInteractiveEb @ 172 NONAME
+ _ZN16QGraphicsWebView14updateGeometryEv @ 173 NONAME
+ _ZN16QGraphicsWebView15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 174 NONAME
+ _ZN16QGraphicsWebView15keyReleaseEventEP9QKeyEvent @ 175 NONAME
+ _ZN16QGraphicsWebView15mousePressEventEP24QGraphicsSceneMouseEvent @ 176 NONAME
+ _ZN16QGraphicsWebView15progressChangedEf @ 177 NONAME
+ _ZN16QGraphicsWebView16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 178 NONAME
+ _ZN16QGraphicsWebView16inputMethodEventEP17QInputMethodEvent @ 179 NONAME
+ _ZN16QGraphicsWebView16staticMetaObjectE @ 180 NONAME DATA 16
+ _ZN16QGraphicsWebView17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 181 NONAME
+ _ZN16QGraphicsWebView17zoomFactorChangedEv @ 182 NONAME
+ _ZN16QGraphicsWebView18focusNextPrevChildEb @ 183 NONAME
+ _ZN16QGraphicsWebView19getStaticMetaObjectEv @ 184 NONAME
+ _ZN16QGraphicsWebView20interactivityChangedEv @ 185 NONAME
+ _ZN16QGraphicsWebView21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 186 NONAME
+ _ZN16QGraphicsWebView4backEv @ 187 NONAME
+ _ZN16QGraphicsWebView4loadERK15QNetworkRequestN21QNetworkAccessManager9OperationERK10QByteArray @ 188 NONAME
+ _ZN16QGraphicsWebView4loadERK4QUrl @ 189 NONAME
+ _ZN16QGraphicsWebView4stopEv @ 190 NONAME
+ _ZN16QGraphicsWebView5eventEP6QEvent @ 191 NONAME
+ _ZN16QGraphicsWebView5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 192 NONAME
+ _ZN16QGraphicsWebView6reloadEv @ 193 NONAME
+ _ZN16QGraphicsWebView6setUrlERK4QUrl @ 194 NONAME
+ _ZN16QGraphicsWebView7forwardEv @ 195 NONAME
+ _ZN16QGraphicsWebView7setHtmlERK7QStringRK4QUrl @ 196 NONAME
+ _ZN16QGraphicsWebView7setPageEP8QWebPage @ 197 NONAME
+ _ZN16QGraphicsWebView9dropEventEP27QGraphicsSceneDragDropEvent @ 198 NONAME
+ _ZN16QGraphicsWebViewC1EP13QGraphicsItem @ 199 NONAME
+ _ZN16QGraphicsWebViewC2EP13QGraphicsItem @ 200 NONAME
+ _ZN16QGraphicsWebViewD0Ev @ 201 NONAME
+ _ZN16QGraphicsWebViewD1Ev @ 202 NONAME
+ _ZN16QGraphicsWebViewD2Ev @ 203 NONAME
+ _ZN17QWebHitTestResultC1EP24QWebHitTestResultPrivate @ 204 NONAME
+ _ZN17QWebHitTestResultC1ERKS_ @ 205 NONAME
+ _ZN17QWebHitTestResultC1Ev @ 206 NONAME
+ _ZN17QWebHitTestResultC2EP24QWebHitTestResultPrivate @ 207 NONAME
+ _ZN17QWebHitTestResultC2ERKS_ @ 208 NONAME
+ _ZN17QWebHitTestResultC2Ev @ 209 NONAME
+ _ZN17QWebHitTestResultD1Ev @ 210 NONAME
+ _ZN17QWebHitTestResultD2Ev @ 211 NONAME
+ _ZN17QWebHitTestResultaSERKS_ @ 212 NONAME
+ _ZN17QWebPluginFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 213 NONAME
+ _ZN17QWebPluginFactory11qt_metacastEPKc @ 214 NONAME
+ _ZN17QWebPluginFactory14refreshPluginsEv @ 215 NONAME
+ _ZN17QWebPluginFactory16staticMetaObjectE @ 216 NONAME DATA 16
+ _ZN17QWebPluginFactory19getStaticMetaObjectEv @ 217 NONAME
+ _ZN17QWebPluginFactory9extensionENS_9ExtensionEPKNS_15ExtensionOptionEPNS_15ExtensionReturnE @ 218 NONAME
+ _ZN17QWebPluginFactoryC2EP7QObject @ 219 NONAME
+ _ZN17QWebPluginFactoryD0Ev @ 220 NONAME
+ _ZN17QWebPluginFactoryD1Ev @ 221 NONAME
+ _ZN17QWebPluginFactoryD2Ev @ 222 NONAME
+ _ZN18QWebPluginDatabase11qt_metacallEN11QMetaObject4CallEiPPv @ 223 NONAME
+ _ZN18QWebPluginDatabase11qt_metacastEPKc @ 224 NONAME
+ _ZN18QWebPluginDatabase13addSearchPathERK7QString @ 225 NONAME
+ _ZN18QWebPluginDatabase14setSearchPathsERK11QStringList @ 226 NONAME
+ _ZN18QWebPluginDatabase16staticMetaObjectE @ 227 NONAME DATA 16
+ _ZN18QWebPluginDatabase17pluginForMimeTypeERK7QString @ 228 NONAME
+ _ZN18QWebPluginDatabase18defaultSearchPathsEv @ 229 NONAME
+ _ZN18QWebPluginDatabase19getStaticMetaObjectEv @ 230 NONAME
+ _ZN18QWebPluginDatabase29setPreferredPluginForMimeTypeERK7QStringRK14QWebPluginInfo @ 231 NONAME
+ _ZN18QWebPluginDatabase7refreshEv @ 232 NONAME
+ _ZN18QWebPluginDatabaseC1EP7QObject @ 233 NONAME
+ _ZN18QWebPluginDatabaseC2EP7QObject @ 234 NONAME
+ _ZN18QWebPluginDatabaseD0Ev @ 235 NONAME
+ _ZN18QWebPluginDatabaseD1Ev @ 236 NONAME
+ _ZN18QWebPluginDatabaseD2Ev @ 237 NONAME
+ _ZN18QWebSecurityOrigin10allOriginsEv @ 238 NONAME
+ _ZN18QWebSecurityOrigin12localSchemesEv @ 239 NONAME
+ _ZN18QWebSecurityOrigin14addLocalSchemeERK7QString @ 240 NONAME
+ _ZN18QWebSecurityOrigin16setDatabaseQuotaEx @ 241 NONAME
+ _ZN18QWebSecurityOrigin17removeLocalSchemeERK7QString @ 242 NONAME
+ _ZN18QWebSecurityOrigin25whiteListAccessFromOriginERK7QStringS2_S2_b @ 243 NONAME
+ _ZN18QWebSecurityOrigin27resetOriginAccessWhiteListsEv @ 244 NONAME
+ _ZN18QWebSecurityOriginC1EP25QWebSecurityOriginPrivate @ 245 NONAME
+ _ZN18QWebSecurityOriginC1ERKS_ @ 246 NONAME
+ _ZN18QWebSecurityOriginC2EP25QWebSecurityOriginPrivate @ 247 NONAME
+ _ZN18QWebSecurityOriginC2ERKS_ @ 248 NONAME
+ _ZN18QWebSecurityOriginD1Ev @ 249 NONAME
+ _ZN18QWebSecurityOriginD2Ev @ 250 NONAME
+ _ZN18QWebSecurityOriginaSERKS_ @ 251 NONAME
+ _ZN20QWebHistoryInterface11qt_metacallEN11QMetaObject4CallEiPPv @ 252 NONAME
+ _ZN20QWebHistoryInterface11qt_metacastEPKc @ 253 NONAME
+ _ZN20QWebHistoryInterface16defaultInterfaceEv @ 254 NONAME
+ _ZN20QWebHistoryInterface16staticMetaObjectE @ 255 NONAME DATA 16
+ _ZN20QWebHistoryInterface19getStaticMetaObjectEv @ 256 NONAME
+ _ZN20QWebHistoryInterface19setDefaultInterfaceEPS_ @ 257 NONAME
+ _ZN20QWebHistoryInterfaceC2EP7QObject @ 258 NONAME
+ _ZN20QWebHistoryInterfaceD0Ev @ 259 NONAME
+ _ZN20QWebHistoryInterfaceD1Ev @ 260 NONAME
+ _ZN20QWebHistoryInterfaceD2Ev @ 261 NONAME
+ _ZN8QWebPage10chooseFileEP9QWebFrameRK7QString @ 262 NONAME
+ _ZN8QWebPage10setPaletteERK8QPalette @ 263 NONAME
+ _ZN8QWebPage11linkClickedERK4QUrl @ 264 NONAME
+ _ZN8QWebPage11linkHoveredERK7QStringS2_S2_ @ 265 NONAME
+ _ZN8QWebPage11loadStartedEv @ 266 NONAME
+ _ZN8QWebPage11qt_metacallEN11QMetaObject4CallEiPPv @ 267 NONAME
+ _ZN8QWebPage11qt_metacastEPKc @ 268 NONAME
+ _ZN8QWebPage12createPluginERK7QStringRK4QUrlRK11QStringListS8_ @ 269 NONAME
+ _ZN8QWebPage12createWindowENS_13WebWindowTypeE @ 270 NONAME
+ _ZN8QWebPage12frameCreatedEP9QWebFrame @ 271 NONAME
+ _ZN8QWebPage12loadFinishedEb @ 272 NONAME
+ _ZN8QWebPage12loadProgressEi @ 273 NONAME
+ _ZN8QWebPage13triggerActionENS_9WebActionEb @ 274 NONAME
+ _ZN8QWebPage14printRequestedEP9QWebFrame @ 275 NONAME
+ _ZN8QWebPage15contentsChangedEv @ 276 NONAME
+ _ZN8QWebPage15javaScriptAlertEP9QWebFrameRK7QString @ 277 NONAME
+ _ZN8QWebPage15scrollRequestedEiiRK5QRect @ 278 NONAME
+ _ZN8QWebPage16javaScriptPromptEP9QWebFrameRK7QStringS4_PS2_ @ 279 NONAME
+ _ZN8QWebPage16repaintRequestedERK5QRect @ 280 NONAME
+ _ZN8QWebPage16selectionChangedEv @ 281 NONAME
+ _ZN8QWebPage16setPluginFactoryEP17QWebPluginFactory @ 282 NONAME
+ _ZN8QWebPage16staticMetaObjectE @ 283 NONAME DATA 16
+ _ZN8QWebPage16statusBarMessageERK7QString @ 284 NONAME
+ _ZN8QWebPage17downloadRequestedERK15QNetworkRequest @ 285 NONAME
+ _ZN8QWebPage17javaScriptConfirmEP9QWebFrameRK7QString @ 286 NONAME
+ _ZN8QWebPage17microFocusChangedEv @ 287 NONAME
+ _ZN8QWebPage18focusNextPrevChildEb @ 288 NONAME
+ _ZN8QWebPage18setContentEditableEb @ 289 NONAME
+ _ZN8QWebPage18unsupportedContentEP13QNetworkReply @ 290 NONAME
+ _ZN8QWebPage19getStaticMetaObjectEv @ 291 NONAME
+ _ZN8QWebPage20windowCloseRequestedEv @ 292 NONAME
+ _ZN8QWebPage21databaseQuotaExceededEP9QWebFrame7QString @ 293 NONAME
+ _ZN8QWebPage21webInspectorTriggeredERK11QWebElement @ 294 NONAME
+ _ZN8QWebPage23acceptNavigationRequestEP9QWebFrameRK15QNetworkRequestNS_14NavigationTypeE @ 295 NONAME
+ _ZN8QWebPage23geometryChangeRequestedERK5QRect @ 296 NONAME
+ _ZN8QWebPage23saveFrameStateRequestedEP9QWebFrameP15QWebHistoryItem @ 297 NONAME
+ _ZN8QWebPage23setLinkDelegationPolicyENS_20LinkDelegationPolicyE @ 298 NONAME
+ _ZN8QWebPage23setNetworkAccessManagerEP21QNetworkAccessManager @ 299 NONAME
+ _ZN8QWebPage23swallowContextMenuEventEP17QContextMenuEvent @ 300 NONAME
+ _ZN8QWebPage24javaScriptConsoleMessageERK7QStringiS2_ @ 301 NONAME
+ _ZN8QWebPage25createStandardContextMenuEv @ 302 NONAME
+ _ZN8QWebPage25shouldInterruptJavaScriptEv @ 303 NONAME
+ _ZN8QWebPage26restoreFrameStateRequestedEP9QWebFrame @ 304 NONAME
+ _ZN8QWebPage28setForwardUnsupportedContentEb @ 305 NONAME
+ _ZN8QWebPage30updatePositionDependentActionsERK6QPoint @ 306 NONAME
+ _ZN8QWebPage32menuBarVisibilityChangeRequestedEb @ 307 NONAME
+ _ZN8QWebPage32toolBarVisibilityChangeRequestedEb @ 308 NONAME
+ _ZN8QWebPage34statusBarVisibilityChangeRequestedEb @ 309 NONAME
+ _ZN8QWebPage5eventEP6QEvent @ 310 NONAME
+ _ZN8QWebPage7setViewEP7QWidget @ 311 NONAME
+ _ZN8QWebPage8findTextERK7QString6QFlagsINS_8FindFlagEE @ 312 NONAME
+ _ZN8QWebPage9extensionENS_9ExtensionEPKNS_15ExtensionOptionEPNS_15ExtensionReturnE @ 313 NONAME
+ _ZN8QWebPageC1EP7QObject @ 314 NONAME
+ _ZN8QWebPageC2EP7QObject @ 315 NONAME
+ _ZN8QWebPageD0Ev @ 316 NONAME
+ _ZN8QWebPageD1Ev @ 317 NONAME
+ _ZN8QWebPageD2Ev @ 318 NONAME
+ _ZN8QWebView10paintEventEP11QPaintEvent @ 319 NONAME
+ _ZN8QWebView10setContentERK10QByteArrayRK7QStringRK4QUrl @ 320 NONAME
+ _ZN8QWebView10urlChangedERK4QUrl @ 321 NONAME
+ _ZN8QWebView10wheelEventEP11QWheelEvent @ 322 NONAME
+ _ZN8QWebView11changeEventEP6QEvent @ 323 NONAME
+ _ZN8QWebView11iconChangedEv @ 324 NONAME
+ _ZN8QWebView11linkClickedERK4QUrl @ 325 NONAME
+ _ZN8QWebView11loadStartedEv @ 326 NONAME
+ _ZN8QWebView11qt_metacallEN11QMetaObject4CallEiPPv @ 327 NONAME
+ _ZN8QWebView11qt_metacastEPKc @ 328 NONAME
+ _ZN8QWebView11resizeEventEP12QResizeEvent @ 329 NONAME
+ _ZN8QWebView12createWindowEN8QWebPage13WebWindowTypeE @ 330 NONAME
+ _ZN8QWebView12focusInEventEP11QFocusEvent @ 331 NONAME
+ _ZN8QWebView12loadFinishedEb @ 332 NONAME
+ _ZN8QWebView12loadProgressEi @ 333 NONAME
+ _ZN8QWebView12titleChangedERK7QString @ 334 NONAME
+ _ZN8QWebView13dragMoveEventEP14QDragMoveEvent @ 335 NONAME
+ _ZN8QWebView13focusOutEventEP11QFocusEvent @ 336 NONAME
+ _ZN8QWebView13keyPressEventEP9QKeyEvent @ 337 NONAME
+ _ZN8QWebView13setRenderHintEN8QPainter10RenderHintEb @ 338 NONAME
+ _ZN8QWebView13setZoomFactorEf @ 339 NONAME
+ _ZN8QWebView14dragEnterEventEP15QDragEnterEvent @ 340 NONAME
+ _ZN8QWebView14dragLeaveEventEP15QDragLeaveEvent @ 341 NONAME
+ _ZN8QWebView14mouseMoveEventEP11QMouseEvent @ 342 NONAME
+ _ZN8QWebView14setRenderHintsE6QFlagsIN8QPainter10RenderHintEE @ 343 NONAME
+ _ZN8QWebView15keyReleaseEventEP9QKeyEvent @ 344 NONAME
+ _ZN8QWebView15mousePressEventEP11QMouseEvent @ 345 NONAME
+ _ZN8QWebView16contextMenuEventEP17QContextMenuEvent @ 346 NONAME
+ _ZN8QWebView16inputMethodEventEP17QInputMethodEvent @ 347 NONAME
+ _ZN8QWebView16selectionChangedEv @ 348 NONAME
+ _ZN8QWebView16staticMetaObjectE @ 349 NONAME DATA 16
+ _ZN8QWebView16statusBarMessageERK7QString @ 350 NONAME
+ _ZN8QWebView17mouseReleaseEventEP11QMouseEvent @ 351 NONAME
+ _ZN8QWebView17triggerPageActionEN8QWebPage9WebActionEb @ 352 NONAME
+ _ZN8QWebView18focusNextPrevChildEb @ 353 NONAME
+ _ZN8QWebView18guessUrlFromStringERK7QString @ 354 NONAME
+ _ZN8QWebView19getStaticMetaObjectEv @ 355 NONAME
+ _ZN8QWebView21mouseDoubleClickEventEP11QMouseEvent @ 356 NONAME
+ _ZN8QWebView21setTextSizeMultiplierEf @ 357 NONAME
+ _ZN8QWebView4backEv @ 358 NONAME
+ _ZN8QWebView4loadERK15QNetworkRequestN21QNetworkAccessManager9OperationERK10QByteArray @ 359 NONAME
+ _ZN8QWebView4loadERK4QUrl @ 360 NONAME
+ _ZN8QWebView4stopEv @ 361 NONAME
+ _ZN8QWebView5eventEP6QEvent @ 362 NONAME
+ _ZN8QWebView6reloadEv @ 363 NONAME
+ _ZN8QWebView6setUrlERK4QUrl @ 364 NONAME
+ _ZN8QWebView7forwardEv @ 365 NONAME
+ _ZN8QWebView7setHtmlERK7QStringRK4QUrl @ 366 NONAME
+ _ZN8QWebView7setPageEP8QWebPage @ 367 NONAME
+ _ZN8QWebView8findTextERK7QString6QFlagsIN8QWebPage8FindFlagEE @ 368 NONAME
+ _ZN8QWebView9dropEventEP10QDropEvent @ 369 NONAME
+ _ZN8QWebViewC1EP7QWidget @ 370 NONAME
+ _ZN8QWebViewC2EP7QWidget @ 371 NONAME
+ _ZN8QWebViewD0Ev @ 372 NONAME
+ _ZN8QWebViewD1Ev @ 373 NONAME
+ _ZN8QWebViewD2Ev @ 374 NONAME
+ _ZN9QWebFrame10setContentERK10QByteArrayRK7QStringRK4QUrl @ 375 NONAME
+ _ZN9QWebFrame10urlChangedERK4QUrl @ 376 NONAME
+ _ZN9QWebFrame11iconChangedEv @ 377 NONAME
+ _ZN9QWebFrame11loadStartedEv @ 378 NONAME
+ _ZN9QWebFrame11qt_metacallEN11QMetaObject4CallEiPPv @ 379 NONAME
+ _ZN9QWebFrame11qt_metacastEPKc @ 380 NONAME
+ _ZN9QWebFrame12loadFinishedEb @ 381 NONAME
+ _ZN9QWebFrame12titleChangedERK7QString @ 382 NONAME
+ _ZN9QWebFrame13setZoomFactorEf @ 383 NONAME
+ _ZN9QWebFrame15provisionalLoadEv @ 384 NONAME
+ _ZN9QWebFrame16staticMetaObjectE @ 385 NONAME DATA 16
+ _ZN9QWebFrame17setScrollBarValueEN2Qt11OrientationEi @ 386 NONAME
+ _ZN9QWebFrame17setScrollPositionERK6QPoint @ 387 NONAME
+ _ZN9QWebFrame18evaluateJavaScriptERK7QString @ 388 NONAME
+ _ZN9QWebFrame18setScrollBarPolicyEN2Qt11OrientationENS0_15ScrollBarPolicyE @ 389 NONAME
+ _ZN9QWebFrame19contentsSizeChangedERK5QSize @ 390 NONAME
+ _ZN9QWebFrame19getStaticMetaObjectEv @ 391 NONAME
+ _ZN9QWebFrame21setTextSizeMultiplierEf @ 392 NONAME
+ _ZN9QWebFrame22initialLayoutCompletedEv @ 393 NONAME
+ _ZN9QWebFrame23setClipRenderToViewportEb @ 394 NONAME
+ _ZN9QWebFrame27addToJavaScriptWindowObjectERK7QStringP7QObject @ 395 NONAME
+ _ZN9QWebFrame27addToJavaScriptWindowObjectERK7QStringP7QObjectN13QScriptEngine14ValueOwnershipE @ 396 NONAME
+ _ZN9QWebFrame29javaScriptWindowObjectClearedEv @ 397 NONAME
+ _ZN9QWebFrame4loadERK15QNetworkRequestN21QNetworkAccessManager9OperationERK10QByteArray @ 398 NONAME
+ _ZN9QWebFrame4loadERK4QUrl @ 399 NONAME
+ _ZN9QWebFrame5eventEP6QEvent @ 400 NONAME
+ _ZN9QWebFrame6renderEP8QPainter @ 401 NONAME
+ _ZN9QWebFrame6renderEP8QPainterRK7QRegion @ 402 NONAME
+ _ZN9QWebFrame6scrollEii @ 403 NONAME
+ _ZN9QWebFrame6setUrlERK4QUrl @ 404 NONAME
+ _ZN9QWebFrame7setHtmlERK7QStringRK4QUrl @ 405 NONAME
+ _ZN9QWebFrame8setFocusEv @ 406 NONAME
+ _ZN9QWebFrameC1EP8QWebPageP13QWebFrameData @ 407 NONAME
+ _ZN9QWebFrameC1EPS_P13QWebFrameData @ 408 NONAME
+ _ZN9QWebFrameC2EP8QWebPageP13QWebFrameData @ 409 NONAME
+ _ZN9QWebFrameC2EPS_P13QWebFrameData @ 410 NONAME
+ _ZN9QWebFrameD0Ev @ 411 NONAME
+ _ZN9QWebFrameD1Ev @ 412 NONAME
+ _ZN9QWebFrameD2Ev @ 413 NONAME
+ _ZNK11QWebElement10firstChildEv @ 414 NONAME
+ _ZNK11QWebElement10toInnerXmlEv @ 415 NONAME
+ _ZNK11QWebElement10toOuterXmlEv @ 416 NONAME
+ _ZNK11QWebElement11attributeNSERK7QStringS2_S2_ @ 417 NONAME
+ _ZNK11QWebElement11nextSiblingEv @ 418 NONAME
+ _ZNK11QWebElement11toPlainTextEv @ 419 NONAME
+ _ZNK11QWebElement12hasAttributeERK7QString @ 420 NONAME
+ _ZNK11QWebElement12namespaceUriEv @ 421 NONAME
+ _ZNK11QWebElement13hasAttributesEv @ 422 NONAME
+ _ZNK11QWebElement13stylePropertyERK7QStringNS_20StyleResolveStrategyE @ 423 NONAME
+ _ZNK11QWebElement14hasAttributeNSERK7QStringS2_ @ 424 NONAME
+ _ZNK11QWebElement15previousSiblingEv @ 425 NONAME
+ _ZNK11QWebElement5cloneEv @ 426 NONAME
+ _ZNK11QWebElement6isNullEv @ 427 NONAME
+ _ZNK11QWebElement6parentEv @ 428 NONAME
+ _ZNK11QWebElement6prefixEv @ 429 NONAME
+ _ZNK11QWebElement7classesEv @ 430 NONAME
+ _ZNK11QWebElement7findAllERK7QString @ 431 NONAME
+ _ZNK11QWebElement7tagNameEv @ 432 NONAME
+ _ZNK11QWebElement8documentEv @ 433 NONAME
+ _ZNK11QWebElement8geometryEv @ 434 NONAME
+ _ZNK11QWebElement8hasClassERK7QString @ 435 NONAME
+ _ZNK11QWebElement8hasFocusEv @ 436 NONAME
+ _ZNK11QWebElement8webFrameEv @ 437 NONAME
+ _ZNK11QWebElement9attributeERK7QStringS2_ @ 438 NONAME
+ _ZNK11QWebElement9findFirstERK7QString @ 439 NONAME
+ _ZNK11QWebElement9lastChildEv @ 440 NONAME
+ _ZNK11QWebElement9localNameEv @ 441 NONAME
+ _ZNK11QWebElementeqERKS_ @ 442 NONAME
+ _ZNK11QWebElementneERKS_ @ 443 NONAME
+ _ZNK11QWebHistory11currentItemEv @ 444 NONAME
+ _ZNK11QWebHistory11forwardItemEv @ 445 NONAME
+ _ZNK11QWebHistory12canGoForwardEv @ 446 NONAME
+ _ZNK11QWebHistory12forwardItemsEi @ 447 NONAME
+ _ZNK11QWebHistory16currentItemIndexEv @ 448 NONAME
+ _ZNK11QWebHistory16maximumItemCountEv @ 449 NONAME
+ _ZNK11QWebHistory5countEv @ 450 NONAME
+ _ZNK11QWebHistory5itemsEv @ 451 NONAME
+ _ZNK11QWebHistory6itemAtEi @ 452 NONAME
+ _ZNK11QWebHistory8backItemEv @ 453 NONAME
+ _ZNK11QWebHistory9backItemsEi @ 454 NONAME
+ _ZNK11QWebHistory9canGoBackEv @ 455 NONAME
+ _ZNK11QWebHistory9saveStateENS_19HistoryStateVersionE @ 456 NONAME
+ _ZNK12QWebDatabase11displayNameEv @ 457 NONAME
+ _ZNK12QWebDatabase12expectedSizeEv @ 458 NONAME
+ _ZNK12QWebDatabase4nameEv @ 459 NONAME
+ _ZNK12QWebDatabase4sizeEv @ 460 NONAME
+ _ZNK12QWebDatabase6originEv @ 461 NONAME
+ _ZNK12QWebDatabase8fileNameEv @ 462 NONAME
+ _ZNK12QWebSettings10fontFamilyENS_10FontFamilyE @ 463 NONAME
+ _ZNK12QWebSettings13testAttributeENS_12WebAttributeE @ 464 NONAME
+ _ZNK12QWebSettings16localStoragePathEv @ 465 NONAME
+ _ZNK12QWebSettings17userStyleSheetUrlEv @ 466 NONAME
+ _ZNK12QWebSettings19defaultTextEncodingEv @ 467 NONAME
+ _ZNK12QWebSettings8fontSizeENS_8FontSizeE @ 468 NONAME
+ _ZNK13QWebInspector10metaObjectEv @ 469 NONAME
+ _ZNK13QWebInspector4pageEv @ 470 NONAME
+ _ZNK13QWebInspector8sizeHintEv @ 471 NONAME
+ _ZNK14QWebPluginInfo11descriptionEv @ 472 NONAME
+ _ZNK14QWebPluginInfo16supportsMimeTypeERK7QString @ 473 NONAME
+ _ZNK14QWebPluginInfo4nameEv @ 474 NONAME
+ _ZNK14QWebPluginInfo4pathEv @ 475 NONAME
+ _ZNK14QWebPluginInfo6isNullEv @ 476 NONAME
+ _ZNK14QWebPluginInfo9isEnabledEv @ 477 NONAME
+ _ZNK14QWebPluginInfo9mimeTypesEv @ 478 NONAME
+ _ZNK14QWebPluginInfoeqERKS_ @ 479 NONAME
+ _ZNK14QWebPluginInfoneERKS_ @ 480 NONAME
+ _ZNK15QWebHistoryItem11lastVisitedEv @ 481 NONAME
+ _ZNK15QWebHistoryItem11originalUrlEv @ 482 NONAME
+ _ZNK15QWebHistoryItem3urlEv @ 483 NONAME
+ _ZNK15QWebHistoryItem4iconEv @ 484 NONAME
+ _ZNK15QWebHistoryItem5titleEv @ 485 NONAME
+ _ZNK15QWebHistoryItem7isValidEv @ 486 NONAME
+ _ZNK15QWebHistoryItem8userDataEv @ 487 NONAME
+ _ZNK16QGraphicsWebView10metaObjectEv @ 488 NONAME
+ _ZNK16QGraphicsWebView10zoomFactorEv @ 489 NONAME
+ _ZNK16QGraphicsWebView13isInteractiveEv @ 490 NONAME
+ _ZNK16QGraphicsWebView3urlEv @ 491 NONAME
+ _ZNK16QGraphicsWebView4iconEv @ 492 NONAME
+ _ZNK16QGraphicsWebView4pageEv @ 493 NONAME
+ _ZNK16QGraphicsWebView5titleEv @ 494 NONAME
+ _ZNK16QGraphicsWebView6statusEv @ 495 NONAME
+ _ZNK16QGraphicsWebView6toHtmlEv @ 496 NONAME
+ _ZNK16QGraphicsWebView7historyEv @ 497 NONAME
+ _ZNK16QGraphicsWebView8progressEv @ 498 NONAME
+ _ZNK16QGraphicsWebView8settingsEv @ 499 NONAME
+ _ZNK17QWebHitTestResult11linkElementEv @ 500 NONAME
+ _ZNK17QWebHitTestResult12boundingRectEv @ 501 NONAME
+ _ZNK17QWebHitTestResult13alternateTextEv @ 502 NONAME
+ _ZNK17QWebHitTestResult15linkTargetFrameEv @ 503 NONAME
+ _ZNK17QWebHitTestResult17isContentEditableEv @ 504 NONAME
+ _ZNK17QWebHitTestResult17isContentSelectedEv @ 505 NONAME
+ _ZNK17QWebHitTestResult21enclosingBlockElementEv @ 506 NONAME
+ _ZNK17QWebHitTestResult3posEv @ 507 NONAME
+ _ZNK17QWebHitTestResult5frameEv @ 508 NONAME
+ _ZNK17QWebHitTestResult5titleEv @ 509 NONAME
+ _ZNK17QWebHitTestResult6isNullEv @ 510 NONAME
+ _ZNK17QWebHitTestResult6pixmapEv @ 511 NONAME
+ _ZNK17QWebHitTestResult7elementEv @ 512 NONAME
+ _ZNK17QWebHitTestResult7linkUrlEv @ 513 NONAME
+ _ZNK17QWebHitTestResult8imageUrlEv @ 514 NONAME
+ _ZNK17QWebHitTestResult8linkTextEv @ 515 NONAME
+ _ZNK17QWebHitTestResult9linkTitleEv @ 516 NONAME
+ _ZNK17QWebPluginFactory10metaObjectEv @ 517 NONAME
+ _ZNK17QWebPluginFactory17supportsExtensionENS_9ExtensionE @ 518 NONAME
+ _ZNK17QWebPluginFactory8MimeTypeeqERKS0_ @ 519 NONAME
+ _ZNK18QWebPluginDatabase10metaObjectEv @ 520 NONAME
+ _ZNK18QWebPluginDatabase11searchPathsEv @ 521 NONAME
+ _ZNK18QWebPluginDatabase7pluginsEv @ 522 NONAME
+ _ZNK18QWebSecurityOrigin13databaseQuotaEv @ 523 NONAME
+ _ZNK18QWebSecurityOrigin13databaseUsageEv @ 524 NONAME
+ _ZNK18QWebSecurityOrigin4hostEv @ 525 NONAME
+ _ZNK18QWebSecurityOrigin4portEv @ 526 NONAME
+ _ZNK18QWebSecurityOrigin6schemeEv @ 527 NONAME
+ _ZNK18QWebSecurityOrigin9databasesEv @ 528 NONAME
+ _ZNK20QWebHistoryInterface10metaObjectEv @ 529 NONAME
+ _ZNK8QWebPage10isModifiedEv @ 530 NONAME
+ _ZNK8QWebPage10metaObjectEv @ 531 NONAME
+ _ZNK8QWebPage10totalBytesEv @ 532 NONAME
+ _ZNK8QWebPage12currentFrameEv @ 533 NONAME
+ _ZNK8QWebPage12selectedTextEv @ 534 NONAME
+ _ZNK8QWebPage12viewportSizeEv @ 535 NONAME
+ _ZNK8QWebPage13bytesReceivedEv @ 536 NONAME
+ _ZNK8QWebPage13pluginFactoryEv @ 537 NONAME
+ _ZNK8QWebPage15setViewportSizeERK5QSize @ 538 NONAME
+ _ZNK8QWebPage15userAgentForUrlERK4QUrl @ 539 NONAME
+ _ZNK8QWebPage16inputMethodQueryEN2Qt16InputMethodQueryE @ 540 NONAME
+ _ZNK8QWebPage17fixedContentsSizeEv @ 541 NONAME
+ _ZNK8QWebPage17isContentEditableEv @ 542 NONAME
+ _ZNK8QWebPage17supportsExtensionENS_9ExtensionE @ 543 NONAME
+ _ZNK8QWebPage20linkDelegationPolicyEv @ 544 NONAME
+ _ZNK8QWebPage20networkAccessManagerEv @ 545 NONAME
+ _ZNK8QWebPage20setFixedContentsSizeERK5QSize @ 546 NONAME
+ _ZNK8QWebPage25forwardUnsupportedContentEv @ 547 NONAME
+ _ZNK8QWebPage4viewEv @ 548 NONAME
+ _ZNK8QWebPage6actionENS_9WebActionE @ 549 NONAME
+ _ZNK8QWebPage7frameAtERK6QPoint @ 550 NONAME
+ _ZNK8QWebPage7historyEv @ 551 NONAME
+ _ZNK8QWebPage7paletteEv @ 552 NONAME
+ _ZNK8QWebPage8settingsEv @ 553 NONAME
+ _ZNK8QWebPage9mainFrameEv @ 554 NONAME
+ _ZNK8QWebPage9undoStackEv @ 555 NONAME
+ _ZNK8QWebView10isModifiedEv @ 556 NONAME
+ _ZNK8QWebView10metaObjectEv @ 557 NONAME
+ _ZNK8QWebView10pageActionEN8QWebPage9WebActionE @ 558 NONAME
+ _ZNK8QWebView10zoomFactorEv @ 559 NONAME
+ _ZNK8QWebView11renderHintsEv @ 560 NONAME
+ _ZNK8QWebView12selectedTextEv @ 561 NONAME
+ _ZNK8QWebView16inputMethodQueryEN2Qt16InputMethodQueryE @ 562 NONAME
+ _ZNK8QWebView18textSizeMultiplierEv @ 563 NONAME
+ _ZNK8QWebView3urlEv @ 564 NONAME
+ _ZNK8QWebView4iconEv @ 565 NONAME
+ _ZNK8QWebView4pageEv @ 566 NONAME
+ _ZNK8QWebView5printEP8QPrinter @ 567 NONAME
+ _ZNK8QWebView5titleEv @ 568 NONAME
+ _ZNK8QWebView7historyEv @ 569 NONAME
+ _ZNK8QWebView8settingsEv @ 570 NONAME
+ _ZNK8QWebView8sizeHintEv @ 571 NONAME
+ _ZNK9QWebFrame10metaObjectEv @ 572 NONAME
+ _ZNK9QWebFrame10zoomFactorEv @ 573 NONAME
+ _ZNK9QWebFrame11childFramesEv @ 574 NONAME
+ _ZNK9QWebFrame11parentFrameEv @ 575 NONAME
+ _ZNK9QWebFrame11toPlainTextEv @ 576 NONAME
+ _ZNK9QWebFrame12contentsSizeEv @ 577 NONAME
+ _ZNK9QWebFrame12requestedUrlEv @ 578 NONAME
+ _ZNK9QWebFrame14hitTestContentERK6QPoint @ 579 NONAME
+ _ZNK9QWebFrame14renderTreeDumpEv @ 580 NONAME
+ _ZNK9QWebFrame14scrollBarValueEN2Qt11OrientationE @ 581 NONAME
+ _ZNK9QWebFrame14scrollPositionEv @ 582 NONAME
+ _ZNK9QWebFrame14securityOriginEv @ 583 NONAME
+ _ZNK9QWebFrame15documentElementEv @ 584 NONAME
+ _ZNK9QWebFrame15findAllElementsERK7QString @ 585 NONAME
+ _ZNK9QWebFrame15scrollBarPolicyEN2Qt11OrientationE @ 586 NONAME
+ _ZNK9QWebFrame16findFirstElementERK7QString @ 587 NONAME
+ _ZNK9QWebFrame16scrollBarMaximumEN2Qt11OrientationE @ 588 NONAME
+ _ZNK9QWebFrame16scrollBarMinimumEN2Qt11OrientationE @ 589 NONAME
+ _ZNK9QWebFrame17scrollBarGeometryEN2Qt11OrientationE @ 590 NONAME
+ _ZNK9QWebFrame18textSizeMultiplierEv @ 591 NONAME
+ _ZNK9QWebFrame20clipRenderToViewportEv @ 592 NONAME
+ _ZNK9QWebFrame3posEv @ 593 NONAME
+ _ZNK9QWebFrame3urlEv @ 594 NONAME
+ _ZNK9QWebFrame4iconEv @ 595 NONAME
+ _ZNK9QWebFrame4pageEv @ 596 NONAME
+ _ZNK9QWebFrame5titleEv @ 597 NONAME
+ _ZNK9QWebFrame6toHtmlEv @ 598 NONAME
+ _ZNK9QWebFrame7baseUrlEv @ 599 NONAME
+ _ZNK9QWebFrame8geometryEv @ 600 NONAME
+ _ZNK9QWebFrame8hasFocusEv @ 601 NONAME
+ _ZNK9QWebFrame8metaDataEv @ 602 NONAME
+ _ZNK9QWebFrame9frameNameEv @ 603 NONAME
+ _ZTI13QWebInspector @ 604 NONAME
+ _ZTI16QGraphicsWebView @ 605 NONAME
+ _ZTI17QWebPluginFactory @ 606 NONAME
+ _ZTI18QWebPluginDatabase @ 607 NONAME
+ _ZTI20QWebHistoryInterface @ 608 NONAME
+ _ZTI8QWebPage @ 609 NONAME
+ _ZTI8QWebView @ 610 NONAME
+ _ZTI9QWebFrame @ 611 NONAME
+ _ZTV13QWebInspector @ 612 NONAME
+ _ZTV16QGraphicsWebView @ 613 NONAME
+ _ZTV17QWebPluginFactory @ 614 NONAME
+ _ZTV18QWebPluginDatabase @ 615 NONAME
+ _ZTV20QWebHistoryInterface @ 616 NONAME
+ _ZTV8QWebPage @ 617 NONAME
+ _ZTV8QWebView @ 618 NONAME
+ _ZTV9QWebFrame @ 619 NONAME
+ _ZThn16_N16QGraphicsWebView11setGeometryERK6QRectF @ 620 NONAME
+ _ZThn16_N16QGraphicsWebView14updateGeometryEv @ 621 NONAME
+ _ZThn16_N16QGraphicsWebViewD0Ev @ 622 NONAME
+ _ZThn16_N16QGraphicsWebViewD1Ev @ 623 NONAME
+ _ZThn8_N13QWebInspectorD0Ev @ 624 NONAME
+ _ZThn8_N13QWebInspectorD1Ev @ 625 NONAME
+ _ZThn8_N16QGraphicsWebView10sceneEventEP6QEvent @ 626 NONAME
+ _ZThn8_N16QGraphicsWebView10wheelEventEP24QGraphicsSceneWheelEvent @ 627 NONAME
+ _ZThn8_N16QGraphicsWebView12focusInEventEP11QFocusEvent @ 628 NONAME
+ _ZThn8_N16QGraphicsWebView13dragMoveEventEP27QGraphicsSceneDragDropEvent @ 629 NONAME
+ _ZThn8_N16QGraphicsWebView13focusOutEventEP11QFocusEvent @ 630 NONAME
+ _ZThn8_N16QGraphicsWebView13keyPressEventEP9QKeyEvent @ 631 NONAME
+ _ZThn8_N16QGraphicsWebView14dragEnterEventEP27QGraphicsSceneDragDropEvent @ 632 NONAME
+ _ZThn8_N16QGraphicsWebView14dragLeaveEventEP27QGraphicsSceneDragDropEvent @ 633 NONAME
+ _ZThn8_N16QGraphicsWebView14hoverMoveEventEP24QGraphicsSceneHoverEvent @ 634 NONAME
+ _ZThn8_N16QGraphicsWebView14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 635 NONAME
+ _ZThn8_N16QGraphicsWebView15hoverLeaveEventEP24QGraphicsSceneHoverEvent @ 636 NONAME
+ _ZThn8_N16QGraphicsWebView15keyReleaseEventEP9QKeyEvent @ 637 NONAME
+ _ZThn8_N16QGraphicsWebView15mousePressEventEP24QGraphicsSceneMouseEvent @ 638 NONAME
+ _ZThn8_N16QGraphicsWebView16contextMenuEventEP30QGraphicsSceneContextMenuEvent @ 639 NONAME
+ _ZThn8_N16QGraphicsWebView16inputMethodEventEP17QInputMethodEvent @ 640 NONAME
+ _ZThn8_N16QGraphicsWebView17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 641 NONAME
+ _ZThn8_N16QGraphicsWebView21mouseDoubleClickEventEP24QGraphicsSceneMouseEvent @ 642 NONAME
+ _ZThn8_N16QGraphicsWebView5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 643 NONAME
+ _ZThn8_N16QGraphicsWebView9dropEventEP27QGraphicsSceneDragDropEvent @ 644 NONAME
+ _ZThn8_N16QGraphicsWebViewD0Ev @ 645 NONAME
+ _ZThn8_N16QGraphicsWebViewD1Ev @ 646 NONAME
+ _ZThn8_N8QWebViewD0Ev @ 647 NONAME
+ _ZThn8_N8QWebViewD1Ev @ 648 NONAME
+ _ZlsR11QDataStreamRK11QWebHistory @ 649 NONAME
+ _ZrsR11QDataStreamR11QWebHistory @ 650 NONAME
+
diff --git a/src/s60installs/eabi/QtXmlu.def b/src/s60installs/eabi/QtXmlu.def
index f08152f..cc5115c 100644
--- a/src/s60installs/eabi/QtXmlu.def
+++ b/src/s60installs/eabi/QtXmlu.def
@@ -208,284 +208,253 @@ EXPORTS
_ZN18QXmlDefaultHandler8startDTDERK7QStringS2_S2_ @ 207 NONAME
_ZN18QXmlDefaultHandler9endEntityERK7QString @ 208 NONAME
_ZN18QXmlParseExceptionC1ERK7QStringiiS2_S2_ @ 209 NONAME
- _ZN18QXmlParseExceptionC2ERK7QStringiiS2_S2_ @ 210 NONAME
- _ZN18QXmlParseExceptionD1Ev @ 211 NONAME
- _ZN18QXmlParseExceptionD2Ev @ 212 NONAME
- _ZN19QDomEntityReferenceC1EP26QDomEntityReferencePrivate @ 213 NONAME
- _ZN19QDomEntityReferenceC1ERKS_ @ 214 NONAME
- _ZN19QDomEntityReferenceC1Ev @ 215 NONAME
- _ZN19QDomEntityReferenceC2EP26QDomEntityReferencePrivate @ 216 NONAME
- _ZN19QDomEntityReferenceC2ERKS_ @ 217 NONAME
- _ZN19QDomEntityReferenceC2Ev @ 218 NONAME
- _ZN19QDomEntityReferenceaSERKS_ @ 219 NONAME
- _ZN20QDomDocumentFragmentC1EP27QDomDocumentFragmentPrivate @ 220 NONAME
- _ZN20QDomDocumentFragmentC1ERKS_ @ 221 NONAME
- _ZN20QDomDocumentFragmentC1Ev @ 222 NONAME
- _ZN20QDomDocumentFragmentC2EP27QDomDocumentFragmentPrivate @ 223 NONAME
- _ZN20QDomDocumentFragmentC2ERKS_ @ 224 NONAME
- _ZN20QDomDocumentFragmentC2Ev @ 225 NONAME
- _ZN20QDomDocumentFragmentaSERKS_ @ 226 NONAME
- _ZN20QXmlNamespaceSupport10popContextEv @ 227 NONAME
- _ZN20QXmlNamespaceSupport11pushContextEv @ 228 NONAME
- _ZN20QXmlNamespaceSupport5resetEv @ 229 NONAME
- _ZN20QXmlNamespaceSupport9setPrefixERK7QStringS2_ @ 230 NONAME
- _ZN20QXmlNamespaceSupportC1Ev @ 231 NONAME
- _ZN20QXmlNamespaceSupportC2Ev @ 232 NONAME
- _ZN20QXmlNamespaceSupportD1Ev @ 233 NONAME
- _ZN20QXmlNamespaceSupportD2Ev @ 234 NONAME
- _ZN25QDomProcessingInstruction7setDataERK7QString @ 235 NONAME
- _ZN25QDomProcessingInstructionC1EP32QDomProcessingInstructionPrivate @ 236 NONAME
- _ZN25QDomProcessingInstructionC1ERKS_ @ 237 NONAME
- _ZN25QDomProcessingInstructionC1Ev @ 238 NONAME
- _ZN25QDomProcessingInstructionC2EP32QDomProcessingInstructionPrivate @ 239 NONAME
- _ZN25QDomProcessingInstructionC2ERKS_ @ 240 NONAME
- _ZN25QDomProcessingInstructionC2Ev @ 241 NONAME
- _ZN25QDomProcessingInstructionaSERKS_ @ 242 NONAME
- _ZN8QDomAttr8setValueERK7QString @ 243 NONAME
- _ZN8QDomAttrC1EP15QDomAttrPrivate @ 244 NONAME
- _ZN8QDomAttrC1ERKS_ @ 245 NONAME
- _ZN8QDomAttrC1Ev @ 246 NONAME
- _ZN8QDomAttrC2EP15QDomAttrPrivate @ 247 NONAME
- _ZN8QDomAttrC2ERKS_ @ 248 NONAME
- _ZN8QDomAttrC2Ev @ 249 NONAME
- _ZN8QDomAttraSERKS_ @ 250 NONAME
- _ZN8QDomNode11appendChildERKS_ @ 251 NONAME
- _ZN8QDomNode11insertAfterERKS_S1_ @ 252 NONAME
- _ZN8QDomNode11removeChildERKS_ @ 253 NONAME
- _ZN8QDomNode12insertBeforeERKS_S1_ @ 254 NONAME
- _ZN8QDomNode12replaceChildERKS_S1_ @ 255 NONAME
- _ZN8QDomNode12setNodeValueERK7QString @ 256 NONAME
- _ZN8QDomNode5clearEv @ 257 NONAME
- _ZN8QDomNode9normalizeEv @ 258 NONAME
- _ZN8QDomNode9setPrefixERK7QString @ 259 NONAME
- _ZN8QDomNodeC1EP15QDomNodePrivate @ 260 NONAME
- _ZN8QDomNodeC1ERKS_ @ 261 NONAME
- _ZN8QDomNodeC1Ev @ 262 NONAME
- _ZN8QDomNodeC2EP15QDomNodePrivate @ 263 NONAME
- _ZN8QDomNodeC2ERKS_ @ 264 NONAME
- _ZN8QDomNodeC2Ev @ 265 NONAME
- _ZN8QDomNodeD1Ev @ 266 NONAME
- _ZN8QDomNodeD2Ev @ 267 NONAME
- _ZN8QDomNodeaSERKS_ @ 268 NONAME
- _ZN8QDomText9splitTextEi @ 269 NONAME
- _ZN8QDomTextC1EP15QDomTextPrivate @ 270 NONAME
- _ZN8QDomTextC1ERKS_ @ 271 NONAME
- _ZN8QDomTextC1Ev @ 272 NONAME
- _ZN8QDomTextC2EP15QDomTextPrivate @ 273 NONAME
- _ZN8QDomTextC2ERKS_ @ 274 NONAME
- _ZN8QDomTextC2Ev @ 275 NONAME
- _ZN8QDomTextaSERKS_ @ 276 NONAME
- _ZNK10QDomEntity12notationNameEv @ 277 NONAME
- _ZNK10QDomEntity8publicIdEv @ 278 NONAME
- _ZNK10QDomEntity8systemIdEv @ 279 NONAME
- _ZNK11QDomElement10attributesEv @ 280 NONAME
- _ZNK11QDomElement11attributeNSE7QStringRKS0_S2_ @ 281 NONAME
- _ZNK11QDomElement12hasAttributeERK7QString @ 282 NONAME
- _ZNK11QDomElement14hasAttributeNSERK7QStringS2_ @ 283 NONAME
- _ZNK11QDomElement17elementsByTagNameERK7QString @ 284 NONAME
- _ZNK11QDomElement19elementsByTagNameNSERK7QStringS2_ @ 285 NONAME
- _ZNK11QDomElement4textEv @ 286 NONAME
- _ZNK11QDomElement7tagNameEv @ 287 NONAME
- _ZNK11QDomElement9attributeERK7QStringS2_ @ 288 NONAME
- _ZNK12QDomDocument11toByteArrayEi @ 289 NONAME
- _ZNK12QDomDocument14implementationEv @ 290 NONAME
- _ZNK12QDomDocument15documentElementEv @ 291 NONAME
- _ZNK12QDomDocument17elementsByTagNameERK7QString @ 292 NONAME
- _ZNK12QDomDocument7doctypeEv @ 293 NONAME
- _ZNK12QDomDocument8toStringEi @ 294 NONAME
- _ZNK12QDomNodeList4itemEi @ 295 NONAME
- _ZNK12QDomNodeList6lengthEv @ 296 NONAME
- _ZNK12QDomNodeListeqERKS_ @ 297 NONAME
- _ZNK12QDomNodeListneERKS_ @ 298 NONAME
- _ZNK12QDomNotation8publicIdEv @ 299 NONAME
- _ZNK12QDomNotation8systemIdEv @ 300 NONAME
- _ZNK14QXmlAttributes3uriEi @ 301 NONAME
- _ZNK14QXmlAttributes4typeERK7QString @ 302 NONAME
- _ZNK14QXmlAttributes4typeERK7QStringS2_ @ 303 NONAME
- _ZNK14QXmlAttributes4typeEi @ 304 NONAME
- _ZNK14QXmlAttributes5indexERK13QLatin1String @ 305 NONAME
- _ZNK14QXmlAttributes5indexERK7QString @ 306 NONAME
- _ZNK14QXmlAttributes5indexERK7QStringS2_ @ 307 NONAME
- _ZNK14QXmlAttributes5qNameEi @ 308 NONAME
- _ZNK14QXmlAttributes5valueERK13QLatin1String @ 309 NONAME
- _ZNK14QXmlAttributes5valueERK7QString @ 310 NONAME
- _ZNK14QXmlAttributes5valueERK7QStringS2_ @ 311 NONAME
- _ZNK14QXmlAttributes5valueEi @ 312 NONAME
- _ZNK14QXmlAttributes6lengthEv @ 313 NONAME
- _ZNK14QXmlAttributes9localNameEi @ 314 NONAME
- _ZNK15QXmlInputSource4dataEv @ 315 NONAME
- _ZNK16QDomDocumentType14internalSubsetEv @ 316 NONAME
- _ZNK16QDomDocumentType4nameEv @ 317 NONAME
- _ZNK16QDomDocumentType8entitiesEv @ 318 NONAME
- _ZNK16QDomDocumentType8publicIdEv @ 319 NONAME
- _ZNK16QDomDocumentType8systemIdEv @ 320 NONAME
- _ZNK16QDomDocumentType9notationsEv @ 321 NONAME
- _ZNK16QDomNamedNodeMap11namedItemNSERK7QStringS2_ @ 322 NONAME
- _ZNK16QDomNamedNodeMap4itemEi @ 323 NONAME
- _ZNK16QDomNamedNodeMap6lengthEv @ 324 NONAME
- _ZNK16QDomNamedNodeMap8containsERK7QString @ 325 NONAME
- _ZNK16QDomNamedNodeMap9namedItemERK7QString @ 326 NONAME
- _ZNK16QDomNamedNodeMapeqERKS_ @ 327 NONAME
- _ZNK16QDomNamedNodeMapneERKS_ @ 328 NONAME
- _ZNK16QXmlSimpleReader10DTDHandlerEv @ 329 NONAME
- _ZNK16QXmlSimpleReader10hasFeatureERK7QString @ 330 NONAME
- _ZNK16QXmlSimpleReader11declHandlerEv @ 331 NONAME
- _ZNK16QXmlSimpleReader11hasPropertyERK7QString @ 332 NONAME
- _ZNK16QXmlSimpleReader12errorHandlerEv @ 333 NONAME
- _ZNK16QXmlSimpleReader14contentHandlerEv @ 334 NONAME
- _ZNK16QXmlSimpleReader14entityResolverEv @ 335 NONAME
- _ZNK16QXmlSimpleReader14lexicalHandlerEv @ 336 NONAME
- _ZNK16QXmlSimpleReader7featureERK7QStringPb @ 337 NONAME
- _ZNK16QXmlSimpleReader8propertyERK7QStringPb @ 338 NONAME
- _ZNK17QDomCharacterData4dataEv @ 339 NONAME
- _ZNK17QDomCharacterData6lengthEv @ 340 NONAME
- _ZNK17QDomCharacterData8nodeTypeEv @ 341 NONAME
- _ZNK18QDomImplementation10hasFeatureERK7QStringS2_ @ 342 NONAME
- _ZNK18QDomImplementationeqERKS_ @ 343 NONAME
- _ZNK18QDomImplementationneERKS_ @ 344 NONAME
- _ZNK18QXmlDefaultHandler11errorStringEv @ 345 NONAME
- _ZNK18QXmlParseException10lineNumberEv @ 346 NONAME
- _ZNK18QXmlParseException12columnNumberEv @ 347 NONAME
- _ZNK18QXmlParseException7messageEv @ 348 NONAME
- _ZNK18QXmlParseException8publicIdEv @ 349 NONAME
- _ZNK18QXmlParseException8systemIdEv @ 350 NONAME
- _ZNK20QXmlNamespaceSupport11processNameERK7QStringbRS0_S3_ @ 351 NONAME
- _ZNK20QXmlNamespaceSupport3uriERK7QString @ 352 NONAME
- _ZNK20QXmlNamespaceSupport6prefixERK7QString @ 353 NONAME
- _ZNK20QXmlNamespaceSupport8prefixesERK7QString @ 354 NONAME
- _ZNK20QXmlNamespaceSupport8prefixesEv @ 355 NONAME
- _ZNK20QXmlNamespaceSupport9splitNameERK7QStringRS0_S3_ @ 356 NONAME
- _ZNK25QDomProcessingInstruction4dataEv @ 357 NONAME
- _ZNK25QDomProcessingInstruction6targetEv @ 358 NONAME
- _ZNK8QDomAttr12ownerElementEv @ 359 NONAME
- _ZNK8QDomAttr4nameEv @ 360 NONAME
- _ZNK8QDomAttr5valueEv @ 361 NONAME
- _ZNK8QDomAttr9specifiedEv @ 362 NONAME
- _ZNK8QDomNode10attributesEv @ 363 NONAME
- _ZNK8QDomNode10childNodesEv @ 364 NONAME
- _ZNK8QDomNode10firstChildEv @ 365 NONAME
- _ZNK8QDomNode10isDocumentEv @ 366 NONAME
- _ZNK8QDomNode10isNotationEv @ 367 NONAME
- _ZNK8QDomNode10lineNumberEv @ 368 NONAME
- _ZNK8QDomNode10parentNodeEv @ 369 NONAME
- _ZNK8QDomNode10toDocumentEv @ 370 NONAME
- _ZNK8QDomNode10toNotationEv @ 371 NONAME
- _ZNK8QDomNode11isSupportedERK7QStringS2_ @ 372 NONAME
- _ZNK8QDomNode11nextSiblingEv @ 373 NONAME
- _ZNK8QDomNode12columnNumberEv @ 374 NONAME
- _ZNK8QDomNode12namespaceURIEv @ 375 NONAME
- _ZNK8QDomNode13hasAttributesEv @ 376 NONAME
- _ZNK8QDomNode13hasChildNodesEv @ 377 NONAME
- _ZNK8QDomNode13ownerDocumentEv @ 378 NONAME
- _ZNK8QDomNode14isCDATASectionEv @ 379 NONAME
- _ZNK8QDomNode14isDocumentTypeEv @ 380 NONAME
- _ZNK8QDomNode14toCDATASectionEv @ 381 NONAME
- _ZNK8QDomNode14toDocumentTypeEv @ 382 NONAME
- _ZNK8QDomNode15isCharacterDataEv @ 383 NONAME
- _ZNK8QDomNode15previousSiblingEv @ 384 NONAME
- _ZNK8QDomNode15toCharacterDataEv @ 385 NONAME
- _ZNK8QDomNode16lastChildElementERK7QString @ 386 NONAME
- _ZNK8QDomNode17firstChildElementERK7QString @ 387 NONAME
- _ZNK8QDomNode17isEntityReferenceEv @ 388 NONAME
- _ZNK8QDomNode17toEntityReferenceEv @ 389 NONAME
- _ZNK8QDomNode18isDocumentFragmentEv @ 390 NONAME
- _ZNK8QDomNode18nextSiblingElementERK7QString @ 391 NONAME
- _ZNK8QDomNode18toDocumentFragmentEv @ 392 NONAME
- _ZNK8QDomNode22previousSiblingElementERK7QString @ 393 NONAME
- _ZNK8QDomNode23isProcessingInstructionEv @ 394 NONAME
- _ZNK8QDomNode23toProcessingInstructionEv @ 395 NONAME
- _ZNK8QDomNode4saveER11QTextStreami @ 396 NONAME
- _ZNK8QDomNode4saveER11QTextStreamiNS_14EncodingPolicyE @ 397 NONAME
- _ZNK8QDomNode6isAttrEv @ 398 NONAME
- _ZNK8QDomNode6isNullEv @ 399 NONAME
- _ZNK8QDomNode6isTextEv @ 400 NONAME
- _ZNK8QDomNode6prefixEv @ 401 NONAME
- _ZNK8QDomNode6toAttrEv @ 402 NONAME
- _ZNK8QDomNode6toTextEv @ 403 NONAME
- _ZNK8QDomNode8isEntityEv @ 404 NONAME
- _ZNK8QDomNode8nodeNameEv @ 405 NONAME
- _ZNK8QDomNode8nodeTypeEv @ 406 NONAME
- _ZNK8QDomNode8toEntityEv @ 407 NONAME
- _ZNK8QDomNode9cloneNodeEb @ 408 NONAME
- _ZNK8QDomNode9isCommentEv @ 409 NONAME
- _ZNK8QDomNode9isElementEv @ 410 NONAME
- _ZNK8QDomNode9lastChildEv @ 411 NONAME
- _ZNK8QDomNode9localNameEv @ 412 NONAME
- _ZNK8QDomNode9namedItemERK7QString @ 413 NONAME
- _ZNK8QDomNode9nodeValueEv @ 414 NONAME
- _ZNK8QDomNode9toCommentEv @ 415 NONAME
- _ZNK8QDomNode9toElementEv @ 416 NONAME
- _ZNK8QDomNodeeqERKS_ @ 417 NONAME
- _ZNK8QDomNodeneERKS_ @ 418 NONAME
- _ZTI10QXmlReader @ 419 NONAME
- _ZTI11QDomHandler @ 420 NONAME ABSENT
- _ZTI11QXmlLocator @ 421 NONAME
- _ZTI14QXmlAttributes @ 422 NONAME
- _ZTI14QXmlDTDHandler @ 423 NONAME
- _ZTI15QDomAttrPrivate @ 424 NONAME ABSENT
- _ZTI15QDomNodePrivate @ 425 NONAME ABSENT
- _ZTI15QDomTextPrivate @ 426 NONAME ABSENT
- _ZTI15QXmlDeclHandler @ 427 NONAME
- _ZTI15QXmlInputSource @ 428 NONAME
- _ZTI16QXmlErrorHandler @ 429 NONAME
- _ZTI16QXmlSimpleReader @ 430 NONAME
- _ZTI17QDomEntityPrivate @ 431 NONAME ABSENT
- _ZTI18QDomCommentPrivate @ 432 NONAME ABSENT
- _ZTI18QDomElementPrivate @ 433 NONAME ABSENT
- _ZTI18QXmlContentHandler @ 434 NONAME
- _ZTI18QXmlDefaultHandler @ 435 NONAME
- _ZTI18QXmlEntityResolver @ 436 NONAME
- _ZTI18QXmlLexicalHandler @ 437 NONAME
- _ZTI19QDomDocumentPrivate @ 438 NONAME ABSENT
- _ZTI19QDomNotationPrivate @ 439 NONAME ABSENT
- _ZTI23QDomCDATASectionPrivate @ 440 NONAME ABSENT
- _ZTI23QDomDocumentTypePrivate @ 441 NONAME ABSENT
- _ZTI24QDomCharacterDataPrivate @ 442 NONAME ABSENT
- _ZTI26QDomEntityReferencePrivate @ 443 NONAME ABSENT
- _ZTI27QDomDocumentFragmentPrivate @ 444 NONAME ABSENT
- _ZTI32QDomProcessingInstructionPrivate @ 445 NONAME ABSENT
- _ZTV11QDomHandler @ 446 NONAME ABSENT
- _ZTV11QXmlLocator @ 447 NONAME
- _ZTV14QXmlAttributes @ 448 NONAME
- _ZTV15QDomAttrPrivate @ 449 NONAME ABSENT
- _ZTV15QDomNodePrivate @ 450 NONAME ABSENT
- _ZTV15QDomTextPrivate @ 451 NONAME ABSENT
- _ZTV15QXmlInputSource @ 452 NONAME
- _ZTV16QXmlSimpleReader @ 453 NONAME
- _ZTV17QDomEntityPrivate @ 454 NONAME ABSENT
- _ZTV18QDomCommentPrivate @ 455 NONAME ABSENT
- _ZTV18QDomElementPrivate @ 456 NONAME ABSENT
- _ZTV18QXmlDefaultHandler @ 457 NONAME
- _ZTV19QDomDocumentPrivate @ 458 NONAME ABSENT
- _ZTV19QDomNotationPrivate @ 459 NONAME ABSENT
- _ZTV23QDomCDATASectionPrivate @ 460 NONAME ABSENT
- _ZTV23QDomDocumentTypePrivate @ 461 NONAME ABSENT
- _ZTV24QDomCharacterDataPrivate @ 462 NONAME ABSENT
- _ZTV26QDomEntityReferencePrivate @ 463 NONAME ABSENT
- _ZTV27QDomDocumentFragmentPrivate @ 464 NONAME ABSENT
- _ZTV32QDomProcessingInstructionPrivate @ 465 NONAME ABSENT
- _ZThn12_N18QXmlDefaultHandler13resolveEntityERK7QStringS2_RP15QXmlInputSource @ 466 NONAME
- _ZThn12_NK18QXmlDefaultHandler11errorStringEv @ 467 NONAME
- _ZThn16_N18QXmlDefaultHandler10startCDATAEv @ 468 NONAME
- _ZThn16_N18QXmlDefaultHandler11startEntityERK7QString @ 469 NONAME
- _ZThn16_N18QXmlDefaultHandler6endDTDEv @ 470 NONAME
- _ZThn16_N18QXmlDefaultHandler7commentERK7QString @ 471 NONAME
- _ZThn16_N18QXmlDefaultHandler8endCDATAEv @ 472 NONAME
- _ZThn16_N18QXmlDefaultHandler8startDTDERK7QStringS2_S2_ @ 473 NONAME
- _ZThn16_N18QXmlDefaultHandler9endEntityERK7QString @ 474 NONAME
- _ZThn16_NK18QXmlDefaultHandler11errorStringEv @ 475 NONAME
- _ZThn20_N18QXmlDefaultHandler13attributeDeclERK7QStringS2_S2_S2_S2_ @ 476 NONAME
- _ZThn20_N18QXmlDefaultHandler18externalEntityDeclERK7QStringS2_S2_ @ 477 NONAME
- _ZThn20_N18QXmlDefaultHandler18internalEntityDeclERK7QStringS2_ @ 478 NONAME
- _ZThn20_NK18QXmlDefaultHandler11errorStringEv @ 479 NONAME
- _ZThn4_N18QXmlDefaultHandler10fatalErrorERK18QXmlParseException @ 480 NONAME
- _ZThn4_N18QXmlDefaultHandler5errorERK18QXmlParseException @ 481 NONAME
- _ZThn4_N18QXmlDefaultHandler7warningERK18QXmlParseException @ 482 NONAME
- _ZThn4_NK18QXmlDefaultHandler11errorStringEv @ 483 NONAME
- _ZThn8_N18QXmlDefaultHandler12notationDeclERK7QStringS2_S2_ @ 484 NONAME
- _ZThn8_N18QXmlDefaultHandler18unparsedEntityDeclERK7QStringS2_S2_S2_ @ 485 NONAME
- _ZThn8_NK18QXmlDefaultHandler11errorStringEv @ 486 NONAME
- _ZlsR11QTextStreamRK8QDomNode @ 487 NONAME
- _ZN18QXmlParseExceptionC1ERKS_ @ 488 NONAME
- _ZN18QXmlParseExceptionC2ERKS_ @ 489 NONAME
-
+ _ZN18QXmlParseExceptionC1ERKS_ @ 210 NONAME
+ _ZN18QXmlParseExceptionC2ERK7QStringiiS2_S2_ @ 211 NONAME
+ _ZN18QXmlParseExceptionC2ERKS_ @ 212 NONAME
+ _ZN18QXmlParseExceptionD1Ev @ 213 NONAME
+ _ZN18QXmlParseExceptionD2Ev @ 214 NONAME
+ _ZN19QDomEntityReferenceC1EP26QDomEntityReferencePrivate @ 215 NONAME
+ _ZN19QDomEntityReferenceC1ERKS_ @ 216 NONAME
+ _ZN19QDomEntityReferenceC1Ev @ 217 NONAME
+ _ZN19QDomEntityReferenceC2EP26QDomEntityReferencePrivate @ 218 NONAME
+ _ZN19QDomEntityReferenceC2ERKS_ @ 219 NONAME
+ _ZN19QDomEntityReferenceC2Ev @ 220 NONAME
+ _ZN19QDomEntityReferenceaSERKS_ @ 221 NONAME
+ _ZN20QDomDocumentFragmentC1EP27QDomDocumentFragmentPrivate @ 222 NONAME
+ _ZN20QDomDocumentFragmentC1ERKS_ @ 223 NONAME
+ _ZN20QDomDocumentFragmentC1Ev @ 224 NONAME
+ _ZN20QDomDocumentFragmentC2EP27QDomDocumentFragmentPrivate @ 225 NONAME
+ _ZN20QDomDocumentFragmentC2ERKS_ @ 226 NONAME
+ _ZN20QDomDocumentFragmentC2Ev @ 227 NONAME
+ _ZN20QDomDocumentFragmentaSERKS_ @ 228 NONAME
+ _ZN20QXmlNamespaceSupport10popContextEv @ 229 NONAME
+ _ZN20QXmlNamespaceSupport11pushContextEv @ 230 NONAME
+ _ZN20QXmlNamespaceSupport5resetEv @ 231 NONAME
+ _ZN20QXmlNamespaceSupport9setPrefixERK7QStringS2_ @ 232 NONAME
+ _ZN20QXmlNamespaceSupportC1Ev @ 233 NONAME
+ _ZN20QXmlNamespaceSupportC2Ev @ 234 NONAME
+ _ZN20QXmlNamespaceSupportD1Ev @ 235 NONAME
+ _ZN20QXmlNamespaceSupportD2Ev @ 236 NONAME
+ _ZN25QDomProcessingInstruction7setDataERK7QString @ 237 NONAME
+ _ZN25QDomProcessingInstructionC1EP32QDomProcessingInstructionPrivate @ 238 NONAME
+ _ZN25QDomProcessingInstructionC1ERKS_ @ 239 NONAME
+ _ZN25QDomProcessingInstructionC1Ev @ 240 NONAME
+ _ZN25QDomProcessingInstructionC2EP32QDomProcessingInstructionPrivate @ 241 NONAME
+ _ZN25QDomProcessingInstructionC2ERKS_ @ 242 NONAME
+ _ZN25QDomProcessingInstructionC2Ev @ 243 NONAME
+ _ZN25QDomProcessingInstructionaSERKS_ @ 244 NONAME
+ _ZN8QDomAttr8setValueERK7QString @ 245 NONAME
+ _ZN8QDomAttrC1EP15QDomAttrPrivate @ 246 NONAME
+ _ZN8QDomAttrC1ERKS_ @ 247 NONAME
+ _ZN8QDomAttrC1Ev @ 248 NONAME
+ _ZN8QDomAttrC2EP15QDomAttrPrivate @ 249 NONAME
+ _ZN8QDomAttrC2ERKS_ @ 250 NONAME
+ _ZN8QDomAttrC2Ev @ 251 NONAME
+ _ZN8QDomAttraSERKS_ @ 252 NONAME
+ _ZN8QDomNode11appendChildERKS_ @ 253 NONAME
+ _ZN8QDomNode11insertAfterERKS_S1_ @ 254 NONAME
+ _ZN8QDomNode11removeChildERKS_ @ 255 NONAME
+ _ZN8QDomNode12insertBeforeERKS_S1_ @ 256 NONAME
+ _ZN8QDomNode12replaceChildERKS_S1_ @ 257 NONAME
+ _ZN8QDomNode12setNodeValueERK7QString @ 258 NONAME
+ _ZN8QDomNode5clearEv @ 259 NONAME
+ _ZN8QDomNode9normalizeEv @ 260 NONAME
+ _ZN8QDomNode9setPrefixERK7QString @ 261 NONAME
+ _ZN8QDomNodeC1EP15QDomNodePrivate @ 262 NONAME
+ _ZN8QDomNodeC1ERKS_ @ 263 NONAME
+ _ZN8QDomNodeC1Ev @ 264 NONAME
+ _ZN8QDomNodeC2EP15QDomNodePrivate @ 265 NONAME
+ _ZN8QDomNodeC2ERKS_ @ 266 NONAME
+ _ZN8QDomNodeC2Ev @ 267 NONAME
+ _ZN8QDomNodeD1Ev @ 268 NONAME
+ _ZN8QDomNodeD2Ev @ 269 NONAME
+ _ZN8QDomNodeaSERKS_ @ 270 NONAME
+ _ZN8QDomText9splitTextEi @ 271 NONAME
+ _ZN8QDomTextC1EP15QDomTextPrivate @ 272 NONAME
+ _ZN8QDomTextC1ERKS_ @ 273 NONAME
+ _ZN8QDomTextC1Ev @ 274 NONAME
+ _ZN8QDomTextC2EP15QDomTextPrivate @ 275 NONAME
+ _ZN8QDomTextC2ERKS_ @ 276 NONAME
+ _ZN8QDomTextC2Ev @ 277 NONAME
+ _ZN8QDomTextaSERKS_ @ 278 NONAME
+ _ZNK10QDomEntity12notationNameEv @ 279 NONAME
+ _ZNK10QDomEntity8publicIdEv @ 280 NONAME
+ _ZNK10QDomEntity8systemIdEv @ 281 NONAME
+ _ZNK11QDomElement10attributesEv @ 282 NONAME
+ _ZNK11QDomElement11attributeNSE7QStringRKS0_S2_ @ 283 NONAME
+ _ZNK11QDomElement12hasAttributeERK7QString @ 284 NONAME
+ _ZNK11QDomElement14hasAttributeNSERK7QStringS2_ @ 285 NONAME
+ _ZNK11QDomElement17elementsByTagNameERK7QString @ 286 NONAME
+ _ZNK11QDomElement19elementsByTagNameNSERK7QStringS2_ @ 287 NONAME
+ _ZNK11QDomElement4textEv @ 288 NONAME
+ _ZNK11QDomElement7tagNameEv @ 289 NONAME
+ _ZNK11QDomElement9attributeERK7QStringS2_ @ 290 NONAME
+ _ZNK12QDomDocument11toByteArrayEi @ 291 NONAME
+ _ZNK12QDomDocument14implementationEv @ 292 NONAME
+ _ZNK12QDomDocument15documentElementEv @ 293 NONAME
+ _ZNK12QDomDocument17elementsByTagNameERK7QString @ 294 NONAME
+ _ZNK12QDomDocument7doctypeEv @ 295 NONAME
+ _ZNK12QDomDocument8toStringEi @ 296 NONAME
+ _ZNK12QDomNodeList4itemEi @ 297 NONAME
+ _ZNK12QDomNodeList6lengthEv @ 298 NONAME
+ _ZNK12QDomNodeListeqERKS_ @ 299 NONAME
+ _ZNK12QDomNodeListneERKS_ @ 300 NONAME
+ _ZNK12QDomNotation8publicIdEv @ 301 NONAME
+ _ZNK12QDomNotation8systemIdEv @ 302 NONAME
+ _ZNK14QXmlAttributes3uriEi @ 303 NONAME
+ _ZNK14QXmlAttributes4typeERK7QString @ 304 NONAME
+ _ZNK14QXmlAttributes4typeERK7QStringS2_ @ 305 NONAME
+ _ZNK14QXmlAttributes4typeEi @ 306 NONAME
+ _ZNK14QXmlAttributes5indexERK13QLatin1String @ 307 NONAME
+ _ZNK14QXmlAttributes5indexERK7QString @ 308 NONAME
+ _ZNK14QXmlAttributes5indexERK7QStringS2_ @ 309 NONAME
+ _ZNK14QXmlAttributes5qNameEi @ 310 NONAME
+ _ZNK14QXmlAttributes5valueERK13QLatin1String @ 311 NONAME
+ _ZNK14QXmlAttributes5valueERK7QString @ 312 NONAME
+ _ZNK14QXmlAttributes5valueERK7QStringS2_ @ 313 NONAME
+ _ZNK14QXmlAttributes5valueEi @ 314 NONAME
+ _ZNK14QXmlAttributes6lengthEv @ 315 NONAME
+ _ZNK14QXmlAttributes9localNameEi @ 316 NONAME
+ _ZNK15QXmlInputSource4dataEv @ 317 NONAME
+ _ZNK16QDomDocumentType14internalSubsetEv @ 318 NONAME
+ _ZNK16QDomDocumentType4nameEv @ 319 NONAME
+ _ZNK16QDomDocumentType8entitiesEv @ 320 NONAME
+ _ZNK16QDomDocumentType8publicIdEv @ 321 NONAME
+ _ZNK16QDomDocumentType8systemIdEv @ 322 NONAME
+ _ZNK16QDomDocumentType9notationsEv @ 323 NONAME
+ _ZNK16QDomNamedNodeMap11namedItemNSERK7QStringS2_ @ 324 NONAME
+ _ZNK16QDomNamedNodeMap4itemEi @ 325 NONAME
+ _ZNK16QDomNamedNodeMap6lengthEv @ 326 NONAME
+ _ZNK16QDomNamedNodeMap8containsERK7QString @ 327 NONAME
+ _ZNK16QDomNamedNodeMap9namedItemERK7QString @ 328 NONAME
+ _ZNK16QDomNamedNodeMapeqERKS_ @ 329 NONAME
+ _ZNK16QDomNamedNodeMapneERKS_ @ 330 NONAME
+ _ZNK16QXmlSimpleReader10DTDHandlerEv @ 331 NONAME
+ _ZNK16QXmlSimpleReader10hasFeatureERK7QString @ 332 NONAME
+ _ZNK16QXmlSimpleReader11declHandlerEv @ 333 NONAME
+ _ZNK16QXmlSimpleReader11hasPropertyERK7QString @ 334 NONAME
+ _ZNK16QXmlSimpleReader12errorHandlerEv @ 335 NONAME
+ _ZNK16QXmlSimpleReader14contentHandlerEv @ 336 NONAME
+ _ZNK16QXmlSimpleReader14entityResolverEv @ 337 NONAME
+ _ZNK16QXmlSimpleReader14lexicalHandlerEv @ 338 NONAME
+ _ZNK16QXmlSimpleReader7featureERK7QStringPb @ 339 NONAME
+ _ZNK16QXmlSimpleReader8propertyERK7QStringPb @ 340 NONAME
+ _ZNK17QDomCharacterData4dataEv @ 341 NONAME
+ _ZNK17QDomCharacterData6lengthEv @ 342 NONAME
+ _ZNK17QDomCharacterData8nodeTypeEv @ 343 NONAME
+ _ZNK18QDomImplementation10hasFeatureERK7QStringS2_ @ 344 NONAME
+ _ZNK18QDomImplementationeqERKS_ @ 345 NONAME
+ _ZNK18QDomImplementationneERKS_ @ 346 NONAME
+ _ZNK18QXmlDefaultHandler11errorStringEv @ 347 NONAME
+ _ZNK18QXmlParseException10lineNumberEv @ 348 NONAME
+ _ZNK18QXmlParseException12columnNumberEv @ 349 NONAME
+ _ZNK18QXmlParseException7messageEv @ 350 NONAME
+ _ZNK18QXmlParseException8publicIdEv @ 351 NONAME
+ _ZNK18QXmlParseException8systemIdEv @ 352 NONAME
+ _ZNK20QXmlNamespaceSupport11processNameERK7QStringbRS0_S3_ @ 353 NONAME
+ _ZNK20QXmlNamespaceSupport3uriERK7QString @ 354 NONAME
+ _ZNK20QXmlNamespaceSupport6prefixERK7QString @ 355 NONAME
+ _ZNK20QXmlNamespaceSupport8prefixesERK7QString @ 356 NONAME
+ _ZNK20QXmlNamespaceSupport8prefixesEv @ 357 NONAME
+ _ZNK20QXmlNamespaceSupport9splitNameERK7QStringRS0_S3_ @ 358 NONAME
+ _ZNK25QDomProcessingInstruction4dataEv @ 359 NONAME
+ _ZNK25QDomProcessingInstruction6targetEv @ 360 NONAME
+ _ZNK8QDomAttr12ownerElementEv @ 361 NONAME
+ _ZNK8QDomAttr4nameEv @ 362 NONAME
+ _ZNK8QDomAttr5valueEv @ 363 NONAME
+ _ZNK8QDomAttr9specifiedEv @ 364 NONAME
+ _ZNK8QDomNode10attributesEv @ 365 NONAME
+ _ZNK8QDomNode10childNodesEv @ 366 NONAME
+ _ZNK8QDomNode10firstChildEv @ 367 NONAME
+ _ZNK8QDomNode10isDocumentEv @ 368 NONAME
+ _ZNK8QDomNode10isNotationEv @ 369 NONAME
+ _ZNK8QDomNode10lineNumberEv @ 370 NONAME
+ _ZNK8QDomNode10parentNodeEv @ 371 NONAME
+ _ZNK8QDomNode10toDocumentEv @ 372 NONAME
+ _ZNK8QDomNode10toNotationEv @ 373 NONAME
+ _ZNK8QDomNode11isSupportedERK7QStringS2_ @ 374 NONAME
+ _ZNK8QDomNode11nextSiblingEv @ 375 NONAME
+ _ZNK8QDomNode12columnNumberEv @ 376 NONAME
+ _ZNK8QDomNode12namespaceURIEv @ 377 NONAME
+ _ZNK8QDomNode13hasAttributesEv @ 378 NONAME
+ _ZNK8QDomNode13hasChildNodesEv @ 379 NONAME
+ _ZNK8QDomNode13ownerDocumentEv @ 380 NONAME
+ _ZNK8QDomNode14isCDATASectionEv @ 381 NONAME
+ _ZNK8QDomNode14isDocumentTypeEv @ 382 NONAME
+ _ZNK8QDomNode14toCDATASectionEv @ 383 NONAME
+ _ZNK8QDomNode14toDocumentTypeEv @ 384 NONAME
+ _ZNK8QDomNode15isCharacterDataEv @ 385 NONAME
+ _ZNK8QDomNode15previousSiblingEv @ 386 NONAME
+ _ZNK8QDomNode15toCharacterDataEv @ 387 NONAME
+ _ZNK8QDomNode16lastChildElementERK7QString @ 388 NONAME
+ _ZNK8QDomNode17firstChildElementERK7QString @ 389 NONAME
+ _ZNK8QDomNode17isEntityReferenceEv @ 390 NONAME
+ _ZNK8QDomNode17toEntityReferenceEv @ 391 NONAME
+ _ZNK8QDomNode18isDocumentFragmentEv @ 392 NONAME
+ _ZNK8QDomNode18nextSiblingElementERK7QString @ 393 NONAME
+ _ZNK8QDomNode18toDocumentFragmentEv @ 394 NONAME
+ _ZNK8QDomNode22previousSiblingElementERK7QString @ 395 NONAME
+ _ZNK8QDomNode23isProcessingInstructionEv @ 396 NONAME
+ _ZNK8QDomNode23toProcessingInstructionEv @ 397 NONAME
+ _ZNK8QDomNode4saveER11QTextStreami @ 398 NONAME
+ _ZNK8QDomNode4saveER11QTextStreamiNS_14EncodingPolicyE @ 399 NONAME
+ _ZNK8QDomNode6isAttrEv @ 400 NONAME
+ _ZNK8QDomNode6isNullEv @ 401 NONAME
+ _ZNK8QDomNode6isTextEv @ 402 NONAME
+ _ZNK8QDomNode6prefixEv @ 403 NONAME
+ _ZNK8QDomNode6toAttrEv @ 404 NONAME
+ _ZNK8QDomNode6toTextEv @ 405 NONAME
+ _ZNK8QDomNode8isEntityEv @ 406 NONAME
+ _ZNK8QDomNode8nodeNameEv @ 407 NONAME
+ _ZNK8QDomNode8nodeTypeEv @ 408 NONAME
+ _ZNK8QDomNode8toEntityEv @ 409 NONAME
+ _ZNK8QDomNode9cloneNodeEb @ 410 NONAME
+ _ZNK8QDomNode9isCommentEv @ 411 NONAME
+ _ZNK8QDomNode9isElementEv @ 412 NONAME
+ _ZNK8QDomNode9lastChildEv @ 413 NONAME
+ _ZNK8QDomNode9localNameEv @ 414 NONAME
+ _ZNK8QDomNode9namedItemERK7QString @ 415 NONAME
+ _ZNK8QDomNode9nodeValueEv @ 416 NONAME
+ _ZNK8QDomNode9toCommentEv @ 417 NONAME
+ _ZNK8QDomNode9toElementEv @ 418 NONAME
+ _ZNK8QDomNodeeqERKS_ @ 419 NONAME
+ _ZNK8QDomNodeneERKS_ @ 420 NONAME
+ _ZTI10QXmlReader @ 421 NONAME
+ _ZTI11QXmlLocator @ 422 NONAME
+ _ZTI14QXmlAttributes @ 423 NONAME
+ _ZTI14QXmlDTDHandler @ 424 NONAME
+ _ZTI15QXmlDeclHandler @ 425 NONAME
+ _ZTI15QXmlInputSource @ 426 NONAME
+ _ZTI16QXmlErrorHandler @ 427 NONAME
+ _ZTI16QXmlSimpleReader @ 428 NONAME
+ _ZTI18QXmlContentHandler @ 429 NONAME
+ _ZTI18QXmlDefaultHandler @ 430 NONAME
+ _ZTI18QXmlEntityResolver @ 431 NONAME
+ _ZTI18QXmlLexicalHandler @ 432 NONAME
+ _ZTV11QXmlLocator @ 433 NONAME
+ _ZTV14QXmlAttributes @ 434 NONAME
+ _ZTV15QXmlInputSource @ 435 NONAME
+ _ZTV16QXmlSimpleReader @ 436 NONAME
+ _ZTV18QXmlDefaultHandler @ 437 NONAME
+ _ZThn12_N18QXmlDefaultHandler13resolveEntityERK7QStringS2_RP15QXmlInputSource @ 438 NONAME
+ _ZThn12_NK18QXmlDefaultHandler11errorStringEv @ 439 NONAME
+ _ZThn16_N18QXmlDefaultHandler10startCDATAEv @ 440 NONAME
+ _ZThn16_N18QXmlDefaultHandler11startEntityERK7QString @ 441 NONAME
+ _ZThn16_N18QXmlDefaultHandler6endDTDEv @ 442 NONAME
+ _ZThn16_N18QXmlDefaultHandler7commentERK7QString @ 443 NONAME
+ _ZThn16_N18QXmlDefaultHandler8endCDATAEv @ 444 NONAME
+ _ZThn16_N18QXmlDefaultHandler8startDTDERK7QStringS2_S2_ @ 445 NONAME
+ _ZThn16_N18QXmlDefaultHandler9endEntityERK7QString @ 446 NONAME
+ _ZThn16_NK18QXmlDefaultHandler11errorStringEv @ 447 NONAME
+ _ZThn20_N18QXmlDefaultHandler13attributeDeclERK7QStringS2_S2_S2_S2_ @ 448 NONAME
+ _ZThn20_N18QXmlDefaultHandler18externalEntityDeclERK7QStringS2_S2_ @ 449 NONAME
+ _ZThn20_N18QXmlDefaultHandler18internalEntityDeclERK7QStringS2_ @ 450 NONAME
+ _ZThn20_NK18QXmlDefaultHandler11errorStringEv @ 451 NONAME
+ _ZThn4_N18QXmlDefaultHandler10fatalErrorERK18QXmlParseException @ 452 NONAME
+ _ZThn4_N18QXmlDefaultHandler5errorERK18QXmlParseException @ 453 NONAME
+ _ZThn4_N18QXmlDefaultHandler7warningERK18QXmlParseException @ 454 NONAME
+ _ZThn4_NK18QXmlDefaultHandler11errorStringEv @ 455 NONAME
+ _ZThn8_N18QXmlDefaultHandler12notationDeclERK7QStringS2_S2_ @ 456 NONAME
+ _ZThn8_N18QXmlDefaultHandler18unparsedEntityDeclERK7QStringS2_S2_S2_ @ 457 NONAME
+ _ZThn8_NK18QXmlDefaultHandler11errorStringEv @ 458 NONAME
+ _ZlsR11QTextStreamRK8QDomNode @ 459 NONAME
diff --git a/src/s60installs/eabi/phononu.def b/src/s60installs/eabi/phononu.def
index d70942c..af1e3cc 100644
--- a/src/s60installs/eabi/phononu.def
+++ b/src/s60installs/eabi/phononu.def
@@ -9,565 +9,539 @@ EXPORTS
_ZN6Phonon10SeekSlider14setMediaObjectEPNS_11MediaObjectE @ 8 NONAME
_ZN6Phonon10SeekSlider14setOrientationEN2Qt11OrientationE @ 9 NONAME
_ZN6Phonon10SeekSlider16staticMetaObjectE @ 10 NONAME DATA 16
- _ZN6Phonon10SeekSliderC1EP7QWidget @ 11 NONAME
- _ZN6Phonon10SeekSliderC1EPNS_11MediaObjectEP7QWidget @ 12 NONAME
- _ZN6Phonon10SeekSliderC2EP7QWidget @ 13 NONAME
- _ZN6Phonon10SeekSliderC2EPNS_11MediaObjectEP7QWidget @ 14 NONAME
- _ZN6Phonon10SeekSliderD0Ev @ 15 NONAME
- _ZN6Phonon10SeekSliderD1Ev @ 16 NONAME
- _ZN6Phonon10SeekSliderD2Ev @ 17 NONAME
- _ZN6Phonon10createPathEPNS_9MediaNodeES1_ @ 18 NONAME
- _ZN6Phonon11AudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 19 NONAME
- _ZN6Phonon11AudioOutput11qt_metacastEPKc @ 20 NONAME
- _ZN6Phonon11AudioOutput12mutedChangedEb @ 21 NONAME
- _ZN6Phonon11AudioOutput13volumeChangedEf @ 22 NONAME
- _ZN6Phonon11AudioOutput15setOutputDeviceERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 23 NONAME
- _ZN6Phonon11AudioOutput16setVolumeDecibelEf @ 24 NONAME
- _ZN6Phonon11AudioOutput16staticMetaObjectE @ 25 NONAME DATA 16
- _ZN6Phonon11AudioOutput19outputDeviceChangedERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 26 NONAME
- _ZN6Phonon11AudioOutput7setNameERK7QString @ 27 NONAME
- _ZN6Phonon11AudioOutput8setMutedEb @ 28 NONAME
- _ZN6Phonon11AudioOutput9setVolumeEf @ 29 NONAME
- _ZN6Phonon11AudioOutputC1ENS_8CategoryEP7QObject @ 30 NONAME
- _ZN6Phonon11AudioOutputC1EP7QObject @ 31 NONAME
- _ZN6Phonon11AudioOutputC2ENS_8CategoryEP7QObject @ 32 NONAME
- _ZN6Phonon11AudioOutputC2EP7QObject @ 33 NONAME
- _ZN6Phonon11MediaObject10clearQueueEv @ 34 NONAME
- _ZN6Phonon11MediaObject11qt_metacallEN11QMetaObject4CallEiPPv @ 35 NONAME
- _ZN6Phonon11MediaObject11qt_metacastEPKc @ 36 NONAME
- _ZN6Phonon11MediaObject12bufferStatusEi @ 37 NONAME
- _ZN6Phonon11MediaObject12stateChangedENS_5StateES1_ @ 38 NONAME
- _ZN6Phonon11MediaObject13aboutToFinishEv @ 39 NONAME
- _ZN6Phonon11MediaObject15hasVideoChangedEb @ 40 NONAME
- _ZN6Phonon11MediaObject15metaDataChangedEv @ 41 NONAME
- _ZN6Phonon11MediaObject15seekableChangedEb @ 42 NONAME
- _ZN6Phonon11MediaObject15setTickIntervalEi @ 43 NONAME
- _ZN6Phonon11MediaObject16setCurrentSourceERKNS_11MediaSourceE @ 44 NONAME
- _ZN6Phonon11MediaObject16setPrefinishMarkEi @ 45 NONAME
- _ZN6Phonon11MediaObject16staticMetaObjectE @ 46 NONAME DATA 16
- _ZN6Phonon11MediaObject16totalTimeChangedEx @ 47 NONAME
- _ZN6Phonon11MediaObject17setTransitionTimeEi @ 48 NONAME
- _ZN6Phonon11MediaObject20currentSourceChangedERKNS_11MediaSourceE @ 49 NONAME
- _ZN6Phonon11MediaObject20prefinishMarkReachedEi @ 50 NONAME
- _ZN6Phonon11MediaObject4playEv @ 51 NONAME
- _ZN6Phonon11MediaObject4seekEx @ 52 NONAME
- _ZN6Phonon11MediaObject4stopEv @ 53 NONAME
- _ZN6Phonon11MediaObject4tickEx @ 54 NONAME
- _ZN6Phonon11MediaObject5clearEv @ 55 NONAME
- _ZN6Phonon11MediaObject5pauseEv @ 56 NONAME
- _ZN6Phonon11MediaObject7enqueueERK5QListI4QUrlE @ 57 NONAME
- _ZN6Phonon11MediaObject7enqueueERK5QListINS_11MediaSourceEE @ 58 NONAME
- _ZN6Phonon11MediaObject7enqueueERKNS_11MediaSourceE @ 59 NONAME
- _ZN6Phonon11MediaObject8finishedEv @ 60 NONAME
- _ZN6Phonon11MediaObject8setQueueERK5QListI4QUrlE @ 61 NONAME
- _ZN6Phonon11MediaObject8setQueueERK5QListINS_11MediaSourceEE @ 62 NONAME
- _ZN6Phonon11MediaObjectC1EP7QObject @ 63 NONAME
- _ZN6Phonon11MediaObjectC2EP7QObject @ 64 NONAME
- _ZN6Phonon11MediaObjectD0Ev @ 65 NONAME
- _ZN6Phonon11MediaObjectD1Ev @ 66 NONAME
- _ZN6Phonon11MediaObjectD2Ev @ 67 NONAME
- _ZN6Phonon11MediaSource13setAutoDeleteEb @ 68 NONAME
- _ZN6Phonon11MediaSourceC1ENS_8DiscTypeERK7QString @ 69 NONAME
- _ZN6Phonon11MediaSourceC1EP9QIODevice @ 70 NONAME
- _ZN6Phonon11MediaSourceC1EPNS_19AbstractMediaStreamE @ 71 NONAME
- _ZN6Phonon11MediaSourceC1ERK4QUrl @ 72 NONAME
- _ZN6Phonon11MediaSourceC1ERK7QString @ 73 NONAME
- _ZN6Phonon11MediaSourceC1ERKS0_ @ 74 NONAME
- _ZN6Phonon11MediaSourceC1ERNS_18MediaSourcePrivateE @ 75 NONAME
- _ZN6Phonon11MediaSourceC1Ev @ 76 NONAME
- _ZN6Phonon11MediaSourceC2ENS_8DiscTypeERK7QString @ 77 NONAME
- _ZN6Phonon11MediaSourceC2EP9QIODevice @ 78 NONAME
- _ZN6Phonon11MediaSourceC2EPNS_19AbstractMediaStreamE @ 79 NONAME
- _ZN6Phonon11MediaSourceC2ERK4QUrl @ 80 NONAME
- _ZN6Phonon11MediaSourceC2ERK7QString @ 81 NONAME
- _ZN6Phonon11MediaSourceC2ERKS0_ @ 82 NONAME
- _ZN6Phonon11MediaSourceC2ERNS_18MediaSourcePrivateE @ 83 NONAME
- _ZN6Phonon11MediaSourceC2Ev @ 84 NONAME
- _ZN6Phonon11MediaSourceD1Ev @ 85 NONAME
- _ZN6Phonon11MediaSourceD2Ev @ 86 NONAME
- _ZN6Phonon11MediaSourceaSERKS0_ @ 87 NONAME
- _ZN6Phonon11VideoPlayer11qt_metacallEN11QMetaObject4CallEiPPv @ 88 NONAME
- _ZN6Phonon11VideoPlayer11qt_metacastEPKc @ 89 NONAME
- _ZN6Phonon11VideoPlayer16staticMetaObjectE @ 90 NONAME DATA 16
- _ZN6Phonon11VideoPlayer4loadERKNS_11MediaSourceE @ 91 NONAME
- _ZN6Phonon11VideoPlayer4playERKNS_11MediaSourceE @ 92 NONAME
- _ZN6Phonon11VideoPlayer4playEv @ 93 NONAME
- _ZN6Phonon11VideoPlayer4seekEx @ 94 NONAME
- _ZN6Phonon11VideoPlayer4stopEv @ 95 NONAME
- _ZN6Phonon11VideoPlayer5pauseEv @ 96 NONAME
- _ZN6Phonon11VideoPlayer8finishedEv @ 97 NONAME
- _ZN6Phonon11VideoPlayer9setVolumeEf @ 98 NONAME
- _ZN6Phonon11VideoPlayerC1ENS_8CategoryEP7QWidget @ 99 NONAME
- _ZN6Phonon11VideoPlayerC1EP7QWidget @ 100 NONAME
- _ZN6Phonon11VideoPlayerC2ENS_8CategoryEP7QWidget @ 101 NONAME
- _ZN6Phonon11VideoPlayerC2EP7QWidget @ 102 NONAME
- _ZN6Phonon11VideoPlayerD0Ev @ 103 NONAME
- _ZN6Phonon11VideoPlayerD1Ev @ 104 NONAME
- _ZN6Phonon11VideoPlayerD2Ev @ 105 NONAME
- _ZN6Phonon11VideoWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 106 NONAME
- _ZN6Phonon11VideoWidget11qt_metacastEPKc @ 107 NONAME
- _ZN6Phonon11VideoWidget11setContrastEf @ 108 NONAME
- _ZN6Phonon11VideoWidget12setScaleModeENS0_9ScaleModeE @ 109 NONAME
- _ZN6Phonon11VideoWidget13setBrightnessEf @ 110 NONAME
- _ZN6Phonon11VideoWidget13setFullScreenEb @ 111 NONAME
- _ZN6Phonon11VideoWidget13setSaturationEf @ 112 NONAME
- _ZN6Phonon11VideoWidget14exitFullScreenEv @ 113 NONAME
- _ZN6Phonon11VideoWidget14mouseMoveEventEP11QMouseEvent @ 114 NONAME
- _ZN6Phonon11VideoWidget14setAspectRatioENS0_11AspectRatioE @ 115 NONAME
- _ZN6Phonon11VideoWidget15enterFullScreenEv @ 116 NONAME
- _ZN6Phonon11VideoWidget16staticMetaObjectE @ 117 NONAME DATA 16
- _ZN6Phonon11VideoWidget5eventEP6QEvent @ 118 NONAME
- _ZN6Phonon11VideoWidget6setHueEf @ 119 NONAME
- _ZN6Phonon11VideoWidgetC1EP7QWidget @ 120 NONAME
- _ZN6Phonon11VideoWidgetC1ERNS_18VideoWidgetPrivateEP7QWidget @ 121 NONAME
- _ZN6Phonon11VideoWidgetC2EP7QWidget @ 122 NONAME
- _ZN6Phonon11VideoWidgetC2ERNS_18VideoWidgetPrivateEP7QWidget @ 123 NONAME
- _ZN6Phonon12EffectWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 124 NONAME
- _ZN6Phonon12EffectWidget11qt_metacastEPKc @ 125 NONAME
- _ZN6Phonon12EffectWidget16staticMetaObjectE @ 126 NONAME DATA 16
- _ZN6Phonon12EffectWidgetC1EPNS_6EffectEP7QWidget @ 127 NONAME
- _ZN6Phonon12EffectWidgetC2EPNS_6EffectEP7QWidget @ 128 NONAME
- _ZN6Phonon12EffectWidgetD0Ev @ 129 NONAME
- _ZN6Phonon12EffectWidgetD1Ev @ 130 NONAME
- _ZN6Phonon12EffectWidgetD2Ev @ 131 NONAME
- _ZN6Phonon12GlobalConfigC1Ev @ 132 NONAME
- _ZN6Phonon12GlobalConfigC2Ev @ 133 NONAME
- _ZN6Phonon12GlobalConfigD0Ev @ 134 NONAME
- _ZN6Phonon12GlobalConfigD1Ev @ 135 NONAME
- _ZN6Phonon12GlobalConfigD2Ev @ 136 NONAME
- _ZN6Phonon12VolumeSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 137 NONAME
- _ZN6Phonon12VolumeSlider11qt_metacastEPKc @ 138 NONAME
- _ZN6Phonon12VolumeSlider11setIconSizeERK5QSize @ 139 NONAME
- _ZN6Phonon12VolumeSlider11setPageStepEi @ 140 NONAME
- _ZN6Phonon12VolumeSlider11setTrackingEb @ 141 NONAME
- _ZN6Phonon12VolumeSlider13setSingleStepEi @ 142 NONAME
- _ZN6Phonon12VolumeSlider14setAudioOutputEPNS_11AudioOutputE @ 143 NONAME
- _ZN6Phonon12VolumeSlider14setMuteVisibleEb @ 144 NONAME
- _ZN6Phonon12VolumeSlider14setOrientationEN2Qt11OrientationE @ 145 NONAME
- _ZN6Phonon12VolumeSlider16setMaximumVolumeEf @ 146 NONAME
- _ZN6Phonon12VolumeSlider16staticMetaObjectE @ 147 NONAME DATA 16
- _ZN6Phonon12VolumeSliderC1EP7QWidget @ 148 NONAME
- _ZN6Phonon12VolumeSliderC1EPNS_11AudioOutputEP7QWidget @ 149 NONAME
- _ZN6Phonon12VolumeSliderC2EP7QWidget @ 150 NONAME
- _ZN6Phonon12VolumeSliderC2EPNS_11AudioOutputEP7QWidget @ 151 NONAME
- _ZN6Phonon12VolumeSliderD0Ev @ 152 NONAME
- _ZN6Phonon12VolumeSliderD1Ev @ 153 NONAME
- _ZN6Phonon12VolumeSliderD2Ev @ 154 NONAME
- _ZN6Phonon12createPlayerENS_8CategoryERKNS_11MediaSourceE @ 155 NONAME
- _ZN6Phonon13phononVersionEv @ 156 NONAME
- _ZN6Phonon15EffectParameterC1ERKS0_ @ 157 NONAME
- _ZN6Phonon15EffectParameterC1EiRK7QString6QFlagsINS0_4HintEERK8QVariantS9_S9_RK5QListIS7_ES3_ @ 158 NONAME
- _ZN6Phonon15EffectParameterC1Ev @ 159 NONAME
- _ZN6Phonon15EffectParameterC2ERKS0_ @ 160 NONAME
- _ZN6Phonon15EffectParameterC2EiRK7QString6QFlagsINS0_4HintEERK8QVariantS9_S9_RK5QListIS7_ES3_ @ 161 NONAME
- _ZN6Phonon15EffectParameterC2Ev @ 162 NONAME
- _ZN6Phonon15EffectParameterD1Ev @ 163 NONAME
- _ZN6Phonon15EffectParameterD2Ev @ 164 NONAME
- _ZN6Phonon15EffectParameteraSERKS0_ @ 165 NONAME
- _ZN6Phonon15MediaController11qt_metacallEN11QMetaObject4CallEiPPv @ 166 NONAME
- _ZN6Phonon15MediaController11qt_metacastEPKc @ 167 NONAME
- _ZN6Phonon15MediaController12angleChangedEi @ 168 NONAME
- _ZN6Phonon15MediaController12titleChangedEi @ 169 NONAME
- _ZN6Phonon15MediaController13previousTitleEv @ 170 NONAME
- _ZN6Phonon15MediaController14chapterChangedEi @ 171 NONAME
- _ZN6Phonon15MediaController15setCurrentAngleEi @ 172 NONAME
- _ZN6Phonon15MediaController15setCurrentTitleEi @ 173 NONAME
- _ZN6Phonon15MediaController16staticMetaObjectE @ 174 NONAME DATA 16
- _ZN6Phonon15MediaController17setAutoplayTitlesEb @ 175 NONAME
- _ZN6Phonon15MediaController17setCurrentChapterEi @ 176 NONAME
- _ZN6Phonon15MediaController18setCurrentSubtitleERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE3EEE @ 177 NONAME
- _ZN6Phonon15MediaController22availableAnglesChangedEi @ 178 NONAME
- _ZN6Phonon15MediaController22availableTitlesChangedEi @ 179 NONAME
- _ZN6Phonon15MediaController22setCurrentAudioChannelERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE2EEE @ 180 NONAME
- _ZN6Phonon15MediaController24availableChaptersChangedEi @ 181 NONAME
- _ZN6Phonon15MediaController25availableSubtitlesChangedEv @ 182 NONAME
- _ZN6Phonon15MediaController29availableAudioChannelsChangedEv @ 183 NONAME
- _ZN6Phonon15MediaController9nextTitleEv @ 184 NONAME
- _ZN6Phonon15MediaControllerC1EPNS_11MediaObjectE @ 185 NONAME
- _ZN6Phonon15MediaControllerC2EPNS_11MediaObjectE @ 186 NONAME
- _ZN6Phonon15MediaControllerD0Ev @ 187 NONAME
- _ZN6Phonon15MediaControllerD1Ev @ 188 NONAME
- _ZN6Phonon15MediaControllerD2Ev @ 189 NONAME
- _ZN6Phonon15StreamInterface10enoughDataEv @ 190 NONAME
- _ZN6Phonon15StreamInterface10seekStreamEx @ 191 NONAME
- _ZN6Phonon15StreamInterface15connectToSourceERKNS_11MediaSourceE @ 192 NONAME
- _ZN6Phonon15StreamInterface5resetEv @ 193 NONAME
- _ZN6Phonon15StreamInterface8needDataEv @ 194 NONAME
- _ZN6Phonon15StreamInterfaceC2Ev @ 195 NONAME
- _ZN6Phonon15StreamInterfaceD0Ev @ 196 NONAME
- _ZN6Phonon15StreamInterfaceD1Ev @ 197 NONAME
- _ZN6Phonon15StreamInterfaceD2Ev @ 198 NONAME
- _ZN6Phonon16MediaNodePrivate12addInputPathERKNS_4PathE @ 199 NONAME
- _ZN6Phonon16MediaNodePrivate13addOutputPathERKNS_4PathE @ 200 NONAME
- _ZN6Phonon16MediaNodePrivate13backendObjectEv @ 201 NONAME
- _ZN6Phonon16MediaNodePrivate15removeInputPathERKNS_4PathE @ 202 NONAME
- _ZN6Phonon16MediaNodePrivate16removeOutputPathERKNS_4PathE @ 203 NONAME
- _ZN6Phonon16MediaNodePrivate19deleteBackendObjectEv @ 204 NONAME
- _ZN6Phonon16MediaNodePrivate21addDestructionHandlerEPNS_27MediaNodeDestructionHandlerE @ 205 NONAME
- _ZN6Phonon16MediaNodePrivate24removeDestructionHandlerEPNS_27MediaNodeDestructionHandlerE @ 206 NONAME
- _ZN6Phonon16MediaNodePrivateC2ENS0_6CastIdE @ 207 NONAME
- _ZN6Phonon16MediaNodePrivateD0Ev @ 208 NONAME
- _ZN6Phonon16MediaNodePrivateD1Ev @ 209 NONAME
- _ZN6Phonon16MediaNodePrivateD2Ev @ 210 NONAME
- _ZN6Phonon16categoryToStringENS_8CategoryE @ 211 NONAME
- _ZN6Phonon17VolumeFaderEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 212 NONAME
- _ZN6Phonon17VolumeFaderEffect11qt_metacastEPKc @ 213 NONAME
- _ZN6Phonon17VolumeFaderEffect12setFadeCurveENS0_9FadeCurveE @ 214 NONAME
- _ZN6Phonon17VolumeFaderEffect16setVolumeDecibelEd @ 215 NONAME
- _ZN6Phonon17VolumeFaderEffect16staticMetaObjectE @ 216 NONAME DATA 16
- _ZN6Phonon17VolumeFaderEffect6fadeInEi @ 217 NONAME
- _ZN6Phonon17VolumeFaderEffect6fadeToEfi @ 218 NONAME
- _ZN6Phonon17VolumeFaderEffect7fadeOutEi @ 219 NONAME
- _ZN6Phonon17VolumeFaderEffect9setVolumeEf @ 220 NONAME
- _ZN6Phonon17VolumeFaderEffectC1EP7QObject @ 221 NONAME
- _ZN6Phonon17VolumeFaderEffectC2EP7QObject @ 222 NONAME
- _ZN6Phonon18MediaObjectPrivate15_k_stateChangedENS_5StateES1_ @ 223 NONAME
- _ZN6Phonon18MediaObjectPrivate18setupBackendObjectEv @ 224 NONAME
- _ZN6Phonon18MediaSourcePrivate9setStreamEPNS_19AbstractMediaStreamE @ 225 NONAME
- _ZN6Phonon18MediaSourcePrivateD0Ev @ 226 NONAME
- _ZN6Phonon18MediaSourcePrivateD1Ev @ 227 NONAME
- _ZN6Phonon18MediaSourcePrivateD2Ev @ 228 NONAME
- _ZN6Phonon19AbstractAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 229 NONAME
- _ZN6Phonon19AbstractAudioOutput11qt_metacastEPKc @ 230 NONAME
- _ZN6Phonon19AbstractAudioOutput16staticMetaObjectE @ 231 NONAME DATA 16
- _ZN6Phonon19AbstractAudioOutputC1ERNS_26AbstractAudioOutputPrivateEP7QObject @ 232 NONAME
- _ZN6Phonon19AbstractAudioOutputC2ERNS_26AbstractAudioOutputPrivateEP7QObject @ 233 NONAME
- _ZN6Phonon19AbstractAudioOutputD0Ev @ 234 NONAME
- _ZN6Phonon19AbstractAudioOutputD1Ev @ 235 NONAME
- _ZN6Phonon19AbstractAudioOutputD2Ev @ 236 NONAME
- _ZN6Phonon19AbstractMediaStream10enoughDataEv @ 237 NONAME
- _ZN6Phonon19AbstractMediaStream10seekStreamEx @ 238 NONAME
- _ZN6Phonon19AbstractMediaStream11qt_metacallEN11QMetaObject4CallEiPPv @ 239 NONAME
- _ZN6Phonon19AbstractMediaStream11qt_metacastEPKc @ 240 NONAME
- _ZN6Phonon19AbstractMediaStream13setStreamSizeEx @ 241 NONAME
- _ZN6Phonon19AbstractMediaStream16staticMetaObjectE @ 242 NONAME DATA 16
- _ZN6Phonon19AbstractMediaStream17setStreamSeekableEb @ 243 NONAME
- _ZN6Phonon19AbstractMediaStream5errorENS_9ErrorTypeERK7QString @ 244 NONAME
- _ZN6Phonon19AbstractMediaStream9endOfDataEv @ 245 NONAME
- _ZN6Phonon19AbstractMediaStream9writeDataERK10QByteArray @ 246 NONAME
- _ZN6Phonon19AbstractMediaStreamC2EP7QObject @ 247 NONAME
- _ZN6Phonon19AbstractMediaStreamC2ERNS_26AbstractMediaStreamPrivateEP7QObject @ 248 NONAME
- _ZN6Phonon19AbstractMediaStreamD0Ev @ 249 NONAME
- _ZN6Phonon19AbstractMediaStreamD1Ev @ 250 NONAME
- _ZN6Phonon19AbstractMediaStreamD2Ev @ 251 NONAME
- _ZN6Phonon19AbstractVideoOutputC1ERNS_26AbstractVideoOutputPrivateE @ 252 NONAME
- _ZN6Phonon19AbstractVideoOutputC2ERNS_26AbstractVideoOutputPrivateE @ 253 NONAME
- _ZN6Phonon19BackendCapabilities18availableMimeTypesEv @ 254 NONAME
- _ZN6Phonon19BackendCapabilities19isMimeTypeAvailableERK7QString @ 255 NONAME
- _ZN6Phonon19BackendCapabilities21availableAudioEffectsEv @ 256 NONAME
- _ZN6Phonon19BackendCapabilities27availableAudioOutputDevicesEv @ 257 NONAME
- _ZN6Phonon19BackendCapabilities28availableAudioCaptureDevicesEv @ 258 NONAME
- _ZN6Phonon19BackendCapabilities8notifierEv @ 259 NONAME
- _ZN6Phonon21ObjectDescriptionData9fromIndexENS_21ObjectDescriptionTypeEi @ 260 NONAME
- _ZN6Phonon21ObjectDescriptionDataC1EPNS_24ObjectDescriptionPrivateE @ 261 NONAME
- _ZN6Phonon21ObjectDescriptionDataC1EiRK5QHashI10QByteArray8QVariantE @ 262 NONAME
- _ZN6Phonon21ObjectDescriptionDataC2EPNS_24ObjectDescriptionPrivateE @ 263 NONAME
- _ZN6Phonon21ObjectDescriptionDataC2EiRK5QHashI10QByteArray8QVariantE @ 264 NONAME
- _ZN6Phonon21ObjectDescriptionDataD1Ev @ 265 NONAME
- _ZN6Phonon21ObjectDescriptionDataD2Ev @ 266 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE11qt_metacastEPKc @ 267 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE16staticMetaObjectE @ 268 NONAME DATA 16
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE11qt_metacastEPKc @ 269 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE16staticMetaObjectE @ 270 NONAME DATA 16
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE11qt_metacastEPKc @ 271 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE16staticMetaObjectE @ 272 NONAME DATA 16
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE11qt_metacastEPKc @ 273 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE16staticMetaObjectE @ 274 NONAME DATA 16
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE11qt_metacastEPKc @ 275 NONAME
- _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE16staticMetaObjectE @ 276 NONAME DATA 16
- _ZN6Phonon26AbstractMediaStreamPrivate13setStreamSizeEx @ 277 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate17setStreamSeekableEb @ 278 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate18setStreamInterfaceEPNS_15StreamInterfaceE @ 279 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate21phononObjectDestroyedEPNS_16MediaNodePrivateE @ 280 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate21setMediaObjectPrivateEPNS_18MediaObjectPrivateE @ 281 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate9endOfDataEv @ 282 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivate9writeDataERK10QByteArray @ 283 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivateD0Ev @ 284 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivateD1Ev @ 285 NONAME
- _ZN6Phonon26AbstractMediaStreamPrivateD2Ev @ 286 NONAME
- _ZN6Phonon26ObjectDescriptionModelData10removeRowsEiiRK11QModelIndex @ 287 NONAME
- _ZN6Phonon26ObjectDescriptionModelData12dropMimeDataENS_21ObjectDescriptionTypeEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 288 NONAME
- _ZN6Phonon26ObjectDescriptionModelData12setModelDataERK5QListI28QExplicitlySharedDataPointerINS_21ObjectDescriptionDataEEE @ 289 NONAME
- _ZN6Phonon26ObjectDescriptionModelData6moveUpERK11QModelIndex @ 290 NONAME
- _ZN6Phonon26ObjectDescriptionModelData8moveDownERK11QModelIndex @ 291 NONAME
- _ZN6Phonon26ObjectDescriptionModelDataC1EP18QAbstractListModel @ 292 NONAME
- _ZN6Phonon26ObjectDescriptionModelDataC2EP18QAbstractListModel @ 293 NONAME
- _ZN6Phonon26ObjectDescriptionModelDataD1Ev @ 294 NONAME
- _ZN6Phonon26ObjectDescriptionModelDataD2Ev @ 295 NONAME
- _ZN6Phonon4Path10disconnectEv @ 296 NONAME
- _ZN6Phonon4Path12insertEffectEPNS_6EffectES2_ @ 297 NONAME
- _ZN6Phonon4Path12insertEffectERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEPNS_6EffectE @ 298 NONAME
- _ZN6Phonon4Path12removeEffectEPNS_6EffectE @ 299 NONAME
- _ZN6Phonon4Path9reconnectEPNS_9MediaNodeES2_ @ 300 NONAME
- _ZN6Phonon4PathC1ERKS0_ @ 301 NONAME
- _ZN6Phonon4PathC1Ev @ 302 NONAME
- _ZN6Phonon4PathC2ERKS0_ @ 303 NONAME
- _ZN6Phonon4PathC2Ev @ 304 NONAME
- _ZN6Phonon4PathD1Ev @ 305 NONAME
- _ZN6Phonon4PathD2Ev @ 306 NONAME
- _ZN6Phonon4PathaSERKS0_ @ 307 NONAME
- _ZN6Phonon5qHashERKNS_15EffectParameterE @ 308 NONAME
- _ZN6Phonon6Effect11qt_metacallEN11QMetaObject4CallEiPPv @ 309 NONAME
- _ZN6Phonon6Effect11qt_metacastEPKc @ 310 NONAME
- _ZN6Phonon6Effect16staticMetaObjectE @ 311 NONAME DATA 16
- _ZN6Phonon6Effect17setParameterValueERKNS_15EffectParameterERK8QVariant @ 312 NONAME
- _ZN6Phonon6EffectC1ERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEP7QObject @ 313 NONAME
- _ZN6Phonon6EffectC1ERNS_13EffectPrivateEP7QObject @ 314 NONAME
- _ZN6Phonon6EffectC2ERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEP7QObject @ 315 NONAME
- _ZN6Phonon6EffectC2ERNS_13EffectPrivateEP7QObject @ 316 NONAME
- _ZN6Phonon6EffectD0Ev @ 317 NONAME
- _ZN6Phonon6EffectD1Ev @ 318 NONAME
- _ZN6Phonon6EffectD2Ev @ 319 NONAME
- _ZN6Phonon7Factory10setBackendEP7QObject @ 320 NONAME
- _ZN6Phonon7Factory11backendNameEv @ 321 NONAME
- _ZN6Phonon7Factory14platformPluginEv @ 322 NONAME
- _ZN6Phonon7Factory15registerQObjectEP7QObject @ 323 NONAME
- _ZN6Phonon7Factory22registerFrontendObjectEPNS_16MediaNodePrivateE @ 324 NONAME
- _ZN6Phonon7Factory24deregisterFrontendObjectEPNS_16MediaNodePrivateE @ 325 NONAME
- _ZN6Phonon7Factory6senderEv @ 326 NONAME
- _ZN6Phonon7Factory7backendEb @ 327 NONAME
- _ZN6Phonon9MediaNodeC1ERNS_16MediaNodePrivateE @ 328 NONAME
- _ZN6Phonon9MediaNodeC2ERNS_16MediaNodePrivateE @ 329 NONAME
- _ZN6Phonon9MediaNodeD0Ev @ 330 NONAME
- _ZN6Phonon9MediaNodeD1Ev @ 331 NONAME
- _ZN6Phonon9MediaNodeD2Ev @ 332 NONAME
- _ZNK6Phonon10SeekSlider10metaObjectEv @ 333 NONAME
- _ZNK6Phonon10SeekSlider10singleStepEv @ 334 NONAME
- _ZNK6Phonon10SeekSlider11hasTrackingEv @ 335 NONAME
- _ZNK6Phonon10SeekSlider11mediaObjectEv @ 336 NONAME
- _ZNK6Phonon10SeekSlider11orientationEv @ 337 NONAME
- _ZNK6Phonon10SeekSlider13isIconVisibleEv @ 338 NONAME
- _ZNK6Phonon10SeekSlider8iconSizeEv @ 339 NONAME
- _ZNK6Phonon10SeekSlider8pageStepEv @ 340 NONAME
- _ZNK6Phonon11AudioOutput10metaObjectEv @ 341 NONAME
- _ZNK6Phonon11AudioOutput12outputDeviceEv @ 342 NONAME
- _ZNK6Phonon11AudioOutput13volumeDecibelEv @ 343 NONAME
- _ZNK6Phonon11AudioOutput4nameEv @ 344 NONAME
- _ZNK6Phonon11AudioOutput6volumeEv @ 345 NONAME
- _ZNK6Phonon11AudioOutput7isMutedEv @ 346 NONAME
- _ZNK6Phonon11AudioOutput8categoryEv @ 347 NONAME
- _ZNK6Phonon11MediaObject10isSeekableEv @ 348 NONAME
- _ZNK6Phonon11MediaObject10metaObjectEv @ 349 NONAME
- _ZNK6Phonon11MediaObject11currentTimeEv @ 350 NONAME
- _ZNK6Phonon11MediaObject11errorStringEv @ 351 NONAME
- _ZNK6Phonon11MediaObject12tickIntervalEv @ 352 NONAME
- _ZNK6Phonon11MediaObject13currentSourceEv @ 353 NONAME
- _ZNK6Phonon11MediaObject13prefinishMarkEv @ 354 NONAME
- _ZNK6Phonon11MediaObject13remainingTimeEv @ 355 NONAME
- _ZNK6Phonon11MediaObject14transitionTimeEv @ 356 NONAME
- _ZNK6Phonon11MediaObject5queueEv @ 357 NONAME
- _ZNK6Phonon11MediaObject5stateEv @ 358 NONAME
- _ZNK6Phonon11MediaObject8hasVideoEv @ 359 NONAME
- _ZNK6Phonon11MediaObject8metaDataENS_8MetaDataE @ 360 NONAME
- _ZNK6Phonon11MediaObject8metaDataERK7QString @ 361 NONAME
- _ZNK6Phonon11MediaObject8metaDataEv @ 362 NONAME
- _ZNK6Phonon11MediaObject9errorTypeEv @ 363 NONAME
- _ZNK6Phonon11MediaObject9totalTimeEv @ 364 NONAME
- _ZNK6Phonon11MediaSource10autoDeleteEv @ 365 NONAME
- _ZNK6Phonon11MediaSource10deviceNameEv @ 366 NONAME
- _ZNK6Phonon11MediaSource3urlEv @ 367 NONAME
- _ZNK6Phonon11MediaSource4typeEv @ 368 NONAME
- _ZNK6Phonon11MediaSource6streamEv @ 369 NONAME
- _ZNK6Phonon11MediaSource8discTypeEv @ 370 NONAME
- _ZNK6Phonon11MediaSource8fileNameEv @ 371 NONAME
- _ZNK6Phonon11MediaSourceeqERKS0_ @ 372 NONAME
- _ZNK6Phonon11VideoPlayer10metaObjectEv @ 373 NONAME
- _ZNK6Phonon11VideoPlayer11audioOutputEv @ 374 NONAME
- _ZNK6Phonon11VideoPlayer11currentTimeEv @ 375 NONAME
- _ZNK6Phonon11VideoPlayer11mediaObjectEv @ 376 NONAME
- _ZNK6Phonon11VideoPlayer11videoWidgetEv @ 377 NONAME
- _ZNK6Phonon11VideoPlayer6volumeEv @ 378 NONAME
- _ZNK6Phonon11VideoPlayer8isPausedEv @ 379 NONAME
- _ZNK6Phonon11VideoPlayer9isPlayingEv @ 380 NONAME
- _ZNK6Phonon11VideoPlayer9totalTimeEv @ 381 NONAME
- _ZNK6Phonon11VideoWidget10brightnessEv @ 382 NONAME
- _ZNK6Phonon11VideoWidget10metaObjectEv @ 383 NONAME
- _ZNK6Phonon11VideoWidget10saturationEv @ 384 NONAME
- _ZNK6Phonon11VideoWidget11aspectRatioEv @ 385 NONAME
- _ZNK6Phonon11VideoWidget3hueEv @ 386 NONAME
- _ZNK6Phonon11VideoWidget8contrastEv @ 387 NONAME
- _ZNK6Phonon11VideoWidget9scaleModeEv @ 388 NONAME
- _ZNK6Phonon12EffectWidget10metaObjectEv @ 389 NONAME
- _ZNK6Phonon12GlobalConfig20audioOutputDeviceForENS_8CategoryEi @ 390 NONAME
- _ZNK6Phonon12GlobalConfig21audioCaptureDeviceForENS_8CategoryEi @ 391 NONAME
- _ZNK6Phonon12GlobalConfig24audioOutputDeviceListForENS_8CategoryEi @ 392 NONAME
- _ZNK6Phonon12GlobalConfig25audioCaptureDeviceListForENS_8CategoryEi @ 393 NONAME
- _ZNK6Phonon12VolumeSlider10metaObjectEv @ 394 NONAME
- _ZNK6Phonon12VolumeSlider10singleStepEv @ 395 NONAME
- _ZNK6Phonon12VolumeSlider11audioOutputEv @ 396 NONAME
- _ZNK6Phonon12VolumeSlider11hasTrackingEv @ 397 NONAME
- _ZNK6Phonon12VolumeSlider11orientationEv @ 398 NONAME
- _ZNK6Phonon12VolumeSlider13isMuteVisibleEv @ 399 NONAME
- _ZNK6Phonon12VolumeSlider13maximumVolumeEv @ 400 NONAME
- _ZNK6Phonon12VolumeSlider8iconSizeEv @ 401 NONAME
- _ZNK6Phonon12VolumeSlider8pageStepEv @ 402 NONAME
- _ZNK6Phonon15EffectParameter11descriptionEv @ 403 NONAME
- _ZNK6Phonon15EffectParameter12defaultValueEv @ 404 NONAME
- _ZNK6Phonon15EffectParameter12maximumValueEv @ 405 NONAME
- _ZNK6Phonon15EffectParameter12minimumValueEv @ 406 NONAME
- _ZNK6Phonon15EffectParameter14possibleValuesEv @ 407 NONAME
- _ZNK6Phonon15EffectParameter20isLogarithmicControlEv @ 408 NONAME
- _ZNK6Phonon15EffectParameter2idEv @ 409 NONAME
- _ZNK6Phonon15EffectParameter4nameEv @ 410 NONAME
- _ZNK6Phonon15EffectParameter4typeEv @ 411 NONAME
- _ZNK6Phonon15EffectParametereqERKS0_ @ 412 NONAME
- _ZNK6Phonon15EffectParametergtERKS0_ @ 413 NONAME
- _ZNK6Phonon15EffectParameterltERKS0_ @ 414 NONAME
- _ZNK6Phonon15MediaController10metaObjectEv @ 415 NONAME
- _ZNK6Phonon15MediaController12currentAngleEv @ 416 NONAME
- _ZNK6Phonon15MediaController12currentTitleEv @ 417 NONAME
- _ZNK6Phonon15MediaController14autoplayTitlesEv @ 418 NONAME
- _ZNK6Phonon15MediaController14currentChapterEv @ 419 NONAME
- _ZNK6Phonon15MediaController15availableAnglesEv @ 420 NONAME
- _ZNK6Phonon15MediaController15availableTitlesEv @ 421 NONAME
- _ZNK6Phonon15MediaController15currentSubtitleEv @ 422 NONAME
- _ZNK6Phonon15MediaController17availableChaptersEv @ 423 NONAME
- _ZNK6Phonon15MediaController17supportedFeaturesEv @ 424 NONAME
- _ZNK6Phonon15MediaController18availableSubtitlesEv @ 425 NONAME
- _ZNK6Phonon15MediaController19currentAudioChannelEv @ 426 NONAME
- _ZNK6Phonon15MediaController22availableAudioChannelsEv @ 427 NONAME
- _ZNK6Phonon17VolumeFaderEffect10metaObjectEv @ 428 NONAME
- _ZNK6Phonon17VolumeFaderEffect13volumeDecibelEv @ 429 NONAME
- _ZNK6Phonon17VolumeFaderEffect6volumeEv @ 430 NONAME
- _ZNK6Phonon17VolumeFaderEffect9fadeCurveEv @ 431 NONAME
- _ZNK6Phonon19AbstractAudioOutput10metaObjectEv @ 432 NONAME
- _ZNK6Phonon19AbstractMediaStream10metaObjectEv @ 433 NONAME
- _ZNK6Phonon19AbstractMediaStream10streamSizeEv @ 434 NONAME
- _ZNK6Phonon19AbstractMediaStream14streamSeekableEv @ 435 NONAME
- _ZNK6Phonon21ObjectDescriptionData11descriptionEv @ 436 NONAME
- _ZNK6Phonon21ObjectDescriptionData13propertyNamesEv @ 437 NONAME
- _ZNK6Phonon21ObjectDescriptionData4nameEv @ 438 NONAME
- _ZNK6Phonon21ObjectDescriptionData5indexEv @ 439 NONAME
- _ZNK6Phonon21ObjectDescriptionData7isValidEv @ 440 NONAME
- _ZNK6Phonon21ObjectDescriptionData8propertyEPKc @ 441 NONAME
- _ZNK6Phonon21ObjectDescriptionDataeqERKS0_ @ 442 NONAME
- _ZNK6Phonon22AudioOutputInterface4219deviceAccessListForERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 443 NONAME
- _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE10metaObjectEv @ 444 NONAME
- _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE10metaObjectEv @ 445 NONAME
- _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE10metaObjectEv @ 446 NONAME
- _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE10metaObjectEv @ 447 NONAME
- _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE10metaObjectEv @ 448 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData15tupleIndexOrderEv @ 449 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData20supportedDropActionsEv @ 450 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData25tupleIndexAtPositionIndexEi @ 451 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData4dataERK11QModelIndexi @ 452 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData5flagsERK11QModelIndex @ 453 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData8mimeDataENS_21ObjectDescriptionTypeERK5QListI11QModelIndexE @ 454 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData8rowCountERK11QModelIndex @ 455 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData9mimeTypesENS_21ObjectDescriptionTypeE @ 456 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData9modelDataERK11QModelIndex @ 457 NONAME
- _ZNK6Phonon26ObjectDescriptionModelData9modelDataEv @ 458 NONAME
- _ZNK6Phonon4Path4sinkEv @ 459 NONAME
- _ZNK6Phonon4Path6sourceEv @ 460 NONAME
- _ZNK6Phonon4Path7effectsEv @ 461 NONAME
- _ZNK6Phonon4Path7isValidEv @ 462 NONAME
- _ZNK6Phonon4PatheqERKS0_ @ 463 NONAME
- _ZNK6Phonon4PathneERKS0_ @ 464 NONAME
- _ZNK6Phonon6Effect10metaObjectEv @ 465 NONAME
- _ZNK6Phonon6Effect10parametersEv @ 466 NONAME
- _ZNK6Phonon6Effect11descriptionEv @ 467 NONAME
- _ZNK6Phonon6Effect14parameterValueERKNS_15EffectParameterE @ 468 NONAME
- _ZNK6Phonon9MediaNode10inputPathsEv @ 469 NONAME
- _ZNK6Phonon9MediaNode11outputPathsEv @ 470 NONAME
- _ZNK6Phonon9MediaNode7isValidEv @ 471 NONAME
- _ZTIN6Phonon10SeekSliderE @ 472 NONAME
- _ZTIN6Phonon11AudioOutputE @ 473 NONAME
- _ZTIN6Phonon11MediaObjectE @ 474 NONAME
- _ZTIN6Phonon11PathPrivateE @ 475 NONAME ABSENT
- _ZTIN6Phonon11VideoPlayerE @ 476 NONAME
- _ZTIN6Phonon11VideoWidgetE @ 477 NONAME
- _ZTIN6Phonon12EffectWidgetE @ 478 NONAME
- _ZTIN6Phonon12GlobalConfigE @ 479 NONAME
- _ZTIN6Phonon12VolumeSliderE @ 480 NONAME
- _ZTIN6Phonon13EffectPrivateE @ 481 NONAME ABSENT
- _ZTIN6Phonon14FactoryPrivateE @ 482 NONAME ABSENT
- _ZTIN6Phonon14IODeviceStreamE @ 483 NONAME ABSENT
- _ZTIN6Phonon15MediaControllerE @ 484 NONAME
- _ZTIN6Phonon15StreamInterfaceE @ 485 NONAME
- _ZTIN6Phonon16MediaNodePrivateE @ 486 NONAME
- _ZTIN6Phonon17VolumeFaderEffectE @ 487 NONAME
- _ZTIN6Phonon18AudioOutputPrivateE @ 488 NONAME ABSENT
- _ZTIN6Phonon18MediaObjectPrivateE @ 489 NONAME ABSENT
- _ZTIN6Phonon18MediaSourcePrivateE @ 490 NONAME
- _ZTIN6Phonon18VideoWidgetPrivateE @ 491 NONAME ABSENT
- _ZTIN6Phonon19AbstractAudioOutputE @ 492 NONAME
- _ZTIN6Phonon19AbstractMediaStreamE @ 493 NONAME
- _ZTIN6Phonon19AbstractVideoOutputE @ 494 NONAME
- _ZTIN6Phonon19BackendCapabilities8NotifierE @ 495 NONAME ABSENT
- _ZTIN6Phonon22MediaControllerPrivateE @ 496 NONAME ABSENT
- _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EEE @ 497 NONAME
- _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EEE @ 498 NONAME
- _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EEE @ 499 NONAME
- _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EEE @ 500 NONAME
- _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EEE @ 501 NONAME
- _ZTIN6Phonon24VolumeFaderEffectPrivateE @ 502 NONAME ABSENT
- _ZTIN6Phonon26AbstractAudioOutputPrivateE @ 503 NONAME ABSENT
- _ZTIN6Phonon26AbstractMediaStreamPrivateE @ 504 NONAME
- _ZTIN6Phonon26AbstractVideoOutputPrivateE @ 505 NONAME ABSENT
- _ZTIN6Phonon6EffectE @ 506 NONAME
- _ZTIN6Phonon7Factory6SenderE @ 507 NONAME ABSENT
- _ZTIN6Phonon9MediaNodeE @ 508 NONAME
- _ZTVN6Phonon10SeekSliderE @ 509 NONAME
- _ZTVN6Phonon11AudioOutputE @ 510 NONAME
- _ZTVN6Phonon11MediaObjectE @ 511 NONAME
- _ZTVN6Phonon11PathPrivateE @ 512 NONAME ABSENT
- _ZTVN6Phonon11VideoPlayerE @ 513 NONAME
- _ZTVN6Phonon11VideoWidgetE @ 514 NONAME
- _ZTVN6Phonon12EffectWidgetE @ 515 NONAME
- _ZTVN6Phonon12GlobalConfigE @ 516 NONAME
- _ZTVN6Phonon12VolumeSliderE @ 517 NONAME
- _ZTVN6Phonon13EffectPrivateE @ 518 NONAME ABSENT
- _ZTVN6Phonon14FactoryPrivateE @ 519 NONAME ABSENT
- _ZTVN6Phonon14IODeviceStreamE @ 520 NONAME ABSENT
- _ZTVN6Phonon15MediaControllerE @ 521 NONAME
- _ZTVN6Phonon15StreamInterfaceE @ 522 NONAME
- _ZTVN6Phonon16MediaNodePrivateE @ 523 NONAME
- _ZTVN6Phonon17VolumeFaderEffectE @ 524 NONAME
- _ZTVN6Phonon18AudioOutputPrivateE @ 525 NONAME ABSENT
- _ZTVN6Phonon18MediaObjectPrivateE @ 526 NONAME ABSENT
- _ZTVN6Phonon18MediaSourcePrivateE @ 527 NONAME
- _ZTVN6Phonon18VideoWidgetPrivateE @ 528 NONAME ABSENT
- _ZTVN6Phonon19AbstractAudioOutputE @ 529 NONAME
- _ZTVN6Phonon19AbstractMediaStreamE @ 530 NONAME
- _ZTVN6Phonon19AbstractVideoOutputE @ 531 NONAME
- _ZTVN6Phonon19BackendCapabilities8NotifierE @ 532 NONAME ABSENT
- _ZTVN6Phonon22MediaControllerPrivateE @ 533 NONAME ABSENT
- _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EEE @ 534 NONAME
- _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EEE @ 535 NONAME
- _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EEE @ 536 NONAME
- _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EEE @ 537 NONAME
- _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EEE @ 538 NONAME
- _ZTVN6Phonon24VolumeFaderEffectPrivateE @ 539 NONAME ABSENT
- _ZTVN6Phonon26AbstractAudioOutputPrivateE @ 540 NONAME ABSENT
- _ZTVN6Phonon26AbstractMediaStreamPrivateE @ 541 NONAME
- _ZTVN6Phonon26AbstractVideoOutputPrivateE @ 542 NONAME ABSENT
- _ZTVN6Phonon6EffectE @ 543 NONAME
- _ZTVN6Phonon7Factory6SenderE @ 544 NONAME ABSENT
- _ZTVN6Phonon9MediaNodeE @ 545 NONAME
- _ZThn8_N6Phonon10SeekSliderD0Ev @ 546 NONAME
- _ZThn8_N6Phonon10SeekSliderD1Ev @ 547 NONAME
- _ZThn8_N6Phonon11MediaObjectD0Ev @ 548 NONAME
- _ZThn8_N6Phonon11MediaObjectD1Ev @ 549 NONAME
- _ZThn8_N6Phonon11VideoPlayerD0Ev @ 550 NONAME
- _ZThn8_N6Phonon11VideoPlayerD1Ev @ 551 NONAME
- _ZThn8_N6Phonon12EffectWidgetD0Ev @ 552 NONAME
- _ZThn8_N6Phonon12EffectWidgetD1Ev @ 553 NONAME
- _ZThn8_N6Phonon12VolumeSliderD0Ev @ 554 NONAME
- _ZThn8_N6Phonon12VolumeSliderD1Ev @ 555 NONAME
- _ZThn8_N6Phonon19AbstractAudioOutputD0Ev @ 556 NONAME
- _ZThn8_N6Phonon19AbstractAudioOutputD1Ev @ 557 NONAME
- _ZThn8_N6Phonon6EffectD0Ev @ 558 NONAME
- _ZThn8_N6Phonon6EffectD1Ev @ 559 NONAME
- _ZN6Phonon10SeekSlider19getStaticMetaObjectEv @ 560 NONAME
- _ZN6Phonon11AudioOutput19getStaticMetaObjectEv @ 561 NONAME
- _ZN6Phonon11MediaObject19getStaticMetaObjectEv @ 562 NONAME
- _ZN6Phonon11VideoPlayer19getStaticMetaObjectEv @ 563 NONAME
- _ZN6Phonon11VideoWidget19getStaticMetaObjectEv @ 564 NONAME
- _ZN6Phonon12EffectWidget19getStaticMetaObjectEv @ 565 NONAME
- _ZN6Phonon12VolumeSlider19getStaticMetaObjectEv @ 566 NONAME
- _ZN6Phonon15MediaController19getStaticMetaObjectEv @ 567 NONAME
- _ZN6Phonon17VolumeFaderEffect19getStaticMetaObjectEv @ 568 NONAME
- _ZN6Phonon19AbstractAudioOutput19getStaticMetaObjectEv @ 569 NONAME
- _ZN6Phonon19AbstractMediaStream19getStaticMetaObjectEv @ 570 NONAME
- _ZN6Phonon6Effect19getStaticMetaObjectEv @ 571 NONAME
+ _ZN6Phonon10SeekSlider19getStaticMetaObjectEv @ 11 NONAME
+ _ZN6Phonon10SeekSliderC1EP7QWidget @ 12 NONAME
+ _ZN6Phonon10SeekSliderC1EPNS_11MediaObjectEP7QWidget @ 13 NONAME
+ _ZN6Phonon10SeekSliderC2EP7QWidget @ 14 NONAME
+ _ZN6Phonon10SeekSliderC2EPNS_11MediaObjectEP7QWidget @ 15 NONAME
+ _ZN6Phonon10SeekSliderD0Ev @ 16 NONAME
+ _ZN6Phonon10SeekSliderD1Ev @ 17 NONAME
+ _ZN6Phonon10SeekSliderD2Ev @ 18 NONAME
+ _ZN6Phonon10createPathEPNS_9MediaNodeES1_ @ 19 NONAME
+ _ZN6Phonon11AudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 20 NONAME
+ _ZN6Phonon11AudioOutput11qt_metacastEPKc @ 21 NONAME
+ _ZN6Phonon11AudioOutput12mutedChangedEb @ 22 NONAME
+ _ZN6Phonon11AudioOutput13volumeChangedEf @ 23 NONAME
+ _ZN6Phonon11AudioOutput15setOutputDeviceERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 24 NONAME
+ _ZN6Phonon11AudioOutput16setVolumeDecibelEf @ 25 NONAME
+ _ZN6Phonon11AudioOutput16staticMetaObjectE @ 26 NONAME DATA 16
+ _ZN6Phonon11AudioOutput19getStaticMetaObjectEv @ 27 NONAME
+ _ZN6Phonon11AudioOutput19outputDeviceChangedERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 28 NONAME
+ _ZN6Phonon11AudioOutput7setNameERK7QString @ 29 NONAME
+ _ZN6Phonon11AudioOutput8setMutedEb @ 30 NONAME
+ _ZN6Phonon11AudioOutput9setVolumeEf @ 31 NONAME
+ _ZN6Phonon11AudioOutputC1ENS_8CategoryEP7QObject @ 32 NONAME
+ _ZN6Phonon11AudioOutputC1EP7QObject @ 33 NONAME
+ _ZN6Phonon11AudioOutputC2ENS_8CategoryEP7QObject @ 34 NONAME
+ _ZN6Phonon11AudioOutputC2EP7QObject @ 35 NONAME
+ _ZN6Phonon11MediaObject10clearQueueEv @ 36 NONAME
+ _ZN6Phonon11MediaObject11qt_metacallEN11QMetaObject4CallEiPPv @ 37 NONAME
+ _ZN6Phonon11MediaObject11qt_metacastEPKc @ 38 NONAME
+ _ZN6Phonon11MediaObject12bufferStatusEi @ 39 NONAME
+ _ZN6Phonon11MediaObject12stateChangedENS_5StateES1_ @ 40 NONAME
+ _ZN6Phonon11MediaObject13aboutToFinishEv @ 41 NONAME
+ _ZN6Phonon11MediaObject15hasVideoChangedEb @ 42 NONAME
+ _ZN6Phonon11MediaObject15metaDataChangedEv @ 43 NONAME
+ _ZN6Phonon11MediaObject15seekableChangedEb @ 44 NONAME
+ _ZN6Phonon11MediaObject15setTickIntervalEi @ 45 NONAME
+ _ZN6Phonon11MediaObject16setCurrentSourceERKNS_11MediaSourceE @ 46 NONAME
+ _ZN6Phonon11MediaObject16setPrefinishMarkEi @ 47 NONAME
+ _ZN6Phonon11MediaObject16staticMetaObjectE @ 48 NONAME DATA 16
+ _ZN6Phonon11MediaObject16totalTimeChangedEx @ 49 NONAME
+ _ZN6Phonon11MediaObject17setTransitionTimeEi @ 50 NONAME
+ _ZN6Phonon11MediaObject19getStaticMetaObjectEv @ 51 NONAME
+ _ZN6Phonon11MediaObject20currentSourceChangedERKNS_11MediaSourceE @ 52 NONAME
+ _ZN6Phonon11MediaObject20prefinishMarkReachedEi @ 53 NONAME
+ _ZN6Phonon11MediaObject4playEv @ 54 NONAME
+ _ZN6Phonon11MediaObject4seekEx @ 55 NONAME
+ _ZN6Phonon11MediaObject4stopEv @ 56 NONAME
+ _ZN6Phonon11MediaObject4tickEx @ 57 NONAME
+ _ZN6Phonon11MediaObject5clearEv @ 58 NONAME
+ _ZN6Phonon11MediaObject5pauseEv @ 59 NONAME
+ _ZN6Phonon11MediaObject7enqueueERK5QListI4QUrlE @ 60 NONAME
+ _ZN6Phonon11MediaObject7enqueueERK5QListINS_11MediaSourceEE @ 61 NONAME
+ _ZN6Phonon11MediaObject7enqueueERKNS_11MediaSourceE @ 62 NONAME
+ _ZN6Phonon11MediaObject8finishedEv @ 63 NONAME
+ _ZN6Phonon11MediaObject8setQueueERK5QListI4QUrlE @ 64 NONAME
+ _ZN6Phonon11MediaObject8setQueueERK5QListINS_11MediaSourceEE @ 65 NONAME
+ _ZN6Phonon11MediaObjectC1EP7QObject @ 66 NONAME
+ _ZN6Phonon11MediaObjectC2EP7QObject @ 67 NONAME
+ _ZN6Phonon11MediaObjectD0Ev @ 68 NONAME
+ _ZN6Phonon11MediaObjectD1Ev @ 69 NONAME
+ _ZN6Phonon11MediaObjectD2Ev @ 70 NONAME
+ _ZN6Phonon11MediaSource13setAutoDeleteEb @ 71 NONAME
+ _ZN6Phonon11MediaSourceC1ENS_8DiscTypeERK7QString @ 72 NONAME
+ _ZN6Phonon11MediaSourceC1EP9QIODevice @ 73 NONAME
+ _ZN6Phonon11MediaSourceC1EPNS_19AbstractMediaStreamE @ 74 NONAME
+ _ZN6Phonon11MediaSourceC1ERK4QUrl @ 75 NONAME
+ _ZN6Phonon11MediaSourceC1ERK7QString @ 76 NONAME
+ _ZN6Phonon11MediaSourceC1ERKS0_ @ 77 NONAME
+ _ZN6Phonon11MediaSourceC1ERNS_18MediaSourcePrivateE @ 78 NONAME
+ _ZN6Phonon11MediaSourceC1Ev @ 79 NONAME
+ _ZN6Phonon11MediaSourceC2ENS_8DiscTypeERK7QString @ 80 NONAME
+ _ZN6Phonon11MediaSourceC2EP9QIODevice @ 81 NONAME
+ _ZN6Phonon11MediaSourceC2EPNS_19AbstractMediaStreamE @ 82 NONAME
+ _ZN6Phonon11MediaSourceC2ERK4QUrl @ 83 NONAME
+ _ZN6Phonon11MediaSourceC2ERK7QString @ 84 NONAME
+ _ZN6Phonon11MediaSourceC2ERKS0_ @ 85 NONAME
+ _ZN6Phonon11MediaSourceC2ERNS_18MediaSourcePrivateE @ 86 NONAME
+ _ZN6Phonon11MediaSourceC2Ev @ 87 NONAME
+ _ZN6Phonon11MediaSourceD1Ev @ 88 NONAME
+ _ZN6Phonon11MediaSourceD2Ev @ 89 NONAME
+ _ZN6Phonon11MediaSourceaSERKS0_ @ 90 NONAME
+ _ZN6Phonon11VideoPlayer11qt_metacallEN11QMetaObject4CallEiPPv @ 91 NONAME
+ _ZN6Phonon11VideoPlayer11qt_metacastEPKc @ 92 NONAME
+ _ZN6Phonon11VideoPlayer16staticMetaObjectE @ 93 NONAME DATA 16
+ _ZN6Phonon11VideoPlayer19getStaticMetaObjectEv @ 94 NONAME
+ _ZN6Phonon11VideoPlayer4loadERKNS_11MediaSourceE @ 95 NONAME
+ _ZN6Phonon11VideoPlayer4playERKNS_11MediaSourceE @ 96 NONAME
+ _ZN6Phonon11VideoPlayer4playEv @ 97 NONAME
+ _ZN6Phonon11VideoPlayer4seekEx @ 98 NONAME
+ _ZN6Phonon11VideoPlayer4stopEv @ 99 NONAME
+ _ZN6Phonon11VideoPlayer5pauseEv @ 100 NONAME
+ _ZN6Phonon11VideoPlayer8finishedEv @ 101 NONAME
+ _ZN6Phonon11VideoPlayer9setVolumeEf @ 102 NONAME
+ _ZN6Phonon11VideoPlayerC1ENS_8CategoryEP7QWidget @ 103 NONAME
+ _ZN6Phonon11VideoPlayerC1EP7QWidget @ 104 NONAME
+ _ZN6Phonon11VideoPlayerC2ENS_8CategoryEP7QWidget @ 105 NONAME
+ _ZN6Phonon11VideoPlayerC2EP7QWidget @ 106 NONAME
+ _ZN6Phonon11VideoPlayerD0Ev @ 107 NONAME
+ _ZN6Phonon11VideoPlayerD1Ev @ 108 NONAME
+ _ZN6Phonon11VideoPlayerD2Ev @ 109 NONAME
+ _ZN6Phonon11VideoWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 110 NONAME
+ _ZN6Phonon11VideoWidget11qt_metacastEPKc @ 111 NONAME
+ _ZN6Phonon11VideoWidget11setContrastEf @ 112 NONAME
+ _ZN6Phonon11VideoWidget12setScaleModeENS0_9ScaleModeE @ 113 NONAME
+ _ZN6Phonon11VideoWidget13setBrightnessEf @ 114 NONAME
+ _ZN6Phonon11VideoWidget13setFullScreenEb @ 115 NONAME
+ _ZN6Phonon11VideoWidget13setSaturationEf @ 116 NONAME
+ _ZN6Phonon11VideoWidget14exitFullScreenEv @ 117 NONAME
+ _ZN6Phonon11VideoWidget14mouseMoveEventEP11QMouseEvent @ 118 NONAME
+ _ZN6Phonon11VideoWidget14setAspectRatioENS0_11AspectRatioE @ 119 NONAME
+ _ZN6Phonon11VideoWidget15enterFullScreenEv @ 120 NONAME
+ _ZN6Phonon11VideoWidget16staticMetaObjectE @ 121 NONAME DATA 16
+ _ZN6Phonon11VideoWidget19getStaticMetaObjectEv @ 122 NONAME
+ _ZN6Phonon11VideoWidget5eventEP6QEvent @ 123 NONAME
+ _ZN6Phonon11VideoWidget6setHueEf @ 124 NONAME
+ _ZN6Phonon11VideoWidgetC1EP7QWidget @ 125 NONAME
+ _ZN6Phonon11VideoWidgetC1ERNS_18VideoWidgetPrivateEP7QWidget @ 126 NONAME
+ _ZN6Phonon11VideoWidgetC2EP7QWidget @ 127 NONAME
+ _ZN6Phonon11VideoWidgetC2ERNS_18VideoWidgetPrivateEP7QWidget @ 128 NONAME
+ _ZN6Phonon12EffectWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 129 NONAME
+ _ZN6Phonon12EffectWidget11qt_metacastEPKc @ 130 NONAME
+ _ZN6Phonon12EffectWidget16staticMetaObjectE @ 131 NONAME DATA 16
+ _ZN6Phonon12EffectWidget19getStaticMetaObjectEv @ 132 NONAME
+ _ZN6Phonon12EffectWidgetC1EPNS_6EffectEP7QWidget @ 133 NONAME
+ _ZN6Phonon12EffectWidgetC2EPNS_6EffectEP7QWidget @ 134 NONAME
+ _ZN6Phonon12EffectWidgetD0Ev @ 135 NONAME
+ _ZN6Phonon12EffectWidgetD1Ev @ 136 NONAME
+ _ZN6Phonon12EffectWidgetD2Ev @ 137 NONAME
+ _ZN6Phonon12GlobalConfigC1Ev @ 138 NONAME
+ _ZN6Phonon12GlobalConfigC2Ev @ 139 NONAME
+ _ZN6Phonon12GlobalConfigD0Ev @ 140 NONAME
+ _ZN6Phonon12GlobalConfigD1Ev @ 141 NONAME
+ _ZN6Phonon12GlobalConfigD2Ev @ 142 NONAME
+ _ZN6Phonon12VolumeSlider11qt_metacallEN11QMetaObject4CallEiPPv @ 143 NONAME
+ _ZN6Phonon12VolumeSlider11qt_metacastEPKc @ 144 NONAME
+ _ZN6Phonon12VolumeSlider11setIconSizeERK5QSize @ 145 NONAME
+ _ZN6Phonon12VolumeSlider11setPageStepEi @ 146 NONAME
+ _ZN6Phonon12VolumeSlider11setTrackingEb @ 147 NONAME
+ _ZN6Phonon12VolumeSlider13setSingleStepEi @ 148 NONAME
+ _ZN6Phonon12VolumeSlider14setAudioOutputEPNS_11AudioOutputE @ 149 NONAME
+ _ZN6Phonon12VolumeSlider14setMuteVisibleEb @ 150 NONAME
+ _ZN6Phonon12VolumeSlider14setOrientationEN2Qt11OrientationE @ 151 NONAME
+ _ZN6Phonon12VolumeSlider16setMaximumVolumeEf @ 152 NONAME
+ _ZN6Phonon12VolumeSlider16staticMetaObjectE @ 153 NONAME DATA 16
+ _ZN6Phonon12VolumeSlider19getStaticMetaObjectEv @ 154 NONAME
+ _ZN6Phonon12VolumeSliderC1EP7QWidget @ 155 NONAME
+ _ZN6Phonon12VolumeSliderC1EPNS_11AudioOutputEP7QWidget @ 156 NONAME
+ _ZN6Phonon12VolumeSliderC2EP7QWidget @ 157 NONAME
+ _ZN6Phonon12VolumeSliderC2EPNS_11AudioOutputEP7QWidget @ 158 NONAME
+ _ZN6Phonon12VolumeSliderD0Ev @ 159 NONAME
+ _ZN6Phonon12VolumeSliderD1Ev @ 160 NONAME
+ _ZN6Phonon12VolumeSliderD2Ev @ 161 NONAME
+ _ZN6Phonon12createPlayerENS_8CategoryERKNS_11MediaSourceE @ 162 NONAME
+ _ZN6Phonon13phononVersionEv @ 163 NONAME
+ _ZN6Phonon15EffectParameterC1ERKS0_ @ 164 NONAME
+ _ZN6Phonon15EffectParameterC1EiRK7QString6QFlagsINS0_4HintEERK8QVariantS9_S9_RK5QListIS7_ES3_ @ 165 NONAME
+ _ZN6Phonon15EffectParameterC1Ev @ 166 NONAME
+ _ZN6Phonon15EffectParameterC2ERKS0_ @ 167 NONAME
+ _ZN6Phonon15EffectParameterC2EiRK7QString6QFlagsINS0_4HintEERK8QVariantS9_S9_RK5QListIS7_ES3_ @ 168 NONAME
+ _ZN6Phonon15EffectParameterC2Ev @ 169 NONAME
+ _ZN6Phonon15EffectParameterD1Ev @ 170 NONAME
+ _ZN6Phonon15EffectParameterD2Ev @ 171 NONAME
+ _ZN6Phonon15EffectParameteraSERKS0_ @ 172 NONAME
+ _ZN6Phonon15MediaController11qt_metacallEN11QMetaObject4CallEiPPv @ 173 NONAME
+ _ZN6Phonon15MediaController11qt_metacastEPKc @ 174 NONAME
+ _ZN6Phonon15MediaController12angleChangedEi @ 175 NONAME
+ _ZN6Phonon15MediaController12titleChangedEi @ 176 NONAME
+ _ZN6Phonon15MediaController13previousTitleEv @ 177 NONAME
+ _ZN6Phonon15MediaController14chapterChangedEi @ 178 NONAME
+ _ZN6Phonon15MediaController15setCurrentAngleEi @ 179 NONAME
+ _ZN6Phonon15MediaController15setCurrentTitleEi @ 180 NONAME
+ _ZN6Phonon15MediaController16staticMetaObjectE @ 181 NONAME DATA 16
+ _ZN6Phonon15MediaController17setAutoplayTitlesEb @ 182 NONAME
+ _ZN6Phonon15MediaController17setCurrentChapterEi @ 183 NONAME
+ _ZN6Phonon15MediaController18setCurrentSubtitleERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE3EEE @ 184 NONAME
+ _ZN6Phonon15MediaController19getStaticMetaObjectEv @ 185 NONAME
+ _ZN6Phonon15MediaController22availableAnglesChangedEi @ 186 NONAME
+ _ZN6Phonon15MediaController22availableTitlesChangedEi @ 187 NONAME
+ _ZN6Phonon15MediaController22setCurrentAudioChannelERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE2EEE @ 188 NONAME
+ _ZN6Phonon15MediaController24availableChaptersChangedEi @ 189 NONAME
+ _ZN6Phonon15MediaController25availableSubtitlesChangedEv @ 190 NONAME
+ _ZN6Phonon15MediaController29availableAudioChannelsChangedEv @ 191 NONAME
+ _ZN6Phonon15MediaController9nextTitleEv @ 192 NONAME
+ _ZN6Phonon15MediaControllerC1EPNS_11MediaObjectE @ 193 NONAME
+ _ZN6Phonon15MediaControllerC2EPNS_11MediaObjectE @ 194 NONAME
+ _ZN6Phonon15MediaControllerD0Ev @ 195 NONAME
+ _ZN6Phonon15MediaControllerD1Ev @ 196 NONAME
+ _ZN6Phonon15MediaControllerD2Ev @ 197 NONAME
+ _ZN6Phonon15StreamInterface10enoughDataEv @ 198 NONAME
+ _ZN6Phonon15StreamInterface10seekStreamEx @ 199 NONAME
+ _ZN6Phonon15StreamInterface15connectToSourceERKNS_11MediaSourceE @ 200 NONAME
+ _ZN6Phonon15StreamInterface5resetEv @ 201 NONAME
+ _ZN6Phonon15StreamInterface8needDataEv @ 202 NONAME
+ _ZN6Phonon15StreamInterfaceC2Ev @ 203 NONAME
+ _ZN6Phonon15StreamInterfaceD0Ev @ 204 NONAME
+ _ZN6Phonon15StreamInterfaceD1Ev @ 205 NONAME
+ _ZN6Phonon15StreamInterfaceD2Ev @ 206 NONAME
+ _ZN6Phonon16MediaNodePrivate12addInputPathERKNS_4PathE @ 207 NONAME
+ _ZN6Phonon16MediaNodePrivate13addOutputPathERKNS_4PathE @ 208 NONAME
+ _ZN6Phonon16MediaNodePrivate13backendObjectEv @ 209 NONAME
+ _ZN6Phonon16MediaNodePrivate15removeInputPathERKNS_4PathE @ 210 NONAME
+ _ZN6Phonon16MediaNodePrivate16removeOutputPathERKNS_4PathE @ 211 NONAME
+ _ZN6Phonon16MediaNodePrivate19deleteBackendObjectEv @ 212 NONAME
+ _ZN6Phonon16MediaNodePrivate21addDestructionHandlerEPNS_27MediaNodeDestructionHandlerE @ 213 NONAME
+ _ZN6Phonon16MediaNodePrivate24removeDestructionHandlerEPNS_27MediaNodeDestructionHandlerE @ 214 NONAME
+ _ZN6Phonon16MediaNodePrivateC2ENS0_6CastIdE @ 215 NONAME
+ _ZN6Phonon16MediaNodePrivateD0Ev @ 216 NONAME
+ _ZN6Phonon16MediaNodePrivateD1Ev @ 217 NONAME
+ _ZN6Phonon16MediaNodePrivateD2Ev @ 218 NONAME
+ _ZN6Phonon16categoryToStringENS_8CategoryE @ 219 NONAME
+ _ZN6Phonon17VolumeFaderEffect11qt_metacallEN11QMetaObject4CallEiPPv @ 220 NONAME
+ _ZN6Phonon17VolumeFaderEffect11qt_metacastEPKc @ 221 NONAME
+ _ZN6Phonon17VolumeFaderEffect12setFadeCurveENS0_9FadeCurveE @ 222 NONAME
+ _ZN6Phonon17VolumeFaderEffect16setVolumeDecibelEd @ 223 NONAME
+ _ZN6Phonon17VolumeFaderEffect16staticMetaObjectE @ 224 NONAME DATA 16
+ _ZN6Phonon17VolumeFaderEffect19getStaticMetaObjectEv @ 225 NONAME
+ _ZN6Phonon17VolumeFaderEffect6fadeInEi @ 226 NONAME
+ _ZN6Phonon17VolumeFaderEffect6fadeToEfi @ 227 NONAME
+ _ZN6Phonon17VolumeFaderEffect7fadeOutEi @ 228 NONAME
+ _ZN6Phonon17VolumeFaderEffect9setVolumeEf @ 229 NONAME
+ _ZN6Phonon17VolumeFaderEffectC1EP7QObject @ 230 NONAME
+ _ZN6Phonon17VolumeFaderEffectC2EP7QObject @ 231 NONAME
+ _ZN6Phonon18MediaObjectPrivate15_k_stateChangedENS_5StateES1_ @ 232 NONAME
+ _ZN6Phonon18MediaObjectPrivate18setupBackendObjectEv @ 233 NONAME
+ _ZN6Phonon18MediaSourcePrivate9setStreamEPNS_19AbstractMediaStreamE @ 234 NONAME
+ _ZN6Phonon18MediaSourcePrivateD0Ev @ 235 NONAME
+ _ZN6Phonon18MediaSourcePrivateD1Ev @ 236 NONAME
+ _ZN6Phonon18MediaSourcePrivateD2Ev @ 237 NONAME
+ _ZN6Phonon19AbstractAudioOutput11qt_metacallEN11QMetaObject4CallEiPPv @ 238 NONAME
+ _ZN6Phonon19AbstractAudioOutput11qt_metacastEPKc @ 239 NONAME
+ _ZN6Phonon19AbstractAudioOutput16staticMetaObjectE @ 240 NONAME DATA 16
+ _ZN6Phonon19AbstractAudioOutput19getStaticMetaObjectEv @ 241 NONAME
+ _ZN6Phonon19AbstractAudioOutputC1ERNS_26AbstractAudioOutputPrivateEP7QObject @ 242 NONAME
+ _ZN6Phonon19AbstractAudioOutputC2ERNS_26AbstractAudioOutputPrivateEP7QObject @ 243 NONAME
+ _ZN6Phonon19AbstractAudioOutputD0Ev @ 244 NONAME
+ _ZN6Phonon19AbstractAudioOutputD1Ev @ 245 NONAME
+ _ZN6Phonon19AbstractAudioOutputD2Ev @ 246 NONAME
+ _ZN6Phonon19AbstractMediaStream10enoughDataEv @ 247 NONAME
+ _ZN6Phonon19AbstractMediaStream10seekStreamEx @ 248 NONAME
+ _ZN6Phonon19AbstractMediaStream11qt_metacallEN11QMetaObject4CallEiPPv @ 249 NONAME
+ _ZN6Phonon19AbstractMediaStream11qt_metacastEPKc @ 250 NONAME
+ _ZN6Phonon19AbstractMediaStream13setStreamSizeEx @ 251 NONAME
+ _ZN6Phonon19AbstractMediaStream16staticMetaObjectE @ 252 NONAME DATA 16
+ _ZN6Phonon19AbstractMediaStream17setStreamSeekableEb @ 253 NONAME
+ _ZN6Phonon19AbstractMediaStream19getStaticMetaObjectEv @ 254 NONAME
+ _ZN6Phonon19AbstractMediaStream5errorENS_9ErrorTypeERK7QString @ 255 NONAME
+ _ZN6Phonon19AbstractMediaStream9endOfDataEv @ 256 NONAME
+ _ZN6Phonon19AbstractMediaStream9writeDataERK10QByteArray @ 257 NONAME
+ _ZN6Phonon19AbstractMediaStreamC2EP7QObject @ 258 NONAME
+ _ZN6Phonon19AbstractMediaStreamC2ERNS_26AbstractMediaStreamPrivateEP7QObject @ 259 NONAME
+ _ZN6Phonon19AbstractMediaStreamD0Ev @ 260 NONAME
+ _ZN6Phonon19AbstractMediaStreamD1Ev @ 261 NONAME
+ _ZN6Phonon19AbstractMediaStreamD2Ev @ 262 NONAME
+ _ZN6Phonon19AbstractVideoOutputC1ERNS_26AbstractVideoOutputPrivateE @ 263 NONAME
+ _ZN6Phonon19AbstractVideoOutputC2ERNS_26AbstractVideoOutputPrivateE @ 264 NONAME
+ _ZN6Phonon19BackendCapabilities18availableMimeTypesEv @ 265 NONAME
+ _ZN6Phonon19BackendCapabilities19isMimeTypeAvailableERK7QString @ 266 NONAME
+ _ZN6Phonon19BackendCapabilities21availableAudioEffectsEv @ 267 NONAME
+ _ZN6Phonon19BackendCapabilities27availableAudioOutputDevicesEv @ 268 NONAME
+ _ZN6Phonon19BackendCapabilities28availableAudioCaptureDevicesEv @ 269 NONAME
+ _ZN6Phonon19BackendCapabilities8notifierEv @ 270 NONAME
+ _ZN6Phonon21ObjectDescriptionData9fromIndexENS_21ObjectDescriptionTypeEi @ 271 NONAME
+ _ZN6Phonon21ObjectDescriptionDataC1EPNS_24ObjectDescriptionPrivateE @ 272 NONAME
+ _ZN6Phonon21ObjectDescriptionDataC1EiRK5QHashI10QByteArray8QVariantE @ 273 NONAME
+ _ZN6Phonon21ObjectDescriptionDataC2EPNS_24ObjectDescriptionPrivateE @ 274 NONAME
+ _ZN6Phonon21ObjectDescriptionDataC2EiRK5QHashI10QByteArray8QVariantE @ 275 NONAME
+ _ZN6Phonon21ObjectDescriptionDataD1Ev @ 276 NONAME
+ _ZN6Phonon21ObjectDescriptionDataD2Ev @ 277 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE11qt_metacastEPKc @ 278 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE16staticMetaObjectE @ 279 NONAME DATA 16
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE11qt_metacastEPKc @ 280 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE16staticMetaObjectE @ 281 NONAME DATA 16
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE11qt_metacastEPKc @ 282 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE16staticMetaObjectE @ 283 NONAME DATA 16
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE11qt_metacastEPKc @ 284 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE16staticMetaObjectE @ 285 NONAME DATA 16
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE11qt_metacastEPKc @ 286 NONAME
+ _ZN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE16staticMetaObjectE @ 287 NONAME DATA 16
+ _ZN6Phonon26AbstractMediaStreamPrivate13setStreamSizeEx @ 288 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate17setStreamSeekableEb @ 289 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate18setStreamInterfaceEPNS_15StreamInterfaceE @ 290 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate21phononObjectDestroyedEPNS_16MediaNodePrivateE @ 291 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate21setMediaObjectPrivateEPNS_18MediaObjectPrivateE @ 292 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate9endOfDataEv @ 293 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivate9writeDataERK10QByteArray @ 294 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivateD0Ev @ 295 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivateD1Ev @ 296 NONAME
+ _ZN6Phonon26AbstractMediaStreamPrivateD2Ev @ 297 NONAME
+ _ZN6Phonon26ObjectDescriptionModelData10removeRowsEiiRK11QModelIndex @ 298 NONAME
+ _ZN6Phonon26ObjectDescriptionModelData12dropMimeDataENS_21ObjectDescriptionTypeEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 299 NONAME
+ _ZN6Phonon26ObjectDescriptionModelData12setModelDataERK5QListI28QExplicitlySharedDataPointerINS_21ObjectDescriptionDataEEE @ 300 NONAME
+ _ZN6Phonon26ObjectDescriptionModelData6moveUpERK11QModelIndex @ 301 NONAME
+ _ZN6Phonon26ObjectDescriptionModelData8moveDownERK11QModelIndex @ 302 NONAME
+ _ZN6Phonon26ObjectDescriptionModelDataC1EP18QAbstractListModel @ 303 NONAME
+ _ZN6Phonon26ObjectDescriptionModelDataC2EP18QAbstractListModel @ 304 NONAME
+ _ZN6Phonon26ObjectDescriptionModelDataD1Ev @ 305 NONAME
+ _ZN6Phonon26ObjectDescriptionModelDataD2Ev @ 306 NONAME
+ _ZN6Phonon4Path10disconnectEv @ 307 NONAME
+ _ZN6Phonon4Path12insertEffectEPNS_6EffectES2_ @ 308 NONAME
+ _ZN6Phonon4Path12insertEffectERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEPNS_6EffectE @ 309 NONAME
+ _ZN6Phonon4Path12removeEffectEPNS_6EffectE @ 310 NONAME
+ _ZN6Phonon4Path9reconnectEPNS_9MediaNodeES2_ @ 311 NONAME
+ _ZN6Phonon4PathC1ERKS0_ @ 312 NONAME
+ _ZN6Phonon4PathC1Ev @ 313 NONAME
+ _ZN6Phonon4PathC2ERKS0_ @ 314 NONAME
+ _ZN6Phonon4PathC2Ev @ 315 NONAME
+ _ZN6Phonon4PathD1Ev @ 316 NONAME
+ _ZN6Phonon4PathD2Ev @ 317 NONAME
+ _ZN6Phonon4PathaSERKS0_ @ 318 NONAME
+ _ZN6Phonon5qHashERKNS_15EffectParameterE @ 319 NONAME
+ _ZN6Phonon6Effect11qt_metacallEN11QMetaObject4CallEiPPv @ 320 NONAME
+ _ZN6Phonon6Effect11qt_metacastEPKc @ 321 NONAME
+ _ZN6Phonon6Effect16staticMetaObjectE @ 322 NONAME DATA 16
+ _ZN6Phonon6Effect17setParameterValueERKNS_15EffectParameterERK8QVariant @ 323 NONAME
+ _ZN6Phonon6Effect19getStaticMetaObjectEv @ 324 NONAME
+ _ZN6Phonon6EffectC1ERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEP7QObject @ 325 NONAME
+ _ZN6Phonon6EffectC1ERNS_13EffectPrivateEP7QObject @ 326 NONAME
+ _ZN6Phonon6EffectC2ERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE1EEEP7QObject @ 327 NONAME
+ _ZN6Phonon6EffectC2ERNS_13EffectPrivateEP7QObject @ 328 NONAME
+ _ZN6Phonon6EffectD0Ev @ 329 NONAME
+ _ZN6Phonon6EffectD1Ev @ 330 NONAME
+ _ZN6Phonon6EffectD2Ev @ 331 NONAME
+ _ZN6Phonon7Factory10setBackendEP7QObject @ 332 NONAME
+ _ZN6Phonon7Factory11backendNameEv @ 333 NONAME
+ _ZN6Phonon7Factory14platformPluginEv @ 334 NONAME
+ _ZN6Phonon7Factory15registerQObjectEP7QObject @ 335 NONAME
+ _ZN6Phonon7Factory22registerFrontendObjectEPNS_16MediaNodePrivateE @ 336 NONAME
+ _ZN6Phonon7Factory24deregisterFrontendObjectEPNS_16MediaNodePrivateE @ 337 NONAME
+ _ZN6Phonon7Factory6senderEv @ 338 NONAME
+ _ZN6Phonon7Factory7backendEb @ 339 NONAME
+ _ZN6Phonon9MediaNodeC1ERNS_16MediaNodePrivateE @ 340 NONAME
+ _ZN6Phonon9MediaNodeC2ERNS_16MediaNodePrivateE @ 341 NONAME
+ _ZN6Phonon9MediaNodeD0Ev @ 342 NONAME
+ _ZN6Phonon9MediaNodeD1Ev @ 343 NONAME
+ _ZN6Phonon9MediaNodeD2Ev @ 344 NONAME
+ _ZNK6Phonon10SeekSlider10metaObjectEv @ 345 NONAME
+ _ZNK6Phonon10SeekSlider10singleStepEv @ 346 NONAME
+ _ZNK6Phonon10SeekSlider11hasTrackingEv @ 347 NONAME
+ _ZNK6Phonon10SeekSlider11mediaObjectEv @ 348 NONAME
+ _ZNK6Phonon10SeekSlider11orientationEv @ 349 NONAME
+ _ZNK6Phonon10SeekSlider13isIconVisibleEv @ 350 NONAME
+ _ZNK6Phonon10SeekSlider8iconSizeEv @ 351 NONAME
+ _ZNK6Phonon10SeekSlider8pageStepEv @ 352 NONAME
+ _ZNK6Phonon11AudioOutput10metaObjectEv @ 353 NONAME
+ _ZNK6Phonon11AudioOutput12outputDeviceEv @ 354 NONAME
+ _ZNK6Phonon11AudioOutput13volumeDecibelEv @ 355 NONAME
+ _ZNK6Phonon11AudioOutput4nameEv @ 356 NONAME
+ _ZNK6Phonon11AudioOutput6volumeEv @ 357 NONAME
+ _ZNK6Phonon11AudioOutput7isMutedEv @ 358 NONAME
+ _ZNK6Phonon11AudioOutput8categoryEv @ 359 NONAME
+ _ZNK6Phonon11MediaObject10isSeekableEv @ 360 NONAME
+ _ZNK6Phonon11MediaObject10metaObjectEv @ 361 NONAME
+ _ZNK6Phonon11MediaObject11currentTimeEv @ 362 NONAME
+ _ZNK6Phonon11MediaObject11errorStringEv @ 363 NONAME
+ _ZNK6Phonon11MediaObject12tickIntervalEv @ 364 NONAME
+ _ZNK6Phonon11MediaObject13currentSourceEv @ 365 NONAME
+ _ZNK6Phonon11MediaObject13prefinishMarkEv @ 366 NONAME
+ _ZNK6Phonon11MediaObject13remainingTimeEv @ 367 NONAME
+ _ZNK6Phonon11MediaObject14transitionTimeEv @ 368 NONAME
+ _ZNK6Phonon11MediaObject5queueEv @ 369 NONAME
+ _ZNK6Phonon11MediaObject5stateEv @ 370 NONAME
+ _ZNK6Phonon11MediaObject8hasVideoEv @ 371 NONAME
+ _ZNK6Phonon11MediaObject8metaDataENS_8MetaDataE @ 372 NONAME
+ _ZNK6Phonon11MediaObject8metaDataERK7QString @ 373 NONAME
+ _ZNK6Phonon11MediaObject8metaDataEv @ 374 NONAME
+ _ZNK6Phonon11MediaObject9errorTypeEv @ 375 NONAME
+ _ZNK6Phonon11MediaObject9totalTimeEv @ 376 NONAME
+ _ZNK6Phonon11MediaSource10autoDeleteEv @ 377 NONAME
+ _ZNK6Phonon11MediaSource10deviceNameEv @ 378 NONAME
+ _ZNK6Phonon11MediaSource3urlEv @ 379 NONAME
+ _ZNK6Phonon11MediaSource4typeEv @ 380 NONAME
+ _ZNK6Phonon11MediaSource6streamEv @ 381 NONAME
+ _ZNK6Phonon11MediaSource8discTypeEv @ 382 NONAME
+ _ZNK6Phonon11MediaSource8fileNameEv @ 383 NONAME
+ _ZNK6Phonon11MediaSourceeqERKS0_ @ 384 NONAME
+ _ZNK6Phonon11VideoPlayer10metaObjectEv @ 385 NONAME
+ _ZNK6Phonon11VideoPlayer11audioOutputEv @ 386 NONAME
+ _ZNK6Phonon11VideoPlayer11currentTimeEv @ 387 NONAME
+ _ZNK6Phonon11VideoPlayer11mediaObjectEv @ 388 NONAME
+ _ZNK6Phonon11VideoPlayer11videoWidgetEv @ 389 NONAME
+ _ZNK6Phonon11VideoPlayer6volumeEv @ 390 NONAME
+ _ZNK6Phonon11VideoPlayer8isPausedEv @ 391 NONAME
+ _ZNK6Phonon11VideoPlayer9isPlayingEv @ 392 NONAME
+ _ZNK6Phonon11VideoPlayer9totalTimeEv @ 393 NONAME
+ _ZNK6Phonon11VideoWidget10brightnessEv @ 394 NONAME
+ _ZNK6Phonon11VideoWidget10metaObjectEv @ 395 NONAME
+ _ZNK6Phonon11VideoWidget10saturationEv @ 396 NONAME
+ _ZNK6Phonon11VideoWidget11aspectRatioEv @ 397 NONAME
+ _ZNK6Phonon11VideoWidget3hueEv @ 398 NONAME
+ _ZNK6Phonon11VideoWidget8contrastEv @ 399 NONAME
+ _ZNK6Phonon11VideoWidget9scaleModeEv @ 400 NONAME
+ _ZNK6Phonon12EffectWidget10metaObjectEv @ 401 NONAME
+ _ZNK6Phonon12GlobalConfig20audioOutputDeviceForENS_8CategoryEi @ 402 NONAME
+ _ZNK6Phonon12GlobalConfig21audioCaptureDeviceForENS_8CategoryEi @ 403 NONAME
+ _ZNK6Phonon12GlobalConfig24audioOutputDeviceListForENS_8CategoryEi @ 404 NONAME
+ _ZNK6Phonon12GlobalConfig25audioCaptureDeviceListForENS_8CategoryEi @ 405 NONAME
+ _ZNK6Phonon12VolumeSlider10metaObjectEv @ 406 NONAME
+ _ZNK6Phonon12VolumeSlider10singleStepEv @ 407 NONAME
+ _ZNK6Phonon12VolumeSlider11audioOutputEv @ 408 NONAME
+ _ZNK6Phonon12VolumeSlider11hasTrackingEv @ 409 NONAME
+ _ZNK6Phonon12VolumeSlider11orientationEv @ 410 NONAME
+ _ZNK6Phonon12VolumeSlider13isMuteVisibleEv @ 411 NONAME
+ _ZNK6Phonon12VolumeSlider13maximumVolumeEv @ 412 NONAME
+ _ZNK6Phonon12VolumeSlider8iconSizeEv @ 413 NONAME
+ _ZNK6Phonon12VolumeSlider8pageStepEv @ 414 NONAME
+ _ZNK6Phonon15EffectParameter11descriptionEv @ 415 NONAME
+ _ZNK6Phonon15EffectParameter12defaultValueEv @ 416 NONAME
+ _ZNK6Phonon15EffectParameter12maximumValueEv @ 417 NONAME
+ _ZNK6Phonon15EffectParameter12minimumValueEv @ 418 NONAME
+ _ZNK6Phonon15EffectParameter14possibleValuesEv @ 419 NONAME
+ _ZNK6Phonon15EffectParameter20isLogarithmicControlEv @ 420 NONAME
+ _ZNK6Phonon15EffectParameter2idEv @ 421 NONAME
+ _ZNK6Phonon15EffectParameter4nameEv @ 422 NONAME
+ _ZNK6Phonon15EffectParameter4typeEv @ 423 NONAME
+ _ZNK6Phonon15EffectParametereqERKS0_ @ 424 NONAME
+ _ZNK6Phonon15EffectParametergtERKS0_ @ 425 NONAME
+ _ZNK6Phonon15EffectParameterltERKS0_ @ 426 NONAME
+ _ZNK6Phonon15MediaController10metaObjectEv @ 427 NONAME
+ _ZNK6Phonon15MediaController12currentAngleEv @ 428 NONAME
+ _ZNK6Phonon15MediaController12currentTitleEv @ 429 NONAME
+ _ZNK6Phonon15MediaController14autoplayTitlesEv @ 430 NONAME
+ _ZNK6Phonon15MediaController14currentChapterEv @ 431 NONAME
+ _ZNK6Phonon15MediaController15availableAnglesEv @ 432 NONAME
+ _ZNK6Phonon15MediaController15availableTitlesEv @ 433 NONAME
+ _ZNK6Phonon15MediaController15currentSubtitleEv @ 434 NONAME
+ _ZNK6Phonon15MediaController17availableChaptersEv @ 435 NONAME
+ _ZNK6Phonon15MediaController17supportedFeaturesEv @ 436 NONAME
+ _ZNK6Phonon15MediaController18availableSubtitlesEv @ 437 NONAME
+ _ZNK6Phonon15MediaController19currentAudioChannelEv @ 438 NONAME
+ _ZNK6Phonon15MediaController22availableAudioChannelsEv @ 439 NONAME
+ _ZNK6Phonon17VolumeFaderEffect10metaObjectEv @ 440 NONAME
+ _ZNK6Phonon17VolumeFaderEffect13volumeDecibelEv @ 441 NONAME
+ _ZNK6Phonon17VolumeFaderEffect6volumeEv @ 442 NONAME
+ _ZNK6Phonon17VolumeFaderEffect9fadeCurveEv @ 443 NONAME
+ _ZNK6Phonon19AbstractAudioOutput10metaObjectEv @ 444 NONAME
+ _ZNK6Phonon19AbstractMediaStream10metaObjectEv @ 445 NONAME
+ _ZNK6Phonon19AbstractMediaStream10streamSizeEv @ 446 NONAME
+ _ZNK6Phonon19AbstractMediaStream14streamSeekableEv @ 447 NONAME
+ _ZNK6Phonon21ObjectDescriptionData11descriptionEv @ 448 NONAME
+ _ZNK6Phonon21ObjectDescriptionData13propertyNamesEv @ 449 NONAME
+ _ZNK6Phonon21ObjectDescriptionData4nameEv @ 450 NONAME
+ _ZNK6Phonon21ObjectDescriptionData5indexEv @ 451 NONAME
+ _ZNK6Phonon21ObjectDescriptionData7isValidEv @ 452 NONAME
+ _ZNK6Phonon21ObjectDescriptionData8propertyEPKc @ 453 NONAME
+ _ZNK6Phonon21ObjectDescriptionDataeqERKS0_ @ 454 NONAME
+ _ZNK6Phonon22AudioOutputInterface4219deviceAccessListForERKNS_17ObjectDescriptionILNS_21ObjectDescriptionTypeE0EEE @ 455 NONAME
+ _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EE10metaObjectEv @ 456 NONAME
+ _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EE10metaObjectEv @ 457 NONAME
+ _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EE10metaObjectEv @ 458 NONAME
+ _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EE10metaObjectEv @ 459 NONAME
+ _ZNK6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EE10metaObjectEv @ 460 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData15tupleIndexOrderEv @ 461 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData20supportedDropActionsEv @ 462 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData25tupleIndexAtPositionIndexEi @ 463 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData4dataERK11QModelIndexi @ 464 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData5flagsERK11QModelIndex @ 465 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData8mimeDataENS_21ObjectDescriptionTypeERK5QListI11QModelIndexE @ 466 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData8rowCountERK11QModelIndex @ 467 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData9mimeTypesENS_21ObjectDescriptionTypeE @ 468 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData9modelDataERK11QModelIndex @ 469 NONAME
+ _ZNK6Phonon26ObjectDescriptionModelData9modelDataEv @ 470 NONAME
+ _ZNK6Phonon4Path4sinkEv @ 471 NONAME
+ _ZNK6Phonon4Path6sourceEv @ 472 NONAME
+ _ZNK6Phonon4Path7effectsEv @ 473 NONAME
+ _ZNK6Phonon4Path7isValidEv @ 474 NONAME
+ _ZNK6Phonon4PatheqERKS0_ @ 475 NONAME
+ _ZNK6Phonon4PathneERKS0_ @ 476 NONAME
+ _ZNK6Phonon6Effect10metaObjectEv @ 477 NONAME
+ _ZNK6Phonon6Effect10parametersEv @ 478 NONAME
+ _ZNK6Phonon6Effect11descriptionEv @ 479 NONAME
+ _ZNK6Phonon6Effect14parameterValueERKNS_15EffectParameterE @ 480 NONAME
+ _ZNK6Phonon9MediaNode10inputPathsEv @ 481 NONAME
+ _ZNK6Phonon9MediaNode11outputPathsEv @ 482 NONAME
+ _ZNK6Phonon9MediaNode7isValidEv @ 483 NONAME
+ _ZTIN6Phonon10SeekSliderE @ 484 NONAME
+ _ZTIN6Phonon11AudioOutputE @ 485 NONAME
+ _ZTIN6Phonon11MediaObjectE @ 486 NONAME
+ _ZTIN6Phonon11VideoPlayerE @ 487 NONAME
+ _ZTIN6Phonon11VideoWidgetE @ 488 NONAME
+ _ZTIN6Phonon12EffectWidgetE @ 489 NONAME
+ _ZTIN6Phonon12GlobalConfigE @ 490 NONAME
+ _ZTIN6Phonon12VolumeSliderE @ 491 NONAME
+ _ZTIN6Phonon15MediaControllerE @ 492 NONAME
+ _ZTIN6Phonon15StreamInterfaceE @ 493 NONAME
+ _ZTIN6Phonon16MediaNodePrivateE @ 494 NONAME
+ _ZTIN6Phonon17VolumeFaderEffectE @ 495 NONAME
+ _ZTIN6Phonon18MediaSourcePrivateE @ 496 NONAME
+ _ZTIN6Phonon19AbstractAudioOutputE @ 497 NONAME
+ _ZTIN6Phonon19AbstractMediaStreamE @ 498 NONAME
+ _ZTIN6Phonon19AbstractVideoOutputE @ 499 NONAME
+ _ZTIN6Phonon26AbstractMediaStreamPrivateE @ 500 NONAME
+ _ZTIN6Phonon6EffectE @ 501 NONAME
+ _ZTIN6Phonon9MediaNodeE @ 502 NONAME
+ _ZTVN6Phonon10SeekSliderE @ 503 NONAME
+ _ZTVN6Phonon11AudioOutputE @ 504 NONAME
+ _ZTVN6Phonon11MediaObjectE @ 505 NONAME
+ _ZTVN6Phonon11VideoPlayerE @ 506 NONAME
+ _ZTVN6Phonon11VideoWidgetE @ 507 NONAME
+ _ZTVN6Phonon12EffectWidgetE @ 508 NONAME
+ _ZTVN6Phonon12GlobalConfigE @ 509 NONAME
+ _ZTVN6Phonon12VolumeSliderE @ 510 NONAME
+ _ZTVN6Phonon15MediaControllerE @ 511 NONAME
+ _ZTVN6Phonon15StreamInterfaceE @ 512 NONAME
+ _ZTVN6Phonon16MediaNodePrivateE @ 513 NONAME
+ _ZTVN6Phonon17VolumeFaderEffectE @ 514 NONAME
+ _ZTVN6Phonon18MediaSourcePrivateE @ 515 NONAME
+ _ZTVN6Phonon19AbstractAudioOutputE @ 516 NONAME
+ _ZTVN6Phonon19AbstractMediaStreamE @ 517 NONAME
+ _ZTVN6Phonon19AbstractVideoOutputE @ 518 NONAME
+ _ZTVN6Phonon26AbstractMediaStreamPrivateE @ 519 NONAME
+ _ZTVN6Phonon6EffectE @ 520 NONAME
+ _ZTVN6Phonon9MediaNodeE @ 521 NONAME
+ _ZThn8_N6Phonon10SeekSliderD0Ev @ 522 NONAME
+ _ZThn8_N6Phonon10SeekSliderD1Ev @ 523 NONAME
+ _ZThn8_N6Phonon11MediaObjectD0Ev @ 524 NONAME
+ _ZThn8_N6Phonon11MediaObjectD1Ev @ 525 NONAME
+ _ZThn8_N6Phonon11VideoPlayerD0Ev @ 526 NONAME
+ _ZThn8_N6Phonon11VideoPlayerD1Ev @ 527 NONAME
+ _ZThn8_N6Phonon12EffectWidgetD0Ev @ 528 NONAME
+ _ZThn8_N6Phonon12EffectWidgetD1Ev @ 529 NONAME
+ _ZThn8_N6Phonon12VolumeSliderD0Ev @ 530 NONAME
+ _ZThn8_N6Phonon12VolumeSliderD1Ev @ 531 NONAME
+ _ZThn8_N6Phonon19AbstractAudioOutputD0Ev @ 532 NONAME
+ _ZThn8_N6Phonon19AbstractAudioOutputD1Ev @ 533 NONAME
+ _ZThn8_N6Phonon6EffectD0Ev @ 534 NONAME
+ _ZThn8_N6Phonon6EffectD1Ev @ 535 NONAME
+ _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EEE @ 536 NONAME
+ _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EEE @ 537 NONAME
+ _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EEE @ 538 NONAME
+ _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EEE @ 539 NONAME
+ _ZTIN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EEE @ 540 NONAME
+ _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE0EEE @ 541 NONAME
+ _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE1EEE @ 542 NONAME
+ _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE2EEE @ 543 NONAME
+ _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE3EEE @ 544 NONAME
+ _ZTVN6Phonon22ObjectDescriptionModelILNS_21ObjectDescriptionTypeE4EEE @ 545 NONAME
diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby
index 3a7f008..bc69dce 100644
--- a/src/s60installs/qt.iby
+++ b/src/s60installs/qt.iby
@@ -49,10 +49,14 @@ file=ABI_DIR\BUILD_DIR\QtGui.dll SHARED_LIB_DIR\QtGui.dll PAG
file=ABI_DIR\BUILD_DIR\QtOpenGL.dll SHARED_LIB_DIR\QtOpenGL.dll PAGED
file=ABI_DIR\BUILD_DIR\QtOpenVG.dll SHARED_LIB_DIR\QtOpenVG.dll PAGED
file=ABI_DIR\BUILD_DIR\QtSvg.dll SHARED_LIB_DIR\QtSvg.dll PAGED
+file=ABI_DIR\BUILD_DIR\QtSql.dll SHARED_LIB_DIR\QtSql.dll PAGED
file=ABI_DIR\BUILD_DIR\QtXml.dll SHARED_LIB_DIR\QtXml.dll PAGED
file=ABI_DIR\BUILD_DIR\QtNetwork.dll SHARED_LIB_DIR\QtNetwork.dll PAGED
file=ABI_DIR\BUILD_DIR\QtScript.dll SHARED_LIB_DIR\QtScript.dll PAGED
file=ABI_DIR\BUILD_DIR\QtTest.dll SHARED_LIB_DIR\QtTest.dll PAGED
+file=ABI_DIR\BUILD_DIR\QtWebKit.dll SHARED_LIB_DIR\QtWebKit.dll PAGED
+file=ABI_DIR\BUILD_DIR\phonon.dll SHARED_LIB_DIR\phonon.dll PAGED
+file=ABI_DIR\BUILD_DIR\QtMultimedia.dll SHARED_LIB_DIR\QtMultimedia.dll PAGED
// imageformats
file=ABI_DIR\BUILD_DIR\qgif.dll SHARED_LIB_DIR\qgif.dll PAGED
@@ -77,6 +81,10 @@ file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll PAG
// graphicssystems
file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll PAGED
+// S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM,
+// so don't bother including those plugins
+file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll PAGED
+
S60_APP_RESOURCE(s60main)
// imageformats stubs
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 9bc4d6b..3d5049e 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -345,15 +345,10 @@ public:
namespace QScript
{
-struct GlobalClientData : public JSC::JSGlobalData::ClientData
+void GlobalClientData::mark(JSC::MarkStack& markStack)
{
- GlobalClientData(QScriptEnginePrivate *e)
- : engine(e) {}
- virtual ~GlobalClientData() {}
- virtual void mark(JSC::MarkStack& markStack) { engine->mark(markStack); }
-
- QScriptEnginePrivate *engine;
-};
+ engine->mark(markStack);
+}
class TimeoutCheckerProxy : public JSC::TimeoutChecker
{
@@ -454,11 +449,6 @@ qsreal integerFromString(const QString &str, int radix)
return integerFromString(ba.constData(), ba.size(), radix);
}
-QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec)
-{
- return static_cast<GlobalClientData*>(exec->globalData().clientData)->engine;
-}
-
bool isFunction(JSC::JSValue value)
{
if (!value || !value.isObject())
@@ -799,6 +789,10 @@ QScriptEnginePrivate::QScriptEnginePrivate()
registeredScriptStrings(0), inEval(false)
{
qMetaTypeId<QScriptValue>();
+ qMetaTypeId<QList<int> >();
+#ifndef QT_NO_QOBJECT
+ qMetaTypeId<QObjectList>();
+#endif
JSC::initializeThreading(); // ### hmmm
@@ -993,26 +987,6 @@ void QScriptEnginePrivate::setDefaultPrototype(int metaTypeId, JSC::JSValue prot
info->prototype = prototype;
}
-QScriptContext *QScriptEnginePrivate::contextForFrame(JSC::ExecState *frame)
-{
- if (frame && frame->callerFrame()->hasHostCallFrameFlag() && !frame->callee()
- && frame->callerFrame()->removeHostCallFrameFlag() == QScript::scriptEngineFromExec(frame)->globalExec()) {
- //skip the "fake" context created in Interpreter::execute.
- frame = frame->callerFrame()->removeHostCallFrameFlag();
- }
- return reinterpret_cast<QScriptContext *>(frame);
-}
-
-JSC::ExecState *QScriptEnginePrivate::frameForContext(QScriptContext *context)
-{
- return reinterpret_cast<JSC::ExecState*>(context);
-}
-
-const JSC::ExecState *QScriptEnginePrivate::frameForContext(const QScriptContext *context)
-{
- return reinterpret_cast<const JSC::ExecState*>(context);
-}
-
JSC::JSGlobalObject *QScriptEnginePrivate::originalGlobalObject() const
{
return globalData->head;
@@ -1054,11 +1028,6 @@ void QScriptEnginePrivate::setGlobalObject(JSC::JSObject *object)
}
}
-JSC::ExecState *QScriptEnginePrivate::globalExec() const
-{
- return originalGlobalObject()->globalExec();
-}
-
/*!
\internal
@@ -2412,7 +2381,7 @@ bool QScriptEngine::hasUncaughtException() const
{
Q_D(const QScriptEngine);
JSC::ExecState* exec = d->globalExec();
- return exec->hadException();
+ return exec->hadException() || d->currentException().isValid();
}
/*!
@@ -2429,8 +2398,13 @@ bool QScriptEngine::hasUncaughtException() const
QScriptValue QScriptEngine::uncaughtException() const
{
Q_D(const QScriptEngine);
+ QScriptValue result;
JSC::ExecState* exec = d->globalExec();
- return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(exec->exception());
+ if (exec->hadException())
+ result = const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(exec->exception());
+ else
+ result = d->currentException();
+ return result;
}
/*!
@@ -2483,6 +2457,7 @@ void QScriptEngine::clearExceptions()
Q_D(QScriptEngine);
JSC::ExecState* exec = d->currentFrame;
exec->clearException();
+ d->clearCurrentException();
}
/*!
@@ -2564,63 +2539,50 @@ QScriptValue QScriptEngine::create(int type, const void *ptr)
QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
{
+ Q_Q(QScriptEngine);
Q_ASSERT(ptr != 0);
QScriptValue result;
QScriptTypeInfo *info = m_typeInfos.value(type);
if (info && info->marshal) {
- result = info->marshal(q_func(), ptr);
+ result = info->marshal(q, ptr);
} else {
// check if it's one of the types we know
switch (QMetaType::Type(type)) {
case QMetaType::Void:
- result = QScriptValue(QScriptValue::UndefinedValue);
- break;
+ return QScriptValue(q, QScriptValue::UndefinedValue);
case QMetaType::Bool:
- result = QScriptValue(*reinterpret_cast<const bool*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const bool*>(ptr));
case QMetaType::Int:
- result = QScriptValue(*reinterpret_cast<const int*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const int*>(ptr));
case QMetaType::UInt:
- result = QScriptValue(*reinterpret_cast<const uint*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const uint*>(ptr));
case QMetaType::LongLong:
- result = QScriptValue(qsreal(*reinterpret_cast<const qlonglong*>(ptr)));
- break;
+ return QScriptValue(q, qsreal(*reinterpret_cast<const qlonglong*>(ptr)));
case QMetaType::ULongLong:
#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804
#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.")
- result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
+ return QScriptValue(q, qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)
- result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
+ return QScriptValue(q, qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
#else
- result = QScriptValue(qsreal(*reinterpret_cast<const qulonglong*>(ptr)));
+ return QScriptValue(q, qsreal(*reinterpret_cast<const qulonglong*>(ptr)));
#endif
- break;
case QMetaType::Double:
- result = QScriptValue(*reinterpret_cast<const double*>(ptr));
- break;
+ return QScriptValue(q, qsreal(*reinterpret_cast<const double*>(ptr)));
case QMetaType::QString:
- result = QScriptValue(q_func(), *reinterpret_cast<const QString*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const QString*>(ptr));
case QMetaType::Float:
- result = QScriptValue(*reinterpret_cast<const float*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const float*>(ptr));
case QMetaType::Short:
- result = QScriptValue(*reinterpret_cast<const short*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const short*>(ptr));
case QMetaType::UShort:
- result = QScriptValue(*reinterpret_cast<const unsigned short*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const unsigned short*>(ptr));
case QMetaType::Char:
- result = QScriptValue(*reinterpret_cast<const char*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const char*>(ptr));
case QMetaType::UChar:
- result = QScriptValue(*reinterpret_cast<const unsigned char*>(ptr));
- break;
+ return QScriptValue(q, *reinterpret_cast<const unsigned char*>(ptr));
case QMetaType::QChar:
- result = QScriptValue((*reinterpret_cast<const QChar*>(ptr)).unicode());
- break;
+ return QScriptValue(q, (*reinterpret_cast<const QChar*>(ptr)).unicode());
case QMetaType::QStringList:
result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr));
break;
@@ -2631,38 +2593,38 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr));
break;
case QMetaType::QDateTime:
- result = q_func()->newDate(*reinterpret_cast<const QDateTime *>(ptr));
+ result = q->newDate(*reinterpret_cast<const QDateTime *>(ptr));
break;
case QMetaType::QDate:
- result = q_func()->newDate(QDateTime(*reinterpret_cast<const QDate *>(ptr)));
+ result = q->newDate(QDateTime(*reinterpret_cast<const QDate *>(ptr)));
break;
#ifndef QT_NO_REGEXP
case QMetaType::QRegExp:
- result = q_func()->newRegExp(*reinterpret_cast<const QRegExp *>(ptr));
+ result = q->newRegExp(*reinterpret_cast<const QRegExp *>(ptr));
break;
#endif
#ifndef QT_NO_QOBJECT
case QMetaType::QObjectStar:
case QMetaType::QWidgetStar:
- result = q_func()->newQObject(*reinterpret_cast<QObject* const *>(ptr));
+ result = q->newQObject(*reinterpret_cast<QObject* const *>(ptr));
break;
#endif
default:
if (type == qMetaTypeId<QScriptValue>()) {
result = *reinterpret_cast<const QScriptValue*>(ptr);
if (!result.isValid())
- result = QScriptValue(QScriptValue::UndefinedValue);
+ return QScriptValue(q, QScriptValue::UndefinedValue);
}
#ifndef QT_NO_QOBJECT
// lazy registration of some common list types
else if (type == qMetaTypeId<QObjectList>()) {
- qScriptRegisterSequenceMetaType<QObjectList>(q_func());
+ qScriptRegisterSequenceMetaType<QObjectList>(q);
return create(type, ptr);
}
#endif
else if (type == qMetaTypeId<QList<int> >()) {
- qScriptRegisterSequenceMetaType<QList<int> >(q_func());
+ qScriptRegisterSequenceMetaType<QList<int> >(q);
return create(type, ptr);
}
@@ -2671,9 +2633,9 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
if (typeName == "QVariant")
result = scriptValueFromVariant(*reinterpret_cast<const QVariant*>(ptr));
if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr))
- result = QScriptValue(QScriptValue::NullValue);
+ return QScriptValue(q, QScriptValue::NullValue);
else
- result = q_func()->newVariant(QVariant(type, ptr));
+ result = q->newVariant(QVariant(type, ptr));
}
}
}
@@ -2688,8 +2650,8 @@ bool QScriptEnginePrivate::convert(const QScriptValue &value,
int type, void *ptr,
QScriptEnginePrivate *eng)
{
- if (!eng && value.engine())
- eng = QScriptEnginePrivate::get(value.engine());
+ if (!eng)
+ eng = QScriptValuePrivate::getEngine(value);
if (eng) {
QScriptTypeInfo *info = eng->m_typeInfos.value(type);
if (info && info->demarshal) {
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index 22de29c..d12b0f4 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -102,11 +102,22 @@ namespace QScript
class TimeoutCheckerProxy;
//some conversion helper functions
- QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec);
+ inline QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec);
bool isFunction(JSC::JSValue value);
class UStringSourceProviderWithFeedback;
-}
+
+struct GlobalClientData : public JSC::JSGlobalData::ClientData
+{
+ GlobalClientData(QScriptEnginePrivate *e)
+ : engine(e) {}
+ virtual ~GlobalClientData() {}
+ virtual void mark(JSC::MarkStack& markStack);
+
+ QScriptEnginePrivate *engine;
+};
+
+} // namespace QScript
class QScriptEnginePrivate
#ifndef QT_NO_QOBJECT
@@ -148,16 +159,16 @@ public:
JSC::JSValue defaultPrototype(int metaTypeId) const;
void setDefaultPrototype(int metaTypeId, JSC::JSValue prototype);
- static QScriptContext *contextForFrame(JSC::ExecState *frame);
- static JSC::ExecState *frameForContext(QScriptContext *context);
- static const JSC::ExecState *frameForContext(const QScriptContext *context);
+ static inline QScriptContext *contextForFrame(JSC::ExecState *frame);
+ static inline JSC::ExecState *frameForContext(QScriptContext *context);
+ static inline const JSC::ExecState *frameForContext(const QScriptContext *context);
JSC::JSGlobalObject *originalGlobalObject() const;
JSC::JSObject *getOriginalGlobalObjectProxy();
JSC::JSObject *customGlobalObject() const;
JSC::JSObject *globalObject() const;
void setGlobalObject(JSC::JSObject *object);
- JSC::ExecState *globalExec() const;
+ inline JSC::ExecState *globalExec() const;
JSC::JSValue toUsableValue(JSC::JSValue value);
static JSC::JSValue thisForContext(JSC::ExecState *frame);
static JSC::Register *thisRegisterForFrame(JSC::ExecState *frame);
@@ -184,6 +195,10 @@ public:
void agentDeleted(QScriptEngineAgent *agent);
+ void setCurrentException(QScriptValue exception) { m_currentException = exception; }
+ QScriptValue currentException() const { return m_currentException; }
+ void clearCurrentException() { m_currentException.d_ptr.reset(); }
+
#ifndef QT_NO_QOBJECT
JSC::JSValue newQObject(QObject *object,
QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership,
@@ -268,6 +283,7 @@ public:
QSet<QString> extensionsBeingImported;
QHash<intptr_t, QScript::UStringSourceProviderWithFeedback*> loadedScripts;
+ QScriptValue m_currentException;
#ifndef QT_NO_QOBJECT
QHash<QObject*, QScript::QObjectData*> m_qobjectData;
@@ -367,6 +383,11 @@ private:
JSC::ExecState *oldFrame;
};
+inline QScriptEnginePrivate *scriptEngineFromExec(const JSC::ExecState *exec)
+{
+ return static_cast<GlobalClientData*>(exec->globalData().clientData)->engine;
+}
+
} // namespace QScript
inline QScriptValuePrivate *QScriptEnginePrivate::allocateScriptValuePrivate(size_t size)
@@ -451,7 +472,7 @@ inline void QScriptValuePrivate::initFrom(JSC::JSValue value)
engine->registerScriptValue(this);
}
-inline void QScriptValuePrivate::initFrom(double value)
+inline void QScriptValuePrivate::initFrom(qsreal value)
{
type = Number;
numberValue = value;
@@ -473,6 +494,28 @@ inline QScriptValue QScriptValuePrivate::property(const QString &name, int resol
return property(JSC::Identifier(exec, name), resolveMode);
}
+inline QScriptValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const
+{
+ Q_ASSERT(isObject());
+ JSC::ExecState *exec = engine->currentFrame;
+ JSC::JSObject *object = JSC::asObject(jscValue);
+ JSC::PropertySlot slot(object);
+ if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, id, slot))
+ return engine->scriptValueFromJSCValue(slot.getValue(exec, id));
+ return propertyHelper(id, resolveMode);
+}
+
+inline QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
+{
+ Q_ASSERT(isObject());
+ JSC::ExecState *exec = engine->currentFrame;
+ JSC::JSObject *object = JSC::asObject(jscValue);
+ JSC::PropertySlot slot(object);
+ if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, index, slot))
+ return engine->scriptValueFromJSCValue(slot.getValue(exec, index));
+ return propertyHelper(index, resolveMode);
+}
+
inline void* QScriptValuePrivate::operator new(size_t size, QScriptEnginePrivate *engine)
{
if (engine)
@@ -489,6 +532,22 @@ inline void QScriptValuePrivate::operator delete(void *ptr)
qFree(d);
}
+inline void QScriptValuePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val)
+{
+ if (exec) {
+ *val = exec->exception();
+ exec->clearException();
+ } else {
+ *val = JSC::JSValue();
+ }
+}
+
+inline void QScriptValuePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val)
+{
+ if (exec && val)
+ exec->setException(val);
+}
+
inline void QScriptEnginePrivate::registerScriptString(QScriptStringPrivate *value)
{
Q_ASSERT(value->type == QScriptStringPrivate::HeapAllocated);
@@ -512,6 +571,31 @@ inline void QScriptEnginePrivate::unregisterScriptString(QScriptStringPrivate *v
value->next = 0;
}
+inline QScriptContext *QScriptEnginePrivate::contextForFrame(JSC::ExecState *frame)
+{
+ if (frame && frame->callerFrame()->hasHostCallFrameFlag() && !frame->callee()
+ && frame->callerFrame()->removeHostCallFrameFlag() == QScript::scriptEngineFromExec(frame)->globalExec()) {
+ //skip the "fake" context created in Interpreter::execute.
+ frame = frame->callerFrame()->removeHostCallFrameFlag();
+ }
+ return reinterpret_cast<QScriptContext *>(frame);
+}
+
+inline JSC::ExecState *QScriptEnginePrivate::frameForContext(QScriptContext *context)
+{
+ return reinterpret_cast<JSC::ExecState*>(context);
+}
+
+inline const JSC::ExecState *QScriptEnginePrivate::frameForContext(const QScriptContext *context)
+{
+ return reinterpret_cast<const JSC::ExecState*>(context);
+}
+
+inline JSC::ExecState *QScriptEnginePrivate::globalExec() const
+{
+ return originalGlobalObject()->globalExec();
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/script/api/qscriptengineagent.cpp b/src/script/api/qscriptengineagent.cpp
index bc2eea2..0ca7ecc 100644
--- a/src/script/api/qscriptengineagent.cpp
+++ b/src/script/api/qscriptengineagent.cpp
@@ -156,6 +156,7 @@ void QScriptEngineAgentPrivate::exceptionThrow(const JSC::DebuggerCallFrame& fra
QScriptValue value(engine->scriptValueFromJSCValue(frame.exception()));
q_ptr->exceptionThrow(sourceID, value, hasHandler);
engine->currentFrame = oldFrame;
+ engine->setCurrentException(value);
};
void QScriptEngineAgentPrivate::exceptionCatch(const JSC::DebuggerCallFrame& frame, intptr_t sourceID)
@@ -165,6 +166,7 @@ void QScriptEngineAgentPrivate::exceptionCatch(const JSC::DebuggerCallFrame& fra
QScriptValue value(engine->scriptValueFromJSCValue(frame.exception()));
q_ptr->exceptionCatch(sourceID, value);
engine->currentFrame = oldFrame;
+ engine->clearCurrentException();
}
void QScriptEngineAgentPrivate::atStatement(const JSC::DebuggerCallFrame& frame, intptr_t sourceID, int lineno, int column)
diff --git a/src/script/api/qscriptstring.cpp b/src/script/api/qscriptstring.cpp
index 2fb157f..1ede51c 100644
--- a/src/script/api/qscriptstring.cpp
+++ b/src/script/api/qscriptstring.cpp
@@ -139,8 +139,7 @@ QScriptString &QScriptString::operator=(const QScriptString &other)
*/
bool QScriptString::isValid() const
{
- Q_D(const QScriptString);
- return (d && d->engine);
+ return QScriptStringPrivate::isValid(*this);
}
/*!
diff --git a/src/script/api/qscriptstring_p.h b/src/script/api/qscriptstring_p.h
index d3bb47d..8e344e8 100644
--- a/src/script/api/qscriptstring_p.h
+++ b/src/script/api/qscriptstring_p.h
@@ -77,6 +77,8 @@ public:
inline void detachFromEngine();
+ static inline bool isValid(const QScriptString &q);
+
QBasicAtomicInt ref;
QScriptEnginePrivate *engine;
JSC::Identifier identifier;
@@ -114,6 +116,11 @@ inline void QScriptStringPrivate::detachFromEngine()
identifier = JSC::Identifier();
}
+inline bool QScriptStringPrivate::isValid(const QScriptString &q)
+{
+ return (q.d_ptr && q.d_ptr->engine);
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index b8340a7..52a1e6d 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -213,7 +213,7 @@ qint32 ToInt32(qsreal n)
if (qIsNaN(n) || qIsInf(n) || (n == 0))
return 0;
- double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal sign = (n < 0) ? -1.0 : 1.0;
qsreal abs_n = fabs(n);
n = ::fmod(sign * ::floor(abs_n), D32);
@@ -233,7 +233,7 @@ quint32 ToUint32(qsreal n)
if (qIsNaN(n) || qIsInf(n) || (n == 0))
return 0;
- double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal sign = (n < 0) ? -1.0 : 1.0;
qsreal abs_n = fabs(n);
n = ::fmod(sign * ::floor(abs_n), D32);
@@ -251,7 +251,7 @@ quint16 ToUint16(qsreal n)
if (qIsNaN(n) || qIsInf(n) || (n == 0))
return 0;
- double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal sign = (n < 0) ? -1.0 : 1.0;
qsreal abs_n = fabs(n);
n = ::fmod(sign * ::floor(abs_n), D16);
@@ -276,41 +276,36 @@ qsreal ToInteger(qsreal n)
} // namespace QScript
-QScriptValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const
+QScriptValue QScriptValuePrivate::propertyHelper(const JSC::Identifier &id, int resolveMode) const
{
- Q_ASSERT(isObject());
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
- JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
JSC::JSValue result;
- if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) {
- result = slot.getValue(exec, id);
- } else {
- if ((resolveMode & QScriptValue::ResolvePrototype)
- && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, id, slot)) {
+ if (!(resolveMode & QScriptValue::ResolvePrototype)) {
+ // Look in the object's own properties
+ JSC::ExecState *exec = engine->currentFrame;
+ JSC::JSObject *object = JSC::asObject(jscValue);
+ JSC::PropertySlot slot(object);
+ if (object->getOwnPropertySlot(exec, id, slot))
result = slot.getValue(exec, id);
- } else if (resolveMode & QScriptValue::ResolveScope) {
- // ### check if it's a function object and look in the scope chain
- QScriptValue scope = property(QString::fromLatin1("__qt_scope__"), QScriptValue::ResolveLocal);
- if (scope.isObject())
- result = engine->scriptValueToJSCValue(QScriptValuePrivate::get(scope)->property(id, resolveMode));
- }
+ }
+ if (!result && (resolveMode & QScriptValue::ResolveScope)) {
+ // ### check if it's a function object and look in the scope chain
+ QScriptValue scope = property(QString::fromLatin1("__qt_scope__"), QScriptValue::ResolveLocal);
+ if (scope.isObject())
+ result = engine->scriptValueToJSCValue(QScriptValuePrivate::get(scope)->property(id, resolveMode));
}
return engine->scriptValueFromJSCValue(result);
}
-QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
+QScriptValue QScriptValuePrivate::propertyHelper(quint32 index, int resolveMode) const
{
- Q_ASSERT(isObject());
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
- JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
JSC::JSValue result;
- if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, index, slot)) {
- result = slot.getValue(exec, index);
- } else if ((resolveMode & QScriptValue::ResolvePrototype)
- && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, index, slot)) {
- result = slot.getValue(exec, index);
+ if (!(resolveMode & QScriptValue::ResolvePrototype)) {
+ // Look in the object's own properties
+ JSC::ExecState *exec = engine->currentFrame;
+ JSC::JSObject *object = JSC::asObject(jscValue);
+ JSC::PropertySlot slot(object);
+ if (object->getOwnPropertySlot(exec, index, slot))
+ result = slot.getValue(exec, index);
}
return engine->scriptValueFromJSCValue(result);
}
@@ -318,8 +313,8 @@ QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
void QScriptValuePrivate::setProperty(const JSC::Identifier &id, const QScriptValue &value,
const QScriptValue::PropertyFlags &flags)
{
- QScriptEngine *valueEngine = value.engine();
- if (valueEngine && (QScriptEnginePrivate::get(valueEngine) != engine)) {
+ QScriptEnginePrivate *valueEngine = QScriptValuePrivate::getEngine(value);
+ if (valueEngine && (valueEngine != engine)) {
qWarning("QScriptValue::setProperty(%s) failed: "
"cannot set value created in a different engine",
qPrintable(QString(id.ustring())));
@@ -443,22 +438,6 @@ void QScriptValuePrivate::setVariantValue(const QVariant &value)
static_cast<QScript::QVariantDelegate*>(delegate)->setValue(value);
}
-void QScriptValuePrivate::saveException(JSC::ExecState *exec, JSC::JSValue *val)
-{
- if (exec) {
- *val = exec->exception();
- exec->clearException();
- } else {
- *val = JSC::JSValue();
- }
-}
-
-void QScriptValuePrivate::restoreException(JSC::ExecState *exec, JSC::JSValue val)
-{
- if (exec && val)
- exec->setException(val);
-}
-
void QScriptValuePrivate::detachFromEngine()
{
if (isJSC())
@@ -822,8 +801,8 @@ void QScriptValue::setPrototype(const QScriptValue &prototype)
Q_D(QScriptValue);
if (!d || !d->isObject())
return;
- if (prototype.isValid() && prototype.engine()
- && (prototype.engine() != engine())) {
+ if (prototype.isValid() && QScriptValuePrivate::getEngine(prototype)
+ && (QScriptValuePrivate::getEngine(prototype) != d->engine)) {
qWarning("QScriptValue::setPrototype() failed: "
"cannot set a prototype created in "
"a different engine");
@@ -864,8 +843,8 @@ void QScriptValue::setScope(const QScriptValue &scope)
Q_D(QScriptValue);
if (!d || !d->isObject())
return;
- if (scope.isValid() && scope.engine()
- && (scope.engine() != engine())) {
+ if (scope.isValid() && QScriptValuePrivate::getEngine(scope)
+ && (QScriptValuePrivate::getEngine(scope) != d->engine)) {
qWarning("QScriptValue::setScope() failed: "
"cannot set a scope object created in "
"a different engine");
@@ -896,7 +875,7 @@ bool QScriptValue::instanceOf(const QScriptValue &other) const
Q_D(const QScriptValue);
if (!d || !d->isObject() || !other.isObject())
return false;
- if (other.engine() != engine()) {
+ if (QScriptValuePrivate::getEngine(other) != d->engine) {
qWarning("QScriptValue::instanceof: "
"cannot perform operation on a value created in "
"a different engine");
@@ -1083,10 +1062,12 @@ static bool Equals(QScriptValue lhs, QScriptValue rhs)
*/
bool QScriptValue::lessThan(const QScriptValue &other) const
{
+ Q_D(const QScriptValue);
// no equivalent function in JSC? There's a jsLess() in VM/Machine.cpp
if (!isValid() || !other.isValid())
return false;
- if (other.engine() && engine() && (other.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(other) && d->engine
+ && (QScriptValuePrivate::getEngine(other) != d->engine)) {
qWarning("QScriptValue::lessThan: "
"cannot compare to a value created in "
"a different engine");
@@ -1124,7 +1105,8 @@ bool QScriptValue::equals(const QScriptValue &other) const
Q_D(const QScriptValue);
if (!d || !other.d_ptr)
return (d_ptr == other.d_ptr);
- if (other.engine() && engine() && (other.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(other) && d->engine
+ && (QScriptValuePrivate::getEngine(other) != d->engine)) {
qWarning("QScriptValue::equals: "
"cannot compare to a value created in "
"a different engine");
@@ -1173,7 +1155,8 @@ bool QScriptValue::strictlyEquals(const QScriptValue &other) const
Q_D(const QScriptValue);
if (!d || !other.d_ptr)
return (d_ptr == other.d_ptr);
- if (other.engine() && engine() && (other.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(other) && d->engine
+ && (QScriptValuePrivate::getEngine(other) != d->engine)) {
qWarning("QScriptValue::strictlyEquals: "
"cannot compare to a value created in "
"a different engine");
@@ -1725,7 +1708,8 @@ void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value,
Q_D(QScriptValue);
if (!d || !d->isObject())
return;
- if (value.engine() && (value.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(value)
+ && (QScriptValuePrivate::getEngine(value) != d->engine)) {
qWarning("QScriptValue::setProperty() failed: "
"cannot set value created in a different engine");
return;
@@ -1775,7 +1759,7 @@ QScriptValue QScriptValue::property(const QScriptString &name,
const ResolveFlags &mode) const
{
Q_D(const QScriptValue);
- if (!d || !d->isObject() || !name.isValid())
+ if (!d || !d->isObject() || !QScriptStringPrivate::isValid(name))
return QScriptValue();
return d->property(name.d_ptr->identifier, mode);
}
@@ -1798,7 +1782,7 @@ void QScriptValue::setProperty(const QScriptString &name,
const PropertyFlags &flags)
{
Q_D(QScriptValue);
- if (!d || !d->isObject() || !name.isValid())
+ if (!d || !d->isObject() || !QScriptStringPrivate::isValid(name))
return;
d->setProperty(name.d_ptr->identifier, value, flags);
}
@@ -1832,7 +1816,7 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QScriptString &nam
const ResolveFlags &mode) const
{
Q_D(const QScriptValue);
- if (!d || !d->isObject() || !name.isValid())
+ if (!d || !d->isObject() || !QScriptStringPrivate::isValid(name))
return 0;
return d->propertyFlags(name.d_ptr->identifier, mode);
}
@@ -1872,7 +1856,8 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
if (callType == JSC::CallTypeNone)
return QScriptValue();
- if (thisObject.engine() && (thisObject.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(thisObject)
+ && (QScriptValuePrivate::getEngine(thisObject) != d->engine)) {
qWarning("QScriptValue::call() failed: "
"cannot call function with thisObject created in "
"a different engine");
@@ -1890,7 +1875,8 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
const QScriptValue &arg = args.at(i);
if (!arg.isValid()) {
argsVector[i] = JSC::jsUndefined();
- } else if (arg.engine() && (arg.engine() != engine())) {
+ } else if (QScriptValuePrivate::getEngine(arg)
+ && (QScriptValuePrivate::getEngine(arg) != d->engine)) {
qWarning("QScriptValue::call() failed: "
"cannot call function with argument created in "
"a different engine");
@@ -1947,7 +1933,8 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
if (callType == JSC::CallTypeNone)
return QScriptValue();
- if (thisObject.engine() && (thisObject.engine() != engine())) {
+ if (QScriptValuePrivate::getEngine(thisObject)
+ && (QScriptValuePrivate::getEngine(thisObject) != d->engine)) {
qWarning("QScriptValue::call() failed: "
"cannot call function with thisObject created in "
"a different engine");
diff --git a/src/script/api/qscriptvalue.h b/src/script/api/qscriptvalue.h
index 32f7a43..aba3327 100644
--- a/src/script/api/qscriptvalue.h
+++ b/src/script/api/qscriptvalue.h
@@ -70,6 +70,7 @@ typedef QList<QScriptValue> QScriptValueList;
typedef double qsreal;
class QScriptValuePrivate;
+class QScriptEnginePrivate;
struct QScriptValuePrivatePointerDeleter;
class Q_SCRIPT_EXPORT QScriptValue
{
@@ -226,6 +227,8 @@ private:
QExplicitlySharedDataPointer<QScriptValuePrivate> d_ptr;
Q_DECLARE_PRIVATE(QScriptValue)
+
+ friend class QScriptEnginePrivate;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QScriptValue::ResolveFlags)
diff --git a/src/script/api/qscriptvalue_p.h b/src/script/api/qscriptvalue_p.h
index 77b5084..c322a37 100644
--- a/src/script/api/qscriptvalue_p.h
+++ b/src/script/api/qscriptvalue_p.h
@@ -81,7 +81,7 @@ public:
inline ~QScriptValuePrivate();
inline void initFrom(JSC::JSValue value);
- inline void initFrom(double value);
+ inline void initFrom(qsreal value);
inline void initFrom(const QString &value);
inline bool isJSC() const;
@@ -100,8 +100,17 @@ public:
return QScriptValue(d);
}
- QScriptValue property(const JSC::Identifier &id, int resolveMode) const;
- QScriptValue property(quint32 index, int resolveMode) const;
+ static inline QScriptEnginePrivate *getEngine(const QScriptValue &q)
+ {
+ if (!q.d_ptr)
+ return 0;
+ return q.d_ptr->engine;
+ }
+
+ inline QScriptValue property(const JSC::Identifier &id, int resolveMode) const;
+ QScriptValue propertyHelper(const JSC::Identifier &id, int resolveMode) const;
+ inline QScriptValue property(quint32 index, int resolveMode) const;
+ QScriptValue propertyHelper(quint32, int resolveMode) const;
inline QScriptValue property(const QString &, int resolveMode) const;
void setProperty(const JSC::Identifier &id, const QScriptValue &value,
const QScriptValue::PropertyFlags &flags);
@@ -118,13 +127,13 @@ public:
return -1;
}
- static void saveException(JSC::ExecState*, JSC::JSValue*);
- static void restoreException(JSC::ExecState*, JSC::JSValue);
+ static inline void saveException(JSC::ExecState*, JSC::JSValue*);
+ static inline void restoreException(JSC::ExecState*, JSC::JSValue);
QScriptEnginePrivate *engine;
Type type;
JSC::JSValue jscValue;
- double numberValue;
+ qsreal numberValue;
QString stringValue;
// linked list of engine's script values
diff --git a/src/script/bridge/qscriptclassobject.cpp b/src/script/bridge/qscriptclassobject.cpp
index 0d88532..1dde98b 100644
--- a/src/script/bridge/qscriptclassobject.cpp
+++ b/src/script/bridge/qscriptclassobject.cpp
@@ -70,17 +70,6 @@ ClassObjectDelegate::~ClassObjectDelegate()
{
}
-QScriptClass *ClassObjectDelegate::scriptClass() const
-{
- return m_scriptClass;
-}
-
-void ClassObjectDelegate::setScriptClass(QScriptClass *scriptClass)
-{
- Q_ASSERT(scriptClass != 0);
- m_scriptClass = scriptClass;
-}
-
QScriptObjectDelegate::Type ClassObjectDelegate::type() const
{
return ClassObject;
diff --git a/src/script/bridge/qscriptclassobject_p.h b/src/script/bridge/qscriptclassobject_p.h
index f5cce76..9b34244 100644
--- a/src/script/bridge/qscriptclassobject_p.h
+++ b/src/script/bridge/qscriptclassobject_p.h
@@ -70,8 +70,8 @@ public:
ClassObjectDelegate(QScriptClass *scriptClass);
~ClassObjectDelegate();
- QScriptClass *scriptClass() const;
- void setScriptClass(QScriptClass *scriptClass);
+ inline QScriptClass *scriptClass() const;
+ inline void setScriptClass(QScriptClass *scriptClass);
virtual Type type() const;
@@ -105,6 +105,17 @@ private:
QScriptClass *m_scriptClass;
};
+inline QScriptClass *ClassObjectDelegate::scriptClass() const
+{
+ return m_scriptClass;
+}
+
+inline void ClassObjectDelegate::setScriptClass(QScriptClass *scriptClass)
+{
+ Q_ASSERT(scriptClass != 0);
+ m_scriptClass = scriptClass;
+}
+
} // namespace QScript
QT_END_NAMESPACE
diff --git a/src/script/bridge/qscriptobject.cpp b/src/script/bridge/qscriptobject.cpp
index 55644fe..1fdf0b1 100644
--- a/src/script/bridge/qscriptobject.cpp
+++ b/src/script/bridge/qscriptobject.cpp
@@ -70,36 +70,6 @@ QScriptObject::~QScriptObject()
delete d;
}
-JSC::JSValue QScriptObject::data() const
-{
- if (!d)
- return JSC::JSValue();
- return d->data;
-}
-
-void QScriptObject::setData(JSC::JSValue data)
-{
- if (!d)
- d = new Data();
- d->data = data;
-}
-
-QScriptObjectDelegate *QScriptObject::delegate() const
-{
- if (!d)
- return 0;
- return d->delegate;
-}
-
-void QScriptObject::setDelegate(QScriptObjectDelegate *delegate)
-{
- if (!d)
- d = new Data();
- else
- delete d->delegate;
- d->delegate = delegate;
-}
-
bool QScriptObject::getOwnPropertySlot(JSC::ExecState* exec,
const JSC::Identifier& propertyName,
JSC::PropertySlot& slot)
diff --git a/src/script/bridge/qscriptobject_p.h b/src/script/bridge/qscriptobject_p.h
index c1cee31..9dd9d88 100644
--- a/src/script/bridge/qscriptobject_p.h
+++ b/src/script/bridge/qscriptobject_p.h
@@ -104,11 +104,11 @@ public:
return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, JSC::ImplementsHasInstance | JSC::OverridesHasInstance));
}
- JSC::JSValue data() const;
- void setData(JSC::JSValue data);
+ inline JSC::JSValue data() const;
+ inline void setData(JSC::JSValue data);
- QScriptObjectDelegate *delegate() const;
- void setDelegate(QScriptObjectDelegate *delegate);
+ inline QScriptObjectDelegate *delegate() const;
+ inline void setDelegate(QScriptObjectDelegate *delegate);
protected:
Data *d;
@@ -158,6 +158,36 @@ private:
Q_DISABLE_COPY(QScriptObjectDelegate)
};
+inline JSC::JSValue QScriptObject::data() const
+{
+ if (!d)
+ return JSC::JSValue();
+ return d->data;
+}
+
+inline void QScriptObject::setData(JSC::JSValue data)
+{
+ if (!d)
+ d = new Data();
+ d->data = data;
+}
+
+inline QScriptObjectDelegate *QScriptObject::delegate() const
+{
+ if (!d)
+ return 0;
+ return d->delegate;
+}
+
+inline void QScriptObject::setDelegate(QScriptObjectDelegate *delegate)
+{
+ if (!d)
+ d = new Data();
+ else
+ delete d->delegate;
+ d->delegate = delegate;
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index ff9458b..e686873 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -1455,7 +1455,7 @@ bool QODBCResult::exec()
else
#endif
{
- QByteArray str = val.toString().toUtf8();
+ QByteArray str = val.toString().toAscii();
if (*ind != SQL_NULL_DATA)
*ind = str.length();
int strSize = str.length();
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index 821760f..193aa7c 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -455,6 +455,8 @@ void QSqlDatabasePrivate::disable()
The database connection is referred to by \a connectionName. The
newly added database connection is returned.
+ If \a type is not available or could not be loaded, isValid() returns false.
+
If \a connectionName is not specified, the new connection becomes
the default connection for the application, and subsequent calls
to database() without the connection name argument will return the
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp
index aebecf1..5f0a35d 100644
--- a/src/sql/models/qsqlrelationaltablemodel.cpp
+++ b/src/sql/models/qsqlrelationaltablemodel.cpp
@@ -569,7 +569,8 @@ QString QSqlRelationalTableModel::selectStatement() const
QString displayColumn = relation.displayColumn();
if (d->db.driver()->isIdentifierEscaped(displayColumn, QSqlDriver::FieldName))
displayColumn = d->db.driver()->stripDelimiters(displayColumn, QSqlDriver::FieldName);
- fList.append(QString::fromLatin1(" AS %1_%2").arg(relTableName).arg(displayColumn));
+ fList.append(QString::fromLatin1(" AS %1_%2_%3").arg(relTableName).arg(displayColumn).arg(fieldNames.value(fieldList[i])));
+ fieldNames.insert(fieldList[i], fieldNames.value(fieldList[i])-1);
}
// this needs fixing!! the below if is borken.
diff --git a/src/svg/qsvggenerator.cpp b/src/svg/qsvggenerator.cpp
index da3123f..2f80a92 100644
--- a/src/svg/qsvggenerator.cpp
+++ b/src/svg/qsvggenerator.cpp
@@ -1063,6 +1063,7 @@ void QSvgPaintEngine::drawTextItem(const QPointF &pt, const QTextItem &textItem)
"fill=\"" << d->attributes.stroke << "\" "
"fill-opacity=\"" << d->attributes.strokeOpacity << "\" "
"stroke=\"none\" "
+ "xml:space=\"preserve\" "
"x=\"" << pt.x() << "\" y=\"" << pt.y() << "\" ";
qfontToSvg(textItem.font());
*d->stream << " >"
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index d96755a..da695dc 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -317,11 +317,10 @@ void QTestLog::warn(const char *msg)
void QTestLog::info(const char *msg, const char *file, int line)
{
- QTEST_ASSERT(QTest::testLogger);
QTEST_ASSERT(msg);
- QTEST_ASSERT(file);
- QTest::testLogger->addMessage(QAbstractTestLogger::Info, msg, file, line);
+ if (QTest::testLogger)
+ QTest::testLogger->addMessage(QAbstractTestLogger::Info, msg, file, line);
}
void QTestLog::setLogMode(LogMode mode)
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index f3ecdae..0f7a7f1 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -127,6 +127,7 @@ SUBDIRS += \
qexplicitlyshareddatapointer \
qfile \
qfiledialog \
+ qfiledialog2 \
qfileinfo \
qfilesystemwatcher \
qfilesystemmodel \
@@ -234,6 +235,7 @@ SUBDIRS += \
qpainterpath \
qpalette \
qparallelanimationgroup \
+ qpauseanimation \
qpathclipper \
qpen \
qpicture \
@@ -398,7 +400,8 @@ SUBDIRS += \
selftests \
symbols \
qrand \
- utf8
+ utf8 \
+ gestures
!wince*:SUBDIRS += $$Q3SUBDIRS
diff --git a/tests/auto/bic/tst_bic.cpp b/tests/auto/bic/tst_bic.cpp
index 82c8dc0..8c6056e 100644
--- a/tests/auto/bic/tst_bic.cpp
+++ b/tests/auto/bic/tst_bic.cpp
@@ -252,6 +252,7 @@ QBic::Info tst_Bic::getCurrentInfo(const QString &libName)
}
if (proc.exitCode() != 0) {
qWarning() << "gcc returned with" << proc.exitCode();
+ qDebug() << proc.readAllStandardError();
return QBic::Info();
}
@@ -268,6 +269,7 @@ QBic::Info tst_Bic::getCurrentInfo(const QString &libName)
qFatal("Could not locate the GCC output file, update this test");
return QBic::Info();
} else if (files.size() > 1) {
+ qDebug() << files;
qFatal("Located more than one output file, please clean up before running this test");
return QBic::Info();
}
diff --git a/tests/auto/gestures/gestures.pro b/tests/auto/gestures/gestures.pro
new file mode 100644
index 0000000..da5610f
--- /dev/null
+++ b/tests/auto/gestures/gestures.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+SOURCES += tst_gestures.cpp
+
+
+
diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp
new file mode 100644
index 0000000..92f979f
--- /dev/null
+++ b/tests/auto/gestures/tst_gestures.cpp
@@ -0,0 +1,1170 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+#include "../../shared/util.h"
+
+#include <qevent.h>
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qgesture.h>
+#include <qgesturerecognizer.h>
+#include <qgraphicsitem.h>
+#include <qgraphicsview.h>
+
+#include <qdebug.h>
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+static QPointF mapToGlobal(const QPointF &pt, QGraphicsItem *item, QGraphicsView *view)
+{
+ return view->mapToGlobal(view->mapFromScene(item->mapToScene(pt)));
+}
+
+class CustomGesture : public QGesture
+{
+ Q_OBJECT
+public:
+ static Qt::GestureType GestureType;
+
+ CustomGesture(QObject *parent = 0)
+ : QGesture(parent), serial(0)
+ {
+ }
+
+ int serial;
+
+ static const int SerialMaybeThreshold;
+ static const int SerialStartedThreshold;
+ static const int SerialFinishedThreshold;
+};
+Qt::GestureType CustomGesture::GestureType = Qt::CustomGesture;
+const int CustomGesture::SerialMaybeThreshold = 1;
+const int CustomGesture::SerialStartedThreshold = 3;
+const int CustomGesture::SerialFinishedThreshold = 6;
+
+class CustomEvent : public QEvent
+{
+public:
+ static int EventType;
+
+ CustomEvent(int serial_ = 0)
+ : QEvent(QEvent::Type(CustomEvent::EventType)),
+ serial(serial_), hasHotSpot(false)
+ {
+ }
+
+ int serial;
+ QPointF hotSpot;
+ bool hasHotSpot;
+};
+int CustomEvent::EventType = 0;
+
+class CustomGestureRecognizer : public QGestureRecognizer
+{
+public:
+ CustomGestureRecognizer()
+ {
+ if (!CustomEvent::EventType)
+ CustomEvent::EventType = QEvent::registerEventType();
+ }
+
+ QGesture* createGesture(QObject *)
+ {
+ return new CustomGesture;
+ }
+
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject*, QEvent *event)
+ {
+ if (event->type() == CustomEvent::EventType) {
+ QGestureRecognizer::Result result = QGestureRecognizer::ConsumeEventHint;
+ CustomGesture *g = static_cast<CustomGesture*>(state);
+ CustomEvent *e = static_cast<CustomEvent*>(event);
+ g->serial = e->serial;
+ if (e->hasHotSpot)
+ g->setHotSpot(e->hotSpot);
+ if (g->serial >= CustomGesture::SerialFinishedThreshold)
+ result |= QGestureRecognizer::GestureFinished;
+ else if (g->serial >= CustomGesture::SerialStartedThreshold)
+ result |= QGestureRecognizer::GestureTriggered;
+ else if (g->serial >= CustomGesture::SerialMaybeThreshold)
+ result |= QGestureRecognizer::MaybeGesture;
+ else
+ result = QGestureRecognizer::NotGesture;
+ return result;
+ }
+ return QGestureRecognizer::Ignore;
+ }
+
+ void reset(QGesture *state)
+ {
+ CustomGesture *g = static_cast<CustomGesture*>(state);
+ g->serial = 0;
+ QGestureRecognizer::reset(state);
+ }
+};
+
+// same as CustomGestureRecognizer but triggers early without the maybe state
+class CustomContinuousGestureRecognizer : public QGestureRecognizer
+{
+public:
+ CustomContinuousGestureRecognizer()
+ {
+ if (!CustomEvent::EventType)
+ CustomEvent::EventType = QEvent::registerEventType();
+ }
+
+ QGesture* createGesture(QObject *)
+ {
+ return new CustomGesture;
+ }
+
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject*, QEvent *event)
+ {
+ if (event->type() == CustomEvent::EventType) {
+ QGestureRecognizer::Result result = QGestureRecognizer::ConsumeEventHint;
+ CustomGesture *g = static_cast<CustomGesture*>(state);
+ CustomEvent *e = static_cast<CustomEvent*>(event);
+ g->serial = e->serial;
+ if (e->hasHotSpot)
+ g->setHotSpot(e->hotSpot);
+ if (g->serial >= CustomGesture::SerialFinishedThreshold)
+ result |= QGestureRecognizer::GestureFinished;
+ else if (g->serial >= CustomGesture::SerialMaybeThreshold)
+ result |= QGestureRecognizer::GestureTriggered;
+ else
+ result = QGestureRecognizer::NotGesture;
+ return result;
+ }
+ return QGestureRecognizer::Ignore;
+ }
+
+ void reset(QGesture *state)
+ {
+ CustomGesture *g = static_cast<CustomGesture*>(state);
+ g->serial = 0;
+ QGestureRecognizer::reset(state);
+ }
+};
+
+class GestureWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ GestureWidget(const char *name = 0, QWidget *parent = 0)
+ : QWidget(parent)
+ {
+ if (name)
+ setObjectName(QLatin1String(name));
+ reset();
+ acceptGestureOverride = false;
+ }
+ void reset()
+ {
+ customEventsReceived = 0;
+ gestureEventsReceived = 0;
+ gestureOverrideEventsReceived = 0;
+ events.clear();
+ overrideEvents.clear();
+ ignoredGestures.clear();
+ }
+
+ int customEventsReceived;
+ int gestureEventsReceived;
+ int gestureOverrideEventsReceived;
+ struct Events
+ {
+ QList<Qt::GestureType> all;
+ QList<Qt::GestureType> started;
+ QList<Qt::GestureType> updated;
+ QList<Qt::GestureType> finished;
+ QList<Qt::GestureType> canceled;
+
+ void clear()
+ {
+ all.clear();
+ started.clear();
+ updated.clear();
+ finished.clear();
+ canceled.clear();
+ }
+ } events, overrideEvents;
+
+ bool acceptGestureOverride;
+ QSet<Qt::GestureType> ignoredGestures;
+
+protected:
+ bool event(QEvent *event)
+ {
+ Events *eventsPtr = 0;
+ if (event->type() == QEvent::Gesture) {
+ QGestureEvent *e = static_cast<QGestureEvent*>(event);
+ ++gestureEventsReceived;
+ eventsPtr = &events;
+ foreach(Qt::GestureType type, ignoredGestures)
+ e->ignore(e->gesture(type));
+ } else if (event->type() == QEvent::GestureOverride) {
+ ++gestureOverrideEventsReceived;
+ eventsPtr = &overrideEvents;
+ if (acceptGestureOverride)
+ event->accept();
+ }
+ if (eventsPtr) {
+ QGestureEvent *e = static_cast<QGestureEvent*>(event);
+ QList<QGesture*> gestures = e->allGestures();
+ foreach(QGesture *g, gestures) {
+ eventsPtr->all << g->gestureType();
+ switch(g->state()) {
+ case Qt::GestureStarted:
+ eventsPtr->started << g->gestureType();
+ break;
+ case Qt::GestureUpdated:
+ eventsPtr->updated << g->gestureType();
+ break;
+ case Qt::GestureFinished:
+ eventsPtr->finished << g->gestureType();
+ break;
+ case Qt::GestureCanceled:
+ eventsPtr->canceled << g->gestureType();
+ break;
+ default:
+ Q_ASSERT(false);
+ }
+ }
+ } else if (event->type() == CustomEvent::EventType) {
+ ++customEventsReceived;
+ } else {
+ return QWidget::event(event);
+ }
+ return true;
+ }
+};
+
+static void sendCustomGesture(CustomEvent *event, QObject *object, QGraphicsScene *scene = 0)
+{
+ for (int i = CustomGesture::SerialMaybeThreshold;
+ i <= CustomGesture::SerialFinishedThreshold; ++i) {
+ event->serial = i;
+ if (scene)
+ scene->sendEvent(qobject_cast<QGraphicsObject *>(object), event);
+ else
+ QApplication::sendEvent(object, event);
+ }
+}
+
+class tst_Gestures : public QObject
+{
+Q_OBJECT
+
+public:
+ tst_Gestures();
+ virtual ~tst_Gestures();
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+ void init();
+ void cleanup();
+
+private slots:
+ void customGesture();
+ void autoCancelingGestures();
+ void gestureOverChild();
+ void multipleWidgetOnlyGestureInTree();
+ void conflictingGestures();
+ void finishedWithoutStarted();
+ void unknownGesture();
+ void graphicsItemGesture();
+ void graphicsItemTreeGesture();
+ void explicitGraphicsObjectTarget();
+ void gestureOverChildGraphicsItem();
+ void twoGesturesOnDifferentLevel();
+ void multipleGesturesInTree();
+ void multipleGesturesInComplexTree();
+ void testMapToScene();
+};
+
+tst_Gestures::tst_Gestures()
+{
+}
+
+tst_Gestures::~tst_Gestures()
+{
+}
+
+void tst_Gestures::initTestCase()
+{
+ CustomGesture::GestureType = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ QVERIFY(CustomGesture::GestureType != Qt::GestureType(0));
+ QVERIFY(CustomGesture::GestureType != Qt::CustomGesture);
+}
+
+void tst_Gestures::cleanupTestCase()
+{
+}
+
+void tst_Gestures::init()
+{
+}
+
+void tst_Gestures::cleanup()
+{
+}
+
+void tst_Gestures::customGesture()
+{
+ GestureWidget widget;
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ CustomEvent event;
+ sendCustomGesture(&event, &widget);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+ QCOMPARE(widget.customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(widget.gestureOverrideEventsReceived, 0);
+ QCOMPARE(widget.events.all.size(), TotalGestureEventsCount);
+ for(int i = 0; i < widget.events.all.size(); ++i)
+ QCOMPARE(widget.events.all.at(i), CustomGesture::GestureType);
+ QCOMPARE(widget.events.started.size(), 1);
+ QCOMPARE(widget.events.updated.size(), TotalGestureEventsCount - 2);
+ QCOMPARE(widget.events.finished.size(), 1);
+ QCOMPARE(widget.events.canceled.size(), 0);
+}
+
+void tst_Gestures::autoCancelingGestures()
+{
+ GestureWidget widget;
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ // send partial gesture. The gesture will be in the "maybe" state, but will
+ // never get enough events to fire, so Qt will have to kill it.
+ CustomEvent ev;
+ for (int i = CustomGesture::SerialMaybeThreshold;
+ i < CustomGesture::SerialStartedThreshold; ++i) {
+ ev.serial = i;
+ QApplication::sendEvent(&widget, &ev);
+ }
+ // wait long enough so the gesture manager will cancel the gesture
+ QTest::qWait(5000);
+ QCOMPARE(widget.customEventsReceived, CustomGesture::SerialStartedThreshold - CustomGesture::SerialMaybeThreshold);
+ QCOMPARE(widget.gestureEventsReceived, 0);
+ QCOMPARE(widget.gestureOverrideEventsReceived, 0);
+ QCOMPARE(widget.events.all.size(), 0);
+}
+
+void tst_Gestures::gestureOverChild()
+{
+ GestureWidget widget("widget");
+ QVBoxLayout *l = new QVBoxLayout(&widget);
+ GestureWidget *child = new GestureWidget("child");
+ l->addWidget(child);
+
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+
+ CustomEvent event;
+ sendCustomGesture(&event, child);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+
+ QCOMPARE(child->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(widget.customEventsReceived, 0);
+ QCOMPARE(child->gestureEventsReceived, 0);
+ QCOMPARE(child->gestureOverrideEventsReceived, 0);
+ QCOMPARE(widget.gestureEventsReceived, 0);
+ QCOMPARE(widget.gestureOverrideEventsReceived, 0);
+
+ // enable gestures over the children
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetWithChildrenGesture);
+
+ widget.reset();
+ child->reset();
+
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(widget.customEventsReceived, 0);
+
+ QCOMPARE(child->gestureEventsReceived, 0);
+ QCOMPARE(child->gestureOverrideEventsReceived, 0);
+ QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(widget.gestureOverrideEventsReceived, 0);
+ for(int i = 0; i < widget.events.all.size(); ++i)
+ QCOMPARE(widget.events.all.at(i), CustomGesture::GestureType);
+ QCOMPARE(widget.events.started.size(), 1);
+ QCOMPARE(widget.events.updated.size(), TotalGestureEventsCount - 2);
+ QCOMPARE(widget.events.finished.size(), 1);
+ QCOMPARE(widget.events.canceled.size(), 0);
+}
+
+void tst_Gestures::multipleWidgetOnlyGestureInTree()
+{
+ GestureWidget parent("parent");
+ QVBoxLayout *l = new QVBoxLayout(&parent);
+ GestureWidget *child = new GestureWidget("child");
+ l->addWidget(child);
+
+ parent.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ child->grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+
+ // sending events to the child and making sure there is no conflict
+ CustomEvent event;
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(parent.customEventsReceived, 0);
+ QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(child->gestureOverrideEventsReceived, 0);
+ QCOMPARE(parent.gestureEventsReceived, 0);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 0);
+
+ parent.reset();
+ child->reset();
+
+ // same for the parent widget
+ sendCustomGesture(&event, &parent);
+
+ QCOMPARE(child->customEventsReceived, 0);
+ QCOMPARE(parent.customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(child->gestureEventsReceived, 0);
+ QCOMPARE(child->gestureOverrideEventsReceived, 0);
+ QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 0);
+}
+
+void tst_Gestures::conflictingGestures()
+{
+ GestureWidget parent("parent");
+ QVBoxLayout *l = new QVBoxLayout(&parent);
+ GestureWidget *child = new GestureWidget("child");
+ l->addWidget(child);
+
+ parent.grabGesture(CustomGesture::GestureType, Qt::WidgetWithChildrenGesture);
+ child->grabGesture(CustomGesture::GestureType, Qt::WidgetWithChildrenGesture);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ // child accepts the override, parent will not receive anything
+ parent.acceptGestureOverride = false;
+ child->acceptGestureOverride = true;
+
+ // sending events to the child and making sure there is no conflict
+ CustomEvent event;
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->gestureOverrideEventsReceived, 1);
+ QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 0);
+ QCOMPARE(parent.gestureEventsReceived, 0);
+
+ parent.reset();
+ child->reset();
+
+ // parent accepts the override
+ parent.acceptGestureOverride = true;
+ child->acceptGestureOverride = false;
+
+ // sending events to the child and making sure there is no conflict
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->gestureOverrideEventsReceived, 1);
+ QCOMPARE(child->gestureEventsReceived, 0);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 1);
+ QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount);
+
+ parent.reset();
+ child->reset();
+
+ // nobody accepts the override, we will send normal events to the closest context (to the child)
+ parent.acceptGestureOverride = false;
+ child->acceptGestureOverride = false;
+ child->ignoredGestures << CustomGesture::GestureType;
+
+ // sending events to the child and making sure there is no conflict
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->gestureOverrideEventsReceived, 1);
+ QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 1);
+ QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount);
+
+ parent.reset();
+ child->reset();
+
+ Qt::GestureType ContinuousGesture = qApp->registerGestureRecognizer(new CustomContinuousGestureRecognizer);
+ static const int ContinuousGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+ child->grabGesture(ContinuousGesture);
+ // child accepts override. And it also receives another custom gesture.
+ parent.acceptGestureOverride = false;
+ child->acceptGestureOverride = true;
+ sendCustomGesture(&event, child);
+
+ QCOMPARE(child->gestureOverrideEventsReceived, 1);
+ QVERIFY(child->gestureEventsReceived > TotalGestureEventsCount);
+ QCOMPARE(child->events.all.count(), TotalGestureEventsCount + ContinuousGestureEventsCount);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 0);
+ QCOMPARE(parent.gestureEventsReceived, 0);
+}
+
+void tst_Gestures::finishedWithoutStarted()
+{
+ GestureWidget widget;
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+
+ // the gesture will claim it finished, but it was never started.
+ CustomEvent ev;
+ ev.serial = CustomGesture::SerialFinishedThreshold;
+ QApplication::sendEvent(&widget, &ev);
+
+ QCOMPARE(widget.customEventsReceived, 1);
+ QCOMPARE(widget.gestureEventsReceived, 2);
+ QCOMPARE(widget.gestureOverrideEventsReceived, 0);
+ QCOMPARE(widget.events.all.size(), 2);
+ QCOMPARE(widget.events.started.size(), 1);
+ QCOMPARE(widget.events.updated.size(), 0);
+ QCOMPARE(widget.events.finished.size(), 1);
+ QCOMPARE(widget.events.canceled.size(), 0);
+}
+
+void tst_Gestures::unknownGesture()
+{
+ GestureWidget widget;
+ widget.grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ widget.grabGesture(Qt::CustomGesture, Qt::WidgetGesture);
+ widget.grabGesture(Qt::GestureType(Qt::PanGesture+512), Qt::WidgetGesture);
+
+ CustomEvent event;
+ sendCustomGesture(&event, &widget);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ QCOMPARE(widget.gestureEventsReceived, TotalGestureEventsCount);
+}
+
+static const QColor InstanceColors[] = {
+ Qt::blue, Qt::red, Qt::green, Qt::gray, Qt::yellow
+};
+
+class GestureItem : public QGraphicsObject
+{
+ static int InstanceCount;
+
+public:
+ GestureItem(const char *name = 0)
+ {
+ instanceNumber = InstanceCount++;
+ if (name)
+ setObjectName(QLatin1String(name));
+ size = QRectF(0, 0, 100, 100);
+ customEventsReceived = 0;
+ gestureEventsReceived = 0;
+ gestureOverrideEventsReceived = 0;
+ events.clear();
+ overrideEvents.clear();
+ acceptGestureOverride = false;
+ }
+ ~GestureItem()
+ {
+ --InstanceCount;
+ }
+
+ int customEventsReceived;
+ int gestureEventsReceived;
+ int gestureOverrideEventsReceived;
+ struct Events
+ {
+ QList<Qt::GestureType> all;
+ QList<Qt::GestureType> started;
+ QList<Qt::GestureType> updated;
+ QList<Qt::GestureType> finished;
+ QList<Qt::GestureType> canceled;
+
+ void clear()
+ {
+ all.clear();
+ started.clear();
+ updated.clear();
+ finished.clear();
+ canceled.clear();
+ }
+ } events, overrideEvents;
+
+ bool acceptGestureOverride;
+ QSet<Qt::GestureType> ignoredGestures;
+
+ QRectF size;
+ int instanceNumber;
+
+ void reset()
+ {
+ customEventsReceived = 0;
+ gestureEventsReceived = 0;
+ gestureOverrideEventsReceived = 0;
+ events.clear();
+ overrideEvents.clear();
+ ignoredGestures.clear();
+ }
+
+protected:
+ QRectF boundingRect() const
+ {
+ return size;
+ }
+ void paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *)
+ {
+ QColor color = InstanceColors[instanceNumber % (sizeof(InstanceColors)/sizeof(InstanceColors[0]))];
+ p->fillRect(boundingRect(), color);
+ }
+
+ bool event(QEvent *event)
+ {
+ Events *eventsPtr = 0;
+ if (event->type() == QEvent::Gesture) {
+ ++gestureEventsReceived;
+ eventsPtr = &events;
+ QGestureEvent *e = static_cast<QGestureEvent *>(event);
+ foreach(Qt::GestureType type, ignoredGestures)
+ e->ignore(e->gesture(type));
+ } else if (event->type() == QEvent::GestureOverride) {
+ ++gestureOverrideEventsReceived;
+ eventsPtr = &overrideEvents;
+ if (acceptGestureOverride)
+ event->accept();
+ }
+ if (eventsPtr) {
+ QGestureEvent *e = static_cast<QGestureEvent*>(event);
+ QList<QGesture*> gestures = e->allGestures();
+ foreach(QGesture *g, gestures) {
+ eventsPtr->all << g->gestureType();
+ switch(g->state()) {
+ case Qt::GestureStarted:
+ eventsPtr->started << g->gestureType();
+ break;
+ case Qt::GestureUpdated:
+ eventsPtr->updated << g->gestureType();
+ break;
+ case Qt::GestureFinished:
+ eventsPtr->finished << g->gestureType();
+ break;
+ case Qt::GestureCanceled:
+ eventsPtr->canceled << g->gestureType();
+ break;
+ default:
+ Q_ASSERT(false);
+ }
+ }
+ } else if (event->type() == CustomEvent::EventType) {
+ ++customEventsReceived;
+ } else {
+ return QGraphicsObject::event(event);
+ }
+ return true;
+ }
+};
+int GestureItem::InstanceCount = 0;
+
+void tst_Gestures::graphicsItemGesture()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ GestureItem *item = new GestureItem("item");
+ scene.addItem(item);
+ item->setPos(100, 100);
+
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ view.ensureVisible(scene.sceneRect());
+
+ view.viewport()->grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ item->grabGesture(CustomGesture::GestureType);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+
+ CustomEvent event;
+ // gesture without hotspot should not be delivered to items in the view
+ QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture");
+ QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture");
+ QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture");
+ QTest::ignoreMessage(QtWarningMsg, "QGestureManager::deliverEvent: could not find the target for gesture");
+ sendCustomGesture(&event, item, &scene);
+
+ QCOMPARE(item->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(item->gestureEventsReceived, 0);
+ QCOMPARE(item->gestureOverrideEventsReceived, 0);
+
+ item->reset();
+
+ // make sure the event is properly delivered if only the hotspot is set.
+ event.hotSpot = mapToGlobal(QPointF(10, 10), item, &view);
+ event.hasHotSpot = true;
+ sendCustomGesture(&event, item, &scene);
+
+ QCOMPARE(item->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item->events.all.size(), TotalGestureEventsCount);
+ for(int i = 0; i < item->events.all.size(); ++i)
+ QCOMPARE(item->events.all.at(i), CustomGesture::GestureType);
+ QCOMPARE(item->events.started.size(), 1);
+ QCOMPARE(item->events.updated.size(), TotalGestureEventsCount - 2);
+ QCOMPARE(item->events.finished.size(), 1);
+ QCOMPARE(item->events.canceled.size(), 0);
+
+ item->reset();
+
+ // send gesture to the item which ignores it.
+ item->ignoredGestures << CustomGesture::GestureType;
+
+ event.hotSpot = mapToGlobal(QPointF(10, 10), item, &view);
+ event.hasHotSpot = true;
+ sendCustomGesture(&event, item, &scene);
+ QCOMPARE(item->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(item->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item->gestureOverrideEventsReceived, 0);
+}
+
+void tst_Gestures::graphicsItemTreeGesture()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ GestureItem *item1 = new GestureItem("item1");
+ item1->setPos(100, 100);
+ item1->size = QRectF(0, 0, 350, 200);
+ scene.addItem(item1);
+
+ GestureItem *item1_child1 = new GestureItem("item1_child1");
+ item1_child1->setPos(50, 50);
+ item1_child1->size = QRectF(0, 0, 100, 100);
+ item1_child1->setParentItem(item1);
+
+ GestureItem *item1_child2 = new GestureItem("item1_child2");
+ item1_child2->size = QRectF(0, 0, 100, 100);
+ item1_child2->setPos(200, 50);
+ item1_child2->setParentItem(item1);
+
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ view.ensureVisible(scene.sceneRect());
+
+ view.viewport()->grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ item1->grabGesture(CustomGesture::GestureType);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ CustomEvent event;
+ event.hotSpot = mapToGlobal(QPointF(10, 10), item1_child1, &view);
+ event.hasHotSpot = true;
+
+ item1->ignoredGestures << CustomGesture::GestureType;
+ sendCustomGesture(&event, item1_child1, &scene);
+ QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item1_child1->gestureEventsReceived, 0);
+ QCOMPARE(item1_child2->gestureEventsReceived, 0);
+ QCOMPARE(item1_child2->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount);
+
+ item1->reset(); item1_child1->reset(); item1_child2->reset();
+
+ item1_child1->grabGesture(CustomGesture::GestureType);
+
+ item1->ignoredGestures << CustomGesture::GestureType;
+ item1_child1->ignoredGestures << CustomGesture::GestureType;
+ sendCustomGesture(&event, item1_child1, &scene);
+ QCOMPARE(item1_child1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item1_child2->gestureEventsReceived, 0);
+ QCOMPARE(item1_child2->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount);
+}
+
+void tst_Gestures::explicitGraphicsObjectTarget()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ GestureItem *item1 = new GestureItem("item1");
+ scene.addItem(item1);
+ item1->setPos(100, 100);
+ item1->setZValue(1);
+
+ GestureItem *item2 = new GestureItem("item2");
+ scene.addItem(item2);
+ item2->setPos(100, 100);
+ item2->setZValue(5);
+
+ GestureItem *item2_child1 = new GestureItem("item2_child1");
+ scene.addItem(item2_child1);
+ item2_child1->setParentItem(item2);
+ item2_child1->setPos(10, 10);
+
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ view.ensureVisible(scene.sceneRect());
+
+ view.viewport()->grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ item1->grabGesture(CustomGesture::GestureType, Qt::ItemGesture);
+ item2->grabGesture(CustomGesture::GestureType, Qt::ItemGesture);
+ item2_child1->grabGesture(CustomGesture::GestureType, Qt::ItemGesture);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ // sending events to item1, but the hotSpot is set to item2
+ CustomEvent event;
+ event.hotSpot = mapToGlobal(QPointF(15, 15), item2, &view);
+ event.hasHotSpot = true;
+
+ sendCustomGesture(&event, item1, &scene);
+
+ QCOMPARE(item1->gestureEventsReceived, 0);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item2_child1->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item2_child1->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item2_child1->events.all.size(), TotalGestureEventsCount);
+ for(int i = 0; i < item2_child1->events.all.size(); ++i)
+ QCOMPARE(item2_child1->events.all.at(i), CustomGesture::GestureType);
+ QCOMPARE(item2_child1->events.started.size(), 1);
+ QCOMPARE(item2_child1->events.updated.size(), TotalGestureEventsCount - 2);
+ QCOMPARE(item2_child1->events.finished.size(), 1);
+ QCOMPARE(item2_child1->events.canceled.size(), 0);
+ QCOMPARE(item2->gestureEventsReceived, 0);
+ QCOMPARE(item2->gestureOverrideEventsReceived, 1);
+}
+
+void tst_Gestures::gestureOverChildGraphicsItem()
+{
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ GestureItem *item0 = new GestureItem("item0");
+ scene.addItem(item0);
+ item0->setPos(0, 0);
+ item0->grabGesture(CustomGesture::GestureType);
+ item0->setZValue(1);
+
+ GestureItem *item1 = new GestureItem("item1");
+ scene.addItem(item1);
+ item1->setPos(100, 100);
+ item1->setZValue(5);
+
+ GestureItem *item2 = new GestureItem("item2");
+ scene.addItem(item2);
+ item2->setPos(100, 100);
+ item2->setZValue(10);
+
+ GestureItem *item2_child1 = new GestureItem("item2_child1");
+ scene.addItem(item2_child1);
+ item2_child1->setParentItem(item2);
+ item2_child1->setPos(0, 0);
+
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ view.ensureVisible(scene.sceneRect());
+
+ view.viewport()->grabGesture(CustomGesture::GestureType, Qt::WidgetGesture);
+ item1->grabGesture(CustomGesture::GestureType);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+
+ CustomEvent event;
+ event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view);
+ event.hasHotSpot = true;
+ sendCustomGesture(&event, item0, &scene);
+
+ QCOMPARE(item0->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(item2_child1->gestureEventsReceived, 0);
+ QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item2->gestureEventsReceived, 0);
+ QCOMPARE(item2->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 0);
+
+ item0->reset(); item1->reset(); item2->reset(); item2_child1->reset();
+ item2->grabGesture(CustomGesture::GestureType);
+ item2->ignoredGestures << CustomGesture::GestureType;
+
+ event.hotSpot = mapToGlobal(QPointF(10, 10), item2_child1, &view);
+ event.hasHotSpot = true;
+ sendCustomGesture(&event, item0, &scene);
+
+ QCOMPARE(item0->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(item2_child1->gestureEventsReceived, 0);
+ QCOMPARE(item2_child1->gestureOverrideEventsReceived, 0);
+ QCOMPARE(item2->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item2->gestureOverrideEventsReceived, 1);
+ QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(item1->gestureOverrideEventsReceived, 1);
+}
+
+void tst_Gestures::twoGesturesOnDifferentLevel()
+{
+ GestureWidget parent("parent");
+ QVBoxLayout *l = new QVBoxLayout(&parent);
+ GestureWidget *child = new GestureWidget("child");
+ l->addWidget(child);
+
+ Qt::GestureType SecondGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+
+ parent.grabGesture(CustomGesture::GestureType, Qt::WidgetWithChildrenGesture);
+ child->grabGesture(SecondGesture, Qt::WidgetWithChildrenGesture);
+
+ CustomEvent event;
+ // sending events that form a gesture to one widget, but they will be
+ // filtered by two different gesture recognizers and will generate two
+ // QGesture objects. Check that those gesture objects are delivered to
+ // different widgets properly.
+ sendCustomGesture(&event, child);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+ static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1;
+
+ QCOMPARE(child->customEventsReceived, TotalCustomEventsCount);
+ QCOMPARE(child->gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(child->gestureOverrideEventsReceived, 0);
+ QCOMPARE(child->events.all.size(), TotalGestureEventsCount);
+ for(int i = 0; i < child->events.all.size(); ++i)
+ QCOMPARE(child->events.all.at(i), SecondGesture);
+
+ QCOMPARE(parent.gestureEventsReceived, TotalGestureEventsCount);
+ QCOMPARE(parent.gestureOverrideEventsReceived, 0);
+ QCOMPARE(parent.events.all.size(), TotalGestureEventsCount);
+ for(int i = 0; i < child->events.all.size(); ++i)
+ QCOMPARE(parent.events.all.at(i), CustomGesture::GestureType);
+}
+
+void tst_Gestures::multipleGesturesInTree()
+{
+ GestureWidget a("A");
+ GestureWidget *A = &a;
+ GestureWidget *B = new GestureWidget("B", A);
+ GestureWidget *C = new GestureWidget("C", B);
+ GestureWidget *D = new GestureWidget("D", C);
+
+ Qt::GestureType FirstGesture = CustomGesture::GestureType;
+ Qt::GestureType SecondGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType ThirdGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+
+ A->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture); // A [1 3]
+ A->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture); // |
+ B->grabGesture(SecondGesture, Qt::WidgetWithChildrenGesture); // B [ 2 3]
+ B->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture); // |
+ C->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture); // C [1 2 3]
+ C->grabGesture(SecondGesture, Qt::WidgetWithChildrenGesture); // |
+ C->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture); // D [1 3]
+ D->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture);
+ D->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture);
+
+ // make sure all widgets ignore events, so they get propagated.
+ A->ignoredGestures << FirstGesture << ThirdGesture;
+ B->ignoredGestures << SecondGesture << ThirdGesture;
+ C->ignoredGestures << FirstGesture << SecondGesture << ThirdGesture;
+ D->ignoredGestures << FirstGesture << ThirdGesture;
+
+ CustomEvent event;
+ sendCustomGesture(&event, D);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ // gesture override events
+ QCOMPARE(D->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(D->overrideEvents.all.count(SecondGesture), 0);
+ QCOMPARE(D->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(C->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(C->overrideEvents.all.count(SecondGesture), 1);
+ QCOMPARE(C->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(B->overrideEvents.all.count(FirstGesture), 0);
+ QCOMPARE(B->overrideEvents.all.count(SecondGesture), 1);
+ QCOMPARE(B->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(A->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(A->overrideEvents.all.count(SecondGesture), 0);
+ QCOMPARE(A->overrideEvents.all.count(ThirdGesture), 1);
+
+ // normal gesture events
+ QCOMPARE(D->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(D->events.all.count(SecondGesture), 0);
+ QCOMPARE(D->events.all.count(ThirdGesture), TotalGestureEventsCount);
+
+ QCOMPARE(C->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(SecondGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(ThirdGesture), TotalGestureEventsCount);
+
+ QCOMPARE(B->events.all.count(FirstGesture), 0);
+ QCOMPARE(B->events.all.count(SecondGesture), TotalGestureEventsCount);
+ QCOMPARE(B->events.all.count(ThirdGesture), TotalGestureEventsCount);
+
+ QCOMPARE(A->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(A->events.all.count(SecondGesture), 0);
+ QCOMPARE(A->events.all.count(ThirdGesture), TotalGestureEventsCount);
+}
+
+void tst_Gestures::multipleGesturesInComplexTree()
+{
+ GestureWidget a("A");
+ GestureWidget *A = &a;
+ GestureWidget *B = new GestureWidget("B", A);
+ GestureWidget *C = new GestureWidget("C", B);
+ GestureWidget *D = new GestureWidget("D", C);
+
+ Qt::GestureType FirstGesture = CustomGesture::GestureType;
+ Qt::GestureType SecondGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType ThirdGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType FourthGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType FifthGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType SixthGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+ Qt::GestureType SeventhGesture = qApp->registerGestureRecognizer(new CustomGestureRecognizer);
+
+ A->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture); // A [1,3,4]
+ A->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture); // |
+ A->grabGesture(FourthGesture, Qt::WidgetWithChildrenGesture); // B [2,3,5]
+ B->grabGesture(SecondGesture, Qt::WidgetWithChildrenGesture); // |
+ B->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture); // C [1,2,3,6]
+ B->grabGesture(FifthGesture, Qt::WidgetWithChildrenGesture); // |
+ C->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture); // D [1,3,7]
+ C->grabGesture(SecondGesture, Qt::WidgetWithChildrenGesture);
+ C->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture);
+ C->grabGesture(SixthGesture, Qt::WidgetWithChildrenGesture);
+ D->grabGesture(FirstGesture, Qt::WidgetWithChildrenGesture);
+ D->grabGesture(ThirdGesture, Qt::WidgetWithChildrenGesture);
+ D->grabGesture(SeventhGesture, Qt::WidgetWithChildrenGesture);
+
+ // make sure all widgets ignore events, so they get propagated.
+ QSet<Qt::GestureType> allGestureTypes;
+ allGestureTypes << FirstGesture << SecondGesture << ThirdGesture
+ << FourthGesture << FifthGesture << SixthGesture << SeventhGesture;
+ A->ignoredGestures = B->ignoredGestures = allGestureTypes;
+ C->ignoredGestures = D->ignoredGestures = allGestureTypes;
+
+ CustomEvent event;
+ sendCustomGesture(&event, D);
+
+ static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1;
+
+ // gesture override events
+ QCOMPARE(D->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(D->overrideEvents.all.count(SecondGesture), 0);
+ QCOMPARE(D->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(C->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(C->overrideEvents.all.count(SecondGesture), 1);
+ QCOMPARE(C->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(B->overrideEvents.all.count(FirstGesture), 0);
+ QCOMPARE(B->overrideEvents.all.count(SecondGesture), 1);
+ QCOMPARE(B->overrideEvents.all.count(ThirdGesture), 1);
+
+ QCOMPARE(A->overrideEvents.all.count(FirstGesture), 1);
+ QCOMPARE(A->overrideEvents.all.count(SecondGesture), 0);
+ QCOMPARE(A->overrideEvents.all.count(ThirdGesture), 1);
+
+ // normal gesture events
+ QCOMPARE(D->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(D->events.all.count(SecondGesture), 0);
+ QCOMPARE(D->events.all.count(ThirdGesture), TotalGestureEventsCount);
+ QCOMPARE(D->events.all.count(FourthGesture), 0);
+ QCOMPARE(D->events.all.count(FifthGesture), 0);
+ QCOMPARE(D->events.all.count(SixthGesture), 0);
+ QCOMPARE(D->events.all.count(SeventhGesture), TotalGestureEventsCount);
+
+ QCOMPARE(C->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(SecondGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(ThirdGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(FourthGesture), 0);
+ QCOMPARE(C->events.all.count(FifthGesture), 0);
+ QCOMPARE(C->events.all.count(SixthGesture), TotalGestureEventsCount);
+ QCOMPARE(C->events.all.count(SeventhGesture), 0);
+
+ QCOMPARE(B->events.all.count(FirstGesture), 0);
+ QCOMPARE(B->events.all.count(SecondGesture), TotalGestureEventsCount);
+ QCOMPARE(B->events.all.count(ThirdGesture), TotalGestureEventsCount);
+ QCOMPARE(B->events.all.count(FourthGesture), 0);
+ QCOMPARE(B->events.all.count(FifthGesture), TotalGestureEventsCount);
+ QCOMPARE(B->events.all.count(SixthGesture), 0);
+ QCOMPARE(B->events.all.count(SeventhGesture), 0);
+
+ QCOMPARE(A->events.all.count(FirstGesture), TotalGestureEventsCount);
+ QCOMPARE(A->events.all.count(SecondGesture), 0);
+ QCOMPARE(A->events.all.count(ThirdGesture), TotalGestureEventsCount);
+ QCOMPARE(A->events.all.count(FourthGesture), TotalGestureEventsCount);
+ QCOMPARE(A->events.all.count(FifthGesture), 0);
+ QCOMPARE(A->events.all.count(SixthGesture), 0);
+ QCOMPARE(A->events.all.count(SeventhGesture), 0);
+}
+
+void tst_Gestures::testMapToScene()
+{
+ QGesture gesture;
+ QList<QGesture*> list;
+ list << &gesture;
+ QGestureEvent event(list);
+ QCOMPARE(event.mapToScene(gesture.hotSpot()), QPointF()); // not set, can't do much
+
+ QGraphicsScene scene;
+ QGraphicsView view(&scene);
+
+ GestureItem *item0 = new GestureItem;
+ scene.addItem(item0);
+ item0->setPos(14, 16);
+
+ view.show(); // need to show to give it a global coordinate
+ QTest::qWaitForWindowShown(&view);
+ view.ensureVisible(scene.sceneRect());
+
+ QPoint origin = view.mapToGlobal(QPoint());
+ event.setWidget(view.viewport());
+
+ QCOMPARE(event.mapToScene(origin + QPoint(100, 200)), view.mapToScene(QPoint(100, 200)));
+}
+
+QTEST_MAIN(tst_Gestures)
+#include "tst_gestures.moc"
diff --git a/tests/auto/linguist/lrelease/testdata/idbased.ts b/tests/auto/linguist/lrelease/testdata/idbased.ts
index 61497de..c7555c8 100644
--- a/tests/auto/linguist/lrelease/testdata/idbased.ts
+++ b/tests/auto/linguist/lrelease/testdata/idbased.ts
@@ -9,6 +9,7 @@
</message>
<message id="untranslated_id">
<source>This has no translation.</source>
+ <translation type="unfinished"></translation>
</message>
<message id="this_another_id">
<source>Foo bar.</source>
@@ -17,5 +18,11 @@
<message>
<source>Drop me!</source>
</message>
+ <message id="one_id">
+ <source></source>
+ </message>
+ <message id="two_id">
+ <source></source>
+ </message>
</context>
</TS>
diff --git a/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp b/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp
index 6b580df..4b62302 100644
--- a/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp
+++ b/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp
@@ -137,6 +137,8 @@ void tst_Q3SqlCursor::createTestTables( QSqlDatabase db )
QVERIFY_SQL(q, exec("SET ANSI_DEFAULTS ON"));
QVERIFY_SQL(q, exec("SET IMPLICIT_TRANSACTIONS OFF"));
}
+ else if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
// please never ever change this table; otherwise fix all tests ;)
if ( tst_Databases::isMSAccess( db ) ) {
@@ -150,10 +152,10 @@ void tst_Q3SqlCursor::createTestTables( QSqlDatabase db )
if ( tst_Databases::isSqlServer( db ) ) {
//workaround for SQL SERVER since he can store unicode only in nvarchar fields
QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode") + " (id int not null, "
- "t_varchar nvarchar(40) not null, t_char nchar(40) )" ));
+ "t_varchar nvarchar(80) not null, t_char nchar(80) )" ));
} else {
QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode") + " (id int not null, "
- "t_varchar varchar(40) not null," "t_char char(40))" ));
+ "t_varchar varchar(100) not null," "t_char char(100))" ));
}
if (tst_Databases::isMSAccess(db)) {
@@ -519,8 +521,7 @@ void tst_Q3SqlCursor::unicode()
QSqlDatabase db = QSqlDatabase::database( dbName );
CHECK_DATABASE( db );
- static const unsigned short utf8arr[] = { 0xd792,0xd79c,0xd792,0xd79c,0xd799,0x20,0xd7a9,0xd799,0x00 };
- static const QString utf8str = QString::fromUcs2( utf8arr );
+ static const QString utf8str = QString::fromUtf8( "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." );
if ( !db.driver()->hasFeature( QSqlDriver::Unicode ) ) {
QSKIP( "DBMS not Unicode capable", SkipSingle );
}
diff --git a/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp b/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp
index 5893687..68e8ce8 100644
--- a/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp
+++ b/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp
@@ -107,9 +107,15 @@ void tst_Q3SqlSelectCursor::createTestTables( QSqlDatabase db )
if ( !db.isValid() )
return;
QSqlQuery q( db );
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
// please never ever change this table; otherwise fix all tests ;)
- QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null,"
- "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar) )" ));
+ if (tst_Databases::isMSAccess(db))
+ QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null,"
+ "t_char char(40), t_numeric number, primary key (id, t_varchar) )" ));
+ else
+ QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null,"
+ "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar) )" ));
}
void tst_Q3SqlSelectCursor::dropTestTables( QSqlDatabase db )
diff --git a/tests/auto/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/qabstractitemview/tst_qabstractitemview.cpp
index d6911d2..db840f4 100644
--- a/tests/auto/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/qabstractitemview/tst_qabstractitemview.cpp
@@ -223,6 +223,7 @@ private slots:
void task257481_emptyEditor();
void shiftArrowSelectionAfterScrolling();
void shiftSelectionAfterRubberbandSelection();
+ void ctrlRubberbandSelection();
};
class MyAbstractItemDelegate : public QAbstractItemDelegate
@@ -1388,5 +1389,49 @@ void tst_QAbstractItemView::shiftSelectionAfterRubberbandSelection()
QVERIFY(selected.contains(index2));
}
+void tst_QAbstractItemView::ctrlRubberbandSelection()
+{
+ QStandardItemModel model;
+ for (int i=0; i<3; ++i) {
+ QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ model.setItem(i, 0, item);
+ }
+
+ QListView view;
+ view.setFixedSize(150, 450);
+ view.setFlow(QListView::LeftToRight);
+ view.setGridSize(QSize(100, 100));
+ view.setSelectionMode(QListView::ExtendedSelection);
+ view.setViewMode(QListView::IconMode);
+ view.setModel(&model);
+ view.show();
+ QTest::qWait(30);
+
+ QModelIndex index1 = model.index(1, 0);
+ QModelIndex index2 = model.index(2, 0);
+
+ // Select item 1
+ view.setCurrentIndex(index1);
+ QModelIndexList selected = view.selectionModel()->selectedIndexes();
+ QCOMPARE(selected.count(), 1);
+ QVERIFY(selected.contains(index1));
+
+ // Now press control and draw a rubberband around items 1 and 2.
+ // The mouse move event has to be created manually because the QTest framework does not
+ // contain a function for mouse moves with buttons pressed.
+ QPoint pressPos = view.visualRect(index1).topLeft() - QPoint(1, 1);
+ QPoint releasePos = view.visualRect(index2).bottomRight() + QPoint(1, 1);
+ QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::ControlModifier, pressPos);
+ QMouseEvent moveEvent(QEvent::MouseMove, releasePos, Qt::NoButton, Qt::LeftButton, Qt::ControlModifier);
+ bool moveEventReceived = qApp->notify(view.viewport(), &moveEvent);
+ QVERIFY(moveEventReceived);
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::ControlModifier, releasePos);
+
+ // Verify that item 2 is selected now
+ selected = view.selectionModel()->selectedIndexes();
+ QCOMPARE(selected.count(), 1);
+ QVERIFY(selected.contains(index2));
+}
+
QTEST_MAIN(tst_QAbstractItemView)
#include "tst_qabstractitemview.moc"
diff --git a/tests/auto/qapplication/tst_qapplication.cpp b/tests/auto/qapplication/tst_qapplication.cpp
index abcacef..97aa092 100644
--- a/tests/auto/qapplication/tst_qapplication.cpp
+++ b/tests/auto/qapplication/tst_qapplication.cpp
@@ -1242,6 +1242,10 @@ public slots:
}
void deleteLaterAndExitLoop()
{
+ // Check that 'p' is not deleted before exec returns, since the call
+ // to QEventLoop::quit() should stop 'eventLoop' from processing
+ // any more events (that is, delete later) until we return to the
+ // _current_ event loop:
QEventLoop eventLoop;
QPointer<QObject> p(this);
QMetaObject::invokeMethod(this, "deleteLater", Qt::QueuedConnection);
diff --git a/tests/auto/qaudioinput/tst_qaudioinput.cpp b/tests/auto/qaudioinput/tst_qaudioinput.cpp
index 3945364..3efc346 100644
--- a/tests/auto/qaudioinput/tst_qaudioinput.cpp
+++ b/tests/auto/qaudioinput/tst_qaudioinput.cpp
@@ -146,7 +146,7 @@ void tst_QAudioInput::pullFile()
// Check state and periodSize() are valid non-zero values.
QVERIFY(audio->state() == QAudio::ActiveState);
QVERIFY(audio->error() == QAudio::NoError);
- QVERIFY(audio->clock() > 0);
+ QVERIFY(audio->clock() > 10000 && audio->clock() < 800000);
QVERIFY(audio->periodSize() > 0);
QVERIFY(stateSignal.count() == 1); // State changed to QAudio::ActiveState
diff --git a/tests/auto/qaudiooutput/tst_qaudiooutput.cpp b/tests/auto/qaudiooutput/tst_qaudiooutput.cpp
index b90873e..b001af1 100644
--- a/tests/auto/qaudiooutput/tst_qaudiooutput.cpp
+++ b/tests/auto/qaudiooutput/tst_qaudiooutput.cpp
@@ -150,15 +150,20 @@ void tst_QAudioOutput::pullFile()
QVERIFY(audio->state() == QAudio::ActiveState);
QVERIFY(audio->error() == QAudio::NoError);
QVERIFY(audio->periodSize() > 0);
- QVERIFY(audio->clock() > 0);
+ QVERIFY(audio->clock() > 10000 && audio->clock() < 800000);
QVERIFY(stateSignal.count() == 1); // State changed to QAudio::ActiveState
// Wait until finished...
QTestEventLoop::instance().enterLoop(1);
QCOMPARE(audio->totalTime(), qint64(692250));
+
+#ifdef Q_OS_WINCE
+ // 4.wav is a little less than 700ms, so notify should fire 4 times on Wince!
+ QVERIFY(readSignal.count() >= 4);
+#else
// 4.wav is a little less than 700ms, so notify should fire 6 times!
QVERIFY(readSignal.count() >= 6);
-
+#endif
audio->stop();
QTest::qWait(20); // wait 20ms
QVERIFY(audio->state() == QAudio::StopState);
diff --git a/tests/auto/qbuttongroup/tst_qbuttongroup.cpp b/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
index a19f865..8b0335c 100644
--- a/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
+++ b/tests/auto/qbuttongroup/tst_qbuttongroup.cpp
@@ -128,14 +128,15 @@ void tst_QButtonGroup::cleanup()
{
}
+QT_BEGIN_NAMESPACE
+extern bool Q_GUI_EXPORT qt_tab_all_widgets;
+QT_END_NAMESPACE
+
+
void tst_QButtonGroup::arrowKeyNavigation()
{
-#ifdef Q_WS_MAC
- QSettings appleSettings(QLatin1String("apple.com"));
- QVariant appleValue = appleSettings.value(QLatin1String("AppleKeyboardUIMode"), 0);
- if (!(appleValue.toInt() & 0x2))
+ if (!qt_tab_all_widgets)
QSKIP("This test requires full keyboard control to be enabled.", SkipAll);
-#endif
QDialog dlg(0);
QHBoxLayout layout(&dlg);
diff --git a/tests/auto/qcombobox/tst_qcombobox.cpp b/tests/auto/qcombobox/tst_qcombobox.cpp
index e76f0f7..0d3469d 100644
--- a/tests/auto/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/qcombobox/tst_qcombobox.cpp
@@ -151,6 +151,7 @@ private slots:
void subControlRectsWithOffset_data();
void subControlRectsWithOffset();
void task260974_menuItemRectangleForComboBoxPopup();
+ void removeItem();
protected slots:
void onEditTextChanged( const QString &newString );
@@ -2398,5 +2399,22 @@ void tst_QComboBox::task260974_menuItemRectangleForComboBoxPopup()
#endif
}
+void tst_QComboBox::removeItem()
+{
+ QComboBox cb;
+ cb.removeItem(-1);
+ cb.removeItem(1);
+ cb.removeItem(0);
+ QCOMPARE(cb.count(), 0);
+
+ cb.addItem("foo");
+ cb.removeItem(-1);
+ QCOMPARE(cb.count(), 1);
+ cb.removeItem(1);
+ QCOMPARE(cb.count(), 1);
+ cb.removeItem(0);
+ QCOMPARE(cb.count(), 0);
+}
+
QTEST_MAIN(tst_QComboBox)
#include "tst_qcombobox.moc"
diff --git a/tests/auto/qdom/tst_qdom.cpp b/tests/auto/qdom/tst_qdom.cpp
index 6637202..0d58554e 100644
--- a/tests/auto/qdom/tst_qdom.cpp
+++ b/tests/auto/qdom/tst_qdom.cpp
@@ -322,6 +322,7 @@ void tst_QDom::toString_01_data()
*/
void tst_QDom::toString_01()
{
+ QFAIL("make test fail instead of timing out, will be fixed later (QT-2357)");
QFETCH(QString, fileName);
QFile f(fileName);
diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp
index dc2ca61..2f9410b 100644
--- a/tests/auto/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp
@@ -140,36 +140,6 @@ private slots:
void clearLineEdit();
void enableChooseButton();
void hooks();
- void listRoot();
- void heapCorruption();
- void deleteDirAndFiles();
- void filter();
- void showNameFilterDetails();
- void unc();
- void emptyUncPath();
-
- void task178897_minimumSize();
- void task180459_lastDirectory_data();
- void task180459_lastDirectory();
- void task227304_proxyOnFileDialog();
- void task227930_correctNavigationKeyboardBehavior();
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- void task226366_lowerCaseHardDriveWindows();
-#endif
- void task233037_selectingDirectory();
- void task235069_hideOnEscape();
- void task236402_dontWatchDeletedDir();
- void task203703_returnProperSeparator();
- void task228844_ensurePreviousSorting();
- void task239706_editableFilterCombo();
- void task218353_relativePaths();
- void task251321_sideBarHiddenEntries();
- void task251341_sideBarRemoveEntries();
- void task254490_selectFileMultipleTimes();
- void task257579_sideBarWithNonCleanUrls();
- void task259105_filtersCornerCases();
-
- void QTBUG4419_lineEditSelectAll();
private:
QByteArray userSettings;
@@ -1345,842 +1315,5 @@ void tst_QFiledialog::hooks()
QCOMPARE(QFileDialog::getSaveFileName(), QString("saveName"));
}
-void tst_QFiledialog::listRoot()
-{
-#if defined QT_BUILD_INTERNAL
- QFileInfoGatherer::fetchedRoot = false;
- QString dir(QDir::currentPath());
- QNonNativeFileDialog fd(0, QString(), dir);
- fd.show();
- QCOMPARE(QFileInfoGatherer::fetchedRoot,false);
- fd.setDirectory("");
- QTest::qWait(500);
- QCOMPARE(QFileInfoGatherer::fetchedRoot,true);
-#endif
-}
-
-void tst_QFiledialog::heapCorruption()
-{
- QVector<QNonNativeFileDialog*> dialogs;
- for (int i=0; i < 10; i++) {
- QNonNativeFileDialog *f = new QNonNativeFileDialog(NULL);
- dialogs << f;
- }
- qDeleteAll(dialogs);
-}
-
-struct FriendlyQFileDialog : public QFileDialog
-{
- friend class tst_QFileDialog;
- Q_DECLARE_PRIVATE(QFileDialog)
-};
-
-
-void tst_QFiledialog::deleteDirAndFiles()
-{
-#if defined QT_BUILD_INTERNAL
- QString tempPath = QDir::tempPath() + '/' + "QFileDialogTestDir4FullDelete";
- QDir dir;
- QVERIFY(dir.mkpath(tempPath + "/foo"));
- QVERIFY(dir.mkpath(tempPath + "/foo/B"));
- QVERIFY(dir.mkpath(tempPath + "/foo/B"));
- QVERIFY(dir.mkpath(tempPath + "/foo/c"));
- QVERIFY(dir.mkpath(tempPath + "/bar"));
- QFile(tempPath + "/foo/a");
- QTemporaryFile *t;
- t = new QTemporaryFile(tempPath + "/foo/aXXXXXX");
- t->setAutoRemove(false);
- t->open();
- t->close();
- delete t;
-
- t = new QTemporaryFile(tempPath + "/foo/B/yXXXXXX");
- t->setAutoRemove(false);
- t->open();
- t->close();
- delete t;
- FriendlyQFileDialog fd;
- fd.setOption(QFileDialog::DontUseNativeDialog);
- fd.d_func()->removeDirectory(tempPath);
- QFileInfo info(tempPath);
- QTest::qWait(2000);
- QVERIFY(!info.exists());
-#endif
-}
-
-void tst_QFiledialog::filter()
-{
- QNonNativeFileDialog fd;
- QAction *hiddenAction = qFindChild<QAction*>(&fd, "qt_show_hidden_action");
- QVERIFY(hiddenAction);
- QVERIFY(hiddenAction->isEnabled());
- QVERIFY(!hiddenAction->isChecked());
- QDir::Filters filter = fd.filter();
- filter |= QDir::Hidden;
- fd.setFilter(filter);
- QVERIFY(hiddenAction->isChecked());
-}
-
-void tst_QFiledialog::showNameFilterDetails()
-{
- QNonNativeFileDialog fd;
- QComboBox *filters = qFindChild<QComboBox*>(&fd, "fileTypeCombo");
- QVERIFY(filters);
- QVERIFY(fd.isNameFilterDetailsVisible());
-
-
- QStringList filterChoices;
- filterChoices << "Image files (*.png *.xpm *.jpg)"
- << "Text files (*.txt)"
- << "Any files (*.*)";
- fd.setFilters(filterChoices);
-
- fd.setNameFilterDetailsVisible(false);
- QCOMPARE(filters->itemText(0), QString("Image files"));
- QCOMPARE(filters->itemText(1), QString("Text files"));
- QCOMPARE(filters->itemText(2), QString("Any files"));
-
- fd.setNameFilterDetailsVisible(true);
- QCOMPARE(filters->itemText(0), filterChoices.at(0));
- QCOMPARE(filters->itemText(1), filterChoices.at(1));
- QCOMPARE(filters->itemText(2), filterChoices.at(2));
-}
-
-void tst_QFiledialog::unc()
-{
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
- // Only test UNC on Windows./
- QString dir("\\\\" + QtNetworkSettings::winServerName() + "\\testsharewritable");
-#else
- QString dir(QDir::currentPath());
-#endif
- QVERIFY(QFile::exists(dir));
- QNonNativeFileDialog fd(0, QString(), dir);
- QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
- QVERIFY(model);
- QCOMPARE(model->index(fd.directory().absolutePath()), model->index(dir));
-}
-
-void tst_QFiledialog::emptyUncPath()
-{
- QNonNativeFileDialog fd;
- fd.show();
- QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
- QVERIFY(lineEdit);
- // press 'keys' for the input
- for (int i = 0; i < 3 ; ++i)
- QTest::keyPress(lineEdit, Qt::Key_Backslash);
- QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
- QVERIFY(model);
-}
-
-void tst_QFiledialog::task178897_minimumSize()
-{
- QNonNativeFileDialog fd;
- QStringList history = fd.history();
- history << QDir::toNativeSeparators("/verylongdirectory/"
- "aaaaaaaaaabbbbbbbbcccccccccccddddddddddddddeeeeeeeeeeeeffffffffffgggtggggggggghhhhhhhhiiiiiijjjk");
- fd.setHistory(history);
- fd.show();
-
- QSize ms = fd.layout()->minimumSize();
- QVERIFY(ms.width() < 400);
-}
-
-void tst_QFiledialog::task180459_lastDirectory_data()
-{
- QTest::addColumn<QString>("path");
- QTest::addColumn<QString>("directory");
- QTest::addColumn<bool>("isEnabled");
- QTest::addColumn<QString>("result");
-
- QTest::newRow("path+file") << QDir::homePath() + QDir::separator() + "foo"
- << QDir::homePath() << true
- << QDir::homePath() + QDir::separator() + "foo" ;
- QTest::newRow("no path") << ""
- << QDir::tempPath() << false << QString();
- QTest::newRow("file") << "foo"
- << QDir::currentPath() << true
- << QDir::currentPath() + QDir::separator() + "foo" ;
- QTest::newRow("path") << QDir::homePath()
- << QDir::homePath() << false << QString();
- QTest::newRow("path not existing") << "/usr/bin/foo/bar/foo/foo.txt"
- << QDir::tempPath() << true
- << QDir::tempPath() + QDir::separator() + "foo.txt";
-
-}
-
-void tst_QFiledialog::task180459_lastDirectory()
-{
- //first visit the temp directory and close the dialog
- QNonNativeFileDialog *dlg = new QNonNativeFileDialog(0, "", QDir::tempPath());
- QFileSystemModel *model = qFindChild<QFileSystemModel*>(dlg, "qt_filesystem_model");
- QVERIFY(model);
- QCOMPARE(model->index(QDir::tempPath()), model->index(dlg->directory().absolutePath()));
- delete dlg;
-
- QFETCH(QString, path);
- QFETCH(QString, directory);
- QFETCH(bool, isEnabled);
- QFETCH(QString, result);
-
- dlg = new QNonNativeFileDialog(0, "", path);
- model = qFindChild<QFileSystemModel*>(dlg, "qt_filesystem_model");
- QVERIFY(model);
- dlg->setAcceptMode(QFileDialog::AcceptSave);
- QCOMPARE(model->index(dlg->directory().absolutePath()), model->index(directory));
-
- QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(dlg, "buttonBox");
- QPushButton *button = buttonBox->button(QDialogButtonBox::Save);
- QVERIFY(button);
- QCOMPARE(button->isEnabled(), isEnabled);
- if (isEnabled)
- QCOMPARE(model->index(result), model->index(dlg->selectedFiles().first()));
-
- delete dlg;
-}
-
-
-
-class FilterDirModel : public QSortFilterProxyModel
-{
-
-public:
- FilterDirModel(QString root, QObject* parent=0):QSortFilterProxyModel(parent), m_root(root)
- {}
- ~FilterDirModel()
- {};
-
-protected:
- bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
- {
- QModelIndex parentIndex;
- parentIndex = source_parent;
-
- QString path;
- path = parentIndex.child(source_row,0).data(Qt::DisplayRole).toString();
-
- do {
- path = parentIndex.data(Qt::DisplayRole).toString() + "/" + path;
- parentIndex = parentIndex.parent();
- } while(parentIndex.isValid());
-
- QFileInfo info(path);
- if (info.isDir() && (QDir(path) != m_root))
- return false;
- return true;
- }
-
-
-private:
- QDir m_root;
-
-
-};
-
-class sortProxy : public QSortFilterProxyModel
-{
-public:
- sortProxy(QObject *parent) : QSortFilterProxyModel(parent)
- {
- }
-protected:
- virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const
- {
- QFileSystemModel * const model = qobject_cast<QFileSystemModel *>(sourceModel());
- const QFileInfo leftInfo(model->fileInfo(left));
- const QFileInfo rightInfo(model->fileInfo(right));
-
- if (leftInfo.isDir() == rightInfo.isDir())
- return(leftInfo.filePath().compare(rightInfo.filePath(),Qt::CaseInsensitive) < 0);
- else if (leftInfo.isDir())
- return(false);
- else
- return(true);
- }
-};
-
-class CrashDialog : public QNonNativeFileDialog
-{
- Q_OBJECT
-
-public:
- CrashDialog(QWidget *parent, const QString &caption, const
-QString &dir, const QString &filter)
- : QNonNativeFileDialog(parent, caption, dir, filter)
- {
- sortProxy *proxyModel = new sortProxy(this);
- setProxyModel(proxyModel);
- }
-};
-
-void tst_QFiledialog::task227304_proxyOnFileDialog()
-{
-#if defined QT_BUILD_INTERNAL
- QNonNativeFileDialog fd(0, "", QDir::currentPath(), 0);
- fd.setProxyModel(new FilterDirModel(QDir::currentPath()));
- fd.show();
- QLineEdit *edit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
- QTest::qWait(200);
- QTest::keyClick(edit, Qt::Key_T);
- QTest::keyClick(edit, Qt::Key_S);
- QTest::qWait(200);
- QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
-
- CrashDialog *dialog = new CrashDialog(0, QString("crash dialog test"), QDir::homePath(), QString("*") );
- dialog->setFileMode(QFileDialog::ExistingFile);
- dialog->show();
-
- QListView *list = qFindChild<QListView*>(dialog, "listView");
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::keyClick(list, Qt::Key_Return);
- QTest::qWait(200);
-
- dialog->close();
- fd.close();
-
- QNonNativeFileDialog fd2(0, "I should not crash with a proxy", QDir::tempPath(), 0);
- QSortFilterProxyModel *pm = new QSortFilterProxyModel;
- fd2.setProxyModel(pm);
- fd2.show();
- QSidebar *sidebar = qFindChild<QSidebar*>(&fd2, "sidebar");
- sidebar->setFocus();
- sidebar->selectUrl(QUrl::fromLocalFile(QDir::homePath()));
- QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(1, 0)).center());
- QTest::qWait(250);
- //We shouldn't crash
-#endif
-}
-
-void tst_QFiledialog::task227930_correctNavigationKeyboardBehavior()
-{
- QDir current = QDir::currentPath();
- current.mkdir("test");
- current.cd("test");
- QFile file("test/out.txt");
- QFile file2("test/out2.txt");
- QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
- QVERIFY(file2.open(QIODevice::WriteOnly | QIODevice::Text));
- current.cdUp();
- current.mkdir("test2");
- QNonNativeFileDialog fd;
- fd.setViewMode(QFileDialog::List);
- fd.setDirectory(current.absolutePath());
- fd.show();
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::keyClick(list, Qt::Key_Return);
- QTest::qWait(200);
- QTest::mouseClick(list->viewport(), Qt::LeftButton,0);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::keyClick(list, Qt::Key_Backspace);
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::keyClick(list, Qt::Key_Return);
- QTest::qWait(200);
- QCOMPARE(fd.isVisible(), true);
- QTest::qWait(200);
- file.close();
- file2.close();
- file.remove();
- file2.remove();
- current.rmdir("test");
- current.rmdir("test2");
-}
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
-void tst_QFiledialog::task226366_lowerCaseHardDriveWindows()
-{
- QNonNativeFileDialog fd;
- fd.setDirectory(QDir::root().path());
- fd.show();
- QLineEdit *edit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
- QToolButton *buttonParent = qFindChild<QToolButton*>(&fd, "toParentButton");
- QTest::qWait(200);
- QTest::mouseClick(buttonParent, Qt::LeftButton,0,QPoint(0,0));
- QTest::qWait(2000);
- QTest::keyClick(edit, Qt::Key_C);
- QTest::qWait(200);
- QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
- QTest::qWait(200);
- QCOMPARE(edit->text(), QString("C:"));
- QTest::qWait(2000);
- //i clear my previous selection in the completer
- QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
- edit->clear();
- QTest::keyClick(edit, (char)(Qt::Key_C | Qt::SHIFT));
- QTest::qWait(200);
- QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
- QCOMPARE(edit->text(), QString("C:"));
-}
-#endif
-
-void tst_QFiledialog::task233037_selectingDirectory()
-{
- QDir current = QDir::currentPath();
- current.mkdir("test");
- QNonNativeFileDialog fd;
- fd.setViewMode(QFileDialog::List);
- fd.setDirectory(current.absolutePath());
- fd.setAcceptMode( QFileDialog::AcceptSave);
- fd.show();
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- QTest::qWait(3000); // Wait for sort to settle (I need a signal).
-#ifdef QT_KEYPAD_NAVIGATION
- list->setEditFocus(true);
-#endif
- QTest::keyClick(list, Qt::Key_Down);
- QTest::qWait(100);
- QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
- QPushButton *button = buttonBox->button(QDialogButtonBox::Save);
- QVERIFY(button);
- QCOMPARE(button->isEnabled(), true);
- current.rmdir("test");
-}
-
-void tst_QFiledialog::task235069_hideOnEscape()
-{
- QDir current = QDir::currentPath();
- QNonNativeFileDialog fd;
- fd.setViewMode(QFileDialog::List);
- fd.setDirectory(current.absolutePath());
- fd.setAcceptMode( QFileDialog::AcceptSave);
- fd.show();
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- list->setFocus();
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Escape);
- QCOMPARE(fd.isVisible(), false);
- QNonNativeFileDialog fd2;
- fd2.setDirectory(current.absolutePath());
- fd2.setAcceptMode( QFileDialog::AcceptSave);
- fd2.show();
- QLineEdit *edit = qFindChild<QLineEdit*>(&fd2, "fileNameEdit");
- QTest::keyClick(edit, Qt::Key_Escape);
- QCOMPARE(fd2.isVisible(), false);
-}
-
-void tst_QFiledialog::task236402_dontWatchDeletedDir()
-{
-#if defined QT_BUILD_INTERNAL
- //THIS TEST SHOULD NOT DISPLAY WARNINGS
- QDir current = QDir::currentPath();
- //make sure it is the first on the list
- current.mkdir("aaaaaaaaaa");
- FriendlyQFileDialog fd;
- fd.setViewMode(QFileDialog::List);
- fd.setDirectory(current.absolutePath());
- fd.setAcceptMode( QFileDialog::AcceptSave);
- fd.show();
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- list->setFocus();
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Return);
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Backspace);
- QTest::keyClick(list, Qt::Key_Down);
- QTest::qWait(200);
- fd.d_func()->removeDirectory(current.absolutePath() + "/aaaaaaaaaa/");
- QTest::qWait(1000);
-#endif
-}
-
-void tst_QFiledialog::task203703_returnProperSeparator()
-{
- QDir current = QDir::currentPath();
- current.mkdir("aaaaaaaaaaaaaaaaaa");
- QNonNativeFileDialog fd;
- fd.setDirectory(current.absolutePath());
- fd.setViewMode(QFileDialog::List);
- fd.setFileMode(QFileDialog::Directory);
- fd.show();
- QTest::qWait(500);
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- list->setFocus();
- QTest::qWait(200);
- QTest::keyClick(list, Qt::Key_Return);
- QTest::qWait(1000);
- QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
- QPushButton *button = buttonBox->button(QDialogButtonBox::Cancel);
- QTest::keyClick(button, Qt::Key_Return);
- QTest::qWait(500);
- QString result = fd.selectedFiles().first();
- QVERIFY(result.at(result.count() - 1) != '/');
- QVERIFY(!result.contains('\\'));
- current.rmdir("aaaaaaaaaaaaaaaaaa");
-}
-
-void tst_QFiledialog::task228844_ensurePreviousSorting()
-{
- QDir current = QDir::currentPath();
- current.mkdir("aaaaaaaaaaaaaaaaaa");
- current.cd("aaaaaaaaaaaaaaaaaa");
- current.mkdir("a");
- current.mkdir("b");
- current.mkdir("c");
- current.mkdir("d");
- current.mkdir("e");
- current.mkdir("f");
- current.mkdir("g");
- QTemporaryFile *tempFile = new QTemporaryFile(current.absolutePath() + "/rXXXXXX");
- tempFile->open();
- current.cdUp();
-
- QNonNativeFileDialog fd;
- fd.setDirectory(current.absolutePath());
- fd.setViewMode(QFileDialog::Detail);
- fd.show();
- QTest::qWait(500);
- QTreeView *tree = qFindChild<QTreeView*>(&fd, "treeView");
- tree->header()->setSortIndicator(3,Qt::DescendingOrder);
- QTest::qWait(200);
- QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
- QPushButton *button = buttonBox->button(QDialogButtonBox::Open);
- QTest::mouseClick(button, Qt::LeftButton);
- QTest::qWait(500);
-
- QNonNativeFileDialog fd2;
- fd2.setFileMode(QFileDialog::Directory);
- fd2.restoreState(fd.saveState());
- current.cd("aaaaaaaaaaaaaaaaaa");
- fd2.setDirectory(current.absolutePath());
- fd2.show();
- QTest::qWait(500);
- QTreeView *tree2 = qFindChild<QTreeView*>(&fd2, "treeView");
- tree2->setFocus();
-
- QCOMPARE(tree2->rootIndex().data(QFileSystemModel::FilePathRole).toString(),current.absolutePath());
-
- QDialogButtonBox *buttonBox2 = qFindChild<QDialogButtonBox*>(&fd2, "buttonBox");
- QPushButton *button2 = buttonBox2->button(QDialogButtonBox::Open);
- fd2.selectFile("g");
- QTest::mouseClick(button2, Qt::LeftButton);
- QTest::qWait(500);
-
- QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QChar('/') + QLatin1String("g"));
-
- QNonNativeFileDialog fd3(0, "This is a third file dialog", tempFile->fileName());
- fd3.restoreState(fd.saveState());
- fd3.setFileMode(QFileDialog::Directory);
- fd3.show();
- QTest::qWait(500);
- QTreeView *tree3 = qFindChild<QTreeView*>(&fd3, "treeView");
- tree3->setFocus();
-
- QCOMPARE(tree3->rootIndex().data(QFileSystemModel::FilePathRole).toString(), current.absolutePath());
-
- QDialogButtonBox *buttonBox3 = qFindChild<QDialogButtonBox*>(&fd3, "buttonBox");
- QPushButton *button3 = buttonBox3->button(QDialogButtonBox::Open);
- QTest::mouseClick(button3, Qt::LeftButton);
- QTest::qWait(500);
-
- QCOMPARE(fd3.selectedFiles().first(), tempFile->fileName());
-
- current.cd("aaaaaaaaaaaaaaaaaa");
- current.rmdir("a");
- current.rmdir("b");
- current.rmdir("c");
- current.rmdir("d");
- current.rmdir("e");
- current.rmdir("f");
- current.rmdir("g");
- tempFile->close();
- delete tempFile;
- current.cdUp();
- current.rmdir("aaaaaaaaaaaaaaaaaa");
-}
-
-
-void tst_QFiledialog::task239706_editableFilterCombo()
-{
- QNonNativeFileDialog d;
- d.setNameFilter("*.cpp *.h");
-
- d.show();
- QTest::qWait(500);
-
- QList<QComboBox *> comboList = d.findChildren<QComboBox *>();
- QComboBox *filterCombo = 0;
- foreach (QComboBox *combo, comboList) {
- if (combo->objectName() == QString("fileTypeCombo")) {
- filterCombo = combo;
- break;
- }
- }
- Q_ASSERT(filterCombo);
- filterCombo->setEditable(true);
- QTest::mouseClick(filterCombo, Qt::LeftButton);
- QTest::keyPress(filterCombo, Qt::Key_X);
- QTest::keyPress(filterCombo, Qt::Key_Enter); // should not trigger assertion failure
-}
-
-void tst_QFiledialog::task218353_relativePaths()
-{
- QDir appDir = QDir::current();
- QVERIFY(appDir.cdUp() != false);
- QNonNativeFileDialog d(0, "TestDialog", "..");
- QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
-
- d.setDirectory(appDir.absolutePath() + QLatin1String("/non-existing-directory/../another-non-existing-dir/../"));
- QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
-
- QDir::current().mkdir("test");
- appDir = QDir::current();
- d.setDirectory(appDir.absolutePath() + QLatin1String("/test/../test/../"));
- QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
- appDir.rmdir("test");
-}
-
-void tst_QFiledialog::task251321_sideBarHiddenEntries()
-{
-#if defined QT_BUILD_INTERNAL
- QNonNativeFileDialog fd;
-
- QDir current = QDir::currentPath();
- current.mkdir(".hidden");
- QDir hiddenDir = QDir(".hidden");
- hiddenDir.mkdir("subdir");
- QDir hiddenSubDir = QDir(".hidden/subdir");
- hiddenSubDir.mkdir("happy");
- hiddenSubDir.mkdir("happy2");
-
- QList<QUrl> urls;
- urls << QUrl::fromLocalFile(hiddenSubDir.absolutePath());
- fd.setSidebarUrls(urls);
- fd.show();
- QTest::qWait(250);
-
- QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
- sidebar->setFocus();
- sidebar->selectUrl(QUrl::fromLocalFile(hiddenSubDir.absolutePath()));
- QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(0, 0)).center());
- QTest::qWait(250);
-
- QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
- QCOMPARE(model->rowCount(model->index(hiddenSubDir.absolutePath())), 2);
-
- hiddenSubDir.rmdir("happy2");
- hiddenSubDir.rmdir("happy");
- hiddenDir.rmdir("subdir");
- current.rmdir(".hidden");
-#endif
-}
-
-#if defined QT_BUILD_INTERNAL
-class MyQSideBar : public QSidebar
-{
-public :
- MyQSideBar(QWidget *parent = 0) : QSidebar(parent)
- {}
-
- void removeSelection() {
- QList<QModelIndex> idxs = selectionModel()->selectedIndexes();
- QList<QPersistentModelIndex> indexes;
- for (int i = 0; i < idxs.count(); i++)
- indexes.append(idxs.at(i));
-
- for (int i = 0; i < indexes.count(); ++i)
- if (!indexes.at(i).data(Qt::UserRole + 1).toUrl().path().isEmpty())
- model()->removeRow(indexes.at(i).row());
- }
-};
-#endif
-
-void tst_QFiledialog::task251341_sideBarRemoveEntries()
-{
-#if defined QT_BUILD_INTERNAL
- QNonNativeFileDialog fd;
-
- QDir current = QDir::currentPath();
- current.mkdir("testDir");
- QDir testSubDir = QDir("testDir");
-
- QList<QUrl> urls;
- urls << QUrl::fromLocalFile(testSubDir.absolutePath());
- urls << QUrl::fromLocalFile("NotFound");
- fd.setSidebarUrls(urls);
- fd.show();
- QTest::qWait(250);
-
- QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
- sidebar->setFocus();
- //We enter in the first bookmark
- sidebar->selectUrl(QUrl::fromLocalFile(testSubDir.absolutePath()));
- QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(0, 0)).center());
- QTest::qWait(250);
-
- QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
- //There is no file
- QCOMPARE(model->rowCount(model->index(testSubDir.absolutePath())), 0);
- //Icon is not enabled QUrlModel::EnabledRole
- QVariant value = sidebar->model()->index(0, 0).data(Qt::UserRole + 2);
- QCOMPARE(qvariant_cast<bool>(value), true);
-
- sidebar->setFocus();
- //We enter in the second bookmark which is invalid
- sidebar->selectUrl(QUrl::fromLocalFile("NotFound"));
- QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(1, 0)).center());
- QTest::qWait(250);
-
- //We fallback to root because the entry in the bookmark is invalid
- QCOMPARE(model->rowCount(model->index("NotFound")), model->rowCount(model->index(model->rootPath())));
- //Icon is not enabled QUrlModel::EnabledRole
- value = sidebar->model()->index(1, 0).data(Qt::UserRole + 2);
- QCOMPARE(qvariant_cast<bool>(value), false);
-
- MyQSideBar mySideBar;
- mySideBar.init(model, urls);
- mySideBar.show();
- mySideBar.selectUrl(QUrl::fromLocalFile(testSubDir.absolutePath()));
- QTest::qWait(1000);
- mySideBar.removeSelection();
-
- //We remove the first entry
- QList<QUrl> expected;
- expected << QUrl::fromLocalFile("NotFound");
- QCOMPARE(mySideBar.urls(), expected);
-
- mySideBar.selectUrl(QUrl::fromLocalFile("NotFound"));
- mySideBar.removeSelection();
-
- //We remove the second entry
- expected.clear();
- QCOMPARE(mySideBar.urls(), expected);
-
- current.rmdir("testDir");
-#endif
-}
-
-void tst_QFiledialog::task254490_selectFileMultipleTimes()
-{
- QString tempPath = QDir::tempPath();
- QTemporaryFile *t;
- t = new QTemporaryFile;
- t->open();
- QNonNativeFileDialog fd(0, "TestFileDialog");
-
- fd.setDirectory(tempPath);
- fd.setViewMode(QFileDialog::List);
- fd.setAcceptMode(QFileDialog::AcceptSave);
- fd.setFileMode(QFileDialog::AnyFile);
-
- //This should select the file in the QFileDialog
- fd.selectFile(t->fileName());
-
- //This should clear the selection and write it into the filename line edit
- fd.selectFile("new_file.txt");
-
- fd.show();
- QTest::qWait(250);
-
- QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
- QVERIFY(lineEdit);
- QCOMPARE(lineEdit->text(),QLatin1String("new_file.txt"));
- QListView *list = qFindChild<QListView*>(&fd, "listView");
- QVERIFY(list);
- QCOMPARE(list->selectionModel()->selectedRows(0).count(), 0);
-
- t->deleteLater();
-}
-
-void tst_QFiledialog::task257579_sideBarWithNonCleanUrls()
-{
-#if defined QT_BUILD_INTERNAL
- QDir tempDir = QDir::temp();
- QLatin1String dirname("autotest_task257579");
- tempDir.rmdir(dirname); //makes sure it doesn't exist any more
- QVERIFY(tempDir.mkdir(dirname));
- QString url = QString::fromLatin1("%1/%2/..").arg(tempDir.absolutePath()).arg(dirname);
- QNonNativeFileDialog fd;
- fd.setSidebarUrls(QList<QUrl>() << QUrl::fromLocalFile(url));
- QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
- QCOMPARE(sidebar->urls().count(), 1);
- QVERIFY(sidebar->urls().first().toLocalFile() != url);
- QCOMPARE(sidebar->urls().first().toLocalFile(), QDir::cleanPath(url));
-
-#ifdef Q_OS_WIN
- QCOMPARE(sidebar->model()->index(0,0).data().toString().toLower(), tempDir.dirName().toLower());
-#else
- QCOMPARE(sidebar->model()->index(0,0).data().toString(), tempDir.dirName());
-#endif
-
- //all tests are finished, we can remove the temporary dir
- QVERIFY(tempDir.rmdir(dirname));
-#endif
-}
-
-void tst_QFiledialog::task259105_filtersCornerCases()
-{
- QNonNativeFileDialog fd(0, "TestFileDialog");
- fd.setNameFilter(QLatin1String("All Files! (*);;Text Files (*.txt)"));
- fd.setOption(QFileDialog::HideNameFilterDetails, true);
- fd.show();
- QTest::qWait(250);
-
- //Extensions are hidden
- QComboBox *filters = qFindChild<QComboBox*>(&fd, "fileTypeCombo");
- QVERIFY(filters);
- QCOMPARE(filters->currentText(), QLatin1String("All Files!"));
- filters->setCurrentIndex(1);
- QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
-
- //We should have the full names
- fd.setOption(QFileDialog::HideNameFilterDetails, false);
- QTest::qWait(250);
- filters->setCurrentIndex(0);
- QCOMPARE(filters->currentText(), QLatin1String("All Files! (*)"));
- filters->setCurrentIndex(1);
- QCOMPARE(filters->currentText(), QLatin1String("Text Files (*.txt)"));
-
- //Corner case undocumented of the task
- fd.setNameFilter(QLatin1String("\352 (I like cheese) All Files! (*);;Text Files (*.txt)"));
- QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files! (*)"));
- filters->setCurrentIndex(1);
- QCOMPARE(filters->currentText(), QLatin1String("Text Files (*.txt)"));
-
- fd.setOption(QFileDialog::HideNameFilterDetails, true);
- filters->setCurrentIndex(0);
- QTest::qWait(500);
- QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files!"));
- filters->setCurrentIndex(1);
- QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
-
- fd.setOption(QFileDialog::HideNameFilterDetails, true);
- filters->setCurrentIndex(0);
- QTest::qWait(500);
- QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files!"));
- filters->setCurrentIndex(1);
- QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
-}
-
-void tst_QFiledialog::QTBUG4419_lineEditSelectAll()
-{
- QString tempPath = QDir::tempPath();
- QTemporaryFile *t;
- t = new QTemporaryFile;
- t->open();
- QNonNativeFileDialog fd(0, "TestFileDialog", t->fileName());
-
- fd.setDirectory(tempPath);
- fd.setViewMode(QFileDialog::List);
- fd.setAcceptMode(QFileDialog::AcceptSave);
- fd.setFileMode(QFileDialog::AnyFile);
-
- fd.show();
- QApplication::setActiveWindow(&fd);
- QTest::qWaitForWindowShown(&fd);
- QTRY_COMPARE(fd.isVisible(), true);
- QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget*>(&fd));
-
- QTest::qWait(250);
- QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
-
- QCOMPARE(tempPath + QChar('/') + lineEdit->text(), t->fileName());
- QCOMPARE(tempPath + QChar('/') + lineEdit->selectedText(), t->fileName());
-}
-
QTEST_MAIN(tst_QFiledialog)
#include "tst_qfiledialog.moc"
diff --git a/tests/auto/qfiledialog2/qfiledialog2.pro b/tests/auto/qfiledialog2/qfiledialog2.pro
new file mode 100644
index 0000000..4ebf977
--- /dev/null
+++ b/tests/auto/qfiledialog2/qfiledialog2.pro
@@ -0,0 +1,27 @@
+############################################################
+# Project file for autotest for file qfiledialog.h
+############################################################
+
+load(qttest_p4)
+
+SOURCES += tst_qfiledialog2.cpp
+
+wince*|symbian {
+ addFiles.sources = *.cpp
+ addFiles.path = .
+ filesInDir.sources = *.pro
+ filesInDir.path = someDir
+ DEPLOYMENT += addFiles filesInDir
+}
+
+symbian:TARGET.EPOCHEAPSIZE="0x100 0x1000000"
+symbian:HEADERS += ../../../include/qtgui/private/qfileinfogatherer_p.h
+
+wince* {
+ DEFINES += SRCDIR=\\\"./\\\"
+} else:symbian {
+ TARGET.UID3 = 0xE0340003
+ DEFINES += SYMBIAN_SRCDIR_UID=$$lower($$replace(TARGET.UID3,"0x",""))
+} else {
+ DEFINES += SRCDIR=\\\"$$PWD/\\\"
+}
diff --git a/tests/auto/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/qfiledialog2/tst_qfiledialog2.cpp
new file mode 100644
index 0000000..83ddd39
--- /dev/null
+++ b/tests/auto/qfiledialog2/tst_qfiledialog2.cpp
@@ -0,0 +1,1044 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+
+#include <qcoreapplication.h>
+#include <qdebug.h>
+#include <qfiledialog.h>
+#include <qabstractitemdelegate.h>
+#include <qdirmodel.h>
+#include <qitemdelegate.h>
+#include <qlistview.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qtreeview.h>
+#include <qheaderview.h>
+#include <qcompleter.h>
+#include <qaction.h>
+#include <qdialogbuttonbox.h>
+#include <qsortfilterproxymodel.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include "../../shared/util.h"
+#include "../../../src/gui/dialogs/qsidebar_p.h"
+#include "../../../src/gui/dialogs/qfilesystemmodel_p.h"
+#include "../../../src/gui/dialogs/qfiledialog_p.h"
+
+#include "../network-settings.h"
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+#if defined(Q_OS_SYMBIAN)
+# define STRINGIFY(x) #x
+# define TOSTRING(x) STRINGIFY(x)
+# define SRCDIR "C:/Private/" TOSTRING(SYMBIAN_SRCDIR_UID) "/"
+#endif
+
+class QNonNativeFileDialog : public QFileDialog
+{
+ Q_OBJECT
+public:
+ QNonNativeFileDialog(QWidget *parent = 0, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString())
+ : QFileDialog(parent, caption, directory, filter)
+ {
+ setOption(QFileDialog::DontUseNativeDialog, true);
+ }
+};
+
+class tst_QFiledialog : public QObject
+{
+Q_OBJECT
+
+public:
+ tst_QFiledialog();
+ virtual ~tst_QFiledialog();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void listRoot();
+ void heapCorruption();
+ void deleteDirAndFiles();
+ void filter();
+ void showNameFilterDetails();
+ void unc();
+ void emptyUncPath();
+
+ void task178897_minimumSize();
+ void task180459_lastDirectory_data();
+ void task180459_lastDirectory();
+ void task227304_proxyOnFileDialog();
+ void task227930_correctNavigationKeyboardBehavior();
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+ void task226366_lowerCaseHardDriveWindows();
+#endif
+ void task233037_selectingDirectory();
+ void task235069_hideOnEscape();
+ void task236402_dontWatchDeletedDir();
+ void task203703_returnProperSeparator();
+ void task228844_ensurePreviousSorting();
+ void task239706_editableFilterCombo();
+ void task218353_relativePaths();
+ void task251321_sideBarHiddenEntries();
+ void task251341_sideBarRemoveEntries();
+ void task254490_selectFileMultipleTimes();
+ void task257579_sideBarWithNonCleanUrls();
+ void task259105_filtersCornerCases();
+
+ void QTBUG4419_lineEditSelectAll();
+
+private:
+ QByteArray userSettings;
+};
+
+tst_QFiledialog::tst_QFiledialog()
+{
+#if defined(Q_OS_WINCE)
+ qApp->setAutoMaximizeThreshold(-1);
+#endif
+}
+
+tst_QFiledialog::~tst_QFiledialog()
+{
+}
+
+void tst_QFiledialog::init()
+{
+ // Save the developers settings so they don't get mad when their sidebar folders are gone.
+ QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
+ settings.beginGroup(QLatin1String("Qt"));
+ userSettings = settings.value(QLatin1String("filedialog")).toByteArray();
+ settings.remove(QLatin1String("filedialog"));
+
+ // populate it with some default settings
+ QNonNativeFileDialog fd;
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1000);
+#endif
+}
+
+void tst_QFiledialog::cleanup()
+{
+ QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
+ settings.beginGroup(QLatin1String("Qt"));
+ settings.setValue(QLatin1String("filedialog"), userSettings);
+}
+
+void tst_QFiledialog::listRoot()
+{
+#if defined QT_BUILD_INTERNAL
+ QFileInfoGatherer fileInfoGatherer;
+ fileInfoGatherer.start();
+ QTest::qWait(1500);
+
+ QFileInfoGatherer::fetchedRoot = false;
+ QString dir(QDir::currentPath());
+ QNonNativeFileDialog fd(0, QString(), dir);
+ fd.show();
+ QCOMPARE(QFileInfoGatherer::fetchedRoot,false);
+ fd.setDirectory("");
+#ifdef Q_OS_WINCE
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QCOMPARE(QFileInfoGatherer::fetchedRoot,true);
+#endif
+}
+
+void tst_QFiledialog::heapCorruption()
+{
+ QVector<QNonNativeFileDialog*> dialogs;
+ for (int i=0; i < 10; i++) {
+ QNonNativeFileDialog *f = new QNonNativeFileDialog(NULL);
+ dialogs << f;
+ }
+ qDeleteAll(dialogs);
+}
+
+struct FriendlyQFileDialog : public QFileDialog
+{
+ friend class tst_QFileDialog;
+ Q_DECLARE_PRIVATE(QFileDialog)
+};
+
+
+void tst_QFiledialog::deleteDirAndFiles()
+{
+#if defined QT_BUILD_INTERNAL
+ QString tempPath = QDir::tempPath() + '/' + "QFileDialogTestDir4FullDelete";
+ QDir dir;
+ QVERIFY(dir.mkpath(tempPath + "/foo"));
+ QVERIFY(dir.mkpath(tempPath + "/foo/B"));
+ QVERIFY(dir.mkpath(tempPath + "/foo/B"));
+ QVERIFY(dir.mkpath(tempPath + "/foo/c"));
+ QVERIFY(dir.mkpath(tempPath + "/bar"));
+ QFile(tempPath + "/foo/a");
+ QTemporaryFile *t;
+ t = new QTemporaryFile(tempPath + "/foo/aXXXXXX");
+ t->setAutoRemove(false);
+ t->open();
+ t->close();
+ delete t;
+
+ t = new QTemporaryFile(tempPath + "/foo/B/yXXXXXX");
+ t->setAutoRemove(false);
+ t->open();
+ t->close();
+ delete t;
+ FriendlyQFileDialog fd;
+ fd.setOption(QFileDialog::DontUseNativeDialog);
+ fd.d_func()->removeDirectory(tempPath);
+ QFileInfo info(tempPath);
+ QTest::qWait(2000);
+ QVERIFY(!info.exists());
+#endif
+}
+
+void tst_QFiledialog::filter()
+{
+ QNonNativeFileDialog fd;
+ QAction *hiddenAction = qFindChild<QAction*>(&fd, "qt_show_hidden_action");
+ QVERIFY(hiddenAction);
+ QVERIFY(hiddenAction->isEnabled());
+ QVERIFY(!hiddenAction->isChecked());
+ QDir::Filters filter = fd.filter();
+ filter |= QDir::Hidden;
+ fd.setFilter(filter);
+ QVERIFY(hiddenAction->isChecked());
+}
+
+void tst_QFiledialog::showNameFilterDetails()
+{
+ QNonNativeFileDialog fd;
+ QComboBox *filters = qFindChild<QComboBox*>(&fd, "fileTypeCombo");
+ QVERIFY(filters);
+ QVERIFY(fd.isNameFilterDetailsVisible());
+
+
+ QStringList filterChoices;
+ filterChoices << "Image files (*.png *.xpm *.jpg)"
+ << "Text files (*.txt)"
+ << "Any files (*.*)";
+ fd.setFilters(filterChoices);
+
+ fd.setNameFilterDetailsVisible(false);
+ QCOMPARE(filters->itemText(0), QString("Image files"));
+ QCOMPARE(filters->itemText(1), QString("Text files"));
+ QCOMPARE(filters->itemText(2), QString("Any files"));
+
+ fd.setNameFilterDetailsVisible(true);
+ QCOMPARE(filters->itemText(0), filterChoices.at(0));
+ QCOMPARE(filters->itemText(1), filterChoices.at(1));
+ QCOMPARE(filters->itemText(2), filterChoices.at(2));
+}
+
+void tst_QFiledialog::unc()
+{
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+ // Only test UNC on Windows./
+ QString dir("\\\\" + QtNetworkSettings::winServerName() + "\\testsharewritable");
+#else
+ QString dir(QDir::currentPath());
+#endif
+ QVERIFY(QFile::exists(dir));
+ QNonNativeFileDialog fd(0, QString(), dir);
+ QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
+ QVERIFY(model);
+ QCOMPARE(model->index(fd.directory().absolutePath()), model->index(dir));
+}
+
+void tst_QFiledialog::emptyUncPath()
+{
+ QNonNativeFileDialog fd;
+ fd.show();
+ QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
+ QVERIFY(lineEdit);
+ // press 'keys' for the input
+ for (int i = 0; i < 3 ; ++i)
+ QTest::keyPress(lineEdit, Qt::Key_Backslash);
+ QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
+ QVERIFY(model);
+}
+
+void tst_QFiledialog::task178897_minimumSize()
+{
+ QNonNativeFileDialog fd;
+ QSize oldMs = fd.layout()->minimumSize();
+ QStringList history = fd.history();
+ history << QDir::toNativeSeparators("/verylongdirectory/"
+ "aaaaaaaaaabbbbbbbbcccccccccccddddddddddddddeeeeeeeeeeeeffffffffffgggtggggggggghhhhhhhhiiiiiijjjk");
+ fd.setHistory(history);
+ fd.show();
+
+ QSize ms = fd.layout()->minimumSize();
+ QVERIFY(ms.width() <= oldMs.width());
+}
+
+void tst_QFiledialog::task180459_lastDirectory_data()
+{
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<QString>("directory");
+ QTest::addColumn<bool>("isEnabled");
+ QTest::addColumn<QString>("result");
+
+ QTest::newRow("path+file") << QDir::homePath() + QDir::separator() + "foo"
+ << QDir::homePath() << true
+ << QDir::homePath() + QDir::separator() + "foo" ;
+ QTest::newRow("no path") << ""
+ << QDir::tempPath() << false << QString();
+ QTest::newRow("file") << "foo"
+ << QDir::currentPath() << true
+ << QDir::currentPath() + QDir::separator() + "foo" ;
+ QTest::newRow("path") << QDir::homePath()
+ << QDir::homePath() << false << QString();
+ QTest::newRow("path not existing") << "/usr/bin/foo/bar/foo/foo.txt"
+ << QDir::tempPath() << true
+ << QDir::tempPath() + QDir::separator() + "foo.txt";
+
+}
+
+void tst_QFiledialog::task180459_lastDirectory()
+{
+ //first visit the temp directory and close the dialog
+ QNonNativeFileDialog *dlg = new QNonNativeFileDialog(0, "", QDir::tempPath());
+ QFileSystemModel *model = qFindChild<QFileSystemModel*>(dlg, "qt_filesystem_model");
+ QVERIFY(model);
+ QCOMPARE(model->index(QDir::tempPath()), model->index(dlg->directory().absolutePath()));
+ delete dlg;
+
+ QFETCH(QString, path);
+ QFETCH(QString, directory);
+ QFETCH(bool, isEnabled);
+ QFETCH(QString, result);
+
+ dlg = new QNonNativeFileDialog(0, "", path);
+ model = qFindChild<QFileSystemModel*>(dlg, "qt_filesystem_model");
+ QVERIFY(model);
+ dlg->setAcceptMode(QFileDialog::AcceptSave);
+ QCOMPARE(model->index(dlg->directory().absolutePath()), model->index(directory));
+
+ QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(dlg, "buttonBox");
+ QPushButton *button = buttonBox->button(QDialogButtonBox::Save);
+ QVERIFY(button);
+ QCOMPARE(button->isEnabled(), isEnabled);
+ if (isEnabled)
+ QCOMPARE(model->index(result), model->index(dlg->selectedFiles().first()));
+
+ delete dlg;
+}
+
+
+
+class FilterDirModel : public QSortFilterProxyModel
+{
+
+public:
+ FilterDirModel(QString root, QObject* parent=0):QSortFilterProxyModel(parent), m_root(root)
+ {}
+ ~FilterDirModel()
+ {};
+
+protected:
+ bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
+ {
+ QModelIndex parentIndex;
+ parentIndex = source_parent;
+
+ QString path;
+ path = parentIndex.child(source_row,0).data(Qt::DisplayRole).toString();
+
+ do {
+ path = parentIndex.data(Qt::DisplayRole).toString() + "/" + path;
+ parentIndex = parentIndex.parent();
+ } while(parentIndex.isValid());
+
+ QFileInfo info(path);
+ if (info.isDir() && (QDir(path) != m_root))
+ return false;
+ return true;
+ }
+
+
+private:
+ QDir m_root;
+
+
+};
+
+class sortProxy : public QSortFilterProxyModel
+{
+public:
+ sortProxy(QObject *parent) : QSortFilterProxyModel(parent)
+ {
+ }
+protected:
+ virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const
+ {
+ QFileSystemModel * const model = qobject_cast<QFileSystemModel *>(sourceModel());
+ const QFileInfo leftInfo(model->fileInfo(left));
+ const QFileInfo rightInfo(model->fileInfo(right));
+
+ if (leftInfo.isDir() == rightInfo.isDir())
+ return(leftInfo.filePath().compare(rightInfo.filePath(),Qt::CaseInsensitive) < 0);
+ else if (leftInfo.isDir())
+ return(false);
+ else
+ return(true);
+ }
+};
+
+class CrashDialog : public QNonNativeFileDialog
+{
+ Q_OBJECT
+
+public:
+ CrashDialog(QWidget *parent, const QString &caption, const
+QString &dir, const QString &filter)
+ : QNonNativeFileDialog(parent, caption, dir, filter)
+ {
+ sortProxy *proxyModel = new sortProxy(this);
+ setProxyModel(proxyModel);
+ }
+};
+
+void tst_QFiledialog::task227304_proxyOnFileDialog()
+{
+#if defined QT_BUILD_INTERNAL
+ QNonNativeFileDialog fd(0, "", QDir::currentPath(), 0);
+ fd.setProxyModel(new FilterDirModel(QDir::currentPath()));
+ fd.show();
+ QLineEdit *edit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
+ QTest::qWait(200);
+ QTest::keyClick(edit, Qt::Key_T);
+ QTest::keyClick(edit, Qt::Key_S);
+ QTest::qWait(200);
+ QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
+
+ CrashDialog *dialog = new CrashDialog(0, QString("crash dialog test"), QDir::homePath(), QString("*") );
+ dialog->setFileMode(QFileDialog::ExistingFile);
+ dialog->show();
+
+ QListView *list = qFindChild<QListView*>(dialog, "listView");
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::keyClick(list, Qt::Key_Return);
+ QTest::qWait(200);
+
+ dialog->close();
+ fd.close();
+
+ QNonNativeFileDialog fd2(0, "I should not crash with a proxy", QDir::tempPath(), 0);
+ QSortFilterProxyModel *pm = new QSortFilterProxyModel;
+ fd2.setProxyModel(pm);
+ fd2.show();
+ QSidebar *sidebar = qFindChild<QSidebar*>(&fd2, "sidebar");
+ sidebar->setFocus();
+ sidebar->selectUrl(QUrl::fromLocalFile(QDir::homePath()));
+ QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(1, 0)).center());
+ QTest::qWait(250);
+ //We shouldn't crash
+#endif
+}
+
+void tst_QFiledialog::task227930_correctNavigationKeyboardBehavior()
+{
+ QDir current = QDir::currentPath();
+ current.mkdir("test");
+ current.cd("test");
+ QFile file("test/out.txt");
+ QFile file2("test/out2.txt");
+ QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
+ QVERIFY(file2.open(QIODevice::WriteOnly | QIODevice::Text));
+ current.cdUp();
+ current.mkdir("test2");
+ QNonNativeFileDialog fd;
+ fd.setViewMode(QFileDialog::List);
+ fd.setDirectory(current.absolutePath());
+ fd.show();
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::keyClick(list, Qt::Key_Return);
+ QTest::qWait(200);
+ QTest::mouseClick(list->viewport(), Qt::LeftButton,0);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::keyClick(list, Qt::Key_Backspace);
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::keyClick(list, Qt::Key_Return);
+ QTest::qWait(200);
+ QCOMPARE(fd.isVisible(), true);
+ QTest::qWait(200);
+ file.close();
+ file2.close();
+ file.remove();
+ file2.remove();
+ current.rmdir("test");
+ current.rmdir("test2");
+}
+
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
+void tst_QFiledialog::task226366_lowerCaseHardDriveWindows()
+{
+ QNonNativeFileDialog fd;
+ fd.setDirectory(QDir::root().path());
+ fd.show();
+ QLineEdit *edit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
+ QToolButton *buttonParent = qFindChild<QToolButton*>(&fd, "toParentButton");
+ QTest::qWait(200);
+ QTest::mouseClick(buttonParent, Qt::LeftButton,0,QPoint(0,0));
+ QTest::qWait(2000);
+ QTest::keyClick(edit, Qt::Key_C);
+ QTest::qWait(200);
+ QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
+ QTest::qWait(200);
+ QCOMPARE(edit->text(), QString("C:"));
+ QTest::qWait(2000);
+ //i clear my previous selection in the completer
+ QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
+ edit->clear();
+ QTest::keyClick(edit, (char)(Qt::Key_C | Qt::SHIFT));
+ QTest::qWait(200);
+ QTest::keyClick(edit->completer()->popup(), Qt::Key_Down);
+ QCOMPARE(edit->text(), QString("C:"));
+}
+#endif
+
+void tst_QFiledialog::task233037_selectingDirectory()
+{
+ QDir current = QDir::currentPath();
+ current.mkdir("test");
+ QNonNativeFileDialog fd;
+ fd.setViewMode(QFileDialog::List);
+ fd.setDirectory(current.absolutePath());
+ fd.setAcceptMode( QFileDialog::AcceptSave);
+ fd.show();
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ QTest::qWait(3000); // Wait for sort to settle (I need a signal).
+#ifdef QT_KEYPAD_NAVIGATION
+ list->setEditFocus(true);
+#endif
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::qWait(100);
+ QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
+ QPushButton *button = buttonBox->button(QDialogButtonBox::Save);
+ QVERIFY(button);
+ QCOMPARE(button->isEnabled(), true);
+ current.rmdir("test");
+}
+
+void tst_QFiledialog::task235069_hideOnEscape()
+{
+ QDir current = QDir::currentPath();
+ QNonNativeFileDialog fd;
+ fd.setViewMode(QFileDialog::List);
+ fd.setDirectory(current.absolutePath());
+ fd.setAcceptMode( QFileDialog::AcceptSave);
+ fd.show();
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ list->setFocus();
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Escape);
+ QCOMPARE(fd.isVisible(), false);
+ QNonNativeFileDialog fd2;
+ fd2.setDirectory(current.absolutePath());
+ fd2.setAcceptMode( QFileDialog::AcceptSave);
+ fd2.show();
+ QLineEdit *edit = qFindChild<QLineEdit*>(&fd2, "fileNameEdit");
+ QTest::keyClick(edit, Qt::Key_Escape);
+ QCOMPARE(fd2.isVisible(), false);
+}
+
+void tst_QFiledialog::task236402_dontWatchDeletedDir()
+{
+#if defined QT_BUILD_INTERNAL
+ //THIS TEST SHOULD NOT DISPLAY WARNINGS
+ QDir current = QDir::currentPath();
+ //make sure it is the first on the list
+ current.mkdir("aaaaaaaaaa");
+ FriendlyQFileDialog fd;
+ fd.setViewMode(QFileDialog::List);
+ fd.setDirectory(current.absolutePath());
+ fd.setAcceptMode( QFileDialog::AcceptSave);
+ fd.show();
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ list->setFocus();
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Return);
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Backspace);
+ QTest::keyClick(list, Qt::Key_Down);
+ QTest::qWait(200);
+ fd.d_func()->removeDirectory(current.absolutePath() + "/aaaaaaaaaa/");
+ QTest::qWait(1000);
+#endif
+}
+
+void tst_QFiledialog::task203703_returnProperSeparator()
+{
+ QDir current = QDir::currentPath();
+ current.mkdir("aaaaaaaaaaaaaaaaaa");
+ QNonNativeFileDialog fd;
+ fd.setDirectory(current.absolutePath());
+ fd.setViewMode(QFileDialog::List);
+ fd.setFileMode(QFileDialog::Directory);
+ fd.show();
+ QTest::qWait(500);
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ list->setFocus();
+ QTest::qWait(200);
+ QTest::keyClick(list, Qt::Key_Return);
+ QTest::qWait(1000);
+ QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
+ QPushButton *button = buttonBox->button(QDialogButtonBox::Cancel);
+ QTest::keyClick(button, Qt::Key_Return);
+ QTest::qWait(500);
+ QString result = fd.selectedFiles().first();
+ QVERIFY(result.at(result.count() - 1) != '/');
+ QVERIFY(!result.contains('\\'));
+ current.rmdir("aaaaaaaaaaaaaaaaaa");
+}
+
+void tst_QFiledialog::task228844_ensurePreviousSorting()
+{
+ QDir current = QDir::currentPath();
+ current.mkdir("aaaaaaaaaaaaaaaaaa");
+ current.cd("aaaaaaaaaaaaaaaaaa");
+ current.mkdir("a");
+ current.mkdir("b");
+ current.mkdir("c");
+ current.mkdir("d");
+ current.mkdir("e");
+ current.mkdir("f");
+ current.mkdir("g");
+ QTemporaryFile *tempFile = new QTemporaryFile(current.absolutePath() + "/rXXXXXX");
+ tempFile->open();
+ current.cdUp();
+
+ QNonNativeFileDialog fd;
+ fd.setDirectory(current.absolutePath());
+ fd.setViewMode(QFileDialog::Detail);
+ fd.show();
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QTreeView *tree = qFindChild<QTreeView*>(&fd, "treeView");
+ tree->header()->setSortIndicator(3,Qt::DescendingOrder);
+ QTest::qWait(200);
+ QDialogButtonBox *buttonBox = qFindChild<QDialogButtonBox*>(&fd, "buttonBox");
+ QPushButton *button = buttonBox->button(QDialogButtonBox::Open);
+ QTest::mouseClick(button, Qt::LeftButton);
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QNonNativeFileDialog fd2;
+ fd2.setFileMode(QFileDialog::Directory);
+ fd2.restoreState(fd.saveState());
+ current.cd("aaaaaaaaaaaaaaaaaa");
+ fd2.setDirectory(current.absolutePath());
+ fd2.show();
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QTreeView *tree2 = qFindChild<QTreeView*>(&fd2, "treeView");
+ tree2->setFocus();
+
+ QCOMPARE(tree2->rootIndex().data(QFileSystemModel::FilePathRole).toString(),current.absolutePath());
+
+ QDialogButtonBox *buttonBox2 = qFindChild<QDialogButtonBox*>(&fd2, "buttonBox");
+ QPushButton *button2 = buttonBox2->button(QDialogButtonBox::Open);
+ fd2.selectFile("g");
+ QTest::mouseClick(button2, Qt::LeftButton);
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QChar('/') + QLatin1String("g"));
+
+ QNonNativeFileDialog fd3(0, "This is a third file dialog", tempFile->fileName());
+ fd3.restoreState(fd.saveState());
+ fd3.setFileMode(QFileDialog::Directory);
+ fd3.show();
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QTreeView *tree3 = qFindChild<QTreeView*>(&fd3, "treeView");
+ tree3->setFocus();
+
+ QCOMPARE(tree3->rootIndex().data(QFileSystemModel::FilePathRole).toString(), current.absolutePath());
+
+ QDialogButtonBox *buttonBox3 = qFindChild<QDialogButtonBox*>(&fd3, "buttonBox");
+ QPushButton *button3 = buttonBox3->button(QDialogButtonBox::Open);
+ QTest::mouseClick(button3, Qt::LeftButton);
+#if defined(Q_OS_WINCE)
+ QTest::qWait(1500);
+#else
+ QTest::qWait(500);
+#endif
+ QCOMPARE(fd3.selectedFiles().first(), tempFile->fileName());
+
+ current.cd("aaaaaaaaaaaaaaaaaa");
+ current.rmdir("a");
+ current.rmdir("b");
+ current.rmdir("c");
+ current.rmdir("d");
+ current.rmdir("e");
+ current.rmdir("f");
+ current.rmdir("g");
+ tempFile->close();
+ delete tempFile;
+ current.cdUp();
+ current.rmdir("aaaaaaaaaaaaaaaaaa");
+}
+
+
+void tst_QFiledialog::task239706_editableFilterCombo()
+{
+ QNonNativeFileDialog d;
+ d.setNameFilter("*.cpp *.h");
+
+ d.show();
+ QTest::qWait(500);
+
+ QList<QComboBox *> comboList = d.findChildren<QComboBox *>();
+ QComboBox *filterCombo = 0;
+ foreach (QComboBox *combo, comboList) {
+ if (combo->objectName() == QString("fileTypeCombo")) {
+ filterCombo = combo;
+ break;
+ }
+ }
+ Q_ASSERT(filterCombo);
+ filterCombo->setEditable(true);
+ QTest::mouseClick(filterCombo, Qt::LeftButton);
+ QTest::keyPress(filterCombo, Qt::Key_X);
+ QTest::keyPress(filterCombo, Qt::Key_Enter); // should not trigger assertion failure
+}
+
+void tst_QFiledialog::task218353_relativePaths()
+{
+ QDir appDir = QDir::current();
+ QVERIFY(appDir.cdUp() != false);
+ QNonNativeFileDialog d(0, "TestDialog", "..");
+ QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
+
+ d.setDirectory(appDir.absolutePath() + QLatin1String("/non-existing-directory/../another-non-existing-dir/../"));
+ QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
+
+ QDir::current().mkdir("test");
+ appDir = QDir::current();
+ d.setDirectory(appDir.absolutePath() + QLatin1String("/test/../test/../"));
+ QCOMPARE(d.directory().absolutePath(), appDir.absolutePath());
+ appDir.rmdir("test");
+}
+
+void tst_QFiledialog::task251321_sideBarHiddenEntries()
+{
+#if defined QT_BUILD_INTERNAL
+ QNonNativeFileDialog fd;
+
+ QDir current = QDir::currentPath();
+ current.mkdir(".hidden");
+ QDir hiddenDir = QDir(".hidden");
+ hiddenDir.mkdir("subdir");
+ QDir hiddenSubDir = QDir(".hidden/subdir");
+ hiddenSubDir.mkdir("happy");
+ hiddenSubDir.mkdir("happy2");
+
+ QList<QUrl> urls;
+ urls << QUrl::fromLocalFile(hiddenSubDir.absolutePath());
+ fd.setSidebarUrls(urls);
+ fd.show();
+ QTest::qWait(250);
+
+ QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
+ sidebar->setFocus();
+ sidebar->selectUrl(QUrl::fromLocalFile(hiddenSubDir.absolutePath()));
+ QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(0, 0)).center());
+ // give the background processes more time on windows mobile
+#ifdef Q_OS_WINCE
+ QTest::qWait(1000);
+#else
+ QTest::qWait(250);
+#endif
+
+ QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
+ QCOMPARE(model->rowCount(model->index(hiddenSubDir.absolutePath())), 2);
+
+ hiddenSubDir.rmdir("happy2");
+ hiddenSubDir.rmdir("happy");
+ hiddenDir.rmdir("subdir");
+ current.rmdir(".hidden");
+#endif
+}
+
+#if defined QT_BUILD_INTERNAL
+class MyQSideBar : public QSidebar
+{
+public :
+ MyQSideBar(QWidget *parent = 0) : QSidebar(parent)
+ {}
+
+ void removeSelection() {
+ QList<QModelIndex> idxs = selectionModel()->selectedIndexes();
+ QList<QPersistentModelIndex> indexes;
+ for (int i = 0; i < idxs.count(); i++)
+ indexes.append(idxs.at(i));
+
+ for (int i = 0; i < indexes.count(); ++i)
+ if (!indexes.at(i).data(Qt::UserRole + 1).toUrl().path().isEmpty())
+ model()->removeRow(indexes.at(i).row());
+ }
+};
+#endif
+
+void tst_QFiledialog::task251341_sideBarRemoveEntries()
+{
+#if defined QT_BUILD_INTERNAL
+ QNonNativeFileDialog fd;
+
+ QDir current = QDir::currentPath();
+ current.mkdir("testDir");
+ QDir testSubDir = QDir("testDir");
+
+ QList<QUrl> urls;
+ urls << QUrl::fromLocalFile(testSubDir.absolutePath());
+ urls << QUrl::fromLocalFile("NotFound");
+ fd.setSidebarUrls(urls);
+ fd.show();
+ QTest::qWait(250);
+
+ QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
+ sidebar->setFocus();
+ //We enter in the first bookmark
+ sidebar->selectUrl(QUrl::fromLocalFile(testSubDir.absolutePath()));
+ QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(0, 0)).center());
+ QTest::qWait(250);
+
+ QFileSystemModel *model = qFindChild<QFileSystemModel*>(&fd, "qt_filesystem_model");
+ //There is no file
+ QCOMPARE(model->rowCount(model->index(testSubDir.absolutePath())), 0);
+ //Icon is not enabled QUrlModel::EnabledRole
+ QVariant value = sidebar->model()->index(0, 0).data(Qt::UserRole + 2);
+ QCOMPARE(qvariant_cast<bool>(value), true);
+
+ sidebar->setFocus();
+ //We enter in the second bookmark which is invalid
+ sidebar->selectUrl(QUrl::fromLocalFile("NotFound"));
+ QTest::mouseClick(sidebar->viewport(), Qt::LeftButton, 0, sidebar->visualRect(sidebar->model()->index(1, 0)).center());
+ QTest::qWait(250);
+
+ //We fallback to root because the entry in the bookmark is invalid
+ QCOMPARE(model->rowCount(model->index("NotFound")), model->rowCount(model->index(model->rootPath())));
+ //Icon is not enabled QUrlModel::EnabledRole
+ value = sidebar->model()->index(1, 0).data(Qt::UserRole + 2);
+ QCOMPARE(qvariant_cast<bool>(value), false);
+
+ MyQSideBar mySideBar;
+ mySideBar.init(model, urls);
+ mySideBar.show();
+ mySideBar.selectUrl(QUrl::fromLocalFile(testSubDir.absolutePath()));
+ QTest::qWait(1000);
+ mySideBar.removeSelection();
+
+ //We remove the first entry
+ QList<QUrl> expected;
+ expected << QUrl::fromLocalFile("NotFound");
+ QCOMPARE(mySideBar.urls(), expected);
+
+ mySideBar.selectUrl(QUrl::fromLocalFile("NotFound"));
+ mySideBar.removeSelection();
+
+ //We remove the second entry
+ expected.clear();
+ QCOMPARE(mySideBar.urls(), expected);
+
+ current.rmdir("testDir");
+#endif
+}
+
+void tst_QFiledialog::task254490_selectFileMultipleTimes()
+{
+ QString tempPath = QDir::tempPath();
+ QTemporaryFile *t;
+ t = new QTemporaryFile;
+ t->open();
+ QNonNativeFileDialog fd(0, "TestFileDialog");
+
+ fd.setDirectory(tempPath);
+ fd.setViewMode(QFileDialog::List);
+ fd.setAcceptMode(QFileDialog::AcceptSave);
+ fd.setFileMode(QFileDialog::AnyFile);
+
+ //This should select the file in the QFileDialog
+ fd.selectFile(t->fileName());
+
+ //This should clear the selection and write it into the filename line edit
+ fd.selectFile("new_file.txt");
+
+ fd.show();
+ QTest::qWait(250);
+
+ QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
+ QVERIFY(lineEdit);
+ QCOMPARE(lineEdit->text(),QLatin1String("new_file.txt"));
+ QListView *list = qFindChild<QListView*>(&fd, "listView");
+ QVERIFY(list);
+ QCOMPARE(list->selectionModel()->selectedRows(0).count(), 0);
+
+ t->deleteLater();
+}
+
+void tst_QFiledialog::task257579_sideBarWithNonCleanUrls()
+{
+#if defined QT_BUILD_INTERNAL
+ QDir tempDir = QDir::temp();
+ QLatin1String dirname("autotest_task257579");
+ tempDir.rmdir(dirname); //makes sure it doesn't exist any more
+ QVERIFY(tempDir.mkdir(dirname));
+ QString url = QString::fromLatin1("%1/%2/..").arg(tempDir.absolutePath()).arg(dirname);
+ QNonNativeFileDialog fd;
+ fd.setSidebarUrls(QList<QUrl>() << QUrl::fromLocalFile(url));
+ QSidebar *sidebar = qFindChild<QSidebar*>(&fd, "sidebar");
+ QCOMPARE(sidebar->urls().count(), 1);
+ QVERIFY(sidebar->urls().first().toLocalFile() != url);
+ QCOMPARE(sidebar->urls().first().toLocalFile(), QDir::cleanPath(url));
+
+#ifdef Q_OS_WIN
+ QCOMPARE(sidebar->model()->index(0,0).data().toString().toLower(), tempDir.dirName().toLower());
+#else
+ QCOMPARE(sidebar->model()->index(0,0).data().toString(), tempDir.dirName());
+#endif
+
+ //all tests are finished, we can remove the temporary dir
+ QVERIFY(tempDir.rmdir(dirname));
+#endif
+}
+
+void tst_QFiledialog::task259105_filtersCornerCases()
+{
+ QNonNativeFileDialog fd(0, "TestFileDialog");
+ fd.setNameFilter(QLatin1String("All Files! (*);;Text Files (*.txt)"));
+ fd.setOption(QFileDialog::HideNameFilterDetails, true);
+ fd.show();
+ QTest::qWait(250);
+
+ //Extensions are hidden
+ QComboBox *filters = qFindChild<QComboBox*>(&fd, "fileTypeCombo");
+ QVERIFY(filters);
+ QCOMPARE(filters->currentText(), QLatin1String("All Files!"));
+ filters->setCurrentIndex(1);
+ QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
+
+ //We should have the full names
+ fd.setOption(QFileDialog::HideNameFilterDetails, false);
+ QTest::qWait(250);
+ filters->setCurrentIndex(0);
+ QCOMPARE(filters->currentText(), QLatin1String("All Files! (*)"));
+ filters->setCurrentIndex(1);
+ QCOMPARE(filters->currentText(), QLatin1String("Text Files (*.txt)"));
+
+ //Corner case undocumented of the task
+ fd.setNameFilter(QLatin1String("\352 (I like cheese) All Files! (*);;Text Files (*.txt)"));
+ QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files! (*)"));
+ filters->setCurrentIndex(1);
+ QCOMPARE(filters->currentText(), QLatin1String("Text Files (*.txt)"));
+
+ fd.setOption(QFileDialog::HideNameFilterDetails, true);
+ filters->setCurrentIndex(0);
+ QTest::qWait(500);
+ QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files!"));
+ filters->setCurrentIndex(1);
+ QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
+
+ fd.setOption(QFileDialog::HideNameFilterDetails, true);
+ filters->setCurrentIndex(0);
+ QTest::qWait(500);
+ QCOMPARE(filters->currentText(), QLatin1String("\352 (I like cheese) All Files!"));
+ filters->setCurrentIndex(1);
+ QCOMPARE(filters->currentText(), QLatin1String("Text Files"));
+}
+
+void tst_QFiledialog::QTBUG4419_lineEditSelectAll()
+{
+ QString tempPath = QDir::tempPath();
+ QTemporaryFile *t;
+ t = new QTemporaryFile;
+ t->open();
+ QNonNativeFileDialog fd(0, "TestFileDialog", t->fileName());
+
+ fd.setDirectory(tempPath);
+ fd.setViewMode(QFileDialog::List);
+ fd.setAcceptMode(QFileDialog::AcceptSave);
+ fd.setFileMode(QFileDialog::AnyFile);
+
+ fd.show();
+ QApplication::setActiveWindow(&fd);
+ QTest::qWaitForWindowShown(&fd);
+ QTRY_COMPARE(fd.isVisible(), true);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget*>(&fd));
+
+ QTest::qWait(250);
+ QLineEdit *lineEdit = qFindChild<QLineEdit*>(&fd, "fileNameEdit");
+
+ QCOMPARE(tempPath + QChar('/') + lineEdit->text(), t->fileName());
+ QCOMPARE(tempPath + QChar('/') + lineEdit->selectedText(), t->fileName());
+}
+
+QTEST_MAIN(tst_QFiledialog)
+#include "tst_qfiledialog2.moc"
diff --git a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
index 29e4fe6..f2d9017 100644
--- a/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -806,21 +806,13 @@ void tst_QFileSystemModel::sort()
myModel->d_func()->disableRecursiveSort = true;
QDir dir(QDir::tempPath());
- dir.mkdir("sortTemp");
- dir.cd("sortTemp");
+ //initialize the randomness
+ qsrand(QDateTime::currentDateTime().toTime_t());
+ QString tempName = QLatin1String("sortTemp.") + QString::number(qrand());
+ dir.mkdir(tempName);
+ dir.cd(tempName);
QTRY_VERIFY(dir.exists());
- //To be sure we clean the dir if it was there before
- QDirIterator it(dir.absolutePath(), QDir::NoDotAndDotDot);
- while(it.hasNext())
- {
- it.next();
- QFileInfo info = it.fileInfo();
- if (info.isDir())
- dir.rmdir(info.fileName());
- else
- QFile::remove(info.absoluteFilePath());
- }
const QString dirPath = dir.absolutePath();
QVERIFY(dir.exists());
@@ -874,7 +866,7 @@ void tst_QFileSystemModel::sort()
} else {
for(int i = 0; i < myModel->rowCount(parent); ++i)
{
- QVERIFY(dirPath + QChar('/') + myModel->index(i, 1, parent).data(QFileSystemModel::FileNameRole).toString() == expectedOrder.at(i));
+ QTRY_COMPARE(dirPath + QChar('/') + myModel->index(i, 1, parent).data(QFileSystemModel::FileNameRole).toString(), expectedOrder.at(i));
}
}
@@ -882,11 +874,11 @@ void tst_QFileSystemModel::sort()
delete myModel;
dir.setPath(QDir::tempPath());
- dir.cd("sortTemp");
+ dir.cd(tempName);
tempFile.remove();
tempFile2.remove();
dir.cdUp();
- dir.rmdir("sortTemp");
+ dir.rmdir(tempName);
}
diff --git a/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp b/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
index 286ea2d..7b87969 100644
--- a/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
+++ b/tests/auto/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
@@ -49,6 +49,14 @@
class tst_QGraphicsAnchorLayout : public QObject {
Q_OBJECT;
+public:
+ tst_QGraphicsAnchorLayout() : QObject() {
+ hasSimplification = qgetenv("QT_ANCHORLAYOUT_NO_SIMPLIFICATION").isEmpty();
+ }
+
+private:
+ bool hasSimplification;
+
private slots:
void simple();
void simple_center();
@@ -73,6 +81,7 @@ private slots:
void expandingSequenceFairDistribution();
void expandingParallel();
void floatConflict();
+ void infiniteMaxSizes();
};
class RectWidget : public QGraphicsWidget
@@ -152,6 +161,15 @@ static bool layoutHasConflict(QGraphicsAnchorLayout *l)
return QGraphicsAnchorLayoutPrivate::get(l)->hasConflicts();
}
+static bool usedSimplex(QGraphicsAnchorLayout *l, Qt::Orientation o)
+{
+ QGraphicsAnchorLayoutPrivate::Orientation oo = (o == Qt::Horizontal) ?
+ QGraphicsAnchorLayoutPrivate::Horizontal :
+ QGraphicsAnchorLayoutPrivate::Vertical;
+
+ return QGraphicsAnchorLayoutPrivate::get(l)->lastCalculationUsedSimplex[oo];
+}
+
void tst_QGraphicsAnchorLayout::simple()
{
QGraphicsWidget *w1 = createItem();
@@ -169,10 +187,16 @@ void tst_QGraphicsAnchorLayout::simple()
l->addAnchors(l, w1, Qt::Vertical);
l->addAnchors(l, w2, Qt::Vertical);
+ QCOMPARE(l->count(), 2);
+
QGraphicsWidget p;
p.setLayout(l);
+ p.adjustSize();
- QCOMPARE(l->count(), 2);
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::simple_center()
@@ -212,6 +236,11 @@ void tst_QGraphicsAnchorLayout::simple_center()
QSizeF layoutMaximumSize = l->effectiveSizeHint(Qt::MaximumSize);
QCOMPARE(layoutMaximumSize, QSizeF(200, 20));
+ if (hasSimplification) {
+ QVERIFY(usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
+
delete p;
}
@@ -309,6 +338,9 @@ void tst_QGraphicsAnchorLayout::layoutDirection()
QCOMPARE(checkReverseDirection(p), true);
+ QVERIFY(usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+
delete p;
delete view;
}
@@ -397,6 +429,11 @@ void tst_QGraphicsAnchorLayout::diagonal()
QCOMPARE(e->geometry(), QRectF(100.0, 200.0, 75.0, 100.0));
QCOMPARE(p.size(), testA);
+ if (hasSimplification) {
+ QVERIFY(usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
+
QCOMPARE(checkReverseDirection(&p), true);
c->setMinimumWidth(300);
@@ -473,6 +510,9 @@ void tst_QGraphicsAnchorLayout::parallel()
QCOMPARE(f->geometry(), QRectF(350, 500, 100, 100));
QCOMPARE(p.size(), layoutMinimumSize);
+ if (!hasSimplification)
+ return;
+
p.resize(layoutPreferredSize);
QCOMPARE(a->geometry(), QRectF(0, 0, 150, 100));
QCOMPARE(b->geometry(), QRectF(150, 100, 150, 100));
@@ -493,6 +533,9 @@ void tst_QGraphicsAnchorLayout::parallel()
QCOMPARE(e->geometry(), QRectF(375, 400, 175, 100));
QCOMPARE(f->geometry(), QRectF(550, 500, 200, 100));
QCOMPARE(p.size(), layoutMaximumSize);
+
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
}
void tst_QGraphicsAnchorLayout::parallel2()
@@ -538,6 +581,11 @@ void tst_QGraphicsAnchorLayout::parallel2()
p.resize(layoutMaximumSize);
QCOMPARE(p.size(), layoutMaximumSize);
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::snake()
@@ -729,6 +777,8 @@ void tst_QGraphicsAnchorLayout::fairDistribution()
QCOMPARE(layoutMaximumSize, QSizeF(300.0, 400.0));
p.resize(layoutMinimumSize);
+ if (!hasSimplification)
+ QEXPECT_FAIL("", "Without simplification there is no fair distribution.", Abort);
QCOMPARE(a->geometry(), QRectF(0.0, 0.0, 20.0, 100.0));
QCOMPARE(b->geometry(), QRectF(20.0, 100.0, 20.0, 100.0));
QCOMPARE(c->geometry(), QRectF(40.0, 200.0, 20.0, 100.0));
@@ -748,6 +798,11 @@ void tst_QGraphicsAnchorLayout::fairDistribution()
QCOMPARE(c->geometry(), QRectF(200.0, 200.0, 100.0, 100.0));
QCOMPARE(d->geometry(), QRectF(0.0, 300.0, 300.0, 100.0));
QCOMPARE(p.size(), layoutMaximumSize);
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::fairDistributionOppositeDirections()
@@ -804,6 +859,9 @@ void tst_QGraphicsAnchorLayout::fairDistributionOppositeDirections()
QCOMPARE(layoutPreferredSize, QSizeF(220.0, 500.0));
QCOMPARE(layoutMaximumSize, QSizeF(400.0, 500.0));
+ if (!hasSimplification)
+ return;
+
p.resize(layoutMinimumSize);
QCOMPARE(a->size(), b->size());
QCOMPARE(a->size(), c->size());
@@ -824,6 +882,9 @@ void tst_QGraphicsAnchorLayout::fairDistributionOppositeDirections()
QCOMPARE(a->size(), d->size());
QCOMPARE(e->size().width(), 4 * a->size().width());
QCOMPARE(p.size(), layoutMaximumSize);
+
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
}
void tst_QGraphicsAnchorLayout::proportionalPreferred()
@@ -886,6 +947,11 @@ void tst_QGraphicsAnchorLayout::proportionalPreferred()
QCOMPARE(a->size().width(), 10 * factor);
QCOMPARE(c->size().width(), 14 * factor);
QCOMPARE(p.size(), QSizeF(12, 400));
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::example()
@@ -969,6 +1035,11 @@ void tst_QGraphicsAnchorLayout::example()
QCOMPARE(a->size(), e->size());
QCOMPARE(b->size(), d->size());
QCOMPARE(f->size(), g->size());
+
+ if (hasSimplification) {
+ QVERIFY(usedSimplex(l, Qt::Horizontal));
+ QVERIFY(usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::setSpacing()
@@ -1225,19 +1296,8 @@ void tst_QGraphicsAnchorLayout::sizePolicy()
l->setSpacing(0);
l->setContentsMargins(0, 0, 0, 0);
- // horizontal
- QGraphicsAnchor *anchor = l->addAnchor(l, Qt::AnchorLeft, w1, Qt::AnchorLeft);
- anchor->setSpacing(0);
-
- anchor = l->addAnchor(w1, Qt::AnchorRight, l, Qt::AnchorRight);
- anchor->setSpacing(0);
-
- // vertical
- anchor = l->addAnchor(l, Qt::AnchorTop, w1, Qt::AnchorTop);
- anchor->setSpacing(0);
-
- anchor = l->addAnchor(w1, Qt::AnchorBottom, l, Qt::AnchorBottom);
- anchor->setSpacing(0);
+ // horizontal and vertical
+ l->addAnchors(l, w1);
QGraphicsWidget *p = new QGraphicsWidget;
p->setLayout(l);
@@ -1287,9 +1347,53 @@ void tst_QGraphicsAnchorLayout::sizePolicy()
w1->adjustSize();
QCOMPARE(l->effectiveSizeHint(Qt::MinimumSize), QSizeF(0, 0));
- QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(100, 100));
+ QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(0, 0));
QCOMPARE(l->effectiveSizeHint(Qt::MaximumSize), QSizeF(100, 100));
+ // Anchor size policies
+ w1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ QGraphicsAnchor *anchor = l->anchor(l, Qt::AnchorLeft, w1, Qt::AnchorLeft);
+ anchor->setSpacing(10);
+
+ // QSizePolicy::Minimum
+ anchor->setSizePolicy(QSizePolicy::Minimum);
+ QApplication::processEvents();
+
+ QCOMPARE(l->effectiveSizeHint(Qt::MinimumSize), QSizeF(60, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 50));
+ // The layout has a maximum size of QWIDGETSIZE_MAX, so the result won't exceed that value.
+ QCOMPARE(l->effectiveSizeHint(Qt::MaximumSize), QSizeF(QWIDGETSIZE_MAX, 50));
+
+ // QSizePolicy::Preferred
+ anchor->setSizePolicy(QSizePolicy::Preferred);
+ QApplication::processEvents();
+
+ QCOMPARE(l->effectiveSizeHint(Qt::MinimumSize), QSizeF(50, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 50));
+ // The layout has a maximum size of QWIDGETSIZE_MAX, so the result won't exceed that value.
+ QCOMPARE(l->effectiveSizeHint(Qt::MaximumSize), QSizeF(QWIDGETSIZE_MAX, 50));
+
+ // QSizePolicy::Maximum
+ anchor->setSizePolicy(QSizePolicy::Maximum);
+ QApplication::processEvents();
+
+ QCOMPARE(l->effectiveSizeHint(Qt::MinimumSize), QSizeF(50, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::MaximumSize), QSizeF(60, 50));
+
+ // QSizePolicy::Ignored
+ anchor->setSizePolicy(QSizePolicy::Ignored);
+ QApplication::processEvents();
+
+ QCOMPARE(l->effectiveSizeHint(Qt::MinimumSize), QSizeF(50, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::PreferredSize), QSizeF(50, 50));
+ QCOMPARE(l->effectiveSizeHint(Qt::MaximumSize), QSizeF(QWIDGETSIZE_MAX, 50));
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
+
delete p;
delete view;
}
@@ -1380,6 +1484,11 @@ void tst_QGraphicsAnchorLayout::expandingSequence()
QSizeF layoutMaximumSize = l->effectiveSizeHint(Qt::MaximumSize);
QCOMPARE(layoutMaximumSize.width(), qreal(200));
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::expandingSequenceFairDistribution()
@@ -1441,6 +1550,11 @@ void tst_QGraphicsAnchorLayout::expandingSequenceFairDistribution()
QSizeF layoutMaximumSize = l->effectiveSizeHint(Qt::MaximumSize);
QCOMPARE(layoutMaximumSize.width(), qreal(400));
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
+
// Now we change D to have more "room for growth" from its preferred size
// to its maximum size. We expect a proportional fair distribution. Note that
// this seems to not conform with what QGraphicsLinearLayout does.
@@ -1463,6 +1577,11 @@ void tst_QGraphicsAnchorLayout::expandingSequenceFairDistribution()
QCOMPARE(b->geometry().size(), pref + QSizeF(25, 0));
QCOMPARE(c->geometry().size(), pref);
QCOMPARE(d->geometry().size(), pref + QSizeF(50, 0));
+
+ if (hasSimplification) {
+ QVERIFY(!usedSimplex(l, Qt::Horizontal));
+ QVERIFY(!usedSimplex(l, Qt::Vertical));
+ }
}
void tst_QGraphicsAnchorLayout::expandingParallel()
@@ -1585,5 +1704,56 @@ void tst_QGraphicsAnchorLayout::floatConflict()
delete p;
}
+void tst_QGraphicsAnchorLayout::infiniteMaxSizes()
+{
+ QGraphicsAnchorLayout *l = new QGraphicsAnchorLayout;
+ l->setContentsMargins(0, 0, 0, 0);
+ l->setSpacing(0);
+
+ QSizeF min(10, 10);
+ QSizeF pref(50, 10);
+ QSizeF max(QWIDGETSIZE_MAX, 10);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+
+ //<!-- Trunk -->
+ setAnchor(l, l, Qt::AnchorLeft, a, Qt::AnchorLeft, 0);
+ setAnchor(l, a, Qt::AnchorRight, b, Qt::AnchorLeft, 0);
+ setAnchor(l, b, Qt::AnchorRight, c, Qt::AnchorLeft, 0);
+ setAnchor(l, c, Qt::AnchorRight, d, Qt::AnchorLeft, 0);
+ setAnchor(l, d, Qt::AnchorRight, l, Qt::AnchorRight, 0);
+
+ a->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ c->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+ QGraphicsWidget p;
+ p.setLayout(l);
+
+ p.resize(200, 10);
+ QCOMPARE(a->geometry(), QRectF(0, 0, 50, 10));
+ QCOMPARE(b->geometry(), QRectF(50, 0, 50, 10));
+ QCOMPARE(c->geometry(), QRectF(100, 0, 50, 10));
+ QCOMPARE(d->geometry(), QRectF(150, 0, 50, 10));
+
+ if (!hasSimplification)
+ QEXPECT_FAIL("", "Without simplification there is no fair distribution.", Abort);
+
+ p.resize(1000, 10);
+ QCOMPARE(a->geometry(), QRectF(0, 0, 450, 10));
+ QCOMPARE(b->geometry(), QRectF(450, 0, 50, 10));
+ QCOMPARE(c->geometry(), QRectF(500, 0, 450, 10));
+ QCOMPARE(d->geometry(), QRectF(950, 0, 50, 10));
+
+ qreal expMaxSize = (QWIDGETSIZE_MAX - 100.0) / 2;
+ p.resize(QWIDGETSIZE_MAX, 10);
+ QCOMPARE(a->geometry(), QRectF(0, 0, expMaxSize, 10));
+ QCOMPARE(b->geometry(), QRectF(expMaxSize, 0, 50, 10));
+ QCOMPARE(c->geometry(), QRectF(expMaxSize + 50, 0, expMaxSize, 10));
+ QCOMPARE(d->geometry(), QRectF(QWIDGETSIZE_MAX - 50, 0, 50, 10));
+}
+
QTEST_MAIN(tst_QGraphicsAnchorLayout)
#include "tst_qgraphicsanchorlayout.moc"
diff --git a/tests/auto/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp b/tests/auto/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
index 148b2c8..1c7a159 100644
--- a/tests/auto/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
+++ b/tests/auto/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
@@ -435,7 +435,7 @@ void tst_QGraphicsAnchorLayout1::testAddAndRemoveAnchor()
layout->removeAnchor(layout, Qt::AnchorLeft, widget1, Qt::AnchorLeft);
QCOMPARE( layout->count(), 4 );
- QCOMPARE( (int)widget1->parentLayoutItem(), 0 );
+ QVERIFY( !widget1->parentLayoutItem() );
// test that item is not removed from layout if other anchors remain set
layout->setAnchor(widget2, Qt::AnchorLeft, widget3, Qt::AnchorRight, 10);
@@ -1711,8 +1711,6 @@ void tst_QGraphicsAnchorLayout1::testBasicLayout()
// Validate
for (int i = 0; i < result.count(); ++i) {
- if (i == 1)
- QEXPECT_FAIL("Two, mixed", "Works with simplification disabled.", Continue);
const BasicLayoutTestResult item = result[i];
QCOMPARE(widgets[item.index]->geometry(), item.rect);
}
diff --git a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 554292f..e33c7b6 100644
--- a/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -104,6 +104,7 @@ private slots:
void defaultStretchFactors();
void geometries_data();
void geometries();
+ void avoidRecursionInInsertItem();
void task236367_maxSizeHint();
};
@@ -2081,6 +2082,16 @@ void tst_QGraphicsGridLayout::geometries()
delete widget;
}
+void tst_QGraphicsGridLayout::avoidRecursionInInsertItem()
+{
+ QGraphicsWidget window(0, Qt::Window);
+ QGraphicsGridLayout *layout = new QGraphicsGridLayout(&window);
+ QCOMPARE(layout->count(), 0);
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsGridLayout::addItem: cannot insert itself");
+ layout->addItem(layout, 0, 0);
+ QCOMPARE(layout->count(), 0);
+}
+
void tst_QGraphicsGridLayout::task236367_maxSizeHint()
{
QGraphicsWidget *widget = new QGraphicsWidget;
diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
index e4eaf4e..dcad8e1 100644
--- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -82,6 +82,14 @@ Q_DECLARE_METATYPE(QRectF)
#define Q_CHECK_PAINTEVENTS
#endif
+#if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
+// On mac (cocoa) we always get full update.
+// So check that the expected region is contained inside the actual
+#define COMPARE_REGIONS(ACTUAL, EXPECTED) QVERIFY((EXPECTED).subtracted(ACTUAL).isEmpty())
+#else
+#define COMPARE_REGIONS QTRY_COMPARE
+#endif
+
static void sendMousePress(QGraphicsScene *scene, const QPointF &point, Qt::MouseButton button = Qt::LeftButton)
{
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
@@ -390,6 +398,7 @@ private slots:
void modality_mouseGrabber();
void modality_clickFocus();
void modality_keyEvents();
+ void itemIsInFront();
// task specific tests below me
void task141694_textItemEnsureVisible();
@@ -6183,7 +6192,7 @@ void tst_QGraphicsItem::opacity2()
MyGraphicsView view(&scene);
view.show();
QTest::qWaitForWindowShown(&view);
- QTRY_COMPARE(view.repaints, 1);
+ QTRY_VERIFY(view.repaints >= 1);
#define RESET_REPAINT_COUNTERS \
parent->repaints = 0; \
@@ -6290,7 +6299,7 @@ void tst_QGraphicsItem::opacityZeroUpdates()
QRegion expectedRegion = parentDeviceBoundingRect.adjusted(-2, -2, 2, 2);
expectedRegion += childDeviceBoundingRect.adjusted(-2, -2, 2, 2);
- QTRY_COMPARE(view.paintedRegion, expectedRegion);
+ COMPARE_REGIONS(view.paintedRegion, expectedRegion);
}
class StacksBehindParentHelper : public QGraphicsRectItem
@@ -7117,7 +7126,7 @@ void tst_QGraphicsItem::update()
qApp->processEvents();
QCOMPARE(item->repaints, 1);
QCOMPARE(view.repaints, 1);
- QCOMPARE(view.paintedRegion, expectedRegion + expectedRegion.translated(50, 50));
+ COMPARE_REGIONS(view.paintedRegion, expectedRegion + expectedRegion.translated(50, 50));
// Make sure moving a parent item triggers an update on the children
// (even though the parent itself is outside the viewport).
@@ -7392,7 +7401,7 @@ void tst_QGraphicsItem::moveItem()
QRegion expectedParentRegion = parentDeviceBoundingRect; // old position
parentDeviceBoundingRect.translate(20, 20);
expectedParentRegion += parentDeviceBoundingRect; // new position
- QCOMPARE(view.paintedRegion, expectedParentRegion);
+ COMPARE_REGIONS(view.paintedRegion, expectedParentRegion);
RESET_COUNTERS
@@ -7402,7 +7411,7 @@ void tst_QGraphicsItem::moveItem()
QCOMPARE(child->repaints, 1);
QCOMPARE(view.repaints, 1);
const QRegion expectedChildRegion = expectedParentRegion.translated(20, 20);
- QCOMPARE(view.paintedRegion, expectedChildRegion);
+ COMPARE_REGIONS(view.paintedRegion, expectedChildRegion);
RESET_COUNTERS
@@ -7413,7 +7422,7 @@ void tst_QGraphicsItem::moveItem()
QCOMPARE(grandChild->repaints, 1);
QCOMPARE(view.repaints, 1);
const QRegion expectedGrandChildRegion = expectedParentRegion.translated(40, 40);
- QCOMPARE(view.paintedRegion, expectedGrandChildRegion);
+ COMPARE_REGIONS(view.paintedRegion, expectedGrandChildRegion);
RESET_COUNTERS
@@ -7426,7 +7435,7 @@ void tst_QGraphicsItem::moveItem()
expectedParentRegion.translate(20, 20);
expectedParentRegion += expectedChildRegion.translated(20, 20);
expectedParentRegion += expectedGrandChildRegion.translated(20, 20);
- QCOMPARE(view.paintedRegion, expectedParentRegion);
+ COMPARE_REGIONS(view.paintedRegion, expectedParentRegion);
}
void tst_QGraphicsItem::sorting_data()
@@ -9533,5 +9542,47 @@ void tst_QGraphicsItem::modality_keyEvents()
QCOMPARE(rect1Spy.counts[QEvent::KeyRelease], 0);
}
+void tst_QGraphicsItem::itemIsInFront()
+{
+ QGraphicsScene scene;
+ QGraphicsRectItem *rect1 = new QGraphicsRectItem;
+ rect1->setData(0, "rect1");
+ scene.addItem(rect1);
+
+ QGraphicsRectItem *rect1child1 = new QGraphicsRectItem(rect1);
+ rect1child1->setZValue(1);
+ rect1child1->setData(0, "rect1child1");
+
+ QGraphicsRectItem *rect1child2 = new QGraphicsRectItem(rect1);
+ rect1child2->setParentItem(rect1);
+ rect1child2->setData(0, "rect1child2");
+
+ QGraphicsRectItem *rect1child1_1 = new QGraphicsRectItem(rect1child1);
+ rect1child1_1->setData(0, "rect1child1_1");
+
+ QGraphicsRectItem *rect1child1_2 = new QGraphicsRectItem(rect1child1);
+ rect1child1_2->setFlag(QGraphicsItem::ItemStacksBehindParent);
+ rect1child1_2->setData(0, "rect1child1_2");
+
+ QGraphicsRectItem *rect2 = new QGraphicsRectItem;
+ rect2->setData(0, "rect2");
+ scene.addItem(rect2);
+
+ QGraphicsRectItem *rect2child1 = new QGraphicsRectItem(rect2);
+ rect2child1->setData(0, "rect2child1");
+
+ QCOMPARE(qt_closestItemFirst(rect1, rect1), false);
+ QCOMPARE(qt_closestItemFirst(rect1, rect2), false);
+ QCOMPARE(qt_closestItemFirst(rect1child1, rect2child1), false);
+ QCOMPARE(qt_closestItemFirst(rect1child1, rect1child2), true);
+ QCOMPARE(qt_closestItemFirst(rect1child1_1, rect1child2), true);
+ QCOMPARE(qt_closestItemFirst(rect1child1_1, rect1child1), true);
+ QCOMPARE(qt_closestItemFirst(rect1child1_2, rect1child2), true);
+ QCOMPARE(qt_closestItemFirst(rect1child1_2, rect1child1), false);
+ QCOMPARE(qt_closestItemFirst(rect1child1_2, rect1), true);
+ QCOMPARE(qt_closestItemFirst(rect1child1_2, rect2), false);
+ QCOMPARE(qt_closestItemFirst(rect1child1_2, rect2child1), false);
+}
+
QTEST_MAIN(tst_QGraphicsItem)
#include "tst_qgraphicsitem.moc"
diff --git a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 4f28df4..546f92d 100644
--- a/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -101,6 +101,7 @@ private slots:
void updateGeometry();
void layoutDirection();
void removeLayout();
+ void avoidRecursionInInsertItem();
// Task specific tests
void task218400_insertStretchCrash();
@@ -146,7 +147,7 @@ void tst_QGraphicsLinearLayout::initTestCase()
// since the style will influence the results, we have to ensure
// that the tests are run using the same style on all platforms
#ifdef Q_WS_S60
- QApplication::setStyle(new QWindowsStyle);
+ QApplication::setStyle(new QWindowsStyle);
#else
QApplication::setStyle(new QPlastiqueStyle);
#endif
@@ -332,6 +333,7 @@ void tst_QGraphicsLinearLayout::alignment()
widget->resize(newSize);
view.show();
widget->show();
+ QTest::qWaitForWindowShown(&view);
QApplication::processEvents();
int x = 0;
@@ -1431,6 +1433,16 @@ void tst_QGraphicsLinearLayout::removeLayout()
QCOMPARE(pushButton->geometry(), r2);
}
+void tst_QGraphicsLinearLayout::avoidRecursionInInsertItem()
+{
+ QGraphicsWidget window(0, Qt::Window);
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(&window);
+ QCOMPARE(layout->count(), 0);
+ QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::insertItem: cannot insert itself");
+ layout->insertItem(0, layout);
+ QCOMPARE(layout->count(), 0);
+}
+
void tst_QGraphicsLinearLayout::task218400_insertStretchCrash()
{
QGraphicsScene *scene = new QGraphicsScene;
diff --git a/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index 76e7202..9269164 100644
--- a/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -170,6 +170,7 @@ private slots:
void dontCrashWhenDie();
void createProxyForChildWidget();
void actionsContextMenu();
+ void actionsContextMenu_data();
void deleteProxyForChildWidget();
void bypassGraphicsProxyWidget_data();
void bypassGraphicsProxyWidget();
@@ -1286,6 +1287,7 @@ void tst_QGraphicsProxyWidget::paintEvent()
QGraphicsView view(&scene);
view.show();
QTest::qWaitForWindowShown(&view);
+ QTest::qWait(70);
SubQGraphicsProxyWidget proxy;
@@ -1296,14 +1298,14 @@ void tst_QGraphicsProxyWidget::paintEvent()
w->show();
QTest::qWaitForWindowShown(w);
QApplication::processEvents();
- QTest::qWait(50);
+ QTest::qWait(100);
proxy.setWidget(w);
scene.addItem(&proxy);
//make sure we flush all the paint events
QTest::qWait(70);
QTRY_VERIFY(proxy.paintCount > 1);
- QTest::qWait(70);
+ QTest::qWait(110);
proxy.paintCount = 0;
w->update();
@@ -1531,7 +1533,7 @@ void tst_QGraphicsProxyWidget::setWidget_simple()
// Properties
// QCOMPARE(proxy.focusPolicy(), lineEdit->focusPolicy());
- QCOMPARE(proxy.palette(), lineEdit->palette());
+ // QCOMPARE(proxy.palette(), lineEdit->palette());
#ifndef QT_NO_CURSOR
QCOMPARE(proxy.cursor().shape(), lineEdit->cursor().shape());
#endif
@@ -1756,6 +1758,8 @@ void tst_QGraphicsProxyWidget::tabFocus_simpleWidget()
QTRY_VERIFY(leftDial->hasFocus());
QCOMPARE(eventSpy.counts[QEvent::FocusIn], 2);
QCOMPARE(eventSpy.counts[QEvent::FocusOut], 2);
+
+ delete view;
}
void tst_QGraphicsProxyWidget::tabFocus_simpleTwoWidgets()
@@ -1878,6 +1882,8 @@ void tst_QGraphicsProxyWidget::tabFocus_simpleTwoWidgets()
QVERIFY(leftDial->hasFocus());
QCOMPARE(eventSpy.counts[QEvent::FocusIn], 2);
QCOMPARE(eventSpy.counts[QEvent::FocusOut], 2);
+
+ delete view;
}
void tst_QGraphicsProxyWidget::tabFocus_complexWidget()
@@ -1988,6 +1994,8 @@ void tst_QGraphicsProxyWidget::tabFocus_complexWidget()
QApplication::processEvents();
QVERIFY(!box->hasFocus());
leftDial->hasFocus();
+
+ delete view;
}
void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
@@ -1999,8 +2007,10 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
edit1->setText("QLineEdit 1");
QLineEdit *edit2 = new QLineEdit;
edit2->setText("QLineEdit 2");
+ QFontComboBox *fontComboBox = new QFontComboBox;
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->addWidget(edit1);
+ vlayout->addWidget(fontComboBox);
vlayout->addWidget(edit2);
QGroupBox *box = new QGroupBox("QGroupBox");
@@ -2012,8 +2022,10 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
edit1_2->setText("QLineEdit 1_2");
QLineEdit *edit2_2 = new QLineEdit;
edit2_2->setText("QLineEdit 2_2");
+ QFontComboBox *fontComboBox2 = new QFontComboBox;
vlayout = new QVBoxLayout;
vlayout->addWidget(edit1_2);
+ vlayout->addWidget(fontComboBox2);
vlayout->addWidget(edit2_2);
QGroupBox *box_2 = new QGroupBox("QGroupBox 2");
@@ -2054,8 +2066,10 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
EventSpy eventSpy(edit1);
EventSpy eventSpy2(edit2);
+ EventSpy eventSpy3(fontComboBox);
EventSpy eventSpy1_2(edit1_2);
EventSpy eventSpy2_2(edit2_2);
+ EventSpy eventSpy2_3(fontComboBox2);
EventSpy eventSpyBox(box);
// Tab into group box
@@ -2076,11 +2090,24 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
QCOMPARE(eventSpy.counts[QEvent::FocusIn], 1);
QCOMPARE(eventSpy.counts[QEvent::FocusOut], 0);
+ // Tab to the font combobox
+ QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab);
+ QApplication::processEvents();
+ fontComboBox->hasFocus();
+ QVERIFY(!edit2->hasFocus());
+ QCOMPARE(eventSpy3.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy3.counts[QEvent::FocusOut], 0);
+ QCOMPARE(eventSpy.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy.counts[QEvent::FocusOut], 1);
+
// Tab into line edit 2
QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab);
QApplication::processEvents();
edit2->hasFocus();
QVERIFY(!edit1->hasFocus());
+ QCOMPARE(eventSpy2.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy2.counts[QEvent::FocusOut], 0);
+ QCOMPARE(eventSpy3.counts[QEvent::FocusOut], 1);
QCOMPARE(eventSpy.counts[QEvent::FocusIn], 1);
QCOMPARE(eventSpy.counts[QEvent::FocusOut], 1);
@@ -2098,6 +2125,16 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
QCOMPARE(eventSpy1_2.counts[QEvent::FocusIn], 1);
QCOMPARE(eventSpy1_2.counts[QEvent::FocusOut], 0);
+ // Tab into right font combobox
+ QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab);
+ QApplication::processEvents();
+ QVERIFY(!edit1_2->hasFocus());
+ fontComboBox2->hasFocus();
+ QCOMPARE(eventSpy1_2.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy1_2.counts[QEvent::FocusOut], 1);
+ QCOMPARE(eventSpy2_3.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy2_3.counts[QEvent::FocusOut], 0);
+
// Tab into right bottom line edit
QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab);
QApplication::processEvents();
@@ -2105,6 +2142,8 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
edit2_2->hasFocus();
QCOMPARE(eventSpy1_2.counts[QEvent::FocusIn], 1);
QCOMPARE(eventSpy1_2.counts[QEvent::FocusOut], 1);
+ QCOMPARE(eventSpy2_3.counts[QEvent::FocusIn], 1);
+ QCOMPARE(eventSpy2_3.counts[QEvent::FocusOut], 1);
QCOMPARE(eventSpy2_2.counts[QEvent::FocusIn], 1);
QCOMPARE(eventSpy2_2.counts[QEvent::FocusOut], 0);
@@ -2121,6 +2160,12 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
QVERIFY(!rightDial->hasFocus());
edit2_2->hasFocus();
+ // Backtab into the right font combobox
+ QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab);
+ QApplication::processEvents();
+ QVERIFY(!edit2_2->hasFocus());
+ fontComboBox2->hasFocus();
+
// Backtab into line edit 1
QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab);
QApplication::processEvents();
@@ -2139,10 +2184,16 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
QVERIFY(!rightDial->hasFocus());
edit2->hasFocus();
- // Backtab into line edit 1
+ // Backtab into the font combobox
QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab);
QApplication::processEvents();
QVERIFY(!edit2->hasFocus());
+ fontComboBox->hasFocus();
+
+ // Backtab into line edit 1
+ QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab);
+ QApplication::processEvents();
+ QVERIFY(!fontComboBox->hasFocus());
edit1->hasFocus();
// Backtab into line box
@@ -2156,6 +2207,8 @@ void tst_QGraphicsProxyWidget::tabFocus_complexTwoWidgets()
QApplication::processEvents();
QVERIFY(!box->hasFocus());
leftDial->hasFocus();
+
+ delete view;
}
void tst_QGraphicsProxyWidget::setFocus_simpleWidget()
@@ -2222,6 +2275,8 @@ void tst_QGraphicsProxyWidget::setFocus_simpleWidget()
// Symmetry
editProxy->clearFocus();
QVERIFY(!edit->hasFocus());
+
+ delete view;
}
void tst_QGraphicsProxyWidget::setFocus_simpleTwoWidgets()
@@ -2272,6 +2327,8 @@ void tst_QGraphicsProxyWidget::setFocus_simpleTwoWidgets()
QVERIFY(!editProxy->hasFocus());
QVERIFY(edit2->hasFocus());
QVERIFY(edit2Proxy->hasFocus());
+
+ delete view;
}
void tst_QGraphicsProxyWidget::setFocus_complexTwoWidgets()
@@ -2391,6 +2448,8 @@ void tst_QGraphicsProxyWidget::setFocus_complexTwoWidgets()
QCOMPARE(eventSpyBox.counts[QEvent::FocusOut], 1);
QCOMPARE(eventSpyBox_2.counts[QEvent::FocusIn], 0);
QCOMPARE(eventSpyBox_2.counts[QEvent::FocusOut], 0);
+
+ delete view;
}
void tst_QGraphicsProxyWidget::popup_basic()
@@ -2690,7 +2749,7 @@ void tst_QGraphicsProxyWidget::windowOpacity()
view.show();
QTest::qWaitForWindowShown(&view);
QApplication::sendPostedEvents();
- QTest::qWait(50);
+ QTest::qWait(150);
qRegisterMetaType<QList<QRectF> >("QList<QRectF>");
QSignalSpy signalSpy(&scene, SIGNAL(changed(const QList<QRectF> &)));
@@ -2780,13 +2839,13 @@ void tst_QGraphicsProxyWidget::palettePropagation()
QCOMPARE(proxySpy.counts[QEvent::PaletteChange], 0);
QVERIFY(edit->testAttribute(Qt::WA_SetPalette));
QVERIFY(!proxy.testAttribute(Qt::WA_SetPalette));
- QCOMPARE(proxy.palette(), lineEditPalette);
+ QCOMPARE(proxy.palette(), QPalette());
edit->setPalette(QPalette());
QCOMPARE(editSpy.counts[QEvent::PaletteChange], 2);
QCOMPARE(proxySpy.counts[QEvent::PaletteChange], 0);
QVERIFY(!edit->testAttribute(Qt::WA_SetPalette));
QVERIFY(!proxy.testAttribute(Qt::WA_SetPalette));
- QCOMPARE(proxy.palette(), lineEditPalette);
+ QCOMPARE(proxy.palette(), QPalette());
// Proxy to widget
proxy.setPalette(palette);
@@ -2896,6 +2955,9 @@ void tst_QGraphicsProxyWidget::dontCrashWhenDie()
QTest::qWait(100);
QTest::mouseMove(w->view->viewport(), w->view->mapFromScene(w->widget->mapToScene(w->widget->boundingRect().center())));
delete w->item;
+
+ QApplication::processEvents();
+ delete w;
}
void tst_QGraphicsProxyWidget::createProxyForChildWidget()
@@ -3014,30 +3076,67 @@ private slots:
}
};
+void tst_QGraphicsProxyWidget::actionsContextMenu_data()
+{
+ QTest::addColumn<bool>("actionsContextMenu");
+ QTest::addColumn<bool>("hasFocus");
+
+ QTest::newRow("without actionsContextMenu and with focus") << false << true;
+ QTest::newRow("without actionsContextMenu and without focus") << false << false;
+ QTest::newRow("with actionsContextMenu and focus") << true << true;
+ QTest::newRow("with actionsContextMenu without focus") << true << false;
+}
+
void tst_QGraphicsProxyWidget::actionsContextMenu()
{
- ContextMenuWidget *widget = new ContextMenuWidget;
- widget->addAction(new QAction("item 1", widget));
- widget->addAction(new QAction("item 2", widget));
- widget->addAction(new QAction("item 3", widget));
- widget->setContextMenuPolicy(Qt::ActionsContextMenu);
+ QFETCH(bool, hasFocus);
+ QFETCH(bool, actionsContextMenu);
+ ContextMenuWidget *widget = new ContextMenuWidget;
+ if (actionsContextMenu) {
+ widget->addAction(new QAction("item 1", widget));
+ widget->addAction(new QAction("item 2", widget));
+ widget->addAction(new QAction("item 3", widget));
+ widget->setContextMenuPolicy(Qt::ActionsContextMenu);
+ }
QGraphicsScene scene;
- scene.addWidget(widget);
QGraphicsView view(&scene);
view.show();
-#ifdef Q_WS_X11
- qt_x11_wait_for_window_manager(&view);
-#endif
+ QApplication::setActiveWindow(&view);
+ QTest::qWaitForWindowShown(&view);
+ view.setFocus();
+ QTRY_VERIFY(view.hasFocus());
+
+ if (hasFocus)
+ scene.addWidget(widget)->setFocus();
+ else
+ scene.addWidget(widget)->clearFocus();
+
+ QApplication::processEvents();
+
QContextMenuEvent contextMenuEvent(QContextMenuEvent::Mouse,
view.viewport()->rect().center(),
view.viewport()->mapToGlobal(view.viewport()->rect().center()));
contextMenuEvent.accept();
qApp->sendEvent(view.viewport(), &contextMenuEvent);
- QVERIFY(widget->embeddedPopup);
- QVERIFY(!widget->gotContextMenuEvent);
+ if (hasFocus) {
+ if (actionsContextMenu) {
+ //actionsContextMenu embedded popup but no contextMenuEvent (widget has focus)
+ QVERIFY(widget->embeddedPopup);
+ QVERIFY(!widget->gotContextMenuEvent);
+ } else {
+ //no embedded popup but contextMenuEvent (widget has focus)
+ QVERIFY(!widget->embeddedPopup);
+ QVERIFY(widget->gotContextMenuEvent);
+ }
+ } else {
+ //qgraphicsproxywidget doesn't have the focus, the widget must not receive any contextMenuEvent and must not create any QMenu
+ QVERIFY(!widget->embeddedPopup);
+ QVERIFY(!widget->gotContextMenuEvent);
+ }
+
}
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index f5e9acb..0589994 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -266,6 +266,7 @@ private slots:
void dispatchHoverOnPress();
void initialFocus_data();
void initialFocus();
+ void polishItems();
// task specific tests below me
void task139710_bspTreeCrash();
@@ -3882,5 +3883,32 @@ void tst_QGraphicsScene::initialFocus()
QCOMPARE(rect->hasFocus(), shouldHaveFocus);
}
+class PolishItem : public QGraphicsTextItem
+{
+public:
+ PolishItem(QGraphicsItem *parent = 0) : QGraphicsTextItem(parent) { }
+
+protected:
+ QVariant itemChange(GraphicsItemChange change, const QVariant& value)
+ {
+ if (change == ItemVisibleChange) {
+ if (value.toBool())
+ qDeleteAll(childItems());
+ }
+ return QGraphicsItem::itemChange(change, value);
+ }
+};
+
+void tst_QGraphicsScene::polishItems()
+{
+ QGraphicsScene scene;
+ PolishItem *parent = new PolishItem;
+ scene.addItem(parent);
+ PolishItem *child = new PolishItem(parent);
+ Q_UNUSED(child)
+ // test that QGraphicsScenePrivate::_q_polishItems() doesn't crash
+ QMetaObject::invokeMethod(&scene,"_q_polishItems");
+}
+
QTEST_MAIN(tst_QGraphicsScene)
#include "tst_qgraphicsscene.moc"
diff --git a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
index b407fef..eb5c099 100644
--- a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
+++ b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
@@ -88,7 +88,7 @@ static QTransform transform2D(const QGraphicsTransform& t)
{
QMatrix4x4 m;
t.applyTo(&m);
- return m.toTransform();
+ return m.toTransform(0);
}
void tst_QGraphicsTransform::scale()
diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
index df3ebef..dc08d0e 100644
--- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp
@@ -84,6 +84,12 @@ Q_DECLARE_METATYPE(QPolygonF)
Q_DECLARE_METATYPE(QRectF)
Q_DECLARE_METATYPE(Qt::ScrollBarPolicy)
+#ifdef Q_WS_MAC
+//On mac we get full update. So check that the expected region is contained inside the actual
+#define COMPARE_REGIONS(ACTUAL, EXPECTED) QVERIFY((EXPECTED).subtracted(ACTUAL).isEmpty())
+#else
+#define COMPARE_REGIONS QCOMPARE
+#endif
static void sendMousePress(QWidget *widget, const QPoint &point, Qt::MouseButton button = Qt::LeftButton)
{
@@ -115,6 +121,7 @@ public:
}
int count() const { return _count; }
+ void reset() { _count = 0; }
protected:
bool eventFilter(QObject *watched, QEvent *event)
@@ -2203,9 +2210,11 @@ void tst_QGraphicsView::viewportUpdateMode()
// The view gets two updates for the update scene updates.
QTRY_VERIFY(!view.lastUpdateRegions.isEmpty());
+#ifndef QT_MAC_USE_COCOA //cocoa doesn't support drawing regions
QCOMPARE(view.lastUpdateRegions.last().rects().size(), 2);
QCOMPARE(view.lastUpdateRegions.last().rects().at(0).size(), QSize(15, 15));
QCOMPARE(view.lastUpdateRegions.last().rects().at(1).size(), QSize(15, 15));
+#endif
// Set full update mode.
view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
@@ -2938,10 +2947,11 @@ void tst_QGraphicsView::task239729_noViewUpdate()
view->show();
QTest::qWaitForWindowShown(view);
- QTRY_COMPARE(spy.count(), 1);
+ QTRY_VERIFY(spy.count() >= 1);
+ spy.reset();
scene.update();
QApplication::processEvents();
- QTRY_COMPARE(spy.count(), 2);
+ QTRY_COMPARE(spy.count(), 1);
delete view;
}
@@ -3177,7 +3187,7 @@ void tst_QGraphicsView::moveItemWhileScrolling()
int a = adjustForAntialiasing ? 2 : 1;
expectedRegion += QRect(40, 50, 10, 10).adjusted(-a, -a, a, a);
expectedRegion += QRect(40, 60, 10, 10).adjusted(-a, -a, a, a);
- QCOMPARE(view.lastPaintedRegion, expectedRegion);
+ COMPARE_REGIONS(view.lastPaintedRegion, expectedRegion);
}
void tst_QGraphicsView::centerOnDirtyItem()
@@ -3423,10 +3433,12 @@ void tst_QGraphicsView::exposeRegion()
// Make sure it triggers correct repaint on the view.
QTRY_COMPARE(view.lastUpdateRegions.size(), 1);
- QTRY_COMPARE(view.lastUpdateRegions.at(0), expectedExposeRegion);
+ COMPARE_REGIONS(view.lastUpdateRegions.at(0), expectedExposeRegion);
// Make sure the item didn't get any repaints.
+#ifndef QT_MAC_USE_COCOA
QCOMPARE(item->paints, 0);
+#endif
}
void tst_QGraphicsView::update_data()
@@ -3652,6 +3664,10 @@ void tst_QGraphicsView::task253415_reconnectUpdateSceneOnSceneChanged()
void tst_QGraphicsView::task255529_transformationAnchorMouseAndViewportMargins()
{
+#if defined(Q_OS_WINCE)
+ QSKIP("Qt/CE does not implement mouse tracking at this point", SkipAll);
+#endif
+
QGraphicsScene scene(-100, -100, 200, 200);
scene.addRect(QRectF(-50, -50, 100, 100), QPen(Qt::black), QBrush(Qt::blue));
diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview_2.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview_2.cpp
index 9567f9e..1bfaf51 100644
--- a/tests/auto/qgraphicsview/tst_qgraphicsview_2.cpp
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview_2.cpp
@@ -43,6 +43,20 @@
#include <QRectF>
#include <QTransform>
+#ifdef Q_OS_WINCE
+#include <qguifunctions_wince.h>
+
+bool qt_wince_is_high_dpi() {
+ HDC deviceContext = GetDC(0);
+ int dpi = GetDeviceCaps(deviceContext, LOGPIXELSX);
+ ReleaseDC(0, deviceContext);
+ if ((dpi < 1000) && (dpi > 0))
+ return dpi > 96;
+ else
+ return false;
+}
+#endif
+
Q_DECLARE_METATYPE(QList<int>)
Q_DECLARE_METATYPE(QList<QRectF>)
Q_DECLARE_METATYPE(QMatrix)
@@ -51,7 +65,7 @@ Q_DECLARE_METATYPE(QPointF)
Q_DECLARE_METATYPE(QRectF)
Q_DECLARE_METATYPE(Qt::ScrollBarPolicy)
-static void _scrollBarRanges_data_1()
+static void _scrollBarRanges_data_1(int offset)
{
// No motif, flat frame
QTest::newRow("1") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
@@ -59,73 +73,73 @@ static void _scrollBarRanges_data_1()
<< 0 << 0 << 0 << 0 << false << false;
QTest::newRow("2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << 16 << false << false;
+ << 0 << (50 + offset) << 0 << offset << false << false;
QTest::newRow("3") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << (100 + 16) << false << false;
+ << 0 << (50 + offset) << 0 << (100 + offset) << false << false;
QTest::newRow("4") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
<< 0 << 0 << 0 << 0 << false << false;
QTest::newRow("5") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << (-100 + 16) << false << false;
+ << -100 << (offset -50) << -100 << (-100 + offset) << false << false;
QTest::newRow("6") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << 16 << false << false;
+ << -100 << (offset -50) << -100 << offset << false << false;
QTest::newRow("7") << QSize(150, 100) << QRectF(0, 0, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << 17 << 0 << 17 << false << false;
+ << 0 << (offset + 1) << 0 << offset + 1 << false << false;
QTest::newRow("8") << QSize(150, 100) << QRectF(0, 0, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << 17 << false << false;
+ << 0 << (50 + offset + 1) << 0 << offset + 1 << false << false;
QTest::newRow("9") << QSize(150, 100) << QRectF(0, 0, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << (100 + 17) << false << false;
+ << 0 << (50 + offset + 1) << 0 << (100 + offset + 1) << false << false;
QTest::newRow("10") << QSize(150, 100) << QRectF(-101, -101, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -101 << (-100 + 16) << -101 << (-100 + 16) << false << false;
+ << -101 << (-100 + offset) << -101 << (-100 + offset) << false << false;
QTest::newRow("11") << QSize(150, 100) << QRectF(-101, -101, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << -101 << (-100 + 16) << false << false;
+ << (-101) << (offset + -50) << -101 << (-100 + offset) << false << false;
QTest::newRow("12") << QSize(150, 100) << QRectF(-101, -101, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << (-101) << 16 << false << false;
+ << (-101) << (offset -50) << (-101) << offset << false << false;
QTest::newRow("13") << QSize(150, 100) << QRectF(0, 0, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (16 + 16) << 0 << (16 + 16) << false << false;
+ << 0 << (offset + 16) << 0 << (offset + 16) << false << false;
QTest::newRow("14") << QSize(150, 100) << QRectF(0, 0, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (16 + 16) << false << false;
+ << 0 << (50 + offset + 16) << 0 << (offset + 16) << false << false;
QTest::newRow("15") << QSize(150, 100) << QRectF(0, 0, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (100 + 16 + 16) << false << false;
+ << 0 << (50 + offset + 16) << 0 << (100 + offset + 16) << false << false;
QTest::newRow("16") << QSize(150, 100) << QRectF(-116, -116, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (-100 + 16) << (-100 - 16) << (-100 + 16) << false << false;
+ << (-100 - 16) << (-100 + offset) << (-100 - 16 ) << (-100 + offset) << false << false;
QTest::newRow("17") << QSize(150, 100) << QRectF(-116, -116, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << (-100 + 16) << false << false;
+ << (-100 - 16) << (offset -50) << (-100 - 16) << (-100 + offset) << false << false;
QTest::newRow("18") << QSize(150, 100) << QRectF(-116, -116, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << 16 << false << false;
+ << (-100 - 16) << (offset -50) << (-100 - 16) << offset << false << false;
QTest::newRow("1 x2") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (150 + 16) << 0 << (100 + 16) << false << false;
+ << 0 << (150 + offset) << 0 << (100 + offset) << false << false;
QTest::newRow("2 x2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (100 + 16) << false << false;
+ << 0 << (250 + offset) << 0 << (100 + offset) << false << false;
QTest::newRow("3 x2") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (300 + 16) << false << false;
+ << 0 << (250 + offset) << 0 << (300 + offset) << false << false;
QTest::newRow("4 x2") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (-50 + 16) << -200 << (-100 + 16) << false << false;
+ << -200 << (-50 + offset) << -200 << (-100 + offset) << false << false;
QTest::newRow("5 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (-100 + 16) << false << false;
+ << -200 << (50 + offset) << -200 << (-100 + offset) << false << false;
QTest::newRow("6 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (100 + 16) << false << false;
+ << -200 << (50 + offset) << -200 << (100 + offset) << false << false;
QTest::newRow("1 No ScrollBars") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
<< Qt::ScrollBarAlwaysOff << Qt::ScrollBarAlwaysOff
<< 0 << 0 << 0 << 0 << false << false;
@@ -272,7 +286,7 @@ static void _scrollBarRanges_data_1()
<< -200 << (50 + 16) << -200 << (100 + 16) << false << false;
}
-static void _scrollBarRanges_data_2()
+static void _scrollBarRanges_data_2(int offset)
{
// Motif, flat frame
QTest::newRow("Motif, 1") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
@@ -280,73 +294,73 @@ static void _scrollBarRanges_data_2()
<< 0 << 0 << 0 << 0 << true << false;
QTest::newRow("Motif, 2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << 16 << true << false;
+ << 0 << (50 + offset) << 0 << offset << true << false;
QTest::newRow("Motif, 3") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << (100 + 16) << true << false;
+ << 0 << (50 + offset) << 0 << (100 + offset) << true << false;
QTest::newRow("Motif, 4") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
<< 0 << 0 << 0 << 0 << true << false;
QTest::newRow("Motif, 5") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << (-100 + 16) << true << false;
+ << -100 << (offset-50) << -100 << (-100 + offset) << true << false;
QTest::newRow("Motif, 6") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << 16 << true << false;
+ << -100 << (offset-50) << -100 << offset << true << false;
QTest::newRow("Motif, 7") << QSize(150, 100) << QRectF(0, 0, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << 17 << 0 << 17 << true << false;
+ << 0 << offset + 1 << 0 << offset + 1 << true << false;
QTest::newRow("Motif, 8") << QSize(150, 100) << QRectF(0, 0, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << 17 << true << false;
+ << 0 << (50 + offset + 1) << 0 << offset + 1 << true << false;
QTest::newRow("Motif, 9") << QSize(150, 100) << QRectF(0, 0, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << (100 + 17) << true << false;
+ << 0 << (50 + offset + 1) << 0 << (100 + offset + 1) << true << false;
QTest::newRow("Motif, 10") << QSize(150, 100) << QRectF(-101, -101, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -101 << (-100 + 16) << -101 << (-100 + 16) << true << false;
+ << -101 << (-100 + offset) << -101 << (-100 + offset) << true << false;
QTest::newRow("Motif, 11") << QSize(150, 100) << QRectF(-101, -101, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << -101 << (-100 + 16) << true << false;
+ << (-101) << (offset-50) << -101 << (-100 + offset) << true << false;
QTest::newRow("Motif, 12") << QSize(150, 100) << QRectF(-101, -101, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << (-101) << 16 << true << false;
+ << (-101) << (offset-50) << (-101) << offset << true << false;
QTest::newRow("Motif, 13") << QSize(150, 100) << QRectF(0, 0, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (16 + 16) << 0 << (16 + 16) << true << false;
+ << 0 << (offset + 16) << 0 << (offset + 16) << true << false;
QTest::newRow("Motif, 14") << QSize(150, 100) << QRectF(0, 0, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (16 + 16) << true << false;
+ << 0 << (50 + offset + 16) << 0 << (offset + 16) << true << false;
QTest::newRow("Motif, 15") << QSize(150, 100) << QRectF(0, 0, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (100 + 16 + 16) << true << false;
+ << 0 << (50 + offset + 16) << 0 << (100 + offset + 16) << true << false;
QTest::newRow("Motif, 16") << QSize(150, 100) << QRectF(-116, -116, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (-100 + 16) << (-100 - 16) << (-100 + 16) << true << false;
+ << (-100 - 16) << (-100 + offset) << (-100 - 16) << (-100 + offset) << true << false;
QTest::newRow("Motif, 17") << QSize(150, 100) << QRectF(-116, -116, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << (-100 + 16) << true << false;
+ << (-100 - 16) << (offset-50) << (-100 - 16) << (-100 + offset) << true << false;
QTest::newRow("Motif, 18") << QSize(150, 100) << QRectF(-116, -116, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << 16 << true << false;
+ << (-100 - 16) << (offset-50) << (-100 - 16) << offset << true << false;
QTest::newRow("Motif, 1 x2") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (150 + 16) << 0 << (100 + 16) << true << false;
+ << 0 << (150 + offset) << 0 << (100 + offset) << true << false;
QTest::newRow("Motif, 2 x2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (100 + 16) << true << false;
+ << 0 << (250 + offset) << 0 << (100 + offset) << true << false;
QTest::newRow("Motif, 3 x2") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (300 + 16) << true << false;
+ << 0 << (250 + offset) << 0 << (300 + offset) << true << false;
QTest::newRow("Motif, 4 x2") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (-50 + 16) << -200 << (-100 + 16) << true << false;
+ << -200 << (-50 + offset) << -200 << (-100 + offset) << true << false;
QTest::newRow("Motif, 5 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (-100 + 16) << true << false;
+ << -200 << (50 + offset) << -200 << (-100 + offset) << true << false;
QTest::newRow("Motif, 6 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (100 + 16) << true << false;
+ << -200 << (50 + offset) << -200 << (100 + offset) << true << false;
QTest::newRow("Motif, 1 No ScrollBars") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
<< Qt::ScrollBarAlwaysOff << Qt::ScrollBarAlwaysOff
<< 0 << 0 << 0 << 0 << true << false;
@@ -493,7 +507,7 @@ static void _scrollBarRanges_data_2()
<< -200 << (50 + 16) << -200 << (100 + 16) << true << false;
}
-static void _scrollBarRanges_data_3()
+static void _scrollBarRanges_data_3(int offset)
{
// No motif, styled panel
QTest::newRow("Styled, 1") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
@@ -501,73 +515,73 @@ static void _scrollBarRanges_data_3()
<< 0 << 0 << 0 << 0 << false << true;
QTest::newRow("Styled, 2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << 16 << false << true;
+ << 0 << (50 + offset) << 0 << offset << false << true;
QTest::newRow("Styled, 3") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16) << 0 << (100 + 16) << false << true;
+ << 0 << (50 + offset) << 0 << (100 + offset) << false << true;
QTest::newRow("Styled, 4") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
<< 0 << 0 << 0 << 0 << false << true;
QTest::newRow("Styled, 5") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << (-100 + 16) << false << true;
+ << -100 << (offset-50) << -100 << (-100 + offset) << false << true;
QTest::newRow("Styled, 6") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16-50) << -100 << 16 << false << true;
+ << -100 << (offset-50) << -100 << offset << false << true;
QTest::newRow("Styled, 7") << QSize(150, 100) << QRectF(0, 0, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << 17 << 0 << 17 << false << true;
+ << 0 << offset + 1 << 0 << offset + 1 << false << true;
QTest::newRow("Styled, 8") << QSize(150, 100) << QRectF(0, 0, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << 17 << false << true;
+ << 0 << (50 + offset + 1) << 0 << offset + 1 << false << true;
QTest::newRow("Styled, 9") << QSize(150, 100) << QRectF(0, 0, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17) << 0 << (100 + 17) << false << true;
+ << 0 << (50 + offset + 1) << 0 << (100 + offset + 1) << false << true;
QTest::newRow("Styled, 10") << QSize(150, 100) << QRectF(-101, -101, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -101 << (-100 + 16) << -101 << (-100 + 16) << false << true;
+ << -101 << (-100 + offset) << -101 << (-100 + offset) << false << true;
QTest::newRow("Styled, 11") << QSize(150, 100) << QRectF(-101, -101, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << -101 << (-100 + 16) << false << true;
+ << (-101) << (offset-50) << -101 << (-100 + offset) << false << true;
QTest::newRow("Styled, 12") << QSize(150, 100) << QRectF(-101, -101, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16-50) << (-101) << 16 << false << true;
+ << (-101) << (offset-50) << (-101) << offset << false << true;
QTest::newRow("Styled, 13") << QSize(150, 100) << QRectF(0, 0, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (16 + 16) << 0 << (16 + 16) << false << true;
+ << 0 << (offset + 16) << 0 << (offset + 16) << false << true;
QTest::newRow("Styled, 14") << QSize(150, 100) << QRectF(0, 0, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (16 + 16) << false << true;
+ << 0 << (50 + offset + 16) << 0 << (offset + 16) << false << true;
QTest::newRow("Styled, 15") << QSize(150, 100) << QRectF(0, 0, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16) << 0 << (100 + 16 + 16) << false << true;
+ << 0 << (50 + offset + 16) << 0 << (100 + offset + 16) << false << true;
QTest::newRow("Styled, 16") << QSize(150, 100) << QRectF(-116, -116, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (-100 + 16) << (-100 - 16) << (-100 + 16) << false << true;
+ << (-100 - 16) << (-100 + offset) << (-100 - 16) << (-100 + offset) << false << true;
QTest::newRow("Styled, 17") << QSize(150, 100) << QRectF(-116, -116, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << (-100 + 16) << false << true;
+ << (-100 - 16) << (offset-50) << (-100 - 16) << (-100 + offset) << false << true;
QTest::newRow("Styled, 18") << QSize(150, 100) << QRectF(-116, -116, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16-50) << (-100 - 16) << 16 << false << true;
+ << (-100 - 16) << (offset-50) << (-100 - 16) << offset << false << true;
QTest::newRow("Styled, 1 x2") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (150 + 16) << 0 << (100 + 16) << false << true;
+ << 0 << (150 + offset) << 0 << (100 + offset) << false << true;
QTest::newRow("Styled, 2 x2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (100 + 16) << false << true;
+ << 0 << (250 + offset) << 0 << (100 + offset) << false << true;
QTest::newRow("Styled, 3 x2") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16) << 0 << (300 + 16) << false << true;
+ << 0 << (250 + offset) << 0 << (300 + offset) << false << true;
QTest::newRow("Styled, 4 x2") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (-50 + 16) << -200 << (-100 + 16) << false << true;
+ << -200 << (-50 + offset) << -200 << (-100 + offset) << false << true;
QTest::newRow("Styled, 5 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (-100 + 16) << false << true;
+ << -200 << (50 + offset) << -200 << (-100 + offset) << false << true;
QTest::newRow("Styled, 6 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16) << -200 << (100 + 16) << false << true;
+ << -200 << (50 + offset) << -200 << (100 + offset) << false << true;
QTest::newRow("Styled, 1 No ScrollBars") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
<< Qt::ScrollBarAlwaysOff << Qt::ScrollBarAlwaysOff
<< 0 << 0 << 0 << 0 << false << true;
@@ -714,7 +728,7 @@ static void _scrollBarRanges_data_3()
<< -200 << (50 + 16) << -200 << (100 + 16) << false << true;
}
-static void _scrollBarRanges_data_4()
+static void _scrollBarRanges_data_4(int offset)
{
// Motif, styled panel
QTest::newRow("Motif, Styled, 1") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
@@ -722,73 +736,73 @@ static void _scrollBarRanges_data_4()
<< 0 << 0 << 0 << 0 << true << true;
QTest::newRow("Motif, Styled, 2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 4) << 0 << (16 + 4) << true << true;
+ << 0 << (50 + offset + 4) << 0 << (offset + 4) << true << true;
QTest::newRow("Motif, Styled, 3") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 4) << 0 << (100 + 16 + 4) << true << true;
+ << 0 << (50 + offset + 4) << 0 << (100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 4") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
<< 0 << 0 << 0 << 0 << true << true;
QTest::newRow("Motif, Styled, 5") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16 + 4 - 50) << -100 << (-100 + 16 + 4) << true << true;
+ << -100 << (offset + 4 - 50) << -100 << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 6") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -100 << (16 + 4 - 50) << -100 << (16 + 4) << true << true;
+ << -100 << (offset + 4 - 50) << -100 << (offset + 4) << true << true;
QTest::newRow("Motif, Styled, 7") << QSize(150, 100) << QRectF(0, 0, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (17 + 4) << 0 << (17 + 4) << true << true;
+ << 0 << (offset + 1 + 4) << 0 << (offset + 1 + 4) << true << true;
QTest::newRow("Motif, Styled, 8") << QSize(150, 100) << QRectF(0, 0, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17 + 4) << 0 << (17 + 4) << true << true;
+ << 0 << (50 + offset + 1 + 4) << 0 << (offset + 1 + 4) << true << true;
QTest::newRow("Motif, Styled, 9") << QSize(150, 100) << QRectF(0, 0, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 17 + 4) << 0 << (100 + 17 + 4) << true << true;
+ << 0 << (50 + offset + 1 + 4) << 0 << (100 + offset + 1 + 4) << true << true;
QTest::newRow("Motif, Styled, 10") << QSize(150, 100) << QRectF(-101, -101, 151, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -101 << (-100 + 16 + 4) << -101 << (-100 + 16 + 4) << true << true;
+ << -101 << (-100 + offset + 4) << -101 << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 11") << QSize(150, 100) << QRectF(-101, -101, 201, 101) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16 + 4 - 50) << -101 << (-100 + 16 + 4) << true << true;
+ << (-101) << (offset + 4 - 50) << -101 << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 12") << QSize(150, 100) << QRectF(-101, -101, 201, 201) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-101) << (16 + 4 - 50) << (-101) << (16 + 4) << true << true;
+ << (-101) << (offset + 4 - 50) << (-101) << (offset + 4) << true << true;
QTest::newRow("Motif, Styled, 13") << QSize(150, 100) << QRectF(0, 0, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (16 + 16 + 4) << 0 << (16 + 16 + 4) << true << true;
+ << 0 << (offset + 16 + 4) << 0 << (offset + 16 + 4) << true << true;
QTest::newRow("Motif, Styled, 14") << QSize(150, 100) << QRectF(0, 0, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16 + 4) << 0 << (16 + 16 + 4) << true << true;
+ << 0 << (50 + offset + 16 + 4) << 0 << (offset + 16 + 4) << true << true;
QTest::newRow("Motif, Styled, 15") << QSize(150, 100) << QRectF(0, 0, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (50 + 16 + 16 + 4) << 0 << (100 + 16 + 16 + 4) << true << true;
+ << 0 << (50 + offset + 16 + 4) << 0 << (100 + offset + 16 + 4) << true << true;
QTest::newRow("Motif, Styled, 16") << QSize(150, 100) << QRectF(-116, -116, 166, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (-100 + 16 + 4) << (-100 - 16) << (-100 + 16 + 4) << true << true;
+ << (-100 - 16) << (-100 + offset + 4) << (-100 - 16) << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 17") << QSize(150, 100) << QRectF(-116, -116, 216, 116) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16 + 4 - 50) << (-100 - 16) << (-100 + 16 + 4) << true << true;
+ << (-100 - 16) << (offset + 4 - 50) << (-100 - 16) << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 18") << QSize(150, 100) << QRectF(-116, -116, 216, 216) << QTransform()
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << (-100 - 16) << (16 + 4 - 50) << (-100 - 16) << (16 + 4) << true << true;
+ << (-100 - 16) << (offset + 4 - 50) << (-100 - 16) << (offset + 4) << true << true;
QTest::newRow("Motif, Styled, 1 x2") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (150 + 16 + 4) << 0 << (100 + 16 + 4) << true << true;
+ << 0 << (150 + offset + 4) << 0 << (100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 2 x2") << QSize(150, 100) << QRectF(0, 0, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16 + 4) << 0 << (100 + 16 + 4) << true << true;
+ << 0 << (250 + offset + 4) << 0 << (100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 3 x2") << QSize(150, 100) << QRectF(0, 0, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << 0 << (250 + 16 + 4) << 0 << (300 + 16 + 4) << true << true;
+ << 0 << (250 + offset + 4) << 0 << (300 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 4 x2") << QSize(150, 100) << QRectF(-100, -100, 150, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (-50 + 16 + 4) << -200 << (-100 + 16 + 4) << true << true;
+ << -200 << (-50 + offset + 4) << -200 << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 5 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 100) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16 + 4) << -200 << (-100 + 16 + 4) << true << true;
+ << -200 << (50 + offset + 4) << -200 << (-100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 6 x2") << QSize(150, 100) << QRectF(-100, -100, 200, 200) << QTransform().scale(2, 2)
<< Qt::ScrollBarAsNeeded << Qt::ScrollBarAsNeeded
- << -200 << (50 + 16 + 4) << -200 << (100 + 16 + 4) << true << true;
+ << -200 << (50 + offset + 4) << -200 << (100 + offset + 4) << true << true;
QTest::newRow("Motif, Styled, 1 No ScrollBars") << QSize(150, 100) << QRectF(0, 0, 150, 100) << QTransform()
<< Qt::ScrollBarAlwaysOff << Qt::ScrollBarAlwaysOff
<< 0 << 0 << 0 << 0 << true << true;
@@ -949,8 +963,14 @@ void _scrollBarRanges_data()
QTest::addColumn<bool>("useMotif");
QTest::addColumn<bool>("useStyledPanel");
- _scrollBarRanges_data_1();
- _scrollBarRanges_data_2();
- _scrollBarRanges_data_3();
- _scrollBarRanges_data_4();
+ int offset = 16;
+#ifdef Q_OS_WINCE
+ if (qt_wince_is_high_dpi())
+ offset *= 2;
+#endif
+
+ _scrollBarRanges_data_1(offset);
+ _scrollBarRanges_data_2(offset);
+ _scrollBarRanges_data_3(offset);
+ _scrollBarRanges_data_4(offset);
}
diff --git a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
index 26021e0..6b5ad09 100644
--- a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -159,6 +159,7 @@ private slots:
void ensureClipping();
void widgetSendsGeometryChanges();
void respectHFW();
+ void addChildInpolishEvent();
// Task fixes
void task236127_bspTreeIndexFails();
@@ -2716,6 +2717,58 @@ void tst_QGraphicsWidget::respectHFW()
#endif
}
+class PolishWidget : public QGraphicsWidget
+{
+public:
+
+ PolishWidget(Qt::GlobalColor color, QGraphicsItem *parent=0) :
+ QGraphicsWidget(parent), mColor(color)
+ {
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+ {
+ painter->setBrush(QBrush(mColor));
+ painter->drawRect(boundingRect());
+ }
+
+ void polishEvent()
+ {
+ if (!parentWidget()) {
+ //We add a child in the polish event for the parent
+ PolishWidget *childWidget = new PolishWidget(Qt::black, this);
+ childWidget->setGeometry(QRectF(10,10,30,30));
+ }
+
+ QGraphicsWidget::polishEvent();
+ mColor = Qt::red;
+ update();
+ numberOfPolish++;
+ }
+
+ static int numberOfPolish;
+
+private:
+ Qt::GlobalColor mColor;
+};
+
+int PolishWidget::numberOfPolish = 0;
+
+void tst_QGraphicsWidget::addChildInpolishEvent()
+{
+ QGraphicsScene scene;
+
+ PolishWidget *parentWidget = new PolishWidget(Qt::white);
+ scene.addItem(parentWidget);
+
+ QGraphicsView view(&scene);
+ view.resize(200, 200);
+ view.show();
+ QTest::qWaitForWindowShown(&view);
+ QCOMPARE(PolishWidget::numberOfPolish, 2);
+}
+
+
QTEST_MAIN(tst_QGraphicsWidget)
#include "tst_qgraphicswidget.moc"
diff --git a/tests/auto/qheaderview/tst_qheaderview.cpp b/tests/auto/qheaderview/tst_qheaderview.cpp
index 920231d..c13e829 100644
--- a/tests/auto/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/qheaderview/tst_qheaderview.cpp
@@ -682,9 +682,12 @@ void tst_QHeaderView::visualIndexAt()
void tst_QHeaderView::length()
{
-#ifdef Q_OS_WINCE
+#if defined(Q_OS_WINCE)
QFont font(QLatin1String("Tahoma"), 7);
view->setFont(font);
+#elif defined(Q_OS_SYMBIAN)
+ QFont font(QLatin1String("Series 60 Sans"), 6);
+ view->setFont(font);
#endif
view->setStretchLastSection(true);
view->show();
@@ -1836,7 +1839,7 @@ void tst_QHeaderView::preserveHiddenSectionWidth()
model.insertRow(1);
view.showSection(2);
QCOMPARE(view.sectionSize(0), 100);
- QCOMPARE(view.sectionSize(1), 30);
+ QCOMPARE(view.sectionSize(1), view.defaultSectionSize());
QCOMPARE(view.sectionSize(2), 50);
}
diff --git a/tests/auto/qhttp/tst_qhttp.cpp b/tests/auto/qhttp/tst_qhttp.cpp
index f6d5e3e..0ea0d15 100644
--- a/tests/auto/qhttp/tst_qhttp.cpp
+++ b/tests/auto/qhttp/tst_qhttp.cpp
@@ -484,6 +484,7 @@ void tst_QHttp::post_data()
QTest::addColumn<bool>("useProxy");
QTest::addColumn<QString>("host");
QTest::addColumn<int>("port");
+ QTest::addColumn<bool>("ssl");
QTest::addColumn<QString>("path");
QTest::addColumn<QByteArray>("result");
@@ -491,25 +492,48 @@ void tst_QHttp::post_data()
md5sum = "d41d8cd98f00b204e9800998ecf8427e";
QTest::newRow("empty-data")
<< QString() << false << false
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
QTest::newRow("empty-device")
<< QString() << true << false
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
QTest::newRow("proxy-empty-data")
<< QString() << false << true
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
md5sum = "b3e32ac459b99d3f59318f3ac31e4bee";
QTest::newRow("data") << "rfc3252.txt" << false << false
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi"
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi"
<< md5sum;
QTest::newRow("device") << "rfc3252.txt" << true << false
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi"
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi"
<< md5sum;
QTest::newRow("proxy-data") << "rfc3252.txt" << false << true
- << QtNetworkSettings::serverName() << 80 << "/qtest/cgi-bin/md5sum.cgi"
+ << QtNetworkSettings::serverName() << 80 << false << "/qtest/cgi-bin/md5sum.cgi"
<< md5sum;
+#ifndef QT_NO_OPENSSL
+ md5sum = "d41d8cd98f00b204e9800998ecf8427e";
+ QTest::newRow("empty-data-ssl")
+ << QString() << false << false
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ QTest::newRow("empty-device-ssl")
+ << QString() << true << false
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ QTest::newRow("proxy-empty-data-ssl")
+ << QString() << false << true
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi" << md5sum;
+ md5sum = "b3e32ac459b99d3f59318f3ac31e4bee";
+ QTest::newRow("data-ssl") << "rfc3252.txt" << false << false
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi"
+ << md5sum;
+ QTest::newRow("device-ssl") << "rfc3252.txt" << true << false
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi"
+ << md5sum;
+ QTest::newRow("proxy-data-ssl") << "rfc3252.txt" << false << true
+ << QtNetworkSettings::serverName() << 443 << true << "/qtest/cgi-bin/md5sum.cgi"
+ << md5sum;
+#endif
+
// the following test won't work. See task 185996
/*
QTest::newRow("proxy-device") << "rfc3252.txt" << true << true
@@ -525,14 +549,19 @@ void tst_QHttp::post()
QFETCH(bool, useProxy);
QFETCH(QString, host);
QFETCH(int, port);
+ QFETCH(bool, ssl);
QFETCH(QString, path);
http = newHttp(useProxy);
+#ifndef QT_NO_OPENSSL
+ QObject::connect(http, SIGNAL(sslErrors(const QList<QSslError> &)),
+ http, SLOT(ignoreSslErrors()));
+#endif
QCOMPARE(http->currentId(), 0);
QCOMPARE((int)http->state(), (int)QHttp::Unconnected);
if (useProxy)
addRequest(QHttpRequestHeader(), http->setProxy(QtNetworkSettings::serverName(), 3129));
- addRequest(QHttpRequestHeader(), http->setHost(host, port));
+ addRequest(QHttpRequestHeader(), http->setHost(host, (ssl ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp), port));
// add the POST request
QFile file(SRCDIR + source);
diff --git a/tests/auto/qlabel/qlabel.pro b/tests/auto/qlabel/qlabel.pro
index 6d55c13..297f868 100644
--- a/tests/auto/qlabel/qlabel.pro
+++ b/tests/auto/qlabel/qlabel.pro
@@ -1,19 +1,10 @@
load(qttest_p4)
-SOURCES += tst_qlabel.cpp
-
-wince*:{
- DEFINES += SRCDIR=\\\"\\\"
-} else:!symbian {
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
-}
-
-wince*|symbian {
- addFiles.sources = *.png testdata
+SOURCES += tst_qlabel.cpp
+wince*::DEFINES += SRCDIR=\\\"\\\"
+else:!symbian:DEFINES += SRCDIR=\\\"$$PWD/\\\"
+wince*|symbian {
+ addFiles.sources = *.png \
+ testdata
addFiles.path = .
DEPLOYMENT += addFiles
}
-
-
-
-
-
diff --git a/tests/auto/qlabel/tst_qlabel.cpp b/tests/auto/qlabel/tst_qlabel.cpp
index dd03ef3..9eae9c9 100644
--- a/tests/auto/qlabel/tst_qlabel.cpp
+++ b/tests/auto/qlabel/tst_qlabel.cpp
@@ -50,6 +50,7 @@
#include <qlineedit.h>
#include <qmovie.h>
#include <qpicture.h>
+#include <qmessagebox.h>
//TESTED_CLASS=
//TESTED_FILES=
@@ -112,6 +113,9 @@ private slots:
void task226479_movieResize();
void emptyPixmap();
+ void unicodeText_data();
+ void unicodeText();
+
private:
QLabel *testWidget;
QPointer<Widget> test_box;
@@ -451,5 +455,59 @@ void tst_QLabel::emptyPixmap()
QCOMPARE(label1.sizeHint(), label4.sizeHint());
}
+/**
+ Test for QTBUG-4848 - unicode data corrupting QLabel display
+*/
+void tst_QLabel::unicodeText_data()
+{
+ QTest::addColumn<QString>("text");
+ QTest::addColumn<QString>("languageName");
+
+ /*
+ The "glass" phrase in Thai was the initial report for bug QTBUG-4848, was
+ originally found on http://www.columbia.edu/kermit/utf8.html.
+
+ The phrase is from an internet tradition regarding a striking phrase
+ that is translated into many different languages. The utf8 strings
+ below were generated by using http://translate.google.com.
+
+ The glass phrase in Thai contains the ้ว character which manifests bug
+ QTBUG-4848
+
+ The last long phrase is an excerpt from Churchills "on the beaches"
+ speech, also translated using http://translate.google.com.
+ */
+
+ QTest::newRow("english") << QString::fromUtf8("I can eat glass and it doesn't hurt me.") << QString("english");
+ QTest::newRow("thai") << QString::fromUtf8("ฉันจะกินแก้วและไม่เจ็บฉัน") << QString("thai");
+ QTest::newRow("chinese") << QString::fromUtf8("我可以吃玻璃,并没有伤害我。") << QString("chinese");
+ QTest::newRow("arabic") << QString::fromUtf8("أستطيع أكل الزجاج ، وأنه لا يؤذيني.") << QString("arabic");
+ QTest::newRow("russian") << QString::fromUtf8("Я могу есть стекло, и не больно.") << QString("russian");
+ QTest::newRow("korean") << QString::fromUtf8("유리를 먹을 수있는, 그리고 그게 날 다치게하지 않습니다.") << QString("korean");
+ QTest::newRow("greek") << QString::fromUtf8("Μπορώ να φάτε γυαλί και δεν μου κάνει κακό.") << QString("greek");
+ QTest::newRow("german") << QString::fromUtf8("Ich kann Glas essen und es macht mich nicht heiß.") << QString("german");
+
+ QTest::newRow("thai_long") << QString::fromUtf8("เราจะต่อสู้ในทะเลและมหาสมุทร. เราจะต่อสู้ด้วยความมั่นใจเติบโตและความเจริญเติบโตในอากาศเราจะปกป้องเกาะของเราค่าใช้จ่ายใดๆอาจ."
+ "เราจะต่อสู้บนชายหาดเราจะต่อสู้ในบริเวณเชื่อมโยงไปถึงเราจะต่อสู้ในช่องและในถนนที่เราจะต่อสู้ในภูเขานั้นเราจะไม่ยอม.")
+ << QString("thai_long");
+}
+
+void tst_QLabel::unicodeText()
+{
+ const QString testDataPath("testdata/unicodeText");
+ QFETCH(QString, text);
+ QFETCH(QString, languageName);
+ QFrame frame;
+ QVBoxLayout *layout = new QVBoxLayout();
+ QLabel *label = new QLabel(text, &frame);
+ layout->addWidget(label);
+ layout->setMargin(8);
+ frame.setLayout(layout);
+ frame.show();
+ QTest::qWaitForWindowShown(&frame);
+ QVERIFY(frame.isVisible()); // was successfully sized and shown
+ testWidget->show();
+}
+
QTEST_MAIN(tst_QLabel)
#include "tst_qlabel.moc"
diff --git a/tests/auto/qlayout/tst_qlayout.cpp b/tests/auto/qlayout/tst_qlayout.cpp
index 9d6110d..efe14c3 100644
--- a/tests/auto/qlayout/tst_qlayout.cpp
+++ b/tests/auto/qlayout/tst_qlayout.cpp
@@ -83,6 +83,7 @@ private slots:
void layoutItemRect();
void warnIfWrongParent();
void controlTypes();
+ void adjustSizeShouldMakeSureLayoutIsActivated();
};
tst_QLayout::tst_QLayout()
@@ -110,8 +111,8 @@ void tst_QLayout::getSetCheck()
class SizeHinterFrame : public QFrame
{
public:
- SizeHinterFrame(const QSize &s)
- : QFrame(0), sh(s) {
+ SizeHinterFrame(const QSize &sh, const QSize &msh = QSize())
+ : QFrame(0), sh(sh), msh(msh) {
setFrameStyle(QFrame::Box | QFrame::Plain);
}
@@ -119,9 +120,11 @@ public:
void setSizeHint(const QSize &s) { sh = s; }
QSize sizeHint() const { return sh; }
+ QSize minimumSizeHint() const { return msh; }
private:
QSize sh;
+ QSize msh;
};
@@ -333,5 +336,26 @@ void tst_QLayout::controlTypes()
}
+void tst_QLayout::adjustSizeShouldMakeSureLayoutIsActivated()
+{
+ QWidget main;
+
+ QVBoxLayout *const layout = new QVBoxLayout(&main);
+ layout->setMargin(0);
+ SizeHinterFrame *frame = new SizeHinterFrame(QSize(200, 10), QSize(200, 8));
+ frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ layout->addWidget(frame);
+
+ SizeHinterFrame *frame2 = new SizeHinterFrame(QSize(200, 10), QSize(200, 8));
+ frame2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ layout->addWidget(frame2);
+
+ main.show();
+
+ frame2->hide();
+ main.adjustSize();
+ QCOMPARE(main.size(), QSize(200, 10));
+}
+
QTEST_MAIN(tst_QLayout)
#include "tst_qlayout.moc"
diff --git a/tests/auto/qlineedit/tst_qlineedit.cpp b/tests/auto/qlineedit/tst_qlineedit.cpp
index 8368114..c676959 100644
--- a/tests/auto/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/qlineedit/tst_qlineedit.cpp
@@ -3304,41 +3304,45 @@ void tst_QLineEdit::task174640_editingFinished()
layout->addWidget(le2);
mw.show();
- QTest::qWait(200);
+ QApplication::setActiveWindow(&mw);
mw.activateWindow();
+ QTest::qWaitForWindowShown(&mw);
QSignalSpy editingFinishedSpy(le1, SIGNAL(editingFinished()));
le1->setFocus();
- QTest::qWait(200);
- QVERIFY(le1->hasFocus());
+ QTest::qWait(20);
+ QTRY_VERIFY(le1->hasFocus());
QCOMPARE(editingFinishedSpy.count(), 0);
le2->setFocus();
- QTest::qWait(200);
- QVERIFY(le2->hasFocus());
+ QTest::qWait(20);
+ QTRY_VERIFY(le2->hasFocus());
QCOMPARE(editingFinishedSpy.count(), 1);
editingFinishedSpy.clear();
le1->setFocus();
- QTest::qWait(200);
- QVERIFY(le1->hasFocus());
+ QTest::qWait(20);
+ QTRY_VERIFY(le1->hasFocus());
QMenu *testMenu1 = new QMenu(le1);
testMenu1->addAction("foo");
testMenu1->addAction("bar");
testMenu1->show();
- QTest::qWait(200);
+ QTest::qWaitForWindowShown(testMenu1);
+ QTest::qWait(20);
mw.activateWindow();
+
delete testMenu1;
QCOMPARE(editingFinishedSpy.count(), 0);
- QVERIFY(le1->hasFocus());
+ QTRY_VERIFY(le1->hasFocus());
QMenu *testMenu2 = new QMenu(le2);
testMenu2->addAction("foo2");
testMenu2->addAction("bar2");
testMenu2->show();
- QTest::qWait(200);
+ QTest::qWaitForWindowShown(testMenu2);
+ QTest::qWait(20);
mw.activateWindow();
delete testMenu2;
QCOMPARE(editingFinishedSpy.count(), 1);
diff --git a/tests/auto/qlistview/tst_qlistview.cpp b/tests/auto/qlistview/tst_qlistview.cpp
index 7599ce6a06..6e211ae 100644
--- a/tests/auto/qlistview/tst_qlistview.cpp
+++ b/tests/auto/qlistview/tst_qlistview.cpp
@@ -116,6 +116,9 @@ private slots:
void keyboardSearch();
void shiftSelectionWithNonUniformItemSizes();
void clickOnViewportClearsSelection();
+ void task262152_setModelColumnNavigate();
+ void taskQTBUG_2233_scrollHiddenItems_data();
+ void taskQTBUG_2233_scrollHiddenItems();
};
// Testing get/set functions
@@ -1767,6 +1770,64 @@ void tst_QListView::clickOnViewportClearsSelection()
}
+void tst_QListView::task262152_setModelColumnNavigate()
+{
+ QListView view;
+ QStandardItemModel model(3,2);
+ model.setItem(0,1,new QStandardItem("[0,1]"));
+ model.setItem(1,1,new QStandardItem("[1,1]"));
+ model.setItem(2,1,new QStandardItem("[2,1]"));
+
+ view.setModel(&model);
+ view.setModelColumn(1);
+
+ view.show();
+ QTest::qWait(100);
+ QTest::keyClick(&view, Qt::Key_Down);
+ QTest::qWait(100);
+ QCOMPARE(view.currentIndex(), model.index(1,1));
+ QTest::keyClick(&view, Qt::Key_Down);
+ QTest::qWait(100);
+ QCOMPARE(view.currentIndex(), model.index(2,1));
+
+}
+
+void tst_QListView::taskQTBUG_2233_scrollHiddenItems_data()
+{
+ QTest::addColumn<int>("flow");
+
+ QTest::newRow("TopToBottom") << static_cast<int>(QListView::TopToBottom);
+ QTest::newRow("LeftToRight") << static_cast<int>(QListView::LeftToRight);
+}
+
+void tst_QListView::taskQTBUG_2233_scrollHiddenItems()
+{
+ QFETCH(int, flow);
+ const int rowCount = 200;
+
+ QListView view;
+ QStringListModel model(&view);
+ QStringList list;
+ for (int i = 0; i < rowCount; ++i)
+ list << QString::fromAscii("Item %1").arg(i);
+
+ model.setStringList(list);
+ view.setModel(&model);
+ view.setViewMode(QListView::ListMode);
+ for (int i = 0; i < rowCount / 2; ++i)
+ view.setRowHidden(2 * i, true);
+ view.setFlow(static_cast<QListView::Flow>(flow));
+ view.resize(130, 130);
+
+ for (int i = 0; i < 10; ++i) {
+ (view.flow() == QListView::TopToBottom
+ ? view.verticalScrollBar()
+ : view.horizontalScrollBar())->setValue(i);
+ QModelIndex index = view.indexAt(QPoint(0,0));
+ QVERIFY(index.isValid());
+ QCOMPARE(index.row(), 2 * i + 1);
+ }
+}
QTEST_MAIN(tst_QListView)
#include "tst_qlistview.moc"
diff --git a/tests/auto/qmenu/tst_qmenu.cpp b/tests/auto/qmenu/tst_qmenu.cpp
index 4eb149f..f12fa92 100644
--- a/tests/auto/qmenu/tst_qmenu.cpp
+++ b/tests/auto/qmenu/tst_qmenu.cpp
@@ -675,7 +675,13 @@ void tst_QMenu::activeSubMenuPosition()
#ifdef Q_OS_WINCE_WM
QSKIP("Not true for Windows Mobile Soft Keys", SkipSingle);
#endif
+
+#ifdef Q_OS_SYMBIAN
+ // On Symbian, QS60Style::pixelMetric(QStyle::PM_SubMenuOverlap) is different with other styles.
+ QVERIFY(sub->pos().x() < main->pos().x());
+#else
QVERIFY(sub->pos().x() > main->pos().x());
+#endif
QCOMPARE(sub->activeAction(), subAction);
}
@@ -778,6 +784,11 @@ void tst_QMenu::menuSizeHint()
int maxWidth =0;
QRect result;
foreach(QAction *action, menu.actions()) {
+#ifdef QT_SOFTKEYS_ENABLED
+ // Softkey actions are not widgets and have no geometry.
+ if (menu.actionGeometry(action).topLeft() == QPoint(0,0))
+ continue;
+#endif
maxWidth = qMax(maxWidth, menu.actionGeometry(action).width());
result |= menu.actionGeometry(action);
QCOMPARE(result.x(), left + hmargin + panelWidth);
@@ -816,6 +827,9 @@ void tst_QMenu::task258920_mouseBorder()
QSKIP("Mouse move related signals for Windows Mobile unavailable", SkipAll);
#endif
Menu258920 menu;
+ // On Symbian, styleHint(QStyle::SH_Menu_MouseTracking) in QS60Style is false.
+ // For other styles which inherit from QWindowsStyle, the value is true.
+ menu.setMouseTracking(true);
QAction *action = menu.addAction("test");
menu.popup(QApplication::desktop()->availableGeometry().center());
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index 9515d87..8ed83cb 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -238,6 +238,8 @@ private slots:
void taskQT4444_dontOverflowDashOffset();
+ void painterBegin();
+
private:
void fillData();
QColor baseColor( int k, int intensity=255 );
@@ -1554,7 +1556,7 @@ void tst_QPainter::drawClippedEllipse_data()
void tst_QPainter::drawClippedEllipse()
{
QFETCH(QRect, rect);
-#if defined(Q_OS_WINCE)
+#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
if (sizeof(qreal) != sizeof(double))
QSKIP("Test only works for qreal==double", SkipAll);
#endif
@@ -4312,5 +4314,43 @@ void tst_QPainter::taskQT4444_dontOverflowDashOffset()
QVERIFY(true); // Don't crash
}
+void tst_QPainter::painterBegin()
+{
+ QImage nullImage;
+ QImage indexed8Image(16, 16, QImage::Format_Indexed8);
+ QImage rgb32Image(16, 16, QImage::Format_RGB32);
+ QImage argb32Image(16, 16, QImage::Format_ARGB32_Premultiplied);
+
+ QPainter p;
+
+ // Painting on null image should fail.
+ QVERIFY(!p.begin(&nullImage));
+
+ // Check that the painter is not messed up by using it on another image.
+ QVERIFY(p.begin(&rgb32Image));
+ QVERIFY(p.end());
+
+ // If painting on indexed8 image fails, the painter state should still be OK.
+ if (p.begin(&indexed8Image))
+ QVERIFY(p.end());
+ QVERIFY(p.begin(&rgb32Image));
+ QVERIFY(p.end());
+
+ // Try opening a painter on the two different images.
+ QVERIFY(p.begin(&rgb32Image));
+ QVERIFY(!p.begin(&argb32Image));
+ QVERIFY(p.end());
+
+ // Try opening two painters on the same image.
+ QVERIFY(p.begin(&rgb32Image));
+ QPainter q;
+ QVERIFY(!q.begin(&rgb32Image));
+ QVERIFY(!q.end());
+ QVERIFY(p.end());
+
+ // Try ending an inactive painter.
+ QVERIFY(!p.end());
+}
+
QTEST_MAIN(tst_QPainter)
#include "tst_qpainter.moc"
diff --git a/tests/auto/qpauseanimation/qpauseanimation.pro b/tests/auto/qpauseanimation/qpauseanimation.pro
new file mode 100644
index 0000000..4599cf0
--- /dev/null
+++ b/tests/auto/qpauseanimation/qpauseanimation.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+QT = core gui
+SOURCES += tst_qpauseanimation.cpp
+
+
diff --git a/tests/auto/qpauseanimation/tst_qpauseanimation.cpp b/tests/auto/qpauseanimation/tst_qpauseanimation.cpp
new file mode 100644
index 0000000..b11efa0
--- /dev/null
+++ b/tests/auto/qpauseanimation/tst_qpauseanimation.cpp
@@ -0,0 +1,410 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+
+#include <QtCore/qpauseanimation.h>
+#include <QtCore/qpropertyanimation.h>
+#include <QtCore/qsequentialanimationgroup.h>
+
+#include <private/qabstractanimation_p.h>
+
+//TESTED_CLASS=QPauseAnimation
+//TESTED_FILES=
+
+class TestablePauseAnimation : public QPauseAnimation
+{
+ Q_OBJECT
+public:
+ TestablePauseAnimation(QObject *parent = 0)
+ : QPauseAnimation(parent),
+ m_updateCurrentTimeCount(0)
+ {
+ }
+
+ int m_updateCurrentTimeCount;
+protected:
+ void updateCurrentTime(int currentTime)
+ {
+ //qDebug() << this << "update current time: " << currentTime;
+ QPauseAnimation::updateCurrentTime(currentTime);
+ ++m_updateCurrentTimeCount;
+ }
+};
+
+class EnableConsistentTiming
+{
+public:
+ EnableConsistentTiming()
+ {
+ QUnifiedTimer *timer = QUnifiedTimer::instance();
+ timer->setConsistentTiming(true);
+ }
+ ~EnableConsistentTiming()
+ {
+ QUnifiedTimer *timer = QUnifiedTimer::instance();
+ timer->setConsistentTiming(false);
+ }
+};
+
+class tst_QPauseAnimation : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QPauseAnimation();
+ virtual ~tst_QPauseAnimation();
+
+public Q_SLOTS:
+ void init();
+ void cleanup();
+
+private slots:
+ void changeDirectionWhileRunning();
+ void noTimerUpdates_data();
+ void noTimerUpdates();
+ void mulitplePauseAnimations();
+ void pauseAndPropertyAnimations();
+ void pauseResume();
+ void sequentialPauseGroup();
+ void sequentialGroupWithPause();
+ void multipleSequentialGroups();
+ void zeroDuration();
+};
+
+tst_QPauseAnimation::tst_QPauseAnimation()
+{
+}
+
+tst_QPauseAnimation::~tst_QPauseAnimation()
+{
+}
+
+void tst_QPauseAnimation::init()
+{
+ qRegisterMetaType<QAbstractAnimation::State>("QAbstractAnimation::State");
+ qRegisterMetaType<QAbstractAnimation::DeletionPolicy>("QAbstractAnimation::DeletionPolicy");
+}
+
+void tst_QPauseAnimation::cleanup()
+{
+}
+
+void tst_QPauseAnimation::changeDirectionWhileRunning()
+{
+ QUnifiedTimer *timer = QUnifiedTimer::instance();
+ timer->setConsistentTiming(true);
+
+ TestablePauseAnimation animation;
+ animation.setDuration(400);
+ animation.start();
+ QTest::qWait(100);
+ QVERIFY(animation.state() == QAbstractAnimation::Running);
+ animation.setDirection(QAbstractAnimation::Backward);
+ QTest::qWait(animation.totalDuration() + 50);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+
+ timer->setConsistentTiming(false);
+}
+
+void tst_QPauseAnimation::noTimerUpdates_data()
+{
+ QTest::addColumn<int>("duration");
+ QTest::addColumn<int>("loopCount");
+
+ QTest::newRow("0") << 200 << 1;
+ QTest::newRow("1") << 160 << 1;
+ QTest::newRow("2") << 160 << 2;
+ QTest::newRow("3") << 200 << 3;
+}
+
+void tst_QPauseAnimation::noTimerUpdates()
+{
+ QUnifiedTimer *timer = QUnifiedTimer::instance();
+ timer->setConsistentTiming(true);
+
+ QFETCH(int, duration);
+ QFETCH(int, loopCount);
+
+ TestablePauseAnimation animation;
+ animation.setDuration(duration);
+ animation.setLoopCount(loopCount);
+ animation.start();
+ QTest::qWait(animation.totalDuration() + 100);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.m_updateCurrentTimeCount, 1 + loopCount);
+
+ timer->setConsistentTiming(false);
+}
+
+void tst_QPauseAnimation::mulitplePauseAnimations()
+{
+ QUnifiedTimer *timer = QUnifiedTimer::instance();
+ timer->setConsistentTiming(true);
+
+ TestablePauseAnimation animation;
+ animation.setDuration(200);
+
+ TestablePauseAnimation animation2;
+ animation2.setDuration(800);
+
+ animation.start();
+ animation2.start();
+ QTest::qWait(animation.totalDuration() + 100);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation2.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.m_updateCurrentTimeCount, 2);
+ QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
+
+ QTest::qWait(550);
+ QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.m_updateCurrentTimeCount, 3);
+
+ timer->setConsistentTiming(false);
+}
+
+void tst_QPauseAnimation::pauseAndPropertyAnimations()
+{
+ EnableConsistentTiming enabled;
+
+ TestablePauseAnimation pause;
+ pause.setDuration(200);
+
+ QObject o;
+ o.setProperty("ole", 42);
+
+ QPropertyAnimation animation(&o, "ole");
+ animation.setEndValue(43);
+
+ pause.start();
+
+ QTest::qWait(100);
+ animation.start();
+
+ QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QVERIFY(pause.state() == QAbstractAnimation::Running);
+ QCOMPARE(pause.m_updateCurrentTimeCount, 2);
+
+ QTest::qWait(animation.totalDuration() + 100);
+
+#ifdef Q_OS_WIN
+ if (animation.state() != QAbstractAnimation::Stopped)
+ QEXPECT_FAIL("", "On windows, consistent timing is not working properly due to bad timer resolution", Abort);
+#endif
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QVERIFY(pause.m_updateCurrentTimeCount > 3);
+}
+
+void tst_QPauseAnimation::pauseResume()
+{
+ TestablePauseAnimation animation;
+ animation.setDuration(400);
+ animation.start();
+ QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QTest::qWait(200);
+ animation.pause();
+ QVERIFY(animation.state() == QAbstractAnimation::Paused);
+ animation.start();
+ QTest::qWait(250);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.m_updateCurrentTimeCount, 3);
+}
+
+void tst_QPauseAnimation::sequentialPauseGroup()
+{
+ QSequentialAnimationGroup group;
+
+ TestablePauseAnimation animation1(&group);
+ animation1.setDuration(200);
+ TestablePauseAnimation animation2(&group);
+ animation2.setDuration(200);
+ TestablePauseAnimation animation3(&group);
+ animation3.setDuration(200);
+
+ group.start();
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(animation1.state() == QAbstractAnimation::Running);
+ QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+
+ group.setCurrentTime(250);
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(&animation2, group.currentAnimation());
+ QVERIFY(animation2.state() == QAbstractAnimation::Running);
+ QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+
+ group.setCurrentTime(500);
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(&animation3, group.currentAnimation());
+ QVERIFY(animation3.state() == QAbstractAnimation::Running);
+
+ group.setCurrentTime(750);
+
+ QVERIFY(group.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+
+ QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
+ QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
+ QCOMPARE(animation3.m_updateCurrentTimeCount, 2);
+}
+
+void tst_QPauseAnimation::sequentialGroupWithPause()
+{
+ QSequentialAnimationGroup group;
+
+ QObject o;
+ o.setProperty("ole", 42);
+
+ QPropertyAnimation animation(&o, "ole", &group);
+ animation.setEndValue(43);
+ TestablePauseAnimation pause(&group);
+ pause.setDuration(250);
+
+ group.start();
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+
+ group.setCurrentTime(300);
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(&pause, group.currentAnimation());
+ QVERIFY(pause.state() == QAbstractAnimation::Running);
+
+ group.setCurrentTime(600);
+
+ QVERIFY(group.state() == QAbstractAnimation::Stopped);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+
+ QCOMPARE(pause.m_updateCurrentTimeCount, 2);
+}
+
+void tst_QPauseAnimation::multipleSequentialGroups()
+{
+ EnableConsistentTiming enabled;
+
+ QParallelAnimationGroup group;
+ group.setLoopCount(2);
+
+ QSequentialAnimationGroup subgroup1(&group);
+
+ QObject o;
+ o.setProperty("ole", 42);
+
+ QPropertyAnimation animation(&o, "ole", &subgroup1);
+ animation.setEndValue(43);
+ animation.setDuration(300);
+ TestablePauseAnimation pause(&subgroup1);
+ pause.setDuration(200);
+
+ QSequentialAnimationGroup subgroup2(&group);
+
+ o.setProperty("ole2", 42);
+ QPropertyAnimation animation2(&o, "ole2", &subgroup2);
+ animation2.setEndValue(43);
+ animation2.setDuration(200);
+ TestablePauseAnimation pause2(&subgroup2);
+ pause2.setDuration(250);
+
+ QSequentialAnimationGroup subgroup3(&group);
+
+ TestablePauseAnimation pause3(&subgroup3);
+ pause3.setDuration(400);
+
+ o.setProperty("ole3", 42);
+ QPropertyAnimation animation3(&o, "ole3", &subgroup3);
+ animation3.setEndValue(43);
+ animation3.setDuration(200);
+
+ QSequentialAnimationGroup subgroup4(&group);
+
+ TestablePauseAnimation pause4(&subgroup4);
+ pause4.setDuration(310);
+
+ TestablePauseAnimation pause5(&subgroup4);
+ pause5.setDuration(60);
+
+ group.start();
+
+ QVERIFY(group.state() == QAbstractAnimation::Running);
+ QVERIFY(subgroup1.state() == QAbstractAnimation::Running);
+ QVERIFY(subgroup2.state() == QAbstractAnimation::Running);
+ QVERIFY(subgroup3.state() == QAbstractAnimation::Running);
+ QVERIFY(subgroup4.state() == QAbstractAnimation::Running);
+
+ QTest::qWait(group.totalDuration() + 100);
+
+#ifdef Q_OS_WIN
+ if (group.state() != QAbstractAnimation::Stopped)
+ QEXPECT_FAIL("", "On windows, consistent timing is not working properly due to bad timer resolution", Abort);
+#endif
+ QVERIFY(group.state() == QAbstractAnimation::Stopped);
+ QVERIFY(subgroup1.state() == QAbstractAnimation::Stopped);
+ QVERIFY(subgroup2.state() == QAbstractAnimation::Stopped);
+ QVERIFY(subgroup3.state() == QAbstractAnimation::Stopped);
+ QVERIFY(subgroup4.state() == QAbstractAnimation::Stopped);
+
+ QCOMPARE(pause5.m_updateCurrentTimeCount, 4);
+}
+
+void tst_QPauseAnimation::zeroDuration()
+{
+ TestablePauseAnimation animation;
+ animation.setDuration(0);
+ animation.start();
+ QTest::qWait(animation.totalDuration() + 100);
+ QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.m_updateCurrentTimeCount, 1);
+}
+
+QTEST_MAIN(tst_QPauseAnimation)
+#include "tst_qpauseanimation.moc"
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index 36c1518..9f5aee2 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -1144,7 +1144,7 @@ void tst_QPixmap::fromSymbianCFbsBitmap_data()
// QTest::newRow("EColor16MA small trans") << EColor16MA << smallWidth << smallHeight << QColor(255, 255, 0, 0);
// QTest::newRow("EColor16MA big trans") << EColor16MA << largeWidth << largeHeight << QColor(255, 255, 0, 0);
-#if !defined(__SERIES60_31__) && !defined(__S60_32__)
+#if !defined(__SERIES60_31__)
QTest::newRow("EColor16MAP small") << EColor16MAP << smallWidth << smallHeight << QColor(Qt::red);
QTest::newRow("EColor16MAP big") << EColor16MAP << largeWidth << largeHeight << QColor(Qt::red);
#endif
diff --git a/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
index 51ef2da..7dd17e5 100644
--- a/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -130,6 +130,7 @@ private slots:
void valueChanged();
void twoAnimations();
void deletedInUpdateCurrentTime();
+ void totalDuration();
};
tst_QPropertyAnimation::tst_QPropertyAnimation()
@@ -1199,5 +1200,18 @@ void tst_QPropertyAnimation::deletedInUpdateCurrentTime()
QCOMPARE(o.value(), 1000);
}
+void tst_QPropertyAnimation::totalDuration()
+{
+ QPropertyAnimation anim;
+ QCOMPARE(anim.totalDuration(), 250);
+ anim.setLoopCount(2);
+ QCOMPARE(anim.totalDuration(), 2*250);
+ anim.setLoopCount(-1);
+ QCOMPARE(anim.totalDuration(), -1);
+ anim.setDuration(0);
+ QCOMPARE(anim.totalDuration(), 0);
+}
+
+
QTEST_MAIN(tst_QPropertyAnimation)
#include "tst_qpropertyanimation.moc"
diff --git a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
index bdb0414..81f0ee5 100644
--- a/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
+++ b/tests/auto/qscriptengineagent/tst_qscriptengineagent.cpp
@@ -113,6 +113,7 @@ private slots:
void evaluateProgram();
void evaluateProgram_SyntaxError();
void evaluateNullProgram();
+ void hasUncaughtException();
private:
double m_testProperty;
@@ -2269,5 +2270,41 @@ void tst_QScriptEngineAgent::evaluateNullProgram()
QCOMPARE(spy->count(), 0);
}
+class NewSpy :public QScriptEngineAgent
+{
+ bool m_result;
+public:
+ NewSpy(QScriptEngine* eng) : QScriptEngineAgent(eng), m_result(false) {}
+ void functionExit (qint64, const QScriptValue &scriptValue)
+ {
+ if (engine()->hasUncaughtException()) m_result = true;
+ }
+
+ bool isPass() { return m_result; }
+ void reset() { m_result = false; }
+};
+
+void tst_QScriptEngineAgent::hasUncaughtException()
+{
+ QScriptEngine eng;
+ NewSpy* spy = new NewSpy(&eng);
+ eng.setAgent(spy);
+ QScriptValue scriptValue;
+
+ // Check unhandled exception.
+ eng.evaluate("function init () {Unknown.doSth ();}");
+ scriptValue = QScriptValue(eng.globalObject().property("init")).call();
+ QVERIFY(eng.hasUncaughtException());
+ QVERIFY2(spy->isPass(), "At least one of a functionExit event should set hasUncaughtException flag.");
+ spy->reset();
+
+ // Check catched exception.
+ eng.evaluate("function innerFoo() { throw new Error('ciao') }");
+ eng.evaluate("function foo() {try { innerFoo() } catch (e) {} }");
+ scriptValue = QScriptValue(eng.globalObject().property("foo")).call();
+ QVERIFY(!eng.hasUncaughtException());
+ QVERIFY2(spy->isPass(), "At least one of a functionExit event should set hasUncaughtException flag.");
+}
+
QTEST_MAIN(tst_QScriptEngineAgent)
#include "tst_qscriptengineagent.moc"
diff --git a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
index 320a429..44adf7e 100644
--- a/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
+++ b/tests/auto/qscriptextqobject/tst_qscriptextqobject.cpp
@@ -317,6 +317,11 @@ public:
Q_INVOKABLE QObject* myInvokableReturningMyQObjectAsQObject()
{ m_qtFunctionInvoked = 57; return this; }
+ Q_INVOKABLE QObjectList findObjects() const
+ { return findChildren<QObject *>(); }
+ Q_INVOKABLE QList<int> myInvokableNumbers() const
+ { return QList<int>() << 1 << 2 << 3; }
+
void emitMySignal()
{ emit mySignal(); }
void emitMySignalWithIntArg(int arg)
@@ -493,6 +498,7 @@ protected slots:
}
private slots:
+ void registeredTypes();
void getSetStaticProperty();
void getSetDynamicProperty();
void getSetChildren();
@@ -543,6 +549,24 @@ void tst_QScriptExtQObject::cleanup()
delete m_myObject;
}
+// this test has to be first and test that some types are automatically registered
+void tst_QScriptExtQObject::registeredTypes()
+{
+ QScriptEngine e;
+ QObject *t = new MyQObject;
+ QObject *c = new QObject(t);
+ c->setObjectName ("child1");
+
+ e.globalObject().setProperty("MyTest", e.newQObject(t));
+
+ QScriptValue v1 = e.evaluate("MyTest.findObjects()[0].objectName;");
+ QCOMPARE(v1.toString(), c->objectName());
+
+ QScriptValue v2 = e.evaluate("MyTest.myInvokableNumbers()");
+ QCOMPARE(qscriptvalue_cast<QList<int> >(v2), (QList<int>() << 1 << 2 << 3));
+}
+
+
static QScriptValue getSetProperty(QScriptContext *ctx, QScriptEngine *)
{
if (ctx->argumentCount() != 0)
diff --git a/tests/auto/qsidebar/tst_qsidebar.cpp b/tests/auto/qsidebar/tst_qsidebar.cpp
index 7b157f6..b810305 100644
--- a/tests/auto/qsidebar/tst_qsidebar.cpp
+++ b/tests/auto/qsidebar/tst_qsidebar.cpp
@@ -122,6 +122,12 @@ void tst_QSidebar::addUrls()
QSidebar qsidebar;
qsidebar.init(&fsmodel, emptyUrls);
QAbstractItemModel *model = qsidebar.model();
+#if defined(Q_OS_SYMBIAN)
+ // On Symbian, QDir::rootPath() and QDir::home() are same.
+ QDir testDir = QDir::currentPath();
+#else
+ QDir testDir = QDir::home();
+#endif
// default
QCOMPARE(model->rowCount(), 0);
@@ -146,13 +152,13 @@ void tst_QSidebar::addUrls()
// test inserting with already existing rows
QList<QUrl> moreUrls;
- moreUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
+ moreUrls << QUrl::fromLocalFile(testDir.absolutePath());
qsidebar.addUrls(moreUrls, -1);
QCOMPARE(model->rowCount(), 3);
// make sure invalid urls are still added
QList<QUrl> badUrls;
- badUrls << QUrl::fromLocalFile(QDir::home().absolutePath() + "/I used to exist");
+ badUrls << QUrl::fromLocalFile(testDir.absolutePath() + "/I used to exist");
qsidebar.addUrls(badUrls, 0);
QCOMPARE(model->rowCount(), 4);
@@ -179,30 +185,30 @@ void tst_QSidebar::addUrls()
QList<QUrl> doubleUrls;
//tow exact same paths, we have only one entry
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath());
qsidebar.setUrls(emptyUrls);
qsidebar.addUrls(doubleUrls, 1);
QCOMPARE(qsidebar.urls().size(), 1);
// Two paths that are effectively pointing to the same location
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath() + "/.");
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath() + "/.");
qsidebar.setUrls(emptyUrls);
qsidebar.addUrls(doubleUrls, 1);
QCOMPARE(qsidebar.urls().size(), 1);
#if defined(Q_OS_WIN)
//Windows is case insensitive so no duplicate entries in that case
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath().toUpper());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath().toUpper());
qsidebar.setUrls(emptyUrls);
qsidebar.addUrls(doubleUrls, 1);
QCOMPARE(qsidebar.urls().size(), 1);
#else
//Two different paths we should have two entries
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath());
- doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath().toUpper());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath());
+ doubleUrls << QUrl::fromLocalFile(testDir.absolutePath().toUpper());
qsidebar.setUrls(emptyUrls);
qsidebar.addUrls(doubleUrls, 1);
QCOMPARE(qsidebar.urls().size(), 2);
diff --git a/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp b/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp
index 832605e..6efa85b 100644
--- a/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp
+++ b/tests/auto/qsoftkeymanager/tst_qsoftkeymanager.cpp
@@ -43,9 +43,15 @@
#include "qevent.h"
#include "qdialog.h"
+#include "qpushbutton.h"
#include "qdialogbuttonbox.h"
#include "private/qsoftkeymanager_p.h"
+#ifdef Q_WS_S60
+static const int s60CommandStart = 6000;
+#endif
+
+
class tst_QSoftKeyManager : public QObject
{
Q_OBJECT
@@ -171,22 +177,52 @@ void tst_QSoftKeyManager::handleCommand()
}
/*
- This tests that softkey enable state follows the state of widget that owns the action
- to which the softkey is related to.
+ This tests that the state of a widget that owns softkey action is respected when handling the softkey
+ command.
*/
void tst_QSoftKeyManager::checkSoftkeyEnableStates()
{
- QWidget w1, w2;
- w1.setEnabled(false);
- w2.setEnabled(true);
+ QDialog w;
+ QDialogButtonBox *buttons = new QDialogButtonBox(
+ QDialogButtonBox::RestoreDefaults | QDialogButtonBox::Help,
+ Qt::Horizontal,
+ &w);
+ QPushButton *pBDefaults = buttons->button(QDialogButtonBox::RestoreDefaults);
+ QPushButton *pBHelp = buttons->button(QDialogButtonBox::Help);
+ pBHelp->setEnabled(false);
+ w.show();
+ QApplication::processEvents();
- QAction *disabledAction = QSoftKeyManager::createAction(QSoftKeyManager::OkSoftKey, &w1);
- QAction *enabledAction = QSoftKeyManager::createAction(QSoftKeyManager::OkSoftKey, &w2);
+ QSignalSpy spy0(w.actions()[0], SIGNAL(triggered())); //restore defaults action
+ QSignalSpy spy1(w.actions()[1], SIGNAL(triggered())); //disabled help action
- QVERIFY(disabledAction->isEnabled()==false);
- QVERIFY(enabledAction->isEnabled()==true);
+ //Verify that enabled button gets all the action trigger signals and
+ //disabled button gets none.
+ for (int i = 0; i < 10; i++) {
+ //simulate "Restore Defaults" softkey press
+ qApp->symbianHandleCommand(s60CommandStart);
+ //simulate "help" softkey press
+ qApp->symbianHandleCommand(s60CommandStart + 1);
+ }
+ QApplication::processEvents();
+ QCOMPARE(spy0.count(), 10);
+ QCOMPARE(spy1.count(), 0);
+ spy0.clear();
+ spy1.clear();
+
+ for (int i = 0; i < 10; i++) {
+ //simulate "Restore Defaults" softkey press
+ qApp->symbianHandleCommand(s60CommandStart);
+ //simulate "help" softkey press
+ qApp->symbianHandleCommand(s60CommandStart + 1);
+ //switch enabled button to disabled and vice versa
+ pBHelp->setEnabled(!pBHelp->isEnabled());
+ pBDefaults->setEnabled(!pBDefaults->isEnabled());
+ }
+ QApplication::processEvents();
+ QCOMPARE(spy0.count(), 5);
+ QCOMPARE(spy1.count(), 5);
}
-
QTEST_MAIN(tst_QSoftKeyManager)
#include "tst_qsoftkeymanager.moc"
diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h
index c5c3663..25b1e2f 100644
--- a/tests/auto/qsqldatabase/tst_databases.h
+++ b/tests/auto/qsqldatabase/tst_databases.h
@@ -258,6 +258,7 @@ public:
// addDb( "QTDS7", "testdb", "testuser", "Ee4Gabf6_", "bq-winserv2008" );
// addDb( "QODBC3", "DRIVER={SQL SERVER};SERVER=bq-winserv2003-x86-01.apac.nokia.com;DATABASE=testdb;PORT=1433", "testuser", "Ee4Gabf6_", "" );
// addDb( "QODBC3", "DRIVER={SQL SERVER};SERVER=bq-winserv2008-x86-01.apac.nokia.com;DATABASE=testdb;PORT=1433", "testuser", "Ee4Gabf6_", "" );
+// addDb( "QODBC", "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\\dbs\\access\\testdb.mdb", "", "", "" );
}
void open()
diff --git a/tests/auto/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/qsqldatabase/tst_qsqldatabase.cpp
index c9c8f5e..82b6066 100644
--- a/tests/auto/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/qsqldatabase/tst_qsqldatabase.cpp
@@ -304,10 +304,11 @@ void tst_QSqlDatabase::createTestTables(QSqlDatabase db)
// ### stupid workaround until we find a way to hardcode this
// in the MySQL server startup script
q.exec("set table_type=innodb");
- if (tst_Databases::isSqlServer(db)) {
+ else if (tst_Databases::isSqlServer(db)) {
QVERIFY_SQL(q, exec("SET ANSI_DEFAULTS ON"));
QVERIFY_SQL(q, exec("SET IMPLICIT_TRANSACTIONS OFF"));
- }
+ } else if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
// please never ever change this table; otherwise fix all tests ;)
if (tst_Databases::isMSAccess(db)) {
@@ -334,6 +335,12 @@ void tst_QSqlDatabase::dropTestTables(QSqlDatabase db)
{
if (!db.isValid())
return;
+
+ if(tst_Databases::isPostgreSQL(db)) {
+ QSqlQuery q(db);
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+ }
+
// drop the view first, otherwise we'll get dependency problems
tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view") << qTableName("qtest_view2"));
@@ -792,8 +799,8 @@ void tst_QSqlDatabase::checkValues(const FieldDef fieldDefs[], QSqlDatabase db)
if (val1.type() == QVariant::DateTime || val1.type() == QVariant::Time)
qDebug("Received Time: " + val1.toTime().toString("hh:mm:ss.zzz"));
QFAIL(QString(" Expected: '%1' Received: '%2' for field %3 (etype %4 rtype %5) in checkValues").arg(
- val2.toString()).arg(
- val1.toString()).arg(
+ val2.type() == QVariant::ByteArray ? val2.toByteArray().toHex() : val2.toString()).arg(
+ val1.type() == QVariant::ByteArray ? val1.toByteArray().toHex() : val1.toString()).arg(
fieldDefs[ i ].fieldName()).arg(
val2.typeName()).arg(
val1.typeName())
@@ -1019,6 +1026,10 @@ void tst_QSqlDatabase::recordPSQL()
};
QSqlQuery q(db);
+
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+
q.exec("drop sequence " + qTableName("qtestfields") + "_t_bigserial_seq");
q.exec("drop sequence " + qTableName("qtestfields") + "_t_serial_seq");
// older psql cut off the table name
@@ -1061,17 +1072,20 @@ void tst_QSqlDatabase::recordMySQL()
int revision = tst_Databases::getMySqlVersion( db ).section( QChar('.'), 2, 2 ).toInt();
int vernum = (major << 16) + (minor << 8) + revision;
-#ifdef QT3_SUPPORT
/* The below is broken in mysql below 5.0.15
see http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html
specifically: Before MySQL 5.0.15, the pad value is space. Values are right-padded
with space on insert, and trailing spaces are removed on select.
*/
if( vernum >= ((5 << 16) + 15) ) {
+#ifdef QT3_SUPPORT
bin10 = FieldDef("binary(10)", QVariant::ByteArray, QByteArray(Q3CString("123abc ")));
varbin10 = FieldDef("varbinary(10)", QVariant::ByteArray, QByteArray(Q3CString("123abcv ")));
- }
+#else
+ bin10 = FieldDef("binary(10)", QVariant::ByteArray, QString("123abc "));
+ varbin10 = FieldDef("varbinary(10)", QVariant::ByteArray, QString("123abcv "));
#endif
+ }
static QDateTime dt(QDate::currentDate(), QTime(1, 2, 3, 0));
static const FieldDef fieldDefs[] = {
@@ -1292,9 +1306,9 @@ void tst_QSqlDatabase::recordAccess()
FieldDef("varchar(20)", QVariant::String, QString("Blah1")),
FieldDef("single", QVariant::Double, 1.12345),
FieldDef("double", QVariant::Double, 1.123456),
- FieldDef("byte", QVariant::Int, 255),
+ FieldDef("byte", QVariant::UInt, 255),
#ifdef QT3_SUPPORT
- FieldDef("binary", QVariant::ByteArray, Q3CString("Blah2")),
+ FieldDef("binary(5)", QVariant::ByteArray, Q3CString("Blah2")),
#endif
FieldDef("long", QVariant::Int, 2147483647),
FieldDef("memo", QVariant::String, memo),
@@ -1494,6 +1508,11 @@ void tst_QSqlDatabase::psql_schemas()
QSKIP("server does not support schemas", SkipSingle);
QSqlQuery q(db);
+
+ if(tst_Databases::isPostgreSQL(db)) {
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+ }
+
QVERIFY_SQL(q, exec("CREATE SCHEMA " + qTableName("qtestschema")));
QString table = qTableName("qtestschema") + '.' + qTableName("qtesttable");
@@ -1529,6 +1548,9 @@ void tst_QSqlDatabase::psql_escapedIdentifiers()
QSqlQuery q(db);
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+
QString schemaName = qTableName("qtestScHeMa");
QString tableName = qTableName("qtest");
QString field1Name = QString("fIeLdNaMe");
@@ -1643,7 +1665,10 @@ void tst_QSqlDatabase::precisionPolicy()
QSKIP("Driver or database doesn't support setting precision policy", SkipSingle);
// Create a test table with some data
- QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id smallint, num numeric(18,5))").arg(tableName)));
+ if(tst_Databases::isMSAccess(db))
+ QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id smallint, num number)").arg(tableName)));
+ else
+ QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id smallint, num numeric(18,5))").arg(tableName)));
QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?)").arg(tableName)));
q.bindValue(0, 1);
q.bindValue(1, 123);
@@ -2007,6 +2032,7 @@ void tst_QSqlDatabase::odbc_bindBoolean()
QSKIP("MySql has inconsistent behaviour of bit field type across versions.", SkipSingle);
return;
}
+
QSqlQuery q(db);
QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool") + "(id int, boolvalue bit)"));
@@ -2038,6 +2064,8 @@ void tst_QSqlDatabase::odbc_testqGetString()
QSqlQuery q(db);
if (tst_Databases::isSqlServer(db))
QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(MAX))"));
+ else if(tst_Databases::isMSAccess(db))
+ QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue memo)"));
else
QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(65538))"));
@@ -2264,7 +2292,10 @@ void tst_QSqlDatabase::odbc_uintfield()
unsigned int val = 4294967295U;
QSqlQuery q(db);
- q.exec(QString("CREATE TABLE %1(num numeric(10))").arg(tableName));
+ if ( tst_Databases::isMSAccess( db ) )
+ QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(num number)").arg(tableName)));
+ else
+ QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(num numeric(10))").arg(tableName)));
q.prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName));
q.addBindValue(val);
QVERIFY_SQL(q, exec());
@@ -2440,8 +2471,8 @@ void tst_QSqlDatabase::mysql_savepointtest()
QFETCH(QString, dbName);
QSqlDatabase db = QSqlDatabase::database(dbName);
CHECK_DATABASE(db);
- if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
- QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
+ if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toDouble()<4.1 )
+ QSKIP( "Test requires MySQL >= 4.1", SkipSingle );
QSqlQuery q(db);
QVERIFY_SQL(q, exec("begin"));
diff --git a/tests/auto/qsqldriver/tst_qsqldriver.cpp b/tests/auto/qsqldriver/tst_qsqldriver.cpp
index f463c9e..5322b97 100644
--- a/tests/auto/qsqldriver/tst_qsqldriver.cpp
+++ b/tests/auto/qsqldriver/tst_qsqldriver.cpp
@@ -85,6 +85,9 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db)
{
QSqlQuery q(db);
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+
tst_Databases::safeDropTable( db, qTableName( "relTEST1" ) );
QVERIFY_SQL( q, exec("create table " + qTableName("relTEST1") +
@@ -160,7 +163,11 @@ void tst_QSqlDriver::record()
//check that we can't get records using incorrect tablename casing that's been quoted
rec = db.driver()->record(db.driver()->escapeIdentifier(tablename,QSqlDriver::TableName));
- if (tst_Databases::isMySQL(db) || db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QTDS") || tst_Databases::isSqlServer(db))
+ if (tst_Databases::isMySQL(db)
+ || db.driverName().startsWith("QSQLITE")
+ || db.driverName().startsWith("QTDS")
+ || tst_Databases::isSqlServer(db)
+ || tst_Databases::isMSAccess(db))
QCOMPARE(rec.count(), 4); //mysql, sqlite and tds will match
else
QCOMPARE(rec.count(), 0);
@@ -208,7 +215,11 @@ void tst_QSqlDriver::primaryIndex()
tablename = tablename.toUpper();
index = db.driver()->primaryIndex(db.driver()->escapeIdentifier(tablename, QSqlDriver::TableName));
- if (tst_Databases::isMySQL(db) || db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QTDS") || tst_Databases::isSqlServer(db))
+ if (tst_Databases::isMySQL(db)
+ || db.driverName().startsWith("QSQLITE")
+ || db.driverName().startsWith("QTDS")
+ || tst_Databases::isSqlServer(db)
+ || tst_Databases::isMSAccess(db))
QCOMPARE(index.count(), 1); //mysql will always find the table name regardless of casing
else
QCOMPARE(index.count(), 0);
diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp
index 5ed9cfa..8fe6f2e 100644
--- a/tests/auto/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp
@@ -194,7 +194,6 @@ private slots:
void sqlServerReturn0_data() { generic_data(); }
void sqlServerReturn0();
-
private:
// returns all database connections
void generic_data(const QString &engine=QString());
@@ -333,6 +332,8 @@ void tst_QSqlQuery::createTestTables( QSqlDatabase db )
// ### stupid workaround until we find a way to hardcode this
// in the MySQL server startup script
q.exec( "set table_type=innodb" );
+ else if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
if(tst_Databases::isPostgreSQL(db))
QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) );
@@ -395,7 +396,7 @@ void tst_QSqlQuery::char1SelectUnicode()
QSKIP("Needs someone with more Unicode knowledge than I have to fix", SkipSingle);
if ( db.driver()->hasFeature( QSqlDriver::Unicode ) ) {
- QString uniStr( QChar( 0xfb50 ) );
+ QString uniStr( QChar( 'का' ) );
QSqlQuery q( db );
if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
@@ -508,9 +509,7 @@ void tst_QSqlQuery::mysqlOutValues()
QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " () "
"BEGIN select * from " + qTableName( "qtest" ) + " order by id; END" ) );
QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + "()" ) );
- QEXPECT_FAIL("", "There's a mysql bug that means only selects think they return data when running in prepared mode", Continue);
QVERIFY_SQL( q, next() );
- QEXPECT_FAIL("", "There's a mysql bug that means only selects think they return data when running in prepared mode", Continue);
QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) );
QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) );
@@ -1631,8 +1630,7 @@ void tst_QSqlQuery::prepare_bind_exec()
{
// new scope for SQLITE
- static const unsigned short utf8arr[] = { 0xfb50,0xfb60,0xfb70,0xfb80,0xfbe0,0xfbf0,0x00 };
- static const QString utf8str = QString::fromUtf16( utf8arr );
+ static const QString utf8str = QString::fromUtf8( "काचं शक्नोम्यत्तुम् । नोपहिनस्ति माम् ॥" );
static const QString values[6] = { "Harry", "Trond", "Mark", "Ma?rk", "?", ":id" };
@@ -1645,12 +1643,15 @@ void tst_QSqlQuery::prepare_bind_exec()
QString createQuery;
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+
if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) )
- createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int primary key, name nvarchar(20) null)";
- else if ( db.driverName().startsWith( "QMYSQL" ) && useUnicode )
- createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(20) character set utf8)";
+ createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int primary key, name nvarchar(200) null)";
+ else if ( tst_Databases::isMySQL(db) && useUnicode )
+ createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200) character set utf8)";
else
- createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(20))";
+ createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200))";
QVERIFY_SQL( q, exec( createQuery ) );
diff --git a/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
index 391219b..3131f35 100644
--- a/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
+++ b/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp
@@ -158,6 +158,8 @@ void tst_QSqlQueryModel::createTestTables(QSqlDatabase db)
{
dropTestTables(db);
QSqlQuery q(db);
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
QVERIFY_SQL( q, exec("create table " + qTableName("test") + "(id integer not null, name varchar(20), title integer, primary key (id))"));
QVERIFY_SQL( q, exec("create table " + qTableName("test2") + "(id integer not null, title varchar(20), primary key (id))"));
QVERIFY_SQL( q, exec("create table " + qTableName("test3") + "(id integer not null, primary key (id))"));
diff --git a/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
index 05d546e..cb24a9f 100644
--- a/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ b/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -837,10 +837,10 @@ void tst_QSqlRelationalTableModel::insertRecordDuplicateFieldNames()
QVERIFY_SQL(model, select());
if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
- QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name")).toUpper()).toString(),
+ QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name_2")).toUpper()).toString(),
QString("Trondheim"));
} else {
- QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name"))).toString(),
+ QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name_2"))).toString(),
QString("Trondheim"));
}
@@ -859,9 +859,9 @@ void tst_QSqlRelationalTableModel::insertRecordDuplicateFieldNames()
// The duplicate field names is aliased because it's comes from the relation's display column.
if(db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2"))
- QCOMPARE(rec.fieldName(2), (qTableName("reltest4").append(QLatin1String("_name"))).toUpper());
+ QCOMPARE(rec.fieldName(2), (qTableName("reltest4").append(QLatin1String("_name_2"))).toUpper());
else
- QCOMPARE(rec.fieldName(2), qTableName("reltest4").append(QLatin1String("_name")));
+ QCOMPARE(rec.fieldName(2), qTableName("reltest4").append(QLatin1String("_name_2")));
QVERIFY(model.insertRecord(-1, rec));
QCOMPARE(model.data(model.index(2, 2)).toString(), QString("Oslo"));
diff --git a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
index 49e087f..653d944 100644
--- a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -143,6 +143,8 @@ void tst_QSqlTableModel::dropTestTables()
for (int i = 0; i < dbs.dbNames.count(); ++i) {
QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i));
QSqlQuery q(db);
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
QStringList tableNames;
tableNames << qTableName("test")
@@ -659,6 +661,9 @@ void tst_QSqlTableModel::primaryKeyOrder()
QSqlQuery q(db);
+ if(tst_Databases::isPostgreSQL(db))
+ QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
+
QVERIFY_SQL( q, exec("create table "+qTableName("foo")+"(a varchar(20), id int not null primary key, b varchar(20))"));
QSqlTableModel model(0, db);
@@ -897,6 +902,8 @@ void tst_QSqlTableModel::sqlite_attachedDatabase()
QFETCH(QString, dbName);
QSqlDatabase db = QSqlDatabase::database(dbName);
CHECK_DATABASE(db);
+ if(db.databaseName() == ":memory:")
+ QSKIP(":memory: database, skipping test", SkipSingle);
QSqlDatabase attachedDb = QSqlDatabase::cloneDatabase(db, db.driverName() + QLatin1String("attached"));
attachedDb.setDatabaseName(db.databaseName()+QLatin1String("attached.dat"));
diff --git a/tests/auto/qsqlthread/tst_qsqlthread.cpp b/tests/auto/qsqlthread/tst_qsqlthread.cpp
index c088a47..be66e9e 100644
--- a/tests/auto/qsqlthread/tst_qsqlthread.cpp
+++ b/tests/auto/qsqlthread/tst_qsqlthread.cpp
@@ -404,6 +404,8 @@ void tst_QSqlThread::readWriteThreading()
if (db.databaseName() == ":memory:")
QSKIP("does not work with in-memory databases", SkipSingle);
+ else if (tst_Databases::isMSAccess(db))
+ QSKIP("does not work with MS Access databases", SkipSingle);
SqlProducer producer(db);
SqlConsumer consumer(db);
diff --git a/tests/auto/qsslsocket/tst_qsslsocket.cpp b/tests/auto/qsslsocket/tst_qsslsocket.cpp
index 77e3763..2bd1684 100644
--- a/tests/auto/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp
@@ -170,6 +170,7 @@ private slots:
void setEmptyKey();
void spontaneousWrite();
void setReadBufferSize();
+ void setReadBufferSize_task_250027();
void waitForMinusOne();
void verifyMode();
void verifyDepth();
@@ -182,6 +183,7 @@ private slots:
void ignoreSslErrorsListWithSlot_data();
void ignoreSslErrorsListWithSlot();
void readFromClosedSocket();
+ void writeBigChunk();
static void exitLoop()
{
@@ -1240,6 +1242,66 @@ void tst_QSslSocket::setReadBufferSize()
QVERIFY(receiver->bytesAvailable() > oldBytesAvailable);
}
+class SetReadBufferSize_task_250027_handler : public QObject {
+ Q_OBJECT
+public slots:
+ void readyReadSlot() {
+ QTestEventLoop::instance().exitLoop();
+ }
+ void waitSomeMore(QSslSocket *socket) {
+ QTime t;
+ t.start();
+ while (!socket->encryptedBytesAvailable()) {
+ QCoreApplication::processEvents(QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents, 250);
+ if (t.elapsed() > 1000 || socket->state() != QAbstractSocket::ConnectedState)
+ return;
+ }
+ }
+};
+
+void tst_QSslSocket::setReadBufferSize_task_250027()
+{
+ // do not execute this when a proxy is set.
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ QSslSocketPtr socket = newSocket();
+ socket->setReadBufferSize(1000); // limit to 1 kb/sec
+ socket->ignoreSslErrors();
+ socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
+ socket->ignoreSslErrors();
+ QVERIFY(socket->waitForConnected(10*1000));
+ QVERIFY(socket->waitForEncrypted(10*1000));
+
+ // exit the event loop as soon as we receive a readyRead()
+ SetReadBufferSize_task_250027_handler setReadBufferSize_task_250027_handler;
+ connect(socket, SIGNAL(readyRead()), &setReadBufferSize_task_250027_handler, SLOT(readyReadSlot()));
+
+ // provoke a response by sending a request
+ socket->write("GET /gif/fluke.gif HTTP/1.0\n"); // this file is 27 KB
+ socket->write("Host: ");
+ socket->write(QtNetworkSettings::serverName().toLocal8Bit().constData());
+ socket->write("\n");
+ socket->write("Connection: close\n");
+ socket->write("\n");
+ socket->flush();
+
+ QTestEventLoop::instance().enterLoop(10);
+ setReadBufferSize_task_250027_handler.waitSomeMore(socket);
+ QByteArray firstRead = socket->readAll();
+ // First read should be some data, but not the whole file
+ QVERIFY(firstRead.size() > 0 && firstRead.size() < 20*1024);
+
+ QTestEventLoop::instance().enterLoop(10);
+ setReadBufferSize_task_250027_handler.waitSomeMore(socket);
+ QByteArray secondRead = socket->readAll();
+ // second read should be some more data
+ QVERIFY(secondRead.size() > 0);
+
+ socket->close();
+}
+
class SslServer3 : public QTcpServer
{
Q_OBJECT
@@ -1377,6 +1439,7 @@ void tst_QSslSocket::waitForMinusOne()
// connect to the server
QSslSocket socket;
+ QTest::qSleep(100);
socket.connectToHost("127.0.0.1", server.serverPort);
QVERIFY(socket.waitForConnected(-1));
socket.ignoreSslErrors();
@@ -1697,6 +1760,50 @@ void tst_QSslSocket::readFromClosedSocket()
QVERIFY(!socket->bytesToWrite());
}
+void tst_QSslSocket::writeBigChunk()
+{
+ if (!QSslSocket::supportsSsl())
+ return;
+
+ QSslSocketPtr socket = newSocket();
+ this->socket = socket;
+
+ connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(ignoreErrorSlot()));
+ socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
+
+ QByteArray data;
+ data.resize(1024*1024*10); // 10 MB
+ // init with garbage. needed so ssl cannot compress it in an efficient way.
+ for (int i = 0; i < data.size() / sizeof(int); i++) {
+ int r = qrand();
+ data.data()[i*sizeof(int)] = r;
+ }
+
+ QVERIFY(socket->waitForEncrypted(10000));
+ QString errorBefore = socket->errorString();
+
+ int ret = socket->write(data.constData(), data.size());
+ QVERIFY(data.size() == ret);
+
+ // spin the event loop once so QSslSocket::transmit() gets called
+ QCoreApplication::processEvents();
+ QString errorAfter = socket->errorString();
+
+ // no better way to do this right now since the error is the same as the default error.
+ if (socket->errorString().startsWith(QLatin1String("Unable to write data")))
+ {
+ qWarning() << socket->error() << socket->errorString();
+ QFAIL("Error while writing! Check if the OpenSSL BIO size is limited?!");
+ }
+ // also check the error string. If another error (than UnknownError) occured, it should be different than before
+ QVERIFY(errorBefore == errorAfter);
+
+ // check that everything has been written to OpenSSL
+ QVERIFY(socket->bytesToWrite() == 0);
+
+ socket->close();
+}
+
#endif // QT_NO_OPENSSL
QTEST_MAIN(tst_QSslSocket)
diff --git a/tests/auto/qtableview/tst_qtableview.cpp b/tests/auto/qtableview/tst_qtableview.cpp
index 55da180..d8110e1 100644
--- a/tests/auto/qtableview/tst_qtableview.cpp
+++ b/tests/auto/qtableview/tst_qtableview.cpp
@@ -100,6 +100,9 @@ private slots:
void moveCursor_data();
void moveCursor();
+ void moveCursorStrikesBack_data();
+ void moveCursorStrikesBack();
+
void hideRows_data();
void hideRows();
@@ -190,6 +193,7 @@ private slots:
void mouseWheel();
void addColumnWhileEditing();
+ void task234926_setHeaderSorting();
};
// Testing get/set functions
@@ -252,12 +256,43 @@ public:
row_count(rows),
column_count(columns),
can_fetch_more(false),
- fetch_more_count(0) {}
+ fetch_more_count(0),
+ disabled_rows(),
+ disabled_columns() {}
int rowCount(const QModelIndex& = QModelIndex()) const { return row_count; }
int columnCount(const QModelIndex& = QModelIndex()) const { return column_count; }
bool isEditable(const QModelIndex &) const { return true; }
+ Qt::ItemFlags flags(const QModelIndex &index) const
+ {
+ Qt::ItemFlags index_flags = QAbstractTableModel::flags(index);
+ if (disabled_rows.contains(index.row())
+ || disabled_columns.contains(index.column()))
+ index_flags &= ~Qt::ItemIsEnabled;
+ return index_flags;
+ }
+
+ void disableRow(int row)
+ {
+ disabled_rows.insert(row);
+ }
+
+ void enableRow(int row)
+ {
+ disabled_rows.remove(row);
+ }
+
+ void disableColumn(int column)
+ {
+ disabled_columns.insert(column);
+ }
+
+ void enableColumn(int column)
+ {
+ disabled_columns.remove(column);
+ }
+
QVariant data(const QModelIndex &idx, int role) const
{
if (!idx.isValid() || idx.row() >= row_count || idx.column() >= column_count) {
@@ -363,6 +398,8 @@ public:
int column_count;
bool can_fetch_more;
int fetch_more_count;
+ QSet<int> disabled_rows;
+ QSet<int> disabled_columns;
};
class QtTestTableView : public QTableView
@@ -834,7 +871,7 @@ void tst_QTableView::moveCursor_data()
<< 4 << 4 << -1 << 2
<< 0 << 2
<< int(QtTestTableView::MoveNext) << int(Qt::NoModifier)
- << 1 << 0 << IntPair(0,0) << IntPair(3,0);
+ << 1 << 3 << IntPair(0,0) << IntPair(3,0);
// MoveLeft
QTest::newRow("MoveLeft (0,0)")
@@ -1137,6 +1174,157 @@ void tst_QTableView::moveCursor()
QCOMPARE(newIndex.column(), expectedColumn);
}
+void tst_QTableView::moveCursorStrikesBack_data()
+{
+ QTest::addColumn<int>("hideRow");
+ QTest::addColumn<int>("hideColumn");
+ QTest::addColumn<IntList>("disableRows");
+ QTest::addColumn<IntList>("disableColumns");
+ QTest::addColumn<QRect>("span");
+
+ QTest::addColumn<int>("startRow");
+ QTest::addColumn<int>("startColumn");
+ QTest::addColumn<IntList>("cursorMoveActions");
+ QTest::addColumn<int>("expectedRow");
+ QTest::addColumn<int>("expectedColumn");
+
+ QTest::newRow("Last column disabled. Task QTBUG-3878") << -1 << -1
+ << IntList()
+ << (IntList() << 6)
+ << QRect()
+ << 0 << 5 << (IntList() << int(QtTestTableView::MoveNext))
+ << 1 << 0;
+
+ QTest::newRow("Last column disabled. Task QTBUG-3878") << -1 << -1
+ << IntList()
+ << (IntList() << 6)
+ << QRect()
+ << 1 << 0 << (IntList() << int(QtTestTableView::MovePrevious))
+ << 0 << 5;
+
+ QTest::newRow("Span, anchor column hidden") << -1 << 1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 2 << 0 << (IntList() << int(QtTestTableView::MoveNext))
+ << 2 << 2;
+
+ QTest::newRow("Span, anchor column disabled") << -1 << -1
+ << IntList()
+ << (IntList() << 1)
+ << QRect(1, 2, 2, 3)
+ << 2 << 0 << (IntList() << int(QtTestTableView::MoveNext))
+ << 2 << 2;
+
+ QTest::newRow("Span, anchor row hidden") << 2 << -1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown))
+ << 3 << 2;
+
+ QTest::newRow("Span, anchor row disabled") << -1 << -1
+ << (IntList() << 2)
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown))
+ << 3 << 2;
+
+ QTest::newRow("Move through span right") << -1 << -1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 3 << 0 << (IntList() << int(QtTestTableView::MoveRight) << int(QtTestTableView::MoveRight))
+ << 3 << 3;
+
+ QTest::newRow("Move through span left") << -1 << -1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 3 << 3 << (IntList() << int(QtTestTableView::MoveLeft) << int(QtTestTableView::MoveLeft))
+ << 3 << 0;
+
+ QTest::newRow("Move through span down") << -1 << -1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown) << int(QtTestTableView::MoveDown))
+ << 5 << 2;
+
+ QTest::newRow("Move through span up") << -1 << -1
+ << IntList()
+ << IntList()
+ << QRect(1, 2, 2, 3)
+ << 5 << 2 << (IntList() << int(QtTestTableView::MoveUp) << int(QtTestTableView::MoveUp))
+ << 1 << 2;
+
+ IntList fullList;
+ for (int i = 0; i < 7; ++i)
+ fullList << i;
+
+ QTest::newRow("All disabled, wrap forward. Timeout => FAIL") << -1 << -1
+ << fullList
+ << fullList
+ << QRect()
+ << 1 << 0 << (IntList() << int(QtTestTableView::MoveNext))
+ << 1 << 0;
+
+ QTest::newRow("All disabled, wrap backwards. Timeout => FAIL") << -1 << -1
+ << fullList
+ << fullList
+ << QRect()
+ << 1 << 0 << (IntList() << int(QtTestTableView::MovePrevious))
+ << 1 << 0;
+}
+
+void tst_QTableView::moveCursorStrikesBack()
+{
+ QFETCH(int, hideRow);
+ QFETCH(int, hideColumn);
+ QFETCH(IntList, disableRows);
+ QFETCH(IntList, disableColumns);
+ QFETCH(QRect, span);
+
+ QFETCH(int, startRow);
+ QFETCH(int, startColumn);
+ QFETCH(IntList, cursorMoveActions);
+ QFETCH(int, expectedRow);
+ QFETCH(int, expectedColumn);
+
+ QtTestTableModel model(7, 7);
+ QtTestTableView view;
+ view.setModel(&model);
+ view.hideRow(hideRow);
+ view.hideColumn(hideColumn);
+
+ if (span.height() && span.width())
+ view.setSpan(span.top(), span.left(), span.height(), span.width());
+ view.show();
+
+ QModelIndex index = model.index(startRow, startColumn);
+ view.setCurrentIndex(index);
+
+ foreach (int row, disableRows)
+ model.disableRow(row);
+ foreach (int column, disableColumns)
+ model.disableColumn(column);
+
+ int newRow = -1;
+ int newColumn = -1;
+ foreach (int cursorMoveAction, cursorMoveActions) {
+ QModelIndex newIndex = view.moveCursor((QtTestTableView::CursorAction)cursorMoveAction, 0);
+ view.setCurrentIndex(newIndex);
+ newRow = newIndex.row();
+ newColumn = newIndex.column();
+ }
+
+ // expected fails, task 119433
+ if(newRow == -1)
+ return;
+ QCOMPARE(newRow, expectedRow);
+ QCOMPARE(newColumn, expectedColumn);
+}
+
void tst_QTableView::hideRows_data()
{
QTest::addColumn<int>("rowCount");
@@ -2540,6 +2728,7 @@ void tst_QTableView::indexAt()
QtTestTableView view;
view.show();
+ QTest::qWaitForWindowShown(&view);
//some styles change the scroll mode in their polish
view.setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
@@ -2555,9 +2744,10 @@ void tst_QTableView::indexAt()
for (int c = 0; c < columnCount; ++c)
view.setColumnWidth(c, columnWidth);
- QTest::qWait(0); // ### needed to pass the test
+ QTest::qWait(20);
view.horizontalScrollBar()->setValue(horizontalScroll);
view.verticalScrollBar()->setValue(verticalScroll);
+ QTest::qWait(20);
QModelIndex index = view.indexAt(QPoint(x, y));
QCOMPARE(index.row(), expectedRow);
@@ -3087,9 +3277,15 @@ void tst_QTableView::resizeToContents()
}
+QT_BEGIN_NAMESPACE
+extern bool Q_GUI_EXPORT qt_tab_all_widgets; // qapplication.cpp
+QT_END_NAMESPACE
void tst_QTableView::tabFocus()
{
+ if (!qt_tab_all_widgets)
+ QSKIP("This test requires full keyboard control to be enabled.", SkipAll);
+
// QTableView enables tabKeyNavigation by default, but you should be able
// to change focus on an empty table view, or on a table view that doesn't
// have this property set.
@@ -3612,5 +3808,41 @@ void tst_QTableView::task191545_dragSelectRows()
}
}
+void tst_QTableView::task234926_setHeaderSorting()
+{
+ QStringListModel model;
+ QStringList data;
+ data << "orange" << "apple" << "banana" << "lemon" << "pumpkin";
+ QStringList sortedDataA = data;
+ QStringList sortedDataD = data;
+ qSort(sortedDataA);
+ qSort(sortedDataD.begin(), sortedDataD.end(), qGreater<QString>());
+ model.setStringList(data);
+ QTableView view;
+ view.setModel(&model);
+// view.show();
+ QTest::qWait(20);
+ QCOMPARE(model.stringList(), data);
+ view.setSortingEnabled(true);
+ view.sortByColumn(0, Qt::AscendingOrder);
+ QApplication::processEvents();
+ QCOMPARE(model.stringList() , sortedDataA);
+
+ view.horizontalHeader()->setSortIndicator(0, Qt::DescendingOrder);
+ QApplication::processEvents();
+ QCOMPARE(model.stringList() , sortedDataD);
+
+ QHeaderView *h = new QHeaderView(Qt::Horizontal);
+ h->setModel(&model);
+ view.setHorizontalHeader(h);
+ h->setSortIndicator(0, Qt::AscendingOrder);
+ QApplication::processEvents();
+ QCOMPARE(model.stringList() , sortedDataA);
+
+ h->setSortIndicator(0, Qt::DescendingOrder);
+ QApplication::processEvents();
+ QCOMPARE(model.stringList() , sortedDataD);
+}
+
QTEST_MAIN(tst_QTableView)
#include "tst_qtableview.moc"
diff --git a/tests/auto/qtablewidget/tst_qtablewidget.cpp b/tests/auto/qtablewidget/tst_qtablewidget.cpp
index 5aa2d1d..b85851f 100644
--- a/tests/auto/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/qtablewidget/tst_qtablewidget.cpp
@@ -102,6 +102,7 @@ private slots:
void cellWidget();
void task231094();
void task219380_removeLastRow();
+ void task262056_sortDuplicate();
private:
QTableWidget *testWidget;
@@ -1474,6 +1475,26 @@ void tst_QTableWidget::task219380_removeLastRow()
QCOMPARE(testWidget->cellWidget(18, 0)->geometry(), testWidget->visualItemRect(&item));
}
+void tst_QTableWidget::task262056_sortDuplicate()
+{
+ testWidget->setColumnCount(2);
+ testWidget->setRowCount(8);
+ testWidget->setSortingEnabled(true);
+ QStringList items = (QStringList() << "AAA" << "BBB" << "CCC" << "CCC" << "DDD"\
+ << "EEE" << "FFF" << "GGG");
+ for (int i = 0; i<8; i++ ) {
+ QTableWidgetItem *twi = new QTableWidgetItem(items.at(i));
+ testWidget->setItem(i,0,twi);
+ testWidget->setItem(i,1,new QTableWidgetItem(QString("item %1").arg(i)));
+ }
+ testWidget->sortItems(0, Qt::AscendingOrder);
+ QSignalSpy layoutChangedSpy(testWidget->model(), SIGNAL(layoutChanged()));
+ testWidget->item(3,0)->setBackgroundColor(Qt::red);
+
+ QCOMPARE(layoutChangedSpy.count(),0);
+
+}
+
QTEST_MAIN(tst_QTableWidget)
#include "tst_qtablewidget.moc"
diff --git a/tests/auto/qtabwidget/tst_qtabwidget.cpp b/tests/auto/qtabwidget/tst_qtabwidget.cpp
index 27c19df..1387a92 100644
--- a/tests/auto/qtabwidget/tst_qtabwidget.cpp
+++ b/tests/auto/qtabwidget/tst_qtabwidget.cpp
@@ -590,9 +590,11 @@ void tst_QTabWidget::paintEventCount()
QTest::qWait(1000);
- // Mac and Windows get multiple repaints on the first show, so use those as a starting point.
+ // Mac, Windows and Windows CE get multiple repaints on the first show, so use those as a starting point.
static const int MaxInitialPaintCount =
-#if defined(Q_WS_WIN)
+#if defined(Q_OS_WINCE)
+ 4;
+#elif defined(Q_WS_WIN)
2;
#elif defined(Q_WS_MAC)
5;
diff --git a/tests/auto/qtreeview/tst_qtreeview.cpp b/tests/auto/qtreeview/tst_qtreeview.cpp
index 91b2cc5..da58725 100644
--- a/tests/auto/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/qtreeview/tst_qtreeview.cpp
@@ -172,6 +172,7 @@ private slots:
void expandAndCollapse_data();
void expandAndCollapse();
void expandAndCollapseAll();
+ void expandWithNoChildren();
void keyboardNavigation();
void headerSections();
void moveCursor_data();
@@ -1548,6 +1549,19 @@ void tst_QTreeView::expandAndCollapseAll()
// QCOMPARE(collapsedSpy.count(), count);
}
+void tst_QTreeView::expandWithNoChildren()
+{
+ QTreeView tree;
+ QStandardItemModel model(1,1);
+ tree.setModel(&model);
+ tree.setAnimated(true);
+ tree.doItemsLayout();
+ //this test should not output warnings
+ tree.expand(model.index(0,0));
+}
+
+
+
void tst_QTreeView::keyboardNavigation()
{
const int rows = 10;
diff --git a/tests/auto/qtreewidget/tst_qtreewidget.cpp b/tests/auto/qtreewidget/tst_qtreewidget.cpp
index 11c4543..6defd7b 100644
--- a/tests/auto/qtreewidget/tst_qtreewidget.cpp
+++ b/tests/auto/qtreewidget/tst_qtreewidget.cpp
@@ -49,6 +49,9 @@
#include <qheaderview.h>
#include <qlineedit.h>
#include <QScrollBar>
+#include <QStyledItemDelegate>
+
+#include "../../shared/util.h"
//TESTED_CLASS=
@@ -163,6 +166,7 @@ private slots:
void task217309();
void setCurrentItemExpandsParent();
void task239150_editorWidth();
+ void setTextUpdate();
public slots:
void itemSelectionChanged();
@@ -3233,6 +3237,41 @@ void tst_QTreeWidget::task239150_editorWidth()
+void tst_QTreeWidget::setTextUpdate()
+{
+ QTreeWidget treeWidget;
+ treeWidget.setColumnCount(2);
+
+ class MyItemDelegate : public QStyledItemDelegate
+ {
+ public:
+ MyItemDelegate() : numPaints(0) { }
+ void paint(QPainter *painter,
+ const QStyleOptionViewItem &option, const QModelIndex &index) const
+ {
+ numPaints++;
+ QStyledItemDelegate::paint(painter, option, index);
+ }
+
+ mutable int numPaints;
+ } delegate;
+
+ treeWidget.setItemDelegate(&delegate);
+ treeWidget.show();
+ QStringList strList;
+ strList << "variable1" << "0";
+ QTreeWidgetItem *item = new QTreeWidgetItem(strList);
+ treeWidget.insertTopLevelItem(0, item);
+ QTest::qWait(50);
+ QTRY_VERIFY(delegate.numPaints > 0);
+ delegate.numPaints = 0;
+
+ item->setText(1, "42");
+ QApplication::processEvents();
+ QTRY_VERIFY(delegate.numPaints > 0);
+}
+
+
QTEST_MAIN(tst_QTreeWidget)
#include "tst_qtreewidget.moc"
diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp
index 026c30e..72c13bf 100644
--- a/tests/auto/qurl/tst_qurl.cpp
+++ b/tests/auto/qurl/tst_qurl.cpp
@@ -137,6 +137,7 @@ private slots:
void ipv6();
void ipv6_2_data();
void ipv6_2();
+ void moreIpv6();
void toPercentEncoding_data();
void toPercentEncoding();
void isRelative_data();
@@ -2276,6 +2277,13 @@ void tst_QUrl::ipv6_2()
QCOMPARE(url.toString(), output);
}
+void tst_QUrl::moreIpv6()
+{
+ QUrl waba1("http://www.kde.org/cgi/test.cgi");
+ waba1.setHost("::ffff:129.144.52.38");
+ QCOMPARE(QString::fromLatin1(waba1.toEncoded()), QString::fromLatin1("http://[::ffff:129.144.52.38]/cgi/test.cgi"));
+}
+
void tst_QUrl::punycode_data()
{
QTest::addColumn<QString>("original");
diff --git a/tests/auto/quuid/tst_quuid.cpp b/tests/auto/quuid/tst_quuid.cpp
index e262be7..d78fda5 100644
--- a/tests/auto/quuid/tst_quuid.cpp
+++ b/tests/auto/quuid/tst_quuid.cpp
@@ -72,6 +72,8 @@ private slots:
void variants();
void versions();
+ void threadUniqueness();
+
public:
// Variables
QUuid uuidA;
@@ -169,6 +171,30 @@ void tst_QUuid::versions()
QVERIFY( NCS.version() == QUuid::VerUnknown );
}
+class UuidThread : public QThread
+{
+public:
+ QUuid uuid;
+
+ void run()
+ {
+ uuid = QUuid::createUuid();
+ }
+};
+
+void tst_QUuid::threadUniqueness()
+{
+ QVector<UuidThread *> threads(qMax(2, QThread::idealThreadCount()));
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i] = new UuidThread;
+ for (int i = 0; i < threads.count(); ++i)
+ threads[i]->start();
+ for (int i = 0; i < threads.count(); ++i)
+ QVERIFY(threads[i]->wait(1000));
+ for (int i = 1; i < threads.count(); ++i)
+ QVERIFY(threads[0]->uuid != threads[i]->uuid);
+ qDeleteAll(threads);
+}
QTEST_MAIN(tst_QUuid)
#include "tst_quuid.moc"
diff --git a/tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp b/tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp
index bc6fe68..9623e80 100644
--- a/tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp
+++ b/tests/auto/qvideosurfaceformat/tst_qvideosurfaceformat.cpp
@@ -120,7 +120,7 @@ void tst_QVideoSurfaceFormat::constructNull()
QCOMPARE(format.frameHeight(), -1);
QCOMPARE(format.viewport(), QRect());
QCOMPARE(format.scanLineDirection(), QVideoSurfaceFormat::TopToBottom);
- QCOMPARE(format.frameRate(), QVideoSurfaceFormat::FrameRate());
+ QCOMPARE(format.frameRate(), 0.0);
QCOMPARE(format.pixelAspectRatio(), QSize(1, 1));
QCOMPARE(format.yuvColorSpace(), QVideoSurfaceFormat::YCbCr_Undefined);
}
@@ -159,7 +159,7 @@ void tst_QVideoSurfaceFormat::construct()
QCOMPARE(format.frameHeight(), frameSize.height());
QCOMPARE(format.viewport(), viewport);
QCOMPARE(format.scanLineDirection(), QVideoSurfaceFormat::TopToBottom);
- QCOMPARE(format.frameRate(), QVideoSurfaceFormat::FrameRate());
+ QCOMPARE(format.frameRate(), 0.0);
QCOMPARE(format.pixelAspectRatio(), QSize(1, 1));
QCOMPARE(format.yuvColorSpace(), QVideoSurfaceFormat::YCbCr_Undefined);
}
@@ -315,21 +315,21 @@ void tst_QVideoSurfaceFormat::scanLineDirection()
void tst_QVideoSurfaceFormat::frameRate_data()
{
- QTest::addColumn<QVideoSurfaceFormat::FrameRate>("frameRate");
+ QTest::addColumn<qreal>("frameRate");
QTest::newRow("null")
- << QVideoSurfaceFormat::FrameRate(0, 0);
+ << 0.0;
QTest::newRow("1/1")
- << QVideoSurfaceFormat::FrameRate(1, 1);
+ << 1.0;
QTest::newRow("24/1")
- << QVideoSurfaceFormat::FrameRate(24, 1);
+ << 24.0;
QTest::newRow("15/2")
- << QVideoSurfaceFormat::FrameRate(15, 2);
+ << 7.5;
}
void tst_QVideoSurfaceFormat::frameRate()
{
- QFETCH(QVideoSurfaceFormat::FrameRate, frameRate);
+ QFETCH(qreal, frameRate);
{
QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32);
@@ -337,29 +337,16 @@ void tst_QVideoSurfaceFormat::frameRate()
format.setFrameRate(frameRate);
QCOMPARE(format.frameRate(), frameRate);
- QCOMPARE(qvariant_cast<QVideoSurfaceFormat::FrameRate>(format.property("frameRate")),
- frameRate);
- }
- {
- QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32);
-
- format.setFrameRate(frameRate.first, frameRate.second);
-
- QCOMPARE(format.frameRate(), frameRate);
- QCOMPARE(
- qvariant_cast<QVideoSurfaceFormat::FrameRate>(format.property("frameRate")),
- frameRate);
+ QCOMPARE(qvariant_cast<qreal>(format.property("frameRate")), frameRate);
}
{
QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32);
format.setFrameRate(frameRate);
- format.setProperty(
- "frameRate", qVariantFromValue<QVideoSurfaceFormat::FrameRate>(frameRate));
+ format.setProperty("frameRate", frameRate);
QCOMPARE(format.frameRate(), frameRate);
- QCOMPARE(qvariant_cast<QVideoSurfaceFormat::FrameRate>(format.property("frameRate")),
- frameRate);
+ QCOMPARE(qvariant_cast<qreal>(format.property("frameRate")), frameRate);
}
}
@@ -609,13 +596,13 @@ void tst_QVideoSurfaceFormat::compare()
QCOMPARE(format1 == format2, true);
QCOMPARE(format1 != format2, false);
- format1.setFrameRate(QVideoSurfaceFormat::FrameRate(15, 2));
+ format1.setFrameRate(7.5);
// Not equal frame rate differs.
QCOMPARE(format1 == format2, false);
QCOMPARE(format1 != format2, true);
- format2.setFrameRate(15, 2);
+ format2.setFrameRate(7.50001);
// Equal.
QCOMPARE(format1 == format2, true);
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp
index f8341c3..050d1c5 100644
--- a/tests/auto/qwidget/tst_qwidget.cpp
+++ b/tests/auto/qwidget/tst_qwidget.cpp
@@ -69,6 +69,9 @@
#include <QtGui/qpaintengine.h>
#include <private/qbackingstore_p.h>
+#include <QtGui/QGraphicsView>
+#include <QtGui/QGraphicsProxyWidget>
+
#include "../../shared/util.h"
@@ -239,7 +242,12 @@ private slots:
void setFixedSize();
void ensureCreated();
+ void winIdChangeEvent();
+#ifdef Q_OS_SYMBIAN
+ void reparentCausesChildWinIdChange();
+#else
void persistentWinId();
+#endif
void qobject_castInDestroyedSlot();
void showHideEvent_data();
@@ -285,6 +293,7 @@ private slots:
#ifdef Q_WS_X11
void minAndMaxSizeWithX11BypassWindowManagerHint();
void showHideShow();
+ void clean_qt_x11_enforce_cursor();
#endif
void compatibilityChildInsertedEvents();
@@ -4348,6 +4357,161 @@ void tst_QWidget::ensureCreated()
}
}
+class WinIdChangeWidget : public QWidget {
+public:
+ WinIdChangeWidget(QWidget *p = 0)
+ : QWidget(p)
+ , m_winIdChangeEventCount(0)
+ {
+
+ }
+protected:
+ bool event(QEvent *e)
+ {
+ if (e->type() == QEvent::WinIdChange) {
+ ++m_winIdChangeEventCount;
+ return true;
+ }
+ return QWidget::event(e);
+ }
+public:
+ int m_winIdChangeEventCount;
+};
+
+void tst_QWidget::winIdChangeEvent()
+{
+ {
+ // Transforming an alien widget into a native widget
+ WinIdChangeWidget widget;
+ const WId winIdBefore = widget.internalWinId();
+ const WId winIdAfter = widget.winId();
+ QVERIFY(winIdBefore != winIdAfter);
+ QCOMPARE(widget.m_winIdChangeEventCount, 1);
+ }
+
+ {
+ // Changing parent of a native widget
+ // Should cause winId of child to change, on all platforms
+ QWidget parent1, parent2;
+ WinIdChangeWidget child(&parent1);
+ const WId winIdBefore = child.winId();
+ QCOMPARE(child.m_winIdChangeEventCount, 1);
+ child.setParent(&parent2);
+ const WId winIdAfter = child.internalWinId();
+ QVERIFY(winIdBefore != winIdAfter);
+ QCOMPARE(child.m_winIdChangeEventCount, 2);
+ }
+
+ {
+ // Changing grandparent of a native widget
+ // Should cause winId of grandchild to change only on Symbian
+ QWidget grandparent1, grandparent2;
+ QWidget parent(&grandparent1);
+ WinIdChangeWidget child(&parent);
+ const WId winIdBefore = child.winId();
+ QCOMPARE(child.m_winIdChangeEventCount, 1);
+ parent.setParent(&grandparent2);
+ const WId winIdAfter = child.internalWinId();
+#ifdef Q_OS_SYMBIAN
+ QVERIFY(winIdBefore != winIdAfter);
+ QCOMPARE(child.m_winIdChangeEventCount, 2);
+#else
+ QCOMPARE(winIdBefore, winIdAfter);
+ QCOMPARE(child.m_winIdChangeEventCount, 1);
+#endif
+ }
+
+ {
+ // Changing parent of an alien widget
+ QWidget parent1, parent2;
+ WinIdChangeWidget child(&parent1);
+ const WId winIdBefore = child.internalWinId();
+ child.setParent(&parent2);
+ const WId winIdAfter = child.internalWinId();
+ QCOMPARE(winIdBefore, winIdAfter);
+ QCOMPARE(child.m_winIdChangeEventCount, 0);
+ }
+
+ {
+ // Making native child widget into a top-level window
+ QWidget parent;
+ WinIdChangeWidget child(&parent);
+ child.winId();
+ const WId winIdBefore = child.internalWinId();
+ QCOMPARE(child.m_winIdChangeEventCount, 1);
+ const Qt::WindowFlags flags = child.windowFlags();
+ child.setWindowFlags(flags | Qt::Window);
+ const WId winIdAfter = child.internalWinId();
+ QVERIFY(winIdBefore != winIdAfter);
+ QCOMPARE(child.m_winIdChangeEventCount, 2);
+ }
+}
+
+#ifdef Q_OS_SYMBIAN
+void tst_QWidget::reparentCausesChildWinIdChange()
+{
+ QWidget *parent = new QWidget;
+ QWidget *w1 = new QWidget;
+ QWidget *w2 = new QWidget;
+ QWidget *w3 = new QWidget;
+ w1->setParent(parent);
+ w2->setParent(w1);
+ w3->setParent(w2);
+
+ WId winId1 = w1->winId();
+ WId winId2 = w2->winId();
+ WId winId3 = w3->winId();
+
+ // reparenting causes winIds of the widget being reparented, and all of its children, to change
+ w1->setParent(0);
+ QVERIFY(w1->winId() != winId1);
+ winId1 = w1->winId();
+ QVERIFY(w2->winId() != winId2);
+ winId2 = w2->winId();
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w1->setParent(parent);
+ QVERIFY(w1->winId() != winId1);
+ winId1 = w1->winId();
+ QVERIFY(w2->winId() != winId2);
+ winId2 = w2->winId();
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w2->setParent(0);
+ QVERIFY(w2->winId() != winId2);
+ winId2 = w2->winId();
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w2->setParent(parent);
+ QVERIFY(w2->winId() != winId2);
+ winId2 = w2->winId();
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w2->setParent(w1);
+ QVERIFY(w2->winId() != winId2);
+ winId2 = w2->winId();
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w3->setParent(0);
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w3->setParent(w1);
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ w3->setParent(w2);
+ QVERIFY(w3->winId() != winId3);
+ winId3 = w3->winId();
+
+ delete parent;
+}
+#else
void tst_QWidget::persistentWinId()
{
QWidget *parent = new QWidget;
@@ -4404,6 +4568,7 @@ void tst_QWidget::persistentWinId()
delete parent;
}
+#endif // Q_OS_SYMBIAN
class ShowHideEventWidget : public QWidget
{
@@ -4524,9 +4689,6 @@ void tst_QWidget::update()
QCOMPARE(child.paintedRegion, child.visibleRegion());
QCOMPARE(w.numPaintEvents, 1);
QCOMPARE(w.visibleRegion(), QRegion(w.rect()));
-#ifdef QT_MAC_USE_COCOA
- QEXPECT_FAIL(0, "Cocoa compositor paints the content view", Continue);
-#endif
QCOMPARE(w.paintedRegion, child.visibleRegion().translated(childOffset));
w.reset();
@@ -5136,15 +5298,6 @@ void tst_QWidget::windowMoveResize()
// now hide
widget.hide();
QTest::qWait(10);
-#if defined (Q_WS_MAC) && defined(QT_MAC_USE_COCOA)
- QEXPECT_FAIL("130,100 0x200, flags 800",
- "Cocoa's Delegate sends a spurios move event when the window has a width of zero and non-zero height",
- Abort);
-
- QEXPECT_FAIL("130,100 0x200, flags 0",
- "Cocoa's Delegate sends a spurios move event when the window has a width of zero and non-zero height",
- Abort);
-#endif
QTRY_COMPARE(widget.pos(), rect.topLeft());
QTRY_COMPARE(widget.size(), rect.size());
@@ -6060,6 +6213,35 @@ void tst_QWidget::showHideShow()
QVERIFY(w.gotExpectedMapNotify);
}
+
+void tst_QWidget::clean_qt_x11_enforce_cursor()
+{
+ {
+ QWidget window;
+ QWidget *w = new QWidget(&window);
+ QWidget *child = new QWidget(w);
+ child->setAttribute(Qt::WA_SetCursor, true);
+
+ window.show();
+ QApplication::setActiveWindow(&window);
+ QTest::qWaitForWindowShown(&window);
+ QTest::qWait(100);
+ QCursor::setPos(window.geometry().center());
+ QTest::qWait(100);
+
+ child->setFocus();
+ QApplication::processEvents();
+ QTest::qWait(100);
+
+ delete w;
+ }
+
+ QGraphicsScene scene;
+ QLineEdit *edit = new QLineEdit;
+ scene.addWidget(edit);
+
+ // If the test didn't crash, then it passed.
+}
#endif
class EventRecorder : public QObject
@@ -7466,16 +7648,16 @@ void tst_QWidget::updateWhileMinimized()
UpdateWidget widget;
// Filter out activation change and focus events to avoid update() calls in QWidget.
widget.updateOnActivationChangeAndFocusIn = false;
- widget.show();
widget.reset();
+ widget.show();
QTest::qWaitForWindowShown(&widget);
QApplication::processEvents();
QTRY_VERIFY(widget.numPaintEvents > 0);
- QTest::qWait(50);
+ QTest::qWait(150);
// Minimize window.
widget.showMinimized();
- QTest::qWait(70);
+ QTest::qWait(110);
widget.reset();
@@ -8176,7 +8358,7 @@ public:
static bool firstTime = true;
if (firstTime)
- QTimer::singleShot(150, this, SLOT(resizeMe()));
+ QTimer::singleShot(250, this, SLOT(resizeMe()));
firstTime = false;
}
@@ -8193,7 +8375,7 @@ void tst_QWidget::moveInResizeEvent()
testWidget.setGeometry(50, 50, 200, 200);
testWidget.show();
QTest::qWaitForWindowShown(&testWidget);
- QTest::qWait(160);
+ QTest::qWait(300);
QRect expectedGeometry(100,100, 100, 100);
QTRY_COMPARE(testWidget.geometry(), expectedGeometry);
@@ -9267,7 +9449,8 @@ void tst_QWidget::rectOutsideCoordinatesLimit_task144779()
QPixmap correct(main.size());
correct.fill(Qt::green);
- QTRY_COMPARE(QPixmap::grabWindow(main.winId()).toImage(), correct.toImage());
+ QTRY_COMPARE(QPixmap::grabWindow(main.winId()).toImage().convertToFormat(QImage::Format_RGB32),
+ correct.toImage().convertToFormat(QImage::Format_RGB32));
QApplication::restoreOverrideCursor();
}
diff --git a/tests/auto/qwidgetaction/tst_qwidgetaction.cpp b/tests/auto/qwidgetaction/tst_qwidgetaction.cpp
index 586a707..50b3337 100644
--- a/tests/auto/qwidgetaction/tst_qwidgetaction.cpp
+++ b/tests/auto/qwidgetaction/tst_qwidgetaction.cpp
@@ -125,6 +125,7 @@ void tst_QWidgetAction::defaultWidget()
tb1.addAction(action);
QVERIFY(combo->parent() == &tb1);
qApp->processEvents();
+ qApp->processEvents();
QVERIFY(combo->isVisible());
// not supported, not supposed to work, hence the parent() check
@@ -139,6 +140,7 @@ void tst_QWidgetAction::defaultWidget()
tb2.addAction(action);
qApp->processEvents(); //the call to hide is delayd by the toolbar layout
+ qApp->processEvents();
QVERIFY(combo->parent() == &tb2);
QVERIFY(combo->isVisible());
diff --git a/tests/benchmarks/benchmarks.pro b/tests/benchmarks/benchmarks.pro
index ad1920b..a63fb41 100644
--- a/tests/benchmarks/benchmarks.pro
+++ b/tests/benchmarks/benchmarks.pro
@@ -9,8 +9,8 @@ SUBDIRS = containers-associative \
qiodevice \
qpixmap \
blendbench \
- qstring \
- qstringlist \
+ qstring \
+ qstringlist \
qmatrix4x4 \
qnetworkreply \
qobject \
diff --git a/tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp b/tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
index 000ab6e..81064d7 100644
--- a/tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
+++ b/tests/benchmarks/qgraphicsanchorlayout/tst_qgraphicsanchorlayout.cpp
@@ -41,6 +41,7 @@
#include <QtTest/QtTest>
#include <QtGui/qgraphicsanchorlayout.h>
+#include <QtGui/qgraphicslinearlayout.h>
#include <QtGui/qgraphicswidget.h>
#include <QtGui/qgraphicsview.h>
@@ -54,6 +55,12 @@ public:
private slots:
void s60_hard_complex_data();
void s60_hard_complex();
+ void linearVsAnchorSizeHints_data();
+ void linearVsAnchorSizeHints();
+ void linearVsAnchorSetGeometry_data();
+ void linearVsAnchorSetGeometry();
+ void linearVsAnchorNested_data();
+ void linearVsAnchorNested();
};
@@ -192,6 +199,235 @@ void tst_QGraphicsAnchorLayout::s60_hard_complex()
}
}
+static QGraphicsLayout* createLayouts(int whichLayout)
+{
+ QSizeF min(0, 10);
+ QSizeF pref(50, 10);
+ QSizeF max(100, 10);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+
+ QGraphicsLayout *l;
+ if (whichLayout == 0) {
+ l = new QGraphicsLinearLayout;
+ QGraphicsLinearLayout *linear = static_cast<QGraphicsLinearLayout *>(l);
+ linear->setContentsMargins(0, 0, 0, 0);
+
+ linear->addItem(a);
+ linear->addItem(b);
+ linear->addItem(c);
+ linear->addItem(d);
+ } else {
+ l = new QGraphicsAnchorLayout;
+ QGraphicsAnchorLayout *anchor = static_cast<QGraphicsAnchorLayout *>(l);
+ anchor->setContentsMargins(0, 0, 0, 0);
+
+ // Horizontal
+ setAnchor(anchor, anchor, Qt::AnchorLeft, a, Qt::AnchorLeft, 0);
+ setAnchor(anchor, a, Qt::AnchorRight, b, Qt::AnchorLeft, 0);
+ setAnchor(anchor, b, Qt::AnchorRight, c, Qt::AnchorLeft, 0);
+ setAnchor(anchor, c, Qt::AnchorRight, d, Qt::AnchorLeft, 0);
+ setAnchor(anchor, d, Qt::AnchorRight, anchor, Qt::AnchorRight, 0);
+
+ // Vertical
+ anchor->addAnchors(anchor, a, Qt::Vertical);
+ anchor->addAnchors(anchor, b, Qt::Vertical);
+ anchor->addAnchors(anchor, c, Qt::Vertical);
+ anchor->addAnchors(anchor, d, Qt::Vertical);
+ }
+
+ return l;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSizeHints_data()
+{
+ QTest::addColumn<int>("whichLayout");
+ QTest::addColumn<int>("whichSizeHint");
+
+ QTest::newRow("QGraphicsLinearLayout::minimum")
+ << 0 << int(Qt::MinimumSize);
+ QTest::newRow("QGraphicsLinearLayout::preferred")
+ << 0 << int(Qt::PreferredSize);
+ QTest::newRow("QGraphicsLinearLayout::maximum")
+ << 0 << int(Qt::MaximumSize);
+ QTest::newRow("QGraphicsLinearLayout::noSizeHint")
+ << 0 << -1;
+
+ QTest::newRow("QGraphicsAnchorLayout::minimum")
+ << 1 << int(Qt::MinimumSize);
+ QTest::newRow("QGraphicsAnchorLayout::preferred")
+ << 1 << int(Qt::PreferredSize);
+ QTest::newRow("QGraphicsAnchorLayout::maximum")
+ << 1 << int(Qt::MaximumSize);
+ QTest::newRow("QGraphicsAnchorLayout::noSizeHint")
+ << 1 << -1;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSizeHints()
+{
+ QFETCH(int, whichSizeHint);
+ QFETCH(int, whichLayout);
+
+ QGraphicsLayout *l = createLayouts(whichLayout);
+
+ QSizeF sizeHint;
+ // warm up instruction cache
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ // ...then measure...
+
+ QBENCHMARK {
+ l->invalidate();
+ sizeHint = l->effectiveSizeHint((Qt::SizeHint)whichSizeHint);
+ }
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSetGeometry_data()
+{
+ QTest::addColumn<int>("whichLayout");
+
+ QTest::newRow("QGraphicsLinearLayout")
+ << 0;
+ QTest::newRow("QGraphicsAnchorLayout")
+ << 1;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorSetGeometry()
+{
+ QFETCH(int, whichLayout);
+
+ QGraphicsLayout *l = createLayouts(whichLayout);
+
+ QRectF sizeHint;
+ qreal maxWidth;
+ qreal increment;
+ // warm up instruction cache
+ l->invalidate();
+ sizeHint.setSize(l->effectiveSizeHint(Qt::MinimumSize));
+ maxWidth = l->effectiveSizeHint(Qt::MaximumSize).width();
+ increment = (maxWidth - sizeHint.width()) / 100;
+ l->setGeometry(sizeHint);
+ // ...then measure...
+
+ QBENCHMARK {
+ l->invalidate();
+ for (qreal width = sizeHint.width(); width <= maxWidth; width += increment) {
+ sizeHint.setWidth(width);
+ l->setGeometry(sizeHint);
+ }
+ }
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorNested_data()
+{
+ QTest::addColumn<int>("whichLayout");
+ QTest::newRow("LinearLayout")
+ << 0;
+ QTest::newRow("AnchorLayout setup with null-anchors knot")
+ << 1;
+ QTest::newRow("AnchorLayout setup easy to simplificate")
+ << 2;
+}
+
+void tst_QGraphicsAnchorLayout::linearVsAnchorNested()
+{
+ QFETCH(int, whichLayout);
+
+ QSizeF min(10, 10);
+ QSizeF pref(80, 80);
+ QSizeF max(150, 150);
+
+ QGraphicsWidget *a = createItem(min, pref, max, "a");
+ QGraphicsWidget *b = createItem(min, pref, max, "b");
+ QGraphicsWidget *c = createItem(min, pref, max, "c");
+ QGraphicsWidget *d = createItem(min, pref, max, "d");
+
+ QGraphicsLayout *layout;
+
+ if (whichLayout == 0) {
+ QGraphicsLinearLayout *linear1 = new QGraphicsLinearLayout;
+ QGraphicsLinearLayout *linear2 = new QGraphicsLinearLayout(Qt::Vertical);
+ QGraphicsLinearLayout *linear3 = new QGraphicsLinearLayout;
+
+ linear1->addItem(a);
+ linear1->addItem(linear2);
+ linear2->addItem(b);
+ linear2->addItem(linear3);
+ linear3->addItem(c);
+ linear3->addItem(d);
+
+ layout = linear1;
+ } else if (whichLayout == 1) {
+ QGraphicsAnchorLayout *anchor = new QGraphicsAnchorLayout;
+
+ // A
+ anchor->addCornerAnchors(a, Qt::TopLeftCorner, anchor, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(a, Qt::TopRightCorner, b, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(a, Qt::BottomLeftCorner, anchor, Qt::BottomLeftCorner);
+ anchor->addCornerAnchors(a, Qt::BottomRightCorner, c, Qt::BottomLeftCorner);
+
+ // B
+ anchor->addCornerAnchors(b, Qt::TopRightCorner, anchor, Qt::TopRightCorner);
+ anchor->addCornerAnchors(b, Qt::BottomLeftCorner, c, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(b, Qt::BottomRightCorner, d, Qt::TopRightCorner);
+
+ // C
+ anchor->addCornerAnchors(c, Qt::TopRightCorner, d, Qt::TopLeftCorner);
+ anchor->addCornerAnchors(c, Qt::BottomRightCorner, d, Qt::BottomLeftCorner);
+
+ // D
+ anchor->addCornerAnchors(d, Qt::BottomRightCorner, anchor, Qt::BottomRightCorner);
+
+ layout = anchor;
+ } else {
+ QGraphicsAnchorLayout *anchor = new QGraphicsAnchorLayout;
+
+ // A
+ anchor->addAnchor(a, Qt::AnchorLeft, anchor, Qt::AnchorLeft);
+ anchor->addAnchors(a, anchor, Qt::Vertical);
+ anchor->addAnchor(a, Qt::AnchorRight, b, Qt::AnchorLeft);
+ anchor->addAnchor(a, Qt::AnchorRight, c, Qt::AnchorLeft);
+
+ // B
+ anchor->addAnchor(b, Qt::AnchorTop, anchor, Qt::AnchorTop);
+ anchor->addAnchor(b, Qt::AnchorRight, anchor, Qt::AnchorRight);
+ anchor->addAnchor(b, Qt::AnchorBottom, c, Qt::AnchorTop);
+ anchor->addAnchor(b, Qt::AnchorBottom, d, Qt::AnchorTop);
+
+ // C
+ anchor->addAnchor(c, Qt::AnchorRight, d, Qt::AnchorLeft);
+ anchor->addAnchor(c, Qt::AnchorBottom, anchor, Qt::AnchorBottom);
+
+ // D
+ anchor->addAnchor(d, Qt::AnchorRight, anchor, Qt::AnchorRight);
+ anchor->addAnchor(d, Qt::AnchorBottom, anchor, Qt::AnchorBottom);
+
+ layout = anchor;
+ }
+
+ QSizeF sizeHint;
+ // warm up instruction cache
+ layout->invalidate();
+ sizeHint = layout->effectiveSizeHint(Qt::PreferredSize);
+
+ // ...then measure...
+ QBENCHMARK {
+ // To ensure that all sizeHints caches are invalidated in
+ // the LinearLayout setup, we must call updateGeometry on the
+ // children. If we didn't, only the top level layout would be
+ // re-calculated.
+ static_cast<QGraphicsLayoutItem *>(a)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(b)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(c)->updateGeometry();
+ static_cast<QGraphicsLayoutItem *>(d)->updateGeometry();
+ layout->invalidate();
+ sizeHint = layout->effectiveSizeHint(Qt::PreferredSize);
+ }
+}
+
QTEST_MAIN(tst_QGraphicsAnchorLayout)
#include "tst_qgraphicsanchorlayout.moc"
diff --git a/tests/benchmarks/qnetworkreply/qnetworkreply.pro b/tests/benchmarks/qnetworkreply/qnetworkreply.pro
index 060acf5..1e67d81 100644
--- a/tests/benchmarks/qnetworkreply/qnetworkreply.pro
+++ b/tests/benchmarks/qnetworkreply/qnetworkreply.pro
@@ -10,4 +10,4 @@ QT += network
CONFIG += release
# Input
-SOURCES += main.cpp
+SOURCES += tst_qnetworkreply.cpp
diff --git a/tests/benchmarks/qnetworkreply/main.cpp b/tests/benchmarks/qnetworkreply/tst_qnetworkreply.cpp
index 666e4f1..993db52 100644
--- a/tests/benchmarks/qnetworkreply/main.cpp
+++ b/tests/benchmarks/qnetworkreply/tst_qnetworkreply.cpp
@@ -54,6 +54,10 @@ class tst_qnetworkreply : public QObject
private slots:
void httpLatency();
+#ifndef QT_NO_OPENSSL
+ void echoPerformance_data();
+ void echoPerformance();
+#endif
};
void tst_qnetworkreply::httpLatency()
@@ -69,6 +73,40 @@ void tst_qnetworkreply::httpLatency()
}
}
+#ifndef QT_NO_OPENSSL
+void tst_qnetworkreply::echoPerformance_data()
+{
+ QTest::addColumn<bool>("ssl");
+ QTest::newRow("no_ssl") << false;
+ QTest::newRow("ssl") << true;
+}
+
+void tst_qnetworkreply::echoPerformance()
+{
+ QFETCH(bool, ssl);
+ QNetworkAccessManager manager;
+ QNetworkRequest request(QUrl((ssl ? "https://" : "http://") + QtNetworkSettings::serverName() + "/qtest/cgi-bin/echo.cgi"));
+
+ QByteArray data;
+ data.resize(1024*1024*10); // 10 MB
+ // init with garbage. needed so ssl cannot compress it in an efficient way.
+ for (int i = 0; i < data.size() / sizeof(int); i++) {
+ int r = qrand();
+ data.data()[i*sizeof(int)] = r;
+ }
+
+ QBENCHMARK{
+ QNetworkReply* reply = manager.post(request, data);
+ connect(reply, SIGNAL(sslErrors( const QList<QSslError> &)), reply, SLOT(ignoreSslErrors()));
+ connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection);
+ QTestEventLoop::instance().enterLoop(5);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ QVERIFY(reply->error() == QNetworkReply::NoError);
+ delete reply;
+ }
+}
+#endif
+
QTEST_MAIN(tst_qnetworkreply)
-#include "main.moc"
+#include "tst_qnetworkreply.moc"
diff --git a/tests/manual/gestures/graphicsview/gestures.cpp b/tests/manual/gestures/graphicsview/gestures.cpp
new file mode 100644
index 0000000..5416457
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/gestures.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "gestures.h"
+
+#include <QTouchEvent>
+
+Qt::GestureType ThreeFingerSlideGesture::Type = Qt::CustomGesture;
+
+QGesture *ThreeFingerSlideGestureRecognizer::createGesture(QObject *)
+{
+ return new ThreeFingerSlideGesture;
+}
+
+QGestureRecognizer::Result ThreeFingerSlideGestureRecognizer::filterEvent(QGesture *state, QObject *, QEvent *event)
+{
+ ThreeFingerSlideGesture *d = static_cast<ThreeFingerSlideGesture *>(state);
+ QGestureRecognizer::Result result;
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ result = QGestureRecognizer::MaybeGesture;
+ case QEvent::TouchEnd:
+ if (d->gestureFired)
+ result = QGestureRecognizer::GestureFinished;
+ else
+ result = QGestureRecognizer::NotGesture;
+ case QEvent::TouchUpdate:
+ if (d->state() != Qt::NoGesture) {
+ QTouchEvent *ev = static_cast<QTouchEvent*>(event);
+ if (ev->touchPoints().size() == 3) {
+ d->gestureFired = true;
+ result = QGestureRecognizer::GestureTriggered;
+ } else {
+ result = QGestureRecognizer::MaybeGesture;
+ for (int i = 0; i < ev->touchPoints().size(); ++i) {
+ const QTouchEvent::TouchPoint &pt = ev->touchPoints().at(i);
+ const int distance = (pt.pos().toPoint() - pt.startPos().toPoint()).manhattanLength();
+ if (distance > 20) {
+ result = QGestureRecognizer::NotGesture;
+ }
+ }
+ }
+ } else {
+ result = QGestureRecognizer::NotGesture;
+ }
+
+ break;
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseMove:
+ if (d->state() != Qt::NoGesture)
+ result = QGestureRecognizer::Ignore;
+ else
+ result = QGestureRecognizer::NotGesture;
+ break;
+ default:
+ result = QGestureRecognizer::Ignore;
+ break;
+ }
+ return result;
+}
+
+void ThreeFingerSlideGestureRecognizer::reset(QGesture *state)
+{
+ static_cast<ThreeFingerSlideGesture *>(state)->gestureFired = false;
+ QGestureRecognizer::reset(state);
+}
+
+
+QGesture *RotateGestureRecognizer::createGesture(QObject *)
+{
+ return new QGesture;
+}
+
+QGestureRecognizer::Result RotateGestureRecognizer::filterEvent(QGesture *, QObject *, QEvent *event)
+{
+ switch (event->type()) {
+ case QEvent::TouchBegin:
+ case QEvent::TouchEnd:
+ case QEvent::TouchUpdate:
+ break;
+ default:
+ break;
+ }
+ return QGestureRecognizer::Ignore;
+}
+
+void RotateGestureRecognizer::reset(QGesture *state)
+{
+ QGestureRecognizer::reset(state);
+}
+
+#include "moc_gestures.cpp"
diff --git a/tests/manual/gestures/graphicsview/gestures.h b/tests/manual/gestures/graphicsview/gestures.h
new file mode 100644
index 0000000..6140b12
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/gestures.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GESTURE_H
+#define GESTURE_H
+
+#include <QGestureRecognizer>
+#include <QGesture>
+
+class ThreeFingerSlideGesture : public QGesture
+{
+ Q_OBJECT
+public:
+ static Qt::GestureType Type;
+
+ ThreeFingerSlideGesture(QObject *parent = 0) : QGesture(parent) { }
+
+ bool gestureFired;
+};
+
+class ThreeFingerSlideGestureRecognizer : public QGestureRecognizer
+{
+private:
+ QGesture* createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+};
+
+class RotateGestureRecognizer : public QGestureRecognizer
+{
+public:
+ RotateGestureRecognizer();
+
+private:
+ QGesture* createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+};
+
+#endif // GESTURE_H
diff --git a/tests/manual/gestures/graphicsview/graphicsview.pro b/tests/manual/gestures/graphicsview/graphicsview.pro
new file mode 100644
index 0000000..a40c323
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/graphicsview.pro
@@ -0,0 +1,17 @@
+# #####################################################################
+# Automatically generated by qmake (2.01a) Mon Sep 7 13:26:43 2009
+# #####################################################################
+TEMPLATE = app
+TARGET =
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+SOURCES += main.cpp \
+ imageitem.cpp \
+ gestures.cpp \
+ mousepangesturerecognizer.cpp
+
+HEADERS += imageitem.h \
+ gestures.h \
+ mousepangesturerecognizer.h
diff --git a/examples/gestures/imageviewer/main.cpp b/tests/manual/gestures/graphicsview/imageitem.cpp
index c3d03f3..307d7e4 100644
--- a/examples/gestures/imageviewer/main.cpp
+++ b/tests/manual/gestures/graphicsview/imageitem.cpp
@@ -4,7 +4,7 @@
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
-** This file is part of the examples of the Qt Toolkit.
+** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
@@ -39,52 +39,55 @@
**
****************************************************************************/
-#include <QtGui>
+#include "imageitem.h"
+#include "gestures.h"
-#include "imagewidget.h"
+#include <QPainter>
+#include <QEvent>
-class MainWidget : public QMainWindow
+ImageItem::ImageItem(const QImage &image)
{
- Q_OBJECT
-
-public:
- MainWidget(QWidget *parent = 0);
-
-public slots:
- void openDirectory(const QString &path);
-
-private:
- bool loadImage(const QString &fileName);
+ setImage(image);
+}
- ImageWidget *imageWidget;
-};
+void ImageItem::setImage(const QImage &image)
+{
+ image_ = image;
+ pixmap_ = QPixmap::fromImage(image.scaled(400, 400, Qt::KeepAspectRatio));
+ update();
+}
-MainWidget::MainWidget(QWidget *parent)
- : QMainWindow(parent)
+QImage ImageItem::image() const
{
- resize(400, 300);
- imageWidget = new ImageWidget(this);
- setCentralWidget(imageWidget);
+ return image_;
}
-void MainWidget::openDirectory(const QString &path)
+QRectF ImageItem::boundingRect() const
{
- imageWidget->openDirectory(path);
+ const QSize size = pixmap_.size();
+ return QRectF(0, 0, size.width(), size.height());
}
-int main(int argc, char *argv[])
+void ImageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem*, QWidget*)
{
- QApplication app(argc, argv);
+ painter->drawPixmap(0, 0, pixmap_);
+}
- MainWidget w;
- w.show();
- if (QApplication::arguments().size() > 1)
- w.openDirectory(QApplication::arguments().at(1));
- else
- w.openDirectory(QFileDialog::getExistingDirectory(0, "Select image folder"));
+GestureImageItem::GestureImageItem(const QImage &image)
+ : ImageItem(image)
+{
+ grabGesture(Qt::PanGesture);
+ grabGesture(ThreeFingerSlideGesture::Type);
+}
- return app.exec();
+bool GestureImageItem::event(QEvent *event)
+{
+ if (event->type() == QEvent::Gesture) {
+ qDebug("gestureimageitem: gesture triggered");
+ return true;
+ }
+ return ImageItem::event(event);
}
-#include "main.moc"
+#include "moc_imageitem.cpp"
diff --git a/tests/manual/gestures/pinch/pinchwidget.h b/tests/manual/gestures/graphicsview/imageitem.h
index 7628ffc..776c8d1 100644
--- a/tests/manual/gestures/pinch/pinchwidget.h
+++ b/tests/manual/gestures/graphicsview/imageitem.h
@@ -39,40 +39,39 @@
**
****************************************************************************/
-#ifndef PINCHWIDGET_H
-#define PINCHWIDGET_H
+#ifndef IMAGEITEM_H
+#define IMAGEITEM_H
-#include <QWidget>
+#include <QGraphicsItem>
+#include <QImage>
+#include <QPixmap>
#include <QTransform>
-class QPanGesture;
-class QPinchGesture;
-
-class PinchWidget : public QWidget
+class ImageItem : public QGraphicsObject
{
Q_OBJECT
public:
- PinchWidget(const QImage &image, QWidget *parent = 0);
-
-private Q_SLOTS:
- void acceptTouchEvents();
- void onPanTriggered();
- void onPanFinished();
- void onPinchTriggered();
- void onPinchFinished();
+ ImageItem(const QImage &image);
+ void setImage(const QImage &image);
+ QImage image() const;
+ QRectF boundingRect() const;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private:
- void paintEvent(QPaintEvent *);
- QSize sizeHint() const;
+ QImage image_;
+ QPixmap pixmap_;
+ QTransform transform;
+};
- QImage image;
+class GestureImageItem : public ImageItem
+{
+ Q_OBJECT
- QPanGesture *pan;
- QPinchGesture *pinch;
+public:
+ GestureImageItem(const QImage &image);
- QTransform worldTransform;
- QTransform currentPanTransform;
- QTransform currentPinchTransform;
+protected:
+ bool event(QEvent *event);
};
-#endif // PINCHWIDGET_H
+#endif // IMAGEITEM_H
diff --git a/tests/manual/gestures/graphicsview/main.cpp b/tests/manual/gestures/graphicsview/main.cpp
new file mode 100644
index 0000000..e9065eb
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/main.cpp
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "imageitem.h"
+#include "gestures.h"
+#include "mousepangesturerecognizer.h"
+
+class GraphicsView : public QGraphicsView
+{
+public:
+ GraphicsView(QGraphicsScene *scene, QWidget *parent = 0)
+ : QGraphicsView(scene, parent)
+ {
+ }
+protected:
+ bool viewportEvent(QEvent *event)
+ {
+ if (event->type() == QEvent::Gesture) {
+ QGestureEvent *ge = static_cast<QGestureEvent *>(event);
+ if (QPanGesture *pan = static_cast<QPanGesture *>(ge->gesture(Qt::PanGesture))) {
+ switch (pan->state()) {
+ case Qt::GestureStarted: qDebug("view: Pan: started"); break;
+ case Qt::GestureFinished: qDebug("view: Pan: finished"); break;
+ case Qt::GestureCanceled: qDebug("view: Pan: canceled"); break;
+ case Qt::GestureUpdated: break;
+ default: qDebug("view: Pan: <unknown state>"); break;
+ }
+
+ const QPointF offset = pan->offset();
+ QScrollBar *vbar = verticalScrollBar();
+ QScrollBar *hbar = horizontalScrollBar();
+ vbar->setValue(vbar->value() - offset.y());
+ hbar->setValue(hbar->value() - offset.x());
+ ge->accept(pan);
+ return true;
+ }
+ }
+ return QGraphicsView::viewportEvent(event);
+ }
+};
+
+class StandardGestures : public QWidget
+{
+public:
+ StandardGestures(QWidget *parent = 0)
+ : QWidget(parent)
+ {
+ scene = new QGraphicsScene(this);
+ scene->setSceneRect(-2000, -2000, 4000, 4000);
+ view = new QGraphicsView(scene, 0);
+ QVBoxLayout *l = new QVBoxLayout(this);
+ l->addWidget(view);
+ }
+
+ QGraphicsScene *scene;
+ QGraphicsView *view;
+};
+
+class GlobalViewGestures : public QWidget
+{
+ Q_OBJECT
+public:
+ GlobalViewGestures(QWidget *parent = 0)
+ : QWidget(parent)
+ {
+ scene = new QGraphicsScene(this);
+ scene->setSceneRect(-2000, -2000, 4000, 4000);
+ view = new GraphicsView(scene, 0);
+ view->viewport()->grabGesture(Qt::PanGesture);
+ view->viewport()->grabGesture(ThreeFingerSlideGesture::Type);
+ QVBoxLayout *l = new QVBoxLayout(this);
+ l->addWidget(view);
+ }
+
+ QGraphicsScene *scene;
+ QGraphicsView *view;
+};
+
+class GraphicsItemGestures : public QWidget
+{
+ Q_OBJECT
+public:
+ GraphicsItemGestures(QWidget *parent = 0)
+ : QWidget(parent)
+ {
+ scene = new QGraphicsScene(this);
+ scene->setSceneRect(-2000, -2000, 4000, 4000);
+ view = new QGraphicsView(scene, 0);
+ view->viewport()->grabGesture(Qt::PanGesture);
+ view->viewport()->grabGesture(ThreeFingerSlideGesture::Type);
+ QVBoxLayout *l = new QVBoxLayout(this);
+ l->addWidget(view);
+ }
+
+ QGraphicsScene *scene;
+ QGraphicsView *view;
+};
+
+class MainWindow : public QMainWindow
+{
+public:
+ MainWindow();
+
+ void setDirectory(const QString &path);
+
+private:
+ QTabWidget *tabWidget;
+ StandardGestures *standardGestures;
+ GlobalViewGestures *globalViewGestures;
+ GraphicsItemGestures *graphicsItemGestures;
+};
+
+MainWindow::MainWindow()
+{
+ (void)qApp->registerGestureRecognizer(new MousePanGestureRecognizer);
+ ThreeFingerSlideGesture::Type = qApp->registerGestureRecognizer(new ThreeFingerSlideGestureRecognizer);
+
+ tabWidget = new QTabWidget;
+
+ standardGestures = new StandardGestures;
+ tabWidget->addTab(standardGestures, "Standard gestures");
+
+ globalViewGestures = new GlobalViewGestures;
+ tabWidget->addTab(globalViewGestures , "Global gestures");
+
+ graphicsItemGestures = new GraphicsItemGestures;
+ tabWidget->addTab(graphicsItemGestures, "Graphics item gestures");
+
+ setCentralWidget(tabWidget);
+}
+
+void MainWindow::setDirectory(const QString &path)
+{
+ QDir dir(path);
+ QStringList files = dir.entryList(QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
+ foreach(const QString &file, files) {
+ QImageReader img(path + QLatin1String("/")+file);
+ QImage image = img.read();
+ if (!image.isNull()) {
+ {
+ ImageItem *item = new ImageItem(image);
+ item->setPos(0, 0);
+ item->setFlags(QGraphicsItem::ItemIsMovable);
+ standardGestures->scene->addItem(item);
+ }
+ {
+ ImageItem *item = new ImageItem(image);
+ item->setPos(0, 0);
+ item->setFlags(QGraphicsItem::ItemIsMovable);
+ globalViewGestures->scene->addItem(item);
+ }
+ {
+ GestureImageItem *item = new GestureImageItem(image);
+ item->setPos(0, 0);
+ item->setFlags(QGraphicsItem::ItemIsMovable);
+ graphicsItemGestures->scene->addItem(item);
+ }
+ }
+ }
+
+ {
+ QList<QGraphicsItem*> items = standardGestures->scene->items();
+ if (!items.isEmpty())
+ standardGestures->view->ensureVisible(items.at(0));
+ }
+ {
+ QList<QGraphicsItem*> items = globalViewGestures->scene->items();
+ if (!items.isEmpty())
+ globalViewGestures->view->ensureVisible(items.at(0));
+ }
+ {
+ QList<QGraphicsItem*> items = graphicsItemGestures->scene->items();
+ if (!items.isEmpty())
+ graphicsItemGestures->view->ensureVisible(items.at(0));
+ }
+}
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ MainWindow window;
+ if (QApplication::arguments().size() > 1)
+ window.setDirectory(QApplication::arguments().at(1));
+ else
+ window.setDirectory(QFileDialog::getExistingDirectory(0, "Select image folder"));
+ window.show();
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/tests/manual/gestures/graphicsview/mousepangesturerecognizer.cpp b/tests/manual/gestures/graphicsview/mousepangesturerecognizer.cpp
new file mode 100644
index 0000000..6cdbe12
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/mousepangesturerecognizer.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "mousepangesturerecognizer.h"
+
+#include <QEvent>
+#include <QVariant>
+#include <QGraphicsSceneMouseEvent>
+#include <QMouseEvent>
+#include <QGesture>
+
+MousePanGestureRecognizer::MousePanGestureRecognizer()
+{
+}
+
+QGesture* MousePanGestureRecognizer::createGesture(QObject *)
+{
+ return new QPanGesture;
+}
+
+QGestureRecognizer::Result MousePanGestureRecognizer::filterEvent(QGesture *state, QObject *, QEvent *event)
+{
+ QPanGesture *g = static_cast<QPanGesture *>(state);
+ QPoint globalPos;
+ switch (event->type()) {
+ case QEvent::GraphicsSceneMousePress:
+ case QEvent::GraphicsSceneMouseDoubleClick:
+ case QEvent::GraphicsSceneMouseMove:
+ case QEvent::GraphicsSceneMouseRelease:
+ globalPos = static_cast<QGraphicsSceneMouseEvent *>(event)->screenPos();
+ break;
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonRelease:
+ globalPos = static_cast<QMouseEvent *>(event)->globalPos();
+ break;
+ default:
+ break;
+ }
+ if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick
+ || event->type() == QEvent::GraphicsSceneMousePress || event->type() == QEvent::GraphicsSceneMouseDoubleClick) {
+ g->setHotSpot(globalPos);
+ g->setProperty("lastPos", globalPos);
+ g->setProperty("pressed", QVariant::fromValue<bool>(true));
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ } else if (event->type() == QEvent::MouseMove || event->type() == QEvent::GraphicsSceneMouseMove) {
+ if (g->property("pressed").toBool()) {
+ QPoint pos = globalPos;
+ QPoint lastPos = g->property("lastPos").toPoint();
+ g->setLastOffset(g->offset());
+ lastPos = pos - lastPos;
+ g->setOffset(QPointF(lastPos.x(), lastPos.y()));
+ g->setTotalOffset(g->totalOffset() + QPointF(lastPos.x(), lastPos.y()));
+ g->setProperty("lastPos", pos);
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ }
+ return QGestureRecognizer::NotGesture;
+ } else if (event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::GraphicsSceneMouseRelease) {
+ return QGestureRecognizer::GestureFinished | QGestureRecognizer::ConsumeEventHint;
+ }
+ return QGestureRecognizer::Ignore;
+}
+
+void MousePanGestureRecognizer::reset(QGesture *state)
+{
+ QPanGesture *g = static_cast<QPanGesture *>(state);
+ g->setTotalOffset(QPointF());
+ g->setLastOffset(QPointF());
+ g->setOffset(QPointF());
+ g->setAcceleration(0);
+ g->setProperty("lastPos", QVariant());
+ g->setProperty("pressed", QVariant::fromValue<bool>(false));
+ QGestureRecognizer::reset(state);
+}
diff --git a/tests/manual/gestures/graphicsview/mousepangesturerecognizer.h b/tests/manual/gestures/graphicsview/mousepangesturerecognizer.h
new file mode 100644
index 0000000..b062fd0
--- /dev/null
+++ b/tests/manual/gestures/graphicsview/mousepangesturerecognizer.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MOUSEPANGESTURERECOGNIZER_H
+#define MOUSEPANGESTURERECOGNIZER_H
+
+#include <QGestureRecognizer>
+
+class MousePanGestureRecognizer : public QGestureRecognizer
+{
+public:
+ MousePanGestureRecognizer();
+
+ QGesture* createGesture(QObject *target);
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+};
+
+#endif // MOUSEPANGESTURERECOGNIZER_H
diff --git a/tests/manual/gestures/pinch/pinch.pro b/tests/manual/gestures/pinch/pinch.pro
deleted file mode 100644
index d1f28cc..0000000
--- a/tests/manual/gestures/pinch/pinch.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-SOURCES = main.cpp \
- pinchwidget.cpp
-HEADERS += pinchwidget.h
-RESOURCES += pinch.qrc
diff --git a/tests/manual/gestures/pinch/pinch.qrc b/tests/manual/gestures/pinch/pinch.qrc
deleted file mode 100644
index 0be9ba1..0000000
--- a/tests/manual/gestures/pinch/pinch.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/images" >
- <file>qt-logo.png</file>
- </qresource>
-</RCC>
diff --git a/tests/manual/gestures/pinch/pinchwidget.cpp b/tests/manual/gestures/pinch/pinchwidget.cpp
deleted file mode 100644
index e93c8b5..0000000
--- a/tests/manual/gestures/pinch/pinchwidget.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "pinchwidget.h"
-
-#include <QPainter>
-#include <QImage>
-#include <QPixmap>
-#include <QPanGesture>
-#include <QPinchGesture>
-#include <QPushButton>
-
-PinchWidget::PinchWidget(const QImage &image, QWidget *parent)
- : QWidget(parent)
-{
- setMinimumSize(100,100);
- this->image = image;
- pan = new QPanGesture(this);
- connect(pan, SIGNAL(triggered()), this, SLOT(onPanTriggered()));
- connect(pan, SIGNAL(finished()), this, SLOT(onPanFinished()));
- pinch = new QPinchGesture(this);
- connect(pinch, SIGNAL(triggered()), this, SLOT(onPinchTriggered()));
- connect(pinch, SIGNAL(finished()), this, SLOT(onPinchFinished()));
-}
-
-QSize PinchWidget::sizeHint() const
-{
- return image.size()*1.5;
-}
-
-void PinchWidget::paintEvent(QPaintEvent *)
-{
- QPainter p(this);
- QTransform t = worldTransform * currentPanTransform * currentPinchTransform;
- p.setTransform(t);
- QPoint center = QPoint(width()/2, height()/2);
- QPoint size = QPoint(image.width()/2, image.height()/2);
- p.translate(center - size);
- p.drawImage(QPoint(0,0), image);
-}
-
-void PinchWidget::acceptTouchEvents()
-{
- setAttribute(Qt::WA_AcceptTouchEvents);
- if (QWidget *w = qobject_cast<QPushButton*>(sender()))
- w->setEnabled(false);
-}
-
-void PinchWidget::onPanTriggered()
-{
- currentPanTransform = QTransform()
- .translate(pan->totalOffset().width(),
- pan->totalOffset().height());
- update();
-}
-
-void PinchWidget::onPanFinished()
-{
- worldTransform *= currentPanTransform;
- currentPanTransform.reset();
- update();
-}
-
-void PinchWidget::onPinchTriggered()
-{
- QPoint transformCenter = worldTransform.map(QPoint(width()/2, height()/2));
- currentPinchTransform = QTransform()
- .translate(transformCenter.x(), transformCenter.y())
- .scale(pinch->totalScaleFactor(), pinch->totalScaleFactor())
- .rotate(pinch->totalRotationAngle())
- .translate(-transformCenter.x(), -transformCenter.y());
- update();
-}
-
-void PinchWidget::onPinchFinished()
-{
- worldTransform *= currentPinchTransform;
- currentPinchTransform.reset();
- update();
-}
diff --git a/tests/manual/gestures/pinch/qt-logo.png b/tests/manual/gestures/pinch/qt-logo.png
deleted file mode 100644
index 7d3e97e..0000000
--- a/tests/manual/gestures/pinch/qt-logo.png
+++ /dev/null
Binary files differ
diff --git a/tests/manual/gestures/scrollarea/main.cpp b/tests/manual/gestures/scrollarea/main.cpp
new file mode 100644
index 0000000..f90f6c6
--- /dev/null
+++ b/tests/manual/gestures/scrollarea/main.cpp
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+
+#include "mousepangesturerecognizer.h"
+
+class ScrollArea : public QScrollArea
+{
+ Q_OBJECT
+public:
+ ScrollArea(QWidget *parent = 0)
+ : QScrollArea(parent), outside(false)
+ {
+ viewport()->grabGesture(Qt::PanGesture);
+ }
+
+protected:
+ bool viewportEvent(QEvent *event)
+ {
+ if (event->type() == QEvent::Gesture) {
+ gestureEvent(static_cast<QGestureEvent *>(event));
+ return true;
+ } else if (event->type() == QEvent::GestureOverride) {
+ QGestureEvent *ge = static_cast<QGestureEvent *>(event);
+ if (QPanGesture *pan = static_cast<QPanGesture *>(ge->gesture(Qt::PanGesture)))
+ if (pan->state() == Qt::GestureStarted) {
+ outside = false;
+ }
+ }
+ return QScrollArea::viewportEvent(event);
+ }
+ void gestureEvent(QGestureEvent *event)
+ {
+ QPanGesture *pan = static_cast<QPanGesture *>(event->gesture(Qt::PanGesture));
+ if (pan) {
+ switch(pan->state()) {
+ case Qt::GestureStarted: qDebug("area: Pan: started"); break;
+ case Qt::GestureFinished: qDebug("area: Pan: finished"); break;
+ case Qt::GestureCanceled: qDebug("area: Pan: canceled"); break;
+ case Qt::GestureUpdated: break;
+ default: qDebug("area: Pan: <unknown state>"); break;
+ }
+
+ if (pan->state() == Qt::GestureStarted)
+ outside = false;
+ event->ignore();
+ event->ignore(pan);
+ if (outside)
+ return;
+
+ const QPointF offset = pan->offset();
+ const QPointF totalOffset = pan->totalOffset();
+ QScrollBar *vbar = verticalScrollBar();
+ QScrollBar *hbar = horizontalScrollBar();
+
+ if ((vbar->value() == vbar->minimum() && totalOffset.y() > 10) ||
+ (vbar->value() == vbar->maximum() && totalOffset.y() < -10)) {
+ outside = true;
+ return;
+ }
+ if ((hbar->value() == hbar->minimum() && totalOffset.x() > 10) ||
+ (hbar->value() == hbar->maximum() && totalOffset.x() < -10)) {
+ outside = true;
+ return;
+ }
+ vbar->setValue(vbar->value() - offset.y());
+ hbar->setValue(hbar->value() - offset.x());
+ event->accept(pan);
+ }
+ }
+
+private:
+ bool outside;
+};
+
+class Slider : public QSlider
+{
+public:
+ Slider(Qt::Orientation orientation, QWidget *parent = 0)
+ : QSlider(orientation, parent)
+ {
+ grabGesture(Qt::PanGesture);
+ }
+protected:
+ bool event(QEvent *event)
+ {
+ if (event->type() == QEvent::Gesture) {
+ gestureEvent(static_cast<QGestureEvent *>(event));
+ return true;
+ }
+ return QSlider::event(event);
+ }
+ void gestureEvent(QGestureEvent *event)
+ {
+ QPanGesture *pan = static_cast<QPanGesture *>(event->gesture(Qt::PanGesture));
+ if (pan) {
+ switch (pan->state()) {
+ case Qt::GestureStarted: qDebug("slider: Pan: started"); break;
+ case Qt::GestureFinished: qDebug("slider: Pan: finished"); break;
+ case Qt::GestureCanceled: qDebug("slider: Pan: canceled"); break;
+ case Qt::GestureUpdated: break;
+ default: qDebug("slider: Pan: <unknown state>"); break;
+ }
+
+ if (pan->state() == Qt::GestureStarted)
+ outside = false;
+ event->ignore();
+ event->ignore(pan);
+ if (outside)
+ return;
+ const QPointF offset = pan->offset();
+ const QPointF totalOffset = pan->totalOffset();
+ if (orientation() == Qt::Horizontal) {
+ if ((value() == minimum() && totalOffset.x() < -10) ||
+ (value() == maximum() && totalOffset.x() > 10)) {
+ outside = true;
+ return;
+ }
+ if (totalOffset.y() < 40 && totalOffset.y() > -40) {
+ setValue(value() + offset.x());
+ event->accept(pan);
+ } else {
+ outside = true;
+ }
+ } else if (orientation() == Qt::Vertical) {
+ if ((value() == maximum() && totalOffset.y() < -10) ||
+ (value() == minimum() && totalOffset.y() > 10)) {
+ outside = true;
+ return;
+ }
+ if (totalOffset.x() < 40 && totalOffset.x() > -40) {
+ setValue(value() - offset.y());
+ event->accept(pan);
+ } else {
+ outside = true;
+ }
+ }
+ }
+ }
+private:
+ bool outside;
+};
+
+class MainWindow : public QMainWindow
+{
+public:
+ MainWindow()
+ {
+ rootScrollArea = new ScrollArea;
+ setCentralWidget(rootScrollArea);
+
+ QWidget *root = new QWidget;
+ root->setFixedSize(3000, 3000);
+ rootScrollArea->setWidget(root);
+
+ Slider *verticalSlider = new Slider(Qt::Vertical, root);
+ verticalSlider ->move(650, 1100);
+ Slider *horizontalSlider = new Slider(Qt::Horizontal, root);
+ horizontalSlider ->move(600, 1000);
+
+ childScrollArea = new ScrollArea(root);
+ childScrollArea->move(500, 500);
+ QWidget *w = new QWidget;
+ w->setMinimumWidth(400);
+ QVBoxLayout *l = new QVBoxLayout(w);
+ l->setMargin(20);
+ for (int i = 0; i < 100; ++i) {
+ QWidget *w = new QWidget;
+ QHBoxLayout *ll = new QHBoxLayout(w);
+ ll->addWidget(new QLabel(QString("Label %1").arg(i)));
+ ll->addWidget(new QPushButton(QString("Button %1").arg(i)));
+ l->addWidget(w);
+ }
+ childScrollArea->setWidget(w);
+ }
+private:
+ ScrollArea *rootScrollArea;
+ ScrollArea *childScrollArea;
+};
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ app.registerGestureRecognizer(new MousePanGestureRecognizer);
+ MainWindow w;
+ w.show();
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/tests/manual/gestures/scrollarea/mousepangesturerecognizer.cpp b/tests/manual/gestures/scrollarea/mousepangesturerecognizer.cpp
new file mode 100644
index 0000000..5f94dbc
--- /dev/null
+++ b/tests/manual/gestures/scrollarea/mousepangesturerecognizer.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "mousepangesturerecognizer.h"
+
+#include <QEvent>
+#include <QMouseEvent>
+#include <QGesture>
+
+MousePanGestureRecognizer::MousePanGestureRecognizer()
+{
+}
+
+QGesture* MousePanGestureRecognizer::createGesture(QObject *) const
+{
+ return new QPanGesture;
+}
+
+QGestureRecognizer::Result MousePanGestureRecognizer::filterEvent(QGesture *state, QObject *, QEvent *event)
+{
+ QPanGesture *g = static_cast<QPanGesture *>(state);
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick) {
+ g->setHotSpot(me->globalPos());
+ g->setProperty("lastPos", me->globalPos());
+ g->setProperty("pressed", QVariant::fromValue<bool>(true));
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ } else if (event->type() == QEvent::MouseMove) {
+ if (g->property("pressed").toBool()) {
+ QPoint pos = me->globalPos();
+ QPoint lastPos = g->property("lastPos").toPoint();
+ g->setLastOffset(g->offset());
+ lastPos = pos - lastPos;
+ g->setOffset(QPointF(lastPos.x(), lastPos.y()));
+ g->setTotalOffset(g->totalOffset() + QPointF(lastPos.x(), lastPos.y()));
+ g->setProperty("lastPos", pos);
+ return QGestureRecognizer::GestureTriggered | QGestureRecognizer::ConsumeEventHint;
+ }
+ return QGestureRecognizer::NotGesture;
+ } else if (event->type() == QEvent::MouseButtonRelease) {
+ return QGestureRecognizer::GestureFinished | QGestureRecognizer::ConsumeEventHint;
+ }
+ return QGestureRecognizer::Ignore;
+}
+
+void MousePanGestureRecognizer::reset(QGesture *state)
+{
+ QPanGesture *g = static_cast<QPanGesture *>(state);
+ g->setTotalOffset(QPointF());
+ g->setLastOffset(QPointF());
+ g->setOffset(QPointF());
+ g->setAcceleration(0);
+ g->setProperty("lastPos", QVariant());
+ g->setProperty("pressed", QVariant::fromValue<bool>(false));
+ QGestureRecognizer::reset(state);
+}
diff --git a/tests/manual/gestures/scrollarea/mousepangesturerecognizer.h b/tests/manual/gestures/scrollarea/mousepangesturerecognizer.h
new file mode 100644
index 0000000..c92d477
--- /dev/null
+++ b/tests/manual/gestures/scrollarea/mousepangesturerecognizer.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MOUSEPANGESTURERECOGNIZER_H
+#define MOUSEPANGESTURERECOGNIZER_H
+
+#include <QGestureRecognizer>
+
+class MousePanGestureRecognizer : public QGestureRecognizer
+{
+public:
+ MousePanGestureRecognizer();
+
+ QGesture* createGesture(QObject *target) const;
+ QGestureRecognizer::Result filterEvent(QGesture *state, QObject *watched, QEvent *event);
+ void reset(QGesture *state);
+};
+
+#endif // MOUSEPANGESTURERECOGNIZER_H
diff --git a/tests/manual/gestures/scrollarea/scrollarea.pro b/tests/manual/gestures/scrollarea/scrollarea.pro
new file mode 100644
index 0000000..554810e
--- /dev/null
+++ b/tests/manual/gestures/scrollarea/scrollarea.pro
@@ -0,0 +1,3 @@
+SOURCES = main.cpp \
+ mousepangesturerecognizer.cpp
+HEADERS += mousepangesturerecognizer.h
diff --git a/tests/manual/gestures/twopanwidgets/main.cpp b/tests/manual/gestures/twopanwidgets/main.cpp
deleted file mode 100644
index 20a35fc..0000000
--- a/tests/manual/gestures/twopanwidgets/main.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui>
-
-static const char text[] =
- "Hello world! This is just a lot of text with to make sure scrollbar appear";
-
-class TextEdit : public QTextEdit
-{
- Q_OBJECT
-public Q_SLOTS:
- void acceptTouch()
- {
- viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
- if (QWidget *w = qobject_cast<QPushButton*>(sender()))
- w->setEnabled(false);
- }
-};
-
-class PlainTextEdit : public QPlainTextEdit
-{
- Q_OBJECT
-public Q_SLOTS:
- void acceptTouch()
- {
- viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
- if (QWidget *w = qobject_cast<QPushButton*>(sender()))
- w->setEnabled(false);
- }
-};
-
-class MainWindow : public QMainWindow
-{
-public:
- MainWindow();
-};
-
-MainWindow::MainWindow()
-{
- QTabWidget *tw = new QTabWidget;
- setCentralWidget(tw);
- {
- QWidget *tab = new QWidget;
- QGridLayout *layout = new QGridLayout(tab);
- QTextEdit *edit1 = new TextEdit;
- QTextEdit *edit2 = new TextEdit;
- QString text1 = QString(text).replace(' ', '\n');
- for (int i = 0; i < 5; ++i) text1 += text1;
- QString text2 = QString(text);
- for (int i = 0; i < 5; ++i) text2 += text2;
- edit1->setPlainText(text1);
- edit2->setPlainText(text2);
- edit2->setWordWrapMode(QTextOption::NoWrap);
- QPushButton *btn1 = new QPushButton(QLatin1String("AcceptTouchEvents"));
- connect(btn1, SIGNAL(clicked()), edit1, SLOT(acceptTouch()));
- QPushButton *btn2 = new QPushButton(QLatin1String("AcceptTouchEvents"));
- connect(btn2, SIGNAL(clicked()), edit2, SLOT(acceptTouch()));
- layout->addWidget(btn1, 0, 0);
- layout->addWidget(btn2, 0, 1);
- layout->addWidget(edit1, 1, 0);
- layout->addWidget(edit2, 1, 1);
- tw->addTab(tab, QLatin1String("QTextEdit"));
- }
- {
- QWidget *tab = new QWidget;
- QGridLayout *layout = new QGridLayout(tab);
- QPlainTextEdit *edit1 = new PlainTextEdit;
- QPlainTextEdit *edit2 = new PlainTextEdit;
- QString text1 = QString(text).replace(' ', '\n');
- for (int i = 0; i < 5; ++i) text1 += text1;
- QString text2 = QString(text);
- for (int i = 0; i < 5; ++i) text2 += text2;
- edit1->setPlainText(text1);
- edit2->setPlainText(text2);
- edit2->setWordWrapMode(QTextOption::NoWrap);
- QPushButton *btn1 = new QPushButton(QLatin1String("AcceptTouchEvents"));
- connect(btn1, SIGNAL(clicked()), edit1, SLOT(acceptTouch()));
- QPushButton *btn2 = new QPushButton(QLatin1String("AcceptTouchEvents"));
- connect(btn2, SIGNAL(clicked()), edit2, SLOT(acceptTouch()));
- layout->addWidget(btn1, 0, 0);
- layout->addWidget(btn2, 0, 1);
- layout->addWidget(edit1, 1, 0);
- layout->addWidget(edit2, 1, 1);
- tw->addTab(tab, QLatin1String("QPlainTextEdit"));
- }
-}
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- MainWindow window;
- window.show();
- return app.exec();
-}
-
-#include "main.moc"
diff --git a/tests/manual/gestures/twopanwidgets/twopanwidgets.pro b/tests/manual/gestures/twopanwidgets/twopanwidgets.pro
deleted file mode 100644
index 5254077..0000000
--- a/tests/manual/gestures/twopanwidgets/twopanwidgets.pro
+++ /dev/null
@@ -1 +0,0 @@
-SOURCES = main.cpp \ No newline at end of file
diff --git a/tools/assistant/lib/qhelpcollectionhandler.cpp b/tools/assistant/lib/qhelpcollectionhandler.cpp
index f59b227..4aa7ab6 100644
--- a/tools/assistant/lib/qhelpcollectionhandler.cpp
+++ b/tools/assistant/lib/qhelpcollectionhandler.cpp
@@ -76,7 +76,8 @@ bool QHelpCollectionHandler::isDBOpened()
{
if (m_dbOpened)
return true;
- emit error(tr("The collection file is not set up yet!"));
+ emit error(tr("The collection file '%1' is not set up yet!").
+ arg(m_collectionFile));
return false;
}
@@ -134,7 +135,8 @@ bool QHelpCollectionHandler::copyCollectionFile(const QString &fileName)
QFileInfo fi(fileName);
if (fi.exists()) {
- emit error(tr("The specified collection file already exists!"));
+ emit error(tr("The collection file '%1' already exists!").
+ arg(fileName));
return false;
}
@@ -281,7 +283,7 @@ bool QHelpCollectionHandler::removeCustomFilter(const QString &filterName)
filterNameId = m_query.value(0).toInt();
if (filterNameId < 0) {
- emit error(tr("Unknown filter!"));
+ emit error(tr("Unknown filter '%1'!").arg(filterName));
return false;
}
@@ -386,7 +388,7 @@ bool QHelpCollectionHandler::registerDocumentation(const QString &fileName)
QString ns = reader.namespaceName();
if (ns.isEmpty()) {
- emit error(tr("Invalid documentation file!"));
+ emit error(tr("Invalid documentation file '%1'!").arg(fileName));
return false;
}
@@ -553,7 +555,7 @@ int QHelpCollectionHandler::registerNamespace(const QString &nspace, const QStri
if (m_query.exec())
namespaceId = m_query.lastInsertId().toInt();
if (namespaceId < 1) {
- emit error(tr("Cannot register namespace!"));
+ emit error(tr("Cannot register namespace '%1'!").arg(nspace));
return -1;
}
return namespaceId;
@@ -577,7 +579,7 @@ void QHelpCollectionHandler::optimizeDatabase(const QString &fileName)
db.setDatabaseName(fileName);
if (!db.open()) {
QSqlDatabase::removeDatabase(QLatin1String("optimize"));
- emit error(tr("Cannot open database to optimize!"));
+ emit error(tr("Cannot open database '%1' to optimize!").arg(fileName));
return;
}
diff --git a/tools/assistant/lib/qhelpsearchquerywidget.cpp b/tools/assistant/lib/qhelpsearchquerywidget.cpp
index 361e9ac..f2f40ec 100644
--- a/tools/assistant/lib/qhelpsearchquerywidget.cpp
+++ b/tools/assistant/lib/qhelpsearchquerywidget.cpp
@@ -289,7 +289,7 @@ private slots:
{
QList<QHelpSearchQuery> queryList;
#if !defined(QT_CLUCENE_SUPPORT)
- queryList.append(QHelSearchQuery(QHelpSearchQuery::DEFAULT,
+ queryList.append(QHelpSearchQuery(QHelpSearchQuery::DEFAULT,
QStringList(defaultQuery->text())));
#else
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index b9f8ed8..f57f3a8 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -1465,6 +1465,9 @@ void Configure::applySpecSpecifics()
dictionary[ "SQL_SQLITE" ] = "yes";
dictionary[ "SQL_SQLITE_LIB" ] = "system";
+ // Disable building docs and translations for now
+ disabledBuildParts << "docs" << "translations";
+
} else if(dictionary[ "XQMAKESPEC" ].startsWith("linux")) { //TODO actually wrong.
//TODO
dictionary[ "STYLE_WINDOWSXP" ] = "no";
@@ -3717,7 +3720,7 @@ void Configure::readLicense()
(dictionary.value("QMAKESPEC").startsWith("wince") || dictionary.value("XQMAKESPEC").startsWith("wince")))
dictionary["PLATFORM NAME"] = "Qt for Windows CE";
else if (dictionary.value("XQMAKESPEC").startsWith("symbian"))
- dictionary["PLATFORM NAME"] = "Qt for S60";
+ dictionary["PLATFORM NAME"] = "Qt for Symbian";
else
dictionary["PLATFORM NAME"] = "Qt for Windows";
dictionary["LICENSE FILE"] = sourcePath;
diff --git a/tools/linguist/lupdate/main.cpp b/tools/linguist/lupdate/main.cpp
index 6b554e0..bdaec4f 100644
--- a/tools/linguist/lupdate/main.cpp
+++ b/tools/linguist/lupdate/main.cpp
@@ -160,6 +160,8 @@ static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFil
tor.setCodecName(codecForTr);
if (!targetLanguage.isEmpty())
tor.setLanguageCode(targetLanguage);
+ else
+ tor.setLanguageCode(Translator::guessLanguageCodeFromFileName(fileName));
if (!sourceLanguage.isEmpty())
tor.setSourceLanguageCode(sourceLanguage);
}
diff --git a/tools/linguist/shared/qm.cpp b/tools/linguist/shared/qm.cpp
index fefe91c..317a07e 100644
--- a/tools/linguist/shared/qm.cpp
+++ b/tools/linguist/shared/qm.cpp
@@ -440,9 +440,10 @@ void Releaser::insert(const TranslatorMessage &message, bool forceComment)
void Releaser::insertIdBased(const TranslatorMessage &message)
{
QStringList tlns = message.translations();
- for (int i = 0; i < tlns.size(); ++i)
- if (tlns.at(i).isEmpty())
- tlns[i] = message.sourceText();
+ if (message.type() == TranslatorMessage::Unfinished)
+ for (int i = 0; i < tlns.size(); ++i)
+ if (tlns.at(i).isEmpty())
+ tlns[i] = message.sourceText();
ByteTranslatorMessage bmsg("", originalBytes(message.id(), false), "", tlns);
m_messages.insert(bmsg, 0);
}
@@ -713,7 +714,7 @@ static bool saveQM(const Translator &translator, QIODevice &dev, ConversionData
continue;
}
if (typ == TranslatorMessage::Unfinished) {
- if (msg.translation().isEmpty()) {
+ if (!cd.m_idBased && msg.translation().isEmpty()) {
++untranslated;
continue;
} else {
diff --git a/tools/linguist/shared/translatormessage.cpp b/tools/linguist/shared/translatormessage.cpp
index 417f6b1..db6f333 100644
--- a/tools/linguist/shared/translatormessage.cpp
+++ b/tools/linguist/shared/translatormessage.cpp
@@ -151,6 +151,7 @@ bool TranslatorMessage::operator==(const TranslatorMessage& m) const
return (m_context == m.m_context)
&& m_sourcetext == m.m_sourcetext
&& m_extra[msgIdPlural] == m.m_extra[msgIdPlural]
+ && m_id == m.m_id
&& (m_sourcetext.isEmpty() || m_comment == m.m_comment);
}
@@ -161,7 +162,9 @@ bool TranslatorMessage::operator<(const TranslatorMessage& m) const
return m_context < m.m_context;
if (m_sourcetext != m.m_sourcetext)
return m_sourcetext < m.m_sourcetext;
- return m_comment < m.m_comment;
+ if (m_comment != m.m_comment)
+ return m_comment < m.m_comment;
+ return m_id < m.m_id;
}
int qHash(const TranslatorMessage &msg)
@@ -170,7 +173,8 @@ int qHash(const TranslatorMessage &msg)
qHash(msg.context()) ^
qHash(msg.sourceText()) ^
qHash(msg.extra(QLatin1String("po-msgid_plural"))) ^
- qHash(msg.comment());
+ qHash(msg.comment()) ^
+ qHash(msg.id());
}
bool TranslatorMessage::hasExtra(const QString &key) const
diff --git a/tools/qdoc3/cppcodemarker.cpp b/tools/qdoc3/cppcodemarker.cpp
index ed3d150..a32f92b 100644
--- a/tools/qdoc3/cppcodemarker.cpp
+++ b/tools/qdoc3/cppcodemarker.cpp
@@ -1112,14 +1112,26 @@ QList<Section> CppCodeMarker::qmlSections(const QmlClassNode* qmlClassNode,
"QML Properties",
"property",
"properties");
+ FastSection qmlattachedproperties(qmlClassNode,
+ "QML Attached Properties",
+ "property",
+ "properties");
FastSection qmlsignals(qmlClassNode,
"QML Signals",
"signal",
"signals");
+ FastSection qmlattachedsignals(qmlClassNode,
+ "QML Attached Signals",
+ "signal",
+ "signals");
FastSection qmlmethods(qmlClassNode,
"QML Methods",
"method",
"methods");
+ FastSection qmlattachedmethods(qmlClassNode,
+ "QML Attached Methods",
+ "method",
+ "methods");
NodeList::ConstIterator c = qmlClassNode->childNodes().begin();
while (c != qmlClassNode->childNodes().end()) {
@@ -1128,43 +1140,76 @@ QList<Section> CppCodeMarker::qmlSections(const QmlClassNode* qmlClassNode,
NodeList::ConstIterator p = qpgn->childNodes().begin();
while (p != qpgn->childNodes().end()) {
if ((*p)->type() == Node::QmlProperty) {
- insert(qmlproperties,*p,style,Okay);
+ const QmlPropertyNode* pn = static_cast<const QmlPropertyNode*>(*p);
+ if (pn->isAttached())
+ insert(qmlattachedproperties,*p,style,Okay);
+ else
+ insert(qmlproperties,*p,style,Okay);
}
++p;
}
}
else if ((*c)->type() == Node::QmlSignal) {
- insert(qmlsignals,*c,style,Okay);
+ const QmlSignalNode* sn = static_cast<const QmlSignalNode*>(*c);
+ if (sn->isAttached())
+ insert(qmlattachedsignals,*c,style,Okay);
+ else
+ insert(qmlsignals,*c,style,Okay);
}
else if ((*c)->type() == Node::QmlMethod) {
- insert(qmlmethods,*c,style,Okay);
+ const QmlMethodNode* mn = static_cast<const QmlMethodNode*>(*c);
+ if (mn->isAttached())
+ insert(qmlattachedmethods,*c,style,Okay);
+ else
+ insert(qmlmethods,*c,style,Okay);
}
++c;
}
append(sections,qmlproperties);
+ append(sections,qmlattachedproperties);
append(sections,qmlsignals);
+ append(sections,qmlattachedsignals);
append(sections,qmlmethods);
+ append(sections,qmlattachedmethods);
}
else if (style == Detailed) {
FastSection qmlproperties(qmlClassNode,"QML Property Documentation");
+ FastSection qmlattachedproperties(qmlClassNode,"QML Attached Property Documentation");
FastSection qmlsignals(qmlClassNode,"QML Signal Documentation");
+ FastSection qmlattachedsignals(qmlClassNode,"QML Attached Signal Documentation");
FastSection qmlmethods(qmlClassNode,"QML Method Documentation");
+ FastSection qmlattachedmethods(qmlClassNode,"QML Attached Method Documentation");
NodeList::ConstIterator c = qmlClassNode->childNodes().begin();
while (c != qmlClassNode->childNodes().end()) {
if ((*c)->subType() == Node::QmlPropertyGroup) {
- insert(qmlproperties,*c,style,Okay);
+ const QmlPropGroupNode* pgn = static_cast<const QmlPropGroupNode*>(*c);
+ if (pgn->isAttached())
+ insert(qmlattachedproperties,*c,style,Okay);
+ else
+ insert(qmlproperties,*c,style,Okay);
}
else if ((*c)->type() == Node::QmlSignal) {
- insert(qmlsignals,*c,style,Okay);
+ const QmlSignalNode* sn = static_cast<const QmlSignalNode*>(*c);
+ if (sn->isAttached())
+ insert(qmlattachedsignals,*c,style,Okay);
+ else
+ insert(qmlsignals,*c,style,Okay);
}
else if ((*c)->type() == Node::QmlMethod) {
- insert(qmlmethods,*c,style,Okay);
+ const QmlMethodNode* mn = static_cast<const QmlMethodNode*>(*c);
+ if (mn->isAttached())
+ insert(qmlattachedmethods,*c,style,Okay);
+ else
+ insert(qmlmethods,*c,style,Okay);
}
++c;
}
append(sections,qmlproperties);
+ append(sections,qmlattachedproperties);
append(sections,qmlsignals);
+ append(sections,qmlattachedsignals);
append(sections,qmlmethods);
+ append(sections,qmlattachedmethods);
}
}
diff --git a/tools/qdoc3/cppcodeparser.cpp b/tools/qdoc3/cppcodeparser.cpp
index d93e24c..84ec3f4 100644
--- a/tools/qdoc3/cppcodeparser.cpp
+++ b/tools/qdoc3/cppcodeparser.cpp
@@ -88,9 +88,12 @@ QT_BEGIN_NAMESPACE
#ifdef QDOC_QML
#define COMMAND_QMLCLASS Doc::alias("qmlclass")
#define COMMAND_QMLPROPERTY Doc::alias("qmlproperty")
+#define COMMAND_QMLATTACHEDPROPERTY Doc::alias("qmlattachedproperty")
#define COMMAND_QMLINHERITS Doc::alias("inherits")
#define COMMAND_QMLSIGNAL Doc::alias("qmlsignal")
+#define COMMAND_QMLATTACHEDSIGNAL Doc::alias("qmlattachedsignal")
#define COMMAND_QMLMETHOD Doc::alias("qmlmethod")
+#define COMMAND_QMLATTACHEDMETHOD Doc::alias("qmlattachedmethod")
#define COMMAND_QMLDEFAULT Doc::alias("default")
#endif
@@ -482,8 +485,11 @@ QSet<QString> CppCodeParser::topicCommands()
<< COMMAND_VARIABLE
<< COMMAND_QMLCLASS
<< COMMAND_QMLPROPERTY
+ << COMMAND_QMLATTACHEDPROPERTY
<< COMMAND_QMLSIGNAL
- << COMMAND_QMLMETHOD;
+ << COMMAND_QMLATTACHEDSIGNAL
+ << COMMAND_QMLMETHOD
+ << COMMAND_QMLATTACHEDMETHOD;
#else
<< COMMAND_VARIABLE;
#endif
@@ -676,7 +682,9 @@ Node *CppCodeParser::processTopicCommand(const Doc& doc,
return new QmlClassNode(tre->root(), names[0], classNode);
}
else if ((command == COMMAND_QMLSIGNAL) ||
- (command == COMMAND_QMLMETHOD)) {
+ (command == COMMAND_QMLMETHOD) ||
+ (command == COMMAND_QMLATTACHEDSIGNAL) ||
+ (command == COMMAND_QMLATTACHEDMETHOD)) {
QString element;
QString name;
QmlClassNode* qmlClass = 0;
@@ -685,9 +693,15 @@ Node *CppCodeParser::processTopicCommand(const Doc& doc,
if (n && n->subType() == Node::QmlClass) {
qmlClass = static_cast<QmlClassNode*>(n);
if (command == COMMAND_QMLSIGNAL)
- return new QmlSignalNode(qmlClass,name);
+ return new QmlSignalNode(qmlClass,name,false);
+ else if (command == COMMAND_QMLATTACHEDSIGNAL)
+ return new QmlSignalNode(qmlClass,name,true);
+ else if (command == COMMAND_QMLMETHOD)
+ return new QmlMethodNode(qmlClass,name,false);
+ else if (command == COMMAND_QMLATTACHEDMETHOD)
+ return new QmlMethodNode(qmlClass,name,true);
else
- return new QmlMethodNode(qmlClass,name);
+ return 0; // never get here.
}
}
}
@@ -759,32 +773,40 @@ bool CppCodeParser::splitQmlArg(const Doc& doc,
/*!
Process the topic \a command group with arguments \a args.
- Currently, this function is called only for \e{qmlproperty}.
+ Currently, this function is called only for \e{qmlproperty}
+ and \e{qmlattachedproperty}.
*/
Node *CppCodeParser::processTopicCommandGroup(const Doc& doc,
const QString& command,
const QStringList& args)
{
QmlPropGroupNode* qmlPropGroup = 0;
- if (command == COMMAND_QMLPROPERTY) {
+ if ((command == COMMAND_QMLPROPERTY) ||
+ (command == COMMAND_QMLATTACHEDPROPERTY)) {
QString type;
QString element;
QString property;
+ bool attached = (command == COMMAND_QMLATTACHEDPROPERTY);
QStringList::ConstIterator arg = args.begin();
if (splitQmlPropertyArg(doc,(*arg),type,element,property)) {
Node* n = tre->findNode(QStringList(element),Node::Fake);
if (n && n->subType() == Node::QmlClass) {
QmlClassNode* qmlClass = static_cast<QmlClassNode*>(n);
if (qmlClass)
- qmlPropGroup = new QmlPropGroupNode(qmlClass,property);
+ qmlPropGroup = new QmlPropGroupNode(qmlClass,
+ property,
+ attached);
}
}
if (qmlPropGroup) {
- new QmlPropertyNode(qmlPropGroup,property,type);
+ new QmlPropertyNode(qmlPropGroup,property,type,attached);
++arg;
while (arg != args.end()) {
if (splitQmlPropertyArg(doc,(*arg),type,element,property)) {
- new QmlPropertyNode(qmlPropGroup,property,type);
+ new QmlPropertyNode(qmlPropGroup,
+ property,
+ type,
+ attached);
}
++arg;
}
@@ -1969,7 +1991,8 @@ bool CppCodeParser::matchDocsAndStuff()
There is a topic command. Process it.
*/
#ifdef QDOC_QML
- if (topic == COMMAND_QMLPROPERTY) {
+ if ((topic == COMMAND_QMLPROPERTY) ||
+ (topic == COMMAND_QMLATTACHEDPROPERTY)) {
Doc nodeDoc = doc;
Node *node = processTopicCommandGroup(nodeDoc,topic,args);
if (node != 0) {
diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp
index 033c62c..18c7916 100644
--- a/tools/qdoc3/htmlgenerator.cpp
+++ b/tools/qdoc3/htmlgenerator.cpp
@@ -672,18 +672,18 @@ int HtmlGenerator::generateAtom(const Atom *atom,
break;
case Atom::SinceList:
{
- NodeMultiMapMap::const_iterator v;
- v = nodeMultiMapMap.find(atom->string());
- NodeMapMap::const_iterator nc;
- nc = nodeMapMap.find(atom->string());
- if ((v != nodeMultiMapMap.constEnd()) && !v.value().isEmpty()) {
+ NewSinceMaps::const_iterator nsmap;
+ nsmap = newSinceMaps.find(atom->string());
+ NewClassMaps::const_iterator ncmap;
+ ncmap = newClassMaps.find(atom->string());
+ if ((nsmap != newSinceMaps.constEnd()) && !nsmap.value().isEmpty()) {
QList<Section> sections;
QList<Section>::ConstIterator s;
for (int i=0; i<LastSinceType; ++i)
sections.append(Section(sinceTitle(i),QString(),QString()));
- NodeMultiMap::const_iterator n = v.value().constBegin();
- while (n != v.value().constEnd()) {
+ NodeMultiMap::const_iterator n = nsmap.value().constBegin();
+ while (n != nsmap.value().constEnd()) {
const Node* node = n.value();
switch (node->type()) {
case Node::Namespace:
@@ -741,35 +741,63 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
++n;
}
+
+ /*
+ First generate the table of contents.
+ */
+ out() << "<ul>\n";
+ s = sections.constBegin();
+ while (s != sections.constEnd()) {
+ if (!(*s).members.isEmpty()) {
+
+ out() << "<li>"
+ << "<a href=\"#"
+ << Doc::canonicalTitle((*s).name)
+ << "\">"
+ << (*s).name
+ << "</a></li>\n";
+ }
+ ++s;
+ }
+ out() << "</ul>\n";
+
int idx = 0;
s = sections.constBegin();
while (s != sections.constEnd()) {
if (!(*s).members.isEmpty()) {
out() << "<a name=\""
- << registerRef((*s).name.toLower())
+ << Doc::canonicalTitle((*s).name)
<< "\"></a>\n";
out() << "<h3>" << protect((*s).name) << "</h3>\n";
if (idx == Class)
- generateCompactList(0, marker, nc.value(), QString("Q"));
+ generateCompactList(0, marker, ncmap.value(), QString("Q"));
else if (idx == MemberFunction) {
- NodeMultiMapMap nodemultimapmap;
- NodeMultiMapMap::iterator nmmap;
+ ParentMaps parentmaps;
+ ParentMaps::iterator pmap;
NodeList::const_iterator i = s->members.constBegin();
while (i != s->members.constEnd()) {
Node* p = (*i)->parent();
- nmmap = nodemultimapmap.find(p->name());
- if (nmmap == nodemultimapmap.end())
- nmmap = nodemultimapmap.insert(p->name(),NodeMultiMap());
- nmmap->insert((*i)->name(),(*i));
+ pmap = parentmaps.find(p);
+ if (pmap == parentmaps.end())
+ pmap = parentmaps.insert(p,NodeMultiMap());
+ pmap->insert((*i)->name(),(*i));
++i;
}
- nmmap = nodemultimapmap.begin();
- while (nmmap != nodemultimapmap.end()) {
- NodeList nlist = nmmap->values();
- out() << "<p>New functions in " << protect(nmmap.key()) << ":</p>\n";
+ pmap = parentmaps.begin();
+ while (pmap != parentmaps.end()) {
+ NodeList nlist = pmap->values();
+ out() << "<p>Class ";
+
+ out() << "<a href=\""
+ << linkForNode(pmap.key(), 0)
+ << "\">";
+ QStringList pieces = fullName(pmap.key(), 0, marker).split("::");
+ out() << protect(pieces.last());
+ out() << "</a>" << ":</p>\n";
+
generateSection(nlist, 0, marker, CodeMarker::Summary);
out() << "<br />";
- ++nmmap;
+ ++pmap;
}
}
else
@@ -1124,7 +1152,10 @@ int HtmlGenerator::generateAtom(const Atom *atom,
}
if (node)
- generateTableOfContents(node, marker, sectioningUnit, numColumns,
+ generateTableOfContents(node,
+ marker,
+ sectioningUnit,
+ numColumns,
relative);
}
break;
@@ -1209,7 +1240,7 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner,
generateHeader(title, inner, marker, true);
generateTitle(title, subtitleText, SmallSubTitle, inner, marker);
-#ifdef QDOC_QML
+#ifdef QDOC_QML
if (classe && !classe->qmlElement().isEmpty()) {
generateInstantiatedBy(classe,marker);
}
@@ -2112,7 +2143,8 @@ void HtmlGenerator::generateCompactList(const Node *relative,
/*
If commonPrefix is not empty, then the caller knows what
- the common prefix is, so just use that.
+ the common prefix is and has passed it in, so just use that
+ one.
*/
int commonPrefixLen = commonPrefix.length();
if (commonPrefixLen == 0) {
@@ -2120,10 +2152,15 @@ void HtmlGenerator::generateCompactList(const Node *relative,
QString last;
/*
- First, find out the common prefix of all non-namespaced
- classes. For Qt, the prefix is Q. It can easily be derived
- from the first and last classes in alphabetical order
- (QAccel and QXtWidget in Qt 2.1).
+ The caller didn't pass in a common prefix, so get the common
+ prefix by looking at the class names of the first and last
+ classes in the class map. Discard any namespace names and
+ just use the bare class names. For Qt, the prefix is "Q".
+
+ Note that the algorithm used here to derive the common prefix
+ from the first and last classes in alphabetical order (QAccel
+ and QXtWidget in Qt 2.1), fails if either class name does not
+ begin with Q.
*/
NodeMap::const_iterator iter = classMap.begin();
@@ -2164,8 +2201,7 @@ void HtmlGenerator::generateCompactList(const Node *relative,
Divide the data into 37 paragraphs: 0, ..., 9, A, ..., Z,
underscore (_). QAccel will fall in paragraph 10 (A) and
QXtWidget in paragraph 33 (X). This is the only place where we
- assume that NumParagraphs is 37. Each paragraph is a
- NodeMap.
+ assume that NumParagraphs is 37. Each paragraph is a NodeMap.
*/
NodeMap paragraph[NumParagraphs+1];
QString paragraphName[NumParagraphs+1];
@@ -3432,12 +3468,12 @@ QString HtmlGenerator::refForNode(const Node *node)
}
break;
case Node::Property:
-#ifdef QDOC_QML
+#ifdef QDOC_QML
case Node::QmlProperty:
#endif
ref = node->name() + "-prop";
break;
-#ifdef QDOC_QML
+#ifdef QDOC_QML
case Node::QmlSignal:
ref = node->name() + "-signal";
break;
@@ -3644,53 +3680,54 @@ void HtmlGenerator::findAllClasses(const InnerNode *node)
}
/*!
- For generating the "Since x.y" page.
+ For generating the "New Classes... in 4.6" section on the
+ What's New in 4.6" page.
*/
void HtmlGenerator::findAllSince(const InnerNode *node)
{
- NodeList::const_iterator c = node->childNodes().constBegin();
- while (c != node->childNodes().constEnd()) {
- QString sinceVersion = (*c)->since();
- if (((*c)->access() != Node::Private) && !sinceVersion.isEmpty()) {
- NodeMultiMapMap::iterator vmap = nodeMultiMapMap.find(sinceVersion);
- if (vmap == nodeMultiMapMap.end())
- vmap = nodeMultiMapMap.insert(sinceVersion,NodeMultiMap());
- NodeMapMap::iterator ncmap = nodeMapMap.find(sinceVersion);
- if (ncmap == nodeMapMap.end())
- ncmap = nodeMapMap.insert(sinceVersion,NodeMap());
+ NodeList::const_iterator child = node->childNodes().constBegin();
+ while (child != node->childNodes().constEnd()) {
+ QString sinceVersion = (*child)->since();
+ if (((*child)->access() != Node::Private) && !sinceVersion.isEmpty()) {
+ NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceVersion);
+ if (nsmap == newSinceMaps.end())
+ nsmap = newSinceMaps.insert(sinceVersion,NodeMultiMap());
+ NewClassMaps::iterator ncmap = newClassMaps.find(sinceVersion);
+ if (ncmap == newClassMaps.end())
+ ncmap = newClassMaps.insert(sinceVersion,NodeMap());
- if ((*c)->type() == Node::Function) {
- FunctionNode *func = static_cast<FunctionNode *>(*c);
+ if ((*child)->type() == Node::Function) {
+ FunctionNode *func = static_cast<FunctionNode *>(*child);
if ((func->status() > Node::Obsolete) &&
(func->metaness() != FunctionNode::Ctor) &&
(func->metaness() != FunctionNode::Dtor)) {
- vmap.value().insert(func->name(),(*c));
+ nsmap.value().insert(func->name(),(*child));
}
}
- else if ((*c)->url().isEmpty()) {
- if ((*c)->type() == Node::Class && !(*c)->doc().isEmpty()) {
- QString className = (*c)->name();
- if ((*c)->parent() &&
- (*c)->parent()->type() == Node::Namespace &&
- !(*c)->parent()->name().isEmpty())
- className = (*c)->parent()->name()+"::"+className;
- vmap.value().insert(className,(*c));
- ncmap.value().insert(className,(*c));
+ else if ((*child)->url().isEmpty()) {
+ if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) {
+ QString className = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ className = (*child)->parent()->name()+"::"+className;
+ nsmap.value().insert(className,(*child));
+ ncmap.value().insert(className,(*child));
}
}
else {
- QString name = (*c)->name();
- if ((*c)->parent() &&
- (*c)->parent()->type() == Node::Namespace &&
- !(*c)->parent()->name().isEmpty())
- name = (*c)->parent()->name()+"::"+name;
- vmap.value().insert(name,(*c));
+ QString name = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ name = (*child)->parent()->name()+"::"+name;
+ nsmap.value().insert(name,(*child));
}
- if ((*c)->isInnerNode()) {
- findAllSince(static_cast<InnerNode *>(*c));
+ if ((*child)->isInnerNode()) {
+ findAllSince(static_cast<InnerNode *>(*child));
}
}
- ++c;
+ ++child;
}
}
diff --git a/tools/qdoc3/htmlgenerator.h b/tools/qdoc3/htmlgenerator.h
index fabfed1..40117df 100644
--- a/tools/qdoc3/htmlgenerator.h
+++ b/tools/qdoc3/htmlgenerator.h
@@ -68,9 +68,10 @@ struct NavigationBar
#endif
typedef QMultiMap<QString, Node*> NodeMultiMap;
-typedef QMap<QString, NodeMultiMap> NodeMultiMapMap;
+typedef QMap<QString, NodeMultiMap> NewSinceMaps;
+typedef QMap<Node*, NodeMultiMap> ParentMaps;
typedef QMap<QString, const Node*> NodeMap;
-typedef QMap<QString, NodeMap> NodeMapMap;
+typedef QMap<QString, NodeMap> NewClassMaps;
class HelpProjectWriter;
@@ -311,9 +312,9 @@ class HtmlGenerator : public PageGenerator
#endif
QMap<QString, NodeMap > funcIndex;
QMap<Text, const Node *> legaleseTexts;
- NodeMultiMapMap nodeMultiMapMap;
+ NewSinceMaps newSinceMaps;
static QString sinceTitles[];
- NodeMapMap nodeMapMap;
+ NewClassMaps newClassMaps;
};
#define HTMLGENERATOR_ADDRESS "address"
diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp
index 558808f..61855bc 100644
--- a/tools/qdoc3/node.cpp
+++ b/tools/qdoc3/node.cpp
@@ -1158,8 +1158,12 @@ QString QmlClassNode::fileBase() const
Constructor for the Qml property group node. \a parent is
always a QmlClassNode.
*/
-QmlPropGroupNode::QmlPropGroupNode(QmlClassNode* parent, const QString& name)
- : FakeNode(parent, name, QmlPropertyGroup), isdefault(false)
+QmlPropGroupNode::QmlPropGroupNode(QmlClassNode* parent,
+ const QString& name,
+ bool attached)
+ : FakeNode(parent, name, QmlPropertyGroup),
+ isdefault(false),
+ att(attached)
{
// nothing.
}
@@ -1169,11 +1173,13 @@ QmlPropGroupNode::QmlPropGroupNode(QmlClassNode* parent, const QString& name)
*/
QmlPropertyNode::QmlPropertyNode(QmlPropGroupNode *parent,
const QString& name,
- const QString& type)
+ const QString& type,
+ bool attached)
: LeafNode(QmlProperty, parent, name),
dt(type),
sto(Trool_Default),
- des(Trool_Default)
+ des(Trool_Default),
+ att(attached)
{
// nothing.
}
@@ -1204,8 +1210,10 @@ bool QmlPropertyNode::fromTrool(Trool troolean, bool defaultValue)
/*!
Constructor for the QML signal node.
*/
-QmlSignalNode::QmlSignalNode(QmlClassNode *parent, const QString& name)
- : LeafNode(QmlSignal, parent, name)
+QmlSignalNode::QmlSignalNode(QmlClassNode *parent,
+ const QString& name,
+ bool attached)
+ : LeafNode(QmlSignal, parent, name), att(attached)
{
// nothing.
}
@@ -1213,8 +1221,10 @@ QmlSignalNode::QmlSignalNode(QmlClassNode *parent, const QString& name)
/*!
Constructor for the QML method node.
*/
-QmlMethodNode::QmlMethodNode(QmlClassNode *parent, const QString& name)
- : LeafNode(QmlMethod, parent, name)
+QmlMethodNode::QmlMethodNode(QmlClassNode *parent,
+ const QString& name,
+ bool attached)
+ : LeafNode(QmlMethod, parent, name), att(attached)
{
// nothing.
}
diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h
index f933270..20ccb95 100644
--- a/tools/qdoc3/node.h
+++ b/tools/qdoc3/node.h
@@ -369,15 +369,19 @@ class QmlClassNode : public FakeNode
class QmlPropGroupNode : public FakeNode
{
public:
- QmlPropGroupNode(QmlClassNode* parent, const QString& name);
+ QmlPropGroupNode(QmlClassNode* parent,
+ const QString& name,
+ bool attached);
virtual ~QmlPropGroupNode() { }
const QString& element() const { return name(); }
void setDefault() { isdefault = true; }
bool isDefault() const { return isdefault; }
+ bool isAttached() const { return att; }
private:
bool isdefault;
+ bool att;
};
class QmlPropertyNode : public LeafNode
@@ -385,7 +389,8 @@ class QmlPropertyNode : public LeafNode
public:
QmlPropertyNode(QmlPropGroupNode* parent,
const QString& name,
- const QString& type);
+ const QString& type,
+ bool attached);
virtual ~QmlPropertyNode() { }
void setDataType(const QString& dataType) { dt = dataType; }
@@ -396,6 +401,7 @@ class QmlPropertyNode : public LeafNode
QString qualifiedDataType() const { return dt; }
bool isStored() const { return fromTrool(sto,true); }
bool isDesignable() const { return fromTrool(des,false); }
+ bool isAttached() const { return att; }
const QString& element() const { return parent()->name(); }
@@ -408,24 +414,37 @@ class QmlPropertyNode : public LeafNode
QString dt;
Trool sto;
Trool des;
+ bool att;
};
class QmlSignalNode : public LeafNode
{
public:
- QmlSignalNode(QmlClassNode* parent, const QString& name);
+ QmlSignalNode(QmlClassNode* parent,
+ const QString& name,
+ bool attached);
virtual ~QmlSignalNode() { }
const QString& element() const { return parent()->name(); }
+ bool isAttached() const { return att; }
+
+ private:
+ bool att;
};
class QmlMethodNode : public LeafNode
{
public:
- QmlMethodNode(QmlClassNode* parent, const QString& name);
+ QmlMethodNode(QmlClassNode* parent,
+ const QString& name,
+ bool attached);
virtual ~QmlMethodNode() { }
const QString& element() const { return parent()->name(); }
+ bool isAttached() const { return att; }
+
+ private:
+ bool att;
};
#endif
diff --git a/tools/qdoc3/test/qt-api-only-with-xcode.qdocconf b/tools/qdoc3/test/qt-api-only-with-xcode.qdocconf
deleted file mode 100644
index 0d78cda..0000000
--- a/tools/qdoc3/test/qt-api-only-with-xcode.qdocconf
+++ /dev/null
@@ -1,29 +0,0 @@
-include(qt-build-docs-with-xcode.qdocconf)
-
-# Ensures that the generated index contains a URL that can be used by the
-# tools documentation (assistant.qdocconf, designer.qdocconf, linguist.qdocconf,
-# qmake.qdocconf).
-
-url = ./
-
-# Ensures that the documentation for the tools is not included in the generated
-# .qhp file.
-
-qhp.Qt.excluded = $QT_SOURCE_TREE/doc/src/development/assistant-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/simpletextviewer.qdoc \
- $QT_SOURCE_TREE/doc/src/development/designer-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/calculatorbuilder.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/calculatorform.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/customwidgetplugin.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/taskmenuextension.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/containerextension.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/worldtimeclockbuilder.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/worldtimeclockplugin.qdoc \
- $QT_SOURCE_TREE/doc/src/internationalization/linguist-manual.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/hellotr.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/arrowpad.qdoc \
- $QT_SOURCE_TREE/doc/src/examples/trollprint.qdoc \
- $QT_SOURCE_TREE/doc/src/development/qmake-manual.qdoc
-
-outputdir = $QT_BUILD_TREE/doc-build/html-qt
-base = file:$QT_BUILD_TREE/doc-build/html-qt
diff --git a/tools/qdoc3/test/qt-build-docs-with-xcode.qdocconf b/tools/qdoc3/test/qt-build-docs-with-xcode.qdocconf
deleted file mode 100644
index e4be476..0000000
--- a/tools/qdoc3/test/qt-build-docs-with-xcode.qdocconf
+++ /dev/null
@@ -1,3 +0,0 @@
-include( qt-build-docs.qdocconf )
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qdoc3/test/qt-with-xcode.qdocconf b/tools/qdoc3/test/qt-with-xcode.qdocconf
deleted file mode 100644
index 932f6d9..0000000
--- a/tools/qdoc3/test/qt-with-xcode.qdocconf
+++ /dev/null
@@ -1,3 +0,0 @@
-include( qt.qdocconf )
-
-HTML.generatemacrefs = "true"
diff --git a/tools/qtestlib/wince/cetest/main.cpp b/tools/qtestlib/wince/cetest/main.cpp
index 9df70e7..e00c0e7 100644
--- a/tools/qtestlib/wince/cetest/main.cpp
+++ b/tools/qtestlib/wince/cetest/main.cpp
@@ -237,6 +237,8 @@ int main(int argc, char **argv)
debugOutput(QString::fromLatin1("Using Project File:").append(proFile),1);
}
+ Option::before_user_vars.append("CONFIG+=build_pass");
+
// read target and deployment rules
int qmakeArgc = 1;
char* qmakeArgv[] = { "qmake.exe" };
diff --git a/translations/assistant_adp_pl.ts b/translations/assistant_adp_pl.ts
index 4b845f2..17c2c5c 100644
--- a/translations/assistant_adp_pl.ts
+++ b/translations/assistant_adp_pl.ts
@@ -286,11 +286,6 @@ Assistant nie będzie działał!</translation>
</message>
<message>
<location/>
- <source>Enter searchword(s).</source>
- <translation>Wprowadź wyrażenie(a) do szukania.</translation>
- </message>
- <message>
- <location/>
<source>&lt;b&gt;Enter search word(s).&lt;/b&gt;&lt;p&gt;Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.&lt;/p&gt;</source>
<translation>&lt;b&gt;Wprowadź wyrażenie(a) do szukania.&lt;b&gt;&lt;p&gt;Wprowadź w tym okienku wyrażenia, których szukasz. Wyrażenia mogą zawierać znaczniki (*). Dla wyszukania ciągu wyrażeń umieść całość w cudzysłowie.&lt;/p&gt;</translation>
</message>
@@ -306,11 +301,6 @@ Assistant nie będzie działał!</translation>
</message>
<message>
<location/>
- <source>Display the help page.</source>
- <translation>Pokaż stronę pomocy.</translation>
- </message>
- <message>
- <location/>
<source>Display the help page for the full text search.</source>
<translation>Pokaż stronę pomocy dla pełnego wyszukiwania.</translation>
</message>
@@ -321,11 +311,6 @@ Assistant nie będzie działał!</translation>
</message>
<message>
<location/>
- <source>Start searching.</source>
- <translation>Rozpocznij wyszukiwanie.</translation>
- </message>
- <message>
- <location/>
<source>Pressing this button starts the search.</source>
<translation>Naciśnięcie tego przycisku powoduje rozpoczęcie wyszukiwania.</translation>
</message>
@@ -343,6 +328,21 @@ Assistant nie będzie działał!</translation>
<numerusform>Znaleziono %n dokumentów.</numerusform>
</translation>
</message>
+ <message>
+ <location filename="../tools/assistant/compat/helpdialog.ui"/>
+ <source>Enter searchword(s)</source>
+ <translation>Wprowadź wyrażenie(a) do szukania</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Display the help page</source>
+ <translation>Pokaż stronę pomocy</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Start searching</source>
+ <translation>Rozpocznij wyszukiwanie</translation>
+ </message>
</context>
<context>
<name>HelpWindow</name>
@@ -425,7 +425,7 @@ Assistant nie będzie działał!</translation>
<translation>Ctrl+M</translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+44"/>
<source>Initializing Qt Assistant...</source>
<translation>Inicjalizowanie Qt Assistant...</translation>
</message>
@@ -480,15 +480,7 @@ Assistant nie będzie działał!</translation>
<translation>Pokazuje główną stronę wybranego zestawu dokumentacji.</translation>
</message>
<message>
- <source>Open Source Edition</source>
- <translation type="obsolete">Wydanie Open Source</translation>
- </message>
- <message>
- <source>This version of Qt Assistant is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development.</source>
- <translation type="obsolete">Ta wersja Qt Assistant jest częścią wydania Qt Open Source, przeznaczonego do tworzenia aplikacji Open Source. Qt zawiera obszerny zestaw bibliotek wykorzystywanych do pisania przenośnych aplikacji.</translation>
- </message>
- <message>
- <location line="+49"/>
+ <location line="+39"/>
<location line="+1"/>
<source>Qt Assistant</source>
<translation>Qt Assistant</translation>
@@ -499,7 +491,7 @@ Assistant nie będzie działał!</translation>
<translation>Nie można otworzyć pliku: &apos;%1&apos; z informacjami o aplikacji</translation>
</message>
<message>
- <location line="+201"/>
+ <location line="+203"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -515,13 +507,9 @@ Assistant nie będzie działał!</translation>
<translation>Nie można otworzyć pliku do zapisu!</translation>
</message>
<message>
- <source>Qt Assistant by Trolltech</source>
- <translation type="obsolete">Qt Assistant Trolltech&apos;a</translation>
- </message>
- <message>
<location filename="../tools/assistant/compat/mainwindow.ui"/>
<source>Qt Assistant by Nokia</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Assistant Nokii</translation>
</message>
<message>
<location/>
@@ -858,21 +846,13 @@ Assistant nie będzie działał!</translation>
<source>Font Settings...</source>
<translation>Ustawienia czcionki...</translation>
</message>
- <message>
- <source>You need a commercial Qt license for development of proprietary (closed source) applications. Please see &lt;a href=&quot;http://qt.nokia.com/company/model&quot;&gt;qt.nokia.com/company/model&lt;/a&gt; for an overview of Qt licensing.</source>
- <translation type="obsolete">Aby móc tworzyć przy pomocy Qt własne aplikacje bez publikowania kodu (closed source) potrzebujesz wydania komercyjnego. Opis sposobów licencjonowania Qt znajduje się na stronie &lt;a href=&quot;http://qt.nokia.com/company/model.html&quot;&gt;qt.nokia.com/company/model.html&lt;/a&gt;.</translation>
- </message>
</context>
<context>
<name>QObject</name>
<message>
- <source>Qt Assistant by Trolltech</source>
- <translation type="obsolete">Qt Assistant Trolltech&apos;a</translation>
- </message>
- <message>
<location filename="../tools/assistant/compat/config.cpp" line="+350"/>
<source>Qt Assistant by Nokia</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Assistant Nokii</translation>
</message>
</context>
<context>
diff --git a/translations/assistant_adp_ru.ts b/translations/assistant_adp_ru.ts
index c47798b..db0c9df 100644
--- a/translations/assistant_adp_ru.ts
+++ b/translations/assistant_adp_ru.ts
@@ -19,12 +19,12 @@
<message>
<location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+77"/>
<source>&amp;Family</source>
- <translation>Се&amp;мейство</translation>
+ <translation>&amp;Шрифт</translation>
</message>
<message>
<location line="+4"/>
<source>&amp;Style</source>
- <translation>&amp;Стиль</translation>
+ <translation>&amp;Начертание</translation>
</message>
<message>
<location line="-18"/>
@@ -39,7 +39,7 @@
<message>
<location line="+11"/>
<source>&amp;Point size</source>
- <translation>&amp;Размер в пикселях</translation>
+ <translation>&amp;Размер</translation>
</message>
</context>
<context>
@@ -116,7 +116,7 @@
<message>
<location line="-31"/>
<source>&lt;b&gt;Help&lt;/b&gt;&lt;p&gt;Choose the topic you want help on from the contents list, or search the index for keywords.&lt;/p&gt;</source>
- <translation type="unfinished">&lt;b&gt;Справка&lt;/b&gt;&lt;p&gt;Выберите раздел справки из содержания или воспользуйтесь поиском по предметному указателю.&lt;/p&gt;</translation>
+ <translation type="unfinished">&lt;b&gt;Справка&lt;/b&gt;&lt;p&gt;Выберите раздел справки из оглавления или воспользуйтесь поиском по предметному указателю.&lt;/p&gt;</translation>
</message>
<message>
<location line="+85"/>
@@ -141,7 +141,7 @@
<message>
<location filename="../tools/assistant/compat/helpdialog.ui" line="-134"/>
<source>Con&amp;tents</source>
- <translation>Содер&amp;жание</translation>
+ <translation>&amp;Оглавление</translation>
</message>
<message>
<location line="+144"/>
@@ -154,17 +154,27 @@
<translation>Удалить выбранную закладку.</translation>
</message>
<message>
- <location line="+92"/>
+ <location line="+51"/>
+ <source>Enter searchword(s)</source>
+ <translation>Введите одно или несколько слов для поиска</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Display the help page</source>
+ <translation>Показать страницу справки</translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>Display the help page for the full text search.</source>
<translation>Показать справку по полнотекстовому поиску.</translation>
</message>
<message>
- <location line="-3"/>
- <source>Display the help page.</source>
- <translation>Показать страницу справки.</translation>
+ <location line="+26"/>
+ <source>Start searching</source>
+ <translation>Начать поиск</translation>
</message>
<message>
- <location line="-240"/>
+ <location line="-269"/>
<source>Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search.</source>
<translation>Отображает список разделов, распредёленных по категориям, указатель или закладки. Последняя вкладка содержит панель полнотекстового поиска.</translation>
</message>
@@ -200,11 +210,6 @@ Skipping file.</source>
<translation>Введите ключевое слово</translation>
</message>
<message>
- <location line="+142"/>
- <source>Enter searchword(s).</source>
- <translation>Введите одно или несколько слов для поиска.</translation>
- </message>
- <message>
<location filename="../tools/assistant/compat/helpdialog.cpp" line="-725"/>
<source>Failed to load keyword index file
Assistant will not work!</source>
@@ -219,7 +224,7 @@ Assistant will not work!</source>
Qt Assistant не будет работать!</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/helpdialog.ui" line="+20"/>
+ <location filename="../tools/assistant/compat/helpdialog.ui" line="+162"/>
<source>Found &amp;Documents:</source>
<translation>Найденные &amp;документы:</translation>
</message>
@@ -294,11 +299,6 @@ Qt Assistant не будет работать!</translation>
<translation>&amp;Искать:</translation>
</message>
<message>
- <location line="+77"/>
- <source>Start searching.</source>
- <translation>Начать поиск.</translation>
- </message>
- <message>
<location filename="../tools/assistant/compat/helpdialog.cpp" line="+56"/>
<source>The closing quotation mark is missing.</source>
<translation>Пропущена закрывающая кавычка.</translation>
@@ -316,7 +316,7 @@ Qt Assistant не будет работать!</translation>
<translation>Предупреждение</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/helpdialog.ui" line="-240"/>
+ <location filename="../tools/assistant/compat/helpdialog.ui" line="-163"/>
<location line="+74"/>
<source>column 1</source>
<translation>столбец 1</translation>
@@ -407,7 +407,7 @@ Qt Assistant не будет работать!</translation>
<context>
<name>MainWindow</name>
<message>
- <location filename="../tools/assistant/compat/mainwindow.ui" line="+375"/>
+ <location filename="../tools/assistant/compat/mainwindow.ui" line="+373"/>
<location line="+3"/>
<source>&quot;What&apos;s This?&quot; context sensitive help.</source>
<translation>Контекстная справка &quot;Что это?&quot;.</translation>
@@ -483,7 +483,7 @@ Qt Assistant не будет работать!</translation>
<translation>&amp;Окно</translation>
</message>
<message>
- <location line="+429"/>
+ <location line="+431"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -533,9 +533,9 @@ Qt Assistant не будет работать!</translation>
<translation>Показать дополнительную информацию о Qt Assistant.</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="-514"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="-506"/>
<source>Displays the main page of a specific documentation set.</source>
- <translation type="unfinished">Открывает стартовую страницу выбранного набора документации.</translation>
+ <translation>Открывает стартовую страницу выбранного набора документации.</translation>
</message>
<message>
<location filename="../tools/assistant/compat/mainwindow.ui" line="-103"/>
@@ -543,7 +543,7 @@ Qt Assistant не будет работать!</translation>
<translation>В&amp;ыход</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="+69"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="+59"/>
<source>Failed to open about application contents in file: &apos;%1&apos;</source>
<translation>Не удалось получить информацию о приложении из файла: &apos;%1&apos;</translation>
</message>
@@ -578,12 +578,12 @@ Qt Assistant не будет работать!</translation>
<translation>Переход на следующую страницу.</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="-191"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="-181"/>
<source>Initializing Qt Assistant...</source>
<translation>Инициализация Qt Assistant...</translation>
</message>
<message>
- <location line="-35"/>
+ <location line="-45"/>
<source>Minimize</source>
<translation>Свернуть</translation>
</message>
@@ -639,7 +639,7 @@ Qt Assistant не будет работать!</translation>
<translation>Выйти из Qt Assistant.</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="+458"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="+460"/>
<location line="+6"/>
<source>Save Page</source>
<translation>Сохранить страницу</translation>
@@ -652,17 +652,17 @@ Qt Assistant не будет работать!</translation>
<message>
<location line="+14"/>
<source>Select the page in contents tab.</source>
- <translation>Выбрать страницу во вкладке содержания.</translation>
+ <translation>Выбрать страницу во вкладке оглавления.</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="-691"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="-693"/>
<source>Sidebar</source>
<translation>Боковая панель</translation>
</message>
<message>
<location filename="../tools/assistant/compat/mainwindow.ui" line="-3"/>
<source>Sync with Table of Contents</source>
- <translation>Синхронизировать с содержанием</translation>
+ <translation>Синхронизировать с оглавлением</translation>
</message>
<message>
<location line="-380"/>
@@ -670,7 +670,7 @@ Qt Assistant не будет работать!</translation>
<translation>Панель инструментов</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="+97"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="+107"/>
<source>Views</source>
<translation>Виды</translation>
</message>
@@ -700,12 +700,12 @@ Qt Assistant не будет работать!</translation>
<translation>Уменьшить размер шрифта.</translation>
</message>
<message>
- <location filename="../tools/assistant/compat/mainwindow.cpp" line="-76"/>
+ <location filename="../tools/assistant/compat/mainwindow.cpp" line="-86"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+60"/>
+ <location line="+70"/>
<source>SHIFT+CTRL+=</source>
<translation type="unfinished"></translation>
</message>
diff --git a/translations/assistant_pl.ts b/translations/assistant_pl.ts
index 7c99c8b..069b5a0 100644
--- a/translations/assistant_pl.ts
+++ b/translations/assistant_pl.ts
@@ -31,11 +31,11 @@
<context>
<name>BookmarkDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="+185"/>
+ <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="+184"/>
<location line="+18"/>
- <location line="+36"/>
- <location line="+24"/>
- <location line="+32"/>
+ <location line="+39"/>
+ <location line="+18"/>
+ <location line="+30"/>
<source>Bookmarks</source>
<translation>Zakładki</translation>
</message>
@@ -65,7 +65,7 @@
<translation>Nowy katalog</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="-69"/>
+ <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="-61"/>
<source>Delete Folder</source>
<translation>Usuń katalog</translation>
</message>
@@ -78,12 +78,12 @@
<context>
<name>BookmarkManager</name>
<message>
- <location line="+450"/>
+ <location line="+434"/>
<source>Bookmarks</source>
<translation>Zakładki</translation>
</message>
<message>
- <location line="+36"/>
+ <location line="+37"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
@@ -93,7 +93,7 @@
<translation>Zamierzasz usunąć katalog co spowoduje również usunięcie jego zawartości. Czy chcesz kontynuować?</translation>
</message>
<message>
- <location line="+109"/>
+ <location line="+143"/>
<location line="+9"/>
<source>New Folder</source>
<translation>Nowy katalog</translation>
@@ -102,25 +102,17 @@
<context>
<name>BookmarkWidget</name>
<message>
- <location line="-391"/>
+ <location line="-416"/>
<source>Filter:</source>
<translation>Filtr:</translation>
</message>
<message>
- <source>Bookmarks</source>
- <translation type="obsolete">Zakładki</translation>
- </message>
- <message>
- <location line="+32"/>
+ <location line="+33"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
<message>
- <source>You are going to delete a Folder, this will also&lt;br&gt;remove it&apos;s content. Are you sure to continue?</source>
- <translation type="obsolete">Zamierzasz usunąć katalog co spowoduje również usunięcie jego zawartości. Czy chcesz kontynuować?</translation>
- </message>
- <message>
- <location line="-78"/>
+ <location line="-79"/>
<source>Delete Folder</source>
<translation>Usuń katalog</translation>
</message>
@@ -150,7 +142,7 @@
<translation>Zmień nazwę zakładki</translation>
</message>
<message>
- <location line="+61"/>
+ <location line="+62"/>
<source>Add</source>
<translation>Dodaj</translation>
</message>
@@ -158,7 +150,7 @@
<context>
<name>CentralWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+195"/>
+ <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+238"/>
<source>Add new page</source>
<translation>Dodaj nową stronę</translation>
</message>
@@ -168,38 +160,38 @@
<translation>Zamknij bieżącą stronę</translation>
</message>
<message>
- <location line="+265"/>
+ <location line="+312"/>
<source>Print Document</source>
<translation>Wydrukuj dokument</translation>
</message>
<message>
- <location line="+147"/>
+ <location line="+148"/>
<location line="+2"/>
<source>unknown</source>
<translation>nieznany</translation>
</message>
<message>
- <location line="+96"/>
+ <location line="+93"/>
<source>Add New Page</source>
<translation>Dodaj nową stronę</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Close This Page</source>
<translation>Zamknij tą stronę</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Close Other Pages</source>
<translation>Zamknij inne strony</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Add Bookmark for this Page...</source>
<translation>Dodaj zakładkę dla tej strony...</translation>
</message>
<message>
- <location line="+257"/>
+ <location line="+255"/>
<source>Search</source>
<translation>Wyszukaj</translation>
</message>
@@ -207,7 +199,7 @@
<context>
<name>ContentWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/contentwindow.cpp" line="+155"/>
+ <location filename="../tools/assistant/tools/assistant/contentwindow.cpp" line="+158"/>
<source>Open Link</source>
<translation>Otwórz odsyłacz</translation>
</message>
@@ -220,10 +212,6 @@
<context>
<name>FilterNameDialogClass</name>
<message>
- <source>FilterNameDialog</source>
- <translation type="obsolete">FilterNameDialog</translation>
- </message>
- <message>
<location filename="../tools/assistant/tools/assistant/filternamedialog.ui"/>
<source>Add Filter Name</source>
<translation>Dodaj nazwę filtru</translation>
@@ -237,17 +225,17 @@
<context>
<name>FindWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-863"/>
+ <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-955"/>
<source>Previous</source>
<translation>Poprzedni</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+4"/>
<source>Next</source>
<translation>Następny</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+4"/>
<source>Case Sensitive</source>
<translation>Uwzględniaj wielkość liter</translation>
</message>
@@ -293,17 +281,11 @@
<context>
<name>HelpViewer</name>
<message>
- <location filename="../tools/assistant/tools/assistant/helpviewer.cpp" line="+481"/>
+ <location filename="../tools/assistant/tools/assistant/helpviewer.cpp" line="+492"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
- <source>Unable to launch web browser.
-</source>
- <translation type="obsolete">Nie można uruchomić przeglądarki internetowej.
-</translation>
- </message>
- <message>
<location line="+1"/>
<source>OK</source>
<translation>OK</translation>
@@ -324,12 +306,12 @@
<translation>Otwórz odsyłacz w nowej karcie Ctrl+LMB</translation>
</message>
<message>
- <location line="-267"/>
+ <location line="-275"/>
<source>Open Link in New Tab</source>
<translation>Otwórz odsyłacz w nowej karcie</translation>
</message>
<message>
- <location line="+201"/>
+ <location line="+209"/>
<source>Unable to launch external application.
</source>
<translation>Nie można uruchomić zewnętrznej aplikacji.
@@ -357,13 +339,13 @@
<context>
<name>InstallDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+75"/>
<location filename="../tools/assistant/tools/assistant/installdialog.ui"/>
+ <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+76"/>
<source>Install Documentation</source>
<translation>Zainstaluj dokumentację</translation>
</message>
<message>
- <location line="+30"/>
+ <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+30"/>
<source>Downloading documentation info...</source>
<translation>Pobieranie informacji o dokumentacji...</translation>
</message>
@@ -457,48 +439,43 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+108"/>
- <location line="+350"/>
+ <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+110"/>
+ <location line="+391"/>
<source>Index</source>
<translation>Indeks</translation>
</message>
<message>
- <location line="-344"/>
- <location line="+342"/>
+ <location line="-385"/>
+ <location line="+383"/>
<source>Contents</source>
<translation>Spis treści</translation>
</message>
<message>
- <location line="-337"/>
- <location line="+341"/>
+ <location line="-378"/>
+ <location line="+382"/>
<source>Bookmarks</source>
<translation>Zakładki</translation>
</message>
<message>
- <location line="-329"/>
- <location line="+331"/>
+ <location line="+2"/>
<source>Search</source>
<translation>Wyszukaj</translation>
</message>
<message>
- <location line="-319"/>
- <location line="+192"/>
- <location line="+470"/>
+ <location line="-372"/>
+ <location line="+215"/>
+ <location line="+512"/>
<source>Qt Assistant</source>
<translation>Qt Assistant</translation>
</message>
<message>
- <location line="-501"/>
- <location line="+4"/>
+ <location line="-544"/>
+ <location line="+5"/>
<source>Unfiltered</source>
<translation>Nieprzefiltrowany</translation>
</message>
<message>
- <source>File</source>
- <translation type="obsolete">Plik</translation>
- </message>
- <message>
- <location line="+84"/>
+ <location line="+107"/>
<source>Page Set&amp;up...</source>
<translation>&amp;Ustawienia strony...</translation>
</message>
@@ -513,103 +490,62 @@
<translation>Wy&amp;drukuj...</translation>
</message>
<message>
- <source>CTRL+P</source>
- <translation type="obsolete">CTRL+P</translation>
- </message>
- <message>
- <location line="+6"/>
+ <location line="+7"/>
<source>New &amp;Tab</source>
<translation>Nowa kar&amp;ta</translation>
</message>
<message>
- <source>CTRL+T</source>
- <translation type="obsolete">CTRL+T</translation>
- </message>
- <message>
<location line="+3"/>
<source>&amp;Close Tab</source>
<translation>&amp;Zamknij kartę</translation>
</message>
<message>
- <source>CTRL+W</source>
- <translation type="obsolete">CTRL+W</translation>
- </message>
- <message>
<location line="+4"/>
<source>&amp;Quit</source>
<translation>Za&amp;kończ</translation>
</message>
<message>
- <location line="+1"/>
- <source>CTRL+Q</source>
- <translation>CTRL+Q</translation>
- </message>
- <message>
- <source>Edit</source>
- <translation type="obsolete">Edycja</translation>
- </message>
- <message>
- <location line="+4"/>
+ <location line="+5"/>
<source>&amp;Copy selected Text</source>
<translation>S&amp;kopiuj zaznaczony tekst</translation>
</message>
<message>
- <source>Ctrl+C</source>
- <translation type="obsolete">Ctrl+C</translation>
- </message>
- <message>
- <location line="+6"/>
+ <location line="+8"/>
<source>&amp;Find in Text...</source>
<translation>Znajdź w &amp;tekście...</translation>
</message>
<message>
- <source>Ctrl+F</source>
- <translation type="obsolete">Ctrl+F</translation>
- </message>
- <message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Find &amp;Next</source>
<translation>Znajdź &amp;następny</translation>
</message>
<message>
- <source>F3</source>
- <translation type="obsolete">F3</translation>
- </message>
- <message>
<location line="+4"/>
<source>Find &amp;Previous</source>
<translation>Znajdź &amp;poprzedni</translation>
</message>
<message>
- <source>Shift+F3</source>
- <translation type="obsolete">Shift+F3</translation>
- </message>
- <message>
<location line="+5"/>
<source>Preferences...</source>
<translation>Ustawienia...</translation>
</message>
<message>
- <source>View</source>
- <translation type="obsolete">Widok</translation>
- </message>
- <message>
<location line="+4"/>
<source>Zoom &amp;in</source>
<translation>Po&amp;większ</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Zoom &amp;out</source>
<translation>Po&amp;mniejsz</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Normal &amp;Size</source>
<translation>Normalny &amp;rozmiar</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Ctrl+0</source>
<translation>Ctrl+0</translation>
</message>
@@ -624,30 +560,17 @@
<translation>ALT+I</translation>
</message>
<message>
- <source>ALT+B</source>
- <translation type="obsolete">ALT+B</translation>
- </message>
- <message>
<location line="+4"/>
<source>ALT+S</source>
<translation>ALT+S</translation>
</message>
<message>
- <source>Go</source>
- <translation type="obsolete">Nawigacja</translation>
- </message>
- <message>
<location line="+3"/>
<source>&amp;Home</source>
<translation>Strona &amp;startowa</translation>
</message>
<message>
- <location line="+1"/>
- <source>Ctrl+Home</source>
- <translation></translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+4"/>
<source>&amp;Back</source>
<translation>&amp;Wstecz</translation>
</message>
@@ -657,12 +580,12 @@
<translation>W &amp;przód</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Sync with Table of Contents</source>
<translation>Znajdź bieżącą stronę w spisie treści</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+7"/>
<source>Next Page</source>
<translation>Następna strona</translation>
</message>
@@ -687,21 +610,17 @@
<translation>Dodaj zakładkę...</translation>
</message>
<message>
- <source>Help</source>
- <translation type="obsolete">Pomoc</translation>
- </message>
- <message>
- <location line="+4"/>
+ <location line="+5"/>
<source>About...</source>
<translation>Informacje o programie...</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+16"/>
<source>Navigation Toolbar</source>
<translation>Pasek do nawigacji</translation>
</message>
<message>
- <location line="+74"/>
+ <location line="+76"/>
<source>Toolbars</source>
<translation>Paski narzędzi</translation>
</message>
@@ -726,35 +645,27 @@
<translation>Adres:</translation>
</message>
<message>
- <location line="+110"/>
+ <location line="+114"/>
<source>Could not find the associated content item.</source>
<translation>Nie można znaleźć skojarzonego elementu zawartości.</translation>
</message>
<message>
- <source>Open Source Edition</source>
- <translation type="obsolete">Edycja Open Source</translation>
- </message>
- <message>
- <source>This version of Qt Assistant is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development.</source>
- <translation type="obsolete">Ta wersja Qt Assistant jest częścią wydania Qt Open Source, przeznaczonego do tworzenia aplikacji Open Source. Qt zawiera obszerny zestaw bibliotek wykorzystywanych do pisania przenośnych aplikacji.</translation>
- </message>
- <message>
- <location line="+81"/>
+ <location line="+71"/>
<source>About %1</source>
<translation>Informacje o %1</translation>
</message>
<message>
- <location line="+115"/>
+ <location line="+114"/>
<source>Updating search index</source>
<translation>Uaktualnianie indeksu wyszukiwawczego</translation>
</message>
<message>
- <location line="-597"/>
+ <location line="-638"/>
<source>Looking for Qt Documentation...</source>
<translation>Szukanie dokumentacji Qt...</translation>
</message>
<message>
- <location line="+195"/>
+ <location line="+241"/>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
@@ -774,54 +685,47 @@
<translation>Powiększenie</translation>
</message>
<message>
- <source>Add</source>
- <translation type="obsolete">Dodaj</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="obsolete">Usuń</translation>
- </message>
- <message>
- <source>You need a commercial Qt license for development of proprietary (closed source) applications. Please see &lt;a href=&quot;http://qt.nokia.com/company/about/businessmodel&quot;&gt;http://qt.nokia.com/company/about/businessmodel&lt;/a&gt; for an overview of Qt licensing.</source>
- <translation type="obsolete">Aby móc tworzyć przy pomocy Qt własne aplikacje bez publikowania kodu (closed source) potrzebujesz wydania komercyjnego. Opis sposobów licencjonowania Qt znajduje się na stronie &lt;a href=&quot;http://qt.nokia.com/company/model.html&quot;&gt;qt.nokia.com/company/model.html&lt;/a&gt;.</translation>
- </message>
- <message>
- <location line="-136"/>
+ <location line="-159"/>
<source>&amp;File</source>
<translation>&amp;Plik</translation>
</message>
<message>
- <location line="+24"/>
+ <location line="+25"/>
<source>&amp;Edit</source>
<translation>&amp;Edycja</translation>
</message>
<message>
- <location line="+24"/>
+ <location line="+27"/>
<source>&amp;View</source>
<translation>&amp;Widok</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="+30"/>
<source>&amp;Go</source>
<translation>&amp;Nawigacja</translation>
</message>
<message>
+ <location line="+2"/>
+ <source>ALT+Home</source>
+ <translation>ALT+Home</translation>
+ </message>
+ <message>
<location line="+29"/>
<source>&amp;Bookmarks</source>
<translation>&amp;Zakładki</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>&amp;Help</source>
<translation>&amp;Pomoc</translation>
</message>
<message>
- <location line="-37"/>
+ <location line="-40"/>
<source>ALT+O</source>
<translation>ALT+O</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+38"/>
<source>CTRL+D</source>
<translation>CTRL+D</translation>
</message>
@@ -829,49 +733,48 @@
<context>
<name>PreferencesDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+237"/>
- <location line="+7"/>
- <location line="+6"/>
+ <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+259"/>
+ <location line="+43"/>
<source>Add Documentation</source>
<translation>Dodaj dokumentację</translation>
</message>
<message>
- <location line="-13"/>
+ <location line="-43"/>
<source>Qt Compressed Help Files (*.qch)</source>
<translation>Skompresowane pliki pomocy Qt (*.qch)</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+37"/>
<source>The specified file is not a valid Qt Help File!</source>
<translation>Podany plik nie jest poprawnym plikiem pomocy Qt!</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="-8"/>
<source>The namespace %1 is already registered!</source>
<translation>Przestrzeń nazw %1 jest już zarejestrowana!</translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+31"/>
<source>Remove Documentation</source>
- <translation type="unfinished"></translation>
+ <translation>Usuń dokumentację</translation>
</message>
<message>
<location line="+1"/>
<source>Some documents currently opened in Assistant reference the documentation you are attempting to remove. Removing the documentation will close those documents.</source>
- <translation type="unfinished"></translation>
+ <translation>Niektóre dokumenty otwarte w Assistant odwołują sie do dokumentacji którą próbujesz usunąć. Usunięcie dokumentacji spowoduje zamknięcie tych dokumentów.</translation>
</message>
<message>
<location line="+2"/>
<source>Cancel</source>
- <translation type="unfinished">Anuluj</translation>
+ <translation>Anuluj</translation>
</message>
<message>
<location line="+1"/>
<source>OK</source>
- <translation type="unfinished">OK</translation>
+ <translation>OK</translation>
</message>
<message>
- <location line="+86"/>
+ <location line="+88"/>
<source>Use custom settings</source>
<translation>Użyj własnych ustawień</translation>
</message>
@@ -949,50 +852,55 @@
<translation>Dodaj...</translation>
</message>
<message>
- <source>Network</source>
- <translation type="obsolete">Sieć</translation>
+ <location/>
+ <source>Options</source>
+ <translation>Opcje</translation>
</message>
<message>
- <source>Use Http Proxy</source>
- <translation type="obsolete">Użyj pośrednika http</translation>
+ <location/>
+ <source>Current Page</source>
+ <translation>Bieżąca strona</translation>
</message>
<message>
- <source>Http Proxy:</source>
- <translation type="obsolete">Pośrednik http:</translation>
+ <location/>
+ <source>Restore to default</source>
+ <translation>Przywróć domyślną</translation>
</message>
<message>
- <source>Port:</source>
- <translation type="obsolete">Port:</translation>
+ <location/>
+ <source>Homepage</source>
+ <translation>Strona startowa</translation>
</message>
<message>
<location/>
- <source>Options</source>
- <translation>Opcje</translation>
+ <source>On help start:</source>
+ <translation>Po uruchomieniu</translation>
</message>
<message>
<location/>
- <source>Current Page</source>
- <translation>Bieżąca strona</translation>
+ <source>Show my home page</source>
+ <translation>Pokaż stronę startową</translation>
</message>
<message>
<location/>
- <source>Restore to default</source>
- <translation>Przywróć domyślne</translation>
+ <source>Show a blank page</source>
+ <translation>Pokaż pustą stronę</translation>
</message>
<message>
<location/>
- <source>Homepage</source>
- <translation>Strona startowa</translation>
+ <source>Show my tabs from last session</source>
+ <translation>Pokaż moje karty z ostatniej sesji</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Blank Page</source>
+ <translation>Pusta strona</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
- <source>New Folder</source>
- <translation type="obsolete">Nowy katalog</translation>
- </message>
- <message>
- <location filename="../tools/assistant/tools/assistant/cmdlineparser.cpp" line="+110"/>
+ <location filename="../tools/assistant/tools/assistant/cmdlineparser.cpp" line="+112"/>
<source>The specified collection file does not exist!</source>
<translation>Podany plik z kolekcją nie istnieje!</translation>
</message>
@@ -1040,10 +948,10 @@
<message>
<location line="+7"/>
<source>Missing filter argument!</source>
- <translation type="unfinished"></translation>
+ <translation>Brak argumentu filtra!</translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+12"/>
<source>Unknown option: %1</source>
<translation>Nieznana opcja: %1</translation>
</message>
@@ -1054,7 +962,7 @@
<translation>Qt Assistant</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/main.cpp" line="+190"/>
+ <location filename="../tools/assistant/tools/assistant/main.cpp" line="+217"/>
<source>Could not register documentation file
%1
@@ -1090,7 +998,7 @@ Powód:
<translation>Dokumentacja poprawnie wyrejestrowana.</translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+40"/>
<source>Cannot load sqlite database driver!</source>
<translation>Nie można odczytać sterownika bazy danych sqlite!</translation>
</message>
@@ -1099,17 +1007,11 @@ Powód:
<source>The specified collection file could not be read!</source>
<translation>Podany plik z kolekcją nie może być odczytany!</translation>
</message>
- <message>
- <location filename="../tools/assistant/tools/assistant/bookmarkmanager.cpp" line="+167"/>
- <location line="+1"/>
- <source>Bookmark</source>
- <translation>Zakładka</translation>
- </message>
</context>
<context>
<name>RemoteControl</name>
<message>
- <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+157"/>
+ <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+163"/>
<source>Debugging Remote Control</source>
<translation>Zdalne debugowanie</translation>
</message>
@@ -1122,7 +1024,7 @@ Powód:
<context>
<name>SearchWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/searchwidget.cpp" line="+193"/>
+ <location filename="../tools/assistant/tools/assistant/searchwidget.cpp" line="+195"/>
<source>&amp;Copy</source>
<translation>S&amp;kopiuj</translation>
</message>
@@ -1132,21 +1034,15 @@ Powód:
<translation>Skopiuj &amp;odsyłacz</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+36"/>
+ <location line="+4"/>
<source>Open Link in New Tab</source>
<translation>Otwórz odsyłacz w nowej karcie</translation>
</message>
<message>
- <location line="-29"/>
+ <location line="+8"/>
<source>Select All</source>
<translation>Zaznacz wszystko</translation>
</message>
- <message>
- <location line="+28"/>
- <source>Open Link</source>
- <translation>Otwórz odsyłacz</translation>
- </message>
</context>
<context>
<name>TopicChooser</name>
diff --git a/translations/assistant_ru.ts b/translations/assistant_ru.ts
index ecec0f8..992cf18 100644
--- a/translations/assistant_ru.ts
+++ b/translations/assistant_ru.ts
@@ -151,7 +151,7 @@
<context>
<name>CentralWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+237"/>
+ <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="+238"/>
<source>Add new page</source>
<translation>Открыть новую страницу</translation>
</message>
@@ -161,7 +161,7 @@
<translation>Закрыть текущую страницу</translation>
</message>
<message>
- <location line="+291"/>
+ <location line="+312"/>
<source>Print Document</source>
<translation>Печать документа</translation>
</message>
@@ -172,7 +172,7 @@
<translation>безымянная вкладка</translation>
</message>
<message>
- <location line="+91"/>
+ <location line="+93"/>
<source>Add New Page</source>
<translation>Открыть новую страницу</translation>
</message>
@@ -226,7 +226,7 @@
<context>
<name>FindWidget</name>
<message>
- <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-932"/>
+ <location filename="../tools/assistant/tools/assistant/centralwidget.cpp" line="-955"/>
<source>Previous</source>
<translation>Предыдущее</translation>
</message>
@@ -266,17 +266,17 @@
<message>
<location line="+3"/>
<source>&amp;Family</source>
- <translation>Се&amp;мейство</translation>
+ <translation>&amp;Шрифт</translation>
</message>
<message>
<location line="+4"/>
<source>&amp;Style</source>
- <translation>&amp;Стиль</translation>
+ <translation>&amp;Начертание</translation>
</message>
<message>
<location line="+4"/>
<source>&amp;Point size</source>
- <translation>&amp;Размер в точках</translation>
+ <translation>&amp;Размер</translation>
</message>
</context>
<context>
@@ -340,13 +340,13 @@
<context>
<name>InstallDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+75"/>
<location filename="../tools/assistant/tools/assistant/installdialog.ui" line="+13"/>
+ <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+76"/>
<source>Install Documentation</source>
<translation>Установка документации</translation>
</message>
<message>
- <location line="+30"/>
+ <location filename="../tools/assistant/tools/assistant/installdialog.cpp" line="+30"/>
<source>Downloading documentation info...</source>
<translation>Загрузка информации о документации...</translation>
</message>
@@ -440,32 +440,32 @@
<context>
<name>MainWindow</name>
<message>
- <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+108"/>
- <location line="+384"/>
+ <location filename="../tools/assistant/tools/assistant/mainwindow.cpp" line="+110"/>
+ <location line="+391"/>
<source>Index</source>
<translation>Указатель</translation>
</message>
<message>
- <location line="-378"/>
- <location line="+376"/>
+ <location line="-385"/>
+ <location line="+383"/>
<source>Contents</source>
<translation>Содержание</translation>
</message>
<message>
- <location line="-371"/>
- <location line="+375"/>
+ <location line="-378"/>
+ <location line="+382"/>
<source>Bookmarks</source>
<translation>Закладки</translation>
</message>
<message>
- <location line="-363"/>
+ <location line="-370"/>
<location line="+215"/>
- <location line="+500"/>
+ <location line="+512"/>
<source>Qt Assistant</source>
<translation>Qt Assistant</translation>
</message>
<message>
- <location line="-532"/>
+ <location line="-544"/>
<location line="+5"/>
<source>Unfiltered</source>
<translation>Без фильтрации</translation>
@@ -473,7 +473,7 @@
<message>
<location line="+21"/>
<source>Looking for Qt Documentation...</source>
- <translation>Поиск документации по Qt...</translation>
+ <translation>Поиск документации Qt...</translation>
</message>
<message>
<location line="+84"/>
@@ -496,7 +496,7 @@
<translation>&amp;Печать...</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+7"/>
<source>New &amp;Tab</source>
<translation>Новая &amp;вкладка</translation>
</message>
@@ -511,12 +511,7 @@
<translation>В&amp;ыход</translation>
</message>
<message>
- <location line="+1"/>
- <source>CTRL+Q</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+4"/>
<source>&amp;Edit</source>
<translation>&amp;Правка</translation>
</message>
@@ -526,12 +521,12 @@
<translation>&amp;Копировать выделенный текст</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+8"/>
<source>&amp;Find in Text...</source>
<translation>П&amp;оиск в тексте...</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Find &amp;Next</source>
<translation>Найти &amp;следующее</translation>
</message>
@@ -556,17 +551,17 @@
<translation>У&amp;величить</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Zoom &amp;out</source>
<translation>У&amp;меньшить</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Normal &amp;Size</source>
<translation>Нормальный р&amp;азмер</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Ctrl+0</source>
<translation type="unfinished"></translation>
</message>
@@ -621,12 +616,12 @@
<translation>&amp;Вперёд</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Sync with Table of Contents</source>
- <translation>Синхронизировать с содержанием</translation>
+ <translation>Синхронизировать с оглавлением</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+7"/>
<source>Next Page</source>
<translation>Следующая страница</translation>
</message>
@@ -671,7 +666,7 @@
<translation>О программе...</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+16"/>
<source>Navigation Toolbar</source>
<translation>Панель навигации</translation>
</message>
@@ -726,7 +721,7 @@
<translation>Не удалось найти элемент, связанный с содержанием.</translation>
</message>
<message>
- <location line="+81"/>
+ <location line="+71"/>
<source>About %1</source>
<translation>О %1</translation>
</message>
@@ -739,7 +734,7 @@
<context>
<name>PreferencesDialog</name>
<message>
- <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+256"/>
+ <location filename="../tools/assistant/tools/assistant/preferencesdialog.cpp" line="+259"/>
<location line="+43"/>
<source>Add Documentation</source>
<translation>Добавить документацию</translation>
@@ -780,7 +775,7 @@
<translation>Удалить</translation>
</message>
<message>
- <location line="+86"/>
+ <location line="+88"/>
<source>Use custom settings</source>
<translation>Использовать индивидуальные настройки</translation>
</message>
@@ -864,20 +859,45 @@
<translation>Параметры</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+74"/>
<source>Homepage</source>
- <translation>Домашная страница</translation>
+ <translation>Стартовая страница</translation>
</message>
<message>
- <location line="+26"/>
+ <location line="+27"/>
<source>Current Page</source>
<translation>Текущая страница</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+14"/>
<source>Restore to default</source>
<translation>Страница по умолчанию</translation>
</message>
+ <message>
+ <location line="-97"/>
+ <source>On help start:</source>
+ <translation>При запуске:</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Show my home page</source>
+ <translation>Отобразить стартовую страницу</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Show a blank page</source>
+ <translation>Отобразить пустую страницу</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Show my tabs from last session</source>
+ <translation>Восстановить предыдущую сессиию</translation>
+ </message>
+ <message>
+ <location line="+66"/>
+ <source>Blank Page</source>
+ <translation>Пустая страница</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -944,7 +964,7 @@
<translation>Qt Assistant</translation>
</message>
<message>
- <location filename="../tools/assistant/tools/assistant/main.cpp" line="+203"/>
+ <location filename="../tools/assistant/tools/assistant/main.cpp" line="+217"/>
<source>Could not register documentation file
%1
@@ -993,7 +1013,7 @@ Reason:
<context>
<name>RemoteControl</name>
<message>
- <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+157"/>
+ <location filename="../tools/assistant/tools/assistant/remotecontrol.cpp" line="+163"/>
<source>Debugging Remote Control</source>
<translation>Отладочное удалённое управление</translation>
</message>
diff --git a/translations/designer_pl.ts b/translations/designer_pl.ts
index d82d00f..0c196d8 100644
--- a/translations/designer_pl.ts
+++ b/translations/designer_pl.ts
@@ -2,31 +2,6 @@
<!DOCTYPE TS>
<TS version="2.0" language="pl">
<context>
- <name></name>
- <message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="+647"/>
- <source>&lt;object&gt;</source>
- <translation>&lt;obiekt&gt;</translation>
- </message>
- <message>
- <location line="+18"/>
- <source>&lt;signal&gt;</source>
- <translation>&lt;sygnał&gt;</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>&lt;slot&gt;</source>
- <translation>&lt;slot&gt;</translation>
- </message>
- <message>
- <location filename="../tools/designer/src/components/propertyeditor/previewframe.cpp" line="+73"/>
- <source>The moose in the noose
-ate the goose who was loose.</source>
- <translation>W Szczebrzeszynie
-chrząszcz brzmi w trzcinie.</translation>
- </message>
-</context>
-<context>
<name>AbstractFindWidget</name>
<message>
<location filename="../tools/shared/findwidget/abstractfindwidget.cpp" line="+127"/>
@@ -203,34 +178,6 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
</context>
<context>
- <name>BrushManagerProxy</name>
- <message>
- <location filename="../tools/designer/src/components/formeditor/brushmanagerproxy.cpp" line="+221"/>
- <source>The element &apos;%1&apos; is missing the required attribute &apos;%2&apos;.</source>
- <translation>Brak atrybutu &apos;%2&apos; w elemencie &apos;%1&apos;.</translation>
- </message>
- <message>
- <location line="+11"/>
- <source>Empty brush name encountered.</source>
- <translation>Wystąpiła pusta nazwa szczotki.</translation>
- </message>
- <message>
- <location line="+10"/>
- <source>An unexpected element &apos;%1&apos; was encountered.</source>
- <translation>Wystąpił niespodziewany element &apos;%1&apos;.</translation>
- </message>
- <message>
- <location line="+7"/>
- <source>An error occurred when reading the brush definition file &apos;%1&apos; at line line %2, column %3: %4</source>
- <translation>Wystąpił błąd podczas czytania pliku z definicją szczotki &apos;%1&apos; w linii %2, w kolumnie %3: %4</translation>
- </message>
- <message>
- <location line="+43"/>
- <source>An error occurred when reading the resource file &apos;%1&apos; at line %2, column %3: %4</source>
- <translation>Wystąpił błąd podczas czytania pliku z zasobami &apos;%1&apos; w linii %2, w kolumnie %3: %4</translation>
- </message>
-</context>
-<context>
<name>BrushPropertyManager</name>
<message>
<location filename="../tools/designer/src/components/propertyeditor/brushpropertymanager.cpp" line="+52"/>
@@ -340,7 +287,7 @@ chrząszcz brzmi w trzcinie.</translation>
<message>
<location line="-220"/>
<source>Change signal-slot connection</source>
- <translation type="unfinished"></translation>
+ <translation>Zmień połączenie sygnału ze slotem</translation>
</message>
<message>
<location line="+234"/>
@@ -454,9 +401,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Strona</translation>
</message>
<message>
- <location line="-121"/>
- <location line="+309"/>
- <location line="+672"/>
+ <location line="+860"/>
<source>page</source>
<translation>strona</translation>
</message>
@@ -469,12 +414,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Wstaw stronę</translation>
</message>
<message>
- <location line="-856"/>
- <source>tab</source>
- <translation>tab</translation>
- </message>
- <message>
- <location line="+209"/>
+ <location line="-647"/>
<source>Change Tab order</source>
<translation>Zmień kolejność tabulacji</translation>
</message>
@@ -566,7 +506,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Usuń pasek narzędzi</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="+1161"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="+1195"/>
<source>Set action text</source>
<translation>Ustaw tekst akcji</translation>
</message>
@@ -577,12 +517,12 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
<message>
<location line="+89"/>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="+891"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="+907"/>
<source>Move action</source>
<translation>Przenieś akcję</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-404"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-424"/>
<source>Change Title</source>
<translation>Zmień tytuł</translation>
</message>
@@ -627,7 +567,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Uprość rozmieszczenie w siatce</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+225"/>
+ <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+221"/>
<source>Create button group</source>
<translation>Utwórz grupę przycisków</translation>
</message>
@@ -681,7 +621,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Zmień skrypt</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_propertycommand.cpp" line="+1209"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_propertycommand.cpp" line="+1213"/>
<source>Changed &apos;%1&apos; of &apos;%2&apos;</source>
<translation>Zmień &apos;%1&apos; w &apos;%2&apos;</translation>
</message>
@@ -761,6 +701,24 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
</context>
<context>
+ <name>ConnectionDelegate</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="+643"/>
+ <source>&lt;object&gt;</source>
+ <translation>&lt;obiekt&gt;</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>&lt;signal&gt;</source>
+ <translation>&lt;sygnał&gt;</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>&lt;slot&gt;</source>
+ <translation>&lt;slot&gt;</translation>
+ </message>
+</context>
+<context>
<name>DPI_Chooser</name>
<message>
<location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+69"/>
@@ -784,12 +742,12 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>Designer</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+439"/>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+449"/>
<source>Qt Designer</source>
<translation>Qt Designer</translation>
</message>
<message>
- <location line="+1028"/>
+ <location filename="../tools/designer/src/lib/shared/qsimpleresource.cpp" line="+339"/>
<source>Custom Widgets</source>
<translation>Własne widżety</translation>
</message>
@@ -809,22 +767,32 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>%1 przekroczony czas operacji.</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="-823"/>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+217"/>
<source>This file cannot be read because it was created using %1.</source>
<translation>Nie można odczytać pliku ponieważ został utworzony przy użyciu %1.</translation>
</message>
<message>
- <location line="+116"/>
+ <location line="+96"/>
<source>This file cannot be read because the extra info extension failed to load.</source>
<translation>Nie można odczytać pliku ponieważ dodatkowe informacje nie mogły zostać załadowane.</translation>
</message>
<message>
- <location line="-72"/>
+ <location line="-52"/>
<source>The converted file could not be read.</source>
<translation>Nie można odczytać skonwertowanego pliku.</translation>
</message>
<message>
- <location line="-30"/>
+ <location line="-76"/>
+ <source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
+ <translation>Niepoprawny plik UI: brak głównego elementu &lt;ui&gt;.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
+ <translation>Wystąpił błąd podczas czytania zawartości pliku UI, linia %1, kolumna %2: %3</translation>
+ </message>
+ <message>
+ <location line="+40"/>
<source>This file was created using Designer from Qt-%1 and cannot be read.</source>
<translation>Ten plik został utworzony za pomocą Qt Designer w wersji %1 i nie można go odczytać.</translation>
</message>
@@ -839,17 +807,7 @@ chrząszcz brzmi w trzcinie.</translation>
<translation>Możliwe że zapomniałeś utworzyć rozmieszczenia?</translation>
</message>
<message>
- <location line="+173"/>
- <source>Invalid ui file: The root element &lt;ui&gt; is missing.</source>
- <translation>Niepoprawny plik ui: brak głównego elementu &lt;ui&gt;.</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>An error has occurred while reading the ui file at line %1, column %2: %3</source>
- <translation>Wystąpił błąd podczas czytania zawartości pliku ui, linia %1, kolumna %2: %3</translation>
- </message>
- <message>
- <location line="+74"/>
+ <location line="+253"/>
<source>This file was created using Designer from Qt-%1 and will be converted to a new form by Qt Designer.</source>
<translation>Ten plik został utworzony za pomocą Qt Designer w wersji %1 i będzie skonwertowany przez Qt Designer&apos;a do nowego formularza.</translation>
</message>
@@ -995,51 +953,11 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>EmbeddedOptionsControl</name>
<message>
- <source>None</source>
- <translation type="obsolete">Żadne</translation>
- </message>
- <message>
- <source>Add a profile</source>
- <translation type="obsolete">Dodaj profil</translation>
- </message>
- <message>
- <source>Edit the selected profile</source>
- <translation type="obsolete">Edytuj zaznaczony profil</translation>
- </message>
- <message>
- <source>Delete the selected profile</source>
- <translation type="obsolete">Usuń zaznaczony profil</translation>
- </message>
- <message>
- <source>Add Profile</source>
- <translation type="obsolete">Dodaj profil</translation>
- </message>
- <message>
- <source>New profile</source>
- <translation type="obsolete">Nowy profil</translation>
- </message>
- <message>
- <source>Edit Profile</source>
- <translation type="obsolete">Edytuj profil</translation>
- </message>
- <message>
- <source>Delete Profile</source>
- <translation type="obsolete">Usuń profil</translation>
- </message>
- <message>
- <source>Would you like to delete the profile &apos;%1&apos;?</source>
- <translation type="obsolete">Czy chcesz usunać profil &apos;%1&apos;?</translation>
- </message>
- <message>
- <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="+311"/>
+ <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="+307"/>
<source>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Style&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resolution&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</source>
<extracomment>Format embedded device profile description</extracomment>
<translation>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Styl&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rozdzielczość&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</translation>
</message>
- <message>
- <source>Default</source>
- <translation type="obsolete">Domyślny</translation>
- </message>
</context>
<context>
<name>EmbeddedOptionsPage</name>
@@ -1110,7 +1028,7 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>FormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/uilib/formbuilderextra.cpp" line="+351"/>
+ <location filename="../tools/designer/src/lib/uilib/formbuilderextra.cpp" line="+359"/>
<source>Invalid stretch value for &apos;%1&apos;: &apos;%2&apos;</source>
<extracomment>Parsing layout stretch values</extracomment>
<translation>Niepoprawna wartość rozciągniecia dla &apos;%1&apos;: &apos;%2&apos;</translation>
@@ -1192,7 +1110,7 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>FormWindow</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="+1705"/>
+ <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="+1701"/>
<source>Unexpected element &lt;%1&gt;</source>
<translation>Niespodziewany element &lt;%1&gt;</translation>
</message>
@@ -1268,7 +1186,7 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>IconSelector</name>
<message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+353"/>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+352"/>
<source>All Pixmaps (</source>
<translation>Wszystkie pixmapy (</translation>
</message>
@@ -1283,14 +1201,6 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
</context>
<context>
- <name>LanguageResourceDialog</name>
- <message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-235"/>
- <source>Choose Resource</source>
- <translation>Wybierz zasób</translation>
- </message>
-</context>
-<context>
<name>MainWindowBase</name>
<message>
<location filename="../tools/designer/src/designer/mainwindow.cpp" line="+119"/>
@@ -1378,17 +1288,9 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
</context>
<context>
- <name>NewFormWidget</name>
- <message>
- <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="+495"/>
- <source>Unable to open the form template file &apos;%1&apos;: %2</source>
- <translation>Nie można otworzyć pliku &apos;%1&apos; z szablonem formularza: %2</translation>
- </message>
-</context>
-<context>
<name>ObjectInspectorModel</name>
<message>
- <location filename="../tools/designer/src/components/objectinspector/objectinspectormodel.cpp" line="+364"/>
+ <location filename="../tools/designer/src/components/objectinspector/objectinspectormodel.cpp" line="+360"/>
<source>Object</source>
<translation>Obiekt</translation>
</message>
@@ -1411,7 +1313,7 @@ chrząszcz brzmi w trzcinie.</translation>
<context>
<name>ObjectNameDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+162"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+158"/>
<source>Change Object Name</source>
<translation>Zmień nazwę obiektu</translation>
</message>
@@ -1422,73 +1324,16 @@ chrząszcz brzmi w trzcinie.</translation>
</message>
</context>
<context>
- <name>Oubliette</name>
- <message>
- <source>Inventory</source>
- <translation type="obsolete">Spis</translation>
- </message>
- <message>
- <source>You have &lt;B&gt;No&lt;/B&gt; Items</source>
- <translation type="obsolete">Nie masz &lt;B&gt;ŻADNYCH&lt;/B&gt; elementów</translation>
- </message>
- <message numerus="yes">
- <source>You have %1 of %2 items</source>
- <translation type="obsolete">
- <numerusform>Masz %1 z %2 elementu</numerusform>
- <numerusform>Masz %1 z %2 elementów</numerusform>
- <numerusform>Masz %1 z %2 elementów</numerusform>
- </translation>
- </message>
- <message>
- <source>OK</source>
- <translation type="obsolete">OK</translation>
- </message>
- <message>
- <source>Easter Egg Found</source>
- <translation type="obsolete">Znaleziono Jajo</translation>
- </message>
- <message>
- <source>Welcome to the Trolltech Business Card Hunt
-Use the direction keys to move around and find the business cards for all the trolls.</source>
- <translation type="obsolete">Witamy w pościgu za wizytówkami Trolltech&apos;a.
-Użyj klawiszy kierunkowych aby przemieszczać się i znaleźć wizytówki wszystkich troli.</translation>
- </message>
- <message>
- <source>You Did It!</source>
- <translation type="obsolete">Zrobiłeś to!</translation>
- </message>
- <message>
- <source>That&apos;s rather anti-climatic</source>
- <translation type="obsolete">To raczej anty-klimatyczne</translation>
- </message>
- <message>
- <source>Quit</source>
- <translation type="obsolete">Zakończ</translation>
- </message>
- <message numerus="yes">
- <source>You&apos;ve collected all the Trolltech cards. It took you %n steps.
-There&apos;s nothing more here. You should get back to work.</source>
- <translation type="obsolete">
- <numerusform>Zebrałeś wszystkie wizytówki Trolltech&apos;a. Zabrało to Tobie %n krok.
-Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
- <numerusform>Zebrałeś wszystkie wizytówki Trolltech&apos;a. Zabrało to Tobie %n kroki.
-Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
- <numerusform>Zebrałeś wszystkie wizytówki Trolltech&apos;a. Zabrało to Tobie %n kroków.
-Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
- </translation>
- </message>
-</context>
-<context>
<name>PluginDialog</name>
<message>
<location filename="../tools/designer/src/lib/shared/plugindialog.ui"/>
<source>Plugin Information</source>
- <translation type="unfinished">Informacje o wtyczkach</translation>
+ <translation>Informacje o wtyczkach</translation>
</message>
<message>
<location/>
<source>1</source>
- <translation type="unfinished">1</translation>
+ <translation>1</translation>
</message>
</context>
<context>
@@ -1502,21 +1347,6 @@ Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
<context>
<name>PreviewConfigurationWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+155"/>
- <source>Default</source>
- <translation>Domyślny</translation>
- </message>
- <message>
- <location line="+22"/>
- <source>None</source>
- <translation>Żadna</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Browse...</source>
- <translation>Przeglądaj...</translation>
- </message>
- <message>
<location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.ui"/>
<source>Form</source>
<translation>Formularz</translation>
@@ -1550,7 +1380,7 @@ Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
<context>
<name>PromotionModel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+116"/>
+ <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+112"/>
<source>Not used</source>
<extracomment>Usage of promoted widgets</extracomment>
<translation>Nie używana</translation>
@@ -1574,13 +1404,13 @@ Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
</message>
<message>
<location line="+5"/>
- <source>An error has occurred while reading the ui file at line %1, column %2: %3</source>
+ <source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
<translation>Wystąpił błąd podczas czytania zawartości pliku ui, linia %1, kolumna %2: %3</translation>
</message>
<message>
<location line="+6"/>
- <source>Invalid ui file: The root element &lt;ui&gt; is missing.</source>
- <translation>Niepoprawny plik ui: brak głównego elementu &lt;ui&gt;.</translation>
+ <source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
+ <translation>Niepoprawny plik UI: brak głównego elementu &lt;ui&gt;.</translation>
</message>
<message>
<location line="+119"/>
@@ -1588,7 +1418,7 @@ Nie ma już nic więcej. Powinieneś zabrać się do pracy.</numerusform>
<translation>Utworzenie widżetu klasy &apos;%1&apos; nie powiodło się.</translation>
</message>
<message>
- <location line="+295"/>
+ <location line="+296"/>
<source>Attempt to add child that is not of class QWizardPage to QWizard.</source>
<translation>Próba dodania potomka który nie jest klasy QWizardPage do QWizard.</translation>
</message>
@@ -1605,7 +1435,7 @@ To wskazuje na niespójność w pliku ui.</translation>
<translation>Pusty element w %1 &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+684"/>
+ <location line="+680"/>
<source>Flags property are not supported yet.</source>
<translation>Właściwości typu flaga nie są jeszcze obsługiwane.</translation>
</message>
@@ -1615,12 +1445,12 @@ To wskazuje na niespójność w pliku ui.</translation>
<translation>Podczas przypisywania kolejności tabulacji: widżet &apos;%1&apos; nie został znaleziony.</translation>
</message>
<message>
- <location line="+749"/>
+ <location line="+908"/>
<source>Invalid QButtonGroup reference &apos;%1&apos; referenced by &apos;%2&apos;.</source>
<translation>Niepoprawny odnośnik QButtonGroup &apos;%1&apos;, użyty w &apos;%2&apos;.</translation>
</message>
<message>
- <location line="+518"/>
+ <location line="+511"/>
<source>This version of the uitools library is linked without script support.</source>
<translation>Ta wersja biblioteki uitools nie zawiera obsługi skryptów.</translation>
</message>
@@ -1752,42 +1582,37 @@ Skrypt: %3</translation>
<context>
<name>QDesignerActions</name>
<message>
- <location filename="../tools/designer/src/designer/qdesigner_actions.cpp" line="+488"/>
+ <location filename="../tools/designer/src/designer/qdesigner_actions.cpp" line="+493"/>
<source>Clear &amp;Menu</source>
<translation>Wyczyść &amp;menu</translation>
</message>
<message>
- <location line="-300"/>
+ <location line="-305"/>
<source>&amp;Quit</source>
<translation>Za&amp;kończ</translation>
</message>
<message>
- <location line="+95"/>
- <source>CTRL+Q</source>
- <translation>CTRL+Q</translation>
- </message>
- <message>
- <location line="-105"/>
+ <location line="-10"/>
<source>Edit Widgets</source>
<translation>Edytuj widżety</translation>
</message>
<message>
- <location line="+190"/>
+ <location line="+195"/>
<source>CTRL+R</source>
<translation>CTRL+R</translation>
</message>
<message>
- <location line="-177"/>
+ <location line="-182"/>
<source>&amp;Minimize</source>
<translation>&amp;Zminimalizuj</translation>
</message>
<message>
- <location line="+195"/>
+ <location line="+200"/>
<source>CTRL+M</source>
<translation>CTRL+M</translation>
</message>
<message>
- <location line="-193"/>
+ <location line="-198"/>
<source>Bring All to Front</source>
<translation>Wszystkie na wierzch</translation>
</message>
@@ -1797,7 +1622,7 @@ Skrypt: %3</translation>
<translation>Dodatkowe czcionki...</translation>
</message>
<message>
- <location line="+221"/>
+ <location line="+226"/>
<source>Qt Designer &amp;Help</source>
<translation>Pomo&amp;c Qt Designer</translation>
</message>
@@ -1869,41 +1694,41 @@ Czy chcesz spróbować ponownie lub zmienić nazwę pliku?</translation>
<translation>Wybierz nowy plik</translation>
</message>
<message>
- <location line="-694"/>
+ <location line="-699"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>%1 już istnieje.
Czy chcesz go zastąpić?</translation>
</message>
<message>
- <location line="+925"/>
+ <location line="+930"/>
<source>&amp;Close Preview</source>
<translation>Za&amp;mknij podgląd</translation>
</message>
<message>
- <location line="-884"/>
+ <location line="-889"/>
<source>Preferences...</source>
<translation>Ustawienia...</translation>
</message>
<message>
- <location line="+61"/>
+ <location line="+65"/>
<source>CTRL+SHIFT+S</source>
<translation>CTRL+SHIFT+S</translation>
</message>
<message>
- <location line="+316"/>
+ <location line="+317"/>
<location line="+37"/>
<location line="+160"/>
<source>Designer UI files (*.%1);;All Files (*)</source>
<translation>Pliki Designer UI (*.%1);;Wszystkie pliki (*)</translation>
</message>
<message>
- <location line="-641"/>
+ <location line="-646"/>
<source>Saved %1.</source>
<translation>Formularz %1 zachowany pomyślnie.</translation>
</message>
<message>
- <location line="+627"/>
+ <location line="+632"/>
<source>Read error</source>
<translation>Błąd odczytu</translation>
</message>
@@ -1935,7 +1760,7 @@ Czy chcesz zaktualizować położenie pliku lub wygenerować nowy formularz?</tr
<translation>Nie można zapisać pliku</translation>
</message>
<message>
- <location line="-699"/>
+ <location line="-704"/>
<source>&amp;New...</source>
<translation>&amp;Nowy...</translation>
</message>
@@ -1966,12 +1791,12 @@ Czy chcesz zaktualizować położenie pliku lub wygenerować nowy formularz?</tr
</message>
<message>
<location line="+1"/>
- <location line="+896"/>
+ <location line="+901"/>
<source>&amp;Close</source>
<translation>Za&amp;mknij</translation>
</message>
<message>
- <location line="-895"/>
+ <location line="-900"/>
<source>Save &amp;Image...</source>
<translation>Zachowaj o&amp;brazek...</translation>
</message>
@@ -1986,7 +1811,7 @@ Czy chcesz zaktualizować położenie pliku lub wygenerować nowy formularz?</tr
<translation>Pokaż &amp;kod...</translation>
</message>
<message>
- <location line="+419"/>
+ <location line="+424"/>
<location line="+248"/>
<source>Save Form As</source>
<translation>Zachowaj formularz jako</translation>
@@ -2064,7 +1889,7 @@ Czy chcesz spróbować ponownie?</translation>
<translation>Wydrukowano %1.</translation>
</message>
<message>
- <location line="-1148"/>
+ <location line="-1149"/>
<source>ALT+CTRL+S</source>
<translation>ALT+CTRL+S</translation>
</message>
@@ -2122,17 +1947,17 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerFormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_formbuilder.cpp" line="+88"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_formbuilder.cpp" line="+89"/>
<source>Script errors occurred:</source>
<translation>Wystąpiły błędy w skrypcie:</translation>
</message>
<message>
- <location line="+304"/>
+ <location line="+307"/>
<source>The preview failed to build.</source>
<translation>Nie można utworzyć podglądu.</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+65"/>
<source>Designer</source>
<translation>Projektant</translation>
</message>
@@ -2163,7 +1988,7 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerMenu</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="-1160"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="-1181"/>
<source>Type Here</source>
<translation>Wpisz tutaj</translation>
</message>
@@ -2173,7 +1998,7 @@ Czy chcesz spróbować ponownie?</translation>
<translation>Dodaj separator</translation>
</message>
<message>
- <location line="+379"/>
+ <location line="+378"/>
<source>Remove action &apos;%1&apos;</source>
<translation>Usuń akcję &apos;%1&apos;</translation>
</message>
@@ -2184,12 +2009,12 @@ Czy chcesz spróbować ponownie?</translation>
</message>
<message>
<location line="-302"/>
- <location line="+628"/>
+ <location line="+650"/>
<source>Add separator</source>
<translation>Dodaj separator</translation>
</message>
<message>
- <location line="-660"/>
+ <location line="-682"/>
<source>Insert separator</source>
<translation>Wstaw separator</translation>
</message>
@@ -2202,12 +2027,12 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerMenuBar</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-381"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-375"/>
<source>Type Here</source>
<translation>Wpisz tutaj</translation>
</message>
<message>
- <location line="+304"/>
+ <location line="+298"/>
<source>Remove Menu &apos;%1&apos;</source>
<translation>Usuń menu &apos;%1&apos;</translation>
</message>
@@ -2225,12 +2050,27 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerPluginManager</name>
<message>
- <location filename="../tools/designer/src/lib/shared/pluginmanager.cpp" line="+249"/>
+ <location filename="../tools/designer/src/lib/shared/pluginmanager.cpp" line="+271"/>
<source>An XML error was encountered when parsing the XML of the custom widget %1: %2</source>
<translation>Wystąpił błąd XML podczas przetwarzania kodu XML dla własnego widżetu %1: %2</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="+5"/>
+ <source>A required attribute (&apos;%1&apos;) is missing.</source>
+ <translation>Brak wymaganego atrybutu &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>An invalid property specification (&apos;%1&apos;) was encountered. Supported types: %2</source>
+ <translation>Wystąpiła błędna specyfikacja właściwości &quot;%1&quot;. Obsługiwane typy: %2</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>&apos;%1&apos; is not a valid string property specification.</source>
+ <translation>&quot;%1&quot; nie jest poprawną specyfikacją właściwości typu ciąg.</translation>
+ </message>
+ <message>
+ <location line="+40"/>
<source>The XML of the custom widget %1 does not contain any of the elements &lt;widget&gt; or &lt;ui&gt;.</source>
<translation>Kod XML własnego widżetu %1 nie zawiera żadnego elementu &lt;widget&gt; ani &lt;ui&gt;.</translation>
</message>
@@ -2248,7 +2088,7 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerPropertySheet</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_propertysheet.cpp" line="+747"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_propertysheet.cpp" line="+754"/>
<source>Dynamic Properties</source>
<translation>Dynamiczne właściwości</translation>
</message>
@@ -2256,15 +2096,16 @@ Czy chcesz spróbować ponownie?</translation>
<context>
<name>QDesignerResource</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+512"/>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+492"/>
<source>The layout type &apos;%1&apos; is not supported, defaulting to grid.</source>
<translation>Rozmieszczenie typu &apos;%1&apos; nie jest obsługiwane. Będzie ono zastąpione siatką.</translation>
</message>
<message>
- <location line="+342"/>
+ <location line="+243"/>
<source>The container extension of the widget &apos;%1&apos; (%2) returned a widget not managed by Designer &apos;%3&apos; (%4) when queried for page #%5.
Container pages should only be added by specifying them in XML returned by the domXml() method of the custom widget.</source>
- <translation type="unfinished"></translation>
+ <translation>Rozszerzenie pojemnikowe widżetu &quot;%1&quot; (%2) zwróciło widżet który nie jest zarządzany przez Designera &quot;%3&quot; (%4) podczas pytania o stronę #%5.
+Strony pojemników powinny być dodawane jedynie poprzez wyspecyfikowanie ich w XML zwróconym przez metodę domXml() w widżecie użytkownika.</translation>
</message>
<message>
<location line="+599"/>
@@ -2332,29 +2173,6 @@ Container pages should only be added by specifying them in XML returned by the d
</message>
</context>
<context>
- <name>QDesignerWidgetBox</name>
- <message>
- <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="+349"/>
- <source>An error has been encountered at line %1 of %2: %3</source>
- <translation>Wystąpił błąd w linii %1 w %2: %3</translation>
- </message>
- <message>
- <location line="+139"/>
- <source>Unexpected element &lt;%1&gt; encountered when parsing for &lt;widget&gt; or &lt;ui&gt;</source>
- <translation>Wystąpił niespodziewany element &lt;%1&gt; podczas przetwarzania elementu &lt;widget&gt; lub &lt;ui&gt;</translation>
- </message>
- <message>
- <location line="+19"/>
- <source>Unexpected end of file encountered when parsing widgets.</source>
- <translation>Wystąpił niespodziewany koniec pliku podczas przetwarzania widżetów.</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>A widget element could not be found.</source>
- <translation>Nie można odnależć elementu &lt;widget&gt;.</translation>
- </message>
-</context>
-<context>
<name>QDesignerWorkbench</name>
<message>
<location filename="../tools/designer/src/designer/qdesigner_workbench.cpp" line="+199"/>
@@ -2382,12 +2200,22 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>U&amp;stawienia</translation>
</message>
<message>
- <location line="+594"/>
+ <location line="+204"/>
+ <source>Widget Box</source>
+ <translation>Panel widżetów</translation>
+ </message>
+ <message>
+ <location line="+391"/>
<source>The last session of Designer was not terminated correctly. Backup files were left behind. Do you want to load them?</source>
<translation>Designer nie został poprawnie zamknięty w trakcie ostatniej sesji. Istnieją pliki zapasowe, czy chcesz je otworzyć?</translation>
</message>
<message>
- <location line="-592"/>
+ <location line="+157"/>
+ <source>The file &lt;b&gt;%1&lt;/b&gt; is not a valid Designer UI file.</source>
+ <translation>Plik &lt;b&gt;%1&lt;/b&gt; nie jest poprawnym plikiem UI Designera.</translation>
+ </message>
+ <message>
+ <location line="-750"/>
<source>&amp;Window</source>
<translation>&amp;Okno</translation>
</message>
@@ -2407,7 +2235,7 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>Paski narzędzi</translation>
</message>
<message>
- <location line="+464"/>
+ <location line="+465"/>
<source>Save Forms?</source>
<translation>Zachować formularze?</translation>
</message>
@@ -2436,13 +2264,8 @@ Container pages should only be added by specifying them in XML returned by the d
<source>The file &lt;b&gt;%1&lt;/b&gt; could not be opened.</source>
<translation>Nie można otworzyć pliku &lt;b&gt;%1&lt;/b&gt;.</translation>
</message>
- <message>
- <location line="+46"/>
- <source>The file &lt;b&gt;%1&lt;/b&gt; is not a valid Designer ui file.</source>
- <translation>Plik &lt;b&gt;%1&lt;/b&gt; nie jest poprawnym plikiem Designer&apos;a.</translation>
- </message>
<message numerus="yes">
- <location line="-259"/>
+ <location line="-213"/>
<source>There are %n forms with unsaved changes. Do you want to review these changes before quitting?</source>
<translation>
<numerusform>Jest %n formularz z niezachowanymi zmianami. Czy chcesz przejrzeć zmiany przed wyjściem z programu?</numerusform>
@@ -2454,7 +2277,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QFormBuilder</name>
<message>
- <location filename="../tools/designer/src/lib/uilib/formbuilder.cpp" line="+160"/>
+ <location filename="../tools/designer/src/lib/uilib/formbuilder.cpp" line="+163"/>
<source>An empty class name was passed on to %1 (object name: &apos;%2&apos;).</source>
<extracomment>Empty class name passed to widget factory method</extracomment>
<translation>Pusta nazwa klasy została przekazana do %1 (nazwa obiektu: &apos;%2&apos;).</translation>
@@ -2470,7 +2293,7 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>QFormBuilder nie mógł utworzyć widżetu klasy &apos;%1&apos;.</translation>
</message>
<message>
- <location line="+64"/>
+ <location line="+61"/>
<source>The layout type `%1&apos; is not supported.</source>
<translation>Typ rozmieszczenia &apos;%1&apos; nie jest obsługiwany.</translation>
</message>
@@ -2494,16 +2317,6 @@ Container pages should only be added by specifying them in XML returned by the d
<source>The property %1 could not be written. The type %2 is not supported yet.</source>
<translation>Nie można zapisać właściwości %1. Typ %2 nie jest jeszcze obsługiwany.</translation>
</message>
- <message>
- <location filename="../tools/designer/src/lib/uilib/properties_p.h" line="+132"/>
- <source>The enumeration-value &apos;%1&apos; is invalid. The default value &apos;%2&apos; will be used instead.</source>
- <translation>Niepoprawna wartość &quot;%1&quot; typu wyliczeniowego. Użyta będzie domyślna wartość &quot;%2&quot;.</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>The flag-value &apos;%1&apos; is invalid. Zero will be used instead.</source>
- <translation>Niepoprawna wartość &apos;%1&apos; typu flaga. Użyta będzie zerowa wartość.</translation>
- </message>
</context>
<context>
<name>QStackedWidgetEventFilter</name>
@@ -2548,7 +2361,8 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>Strona %1 z %2</translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+10"/>
+ <location line="+4"/>
<source>Insert Page</source>
<translation>Wstaw stronę</translation>
</message>
@@ -2556,7 +2370,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QStackedWidgetPreviewEventFilter</name>
<message>
- <location line="-150"/>
+ <location line="-153"/>
<source>Go to previous page of %1 &apos;%2&apos; (%3/%4).</source>
<translation>Przejdź do poprzedniej strony %1 &apos;%2&apos; (%3/%4).</translation>
</message>
@@ -2589,7 +2403,8 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>Strona %1 z %2</translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+10"/>
+ <location line="+4"/>
<source>Insert Page</source>
<translation>Wstaw stronę</translation>
</message>
@@ -2651,7 +2466,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtBoolPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1477"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1469"/>
<source>True</source>
<translation>Prawda</translation>
</message>
@@ -2664,7 +2479,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtCharEdit</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+1601"/>
+ <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+1581"/>
<source>Clear Char</source>
<translation>Wyczyść znak</translation>
</message>
@@ -2672,7 +2487,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtColorEditWidget</name>
<message>
- <location line="+611"/>
+ <location line="+605"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -2680,7 +2495,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtColorPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+4777"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+4743"/>
<source>Red</source>
<translation>Czerwień</translation>
</message>
@@ -2801,7 +2616,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtFontEditWidget</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+201"/>
+ <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+198"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -2814,7 +2629,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtFontPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-332"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-330"/>
<source>Bold</source>
<translation>Pogrubiony</translation>
</message>
@@ -2860,7 +2675,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtGradientEditor</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+435"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+431"/>
<source>Start X</source>
<translation>Początek X</translation>
</message>
@@ -2912,6 +2727,36 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>Kąt</translation>
</message>
<message>
+ <location line="+288"/>
+ <source>Linear</source>
+ <translation>Liniowy</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Radial</source>
+ <translation>Radialny</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Conical</source>
+ <translation>Stożkowy</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Pad</source>
+ <translation>Brak</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Repeat</source>
+ <translation>Powtórzone</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reflect</source>
+ <translation>Odbite</translation>
+ </message>
+ <message>
<location filename="../tools/shared/qtgradienteditor/qtgradienteditor.ui"/>
<source>Form</source>
<translation>Formularz</translation>
@@ -3135,7 +2980,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtGradientStopsWidget</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientstopswidget.cpp" line="+949"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientstopswidget.cpp" line="+947"/>
<source>New Stop</source>
<translation>Nowy punkt</translation>
</message>
@@ -3188,31 +3033,31 @@ Container pages should only be added by specifying them in XML returned by the d
<translation>Czy na pewno chcesz usunąć zaznaczony gradient?</translation>
</message>
<message>
- <location line="+74"/>
<location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+74"/>
<source>New...</source>
<translation>Nowy...</translation>
</message>
<message>
- <location line="+1"/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
+ <location/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Edit...</source>
<translation>Edytuj...</translation>
</message>
<message>
- <location line="+1"/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
+ <location/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Rename</source>
<translation>Zmień nazwę</translation>
</message>
<message>
- <location line="+1"/>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
+ <location/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui"/>
+ <location/>
<source>Gradient View</source>
<translation>Widok gradientów</translation>
</message>
@@ -3220,7 +3065,6 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtGradientViewDialog</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientviewdialog.h" line="+62"/>
<location filename="../tools/shared/qtgradienteditor/qtgradientviewdialog.ui"/>
<source>Select Gradient</source>
<translation>Wybierz gradient</translation>
@@ -3237,7 +3081,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtLocalePropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-3561"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-3541"/>
<source>%1, %2</source>
<translation>%1, %2</translation>
</message>
@@ -3255,7 +3099,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtPointFPropertyManager</name>
<message>
- <location line="+415"/>
+ <location line="+411"/>
<source>(%1, %2)</source>
<translation>(%1, %2)</translation>
</message>
@@ -3273,7 +3117,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtPointPropertyManager</name>
<message>
- <location line="-322"/>
+ <location line="-320"/>
<source>(%1, %2)</source>
<translation>(%1, %2)</translation>
</message>
@@ -3304,7 +3148,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtRectFPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1716"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1706"/>
<source>[(%1, %2), %3 x %4]</source>
<translation>[(%1, %2), %3 x %4]</translation>
</message>
@@ -3332,7 +3176,7 @@ Container pages should only be added by specifying them in XML returned by the d
<context>
<name>QtRectPropertyManager</name>
<message>
- <location line="-614"/>
+ <location line="-612"/>
<source>[(%1, %2), %3 x %4]</source>
<translation>[(%1, %2), %3 x %4]</translation>
</message>
@@ -3389,12 +3233,12 @@ Czy chcesz go zastąpić?</translation>
</message>
<message>
<location line="+320"/>
- <location line="+567"/>
+ <location line="+566"/>
<source>New Resource File</source>
<translation>Nowy plik z zasobami</translation>
</message>
<message>
- <location line="-565"/>
+ <location line="-564"/>
<location line="+25"/>
<source>Resource files (*.qrc)</source>
<translation>Pliki z zasobami (*.qrc)</translation>
@@ -3504,7 +3348,7 @@ jako:
<translation>Zachowaj plik z zasobami</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+34"/>
<source>Edit Resources</source>
<translation>Edytor zasobów</translation>
</message>
@@ -3578,7 +3422,7 @@ jako:
<translation>Język / Alias</translation>
</message>
<message>
- <location line="+119"/>
+ <location line="+117"/>
<source>&lt;html&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; There have been problems while reloading the resources:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;p&gt;&lt;b&gt;Ostrzeżenie:&lt;/b&gt; Natrafiono na problemy podczas przeładowania zasobów:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</translation>
</message>
@@ -3633,12 +3477,12 @@ jako:
<translation>Usuń zasób lub plik</translation>
</message>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="-242"/>
+ <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="-239"/>
<source>Could not write %1: %2</source>
<translation>Nie można zapisać &quot;%1&quot;, %2</translation>
</message>
<message>
- <location line="+72"/>
+ <location line="+71"/>
<source>Open Resource File</source>
<translation>Otwórz plik z zasobami</translation>
</message>
@@ -3646,24 +3490,24 @@ jako:
<context>
<name>QtResourceView</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qtresourceview.cpp" line="+435"/>
+ <location filename="../tools/designer/src/lib/shared/qtresourceview.cpp" line="+566"/>
<source>Size: %1 x %2
%3</source>
<translation>Rozmiar: %1 x %2
%3</translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+20"/>
<source>Edit Resources...</source>
<translation>Edytuj zasoby...</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>Reload</source>
<translation>Przeładuj</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+7"/>
<source>Copy Path</source>
<translation>Skopiuj ścieżkę</translation>
</message>
@@ -3671,7 +3515,7 @@ jako:
<context>
<name>QtResourceViewDialog</name>
<message>
- <location line="+247"/>
+ <location line="+250"/>
<source>Select Resource</source>
<translation>Wybierz zasób</translation>
</message>
@@ -3679,7 +3523,7 @@ jako:
<context>
<name>QtSizeFPropertyManager</name>
<message>
- <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-537"/>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-535"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
@@ -3697,10 +3541,10 @@ jako:
<context>
<name>QtSizePolicyPropertyManager</name>
<message>
- <location line="+1719"/>
+ <location line="+1709"/>
<location line="+1"/>
<source>&lt;Invalid&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>&lt;Niepoprawna&gt;</translation>
</message>
<message>
<location line="+1"/>
@@ -3731,7 +3575,7 @@ jako:
<context>
<name>QtSizePropertyManager</name>
<message>
- <location line="-2298"/>
+ <location line="-2286"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
@@ -3749,7 +3593,7 @@ jako:
<context>
<name>QtToolBarDialog</name>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="+1789"/>
+ <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="+1784"/>
<source>&lt; S E P A R A T O R &gt;</source>
<translation>&lt; S E P A R A T O R &gt;</translation>
</message>
@@ -3814,7 +3658,7 @@ jako:
<translation>Akcje bieżącego paska narzędzi</translation>
</message>
<message>
- <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="-545"/>
+ <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="-544"/>
<source>Custom Toolbar</source>
<translation>Własne paski narzędzi</translation>
</message>
@@ -3935,7 +3779,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>ScriptErrorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+63"/>
+ <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+59"/>
<source>An error occurred while running the scripts for &quot;%1&quot;:
</source>
<translation>Wystąpił błąd podczas uruchamiana skryptu dla &quot;%1&quot;:
@@ -3957,12 +3801,12 @@ Czy chcesz nadpisać szablon?</translation>
<message>
<location/>
<source>signal</source>
- <translation type="unfinished"></translation>
+ <translation>sygnał</translation>
</message>
<message>
<location/>
<source>class</source>
- <translation type="unfinished"></translation>
+ <translation>klasa</translation>
</message>
</context>
<context>
@@ -4069,32 +3913,20 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Qt Designer</translation>
</message>
<message>
- <location line="-1"/>
- <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Version %2</source>
- <translation>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Wersja %2</translation>
+ <location line="+3"/>
+ <source>%1&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source> Open Source Edition</source>
- <translation type="obsolete"> Wydanie Open Source</translation>
+ <location line="-4"/>
+ <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Version %2</source>
+ <translation>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Wersja %2</translation>
</message>
<message>
<location line="+2"/>
<source>&lt;br/&gt;Qt Designer is a graphical user interface designer for Qt applications.&lt;br/&gt;</source>
<translation>&lt;br/&gt;Qt Designer jest aplikacją umożliwiającą projektowanie interfejsów graficznych użytkownika w aplikacjach korzystających z Qt.&lt;br/&gt;</translation>
</message>
- <message>
- <source>This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution.&lt;br/&gt;</source>
- <translation type="obsolete">Ten program wydany jest na licencji Qt Commercial. Aby zapoznać się ze szczegółami licencji, proszę sprawdzić plik LICENSE, który dołączony jest do pakietu Qt.&lt;br/&gt;</translation>
- </message>
- <message>
- <location line="+5"/>
- <source>%1&lt;br/&gt;%2&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;br/&gt;&lt;br/&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;br/&gt; </source>
- <translation type="unfinished">%1&lt;br/&gt;%2&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). Wszystkie prawa zastrzeżone.&lt;br/&gt;&lt;br/&gt;Program dostarczony jest BEZ ŻADNYCH GWARANCJI.&lt;br/&gt; </translation>
- </message>
- <message>
- <source>This version of Qt Designer is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development.&lt;br/&gt;&lt;br/&gt;You need a commercial Qt license for development of proprietary (closed source) applications. Please see &lt;a href=&quot;http://qt.nokia.com/company/about/businessmodel&quot;&gt;http://qt.nokia.com/company/about/businessmodel.html&lt;/a&gt; for an overview of Qt licensing.&lt;br/&gt;</source>
- <translation type="obsolete">Ta wersja Qt Designer jest częścią wydania Qt Open Source, przeznaczonego do tworzenia aplikacji Open Source. Qt zawiera obszerny zestaw bibliotek wykorzystywanych do pisania przenośnych aplikacji.&lt;br/&gt;&lt;br/&gt;Aby móc tworzyć przy pomocy Qt własne aplikacje bez publikowania kodu (closed source) potrzebujesz wydania komercyjnego. Opis sposobów licencjonowania Qt znajduje się na stronie &lt;a href=&quot;http://qt.nokia.com/company/model.html&quot;&gt;qt.nokia.com/company/model.html&lt;/a&gt;.&lt;br/&gt;</translation>
- </message>
</context>
<context>
<name>WidgetDataBase</name>
@@ -4107,7 +3939,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ActionEditor</name>
<message>
- <location filename="../tools/designer/src/lib/shared/actioneditor.cpp" line="+143"/>
+ <location filename="../tools/designer/src/lib/shared/actioneditor.cpp" line="+139"/>
<source>Actions</source>
<translation>Akcje</translation>
</message>
@@ -4122,7 +3954,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Usuń</translation>
</message>
<message>
- <location line="+307"/>
+ <location line="+313"/>
<source>New action</source>
<translation>Nowa akcja</translation>
</message>
@@ -4132,14 +3964,14 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Edytuj akcję</translation>
</message>
<message>
- <location line="-411"/>
+ <location line="-417"/>
<source>Edit...</source>
<translation>Edytuj...</translation>
</message>
<message>
<location line="+1"/>
<source>Go to slot...</source>
- <translation type="unfinished">Przejdź do slotu...</translation>
+ <translation>Przejdź do slotu...</translation>
</message>
<message>
<location line="+1"/>
@@ -4162,7 +3994,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Zaznacz wszystko</translation>
</message>
<message>
- <location line="+54"/>
+ <location line="+59"/>
<source>Configure Action Editor</source>
<translation>Skonfiguruj edytor akcji</translation>
</message>
@@ -4177,7 +4009,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Szczegółowy widok</translation>
</message>
<message>
- <location line="+412"/>
+ <location line="+413"/>
<source>Remove actions</source>
<translation>Usuń akcje</translation>
</message>
@@ -4226,9 +4058,37 @@ Czy chcesz nadpisać szablon?</translation>
</message>
</context>
<context>
+ <name>qdesigner_internal::BrushManagerProxy</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/brushmanagerproxy.cpp" line="+219"/>
+ <source>The element &apos;%1&apos; is missing the required attribute &apos;%2&apos;.</source>
+ <translation>Brak wymaganego atrybutu &apos;%2&apos; w elemencie &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Empty brush name encountered.</source>
+ <translation>Wystąpiła pusta nazwa szczotki.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>An unexpected element &apos;%1&apos; was encountered.</source>
+ <translation>Wystąpił niespodziewany element &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>An error occurred when reading the brush definition file &apos;%1&apos; at line line %2, column %3: %4</source>
+ <translation>Wystąpił błąd podczas czytania pliku z definicją szczotki &apos;%1&apos; w linii %2, w kolumnie %3: %4</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>An error occurred when reading the resource file &apos;%1&apos; at line %2, column %3: %4</source>
+ <translation>Wystąpił błąd podczas czytania pliku z zasobami &apos;%1&apos; w linii %2, w kolumnie %3: %4</translation>
+ </message>
+</context>
+<context>
<name>qdesigner_internal::BuddyEditor</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor.cpp" line="+265"/>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor.cpp" line="+261"/>
<source>Add buddy</source>
<translation>Dodaj skojarzoną etykietę</translation>
</message>
@@ -4264,7 +4124,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::BuddyEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp" line="+77"/>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp" line="+73"/>
<source>Edit Buddies</source>
<translation>Edytuj skojarzone etykiety</translation>
</message>
@@ -4272,7 +4132,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::BuddyEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp" line="+60"/>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp" line="+56"/>
<source>Edit Buddies</source>
<translation>Edytuj skojarzone etykiety</translation>
</message>
@@ -4326,7 +4186,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::CodeDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/codedialog.cpp" line="+99"/>
+ <location filename="../tools/designer/src/lib/shared/codedialog.cpp" line="+95"/>
<source>Save...</source>
<translation>Zachowaj...</translation>
</message>
@@ -4384,7 +4244,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ColorAction</name>
<message>
- <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+250"/>
+ <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+246"/>
<source>Text Color</source>
<translation>Color tekstu</translation>
</message>
@@ -4392,7 +4252,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ComboBoxTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/combobox_taskmenu.cpp" line="+72"/>
+ <location filename="../tools/designer/src/components/taskmenu/combobox_taskmenu.cpp" line="+68"/>
<source>Edit Items...</source>
<translation>Edytuj elementy...</translation>
</message>
@@ -4484,7 +4344,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ContainerWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+112"/>
+ <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+107"/>
<source>Insert Page Before Current Page</source>
<translation>Wstaw stronę przed bieżącą stroną</translation>
</message>
@@ -4547,7 +4407,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::DesignerPropertyManager</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="+644"/>
+ <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="+647"/>
<location line="+6"/>
<source>AlignLeft</source>
<translation>Wyrównanie do lewej</translation>
@@ -4783,52 +4643,52 @@ Czy chcesz nadpisać szablon?</translation>
<message>
<location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="-260"/>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Brak</translation>
</message>
<message>
<location line="+4"/>
<source>Add a profile</source>
- <translation type="unfinished">Dodaj profil</translation>
+ <translation>Dodaj profil</translation>
</message>
<message>
<location line="+6"/>
<source>Edit the selected profile</source>
- <translation type="unfinished">Edytuj zaznaczony profil</translation>
+ <translation>Edytuj zaznaczony profil</translation>
</message>
<message>
<location line="+4"/>
<source>Delete the selected profile</source>
- <translation type="unfinished">Usuń zaznaczony profil</translation>
+ <translation>Usuń zaznaczony profil</translation>
</message>
<message>
<location line="+22"/>
<source>Add Profile</source>
- <translation type="unfinished">Dodaj profil</translation>
+ <translation>Dodaj profil</translation>
</message>
<message>
<location line="+7"/>
<source>New profile</source>
- <translation type="unfinished">Nowy profil</translation>
+ <translation>Nowy profil</translation>
</message>
<message>
<location line="+35"/>
<source>Edit Profile</source>
- <translation type="unfinished">Edytuj profil</translation>
+ <translation>Edytuj profil</translation>
</message>
<message>
<location line="+26"/>
<source>Delete Profile</source>
- <translation type="unfinished">Usuń profil</translation>
+ <translation>Usuń profil</translation>
</message>
<message>
<location line="+1"/>
<source>Would you like to delete the profile &apos;%1&apos;?</source>
- <translation type="unfinished">Czy chcesz usunać profil &apos;%1&apos;?</translation>
+ <translation>Czy chcesz usunąć profil &apos;%1&apos;?</translation>
</message>
<message>
<location line="+55"/>
<source>Default</source>
- <translation type="unfinished">Domyślny</translation>
+ <translation>Domyślny</translation>
</message>
</context>
<context>
@@ -4849,7 +4709,7 @@ Czy chcesz nadpisać szablon?</translation>
<message>
<location line="+1"/>
<source>The file &quot;%1&quot; has changed outside Designer. Do you want to reload it?</source>
- <translation>Plik &quot;%1&quot; zmienił się na zewnątrz Designera. Czy chcesz go ponownie załadować?</translation>
+ <translation type="unfinished">Plik &quot;%1&quot; zmienił się na zewnątrz Designera. Czy chcesz go ponownie załadować?</translation>
</message>
</context>
<context>
@@ -4899,7 +4759,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Błąd wklejania</translation>
</message>
<message>
- <location line="+442"/>
+ <location line="+445"/>
<source>Lay out</source>
<translation>Rozmieść</translation>
</message>
@@ -4910,7 +4770,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Upuść widżet</translation>
</message>
<message numerus="yes">
- <location line="-1055"/>
+ <location line="-1058"/>
<source>Paste %n action(s)</source>
<translation>
<numerusform>Wklej %n akcję</numerusform>
@@ -4938,7 +4798,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Wklej (%1 widżetów, %2 akcji)</translation>
</message>
<message>
- <location line="+463"/>
+ <location line="+466"/>
<source>Select Ancestor</source>
<translation>Wybierz przodka</translation>
</message>
@@ -4948,7 +4808,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Formularz bazujący na QMainWindow nie zawiera centralnego widżetu.</translation>
</message>
<message>
- <location line="-794"/>
+ <location line="-797"/>
<source>Raise widgets</source>
<translation>Przenieś widżety na wierzch</translation>
</message>
@@ -4961,7 +4821,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::FormWindowBase</name>
<message>
- <location filename="../tools/designer/src/lib/shared/formwindowbase.cpp" line="+397"/>
+ <location filename="../tools/designer/src/lib/shared/formwindowbase.cpp" line="+393"/>
<source>Delete</source>
<translation>Usuń</translation>
</message>
@@ -4974,7 +4834,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::FormWindowManager</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/formwindowmanager.cpp" line="+368"/>
+ <location filename="../tools/designer/src/components/formeditor/formwindowmanager.cpp" line="+364"/>
<source>Cu&amp;t</source>
<translation>Wy&amp;tnij</translation>
</message>
@@ -5076,7 +4936,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Rozmieszcza zaznaczone widżety w pionie</translation>
</message>
<message>
- <location line="+16"/>
+ <location line="+17"/>
<source>Lay Out in a &amp;Grid</source>
<translation>Rozmieść w &amp;siatce</translation>
</message>
@@ -5126,12 +4986,12 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Podgląd bierzącego formularza</translation>
</message>
<message>
- <location line="+14"/>
+ <location line="+15"/>
<source>Form &amp;Settings...</source>
<translation>Us&amp;tawienia formularza...</translation>
</message>
<message>
- <location line="+78"/>
+ <location line="+92"/>
<source>Break Layout</source>
<translation>Usuń rozmieszczenie</translation>
</message>
@@ -5152,7 +5012,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Ustawienia formularza - %1</translation>
</message>
<message>
- <location line="-510"/>
+ <location line="-525"/>
<source>Removes empty columns and rows</source>
<translation>Usuń puste kolumny i wiersze</translation>
</message>
@@ -5226,7 +5086,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::GroupBoxTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp" line="+86"/>
+ <location filename="../tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp" line="+82"/>
<source>Change title...</source>
<translation>Zmień tytuł...</translation>
</message>
@@ -5242,7 +5102,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::IconSelector</name>
<message>
- <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+211"/>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-24"/>
<source>The pixmap file &apos;%1&apos; cannot be read.</source>
<translation>Nie można odczytać pliku z pixmapą %1.</translation>
</message>
@@ -5262,7 +5122,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Błąd przy odczycie pixmapy</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+54"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -5327,7 +5187,7 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Przywróć wszystkie</translation>
</message>
<message>
- <location line="-86"/>
+ <location line="-85"/>
<source>Choose a Pixmap</source>
<translation>Wybierz pixmapę</translation>
</message>
@@ -5340,13 +5200,13 @@ Czy chcesz nadpisać szablon?</translation>
<translation>Własciwości &amp;&lt;&lt;</translation>
</message>
<message>
- <location line="+2"/>
<location filename="../tools/designer/src/components/taskmenu/itemlisteditor.ui"/>
+ <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Własciwości &amp;&gt;&gt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.ui"/>
+ <location/>
<source>Items List</source>
<translation>Lista elementów</translation>
</message>
@@ -5394,7 +5254,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::LabelTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/label_taskmenu.cpp" line="+89"/>
+ <location filename="../tools/designer/src/components/taskmenu/label_taskmenu.cpp" line="+85"/>
<source>Change rich text...</source>
<translation>Zmień tekst sformatowany...</translation>
</message>
@@ -5405,9 +5265,17 @@ Czy chcesz nadpisać szablon?</translation>
</message>
</context>
<context>
+ <name>qdesigner_internal::LanguageResourceDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-258"/>
+ <source>Choose Resource</source>
+ <translation>Wybierz zasób</translation>
+ </message>
+</context>
+<context>
<name>qdesigner_internal::LineEditTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp" line="+84"/>
+ <location filename="../tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp" line="+80"/>
<source>Change text...</source>
<translation>Zmień tekst...</translation>
</message>
@@ -5415,7 +5283,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ListWidgetEditor</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/listwidgeteditor.cpp" line="+73"/>
+ <location filename="../tools/designer/src/components/taskmenu/listwidgeteditor.cpp" line="+69"/>
<source>New Item</source>
<translation>Nowy element</translation>
</message>
@@ -5433,7 +5301,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::ListWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp" line="+71"/>
+ <location filename="../tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp" line="+67"/>
<source>Edit Items...</source>
<translation>Edytuj elementy...</translation>
</message>
@@ -5469,7 +5337,7 @@ Czy chcesz nadpisać szablon?</translation>
<context>
<name>qdesigner_internal::MenuTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/menutaskmenu.cpp" line="+60"/>
+ <location filename="../tools/designer/src/components/taskmenu/menutaskmenu.cpp" line="+56"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
@@ -5570,7 +5438,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::NewFormWidget</name>
<message>
- <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="-391"/>
+ <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="+104"/>
<source>Default size</source>
<translation>Domyślny rozmiar</translation>
</message>
@@ -5616,7 +5484,12 @@ Wybierz inną nazwę.</translation>
<translation>Błąd podczas ładowania formularza</translation>
</message>
<message>
- <location line="+312"/>
+ <location line="+244"/>
+ <source>Unable to open the form template file &apos;%1&apos;: %2</source>
+ <translation>Nie można otworzyć pliku &apos;%1&apos; z szablonem formularza: %2</translation>
+ </message>
+ <message>
+ <location line="+67"/>
<source>Internal error: No template selected.</source>
<translation>Błąd wewnętrzny: Nie zaznaczono szablonu.</translation>
</message>
@@ -5649,7 +5522,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::NewPromotedClassPanel</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+96"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+92"/>
<source>Add</source>
<translation>Dodaj</translation>
</message>
@@ -5687,7 +5560,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::ObjectInspector</name>
<message>
- <location filename="../tools/designer/src/components/objectinspector/objectinspector.cpp" line="+758"/>
+ <location filename="../tools/designer/src/components/objectinspector/objectinspector.cpp" line="+754"/>
<source>&amp;Find in Text...</source>
<translation>Z&amp;najdź w tekście...</translation>
</message>
@@ -5703,7 +5576,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::OrderDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+113"/>
+ <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+109"/>
<source>Index %1 (%2)</source>
<translation>Indeks %1 (%2)</translation>
</message>
@@ -5784,7 +5657,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PaletteEditorButton</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp" line="+61"/>
+ <location filename="../tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp" line="+57"/>
<source>Change Palette</source>
<translation>Zmień paletę</translation>
</message>
@@ -5792,7 +5665,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PaletteModel</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.cpp" line="+381"/>
+ <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.cpp" line="+374"/>
<source>Color Role</source>
<translation>Rola koloru</translation>
</message>
@@ -5844,7 +5717,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PlainTextEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/plaintexteditor.cpp" line="+69"/>
+ <location filename="../tools/designer/src/lib/shared/plaintexteditor.cpp" line="+65"/>
<source>Edit text</source>
<translation>Edytuj tekst</translation>
</message>
@@ -5872,10 +5745,6 @@ Wybierz inną nazwę.</translation>
<translation>Qt Designer znalazł następujące wtyczki:</translation>
</message>
<message>
- <source>TextLabel</source>
- <translation type="obsolete">Etykieta</translation>
- </message>
- <message>
<location line="-52"/>
<source>Refresh</source>
<translation>Odśwież</translation>
@@ -5890,10 +5759,6 @@ Wybierz inną nazwę.</translation>
<source>New custom widget plugins have been found.</source>
<translation>Znaleziono nową wtyczkę z widżetami.</translation>
</message>
- <message>
- <source>1</source>
- <translation type="obsolete">1</translation>
- </message>
</context>
<context>
<name>qdesigner_internal::PreviewActionGroup</name>
@@ -5904,9 +5769,27 @@ Wybierz inną nazwę.</translation>
</message>
</context>
<context>
+ <name>qdesigner_internal::PreviewConfigurationWidget</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+139"/>
+ <source>Default</source>
+ <translation>Domyślny</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>None</source>
+ <translation>Żadna</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Browse...</source>
+ <translation>Przeglądaj...</translation>
+ </message>
+</context>
+<context>
<name>qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+118"/>
+ <location line="+118"/>
<source>Load Custom Device Skin</source>
<translation>Załaduj dostosowaną skórkę (skin) urządzenia</translation>
</message>
@@ -5941,7 +5824,24 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PreviewDeviceSkin</name>
<message>
- <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="+218"/>
+ <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="+259"/>
+ <source>&amp;Portrait</source>
+ <translation>P&amp;ortret</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Landscape (&amp;CCW)</source>
+ <extracomment>Rotate form preview counter-clockwise</extracomment>
+ <translation>Pejzaż (&amp;CCW)</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>&amp;Landscape (CW)</source>
+ <extracomment>Rotate form preview clockwise</extracomment>
+ <translation>P&amp;ejzaż (CW)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>&amp;Close</source>
<translation>Za&amp;mknij</translation>
</message>
@@ -5949,12 +5849,23 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PreviewManager</name>
<message>
- <location line="+345"/>
+ <location line="+426"/>
<source>%1 - [Preview]</source>
<translation>%1 - [Podgląd]</translation>
</message>
</context>
<context>
+ <name>qdesigner_internal::PreviewMdiArea</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/previewframe.cpp" line="+72"/>
+ <source>The moose in the noose
+ate the goose who was loose.</source>
+ <extracomment>Palette editor background</extracomment>
+ <translation>W Szczebrzeszynie
+chrząszcz brzmi w trzcinie.</translation>
+ </message>
+</context>
+<context>
<name>qdesigner_internal::PreviewWidget</name>
<message>
<location filename="../tools/designer/src/components/propertyeditor/previewwidget.ui"/>
@@ -6066,7 +5977,7 @@ Wybierz inną nazwę.</translation>
<context>
<name>qdesigner_internal::PropertyEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/propertyeditor.cpp" line="+188"/>
+ <location filename="../tools/designer/src/components/propertyeditor/propertyeditor.cpp" line="+183"/>
<source>Add Dynamic Property...</source>
<translation>Dodaj dynamiczną właściwość ...</translation>
</message>
@@ -6096,7 +6007,7 @@ Wybierz inną nazwę.</translation>
<translation>Widok z rozszerzalnymi przyciskami</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+64"/>
<source>Configure Property Editor</source>
<translation>Skonfiguruj edytor właściwości</translation>
</message>
@@ -6232,7 +6143,7 @@ Klasa: %2</translation>
<message>
<location line="+415"/>
<source>no signals available</source>
- <translation type="unfinished"></translation>
+ <translation>brak dostępnych sygnałów</translation>
</message>
<message numerus="yes">
<location line="+67"/>
@@ -6302,7 +6213,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::QDesignerWidgetBox</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_widgetbox.cpp" line="+127"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_widgetbox.cpp" line="+123"/>
<location line="+13"/>
<source>Unexpected element &lt;%1&gt;</source>
<translation>Niespodziewany element &lt;%1&gt;</translation>
@@ -6321,44 +6232,31 @@ Klasa: %2</translation>
<translation>Kod XML określony dla widżetu %1 nie zawiera żadnego elementu typu widżet.
%2</translation>
</message>
-</context>
-<context>
- <name>qdesigner_internal::QtGradientEditor</name>
- <message>
- <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+289"/>
- <source>Linear</source>
- <translation>Liniowy</translation>
- </message>
<message>
- <location line="+1"/>
- <source>Radial</source>
- <translation>Radialny</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Conical</source>
- <translation>Stożkowy</translation>
+ <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="+349"/>
+ <source>An error has been encountered at line %1 of %2: %3</source>
+ <translation>Wystąpił błąd w linii %1 w %2: %3</translation>
</message>
<message>
- <location line="+20"/>
- <source>Pad</source>
- <translation>Brak</translation>
+ <location line="+139"/>
+ <source>Unexpected element &lt;%1&gt; encountered when parsing for &lt;widget&gt; or &lt;ui&gt;</source>
+ <translation>Wystąpił niespodziewany element &lt;%1&gt; podczas przetwarzania elementu &lt;widget&gt; lub &lt;ui&gt;</translation>
</message>
<message>
- <location line="+1"/>
- <source>Repeat</source>
- <translation>Powtórzone</translation>
+ <location line="+19"/>
+ <source>Unexpected end of file encountered when parsing widgets.</source>
+ <translation>Wystąpił niespodziewany koniec pliku podczas przetwarzania widżetów.</translation>
</message>
<message>
- <location line="+1"/>
- <source>Reflect</source>
- <translation>Odbite</translation>
+ <location line="+9"/>
+ <source>A widget element could not be found.</source>
+ <translation>Nie można odnależć elementu &lt;widget&gt;.</translation>
</message>
</context>
<context>
<name>qdesigner_internal::QtGradientStopsController</name>
<message>
- <location filename="../tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp" line="+177"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp" line="+173"/>
<source>H</source>
<translation>H</translation>
</message>
@@ -6533,17 +6431,17 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::ScriptDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/scriptdialog.cpp" line="+68"/>
+ <location filename="../tools/designer/src/lib/shared/scriptdialog.cpp" line="+66"/>
<source>Edit script</source>
<translation>Edytuj skrypt</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+56"/>
<source>Syntax error</source>
<translation>Błąd składni</translation>
</message>
<message>
- <location line="-50"/>
+ <location line="-51"/>
<source>&lt;html&gt;Enter a Qt Script snippet to be executed while loading the form.&lt;br&gt;The widget and its children are accessible via the variables &lt;i&gt;widget&lt;/i&gt; and &lt;i&gt;childWidgets&lt;/i&gt;, respectively.</source>
<translation>&lt;html&gt;Wprowadź skrypt Qt który będzie wykonany podczas ładowania formularza.&lt;br&gt;Widżet i jego dzieci są dostępne przez zmienne &lt;i&gt;widget&lt;/i&gt; i &lt;i&gt;childWidgets&lt;/i&gt;, odpowiednio.</translation>
</message>
@@ -6583,7 +6481,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::SignalSlotEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp" line="+76"/>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp" line="+72"/>
<source>Edit Signals/Slots</source>
<translation>Edytuj sygnały/sloty</translation>
</message>
@@ -6596,7 +6494,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::SignalSlotEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp" line="+62"/>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp" line="+58"/>
<source>Edit Signals/Slots</source>
<translation>Edytuj sygnały/sloty</translation>
</message>
@@ -6604,7 +6502,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::StatusBarTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp" line="+85"/>
+ <location filename="../tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp" line="+81"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
@@ -6612,7 +6510,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::StringListEditorButton</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp" line="+60"/>
+ <location filename="../tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp" line="+56"/>
<source>Change String List</source>
<translation>Zmień listę tekstów</translation>
</message>
@@ -6620,13 +6518,13 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::StyleSheetEditorDialog</name>
<message>
- <location filename="../tools/designer/src/lib/shared/stylesheeteditor.cpp" line="+101"/>
+ <location filename="../tools/designer/src/lib/shared/stylesheeteditor.cpp" line="+97"/>
<source>Edit Style Sheet</source>
<translation>Edytuj arkusz stylu</translation>
</message>
<message>
<location line="-7"/>
- <location line="+283"/>
+ <location line="+280"/>
<source>Valid Style Sheet</source>
<translation>Poprawny arkusz stylu</translation>
</message>
@@ -6636,7 +6534,7 @@ Klasa: %2</translation>
<translation>Niepoprawny arkusz stylu</translation>
</message>
<message>
- <location line="-284"/>
+ <location line="-281"/>
<source>Add Resource...</source>
<translation>Dodaj zasób...</translation>
</message>
@@ -6687,7 +6585,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TabOrderEditorPlugin</name>
<message>
- <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp" line="+77"/>
+ <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp" line="+73"/>
<source>Edit Tab Order</source>
<translation>Edytuj kolejność tabulacji</translation>
</message>
@@ -6695,7 +6593,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TabOrderEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp" line="+61"/>
+ <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp" line="+57"/>
<source>Edit Tab Order</source>
<translation>Edytuj kolejność tabulacji</translation>
</message>
@@ -6713,7 +6611,7 @@ Klasa: %2</translation>
<translation>&amp;Elementy</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+74"/>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+70"/>
<source>New Row</source>
<translation>Nowy wiersz</translation>
</message>
@@ -6733,13 +6631,13 @@ Klasa: %2</translation>
<translation>Własciwości &amp;&lt;&lt;</translation>
</message>
<message>
- <location line="+2"/>
<location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.ui"/>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Własciwości &amp;&gt;&gt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.ui"/>
+ <location/>
<source>Table Items</source>
<translation>Elementy tabeli</translation>
</message>
@@ -6752,7 +6650,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TableWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp" line="+68"/>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp" line="+64"/>
<source>Edit Items...</source>
<translation>Edytuj elementy...</translation>
</message>
@@ -6783,7 +6681,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TextEditTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/textedit_taskmenu.cpp" line="+63"/>
+ <location filename="../tools/designer/src/components/taskmenu/textedit_taskmenu.cpp" line="+59"/>
<source>Change HTML...</source>
<translation>Zmień HTML...</translation>
</message>
@@ -6806,7 +6704,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TextEditor</name>
<message>
- <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-201"/>
+ <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-204"/>
<source>Choose Resource...</source>
<translation>Wybierz zasób...</translation>
</message>
@@ -6816,12 +6714,12 @@ Klasa: %2</translation>
<translation>Wybierz plik...</translation>
</message>
<message>
- <location line="+120"/>
+ <location line="+123"/>
<source>Choose a File</source>
<translation>Wybierz plik</translation>
</message>
<message>
- <location line="-115"/>
+ <location line="-118"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -6829,7 +6727,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::ToolBarEventFilter</name>
<message>
- <location filename="../tools/designer/src/lib/shared/qdesigner_toolbar.cpp" line="+239"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_toolbar.cpp" line="+234"/>
<source>Insert Separator</source>
<translation>Wstaw separator</translation>
</message>
@@ -6872,7 +6770,7 @@ Klasa: %2</translation>
<translation>Drzewo elementów</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+80"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+76"/>
<source>&amp;Columns</source>
<translation>&amp;Kolumny</translation>
</message>
@@ -6887,30 +6785,30 @@ Klasa: %2</translation>
<translation>Wspólne właściwości</translation>
</message>
<message>
- <location line="+53"/>
<location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+53"/>
<source>New Item</source>
<translation>Nowy element</translation>
</message>
<message>
- <location line="+19"/>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
+ <location/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+19"/>
<source>New Subitem</source>
<translation>Nowy podelement</translation>
</message>
<message>
- <location line="+175"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+175"/>
<source>Properties &amp;&lt;&lt;</source>
<translation>Własciwości &amp;&lt;&lt;</translation>
</message>
<message>
- <location line="+2"/>
<location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+2"/>
<source>Properties &amp;&gt;&gt;</source>
<translation>Własciwości &amp;&gt;&gt;</translation>
</message>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui"/>
+ <location/>
<source>New &amp;Subitem</source>
<translation>Nowy &amp;podelement</translation>
</message>
@@ -6983,7 +6881,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::TreeWidgetTaskMenu</name>
<message>
- <location filename="../tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp" line="+67"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp" line="+63"/>
<source>Edit Items...</source>
<translation>Edytuj elementy...</translation>
</message>
@@ -6991,7 +6889,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::WidgetBox</name>
<message>
- <location filename="../tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp" line="+113"/>
+ <location filename="../tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp" line="+115"/>
<source>Warning: Widget creation failed in the widget box. This could be caused by invalid custom widget XML.</source>
<translation>Ostrzeżenie: Błąd tworzenia widżetu w panelu widżetów. Mogło to być spowodowane niepoprawnym kodem XML widżetu.</translation>
</message>
@@ -7009,7 +6907,7 @@ Klasa: %2</translation>
<translation>Własne widżety</translation>
</message>
<message>
- <location line="+260"/>
+ <location line="+263"/>
<source>Expand all</source>
<translation>Rozszerz wszystkie</translation>
</message>
@@ -7050,7 +6948,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::WidgetEditorTool</name>
<message>
- <location filename="../tools/designer/src/components/formeditor/tool_widgeteditor.cpp" line="+71"/>
+ <location filename="../tools/designer/src/components/formeditor/tool_widgeteditor.cpp" line="+67"/>
<source>Edit Widgets</source>
<translation>Edytuj widżety</translation>
</message>
@@ -7058,7 +6956,7 @@ Klasa: %2</translation>
<context>
<name>qdesigner_internal::WidgetFactory</name>
<message>
- <location filename="../tools/designer/src/lib/shared/widgetfactory.cpp" line="+267"/>
+ <location filename="../tools/designer/src/lib/shared/widgetfactory.cpp" line="+263"/>
<source>The custom widget factory registered for widgets of class %1 returned 0.</source>
<translation>Fabryka widżetów użytkownika zarejestrowana dla widżetów klasy %1 zwróciła 0.</translation>
</message>
@@ -7112,4 +7010,12 @@ To wskazuje na niespójność w pliku &quot;ui&quot;.</translation>
<translation>%1 %</translation>
</message>
</context>
+<context>
+ <name>qdesigner_internal::ZoomablePreviewDeviceSkin</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="-270"/>
+ <source>&amp;Zoom</source>
+ <translation>&amp;Powiększenie</translation>
+ </message>
+</context>
</TS>
diff --git a/translations/designer_ru.ts b/translations/designer_ru.ts
new file mode 100644
index 0000000..c2f2128
--- /dev/null
+++ b/translations/designer_ru.ts
@@ -0,0 +1,7049 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru">
+<context>
+ <name>AbstractFindWidget</name>
+ <message>
+ <location filename="../tools/shared/findwidget/abstractfindwidget.cpp" line="+127"/>
+ <source>&amp;Previous</source>
+ <translation>&amp;Предыдущий</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&amp;Next</source>
+ <translation>&amp;Следующий</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>&amp;Case sensitive</source>
+ <translation>&amp;Учитывать регистр</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Whole &amp;words</source>
+ <translation>Слова &amp;целиком</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>&lt;img src=&quot;:/trolltech/shared/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
+ <translation>&lt;img src=&quot;:/trolltech/shared/images/wrap.png&quot;&gt;&amp;nbsp;Поиск с начала</translation>
+ </message>
+</context>
+<context>
+ <name>AddLinkDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/addlinkdialog.ui" line="+5"/>
+ <source>Insert Link</source>
+ <translation>Вставить ссылку</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Title:</source>
+ <translation>Заголовок:</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>URL:</source>
+ <translation>URL:</translation>
+ </message>
+</context>
+<context>
+ <name>AppFontDialog</name>
+ <message>
+ <location filename="../tools/designer/src/designer/appfontdialog.cpp" line="+418"/>
+ <source>Additional Fonts</source>
+ <translation>Дополнительные шрифты</translation>
+ </message>
+</context>
+<context>
+ <name>AppFontManager</name>
+ <message>
+ <location line="-267"/>
+ <source>&apos;%1&apos; is not a file.</source>
+ <translation>&apos;%1&apos; не является файлом.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>The font file &apos;%1&apos; does not have read permissions.</source>
+ <translation>Файл шрифтов &apos;%1&apos; не доступен для чтения.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>The font file &apos;%1&apos; is already loaded.</source>
+ <translation>Файл шрифтов &apos;%1&apos;уже загружен.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>The font file &apos;%1&apos; could not be loaded.</source>
+ <translation>Файл шрифтов &apos;%1&apos; не может быть загружен.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>&apos;%1&apos; is not a valid font id.</source>
+ <translation>&apos;%1&apos; не является корректным идентификатором шрифта.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>There is no loaded font matching the id &apos;%1&apos;.</source>
+ <translation>Нет загруженного шрифта, соответствующего идентификатору &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>The font &apos;%1&apos; (%2) could not be unloaded.</source>
+ <translation>Шрифт &apos;%1&apos; (%2) не может быть выгружен.</translation>
+ </message>
+</context>
+<context>
+ <name>AppFontWidget</name>
+ <message>
+ <location line="+26"/>
+ <source>Fonts</source>
+ <translation>Шрифты</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>Add font files</source>
+ <translation>Добавить файлы шрифтов</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Remove current font file</source>
+ <translation>Удалить текущий файл шрифта</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Remove all font files</source>
+ <translation>Удалить все файлы шрифтов</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Add Font Files</source>
+ <translation>Добавить файлы шрифтов</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Font files (*.ttf)</source>
+ <translation>Файлы шрифтов (*.ttf)</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Error Adding Fonts</source>
+ <translation>Ошибка добавления шрифтов</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Error Removing Fonts</source>
+ <translation>Ошибка удаления шрифтов</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Remove Fonts</source>
+ <translation>Удалить шрифты</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Would you like to remove all fonts?</source>
+ <translation>Желаете удалить все шрифты?</translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceOptionsWidget</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.ui" line="+14"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>User Interface Mode</source>
+ <translation>Режим пользовательского интерфейса</translation>
+ </message>
+</context>
+<context>
+ <name>AssistantClient</name>
+ <message>
+ <location filename="../tools/designer/src/designer/assistantclient.cpp" line="+100"/>
+ <source>Unable to send request: Assistant is not responding.</source>
+ <translation>Невозможно отправить запрос: Qt Assistant не отвечает.</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>The binary &apos;%1&apos; does not exist.</source>
+ <translation>Исполняемый файл &apos;%1&apos; не существует.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Unable to launch assistant (%1).</source>
+ <translation>Невозможно запустить Qt Assistant (%1).</translation>
+ </message>
+</context>
+<context>
+ <name>BrushPropertyManager</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/brushpropertymanager.cpp" line="+52"/>
+ <source>No brush</source>
+ <translation>Пустая</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Solid</source>
+ <translation>Сплошная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 1</source>
+ <translation>Плотность 1</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 2</source>
+ <translation>Плотность 2</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 3</source>
+ <translation>Плотность 3</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 4</source>
+ <translation>Плотность 4</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 5</source>
+ <translation>Плотность 5</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 6</source>
+ <translation>Плотность 6</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Dense 7</source>
+ <translation>Плотность 7</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Horizontal</source>
+ <translation>Горизонтальная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Vertical</source>
+ <translation>Вертикальная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Cross</source>
+ <translation>Крестообразная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Backward diagonal</source>
+ <translation>Обратная диагональ</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Forward diagonal</source>
+ <translation>Диагональ</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Crossing diagonal</source>
+ <translation>Пересекающиеся диагонали</translation>
+ </message>
+ <message>
+ <location line="+83"/>
+ <source>Style</source>
+ <translation>Стиль</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Color</source>
+ <translation>Цвет</translation>
+ </message>
+ <message>
+ <location line="+105"/>
+ <source>[%1, %2]</source>
+ <translation>[%1, %2]</translation>
+ </message>
+</context>
+<context>
+ <name>Command</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="+208"/>
+ <location line="+258"/>
+ <source>Change signal</source>
+ <translation>Сменить сигнал</translation>
+ </message>
+ <message>
+ <location line="-256"/>
+ <location line="+268"/>
+ <source>Change slot</source>
+ <translation>Сменить слот</translation>
+ </message>
+ <message>
+ <location line="-220"/>
+ <source>Change signal-slot connection</source>
+ <translation>Изменить соединение сигнал-слот</translation>
+ </message>
+ <message>
+ <location line="+234"/>
+ <source>Change sender</source>
+ <translation>Сменить отправителя</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Change receiver</source>
+ <translation>Сменить получателя</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+221"/>
+ <source>Create button group</source>
+ <translation>Создать группу кнопок</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Break button group</source>
+ <translation>Разбить группу кнопок</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Break button group &apos;%1&apos;</source>
+ <translation>Разбить группу кнопок &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Add buttons to group</source>
+ <translation>Добавить кнопки в группу</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+458"/>
+ <source>Add &apos;%1&apos; to &apos;%2&apos;</source>
+ <extracomment>Command description for adding buttons to a QButtonGroup</extracomment>
+ <translation>Добавить &apos;%1&apos; в &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Remove buttons from group</source>
+ <translation>Удалить кнопки из группы</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Remove &apos;%1&apos; from &apos;%2&apos;</source>
+ <extracomment>Command description for removing buttons from a QButtonGroup</extracomment>
+ <translation>Удалить &apos;%1&apos; из &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+143"/>
+ <source>Add connection</source>
+ <translation>Добавить соединение</translation>
+ </message>
+ <message>
+ <location line="+54"/>
+ <source>Adjust connection</source>
+ <translation>Настроить соединение</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Delete connections</source>
+ <translation>Удалить соединения</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>Change source</source>
+ <translation>Сменить источник</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Change target</source>
+ <translation>Сменить приёмника</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+349"/>
+ <source>Morph %1/&apos;%2&apos; into %3</source>
+ <extracomment>MorphWidgetCommand description</extracomment>
+ <translation>Преобразовать %1/&apos;%2&apos; в %3</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_command.cpp" line="+149"/>
+ <source>Insert &apos;%1&apos;</source>
+ <translation>Вставить &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+133"/>
+ <source>Change Z-order of &apos;%1&apos;</source>
+ <translation type="unfinished">Изменить порядок удалённости &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+34"/>
+ <source>Raise &apos;%1&apos;</source>
+ <translation>Поднять &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <source>Lower &apos;%1&apos;</source>
+ <translation>Опустить &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <source>Delete &apos;%1&apos;</source>
+ <translation>Удалить &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+119"/>
+ <source>Reparent &apos;%1&apos;</source>
+ <translation>Сменить владельца у &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>Promote to custom widget</source>
+ <translation type="unfinished">Преобразовать в пользовательский виджет</translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <source>Demote from custom widget</source>
+ <translation type="unfinished">Преобразовать из пользовательского виджета</translation>
+ </message>
+ <message>
+ <location line="+79"/>
+ <source>Lay out using grid</source>
+ <translation>Скомпоновать, используя сетку</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lay out vertically</source>
+ <translation>Скомпоновать по вертикали</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lay out horizontally</source>
+ <translation>Скомпоновать по горизонтали</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Break layout</source>
+ <translation>Разбить компоновку</translation>
+ </message>
+ <message>
+ <location line="+105"/>
+ <source>Simplify Grid Layout</source>
+ <translation type="unfinished">Упрощённая компоновка по сетке</translation>
+ </message>
+ <message>
+ <location line="+135"/>
+ <location line="+235"/>
+ <location line="+78"/>
+ <source>Move Page</source>
+ <translation>Переместить страницу</translation>
+ </message>
+ <message>
+ <location line="-279"/>
+ <location line="+123"/>
+ <location line="+188"/>
+ <location line="+666"/>
+ <source>Delete Page</source>
+ <translation>Удалить страницу</translation>
+ </message>
+ <message>
+ <location line="-939"/>
+ <location line="+123"/>
+ <source>Page</source>
+ <translation>Страница</translation>
+ </message>
+ <message>
+ <location line="+860"/>
+ <source>page</source>
+ <translation>страница</translation>
+ </message>
+ <message>
+ <location line="-978"/>
+ <location line="+123"/>
+ <location line="+186"/>
+ <location line="+667"/>
+ <source>Insert Page</source>
+ <translation>Вставить страницу</translation>
+ </message>
+ <message>
+ <location line="-647"/>
+ <source>Change Tab order</source>
+ <translation>Изменить последовательность переключений</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Create Menu Bar</source>
+ <translation>Создать панель меню</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Delete Menu Bar</source>
+ <translation>Удалить панель меню</translation>
+ </message>
+ <message>
+ <location line="+47"/>
+ <source>Create Status Bar</source>
+ <translation>Создать строку состояния</translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <source>Delete Status Bar</source>
+ <translation>Удалить строку состояния</translation>
+ </message>
+ <message>
+ <location line="+45"/>
+ <source>Add Tool Bar</source>
+ <translation>Добавить панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+59"/>
+ <source>Add Dock Window</source>
+ <translation type="unfinished">Добавить прикрепляемое окно</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>Adjust Size of &apos;%1&apos;</source>
+ <translation>Подогнать размер &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+57"/>
+ <source>Change Form Layout Item Geometry</source>
+ <translation type="unfinished">Изменить геометрию элементов компоновки столбцами</translation>
+ </message>
+ <message>
+ <location line="+95"/>
+ <source>Change Layout Item Geometry</source>
+ <translation type="unfinished">Изменить геометрию элементов компоновки</translation>
+ </message>
+ <message>
+ <location line="+138"/>
+ <source>Delete Subwindow</source>
+ <translation>Удалить дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Insert Subwindow</source>
+ <translation>Вставить дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>subwindow</source>
+ <translation>дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Subwindow</source>
+ <translation>Дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+391"/>
+ <source>Change Table Contents</source>
+ <translation>Изменить содержимое таблицы</translation>
+ </message>
+ <message>
+ <location line="+107"/>
+ <source>Change Tree Contents</source>
+ <translation>Изменить содержимое дерева</translation>
+ </message>
+ <message>
+ <location line="+74"/>
+ <location line="+146"/>
+ <source>Add action</source>
+ <translation>Добавить действие</translation>
+ </message>
+ <message>
+ <location line="-120"/>
+ <location line="+126"/>
+ <source>Remove action</source>
+ <translation>Удалить действие</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>Add menu</source>
+ <translation>Добавить меню</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Remove menu</source>
+ <translation>Удалить меню</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Create submenu</source>
+ <translation>Создать дочернее меню</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Delete Tool Bar</source>
+ <translation>Удалить панель инструментов</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_command2.cpp" line="+154"/>
+ <source>Change layout of &apos;%1&apos; from %2 to %3</source>
+ <translation>Изменить компоновку &apos;%1&apos; с %2 на %3</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="+1195"/>
+ <source>Set action text</source>
+ <translation>Установить текст действия</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Insert action</source>
+ <translation>Вставить действие</translation>
+ </message>
+ <message>
+ <location line="+89"/>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="+907"/>
+ <source>Move action</source>
+ <translation>Переместить действие</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-424"/>
+ <source>Change Title</source>
+ <translation>Изменить заголовок</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Insert Menu</source>
+ <translation>Вставить меню</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_propertycommand.cpp" line="+1213"/>
+ <source>Changed &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished">Изменено &apos;%1&apos; у &apos;%2&apos;</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+3"/>
+ <source>Changed &apos;%1&apos; of %n objects</source>
+ <translation type="unfinished">
+ <numerusform>Изменено &apos;%1&apos; у %n объекта</numerusform>
+ <numerusform>Изменено &apos;%1&apos; у %n объектов</numerusform>
+ <numerusform>Изменено &apos;%1&apos; у %n объектов</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+76"/>
+ <source>Reset &apos;%1&apos; of &apos;%2&apos;</source>
+ <translation type="unfinished">Восстановлено &apos;%1&apos; у &apos;%2&apos;</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+3"/>
+ <source>Reset &apos;%1&apos; of %n objects</source>
+ <translation type="unfinished">
+ <numerusform>Восстановлено &apos;%1&apos; у %n объекта</numerusform>
+ <numerusform>Восстановлено &apos;%1&apos; у %n объектов</numerusform>
+ <numerusform>Восстановлено &apos;%1&apos; у %n объектов</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+89"/>
+ <source>Add dynamic property &apos;%1&apos; to &apos;%2&apos;</source>
+ <translation type="unfinished">Добавлено динамическое свойство &apos;%1&apos; &apos;%2&apos;</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+3"/>
+ <source>Add dynamic property &apos;%1&apos; to %n objects</source>
+ <translation type="unfinished">
+ <numerusform>Добавлено динамическое свойство &apos;%1&apos; %n объекту</numerusform>
+ <numerusform>Добавлено динамическое свойство &apos;%1&apos; %n объектам</numerusform>
+ <numerusform>Добавлено динамическое свойство &apos;%1&apos; %n объектам</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+86"/>
+ <source>Remove dynamic property &apos;%1&apos; from &apos;%2&apos;</source>
+ <translation type="unfinished">Удалено динамическое свойство &apos;%1&apos; у &apos;%2&apos;</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+3"/>
+ <source>Remove dynamic property &apos;%1&apos; from %n objects</source>
+ <translation type="unfinished">
+ <numerusform>Удалено динамическое свойство &apos;%1&apos; у %n объекта</numerusform>
+ <numerusform>Удалено динамическое свойство &apos;%1&apos; у %n объектов</numerusform>
+ <numerusform>Удалено динамическое свойство &apos;%1&apos; у %n объектов</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/scriptcommand.cpp" line="+55"/>
+ <source>Change script</source>
+ <translation>Изменить сценарий</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+202"/>
+ <source>Change signals/slots</source>
+ <translation>Изменить сигналы/слоты</translation>
+ </message>
+</context>
+<context>
+ <name>ConnectDialog</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/connectdialog.ui" line="+13"/>
+ <source>Configure Connection</source>
+ <translation>Настройка соединения</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+40"/>
+ <source>GroupBox</source>
+ <translation>GroupBox</translation>
+ </message>
+ <message>
+ <location line="-25"/>
+ <location line="+40"/>
+ <source>Edit...</source>
+ <translation>Изменить...</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Show signals and slots inherited from QWidget</source>
+ <translation>Показывать сигналы и слоты, унаследованные от QWidget</translation>
+ </message>
+</context>
+<context>
+ <name>ConnectionDelegate</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="+643"/>
+ <source>&lt;object&gt;</source>
+ <translation>&lt;объект&gt;</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>&lt;signal&gt;</source>
+ <translation>&lt;сигнал&gt;</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>&lt;slot&gt;</source>
+ <translation>&lt;слот&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DPI_Chooser</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+69"/>
+ <source>Standard (96 x 96)</source>
+ <extracomment>Embedded device standard screen resolution</extracomment>
+ <translation>Стандартное (96 x 96)</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Greenphone (179 x 185)</source>
+ <extracomment>Embedded device screen resolution</extracomment>
+ <translation>Greenphone (179 x 185)</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>High (192 x 192)</source>
+ <extracomment>Embedded device high definition screen resolution</extracomment>
+ <translation>Высокое (192 x 192)</translation>
+ </message>
+</context>
+<context>
+ <name>Designer</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+449"/>
+ <source>Qt Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>This file contains top level spacers.&lt;br&gt;They have &lt;b&gt;NOT&lt;/b&gt; been saved into the form.</source>
+ <translation>Этот файл содержит верхнеуровневые разделители.&lt;br&gt;Они &lt;b&gt;НЕ&lt;/b&gt; были сохранены в форме.</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Perhaps you forgot to create a layout?</source>
+ <translation>Возможно, вы забыли создать компоновщик?</translation>
+ </message>
+ <message>
+ <location line="+173"/>
+ <source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
+ <translation type="unfinished">Некорректный файл UI: Отсутствует корневой элемент &lt;ui&gt;.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
+ <translation type="unfinished">При чтении файла UI в строке %1 позиции %2 возникла ошибка: %3</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>This file cannot be read because it was created using %1.</source>
+ <translation>Не удалось прочитать файл, так как он был создан с использованием %1.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>This file was created using Designer from Qt-%1 and cannot be read.</source>
+ <translation>Не удалось прочитать файл, так как он был создан с использованием Designer из Qt-%1.</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>The converted file could not be read.</source>
+ <translation>Не удалось прочитать преобразованный файл.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>This file was created using Designer from Qt-%1 and will be converted to a new form by Qt Designer.</source>
+ <translation>Этот файл был создан с использованием Designer из Qt-%1 и будет преобразован в новый формат.</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>The old form has not been touched, but you will have to save the form under a new name.</source>
+ <translation>Старая форма была изменена, но вы можете сохранить форму под новым именем.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>This file was created using Designer from Qt-%1 and could not be read:
+%2</source>
+ <translation>Не удалось прочитать файл, так как он был создан с использованием Designer из Qt-%1:
+%2</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Please run it through &lt;b&gt;uic3&amp;nbsp;-convert&lt;/b&gt; to convert it to Qt-4&apos;s ui format.</source>
+ <translation>Пожалуйста, пропустите его через &lt;b&gt;uic3&amp;nbsp;-convert&lt;/b&gt; для преобразования в формат ui для Qt-4.</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>This file cannot be read because the extra info extension failed to load.</source>
+ <translation type="unfinished">Не удалось прочитать файл, так как возникла ошибка при загрузке расширения дополнительной информации.</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qsimpleresource.cpp" line="+339"/>
+ <source>Custom Widgets</source>
+ <translation>Пользовательские виджеты</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Promoted Widgets</source>
+ <translation type="unfinished">Преобразованные виджеты</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_utils.cpp" line="+682"/>
+ <source>Unable to launch %1.</source>
+ <translation>Невозможно запустить %1.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1 timed out.</source>
+ <translation>%1 время ожидания истекло.</translation>
+ </message>
+</context>
+<context>
+ <name>DesignerMetaEnum</name>
+ <message>
+ <location line="-513"/>
+ <source>%1 is not a valid enumeration value of &apos;%2&apos;.</source>
+ <translation>%1 не является корректным перечислением типа &apos;%2&apos;.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&apos;%1&apos; could not be converted to an enumeration value of type &apos;%2&apos;.</source>
+ <translation>Не удалось преобразовать &apos;%1&apos; к значению перечисления &apos;%2&apos;.</translation>
+ </message>
+</context>
+<context>
+ <name>DesignerMetaFlags</name>
+ <message>
+ <location line="+78"/>
+ <source>&apos;%1&apos; could not be converted to a flag value of type &apos;%2&apos;.</source>
+ <translation>Не удалось преобразовать &apos;%1&apos; к флаговому значению типа &apos;%2&apos;.</translation>
+ </message>
+</context>
+<context>
+ <name>DeviceProfile</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/deviceprofile.cpp" line="+397"/>
+ <source>&apos;%1&apos; is not a number.</source>
+ <extracomment>Reading a number for an embedded device profile</extracomment>
+ <translation>&apos;%1&apos; не является числом.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>An invalid tag &lt;%1&gt; was encountered.</source>
+ <translation>Обнаружен некоррекнтый тэг &lt;%1&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>DeviceProfileDialog</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.ui" line="+20"/>
+ <source>&amp;Family</source>
+ <translation>&amp;Шрифт</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>&amp;Point Size</source>
+ <translation>&amp;Размер</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Style</source>
+ <translation>Начертание</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Device DPI</source>
+ <translation>DPI устройства</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Name</source>
+ <translation>Название</translation>
+ </message>
+</context>
+<context>
+ <name>DeviceSkin</name>
+ <message>
+ <location filename="../tools/shared/deviceskin/deviceskin.cpp" line="+79"/>
+ <source>The image file &apos;%1&apos; could not be loaded.</source>
+ <translation>Не удалось загрузить файл изображения &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+64"/>
+ <source>The skin directory &apos;%1&apos; does not contain a configuration file.</source>
+ <translation>Каталог &apos;%1&apos; не содержит файла настроек обложки.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>The skin configuration file &apos;%1&apos; could not be opened.</source>
+ <translation>Не удалось открыть файл настроек обложки &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The skin configuration file &apos;%1&apos; could not be read: %2</source>
+ <translation>Не удалось прочитать файл настроек обложки &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <location line="+70"/>
+ <source>Syntax error: %1</source>
+ <translation>Синтаксическая ошибка: %1</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>The skin &quot;up&quot; image file &apos;%1&apos; does not exist.</source>
+ <translation>Отсутствует файл изображения &quot;up&quot; обложки &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>The skin &quot;down&quot; image file &apos;%1&apos; does not exist.</source>
+ <translation>Отсутствует файл изображения &quot;down&quot; обложки &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>The skin &quot;closed&quot; image file &apos;%1&apos; does not exist.</source>
+ <translation>Отсутствует файл изображения обложки &quot;closed&quot; &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>The skin cursor image file &apos;%1&apos; does not exist.</source>
+ <translation>Отсутствует файл изображения курсора обложки &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Syntax error in area definition: %1</source>
+ <translation>Синтаксическая ошибка в определении области: %1</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Mismatch in number of areas, expected %1, got %2.</source>
+ <translation>Несоответствие количества областей: ожидалось %1, найдено %2.</translation>
+ </message>
+</context>
+<context>
+ <name>EmbeddedOptionsControl</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="+307"/>
+ <source>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Style&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Resolution&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</source>
+ <extracomment>Format embedded device profile description</extracomment>
+ <translation>&lt;html&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Шрифт&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%1, %2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Стиль&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Разрешение&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4 x %5&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/html&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>EmbeddedOptionsPage</name>
+ <message>
+ <location line="+103"/>
+ <source>Embedded Design</source>
+ <extracomment>Tab in preferences dialog</extracomment>
+ <translation type="unfinished">Оформление портативных устройств</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Device Profiles</source>
+ <extracomment>EmbeddedOptionsControl group box&quot;</extracomment>
+ <translation>Профили устройств</translation>
+ </message>
+</context>
+<context>
+ <name>FontPanel</name>
+ <message>
+ <location filename="../tools/shared/fontpanel/fontpanel.cpp" line="+63"/>
+ <source>Font</source>
+ <translation>Шрифт</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&amp;Writing system</source>
+ <translation>Система &amp;письма</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Family</source>
+ <translation>&amp;Шрифт</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>&amp;Style</source>
+ <translation>&amp;Начертание</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>&amp;Point size</source>
+ <translation>&amp;Размер</translation>
+ </message>
+</context>
+<context>
+ <name>FontPropertyManager</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/fontpropertymanager.cpp" line="+62"/>
+ <source>PreferDefault</source>
+ <translation>По умолчанию</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>NoAntialias</source>
+ <translation>Без сглаживания</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>PreferAntialias</source>
+ <translation>Сглаживание, если возможно</translation>
+ </message>
+ <message>
+ <location line="+61"/>
+ <source>Antialiasing</source>
+ <translation>Сглаживание</translation>
+ </message>
+</context>
+<context>
+ <name>FormBuilder</name>
+ <message>
+ <location filename="../tools/designer/src/lib/uilib/formbuilderextra.cpp" line="+359"/>
+ <source>Invalid stretch value for &apos;%1&apos;: &apos;%2&apos;</source>
+ <extracomment>Parsing layout stretch values</extracomment>
+ <translation>Некорректный коэффициент растяжения для &apos;%1&apos;: &apos;%2&apos;</translation>
+ </message>
+ <message>
+ <location line="+62"/>
+ <source>Invalid minimum size for &apos;%1&apos;: &apos;%2&apos;</source>
+ <extracomment>Parsing grid layout minimum size values</extracomment>
+ <translation>Некорректный минимальный размер для &apos;%1&apos;: &apos;%2&apos;</translation>
+ </message>
+</context>
+<context>
+ <name>FormEditorOptionsPage</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formeditor_optionspage.cpp" line="+91"/>
+ <source>%1 %</source>
+ <translation>%1 %</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Preview Zoom</source>
+ <translation>Масштаб предпросмотра</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Default Zoom</source>
+ <translation>Масштаб по умолчанию</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Forms</source>
+ <extracomment>Tab in preferences dialog</extracomment>
+ <translation>Формы</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Default Grid</source>
+ <translation>Сетка по умолчанию</translation>
+ </message>
+</context>
+<context>
+ <name>FormLayoutRowDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/formlayoutrowdialog.ui" line="+6"/>
+ <source>Add Form Layout Row</source>
+ <translatorcomment>нелепица какая-то</translatorcomment>
+ <translation type="unfinished">Добавление строки компоновки компоновщика формы</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&amp;Label text:</source>
+ <translation>Текст &amp;метки:</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Field &amp;type:</source>
+ <translation>&amp;Тип поля:</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>&amp;Field name:</source>
+ <translation>Имя п&amp;оля:</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>&amp;Buddy:</source>
+ <translation>П&amp;артнёр:</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>&amp;Row:</source>
+ <translation>&amp;Строка:</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Label &amp;name:</source>
+ <translation>Имя м&amp;етки:</translation>
+ </message>
+</context>
+<context>
+ <name>FormWindow</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="+1701"/>
+ <source>Unexpected element &lt;%1&gt;</source>
+ <translation>Неожиданный элемент &lt;%1&gt;</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Error while pasting clipboard contents at line %1, column %2: %3</source>
+ <translation>Ошибка вставки содержимого из буфера обмена в строке %1, позиции %2: %3</translation>
+ </message>
+</context>
+<context>
+ <name>FormWindowSettings</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formwindowsettings.ui" line="+54"/>
+ <source>Form Settings</source>
+ <translation>Настройки формы</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Layout &amp;Default</source>
+ <translation>Компоновка по &amp;умолчанию</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>&amp;Spacing:</source>
+ <translation>&amp;Отступ:</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>&amp;Margin:</source>
+ <translation>&amp;Границы:</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>&amp;Layout Function</source>
+ <translation>&amp;Функция компоновки</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Ma&amp;rgin:</source>
+ <translation>Г&amp;раницы:</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Spa&amp;cing:</source>
+ <translation>О&amp;тступ:</translation>
+ </message>
+ <message>
+ <location line="+117"/>
+ <source>&amp;Author</source>
+ <translation>&amp;Автор</translation>
+ </message>
+ <message>
+ <location line="-41"/>
+ <source>&amp;Include Hints</source>
+ <translation>&amp;Подключить подсказки</translation>
+ </message>
+ <message>
+ <location line="-53"/>
+ <source>&amp;Pixmap Function</source>
+ <translation type="unfinished">&amp;Загрузчик изображений</translation>
+ </message>
+ <message>
+ <location line="+71"/>
+ <source>Grid</source>
+ <translation>Сетка</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Embedded Design</source>
+ <translation type="unfinished">Оформление портативных устройств</translation>
+ </message>
+</context>
+<context>
+ <name>IconSelector</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="+352"/>
+ <source>All Pixmaps (</source>
+ <translation>Растровые изображения (</translation>
+ </message>
+</context>
+<context>
+ <name>ItemPropertyBrowser</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+66"/>
+ <source>XX Icon Selected off</source>
+ <extracomment>Sample string to determinate the width for the first column of the list item property browser</extracomment>
+ <translation>XX Пикт Выделена откл</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindowBase</name>
+ <message>
+ <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+119"/>
+ <source>Main</source>
+ <extracomment>Not currently used (main tool bar)</extracomment>
+ <translation>Главное</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>File</source>
+ <translation>Файл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Edit</source>
+ <translation>Правка</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Tools</source>
+ <translation>Инструменты</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Qt Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+</context>
+<context>
+ <name>NewForm</name>
+ <message>
+ <location filename="../tools/designer/src/designer/newform.cpp" line="+79"/>
+ <source>C&amp;reate</source>
+ <translation>&amp;Создать</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Recent</source>
+ <translation>Последние</translation>
+ </message>
+ <message>
+ <location line="+32"/>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Open...</source>
+ <translation>&amp;Открыть...</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>&amp;Recent Forms</source>
+ <translation>&amp;Последние формы</translation>
+ </message>
+ <message>
+ <location line="+64"/>
+ <source>Read error</source>
+ <translation>Ошибка чтения</translation>
+ </message>
+ <message>
+ <location line="-100"/>
+ <source>New Form</source>
+ <translation>Новая форма</translation>
+ </message>
+ <message>
+ <location line="-5"/>
+ <source>Show this Dialog on Startup</source>
+ <translation>Показывать диалог при старте</translation>
+ </message>
+ <message>
+ <location line="+128"/>
+ <source>A temporary form file could not be created in %1.</source>
+ <translation>Временный файл формы не может быть создан в %1.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The temporary form file %1 could not be written.</source>
+ <translation>Временный файл формы %1 не может быть записан.</translation>
+ </message>
+</context>
+<context>
+ <name>ObjectInspectorModel</name>
+ <message>
+ <location filename="../tools/designer/src/components/objectinspector/objectinspectormodel.cpp" line="+360"/>
+ <source>Object</source>
+ <translation>Объект</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Class</source>
+ <translation>Класс</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>separator</source>
+ <translation>разделитель</translation>
+ </message>
+ <message>
+ <location line="+98"/>
+ <source>&lt;noname&gt;</source>
+ <translation>&lt;без имени&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>ObjectNameDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+158"/>
+ <source>Change Object Name</source>
+ <translation>Изменить имя объекта</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Object Name</source>
+ <translation>Имя объекта</translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/plugindialog.ui" line="+54"/>
+ <source>Plugin Information</source>
+ <translation>Информация о модуле</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+</context>
+<context>
+ <name>PreferencesDialog</name>
+ <message>
+ <location filename="../tools/designer/src/designer/preferencesdialog.ui" line="+20"/>
+ <source>Preferences</source>
+ <translation>Настройки</translation>
+ </message>
+</context>
+<context>
+ <name>PreviewConfigurationWidget</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.ui" line="+5"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Print/Preview Configuration</source>
+ <translation>Настройка печати/предпросмотра</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Style</source>
+ <translation>Стиль</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Style sheet</source>
+ <translation>Таблица стилей</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+7"/>
+ <location line="+21"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="-12"/>
+ <source>Device skin</source>
+ <translation>Обложка устройства</translation>
+ </message>
+</context>
+<context>
+ <name>PromotionModel</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+112"/>
+ <source>Not used</source>
+ <extracomment>Usage of promoted widgets</extracomment>
+ <translation>Не используется</translation>
+ </message>
+</context>
+<context>
+ <name>Q3WizardContainer</name>
+ <message>
+ <location filename="../tools/designer/src/plugins/widgets/q3wizard/q3wizard_container.cpp" line="+172"/>
+ <location line="+5"/>
+ <source>Page</source>
+ <translation>Страница</translation>
+ </message>
+</context>
+<context>
+ <name>QAbstractFormBuilder</name>
+ <message>
+ <location filename="../tools/designer/src/lib/uilib/abstractformbuilder.cpp" line="+206"/>
+ <source>Unexpected element &lt;%1&gt;</source>
+ <translation>Неожиданный элемент &lt;%1&gt;</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>An error has occurred while reading the UI file at line %1, column %2: %3</source>
+ <translation type="unfinished">Возникла ошибка при чтении файла UI в строке %1 позиции %2: %3</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Invalid UI file: The root element &lt;ui&gt; is missing.</source>
+ <translation type="unfinished">Неверный файл UI: Отсутствует корневой элемент &lt;ui&gt;.</translation>
+ </message>
+ <message>
+ <location line="+119"/>
+ <source>The creation of a widget of the class &apos;%1&apos; failed.</source>
+ <translation>Не удалось создание виджета класса &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+296"/>
+ <source>Attempt to add child that is not of class QWizardPage to QWizard.</source>
+ <translation>Попытка добавить в QWizard дочерний виджет, который не является классом QWizardPage.</translation>
+ </message>
+ <message>
+ <location line="+86"/>
+ <source>Attempt to add a layout to a widget &apos;%1&apos; (%2) which already has a layout of non-box type %3.
+This indicates an inconsistency in the ui-file.</source>
+ <translation>Попытка добавить компоновщик виджету &apos;%1&apos; (%2), у которого уже имеется компоновщик типа %3.
+Это указывает на некорректность файла UI.</translation>
+ </message>
+ <message>
+ <location line="+144"/>
+ <source>Empty widget item in %1 &apos;%2&apos;.</source>
+ <translation>Пустой элемент виджета в %1 &apos;%2&apos;.</translation>
+ </message>
+ <message>
+ <location line="+680"/>
+ <source>Flags property are not supported yet.</source>
+ <translation>Флаговые свойства еще не поддерживаются.</translation>
+ </message>
+ <message>
+ <location line="+81"/>
+ <source>While applying tab stops: The widget &apos;%1&apos; could not be found.</source>
+ <translation>При применении позиций табуляции: не удалось найти виджет &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+908"/>
+ <source>Invalid QButtonGroup reference &apos;%1&apos; referenced by &apos;%2&apos;.</source>
+ <translation>&apos;%2&apos; содержит некорректную ссылку на QButtonGroup &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+511"/>
+ <source>This version of the uitools library is linked without script support.</source>
+ <translation>Данная версия библиотеки uitools собрана без поддержки сценариев.</translation>
+ </message>
+</context>
+<context>
+ <name>QAxWidgetPlugin</name>
+ <message>
+ <location filename="../tools/designer/src/plugins/activeqt/qaxwidgetplugin.cpp" line="+75"/>
+ <source>ActiveX control</source>
+ <translation>Элемент управления ActiveX</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>ActiveX control widget</source>
+ <translation>Виджет элемента управления ActiveX</translation>
+ </message>
+</context>
+<context>
+ <name>QAxWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="+119"/>
+ <source>Set Control</source>
+ <translation>Установить элемент управления</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reset Control</source>
+ <translation type="unfinished">Удалить элемент управления</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Licensed Control</source>
+ <translation>Лицензионный элемент управления</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The control requires a design-time license</source>
+ <translation>Компонент требует лицензию периода разработки</translation>
+ </message>
+</context>
+<context>
+ <name>QCoreApplication</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_promotion.cpp" line="+83"/>
+ <source>%1 is not a promoted class.</source>
+ <translation type="unfinished">%1 не является преобразованным классом.</translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <source>The base class %1 is invalid.</source>
+ <translation>Неверный базовый класс %1.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>The class %1 already exists.</source>
+ <translation>Класс %1 уже существует.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Promoted Widgets</source>
+ <translation type="unfinished">Преобразованные виджеты</translation>
+ </message>
+ <message>
+ <location line="+126"/>
+ <source>The class %1 cannot be removed</source>
+ <translation>Нельзя удалить класс %1</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>The class %1 cannot be removed because it is still referenced.</source>
+ <translation>Нельзя удалить класс %1, так как на него ещё есть ссылки.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>The class %1 cannot be renamed</source>
+ <translation>Нельзя переименовать класс %1</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>The class %1 cannot be renamed to an empty name.</source>
+ <translation>Нельзя дать классу %1 пустое имя.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>There is already a class named %1.</source>
+ <translation>Уже есть класс с именем %1.</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Cannot set an empty include file.</source>
+ <translatorcomment>перевод близко к тексту - буквальный совсем глаз режет</translatorcomment>
+ <translation>Пустое имя у подключаемого файла не допустимо.</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/uilib/formscriptrunner.cpp" line="+88"/>
+ <source>Exception at line %1: %2</source>
+ <translation>Исключение в строке %1: %2</translation>
+ </message>
+ <message>
+ <location line="+36"/>
+ <source>Unknown error</source>
+ <translation>Неизвестная ошибка</translation>
+ </message>
+ <message>
+ <location line="+50"/>
+ <source>An error occurred while running the script for %1: %2
+Script: %3</source>
+ <translation>При выполнении сценария %1 возникла ошибка: %2
+Сценарий: %3</translation>
+ </message>
+</context>
+<context>
+ <name>QDesigner</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner.cpp" line="+141"/>
+ <source>%1 - warning</source>
+ <translation>%1 - предупреждение</translation>
+ </message>
+ <message>
+ <location line="+96"/>
+ <source>Qt Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>This application cannot be used for the Console edition of Qt</source>
+ <translation>Это приложение не может быть использовано для консольной версии Qt</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerActions</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_actions.cpp" line="+128"/>
+ <source>Saved %1.</source>
+ <translation>Сохранено %1.</translation>
+ </message>
+ <message>
+ <location line="+50"/>
+ <source>Edit Widgets</source>
+ <translation>Изменение виджетов</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>&amp;Quit</source>
+ <translation>&amp;Выход</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Minimize</source>
+ <translation>&amp;Свернуть</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Bring All to Front</source>
+ <translation>Перенести все назад</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Preferences...</source>
+ <translation>Настройки...</translation>
+ </message>
+ <message>
+ <location line="+298"/>
+ <source>Clear &amp;Menu</source>
+ <translation>Очистить &amp;меню</translation>
+ </message>
+ <message>
+ <location line="-233"/>
+ <source>CTRL+SHIFT+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <source>CTRL+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>CTRL+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Qt Designer &amp;Help</source>
+ <translation>&amp;Справка по Qt Designer</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Current Widget Help</source>
+ <translation>Справка по виджету</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>What&apos;s New in Qt Designer?</source>
+ <translation>Что нового в Qt Designer?</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>About Plugins</source>
+ <translation>О модулях</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+601"/>
+ <source>About Qt Designer</source>
+ <translation>О Qt Designer</translation>
+ </message>
+ <message>
+ <location line="-595"/>
+ <source>About Qt</source>
+ <translation>О Qt</translation>
+ </message>
+ <message>
+ <location line="+121"/>
+ <location line="+197"/>
+ <source>Open Form</source>
+ <translation>Открыть форму</translation>
+ </message>
+ <message>
+ <location line="-196"/>
+ <location line="+37"/>
+ <location line="+160"/>
+ <source>Designer UI files (*.%1);;All Files (*)</source>
+ <translation>UI файлы Qt Designer (*.%1);;Все файлы (*)</translation>
+ </message>
+ <message>
+ <location line="-620"/>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1 уже существует.
+Хотите заменить его?</translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <source>Additional Fonts...</source>
+ <translation>Дополнительные шрифты...</translation>
+ </message>
+ <message>
+ <location line="+303"/>
+ <source>&amp;Recent Forms</source>
+ <translation>&amp;Последние формы</translation>
+ </message>
+ <message>
+ <location line="+202"/>
+ <source>Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Feature not implemented yet!</source>
+ <translation>Возможность ещё не реализована!</translation>
+ </message>
+ <message>
+ <location line="+59"/>
+ <source>Read error</source>
+ <translation>Ошиька чтения</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>%1
+Do you want to update the file location or generate a new form?</source>
+ <translation>%1
+Вы хотите обновить расположение файла или генерировать новую форму?</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Update</source>
+ <translation>&amp;Обновить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;New Form</source>
+ <translation>&amp;Новая форма</translation>
+ </message>
+ <message>
+ <location line="+77"/>
+ <location line="+40"/>
+ <source>Save Form?</source>
+ <translation>Сохранить форму?</translation>
+ </message>
+ <message>
+ <location line="-39"/>
+ <source>Could not open file</source>
+ <translation>Невозможно открыть файл</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Select New File</source>
+ <translation>Выбрать новый файл</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Could not write file</source>
+ <translation>Невозможно записать файл</translation>
+ </message>
+ <message>
+ <location line="+201"/>
+ <source>&amp;Close Preview</source>
+ <translation>&amp;Закрыть предпросмотр</translation>
+ </message>
+ <message>
+ <location line="-905"/>
+ <source>&amp;New...</source>
+ <translation>&amp;Новый...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;Open...</source>
+ <translation>&amp;Открыть...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Save &amp;As...</source>
+ <translation>Сохранить &amp;как...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Save A&amp;ll</source>
+ <translation>Сохранить &amp;все</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Save As &amp;Template...</source>
+ <translation>Сохранить как &amp;шаблон...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <location line="+901"/>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <location line="-900"/>
+ <source>Save &amp;Image...</source>
+ <translation>Сохранить &amp;Изображение...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;Print...</source>
+ <translation>&amp;Печать...</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>View &amp;Code...</source>
+ <translation>Показать &amp;код...</translation>
+ </message>
+ <message>
+ <location line="+68"/>
+ <source>ALT+CTRL+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+356"/>
+ <location line="+248"/>
+ <source>Save Form As</source>
+ <translation>Сохранить форму как</translation>
+ </message>
+ <message>
+ <location line="+429"/>
+ <source>Preview failed</source>
+ <translation>Ошибка предпросмотра</translation>
+ </message>
+ <message>
+ <location line="-575"/>
+ <source>Code generation failed</source>
+ <translation>Ошибка генерации кода</translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>The file %1 could not be opened.
+Reason: %2
+Would you like to retry or select a different file?</source>
+ <translation>Файл %1 не может быть открыт.
+Причина: %2
+Вы хотите повторить или выбрать другой файл?</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>It was not possible to write the entire file %1 to disk.
+Reason:%2
+Would you like to retry?</source>
+ <translation>Не удалось полностью записать файл %1 на диск.
+Причина: %2
+Желаете повторить?</translation>
+ </message>
+ <message>
+ <location line="+158"/>
+ <location line="+34"/>
+ <source>Assistant</source>
+ <translation>Qt Assistant</translation>
+ </message>
+ <message>
+ <location line="+47"/>
+ <location line="+23"/>
+ <source>The backup file %1 could not be written.</source>
+ <translation>Не удалось записать файл резервной копии %1.</translation>
+ </message>
+ <message>
+ <location line="+107"/>
+ <source>The backup directory %1 could not be created.</source>
+ <translation>Не удалось создать каталог резервных копий %1.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The temporary backup directory %1 could not be created.</source>
+ <translation>Не удалось создать временный каталог резервных копий %1.</translation>
+ </message>
+ <message>
+ <location line="+54"/>
+ <source>Image files (*.%1)</source>
+ <translation>Файлы изображений (*.%1)</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <location line="+17"/>
+ <source>Save Image</source>
+ <translation>Сохранить изображение</translation>
+ </message>
+ <message>
+ <location line="-4"/>
+ <source>Saved image %1.</source>
+ <translation>Сохранить изображение %1.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>The file %1 could not be written.</source>
+ <translation>Файл %1 не может быть записан.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Please close all forms to enable the loading of additional fonts.</source>
+ <translation>Пожалуйста закройте все формы, чтобы разрешить загрузку дополнительных шрифтов.</translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Printed %1.</source>
+ <translation>Распечатано %1.</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerAppearanceOptionsPage</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_appearanceoptions.cpp" line="+138"/>
+ <source>Appearance</source>
+ <extracomment>Tab in preferences dialog</extracomment>
+ <translation>Оформление</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerAppearanceOptionsWidget</name>
+ <message>
+ <location line="-53"/>
+ <source>Docked Window</source>
+ <translation>Всё в одном окне верхнего уровня</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Multiple Top-Level Windows</source>
+ <translation>Множество окон верхнего уровня</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Toolwindow Font</source>
+ <translation>Шрифт окна инструментов</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerAxWidget</name>
+ <message>
+ <location filename="../tools/designer/src/plugins/activeqt/qaxwidgettaskmenu.cpp" line="-71"/>
+ <source>Reset control</source>
+ <translation>Сбросить элемент управления</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Set control</source>
+ <translation>Установить элемент управления</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/plugins/activeqt/qdesigneraxwidget.cpp" line="+179"/>
+ <source>Control loaded</source>
+ <translation>Элемент управления загружен</translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <source>A COM exception occurred when executing a meta call of type %1, index %2 of &quot;%3&quot;.</source>
+ <translation type="unfinished">Возникло исключение COM при выполнении мета-вызова типа %1, индекс %2 &quot;%3&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerFormBuilder</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_formbuilder.cpp" line="+89"/>
+ <source>Script errors occurred:</source>
+ <translation>Возникла ошибка сценария:</translation>
+ </message>
+ <message>
+ <location line="+307"/>
+ <source>The preview failed to build.</source>
+ <translation>Не удалось создать предпросмотр.</translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <source>Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerFormWindow</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_formwindow.cpp" line="+217"/>
+ <source>%1 - %2[*]</source>
+ <translation>%1 - %2[*]</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Save Form?</source>
+ <translation>Сохранить форму?</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Do you want to save the changes to this document before closing?</source>
+ <translation>Документ был изменен, хотите сохранить изменения?</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>If you don&apos;t save, your changes will be lost.</source>
+ <translation>Если вы не сохраните, ваши изменения будут потеряны.</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menu.cpp" line="-1181"/>
+ <source>Type Here</source>
+ <translation>Пишите здесь</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Add Separator</source>
+ <translation>Добавить разделитель</translation>
+ </message>
+ <message>
+ <location line="+371"/>
+ <source>Insert separator</source>
+ <translation>Вставить разделитель</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Remove separator</source>
+ <translation>Удалить разделитель</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Remove action &apos;%1&apos;</source>
+ <translation>Удалить действие &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <location line="+650"/>
+ <source>Add separator</source>
+ <translation>Добавить разделитель</translation>
+ </message>
+ <message>
+ <location line="-348"/>
+ <source>Insert action</source>
+ <translation>Вставить действие</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerMenuBar</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_menubar.cpp" line="-375"/>
+ <source>Type Here</source>
+ <translation>Пишите здесь</translation>
+ </message>
+ <message>
+ <location line="+298"/>
+ <source>Remove Menu &apos;%1&apos;</source>
+ <translation>Удалить меню &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Remove Menu Bar</source>
+ <translation>Удалить панель меню</translation>
+ </message>
+ <message>
+ <location line="+70"/>
+ <source>Menu</source>
+ <translation>Меню</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerPluginManager</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/pluginmanager.cpp" line="+271"/>
+ <source>An XML error was encountered when parsing the XML of the custom widget %1: %2</source>
+ <translation>Обнаружена ошибка XML при разборе XML пользовательского виджета %1: %2</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>A required attribute (&apos;%1&apos;) is missing.</source>
+ <translation type="unfinished">Отсутствует необходимый атрибут (&apos;%1&apos;).</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>An invalid property specification (&apos;%1&apos;) was encountered. Supported types: %2</source>
+ <translation type="unfinished">Обнаружена неверная спецификация (&apos;%1&apos;) свойства. Поддерживаются типы: %2</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>&apos;%1&apos; is not a valid string property specification.</source>
+ <translation type="unfinished">&apos;%1&apos; не является корректной спецификацией строкового свойства.</translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <source>The XML of the custom widget %1 does not contain any of the elements &lt;widget&gt; or &lt;ui&gt;.</source>
+ <translation>XML пользовательского виджета %1 не содержит элементов &lt;widget&gt; и &lt;ui&gt;.</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>The class attribute for the class %1 is missing.</source>
+ <translation>Отсутствует атрибут для класса %1.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>The class attribute for the class %1 does not match the class name %2.</source>
+ <translation>Атрибут для класса %1 не совпадает с именем класса %2.</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerPropertySheet</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_propertysheet.cpp" line="+754"/>
+ <source>Dynamic Properties</source>
+ <translation>Динамические свойства</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerResource</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+461"/>
+ <source>The layout type &apos;%1&apos; is not supported, defaulting to grid.</source>
+ <translation>Компоновка типа &apos;%1&apos; не поддерживается, заменена на компоновку сеткой.</translation>
+ </message>
+ <message>
+ <location line="+243"/>
+ <source>The container extension of the widget &apos;%1&apos; (%2) returned a widget not managed by Designer &apos;%3&apos; (%4) when queried for page #%5.
+Container pages should only be added by specifying them in XML returned by the domXml() method of the custom widget.</source>
+ <translation>Контейнерное расширение виджета &apos;%1&apos; (%2) возвратило виджет, который не управляется Qt Designer &apos;%3&apos; (%4), при запросе страницы №%5.
+Страницы контейнера должны быть добавлены указанием их в XML, который возвращается методом domXml() пользовательского виджета.</translation>
+ </message>
+ <message>
+ <location line="+599"/>
+ <source>Unexpected element &lt;%1&gt;</source>
+ <extracomment>Parsing clipboard contents</extracomment>
+ <translation>Неожиданный элемент &lt;%1&gt;</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Error while pasting clipboard contents at line %1, column %2: %3</source>
+ <extracomment>Parsing clipboard contents</extracomment>
+ <translation>Ошибка вставки содержимого буфера обмена в строку %1, позицию %2: %3</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Error while pasting clipboard contents: The root element &lt;ui&gt; is missing.</source>
+ <extracomment>Parsing clipboard contents</extracomment>
+ <translation>Ошибка вставки содержимого буфера обмена: отсутствует корневой элемент &lt;ui&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerSharedSettings</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/shared_settings.cpp" line="+83"/>
+ <source>The template path %1 could not be created.</source>
+ <translation>Не удалось создать временный путь %1.</translation>
+ </message>
+ <message>
+ <location line="+184"/>
+ <source>An error has been encountered while parsing device profile XML: %1</source>
+ <translation>Обнаружена ошибка при разборе XML профиля устройства: %1</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerToolWindow</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_toolwindow.cpp" line="+190"/>
+ <source>Property Editor</source>
+ <translation>Редактор свойств</translation>
+ </message>
+ <message>
+ <location line="+54"/>
+ <source>Action Editor</source>
+ <translation>Редактор действий</translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <source>Object Inspector</source>
+ <translation>Инспектор объектов</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Resource Browser</source>
+ <translation>Обозреватель ресурсов</translation>
+ </message>
+ <message>
+ <location line="+34"/>
+ <source>Signal/Slot Editor</source>
+ <translation>Редактор Сигналов/Слотов</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Widget Box</source>
+ <translation>Панель виджетов</translation>
+ </message>
+</context>
+<context>
+ <name>QDesignerWorkbench</name>
+ <message>
+ <location filename="../tools/designer/src/designer/qdesigner_workbench.cpp" line="+199"/>
+ <source>&amp;File</source>
+ <translation>&amp;Файл</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>F&amp;orm</source>
+ <translation>Ф&amp;орма</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Preview in</source>
+ <translation>Предпросмотр в</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&amp;Window</source>
+ <translation>&amp;Окно</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>&amp;Help</source>
+ <translation>&amp;Справка</translation>
+ </message>
+ <message>
+ <location line="-15"/>
+ <source>Edit</source>
+ <translation>Правка</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Toolbars</source>
+ <translation>Панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+465"/>
+ <source>Save Forms?</source>
+ <translation>Сохранить форму?</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+1"/>
+ <source>There are %n forms with unsaved changes. Do you want to review these changes before quitting?</source>
+ <translation type="unfinished">
+ <numerusform>Есть %n форма с несохранёнными изменениями. Показать изменения перед выходом?</numerusform>
+ <numerusform>Есть %n формы с несохранёнными изменениями. Показать изменения перед выходом?</numerusform>
+ <numerusform>Есть %n форм с несохранёнными изменениями. Показать изменения перед выходом?</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="-495"/>
+ <source>&amp;View</source>
+ <translation>&amp;Вид</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>&amp;Settings</source>
+ <translation>&amp;Настройки</translation>
+ </message>
+ <message>
+ <location line="+204"/>
+ <source>Widget Box</source>
+ <translation>Панель виджетов</translation>
+ </message>
+ <message>
+ <location line="+292"/>
+ <source>If you do not review your documents, all your changes will be lost.</source>
+ <translation type="unfinished">Если вы не пересмотрите документы, то все ваши изменения будут потеряны.</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Discard Changes</source>
+ <translation>Отменить изменения</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Review Changes</source>
+ <translation>Показать изменения</translation>
+ </message>
+ <message>
+ <location line="+95"/>
+ <source>Backup Information</source>
+ <translation type="unfinished">Информация о резервировании</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The last session of Designer was not terminated correctly. Backup files were left behind. Do you want to load them?</source>
+ <translation>Последняя сессия Qt Designer не была завершена корректно. Остались резервные копии файлов. Желаете загрузить их?</translation>
+ </message>
+ <message>
+ <location line="+111"/>
+ <source>The file &lt;b&gt;%1&lt;/b&gt; could not be opened.</source>
+ <translation>Не удалось открыть файл &lt;b&gt;%1&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <location line="+46"/>
+ <source>The file &lt;b&gt;%1&lt;/b&gt; is not a valid Designer UI file.</source>
+ <translation type="unfinished">Файл &lt;b&gt;%1&lt;/b&gt; не является корректным UI файлом Qt Designer.</translation>
+ </message>
+</context>
+<context>
+ <name>QFormBuilder</name>
+ <message>
+ <location filename="../tools/designer/src/lib/uilib/formbuilder.cpp" line="+163"/>
+ <source>An empty class name was passed on to %1 (object name: &apos;%2&apos;).</source>
+ <extracomment>Empty class name passed to widget factory method</extracomment>
+ <translation>Методу %1 (объекта &apos;%2&apos;) было передано пустое имя класса.</translation>
+ </message>
+ <message>
+ <location line="+56"/>
+ <source>QFormBuilder was unable to create a custom widget of the class &apos;%1&apos;; defaulting to base class &apos;%2&apos;.</source>
+ <translation>QFormBuilder не смог создать пользовательский виджет класса &apos;%1&apos;; был создан базовый класс &apos;%2&apos;.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>QFormBuilder was unable to create a widget of the class &apos;%1&apos;.</source>
+ <translation>QFormBuilder не смог создать пользовательский виджет класса &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+61"/>
+ <source>The layout type `%1&apos; is not supported.</source>
+ <translation>Компоновка типа &apos;%1&apos; не поддерживается.</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/uilib/properties.cpp" line="+106"/>
+ <source>The set-type property %1 could not be read.</source>
+ <translation>Не удалось прочитать свойство %1 множественного типа.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>The enumeration-type property %1 could not be read.</source>
+ <translation>Не удалось прочитать свойство %1 перечисляемого типа.</translation>
+ </message>
+ <message>
+ <location line="+190"/>
+ <source>Reading properties of the type %1 is not supported yet.</source>
+ <translation>Чтение свойств типа %1 ещё не поддерживается.</translation>
+ </message>
+ <message>
+ <location line="+266"/>
+ <source>The property %1 could not be written. The type %2 is not supported yet.</source>
+ <translation>Не удалось записать свойство %1. Тип %2 ещё не поддерживается.</translation>
+ </message>
+</context>
+<context>
+ <name>QStackedWidgetEventFilter</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_stackedbox.cpp" line="+194"/>
+ <source>Previous Page</source>
+ <translation>Предыдущая страница</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Next Page</source>
+ <translation>Следующая страница</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Before Current Page</source>
+ <translation>Перед текущей страницей</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>After Current Page</source>
+ <translation>После текущей страницы</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Page Order...</source>
+ <translation>Изменить порядок страниц...</translation>
+ </message>
+ <message>
+ <location line="+72"/>
+ <source>Change Page Order</source>
+ <translation>Изменить порядок страниц</translation>
+ </message>
+ <message>
+ <location line="+49"/>
+ <source>Page %1 of %2</source>
+ <translation>Страница %1 из %2</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <location line="+4"/>
+ <source>Insert Page</source>
+ <translation>Вставить страницу</translation>
+ </message>
+</context>
+<context>
+ <name>QStackedWidgetPreviewEventFilter</name>
+ <message>
+ <location line="-153"/>
+ <source>Go to previous page of %1 &apos;%2&apos; (%3/%4).</source>
+ <translation>Перейти к предыдущей странице из %1 &apos;%2&apos; (%3/%4).</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Go to next page of %1 &apos;%2&apos; (%3/%4).</source>
+ <translation>Перейти к следующей странице из %1 &apos;%2&apos; (%3/%4).</translation>
+ </message>
+</context>
+<context>
+ <name>QTabWidgetEventFilter</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_tabwidget.cpp" line="+89"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Before Current Page</source>
+ <translation>Перед текущей страницей</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>After Current Page</source>
+ <translation>После текущей страницы</translation>
+ </message>
+ <message>
+ <location line="+283"/>
+ <source>Page %1 of %2</source>
+ <translation>Страница %1 из %2</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <location line="+4"/>
+ <source>Insert Page</source>
+ <translation>Вставить страницу</translation>
+ </message>
+</context>
+<context>
+ <name>QToolBoxHelper</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_toolbox.cpp" line="+64"/>
+ <source>Delete Page</source>
+ <translation>Удалить страницу</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Before Current Page</source>
+ <translation>Перед текущей страницей</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>After Current Page</source>
+ <translation>После текущей страницы</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Page Order...</source>
+ <translation>Изменить порядок страниц...</translation>
+ </message>
+ <message>
+ <location line="+116"/>
+ <source>Change Page Order</source>
+ <translation>Изменить порядок страниц</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Page %1 of %2</source>
+ <translation>Страница %1 из %2</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Insert Page</source>
+ <translation>Вставить страницу</translation>
+ </message>
+</context>
+<context>
+ <name>QtBoolEdit</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+226"/>
+ <location line="+10"/>
+ <location line="+25"/>
+ <source>True</source>
+ <translation>Вкл.</translation>
+ </message>
+ <message>
+ <location line="-25"/>
+ <location line="+25"/>
+ <source>False</source>
+ <translation>Выкл.</translation>
+ </message>
+</context>
+<context>
+ <name>QtBoolPropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1469"/>
+ <source>True</source>
+ <translation type="unfinished">Да</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>False</source>
+ <translation type="unfinished">Нет</translation>
+ </message>
+</context>
+<context>
+ <name>QtCharEdit</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+1581"/>
+ <source>Clear Char</source>
+ <translation>Стереть символ</translation>
+ </message>
+</context>
+<context>
+ <name>QtColorEditWidget</name>
+ <message>
+ <location line="+605"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+</context>
+<context>
+ <name>QtColorPropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+4743"/>
+ <source>Red</source>
+ <translation>Красный</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Green</source>
+ <translation>Зелёный</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Blue</source>
+ <translation>Синий</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Alpha</source>
+ <translation>Альфа</translation>
+ </message>
+</context>
+<context>
+ <name>QtCursorDatabase</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-206"/>
+ <source>Arrow</source>
+ <translation>Arrow</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Up Arrow</source>
+ <translation>Up Arrow</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Cross</source>
+ <translation>Cross</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Wait</source>
+ <translation>Wait</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>IBeam</source>
+ <translation>IBeam</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Size Vertical</source>
+ <translation>Size Vertical</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Size Horizontal</source>
+ <translation>Size Horizontal</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Size Backslash</source>
+ <translation>Size Backslash</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Size Slash</source>
+ <translation>Size Slash</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Size All</source>
+ <translation>Size All</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Blank</source>
+ <translation>Blank</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Split Vertical</source>
+ <translation>Split Vertical</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Split Horizontal</source>
+ <translation>Split Horizontal</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Pointing Hand</source>
+ <translation>Pointing Hand</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Forbidden</source>
+ <translation>Forbidden</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Open Hand</source>
+ <translation>Open Hand</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Closed Hand</source>
+ <translation>Closed Hand</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>What&apos;s This</source>
+ <translation>What&apos;s This</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Busy</source>
+ <translation>Busy</translation>
+ </message>
+</context>
+<context>
+ <name>QtFontEditWidget</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qteditorfactory.cpp" line="+198"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Select Font</source>
+ <translation>Выбрать шрифт</translation>
+ </message>
+</context>
+<context>
+ <name>QtFontPropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-351"/>
+ <source>Family</source>
+ <translation>Шрифт</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Point Size</source>
+ <translation>Размер</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Bold</source>
+ <translation>Жирный</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Italic</source>
+ <translation>Курсив</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Underline</source>
+ <translation>Подчёркнутый</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Strikeout</source>
+ <translation>Зачёркнутый</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Kerning</source>
+ <translation>Интервал</translation>
+ </message>
+</context>
+<context>
+ <name>QtGradientDialog</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientdialog.ui" line="+53"/>
+ <source>Edit Gradient</source>
+ <translation>Правка градиента</translation>
+ </message>
+</context>
+<context>
+ <name>QtGradientEditor</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.cpp" line="+431"/>
+ <source>Start X</source>
+ <translation>X начала</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Start Y</source>
+ <translation>Y начала</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Final X</source>
+ <translation>X конца</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Final Y</source>
+ <translation>Y конца</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+24"/>
+ <source>Central X</source>
+ <translation>X центра</translation>
+ </message>
+ <message>
+ <location line="-20"/>
+ <location line="+24"/>
+ <source>Central Y</source>
+ <translation>Y центра</translation>
+ </message>
+ <message>
+ <location line="-20"/>
+ <source>Focal X</source>
+ <translation>X фокуса</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Focal Y</source>
+ <translation>Y фокуса</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Radius</source>
+ <translation>Радиус</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Angle</source>
+ <translation>Угол</translation>
+ </message>
+ <message>
+ <location line="+288"/>
+ <source>Linear</source>
+ <translation type="unfinished">Линейный</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Radial</source>
+ <translation type="unfinished">Радиальный</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Conical</source>
+ <translation type="unfinished">Конический</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Pad</source>
+ <translation type="unfinished">Равномерная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Repeat</source>
+ <translation type="unfinished">Цикличная</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reflect</source>
+ <translation type="unfinished">Зеркальная</translation>
+ </message>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradienteditor.ui" line="+53"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>Gradient Editor</source>
+ <translation>Редактор градиента</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>This area shows a preview of the gradient being edited. It also allows you to edit parameters specific to the gradient&apos;s type such as start and final point, radius, etc. by drag &amp; drop.</source>
+ <translation>Эта область отображает предварительный вариант настраиваемого градиента. Также она позволяет менять с помощью перетаскивания характерные для градиента параметры, такие как: начальная и конечная точки, радиус и пр.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Gradient Stops Editor</source>
+ <translation>Редактор опорных точек градиента</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>This area allows you to edit gradient stops. Double click on the existing stop handle to duplicate it. Double click outside of the existing stop handles to create a new stop. Drag &amp; drop the handle to reposition it. Use right mouse button to popup context menu with extra actions.</source>
+ <translation>Эта область позволяет редактировать опорные точки градиента. Двойной щелчок на существующей точке создаст её копию. Двойной клик вне существующей точки создаст новую. Точки можно перемещать путем удерживания левой кнопки. По правой кнопке можно получить контекстное меню дополнительных действий.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Zoom</source>
+ <translation>Масштаб</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+3"/>
+ <source>Reset Zoom</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Position</source>
+ <translation>Положение</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+49"/>
+ <location line="+22"/>
+ <source>Hue</source>
+ <translation>Оттенок</translation>
+ </message>
+ <message>
+ <location line="-68"/>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <location line="+87"/>
+ <location line="+49"/>
+ <source>Saturation</source>
+ <translation>Насыщенность</translation>
+ </message>
+ <message>
+ <location line="-46"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location line="+68"/>
+ <source>Sat</source>
+ <translation>Насыщение</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+49"/>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <location line="-46"/>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <location line="+68"/>
+ <source>Val</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+49"/>
+ <location line="+22"/>
+ <source>Alpha</source>
+ <translation>Альфа</translation>
+ </message>
+ <message>
+ <location line="-68"/>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <location line="+81"/>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Spread</source>
+ <translation>Заливка</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Color</source>
+ <translation>Цвет</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Current stop&apos;s color</source>
+ <translation>Цвет текущей точки</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Show HSV specification</source>
+ <translation>Настройки в виде HSV</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>HSV</source>
+ <translation>HSV</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Show RGB specification</source>
+ <translation>Настройки в виде RGB</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>RGB</source>
+ <translation>RGB</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Current stop&apos;s position</source>
+ <translation>Положение текущей точки</translation>
+ </message>
+ <message>
+ <location line="+188"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location line="+111"/>
+ <source>Zoom In</source>
+ <translation>Увеличить</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Zoom Out</source>
+ <translation>Уменьшить</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Toggle details extension</source>
+ <translation>Показать/скрыть детальные настройки</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&gt;</source>
+ <translation>&gt;</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Linear Type</source>
+ <translation>Линейный тип</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+22"/>
+ <location line="+22"/>
+ <location line="+22"/>
+ <location line="+22"/>
+ <location line="+22"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="-91"/>
+ <source>Radial Type</source>
+ <translation>Радиальный тип</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Conical Type</source>
+ <translation>Конический тип</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Pad Spread</source>
+ <translation>Равномерная заливка</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Repeat Spread</source>
+ <translation>Цикличная заливка</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Reflect Spread</source>
+ <translation>Зеркальная заливка</translation>
+ </message>
+</context>
+<context>
+ <name>QtGradientStopsWidget</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientstopswidget.cpp" line="+947"/>
+ <source>New Stop</source>
+ <translation>Новая точка</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Flip All</source>
+ <translation>Отобразить зеркально</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Select All</source>
+ <translation>Выделить все</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Zoom In</source>
+ <translation>Увеличить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Zoom Out</source>
+ <translation>Уменьшить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reset Zoom</source>
+ <translation>Сбросить масштаб</translation>
+ </message>
+</context>
+<context>
+ <name>QtGradientView</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+107"/>
+ <source>Grad</source>
+ <translation type="unfinished">Градиент</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Remove Gradient</source>
+ <translation>Удалить градиент</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Are you sure you want to remove the selected gradient?</source>
+ <translation>Вы действительно желаете удалить выбранный градиент?</translation>
+ </message>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.ui" line="+39"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+74"/>
+ <source>New...</source>
+ <translation>Новый...</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
+ <source>Edit...</source>
+ <translation>Правка...</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
+ <source>Rename</source>
+ <translation>Переименовать</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientview.cpp" line="+1"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="-83"/>
+ <source>Gradient View</source>
+ <translation>Просмотр градиента</translation>
+ </message>
+</context>
+<context>
+ <name>QtGradientViewDialog</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientviewdialog.ui" line="+53"/>
+ <source>Select Gradient</source>
+ <translation>Выбрать градиент</translation>
+ </message>
+</context>
+<context>
+ <name>QtKeySequenceEdit</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="+221"/>
+ <source>Clear Shortcut</source>
+ <translation>Удалить комбинацию горячих клавиш</translation>
+ </message>
+</context>
+<context>
+ <name>QtLocalePropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-3541"/>
+ <source>%1, %2</source>
+ <translation>%1, %2</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>Language</source>
+ <translation>Язык</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Country</source>
+ <translation>Страна</translation>
+ </message>
+</context>
+<context>
+ <name>QtPointFPropertyManager</name>
+ <message>
+ <location line="+411"/>
+ <source>(%1, %2)</source>
+ <translation>(%1, %2)</translation>
+ </message>
+ <message>
+ <location line="+71"/>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+</context>
+<context>
+ <name>QtPointPropertyManager</name>
+ <message>
+ <location line="-320"/>
+ <source>(%1, %2)</source>
+ <translation>(%1, %2)</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+</context>
+<context>
+ <name>QtPropertyBrowserUtils</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertybrowserutils.cpp" line="-136"/>
+ <source>[%1, %2, %3] (%4)</source>
+ <translation>[%1, %2, %3] (%4)</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>[%1, %2]</source>
+ <translation>[%1, %2]</translation>
+ </message>
+</context>
+<context>
+ <name>QtRectFPropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="+1706"/>
+ <source>[(%1, %2), %3 x %4]</source>
+ <translation>[(%1, %2), %3 x %4]</translation>
+ </message>
+ <message>
+ <location line="+156"/>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Width</source>
+ <translation>Ширина</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Height</source>
+ <translation>Высота</translation>
+ </message>
+</context>
+<context>
+ <name>QtRectPropertyManager</name>
+ <message>
+ <location line="-612"/>
+ <source>[(%1, %2), %3 x %4]</source>
+ <translation>[(%1, %2), %3 x %4]</translation>
+ </message>
+ <message>
+ <location line="+120"/>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Width</source>
+ <translation>Ширина</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Height</source>
+ <translation>Высота</translation>
+ </message>
+</context>
+<context>
+ <name>QtResourceEditorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.cpp" line="+76"/>
+ <source>%1 already exists.
+Do you want to replace it?</source>
+ <translation>%1 уже существует.
+Хотите заменить его?</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>The file does not appear to be a resource file; element &apos;%1&apos; was found where &apos;%2&apos; was expected.</source>
+ <translation>Похоже, файл не является файлом ресурсов, так как вместо элемента &apos;%2&apos; стоит &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+902"/>
+ <source>%1 [read-only]</source>
+ <translation>%1 [только для чтения]</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <location line="+198"/>
+ <source>%1 [missing]</source>
+ <translation>%1 [отсутствует]</translation>
+ </message>
+ <message>
+ <location line="-72"/>
+ <source>&lt;no prefix&gt;</source>
+ <translation>&lt;без префикса&gt;</translation>
+ </message>
+ <message>
+ <location line="+320"/>
+ <location line="+566"/>
+ <source>New Resource File</source>
+ <translation>Новый файл ресурсов</translation>
+ </message>
+ <message>
+ <location line="-564"/>
+ <location line="+25"/>
+ <source>Resource files (*.qrc)</source>
+ <translation>Файл ресурсов (*.qrc)</translation>
+ </message>
+ <message>
+ <location line="-2"/>
+ <source>Import Resource File</source>
+ <translation>Импортировать файл ресурсов</translation>
+ </message>
+ <message>
+ <location line="+112"/>
+ <source>newPrefix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; The file&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;is outside of the current resource file&apos;s parent directory.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;Предупреждение:&lt;/b&gt; Файл&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;находится за пределами каталога текущего файла ресурсов.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&lt;p&gt;To resolve the issue, press:&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Copy&lt;/th&gt;&lt;td&gt;to copy the file to the resource file&apos;s parent directory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Copy As...&lt;/th&gt;&lt;td&gt;to copy the file into a subdirectory of the resource file&apos;s parent directory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Keep&lt;/th&gt;&lt;td&gt;to use its current location.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+ <translation>&lt;p&gt;Для решения нажмите:&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Копировать&lt;/th&gt;&lt;td&gt;, чтобы скопировать в каталог файла ресурсов.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Копировать как...&lt;/th&gt;&lt;td&gt;, чтобы скопировать в подкаталог каталога файла ресурсов.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Оставить&lt;/th&gt;&lt;td&gt;, чтобы использовать текущее размещение.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Add Files</source>
+ <translation>Добавить файлы</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Incorrect Path</source>
+ <translation>Неверный путь</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+19"/>
+ <location line="+212"/>
+ <location line="+7"/>
+ <source>Copy</source>
+ <translation>Копировать</translation>
+ </message>
+ <message>
+ <location line="-236"/>
+ <source>Copy As...</source>
+ <translation>Копировать как...</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Keep</source>
+ <translation>Оставить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Skip</source>
+ <translation>Пропустить</translation>
+ </message>
+ <message>
+ <location line="+87"/>
+ <source>Clone Prefix</source>
+ <translation>Приставка при клонировании</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Enter the suffix which you want to add to the names of the cloned files.
+This could for example be a language extension like &quot;_de&quot;.</source>
+ <translation>Введите окончание, которое нужно добавлять к именам клонируемых файлов.
+Это может быть, например, языковое расширение, вроде &quot;_ru&quot;.</translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <location line="+4"/>
+ <source>Copy As</source>
+ <translation>Копировать как</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&lt;p&gt;The selected file:&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;is outside of the current resource file&apos;s directory:&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Please select another path within this directory.&lt;p&gt;</source>
+ <translation>&lt;p&gt;Выбранный файл:&lt;/p&gt;&lt;p&gt;%1&lt;/p&gt;&lt;p&gt;находится вне каталога текущего файла ресурсов:&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Пожалуйста, выберите путь внутри этого каталога.&lt;p&gt;</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Could not overwrite %1.</source>
+ <translation>Не удалось перезаписать %1.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Could not copy
+%1
+to
+%2</source>
+ <translation>Не удалось копировать
+%1
+%2</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>A parse error occurred at line %1, column %2 of %3:
+%4</source>
+ <translation>Возникла ошибка разбора в строке %1 позиции %2 из %3:
+%4</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Save Resource File</source>
+ <translation>Сохранение файла ресурсов</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Could not write %1: %2</source>
+ <translation>Не удалось записать %1: %2</translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <source>Edit Resources</source>
+ <translation>Правка ресурсов</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>New...</source>
+ <translation>Новый...</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Open...</source>
+ <translation>Открыть...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Open Resource File</source>
+ <translation>Открыть файл ресурсов</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <location line="+11"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="-10"/>
+ <location line="+11"/>
+ <source>Move Up</source>
+ <translation>Поднять</translation>
+ </message>
+ <message>
+ <location line="-10"/>
+ <location line="+11"/>
+ <source>Move Down</source>
+ <translation>Опустить</translation>
+ </message>
+ <message>
+ <location line="-9"/>
+ <location line="+1"/>
+ <source>Add Prefix</source>
+ <translation>Добавить приставку</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add Files...</source>
+ <translation>Добавить файлы...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Prefix</source>
+ <translation>Сменить приставку</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Language</source>
+ <translation>Сменить язык</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Alias</source>
+ <translation>Сменить псевдоним</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Clone Prefix...</source>
+ <translation>Приставка при клонировании...</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>Prefix / Path</source>
+ <translation>Приставка / Путь</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Language / Alias</source>
+ <translation>Язык / Псевдоним</translation>
+ </message>
+ <message>
+ <location line="+117"/>
+ <source>&lt;html&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; There have been problems while reloading the resources:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;p&gt;&lt;b&gt;Предупреждение:&lt;/b&gt; Возникли проблемы при перезагрузке ресурсов:&lt;/p&gt;&lt;pre&gt;%1&lt;/pre&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Resource Warning</source>
+ <translation type="unfinished">Предупреждение</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qtresourceeditordialog.ui" line="+13"/>
+ <source>Dialog</source>
+ <translation>Диалог</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>New File</source>
+ <translation>Новый файл</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+50"/>
+ <source>N</source>
+ <translation>N</translation>
+ </message>
+ <message>
+ <location line="-43"/>
+ <source>Remove File</source>
+ <translation>Удалить файл</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+57"/>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <location line="-34"/>
+ <source>I</source>
+ <translation>I</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>New Resource</source>
+ <translation>Новый ресурс</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Remove Resource or File</source>
+ <translation>Удалить ресурс или файл</translation>
+ </message>
+</context>
+<context>
+ <name>QtResourceView</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qtresourceview.cpp" line="+566"/>
+ <source>Size: %1 x %2
+%3</source>
+ <translation>Размер: %1 x %2
+%3</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Edit Resources...</source>
+ <translation>Изменить ресурсы...</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Reload</source>
+ <translation>Перезагрузить</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Copy Path</source>
+ <translation>Скопировать путь</translation>
+ </message>
+</context>
+<context>
+ <name>QtResourceViewDialog</name>
+ <message>
+ <location line="+250"/>
+ <source>Select Resource</source>
+ <translation>Выбрать ресурс</translation>
+ </message>
+</context>
+<context>
+ <name>QtSizeFPropertyManager</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qtpropertymanager.cpp" line="-535"/>
+ <source>%1 x %2</source>
+ <translation>%1 x %2</translation>
+ </message>
+ <message>
+ <location line="+130"/>
+ <source>Width</source>
+ <translation>Ширина</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Height</source>
+ <translation>Высота</translation>
+ </message>
+</context>
+<context>
+ <name>QtSizePolicyPropertyManager</name>
+ <message>
+ <location line="+1709"/>
+ <location line="+1"/>
+ <source>&lt;Invalid&gt;</source>
+ <translation>&lt;Неверный&gt;</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>[%1, %2, %3, %4]</source>
+ <translation>[%1, %2, %3, %4]</translation>
+ </message>
+ <message>
+ <location line="+45"/>
+ <source>Horizontal Policy</source>
+ <translation>Горизонтальная политика</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Vertical Policy</source>
+ <translation>Вертикальная политика</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Horizontal Stretch</source>
+ <translation>Горизонтальное растяжение</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Vertical Stretch</source>
+ <translation>Вертикальное растяжение</translation>
+ </message>
+</context>
+<context>
+ <name>QtSizePropertyManager</name>
+ <message>
+ <location line="-2286"/>
+ <source>%1 x %2</source>
+ <translation>%1 x %2</translation>
+ </message>
+ <message>
+ <location line="+96"/>
+ <source>Width</source>
+ <translation>Ширина</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Height</source>
+ <translation>Высота</translation>
+ </message>
+</context>
+<context>
+ <name>QtToolBarDialog</name>
+ <message>
+ <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.cpp" line="+1240"/>
+ <source>Custom Toolbar</source>
+ <translation>Пользовательская панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+544"/>
+ <source>&lt; S E P A R A T O R &gt;</source>
+ <translation>&lt; Р А З Д Е Л И Т Е Л Ь &gt;</translation>
+ </message>
+ <message>
+ <location filename="../tools/shared/qttoolbardialog/qttoolbardialog.ui" line="+13"/>
+ <source>Customize Toolbars</source>
+ <translation>Настройка панелей инструментов</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Actions</source>
+ <translation>Действия</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Toolbars</source>
+ <translation>Панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Add new toolbar</source>
+ <translation>Добавить новую панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>New</source>
+ <translation>Новая</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Remove selected toolbar</source>
+ <translation>Удалить выбранную панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Rename toolbar</source>
+ <translation>Переименовать панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Rename</source>
+ <translation>Переименовать</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Move action up</source>
+ <translation>Переместить действие вверх</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Remove action from toolbar</source>
+ <translation>Удалить действие из панели инструментов</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&lt;-</source>
+ <translation>&lt;-</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Add action to toolbar</source>
+ <translation>Добавить действие на панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>-&gt;</source>
+ <translation>-&gt;</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Move action down</source>
+ <translation>Переместить действие вниз</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Down</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Current Toolbar Actions</source>
+ <translation>Текущие действия панели инструментов</translation>
+ </message>
+</context>
+<context>
+ <name>QtTreePropertyBrowser</name>
+ <message>
+ <location filename="../tools/shared/qtpropertybrowser/qttreepropertybrowser.cpp" line="+442"/>
+ <source>Property</source>
+ <translation>Свойство</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+</context>
+<context>
+ <name>SaveFormAsTemplate</name>
+ <message>
+ <location filename="../tools/designer/src/designer/saveformastemplate.cpp" line="+72"/>
+ <source>Add path...</source>
+ <translation>Добавить путь...</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Template Exists</source>
+ <translation>Шаблон существует</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>A template with the name %1 already exists.
+Do you want overwrite the template?</source>
+ <translation>Шаблон с именем %1 уже существует.
+Желаете заменить шаблон?</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Overwrite Template</source>
+ <translation>Заменить шаблон</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Open Error</source>
+ <translation>Ошибка открытия</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>There was an error opening template %1 for writing. Reason: %2</source>
+ <translation>Возникла ошибка открытия шаблона %1 для записи. Причина: %2</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Write Error</source>
+ <translation>Ошибка записи</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>There was an error writing the template %1 to disk. Reason: %2</source>
+ <translation>Возникла ошибка записи шаблона %1 на диск. Причина: %2</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Pick a directory to save templates in</source>
+ <translation>Выберите каталог для сохранения шаблонов</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/designer/saveformastemplate.ui" line="+45"/>
+ <source>Save Form As Template</source>
+ <translation>Сохранить форму как шаблон</translation>
+ </message>
+ <message>
+ <location line="+49"/>
+ <source>&amp;Category:</source>
+ <translation>&amp;Категория:</translation>
+ </message>
+ <message>
+ <location line="-35"/>
+ <source>&amp;Name:</source>
+ <translation>&amp;Имя:</translation>
+ </message>
+</context>
+<context>
+ <name>ScriptErrorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+59"/>
+ <source>An error occurred while running the scripts for &quot;%1&quot;:
+</source>
+ <translation>При выполнения сценариев для &quot;%1&quot; возникла ошибка:
+</translation>
+ </message>
+</context>
+<context>
+ <name>SelectSignalDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/selectsignaldialog.ui" line="+14"/>
+ <source>Go to slot</source>
+ <translation>Переход к слоту</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Select signal</source>
+ <translation>Выбор сигнала</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>signal</source>
+ <translation>сигнал</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>class</source>
+ <translation>класс</translation>
+ </message>
+</context>
+<context>
+ <name>SignalSlotConnection</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor.cpp" line="-358"/>
+ <source>SENDER(%1), SIGNAL(%2), RECEIVER(%3), SLOT(%4)</source>
+ <translation>ОТПРАВИТЕЛЬ(%1), СИГНАЛ(%2), ПОЛУЧАТЕЛЬ(%3), СЛОТ(%4)</translation>
+ </message>
+</context>
+<context>
+ <name>SignalSlotDialogClass</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/signalslotdialog.ui" line="+13"/>
+ <source>Signals and slots</source>
+ <translation>Сигналы и слоты</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Slots</source>
+ <translation>Слоты</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <location line="+49"/>
+ <source>Add</source>
+ <translation>Добавить</translation>
+ </message>
+ <message>
+ <location line="-46"/>
+ <location line="+10"/>
+ <location line="+39"/>
+ <location line="+10"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="-52"/>
+ <location line="+49"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="-21"/>
+ <source>Signals</source>
+ <translation>Сигналы</translation>
+ </message>
+</context>
+<context>
+ <name>Spacer</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/spacer_widget.cpp" line="+275"/>
+ <source>Horizontal Spacer &apos;%1&apos;, %2 x %3</source>
+ <translation>Горизонтальный разделитель &apos;%1&apos;, %2 x %3</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Vertical Spacer &apos;%1&apos;, %2 x %3</source>
+ <translation>Вертикальный разделитель &apos;%1&apos;, %2 x %3</translation>
+ </message>
+</context>
+<context>
+ <name>TemplateOptionsPage</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="+156"/>
+ <source>Template Paths</source>
+ <extracomment>Tab in preferences dialog</extracomment>
+ <translatorcomment>Слово &quot;пути&quot; опустил, т.к. с другими вкладками не перепутать, а длинная вкладка не смотрится.</translatorcomment>
+ <translation>Шаблоны</translation>
+ </message>
+</context>
+<context>
+ <name>ToolBarManager</name>
+ <message>
+ <location filename="../tools/designer/src/designer/mainwindow.cpp" line="+89"/>
+ <source>Configure Toolbars...</source>
+ <translation>Настройка панелей инструментов...</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Window</source>
+ <translation>Окно</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Help</source>
+ <translation>Справка</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Style</source>
+ <translation>Стиль</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Dock views</source>
+ <translation type="unfinished">Прикрепляемые панели</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Toolbars</source>
+ <translation>Панели инструментов</translation>
+ </message>
+</context>
+<context>
+ <name>VersionDialog</name>
+ <message>
+ <location filename="../tools/designer/src/designer/versiondialog.cpp" line="+171"/>
+ <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Version %2</source>
+ <translation>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;Версия %2</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Qt Designer</source>
+ <translation>Qt Designer</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&lt;br/&gt;Qt Designer is a graphical user interface designer for Qt applications.&lt;br/&gt;</source>
+ <translation>&lt;br/&gt;Qt Designer - дизайнер графического интерфейса пользователя для Qt-приложений.&lt;br/&gt;</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>%1&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation type="unfinished">%1&lt;br/&gt;Copyright (C) 2009 Корпорация Nokia и/или её дочерние подразделения.</translation>
+ </message>
+</context>
+<context>
+ <name>WidgetDataBase</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="+814"/>
+ <source>The file contains a custom widget &apos;%1&apos; whose base class (%2) differs from the current entry in the widget database (%3). The widget database is left unchanged.</source>
+ <translation>Файл содержит пользовательский виджет &apos;%1&apos;, базовый класс (%2) которого отличается от текущей записи в базе виджетов (%3). База виджетов оставлена без изменений.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ActionEditor</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/actioneditor.cpp" line="+123"/>
+ <source>New...</source>
+ <translation>Новое...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Edit...</source>
+ <translation>Правка...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Go to slot...</source>
+ <translation>Перейти к слоту...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Copy</source>
+ <translation>Копировать</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Cut</source>
+ <translation>Вырезать</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Paste</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Select all</source>
+ <translation>Выделить всё</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Actions</source>
+ <translation>Действия</translation>
+ </message>
+ <message>
+ <location line="+49"/>
+ <source>Configure Action Editor</source>
+ <translation>Настроить редактор действий</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Icon View</source>
+ <translation type="unfinished">Значки</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Detailed View</source>
+ <translation type="unfinished">Подробно</translation>
+ </message>
+ <message>
+ <location line="+246"/>
+ <source>New action</source>
+ <translation>Новое действие</translation>
+ </message>
+ <message>
+ <location line="+98"/>
+ <source>Edit action</source>
+ <translation>Правка действия</translation>
+ </message>
+ <message>
+ <location line="+69"/>
+ <source>Remove action &apos;%1&apos;</source>
+ <translation>Удалить действие &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Remove actions</source>
+ <translation>Удаление дествий</translation>
+ </message>
+ <message>
+ <location line="+186"/>
+ <source>Used In</source>
+ <translation>Используется в</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ActionModel</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/actionrepository.cpp" line="+95"/>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Used</source>
+ <translation>Используется</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Text</source>
+ <translation>Текст</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Shortcut</source>
+ <translation>Горячая клавиша</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Checkable</source>
+ <translation>Триггерное</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>ToolTip</source>
+ <translation>Подсказка</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::BrushManagerProxy</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/brushmanagerproxy.cpp" line="+219"/>
+ <source>The element &apos;%1&apos; is missing the required attribute &apos;%2&apos;.</source>
+ <translation>У элемента &apos;%1&apos; отсутствует необходимый атрибут &apos;%2&apos;.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Empty brush name encountered.</source>
+ <translation>Обнаружено пустое название кисти.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>An unexpected element &apos;%1&apos; was encountered.</source>
+ <translation>Обнаружен неожиданный элемент &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>An error occurred when reading the brush definition file &apos;%1&apos; at line line %2, column %3: %4</source>
+ <translation>При чтении файла описания кистей &apos;%1&apos; возникла ошибка разбора строки %2 в позиции %3: %4</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>An error occurred when reading the resource file &apos;%1&apos; at line %2, column %3: %4</source>
+ <translation>При чтении файла ресурсов &apos;%1&apos; возникла ошибка разбора строки %2 в позиции %3: %4</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::BuddyEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor.cpp" line="+261"/>
+ <source>Add buddy</source>
+ <translation>Добавить партнёра</translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Remove buddies</source>
+ <translation>Удалить партнёров</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+24"/>
+ <source>Remove %n buddies</source>
+ <translation>
+ <numerusform>Удалить %n партнёра</numerusform>
+ <numerusform>Удалить %n партнёров</numerusform>
+ <numerusform>Удалить %n партнёров</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+51"/>
+ <source>Add %n buddies</source>
+ <translation>
+ <numerusform>Добавить %n партнёра</numerusform>
+ <numerusform>Добавить %n партнёров</numerusform>
+ <numerusform>Добавить %n партнёров</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+47"/>
+ <source>Set automatically</source>
+ <translation>Установить автоматически</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::BuddyEditorPlugin</name>
+ <message>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_plugin.cpp" line="+73"/>
+ <source>Edit Buddies</source>
+ <translation>Изменение партнёров</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::BuddyEditorTool</name>
+ <message>
+ <location filename="../tools/designer/src/components/buddyeditor/buddyeditor_tool.cpp" line="+56"/>
+ <source>Edit Buddies</source>
+ <translation>Изменение партнёров</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ButtonGroupMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+7"/>
+ <source>Select members</source>
+ <translation>Выбрать элементы</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Break</source>
+ <translation>Разделить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ButtonTaskMenu</name>
+ <message>
+ <location line="+121"/>
+ <source>Assign to button group</source>
+ <translation>Назначить группу кнопок</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Button group</source>
+ <translation>Группа кнопок</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>New button group</source>
+ <translation>Новая группа кнопок</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change text...</source>
+ <translation>Изменить текст...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location line="+101"/>
+ <source>Button group &apos;%1&apos;</source>
+ <translation>Группа кнопок &apos;%1&apos;</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::CodeDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/codedialog.cpp" line="+95"/>
+ <source>Save...</source>
+ <translation>Сохранить...</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Copy All</source>
+ <translation>Копировать всё</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&amp;Find in Text...</source>
+ <translation>&amp;Найти в тексте...</translation>
+ </message>
+ <message>
+ <location line="+75"/>
+ <source>A temporary form file could not be created in %1.</source>
+ <translation>Не удалось создать временный файл формы в %1.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The temporary form file %1 could not be written.</source>
+ <translation>Не удалось записать временный файл формы %1.</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>%1 - [Code]</source>
+ <translation>%1 - [код]</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Save Code</source>
+ <translation>Сохранить код</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Header Files (*.%1)</source>
+ <translation>Заголовочные файлы (*.%1)</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The file %1 could not be opened: %2</source>
+ <translation>Не удалось открыть файл %1: %2</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>The file %1 could not be written: %2</source>
+ <translation>Не удалось записать файл %1: %2</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>%1 - Error</source>
+ <translation>%1 - Ошибка</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ColorAction</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+246"/>
+ <source>Text Color</source>
+ <translation>Цвет текста</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ComboBoxTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/combobox_taskmenu.cpp" line="+68"/>
+ <source>Edit Items...</source>
+ <translation>Изменить элементы...</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Change Combobox Contents</source>
+ <translation>Изменено содержимое Combobox</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::CommandLinkButtonTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/button_taskmenu.cpp" line="+156"/>
+ <source>Change description...</source>
+ <translation>Изменить описание...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ConnectionEdit</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/connectionedit.cpp" line="+1313"/>
+ <source>Select All</source>
+ <translation>Выделить всё</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Deselect All</source>
+ <translation>Снять выделение</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ConnectionModel</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditorwindow.cpp" line="-465"/>
+ <source>Sender</source>
+ <translation>Отправитель</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Signal</source>
+ <translation>Сигнал</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Receiver</source>
+ <translation>Получатель</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Slot</source>
+ <translation>Слот</translation>
+ </message>
+ <message>
+ <location line="+90"/>
+ <source>&lt;sender&gt;</source>
+ <translation>&lt;отправитель&gt;</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&lt;signal&gt;</source>
+ <translation>&lt;сигнал&gt;</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&lt;receiver&gt;</source>
+ <translation>&lt;получатель&gt;</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&lt;slot&gt;</source>
+ <translation>&lt;слот&gt;</translation>
+ </message>
+ <message>
+ <location line="+108"/>
+ <source>The connection already exists!&lt;br&gt;%1</source>
+ <translation>Подключение уже существует!&lt;br&gt;%1</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Signal and Slot Editor</source>
+ <translation>Радактор сигналов и слотов</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ContainerWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+79"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Insert</source>
+ <translation>Вставить</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Insert Page Before Current Page</source>
+ <translation>Вставить страницу перед текущей</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Insert Page After Current Page</source>
+ <translation>Вставить страницу после текущей</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Add Subwindow</source>
+ <translation>Добавить дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Subwindow</source>
+ <translation>Дочернее окно</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Page</source>
+ <translation>Страница</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Page %1 of %2</source>
+ <translation>Страница %1 из %2</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::DPI_Chooser</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/dpi_chooser.cpp" line="+27"/>
+ <source>System (%1 x %2)</source>
+ <extracomment>System resolution</extracomment>
+ <translation>Системное (%1 x %2)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>User defined</source>
+ <translation>Пользовательское</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source> x </source>
+ <extracomment>DPI X/Y separator</extracomment>
+ <translation> x </translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::DesignerPropertyManager</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="+647"/>
+ <location line="+6"/>
+ <source>AlignLeft</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-5"/>
+ <source>AlignHCenter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>AlignRight</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>AlignJustify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>AlignTop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <location line="+4"/>
+ <source>AlignVCenter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-3"/>
+ <source>AlignBottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+565"/>
+ <source>%1, %2</source>
+ <translation>%1, %2</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+6"/>
+ <source>Customized (%n roles)</source>
+ <translation>
+ <numerusform>Настроено (%n роль)</numerusform>
+ <numerusform>Настроено (%n роли)</numerusform>
+ <numerusform>Настроено (%n ролей)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Inherited</source>
+ <translation>Унаследованная</translation>
+ </message>
+ <message>
+ <location line="+566"/>
+ <source>Horizontal</source>
+ <translation>Горизонтальное</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Vertical</source>
+ <translation>Вертикальное</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Normal Off</source>
+ <translation type="unfinished">Нормальный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Normal On</source>
+ <translation type="unfinished">Нормальный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Disabled Off</source>
+ <translation type="unfinished">Выключенный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Disabled On</source>
+ <translation type="unfinished">Выключенный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Active Off</source>
+ <translation type="unfinished">Активный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Active On</source>
+ <translation type="unfinished">Активный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Selected Off</source>
+ <translation type="unfinished">Выбранный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Selected On</source>
+ <translation type="unfinished">Выбранный, вкл</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+21"/>
+ <source>translatable</source>
+ <translation>переводимый</translation>
+ </message>
+ <message>
+ <location line="-15"/>
+ <location line="+21"/>
+ <source>disambiguation</source>
+ <translation>уточнение</translation>
+ </message>
+ <message>
+ <location line="-15"/>
+ <location line="+21"/>
+ <source>comment</source>
+ <translation>примечание</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::DeviceProfileDialog</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/deviceprofiledialog.cpp" line="+63"/>
+ <source>Device Profiles (*.%1)</source>
+ <translation>Профили устройства (*.%1)</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Default</source>
+ <translation>По умолчанию</translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>Save Profile</source>
+ <translation>Сохранение профиля</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Save Profile - Error</source>
+ <translation>Ошибка сохранения профиля</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Unable to open the file &apos;%1&apos; for writing: %2</source>
+ <translation>Не удалось открыть файл &apos;%1&apos; для записи: %2</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Open profile</source>
+ <translation>Открытие профиля</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+6"/>
+ <source>Open Profile - Error</source>
+ <translation>Ошибка отрытия профиля</translation>
+ </message>
+ <message>
+ <location line="-6"/>
+ <source>Unable to open the file &apos;%1&apos; for reading: %2</source>
+ <translation>Не удалось открыть файл &apos;%1&apos; для чтения: %2</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>&apos;%1&apos; is not a valid profile: %2</source>
+ <translation>&apos;%1&apos; не является корректным профилем: %2</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::Dialog</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/stringlisteditor.ui" line="+53"/>
+ <source>Dialog</source>
+ <translation>Диалог</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>StringList</source>
+ <translation>Список строк</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>New String</source>
+ <translation>Новая строка</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;New</source>
+ <translation>&amp;Новая</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Delete String</source>
+ <translation>Удалить строку</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <source>&amp;Value:</source>
+ <translation>&amp;Значение:</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Move String Up</source>
+ <translation>Переместить строку вверх</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move String Down</source>
+ <translation>Переместить строку вниз</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Down</source>
+ <translation> Вниз </translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::EmbeddedOptionsControl</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/embeddedoptionspage.cpp" line="-260"/>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Add a profile</source>
+ <translation>Добавить профиль</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Edit the selected profile</source>
+ <translation>Изменить выбранный профиль</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Delete the selected profile</source>
+ <translation>Удалить выбранный профиль</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Add Profile</source>
+ <translation>Добавление профиля</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>New profile</source>
+ <translation>Новый профиль</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Edit Profile</source>
+ <translation>Изменение профиля</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Delete Profile</source>
+ <translation>Удаление профиля</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Would you like to delete the profile &apos;%1&apos;?</source>
+ <translation>Желаете удалить профиль &apos;%1&apos;?</translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>Default</source>
+ <translation>По умолчанию</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FilterWidget</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/filterwidget.cpp" line="+185"/>
+ <source>&lt;Filter&gt;</source>
+ <translation>&lt;Фильтр&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formeditor.cpp" line="+190"/>
+ <source>Resource File Changed</source>
+ <translation>Файл ресурсов был изменён</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The file &quot;%1&quot; has changed outside Designer. Do you want to reload it?</source>
+ <translation>Файл &quot;%1&quot; был изменён вне Qt Designer. Желаете перезагрузить его?</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormLayoutMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/formlayoutmenu.cpp" line="+24"/>
+ <source>Add form layout row...</source>
+ <translation>Добавить строку компоновщика формы...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormWindow</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formwindow.cpp" line="-1267"/>
+ <source>Edit contents</source>
+ <translation>Изменить содержимое</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>F2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+774"/>
+ <source>Insert widget &apos;%1&apos;</source>
+ <translation>Вставить виджет &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>Resize</source>
+ <translation>Изменение размера</translation>
+ </message>
+ <message>
+ <location line="+218"/>
+ <location line="+15"/>
+ <source>Key Move</source>
+ <translation type="unfinished">Перемещение клавишей</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+211"/>
+ <source>Paste %n action(s)</source>
+ <translation type="unfinished">
+ <numerusform>Вставлено %n действие</numerusform>
+ <numerusform>Вставлено %n действия</numerusform>
+ <numerusform>Вставлено %n действий</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+2"/>
+ <source>Paste %n widget(s)</source>
+ <translation type="unfinished">
+ <numerusform>Вставлен %n виджет</numerusform>
+ <numerusform>Вставлено %n виджета</numerusform>
+ <numerusform>Вставлено %n виджета</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Paste (%1 widgets, %2 actions)</source>
+ <translation type="unfinished">Вставлено (%1 виджетов, %2 действий)</translation>
+ </message>
+ <message>
+ <location line="+56"/>
+ <source>Cannot paste widgets. Designer could not find a container without a layout to paste into.</source>
+ <translation type="unfinished">Не удалось вставить виджеты. Qt Designer не смог найти контейнер без компоновщика для вставки виджетов.</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Break the layout of the container you want to paste into, select this container and then paste again.</source>
+ <translation>Удалите компоновщик из контейнера, в который желаете вставить виджеты, выберите его и повторите вставку.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Paste error</source>
+ <translation>Ошибка вставки</translation>
+ </message>
+ <message>
+ <location line="+183"/>
+ <source>Raise widgets</source>
+ <translation>Поднятие виджетов</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Lower widgets</source>
+ <translation>Опускание виджетов</translation>
+ </message>
+ <message>
+ <location line="+204"/>
+ <source>Select Ancestor</source>
+ <translation>Выбрать предка</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Lay out</source>
+ <translation>Компоновка</translation>
+ </message>
+ <message>
+ <location line="+493"/>
+ <location line="+55"/>
+ <source>Drop widget</source>
+ <translation type="unfinished">Вставка виджета</translation>
+ </message>
+ <message>
+ <location line="-13"/>
+ <source>A QMainWindow-based form does not contain a central widget.</source>
+ <translation>Форма, основанная на QMainWindow, не содержит центрального виджета.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormWindowBase</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/formwindowbase.cpp" line="+393"/>
+ <source>Delete &apos;%1&apos;</source>
+ <translation>Удалить &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormWindowManager</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formwindowmanager.cpp" line="+364"/>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Вырезать</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Cuts the selected widgets and puts them on the clipboard</source>
+ <translation>Вырезает выбранные виджеты и помещает их в буфер обмена</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&amp;Copy</source>
+ <translation>&amp;Копировать</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Copies the selected widgets to the clipboard</source>
+ <translation>Копирует выбранные виджеты в буфер обмена</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&amp;Paste</source>
+ <translation>В&amp;ставить</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Pastes the clipboard&apos;s contents</source>
+ <translation>Вставляет содержимое буфера обмена</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Deletes the selected widgets</source>
+ <translation>Удаляет выбранные виджеты</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Select &amp;All</source>
+ <translation>&amp;Выделить все</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Selects all widgets</source>
+ <translation>Выделяет все виджеты</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Bring to &amp;Front</source>
+ <translation>Переместить &amp;вперед</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+1"/>
+ <source>Raises the selected widgets</source>
+ <translation>Поднимает выбранные виджеты на передний план</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Send to &amp;Back</source>
+ <translation>Переместить &amp;назад</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <location line="+1"/>
+ <source>Lowers the selected widgets</source>
+ <translation>Опускает выбранные виджеты на задний план</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Adjust &amp;Size</source>
+ <translation>Подогнать &amp;размер</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Adjusts the size of the selected widget</source>
+ <translation>Подгоняет размер выбранного виджета</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Lay Out &amp;Horizontally</source>
+ <translation>Скомпоновать по &amp;горизонтальная</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets horizontally</source>
+ <translation>Компонует выделенные виджеты по горизонтали (QHBoxLayout)</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Lay Out &amp;Vertically</source>
+ <translation>Скомпоновать по &amp;вертикали</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets vertically</source>
+ <translation>Компонует выделенные виджеты по вертикали (QVBoxLayout)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Lay Out in a &amp;Form Layout</source>
+ <translation>Скомпоновать в &amp;две колонки</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets in a form layout</source>
+ <translation>Компонует выделенные виджеты в две колонки (QFormLayout)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Lay Out in a &amp;Grid</source>
+ <translation>Скомпоновать по &amp;сетке</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets in a grid</source>
+ <translation>Компонует выделенные виджеты по сетке (QGridLayout)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Lay Out Horizontally in S&amp;plitter</source>
+ <translation>Скомпоновать по г&amp;оризонтали с разделителем</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets horizontally in a splitter</source>
+ <translation>Компонует выделенные виджеты по горизонтали (QSplitter)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Lay Out Vertically in Sp&amp;litter</source>
+ <translation>Скомпоновать по в&amp;ертикали с разделителем</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Lays out the selected widgets vertically in a splitter</source>
+ <translation>Компонует выделенные виджеты по вертикали (QSplitter)</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>&amp;Break Layout</source>
+ <translation>&amp;Удалить компоновщик</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Breaks the selected layout</source>
+ <translation>Удаляет выбранный компоновщик</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Si&amp;mplify Grid Layout</source>
+ <translation>Упрост&amp;ить компоновку по сетке</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Removes empty columns and rows</source>
+ <translation>Удаляет пустые колонки и строки в QGridLayout</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>&amp;Preview...</source>
+ <translation>&amp;Предпросмотр...</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Preview current form</source>
+ <translation>Предпросмотр формы</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Form &amp;Settings...</source>
+ <translation>&amp;Настройки формы...</translation>
+ </message>
+ <message>
+ <location line="+92"/>
+ <source>Break Layout</source>
+ <translation>Удалить компоновщик</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Adjust Size</source>
+ <translation>Подогнать размер</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Could not create form preview</source>
+ <comment>Title of warning message box</comment>
+ <translation>Не удалось создать предпросмотр формы</translation>
+ </message>
+ <message>
+ <location line="+341"/>
+ <source>Form Settings - %1</source>
+ <translation>Настройки формы - %1</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::FormWindowSettings</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/formwindowsettings.cpp" line="+193"/>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Device Profile: %1</source>
+ <translation>Профиль устройства: %1</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::GridPanel</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/gridpanel.ui" line="+13"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Grid</source>
+ <translation>Сетка</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Visible</source>
+ <translation>Видимая</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Grid &amp;X</source>
+ <translation>Сетка &amp;X</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <location line="+57"/>
+ <source>Snap</source>
+ <translation>Прилипать</translation>
+ </message>
+ <message>
+ <location line="-48"/>
+ <source>Reset</source>
+ <translation>Сбросить</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>Grid &amp;Y</source>
+ <translation>Сетка &amp;Y</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::GroupBoxTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/groupbox_taskmenu.cpp" line="+82"/>
+ <source>Change title...</source>
+ <translation>Изменить заголовок...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::HtmlTextEdit</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="-58"/>
+ <source>Insert HTML entity</source>
+ <translation>Вставить элемент HTML</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::IconSelector</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-24"/>
+ <source>The pixmap file &apos;%1&apos; cannot be read.</source>
+ <translation>Невозможно прочитать файл растрового изображения &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>The file &apos;%1&apos; does not appear to be a valid pixmap file: %2</source>
+ <translation>Файл &apos;%1&apos; не похож на корректный файл растрового изображения: %2</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>The file &apos;%1&apos; could not be read: %2</source>
+ <translation>Не удалось прочитать файл %1: %2</translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <source>Choose a Pixmap</source>
+ <translation>Выбор растрового изображения</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Pixmap Read Error</source>
+ <translation>Ошибка чтения растрового изображения</translation>
+ </message>
+ <message>
+ <location line="+54"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Normal Off</source>
+ <translation type="unfinished">Нормальный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Normal On</source>
+ <translation type="unfinished">Нормальный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Disabled Off</source>
+ <translation type="unfinished">Выключенный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Disabled On</source>
+ <translation type="unfinished">Выключенный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Active Off</source>
+ <translation type="unfinished">Активный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Active On</source>
+ <translation type="unfinished">Активный, вкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Selected Off</source>
+ <translation type="unfinished">Выбранный, выкл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Selected On</source>
+ <translation type="unfinished">Выбранный, вкл</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Choose Resource...</source>
+ <translation>Выбрать ресурс...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Choose File...</source>
+ <translation>Выбрать файл...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reset</source>
+ <translation>Сбросить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Reset All</source>
+ <translation>Сбросить всё</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ItemListEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+358"/>
+ <source>Properties &amp;&lt;&lt;</source>
+ <translation>Свойства &amp;&lt;&lt;</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.ui" line="+143"/>
+ <location filename="../tools/designer/src/components/taskmenu/itemlisteditor.cpp" line="+2"/>
+ <source>Properties &amp;&gt;&gt;</source>
+ <translation>Свойства &amp;&gt;&gt;</translation>
+ </message>
+ <message>
+ <location line="-75"/>
+ <source>Items List</source>
+ <translation>Список элементов</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>New Item</source>
+ <translation>Новый элемент</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;New</source>
+ <translation>&amp;Новый</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Delete Item</source>
+ <translation>Удалить элемент</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Move Item Up</source>
+ <translation>Переместить элемент вверх</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move Item Down</source>
+ <translation>Переместить элемент вниз</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::LabelTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/label_taskmenu.cpp" line="+85"/>
+ <source>Change rich text...</source>
+ <translation>Изменить форматированный текст...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change plain text...</source>
+ <translation>Изменить обычный текст...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::LanguageResourceDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/iconselector.cpp" line="-343"/>
+ <source>Choose Resource</source>
+ <translation>Выбор ресурса</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::LineEditTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/lineedit_taskmenu.cpp" line="+80"/>
+ <source>Change text...</source>
+ <translation>Изменить текст...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ListWidgetEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/listwidgeteditor.cpp" line="+69"/>
+ <source>New Item</source>
+ <translation>Новый элемент</translation>
+ </message>
+ <message>
+ <location line="+32"/>
+ <source>Edit List Widget</source>
+ <translation>Изменение виджета List</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Edit Combobox</source>
+ <translation>Изменение виджета ComboBox</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ListWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/listwidget_taskmenu.cpp" line="+67"/>
+ <source>Edit Items...</source>
+ <translation>Изменить элементы...</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Change List Contents</source>
+ <translation>Изменение содержимого списка</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::MdiContainerWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="+118"/>
+ <source>Next Subwindow</source>
+ <translation>Следующее дочернее докно</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Previous Subwindow</source>
+ <translation>Предыдущее дочернее докно</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Tile</source>
+ <translation>Замостить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Cascade</source>
+ <translation>Каскадом</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::MenuTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/menutaskmenu.cpp" line="+56"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::MorphMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/morphmenu.cpp" line="+264"/>
+ <source>Morph into</source>
+ <translation>Преобразовать в</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::NewActionDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/newactiondialog.ui" line="+46"/>
+ <source>New Action...</source>
+ <translation>Новое действие...</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&amp;Text:</source>
+ <translation>&amp;Текст:</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Object &amp;name:</source>
+ <translation>&amp;Имя объекта:</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>&amp;Icon:</source>
+ <translation>&amp;Значок:</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Shortcut:</source>
+ <translation>Горячая клавиша:</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Checkable:</source>
+ <translation>Триггерное:</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>ToolTip:</source>
+ <translation>Подсказка:</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+21"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::NewDynamicPropertyDialog</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.cpp" line="+134"/>
+ <source>Set Property Name</source>
+ <translation>Установка имени свойства</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>The current object already has a property named &apos;%1&apos;.
+Please select another, unique one.</source>
+ <translation>Объект уже содержит свойство с именем &apos;%1&apos;.
+Укажите другое имя.</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>The &apos;_q_&apos; prefix is reserved for the Qt library.
+Please select another name.</source>
+ <translation>Приставка &apos;_q_&apos; зарезервирована для целей библиотеки Qt.
+Укажите другое имя.</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/newdynamicpropertydialog.ui" line="+13"/>
+ <source>Create Dynamic Property</source>
+ <translation>Создание динамического свойства</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Property Name</source>
+ <translation>Имя свойства</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>horizontalSpacer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Property Type</source>
+ <translation>Тип свойства</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::NewFormWidget</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/newformwidget.cpp" line="+104"/>
+ <source>Default size</source>
+ <translation>Размер по умолчанию</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>QVGA portrait (240x320)</source>
+ <translation>QVGA книжная (240x320)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>QVGA landscape (320x240)</source>
+ <translation>QVGA альбомная (320x240)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>VGA portrait (480x640)</source>
+ <translation>VGA книжная (480x640)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>VGA landscape (640x480)</source>
+ <translation>VGA альбомная (640x480)</translation>
+ </message>
+ <message>
+ <location line="+66"/>
+ <source>Widgets</source>
+ <extracomment>New Form Dialog Categories</extracomment>
+ <translation>Виджеты</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Custom Widgets</source>
+ <translation>Пользовательские виджеты</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location line="+57"/>
+ <source>Error loading form</source>
+ <translation>Ошибка загрузки формы</translation>
+ </message>
+ <message>
+ <location line="+244"/>
+ <source>Unable to open the form template file &apos;%1&apos;: %2</source>
+ <translation type="unfinished">Невозможно открыть файл шаблона формы &apos;%1&apos;: %2</translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>Internal error: No template selected.</source>
+ <translation>Внутренняя ошибка: Шаблон не выбран.</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/newformwidget.ui" line="+82"/>
+ <source>0</source>
+ <translation>0</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Choose a template for a preview</source>
+ <translation>Выберите шаблон для предпросмотра</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Embedded Design</source>
+ <translation type="unfinished">Оформление портативных устройств</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Device:</source>
+ <translation>Устройство:</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Screen Size:</source>
+ <translation>Размер экрана:</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::NewPromotedClassPanel</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+92"/>
+ <source>Add</source>
+ <translation>Добавить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>New Promoted Class</source>
+ <translation type="unfinished">Новый преобразованный класс</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Base class name:</source>
+ <translation>Имя базового класса:</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Promoted class name:</source>
+ <translation type="unfinished">Имя преобразованного класса:</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Header file:</source>
+ <translation>Заголовочный файл:</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Global include</source>
+ <translation type="unfinished">Глобальное включение</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Reset</source>
+ <translation>Восстановить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ObjectInspector</name>
+ <message>
+ <location filename="../tools/designer/src/components/objectinspector/objectinspector.cpp" line="+754"/>
+ <source>&amp;Find in Text...</source>
+ <translation>&amp;Найти в тексте...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ObjectInspector::ObjectInspectorPrivate</name>
+ <message>
+ <location line="-438"/>
+ <source>Change Current Page</source>
+ <translation>Смена текущей страницы</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::OrderDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/orderdialog.cpp" line="+109"/>
+ <source>Index %1 (%2)</source>
+ <translation>Индекс %1 (%2)</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>%1 %2</source>
+ <translation>%1 %2</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/orderdialog.ui" line="+53"/>
+ <source>Change Page Order</source>
+ <translation>Изменение порядка страниц</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Page Order</source>
+ <translation>Порядок страниц</translation>
+ </message>
+ <message>
+ <location line="+57"/>
+ <source>Move page up</source>
+ <translation>Переместить страницу выше</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move page down</source>
+ <translation>Переместить страницу ниже</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PaletteEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.ui" line="+61"/>
+ <source>Edit Palette</source>
+ <translation>Правка палитры</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Tune Palette</source>
+ <translation>Настройка палитры</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>Show Details</source>
+ <translation type="unfinished">Показывать детали</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Compute Details</source>
+ <translation type="unfinished">Расчитывать детали</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Quick</source>
+ <translation type="unfinished">Быстрый</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Preview</source>
+ <translation>Предпросмотр</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Disabled</source>
+ <translation>Выключенная</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Inactive</source>
+ <translation>Неактивная</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Active</source>
+ <translation>Активная</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PaletteEditorButton</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/paletteeditorbutton.cpp" line="+57"/>
+ <source>Change Palette</source>
+ <translation type="unfinished">Изменить палитру</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PaletteModel</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/paletteeditor.cpp" line="+374"/>
+ <source>Color Role</source>
+ <translation>Роль цвета</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Active</source>
+ <translation>Активный</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Inactive</source>
+ <translation>Неактивный</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Disabled</source>
+ <translation>Выключенный</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PixmapEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-1541"/>
+ <source>Choose Resource...</source>
+ <translation>Выбрать ресурс...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Choose File...</source>
+ <translation>Выбрать файл...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Copy Path</source>
+ <translation>Скопировать путь</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Paste Path</source>
+ <translation>Вставить путь</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+16"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PlainTextEditorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/plaintexteditor.cpp" line="+65"/>
+ <source>Edit text</source>
+ <translation>Правка текста</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PluginDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/plugindialog.cpp" line="+72"/>
+ <source>Components</source>
+ <translation>Компоненты</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Plugin Information</source>
+ <translation>Информация о модуле</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Refresh</source>
+ <translation>Обновить</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Scan for newly installed custom widget plugins.</source>
+ <translation>Поиск вновь установленных модулей пользовательских виджетов.</translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>Qt Designer couldn&apos;t find any plugins</source>
+ <translation>Qt Designer не может найти ни одного модуля</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Qt Designer found the following plugins</source>
+ <translation>Qt Designer нашёл следующие модули</translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>New custom widget plugins have been found.</source>
+ <translation>Найдены новые модули пользовательских виджетов.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewActionGroup</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/previewactiongroup.cpp" line="+95"/>
+ <source>%1 Style</source>
+ <translation>Стиль %1</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewConfigurationWidget</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewconfigurationwidget.cpp" line="+139"/>
+ <source>Default</source>
+ <translation>По умолчанию</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>None</source>
+ <translation>Нет</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Browse...</source>
+ <translation>Обзор...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate</name>
+ <message>
+ <location line="+118"/>
+ <source>Load Custom Device Skin</source>
+ <translation>Загрузить особую обложку устройства</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>All QVFB Skins (*.%1)</source>
+ <translation>Все обложки QVFB (*.%1)</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>%1 - Duplicate Skin</source>
+ <translation>%1 - Повторяющаяся обложка</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The skin &apos;%1&apos; already exists.</source>
+ <translation>Обложка &apos;%1&apos; уже существует.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>%1 - Error</source>
+ <translation>%1 - Ошибка</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>%1 is not a valid skin directory:
+%2</source>
+ <translation>%1 не является корректным каталогом обложек:
+%2</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewDeviceSkin</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="+259"/>
+ <source>&amp;Portrait</source>
+ <translation>&amp;Книжная</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Landscape (&amp;CCW)</source>
+ <extracomment>Rotate form preview counter-clockwise</extracomment>
+ <translation>Альбомная (&amp;против ЧС)</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>&amp;Landscape (CW)</source>
+ <extracomment>Rotate form preview clockwise</extracomment>
+ <translation>&amp;Альбомная (по ЧС)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewManager</name>
+ <message>
+ <location line="+426"/>
+ <source>%1 - [Preview]</source>
+ <translation>%1 - [Предпросмотр]</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewMdiArea</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/previewframe.cpp" line="+72"/>
+ <source>The moose in the noose
+ate the goose who was loose.</source>
+ <extracomment>Palette editor background</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PreviewWidget</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/previewwidget.ui" line="+61"/>
+ <source>Preview Window</source>
+ <translation>Окно предпросмотра</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>LineEdit</source>
+ <translation>LineEdit</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>ComboBox</source>
+ <translation>ComboBox</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>PushButton</source>
+ <translation>PushButton</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>ButtonGroup2</source>
+ <translation>ButtonGroup2</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>CheckBox1</source>
+ <translation>CheckBox1</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>CheckBox2</source>
+ <translation>CheckBox2</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>ButtonGroup</source>
+ <translation>ButtonGroup</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>RadioButton1</source>
+ <translation>RadioButton1</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>RadioButton2</source>
+ <translation>RadioButton2</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>RadioButton3</source>
+ <translation>RadioButton3</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PromotionModel</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/promotionmodel.cpp" line="+17"/>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Header file</source>
+ <translation>Заголовочный файл</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Global include</source>
+ <translation type="unfinished">Глобальное включение</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Usage</source>
+ <translation type="unfinished">Использование</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PromotionTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/promotiontaskmenu.cpp" line="+85"/>
+ <source>Promoted widgets...</source>
+ <translation type="unfinished">Преобразованные виджеты...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Promote to ...</source>
+ <translation type="unfinished">Преобразовать в ...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change signals/slots...</source>
+ <translation>Изменить сигналы/слоты...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Promote to</source>
+ <translation type="unfinished">Преобразовать в</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Demote to %1</source>
+ <translation type="unfinished">Преобразовать в %1</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PropertyEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/propertyeditor.cpp" line="+183"/>
+ <source>Add Dynamic Property...</source>
+ <translation>Добавить динамическое свойство...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Remove Dynamic Property</source>
+ <translation>Удалить динамическое свойство</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Sorting</source>
+ <translation>Сортировка</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Color Groups</source>
+ <translation type="unfinished">Цветовые группы</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Tree View</source>
+ <translation>Древовидный список</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Drop Down Button View</source>
+ <translation type="unfinished">Вид выпадающего списка</translation>
+ </message>
+ <message>
+ <location line="+50"/>
+ <source>String...</source>
+ <translation>Строка...</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Bool...</source>
+ <translation>Булево...</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Other...</source>
+ <translation>Другое...</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Configure Property Editor</source>
+ <translation>Настроить радактор свойств</translation>
+ </message>
+ <message>
+ <location line="+533"/>
+ <source>Object: %1
+Class: %2</source>
+ <translation>Объект: %1
+Класс: %2</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::PropertyLineEdit</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/propertylineedit.cpp" line="+88"/>
+ <source>Insert line break</source>
+ <translation>Вставить разрыв строки</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::QDesignerPromotionDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_promotiondialog.cpp" line="+85"/>
+ <source>Promoted Widgets</source>
+ <translation type="unfinished">Преобразованные виджеты</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Promoted Classes</source>
+ <translation type="unfinished">Преобразованные классы</translation>
+ </message>
+ <message>
+ <location line="+60"/>
+ <source>Promote</source>
+ <translation type="unfinished">Преобразовать</translation>
+ </message>
+ <message>
+ <location line="+152"/>
+ <source>Change signals/slots...</source>
+ <translation>Изменить сигналы/слоты...</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>%1 - Error</source>
+ <translation>%1 - Ошибка</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::QDesignerResource</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/qdesigner_resource.cpp" line="+277"/>
+ <source>Loading qrc file</source>
+ <translation>Загрузка файла qrc</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The specified qrc file &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;could not be found. Do you want to update the file location?&lt;/p&gt;</source>
+ <translation>Не удалось найти указанный файл qrc &lt;p&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Желаете обновить его расположение?&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>New location for %1</source>
+ <translation>Новое расположение %1</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Resource files (*.qrc)</source>
+ <translation>Файл ресурсов (*.qrc)</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::QDesignerTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_taskmenu.cpp" line="+68"/>
+ <source>Change objectName...</source>
+ <translation>Изменить objectName...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change toolTip...</source>
+ <translation>Изменить toolTip...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change whatsThis...</source>
+ <translation>Изменить whatsThis...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change styleSheet...</source>
+ <translation>Изменить styleSheet...</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Create Menu Bar</source>
+ <translation>Создать панель меню</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add Tool Bar</source>
+ <translation>Добавить панель инструментов</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Create Status Bar</source>
+ <translation>Создать строку состояния</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Remove Status Bar</source>
+ <translation>Удалить строку состояния</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change script...</source>
+ <translation>Изменить сценарий...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change signals/slots...</source>
+ <translation>Изменить сигналы/слоты...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Go to slot...</source>
+ <translation>Перейти к слоту...</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Size Constraints</source>
+ <translation>Ограничения размера</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Set Minimum Width</source>
+ <translation>Установить минимальную ширину</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Set Minimum Height</source>
+ <translation>Установить минимальную высоту</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Set Minimum Size</source>
+ <translation>Установить минимальный размер</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Set Maximum Width</source>
+ <translation>Установить максимальную ширину</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Set Maximum Height</source>
+ <translation>Установить максимальную высоту</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Set Maximum Size</source>
+ <translation>Установить максимальный размер</translation>
+ </message>
+ <message>
+ <location line="+235"/>
+ <source>Edit ToolTip</source>
+ <translation>Правка текста всплывающей подсказки</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Edit WhatsThis</source>
+ <translation>Правка текста подсказки режима &quot;Что это?&quot;</translation>
+ </message>
+ <message>
+ <location line="+144"/>
+ <source>no signals available</source>
+ <translation>Нет доступных сигналов</translation>
+ </message>
+ <message numerus="yes">
+ <location line="+67"/>
+ <source>Set size constraint on %n widget(s)</source>
+ <translation>
+ <numerusform>Установка ограничений размера для %n виджета</numerusform>
+ <numerusform>Установка ограничений размера для %n виджетов</numerusform>
+ <numerusform>Установка ограничений размера для %n виджетов</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::QDesignerWidgetBox</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_widgetbox.cpp" line="+123"/>
+ <location line="+13"/>
+ <source>Unexpected element &lt;%1&gt;</source>
+ <translation>Неожиданный элемент &lt;%1&gt;</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>A parse error occurred at line %1, column %2 of the XML code specified for the widget %3: %4
+%5</source>
+ <translation>Возникла ошибка разбора в строке %1 позиции %2 кода XML, определённого для виджета %3: %4
+%5</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>The XML code specified for the widget %1 does not contain any widget elements.
+%2</source>
+ <translation>Код XML, определённый для виджета %1, не содержит каких-либо элементов виджетов.
+%2</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="+349"/>
+ <source>An error has been encountered at line %1 of %2: %3</source>
+ <translation>Обнаружена ошибка в строке %1 из %2: %3</translation>
+ </message>
+ <message>
+ <location line="+139"/>
+ <source>Unexpected element &lt;%1&gt; encountered when parsing for &lt;widget&gt; or &lt;ui&gt;</source>
+ <translation>Обнаружен неожиданный элемент &lt;%1&gt; вместо &lt;widget&gt; или &lt;ui&gt;</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Unexpected end of file encountered when parsing widgets.</source>
+ <translation>Файл неожиданно закончился при разборе виджетов.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>A widget element could not be found.</source>
+ <translation>Не удалось обнаружить элемент виджета.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::QtGradientStopsController</name>
+ <message>
+ <location filename="../tools/shared/qtgradienteditor/qtgradientstopscontroller.cpp" line="+173"/>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+4"/>
+ <source>Hue</source>
+ <translation>Оттенок</translation>
+ </message>
+ <message>
+ <location line="-3"/>
+ <source>Sat</source>
+ <translation>Насыщ</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Val</source>
+ <translation>Знач</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Saturation</source>
+ <translation>Насыщенность</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Red</source>
+ <translation>Красный</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Green</source>
+ <translation>Зелёный</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Blue</source>
+ <translation>Синий</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::RichTextEditorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/richtexteditor.cpp" line="+436"/>
+ <source>Edit text</source>
+ <translation>Правка текста</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Rich Text</source>
+ <translation>Форматированный текст</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Source</source>
+ <translation type="unfinished">Исходник</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>&amp;Cancel</source>
+ <translation>От&amp;мена</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::RichTextEditorToolBar</name>
+ <message>
+ <location line="-302"/>
+ <source>Bold</source>
+ <translation>Жирный</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>CTRL+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Italic</source>
+ <translation>Курсив</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>CTRL+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Underline</source>
+ <translation>Подчёркнутый</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>CTRL+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Left Align</source>
+ <translation>По левому краю</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Center</source>
+ <translation>По центру</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Right Align</source>
+ <translation>По правому краю</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Justify</source>
+ <translation>По ширине</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Superscript</source>
+ <translation>Верхний индекс</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Subscript</source>
+ <translation>Нижний индекс</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Insert &amp;Link</source>
+ <translation>Вставить &amp;ссылку</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Insert &amp;Image</source>
+ <translation>Вставить &amp;изображение</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ScriptDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/scriptdialog.cpp" line="+66"/>
+ <source>Edit script</source>
+ <translation>Правка сценария</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&lt;html&gt;Enter a Qt Script snippet to be executed while loading the form.&lt;br&gt;The widget and its children are accessible via the variables &lt;i&gt;widget&lt;/i&gt; and &lt;i&gt;childWidgets&lt;/i&gt;, respectively.</source>
+ <translation>&lt;html&gt;Укажите сценарий Qt, который должен выполняться при загрузке формы.&lt;br&gt;Виджет и его дочерние виджеты доступны через переменные &lt;i&gt;widget&lt;/i&gt; и &lt;i&gt;childWidgets&lt;/i&gt;.</translation>
+ </message>
+ <message>
+ <location line="+51"/>
+ <source>Syntax error</source>
+ <translation>Синтаксическая ошибка</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ScriptErrorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/scripterrordialog.cpp" line="+27"/>
+ <source>Script errors</source>
+ <translation>Ошибки сценария</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::SignalSlotDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/signalslotdialog.cpp" line="+199"/>
+ <source>There is already a slot with the signature &apos;%1&apos;.</source>
+ <translation>Уже есть слот с сигнатурой &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>There is already a signal with the signature &apos;%1&apos;.</source>
+ <translation>Уже есть сигнал с сигнатурой &apos;%1&apos;.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>%1 - Duplicate Signature</source>
+ <translation>%1 - Повторяющаяся сигнатура</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <location line="+76"/>
+ <source>Signals/Slots of %1</source>
+ <translation>Сигналы/слоты %1</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::SignalSlotEditorPlugin</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_plugin.cpp" line="+72"/>
+ <source>Edit Signals/Slots</source>
+ <translation>Изменение сигналов/слотов</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::SignalSlotEditorTool</name>
+ <message>
+ <location filename="../tools/designer/src/components/signalsloteditor/signalsloteditor_tool.cpp" line="+58"/>
+ <source>Edit Signals/Slots</source>
+ <translation>Изменение сигналов/слотов</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::StatusBarTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/toolbar_taskmenu.cpp" line="+81"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::StringListEditorButton</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/stringlisteditorbutton.cpp" line="+56"/>
+ <source>Change String List</source>
+ <translation>Изменить список строк</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::StyleSheetEditorDialog</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/stylesheeteditor.cpp" line="+90"/>
+ <location line="+280"/>
+ <source>Valid Style Sheet</source>
+ <translation>Корректная таблица стилей</translation>
+ </message>
+ <message>
+ <location line="-278"/>
+ <source>Add Resource...</source>
+ <translation>Добавить ресурс...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add Gradient...</source>
+ <translation>Добавить градиент...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add Color...</source>
+ <translation>Добавить цвет...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add Font...</source>
+ <translation>Добавить шрифт...</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Edit Style Sheet</source>
+ <translation>Правка таблицы стилей</translation>
+ </message>
+ <message>
+ <location line="+276"/>
+ <source>Invalid Style Sheet</source>
+ <translation>Некорректная таблица стилей</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TabOrderEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/tabordereditor/tabordereditor.cpp" line="+363"/>
+ <source>Start from Here</source>
+ <translation>Начать отсюда</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Restart</source>
+ <translation>Перезапустить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Tab Order List...</source>
+ <translation>Список порядка переключений...</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Tab Order List</source>
+ <translation>Список порядка переключений</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Tab Order</source>
+ <translation>Порядок переключений</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TabOrderEditorPlugin</name>
+ <message>
+ <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_plugin.cpp" line="+73"/>
+ <source>Edit Tab Order</source>
+ <translation>Изменение порядка переключений</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TabOrderEditorTool</name>
+ <message>
+ <location filename="../tools/designer/src/components/tabordereditor/tabordereditor_tool.cpp" line="+57"/>
+ <source>Edit Tab Order</source>
+ <translation>Изменить порядок переключений</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TableWidgetEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.ui" line="+97"/>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="+218"/>
+ <source>Properties &amp;&gt;&gt;</source>
+ <translation>Свойства &amp;&gt;&gt;</translation>
+ </message>
+ <message>
+ <location line="-44"/>
+ <source>Edit Table Widget</source>
+ <translation>Правка табличного виджета</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>&amp;Items</source>
+ <translation>&amp;Элементы</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Table Items</source>
+ <translation>Элементы таблицы</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidgeteditor.cpp" line="-151"/>
+ <source>New Column</source>
+ <translation>Новый столбец</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>New Row</source>
+ <translation>Новая строка</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&amp;Columns</source>
+ <translation>С&amp;толбцы</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>&amp;Rows</source>
+ <translation>&amp;Строки</translation>
+ </message>
+ <message>
+ <location line="+137"/>
+ <source>Properties &amp;&lt;&lt;</source>
+ <translation>Свойства &amp;&lt;&lt;</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TableWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/tablewidget_taskmenu.cpp" line="+64"/>
+ <source>Edit Items...</source>
+ <translation>Изменить элементы...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TemplateOptionsWidget</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/templateoptionspage.cpp" line="-18"/>
+ <source>Pick a directory to save templates in</source>
+ <translation>Выберите каталог для сохранения шаблонов</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/templateoptionspage.ui" line="+13"/>
+ <source>Form</source>
+ <translation>Форма</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Additional Template Paths</source>
+ <translation>Дополнительные пути к шаблонам</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <location line="+7"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TextEditTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/textedit_taskmenu.cpp" line="+58"/>
+ <source>Edit HTML</source>
+ <translation>Правка HTML</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change HTML...</source>
+ <translation>Изменить HTML...</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Edit Text</source>
+ <translation>Правка текста</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Change Plain Text...</source>
+ <translation>Правка обычного текста...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TextEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/propertyeditor/designerpropertymanager.cpp" line="-204"/>
+ <source>Choose Resource...</source>
+ <translation>Выбрать ресурс...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Choose File...</source>
+ <translation>Выбрать файл...</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location line="+118"/>
+ <source>Choose a File</source>
+ <translation>Выбор файла</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ToolBarEventFilter</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/qdesigner_toolbar.cpp" line="+148"/>
+ <source>Insert Separator before &apos;%1&apos;</source>
+ <translation>Вставить разделитель перед &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Append Separator</source>
+ <translation>Добавить разделитель</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Remove action &apos;%1&apos;</source>
+ <translation>Удалить действие &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Remove Toolbar &apos;%1&apos;</source>
+ <translation>Удалить панель инструментов &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>Insert Separator</source>
+ <translation>Вставить разделитель</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TreeWidgetEditor</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+68"/>
+ <source>New Column</source>
+ <translation>Новый столбец</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>&amp;Columns</source>
+ <translation>С&amp;толбцы</translation>
+ </message>
+ <message>
+ <location line="+69"/>
+ <source>Per column properties</source>
+ <translation>Свойства столбца</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Common properties</source>
+ <translation>Общие свойства</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui" line="+101"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+53"/>
+ <source>New Item</source>
+ <translation>Новый элемент</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+19"/>
+ <source>New Subitem</source>
+ <translation>Новый дочерний элемент</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+175"/>
+ <source>Properties &amp;&lt;&lt;</source>
+ <translation>Свойства &amp;&lt;&lt;</translation>
+ </message>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.ui" line="+86"/>
+ <location filename="../tools/designer/src/components/taskmenu/treewidgeteditor.cpp" line="+2"/>
+ <source>Properties &amp;&gt;&gt;</source>
+ <translation>Свойства &amp;&gt;&gt;</translation>
+ </message>
+ <message>
+ <location line="-144"/>
+ <source>Edit Tree Widget</source>
+ <translation type="unfinished">Изменение виджета Tree</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>&amp;Items</source>
+ <translation>&amp;Элементы</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Tree Items</source>
+ <translation>Элементы дерева</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>&amp;New</source>
+ <translation>&amp;Новый</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>New &amp;Subitem</source>
+ <translation>Новый &amp;дочерний элемент</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Delete Item</source>
+ <translation>Удалить элемент</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Move Item Left (before Parent Item)</source>
+ <translation>Переместить элемент влево (перед родительским)</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move Item Right (as a First Subitem of the Next Sibling Item)</source>
+ <translation>Переместить элемент вправо (сделать первым дочерним элементом соседнего элемента)</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move Item Up</source>
+ <translation>Переместить элемент вверх</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>U</source>
+ <translation>U</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Move Item Down</source>
+ <translation>Переместить элемент вниз</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>D</source>
+ <translation>D</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::TreeWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/treewidget_taskmenu.cpp" line="+63"/>
+ <source>Edit Items...</source>
+ <translation>Изменить элементы...</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WidgetBox</name>
+ <message>
+ <location filename="../tools/designer/src/components/widgetbox/widgetbox_dnditem.cpp" line="+115"/>
+ <source>Warning: Widget creation failed in the widget box. This could be caused by invalid custom widget XML.</source>
+ <translation>Предупреждение: Не удалось создать виджет. Это могло произойти из-за некорректного XML пользовательского виджета.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WidgetBoxTreeWidget</name>
+ <message>
+ <location filename="../tools/designer/src/components/widgetbox/widgetboxtreewidget.cpp" line="-268"/>
+ <source>Scratchpad</source>
+ <translation type="unfinished">Блокнот</translation>
+ </message>
+ <message>
+ <location line="+370"/>
+ <source>Custom Widgets</source>
+ <translation>Пользовательские виджеты</translation>
+ </message>
+ <message>
+ <location line="+263"/>
+ <source>Expand all</source>
+ <translation>Развернуть всё</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Collapse all</source>
+ <translation>Свернуть всё</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>List View</source>
+ <translation>Список</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Icon View</source>
+ <translation>Значки</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Edit name</source>
+ <translation>Изменить имя</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WidgetDataBase</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/widgetdatabase.cpp" line="-411"/>
+ <source>A custom widget plugin whose class name (%1) matches that of an existing class has been found.</source>
+ <translation>Обнаружен пользовательский модуль виджета, имя класса (%1) которого совпадает с уже имеющимся.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WidgetEditorTool</name>
+ <message>
+ <location filename="../tools/designer/src/components/formeditor/tool_widgeteditor.cpp" line="+67"/>
+ <source>Edit Widgets</source>
+ <translation>Изменение виджетов</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WidgetFactory</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/widgetfactory.cpp" line="+263"/>
+ <source>The custom widget factory registered for widgets of class %1 returned 0.</source>
+ <translation>Пользовательская фабрика виджетов, зарегистрированная для класса %1, вернула 0.</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class %1. It returned a widget of class %2.</source>
+ <translation>Обнаружено несоответствие имени класса при создании виджета с использованием пользовательской фабрики виджетов, зарегистрированной для класса %1. Она вернула виджет класса %2.</translation>
+ </message>
+ <message>
+ <location line="+99"/>
+ <source>%1 Widget</source>
+ <translation>Виджет %1</translation>
+ </message>
+ <message>
+ <location line="+90"/>
+ <source>The current page of the container &apos;%1&apos; (%2) could not be determined while creating a layout.This indicates an inconsistency in the ui-file, probably a layout being constructed on a container widget.</source>
+ <translation type="unfinished">При создании компоновщика не удалось определить текущую страницу контейнера &apos;%1&apos; (%2). Это указывает на некорректность файла ui - возможно, компоновщик был создан для контейнерного виджета.</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>Attempt to add a layout to a widget &apos;%1&apos; (%2) which already has an unmanaged layout of type %3.
+This indicates an inconsistency in the ui-file.</source>
+ <translation>Попытка добавить компоновщик виджету &apos;%1&apos; (%2), у которого уже есть компоновщик типа %3.
+Это указывает на некорректность файла ui.</translation>
+ </message>
+ <message>
+ <location line="+211"/>
+ <source>Cannot create style &apos;%1&apos;.</source>
+ <translation>Не удалось создать стиль &apos;%1&apos;.</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::WizardContainerWidgetTaskMenu</name>
+ <message>
+ <location filename="../tools/designer/src/components/taskmenu/containerwidget_taskmenu.cpp" line="-49"/>
+ <source>Next</source>
+ <translation>Далее</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Back</source>
+ <translation>Назад</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ZoomMenu</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/zoomwidget.cpp" line="+84"/>
+ <source>%1 %</source>
+ <extracomment>Zoom factor</extracomment>
+ <translation>%1 %</translation>
+ </message>
+</context>
+<context>
+ <name>qdesigner_internal::ZoomablePreviewDeviceSkin</name>
+ <message>
+ <location filename="../tools/designer/src/lib/shared/previewmanager.cpp" line="-270"/>
+ <source>&amp;Zoom</source>
+ <translation>Мас&amp;штаб</translation>
+ </message>
+</context>
+</TS>
diff --git a/translations/linguist_pl.ts b/translations/linguist_pl.ts
index bcc46e5..b59ebc3 100644
--- a/translations/linguist_pl.ts
+++ b/translations/linguist_pl.ts
@@ -2,14 +2,6 @@
<!DOCTYPE TS>
<TS version="2.0" language="pl">
<context>
- <name></name>
- <message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+59"/>
- <source>(New Entry)</source>
- <translation>(Nowe wyrażenie)</translation>
- </message>
-</context>
-<context>
<name>AboutDialog</name>
<message>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1357"/>
@@ -61,7 +53,7 @@
<message>
<location/>
<source>Set translated entries to finished</source>
- <translation>Ustaw przetłumaczone wpisy jako zrobione</translation>
+ <translation>Ustaw przetłumaczone wpisy jako ukończone</translation>
</message>
<message>
<location/>
@@ -70,11 +62,6 @@
</message>
<message>
<location/>
- <source>Note that the modified entries will be reset to unfinished if &apos;Set translated entries to finished&apos; above is unchecked.</source>
- <translation>Zwróć uwagę że wpisy zmodyfikowane będą ustawione jako nieukończone jeśli znajdujące się powyżej &apos;Ustaw przetłumaczone wpisy jako ukończone&apos; nie jest zaznaczone.</translation>
- </message>
- <message>
- <location/>
<source>Translate also finished entries</source>
<translation>Przetłumacz również ukończone wpisy</translation>
</message>
@@ -95,11 +82,6 @@
</message>
<message>
<location/>
- <source>The batch translator will search through the selected phrase books in the order given above.</source>
- <translation>Automatyczny tłumacz będzie przeszukiwał wybrane książki wyrażeń w porządku ustalonym powyżej.</translation>
- </message>
- <message>
- <location/>
<source>&amp;Run</source>
<translation>&amp;Uruchom</translation>
</message>
@@ -108,6 +90,16 @@
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
+ <message>
+ <location/>
+ <source>Note that the modified entries will be reset to unfinished if &apos;Set translated entries to finished&apos; above is unchecked</source>
+ <translation>Zwróć uwagę że zmodyfikowane wpisy będą ustawione jako nieukończone jeśli znajdujące się powyżej &apos;Ustaw przetłumaczone wpisy jako ukończone&apos; nie jest zaznaczone</translation>
+ </message>
+ <message>
+ <location/>
+ <source>The batch translator will search through the selected phrase books in the order given above</source>
+ <translation>Automatyczny tłumacz będzie przeszukiwał wybrane książki wyrażeń w porządku ustalonym powyżej</translation>
+ </message>
</context>
<context>
<name>DataModel</name>
@@ -135,7 +127,8 @@
<location line="+70"/>
<source>Linguist does not know the plural rules for &apos;%1&apos;.
Will assume a single universal form.</source>
- <translation type="unfinished"></translation>
+ <translation>Linguist nie zna reguł liczby mnogiej dla &quot;%1&quot;.
+Przyjmie on uniwersalną formę liczby pojedynczej.</translation>
</message>
<message>
<location line="+56"/>
@@ -145,7 +138,7 @@ Will assume a single universal form.</source>
<message>
<location line="+56"/>
<source>Universal Form</source>
- <translation type="unfinished"></translation>
+ <translation>Forma uniwersalna</translation>
</message>
</context>
<context>
@@ -286,9 +279,58 @@ Will assume a single universal form.</source>
</message>
</context>
<context>
+ <name>FormMultiWidget</name>
+ <message>
+ <location filename="../tools/linguist/linguist/messageeditorwidgets.cpp" line="+296"/>
+ <source>Alt+Delete</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation>Alt+Delete</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Shift+Alt+Insert</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation>Shift+Alt+Insert</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Alt+Insert</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation>Alt+Insert</translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Confirmation - Qt Linguist</source>
+ <translation>Potwierdzenie - Qt Linguist</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Delete non-empty length variant?</source>
+ <translation>Skasować niepusty wariant?</translation>
+ </message>
+</context>
+<context>
<name>LRelease</name>
<message numerus="yes">
- <location filename="../tools/linguist/shared/qm.cpp" line="+715"/>
+ <location filename="../tools/linguist/shared/qm.cpp" line="+747"/>
+ <source>Dropped %n message(s) which had no ID.</source>
+ <translation>
+ <numerusform>Opuszczono %n wyrażenie które nie miało identyfikatora.</numerusform>
+ <numerusform>Opuszczono %n wyrażenia które nie miały identyfikatorów.</numerusform>
+ <numerusform>Opuszczono %n wyrażeń które nie miały identyfikatorów.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+4"/>
+ <source>Excess context/disambiguation dropped from %n message(s).</source>
+ <translation>
+ <numerusform>Opuszczono nadmiarowy kontekst / ujednoznacznienie w %n wyrażeniu.</numerusform>
+ <numerusform>Opuszczono nadmiarowe konteksty / ujednoznacznienia w %n wyrażeniach.</numerusform>
+ <numerusform>Opuszczono nadmiarowe konteksty / ujednoznacznienia w %n wyrażeniach.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+8"/>
<source> Generated %n translation(s) (%1 finished and %2 unfinished)
</source>
<translation>
@@ -383,11 +425,6 @@ Will assume a single universal form.</source>
</message>
<message>
<location/>
- <source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the .ts file.</source>
- <translation>Utwórz binarny plik &quot;.qm&quot; z tłumaczeniami na podstawie bieżącego tłumaczenia, gotowy do użycia w aplikacjach. Nazwa pliku będzie automatycznie określona na podstawie nazwy pliku &quot;.ts&quot; z bieżącym tłumaczeniem.</translation>
- </message>
- <message>
- <location/>
<source>Ctrl+A</source>
<translation>Ctrl+A</translation>
</message>
@@ -417,10 +454,6 @@ Will assume a single universal form.</source>
<translation>Ctrl+K</translation>
</message>
<message>
- <source>Ctrl+L</source>
- <translation type="obsolete">Ctrl+L</translation>
- </message>
- <message>
<location/>
<source>Ctrl+N</source>
<translation>Ctrl+N</translation>
@@ -461,10 +494,6 @@ Will assume a single universal form.</source>
<translation>Ctrl+Shift+K</translation>
</message>
<message>
- <source>Ctrl+Shift+L</source>
- <translation type="obsolete">Ctrl+Shift+L</translation>
- </message>
- <message>
<location/>
<source>Ctrl+V</source>
<translation>Ctrl+V</translation>
@@ -510,13 +539,13 @@ Will assume a single universal form.</source>
<translation>&amp;Edycja</translation>
</message>
<message>
+ <location/>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="+742"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Edit</source>
<translation>Edycja</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>&amp;Edit Phrase Book</source>
<translation>&amp;Redaguj książkę wyrażeń</translation>
</message>
@@ -551,13 +580,13 @@ Will assume a single universal form.</source>
<translation>F5</translation>
</message>
<message>
+ <location/>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="-7"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>File</source>
<translation>Plik</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>&amp;File</source>
<translation>&amp;Plik</translation>
</message>
@@ -572,13 +601,13 @@ Will assume a single universal form.</source>
<translation>Podgląd formularzy</translation>
</message>
<message>
+ <location/>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="+26"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>&amp;Help</source>
<translation>P&amp;omoc</translation>
</message>
@@ -600,7 +629,7 @@ Will assume a single universal form.</source>
<message>
<location/>
<source>&amp;Next Unfinished</source>
- <translation>&amp;Następne niedokończone</translation>
+ <translation>&amp;Następne nieukończone</translation>
</message>
<message>
<location/>
@@ -650,7 +679,7 @@ Will assume a single universal form.</source>
<message>
<location/>
<source>&amp;Prev Unfinished</source>
- <translation>&amp;Poprzednie niedokończone</translation>
+ <translation>&amp;Poprzednie nieukończone</translation>
</message>
<message>
<location/>
@@ -673,14 +702,14 @@ Will assume a single universal form.</source>
<translation>W&amp;ydaj</translation>
</message>
<message>
- <location line="-13"/>
- <location line="+10"/>
<location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-13"/>
+ <location line="+10"/>
<source>Release As...</source>
<translation>Wydaj jako...</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>Replace the translation on all entries that matches the search source text.</source>
<translation>Zamienia tłumaczenia we wszystkich pasujących do wzorca wpisach.</translation>
</message>
@@ -691,7 +720,7 @@ Will assume a single universal form.</source>
<translation></translation>
</message>
<message>
- <location line="+195"/>
+ <location line="+188"/>
<source>Source text</source>
<translation>Tekst źródłowy</translation>
</message>
@@ -703,17 +732,17 @@ Will assume a single universal form.</source>
</message>
<message>
<location line="-2"/>
- <location line="+61"/>
+ <location line="+62"/>
<source>Context</source>
<translation>Kontekst</translation>
</message>
<message>
- <location line="-60"/>
+ <location line="-61"/>
<source>Items</source>
<translation>Elementy</translation>
</message>
<message>
- <location line="+77"/>
+ <location line="+78"/>
<source>This panel lists the source contexts.</source>
<translation>Ten panel pokazuje listę kontekstów.</translation>
</message>
@@ -744,7 +773,7 @@ Will assume a single universal form.</source>
<translation> MOD </translation>
</message>
<message>
- <location line="+125"/>
+ <location line="+130"/>
<source>Loading...</source>
<translation>Ładowanie...</translation>
</message>
@@ -798,14 +827,19 @@ Czy chcesz pominąć pierwszy plik?</translation>
<translation>Plik zachowany.</translation>
</message>
<message>
- <location line="+15"/>
- <location line="+1164"/>
+ <location line="+526"/>
+ <source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-511"/>
+ <location line="+1165"/>
<source>Release</source>
<translation>Wydaj</translation>
</message>
<message>
- <location line="-1163"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1164"/>
<source>Qt message files for released applications (*.qm)
All files (*)</source>
<translation>Pliki z wydanymi tłumaczeniami (*.qm)
@@ -818,7 +852,7 @@ Wszystkie pliki (*)</translation>
<translation>Plik utworzony.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="+34"/>
<location line="+355"/>
<source>Printing...</source>
<translation>Drukowanie...</translation>
@@ -869,7 +903,7 @@ Wszystkie pliki (*)</translation>
<message>
<location line="+17"/>
<location line="+278"/>
- <location line="+40"/>
+ <location line="+34"/>
<location line="+24"/>
<location line="+22"/>
<location line="+516"/>
@@ -881,7 +915,7 @@ Wszystkie pliki (*)</translation>
<translation>Qt Linguist</translation>
</message>
<message>
- <location line="-1204"/>
+ <location line="-1198"/>
<location line="+102"/>
<source>Cannot find the string &apos;%1&apos;.</source>
<translation>Nie można znaleźć tekstu &apos;%1&apos;.</translation>
@@ -892,37 +926,25 @@ Wszystkie pliki (*)</translation>
<translation>Wyszukiwanie i tłumaczenie w &apos;%1&apos; - Qt Linguist</translation>
</message>
<message>
- <source>Translate</source>
- <translation type="obsolete">Przetłumacz</translation>
- </message>
- <message numerus="yes">
- <source>Translated %n entries to &apos;%1&apos;</source>
- <translation type="obsolete">
- <numerusform>Przetłumaczono %n wpis na &apos;%1&apos;</numerusform>
- <numerusform>Przetłumaczono %n wpisy na &apos;%1&apos;</numerusform>
- <numerusform>Przetłumaczono %n wpisów na &apos;%1&apos;</numerusform>
- </translation>
- </message>
- <message>
<location line="+34"/>
<location line="+23"/>
<location line="+24"/>
<source>Translate - Qt Linguist</source>
- <translation type="unfinished"></translation>
+ <translation>Tłumaczenie - Qt Linguist</translation>
</message>
<message numerus="yes">
<location line="-46"/>
<source>Translated %n entry(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>Przetłumaczono %n wpis</numerusform>
+ <numerusform>Przetłumaczono %n wpisy</numerusform>
+ <numerusform>Przetłumaczono %n wpisów</numerusform>
</translation>
</message>
<message>
<location line="+23"/>
<source>No more occurrences of &apos;%1&apos;. Start over?</source>
- <translation type="unfinished"></translation>
+ <translation>Brak więcej &quot;%1&quot;. Rozpocząć od nowa?</translation>
</message>
<message>
<location line="+30"/>
@@ -993,23 +1015,6 @@ Wszystkie pliki (*)</translation>
<translation>Wersja %1</translation>
</message>
<message>
- <source> Open Source Edition</source>
- <translation type="obsolete"> Wydanie Open Source</translation>
- </message>
- <message>
- <source>This version of Qt Linguist is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development.&lt;br/&gt;&lt;br/&gt;You need a commercial Qt license for development of proprietary (closed source) applications. Please see &lt;tt&gt;http://qt.nokia.com/company/model.html&lt;/tt&gt; for an overview of Qt licensing.</source>
- <translation type="obsolete">Ta wersja Qt Linguist jest częścią wydania Qt Open Source, przeznaczonego do tworzenia aplikacji Open Source. Qt zawiera obszerny zestaw bibliotek wykorzystywanych do pisania przenośnych aplikacji.&lt;br/&gt;&lt;br/&gt;Aby móc tworzyć przy pomocy Qt własne aplikacje bez publikowania kodu (closed source) potrzebujesz wydania komercyjnego. Opis sposobów licencjonowania Qt znajduje się na stronie &lt;a href=&quot;http://qt.nokia.com/company/model.html&quot;&gt;qt.nokia.com/company/model.html&lt;/a&gt;.</translation>
- </message>
- <message>
- <source>This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution.</source>
- <translation type="obsolete">Ten program wydany jest na licencji Qt Commercial. Aby sprawdzić szczegóły licencji, proszę sprawdzić plik LICENSE, który dołączany jest do pakietu Qt.</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location line="+41"/>
<source>Do you want to save the modified files?</source>
<translation>Czy chcesz zachować zmodyfikowane pliki?</translation>
@@ -1092,14 +1097,14 @@ Wszystkie pliki (*)</translation>
<translation>&amp;Zachowaj</translation>
</message>
<message>
- <location line="-14"/>
- <location line="+11"/>
<location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-14"/>
+ <location line="+11"/>
<source>Save &amp;As...</source>
<translation>Zachowaj j&amp;ako...</translation>
</message>
<message>
- <location line="-8"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-8"/>
<location line="+13"/>
<source>&amp;Close</source>
<translation>Za&amp;mknij</translation>
@@ -1110,13 +1115,13 @@ Wszystkie pliki (*)</translation>
<translation>Zachowaj wszystko</translation>
</message>
<message>
- <location line="+1"/>
<location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>&amp;Release All</source>
<translation>Wydaj &amp;wszystko</translation>
</message>
<message>
- <location line="+1"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>Close All</source>
<translation>Zamknij wszystko</translation>
</message>
@@ -1171,7 +1176,7 @@ Wszystkie pliki (*)</translation>
<translation>Czy chcesz zachować książke wyrażeń &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+314"/>
+ <location line="+323"/>
<source>All</source>
<translation>Wszystko</translation>
</message>
@@ -1227,11 +1232,6 @@ Wszystkie pliki (*)</translation>
</message>
<message>
<location/>
- <source>Toggle checking that phrase suggestions are used.</source>
- <translation>Przełącz sprawdzanie czy użyto zasugerowanego wyrażenia.</translation>
- </message>
- <message>
- <location/>
<source>&amp;Toolbars</source>
<translation>Paski &amp;narzędzi</translation>
</message>
@@ -1241,24 +1241,24 @@ Wszystkie pliki (*)</translation>
<translation>&amp;Tłumaczenie</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-461"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-470"/>
<source>Translation</source>
<translation>Tłumaczenie</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>&amp;Undo</source>
<translation>&amp;Cofnij</translation>
</message>
<message>
+ <location/>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>Validation</source>
<translation>Walidacja</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>V&amp;alidation</source>
<translation>W&amp;alidacja</translation>
</message>
@@ -1328,19 +1328,19 @@ Wszystkie pliki (*)</translation>
<translation>Wy&amp;szukiwanie i tłumaczenie...</translation>
</message>
<message>
+ <location/>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="-71"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
<source>&amp;Batch Translation...</source>
<translation>Automatyczne &amp;tłumaczenie...</translation>
</message>
<message>
- <location line="-1"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1"/>
<source>Translation File &amp;Settings...</source>
<translation>&amp;Ustawienia pliku z tłumaczeniami...</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui"/>
+ <location/>
<source>&amp;Add to Phrase Book</source>
<translation>Dod&amp;aj do książki wyrażeń</translation>
</message>
@@ -1351,11 +1351,6 @@ Wszystkie pliki (*)</translation>
</message>
<message>
<location/>
- <source>Previous unfinished item.</source>
- <translation>Poprzedni niedokończony element.</translation>
- </message>
- <message>
- <location/>
<source>Recently Opened &amp;Files</source>
<translation>Os&amp;tatnio otwierane pliki</translation>
</message>
@@ -1377,22 +1372,12 @@ Wszystkie pliki (*)</translation>
<message>
<location/>
<source>Move to the previous unfinished item.</source>
- <translation>Przechodzi do poprzedniego niedokończonego elementu.</translation>
- </message>
- <message>
- <location/>
- <source>Next unfinished item.</source>
- <translation>Następny niedokończony element.</translation>
+ <translation>Przechodzi do poprzedniego nieukończonego elementu.</translation>
</message>
<message>
<location/>
<source>Move to the next unfinished item.</source>
- <translation>Przechodzi do następnego niedokończonego elementu.</translation>
- </message>
- <message>
- <location/>
- <source>Move to previous item.</source>
- <translation>Przejdź do poprzedniego elementu.</translation>
+ <translation>Przechodzi do następnego nieukończonego elementu.</translation>
</message>
<message>
<location/>
@@ -1401,23 +1386,13 @@ Wszystkie pliki (*)</translation>
</message>
<message>
<location/>
- <source>Next item.</source>
- <translation>Następny element.</translation>
- </message>
- <message>
- <location/>
<source>Move to the next item.</source>
<translation>Przejdź do następnego elementu.</translation>
</message>
<message>
<location/>
- <source>Mark item as done and move to the next unfinished item.</source>
- <translation>Oznacz element jako dokończony i przejdź do następnego niedokończonego elementu.</translation>
- </message>
- <message>
- <location/>
<source>Mark this item as done and move to the next unfinished item.</source>
- <translation>Oznacz ten element jako dokończony i przejdź do następnego niedokończonego elementu.</translation>
+ <translation>Oznacz ten element jako ukończony i przejdź do następnego nieukończonego elementu.</translation>
</message>
<message>
<location/>
@@ -1426,21 +1401,11 @@ Wszystkie pliki (*)</translation>
</message>
<message>
<location/>
- <source>Toggle the validity check of accelerators.</source>
- <translation>Przełącz sprawdzanie zgodności klawiszy skrótów.</translation>
- </message>
- <message>
- <location/>
<source>Toggle the validity check of accelerators, i.e. whether the number of ampersands in the source and translation text is the same. If the check fails, a message is shown in the warnings window.</source>
<translation>Przełącz sprawdzanie zgodności klawiszy skrótów, tzn. czy liczba znaków: &amp; w tekście źródłowym i w tłumaczeniu jest taka sama. W przypadku niezgodności pojawia się komunikat w oknie z ostrzeżeniami.</translation>
</message>
<message>
<location/>
- <source>Toggle the validity check of ending punctuation.</source>
- <translation>Przełącz sprawdzanie zgodności końcowych znaków interpunkcyjnych.</translation>
- </message>
- <message>
- <location/>
<source>Close</source>
<translation>Zamknij</translation>
</message>
@@ -1461,59 +1426,125 @@ Wszystkie pliki (*)</translation>
</message>
<message>
<location/>
- <source>Toggle the validity check of place markers.</source>
- <translation>Przełącz sprawdzanie zgodności znaczników.</translation>
- </message>
- <message>
- <location/>
<source>Toggle the validity check of place markers, i.e. whether %1, %2, ... are used consistently in the source text and translation text. If the check fails, a message is shown in the warnings window.</source>
<translation>Przełącz sprawdzanie zgodności znaczników, tzn. czy: %1, %2, ... są spójnie użyte w tekście źródłowym i tłumaczeniu. W przypadku niezgodności pojawia się komunikat w oknie z ostrzeżeniami.</translation>
</message>
<message>
<location/>
<source>Ctrl+J</source>
- <translation type="unfinished"></translation>
+ <translation>Ctrl+J</translation>
</message>
<message>
<location/>
<source>Ctrl+Shift+J</source>
- <translation type="unfinished"></translation>
+ <translation>Ctrl+Shift+J</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Previous unfinished item</source>
+ <translation>Poprzedni nieukończony element</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Next unfinished item</source>
+ <translation>Następny nieukończony element</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Move to previous item</source>
+ <translation>Przejdź do poprzedniego elementu</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Next item</source>
+ <translation>Następny element</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Mark item as done and move to the next unfinished item</source>
+ <translation>Oznacz element jako ukończony i przejdź do następnego nieukończonego elementu</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Copies the source text into the translation field</source>
+ <translation>Kopiuje tekst źródłowy do pola z tłumaczeniem</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Toggle the validity check of accelerators</source>
+ <translation>Przełącz sprawdzanie zgodności klawiszy skrótów</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Toggle the validity check of ending punctuation</source>
+ <translation>Przełącz sprawdzanie zgodności końcowych znaków interpunkcyjnych</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Toggle checking that phrase suggestions are used</source>
+ <translation>Przełącz sprawdzanie czy użyto zasugerowanego wyrażenia</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Toggle the validity check of place markers</source>
+ <translation>Przełącz sprawdzanie zgodności znaczników</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the TS file.</source>
+ <translation>Utwórz binarny plik &quot;.qm&quot; z tłumaczeniami na podstawie bieżącego tłumaczenia, gotowy do użycia w aplikacjach. Nazwa pliku będzie automatycznie określona na podstawie nazwy pliku &quot;.ts&quot; z bieżącym tłumaczeniem.</translation>
+ </message>
+ <message>
+ <location/>
+ <source>Length Variants</source>
+ <translation>Warianty tłumaczeń</translation>
</message>
</context>
<context>
<name>MessageEditor</name>
<message>
- <location filename="../tools/linguist/linguist/messageeditor.cpp" line="+72"/>
+ <location filename="../tools/linguist/linguist/messageeditor.cpp" line="+42"/>
+ <source></source>
+ <comment>This is the right panel of the main window.</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Russian</source>
+ <translation>rosyjski</translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>German</source>
- <translation>Niemieckie</translation>
+ <translation>niemiecki</translation>
</message>
<message>
<location line="+1"/>
<source>Japanese</source>
- <translation>Japońskie</translation>
+ <translation>japoński</translation>
</message>
<message>
<location line="+1"/>
<source>French</source>
- <translation>Francuskie</translation>
+ <translation>francuski</translation>
</message>
<message>
<location line="+1"/>
<source>Polish</source>
- <translation>Polskie</translation>
+ <translation>polski</translation>
</message>
<message>
<location line="+1"/>
<source>Chinese</source>
- <translation>Chińskie</translation>
+ <translation>chiński</translation>
</message>
<message>
- <location line="+50"/>
+ <location line="+53"/>
<source>This whole panel allows you to view and edit the translation of some source text.</source>
<translation>Ten panel pozwala na podgląd i redagowanie tłumaczenia tekstu źródłowego.</translation>
</message>
<message>
- <location line="+25"/>
+ <location line="+18"/>
<source>Source text</source>
<translation>Tekst źródłowy</translation>
</message>
@@ -1523,7 +1554,7 @@ Wszystkie pliki (*)</translation>
<translation>W tym obszarze wyświetlany jest tekst źródłowy.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Source text (Plural)</source>
<translation>Tekst źródłowy (liczba mnoga)</translation>
</message>
@@ -1533,7 +1564,7 @@ Wszystkie pliki (*)</translation>
<translation>W tym obszarze wyświetlana jest forma mnoga źródłowego tekstu.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Developer comments</source>
<translation>Komentarze programisty</translation>
</message>
@@ -1548,19 +1579,19 @@ Wszystkie pliki (*)</translation>
<translation>Tutaj można wprowadzić komentarze na własny użytek. One nie mają wpływu na przetłumaczoną aplikację.</translation>
</message>
<message>
- <location line="+205"/>
+ <location line="+232"/>
<source>%1 translation (%2)</source>
- <translation>%1 tłumaczenie (%2)</translation>
+ <translation>Tłumaczenie na język %1 (%2)</translation>
</message>
<message>
- <location line="+19"/>
+ <location line="+9"/>
<source>This is where you can enter or modify the translation of the above source text.</source>
<translation>Tutaj można wprowadzić lub zmodyfikować tłumaczenie tekstu źródłowego.</translation>
</message>
<message>
<location line="+5"/>
<source>%1 translation</source>
- <translation>%1 tłumaczenie</translation>
+ <translation>Tłumaczenie na język %1</translation>
</message>
<message>
<location line="+1"/>
@@ -1568,7 +1599,7 @@ Wszystkie pliki (*)</translation>
<translation>Komentarze tłumacza (język %1).</translation>
</message>
<message>
- <location line="+138"/>
+ <location line="+157"/>
<source>&apos;%1&apos;
Line: %2</source>
<translation>&apos;%1&apos;
@@ -1601,7 +1632,7 @@ Linia: %2</translation>
<context>
<name>MsgEdit</name>
<message>
- <location filename="../tools/linguist/linguist/messageeditor.cpp" line="-577"/>
+ <location filename="../tools/linguist/linguist/messageeditor.cpp" line="-612"/>
<source></source>
<comment>This is the right panel of the main window.</comment>
<translation></translation>
@@ -1610,7 +1641,12 @@ Linia: %2</translation>
<context>
<name>PhraseBookBox</name>
<message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+8"/>
+ <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+66"/>
+ <source>(New Entry)</source>
+ <translation>(Nowe wyrażenie)</translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>%1[*] - Qt Linguist</source>
<translation>%1[*] - Qt Linguist</translation>
</message>
@@ -1710,7 +1746,7 @@ Linia: %2</translation>
<translation>&amp;Tłumaczenie:</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="-143"/>
+ <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="-145"/>
<source></source>
<comment>Go to Phrase &gt; Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment>
<translation></translation>
@@ -1737,7 +1773,7 @@ Linia: %2</translation>
<context>
<name>PhraseView</name>
<message>
- <location filename="../tools/linguist/linguist/phraseview.cpp" line="+121"/>
+ <location filename="../tools/linguist/linguist/phraseview.cpp" line="+122"/>
<source>Insert</source>
<translation>Wstaw</translation>
</message>
@@ -1765,7 +1801,7 @@ Linia: %2</translation>
<translation>Skompilowane tłumaczenia Qt</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1279"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1280"/>
<source>Translation files (%1);;</source>
<translation>Pliki z tłumaczeniami (%1);;</translation>
</message>
@@ -1786,63 +1822,34 @@ Linia: %2</translation>
<translation>Qt Linguist</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/cpp.cpp" line="+1072"/>
- <source>C++ source files</source>
- <translation>Pliki źródłowe C++</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/java.cpp" line="+646"/>
- <source>Java source files</source>
- <translation>Pliki źródłowe Java</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/po.cpp" line="+651"/>
+ <location filename="../tools/linguist/shared/po.cpp" line="+658"/>
<source>GNU Gettext localization files</source>
<translation>Pliki GNU Gettext</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/qscript.cpp" line="+2399"/>
- <source>Qt Script source files</source>
- <translation>Pliki źródłowe Qt Script</translation>
- </message>
- <message>
<location filename="../tools/linguist/shared/ts.cpp" line="+752"/>
<source>Qt translation sources (format 1.1)</source>
- <translation>Źródła tlumaczeń Qt (format 1.1)</translation>
+ <translation>Źródła tłumaczeń Qt (format 1.1)</translation>
</message>
<message>
<location line="+8"/>
<source>Qt translation sources (format 2.0)</source>
- <translation>Źródła tlumaczeń Qt (format 2.0)</translation>
+ <translation>Źródła tłumaczeń Qt (format 2.0)</translation>
</message>
<message>
<location line="+9"/>
<source>Qt translation sources (latest format)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Qt translation sources</source>
- <translation type="obsolete">Źródła tlumaczeń Qt</translation>
+ <translation>Źródła tłumaczeń Qt (najnowszy format)</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/ui.cpp" line="+213"/>
- <source>Qt Designer form files</source>
- <translation>Pliki z formularzami Qt Designer</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Qt Jambi form files</source>
- <translation>Pliki z formularzami Qt Jambi</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/xliff.cpp" line="+817"/>
+ <location filename="../tools/linguist/shared/xliff.cpp" line="+827"/>
<source>XLIFF localization files</source>
<translation>Pliki XLIFF</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/qph.cpp" line="+192"/>
+ <location filename="../tools/linguist/shared/qph.cpp" line="+183"/>
<source>Qt Linguist &apos;Phrase Book&apos;</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Linguist &quot;Książka wyrażeń&quot;</translation>
</message>
</context>
<context>
diff --git a/translations/linguist_ru.ts b/translations/linguist_ru.ts
index 86c7434..eb0ec94 100644
--- a/translations/linguist_ru.ts
+++ b/translations/linguist_ru.ts
@@ -2,14 +2,6 @@
<!DOCTYPE TS>
<TS version="2.0" language="ru">
<context>
- <name></name>
- <message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+59"/>
- <source>(New Entry)</source>
- <translation>(Новая запись)</translation>
- </message>
-</context>
-<context>
<name>AboutDialog</name>
<message>
<location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1357"/>
@@ -40,12 +32,7 @@
<translation>Переводить записи, уже имеющие перевод</translation>
</message>
<message>
- <location line="+7"/>
- <source>Note that the modified entries will be reset to unfinished if &apos;Set translated entries to finished&apos; above is unchecked.</source>
- <translation>Имейте в виду, что изменённые записи будут отмечены как незавершённые, если не включён параметр &quot;Помечать переведенные записи как завершённые&quot;.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+10"/>
<source>Translate also finished entries</source>
<translation>Также переводить записи с завершёнными переводами</translation>
</message>
@@ -65,12 +52,7 @@
<translation>Опустить</translation>
</message>
<message>
- <location line="+24"/>
- <source>The batch translator will search through the selected phrase books in the order given above.</source>
- <translation>Пакетный переводчик будет искать в выбранных разговорниках в указанном выше порядке.</translation>
- </message>
- <message>
- <location line="+34"/>
+ <location line="+58"/>
<source>&amp;Run</source>
<translation>&amp;Выполнить</translation>
</message>
@@ -87,12 +69,12 @@
<message>
<location line="+37"/>
<source>Searching, please wait...</source>
- <translation>Идёт поиск, ждите...</translation>
+ <translation>Идёт поиск, ожидайте...</translation>
</message>
<message>
<location line="+0"/>
<source>&amp;Cancel</source>
- <translation>&amp;Отмена</translation>
+ <translation>От&amp;мена</translation>
</message>
<message>
<location line="+42"/>
@@ -108,6 +90,16 @@
<numerusform>Автоматически переведено %n записей</numerusform>
</translation>
</message>
+ <message>
+ <location filename="../tools/linguist/linguist/batchtranslation.ui" line="-126"/>
+ <source>Note that the modified entries will be reset to unfinished if &apos;Set translated entries to finished&apos; above is unchecked</source>
+ <translation>Имейте в виду, что изменённые записи будут отмечены как незавершённые, если не включен параметр &quot;Помечать переведенные записи как завершённые&quot;</translation>
+ </message>
+ <message>
+ <location line="+85"/>
+ <source>The batch translator will search through the selected phrase books in the order given above</source>
+ <translation>Пакетный переводчик будет искать в выбранных разговорниках в указанном выше порядке</translation>
+ </message>
</context>
<context>
<name>DataModel</name>
@@ -287,9 +279,54 @@ Will assume a single universal form.</source>
</message>
</context>
<context>
+ <name>FormMultiWidget</name>
+ <message>
+ <location filename="../tools/linguist/linguist/messageeditorwidgets.cpp" line="+296"/>
+ <source>Alt+Delete</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Shift+Alt+Insert</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Alt+Insert</source>
+ <extracomment>translate, but don&apos;t change</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Confirmation - Qt Linguist</source>
+ <translation>Подтверждение - Qt Linguist</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Delete non-empty length variant?</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>LRelease</name>
<message numerus="yes">
- <location filename="../tools/linguist/shared/qm.cpp" line="+732"/>
+ <location filename="../tools/linguist/shared/qm.cpp" line="+747"/>
+ <source>Dropped %n message(s) which had no ID.</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+4"/>
+ <source>Excess context/disambiguation dropped from %n message(s).</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+8"/>
<source> Generated %n translation(s) (%1 finished and %2 unfinished)
</source>
<translation>
@@ -325,7 +362,7 @@ Will assume a single universal form.</source>
<translation></translation>
</message>
<message>
- <location line="+165"/>
+ <location line="+158"/>
<source>Source text</source>
<translation>Исходный текст</translation>
</message>
@@ -337,17 +374,17 @@ Will assume a single universal form.</source>
</message>
<message>
<location line="-2"/>
- <location line="+61"/>
+ <location line="+62"/>
<source>Context</source>
<translation>Контекст</translation>
</message>
<message>
- <location line="-60"/>
+ <location line="-61"/>
<source>Items</source>
<translation>Записи</translation>
</message>
<message>
- <location line="+77"/>
+ <location line="+78"/>
<source>This panel lists the source contexts.</source>
<translation>В данной панели перечислены исходные контексты.</translation>
</message>
@@ -378,7 +415,7 @@ Will assume a single universal form.</source>
<translation> ИЗМ </translation>
</message>
<message>
- <location line="+125"/>
+ <location line="+130"/>
<source>Loading...</source>
<translation>Загрузка...</translation>
</message>
@@ -432,14 +469,14 @@ Skip loading the first named file?</source>
<translation>Файл сохранён.</translation>
</message>
<message>
- <location line="+15"/>
- <location line="+1164"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+246"/>
+ <location filename="../tools/linguist/linguist/mainwindow.ui" line="+247"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+15"/>
+ <location line="+1165"/>
<source>Release</source>
- <translation>Компиляция</translation>
+ <translation>Скомпилировать</translation>
</message>
<message>
- <location line="-1163"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1164"/>
<source>Qt message files for released applications (*.qm)
All files (*)</source>
<translation>Скомпилированные файлы перевода для приложений Qt (*.qm)
@@ -452,7 +489,7 @@ All files (*)</source>
<translation>Файл создан.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="+34"/>
<location line="+355"/>
<source>Printing...</source>
<translation>Печать...</translation>
@@ -503,7 +540,7 @@ All files (*)</source>
<message>
<location line="+17"/>
<location line="+278"/>
- <location line="+40"/>
+ <location line="+34"/>
<location line="+24"/>
<location line="+22"/>
<location line="+516"/>
@@ -515,7 +552,7 @@ All files (*)</source>
<translation>Qt Linguist</translation>
</message>
<message>
- <location line="-1204"/>
+ <location line="-1198"/>
<location line="+102"/>
<source>Cannot find the string &apos;%1&apos;.</source>
<translation>Не удалось найти строку &apos;%1&apos;.</translation>
@@ -615,12 +652,12 @@ All files (*)</source>
<translation>Версия %1</translation>
</message>
<message>
- <location line="+6"/>
- <source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;%2&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
- <translation type="unfinished"></translation>
+ <location line="+3"/>
+ <source>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist is a tool for adding translations to Qt applications.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
+ <translation>&lt;center&gt;&lt;img src=&quot;:/images/splash.png&quot;/&gt;&lt;/img&gt;&lt;p&gt;%1&lt;/p&gt;&lt;/center&gt;&lt;p&gt;Qt Linguist - инструмент для добавления переводов в приложения на основе Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Корпорация Nokia и/или её дочерние подразделения.</translation>
</message>
<message>
- <location line="+41"/>
+ <location line="+38"/>
<source>Do you want to save the modified files?</source>
<translation>Желаете сохранить изменённые файлы?</translation>
</message>
@@ -702,22 +739,22 @@ All files (*)</source>
<translation>&amp;Сохранить</translation>
</message>
<message>
- <location line="-14"/>
- <location line="+11"/>
<location filename="../tools/linguist/linguist/mainwindow.ui" line="-11"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-14"/>
+ <location line="+11"/>
<source>Save &amp;As...</source>
<translation>Сохранить &amp;как...</translation>
</message>
<message>
- <location line="-9"/>
- <location line="+10"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+508"/>
+ <location line="+508"/>
<location line="+3"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-9"/>
+ <location line="+10"/>
<source>Release As...</source>
<translation>Скомпилировать как...</translation>
</message>
<message>
- <location line="-9"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-9"/>
<location line="+13"/>
<source>&amp;Close</source>
<translation>&amp;Закрыть</translation>
@@ -728,13 +765,13 @@ All files (*)</source>
<translation>Сохранить все</translation>
</message>
<message>
- <location line="+1"/>
<location filename="../tools/linguist/linguist/mainwindow.ui" line="+118"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>&amp;Release All</source>
<translation>С&amp;компилировать все</translation>
</message>
<message>
- <location line="+1"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>Close All</source>
<translation>Закрыть все</translation>
</message>
@@ -759,54 +796,54 @@ All files (*)</source>
<translation>&amp;Найти и перевести в &apos;%1&apos;...</translation>
</message>
<message>
- <location line="+2"/>
<location filename="../tools/linguist/linguist/mainwindow.ui" line="-32"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+2"/>
<source>Translation File &amp;Settings...</source>
<translation>&amp;Параметры файла перевода...</translation>
</message>
<message>
- <location line="+1"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="-100"/>
+ <location line="-100"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>&amp;Batch Translation...</source>
<translation>Пак&amp;етный перевод...</translation>
</message>
<message>
- <location line="+1"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+1"/>
<source>Search And &amp;Translate...</source>
<translation>&amp;Найти и перевести...</translation>
</message>
<message>
- <location line="+51"/>
<location filename="../tools/linguist/linguist/mainwindow.ui" line="+28"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+51"/>
<source>File</source>
<translation>Файл</translation>
</message>
<message>
- <location line="+7"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+11"/>
+ <location line="+11"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/>
<source>Edit</source>
<translation>Правка</translation>
</message>
<message>
- <location line="+6"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+11"/>
+ <location line="+11"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/>
<source>Translation</source>
<translation>Перевод</translation>
</message>
<message>
- <location line="+6"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+11"/>
+ <location line="+11"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+6"/>
<source>Validation</source>
<translation>Проверка</translation>
</message>
<message>
- <location line="+7"/>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="+11"/>
+ <location line="+11"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+7"/>
<source>Help</source>
<translation>Справка</translation>
</message>
<message>
- <location line="+84"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="+84"/>
<source>Cannot read from phrase book &apos;%1&apos;.</source>
<translation>Не удалось прочитать из разговорника &apos;%1&apos;.</translation>
</message>
@@ -836,12 +873,12 @@ All files (*)</source>
<translation>Желаете сохранить разговорник &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+314"/>
+ <location line="+323"/>
<source>All</source>
<translation>Все</translation>
</message>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.ui" line="-750"/>
+ <location filename="../tools/linguist/linguist/mainwindow.ui" line="-751"/>
<source>MainWindow</source>
<translation>Главное окно</translation>
</message>
@@ -886,7 +923,7 @@ All files (*)</source>
<translation>Пан&amp;ели инструментов</translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+13"/>
<source>&amp;Help</source>
<translation>&amp;Справка</translation>
</message>
@@ -1103,15 +1140,20 @@ All files (*)</source>
<message>
<location line="+8"/>
<source>&amp;Prev Unfinished</source>
- <translation>&amp;Пред. незавершённый</translation>
+ <translation>&amp;Предыдущий незавершённый</translation>
</message>
<message>
- <location line="+3"/>
- <source>Previous unfinished item.</source>
- <translation>Предыдущий незавершённый перевод.</translation>
+ <location line="+348"/>
+ <source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the TS file.</source>
+ <translation>Создание готового файла перевода Qt из текущего файла. Имя файла будет автоматически определено из имени .ts файла.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+136"/>
+ <source>Length Variants</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-478"/>
<source>Move to the previous unfinished item.</source>
<translation>Перейти к предыдущему незавершённому переводу.</translation>
</message>
@@ -1123,15 +1165,10 @@ All files (*)</source>
<message>
<location line="+8"/>
<source>&amp;Next Unfinished</source>
- <translation>&amp;След. незавершённый</translation>
+ <translation>&amp;Следующий незавершённый</translation>
</message>
<message>
- <location line="+3"/>
- <source>Next unfinished item.</source>
- <translation>Следующий незавершённый перевод.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Move to the next unfinished item.</source>
<translation>Перейти к следующему незавершённому переводу.</translation>
</message>
@@ -1146,12 +1183,7 @@ All files (*)</source>
<translation>Пр&amp;едыдущий</translation>
</message>
<message>
- <location line="+3"/>
- <source>Move to previous item.</source>
- <translation>Предыдущий перевод.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Move to the previous item.</source>
<translation>Перейти к предыдущему переводу.</translation>
</message>
@@ -1166,12 +1198,7 @@ All files (*)</source>
<translation>С&amp;ледующий</translation>
</message>
<message>
- <location line="+3"/>
- <source>Next item.</source>
- <translation>Следующий перевод.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Move to the next item.</source>
<translation>Перейти к следующему переводу.</translation>
</message>
@@ -1186,12 +1213,7 @@ All files (*)</source>
<translation>&amp;Готово и далее</translation>
</message>
<message>
- <location line="+3"/>
- <source>Mark item as done and move to the next unfinished item.</source>
- <translation>Пометить перевод как завершённый и перейти к следующему незавершённому.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Mark this item as done and move to the next unfinished item.</source>
<translation>Пометить перевод как завершённый и перейти к следующему незавершённому.</translation>
</message>
@@ -1202,8 +1224,7 @@ All files (*)</source>
<translation>Скопировать из исходного текста</translation>
</message>
<message>
- <location line="+3"/>
- <location line="+3"/>
+ <location line="+6"/>
<source>Copies the source text into the translation field.</source>
<translation>Скопировать исходный текст в поле перевода.</translation>
</message>
@@ -1218,12 +1239,7 @@ All files (*)</source>
<translation>&amp;Акселераторы</translation>
</message>
<message>
- <location line="+3"/>
- <source>Toggle the validity check of accelerators.</source>
- <translation>Переключение проверки акселераторов.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Toggle the validity check of accelerators, i.e. whether the number of ampersands in the source and translation text is the same. If the check fails, a message is shown in the warnings window.</source>
<translation>Переключение проверки акселераторов, т.е. совпадает ли количество амперсандов в исходном и переведённом текстах. Если выявлено несовпадение, будет показано сообщение в окне предупреждений.</translation>
</message>
@@ -1233,12 +1249,7 @@ All files (*)</source>
<translation>&amp;Знаки препинания</translation>
</message>
<message>
- <location line="+3"/>
- <source>Toggle the validity check of ending punctuation.</source>
- <translation>Переключение проверки знаков препинания в конце текста.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Toggle the validity check of ending punctuation. If the check fails, a message is shown in the warnings window.</source>
<translation>Переключение проверки знаков препинания в конце текста. Если выявлено несовпадение, будет показано сообщение в окне предупреждений.</translation>
</message>
@@ -1248,12 +1259,7 @@ All files (*)</source>
<translation>Совпадение &amp;фраз</translation>
</message>
<message>
- <location line="+3"/>
- <source>Toggle checking that phrase suggestions are used.</source>
- <translation>Переключение проверки использования предложений для фраз.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Toggle checking that phrase suggestions are used. If the check fails, a message is shown in the warnings window.</source>
<translation>Переключение проверки использования предложений для фраз. Если выявлено несовпадение, будет показано сообщение в окне предупреждений.</translation>
</message>
@@ -1263,12 +1269,7 @@ All files (*)</source>
<translation>Совпадение &amp;маркеров</translation>
</message>
<message>
- <location line="+3"/>
- <source>Toggle the validity check of place markers.</source>
- <translation>Переключение проверки маркеров форматирования.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Toggle the validity check of place markers, i.e. whether %1, %2, ... are used consistently in the source text and translation text. If the check fails, a message is shown in the warnings window.</source>
<translation>Переключение проверки маркеров форматирования, т.е. все ли маркеры (%1, %2, ...) исходного текста присутствуют в переведённом. Если выявлено несовпадение, будет показано сообщение в окне предупреждений.</translation>
</message>
@@ -1394,12 +1395,7 @@ All files (*)</source>
<translation>Перевести все записи в пакетном режиме, используя информацию из разговорника.</translation>
</message>
<message>
- <location line="+14"/>
- <source>Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the .ts file.</source>
- <translation>Создание готового файла перевода Qt из текущего файла. Имя файла будет автоматически определено из имени .ts файла.</translation>
- </message>
- <message>
- <location line="+63"/>
+ <location line="+77"/>
<source>Open/Refresh Form &amp;Preview</source>
<translation>Открыть/обновить предпрос&amp;мотр формы</translation>
</message>
@@ -1454,6 +1450,56 @@ All files (*)</source>
<source>Ctrl+W</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-473"/>
+ <source>Previous unfinished item</source>
+ <translation>Предыдущий незавершённый перевод</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Next unfinished item</source>
+ <translation>Следующий незавершённый перевод</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Move to previous item</source>
+ <translation>Перейти к предыдущему переводу</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Next item</source>
+ <translation>Следующий перевод</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Mark item as done and move to the next unfinished item</source>
+ <translation>Пометить перевод как завершённый и перейти к следующему незавершённому</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Copies the source text into the translation field</source>
+ <translation>Скопировать исходный текст в поле перевода</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Toggle the validity check of accelerators</source>
+ <translation>Переключение проверки акселераторов</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Toggle the validity check of ending punctuation</source>
+ <translation>Переключение проверки знаков препинания в конце текста</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Toggle checking that phrase suggestions are used</source>
+ <translation>Переключение проверки использования предложений для фраз</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Toggle the validity check of place markers</source>
+ <translation>Переключение проверки маркеров форматирования</translation>
+ </message>
</context>
<context>
<name>MessageEditor</name>
@@ -1495,7 +1541,7 @@ All files (*)</source>
<translation>Китайский</translation>
</message>
<message>
- <location line="+50"/>
+ <location line="+53"/>
<source>This whole panel allows you to view and edit the translation of some source text.</source>
<translation>Данная панель позволяет просматривать и редактировать перевод исходного текста.</translation>
</message>
@@ -1510,7 +1556,7 @@ All files (*)</source>
<translation>В данной области отображается исходный текст.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Source text (Plural)</source>
<translation>Исходный текст (множественная форма)</translation>
</message>
@@ -1520,7 +1566,7 @@ All files (*)</source>
<translation>В данной области отображается исходный текст во множественной форме.</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+4"/>
<source>Developer comments</source>
<translation>Комментарий разработчика</translation>
</message>
@@ -1535,12 +1581,12 @@ All files (*)</source>
<translation>Здесь вы можете оставить комментарий для собственного использования. Комментарии не влияют на перевод приложений.</translation>
</message>
<message>
- <location line="+205"/>
+ <location line="+232"/>
<source>%1 translation (%2)</source>
<translation>%1 перевод (%2)</translation>
</message>
<message>
- <location line="+19"/>
+ <location line="+9"/>
<source>This is where you can enter or modify the translation of the above source text.</source>
<translation>Здесь вы можете ввести или изменить перевод текста, представленного выше.</translation>
</message>
@@ -1555,7 +1601,7 @@ All files (*)</source>
<translation>%1 перевод: комментарий переводчика</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+157"/>
<source>&apos;%1&apos;
Line: %2</source>
<translation>&apos;%1&apos;
@@ -1586,25 +1632,20 @@ Line: %2</source>
</message>
</context>
<context>
- <name>MsgEdit</name>
- <message>
- <location filename="../tools/linguist/linguist/messageeditor.cpp" line="-545"/>
- <source></source>
- <comment>This is the right panel of the main window.</comment>
- <translatorcomment>Правая панель главного окна</translatorcomment>
- <translation></translation>
- </message>
-</context>
-<context>
<name>PhraseBookBox</name>
<message>
- <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="-17"/>
+ <location filename="../tools/linguist/linguist/phrasebookbox.cpp" line="+42"/>
<source></source>
<comment>Go to Phrase &gt; Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment>
<translation></translation>
</message>
<message>
- <location line="+25"/>
+ <location line="+24"/>
+ <source>(New Entry)</source>
+ <translation>(Новая запись)</translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>%1[*] - Qt Linguist</source>
<translation>%1[*] - Qt Linguist</translation>
</message>
@@ -1725,7 +1766,7 @@ Line: %2</source>
<context>
<name>PhraseView</name>
<message>
- <location filename="../tools/linguist/linguist/phraseview.cpp" line="+121"/>
+ <location filename="../tools/linguist/linguist/phraseview.cpp" line="+122"/>
<source>Insert</source>
<translation>Вставить</translation>
</message>
@@ -1748,7 +1789,7 @@ Line: %2</source>
<context>
<name>QObject</name>
<message>
- <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1806"/>
+ <location filename="../tools/linguist/linguist/mainwindow.cpp" line="-1816"/>
<source>Translation files (%1);;</source>
<translation>Файлы перевода (%1);;</translation>
</message>
@@ -1769,7 +1810,7 @@ Line: %2</source>
<translation>Qt Linguist</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/po.cpp" line="+651"/>
+ <location filename="../tools/linguist/shared/po.cpp" line="+658"/>
<source>GNU Gettext localization files</source>
<translation>Файлы локализации GNU Gettext</translation>
</message>
@@ -1779,7 +1820,7 @@ Line: %2</source>
<translation>Скомпилированные переводы Qt</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/qph.cpp" line="+192"/>
+ <location filename="../tools/linguist/shared/qph.cpp" line="+183"/>
<source>Qt Linguist &apos;Phrase Book&apos;</source>
<translation>&apos;Разговорник&apos; Qt Linguist</translation>
</message>
@@ -1799,35 +1840,10 @@ Line: %2</source>
<translation>Исходные файлы перевода Qt (последний формат)</translation>
</message>
<message>
- <location filename="../tools/linguist/shared/xliff.cpp" line="+817"/>
+ <location filename="../tools/linguist/shared/xliff.cpp" line="+827"/>
<source>XLIFF localization files</source>
<translation>Файлы локализации XLIFF</translation>
</message>
- <message>
- <location filename="../tools/linguist/shared/cpp.cpp" line="+1089"/>
- <source>C++ source files</source>
- <translation>Файлы исходных кодов C++</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/java.cpp" line="+652"/>
- <source>Java source files</source>
- <translation>Файлы исходных кодов Java</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/qscript.cpp" line="+2399"/>
- <source>Qt Script source files</source>
- <translation>Файлы исходных кодов Qt Script</translation>
- </message>
- <message>
- <location filename="../tools/linguist/shared/ui.cpp" line="+213"/>
- <source>Qt Designer form files</source>
- <translation>Формы Qt Designer</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Qt Jambi form files</source>
- <translation>Формы Qt Jambi</translation>
- </message>
</context>
<context>
<name>SourceCodeView</name>
diff --git a/translations/qt_de.ts b/translations/qt_de.ts
index c09daa9..0d329e5 100644
--- a/translations/qt_de.ts
+++ b/translations/qt_de.ts
@@ -140,9 +140,22 @@ Bitte prüfen Sie die Gstreamer-Installation und stellen Sie sicher, dass das Pa
</message>
</context>
<context>
+ <name>Phonon::MMF</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/audiooutput.cpp" line="+110"/>
+ <source>Audio Output</source>
+ <translation>Audio-Ausgabe</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The audio output device</source>
+ <translation>Audio-Ausgabegerät</translation>
+ </message>
+</context>
+<context>
<name>Phonon::MMF::AudioEqualizer</name>
<message>
- <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+74"/>
+ <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+75"/>
<source>Frequency band, %1 Hz</source>
<translation>Frequenzband, %1 Hz</translation>
</message>
@@ -917,7 +930,7 @@ nach
<translation>Diese Socket-Operation wird nicht unterstützt</translation>
</message>
<message>
- <location line="+187"/>
+ <location line="+200"/>
<source>Socket operation timed out</source>
<translation>Das Zeitlimit für die Operation wurde überschritten</translation>
</message>
@@ -953,7 +966,7 @@ nach
<context>
<name>QApplication</name>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2306"/>
+ <location filename="../src/gui/kernel/qapplication.cpp" line="+2290"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>LTR</translation>
@@ -1023,7 +1036,7 @@ nach
<context>
<name>QColorDialog</name>
<message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1348"/>
+ <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1349"/>
<source>Hu&amp;e:</source>
<translation>Farb&amp;ton:</translation>
</message>
@@ -1063,7 +1076,7 @@ nach
<translation>Farbauswahl</translation>
</message>
<message>
- <location line="+178"/>
+ <location line="+180"/>
<source>&amp;Basic colors</source>
<translation>Grundfar&amp;ben</translation>
</message>
@@ -1263,7 +1276,7 @@ nach
<message>
<location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1872"/>
<location line="+464"/>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+619"/>
+ <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+606"/>
<source>OK</source>
<translation>OK</translation>
</message>
@@ -1447,7 +1460,7 @@ nach
<context>
<name>QErrorMessage</name>
<message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+413"/>
+ <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+414"/>
<source>&amp;Show this message again</source>
<translation>Diese Meldung wieder an&amp;zeigen</translation>
</message>
@@ -1457,7 +1470,7 @@ nach
<translation>&amp;OK</translation>
</message>
<message>
- <location line="-206"/>
+ <location line="-207"/>
<source>Debug Message:</source>
<translation>Debug-Ausgabe:</translation>
</message>
@@ -1538,7 +1551,7 @@ nach
<translation>Details</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+444"/>
+ <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+464"/>
<location line="+1"/>
<source>File</source>
<translation>Datei</translation>
@@ -1567,12 +1580,12 @@ nach
<translation>S&amp;peichern</translation>
</message>
<message>
- <location line="+1801"/>
+ <location line="+1807"/>
<source>Recent Places</source>
<translation>Zuletzt besucht</translation>
</message>
<message>
- <location line="-2511"/>
+ <location line="-2517"/>
<source>&amp;Rename</source>
<translation>&amp;Umbenennen</translation>
</message>
@@ -1836,50 +1849,50 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<name>QFontDatabase</name>
<message>
<location filename="../src/gui/text/qfontdatabase.cpp" line="+102"/>
- <location line="+1330"/>
+ <location line="+1335"/>
<source>Normal</source>
<translation>Normal</translation>
</message>
<message>
- <location line="-1327"/>
+ <location line="-1332"/>
<location line="+12"/>
- <location line="+1303"/>
+ <location line="+1308"/>
<source>Bold</source>
<translation>Fett</translation>
</message>
<message>
- <location line="-1312"/>
- <location line="+1314"/>
+ <location line="-1317"/>
+ <location line="+1319"/>
<source>Demi Bold</source>
<translation>Halbfett</translation>
</message>
<message>
- <location line="-1311"/>
+ <location line="-1316"/>
<location line="+18"/>
- <location line="+1289"/>
+ <location line="+1294"/>
<source>Black</source>
<translation>Schwarz</translation>
</message>
<message>
- <location line="-1299"/>
+ <location line="-1304"/>
<source>Demi</source>
<translation>Semi</translation>
</message>
<message>
<location line="+6"/>
- <location line="+1299"/>
+ <location line="+1304"/>
<source>Light</source>
<translation>Leicht</translation>
</message>
<message>
- <location line="-1153"/>
- <location line="+1156"/>
+ <location line="-1158"/>
+ <location line="+1161"/>
<source>Italic</source>
<translation>Kursiv</translation>
</message>
<message>
- <location line="-1153"/>
- <location line="+1155"/>
+ <location line="-1158"/>
+ <location line="+1160"/>
<source>Oblique</source>
<translation>Schräggestellt</translation>
</message>
@@ -2255,13 +2268,9 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<context>
<name>QHostInfoAgent</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
- <location line="+9"/>
- <location line="+80"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+257"/>
<location line="+32"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+165"/>
- <location line="+9"/>
- <location line="+56"/>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+220"/>
<location line="+27"/>
<source>Host not found</source>
<translation>Rechner konnte nicht gefunden werden</translation>
@@ -2282,7 +2291,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<translation>Unbekannter Fehler</translation>
</message>
<message>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-71"/>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-67"/>
<source>No host name given</source>
<translation>Es wurde kein Hostname angegeben</translation>
</message>
@@ -2612,7 +2621,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<context>
<name>QIODevice</name>
<message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+2046"/>
+ <location filename="../src/corelib/global/qglobal.cpp" line="+2058"/>
<source>Permission denied</source>
<translation>Zugriff verweigert</translation>
</message>
@@ -3092,7 +3101,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<context>
<name>QMenuBar</name>
<message>
- <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+401"/>
+ <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+404"/>
<source>Actions</source>
<translation>Optionen</translation>
</message>
@@ -3556,7 +3565,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<context>
<name>QObject</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-101"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-97"/>
<source>Invalid hostname</source>
<translation>Ungültiger Rechnername</translation>
</message>
@@ -3782,7 +3791,7 @@ Möchten Sie die Datei trotzdem löschen?</translation>
<translation>unbekannt</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+259"/>
+ <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+266"/>
<source>OK</source>
<translation>OK</translation>
</message>
@@ -4492,7 +4501,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<translation>Zeitüberschreitung</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+851"/>
+ <location filename="../src/corelib/io/qprocess.cpp" line="+855"/>
<location line="+52"/>
<location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
<location line="+50"/>
@@ -5834,7 +5843,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<translation>Abbrechen</translation>
</message>
<message>
- <location line="+152"/>
+ <location line="+151"/>
<source>Exit</source>
<translation>Beenden</translation>
</message>
@@ -6058,7 +6067,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<context>
<name>QTextControl</name>
<message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+2001"/>
+ <location filename="../src/gui/text/qtextcontrol.cpp" line="+2007"/>
<source>&amp;Undo</source>
<translation>&amp;Rückgängig</translation>
</message>
@@ -6216,7 +6225,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<context>
<name>QWebFrame</name>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+706"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+704"/>
<source>Request cancelled</source>
<translation>Anfrage wurde abgebrochen</translation>
</message>
@@ -6861,17 +6870,17 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1726"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1727"/>
<source>JavaScript Alert - %1</source>
<translation>JavaScript-Hinweis - %1</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+16"/>
<source>JavaScript Confirm - %1</source>
<translation>JavaScript-Bestätigung - %1</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+18"/>
<source>JavaScript Prompt - %1</source>
<translation>JavaScript-Eingabeaufforderung - %1</translation>
</message>
@@ -6886,7 +6895,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<translation>Das Skript dieser Webseite ist fehlerhaft. Möchten Sie es anhalten?</translation>
</message>
<message>
- <location line="+382"/>
+ <location line="+383"/>
<source>Move the cursor to the next character</source>
<translation>Positionsmarke auf folgendes Zeichen setzen</translation>
</message>
@@ -7107,7 +7116,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<context>
<name>QWidget</name>
<message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5651"/>
+ <location filename="../src/gui/kernel/qwidget.cpp" line="+5666"/>
<source>*</source>
<translation>*</translation>
</message>
@@ -8098,7 +8107,7 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<message>
<location line="+10"/>
<source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation>Bei einem XSL-T-Suchmuster dürfen nur die Funktionen %1 und %2, nicht jedoch %3 zur Suche verwendet werden.</translation>
+ <translation>Bei einem XSL-T-Suchmuster dürfen nur die Funktionen %1 und %2, nicht jedoch %3 zur Suche verwendet werden.</translation>
</message>
<message>
<location line="+63"/>
@@ -8138,17 +8147,17 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<message>
<location line="-152"/>
<source>W3C XML Schema identity constraint selector</source>
- <translation type="unfinished"></translation>
+ <translation>W3C XML Schema identity constraint selector</translation>
</message>
<message>
<location line="+3"/>
<source>W3C XML Schema identity constraint field</source>
- <translation type="unfinished"></translation>
+ <translation>W3C XML Schema identity constraint field</translation>
</message>
<message>
<location line="+4"/>
<source>A construct was encountered which is disallowed in the current language(%1).</source>
- <translation type="unfinished"></translation>
+ <translation>Es wurde ein Sprachkonstrukt angetroffen, was in der aktuellen Sprache (%1) nicht erlaubt ist.</translation>
</message>
<message>
<location line="+3804"/>
@@ -8491,206 +8500,206 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<message>
<location filename="../src/xmlpatterns/schema/qxsdschemachecker.cpp" line="+227"/>
<source>%1 has inheritance loop in its base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 hat eine zirkuläre Vererbung im Basistyp %2.</translation>
</message>
<message>
<location line="+5"/>
<location line="+24"/>
<source>Circular inheritance of base type %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Zirkuläre Vererbung im Basistyp %1.</translation>
</message>
<message>
<location line="+11"/>
<source>Circular inheritance of union %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Zirkuläre Vererbung bei der Vereinigung %1.</translation>
</message>
<message>
<location line="+25"/>
<source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf nicht durch Einschränkung von %2 abgeleitet werden, da letzterer sie als final deklariert.</translation>
</message>
<message>
<location line="+5"/>
<source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf nicht durch Erweiterung von %2 abgeleitet werden, da letzterer sie als final deklariert.</translation>
</message>
<message>
<location line="+31"/>
<source>Base type of simple type %1 cannot be complex type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %2 kann nicht Basisklasse des einfachen Typs %1 sein.</translation>
</message>
<message>
<location line="+9"/>
<source>Simple type %1 cannot have direct base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ %1 kann nicht den unmittelbaren Basistyp %2 haben.</translation>
</message>
<message>
<location line="+33"/>
<location line="+9"/>
<source>Simple type %1 is not allowed to have base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ %1 darf nicht den Basistyp %2 haben.</translation>
</message>
<message>
<location line="+12"/>
<source>Simple type %1 can only have simple atomic type as base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ %1 kann nur einen einfachen. atomaren Basistyp haben.</translation>
</message>
<message>
<location line="+6"/>
<source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf nicht von %2 abgeleitet werden, da letzterer die Einschränkung als final deklariert.</translation>
</message>
<message>
<location line="+13"/>
<location line="+484"/>
<source>Variety of item type of %1 must be either atomic or union.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Varietät der Typen von %1 muss entweder atomar oder eine Vereinigung sein.</translation>
</message>
<message>
<location line="-474"/>
<location line="+483"/>
<source>Variety of member types of %1 must be atomic.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Varietät der Typen von %1 muss atomar sein.</translation>
</message>
<message>
<location line="-470"/>
<location line="+451"/>
<source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf nicht durch Listen von %2 abgeleitet werden, da sie letzterer sie als final deklariert.</translation>
</message>
<message>
<location line="-431"/>
<source>Simple type %1 is only allowed to have %2 facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ %1 darf nur die Facette %2 haben.</translation>
</message>
<message>
<location line="+10"/>
<source>Base type of simple type %1 must have variety of type list.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp des einfachen Typs %1 muss eine Varietät des Typs Liste haben.</translation>
</message>
<message>
<location line="+6"/>
<source>Base type of simple type %1 has defined derivation by restriction as final.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp des einfachen Typs %1 definiert Vererbung durch Einschränkung als final.</translation>
</message>
<message>
<location line="+6"/>
<source>Item type of base type does not match item type of %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Elementtyp des Basistyps entspricht nicht dem Elementtyp von %1.</translation>
</message>
<message>
<location line="+26"/>
<location line="+93"/>
<source>Simple type %1 contains not allowed facet type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ %1 enthält einen nicht erlaubten Facettentyp %2.</translation>
</message>
<message>
<location line="-72"/>
<location line="+413"/>
<source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf nicht durch Vereinigung von %2 abgeleitet werden, da sie letzterer sie als final deklariert.</translation>
</message>
<message>
<location line="-404"/>
<source>%1 is not allowed to have any facets.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf keine Facetten haben.</translation>
</message>
<message>
<location line="+8"/>
<source>Base type %1 of simple type %2 must have variety of union.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp %1 des einfachen Typs %2 muss eine Varietät des Typs Vereinigung haben.</translation>
</message>
<message>
<location line="+9"/>
<source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp %1 des einfachen Typs %2 darf keine Einschränkung im %3 Attribut haben.</translation>
</message>
<message>
<location line="+18"/>
<source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ %1 des Mitglieds darf nicht vom Typ %2 des Mitglieds vom Basistyp %4 von %3 sein.</translation>
</message>
<message>
<location line="+65"/>
<source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
- <translation type="unfinished"></translation>
+ <translation>Erweiterung muss als Vererbungsmethode für %1 verwendet werden, da der Basistyp %2 ein einfacher Typ ist.</translation>
</message>
<message>
<location line="+30"/>
<source>Complex type %1 has duplicated element %2 in its content model.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 hat ein dupliziertes Element %2 in seinem Inhaltsmodell.</translation>
</message>
<message>
<location line="+8"/>
<source>Complex type %1 has non-deterministic content.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 hat nicht-deterministischen Inhalt.</translation>
</message>
<message>
<location line="+21"/>
<source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attribute des komplexen Typs %1 sind keine gültige Erweiterung der Attribute des Basistyps %2: %3.</translation>
</message>
<message>
<location line="+37"/>
<source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Inhaltsmodell des komplexen Typs %1 ist keine gültige Erweiterung des Inhaltsmodells von %2.</translation>
</message>
<message>
<location line="+10"/>
<source>Complex type %1 must have simple content.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 kann nur einfachen Inhalt haben.</translation>
</message>
<message>
<location line="+7"/>
<source>Complex type %1 must have the same simple type as its base class %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 kann nur einen einfachen Typ als Basisklasse %2 haben.</translation>
</message>
<message>
<location line="+67"/>
<source>Complex type %1 cannot be derived from base type %2%3.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 kann nicht vom Basistyp %2 abgeleitet werden%3.</translation>
</message>
<message>
<location line="+14"/>
<source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attribute des komplexen Typs %1 sind keine gültige Einschränkung der Attribute des Basistyps %2: %3.</translation>
</message>
<message>
<location line="+14"/>
<source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 einfachen Inhalts darf nicht vom komplexen Basistyp %2 abgeleitet werden.</translation>
</message>
<message>
<location line="+35"/>
<source>Item type of simple type %1 cannot be a complex type.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Elementtyp des einfachen Typs %1 kann kein komplexer Typ sein.</translation>
</message>
<message>
<location line="+44"/>
<source>Member type of simple type %1 cannot be a complex type.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ eines Mitglieds des einfachen Typs %1 kann kein komplexer Typ sein.</translation>
</message>
<message>
<location line="+8"/>
<source>%1 is not allowed to have a member type with the same name as itself.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 darf keinen Typ eines Mitglieds desselben Namens haben.</translation>
</message>
<message>
<location line="+83"/>
<location line="+29"/>
<location line="+34"/>
<source>%1 facet collides with %2 facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 steht im Widerspruch zu der Facette %2.</translation>
</message>
<message>
<location line="-20"/>
<source>%1 facet must have the same value as %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss denselben Wert wie die Facette %2 des Basistyps haben.</translation>
</message>
<message>
<location line="+37"/>
<source>%1 facet must be equal or greater than %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss größer oder gleich der Facette %2 des Basistyps sein.</translation>
</message>
<message>
<location line="+19"/>
@@ -8702,333 +8711,333 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<location line="+34"/>
<location line="+35"/>
<source>%1 facet must be less than or equal to %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss kleiner oder gleich der Facette %2 des Basistyps sein.</translation>
</message>
<message>
<location line="-389"/>
<source>%1 facet contains invalid regular expression</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 enthält einen ungültigen regulären Ausdruck</translation>
</message>
<message>
<location line="+15"/>
<source>Unknown notation %1 used in %2 facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %2 enthält eine ungültige Notation %1.</translation>
</message>
<message>
<location line="+20"/>
<source>%1 facet contains invalid value %2: %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 enthält einen ungültigen Wert %2: %3.</translation>
</message>
<message>
<location line="+22"/>
<source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 kann nicht %2 oder %3 sein, wenn die Facette %4 des Basistyps %5 ist.</translation>
</message>
<message>
<location line="+11"/>
<source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 kann nicht %2 sein, wenn die Facette %3 des Basistyps %4 ist.</translation>
</message>
<message>
<location line="+20"/>
<location line="+55"/>
<location line="+230"/>
<source>%1 facet must be less than or equal to %2 facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss kleiner oder gleich der Facette %2 sein.</translation>
</message>
<message>
<location line="-257"/>
<location line="+134"/>
<location line="+82"/>
<source>%1 facet must be less than %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss kleiner der Facette %2 des Basistyps sein.</translation>
</message>
<message>
<location line="-201"/>
<location line="+79"/>
<source>%1 facet and %2 facet cannot appear together.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facetten %1 und %2 können nicht zusammen erscheinen.</translation>
</message>
<message>
<location line="-27"/>
<location line="+12"/>
<location line="+113"/>
<source>%1 facet must be greater than %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss größer als die Facette %2 des Basistyps sein.</translation>
</message>
<message>
<location line="-86"/>
<location line="+58"/>
<source>%1 facet must be less than %2 facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss kleiner als die Facette %2 sein.</translation>
</message>
<message>
<location line="-42"/>
<location line="+58"/>
<source>%1 facet must be greater than or equal to %2 facet of base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facette %1 muss größer oder gleich der Facette %2 des Basistyps sein.</translation>
</message>
<message>
<location line="+113"/>
<source>Simple type contains not allowed facet %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ enthält eine unzulässige Facette %1.</translation>
</message>
<message>
<location line="+12"/>
<source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Facetten %1, %2, %3, %4, %5 und %6 sind bei Vererbung durch Listen nicht zulässig.</translation>
</message>
<message>
<location line="+16"/>
<source>Only %1 and %2 facets are allowed when derived by union.</source>
- <translation type="unfinished"></translation>
+ <translation>Bei Vererbung durch Vereinigung sind nur die Facetten %1 und %2 zulässig.</translation>
</message>
<message>
<location line="+23"/>
<location line="+16"/>
<source>%1 contains %2 facet with invalid data: %3.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 enthält eine Facette %2 mit ungültigen Daten: %3.</translation>
</message>
<message>
<location line="+24"/>
<source>Attribute group %1 contains attribute %2 twice.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 enthält das Attribut %2 zweimal.</translation>
</message>
<message>
<location line="+9"/>
<source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 enthält zwei verschiedene Attribute mit Typen, die von %2 abgeleitet sind.</translation>
</message>
<message>
<location line="+8"/>
<source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 enthält ein Attribut %2 mit einer Einschränkung des Werts, dessen Typ aber von %3 abgeleitet ist.</translation>
</message>
<message>
<location line="+23"/>
<source>Complex type %1 contains attribute %2 twice.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 enthält das Attribut %2 doppelt.</translation>
</message>
<message>
<location line="+9"/>
<source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 enthält zwei verschiedene Attribute mit Typen, die beide von %2 abgeleitet sind.</translation>
</message>
<message>
<location line="+8"/>
<source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 enthält ein Attribut %2 mit einer Einschränkung des Werts, dessen Typ aber von %3 abgeleitet ist.</translation>
</message>
<message>
<location line="+43"/>
<source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 darf keine Einschränkung des Werts haben, wenn der Basistyp komplex ist.</translation>
</message>
<message>
<location line="+7"/>
<source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 darf keine Einschränkung des Werts haben, wenn sein Typ von %2 abgeleitet ist.</translation>
</message>
<message>
<location line="+10"/>
<location line="+11"/>
<source>Value constraint of element %1 is not of elements type: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Einschränkung des Werts des Elements %1 ist nicht vom Typ des Elements: %2.</translation>
</message>
<message>
<location line="+13"/>
<source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 kann nicht zu einer Substitutionsgruppe gehören, da es kein globales Element ist.</translation>
</message>
<message>
<location line="+28"/>
<source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ des Elements %1 kann nicht vom Typ der zugehörigen Substitutionsgruppe abgeleitet werden.</translation>
</message>
<message>
<location line="+41"/>
<source>Value constraint of attribute %1 is not of attributes type: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Einschränkung des Werts des Attributs %1 ist nicht vom Typ des Attributs: %2.</translation>
</message>
<message>
<location line="+9"/>
<source>Attribute %1 has value constraint but has type derived from %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 hat eine Einschränkung des Werts, während sein Typ von %2 abgeleitet ist.</translation>
</message>
<message>
<location line="+56"/>
<source>%1 attribute in derived complex type must be %2 like in base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 in einem abgeleiteten komplexen Typ muss wie im Basistyp &apos;%2&apos; sein.</translation>
</message>
<message>
<location line="+11"/>
<source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 in einem abgeleiteten komplexen Typ muss wie der Basistyp eine Einschränkung des Werts (%2) haben.</translation>
</message>
<message>
<location line="+9"/>
<source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 in einem abgeleiteten komplexen Typ muss die gleiche Einschränkung des Werts (%2) wie der Basistyp haben.</translation>
</message>
<message>
<location line="+7"/>
<source>Attribute %1 in derived complex type must have %2 value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 in einem abgeleiteten komplexen Typ muss die Einschränkung des Werts &apos;%2&apos; haben.</translation>
</message>
<message>
<location line="+18"/>
<source>processContent of base wildcard must be weaker than derived wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>Das &apos;processContent&apos;-Attribut des Basisuchmusters muss schwächer sein als das des abgeleiteten Suchmusters.</translation>
</message>
<message>
<location line="+39"/>
<location line="+15"/>
<source>Element %1 exists twice with different types.</source>
- <translation type="unfinished"></translation>
+ <translation>Es existieren zwei Vorkommen verschiedenen Typs des Elements %1.</translation>
</message>
<message>
<location line="+28"/>
<source>Particle contains non-deterministic wildcards.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Partikel enthält nicht-deterministische Suchmuster.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/schema/qxsdschemahelper.cpp" line="+691"/>
<location line="+63"/>
<source>Base attribute %1 is required but derived attribute is not.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Basisattribut %1 ist erforderlich, nicht jedoch das abgeleitete Attribut.</translation>
</message>
<message>
<location line="-57"/>
<source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ des abgeleiteten Attributs %1 kann nicht aus Typ des Basisattributs bestimmt werden.</translation>
</message>
<message>
<location line="+28"/>
<source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Einschränkung des Werts des abgeleiteten Attributs %1 entspricht nicht der Einschränkung des Werts des Basisattributs.</translation>
</message>
<message>
<location line="+5"/>
<source>Derived attribute %1 does not exists in the base definition.</source>
- <translation type="unfinished"></translation>
+ <translation>Das abgeleitete Attribut %1 existiert in der Basisdefinition nicht.</translation>
</message>
<message>
<location line="+11"/>
<source>Derived attribute %1 does not match the wildcard in the base definition.</source>
- <translation type="unfinished"></translation>
+ <translation>Das abgeleitete Attribut %1 entspricht nicht dem Suchmuster in der Basisdefinition.</translation>
</message>
<message>
<location line="+17"/>
<source>Base attribute %1 is required but missing in derived definition.</source>
- <translation type="unfinished"></translation>
+ <translation>Das erforderliche Basisattribut %1 fehlt in der abgeleiteten Definition.</translation>
</message>
<message>
<location line="+9"/>
<source>Derived definition contains an %1 element that does not exists in the base definition</source>
- <translation type="unfinished"></translation>
+ <translation>Die abgeleitete Definition enthält ein Element %1, was in der Basisdefinition nicht existiert</translation>
</message>
<message>
<location line="+5"/>
<source>Derived wildcard is not a subset of the base wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>Das abgeleitete Suchmuster ist keine Untermenge des Basissuchmusters.</translation>
</message>
<message>
<location line="+5"/>
<source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des abgeleiteten Suchmusters ist keine gültige Einschränkung des Attributs &apos;%2&apos; des Basissuchmusters</translation>
</message>
<message>
<location line="+23"/>
<source>Attribute %1 from base type is missing in derived type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Basistyps fehlt im abgeleiteten Typ.</translation>
</message>
<message>
<location line="+5"/>
<source>Type of derived attribute %1 differs from type of base attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ des abgeleiteten Attributs %1 unterscheidet sich vom Basistyp.</translation>
</message>
<message>
<location line="+8"/>
<source>Base definition contains an %1 element that is missing in the derived definition</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 des Basistyps fehlt in der abgeleiteten Definition</translation>
</message>
<message>
<location filename="../src/xmlpatterns/schema/qxsdschemaresolver.cpp" line="+354"/>
<source>%1 references unknown %2 or %3 element %4.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 verweist auf ein unbekanntes Element %4 (&apos;%2&apos; oder &apos;%3&apos;).</translation>
</message>
<message>
<location line="+10"/>
<source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 verweist auf eine Identitätseinschränkung %2, die weder ein &apos;%3&apos; noch ein &apos;%4&apos; Element ist.</translation>
</message>
<message>
<location line="+10"/>
<source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
- <translation type="unfinished"></translation>
+ <translation>Bei %1 unterscheidet sich die Anzahl der Felder von der der Identitätseinschränkung %2, auf die es verweist.</translation>
</message>
<message>
<location line="+23"/>
<source>Base type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="+84"/>
<source>Item type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Subtyp %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="+31"/>
<source>Member type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Subtyp %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="+28"/>
<location line="+408"/>
<location line="+30"/>
<source>Type %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="-416"/>
<source>Base type %1 of complex type cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Basistyp %1 des komplexen Typs kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="+9"/>
<source>%1 cannot have complex base type that has a %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 kann keinen komplexen Basistyp haben, der &apos;%2&apos; spezifiziert.</translation>
</message>
<message>
<location line="+279"/>
<source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Inhaltsmodell des komplexen Typs %1enthält ein Element &apos;%2&apos;; es kann daher nicht durch Erweiterung von einem nichtleeren Typ abgeleitet werden.</translation>
</message>
<message>
<location line="+6"/>
<source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ % kann nicht durch Erweiterung von %2 abgeleitet werden, da letzterer ein &apos;%3&apos;-Element in seinem Inhaltsmodell hat.</translation>
</message>
<message>
<location line="+101"/>
<source>Type of %1 element must be a simple type, %2 is not.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ des Elements %1 muss ein einfacher Typ sein, was %2 nicht ist.</translation>
</message>
<message>
<location line="+62"/>
<source>Substitution group %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Substitutionsgruppe %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="+9"/>
<source>Substitution group %1 has circular definition.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Substitutionsgruppe %1 hat eine zirkuläre Definition.</translation>
</message>
<message>
<location line="+120"/>
<location line="+7"/>
<source>Duplicated element names %1 in %2 element.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Elementname %1 kommt im Element %2 mehrfach vor.</translation>
</message>
<message>
<location line="+29"/>
@@ -9036,207 +9045,207 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<location line="+71"/>
<location line="+28"/>
<source>Reference %1 of %2 element cannot be resolved.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Verweis %1 des Elements %2 kann nicht aufgelöst werden.</translation>
</message>
<message>
<location line="-138"/>
<source>Circular group reference for %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Zirkulärer Verweis bei %1.</translation>
</message>
<message>
<location line="+16"/>
<source>%1 element is not allowed in this scope</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist in diesem Bereich nicht zulässig</translation>
</message>
<message>
<location line="+5"/>
<source>%1 element cannot have %2 attribute with value other than %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Wert des Attributs %2 des Elements %1 kann nur %3 sein.</translation>
</message>
<message>
<location line="+8"/>
<source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Wert des Attributs %2 des Elements %1 kann nur %3 oder %4 sein.</translation>
</message>
<message>
<location line="+91"/>
<source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 oder %2 des Verweises %3 entspricht nicht der Attributsdeklaration %4.</translation>
</message>
<message>
<location line="+25"/>
<source>Attribute group %1 has circular reference.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 hat einen zirkulären Verweis.</translation>
</message>
<message>
<location line="+131"/>
<source>%1 attribute in %2 must have %3 use like in base type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 aus %2 muss die Verwendung &apos;%3&apos; spezifizieren, wie im Basistyp %4.</translation>
</message>
<message>
<location line="+52"/>
<source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attributssuchmuster %1 ist keine gültige Einschränkung des Attributssuchmuster des Basistyps %2.</translation>
</message>
<message>
<location line="+7"/>
<source>%1 has attribute wildcard but its base type %2 has not.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 hat ein Attributssuchmuster, nicht jedoch sein Basistyp %2.</translation>
</message>
<message>
<location line="+26"/>
<source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Vereinigung der Attributssuchmuster des Typs %1 und seines Basistyps %2 ergibt keinen gültigen Ausdruck.</translation>
</message>
<message>
<location line="+48"/>
<source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Ungültiger Inhalt einer Aufzählungsfacette: {%1} ist kein Wert des Typs %2.</translation>
</message>
<message>
<location line="+10"/>
<source>Namespace prefix of qualified name %1 is not defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Namensraum-Präfix des qualifizierten Namens %1 ist nicht definiert.</translation>
</message>
<message>
<location line="+51"/>
<location line="+18"/>
<source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %2 (%1) ist keine gültige Einschränkung des überschriebenen Elements (%3): %4.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/schema/qxsdparticlechecker.cpp" line="+165"/>
<source>Empty particle cannot be derived from non-empty particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Von einem nichtleeren Partikel kann kein leerer Partikel abgeleitet werden.</translation>
</message>
<message>
<location line="+15"/>
<source>Derived particle is missing element %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 fehlt im abgeleiteten Partikel.</translation>
</message>
<message>
<location line="+7"/>
<source>Derived element %1 is missing value constraint as defined in base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Im abgeleiteten Element %1 fehlt Einschränkung des Wertes, wie sie im Basispartikel definiert ist.</translation>
</message>
<message>
<location line="+5"/>
<source>Derived element %1 has weaker value constraint than base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Das abgeleitete Element %1 hat eine schwächere Einschränkung des Wertes als der Basispartikel.</translation>
</message>
<message>
<location line="+7"/>
<source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Die feste Einschränkung des Wertes des Elements %1 unterscheidet sich von der Einschränkung des Wertes des Basispartikels.</translation>
</message>
<message>
<location line="+7"/>
<source>Derived element %1 cannot be nillable as base element is not nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>Das abgeleitete Element %1 kann kein &apos;nillable&apos;-Attribut haben, da das Basiselement keines spezifiziert.</translation>
</message>
<message>
<location line="+10"/>
<source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Blockeinschränkung des abgeleiteten Elements %1 darf nicht schwächer sein als im Basiselement.</translation>
</message>
<message>
<location line="+11"/>
<source>Simple type of derived element %1 cannot be validly derived from base element.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einfache Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden.</translation>
</message>
<message>
<location line="+5"/>
<source>Complex type of derived element %1 cannot be validly derived from base element.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ des abgeleiteten Elements %1 kann nicht vom Basiselement abgeleitet werden.</translation>
</message>
<message>
<location line="+24"/>
<source>Element %1 is missing in derived particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 fehlt im abgeleiteten Partikel.</translation>
</message>
<message>
<location line="+18"/>
<source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 entspricht nicht der Namensraumeinschränkung des Basispartikels.</translation>
</message>
<message>
<location line="+11"/>
<source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Suchmuster im abgeleiteten Partikel ist keine gültige Untermenge des Suchmusters des Basispartikels.</translation>
</message>
<message>
<location line="+5"/>
<source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Das processContent-Attribut des Suchmusters des abgeleiteten Partikels ist schwächer als das Suchmuster des Basispartikels.</translation>
</message>
<message>
<location line="+240"/>
<source>Derived particle allows content that is not allowed in the base particle.</source>
- <translation type="unfinished"></translation>
+ <translation>Der abgeleitete Partikel gestattet Inhalt, der für den Basispartikel nicht zulässig ist.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+169"/>
+ <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+170"/>
<source>Can not process unknown element %1, expected elements are: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das unbekannte Element %1 kann nicht verarbeitet werden; zulässig wären: %2.</translation>
</message>
<message>
<location line="+13"/>
<source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist in diesem Bereich nicht zulässig; möglich wären: %2.</translation>
</message>
<message>
<location line="+16"/>
<source>Child element is missing in that scope, possible child elements are: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Unterelement fehlt im Bereich; mögliche Unterelemente wären: %1.</translation>
</message>
<message>
<location line="+127"/>
<source>Document is not a XML schema.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Dokument ist kein XML-Schema.</translation>
</message>
<message>
<location line="+22"/>
<source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 enthält ungültigen Inhalt: {%3} ist kein Wert des Typs %4.</translation>
</message>
<message>
<location line="+6"/>
<source>%1 attribute of %2 element contains invalid content: {%3}.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 enthält ungültigen Inhalt: {%3}.</translation>
</message>
<message>
<location line="+26"/>
<source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zielnamensraum %1 des eingebundenen Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2.</translation>
</message>
<message>
<location line="+14"/>
<location line="+11"/>
<source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zielnamensraum %1 des importierten Schemas unterscheidet sich vom dem von ihm definierten Zielnamensraum %2.</translation>
</message>
<message>
<location line="+237"/>
<source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 kann nicht den Zielnamensraum %3 als Wert des Attributs &apos;%2&apos; spezifizieren.</translation>
</message>
<message>
<location line="+8"/>
<source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
- <translation type="unfinished"></translation>
+ <translation>In einem Schema ohne Namensraum muss das Element %1 ein Attribut %2 haben.</translation>
</message>
<message>
<location line="+833"/>
<location line="+158"/>
<source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
- <translation type="unfinished"></translation>
+ <translation>Wenn das Attribut %3 vorhanden ist, darf das Element %1 nicht im Element %2 vorkommen.</translation>
</message>
<message>
<location line="-97"/>
<location line="+119"/>
<location line="+92"/>
<source>%1 element has neither %2 attribute nor %3 child element.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 hat weder das Attribut %2 noch ein Unterelement %3.</translation>
</message>
<message>
<location line="+835"/>
@@ -9254,23 +9263,23 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<location line="+11"/>
<location line="+11"/>
<source>%1 element with %2 child element must not have a %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 darf kein Attribut %3 haben, wenn das Unterelement %2 vorhanden ist.</translation>
</message>
<message>
<location line="-1325"/>
<source>%1 attribute of %2 element must be %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 kann nur %3 oder %4 sein.</translation>
</message>
<message>
<location line="+36"/>
<source>%1 attribute of %2 element must have a value of %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 muss den Wert %3 haben.</translation>
</message>
<message>
<location line="+7"/>
<location line="+34"/>
<source>%1 attribute of %2 element must have a value of %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 kann nur einen der Werte %3 oder %4 haben.</translation>
</message>
<message>
<location line="+319"/>
@@ -9288,626 +9297,626 @@ Bitte wählen Sie einen anderen Dateinamen.</translation>
<location line="+6"/>
<location line="+77"/>
<source>%1 element must not have %2 and %3 attribute together.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attribute %2 und %3 können nicht zusammen im Element %1 erscheinen.</translation>
</message>
<message>
<location line="-768"/>
<location line="+222"/>
<source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des Attributs %1 des Elements %2 kann nicht vom Namensraum %3 stammen.</translation>
</message>
<message>
<location line="-215"/>
<location line="+222"/>
<source>%1 attribute of %2 element must not be %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 kann nicht %3 sein.</translation>
</message>
<message>
<location line="-64"/>
<source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 muss den Wert %3 haben, da das Attribut %4 gesetzt ist.</translation>
</message>
<message>
<location line="+187"/>
<source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe von use=&apos;prohibited&apos; in einer Attributgruppe hat keinerlei Auswirkungen.</translation>
</message>
<message>
<location line="+353"/>
<source>%1 element must have either %2 or %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 muss eines der Attribute %2 oder %3 spezifizieren.</translation>
</message>
<message>
<location line="+554"/>
<source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 muss entweder das Attribut %2 spezifizieren oder über eines der Unterelemente %3 oder %4 verfügen.</translation>
</message>
<message>
<location line="+55"/>
<source>%1 element requires either %2 or %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 erfordert eines der Attribute %2 oder %3.</translation>
</message>
<message>
<location line="+19"/>
<source>Text or entity references not allowed inside %1 element</source>
- <translation type="unfinished"></translation>
+ <translation>Text- oder Entitätsreferenzen sind innerhalb eines %1-Elements nicht zulässig.</translation>
</message>
<message>
<location line="+41"/>
<location line="+112"/>
<source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 des Elements %2 muss %3, %4 oder eine Liste der URIs enthalten.</translation>
</message>
<message>
<location line="+126"/>
<source>%1 element is not allowed in this context.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist in diesem Kontext nicht zulässig.</translation>
</message>
<message>
<location line="+53"/>
<source>%1 attribute of %2 element has larger value than %3 attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Wert des Attributs %1 des Elements %2 ist größer als der des Attributs %3.</translation>
</message>
<message>
<location line="+25"/>
<source>Prefix of qualified name %1 is not defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Präfix des qualifizierten Namens %1 ist nicht definiert.</translation>
</message>
<message>
<location line="+65"/>
<location line="+61"/>
<source>%1 attribute of %2 element must either contain %3 or the other values.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Wert des Attributs %1 des Elements %2 muss entweder %3 oder die anderen Werte enthalten.</translation>
</message>
<message>
<location line="+131"/>
<source>Component with id %1 has been defined previously.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Komponente mit der Id %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+17"/>
<source>Element %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+11"/>
<source>Attribute %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+15"/>
<source>Type %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Typ %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+23"/>
<source>Attribute group %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Attributgruppe %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+11"/>
<source>Element group %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Elementgruppe %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+11"/>
<source>Notation %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Notation %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+11"/>
<source>Identity constraint %1 already defined.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Identitätseinschränkung %1 ist bereits definiert.</translation>
</message>
<message>
<location line="+11"/>
<source>Duplicated facets in simple type %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Im einfachen Typ %1 kommen Facetten mehrfach vor.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/schema/qxsdtypechecker.cpp" line="+233"/>
<location line="+7"/>
<location line="+21"/>
<source>%1 is not valid according to %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 ist nach %2 ungültig.</translation>
</message>
<message>
<location line="+167"/>
<source>String content does not match the length facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zeichenketteninhalt entspricht nicht der Längenfacette.</translation>
</message>
<message>
<location line="+8"/>
<source>String content does not match the minLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zeichenketteninhalt entspricht nicht der Längenfacette (Minimumangabe).</translation>
</message>
<message>
<location line="+8"/>
<source>String content does not match the maxLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zeichenketteninhalt entspricht nicht der Längenfacette (Maximumangabe).</translation>
</message>
<message>
<location line="+18"/>
<source>String content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zeichenketteninhalt entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+18"/>
<source>String content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Zeichenketteninhalt ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+17"/>
<source>Signed integer content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette &apos;maxInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Signed integer content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette &apos;maxExclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Signed integer content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette &apos;minInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Signed integer content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette &apos;minExclusive&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Signed integer content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Signed integer content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+9"/>
<source>Signed integer content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenbehaftete Ganzzahlwert entspricht nicht der Facette &apos;totalDigits&apos;.</translation>
</message>
<message>
<location line="+17"/>
<source>Unsigned integer content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette &apos;maxInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Unsigned integer content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette &apos;maxExclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Unsigned integer content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette &apos;minInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Unsigned integer content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette &apos;minExclusive&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Unsigned integer content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Unsigned integer content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+9"/>
<source>Unsigned integer content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der vorzeichenlose Ganzzahlwert entspricht nicht der Facette &apos;totalDigits&apos;.</translation>
</message>
<message>
<location line="+17"/>
<source>Double content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl entspricht nicht der Facette &apos;maxInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Double content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl entspricht nicht der Facette &apos;maxExclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Double content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl entspricht nicht der Facette &apos;minInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Double content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl entspricht nicht der Facette &apos;minExclusive&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Double content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Double content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Gleitkommazahl entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+18"/>
<source>Decimal content does not match in the fractionDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Dezimalzahl entspricht nicht der Facette &apos;fractionDigit&apos;.</translation>
</message>
<message>
<location line="+9"/>
<source>Decimal content does not match in the totalDigits facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Dezimalzahl entspricht nicht der Facette &apos;totalDigits&apos;.</translation>
</message>
<message>
<location line="+14"/>
<source>Date time content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe entspricht nicht der Facette &apos;maxInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Date time content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe entspricht nicht der Facette &apos;maxExclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Date time content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe entspricht nicht der Facette &apos;minInclusive&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Date time content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe entspricht nicht der Facette &apos;minExclusive&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Date time content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Date time content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Datumsangabe entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+15"/>
<source>Duration content does not match the maxInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer entspricht nicht der Facette &apos;maxInclusive&apos;.</translation>
</message>
<message>
<location line="+9"/>
<source>Duration content does not match the maxExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer entspricht nicht der Facette &apos;maxExclusive&apos;.</translation>
</message>
<message>
<location line="+9"/>
<source>Duration content does not match the minInclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer entspricht nicht der Facette &apos;minInclusive&apos;.</translation>
</message>
<message>
<location line="+9"/>
<source>Duration content does not match the minExclusive facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer entspricht nicht der Facette &apos;minExclusive&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Duration content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Duration content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Angabe der Zeitdauer entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+27"/>
<source>Boolean content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Boolesche Wert entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+17"/>
<source>Binary content does not match the length facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der binäre Inhalt entspricht nicht der Längenfacette.</translation>
</message>
<message>
<location line="+8"/>
<source>Binary content does not match the minLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der binäre Inhalt entspricht nicht der Facette &apos;minLength&apos;.</translation>
</message>
<message>
<location line="+8"/>
<source>Binary content does not match the maxLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der binäre Inhalt entspricht nicht der Facette &apos;maxLength&apos;.</translation>
</message>
<message>
<location line="+18"/>
<source>Binary content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der binäre Inhalt ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+27"/>
<source>Invalid QName content: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des qualifizierten Namens ist ungültig: %1.</translation>
</message>
<message>
<location line="+17"/>
<source>QName content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des qualifizierten Namens ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>QName content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des qualifizierten Namens entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+36"/>
<source>Notation content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt der Notation ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+19"/>
<source>List content does not match length facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Listeninhalt entspricht nicht der Längenfacette.</translation>
</message>
<message>
<location line="+7"/>
<source>List content does not match minLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Listeninhalt entspricht nicht der Facette &apos;minLength&apos;.</translation>
</message>
<message>
<location line="+7"/>
<source>List content does not match maxLength facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Listeninhalt entspricht nicht der Facette &apos;maxLength&apos;.</translation>
</message>
<message>
<location line="+90"/>
<source>List content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Listeninhalt ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>List content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Listeninhalt entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+39"/>
<source>Union content is not listed in the enumeration facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt der Vereinigung ist nicht in der Aufzählungsfacette enthalten.</translation>
</message>
<message>
<location line="+18"/>
<source>Union content does not match pattern facet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt der Vereinigung entspricht nicht der Suchmusterfacette.</translation>
</message>
<message>
<location line="+15"/>
<source>Data of type %1 are not allowed to be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Daten vom Typ %1 können nicht leer sein.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp" line="+160"/>
<source>Element %1 is missing child element.</source>
- <translation type="unfinished"></translation>
+ <translation>Beim Element %1 fehlt ein Unterelement.</translation>
</message>
<message>
<location line="+16"/>
<source>There is one IDREF value with no corresponding ID: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Es existiert ein IDREF-Wert, für den keine zugehörige ID vorhanden ist: %1.</translation>
</message>
<message>
<location line="+27"/>
<source>Loaded schema file is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Das geladene Schema ist ungültig.</translation>
</message>
<message>
<location line="+16"/>
<source>%1 contains invalid data.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 enthält ungültige Daten.</translation>
</message>
<message>
<location line="+13"/>
<source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
- <translation type="unfinished"></translation>
+ <translation>xsi:schemaLocation namespace %1 wurde im Instanzdokument bereits spezifiziert.</translation>
</message>
<message>
<location line="+22"/>
<source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
- <translation type="unfinished"></translation>
+ <translation>xsi:noNamespaceSchemaLocation kann nicht nach dem ersten Element oder Attribut ohne Namensraum erscheinen.</translation>
</message>
<message>
<location line="+18"/>
<source>No schema defined for validation.</source>
- <translation type="unfinished"></translation>
+ <translation>Es ist kein Schema für die Validierung definiert.</translation>
</message>
<message>
<location line="+10"/>
<source>No definition for element %1 available.</source>
- <translation type="unfinished"></translation>
+ <translation>Für das Element %1 ist keine Definition verfügbar.</translation>
</message>
<message>
<location line="+18"/>
<location line="+49"/>
<location line="+142"/>
<source>Specified type %1 is not known to the schema.</source>
- <translation type="unfinished"></translation>
+ <translation>Der angegebene Typ %1 ist im Schema nicht spezifiziert.</translation>
</message>
<message>
<location line="-176"/>
<source>Element %1 is not defined in this scope.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist in diesem Bereich nicht definiert.</translation>
</message>
<message>
<location line="+43"/>
<source>Declaration for element %1 does not exist.</source>
- <translation type="unfinished"></translation>
+ <translation>Für das Element %1 ist keine Deklaration verfügbar.</translation>
</message>
<message>
<location line="+12"/>
<source>Element %1 contains invalid content.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält ungültigen Inhalt.</translation>
</message>
<message>
<location line="+73"/>
<source>Element %1 is declared as abstract.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 ist als abstrakt deklariert.</translation>
</message>
<message>
<location line="+7"/>
<source>Element %1 is not nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 hat das Attribut &apos;nillable&apos; nicht spezifiziert.</translation>
</message>
<message>
<location line="+8"/>
<source>Attribute %1 contains invalid data: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 enthält ungültigeDaten: %2</translation>
</message>
<message>
<location line="+8"/>
<source>Element contains content although it is nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element hat Inhalt, obwohl es &apos;nillable&apos; spezifiziert.</translation>
</message>
<message>
<location line="+6"/>
<source>Fixed value constrained not allowed if element is nillable.</source>
- <translation type="unfinished"></translation>
+ <translation>Eine feste Einschränkung des Werts ist nicht zulässig, wenn das Element &apos;nillable&apos; spezifiert.</translation>
</message>
<message>
<location line="+32"/>
<source>Specified type %1 is not validly substitutable with element type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der angebenene Typ %1 kann nicht durch den Elementtyp %2 substituiert werden.</translation>
</message>
<message>
<location line="+23"/>
<source>Complex type %1 is not allowed to be abstract.</source>
- <translation type="unfinished"></translation>
+ <translation>Der komplexe Typ %1 kann nicht abstrakt sein.</translation>
</message>
<message>
<location line="+21"/>
<source>Element %1 contains not allowed attributes.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält unzulässige Attribute.</translation>
</message>
<message>
<location line="+6"/>
<location line="+97"/>
<source>Element %1 contains not allowed child element.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält ein unzulässiges Unterelement.</translation>
</message>
<message>
<location line="-76"/>
<location line="+93"/>
<source>Content of element %1 does not match its type definition: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des Elements %1 entspricht nicht seiner Typdefinition: %2.</translation>
</message>
<message>
<location line="-85"/>
<location line="+92"/>
<location line="+41"/>
<source>Content of element %1 does not match defined value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des Elements %1 entspricht nicht der definierten Einschränkung des Werts.</translation>
</message>
<message>
<location line="-73"/>
<source>Element %1 contains not allowed child content.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält unzulässigen Unterinhalt.</translation>
</message>
<message>
<location line="+41"/>
<source>Element %1 contains not allowed text content.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält unzulässigen Textinhalt.</translation>
</message>
<message>
<location line="+18"/>
<source>Element %1 can not contain other elements, as it has a fixed content.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 darf kann keine Unterelemente haben, da es festen Inhalt enthält.</translation>
</message>
<message>
<location line="+43"/>
<source>Element %1 is missing required attribute %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Bei dem Element %1 fehlt ein erforderliches Attribut %2.</translation>
</message>
<message>
<location line="+29"/>
<source>Attribute %1 does not match the attribute wildcard.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 entspricht nicht dem Attributssuchmuster.</translation>
</message>
<message>
<location line="+9"/>
<source>Declaration for attribute %1 does not exist.</source>
- <translation type="unfinished"></translation>
+ <translation>Für das Attribut %1 ist keine Deklaration verfügbar.</translation>
</message>
<message>
<location line="+6"/>
<source>Element %1 contains two attributes of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält zwei Attribute des Typs %2.</translation>
</message>
<message>
<location line="+11"/>
<source>Attribute %1 contains invalid content.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut %1 enthält ungültigen Inhalt.</translation>
</message>
<message>
<location line="+7"/>
<source>Element %1 contains unknown attribute %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Element %1 enthält ein unbekanntes Attribut %2.</translation>
</message>
<message>
<location line="+40"/>
<location line="+46"/>
<source>Content of attribute %1 does not match its type definition: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des Attributs %1 entspricht nicht seiner Typdefinition: %2.</translation>
</message>
<message>
<location line="-38"/>
<location line="+46"/>
<source>Content of attribute %1 does not match defined value constraint.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Inhalt des Attributs %1 entspricht nicht der definierten Einschränkung des Werts.</translation>
</message>
<message>
<location line="+88"/>
<source>Non-unique value found for constraint %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Für die Einschränkung %1 wurde ein nicht eindeutiger Wert gefunden.</translation>
</message>
<message>
<location line="+20"/>
<source>Key constraint %1 contains absent fields.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Einschränkung des Schlüssels %1 enthält nicht vorhandene Felder.</translation>
</message>
<message>
<location line="+18"/>
<source>Key constraint %1 contains references nillable element %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Einschränkung des Schlüssels %1 verweist auf das Element %2, was &apos;nillable&apos; spezifiziert.</translation>
</message>
<message>
<location line="+40"/>
<source>No referenced value found for key reference %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Der referenzierte Wert der Schlüsselreferenz %1 konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="+64"/>
<source>More than one value found for field %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Für das Feld %1 wurden mehrere Werte gefunden.</translation>
</message>
<message>
<location line="+20"/>
<source>Field %1 has no simple type.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Feld %1 hat keinen einfachen Typ.</translation>
</message>
<message>
<location line="+73"/>
<source>ID value &apos;%1&apos; is not unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Der ID-Wert &apos;%1&apos; ist nicht eindeutig.</translation>
</message>
<message>
<location line="+11"/>
<source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Das Attribut &apos;%1&apos; enthält einen ungültigen qualifizierten Namen: %2.</translation>
</message>
</context>
</TS>
diff --git a/translations/qt_help_pl.ts b/translations/qt_help_pl.ts
index c85b46c..0e6bbbf 100644
--- a/translations/qt_help_pl.ts
+++ b/translations/qt_help_pl.ts
@@ -111,19 +111,16 @@
<context>
<name>QHelpDBReader</name>
<message>
- <source>Cannot open DB!</source>
- <translation type="obsolete">Nie można otworzyć bazy danych!</translation>
- </message>
- <message>
- <location filename="../tools/assistant/lib/qhelpdbreader.cpp" line="+95"/>
+ <location filename="../tools/assistant/lib/qhelpdbreader.cpp" line="+98"/>
<source>Cannot open database &apos;%1&apos; &apos;%2&apos;: %3</source>
+ <extracomment>The placeholders are: %1 - The name of the database which cannot be opened %2 - The unique id for the connection %3 - The actual error string</extracomment>
<translation>Nie można otworzyć bazy danych &apos;%1&apos; &apos;%2&apos;: %3</translation>
</message>
</context>
<context>
<name>QHelpEngineCore</name>
<message>
- <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+516"/>
+ <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+524"/>
<source>The specified namespace does not exist!</source>
<translation>Podana przestrzeń nazw nie istnieje!</translation>
</message>
@@ -131,18 +128,10 @@
<context>
<name>QHelpEngineCorePrivate</name>
<message>
- <location line="-394"/>
+ <location line="-402"/>
<source>Cannot open documentation file %1: %2!</source>
<translation>Nie można otworzyć pliku z dokumentacją %1: %2!</translation>
</message>
- <message>
- <source>Cannot open collection file %1!</source>
- <translation type="obsolete">Nie można otworzyć pliku z kolekcją: %1!</translation>
- </message>
- <message>
- <source>Cannot open documentation file %1!</source>
- <translation type="obsolete">Nie można otworzyć pliku z dokumentacją %1!</translation>
- </message>
</context>
<context>
<name>QHelpGenerator</name>
@@ -157,19 +146,11 @@
<translation>Nie podano nazwy pliku wyjściowego!</translation>
</message>
<message>
- <source>The file %1 already exists!</source>
- <translation type="obsolete">Plik %1 już istnieje!</translation>
- </message>
- <message>
<location line="+14"/>
<source>Building up file structure...</source>
<translation>Budowanie struktury plików...</translation>
</message>
<message>
- <source>Cannot open DB!</source>
- <translation type="obsolete">Nie można otworzyć bazy danych!</translation>
- </message>
- <message>
<location line="-7"/>
<source>The file %1 cannot be overwritten!</source>
<translation>Nie można nadpisać pliku %1!</translation>
@@ -220,17 +201,22 @@
<translation>Wstaw pliki...</translation>
</message>
<message>
- <location line="+41"/>
+ <location line="+42"/>
+ <source>The referenced file %1 must be inside or within a subdirectory of (%2). Skipping it.</source>
+ <translation>Plik %1 do którego się odwołano musi być wewnątrz poddrzewa (%2). Plik ten został pominięty.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
<source>The file %1 does not exist! Skipping it.</source>
<translation>Plik %1 nie istnieje! Zostaje on opuszczony.</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+6"/>
<source>Cannot open file %1! Skipping it.</source>
<translation>Nie można otworzyć pliku %1! Zostaje on opuszczony.</translation>
</message>
<message>
- <location line="+134"/>
+ <location line="+131"/>
<source>The filter %1 is already registered!</source>
<translation>Filtr %1 jest już zarejestrowany!</translation>
</message>
@@ -263,17 +249,27 @@
<context>
<name>QHelpSearchQueryWidget</name>
<message>
- <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+200"/>
+ <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+411"/>
<source>Search for:</source>
<translation>Wyszukaj:</translation>
</message>
<message>
+ <location line="+5"/>
+ <source>Previous search</source>
+ <translation>Poprzednie wyszukiwanie</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Next search</source>
+ <translation>Następne wyszukiwanie</translation>
+ </message>
+ <message>
<location line="+2"/>
<source>Search</source>
<translation>Wyszukaj</translation>
</message>
<message>
- <location line="+16"/>
+ <location line="+20"/>
<source>Advanced search</source>
<translation>Wyszukiwanie zaawansowane</translation>
</message>
@@ -283,22 +279,22 @@
<translation>słowa &lt;B&gt;podobne&lt;/B&gt; do:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>&lt;B&gt;without&lt;/B&gt; the words:</source>
<translation>&lt;B&gt;bez&lt;/B&gt; słów:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;exact phrase&lt;/B&gt;:</source>
<translation>z &lt;B&gt;dokładnym wyrażeniem&lt;/B&gt;:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;all&lt;/B&gt; of the words:</source>
<translation>ze &lt;B&gt;wszystkimi&lt;/B&gt; słowami:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;at least one&lt;/B&gt; of the words:</source>
<translation>z &lt;B&gt;przynajmniej jednym&lt;/B&gt; ze słów:</translation>
</message>
@@ -327,15 +323,7 @@
<translation>Nienazwany</translation>
</message>
<message>
- <source>Unknown token at line %1.</source>
- <translation type="obsolete">Nieznany znak w linii %1.</translation>
- </message>
- <message>
- <source>Unknown token at line %1. Expected &quot;QtHelpProject&quot;!</source>
- <translation type="obsolete">Nieznany znak w linii %1. Spodziewano się &quot;QtHelpProject&quot;!</translation>
- </message>
- <message>
- <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+80"/>
+ <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+85"/>
<source>Unknown token.</source>
<translation>Nieznany znak.</translation>
</message>
@@ -375,7 +363,7 @@
<translation>Brak atrybutu w słowie kluczowym w linii %1.</translation>
</message>
<message>
- <location line="+83"/>
+ <location line="+123"/>
<source>The input file %1 could not be opened!</source>
<translation>Nie można otworzyć pliku wejściowego %1!</translation>
</message>
diff --git a/translations/qt_help_ru.ts b/translations/qt_help_ru.ts
index c2dc041..006a90b 100644
--- a/translations/qt_help_ru.ts
+++ b/translations/qt_help_ru.ts
@@ -120,7 +120,7 @@
<context>
<name>QHelpEngineCore</name>
<message>
- <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+516"/>
+ <location filename="../tools/assistant/lib/qhelpenginecore.cpp" line="+524"/>
<source>The specified namespace does not exist!</source>
<translation>Указанное пространство имён не существует!</translation>
</message>
@@ -128,7 +128,7 @@
<context>
<name>QHelpEngineCorePrivate</name>
<message>
- <location line="-394"/>
+ <location line="-402"/>
<source>Cannot open documentation file %1: %2!</source>
<translation>Не удалось открыть файл документации %1: %2!</translation>
</message>
@@ -233,33 +233,43 @@
<message>
<location line="+80"/>
<source>Insert contents...</source>
- <translation>Добавление содержания...</translation>
+ <translation>Добавление оглавления...</translation>
</message>
<message>
<location line="+8"/>
<source>Cannot insert contents!</source>
- <translation>Не удалось добавить содержание!</translation>
+ <translation>Не удалось добавить оглавление!</translation>
</message>
<message>
<location line="+12"/>
<source>Cannot register contents!</source>
- <translation>Не удалось зарегистрировать содержание!</translation>
+ <translation>Не удалось зарегистрировать оглавление!</translation>
</message>
</context>
<context>
<name>QHelpSearchQueryWidget</name>
<message>
- <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+200"/>
+ <location filename="../tools/assistant/lib/qhelpsearchquerywidget.cpp" line="+411"/>
<source>Search for:</source>
<translation>Искать:</translation>
</message>
<message>
+ <location line="+5"/>
+ <source>Previous search</source>
+ <translation>Предыдущий запрос</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Next search</source>
+ <translation>Следующий запрос</translation>
+ </message>
+ <message>
<location line="+2"/>
<source>Search</source>
<translation>Поиск</translation>
</message>
<message>
- <location line="+16"/>
+ <location line="+20"/>
<source>Advanced search</source>
<translation>Расширенный поиск</translation>
</message>
@@ -269,22 +279,22 @@
<translation>&lt;B&gt;похожие&lt;/B&gt; слова:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>&lt;B&gt;without&lt;/B&gt; the words:</source>
<translation>&lt;B&gt;не содержит&lt;/B&gt; слов:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;exact phrase&lt;/B&gt;:</source>
<translation>содержит &lt;B&gt;точную фразу&lt;/B&gt;:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;all&lt;/B&gt; of the words:</source>
<translation>содержит &lt;B&gt;все&lt;/B&gt; слова:</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>with &lt;B&gt;at least one&lt;/B&gt; of the words:</source>
<translation>содержит &lt;B&gt;хотя бы одно&lt;/B&gt; из слов:</translation>
</message>
@@ -313,7 +323,7 @@
<translation>Безымянный</translation>
</message>
<message>
- <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+80"/>
+ <location filename="../tools/assistant/lib/qhelpprojectdata.cpp" line="+85"/>
<source>Unknown token.</source>
<translation>Неизвестный идентификатор.</translation>
</message>
@@ -353,7 +363,7 @@
<translation>Отсутствует атрибут у ключевого слова в строке %1.</translation>
</message>
<message>
- <location line="+83"/>
+ <location line="+123"/>
<source>The input file %1 could not be opened!</source>
<translation>Невозможно открыть исходный файл %1!</translation>
</message>
diff --git a/translations/qt_pl.ts b/translations/qt_pl.ts
index 611ae43..424fd31 100644
--- a/translations/qt_pl.ts
+++ b/translations/qt_pl.ts
@@ -2,29 +2,24 @@
<!DOCTYPE TS>
<TS version="2.0" language="pl">
<context>
- <name>AudioOutput</name>
+ <name>CloseButton</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation>&lt;html&gt;Urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt; nie działa.&lt;br/&gt;Przywracanie do &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</translation>
+ <location filename="../src/gui/widgets/qtabbar.cpp" line="+2245"/>
+ <source>Close Tab</source>
+ <translation>Zamknij kartę</translation>
</message>
+</context>
+<context>
+ <name>FakeReply</name>
<message>
- <location line="+13"/>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation>&lt;html&gt;Przełączanie na urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;które właśnie stało się dostępne i ma wyższy priorytet.&lt;/html&gt;</translation>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2191"/>
+ <source>Fake error !</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation>Przywróć do urządzenia &apos;%1&apos;</translation>
- </message>
-</context>
-<context>
- <name>CloseButton</name>
- <message>
- <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/>
- <source>Close Tab</source>
- <translation>Zamknij kartę</translation>
+ <source>Invalid URL</source>
+ <translation>Niepoprawny URL</translation>
</message>
</context>
<context>
@@ -61,6 +56,24 @@
</message>
</context>
<context>
+ <name>Phonon::AudioOutput</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+377"/>
+ <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt; nie działa.&lt;br/&gt;Przywracanie do &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Przełączanie na urządzenie dźwiękowe &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;które właśnie stało się dostępne i ma wyższy priorytet.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>Przywróć do urządzenia &apos;%1&apos;</translation>
+ </message>
+</context>
+<context>
<name>Phonon::Gstreamer::Backend</name>
<message>
<location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
@@ -93,27 +106,27 @@ zainstalowałeś libgstreamer-plugins-base.</translation>
<message>
<location line="+113"/>
<source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation type="unfinished">Brak wymaganego kodeka. Aby odtworzyć zawartość musisz zainstalować poniższego kodeka: %0</translation>
+ <translation>Brak wymaganego kodeka. Aby odtworzyć zawartość musisz zainstalować poniższy kodek: %0</translation>
</message>
<message>
- <location line="+676"/>
+ <location line="+681"/>
<location line="+8"/>
<location line="+15"/>
- <location line="+9"/>
+ <location line="+22"/>
<location line="+6"/>
<location line="+19"/>
- <location line="+335"/>
+ <location line="+339"/>
<location line="+24"/>
<source>Could not open media source.</source>
<translation>Nie można otworzyć źródła mediów.</translation>
</message>
<message>
- <location line="-403"/>
+ <location line="-420"/>
<source>Invalid source type.</source>
<translation>Niepoprawny typ źródła.</translation>
</message>
<message>
- <location line="+377"/>
+ <location line="+394"/>
<source>Could not locate media source.</source>
<translation>Nie można znaleźć źródła mediów.</translation>
</message>
@@ -129,20 +142,87 @@ zainstalowałeś libgstreamer-plugins-base.</translation>
</message>
</context>
<context>
+ <name>Phonon::MMF</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/audiooutput.cpp" line="+108"/>
+ <source>Audio Output</source>
+ <translation>Wyjście dźwięku</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The audio output device</source>
+ <translation>Wyjściowe urządzenie dźwiękowe</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+75"/>
+ <source>Frequency band, %1 Hz</source>
+ <translation>Częstotliwość środkowa, %1 Hz</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/effectfactory.cpp" line="+65"/>
+ <source>audio equalizer</source>
+ <translation>Korektor graficzny</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Bass boost</source>
+ <translation>Wzmocnienie basów</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Distance Attenuation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <location line="+2"/>
+ <source>Environmental Reverb</source>
+ <translation>Pogłos środowiskowy</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Loudness</source>
+ <translation>Głośność</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Source Orientation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Stereo Widening</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>Phonon::VolumeSlider</name>
<message>
<location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
<location line="+18"/>
+ <location line="+129"/>
+ <location line="+15"/>
<source>Volume: %1%</source>
<translation>Głośność: %1%</translation>
</message>
<message>
- <location line="-15"/>
+ <location line="-159"/>
<location line="+18"/>
<location line="+54"/>
<source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
<translation>Użyj tego suwaka aby zmienić głośność. Skrajnie lewa pozycja to 0%, skrajnie prawa to %1%</translation>
</message>
+ <message>
+ <location line="+67"/>
+ <source>Muted</source>
+ <translation>Wyciszony</translation>
+ </message>
</context>
<context>
<name>Q3Accel</name>
@@ -188,7 +268,7 @@ zainstalowałeś libgstreamer-plugins-base.</translation>
<context>
<name>Q3FileDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+4530"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+4495"/>
<source>%1
File not found.
Check path and filename.</source>
@@ -202,15 +282,15 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>&lt;qt&gt;Na pewno chcesz skasować %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
</message>
<message>
- <location line="-1928"/>
+ <location line="-1924"/>
<location line="+49"/>
- <location line="+2153"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
+ <location line="+2149"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+112"/>
<source>All Files (*)</source>
<translation>Wszystkie pliki (*)</translation>
</message>
<message>
- <location line="-2084"/>
+ <location line="-2080"/>
<source>Attributes</source>
<translation>Atrybuty</translation>
</message>
@@ -220,18 +300,18 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Powrót</translation>
</message>
<message>
- <location line="-1620"/>
- <location line="+1575"/>
+ <location line="-1624"/>
+ <location line="+1579"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
<message>
- <location line="-1597"/>
+ <location line="-1601"/>
<source>Copy or Move a File</source>
<translation>Skopiuj lub przenieś plik</translation>
</message>
<message>
- <location line="+1658"/>
+ <location line="+1662"/>
<source>Create New Folder</source>
<translation>Utwórz nowy katalog</translation>
</message>
@@ -241,7 +321,7 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Data</translation>
</message>
<message>
- <location line="+1724"/>
+ <location line="+1720"/>
<source>&amp;Delete</source>
<translation>&amp;Skasuj</translation>
</message>
@@ -251,12 +331,12 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Skasuj %1</translation>
</message>
<message>
- <location line="-1683"/>
+ <location line="-1679"/>
<source>Detail View</source>
<translation>Szczegóły</translation>
</message>
<message>
- <location line="+129"/>
+ <location line="+125"/>
<source>Dir</source>
<translation>Katalog</translation>
</message>
@@ -273,29 +353,29 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
</message>
<message>
<location line="+40"/>
- <location line="+1110"/>
+ <location line="+1009"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
- <location line="-2963"/>
+ <location line="-2862"/>
<source>File</source>
<translation>Plik</translation>
</message>
<message>
- <location line="-178"/>
- <location line="+1981"/>
+ <location line="-174"/>
+ <location line="+1977"/>
<location line="+16"/>
<source>File &amp;name:</source>
<translation>Nazwa &amp;pliku:</translation>
</message>
<message>
- <location line="-1996"/>
+ <location line="-1992"/>
<source>File &amp;type:</source>
<translation>&amp;Rodzaj pliku:</translation>
</message>
<message>
- <location line="+1879"/>
+ <location line="+1875"/>
<source>Find Directory</source>
<translation>Znajdź katalog</translation>
</message>
@@ -305,7 +385,7 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Niedostępny</translation>
</message>
<message>
- <location line="-131"/>
+ <location line="-127"/>
<source>List View</source>
<translation>Lista</translation>
</message>
@@ -320,7 +400,7 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Nazwa</translation>
</message>
<message>
- <location line="+1858"/>
+ <location line="+1854"/>
<source>New Folder</source>
<translation>Nowy katalog</translation>
</message>
@@ -340,18 +420,18 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>&amp;Nie</translation>
</message>
<message>
- <location line="-1777"/>
- <location line="+2031"/>
+ <location line="-1773"/>
+ <location line="+2027"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
- <location line="-1975"/>
+ <location line="-1971"/>
<source>One directory up</source>
<translation>Katalog wyżej</translation>
</message>
<message>
- <location line="+1621"/>
+ <location line="+1617"/>
<location line="+5"/>
<location line="+355"/>
<source>&amp;Open</source>
@@ -359,23 +439,23 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
</message>
<message>
<location line="-1112"/>
- <location line="+2100"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
+ <location line="+1999"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+209"/>
<source>Open</source>
<translation>Otwórz</translation>
</message>
<message>
- <location line="-2902"/>
+ <location line="-2801"/>
<source>Preview File Contents</source>
<translation>Podgląd zawartości pliku</translation>
</message>
<message>
- <location line="-23"/>
+ <location line="-19"/>
<source>Preview File Info</source>
<translation>Podgląd informacji o pliku</translation>
</message>
<message>
- <location line="-1685"/>
+ <location line="-1689"/>
<source>Read: %1</source>
<translation>Czytaj: %1</translation>
</message>
@@ -407,7 +487,7 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
</message>
<message>
<location line="-986"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+71"/>
<source>Save As</source>
<translation>Zachowaj jako</translation>
</message>
@@ -417,12 +497,12 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>Pokaż &amp;ukryte pliki</translation>
</message>
<message>
- <location line="-1775"/>
+ <location line="-1771"/>
<source>Size</source>
<translation>Rozmiar</translation>
</message>
<message>
- <location line="+1771"/>
+ <location line="+1767"/>
<source>Sort</source>
<translation>Sortuj</translation>
</message>
@@ -477,12 +557,12 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>dowiązanie symboliczne</translation>
</message>
<message>
- <location line="-1808"/>
+ <location line="-1804"/>
<source>Type</source>
<translation>Rodzaj</translation>
</message>
<message>
- <location line="+1754"/>
+ <location line="+1750"/>
<source>&amp;Unsorted</source>
<translation>&amp;Bez sortowania</translation>
</message>
@@ -503,17 +583,17 @@ Sprawdź ścieżkę i nazwę pliku.</translation>
<translation>&amp;Tak</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-191"/>
<source>All Files (*.*)</source>
<translation>Wszystkie pliki (*.*)</translation>
</message>
<message>
- <location line="+375"/>
+ <location line="+264"/>
<source>Open </source>
<translation>Otwórz </translation>
</message>
<message>
- <location line="+155"/>
+ <location line="+107"/>
<source>Select a Directory</source>
<translation>Wybierz katalog</translation>
</message>
@@ -601,7 +681,7 @@ na
<context>
<name>Q3TabDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+647"/>
+ <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+648"/>
<source>Apply</source>
<translation>Zatwierdź</translation>
</message>
@@ -622,7 +702,7 @@ na
</message>
<message>
<location line="-501"/>
- <location line="+814"/>
+ <location line="+824"/>
<source>OK</source>
<translation>OK</translation>
</message>
@@ -704,22 +784,22 @@ na
<translation>Zminimalizuj</translation>
</message>
<message>
- <location line="+28"/>
+ <location line="+27"/>
+ <source>Puts a minimized window back to normal</source>
+ <translation>Przywraca normalny rozmiar uprzednio zminimalizowanego okna</translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Moves the window out of the way</source>
<translation>Przenosi okno w inne położenie</translation>
</message>
<message>
<location line="+3"/>
<source>Puts a maximized window back to normal</source>
- <translation>Przywraca normalny rozmiar poprzednio zmaksymalizowanego okna</translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Puts a minimized back to normal</source>
- <translation>Przywraca normalny rozmiar poprzednio zminimalizowanego okna</translation>
+ <translation>Przywraca normalny rozmiar uprzednio zmaksymalizowanego okna</translation>
</message>
<message>
- <location line="-24"/>
+ <location line="-28"/>
<source>Restore down</source>
<translation>Przywróć pod spód</translation>
</message>
@@ -825,9 +905,9 @@ na
<context>
<name>QAbstractSocket</name>
<message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="+918"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+618"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+687"/>
+ <location filename="../src/network/socket/qabstractsocket.cpp" line="+940"/>
+ <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+636"/>
+ <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+691"/>
<source>Connection refused</source>
<translation>Połączenie odrzucone</translation>
</message>
@@ -840,19 +920,19 @@ na
<translation>Host nie znaleziony</translation>
</message>
<message>
- <location line="+191"/>
+ <location line="+192"/>
<source>Connection timed out</source>
<translation>Przekroczony czas połączenia</translation>
</message>
<message>
- <location line="-547"/>
- <location line="+787"/>
+ <location line="-548"/>
+ <location line="+789"/>
<location line="+208"/>
<source>Operation on socket is not supported</source>
<translation>Operacja na gnieździe nieobsługiwana</translation>
</message>
<message>
- <location line="+517"/>
+ <location line="+567"/>
<source>Socket is not connected</source>
<translation>Gniazdo nie jest podłączone</translation>
</message>
@@ -870,7 +950,7 @@ na
<context>
<name>QAbstractSpinBox</name>
<message>
- <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1201"/>
+ <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1219"/>
<source>Step &amp;down</source>
<translation>Krok w &amp;dół</translation>
</message>
@@ -898,7 +978,7 @@ na
<translation>Uaktywnia główne okno programu</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
+ <location filename="../src/gui/dialogs/qmessagebox.h" line="+354"/>
<source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
<translation>Program &apos;%1&apos; wymaga do uruchomienia Qt %2, znaleziono Qt %3.</translation>
</message>
@@ -908,7 +988,7 @@ na
<translation>Niekompatybilność biblioteki Qt</translation>
</message>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/>
+ <location filename="../src/gui/kernel/qapplication.cpp" line="+2293"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>LTR</translation>
@@ -958,12 +1038,12 @@ na
<context>
<name>QColorDialog</name>
<message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1499"/>
+ <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1638"/>
<source>&amp;Add to Custom Colors</source>
<translation>&amp;Dodaj do własnych kolorów</translation>
</message>
<message>
- <location line="-240"/>
+ <location line="-283"/>
<source>A&amp;lpha channel:</source>
<translation>Kanał &amp;alfa:</translation>
</message>
@@ -973,22 +1053,22 @@ na
<translation>Wybierz kolor</translation>
</message>
<message>
- <location line="+137"/>
+ <location line="+180"/>
<source>&amp;Basic colors</source>
<translation>&amp;Kolory podstawowe</translation>
</message>
<message>
- <location line="-239"/>
+ <location line="-282"/>
<source>Bl&amp;ue:</source>
<translation>Błęki&amp;t:</translation>
</message>
<message>
- <location line="+240"/>
+ <location line="+283"/>
<source>&amp;Custom colors</source>
<translation>Wła&amp;sne kolory</translation>
</message>
<message>
- <location line="-241"/>
+ <location line="-284"/>
<source>&amp;Green:</source>
<translation>&amp;Zieleń:</translation>
</message>
@@ -1022,7 +1102,7 @@ na
<translation>Otwórz</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/>
+ <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+556"/>
<source>False</source>
<translation>Fałsz</translation>
</message>
@@ -1040,29 +1120,28 @@ na
<context>
<name>QCoreApplication</name>
<message>
- <source>%1: permission denied</source>
- <comment>QSystemSemaphore</comment>
- <translation type="obsolete">%1: brak dostępu</translation>
- </message>
- <message>
+ <location filename="../src/corelib/kernel/qsystemsemaphore_symbian.cpp" line="+65"/>
<source>%1: already exists</source>
<comment>QSystemSemaphore</comment>
- <translation type="obsolete">%1: już istnieje</translation>
+ <translation>%1: już istnieje</translation>
</message>
<message>
- <source>%1: doesn&apos;t exists</source>
+ <location line="+4"/>
+ <source>%1: does not exist</source>
<comment>QSystemSemaphore</comment>
- <translation type="obsolete">%1: nie istnieje</translation>
+ <translation>%1: nie istnieje</translation>
</message>
<message>
+ <location line="+5"/>
<source>%1: out of resources</source>
<comment>QSystemSemaphore</comment>
- <translation type="obsolete">%1: zasoby wyczerpane</translation>
+ <translation>%1: zasoby wyczerpane</translation>
</message>
<message>
+ <location line="+4"/>
<source>%1: unknown error %2</source>
<comment>QSystemSemaphore</comment>
- <translation type="obsolete">%1: nieznany błąd %2</translation>
+ <translation>%1: nieznany błąd %2</translation>
</message>
<message>
<location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
@@ -1086,19 +1165,19 @@ na
<context>
<name>QDB2Driver</name>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
+ <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1254"/>
<source>Unable to connect</source>
<translation>Nie można nawiązać połączenia</translation>
</message>
<message>
- <location line="+303"/>
+ <location line="+298"/>
<source>Unable to commit transaction</source>
<translation>Nie można dokonać transakcji</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
</message>
<message>
<location line="+15"/>
@@ -1109,33 +1188,33 @@ na
<context>
<name>QDB2Result</name>
<message>
- <location line="-1043"/>
- <location line="+243"/>
+ <location line="-1031"/>
+ <location line="+240"/>
<source>Unable to execute statement</source>
<translation>Nie można wykonać polecenia</translation>
</message>
<message>
- <location line="-206"/>
+ <location line="-203"/>
<source>Unable to prepare statement</source>
<translation>Nie można przygotować polecenia</translation>
</message>
<message>
- <location line="+196"/>
+ <location line="+193"/>
<source>Unable to bind variable</source>
<translation>Nie można powiązać zmiennej</translation>
</message>
<message>
- <location line="+92"/>
+ <location line="+89"/>
<source>Unable to fetch record %1</source>
<translation>Nie można pobrać rekordu %1</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+19"/>
<source>Unable to fetch next</source>
<translation>Nie można pobrać kolejnego wiersza danych</translation>
</message>
<message>
- <location line="+20"/>
+ <location line="+21"/>
<source>Unable to fetch first</source>
<translation>Nie można pobrać pierwszego wiersza danych</translation>
</message>
@@ -1143,7 +1222,7 @@ na
<context>
<name>QDateTimeEdit</name>
<message>
- <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
+ <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2287"/>
<source>am</source>
<translation>am</translation>
</message>
@@ -1184,12 +1263,12 @@ na
<context>
<name>QDialog</name>
<message>
- <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
+ <location filename="../src/gui/dialogs/qdialog.cpp" line="+636"/>
<source>What&apos;s This?</source>
<translation>Co to jest?</translation>
</message>
<message>
- <location line="-115"/>
+ <location line="-135"/>
<source>Done</source>
<translation>Wykonano</translation>
</message>
@@ -1197,7 +1276,7 @@ na
<context>
<name>QDialogButtonBox</name>
<message>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+608"/>
+ <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+654"/>
<source>Abort</source>
<translation>Przerwij</translation>
</message>
@@ -1267,7 +1346,7 @@ na
<translation>Ni&amp;e dla wszystkich</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/>
+ <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1872"/>
<location line="+464"/>
<location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="-41"/>
<source>OK</source>
@@ -1322,7 +1401,7 @@ na
<context>
<name>QDirModel</name>
<message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+465"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+469"/>
<source>Date Modified</source>
<translation>Data modyfikacji</translation>
</message>
@@ -1383,7 +1462,7 @@ na
<context>
<name>QErrorMessage</name>
<message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+192"/>
+ <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+208"/>
<source>Debug Message:</source>
<translation>Komunikat dla programisty:</translation>
</message>
@@ -1393,7 +1472,7 @@ na
<translation>Błąd krytyczny:</translation>
</message>
<message>
- <location line="+194"/>
+ <location line="+200"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -1403,7 +1482,7 @@ na
<translation>&amp;Pokaż ten komunikat ponownie</translation>
</message>
<message>
- <location line="-196"/>
+ <location line="-202"/>
<source>Warning:</source>
<translation>Ostrzeżenie:</translation>
</message>
@@ -1411,41 +1490,46 @@ na
<context>
<name>QFile</name>
<message>
- <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
- <location line="+141"/>
+ <location filename="../src/corelib/io/qfile.cpp" line="+697"/>
+ <location line="+155"/>
<source>Destination file exists</source>
- <translation type="unfinished"></translation>
+ <translation>Plik wyjściowy już istnieje</translation>
</message>
<message>
- <location line="-108"/>
+ <location line="-140"/>
+ <source>Will not rename sequential file using block copy</source>
+ <translation>Nie można zmienić nazwy pliku sekwencyjnego używając kopiowania blokowego</translation>
+ </message>
+ <message>
+ <location line="+23"/>
<source>Cannot remove source file</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można usunąć oryginalnego pilku</translation>
</message>
<message>
- <location line="+120"/>
+ <location line="+130"/>
<source>Cannot open %1 for input</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można otworzyć pliku wejściowego %1</translation>
</message>
<message>
<location line="+17"/>
<source>Cannot open for output</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można otworzyć pliku wyjściowego</translation>
</message>
<message>
<location line="+10"/>
<source>Failure to write block</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można zapisać bloku</translation>
</message>
<message>
<location line="+13"/>
<source>Cannot create %1 for output</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można utworzyć pliku wyjściowego %1</translation>
</message>
</context>
<context>
<name>QFileDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+2013"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+2049"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>%1 już istnieje.
@@ -1483,45 +1567,45 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Czy na pewno chcesz skasować &apos;%1&apos;?</translation>
</message>
<message>
- <location line="+422"/>
+ <location line="+425"/>
<source>Recent Places</source>
- <translation type="unfinished"></translation>
+ <translation>Ostatnie miejsca</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Back</source>
<translation>Powrót</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-407"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-410"/>
<source>Could not delete directory.</source>
<translation>Nie można skasować katalogu.</translation>
</message>
<message>
- <location line="-2113"/>
+ <location line="-2106"/>
<source>&amp;Delete</source>
<translation>&amp;Skasuj</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Detail View</source>
<translation>Szczegóły</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+651"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+662"/>
<source>Directories</source>
<translation>Katalogi</translation>
</message>
<message>
- <location line="-644"/>
- <location line="+648"/>
+ <location line="-655"/>
+ <location line="+659"/>
<source>Directory:</source>
<translation>Katalog:</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+411"/>
+ <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+461"/>
<source>Drive</source>
<translation>Urządzenie</translation>
</message>
@@ -1532,14 +1616,38 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Plik</translation>
</message>
<message>
+ <location line="+5"/>
+ <source>File Folder</source>
+ <comment>Match Windows Explorer</comment>
+ <translation>Katalog</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Folder</source>
+ <comment>All other platforms</comment>
+ <translation>Katalog</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Alias</source>
+ <comment>Mac OS X Finder</comment>
+ <translation>Alias</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shortcut</source>
+ <comment>All other platforms</comment>
+ <translation>Skrót</translation>
+ </message>
+ <message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Files of type:</source>
<translation>Pliki rodzaju:</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>List View</source>
<translation>Lista</translation>
</message>
@@ -1551,35 +1659,34 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location filename="../src/gui/dialogs/qfiledialog.cpp" line="-7"/>
<location line="+50"/>
- <location line="+1471"/>
- <location line="+75"/>
+ <location line="+1528"/>
<source>&amp;Open</source>
<translation>&amp;Otwórz</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Parent Directory</source>
<translation>Katalog wyżej</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2245"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2238"/>
<source>&amp;Rename</source>
<translation>&amp;Zmień nazwę</translation>
</message>
<message>
- <location line="+649"/>
+ <location line="+660"/>
<location line="+50"/>
<source>&amp;Save</source>
<translation>&amp;Zachowaj</translation>
</message>
<message>
- <location line="-697"/>
+ <location line="-708"/>
<source>Show &amp;hidden files</source>
<translation>Pokaż &amp;ukryte pliki</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+29"/>
+ <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+7"/>
<source>Unknown</source>
<translation>Nieznany</translation>
</message>
@@ -1599,7 +1706,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Znajdź katalog</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
+ <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+174"/>
<source>All Files (*.*)</source>
<translation>Wszystkie pliki (*.*)</translation>
</message>
@@ -1610,52 +1717,52 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Forward</source>
<translation>Do przodu</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1970"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1963"/>
<source>New Folder</source>
<translation>Nowy katalog</translation>
</message>
<message>
- <location line="-1963"/>
+ <location line="-1956"/>
<source>&amp;New Folder</source>
<translation>&amp;Nowy katalog</translation>
</message>
<message>
- <location line="+656"/>
+ <location line="+667"/>
<location line="+38"/>
<source>&amp;Choose</source>
<translation>&amp;Wybierz</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/>
+ <location filename="../src/gui/dialogs/qsidebar.cpp" line="+442"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-711"/>
- <location line="+444"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-722"/>
+ <location line="+450"/>
<source>All Files (*)</source>
<translation>Wszystkie pliki (*)</translation>
</message>
<message>
- <location line="-420"/>
- <location line="+652"/>
+ <location line="-426"/>
+ <location line="+663"/>
<source>File &amp;name:</source>
<translation>Nazwa &amp;pliku:</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Look in:</source>
<translation>Szukaj w:</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Create New Folder</source>
<translation>Utwórz nowy katalog</translation>
</message>
@@ -1664,26 +1771,31 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<name>QFileSystemModel</name>
<message>
<location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+476"/>
<source>%1 TB</source>
<translation>%1 TB</translation>
</message>
<message>
<location line="+2"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+2"/>
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
<message>
<location line="+2"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+2"/>
<source>%1 MB</source>
<translation>%1 MB</translation>
</message>
<message>
<location line="+2"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+2"/>
<source>%1 KB</source>
<translation>%1 KB</translation>
</message>
<message>
<location line="+1"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+1"/>
<source>%1 bytes</source>
<translation>%1 b</translation>
</message>
@@ -1698,7 +1810,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>&lt;b&gt;Nazwa &quot;%1&quot; nie może zostać użyta.&lt;/b&gt;&lt;p&gt;Spróbuj użyć nowej nazwy z mniejszą liczbą znaków lub bez znaków przystankowych.</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+64"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
@@ -1725,7 +1837,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Data modyfikacji</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/>
+ <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+258"/>
<source>My Computer</source>
<translation>Mój komputer</translation>
</message>
@@ -1738,58 +1850,58 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QFontDatabase</name>
<message>
- <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
- <location line="+1176"/>
+ <location filename="../src/gui/text/qfontdatabase.cpp" line="+102"/>
+ <location line="+1334"/>
<source>Normal</source>
<translation>Normalny</translation>
</message>
<message>
- <location line="-1173"/>
+ <location line="-1331"/>
<location line="+12"/>
- <location line="+1149"/>
+ <location line="+1307"/>
<source>Bold</source>
<translation>Pogrubiony</translation>
</message>
<message>
- <location line="-1158"/>
- <location line="+1160"/>
+ <location line="-1316"/>
+ <location line="+1318"/>
<source>Demi Bold</source>
<translation>Na wpół pogrubiony</translation>
</message>
<message>
- <location line="-1157"/>
+ <location line="-1315"/>
<location line="+18"/>
- <location line="+1135"/>
+ <location line="+1293"/>
<source>Black</source>
<translatorcomment>it&apos;s about font weight</translatorcomment>
<translation>Bardzo gruby</translation>
</message>
<message>
- <location line="-1145"/>
+ <location line="-1303"/>
<source>Demi</source>
<translation>Na wpół</translation>
</message>
<message>
<location line="+6"/>
- <location line="+1145"/>
+ <location line="+1303"/>
<source>Light</source>
<translatorcomment>it&apos;s about font weight</translatorcomment>
<translation>Cienki</translation>
</message>
<message>
- <location line="-1004"/>
- <location line="+1007"/>
+ <location line="-1157"/>
+ <location line="+1160"/>
<source>Italic</source>
<translation>Kursywa</translation>
</message>
<message>
- <location line="-1004"/>
- <location line="+1006"/>
+ <location line="-1157"/>
+ <location line="+1159"/>
<source>Oblique</source>
<translation>Pochyły</translation>
</message>
<message>
- <location line="+705"/>
+ <location line="+703"/>
<source>Any</source>
<translation>Każdy</translation>
</message>
@@ -1957,12 +2069,12 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QFontDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+775"/>
+ <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+782"/>
<source>Effects</source>
<translation>Efekty</translation>
</message>
<message>
- <location line="-3"/>
+ <location line="-6"/>
<source>&amp;Font</source>
<translation>&amp;Czcionka</translation>
</message>
@@ -1972,23 +2084,23 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>St&amp;yl czcionki</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+9"/>
<source>Sample</source>
<translation>Przykład</translation>
</message>
<message>
- <location line="-603"/>
- <location line="+247"/>
+ <location line="-608"/>
+ <location line="+257"/>
<source>Select Font</source>
<translation>Wybierz czcionkę</translation>
</message>
<message>
- <location line="+352"/>
+ <location line="+343"/>
<source>&amp;Size</source>
<translation>&amp;Rozmiar</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+6"/>
<source>Stri&amp;keout</source>
<translation>Pr&amp;zekreślenie</translation>
</message>
@@ -2006,7 +2118,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QFtp</name>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+2330"/>
+ <location filename="../src/network/access/qftp.cpp" line="+2337"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+2024"/>
<source>Changing directory failed:
%1</source>
@@ -2019,14 +2131,14 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Podłączony do hosta</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="-1327"/>
+ <location filename="../src/network/access/qftp.cpp" line="-1329"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-1458"/>
<location line="+1451"/>
<source>Connected to host %1</source>
<translation>Podłączony do hosta %1</translation>
</message>
<message>
- <location line="+1315"/>
+ <location line="+1317"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-290"/>
<source>Connecting to host failed:
%1</source>
@@ -2041,7 +2153,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Połączenie zamknięte</translation>
</message>
<message>
- <location line="-1156"/>
+ <location line="-1158"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-1299"/>
<source>Connection refused for data connection</source>
<translation>Połączenie do przesyłu danych odrzucone</translation>
@@ -2058,7 +2170,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Połączenie do %1 zakończone</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+1451"/>
+ <location filename="../src/network/access/qftp.cpp" line="+1453"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-271"/>
<source>Creating directory failed:
%1</source>
@@ -2079,7 +2191,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Host %1 znaleziony</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="-1443"/>
+ <location filename="../src/network/access/qftp.cpp" line="-1445"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-1555"/>
<source>Host %1 not found</source>
<translation>Host %1 nie znaleziony</translation>
@@ -2090,7 +2202,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Host znaleziony</translation>
</message>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+1435"/>
+ <location filename="../src/network/access/qftp.cpp" line="+1437"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-289"/>
<source>Listing directory failed:
%1</source>
@@ -2106,18 +2218,18 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
%1</translation>
</message>
<message>
- <location line="-1496"/>
+ <location line="-1501"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-1335"/>
<source>Not connected</source>
<translation>Nie podłączony</translation>
</message>
<message>
- <location line="+73"/>
+ <location line="+76"/>
<source>Connection timed out to host %1</source>
<translation>Przekroczony czas połączenia do hosta %1</translation>
</message>
<message>
- <location line="+1451"/>
+ <location line="+1453"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+1356"/>
<source>Removing directory failed:
%1</source>
@@ -2133,7 +2245,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
%1</translation>
</message>
<message>
- <location line="-942"/>
+ <location line="-944"/>
<location line="+29"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="-823"/>
<location line="+728"/>
@@ -2141,7 +2253,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nieznany błąd</translation>
</message>
<message>
- <location line="+909"/>
+ <location line="+911"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+92"/>
<source>Uploading file failed:
%1</source>
@@ -2160,19 +2272,15 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QHostInfoAgent</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
- <location line="+9"/>
- <location line="+64"/>
- <location line="+31"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/>
- <location line="+9"/>
- <location line="+40"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+257"/>
+ <location line="+32"/>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+220"/>
<location line="+27"/>
<source>Host not found</source>
<translation>Host nie znaleziony</translation>
</message>
<message>
- <location line="-44"/>
+ <location line="-45"/>
<location line="+39"/>
<location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
<location line="+29"/>
@@ -2180,17 +2288,27 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nieznany typ adresu</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+10"/>
<location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
<location line="+27"/>
<source>Unknown error</source>
<translation>Nieznany błąd</translation>
</message>
+ <message>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-67"/>
+ <source>No host name given</source>
+ <translation>Nie podano nazwy hosta</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Invalid hostname</source>
+ <translation>Niepoprawna nazwa hosta</translation>
+ </message>
</context>
<context>
<name>QHttp</name>
<message>
- <location filename="../src/qt3support/network/q3http.cpp" line="+2309"/>
+ <location filename="../src/qt3support/network/q3http.cpp" line="+2308"/>
<source>Connected to host</source>
<translation>Podłączony do hosta</translation>
</message>
@@ -2200,7 +2318,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Podłączony do hosta %1</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+879"/>
+ <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+572"/>
<location filename="../src/qt3support/network/q3http.cpp" line="+17"/>
<source>Connection closed</source>
<translation>Połączenie zakończone</translation>
@@ -2222,7 +2340,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Host %1 znaleziony</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+2631"/>
+ <location filename="../src/network/access/qhttp.cpp" line="+2634"/>
<location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/>
<location filename="../src/qt3support/network/q3http.cpp" line="-453"/>
<source>Host %1 not found</source>
@@ -2282,12 +2400,12 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nieznany błąd</translation>
</message>
<message>
- <location line="-2029"/>
+ <location line="-2032"/>
<source>HTTPS connection requested but SSL support not compiled in</source>
<translation>Zażądano połączenia HTTPS lecz obsługa SSL nie jest wkompilowana</translation>
</message>
<message>
- <location line="+2204"/>
+ <location line="+2207"/>
<location filename="../src/qt3support/network/q3http.cpp" line="+67"/>
<source>Wrong content length</source>
<translation>Błędna długość zawartości</translation>
@@ -2295,7 +2413,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="+183"/>
<source>Unknown authentication method</source>
- <translation type="unfinished"></translation>
+ <translation>Nieznana metoda autoryzacji</translation>
</message>
<message>
<location line="+10"/>
@@ -2310,7 +2428,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="+169"/>
<source>Error writing response to device</source>
- <translation type="unfinished"></translation>
+ <translation>Błąd zapisywania odpowiedzi do urządzenia</translation>
</message>
<message>
<location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-16"/>
@@ -2394,7 +2512,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QIBaseDriver</name>
<message>
- <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1482"/>
+ <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1545"/>
<source>Could not start transaction</source>
<translation>Nie można rozpocząć transakcji</translation>
</message>
@@ -2411,24 +2529,24 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="+13"/>
<source>Unable to rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
</message>
</context>
<context>
<name>QIBaseResult</name>
<message>
- <location line="-620"/>
+ <location line="-665"/>
<source>Could not allocate statement</source>
<translation>Nie można zaallokować polecenia</translation>
</message>
<message>
<location line="+10"/>
- <location line="+7"/>
+ <location line="+11"/>
<source>Could not describe input statement</source>
<translation>Nie można opisać polecenia wejściowego</translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+14"/>
<source>Could not describe statement</source>
<translation>Nie można opisać polecenia</translation>
</message>
@@ -2438,58 +2556,58 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można pobrać kolejnego elementu</translation>
</message>
<message>
- <location line="-512"/>
- <location line="+189"/>
+ <location line="-527"/>
+ <location line="+187"/>
<source>Could not find array</source>
<translation>Nie można odnaleźć tablicy</translation>
</message>
<message>
- <location line="-157"/>
+ <location line="-155"/>
<source>Could not get array data</source>
<translation>Nie można pobrać danych z tablicy</translation>
</message>
<message>
- <location line="+212"/>
+ <location line="+210"/>
<source>Could not get query info</source>
<translation>Nie można pobrać informacji o zapytaniu</translation>
</message>
<message>
- <location line="+428"/>
+ <location line="+482"/>
<source>Could not get statement info</source>
<translation>Nie można pobrać informacji o poleceniu</translation>
</message>
<message>
- <location line="-351"/>
+ <location line="-396"/>
<source>Could not prepare statement</source>
<translation>Nie można przygotować polecenia</translation>
</message>
<message>
- <location line="-57"/>
+ <location line="-66"/>
<source>Could not start transaction</source>
<translation>Nie można rozpocząć transakcji</translation>
</message>
<message>
- <location line="+194"/>
+ <location line="+211"/>
<source>Unable to close statement</source>
<translation>Nie można zamknąć polecenia</translation>
</message>
<message>
- <location line="-175"/>
+ <location line="-192"/>
<source>Unable to commit transaction</source>
<translation>Nie można dokonać transakcji</translation>
</message>
<message>
- <location line="-444"/>
+ <location line="-442"/>
<source>Unable to create BLOB</source>
<translation>Nie można utworzyć obiektu typu BLOB</translation>
</message>
<message>
- <location line="+627"/>
+ <location line="+642"/>
<source>Unable to execute query</source>
<translation>Nie można wykonać zapytania</translation>
</message>
<message>
- <location line="-607"/>
+ <location line="-622"/>
<source>Unable to open BLOB</source>
<translation>Nie można otworzyć obiektu typu BLOB</translation>
</message>
@@ -2507,7 +2625,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QIODevice</name>
<message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+1878"/>
+ <location filename="../src/corelib/global/qglobal.cpp" line="+2067"/>
<source>No space left on device</source>
<translation>Brak wolnego miejsca na urządzeniu</translation>
</message>
@@ -2527,7 +2645,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Zbyt wiele otwartych plików</translation>
</message>
<message>
- <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/>
+ <location filename="../src/corelib/io/qiodevice.cpp" line="+1561"/>
<source>Unknown error</source>
<translation>Nieznany błąd</translation>
</message>
@@ -2535,7 +2653,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QInputContext</name>
<message>
- <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+273"/>
+ <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+291"/>
<source>Mac OS X input method</source>
<translation>Metoda wprowadzania Mac OS X</translation>
</message>
@@ -2545,15 +2663,25 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Metoda wprowadzania Windows</translation>
</message>
<message>
- <location line="-27"/>
+ <location line="-31"/>
<source>XIM</source>
<translation>XIM</translation>
</message>
<message>
+ <location line="+4"/>
+ <source>FEP</source>
+ <translation>FEP</translation>
+ </message>
+ <message>
<location line="+23"/>
<source>XIM input method</source>
<translation>Metoda wprowadzania XIM</translation>
</message>
+ <message>
+ <location line="+12"/>
+ <source>S60 FEP input method</source>
+ <translation>Metoda wprowadzania S60 FEP</translation>
+ </message>
</context>
<context>
<name>QInputDialog</name>
@@ -2566,7 +2694,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QLibrary</name>
<message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
+ <location filename="../src/corelib/plugin/qlibrary.cpp" line="+383"/>
<source>Could not mmap &apos;%1&apos;: %2</source>
<translation>Nie można wykonać przypisania &apos;%1&apos;: %2</translation>
</message>
@@ -2581,7 +2709,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Błąd podczas weryfikacji danych we wtyczce &apos;%1&apos;</translation>
</message>
<message>
- <location line="+308"/>
+ <location line="+347"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
<translation>Wtyczka &apos;%1&apos; używa niepoprawnej wersji biblioteki QT. (%2.%3.%4) [%5]</translation>
</message>
@@ -2591,13 +2719,13 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Wtyczka &apos;%1&apos; używa niepoprawnej wersji biblioteki QT. Oczekiwano klucza &quot;%2&quot;, uzyskano &quot;%3&quot;</translation>
</message>
<message>
- <location line="+340"/>
+ <location line="+365"/>
<source>Unknown error</source>
<translation>Nieznany błąd</translation>
</message>
<message>
- <location line="-377"/>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
+ <location line="-402"/>
+ <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+343"/>
<source>The shared library was not found.</source>
<translation>Biblioteka współdzielona niedostępna.</translation>
</message>
@@ -2612,19 +2740,19 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Wtyczka &quot;%1&quot; używa innej wersji biblioteki Qt. (Nie można łączyć bibliotek zwykłych i debugowych.)</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
+ <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+236"/>
+ <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+87"/>
<source>Cannot load library %1: %2</source>
<translation>Nie można załadować biblioteki %1: %2</translation>
</message>
<message>
- <location line="+16"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
+ <location line="+17"/>
+ <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+22"/>
<source>Cannot unload library %1: %2</source>
<translation>Nie można zwolnić biblioteki %1: %2</translation>
</message>
<message>
- <location line="+31"/>
+ <location line="+34"/>
<location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
<source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
<translation>Nie można zidentyfikować symbolu &quot;%1&quot; w %2: %3</translation>
@@ -2633,19 +2761,19 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QLineEdit</name>
<message>
- <location filename="../src/gui/widgets/qlineedit.cpp" line="+2695"/>
+ <location filename="../src/gui/widgets/qlineedit.cpp" line="+1996"/>
<source>&amp;Copy</source>
<translation>S&amp;kopiuj</translation>
</message>
<message>
- <location line="-4"/>
+ <location line="-5"/>
<source>Cu&amp;t</source>
<translation>W&amp;ytnij</translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+15"/>
<source>Delete</source>
- <translation>Usuń</translation>
+ <translation>Skasuj</translation>
</message>
<message>
<location line="-5"/>
@@ -2653,17 +2781,17 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>&amp;Wklej</translation>
</message>
<message>
- <location line="-15"/>
+ <location line="-17"/>
<source>&amp;Redo</source>
<translation>&amp;Przywróć</translation>
</message>
<message>
- <location line="+26"/>
+ <location line="+28"/>
<source>Select All</source>
<translation>Zaznacz wszystko</translation>
</message>
<message>
- <location line="-30"/>
+ <location line="-32"/>
<source>&amp;Undo</source>
<translation>&amp;Cofnij</translation>
</message>
@@ -2671,8 +2799,8 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QLocalServer</name>
<message>
- <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/>
+ <location filename="../src/network/socket/qlocalserver.cpp" line="+224"/>
+ <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+256"/>
<source>%1: Name error</source>
<translation>%1: Błąd nazwy</translation>
</message>
@@ -2688,7 +2816,6 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
</message>
<message>
<location line="+5"/>
- <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/>
<source>%1: Unknown error %2</source>
<translation>%1: Nieznany błąd %2</translation>
</message>
@@ -2697,7 +2824,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<name>QLocalSocket</name>
<message>
<location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
+ <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+139"/>
<source>%1: Connection refused</source>
<translation>%1: Odmowa połączenia</translation>
</message>
@@ -2711,7 +2838,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<location line="+3"/>
<location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
<location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
- <location line="+43"/>
+ <location line="+45"/>
<source>%1: Invalid name</source>
<translation>%1: Niepoprawna nazwa</translation>
</message>
@@ -2742,7 +2869,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="+3"/>
<location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
+ <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-50"/>
<source>%1: Connection error</source>
<translation>%1: Błąd połączenia</translation>
</message>
@@ -2767,7 +2894,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QMYSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1365"/>
+ <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1423"/>
<source>Unable to begin transaction</source>
<translation>Nie można rozpocząć transakcji</translation>
</message>
@@ -2777,17 +2904,17 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można potwierdzić transakcji</translation>
</message>
<message>
- <location line="-144"/>
+ <location line="-168"/>
<source>Unable to connect</source>
<translation>Nie można nawiązać połączenia</translation>
</message>
<message>
- <location line="-7"/>
+ <location line="-11"/>
<source>Unable to open database &apos;</source>
<translation>Nie można otworzyć bazy danych &apos;</translation>
</message>
<message>
- <location line="+168"/>
+ <location line="+196"/>
<source>Unable to rollback transaction</source>
<translation>Nie można wycofać transakcji</translation>
</message>
@@ -2795,7 +2922,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QMYSQLResult</name>
<message>
- <location line="-396"/>
+ <location line="-433"/>
<location line="+21"/>
<source>Unable to bind outvalues</source>
<translation>Nie można powiązać wartości zewnętrznych</translation>
@@ -2806,38 +2933,38 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można powiązać wartości</translation>
</message>
<message>
- <location line="-325"/>
+ <location line="-328"/>
<source>Unable to execute query</source>
<translation>Nie można wykonać zapytania</translation>
</message>
<message>
- <location line="+336"/>
+ <location line="+339"/>
<source>Unable to execute statement</source>
<translation>Nie można wykonać polecenia</translation>
</message>
<message>
- <location line="-512"/>
+ <location line="-522"/>
<source>Unable to fetch data</source>
<translation>Nie można pobrać danych</translation>
</message>
<message>
- <location line="+372"/>
+ <location line="+380"/>
<location line="+8"/>
<source>Unable to prepare statement</source>
<translation>Nie można przygotować polecenia</translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+37"/>
<source>Unable to reset statement</source>
<translation>Nie można skasować polecenia</translation>
</message>
<message>
- <location line="-232"/>
+ <location line="-236"/>
<source>Unable to store result</source>
<translation>Nie można zachować wyników</translation>
</message>
<message>
- <location line="+353"/>
+ <location line="+356"/>
<source>Unable to store statement results</source>
<translation>Nie można zachować wyników polecenia</translation>
</message>
@@ -2976,49 +3103,50 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
</message>
</context>
<context>
- <name>QMessageBox</name>
- <message>
- <source>&lt;p&gt;This program uses Qt Open Source Edition version %1.&lt;/p&gt;&lt;p&gt;Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/company/model/&quot;&gt;qt.nokia.com/company/model/&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt; Ten program używa Qt Open Source Edition w wersji %1.&lt;/p&gt;&lt;p&gt;Qt Open Source Edition jest przeznaczone do pisania aplikacji z otwartym kodem źródłowym. W przypadku aplikacji zamkniętych (bez kodu źródłowego) wymagana jest licencja komercyjna Qt.&lt;/p&gt;&lt;p&gt;Strona &lt;a href=&quot;http://qt.nokia.com/company/model/&quot;&gt;qt.nokia.com/company/model/&lt;/a&gt; opisuje sposób licencjonowania Qt.&lt;/p&gt;</translation>
- </message>
+ <name>QMenuBar</name>
<message>
- <source>&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt; Ten program używa Qt w wersji %1.&lt;/p&gt;</translation>
- </message>
- <message>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;%1&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;h3&gt;Informacje o Qt&lt;/h3&gt;%1&lt;p&gt;Qt jest biblioteką C++ do tworzenia przenośnego oprogramowania.&lt;/p&gt;&lt;p&gt;Qt umożliwia pisanie przenośnego kodu zarówno dla MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux jak i dla wszystkich głównych komercyjnych wariantów Unix&apos;ów. Qt jest również dostępne dla urządzeń specjalizowanych i przenośnych jako Qt dla Embedded Linux lub jako Qt dla Windows CE.&lt;/p&gt;&lt;p&gt;Producentem Qt jest Nokia. Więcej informacji na stronie &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt;.&lt;/p&gt;</translation>
+ <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+404"/>
+ <source>Actions</source>
+ <translation>Akcje</translation>
</message>
+</context>
+<context>
+ <name>QMessageBox</name>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-603"/>
+ <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-604"/>
<source>About Qt</source>
<translation>Informacje o Qt</translation>
</message>
<message>
- <location line="-508"/>
+ <location line="-512"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
- <location line="-1096"/>
+ <location line="-1098"/>
<source>Hide Details...</source>
<translation>Ukryj szczegóły...</translation>
</message>
<message>
- <location line="+243"/>
- <location line="+852"/>
+ <location line="+250"/>
+ <location line="+847"/>
<location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
<location line="+8"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location line="+475"/>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+ <location line="+477"/>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
+ <translation>&lt;h3&gt;Informacje o Qt&lt;/h3&gt;&lt;p&gt; Ten program używa Qt w wersji %1.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1571"/>
+ <location line="-1580"/>
<source>Show Details...</source>
<translation>Pokaż szczegóły...</translation>
</message>
@@ -3180,30 +3308,38 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QNetworkAccessCacheBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
+ <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+66"/>
<source>Error opening %1</source>
<translation>Błąd otwierania %1</translation>
</message>
</context>
<context>
+ <name>QNetworkAccessDebugPipeBackend</name>
+ <message>
+ <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+195"/>
+ <source>Write error writing to %1: %2</source>
+ <translation>Błąd w trakcie zapisywania do %1: %2</translation>
+ </message>
+</context>
+<context>
<name>QNetworkAccessFileBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/>
+ <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+100"/>
<source>Request for opening non-local file %1</source>
<translation>Żądanie otwarcia zdalnego pliku %1</translation>
</message>
<message>
- <location line="+42"/>
+ <location line="+45"/>
<source>Error opening %1: %2</source>
<translation>Błąd otwierania %1: %2</translation>
</message>
<message>
- <location line="+56"/>
+ <location line="+38"/>
<source>Write error writing to %1: %2</source>
<translation>Błąd w trakcie zapisywania do %1: %2</translation>
</message>
<message>
- <location line="+33"/>
+ <location line="+48"/>
<source>Cannot open %1: Path is a directory</source>
<translation>Nie można otworzyć %1: Ścieżka jest katalogiem</translation>
</message>
@@ -3216,7 +3352,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QNetworkAccessFtpBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/>
+ <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+131"/>
<source>No suitable proxy found</source>
<translation>Nie odnaleziono odpowiedniego pośrednika</translation>
</message>
@@ -3226,7 +3362,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można otworzyć %1: jest to katalog</translation>
</message>
<message>
- <location line="+130"/>
+ <location line="+112"/>
<source>Logging in to %1 failed: authentication required</source>
<translation>Błąd podczas logowania do %1: wymagana autoryzacja</translation>
</message>
@@ -3244,7 +3380,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QNetworkAccessHttpBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/>
+ <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+585"/>
<source>No suitable proxy found</source>
<translation>Nie odnaleziono odpowiedniego pośrednika</translation>
</message>
@@ -3252,12 +3388,12 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QNetworkReply</name>
<message>
- <location line="+128"/>
+ <location line="+95"/>
<source>Error downloading %1 - server replied: %2</source>
<translation>Błąd podczas pobierania %1 - odpowiedź serwera: %2</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/>
+ <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+77"/>
<source>Protocol &quot;%1&quot; is unknown</source>
<translation>Protokół &quot;%1&quot; nie jest znany</translation>
</message>
@@ -3265,8 +3401,8 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QNetworkReplyImpl</name>
<message>
- <location line="+432"/>
- <location line="+22"/>
+ <location line="+519"/>
+ <location line="+28"/>
<source>Operation canceled</source>
<translation>Operacja anulowana</translation>
</message>
@@ -3274,7 +3410,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QOCIDriver</name>
<message>
- <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+1925"/>
+ <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+1932"/>
<source>Unable to initialize</source>
<comment>QOCIDriver</comment>
<translation>Nie można dokonać inicjalizacji</translation>
@@ -3297,13 +3433,13 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="+19"/>
<source>Unable to rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
</message>
</context>
<context>
<name>QOCIResult</name>
<message>
- <location line="-963"/>
+ <location line="-972"/>
<location line="+161"/>
<location line="+15"/>
<source>Unable to bind column for batch execute</source>
@@ -3315,7 +3451,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można wykonać polecenia wsadowego</translation>
</message>
<message>
- <location line="+302"/>
+ <location line="+304"/>
<source>Unable to goto next</source>
<translation>Nie można przejść do kolejnego wiersza danych</translation>
</message>
@@ -3330,13 +3466,14 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można przygotować polecenia</translation>
</message>
<message>
- <location line="+36"/>
- <source>Unable to bind value</source>
- <translation>Nie można powiązać wartości</translation>
+ <location line="+26"/>
+ <source>Unable to get statement type</source>
+ <translation>Nie można pobrać typu polecenia</translation>
</message>
<message>
- <source>Unable to execute select statement</source>
- <translation type="obsolete">Nie można wykonać polecenia select</translation>
+ <location line="+20"/>
+ <source>Unable to bind value</source>
+ <translation>Nie można powiązać wartości</translation>
</message>
<message>
<location line="+19"/>
@@ -3347,22 +3484,17 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QODBCDriver</name>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+2050"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+2045"/>
<source>Unable to commit transaction</source>
<translation>Nie można potwierdzić transakcji</translation>
</message>
<message>
- <location line="-265"/>
+ <location line="-255"/>
<source>Unable to connect</source>
<translation>Nie można nawiązać połączenia</translation>
</message>
<message>
- <location line="+6"/>
- <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
- <translation>Nie można nawiązać połączenia - sterownik nie obsługuje całej potrzebnej funkcjonalności</translation>
- </message>
- <message>
- <location line="+242"/>
+ <location line="+238"/>
<source>Unable to disable autocommit</source>
<translation>Nie można wyłączyć trybu automatycznego dokonywania transakcji</translation>
</message>
@@ -3374,14 +3506,19 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<message>
<location line="-15"/>
<source>Unable to rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
+ </message>
+ <message>
+ <location line="-266"/>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation>Nie można nawiązać połączenia - sterownik nie obsługuje całej potrzebnej funkcjonalności</translation>
</message>
</context>
<context>
<name>QODBCResult</name>
<message>
- <location line="-1203"/>
- <location line="+349"/>
+ <location line="-932"/>
+ <location line="+346"/>
<source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
<translation>QODBCResult::reset: Nie można ustawić &apos;SQL_CURSOR_STATIC&apos; jako atrybutu polecenia. Proszę sprawdzić konfiguracje sterownika ODBC</translation>
</message>
@@ -3391,30 +3528,30 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nie można powiązać zmiennej</translation>
</message>
<message>
- <location line="-618"/>
- <location line="+626"/>
+ <location line="-615"/>
+ <location line="+623"/>
<source>Unable to execute statement</source>
<translation>Nie można wykonać polecenia</translation>
</message>
<message>
- <location line="-555"/>
+ <location line="-547"/>
<source>Unable to fetch next</source>
<translation>Nie można pobrać kolejnych danych</translation>
</message>
<message>
- <location line="+279"/>
+ <location line="+271"/>
<source>Unable to prepare statement</source>
<translation>Nie można przygotować polecenia</translation>
</message>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-207"/>
- <location line="+578"/>
+ <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+190"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-199"/>
+ <location line="+576"/>
<source>Unable to fetch last</source>
<translation>Nie można pobrać ostatnich danych</translation>
</message>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-670"/>
<source>Unable to fetch</source>
<translation>Nie można pobrać</translation>
</message>
@@ -3432,9 +3569,9 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QObject</name>
<message>
- <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
- <source>Home</source>
- <translation>Strona startowa</translation>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-97"/>
+ <source>Invalid hostname</source>
+ <translation>Niepoprawna nazwa hosta</translation>
</message>
<message>
<location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
@@ -3442,22 +3579,12 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Operacja nieobsługiwana na %1</translation>
</message>
<message>
- <location line="+53"/>
+ <location line="+57"/>
<source>Invalid URI: %1</source>
<translation>Niepoprawny URI: %1</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/>
- <source>Write error writing to %1: %2</source>
- <translation>Błąd w trakcie zapisywania do %1: %2</translation>
- </message>
- <message>
- <location line="+57"/>
- <source>Read error reading from %1: %2</source>
- <translation>Błąd w trakcie czytania z %1: %2</translation>
- </message>
- <message>
- <location line="+31"/>
+ <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+60"/>
<source>Socket error on %1: %2</source>
<translation>Błąd gniazda na %1: %2</translation>
</message>
@@ -3467,13 +3594,8 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Zdalny host przedwcześnie zakończył połączenie na %1</translation>
</message>
<message>
- <location line="+53"/>
- <source>Protocol error: packet of size 0 received</source>
- <translation>Błąd protokołu: otrzymano pakiet o zerowym rozmiarze</translation>
- </message>
- <message>
- <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
- <location line="+57"/>
+ <location filename="../src/network/kernel/qhostinfo.cpp" line="+175"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+0"/>
<source>No host name given</source>
<translation>Nie podano nazwy hosta</translation>
</message>
@@ -3481,7 +3603,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QPPDOptionsModel</name>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/>
+ <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1198"/>
<source>Name</source>
<translation>Nazwa</translation>
</message>
@@ -3494,27 +3616,27 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QPSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+812"/>
+ <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+831"/>
<source>Could not begin transaction</source>
<translation>Nie można rozpocząć transakcji</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>Could not commit transaction</source>
<translation>Nie można potwierdzić transakcji</translation>
</message>
<message>
<location line="+16"/>
<source>Could not rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
</message>
<message>
- <location line="-82"/>
+ <location line="-95"/>
<source>Unable to connect</source>
<translation>Nie można nawiązać połączenia</translation>
</message>
<message>
- <location line="+440"/>
+ <location line="+469"/>
<source>Unable to subscribe</source>
<translation>Nie można wykonać subskrypcji</translation>
</message>
@@ -3527,14 +3649,14 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<context>
<name>QPSQLResult</name>
<message>
- <location line="-1058"/>
+ <location line="-1085"/>
<source>Unable to create query</source>
<translation>Nie można utworzyć zapytania</translation>
</message>
<message>
- <location line="+374"/>
+ <location line="+372"/>
<source>Unable to prepare statement</source>
- <translation>Nie można przygotować wyrażenia</translation>
+ <translation>Nie można przygotować polecenia</translation>
</message>
</context>
<context>
@@ -3648,7 +3770,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>Nieznany błąd</translation>
</message>
<message>
- <location line="-68"/>
+ <location line="-113"/>
<source>The plugin was not loaded.</source>
<translation>Wtyczka nie została załadowana.</translation>
</message>
@@ -3706,7 +3828,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>A9 (37 x 52 mm)</translation>
</message>
<message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+121"/>
+ <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+131"/>
<location line="+225"/>
<source>Aliases: %1</source>
<translation>Aliasy: %1</translation>
@@ -3782,7 +3904,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>podłączony lokalnie</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
+ <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+266"/>
<source>OK</source>
<translation>OK</translation>
</message>
@@ -3838,7 +3960,7 @@ Proszę o sprawdzenie podanej nazwy pliku.</translation>
<translation>US Common #10 Envelope (105 x 241 mm)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
+ <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+112"/>
<location line="+13"/>
<location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
<source>Print</source>
@@ -4041,7 +4163,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Niestandardowy</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/>
+ <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-524"/>
<location line="+68"/>
<source>&amp;Options &gt;&gt;</source>
<translation>&amp;Opcje &gt;&gt;</translation>
@@ -4067,7 +4189,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Wydrukuj do pliku (Postscript)</translation>
</message>
<message>
- <location line="+45"/>
+ <location line="+47"/>
<source>Local file</source>
<translation>Plik lokalny</translation>
</message>
@@ -4085,17 +4207,17 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QPrintPreviewDialog</name>
<message>
- <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/>
+ <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+246"/>
<source>%1%</source>
<translation>%1%</translation>
</message>
<message>
- <location line="+79"/>
+ <location line="+68"/>
<source>Print Preview</source>
<translation>Wydrukuj podgląd</translation>
</message>
<message>
- <location line="+29"/>
+ <location line="+30"/>
<source>Next page</source>
<translation>Następna strona</translation>
</message>
@@ -4170,19 +4292,14 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Ustawienia strony</translation>
</message>
<message>
- <location line="+1"/>
- <source>Close</source>
- <translation>Zamknij</translation>
- </message>
- <message>
- <location line="+151"/>
+ <location line="+150"/>
<source>Export to PDF</source>
- <translation type="unfinished"></translation>
+ <translation>Wyeksportuj do PDF</translation>
</message>
<message>
<location line="+3"/>
<source>Export to PostScript</source>
- <translation type="unfinished"></translation>
+ <translation>Wyeksportuj do PostScript</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
@@ -4358,70 +4475,70 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QProcess</name>
<message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
+ <location filename="../src/corelib/io/qprocess_unix.cpp" line="+402"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+137"/>
<source>Could not open input redirection for reading</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można otworzyć wejściowego przekierowania do odczytu</translation>
</message>
<message>
<location line="+12"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+20"/>
<source>Could not open output redirection for writing</source>
- <translation type="unfinished"></translation>
+ <translation>Nie można otworzyć wyjściowego przekierowania do zapisu</translation>
</message>
<message>
- <location line="+235"/>
+ <location line="+239"/>
<source>Resource error (fork failure): %1</source>
<translation>Błąd zasobów (błąd forkowania): %1</translation>
</message>
<message>
- <location line="+259"/>
- <location line="+53"/>
+ <location line="+252"/>
+ <location line="+52"/>
<location line="+74"/>
- <location line="+67"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/>
+ <location line="+66"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+406"/>
<location line="+50"/>
<location line="+75"/>
<location line="+42"/>
<location line="+54"/>
<source>Process operation timed out</source>
- <translation type="unfinished"></translation>
+ <translation>Przekroczony czas operacji procesu</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+533"/>
+ <location filename="../src/corelib/io/qprocess.cpp" line="+851"/>
<location line="+52"/>
<location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
<location line="+50"/>
<source>Error reading from process</source>
- <translation type="unfinished"></translation>
+ <translation>Błąd odczytywania z procesu</translation>
</message>
<message>
<location line="+47"/>
- <location line="+779"/>
+ <location line="+826"/>
<location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
<source>Error writing to process</source>
- <translation type="unfinished"></translation>
+ <translation>Błąd zapisywania do procesu</translation>
</message>
<message>
- <location line="-709"/>
+ <location line="-756"/>
<source>Process crashed</source>
- <translation type="unfinished"></translation>
+ <translation>Wystąpił błąd w procesie - proces zakończony</translation>
</message>
<message>
- <location line="+912"/>
+ <location line="+959"/>
<source>No program defined</source>
- <translation type="unfinished"></translation>
+ <translation>Nie zdefiniowano programu</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
- <source>Process failed to start</source>
- <translation type="unfinished"></translation>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="-360"/>
+ <source>Process failed to start: %1</source>
+ <translation>Nie można rozpocząć procesu: %1</translation>
</message>
</context>
<context>
<name>QProgressDialog</name>
<message>
- <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
+ <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+196"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
@@ -4445,7 +4562,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QRegExp</name>
<message>
- <location filename="../src/corelib/tools/qregexp.cpp" line="+66"/>
+ <location filename="../src/corelib/tools/qregexp.cpp" line="+67"/>
<source>bad char class syntax</source>
<translation>niepoprawna składnia klasy znakowej</translation>
</message>
@@ -4460,7 +4577,17 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>niepoprawna składnia powtórzenia</translation>
</message>
<message>
- <location line="-3"/>
+ <location line="+5"/>
+ <source>invalid interval</source>
+ <translation>Niepoprawny interwał</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>invalid category</source>
+ <translation>Niepoprawna kategoria</translation>
+ </message>
+ <message>
+ <location line="-9"/>
<source>disabled feature used</source>
<translation>użyta funkcja została wyłączona</translation>
</message>
@@ -4493,9 +4620,9 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QSQLite2Driver</name>
<message>
- <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
- <source>Error to open database</source>
- <translation>Nie można otworzyć bazy danych</translation>
+ <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+391"/>
+ <source>Error opening database</source>
+ <translation>Błąd otwierania bazy danych</translation>
</message>
<message>
<location line="+41"/>
@@ -4509,8 +4636,8 @@ Proszę wybrać inną nazwę pliku.</translation>
</message>
<message>
<location line="+17"/>
- <source>Unable to rollback Transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <source>Unable to rollback transaction</source>
+ <translation>Nie można wycofać transakcji</translation>
</message>
</context>
<context>
@@ -4521,7 +4648,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nie można wykonać polecenia</translation>
</message>
<message>
- <location line="-147"/>
+ <location line="-143"/>
<source>Unable to fetch results</source>
<translation>Nie można pobrać wyników</translation>
</message>
@@ -4529,7 +4656,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QSQLiteDriver</name>
<message>
- <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+539"/>
+ <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+555"/>
<source>Error closing database</source>
<translation>Błąd zamykania bazy danych</translation>
</message>
@@ -4551,13 +4678,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+15"/>
<source>Unable to rollback transaction</source>
- <translation>Nie można cofnąć transakcji</translation>
+ <translation>Nie można wycofać transakcji</translation>
</message>
</context>
<context>
<name>QSQLiteResult</name>
<message>
- <location line="-191"/>
+ <location line="-203"/>
<source>Parameter count mismatch</source>
<translation>Niezgodna liczba parametrów</translation>
</message>
@@ -4572,27 +4699,365 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nie można wykonać polecenia</translation>
</message>
<message>
- <location line="-137"/>
+ <location line="-133"/>
<location line="+66"/>
<location line="+8"/>
<source>Unable to fetch row</source>
<translation>Nie można pobrać wiersza danych</translation>
</message>
<message>
- <location line="+83"/>
+ <location line="+79"/>
<source>Unable to reset statement</source>
<translation>Nie można skasować polecenia</translation>
</message>
<message>
- <location line="-156"/>
+ <location line="-152"/>
<source>No query</source>
<translation>Brak zapytania</translation>
</message>
</context>
<context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointsmodel.cpp" line="+455"/>
+ <source>ID</source>
+ <translation>Identyfikator</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Location</source>
+ <translation>Miejsce</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Condition</source>
+ <translation>Warunek</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Ignore-count</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Single-shot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Hit-count</source>
+ <translation>Ilość trafień</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="+298"/>
+ <source>New</source>
+ <translation>Nowy</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Delete</source>
+ <translation>Skasuj</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebugger</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebugger.cpp" line="+885"/>
+ <location line="+1013"/>
+ <source>Go to Line</source>
+ <translation>Przejdź do linii</translation>
+ </message>
+ <message>
+ <location line="-1012"/>
+ <source>Line:</source>
+ <translation>Linia:</translation>
+ </message>
+ <message>
+ <location line="+791"/>
+ <source>Interrupt</source>
+ <translation>Przerwij</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Continue</source>
+ <translation>Kontynuuj</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Into</source>
+ <translation>Wskocz do wnętrza</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Over</source>
+ <translation>Przeskocz</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Out</source>
+ <translation>Wyskocz na zewnątrz</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Run to Cursor</source>
+ <translation>Uruchom do kursora</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Run to New Script</source>
+ <translation>Uruchom do nowego skryptu</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Toggle Breakpoint</source>
+ <translation>Przełącz ustawienie pułapki</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Clear Debug Output</source>
+ <translation>Wyczyść wyjście debuggera</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Clear Error Log</source>
+ <translation>Wyczyść log z błędami</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Clear Console</source>
+ <translation>Wyczyść konsolę</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>&amp;Find in Script...</source>
+ <translation>&amp;Znajdź w skrypcie...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Find &amp;Next</source>
+ <translation>Znajdź &amp;następne</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Find &amp;Previous</source>
+ <translation>Znajdź &amp;poprzednie</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F3</source>
+ <translation>Shift+F3</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Debug</source>
+ <translation>Debuguj</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggercodefinderwidget.cpp" line="+141"/>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Previous</source>
+ <translation>Poprzednie</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Next</source>
+ <translation>Następne</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Case Sensitive</source>
+ <translation>Uwzględniaj wielkość liter</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Whole words</source>
+ <translation>Całe słowa</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
+ <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Przeszukano od początku</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggerlocalsmodel.cpp" line="+872"/>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Value</source>
+ <translation>Wartość</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggerstackmodel.cpp" line="+161"/>
+ <source>Level</source>
+ <translation>Poziom</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Name</source>
+ <translation>Nazwa</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Location</source>
+ <translation>Miejsce</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptEdit</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptedit.cpp" line="+411"/>
+ <source>Toggle Breakpoint</source>
+ <translation>Przełącz ustawienie pułapki</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Disable Breakpoint</source>
+ <translation>Wyłącz pułapkę</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Enable Breakpoint</source>
+ <translation>Włącz pułapkę</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Breakpoint Condition:</source>
+ <translation>Warunek dla pułapki:</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptenginedebugger.cpp" line="+523"/>
+ <source>Loaded Scripts</source>
+ <translation>Załadowane skrypty</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Breakpoints</source>
+ <translation>Pułapki</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Stack</source>
+ <translation>Stos</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Locals</source>
+ <translation>Zmienne lokalne</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Console</source>
+ <translation>Konsola</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Debug Output</source>
+ <translation>Wyjscie debuggera</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Error Log</source>
+ <translation>Log z błędami</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Search</source>
+ <translation>Szukaj</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>View</source>
+ <translation>Widok</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Qt Script Debugger</source>
+ <translation>Debugger Qt Script</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="-223"/>
+ <source>Close</source>
+ <translation>Zamknij</translation>
+ </message>
+</context>
+<context>
<name>QScrollBar</name>
<message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+451"/>
+ <location filename="../src/gui/widgets/qscrollbar.cpp" line="+457"/>
<source>Bottom</source>
<translation>W dół</translation>
</message>
@@ -4677,13 +5142,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QSharedMemory</name>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+288"/>
+ <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+304"/>
<source>%1: create size is less then 0</source>
<translation>%1: rozmiar przy tworzeniu mniejszy od 0</translation>
</message>
<message>
<location line="+168"/>
- <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+155"/>
<source>%1: unable to lock</source>
<translation>%1: nie można zablokować</translation>
</message>
@@ -4693,58 +5158,68 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>%1: nie można odblokować</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+83"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+80"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
<source>%1: permission denied</source>
<translation>%1: brak dostępu</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-16"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+4"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
<source>%1: already exists</source>
<translation>%1: już istnieje</translation>
</message>
<message>
<location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
<source>%1: doesn&apos;t exists</source>
<translation>%1: nie istnieje</translation>
</message>
<message>
- <location line="+6"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
+ <location line="+8"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+10"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+18"/>
<source>%1: out of resources</source>
<translation>%1: zasoby wyczerpane</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+7"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+4"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
<source>%1: unknown error %2</source>
<translation>%1: nieznany błąd %2</translation>
</message>
<message>
- <location line="+21"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+21"/>
<source>%1: key is empty</source>
<translation>%1: klucz jest pusty</translation>
</message>
<message>
- <location line="+8"/>
- <source>%1: unix key file doesn&apos;t exists</source>
- <translation>%1: unixowy plik z kluczem nie istnieje</translation>
- </message>
- <message>
- <location line="+7"/>
+ <location line="+15"/>
<source>%1: ftok failed</source>
<translation>%1: wystąpił błąd w funkcji ftok()</translation>
</message>
<message>
- <location line="+51"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+56"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+51"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
<source>%1: unable to make key</source>
<translation>%1: nie można utworzyć klucza</translation>
</message>
<message>
- <location line="+20"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="-97"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-31"/>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1: nie istnieje</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1: unixowy plik z kluczem nie istnieje</translation>
+ </message>
+ <message>
+ <location line="+78"/>
<source>%1: system-imposed size restrictions</source>
<translation>%1: ograniczenia rozmiarów narzucone przez system</translation>
</message>
@@ -4754,17 +5229,19 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>%1: niedołączony</translation>
</message>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-67"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+4"/>
<source>%1: invalid size</source>
<translation>%1: niepoprawny rozmiar</translation>
</message>
<message>
- <location line="+68"/>
+ <location line="+40"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+63"/>
<source>%1: key error</source>
<translation>%1: błąd klucza</translation>
</message>
<message>
- <location line="+38"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+32"/>
<source>%1: size query failed</source>
<translation>%1: zapytanie o rozmiar nie powiodło się</translation>
</message>
@@ -4777,18 +5254,18 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QShortcut</name>
<message>
- <location filename="../src/gui/kernel/qkeysequence.cpp" line="+1091"/>
+ <location filename="../src/gui/kernel/qkeysequence.cpp" line="+1143"/>
<source>+</source>
<translation>+</translation>
</message>
<message>
- <location line="-93"/>
- <location line="+122"/>
+ <location line="-91"/>
+ <location line="+135"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
- <location line="-720"/>
+ <location line="-767"/>
<source>Back</source>
<translation>Back</translation>
</message>
@@ -4853,13 +5330,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Kontekst4</translation>
</message>
<message>
- <location line="+530"/>
- <location line="+122"/>
+ <location line="+564"/>
+ <location line="+135"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
- <location line="-737"/>
+ <location line="-784"/>
<source>Del</source>
<translation>Del</translation>
</message>
@@ -4894,12 +5371,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Escape</translation>
</message>
<message>
- <location line="+685"/>
+ <location line="+732"/>
<source>F%1</source>
<translation>F%1</translation>
</message>
<message>
- <location line="-719"/>
+ <location line="-766"/>
<source>Favorites</source>
<translation>Ulubione</translation>
</message>
@@ -5069,13 +5546,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Menu</translation>
</message>
<message>
- <location line="+603"/>
- <location line="+117"/>
+ <location line="+637"/>
+ <location line="+130"/>
<source>Meta</source>
<translation>Meta</translation>
</message>
<message>
- <location line="-657"/>
+ <location line="-704"/>
<source>No</source>
<translation>Nie</translation>
</message>
@@ -5170,13 +5647,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Wybierz</translation>
</message>
<message>
- <location line="+540"/>
- <location line="+125"/>
+ <location line="+574"/>
+ <location line="+138"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
- <location line="-749"/>
+ <location line="-796"/>
<source>Space</source>
<translation>Spacja</translation>
</message>
@@ -5343,6 +5820,39 @@ Proszę wybrać inną nazwę pliku.</translation>
</message>
</context>
<context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <location filename="../src/gui/kernel/qsoftkeymanager.cpp" line="+78"/>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Select</source>
+ <translation>Wybierz</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Done</source>
+ <translation>Zrobione</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Options</source>
+ <translation>Opcje</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Cancel</source>
+ <translation>Anuluj</translation>
+ </message>
+ <message>
+ <location line="+152"/>
+ <source>Exit</source>
+ <translation>Wyjście</translation>
+ </message>
+</context>
+<context>
<name>QSpinBox</name>
<message>
<location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-569"/>
@@ -5415,7 +5925,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QSslSocket</name>
<message>
- <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
+ <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+546"/>
<source>Unable to write data: %1</source>
<translation>Nie można zapisać danych: %1</translation>
</message>
@@ -5430,7 +5940,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Błąd podczas nawiązania sesji SSL: %1</translation>
</message>
<message>
- <location line="-524"/>
+ <location line="-501"/>
<source>Error creating SSL context (%1)</source>
<translation>Błąd tworzenia kontekstu (%1)</translation>
</message>
@@ -5471,6 +5981,29 @@ Proszę wybrać inną nazwę pliku.</translation>
</message>
</context>
<context>
+ <name>QStateMachine</name>
+ <message>
+ <location filename="../src/corelib/statemachine/qstatemachine.cpp" line="+998"/>
+ <source>Missing initial state in compound state &apos;%1&apos;</source>
+ <translation>Brak stanu początkowego w stanie złożonym &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Missing default state in history state &apos;%1&apos;</source>
+ <translation>Brak domyślnego stanu w historycznym stanie &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>No common ancestor for targets and source of transition from state &apos;%1&apos;</source>
+ <translation>Brak wspólnego przodka dla stanów docelowych i stanu źródłowego w przejściu ze stanu &apos;%1&apos;</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Unknown error</source>
+ <translation>Nieznany błąd</translation>
+ </message>
+</context>
+<context>
<name>QSystemSemaphore</name>
<message>
<location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/>
@@ -5487,12 +6020,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+4"/>
<source>%1: already exists</source>
- <translation type="unfinished">%1: już istnieje</translation>
+ <translation>%1: już istnieje</translation>
</message>
<message>
<location line="+4"/>
<source>%1: does not exist</source>
- <translation type="unfinished"></translation>
+ <translation>%1: nie istnieje</translation>
</message>
<message>
<location line="+9"/>
@@ -5538,7 +6071,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QTextControl</name>
<message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+1984"/>
+ <location filename="../src/gui/text/qtextcontrol.cpp" line="+2014"/>
<source>&amp;Copy</source>
<translation>S&amp;kopiuj</translation>
</message>
@@ -5596,7 +6129,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QUdpSocket</name>
<message>
- <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
+ <location filename="../src/network/socket/qudpsocket.cpp" line="+179"/>
<source>This platform does not support IPv6</source>
<translation>Ta platforma nie obsługuje IPv6</translation>
</message>
@@ -5604,7 +6137,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QUndoGroup</name>
<message>
- <location filename="../src/gui/util/qundogroup.cpp" line="+414"/>
+ <location filename="../src/gui/util/qundogroup.cpp" line="+413"/>
<source>Redo</source>
<translation>Przywróć</translation>
</message>
@@ -5625,7 +6158,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QUndoStack</name>
<message>
- <location filename="../src/gui/util/qundostack.cpp" line="+861"/>
+ <location filename="../src/gui/util/qundostack.cpp" line="+859"/>
<source>Redo</source>
<translation>Przywróć</translation>
</message>
@@ -5640,7 +6173,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location filename="../src/gui/text/qtextcontrol.cpp" line="+933"/>
<source>Insert Unicode control character</source>
- <translation>Wstaw znak </translation>
+ <translation>Wstaw znak kontroli Unicode</translation>
</message>
<message>
<location line="-10"/>
@@ -5696,12 +6229,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QWebFrame</name>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+704"/>
<source>Request cancelled</source>
<translation>Prośba anulowana</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+19"/>
<source>Request blocked</source>
<translation>Prośba zablokowana</translation>
</message>
@@ -5712,7 +6245,7 @@ Proszę wybrać inną nazwę pliku.</translation>
</message>
<message>
<location line="+6"/>
- <source>Frame load interruped by policy change</source>
+ <source>Frame load interrupted by policy change</source>
<translation>Ładowanie ramki przerwane przez zmianę strategii</translation>
</message>
<message>
@@ -5729,7 +6262,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QWebPage</name>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
+ <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+41"/>
<source>Submit</source>
<comment>default label for Submit buttons in forms on web pages</comment>
<translation>Wyślij</translation>
@@ -5960,7 +6493,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<location line="+5"/>
<source>Text Direction</source>
<comment>Text direction context sub-menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Kierunek tekstu</translation>
</message>
<message>
<location line="+5"/>
@@ -5969,19 +6502,241 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Domyślny</translation>
</message>
<message>
- <location line="+5"/>
- <source>LTR</source>
- <comment>Left to Right context menu item</comment>
- <translation>Z lewej do prawej</translation>
+ <location line="+115"/>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>Ładowanie...</translation>
</message>
<message>
<location line="+5"/>
- <source>RTL</source>
- <comment>Right to Left context menu item</comment>
- <translation>Z prawej do lewej</translation>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>Transmisja na żywo</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+8"/>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation>Element dźwiękowy</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation>Element wideo</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk wyłączania głosu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk włączania głosu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk odtwarzania</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk pauzy</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation>Suwak</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation>Uchwyt suwaka</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przewijania</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk powrotu do czasu rzeczywistego</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas który upłynął</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas który pozostał</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation>Wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk trybu pełnoekranowego</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przeszukiwania do przodu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation>Przycisk przeszukiwania do tyłu</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Kontrolki odtwarzania dźwięku i wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation>Kontrolki odtwarzania wideo i wyświetlacz stanu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Wyłącz ścieżkę dźwiękową</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation>Włącz ścieżkę dźwiękową</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation>Rozpocznij odtwarzanie</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation>Wstrzymaj odtwarzanie</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation>Przewiń film</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation>Przywróć przesyłanie filmu do czasu rzeczywistego</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas bieżącego filmu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation>Czas do końca filmu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation>Stan bieżącego filmu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation>Odtwarzaj film w trybie pełnoekranowym</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation>Przeszukaj szybko do tyłu</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation>Przeszukaj szybko do przodu</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation>Nieokreślony czas</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 dni %2 godzin %3 minut %4 sekund</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 godzin %2 minut %3 sekund</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 minut %2 sekund</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation>%1 sekund</translation>
+ </message>
+ <message>
+ <location line="-210"/>
<source>Inspect</source>
<comment>Inspect Element context menu item</comment>
<translation>Zwiedzaj</translation>
@@ -6011,12 +6766,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nieznany</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+170"/>
<source>Web Inspector - %2</source>
<translation>Wizytator sieciowy - %2</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/>
+ <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+416"/>
<source>Bad HTTP request</source>
<translation>Niepoprawna komenda HTTP</translation>
</message>
@@ -6027,7 +6782,19 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>To jest indeks wyszukiwawczy. Podaj słowa do wyszukania:</translation>
</message>
<message>
- <location line="+291"/>
+ <location line="+186"/>
+ <source>Left to Right</source>
+ <comment>Left to Right context menu item</comment>
+ <translation>Z lewej na prawą</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Right to Left</source>
+ <comment>Right to Left context menu item</comment>
+ <translation>Z prawej na lewą</translation>
+ </message>
+ <message>
+ <location line="+100"/>
<source>%1 (%2x%3 pixels)</source>
<comment>Title string for images</comment>
<translation>%1 (%2x%3 piksli)</translation>
@@ -6101,177 +6868,252 @@ Proszę wybrać inną nazwę pliku.</translation>
<location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
<source>%n file(s)</source>
<comment>number of chosen file</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n plik</numerusform>
+ <numerusform>%n pliki</numerusform>
+ <numerusform>%n plików</numerusform>
</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1727"/>
<source>JavaScript Alert - %1</source>
- <translation type="unfinished"></translation>
+ <translation>Ostrzeżenie JavaScript - %1</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+16"/>
<source>JavaScript Confirm - %1</source>
- <translation type="unfinished"></translation>
+ <translation>Potwierdzenie JavaScript - %1</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+18"/>
<source>JavaScript Prompt - %1</source>
- <translation type="unfinished"></translation>
+ <translation>Zachęta JavaScript - %1</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>JavaScript Problem - %1</source>
+ <translation>Problem JavaScript - %1</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>Skrypt na tej stronie nie działa poprawnie. Czy chcesz przerwać ten skrypt?</translation>
</message>
<message>
- <location line="+333"/>
+ <location line="+383"/>
<source>Move the cursor to the next character</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do nastepnego znaku</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the previous character</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do poprzedniego znaku</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the next word</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do nastepnego słowa</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the previous word</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do poprzedniego słowa</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the next line</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do nastepnej linii</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the previous line</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do poprzedniej linii</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the start of the line</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do początku linii</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the end of the line</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do końca linii</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the start of the block</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do początku bloku</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the end of the block</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do końca bloku</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the start of the document</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do początku dokumentu</translation>
</message>
<message>
<location line="+3"/>
<source>Move the cursor to the end of the document</source>
- <translation type="unfinished"></translation>
+ <translation>Przesuń kursor do końca dokumentu</translation>
</message>
<message>
<location line="+3"/>
<source>Select all</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz wszystko</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the next character</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do następnego znaku</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the previous character</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do poprzedniego znaku</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the next word</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do następnego słowa</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the previous word</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do poprzedniego słowa</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the next line</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do następnej linii</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the previous line</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do poprzedniej linii</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the start of the line</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do początku linii</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the end of the line</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do końca linii</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the start of the block</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do początku bloku</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the end of the block</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do końca bloku</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the start of the document</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do początku dokumentu</translation>
</message>
<message>
<location line="+3"/>
<source>Select to the end of the document</source>
- <translation type="unfinished"></translation>
+ <translation>Zaznacz do końca dokumentu</translation>
</message>
<message>
<location line="+3"/>
<source>Delete to the start of the word</source>
- <translation type="unfinished"></translation>
+ <translation>Skasuj do początku słowa</translation>
</message>
<message>
<location line="+3"/>
<source>Delete to the end of the word</source>
- <translation type="unfinished"></translation>
+ <translation>Skasuj do końca słowa</translation>
</message>
<message>
<location line="+33"/>
<source>Insert a new paragraph</source>
- <translation type="unfinished"></translation>
+ <translation>Wstaw nowy paragraf</translation>
</message>
<message>
<location line="+3"/>
<source>Insert a new line</source>
- <translation type="unfinished"></translation>
+ <translation>Wstaw nową linię</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Paste and Match Style</source>
+ <translation>Wklej i dopasuj styl</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Remove formatting</source>
+ <translation>Usuń formatowanie</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Strikethrough</source>
+ <translation>Przekreślenie</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Subscript</source>
+ <translation>Indeks dolny</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Superscript</source>
+ <translation>Indeks górny</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Insert Bulleted List</source>
+ <translation>Wstaw listę wypunktową</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Insert Numbered List</source>
+ <translation>Wstaw listę ponumerowaną</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Indent</source>
+ <translation>Zwiększ wcięcie</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Outdent</source>
+ <translation>Zmniejsz wcięcie</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Center</source>
+ <translation>Wyśrodkuj</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Justify</source>
+ <translation>Wyjustuj</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Align Left</source>
+ <translation>Wyrównaj do lewej</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Align Right</source>
+ <translation>Wyrównaj do prawej</translation>
</message>
</context>
<context>
<name>QWhatsThisAction</name>
<message>
- <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
+ <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+527"/>
<source>What&apos;s This?</source>
<translation>Co to jest?</translation>
</message>
@@ -6279,7 +7121,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QWidget</name>
<message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/>
+ <location filename="../src/gui/kernel/qwidget.cpp" line="+5652"/>
<source>*</source>
<translation>*</translation>
</message>
@@ -6287,7 +7129,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QWizard</name>
<message>
- <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/>
+ <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/>
<source>Go Back</source>
<translation>Wróć</translation>
</message>
@@ -6307,10 +7149,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Wykonano</translation>
</message>
<message>
- <source>Quit</source>
- <translation type="obsolete">Przerwij</translation>
- </message>
- <message>
<location line="+4"/>
<source>Help</source>
<translation>Pomoc</translation>
@@ -6349,18 +7187,18 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QWorkspace</name>
<message>
- <location filename="../src/gui/widgets/qworkspace.cpp" line="+1892"/>
+ <location filename="../src/gui/widgets/qworkspace.cpp" line="+1887"/>
<location line="+60"/>
<source>%1 - [%2]</source>
<translation>%1 - [%2]</translation>
</message>
<message>
- <location line="-1839"/>
+ <location line="-1834"/>
<source>Close</source>
<translation>Zamknij</translation>
</message>
<message>
- <location line="+989"/>
+ <location line="+984"/>
<source>&amp;Close</source>
<translation>&amp;Zamknij</translation>
</message>
@@ -6370,12 +7208,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Zma&amp;ksymalizuj</translation>
</message>
<message>
- <location line="-985"/>
+ <location line="-980"/>
<source>Minimize</source>
<translation>Zminimalizuj</translation>
</message>
<message>
- <location line="+983"/>
+ <location line="+978"/>
<source>Mi&amp;nimize</source>
<translation>Zmi&amp;nimalizuj</translation>
</message>
@@ -6390,12 +7228,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>&amp;Przywróć</translation>
</message>
<message>
- <location line="-977"/>
+ <location line="-972"/>
<source>Restore Down</source>
<translation>Przywróć pod spód</translation>
</message>
<message>
- <location line="+994"/>
+ <location line="+989"/>
<location line="+1059"/>
<source>Sh&amp;ade</source>
<translation>&amp;Zwiń</translation>
@@ -6537,18 +7375,18 @@ Proszę wybrać inną nazwę pliku.</translation>
<context>
<name>QXmlStream</name>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
- <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/>
+ <location filename="../src/corelib/xml/qxmlstream.cpp" line="+611"/>
+ <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1770"/>
<source>Extra content at end of document.</source>
<translation>Dodatkowa treść na końcu dokumentu.</translation>
</message>
<message>
- <location line="+222"/>
+ <location line="+271"/>
<source>Invalid entity value.</source>
<translation>Niepoprawna wartość jednostki.</translation>
</message>
<message>
- <location line="+107"/>
+ <location line="+109"/>
<source>Invalid XML character.</source>
<translation>Niepoprawny znak XML.</translation>
</message>
@@ -6628,7 +7466,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nieoczekiwany &apos;</translation>
</message>
<message>
- <location line="+210"/>
+ <location line="+225"/>
<source>Expected character data.</source>
<translation>Oczekiwana dana znakowa.</translation>
</message>
@@ -6663,7 +7501,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Niepoprawna nazwa instrukcji przetwarzającej.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
+ <location filename="../src/corelib/xml/qxmlstream.cpp" line="-536"/>
<location line="+12"/>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
<location line="+53"/>
@@ -6788,11 +7626,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Przynajmniej jeden komponent musi wystąpić po nawiasie %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
- <source>No operand in an integer division, %1, can be %2.</source>
- <translation>Żaden składnik dzielenia %1 nie może być %2.</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
<source>%1 is not a valid value of type %2.</source>
<translation>%1 nie jest poprawną wartością dla typu %2.</translation>
@@ -6866,7 +7699,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+9"/>
<source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation>Nazwa dla wyliczonego atrybutu nie może mieć przestrzeni nazw URI %1 z lokalną nazwą %2.</translation>
+ <translation>Nazwa dla wyliczonego atrybutu nie może zawierać przestrzeni nazw URI %1 z lokalną nazwą %2.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
@@ -6879,26 +7712,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Podczas rzutowania na %1 lub na typ pochodny, wartość źródłowa musi być tego samego typu lub musi być zapisem tekstowym. Typ %2 nie jest dozwolony.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+149"/>
- <source>It is not possible to cast from %1 to %2.</source>
- <translation>Nie można zrzutować %1 na %2.</translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
- <translation>Rzutowanie na %1 nie jest możliwe, ponieważ to jest typ abstrakcyjny i dlatego nie można go zinstancjonować.</translation>
- </message>
- <message>
- <location line="+23"/>
- <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
- <translation>Nie można zrzutować wartości %1 typu %2 na %3</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Failure when casting from %1 to %2: %3</source>
- <translation>Błąd podczas rzutowania %1 na %2: %3</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
<source>A comment cannot contain %1</source>
<translation>Komentarz nie może zawierać %1</translation>
@@ -6909,22 +7722,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Komentarz nie może kończyć się: %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
- <source>No comparisons can be done involving the type %1.</source>
- <translation>Żadne porównania nie mogą być wykonane dla typu %1.</translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
- <translation>Operator %1 jest niedostępny pomiędzy atomowymi wartościami %2 i %3.</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
<source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation>Węzeł &quot;attribute&quot; nie może być dzieckiem węzła &quot;document&quot;. Dlatego atrybut %1 jest w złym miejscu.</translation>
+ <translation>Węzeł &quot;attribute&quot; nie może być podelementem węzła &quot;document&quot;. Dlatego atrybut %1 jest w złym miejscu.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
+ <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+162"/>
<source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
<translation>Moduł biblioteki nie może być bezpośrednio oceniony. On musi być zaimportowany z głównego modułu.</translation>
</message>
@@ -6995,11 +7798,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>%1 nie jest poprawnym znakiem XML 1.0.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
- <source>The first argument to %1 cannot be of type %2.</source>
- <translation>Pierwszy argument dla %1 nie może być typu %2.</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
<source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
<translation>Jeśli oba argumenty mają przesunięcia strefowe, muszą one być takie same. %1 i %2 nie są takie same.</translation>
@@ -7017,12 +7815,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+39"/>
<source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished">W zastępczym ciągu, po %1 musi następować przynajmniej jedna cyfra</translation>
+ <translation type="unfinished">W ciągu zastępczym, po %1 musi następować przynajmniej jedna cyfra</translation>
</message>
<message>
<location line="+26"/>
<source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation>W zastępczym ciągu %1 może być użyte tylko do zabezpieczenia samej siebie lub %2, nigdy %3</translation>
+ <translation type="unfinished">W ciągu zastępczym, %1 może być użyte tylko do zabezpieczenia samej siebie lub %2, nigdy %3</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
@@ -7045,7 +7843,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Spacje są usuwane z wyjątkiem kiedy pojawią się w klasach znakowych</translation>
</message>
<message>
- <location line="+99"/>
+ <location line="+100"/>
<source>%1 is an invalid regular expression pattern: %2</source>
<translation>%1 jest niepoprawnym wzorcem wyrażenia regularnego: %2</translation>
</message>
@@ -7057,15 +7855,15 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
<source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation>Jeśli pierwszy argument jest pustą sekwencją lub zerowej długości ciągiem (przy braku przestrzeni nazw), przedrostek nie może wystąpić. Wystąpił przedrostek %1.</translation>
+ <translation>Jeśli pierwszy argument jest pustą sekwencją lub zerowej długości ciągiem (przy braku przestrzeni nazw), przedrostek nie może wystąpić. Podano przedrostek %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/>
+ <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+346"/>
<source>It will not be possible to retrieve %1.</source>
<translation>Nie będzie można odzyskać %1.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
+ <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+266"/>
<source>The default collection is undefined</source>
<translation>Domyślna kolekcja jest niezdefiniowana</translation>
</message>
@@ -7095,13 +7893,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Element %1 nie został dopasowany do wymaganego typu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
- <location line="+7253"/>
+ <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+352"/>
+ <location line="+7323"/>
<source>%1 is an unknown schema type.</source>
<translation>%1 jest nieznanym typem schematu.</translation>
</message>
<message>
- <location line="-6971"/>
+ <location line="-7041"/>
<source>Only one %1 declaration can occur in the query prolog.</source>
<translation>Tylko jedna deklaracja %1 może się pojawić w prologu zapytania.</translation>
</message>
@@ -7131,10 +7929,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nie jest możliwe ponowne zadeklarowanie przedrostka %1.</translation>
</message>
<message>
- <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source>
- <translation type="obsolete">Jedynie przedrostek %1 może być zadeklarowany do powiązania przestrzeni nazw %2. Domyślnie jest ona powiązana z przedrostkiem %1.</translation>
- </message>
- <message>
<location line="+18"/>
<source>Prefix %1 is already declared in the prolog.</source>
<translation>Przedrostek %1 jest już zadeklarowany w prologu.</translation>
@@ -7187,7 +7981,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+37"/>
<source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation>Argument o nazwie %1 został już zadeklarowany. Każda nazwa argumentu musi być unikalna.</translation>
+ <translation>Argument o nazwie %1 został już zadeklarowany. Każda nazwa argumentu musi być unikatowa.</translation>
</message>
<message>
<location line="+456"/>
@@ -7195,37 +7989,47 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Nazwa zmiennej powiązanej w wyrażeniu &quot;for&quot; musi być inna od zmiennej pozycjonującej. W związku z tym dwie zmienne o nazwie %1 kolidują ze sobą.</translation>
</message>
<message>
- <location line="+758"/>
+ <location line="+778"/>
<source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
<translation>Cecha &quot;Walidacja schematu&quot; nie jest obsługiwana. Dlatego też wyrażenia %1 nie mogą być użyte.</translation>
</message>
<message>
- <location line="+39"/>
+ <location line="+40"/>
<source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
<translation>Wyrażenia &quot;pragma&quot; nie są obsługiwane. Dlatego musi wystąpić wyrażenie zastępcze</translation>
</message>
<message>
- <location line="+396"/>
+ <location line="+398"/>
<source>The %1-axis is unsupported in XQuery</source>
<translation>Oś %1 nie jest obsługiwana w XQuery</translation>
</message>
<message>
- <location line="-5879"/>
+ <location line="-5902"/>
<source>%1 is not a valid numeric literal.</source>
<translation>%1 nie jest poprawnym zapisem liczbowym.</translation>
</message>
<message>
- <location line="+438"/>
- <source>No variable by name %1 exists</source>
- <translation>Zmienna o nazwie %1 nie istnieje</translation>
+ <location line="-152"/>
+ <source>W3C XML Schema identity constraint selector</source>
+ <translation>Selektor ograniczenia jednostki W3C XML Schema</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>W3C XML Schema identity constraint field</source>
+ <translation>Pole ograniczenia jednostki W3C XML Schema</translation>
</message>
<message>
- <location line="-582"/>
- <source>A construct was encountered which only is allowed in XQuery.</source>
- <translation>Wystąpiła konstrukcja dozwolona jedynie w XQuery.</translation>
+ <location line="+4"/>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation>Wystąpiła konstrukcja która jest niedozwolona w bieżącym języku (%1).</translation>
</message>
<message>
- <location line="+118"/>
+ <location line="+583"/>
+ <source>No variable by name %1 exists</source>
+ <translation>Zmienna o nazwie %1 nie istnieje</translation>
+ </message>
+ <message>
+ <location line="-464"/>
<source>A template by name %1 has already been declared.</source>
<translation>Szablon o nazwie %1 został już zadeklarowany.</translation>
</message>
@@ -7242,7 +8046,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+75"/>
<source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Przedrostek %1 nie może być powiązany. Jest on domyślnie powiązany z przestrzenią nazw %2.</translation>
</message>
<message>
<location line="+312"/>
@@ -7252,7 +8056,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+135"/>
<source>A stylesheet function must have a prefixed name.</source>
- <translation>Funkcja arkusza stylu musi mieć nazwę z przedrostkiem.</translation>
+ <translation>Funkcja arkusza stylu musi zawierać nazwę z przedrostkiem.</translation>
</message>
<message>
<location line="+9"/>
@@ -7277,7 +8081,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+9"/>
<source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation>We wzorze XSL-T funkcja %1 nie może mieć trzeciego argumentu.</translation>
+ <translation>We wzorze XSL-T funkcja %1 nie może zawierać trzeciego argumentu.</translation>
</message>
<message>
<location line="+10"/>
@@ -7295,12 +8099,12 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>%1 nie jest poprawną nazwa trybu szablonu.</translation>
</message>
<message>
- <location line="+1108"/>
+ <location line="+1131"/>
<source>Each name of a template parameter must be unique; %1 is duplicated.</source>
<translation>Każda nazwa parametru szablonu musi być unikatowa; %1 się powtarza.</translation>
</message>
<message>
- <location line="+415"/>
+ <location line="+462"/>
<source>No function by name %1 is available.</source>
<translation>Żadna funkcja o nazwie %1 nie jest dostępna.</translation>
</message>
@@ -7367,17 +8171,13 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+76"/>
<source>%1 is not a valid name for a processing-instruction.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source>
- <translation type="obsolete">%1 nie jest poprawną nazwą dla instrukcji przetwarzającej. Dlatego ten test nazwy nigdy nie zostanie dopasowany.</translation>
+ <translation>%1 nie jest poprawną nazwą dla instrukcji przetwarzającej.</translation>
</message>
<message>
<location line="+69"/>
<location line="+71"/>
<source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 nie jest wewnątrz zakresu deklaracji atrybutów. Zwróć uwagę że importowanie schematów nie jest obsługiwane.</translation>
</message>
<message>
<location line="+48"/>
@@ -7440,26 +8240,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Obsługiwane jest jedynie &quot;Unicode Codepoint Collation&quot; (%1), %2 nie jest obsługiwane.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
- <source>An %1-attribute with value %2 has already been declared.</source>
- <translation>Atrybut %1 o wartości %2 został już zadeklarowany.</translation>
- </message>
- <message>
- <location line="+13"/>
- <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
- <translation>Atrybut %1 musi mieć poprawną %2 wartość. %3 nią nie jest.</translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+7"/>
- <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
- <translation>Dzielnik %1 nie może być nieskończonością (%2).</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>The second operand in a division, %1, cannot be zero (%2).</source>
- <translation>Dzielna %1 nie może być zerem (%2).</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="-180"/>
<source>Integer division (%1) by zero (%2) is undefined.</source>
<translation>Dzielenie w dziedzinie liczb całkowitych (%1) przez zero (%2) jest niezdefiniowane.</translation>
@@ -7475,11 +8255,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Dzielenie modulo (%1) przez zero (%2) jest niezdefiniowane.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="-73"/>
- <source>No casting is possible with %1 as the target type.</source>
- <translation>Rzutowanie na typ %1 nie jest możliwe.</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="-24"/>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
<translation>Docelowa nazwa w instrukcji przetwarzania nie może być %1 w żadnej kombinacji wielkich i małych liter. Dlatego nazwa %2 jest niepoprawna.</translation>
@@ -7513,7 +8288,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>%1 nie jest całkowitą liczbą minut.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3922"/>
+ <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="-3992"/>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
<translation>Enkodowanie %1 jest niepoprawne. Może ono zawierać jedynie znaki alfabetu łacińskiego, nie może zawierać spacji i musi być dopasowane do wyrażenia regularnego %2.</translation>
</message>
@@ -7534,7 +8309,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Importy modułów muszą pojawić się przed deklaracjami funkcji, zmiennych i opcji.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
+ <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+344"/>
<source>%1 is an unsupported encoding.</source>
<translation>Nieobsługiwane kodowanie %1.</translation>
</message>
@@ -7546,7 +8321,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+18"/>
<source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation type="unfinished"></translation>
+ <translation>Kod %1 który pojawił się w %2 i który używa kodowania %3 jest niepoprawnym znakiem XML.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
@@ -7554,13 +8329,9 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Dopasowano niejednoznaczną regułę.</translation>
</message>
<message>
- <source>In a namespace constructor, the value for a namespace value cannot be an empty string.</source>
- <translation type="obsolete">W konstruktorze przestrzeni nazw wartość przestrzeni nazw nie może być pustym ciągiem.</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
<source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation type="unfinished"></translation>
+ <translation>W konstruktorze przestrzeni nazw wartość przestrzeni nazw nie może być pustym ciągiem.</translation>
</message>
<message>
<location line="+11"/>
@@ -7578,11 +8349,6 @@ Proszę wybrać inną nazwę pliku.</translation>
<translation>Tylko przedrostek %1 może być powiązany z %2 i vice versa.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
- <source>Circularity detected</source>
- <translation>Wykryto cykl</translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
<source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
<translation>Wymagany jest parametr %1 lecz żaden odpowiadający mu %2 nie został dostarczony.</translation>
@@ -7650,45 +8416,10 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+28"/>
<source>At least one mode must be specified in the %1-attribute on element %2.</source>
- <translation>Przynajmniej jeden tryb musi być określony w atrybucie %1 elementu %2.</translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
- <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
- <translation>W elemencie %2 nie może wystąpić atrybut %1. Wystąpić mogą jedynie standardowe atrybuty.</translation>
- </message>
- <message>
- <location line="+6"/>
- <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
- <translation>W elemencie %2 nie może wystąpić atrybut %1. Wystąpić może %3 lub standardowe atrybuty.</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
- <translation>W elemencie %2 nie może wystąpić atrybut %1. Wystąpić może %3, %4 lub standardowe atrybuty.</translation>
- </message>
- <message>
- <location line="+9"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
- <translation>W elemencie %2 nie może wystąpić atrybut %1. Wystąpić może %3 lub standardowe atrybuty.</translation>
- </message>
- <message>
- <location line="+13"/>
- <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
- <translation>Atrybuty XSL-T w elementach XSL-T muszą być w zerowej przestrzeni nazw a nie w przestrzeni nazw XSL-T którą jest %1.</translation>
- </message>
- <message>
- <location line="+12"/>
- <source>The attribute %1 must appear on element %2.</source>
- <translation>W elemencie %2 musi wystąpić atrybut %1.</translation>
- </message>
- <message>
- <location line="+8"/>
- <source>The element with local name %1 does not exist in XSL-T.</source>
- <translation>Element o lokalnej nazwie %1 nie istnieje w XSL-T.</translation>
+ <translation>Przynajmniej jeden tryb musi być podany w atrybucie %1 elementu %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
+ <location line="+123"/>
<source>Element %1 must come last.</source>
<translation>Element %1 musi wystąpić jako ostatni.</translation>
</message>
@@ -7741,7 +8472,7 @@ Proszę wybrać inną nazwę pliku.</translation>
<message>
<location line="+15"/>
<source>A parameter in a function cannot be declared to be a tunnel.</source>
- <translation type="unfinished"></translation>
+ <translation>Parametr funkcji nie może być zadeklarowany jako tunelowy.</translation>
</message>
<message>
<location line="+149"/>
@@ -7773,19 +8504,1427 @@ Proszę wybrać inną nazwę pliku.</translation>
<source>At least one %1 element must appear as child of %2.</source>
<translation>Przynajmniej jeden element %1 musi wystąpić jako potomek %2.</translation>
</message>
-</context>
-<context>
- <name>VolumeSlider</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
- <source>Muted</source>
- <translation>Wyciszony</translation>
+ <location filename="../src/xmlpatterns/schema/qxsdschemachecker.cpp" line="+227"/>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation>%1 ma pętlę w dziedziczeniu w jego podstawowym typie %2.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <location line="+24"/>
+ <source>Circular inheritance of base type %1.</source>
+ <translation>Cykliczne dziedziczenie podstawowego typu %1.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Circular inheritance of union %1.</source>
+ <translation>Cykliczne dziedziczenie unii %1.</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 ograniczając go ponieważ jest on zdefiniowany jako ostateczny.</translation>
</message>
<message>
<location line="+5"/>
+ <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 rozszerzając go ponieważ jest on zdefiniowany jako ostateczny.</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation>Typ podstawowy dla typu prostego %1 nie może być typem złożonym %2.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation>Typ prosty %1 nie może mieć bezpośredniego typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <location line="+9"/>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation>Typ prosty %1 nie może mieć typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
+ <translation>Typem podstawowym typu prostego %1 może być tylko typ atomowy.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation>Typ prosty %1 nie może wywodzić się z %2 ponieważ ten ostatni jest zdefiniowany jako ostateczny.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <location line="+484"/>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation>Typem elementu %1 musi być albo typ atomowy albo unia.</translation>
+ </message>
+ <message>
+ <location line="-474"/>
+ <location line="+483"/>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation>Typy składników %1 muszą być atomowe.</translation>
+ </message>
+ <message>
+ <location line="-470"/>
+ <location line="+451"/>
+ <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 poprzez listę ponieważ jest to zdefiniowane ostatecznie w typie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="-431"/>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation>Typ prosty %1 może jedynie posiadać aspekt %2.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation>Typ podstawowy dla typu prostego %1 musi być listą typów.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation>Typ podstawowy dla typu prostego %1 ma zdefiniowane wywodzenie poprzez ograniczenie jako ostateczne.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation>Typ elementu w podstawowym typie nie pasuje do typu %1.</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <location line="+93"/>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation>Typ prosty %1 posiada niedozwolony aspekt %2.</translation>
+ </message>
+ <message>
+ <location line="-72"/>
+ <location line="+413"/>
+ <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
+ <translation>Nie można wywieść %1 z %2 poprzez unię ponieważ jest to zdefiniowane ostatecznie w typie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="-404"/>
+ <source>%1 is not allowed to have any facets.</source>
+ <translation>%1 nie może posiadać żadnych aspektów.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
+ <translation>Typ podstawowy %1 dla typu prostego %2 musi być unią.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
+ <translation>Typ podstawowy %1 dla typu prostego %2 nie może posiadać ograniczenia dla atrybutu %3.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
+ <translation>Typ %1 składnika nie może być wywiedziony z typu %2 który jest typem składnika %3 typu podstawowego %4.</translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation>Metodą wywodzenia z %1 musi być rozszerzenie ponieważ typ podstawowy %2 jest typem prostym.</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
+ <translation>Typ złożony %1 posiada powielony element %2 w jego modelu zawartości.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Complex type %1 has non-deterministic content.</source>
+ <translation>Typ złożony %1 posiada nieokreśloną zawartość.</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
+ <translation>Atrybuty typu złożonego %1 nie są poprawnym rozszerzeniem atrybutów typu podstawowego %2: %3.</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation>Model zawartości typu złożonego %1 nie jest poprawnym rozszerzenien modelu zawartości %2.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Complex type %1 must have simple content.</source>
+ <translation>Typ złożony %1 musi mieć prostą zawartość.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
+ <translation>Typ złożony %1 musi posiadać ten sam prosty typ jaki posiada jego klasa podstawowa %2.</translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation>Typ złożony %1 nie może być wywiedziony z typu %2%3.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
+ <translation>Atrybuty typu złożonego %1 nie są poprawnym ograniczeniem atrybutów typu podstawowego %2: %3.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation>Typ złożony %1 z prostą zawartością nie może być wywiedziony z podstawowego typu złożonego %2.</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation>Typ elementu w prostym typie %1 nie może być typem złożonym.</translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation>Typ składnika typu prostego %1 nie może być typem złożonym.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation>%1 nie może posiadać typu składnika o tej samej nazwie jaką on sam posiada.</translation>
+ </message>
+ <message>
+ <location line="+83"/>
+ <location line="+29"/>
+ <location line="+34"/>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation>Aspekt %1 koliduje z aspektem %2.</translation>
+ </message>
+ <message>
+ <location line="-20"/>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation>Aspekt %1 musi mieć tą samą wartość jaką ma aspekt %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi większa od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+125"/>
+ <location line="+55"/>
+ <location line="+12"/>
+ <location line="+91"/>
+ <location line="+58"/>
+ <location line="+34"/>
+ <location line="+35"/>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="-389"/>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation>Aspekt %1 zawiera niepoprawe wyrażenie regularne</translation>
+ </message>
+ <message>
<location line="+15"/>
- <source>Volume: %1%</source>
- <translation>Głośność: %1%</translation>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation>Nieznany zapis %1 użyty w aspekcie %2.</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation>Aspekt %1 zawiera niepoprawną wartość %2: %3.</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation>Aspektem %1 nie może być %2 ani %3 jeśli aspektem %4 typu podstawowego jest %5.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation>Aspektem %1 nie może być %2 jeśli aspektem %3 typu podstawowego jest %4.</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <location line="+55"/>
+ <location line="+230"/>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od lub równa wartości aspektu %2.</translation>
+ </message>
+ <message>
+ <location line="-257"/>
+ <location line="+134"/>
+ <location line="+82"/>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="-201"/>
+ <location line="+79"/>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation>Aspekty %1 i %2 nie mogą wystąpić jednocześnie.</translation>
+ </message>
+ <message>
+ <location line="-27"/>
+ <location line="+12"/>
+ <location line="+113"/>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być większa od wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="-86"/>
+ <location line="+58"/>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation>Wartość aspektu %1 musi być mniejsza od wartości aspektu %2.</translation>
+ </message>
+ <message>
+ <location line="-42"/>
+ <location line="+58"/>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation>Wartość aspektu %1 musi być większa od lub równa wartości aspektu %2 typu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation>Typ prosty zawiera niedozwolony aspekt %1.</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation>Aspekty %1, %2, %3, %4, %5 i %6 nie są dozwolone podczas wywodzenia z listy.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation>Dozwolone są jedynie aspekty %1 i %2 podczas wywodzenia z unii.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <location line="+16"/>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation>%1 zawiera aspekt %2 z niepoprawnymi danymi: %3.</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation>Grupa atrybutów %1 zawiera dwukrotnie atrybut %2.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation>Grupa atrybutów %1 zawiera dwa różne atrybuty których typy są wywiedzione z %2.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation>Grupa atrybutów %1 zawiera atrybut %2 który ma ograniczenie wartości ale typ wywodzi się z %3.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation>Typ złożony %1 zawiera atrybut %2 dwukrotnie.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation>Typ złożony %1 zawiera dwa różne atrybuty których typy są wywiedzione z %2.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation>Typ złożony %1 zawiera atrybut %2 który ma ograniczenie wartości ale typ wywodzi się z %3.</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation>Element %1 nie może zawierać ograniczenia wartości gdy jego typ podstawowy jest złożony.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
+ <translation>Element %1 nie może zawierać ograniczenia wartości gdy jego typ jest wywiedziony z %2.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <location line="+11"/>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
+ <translation>Ograniczenie wartości elementu %1 nie jest typu: %2.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
+ <translation>Element %1 nie może przynależeć do grupy zastępującej ponieważ nie jest on elementem globalnym.</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
+ <translation>Typ elementu %1 nie może być wywiedziony z typu przynależnego do grupy zastępującej.</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
+ <translation>Ograniczenie wartości atrybutu %1 nie jest typu: %2.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation>Atrybut %1 posiada ograniczenie wartości lecz jego typ wywodzi się z %2.</translation>
+ </message>
+ <message>
+ <location line="+56"/>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi być %2 jak w typie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać ograniczenie wartości %2 jak w typie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać te same ograniczenie wartości %2 jak w typie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation>Atrybut %1 w wywiedzionym typie złożonym musi zawierać ograniczenie wartości %2.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation>&quot;processContent&quot; podstawowego znacznika musi być słabszy od wywiedzionego znacznika.</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <location line="+15"/>
+ <source>Element %1 exists twice with different types.</source>
+ <translation>Istnieją dwa elementy %1 o różnych typach.</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Particle contains non-deterministic wildcards.</source>
+ <translation>Element zawiera nieokreślone znaczniki.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemahelper.cpp" line="+691"/>
+ <location line="+63"/>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation>Wymagany jest bazowy atrybut %1, wywiedziony zaś nie.</translation>
+ </message>
+ <message>
+ <location line="-57"/>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation>Typ wywiedzionego atrybutu %1 nie może być poprawnie wywiedziony z typu podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation>Ograniczenie wartości wywiedzionego atrybutu %1 nie pasuje do ograniczenia wartości podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived attribute %1 does not exists in the base definition.</source>
+ <translation>Wywyiedziony atrybut %1 nie istnieje w podstawowej definicji.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation>Wywiedziony atrybut %1 nie pasuje do znacznika w podstawowej definicji.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation>Brak wymaganego bazowego atrybutu %1 w wywiedzionej definicji.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation>Wywiedziona definicja zawiera element %1 który nie istnieje w definicji podstawowej</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation>Wywiedziony znacznik nie jest podzbiorem podstawowego znacznika.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation>%1 wywiedzionego znacznika nie jest poprawnym ograniczeniem %2 podstawowego znacznika</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation>Brak atrybutu %1 typu bazowego w wywiedzionej definicji.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation>Typ wywiedzionego atrybutu %1 różni się od typu podstawowego atrybutu.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation>Podstawowa definicja zawiera element %1 którego brakuje w wywiedzionej definicji</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemaresolver.cpp" line="+354"/>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation>%1 odwołuje się do nieznanego elementu %2 lub %3: %4.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation>%1 odwołuje się do ograniczenia jednostki %2 które nie jest elementem %3 ani %4.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation>%1 posiada inna liczbę pól od ograniczenia jednostki %2 które się do niego odwołuje.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu podstawowego %1 elementu %2.</translation>
+ </message>
+ <message>
+ <location line="+84"/>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu elementu %1 w elemencie %2.</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu %1 składnika elementu %2.</translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <location line="+408"/>
+ <location line="+30"/>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu %1 elementu %2.</translation>
+ </message>
+ <message>
+ <location line="-416"/>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation>Nie można rozwiązać typu podstawowego %1 dla typu złożonego.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation>%1 nie może mieć złożonego typu podstawowego który ma %2.</translation>
+ </message>
+ <message>
+ <location line="+279"/>
+ <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
+ <translation>Model zawartości typu złożonego %1 posiada element %2 więc nie może być on wywiedziony poprzez rozszerzenie niepustego typu.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
+ <translation>Typ złożony %1 nie może być wywiedziony z %2 poprzez rozszerzenie ponieważ ten ostatni zawiera element %3 w jego modelu zawartości.</translation>
+ </message>
+ <message>
+ <location line="+101"/>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation>Typem elementu %1 musi być typ prosty, %2 nim nie jest.</translation>
+ </message>
+ <message>
+ <location line="+62"/>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać grupy zastępującej %1 elementu %2.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation>Grupa zastępująca %1 posiada cykliczną definicję.</translation>
+ </message>
+ <message>
+ <location line="+120"/>
+ <location line="+7"/>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation>Powielona nazwa elementu %1 w elemencie %2.</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <location line="+52"/>
+ <location line="+71"/>
+ <location line="+28"/>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation>Nie można rozwiązać odwołania %1 do elementu %2.</translation>
+ </message>
+ <message>
+ <location line="-138"/>
+ <source>Circular group reference for %1.</source>
+ <translation>Cykliczne odwołanie do grupy dla %1.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>%1 element is not allowed in this scope</source>
+ <translation>Element %1 nie jest dozwolony w tym zakresie</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation>Element %1 nie może mieć atrybutu %2 z wartością inną niż %3.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation>Element %1 nie może mieć atrybutu %2 z wartością inną niż %3 lub %4.</translation>
+ </message>
+ <message>
+ <location line="+91"/>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation>Atrybut %1 lub %2 odwołania %3 nie pasuje do deklaracji atrybutu %4.</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation>Grupa atrybutów %1 posiada cykliczne odwołanie.</translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation>Atrybut %1 w %2 powinien używać %3 jak w typie podstawowym %4.</translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
+ <translation>Znacznik atrybutu %1 nie jest poprawnym ograniczeniem znacznika atrybutu typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation>%1 posiada znacznik atrybutu lecz jego typ podstawowy %2 go nie posiada.</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
+ <translation>Nie można wyrazić unii znacznika atrybutu typu %1 i znacznika atrybutu jego typu podstawowego %2.</translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
+ <translation>Aspekt &quot;enumeration&quot; posiada niepoprawną zawartość: {%1} nie jest wartością typu %2.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
+ <translation>Przedrostek przestrzeni nazw występujący w pełnej nazwie %1 nie jest zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+51"/>
+ <location line="+18"/>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
+ <translation>Element %1 (%2) nie jest poprawnym ograniczeniem elementu %3 który redefiniuje: %4.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdparticlechecker.cpp" line="+165"/>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
+ <translation>Pusty element nie może być wywiedziony z niepustego elementu.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Derived particle is missing element %1.</source>
+ <translation>Brak elementu %1 w wywiedzionym elemencie.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation>Brak ograniczenia wartości w wywiedzionym elemencie %1 takiego jak w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation>Wywiedziony element %1 posiada słabsze ograniczenie wartości niż element podstawowy.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation>Ograniczenie stałej wartości elementu %1 różni się od ograniczenia wartości w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation>Wywiedziony element %1 może być zerowalny ponieważ element podstawowy nie jest zerowalny.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation>Ograniczenia blokujące dla wywiedzionego elementu %1 nie mogą być słabsze od ograniczeń w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation>Typ prosty w elemencie wywiedzionym %1 nie może być poprawnie wywiedziony z elementu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation>Typ złożony w elemencie wywiedzionym %1 nie może być poprawnie wywiedziony z elementu podstawowego.</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation>Brak elementu %1 w wywiedzionym elemencie.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation>Element %1 nie pasuje do znacznika w ograniczeniu przestrzeni nazw w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation>Znacznik w wywiedzionym elemencie nie jest poprawnym podzbiorem znacznika w elemencie podstawowym.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation>&quot;processContent&quot; znacznika w wywiedzionym elemencie jest słabszy od znacznika w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <location line="+240"/>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation>Wywiedziony element pozwala na zawartość która jest niedozwolona w podstawowym elemencie.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+170"/>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation>Nie można przetworzyć nieznanego elementu %1, spodziewanymi elementami są: %2.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation>Element %1 jest niedozwolony w tym zakresie, możliwymi elementami są: %2.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation>Brak podelementu w tym zakresie, możliwymi podelementami są: %1.</translation>
+ </message>
+ <message>
+ <location line="+127"/>
+ <source>Document is not a XML schema.</source>
+ <translation>Dokument nie jest schematem XML.</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
+ <translation>Atrybut %1 elementu %2 posiada niepoprawną zawartość: {%3} nie jest wartością typu %4.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation>Atrybut %1 elementu %2 posiada niepoprawną zawartość: {%3}.</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
+ <translation>Docelowa przestrzeń nazw %1 załączonego schematu jest różna od docelowej przestrzeni nazw %2 która jest zdefiniowana w schemacie załączającym.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <location line="+11"/>
+ <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
+ <translation>Docelowa przestrzeń nazw %1 zaimportowanego schematu jest różna od docelowej przestrzeni nazw %2 która jest zdefiniowana w schemacie importującym.</translation>
+ </message>
+ <message>
+ <location line="+237"/>
+ <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
+ <translation>Element %1 nie może zawierać tej samej wartości atrybutu %2 co docelowa przestrzeń nazw %3.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation>Element %1 bez atrybutu %2 jest niedozwolony wewnątrz schematu bez docelowej przestrzeni nazw.</translation>
+ </message>
+ <message>
+ <location line="+833"/>
+ <location line="+158"/>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation>Element %1 jest niedozwolony wewnątrz elementu %2 jeśli jest obecny atrybut %3.</translation>
+ </message>
+ <message>
+ <location line="-97"/>
+ <location line="+119"/>
+ <location line="+92"/>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation>Element %1 nie posiada ani atrybutu %2 ani podelementu %3.</translation>
+ </message>
+ <message>
+ <location line="+835"/>
+ <location line="+1474"/>
+ <location line="+232"/>
+ <location line="+7"/>
+ <location line="+260"/>
+ <location line="+17"/>
+ <location line="+258"/>
+ <location line="+6"/>
+ <location line="+17"/>
+ <location line="+6"/>
+ <location line="+17"/>
+ <location line="+11"/>
+ <location line="+11"/>
+ <location line="+11"/>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation>Element %1 z podelementem %2 nie może mieć atrybutu %3.</translation>
+ </message>
+ <message>
+ <location line="-1325"/>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation>Atrybutem %1 elementu %2 musi być %3 lub %4.</translation>
+ </message>
+ <message>
+ <location line="+36"/>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation>Atrybut %1 elementu %2 musi posiadać wartość %3.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+34"/>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation>Atrybut %1 elementu %2 musi posiadać wartość %3 lub %4.</translation>
+ </message>
+ <message>
+ <location line="+319"/>
+ <location line="+129"/>
+ <location line="+9"/>
+ <location line="+7"/>
+ <location line="+7"/>
+ <location line="+327"/>
+ <location line="+203"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+77"/>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation>Element %1 nie może posiadać jednocześnie atrybutów %2 i %3.</translation>
+ </message>
+ <message>
+ <location line="-768"/>
+ <location line="+222"/>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation>Zawartość atrybutu %1 elementu %2 nie może pochodzić z przestrzeni nazw %3.</translation>
+ </message>
+ <message>
+ <location line="-215"/>
+ <location line="+222"/>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation>Atrybut %1 elementu %2 nie może być %3.</translation>
+ </message>
+ <message>
+ <location line="-64"/>
+ <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
+ <translation>Atrybut %1 elementu %2 musi zawierać wartość %3 ponieważ atrybut %4 jest ustawiony.</translation>
+ </message>
+ <message>
+ <location line="+187"/>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation>Podawanie: use=&apos;prohibited&apos; wewnątrz grupy atrybutów nie przynosi żadnego efektu.</translation>
+ </message>
+ <message>
+ <location line="+353"/>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation>Element %1 musi zawierać atrybut %2 albo %3.</translation>
+ </message>
+ <message>
+ <location line="+554"/>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation>Element %1 musi zawierać albo atrybut %2 albo %3 lub %4 jako podelement.</translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation>Element %1 wymaga atrybutu %2 albo %3.</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation>Tekst ani odwołanie nie są dozwolone wewnątrz elementu %1</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <location line="+112"/>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation>Atrybut %1 elementu %2 musi zawierać %3, %4 lub listę URI.</translation>
+ </message>
+ <message>
+ <location line="+126"/>
+ <source>%1 element is not allowed in this context.</source>
+ <translation>Element %1 jest niedozwolony w tym kontekście.</translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation>Atrybut %1 elementu %2 posiada większą wartość niż atrybut %3.</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation>Przedrostek w pełnej nazwie %1 nie jest zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <location line="+61"/>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation>Atrybut %1 elementu %2 musi zawierać albo %3 albo inne wartości.</translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Component with id %1 has been defined previously.</source>
+ <translation>Komponent o identyfikatorze %1 został uprzednio zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Element %1 already defined.</source>
+ <translation>Element %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 already defined.</source>
+ <translation>Atrybut %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Type %1 already defined.</source>
+ <translation>Typ %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Attribute group %1 already defined.</source>
+ <translation>Grupa atrybutów %1 jest już zdefiniowana.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Element group %1 already defined.</source>
+ <translation>Grupa elementów %1 jest już zdefiniowana.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Notation %1 already defined.</source>
+ <translation>Zapis %1 jest już zdefiniowany.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Identity constraint %1 already defined.</source>
+ <translation>Ograniczenie jednostki %1 jest już zdefiniowane.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation>Powielone aspekty w prostym typie %1.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdtypechecker.cpp" line="+233"/>
+ <location line="+7"/>
+ <location line="+21"/>
+ <source>%1 is not valid according to %2.</source>
+ <translatorcomment>Ponieważ nie wiadomo co jest podmiotem nie można stwierdzić czy to ma być &quot;poprawnym&quot;, &quot;poprawną&quot; czy &quot;poprawne&quot;</translatorcomment>
+ <translation>%1 nie jest poprawne według %2.</translation>
+ </message>
+ <message>
+ <location line="+167"/>
+ <source>String content does not match the length facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>String content does not match the minLength facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>String content does not match the maxLength facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>String content does not match pattern facet.</source>
+ <translation>Wartość ciągu koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation>Wartość ciągu nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby całkowitej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby całkowitej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby naturalnej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby naturalnej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation>Wartość liczby rzeczywistej nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Double content does not match pattern facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;fractionDigits&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation>Wartość liczby rzeczywistej koliduje z aspektem &quot;totalDigits&quot;.</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation>Zawartość daty i czasu nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Date time content does not match pattern facet.</source>
+ <translation>Zawartość daty i czasu koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation>Wartość czasu trwania koliduje z aspektem &quot;maxInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation>Wartość czasu trwania koliduje z aspektem &quot;maxExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation>Wartość czasu trwania koliduje z aspektem &quot;minInclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation>Wartość czasu trwania koliduje z aspektem &quot;minExclusive&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation>Wartość czasu trwania nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Duration content does not match pattern facet.</source>
+ <translation>Wartość czasu trwania koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation>Wartość boolowska koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Binary content does not match the length facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation>Wartość binarna koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation>Wartość binarna nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Invalid QName content: %1.</source>
+ <translation>Niepoprawna zawartość QName: %1.</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation>Zawartość QName nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>QName content does not match pattern facet.</source>
+ <translation>Zawartość QName koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+36"/>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation>Zapis zawartości nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>List content does not match length facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;length&quot;.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>List content does not match minLength facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;minLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>List content does not match maxLength facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;maxLength&quot;.</translation>
+ </message>
+ <message>
+ <location line="+90"/>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation>Zawartość listy nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>List content does not match pattern facet.</source>
+ <translation>Zawartość listy koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation>Zawartość unii nie widnieje na liście aspektu &quot;enumeration&quot;.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Union content does not match pattern facet.</source>
+ <translation>Zawartość unii koliduje z aspektem &quot;pattern&quot;.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation>Dane typu %1 nie mogą być puste.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp" line="+160"/>
+ <source>Element %1 is missing child element.</source>
+ <translation>Brak wymaganego podelementu w elemencie %1.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation>Istnieje wartość IDREF bez odpowiadającej jej wartości ID: %1.</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Loaded schema file is invalid.</source>
+ <translation>Załadowany plik nie jest poprawnym plikiem ze schematem.</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>%1 contains invalid data.</source>
+ <translation>%1 zawiera niepoprawne dane.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation>Przestrzeń nazw &quot;xsi:schemaLocation&quot; %1 wystąpiła już wcześniej w dokumencie.</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation>&quot;xsi:noNamespaceSchemaLocation&quot; nie może wystąpić po pierwszym elemencie lub atrybucie który nie jest przestrzenią nazw.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>No schema defined for validation.</source>
+ <translation>Brak zdefiniowanego schematu dla walidacji.</translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>No definition for element %1 available.</source>
+ <translation>Brak dostępnej definicji dla elementu %1.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <location line="+49"/>
+ <location line="+142"/>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation>Podany typ %1 nie jest schematowi znany.</translation>
+ </message>
+ <message>
+ <location line="-176"/>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation>Element %1 nie jest zdefiniowany w tym zakresie.</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation>Brak deklaracji dla elementu %1.</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Element %1 contains invalid content.</source>
+ <translation>Element %1 posiada niepoprawną zawartość.</translation>
+ </message>
+ <message>
+ <location line="+73"/>
+ <source>Element %1 is declared as abstract.</source>
+ <translation>Element %1 jest zadeklarowany jako abstrakcyjny.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 is not nillable.</source>
+ <translation>Element %1 nie jest zerowalny.</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation>Atrybut %1 zawiera niepoprawne dane: %2</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Element contains content although it is nillable.</source>
+ <translation>Element posiada zawartość chociaż jest zerowalny.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Fixed value constrained not allowed if element is nillable.</source>
+ <translation>Ograniczenie stałej wartości jest niedozwolone gdy element jest zerowalny.</translation>
+ </message>
+ <message>
+ <location line="+32"/>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation>Podany typ %1 nie jest poprawnie zastępowalny typem elementu %2.</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation>Typ złożony %1 nie może być abstrakcyjny.</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation>Element %1 zawiera niedozwolone atrybuty.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+97"/>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation>Element %1 zawiera niedozwolony podelement.</translation>
+ </message>
+ <message>
+ <location line="-76"/>
+ <location line="+93"/>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation>Zawartość elementu %1 nie pasuje do jego definicji typu: %2.</translation>
+ </message>
+ <message>
+ <location line="-85"/>
+ <location line="+92"/>
+ <location line="+41"/>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation>Zawartość elementu %1 nie pasuje do zdefiniowanego ograniczenia wartości.</translation>
+ </message>
+ <message>
+ <location line="-73"/>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation>Element %1 zawiera niedozwolony podelement.</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation>Element %1 zawiera niedozwolony text.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Element %1 can not contain other elements, as it has a fixed content.</source>
+ <translation>Element %1 nie może zawierać innych elementów ponieważ posiada on stałą zawartość.</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation>Brak wymaganego atrybutu %2 w elemencie %1.</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation>Atrybut %1 nie pasuje do znacznika atrybutu.</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation>Brak deklaracji atrybutu %1.</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation>Element %1 posiada dwa atrybuty typu %2.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation>Atrybut %1 posiada niepoprawną zawartość.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation>Element %1 posiada nieznany atrybut %2.</translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <location line="+46"/>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation>Zawartość atrybutu %1 nie pasuje do jego definicji typu: %2.</translation>
+ </message>
+ <message>
+ <location line="-38"/>
+ <location line="+46"/>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation>Zawartość elementu %1 nie pasuje do zdefiniowanego ograniczenia wartości.</translation>
+ </message>
+ <message>
+ <location line="+88"/>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation>Znaleziono nieunikatową wartość dla ograniczenia %1.</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation>Ograniczenie klucza %1 zawiera nieobecne pola.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <source>No referenced value found for key reference %1.</source>
+ <translation>Brak wartości do której odwołuje sie klucz %1.</translation>
+ </message>
+ <message>
+ <location line="+64"/>
+ <source>More than one value found for field %1.</source>
+ <translation>Znaleziono więcej niż jedną wartość dla pola %1.</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Field %1 has no simple type.</source>
+ <translation>Pole %1 nie posiada prostego typu.</translation>
+ </message>
+ <message>
+ <location line="+73"/>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation>Wartość ID &quot;%1&quot; nie jest unikatowa.</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation>Atrybut &quot;%1&quot; zawiera niepoprawną zawartość QName: %2.</translation>
</message>
</context>
</TS>
diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts
index 6c90391..9c4a263 100644
--- a/translations/qt_ru.ts
+++ b/translations/qt_ru.ts
@@ -2,29 +2,24 @@
<!DOCTYPE TS>
<TS version="2.0" language="ru_RU">
<context>
- <name>AudioOutput</name>
+ <name>CloseButton</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
- <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
- <translation>&lt;html&gt;Звуковое устройство &lt;b&gt;%1&lt;/b&gt; не работает.&lt;br/&gt;Будет использоваться &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</translation>
+ <location filename="../src/gui/widgets/qtabbar.cpp" line="+2245"/>
+ <source>Close Tab</source>
+ <translation>Закрыть вкладку</translation>
</message>
+</context>
+<context>
+ <name>FakeReply</name>
<message>
- <location line="+13"/>
- <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
- <translation>&lt;html&gt;Переключение на звуковое устройство &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;, которое доступно и имеет высший приоритет.&lt;/html&gt;</translation>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp" line="+2191"/>
+ <source>Fake error !</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
- <source>Revert back to device &apos;%1&apos;</source>
- <translation>Возвращение к устройству &apos;%1&apos;</translation>
- </message>
-</context>
-<context>
- <name>CloseButton</name>
- <message>
- <location filename="../src/gui/widgets/qtabbar.cpp" line="+2253"/>
- <source>Close Tab</source>
- <translation>Закрыть вкладку</translation>
+ <source>Invalid URL</source>
+ <translation>Некорректный URL</translation>
</message>
</context>
<context>
@@ -61,6 +56,24 @@
</message>
</context>
<context>
+ <name>Phonon::AudioOutput</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+377"/>
+ <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Звуковое устройство &lt;b&gt;%1&lt;/b&gt; не работает.&lt;br/&gt;Будет использоваться &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Переключение на звуковое устройство &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;, которое доступно и имеет высший приоритет.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Revert back to device &apos;%1&apos;</source>
+ <translation>Возвращение к устройству &apos;%1&apos;</translation>
+ </message>
+</context>
+<context>
<name>Phonon::Gstreamer::Backend</name>
<message>
<location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
@@ -74,7 +87,7 @@
<source>Warning: You do not seem to have the base GStreamer plugins installed.
All audio and video support has been disabled</source>
<translation>Внимание: Похоже, основной модуль GStreamer не установлен.
- Поддержка видео и аудио невозможна</translation>
+ Поддержка видео и аудио отключена</translation>
</message>
</context>
<context>
@@ -96,24 +109,24 @@ have libgstreamer-plugins-base installed.</source>
<translation>Отсутствует необходимый кодек. Вам нужно установить следующие кодеки для воспроизведения данного содержимого: %0</translation>
</message>
<message>
- <location line="+676"/>
+ <location line="+681"/>
<location line="+8"/>
<location line="+15"/>
- <location line="+9"/>
+ <location line="+22"/>
<location line="+6"/>
<location line="+19"/>
- <location line="+335"/>
+ <location line="+339"/>
<location line="+24"/>
<source>Could not open media source.</source>
<translation>Не удалось открыть источник медиа-данных.</translation>
</message>
<message>
- <location line="-403"/>
+ <location line="-420"/>
<source>Invalid source type.</source>
<translation>Неверный тип источника медиа-данных.</translation>
</message>
<message>
- <location line="+377"/>
+ <location line="+394"/>
<source>Could not locate media source.</source>
<translation>Не удалось найти источник медиа-данных.</translation>
</message>
@@ -129,19 +142,86 @@ have libgstreamer-plugins-base installed.</source>
</message>
</context>
<context>
+ <name>Phonon::MMF</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/audiooutput.cpp" line="+108"/>
+ <source>Audio Output</source>
+ <translation>Воспроизведение звука</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>The audio output device</source>
+ <translation>Устройство воспроизведения звука</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::AudioEqualizer</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/audioequalizer.cpp" line="+75"/>
+ <source>Frequency band, %1 Hz</source>
+ <translation>Полоса частот, %1 Гц</translation>
+ </message>
+</context>
+<context>
+ <name>Phonon::MMF::EffectFactory</name>
+ <message>
+ <location filename="../src/3rdparty/phonon/mmf/effectfactory.cpp" line="+65"/>
+ <source>audio equalizer</source>
+ <translation>Аудиоэквалайзер</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Bass boost</source>
+ <translation>Усиление басов</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Distance Attenuation</source>
+ <translation>Ослабление при отдалении</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <location line="+2"/>
+ <source>Environmental Reverb</source>
+ <translation>Реверберация</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Loudness</source>
+ <translation>Громкость</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Source Orientation</source>
+ <translation>Ориентация источника</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Stereo Widening</source>
+ <translation>Расширение стереобазы</translation>
+ </message>
+</context>
+<context>
<name>Phonon::VolumeSlider</name>
<message>
<location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
<location line="+18"/>
+ <location line="+129"/>
+ <location line="+15"/>
<source>Volume: %1%</source>
<translation>Громкость: %1%</translation>
</message>
<message>
- <location line="-15"/>
+ <location line="-159"/>
<location line="+18"/>
<location line="+54"/>
<source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
- <translation>Используйте ползунок для настройки громкости. Крайняя левая позиция соответствует 0%, самая правая - %1%</translation>
+ <translation>Используйте данный ползунок для настройки громкости. Крайнее левое положение соответствует 0%, крайнее правое - %1%</translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>Muted</source>
+ <translation>Без звука</translation>
</message>
</context>
<context>
@@ -149,7 +229,7 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
<source>%1, %2 not defined</source>
- <translation type="unfinished">%1, %2 не определен</translation>
+ <translation type="unfinished">%1, %2 не определён</translation>
</message>
<message>
<location line="+36"/>
@@ -188,7 +268,7 @@ have libgstreamer-plugins-base installed.</source>
<context>
<name>Q3FileDialog</name>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+865"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+829"/>
<source>Copy or Move a File</source>
<translation>Копировать или переместить файл</translation>
</message>
@@ -212,13 +292,13 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location line="-157"/>
<location line="+49"/>
- <location line="+2153"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
+ <location line="+2149"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+112"/>
<source>All Files (*)</source>
<translation>Все файлы (*)</translation>
</message>
<message>
- <location line="-2089"/>
+ <location line="-2085"/>
<source>Name</source>
<translation>Имя</translation>
</message>
@@ -244,24 +324,24 @@ have libgstreamer-plugins-base installed.</source>
</message>
<message>
<location line="+35"/>
- <location line="+2031"/>
+ <location line="+2027"/>
<source>&amp;OK</source>
- <translation>&amp;Готово</translation>
+ <translation>&amp;ОК</translation>
</message>
<message>
- <location line="-1991"/>
+ <location line="-1987"/>
<source>Look &amp;in:</source>
<translation>&amp;Папка:</translation>
</message>
<message>
<location line="+1"/>
- <location line="+1981"/>
+ <location line="+1977"/>
<location line="+16"/>
<source>File &amp;name:</source>
<translation>&amp;Имя файла:</translation>
</message>
<message>
- <location line="-1996"/>
+ <location line="-1992"/>
<source>File &amp;type:</source>
<translation>&amp;Тип файла:</translation>
</message>
@@ -273,12 +353,12 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location line="+7"/>
<source>One directory up</source>
- <translation>На один уровень вверх</translation>
+ <translation>Вверх на один уровень</translation>
</message>
<message>
<location line="+9"/>
<source>Create New Folder</source>
- <translation>Создать каталог</translation>
+ <translation>Создать папку</translation>
</message>
<message>
<location line="+18"/>
@@ -296,7 +376,7 @@ have libgstreamer-plugins-base installed.</source>
<translation>Предпросмотр информации о файле</translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+19"/>
<source>Preview File Contents</source>
<translation>Предпросмотр содержимого файла</translation>
</message>
@@ -352,14 +432,14 @@ have libgstreamer-plugins-base installed.</source>
</message>
<message>
<location line="+704"/>
- <location line="+2100"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
+ <location line="+1999"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+209"/>
<source>Open</source>
<translation>Открыть</translation>
</message>
<message>
- <location line="-1990"/>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
+ <location line="-1889"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+71"/>
<source>Save As</source>
<translation>Сохранить как</translation>
</message>
@@ -419,7 +499,7 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location line="+4"/>
<source>Show &amp;hidden files</source>
- <translation>Показать скр&amp;ытые файлы</translation>
+ <translation>Показать ск&amp;рытые файлы</translation>
</message>
<message>
<location line="+31"/>
@@ -459,17 +539,17 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location line="+36"/>
<source>New Folder 1</source>
- <translation>Новый каталог 1</translation>
+ <translation>Новая папка 1</translation>
</message>
<message>
<location line="+5"/>
<source>New Folder</source>
- <translation>Новый каталог</translation>
+ <translation>Новая папка</translation>
</message>
<message>
<location line="+5"/>
<source>New Folder %1</source>
- <translation>Новый каталог %1</translation>
+ <translation>Новая папка %1</translation>
</message>
<message>
<location line="+98"/>
@@ -485,16 +565,16 @@ have libgstreamer-plugins-base installed.</source>
<message>
<location line="-2"/>
<source>Directory:</source>
- <translation>каталог:</translation>
+ <translation>Каталог:</translation>
</message>
<message>
<location line="+40"/>
- <location line="+1110"/>
+ <location line="+1009"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
- <location line="-1109"/>
+ <location line="-1008"/>
<source>%1
File not found.
Check path and filename.</source>
@@ -503,17 +583,17 @@ Check path and filename.</source>
Проверьте правильность пути и имени файла.</translation>
</message>
<message>
- <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
+ <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-191"/>
<source>All Files (*.*)</source>
<translation>Все файлы (*.*)</translation>
</message>
<message>
- <location line="+375"/>
+ <location line="+264"/>
<source>Open </source>
<translation>Открыть </translation>
</message>
<message>
- <location line="+155"/>
+ <location line="+107"/>
<source>Select a Directory</source>
<translation>Выбрать каталог</translation>
</message>
@@ -586,7 +666,7 @@ to
<message>
<location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
<source>Operation stopped by the user</source>
- <translation>Операция прервана пользователем</translation>
+ <translation>Операция остановлена пользователем</translation>
</message>
</context>
<context>
@@ -604,7 +684,7 @@ to
<location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+190"/>
<location line="+824"/>
<source>OK</source>
- <translation>Готово</translation>
+ <translation>ОК</translation>
</message>
<message>
<location line="-366"/>
@@ -663,7 +743,7 @@ to
<location line="+4"/>
<location line="+2"/>
<source>Select All</source>
- <translation>Выделить все</translation>
+ <translation>Выделить всё</translation>
</message>
</context>
<context>
@@ -681,7 +761,7 @@ to
<message>
<location line="+1"/>
<source>Minimize</source>
- <translation>Минимизировать</translation>
+ <translation>Свернуть</translation>
</message>
<message>
<location line="+3"/>
@@ -705,8 +785,8 @@ to
</message>
<message>
<location line="+3"/>
- <source>Puts a minimized back to normal</source>
- <translation>Возвращает минимизированное окно в нормальное состояние</translation>
+ <source>Puts a minimized window back to normal</source>
+ <translation>Возвращает свёрнутое окно в нормальное состояние</translation>
</message>
<message>
<location line="+1"/>
@@ -749,43 +829,43 @@ to
<location line="+260"/>
<location line="+4"/>
<source>The protocol `%1&apos; is not supported</source>
- <translation>Протокол `%1&apos; не поддерживается</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживается</translation>
</message>
<message>
<location line="-260"/>
<source>The protocol `%1&apos; does not support listing directories</source>
- <translation>Протокол `%1&apos; не поддерживает просмотр каталогов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает просмотр каталогов</translation>
</message>
<message>
<location line="+3"/>
<source>The protocol `%1&apos; does not support creating new directories</source>
- <translation>Протокол `%1&apos; не поддерживает создание каталогов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает создание каталогов</translation>
</message>
<message>
<location line="+3"/>
<source>The protocol `%1&apos; does not support removing files or directories</source>
- <translation>Протокол `%1&apos; не поддерживает удаление файлов или каталогов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает удаление файлов или каталогов</translation>
</message>
<message>
<location line="+3"/>
<source>The protocol `%1&apos; does not support renaming files or directories</source>
- <translation>Протокол `%1&apos; не поддерживает переименование файлов или каталогов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает переименование файлов или каталогов</translation>
</message>
<message>
<location line="+3"/>
<source>The protocol `%1&apos; does not support getting files</source>
- <translation>Протокол `%1&apos; не поддерживает доставку файлов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает доставку файлов</translation>
</message>
<message>
<location line="+3"/>
<source>The protocol `%1&apos; does not support putting files</source>
- <translation>Протокол `%1&apos; не поддерживает отправку файлов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает отправку файлов</translation>
</message>
<message>
<location line="+243"/>
<location line="+4"/>
<source>The protocol `%1&apos; does not support copying or moving files or directories</source>
- <translation>Протокол `%1&apos; не поддерживает копирование или перемещение файлов или каталогов</translation>
+ <translation>Протокол &apos;%1&apos; не поддерживает копирование или перемещение файлов или каталогов</translation>
</message>
<message>
<location line="+237"/>
@@ -799,7 +879,7 @@ to
<message>
<location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/>
<source>&amp;Cancel</source>
- <translation>&amp;Отмена</translation>
+ <translation>От&amp;мена</translation>
</message>
<message>
<location line="+1"/>
@@ -809,12 +889,12 @@ to
<message>
<location line="+1"/>
<source>&amp;Next &gt;</source>
- <translation>&amp;Вперед &gt;</translation>
+ <translation>&amp;Далее &gt;</translation>
</message>
<message>
<location line="+1"/>
<source>&amp;Finish</source>
- <translation>&amp;Закончить</translation>
+ <translation>&amp;Завершить</translation>
</message>
<message>
<location line="+1"/>
@@ -825,9 +905,9 @@ to
<context>
<name>QAbstractSocket</name>
<message>
- <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/>
- <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/>
- <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/>
+ <location filename="../src/network/socket/qabstractsocket.cpp" line="+890"/>
+ <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+633"/>
+ <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+661"/>
<location line="+26"/>
<source>Host not found</source>
<translation>Узел не найден</translation>
@@ -840,19 +920,19 @@ to
<translation>Отказано в соединении</translation>
</message>
<message>
- <location line="+141"/>
+ <location line="+142"/>
<source>Connection timed out</source>
<translation>Время на соединение истекло</translation>
</message>
<message>
- <location line="-547"/>
- <location line="+787"/>
+ <location line="-548"/>
+ <location line="+789"/>
<location line="+208"/>
<source>Operation on socket is not supported</source>
<translation>Операция с сокетом не поддерживается</translation>
</message>
<message>
- <location line="+137"/>
+ <location line="+187"/>
<source>Socket operation timed out</source>
<translation>Время на операцию с сокетом истекло</translation>
</message>
@@ -870,7 +950,7 @@ to
<context>
<name>QAbstractSpinBox</name>
<message>
- <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1200"/>
+ <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1217"/>
<source>&amp;Step up</source>
<translation>Шаг вв&amp;ерх</translation>
</message>
@@ -882,7 +962,7 @@ to
<message>
<location line="-8"/>
<source>&amp;Select All</source>
- <translation>&amp;Выделить все</translation>
+ <translation>&amp;Выделить всё</translation>
</message>
</context>
<context>
@@ -893,7 +973,7 @@ to
<translation>Активировать</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
+ <location filename="../src/gui/dialogs/qmessagebox.h" line="+354"/>
<source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
<translation>Программный модуль &apos;%1&apos; требует Qt %2, найдена версия %3.</translation>
</message>
@@ -903,7 +983,7 @@ to
<translation>Ошибка совместимости библиотеки Qt</translation>
</message>
<message>
- <location filename="../src/gui/kernel/qapplication.cpp" line="+2244"/>
+ <location filename="../src/gui/kernel/qapplication.cpp" line="+2293"/>
<source>QT_LAYOUT_DIRECTION</source>
<comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
<translation>LTR</translation>
@@ -919,22 +999,22 @@ to
<message>
<location filename="../src/activeqt/container/qaxselect.ui"/>
<source>Select ActiveX Control</source>
- <translation>Выберите компоненту ActiveX</translation>
+ <translation>Выбор компоненты ActiveX</translation>
</message>
<message>
<location/>
<source>OK</source>
- <translation>Готово</translation>
+ <translation>Выбрать</translation>
</message>
<message>
<location/>
<source>&amp;Cancel</source>
- <translation>&amp;Отмена</translation>
+ <translation>От&amp;мена</translation>
</message>
<message>
<location/>
<source>COM &amp;Object:</source>
- <translation>COM &amp;Объект:</translation>
+ <translation>&amp;Объект COM:</translation>
</message>
</context>
<context>
@@ -958,7 +1038,7 @@ to
<context>
<name>QColorDialog</name>
<message>
- <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/>
+ <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1349"/>
<source>Hu&amp;e:</source>
<translation>&amp;Тон:</translation>
</message>
@@ -995,22 +1075,22 @@ to
<message>
<location line="+101"/>
<source>Select Color</source>
- <translation>Выберите цвет</translation>
+ <translation>Выбор цвета</translation>
</message>
<message>
- <location line="+137"/>
+ <location line="+180"/>
<source>&amp;Basic colors</source>
<translation>&amp;Основные цвета</translation>
</message>
<message>
<location line="+1"/>
<source>&amp;Custom colors</source>
- <translation>&amp;Произвольные цвета</translation>
+ <translation>&amp;Пользовательские цвета</translation>
</message>
<message>
<location line="+1"/>
<source>&amp;Add to Custom Colors</source>
- <translation>&amp;Добавить к произвольным цветам</translation>
+ <translation>&amp;Добавить к пользовательским цветам</translation>
</message>
</context>
<context>
@@ -1057,60 +1137,84 @@ to
<comment>QSystemSemaphore</comment>
<translation>%1: ошибка ftok</translation>
</message>
+ <message>
+ <location filename="../src/corelib/kernel/qsystemsemaphore_symbian.cpp" line="+65"/>
+ <source>%1: already exists</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: уже существует</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1: does not exist</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>%1: out of resources</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: недостаточно ресурсов</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1: unknown error %2</source>
+ <comment>QSystemSemaphore</comment>
+ <translation>%1: неизвестная ошибка %2</translation>
+ </message>
</context>
<context>
<name>QDB2Driver</name>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
+ <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1254"/>
<source>Unable to connect</source>
<translation>Невозможно соединиться</translation>
</message>
<message>
- <location line="+303"/>
+ <location line="+298"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
<message>
<location line="+15"/>
<source>Unable to set autocommit</source>
- <translation>Невозможно установить автовыполнение транзакции</translation>
+ <translation>Невозможно установить автозавершение транзакций</translation>
</message>
</context>
<context>
<name>QDB2Result</name>
<message>
- <location line="-1043"/>
- <location line="+243"/>
+ <location line="-1031"/>
+ <location line="+240"/>
<source>Unable to execute statement</source>
<translation>Невозможно выполнить выражение</translation>
</message>
<message>
- <location line="-206"/>
+ <location line="-203"/>
<source>Unable to prepare statement</source>
<translation>Невозможно подготовить выражение</translation>
</message>
<message>
- <location line="+196"/>
+ <location line="+193"/>
<source>Unable to bind variable</source>
<translation>Невозможно привязать значение</translation>
</message>
<message>
- <location line="+92"/>
+ <location line="+89"/>
<source>Unable to fetch record %1</source>
<translation>Невозможно получить запись %1</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+19"/>
<source>Unable to fetch next</source>
<translation>Невозможно получить следующую строку</translation>
</message>
<message>
- <location line="+20"/>
+ <location line="+21"/>
<source>Unable to fetch first</source>
<translation>Невозможно получить первую строку</translation>
</message>
@@ -1118,24 +1222,24 @@ to
<context>
<name>QDateTimeEdit</name>
<message>
- <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
+ <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2287"/>
<source>AM</source>
- <translation type="unfinished"></translation>
+ <translation>AM</translation>
</message>
<message>
<location line="+0"/>
<source>am</source>
- <translation type="unfinished"></translation>
+ <translation>am</translation>
</message>
<message>
<location line="+2"/>
<source>PM</source>
- <translation type="unfinished"></translation>
+ <translation>PM</translation>
</message>
<message>
<location line="+0"/>
<source>pm</source>
- <translation type="unfinished"></translation>
+ <translation>pm</translation>
</message>
</context>
<context>
@@ -1143,28 +1247,28 @@ to
<message>
<location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
<source>QDial</source>
- <translation type="unfinished"></translation>
+ <translation>QDial</translation>
</message>
<message>
<location line="+2"/>
<source>SpeedoMeter</source>
- <translation type="unfinished"></translation>
+ <translation>SpeedoMeter</translation>
</message>
<message>
<location line="+2"/>
<source>SliderHandle</source>
- <translation type="unfinished"></translation>
+ <translation>SliderHandle</translation>
</message>
</context>
<context>
<name>QDialog</name>
<message>
- <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
+ <location filename="../src/gui/dialogs/qdialog.cpp" line="+636"/>
<source>What&apos;s This?</source>
<translation>Что это?</translation>
</message>
<message>
- <location line="-115"/>
+ <location line="-135"/>
<source>Done</source>
<translation>Готово</translation>
</message>
@@ -1172,16 +1276,16 @@ to
<context>
<name>QDialogButtonBox</name>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1861"/>
+ <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1872"/>
<location line="+464"/>
- <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/>
+ <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+607"/>
<source>OK</source>
- <translation>Готово</translation>
+ <translation>ОК</translation>
</message>
<message>
<location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+0"/>
<source>&amp;OK</source>
- <translation>&amp;Готово</translation>
+ <translation>&amp;ОК</translation>
</message>
<message>
<location line="+3"/>
@@ -1201,7 +1305,7 @@ to
<message>
<location line="+3"/>
<source>&amp;Cancel</source>
- <translation>&amp;Отмена</translation>
+ <translation>От&amp;мена</translation>
</message>
<message>
<location line="+0"/>
@@ -1241,12 +1345,12 @@ to
<message>
<location line="+4"/>
<source>Discard</source>
- <translation>Не применять</translation>
+ <translation>Отклонить</translation>
</message>
<message>
<location line="+3"/>
<source>&amp;Yes</source>
- <translation>Д&amp;а</translation>
+ <translation>&amp;Да</translation>
</message>
<message>
<location line="+3"/>
@@ -1276,17 +1380,17 @@ to
<message>
<location line="+3"/>
<source>Retry</source>
- <translation>Попробовать ещё</translation>
+ <translation>Повторить</translation>
</message>
<message>
<location line="+3"/>
<source>Ignore</source>
- <translation>Игнорировать</translation>
+ <translation>Пропустить</translation>
</message>
<message>
<location line="+3"/>
<source>Restore Defaults</source>
- <translation>Восстановить значения по умолчанию</translation>
+ <translation type="unfinished">Восстановить значения</translation>
</message>
<message>
<location line="-29"/>
@@ -1297,7 +1401,7 @@ to
<context>
<name>QDirModel</name>
<message>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+454"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+457"/>
<source>Name</source>
<translation>Имя</translation>
</message>
@@ -1334,12 +1438,12 @@ to
<message>
<location line="+2"/>
<source>Dock</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Прикрепить</translation>
</message>
<message>
<location line="+1"/>
<source>Float</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Открепить</translation>
</message>
</context>
<context>
@@ -1358,7 +1462,7 @@ to
<context>
<name>QErrorMessage</name>
<message>
- <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+192"/>
+ <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+208"/>
<source>Debug Message:</source>
<translation>Отладочное сообщение:</translation>
</message>
@@ -1373,28 +1477,28 @@ to
<translation>Критическая ошибка:</translation>
</message>
<message>
- <location line="+193"/>
+ <location line="+199"/>
<source>&amp;Show this message again</source>
<translation>&amp;Показывать это сообщение в дальнейшем</translation>
</message>
<message>
<location line="+1"/>
<source>&amp;OK</source>
- <translation>&amp;Готово</translation>
+ <translation>&amp;Закрыть</translation>
</message>
</context>
<context>
<name>QFile</name>
<message>
- <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
- <location line="+151"/>
+ <location filename="../src/corelib/io/qfile.cpp" line="+697"/>
+ <location line="+155"/>
<source>Destination file exists</source>
<translation>Файл существует</translation>
</message>
<message>
- <location line="-136"/>
+ <location line="-140"/>
<source>Will not rename sequential file using block copy</source>
- <translation>Не будет переименовывать последовательный файл, используя копирование блока</translation>
+ <translation>Последовательный файл не будет переименован с использованием поблочного копирования</translation>
</message>
<message>
<location line="+23"/>
@@ -1402,7 +1506,7 @@ to
<translation>Невозможно удалить исходный файл</translation>
</message>
<message>
- <location line="+126"/>
+ <location line="+130"/>
<source>Cannot open %1 for input</source>
<translation>Невозможно открыть %1 для ввода</translation>
</message>
@@ -1425,37 +1529,36 @@ to
<context>
<name>QFileDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+514"/>
- <location line="+447"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+558"/>
+ <location line="+450"/>
<source>All Files (*)</source>
<translation>Все файлы (*)</translation>
</message>
<message>
- <location line="+222"/>
+ <location line="+227"/>
<source>Directories</source>
<translation>Каталоги</translation>
</message>
<message>
<location line="-3"/>
<location line="+50"/>
- <location line="+1467"/>
- <location line="+75"/>
+ <location line="+1528"/>
<source>&amp;Open</source>
<translation>&amp;Открыть</translation>
</message>
<message>
- <location line="-1592"/>
+ <location line="-1578"/>
<location line="+50"/>
<source>&amp;Save</source>
<translation>&amp;Сохранить</translation>
</message>
<message>
- <location line="-733"/>
+ <location line="-741"/>
<source>Open</source>
<translation>Открыть</translation>
</message>
<message>
- <location line="+1515"/>
+ <location line="+1508"/>
<source>%1 already exists.
Do you want to replace it?</source>
<translation>%1 уже существует.
@@ -1468,7 +1571,7 @@ File not found.
Please verify the correct file name was given.</source>
<translation>%1
Файл не найден.
-Проверьте правильность заданного имени файла.</translation>
+Проверьте правильность указанного имени файла.</translation>
</message>
<message>
<location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
@@ -1476,7 +1579,7 @@ Please verify the correct file name was given.</source>
<translation>Мой компьютер</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1504"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1497"/>
<source>&amp;Rename</source>
<translation>&amp;Переименовать</translation>
</message>
@@ -1488,53 +1591,53 @@ Please verify the correct file name was given.</source>
<message>
<location line="+1"/>
<source>Show &amp;hidden files</source>
- <translation>Показать скр&amp;ытые файлы</translation>
+ <translation>Показать ск&amp;рытые файлы</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Back</source>
<translation>Назад</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Parent Directory</source>
<translation>Родительский каталог</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>List View</source>
<translation>Список</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Detail View</source>
<translation>Подробный вид</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Files of type:</source>
<translation>Типы файлов:</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.cpp" line="+6"/>
- <location line="+651"/>
+ <location line="+659"/>
<source>Directory:</source>
<translation>Каталог:</translation>
</message>
<message>
- <location line="+791"/>
- <location line="+861"/>
+ <location line="+776"/>
+ <location line="+862"/>
<source>%1
Directory not found.
Please verify the correct directory name was given.</source>
<translation>%1
Каталог не найден.
-Проверьте правильность заданного имени каталога.</translation>
+Проверьте правильность указанного имени каталога.</translation>
</message>
<message>
<location line="-218"/>
@@ -1546,7 +1649,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+5"/>
<source>Are sure you want to delete &apos;%1&apos;?</source>
- <translation>Вы уверены, что хотите удалить &apos;%1&apos;?</translation>
+ <translation>Вы действительно хотите удалить &apos;%1&apos;?</translation>
</message>
<message>
<location line="+15"/>
@@ -1554,22 +1657,22 @@ Do you want to delete it anyway?</source>
<translation>Не удалось удалить каталог.</translation>
</message>
<message>
- <location line="+407"/>
+ <location line="+410"/>
<source>Recent Places</source>
<translation>Недавние документы</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
+ <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+174"/>
<source>All Files (*.*)</source>
<translation>Все файлы (*.*)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2549"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2546"/>
<source>Save As</source>
<translation>Сохранить как</translation>
</message>
<message>
- <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+411"/>
+ <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+461"/>
<source>Drive</source>
<translation>Диск</translation>
</message>
@@ -1583,13 +1686,13 @@ Do you want to delete it anyway?</source>
<location line="+5"/>
<source>File Folder</source>
<comment>Match Windows Explorer</comment>
- <translation>Каталог с файлами</translation>
+ <translation>Папка с файлами</translation>
</message>
<message>
<location line="+2"/>
<source>Folder</source>
<comment>All other platforms</comment>
- <translation>Каталог</translation>
+ <translation>Папка</translation>
</message>
<message>
<location line="+9"/>
@@ -1606,7 +1709,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+7"/>
<source>Unknown</source>
- <translation>Неизвестно</translation>
+ <translation>Неизвестный</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.cpp" line="-4"/>
@@ -1620,48 +1723,48 @@ Do you want to delete it anyway?</source>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Forward</source>
- <translation>Вперед</translation>
+ <translation>Вперёд</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1969"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1963"/>
<source>New Folder</source>
- <translation>Новый каталог</translation>
+ <translation>Новая папка</translation>
</message>
<message>
- <location line="-1962"/>
+ <location line="-1956"/>
<source>&amp;New Folder</source>
- <translation>&amp;Новый каталог</translation>
+ <translation>&amp;Новая папка</translation>
</message>
<message>
- <location line="+659"/>
+ <location line="+667"/>
<location line="+38"/>
<source>&amp;Choose</source>
<translation>&amp;Выбрать</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qsidebar.cpp" line="+437"/>
+ <location filename="../src/gui/dialogs/qsidebar.cpp" line="+442"/>
<source>Remove</source>
<translation>Удалить</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-690"/>
- <location line="+655"/>
+ <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-698"/>
+ <location line="+663"/>
<source>File &amp;name:</source>
<translation>&amp;Имя файла:</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qfiledialog.ui"/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Look in:</source>
<translation>Перейти к:</translation>
</message>
<message>
<location/>
- <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+ <location filename="../src/gui/dialogs/qfiledialog_embedded.ui"/>
<source>Create New Folder</source>
- <translation>Создать каталог</translation>
+ <translation>Создать папку</translation>
</message>
</context>
<context>
@@ -1677,7 +1780,7 @@ Do you want to delete it anyway?</source>
<translation>&lt;b&gt;Имя &quot;%1&quot; не может быть использовано.&lt;/b&gt;&lt;p&gt;Попробуйте использовать имя меньшей длины и/или без символов пунктуации.</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+64"/>
<source>Name</source>
<translation>Имя</translation>
</message>
@@ -1704,7 +1807,7 @@ Do you want to delete it anyway?</source>
<translation>Дата изменения</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+248"/>
+ <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+258"/>
<source>My Computer</source>
<translation>Мой компьютер</translation>
</message>
@@ -1714,8 +1817,8 @@ Do you want to delete it anyway?</source>
<translation>Компьютер</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="-163"/>
- <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+471"/>
+ <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="-164"/>
+ <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+476"/>
<source>%1 TB</source>
<translation>%1 Тб</translation>
</message>
@@ -1747,56 +1850,56 @@ Do you want to delete it anyway?</source>
<context>
<name>QFontDatabase</name>
<message>
- <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
- <location line="+1176"/>
+ <location filename="../src/gui/text/qfontdatabase.cpp" line="+102"/>
+ <location line="+1334"/>
<source>Normal</source>
<translation>Обычный</translation>
</message>
<message>
- <location line="-1173"/>
+ <location line="-1331"/>
<location line="+12"/>
- <location line="+1149"/>
+ <location line="+1307"/>
<source>Bold</source>
<translation>Жирный</translation>
</message>
<message>
- <location line="-1158"/>
- <location line="+1160"/>
+ <location line="-1316"/>
+ <location line="+1318"/>
<source>Demi Bold</source>
- <translation>Срендней жирности</translation>
+ <translation>Полужирный</translation>
</message>
<message>
- <location line="-1157"/>
+ <location line="-1315"/>
<location line="+18"/>
- <location line="+1135"/>
+ <location line="+1293"/>
<source>Black</source>
<translation>Чёрный</translation>
</message>
<message>
- <location line="-1145"/>
+ <location line="-1303"/>
<source>Demi</source>
<translation>Средний</translation>
</message>
<message>
<location line="+6"/>
- <location line="+1145"/>
+ <location line="+1303"/>
<source>Light</source>
- <translation>Лёгкий</translation>
+ <translation>Светлый</translation>
</message>
<message>
- <location line="-1004"/>
- <location line="+1007"/>
+ <location line="-1157"/>
+ <location line="+1160"/>
<source>Italic</source>
<translation>Курсив</translation>
</message>
<message>
- <location line="-1004"/>
- <location line="+1006"/>
+ <location line="-1157"/>
+ <location line="+1159"/>
<source>Oblique</source>
<translation>Наклонный</translation>
</message>
<message>
- <location line="+705"/>
+ <location line="+703"/>
<source>Any</source>
<translation>Любая</translation>
</message>
@@ -1808,7 +1911,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Greek</source>
- <translation>Греческий</translation>
+ <translation>Греческая</translation>
</message>
<message>
<location line="+3"/>
@@ -1818,12 +1921,12 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Armenian</source>
- <translation type="unfinished"></translation>
+ <translation>Армянская</translation>
</message>
<message>
<location line="+3"/>
<source>Hebrew</source>
- <translation type="unfinished"></translation>
+ <translation>Иврит</translation>
</message>
<message>
<location line="+3"/>
@@ -1833,7 +1936,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Syriac</source>
- <translation type="unfinished"></translation>
+ <translation>Сирийская</translation>
</message>
<message>
<location line="+3"/>
@@ -1893,7 +1996,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Thai</source>
- <translation type="unfinished"></translation>
+ <translation>Тайская</translation>
</message>
<message>
<location line="+3"/>
@@ -1903,7 +2006,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Tibetan</source>
- <translation type="unfinished"></translation>
+ <translation>Тибетская</translation>
</message>
<message>
<location line="+3"/>
@@ -1913,42 +2016,42 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Georgian</source>
- <translation type="unfinished"></translation>
+ <translation>Грузинская</translation>
</message>
<message>
<location line="+3"/>
<source>Khmer</source>
- <translation type="unfinished"></translation>
+ <translation>Кхмерская</translation>
</message>
<message>
<location line="+3"/>
<source>Simplified Chinese</source>
- <translation type="unfinished"></translation>
+ <translation>Китайская упрощенная</translation>
</message>
<message>
<location line="+3"/>
<source>Traditional Chinese</source>
- <translation type="unfinished"></translation>
+ <translation>Китайская традиционная</translation>
</message>
<message>
<location line="+3"/>
<source>Japanese</source>
- <translation type="unfinished"></translation>
+ <translation>Японская</translation>
</message>
<message>
<location line="+3"/>
<source>Korean</source>
- <translation type="unfinished"></translation>
+ <translation>Корейская</translation>
</message>
<message>
<location line="+3"/>
<source>Vietnamese</source>
- <translation type="unfinished"></translation>
+ <translation>Вьетнамская</translation>
</message>
<message>
<location line="+3"/>
<source>Symbol</source>
- <translation type="unfinished"></translation>
+ <translation>Символьная</translation>
</message>
<message>
<location line="+3"/>
@@ -1958,20 +2061,20 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>Runic</source>
- <translation type="unfinished"></translation>
+ <translation>Руническая</translation>
</message>
</context>
<context>
<name>QFontDialog</name>
<message>
- <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/>
+ <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+776"/>
<source>&amp;Font</source>
<translation>&amp;Шрифт</translation>
</message>
<message>
<location line="+1"/>
<source>Font st&amp;yle</source>
- <translation>Ст&amp;иль шрифта</translation>
+ <translation>&amp;Начертание</translation>
</message>
<message>
<location line="+1"/>
@@ -1979,12 +2082,12 @@ Do you want to delete it anyway?</source>
<translation>&amp;Размер</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+4"/>
<source>Effects</source>
<translation>Эффекты</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>Stri&amp;keout</source>
<translation>Зачёр&amp;кнутый</translation>
</message>
@@ -2004,22 +2107,22 @@ Do you want to delete it anyway?</source>
<translation>&amp;Система письма</translation>
</message>
<message>
- <location line="-604"/>
- <location line="+247"/>
+ <location line="-609"/>
+ <location line="+257"/>
<source>Select Font</source>
- <translation>Выберите шрифт</translation>
+ <translation>Выбор шрифта</translation>
</message>
</context>
<context>
<name>QFtp</name>
<message>
- <location filename="../src/network/access/qftp.cpp" line="+826"/>
+ <location filename="../src/network/access/qftp.cpp" line="+828"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+683"/>
<source>Not connected</source>
<translation>Соединение не установлено</translation>
</message>
<message>
- <location line="+65"/>
+ <location line="+68"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+65"/>
<source>Host %1 not found</source>
<translation>Узел %1 не найден</translation>
@@ -2057,7 +2160,7 @@ Do you want to delete it anyway?</source>
<translation>Неизвестная ошибка</translation>
</message>
<message>
- <location line="+889"/>
+ <location line="+891"/>
<location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/>
<source>Connecting to host failed:
%1</source>
@@ -2153,7 +2256,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+2"/>
<source>Connected to host</source>
- <translation>Соединение с узлом</translation>
+ <translation>Соединение с узлом установлено</translation>
</message>
</context>
<context>
@@ -2167,19 +2270,15 @@ Do you want to delete it anyway?</source>
<context>
<name>QHostInfoAgent</name>
<message>
- <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
- <location line="+9"/>
- <location line="+64"/>
- <location line="+31"/>
- <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+165"/>
- <location line="+9"/>
- <location line="+40"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+257"/>
+ <location line="+32"/>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+220"/>
<location line="+27"/>
<source>Host not found</source>
<translation>Узел не найден</translation>
</message>
<message>
- <location line="-44"/>
+ <location line="-45"/>
<location line="+39"/>
<location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
<location line="+29"/>
@@ -2187,19 +2286,29 @@ Do you want to delete it anyway?</source>
<translation>Неизвестный тип адреса</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+10"/>
<location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
<location line="+27"/>
<source>Unknown error</source>
<translation>Неизвестная ошибка</translation>
</message>
+ <message>
+ <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-67"/>
+ <source>No host name given</source>
+ <translation>Имя узла не задано</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Invalid hostname</source>
+ <translation>Некорректное имя узла</translation>
+ </message>
</context>
<context>
<name>QHttp</name>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="+1574"/>
+ <location filename="../src/network/access/qhttp.cpp" line="+1577"/>
<location line="+820"/>
- <location filename="../src/qt3support/network/q3http.cpp" line="+1160"/>
+ <location filename="../src/qt3support/network/q3http.cpp" line="+1159"/>
<location line="+567"/>
<source>Unknown error</source>
<translation>Неизвестная ошибка</translation>
@@ -2239,7 +2348,7 @@ Do you want to delete it anyway?</source>
<translation>Ошибка записи ответа на устройство</translation>
</message>
<message>
- <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+977"/>
+ <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+569"/>
<location filename="../src/qt3support/network/q3http.cpp" line="+38"/>
<source>Connection refused</source>
<translation>Отказано в соединении</translation>
@@ -2342,10 +2451,10 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<source>SSL handshake failed</source>
- <translation type="unfinished"></translation>
+ <translation>Квитирование SSL не удалось</translation>
</message>
<message>
- <location filename="../src/network/access/qhttp.cpp" line="-2263"/>
+ <location filename="../src/network/access/qhttp.cpp" line="-2266"/>
<source>HTTPS connection requested but SSL support not compiled in</source>
<translation>Запрошено соединение по протоколу HTTPS, но поддержка SSL не скомпилирована</translation>
</message>
@@ -2401,9 +2510,9 @@ Do you want to delete it anyway?</source>
<context>
<name>QIBaseDriver</name>
<message>
- <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1454"/>
+ <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1491"/>
<source>Error opening database</source>
- <translation>Невозможно открыть базу данных</translation>
+ <translation>Ошибка открытия базы данных</translation>
</message>
<message>
<location line="+54"/>
@@ -2413,18 +2522,18 @@ Do you want to delete it anyway?</source>
<message>
<location line="+13"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+13"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
</context>
<context>
<name>QIBaseResult</name>
<message>
- <location line="-1112"/>
+ <location line="-1149"/>
<source>Unable to create BLOB</source>
<translation>Невозможно создать BLOB</translation>
</message>
@@ -2467,7 +2576,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+19"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+42"/>
@@ -2506,7 +2615,7 @@ Do you want to delete it anyway?</source>
<translation>Не удалось получить следующий элемент</translation>
</message>
<message>
- <location line="+160"/>
+ <location line="+197"/>
<source>Could not get statement info</source>
<translation>Не удалось найти информацию о выражении</translation>
</message>
@@ -2514,7 +2623,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QIODevice</name>
<message>
- <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/>
+ <location filename="../src/corelib/global/qglobal.cpp" line="+2057"/>
<source>Permission denied</source>
<translation>Доступ запрещён</translation>
</message>
@@ -2534,7 +2643,7 @@ Do you want to delete it anyway?</source>
<translation>Нет свободного места на устройстве</translation>
</message>
<message>
- <location filename="../src/corelib/io/qiodevice.cpp" line="+1541"/>
+ <location filename="../src/corelib/io/qiodevice.cpp" line="+1561"/>
<source>Unknown error</source>
<translation>Неизвестная ошибка</translation>
</message>
@@ -2542,24 +2651,34 @@ Do you want to delete it anyway?</source>
<context>
<name>QInputContext</name>
<message>
- <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/>
+ <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+256"/>
<source>XIM</source>
- <translation type="unfinished"></translation>
+ <translation>Метод ввода X-сервера</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>FEP</source>
+ <translation>Метод ввода S60 FEP</translation>
</message>
<message>
<location line="+23"/>
<source>XIM input method</source>
- <translation type="unfinished"></translation>
+ <translation>Метод ввода X-сервера</translation>
</message>
<message>
<location line="+4"/>
<source>Windows input method</source>
- <translation type="unfinished"></translation>
+ <translation>Метод ввода Windows</translation>
</message>
<message>
<location line="+4"/>
<source>Mac OS X input method</source>
- <translation type="unfinished"></translation>
+ <translation>Метод ввода Mac OS X</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>S60 FEP input method</source>
+ <translation>Метод ввода S60 FEP</translation>
</message>
</context>
<context>
@@ -2573,7 +2692,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QLibrary</name>
<message>
- <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
+ <location filename="../src/corelib/plugin/qlibrary.cpp" line="+383"/>
<source>Could not mmap &apos;%1&apos;: %2</source>
<translation>Не удалось выполнить mmap &apos;%1&apos;: %2</translation>
</message>
@@ -2588,50 +2707,50 @@ Do you want to delete it anyway?</source>
<translation>Не удалось выполнить unmap &apos;%1&apos;: %2</translation>
</message>
<message>
- <location line="+302"/>
+ <location line="+341"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
<translation>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. (%2.%3.%4) [%5]</translation>
</message>
<message>
<location line="+20"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
- <translation>Плагин &apos;%1&apos; использует несоместимую библиотеку Qt. Ожидается ключ &quot;%2&quot;, но получен ключ &quot;%3&quot;</translation>
+ <translation>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. Ожидается ключ &quot;%2&quot;, но получен ключ &quot;%3&quot;</translation>
</message>
<message>
- <location line="+340"/>
+ <location line="+365"/>
<source>Unknown error</source>
<translation>Неизвестная ошибка</translation>
</message>
<message>
- <location line="-377"/>
- <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
+ <location line="-402"/>
+ <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+343"/>
<source>The shared library was not found.</source>
<translation>Динамическая библиотека не найдена.</translation>
</message>
<message>
<location line="+2"/>
<source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
- <translation>Файл &apos;%1&apos; - не может быть корректным модулем Qt.</translation>
+ <translation>Файл &apos;%1&apos; - не является корректным модулем Qt.</translation>
</message>
<message>
<location line="+43"/>
<source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>Плагин &apos;%1&apos; использует несоместимую библиотеку Qt. (Нельзя совмещать релизные и отладочные библиотеки.)</translation>
+ <translation>Модуль &apos;%1&apos; использует несоместимую библиотеку Qt. (Невозможно совместить релизные и отладочные библиотеки.)</translation>
</message>
<message>
- <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
+ <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+236"/>
+ <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+87"/>
<source>Cannot load library %1: %2</source>
<translation>Невозможно загрузить библиотеку %1: %2</translation>
</message>
<message>
- <location line="+16"/>
- <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
+ <location line="+17"/>
+ <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+22"/>
<source>Cannot unload library %1: %2</source>
<translation>Невозможно выгрузить библиотеку %1: %2</translation>
</message>
<message>
- <location line="+31"/>
+ <location line="+34"/>
<location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
<source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
<translation>Невозможно разрешить символ &quot;%1&quot; в %2: %3</translation>
@@ -2640,7 +2759,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QLineEdit</name>
<message>
- <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
+ <location filename="../src/gui/widgets/qlineedit.cpp" line="+1980"/>
<source>&amp;Undo</source>
<translation>&amp;Отменить действие</translation>
</message>
@@ -2655,12 +2774,12 @@ Do you want to delete it anyway?</source>
<translation>&amp;Вырезать</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>&amp;Copy</source>
<translation>&amp;Копировать</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>&amp;Paste</source>
<translation>В&amp;ставить</translation>
</message>
@@ -2672,14 +2791,14 @@ Do you want to delete it anyway?</source>
<message>
<location line="+6"/>
<source>Select All</source>
- <translation>Выделить все</translation>
+ <translation>Выделить всё</translation>
</message>
</context>
<context>
<name>QLocalServer</name>
<message>
- <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
- <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+233"/>
+ <location filename="../src/network/socket/qlocalserver.cpp" line="+224"/>
+ <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+256"/>
<source>%1: Name error</source>
<translation>%1: Некорректное имя</translation>
</message>
@@ -2703,7 +2822,7 @@ Do you want to delete it anyway?</source>
<name>QLocalSocket</name>
<message>
<location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
- <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
+ <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+139"/>
<source>%1: Connection refused</source>
<translation>%1: Отказано в соединении</translation>
</message>
@@ -2711,13 +2830,13 @@ Do you want to delete it anyway?</source>
<location line="+3"/>
<location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
<source>%1: Remote closed</source>
- <translation>%1: Удалённое закрытие</translation>
+ <translation>%1: Закрыто удаленной стороной</translation>
</message>
<message>
<location line="+3"/>
<location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
<location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
- <location line="+43"/>
+ <location line="+45"/>
<source>%1: Invalid name</source>
<translation>%1: Некорректное имя</translation>
</message>
@@ -2748,7 +2867,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+3"/>
<location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
- <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
+ <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-50"/>
<source>%1: Connection error</source>
<translation>%1: Ошибка соединения</translation>
</message>
@@ -2773,35 +2892,35 @@ Do you want to delete it anyway?</source>
<context>
<name>QMYSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1251"/>
+ <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1261"/>
<source>Unable to open database &apos;</source>
<translation>Невозможно открыть базу данных &apos;</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+11"/>
<source>Unable to connect</source>
<translation>Невозможно соединиться</translation>
</message>
<message>
- <location line="+135"/>
+ <location line="+151"/>
<source>Unable to begin transaction</source>
<translation>Невозможно начать транзакцию</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
</context>
<context>
<name>QMYSQLResult</name>
<message>
- <location line="-942"/>
+ <location line="-969"/>
<source>Unable to fetch data</source>
<translation>Невозможно получить данные</translation>
</message>
@@ -2816,13 +2935,13 @@ Do you want to delete it anyway?</source>
<translation>Невозможно сохранить результат</translation>
</message>
<message>
- <location line="+194"/>
+ <location line="+191"/>
<location line="+8"/>
<source>Unable to prepare statement</source>
<translation>Невозможно подготовить выражение</translation>
</message>
<message>
- <location line="+36"/>
+ <location line="+37"/>
<source>Unable to reset statement</source>
<translation>Невозможно сбросить выражение</translation>
</message>
@@ -2845,10 +2964,10 @@ Do you want to delete it anyway?</source>
<message>
<location line="-12"/>
<source>Unable to store statement results</source>
- <translation>Невозможно сохранить результат выполнения выражения</translation>
+ <translation>Невозможно сохранить результаты выполнения выражения</translation>
</message>
<message>
- <location line="-256"/>
+ <location line="-253"/>
<source>Unable to execute next query</source>
<translation>Невозможно выполнить следующий запрос</translation>
</message>
@@ -2881,7 +3000,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="-18"/>
<source>Minimize</source>
- <translation>Минимизировать</translation>
+ <translation>Свернуть</translation>
</message>
<message>
<location line="+13"/>
@@ -2906,7 +3025,7 @@ Do you want to delete it anyway?</source>
<message>
<location line="+1"/>
<source>Mi&amp;nimize</source>
- <translation>&amp;Минимизировать</translation>
+ <translation>&amp;Свернуть</translation>
</message>
<message>
<location line="+2"/>
@@ -2982,9 +3101,17 @@ Do you want to delete it anyway?</source>
</message>
</context>
<context>
+ <name>QMenuBar</name>
+ <message>
+ <location filename="../src/gui/widgets/qmenu_symbian.cpp" line="+404"/>
+ <source>Actions</source>
+ <translation>Действия</translation>
+ </message>
+</context>
+<context>
<name>QMessageBox</name>
<message>
- <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1111"/>
+ <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1116"/>
<source>Help</source>
<translation>Справка</translation>
</message>
@@ -2994,24 +3121,15 @@ Do you want to delete it anyway?</source>
<location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
<location line="+8"/>
<source>OK</source>
- <translation>Готово</translation>
- </message>
- <message>
- <location line="+475"/>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation type="unfinished">&lt;h3&gt;О Qt&lt;/h3&gt;&lt;p&gt;Данная программа использует Qt версии %1.&lt;/p&gt;&lt;p&gt;Qt - это инструмент для разработки крссплатформенных приложений на C++.&lt;/p&gt;&lt;p&gt;Qt предоставляет переносимость между MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux и всеми популярными вариантами коммерческой Unix. Также Qt доступна для встраиваемых устройств в виде Qt для Embedded Linux и Qt для Windows CE.&lt;/p&gt;&lt;p&gt;Qt доступна под тремя различными лицензиями, разработанными для удовлетворения требований различных пользователей.&lt;/p&gt;Qt, лицензированая нашей коммерческой лицензией, предназначена для развития проприетарного/коммерческого программного обеспечения, когда Вы не желаете предоставлять исходные коды третьим сторонам; коммерческая лицензия не соответствует условиям лицензий GNU LGPL версии 2.1 или GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU LGPL версии 2.1 предназначена для разработки программного обеспечения с открытым исходным кодом или коммерческого программного обеспечения при соблюдении сроков и условий лицензии GNU LGPL версии 2.1.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU General Public License версии 3.0 предназначена для разработки программных приложений в тех случаях, когда Вы хотели бы использовать такие приложения в сочетании с программным обеспечением на условиях лицензии GNU GPL с версии 3.0 или если Вы готовы соблюдать условия лицензии GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Обратитесь к &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; для обзора лицензий Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Корпорация Nokia и/или её дочерние подразделения.&lt;/p&gt;&lt;p&gt;Qt - продукт Nokia. Обратитесь к &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; для получения дополнительной информации.&lt;/p&gt;</translation>
+ <translation>Закрыть</translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+513"/>
<source>About Qt</source>
<translation>О Qt</translation>
</message>
<message>
- <source>&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Данная программа использует Qt версии %1.&lt;/p&gt;</translation>
- </message>
- <message>
- <location line="-1600"/>
+ <location line="-1611"/>
<source>Show Details...</source>
<translation>Показать подробности...</translation>
</message>
@@ -3021,12 +3139,14 @@ Do you want to delete it anyway?</source>
<translation>Скрыть подробности...</translation>
</message>
<message>
- <source>&lt;h3&gt;About Qt&lt;/h3&gt;%1&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;h3&gt;О Qt&lt;/h3&gt;%1&lt;p&gt;Qt - это инструмент для разработчки крссплатформенных приложений на C++.&lt;/p&gt;&lt;p&gt;Qt предоставляет переносимость между MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux и всеми популярными вариантами коммерческой Unix. Также Qt доступна для встраиваемых устройств в виде Qt for Embedded Linux и Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt - продукт Nokia. Обратитесь к &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; для получения дополнительной информации.&lt;/p&gt;</translation>
+ <location line="+1574"/>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;</source>
+ <translation>&lt;h3&gt;О Qt&lt;/h3&gt;&lt;p&gt;Данная программа использует Qt версии %1.&lt;/p&gt;</translation>
</message>
<message>
- <source>&lt;p&gt;This program uses Qt Open Source Edition version %1.&lt;/p&gt;&lt;p&gt;Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/company/model/&quot;&gt;qt.nokia.com/company/model/&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;</source>
- <translation type="obsolete">&lt;p&gt;Данная программа использует Qt Open Source Edition версии %1.&lt;/p&gt;&lt;p&gt;Qt Open Source Edition предназначена для разработки Open Source приложений. Для разработки проприетарных (с закрытым исходным кодом) приложений необходима коммерческая лицензия Qt.&lt;/p&gt;&lt;p&gt;Обратитесь к официальносй странице &lt;a href=&quot;http://qt.nokia.com/company/model/&quot;&gt;qt.nokia.com/company/model/&lt;/a&gt; для ознакомления с моделями лицензирования Qt.&lt;/p&gt;</translation>
+ <location line="+5"/>
+ <source>&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;&lt;p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Qt - это инструментарий для разработки кроссплатформенных приложений на C++.&lt;/p&gt;&lt;p&gt;Qt предоставляет совместимость на уровне исходных текстов между MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux и всеми популярными коммерческими вариантами Unix. Также Qt доступна для встраиваемых устройств в виде Qt для Embedded Linux и Qt для Windows CE.&lt;/p&gt;&lt;p&gt;Qt доступна под тремя различными лицензиями, разработанными для удовлетворения различных требований.&lt;/p&gt;&lt;p&gt;Qt под нашей коммерческой лицензией предназначена для развития проприетарного/коммерческого программного обеспечения, когда Вы не желаете предоставлять исходные тексты третьим сторонам, или в случае невозможности принятия условий лицензий GNU LGPL версии 2.1 или GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU LGPL версии 2.1 предназначена для разработки программного обеспечения с открытыми исходными текстами или коммерческого программного обеспечения при соблюдении условий лицензии GNU LGPL версии 2.1.&lt;/p&gt;&lt;p&gt;Qt под лицензией GNU General Public License версии 3.0 предназначена для разработки программных приложений в тех случаях, когда Вы хотели бы использовать такие приложения в сочетании с программным обеспечением на условиях лицензии GNU GPL с версии 3.0 или если Вы готовы соблюдать условия лицензии GNU GPL версии 3.0.&lt;/p&gt;&lt;p&gt;Обратитесь к &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; для обзора лицензий Qt.&lt;/p&gt;&lt;p&gt;Copyright (C) 2009 Корпорация Nokia и/или её дочерние подразделения.&lt;/p&gt;&lt;p&gt;Qt - продукт компании Nokia. Обратитесь к &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; для получения дополнительной информации.&lt;/p&gt;</translation>
</message>
</context>
<context>
@@ -3034,7 +3154,7 @@ Do you want to delete it anyway?</source>
<message>
<location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
<source>Select IM</source>
- <translation type="unfinished"></translation>
+ <translation>Выбор режима ввода</translation>
</message>
</context>
<context>
@@ -3042,12 +3162,13 @@ Do you want to delete it anyway?</source>
<message>
<location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/>
<source>Multiple input method switcher</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Переключатель режима множественного ввода</translation>
</message>
<message>
<location line="+7"/>
<source>Multiple input method switcher that uses the context menu of the text widgets</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>текстовых виджетов &lt;-?-&gt; текстовых редакторов</translatorcomment>
+ <translation type="unfinished">Переключатель режима множественного ввода, используемый в контекстном меню текстовых виджетов</translation>
</message>
</context>
<context>
@@ -3186,7 +3307,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QNetworkAccessCacheBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
+ <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+66"/>
<source>Error opening %1</source>
<translation>Ошибка открытия %1</translation>
</message>
@@ -3194,9 +3315,9 @@ Do you want to delete it anyway?</source>
<context>
<name>QNetworkAccessDebugPipeBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+191"/>
+ <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+195"/>
<source>Write error writing to %1: %2</source>
- <translation type="unfinished">Ошибка записи в %1: %2</translation>
+ <translation>Ошибка записи в %1: %2</translation>
</message>
</context>
<context>
@@ -3258,7 +3379,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QNetworkAccessHttpBackend</name>
<message>
- <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+567"/>
+ <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+585"/>
<source>No suitable proxy found</source>
<translation>Подходящий прокси-сервер не найден</translation>
</message>
@@ -3266,12 +3387,12 @@ Do you want to delete it anyway?</source>
<context>
<name>QNetworkReply</name>
<message>
- <location line="+88"/>
+ <location line="+95"/>
<source>Error downloading %1 - server replied: %2</source>
<translation>Ошибка загрузки %1 - ответ сервера: %2</translation>
</message>
<message>
- <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+75"/>
+ <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+77"/>
<source>Protocol &quot;%1&quot; is unknown</source>
<translation>Неизвестный протокол &quot;%1&quot;</translation>
</message>
@@ -3279,8 +3400,8 @@ Do you want to delete it anyway?</source>
<context>
<name>QNetworkReplyImpl</name>
<message>
- <location line="+459"/>
- <location line="+22"/>
+ <location line="+519"/>
+ <location line="+28"/>
<source>Operation canceled</source>
<translation>Операция отменена</translation>
</message>
@@ -3288,7 +3409,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QOCIDriver</name>
<message>
- <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2082"/>
+ <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2076"/>
<source>Unable to logon</source>
<translation>Невозможно авторизоваться</translation>
</message>
@@ -3306,18 +3427,18 @@ Do you want to delete it anyway?</source>
<message>
<location line="+19"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+19"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
</context>
<context>
<name>QOCIResult</name>
<message>
- <location line="-976"/>
+ <location line="-972"/>
<location line="+161"/>
<location line="+15"/>
<source>Unable to bind column for batch execute</source>
@@ -3329,7 +3450,7 @@ Do you want to delete it anyway?</source>
<translation>Невозможно выполнить пакетное выражение</translation>
</message>
<message>
- <location line="+305"/>
+ <location line="+304"/>
<source>Unable to goto next</source>
<translation>Невозможно перейти к следующей строке</translation>
</message>
@@ -3354,10 +3475,6 @@ Do you want to delete it anyway?</source>
<translation>Невозможно привязать результирующие значения</translation>
</message>
<message>
- <source>Unable to execute select statement</source>
- <translation type="obsolete">Невозможно выполнить утверждение SELECT</translation>
- </message>
- <message>
<location line="+19"/>
<source>Unable to execute statement</source>
<translation>Невозможно выполнить выражение</translation>
@@ -3366,57 +3483,57 @@ Do you want to delete it anyway?</source>
<context>
<name>QODBCDriver</name>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1781"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1790"/>
<source>Unable to connect</source>
<translation>Невозможно соединиться</translation>
</message>
<message>
- <location line="+6"/>
- <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
- <translation>Невозможно соединиться - Драйвер не поддерживает требуемый функционал</translation>
- </message>
- <message>
- <location line="+239"/>
+ <location line="+238"/>
<source>Unable to disable autocommit</source>
- <translation>Невозможно отключить автовыполнение транзакции</translation>
+ <translation>Невозможно отключить автозавершение транзакций</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+17"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
<message>
<location line="+15"/>
<source>Unable to enable autocommit</source>
- <translation>Невозможно установить автовыполнение транзакции</translation>
+ <translation>Невозможно включить автозавершение транзакций</translation>
+ </message>
+ <message>
+ <location line="-281"/>
+ <source>Unable to connect - Driver doesn&apos;t support all functionality required</source>
+ <translation>Невозможно соединиться - Драйвер не поддерживает требуемый функционал</translation>
</message>
</context>
<context>
<name>QODBCResult</name>
<message>
- <location line="-1216"/>
- <location line="+349"/>
+ <location line="-932"/>
+ <location line="+346"/>
<source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
<translation>QODBCResult::reset: Невозможно установить &apos;SQL_CURSOR_STATIC&apos; атрибутом выражение. Проверьте настройки драйвера ODBC</translation>
</message>
<message>
- <location line="-332"/>
- <location line="+626"/>
+ <location line="-329"/>
+ <location line="+623"/>
<source>Unable to execute statement</source>
<translation>Невозможно выполнить выражение</translation>
</message>
<message>
- <location line="-555"/>
+ <location line="-547"/>
<source>Unable to fetch next</source>
<translation>Невозможно получить следующую строку</translation>
</message>
<message>
- <location line="+279"/>
+ <location line="+271"/>
<source>Unable to prepare statement</source>
<translation>Невозможно подготовить выражение</translation>
</message>
@@ -3426,14 +3543,14 @@ Do you want to delete it anyway?</source>
<translation>Невозможно привязать значение</translation>
</message>
<message>
- <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/>
- <location line="+579"/>
+ <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+190"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-467"/>
+ <location line="+576"/>
<source>Unable to fetch last</source>
<translation>Невозможно получить последнюю строку</translation>
</message>
<message>
- <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-673"/>
+ <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-670"/>
<source>Unable to fetch</source>
<translation>Невозможно получить данные</translation>
</message>
@@ -3451,9 +3568,9 @@ Do you want to delete it anyway?</source>
<context>
<name>QObject</name>
<message>
- <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
- <source>Home</source>
- <translation type="unfinished"></translation>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="-97"/>
+ <source>Invalid hostname</source>
+ <translation>Некорректное имя узла</translation>
</message>
<message>
<location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
@@ -3461,19 +3578,11 @@ Do you want to delete it anyway?</source>
<translation>Операция не поддерживается для %1</translation>
</message>
<message>
- <location line="+53"/>
+ <location line="+57"/>
<source>Invalid URI: %1</source>
<translation>Некорректный URI: %1</translation>
</message>
<message>
- <source>Write error writing to %1: %2</source>
- <translation type="obsolete">Ошибка записи в %1: %2</translation>
- </message>
- <message>
- <source>Read error reading from %1: %2</source>
- <translation type="obsolete">Ошибка чтения из %1: %2</translation>
- </message>
- <message>
<location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+60"/>
<source>Socket error on %1: %2</source>
<translation>Ошика сокета для %1: %2</translation>
@@ -3484,12 +3593,8 @@ Do you want to delete it anyway?</source>
<translation>Удалённый узел неожиданно прервал соединение для %1</translation>
</message>
<message>
- <source>Protocol error: packet of size 0 received</source>
- <translation type="obsolete">Ошибка протокола: получен пакет нулевого размера</translation>
- </message>
- <message>
- <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
- <location line="+57"/>
+ <location filename="../src/network/kernel/qhostinfo.cpp" line="+175"/>
+ <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+0"/>
<source>No host name given</source>
<translation>Имя узла не задано</translation>
</message>
@@ -3497,7 +3602,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QPPDOptionsModel</name>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1197"/>
+ <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1198"/>
<source>Name</source>
<translation>Имя</translation>
</message>
@@ -3510,7 +3615,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QPSQLDriver</name>
<message>
- <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/>
+ <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+782"/>
<source>Unable to connect</source>
<translation>Невозможно соединиться</translation>
</message>
@@ -3522,15 +3627,15 @@ Do you want to delete it anyway?</source>
<message>
<location line="+30"/>
<source>Could not commit transaction</source>
- <translation>Не удалось выполнить транзакцию</translation>
+ <translation>Не удалось завершить транзакцию</translation>
</message>
<message>
<location line="+16"/>
<source>Could not rollback transaction</source>
- <translation>Не удалось откатить транзакцию</translation>
+ <translation>Не удалось отозвать транзакцию</translation>
</message>
<message>
- <location line="+358"/>
+ <location line="+374"/>
<source>Unable to subscribe</source>
<translation>Невозможно подписаться</translation>
</message>
@@ -3543,12 +3648,12 @@ Do you want to delete it anyway?</source>
<context>
<name>QPSQLResult</name>
<message>
- <location line="-1058"/>
+ <location line="-1085"/>
<source>Unable to create query</source>
<translation>Невозможно создать запрос</translation>
</message>
<message>
- <location line="+374"/>
+ <location line="+372"/>
<source>Unable to prepare statement</source>
<translation>Невозможно подготовить выражение</translation>
</message>
@@ -3608,7 +3713,7 @@ Do you want to delete it anyway?</source>
<message>
<location/>
<source>Orientation</source>
- <translation>Ориентация страницы</translation>
+ <translation>Ориентация</translation>
</message>
<message>
<location/>
@@ -3643,7 +3748,7 @@ Do you want to delete it anyway?</source>
<message>
<location/>
<source>left margin</source>
- <translation>Левое поле</translation>
+ <translation>левое поле</translation>
</message>
<message>
<location/>
@@ -3653,7 +3758,7 @@ Do you want to delete it anyway?</source>
<message>
<location/>
<source>bottom margin</source>
- <translation>Нижнее поле</translation>
+ <translation>нижнее поле</translation>
</message>
</context>
<context>
@@ -3664,7 +3769,7 @@ Do you want to delete it anyway?</source>
<translation>Неизвестная ошибка</translation>
</message>
<message>
- <location line="-68"/>
+ <location line="-113"/>
<source>The plugin was not loaded.</source>
<translation>Модуль не был загружен.</translation>
</message>
@@ -3672,7 +3777,7 @@ Do you want to delete it anyway?</source>
<context>
<name>QPrintDialog</name>
<message>
- <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/>
+ <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+108"/>
<source>locally connected</source>
<translation>соединено локально</translation>
</message>
@@ -3839,21 +3944,21 @@ Do you want to delete it anyway?</source>
<translation>Конверт US #10 (105x241 мм)</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
+ <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+266"/>
<source>OK</source>
- <translation>Готово</translation>
+ <translation>Закрыть</translation>
</message>
<message>
- <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
+ <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+112"/>
<location line="+13"/>
<location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
<source>Print</source>
- <translation>Печатать</translation>
+ <translation>Печать</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/>
<source>Print To File ...</source>
- <translation>Печатать в файл ...</translation>
+ <translation>Печать в файл ...</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+19"/>
@@ -3892,7 +3997,7 @@ Do you want to overwrite it?</source>
<message>
<location line="+227"/>
<source>Print selection</source>
- <translation>Печатать выделенное</translation>
+ <translation>Выделенный фрагмент</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/>
@@ -3904,157 +4009,157 @@ Please choose a different file name.</source>
<message>
<location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
<source>A0</source>
- <translation type="unfinished"></translation>
+ <translation>A0</translation>
</message>
<message>
<location line="+1"/>
<source>A1</source>
- <translation type="unfinished"></translation>
+ <translation>A1</translation>
</message>
<message>
<location line="+1"/>
<source>A2</source>
- <translation type="unfinished"></translation>
+ <translation>A2</translation>
</message>
<message>
<location line="+1"/>
<source>A3</source>
- <translation type="unfinished"></translation>
+ <translation>A3</translation>
</message>
<message>
<location line="+1"/>
<source>A4</source>
- <translation type="unfinished"></translation>
+ <translation>A4</translation>
</message>
<message>
<location line="+1"/>
<source>A5</source>
- <translation type="unfinished"></translation>
+ <translation>A5</translation>
</message>
<message>
<location line="+1"/>
<source>A6</source>
- <translation type="unfinished"></translation>
+ <translation>A6</translation>
</message>
<message>
<location line="+1"/>
<source>A7</source>
- <translation type="unfinished"></translation>
+ <translation>A7</translation>
</message>
<message>
<location line="+1"/>
<source>A8</source>
- <translation type="unfinished"></translation>
+ <translation>A8</translation>
</message>
<message>
<location line="+1"/>
<source>A9</source>
- <translation type="unfinished"></translation>
+ <translation>A9</translation>
</message>
<message>
<location line="+1"/>
<source>B0</source>
- <translation type="unfinished"></translation>
+ <translation>B0</translation>
</message>
<message>
<location line="+1"/>
<source>B1</source>
- <translation type="unfinished"></translation>
+ <translation>B1</translation>
</message>
<message>
<location line="+1"/>
<source>B2</source>
- <translation type="unfinished"></translation>
+ <translation>B2</translation>
</message>
<message>
<location line="+1"/>
<source>B3</source>
- <translation type="unfinished"></translation>
+ <translation>B3</translation>
</message>
<message>
<location line="+1"/>
<source>B4</source>
- <translation type="unfinished"></translation>
+ <translation>B4</translation>
</message>
<message>
<location line="+1"/>
<source>B5</source>
- <translation type="unfinished"></translation>
+ <translation>B5</translation>
</message>
<message>
<location line="+1"/>
<source>B6</source>
- <translation type="unfinished"></translation>
+ <translation>B6</translation>
</message>
<message>
<location line="+1"/>
<source>B7</source>
- <translation type="unfinished"></translation>
+ <translation>B7</translation>
</message>
<message>
<location line="+1"/>
<source>B8</source>
- <translation type="unfinished"></translation>
+ <translation>B8</translation>
</message>
<message>
<location line="+1"/>
<source>B9</source>
- <translation type="unfinished"></translation>
+ <translation>B9</translation>
</message>
<message>
<location line="+1"/>
<source>B10</source>
- <translation type="unfinished"></translation>
+ <translation>B10</translation>
</message>
<message>
<location line="+1"/>
<source>C5E</source>
- <translation type="unfinished"></translation>
+ <translation>C5E</translation>
</message>
<message>
<location line="+1"/>
<source>DLE</source>
- <translation type="unfinished"></translation>
+ <translation>DLE</translation>
</message>
<message>
<location line="+1"/>
<source>Executive</source>
- <translation type="unfinished"></translation>
+ <translation>Executive</translation>
</message>
<message>
<location line="+1"/>
<source>Folio</source>
- <translation type="unfinished"></translation>
+ <translation>Folio</translation>
</message>
<message>
<location line="+1"/>
<source>Ledger</source>
- <translation type="unfinished"></translation>
+ <translation>Ledger</translation>
</message>
<message>
<location line="+1"/>
<source>Legal</source>
- <translation type="unfinished"></translation>
+ <translation>Legal</translation>
</message>
<message>
<location line="+1"/>
<source>Letter</source>
- <translation type="unfinished"></translation>
+ <translation>Letter</translation>
</message>
<message>
<location line="+1"/>
<source>Tabloid</source>
- <translation type="unfinished"></translation>
+ <translation>Tabloid</translation>
</message>
<message>
<location line="+1"/>
<source>US Common #10 Envelope</source>
- <translation type="unfinished"></translation>
+ <translation>US Common #10 Envelope</translation>
</message>
<message>
<location line="+1"/>
<source>Custom</source>
- <translation>Произвольный</translation>
+ <translation>Пользовательский</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-524"/>
@@ -4065,7 +4170,7 @@ Please choose a different file name.</source>
<message>
<location line="-63"/>
<source>&amp;Print</source>
- <translation>&amp;Печатать</translation>
+ <translation>&amp;Печать</translation>
</message>
<message>
<location line="+67"/>
@@ -4075,12 +4180,12 @@ Please choose a different file name.</source>
<message>
<location line="+253"/>
<source>Print to File (PDF)</source>
- <translation>Печатать в файл (PDF)</translation>
+ <translation>Печать в файл (PDF)</translation>
</message>
<message>
<location line="+1"/>
<source>Print to File (Postscript)</source>
- <translation>Печатать в файл (Postscript)</translation>
+ <translation>Печать в файл (Postscript)</translation>
</message>
<message>
<location line="+47"/>
@@ -4090,7 +4195,7 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Write %1 file</source>
- <translation>Запись %1 файл</translation>
+ <translation>Запись %1 файла</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
@@ -4104,7 +4209,7 @@ Please choose a different file name.</source>
<location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
<location line="+12"/>
<source>Page Setup</source>
- <translation>Свойства страницы</translation>
+ <translation>Параметры страницы</translation>
</message>
<message>
<location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+246"/>
@@ -4184,16 +4289,12 @@ Please choose a different file name.</source>
<message>
<location line="+15"/>
<source>Print</source>
- <translation>Печатать</translation>
+ <translation>Печать</translation>
</message>
<message>
<location line="+1"/>
<source>Page setup</source>
- <translation>Свойства страницы</translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="obsolete">Закрыть</translation>
+ <translation>Параметры страницы</translation>
</message>
<message>
<location line="+150"/>
@@ -4239,12 +4340,12 @@ Please choose a different file name.</source>
<message>
<location/>
<source>Print range</source>
- <translation>Печатать диапазон</translation>
+ <translation>Диапазон печати</translation>
</message>
<message>
<location/>
<source>Print all</source>
- <translation>Печатать все</translation>
+ <translation>Все</translation>
</message>
<message>
<location/>
@@ -4259,7 +4360,7 @@ Please choose a different file name.</source>
<message>
<location/>
<source>Selection</source>
- <translation>Выделенные</translation>
+ <translation>Выделенный фрагмент</translation>
</message>
<message>
<location/>
@@ -4337,7 +4438,7 @@ Please choose a different file name.</source>
<message>
<location/>
<source>&amp;Name:</source>
- <translation>&amp;Имя:</translation>
+ <translation>&amp;Название:</translation>
</message>
<message>
<location/>
@@ -4347,12 +4448,12 @@ Please choose a different file name.</source>
<message>
<location/>
<source>Location:</source>
- <translation>Положение:</translation>
+ <translation>Расположение:</translation>
</message>
<message>
<location/>
<source>Preview</source>
- <translation>Предпросмотр</translation>
+ <translation>Просмотр</translation>
</message>
<message>
<location/>
@@ -4362,7 +4463,7 @@ Please choose a different file name.</source>
<message>
<location/>
<source>Output &amp;file:</source>
- <translation>Выходной &amp;файл:</translation>
+ <translation>Вывод в &amp;файл:</translation>
</message>
<message>
<location/>
@@ -4373,28 +4474,28 @@ Please choose a different file name.</source>
<context>
<name>QProcess</name>
<message>
- <location filename="../src/corelib/io/qprocess_unix.cpp" line="+459"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
+ <location filename="../src/corelib/io/qprocess_unix.cpp" line="+402"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+137"/>
<source>Could not open input redirection for reading</source>
<translation>Не удалось открыть перенаправление ввода для чтения</translation>
</message>
<message>
<location line="+12"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+20"/>
<source>Could not open output redirection for writing</source>
<translation>Не удалось открыть перенаправление вывода для записи</translation>
</message>
<message>
<location line="+239"/>
<source>Resource error (fork failure): %1</source>
- <translation>Ошибка выделения ресурсов (fork не удался): %1</translation>
+ <translation>Ошибка выделения ресурсов (сбой fork): %1</translation>
</message>
<message>
- <location line="+259"/>
- <location line="+53"/>
+ <location line="+252"/>
+ <location line="+52"/>
<location line="+74"/>
- <location line="+67"/>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="+447"/>
+ <location line="+66"/>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="+406"/>
<location line="+50"/>
<location line="+75"/>
<location line="+42"/>
@@ -4403,7 +4504,7 @@ Please choose a different file name.</source>
<translation>Время на операцию с процессом истекло</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess.cpp" line="+558"/>
+ <location filename="../src/corelib/io/qprocess.cpp" line="+851"/>
<location line="+52"/>
<location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
<location line="+50"/>
@@ -4412,31 +4513,31 @@ Please choose a different file name.</source>
</message>
<message>
<location line="+47"/>
- <location line="+833"/>
+ <location line="+826"/>
<location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
<source>Error writing to process</source>
<translation>Ошибка отправки данных процессу</translation>
</message>
<message>
- <location line="-763"/>
+ <location line="-756"/>
<source>Process crashed</source>
<translation>Процесс завершился с ошибкой</translation>
</message>
<message>
- <location line="+966"/>
+ <location line="+959"/>
<source>No program defined</source>
- <translation>Программа не указана</translation>
+ <translation>Программа не указана</translation>
</message>
<message>
- <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
- <source>Process failed to start</source>
- <translation>Не удалось запустить процесс</translation>
+ <location filename="../src/corelib/io/qprocess_win.cpp" line="-360"/>
+ <source>Process failed to start: %1</source>
+ <translation>Не удалось запустить процесс: %1</translation>
</message>
</context>
<context>
<name>QProgressDialog</name>
<message>
- <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
+ <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+196"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
@@ -4460,7 +4561,7 @@ Please choose a different file name.</source>
<context>
<name>QRegExp</name>
<message>
- <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/>
+ <location filename="../src/corelib/tools/qregexp.cpp" line="+65"/>
<source>no error occurred</source>
<translation>ошибки отсутствуют</translation>
</message>
@@ -4504,13 +4605,23 @@ Please choose a different file name.</source>
<source>met internal limit</source>
<translation>достигнуто внутреннее ограничение</translation>
</message>
+ <message>
+ <location line="+1"/>
+ <source>invalid interval</source>
+ <translation>некорректный интервал</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>invalid category</source>
+ <translation>некорректная категория</translation>
+ </message>
</context>
<context>
<name>QSQLite2Driver</name>
<message>
- <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
- <source>Error to open database</source>
- <translation>Невозможно открыть базу данных</translation>
+ <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+391"/>
+ <source>Error opening database</source>
+ <translation>Ошибка открытия базы данных</translation>
</message>
<message>
<location line="+41"/>
@@ -4520,23 +4631,23 @@ Please choose a different file name.</source>
<message>
<location line="+17"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+17"/>
- <source>Unable to rollback Transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <source>Unable to rollback transaction</source>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
</context>
<context>
<name>QSQLite2Result</name>
<message>
- <location line="-323"/>
+ <location line="-319"/>
<source>Unable to fetch results</source>
- <translation>Невозможно получить результат</translation>
+ <translation>Невозможно получить результаты</translation>
</message>
<message>
- <location line="+147"/>
+ <location line="+143"/>
<source>Unable to execute statement</source>
<translation>Невозможно выполнить выражение</translation>
</message>
@@ -4544,14 +4655,14 @@ Please choose a different file name.</source>
<context>
<name>QSQLiteDriver</name>
<message>
- <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/>
+ <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+544"/>
<source>Error opening database</source>
- <translation>Невозможно открыть базу данных</translation>
+ <translation>Ошибка открытия базы данных</translation>
</message>
<message>
<location line="+11"/>
<source>Error closing database</source>
- <translation>Невозможно закрыть базу данных</translation>
+ <translation>Ошибка закрытия базы данных</translation>
</message>
<message>
<location line="+20"/>
@@ -4561,25 +4672,25 @@ Please choose a different file name.</source>
<message>
<location line="+15"/>
<source>Unable to commit transaction</source>
- <translation>Невозможно выполнить транзакцию</translation>
+ <translation>Невозможно завершить транзакцию</translation>
</message>
<message>
<location line="+15"/>
<source>Unable to rollback transaction</source>
- <translation>Невозможно откатить транзакцию</translation>
+ <translation>Невозможно отозвать транзакцию</translation>
</message>
</context>
<context>
<name>QSQLiteResult</name>
<message>
- <location line="-400"/>
+ <location line="-408"/>
<location line="+66"/>
<location line="+8"/>
<source>Unable to fetch row</source>
<translation>Невозможно получить строку</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+59"/>
<source>Unable to execute statement</source>
<translation>Невозможно выполнить выражение</translation>
</message>
@@ -4599,15 +4710,353 @@ Please choose a different file name.</source>
<translation>Количество параметров не совпадает</translation>
</message>
<message>
- <location line="-208"/>
+ <location line="-204"/>
<source>No query</source>
<translation>Отсутствует запрос</translation>
</message>
</context>
<context>
+ <name>QScriptBreakpointsModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointsmodel.cpp" line="+455"/>
+ <source>ID</source>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Location</source>
+ <translation>Размещение</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Condition</source>
+ <translation>Условие</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Ignore-count</source>
+ <translation type="unfinished">Пропустить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Single-shot</source>
+ <translation type="unfinished">Один раз</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Hit-count</source>
+ <translation type="unfinished">Попаданий</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptBreakpointsWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="+298"/>
+ <source>New</source>
+ <translation>Новая</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebugger</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebugger.cpp" line="+885"/>
+ <location line="+1013"/>
+ <source>Go to Line</source>
+ <translation>Перейти к строке</translation>
+ </message>
+ <message>
+ <location line="-1012"/>
+ <source>Line:</source>
+ <translation>Строка:</translation>
+ </message>
+ <message>
+ <location line="+791"/>
+ <source>Interrupt</source>
+ <translation>Прервать</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F5</source>
+ <translation>Shift+F5</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Continue</source>
+ <translation>Продолжить</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Into</source>
+ <translation>Войти в</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Over</source>
+ <translation>Перейти через</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Step Out</source>
+ <translation>Выйти из функции</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F11</source>
+ <translation>Shift+F11</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Run to Cursor</source>
+ <translation>Выполнить до курсора</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Ctrl+F10</source>
+ <translation>Ctrl+F10</translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Run to New Script</source>
+ <translation type="unfinished">Выполнить до нового сценария</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Toggle Breakpoint</source>
+ <translation type="unfinished">Установить/убрать точку останова</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Clear Debug Output</source>
+ <translation>Очистить отладочный вывод</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Clear Error Log</source>
+ <translation>Очистить журнал ошибок</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Clear Console</source>
+ <translation>Очистить консоль</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>&amp;Find in Script...</source>
+ <translation>&amp;Найти в сценарии...</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Ctrl+F</source>
+ <translation>Ctrl+F</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Find &amp;Next</source>
+ <translation>Найти &amp;следующее</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>F3</source>
+ <translation>F3</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Find &amp;Previous</source>
+ <translation>Найти &amp;предыдущее</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Shift+F3</source>
+ <translation>Shift+F3</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Ctrl+G</source>
+ <translation>Ctrl+G</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Debug</source>
+ <translation>Отладка</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerCodeFinderWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggercodefinderwidget.cpp" line="+141"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Previous</source>
+ <translation>Предыдущий</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Next</source>
+ <translation>Следующий</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Case Sensitive</source>
+ <translation>Учитывать регистр</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Whole words</source>
+ <translation>Слова целиком</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Search wrapped</source>
+ <translation>&lt;img src=&quot;:/qt/scripttools/debugging/images/wrap.png&quot;&gt;&amp;nbsp;Поиск с начала</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerLocalsModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggerlocalsmodel.cpp" line="+872"/>
+ <source>Name</source>
+ <translation>Название</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptDebuggerStackModel</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptdebuggerstackmodel.cpp" line="+161"/>
+ <source>Level</source>
+ <translation>Уровень</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Name</source>
+ <translation>Название</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Location</source>
+ <translation>Размещение</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptEdit</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptedit.cpp" line="+411"/>
+ <source>Toggle Breakpoint</source>
+ <translation type="unfinished">Установить/убрать точку останова</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Disable Breakpoint</source>
+ <translation type="unfinished">Убрать точку останова</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Enable Breakpoint</source>
+ <translation type="unfinished">Установить точку останова</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Breakpoint Condition:</source>
+ <translation type="unfinished">Условие точки останова:</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptEngineDebugger</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptenginedebugger.cpp" line="+523"/>
+ <source>Loaded Scripts</source>
+ <translation>Загруженные сценарии</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Breakpoints</source>
+ <translation>Точки останова</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Stack</source>
+ <translation>Стек</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Locals</source>
+ <translation>Локальные переменные</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Console</source>
+ <translation>Консоль</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Debug Output</source>
+ <translation>Отладочный вывод</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Error Log</source>
+ <translation>Журнал ошибок</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Search</source>
+ <translation>Поиск</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>View</source>
+ <translation>Вид</translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Qt Script Debugger</source>
+ <translation>Отладчик сценариев Qt</translation>
+ </message>
+</context>
+<context>
+ <name>QScriptNewBreakpointWidget</name>
+ <message>
+ <location filename="../src/scripttools/debugging/qscriptbreakpointswidget.cpp" line="-223"/>
+ <source>Close</source>
+ <translation>Закрыть</translation>
+ </message>
+</context>
+<context>
<name>QScrollBar</name>
<message>
- <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/>
+ <location filename="../src/gui/widgets/qscrollbar.cpp" line="+454"/>
<source>Scroll here</source>
<translation>Прокрутить сюда</translation>
</message>
@@ -4681,7 +5130,7 @@ Please choose a different file name.</source>
<message>
<location line="+4"/>
<source>Position</source>
- <translation>Позиция</translation>
+ <translation>Положение</translation>
</message>
<message>
<location line="+4"/>
@@ -4692,7 +5141,7 @@ Please choose a different file name.</source>
<context>
<name>QSharedMemory</name>
<message>
- <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+211"/>
+ <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+223"/>
<source>%1: unable to set key on lock</source>
<translation>%1: невозможно установить ключ на блокировку</translation>
</message>
@@ -4703,7 +5152,7 @@ Please choose a different file name.</source>
</message>
<message>
<location line="+168"/>
- <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+155"/>
<source>%1: unable to lock</source>
<translation>%1: невозможно заблокировать</translation>
</message>
@@ -4713,44 +5162,53 @@ Please choose a different file name.</source>
<translation>%1: невозможно разблокировать</translation>
</message>
<message>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+83"/>
<location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+80"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
<source>%1: permission denied</source>
<translation>%1: доступ запрещён</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-16"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+4"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
<source>%1: already exists</source>
<translation>%1: уже существует</translation>
</message>
<message>
<location line="+4"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
<source>%1: doesn&apos;t exists</source>
<translation>%1: не существует</translation>
</message>
<message>
- <location line="+6"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
+ <location line="+8"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+10"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+18"/>
<source>%1: out of resources</source>
<translation>%1: недостаточно ресурсов</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+7"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+4"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
<source>%1: unknown error %2</source>
<translation>%1: неизвестная ошибка %2</translation>
</message>
<message>
- <location line="+21"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+21"/>
<source>%1: key is empty</source>
<translation>%1: пустой ключ</translation>
</message>
<message>
- <location line="+8"/>
- <source>%1: unix key file doesn&apos;t exists</source>
- <translation>%1: специфический ключ unix не существует</translation>
+ <location line="-31"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-16"/>
+ <source>%1: doesn&apos;t exist</source>
+ <translation>%1: не существует</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>%1: UNIX key file doesn&apos;t exist</source>
+ <translation>%1: специфический ключ UNIX не существует</translation>
</message>
<message>
<location line="+7"/>
@@ -4758,13 +5216,14 @@ Please choose a different file name.</source>
<translation>%1: ошибка ftok</translation>
</message>
<message>
- <location line="+51"/>
- <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="+56"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+51"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+31"/>
<source>%1: unable to make key</source>
<translation>%1: невозможно создать ключ</translation>
</message>
<message>
- <location line="+20"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+20"/>
<source>%1: system-imposed size restrictions</source>
<translation>%1: системой наложены ограничения на размер</translation>
</message>
@@ -4774,17 +5233,19 @@ Please choose a different file name.</source>
<translation>%1: не приложенный</translation>
</message>
<message>
+ <location filename="../src/corelib/kernel/qsharedmemory_symbian.cpp" line="-67"/>
<location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
<source>%1: invalid size</source>
<translation>%1: некорректный размер</translation>
</message>
<message>
- <location line="+68"/>
+ <location line="+40"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+63"/>
<source>%1: key error</source>
<translation>%1: некорректный ключ</translation>
</message>
<message>
- <location line="+38"/>
+ <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+32"/>
<source>%1: size query failed</source>
<translation>%1: не удалось запросить размер</translation>
</message>
@@ -4792,9 +5253,9 @@ Please choose a different file name.</source>
<context>
<name>QShortcut</name>
<message>
- <location filename="../src/gui/kernel/qkeysequence.cpp" line="+394"/>
+ <location filename="../src/gui/kernel/qkeysequence.cpp" line="+393"/>
<source>Space</source>
- <translation type="unfinished">Пробел</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
@@ -4839,12 +5300,12 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Pause</source>
- <translation type="unfinished">Пауза</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Print</source>
- <translation type="unfinished">Печатать</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
@@ -4864,22 +5325,22 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Left</source>
- <translation type="unfinished">Влево</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Up</source>
- <translation type="unfinished">Вверх</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Right</source>
- <translation type="unfinished">Вправо</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Down</source>
- <translation type="unfinished">Вниз</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
@@ -4924,7 +5385,7 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Forward</source>
- <translation type="unfinished">Вперед</translation>
+ <translation type="unfinished">Вперёд</translation>
</message>
<message>
<location line="+1"/>
@@ -4939,17 +5400,17 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Volume Down</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Тише</translation>
</message>
<message>
<location line="+1"/>
<source>Volume Mute</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выключить звук</translation>
</message>
<message>
<location line="+1"/>
<source>Volume Up</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Громче</translation>
</message>
<message>
<location line="+1"/>
@@ -4979,32 +5440,32 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Media Play</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Воспроизведение</translation>
</message>
<message>
<location line="+1"/>
<source>Media Stop</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Остановить воспроизведение</translation>
</message>
<message>
<location line="+1"/>
<source>Media Previous</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Воспроизвести предыдущее</translation>
</message>
<message>
<location line="+1"/>
<source>Media Next</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Воспроизвести следующее</translation>
</message>
<message>
<location line="+1"/>
<source>Media Record</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запись</translation>
</message>
<message>
<location line="+2"/>
<source>Favorites</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Избранное</translation>
</message>
<message>
<location line="+1"/>
@@ -5014,102 +5475,102 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Standby</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Режим ожидания</translation>
</message>
<message>
<location line="+1"/>
<source>Open URL</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Открыть URL</translation>
</message>
<message>
<location line="+1"/>
<source>Launch Mail</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Почта</translation>
</message>
<message>
<location line="+1"/>
<source>Launch Media</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Проигрыватель</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (0)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (0)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (1)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (1)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (2)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (2)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (3)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (3)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (4)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (4)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (5)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (5)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (6)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (6)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (7)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (7)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (8)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (8)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (9)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (9)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (A)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (A)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (B)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (B)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (C)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (C)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (D)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (D)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (E)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (E)</translation>
</message>
<message>
<location line="+1"/>
<source>Launch (F)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить (F)</translation>
</message>
<message>
<location line="+4"/>
@@ -5149,12 +5610,12 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>Insert</source>
- <translation type="unfinished">Вставка</translation>
+ <translation type="unfinished">Вставить</translation>
</message>
<message>
<location line="+1"/>
<source>Delete</source>
- <translation type="unfinished">Удаление</translation>
+ <translation type="unfinished">Удалить</translation>
</message>
<message>
<location line="+1"/>
@@ -5169,7 +5630,7 @@ Please choose a different file name.</source>
<message>
<location line="+4"/>
<source>Select</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выбрать</translation>
</message>
<message>
<location line="+1"/>
@@ -5217,7 +5678,7 @@ Please choose a different file name.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+559"/>
+ <location line="+561"/>
<location line="+135"/>
<source>Ctrl</source>
<translation type="unfinished"></translation>
@@ -5251,7 +5712,7 @@ Please choose a different file name.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-765"/>
+ <location line="-767"/>
<source>Home Page</source>
<translation type="unfinished"></translation>
</message>
@@ -5271,7 +5732,7 @@ Please choose a different file name.</source>
<message>
<location line="+2"/>
<source>Position</source>
- <translation>Позиция</translation>
+ <translation>Положение</translation>
</message>
<message>
<location line="+3"/>
@@ -5289,7 +5750,7 @@ Please choose a different file name.</source>
<message>
<location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/>
<source>Connection to proxy refused</source>
- <translation>В соединении прокси-сервером отказано</translation>
+ <translation>В соединении с прокси-сервером отказано</translation>
</message>
<message>
<location line="+4"/>
@@ -5329,7 +5790,7 @@ Please choose a different file name.</source>
<message>
<location line="+4"/>
<source>Connection not allowed by SOCKSv5 server</source>
- <translation>Соединение не разрешено сервером SOCKSv5</translation>
+ <translation>Соединение не разрешено сервером SOCKSv5</translation>
</message>
<message>
<location line="+16"/>
@@ -5358,6 +5819,39 @@ Please choose a different file name.</source>
</message>
</context>
<context>
+ <name>QSoftKeyManager</name>
+ <message>
+ <location filename="../src/gui/kernel/qsoftkeymanager.cpp" line="+78"/>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Select</source>
+ <translation>Выбрать</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Done</source>
+ <translation>Готово</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Options</source>
+ <translation>Параметры</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <location line="+152"/>
+ <source>Exit</source>
+ <translation>Выход</translation>
+ </message>
+</context>
+<context>
<name>QSpinBox</name>
<message>
<location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/>
@@ -5430,7 +5924,7 @@ Please choose a different file name.</source>
<context>
<name>QSslSocket</name>
<message>
- <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
+ <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+546"/>
<source>Unable to write data: %1</source>
<translation>Невозможно записать данные: %1</translation>
</message>
@@ -5442,32 +5936,32 @@ Please choose a different file name.</source>
<message>
<location line="+96"/>
<source>Error during SSL handshake: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Ошибка квитирования SSL: %1</translation>
</message>
<message>
- <location line="-524"/>
+ <location line="-501"/>
<source>Error creating SSL context (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Ошибка создания контекста SSL: (%1)</translation>
</message>
<message>
<location line="+25"/>
<source>Invalid or empty cipher list (%1)</source>
- <translation type="unfinished"></translation>
+ <translation>Неправильный или пустой список шифров (%1)</translation>
</message>
<message>
<location line="+62"/>
<source>Error creating SSL session, %1</source>
- <translation>Ошибка создания SSL-сессии, %1</translation>
+ <translation>Ошибка создания сессии SSL, %1</translation>
</message>
<message>
<location line="+15"/>
<source>Error creating SSL session: %1</source>
- <translation>Ошибка создания SSL-сессии: %1</translation>
+ <translation>Ошибка создания сессии SSL: %1</translation>
</message>
<message>
<location line="-61"/>
<source>Cannot provide a certificate with no key, %1</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно предоставить сертификат без ключа, %1</translation>
</message>
<message>
<location line="+7"/>
@@ -5477,18 +5971,18 @@ Please choose a different file name.</source>
<message>
<location line="+12"/>
<source>Error loading private key, %1</source>
- <translation>Ошибка загрузки приватного ключа, %1</translation>
+ <translation>Ошибка загрузки закрытого ключа, %1</translation>
</message>
<message>
<location line="+7"/>
<source>Private key does not certificate public key, %1</source>
- <translation type="unfinished"></translation>
+ <translation>Закрытый ключ не соответствует открытому ключу, %1</translation>
</message>
</context>
<context>
<name>QStateMachine</name>
<message>
- <location filename="../src/corelib/statemachine/qstatemachine.cpp" line="+1003"/>
+ <location filename="../src/corelib/statemachine/qstatemachine.cpp" line="+998"/>
<source>Missing initial state in compound state &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -5505,7 +5999,7 @@ Please choose a different file name.</source>
<message>
<location line="+4"/>
<source>Unknown error</source>
- <translation type="unfinished">Неизвестная ошибка</translation>
+ <translation>Неизвестная ошибка</translation>
</message>
</context>
<context>
@@ -5576,7 +6070,7 @@ Please choose a different file name.</source>
<context>
<name>QTextControl</name>
<message>
- <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/>
+ <location filename="../src/gui/text/qtextcontrol.cpp" line="+2003"/>
<source>&amp;Undo</source>
<translation>&amp;Отменить действие</translation>
</message>
@@ -5613,7 +6107,7 @@ Please choose a different file name.</source>
<message>
<location line="+7"/>
<source>Select All</source>
- <translation>Выделить все</translation>
+ <translation>Выделить всё</translation>
</message>
</context>
<context>
@@ -5634,7 +6128,7 @@ Please choose a different file name.</source>
<context>
<name>QUdpSocket</name>
<message>
- <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
+ <location filename="../src/network/socket/qudpsocket.cpp" line="+179"/>
<source>This platform does not support IPv6</source>
<translation>Данная платформа не поддерживает IPv6</translation>
</message>
@@ -5642,7 +6136,7 @@ Please choose a different file name.</source>
<context>
<name>QUndoGroup</name>
<message>
- <location filename="../src/gui/util/qundogroup.cpp" line="+386"/>
+ <location filename="../src/gui/util/qundogroup.cpp" line="+385"/>
<source>Undo</source>
<translation>Отменить действие</translation>
</message>
@@ -5663,7 +6157,7 @@ Please choose a different file name.</source>
<context>
<name>QUndoStack</name>
<message>
- <location filename="../src/gui/util/qundostack.cpp" line="+834"/>
+ <location filename="../src/gui/util/qundostack.cpp" line="+832"/>
<source>Undo</source>
<translation>Отменить действие</translation>
</message>
@@ -5678,27 +6172,27 @@ Please choose a different file name.</source>
<message>
<location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/>
<source>LRM Left-to-right mark</source>
- <translation type="unfinished"></translation>
+ <translation>LRM Признак письма слева направо</translation>
</message>
<message>
<location line="+1"/>
<source>RLM Right-to-left mark</source>
- <translation type="unfinished"></translation>
+ <translation>RLM Признак письма справа налево</translation>
</message>
<message>
<location line="+1"/>
<source>ZWJ Zero width joiner</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">ZWJ Объединяющий символ нулевой ширины</translation>
</message>
<message>
<location line="+1"/>
<source>ZWNJ Zero width non-joiner</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">ZWNJ Не объединяющий символ нулевой ширины</translation>
</message>
<message>
<location line="+1"/>
<source>ZWSP Zero width space</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">ZWSP Пробел нулевой ширины</translation>
</message>
<message>
<location line="+1"/>
@@ -5728,18 +6222,18 @@ Please choose a different file name.</source>
<message>
<location line="+6"/>
<source>Insert Unicode control character</source>
- <translation type="unfinished"></translation>
+ <translation>Вставить управляющий символ Unicode</translation>
</message>
</context>
<context>
<name>QWebFrame</name>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+704"/>
<source>Request cancelled</source>
<translation>Запрос отменён</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+19"/>
<source>Request blocked</source>
<translation>Запрос блокирован</translation>
</message>
@@ -5750,8 +6244,8 @@ Please choose a different file name.</source>
</message>
<message>
<location line="+6"/>
- <source>Frame load interruped by policy change</source>
- <translation>Загрузка фрэйма прервана изменением политики</translation>
+ <source>Frame load interrupted by policy change</source>
+ <translation>Загрузка фрейма прервана изменением политики</translation>
</message>
<message>
<location line="+6"/>
@@ -5767,12 +6261,12 @@ Please choose a different file name.</source>
<context>
<name>QWebPage</name>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+385"/>
+ <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+416"/>
<source>Bad HTTP request</source>
<translation>Некорректный HTTP-запрос</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
+ <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+41"/>
<source>Submit</source>
<comment>default label for Submit buttons in forms on web pages</comment>
<translation>Отправить</translation>
@@ -5847,7 +6341,7 @@ Please choose a different file name.</source>
<location line="+5"/>
<source>Open Frame</source>
<comment>Open Frame in New Window context menu item</comment>
- <translation>Открыть фрэйм</translation>
+ <translation>Открыть фрейм</translation>
</message>
<message>
<location line="+5"/>
@@ -5865,7 +6359,7 @@ Please choose a different file name.</source>
<location line="+5"/>
<source>Go Forward</source>
<comment>Forward context menu item</comment>
- <translation>Вперед</translation>
+ <translation>Вперёд</translation>
</message>
<message>
<location line="+5"/>
@@ -5895,31 +6389,32 @@ Please choose a different file name.</source>
<location line="+5"/>
<source>No Guesses Found</source>
<comment>No Guesses Found context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Неверное слово</translation>
</message>
<message>
<location line="+5"/>
<source>Ignore</source>
<comment>Ignore Spelling context menu item</comment>
- <translation type="unfinished">Игнорировать</translation>
+ <translatorcomment>?Пропускать</translatorcomment>
+ <translation type="unfinished">Пропустить</translation>
</message>
<message>
<location line="+5"/>
<source>Add To Dictionary</source>
<comment>Learn Spelling context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Добавить в словарь</translation>
</message>
<message>
<location line="+5"/>
<source>Search The Web</source>
<comment>Search The Web context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Искать в Интернет</translation>
</message>
<message>
<location line="+5"/>
<source>Look Up In Dictionary</source>
<comment>Look Up in Dictionary context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Искать в словаре</translation>
</message>
<message>
<location line="+5"/>
@@ -5931,43 +6426,44 @@ Please choose a different file name.</source>
<location line="+5"/>
<source>Ignore</source>
<comment>Ignore Grammar context menu item</comment>
- <translation type="unfinished">Игнорировать</translation>
+ <translatorcomment>?Пропускать</translatorcomment>
+ <translation type="unfinished">Пропустить</translation>
</message>
<message>
<location line="+5"/>
<source>Spelling</source>
<comment>Spelling and Grammar context sub-menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Орфография</translation>
</message>
<message>
<location line="+5"/>
<source>Show Spelling and Grammar</source>
<comment>menu item title</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Показать панель проверки правописания</translation>
</message>
<message>
<location line="+1"/>
<source>Hide Spelling and Grammar</source>
<comment>menu item title</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Скрыть панель проверки правописания</translation>
</message>
<message>
<location line="+5"/>
<source>Check Spelling</source>
<comment>Check spelling context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Проверка орфографии</translation>
</message>
<message>
<location line="+5"/>
<source>Check Spelling While Typing</source>
<comment>Check spelling while typing context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Проверять орфографию при наборе текста</translation>
</message>
<message>
<location line="+5"/>
<source>Check Grammar With Spelling</source>
<comment>Check grammar with spelling context menu item</comment>
- <translation type="unfinished"></translation>
+ <translation>Проверять грамматику с орфографией</translation>
</message>
<message>
<location line="+5"/>
@@ -6003,7 +6499,7 @@ Please choose a different file name.</source>
<location line="+5"/>
<source>Direction</source>
<comment>Writing direction context sub-menu item</comment>
- <translation>Направление</translation>
+ <translation>Направление письма</translation>
</message>
<message>
<location line="+5"/>
@@ -6019,18 +6515,252 @@ Please choose a different file name.</source>
</message>
<message>
<location line="+5"/>
- <source>LTR</source>
+ <source>Left to Right</source>
<comment>Left to Right context menu item</comment>
<translation>Слева направо</translation>
</message>
<message>
<location line="+5"/>
- <source>RTL</source>
+ <source>Right to Left</source>
<comment>Right to Left context menu item</comment>
<translation>Справа налево</translation>
</message>
<message>
+ <location line="+105"/>
+ <source>Loading...</source>
+ <comment>Media controller status message when the media is loading</comment>
+ <translation>Загрузка...</translation>
+ </message>
+ <message>
<location line="+5"/>
+ <source>Live Broadcast</source>
+ <comment>Media controller status message when watching a live broadcast</comment>
+ <translation>Потоковое вещание</translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Audio Element</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Video Element</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Mute Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Unmute Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Play Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Pause Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Slider</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Slider Thumb</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Rewind Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Return to Real-time Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Elapsed Time</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Remaining Time</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Status Display</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Fullscreen Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek Forward Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek Back Button</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Audio element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Video element playback controls and status display</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Mute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Unmute audio tracks</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Begin playback</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Pause playback</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Movie time scrubber</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Movie time scrubber thumb</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Rewind movie</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Return streaming movie to real-time</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Current movie time</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Remaining movie time</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Current movie status</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Play movie in full-screen mode</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek quickly back</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Seek quickly forward</source>
+ <comment>Media controller element</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Indefinite time</source>
+ <comment>Media time description</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>%1 days %2 hours %3 minutes %4 seconds</source>
+ <comment>Media time description</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1 hours %2 minutes %3 seconds</source>
+ <comment>Media time description</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>%1 minutes %2 seconds</source>
+ <comment>Media time description</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>%1 seconds</source>
+ <comment>Media time description</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-210"/>
<source>Inspect</source>
<comment>Inspect Element context menu item</comment>
<translation>Проверить</translation>
@@ -6066,9 +6796,9 @@ Please choose a different file name.</source>
<translation>%1 (%2x%3 px)</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+170"/>
<source>Web Inspector - %2</source>
- <translation type="unfinished"></translation>
+ <translation>Web-инспектор - %2</translation>
</message>
<message>
<location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/>
@@ -6146,22 +6876,32 @@ Please choose a different file name.</source>
</translation>
</message>
<message>
- <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
+ <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1727"/>
<source>JavaScript Alert - %1</source>
- <translation type="unfinished"></translation>
+ <translation>JavaScript: Предупреждение - %1</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+16"/>
<source>JavaScript Confirm - %1</source>
- <translation type="unfinished"></translation>
+ <translation>JavaScript: Подтверждение - %1</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+18"/>
<source>JavaScript Prompt - %1</source>
- <translation type="unfinished"></translation>
+ <translation>JavaScript: Запрос - %1</translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>JavaScript Problem - %1</source>
+ <translation>JavaScript: Проблема - %1</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>The script on this page appears to have a problem. Do you want to stop the script?</source>
+ <translation>Сбой выполнения сценария на данной странице. Желаете остановить выполение сценария?</translation>
</message>
<message>
- <location line="+340"/>
+ <location line="+383"/>
<source>Move the cursor to the next character</source>
<translation>Переместить указатель к следующему символу</translation>
</message>
@@ -6305,11 +7045,76 @@ Please choose a different file name.</source>
<source>Insert a new line</source>
<translation>Вставить новую строку</translation>
</message>
+ <message>
+ <location line="+4"/>
+ <source>Paste and Match Style</source>
+ <translation>Вставить, сохранив стиль</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Remove formatting</source>
+ <translation>Удалить форматирование</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Strikethrough</source>
+ <translation>Зачёркнутый</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Subscript</source>
+ <translation>Подстрочный</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Superscript</source>
+ <translation>Надстрочный</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Insert Bulleted List</source>
+ <translation>Вставить маркированный список</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Insert Numbered List</source>
+ <translation>Вставить нумерованный список</translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Indent</source>
+ <translation>Увеличить отступ</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Outdent</source>
+ <translation>Уменьшить отступ</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Center</source>
+ <translation>По центру</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Justify</source>
+ <translation>По ширине</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Align Left</source>
+ <translation>По левому краю</translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Align Right</source>
+ <translation>По правому краю</translation>
+ </message>
</context>
<context>
<name>QWhatsThisAction</name>
<message>
- <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
+ <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+527"/>
<source>What&apos;s This?</source>
<translation>Что это?</translation>
</message>
@@ -6317,7 +7122,7 @@ Please choose a different file name.</source>
<context>
<name>QWidget</name>
<message>
- <location filename="../src/gui/kernel/qwidget.cpp" line="+5301"/>
+ <location filename="../src/gui/kernel/qwidget.cpp" line="+5652"/>
<source>*</source>
<translation>*</translation>
</message>
@@ -6325,7 +7130,7 @@ Please choose a different file name.</source>
<context>
<name>QWizard</name>
<message>
- <location filename="../src/gui/dialogs/qwizard.cpp" line="+638"/>
+ <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/>
<source>Go Back</source>
<translation>Назад</translation>
</message>
@@ -6337,7 +7142,7 @@ Please choose a different file name.</source>
<message>
<location line="+5"/>
<source>Commit</source>
- <translation>Отправить</translation>
+ <translation>Передать</translation>
</message>
<message>
<location line="+2"/>
@@ -6357,7 +7162,7 @@ Please choose a different file name.</source>
<message>
<location line="+10"/>
<source>&amp;Finish</source>
- <translation>&amp;Закончить</translation>
+ <translation>&amp;Завершить</translation>
</message>
<message>
<location line="+2"/>
@@ -6372,18 +7177,18 @@ Please choose a different file name.</source>
<message>
<location line="-8"/>
<source>&amp;Next</source>
- <translation>&amp;Вперед</translation>
+ <translation>&amp;Далее</translation>
</message>
<message>
<location line="+0"/>
<source>&amp;Next &gt;</source>
- <translation>&amp;Вперед &gt;</translation>
+ <translation>&amp;Далее &gt;</translation>
</message>
</context>
<context>
<name>QWorkspace</name>
<message>
- <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/>
+ <location filename="../src/gui/widgets/qworkspace.cpp" line="+1089"/>
<source>&amp;Restore</source>
<translation>&amp;Восстановить</translation>
</message>
@@ -6400,7 +7205,7 @@ Please choose a different file name.</source>
<message>
<location line="+2"/>
<source>Mi&amp;nimize</source>
- <translation>&amp;Минимизировать</translation>
+ <translation>&amp;Свернуть</translation>
</message>
<message>
<location line="+2"/>
@@ -6430,9 +7235,9 @@ Please choose a different file name.</source>
<translation>%1 - [%2]</translation>
</message>
<message>
- <location line="-1837"/>
+ <location line="-1832"/>
<source>Minimize</source>
- <translation>Минимизировать</translation>
+ <translation>Свернуть</translation>
</message>
<message>
<location line="+2"/>
@@ -6445,7 +7250,7 @@ Please choose a different file name.</source>
<translation>Закрыть</translation>
</message>
<message>
- <location line="+2053"/>
+ <location line="+2048"/>
<source>&amp;Unshade</source>
<translation>В&amp;осстановить из заголовка</translation>
</message>
@@ -6500,22 +7305,22 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>version expected while reading the XML declaration</source>
- <translation>в объявлении XML ожидается объявление параметра version</translation>
+ <translation>в объявлении XML ожидается параметр version</translation>
</message>
<message>
<location line="+1"/>
<source>wrong value for standalone declaration</source>
- <translation>некорректное значение объявления standalone</translation>
+ <translation>некорректное значение параметра standalone</translation>
</message>
<message>
<location line="+1"/>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation>в объявлении XML ожидается объявление параметра encoding или standalone</translation>
+ <translation>в объявлении XML ожидаются параметры encoding или standalone</translation>
</message>
<message>
<location line="+1"/>
<source>standalone declaration expected while reading the XML declaration</source>
- <translation>в объявлении XML ожидается объявление параметра standalone</translation>
+ <translation>в объявлении XML ожидается параметр standalone</translation>
</message>
<message>
<location line="+1"/>
@@ -6540,7 +7345,7 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>internal general entity reference not allowed in DTD</source>
- <translation>внутренняя ссылка на общий объкт недопустима в DTD</translation>
+ <translation>внутренняя ссылка на общий объект недопустима в DTD</translation>
</message>
<message>
<location line="+1"/>
@@ -6555,12 +7360,12 @@ Please choose a different file name.</source>
<message>
<location line="+1"/>
<source>unparsed entity reference in wrong context</source>
- <translation>неразобранная ссылка на объект в неправильном контексте</translation>
+ <translation>неразобранная ссылка на объект в неверном контексте</translation>
</message>
<message>
<location line="+1"/>
<source>recursive entities</source>
- <translation>рекурсия объектов</translation>
+ <translation>рекурсивные объекты</translation>
</message>
<message>
<location line="+1"/>
@@ -6571,45 +7376,45 @@ Please choose a different file name.</source>
<context>
<name>QXmlStream</name>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
+ <location filename="../src/corelib/xml/qxmlstream.cpp" line="+611"/>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="+1770"/>
<source>Extra content at end of document.</source>
- <translation type="unfinished"></translation>
+ <translation>Лишние данные в конце документа.</translation>
</message>
<message>
- <location line="+222"/>
+ <location line="+271"/>
<source>Invalid entity value.</source>
<translation>Некорректное значение объекта.</translation>
</message>
<message>
- <location line="+107"/>
+ <location line="+109"/>
<source>Invalid XML character.</source>
<translation>Некорректный символ XML.</translation>
</message>
<message>
<location line="+259"/>
<source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
- <translation>Последовательность &apos;]]&gt;&apos; не допускается в содержимом.</translation>
+ <translation>Последовательность &apos;]]&gt;&apos; недопустима в содержимом.</translation>
</message>
<message>
<location line="+309"/>
<source>Namespace prefix &apos;%1&apos; not declared</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс пространства имён &apos;%1&apos; не объявлен</translation>
</message>
<message>
<location line="+78"/>
<source>Attribute redefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут переопределён.</translation>
</message>
<message>
<location line="+115"/>
<source>Unexpected character &apos;%1&apos; in public id literal.</source>
- <translation type="unfinished"></translation>
+ <translation>Неожиданный символ &apos;%1&apos; в литерале открытого идентификатора.</translation>
</message>
<message>
<location line="+28"/>
<source>Invalid XML version string.</source>
- <translation type="unfinished"></translation>
+ <translation>Неверная строка версии XML.</translation>
</message>
<message>
<location line="+2"/>
@@ -6619,17 +7424,17 @@ Please choose a different file name.</source>
<message>
<location line="+23"/>
<source>%1 is an invalid encoding name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - неверное название кодировки.</translation>
</message>
<message>
<location line="+7"/>
<source>Encoding %1 is unsupported</source>
- <translation type="unfinished"></translation>
+ <translation>Кодировка %1 не поддерживается</translation>
</message>
<message>
<location line="+16"/>
<source>Standalone accepts only yes or no.</source>
- <translation>Псевдоатрибут &apos;standalone&apos; может принимать только значение yes или no.</translation>
+ <translation>Псевдоатрибут &apos;standalone&apos; может принимать только значения &apos;yes&apos; или &apos;no&apos;.</translation>
</message>
<message>
<location line="+2"/>
@@ -6662,47 +7467,47 @@ Please choose a different file name.</source>
<translation>Неожиданное &apos;</translation>
</message>
<message>
- <location line="+210"/>
+ <location line="+225"/>
<source>Expected character data.</source>
- <translation type="unfinished"></translation>
+ <translation>Ожидаются символьные данные.</translation>
</message>
<message>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/>
<source>Recursive entity detected.</source>
- <translation type="unfinished"></translation>
+ <translation>Обнаружен рекурсивный объект.</translation>
</message>
<message>
<location line="+516"/>
<source>Start tag expected.</source>
- <translation>Ожидается начало тэга.</translation>
+ <translation>Ожидается открывающий тэг.</translation>
</message>
<message>
<location line="+222"/>
<source>XML declaration not at start of document.</source>
- <translation type="unfinished"></translation>
+ <translation>Объявление XML находится не в начале документа.</translation>
</message>
<message>
<location line="-31"/>
<source>NDATA in parameter entity declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>NDATA в объявлении параметра.</translation>
</message>
<message>
<location line="+34"/>
<source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 неверное название обрабатываемой инструкции.</translation>
</message>
<message>
<location line="+11"/>
<source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>Неверное название обрабатываемой инструкции.</translation>
</message>
<message>
- <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
+ <location filename="../src/corelib/xml/qxmlstream.cpp" line="-536"/>
<location line="+12"/>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
<location line="+53"/>
<source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>Неверное объявление пространства имён.</translation>
</message>
<message>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/>
@@ -6717,30 +7522,30 @@ Please choose a different file name.</source>
<message>
<location line="+18"/>
<source>Reference to unparsed entity &apos;%1&apos;.</source>
- <translation type="unfinished"></translation>
+ <translation>Ссылка на необработанный объект &apos;%1&apos;.</translation>
</message>
<message>
<location line="-13"/>
<location line="+61"/>
<location line="+40"/>
<source>Entity &apos;%1&apos; not declared.</source>
- <translation type="unfinished"></translation>
+ <translation>Объект &apos;%1&apos; не объявлен.</translation>
</message>
<message>
<location line="-26"/>
<source>Reference to external entity &apos;%1&apos; in attribute value.</source>
- <translation type="unfinished"></translation>
+ <translation>Ссылка на внешний объект &apos;%1&apos; в значении атрибута.</translation>
</message>
<message>
<location line="+40"/>
<source>Invalid character reference.</source>
- <translation type="unfinished"></translation>
+ <translation>Неверная символьная ссылка.</translation>
</message>
<message>
<location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/>
<source>Encountered incorrectly encoded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Обнаружено неверно закодированное содержимое.</translation>
</message>
<message>
<location line="+274"/>
@@ -6750,1064 +7555,2376 @@ Please choose a different file name.</source>
<message>
<location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
<source>%1 is an invalid PUBLIC identifier.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - неверный идентификатор PUBLIC.</translation>
</message>
</context>
<context>
<name>QtXmlPatterns</name>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
- <source>An %1-attribute with value %2 has already been declared.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+13"/>
- <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
<source>Network timeout.</source>
- <translation type="unfinished"></translation>
+ <translation>Время ожидания сети истекло.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
<source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
- <translation type="unfinished"></translation>
+ <translation>Элемент %1 не может быть сериализован, так как присутствует вне документа.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/>
<source>Year %1 is invalid because it begins with %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Год %1 неверен, так как начинается с %2.</translation>
</message>
<message>
<location line="+19"/>
<source>Day %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>День %1 вне диапазона %2..%3.</translation>
</message>
<message>
<location line="+7"/>
<source>Month %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>Месяц %1 вне диапазона %2..%3.</translation>
</message>
<message>
<location line="+10"/>
<source>Overflow: Can&apos;t represent date %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Переполнение: Не удается представить дату %1.</translation>
</message>
<message>
<location line="+9"/>
<source>Day %1 is invalid for month %2.</source>
- <translation type="unfinished"></translation>
+ <translation>День %1 неверен для месяца %2.</translation>
</message>
<message>
<location line="+49"/>
<source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation type="unfinished"></translation>
+ <translation>Время 24:%1:%2.%3 неверно. 24 часа, но минуты, секунды и/или миллисекунды отличны от 0; </translation>
</message>
<message>
<location line="+13"/>
<source>Time %1:%2:%3.%4 is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Время %1:%2:%3.%4 неверно.</translation>
</message>
<message>
<location line="+115"/>
<source>Overflow: Date can&apos;t be represented.</source>
- <translation type="unfinished"></translation>
+ <translation>Переполнение: невозможно представить дату.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
<location line="+15"/>
<source>At least one component must be present.</source>
- <translation type="unfinished"></translation>
+ <translation>Должна присутствовать как минимум одна компонента.</translation>
</message>
<message>
<location line="-7"/>
<source>At least one time component must appear after the %1-delimiter.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
- <source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
- <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
- <source>The second operand in a division, %1, cannot be zero (%2).</source>
- <translation type="unfinished"></translation>
+ <translation>Как минимум одна компонента времени должна следовать за разделителем &apos;%1&apos;.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
<source>%1 is not a valid value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не является правильным значением типа %2.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
<source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation type="unfinished"></translation>
+ <translation>При преобразовании %2 в %1 исходное значение не может быть %3.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
<source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Целочисленное деление (%1) на нуль (%2) не определено.</translation>
</message>
<message>
<location line="+7"/>
<source>Division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Деление (%1) на нуль (%2) не определено.</translation>
</message>
<message>
<location line="+7"/>
<source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Деление по модулю (%1) на нуль (%2) не определено.</translation>
</message>
<message>
<location line="+122"/>
<location line="+32"/>
<source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Деление числа типа %1 на %2 (не числовое выражение) недопустимо.</translation>
</message>
<message>
<location line="-20"/>
<source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Деление числа типа %1 на %2 или %3 (плюс или минус нуль) недопустимо.</translation>
</message>
<message>
<location line="+32"/>
<source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Умножение числа типа %1 на %2 или %3 (плюс-минус бесконечность) недопустимо.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
<source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение типа %1 не может быть булевым значением.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
<source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation type="unfinished"></translation>
+ <translation>Булево значение не может быть вычислено для последовательностей, которые содержат два и более атомарных значения.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Значение %1 типа %2 больше максимума (%3).</translation>
</message>
<message>
<location line="+9"/>
<source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Значение %1 типа %2 меньше минимума (%3).</translation>
</message>
<message>
<location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение типа %1 должно содержать четное количество цифр. Значение %2 этому требованию не удовлетворяет.</translation>
</message>
<message>
<location line="+19"/>
<source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение %1 некорректно для типа %2.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
<source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не может использоваться для типа %2.</translation>
</message>
<message>
<location line="+17"/>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не может использоваться для атомарных значений типов %2 и %3.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/>
<source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation type="unfinished"></translation>
+ <translation>URI пространства имён в названии рассчитываемого атрибута не может быть %1.</translation>
</message>
<message>
<location line="+9"/>
<source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Название расчитываемого атрибута не может иметь URI пространства имён %1 с локальным именем %2.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
<source>Type error in cast, expected %1, received %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Ошибка типов в преобразовании, ожидалось %1, получено %2.</translation>
</message>
<message>
<location line="+29"/>
<source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/>
- <source>No casting is possible with %1 as the target type.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+15"/>
- <source>It is not possible to cast from %1 to %2.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+27"/>
- <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+23"/>
- <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>Failure when casting from %1 to %2: %3</source>
- <translation type="unfinished"></translation>
+ <translation>При преобразовании в %1 или производные от него типы исходное значение должно быть того же типа или строковым литералом. Тип %2 недопустим.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
<source>A comment cannot contain %1</source>
- <translation type="unfinished"></translation>
+ <translation>Комментарий не может содержать %1</translation>
</message>
<message>
<location line="+6"/>
<source>A comment cannot end with a %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
- <source>No comparisons can be done involving the type %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+14"/>
- <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Комментарий не может оканчиваться на %1.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
<source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation type="unfinished"></translation>
+ <translation>Узел-атрибут не может быть потомком узла-документа. Атрибут %1 неуместен.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
+ <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+162"/>
<source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation type="unfinished"></translation>
+ <translation>Модуль библиотеки не может использоваться напрямую. Он должен быть импортирован из основного модуля.</translation>
</message>
<message>
<location line="+40"/>
<source>No template by name %1 exists.</source>
- <translation type="unfinished"></translation>
+ <translation>Шаблон с именем %1 отсутствует.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/>
<source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение типа %1 не может быть условием. Условием могут являться числовой и булевый типы.</translation>
</message>
<message>
<location line="+32"/>
<source>A positional predicate must evaluate to a single numeric value.</source>
- <translation type="unfinished"></translation>
+ <translation>Позиционный предикат должен вычисляться как числовое выражение.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Целевое имя в обрабатываемой инструкции не может быть %1 в любой комбинации нижнего и верхнего регистров. Имя %2 некорректно.</translation>
</message>
<message>
<location line="+24"/>
<source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 некорректное целевое имя в обрабатываемой инструкции. Имя должно быть значением типа %2, например: %3.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
<source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation type="unfinished"></translation>
+ <translation>Последняя часть пути должна содержать узлы или атомарные значения, но не может содержать и то, и другое одновременно.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
<source>The data of a processing instruction cannot contain the string %1</source>
- <translation type="unfinished"></translation>
+ <translation>Данные обрабатываемой инструкции не могут содержать строку &apos;%1&apos;</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
<source>No namespace binding exists for the prefix %1</source>
- <translation type="unfinished"></translation>
+ <translation>Отсутствует привязка к пространству имён для префикса %1</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/>
<source>No namespace binding exists for the prefix %1 in %2</source>
- <translation type="unfinished"></translation>
+ <translation>Отсутствует привязка к пространству имён для префикса %1 в %2</translation>
</message>
<message>
<location line="+12"/>
<location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/>
<source>%1 is an invalid %2</source>
- <translation type="unfinished"></translation>
+ <translation>%1 некоррекно для %2</translation>
</message>
<message numerus="yes">
<location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
<source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 принимает не более %n аргумента. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не более %n аргументов. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не более %n аргументов. Следовательно, %2 неверно.</numerusform>
</translation>
</message>
<message numerus="yes">
<location line="+11"/>
<source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 принимает не менее %n аргумента. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не менее %n аргументов. Следовательно, %2 неверно.</numerusform>
+ <numerusform>%1 принимает не менее %n аргументов. Следовательно, %2 неверно.</numerusform>
</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/>
<source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation type="unfinished"></translation>
+ <translation>Первый аргумент %1 не может быть типа %2. Он должен быть числового типа, типа xs:yearMonthDuration или типа xs:dayTimeDuration.</translation>
</message>
<message>
<location line="+74"/>
<source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
+ <translation>Первый аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5.</translation>
</message>
<message>
<location line="+91"/>
<source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
+ <translation>Второй аргумент %1 не может быть типа %2. Он должен быть типа %3, %4 или %5.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
<source>%1 is not a valid XML 1.0 character.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
- <source>The first argument to %1 cannot be of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Символ %1 недопустим для XML 1.0.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
<source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation type="unfinished"></translation>
+ <translation>Если оба значения имеют региональные смещения, смещения должны быть одинаковы. %1 и %2 не одинаковы.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
<source>%1 was called.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 было вызвано.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/>
<source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation type="unfinished"></translation>
+ <translation>&apos;%1&apos; должно сопровождаться &apos;%2&apos; или &apos;%3&apos;, но не в конце замещаемой строки.</translation>
</message>
<message>
<location line="+39"/>
<source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished"></translation>
+ <translation>В замещаемой строке &apos;%1&apos; должно сопровождаться как минимум одной цифрой, если неэкранировано.</translation>
</message>
<message>
<location line="+26"/>
<source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation type="unfinished"></translation>
+ <translation>В замещаемой строке символ &apos;%1&apos; может использоваться только для экранирования самого себя или &apos;%2&apos;, но не &apos;%3&apos;</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
<source>%1 matches newline characters</source>
- <translation type="unfinished"></translation>
+ <translation>%1 соответствует символам конца строки</translation>
</message>
<message>
<location line="+4"/>
<source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 и %2 соответствуют началу и концу строки.</translation>
</message>
<message>
<location line="+6"/>
<source>Matches are case insensitive</source>
- <translation type="unfinished"></translation>
+ <translation>Соответствия регистронезависимы</translation>
</message>
<message>
<location line="+4"/>
<source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Символы пробелов удалены, за исключением тех, что были в классах символов</translation>
</message>
<message>
- <location line="+99"/>
+ <location line="+100"/>
<source>%1 is an invalid regular expression pattern: %2</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - неверный шаблон регулярного выражения: %2</translation>
</message>
<message>
<location line="+30"/>
<source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - неверный флаг для регулярного выражения. Допустимые флаги:</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
<source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс не должен быть указан, если первый параметр - пустая последовательность или пустая строка (вне пространства имён). Был указан префикс %1.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+346"/>
<source>It will not be possible to retrieve %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Будет невозможно восстановить %1.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
<source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation type="unfinished"></translation>
+ <translation>Корневой узел второго аргумента функции %1 должен быть документом. %2 не является документом.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
+ <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+266"/>
<source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
+ <translation>Набор по умолчанию не определён</translation>
</message>
<message>
<location line="+13"/>
<source>%1 cannot be retrieved</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не может быть восстановлен</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
<source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation type="unfinished"></translation>
+ <translation>Форма нормализации %1 не поддерживается. Поддерживаются только %2, %3, %4, %5 и пустая, т.е. пустая строка (без нормализации).</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
<source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation type="unfinished"></translation>
+ <translation>Региональное смещение должно быть в переделах от %1 до %2 включительно. %3 выходит за допустимые пределы.</translation>
</message>
<message>
<location line="+12"/>
<source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не является полным количеством минут.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
<source>Required cardinality is %1; got cardinality %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Необходимо %1 элементов, получено %2.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
<source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Элемент %1 не соответствует необходимому типу %2.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
- <location line="+7253"/>
+ <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+352"/>
+ <location line="+7323"/>
<source>%1 is an unknown schema type.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 является схемой неизвестного типа.</translation>
</message>
<message>
- <location line="-6971"/>
+ <location line="-7041"/>
<source>Only one %1 declaration can occur in the query prolog.</source>
- <translation type="unfinished"></translation>
+ <translation>Только одно объявление %1 может присутствовать в прологе запроса.</translation>
</message>
<message>
<location line="+188"/>
<source>The initialization of variable %1 depends on itself</source>
- <translation type="unfinished"></translation>
+ <translation>Инициализация переменной %1 зависит от себя самой</translation>
</message>
<message>
<location line="+63"/>
<source>No variable by name %1 exists</source>
- <translation type="unfinished"></translation>
+ <translation>Переменная с именем %1 отсутствует</translation>
</message>
<message>
<location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
<source>The variable %1 is unused</source>
- <translation type="unfinished"></translation>
+ <translation>Переменная %1 не используется</translation>
</message>
<message>
<location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/>
<source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished"></translation>
+ <translation>Версия %1 не поддерживается. Поддерживается XQuery версии 1.0.</translation>
</message>
<message>
<location line="+16"/>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Кодировка %1 неверна. Имя кодировки должно содержать только символы латиницы без пробелов и должно удовлетворять регулярному выражению %2.</translation>
</message>
<message>
<location line="+55"/>
<source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
+ <translation>Функция с сигнатурой %1 отсутствует</translation>
</message>
<message>
<location line="+72"/>
<location line="+10"/>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Объявление пространство имён по умолчанию должно быть до объявления функций, переменных и опций.</translation>
</message>
<message>
<location line="+10"/>
<source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Объявление пространства имён должно быть до объявления функций, переменных и опций.</translation>
</message>
<message>
<location line="+11"/>
<source>Module imports must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Импортируемые модули должны быть указаны до объявления функций, переменных и опций.</translation>
</message>
<message>
<location line="+200"/>
<source>It is not possible to redeclare prefix %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно переопределить префикс %1.</translation>
</message>
<message>
<location line="+18"/>
<source>Prefix %1 is already declared in the prolog.</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс %1 уже объявлен в прологе.</translation>
</message>
<message>
<location line="+95"/>
<source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation type="unfinished"></translation>
+ <translation>Название опции должно содержать префикс. Нет пространства имён по умолчанию для опций.</translation>
</message>
<message>
<location line="+171"/>
<source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation type="unfinished"></translation>
+ <translation>Возможность импорта схем не поддерживается, следовательно, объявлений %1 быть не должно.</translation>
</message>
<message>
<location line="+13"/>
<source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Целевое пространство имён %1 не может быть пустым.</translation>
</message>
<message>
<location line="+8"/>
<source>The module import feature is not supported</source>
- <translation type="unfinished"></translation>
+ <translation>Возможность импорта модулей не поддерживается</translation>
</message>
<message>
<location line="+52"/>
<source>No value is available for the external variable by name %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Отсутствует значение для внешней переменной с именем %1.</translation>
</message>
<message>
- <location line="-4154"/>
- <source>A construct was encountered which only is allowed in XQuery.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+118"/>
+ <location line="-4036"/>
<source>A template by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
+ <translation>Шаблон с именем %1 уже был объявлен.</translation>
</message>
<message>
<location line="+3581"/>
<source>The keyword %1 cannot occur with any other mode name.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ключевое слово %1 не может встречаться с любым другим названием режима.</translation>
</message>
<message>
<location line="+29"/>
<source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение атрибута %1 должно быть типа %2, но %3 ему не соответствует.</translation>
</message>
<message>
<location line="+75"/>
<source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Не удается связать префикс %1. По умолчанию префикс связан с пространством имён %2.</translation>
</message>
<message>
<location line="+312"/>
<source>A variable by name %1 has already been declared.</source>
- <translation type="unfinished"></translation>
+ <translation>Переменная с именем %1 уже объявлена.</translation>
</message>
<message>
<location line="+135"/>
<source>A stylesheet function must have a prefixed name.</source>
- <translation type="unfinished"></translation>
+ <translation>Функция стилей должна иметь имя с префиксом.</translation>
</message>
<message>
<location line="+9"/>
<source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished"></translation>
+ <translation>Пространство имён для пользовательских функций не может быть пустым (попробуйте предопределённый префикс %1, который существует для подобных ситуаций)</translation>
</message>
<message>
<location line="+9"/>
<source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation type="unfinished"></translation>
+ <translation>Пространтсво имён %1 зарезервировано, поэтому пользовательские функции не могут его использовать. Попробуйте предопределённый префикс %2, который существует для подобных ситуаций.</translation>
</message>
<message>
<location line="+12"/>
<source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation type="unfinished"></translation>
+ <translation>Пространство имён пользовательской функции в модуле библиотеки должен соответствовать пространству имён модуля. Другими словами, он должен быть %1 вместо %2</translation>
</message>
<message>
<location line="+34"/>
<source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Функция с сигнатурой %1 уже существует.</translation>
</message>
<message>
<location line="+23"/>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation type="unfinished"></translation>
+ <translation>Внешние функции не поддерживаются. Все поддерживаемые функции могут использоваться напрямую без первоначального объявления их в качестве внешних</translation>
</message>
<message>
<location line="+37"/>
<source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Аргумент с именем %1 уже объявлен. Имя каждого аргумента должно быть уникальным.</translation>
</message>
<message>
<location line="+179"/>
<source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
- <translation type="unfinished"></translation>
+ <translation>Если функция %1 используется для сравнения внутри шаблона, аргумент должен быть ссылкой на переменную или строковым литералом.</translation>
</message>
<message>
<location line="+11"/>
<source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
- <translation type="unfinished"></translation>
+ <translation>В шаблоне XSL-T первый аргумент функции %1 должен быть строковым литералом, если функция используется для сравнения.</translation>
</message>
<message>
<location line="+14"/>
<source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
- <translation type="unfinished"></translation>
+ <translation>В шаблоне XSL-T первый аргумент функции %1 должен быть литералом или ссылкой на переменную, если функция используется для сравнения.</translation>
</message>
<message>
<location line="+9"/>
<source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
- <translation type="unfinished"></translation>
+ <translation>В шаблоне XSL-T у функции %1 не должно быть третьего аргумента.</translation>
</message>
<message>
<location line="+10"/>
<source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
- <translation type="unfinished"></translation>
+ <translation>В шаблоне XSL-T только функции %1 и %2 могут использоваться для сравнения, но не %3.</translation>
</message>
<message>
<location line="+63"/>
<source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
- <translation type="unfinished"></translation>
+ <translation>В шаблоне XSL-T не может быть использована ось %1 - только оси %2 или %3.</translation>
</message>
<message>
<location line="+126"/>
<source>%1 is an invalid template mode name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 является неверным шаблоном имени режима.</translation>
</message>
<message>
<location line="+44"/>
<source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Имя переменной, связанной с выражением for, должно отличаться от позиционной переменной. Две переменные с именем %1 конфликтуют.</translation>
</message>
<message>
- <location line="+758"/>
+ <location line="+778"/>
<source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation type="unfinished"></translation>
+ <translation>Возможность проверки по схеме не поддерживается. Выражения %1 не могут использоваться.</translation>
</message>
<message>
- <location line="+39"/>
+ <location line="+40"/>
<source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation type="unfinished"></translation>
+ <translation>Ни одно из выражений pragma не поддерживается. Должно существовать запасное выражение</translation>
</message>
<message>
- <location line="+267"/>
+ <location line="+269"/>
<source>Each name of a template parameter must be unique; %1 is duplicated.</source>
- <translation type="unfinished"></translation>
+ <translation>Имя каждого параметра шаблона должно быть уникальным, но %1 повторяется.</translation>
</message>
<message>
<location line="+129"/>
<source>The %1-axis is unsupported in XQuery</source>
- <translation type="unfinished"></translation>
+ <translation>Ось %1 не поддерживается в XQuery</translation>
</message>
<message>
- <location line="+1150"/>
+ <location line="+1197"/>
<source>%1 is not a valid name for a processing-instruction.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 является неверным названием для инструкции обработки.</translation>
</message>
<message>
- <location line="-7029"/>
+ <location line="-7099"/>
<source>%1 is not a valid numeric literal.</source>
+ <translation>%1 является неверным числовым литералом.</translation>
+ </message>
+ <message>
+ <location line="-152"/>
+ <source>W3C XML Schema identity constraint selector</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6165"/>
- <source>No function by name %1 is available.</source>
+ <location line="+3"/>
+ <source>W3C XML Schema identity constraint field</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+4"/>
+ <source>A construct was encountered which is disallowed in the current language(%1).</source>
+ <translation>Встречена конструкция, запрещённая для текущего языка (%1).</translation>
+ </message>
+ <message>
+ <location line="+6380"/>
+ <source>No function by name %1 is available.</source>
+ <translation>Функция с именем %1 отсутствует.</translation>
+ </message>
+ <message>
<location line="+102"/>
<source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation type="unfinished"></translation>
+ <translation>URI пространства имён не может быть пустой строкой при связывании с префиксом %1.</translation>
</message>
<message>
<location line="+7"/>
<source>%1 is an invalid namespace URI.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - неверный URI пространства имён.</translation>
</message>
<message>
<location line="+6"/>
<source>It is not possible to bind to the prefix %1</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно связать с префиксом %1</translation>
</message>
<message>
<location line="+7"/>
<source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
+ <translation>Пространство имён %1 может быть связано только с %2 (в данном случае уже предопределено).</translation>
</message>
<message>
<location line="+8"/>
<source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс %1 может быть связан только с %2 (в данном случае уже предопределено).</translation>
</message>
<message>
<location line="+15"/>
<source>Two namespace declaration attributes have the same name: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Два атрибута объявления пространств имён имеют одинаковое имя: %1.</translation>
</message>
<message>
<location line="+89"/>
<source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation type="unfinished"></translation>
+ <translation>URI пространства имён должно быть константой и не может содержать выражений.</translation>
</message>
<message>
<location line="+16"/>
<source>An attribute by name %1 has already appeared on this element.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут с именем %1 уже существует для данного элемента.</translation>
</message>
<message>
<location line="+61"/>
<source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Прямой конструктор элемента составлен некорректно. %1 заканчивается на %2.</translation>
</message>
<message>
<location line="+458"/>
<source>The name %1 does not refer to any schema type.</source>
- <translation type="unfinished"></translation>
+ <translation>Название %1 не соответствует ни одному типу схемы.</translation>
</message>
<message>
<location line="+10"/>
<source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - сложный тип. Преобразование к сложным типам невозможно. Однако, преобразование к атомарным типам как %2 работает.</translation>
</message>
<message>
<location line="+9"/>
<source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 - не атомарный тип. Преобразование возможно только к атомарным типам.</translation>
</message>
<message>
<location line="+145"/>
<location line="+71"/>
<source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 является объявлением атрибута вне области объявлений. Имейте в виду, возможность импорта схем не поддерживается.</translation>
</message>
<message>
<location line="+48"/>
<source>The name of an extension expression must be in a namespace.</source>
- <translation type="unfinished"></translation>
+ <translation>Название выражения расширения должно быть в пространстве имён.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
<source>empty</source>
- <translation type="unfinished"></translation>
+ <translation>пусто</translation>
</message>
<message>
<location line="+2"/>
<source>zero or one</source>
- <translation type="unfinished"></translation>
+ <translation>нуль или один</translation>
</message>
<message>
<location line="+2"/>
<source>exactly one</source>
- <translation type="unfinished"></translation>
+ <translation>ровно один</translation>
</message>
<message>
<location line="+2"/>
<source>one or more</source>
- <translation type="unfinished"></translation>
+ <translation>один или более</translation>
</message>
<message>
<location line="+2"/>
<source>zero or more</source>
- <translation type="unfinished"></translation>
+ <translation>нуль или более</translation>
</message>
<message>
<location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/>
<source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished"></translation>
+ <translation>Требуется тип %1, но обнаружен %2.</translation>
</message>
<message>
<location line="+44"/>
<source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation type="unfinished"></translation>
+ <translation>Преобразование %1 к %2 может снизить точность.</translation>
</message>
<message>
<location line="+49"/>
<source>The focus is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Фокус не определён.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/>
<source>It&apos;s not possible to add attributes after any other kind of node.</source>
- <translation type="unfinished"></translation>
+ <translation>Невозможно добавлять атрибуты после любого другого вида узла.</translation>
</message>
<message>
<location line="+7"/>
<source>An attribute by name %1 has already been created.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут с именем %1 уже существует.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
<source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation type="unfinished"></translation>
+ <translation>Поддерживается только Unicode Codepoint Collation (%1). %2 не поддерживается.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/>
<source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 не может быть сериализован, так как присутствует на верхнем уровне.</translation>
</message>
<message>
- <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
+ <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+344"/>
<source>%1 is an unsupported encoding.</source>
- <translation type="unfinished"></translation>
+ <translation>Кодировка %1 не поддерживается.</translation>
</message>
<message>
<location line="+16"/>
<source>%1 contains octets which are disallowed in the requested encoding %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 содержит октеты, которые недопустимы в требуемой кодировке %2.</translation>
</message>
<message>
<location line="+18"/>
<source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
- <translation type="unfinished"></translation>
+ <translation>Символ с кодом %1, присутствующий в %2 при использовании кодировки %3, не является допустимым символом XML.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
<source>Ambiguous rule match.</source>
- <translation type="unfinished"></translation>
+ <translation>Неоднозначное соответствие правилу.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
<source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
- <translation type="unfinished"></translation>
+ <translation>В конструкторе пространства имён значение пространства имён не может быть пустой строкой.</translation>
</message>
<message>
<location line="+11"/>
<source>The prefix must be a valid %1, which %2 is not.</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс должен быть корректным %1, но %2 им не является.</translation>
</message>
<message>
<location line="+14"/>
<source>The prefix %1 cannot be bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс%1 не может быть связан.</translation>
</message>
<message>
<location line="+10"/>
<source>Only the prefix %1 can be bound to %2 and vice versa.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
- <source>Circularity detected</source>
- <translation type="unfinished"></translation>
+ <translation>Только префикс %1 может быть связан с %2 и наоборот.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
<source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
- <translation type="unfinished"></translation>
+ <translation>Необходим параметр %1 , но соответствующего %2 не передано.</translation>
</message>
<message>
<location line="-71"/>
<source>The parameter %1 is passed, but no corresponding %2 exists.</source>
- <translation type="unfinished"></translation>
+ <translation>Передан параметр %1 , но соответствующего %2 не существует.</translation>
</message>
<message>
<location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
<source>The URI cannot have a fragment</source>
- <translation type="unfinished"></translation>
+ <translation>URI не может содержать фрагмент</translation>
</message>
<message>
<location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/>
<source>Element %1 is not allowed at this location.</source>
- <translation type="unfinished"></translation>
+ <translation>Элемент %1 недопустим в этом месте.</translation>
</message>
<message>
<location line="+9"/>
<source>Text nodes are not allowed at this location.</source>
- <translation type="unfinished"></translation>
+ <translation>Текстовые узлы недопустимы в этом месте.</translation>
</message>
<message>
<location line="+20"/>
<source>Parse error: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Ошибка разбора: %1</translation>
</message>
<message>
<location line="+62"/>
<source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
- <translation type="unfinished"></translation>
+ <translation>Значение атрибута версии XSL-T должно быть типа %1, но %2 им не является.</translation>
</message>
<message>
<location line="+20"/>
<source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
- <translation type="unfinished"></translation>
+ <translation>Выполняется таблица стилей XSL-T 1.0 с обработчиком версии 2.0.</translation>
</message>
<message>
<location line="+108"/>
<source>Unknown XSL-T attribute %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Неизвествный атрибут XSL-T %1.</translation>
</message>
<message>
<location line="+23"/>
<source>Attribute %1 and %2 are mutually exclusive.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибуты %1 и %2 взаимоисключающие.</translation>
</message>
<message>
<location line="+166"/>
<source>In a simplified stylesheet module, attribute %1 must be present.</source>
- <translation type="unfinished"></translation>
+ <translation>В модуле упрощённой таблицы стилей обязан присутствовать атрибут %1.</translation>
</message>
<message>
<location line="+72"/>
<source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
- <translation type="unfinished"></translation>
+ <translation>Если элемент %1 не имеет атрибут %2, у него не может быть атрибутов %3 и %4.</translation>
</message>
<message>
<location line="+9"/>
<source>Element %1 must have at least one of the attributes %2 or %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Элемент %1 должен иметь как минимум один из атрибутов %2 или %3.</translation>
</message>
<message>
<location line="+28"/>
<source>At least one mode must be specified in the %1-attribute on element %2.</source>
+ <translation>Как минимум один режим должен быть указан в атрибуте %1 элемента %2.</translation>
+ </message>
+ <message>
+ <location line="+123"/>
+ <source>Element %1 must come last.</source>
+ <translation>Элемент %1 должен идти последним.</translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>At least one %1-element must occur before %2.</source>
+ <translation>Как минимум один элемент %1 должен быть перед %2.</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Only one %1-element can appear.</source>
+ <translation>Должен быть только один элемент %1.</translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>At least one %1-element must occur inside %2.</source>
+ <translation>Как минимум один элемент %1 должен быть внутри %2.</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <translation>Если %2 содержит атрибут %1, конструктор последовательности не может быть использован.</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <translation>Элемент %1 должен иметь атрибут %2 или конструктор последовательности.</translation>
+ </message>
+ <message>
+ <location line="+125"/>
+ <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
+ <translation>Если параметр необходим, значение по умолчание не может быть передано через атрибут %1 или конструктор последовательности.</translation>
+ </message>
+ <message>
+ <location line="+270"/>
+ <source>Element %1 cannot have children.</source>
+ <translation>У элемента %1 не может быть потомков.</translation>
+ </message>
+ <message>
+ <location line="+434"/>
+ <source>Element %1 cannot have a sequence constructor.</source>
+ <translation>У элемента %1 не может быть конструктора последовательности.</translation>
+ </message>
+ <message>
+ <location line="+86"/>
+ <location line="+9"/>
+ <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <translation>У %2 не может быть атрибута %1, когда он является потомком %3.</translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <translation type="unfinished">Параметр в функции не может быть объявлен туннелем.</translation>
+ </message>
+ <message>
+ <location line="+149"/>
+ <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <translation type="unfinished">Данный обработчик не работает со схемами, следовательно, %1 не может использоваться.</translation>
+ </message>
+ <message>
+ <location line="+57"/>
+ <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <translation>Элементы верхнего уровня таблицы стилей должны быть в пространстве имен, которым %1 не является.</translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <translation>Значение атрибута %1 элемента %2 должно быть или %3, или %4, но не %5.</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Attribute %1 cannot have the value %2.</source>
+ <translation>Атрибут %1 не может принимать значение %2.</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>The attribute %1 can only appear on the first %2 element.</source>
+ <translation>Атрибут %1 может быть только у первого элемента %2.</translation>
+ </message>
+ <message>
+ <location line="+99"/>
+ <source>At least one %1 element must appear as child of %2.</source>
+ <translation>Как минимум один элемент %1 должен быть в %2.</translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemachecker.cpp" line="+227"/>
+ <source>%1 has inheritance loop in its base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <location line="+24"/>
+ <source>Circular inheritance of base type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Circular inheritance of union %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
- <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
+ <location line="+5"/>
+ <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Base type of simple type %1 cannot be complex type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Simple type %1 cannot have direct base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+33"/>
+ <location line="+9"/>
+ <source>Simple type %1 is not allowed to have base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Simple type %1 can only have simple atomic type as base type.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
- <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
+ <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <location line="+484"/>
+ <source>Variety of item type of %1 must be either atomic or union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-474"/>
+ <location line="+483"/>
+ <source>Variety of member types of %1 must be atomic.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-470"/>
+ <location line="+451"/>
+ <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-431"/>
+ <source>Simple type %1 is only allowed to have %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Base type of simple type %1 must have variety of type list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Base type of simple type %1 has defined derivation by restriction as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Item type of base type does not match item type of %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <location line="+93"/>
+ <source>Simple type %1 contains not allowed facet type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-72"/>
+ <location line="+413"/>
+ <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-404"/>
+ <source>%1 is not allowed to have any facets.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
+ <source>Base type %1 of simple type %2 must have variety of union.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
- <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
+ <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
- <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
+ <location line="+18"/>
+ <source>Member type %1 cannot be derived from member type %2 of %3&apos;s base type %4.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
- <source>The attribute %1 must appear on element %2.</source>
+ <location line="+65"/>
+ <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Complex type %1 has duplicated element %2 in its content model.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
- <source>The element with local name %1 does not exist in XSL-T.</source>
+ <source>Complex type %1 has non-deterministic content.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
- <source>Element %1 must come last.</source>
+ <location line="+21"/>
+ <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+24"/>
- <source>At least one %1-element must occur before %2.</source>
+ <location line="+37"/>
+ <source>Content model of complex type %1 is not a valid extension of content model of %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Complex type %1 must have simple content.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
- <source>Only one %1-element can appear.</source>
+ <source>Complex type %1 must have the same simple type as its base class %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+31"/>
- <source>At least one %1-element must occur inside %2.</source>
+ <location line="+67"/>
+ <source>Complex type %1 cannot be derived from base type %2%3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+14"/>
+ <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <source>Item type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+44"/>
+ <source>Member type of simple type %1 cannot be a complex type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 is not allowed to have a member type with the same name as itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+83"/>
+ <location line="+29"/>
+ <location line="+34"/>
+ <source>%1 facet collides with %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-20"/>
+ <source>%1 facet must have the same value as %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>%1 facet must be equal or greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <location line="+125"/>
+ <location line="+55"/>
+ <location line="+12"/>
+ <location line="+91"/>
<location line="+58"/>
- <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+ <location line="+34"/>
+ <location line="+35"/>
+ <source>%1 facet must be less than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-389"/>
+ <source>%1 facet contains invalid regular expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Unknown notation %1 used in %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>%1 facet contains invalid value %2: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <location line="+55"/>
+ <location line="+230"/>
+ <source>%1 facet must be less than or equal to %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-257"/>
+ <location line="+134"/>
+ <location line="+82"/>
+ <source>%1 facet must be less than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-201"/>
+ <location line="+79"/>
+ <source>%1 facet and %2 facet cannot appear together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-27"/>
+ <location line="+12"/>
+ <location line="+113"/>
+ <source>%1 facet must be greater than %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-86"/>
+ <location line="+58"/>
+ <source>%1 facet must be less than %2 facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-42"/>
+ <location line="+58"/>
+ <source>%1 facet must be greater than or equal to %2 facet of base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <source>Simple type contains not allowed facet %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Only %1 and %2 facets are allowed when derived by union.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <location line="+16"/>
+ <source>%1 contains %2 facet with invalid data: %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Attribute group %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Complex type %1 contains attribute %2 twice.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Complex type %1 contains two different attributes that both have types derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <location line="+11"/>
+ <source>Value constraint of element %1 is not of elements type: %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
- <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+ <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+125"/>
- <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
+ <location line="+28"/>
+ <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+270"/>
- <source>Element %1 cannot have children.</source>
+ <location line="+41"/>
+ <source>Value constraint of attribute %1 is not of attributes type: %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+434"/>
- <source>Element %1 cannot have a sequence constructor.</source>
+ <location line="+9"/>
+ <source>Attribute %1 has value constraint but has type derived from %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+56"/>
+ <source>%1 attribute in derived complex type must be %2 like in base type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+86"/>
<location line="+9"/>
- <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+ <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+7"/>
+ <source>Attribute %1 in derived complex type must have %2 value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>processContent of base wildcard must be weaker than derived wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+39"/>
<location line="+15"/>
- <source>A parameter in a function cannot be declared to be a tunnel.</source>
+ <source>Element %1 exists twice with different types.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+149"/>
- <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+ <location line="+28"/>
+ <source>Particle contains non-deterministic wildcards.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+57"/>
- <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+ <location filename="../src/xmlpatterns/schema/qxsdschemahelper.cpp" line="+691"/>
+ <location line="+63"/>
+ <source>Base attribute %1 is required but derived attribute is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-57"/>
+ <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived attribute %1 does not exists in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Derived attribute %1 does not match the wildcard in the base definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Base attribute %1 is required but missing in derived definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Derived definition contains an %1 element that does not exists in the base definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived wildcard is not a subset of the base wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Attribute %1 from base type is missing in derived type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Type of derived attribute %1 differs from type of base attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Base definition contains an %1 element that is missing in the derived definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemaresolver.cpp" line="+354"/>
+ <source>%1 references unknown %2 or %3 element %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>%1 references identity constraint %2 that is no %3 or %4 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>%1 has a different number of fields from the identity constraint %2 that it references.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Base type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+84"/>
+ <source>Item type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+31"/>
+ <source>Member type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+28"/>
+ <location line="+408"/>
+ <location line="+30"/>
+ <source>Type %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-416"/>
+ <source>Base type %1 of complex type cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>%1 cannot have complex base type that has a %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+279"/>
+ <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+101"/>
+ <source>Type of %1 element must be a simple type, %2 is not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+62"/>
+ <source>Substitution group %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Substitution group %1 has circular definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+120"/>
+ <location line="+7"/>
+ <source>Duplicated element names %1 in %2 element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <location line="+52"/>
+ <location line="+71"/>
+ <location line="+28"/>
+ <source>Reference %1 of %2 element cannot be resolved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-138"/>
+ <source>Circular group reference for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>%1 element is not allowed in this scope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>%1 element cannot have %2 attribute with value other than %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+91"/>
+ <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Attribute group %1 has circular reference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>%1 attribute in %2 must have %3 use like in base type %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>%1 has attribute wildcard but its base type %2 has not.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
- <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+ <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+20"/>
- <source>Attribute %1 cannot have the value %2.</source>
+ <location line="+10"/>
+ <source>Namespace prefix of qualified name %1 is not defined.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+58"/>
- <source>The attribute %1 can only appear on the first %2 element.</source>
+ <location line="+51"/>
+ <location line="+18"/>
+ <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+99"/>
- <source>At least one %1 element must appear as child of %2.</source>
+ <location filename="../src/xmlpatterns/schema/qxsdparticlechecker.cpp" line="+165"/>
+ <source>Empty particle cannot be derived from non-empty particle.</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>VolumeSlider</name>
<message>
- <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
- <source>Muted</source>
- <translation>Без звука</translation>
+ <location line="+15"/>
+ <source>Derived particle is missing element %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Derived element %1 is missing value constraint as defined in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Derived element %1 has weaker value constraint than base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Derived element %1 cannot be nillable as base element is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Simple type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Complex type of derived element %1 cannot be validly derived from base element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+24"/>
+ <source>Element %1 is missing in derived particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Element %1 does not match namespace constraint of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
+ <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+240"/>
+ <source>Derived particle allows content that is not allowed in the base particle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdschemaparser.cpp" line="+170"/>
+ <source>Can not process unknown element %1, expected elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>Element %1 is not allowed in this scope, possible elements are: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>Child element is missing in that scope, possible child elements are: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+127"/>
+ <source>Document is not a XML schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>%1 attribute of %2 element contains invalid content: {%3}.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <location line="+11"/>
+ <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+237"/>
+ <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+833"/>
+ <location line="+158"/>
+ <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-97"/>
+ <location line="+119"/>
+ <location line="+92"/>
+ <source>%1 element has neither %2 attribute nor %3 child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+835"/>
+ <location line="+1474"/>
+ <location line="+232"/>
+ <location line="+7"/>
+ <location line="+260"/>
+ <location line="+17"/>
+ <location line="+258"/>
+ <location line="+6"/>
+ <location line="+17"/>
+ <location line="+6"/>
+ <location line="+17"/>
+ <location line="+11"/>
+ <location line="+11"/>
+ <location line="+11"/>
+ <source>%1 element with %2 child element must not have a %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-1325"/>
+ <source>%1 attribute of %2 element must be %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+36"/>
+ <source>%1 attribute of %2 element must have a value of %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+34"/>
+ <source>%1 attribute of %2 element must have a value of %3 or %4.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+319"/>
+ <location line="+129"/>
+ <location line="+9"/>
+ <location line="+7"/>
+ <location line="+7"/>
+ <location line="+327"/>
+ <location line="+203"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+6"/>
+ <location line="+77"/>
+ <source>%1 element must not have %2 and %3 attribute together.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-768"/>
+ <location line="+222"/>
+ <source>Content of %1 attribute of %2 element must not be from namespace %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-215"/>
+ <location line="+222"/>
+ <source>%1 attribute of %2 element must not be %3.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-64"/>
+ <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+187"/>
+ <source>Specifying use=&apos;prohibited&apos; inside an attribute group has no effect.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+353"/>
+ <source>%1 element must have either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+554"/>
+ <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>%1 element requires either %2 or %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Text or entity references not allowed inside %1 element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <location line="+112"/>
+ <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+126"/>
+ <source>%1 element is not allowed in this context.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+53"/>
+ <source>%1 attribute of %2 element has larger value than %3 attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+25"/>
+ <source>Prefix of qualified name %1 is not defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <location line="+61"/>
+ <source>%1 attribute of %2 element must either contain %3 or the other values.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Component with id %1 has been defined previously.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Element %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location line="+15"/>
- <source>Volume: %1%</source>
- <translation>Громкость: %1%</translation>
+ <source>Type %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Attribute group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Element group %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Notation %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Identity constraint %1 already defined.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Duplicated facets in simple type %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdtypechecker.cpp" line="+233"/>
+ <location line="+7"/>
+ <location line="+21"/>
+ <source>%1 is not valid according to %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+167"/>
+ <source>String content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>String content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>String content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>String content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>String content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Signed integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Signed integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Signed integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Signed integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Signed integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Unsigned integer content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Unsigned integer content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Unsigned integer content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Unsigned integer content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Unsigned integer content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Double content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Double content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Double content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Double content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Decimal content does not match in the fractionDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Decimal content does not match in the totalDigits facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Date time content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Date time content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Date time content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Date time content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Duration content does not match the maxInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the maxExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the minInclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Duration content does not match the minExclusive facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Duration content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Duration content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Boolean content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Binary content does not match the length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Binary content does not match the minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Binary content does not match the maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Binary content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Invalid QName content: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>QName content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>QName content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+36"/>
+ <source>Notation content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>List content does not match length facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>List content does not match minLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>List content does not match maxLength facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+90"/>
+ <source>List content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>List content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Union content is not listed in the enumeration facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Union content does not match pattern facet.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Data of type %1 are not allowed to be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../src/xmlpatterns/schema/qxsdvalidatinginstancereader.cpp" line="+160"/>
+ <source>Element %1 is missing child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>There is one IDREF value with no corresponding ID: %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Loaded schema file is invalid.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+16"/>
+ <source>%1 contains invalid data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>No schema defined for validation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>No definition for element %1 available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <location line="+49"/>
+ <location line="+142"/>
+ <source>Specified type %1 is not known to the schema.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-176"/>
+ <source>Element %1 is not defined in this scope.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Declaration for element %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Element %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+73"/>
+ <source>Element %1 is declared as abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 is not nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Attribute %1 contains invalid data: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
+ <source>Element contains content although it is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Fixed value constrained not allowed if element is nillable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+32"/>
+ <source>Specified type %1 is not validly substitutable with element type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Complex type %1 is not allowed to be abstract.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Element %1 contains not allowed attributes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <location line="+97"/>
+ <source>Element %1 contains not allowed child element.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-76"/>
+ <location line="+93"/>
+ <source>Content of element %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-85"/>
+ <location line="+92"/>
+ <location line="+41"/>
+ <source>Content of element %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-73"/>
+ <source>Element %1 contains not allowed child content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Element %1 contains not allowed text content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Element %1 can not contain other elements, as it has a fixed content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Element %1 is missing required attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Attribute %1 does not match the attribute wildcard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Declaration for attribute %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Element %1 contains two attributes of type %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>Attribute %1 contains invalid content.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Element %1 contains unknown attribute %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <location line="+46"/>
+ <source>Content of attribute %1 does not match its type definition: %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-38"/>
+ <location line="+46"/>
+ <source>Content of attribute %1 does not match defined value constraint.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+88"/>
+ <source>Non-unique value found for constraint %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Key constraint %1 contains absent fields.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
+ <source>Key constraint %1 contains references nillable element %2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <source>No referenced value found for key reference %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+64"/>
+ <source>More than one value found for field %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>Field %1 has no simple type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+73"/>
+ <source>ID value &apos;%1&apos; is not unique.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&apos;%1&apos; attribute contains invalid QName content: %2.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
</TS>
diff --git a/translations/qtconfig_pl.ts b/translations/qtconfig_pl.ts
index 8bf0a52..06d19da 100644
--- a/translations/qtconfig_pl.ts
+++ b/translations/qtconfig_pl.ts
@@ -97,15 +97,11 @@
</message>
<message>
<location line="+17"/>
- <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;Version %2&lt;br/&gt;&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).&lt;br/&gt;&lt;br/&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;br/&gt; </source>
+ <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;Version %2&lt;br/&gt;&lt;br/&gt;Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;Version %2</source>
- <translation type="obsolete">&lt;h3&gt;%1&lt;/h3&gt;&lt;br/&gt;Wersja %2</translation>
- </message>
- <message>
- <location line="+6"/>
+ <location line="+3"/>
<location line="+1"/>
<location line="+8"/>
<source>Qt Configuration</source>
@@ -137,19 +133,19 @@
<translation>&amp;Anuluj</translation>
</message>
<message>
- <location line="-578"/>
+ <location line="-575"/>
<source>No changes to be saved.</source>
<translation>Brak zmian do zapisania.</translation>
</message>
<message>
<location line="-259"/>
<source>Desktop Settings (Default)</source>
- <translation type="unfinished"></translation>
+ <translation>Ustawienia pulpitu (domyślne)</translation>
</message>
<message>
<location line="+5"/>
<source>Choose style and palette based on your desktop settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Wybierz styl i paletę na podstawie ustawień Twojego pulpitu.</translation>
</message>
<message>
<location line="+258"/>
@@ -827,7 +823,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../tools/qtconfig/previewframe.cpp" line="+81"/>
<source>Desktop settings will only take effect after an application restart.</source>
- <translation type="unfinished"></translation>
+ <translation>Ustawienia pulpitu zostaną zaaplikowane po ponownym uruchomieniu aplikacji.</translation>
</message>
</context>
<context>
diff --git a/translations/qtconfig_ru.ts b/translations/qtconfig_ru.ts